Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/distribution/reduce_transform_connector.cpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/distribution/reduce_transform_connector.cpp	(revision 1999)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/distribution/reduce_transform_connector.cpp	(revision 2000)
@@ -15,10 +15,11 @@
         break ;
       case EReduction::min :
+        transfer_=&CReduceTransformConnector::transferMin ;
         break ;
       case EReduction::max :
+        transfer_=&CReduceTransformConnector::transferMax ;
         break ;
-      case EReduction::extract :
-        break ;
-      case EReduction::average :
+     case EReduction::average :
+        transfer_=&CReduceTransformConnector::transferAverage ;
         break ;
       default :
Index: XIOS/dev/dev_ym/XIOS_COUPLING/src/distribution/reduce_transform_connector.hpp
===================================================================
--- XIOS/dev/dev_ym/XIOS_COUPLING/src/distribution/reduce_transform_connector.hpp	(revision 1999)
+++ XIOS/dev/dev_ym/XIOS_COUPLING/src/distribution/reduce_transform_connector.hpp	(revision 2000)
@@ -6,4 +6,5 @@
 #include "local_view.hpp"
 #include "reduction_types.hpp"
+#include <algorithm>
 
 
@@ -128,5 +129,238 @@
     }
 
-
+    void transferMin(int repeat, int sizeT, const CArray<double,1>& dataIn, CArray<double,1>& dataOut)
+    {
+      double defaultValue = std::numeric_limits<double>::quiet_NaN();
+
+      int dstSlice = dstSize_*sizeT ;
+      int srcSlice = srcSize_*sizeT ;
+      dataOut.resize(repeat* dstSlice) ;
+      dataOut=0 ;
+           
+      const double* input = dataIn.dataFirst()  ;
+      double* output = dataOut.dataFirst()  ;
+
+      if (detectMissingValue_)
+      {
+        vector<bool> touched(repeat* dstSlice, false) ;
+        int pos=0 ;
+        for(int r=0;r<repeat;r++, input+=srcSlice, output+=dstSlice, pos+=dstSlice)
+        {
+          const double* in = input;
+          double* out = output ;
+          int k=0 ;
+          for(int i=0; i<dstSize_; i++, out+=sizeT, pos+=sizeT)
+          {
+            if (nSrc_[i]==0) for(int l=0; l<sizeT; l++) out[l] = defaultValue ;
+            else 
+            {
+              for(int j=0 ; j<nSrc_[i] ; j++,k++)
+                for(int l=0; l<sizeT; l++) 
+                {
+                  if (! std::isnan(in[connector_[k]*sizeT+l]) ) 
+                  {
+                    if (touched[pos+l]) out[l]=min(out[l],in[connector_[k]*sizeT+l]) ;
+                    else 
+                    {
+                      touched[pos+l] = true ;
+                      out[l] = in[connector_[k]*sizeT+l] ;
+                    }
+                  }
+                }
+            }
+          }
+        }
+
+        output = dataOut.dataFirst()  ;
+        pos=0 ;
+        for(int r=0;r<repeat;r++, input+=srcSlice, output+=dstSlice, pos+=dstSlice)
+        {
+          const double* in = input;
+          double* out = output ;
+          int k=0 ;
+          int pos=0 ;
+          for(int i=0; i<dstSize_; i++, out+=sizeT, pos+=sizeT)
+              for(int j=0 ; j<nSrc_[i] ; j++,k++)
+                for(int l=0; l<sizeT; l++) if (!touched[pos+l]) out[l] = defaultValue ;
+        }
+
+      }
+      else
+      {
+        for(int r=0;r<repeat;r++, input+=srcSlice, output+=dstSlice)
+        {
+          const double* in = input;
+          double* out = output ;
+          int k=0 ;
+          for(int i=0; i<dstSize_; i++, out+=sizeT)
+            if (nSrc_[i]==0)
+              for(int l=0; l<sizeT; l++) out[l] = defaultValue ;
+            else 
+            {
+              for(int j=0 ; j<nSrc_[i] ; j++,k++)
+                for(int l=0; l<sizeT; l++) out[l]=min(out[l],in[connector_[k]*sizeT+l]) ;
+            }
+        }
+      }
+    }
+
+    void transferMax(int repeat, int sizeT, const CArray<double,1>& dataIn, CArray<double,1>& dataOut)
+    {
+      double defaultValue = std::numeric_limits<double>::quiet_NaN();
+
+      int dstSlice = dstSize_*sizeT ;
+      int srcSlice = srcSize_*sizeT ;
+      dataOut.resize(repeat* dstSlice) ;
+      dataOut=0 ;
+           
+      const double* input = dataIn.dataFirst()  ;
+      double* output = dataOut.dataFirst()  ;
+
+      if (detectMissingValue_)
+      {
+        vector<bool> touched(repeat* dstSlice, false) ;
+        int pos=0 ;
+        for(int r=0;r<repeat;r++, input+=srcSlice, output+=dstSlice, pos+=dstSlice)
+        {
+          const double* in = input;
+          double* out = output ;
+          int k=0 ;
+          for(int i=0; i<dstSize_; i++, out+=sizeT, pos+=sizeT)
+          {
+            if (nSrc_[i]==0) for(int l=0; l<sizeT; l++) out[l] = defaultValue ;
+            else 
+            {
+              for(int j=0 ; j<nSrc_[i] ; j++,k++)
+                for(int l=0; l<sizeT; l++) 
+                {
+                  if (! std::isnan(in[connector_[k]*sizeT+l]) ) 
+                  {
+                    if (touched[pos+l]) out[l]=max(out[l],in[connector_[k]*sizeT+l]) ;
+                    else 
+                    {
+                      touched[pos+l] = true ;
+                      out[l] = in[connector_[k]*sizeT+l] ;
+                    }
+                  }
+                }
+            }
+          }
+        }
+
+        output = dataOut.dataFirst()  ;
+        pos=0 ;
+        for(int r=0;r<repeat;r++, input+=srcSlice, output+=dstSlice, pos+=dstSlice)
+        {
+          const double* in = input;
+          double* out = output ;
+          int k=0 ;
+          int pos=0 ;
+          for(int i=0; i<dstSize_; i++, out+=sizeT, pos+=sizeT)
+              for(int j=0 ; j<nSrc_[i] ; j++,k++)
+                for(int l=0; l<sizeT; l++) if (!touched[pos+l]) out[l] = defaultValue ;
+        }
+
+      }
+      else
+      {
+        for(int r=0;r<repeat;r++, input+=srcSlice, output+=dstSlice)
+        {
+          const double* in = input;
+          double* out = output ;
+          int k=0 ;
+          for(int i=0; i<dstSize_; i++, out+=sizeT)
+            if (nSrc_[i]==0)
+              for(int l=0; l<sizeT; l++) out[l] = defaultValue ;
+            else 
+            {
+              for(int j=0 ; j<nSrc_[i] ; j++,k++)
+                for(int l=0; l<sizeT; l++) out[l]=max(out[l],in[connector_[k]*sizeT+l]) ;
+            }
+        }
+      }
+    }
+
+    void transferAverage(int repeat, int sizeT, const CArray<double,1>& dataIn, CArray<double,1>& dataOut)
+    {
+      double defaultValue = std::numeric_limits<double>::quiet_NaN();
+
+      int dstSlice = dstSize_*sizeT ;
+      int srcSlice = srcSize_*sizeT ;
+      dataOut.resize(repeat* dstSlice) ;
+      dataOut=0 ;
+           
+      const double* input = dataIn.dataFirst()  ;
+      double* output = dataOut.dataFirst()  ;
+
+      if (detectMissingValue_)
+      {
+        vector<int> touched(repeat* dstSlice, 0) ;
+        int pos=0 ;
+        for(int r=0;r<repeat;r++, input+=srcSlice, output+=dstSlice, pos+=dstSlice)
+        {
+          const double* in = input;
+          double* out = output ;
+          int k=0 ;
+          for(int i=0; i<dstSize_; i++, out+=sizeT, pos+=sizeT)
+          {
+            if (nSrc_[i]==0) for(int l=0; l<sizeT; l++) out[l] = defaultValue ;
+            else 
+            {
+              for(int j=0 ; j<nSrc_[i] ; j++,k++)
+                for(int l=0; l<sizeT; l++) 
+                {
+                  if (! std::isnan(in[connector_[k]*sizeT+l]) ) 
+                  {
+                    if (touched[pos+l]) out[l] += in[connector_[k]*sizeT+l] ;
+                    else 
+                    {
+                      touched[pos+l]++ ;
+                      out[l] = in[connector_[k]*sizeT+l] ;
+                    }
+                  }
+                }
+            }
+          }
+        }
+
+        output = dataOut.dataFirst()  ;
+        pos=0 ;
+        for(int r=0;r<repeat;r++, input+=srcSlice, output+=dstSlice, pos+=dstSlice)
+        {
+          const double* in = input;
+          double* out = output ;
+          int k=0 ;
+          int pos=0 ;
+          for(int i=0; i<dstSize_; i++, out+=sizeT, pos+=sizeT)
+              for(int j=0 ; j<nSrc_[i] ; j++,k++)
+                for(int l=0; l<sizeT; l++) 
+                  if (touched[pos+l]==0) out[l] = defaultValue ;
+                  else out[l]/=touched[pos+l] ;
+        }
+
+      }
+      else
+      {
+        for(int r=0;r<repeat;r++, input+=srcSlice, output+=dstSlice)
+        {
+          const double* in = input;
+          double* out = output ;
+          int k=0 ;
+          for(int i=0; i<dstSize_; i++, out+=sizeT)
+            if (nSrc_[i]==0)
+              for(int l=0; l<sizeT; l++) out[l] = defaultValue ;
+            else 
+            {
+              for(int j=0 ; j<nSrc_[i] ; j++,k++)
+                for(int l=0; l<sizeT; l++) out[l] += in[connector_[k]*sizeT+l] ;
+            }
+          
+          out = output ;
+          for(int i=0; i<dstSize_; i++, out+=sizeT)
+            if (nSrc_[i]!=0)
+              for(int l=0; l<sizeT; l++) out[l]/=nSrc_[i];
+        }
+      }
+    }
   
   };
