Commit e77133a4 authored by Julia's avatar Julia

stufff

parent 77ee6956
......@@ -2,52 +2,116 @@
#define FILTERTYPE_H
namespace Nektar
{
namespace LSIAC
{
namespace SIACUtilities
{
//! This enum specifies the kind of filter to be used by the object.
/*! The user can specify any type of smoothing or derivative filter.
* All the properties of memeber depends on this enum. This enum cannot be changed after the object has been initialized.
* A new enum needs to be added to the list to create any new type of filter.
*/
enum FilterType
{
eNONE, /**< enum value 1 */
eSYM_2kp1, /**< enum value 2, Will apply filter only when symmetric filter is possible. */
eSYM_4kp1,
eSYM,
eSYM_2kp1_1SIDED_2kp1, /**< enum value 3, Simplest form of SIAC and oneSided filter. */
eSYM_2kp1_1SIDED_2kp2, /**< enum value 4, Xli 2k+1 CentralBspl and 1 GeneralBSlp only at borders appropriately*/
eSYM_2kp1_1SIDED_XLI,
eSYM_2kp1_1SIDED_4kp1, /**< enum value 5, SRV's 4k+1 CentralBspl at boundaries.*/
eSYM_2kp1_1SIDED_SRV, /**< enum value 5, SRV's 4k+1 CentralBspl at boundaries.*/
eSYM_1SIDED_BASIC,
eSYM_1SIDED_XLI,
eSYM_1SIDED,
eSYM_DER_2kp1,
eSYM_DER,
eSYM_DER_1SIDED,
eSYM_DER_2kp1_1SIDED_2kp1, /**< enum value 6, Simple Derivative filter*/
eSYM_DER_2kp1_1SIDED_2kp2, /**< enum value 7, SRV's Derivative filter */
eSYM_DER_2kp1_1SIDED_4kp1, /**< enum value 8, Xli's Derivative fitler */
eSYM_DER_1SIDED_SRV,
eSYM_DER_1SIDED_XLi,
};
struct SMOOTHIE_Status {
int count;
int cancelled;
int SOURCE;
int TAG;
int ERROR;
};
}
}
}
{
namespace LSIAC
{
namespace SIACUtilities
{
//! This enum specifies the kind of filter to be used by the object.
/*! The user can specify any type of smoothing or derivative filter.
* All the properties of memeber depends on this enum. This enum cannot be changed after the object has been initialized.
* A new enum needs to be added to the list to create any new type of filter.
*/
enum FilterType
{
eNONE, /// 0
ePURE,
ePURE_2kp1,
eSTD, /// 1
eSTD_1SIDED_XLI, /// 2
eSTD_2kp1, /// 3
eSTD_2kp1_1SIDED_XLI,/// 4
eSTD_2kp1_1SIDED_4kp1, /// 5
eSTD_2kp1_1SIDED_SRV, /// 6
eDER,/// 7
eDER_1SIDED, ///8
eDER_1SIDED_XLI, /// 9
eDER_2kp1, /// 10
eDER_2kp1_1SIDED, /// 11
eDER_2kp1_1SIDED_XLI, /// 12
eDER_2kp1_1SIDED_4kp1, /// 13
eDER_2kp1_1SIDED_SRV, /// 14
eDER_LOWER_ORDER,
eDER_2kp1_LOWER_ORDER
};
inline void write_filter_name(FilterType filter,string &name)
{
switch(filter)
{
case eNONE:
name="NONE";
return;
case ePURE:
name="PURE";
return;
case ePURE_2kp1:
name="PURE_2kp1";
return;
case eSTD:
name="STD";
return;
case eSTD_1SIDED_XLI:
name="STD_1SIDED_XLI";
return;
case eSTD_2kp1:
name="STD_2kp1";
return;
case eSTD_2kp1_1SIDED_XLI:
name="STD_2kp1_1SIDED_XLI";
return;
case eSTD_2kp1_1SIDED_4kp1:
name="STD_2kp1_1SIDED_4kp1";
return;
case eSTD_2kp1_1SIDED_SRV:
name="STD_2kp1_1SIDED_SRV";
return;
case eDER:
name="DER";
return;
case eDER_1SIDED:
name="DER_1SIDED";
return;
case eDER_1SIDED_XLI:
name="DER_1SIDED_XLI";
return;
case eDER_2kp1:
name="DER_2kp1";
return;
case eDER_2kp1_1SIDED:
name="DER_2kp1_1SIDED";
return;
case eDER_2kp1_1SIDED_XLI:
name="DER_2kp1_1SIDED_XLI";
return;
case eDER_2kp1_1SIDED_4kp1:
name="DER_2kp1_1SIDED_4kp1";
return;
case eDER_2kp1_1SIDED_SRV:
name="DER_2kp1_1SIDED_SRV";
return;
case eDER_LOWER_ORDER:
name="DER_LOWER_ORDER";
return;
case eDER_2kp1_LOWER_ORDER:
name="DER_2kp1_LOWER_ORDER";
return;
}
}
struct SMOOTHIE_Status {
int count;
int cancelled;
int SOURCE;
int TAG;
int ERROR;
};
}
}
}
#endif
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -3,57 +3,42 @@
#include "HandleNekMesh.h"
/// Handles Nektar 1D meshes.
/**
/**
*/
namespace Nektar
{
namespace LSIAC
{
class HandleNekMesh1D;
typedef boost::shared_ptr<HandleNekMesh1D> HandleNekMesh1DSharedPtr;
class HandleNekMesh1D: public HandleNekMesh
{
public:
HandleNekMesh1D( LibUtilities::SessionReaderSharedPtr sessionPtr):HandleNekMesh(sessionPtr)
{
// cout << "into HandleNekMesh1D constructor" << endl;
// m_expansions.push_back(MemoryManager<MultiRegions::ContField1D>::
// AllocateSharedPtr(m_session,m_graph, m_session->GetVariable(0)) );
// cout << "Expansion Type: " << m_expansions[0]->GetExpType() << endl;
}
protected:
virtual bool v_GetBreakPts( const NekDouble xcen_offset,const NekDouble ycen_offset,
const NekDouble zcen_offset, Array<OneD,NekDouble> &direction, const NekDouble t_offset_min,
const NekDouble t_offset_max, vector<NekDouble> &xPos, vector<NekDouble> &yPos,
vector<NekDouble> &zPos, vector<NekDouble> &tPos );
virtual bool v_CanTRangebeApplied( const NekDouble PtsX, const NekDouble PtsY, const NekDouble PtsZ,
const NekDouble scaling, const NekDouble tmin, const NekDouble tmax,
NekDouble &tminUpdate, NekDouble &tmaxUpdate);
virtual bool v_CanTRangebeApplied( const NekDouble PtsX, const NekDouble PtsY, const NekDouble PtsZ,
const Array<OneD,NekDouble> &direction, const NekDouble tmin, const NekDouble tmax,
NekDouble &meshShift);
virtual bool v_LoadData(string Filename, vector<string> &variables);
virtual bool v_LoadMesh(string var);
virtual bool v_EvaluateAt(const Array<OneD,NekDouble> &xPos,const Array<OneD,NekDouble> &yPos,
const Array<OneD,NekDouble> &zPos, const int gID, const int eID,
Array<OneD,NekDouble> &values,int varNum=0);
virtual bool v_GetListOfGIDs( const NekDouble xPos, const NekDouble yPos, const NekDouble zPos,
Array<OneD,NekDouble> &direction, const vector<NekDouble> t_breaks, vector<int> &t_GIDs,
vector<int> & t_EIDs) const;
virtual void v_LoadExpListIntoRTree()
{
assert(false && "Not implemented, should not use it.");
}
};
}
}
{
namespace LSIAC
{
class HandleNekMesh1D;
typedef boost::shared_ptr<HandleNekMesh1D> HandleNekMesh1DSharedPtr;
class HandleNekMesh1D: public HandleNekMesh
{
public:
HandleNekMesh1D( LibUtilities::SessionReaderSharedPtr sessionPtr):HandleNekMesh(sessionPtr)
{
m_useRTree=false;
// cout << "into HandleNekMesh1D constructor" << endl;
// m_expansions.push_back(MemoryManager<MultiRegions::ContField1D>::
// AllocateSharedPtr(m_session,m_graph, m_session->GetVariable(0)) );
// cout << "Expansion Type: " << m_expansions[0]->GetExpType() << endl;
}
protected:
virtual bool v_GetBreakPts( const NekDouble xcen_offset,const NekDouble ycen_offset,
const NekDouble zcen_offset, Array<OneD,NekDouble> &direction, const NekDouble t_offset_min,
const NekDouble t_offset_max, vector<NekDouble> &xPos, vector<NekDouble> &yPos,
vector<NekDouble> &zPos, vector<NekDouble> &tPos );
virtual bool v_LoadData(string Filename, vector<string> &variables);
virtual bool v_LoadMesh(string var);
virtual int v_GetExpansionIndexUsingRTree(Array<OneD,NekDouble> locCoord);
};
}
}
#endif
This diff is collapsed.
......@@ -2,90 +2,55 @@
#define HANDLENEKMESH2D_H
#include "HandleNekMesh.h"
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point.hpp>
#include <boost/geometry/geometries/box.hpp>
#include <boost/geometry/index/rtree.hpp>
#include <boost/foreach.hpp>
#include <MultiRegions/ExpList.h>
#include <MultiRegions/DisContField2D.h>
#include<LocalRegions/Expansion1D.h>
#include<LocalRegions/Expansion2D.h>
#include<SpatialDomains/Conditions.h>
#include<SpatialDomains/Geometry.h>
#include<SpatialDomains/Geometry2D.h>
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point.hpp>
#include <boost/geometry/geometries/box.hpp>
#include <boost/geometry/index/rtree.hpp>
#include <boost/foreach.hpp>
#include <boost/any.hpp>
namespace Nektar
{
namespace LSIAC
{
namespace Boostg = boost::geometry;
namespace Boostgi = boost::geometry::index;
using boost::any_cast;
typedef Boostg::model::point<NekDouble, 3, Boostg::cs::cartesian> RPoint;
typedef Boostg::model::box<RPoint> RBox;
typedef boost::tuple<RBox,unsigned,unsigned> RValue;
typedef Boostgi::rtree<RValue, Boostgi::rstar<4> > RTree;
/// Handles Nektar 2D meshes.
/// class SmoothieSIAC2D;
class HandleNekMesh2D;
typedef boost::shared_ptr<HandleNekMesh2D> HandleNekMesh2DSharedPtr;
class HandleNekMesh2D: public HandleNekMesh
{
private:
bool m_useRTree;
protected:
RTree m_rtree;
public:
HandleNekMesh2D( LibUtilities::SessionReaderSharedPtr sessionPtr):HandleNekMesh(sessionPtr)
{
}
void IntersectWithBoxUsingRTree(
const NekDouble minCornerX, const NekDouble minCornerY, const NekDouble minCornerZ,
const NekDouble maxCornerX, const NekDouble maxCornerY, const NekDouble maxCornerZ,
vector<int> &elIds, vector<int> &glIds);
int GetExpansionIndexUsingRTree( const Array<OneD,NekDouble> &point) const;
protected:
virtual bool v_intersect(
Array<OneD,NekDouble> &p1, Array<OneD,NekDouble> &p2,
Array<OneD,NekDouble> &q1, Array<OneD,NekDouble> &q2,
Array<OneD,NekDouble>&i1, vector<NekDouble>&i2 );
virtual bool v_GetBreakPts( const Array<OneD,NekDouble> point_offset,Array<OneD,NekDouble> &direction, const NekDouble tmin,
const NekDouble tmax, vector<NekDouble> &tPos);
virtual bool v_LoadData(string Filename, vector<string> &variables);
virtual bool v_LoadMesh(string var);
// virtual bool v_EvaluateAt(const Array<OneD, Array<OneD, NekDouble> > point,
// const int gID, const int eID, Array<OneD,NekDouble> &values, int varNum=0);
virtual bool v_GetListOfGIDs(const Array<OneD,NekDouble> Pos, Array<OneD,NekDouble> &direction, vector<double> t_breaks, Array<OneD,int> &t_GIDs,
Array<OneD, int> &t_EIDs) const;
// functions used by RTree
virtual void v_LoadExpListIntoRTree();
private:
void FindElementIDForLineSegs( const vector<NekDouble> &tvalT,
const Array<OneD,NekDouble> &point,
const Array<OneD,NekDouble> &dir,
const SpatialDomains::MeshGraphSharedPtr mesh_graph,
vector<int> &EIDs );
virtual void GetBoundingOfElement(SpatialDomains::GeometrySharedPtr elGeom, RBox &b);
};
}
}
namespace Nektar
{
namespace LSIAC
{
class HandleNekMesh2D;
typedef boost::shared_ptr<HandleNekMesh2D> HandleNekMesh2DSharedPtr;
class HandleNekMesh2D: public HandleNekMesh
{
private:
protected:
public:
HandleNekMesh2D( LibUtilities::SessionReaderSharedPtr sessionPtr,bool useRTree = false):HandleNekMesh(sessionPtr)
{
m_useRTree=useRTree;
cout<<"RTREES ? "<<boolalpha<<m_useRTree<<endl;
}
protected:
RTree m_rtree;
virtual bool v_LoadMesh(string var);
virtual bool v_LoadData(string Filename, vector<string> &variables);
virtual bool v_GetBreakPts( const Array<OneD,NekDouble> point_offset,Array<OneD,NekDouble> &direction, const NekDouble tmin,
const NekDouble tmax, vector<NekDouble> &tPos);
virtual bool v_intersect(
Array<OneD,NekDouble> &p1, Array<OneD,NekDouble> &p2,
Array<OneD,NekDouble> &q1, Array<OneD,NekDouble> &q2,
Array<OneD,NekDouble>&i1, vector<NekDouble>&i2 );
virtual int v_GetExpansionIndexUsingRTree( const Array<OneD,NekDouble> &point) const;
void LoadExpListIntoRTree();
void GetBoundingOfElement(SpatialDomains::GeometrySharedPtr elGeom, RBox &b);
void IntersectWithBoxUsingRTree(Array<OneD,NekDouble> &minCorner,Array<OneD,NekDouble> maxCorner,
vector<int> &elIds, vector<int> &glIds);
};
}
}
#endif
This diff is collapsed.
......@@ -2,132 +2,93 @@
#define HANDLENEKMESH3D_H
#include "HandleNekMesh.h"
//libraries for rTrees
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point.hpp>
#include <boost/geometry/geometries/box.hpp>
#include <boost/geometry/index/rtree.hpp>
#include <boost/foreach.hpp>
#include <boost/function_output_iterator.hpp>
namespace Nektar
{
namespace LSIAC
{
namespace Boostg = boost::geometry;
namespace Boostgi = boost::geometry::index;
typedef Boostg::model::point<NekDouble, 3, Boostg::cs::cartesian> RPoint;
typedef Boostg::model::box<RPoint> RBox;
typedef boost::tuple<RBox,unsigned,unsigned> RValue;
//typedef std::pair<RBox,unsigned,unsigned> RValue;
//typedef Boostgi::rtree<RValue, Boostgi::rstar<16> > RTree;
typedef Boostgi::rtree<RValue, Boostgi::quadratic<10,3> > RTree;
// used with Boost.Geometry R-tree
struct MySearchCallback2
{
MySearchCallback2(vector<unsigned> &res)
:m_res(&res)
{}
template <typename Value>
void operator()(Value const& v)
{
m_res->push_back(boost::get<1>(v));
}
vector<unsigned>* m_res;
};
class HandleNekMesh3D;
typedef boost::shared_ptr<HandleNekMesh3D> HandleNekMesh3DSharedPtr;
class HandleNekMesh3D: public HandleNekMesh
{
private:
bool m_useRTree;
// static vector<unsigned> m_res;
protected:
SpatialDomains::TriGeomMap m_triMap;
SpatialDomains::QuadGeomMap m_quadMap;
public:
RTree m_rtree;
public:
vector< Array<OneD,NekDouble> > m_Arrays;
public:
HandleNekMesh3D( LibUtilities::SessionReaderSharedPtr sessionPtr):HandleNekMesh(sessionPtr),m_useRTree(false)
{
m_triMap = m_graph->GetAllTriGeoms();
m_quadMap = m_graph->GetAllQuadGeoms();
}
void IntersectWithBoxUsingRTree(
const NekDouble minCornerX, const NekDouble minCornerY, const NekDouble minCornerZ,
const NekDouble maxCornerX, const NekDouble maxCornerY, const NekDouble maxCornerZ,
vector<int> &elIds, vector<int> &glIds);
// function using RTree
int GetExpansionIndexUsingRTree( const Array<OneD,NekDouble> &point) const;
protected:
virtual bool v_GetBreakPts( const Array<OneD,NekDouble> point,Array<OneD,NekDouble> &direction, const NekDouble tmin, const NekDouble tmax, vector<NekDouble> &tPos );
virtual bool v_CanTRangebeApplied( const NekDouble PtsX, const NekDouble PtsY, const NekDouble PtsZ,
const NekDouble scaling, const NekDouble tmin, const NekDouble tmax,
NekDouble &tminUpdate, NekDouble &tmaxUpdate);
virtual bool v_CanTRangebeApplied( const NekDouble PtsX, const NekDouble PtsY, const NekDouble PtsZ,
const Array<OneD,NekDouble> &direction, const NekDouble tmin, const NekDouble tmax,
NekDouble &meshShift);
virtual bool v_LoadData(string Filename, vector<string> &variables);
virtual bool v_LoadMesh(string var);
virtual bool v_GetListOfGIDs(const Array<OneD,NekDouble> Pos, Array<OneD,NekDouble> &direction, vector<double> t_breaks, Array<OneD,int> &t_GIDs,
Array<OneD, int> &t_EIDs) const;
virtual void v_LoadExpListIntoRTree();
private:
void FindElementIDForLineSegs( const vector<NekDouble> &tvalT,
const Array<OneD,NekDouble> &point,
const Array<OneD,NekDouble> &dir,
const SpatialDomains::MeshGraphSharedPtr mesh_graph,
vector<int> &EIDs );
void IntersectWithFaces( const Array<OneD,NekDouble> &dir, const Array<OneD,NekDouble> &point,
const NekDouble t1, const NekDouble t2, vector<NekDouble> &tvalT );
void PlaneEquationOfFace( const SpatialDomains::GeometrySharedPtr geomEl,
NekDouble &a, NekDouble &b, NekDouble &c, NekDouble &d);
void IntersectLineSegWithFace( const SpatialDomains::GeometrySharedPtr geomEl,
const Array<OneD,NekDouble> &dir, const Array<OneD,NekDouble> &point, const NekDouble t1,
const NekDouble t2, vector<NekDouble> &tvalT );
// functions used by RTree
void BoundingBoxOfLineSeg( const Array<OneD,NekDouble> &dir,
const Array<OneD,NekDouble> &pt, const NekDouble t1, const NekDouble t2,
RBox &b );
void IntersectWithFacesUsingRTree( const Array<OneD,NekDouble> &dir, const Array<OneD,NekDouble> &point,
const NekDouble t1, const NekDouble t2, vector<NekDouble> &tvalT );
void GetBoundingOfElement(SpatialDomains::GeometrySharedPtr elGeom, RBox &b);
};
}
}
{
namespace LSIAC
{
struct MySearchCallback2
{
MySearchCallback2(vector<unsigned> &res)
:m_res(&res)
{}
template <typename Value>
void operator()(Value const& v)
{
m_res->push_back(boost::get<1>(v));
}
vector<unsigned>* m_res;
};
class HandleNekMesh3D;
typedef boost::shared_ptr<HandleNekMesh3D> HandleNekMesh3DSharedPtr;
class HandleNekMesh3D: public HandleNekMesh
{
private:
// static vector<unsigned> m_res;
protected:
SpatialDomains::TriGeomMap m_triMap;
SpatialDomains::QuadGeomMap m_quadMap;
public:
RTree m_rtree;
HandleNekMesh3D( LibUtilities::SessionReaderSharedPtr sessionPtr,bool useRTree = true):HandleNekMesh(sessionPtr)
{
m_useRTree=useRTree; // The default is to use Nektar ID scan. Change to true for Rtrees
m_triMap = m_graph->GetAllTriGeoms();
m_quadMap = m_graph->GetAllQuadGeoms();
cout<<"RTREES ? "<<boolalpha<<m_useRTree<<endl;
}
vector< Array<OneD,NekDouble> > m_Arrays;
// function using RTree
protected:
virtual bool v_GetBreakPts( const Array<OneD,NekDouble> point,Array<OneD,NekDouble> &direction, const NekDouble tmin, const NekDouble tmax, vector<NekDouble> &tPos );
virtual bool v_LoadData(string Filename, vector<string> &variables);
virtual bool v_LoadMesh(string var);
private:
bool IntersectWithFaces( const Array<OneD,NekDouble> &dir, const Array<OneD,NekDouble> &point,
const NekDouble t1, const NekDouble t2, vector<NekDouble> &tvalT );
void PlaneEquationOfFace( const SpatialDomains::GeometrySharedPtr geomEl,
NekDouble &a, NekDouble &b, NekDouble &c, NekDouble &d);
void IntersectLineSegWithFace( const SpatialDomains::GeometrySharedPtr geomEl,
const Array<OneD,NekDouble> &dir, const Array<OneD,NekDouble> &point, const NekDouble t1,
const NekDouble t2, vector<NekDouble> &tvalT );
// functions used by RTree
void BoundingBoxOfLineSeg( const Array<OneD,NekDouble> &dir,
const Array<OneD,NekDouble> &pt, const NekDouble t1, const NekDouble t2,
RBox &b );
bool IntersectWithFacesUsingRTree( const Array<OneD,NekDouble> &dir, const Array<OneD,NekDouble> &point,
const NekDouble t1, const NekDouble t2, vector<NekDouble> &tvalT );
void IntersectWithBoxUsingRTree(Array<OneD,NekDouble> &minCorner,Array<OneD,NekDouble> maxCorner,
vector<int> &elIds, vector<int> &glIds);
inline virtual bool v_intersect( Array<OneD,NekDouble> &p1, Array<OneD,NekDouble> &p2,
Array<OneD,NekDouble> &q1, Array<OneD,NekDouble> &q2,
Array<OneD,NekDouble>&i1, vector<NekDouble>&i2 )
{
return threeD_intersect(p1,p2,q1,q2,i1,i2);
}
virtual int v_GetExpansionIndexUsingRTree( const Array<OneD,NekDouble> &point);
void GetBoundingOfElement(SpatialDomains::GeometrySharedPtr elGeom, RBox &b);
void LoadExpListIntoRTree();
void FindElementIDForLineSegs(const vector<NekDouble> &tvalT,
const Array<OneD,NekDouble> &point,
const Array<OneD,NekDouble> &dir,
const SpatialDomains::MeshGraphSharedPtr mesh_graph,
vector<int> &EIDs );
};
}
}
#endif
......@@ -7,7 +7,7 @@
#define TOLERENCE 1e-8
#define TOLERENCE_MESH_COMP 1e-16
#define TTOL 1.e-13
#define PTTOL 1.e-6
#define PTTOL 1.e-7
#include <LibUtilities/Memory/NekMemoryManager.hpp>
#include <LibUtilities/BasicUtils/SessionReader.h>
#include <LibUtilities/LinearAlgebra/Lapack.hpp>
......@@ -20,30 +20,36 @@
using namespace std;
namespace Nektar
{
namespace LSIAC
{
/// This class help import all nektar base classes.
class NektarBaseClass{
private:
protected:
public:
void printNekArray(const Array<OneD,NekDouble> &ar,int del)const;
void printNekArray(const vector<NekDouble> &ar,int del) const;
void printNekArray(const vector<int> &ar,int del) const;
void writeNekArray(vector<int> &ar,string filename) const;
void writeNekArray(vector<NekDouble> &ar, string filename) const;
void writeNekArray(Array<OneD,NekDouble> &ar, string filename) const;
// void readNekArray(vector<NekDouble> &ar, string filename) const;
void readNekArray(Array<OneD,NekDouble> &ar, string filename) const;
void printGraphArray(const Array<OneD,NekDouble> &test,NekDouble down, NekDouble up,NekDouble increment=1.0)const;
};
}
}
{
namespace LSIAC
{
/// This class help import all nektar base classes.
class NektarBaseClass{
public:
const int threeD=3;
const int twoD=2;
const int eX=0;
const int eY=1;
const int eZ=2;
private:
protected:
void printNekArray(const Array<OneD,NekDouble> &ar,int del)const;
void printNekArray(const vector<NekDouble> &ar,int del) const;
void printNekArray(const vector<int> &ar,int del) const;
void writeNekArray(vector<int> &ar,string filename) const;
void writeNekArray(vector<NekDouble> &ar, string filename) const;
void writeNekArray(Array<OneD,NekDouble> &ar, string filename) const;
// void readNekArray(vector<NekDouble> &ar, string filename) const;
void readNekArray(Array<OneD,NekDouble> &ar, string filename) const;
void printGraphArray(const Array<OneD,NekDouble> &test,NekDouble down, NekDouble up,NekDouble increment=1.0)const;
};