Index: XIOS/trunk/src/transformation/axis_algorithm_interpolate.cpp
===================================================================
--- XIOS/trunk/src/transformation/axis_algorithm_interpolate.cpp	(revision 1972)
+++ 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 1972)
+++ 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_;
 
