From 808d52c8c52b6412b0fd30fce3ed6eae91fb9b4d Mon Sep 17 00:00:00 2001
From: Sebastien Gilles <sebastien.gilles@inria.fr>
Date: Tue, 22 Dec 2015 16:37:24 +0100
Subject: [PATCH] #772 VertexMatching: renaming, clean-up and documentation.

---
 Data/Lua/demo_input_fsi_ei_two_meshes.lua     |  8 +--
 ...rogramWiseIndexListPerVertexCoordIndex.cpp | 30 +++--------
 ...rogramWiseIndexListPerVertexCoordIndex.hpp | 51 ++++++++++++++-----
 ...iseIndexListPerVertexCoordIndexManager.cpp |  8 +--
 ...iseIndexListPerVertexCoordIndexManager.hpp |  5 +-
 .../FSI_EI_2_meshes/Newton/Model.hxx          | 27 +++-------
 .../FromVertexMatching.cpp                    | 12 ++---
 .../FromVertexMatching.hpp                    |  8 +--
 .../FromVertexMatching.hxx                    |  4 +-
 9 files changed, 72 insertions(+), 81 deletions(-)

diff --git a/Data/Lua/demo_input_fsi_ei_two_meshes.lua b/Data/Lua/demo_input_fsi_ei_two_meshes.lua
index e02abc96fd..ce951b76af 100644
--- a/Data/Lua/demo_input_fsi_ei_two_meshes.lua
+++ b/Data/Lua/demo_input_fsi_ei_two_meshes.lua
@@ -719,7 +719,7 @@ FiniteElementSpace7 = {
 
 
 -- Solid
-DofProgramWiseIndexListPerVertexCoordIndex1 = {
+InitVertexMatchingInterpolator1 = {
     
     -- Finite element space for which the dofs index will be associated to each vertex.
     -- Expected format: VALUE
@@ -729,11 +729,11 @@ DofProgramWiseIndexListPerVertexCoordIndex1 = {
     -- Expected format: "VALUE"
     numbering_subset = 7
     
-} -- DofProgramWiseIndexListPerVertexCoordIndex1
+} -- InitVertexMatchingInterpolator1
 
 
 -- Fluid
-DofProgramWiseIndexListPerVertexCoordIndex2 = {
+InitVertexMatchingInterpolator2 = {
     
     -- Finite element space for which the dofs index will be associated to each vertex.
     -- Expected format: VALUE
@@ -743,7 +743,7 @@ DofProgramWiseIndexListPerVertexCoordIndex2 = {
     -- Expected format: "VALUE"
     numbering_subset = 6
     
-} -- DofProgramWiseIndexListPerVertexCoordIndex2
+} -- InitVertexMatchingInterpolator2
 
 
 Petsc1 = {
diff --git a/Sources/FiniteElement/FiniteElementSpace/Private/DofProgramWiseIndexListPerVertexCoordIndex.cpp b/Sources/FiniteElement/FiniteElementSpace/Private/DofProgramWiseIndexListPerVertexCoordIndex.cpp
index b81d65dcf4..c137488704 100644
--- a/Sources/FiniteElement/FiniteElementSpace/Private/DofProgramWiseIndexListPerVertexCoordIndex.cpp
+++ b/Sources/FiniteElement/FiniteElementSpace/Private/DofProgramWiseIndexListPerVertexCoordIndex.cpp
@@ -118,13 +118,10 @@ namespace HappyHeart
         }
         
         
-        void DofProgramWiseIndexListPerVertexCoordIndex::ReduceToProcessorWise()
+        
+        DofProgramWiseIndexListPerVertexCoordIndex::storage_type
+        DofProgramWiseIndexListPerVertexCoordIndex::ComputeProcessorWiseStorage() const
         {
-            #ifndef NDEBUG
-            assert(!is_reduced_to_processor_wise_);
-            is_reduced_to_processor_wise_ = true;
-            #endif // NDEBUG
-            
             const auto& felt_space = GetFEltSpace();
             
             const auto god_of_dof_ptr = felt_space.GetGodOfDofPtr();
@@ -133,17 +130,9 @@ namespace HappyHeart
             const auto& coords_list = mesh.GetCoordsList();
             
             storage_type reduced_storage;
-            auto& storage = GetNonCstDofProgramWiseIndexPerCoordIndex();
+            const auto& storage = GetDofProgramWiseIndexPerCoordIndex();
             const auto end_storage = storage.cend();
             
-            
-            std::cout << "Possibilities: ";
-            Utilities::PrintKeys(storage);
-            
-          //  auto& Nprocessor_wise_dof = Nprocessor_wise_dof_;
-            
-            std::cout << "Check " << storage.size() << " ";
-            
             for (const auto& coords_ptr : coords_list)
             {
                 assert(!(!coords_ptr));
@@ -154,21 +143,14 @@ namespace HappyHeart
                 auto it = storage.find(coords_index);
                 
                 if (it != end_storage)
-                {
                     reduced_storage.insert(*it);
-                //    Nprocessor_wise_dof += it->second.size();
-                }
             }
-
-            std::cout << "\n" << felt_space.MpiHappyHeart().GetRankPreffix() << " STORAGE before/after for " << felt_space.GetUniqueId() << " = " << storage.size() << "\t" << reduced_storage.size() << std::endl;
-            
-            std::swap(storage, reduced_storage);
-            
             
+            return reduced_storage;
         }
         
         
-        unsigned int DofProgramWiseIndexListPerVertexCoordIndex::ComputeNprocessorWisedof()
+        unsigned int DofProgramWiseIndexListPerVertexCoordIndex::ComputeNprocessorWisedof() const
         {
             const auto& felt_space = GetFEltSpace();
             decltype(auto) complete_dof_list = felt_space.GetProcessorWiseDofList();
diff --git a/Sources/FiniteElement/FiniteElementSpace/Private/DofProgramWiseIndexListPerVertexCoordIndex.hpp b/Sources/FiniteElement/FiniteElementSpace/Private/DofProgramWiseIndexListPerVertexCoordIndex.hpp
index 58a3e5693b..7b3bf5756b 100644
--- a/Sources/FiniteElement/FiniteElementSpace/Private/DofProgramWiseIndexListPerVertexCoordIndex.hpp
+++ b/Sources/FiniteElement/FiniteElementSpace/Private/DofProgramWiseIndexListPerVertexCoordIndex.hpp
@@ -68,6 +68,9 @@ namespace HappyHeart
          * the fact a shared_pointer is no longer useful, so I can't use it at this moment.
          *
          * A VertexMatching interpolator actually requires two such class: one for source and the other for target.
+         *
+         * \attention This class is intended at a very specific point of GodOfDof initialization (namely in GodOfDof::Init2(),
+         * after some data have been initializaed but before any processor-wise redutciton occurred).
          */
         class DofProgramWiseIndexListPerVertexCoordIndex
         : public ::HappyHeart::Crtp::UniqueId<DofProgramWiseIndexListPerVertexCoordIndex, UniqueIdNS::AssignationMode::manual>
@@ -79,7 +82,7 @@ namespace HappyHeart
             using self = DofProgramWiseIndexListPerVertexCoordIndex;
             
             //! Alias to unique pointer.
-            using unique_ptr = std::unique_ptr<self>;
+            using const_unique_ptr = std::unique_ptr<const self>;
             
             //! Friendship to manager.
             friend DofProgramWiseIndexListPerVertexCoordIndexManager;
@@ -101,8 +104,8 @@ namespace HappyHeart
             
             //! Constructor.
             explicit DofProgramWiseIndexListPerVertexCoordIndex(unsigned int unique_id,
-                                        const FEltSpace& felt_space,
-                                        const NumberingSubset& numbering_subset);
+                                                                const FEltSpace& felt_space,
+                                                                const NumberingSubset& numbering_subset);
             
             //! Destructor.
             ~DofProgramWiseIndexListPerVertexCoordIndex() = default;
@@ -123,41 +126,63 @@ namespace HappyHeart
             
         public:
             
-            //!
+            //! Finite element space considered.
             const FEltSpace& GetFEltSpace() const noexcept;
             
+            //! Numbering subset considered.
             const NumberingSubset& GetNumberingSubset() const noexcept;
             
+            //! Number of (program-wise) dofs.
             unsigned int NprogramWisedof() const noexcept;
             
-            unsigned int ComputeNprocessorWisedof();
+            /*!
+             * \brief Compute the number of processor-wise dofs.
+             *
+             * \attention This method must be called once all GodOfDofs are fully initialized (so NOT in the constructor
+             * for instance).
+             */
+            unsigned int ComputeNprocessorWisedof() const;
 
+            /*!
+             * \brief Constant access to the actual storage: key is the index of the Coords (which must be a vertex)
+             * and values are the program-wise indexes of the dofs.
+             */
             const storage_type& GetDofProgramWiseIndexPerCoordIndex() const noexcept;
             
-            void ReduceToProcessorWise();
+            //! Return a reduced storage in which only the processor-wise Coords are considered.
+            storage_type ComputeProcessorWiseStorage() const;
 
             
         private:
             
+            /*!
+             * \brief Non constant access to the actual storage: key is the index of the Coords (which must be a vertex)
+             * and values are the program-wise indexes of the dofs.
+             */
             storage_type& GetNonCstDofProgramWiseIndexPerCoordIndex() noexcept;
             
         private:
             
+            //! Finite element space considered.
             const FEltSpace& felt_space_;
             
+            //! Numbering subset considered.
             const NumberingSubset& numbering_subset_;
             
+            /*! 
+             * \brief Actual storage: key is the index of the Coords (which must be a vertex) and values are the 
+             * program-wise indexes of the dofs.
+             */
             storage_type dof_program_wise_index_per_coord_index_;
             
+            /*!
+             * \brief Number of (program-wise) dofs considered.
+             *
+             * \internal It should be noticed that when the object is created the number of processor-wise dofs
+             * is not known.
+             */
             unsigned int Nprogram_wise_dof_ = 0u;
             
-//            unsigned int Nprocessor_wise_dof_ = 0u;
-            
-            # ifndef NDEBUG
-            bool is_reduced_to_processor_wise_ = false;
-            # endif // NDEBUG
-            
-            
         };
         
         
diff --git a/Sources/FiniteElement/FiniteElementSpace/Private/DofProgramWiseIndexListPerVertexCoordIndexManager.cpp b/Sources/FiniteElement/FiniteElementSpace/Private/DofProgramWiseIndexListPerVertexCoordIndexManager.cpp
index 9b6998b2c7..21f19d0c5d 100644
--- a/Sources/FiniteElement/FiniteElementSpace/Private/DofProgramWiseIndexListPerVertexCoordIndexManager.cpp
+++ b/Sources/FiniteElement/FiniteElementSpace/Private/DofProgramWiseIndexListPerVertexCoordIndexManager.cpp
@@ -53,7 +53,7 @@ namespace HappyHeart
             DofProgramWiseIndexListPerVertexCoordIndex* buf
                 = new DofProgramWiseIndexListPerVertexCoordIndex(unique_id, felt_space, numbering_subset);
                                                              
-            auto&& ptr = DofProgramWiseIndexListPerVertexCoordIndex::unique_ptr(buf);
+            auto&& ptr = DofProgramWiseIndexListPerVertexCoordIndex::const_unique_ptr(buf);
             
             assert(ptr->GetUniqueId() == unique_id);
             
@@ -67,10 +67,10 @@ namespace HappyHeart
         }
         
         
-        DofProgramWiseIndexListPerVertexCoordIndex& DofProgramWiseIndexListPerVertexCoordIndexManager
-        ::GetNonCstDofProgramWiseIndexListPerVertexCoordIndex(unsigned int unique_id)
+        const DofProgramWiseIndexListPerVertexCoordIndex& DofProgramWiseIndexListPerVertexCoordIndexManager
+        ::GetDofProgramWiseIndexListPerVertexCoordIndex(unsigned int unique_id) const
         {
-            auto& list = GetNonCstStorage();
+            const auto& list = GetStorage();
             
             auto it = list.find(unique_id);
             assert(it != list.cend());
diff --git a/Sources/FiniteElement/FiniteElementSpace/Private/DofProgramWiseIndexListPerVertexCoordIndexManager.hpp b/Sources/FiniteElement/FiniteElementSpace/Private/DofProgramWiseIndexListPerVertexCoordIndexManager.hpp
index 8bbe1b17b1..7f2f3bb43b 100644
--- a/Sources/FiniteElement/FiniteElementSpace/Private/DofProgramWiseIndexListPerVertexCoordIndexManager.hpp
+++ b/Sources/FiniteElement/FiniteElementSpace/Private/DofProgramWiseIndexListPerVertexCoordIndexManager.hpp
@@ -80,7 +80,8 @@ namespace HappyHeart
             ~DofProgramWiseIndexListPerVertexCoordIndexManager() = default;
             
             //! Fetch the object associated with \a unique_id unique identifier.
-            DofProgramWiseIndexListPerVertexCoordIndex& GetNonCstDofProgramWiseIndexListPerVertexCoordIndex(unsigned int unique_id);
+            const DofProgramWiseIndexListPerVertexCoordIndex&
+                GetDofProgramWiseIndexListPerVertexCoordIndex(unsigned int unique_id) const;
             
         private:
             
@@ -113,7 +114,7 @@ namespace HappyHeart
         private:
             
             //! Store the god of dof objects by their unique identifier.
-            std::unordered_map<unsigned int, DofProgramWiseIndexListPerVertexCoordIndex::unique_ptr> list_;
+            std::unordered_map<unsigned int, DofProgramWiseIndexListPerVertexCoordIndex::const_unique_ptr> list_;
             
         };
         
diff --git a/Sources/ModelInstances/FSI_EI_2_meshes/Newton/Model.hxx b/Sources/ModelInstances/FSI_EI_2_meshes/Newton/Model.hxx
index c28be98370..004bd98e2e 100644
--- a/Sources/ModelInstances/FSI_EI_2_meshes/Newton/Model.hxx
+++ b/Sources/ModelInstances/FSI_EI_2_meshes/Newton/Model.hxx
@@ -36,8 +36,6 @@ namespace HappyHeart
         template<class SolidVariationalFormulationPolicyT>
         void Model<SolidVariationalFormulationPolicyT>::SupplInitialize(const InputParameterList& input_parameter_data)
         {
-            std::cout << "SUPPL INIT 0" << std::endl;
-            
             const auto& fluid_god_of_dof = this->GetGodOfDof(EnumUnderlyingType(MeshIndex::fluid));
             const auto& unknown_manager = UnknownManager::GetInstance();
             const auto& mpi = this->MpiHappyHeart();
@@ -65,7 +63,7 @@ namespace HappyHeart
 
                 sum_fluid_residual_ = std::make_unique<GlobalVector>(formulation.GetSystemRhs(numbering_subset));
             }
-            std::cout << "SUPPL INIT 10" << std::endl;
+
             {
                 const auto& numbering_subset =
                     fluid_god_of_dof.GetNumberingSubset(EnumUnderlyingType(NumberingSubsetIndex::fluid_velocity_pressure));
@@ -93,7 +91,7 @@ namespace HappyHeart
                 auto& formulation = this->GetNonCstImplicitStepFluidVariationalFormulation();
                 formulation.Init(input_parameter_data);
             }
-            std::cout << "SUPPL INIT 20" << std::endl;
+
             const auto& solid_god_of_dof = this->GetGodOfDof(EnumUnderlyingType(MeshIndex::solid));
             {
                 const auto& solid_numbering_subset =
@@ -101,7 +99,7 @@ namespace HappyHeart
                 solid_residual_ = std::make_unique<GlobalVector>(solid_numbering_subset);
                 AllocateGlobalVector(solid_god_of_dof, *solid_residual_);
             }
-            std::cout << "SUPPL INIT 30" << std::endl;
+
             {
                 const auto& solid_displacement = unknown_manager.GetUnknown(EnumUnderlyingType(UnknownIndex::solid_displacement));
                 const auto& main_felt_space = solid_god_of_dof.GetFEltSpace(EnumUnderlyingType(FEltSpaceIndex::solid));
@@ -165,21 +163,8 @@ namespace HappyHeart
                 }
                 
             }
