Commit 8698e7fe authored by Thomas Witkowski's avatar Thomas Witkowski

Initfiles in AMDiS code style.

parent f025c9bb
......@@ -8,153 +8,164 @@ using namespace std;
namespace AMDiS {
/// the small parser for the initfile. see description of read(Initfile&, istream&)
struct Parser {
Parser(const string& line) {
size_t pos= line.find(':');
if (pos == string::npos)
throw runtime_error("cannot find the delimiter ':' in line '"+line+"'");
name= line.substr(0, pos);
value= line.substr(pos+1, line.length() - (pos + 1));
// remove everything after the %
pos= value.find('%');
if (pos != string::npos) {
value= value.substr(0, pos);
}
}
string name;
string value;
};
Initfile* Initfile::singlett= NULL;
std::set< std::string > Initfile::fn_include_list;
/// initialize singleton object an global parameters
void Initfile::init(std::string in) {
initIntern();
singlett->clear();
fn_include_list.clear();
singlett->read(in);
singlett->getInternalParameters();
/// the small parser for the initfile. see description of read(Initfile&, istream&)
struct Parser {
Parser(const string& line)
{
size_t pos = line.find(':');
if (pos == string::npos)
throw runtime_error("cannot find the delimiter ':' in line '" + line + "'");
name = line.substr(0, pos);
value = line.substr(pos + 1, line.length() - (pos + 1));
// remove everything after the %
pos = value.find('%');
if (pos != string::npos)
value = value.substr(0, pos);
}
string name;
string value;
};
Initfile* Initfile::singlett= NULL;
std::set<std::string> Initfile::fn_include_list;
/// initialize singleton object an global parameters
void Initfile::init(std::string in)
{
initIntern();
singlett->clear();
fn_include_list.clear();
singlett->read(in);
singlett->getInternalParameters();
// initialize global strcutures using parameters
Global::init();
};
/// Fill an initfile from a file with filename fn
void Initfile::read(std::string fn) {
// read file if its not parsed already
if (fn_include_list.find(fn)==fn_include_list.end()) {
std::ifstream inputFile;
inputFile.open(fn.c_str(), std::ios::in);
if (!inputFile.is_open())
throw runtime_error("init-file cannot be opened for reading");
// initialize global strcutures using parameters
Global::init();
}
/// Fill an initfile from a file with filename fn
void Initfile::read(std::string fn)
{
// read file if its not parsed already
if (fn_include_list.find(fn) == fn_include_list.end()) {
std::ifstream inputFile;
inputFile.open(fn.c_str(), std::ios::in);
if (!inputFile.is_open())
throw runtime_error("init-file cannot be opened for reading");
fn_include_list.insert(fn);
read(inputFile);
}
};
/// Fill an initfile from an input stream
void Initfile::read(istream& in) {
unsigned line_length= 256;
char swap[line_length];
in.getline(swap, line_length);
while (in.good()) {
std::string whitespaces= " \t\r\f";
std::string sw(swap);
size_t pos0= sw.find_first_not_of(whitespaces);
fn_include_list.insert(fn);
read(inputFile);
}
}
/// Fill an initfile from an input stream
void Initfile::read(istream& in)
{
unsigned line_length = 256;
char swap[line_length];
in.getline(swap, line_length);
while (in.good()) {
std::string whitespaces = " \t\r\f";
std::string sw(swap);
size_t pos0 = sw.find_first_not_of(whitespaces);
if (pos0!=std::string::npos && sw[pos0]!='%' && sw[pos0]!='#' && sw[pos0]!=0) {
// parse line and extract map: tag->value
Parser parser(sw);
operator[](parser.name)= parser.value;
} else if (sw[pos0]=='#' && static_cast<size_t>(sw.find("#include"))==pos0) {
// include file by '#include "filename"' or '#include <filename>'
size_t pos= sw.find_first_not_of(whitespaces,std::string("#include").size()+1);
size_t epos= 0;
std::string fn= "";
std::stringstream errorMsg;
switch (char c= swap[pos++]) {
case '<':
c= '>';
case '\"':
whitespaces+= c;
epos= sw.find_first_of(whitespaces, pos);
fn= sw.substr(pos,epos-pos);
if (pos0 != std::string::npos && sw[pos0] != '%' && sw[pos0] != '#' && sw[pos0] != 0) {
// parse line and extract map: tag->value
Parser parser(sw);
operator[](parser.name) = parser.value;
} else if (sw[pos0] == '#' && static_cast<size_t>(sw.find("#include")) == pos0) {
// include file by '#include "filename"' or '#include <filename>'
size_t pos = sw.find_first_not_of(whitespaces, std::string("#include").size() + 1);
size_t epos = 0;
std::string fn = "";
std::stringstream errorMsg;
switch (char c= swap[pos++]) {
case '<':
c= '>';
case '\"':
whitespaces += c;
epos = sw.find_first_of(whitespaces, pos);
fn = sw.substr(pos, epos - pos);
if (sw[epos]!=c) {
errorMsg << "filename in #include not terminated by " << c;
throw std::runtime_error(errorMsg.str());
}
break;
default:
throw std::runtime_error("no filename given for #include");
}
read(fn);
}
in.getline(swap, line_length);
}
};
void Initfile::readArgv(int argc, char **argv)
{
for (int i= 0; i<argc; ++i) {
if (strcmp("-rs", argv[i]) == 0) {
std::string input(argv[i+1]);
add("argv->rs", input, 0);
}
if (sw[epos]!=c) {
errorMsg << "filename in #include not terminated by " << c;
throw std::runtime_error(errorMsg.str());
}
break;
default:
throw std::runtime_error("no filename given for #include");
}
}
read(fn);
}
in.getline(swap, line_length);
}
}
/// read standard values for output and information of parameter-values
void Initfile::getInternalParameters()
{
int val= 0;
get("level of information", val, 0);
msgInfo= val;
val= 1;
get("WAIT", val, 0);
msgWait= val;
void Initfile::readArgv(int argc, char **argv)
{
for (int i = 0; i < argc; i++) {
if (strcmp("-rs", argv[i]) == 0) {
std::string input(argv[i + 1]);
add("argv->rs", input, 0);
}
}
}
/// read standard values for output and information of parameter-values
void Initfile::getInternalParameters()
{
int val = 0;
get("level of information", val, 0);
msgInfo = val;
val= 1;
get("parameter information", val, 0);
paramInfo= val;
val = 1;
get("WAIT", val, 0);
msgWait = val;
val= 0;
get("break on missing tag", val, 0);
breakOnMissingTag= val;
if (msgInfo==0)
paramInfo= 0;
};
/// print all parameters to std::cout
void Initfile::printParameters() {
initIntern();
Initfile::iterator it;
for (it= singlett->begin(); it!=singlett->end(); it++)
std::cout << (*it).first << " => " << (*it).second << std::endl;
};
/// Write data-map to initfile
void Initfile::write(ostream& out) {
Initfile::iterator it;
for (it= begin() ; it!=end(); it++)
out << (*it).first << ": " << (*it).second << std::endl;
val = 1;
get("parameter information", val, 0);
paramInfo = val;
};
/// Write data-map to initfile
void Initfile::write(std::string fn) {
std::ofstream outFile;
outFile.open(fn.c_str(), std::ios::out);
if (!outFile.is_open())
throw runtime_error("init-file cannot be opened for writing");
val = 0;
get("break on missing tag", val, 0);
breakOnMissingTag = val;
if (msgInfo == 0)
paramInfo = 0;
}
/// print all parameters to std::cout
void Initfile::printParameters()
{
initIntern();
for (Initfile::iterator it = singlett->begin(); it != singlett->end(); it++)
std::cout << (*it).first << " => " << (*it).second << std::endl;
}
/// Write data-map to initfile
void Initfile::write(ostream& out)
{
for (Initfile::iterator it = begin() ; it!=end(); it++)
out << (*it).first << ": " << (*it).second << std::endl;
}
/// Write data-map to initfile
void Initfile::write(std::string fn)
{
std::ofstream outFile;
outFile.open(fn.c_str(), std::ios::out);
if (!outFile.is_open())
throw runtime_error("init-file cannot be opened for writing");
write(outFile);
};
write(outFile);
}
}
This diff is collapsed.
......@@ -50,13 +50,15 @@ namespace AMDiS {
oem(*oem_),
solver(NULL),
store_symbolic(0),
symmetric_strategy(0)
symmetric_strategy(0),
alloc_init(0.7)
{
FUNCNAME("Umfpack_runner::Umfpack_runner()");
TEST_EXIT_DBG(oem_ != NULL)("Need real OEMSolver\n");
Parameters::get(oem.getName() + "->store symbolic", store_symbolic);
Parameters::get(oem.getName() + "->symmetric strategy", symmetric_strategy);
Parameters::get(oem.getName() + "->alloc init", alloc_init);
}
template< typename Vector>
......@@ -64,10 +66,7 @@ namespace AMDiS {
{
FUNCNAME("Umfpack_runner::solve()");
if (!solver) {
if (!symmetric_strategy)
solver = new mtl::matrix::umfpack::solver<matrix_type>(A);
else
solver = new mtl::matrix::umfpack::solver<matrix_type>(A, UMFPACK_STRATEGY_SYMMETRIC);
solver = new mtl::matrix::umfpack::solver<matrix_type>(A, symmetric_strategy, alloc_init);
} else {
if (!oem.getMultipleRhs()) {
if (store_symbolic)
......@@ -101,7 +100,10 @@ namespace AMDiS {
mtl::matrix::umfpack::solver<matrix_type> *solver;
int store_symbolic;
int symmetric_strategy;
double alloc_init;
};
using namespace MTLTypes;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment