From 21613f69cde79e8029656697779c8214312e039a Mon Sep 17 00:00:00 2001 From: Nathan Miller Date: Fri, 24 May 2024 11:08:06 -0600 Subject: [PATCH 1/3] FEAT: Added the ability to initialze the unknown vector --- src/cpp/tardigrade_hydra.cpp | 36 ++- src/cpp/tardigrade_hydra.h | 20 ++ src/cpp/tardigrade_hydraLinearElasticity.cpp | 2 +- src/cpp/tardigrade_hydraMassChange.cpp | 2 +- ...draMicromorphicDruckerPragerPlasticity.cpp | 4 +- ...rade_hydraMicromorphicLinearElasticity.cpp | 2 +- .../tardigrade_hydraPeryznaViscodamage.cpp | 2 +- ...tardigrade_hydraPeryznaViscoplasticity.cpp | 2 +- src/cpp/tardigrade_hydraThermalExpansion.cpp | 2 +- src/cpp/tests/test_tardigrade_hydra.cpp | 237 ++++++++++++++++++ .../test_tardigrade_hydraLinearElasticity.cpp | 18 +- .../test_tardigrade_hydraThermalExpansion.cpp | 4 +- 12 files changed, 303 insertions(+), 28 deletions(-) diff --git a/src/cpp/tardigrade_hydra.cpp b/src/cpp/tardigrade_hydra.cpp index d08cde0..81026b7 100644 --- a/src/cpp/tardigrade_hydra.cpp +++ b/src/cpp/tardigrade_hydra.cpp @@ -992,7 +992,7 @@ namespace tardigradeHydra{ * Form a left preconditioner comprised of the inverse of the maximum value of each row */ - const unsigned int problem_size = getUnknownVector( )->size( ); + const unsigned int problem_size = getNumUnknowns( ); _preconditioner.second = floatVector( problem_size, 0 ); @@ -1246,7 +1246,25 @@ namespace tardigradeHydra{ Xmat[ Xmat.size( ) - 1 ] = *nonLinearSolveStateVariables; - setX( tardigradeVectorTools::appendVectors( Xmat ) ); + floatVector X = tardigradeVectorTools::appendVectors( Xmat ); + + for ( auto residual_ptr = getResidualClasses( )->begin( ); residual_ptr != getResidualClasses( )->end( ); residual_ptr++ ){ + + std::vector< unsigned int > indices; + + std::vector< floatType > values; + + ( *residual_ptr )->suggestInitialIterateValues( indices, values ); + + for ( auto i = indices.begin( ); i != indices.end( ); i++ ){ + + X[ *i ] = values[ ( unsigned int )( i - indices.begin( ) ) ]; + + } + + } + + setX( X ); } @@ -1397,7 +1415,7 @@ namespace tardigradeHydra{ unsigned int rank; - floatVector deltaX( getUnknownVector( )->size( ), 0 ); + floatVector deltaX( getNumUnknowns( ), 0 ); Eigen::Map< Eigen::Vector< floatType, -1 > > dx_map( deltaX.data( ), getUnknownVector( )->size( ) ); @@ -1517,14 +1535,14 @@ namespace tardigradeHydra{ // Form the maps for dXdF Eigen::Map< const Eigen::Matrix< floatType, -1, -1, Eigen::RowMajor > > dRdFmat( getFlatdRdF( )->data( ), getResidual( )->size( ), *getConfigurationUnknownCount( ) ); - _flatdXdF.second = floatVector( getUnknownVector( )->size( ) * ( *getConfigurationUnknownCount( ) ) ); - Eigen::Map< Eigen::Matrix< floatType, -1, -1, Eigen::RowMajor > > dXdFmat( _flatdXdF.second.data( ), getUnknownVector( )->size( ), ( *getConfigurationUnknownCount( ) ) ); + _flatdXdF.second = floatVector( getNumUnknowns( ) * ( *getConfigurationUnknownCount( ) ) ); + Eigen::Map< Eigen::Matrix< floatType, -1, -1, Eigen::RowMajor > > dXdFmat( _flatdXdF.second.data( ), getNumUnknowns( ), ( *getConfigurationUnknownCount( ) ) ); // Form the maps for dXdT Eigen::Map< const Eigen::Matrix< floatType, -1, -1, Eigen::RowMajor > > dRdTmat( getdRdT( )->data( ), getResidual( )->size( ), 1 ); - _flatdXdT.second = floatVector( getUnknownVector( )->size( ) ); - Eigen::Map< Eigen::Matrix< floatType, -1, -1, Eigen::RowMajor > > dXdTmat( _flatdXdT.second.data( ), getUnknownVector( )->size( ), 1 ); + _flatdXdT.second = floatVector( getNumUnknowns( ) ); + Eigen::Map< Eigen::Matrix< floatType, -1, -1, Eigen::RowMajor > > dXdTmat( _flatdXdT.second.data( ), getNumUnknowns( ), 1 ); // Solve tardigradeVectorTools::solverType< floatType > solver; @@ -1594,8 +1612,8 @@ namespace tardigradeHydra{ Eigen::Map< const Eigen::Matrix< floatType, -1, -1, Eigen::RowMajor > > dRdAdditionalDOF( getFlatdRdAdditionalDOF( )->data( ), getResidual( )->size( ), getAdditionalDOF( )->size( ) ); // Form the map for dXdF - _flatdXdAdditionalDOF.second = floatVector( getUnknownVector( )->size( ) * getAdditionalDOF( )->size( ), 0 ); - Eigen::Map< Eigen::Matrix< floatType, -1, -1, Eigen::RowMajor > > dXdAdditionalDOF( _flatdXdAdditionalDOF.second.data( ), getUnknownVector( )->size( ), getAdditionalDOF( )->size( ) ); + _flatdXdAdditionalDOF.second = floatVector( getNumUnknowns( ) * getAdditionalDOF( )->size( ), 0 ); + Eigen::Map< Eigen::Matrix< floatType, -1, -1, Eigen::RowMajor > > dXdAdditionalDOF( _flatdXdAdditionalDOF.second.data( ), getNumUnknowns( ), getAdditionalDOF( )->size( ) ); // Solve tardigradeVectorTools::solverType< floatType > solver; diff --git a/src/cpp/tardigrade_hydra.h b/src/cpp/tardigrade_hydra.h index cc19de2..7a2e7e4 100644 --- a/src/cpp/tardigrade_hydra.h +++ b/src/cpp/tardigrade_hydra.h @@ -455,6 +455,23 @@ namespace tardigradeHydra{ } + virtual void suggestInitialIterateValues( std::vector< unsigned int > &indices, + std::vector< floatType > &values ){ + + /*! + * Function which is called which allows the residual to suggest initial values for given + * configurations. This is called when the unknown vector is being initialized. If more than + * one residual attempts to set the initial vector the last residual will override all of the others. + * + * \param &indices: The indices of the unknown vector to set + * \param &values: The values to be set in the unknown vector + */ + + indices.clear( ); + values.clear( ); + + } + // Getter functions //! Get the number of equations the residual defined @@ -617,6 +634,9 @@ namespace tardigradeHydra{ //! Get a reference to the number of state variables involved in the non-linear solve const unsigned int* getNumNonLinearSolveStateVariables( ){ return &_numNonLinearSolveStateVariables; } + //! Get a reference to the number of terms in the unknown vector + virtual const unsigned int getNumUnknowns( ){ return ( *getNumConfigurations( ) ) * ( *getConfigurationUnknownCount( ) ) + *getNumNonLinearSolveStateVariables( ); } + //! Get a reference to the dimension constexpr unsigned int getDimension( ){ return _dimension; } diff --git a/src/cpp/tardigrade_hydraLinearElasticity.cpp b/src/cpp/tardigrade_hydraLinearElasticity.cpp index 9f82af4..6eb8b23 100644 --- a/src/cpp/tardigrade_hydraLinearElasticity.cpp +++ b/src/cpp/tardigrade_hydraLinearElasticity.cpp @@ -595,7 +595,7 @@ namespace tardigradeHydra{ const unsigned int num_unknown_config_vars = ( num_configs - 1 ) * sot_dim; - const unsigned int num_unknowns = hydra->getUnknownVector( )->size( ); + const unsigned int num_unknowns = hydra->getNumUnknowns( ); // Form the Jacobian floatVector jacobian = floatVector( sot_dim * num_unknowns, 0 ); diff --git a/src/cpp/tardigrade_hydraMassChange.cpp b/src/cpp/tardigrade_hydraMassChange.cpp index 945b8aa..0382b0d 100644 --- a/src/cpp/tardigrade_hydraMassChange.cpp +++ b/src/cpp/tardigrade_hydraMassChange.cpp @@ -1403,7 +1403,7 @@ namespace tardigradeHydra{ const unsigned int sot_dim = hydra->getSOTDimension( ); - const unsigned int num_unknowns = hydra->getUnknownVector( )->size( ); + const unsigned int num_unknowns = hydra->getNumUnknowns( ); const unsigned int num_equations = *getNumEquations( ); diff --git a/src/cpp/tardigrade_hydraMicromorphicDruckerPragerPlasticity.cpp b/src/cpp/tardigrade_hydraMicromorphicDruckerPragerPlasticity.cpp index fc0cffb..806c274 100644 --- a/src/cpp/tardigrade_hydraMicromorphicDruckerPragerPlasticity.cpp +++ b/src/cpp/tardigrade_hydraMicromorphicDruckerPragerPlasticity.cpp @@ -7907,7 +7907,7 @@ namespace tardigradeHydra{ unsigned int numPlasticStrainLikeISVs = plasticStrainLikeISVs->size( ); - const unsigned int numUnknowns = hydra->getUnknownVector( )->size( ); + const unsigned int numUnknowns = hydra->getNumUnknowns( ); const unsigned int numISVs = get_plasticStateVariables( )->size( ); @@ -8358,7 +8358,7 @@ namespace tardigradeHydra{ const unsigned int numEquations = *getNumEquations( ); - const unsigned int numUnknowns = hydra->getUnknownVector( )->size( ); + const unsigned int numUnknowns = hydra->getNumUnknowns( ); const unsigned int numConfigurations = *hydra->getNumConfigurations( ); diff --git a/src/cpp/tardigrade_hydraMicromorphicLinearElasticity.cpp b/src/cpp/tardigrade_hydraMicromorphicLinearElasticity.cpp index 8d19e99..c80a745 100644 --- a/src/cpp/tardigrade_hydraMicromorphicLinearElasticity.cpp +++ b/src/cpp/tardigrade_hydraMicromorphicLinearElasticity.cpp @@ -3545,7 +3545,7 @@ namespace tardigradeHydra{ const unsigned int num_configs = *hydra->getNumConfigurations( ); - const unsigned int num_unknowns = hydra->getUnknownVector( )->size( ); + const unsigned int num_unknowns = hydra->getNumUnknowns( ); floatVector jacobian( *getNumEquations( ) * num_unknowns, 0 ); diff --git a/src/cpp/tardigrade_hydraPeryznaViscodamage.cpp b/src/cpp/tardigrade_hydraPeryznaViscodamage.cpp index 86ff84f..44c4626 100644 --- a/src/cpp/tardigrade_hydraPeryznaViscodamage.cpp +++ b/src/cpp/tardigrade_hydraPeryznaViscodamage.cpp @@ -444,7 +444,7 @@ namespace tardigradeHydra{ const unsigned int num_isvs = get_plasticStateVariables( )->size( ); - const unsigned int num_unknowns = hydra->getUnknownVector( )->size( ); + const unsigned int num_unknowns = hydra->getNumUnknowns( ); floatVector jacobian( *getNumEquations( ) * num_unknowns, 0 ); diff --git a/src/cpp/tardigrade_hydraPeryznaViscoplasticity.cpp b/src/cpp/tardigrade_hydraPeryznaViscoplasticity.cpp index ca5a287..6d8e64b 100644 --- a/src/cpp/tardigrade_hydraPeryznaViscoplasticity.cpp +++ b/src/cpp/tardigrade_hydraPeryznaViscoplasticity.cpp @@ -2929,7 +2929,7 @@ namespace tardigradeHydra{ const unsigned int num_isvs = get_plasticStateVariables( )->size( ); - const unsigned int num_unknowns = hydra->getUnknownVector( )->size( ); + const unsigned int num_unknowns = hydra->getNumUnknowns( ); floatVector jacobian( *getNumEquations( ) * num_unknowns, 0 ); diff --git a/src/cpp/tardigrade_hydraThermalExpansion.cpp b/src/cpp/tardigrade_hydraThermalExpansion.cpp index b9eaf1e..14ea65d 100644 --- a/src/cpp/tardigrade_hydraThermalExpansion.cpp +++ b/src/cpp/tardigrade_hydraThermalExpansion.cpp @@ -139,7 +139,7 @@ namespace tardigradeHydra{ const unsigned int sot_dim = hydra->getSOTDimension( ); - const unsigned int num_unknowns = hydra->getUnknownVector( )->size( ); + const unsigned int num_unknowns = hydra->getNumUnknowns( ); floatVector jacobian( *getNumEquations( ) * num_unknowns, 0 ); diff --git a/src/cpp/tests/test_tardigrade_hydra.cpp b/src/cpp/tests/test_tardigrade_hydra.cpp index f84ff52..22a77ae 100644 --- a/src/cpp/tests/test_tardigrade_hydra.cpp +++ b/src/cpp/tests/test_tardigrade_hydra.cpp @@ -3062,6 +3062,239 @@ BOOST_AUTO_TEST_CASE( test_hydraBase_initializeUnknownVector ){ } +BOOST_AUTO_TEST_CASE( test_hydraBase_initializeUnknownVector_2 ){ + + class residualBaseMock : public tardigradeHydra::residualBase{ + + public: + + unsigned int numVariables = 41; + + using tardigradeHydra::residualBase::residualBase; + + using tardigradeHydra::residualBase::setResidual; + + using tardigradeHydra::residualBase::setJacobian; + + using tardigradeHydra::residualBase::setdRdF; + + using tardigradeHydra::residualBase::setdRdT; + + using tardigradeHydra::residualBase::setAdditionalDerivatives; + + virtual void setResidual( ){ + + floatVector residual( *getNumEquations( ), 0 ); + + for ( unsigned int i = 0; i < *getNumEquations( ); i++ ){ + + residual[ i ] = i; + + } + + setResidual( residual ); + + } + + virtual void setJacobian( ){ + + floatMatrix jacobian( *getNumEquations( ), floatVector( numVariables, 0 ) ); + + for ( unsigned int i = 0; i < *getNumEquations( ); i++ ){ + + for ( unsigned int j = 0; j < numVariables; j++ ){ + + jacobian[ i ][ j ] = i + 0.1 * j; + + } + + } + + setJacobian( tardigradeVectorTools::appendVectors( jacobian ) ); + + } + + virtual void setdRdF( ){ + + floatMatrix dRdF( *getNumEquations( ), floatVector( 9, 0 ) ); + + for ( unsigned int i = 0; i < *getNumEquations( ); i++ ){ + + for ( unsigned int j = 0; j < 9; j++ ){ + + dRdF[ i ][ j ] = i - 0.1 * j; + + } + + } + + setdRdF( tardigradeVectorTools::appendVectors( dRdF ) ); + + } + + virtual void setdRdT( ){ + + floatVector dRdT( *getNumEquations( ), 0 ); + + for ( unsigned int i = 0; i < *getNumEquations( ); i++ ){ + + dRdT[ i ] = 0.3 * i; + + } + + setdRdT( dRdT ); + + } + + }; + + class residualBaseMockSuggest : public residualBaseMock{ + + public: + + unsigned int config_suggest = 1; + + using residualBaseMock::residualBaseMock; + + virtual void suggestInitialIterateValues( std::vector< unsigned int > &indices, std::vector< floatType > &values ) override{ + + indices = std::vector< unsigned int >( 5, 0 ); + + values = std::vector< floatType >( 5, 0 ); + + for ( unsigned int i = 0; i < indices.size( ); i++ ){ + + indices[ i ] = 9 * config_suggest + i; + + values[ i ] = i; + + } + + } + + }; + + class residualBaseMockStress : public residualBaseMock{ + + public: + + floatVector cauchyStress = { 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9 }; + + using residualBaseMock::residualBaseMock; + + using residualBaseMock::setResidual; + + using residualBaseMock::setJacobian; + + using residualBaseMock::setdRdF; + + using residualBaseMock::setdRdT; + + using residualBaseMock::setAdditionalDerivatives; + + using tardigradeHydra::residualBase::setStress; + + virtual void setStress( ){ + + setStress( cauchyStress ); + + } + + }; + + class hydraBaseMock : public tardigradeHydra::hydraBase{ + + public: + + residualBaseMockStress r1; + + residualBaseMock r2; + + residualBaseMockSuggest r3; + + unsigned int s1 = 36; + + unsigned int s2 = 2; + + unsigned int s3 = 3; + + using tardigradeHydra::hydraBase::hydraBase; + + using tardigradeHydra::hydraBase::setResidualClasses; + + virtual void setResidualClasses( ){ + + r1 = residualBaseMockStress( this, s1 ); + + r2 = residualBaseMock( this, s2 ); + + r3 = residualBaseMockSuggest( this, s3 ); + + std::vector< tardigradeHydra::residualBase* > residuals( 3 ); + + residuals[ 0 ] = &r1; + + residuals[ 1 ] = &r2; + + residuals[ 2 ] = &r3; + + setResidualClasses( residuals ); + + } + + }; + + floatType time = 1.1; + + floatType deltaTime = 2.2; + + floatType temperature = 5.3; + + floatType previousTemperature = 23.4; + + floatVector deformationGradient = { 0.39293837, -0.42772133, -0.54629709, + 0.10262954, 0.43893794, -0.15378708, + 0.9615284 , 0.36965948, -0.0381362 }; + + floatVector previousDeformationGradient = { -0.21576496, -0.31364397, 0.45809941, + -0.12285551, -0.88064421, -0.20391149, + 0.47599081, -0.63501654, -0.64909649 }; + + floatVector previousStateVariables = { 0.53155137, 0.53182759, 0.63440096, 0.84943179, 0.72445532, + 0.61102351, 0.72244338, 0.32295891, 0.36178866, 0.22826323, + 0.29371405, 0.63097612, 0.09210494, 0.43370117, 0.43086276, + 0.4936851 , 0.42583029, 0.31226122, 0.42635131, 0.89338916, + 0.94416002, 0.50183668, 0.62395295, 0.1156184 , 0.31728548, + 0.41482621, 0.86630916, 0.25045537, 0.48303426, 0.98555979, + 0.51948512, 0.61289453, 0.12062867, 0.8263408 , 0.60306013, + 0.54506801, 0.34276383, 0.30412079 }; + + floatVector parameters = { 1, 2, 3, 4, 5 }; + + unsigned int numConfigurations = 4; + + unsigned int numNonLinearSolveStateVariables = 5; + + unsigned int dimension = 3; + + hydraBaseMock hydra( time, deltaTime, temperature, previousTemperature, deformationGradient, previousDeformationGradient, + { }, { }, + previousStateVariables, parameters, numConfigurations, numNonLinearSolveStateVariables, dimension ); + + hydra.setResidualClasses( ); + + tardigradeHydra::unit_test::hydraBaseTester::initializeUnknownVector( hydra ); + + floatVector unknownVectorAnswer = { 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, + 0, 1, 2, 3, 4, 0.61102351, 0.72244338, 0.32295891, 1.36178866, + 1.22826323, 0.29371405, 0.63097612, 0.09210494, 1.43370117, 0.43086276, 0.4936851 , 0.42583029, 1.31226122, + 1.42635131, 0.89338916, 0.94416002, 0.50183668, 1.62395295, 0.1156184 , 0.31728548, 0.41482621, 1.86630916, + 0.25045537, 0.48303426, 0.98555979, 0.51948512, 0.61289453 }; + + BOOST_CHECK( tardigradeVectorTools::fuzzyEquals( unknownVectorAnswer, *hydra.getUnknownVector( ) ) ); + +} + BOOST_AUTO_TEST_CASE( test_hydraBase_setTolerance ){ class hydraBaseMock : public tardigradeHydra::hydraBase { @@ -3525,6 +3758,8 @@ BOOST_AUTO_TEST_CASE( test_hydraBase_solveNonLinearProblem ){ }, }; + virtual const unsigned int getNumUnknowns( ) override{ return initialUnknownVector.size( ); } + private: using tardigradeHydra::hydraBase::getResidual; @@ -3883,6 +4118,7 @@ BOOST_AUTO_TEST_CASE( test_computeTangents ){ } + virtual const unsigned int getNumUnknowns( ) override{ return residual.size( ); } }; hydraBaseMock hydra( time, deltaTime, temperature, previousTemperature, deformationGradient, previousDeformationGradient, @@ -3999,6 +4235,7 @@ BOOST_AUTO_TEST_CASE( test_computeFlatdXdAdditionalDOF ){ } + virtual const unsigned int getNumUnknowns( ) override{ return residual.size( ); } }; hydraBaseMock hydra( time, deltaTime, temperature, previousTemperature, deformationGradient, previousDeformationGradient, diff --git a/src/cpp/tests/test_tardigrade_hydraLinearElasticity.cpp b/src/cpp/tests/test_tardigrade_hydraLinearElasticity.cpp index aef26c7..03d8c71 100644 --- a/src/cpp/tests/test_tardigrade_hydraLinearElasticity.cpp +++ b/src/cpp/tests/test_tardigrade_hydraLinearElasticity.cpp @@ -1862,27 +1862,27 @@ BOOST_AUTO_TEST_CASE( test_residual_setJacobian ){ tardigradeHydra::linearElasticity::residual R( &hydra, 9, parameters ); - floatMatrix gradient( 9, floatVector( hydra.getUnknownVector( )->size( ) ) ); + floatMatrix gradient( 9, floatVector( hydra.getNumUnknowns( ) ) ); floatType eps = 1e-6; for ( unsigned int i = 0; i < ( 9 * numConfigurations + numNonLinearSolveStateVariables ); i++ ){ - floatVector delta( hydra.getUnknownVector( )->size( ), 0 ); + floatVector delta( hydra.getNumUnknowns( ), 0 ); - delta[ i ] = eps * std::fabs( ( *hydra.getUnknownVector( ) )[ i ] ) + eps; + delta[ i ] = eps * std::fabs( unknownVector[ i ] ) + eps; hydraBaseMock hydrap( time, deltaTime, temperature, previousTemperature, deformationGradient, previousDeformationGradient, { }, { }, previousStateVariables, parameters, numConfigurations, numNonLinearSolveStateVariables, dimension ); - tardigradeHydra::unit_test::hydraBaseTester::updateUnknownVector( hydrap, *hydra.getUnknownVector( ) + delta ); + tardigradeHydra::unit_test::hydraBaseTester::updateUnknownVector( hydrap, unknownVector + delta ); hydraBaseMock hydram( time, deltaTime, temperature, previousTemperature, deformationGradient, previousDeformationGradient, { }, { }, previousStateVariables, parameters, numConfigurations, numNonLinearSolveStateVariables, dimension ); - tardigradeHydra::unit_test::hydraBaseTester::updateUnknownVector( hydram, *hydra.getUnknownVector( ) - delta ); + tardigradeHydra::unit_test::hydraBaseTester::updateUnknownVector( hydram, unknownVector - delta ); tardigradeHydra::linearElasticity::residual Rp( &hydrap, 9, parameters ); @@ -1989,13 +1989,13 @@ BOOST_AUTO_TEST_CASE( test_residual_setdRdT ){ { }, { }, previousStateVariables, parameters, numConfigurations, numNonLinearSolveStateVariables, dimension ); - tardigradeHydra::unit_test::hydraBaseTester::updateUnknownVector( hydrap, *hydra.getUnknownVector( ) ); + tardigradeHydra::unit_test::hydraBaseTester::updateUnknownVector( hydrap, unknownVector ); hydraBaseMock hydram( time, deltaTime, temperature - delta[ i ], previousTemperature, deformationGradient, previousDeformationGradient, { }, { }, previousStateVariables, parameters, numConfigurations, numNonLinearSolveStateVariables, dimension ); - tardigradeHydra::unit_test::hydraBaseTester::updateUnknownVector( hydram, *hydra.getUnknownVector( ) ); + tardigradeHydra::unit_test::hydraBaseTester::updateUnknownVector( hydram, unknownVector ); tardigradeHydra::linearElasticity::residual Rp( &hydrap, 9, parameters ); @@ -2098,13 +2098,13 @@ BOOST_AUTO_TEST_CASE( test_residual_setdRdF ){ { }, { }, previousStateVariables, parameters, numConfigurations, numNonLinearSolveStateVariables, dimension ); - tardigradeHydra::unit_test::hydraBaseTester::updateUnknownVector( hydrap, *hydra.getUnknownVector( ) ); + tardigradeHydra::unit_test::hydraBaseTester::updateUnknownVector( hydrap, unknownVector ); hydraBaseMock hydram( time, deltaTime, temperature, previousTemperature, deformationGradient - delta, previousDeformationGradient, { }, { }, previousStateVariables, parameters, numConfigurations, numNonLinearSolveStateVariables, dimension ); - tardigradeHydra::unit_test::hydraBaseTester::updateUnknownVector( hydram, *hydra.getUnknownVector( ) ); + tardigradeHydra::unit_test::hydraBaseTester::updateUnknownVector( hydram, unknownVector ); tardigradeHydra::linearElasticity::residual Rp( &hydrap, 9, parameters ); diff --git a/src/cpp/tests/test_tardigrade_hydraThermalExpansion.cpp b/src/cpp/tests/test_tardigrade_hydraThermalExpansion.cpp index 89896b6..e842b0d 100644 --- a/src/cpp/tests/test_tardigrade_hydraThermalExpansion.cpp +++ b/src/cpp/tests/test_tardigrade_hydraThermalExpansion.cpp @@ -1053,9 +1053,9 @@ BOOST_AUTO_TEST_CASE( test_residual_setResidualDerivatives ){ floatType eps = 1e-6; - for ( unsigned int i = 0; i < hydra.getUnknownVector( )->size( ); i++ ){ + for ( unsigned int i = 0; i < hydra.getNumUnknowns( ); i++ ){ - floatVector deltas( hydra.getUnknownVector( )->size( ), 0 ); + floatVector deltas( hydra.getNumUnknowns( ), 0 ); deltas[ i ] = eps * std::fabs( deltas[ i ] ) + eps; From 719ee269fafb0f13e63c4945dbd94c0b99ea2650 Mon Sep 17 00:00:00 2001 From: Nathan Miller Date: Fri, 24 May 2024 11:10:32 -0600 Subject: [PATCH 2/3] MAINT: Updated the changelog --- docs/sphinx/changelog.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/sphinx/changelog.rst b/docs/sphinx/changelog.rst index 6aa02ce..51239cf 100644 --- a/docs/sphinx/changelog.rst +++ b/docs/sphinx/changelog.rst @@ -17,6 +17,8 @@ New Features - Added a mass-change deformation gradient evolution model (:pull:`104`). By `Nathan Miller`_. - Added the calculation of the total derivative of the unknown vector w.r.t. the additional degrees of freedom (:pull:`104`). By `Nathan Miller`_. - Added storage for the derivative of the residual w.r.t. the additional dof (:pull:`104`). By `Nathan Miller`_. +- Added the ability to initialize the unknown vector (:pull:`109`). By `Nathan Miller`_. +- Added function that returns the size of the unknown vector (:pull:`109`). By `Nathan Miller`_. Breaking Changes ================ @@ -44,6 +46,7 @@ Internal Changes - Improved performance of the linear elasticity subroutine (:pull:`99`). By `Nathan Miller`_. - Using new error_tools check for error function (:pull:`100`). By `Nathan Miller`_. - Changed Jacobian, dRdF, and dRdD to row-major vectors (:pull:`101`). By `Nathan Miller`_. +- Replaced queries to getUnknownVector purely to get the size of the vector (:pull:`109`). By `Nathan Miller`_. Bug Fixes ========= From f404774a6a578e21bf12e2352ba23d5513353c0f Mon Sep 17 00:00:00 2001 From: Nathan Miller Date: Fri, 24 May 2024 11:29:53 -0600 Subject: [PATCH 3/3] MAINT: Corrected a failing test --- src/cpp/tests/test_tardigrade_hydra.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/cpp/tests/test_tardigrade_hydra.cpp b/src/cpp/tests/test_tardigrade_hydra.cpp index 22a77ae..19f22c3 100644 --- a/src/cpp/tests/test_tardigrade_hydra.cpp +++ b/src/cpp/tests/test_tardigrade_hydra.cpp @@ -4407,6 +4407,8 @@ BOOST_AUTO_TEST_CASE( test_formMaxRowPreconditioner ){ } + virtual const unsigned int getNumUnknowns( ) override{ return 5; } + }; hydraBaseMock hydra( time, deltaTime, temperature, previousTemperature, deformationGradient, previousDeformationGradient,