-                    std::cout << "SUPPL INIT 50" << std::endl;
-            {
-                const auto& fsi_solid_felt_space =
-                    solid_god_of_dof.GetFEltSpace(EnumUnderlyingType(FEltSpaceIndex::fsi_solid));
-                
-                const auto& fsi_solid_numbering_subset =
-                    solid_god_of_dof.GetNumberingSubset(EnumUnderlyingType(NumberingSubsetIndex::solid_velocity_on_interface));
-
-                const auto& fsi_fluid_numbering_subset =
-                    fluid_god_of_dof.GetNumberingSubset(EnumUnderlyingType(NumberingSubsetIndex::fluid_on_interface));
 
-                const auto& fsi_fluid_felt_space =
-                    fluid_god_of_dof.GetFEltSpace(EnumUnderlyingType(FEltSpaceIndex::fsi_fluid));
-
-                
+            {
                 NonConformInterpolatorNS::pairing_type pairing
                 {
                     std::make_pair(unknown_manager.GetUnknownPtr(EnumUnderlyingType(UnknownIndex::solid_velocity)),
@@ -191,8 +176,8 @@ namespace HappyHeart
                 
                 solid_to_fluid_velocity_on_fsi_interpolator_ =
                     std::make_unique<NonConformInterpolatorNS::FromVertexMatching>(input_parameter_data,
-                                                                                   init_vertex_matching_manager.GetNonCstDofProgramWiseIndexListPerVertexCoordIndex(EnumUnderlyingType(InitVertexMatchingInterpolator::solid)),
-                                                                                   init_vertex_matching_manager.GetNonCstDofProgramWiseIndexListPerVertexCoordIndex(EnumUnderlyingType(InitVertexMatchingInterpolator::fluid)),
+                                                                                   init_vertex_matching_manager.GetDofProgramWiseIndexListPerVertexCoordIndex(EnumUnderlyingType(InitVertexMatchingInterpolator::solid)),
+                                                                                   init_vertex_matching_manager.GetDofProgramWiseIndexListPerVertexCoordIndex(EnumUnderlyingType(InitVertexMatchingInterpolator::fluid)),
                                                                                    std::move(pairing));
             }
             
diff --git a/Sources/Operators/NonConformInterpolator/FromVertexMatching.cpp b/Sources/Operators/NonConformInterpolator/FromVertexMatching.cpp
index f9e8a07903..c908271b68 100644
--- a/Sources/Operators/NonConformInterpolator/FromVertexMatching.cpp
+++ b/Sources/Operators/NonConformInterpolator/FromVertexMatching.cpp
@@ -27,14 +27,14 @@ namespace HappyHeart
         
         
         void FromVertexMatching::Construct(const GeometryNS::InterpolationNS::VertexMatching& vertex_matching,
-                                           Private::DofProgramWiseIndexListPerVertexCoordIndex& source,
-                                           Private::DofProgramWiseIndexListPerVertexCoordIndex& target,
+                                           const Private::DofProgramWiseIndexListPerVertexCoordIndex& source,
+                                           const Private::DofProgramWiseIndexListPerVertexCoordIndex& target,
                                            pairing_type&& pairing)
         {
             interpolation_matrix_ = std::make_unique<GlobalMatrix>(target.GetNumberingSubset(),
                                                                    source.GetNumberingSubset());
             
-            target.ReduceToProcessorWise();
+
             
             Unknown::vector_const_shared_ptr source_unknown_list;
             Unknown::vector_const_shared_ptr target_unknown_list;
@@ -56,9 +56,6 @@ namespace HappyHeart
             const auto Nprogram_wise_source_dof = source.NprogramWisedof();
             const auto Nprogram_wise_target_dof = target.NprogramWisedof();
             
-            std::cout << source.GetFEltSpace().MpiHappyHeart().GetRankPreffix() << " SOURCE " << Nprocessor_wise_source_dof << " - "<< Nprogram_wise_source_dof << std::endl;
-            std::cout << source.GetFEltSpace().MpiHappyHeart().GetRankPreffix() << " TARGET " << Nprocessor_wise_target_dof << " - "<< Nprogram_wise_target_dof << std::endl;
-            
             assert(Nprogram_wise_source_dof == Nprogram_wise_target_dof);
             assert(!source_dof_index_list_per_coord_index.empty());
             
@@ -74,8 +71,9 @@ namespace HappyHeart
             
             const auto end_dof_list_target = complete_dof_list_target.cend();
             
+            const auto target_dof_list_per_proc_wise_coord_index = target.ComputeProcessorWiseStorage();
             
-            for (const auto& pair : target_dof_index_list_per_coord_index)
+            for (const auto& pair : target_dof_list_per_proc_wise_coord_index)
             {
                 // Use geometric data to make source and target vertices match.
                 // Consider only Coords handled processor-wisely.
diff --git a/Sources/Operators/NonConformInterpolator/FromVertexMatching.hpp b/Sources/Operators/NonConformInterpolator/FromVertexMatching.hpp
index 249eabde23..9b38e07dc2 100644
--- a/Sources/Operators/NonConformInterpolator/FromVertexMatching.hpp
+++ b/Sources/Operators/NonConformInterpolator/FromVertexMatching.hpp
@@ -88,8 +88,8 @@ namespace HappyHeart
              */
             template<class InputParameterDataT>
             explicit FromVertexMatching(const InputParameterDataT& input_parameter_data,
-                                        Private::DofProgramWiseIndexListPerVertexCoordIndex& source,
-                                        Private::DofProgramWiseIndexListPerVertexCoordIndex& target,
+                                        const Private::DofProgramWiseIndexListPerVertexCoordIndex& source,
+                                        const Private::DofProgramWiseIndexListPerVertexCoordIndex& target,
                                         pairing_type&& pairing);
             
             //! Destructor.
@@ -116,8 +116,8 @@ namespace HappyHeart
             
             //! Construct the object. Should not be called outside of constructor.
             void Construct(const GeometryNS::InterpolationNS::VertexMatching& vertex_matching,
-                           Private::DofProgramWiseIndexListPerVertexCoordIndex& source,
-                           Private::DofProgramWiseIndexListPerVertexCoordIndex& target,
+                           const Private::DofProgramWiseIndexListPerVertexCoordIndex& source,
+                           const Private::DofProgramWiseIndexListPerVertexCoordIndex& target,
                            pairing_type&& pairing);
             
         private:
diff --git a/Sources/Operators/NonConformInterpolator/FromVertexMatching.hxx b/Sources/Operators/NonConformInterpolator/FromVertexMatching.hxx
index 1a2bf9a2d3..2a097edadf 100644
--- a/Sources/Operators/NonConformInterpolator/FromVertexMatching.hxx
+++ b/Sources/Operators/NonConformInterpolator/FromVertexMatching.hxx
@@ -20,8 +20,8 @@ namespace HappyHeart
         
         template<class InputParameterDataT>
         FromVertexMatching::FromVertexMatching(const InputParameterDataT& input_parameter_data,
-                                               Private::DofProgramWiseIndexListPerVertexCoordIndex& source,
-                                               Private::DofProgramWiseIndexListPerVertexCoordIndex& target,
+                                               const Private::DofProgramWiseIndexListPerVertexCoordIndex& source,
+                                               const Private::DofProgramWiseIndexListPerVertexCoordIndex& target,
                                                pairing_type&& pairing)
         {
             GeometryNS::InterpolationNS::VertexMatching vertex_matching(input_parameter_data);
-- 
GitLab