Salome HOME
Intersec bug fix: when intersecting nodes are merged, they were not properly
[tools/medcoupling.git] / src / ParaMEDMEM / OverlapElementLocator.hxx
index 493cd7ee47fc7abf60bd84175f899f156a08a238..4b37b31bf5ede7dbc3d1b3758cf25cb1a6ccf0e3 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2015  CEA/DEN, EDF R&D
+// Copyright (C) 2007-2016  CEA/DEN, EDF R&D
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 #include "MEDCouplingNatureOfField.hxx"
 #include "MEDCouplingPointSet.hxx"
 #include "MEDCouplingMemArray.hxx"
-#include "MEDCouplingAutoRefCountObjectPtr.hxx"
+#include "MCAuto.hxx"
 
 #include <mpi.h>
 #include <vector>
 #include <map>
 #include <set>
 
-namespace ParaMEDMEM
+//#define DEC_DEBUG
+
+namespace MEDCoupling
 {
   class ParaFIELD;
   class ProcessorGroup;
@@ -43,7 +45,8 @@ namespace ParaMEDMEM
   class OverlapElementLocator : public INTERP_KERNEL::InterpolationOptions
   {
   public:
-    OverlapElementLocator(const ParaFIELD *sourceField, const ParaFIELD *targetField, const ProcessorGroup& group,double epsAbs);
+    OverlapElementLocator(const ParaFIELD *sourceField, const ParaFIELD *targetField, const ProcessorGroup& group,
+                          double epsAbs, int workSharingAlgo);
     virtual ~OverlapElementLocator();
     const MPI_Comm *getCommunicator() const;
     void exchangeMeshes(OverlapInterpolationMatrix& matrix);
@@ -56,16 +59,20 @@ namespace ParaMEDMEM
     const MEDCouplingPointSet *getTargetMesh(int procId) const;
     const DataArrayInt *getTargetIds(int procId) const;
     bool isInMyTodoList(int i, int j) const;
+    void debugPrintWorkSharing(std::ostream & ostr) const;
   private:
-    void computeBoundingBoxesAndTodoList();
+    void computeBoundingBoxesAndInteractionList();
+    void computeTodoList_original();
+    void computeTodoList_new(bool revertIter);
+    void fillProcToSend();
     bool intersectsBoundingBox(int i, int j) const;
     void sendLocalMeshTo(int procId, bool sourceOrTarget, OverlapInterpolationMatrix& matrix) const;
     void receiveRemoteMeshFrom(int procId, bool sourceOrTarget);
     void sendMesh(int procId, const MEDCouplingPointSet *mesh, const DataArrayInt *idsToSend) const;
     void receiveMesh(int procId, MEDCouplingPointSet* &mesh, DataArrayInt *&ids) const;
   private:
-    typedef MEDCouplingAutoRefCountObjectPtr< MEDCouplingPointSet >  AutoMCPointSet;
-    typedef MEDCouplingAutoRefCountObjectPtr< DataArrayInt >         AutoDAInt;
+    typedef MCAuto< MEDCouplingPointSet >  AutoMCPointSet;
+    typedef MCAuto< DataArrayInt >         AutoDAInt;
     typedef std::pair<int,bool>  Proc_SrcOrTgt;  // a key indicating a proc ID and whether the data is for source mesh/field or target mesh/field
 
     static const int START_TAG_MESH_XCH;
@@ -78,9 +85,11 @@ namespace ParaMEDMEM
     MEDCouplingPointSet *_local_target_mesh;
 
     /*! of size _group.size(). Contains for each source proc i, the ids of proc j the targets interact with.
-        This vector is common for all procs in _group. */
+        This vector is common for all procs in _group. This is the full list of jobs to do the interp. */
     std::vector< std::vector< int > > _proc_pairs;
-    //! list of interpolation couples to be done by this proc only. This is a simple extraction of the member _pairsToBeDonePerProc
+    //! todo lists per proc
+    std::vector< std::vector< ProcCouple > > _all_todo_lists;
+    //! list of interpolation couples to be done by this proc only. This is a simple extraction of the member above _all_todo_lists
     std::vector< ProcCouple > _to_do_list;
     //! list of procs the local proc will have to send mesh data to:
     std::vector< Proc_SrcOrTgt > _procs_to_send_mesh;