RootedLevelStructure::RootedLevelStructure(MeshGraphVertexNode *rootNode, const std::vector<MeshGraphVertexNode *> &graphVerts, bool *visitedBuffer){ generateLevels(rootNode, graphVerts, visitedBuffer); }
int main(int argc, char ** argv) { //int numTargetSE; std::vector<int> numTargetByLayers; std::string numTargetByLayersStr; std::string catalog, indName, crdName, mtrName, levelBase; po::options_description desc("Program options"); bool verbouse = false; std::vector<double> maxImbalance; std::string maxImbalanceStr; desc.add_options() ("help,h", "print help message") ("num-se,n", po::value<std::string>(&numTargetByLayersStr)->default_value("16"), "target numbers of SE by layers i.e. '64,8,2'") ("work-dir,w", po::value<std::string>(&catalog)->default_value(""), "work catalog") ("ind-file,i", po::value<std::string>(&indName)->default_value("ind.sba"), "ind file") ("crd-file,c", po::value<std::string>(&crdName)->default_value("crd.sba"), "crd file") ("mtr-file,m", po::value<std::string>(&mtrName)->default_value("mtr001.sba"), "mtr file") ("level-base,l", po::value<std::string>(&levelBase)->default_value("level"), "level files base name") ("verbouse,v", "make verbouse output") ("max-imbalance", po::value<std::string>(&maxImbalanceStr)->default_value("1.3"), "target maximum imbalance in SE layers i.e. '1.4,1.3,1.3'. Low values of this parameters can couse program to fail.") ; po::variables_map vm; po::store(po::parse_command_line(argc, argv, desc), vm); po::notify(vm); if (vm.count("help") || vm.count("h")) { std::cout << desc << "\n"; return 1; } if (vm.count("verbouse") || vm.count("v")) verbouse = true; //extract number of SE by layers from cmd string std::stringstream sstr(numTargetByLayersStr); std::string entry; while(getline(sstr, entry, ',')) numTargetByLayers.push_back(std::stoi(entry)); //extract max imbalance of SE by layers from cmd string { std::stringstream sstr(maxImbalanceStr); while(getline(sstr, entry, ',')) maxImbalance.push_back(std::stod(entry)); } std::stringstream iName, cName, mName, lName/*, oiName, ocName, omName*/; iName << catalog << indName; cName << catalog << crdName; mName << catalog << mtrName; lName << catalog << levelBase; //Creating mesh std::unique_ptr<sbfMesh> pMesh(new sbfMesh()); if(pMesh->readMeshFromFiles(iName.str().c_str(), cName.str().c_str(), mName.str().c_str())) {std::cout << "error while mesh reading" << std::endl; return 1;} int numElems = pMesh->numElements(); //Prepare zero level of SE - each SE contains only one regular element std::vector<int> regIndex; regIndex.resize(1); std::vector< std::vector<sbfSElement *> > selevels; selevels.resize(numTargetByLayers.size() + 1); selevels[0].reserve(numElems*10); for(int ct = 0; ct < numElems; ct++) selevels[0].push_back( new sbfSElement(pMesh.get(), ct)); for(size_t ct = 0; ct < numTargetByLayers.size(); ct++){ selevels[ct+1].reserve(numTargetByLayers[ct]*100); for(int ct1 = 0; ct1 < numTargetByLayers[ct]; ct1++) selevels[ct+1].push_back( new sbfSElement(pMesh.get(), ct1)); } for(int ct = 0; ct < numElems; ct++){ regIndex[0] = ct; selevels[0][ct]->setRegElemIndexes(regIndex); } generateLevels(selevels, numTargetByLayers, maxImbalance, verbouse); for(size_t ct = 0; ct < numTargetByLayers.size(); ct++){ std::cout << "Level " << ct+1 << " contains " << selevels[ct+1].size() << std::endl; sbfSELevel level; level.setSize(selevels[ct].size()); level.setLevelIndex(ct+1); for(size_t ctSE = 0; ctSE < selevels[ct].size(); ctSE++) level.setIndex(ctSE, selevels[ct][ctSE]->parent()->index()); level.writeToFile(lName.str().c_str(), ct+1); } std::cout << "DONE" << std::endl; return 0; }