Added: Option to save result components on grid files
This commit is contained in:
parent
520bd0d3c4
commit
cca533fa1c
@ -363,7 +363,7 @@ void SIMoutput::preprocessResPtGroup (std::string& ptFile, ResPointVec& points)
|
|||||||
// Formatted output, use scientific notation with fixed field width.
|
// Formatted output, use scientific notation with fixed field width.
|
||||||
std::streamsize precision = 3;
|
std::streamsize precision = 3;
|
||||||
std::streamsize flWidth = 8 + precision;
|
std::streamsize flWidth = 8 + precision;
|
||||||
std::ofstream os(ptFile.c_str(),std::ios::out);
|
std::ofstream os(ptFile,std::ios::out);
|
||||||
os.flags(std::ios::scientific | std::ios::right);
|
os.flags(std::ios::scientific | std::ios::right);
|
||||||
os.precision(precision);
|
os.precision(precision);
|
||||||
|
|
||||||
@ -837,7 +837,7 @@ int SIMoutput::writeGlvS1 (const Vector& psol, int iStep, int& nBlock,
|
|||||||
ok = myVtf->writeDblk(vID[i],vname.c_str(),idBlock+i,iStep);
|
ok = myVtf->writeDblk(vID[i],vname.c_str(),idBlock+i,iStep);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (idBlock <= (int)this->getNoSpaceDim())
|
if (idBlock <= static_cast<int>(this->getNoSpaceDim()))
|
||||||
idBlock = this->getNoSpaceDim()+1; // since we might have written BCs above
|
idBlock = this->getNoSpaceDim()+1; // since we might have written BCs above
|
||||||
|
|
||||||
std::vector<std::string> xname;
|
std::vector<std::string> xname;
|
||||||
@ -1705,14 +1705,7 @@ bool SIMoutput::evalResults (const Vector& psol, const ResPointVec& gPoints,
|
|||||||
{
|
{
|
||||||
if (A.empty())
|
if (A.empty())
|
||||||
A = B;
|
A = B;
|
||||||
else if (A.rows() == B.rows())
|
else if (!A.augmentCols(B))
|
||||||
{
|
|
||||||
size_t col = A.cols();
|
|
||||||
A.resize(B.rows(),col+B.cols());
|
|
||||||
for (size_t c = 1; c <= B.cols(); c++)
|
|
||||||
A.fillColumn(col+c,B.getColumn(c));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
std::cerr <<" *** SIMoutput::evalResults: Incompatible matrices, rows(A)="
|
std::cerr <<" *** SIMoutput::evalResults: Incompatible matrices, rows(A)="
|
||||||
<< A.rows() <<" rows(B)="<< B.rows() << std::endl;
|
<< A.rows() <<" rows(B)="<< B.rows() << std::endl;
|
||||||
@ -1781,8 +1774,12 @@ bool SIMoutput::dumpVector (const Vector& vsol, const char* fname,
|
|||||||
std::streamsize oldPrec;
|
std::streamsize oldPrec;
|
||||||
std::ios::fmtflags oldFlgs;
|
std::ios::fmtflags oldFlgs;
|
||||||
|
|
||||||
|
int gCount = 0;
|
||||||
for (const ResPtPair& rptp : myPoints)
|
for (const ResPtPair& rptp : myPoints)
|
||||||
{
|
{
|
||||||
|
if (gCount++ == idxGrid)
|
||||||
|
continue; // Skip grid output
|
||||||
|
|
||||||
if (fname)
|
if (fname)
|
||||||
{
|
{
|
||||||
// Formatted output, use scientific notation with fixed field width
|
// Formatted output, use scientific notation with fixed field width
|
||||||
@ -1792,7 +1789,7 @@ bool SIMoutput::dumpVector (const Vector& vsol, const char* fname,
|
|||||||
else if (!rptp.first.empty())
|
else if (!rptp.first.empty())
|
||||||
{
|
{
|
||||||
// Output to a separate file for plotting
|
// Output to a separate file for plotting
|
||||||
fs = new std::ofstream(rptp.first.c_str(),std::ios::out);
|
fs = new std::ofstream(rptp.first,std::ios::out);
|
||||||
oldPrec = fs->precision(precision);
|
oldPrec = fs->precision(precision);
|
||||||
oldFlgs = fs->flags(std::ios::scientific | std::ios::right);
|
oldFlgs = fs->flags(std::ios::scientific | std::ios::right);
|
||||||
}
|
}
|
||||||
@ -1884,12 +1881,18 @@ bool SIMoutput::dumpResults (const Vector& psol, double time,
|
|||||||
if (psol.empty())
|
if (psol.empty())
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
myProblem->initResultPoints(time);
|
int gCount = 0;
|
||||||
|
bool first = true;
|
||||||
for (const ResPtPair& rptp : myPoints)
|
for (const ResPtPair& rptp : myPoints)
|
||||||
if (!formatted || rptp.first.empty())
|
if (gCount++ != idxGrid && (!formatted || rptp.first.empty()))
|
||||||
|
{
|
||||||
|
if (first)
|
||||||
|
myProblem->initResultPoints(time);
|
||||||
|
first = false;
|
||||||
|
|
||||||
if (!this->dumpResults(psol,time,os,rptp.second,formatted,precision))
|
if (!this->dumpResults(psol,time,os,rptp.second,formatted,precision))
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -1900,15 +1903,18 @@ bool SIMoutput::savePoints (const Vector& psol, double time, int step) const
|
|||||||
if (step < 1 || psol.empty())
|
if (step < 1 || psol.empty())
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
myProblem->initResultPoints(time);
|
int gCount = 0;
|
||||||
|
bool first = true;
|
||||||
for (const ResPtPair& rptp : myPoints)
|
for (const ResPtPair& rptp : myPoints)
|
||||||
if (!rptp.first.empty())
|
if (gCount++ != idxGrid && !rptp.first.empty())
|
||||||
for (const ResultPoint& resPt : rptp.second)
|
for (const ResultPoint& resPt : rptp.second)
|
||||||
if (this->getLocalPatchIndex(resPt.patch) > 0)
|
if (this->getLocalPatchIndex(resPt.patch) > 0)
|
||||||
{
|
{
|
||||||
std::ofstream fs(rptp.first.c_str(),
|
if (first)
|
||||||
step == 1 ? std::ios::out : std::ios::app);
|
myProblem->initResultPoints(time);
|
||||||
|
first = false;
|
||||||
|
|
||||||
|
std::ofstream fs(rptp.first,step > 1 ? std::ios::app : std::ios::out);
|
||||||
utl::LogStream logs(fs);
|
utl::LogStream logs(fs);
|
||||||
if (!this->dumpResults(psol,time,logs,rptp.second,false,myPrec))
|
if (!this->dumpResults(psol,time,logs,rptp.second,false,myPrec))
|
||||||
return false;
|
return false;
|
||||||
@ -1919,6 +1925,50 @@ bool SIMoutput::savePoints (const Vector& psol, double time, int step) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool SIMoutput::saveResults (const Vector& psol, double time, int step) const
|
||||||
|
{
|
||||||
|
if (idxGrid < 0 || step < 1 || psol.empty())
|
||||||
|
return true;
|
||||||
|
else if (idxGrid > static_cast<int>(myPoints.size()))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
const std::string& filName = myPoints[idxGrid].first;
|
||||||
|
const ResPointVec& gridPts = myPoints[idxGrid].second;
|
||||||
|
if (filName.empty() || gridPts.empty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
size_t idot = filName.find_last_of('.');
|
||||||
|
std::string fileName = filName.substr(0,idot);
|
||||||
|
std::string fileExt = filName.substr(idot);
|
||||||
|
|
||||||
|
myProblem->initResultPoints(time);
|
||||||
|
|
||||||
|
// Evaluate the solution variables in all grid points
|
||||||
|
IntVec points;
|
||||||
|
Vec3Vec Xp;
|
||||||
|
Matrix sol, sol2;
|
||||||
|
for (const ASMbase* pch : myModel)
|
||||||
|
if (!this->evalResults(psol,gridPts,pch,points,Xp,sol,sol2))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!sol.augmentRows(sol2))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Write one file for each result component
|
||||||
|
for (size_t r = 1; r <= sol.rows(); r++)
|
||||||
|
{
|
||||||
|
std::string fName = fileName + "_" + std::to_string(r) + fileExt;
|
||||||
|
std::ofstream fs(fName,step > 1 ? std::ios::app : std::ios::out);
|
||||||
|
fs << time;
|
||||||
|
for (size_t c = 1; c <= sol.cols(); c++)
|
||||||
|
fs <<" "<< sol(r,c);
|
||||||
|
fs << '\n';
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool SIMoutput::extractNodeVec (const Vector& glbVec, Vector& locVec,
|
bool SIMoutput::extractNodeVec (const Vector& glbVec, Vector& locVec,
|
||||||
const ASMbase* patch, int nodalCmps,
|
const ASMbase* patch, int nodalCmps,
|
||||||
bool& emptyPatches) const
|
bool& emptyPatches) const
|
||||||
|
@ -276,6 +276,12 @@ public:
|
|||||||
//! \param[in] step Load/time step counter
|
//! \param[in] step Load/time step counter
|
||||||
bool savePoints(const Vector& psol, double time, int step) const;
|
bool savePoints(const Vector& psol, double time, int step) const;
|
||||||
|
|
||||||
|
//! \brief Saves result components to output files for a given time step.
|
||||||
|
//! \param[in] psol Primary solution vector
|
||||||
|
//! \param[in] time Load/time step parameter
|
||||||
|
//! \param[in] step Load/time step counter
|
||||||
|
bool saveResults(const Vector& psol, double time, int step) const;
|
||||||
|
|
||||||
//! \brief Sets the file name for result point output.
|
//! \brief Sets the file name for result point output.
|
||||||
//! \param[in] filename The file name prefix (optionally with extension)
|
//! \param[in] filename The file name prefix (optionally with extension)
|
||||||
//! \param[in] dumpCoord If \e true, write point coordinates to separate file
|
//! \param[in] dumpCoord If \e true, write point coordinates to separate file
|
||||||
|
Loading…
Reference in New Issue
Block a user