Skip to content
Snippets Groups Projects
Commit c46cb1ee authored by Christophe Geuzaine's avatar Christophe Geuzaine
Browse files

new option to AutoArchiveSolutions

parent 5f9a4a82
No related branches found
No related tags found
No related merge requests found
...@@ -222,8 +222,8 @@ class CTX { ...@@ -222,8 +222,8 @@ class CTX {
double timeout; double timeout;
std::string socketName; std::string socketName;
std::string name[5], executable[5], remoteLogin[5]; std::string name[5], executable[5], remoteLogin[5];
int autoSaveDatabase, autoMesh, autoMergeFile, autoHideNewViews; int autoSaveDatabase, autoArchiveSolutions, autoMesh, autoMergeFile;
int autoShowLastStep; int autoHideNewViews, autoShowLastStep;
}solver; }solver;
// print options // print options
struct{ struct{
......
...@@ -1106,6 +1106,8 @@ StringXNumber MeshOptions_Number[] = { ...@@ -1106,6 +1106,8 @@ StringXNumber MeshOptions_Number[] = {
StringXNumber SolverOptions_Number[] = { StringXNumber SolverOptions_Number[] = {
{ F|O, "AlwaysListen" , opt_solver_listen , 0. , { F|O, "AlwaysListen" , opt_solver_listen , 0. ,
"Always listen to incoming connection requests?" }, "Always listen to incoming connection requests?" },
{ F|O, "AutoArchiveSolutions" , opt_solver_auto_archive_solutions , 0. ,
"Automatically archive solutions after each computation" },
{ F|O, "AutoSaveDatabase" , opt_solver_auto_save_database , 0. , { F|O, "AutoSaveDatabase" , opt_solver_auto_save_database , 0. ,
"Automatically save database after each computation" }, "Automatically save database after each computation" },
{ F|O, "AutoMesh" , opt_solver_auto_mesh , 1. , { F|O, "AutoMesh" , opt_solver_auto_mesh , 1. ,
......
...@@ -5732,6 +5732,13 @@ double opt_solver_auto_save_database(OPT_ARGS_NUM) ...@@ -5732,6 +5732,13 @@ double opt_solver_auto_save_database(OPT_ARGS_NUM)
return CTX::instance()->solver.autoSaveDatabase; return CTX::instance()->solver.autoSaveDatabase;
} }
double opt_solver_auto_archive_solutions(OPT_ARGS_NUM)
{
if(action & GMSH_SET)
CTX::instance()->solver.autoArchiveSolutions = (int)val;
return CTX::instance()->solver.autoArchiveSolutions;
}
double opt_solver_auto_mesh(OPT_ARGS_NUM) double opt_solver_auto_mesh(OPT_ARGS_NUM)
{ {
if(action & GMSH_SET) if(action & GMSH_SET)
......
...@@ -469,6 +469,7 @@ double opt_solver_listen(OPT_ARGS_NUM); ...@@ -469,6 +469,7 @@ double opt_solver_listen(OPT_ARGS_NUM);
double opt_solver_timeout(OPT_ARGS_NUM); double opt_solver_timeout(OPT_ARGS_NUM);
double opt_solver_plugins(OPT_ARGS_NUM); double opt_solver_plugins(OPT_ARGS_NUM);
double opt_solver_auto_save_database(OPT_ARGS_NUM); double opt_solver_auto_save_database(OPT_ARGS_NUM);
double opt_solver_auto_archive_solutions(OPT_ARGS_NUM);
double opt_solver_auto_mesh(OPT_ARGS_NUM); double opt_solver_auto_mesh(OPT_ARGS_NUM);
double opt_solver_auto_merge_file(OPT_ARGS_NUM); double opt_solver_auto_merge_file(OPT_ARGS_NUM);
double opt_solver_auto_hide_new_views(OPT_ARGS_NUM); double opt_solver_auto_hide_new_views(OPT_ARGS_NUM);
......
...@@ -384,18 +384,19 @@ static void updateGraphs() ...@@ -384,18 +384,19 @@ static void updateGraphs()
} }
} }
static void saveDb(const std::string &fileName, bool withTimeStamp=false) static std::string timeStamp()
{ {
std::string name(fileName);
if(withTimeStamp){
// create time stamp
time_t now; time_t now;
time(&now); time(&now);
tm *t = localtime(&now); tm *t = localtime(&now);
char stamp[32]; char stamp[32];
sprintf(stamp, "_%04d-%02d-%02d_%02d-%02d-%02d", 1900 + t->tm_year, sprintf(stamp, "_%04d-%02d-%02d_%02d-%02d-%02d", 1900 + t->tm_year,
1 + t->tm_mon, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec); 1 + t->tm_mon, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
return std::string(stamp);
}
static void archiveSolutions(const std::string &timeStamp)
{
// add time stamp in all output files in the db, and rename them on disk // add time stamp in all output files in the db, and rename them on disk
std::vector<onelab::string> strings; std::vector<onelab::string> strings;
onelab::server::instance()->get(strings); onelab::server::instance()->get(strings);
...@@ -409,7 +410,7 @@ static void saveDb(const std::string &fileName, bool withTimeStamp=false) ...@@ -409,7 +410,7 @@ static void saveDb(const std::string &fileName, bool withTimeStamp=false)
if(n < 18 || split[1][n-3] != '-' || split[1][n-6] != '-' || if(n < 18 || split[1][n-3] != '-' || split[1][n-6] != '-' ||
split[1][n-9] != '_'){ split[1][n-9] != '_'){
std::string old = names[j]; std::string old = names[j];
names[j] = split[0] + split[1] + stamp + split[2]; names[j] = split[0] + split[1] + timeStamp + split[2];
Msg::Info("Renaming '%s' into '%s'", old.c_str(), names[j].c_str()); Msg::Info("Renaming '%s' into '%s'", old.c_str(), names[j].c_str());
rename(old.c_str(), names[j].c_str()); rename(old.c_str(), names[j].c_str());
} }
...@@ -419,14 +420,13 @@ static void saveDb(const std::string &fileName, bool withTimeStamp=false) ...@@ -419,14 +420,13 @@ static void saveDb(const std::string &fileName, bool withTimeStamp=false)
onelab::server::instance()->set(strings[i]); onelab::server::instance()->set(strings[i]);
} }
} }
{
std::vector<std::string> split = SplitFileName(fileName);
name = split[0] + split[1] + stamp + split[2];
}
FlGui::instance()->onelab->rebuildTree(); FlGui::instance()->onelab->rebuildTree();
} }
static void saveDb(const std::string &fileName, const std::string &timeStamp="")
{
std::vector<std::string> split = SplitFileName(fileName);
std::string name = split[0] + split[1] + timeStamp + split[2];
Msg::StatusBar(2, true, "Saving database '%s'...", name.c_str()); Msg::StatusBar(2, true, "Saving database '%s'...", name.c_str());
if(onelab::server::instance()->toFile(name)) if(onelab::server::instance()->toFile(name))
Msg::StatusBar(2, true, "Done saving database '%s'", name.c_str()); Msg::StatusBar(2, true, "Done saving database '%s'", name.c_str());
...@@ -577,9 +577,12 @@ void onelab_cb(Fl_Widget *w, void *data) ...@@ -577,9 +577,12 @@ void onelab_cb(Fl_Widget *w, void *data)
} while(action == "compute" && !FlGui::instance()->onelab->stop() && } while(action == "compute" && !FlGui::instance()->onelab->stop() &&
incrementLoops()); incrementLoops());
if(CTX::instance()->solver.autoSaveDatabase && action == "compute"){ if(action == "compute" && (CTX::instance()->solver.autoSaveDatabase ||
std::string s = SplitFileName(GModel::current()->getFileName())[0] + "onelab.db"; CTX::instance()->solver.autoArchiveSolutions)){
saveDb(s, true); std::string db = SplitFileName(GModel::current()->getFileName())[0] + "onelab.db";
std::string stamp = timeStamp();
if(CTX::instance()->solver.autoArchiveSolutions) archiveSolutions(stamp);
if(CTX::instance()->solver.autoSaveDatabase) saveDb(db, stamp);
} }
FlGui::instance()->onelab->stop(false); FlGui::instance()->onelab->stop(false);
...@@ -595,6 +598,8 @@ void onelab_option_cb(Fl_Widget *w, void *data) ...@@ -595,6 +598,8 @@ void onelab_option_cb(Fl_Widget *w, void *data)
double val = ((Fl_Menu_*)w)->mvalue()->value() ? 1. : 0.; double val = ((Fl_Menu_*)w)->mvalue()->value() ? 1. : 0.;
if(what == "save") if(what == "save")
CTX::instance()->solver.autoSaveDatabase = val; CTX::instance()->solver.autoSaveDatabase = val;
else if(what == "archive")
CTX::instance()->solver.autoArchiveSolutions = val;
else if(what == "merge") else if(what == "merge")
CTX::instance()->solver.autoMergeFile = val; CTX::instance()->solver.autoMergeFile = val;
else if(what == "hide") else if(what == "hide")
...@@ -717,6 +722,8 @@ onelabWindow::onelabWindow(int deltaFontSize) ...@@ -717,6 +722,8 @@ onelabWindow::onelabWindow(int deltaFontSize)
_gear->add("Save database automatically", 0, onelab_option_cb, (void*)"save", _gear->add("Save database automatically", 0, onelab_option_cb, (void*)"save",
FL_MENU_TOGGLE); FL_MENU_TOGGLE);
_gear->add("Archive solutions automatically", 0, onelab_option_cb, (void*)"archive",
FL_MENU_TOGGLE);
_gear->add("Remesh automatically", 0, onelab_option_cb, (void*)"mesh", _gear->add("Remesh automatically", 0, onelab_option_cb, (void*)"mesh",
FL_MENU_TOGGLE); FL_MENU_TOGGLE);
_gear->add("Merge results automatically", 0, onelab_option_cb, (void*)"merge", _gear->add("Merge results automatically", 0, onelab_option_cb, (void*)"merge",
...@@ -1198,12 +1205,13 @@ void onelabWindow::rebuildSolverList() ...@@ -1198,12 +1205,13 @@ void onelabWindow::rebuildSolverList()
// update OneLab window title and gear menu // update OneLab window title and gear menu
_title = "OneLab"; _title = "OneLab";
Fl_Menu_Item* menu = (Fl_Menu_Item*)_gear->menu(); Fl_Menu_Item* menu = (Fl_Menu_Item*)_gear->menu();
int values[5] = {CTX::instance()->solver.autoSaveDatabase, int values[6] = {CTX::instance()->solver.autoSaveDatabase,
CTX::instance()->solver.autoArchiveSolutions,
CTX::instance()->solver.autoMesh, CTX::instance()->solver.autoMesh,
CTX::instance()->solver.autoMergeFile, CTX::instance()->solver.autoMergeFile,
CTX::instance()->solver.autoHideNewViews, CTX::instance()->solver.autoHideNewViews,
CTX::instance()->solver.autoShowLastStep}; CTX::instance()->solver.autoShowLastStep};
for(int i = 0; i < 5; i++){ for(int i = 0; i < 6; i++){
int idx = _gearOptionsStart - 1 + i; int idx = _gearOptionsStart - 1 + i;
if(values[i]) if(values[i])
menu[idx].set(); menu[idx].set();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment