Changed: Introduce <console> for logging control.

This tag is prioritized so we get parallel logging up and
running as early as possible.
This commit is contained in:
Arne Morten Kvarving 2016-08-29 13:41:10 +02:00 committed by Knut Morten Okstad
parent b38a254a30
commit 9d1c9e0c73
3 changed files with 40 additions and 30 deletions

View File

@ -524,6 +524,8 @@ bool SIMbase::parse (const TiXmlElement* elem)
result &= opt.parseEigSolTag(child); result &= opt.parseEigSolTag(child);
else if (!strcasecmp(elem->Value(),"postprocessing")) else if (!strcasecmp(elem->Value(),"postprocessing"))
result &= this->parseOutputTag(child); result &= this->parseOutputTag(child);
else if (!strcasecmp(elem->Value(),"console"))
result &= this->opt.parseConsoleTag(child);
else if (!strcasecmp(elem->Value(),"discretization")) else if (!strcasecmp(elem->Value(),"discretization"))
result &= opt.parseDiscretizationTag(child); result &= opt.parseDiscretizationTag(child);
@ -550,7 +552,7 @@ int SIMbase::parseMaterialSet (const TiXmlElement* elem, int mindex)
const char** SIMbase::getPrioritizedTags () const const char** SIMbase::getPrioritizedTags () const
{ {
// Tags to be parsed first, and in the order specified // Tags to be parsed first, and in the order specified
static const char* special[] = { "discretization", "geometry", 0 }; static const char* special[] = { "console", "discretization", "geometry", 0 };
return special; return special;
} }
@ -832,7 +834,7 @@ int SIMbase::getLocalPatchIndex (int patchNo) const
if (patchNo < 1 || (patchNo > nGlPatches && nGlPatches > 0)) if (patchNo < 1 || (patchNo > nGlPatches && nGlPatches > 0))
{ {
std::cerr <<" *** SIMbase::getLocalPatchIndex: Patch number "<< patchNo std::cerr <<" *** SIMbase::getLocalPatchIndex: Patch number "<< patchNo
<<" out of range [1,"<< nGlPatches <<"]"<< std::endl; <<" is out of range [1,"<< nGlPatches <<"]"<< std::endl;
return -1; return -1;
} }
else if (myPatches.empty() || nProc == 1) else if (myPatches.empty() || nProc == 1)
@ -1799,7 +1801,7 @@ bool SIMbase::solveSystem (Vector& solution, int printSol,
std::ofstream os(it->fname.c_str()); std::ofstream os(it->fname.c_str());
os << std::setprecision(17); os << std::setprecision(17);
SystemMatrix* M = myEqSys->getMatrix(0); SystemMatrix* M = myEqSys->getMatrix(0);
char matName[] = {'A'}; char matName[] = "A";
for (int i = 0; M; M = myEqSys->getMatrix(++i), ++matName[0]) for (int i = 0; M; M = myEqSys->getMatrix(++i), ++matName[0])
M->dump(os,it->format,matName); // label matrices as A,B,C,... M->dump(os,it->format,matName); // label matrices as A,B,C,...
} }
@ -1811,7 +1813,7 @@ bool SIMbase::solveSystem (Vector& solution, int printSol,
std::ofstream os(it->fname.c_str()); std::ofstream os(it->fname.c_str());
os << std::setprecision(17); os << std::setprecision(17);
SystemVector* c = myEqSys->getVector(0); SystemVector* c = myEqSys->getVector(0);
char vecName[] = {'b'}; char vecName[] = "b";
for (int i = 0; c; c = myEqSys->getVector(++i), ++vecName[0]) for (int i = 0; c; c = myEqSys->getVector(++i), ++vecName[0])
c->dump(os,it->format,vecName); // label vectors as b,c,d,... c->dump(os,it->format,vecName); // label vectors as b,c,d,...
} }

View File

