Commit 27a6ee0c authored by Julia Docampo Sanchez's avatar Julia Docampo Sanchez

compiling version: TP FILTERS and 2D LINE FILTER

parent e77133a4
SET(LibrarySubDirs FieldUtils GlobalMapping LibUtilities LocalRegions
Collections MultiRegions SpatialDomains StdRegions LSIAC LSIAC2D)
Collections MultiRegions SpatialDomains StdRegions TPSIAC LSIAC)
SET(UnitTestSubDirs UnitTests)
SET(DemoSubDirs Demos)
SET(TimingsSubDirs Timings)
......
......@@ -3,7 +3,7 @@
#include <iostream>
#include <vector>
#include "NektarBaseClass.h"
#include "LSIACPostProcessor.h"
using namespace std;
/// This class is the base class for all the B-Splines.
......@@ -17,7 +17,7 @@ namespace LSIAC
{
class BSplines: public NektarBaseClass{
class BSplines: public LSIACPostProcessor{
protected:
public:
};
......
SET(LSIACHeaders
NektarBaseClass.h
BSplines.h
FilterType.h
LSIACPostProcessor.h
SIACenumerators.h
GeneralBSplines.h
CentralBSplines.h
SIACFilter.h
SymmetricSIAC.h
OneSidedSIAC.h
SIACKernel.h
SymmetricKernel.h
OneSidedKernel.h
HandleMesh.h
HandleNekMesh.h
HandleNekMesh1D.h
HandleNekMesh2D.h
HandleNekMesh3D.h
Smoothie.h
SmoothieSIAC.h
SmoothieSIAC1D.h
SmoothieSIAC2D.h
SmoothieSIAC3D.h
element_centre_size.h
SIACpostprocessor.h
SIACFilter.h
SIACFilter1D.h
SIACFilter2D.h
SIACFilter3D.h
)
SET(LSIACSources
NektarBaseClass.cpp
fieldDerivatives.cpp
LSIACPostProcessor.cpp
GeneralBSplines.cpp
CentralBSplines.cpp
SIACFilter.cpp
SymmetricSIAC.cpp
OneSidedSIAC.cpp
SIACKernel.cpp
SymmetricKernel.cpp
OneSidedKernel.cpp
HandleNekMesh.cpp
HandleNekMesh1D.cpp
HandleNekMesh2D.cpp
HandleNekMesh3D.cpp
SmoothieSIAC.cpp
SmoothieSIAC1D.cpp
SmoothieSIAC2D.cpp
SmoothieSIAC3D.cpp
SIACFilter.cpp
SIACFilter1D.cpp
SIACFilter2D.cpp
SIACFilter3D.cpp
ppio.cpp
)
ADD_NEKTAR_LIBRARY(LSIAC lib ${NEKTAR_LIBRARY_TYPE} ${LSIACSources} ${LSIACHeaders})
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 3.0.1, 2017-07-05T11:26:18. -->
<qtcreator>
<data>
<variable>ProjectExplorer.Project.ActiveTarget</variable>
<value type="int">-1</value>
</data>
<data>
<variable>ProjectExplorer.Project.EditorSettings</variable>
<valuemap type="QVariantMap">
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
<value type="QString" key="language">Cpp</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
</valuemap>
</valuemap>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
<value type="QString" key="language">QmlJS</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
</valuemap>
</valuemap>
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
<value type="int" key="EditorConfiguration.IndentSize">4</value>
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">1</value>
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
<value type="int" key="EditorConfiguration.TabKeyBehavior">2</value>
<value type="int" key="EditorConfiguration.TabSize">8</value>
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.PluginSettings</variable>
<valuemap type="QVariantMap"/>
</data>
<data>
<variable>ProjectExplorer.Project.TargetCount</variable>
<value type="int">0</value>
</data>
<data>
<variable>ProjectExplorer.Project.Updater.EnvironmentId</variable>
<value type="QByteArray">{a578d475-18b0-40f9-843f-5eee755f73a3}</value>
</data>
<data>
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
<value type="int">15</value>
</data>
</qtcreator>
#ifndef FILTERTYPE_H
#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, /// 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
......@@ -4,7 +4,7 @@
#include <iostream>
#include <vector>
#include <string>
#include "NektarBaseClass.h"
#include "LSIACPostProcessor.h"
using namespace std;
......@@ -19,20 +19,10 @@ namespace Nektar
namespace LSIAC
{
class HandleMesh: public NektarBaseClass{
class HandleMesh: public LSIACPostProcessor{
public:
protected:
};
}
......
This diff is collapsed.
This diff is collapsed.
......@@ -20,11 +20,6 @@ namespace Nektar
{
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:
......
This diff is collapsed.
......@@ -15,42 +15,42 @@
#include <boost/any.hpp>
namespace Nektar
{
namespace LSIAC
{
class HandleNekMesh2D;
typedef boost::shared_ptr<HandleNekMesh2D> HandleNekMesh2DSharedPtr;
class HandleNekMesh2D: public HandleNekMesh
{
{
namespace LSIAC
{
class HandleNekMesh2D;
typedef boost::shared_ptr<HandleNekMesh2D> HandleNekMesh2DSharedPtr;
class HandleNekMesh2D: public HandleNekMesh
{
private:
protected:
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);
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.
......@@ -4,91 +4,91 @@
#include "HandleNekMesh.h"
namespace Nektar
{
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 );
};
}
}
{
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
#include "LSIACPostProcessor.h"
#include <iomanip>
#include <sstream>
namespace Nektar
{
namespace LSIAC
{
void LSIACPostProcessor::DeriveExpansion(SpatialDomains::MeshGraphSharedPtr mesh, LibUtilities::SessionReaderSharedPtr vSession,
int num_modesX,int num_modesY,
Array<OneD,NekDouble> fielddata,
MultiRegions::ExpListSharedPtr &Exp)
{
int num_pointsX= Exp->GetExp(0)->GetBasis(0)->GetNumPoints();
int num_pointsY= Exp->GetExp(0)->GetBasis(1)->GetNumPoints();
const LibUtilities::PointsKey PkeyT1(num_pointsX,Exp->GetExp(0)->GetPointsType(0));
const LibUtilities::PointsKey PkeyT2(num_pointsY,Exp->GetExp(1)->GetPointsType(0));
const LibUtilities::PointsKey PkeyQ1(num_pointsX,Exp->GetExp(0)->GetPointsType(1));
const LibUtilities::PointsKey PkeyQ2(num_pointsY,Exp->GetExp(1)->GetPointsType(1));
const LibUtilities::BasisKey BkeyT1(Exp->GetExp(0)->GetBasisType(0),num_modesX,PkeyT1);
const LibUtilities::BasisKey BkeyT2(Exp->GetExp(0)->GetBasisType(1),num_modesY,PkeyT2);
const LibUtilities::BasisKey BkeyQ1(Exp->GetExp(0)->GetBasisType(0),num_modesX,PkeyQ1);
const LibUtilities::BasisKey BkeyQ2(Exp->GetExp(0)->GetBasisType(1),num_modesY,PkeyQ2);
Exp = MemoryManager<MultiRegions::ExpList2D>::AllocateSharedPtr(vSession,BkeyT1,BkeyT2,BkeyQ1,BkeyQ2,mesh);
// We will create Exp using the original field modes (in HNM->m_expansions) but with the quadrature points from the target expansion. this is to evaluate the field derivatives quickly.
Exp->FwdTrans(fielddata,Exp->UpdateCoeffs() );
Exp->BwdTrans( Exp->GetCoeffs(),Exp->UpdatePhys());
}
void LSIACPostProcessor::DeriveExpansion(SpatialDomains::MeshGraphSharedPtr mesh, LibUtilities::SessionReaderSharedPtr vSession,
int num_modesX,int num_modesY,int num_modesZ,
Array<OneD,NekDouble> fielddata,
MultiRegions::ExpListSharedPtr &Exp)
{
int num_pointsX=Exp->GetExp(0)->GetBasis(0)->GetNumPoints();
int num_pointsY=Exp->GetExp(0)->GetBasis(1)->GetNumPoints();
int num_pointsZ=Exp->GetExp(0)->GetBasis(2)->GetNumPoints();
const LibUtilities::PointsKey PkeyT1(num_pointsX,Exp->GetExp(0)->GetPointsType(0));
const LibUtilities::PointsKey PkeyT2(num_pointsY,Exp->GetExp(1)->GetPointsType(0));
const LibUtilities::PointsKey PkeyT3(num_pointsZ,Exp->GetExp(2)->GetPointsType(0));
const LibUtilities::PointsKey PkeyQ1(num_pointsX,Exp->GetExp(0)->GetPointsType(1));
const LibUtilities::PointsKey PkeyQ2(num_pointsY,Exp->GetExp(1)->GetPointsType(1));
const LibUtilities::PointsKey PkeyQ3(num_pointsZ,Exp->GetExp(2)->GetPointsType(1));
const LibUtilities::BasisKey BkeyT1(Exp->GetExp(0)->GetBasisType(0),num_modesX,PkeyT1);
const LibUtilities::BasisKey BkeyT2(Exp->GetExp(0)->GetBasisType(1),num_modesY,PkeyT2);
const LibUtilities::BasisKey BkeyT3(Exp->GetExp(0)->GetBasisType(2),num_modesZ,PkeyT3);
const LibUtilities::BasisKey BkeyQ1(Exp->GetExp(0)->GetBasisType(0),num_modesX,PkeyQ1);
const LibUtilities::BasisKey BkeyQ2(Exp->GetExp(0)->GetBasisType(1),num_modesY,PkeyQ2);
const LibUtilities::BasisKey BkeyQ3(Exp->GetExp(0)->GetBasisType(2),num_modesZ,PkeyQ3);
Exp = MemoryManager<MultiRegions::ExpList3D>::AllocateSharedPtr(vSession,BkeyT1,BkeyT2,BkeyT3,BkeyQ1,BkeyQ2,BkeyQ3,mesh);
// We will create Exp using the original field modes (in HNM->m_expansions) but with the quadrature points from the target expansion. this is to evaluate the field derivatives quickly.