Index: /XIOS/trunk/src/config/field_attribute.conf
===================================================================
--- /XIOS/trunk/src/config/field_attribute.conf	(revision 592)
+++ /XIOS/trunk/src/config/field_attribute.conf	(revision 593)
@@ -13,4 +13,5 @@
 
 DECLARE_ATTRIBUTE(bool,      enabled)
+DECLARE_ATTRIBUTE(bool,      read_access)
 
 DECLARE_ATTRIBUTE(StdString, domain_ref)
Index: /XIOS/trunk/src/interface/c/icdata.cpp
===================================================================
--- /XIOS/trunk/src/interface/c/icdata.cpp	(revision 592)
+++ /XIOS/trunk/src/interface/c/icdata.cpp	(revision 593)
@@ -36,5 +36,5 @@
    typedef enum { NETCDF4 = 0 } XFileType;
 
-   typedef xios::CContext * XContextPtr;
+   typedef xios::CContext* XContextPtr;
 
    // -------------------- Traitement des donnÃ©es ------------------------------
@@ -52,80 +52,80 @@
    }
 
-   void cxios_init_client(const char * client_id , int len_client_id, MPI_Fint* f_local_comm, MPI_Fint* f_return_comm )
+   void cxios_init_client(const char* client_id , int len_client_id, MPI_Fint* f_local_comm, MPI_Fint* f_return_comm )
    {
       std::string str;
-      MPI_Comm local_comm ;
-      MPI_Comm return_comm ;
+      MPI_Comm local_comm;
+      MPI_Comm return_comm;
 
       if (!cstr2string(client_id, len_client_id, str)) return;
 
-      int initialized ;
-      MPI_Initialized(&initialized) ;
-      if (initialized) local_comm=MPI_Comm_f2c(*f_local_comm) ;
-      else local_comm=MPI_COMM_NULL ;
-      CXios::initClientSide(str,local_comm,return_comm);
-      *f_return_comm=MPI_Comm_c2f(return_comm) ;
-      CTimer::get("XIOS init").suspend() ;
-      CTimer::get("XIOS").suspend() ;
-   }
-
-   void cxios_context_initialize(const char * context_id , int len_context_id, MPI_Fint* f_comm)
+      int initialized;
+      MPI_Initialized(&initialized);
+      if (initialized) local_comm=MPI_Comm_f2c(*f_local_comm);
+      else local_comm=MPI_COMM_NULL;
+      CXios::initClientSide(str, local_comm, return_comm);
+      *f_return_comm=MPI_Comm_c2f(return_comm);
+      CTimer::get("XIOS init").suspend();
+      CTimer::get("XIOS").suspend();
+   }
+
+   void cxios_context_initialize(const char* context_id , int len_context_id, MPI_Fint* f_comm)
    {
      std::string str;
-     MPI_Comm comm ;
+     MPI_Comm comm;
 
      if (!cstr2string(context_id, len_context_id, str)) return;
-     CTimer::get("XIOS").resume() ;
-     CTimer::get("XIOS init context").resume() ;
-     comm=MPI_Comm_f2c(*f_comm) ;
-     CClient::registerContext(str,comm) ;
-     CTimer::get("XIOS init context").suspend() ;
-     CTimer::get("XIOS").suspend() ;
-   }
-
-   void cxios_context_is_initialized(const char * context_id , int len_context_id, bool* initialized)
+     CTimer::get("XIOS").resume();
+     CTimer::get("XIOS init context").resume();
+     comm=MPI_Comm_f2c(*f_comm);
+     CClient::registerContext(str, comm);
+     CTimer::get("XIOS init context").suspend();
+     CTimer::get("XIOS").suspend();
+   }
+
+   void cxios_context_is_initialized(const char* context_id , int len_context_id, bool* initialized)
    {
      std::string str;
 
      if (!cstr2string(context_id, len_context_id, str)) return;
-     CTimer::get("XIOS").resume() ;
-     CContext* context = CContext::get(str,str) ;
-     *initialized=context->isInitialized() ;
-     CTimer::get("XIOS").suspend() ;
+     CTimer::get("XIOS").resume();
+     CContext* context = CContext::get(str, str);
+     *initialized=context->isInitialized();
+     CTimer::get("XIOS").suspend();
    }
 
     void cxios_context_close_definition()
    {
-     CTimer::get("XIOS").resume() ;
-     CTimer::get("XIOS close definition").resume() ;
-     CContext* context = CContext::getCurrent() ;
-     context->closeDefinition() ;
-     CTimer::get("XIOS close definition").suspend() ;
-     CTimer::get("XIOS").suspend() ;
+     CTimer::get("XIOS").resume();
+     CTimer::get("XIOS close definition").resume();
+     CContext* context = CContext::getCurrent();
+     context->closeDefinition();
+     CTimer::get("XIOS close definition").suspend();
+     CTimer::get("XIOS").suspend();
    }
 
    void cxios_context_finalize()
    {
-     CTimer::get("XIOS").resume() ;
-     CTimer::get("XIOS context finalize").resume() ;
-     CContext* context = CContext::getCurrent() ;
-     context->finalize() ;
-     CTimer::get("XIOS context finalize").suspend() ;
-     CTimer::get("XIOS").suspend() ;
+     CTimer::get("XIOS").resume();
+     CTimer::get("XIOS context finalize").resume();
+     CContext* context = CContext::getCurrent();
+     context->finalize();
+     CTimer::get("XIOS context finalize").suspend();
+     CTimer::get("XIOS").suspend();
    }
 
    void cxios_finalize()
    {
-     CTimer::get("XIOS").resume() ;
-     CTimer::get("XIOS finalize").resume() ;
-     CXios::clientFinalize() ;
+     CTimer::get("XIOS").resume();
+     CTimer::get("XIOS finalize").resume();
+     CXios::clientFinalize();
    }
 
    void cxios_solve_inheritance()
    {
-     CTimer::get("XIOS").resume() ;
-     CContext* context = CContext::getCurrent() ;
-     context->solveAllInheritance(false) ;
-     CTimer::get("XIOS").suspend() ;
+     CTimer::get("XIOS").resume();
+     CContext* context = CContext::getCurrent();
+     context->solveAllInheritance(false);
+     CTimer::get("XIOS").suspend();
    }
 
@@ -140,5 +140,5 @@
     * \param isVarExisted [in/out] Verify whether variable with varId exists
    */
-   void cxios_get_variable_data_k8(const char * varId, int varIdSize, double * data, bool * isVarExisted)
+   void cxios_get_variable_data_k8(const char* varId, int varIdSize, double* data, bool* isVarExisted)
    {
       std::string varIdStr;
@@ -153,12 +153,12 @@
       if (*isVarExisted)
       {
-        *data = CVariable::get(context->getId(),varIdStr)->getData<double>();
-      }
-
-      CTimer::get("XIOS get variable data").suspend() ;
-      CTimer::get("XIOS").suspend() ;
-   }
-
-   void cxios_get_variable_data_k4(const char * varId, int varIdSize, float * data, bool * isVarExisted)
+        *data = CVariable::get(context->getId(), varIdStr)->getData<double>();
+      }
+
+      CTimer::get("XIOS get variable data").suspend();
+      CTimer::get("XIOS").suspend();
+   }
+
+   void cxios_get_variable_data_k4(const char* varId, int varIdSize, float* data, bool* isVarExisted)
    {
       std::string varIdStr;
@@ -173,12 +173,12 @@
       if (*isVarExisted)
       {
-        *data = CVariable::get(context->getId(),varIdStr)->getData<float>();
-      }
-
-      CTimer::get("XIOS get variable data").suspend() ;
-      CTimer::get("XIOS").suspend() ;
-   }
-
-   void cxios_get_variable_data_int(const char * varId, int varIdSize, int * data, bool * isVarExisted)
+        *data = CVariable::get(context->getId(), varIdStr)->getData<float>();
+      }
+
+      CTimer::get("XIOS get variable data").suspend();
+      CTimer::get("XIOS").suspend();
+   }
+
+   void cxios_get_variable_data_int(const char* varId, int varIdSize, int* data, bool* isVarExisted)
    {
       std::string varIdStr;
@@ -193,12 +193,12 @@
       if (*isVarExisted)
       {
-        *data = CVariable::get(context->getId(),varIdStr)->getData<int>();
-      }
-
-      CTimer::get("XIOS get variable data").suspend() ;
-      CTimer::get("XIOS").suspend() ;
-   }
-
-   void cxios_get_variable_data_logic(const char * varId, int varIdSize, bool * data, bool * isVarExisted)
+        *data = CVariable::get(context->getId(), varIdStr)->getData<int>();
+      }
+
+      CTimer::get("XIOS get variable data").suspend();
+      CTimer::get("XIOS").suspend();
+   }
+
+   void cxios_get_variable_data_logic(const char* varId, int varIdSize, bool* data, bool* isVarExisted)
    {
       std::string varIdStr;
@@ -213,12 +213,12 @@
       if (*isVarExisted)
       {
-        *data = CVariable::get(context->getId(),varIdStr)->getData<bool>();
-      }
-
-      CTimer::get("XIOS get variable data").suspend() ;
-      CTimer::get("XIOS").suspend() ;
-   }
-
-   void cxios_get_variable_data_char(const char * varId, int varIdSize, char * data, int dataSizeIn, bool * isVarExisted)
+        *data = CVariable::get(context->getId(), varIdStr)->getData<bool>();
+      }
+
+      CTimer::get("XIOS get variable data").suspend();
+      CTimer::get("XIOS").suspend();
+   }
+
+   void cxios_get_variable_data_char(const char* varId, int varIdSize, char* data, int dataSizeIn, bool* isVarExisted)
    {
       std::string varIdStr;
@@ -233,10 +233,10 @@
       if (*isVarExisted)
       {
-        int dataSizeOut = CVariable::get(context->getId(),varIdStr)->getData<string>().length();
-        strncpy(data, CVariable::get(context->getId(),varIdStr)->getData<string>().c_str(), std::min(dataSizeIn, dataSizeOut));
-      }
-
-      CTimer::get("XIOS get variable data").suspend() ;
-      CTimer::get("XIOS").suspend() ;
+        int dataSizeOut = CVariable::get(context->getId(), varIdStr)->getData<string>().length();
+        strncpy(data, CVariable::get(context->getId(), varIdStr)->getData<string>().c_str(), std::min(dataSizeIn, dataSizeOut));
+      }
+
+      CTimer::get("XIOS get variable data").suspend();
+      CTimer::get("XIOS").suspend();
    }
 
