Index: XIOS/dev/XIOS_DEV_CMIP6/src/transformation/generic_algorithm_transformation.cpp
===================================================================
--- XIOS/dev/XIOS_DEV_CMIP6/src/transformation/generic_algorithm_transformation.cpp	(revision 1297)
+++ XIOS/dev/XIOS_DEV_CMIP6/src/transformation/generic_algorithm_transformation.cpp	(revision 1298)
@@ -19,5 +19,5 @@
  : transformationMapping_(), transformationWeight_(), transformationPosition_(),
    idAuxInputs_(), type_(ELEMENT_NO_MODIFICATION_WITH_DATA), indexElementSrc_(),
-   computedProcSrcNonTransformedElement_(false)
+   computedProcSrcNonTransformedElement_(false), eliminateRedondantSrc_(true)
 {
 }
@@ -199,4 +199,6 @@
   computeGlobalIndexOnProc = (0 < recvValue);
 
+  CClientClientDHTInt::Index2VectorInfoTypeMap globalIndexOfTransformedElementOnProc;
+  
   if (computeGlobalIndexOnProc || !computedProcSrcNonTransformedElement_)
   {    
@@ -204,5 +206,5 @@
     if (globalElementIndexOnProc_.empty())
       globalElementIndexOnProc_.resize(axisDomainDstOrder.numElements());
-    CClientClientDHTInt::Index2VectorInfoTypeMap globalIndexOfTransformedElementOnProc;  
+    
     for (idx = 0; idx < axisDomainDstOrder.numElements(); ++idx)
     {
@@ -318,6 +320,11 @@
         {          
           tmpCounter.insert(srcIndex[idx]);
+
+           std::vector<int>& srcProc = globalIndexOfTransformedElementOnProc[srcIndex[idx]];
+           for (int j = 0; j < srcProc.size(); ++j)
+              globalElementIndexOnProc_[elementPositionInGrid][srcProc[j]].push_back(srcIndex[idx]);
+/*          
           for (int j = 0; j < procContainSrcElementIdx_.size(); ++j)
-            globalElementIndexOnProc_[elementPositionInGrid][procContainSrcElementIdx_[j]].push_back(srcIndex[idx]);
+            globalElementIndexOnProc_[elementPositionInGrid][procContainSrcElementIdx_[j]].push_back(srcIndex[idx]);*/
         }
       }
@@ -513,33 +520,35 @@
   // eliminate redondant global src point owned by differrent processes.
   // Avoid as possible to tranfer data from an other process if the src point is also owned by current process 
-
-   int rankSrc ;
-   size_t globalSrcIndex ;
-   size_t globalDstIndex ;
-   double weight ;
+      int rankSrc ;
+      size_t globalSrcIndex ;
+      size_t globalDstIndex ;
+      double weight ;
  
-   SourceDestinationIndexMap::iterator rankIt,rankIte ;
-   boost::unordered_map<size_t, std::vector<std::pair<size_t,double> > >::iterator globalSrcIndexIt, globalSrcIndexIte ;
-   std::vector<std::pair<size_t,double> >::iterator vectIt,vectIte ;
+      SourceDestinationIndexMap::iterator rankIt,rankIte ;
+      boost::unordered_map<size_t, std::vector<std::pair<size_t,double> > >::iterator globalSrcIndexIt, globalSrcIndexIte ;
+      std::vector<std::pair<size_t,double> >::iterator vectIt,vectIte ;
    
-   rankIt=globaIndexWeightFromSrcToDst_tmp.begin() ; rankIte=globaIndexWeightFromSrcToDst_tmp.end() ;
-   for(;rankIt!=rankIte;++rankIt)
-   {
-     rankSrc = rankIt->first ;
-     globalSrcIndexIt = rankIt->second.begin() ; globalSrcIndexIte = rankIte->second.end() ;
-     for(;globalSrcIndexIt!=globalSrcIndexIte;++globalSrcIndexIt)
-     {
-       globalSrcIndex = globalSrcIndexIt->first ;
-       vectIt = globalSrcIndexIt->second.begin() ; vectIte = globalSrcIndexIt->second.end() ;
-       for(vectIt; vectIt!=vectIte; vectIt++)
-       {
-         globalDstIndex = vectIt->first ;
-         weight = vectIt->second ;
-         if (rankMap[make_pair(globalSrcIndex,globalDstIndex)] == rankSrc)  
-           globaIndexWeightFromSrcToDst[rankSrc][globalSrcIndex].push_back(make_pair(globalDstIndex,weight)) ;
+      rankIt=globaIndexWeightFromSrcToDst_tmp.begin() ; rankIte=globaIndexWeightFromSrcToDst_tmp.end() ;
+      for(;rankIt!=rankIte;++rankIt)
+      {
+        rankSrc = rankIt->first ;
+        globalSrcIndexIt = rankIt->second.begin() ; globalSrcIndexIte = rankIt->second.end() ;
+        for(;globalSrcIndexIt!=globalSrcIndexIte;++globalSrcIndexIt)
+        { 
+          globalSrcIndex = globalSrcIndexIt->first ;
+          vectIt = globalSrcIndexIt->second.begin() ; vectIte = globalSrcIndexIt->second.end() ;
+          for(vectIt; vectIt!=vectIte; vectIt++)
+          {
+            globalDstIndex = vectIt->first ;
+            weight = vectIt->second ;
+            if (eliminateRedondantSrc_)
+            {
+              if (rankMap[make_pair(globalSrcIndex,globalDstIndex)] == rankSrc)  
+                globaIndexWeightFromSrcToDst[rankSrc][globalSrcIndex].push_back(make_pair(globalDstIndex,weight)) ;
+            }
+            else globaIndexWeightFromSrcToDst[rankSrc][globalSrcIndex].push_back(make_pair(globalDstIndex,weight)) ;
+         }
        }
      }
-   }
-
 
 }
Index: XIOS/dev/XIOS_DEV_CMIP6/src/transformation/generic_algorithm_transformation.hpp
===================================================================
--- XIOS/dev/XIOS_DEV_CMIP6/src/transformation/generic_algorithm_transformation.hpp	(revision 1297)
+++ XIOS/dev/XIOS_DEV_CMIP6/src/transformation/generic_algorithm_transformation.hpp	(revision 1298)
@@ -150,4 +150,7 @@
   std::map<int, int> elementPositionInGridSrc2AxisPosition_, elementPositionInGridSrc2DomainPosition_, elementPositionInGridSrc2ScalarPosition_;
   std::map<int, int> elementPositionInGridDst2AxisPosition_, elementPositionInGridDst2DomainPosition_, elementPositionInGridDst2ScalarPosition_;
+
+  bool eliminateRedondantSrc_ ; // flag to indicate if the transformation must select only one global source point for all proc.
+                               // In this case it will choose preferentially the current process 
 };
 
