void PViewDataList::reverseElement(int step, int ent, int ele) { if(step) return; if(ele != _lastElement) _setLast(ele); // copy data std::vector<double> XYZ(3 * _lastNumNodes); for(std::size_t i = 0; i < XYZ.size(); i++) XYZ[i] = _lastXYZ[i]; std::vector<double> V(_lastNumNodes * _lastNumComponents * getNumTimeSteps()); for(std::size_t i = 0; i < V.size(); i++) V[i] = _lastVal[i]; // reverse node order for(int i = 0; i < _lastNumNodes; i++) { _lastXYZ[i] = XYZ[_lastNumNodes - i - 1]; _lastXYZ[_lastNumNodes + i] = XYZ[2 * _lastNumNodes - i - 1]; _lastXYZ[2 * _lastNumNodes + i] = XYZ[3 * _lastNumNodes - i - 1]; } for(int step = 0; step < getNumTimeSteps(); step++) for(int i = 0; i < _lastNumNodes; i++) for(int k = 0; k < _lastNumComponents; k++) _lastVal[_lastNumComponents * _lastNumNodes * step + _lastNumComponents * i + k] = V[_lastNumComponents * _lastNumNodes * step + _lastNumComponents * (_lastNumNodes - i - 1) + k]; }
bool PViewData::writeTXT(const std::string &fileName) { FILE *fp = Fopen(fileName.c_str(), "w"); if(!fp){ Msg::Error("Unable to open file '%s'", fileName.c_str()); return false; } for(int step = 0; step < getNumTimeSteps(); step++){ for(int ent = 0; ent < getNumEntities(step); ent++){ for(int ele = 0; ele < getNumElements(step, ent); ele++){ if(skipElement(step, ent, ele)) continue; for(int nod = 0; nod < getNumNodes(step, ent, ele); nod++){ double x, y, z; getNode(step, ent, ele, nod, x, y, z); fprintf(fp, "%d %.16g %d %d %.16g %.16g %.16g ", step, getTime(step), ent, ele, x, y, z); for(int comp = 0; comp < getNumComponents(step, ent, ele); comp++){ double val; getValue(step, ent, ele, nod, comp, val); fprintf(fp, "%.16g ", val); } } fprintf(fp, "\n"); } } } fclose(fp); return true; }
bool PViewData::toVector(std::vector<std::vector<double> > &vec) { vec.resize(getNumTimeSteps()); for(int step = 0; step < getNumTimeSteps(); step++){ vec[step].clear(); for(int ent = 0; ent < getNumEntities(step); ent++){ for(int ele = 0; ele < getNumElements(step, ent); ele++){ if(skipElement(step, ent, ele)) continue; for(int nod = 0; nod < getNumNodes(step, ent, ele); nod++){ for(int comp = 0; comp < getNumComponents(step, ent, ele); comp++){ double val; getValue(step, ent, ele, nod, comp, val); vec[step].push_back(val); } } } } } return true; }
bool PViewData::fromVector(const std::vector<std::vector<double> > &vec) { if(empty() || !getNumTimeSteps()){ Msg::Warning("Cannot import vector in an empty view; skipping"); return false; } if((int)vec.size() != getNumTimeSteps()){ Msg::Error("Incompatible number of steps in vector for view import (%d!=%d)", (int)vec.size(), getNumTimeSteps()); return false; } for(int step = 0; step < getNumTimeSteps(); step++){ int i = 0; for(int ent = 0; ent < getNumEntities(step); ent++){ for(int ele = 0; ele < getNumElements(step, ent); ele++){ if(skipElement(step, ent, ele)) continue; for(int nod = 0; nod < getNumNodes(step, ent, ele); nod++){ double x, y, z; getNode(step, ent, ele, nod, x, y, z); for(int comp = 0; comp < getNumComponents(step, ent, ele); comp++){ if(i < (int)vec[step].size()){ setValue(step, ent, ele, nod, comp, vec[step][i++]); } else{ Msg::Error("Bad index (%d) in vector (%d) for view import", i, (int)vec[step].size()); return false; } } } } } } return true; }
bool PViewData::writePOS(const std::string &fileName, bool binary, bool parsed, bool append) { if(_adaptive){ Msg::Warning("Writing adapted dataset (will only export current time step)"); return _adaptive->getData()->writePOS(fileName, binary, parsed, append); } if(hasMultipleMeshes()){ Msg::Error("Cannot export multi-mesh datasets in .pos format"); return false; } if(haveInterpolationMatrices()) Msg::Warning("Discarding interpolation matrices when saving in .pos format"); if(binary || !parsed) Msg::Warning("Only parsed .pos files can be exported for this view type"); FILE *fp = Fopen(fileName.c_str(), append ? "a" : "w"); if(!fp){ Msg::Error("Unable to open file '%s'", fileName.c_str()); return false; } fprintf(fp, "View \"%s\" {\n", getName().c_str()); int firstNonEmptyStep = getFirstNonEmptyTimeStep(); for(int ent = 0; ent < getNumEntities(firstNonEmptyStep); ent++){ for(int ele = 0; ele < getNumElements(firstNonEmptyStep, ent); ele++){ if(skipElement(firstNonEmptyStep, ent, ele)) continue; int type = getType(firstNonEmptyStep, ent, ele); int numComp = getNumComponents(firstNonEmptyStep, ent, ele); const char *s = 0; switch(type){ case TYPE_PNT: s = (numComp == 9) ? "TP" : (numComp == 3) ? "VP" : "SP"; break; case TYPE_LIN: s = (numComp == 9) ? "TL" : (numComp == 3) ? "VL" : "SL"; break; case TYPE_TRI: s = (numComp == 9) ? "TT" : (numComp == 3) ? "VT" : "ST"; break; case TYPE_QUA: s = (numComp == 9) ? "TQ" : (numComp == 3) ? "VQ" : "SQ"; break; case TYPE_TET: s = (numComp == 9) ? "TS" : (numComp == 3) ? "VS" : "SS"; break; case TYPE_HEX: s = (numComp == 9) ? "TH" : (numComp == 3) ? "VH" : "SH"; break; case TYPE_PRI: s = (numComp == 9) ? "TI" : (numComp == 3) ? "VI" : "SI"; break; case TYPE_PYR: s = (numComp == 9) ? "TY" : (numComp == 3) ? "VY" : "SY"; break; } if(s){ fprintf(fp, "%s(", s); int numNod = getNumNodes(firstNonEmptyStep, ent, ele); for(int nod = 0; nod < numNod; nod++){ double x, y, z; getNode(firstNonEmptyStep, ent, ele, nod, x, y, z); fprintf(fp, "%.16g,%.16g,%.16g", x, y, z); if(nod != numNod - 1) fprintf(fp, ","); } bool first = true; for(int step = 0; step < getNumTimeSteps(); step++){ if(hasTimeStep(step)){ for(int nod = 0; nod < numNod; nod++){ for(int comp = 0; comp < numComp; comp++){ double val; getValue(step, ent, ele, nod, comp, val); if(first){ fprintf(fp, "){%.16g", val); first = false; } else fprintf(fp, ",%.16g", val); } } } } fprintf(fp, "};\n"); } } } fprintf(fp, "};\n"); fclose(fp); return true; }