@@ -251,5 +251,5 @@
     * \param isVarExisted [in/out] Verify whether variable with varId exists
    */
-   void cxios_set_variable_data_k8(const char * varId, int varIdSize, double data, bool * isVarExisted)
+   void cxios_set_variable_data_k8(const char* varId, int varIdSize, double data, bool* isVarExisted)
    {
       std::string varIdStr;
@@ -259,18 +259,18 @@
       CTimer::get("XIOS set variable data").resume();
 
-      CContext* context = CContext::getCurrent() ;
-      *isVarExisted = CVariable::has(context->getId(), varIdStr);
-
-      if (*isVarExisted)
-      {
-        CVariable::get(context->getId(),varIdStr)->setData<double>(data);
-        //CVariable::get(context->getId(),varIdStr)->sendValue();
-      }
-
-      CTimer::get("XIOS set variable data").suspend() ;
-      CTimer::get("XIOS").suspend() ;
-   }
-
-   void cxios_set_variable_data_k4(const char * varId, int varIdSize, float data, bool * isVarExisted)
+      CContext* context = CContext::getCurrent();
+      *isVarExisted = CVariable::has(context->getId(), varIdStr);
+
+      if (*isVarExisted)
+      {
+        CVariable::get(context->getId(), varIdStr)->setData<double>(data);
+        //CVariable::get(context->getId(), varIdStr)->sendValue();
+      }
+
+      CTimer::get("XIOS set variable data").suspend();
+      CTimer::get("XIOS").suspend();
+   }
+
+   void cxios_set_variable_data_k4(const char* varId, int varIdSize, float data, bool* isVarExisted)
    {
       std::string varIdStr;
@@ -280,18 +280,18 @@
       CTimer::get("XIOS set variable data").resume();
 
-      CContext* context = CContext::getCurrent() ;
-      *isVarExisted = CVariable::has(context->getId(), varIdStr);
-
-      if (*isVarExisted)
-      {
-        CVariable::get(context->getId(),varIdStr)->setData<float>(data);
-        //CVariable::get(context->getId(),varIdStr)->sendValue();
-      }
-
-      CTimer::get("XIOS set variable data").suspend() ;
-      CTimer::get("XIOS").suspend() ;
-   }
-
-   void cxios_set_variable_data_int(const char * varId, int varIdSize, int data, bool * isVarExisted)
+      CContext* context = CContext::getCurrent();
+      *isVarExisted = CVariable::has(context->getId(), varIdStr);
+
+      if (*isVarExisted)
+      {
+        CVariable::get(context->getId(), varIdStr)->setData<float>(data);
+        //CVariable::get(context->getId(), varIdStr)->sendValue();
+      }
+
+      CTimer::get("XIOS set variable data").suspend();
+      CTimer::get("XIOS").suspend();
+   }
+
+   void cxios_set_variable_data_int(const char* varId, int varIdSize, int data, bool* isVarExisted)
    {
       std::string varIdStr;
@@ -301,19 +301,19 @@
       CTimer::get("XIOS set variable data").resume();
 
-      CContext* context = CContext::getCurrent() ;
-      *isVarExisted = CVariable::has(context->getId(), varIdStr);
-
-      if (*isVarExisted)
-      {
-        CVariable::get(context->getId(),varIdStr)->setData<int>(data);
-        //CVariable::get(context->getId(),varIdStr)->sendValue();
-      }
-
-
-      CTimer::get("XIOS set variable data").suspend() ;
-      CTimer::get("XIOS").suspend() ;
-   }
-
-   void cxios_set_variable_data_logic(const char * varId, int varIdSize, bool data, bool * isVarExisted)
+      CContext* context = CContext::getCurrent();
+      *isVarExisted = CVariable::has(context->getId(), varIdStr);
+
+      if (*isVarExisted)
+      {
+        CVariable::get(context->getId(), varIdStr)->setData<int>(data);
+        //CVariable::get(context->getId(), varIdStr)->sendValue();
+      }
+
+
+      CTimer::get("XIOS set variable data").suspend();
+      CTimer::get("XIOS").suspend();
+   }
+
+   void cxios_set_variable_data_logic(const char* varId, int varIdSize, bool data, bool* isVarExisted)
    {
       std::string varIdStr;
@@ -323,18 +323,18 @@
       CTimer::get("XIOS set variable data").resume();
 
-      CContext* context = CContext::getCurrent() ;
-      *isVarExisted = CVariable::has(context->getId(), varIdStr);
-
-      if (*isVarExisted)
-      {
-        CVariable::get(context->getId(),varIdStr)->setData<bool>(data);
-        //CVariable::get(context->getId(),varIdStr)->sendValue();
-      }
-
-      CTimer::get("XIOS set variable data").suspend() ;
-      CTimer::get("XIOS").suspend() ;
-   }
-
-   void cxios_set_variable_data_char(const char * varId, int varIdSize, const char * data, int dataSizeIn, bool * isVarExisted)
+      CContext* context = CContext::getCurrent();
+      *isVarExisted = CVariable::has(context->getId(), varIdStr);
+
+      if (*isVarExisted)
+      {
+        CVariable::get(context->getId(), varIdStr)->setData<bool>(data);
+        //CVariable::get(context->getId(), varIdStr)->sendValue();
+      }
+
+      CTimer::get("XIOS set variable data").suspend();
+      CTimer::get("XIOS").suspend();
+   }
+
+   void cxios_set_variable_data_char(const char* varId, int varIdSize, const char* data, int dataSizeIn, bool* isVarExisted)
    {
       std::string varIdStr, dataStr;
@@ -349,15 +349,15 @@
       CTimer::get("XIOS set variable data").resume();
 
-      CContext* context = CContext::getCurrent() ;
-      *isVarExisted = CVariable::has(context->getId(), varIdStr);
-
-      if (*isVarExisted)
-      {
-        CVariable::get(context->getId(),varIdStr)->setData<string>(dataStr);
-        //CVariable::get(context->getId(),varIdStr)->sendValue();
-      }
-
-      CTimer::get("XIOS set variable data").suspend() ;
-      CTimer::get("XIOS").suspend() ;
+      CContext* context = CContext::getCurrent();
+      *isVarExisted = CVariable::has(context->getId(), varIdStr);
+
+      if (*isVarExisted)
+      {
+        CVariable::get(context->getId(), varIdStr)->setData<string>(dataStr);
+        //CVariable::get(context->getId(), varIdStr)->sendValue();
+      }
+
+      CTimer::get("XIOS set variable data").suspend();
+      CTimer::get("XIOS").suspend();
    }
 
@@ -365,140 +365,265 @@
    // ---------------------- Ecriture des donnÃ©es ------------------------------
 
