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