Changeset 633 for XIOS/trunk/src/output/nc4_data_output.cpp
- Timestamp:
- 07/09/15 14:05:43 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/trunk/src/output/nc4_data_output.cpp
r631 r633 603 603 int zoom_size_srv = axis->zoom_size_srv; 604 604 int zoom_begin_srv = axis->zoom_begin_srv; 605 StdSizezoom_size = (MULTI_FILE == SuperClass::type) ? zoom_size_srv605 int zoom_size = (MULTI_FILE == SuperClass::type) ? zoom_size_srv 606 606 : axis->global_zoom_size; 607 StdSizezoom_begin = (MULTI_FILE == SuperClass::type) ? zoom_begin_srv607 int zoom_begin = (MULTI_FILE == SuperClass::type) ? zoom_begin_srv 608 608 : axis->global_zoom_begin; 609 609 610 if ((0 == zoom_size_srv) && (MULTI_FILE == SuperClass::type)) return; 610 611 611 612 std::vector<StdString> dims; … … 615 616 SuperClassWriter::addDimension(axisid, zoom_size); 616 617 dims.push_back(axisid); 617 618 SuperClassWriter::addVariable(axisid, NC_FLOAT, dims); 619 620 if (!axis->name.isEmpty()) 621 SuperClassWriter::addAttribute("name", axis->name.getValue(), &axisid); 622 623 if (!axis->standard_name.isEmpty()) 624 SuperClassWriter::addAttribute("standard_name", axis->standard_name.getValue(), &axisid); 625 626 if (!axis->long_name.isEmpty()) 627 SuperClassWriter::addAttribute("long_name", axis->long_name.getValue(), &axisid); 628 629 if (!axis->unit.isEmpty()) 630 SuperClassWriter::addAttribute("units", axis->unit.getValue(), &axisid); 631 632 if (!axis->positive.isEmpty()) 633 { 634 SuperClassWriter::addAttribute("axis", string("Z"), &axisid); 635 SuperClassWriter::addAttribute("positive", 636 (axis->positive == CAxis::positive_attr::up) ? string("up") : string("down"), 637 &axisid); 638 } 639 640 StdString axisBoundsId = axisid + "_bounds"; 641 if (!axis->bounds.isEmpty()) 642 { 643 dims.push_back("axis_nbounds"); 644 SuperClassWriter::addVariable(axisBoundsId, NC_FLOAT, dims); 645 SuperClassWriter::addAttribute("bounds", axisBoundsId, &axisid); 646 } 647 648 SuperClassWriter::definition_end(); 618 649 switch (SuperClass::type) 619 650 { 620 651 case MULTI_FILE: 652 { 653 CArray<double,1> axis_value(zoom_size_srv); 654 for (int i = 0; i < zoom_size_srv; i++) axis_value(i) = axis->value_srv(i); 655 SuperClassWriter::writeData(axis_value, axisid, isCollective, 0); 656 657 if (!axis->bounds.isEmpty()) 658 { 659 CArray<double,2> axisBounds(2, zoom_size_srv); 660 for (int i = 0; i < zoom_size_srv; i++) 661 { 662 axisBounds(0, i) = axis->bound_srv(i, 0); 663 axisBounds(1, i) = axis->bound_srv(i, 1); 664 } 665 SuperClassWriter::writeData(axisBounds, axisBoundsId, isCollective, 0); 666 } 667 668 SuperClassWriter::definition_start(); 669 670 break; 671 } 621 672 case ONE_FILE: 622 673 { 623 SuperClassWriter::addVariable(axisid, NC_FLOAT, dims); 624 625 if (!axis->name.isEmpty()) 626 SuperClassWriter::addAttribute("name", axis->name.getValue(), &axisid); 627 628 if (!axis->standard_name.isEmpty()) 629 SuperClassWriter::addAttribute("standard_name", axis->standard_name.getValue(), &axisid); 630 631 if (!axis->long_name.isEmpty()) 632 SuperClassWriter::addAttribute("long_name", axis->long_name.getValue(), &axisid); 633 634 if (!axis->unit.isEmpty()) 635 SuperClassWriter::addAttribute("units", axis->unit.getValue(), &axisid); 636 637 if (!axis->positive.isEmpty()) 638 { 639 SuperClassWriter::addAttribute("axis", string("Z"), &axisid); 640 SuperClassWriter::addAttribute("positive", 641 (axis->positive == CAxis::positive_attr::up) ? string("up") : string("down"), 642 &axisid); 643 } 644 645 StdString axisBoundsId = axisid + "_bounds"; 674 CArray<double,1> axis_value(zoom_size_srv); 675 axis_value = axis->value_srv; 676 677 std::vector<StdSize> start(1) ; 678 std::vector<StdSize> count(1) ; 679 start[0] = zoom_begin_srv-axis->global_zoom_begin; 680 count[0] = zoom_size_srv; 681 SuperClassWriter::writeData(axis_value, axisid, isCollective, 0, &start, &count); 682 646 683 if (!axis->bounds.isEmpty()) 647 684 { 648 dims.push_back("axis_nbounds"); 649 SuperClassWriter::addVariable(axisBoundsId, NC_FLOAT, dims); 650 SuperClassWriter::addAttribute("bounds", axisBoundsId, &axisid); 651 } 652 653 SuperClassWriter::definition_end(); 654 655 CArray<double,1> axis_value(zoom_size); 656 for (int i = 0; i < zoom_size_srv; i++) axis_value(i) = axis->value(i + zoom_begin_srv); 657 SuperClassWriter::writeData(axis_value, axisid, isCollective, 0); 658 659 if (!axis->bounds.isEmpty()) 660 { 661 CArray<double,2> axisBounds(2, zoom_size); 662 for (int i = 0; i < zoom_size_srv; i++) 685 CArray<double,2> axisBounds(2, zoom_size_srv); 686 for (int i = 0; i < zoom_size_srv; ++i) 663 687 { 664 axisBounds(0, i ) = axis->bounds(i + zoom_begin_srv, 0);665 axisBounds(1, i ) = axis->bounds(i + zoom_begin_srv, 1);688 axisBounds(0, i+zoom_begin_srv) = axis->bound_srv(i, 0); 689 axisBounds(1, i+zoom_begin_srv) = axis->bound_srv(i, 1); 666 690 } 667 SuperClassWriter::writeData(axisBounds, axisBoundsId, isCollective, 0 );691 SuperClassWriter::writeData(axisBounds, axisBoundsId, isCollective, 0, &start, &count); 668 692 } 669 693 … … 940 964 } 941 965 942 943 // void CNc4DataOutput::writeField_(CField* field)944 // {945 // CContext* context = CContext::getCurrent() ;946 // CContextServer* server=context->server ;947 //948 // std::vector<StdString> dims, coodinates;949 // CGrid* grid = field->grid;950 // CDomain* domain = grid->domain;951 //952 // if (domain->isEmpty())953 // if (SuperClass::type==MULTI_FILE) return ;954 //955 // StdString timeid = StdString("time_counter");956 // StdString domid = (!domain->name.isEmpty())957 // ? domain->name.getValue() : domain->getId();958 // StdString appendDomid = (singleDomain) ? "" : "_"+domid ;959 //960 //// bool isCurvilinear = domain->isCurvilinear ;961 //// bool isCurvilinear = (domain->type == CDomain::type_attr::curvilinear) ;962 //963 // StdString dimXid,dimYid ;964 //965 // switch (domain->type)966 // {967 // case CDomain::type_attr::curvilinear :968 // dimXid = StdString("x").append(appendDomid);969 // dimYid = StdString("y").append(appendDomid);970 // break ;971 // case CDomain::type_attr::regular :972 // dimXid = StdString("lon").append(appendDomid);973 // dimYid = StdString("lat").append(appendDomid);974 // break ;975 // case CDomain::type_attr::unstructured :976 // dimXid = StdString("cell").append(appendDomid);977 // break ;978 // }979 //980 ///*981 // StdString lonid_loc = (server->intraCommSize > 1)982 // ? StdString("lon").append(appendDomid).append("_local")983 // : lonid;984 // StdString latid_loc = (server->intraCommSize > 1)985 // ? StdString("lat").append(appendDomid).append("_local")986 // : latid;987 //*/988 // StdString fieldid = (!field->name.isEmpty())989 // ? field->name.getValue() : field->getBaseFieldReference()->getId();990 //991 //// unsigned int ssize = domain->zoom_ni_loc.getValue() * domain->zoom_nj_loc.getValue();992 //// bool isCurvilinear = (domain->lonvalue.getValue()->size() == ssize);993 //// bool isCurvilinear = domain->isCurvilinear ;994 //995 // nc_type type ;996 // if (field->prec.isEmpty()) type = NC_FLOAT ;997 // else998 // {999 // if (field->prec==2) type = NC_SHORT ;1000 // else if (field->prec==4) type = NC_FLOAT ;1001 // else if (field->prec==8) type = NC_DOUBLE ;1002 // }1003 //1004 // bool wtime = !(!field->operation.isEmpty() && field->foperation->timeType() == func::CFunctor::once);1005 //1006 // if (wtime)1007 // {1008 //1009 // //StdOStringStream oss;1010 // // oss << "time_" << field->operation.getValue()1011 // // << "_" << field->getRelFile()->output_freq.getValue();1012 // //oss1013 // if (field->foperation->timeType() == func::CFunctor::instant) coodinates.push_back(string("time_instant"));1014 // else if (field->foperation->timeType() == func::CFunctor::centered) coodinates.push_back(string("time_centered"));1015 // dims.push_back(timeid);1016 // }1017 //1018 // std::vector<StdString> axisList = grid->getAxisList();1019 // if (!axisList.empty())1020 // {1021 // std::vector<StdString>::const_iterator itAxis = axisList.begin(), iteAxis = axisList.end();1022 // for (; itAxis != iteAxis; ++itAxis)1023 // {1024 // CAxis* axis = CAxis::get(*itAxis);1025 // StdString axisid = (!axis->name.isEmpty())1026 // ? axis->name.getValue() : axis->getId();1027 //1028 // dims.push_back(axisid);1029 // coodinates.push_back(axisid);1030 // }1031 // }1032 //1033 // switch (domain->type)1034 // {1035 // case CDomain::type_attr::curvilinear :1036 // coodinates.push_back(StdString("nav_lon").append(appendDomid));1037 // coodinates.push_back(StdString("nav_lat").append(appendDomid));1038 // break;1039 // case CDomain::type_attr::regular :1040 // case CDomain::type_attr::unstructured :1041 // coodinates.push_back(StdString("lon").append(appendDomid));1042 // coodinates.push_back(StdString("lat").append(appendDomid));1043 // break;1044 // }1045 //1046 // if ( domain->type == CDomain::type_attr::curvilinear || domain->type == CDomain::type_attr::regular)dims.push_back(dimYid);1047 // dims.push_back(dimXid);1048 //1049 // try1050 // {1051 // SuperClassWriter::addVariable(fieldid, type, dims);1052 //1053 // if (!field->standard_name.isEmpty())1054 // SuperClassWriter::addAttribute1055 // ("standard_name", field->standard_name.getValue(), &fieldid);1056 //1057 // if (!field->long_name.isEmpty())1058 // SuperClassWriter::addAttribute1059 // ("long_name", field->long_name.getValue(), &fieldid);1060 //1061 // if (!field->unit.isEmpty())1062 // SuperClassWriter::addAttribute1063 // ("units", field->unit.getValue(), &fieldid);1064 //1065 // if (!field->valid_min.isEmpty())1066 // SuperClassWriter::addAttribute1067 // ("valid_min", field->valid_min.getValue(), &fieldid);1068 //1069 // if (!field->valid_max.isEmpty())1070 // SuperClassWriter::addAttribute1071 // ("valid_max", field->valid_max.getValue(), &fieldid);1072 //1073 // if (!field->scale_factor.isEmpty())1074 // SuperClassWriter::addAttribute1075 // ("scale_factor", field->scale_factor.getValue(), &fieldid);1076 //1077 // if (!field->add_offset.isEmpty())1078 // SuperClassWriter::addAttribute1079 // ("add_offset", field->add_offset.getValue(), &fieldid);1080 //1081 // SuperClassWriter::addAttribute1082 // ("online_operation", field->operation.getValue(), &fieldid);1083 //1084 // // write child variables as attributes1085 //1086 //1087 // vector<CVariable*> listVars = field->getAllVariables() ;1088 // for (vector<CVariable*>::iterator it = listVars.begin() ;it != listVars.end(); it++) writeAttribute_(*it, fieldid) ;1089 //1090 //1091 // if (wtime)1092 // {1093 // CDuration duration = field->freq_op.getValue();1094 // duration.solveTimeStep(*(context->calendar));1095 // SuperClassWriter::addAttribute("interval_operation", duration.toStringUDUnits(), &fieldid);1096 //1097 // duration = field->getRelFile()->output_freq.getValue();1098 // duration.solveTimeStep(*(context->calendar));1099 // SuperClassWriter::addAttribute("interval_write", duration.toStringUDUnits(), &fieldid);1100 // }1101 //1102 // if (!field->default_value.isEmpty())1103 // {1104 // double default_value = field->default_value.getValue();1105 // float fdefault_value = (float)default_value;1106 // if (type == NC_DOUBLE)1107 // SuperClassWriter::setDefaultValue(fieldid, &default_value);1108 // else1109 // SuperClassWriter::setDefaultValue(fieldid, &fdefault_value);1110 // }1111 // else1112 // SuperClassWriter::setDefaultValue(fieldid, (double*)NULL);1113 //1114 // { // Ecriture des coordonnées1115 //1116 // StdString coordstr; //boost::algorithm::join(coodinates, " ")1117 // std::vector<StdString>::iterator1118 // itc = coodinates.begin(), endc = coodinates.end();1119 //1120 // for (; itc!= endc; itc++)1121 // {1122 // StdString & coord = *itc;1123 // if (itc+1 != endc)1124 // coordstr.append(coord).append(" ");1125 // else coordstr.append(coord);1126 // }1127 //1128 // SuperClassWriter::addAttribute("coordinates", coordstr, &fieldid);1129 //1130 // }1131 // }1132 // catch (CNetCdfException& e)1133 // {1134 // StdString msg("On writing field : ");1135 // msg.append(fieldid); msg.append("\n");1136 // msg.append("In the context : ");1137 // msg.append(context->getId()); msg.append("\n");1138 // msg.append(e.what());1139 // ERROR("CNc4DataOutput::writeField_(CField* field)", << msg);1140 // }1141 // }1142 1143 966 //-------------------------------------------------------------- 1144 967 … … 1422 1245 } 1423 1246 1424 // //---------------------------------------------------------------1425 //1426 // void CNc4DataOutput::writeFieldData_ (CField* field)1427 // {1428 // CContext* context = CContext::getCurrent() ;1429 //// if (field->getRelFile()->isSyncTime()) SuperClassWriter::sync() ;1430 // CContextServer* server=context->server ;1431 //1432 // CGrid* grid = field->grid ;1433 // CDomain* domain = grid->domain ;1434 //1435 // if(SuperClass::type==MULTI_FILE || !isCollective) if (domain->isEmpty()) return;1436 //1437 //1438 // StdString fieldid = (!field->name.isEmpty())1439 // ? field->name.getValue()1440 // : field->getBaseFieldReference()->getId();1441 //1442 // StdOStringStream oss;1443 // string timeAxisId ;1444 // if (field->foperation->timeType() == func::CFunctor::instant) timeAxisId="time_instant" ;1445 // else if (field->foperation->timeType() == func::CFunctor::centered) timeAxisId="time_centered" ;1446 //1447 // StdString timeBoundId("time_counter_bounds");1448 //1449 // StdString timeAxisBoundId;1450 // if (field->foperation->timeType() == func::CFunctor::instant) timeAxisBoundId="time_instant_bounds" ;1451 // else if (field->foperation->timeType() == func::CFunctor::centered) timeAxisBoundId="time_centered_bounds" ;1452 //1453 // CArray<double,1> time_data(1) ;1454 // CArray<double,1> time_counter(1) ;1455 // CArray<double,1> time_counter_bound(2);1456 // CArray<double,1> time_data_bound(2);1457 //1458 // bool wtime = !(!field->operation.isEmpty() && (field->foperation->timeType() == func::CFunctor::once));1459 //1460 // if (wtime)1461 // {1462 // time_counter(0)= (Time(*field->last_Write_srv) + Time(*field->lastlast_Write_srv)) / 2;1463 // if (field->foperation->timeType() == func::CFunctor::instant)1464 // time_data(0) = Time(*field->last_Write_srv);1465 // else if (field->foperation->timeType() == func::CFunctor::centered) time_data(0) = time_counter(0);1466 //1467 // time_counter_bound(0) = Time(*field->lastlast_Write_srv);1468 // time_counter_bound(1) = Time(*field->last_Write_srv);1469 // if (field->foperation->timeType() == func::CFunctor::instant)1470 // time_data_bound(0) = time_data_bound(1) = Time(*field->last_Write_srv);1471 // else if (field->foperation->timeType() == func::CFunctor::centered)1472 // {1473 // time_data_bound(0) = time_counter_bound(0);1474 // time_data_bound(1) = time_counter_bound(1);1475 // }1476 // }1477 //1478 // bool isRoot ;1479 // if (server->intraCommRank==0) isRoot=true ;1480 // else isRoot=false ;1481 //1482 // if (!field->scale_factor.isEmpty() || !field->add_offset.isEmpty())1483 // {1484 // double scaleFactor=1. ;1485 // double addOffset=0. ;1486 // if (!field->scale_factor.isEmpty()) scaleFactor=field->scale_factor ;1487 // if (!field->add_offset.isEmpty()) addOffset=field->add_offset ;1488 // field->scaleFactorAddOffset(scaleFactor,addOffset) ;1489 // }1490 //1491 // try1492 // {1493 // if (grid->hasAxis()) // 3D1494 // {1495 // CAxis* axis = grid->axis ;1496 // CArray<double,3> field_data3D(domain->zoom_ni_srv,domain->zoom_nj_srv,axis->zoom_size) ;1497 // if (!field->default_value.isEmpty()) field_data3D = field->default_value ;1498 //1499 // field->outputField(field_data3D);1500 //1501 // if (!field->prec.isEmpty() && field->prec==2) field_data3D=round(field_data3D) ;1502 //1503 // switch (SuperClass::type)1504 // {1505 // case (MULTI_FILE) :1506 // {1507 // SuperClassWriter::writeData(field_data3D, fieldid, isCollective, field->getNStep()-1);1508 // if (wtime)1509 // {1510 // SuperClassWriter::writeData(time_data, timeAxisId, isCollective, field->getNStep()-1);1511 // SuperClassWriter::writeData(time_counter, string("time_counter"), isCollective, field->getNStep()-1);1512 // SuperClassWriter::writeData(time_counter_bound, timeBoundId, isCollective, field->getNStep()-1);1513 // SuperClassWriter::writeData(time_data_bound, timeAxisBoundId, isCollective, field->getNStep()-1);1514 // }1515 // break ;1516 // }1517 // case (ONE_FILE) :1518 // {1519 // std::vector<StdSize> start(3) ;1520 // std::vector<StdSize> count(3) ;1521 // if (domain->isEmpty())1522 // {1523 // start[0]=0 ; start[1]=0 ; start[2]=0 ;1524 // count[0]=0 ; count[1]=0 ; start[2]=0 ;1525 // }1526 // else1527 // {1528 // // 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 ;1529 // start[2]=domain->zoom_ibegin_srv-domain->zoom_ibegin.getValue() ; start [1]=domain->zoom_jbegin_srv-domain->zoom_jbegin.getValue() ; start[0]=0 ;1530 // count[2]=domain->zoom_ni_srv ; count[1]=domain->zoom_nj_srv ; count[0] = axis->zoom_size.getValue();1531 // }1532 // SuperClassWriter::writeData(field_data3D, fieldid, isCollective, field->getNStep()-1,&start,&count );1533 // if (wtime)1534 // {1535 // SuperClassWriter::writeTimeAxisData(time_data, timeAxisId, isCollective, field->getNStep()-1,isRoot );1536 // SuperClassWriter::writeTimeAxisData(time_counter, string("time_counter"), isCollective, field->getNStep()-1,isRoot );1537 // SuperClassWriter::writeTimeAxisData(time_counter_bound, timeBoundId, isCollective, field->getNStep()-1, isRoot );1538 // SuperClassWriter::writeTimeAxisData(time_data_bound, timeAxisBoundId, isCollective, field->getNStep()-1, isRoot);1539 // }1540 // break;1541 // }1542 // }1543 //1544 // }1545 // else // 2D1546 // {1547 // CArray<double,2> field_data2D(domain->zoom_ni_srv,domain->zoom_nj_srv) ;1548 // if (!field->default_value.isEmpty()) field_data2D = field->default_value ;1549 // field->outputField(field_data2D);1550 // if (!field->prec.isEmpty() && field->prec==2) field_data2D=round(field_data2D) ;1551 // switch (SuperClass::type)1552 // {1553 // case (MULTI_FILE) :1554 // {1555 // SuperClassWriter::writeData(field_data2D, fieldid, isCollective, field->getNStep()-1);1556 // if (wtime)1557 // {1558 // SuperClassWriter::writeData(time_data, timeAxisId, isCollective, field->getNStep()-1);1559 // SuperClassWriter::writeData(time_counter, string("time_counter"), isCollective, field->getNStep()-1);1560 // SuperClassWriter::writeData(time_counter_bound, timeBoundId, isCollective, field->getNStep()-1);1561 // SuperClassWriter::writeData(time_data_bound, timeAxisBoundId, isCollective, field->getNStep()-1);1562 // }1563 // break;1564 // }1565 // case (ONE_FILE) :1566 // {1567 // std::vector<StdSize> start(2) ;1568 // std::vector<StdSize> count(2) ;1569 // if (domain->isEmpty())1570 // {1571 // start[0]=0 ; start[1]=0 ;1572 // count[0]=0 ; count[1]=0 ;1573 // }1574 // else1575 // {1576 // start[1]=domain->zoom_ibegin_srv-domain->zoom_ibegin.getValue() ; start[0]=domain->zoom_jbegin_srv-domain->zoom_jbegin.getValue() ;1577 // count[1]=domain->zoom_ni_srv ; count[0]=domain->zoom_nj_srv ;1578 // }1579 //1580 // SuperClassWriter::writeData(field_data2D, fieldid, isCollective, field->getNStep()-1,&start,&count);1581 // if (wtime)1582 // {1583 // SuperClassWriter::writeTimeAxisData(time_data, timeAxisId, isCollective, field->getNStep()-1,isRoot);1584 // SuperClassWriter::writeTimeAxisData(time_counter, string("time_counter"), isCollective, field->getNStep()-1,isRoot);1585 // SuperClassWriter::writeTimeAxisData(time_counter_bound, timeBoundId, isCollective, field->getNStep()-1, isRoot);1586 // SuperClassWriter::writeTimeAxisData(time_data_bound, timeAxisBoundId, isCollective, field->getNStep()-1, isRoot);1587 // }1588 // break;1589 //1590 // }1591 // }1592 // }1593 // }1594 // catch (CNetCdfException& e)1595 // {1596 // StdString msg("On writing field data: ");1597 // msg.append(fieldid); msg.append("\n");1598 // msg.append("In the context : ");1599 // msg.append(context->getId()); msg.append("\n");1600 // msg.append(e.what());1601 // ERROR("CNc4DataOutput::writeFieldData_ (CField* field)", << msg);1602 // }1603 // }1604 1605 1247 //--------------------------------------------------------------- 1606 1248
Note: See TracChangeset
for help on using the changeset viewer.