28 DEBUG(
"IOToml::makeProperty: found integer property :", MAIA_DEBUG_IO);
29 p->propertyType =
MINT;
30 p->elements = prop.
size();
32 copy(prop.
asInt().begin(), prop.
asInt().end(), p->intField);
37 DEBUG(
"IOToml::makeProperty: found float property :", MAIA_DEBUG_IO);
39 p->elements = prop.
size();
46 DEBUG(
"IOToml::makeProperty: found bool property :", MAIA_DEBUG_IO);
47 p->propertyType =
MBOOL;
48 p->elements = prop.
size();
50 copy(prop.
asBool().begin(), prop.
asBool().end(), p->boolField);
55 DEBUG(
"IOToml::makeProperty: found char property :", MAIA_DEBUG_IO);
57 p->elements = prop.
size();
64 stringstream errorMessage;
65 errorMessage <<
"IOToml::makeProperty Error: Unsupported variable input type encountered!" << endl;
66 TERMM(1, errorMessage.str());
71 const pair<const MString, MProperty*> mp(p->name, p);
75 std::transform(nameL.begin(), nameL.end(), nameL.begin(), [](
unsigned char c) { return std::tolower(c); });
77 const pair<const MString, MProperty*> mpL(nameL, p);
83 "There are multiple occurrences of the property " + p->name
84 +
" with different cases. This should not happen!");
89 DEBUG(
"IOToml::makeProperty: created default property ", MAIA_DEBUG_IO);
90 DEBUG(
"IOToml::makeProperty: elements = " << p->elements, MAIA_DEBUG_IO);
91 DEBUG(
"IOToml::makeProperty: m_noProperties = " <<
m_propertyMap->size(), MAIA_DEBUG_IO);
104 zone->name.append(
"default");
107 list<MInt> solverList;
109 for(
MInt i = 0; i < it->second->noSolvers; i++) {
110 solverList.push_back(it->second->solvers[i]);
117 zone->noSolvers = (
m_noSolvers - solverList.size());
118 zone->solvers =
new MInt[zone->noSolvers];
122 MInt simpleIterator = 0;
123 list<MInt>::const_iterator solverIt = solverList.begin();
126 if((!solverList.empty()) && (*solverIt == i)) {
130 zone->solvers[simpleIterator] = i;
131 DEBUG(
"IOToml::buildDefaultZone: added solver " << i <<
" to the default zone. ", MAIA_DEBUG_IO);
138 m_zoneMap->insert(make_pair(zone->name, zone));
139 DEBUG(
"IOToml::buildDefaultZone: default zone has " << zone->noSolvers <<
" solvers.", MAIA_DEBUG_IO);
154 ifstream ifs(fileName);
156 TERMM(1,
"could not open property file '" + fileName +
"'");
160 if(ss.str().empty()) {
161 TERMM(1,
"property file '" + fileName +
"' appears to be empty");
165 MInt length = ss.str().size() + 1;
168 vector<MChar> text(length);
169 strcpy(text.data(), ss.str().c_str());
172 MPI_Bcast(&length, 1, MPI_INT, 0, MPI_COMM_WORLD, AT_,
"length");
173 MPI_Bcast(text.data(), length, MPI_CHAR, 0, MPI_COMM_WORLD, AT_,
"text.data()");
180 MPI_Bcast(&length, 1, MPI_INT, 0, MPI_COMM_WORLD, AT_,
"length");
183 vector<MChar> text(length);
184 MPI_Bcast(text.data(), length, MPI_CHAR, 0, MPI_COMM_WORLD, AT_,
"text.data()");
196 map<MString, MInt> solverAliases;
200 vector<maia::io::toml::Property> properties;
205 for(
auto&& prop : properties) {
206 if(prop.name() ==
"noSolvers") {
216 stringstream errorMessage;
217 errorMessage <<
"IOToml::readPropertyFile Error: Inconsistent solver List!\n Make sure "
218 "that solvers start with index 0 and are consecutive!"
220 TERMM(1, errorMessage.str());
224 for(
auto&& prop : properties) {
226 if(!strstr(prop.name().c_str(),
".")) {
229 DEBUG(
"IOToml::readPropertyFile: default property : " << prop.name(), MAIA_DEBUG_IO);
232 p->name.append(prop.name());
237 const auto pname = prop.name();
239 du = strrchr(pname.c_str(),
'.') + 1;
240 const MInt singleSolverId = atoi(du);
242 if(singleSolverId || *du ==
'0') {
244 const MString name = prop.name().substr(0, prop.name().find(
"."));
246 DEBUG(
"IOToml::readPropertyFile: Found single solver property definition for solver " << singleSolverId,
251 p->solverId = singleSolverId;
252 p->name.append(name);
260 DEBUG(
"IOToml::readPropertyFile: property consistency check succeeded", MAIA_DEBUG_IO);
262 stringstream errorMessage;
263 errorMessage <<
"IOToml::readPropertyFile Error: some properties are not defined for "
266 TERMM(1, errorMessage.str());
284 std::string propertyName = i->second->name;
287 std::size_t found = propertyName.find(
'.');
288 if(found == std::string::npos) {
295 for(
auto j = range.first; j != range.second; j++) {
301 std::cerr <<
"Did not find property " << propertyName <<
" for all solvers" << endl;
315 list<MInt> solverList;
316 list<MInt> compareList;
319 for(
MInt i = 0; i < it->second->noSolvers; i++) {
320 solverList.push_back(it->second->solvers[i]);
321 compareList.push_back(index++);
325 if(solverList == compareList) {
propertyMap * m_propertyMapLowercase
MBool checkPropertyConsistency()
MBool checkZoneConsistency()
assembly * readPropertyFile(const MString &fileName)
void makeProperty(MProperty *, const maia::io::toml::Property &prop)
propertyMap * m_propertyMap
std::shared_ptr< table > parse()
Class that represents a single key-value pair for TOML properties.
const std::vector< MInt > & asInt() const
const std::vector< MBool > & asBool() const
const std::vector< MFloat > & asFloat() const
const std::vector< MString > & asString() const
VariableType type() const
std::map< MString, MZone * > zoneMap
std::multimap< MString, MProperty * > propertyMap
propertyMap::const_iterator propertyIterator
void mTerm(const MInt errorCode, const MString &location, const MString &message)
MInt globalDomainId()
Return global domain id.
z { MString name MZone
define array structures
std::basic_string< char > MString
int MPI_Bcast(void *buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm, const MString &name, const MString &varname)
same as MPI_Bcast
void collectProperties(const std::shared_ptr< cpptoml::table > &tab, std::vector< std::string > &names, std::vector< Property > &properties, std::map< std::string, int > &solverAliases)
Recursively traverse TOML table and collect all properties with name, type, and count.
void collectSolverAliases(const std::shared_ptr< cpptoml::table > &tab, std::map< std::string, int > &solverAliases)
Non-recursive search for solver aliases.
propertyMap * propertiesLowercase