Index: /XIOS/trunk/src/config/interpolate_axis_attribute.conf
===================================================================
--- /XIOS/trunk/src/config/interpolate_axis_attribute.conf	(revision 1979)
+++ /XIOS/trunk/src/config/interpolate_axis_attribute.conf	(revision 1980)
@@ -3,2 +3,5 @@
 DECLARE_ATTRIBUTE(int, order)
 DECLARE_ATTRIBUTE(StdString, coordinate)
+DECLARE_ATTRIBUTE(StdString, coordinate_src)
+DECLARE_ATTRIBUTE(StdString, coordinate_dst)
+
Index: /XIOS/trunk/src/node/interpolate_axis.cpp
===================================================================
--- /XIOS/trunk/src/node/interpolate_axis.cpp	(revision 1979)
+++ /XIOS/trunk/src/node/interpolate_axis.cpp	(revision 1980)
@@ -41,4 +41,6 @@
   {
     if (this->order.isEmpty()) this->order.setValue(1);
+    if (this->coordinate.isEmpty() && !this->coordinate_src.isEmpty()) this->coordinate.setValue(this->coordinate_src.getValue());
+    if (this->coordinate_src.isEmpty() && !this->coordinate.isEmpty()) this->coordinate_src.setValue(this->coordinate.getValue());
     int order = this->order.getValue();
     if (order >= axisSrc->n_glo.getValue())
@@ -67,4 +69,14 @@
                << "Please define one");
     }
+    
+    if (!this->coordinate_dst.isEmpty())
+    {
+      StdString coordinate = this->coordinate_dst.getValue();
+      if (!CField::has(coordinate))
+        ERROR("CInterpolateAxis::checkValid(CAxis* axisSrc)",
+               << "Coordinate field whose id " << coordinate << "does not exist "
+               << "Please define one");
+    }
+   
   }
 