-   void cxios_write_data_k80(const char * fieldid, int fieldid_size, double * data_k8, int data_Xsize)
-   {
-      std::string fieldid_str;
-      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return;
-
-      CTimer::get("XIOS").resume() ;
-      CTimer::get("XIOS send field").resume() ;
-      CContext* context = CContext::getCurrent() ;
-      if (!context->hasServer) context->client->checkBuffers() ;
-      CArray<double,(StdSize)1> data(data_k8,shape(data_Xsize),neverDeleteData) ;
-      CField::get(fieldid_str)->setData(data) ;
-      CTimer::get("XIOS send field").suspend() ;
-      CTimer::get("XIOS").suspend() ;
-   }
-
-   void cxios_write_data_k40(const char * fieldid, int fieldid_size, float * data_k4, int data_Xsize)
-   {
-      std::string fieldid_str;
-     if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return;
-
-      CTimer::get("XIOS").resume() ;
-      CTimer::get("XIOS send field").resume() ;
-      CContext* context = CContext::getCurrent() ;
-      if (!context->hasServer) context->client->checkBuffers() ;
-
-      CArray<float,1> data_tmp(data_k4,shape(data_Xsize),neverDeleteData) ;
-      CArray<double,1> data(data_Xsize) ;
-      data=data_tmp ;
-      CField::get(fieldid_str)->setData(data) ;
-      CTimer::get("XIOS send field").suspend() ;
-      CTimer::get("XIOS").suspend() ;
-   }
-
-   void cxios_write_data_k81(const char * fieldid, int fieldid_size, double * data_k8, int data_Xsize)
-   {
-      std::string fieldid_str;
-      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return;
-
-      CTimer::get("XIOS").resume() ;
-      CTimer::get("XIOS send field").resume() ;
-      CContext* context = CContext::getCurrent() ;
-      if (!context->hasServer) context->client->checkBuffers() ;
-      CArray<double,(StdSize)1> data(data_k8,shape(data_Xsize),neverDeleteData) ;
-      CField::get(fieldid_str)->setData(data) ;
-      CTimer::get("XIOS send field").suspend() ;
-      CTimer::get("XIOS").suspend() ;
-   }
-
-   void cxios_write_data_k82(const char * fieldid, int fieldid_size, double * data_k8, int data_Xsize, int data_Ysize)
-   {
-      std::string fieldid_str;
-      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return;
-
-      CTimer::get("XIOS").resume() ;
-      CTimer::get("XIOS send field").resume() ;
-      CContext* context = CContext::getCurrent() ;
-      if (!context->hasServer) context->client->checkBuffers() ;
-
-      CArray<double,2>data(data_k8,shape(data_Xsize,data_Ysize),neverDeleteData) ;
-      CField::get(fieldid_str)->setData(data) ;
-      CTimer::get("XIOS send field").suspend() ;
-      CTimer::get("XIOS").suspend() ;
-   }
-
-   void cxios_write_data_k83(const char * fieldid, int fieldid_size, double * data_k8, int data_Xsize, int data_Ysize, int data_Zsize)
-   {
-      std::string fieldid_str;
-      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return;
-
-      CTimer::get("XIOS").resume() ;
-      CTimer::get("XIOS send field").resume() ;
-      CContext* context = CContext::getCurrent() ;
-      if (!context->hasServer) context->client->checkBuffers() ;
-
-      CArray<double,3>data(data_k8,shape(data_Xsize,data_Ysize,data_Zsize),neverDeleteData) ;
-      CField::get(fieldid_str)->setData(data) ;
-      CTimer::get("XIOS send field").suspend() ;
-      CTimer::get("XIOS").suspend() ;
-   }
-
-   void cxios_write_data_k41(const char * fieldid, int fieldid_size, float * data_k4, int data_Xsize)
-   {
-      std::string fieldid_str;
-     if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return;
-
-      CTimer::get("XIOS").resume() ;
-      CTimer::get("XIOS send field").resume() ;
-      CContext* context = CContext::getCurrent() ;
-      if (!context->hasServer) context->client->checkBuffers() ;
-
-      CArray<float,1> data_tmp(data_k4,shape(data_Xsize),neverDeleteData) ;
-      CArray<double,1> data(data_Xsize) ;
-      data=data_tmp ;
-      CField::get(fieldid_str)->setData(data) ;
-      CTimer::get("XIOS send field").suspend() ;
-      CTimer::get("XIOS").suspend() ;
-   }
-
-   void cxios_write_data_k42(const char * fieldid, int fieldid_size, float * data_k4, int data_Xsize, int data_Ysize)
-   {
-      std::string fieldid_str;
-      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return;
-
-      CTimer::get("XIOS").resume() ;
-      CTimer::get("XIOS send field").resume() ;
-      CContext* context = CContext::getCurrent() ;
-      if (!context->hasServer) context->client->checkBuffers() ;
-
-      CArray<float,2> data_tmp(data_k4,shape(data_Xsize,data_Ysize),neverDeleteData) ;
-      CArray<double,2> data(data_Xsize,data_Ysize) ;
-      data=data_tmp ;
-      CField::get(fieldid_str)->setData(data) ;
-      CTimer::get("XIOS send field").suspend() ;
-      CTimer::get("XIOS").suspend() ;
-   }
-
-   void cxios_write_data_k43(const char * fieldid, int fieldid_size, float * data_k4, int data_Xsize, int data_Ysize, int data_Zsize)
-   {
-      std::string fieldid_str;
-
-      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return;
-
-      CTimer::get("XIOS").resume() ;
-      CTimer::get("XIOS send field").resume() ;
-      CContext* context = CContext::getCurrent() ;
-      if (!context->hasServer) context->client->checkBuffers() ;
-
-      CArray<float,3> data_tmp(data_k4,shape(data_Xsize,data_Ysize,data_Zsize),neverDeleteData) ;
-      CArray<double,3> data(data_Xsize,data_Ysize,data_Zsize) ;
-      data=data_tmp ;
-
-      CField::get(fieldid_str)->setData(data) ;
-      CTimer::get("XIOS send field").suspend() ;
-      CTimer::get("XIOS").suspend() ;
-
+   void cxios_write_data_k80(const char* fieldid, int fieldid_size, double* data_k8, int data_Xsize)
+   {
+      std::string fieldid_str;
+      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return;
+
+      CTimer::get("XIOS").resume();
+      CTimer::get("XIOS send field").resume();
+      CContext* context = CContext::getCurrent();
+      if (!context->hasServer) context->client->checkBuffers();
+      CArray<double, 1> data(data_k8, shape(data_Xsize), neverDeleteData);
+      CField::get(fieldid_str)->setData(data);
+      CTimer::get("XIOS send field").suspend();
+      CTimer::get("XIOS").suspend();
+   }
+
+   void cxios_write_data_k81(const char* fieldid, int fieldid_size, double* data_k8, int data_Xsize)
+   {
+      std::string fieldid_str;
+      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return;
+
+      CTimer::get("XIOS").resume();
+      CTimer::get("XIOS send field").resume();
+
+      CContext* context = CContext::getCurrent();
+      if (!context->hasServer) context->client->checkBuffers();
+
+      CArray<double, 1> data(data_k8, shape(data_Xsize), neverDeleteData);
+      CField::get(fieldid_str)->setData(data);
+
+      CTimer::get("XIOS send field").suspend();
+      CTimer::get("XIOS").suspend();
+   }
+
+   void cxios_write_data_k82(const char* fieldid, int fieldid_size, double* data_k8, int data_Xsize, int data_Ysize)
+   {
+      std::string fieldid_str;
+      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return;
+
+      CTimer::get("XIOS").resume();
+      CTimer::get("XIOS send field").resume();
+
+      CContext* context = CContext::getCurrent();
+      if (!context->hasServer) context->client->checkBuffers();
+
+      CArray<double, 2>data(data_k8, shape(data_Xsize, data_Ysize), neverDeleteData);
+      CField::get(fieldid_str)->setData(data);
+
+      CTimer::get("XIOS send field").suspend();
+      CTimer::get("XIOS").suspend();
+   }
+
+   void cxios_write_data_k83(const char* fieldid, int fieldid_size, double* data_k8, int data_Xsize, int data_Ysize, int data_Zsize)
+   {
+      std::string fieldid_str;
+      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return;
+
+      CTimer::get("XIOS").resume();
+      CTimer::get("XIOS send field").resume();
+
+      CContext* context = CContext::getCurrent();
+      if (!context->hasServer) context->client->checkBuffers();
+
+      CArray<double, 3>data(data_k8, shape(data_Xsize, data_Ysize, data_Zsize), neverDeleteData);
+      CField::get(fieldid_str)->setData(data);
+
+      CTimer::get("XIOS send field").suspend();
+      CTimer::get("XIOS").suspend();
+   }
+
+   void cxios_write_data_k40(const char* fieldid, int fieldid_size, float* data_k4, int data_Xsize)
+   {
+      std::string fieldid_str;
+      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return;
+
+      CTimer::get("XIOS").resume();
+      CTimer::get("XIOS send field").resume();
+      CContext* context = CContext::getCurrent();
+      if (!context->hasServer) context->client->checkBuffers();
+
+      CArray<float, 1> data_tmp(data_k4, shape(data_Xsize), neverDeleteData);
+      CArray<double, 1> data(data_Xsize) ;
+      data = data_tmp;
+      CField::get(fieldid_str)->setData(data);
+      CTimer::get("XIOS send field").suspend();
+      CTimer::get("XIOS").suspend();
+   }
+
+   void cxios_write_data_k41(const char* fieldid, int fieldid_size, float* data_k4, int data_Xsize)
+   {
+      std::string fieldid_str;
+      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return;
+
+      CTimer::get("XIOS").resume();
+      CTimer::get("XIOS send field").resume();
+
+      CContext* context = CContext::getCurrent();
+      if (!context->hasServer) context->client->checkBuffers();
+
+      CArray<float, 1> data_tmp(data_k4, shape(data_Xsize), neverDeleteData);
+      CArray<double, 1> data(data_Xsize);
+      data = data_tmp;
+      CField::get(fieldid_str)->setData(data);
+
+      CTimer::get("XIOS send field").suspend();
+      CTimer::get("XIOS").suspend();
+   }
+
+   void cxios_write_data_k42(const char* fieldid, int fieldid_size, float* data_k4, int data_Xsize, int data_Ysize)
+   {
+      std::string fieldid_str;
+      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return;
+
+      CTimer::get("XIOS").resume();
+      CTimer::get("XIOS send field").resume();
+
+      CContext* context = CContext::getCurrent();
+      if (!context->hasServer) context->client->checkBuffers();
+
+      CArray<float, 2> data_tmp(data_k4, shape(data_Xsize, data_Ysize), neverDeleteData);
+      CArray<double, 2> data(data_Xsize, data_Ysize);
+      data = data_tmp;
+      CField::get(fieldid_str)->setData(data);
+
+      CTimer::get("XIOS send field").suspend();
+      CTimer::get("XIOS").suspend();
+   }
+
+   void cxios_write_data_k43(const char* fieldid, int fieldid_size, float* data_k4, int data_Xsize, int data_Ysize, int data_Zsize)
+   {
+      std::string fieldid_str;
+      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return;
+
+      CTimer::get("XIOS").resume();
+      CTimer::get("XIOS send field").resume();
+
+      CContext* context = CContext::getCurrent();
+      if (!context->hasServer) context->client->checkBuffers();
+
+      CArray<float, 3> data_tmp(data_k4, shape(data_Xsize, data_Ysize, data_Zsize), neverDeleteData);
+      CArray<double, 3> data(data_Xsize, data_Ysize, data_Zsize);
+      data = data_tmp;
+      CField::get(fieldid_str)->setData(data);
+
+      CTimer::get("XIOS send field").suspend();
+      CTimer::get("XIOS").suspend();
     }
 
+   // ---------------------- Lecture des donnÃ©es ------------------------------
+
+   void cxios_read_data_k81(const char* fieldid, int fieldid_size, double* data_k8, int data_Xsize)
+   {
+      std::string fieldid_str;
+      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return;
+
+      CTimer::get("XIOS").resume();
+      CTimer::get("XIOS recv field").resume();
+
+      CContext* context = CContext::getCurrent();
+      if (!context->hasServer) context->client->checkBuffers();
+
+      CArray<double, 1> data(data_k8, shape(data_Xsize), neverDeleteData);
+      CField::get(fieldid_str)->getData(data);
+
+      CTimer::get("XIOS recv field").suspend();
+      CTimer::get("XIOS").suspend();
+   }
+
+   void cxios_read_data_k82(const char* fieldid, int fieldid_size, double* data_k8, int data_Xsize, int data_Ysize)
+   {
+      std::string fieldid_str;
+      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return;
+
+      CTimer::get("XIOS").resume();
+      CTimer::get("XIOS recv field").resume();
+
+      CContext* context = CContext::getCurrent();
+      if (!context->hasServer) context->client->checkBuffers();
+
+      CArray<double, 2>data(data_k8, shape(data_Xsize, data_Ysize), neverDeleteData);
+      CField::get(fieldid_str)->getData(data);
+
+      CTimer::get("XIOS recv field").suspend();
+      CTimer::get("XIOS").suspend();
+   }
+
+   void cxios_read_data_k83(const char* fieldid, int fieldid_size, double* data_k8, int data_Xsize, int data_Ysize, int data_Zsize)
+   {
+      std::string fieldid_str;
+      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return;
+
+      CTimer::get("XIOS").resume();
+      CTimer::get("XIOS recv field").resume();
+
+      CContext* context = CContext::getCurrent();
+      if (!context->hasServer) context->client->checkBuffers();
+
+      CArray<double, 3>data(data_k8, shape(data_Xsize, data_Ysize, data_Zsize), neverDeleteData);
+      CField::get(fieldid_str)->getData(data);
+
+      CTimer::get("XIOS recv field").suspend();
+      CTimer::get("XIOS").suspend();
+   }
+
+   void cxios_read_data_k41(const char* fieldid, int fieldid_size, float* data_k4, int data_Xsize)
+   {
+      std::string fieldid_str;
+      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return;
+
+      CTimer::get("XIOS").resume();
+      CTimer::get("XIOS recv field").resume();
+
+      CContext* context = CContext::getCurrent();
+      if (!context->hasServer) context->client->checkBuffers();
+
+      CArray<double, 1> data(data_Xsize);
+      CField::get(fieldid_str)->getData(data);
+      CArray<float, 1> data_tmp(data_k4, shape(data_Xsize), neverDeleteData);
+      data_tmp = data;
+
+      CTimer::get("XIOS recv field").suspend();
+      CTimer::get("XIOS").suspend();
+   }
+
+   void cxios_read_data_k42(const char* fieldid, int fieldid_size, float* data_k4, int data_Xsize, int data_Ysize)
+   {
+      std::string fieldid_str;
+      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return;
+
+      CTimer::get("XIOS").resume();
+      CTimer::get("XIOS recv field").resume();
+
+      CContext* context = CContext::getCurrent();
+      if (!context->hasServer) context->client->checkBuffers();
+
+      CArray<double, 2> data(data_Xsize, data_Ysize);
+      CField::get(fieldid_str)->getData(data);
+      CArray<float, 2> data_tmp(data_k4, shape(data_Xsize, data_Ysize), neverDeleteData);
+      data_tmp = data;
+
+      CTimer::get("XIOS recv field").suspend();
+      CTimer::get("XIOS").suspend();
+   }
+
+   void cxios_read_data_k43(const char* fieldid, int fieldid_size, float* data_k4, int data_Xsize, int data_Ysize, int data_Zsize)
+   {
+      std::string fieldid_str;
+      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return;
+
+      CTimer::get("XIOS").resume();
+      CTimer::get("XIOS recv field").resume();
+
+      CContext* context = CContext::getCurrent();
+      if (!context->hasServer) context->client->checkBuffers();
+
+      CArray<double, 3> data(data_Xsize, data_Ysize, data_Zsize);
+      CField::get(fieldid_str)->getData(data);
+      CArray<float, 3> data_tmp(data_k4, shape(data_Xsize, data_Ysize, data_Zsize), neverDeleteData);
+      data_tmp = data;
+
+      CTimer::get("XIOS recv field").suspend();
+      CTimer::get("XIOS").suspend();
+    }
 } // extern "C"
