X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FParaMEDMEM%2FOverlapElementLocator.hxx;h=4b37b31bf5ede7dbc3d1b3758cf25cb1a6ccf0e3;hb=9a3f48daeedcc6e06bcc731f1c885d07cb15a1be;hp=493cd7ee47fc7abf60bd84175f899f156a08a238;hpb=93aa2b4d6b1873e76a0226143dcc7f7a577489bf;p=tools%2Fmedcoupling.git diff --git a/src/ParaMEDMEM/OverlapElementLocator.hxx b/src/ParaMEDMEM/OverlapElementLocator.hxx index 493cd7ee4..4b37b31bf 100644 --- a/src/ParaMEDMEM/OverlapElementLocator.hxx +++ b/src/ParaMEDMEM/OverlapElementLocator.hxx @@ -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 @@ -25,14 +25,16 @@ #include "MEDCouplingNatureOfField.hxx" #include "MEDCouplingPointSet.hxx" #include "MEDCouplingMemArray.hxx" -#include "MEDCouplingAutoRefCountObjectPtr.hxx" +#include "MCAuto.hxx" #include #include #include #include -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 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;