From c262deb5612d6e96af8225423092896819f54617 Mon Sep 17 00:00:00 2001 From: Nathan Miller Date: Tue, 9 Jan 2024 12:16:04 -0700 Subject: [PATCH 1/3] FEAT: Added the calculation of the updated strain-like state variables --- ...draMicromorphicDruckerPragerPlasticity.cpp | 45 ++++ ...hydraMicromorphicDruckerPragerPlasticity.h | 200 +++++++------- ...draMicromorphicDruckerPragerPlasticity.cpp | 255 ++++++++++++++++++ 3 files changed, 407 insertions(+), 93 deletions(-) diff --git a/src/cpp/tardigrade_hydraMicromorphicDruckerPragerPlasticity.cpp b/src/cpp/tardigrade_hydraMicromorphicDruckerPragerPlasticity.cpp index bcbdcd92..6f38ca7c 100644 --- a/src/cpp/tardigrade_hydraMicromorphicDruckerPragerPlasticity.cpp +++ b/src/cpp/tardigrade_hydraMicromorphicDruckerPragerPlasticity.cpp @@ -2717,6 +2717,51 @@ namespace tardigradeHydra{ } + void residual::setUpdatedPlasticStrainLikeISVs( ){ + /*! + * Set the updated strain like ISVs + */ + + const floatVector *previousPlasticStrainLikeISVs = get_previousPlasticStrainLikeISVs( ); + + const floatVector *evolutionRates = get_strainLikeISVEvolutionRates( ); + + const floatVector *previousEvolutionRates = get_previousStrainLikeISVEvolutionRates( ); + + floatVector dISVs, updatedISVs; + + TARDIGRADE_ERROR_TOOLS_CATCH_NODE_POINTER( tardigradeConstitutiveTools::midpointEvolution( *hydra->getDeltaTime( ), *previousPlasticStrainLikeISVs, *previousEvolutionRates, *evolutionRates, dISVs, updatedISVs, *getIntegrationParameter( ) ) ); + + set_updatedPlasticStrainLikeISVs( updatedISVs ); + + } + + void residual::setdUpdatedPlasticStrainLikeISVsdStateVariables( ){ + /*! + * Set the updated plastic strain-like ISVs jacobians + */ + + setUpdatedPlasticStrainLikeISVsJacobians( false ); + + } + + void residual::setdUpdatedPlasticStrainLikeISVsdPreviousStateVariables( ){ + /*! + * Set the previous updated plastic strain-like ISVs jacobians + */ + + setUpdatedPlasticStrainLikeISVsJacobians( true ); + + } + + void residual::setUpdatedPlasticStrainLikeISVsJacobians( const bool addPrevious ){ + /*! + * Set the updated plastic strain like ISVs Jacobians + * + * \param addPrevious: Flag for whether to add the Jacobians w.r.t. the previous state variables (true) or not (false) + */ + } + } } diff --git a/src/cpp/tardigrade_hydraMicromorphicDruckerPragerPlasticity.h b/src/cpp/tardigrade_hydraMicromorphicDruckerPragerPlasticity.h index bf7dafec..ac4b77ff 100644 --- a/src/cpp/tardigrade_hydraMicromorphicDruckerPragerPlasticity.h +++ b/src/cpp/tardigrade_hydraMicromorphicDruckerPragerPlasticity.h @@ -358,6 +358,14 @@ namespace tardigradeHydra{ virtual void setStrainLikeISVEvolutionRatesJacobians( const bool isPrevious ); + virtual void setUpdatedPlasticStrainLikeISVs( ); + + virtual void setdUpdatedPlasticStrainLikeISVsdStateVariables( ); + + virtual void setdUpdatedPlasticStrainLikeISVsdPreviousStateVariables( ); + + virtual void setUpdatedPlasticStrainLikeISVsJacobians( const bool addPrevious ); + private: unsigned int _plasticConfigurationIndex; //! The index of the plastic configuration @@ -366,191 +374,197 @@ namespace tardigradeHydra{ floatType _integrationParameter; //! The integration parameter (0 is explicit, 1 is implicit) - TARDIGRADE_HYDRA_DECLARE_CONSTANT_STORAGE( private, macroHardeningParameters, floatVector, unexpectedError ) + TARDIGRADE_HYDRA_DECLARE_CONSTANT_STORAGE( private, macroHardeningParameters, floatVector, unexpectedError ) + + TARDIGRADE_HYDRA_DECLARE_CONSTANT_STORAGE( private, microHardeningParameters, floatVector, unexpectedError ) + + TARDIGRADE_HYDRA_DECLARE_CONSTANT_STORAGE( private, microGradientHardeningParameters, floatVector, unexpectedError ) + + TARDIGRADE_HYDRA_DECLARE_CONSTANT_STORAGE( private, macroFlowParameters, floatVector, unexpectedError ) - TARDIGRADE_HYDRA_DECLARE_CONSTANT_STORAGE( private, microHardeningParameters, floatVector, unexpectedError ) + TARDIGRADE_HYDRA_DECLARE_CONSTANT_STORAGE( private, microFlowParameters, floatVector, unexpectedError ) - TARDIGRADE_HYDRA_DECLARE_CONSTANT_STORAGE( private, microGradientHardeningParameters, floatVector, unexpectedError ) + TARDIGRADE_HYDRA_DECLARE_CONSTANT_STORAGE( private, microGradientFlowParameters, floatVector, unexpectedError ) - TARDIGRADE_HYDRA_DECLARE_CONSTANT_STORAGE( private, macroFlowParameters, floatVector, unexpectedError ) + TARDIGRADE_HYDRA_DECLARE_CONSTANT_STORAGE( private, macroYieldParameters, floatVector, unexpectedError ) - TARDIGRADE_HYDRA_DECLARE_CONSTANT_STORAGE( private, microFlowParameters, floatVector, unexpectedError ) + TARDIGRADE_HYDRA_DECLARE_CONSTANT_STORAGE( private, microYieldParameters, floatVector, unexpectedError ) - TARDIGRADE_HYDRA_DECLARE_CONSTANT_STORAGE( private, microGradientFlowParameters, floatVector, unexpectedError ) + TARDIGRADE_HYDRA_DECLARE_CONSTANT_STORAGE( private, microGradientYieldParameters, floatVector, unexpectedError ) - TARDIGRADE_HYDRA_DECLARE_CONSTANT_STORAGE( private, macroYieldParameters, floatVector, unexpectedError ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, macroDrivingStress, floatVector, setMacroDrivingStress ) - TARDIGRADE_HYDRA_DECLARE_CONSTANT_STORAGE( private, microYieldParameters, floatVector, unexpectedError ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, symmetricMicroDrivingStress, floatVector, setSymmetricMicroDrivingStress ) - TARDIGRADE_HYDRA_DECLARE_CONSTANT_STORAGE( private, microGradientYieldParameters, floatVector, unexpectedError ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, higherOrderDrivingStress, floatVector, setHigherOrderDrivingStress ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, macroDrivingStress, floatVector, setMacroDrivingStress ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dMacroDrivingStressdMacroStress, floatMatrix, setdMacroDrivingStressdMacroStress ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, symmetricMicroDrivingStress, floatVector, setSymmetricMicroDrivingStress ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dSymmetricMicroDrivingStressdMicroStress, floatMatrix, setdSymmetricMicroDrivingStressdMicroStress ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, higherOrderDrivingStress, floatVector, setHigherOrderDrivingStress ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dHigherOrderDrivingStressdHigherOrderStress, floatMatrix, setdHigherOrderDrivingStressdHigherOrderStress ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dMacroDrivingStressdMacroStress, floatMatrix, setdMacroDrivingStressdMacroStress ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dMacroDrivingStressdF, floatMatrix, setdMacroDrivingStressdF ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dSymmetricMicroDrivingStressdMicroStress, floatMatrix, setdSymmetricMicroDrivingStressdMicroStress ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dSymmetricMicroDrivingStressdF, floatMatrix, setdSymmetricMicroDrivingStressdF ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dHigherOrderDrivingStressdHigherOrderStress, floatMatrix, setdHigherOrderDrivingStressdHigherOrderStress ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dHigherOrderDrivingStressdF, floatMatrix, setdHigherOrderDrivingStressdF ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dMacroDrivingStressdF, floatMatrix, setdMacroDrivingStressdF ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dHigherOrderDrivingStressdChi, floatMatrix, setdHigherOrderDrivingStressdChi ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dSymmetricMicroDrivingStressdF, floatMatrix, setdSymmetricMicroDrivingStressdF ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dMacroDrivingStressdFn, floatMatrix, setdMacroDrivingStressdFn ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dHigherOrderDrivingStressdF, floatMatrix, setdHigherOrderDrivingStressdF ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dSymmetricMicroDrivingStressdFn, floatMatrix, setdSymmetricMicroDrivingStressdFn ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dHigherOrderDrivingStressdChi, floatMatrix, setdHigherOrderDrivingStressdChi ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dHigherOrderDrivingStressdFn, floatMatrix, setdHigherOrderDrivingStressdFn ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dMacroDrivingStressdFn, floatMatrix, setdMacroDrivingStressdFn ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dHigherOrderDrivingStressdChin, floatMatrix, setdHigherOrderDrivingStressdChin ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dSymmetricMicroDrivingStressdFn, floatMatrix, setdSymmetricMicroDrivingStressdFn ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousMacroDrivingStress, floatVector, setPreviousMacroDrivingStress ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dHigherOrderDrivingStressdFn, floatMatrix, setdHigherOrderDrivingStressdFn ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousSymmetricMicroDrivingStress, floatVector, setPreviousSymmetricMicroDrivingStress ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dHigherOrderDrivingStressdChin, floatMatrix, setdHigherOrderDrivingStressdChin ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousHigherOrderDrivingStress, floatVector, setPreviousHigherOrderDrivingStress ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousMacroDrivingStress, floatVector, setPreviousMacroDrivingStress ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdMacroDrivingStressdMacroStress, floatMatrix, setPreviousdMacroDrivingStressdMacroStress ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousSymmetricMicroDrivingStress, floatVector, setPreviousSymmetricMicroDrivingStress ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdSymmetricMicroDrivingStressdMicroStress, floatMatrix, setPreviousdSymmetricMicroDrivingStressdMicroStress ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousHigherOrderDrivingStress, floatVector, setPreviousHigherOrderDrivingStress ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdHigherOrderDrivingStressdHigherOrderStress, floatMatrix, setPreviousdHigherOrderDrivingStressdHigherOrderStress ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdMacroDrivingStressdMacroStress, floatMatrix, setPreviousdMacroDrivingStressdMacroStress ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdMacroDrivingStressdF, floatMatrix, setPreviousdMacroDrivingStressdF ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdSymmetricMicroDrivingStressdMicroStress, floatMatrix, setPreviousdSymmetricMicroDrivingStressdMicroStress ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdSymmetricMicroDrivingStressdF, floatMatrix, setPreviousdSymmetricMicroDrivingStressdF ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdHigherOrderDrivingStressdHigherOrderStress, floatMatrix, setPreviousdHigherOrderDrivingStressdHigherOrderStress ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdHigherOrderDrivingStressdF, floatMatrix, setPreviousdHigherOrderDrivingStressdF ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdMacroDrivingStressdF, floatMatrix, setPreviousdMacroDrivingStressdF ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdHigherOrderDrivingStressdChi, floatMatrix, setPreviousdHigherOrderDrivingStressdChi ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdSymmetricMicroDrivingStressdF, floatMatrix, setPreviousdSymmetricMicroDrivingStressdF ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdMacroDrivingStressdFn, floatMatrix, setPreviousdMacroDrivingStressdFn ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdHigherOrderDrivingStressdF, floatMatrix, setPreviousdHigherOrderDrivingStressdF ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdSymmetricMicroDrivingStressdFn, floatMatrix, setPreviousdSymmetricMicroDrivingStressdFn ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdHigherOrderDrivingStressdChi, floatMatrix, setPreviousdHigherOrderDrivingStressdChi ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdHigherOrderDrivingStressdFn, floatMatrix, setPreviousdHigherOrderDrivingStressdFn ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdMacroDrivingStressdFn, floatMatrix, setPreviousdMacroDrivingStressdFn ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdHigherOrderDrivingStressdChin, floatMatrix, setPreviousdHigherOrderDrivingStressdChin ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdSymmetricMicroDrivingStressdFn, floatMatrix, setPreviousdSymmetricMicroDrivingStressdFn ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, plasticMultipliers, floatVector, setPlasticMultipliers ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdHigherOrderDrivingStressdFn, floatMatrix, setPreviousdHigherOrderDrivingStressdFn ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousPlasticMultipliers, floatVector, setPreviousPlasticMultipliers ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdHigherOrderDrivingStressdChin, floatMatrix, setPreviousdHigherOrderDrivingStressdChin ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, plasticStrainLikeISVs, floatVector, setPlasticStrainLikeISVs ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, plasticMultipliers, floatVector, setPlasticMultipliers ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousPlasticStrainLikeISVs, floatVector, setPreviousPlasticStrainLikeISVs ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousPlasticMultipliers, floatVector, setPreviousPlasticMultipliers ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, plasticStateVariables, floatVector, setPlasticStateVariables ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, plasticStrainLikeISVs, floatVector, setPlasticStrainLikeISVs ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousPlasticStateVariables, floatVector, setPreviousPlasticStateVariables ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousPlasticStrainLikeISVs, floatVector, setPreviousPlasticStrainLikeISVs ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, macroCohesion, floatType, setMacroCohesion ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, plasticStateVariables, floatVector, setPlasticStateVariables ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dMacroCohesiondStateVariables, floatVector, setdMacroCohesiondStateVariables ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousPlasticStateVariables, floatVector, setPreviousPlasticStateVariables ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, microCohesion, floatType, setMicroCohesion ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, macroCohesion, floatType, setMacroCohesion ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dMicroCohesiondStateVariables, floatVector, setdMicroCohesiondStateVariables ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dMacroCohesiondStateVariables, floatVector, setdMacroCohesiondStateVariables ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, microGradientCohesion, floatVector, setMicroGradientCohesion ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, microCohesion, floatType, setMicroCohesion ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dMicroGradientCohesiondStateVariables, floatMatrix, setdMicroGradientCohesiondStateVariables ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dMicroCohesiondStateVariables, floatVector, setdMicroCohesiondStateVariables ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousMacroCohesion, floatType, setPreviousMacroCohesion ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, microGradientCohesion, floatVector, setMicroGradientCohesion ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdMacroCohesiondStateVariables, floatVector, setPreviousdMacroCohesiondStateVariables ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dMicroGradientCohesiondStateVariables, floatMatrix, setdMicroGradientCohesiondStateVariables ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousMicroCohesion, floatType, setPreviousMicroCohesion ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousMacroCohesion, floatType, setPreviousMacroCohesion ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdMicroCohesiondStateVariables, floatVector, setPreviousdMicroCohesiondStateVariables ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdMacroCohesiondStateVariables, floatVector, setPreviousdMacroCohesiondStateVariables ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousMicroGradientCohesion, floatVector, setPreviousMicroGradientCohesion ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousMicroCohesion, floatType, setPreviousMicroCohesion ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdMicroGradientCohesiondStateVariables, floatMatrix, setPreviousdMicroGradientCohesiondStateVariables ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdMicroCohesiondStateVariables, floatVector, setPreviousdMicroCohesiondStateVariables ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dMacroFlowdc, floatType, setdMacroFlowdc ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousMicroGradientCohesion, floatVector, setPreviousMicroGradientCohesion ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dMacroFlowdDrivingStress, floatVector, setdMacroFlowdDrivingStress ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdMicroGradientCohesiondStateVariables, floatMatrix, setPreviousdMicroGradientCohesiondStateVariables ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, d2MacroFlowdDrivingStressdStress, floatMatrix, setd2MacroFlowdDrivingStressdStress ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dMacroFlowdc, floatType, setdMacroFlowdc ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, d2MacroFlowdDrivingStressdF, floatMatrix, setd2MacroFlowdDrivingStressdF ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dMacroFlowdDrivingStress, floatVector, setdMacroFlowdDrivingStress ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, d2MacroFlowdDrivingStressdFn, floatMatrix, setd2MacroFlowdDrivingStressdFn ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, d2MacroFlowdDrivingStressdStress, floatMatrix, setd2MacroFlowdDrivingStressdStress ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dMicroFlowdc, floatType, setdMicroFlowdc ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, d2MacroFlowdDrivingStressdF, floatMatrix, setd2MacroFlowdDrivingStressdF ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dMicroFlowdDrivingStress, floatVector, setdMicroFlowdDrivingStress ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, d2MacroFlowdDrivingStressdFn, floatMatrix, setd2MacroFlowdDrivingStressdFn ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, d2MicroFlowdDrivingStressdStress, floatMatrix, setd2MicroFlowdDrivingStressdStress ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dMicroFlowdc, floatType, setdMicroFlowdc ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, d2MicroFlowdDrivingStressdF, floatMatrix, setd2MicroFlowdDrivingStressdF ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dMicroFlowdDrivingStress, floatVector, setdMicroFlowdDrivingStress ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, d2MicroFlowdDrivingStressdFn, floatMatrix, setd2MicroFlowdDrivingStressdFn ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, d2MicroFlowdDrivingStressdStress, floatMatrix, setd2MicroFlowdDrivingStressdStress ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dMicroGradientFlowdc, floatMatrix, setdMicroGradientFlowdc ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, d2MicroFlowdDrivingStressdF, floatMatrix, setd2MicroFlowdDrivingStressdF ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dMicroGradientFlowdDrivingStress, floatMatrix, setdMicroGradientFlowdDrivingStress ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, d2MicroFlowdDrivingStressdFn, floatMatrix, setd2MicroFlowdDrivingStressdFn ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, d2MicroGradientFlowdDrivingStressdStress, floatMatrix, setd2MicroGradientFlowdDrivingStressdStress ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dMicroGradientFlowdc, floatMatrix, setdMicroGradientFlowdc ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, d2MicroGradientFlowdDrivingStressdF, floatMatrix, setd2MicroGradientFlowdDrivingStressdF ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dMicroGradientFlowdDrivingStress, floatMatrix, setdMicroGradientFlowdDrivingStress ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, d2MicroGradientFlowdDrivingStressdFn, floatMatrix, setd2MicroGradientFlowdDrivingStressdFn ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, d2MicroGradientFlowdDrivingStressdStress, floatMatrix, setd2MicroGradientFlowdDrivingStressdStress ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, d2MicroGradientFlowdDrivingStressdChi, floatMatrix, setd2MicroGradientFlowdDrivingStressdChi ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, d2MicroGradientFlowdDrivingStressdF, floatMatrix, setd2MicroGradientFlowdDrivingStressdF ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, d2MicroGradientFlowdDrivingStressdChin, floatMatrix, setd2MicroGradientFlowdDrivingStressdChin ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, d2MicroGradientFlowdDrivingStressdFn, floatMatrix, setd2MicroGradientFlowdDrivingStressdFn ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdMacroFlowdc, floatType, setPreviousdMacroFlowdc ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, d2MicroGradientFlowdDrivingStressdChi, floatMatrix, setd2MicroGradientFlowdDrivingStressdChi ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdMacroFlowdDrivingStress, floatVector, setPreviousdMacroFlowdDrivingStress ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, d2MicroGradientFlowdDrivingStressdChin, floatMatrix, setd2MicroGradientFlowdDrivingStressdChin ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousd2MacroFlowdDrivingStressdStress, floatMatrix, setPreviousd2MacroFlowdDrivingStressdStress ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdMacroFlowdc, floatType, setPreviousdMacroFlowdc ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousd2MacroFlowdDrivingStressdF, floatMatrix, setPreviousd2MacroFlowdDrivingStressdF ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdMacroFlowdDrivingStress, floatVector, setPreviousdMacroFlowdDrivingStress ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousd2MacroFlowdDrivingStressdFn, floatMatrix, setPreviousd2MacroFlowdDrivingStressdFn ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousd2MacroFlowdDrivingStressdStress, floatMatrix, setPreviousd2MacroFlowdDrivingStressdStress ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdMicroFlowdc, floatType, setPreviousdMicroFlowdc ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousd2MacroFlowdDrivingStressdF, floatMatrix, setPreviousd2MacroFlowdDrivingStressdF ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdMicroFlowdDrivingStress, floatVector, setPreviousdMicroFlowdDrivingStress ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousd2MacroFlowdDrivingStressdFn, floatMatrix, setPreviousd2MacroFlowdDrivingStressdFn ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousd2MicroFlowdDrivingStressdStress, floatMatrix, setPreviousd2MicroFlowdDrivingStressdStress ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdMicroFlowdc, floatType, setPreviousdMicroFlowdc ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousd2MicroFlowdDrivingStressdF, floatMatrix, setPreviousd2MicroFlowdDrivingStressdF ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdMicroFlowdDrivingStress, floatVector, setPreviousdMicroFlowdDrivingStress ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousd2MicroFlowdDrivingStressdFn, floatMatrix, setPreviousd2MicroFlowdDrivingStressdFn ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousd2MicroFlowdDrivingStressdStress, floatMatrix, setPreviousd2MicroFlowdDrivingStressdStress ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdMicroGradientFlowdc, floatMatrix, setPreviousdMicroGradientFlowdc ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousd2MicroFlowdDrivingStressdF, floatMatrix, setPreviousd2MicroFlowdDrivingStressdF ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdMicroGradientFlowdDrivingStress, floatMatrix, setPreviousdMicroGradientFlowdDrivingStress ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousd2MicroFlowdDrivingStressdFn, floatMatrix, setPreviousd2MicroFlowdDrivingStressdFn ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousd2MicroGradientFlowdDrivingStressdStress, floatMatrix, setPreviousd2MicroGradientFlowdDrivingStressdStress ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdMicroGradientFlowdc, floatMatrix, setPreviousdMicroGradientFlowdc ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousd2MicroGradientFlowdDrivingStressdF, floatMatrix, setPreviousd2MicroGradientFlowdDrivingStressdF ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdMicroGradientFlowdDrivingStress, floatMatrix, setPreviousdMicroGradientFlowdDrivingStress ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousd2MicroGradientFlowdDrivingStressdFn, floatMatrix, setPreviousd2MicroGradientFlowdDrivingStressdFn ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousd2MicroGradientFlowdDrivingStressdStress, floatMatrix, setPreviousd2MicroGradientFlowdDrivingStressdStress ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousd2MicroGradientFlowdDrivingStressdChi, floatMatrix, setPreviousd2MicroGradientFlowdDrivingStressdChi ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousd2MicroGradientFlowdDrivingStressdF, floatMatrix, setPreviousd2MicroGradientFlowdDrivingStressdF ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousd2MicroGradientFlowdDrivingStressdChin, floatMatrix, setPreviousd2MicroGradientFlowdDrivingStressdChin ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousd2MicroGradientFlowdDrivingStressdFn, floatMatrix, setPreviousd2MicroGradientFlowdDrivingStressdFn ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, strainLikeISVEvolutionRates, floatVector, setStrainLikeISVEvolutionRates ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousd2MicroGradientFlowdDrivingStressdChi, floatMatrix, setPreviousd2MicroGradientFlowdDrivingStressdChi ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dStrainLikeISVEvolutionRatesdStateVariables, floatMatrix, setdStrainLikeISVEvolutionRatesdStateVariables ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousd2MicroGradientFlowdDrivingStressdChin, floatMatrix, setPreviousd2MicroGradientFlowdDrivingStressdChin ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousStrainLikeISVEvolutionRates, floatVector, setPreviousStrainLikeISVEvolutionRates ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, strainLikeISVEvolutionRates, floatVector, setStrainLikeISVEvolutionRates ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdStrainLikeISVEvolutionRatesdStateVariables, floatMatrix, setPreviousdStrainLikeISVEvolutionRatesdStateVariables ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dStrainLikeISVEvolutionRatesdStateVariables, floatMatrix, setdStrainLikeISVEvolutionRatesdStateVariables ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, updatedPlasticStrainLikeISVs, floatVector, setUpdatedPlasticStrainLikeISVs ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousStrainLikeISVEvolutionRates, floatVector, setPreviousStrainLikeISVEvolutionRates ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dUpdatedPlasticStrainLikeISVsdStateVariables, floatMatrix, setdUpdatedPlasticStrainLikeISVsdStateVariables ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdStrainLikeISVEvolutionRatesdStateVariables, floatMatrix, setPreviousdStrainLikeISVEvolutionRatesdStateVariables ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dUpdatedPlasticStrainLikeISVsdPreviousStateVariables, floatMatrix, setdUpdatedPlasticStrainLikeISVsdPreviousStateVariables ) }; diff --git a/src/cpp/tests/test_tardigrade_hydraMicromorphicDruckerPragerPlasticity.cpp b/src/cpp/tests/test_tardigrade_hydraMicromorphicDruckerPragerPlasticity.cpp index ea7a1bcb..f1e177c0 100644 --- a/src/cpp/tests/test_tardigrade_hydraMicromorphicDruckerPragerPlasticity.cpp +++ b/src/cpp/tests/test_tardigrade_hydraMicromorphicDruckerPragerPlasticity.cpp @@ -4334,3 +4334,258 @@ BOOST_AUTO_TEST_CASE( test_setStrainLikeISVEvolutionRates2 ){ BOOST_CHECK( tardigradeVectorTools::fuzzyEquals( previousdEvolutionRatesdX, assembled_previousdEvolutionRatesdX ) ); } + +BOOST_AUTO_TEST_CASE( test_setUpdatedStrainLikeISVs ){ + /*! + * Test setting the strain-like ISV evolution rates + */ + + // Form a hydra class and residual class + floatType time = 1.23; + + floatType deltaTime = 2.34; + + floatType temperature = 3.45; + + floatType previousTemperature = 4.56; + + variableVector deformationGradient = { 1.00157757, 0.00159138, 0.00672005, + 0.01747159, 1.01122277, 0.00555118, + 0.01112217, -0.00885205, 0.99308943 }; + + variableVector microDeformation = { 0.99460588, -0.0078411 , 0.01145249, + -0.00307139, 0.97798389, -0.00509779, + 0.01189977, -0.01587541, 0.98377259 }; + + variableVector gradientMicroDeformation = { -1.35868385e-02, -1.03142977e-02, 6.54880619e-03, -2.03947530e-02, + -3.31494137e-03, -3.45686183e-03, -3.15745117e-04, -3.70848549e-03, + -9.38693885e-03, -3.68243465e-03, 1.96694582e-02, 2.22080009e-02, + 9.18337942e-05, 6.19764759e-03, -1.92190802e-02, -9.13572591e-03, + -4.25868940e-03, 1.83154579e-02, -1.24772317e-02, -8.48286787e-04, + 2.42779893e-02, 9.74255963e-04, 5.64472629e-03, -1.89685667e-02, + 1.63170400e-02, 5.15300642e-03, 2.25340032e-03 }; + + floatVector previousDeformationGradient = { 9.94656270e-01, 4.82152400e-02, 3.31984800e-02, 2.81918700e-02, + 1.02086536e+00, -1.77592100e-02, -2.24798000e-03, -1.28410000e-04, + 9.77165250e-01 }; + + floatVector previousMicroDeformation = { 0.96917405, -0.01777599, 0.00870406, -0.02163002, 0.9998683 , + -0.01669352, 0.03355217, 0.04427456, 1.01778466 }; + + floatVector previousGradientMicroDeformation = { 0.05043761, 0.02160516, -0.0565408 , 0.01218304, -0.05851034, + 0.00485749, -0.00962607, -0.03455912, 0.04490067, 0.01552915, + -0.02878364, 0.00595866, 0.04750406, -0.02377005, -0.05041534, + -0.02922214, 0.06280788, 0.02850865, -0.00226005, 0.0146049 , + 0.01560184, 0.03224767, 0.05822091, -0.05294424, -0.03518206, + 0.01831308, 0.03774438 }; + + floatVector previousStateVariables = {-0.02495446, -0.00169657, 0.04855598, 0.00194851, 0.01128945, + -0.03793713, 0.03263408, 0.01030601, 0.0045068 , -0.01572362, + -0.01958792, -0.00829778, 0.01813008, 0.03754568, 0.00104223, + 0.01693138, 0.00859366, 0.01249035, 0.01746891, 0.03423424, + -0.0416805 , 0.02636828, -0.02563336, -0.0305777 , 0.0072457 , + -0.04042875, 0.03853268, 0.0127249 , 0.02234164, -0.04838708, + 0.00944319, 0.00567852, -0.03410404, -0.03469295, 0.01955295, + -0.01812336, 0.01919703, 0.00543832, -0.01110494, 0.04251325, + 0.034167 , -0.01426024, -0.04564085, -0.01952319, -0.01018143, + 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 }; + + floatVector parameters = { 2, 0.53895133, 0.37172145, + 2, 0.37773052, 0.92739145, + 2, 0.53186824, 0.75454313, + 2, 0.95338442, 0.74042148, + 2, 0.38093104, 0.49241325, + 2, 0.82121039, 0.90566759, + 2, 0.01166325, 0.05331896, + 2, 0.32982199, 0.60161431, + 2, 0.58881096, 0.11473813 }; + + floatVector unknownVector = { 4.31202550e-01, -1.78960429e-01, -6.17986089e-01, 9.34988614e-01, + 3.01500733e-01, 7.30919703e-01, -9.49515284e-01, -4.66188370e-01, + 4.14220065e-03, -8.65102730e-01, 9.86066522e-01, -5.27075208e-01, + -2.51415635e-01, -5.71976170e-01, -7.89108268e-01, -5.35040429e-01, + -3.98779729e-01, 2.68884536e-01, -4.37530437e-01, -2.75446478e-01, + -9.88114313e-01, -2.68561748e-01, 6.77719634e-02, -6.75968326e-01, + 1.94866217e-01, -4.13695063e-01, 2.64100990e-01, -9.47606789e-01, + 7.75186921e-01, -9.67762739e-01, -7.46083938e-01, 5.54324923e-01, + -9.08209536e-01, 4.21997387e-01, 9.42092281e-01, 7.43365866e-01, + 4.20323303e-01, 9.17019486e-01, -1.40373324e-01, 7.45757829e-01, + -2.88084664e-01, 8.59527306e-01, -7.02444688e-01, 8.80058030e-01, + 6.65432395e-01, 1.01730274e+00, -1.88038495e-02, 4.82434492e-03, + -2.41803760e-02, 1.01105922e+00, -2.46131243e-02, -2.07588861e-02, + -1.37250795e-02, 1.01875623e+00, 9.93178816e-01, 1.99799676e-03, + 3.40516069e-03, -1.37268320e-02, 1.00360734e+00, 8.04758975e-03, + -1.00877303e-02, -4.06865705e-03, 9.97654446e-01, 2.16175331e-02, + 4.37468737e-03, 2.24126186e-02, 2.80173769e-03, 2.80710425e-05, + -2.48233895e-02, -9.55547806e-04, 2.13727499e-02, -1.50817155e-02, + -2.23954433e-02, -4.66105533e-03, -6.38017597e-03, 1.78576529e-02, + -2.36694442e-02, 2.10074615e-02, 9.04514995e-03, 2.02112997e-02, + 5.37645354e-03, 1.55976656e-02, -8.22280632e-03, -7.52168860e-03, + -5.50628848e-03, 1.27398541e-02, -6.53544128e-03, -1.28890097e-02, + 2.18834178e-02, 2.04005542e-02, + 0.01, 0.02, 0.03, 0.04, 0.05, + 0.06, 0.07, 0.08, 0.09, 0.10 }; + + unsigned int numConfigurations = 2; + + unsigned int numNonLinearSolveStateVariables = 10; + + std::vector< unsigned int > stateVariableIndices = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + + unsigned int dimension = 3; + + unsigned int configuration_unknown_count = 45; + + floatType tolr = 1e-2; + + floatType tola = 1e-3; + + unsigned int maxIterations = 24; + + unsigned int maxLSIterations = 45; + + floatType lsAlpha = 2.3; + + class stressMock : public tardigradeHydra::residualBaseMicromorphic{ + + public: + + using tardigradeHydra::residualBaseMicromorphic::residualBaseMicromorphic; + + }; + + class residualMock : public tardigradeHydra::micromorphicDruckerPragerPlasticity::residual{ + + public: + + using tardigradeHydra::micromorphicDruckerPragerPlasticity::residual::residual; + + floatVector evolutionRates = { 1, 2, 3, 4, 5 }; + + floatVector previousEvolutionRates = { 0.1, 0.2, 0.3, 0.4, 0.5 }; + + floatVector plasticParameters = { 2, 0.53895133, 0.37172145, + 2, 0.37773052, 0.92739145, + 2, 0.53186824, 0.75454313, + 2, 0.95338442, 0.74042148, + 2, 0.38093104, 0.49241325, + 2, 0.82121039, 0.90566759, + 2, 0.01166325, 0.05331896, + 2, 0.32982199, 0.60161431, + 2, 0.58881096, 0.11473813 }; + + floatVector initialize( unsigned int nrows ){ + + floatVector value( nrows, 0 ); + + return value; + + } + + floatMatrix initialize( unsigned int nrows, unsigned int ncols ){ + + floatMatrix value( nrows, floatVector( ncols, 0 ) ); + + return value; + + } + + virtual void setStrainLikeISVEvolutionRates( const bool isPrevious ) override{ + + if ( isPrevious ){ + + set_previousStrainLikeISVEvolutionRates( previousEvolutionRates ); + + } + else{ + + set_strainLikeISVEvolutionRates( evolutionRates ); + + } + + } + + virtual void setStrainLikeISVEvolutionRatesJacobians( const bool isPrevious ) override{ + + if ( isPrevious ){ + + set_previousStrainLikeISVEvolutionRates( previousEvolutionRates ); + + } + else{ + + set_strainLikeISVEvolutionRates( evolutionRates ); + + } + + } + + }; + + class hydraBaseMicromorphicMock : public tardigradeHydra::hydraBaseMicromorphic{ + + public: + + using tardigradeHydra::hydraBaseMicromorphic::hydraBaseMicromorphic; + + stressMock elasticity; + + residualMock plasticity; + + std::vector< unsigned int > stateVariableIndices = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + + floatVector plasticParameters = { 2, 0.53895133, 0.37172145, + 2, 0.37773052, 0.92739145, + 2, 0.53186824, 0.75454313, + 2, 0.95338442, 0.74042148, + 2, 0.38093104, 0.49241325, + 2, 0.82121039, 0.90566759, + 2, 0.01166325, 0.05331896, + 2, 0.32982199, 0.60161431, + 2, 0.58881096, 0.11473813 }; + + private: + + using tardigradeHydra::hydraBaseMicromorphic::setResidualClasses; + + virtual void setResidualClasses( ) override{ + + std::vector< tardigradeHydra::residualBase* > residuals( 2 ); + + elasticity = stressMock( this, 45 ); + + plasticity = residualMock( this, 55, 1, stateVariableIndices, plasticParameters ); + + residuals[ 0 ] = &elasticity; + + residuals[ 1 ] = &plasticity; + + setResidualClasses( residuals ); + + } + + }; + + hydraBaseMicromorphicMock hydra( time, deltaTime, temperature, previousTemperature, deformationGradient, previousDeformationGradient, + microDeformation, previousMicroDeformation, gradientMicroDeformation, previousGradientMicroDeformation, + previousStateVariables, parameters, + numConfigurations, numNonLinearSolveStateVariables, + dimension, configuration_unknown_count, + tolr, tola, maxIterations, maxLSIterations, lsAlpha ); + + tardigradeHydra::unit_test::hydraBaseTester::updateUnknownVector( hydra, unknownVector ); + + residualMock R( &hydra, 55, 1, stateVariableIndices, parameters ); + + residualMock RJ( &hydra, 55, 1, stateVariableIndices, parameters ); + + RJ.get_dUpdatedPlasticStrainLikeISVsdStateVariables( ); + + floatVector updatedPlasticISVs = 0.5 * ( *R.get_strainLikeISVEvolutionRates( ) + *R.get_previousStrainLikeISVEvolutionRates( ) ) * deltaTime + + floatVector( previousStateVariables.end( ) - 5, previousStateVariables.end( ) ); + + BOOST_CHECK( tardigradeVectorTools::fuzzyEquals( updatedPlasticISVs, *R.get_updatedPlasticStrainLikeISVs( ) ) ); + + BOOST_CHECK( tardigradeVectorTools::fuzzyEquals( updatedPlasticISVs, *RJ.get_updatedPlasticStrainLikeISVs( ) ) ); + +} From ccd68452667987a782768852f405968d4134b514 Mon Sep 17 00:00:00 2001 From: Nathan Miller Date: Tue, 9 Jan 2024 13:30:36 -0700 Subject: [PATCH 2/3] FEAT: Added the evolution of the plastic strain-like ISVs and their Jacobians --- ...draMicromorphicDruckerPragerPlasticity.cpp | 74 ++- ...hydraMicromorphicDruckerPragerPlasticity.h | 20 +- ...draMicromorphicDruckerPragerPlasticity.cpp | 422 +++++++++++++++++- 3 files changed, 467 insertions(+), 49 deletions(-) diff --git a/src/cpp/tardigrade_hydraMicromorphicDruckerPragerPlasticity.cpp b/src/cpp/tardigrade_hydraMicromorphicDruckerPragerPlasticity.cpp index 6f38ca7c..4e81583d 100644 --- a/src/cpp/tardigrade_hydraMicromorphicDruckerPragerPlasticity.cpp +++ b/src/cpp/tardigrade_hydraMicromorphicDruckerPragerPlasticity.cpp @@ -2535,25 +2535,25 @@ namespace tardigradeHydra{ } - void residual::setStrainLikeISVEvolutionRates( ){ + void residual::setPlasticStrainLikeISVEvolutionRates( ){ /*! * Set the evolution rates of the strain-like ISVs */ - setStrainLikeISVEvolutionRates( false ); + setPlasticStrainLikeISVEvolutionRates( false ); } - void residual::setPreviousStrainLikeISVEvolutionRates( ){ + void residual::setPreviousPlasticStrainLikeISVEvolutionRates( ){ /*! * Set the previous evolution rates of the strain-like ISVs */ - setStrainLikeISVEvolutionRates( true ); + setPlasticStrainLikeISVEvolutionRates( true ); } - void residual::setStrainLikeISVEvolutionRates( const bool isPrevious ){ + void residual::setPlasticStrainLikeISVEvolutionRates( const bool isPrevious ){ /*! * Set the evolution rates of the strain-like ISVs * @@ -2609,36 +2609,36 @@ namespace tardigradeHydra{ if ( isPrevious ){ - set_previousStrainLikeISVEvolutionRates( evolutionRates ); + set_previousPlasticStrainLikeISVEvolutionRates( evolutionRates ); } else{ - set_strainLikeISVEvolutionRates( evolutionRates ); + set_plasticStrainLikeISVEvolutionRates( evolutionRates ); } } - void residual::setdStrainLikeISVEvolutionRatesdStateVariables( ){ + void residual::setdPlasticStrainLikeISVEvolutionRatesdStateVariables( ){ /*! * Set the Jacobian of the evolution rates of the strain-like ISVs w.r.t. the nonlinear state variables */ - setStrainLikeISVEvolutionRatesJacobians( false ); + setPlasticStrainLikeISVEvolutionRatesJacobians( false ); } - void residual::setPreviousdStrainLikeISVEvolutionRatesdStateVariables( ){ + void residual::setPreviousdPlasticStrainLikeISVEvolutionRatesdStateVariables( ){ /*! * Set the Jacobian of the previous evolution rates of the strain-like ISVs w.r.t. the nonlinear state variables */ - setStrainLikeISVEvolutionRatesJacobians( true ); + setPlasticStrainLikeISVEvolutionRatesJacobians( true ); } - void residual::setStrainLikeISVEvolutionRatesJacobians( const bool isPrevious ){ + void residual::setPlasticStrainLikeISVEvolutionRatesJacobians( const bool isPrevious ){ /*! * Set the evolution rates and Jacobians of the strain-like ISVs * @@ -2702,16 +2702,16 @@ namespace tardigradeHydra{ if ( isPrevious ){ - set_previousStrainLikeISVEvolutionRates( evolutionRates ); + set_previousPlasticStrainLikeISVEvolutionRates( evolutionRates ); - set_previousdStrainLikeISVEvolutionRatesdStateVariables( dEvolutionRatesdStateVariables ); + set_previousdPlasticStrainLikeISVEvolutionRatesdStateVariables( dEvolutionRatesdStateVariables ); } else{ - set_strainLikeISVEvolutionRates( evolutionRates ); + set_plasticStrainLikeISVEvolutionRates( evolutionRates ); - set_dStrainLikeISVEvolutionRatesdStateVariables( dEvolutionRatesdStateVariables ); + set_dPlasticStrainLikeISVEvolutionRatesdStateVariables( dEvolutionRatesdStateVariables ); } @@ -2724,9 +2724,9 @@ namespace tardigradeHydra{ const floatVector *previousPlasticStrainLikeISVs = get_previousPlasticStrainLikeISVs( ); - const floatVector *evolutionRates = get_strainLikeISVEvolutionRates( ); + const floatVector *evolutionRates = get_plasticStrainLikeISVEvolutionRates( ); - const floatVector *previousEvolutionRates = get_previousStrainLikeISVEvolutionRates( ); + const floatVector *previousEvolutionRates = get_previousPlasticStrainLikeISVEvolutionRates( ); floatVector dISVs, updatedISVs; @@ -2760,6 +2760,44 @@ namespace tardigradeHydra{ * * \param addPrevious: Flag for whether to add the Jacobians w.r.t. the previous state variables (true) or not (false) */ + + const floatVector *previousPlasticStrainLikeISVs = get_previousPlasticStrainLikeISVs( ); + + const floatVector *evolutionRates = get_plasticStrainLikeISVEvolutionRates( ); + + const floatVector *previousEvolutionRates = get_previousPlasticStrainLikeISVEvolutionRates( ); + + floatVector dISVs, updatedISVs; + + floatMatrix dISVsdEvolutionRates; + + if ( addPrevious ){ + + floatMatrix dISVsdPreviousEvolutionRates; + + TARDIGRADE_ERROR_TOOLS_CATCH_NODE_POINTER( tardigradeConstitutiveTools::midpointEvolution( *hydra->getDeltaTime( ), *previousPlasticStrainLikeISVs, *previousEvolutionRates, *evolutionRates, dISVs, updatedISVs, dISVsdEvolutionRates, dISVsdPreviousEvolutionRates, *getIntegrationParameter( ) ) ); + + floatMatrix dISVsdStateVariables = tardigradeVectorTools::dot( dISVsdPreviousEvolutionRates, *get_previousdPlasticStrainLikeISVEvolutionRatesdStateVariables( ) ); + + for ( unsigned int i = 0; i < updatedISVs.size( ); i++ ){ + + dISVsdStateVariables[ i ][ i + ( *getNumPlasticMultipliers( ) ) ] += 1; + + } + + set_dUpdatedPlasticStrainLikeISVsdPreviousStateVariables( dISVsdStateVariables ); + + } + else{ + + TARDIGRADE_ERROR_TOOLS_CATCH_NODE_POINTER( tardigradeConstitutiveTools::midpointEvolution( *hydra->getDeltaTime( ), *previousPlasticStrainLikeISVs, *previousEvolutionRates, *evolutionRates, dISVs, updatedISVs, dISVsdEvolutionRates, *getIntegrationParameter( ) ) ); + + } + + set_dUpdatedPlasticStrainLikeISVsdStateVariables( tardigradeVectorTools::dot( dISVsdEvolutionRates, *get_dPlasticStrainLikeISVEvolutionRatesdStateVariables( ) ) ); + + set_updatedPlasticStrainLikeISVs( updatedISVs ); + } } diff --git a/src/cpp/tardigrade_hydraMicromorphicDruckerPragerPlasticity.h b/src/cpp/tardigrade_hydraMicromorphicDruckerPragerPlasticity.h index ac4b77ff..58c622a0 100644 --- a/src/cpp/tardigrade_hydraMicromorphicDruckerPragerPlasticity.h +++ b/src/cpp/tardigrade_hydraMicromorphicDruckerPragerPlasticity.h @@ -346,17 +346,17 @@ namespace tardigradeHydra{ virtual void setFlowPotentialGradientsJacobians( const bool isPrevious ); - virtual void setStrainLikeISVEvolutionRates( ); + virtual void setPlasticStrainLikeISVEvolutionRates( ); - virtual void setPreviousStrainLikeISVEvolutionRates( ); + virtual void setPreviousPlasticStrainLikeISVEvolutionRates( ); - virtual void setStrainLikeISVEvolutionRates( const bool isPrevious ); + virtual void setPlasticStrainLikeISVEvolutionRates( const bool isPrevious ); - virtual void setdStrainLikeISVEvolutionRatesdStateVariables( ); + virtual void setdPlasticStrainLikeISVEvolutionRatesdStateVariables( ); - virtual void setPreviousdStrainLikeISVEvolutionRatesdStateVariables( ); + virtual void setPreviousdPlasticStrainLikeISVEvolutionRatesdStateVariables( ); - virtual void setStrainLikeISVEvolutionRatesJacobians( const bool isPrevious ); + virtual void setPlasticStrainLikeISVEvolutionRatesJacobians( const bool isPrevious ); virtual void setUpdatedPlasticStrainLikeISVs( ); @@ -552,13 +552,13 @@ namespace tardigradeHydra{ TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousd2MicroGradientFlowdDrivingStressdChin, floatMatrix, setPreviousd2MicroGradientFlowdDrivingStressdChin ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, strainLikeISVEvolutionRates, floatVector, setStrainLikeISVEvolutionRates ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, plasticStrainLikeISVEvolutionRates, floatVector, setPlasticStrainLikeISVEvolutionRates ) - TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dStrainLikeISVEvolutionRatesdStateVariables, floatMatrix, setdStrainLikeISVEvolutionRatesdStateVariables ) + TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, dPlasticStrainLikeISVEvolutionRatesdStateVariables, floatMatrix, setdPlasticStrainLikeISVEvolutionRatesdStateVariables ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousStrainLikeISVEvolutionRates, floatVector, setPreviousStrainLikeISVEvolutionRates ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousPlasticStrainLikeISVEvolutionRates, floatVector, setPreviousPlasticStrainLikeISVEvolutionRates ) - TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdStrainLikeISVEvolutionRatesdStateVariables, floatMatrix, setPreviousdStrainLikeISVEvolutionRatesdStateVariables ) + TARDIGRADE_HYDRA_DECLARE_PREVIOUS_STORAGE( private, previousdPlasticStrainLikeISVEvolutionRatesdStateVariables, floatMatrix, setPreviousdPlasticStrainLikeISVEvolutionRatesdStateVariables ) TARDIGRADE_HYDRA_DECLARE_ITERATION_STORAGE( private, updatedPlasticStrainLikeISVs, floatVector, setUpdatedPlasticStrainLikeISVs ) diff --git a/src/cpp/tests/test_tardigrade_hydraMicromorphicDruckerPragerPlasticity.cpp b/src/cpp/tests/test_tardigrade_hydraMicromorphicDruckerPragerPlasticity.cpp index f1e177c0..70cb0a69 100644 --- a/src/cpp/tests/test_tardigrade_hydraMicromorphicDruckerPragerPlasticity.cpp +++ b/src/cpp/tests/test_tardigrade_hydraMicromorphicDruckerPragerPlasticity.cpp @@ -3677,7 +3677,7 @@ BOOST_AUTO_TEST_CASE( test_setFlowDerivatives2 ){ BOOST_CHECK( tardigradeVectorTools::fuzzyEquals( previousd2MicroGradientFlowdDrivingStressdF, assembled_previousd2MicroGradientFlowdDrivingStressdF ) ); } -BOOST_AUTO_TEST_CASE( test_setStrainLikeISVEvolutionRates ){ +BOOST_AUTO_TEST_CASE( test_setPlasticStrainLikeISVEvolutionRates ){ /*! * Test setting the strain-like ISV evolution rates */ @@ -3963,19 +3963,19 @@ BOOST_AUTO_TEST_CASE( test_setStrainLikeISVEvolutionRates ){ ( 6.7 * 0.3 + 7.8 * 0.4 + 8.9 * 0.5 ), ( 9.1 * 0.3 + 10.1 * 0.4 + 11.2 * 0.5 ) }; - RJ.get_dStrainLikeISVEvolutionRatesdStateVariables( ); + RJ.get_dPlasticStrainLikeISVEvolutionRatesdStateVariables( ); - BOOST_CHECK( tardigradeVectorTools::fuzzyEquals( evolutionRates, *R.get_strainLikeISVEvolutionRates( ) ) ); + BOOST_CHECK( tardigradeVectorTools::fuzzyEquals( evolutionRates, *R.get_plasticStrainLikeISVEvolutionRates( ) ) ); - BOOST_CHECK( tardigradeVectorTools::fuzzyEquals( previousEvolutionRates, *R.get_previousStrainLikeISVEvolutionRates( ) ) ); + BOOST_CHECK( tardigradeVectorTools::fuzzyEquals( previousEvolutionRates, *R.get_previousPlasticStrainLikeISVEvolutionRates( ) ) ); - BOOST_CHECK( tardigradeVectorTools::fuzzyEquals( evolutionRates, *RJ.get_strainLikeISVEvolutionRates( ) ) ); + BOOST_CHECK( tardigradeVectorTools::fuzzyEquals( evolutionRates, *RJ.get_plasticStrainLikeISVEvolutionRates( ) ) ); - BOOST_CHECK( tardigradeVectorTools::fuzzyEquals( previousEvolutionRates, *RJ.get_previousStrainLikeISVEvolutionRates( ) ) ); + BOOST_CHECK( tardigradeVectorTools::fuzzyEquals( previousEvolutionRates, *RJ.get_previousPlasticStrainLikeISVEvolutionRates( ) ) ); } -BOOST_AUTO_TEST_CASE( test_setStrainLikeISVEvolutionRates2 ){ +BOOST_AUTO_TEST_CASE( test_setPlasticStrainLikeISVEvolutionRates2 ){ /*! * Test setting the strain-like ISV evolution rates */ @@ -4253,9 +4253,9 @@ BOOST_AUTO_TEST_CASE( test_setStrainLikeISVEvolutionRates2 ){ residualMock Rm( &hydram, 55, 1, stateVariableIndices, parameters ); - floatVector vp = *Rp.get_strainLikeISVEvolutionRates( ); + floatVector vp = *Rp.get_plasticStrainLikeISVEvolutionRates( ); - floatVector vm = *Rm.get_strainLikeISVEvolutionRates( ); + floatVector vm = *Rm.get_plasticStrainLikeISVEvolutionRates( ); for ( unsigned int j = 0; j < vp.size( ); j++ ){ @@ -4271,7 +4271,7 @@ BOOST_AUTO_TEST_CASE( test_setStrainLikeISVEvolutionRates2 ){ for ( unsigned int j = 0; j < 10; j++ ){ - assembled_dEvolutionRatesdX[ i ][ j + 2 * configuration_unknown_count ] = ( *R.get_dStrainLikeISVEvolutionRatesdStateVariables( ) )[ i ][ j ]; + assembled_dEvolutionRatesdX[ i ][ j + 2 * configuration_unknown_count ] = ( *R.get_dPlasticStrainLikeISVEvolutionRatesdStateVariables( ) )[ i ][ j ]; } @@ -4307,9 +4307,9 @@ BOOST_AUTO_TEST_CASE( test_setStrainLikeISVEvolutionRates2 ){ residualMock Rm( &hydram, 55, 1, stateVariableIndices, parameters ); - floatVector vp = *Rp.get_previousStrainLikeISVEvolutionRates( ); + floatVector vp = *Rp.get_previousPlasticStrainLikeISVEvolutionRates( ); - floatVector vm = *Rm.get_previousStrainLikeISVEvolutionRates( ); + floatVector vm = *Rm.get_previousPlasticStrainLikeISVEvolutionRates( ); for ( unsigned int j = 0; j < vp.size( ); j++ ){ @@ -4325,7 +4325,7 @@ BOOST_AUTO_TEST_CASE( test_setStrainLikeISVEvolutionRates2 ){ for ( unsigned int j = 0; j < 10; j++ ){ - assembled_previousdEvolutionRatesdX[ i ][ j + configuration_unknown_count ] = ( *R.get_previousdStrainLikeISVEvolutionRatesdStateVariables( ) )[ i ][ j ]; + assembled_previousdEvolutionRatesdX[ i ][ j + configuration_unknown_count ] = ( *R.get_previousdPlasticStrainLikeISVEvolutionRatesdStateVariables( ) )[ i ][ j ]; } @@ -4335,7 +4335,7 @@ BOOST_AUTO_TEST_CASE( test_setStrainLikeISVEvolutionRates2 ){ } -BOOST_AUTO_TEST_CASE( test_setUpdatedStrainLikeISVs ){ +BOOST_AUTO_TEST_CASE( test_setUpdatedPlasticStrainLikeISVs ){ /*! * Test setting the strain-like ISV evolution rates */ @@ -4464,6 +4464,10 @@ BOOST_AUTO_TEST_CASE( test_setUpdatedStrainLikeISVs ){ floatVector previousEvolutionRates = { 0.1, 0.2, 0.3, 0.4, 0.5 }; + floatMatrix dPlasticStrainLikeISVEvolutionRatesdStateVariables = initialize( 5, 10 ); + + floatMatrix previousdPlasticStrainLikeISVEvolutionRatesdStateVariables = initialize( 5, 10 ); + floatVector plasticParameters = { 2, 0.53895133, 0.37172145, 2, 0.37773052, 0.92739145, 2, 0.53186824, 0.75454313, @@ -4490,31 +4494,35 @@ BOOST_AUTO_TEST_CASE( test_setUpdatedStrainLikeISVs ){ } - virtual void setStrainLikeISVEvolutionRates( const bool isPrevious ) override{ + virtual void setPlasticStrainLikeISVEvolutionRates( const bool isPrevious ) override{ if ( isPrevious ){ - set_previousStrainLikeISVEvolutionRates( previousEvolutionRates ); + set_previousPlasticStrainLikeISVEvolutionRates( previousEvolutionRates ); } else{ - set_strainLikeISVEvolutionRates( evolutionRates ); + set_plasticStrainLikeISVEvolutionRates( evolutionRates ); } } - virtual void setStrainLikeISVEvolutionRatesJacobians( const bool isPrevious ) override{ + virtual void setPlasticStrainLikeISVEvolutionRatesJacobians( const bool isPrevious ) override{ if ( isPrevious ){ - set_previousStrainLikeISVEvolutionRates( previousEvolutionRates ); + set_previousPlasticStrainLikeISVEvolutionRates( previousEvolutionRates ); + + set_previousdPlasticStrainLikeISVEvolutionRatesdStateVariables( previousdPlasticStrainLikeISVEvolutionRatesdStateVariables ); } else{ - set_strainLikeISVEvolutionRates( evolutionRates ); + set_plasticStrainLikeISVEvolutionRates( evolutionRates ); + + set_dPlasticStrainLikeISVEvolutionRatesdStateVariables( dPlasticStrainLikeISVEvolutionRatesdStateVariables ); } @@ -4581,7 +4589,7 @@ BOOST_AUTO_TEST_CASE( test_setUpdatedStrainLikeISVs ){ RJ.get_dUpdatedPlasticStrainLikeISVsdStateVariables( ); - floatVector updatedPlasticISVs = 0.5 * ( *R.get_strainLikeISVEvolutionRates( ) + *R.get_previousStrainLikeISVEvolutionRates( ) ) * deltaTime + floatVector updatedPlasticISVs = 0.5 * ( *R.get_plasticStrainLikeISVEvolutionRates( ) + *R.get_previousPlasticStrainLikeISVEvolutionRates( ) ) * deltaTime + floatVector( previousStateVariables.end( ) - 5, previousStateVariables.end( ) ); BOOST_CHECK( tardigradeVectorTools::fuzzyEquals( updatedPlasticISVs, *R.get_updatedPlasticStrainLikeISVs( ) ) ); @@ -4589,3 +4597,375 @@ BOOST_AUTO_TEST_CASE( test_setUpdatedStrainLikeISVs ){ BOOST_CHECK( tardigradeVectorTools::fuzzyEquals( updatedPlasticISVs, *RJ.get_updatedPlasticStrainLikeISVs( ) ) ); } + +BOOST_AUTO_TEST_CASE( test_setUpdatedPlasticStrainLikeISVs2 ){ + /*! + * Test setting the strain-like ISV evolution rates + */ + + // Form a hydra class and residual class + floatType time = 1.23; + + floatType deltaTime = 2.34; + + floatType temperature = 3.45; + + floatType previousTemperature = 4.56; + + variableVector deformationGradient = { 1.00157757, 0.00159138, 0.00672005, + 0.01747159, 1.01122277, 0.00555118, + 0.01112217, -0.00885205, 0.99308943 }; + + variableVector microDeformation = { 0.99460588, -0.0078411 , 0.01145249, + -0.00307139, 0.97798389, -0.00509779, + 0.01189977, -0.01587541, 0.98377259 }; + + variableVector gradientMicroDeformation = { -1.35868385e-02, -1.03142977e-02, 6.54880619e-03, -2.03947530e-02, + -3.31494137e-03, -3.45686183e-03, -3.15745117e-04, -3.70848549e-03, + -9.38693885e-03, -3.68243465e-03, 1.96694582e-02, 2.22080009e-02, + 9.18337942e-05, 6.19764759e-03, -1.92190802e-02, -9.13572591e-03, + -4.25868940e-03, 1.83154579e-02, -1.24772317e-02, -8.48286787e-04, + 2.42779893e-02, 9.74255963e-04, 5.64472629e-03, -1.89685667e-02, + 1.63170400e-02, 5.15300642e-03, 2.25340032e-03 }; + + floatVector previousDeformationGradient = { 9.94656270e-01, 4.82152400e-02, 3.31984800e-02, 2.81918700e-02, + 1.02086536e+00, -1.77592100e-02, -2.24798000e-03, -1.28410000e-04, + 9.77165250e-01 }; + + floatVector previousMicroDeformation = { 0.96917405, -0.01777599, 0.00870406, -0.02163002, 0.9998683 , + -0.01669352, 0.03355217, 0.04427456, 1.01778466 }; + + floatVector previousGradientMicroDeformation = { 0.05043761, 0.02160516, -0.0565408 , 0.01218304, -0.05851034, + 0.00485749, -0.00962607, -0.03455912, 0.04490067, 0.01552915, + -0.02878364, 0.00595866, 0.04750406, -0.02377005, -0.05041534, + -0.02922214, 0.06280788, 0.02850865, -0.00226005, 0.0146049 , + 0.01560184, 0.03224767, 0.05822091, -0.05294424, -0.03518206, + 0.01831308, 0.03774438 }; + + floatVector previousStateVariables = {-0.02495446, -0.00169657, 0.04855598, 0.00194851, 0.01128945, + -0.03793713, 0.03263408, 0.01030601, 0.0045068 , -0.01572362, + -0.01958792, -0.00829778, 0.01813008, 0.03754568, 0.00104223, + 0.01693138, 0.00859366, 0.01249035, 0.01746891, 0.03423424, + -0.0416805 , 0.02636828, -0.02563336, -0.0305777 , 0.0072457 , + -0.04042875, 0.03853268, 0.0127249 , 0.02234164, -0.04838708, + 0.00944319, 0.00567852, -0.03410404, -0.03469295, 0.01955295, + -0.01812336, 0.01919703, 0.00543832, -0.01110494, 0.04251325, + 0.034167 , -0.01426024, -0.04564085, -0.01952319, -0.01018143, + 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 }; + + floatVector parameters = { 2, 0.53895133, 0.37172145, + 2, 0.37773052, 0.92739145, + 2, 0.53186824, 0.75454313, + 2, 0.95338442, 0.74042148, + 2, 0.38093104, 0.49241325, + 2, 0.82121039, 0.90566759, + 2, 0.01166325, 0.05331896, + 2, 0.32982199, 0.60161431, + 2, 0.58881096, 0.11473813 }; + + floatVector unknownVector = { 4.31202550e-01, -1.78960429e-01, -6.17986089e-01, 9.34988614e-01, + 3.01500733e-01, 7.30919703e-01, -9.49515284e-01, -4.66188370e-01, + 4.14220065e-03, -8.65102730e-01, 9.86066522e-01, -5.27075208e-01, + -2.51415635e-01, -5.71976170e-01, -7.89108268e-01, -5.35040429e-01, + -3.98779729e-01, 2.68884536e-01, -4.37530437e-01, -2.75446478e-01, + -9.88114313e-01, -2.68561748e-01, 6.77719634e-02, -6.75968326e-01, + 1.94866217e-01, -4.13695063e-01, 2.64100990e-01, -9.47606789e-01, + 7.75186921e-01, -9.67762739e-01, -7.46083938e-01, 5.54324923e-01, + -9.08209536e-01, 4.21997387e-01, 9.42092281e-01, 7.43365866e-01, + 4.20323303e-01, 9.17019486e-01, -1.40373324e-01, 7.45757829e-01, + -2.88084664e-01, 8.59527306e-01, -7.02444688e-01, 8.80058030e-01, + 6.65432395e-01, 1.01730274e+00, -1.88038495e-02, 4.82434492e-03, + -2.41803760e-02, 1.01105922e+00, -2.46131243e-02, -2.07588861e-02, + -1.37250795e-02, 1.01875623e+00, 9.93178816e-01, 1.99799676e-03, + 3.40516069e-03, -1.37268320e-02, 1.00360734e+00, 8.04758975e-03, + -1.00877303e-02, -4.06865705e-03, 9.97654446e-01, 2.16175331e-02, + 4.37468737e-03, 2.24126186e-02, 2.80173769e-03, 2.80710425e-05, + -2.48233895e-02, -9.55547806e-04, 2.13727499e-02, -1.50817155e-02, + -2.23954433e-02, -4.66105533e-03, -6.38017597e-03, 1.78576529e-02, + -2.36694442e-02, 2.10074615e-02, 9.04514995e-03, 2.02112997e-02, + 5.37645354e-03, 1.55976656e-02, -8.22280632e-03, -7.52168860e-03, + -5.50628848e-03, 1.27398541e-02, -6.53544128e-03, -1.28890097e-02, + 2.18834178e-02, 2.04005542e-02, + 0.01, 0.02, 0.03, 0.04, 0.05, + 0.06, 0.07, 0.08, 0.09, 0.10 }; + + unsigned int numConfigurations = 2; + + unsigned int numNonLinearSolveStateVariables = 10; + + std::vector< unsigned int > stateVariableIndices = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + + unsigned int dimension = 3; + + unsigned int configuration_unknown_count = 45; + + floatType tolr = 1e-2; + + floatType tola = 1e-3; + + unsigned int maxIterations = 24; + + unsigned int maxLSIterations = 45; + + floatType lsAlpha = 2.3; + + class stressMock : public tardigradeHydra::residualBaseMicromorphic{ + + public: + + using tardigradeHydra::residualBaseMicromorphic::residualBaseMicromorphic; + + floatVector previousPK2Stress = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + + floatVector previousSIGMA = { 10, 11, 12, 13, 14, 15, 16, 17, 18 }; + + floatVector previousM = { 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 }; + + protected: + + using tardigradeHydra::residualBase::setPreviousStress; + + virtual void setPreviousStress( ) override{ + + setPreviousStress( tardigradeVectorTools::appendVectors( { previousPK2Stress, previousSIGMA, previousM } ) ); + + } + + }; + + class residualMock : public tardigradeHydra::micromorphicDruckerPragerPlasticity::residual{ + + public: + + using tardigradeHydra::micromorphicDruckerPragerPlasticity::residual::residual; + + floatVector plasticParameters = { 2, 0.53895133, 0.37172145, + 2, 0.37773052, 0.92739145, + 2, 0.53186824, 0.75454313, + 2, 0.95338442, 0.74042148, + 2, 0.38093104, 0.49241325, + 2, 0.82121039, 0.90566759, + 2, 0.01166325, 0.05331896, + 2, 0.32982199, 0.60161431, + 2, 0.58881096, 0.11473813 }; + + floatVector initialize( unsigned int nrows ){ + + floatVector value( nrows, 0 ); + + return value; + + } + + floatMatrix initialize( unsigned int nrows, unsigned int ncols ){ + + floatMatrix value( nrows, floatVector( ncols, 0 ) ); + + return value; + + } + + }; + + class hydraBaseMicromorphicMock : public tardigradeHydra::hydraBaseMicromorphic{ + + public: + + using tardigradeHydra::hydraBaseMicromorphic::hydraBaseMicromorphic; + + stressMock elasticity; + + residualMock plasticity; + + std::vector< unsigned int > stateVariableIndices = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + + floatVector plasticParameters = { 2, 0.53895133, 0.37172145, + 2, 0.37773052, 0.92739145, + 2, 0.53186824, 0.75454313, + 2, 0.95338442, 0.74042148, + 2, 0.38093104, 0.49241325, + 2, 0.82121039, 0.90566759, + 2, 0.01166325, 0.05331896, + 2, 0.32982199, 0.60161431, + 2, 0.58881096, 0.11473813 }; + + floatVector _local_deltaPK2 = initialize( 9 ); + + floatVector _local_deltaSIGMA = initialize( 9 ); + + floatVector _local_deltaM = initialize( 27 ); + + floatVector initialize( unsigned int nrows ){ + + floatVector value( nrows, 0 ); + + return value; + + } + + floatMatrix initialize( unsigned int nrows, unsigned int ncols ){ + + floatMatrix value( nrows, floatVector( ncols, 0 ) ); + + return value; + + } + + private: + + using tardigradeHydra::hydraBaseMicromorphic::setResidualClasses; + + virtual void setResidualClasses( ) override{ + + std::vector< tardigradeHydra::residualBase* > residuals( 2 ); + + elasticity = stressMock( this, 45 ); + + elasticity.previousPK2Stress += _local_deltaPK2; + + elasticity.previousSIGMA += _local_deltaSIGMA; + + elasticity.previousM += _local_deltaM; + + plasticity = residualMock( this, 55, 1, stateVariableIndices, plasticParameters ); + + residuals[ 0 ] = &elasticity; + + residuals[ 1 ] = &plasticity; + + setResidualClasses( residuals ); + + } + + }; + + hydraBaseMicromorphicMock hydra( time, deltaTime, temperature, previousTemperature, deformationGradient, previousDeformationGradient, + microDeformation, previousMicroDeformation, gradientMicroDeformation, previousGradientMicroDeformation, + previousStateVariables, parameters, + numConfigurations, numNonLinearSolveStateVariables, + dimension, configuration_unknown_count, + tolr, tola, maxIterations, maxLSIterations, lsAlpha ); + + tardigradeHydra::unit_test::hydraBaseTester::updateUnknownVector( hydra, unknownVector ); + + residualMock R( &hydra, 55, 1, stateVariableIndices, parameters ); + + // Test of the Jacobians + + floatMatrix dUpdatedPlasticStrainLikeISVsdX( 5, floatVector( unknownVector.size( ), 0 ) ); + + floatMatrix dUpdatedPlasticStrainLikeISVsdPreviousISVs( 5, floatVector( previousStateVariables.size( ), 0 ) ); + + floatType eps = 1e-6; + + for ( unsigned int i = 0; i < unknownVector.size( ); i++ ){ + + floatVector delta( unknownVector.size( ), 0 ); + + delta[ i ] = eps * std::fabs( unknownVector[ i ] ) + eps; + + hydraBaseMicromorphicMock hydrap( time, deltaTime, temperature, previousTemperature, deformationGradient, previousDeformationGradient, + microDeformation, previousMicroDeformation, gradientMicroDeformation, previousGradientMicroDeformation, + previousStateVariables, parameters, + numConfigurations, numNonLinearSolveStateVariables, + dimension, configuration_unknown_count, + tolr, tola, maxIterations, maxLSIterations, lsAlpha ); + + hydraBaseMicromorphicMock hydram( time, deltaTime, temperature, previousTemperature, deformationGradient, previousDeformationGradient, + microDeformation, previousMicroDeformation, gradientMicroDeformation, previousGradientMicroDeformation, + previousStateVariables, parameters, + numConfigurations, numNonLinearSolveStateVariables, + dimension, configuration_unknown_count, + tolr, tola, maxIterations, maxLSIterations, lsAlpha ); + + tardigradeHydra::unit_test::hydraBaseTester::updateUnknownVector( hydrap, unknownVector + delta ); + + tardigradeHydra::unit_test::hydraBaseTester::updateUnknownVector( hydram, unknownVector - delta ); + + residualMock Rp( &hydrap, 55, 1, stateVariableIndices, parameters ); + + residualMock Rm( &hydram, 55, 1, stateVariableIndices, parameters ); + + floatVector vp = *Rp.get_updatedPlasticStrainLikeISVs( ); + + floatVector vm = *Rm.get_updatedPlasticStrainLikeISVs( ); + + for ( unsigned int j = 0; j < vp.size( ); j++ ){ + + dUpdatedPlasticStrainLikeISVsdX[ j ][ i ] = ( vp[ j ] - vm[ j ] ) / ( 2 * delta[ i ] ); + + } + + } + + floatMatrix assembled_dUpdatedPlasticStrainLikeISVsdX( 5, floatVector( unknownVector.size( ), 0 ) ); + + for ( unsigned int i = 0; i < 5; i++ ){ + + for ( unsigned int j = 0; j < 10; j++ ){ + + assembled_dUpdatedPlasticStrainLikeISVsdX[ i ][ j + 2 * configuration_unknown_count ] = ( *R.get_dUpdatedPlasticStrainLikeISVsdStateVariables( ) )[ i ][ j ]; + + } + + } + + BOOST_CHECK( tardigradeVectorTools::fuzzyEquals( dUpdatedPlasticStrainLikeISVsdX, assembled_dUpdatedPlasticStrainLikeISVsdX ) ); + + for ( unsigned int i = 0; i < previousStateVariables.size( ); i++ ){ + + floatVector delta( previousStateVariables.size( ), 0 ); + + delta[ i ] = eps * std::fabs( previousStateVariables[ i ] ) + eps; + + hydraBaseMicromorphicMock hydrap( time, deltaTime, temperature, previousTemperature, deformationGradient, previousDeformationGradient, + microDeformation, previousMicroDeformation, gradientMicroDeformation, previousGradientMicroDeformation, + previousStateVariables + delta, parameters, + numConfigurations, numNonLinearSolveStateVariables, + dimension, configuration_unknown_count, + tolr, tola, maxIterations, maxLSIterations, lsAlpha ); + + hydraBaseMicromorphicMock hydram( time, deltaTime, temperature, previousTemperature, deformationGradient, previousDeformationGradient, + microDeformation, previousMicroDeformation, gradientMicroDeformation, previousGradientMicroDeformation, + previousStateVariables - delta, parameters, + numConfigurations, numNonLinearSolveStateVariables, + dimension, configuration_unknown_count, + tolr, tola, maxIterations, maxLSIterations, lsAlpha ); + + tardigradeHydra::unit_test::hydraBaseTester::updateUnknownVector( hydrap, unknownVector ); + + tardigradeHydra::unit_test::hydraBaseTester::updateUnknownVector( hydram, unknownVector ); + + residualMock Rp( &hydrap, 55, 1, stateVariableIndices, parameters ); + + residualMock Rm( &hydram, 55, 1, stateVariableIndices, parameters ); + + floatVector vp = *Rp.get_updatedPlasticStrainLikeISVs( ); + + floatVector vm = *Rm.get_updatedPlasticStrainLikeISVs( ); + + for ( unsigned int j = 0; j < vp.size( ); j++ ){ + + dUpdatedPlasticStrainLikeISVsdPreviousISVs[ j ][ i ] = ( vp[ j ] - vm[ j ] ) / ( 2 * delta[ i ] ); + + } + + } + + floatMatrix assembled_dUpdatedPlasticStrainLikeISVsdPreviousISVs( 5, floatVector( previousStateVariables.size( ), 0 ) ); + + for ( unsigned int i = 0; i < 5; i++ ){ + + for ( unsigned int j = 0; j < 10; j++ ){ + + assembled_dUpdatedPlasticStrainLikeISVsdPreviousISVs[ i ][ j + configuration_unknown_count ] = ( *R.get_dUpdatedPlasticStrainLikeISVsdPreviousStateVariables( ) )[ i ][ j ]; + + } + + } + + BOOST_CHECK( tardigradeVectorTools::fuzzyEquals( dUpdatedPlasticStrainLikeISVsdPreviousISVs, assembled_dUpdatedPlasticStrainLikeISVsdPreviousISVs ) ); + +} From 6366b84dfd9f0d5fa8df32dad3900af69f790f32 Mon Sep 17 00:00:00 2001 From: Nathan Miller Date: Tue, 9 Jan 2024 13:31:42 -0700 Subject: [PATCH 3/3] MAINT: Updated the changelog --- docs/sphinx/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/sphinx/changelog.rst b/docs/sphinx/changelog.rst index 99db8f1e..7a7a177f 100644 --- a/docs/sphinx/changelog.rst +++ b/docs/sphinx/changelog.rst @@ -24,6 +24,7 @@ Internal Changes - Added the calculation of the cohesion (:pull:`41`). By `Nathan Miller`_. - Added the calculation of the required quantities from the flow potential (:pull:`42`). By `Nathan Miller`_. - Added the calculation of the jacobians of the strain-like ISV evolution rates (:pull:`43`). By `Nathan Miller`_. +- Added the calculation of the values and Jacobians of the strain-like ISVs (:pull:`44`). By `Nathan Miller`_. ****************** 0.3.0 (01-03-2023)