Index: /XIOS/trunk/src/interface/c_attr/icfield_attr.cpp
===================================================================
--- /XIOS/trunk/src/interface/c_attr/icfield_attr.cpp	(revision 592)
+++ /XIOS/trunk/src/interface/c_attr/icfield_attr.cpp	(revision 593)
@@ -414,4 +414,27 @@
 
 
+  void cxios_set_field_read_access(field_Ptr field_hdl, bool read_access)
+  {
+    CTimer::get("XIOS").resume();
+    field_hdl->read_access.setValue(read_access);
+    CTimer::get("XIOS").suspend();
+  }
+
+  void cxios_get_field_read_access(field_Ptr field_hdl, bool* read_access)
+  {
+    CTimer::get("XIOS").resume();
+    *read_access = field_hdl->read_access.getInheritedValue();
+    CTimer::get("XIOS").suspend();
+  }
+
+  bool cxios_is_defined_field_read_access(field_Ptr field_hdl)
+  {
+     CTimer::get("XIOS").resume();
+     bool isDefined = field_hdl->read_access.hasInheritedValue();
+     CTimer::get("XIOS").suspend();
+     return isDefined;
+  }
+
+
   void cxios_set_field_scale_factor(field_Ptr field_hdl, double scale_factor)
   {
Index: /XIOS/trunk/src/interface/c_attr/icfieldgroup_attr.cpp
===================================================================
--- /XIOS/trunk/src/interface/c_attr/icfieldgroup_attr.cpp	(revision 592)
+++ /XIOS/trunk/src/interface/c_attr/icfieldgroup_attr.cpp	(revision 593)
@@ -440,4 +440,27 @@
 
 
+  void cxios_set_fieldgroup_read_access(fieldgroup_Ptr fieldgroup_hdl, bool read_access)
+  {
+    CTimer::get("XIOS").resume();
+    fieldgroup_hdl->read_access.setValue(read_access);
+    CTimer::get("XIOS").suspend();
+  }
+
+  void cxios_get_fieldgroup_read_access(fieldgroup_Ptr fieldgroup_hdl, bool* read_access)
+  {
+    CTimer::get("XIOS").resume();
+    *read_access = fieldgroup_hdl->read_access.getInheritedValue();
+    CTimer::get("XIOS").suspend();
+  }
+
+  bool cxios_is_defined_fieldgroup_read_access(fieldgroup_Ptr fieldgroup_hdl)
+  {
+     CTimer::get("XIOS").resume();
+     bool isDefined = fieldgroup_hdl->read_access.hasInheritedValue();
+     CTimer::get("XIOS").suspend();
+     return isDefined;
+  }
+
+
   void cxios_set_fieldgroup_scale_factor(fieldgroup_Ptr fieldgroup_hdl, double scale_factor)
   {
Index: /XIOS/trunk/src/interface/fortran/idata.F90
===================================================================
--- /XIOS/trunk/src/interface/fortran/idata.F90	(revision 592)
+++ /XIOS/trunk/src/interface/fortran/idata.F90	(revision 593)
@@ -113,4 +113,52 @@
          INTEGER  (kind = C_INT)   , VALUE        :: data_Xsize, data_Ysize, data_Zsize
       END SUBROUTINE cxios_write_data_k43
+
+      SUBROUTINE cxios_read_data_k81(fieldid, fieldid_size, data_k8, data_Xsize) BIND(C)
+         USE ISO_C_BINDING
+         CHARACTER(kind = C_CHAR)  , DIMENSION(*) :: fieldid
+         REAL     (kind = C_DOUBLE), DIMENSION(*) :: data_k8
+         INTEGER  (kind = C_INT)   , VALUE        :: fieldid_size
+         INTEGER  (kind = C_INT)   , VALUE        :: data_Xsize
+      END SUBROUTINE cxios_read_data_k81
+
+      SUBROUTINE cxios_read_data_k82(fieldid, fieldid_size, data_k8, data_Xsize, data_Ysize) BIND(C)
+         USE ISO_C_BINDING
+         CHARACTER(kind = C_CHAR)  , DIMENSION(*) :: fieldid
+         REAL     (kind = C_DOUBLE), DIMENSION(*) :: data_k8
+         INTEGER  (kind = C_INT)   , VALUE        :: fieldid_size
+         INTEGER  (kind = C_INT)   , VALUE        :: data_Xsize, data_Ysize
+      END SUBROUTINE cxios_read_data_k82
+
+      SUBROUTINE cxios_read_data_k83(fieldid, fieldid_size, data_k8, data_Xsize, data_Ysize, data_Zsize) BIND(C)
+         USE ISO_C_BINDING
+         CHARACTER(kind = C_CHAR)  , DIMENSION(*) :: fieldid
+         REAL     (kind = C_DOUBLE), DIMENSION(*) :: data_k8
+         INTEGER  (kind = C_INT)   , VALUE        :: fieldid_size
+         INTEGER  (kind = C_INT)   , VALUE        :: data_Xsize, data_Ysize, data_Zsize
+      END SUBROUTINE cxios_read_data_k83
+
+      SUBROUTINE cxios_read_data_k41(fieldid, fieldid_size, data_k4, data_Xsize) BIND(C)
+         USE ISO_C_BINDING
+         CHARACTER(kind = C_CHAR)  , DIMENSION(*) :: fieldid
+         REAL     (kind = C_FLOAT) , DIMENSION(*) :: data_k4
+         INTEGER  (kind = C_INT)   , VALUE        :: fieldid_size
+         INTEGER  (kind = C_INT)   , VALUE        :: data_Xsize
+      END SUBROUTINE cxios_read_data_k41
+
+      SUBROUTINE cxios_read_data_k42(fieldid, fieldid_size, data_k4, data_Xsize, data_Ysize) BIND(C)
+         USE ISO_C_BINDING
+         CHARACTER(kind = C_CHAR)  , DIMENSION(*) :: fieldid
+         REAL     (kind = C_FLOAT) , DIMENSION(*) :: data_k4
+         INTEGER  (kind = C_INT)   , VALUE        :: fieldid_size
+         INTEGER  (kind = C_INT)   , VALUE        :: data_Xsize, data_Ysize
+      END SUBROUTINE cxios_read_data_k42
+
+      SUBROUTINE cxios_read_data_k43(fieldid, fieldid_size, data_k4, data_Xsize, data_Ysize, data_Zsize) BIND(C)
+         USE ISO_C_BINDING
+         CHARACTER(kind = C_CHAR)  , DIMENSION(*) :: fieldid
+         REAL     (kind = C_FLOAT) , DIMENSION(*) :: data_k4
+         INTEGER  (kind = C_INT)   , VALUE        :: fieldid_size
+         INTEGER  (kind = C_INT)   , VALUE        :: data_Xsize, data_Ysize, data_Zsize
+      END SUBROUTINE cxios_read_data_k43
 
       ! Binding C and Fortran interface of get_variable (icdata.cpp)
@@ -276,5 +324,5 @@
    END SUBROUTINE xios(solve_inheritance)
 
-
+   ! Send field functions
    SUBROUTINE xios(send_scalar_r8)(fieldid, data_k8)
    IMPLICIT NONE
@@ -335,4 +383,47 @@
    END SUBROUTINE xios(send_field_r4_3d)
 
+   ! Receive field functions
+   SUBROUTINE xios(recv_field_r8_1d)(fieldid, data1d_k8)
+   IMPLICIT NONE
+      CHARACTER(len = *)               , INTENT(IN) :: fieldid
+      REAL     (kind = 8), DIMENSION(*), INTENT(OUT) :: data1d_k8(:)
+      CALL cxios_read_data_k81(fieldid, len(fieldid), data1d_k8, size(data1d_k8, 1))
+   END SUBROUTINE xios(recv_field_r8_1d)
+
+   SUBROUTINE  xios(recv_field_r8_2d)(fieldid, data2d_k8)
+   IMPLICIT NONE
+      CHARACTER(len = *)               , INTENT(IN) :: fieldid
+      REAL     (kind = 8), DIMENSION(*), INTENT(OUT) :: data2d_k8(:,:)
+      CALL cxios_read_data_k82(fieldid, len(fieldid), data2d_k8, size(data2d_k8, 1), size(data2d_k8, 2))
+   END SUBROUTINE  xios(recv_field_r8_2d)
+
+   SUBROUTINE  xios(recv_field_r8_3d)(fieldid, data3d_k8)
+   IMPLICIT NONE
+      CHARACTER(len = *)               , INTENT(IN) :: fieldid
+      REAL     (kind = 8), DIMENSION(*), INTENT(OUT) :: data3d_k8(:,:,:)
+      CALL cxios_read_data_k83(fieldid, len(fieldid), data3d_k8, size(data3d_k8, 1), size(data3d_k8, 2), size(data3d_k8, 3))
+   END SUBROUTINE  xios(recv_field_r8_3d)
+
+   SUBROUTINE xios(recv_field_r4_1d)(fieldid, data1d_k4)
+   IMPLICIT NONE
+      CHARACTER(len = *)               , INTENT(IN) :: fieldid
+      REAL     (kind = 4), DIMENSION(*), INTENT(OUT) :: data1d_k4(:)
+      CALL cxios_read_data_k41(fieldid, len(fieldid), data1d_k4, size(data1d_k4, 1))
+   END SUBROUTINE xios(recv_field_r4_1d)
+
+   SUBROUTINE xios(recv_field_r4_2d)(fieldid, data2d_k4)
+   IMPLICIT NONE
+      CHARACTER(len = *)               , INTENT(IN) :: fieldid
+      REAL     (kind = 4), DIMENSION(*), INTENT(OUT) :: data2d_k4(:,:)
+      CALL cxios_read_data_k42(fieldid, len(fieldid), data2d_k4, size(data2d_k4, 1), size(data2d_k4, 2))
+   END SUBROUTINE xios(recv_field_r4_2d)
+
+   SUBROUTINE xios(recv_field_r4_3d)(fieldid, data3d_k4)
+   IMPLICIT NONE
+      CHARACTER(len = *)               , INTENT(IN) :: fieldid
+      REAL     (kind = 4), DIMENSION(*), INTENT(OUT) :: data3d_k4(:,:,:)
+      CALL cxios_read_data_k43(fieldid, len(fieldid), data3d_k4, size(data3d_k4, 1), size(data3d_k4, 2), size(data3d_k4, 3))
+   END SUBROUTINE xios(recv_field_r4_3d)
+
    ! Get variable functions
    LOGICAL FUNCTION xios(getVar_k8)(varId, data_k8)
Index: /XIOS/trunk/src/interface/fortran/ixios.F90
===================================================================
--- /XIOS/trunk/src/interface/fortran/ixios.F90	(revision 592)
+++ /XIOS/trunk/src/interface/fortran/ixios.F90	(revision 593)
@@ -67,6 +67,6 @@
 USE iaxisgroup_attr, ONLY : xios(set_axisgroup_attr), xios(get_axisgroup_attr), xios(is_defined_axisgroup_attr)
 
-USE XIOS_INTERFACES, ONLY : xios(set_attr), xios(get_attr), xios(is_defined_attr), xios(get_handle), &
-                            xios(add_child), xios(send_field), xios(send_scalar), xios(field_is_active), xios(getVar), xios(setVar)
+USE XIOS_INTERFACES, ONLY : xios(set_attr), xios(get_attr), xios(is_defined_attr), xios(get_handle), xios(add_child), &
+                            xios(send_field), xios(send_scalar), xios(recv_field), xios(field_is_active), xios(getVar), xios(setVar)
 
 END MODULE XIOS
Index: /XIOS/trunk/src/interface/fortran/ixios_interfaces.F90
===================================================================
--- /XIOS/trunk/src/interface/fortran/ixios_interfaces.F90	(revision 592)
+++ /XIOS/trunk/src/interface/fortran/ixios_interfaces.F90	(revision 593)
@@ -7,7 +7,9 @@
 USE icontext_attr, ONLY : xios(set_context_attr_hdl), xios(get_context_attr_hdl), xios(is_defined_context_attr_hdl)
 
-USE idata, ONLY : xios(send_scalar_r8), xios(send_field_r8_1d), xios(send_field_r8_2d), xios(send_field_r8_3d),                    &
-                  xios(send_scalar_r4), xios(send_field_r4_1d), xios(send_field_r4_2d), xios(send_field_r4_3d),                    &
-                  xios(getVar_k8), xios(getVar_k4), xios(getVar_int), xios(getVar_logic), xios(getVar_char), &
+USE idata, ONLY : xios(send_scalar_r8), xios(send_field_r8_1d), xios(send_field_r8_2d), xios(send_field_r8_3d), &
+                  xios(send_scalar_r4), xios(send_field_r4_1d), xios(send_field_r4_2d), xios(send_field_r4_3d), &
+                  xios(recv_field_r8_1d), xios(recv_field_r8_2d), xios(recv_field_r8_3d),                       &
+                  xios(recv_field_r4_1d), xios(recv_field_r4_2d), xios(recv_field_r4_3d),                       &
+                  xios(getVar_k8), xios(getVar_k4), xios(getVar_int), xios(getVar_logic), xios(getVar_char),    &
                   xios(setVar_k8), xios(setVar_k4), xios(setVar_int), xios(setVar_logic), xios(setVar_char)
 
@@ -96,5 +98,4 @@
 END INTERFACE xios(add_child)
 
-
 INTERFACE xios(send_field)
   MODULE PROCEDURE xios(send_field_r8_1d), xios(send_field_r8_2d), xios(send_field_r8_3d), &
@@ -105,4 +106,9 @@
   MODULE PROCEDURE xios(send_scalar_r8), xios(send_scalar_r4)
 END INTERFACE xios(send_scalar)
+
+INTERFACE xios(recv_field)
+  MODULE PROCEDURE xios(recv_field_r8_1d), xios(recv_field_r8_2d), xios(recv_field_r8_3d), &
+                   xios(recv_field_r4_1d), xios(recv_field_r4_2d), xios(recv_field_r4_3d)
+END INTERFACE xios(recv_field)
 
 INTERFACE xios(field_is_active)
@@ -118,6 +124,6 @@
 END INTERFACE xios(setVar)
 
-PUBLIC :: xios(set_attr), xios(get_attr), xios(is_defined_attr), xios(get_handle), &
-          xios(add_child), xios(send_field), xios(field_is_active), xios(getVar), xios(setVar), xios(send_scalar)
+PUBLIC :: xios(set_attr), xios(get_attr), xios(is_defined_attr), xios(get_handle), xios(add_child), &
+          xios(send_scalar), xios(send_field), xios(recv_field), xios(field_is_active), xios(getVar), xios(setVar)
 
 END MODULE XIOS_INTERFACES
Index: /XIOS/trunk/src/interface/fortran_attr/field_interface_attr.F90
===================================================================
--- /XIOS/trunk/src/interface/fortran_attr/field_interface_attr.F90	(revision 592)
+++ /XIOS/trunk/src/interface/fortran_attr/field_interface_attr.F90	(revision 593)
@@ -313,4 +313,23 @@
 
 
+    SUBROUTINE cxios_set_field_read_access(field_hdl, read_access) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl
+      LOGICAL (KIND=C_BOOL)      , VALUE :: read_access
+    END SUBROUTINE cxios_set_field_read_access
+
+    SUBROUTINE cxios_get_field_read_access(field_hdl, read_access) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl
+      LOGICAL (KIND=C_BOOL)             :: read_access
+    END SUBROUTINE cxios_get_field_read_access
+
+    FUNCTION cxios_is_defined_field_read_access(field_hdl) BIND(C)
+      USE ISO_C_BINDING
+      LOGICAL(kind=C_BOOL) :: cxios_is_defined_field_read_access
+      INTEGER (kind = C_INTPTR_T), VALUE :: field_hdl
+    END FUNCTION cxios_is_defined_field_read_access
+
+
     SUBROUTINE cxios_set_field_scale_factor(field_hdl, scale_factor) BIND(C)
       USE ISO_C_BINDING
Index: /XIOS/trunk/src/interface/fortran_attr/fieldgroup_interface_attr.F90
===================================================================
--- /XIOS/trunk/src/interface/fortran_attr/fieldgroup_interface_attr.F90	(revision 592)
+++ /XIOS/trunk/src/interface/fortran_attr/fieldgroup_interface_attr.F90	(revision 593)
@@ -334,4 +334,23 @@
 
 
+    SUBROUTINE cxios_set_fieldgroup_read_access(fieldgroup_hdl, read_access) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl
+      LOGICAL (KIND=C_BOOL)      , VALUE :: read_access
+    END SUBROUTINE cxios_set_fieldgroup_read_access
+
+    SUBROUTINE cxios_get_fieldgroup_read_access(fieldgroup_hdl, read_access) BIND(C)
+      USE ISO_C_BINDING
+      INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl
+      LOGICAL (KIND=C_BOOL)             :: read_access
+    END SUBROUTINE cxios_get_fieldgroup_read_access
+
+    FUNCTION cxios_is_defined_fieldgroup_read_access(fieldgroup_hdl) BIND(C)
+      USE ISO_C_BINDING
+      LOGICAL(kind=C_BOOL) :: cxios_is_defined_fieldgroup_read_access
+      INTEGER (kind = C_INTPTR_T), VALUE :: fieldgroup_hdl
+    END FUNCTION cxios_is_defined_fieldgroup_read_access
+
+
     SUBROUTINE cxios_set_fieldgroup_scale_factor(fieldgroup_hdl, scale_factor) BIND(C)
       USE ISO_C_BINDING
Index: /XIOS/trunk/src/interface/fortran_attr/ifield_attr.F90
===================================================================
--- /XIOS/trunk/src/interface/fortran_attr/ifield_attr.F90	(revision 592)
+++ /XIOS/trunk/src/interface/fortran_attr/ifield_attr.F90	(revision 593)
@@ -13,6 +13,6 @@
   SUBROUTINE xios(set_field_attr)  &
     ( field_id, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled, field_ref  &
-    , freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, scale_factor, standard_name  &
-    , unit, valid_max, valid_min )
+    , freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, read_access, scale_factor  &
+    , standard_name, unit, valid_max, valid_min )
 
     IMPLICIT NONE
@@ -36,4 +36,6 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: operation
       INTEGER  , OPTIONAL, INTENT(IN) :: prec
+      LOGICAL  , OPTIONAL, INTENT(IN) :: read_access
+      LOGICAL (KIND=C_BOOL) :: read_access_tmp
       REAL (KIND=8) , OPTIONAL, INTENT(IN) :: scale_factor
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name
@@ -45,6 +47,6 @@
       CALL xios(set_field_attr_hdl_)   &
       ( field_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled  &
-      , field_ref, freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, scale_factor  &
-      , standard_name, unit, valid_max, valid_min )
+      , field_ref, freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, read_access  &
+      , scale_factor, standard_name, unit, valid_max, valid_min )
 
   END SUBROUTINE xios(set_field_attr)
@@ -52,6 +54,6 @@
   SUBROUTINE xios(set_field_attr_hdl)  &
     ( field_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled  &
-    , field_ref, freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, scale_factor  &
-    , standard_name, unit, valid_max, valid_min )
+    , field_ref, freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, read_access  &
+    , scale_factor, standard_name, unit, valid_max, valid_min )
 
     IMPLICIT NONE
@@ -74,4 +76,6 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: operation
       INTEGER  , OPTIONAL, INTENT(IN) :: prec
+      LOGICAL  , OPTIONAL, INTENT(IN) :: read_access
+      LOGICAL (KIND=C_BOOL) :: read_access_tmp
       REAL (KIND=8) , OPTIONAL, INTENT(IN) :: scale_factor
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name
@@ -82,6 +86,6 @@
       CALL xios(set_field_attr_hdl_)  &
       ( field_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled  &
-      , field_ref, freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, scale_factor  &
-      , standard_name, unit, valid_max, valid_min )
+      , field_ref, freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, read_access  &
+      , scale_factor, standard_name, unit, valid_max, valid_min )
 
   END SUBROUTINE xios(set_field_attr_hdl)
@@ -90,5 +94,5 @@
     ( field_hdl, add_offset_, axis_ref_, default_value_, detect_missing_value_, domain_ref_, enabled_  &
     , field_ref_, freq_offset_, freq_op_, grid_ref_, level_, long_name_, name_, operation_, prec_  &
-    , scale_factor_, standard_name_, unit_, valid_max_, valid_min_ )
+    , read_access_, scale_factor_, standard_name_, unit_, valid_max_, valid_min_ )
 
     IMPLICIT NONE
@@ -111,4 +115,6 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: operation_
       INTEGER  , OPTIONAL, INTENT(IN) :: prec_
+      LOGICAL  , OPTIONAL, INTENT(IN) :: read_access_
+      LOGICAL (KIND=C_BOOL) :: read_access__tmp
       REAL (KIND=8) , OPTIONAL, INTENT(IN) :: scale_factor_
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name_
@@ -179,4 +185,9 @@
       ENDIF
 
+      IF (PRESENT(read_access_)) THEN
+        read_access__tmp = read_access_
+        CALL cxios_set_field_read_access(field_hdl%daddr, read_access__tmp)
+      ENDIF
+
       IF (PRESENT(scale_factor_)) THEN
         CALL cxios_set_field_scale_factor(field_hdl%daddr, scale_factor_)
@@ -203,6 +214,6 @@
   SUBROUTINE xios(get_field_attr)  &
     ( field_id, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled, field_ref  &
-    , freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, scale_factor, standard_name  &
-    , unit, valid_max, valid_min )
+    , freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, read_access, scale_factor  &
+    , standard_name, unit, valid_max, valid_min )
 
     IMPLICIT NONE
@@ -226,4 +237,6 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: operation
       INTEGER  , OPTIONAL, INTENT(OUT) :: prec
+      LOGICAL  , OPTIONAL, INTENT(OUT) :: read_access
+      LOGICAL (KIND=C_BOOL) :: read_access_tmp
       REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: scale_factor
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name
@@ -235,6 +248,6 @@
       CALL xios(get_field_attr_hdl_)   &
       ( field_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled  &
-      , field_ref, freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, scale_factor  &
-      , standard_name, unit, valid_max, valid_min )
+      , field_ref, freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, read_access  &
+      , scale_factor, standard_name, unit, valid_max, valid_min )
 
   END SUBROUTINE xios(get_field_attr)
@@ -242,6 +255,6 @@
   SUBROUTINE xios(get_field_attr_hdl)  &
     ( field_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled  &
-    , field_ref, freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, scale_factor  &
-    , standard_name, unit, valid_max, valid_min )
+    , field_ref, freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, read_access  &
+    , scale_factor, standard_name, unit, valid_max, valid_min )
 
     IMPLICIT NONE
@@ -264,4 +277,6 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: operation
       INTEGER  , OPTIONAL, INTENT(OUT) :: prec
+      LOGICAL  , OPTIONAL, INTENT(OUT) :: read_access
+      LOGICAL (KIND=C_BOOL) :: read_access_tmp
       REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: scale_factor
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name
@@ -272,6 +287,6 @@
       CALL xios(get_field_attr_hdl_)  &
       ( field_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled  &
-      , field_ref, freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, scale_factor  &
-      , standard_name, unit, valid_max, valid_min )
+      , field_ref, freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, read_access  &
+      , scale_factor, standard_name, unit, valid_max, valid_min )
 
   END SUBROUTINE xios(get_field_attr_hdl)
@@ -280,5 +295,5 @@
     ( field_hdl, add_offset_, axis_ref_, default_value_, detect_missing_value_, domain_ref_, enabled_  &
     , field_ref_, freq_offset_, freq_op_, grid_ref_, level_, long_name_, name_, operation_, prec_  &
-    , scale_factor_, standard_name_, unit_, valid_max_, valid_min_ )
+    , read_access_, scale_factor_, standard_name_, unit_, valid_max_, valid_min_ )
 
     IMPLICIT NONE
@@ -301,4 +316,6 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: operation_
       INTEGER  , OPTIONAL, INTENT(OUT) :: prec_
+      LOGICAL  , OPTIONAL, INTENT(OUT) :: read_access_
+      LOGICAL (KIND=C_BOOL) :: read_access__tmp
       REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: scale_factor_
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name_
@@ -369,4 +386,9 @@
       ENDIF
 
+      IF (PRESENT(read_access_)) THEN
+        CALL cxios_get_field_read_access(field_hdl%daddr, read_access__tmp)
+        read_access_ = read_access__tmp
+      ENDIF
+
       IF (PRESENT(scale_factor_)) THEN
         CALL cxios_get_field_scale_factor(field_hdl%daddr, scale_factor_)
@@ -393,6 +415,6 @@
   SUBROUTINE xios(is_defined_field_attr)  &
     ( field_id, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled, field_ref  &
-    , freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, scale_factor, standard_name  &
-    , unit, valid_max, valid_min )
+    , freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, read_access, scale_factor  &
+    , standard_name, unit, valid_max, valid_min )
 
     IMPLICIT NONE
@@ -429,4 +451,6 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: prec
       LOGICAL(KIND=C_BOOL) :: prec_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: read_access
+      LOGICAL(KIND=C_BOOL) :: read_access_tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: scale_factor
       LOGICAL(KIND=C_BOOL) :: scale_factor_tmp
@@ -443,6 +467,6 @@
       CALL xios(is_defined_field_attr_hdl_)   &
       ( field_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled  &
-      , field_ref, freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, scale_factor  &
-      , standard_name, unit, valid_max, valid_min )
+      , field_ref, freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, read_access  &
+      , scale_factor, standard_name, unit, valid_max, valid_min )
 
   END SUBROUTINE xios(is_defined_field_attr)
@@ -450,6 +474,6 @@
   SUBROUTINE xios(is_defined_field_attr_hdl)  &
     ( field_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled  &
-    , field_ref, freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, scale_factor  &
-    , standard_name, unit, valid_max, valid_min )
+    , field_ref, freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, read_access  &
+    , scale_factor, standard_name, unit, valid_max, valid_min )
 
     IMPLICIT NONE
@@ -485,4 +509,6 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: prec
       LOGICAL(KIND=C_BOOL) :: prec_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: read_access
+      LOGICAL(KIND=C_BOOL) :: read_access_tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: scale_factor
       LOGICAL(KIND=C_BOOL) :: scale_factor_tmp
@@ -498,6 +524,6 @@
       CALL xios(is_defined_field_attr_hdl_)  &
       ( field_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled  &
-      , field_ref, freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, scale_factor  &
-      , standard_name, unit, valid_max, valid_min )
+      , field_ref, freq_offset, freq_op, grid_ref, level, long_name, name, operation, prec, read_access  &
+      , scale_factor, standard_name, unit, valid_max, valid_min )
 
   END SUBROUTINE xios(is_defined_field_attr_hdl)
