Changeset 286 for XMLIO_V2/dev/common/src/xmlio/output/nc4_data_output.cpp
- Timestamp:
- 10/21/11 19:01:35 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XMLIO_V2/dev/common/src/xmlio/output/nc4_data_output.cpp
r278 r286 29 29 30 30 CNc4DataOutput::CNc4DataOutput 31 (const StdString & filename, bool exist, bool multigroup, MPI_Comm comm_server)31 (const StdString & filename, bool exist, MPI_Comm comm_server,bool multifile) 32 32 : SuperClass() 33 , SuperClassWriter(filename, exist, &comm_server )33 , SuperClassWriter(filename, exist, &comm_server,multifile) 34 34 , comm_server(comm_server) 35 35 , filename(filename) 36 36 { 37 37 StdString timeid = StdString("time_counter"); 38 SuperClass::type = (multigroup) ? MULTI_GROUP : ONE_FILE; 38 39 SuperClass::type = (multifile) ? MULTI_FILE : ONE_FILE; 40 39 41 if (!exist) 40 42 SuperClassWriter::addDimension(timeid); 41 43 } 42 44 43 CNc4DataOutput::CNc4DataOutput44 (const StdString & filename, bool exist, bool multigroup, comm::MPIComm comm_server, bool)45 : SuperClass()46 , SuperClassWriter(filename, exist, &comm_server, true)47 , filename(filename)48 {49 StdString timeid = StdString("time_counter");50 SuperClass::type = (multigroup) ? MULTI_GROUP : ONE_FILE;51 if (!exist)52 SuperClassWriter::addDimension(timeid);53 }54 45 55 46 CNc4DataOutput::~CNc4DataOutput(void) … … 70 61 domain->checkAttributes(); 71 62 72 if (domain->isEmpty()) return;63 // if (domain->isEmpty()) return; 73 64 74 65 std::vector<StdString> dim0, dim1; … … 90 81 bool isCurvilinear = (domain->lonvalue.getValue()->size() == ssize); 91 82 92 if (comm::CMPIManager::GetCommSize(CXIOSManager::Comm_Server) > 1)93 {94 SuperClassWriter::addDimension(lonid, domain->zoom_ni.getValue());95 SuperClassWriter::addDimension(latid, domain->zoom_nj.getValue());96 }97 98 if (isCurvilinear)99 {100 dim0.push_back(latid_loc); dim0.push_back(lonid_loc);101 lonid = StdString("nav_lon_").append(domid);102 latid = StdString("nav_lat_").append(domid);103 }104 else105 {106 dim0.push_back(latid_loc);107 dim1.push_back(lonid_loc);108 }109 83 switch (SuperClass::type) 110 84 { 111 85 case (MULTI_FILE) : 112 86 { 87 if (domain->isEmpty()) return; 88 89 if (comm::CMPIManager::GetCommSize(CXIOSManager::Comm_Server) > 1) 90 { 91 SuperClassWriter::addDimension(lonid, domain->zoom_ni.getValue()); 92 SuperClassWriter::addDimension(latid, domain->zoom_nj.getValue()); 93 } 94 95 if (isCurvilinear) 96 { 97 dim0.push_back(latid_loc); dim0.push_back(lonid_loc); 98 lonid = StdString("nav_lon_").append(domid); 99 latid = StdString("nav_lat_").append(domid); 100 } 101 else 102 { 103 dim0.push_back(latid_loc); 104 dim1.push_back(lonid_loc); 105 } 106 113 107 SuperClassWriter::addDimension(lonid_loc, domain->zoom_ni_loc.getValue()); 114 108 SuperClassWriter::addDimension(latid_loc, domain->zoom_nj_loc.getValue()); … … 133 127 } 134 128 this->writeAxisAttributes 135 (l atid, "X", "longitude", "Longitude", "degrees_east", domid);129 (lonid, "X", "longitude", "Longitude", "degrees_east", domid); 136 130 this->writeAxisAttributes 137 (l onid, "Y", "latitude", "Latitude", "degrees_north", domid);131 (latid, "Y", "latitude", "Latitude", "degrees_north", domid); 138 132 139 133 dim0.clear(); … … 164 158 break; 165 159 } 160 case (ONE_FILE) : 161 { 162 SuperClassWriter::addDimension(lonid, domain->zoom_ni.getValue()); 163 SuperClassWriter::addDimension(latid, domain->zoom_nj.getValue()); 164 165 166 if (isCurvilinear) 167 { 168 dim0.push_back(latid); dim0.push_back(lonid); 169 lonid = StdString("nav_lon_").append(domid); 170 latid = StdString("nav_lat_").append(domid); 171 SuperClassWriter::addVariable(latid, NC_FLOAT, dim0); 172 SuperClassWriter::addVariable(lonid, NC_FLOAT, dim0); 173 } 174 else 175 { 176 dim0.push_back(latid); 177 dim1.push_back(lonid); 178 SuperClassWriter::addVariable(latid, NC_FLOAT, dim0); 179 SuperClassWriter::addVariable(lonid, NC_FLOAT, dim1); 180 } 181 this->writeAxisAttributes 182 (latid, "X", "longitude", "Longitude", "degrees_east", domid); 183 this->writeAxisAttributes 184 (lonid, "Y", "latitude", "Latitude", "degrees_north", domid); 185 186 187 SuperClassWriter::definition_end(); 188 std::vector<StdSize> start(2) ; 189 std::vector<StdSize> count(2) ; 190 if (domain->isEmpty()) 191 { 192 start[0]=0 ; start [1]=0 ; 193 count[0]=0 ; count[1]=0 ; 194 } 195 else 196 { 197 start[1]=domain->zoom_ibegin_loc.getValue()+domain->ibegin.getValue()-1-domain->zoom_ibegin.getValue() ; start [0]=domain->zoom_jbegin_loc.getValue()+domain->jbegin.getValue()-1-domain->zoom_jbegin.getValue() ; 198 count[1]=domain->zoom_ni_loc.getValue() ; count[0]=domain->zoom_nj_loc.getValue() ; 199 } 200 201 SuperClassWriter::writeData(domain->latvalue.getValue(), latid, true, 0,&start,&count); 202 SuperClassWriter::writeData(domain->lonvalue.getValue(), lonid, true, 0,&start,&count); 203 SuperClassWriter::definition_start(); 204 205 break; 206 } 166 207 default : 167 208 ERROR("CNc4DataOutput::writeDomain(domain)", … … 183 224 SuperClassWriter::addDimension(axisid, axis->size.getValue()); 184 225 dims.push_back(axisid); 185 226 186 227 switch (SuperClass::type) 187 228 { 229 case (MULTI_FILE ) : 230 {} 188 231 case (ONE_FILE) : 189 case (MULTI_FILE) :190 232 { 191 233 SuperClassWriter::addVariable(axisid, NC_FLOAT, dims); … … 228 270 boost::shared_ptr<CDomain> domain = 229 271 CObjectFactory::GetObject<CDomain>(grid->domain_ref.getValue()); 230 231 if (domain->isEmpty()) return; 272 273 if (domain->isEmpty()) 274 if (SuperClass::type==MULTI_FILE) return ; 232 275 233 276 StdString timeid = StdString("time_counter"); … … 291 334 dims.push_back(latid_loc); 292 335 dims.push_back(lonid_loc); 293 SuperClassWriter::addVariable(fieldid, type, dims); 294 295 if (!field->standard_name.isEmpty()) 296 SuperClassWriter::addAttribute 297 ("standard_name", field->standard_name.getValue(), &fieldid); 298 299 if (!field->long_name.isEmpty()) 300 SuperClassWriter::addAttribute 301 ("long_name", field->long_name.getValue(), &fieldid); 302 303 if (!field->unit.isEmpty()) 304 SuperClassWriter::addAttribute 305 ("units", field->unit.getValue(), &fieldid); 306 307 SuperClassWriter::addAttribute 308 ("online_operation", field->operation.getValue(), &fieldid); 309 310 if (wtime) 311 { 312 SuperClassWriter::addAttribute 313 ("interval_operation", field->freq_op.getValue(), &fieldid); 314 SuperClassWriter::addAttribute 315 ("interval_write", field->getRelFile()->output_freq.getValue(), &fieldid); 316 } 317 318 if (!field->default_value.isEmpty()) 319 { 320 double default_value = field->default_value.getValue(); 321 float fdefault_value = (float)default_value; 322 if (type == NC_DOUBLE) 323 SuperClassWriter::setDefaultValue(fieldid, &default_value); 324 else 325 SuperClassWriter::setDefaultValue(fieldid, &fdefault_value); 326 } 327 else 328 { 329 double * default_value = NULL; 330 SuperClassWriter::setDefaultValue(fieldid, default_value); 331 } 332 333 { // Ecriture des coordonnées 334 335 StdString coordstr; //boost::algorithm::join(coodinates, " ") 336 std::vector<StdString>::iterator 337 itc = coodinates.begin(), endc = coodinates.end(); 338 339 for (; itc!= endc; itc++) 340 { 341 StdString & coord = *itc; 342 if (itc+1 != endc) 343 coordstr.append(coord).append(" "); 344 else coordstr.append(coord); 345 } 346 347 SuperClassWriter::addAttribute("coordinates", coordstr, &fieldid); 348 349 } 350 336 break ; 337 } 338 case (ONE_FILE) : 339 { 340 dims.push_back(latid); 341 dims.push_back(lonid); 351 342 break; 352 343 } … … 356 347 << " not implemented yet !"); 357 348 } 349 350 SuperClassWriter::addVariable(fieldid, type, dims); 351 352 if (!field->standard_name.isEmpty()) 353 SuperClassWriter::addAttribute 354 ("standard_name", field->standard_name.getValue(), &fieldid); 355 356 if (!field->long_name.isEmpty()) 357 SuperClassWriter::addAttribute 358 ("long_name", field->long_name.getValue(), &fieldid); 359 360 if (!field->unit.isEmpty()) 361 SuperClassWriter::addAttribute 362 ("units", field->unit.getValue(), &fieldid); 363 364 SuperClassWriter::addAttribute 365 ("online_operation", field->operation.getValue(), &fieldid); 366 367 if (wtime) 368 { 369 SuperClassWriter::addAttribute 370 ("interval_operation", field->freq_op.getValue(), &fieldid); 371 SuperClassWriter::addAttribute 372 ("interval_write", field->getRelFile()->output_freq.getValue(), &fieldid); 373 } 374 375 if (!field->default_value.isEmpty()) 376 { 377 double default_value = field->default_value.getValue(); 378 float fdefault_value = (float)default_value; 379 if (type == NC_DOUBLE) 380 SuperClassWriter::setDefaultValue(fieldid, &default_value); 381 else 382 SuperClassWriter::setDefaultValue(fieldid, &fdefault_value); 383 } 384 else 385 { 386 double * default_value = NULL; 387 SuperClassWriter::setDefaultValue(fieldid, default_value); 388 } 389 390 { // Ecriture des coordonnées 391 392 StdString coordstr; //boost::algorithm::join(coodinates, " ") 393 std::vector<StdString>::iterator 394 itc = coodinates.begin(), endc = coodinates.end(); 395 396 for (; itc!= endc; itc++) 397 { 398 StdString & coord = *itc; 399 if (itc+1 != endc) 400 coordstr.append(coord).append(" "); 401 else coordstr.append(coord); 402 } 403 404 SuperClassWriter::addAttribute("coordinates", coordstr, &fieldid); 405 406 } 407 358 408 } 359 409 … … 373 423 } 374 424 425 void CNc4DataOutput::closeFile_ (void) 426 { 427 std::cout<<"--> Close file "<<filename<<std::endl ; 428 SuperClassWriter::close() ; 429 } 430 375 431 //--------------------------------------------------------------- 376 432 … … 395 451 boost::shared_ptr<CGrid> grid = 396 452 CObjectFactory::GetObject<CGrid>(field->grid_ref.getValue()); 453 boost::shared_ptr<CDomain> domain = 454 CObjectFactory::GetObject<CDomain>(grid->domain_ref.getValue()); 455 456 if(SuperClass::type==MULTI_FILE) if (domain->isEmpty()) return; 457 458 397 459 StdString fieldid = (!field->name.isEmpty()) 398 460 ? field->name.getValue() … … 412 474 if (grid->hasAxis()) // 3D 413 475 { 476 boost::shared_ptr<CAxis> axis = CObjectFactory::GetObject<CAxis>(grid->axis_ref.getValue()); 414 477 ARRAY(double, 3) field_data3D (new CArray<double,3>(grid->getLocalShape()/*, boost::c_storage_order()*/)); 415 478 grid->outputField(field_data, field_data3D); 416 SuperClassWriter::writeData(field_data3D, fieldid, true, field->getNStep()-1); 417 SuperClassWriter::writeData(time_data, oss.str(), true, field->getNStep()-1); 479 switch (SuperClass::type) 480 { 481 case (MULTI_FILE) : 482 { 483 SuperClassWriter::writeData(field_data3D, fieldid, true, field->getNStep()-1); 484 SuperClassWriter::writeData(time_data, oss.str(), true, field->getNStep()-1); 485 break ; 486 } 487 case (ONE_FILE) : 488 { 489 std::vector<StdSize> start(3) ; 490 std::vector<StdSize> count(3) ; 491 if (domain->isEmpty()) 492 { 493 start[0]=0 ; start[1]=0 ; start[2]=0 ; 494 count[0]=0 ; count[1]=0 ; start[2]=0 ; 495 } 496 else 497 { 498 // start[2]=domain->zoom_ibegin_loc.getValue()-domain->zoom_ibegin.getValue() ; start [1]=domain->zoom_jbegin_loc.getValue()-domain->zoom_jbegin.getValue() ; start[0]=0 ; 499 start[2]=domain->zoom_ibegin_loc.getValue()+domain->ibegin.getValue()-1-domain->zoom_ibegin.getValue() ; start [1]=domain->zoom_jbegin_loc.getValue()+domain->jbegin.getValue()-1-domain->zoom_jbegin.getValue() ; start[0]=0 ; 500 count[2]=domain->zoom_ni_loc.getValue() ; count[1]=domain->zoom_nj_loc.getValue() ; count[0] = axis->size.getValue(); 501 } 502 SuperClassWriter::writeData(field_data3D, fieldid, true, field->getNStep()-1,&start,&count ); 503 SuperClassWriter::writeData(time_data, oss.str(), true, field->getNStep()-1 ); 504 break; 505 } 506 } 418 507 419 508 } … … 422 511 ARRAY(double, 2) field_data2D (new CArray<double, 2>(grid->getLocalShape()/*, boost::c_storage_order()*/)); 423 512 grid->outputField(field_data, field_data2D); 424 SuperClassWriter::writeData(field_data2D, fieldid, true, field->getNStep()-1); 425 SuperClassWriter::writeData(time_data, oss.str(), true, field->getNStep()-1); 513 switch (SuperClass::type) 514 { 515 case (MULTI_FILE) : 516 { 517 SuperClassWriter::writeData(field_data2D, fieldid, true, field->getNStep()-1); 518 SuperClassWriter::writeData(time_data, oss.str(), true, field->getNStep()-1); 519 break; 520 } 521 case (ONE_FILE) : 522 { 523 std::vector<StdSize> start(2) ; 524 std::vector<StdSize> count(2) ; 525 if (domain->isEmpty()) 526 { 527 start[0]=0 ; start[1]=0 ; 528 count[0]=0 ; count[1]=0 ; 529 } 530 else 531 { 532 start[1]=domain->zoom_ibegin_loc.getValue()+domain->ibegin.getValue()-1-domain->zoom_ibegin.getValue() ; start [0]=domain->zoom_jbegin_loc.getValue()+domain->jbegin.getValue()-1-domain->zoom_jbegin.getValue() ; 533 count[1]=domain->zoom_ni_loc.getValue() ; count[0]=domain->zoom_nj_loc.getValue() ; 534 } 535 SuperClassWriter::writeData(field_data2D, fieldid, true, field->getNStep()-1,&start,&count); 536 SuperClassWriter::writeData(time_data, oss.str(), true, field->getNStep()-1); 537 break; 538 539 } 540 } 426 541 } 427 542 }
Note: See TracChangeset
for help on using the changeset viewer.