@ -133,32 +133,6 @@ bool SIMoptions::parseOutputTag (const TiXmlElement* elem)
utl::getAttribute(elem,"nw",nViz[2]); utl::getAttribute(elem,"nw",nViz[2]);
} }
else if (!strcasecmp(elem->Value(),"logging")) {
int pid = 0;
#ifdef HAVE_MPI
MPI_Comm_rank(MPI_COMM_WORLD,&pid);
#endif
utl::getAttribute(elem,"output_pid",printPid);
if (printPid != -1 && printPid != IFEM::getOptions().printPid) {
IFEM::getOptions().printPid = printPid;
IFEM::cout.setPIDs(printPid,pid);
if (printPid != pid)
IFEM::cout.setNull();
IFEM::cout <<"IFEM: Printing output from PID "<< printPid
<<" to console."<< std::endl;
}
utl::getAttribute(elem,"output_prefix",log_prefix);
if (!log_prefix.empty() && log_prefix != IFEM::getOptions().log_prefix) {
if ((pid == 0 && printPid == -1) || pid == IFEM::getOptions().printPid)
IFEM::cout <<"IFEM: Logging output to files with prefix "
<< log_prefix << std::endl;
IFEM::getOptions().log_prefix = log_prefix;
char cPid[12];
sprintf(cPid,"_p%04d.log",pid);
IFEM::cout.addExtraLog(new std::ofstream(log_prefix+cPid));
}
}
else if (!strcasecmp(elem->Value(),"stride")) { else if (!strcasecmp(elem->Value(),"stride")) {
const char* value = utl::getValue(elem,"stride"); const char* value = utl::getValue(elem,"stride");
if (value) saveInc = atoi(value); if (value) saveInc = atoi(value);
@ -191,6 +165,38 @@ bool SIMoptions::parseOutputTag (const TiXmlElement* elem)
} }
bool SIMoptions::parseConsoleTag (const TiXmlElement* elem)
{
if (!strcasecmp(elem->Value(),"logging")) {
int pid = 0;
#ifdef HAVE_MPI
MPI_Comm_rank(MPI_COMM_WORLD,&pid);
#endif
utl::getAttribute(elem,"output_pid",printPid);
if (printPid != -1 && printPid != IFEM::getOptions().printPid) {
IFEM::getOptions().printPid = printPid;
IFEM::cout.setPIDs(printPid,pid);
if (printPid != pid)
IFEM::cout.setNull();
IFEM::cout <<"IFEM: Printing output from PID "<< printPid
<<" to console."<< std::endl;
}
utl::getAttribute(elem,"output_prefix",log_prefix);
if (!log_prefix.empty() && log_prefix != IFEM::getOptions().log_prefix) {
if ((pid == 0 && printPid == -1) || pid == IFEM::getOptions().printPid)
IFEM::cout <<"IFEM: Logging output to files with prefix "
<< log_prefix << std::endl;
IFEM::getOptions().log_prefix = log_prefix;
char cPid[12];
sprintf(cPid,"_p%04d.log",pid);
IFEM::cout.addExtraLog(new std::ofstream(log_prefix+cPid));
}
}
return true;
}
bool SIMoptions::dumpHDF5 (const char* defaultName) bool SIMoptions::dumpHDF5 (const char* defaultName)
{ {
if (hdf5.empty()) return false; if (hdf5.empty()) return false;

View File

@ -44,6 +44,8 @@ public:
//! \brief Defines the linear equation solver to be used. //! \brief Defines the linear equation solver to be used.
void setLinearSolver(const std::string& eqsolver); void setLinearSolver(const std::string& eqsolver);
//! \brief Parses a subelement of the \a console XML-tag.
bool parseConsoleTag(const TiXmlElement* elem);
//! \brief Parses a subelement of the \a discretization XML-tag. //! \brief Parses a subelement of the \a discretization XML-tag.
bool parseDiscretizationTag(const TiXmlElement* elem); bool parseDiscretizationTag(const TiXmlElement* elem);
//! \brief Parses a subelement of the \a eigensolver XML-tag. //! \brief Parses a subelement of the \a eigensolver XML-tag.