Changeset 1957
- Timestamp:
- 10/08/20 13:12:35 (4 years ago)
- Location:
- XIOS/dev/dev_ym/XIOS_COUPLING/src/io
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/dev/dev_ym/XIOS_COUPLING/src/io/nc4_data_output.cpp
r1950 r1957 59 59 60 60 //domain->computeWrittenIndex(); 61 domain->computeWrittenCompressedIndex(comm_file);61 //domain->computeWrittenCompressedIndex(comm_file); 62 62 63 63 if (domain->type == CDomain::type_attr::unstructured) … … 1160 1160 1161 1161 // axis->computeWrittenIndex(); 1162 axis->computeWrittenCompressedIndex(comm_file);1162 // axis->computeWrittenCompressedIndex(comm_file); 1163 1163 1164 1164 int size = (MULTI_FILE == SuperClass::type) ? axis->n.getValue() … … 1497 1497 void CNc4DataOutput::writeGridCompressed_(CGrid* grid) 1498 1498 { 1499 if (grid->isScalarGrid() || grid->isWrittenCompressed(this->filename)) return; 1500 1501 try 1502 { 1503 CArray<int,1> axisDomainOrder = grid->axis_domain_order; 1504 std::vector<StdString> domainList = grid->getDomainList(); 1505 std::vector<StdString> axisList = grid->getAxisList(); 1506 std::vector<StdString> scalarList = grid->getScalarList(); 1507 int numElement = axisDomainOrder.numElements(), idxDomain = 0, idxAxis = 0, idxScalar = 0; 1508 1509 std::vector<StdString> dims; 1510 1511 if (grid->isCompressible()) 1512 { 1513 StdString varId = grid->getId() + "_points"; 1514 1515 int nbIndexes = (SuperClass::type == MULTI_FILE) ? grid->getNumberWrittenIndexes() : grid->getTotalNumberWrittenIndexes(); 1516 SuperClassWriter::addDimension(varId, nbIndexes); 1517 1518 dims.push_back(varId); 1519 SuperClassWriter::addVariable(varId, NC_INT, dims); 1520 1521 StdOStringStream compress; 1522 for (int i = numElement - 1; i >= 0; --i) 1523 { 1524 if (2 == axisDomainOrder(i)) 1525 { 1526 CDomain* domain = CDomain::get(domainList[domainList.size() - idxDomain - 1]); 1527 StdString domId = domain->getDomainOutputName(); 1528 StdString appendDomId = singleDomain ? "" : "_" + domId; 1529 1530 switch (domain->type) 1531 { 1532 case CDomain::type_attr::curvilinear: 1533 compress << "y" << appendDomId << " x" << appendDomId; 1534 break; 1535 case CDomain::type_attr::rectilinear: 1536 compress << "lat" << appendDomId << " lon" << appendDomId; 1537 break; 1538 case CDomain::type_attr::unstructured: 1539 StdString cellName = (!domain->dim_i_name.isEmpty()) ? cellName=domain->dim_i_name : "cell"; 1540 compress << cellName << appendDomId; 1541 // compress << "cell" << appendDomId; 1542 break; 1543 } 1544 ++idxDomain; 1545 } 1546 else if (1 == axisDomainOrder(i)) 1547 { 1548 CAxis* axis = CAxis::get(axisList[axisList.size() - idxAxis - 1]); 1549 compress << axis->getAxisOutputName(); 1550 ++idxAxis; 1551 } 1552 else 1553 { 1554 CScalar* scalar = CScalar::get(scalarList[scalarList.size() - idxScalar - 1]); 1555 compress << scalar->getScalarOutputName(); 1556 ++idxScalar; 1557 } 1558 1559 if (i != 0) compress << ' '; 1560 } 1561 SuperClassWriter::addAttribute("compress", compress.str(), &varId); 1562 1563 CArray<int, 1> indexes(grid->getNumberWrittenIndexes()); 1564 indexes = grid->localIndexToWriteOnServer_; 1565 1566 switch (SuperClass::type) 1567 { 1568 case (MULTI_FILE): 1569 { 1570 SuperClassWriter::writeData(indexes, varId, isCollective, 0); 1571 break; 1572 } 1573 case (ONE_FILE): 1574 { 1575 if (grid->doGridHaveDataDistributed()) 1576 grid->getServerDistribution()->computeGlobalIndex(indexes); 1577 1578 std::vector<StdSize> start, count; 1579 start.push_back(grid->getOffsetWrittenIndexes()); 1580 count.push_back(grid->getNumberWrittenIndexes()); 1581 1582 SuperClassWriter::writeData(indexes, varId, isCollective, 0, &start, &count); 1583 break; 1584 } 1585 } 1586 } 1587 else 1588 { 1589 for (int i = 0; i < numElement; ++i) 1590 { 1591 StdString varId, compress; 1592 CArray<int, 1> indexes; 1593 bool isDistributed; 1594 StdSize nbIndexes, totalNbIndexes, offset; 1595 int firstGlobalIndex; 1596 1597 if (2 == axisDomainOrder(i)) 1598 { 1599 CDomain* domain = CDomain::get(domainList[idxDomain]); 1600 StdString domId = domain->getDomainOutputName(); 1601 1602 if (!domain->isCompressible() 1603 || domain->type == CDomain::type_attr::unstructured 1604 || domain->isWrittenCompressed(this->filename) 1605 || isWrittenCompressedDomain(domId)) 1606 continue; 1607 1608 StdString appendDomId = singleDomain ? "" : "_" + domId; 1609 1610 varId = domId + "_points"; 1611 switch (domain->type) 1612 { 1613 case CDomain::type_attr::curvilinear: 1614 compress = "y" + appendDomId + " x" + appendDomId; 1615 break; 1616 case CDomain::type_attr::rectilinear: 1617 compress = "lat" + appendDomId + " lon" + appendDomId; 1618 break; 1619 } 1620 1621 // indexes.resize(domain->compressedIndexToWriteOnServer[comm_file].numElements()); 1622 // indexes = domain->compressedIndexToWriteOnServer[com_file]; 1623 indexes.resize(domain->getCompressedIndexToWriteOnServer(comm_file).numElements()); 1624 indexes = domain->getCompressedIndexToWriteOnServer(comm_file); 1625 1626 isDistributed = domain->isDistributed(); 1627 nbIndexes = domain->getNumberWrittenIndexes(comm_file); 1628 totalNbIndexes = domain->getTotalNumberWrittenIndexes(comm_file); 1629 offset = domain->getOffsetWrittenIndexes(comm_file); 1630 firstGlobalIndex = domain->ibegin + domain->jbegin * domain->ni_glo; 1631 1632 domain->addRelFileCompressed(this->filename); 1633 setWrittenCompressedDomain(domId); 1634 ++idxDomain; 1635 } 1636 else if (1 == axisDomainOrder(i)) 1637 { 1638 CAxis* axis = CAxis::get(axisList[idxAxis]); 1639 StdString axisId = axis->getAxisOutputName(); 1640 1641 if (!axis->isCompressible() 1642 || axis->isWrittenCompressed(this->filename) 1643 || isWrittenCompressedAxis(axisId)) 1644 continue; 1645 1646 varId = axisId + "_points"; 1647 compress = axisId; 1648 1649 // indexes.resize(axis->compressedIndexToWriteOnServer.numElements()); 1650 // indexes = axis->compressedIndexToWriteOnServer; 1651 1652 indexes.resize(axis->getCompressedIndexToWriteOnServer(comm_file).numElements()); 1653 indexes = axis->getCompressedIndexToWriteOnServer(comm_file); 1654 1655 isDistributed = axis->isDistributed(); 1656 nbIndexes = axis->getNumberWrittenIndexes(comm_file); 1657 totalNbIndexes = axis->getTotalNumberWrittenIndexes(comm_file); 1658 offset = axis->getOffsetWrittenIndexes(comm_file); 1659 firstGlobalIndex = axis->begin; 1660 1661 axis->addRelFileCompressed(this->filename); 1662 setWrittenCompressedAxis(axisId); 1663 ++idxAxis; 1664 } 1665 else 1666 { 1667 } 1668 1669 if (!varId.empty()) 1670 { 1671 SuperClassWriter::addDimension(varId, (SuperClass::type == MULTI_FILE) ? nbIndexes : totalNbIndexes); 1672 1673 dims.clear(); 1674 dims.push_back(varId); 1675 SuperClassWriter::addVariable(varId, NC_INT, dims); 1676 1677 SuperClassWriter::addAttribute("compress", compress, &varId); 1678 1679 switch (SuperClass::type) 1680 { 1681 case (MULTI_FILE): 1682 { 1683 indexes -= firstGlobalIndex; 1684 SuperClassWriter::writeData(indexes, varId, isCollective, 0); 1685 break; 1686 } 1687 case (ONE_FILE): 1688 { 1689 std::vector<StdSize> start, count; 1690 start.push_back(offset); 1691 count.push_back(nbIndexes); 1692 1693 SuperClassWriter::writeData(indexes, varId, isCollective, 0, &start, &count); 1694 break; 1695 } 1696 } 1697 } 1499 if (grid->isScalarGrid() || grid->isWrittenCompressed(this->filename)) return; 1500 1501 // NOTA : The cuurent algorithm to write compress elements of the grid 1502 // will work pretting well when on server side you dont't get 1503 // partial overlap on elements between differents participating process 1504 // So the element must be totally distributed or non distributed 1505 // If an element is partially overlaping betwwen process then the 1506 // total compressed part will apear artificially greater than expected 1507 // For the current implementation of writer which is decomposed only on 1508 // one element, it will work as expected, but for future, it must be 1509 // reconsidered again. 1510 try 1511 { 1512 CArray<int,1> axisDomainOrder = grid->axis_domain_order; 1513 std::vector<StdString> domainList = grid->getDomainList(); 1514 std::vector<StdString> axisList = grid->getAxisList(); 1515 std::vector<StdString> scalarList = grid->getScalarList(); 1516 int numElement = axisDomainOrder.numElements(), idxDomain = 0, idxAxis = 0, idxScalar = 0; 1517 int commRank ; 1518 MPI_Comm_rank(comm_file,&commRank) ; 1519 1520 std::vector<StdString> dims; 1521 1522 for (int i = 0; i < numElement; ++i) 1523 { 1524 StdString varId, compress; 1525 CArray<size_t, 1> indexes; 1526 bool isDistributed; 1527 size_t nbIndexes, totalNbIndexes, offset; 1528 size_t firstGlobalIndex; 1529 1530 if (2 == axisDomainOrder(i)) 1531 { 1532 CDomain* domain = CDomain::get(domainList[idxDomain]); 1533 StdString domId = domain->getDomainOutputName(); 1534 1535 if (!domain->isCompressible() 1536 || domain->type == CDomain::type_attr::unstructured 1537 || domain->isWrittenCompressed(this->filename) 1538 || isWrittenCompressedDomain(domId)) 1539 continue; 1540 1541 // unstructured grid seems not be taken into account why ? 1542 1543 string lonName,latName ; 1544 1545 if (domain->lon_name.isEmpty()) 1546 { 1547 if (domain->type==CDomain::type_attr::curvilinear) lonName = "nav_lon"; 1548 else lonName = "lon"; 1549 } 1550 else lonName = domain->lon_name; 1551 1552 if (domain->lat_name.isEmpty()) 1553 { 1554 if (domain->type==CDomain::type_attr::curvilinear) latName = "nav_lat"; 1555 else latName = "lat"; 1556 } 1557 else latName = domain->lat_name; 1558 1559 StdString appendDomId = singleDomain ? "" : "_" + domId; 1560 1561 varId = domId + "_points"; 1562 compress = latName + appendDomId + " " + lonName + appendDomId; 1563 1564 CLocalView* workflowView = domain->getLocalView(CElementView::WORKFLOW) ; 1565 workflowView->getGlobalIndexView(indexes) ; 1566 nbIndexes = workflowView->getSize() ; 1567 isDistributed = domain->isDistributed(); 1568 if (isDistributed) 1569 { 1570 MPI_Exscan(&nbIndexes, &offset, 1, MPI_SIZE_T, MPI_SUM, comm_file) ; 1571 if (commRank==0) offset=0 ; 1572 MPI_Allreduce(&nbIndexes,&totalNbIndexes,1 , MPI_SIZE_T, MPI_SUM, comm_file) ; 1573 } 1574 else 1575 { 1576 offset=0 ; 1577 totalNbIndexes = nbIndexes ; 1578 } 1579 1580 firstGlobalIndex = domain->ibegin + domain->jbegin * domain->ni_glo; 1581 1582 domain->addRelFileCompressed(this->filename); 1583 setWrittenCompressedDomain(domId); 1584 ++idxDomain; 1698 1585 } 1699 } 1700 1701 grid->addRelFileCompressed(this->filename); 1702 } 1703 catch (CNetCdfException& e) 1704 { 1705 StdString msg("On writing compressed grid : "); 1706 msg.append(grid->getId()); msg.append("\n"); 1707 msg.append("In the context : "); 1708 CContext* context = CContext::getCurrent(); 1709 msg.append(context->getId()); msg.append("\n"); 1710 msg.append(e.what()); 1711 ERROR("CNc4DataOutput::writeGridCompressed_(CGrid* grid)", << msg); 1712 } 1713 } 1586 else if (1 == axisDomainOrder(i)) 1587 { 1588 CAxis* axis = CAxis::get(axisList[idxAxis]); 1589 StdString axisId = axis->getAxisOutputName(); 1590 1591 if (!axis->isCompressible() 1592 || axis->isWrittenCompressed(this->filename) 1593 || isWrittenCompressedAxis(axisId)) 1594 continue; 1595 1596 varId = axisId + "_points"; 1597 compress = axisId; 1598 1599 CLocalView* workflowView = axis->getLocalView(CElementView::WORKFLOW) ; 1600 workflowView->getGlobalIndexView(indexes) ; 1601 nbIndexes = workflowView->getSize() ; 1602 isDistributed = axis->isDistributed(); 1603 if (isDistributed) 1604 { 1605 MPI_Exscan(&nbIndexes, &offset, 1, MPI_SIZE_T, MPI_SUM, comm_file) ; 1606 if (commRank==0) offset=0 ; 1607 MPI_Allreduce(&nbIndexes,&totalNbIndexes,1 , MPI_SIZE_T, MPI_SUM, comm_file) ; 1608 } 1609 else 1610 { 1611 offset=0 ; 1612 totalNbIndexes = nbIndexes ; 1613 } 1614 firstGlobalIndex = axis->begin; 1615 1616 axis->addRelFileCompressed(this->filename); 1617 setWrittenCompressedAxis(axisId); 1618 ++idxAxis; 1619 } 1620 else 1621 { 1622 //for scalar 1623 } 1624 1625 if (!varId.empty()) 1626 { 1627 SuperClassWriter::addDimension(varId, (SuperClass::type == MULTI_FILE) ? nbIndexes : totalNbIndexes); 1628 1629 dims.clear(); 1630 dims.push_back(varId); 1631 SuperClassWriter::addVariable(varId, NC_UINT64, dims); 1632 1633 SuperClassWriter::addAttribute("compress", compress, &varId); 1634 1635 switch (SuperClass::type) 1636 { 1637 case (MULTI_FILE): 1638 { 1639 indexes -= firstGlobalIndex; 1640 SuperClassWriter::writeData(indexes, varId, isCollective, 0); 1641 break; 1642 } 1643 case (ONE_FILE): 1644 { 1645 std::vector<StdSize> start, count; 1646 start.push_back(offset); 1647 count.push_back(nbIndexes); 1648 1649 SuperClassWriter::writeData(indexes, varId, isCollective, 0, &start, &count); 1650 break; 1651 } 1652 } 1653 } 1654 } 1655 1656 grid->addRelFileCompressed(this->filename); 1657 } 1658 catch (CNetCdfException& e) 1659 { 1660 StdString msg("On writing compressed grid : "); 1661 msg.append(grid->getId()); msg.append("\n"); 1662 msg.append("In the context : "); 1663 CContext* context = CContext::getCurrent(); 1664 msg.append(context->getId()); msg.append("\n"); 1665 msg.append(e.what()); 1666 ERROR("CNc4DataOutput::writeGridCompressed_(CGrid* grid)", << msg); 1667 } 1668 } 1714 1669 1715 1670 //-------------------------------------------------------------- … … 2406 2361 if (!field->default_value.isEmpty()) fieldData = field->default_value; 2407 2362 2408 if (field->getUseCompressedOutput()) 2409 field->outputCompressedField(dataIn, fieldData);2363 if (field->getUseCompressedOutput()) fieldData.reference(dataIn) ; 2364 // field->outputCompressedField(dataIn, fieldData); 2410 2365 else 2411 2366 { … … 2448 2403 if (field->getUseCompressedOutput()) 2449 2404 { 2450 if (grid->isCompressible()) 2405 CArray<int,1> axisDomainOrder = grid->axis_domain_order; 2406 std::vector<StdString> domainList = grid->getDomainList(); 2407 std::vector<StdString> axisList = grid->getAxisList(); 2408 int numElement = axisDomainOrder.numElements(); 2409 int idxDomain = domainList.size() - 1, idxAxis = axisList.size() - 1; 2410 int idx = domainList.size() * 2 + axisList.size() - 1; 2411 int commRank ; 2412 2413 MPI_Comm_rank(comm_file,&commRank) ; 2414 2415 start.reserve(idx+1); 2416 count.reserve(idx+1); 2417 2418 for (int i = numElement - 1; i >= 0; --i) 2451 2419 { 2452 start.push_back(grid->getOffsetWrittenIndexes()); 2453 count.push_back(grid->getNumberWrittenIndexes()); 2454 } 2455 else 2456 { 2457 CArray<int,1> axisDomainOrder = grid->axis_domain_order; 2458 std::vector<StdString> domainList = grid->getDomainList(); 2459 std::vector<StdString> axisList = grid->getAxisList(); 2460 int numElement = axisDomainOrder.numElements(); 2461 int idxDomain = domainList.size() - 1, idxAxis = axisList.size() - 1; 2462 int idx = domainList.size() * 2 + axisList.size() - 1; 2463 2464 start.reserve(idx+1); 2465 count.reserve(idx+1); 2466 2467 for (int i = numElement - 1; i >= 0; --i) 2420 if (2 == axisDomainOrder(i)) 2468 2421 { 2469 if (2 == axisDomainOrder(i)) 2422 CDomain* domain = CDomain::get(domainList[idxDomain]); 2423 2424 if (domain->isCompressible()) 2470 2425 { 2471 CDomain* domain = CDomain::get(domainList[idxDomain]);2472 2473 if (domain->is Compressible())2426 size_t offset ; 2427 size_t nbIndexes = domain->getLocalView(CElementView::WORKFLOW)->getSize() ; 2428 if (domain->isDistributed()) 2474 2429 { 2475 start.push_back(domain->getOffsetWrittenIndexes(comm_file)); 2476 count.push_back(domain->getNumberWrittenIndexes(comm_file)); 2477 idx -= 2; 2430 MPI_Exscan(&nbIndexes, &offset, 1, MPI_SIZE_T, MPI_SUM, comm_file) ; 2431 if (commRank==0) offset=0 ; 2478 2432 } 2479 else 2433 else offset=0 ; 2434 2435 start.push_back(offset); 2436 count.push_back(nbIndexes); 2437 idx -= 2; 2438 } 2439 else 2440 { 2441 if ((domain->type) != CDomain::type_attr::unstructured) 2480 2442 { 2481 if ((domain->type) != CDomain::type_attr::unstructured) 2482 { 2483 start.push_back(domain->jbegin); 2484 count.push_back(domain->nj); 2485 } 2486 --idx; 2487 start.push_back(domain->ibegin); 2488 count.push_back(domain->ni); 2489 --idx; 2443 start.push_back(domain->jbegin); 2444 count.push_back(domain->nj); 2490 2445 } 2491 --idxDomain; 2492 } 2493 else if (1 == axisDomainOrder(i)) 2494 { 2495 CAxis* axis = CAxis::get(axisList[idxAxis]); 2496 2497 if (axis->isCompressible()) 2498 { 2499 start.push_back(axis->getOffsetWrittenIndexes(comm_file)); 2500 count.push_back(axis->getNumberWrittenIndexes(comm_file)); 2501 } 2502 else 2503 { 2504 start.push_back(axis->begin); 2505 count.push_back(axis->n); 2506 } 2507 --idxAxis; 2446 --idx; 2447 start.push_back(domain->ibegin); 2448 count.push_back(domain->ni); 2508 2449 --idx; 2509 2450 } 2451 --idxDomain; 2452 } 2453 else if (1 == axisDomainOrder(i)) 2454 { 2455 CAxis* axis = CAxis::get(axisList[idxAxis]); 2456 2457 if (axis->isCompressible()) 2458 { 2459 size_t offset ; 2460 size_t nbIndexes = axis->getLocalView(CElementView::WORKFLOW)->getSize() ; 2461 if (axis->isDistributed()) 2462 { 2463 MPI_Exscan(&nbIndexes, &offset, 1, MPI_SIZE_T, MPI_SUM, comm_file) ; 2464 if (commRank==0) offset=0 ; 2465 } 2466 else offset=0 ; 2467 2468 start.push_back(offset); 2469 count.push_back(nbIndexes); 2470 } 2471 else 2472 { 2473 start.push_back(axis->begin); 2474 count.push_back(axis->n); 2475 } 2476 --idxAxis; 2477 --idx; 2510 2478 } 2511 2479 } 2512 2480 } 2513 2481 else 2514 2482 { -
XIOS/dev/dev_ym/XIOS_COUPLING/src/io/netCdfInterface.cpp
r1639 r1957 894 894 895 895 template<> 896 int CNetCdfInterface::ncGetAttType(int ncid, int varid, const char* attrName, size_t* data) 897 { 898 return nc_get_att_ulonglong(ncid, varid, attrName, (unsigned long long*)data); 899 } 900 901 template<> 896 902 int CNetCdfInterface::ncGetAttType(int ncid, int varid, const char* attrName, short* data) 897 903 { … … 936 942 template<> 937 943 int CNetCdfInterface::ncPutAttType(int ncid, int varid, const char* attrName, 944 StdSize numVal, const size_t* data) 945 { 946 return nc_put_att_ulonglong(ncid, varid, attrName, NC_UINT64, numVal, (unsigned long long*) data); 947 } 948 949 template<> 950 int CNetCdfInterface::ncPutAttType(int ncid, int varid, const char* attrName, 938 951 StdSize numVal, const short* data) 939 952 { … … 968 981 969 982 template<> 983 int CNetCdfInterface::ncGetVaraType(int ncid, int varid, const StdSize* start, const StdSize* count, size_t* data) 984 { 985 return nc_get_vara_ulonglong(ncid, varid, start, count, (unsigned long long*) data); 986 } 987 988 template<> 970 989 int CNetCdfInterface::ncGetVaraType(int ncid, int varid, const StdSize* start, const StdSize* count, char* data) 971 990 { … … 990 1009 { 991 1010 return nc_put_vara_int(ncid, varid, start, count, data); 1011 } 1012 1013 template<> 1014 int CNetCdfInterface::ncPutVaraType(int ncid, int varid, const StdSize* start, const StdSize* count, const size_t* data) 1015 { 1016 return nc_put_vara_ulonglong(ncid, varid, start, count, (unsigned long long*)data); 992 1017 } 993 1018 -
XIOS/dev/dev_ym/XIOS_COUPLING/src/io/netCdfInterface_decl.cpp
r1158 r1957 20 20 macroAtt(float) 21 21 macroAtt(int) 22 macroAtt(size_t) 22 23 macroAtt(long) 23 24 macroAtt(short) … … 33 34 macroPutVar(float) 34 35 macroPutVar(int) 36 macroPutVar(size_t) 35 37 macroPutVar(char) 36 38 … … 41 43 macroType(float, NC_FLOAT) 42 44 macroType(int, NC_INT) 45 macroType(size_t, NC_UINT64) 43 46 macroType(long, NC_LONG) 44 47 macroType(short, NC_SHORT) -
XIOS/dev/dev_ym/XIOS_COUPLING/src/io/onetcdf4.cpp
r1639 r1957 538 538 539 539 template <> 540 541 540 void CONetCDF4::writeData_(int grpid, int varid, 542 541 const std::vector<StdSize>& sstart, 543 542 const std::vector<StdSize>& scount, const int* data) 543 { 544 CNetCdfInterface::putVaraType(grpid, varid, &sstart[0], &scount[0], data); 545 } 546 //--------------------------------------------------------------- 547 548 template <> 549 void CONetCDF4::writeData_(int grpid, int varid, 550 const std::vector<StdSize>& sstart, 551 const std::vector<StdSize>& scount, const size_t* data) 544 552 { 545 553 CNetCdfInterface::putVaraType(grpid, varid, &sstart[0], &scount[0], data); -
XIOS/dev/dev_ym/XIOS_COUPLING/src/io/onetcdf4_decl.cpp
r1392 r1957 11 11 macro(int, 1) 12 12 macro(int, 2) 13 macro(size_t, 1) 14 macro(size_t, 2) 13 15 macro(double, 1) 14 16 macro(double, 2)
Note: See TracChangeset
for help on using the changeset viewer.