Skip to content
Snippets Groups Projects
Commit 854e82c7 authored by Francois Henrotte's avatar Francois Henrotte
Browse files

Step<0 in onelab, MinMax plugin computes also the argmin

parent 7bd7f6ae
No related branches found
No related tags found
No related merge requests found
......@@ -320,6 +320,7 @@ class GmshServer : public GmshSocket{
virtual ~GmshServer(){}
virtual int NonBlockingSystemCall(const char *str) = 0;
virtual int NonBlockingWait(int socket, double waitint, double timeout) = 0;
int Start(const char *command, const char *sockname, double timeout)
{
if(!sockname) throw "Invalid (null) socket name";
......@@ -385,11 +386,10 @@ class GmshServer : public GmshSocket{
}
}
char cmd[1024];
if(command && strlen(command)){
// we assume that the command line always ends with the socket name
std::string cmd(command);
cmd += " " + _sockname;
NonBlockingSystemCall(cmd.c_str()); // start the solver
sprintf(cmd,command,_sockname.c_str());
NonBlockingSystemCall(cmd); // starts the solver
}
else{
timeout = 0.; // no command launched: don't set a timeout
......
......@@ -203,13 +203,22 @@ bool onelab::localNetworkClient::run()
std::string checkCommand = (ps.empty() ? "" : ps[0].getValue());
get(ps, getName() + "/9ComputeCommand");
std::string computeCommand = (ps.empty() ? "" : ps[0].getValue());
/*
if(action == "check")
command += " " + modelName + " " + checkCommand;
else if(action == "compute")
command += " " + modelName + " " + computeCommand;
*/
if(action == "check")
command.append(" " + modelName + " " + checkCommand) ;
else if(action == "compute")
command.append(" " + modelName + " " + computeCommand);
}
/*
// append "-onelab" command line argument
command += " " + _socketSwitch + " \"" + getName() + "\"";
*/
command.append(" " + getSocketSwitch() + " " + getName() + " %s");
}
else{
Msg::Info("Listening on socket '%s'", sockname.c_str());
......@@ -448,16 +457,25 @@ static void initializeLoop(const std::string &level)
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].setValue(numbers[i].getChoices()[0]);
onelab::server::instance()->set(numbers[i]);
changed = true;
}
else if(numbers[i].getMin() != -onelab::parameter::maxNumber() &&
numbers[i].getStep()){
numbers[i].setValue(numbers[i].getMin());
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;
}
}
}
}
......@@ -476,6 +494,7 @@ static bool incrementLoop(const std::string &level)
for(unsigned int i = 0; i < numbers.size(); i++){
if(numbers[i].getAttribute("Loop") == level){
loop = true;
if(numbers[i].getChoices().size() > 1){
// FIXME should store loopVariable attribute in the parameter
// -- the following test will loop forever if 2 values are
......@@ -492,14 +511,25 @@ static bool incrementLoop(const std::string &level)
}
}
}
else if(numbers[i].getMax() != onelab::parameter::maxNumber() &&
numbers[i].getValue() < numbers[i].getMax() &&
numbers[i].getStep()){
numbers[i].setValue(numbers[i].getValue() + numbers[i].getStep());
onelab::server::instance()->set(numbers[i]);
Msg::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].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]);
Msg::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]);
Msg::Info("Recomputing with new step %s=%g",
numbers[i].getName().c_str(), numbers[i].getValue());
recompute = true;
}
}
}
}
......@@ -536,13 +566,20 @@ static bool incrementLoop()
static std::vector<double> getRange(onelab::number &p)
{
std::vector<double> v;
if(p.getChoices().size()){
v = p.getChoices();
}
else if(p.getMin() != -onelab::parameter::maxNumber() &&
p.getMax() != onelab::parameter::maxNumber() && p.getStep()){
for(double d = p.getMin(); d <= p.getMax(); d += p.getStep())
v.push_back(d);
p.getMax() != onelab::parameter::maxNumber()){
if(p.getStep()>0){
for(double d = p.getMin(); d <= p.getMax(); d += p.getStep())
v.push_back(d);
}
else if(p.getStep()<0){
for(double d = p.getMin(); d <= p.getMax(); d -= p.getStep())
v.push_back(d);
}
}
return v;
}
......
......@@ -8,7 +8,8 @@
StringXNumber MinMaxOptions_Number[] = {
{GMSH_FULLRC, "View", NULL, -1.},
{GMSH_FULLRC, "OverTime", NULL, 0}
{GMSH_FULLRC, "OverTime", NULL, 0},
{GMSH_FULLRC, "Argument", NULL, 0}
};
extern "C"
......@@ -23,7 +24,8 @@ std::string GMSH_MinMaxPlugin::getHelp() const
{
return "Plugin(MinMax) computes the min/max of a view.\n\n"
"If `View' < 0, the plugin is run on the current view.\n\n"
"If `OverTime' = 1, calculates the min-max over space AND time\n\n"
"If `OverTime' = 1, calculates the min/max over space AND time\n\n"
"If `Argument' = 1, calculates the min/max AND the argmin/argmax\n\n"
"Plugin(MinMax) creates two new views.";
}
......@@ -41,6 +43,7 @@ PView *GMSH_MinMaxPlugin::execute(PView * v)
{
int iView = (int)MinMaxOptions_Number[0].def;
int overTime = (int)MinMaxOptions_Number[1].def;
int argument = (int)MinMaxOptions_Number[2].def;
PView *v1 = getView(iView, v);
if(!v1) return v;
......@@ -51,42 +54,82 @@ PView *GMSH_MinMaxPlugin::execute(PView * v)
PViewDataList *dataMin = getDataList(vMin);
PViewDataList *dataMax = getDataList(vMax);
double x = data1->getBoundingBox().center().x();
double y = data1->getBoundingBox().center().y();
double z = data1->getBoundingBox().center().z();
dataMin->SP.push_back(x); dataMin->SP.push_back(y); dataMin->SP.push_back(z);
dataMax->SP.push_back(x); dataMax->SP.push_back(y); dataMax->SP.push_back(z);
if(!argument){
double x = data1->getBoundingBox().center().x();
double y = data1->getBoundingBox().center().y();
double z = data1->getBoundingBox().center().z();
dataMin->SP.push_back(x); dataMin->SP.push_back(y); dataMin->SP.push_back(z);
dataMax->SP.push_back(x); dataMax->SP.push_back(y); dataMax->SP.push_back(z);
dataMin->NbSP = 1;
dataMax->NbSP = 1;
}
double minView=VAL_INF, maxView=-VAL_INF, min=VAL_INF, max=-VAL_INF, timeMin=0, timeMax=0;
double xmin, ymin, zmin, xmax, ymax, zmax;
double minView, maxView, min=1E200, max=-1E200, timeMin=0, timeMax=0;
for(int step = 0; step < data1->getNumTimeSteps(); step++){
if(data1->hasTimeStep(step)){
minView=data1->getMin(step);
maxView=data1->getMax(step);
if(minView<min){
min=minView;
timeMin = data1->getTime(step);
//minView=data1->getMin(step);
//maxView=data1->getMax(step);
for(int ent = 0; ent < data1->getNumEntities(step); ent++){
for(int ele = 0; ele < data1->getNumElements(step, ent); ele++){
for(int nod = 0; nod < data1->getNumNodes(step, ent, ele); nod++){
double val;
data1->getScalarValue(step, ent, ele, nod, val);
if(val<minView){
data1->getNode(step, ent, ele, nod, xmin, ymin, zmin);
minView=val;
}
if(val>maxView){
data1->getNode(step, ent, ele, nod, xmax, ymax, zmax);
maxView=val;
}
}
}
}
if(maxView>max){
max=maxView;
timeMax = data1->getTime(step);
if(!overTime){
// one stores min/max and at each time step
if(argument){
dataMin->SP.push_back(xmin); dataMin->SP.push_back(ymin); dataMin->SP.push_back(zmin);
dataMax->SP.push_back(xmax); dataMax->SP.push_back(ymax); dataMax->SP.push_back(zmax);
(dataMin->NbSP)++;
(dataMax->NbSP)++;
}
dataMin->SP.push_back(minView);
dataMax->SP.push_back(maxView);
double time = data1->getTime(step);
dataMin->Time.push_back(time);//?
dataMax->Time.push_back(time);//?
}
if(!overTime){
dataMin->SP.push_back(data1->getMin(step));
dataMax->SP.push_back(data1->getMax(step));
else{
if(minView<min){
min=minView;
timeMin = data1->getTime(step);
}
if(maxView>max){
max=maxView;
timeMax = data1->getTime(step);
}
}
}
}
if(overTime){
if(overTime){
dataMin->SP.push_back(min);
dataMax->SP.push_back(max);
dataMin->Time.push_back(timeMin);//?
dataMax->Time.push_back(timeMax);//?
}
dataMin->NbSP = 1;
dataMax->NbSP = 1;
// dataMin->NbSP = 1;
// dataMax->NbSP = 1;
vMin->getOptions()->intervalsType = PViewOptions::Numeric;
vMax->getOptions()->intervalsType = PViewOptions::Numeric;
/*
for(int step = 0; step < data1->getNumTimeSteps(); step++){
if(data1->hasTimeStep(step)){
if(overTime){
......@@ -100,6 +143,7 @@ PView *GMSH_MinMaxPlugin::execute(PView * v)
}
}
}
*/
dataMin->setName(data1->getName() + "_Min");
dataMin->setFileName(data1->getName() + "_Min.pos");
......
......@@ -65,7 +65,8 @@ class elasticitySolver
FunctionSpace<double> *LagrangeMultiplierSpace;
// young modulus and poisson coefficient per physical
std::vector<elasticField> elasticFields;
std::vector<elasticField> elasticFields;
std::vector<LagrangeMultiplierField> LagrangeMultiplierFields;
// neumann BC
std::vector<neumannBC> allNeumann;
......
......@@ -73,7 +73,7 @@ void GetSetFixations (elasticitySolver &e) {
}
*/
void WhatToDoNow(int argc, char *argv[], int &solve, std::string &modelName)
void WhatToDoNow(int argc, char *argv[], int &solve, std::string &fileName)
{
int i = 1;
solve = 1;
......@@ -123,7 +123,8 @@ void WhatToDoNow(int argc, char *argv[], int &solve, std::string &modelName)
}
}
else {
modelName = std::string(argv[i]);
std::string modelName = std::string(argv[i]);
fileName=modelName.substr(0,modelName.find_last_of(".")); // remove extension
// if (modelName)
// modelName = modelName + std::string(".fuk");
i++;
......
ElasticDomain 7 100.e9 0.3
onelab.number Material1.Create(1);
onelab.string Material.Add(Material1); Material.Add(Material2); Material.Add(Material3);
onelab.iftrue(Material1)
onelab.number E.Create(100.e9); Nu.Create(0.3);
onelab.endif
onelab.iftrue(Material2)
onelab.number E.Create(200.e9); Nu.Create(0.25);
onelab.endif
onelab.iftrue(Material3)
onelab.number E.Create(80.e9); Nu.Create(0.5);
onelab.endif
ElasticDomain 7 onelab.getValue(E) onelab.getValue(Nu);
EdgeDisplacement 8 0 0
EdgeDisplacement 8 1 0
EdgeDisplacement 8 2 0
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment