[274] | 1 | /* ************************************************************************** * |
---|
| 2 | * Copyright © IPSL/LSCE, XMLIOServer, Avril 2010 - Octobre 2011 * |
---|
| 3 | * ************************************************************************** */ |
---|
| 4 | |
---|
| 5 | #include <boost/multi_array.hpp> |
---|
| 6 | #include <boost/shared_ptr.hpp> |
---|
[286] | 7 | #include <string> |
---|
| 8 | #include <iostream> |
---|
[274] | 9 | |
---|
[286] | 10 | |
---|
[274] | 11 | #include "xmlioserver.hpp" |
---|
[286] | 12 | #include "oasis_cinterface.hpp" |
---|
[274] | 13 | |
---|
| 14 | #include "attribute_template_impl.hpp" |
---|
| 15 | #include "object_template_impl.hpp" |
---|
| 16 | #include "group_template_impl.hpp" |
---|
| 17 | |
---|
| 18 | #include "icutil.hpp" |
---|
[286] | 19 | #include "mpi_manager.hpp" |
---|
| 20 | #include "buffer.hpp" |
---|
[300] | 21 | #include "cxios.hpp" |
---|
| 22 | #include "client_ym.hpp" |
---|
| 23 | #include "field.hpp" |
---|
[274] | 24 | |
---|
| 25 | extern "C" |
---|
| 26 | { |
---|
| 27 | // /////////////////////////////// Définitions ////////////////////////////// // |
---|
| 28 | |
---|
| 29 | // ----------------------- Redéfinition de types ---------------------------- |
---|
| 30 | |
---|
| 31 | typedef enum { NETCDF4 = 0 } XFileType; |
---|
| 32 | |
---|
| 33 | typedef xmlioserver::tree::CContext * XContextPtr; |
---|
| 34 | |
---|
| 35 | // -------------------- Traitement des données ------------------------------ |
---|
[300] | 36 | void cxios_init_server(void) |
---|
| 37 | { |
---|
| 38 | CXios::initServerSide(); |
---|
| 39 | } |
---|
| 40 | |
---|
| 41 | void cxios_init_client(const char * client_id , int len_client_id, MPI_Fint* f_local_comm, MPI_Fint* f_return_comm ) |
---|
| 42 | { |
---|
| 43 | std::string str; |
---|
| 44 | MPI_Comm local_comm ; |
---|
| 45 | MPI_Comm return_comm ; |
---|
| 46 | |
---|
| 47 | if (!cstr2string(client_id, len_client_id, str)) return; |
---|
| 48 | |
---|
| 49 | int initialized ; |
---|
| 50 | MPI_Initialized(&initialized) ; |
---|
| 51 | if (initialized) local_comm=MPI_Comm_f2c(*f_local_comm) ; |
---|
| 52 | else local_comm=MPI_COMM_NULL ; |
---|
| 53 | CXios::initClientSide(str,local_comm,return_comm); |
---|
| 54 | *f_return_comm=MPI_Comm_c2f(return_comm) ; |
---|
| 55 | } |
---|
| 56 | |
---|
| 57 | void cxios_context_initialize(const char * context_id , int len_context_id, MPI_Fint* f_comm) |
---|
| 58 | { |
---|
| 59 | std::string str; |
---|
| 60 | MPI_Comm comm ; |
---|
| 61 | |
---|
| 62 | if (!cstr2string(context_id, len_context_id, str)) return; |
---|
| 63 | comm=MPI_Comm_f2c(*f_comm) ; |
---|
| 64 | ym::CClient::registerContext(context_id,comm) ; |
---|
| 65 | } |
---|
| 66 | |
---|
| 67 | void cxios_context_close_definition() |
---|
| 68 | { |
---|
| 69 | boost::shared_ptr<CContext> context = |
---|
| 70 | CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId()); |
---|
| 71 | context->closeDefinition() ; |
---|
| 72 | } |
---|
| 73 | |
---|
| 74 | void cxios_context_finalize() |
---|
| 75 | { |
---|
| 76 | boost::shared_ptr<CContext> context = |
---|
| 77 | CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId()); |
---|
| 78 | context->finalize() ; |
---|
| 79 | } |
---|
[274] | 80 | |
---|
[300] | 81 | void cxios_finalize() |
---|
| 82 | { |
---|
| 83 | CXios::clientFinalize() ; |
---|
| 84 | } |
---|
| 85 | |
---|
[312] | 86 | |
---|
[300] | 87 | |
---|
[274] | 88 | // ---------------------- Ecriture des données ------------------------------ |
---|
| 89 | |
---|
[286] | 90 | void cxios_write_data_k81(const char * fieldid, int fieldid_size, double * data_k8, int data_Xsize) |
---|
[274] | 91 | { |
---|
| 92 | std::string fieldid_str; |
---|
| 93 | boost::shared_ptr<CContext> context = |
---|
| 94 | CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId()); |
---|
| 95 | boost::shared_ptr<data::CDataTreatment> dtreat = context->getDataTreatment(); |
---|
| 96 | if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; |
---|
| 97 | |
---|
| 98 | // boost::const_multi_array_ref<double, 1> array_(data_k8, |
---|
| 99 | // boost::extents [data_Xsize], |
---|
| 100 | // boost::fortran_storage_order()); |
---|
| 101 | ARRAY(double, 1) data(new CArray<double, 1>(boost::extents [data_Xsize])); |
---|
| 102 | std::copy(data_k8, &(data_k8[data->num_elements()]), data->data()); |
---|
[300] | 103 | |
---|
| 104 | // dtreat->write_data(fieldid_str, data); |
---|
| 105 | CField::get(fieldid)->setData(data) ; |
---|
[274] | 106 | } |
---|
| 107 | |
---|
[286] | 108 | void cxios_write_data_k82(const char * fieldid, int fieldid_size, double * data_k8, int data_Xsize, int data_Ysize) |
---|
[274] | 109 | { |
---|
| 110 | std::string fieldid_str; |
---|
| 111 | boost::shared_ptr<CContext> context = |
---|
| 112 | CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId()); |
---|
| 113 | boost::shared_ptr<data::CDataTreatment> dtreat = context->getDataTreatment(); |
---|
| 114 | if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; |
---|
| 115 | |
---|
| 116 | // boost::const_multi_array_ref<double, 2> array_(data_k8, |
---|
| 117 | // boost::extents [data_Xsize][data_Ysize], |
---|
| 118 | // boost::fortran_storage_order()); |
---|
| 119 | ARRAY(double, 2) data(new CArray<double, 2>(boost::extents [data_Xsize][data_Ysize])); |
---|
| 120 | std::copy(data_k8, &(data_k8[data->num_elements()]), data->data()); |
---|
[300] | 121 | // dtreat->write_data(fieldid_str, data); |
---|
| 122 | CField::get(fieldid)->setData(data) ; |
---|
[274] | 123 | } |
---|
| 124 | |
---|
[286] | 125 | void cxios_write_data_k83(const char * fieldid, int fieldid_size, double * data_k8, int data_Xsize, int data_Ysize, int data_Zsize) |
---|
[274] | 126 | { |
---|
| 127 | std::string fieldid_str; |
---|
| 128 | boost::shared_ptr<CContext> context = |
---|
| 129 | CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId()); |
---|
| 130 | boost::shared_ptr<data::CDataTreatment> dtreat = context->getDataTreatment(); |
---|
| 131 | if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; |
---|
| 132 | |
---|
| 133 | // boost::const_multi_array_ref<double, 3> array_(data_k8, |
---|
| 134 | // boost::extents [data_Xsize][data_Ysize][data_Zsize], |
---|
| 135 | // boost::fortran_storage_order()); |
---|
| 136 | ARRAY(double, 3) data(new CArray<double, 3>(boost::extents [data_Xsize][data_Ysize][data_Zsize])); |
---|
| 137 | std::copy(data_k8, &(data_k8[data->num_elements()]), data->data()); |
---|
[300] | 138 | // dtreat->write_data(fieldid_str, data); |
---|
| 139 | CField::get(fieldid)->setData(data) ; |
---|
| 140 | |
---|
[274] | 141 | } |
---|
| 142 | |
---|
[286] | 143 | void cxios_write_data_k41(const char * fieldid, int fieldid_size, float * data_k4, int data_Xsize) |
---|
[274] | 144 | { |
---|
| 145 | std::string fieldid_str; |
---|
| 146 | boost::shared_ptr<CContext> context = |
---|
| 147 | CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId()); |
---|
| 148 | boost::shared_ptr<data::CDataTreatment> dtreat = context->getDataTreatment(); |
---|
| 149 | if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; |
---|
| 150 | |
---|
| 151 | // boost::const_multi_array_ref<float, 1> array_(data_k4, |
---|
| 152 | // boost::extents [data_Xsize], |
---|
| 153 | // boost::fortran_storage_order()); |
---|
[300] | 154 | // ARRAY(float, 1) data(new CArray<float, 1>(boost::extents [data_Xsize])); |
---|
| 155 | // std::copy(data_k4, &(data_k4[data->num_elements()]), data->data()); |
---|
| 156 | // dtreat->write_data(fieldid_str, data); |
---|
| 157 | ARRAY(double, 1) data(new CArray<double, 1>(boost::extents [data_Xsize])); |
---|
| 158 | double* ptr_data=data->data() ; |
---|
| 159 | for(int i=0;i<data->num_elements();i++) ptr_data[i]=data_k4[i]; |
---|
| 160 | CField::get(fieldid)->setData(data) ; |
---|
[274] | 161 | } |
---|
| 162 | |
---|
[286] | 163 | void cxios_write_data_k42(const char * fieldid, int fieldid_size, float * data_k4, int data_Xsize, int data_Ysize) |
---|
[274] | 164 | { |
---|
| 165 | std::string fieldid_str; |
---|
| 166 | boost::shared_ptr<CContext> context = |
---|
| 167 | CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId()); |
---|
| 168 | boost::shared_ptr<data::CDataTreatment> dtreat = context->getDataTreatment(); |
---|
| 169 | if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; |
---|
| 170 | |
---|
| 171 | // boost::const_multi_array_ref<float, 2> array_(data_k4, |
---|
| 172 | // boost::extents [data_Xsize][data_Ysize], |
---|
| 173 | // boost::fortran_storage_order()); |
---|
[300] | 174 | // ARRAY(float, 2) data(new CArray<float, 2>(boost::extents [data_Xsize][data_Ysize])); |
---|
| 175 | // std::copy(data_k4, &(data_k4[data->num_elements()]), data->data()); |
---|
| 176 | // dtreat->write_data(fieldid_str, data); |
---|
| 177 | ARRAY(double, 2) data(new CArray<double, 2>(boost::extents [data_Xsize][data_Ysize])); |
---|
| 178 | double* ptr_data=data->data() ; |
---|
| 179 | for(int i=0;i<data->num_elements();i++) ptr_data[i]=data_k4[i]; |
---|
| 180 | CField::get(fieldid)->setData(data) ; |
---|
[274] | 181 | } |
---|
| 182 | |
---|
[286] | 183 | void cxios_write_data_k43(const char * fieldid, int fieldid_size, float * data_k4, int data_Xsize, int data_Ysize, int data_Zsize) |
---|
[274] | 184 | { |
---|
| 185 | std::string fieldid_str; |
---|
| 186 | boost::shared_ptr<CContext> context = |
---|
| 187 | CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId()); |
---|
| 188 | boost::shared_ptr<data::CDataTreatment> dtreat = context->getDataTreatment(); |
---|
| 189 | if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; |
---|
| 190 | |
---|
| 191 | // boost::const_multi_array_ref<float, 3> array_(data_k4, |
---|
| 192 | // boost::extents [data_Xsize][data_Ysize][data_Zsize], |
---|
| 193 | // boost::fortran_storage_order()); |
---|
[300] | 194 | // ARRAY(float, 3) data(new CArray<float, 3>(boost::extents [data_Xsize][data_Ysize][data_Zsize])); |
---|
| 195 | // std::copy(data_k4, &(data_k4[data->num_elements()]), data->data()); |
---|
| 196 | // dtreat->write_data(fieldid_str, data); |
---|
| 197 | ARRAY(double, 3) data(new CArray<double, 3>(boost::extents [data_Xsize][data_Ysize][data_Zsize])); |
---|
| 198 | double* ptr_data=data->data() ; |
---|
| 199 | for(int i=0;i<data->num_elements();i++) ptr_data[i]=data_k4[i]; |
---|
| 200 | CField::get(fieldid)->setData(data) ; |
---|
| 201 | } |
---|
[274] | 202 | |
---|
| 203 | } // extern "C" |
---|