void onelabGroup::rebuildSolverList() { updateGearMenu(); std::vector<std::string> names, exes, hosts; for(int i = 0; i < NUM_SOLVERS; i++){ if(opt_solver_name(i, GMSH_GET, "").size()){ names.push_back(opt_solver_name(i, GMSH_GET, "")); exes.push_back(opt_solver_executable(i, GMSH_GET, "")); hosts.push_back(opt_solver_remote_login(i, GMSH_GET, "")); } } for(unsigned int i = 0; i < NUM_SOLVERS; i++){ if(i < names.size()){ onelab::server::citer it = onelab::server::instance()->findClient(names[i]); if(it != onelab::server::instance()->lastClient()) (*it)->setIndex(i); opt_solver_name(i, GMSH_SET, names[i]); opt_solver_executable(i, GMSH_SET, exes[i]); opt_solver_remote_login(i, GMSH_SET, hosts[i]); } else{ opt_solver_name(i, GMSH_SET, ""); opt_solver_executable(i, GMSH_SET, ""); opt_solver_remote_login(i, GMSH_SET, ""); } } setButtonVisibility(); //refreshTree(true); }
void onelabWindow::rebuildSolverList() { _solvers->clear(); for(int i = 0; i < NUM_SOLVERS; i++){ if(opt_solver_name(i, GMSH_GET, "").size()) _solvers->add(opt_solver_name(i, GMSH_GET, "").c_str()); } if(CTX::instance()->solverToRun >= 0) _solvers->value(CTX::instance()->solverToRun); }
void solver_cb(Fl_Widget *w, void *data) { if(!FlGui::instance()->onelab) return; if(FlGui::instance()->onelab->isBusy()) FlGui::instance()->onelab->show(); int num = (intptr_t)data; if(num >= 0){ onelab_cb(0, (void*)"reset"); std::string name = opt_solver_name(num, GMSH_GET, ""); if(name.empty()) return;// TODO std::string exe = opt_solver_executable(num, GMSH_GET, ""); std::string host = opt_solver_remote_login(num, GMSH_GET, ""); OnelabDatabase::instance()->run("initialize", name); FlGui::instance()->onelab->addSolver(name, exe, host, num); } if(num >= 0) { onelab_cb(0, (void*)"check"); } else { onelab_cb(0, (void*)"refresh"); } FlGui::instance()->onelab->updateGearMenu(); }
solverButton::solverButton(int x, int y, int w, int h, int num, Fl_Color col) : Fl_Group(x,y,w,h) { int popw = FL_NORMAL_SIZE + 2; _butt[0] = new Fl_Button(x, y, w - popw, h); _butt[0]->box(FL_FLAT_BOX); _butt[0]->color(col); _butt[0]->selection_color(col); _butt[0]->callback(solver_cb, (void *)num); _butt[0]->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE | FL_ALIGN_CLIP); std::string name = opt_solver_name(num, GMSH_GET, ""); _butt[0]->copy_label(name.c_str()); std::string exe = opt_solver_executable(num, GMSH_GET, ""); strcpy(_tooltip, exe.c_str()); _butt[0]->tooltip(_tooltip); _butt[1] = new Fl_Button(x + w - popw, y, popw, h, "@>"); _butt[1]->align(FL_ALIGN_RIGHT | FL_ALIGN_INSIDE | FL_ALIGN_CLIP); _butt[1]->tooltip("Show solver option menu"); _butt[1]->box(FL_FLAT_BOX); _butt[1]->color(col); _butt[1]->selection_color(col); _popup = new Fl_Menu_Button(x + w - popw, y, popw, h); _popup->type(Fl_Menu_Button::POPUP123); _popup->add("Remove", 0, (Fl_Callback *)solver_remove_cb, (void *)num, 0); end(); // close the group resizable(_butt[0]); }
static void solver_remove_cb(Fl_Widget *w, void *data) { if(FlGui::instance()->onelab->isBusy()){ Msg::Warning("Cannot remove client while solver is running"); return; } int num = (intptr_t)data; std::string name = opt_solver_name(num, GMSH_GET, ""); opt_solver_name(num, GMSH_SET, ""); opt_solver_executable(num, GMSH_SET, ""); opt_solver_remote_login(num, GMSH_SET, ""); onelab::server::citer it = onelab::server::instance()->findClient(name); if(it != onelab::server::instance()->lastClient()){ onelab::client *c = it->second; delete c; } FlGui::instance()->onelab->rebuildSolverList(); }
void solver_batch_cb(void *data) { int num = (intptr_t)data; std::string name, exe, host; if(num == -1){ // no solver to run return; } else if(num == -2){ // just run local Gmsh client } else if(num >= 0){ // run local Gmsh client + solver num name = opt_solver_name(num, GMSH_GET, ""); exe = opt_solver_executable(num, GMSH_GET, ""); host = opt_solver_remote_login(num, GMSH_GET, ""); if(exe.empty()){ Msg::Error("Solver executable name not provided"); return; } } else{ Msg::Error("Unknown client to run in batch mode (%d)", num); return; } onelab::number n("0Metamodel/Batch", CTX::instance()->batch); n.setVisible(false); onelab::server::instance()->set(n); // create client onelab::localNetworkClient *c = 0; onelab::string o; if(name.size()){ c = new gmshLocalNetworkClient(name, exe, host); c->setIndex(num); o = c->getName() + "/Action"; } // initialize onelabUtils::runGmshClient("initialize", CTX::instance()->solver.autoMesh); if(c){ o.setValue("initialize"); onelab::server::instance()->set(o); c->run(); } // load db if(CTX::instance()->solver.autoSaveDatabase){ std::string db = SplitFileName(GModel::current()->getFileName())[0] + "onelab.db"; if(!StatFile(db)) loadDb(db); } // check onelabUtils::runGmshClient("check", CTX::instance()->solver.autoMesh); if(c){ onelabUtils::guessModelName(c); o.setValue("check"); onelab::server::instance()->set(o); c->run(); } // compute initializeLoops(); do{ onelabUtils::runGmshClient("compute", CTX::instance()->solver.autoMesh); if(c){ onelabUtils::guessModelName(c); o.setValue("compute"); onelab::server::instance()->set(o); c->run(); onelab::server::instance()->setChanged(false, c->getName()); } } while(incrementLoops()); if(CTX::instance()->solver.autoSaveDatabase || CTX::instance()->solver.autoArchiveOutputFiles){ std::string db = SplitFileName(GModel::current()->getFileName())[0] + "onelab.db"; if(CTX::instance()->solver.autoArchiveOutputFiles) archiveOutputFiles(db); if(CTX::instance()->solver.autoSaveDatabase) saveDb(db); } }