diff --git a/Sources/ModelInstances/UnderDevelopment/Poromechanics/ImplicitStepFluid/InnerLoop/VariationalFormulation.hpp b/Sources/ModelInstances/UnderDevelopment/Poromechanics/ImplicitStepFluid/InnerLoop/VariationalFormulation.hpp index 0902d60377b42d022274d61083dd4072f177ec92..3c35804f1d25d626d78e295357216f20dc277b82 100644 --- a/Sources/ModelInstances/UnderDevelopment/Poromechanics/ImplicitStepFluid/InnerLoop/VariationalFormulation.hpp +++ b/Sources/ModelInstances/UnderDevelopment/Poromechanics/ImplicitStepFluid/InnerLoop/VariationalFormulation.hpp @@ -174,7 +174,15 @@ namespace HappyHeart * * \return Norm obtained. */ - double Perform(differential is_differential, unsigned int iteration); + double Perform(unsigned int iteration); + + + /*! + * + * \todo #9 - #820 To complete! + */ + double PerformDifferential(unsigned int iteration); + //! Compute the matrix with an updated T21 block (to use after the Newton converged). const GlobalMatrix& ComputeMatrixWithUpdatedT21() noexcept; diff --git a/Sources/ModelInstances/UnderDevelopment/Poromechanics/ImplicitStepFluid/InnerLoop/VariationalFormulation.hxx b/Sources/ModelInstances/UnderDevelopment/Poromechanics/ImplicitStepFluid/InnerLoop/VariationalFormulation.hxx index d35e5cee71cbf5da569177e361df457eaa91795d..9c233da2ecb02a579ab1a54e0f57b2d60c66436e 100644 --- a/Sources/ModelInstances/UnderDevelopment/Poromechanics/ImplicitStepFluid/InnerLoop/VariationalFormulation.hxx +++ b/Sources/ModelInstances/UnderDevelopment/Poromechanics/ImplicitStepFluid/InnerLoop/VariationalFormulation.hxx @@ -30,8 +30,7 @@ namespace HappyHeart template<class HyperelasticLawT> double VariationalFormulation<HyperelasticLawT> - ::Perform(differential is_differential, - unsigned int iteration) + ::Perform(unsigned int iteration) { SetIndexInnerLoop(iteration); decltype(auto) time_manager = parent::GetTimeManager(); @@ -68,49 +67,36 @@ namespace HappyHeart corrected_values.UpdateGhosts(__FILE__, __LINE__); } - switch(is_differential) - { - case differential::no: - { - auto& system_matrix = parent::GetNonCstSystemMatrix(numbering_subset, numbering_subset); - system_matrix.ZeroEntries(__FILE__, __LINE__); - - ComputeMatrix(do_reuse_matrix, BlocksToRecompute::all); - - system_matrix.Assembly(__FILE__, __LINE__); - - system_matrix.View(parent::MpiHappyHeart(), - parent::GetOutputDirectory(numbering_subset) - + "/" - + DifferentialPreffix(is_differential) - + "full_matrix_" + GetIterationTag() + ".hhdata", - __FILE__, __LINE__); - - system_matrix.View(parent::MpiHappyHeart(), - parent::GetOutputDirectory(numbering_subset) - + "/" - + DifferentialPreffix(is_differential) - + "full_matrix_" + GetIterationTag() + ".m", - __FILE__, __LINE__, - PETSC_VIEWER_ASCII_MATLAB); - - system_matrix.ViewBinary(parent::MpiHappyHeart(), - parent::GetOutputDirectory(numbering_subset) - + "/" - + DifferentialPreffix(is_differential) - + "full_matrix_" + GetIterationTag() + ".binary.hhdata", - __FILE__, __LINE__); - - - break; - } - case differential::yes: - // Just reuse tangent matrix computed at the end of last non differential case. - break; - } // switch + auto& system_matrix = parent::GetNonCstSystemMatrix(numbering_subset, numbering_subset); + system_matrix.ZeroEntries(__FILE__, __LINE__); - - ComputeRhs(is_differential); // must occur after T11, as it needs the t11 matrix. + ComputeMatrix(do_reuse_matrix, BlocksToRecompute::all); + + system_matrix.Assembly(__FILE__, __LINE__); + + system_matrix.View(parent::MpiHappyHeart(), + parent::GetOutputDirectory(numbering_subset) + + "/" + + DifferentialPreffix(differential::no) + + "full_matrix_" + GetIterationTag() + ".hhdata", + __FILE__, __LINE__); + + system_matrix.View(parent::MpiHappyHeart(), + parent::GetOutputDirectory(numbering_subset) + + "/" + + DifferentialPreffix(differential::no) + + "full_matrix_" + GetIterationTag() + ".m", + __FILE__, __LINE__, + PETSC_VIEWER_ASCII_MATLAB); + + system_matrix.ViewBinary(parent::MpiHappyHeart(), + parent::GetOutputDirectory(numbering_subset) + + "/" + + DifferentialPreffix(differential::no) + + "full_matrix_" + GetIterationTag() + ".binary.hhdata", + __FILE__, __LINE__); + + ComputeRhs(differential::no); // must occur after T11, as it needs the t11 matrix. parent::template SolveLinear<IsFactorized::no>(numbering_subset, numbering_subset); @@ -122,7 +108,7 @@ namespace HappyHeart solution.View(parent::MpiHappyHeart(), parent::GetOutputDirectory(numbering_subset) + "/" - + DifferentialPreffix(is_differential) + + DifferentialPreffix(differential::no) + "correction_" + GetIterationTag() + ".m", __FILE__, __LINE__, PETSC_VIEWER_ASCII_MATLAB); @@ -140,7 +126,7 @@ namespace HappyHeart corrected_values.View(parent::MpiHappyHeart(), parent::GetOutputDirectory(numbering_subset) + "/" - + DifferentialPreffix(is_differential) + + DifferentialPreffix(differential::no) + "mixt_variables_" + GetIterationTag() + ".m", __FILE__, __LINE__, PETSC_VIEWER_ASCII_MATLAB); @@ -156,6 +142,22 @@ namespace HappyHeart } + template<class HyperelasticLawT> + double VariationalFormulation<HyperelasticLawT> + ::PerformDifferential(unsigned int iteration) + { + SetIndexInnerLoop(iteration); + decltype(auto) time_manager = parent::GetTimeManager(); + decltype(auto) god_of_dof = parent::GetGodOfDof(); + decltype(auto) numbering_subset = + god_of_dof.GetNumberingSubset(EnumUnderlyingType(NumberingSubsetIndex::fluid_mass_velocity_pressure)); + + // \todo #820 At the moment, I accept my norm is not the same as Bruno's; see what Petsc gives when + // SNES is applied (system_rhs's is what we got in hyperelastic model). + const double norm = parent::GetSystemRhs(numbering_subset).Norm(NORM_2, __FILE__, __LINE__); + return norm; + } + template<class HyperelasticLawT> void VariationalFormulation<HyperelasticLawT> diff --git a/Sources/ModelInstances/UnderDevelopment/Poromechanics/ImplicitStepFluid/VariationalFormulation.hxx b/Sources/ModelInstances/UnderDevelopment/Poromechanics/ImplicitStepFluid/VariationalFormulation.hxx index 7df9caf3b335ec7fb171ec62f0476a9bf7951de8..2b010e3310b52c7c3c48ef8bdbd62401fafcfb23 100644 --- a/Sources/ModelInstances/UnderDevelopment/Poromechanics/ImplicitStepFluid/VariationalFormulation.hxx +++ b/Sources/ModelInstances/UnderDevelopment/Poromechanics/ImplicitStepFluid/VariationalFormulation.hxx @@ -72,7 +72,20 @@ namespace HappyHeart // Newton loop (\todo #820 To replace with Petsc Newton...) do { - current_norm = inner_varf.Perform(is_differential, counter++); + switch(is_differential) + { + case differential::no: + { + current_norm = inner_varf.Perform(counter++); + break; + } + case differential::yes: + { + current_norm = inner_varf.PerformDifferential(counter++); + break; + } + } + std::cout << "Norm after inner loop = " << current_norm << std::endl; } while (current_norm > 1.e-12 && counter < 10u); // \todo #820 Replace by proper stop condition from input file! diff --git a/Sources/ModelInstances/UnderDevelopment/Poromechanics/Model.hxx b/Sources/ModelInstances/UnderDevelopment/Poromechanics/Model.hxx index 2d2c75c2cc777dc9ce40d87d9e8ba940e3d8c2bb..1ebe354177d78d26bdfe5a364820a8a0adc22f32 100644 --- a/Sources/ModelInstances/UnderDevelopment/Poromechanics/Model.hxx +++ b/Sources/ModelInstances/UnderDevelopment/Poromechanics/Model.hxx @@ -247,6 +247,10 @@ namespace HappyHeart input_vector.Scale(parent::GetTimeManager().GetInverseTimeStep(), __FILE__, __LINE__); + auto& implicit_step_varf = GetNonCstImplicitStepFluidVarf(); + + implicit_step_varf.Perform(differential::yes); + // We can't take directly the internal pointer of a wrapped vector which pattern would be similar to input_displ_vector // : residual computation is wrong if we do.