@@ -72,7 +84,28 @@
   {
     std::vector<StdString> auxInputs;
-    if (!this->coordinate.isEmpty())
+    if (!this->coordinate.isEmpty() && this->coordinate_src.isEmpty())
     {
       StdString coordinate = this->coordinate.getValue();
+      this->coordinate_src.setValue(coordinate);
+      if (!CField::has(coordinate))
+        ERROR("CInterpolateAxis::checkValid(CAxis* axisSrc)",
+               << "Coordinate field whose id " << coordinate << "does not exist "
+               << "Please define one");
+      auxInputs.push_back(coordinate);
+    }
+    if (!this->coordinate_src.isEmpty() || !this->coordinate.isEmpty())
+    {
+      StdString coordinate = !this->coordinate.isEmpty()? this->coordinate.getValue():this->coordinate_src.getValue();
+      this->coordinate.setValue(coordinate);
+      if (!CField::has(coordinate))
+        ERROR("CInterpolateAxis::checkValid(CAxis* axisSrc)",
+               << "Coordinate field whose id " << coordinate << "does not exist "
+               << "Please define one");
+      auxInputs.push_back(coordinate);
+    }
+    
+    if (!this->coordinate_dst.isEmpty())
+    {
+      StdString coordinate = this->coordinate_dst.getValue();
       if (!CField::has(coordinate))
         ERROR("CInterpolateAxis::checkValid(CAxis* axisSrc)",
Index: /XIOS/trunk/src/test/generic_testcase.f90
===================================================================
--- /XIOS/trunk/src/test/generic_testcase.f90	(revision 1979)
+++ /XIOS/trunk/src/test/generic_testcase.f90	(revision 1980)
@@ -1,3 +1,3 @@
-PROGRAM generic_testcase
+PROGRAM generic_testcase 
   USE xios
   USE mod_wait
@@ -161,5 +161,5 @@
     DOUBLE PRECISION, POINTER :: field3D_sub(:,:), other_field3D_sub(:,:)
     DOUBLE PRECISION, POINTER :: field3D_recv(:,:), other_field3D_recv(:,:)
-    DOUBLE PRECISION, POINTER :: pressure(:,:), other_pressure(:,:)
+    DOUBLE PRECISION, POINTER :: pressure(:,:), other_pressure(:,:), pressure_shifted(:,:)
 
     DOUBLE PRECISION, POINTER :: field2D_W(:,:), other_field2D_W(:,:)
@@ -188,5 +188,5 @@
     INTEGER :: ierr      
 
-    LOGICAL :: ok_field2D, ok_field3D, ok_pressure, ok_field2D_sub, ok_field3D_sub,ok_field3D_recv, ok_field3D_send
+    LOGICAL :: ok_field2D, ok_field3D, ok_pressure_shifted, ok_pressure, ok_field2D_sub, ok_field3D_sub,ok_field3D_recv, ok_field3D_send
     LOGICAL :: ok_field_X, ok_field_Y, ok_field_XY, ok_field_Z, ok_field_XYZ, ok_field_XZ, ok_field_YZ
     LOGICAL :: ok_field2D_W, ok_field3D_W, ok_pressure_W, ok_field2D_sub_W, ok_field3D_sub_W,ok_field3D_recv_W, ok_field3D_send_W
@@ -290,6 +290,8 @@
     w=size(ensemble_value)
 
+
     ALLOCATE(field2D(0:xy-1))
     ALLOCATE(field3D(0:xy-1,0:z-1))
+    ALLOCATE(pressure_shifted(0:xy-1,0:z-1))
     ALLOCATE(pressure(0:xy-1,0:z-1))
     ALLOCATE(field3D_recv(0:xy-1,0:z-1))
@@ -364,4 +366,5 @@
             dist=sqrt((lat(k)/90.)**2+(lon(k)/180.)**2) ;
             pressure(i,j)=pressure(i,j)*(1+params%pressure_factor*exp(-(4*dist)**2))
+            pressure_shifted(i,j)=pressure(i,j)+5000
           ENDIF
         ENDIF
@@ -382,7 +385,7 @@
     field_YZW(:,:,0) = field_YZ(:,:)*(1+0.1*ensemble_value(0))
     
-    
     ok_field2D=xios_is_valid_field("field2D") ;
     ok_field3D=xios_is_valid_field("field3D") ;
+    ok_pressure_shifted=xios_is_valid_field("pressure_shifted") ;    
     ok_pressure=xios_is_valid_field("pressure") ;
     ok_field2D_sub=xios_is_valid_field("field2D_sub") ;
@@ -628,6 +631,8 @@
       CALL xios_update_calendar(ts)
 
+
       IF (ok_field2D) CALL xios_send_field("field2D",field2D)
       IF (ok_field3D) CALL xios_send_field("field3D",field3D)
+      IF (ok_pressure_shifted) CALL xios_send_field("pressure_shifted",pressure_shifted)
       IF (ok_pressure) CALL xios_send_field("pressure",pressure)
       IF (ok_field_X) CALL xios_send_field("field_X",field_X)
@@ -2384,5 +2389,5 @@
   END SUBROUTINE get_decomposition
 
-END PROGRAM generic_testcase
-
-
+END PROGRAM generic_testcase 
+
+
Index: /XIOS/trunk/src/test/test_interpolate.f90
===================================================================
--- /XIOS/trunk/src/test/test_interpolate.f90	(revision 1979)
+++ /XIOS/trunk/src/test/test_interpolate.f90	(revision 1980)
@@ -162,5 +162,5 @@
     DOUBLE PRECISION, POINTER :: field3D_sub(:,:), other_field3D_sub(:,:)
     DOUBLE PRECISION, POINTER :: field3D_recv(:,:), other_field3D_recv(:,:)
-    DOUBLE PRECISION, POINTER :: pressure(:,:), other_pressure(:,:)
+    DOUBLE PRECISION, POINTER :: pressure(:,:), other_pressure(:,:), pressure_shifted(:,:)
 
     DOUBLE PRECISION, POINTER :: field2D_W(:,:), other_field2D_W(:,:)
@@ -190,5 +190,5 @@
 
     LOGICAL :: ok_field_in
-    LOGICAL :: ok_field2D, ok_field3D, ok_pressure, ok_field2D_sub, ok_field3D_sub,ok_field3D_recv, ok_field3D_send
+    LOGICAL :: ok_field2D, ok_field3D, ok_pressure_shifted, ok_pressure, ok_field2D_sub, ok_field3D_sub,ok_field3D_recv, ok_field3D_send
     LOGICAL :: ok_field_X, ok_field_Y, ok_field_XY, ok_field_Z, ok_field_XYZ, ok_field_XZ, ok_field_YZ
     LOGICAL :: ok_field2D_W, ok_field3D_W, ok_pressure_W, ok_field2D_sub_W, ok_field3D_sub_W,ok_field3D_recv_W, ok_field3D_send_W
@@ -296,4 +296,5 @@
     ALLOCATE(field2D(0:xy-1))
     ALLOCATE(field3D(0:xy-1,0:z-1))
+    ALLOCATE(pressure_shifted(0:xy-1,0:z-1))
     ALLOCATE(pressure(0:xy-1,0:z-1))
     ALLOCATE(field3D_recv(0:xy-1,0:z-1))
@@ -368,4 +369,5 @@
             dist=sqrt((lat(k)/90.)**2+(lon(k)/180.)**2) ;
             pressure(i,j)=pressure(i,j)*(1+params%pressure_factor*exp(-(4*dist)**2))
+            pressure_shifted(i,j)=pressure(i,j)+5000
           ENDIF
         ENDIF
@@ -386,7 +388,9 @@
     field_YZW(:,:,0) = field_YZ(:,:)*(1+0.1*ensemble_value(0))
     
-    ok_field_in=xios_is_valid_field("field_in") ;
+    ok_field_in=xios_is_valid_field("field_input") ;
+    ok_field_in=.FALSE.
     ok_field2D=xios_is_valid_field("field2D") ;
     ok_field3D=xios_is_valid_field("field3D") ;
+    ok_pressure_shifted=xios_is_valid_field("pressure_shifted") ;    
     ok_pressure=xios_is_valid_field("pressure") ;
     ok_field2D_sub=xios_is_valid_field("field2D_sub") ;
@@ -632,9 +636,10 @@
       CALL xios_update_calendar(ts)
 
-      if (ok_field_in) CALL xios_recv_field("field_in", field_in)
+      if (ok_field_in) CALL xios_recv_field("field_input", field_in)
       if (ok_field_in) CALL xios_send_field("field_out", field_in)
 
       IF (ok_field2D) CALL xios_send_field("field2D",field2D)
       IF (ok_field3D) CALL xios_send_field("field3D",field3D)
+      IF (ok_pressure_shifted) CALL xios_send_field("pressure_shifted",pressure_shifted)
       IF (ok_pressure) CALL xios_send_field("pressure",pressure)
       IF (ok_field_X) CALL xios_send_field("field_X",field_X)
Index: /XIOS/trunk/src/transformation/axis_algorithm_interpolate.cpp
===================================================================
--- /XIOS/trunk/src/transformation/axis_algorithm_interpolate.cpp	(revision 1979)
+++ /XIOS/trunk/src/transformation/axis_algorithm_interpolate.cpp	(revision 1980)
@@ -50,9 +50,10 @@
 
 CAxisAlgorithmInterpolate::CAxisAlgorithmInterpolate(CAxis* axisDestination, CAxis* axisSource, CInterpolateAxis* interpAxis)
-: CAxisAlgorithmTransformation(axisDestination, axisSource), coordinate_(), transPosition_()
+: CAxisAlgorithmTransformation(axisDestination, axisSource), coordinate_(), coordinateDST_(),transPosition_()
 TRY
 {
   interpAxis->checkValid(axisSource);
   order_ = interpAxis->order.getValue();
+  this->idAuxInputs_.clear();
   if (!interpAxis->coordinate.isEmpty())
   {
@@ -61,4 +62,18 @@
     this->idAuxInputs_[0] = coordinate_;
   }
+  else if (!interpAxis->coordinate_src.isEmpty())
+  {
+    coordinate_ = interpAxis->coordinate_src.getValue();
+    this->idAuxInputs_.resize(1);
+    this->idAuxInputs_[0] = coordinate_;
+  }
+  if (!interpAxis->coordinate_dst.isEmpty())
+  {
+    coordinateDST_ = interpAxis->coordinate_dst.getValue();
+    this->idAuxInputs_.resize(this->idAuxInputs_.size()+1);
+    this->idAuxInputs_[this->idAuxInputs_.size()-1] = coordinateDST_;
+  }
+  
+
 }
 CATCH
@@ -71,7 +86,5 @@
 {
   CTimer::get("CAxisAlgorithmInterpolate::computeIndexSourceMapping_").resume() ;
-  CContext* context = CContext::getCurrent();
-  CContextClient* client=context->client;
-  int nbClient = client->clientSize;
+  
   CArray<bool,1>& axisMask = axisSrc_->mask;
   int srcSize  = axisSrc_->n_glo.getValue();
@@ -90,5 +103,5 @@
     XIOSAlgorithms::sortWithIndex<double, CVectorStorage>(recvBuff, indexVec);
     for (int i = 0; i < srcSize; ++i) valueSrc[i] = recvBuff[indexVec[i]];
-    computeInterpolantPoint(valueSrc, indexVec, idx);
+    computeInterpolantPoint(valueSrc, indexVec, dataAuxInputs, idx);
   }
   CTimer::get("CAxisAlgorithmInterpolate::computeIndexSourceMapping_").suspend() ;
@@ -97,11 +110,13 @@
 
 /*!
-  Compute the interpolant points
+  Compute the interpolant points 
   Assume that we have all value of axis source, with these values, need to calculate weight (coeff) of Lagrange polynomial
   \param [in] axisValue all value of axis source
+  \param [in] dataAuxInputs data for setting values of axis destination
   \param [in] tranPos position of axis on a domain
 */
 void CAxisAlgorithmInterpolate::computeInterpolantPoint(const std::vector<double>& axisValue,
                                                         const std::vector<int>& indexVec,
+                                                        const std::vector<CArray<double,1>* >& dataAuxInputs,
                                                         int transPos)
 TRY
@@ -115,4 +130,14 @@
   CArray<double,1>& axisDestValue = axisDest_->value;
   int numValue = axisDestValue.numElements();
+  if(!coordinateDST_.empty())
+  {
+    int nDomPoint = (*dataAuxInputs[0]).numElements()/numValue ;
+    int dst_position_in_data = dataAuxInputs.size()-1;
+    for(int ii=0; ii<numValue; ii++)
+    {
+      axisDestValue(ii) = (*dataAuxInputs[dst_position_in_data])(ii*nDomPoint+transPos);
+    }
+  }
+  
   std::map<int, std::vector<std::pair<int,double> > > interpolatingIndexValues;
 
@@ -172,4 +197,6 @@
 CATCH
 
+
+
 /*!
   Compute weight (coeff) of Lagrange's polynomial
@@ -233,4 +260,5 @@
   int numValue = axisValue.numElements();
 
+
   if (srcSize == numValue)  // Only one client or axis not distributed
   {
@@ -248,5 +276,4 @@
       }
     }
-
   }
   else // Axis distributed
@@ -304,5 +331,11 @@
 TRY
 {
-  if (coordinate_.empty())
+  bool has_src = !coordinate_.empty();
+  bool has_dst = !coordinateDST_.empty();
+  
+  int nb_inputs=dataAuxInputs.size();
+  
+  
+  if (!has_src)
   {
     vecAxisValue.resize(1);
@@ -312,5 +345,5 @@
     this->transformationWeight_.resize(1);
   }
-  else
+  else 
   {
     CField* field = CField::get(coordinate_);
Index: /XIOS/trunk/src/transformation/axis_algorithm_interpolate.hpp
===================================================================
--- /XIOS/trunk/src/transformation/axis_algorithm_interpolate.hpp	(revision 1979)
+++ /XIOS/trunk/src/transformation/axis_algorithm_interpolate.hpp	(revision 1980)
@@ -34,4 +34,5 @@
 
   virtual StdString getName() {return "Axis Trans. Filter \\n Interpolation";}
+  bool isInversed() {return isInversed_;}
 
 protected:
@@ -42,4 +43,6 @@
                             std::vector<double>& recvBuff, std::vector<int>& indexVec);
   void computeInterpolantPoint(const std::vector<double>& recvBuff, const std::vector<int>&, int transPos = 0);
+  void computeInterpolantPoint(const std::vector<double>& recvBuff, const std::vector<int>&, 
+                               const std::vector<CArray<double,1>* >& dataAuxInputs, int transPos = 0);
   void computeWeightedValueAndMapping(const std::map<int, std::vector<std::pair<int,double> > >& interpolatingIndexValues, int transPos = 0);
   void fillInAxisValue(std::vector<CArray<double,1> >& vecAxisValue,
@@ -50,4 +53,6 @@
   int order_;
   StdString coordinate_;
+  StdString coordinateDST_;
+  bool isInversed_;
   std::vector<std::vector<int> > transPosition_;
 