@@ -506,5 +532,5 @@
     ( field_hdl, add_offset_, axis_ref_, default_value_, detect_missing_value_, domain_ref_, enabled_  &
     , field_ref_, freq_offset_, freq_op_, grid_ref_, level_, long_name_, name_, operation_, prec_  &
-    , scale_factor_, standard_name_, unit_, valid_max_, valid_min_ )
+    , read_access_, scale_factor_, standard_name_, unit_, valid_max_, valid_min_ )
 
     IMPLICIT NONE
@@ -540,4 +566,6 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: prec_
       LOGICAL(KIND=C_BOOL) :: prec__tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: read_access_
+      LOGICAL(KIND=C_BOOL) :: read_access__tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: scale_factor_
       LOGICAL(KIND=C_BOOL) :: scale_factor__tmp
@@ -626,4 +654,9 @@
       ENDIF
 
+      IF (PRESENT(read_access_)) THEN
+        read_access__tmp = cxios_is_defined_field_read_access(field_hdl%daddr)
+        read_access_ = read_access__tmp
+      ENDIF
+
       IF (PRESENT(scale_factor_)) THEN
         scale_factor__tmp = cxios_is_defined_field_scale_factor(field_hdl%daddr)
Index: /XIOS/trunk/src/interface/fortran_attr/ifieldgroup_attr.F90
===================================================================
--- /XIOS/trunk/src/interface/fortran_attr/ifieldgroup_attr.F90	(revision 592)
+++ /XIOS/trunk/src/interface/fortran_attr/ifieldgroup_attr.F90	(revision 593)
@@ -14,5 +14,5 @@
     ( fieldgroup_id, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled  &
     , field_ref, freq_offset, freq_op, grid_ref, group_ref, level, long_name, name, operation, prec  &
-    , scale_factor, standard_name, unit, valid_max, valid_min )
+    , read_access, scale_factor, standard_name, unit, valid_max, valid_min )
 
     IMPLICIT NONE
@@ -37,4 +37,6 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: operation
       INTEGER  , OPTIONAL, INTENT(IN) :: prec
+      LOGICAL  , OPTIONAL, INTENT(IN) :: read_access
+      LOGICAL (KIND=C_BOOL) :: read_access_tmp
       REAL (KIND=8) , OPTIONAL, INTENT(IN) :: scale_factor
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name
@@ -47,5 +49,5 @@
       ( fieldgroup_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled  &
       , field_ref, freq_offset, freq_op, grid_ref, group_ref, level, long_name, name, operation, prec  &
-      , scale_factor, standard_name, unit, valid_max, valid_min )
+      , read_access, scale_factor, standard_name, unit, valid_max, valid_min )
 
   END SUBROUTINE xios(set_fieldgroup_attr)
@@ -54,5 +56,5 @@
     ( fieldgroup_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled  &
     , field_ref, freq_offset, freq_op, grid_ref, group_ref, level, long_name, name, operation, prec  &
-    , scale_factor, standard_name, unit, valid_max, valid_min )
+    , read_access, scale_factor, standard_name, unit, valid_max, valid_min )
 
     IMPLICIT NONE
@@ -76,4 +78,6 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: operation
       INTEGER  , OPTIONAL, INTENT(IN) :: prec
+      LOGICAL  , OPTIONAL, INTENT(IN) :: read_access
+      LOGICAL (KIND=C_BOOL) :: read_access_tmp
       REAL (KIND=8) , OPTIONAL, INTENT(IN) :: scale_factor
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name
@@ -85,5 +89,5 @@
       ( fieldgroup_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled  &
       , field_ref, freq_offset, freq_op, grid_ref, group_ref, level, long_name, name, operation, prec  &
-      , scale_factor, standard_name, unit, valid_max, valid_min )
+      , read_access, scale_factor, standard_name, unit, valid_max, valid_min )
 
   END SUBROUTINE xios(set_fieldgroup_attr_hdl)
@@ -92,5 +96,6 @@
     ( fieldgroup_hdl, add_offset_, axis_ref_, default_value_, detect_missing_value_, domain_ref_  &
     , enabled_, field_ref_, freq_offset_, freq_op_, grid_ref_, group_ref_, level_, long_name_, name_  &
-    , operation_, prec_, scale_factor_, standard_name_, unit_, valid_max_, valid_min_ )
+    , operation_, prec_, read_access_, scale_factor_, standard_name_, unit_, valid_max_, valid_min_  &
+     )
 
     IMPLICIT NONE
@@ -114,4 +119,6 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: operation_
       INTEGER  , OPTIONAL, INTENT(IN) :: prec_
+      LOGICAL  , OPTIONAL, INTENT(IN) :: read_access_
+      LOGICAL (KIND=C_BOOL) :: read_access__tmp
       REAL (KIND=8) , OPTIONAL, INTENT(IN) :: scale_factor_
       CHARACTER(len = *) , OPTIONAL, INTENT(IN) :: standard_name_
@@ -186,4 +193,9 @@
       ENDIF
 
+      IF (PRESENT(read_access_)) THEN
+        read_access__tmp = read_access_
+        CALL cxios_set_fieldgroup_read_access(fieldgroup_hdl%daddr, read_access__tmp)
+      ENDIF
+
       IF (PRESENT(scale_factor_)) THEN
         CALL cxios_set_fieldgroup_scale_factor(fieldgroup_hdl%daddr, scale_factor_)
@@ -211,5 +223,5 @@
     ( fieldgroup_id, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled  &
     , field_ref, freq_offset, freq_op, grid_ref, group_ref, level, long_name, name, operation, prec  &
-    , scale_factor, standard_name, unit, valid_max, valid_min )
+    , read_access, scale_factor, standard_name, unit, valid_max, valid_min )
 
     IMPLICIT NONE
@@ -234,4 +246,6 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: operation
       INTEGER  , OPTIONAL, INTENT(OUT) :: prec
+      LOGICAL  , OPTIONAL, INTENT(OUT) :: read_access
+      LOGICAL (KIND=C_BOOL) :: read_access_tmp
       REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: scale_factor
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name
@@ -244,5 +258,5 @@
       ( fieldgroup_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled  &
       , field_ref, freq_offset, freq_op, grid_ref, group_ref, level, long_name, name, operation, prec  &
-      , scale_factor, standard_name, unit, valid_max, valid_min )
+      , read_access, scale_factor, standard_name, unit, valid_max, valid_min )
 
   END SUBROUTINE xios(get_fieldgroup_attr)
@@ -251,5 +265,5 @@
     ( fieldgroup_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled  &
     , field_ref, freq_offset, freq_op, grid_ref, group_ref, level, long_name, name, operation, prec  &
-    , scale_factor, standard_name, unit, valid_max, valid_min )
+    , read_access, scale_factor, standard_name, unit, valid_max, valid_min )
 
     IMPLICIT NONE
@@ -273,4 +287,6 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: operation
       INTEGER  , OPTIONAL, INTENT(OUT) :: prec
+      LOGICAL  , OPTIONAL, INTENT(OUT) :: read_access
+      LOGICAL (KIND=C_BOOL) :: read_access_tmp
       REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: scale_factor
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name
@@ -282,5 +298,5 @@
       ( fieldgroup_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled  &
       , field_ref, freq_offset, freq_op, grid_ref, group_ref, level, long_name, name, operation, prec  &
-      , scale_factor, standard_name, unit, valid_max, valid_min )
+      , read_access, scale_factor, standard_name, unit, valid_max, valid_min )
 
   END SUBROUTINE xios(get_fieldgroup_attr_hdl)
@@ -289,5 +305,6 @@
     ( fieldgroup_hdl, add_offset_, axis_ref_, default_value_, detect_missing_value_, domain_ref_  &
     , enabled_, field_ref_, freq_offset_, freq_op_, grid_ref_, group_ref_, level_, long_name_, name_  &
-    , operation_, prec_, scale_factor_, standard_name_, unit_, valid_max_, valid_min_ )
+    , operation_, prec_, read_access_, scale_factor_, standard_name_, unit_, valid_max_, valid_min_  &
+     )
 
     IMPLICIT NONE
@@ -311,4 +328,6 @@
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: operation_
       INTEGER  , OPTIONAL, INTENT(OUT) :: prec_
+      LOGICAL  , OPTIONAL, INTENT(OUT) :: read_access_
+      LOGICAL (KIND=C_BOOL) :: read_access__tmp
       REAL (KIND=8) , OPTIONAL, INTENT(OUT) :: scale_factor_
       CHARACTER(len = *) , OPTIONAL, INTENT(OUT) :: standard_name_
@@ -383,4 +402,9 @@
       ENDIF
 
+      IF (PRESENT(read_access_)) THEN
+        CALL cxios_get_fieldgroup_read_access(fieldgroup_hdl%daddr, read_access__tmp)
+        read_access_ = read_access__tmp
+      ENDIF
+
       IF (PRESENT(scale_factor_)) THEN
         CALL cxios_get_fieldgroup_scale_factor(fieldgroup_hdl%daddr, scale_factor_)
@@ -408,5 +432,5 @@
     ( fieldgroup_id, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled  &
     , field_ref, freq_offset, freq_op, grid_ref, group_ref, level, long_name, name, operation, prec  &
-    , scale_factor, standard_name, unit, valid_max, valid_min )
+    , read_access, scale_factor, standard_name, unit, valid_max, valid_min )
 
     IMPLICIT NONE
@@ -445,4 +469,6 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: prec
       LOGICAL(KIND=C_BOOL) :: prec_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: read_access
+      LOGICAL(KIND=C_BOOL) :: read_access_tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: scale_factor
       LOGICAL(KIND=C_BOOL) :: scale_factor_tmp
@@ -460,5 +486,5 @@
       ( fieldgroup_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled  &
       , field_ref, freq_offset, freq_op, grid_ref, group_ref, level, long_name, name, operation, prec  &
-      , scale_factor, standard_name, unit, valid_max, valid_min )
+      , read_access, scale_factor, standard_name, unit, valid_max, valid_min )
 
   END SUBROUTINE xios(is_defined_fieldgroup_attr)
@@ -467,5 +493,5 @@
     ( fieldgroup_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled  &
     , field_ref, freq_offset, freq_op, grid_ref, group_ref, level, long_name, name, operation, prec  &
-    , scale_factor, standard_name, unit, valid_max, valid_min )
+    , read_access, scale_factor, standard_name, unit, valid_max, valid_min )
 
     IMPLICIT NONE
@@ -503,4 +529,6 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: prec
       LOGICAL(KIND=C_BOOL) :: prec_tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: read_access
+      LOGICAL(KIND=C_BOOL) :: read_access_tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: scale_factor
       LOGICAL(KIND=C_BOOL) :: scale_factor_tmp
@@ -517,5 +545,5 @@
       ( fieldgroup_hdl, add_offset, axis_ref, default_value, detect_missing_value, domain_ref, enabled  &
       , field_ref, freq_offset, freq_op, grid_ref, group_ref, level, long_name, name, operation, prec  &
-      , scale_factor, standard_name, unit, valid_max, valid_min )
+      , read_access, scale_factor, standard_name, unit, valid_max, valid_min )
 
   END SUBROUTINE xios(is_defined_fieldgroup_attr_hdl)
@@ -524,5 +552,6 @@
     ( fieldgroup_hdl, add_offset_, axis_ref_, default_value_, detect_missing_value_, domain_ref_  &
     , enabled_, field_ref_, freq_offset_, freq_op_, grid_ref_, group_ref_, level_, long_name_, name_  &
-    , operation_, prec_, scale_factor_, standard_name_, unit_, valid_max_, valid_min_ )
+    , operation_, prec_, read_access_, scale_factor_, standard_name_, unit_, valid_max_, valid_min_  &
+     )
 
     IMPLICIT NONE
@@ -560,4 +589,6 @@
       LOGICAL, OPTIONAL, INTENT(OUT) :: prec_
       LOGICAL(KIND=C_BOOL) :: prec__tmp
+      LOGICAL, OPTIONAL, INTENT(OUT) :: read_access_
+      LOGICAL(KIND=C_BOOL) :: read_access__tmp
       LOGICAL, OPTIONAL, INTENT(OUT) :: scale_factor_
       LOGICAL(KIND=C_BOOL) :: scale_factor__tmp
@@ -651,4 +682,9 @@
       ENDIF
 
+      IF (PRESENT(read_access_)) THEN
+        read_access__tmp = cxios_is_defined_fieldgroup_read_access(fieldgroup_hdl%daddr)
+        read_access_ = read_access__tmp
+      ENDIF
+
       IF (PRESENT(scale_factor_)) THEN
         scale_factor__tmp = cxios_is_defined_fieldgroup_scale_factor(fieldgroup_hdl%daddr)
Index: /XIOS/trunk/src/node/context.cpp
===================================================================
--- /XIOS/trunk/src/node/context.cpp	(revision 592)
+++ /XIOS/trunk/src/node/context.cpp	(revision 593)
@@ -350,4 +350,5 @@
       this->solveAllRefOfEnabledFields(true);
       this->buildAllExpressionOfEnabledFields();
+      buildAllExpressionOfFieldsWithReadAccess();
     }
 
@@ -382,4 +383,31 @@
      }
    }
+
+  void CContext::findFieldsWithReadAccess(void)
+  {
+    fieldsWithReadAccess.clear();
+    const vector<CField*> allFields = CField::getAll();
+    for (size_t i = 0; i < allFields.size(); ++i)
+    {
+      if (!allFields[i]->read_access.isEmpty() && allFields[i]->read_access.getValue())
+        fieldsWithReadAccess.push_back(allFields[i]);
+    }
+  }
+
+  void CContext::solveAllRefOfFieldsWithReadAccess()
+  {
+    for (size_t i = 0; i < fieldsWithReadAccess.size(); ++i)
+    {
+      fieldsWithReadAccess[i]->solveAllReferenceEnabledField(false);
+      // Ensure that the instant data will be properly saved
+      fieldsWithReadAccess[i]->getInstantData();
+    }
+  }
+
+  void CContext::buildAllExpressionOfFieldsWithReadAccess()
+  {
+    for (size_t i = 0; i < fieldsWithReadAccess.size(); ++i)
+      fieldsWithReadAccess[i]->buildAllExpressionEnabledField();
+  }
 
    void CContext::solveAllInheritance(bool apply)
@@ -638,4 +666,10 @@
       // Search and rebuild all reference object of enabled fields
       this->solveAllRefOfEnabledFields(false);
+
+      // Find all fields with read access from the public API
+      findFieldsWithReadAccess();
+      // and solve the all reference for them
+      solveAllRefOfFieldsWithReadAccess();
+
       isPostProcessed = true;
    }
Index: /XIOS/trunk/src/node/context.hpp
===================================================================
--- /XIOS/trunk/src/node/context.hpp	(revision 592)
+++ /XIOS/trunk/src/node/context.hpp	(revision 593)
@@ -110,4 +110,7 @@
          void solveAllRefOfEnabledFields(bool sendToServer);
          void buildAllExpressionOfEnabledFields();
+         void findFieldsWithReadAccess(void);
+         void solveAllRefOfFieldsWithReadAccess();
+         void buildAllExpressionOfFieldsWithReadAccess();
          void postProcessing();
 
@@ -187,4 +190,7 @@
          std::vector<CFile*> enabledFiles;
 
+         // List of all fields whose instant data is accessible from the public API
+         std::vector<CField*> fieldsWithReadAccess;
+
          // Context root
          static shared_ptr<CContextGroup> root;
Index: /XIOS/trunk/src/node/field.hpp
===================================================================
--- /XIOS/trunk/src/node/field.hpp	(revision 592)
+++ /XIOS/trunk/src/node/field.hpp	(revision 593)
@@ -81,5 +81,5 @@
 
          CArray<double, 1> getData(void) const;
-
+         template <int N> void getData(CArray<double, N>& _data) const;
 
 
Index: /XIOS/trunk/src/node/field_decl.cpp
===================================================================
--- /XIOS/trunk/src/node/field_decl.cpp	(revision 592)
+++ /XIOS/trunk/src/node/field_decl.cpp	(revision 593)
@@ -3,7 +3,10 @@
 namespace xios
 {
-  template void CField::setData<1>(const CArray<double, 1>& _data) ;
-  template void CField::setData<2>(const CArray<double, 2>& _data) ;
-  template void CField::setData<3>(const CArray<double, 3>& _data) ;
+  template void CField::setData<1>(const CArray<double, 1>& _data);
+  template void CField::setData<2>(const CArray<double, 2>& _data);
+  template void CField::setData<3>(const CArray<double, 3>& _data);
 
+  template void CField::getData<1>(CArray<double, 1>& _data) const;
+  template void CField::getData<2>(CArray<double, 2>& _data) const;
+  template void CField::getData<3>(CArray<double, 3>& _data) const;
 }
Index: /XIOS/trunk/src/node/field_impl.hpp
===================================================================
--- /XIOS/trunk/src/node/field_impl.hpp	(revision 592)
+++ /XIOS/trunk/src/node/field_impl.hpp	(revision 593)
@@ -179,4 +179,17 @@
    }
 
+  template <int N>
+  void CField::getData(CArray<double, N>& _data) const
+  {
+    if (!read_access.isEmpty() && read_access.getValue() && hasInstantData)
+    {
+      grid->outputField(instantData, _data);
+    }
+    else
+    {
+      ERROR("void CField::getData(CArray<double, N>& _data) const",
+            << "Impossible to access field data, the field [ id = " << getId() << " ] does not have read access.");
+    }
+  }
 } // namespace xios
 
Index: /XIOS/trunk/src/node/grid.cpp
===================================================================
--- /XIOS/trunk/src/node/grid.cpp	(revision 592)
+++ /XIOS/trunk/src/node/grid.cpp	(revision 593)
@@ -519,4 +519,12 @@
    }
 
+   void CGrid::restoreField_arr
+      (const CArray<double, 1>& stored, double * const data) const
+   {
+      const StdSize size = storeIndex_client.numElements() ;
+
+      for(StdSize i = 0; i < size; i++) data[storeIndex_client(i)] = stored(i) ;
+   }
+
   void CGrid::computeIndexScalarGrid()
   {
Index: /XIOS/trunk/src/node/grid.hpp
===================================================================
--- /XIOS/trunk/src/node/grid.hpp	(revision 592)
+++ /XIOS/trunk/src/node/grid.hpp	(revision 593)
@@ -99,5 +99,7 @@
          /// EntrÃ©es-sorties de champs ///
          template <int n>
-            void inputField(const CArray<double,n>& field, CArray<double,1>& stored) const;
+         void inputField(const CArray<double,n>& field, CArray<double,1>& stored) const;
+         template <int n>
+         void outputField(const CArray<double,1>& stored, CArray<double,n>& field) const;
 
          void inputFieldServer(const std::deque< CArray<double, 1>* > storedClient,
@@ -131,4 +133,5 @@
          /// EntrÃ©es-sorties de champs (interne) ///
          void storeField_arr(const double * const data, CArray<double,1>& stored) const;
+         void restoreField_arr(const CArray<double,1>& stored, double * const data) const;
 
          /// Traitements protÃ©gÃ©s ///
@@ -183,5 +186,4 @@
          std::deque< CArray<int, 1>* > storeIndex ;
         CArray<int, 1>  storeIndex_client ;
-
 
          map<int, CArray<int, 1>* >  storeIndex_toSrv ;
@@ -242,4 +244,15 @@
                 << "The array of data has not the good size !")
       this->storeField_arr(field.dataFirst(), stored) ;
+   }
+
+   template <int n>
+   void CGrid::outputField(const CArray<double,1>& stored, CArray<double,n>& field) const
+   {
+      if (this->getDataSize() != field.numElements())
+         ERROR("void CGrid::outputField(const CArray<double,1>& stored, CArray<double,n>& field) const",
+                << "[ Size of the data = " << this->getDataSize() << ", "
+                << "Output data size = "   << field.numElements() << " ] "
+                << "The ouput array does not have not the right size!")
+      this->restoreField_arr(stored, field.dataFirst());
    }
 
