Skip to content
Snippets Groups Projects
MinMax.cpp 2.95 KiB
Newer Older
Christophe Geuzaine's avatar
Christophe Geuzaine committed
// Gmsh - Copyright (C) 1997-2012 C. Geuzaine, J.-F. Remacle
Christophe Geuzaine's avatar
Christophe Geuzaine committed
//
// See the LICENSE.txt file for license information. Please report all
// bugs and problems to <gmsh@geuz.org>.

#include "MinMax.h"
#include "PViewOptions.h"

StringXNumber MinMaxOptions_Number[] = {
Francois Henrotte's avatar
Francois Henrotte committed
  {GMSH_FULLRC, "View", NULL, -1.},
  {GMSH_FULLRC, "OverTime", NULL, 0}
Christophe Geuzaine's avatar
Christophe Geuzaine committed
};

extern "C"
{
  GMSH_Plugin *GMSH_RegisterMinMaxPlugin()
  {
    return new GMSH_MinMaxPlugin();
  }
}

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"
Francois Henrotte's avatar
Francois Henrotte committed
    "If `OverTime' = 1, calculates the min-max over space AND time\n\n"
Christophe Geuzaine's avatar
pp  
Christophe Geuzaine committed
    "Plugin(MinMax) creates two new views.";
Christophe Geuzaine's avatar
Christophe Geuzaine committed
}

int GMSH_MinMaxPlugin::getNbOptions() const
{
  return sizeof(MinMaxOptions_Number) / sizeof(StringXNumber);
}

StringXNumber *GMSH_MinMaxPlugin::getOption(int iopt)
{
  return &MinMaxOptions_Number[iopt];
}

PView *GMSH_MinMaxPlugin::execute(PView * v)
{
  int iView = (int)MinMaxOptions_Number[0].def;
Francois Henrotte's avatar
Francois Henrotte committed
  int overTime = (int)MinMaxOptions_Number[1].def;
Christophe Geuzaine's avatar
Christophe Geuzaine committed
  
  PView *v1 = getView(iView, v);
  if(!v1) return v;

  PViewData *data1 = v1->getData();
  PView *vMin = new PView();
  PView *vMax = new PView();
  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);
Francois Henrotte's avatar
Francois Henrotte committed

  double minView, maxView, min=1E200, max=-1E200, timeMin=0, timeMax=0;
Christophe Geuzaine's avatar
Christophe Geuzaine committed
  for(int step = 0; step < data1->getNumTimeSteps(); step++){
    if(data1->hasTimeStep(step)){
Francois Henrotte's avatar
Francois Henrotte committed
      minView=data1->getMin(step);
      maxView=data1->getMax(step);
      if(minView<min){
	min=minView;
	timeMin = data1->getTime(step);
      }
      if(maxView>max){ 
	max=maxView;
	timeMax = data1->getTime(step);
      }
      if(!overTime){
	dataMin->SP.push_back(data1->getMin(step));
	dataMax->SP.push_back(data1->getMax(step));
      }
Christophe Geuzaine's avatar
Christophe Geuzaine committed
  }
Francois Henrotte's avatar
Francois Henrotte committed
  if(overTime){
    dataMin->SP.push_back(min);
    dataMax->SP.push_back(max);
  }

Christophe Geuzaine's avatar
Christophe Geuzaine committed
  dataMin->NbSP = 1;
  dataMax->NbSP = 1;
Francois Henrotte's avatar
Francois Henrotte committed

Christophe Geuzaine's avatar
Christophe Geuzaine committed
  vMin->getOptions()->intervalsType = PViewOptions::Numeric;
  vMax->getOptions()->intervalsType = PViewOptions::Numeric;
  
  for(int step = 0; step < data1->getNumTimeSteps(); step++){
    if(data1->hasTimeStep(step)){
Francois Henrotte's avatar
Francois Henrotte committed
      if(overTime){
	dataMin->Time.push_back(timeMin);
	dataMax->Time.push_back(timeMax);
      }
      else{
	double time = data1->getTime(step);
	dataMin->Time.push_back(time);
	dataMax->Time.push_back(time);
      }
Francois Henrotte's avatar
Francois Henrotte committed

Christophe Geuzaine's avatar
Christophe Geuzaine committed
  dataMin->setName(data1->getName() + "_Min");
  dataMin->setFileName(data1->getName() + "_Min.pos");
  dataMin->finalize();
  dataMax->setName(data1->getName() + "_Max");
  dataMax->setFileName(data1->getName() + "_Max.pos");
  dataMax->finalize();
  
  return 0;
}