Write the data for the given attribute to file.
Write the given attribute to file using the CGNS format. The attribute may be a "mesh", "all" or some other predefined attribute.
900 std::string fname(fname_in);
901 bool writeGhost = (ghosthandle ==
"write");
902 const Window* w = attr->window();
904 const Pane& pane = w->
pane(pane_id);
910 std::istringstream
sin(timelevel);
915 std::string timeLevel;
917 std::ostringstream sout;
919 timeLevel = sout.str();
922 DEBUG_MSG(
"Writing to file '" << fname <<
"', mode == '"
923 << (mode ?
"append'" :
"write'"));
924 DEBUG_MSG(
"Using mesh file '" << mfile <<
"'");
926 std::string::size_type loc = fname.rfind(
'/');
930 std::string prefix = fname.substr(0, loc+1);
945 CG_CHECK(cg_open, (fname.c_str(), MODE_WRITE, &fn));
948 CG_CHECK(cg_open, (fname.c_str(), MODE_MODIFY, &fn));
954 int i, B, nSteps = 0;
955 std::vector<double> times;
973 CG_CHECK(cg_units_write, (Kilogram, Meter, Second, Kelvin, Degree));
980 if (mode > 0 && cg_biter_read(fn, B, buffer, &nSteps) == 0) {
981 CG_CHECK(cg_goto, (fn, B,
"BaseIterativeData_t", 1,
"end"));
982 times.resize(nSteps + 1);
983 CG_CHECK(cg_array_read_as, (1, RealDouble, &(times[0])));
1001 for (timeIndex=0; timeIndex<nSteps; ++timeIndex)
1002 if (times[timeIndex] == timeValue) {
1008 if (timeIndex == nSteps) {
1010 times[timeIndex] = timeValue;
1014 CG_CHECK(cg_biter_write, (fn, B,
"TimeIterValues", nSteps));
1015 CG_CHECK(cg_goto, (fn, B,
"BaseIterativeData_t", 1,
"end"));
1016 CG_CHECK(cg_array_write, (
"TimeValues", RealDouble, 1, &nSteps,
1023 std::string zoneName;
1025 std::ostringstream sout;
1026 sout << std::setw(4) << std::setfill(
'0') << pane.
id();
1027 zoneName = sout.str();
1031 int Z, sizes[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
1038 sizes[i++] = pane.
size_i() - 2 * ghost;
1039 sizes[i++] = pane.
size_j() - 2 * ghost;
1040 if (physDim > 2 && cellDim > 2)
1041 sizes[i++] = pane.
size_k() - 2 * ghost;
1042 sizes[i++] = sizes[0] - 1;
1043 sizes[i++] = sizes[1] - 1;
1044 if (physDim > 2 && cellDim > 2)
1045 sizes[i++] = sizes[2] - 1;
1051 zType = Unstructured;
1060 if (!mfile.empty()) {
1062 ((prefix + mfile).c_str(), MODE_READ, &meshfn));
1063 cg_zone_read(meshfn, 1, 1, zName, &(sizes[0]));
1071 zType, &Z, errorhandle));
1075 std::string gridName(
"Grid");
1076 if (timeLevel.length() + gridName.length() > 32)
1077 gridName.erase(32 - timeLevel.length());
1078 gridName += timeLevel;
1081 std::string winName(
"WinData");
1082 if (timeLevel.length() + winName.length() > 32)
1083 winName.erase(32 - timeLevel.length());
1084 winName += timeLevel;
1087 std::string paneName(
"PaneData");
1088 if (timeLevel.length() + paneName.length() > 32)
1089 paneName.erase(32 - timeLevel.length());
1090 paneName += timeLevel;
1093 std::string connName(
"ConnData");
1094 if (timeLevel.length() + connName.length() > 32)
1095 connName.erase(32 - timeLevel.length());
1096 connName += timeLevel;
1099 std::string elemName(
"ElemData");
1100 if (timeLevel.length() + elemName.length() > 32)
1101 elemName.erase(32 - timeLevel.length());
1102 elemName += timeLevel;
1105 std::string nodeName(
"NodeData");
1106 if (timeLevel.length() + nodeName.length() > 32)
1107 nodeName.erase(32 - timeLevel.length());
1108 nodeName += timeLevel;
1112 char (*gridNames)[32] = NULL;
1113 char (*nodeNames)[32] = NULL;
1115 if (mode > 0 && cg_ziter_read(fn, B, Z, buffer) == 0) {
1118 CG_CHECK(cg_goto, (fn, B,
"Zone_t", Z,
"ZoneIterativeData_t", 1,
"end"));
1119 int numStr = nSteps;
1120 if (timeIndex >= nSteps)
1123 gridNames = (char(*)[32])
new char[32*numStr];
1124 std::fill_n((
char*)gridNames, 32 * numStr,
'\0');
1125 nodeNames = (char(*)[32])
new char[32*numStr];
1126 std::fill_n((
char*)nodeNames, 32 * numStr,
'\0');
1129 DataType_t dataType;
1133 (
"GridCoordinatesPointers", &A, &dataType, &rank, size,
1136 && size[1] == numStr),
1137 "GridCoordinatesPointers in ZoneIterativeData is corrupt");
1138 CG_CHECK(cg_array_read, (A, gridNames));
1139 if (timeIndex < nSteps) {
1141 "GridCoordinatesPointers in ZoneIterativeData is corrupt");
1143 std::strncpy(gridNames[timeIndex], gridName.c_str(), 32);
1149 (
"FlowSolutionsPointers", &A, &dataType, &rank, size,
1152 && size[1] == numStr),
1153 "FlowSolutionsPointers in ZoneIterativeData is corrupt");
1154 CG_CHECK(cg_array_read, (A, nodeNames));
1155 if (timeIndex < nSteps) {
1157 "FlowSolutionsPointers in ZoneIterativeData is corrupt");
1159 std::strncpy(nodeNames[timeIndex], nodeName.c_str(), 32);
1165 cg_ziter_write(fn, B, Z,
"ZoneIterativeData");
1167 gridNames = (char(*)[32])
new char[32];
1168 std::fill_n((
char*)gridNames, 32,
'\0');
1169 std::strncpy(gridNames[timeIndex], gridName.c_str(), 32);
1171 nodeNames = (char(*)[32])
new char[32];
1172 std::fill_n((
char*)nodeNames, 32,
'\0');
1173 std::strncpy(nodeNames[timeIndex], nodeName.c_str(), 32);
1178 if (timeIndex == nSteps) {
1187 CG_CHECK(cg_goto, (fn, B,
"Zone_t", Z,
"ZoneIterativeData_t", 1,
"end"));
1190 (
"GridCoordinatesPointers", Character, 2, size, gridNames));
1193 (
"FlowSolutionsPointers", Character, 2, size, nodeNames));
1197 delete[] (
char*)gridNames;
1198 delete[] (
char*)nodeNames;
1200 std::vector<char> buf;
1201 int mfn = fn, mB = B, mZ = Z, nGC = 0, G = 0, numItems, dType;
1202 int rind[6] = { 0, 0, 0, 0, 0, 0 };
1204 std::string path(
"/"), range;
1206 path +=
'/' + zoneName +
'/';
1235 if (!mfile.empty()) {
1236 DEBUG_MSG(
"Writing to mesh file '" << mfile <<
"', mode == '"
1237 << (mode ?
"append'" :
"write'"));
1241 ((prefix + mfile).c_str(), mode ? MODE_MODIFY : MODE_WRITE, &mfn));
1250 sizes, zType, &mZ, errorhandle));
1259 CG_CHECK(cg_ngrids, (mfn, mB, mZ, &nGC));
1262 CG_CHECK(cg_grid_write, (mfn, mB, mZ,
"GridCoordinates", &G));
1263 if (mfile.empty()) {
1264 CG_CHECK(cg_goto, (mfn, mB,
"Zone_t", mZ,
"end"));
1265 CG_CHECK(cg_link_write, (gridName.c_str(),
"",
1266 (path +
"GridCoordinates").c_str()));
1269 CG_CHECK(cg_goto, (fn, B,
"Zone_t", Z,
"end"));
1270 CG_CHECK(cg_ngrids, (fn, B, Z, &nGC));
1272 CG_CHECK(cg_link_write, (
"GridCoordinates", (mfile).c_str(),
1273 (path +
"GridCoordinates").c_str()));
1275 CG_CHECK(cg_link_write, (gridName.c_str(), (mfile).c_str(),
1276 (path +
"GridCoordinates").c_str()));
1279 if (mfile.empty()) {
1280 CG_CHECK(cg_grid_write, (mfn, mB, mZ, gridName.c_str(), &G));
1283 CG_CHECK(cg_goto, (fn, B,
"Zone_t", Z,
"end"));
1284 CG_CHECK(cg_ngrids, (fn, B, Z, &nGC));
1286 CG_CHECK(cg_link_write, (
"GridCoordinates", (mfile).c_str(),
1287 (path +
"GridCoordinates").c_str()));
1289 CG_CHECK(cg_link_write, (gridName.c_str(), (mfile).c_str(),
1290 (path +
"GridCoordinates").c_str()));
1301 CG_CHECK(cg_goto, (mfn, mB,
"Zone_t", mZ,
"GridCoordinates_t", G,
1308 size[2] = (physDim == 3 && cellDim == 3 ? pane.
size_k(): 1);
1309 numItems = size[0] * size[1] * size[2];
1314 std::fill_n(rind, 6, 0);
1323 std::string ranges[3];
1324 int n, start = 0, finish = physDim;
1329 for (n=start; n<finish; ++
n) {
1334 const void* pData = nc->
pointer();
1335 bool isNull =
false;
1336 if (numItems <= 0) {
1338 std::fill(buf.begin(), buf.end(),
'\0');
1340 size[0] = size[1] = size[2] = 1;
1341 ranges[
n] =
"EMPTY";
1342 }
else if (pData == NULL) {
1345 std::fill(buf.begin(), buf.end(),
'\0');
1351 int stride = nc->
stride();
1354 buf.resize(dSize *
std::max(numItems, 1));
1355 for (i=0; i<numItems; ++
i)
1356 std::memcpy(&(buf[i*dSize]),
1357 &(((
const char*)pData)[i*stride*dSize]), dSize);
1361 #ifdef DEBUG_DUMP_PREFIX
1363 std::ofstream fout((DEBUG_DUMP_PREFIX + std::string(material) +
".nc" +
'_' + timeLevel +
".cgns").c_str(), std::ios_base::app);
1366 for (i=0; i<numItems; ++
i)
1367 fout << i <<
" : " << (
int)((
const char*)pData)[
i]
1371 for (i=0; i<numItems; ++
i)
1372 fout << i <<
" : " << ((
const int*)pData)[i] <<
'\n';
1375 for (i=0; i<numItems; ++
i)
1376 fout << i <<
" : " << ((
const float*)pData)[i] <<
'\n';
1379 for (i=0; i<numItems; ++
i)
1380 fout << i <<
" : " << ((
const double*)pData)[i]
1386 fout <<
"###########################################\n";
1388 #endif // DEBUG_DUMP_PREFIX
1391 (
const COM_TT*)pData,
1394 label =
"Coordinate";
1395 label += (char)(
'X' + n);
1401 rind, size, pData));
1403 DEBUG_MSG(
"Writing attribute '" << (
char)(
'x' + n) <<
"-nc', id == "
1404 << nc->
id() <<
", components == "
1410 for (n=start; n<finish; ++
n) {
1411 CG_CHECK(cg_goto, (mfn, mB,
"Zone_t", mZ,
"GridCoordinates_t", G,
1412 "DataArray_t", n + 1,
"end"));
1413 CG_CHECK(cg_descriptor_write, (
"Range", ranges[n].c_str()));
1414 DEBUG_MSG(
"Writing descriptor 'Range': '" << ranges[n] <<
'\'');
1415 if (!attr->unit().empty()) {
1417 DEBUG_MSG(
"Writing descriptor 'Units': '" << attr->unit()
1419 CG_CHECK(cg_descriptor_write, (
"Units", attr->unit().c_str()));
1422 DEBUG_MSG(
"Writing descriptor 'Units': 'm'");
1423 CG_CHECK(cg_descriptor_write, (
"Units",
"m"));
1434 CG_CHECK(cg_nsections, (mfn, mB, mZ, &nS));
1438 CG_CHECK(cg_goto, (fn, B,
"Zone_t", Z,
"end"));
1440 std::vector<const Connectivity*> conns;
1445 std::vector<const Connectivity*>::const_iterator c;
1446 for (c=conns.begin(); c!=conns.end(); ++c) {
1447 int nItems = (*c)->size_of_items();
1448 int nGhost = (*c)->size_of_ghost_items();
1450 DEBUG_MSG(
"Writing attribute '" << (*c)->name() <<
"', nItems == "
1451 << nItems <<
", elemType == " << (*c)->element_type());
1453 label =
"Empty" + (*c)->name();
1454 S =
WriteElements(mfn, mB, mZ, (*c)->element_type(), nItems,
1455 NULL,
false, 0, (*c)->index_offset() + 1, label,
1457 }
else if ((*c)->pointer() == NULL) {
1458 label =
"Null" + (*c)->name();
1459 S =
WriteElements(mfn, mB, mZ, (*c)->element_type(), nItems,
1460 NULL,
false, 0, (*c)->index_offset() + 1, label,
1464 label = (*c)->name();
1465 S =
WriteElements(mfn, mB, mZ, (*c)->element_type(), nItems,
1466 (*c)->pointer(), ((*c)->stride() == 1),
1467 (*c)->capacity(), (*c)->index_offset() + 1,
1468 label, errorhandle);
1474 int elemRind[2] = { 0, nGhost };
1475 CG_CHECK(cg_goto, (mfn, mB,
"Zone_t", mZ,
"Elements_t", S,
"end"));
1476 CG_CHECK(cg_rind_write, (elemRind));
1480 if (!mfile.empty()) {
1492 CG_CHECK(cg_link_write, (label.c_str(), (mfile).c_str(),
1493 (path + label).c_str()));
1499 }
else if (!mfile.empty()) {
1504 CG_CHECK(cg_goto, (fn, B,
"Zone_t", Z,
"end"));
1505 CG_CHECK(cg_ngrids, (fn, B, Z, &nGC));
1508 CG_CHECK(cg_link_write, (
"GridCoordinates", (mfile).c_str(),
1509 (path +
"GridCoordinates").c_str()));
1512 if (fname_in.compare(mfile)!=0){
1514 CG_CHECK(cg_link_write, (gridName.c_str(), (mfile).c_str(),
1515 (path +
"GridCoordinates").c_str()));
1518 CG_CHECK(cg_link_write, (gridName.c_str(),
"",
1519 (path +
"GridCoordinates").c_str()));
1525 ((prefix+mfile).c_str(), MODE_MODIFY, &mfn));
1532 sizes, zType, &mZ, errorhandle));
1534 CG_CHECK(cg_goto, (fn, B,
"Zone_t", Z,
"end"));
1537 CG_CHECK(cg_nsections, (mfn, mB, mZ, &nS));
1540 ElementType_t eType;
1541 int min,
max, nBoundary, parent;
1542 for (S=1; S<=nS; ++S) {
1543 CG_CHECK(cg_section_read, (mfn, mB, mZ, S, label, &eType, &min, &max,
1544 &nBoundary, &parent));
1546 CG_CHECK(cg_link_write, (label, (mfile).c_str(), (path + label).c_str()));
1579 std::vector<const Attribute*> attrs;
1614 std::vector<const Attribute*>::const_iterator begin = attrs.begin();
1615 std::vector<const Attribute*>::const_iterator end = attrs.end();
1618 while (begin != end && (*begin)->id() != attr->id())
1621 "Rocout::write_attribute: can't find attribute in pane");
1625 std::vector<const Attribute*>::const_iterator a;
1632 for (a=begin; a!=end; ++a) {
1633 DEBUG_MSG(
"Writing attribute '" << (*a)->name() <<
"', id == "
1634 << (*a)->id() <<
", components == " << (*a)->size_of_components()
1635 <<
", location == '" << (*a)->location() <<
"\', datatype == "
1636 << (*a)->data_type());
1637 goToNextItem =
false;
1638 int A, size[3], nComp = (*a)->size_of_components(),
offset;
1639 const void* pData[9];
1640 dType = (*a)->data_type();
1641 switch ((*a)->location()) {
1644 size[0] = numItems = (*a)->size_of_items();
1645 size[1] = size[2] = 1;
1647 rind[1] = (*a)->size_of_ghost_items();
1653 CG_CHECK(cg_goto, (fn, B,
"IntegralData_t", T,
"end"));
1661 for (
int ii=1; ii<=
offset; ii++)
1663 cg_array_info(ii, arrName, &dT, &tt1, &tt2);
1665 if ((std::string(arrName)).find(std::string((*a)->name())) != std::string::npos) {
1667 goToNextItem =
true;
1674 for (A=0; A<nComp; ++
A) {
1675 CG_CHECK(cg_goto, (fn, B,
"IntegralData_t", T,
"end"));
1677 label = (*a)->name();
1683 pa = pane.
attribute((*a)->id() + A + 1);
1684 std::ostringstream sout;
1685 sout << label <<
'#' << A + 1 <<
"of" << nComp;
1689 #ifdef DEBUG_DUMP_PREFIX
1690 std::ofstream fout((DEBUG_DUMP_PREFIX + std::string(material) +
'.' + (*a)->name() +
'_' + timeLevel +
".cgns").c_str(), std::ios_base::app);
1691 #endif // DEBUG_DUMP_PREFIX
1692 bool isNull =
false;
1694 if (numItems <= (writeGhost ? 0 : rind[1])) {
1696 std::fill(buf.begin(), buf.end(),
'\0');
1697 pData[
A] = &(buf[0]);
1702 }
else if (pData[A] == NULL) {
1705 std::fill(buf.begin(), buf.end(),
'\0');
1706 pData[
A] = &(buf[0]);
1711 int stride = pa->
stride();
1714 buf.resize(dSize *
std::max(numItems, 1));
1715 for (i=0; i<numItems; ++
i)
1716 std::memcpy(&(buf[i*dSize]),
1717 &(((
const char*)pData[A])[i*stride*dSize]), dSize);
1718 pData[
A] = &(buf[0]);
1721 #ifdef DEBUG_DUMP_PREFIX
1725 for (i=0; i<numItems; ++
i)
1726 fout << i <<
" : " << (
int)((
const char*)(pData[A]))[i]
1730 for (i=0; i<numItems; ++
i)
1731 fout << i <<
" : " << ((
const int*)(pData[
A]))[
i] <<
'\n';
1734 for (i=0; i<numItems; ++
i)
1735 fout << i <<
" : " << ((
const float*)(pData[
A]))[
i] <<
'\n';
1738 for (i=0; i<numItems; ++
i)
1739 fout << i <<
" : " << ((
const double*)(pData[
A]))[
i]
1745 fout <<
"###########################################\n";
1747 #endif // DEBUG_DUMP_PREFIX
1752 (
const COM_TT*)pData[A], range));
1756 1, size, pData[
A]));
1759 1, rind, size, pData[
A]));
1762 CG_CHECK(cg_goto, (fn, B,
"IntegralData_t", T,
"DataArray_t",
1765 CG_CHECK(cg_descriptor_write, (
"Range", range.c_str()));
1766 DEBUG_MSG(
"Writing descriptor 'Range': '" << range <<
'\'');
1767 if (!pa->
unit().empty()) {
1769 CG_CHECK(cg_descriptor_write, (
"Units", pa->
unit().c_str()));
1770 DEBUG_MSG(
"Writing descriptor 'Units': '" << pa->
unit() <<
'\'');
1775 std::ostringstream sout;
1777 CG_CHECK(cg_descriptor_write, (
"Ghost", sout.str().c_str()));
1778 DEBUG_MSG(
"Writing descriptor 'Ghost': '" << sout.str() <<
'\'');
1784 size[0] = numItems = (*a)->size_of_items();
1785 size[1] = size[2] = 1;
1787 rind[1] = (*a)->size_of_ghost_items();
1789 DEBUG_MSG(
"numItems == " << numItems <<
", numGhostItems == "
1792 CG_CHECK(cg_goto, (fn, B,
"Zone_t", Z,
"end"));
1796 CG_CHECK(cg_goto, (fn, B,
"Zone_t", Z,
"IntegralData_t", T,
"end"));
1804 for (
int ii=1; ii<=
offset; ii++)
1806 cg_array_info(ii, arrName, &dT, &tt1, &tt2);
1808 if ((std::string(arrName)).find(std::string((*a)->name())) != std::string::npos) {
1810 goToNextItem =
true;
1820 for (A=0; A<nComp; ++
A) {
1821 CG_CHECK(cg_goto, (fn, B,
"Zone_t", Z,
"IntegralData_t", T,
"end"));
1823 label = (*a)->name();
1829 pa = pane.
attribute((*a)->id() + A + 1);
1830 std::ostringstream sout;
1831 sout << label <<
'#' << A + 1 <<
"of" << nComp;
1835 #ifdef DEBUG_DUMP_PREFIX
1836 std::ofstream fout((DEBUG_DUMP_PREFIX + std::string(material) +
'.' + (*a)->name() +
'_' + timeLevel +
".cgns").c_str(), std::ios_base::app);
1837 #endif // DEBUG_DUMP_PREFIX
1838 bool isNull =
false;
1840 if (numItems <= (writeGhost ? 0 : rind[1])) {
1842 std::fill(buf.begin(), buf.end(),
'\0');
1843 pData[
A] = &(buf[0]);
1848 }
else if (pData[A] == NULL) {
1851 std::fill(buf.begin(), buf.end(),
'\0');
1852 pData[
A] = &(buf[0]);
1857 int stride = pa->
stride();
1860 buf.resize(dSize *
std::max(numItems, 1));
1861 for (i=0; i<numItems; ++
i)
1862 std::memcpy(&(buf[i*dSize]),
1863 &(((
const char*)pData[A])[i*stride*dSize]), dSize);
1864 pData[
A] = &(buf[0]);
1867 #ifdef DEBUG_DUMP_PREFIX
1871 for (i=0; i<numItems; ++
i)
1872 fout << i <<
" : " << (
int)((
const char*)(pData[A]))[i]
1876 for (i=0; i<numItems; ++
i)
1877 fout << i <<
" : " << ((
const int*)(pData[
A]))[
i] <<
'\n';
1880 for (i=0; i<numItems; ++
i)
1881 fout << i <<
" : " << ((
const float*)(pData[
A]))[
i] <<
'\n';
1884 for (i=0; i<numItems; ++
i)
1885 fout << i <<
" : " << ((
const double*)(pData[
A]))[
i]
1891 fout <<
"###########################################\n";
1893 #endif // DEBUG_DUMP_PREFIX
1897 (
const COM_TT*)pData[A], range));
1901 1, size, pData[
A]));
1904 1, rind, size, pData[
A]));
1911 CG_CHECK(cg_goto, (fn, B,
"Zone_t", Z,
"IntegralData_t", T,
1912 "DataArray_t", A +
offset,
"end"));
1914 CG_CHECK(cg_descriptor_write, (
"Range", range.c_str()));
1915 DEBUG_MSG(
"Writing descriptor 'Range' == '" << range <<
'\'');
1916 if (!pa->
unit().empty()) {
1918 DEBUG_MSG(
"Writing descriptor 'Units' == '" << pa->
unit() <<
'\'');
1919 CG_CHECK(cg_descriptor_write, (
"Units", pa->
unit().c_str()));
1924 std::ostringstream sout;
1926 CG_CHECK(cg_descriptor_write, (
"Ghost", sout.str().c_str()));
1927 DEBUG_MSG(
"Writing descriptor 'Ghost' == '" << sout.str() <<
'\'');
1934 DEBUG_MSG(
"Special COM_RIDGES handling: zType == "
1935 << (zType == Structured ?
"Structured" :
"Unstructured")
1936 <<
", size_of_components() == "
1937 << (*a)->size_of_components() <<
", size_of_items() == "
1938 << (*a)->size_of_items());
1939 if (zType == Unstructured && (*a)->size_of_components() == 2
1940 && (*a)->size_of_items() > 0) {
1942 std::string newName(material);
1943 newName +=
"_ridges";
1946 <<
"\", cellDim == 1, physDim == " << physDim);
1951 CG_CHECK(cg_goto, (fn, RB,
"end"));
1952 CG_CHECK(cg_units_write, (Kilogram, Meter, Second, Kelvin, Degree));
1954 std::string rpath(
"/");
1958 if (cg_goto(fn, RB,
"BaseIterativeData_t", 1,
"end") != 0) {
1961 << rpath +
"TimeIterValues");
1962 CG_CHECK(cg_goto, (fn, RB,
"end"));
1963 CG_CHECK(cg_link_write, (
"TimeIterValues",
"",
1964 (rpath +
"TimeIterValues").c_str()));
1970 int RZ, rsizes[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
1971 rsizes[0] = sizes[0];
1972 rsizes[1] = (*a)->size_of_real_items();
1973 DEBUG_MSG(
"Creating zone \"" << zoneName <<
"\", size == [ "
1974 << rsizes[0] <<
", " << rsizes[1] <<
" ]");
1977 Unstructured, &RZ, errorhandle));
1980 if (cg_goto(fn, RB,
"Zone_t", RZ,
1981 "ZoneIterativeData_t", 1,
"end") != 0) {
1982 CG_CHECK(cg_goto, (fn, RB,
"Zone_t", RZ,
"end"));
1987 DEBUG_MSG(
"Linking ZoneIterativeData to "
1988 << rpath +
"ZoneIterativeData");
1989 CG_CHECK(cg_link_write, (
"ZoneIterativeData",
"",
1990 (rpath +
"ZoneIterativeData").c_str()));
1994 << rpath +
"GridCoordinates");
1995 CG_CHECK(cg_link_write, (
"GridCoordinates",
"",
1996 (rpath +
"GridCoordinates").c_str()));
1997 DEBUG_MSG(
"Linking " << gridName <<
" to " << rpath + gridName);
1998 CG_CHECK(cg_link_write, (gridName.c_str(),
"",
1999 (rpath + gridName).c_str()));
2002 DEBUG_MSG(
"Linking " << nodeName <<
" to "
2003 << rpath + nodeName);
2004 CG_CHECK(cg_link_write, (nodeName.c_str(),
"",
2005 (rpath + nodeName).c_str()));
2011 DEBUG_MSG(
"Retreived the 'ridges' components: '" << pa[0]->name()
2012 <<
"' and '" << pa[1]->name() <<
'\'');
2018 DEBUG_MSG(
"Writing " << nItems <<
" BAR_2 elements (with "
2019 << nGhost <<
" ghost elements)");
2022 COM_assertion((pa[0]->pointer()==NULL) == (pa[1]->pointer()==NULL));
2028 label = (*a)->name();
2029 std::vector<int> bar(2 * nItems);
2030 for (i=0; i<2; ++
i) {
2031 int* ptr = (
int*)pa[i]->pointer();
2032 int j, stride =
std::max(pa[i]->stride(), 1);
2033 for (j=0; j<nItems; ++
j)
2034 bar[2*j+i] = ptr[j*stride];
2037 &bar[0],
false, 0, 1, label, errorhandle);
2041 int elemRind[2] = { 0, nGhost };
2043 (fn, RB,
"Zone_t", RZ,
"Elements_t", RS,
"end"));
2044 CG_CHECK(cg_rind_write, (elemRind));
2047 }
else if ((*a)->name() ==
"bcflag") {
2054 size[0] = numItems = (*a)->size_of_items();
2055 size[1] = size[2] = 1;
2057 rind[1] = (*a)->size_of_ghost_items();
2059 CG_CHECK(cg_goto, (fn, B,
"Zone_t", Z,
"end"));
2063 CG_CHECK(cg_goto, (fn, B,
"Zone_t", Z,
"IntegralData_t", T,
"end"));
2067 for (A=0; A<nComp; ++
A) {
2068 CG_CHECK(cg_goto, (fn, B,
"Zone_t", Z,
"IntegralData_t", T,
"end"));
2070 label = (*a)->name();
2076 pa = pane.
attribute((*a)->id() + A + 1);
2077 std::ostringstream sout;
2078 sout << label <<
'#' << A + 1 <<
"of" << nComp;
2082 #ifdef DEBUG_DUMP_PREFIX
2083 std::ofstream fout((DEBUG_DUMP_PREFIX + std::string(material) +
'.' + (*a)->name() +
'_' + timeLevel +
".cgns").c_str(), std::ios_base::app);
2084 #endif // DEBUG_DUMP_PREFIX
2085 bool isNull =
false;
2087 if (numItems <= (writeGhost ? 0 : rind[1])) {
2089 std::fill(buf.begin(), buf.end(),
'\0');
2090 pData[
A] = &(buf[0]);
2095 }
else if (pData[A] == NULL) {
2098 std::fill(buf.begin(), buf.end(),
'\0');
2099 pData[
A] = &(buf[0]);
2104 int stride = pa->
stride();
2107 buf.resize(dSize *
std::max(numItems, 1));
2108 for (i=0; i<numItems; ++
i)
2109 std::memcpy(&(buf[i*dSize]),
2110 &(((
const char*)pData[A])[i*stride*dSize]), dSize);
2111 pData[
A] = &(buf[0]);
2114 #ifdef DEBUG_DUMP_PREFIX
2118 for (i=0; i<numItems; ++
i)
2119 fout << i <<
" : " << (
int)((
const char*)(pData[A]))[i]
2123 for (i=0; i<numItems; ++
i)
2124 fout << i <<
" : " << ((
const int*)(pData[
A]))[
i] <<
'\n';
2127 for (i=0; i<numItems; ++
i)
2128 fout << i <<
" : " << ((
const float*)(pData[
A]))[
i] <<
'\n';
2131 for (i=0; i<numItems; ++
i)
2132 fout << i <<
" : " << ((
const double*)(pData[
A]))[
i]
2138 fout <<
"###########################################\n";
2140 #endif // DEBUG_DUMP_PREFIX
2144 (
const COM_TT*)pData[A], range));
2148 1, size, pData[
A]));
2151 1, rind, size, pData[
A]));
2154 CG_CHECK(cg_goto, (fn, B,
"Zone_t", Z,
"IntegralData_t", T,
2155 "DataArray_t", A +
offset,
"end"));
2157 CG_CHECK(cg_descriptor_write, (
"Range", range.c_str()));
2158 DEBUG_MSG(
"Writing descriptor 'Range': '" << range <<
'\'');
2159 if (!pa->
unit().empty()) {
2161 CG_CHECK(cg_descriptor_write, (
"Units", pa->
unit().c_str()));
2162 DEBUG_MSG(
"Writing descriptor 'Units': '" << pa->
unit() <<
'\'');
2167 std::ostringstream sout;
2169 CG_CHECK(cg_descriptor_write, (
"Ghost", sout.str().c_str()));
2170 DEBUG_MSG(
"Writing descriptor 'Ghost': '" << sout.str() <<
'\'');
2181 size[2] = cellDim > 2 ? pane.
size_k() : 1;
2183 size[1] = size[2] = 1;
2185 numItems = size[0] * size[1] * size[2];
2189 size[0] = numItems = (*a)->size_of_items();
2190 size[1] = size[2] = 1;
2191 std::fill_n(rind, 6, 0);
2192 rind[1] = (*a)->size_of_ghost_items();
2198 CG_CHECK(cg_goto, (fn, B,
"Zone_t", Z,
"FlowSolution_t", T,
"end"));
2199 CG_CHECK(cg_gridlocation_write, (Vertex));
2210 for (A=0; A<nComp; ++
A) {
2211 CG_CHECK(cg_goto, (fn, B,
"Zone_t", Z,
"FlowSolution_t", T,
"end"));
2213 label = (*a)->name();
2219 pa = pane.
attribute((*a)->id() + A + 1);
2220 if (nComp == physDim) {
2221 label += (char)(
'X' + (
char)
A);
2222 }
else if (nComp == physDim * physDim) {
2223 label += (char)(
'X' + (
char)(A / physDim));
2224 label += (char)(
'X' + (
char)(A % physDim));
2226 std::ostringstream sout;
2227 sout << label <<
'#' << A + 1 <<
"of" << nComp;
2232 #ifdef DEBUG_DUMP_PREFIX
2233 std::ofstream fout((DEBUG_DUMP_PREFIX + std::string(material) +
'.' + (*a)->name() +
'_' + timeLevel +
".cgns").c_str(), std::ios_base::app);
2234 #endif // DEBUG_DUMP_PREFIX
2235 bool isNull =
false;
2237 if (numItems <= 0) {
2239 std::fill(buf.begin(), buf.end(),
'\0');
2240 pData[
A] = &(buf[0]);
2241 size[0] = size[1] = size[2] = 1;
2243 }
else if (pData[A] == NULL) {
2246 std::fill(buf.begin(), buf.end(),
'\0');
2247 pData[
A] = &(buf[0]);
2252 int stride = pa->
stride();
2255 buf.resize(dSize *
std::max(numItems, 1));
2256 for (i=0; i<numItems; ++
i) {
2257 std::memcpy(&(buf[i*dSize]),
2258 &(((
const char*)pData[A])[i*stride*dSize]), dSize);
2260 pData[
A] = &(buf[0]);
2262 #ifdef DEBUG_DUMP_PREFIX
2266 for (i=0; i<numItems; ++
i)
2267 fout << i <<
" : " << (
int)((
const char*)(pData[A]))[i]
2271 for (i=0; i<numItems; ++
i)
2272 fout << i <<
" : " << ((
const int*)(pData[
A]))[
i] <<
'\n';
2275 for (i=0; i<numItems; ++
i)
2276 fout << i <<
" : " << ((
const float*)(pData[
A]))[
i] <<
'\n';
2279 for (i=0; i<numItems; ++
i)
2280 fout << i <<
" : " << ((
const double*)(pData[
A]))[
i]
2286 fout <<
"###########################################\n";
2288 #endif // DEBUG_DUMP_PREFIX
2292 (
const COM_TT*)pData[A], range));
2295 DEBUG_MSG(
"Calling cg_array_write( name == '" << label
2296 <<
"', dataType == "
2297 << (
COM2CGNS(dType) == RealSingle ?
"float"
2298 : (
COM2CGNS(dType) == RealDouble ?
"double"
2299 : (
COM2CGNS(dType) == Character ?
"char" :
"int?")))
2300 <<
", rank == " << rank <<
", size[] = { " << size[0]
2301 <<
", " << size[1] <<
", " << size[2] <<
" } )");
2303 rank, size, pData[
A]));
2305 DEBUG_MSG(
"Calling cg_array_core_write( name == '" << label
2306 <<
"', dataType == "
2307 << (
COM2CGNS(dType) == RealSingle ?
"float"
2308 : (
COM2CGNS(dType) == RealDouble ?
"double"
2309 : (
COM2CGNS(dType) == Character ?
"char" :
"int?")))
2310 <<
", rank == " << rank <<
", rind[] = { " << rind[0]
2311 <<
", " << rind[1] <<
", " << rind[2] <<
", " << rind[3]
2312 <<
", " << rind[4] <<
", " << rind[5] <<
" }, size[] = { "
2313 << size[0] <<
", " << size[1] <<
", " << size[2]
2316 rank, rind, size, pData[
A]));
2319 CG_CHECK(cg_goto, (fn, B,
"Zone_t", Z,
"FlowSolution_t", T,
2320 "DataArray_t", A +
offset,
"end"));
2322 DEBUG_MSG(
"Calling cg_descriptor_write( name == 'Range', "
2323 <<
"value == '" << range <<
"' )");
2324 CG_CHECK(cg_descriptor_write, (
"Range", range.c_str()));
2325 if (!pa->
unit().empty()) {
2327 DEBUG_MSG(
"Calling cg_descriptor_write( name == 'Units', "
2328 <<
"value == '" << pa->
unit() <<
"' )");
2329 CG_CHECK(cg_descriptor_write, (
"Units", pa->
unit().c_str()));
2336 CG_CHECK(cg_goto, (fn, B,
"Zone_t", Z,
"FlowSolution_t", T,
2337 "DataArray_t",
offset,
"end"));
2340 (
const COM_TT**)pData,
2342 CG_CHECK(cg_descriptor_write, (
"MagnitudeRange", range.c_str()));
2343 }
else if (nComp == 9) {
2344 CG_CHECK(cg_goto, (fn, B,
"Zone_t", Z,
"FlowSolution_t", T,
2345 "DataArray_t",
offset,
"end"));
2348 (
const COM_TT**)pData, range));
2349 CG_CHECK(cg_descriptor_write, (
"TraceRange", range.c_str()));
2356 size[0] = pane.
size_i() - 1;
2358 size[1] = pane.
size_j() - 1;
2359 size[2] = cellDim > 2 ? pane.
size_k() - 1 : 1;
2361 size[1] = size[2] = 1;
2363 numItems = size[0] * size[1] * size[2];
2367 size[0] = numItems = (*a)->size_of_items();
2368 size[1] = size[2] = 1;
2369 std::fill_n(rind, 6, 0);
2370 rind[1] = (*a)->size_of_ghost_items();
2376 CG_CHECK(cg_goto, (fn, B,
"Zone_t", Z,
"FlowSolution_t", T,
"end"));
2377 CG_CHECK(cg_gridlocation_write, (CellCenter));
2393 for (
int ii=1; ii<=
offset; ii++)
2395 cg_array_info(ii, arrName, &dT, &tt1, &tt2);
2397 if ((std::string(arrName)).find(std::string((*a)->name())) != std::string::npos) {
2399 goToNextItem =
true;
2410 for (A=0; A<nComp; ++
A) {
2412 CG_CHECK(cg_goto, (fn, B,
"Zone_t", Z,
"FlowSolution_t", T,
"end"));
2415 label = (*a)->name();
2422 pa = pane.
attribute((*a)->id() + A + 1);
2423 if (nComp == physDim) {
2424 label += (char)(
'X' + (
char)
A);
2425 }
else if (nComp == physDim * physDim) {
2426 label += (char)(
'X' + (
char)(A / physDim));
2427 label += (char)(
'X' + (
char)(A % physDim));
2429 std::ostringstream sout;
2430 sout << label <<
'#' << A + 1 <<
"of" << nComp;
2436 #ifdef DEBUG_DUMP_PREFIX
2437 std::ofstream fout((DEBUG_DUMP_PREFIX + std::string(material) +
'.' + (*a)->name() +
'_' + timeLevel +
".cgns").c_str(), std::ios_base::app);
2438 #endif // DEBUG_DUMP_PREFIX
2439 bool isNull =
false;
2442 if (numItems <= 0) {
2445 std::fill(buf.begin(), buf.end(),
'\0');
2446 pData[
A] = &(buf[0]);
2447 size[0] = size[1] = size[2] = 1;
2449 }
else if (pData[A] == NULL) {
2453 std::fill(buf.begin(), buf.end(),
'\0');
2454 pData[
A] = &(buf[0]);
2460 int stride = pa->
stride();
2465 buf.resize(dSize *
std::max(numItems, 1));
2467 for (i=0; i<numItems; ++
i) {
2468 std::memcpy(&(buf[i*dSize]),
2469 &(((
const char*)pData[A])[i*stride*dSize]), dSize);
2472 pData[
A] = &(buf[0]);
2474 #ifdef DEBUG_DUMP_PREFIX
2478 for (i=0; i<numItems; ++
i)
2479 fout << i <<
" : " << (
int)((
const char*)(pData[A]))[i]
2483 for (i=0; i<numItems; ++
i)
2484 fout << i <<
" : " << ((
const int*)(pData[
A]))[
i] <<
'\n';
2487 for (i=0; i<numItems; ++
i)
2488 fout << i <<
" : " << ((
const float*)(pData[
A]))[
i] <<
'\n';
2491 for (i=0; i<numItems; ++
i)
2492 fout << i <<
" : " << ((
const double*)(pData[
A]))[
i]
2498 fout <<
"###########################################\n";
2500 #endif // DEBUG_DUMP_PREFIX
2504 (
const COM_TT*)pData[A], range));
2507 DEBUG_MSG(
"Calling cg_array_write( name == '" << label
2508 <<
"', dataType == "
2509 << (
COM2CGNS(dType) == RealSingle ?
"float"
2510 : (
COM2CGNS(dType) == RealDouble ?
"double"
2511 : (
COM2CGNS(dType) == Character ?
"char" :
"int?")))
2512 <<
", rank == " << rank <<
", size[] = { " << size[0]
2513 <<
", " << size[1] <<
", " << size[2] <<
" } )");
2515 rank, size, pData[
A]));
2517 DEBUG_MSG(
"Calling cg_array_core_write( name == '" << label
2518 <<
"', dataType == "
2519 << (
COM2CGNS(dType) == RealSingle ?
"float"
2520 : (
COM2CGNS(dType) == RealDouble ?
"double"
2521 : (
COM2CGNS(dType) == Character ?
"char" :
"int?")))
2522 <<
", rank == " << rank <<
", rind[] = { " << rind[0]
2523 <<
", " << rind[1] <<
", " << rind[2] <<
", " << rind[3]
2524 <<
", " << rind[4] <<
", " << rind[5] <<
" }, size[] = { "
2525 << size[0] <<
", " << size[1] <<
", " << size[2]
2528 rank, rind, size, pData[
A]));
2531 CG_CHECK(cg_goto, (fn, B,
"Zone_t", Z,
"FlowSolution_t", T,
2532 "DataArray_t", A +
offset,
"end"));
2534 DEBUG_MSG(
"Calling cg_descriptor_write( name == 'Range', "
2535 <<
"value == '" << range <<
"' )");
2536 CG_CHECK(cg_descriptor_write, (
"Range", range.c_str()));
2537 if (!pa->
unit().empty()) {
2539 DEBUG_MSG(
"Calling cg_descriptor_write( name == 'Units', "
2540 <<
"value == '" << pa->
unit() <<
"' )");
2541 CG_CHECK(cg_descriptor_write, (
"Units", pa->
unit().c_str()));
2549 CG_CHECK(cg_goto, (fn, B,
"Zone_t", Z,
"FlowSolution_t", T,
2550 "DataArray_t",
offset,
"end"));
2553 (
const COM_TT**)pData,
2555 CG_CHECK(cg_descriptor_write, (
"MagnitudeRange", range.c_str()));
2556 }
else if (nComp == 9) {
2557 CG_CHECK(cg_goto, (fn, B,
"Zone_t", Z,
"FlowSolution_t", T,
2558 "DataArray_t",
offset,
"end"));
2561 (
const COM_TT**)pData, range));
2562 CG_CHECK(cg_descriptor_write, (
"TraceRange", range.c_str()));
static int cg_base_find_or_create(int fn, const char *name, int cellDim, int physDim, int *B, const std::string &errorhandle)
Find the named Base_t node, or create one if it doesn't exist.
Size size_of_real_elements() const
Get the number of real elements in the pane (excluding ghost elements).
A Pane object contains a mesh, pane attribute, and field variables.
void FindTraceRange(int physDim, int rank, const int *size, const int *rind, const T **pData, std::string &range)
Find the minimum and maximum core trace.
void FindRange(int rank, const int *size, const int *rind, const T *pData, std::string &range)
Find the minimum and maximum core value.
#define COM_assertion(EX)
Error checking utility similar to the assert macro of the C language.
Automatically save and restore the current working directory.
An Attribute object is a data member of a window.
#define COM_assertion_msg(EX, msg)
static DataType_t COM2CGNS(int dType)
Convert a Roccom data type to a CGNS data type.
void FindMagnitudeRange(int physDim, int rank, const int *size, const int *rind, const T **pData, std::string &range)
Find the minimum and maximum core magnitude.
static int cg_integral_find_or_create(const char *name, int *I, const std::string &errorhandle)
Find the named IntegralData_t node, or create one if it doesn't exist.
static int cg_zone_find_or_create(int fn, int B, const char *name, const int *sizes, ZoneType_t zType, int *Z, const std::string &errorhandle)
Find the named Zone_t node, or create one if it doesn't exist.
Vector_n max(const Array_n_const &v1, const Array_n_const &v2)
A Window object contains multiple panes and multiple data attributes.
static void cg_exponents_as_string_write(std::string unit, const std::string &errorhandle)
bool is_structured() const
Is mesh of the pane structured?
Size size_of_ghost_nodes() const
Get the number of ghost nodes.
Automatically close open files, datasets, etc.
real *8 function offset(vNorm, x2, y2, z2)
Size size_k() const
Get the number of nodes in k-dimension if the mesh is structured.
Shorter_size location() const
Obtain the location of the attribute.
Attribute * attribute(const std::string &a)
Obtain the attribute from given name.
const std::string & unit() const
Obtain the unit of the attribute.
const void * pointer() const
Obtain a constant pointer to the physical address.
int size_of_ghost_items() const
Obtain the number of ghost items in the attribute.
static int WriteElements(int fn, int B, int Z, int eType, int nElems, const int *elems, bool isStaggered, int length, int offset, const std::string &label, const std::string &errorhandle)
Build and write out an Elements_t node.
#define SwitchOnCOMDataType(dType, funcCall)
Call a templated function based on a Roccom data type.
Size size_of_ghost_layers() const
Dimension of the pane.
static int cg_array_info_by_name(const char *name, int *A, DataType_t *dType, int *rank, int *size, const std::string &errorhandle)
Return information on the named DataArray_t node.
Size size_j() const
Get the number of nodes in j-dimension if the mesh is structured.
static int get_sizeof(MPI_Datatype i)
Get the size of a given MPI data type.
int stride() const
Obtain the stride of the attribute in base datatype.
bool is_unstructured() const
Is mesh of the pane unstructured?
static int cg_sol_find_or_create(int fn, int B, int Z, const char *name, GridLocation_t location, int *S, const std::string &errorhandle)
Find the named FlowSolution_t node, or create one if it doesn't exist.
int size_of_real_items() const
Obtain the number of real items in the attribute.
void elements(std::vector< Connectivity * > &es)
Obtain all the element connectivities of the pane.
Vector_n min(const Array_n_const &v1, const Array_n_const &v2)
Size size_of_real_nodes() const
Get the number of real nodes in the pane (excluding ghost nodes).
Pane & pane(const int pane_id, bool insert=false)
Find the pane with given ID. If not found, insert a pane with given ID.
Size size_of_nodes() const
Get the total number of nodes in the pane (including ghost nodes).
int dimension() const
Dimension of the pane.
static int cg_array_core_write(char const *name, DataType_t dType, int rank, int *rind, int const *size, void const *data)
COM_Type data_type() const
Obtain the data type of each component of the attribute.
int id() const
Obtain the id (or index) of the attribute.
Size size_i() const
Get the number of nodes in i-dimension if the mesh is structured.
void attributes(std::vector< Attribute * > &as)
Obtain all the attributes of the pane.
#define CG_CHECK(routine, args)
Perform CGNS error-checking.
int id() const
Get the ID of the pane.
int size_of_items() const
Obtain the number of items in the attribute.
int size_of_components() const
Obtain the number of components in the attribute.