Skip to content
Snippets Groups Projects
Select Git revision
  • afb00cc4f13b890168744ac2e46e1df436c061ec
  • master default
  • cgnsUnstructured
  • partitioning
  • poppler
  • HighOrderBLCurving
  • gmsh_3_0_4
  • gmsh_3_0_3
  • gmsh_3_0_2
  • gmsh_3_0_1
  • gmsh_3_0_0
  • gmsh_2_16_0
  • gmsh_2_15_0
  • gmsh_2_14_1
  • gmsh_2_14_0
  • gmsh_2_13_2
  • gmsh_2_13_1
  • gmsh_2_12_0
  • gmsh_2_11_0
  • gmsh_2_10_1
  • gmsh_2_10_0
  • gmsh_2_9_3
  • gmsh_2_9_2
  • gmsh_2_9_1
  • gmsh_2_9_0
  • gmsh_2_8_6
26 results

loader.cpp

Blame
  • Forked from gmsh / gmsh
    Source project has a limited visibility.
    loader.cpp 8.23 KiB
    #include "StringUtils.h"
    #include "onelabUtils.h"
    #include "OnelabClients.h"
    #include "metamodel.h"
    #include <algorithm>
    
    onelab::server *onelab::server::_server = 0;
    std::string clientName;
    
    std::string stateToChar(){
      std::vector<onelab::number> numbers;
      std::ostringstream sstream;
      onelab::server::instance()->get(numbers);
      for(std::vector<onelab::number>::iterator it = numbers.begin();
          it != numbers.end(); it++)
        sstream << (*it).getValue() << '\t';
      return sstream.str();
    }
    
    std::string showParamSpace(){
      std::vector<std::string> parameters=onelab::server::instance()->toChar();
      std::string db = "ONELAB parameter space: size="
        + itoa(onelab::server::instance()->getNumParameters()) + "\n";
      for(unsigned int i = 0; i < parameters.size(); i++)
        db.append(parameters[i] + '\n');
      for(unsigned int i = 0; i < db.size(); i++)
        if(db[i] == onelab::parameter::charSep()) db[i] = ' ';
      return db.c_str();
    }
    
    std::string showClientStatus(){
      std::ostringstream sstream;
      std::string name;
      std::cout << "\nONELAB: Present state of the onelab clients" << std::endl;
      for(onelab::server::citer it = onelab::server::instance()->firstClient();
          it != onelab::server::instance()->lastClient(); it++){
        name.assign(it->first);
        sstream << "<" << onelab::server::instance()->getChanged(name) << "> "
    	    << name << std::endl;
      }
      return sstream.str();
    }
    
    void initializeLoop(const std::string &level)
    {
      bool changed = false;
      std::vector<onelab::number> numbers;
      onelab::server::instance()->get(numbers);
      for(unsigned int i = 0; i < numbers.size(); i++){
    
        if(numbers[i].getAttribute("Loop") == level){
          if(numbers[i].getChoices().size() > 1){
    	numbers[i].setIndex(0);
    	numbers[i].setValue(numbers[i].getChoices()[0]);
    	onelab::server::instance()->set(numbers[i]);
    	changed = true;
          }
          else if(numbers[i].getStep() > 0){
    	if(numbers[i].getMin() != -onelab::parameter::maxNumber()){
    	  numbers[i].setValue(numbers[i].getMin());
    	  onelab::server::instance()->set(numbers[i]);
    	  changed = true;
    	}
          }
          else if(numbers[i].getStep() < 0){
    	if(numbers[i].getMax() != onelab::parameter::maxNumber()){
    	  numbers[i].setValue(numbers[i].getMax());
    	  onelab::server::instance()->set(numbers[i]);
    	  changed = true;
    	}
          }
        }
      }
    
      // force this to make sure that we remesh, even if a mesh exists and
      // we did not actually change a Gmsh parameter
      if(changed)
        onelab::server::instance()->setChanged(true, "Gmsh");
    }
    
    bool incrementLoop(const std::string &level)
    {
      bool recompute = false, loop = false;
      std::vector<onelab::number> numbers;
      onelab::server::instance()->get(numbers);
      for(unsigned int i = 0; i < numbers.size(); i++){
        if(numbers[i].getAttribute("Loop") == level){
          loop = true;
    
          if(numbers[i].getChoices().size() > 1){
    	int j = numbers[i].getIndex() + 1;
    	if((j >= 0) && (j < (int)numbers[i].getChoices().size())){
    	  numbers[i].setValue(numbers[i].getChoices()[j]);
    	  numbers[i].setIndex(j);
    	  onelab::server::instance()->set(numbers[i]);
    	  OLMsg::Info("Recomputing with %dth choice %s=%g", j,
    		    numbers[i].getName().c_str(), numbers[i].getValue());
    	  recompute = true;
    	}
          }
          else if(numbers[i].getStep() > 0){
    	if(numbers[i].getMax() != onelab::parameter::maxNumber() &&
    	   numbers[i].getValue() < numbers[i].getMax()){
    	  numbers[i].setValue(numbers[i].getValue() + numbers[i].getStep());
    	  onelab::server::instance()->set(numbers[i]);
    	  OLMsg::Info("Recomputing with new step %s=%g",
    		    numbers[i].getName().c_str(), numbers[i].getValue());
    	  recompute = true;
    	}
          }
          else if(numbers[i].getStep() < 0){
    	if(numbers[i].getMin() != -onelab::parameter::maxNumber() &&
    	   numbers[i].getValue() > numbers[i].getMin()){
    	  numbers[i].setValue(numbers[i].getValue() + numbers[i].getStep());
    	  onelab::server::instance()->set(numbers[i]);
    	  OLMsg::Info("Recomputing with new step %s=%g",
    		    numbers[i].getName().c_str(), numbers[i].getValue());
    	  recompute = true;
    	}
          }
        }
      }
    
      if(loop && !recompute) // end of this loop level
        initializeLoop(level);
    
      return recompute;
    }
    
    void initializeLoops()
    {
      initializeLoop("1");
      initializeLoop("2");
      initializeLoop("3");
    }
    
    bool incrementLoops()
    {
      bool ret = false;
      if(incrementLoop("3"))      ret = true;
      else if(incrementLoop("2")) ret = true;
      else if(incrementLoop("1")) ret = true;
      return ret;
    }
    
    bool menu() {
      int choice, counter1=0, counter2=0;
      std::vector<onelab::number> numbers;
      std::vector<onelab::string> strings;
    
      do {
        std::cout << "\nONELAB: menu" << std::endl ;
        std::cout << " 1- View parameter space\n 2- Client status\n 3- Set value\n 4- Analyze\n 5- Compute\n 6- Loop\n 7- Quit metamodel" << std::endl;
        choice=0;
        std::string mystr;
        while( (choice<1 || choice>7) && ++counter1<10 ) {
          std::cout << "\nONELAB: your choice? ";
          std::getline (std::cin, mystr);
          std::stringstream myStream(mystr);
          if (myStream >> choice) break;
          std::cout << "Invalid choice" << std::endl;
        }
        std::cout << "Your choice is <" << choice << ">" << std::endl;
    
        if (choice==1){
          std::cout << showParamSpace();
          choice=0;
        }
        if (choice==2){
          std::cout << showClientStatus();
          choice=0;
        }
        else if (choice==3){
          std::string name;
          std::cout << "ONELAB: Variable name? "; std::cin >> name;
          onelab::server::instance()->get(numbers,name);
          if (numbers.size()) {
    	float fval;
    	std::cout << "ONELAB: Value? "; std::cin >> fval;
    	numbers[0].setValue(fval);
    	bool allowed = onelab::server::instance()->set(numbers[0]);
          }
          else{
    	onelab::server::instance()->get(strings,name);
    	if (strings.size()) {
    	  std::string sval;
    	  std::cout << "ONELAB: Value? "; std::cin >> sval;
    	  strings[0].setValue(sval);
    	  onelab::server::instance()->set(strings[0]);
    	}
    	else
    	  std::cout << "ONELAB: The variable " << name
    		    << " is not defined" << std::endl;
          }
          choice=0;
        }
        else if (choice==4){
          metamodel("check");
          choice=0;
        }
        else if (choice==5){
          metamodel("compute");
          choice=0;
        }
        else if (choice==6){
          initializeLoops();
          do{
    	metamodel("compute");
          }while(incrementLoops());
          choice=0;
        }
        else if (choice==7)
          exit(1);
        else
          choice=0;
      } while(!choice && ++counter2<20);
    }
    
    void PrintUsage(const char *name){
      printf("\nUsage:       %s [-a -i] modelName\n", name);
      exit(1);
    }
    
    int main(int argc, char *argv[]){
      bool launchMenu=false;
      int i = 1;
      std::string caseName="", todo="compute", modelName="", workingDir="";
      onelab::remoteNetworkClient *client = 0;
    
      while(i < argc) {
        if(argv[i][0] == '-') {
          if(!strcmp(argv[i] + 1, "a")) {
            i++;
    	todo="check";
          }
          else if(!strcmp(argv[i] + 1, "i")) {
    	i++;
    	launchMenu=true;
          }
          else if(!strcmp(argv[i] + 1, "onelab")) {
    	std::string clientName=argv[i+1];
    	client = new onelab::remoteNetworkClient(clientName,argv[i+2]);
    	if(client){
    	  std::string action, cmd;
    
    	  std::vector<onelab::string> ps;
    	  client->get(ps,clientName+"/Action");
    	  if(ps.size() && ps[0].getValue().size())
    	    action.assign(ps[0].getValue());
    
    	  if(!action.compare("compute")){
    	    std::vector<onelab::string> ps;
    	    client->get(ps,clientName+"/FullCmdLine");
    	    if(ps.size() && ps[0].getValue().size())
    	      cmd.assign(ps[0].getValue());
    
    	    if(cmd.size()){
    	      OLMsg::Info("Loader calls <%s>",cmd.c_str());
    	      SystemCall(cmd.c_str(),true); //true->blocking
    	    }
    	    else
    	      OLMsg::Info("No full command line found for <%s>",
    			  clientName.c_str());
    	  }
    	  OLMsg::Info("Stopping client <%s>", clientName.c_str());
    	  delete client;
    	}
    	exit(1);
          }
        }
        else {
          caseName=argv[i];
          modelName.assign(SplitFileName(caseName)[1]);
          workingDir.assign(SplitFileName(caseName)[0]);
          if(workingDir.empty())
    	workingDir.assign(getCurrentWorkdir());
          i++;
        }
      }
    
      if(caseName.empty())
        OLMsg::Fatal("No valid input model name <%s>.", caseName.c_str());
    
      OLMsg::InitializeOnelab("onelab");
      if(argc) OLMsg::SetOnelabString("LoaderPathName",argv[0]);
      OLMsg::SetOnelabString("Arguments/FileName",modelName);
      OLMsg::SetOnelabString("Arguments/WorkingDir",workingDir);
    
      if(launchMenu)
        menu();
      else
        metamodel(todo);
    
      OLMsg::FinalizeOnelab();
    }