Index: XIOS/dev/XIOS_DEV_CMIP6/src/transformation/axis_algorithm_reduce_domain.cpp
===================================================================
--- XIOS/dev/XIOS_DEV_CMIP6/src/transformation/axis_algorithm_reduce_domain.cpp	(revision 1298)
+++ XIOS/dev/XIOS_DEV_CMIP6/src/transformation/axis_algorithm_reduce_domain.cpp	(revision 1299)
@@ -71,4 +71,5 @@
   dir_ = (CReduceDomainToAxis::direction_attr::iDir == algo->direction)  ? iDir : jDir;
   reduction_ = CReductionAlgorithm::createOperation(CReductionAlgorithm::ReductionOperations[op]);
+  local = algo->local ;
 }
 
@@ -104,14 +105,33 @@
   if (iDir == dir_)
   {
-    int nbAxisIdx = axisDstIndex.numElements();
-    for (int idxAxis = 0; idxAxis < nbAxisIdx; ++idxAxis)
+    if (local)
     {
-      int globalAxisIdx = axisDstIndex(idxAxis);
-      transMap[globalAxisIdx].resize(ni_glo);
-      transWeight[globalAxisIdx].resize(ni_glo);
-      for (int idx = 0; idx < ni_glo; ++idx)
+      const CArray<int, 1>& i_index = domainSrc_-> i_index.getValue() ;
+      const CArray<int, 1>& j_index = domainSrc_-> j_index.getValue() ;
+      const CArray<bool,1>& localMask = domainSrc_-> localMask ;
+      int nbDomainIdx = i_index.numElements();
+      
+      for (int idxDomain = 0; idxDomain < nbDomainIdx; ++idxDomain)
       {
-        transMap[globalAxisIdx][idx] = globalAxisIdx * ni_glo + idx;
-        transWeight[globalAxisIdx][idx] = 1.0;
+        if (localMask(idxDomain))
+        { 
+          transMap[j_index(idxDomain)].push_back(j_index(idxDomain)* ni_glo + i_index(idxDomain));
+          transWeight[j_index(idxDomain)].push_back(1.0) ;
+        }
+      }
+    }
+    else
+    {
+      int nbAxisIdx = axisDstIndex.numElements();
+      for (int idxAxis = 0; idxAxis < nbAxisIdx; ++idxAxis)
+      {
+        int globalAxisIdx = axisDstIndex(idxAxis);
+        transMap[globalAxisIdx].resize(ni_glo);
+        transWeight[globalAxisIdx].resize(ni_glo);
+        for (int idx = 0; idx < ni_glo; ++idx)
+        {
+          transMap[globalAxisIdx][idx] = globalAxisIdx * ni_glo + idx;
+          transWeight[globalAxisIdx][idx] = 1.0;
+        }
       }
     }
@@ -120,13 +140,32 @@
   {
     int nbAxisIdx = axisDstIndex.numElements();
-    for (int idxAxis = 0; idxAxis < nbAxisIdx; ++idxAxis)
+    if (local)
     {
-      int globalAxisIdx = axisDstIndex(idxAxis);
-      transMap[globalAxisIdx].resize(nj_glo);
-      transWeight[globalAxisIdx].resize(nj_glo);
-      for (int idx = 0; idx < nj_glo; ++idx)
+      const CArray<int, 1>& i_index = domainSrc_-> i_index.getValue() ;
+      const CArray<int, 1>& j_index = domainSrc_-> j_index.getValue() ;
+      const CArray<bool,1>& localMask = domainSrc_-> localMask ;
+      int nbDomainIdx = i_index.numElements();
+      
+      for (int idxDomain = 0; idxDomain < nbDomainIdx; ++idxDomain)
       {
-        transMap[globalAxisIdx][idx] = globalAxisIdx + ni_glo*idx;
-        transWeight[globalAxisIdx][idx] = 1.0;
+        if (localMask(idxDomain))
+        { 
+          transMap[i_index(idxDomain)].push_back(j_index(idxDomain)* ni_glo + i_index(idxDomain));
+          transWeight[i_index(idxDomain)].push_back(1.0) ;
+        }
+      }
+    }
+    else
+    {
+      for (int idxAxis = 0; idxAxis < nbAxisIdx; ++idxAxis)
+      {
+        int globalAxisIdx = axisDstIndex(idxAxis);
+        transMap[globalAxisIdx].resize(nj_glo);
+        transWeight[globalAxisIdx].resize(nj_glo);
+        for (int idx = 0; idx < nj_glo; ++idx)
+        {
+          transMap[globalAxisIdx][idx] = globalAxisIdx + ni_glo*idx;
+          transWeight[globalAxisIdx][idx] = 1.0;
+        }
       }
     }
Index: XIOS/dev/XIOS_DEV_CMIP6/src/transformation/axis_algorithm_reduce_domain.hpp
===================================================================
--- XIOS/dev/XIOS_DEV_CMIP6/src/transformation/axis_algorithm_reduce_domain.hpp	(revision 1298)
+++ XIOS/dev/XIOS_DEV_CMIP6/src/transformation/axis_algorithm_reduce_domain.hpp	(revision 1299)
@@ -46,6 +46,8 @@
     jDir = 2
   };
-
+  
   ReduceDirection dir_;
+  bool local ;
+  
 protected:
   void computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs); 
