Nektar++
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
Public Member Functions | Public Attributes | Protected Member Functions | Protected Attributes | List of all members
Nektar::MultiRegions::DisContField2D Class Reference

#include <DisContField2D.h>

Inheritance diagram for Nektar::MultiRegions::DisContField2D:
Inheritance graph
[legend]
Collaboration diagram for Nektar::MultiRegions::DisContField2D:
Collaboration graph
[legend]

Public Member Functions

 DisContField2D ()
 Default constructor. More...
 
 DisContField2D (const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &graph2D, const std::string &variable, const bool SetUpJustDG=true, const bool DeclareCoeffPhysArrays=true)
 Constructs a global discontinuous field based on an input mesh with boundary conditions. More...
 
 DisContField2D (const DisContField2D &In, const SpatialDomains::MeshGraphSharedPtr &graph2D, const std::string &variable, const bool SetUpJustDG=false, const bool DeclareCoeffPhysArrays=true)
 
 DisContField2D (const DisContField2D &In, const bool DeclareCoeffPhysArrays=true)
 
virtual ~DisContField2D ()
 Default destructor. More...
 
GlobalLinSysSharedPtr GetGlobalBndLinSys (const GlobalLinSysKey &mkey)
 
NekDouble L2_DGDeriv (const int dir, const Array< OneD, const NekDouble > &soln)
 Calculate the $ L^2 $ error of the $ Q_{\rm dir} $ derivative using the consistent DG evaluation of $ Q_{\rm dir} $. More...
 
void EvaluateHDGPostProcessing (Array< OneD, NekDouble > &outarray)
 Evaluate HDG post-processing to increase polynomial order of solution. More...
 
virtual ExpListSharedPtrv_GetTrace ()
 
- Public Member Functions inherited from Nektar::MultiRegions::ExpList2D
 ExpList2D ()
 Default constructor. More...
 
 ExpList2D (const ExpList2D &In, const bool DeclareCoeffPhysArrays=true)
 Copy constructor. More...
 
 ExpList2D (const ExpList2D &In, const std::vector< unsigned int > &eIDs, const bool DeclareCoeffPhysArrays=true)
 Constructor copying only elements defined in eIds. More...
 
 ExpList2D (const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &graph2D, const bool DelcareCoeffPhysArrays=true, const std::string &var="DefaultVar")
 Sets up a list of local expansions based on an input mesh. More...
 
 ExpList2D (const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::ExpansionMap &expansions, const bool DeclareCoeffPhysArrays=true)
 Sets up a list of local expansions based on an expansion Map. More...
 
 ExpList2D (const LibUtilities::SessionReaderSharedPtr &pSession, const LibUtilities::BasisKey &TriBa, const LibUtilities::BasisKey &TriBb, const LibUtilities::BasisKey &QuadBa, const LibUtilities::BasisKey &QuadBb, const SpatialDomains::MeshGraphSharedPtr &graph2D, const LibUtilities::PointsType TriNb=LibUtilities::SIZE_PointsType)
 Sets up a list of local expansions based on an input mesh and separately defined basiskeys. More...
 
 ExpList2D (const LibUtilities::SessionReaderSharedPtr &pSession, const Array< OneD, const ExpListSharedPtr > &bndConstraint, const Array< OneD, const SpatialDomains::BoundaryConditionShPtr > &bndCond, const LocalRegions::ExpansionVector &locexp, const SpatialDomains::MeshGraphSharedPtr &graph3D, const PeriodicMap &periodicFaces, const bool DeclareCoeffPhysArrays=true, const std::string variable="DefaultVar")
 
 ExpList2D (const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::CompositeMap &domain, const SpatialDomains::MeshGraphSharedPtr &graph3D, const std::string variable="DefaultVar")
 Specialised constructor for Neumann boundary conditions in DisContField3D and ContField3D. More...
 
virtual ~ExpList2D ()
 Destructor. More...
 
- Public Member Functions inherited from Nektar::MultiRegions::ExpList
 ExpList ()
 The default constructor. More...
 
 ExpList (const LibUtilities::SessionReaderSharedPtr &pSession)
 The default constructor. More...
 
 ExpList (const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &pGraph)
 The default constructor. More...
 
 ExpList (const ExpList &in, const std::vector< unsigned int > &eIDs, const bool DeclareCoeffPhysArrays=true)
 Constructor copying only elements defined in eIds. More...
 
 ExpList (const ExpList &in, const bool DeclareCoeffPhysArrays=true)
 The copy constructor. More...
 
virtual ~ExpList ()
 The default destructor. More...
 
int GetNcoeffs (void) const
 Returns the total number of local degrees of freedom $N_{\mathrm{eof}}=\sum_{e=1}^{{N_{\mathrm{el}}}}N^{e}_m$. More...
 
int GetNcoeffs (const int eid) const
 Returns the total number of local degrees of freedom for element eid. More...
 
ExpansionType GetExpType (void)
 Returns the type of the expansion. More...
 
void SetExpType (ExpansionType Type)
 Returns the type of the expansion. More...
 
int EvalBasisNumModesMax (void) const
 Evaulates the maximum number of modes in the elemental basis order over all elements. More...
 
const Array< OneD, int > EvalBasisNumModesMaxPerExp (void) const
 Returns the vector of the number of modes in the elemental basis order over all elements. More...
 
int GetTotPoints (void) const
 Returns the total number of quadrature points m_npoints $=Q_{\mathrm{tot}}$. More...
 
int GetTotPoints (const int eid) const
 Returns the total number of quadrature points for eid's element $=Q_{\mathrm{tot}}$. More...
 
int GetNpoints (void) const
 Returns the total number of quadrature points m_npoints $=Q_{\mathrm{tot}}$. More...
 
int Get1DScaledTotPoints (const NekDouble scale) const
 Returns the total number of qudature points scaled by the factor scale on each 1D direction. More...
 
void SetWaveSpace (const bool wavespace)
 Sets the wave space to the one of the possible configuration true or false. More...
 
void SetModifiedBasis (const bool modbasis)
 Set Modified Basis for the stability analysis. More...
 
void SetPhys (int i, NekDouble val)
 Set the i th value of m_phys to value val. More...
 
bool GetWaveSpace (void) const
 This function returns the third direction expansion condition, which can be in wave space (coefficient) or not It is stored in the variable m_WaveSpace. More...
 
void SetPhys (const Array< OneD, const NekDouble > &inarray)
 Fills the array m_phys. More...
 
void SetPhysArray (Array< OneD, NekDouble > &inarray)
 Sets the array m_phys. More...
 
void SetPhysState (const bool physState)
 This function manually sets whether the array of physical values $\boldsymbol{u}_l$ (implemented as m_phys) is filled or not. More...
 
bool GetPhysState (void) const
 This function indicates whether the array of physical values $\boldsymbol{u}_l$ (implemented as m_phys) is filled or not. More...
 
NekDouble PhysIntegral (void)
 This function integrates a function $f(\boldsymbol{x})$ over the domain consisting of all the elements of the expansion. More...
 
NekDouble PhysIntegral (const Array< OneD, const NekDouble > &inarray)
 This function integrates a function $f(\boldsymbol{x})$ over the domain consisting of all the elements of the expansion. More...
 
void IProductWRTBase_IterPerExp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 This function calculates the inner product of a function $f(\boldsymbol{x})$ with respect to all {local} expansion modes $\phi_n^e(\boldsymbol{x})$. More...
 
void IProductWRTBase (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, CoeffState coeffstate=eLocal)
 
void IProductWRTDerivBase (const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 This function calculates the inner product of a function $f(\boldsymbol{x})$ with respect to the derivative (in direction. More...
 
void IProductWRTDerivBase (const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, NekDouble > &outarray)
 This function calculates the inner product of a function $f(\boldsymbol{x})$ with respect to the derivative (in direction. More...
 
void FwdTrans_IterPerExp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 This function elementally evaluates the forward transformation of a function $u(\boldsymbol{x})$ onto the global spectral/hp expansion. More...
 
void FwdTrans (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, CoeffState coeffstate=eLocal)
 
void MultiplyByElmtInvMass (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 This function elementally mulplies the coefficient space of Sin my the elemental inverse of the mass matrix. More...
 
void MultiplyByInvMassMatrix (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, CoeffState coeffstate=eLocal)
 
void SmoothField (Array< OneD, NekDouble > &field)
 Smooth a field across elements. More...
 
void HelmSolve (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const FlagList &flags, const StdRegions::ConstFactorMap &factors, const StdRegions::VarCoeffMap &varcoeff=StdRegions::NullVarCoeffMap, const Array< OneD, const NekDouble > &dirForcing=NullNekDouble1DArray, const bool PhysSpaceForcing=true)
 Solve helmholtz problem. More...
 
void LinearAdvectionDiffusionReactionSolve (const Array< OneD, Array< OneD, NekDouble > > &velocity, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const NekDouble lambda, CoeffState coeffstate=eLocal, const Array< OneD, const NekDouble > &dirForcing=NullNekDouble1DArray)
 Solve Advection Diffusion Reaction. More...
 
void LinearAdvectionReactionSolve (const Array< OneD, Array< OneD, NekDouble > > &velocity, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const NekDouble lambda, CoeffState coeffstate=eLocal, const Array< OneD, const NekDouble > &dirForcing=NullNekDouble1DArray)
 Solve Advection Diffusion Reaction. More...
 
void FwdTrans_BndConstrained (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
void BwdTrans_IterPerExp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 This function elementally evaluates the backward transformation of the global spectral/hp element expansion. More...
 
void BwdTrans (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, CoeffState coeffstate=eLocal)
 
void GetCoords (Array< OneD, NekDouble > &coord_0, Array< OneD, NekDouble > &coord_1=NullNekDouble1DArray, Array< OneD, NekDouble > &coord_2=NullNekDouble1DArray)
 This function calculates the coordinates of all the elemental quadrature points $\boldsymbol{x}_i$. More...
 
void HomogeneousFwdTrans (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, CoeffState coeffstate=eLocal, bool Shuff=true, bool UnShuff=true)
 
void HomogeneousBwdTrans (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, CoeffState coeffstate=eLocal, bool Shuff=true, bool UnShuff=true)
 
void DealiasedProd (const Array< OneD, NekDouble > &inarray1, const Array< OneD, NekDouble > &inarray2, Array< OneD, NekDouble > &outarray, CoeffState coeffstate=eLocal)
 
void DealiasedDotProd (const Array< OneD, Array< OneD, NekDouble > > &inarray1, const Array< OneD, Array< OneD, NekDouble > > &inarray2, Array< OneD, Array< OneD, NekDouble > > &outarray, CoeffState coeffstate=eLocal)
 
void GetBCValues (Array< OneD, NekDouble > &BndVals, const Array< OneD, NekDouble > &TotField, int BndID)
 
void NormVectorIProductWRTBase (Array< OneD, const NekDouble > &V1, Array< OneD, const NekDouble > &V2, Array< OneD, NekDouble > &outarray, int BndID)
 
void NormVectorIProductWRTBase (Array< OneD, Array< OneD, NekDouble > > &V, Array< OneD, NekDouble > &outarray)
 
void ApplyGeomInfo ()
 Apply geometry information to each expansion. More...
 
void Reset ()
 Reset geometry information and reset matrices. More...
 
void WriteTecplotHeader (std::ostream &outfile, std::string var="")
 
void WriteTecplotZone (std::ostream &outfile, int expansion=-1)
 
void WriteTecplotField (std::ostream &outfile, int expansion=-1)
 
void WriteTecplotConnectivity (std::ostream &outfile, int expansion=-1)
 
void WriteVtkHeader (std::ostream &outfile)
 
void WriteVtkFooter (std::ostream &outfile)
 
void WriteVtkPieceHeader (std::ostream &outfile, int expansion, int istrip=0)
 
void WriteVtkPieceFooter (std::ostream &outfile, int expansion)
 
void WriteVtkPieceData (std::ostream &outfile, int expansion, std::string var="v")
 
int GetCoordim (int eid)
 This function returns the dimension of the coordinates of the element eid. More...
 
void SetCoeff (int i, NekDouble val)
 Set the i th coefficiient in m_coeffs to value val. More...
 
void SetCoeffs (int i, NekDouble val)
 Set the i th coefficiient in m_coeffs to value val. More...
 
void SetCoeffsArray (Array< OneD, NekDouble > &inarray)
 Set the m_coeffs array to inarray. More...
 
const Array< OneD, const
NekDouble > & 
GetCoeffs () const
 This function returns (a reference to) the array $\boldsymbol{\hat{u}}_l$ (implemented as m_coeffs) containing all local expansion coefficients. More...
 
void ImposeDirichletConditions (Array< OneD, NekDouble > &outarray)
 Impose Dirichlet Boundary Conditions onto Array. More...
 
void FillBndCondFromField (void)
 Fill Bnd Condition expansion from the values stored in expansion. More...
 
void FillBndCondFromField (const int nreg)
 Fill Bnd Condition expansion in nreg from the values stored in expansion. More...
 
void LocalToGlobal (bool useComm=true)
 Gathers the global coefficients $\boldsymbol{\hat{u}}_g$ from the local coefficients $\boldsymbol{\hat{u}}_l$. More...
 
void LocalToGlobal (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool useComm=true)
 
void GlobalToLocal (void)
 Scatters from the global coefficients $\boldsymbol{\hat{u}}_g$ to the local coefficients $\boldsymbol{\hat{u}}_l$. More...
 
void GlobalToLocal (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
NekDouble GetCoeff (int i)
 Get the i th value (coefficient) of m_coeffs. More...
 
NekDouble GetCoeffs (int i)
 Get the i th value (coefficient) of m_coeffs. More...
 
const Array< OneD, const
NekDouble > & 
GetPhys () const
 This function returns (a reference to) the array $\boldsymbol{u}_l$ (implemented as m_phys) containing the function $u^{\delta}(\boldsymbol{x})$ evaluated at the quadrature points. More...
 
NekDouble Linf (const Array< OneD, const NekDouble > &inarray, const Array< OneD, const NekDouble > &soln=NullNekDouble1DArray)
 This function calculates the $L_\infty$ error of the global spectral/hp element approximation. More...
 
NekDouble L2 (const Array< OneD, const NekDouble > &inarray, const Array< OneD, const NekDouble > &soln=NullNekDouble1DArray)
 This function calculates the $L_2$ error with respect to soln of the global spectral/hp element approximation. More...
 
NekDouble H1 (const Array< OneD, const NekDouble > &inarray, const Array< OneD, const NekDouble > &soln=NullNekDouble1DArray)
 Calculates the $H^1$ error of the global spectral/hp element approximation. More...
 
NekDouble Integral (const Array< OneD, const NekDouble > &inarray)
 
Array< OneD, const NekDoubleHomogeneousEnergy (void)
 This function calculates the energy associated with each one of the modesof a 3D homogeneous nD expansion. More...
 
void SetHomo1DSpecVanVisc (Array< OneD, NekDouble > visc)
 This function sets the Spectral Vanishing Viscosity in homogeneous1D expansion. More...
 
Array< OneD, const unsigned int > GetZIDs (void)
 This function returns a vector containing the wave numbers in z-direction associated with the 3D homogenous expansion. Required if a parellelisation is applied in the Fourier direction. More...
 
LibUtilities::TranspositionSharedPtr GetTransposition (void)
 This function returns the transposition class associaed with the homogeneous expansion. More...
 
NekDouble GetHomoLen (void)
 This function returns the Width of homogeneous direction associaed with the homogeneous expansion. More...
 
Array< OneD, const unsigned int > GetYIDs (void)
 This function returns a vector containing the wave numbers in y-direction associated with the 3D homogenous expansion. Required if a parellelisation is applied in the Fourier direction. More...
 
void PhysInterp1DScaled (const NekDouble scale, const Array< OneD, NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 This function interpolates the physical space points in inarray to outarray using the same points defined in the expansion but where the number of points are rescaled by 1DScale. More...
 
void PhysGalerkinProjection1DScaled (const NekDouble scale, const Array< OneD, NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 This function Galerkin projects the physical space points in inarray to outarray where inarray is assumed to be defined in the expansion but where the number of points are rescaled by 1DScale. More...
 
int GetExpSize (void)
 This function returns the number of elements in the expansion. More...
 
int GetNumElmts (void)
 This function returns the number of elements in the expansion which may be different for a homogeoenous extended expansionp. More...
 
const boost::shared_ptr
< LocalRegions::ExpansionVector
GetExp () const
 This function returns the vector of elements in the expansion. More...
 
LocalRegions::ExpansionSharedPtrGetExp (int n) const
 This function returns (a shared pointer to) the local elemental expansion of the $n^{\mathrm{th}}$ element. More...
 
LocalRegions::ExpansionSharedPtrGetExp (const Array< OneD, const NekDouble > &gloCoord)
 This function returns (a shared pointer to) the local elemental expansion containing the arbitrary point given by gloCoord. More...
 
int GetExpIndex (const Array< OneD, const NekDouble > &gloCoord, NekDouble tol=0.0, bool returnNearestElmt=false)
 
int GetExpIndex (const Array< OneD, const NekDouble > &gloCoords, Array< OneD, NekDouble > &locCoords, NekDouble tol=0.0, bool returnNearestElmt=false)
 
int GetCoeff_Offset (int n) const
 Get the start offset position for a global list of m_coeffs correspoinding to element n. More...
 
int GetPhys_Offset (int n) const
 Get the start offset position for a global list of m_phys correspoinding to element n. More...
 
int GetOffset_Elmt_Id (int n) const
 Get the element id associated with the n th consecutive block of data in m_phys and m_coeffs. More...
 
Array< OneD, NekDouble > & UpdateCoeffs ()
 This function returns (a reference to) the array $\boldsymbol{\hat{u}}_l$ (implemented as m_coeffs) containing all local expansion coefficients. More...
 
Array< OneD, NekDouble > & UpdatePhys ()
 This function returns (a reference to) the array $\boldsymbol{u}_l$ (implemented as m_phys) containing the function $u^{\delta}(\boldsymbol{x})$ evaluated at the quadrature points. More...
 
void PhysDeriv (Direction edir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d)
 
void PhysDeriv (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1=NullNekDouble1DArray, Array< OneD, NekDouble > &out_d2=NullNekDouble1DArray)
 This function discretely evaluates the derivative of a function $f(\boldsymbol{x})$ on the domain consisting of all elements of the expansion. More...
 
void PhysDeriv (const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d)
 
void CurlCurl (Array< OneD, Array< OneD, NekDouble > > &Vel, Array< OneD, Array< OneD, NekDouble > > &Q)
 
const Array< OneD, const
boost::shared_ptr< ExpList > > & 
GetBndCondExpansions ()
 
boost::shared_ptr< ExpList > & UpdateBndCondExpansion (int i)
 
void Upwind (const Array< OneD, const Array< OneD, NekDouble > > &Vec, const Array< OneD, const NekDouble > &Fwd, const Array< OneD, const NekDouble > &Bwd, Array< OneD, NekDouble > &Upwind)
 
void Upwind (const Array< OneD, const NekDouble > &Vn, const Array< OneD, const NekDouble > &Fwd, const Array< OneD, const NekDouble > &Bwd, Array< OneD, NekDouble > &Upwind)
 
boost::shared_ptr< ExpList > & GetTrace ()
 
boost::shared_ptr
< AssemblyMapDG > & 
GetTraceMap (void)
 
const Array< OneD, const int > & GetTraceBndMap (void)
 
void GetNormals (Array< OneD, Array< OneD, NekDouble > > &normals)
 
void AddTraceIntegral (const Array< OneD, const NekDouble > &Fx, const Array< OneD, const NekDouble > &Fy, Array< OneD, NekDouble > &outarray)
 
void AddTraceIntegral (const Array< OneD, const NekDouble > &Fn, Array< OneD, NekDouble > &outarray)
 
void AddFwdBwdTraceIntegral (const Array< OneD, const NekDouble > &Fwd, const Array< OneD, const NekDouble > &Bwd, Array< OneD, NekDouble > &outarray)
 
void GetFwdBwdTracePhys (Array< OneD, NekDouble > &Fwd, Array< OneD, NekDouble > &Bwd)
 
void GetFwdBwdTracePhys (const Array< OneD, const NekDouble > &field, Array< OneD, NekDouble > &Fwd, Array< OneD, NekDouble > &Bwd)
 
const std::vector< bool > & GetLeftAdjacentFaces (void) const
 
void ExtractTracePhys (Array< OneD, NekDouble > &outarray)
 
void ExtractTracePhys (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
const Array< OneD, const
SpatialDomains::BoundaryConditionShPtr > & 
GetBndConditions ()
 
Array< OneD,
SpatialDomains::BoundaryConditionShPtr > & 
UpdateBndConditions ()
 
void EvaluateBoundaryConditions (const NekDouble time=0.0, const std::string varName="", const NekDouble=NekConstants::kNekUnsetDouble, const NekDouble=NekConstants::kNekUnsetDouble)
 
void GeneralMatrixOp (const GlobalMatrixKey &gkey, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, CoeffState coeffstate=eLocal)
 This function calculates the result of the multiplication of a matrix of type specified by mkey with a vector given by inarray. More...
 
void GeneralMatrixOp_IterPerExp (const GlobalMatrixKey &gkey, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
void SetUpPhysNormals ()
 
void GetBoundaryToElmtMap (Array< OneD, int > &ElmtID, Array< OneD, int > &EdgeID)
 
void GetBndElmtExpansion (int i, boost::shared_ptr< ExpList > &result, const bool DeclareCoeffPhysArrays=true)
 
void ExtractElmtToBndPhys (int i, Array< OneD, NekDouble > &elmt, Array< OneD, NekDouble > &boundary)
 
void ExtractPhysToBndElmt (int i, const Array< OneD, const NekDouble > &phys, Array< OneD, NekDouble > &bndElmt)
 
void ExtractPhysToBnd (int i, const Array< OneD, const NekDouble > &phys, Array< OneD, NekDouble > &bnd)
 
void GetBoundaryNormals (int i, Array< OneD, Array< OneD, NekDouble > > &normals)
 
void GeneralGetFieldDefinitions (std::vector< LibUtilities::FieldDefinitionsSharedPtr > &fielddef, int NumHomoDir=0, Array< OneD, LibUtilities::BasisSharedPtr > &HomoBasis=LibUtilities::NullBasisSharedPtr1DArray, std::vector< NekDouble > &HomoLen=LibUtilities::NullNekDoubleVector, bool homoStrips=false, std::vector< unsigned int > &HomoSIDs=LibUtilities::NullUnsignedIntVector, std::vector< unsigned int > &HomoZIDs=LibUtilities::NullUnsignedIntVector, std::vector< unsigned int > &HomoYIDs=LibUtilities::NullUnsignedIntVector)
 
const
NekOptimize::GlobalOptParamSharedPtr
GetGlobalOptParam (void)
 
std::map< int,
RobinBCInfoSharedPtr
GetRobinBCInfo ()
 
void GetPeriodicEntities (PeriodicMap &periodicVerts, PeriodicMap &periodicEdges, PeriodicMap &periodicFaces=NullPeriodicMap)
 
std::vector
< LibUtilities::FieldDefinitionsSharedPtr
GetFieldDefinitions ()
 
void GetFieldDefinitions (std::vector< LibUtilities::FieldDefinitionsSharedPtr > &fielddef)
 
void AppendFieldData (LibUtilities::FieldDefinitionsSharedPtr &fielddef, std::vector< NekDouble > &fielddata)
 Append the element data listed in elements fielddef->m_ElementIDs onto fielddata. More...
 
void AppendFieldData (LibUtilities::FieldDefinitionsSharedPtr &fielddef, std::vector< NekDouble > &fielddata, Array< OneD, NekDouble > &coeffs)
 Append the data in coeffs listed in elements fielddef->m_ElementIDs onto fielddata. More...
 
void ExtractElmtDataToCoeffs (LibUtilities::FieldDefinitionsSharedPtr &fielddef, std::vector< NekDouble > &fielddata, std::string &field, Array< OneD, NekDouble > &coeffs)
 Extract the data in fielddata into the coeffs using the basic ExpList Elemental expansions rather than planes in homogeneous case. More...
 
void ExtractCoeffsToCoeffs (const boost::shared_ptr< ExpList > &fromExpList, const Array< OneD, const NekDouble > &fromCoeffs, Array< OneD, NekDouble > &toCoeffs)
 Extract the data from fromField using fromExpList the coeffs using the basic ExpList Elemental expansions rather than planes in homogeneous case. More...
 
void ExtractDataToCoeffs (LibUtilities::FieldDefinitionsSharedPtr &fielddef, std::vector< NekDouble > &fielddata, std::string &field, Array< OneD, NekDouble > &coeffs)
 Extract the data in fielddata into the coeffs. More...
 
boost::shared_ptr< ExpListGetSharedThisPtr ()
 Returns a shared pointer to the current object. More...
 
boost::shared_ptr
< LibUtilities::SessionReader
GetSession () const
 Returns the session object. More...
 
boost::shared_ptr
< LibUtilities::Comm
GetComm ()
 Returns the comm object. More...
 
SpatialDomains::MeshGraphSharedPtr GetGraph ()
 
LibUtilities::BasisSharedPtr GetHomogeneousBasis (void)
 
boost::shared_ptr< ExpList > & GetPlane (int n)
 
void CreateCollections (Collections::ImplementationType ImpType=Collections::eNoImpType)
 Construct collections of elements containing a single element type and polynomial order from the list of expansions. More...
 
void ClearGlobalLinSysManager (void)
 

Public Attributes

Array< OneD, int > m_BCtoElmMap
 
Array< OneD, int > m_BCtoEdgMap
 
- Public Attributes inherited from Nektar::MultiRegions::ExpList
ExpansionType m_expType
 

Protected Member Functions

const Array< OneD, const
LibUtilities::BasisSharedPtr > & 
GetBase () const
 This function gets the shared point to basis. More...
 
LibUtilities::BasisType GetBasisType (const int dir) const
 This function returns the type of basis used in the dir direction. More...
 
void SetUpDG (const std::string="DefaultVar")
 Set up all DG member variables and maps. More...
 
bool SameTypeOfBoundaryConditions (const DisContField2D &In)
 
void GenerateBoundaryConditionExpansion (const SpatialDomains::MeshGraphSharedPtr &graph2D, const SpatialDomains::BoundaryConditions &bcs, const std::string &variable, const bool DeclareCoeffPhysArrays=true)
 This function discretises the boundary conditions by setting up a list of one-dimensional boundary expansions. More...
 
void FindPeriodicEdges (const SpatialDomains::BoundaryConditions &bcs, const std::string &variable)
 Determine the periodic edges and vertices for the given graph. More...
 
bool IsLeftAdjacentEdge (const int n, const int e)
 
virtual void v_GetFwdBwdTracePhys (const Array< OneD, const NekDouble > &field, Array< OneD, NekDouble > &Fwd, Array< OneD, NekDouble > &Bwd)
 This method extracts the "forward" and "backward" trace data from the array field and puts the data into output vectors Fwd and Bwd. More...
 
virtual void v_GetFwdBwdTracePhys (Array< OneD, NekDouble > &Fwd, Array< OneD, NekDouble > &Bwd)
 
virtual void v_AddTraceIntegral (const Array< OneD, const NekDouble > &Fx, const Array< OneD, const NekDouble > &Fy, Array< OneD, NekDouble > &outarray)
 
virtual void v_AddTraceIntegral (const Array< OneD, const NekDouble > &Fn, Array< OneD, NekDouble > &outarray)
 Add trace contributions into elemental coefficient spaces. More...
 
virtual void v_AddFwdBwdTraceIntegral (const Array< OneD, const NekDouble > &Fwd, const Array< OneD, const NekDouble > &Bwd, Array< OneD, NekDouble > &outarray)
 Add trace contributions into elemental coefficient spaces. More...
 
virtual void v_ExtractTracePhys (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 This method extracts the trace (edges in 2D) from the field inarray and puts the values in outarray. More...
 
virtual void v_ExtractTracePhys (Array< OneD, NekDouble > &outarray)
 
virtual void v_HelmSolve (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const FlagList &flags, const StdRegions::ConstFactorMap &factors, const StdRegions::VarCoeffMap &varcoeff, const Array< OneD, const NekDouble > &dirForcing, const bool PhysSpaceForcing)
 
virtual void v_GeneralMatrixOp (const GlobalMatrixKey &gkey, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, CoeffState coeffstate=eLocal)
 Calculates the result of the multiplication of a global matrix of type specified by mkey with a vector given by inarray. More...
 
virtual void v_GetBoundaryToElmtMap (Array< OneD, int > &ElmtID, Array< OneD, int > &EdgeID)
 Set up a list of element IDs and edge IDs that link to the boundary conditions. More...
 
virtual void v_GetBndElmtExpansion (int i, boost::shared_ptr< ExpList > &result, const bool DeclareCoeffPhysArrays)
 
virtual void v_Reset ()
 Reset this field, so that geometry information can be updated. More...
 
virtual void v_GetPeriodicEntities (PeriodicMap &periodicVerts, PeriodicMap &periodicEdges, PeriodicMap &periodicFaces)
 Obtain a copy of the periodic edges and vertices for this field. More...
 
virtual AssemblyMapDGSharedPtrv_GetTraceMap ()
 
virtual const Array< OneD,
const
MultiRegions::ExpListSharedPtr > & 
v_GetBndCondExpansions ()
 
virtual const Array< OneD,
const
SpatialDomains::BoundaryConditionShPtr > & 
v_GetBndConditions ()
 
virtual
MultiRegions::ExpListSharedPtr
v_UpdateBndCondExpansion (int i)
 
virtual Array< OneD,
SpatialDomains::BoundaryConditionShPtr > & 
v_UpdateBndConditions ()
 
virtual void v_EvaluateBoundaryConditions (const NekDouble time=0.0, const std::string varName="", const NekDouble x2_in=NekConstants::kNekUnsetDouble, const NekDouble x3_in=NekConstants::kNekUnsetDouble)
 
virtual std::map< int,
RobinBCInfoSharedPtr
v_GetRobinBCInfo ()
 Search through the edge expansions and identify which ones have Robin/Mixed type boundary conditions. More...
 
- Protected Member Functions inherited from Nektar::MultiRegions::ExpList2D
void v_Upwind (const Array< OneD, const NekDouble > &Vn, const Array< OneD, const NekDouble > &Fwd, const Array< OneD, const NekDouble > &Bwd, Array< OneD, NekDouble > &Upwind)
 Upwind the Fwd and Bwd states based on the one- dimensional normal velocity field given by Vn. More...
 
void v_GetNormals (Array< OneD, Array< OneD, NekDouble > > &normals)
 For each local element, copy the normals stored in the element list into the array normals. More...
 
- Protected Member Functions inherited from Nektar::MultiRegions::ExpList
boost::shared_ptr< DNekMatGenGlobalMatrixFull (const GlobalLinSysKey &mkey, const boost::shared_ptr< AssemblyMapCG > &locToGloMap)
 
const DNekScalBlkMatSharedPtr GenBlockMatrix (const GlobalMatrixKey &gkey)
 This function assembles the block diagonal matrix of local matrices of the type mtype. More...
 
const DNekScalBlkMatSharedPtrGetBlockMatrix (const GlobalMatrixKey &gkey)
 
void MultiplyByBlockMatrix (const GlobalMatrixKey &gkey, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
boost::shared_ptr< GlobalMatrixGenGlobalMatrix (const GlobalMatrixKey &mkey, const boost::shared_ptr< AssemblyMapCG > &locToGloMap)
 Generates a global matrix from the given key and map. More...
 
void GlobalEigenSystem (const boost::shared_ptr< DNekMat > &Gmat, Array< OneD, NekDouble > &EigValsReal, Array< OneD, NekDouble > &EigValsImag, Array< OneD, NekDouble > &EigVecs=NullNekDouble1DArray)
 
boost::shared_ptr< GlobalLinSysGenGlobalLinSys (const GlobalLinSysKey &mkey, const boost::shared_ptr< AssemblyMapCG > &locToGloMap)
 This operation constructs the global linear system of type mkey. More...
 
boost::shared_ptr< GlobalLinSysGenGlobalBndLinSys (const GlobalLinSysKey &mkey, const AssemblyMapSharedPtr &locToGloMap)
 Generate a GlobalLinSys from information provided by the key "mkey" and the mapping provided in LocToGloBaseMap. More...
 
void ReadGlobalOptimizationParameters ()
 
virtual int v_GetNumElmts (void)
 
virtual void v_Upwind (const Array< OneD, const Array< OneD, NekDouble > > &Vec, const Array< OneD, const NekDouble > &Fwd, const Array< OneD, const NekDouble > &Bwd, Array< OneD, NekDouble > &Upwind)
 
virtual const Array< OneD,
const int > & 
v_GetTraceBndMap ()
 
virtual const std::vector< bool > & v_GetLeftAdjacentFaces (void) const
 
virtual void v_MultiplyByInvMassMatrix (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, CoeffState coeffstate)
 
virtual void v_LinearAdvectionDiffusionReactionSolve (const Array< OneD, Array< OneD, NekDouble > > &velocity, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const NekDouble lambda, CoeffState coeffstate=eLocal, const Array< OneD, const NekDouble > &dirForcing=NullNekDouble1DArray)
 
virtual void v_LinearAdvectionReactionSolve (const Array< OneD, Array< OneD, NekDouble > > &velocity, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, const NekDouble lambda, CoeffState coeffstate=eLocal, const Array< OneD, const NekDouble > &dirForcing=NullNekDouble1DArray)
 
virtual void v_ImposeDirichletConditions (Array< OneD, NekDouble > &outarray)
 
virtual void v_FillBndCondFromField ()
 
virtual void v_FillBndCondFromField (const int nreg)
 
virtual void v_LocalToGlobal (bool UseComm)
 
virtual void v_LocalToGlobal (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, bool UseComm)
 
virtual void v_GlobalToLocal (void)
 
virtual void v_GlobalToLocal (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
virtual void v_BwdTrans (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, CoeffState coeffstate)
 
virtual void v_BwdTrans_IterPerExp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
virtual void v_FwdTrans (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, CoeffState coeffstate)
 
virtual void v_FwdTrans_IterPerExp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
virtual void v_SmoothField (Array< OneD, NekDouble > &field)
 
virtual void v_IProductWRTBase (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, CoeffState coeffstate)
 
virtual void v_IProductWRTBase_IterPerExp (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
 
virtual void v_GetCoords (Array< OneD, NekDouble > &coord_0, Array< OneD, NekDouble > &coord_1, Array< OneD, NekDouble > &coord_2=NullNekDouble1DArray)
 
virtual void v_PhysDeriv (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d0, Array< OneD, NekDouble > &out_d1, Array< OneD, NekDouble > &out_d2)
 
virtual void v_PhysDeriv (const int dir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d)
 
virtual void v_PhysDeriv (Direction edir, const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &out_d)
 
virtual void v_CurlCurl (Array< OneD, Array< OneD, NekDouble > > &Vel, Array< OneD, Array< OneD, NekDouble > > &Q)
 
virtual void v_HomogeneousFwdTrans (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, CoeffState coeffstate=eLocal, bool Shuff=true, bool UnShuff=true)
 
virtual void v_HomogeneousBwdTrans (const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, CoeffState coeffstate=eLocal, bool Shuff=true, bool UnShuff=true)
 
virtual void v_DealiasedProd (const Array< OneD, NekDouble > &inarray1, const Array< OneD, NekDouble > &inarray2, Array< OneD, NekDouble > &outarray, CoeffState coeffstate=eLocal)
 
virtual void v_DealiasedDotProd (const Array< OneD, Array< OneD, NekDouble > > &inarray1, const Array< OneD, Array< OneD, NekDouble > > &inarray2, Array< OneD, Array< OneD, NekDouble > > &outarray, CoeffState coeffstate=eLocal)
 
virtual void v_GetBCValues (Array< OneD, NekDouble > &BndVals, const Array< OneD, NekDouble > &TotField, int BndID)
 
virtual void v_NormVectorIProductWRTBase (Array< OneD, const NekDouble > &V1, Array< OneD, const NekDouble > &V2, Array< OneD, NekDouble > &outarray, int BndID)
 
virtual void v_NormVectorIProductWRTBase (Array< OneD, Array< OneD, NekDouble > > &V, Array< OneD, NekDouble > &outarray)
 
virtual void v_ExtractElmtToBndPhys (int i, Array< OneD, NekDouble > &elmt, Array< OneD, NekDouble > &boundary)
 
virtual void v_ExtractPhysToBndElmt (int i, const Array< OneD, const NekDouble > &phys, Array< OneD, NekDouble > &bndElmt)
 
virtual void v_ExtractPhysToBnd (int i, const Array< OneD, const NekDouble > &phys, Array< OneD, NekDouble > &bnd)
 
virtual void v_GetBoundaryNormals (int i, Array< OneD, Array< OneD, NekDouble > > &normals)
 
virtual std::vector
< LibUtilities::FieldDefinitionsSharedPtr
v_GetFieldDefinitions (void)
 
virtual void v_GetFieldDefinitions (std::vector< LibUtilities::FieldDefinitionsSharedPtr > &fielddef)
 
virtual void v_AppendFieldData (LibUtilities::FieldDefinitionsSharedPtr &fielddef, std::vector< NekDouble > &fielddata)
 
virtual void v_AppendFieldData (LibUtilities::FieldDefinitionsSharedPtr &fielddef, std::vector< NekDouble > &fielddata, Array< OneD, NekDouble > &coeffs)
 
virtual void v_ExtractDataToCoeffs (LibUtilities::FieldDefinitionsSharedPtr &fielddef, std::vector< NekDouble > &fielddata, std::string &field, Array< OneD, NekDouble > &coeffs)
 Extract data from raw field data into expansion list. More...
 
virtual void v_ExtractCoeffsToCoeffs (const boost::shared_ptr< ExpList > &fromExpList, const Array< OneD, const NekDouble > &fromCoeffs, Array< OneD, NekDouble > &toCoeffs)
 
virtual void v_WriteTecplotHeader (std::ostream &outfile, std::string var="")
 
virtual void v_WriteTecplotZone (std::ostream &outfile, int expansion)
 
virtual void v_WriteTecplotField (std::ostream &outfile, int expansion)
 
virtual void v_WriteTecplotConnectivity (std::ostream &outfile, int expansion)
 
virtual void v_WriteVtkPieceData (std::ostream &outfile, int expansion, std::string var)
 
virtual NekDouble v_L2 (const Array< OneD, const NekDouble > &phys, const Array< OneD, const NekDouble > &soln=NullNekDouble1DArray)
 
virtual NekDouble v_Integral (const Array< OneD, const NekDouble > &inarray)
 
virtual Array< OneD, const
NekDouble
v_HomogeneousEnergy (void)
 
virtual
LibUtilities::TranspositionSharedPtr 
v_GetTransposition (void)
 
virtual NekDouble v_GetHomoLen (void)
 
virtual Array< OneD, const
unsigned int > 
v_GetZIDs (void)
 
virtual Array< OneD, const
unsigned int > 
v_GetYIDs (void)
 
virtual void v_ClearGlobalLinSysManager (void)
 
void ExtractFileBCs (const std::string &fileName, LibUtilities::CommSharedPtr comm, const std::string &varName, const boost::shared_ptr< ExpList > locExpList)
 

Protected Attributes

Array< OneD,
LibUtilities::BasisSharedPtr
m_base
 
Array< OneD,
MultiRegions::ExpListSharedPtr
m_bndCondExpansions
 An object which contains the discretised boundary conditions. More...
 
Array< OneD,
SpatialDomains::BoundaryConditionShPtr
m_bndConditions
 An array which contains the information about the boundary condition on the different boundary regions. More...
 
GlobalLinSysMapShPtr m_globalBndMat
 
ExpListSharedPtr m_trace
 
AssemblyMapDGSharedPtr m_traceMap
 
LocTraceToTraceMapSharedPtr m_locTraceToTraceMap
 
Array< OneD, Array< OneD,
unsigned int > > 
m_mapEdgeToElmn
 
Array< OneD, Array< OneD,
unsigned int > > 
m_signEdgeToElmn
 
Array< OneD,
StdRegions::Orientation
m_edgedir
 
std::set< int > m_boundaryEdges
 A set storing the global IDs of any boundary edges. More...
 
PeriodicMap m_periodicVerts
 A map which identifies groups of periodic vertices. More...
 
PeriodicMap m_periodicEdges
 A map which identifies pairs of periodic edges. More...
 
std::vector< int > m_periodicFwdCopy
 A vector indicating degress of freedom which need to be copied from forwards to backwards space in case of a periodic boundary condition. More...
 
std::vector< int > m_periodicBwdCopy
 
std::vector< bool > m_leftAdjacentEdges
 
- Protected Attributes inherited from Nektar::MultiRegions::ExpList
LibUtilities::CommSharedPtr m_comm
 Communicator. More...
 
LibUtilities::SessionReaderSharedPtr m_session
 Session. More...
 
SpatialDomains::MeshGraphSharedPtr m_graph
 Mesh associated with this expansion list. More...
 
int m_ncoeffs
 The total number of local degrees of freedom. m_ncoeffs $=N_{\mathrm{eof}}=\sum_{e=1}^{{N_{\mathrm{el}}}}N^{e}_l$. More...
 
int m_npoints
 
Array< OneD, NekDoublem_coeffs
 Concatenation of all local expansion coefficients. More...
 
Array< OneD, NekDoublem_phys
 The global expansion evaluated at the quadrature points. More...
 
bool m_physState
 The state of the array m_phys. More...
 
boost::shared_ptr
< LocalRegions::ExpansionVector
m_exp
 The list of local expansions. More...
 
Collections::CollectionVector m_collections
 
std::vector< int > m_coll_coeff_offset
 Offset of elemental data into the array m_coeffs. More...
 
std::vector< int > m_coll_phys_offset
 Offset of elemental data into the array m_phys. More...
 
Array< OneD, int > m_coeff_offset
 Offset of elemental data into the array m_coeffs. More...
 
Array< OneD, int > m_phys_offset
 Offset of elemental data into the array m_phys. More...
 
Array< OneD, int > m_offset_elmt_id
 Array containing the element id m_offset_elmt_id[n] that the n^th consecutive block of data in m_coeffs and m_phys is associated, i.e. for an array of constant expansion size and single shape elements m_phys[n*m_npoints] is the data related to m_exp[m_offset_elmt_id[n]];. More...
 
NekOptimize::GlobalOptParamSharedPtr m_globalOptParam
 
BlockMatrixMapShPtr m_blockMat
 
bool m_WaveSpace
 
boost::unordered_map< int, int > m_elmtToExpId
 Mapping from geometry ID of element to index inside m_exp. More...
 

Additional Inherited Members

- Static Protected Member Functions inherited from Nektar::MultiRegions::ExpList
static
SpatialDomains::BoundaryConditionShPtr 
GetBoundaryCondition (const SpatialDomains::BoundaryConditionCollection &collection, unsigned int index, const std::string &variable)
 

Detailed Description

Abstraction of a global discontinuous two-dimensional spectral/hp element expansion which approximates the solution of a set of partial differential equations.

Definition at line 52 of file DisContField2D.h.

Constructor & Destructor Documentation

Nektar::MultiRegions::DisContField2D::DisContField2D ( void  )

Default constructor.

Definition at line 63 of file DisContField2D.cpp.

64  : ExpList2D (),
66  m_bndConditions (),
68  {
69  }
static ExpListSharedPtr NullExpListSharedPtr
Definition: ExpList.h:1485
Array< OneD, MultiRegions::ExpListSharedPtr > m_bndCondExpansions
An object which contains the discretised boundary conditions.
Array< OneD, SpatialDomains::BoundaryConditionShPtr > m_bndConditions
An array which contains the information about the boundary condition on the different boundary region...
ExpList2D()
Default constructor.
Definition: ExpList2D.cpp:69
Nektar::MultiRegions::DisContField2D::DisContField2D ( const LibUtilities::SessionReaderSharedPtr pSession,
const SpatialDomains::MeshGraphSharedPtr graph2D,
const std::string &  variable,
const bool  SetUpJustDG = true,
const bool  DeclareCoeffPhysArrays = true 
)

Constructs a global discontinuous field based on an input mesh with boundary conditions.

Definition at line 99 of file DisContField2D.cpp.

References Nektar::MultiRegions::ExpList::EvaluateBoundaryConditions(), FindPeriodicEdges(), GenerateBoundaryConditionExpansion(), Nektar::MultiRegions::ExpList::GetBoundaryToElmtMap(), m_bndCondExpansions, Nektar::MultiRegions::ExpList::m_session, SetUpDG(), and Nektar::MultiRegions::ExpList::SetUpPhysNormals().

105  : ExpList2D(pSession, graph2D, DeclareCoeffPhysArrays, variable),
107  m_bndConditions(),
109  m_periodicVerts(),
110  m_periodicEdges(),
113  {
114 
115  if (variable.compare("DefaultVar") != 0) // do not set up BCs if default variable
116  {
117  SpatialDomains::BoundaryConditions bcs(m_session, graph2D);
118  GenerateBoundaryConditionExpansion(graph2D, bcs, variable,
119  DeclareCoeffPhysArrays);
120 
121  if (DeclareCoeffPhysArrays)
122  {
123  EvaluateBoundaryConditions(0.0, variable);
124  }
125 
126  // Find periodic edges for this variable.
127  FindPeriodicEdges(bcs, variable);
128  }
129 
130  if (SetUpJustDG)
131  {
132  SetUpDG(variable);
133  }
134  else
135  {
136  // Set element edges to point to Robin BC edges if required.
137  int i, cnt;
138  Array<OneD, int> ElmtID, EdgeID;
139  GetBoundaryToElmtMap(ElmtID, EdgeID);
140 
141  for(cnt = i = 0; i < m_bndCondExpansions.num_elements(); ++i)
142  {
144  int e;
145  locExpList = m_bndCondExpansions[i];
146 
147  for(e = 0; e < locExpList->GetExpSize(); ++e)
148  {
150  (*m_exp)[ElmtID[cnt+e]]->
151  as<LocalRegions::Expansion2D>();
153  locExpList->GetExp(e)->
154  as<LocalRegions::Expansion1D>();
156  locExpList->GetExp(e)->
157  as<LocalRegions::Expansion> ();
158 
159  exp2d->SetEdgeExp(EdgeID[cnt+e], exp1d);
160  exp1d->SetAdjacentElementExp(EdgeID[cnt+e], exp2d);
161  }
162  cnt += m_bndCondExpansions[i]->GetExpSize();
163  }
164 
165  if(m_session->DefinesSolverInfo("PROJECTION"))
166  {
167  std::string ProjectStr =
168  m_session->GetSolverInfo("PROJECTION");
169  if((ProjectStr == "MixedCGDG") ||
170  (ProjectStr == "Mixed_CG_Discontinuous"))
171  {
172  SetUpDG();
173  }
174  else
175  {
177  }
178  }
179  else
180  {
182  }
183  }
184  }
void FindPeriodicEdges(const SpatialDomains::BoundaryConditions &bcs, const std::string &variable)
Determine the periodic edges and vertices for the given graph.
static ExpListSharedPtr NullExpListSharedPtr
Definition: ExpList.h:1485
void EvaluateBoundaryConditions(const NekDouble time=0.0, const std::string varName="", const NekDouble=NekConstants::kNekUnsetDouble, const NekDouble=NekConstants::kNekUnsetDouble)
Definition: ExpList.h:2249
std::vector< int > m_periodicFwdCopy
A vector indicating degress of freedom which need to be copied from forwards to backwards space in ca...
PeriodicMap m_periodicEdges
A map which identifies pairs of periodic edges.
PeriodicMap m_periodicVerts
A map which identifies groups of periodic vertices.
void GetBoundaryToElmtMap(Array< OneD, int > &ElmtID, Array< OneD, int > &EdgeID)
Definition: ExpList.h:2302
Array< OneD, MultiRegions::ExpListSharedPtr > m_bndCondExpansions
An object which contains the discretised boundary conditions.
boost::shared_ptr< ExpList > ExpListSharedPtr
Shared pointer to an ExpList object.
LibUtilities::SessionReaderSharedPtr m_session
Session.
Definition: ExpList.h:969
boost::shared_ptr< Expansion > ExpansionSharedPtr
Definition: Expansion.h:68
Array< OneD, SpatialDomains::BoundaryConditionShPtr > m_bndConditions
An array which contains the information about the boundary condition on the different boundary region...
void SetUpDG(const std::string="DefaultVar")
Set up all DG member variables and maps.
ExpList2D()
Default constructor.
Definition: ExpList2D.cpp:69
void GenerateBoundaryConditionExpansion(const SpatialDomains::MeshGraphSharedPtr &graph2D, const SpatialDomains::BoundaryConditions &bcs, const std::string &variable, const bool DeclareCoeffPhysArrays=true)
This function discretises the boundary conditions by setting up a list of one-dimensional boundary ex...
boost::shared_ptr< Expansion1D > Expansion1DSharedPtr
Definition: Expansion1D.h:53
boost::shared_ptr< Expansion2D > Expansion2DSharedPtr
Definition: Expansion1D.h:49
Nektar::MultiRegions::DisContField2D::DisContField2D ( const DisContField2D In,
const SpatialDomains::MeshGraphSharedPtr graph2D,
const std::string &  variable,
const bool  SetUpJustDG = false,
const bool  DeclareCoeffPhysArrays = true 
)

Definition at line 191 of file DisContField2D.cpp.

References Nektar::MultiRegions::ExpList::EvaluateBoundaryConditions(), FindPeriodicEdges(), GenerateBoundaryConditionExpansion(), Nektar::MultiRegions::ExpList::GetBoundaryToElmtMap(), m_bndCondExpansions, m_boundaryEdges, m_globalBndMat, m_leftAdjacentEdges, m_locTraceToTraceMap, m_periodicBwdCopy, m_periodicEdges, m_periodicFwdCopy, m_periodicVerts, Nektar::MultiRegions::ExpList::m_session, m_trace, m_traceMap, SameTypeOfBoundaryConditions(), SetUpDG(), and Nektar::MultiRegions::ExpList::SetUpPhysNormals().

197  : ExpList2D(In,DeclareCoeffPhysArrays),
199  {
200  // Set up boundary conditions for this variable.
201  // Do not set up BCs if default variable
202  if(variable.compare("DefaultVar") != 0)
203  {
204  SpatialDomains::BoundaryConditions bcs(m_session, graph2D);
205  GenerateBoundaryConditionExpansion(graph2D, bcs, variable);
206 
207  if (DeclareCoeffPhysArrays)
208  {
209  EvaluateBoundaryConditions(0.0, variable);
210  }
211 
213  {
214  // Find periodic edges for this variable.
215  FindPeriodicEdges(bcs, variable);
216 
217  if(SetUpJustDG)
218  {
219  SetUpDG();
220  }
221  else
222  {
223  // set elmt edges to point to robin bc edges if required
224  int i, cnt = 0;
225  Array<OneD, int> ElmtID,EdgeID;
226  GetBoundaryToElmtMap(ElmtID,EdgeID);
227 
228  for (i = 0; i < m_bndCondExpansions.num_elements(); ++i)
229  {
231 
232  int e;
233  locExpList = m_bndCondExpansions[i];
234 
235  for(e = 0; e < locExpList->GetExpSize(); ++e)
236  {
238  = (*m_exp)[ElmtID[cnt+e]]->
239  as<LocalRegions::Expansion2D>();
241  = locExpList->GetExp(e)->
242  as<LocalRegions::Expansion1D>();
244  = locExpList->GetExp(e)->
245  as<LocalRegions::Expansion> ();
246 
247  exp2d->SetEdgeExp(EdgeID[cnt+e], exp1d);
248  exp1d->SetAdjacentElementExp(EdgeID[cnt+e],
249  exp2d);
250  }
251 
252  cnt += m_bndCondExpansions[i]->GetExpSize();
253  }
254 
255 
256  if (m_session->DefinesSolverInfo("PROJECTION"))
257  {
258  std::string ProjectStr =
259  m_session->GetSolverInfo("PROJECTION");
260 
261  if ((ProjectStr == "MixedCGDG") ||
262  (ProjectStr == "Mixed_CG_Discontinuous"))
263  {
264  SetUpDG();
265  }
266  else
267  {
269  }
270  }
271  else
272  {
274  }
275  }
276  }
277  else
278  {
279  if (SetUpJustDG)
280  {
281  m_globalBndMat = In.m_globalBndMat;
282  m_trace = In.m_trace;
283  m_traceMap = In.m_traceMap;
284  m_locTraceToTraceMap = In.m_locTraceToTraceMap;
285  m_periodicEdges = In.m_periodicEdges;
286  m_periodicVerts = In.m_periodicVerts;
287  m_periodicFwdCopy = In.m_periodicFwdCopy;
288  m_periodicBwdCopy = In.m_periodicBwdCopy;
289  m_boundaryEdges = In.m_boundaryEdges;
290  m_leftAdjacentEdges = In.m_leftAdjacentEdges;
291  }
292  else
293  {
294  m_globalBndMat = In.m_globalBndMat;
295  m_trace = In.m_trace;
296  m_traceMap = In.m_traceMap;
297  m_locTraceToTraceMap = In.m_locTraceToTraceMap;
298  m_periodicEdges = In.m_periodicEdges;
299  m_periodicVerts = In.m_periodicVerts;
300  m_periodicFwdCopy = In.m_periodicFwdCopy;
301  m_periodicBwdCopy = In.m_periodicBwdCopy;
302  m_boundaryEdges = In.m_boundaryEdges;
303  m_leftAdjacentEdges = In.m_leftAdjacentEdges;
304 
305  // set elmt edges to point to robin bc edges if required
306  int i, cnt = 0;
307  Array<OneD, int> ElmtID, EdgeID;
308  GetBoundaryToElmtMap(ElmtID, EdgeID);
309 
310  for (i = 0; i < m_bndCondExpansions.num_elements(); ++i)
311  {
313 
314  int e;
315  locExpList = m_bndCondExpansions[i];
316 
317  for (e = 0; e < locExpList->GetExpSize(); ++e)
318  {
320  = (*m_exp)[ElmtID[cnt+e]]->
321  as<LocalRegions::Expansion2D>();
323  = locExpList->GetExp(e)->
324  as<LocalRegions::Expansion1D>();
326  = locExpList->GetExp(e)->
327  as<LocalRegions::Expansion> ();
328 
329  exp2d->SetEdgeExp(EdgeID[cnt+e], exp1d);
330  exp1d->SetAdjacentElementExp(EdgeID[cnt+e],
331  exp2d);
332  }
333  cnt += m_bndCondExpansions[i]->GetExpSize();
334  }
335 
337  }
338  }
339  }
340  }
void FindPeriodicEdges(const SpatialDomains::BoundaryConditions &bcs, const std::string &variable)
Determine the periodic edges and vertices for the given graph.
static ExpListSharedPtr NullExpListSharedPtr
Definition: ExpList.h:1485
void EvaluateBoundaryConditions(const NekDouble time=0.0, const std::string varName="", const NekDouble=NekConstants::kNekUnsetDouble, const NekDouble=NekConstants::kNekUnsetDouble)
Definition: ExpList.h:2249
std::vector< int > m_periodicFwdCopy
A vector indicating degress of freedom which need to be copied from forwards to backwards space in ca...
PeriodicMap m_periodicEdges
A map which identifies pairs of periodic edges.
PeriodicMap m_periodicVerts
A map which identifies groups of periodic vertices.
void GetBoundaryToElmtMap(Array< OneD, int > &ElmtID, Array< OneD, int > &EdgeID)
Definition: ExpList.h:2302
bool SameTypeOfBoundaryConditions(const DisContField2D &In)
LocTraceToTraceMapSharedPtr m_locTraceToTraceMap
Array< OneD, MultiRegions::ExpListSharedPtr > m_bndCondExpansions
An object which contains the discretised boundary conditions.
std::set< int > m_boundaryEdges
A set storing the global IDs of any boundary edges.
boost::shared_ptr< ExpList > ExpListSharedPtr
Shared pointer to an ExpList object.
LibUtilities::SessionReaderSharedPtr m_session
Session.
Definition: ExpList.h:969
boost::shared_ptr< Expansion > ExpansionSharedPtr
Definition: Expansion.h:68
void SetUpDG(const std::string="DefaultVar")
Set up all DG member variables and maps.
ExpList2D()
Default constructor.
Definition: ExpList2D.cpp:69
void GenerateBoundaryConditionExpansion(const SpatialDomains::MeshGraphSharedPtr &graph2D, const SpatialDomains::BoundaryConditions &bcs, const std::string &variable, const bool DeclareCoeffPhysArrays=true)
This function discretises the boundary conditions by setting up a list of one-dimensional boundary ex...
boost::shared_ptr< Expansion1D > Expansion1DSharedPtr
Definition: Expansion1D.h:53
boost::shared_ptr< Expansion2D > Expansion2DSharedPtr
Definition: Expansion1D.h:49
Nektar::MultiRegions::DisContField2D::DisContField2D ( const DisContField2D In,
const bool  DeclareCoeffPhysArrays = true 
)

Definition at line 71 of file DisContField2D.cpp.

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), and m_trace.

74  : ExpList2D (In,DeclareCoeffPhysArrays),
75  m_bndCondExpansions (In.m_bndCondExpansions),
76  m_bndConditions (In.m_bndConditions),
77  m_globalBndMat (In.m_globalBndMat),
78  m_traceMap (In.m_traceMap),
79  m_locTraceToTraceMap (In.m_locTraceToTraceMap),
80  m_boundaryEdges (In.m_boundaryEdges),
81  m_periodicVerts (In.m_periodicVerts),
82  m_periodicEdges (In.m_periodicEdges),
83  m_periodicFwdCopy (In.m_periodicFwdCopy),
84  m_periodicBwdCopy (In.m_periodicBwdCopy),
85  m_leftAdjacentEdges (In.m_leftAdjacentEdges)
86  {
87  if (In.m_trace)
88  {
90  *boost::dynamic_pointer_cast<ExpList1D>(In.m_trace),
91  DeclareCoeffPhysArrays);
92  }
93  }
static boost::shared_ptr< DataType > AllocateSharedPtr()
Allocate a shared pointer from the memory pool.
std::vector< int > m_periodicFwdCopy
A vector indicating degress of freedom which need to be copied from forwards to backwards space in ca...
PeriodicMap m_periodicEdges
A map which identifies pairs of periodic edges.
PeriodicMap m_periodicVerts
A map which identifies groups of periodic vertices.
LocTraceToTraceMapSharedPtr m_locTraceToTraceMap
Array< OneD, MultiRegions::ExpListSharedPtr > m_bndCondExpansions
An object which contains the discretised boundary conditions.
std::set< int > m_boundaryEdges
A set storing the global IDs of any boundary edges.
Array< OneD, SpatialDomains::BoundaryConditionShPtr > m_bndConditions
An array which contains the information about the boundary condition on the different boundary region...
ExpList2D()
Default constructor.
Definition: ExpList2D.cpp:69
Nektar::MultiRegions::DisContField2D::~DisContField2D ( )
virtual

Default destructor.

Definition at line 345 of file DisContField2D.cpp.

346  {
347  }

Member Function Documentation

void Nektar::MultiRegions::DisContField2D::EvaluateHDGPostProcessing ( Array< OneD, NekDouble > &  outarray)

Evaluate HDG post-processing to increase polynomial order of solution.

This function takes the solution (assumed to be one order lower) in physical space, and postprocesses at the current polynomial order by solving the system:

\[ \begin{aligned} (\nabla w, \nabla u^*) &= (\nabla w, u), \\ \langle \nabla u^*, 1 \rangle &= \langle \nabla u, 1 \rangle \end{aligned} \]

where $ u $ corresponds with the current solution as stored inside m_coeffs.

Parameters
outarrayThe resulting field $ u^* $.

Definition at line 2116 of file DisContField2D.cpp.

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), ASSERTL0, Nektar::LibUtilities::eGaussLobattoLegendre, Nektar::LibUtilities::eGaussRadauMAlpha1Beta0, Nektar::StdRegions::eInvLaplacianWithUnityMean, Nektar::LibUtilities::eOrtho_A, Nektar::LibUtilities::eOrtho_B, Nektar::LibUtilities::eQuadrilateral, Nektar::LibUtilities::eTriangle, Nektar::eWrapper, Nektar::MultiRegions::ExpList::GetExpSize(), Nektar::NekVector< DataType >::GetPtr(), Nektar::MultiRegions::ExpList::m_coeff_offset, Nektar::MultiRegions::ExpList::m_coeffs, Nektar::MultiRegions::ExpList::m_offset_elmt_id, m_trace, m_traceMap, Vmath::Vadd(), and Vmath::Vcopy().

2118  {
2119  int i,cnt,e,ncoeff_edge;
2120  Array<OneD, NekDouble> force, out_tmp, qrhs, qrhs1;
2121  Array<OneD, Array< OneD, LocalRegions::ExpansionSharedPtr> >
2122  &elmtToTrace = m_traceMap->GetElmtToTrace();
2123 
2124  StdRegions::Orientation edgedir;
2125 
2126  int eid,nq_elmt, nm_elmt;
2127  int LocBndCoeffs = m_traceMap->GetNumLocalBndCoeffs();
2128  Array<OneD, NekDouble> loc_lambda(LocBndCoeffs), edge_lambda;
2129  Array<OneD, NekDouble> tmp_coeffs;
2130  m_traceMap->GlobalToLocalBnd(m_trace->GetCoeffs(),loc_lambda);
2131 
2132  edge_lambda = loc_lambda;
2133 
2134  // Calculate Q using standard DG formulation.
2135  for(i = cnt = 0; i < GetExpSize(); ++i)
2136  {
2137  eid = m_offset_elmt_id[i];
2138 
2139  nq_elmt = (*m_exp)[eid]->GetTotPoints();
2140  nm_elmt = (*m_exp)[eid]->GetNcoeffs();
2141  qrhs = Array<OneD, NekDouble>(nq_elmt);
2142  qrhs1 = Array<OneD, NekDouble>(nq_elmt);
2143  force = Array<OneD, NekDouble>(2*nm_elmt);
2144  out_tmp = force + nm_elmt;
2146 
2147  int num_points0 = (*m_exp)[eid]->GetBasis(0)->GetNumPoints();
2148  int num_points1 = (*m_exp)[eid]->GetBasis(1)->GetNumPoints();
2149  int num_modes0 = (*m_exp)[eid]->GetBasis(0)->GetNumModes();
2150  int num_modes1 = (*m_exp)[eid]->GetBasis(1)->GetNumModes();
2151 
2152  // Probably a better way of setting up lambda than this. Note
2153  // cannot use PutCoeffsInToElmts since lambda space is mapped
2154  // during the solve.
2155  int nEdges = (*m_exp)[i]->GetNedges();
2156  Array<OneD, Array<OneD, NekDouble> > edgeCoeffs(nEdges);
2157 
2158  for(e = 0; e < (*m_exp)[eid]->GetNedges(); ++e)
2159  {
2160  edgedir = (*m_exp)[eid]->GetEorient(e);
2161  ncoeff_edge = elmtToTrace[eid][e]->GetNcoeffs();
2162  edgeCoeffs[e] = Array<OneD, NekDouble>(ncoeff_edge);
2163  Vmath::Vcopy(ncoeff_edge, edge_lambda, 1, edgeCoeffs[e], 1);
2164  elmtToTrace[eid][e]->SetCoeffsToOrientation(
2165  edgedir, edgeCoeffs[e], edgeCoeffs[e]);
2166  edge_lambda = edge_lambda + ncoeff_edge;
2167  }
2168 
2169  //creating orthogonal expansion (checking if we have quads or triangles)
2170  LibUtilities::ShapeType shape = (*m_exp)[eid]->DetShapeType();
2171  switch(shape)
2172  {
2174  {
2175  const LibUtilities::PointsKey PkeyQ1(num_points0,LibUtilities::eGaussLobattoLegendre);
2176  const LibUtilities::PointsKey PkeyQ2(num_points1,LibUtilities::eGaussLobattoLegendre);
2177  LibUtilities::BasisKey BkeyQ1(LibUtilities::eOrtho_A, num_modes0, PkeyQ1);
2178  LibUtilities::BasisKey BkeyQ2(LibUtilities::eOrtho_A, num_modes1, PkeyQ2);
2179  SpatialDomains::QuadGeomSharedPtr qGeom = boost::dynamic_pointer_cast<SpatialDomains::QuadGeom>((*m_exp)[eid]->GetGeom());
2180  ppExp = MemoryManager<LocalRegions::QuadExp>::AllocateSharedPtr(BkeyQ1, BkeyQ2, qGeom);
2181  }
2182  break;
2184  {
2185  const LibUtilities::PointsKey PkeyT1(num_points0,LibUtilities::eGaussLobattoLegendre);
2186  const LibUtilities::PointsKey PkeyT2(num_points1,LibUtilities::eGaussRadauMAlpha1Beta0);
2187  LibUtilities::BasisKey BkeyT1(LibUtilities::eOrtho_A, num_modes0, PkeyT1);
2188  LibUtilities::BasisKey BkeyT2(LibUtilities::eOrtho_B, num_modes1, PkeyT2);
2189  SpatialDomains::TriGeomSharedPtr tGeom = boost::dynamic_pointer_cast<SpatialDomains::TriGeom>((*m_exp)[eid]->GetGeom());
2190  ppExp = MemoryManager<LocalRegions::TriExp>::AllocateSharedPtr(BkeyT1, BkeyT2, tGeom);
2191  }
2192  break;
2193  default:
2194  ASSERTL0(false, "Wrong shape type, HDG postprocessing is not implemented");
2195  };
2196 
2197 
2198  //DGDeriv
2199  // (d/dx w, d/dx q_0)
2200  (*m_exp)[eid]->DGDeriv(
2201  0,tmp_coeffs = m_coeffs + m_coeff_offset[eid],
2202  elmtToTrace[eid], edgeCoeffs, out_tmp);
2203  (*m_exp)[eid]->BwdTrans(out_tmp,qrhs);
2204  //(*m_exp)[eid]->IProductWRTDerivBase(0,qrhs,force);
2205  ppExp->IProductWRTDerivBase(0,qrhs,force);
2206 
2207 
2208  // + (d/dy w, d/dy q_1)
2209  (*m_exp)[eid]->DGDeriv(
2210  1,tmp_coeffs = m_coeffs + m_coeff_offset[eid],
2211  elmtToTrace[eid], edgeCoeffs, out_tmp);
2212 
2213  (*m_exp)[eid]->BwdTrans(out_tmp,qrhs);
2214  //(*m_exp)[eid]->IProductWRTDerivBase(1,qrhs,out_tmp);
2215  ppExp->IProductWRTDerivBase(1,qrhs,out_tmp);
2216 
2217  Vmath::Vadd(nm_elmt,force,1,out_tmp,1,force,1);
2218 
2219  // determine force[0] = (1,u)
2220  (*m_exp)[eid]->BwdTrans(
2221  tmp_coeffs = m_coeffs + m_coeff_offset[eid],qrhs);
2222  force[0] = (*m_exp)[eid]->Integral(qrhs);
2223 
2224  // multiply by inverse Laplacian matrix
2225  // get matrix inverse
2226  LocalRegions::MatrixKey lapkey(StdRegions::eInvLaplacianWithUnityMean, ppExp->DetShapeType(), *ppExp);
2227  DNekScalMatSharedPtr lapsys = ppExp->GetLocMatrix(lapkey);
2228 
2229  NekVector<NekDouble> in (nm_elmt,force,eWrapper);
2230  NekVector<NekDouble> out(nm_elmt);
2231 
2232  out = (*lapsys)*in;
2233 
2234  // Transforming back to modified basis
2235  Array<OneD, NekDouble> work(nq_elmt);
2236  ppExp->BwdTrans(out.GetPtr(), work);
2237  (*m_exp)[eid]->FwdTrans(work, tmp_coeffs = outarray + m_coeff_offset[eid]);
2238  }
2239  }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:198
static boost::shared_ptr< DataType > AllocateSharedPtr()
Allocate a shared pointer from the memory pool.
boost::shared_ptr< QuadGeom > QuadGeomSharedPtr
Definition: QuadGeom.h:54
Array< OneD, NekDouble > m_coeffs
Concatenation of all local expansion coefficients.
Definition: ExpList.h:998
int GetExpSize(void)
This function returns the number of elements in the expansion.
Definition: ExpList.h:2054
boost::shared_ptr< DNekScalMat > DNekScalMatSharedPtr
Gauss Radau pinned at x=-1, .
Definition: PointsType.h:59
Principle Orthogonal Functions .
Definition: BasisType.h:47
Array< OneD, int > m_coeff_offset
Offset of elemental data into the array m_coeffs.
Definition: ExpList.h:1047
Array< OneD, int > m_offset_elmt_id
Array containing the element id m_offset_elmt_id[n] that the n^th consecutive block of data in m_coef...
Definition: ExpList.h:1058
Principle Orthogonal Functions .
Definition: BasisType.h:46
boost::shared_ptr< Expansion > ExpansionSharedPtr
Definition: Expansion.h:68
boost::shared_ptr< TriGeom > TriGeomSharedPtr
Definition: TriGeom.h:58
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1061
1D Gauss-Lobatto-Legendre quadrature points
Definition: PointsType.h:52
void Vadd(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Add vector z = x+y.
Definition: Vmath.cpp:299
void Nektar::MultiRegions::DisContField2D::FindPeriodicEdges ( const SpatialDomains::BoundaryConditions bcs,
const std::string &  variable 
)
protected

Determine the periodic edges and vertices for the given graph.

Note that much of this routine is the same as the three-dimensional version, which therefore has much better documentation.

Parameters
bcsInformation about the boundary conditions.
variableSpecifies the field.
See also
DisContField3D::FindPeriodicFaces

Definition at line 711 of file DisContField2D.cpp.

References ASSERTL0, Nektar::StdRegions::eBackwards, Nektar::StdRegions::eForwards, Nektar::StdRegions::eNoOrientation, Nektar::SpatialDomains::ePeriodic, Nektar::MultiRegions::ExpList::GetBoundaryCondition(), Nektar::SpatialDomains::BoundaryConditions::GetBoundaryConditions(), Nektar::SpatialDomains::BoundaryConditions::GetBoundaryRegions(), Nektar::iterator, Nektar::MultiRegions::ExpList::m_graph, m_periodicEdges, m_periodicVerts, Nektar::MultiRegions::ExpList::m_session, CellMLToNektar.cellml_metadata::p, Nektar::LibUtilities::ReduceSum, and Vmath::Vsum().

Referenced by DisContField2D().

714  {
716  = bcs.GetBoundaryRegions();
718  = bcs.GetBoundaryConditions();
720  = boost::dynamic_pointer_cast<
721  SpatialDomains::MeshGraph2D>(m_graph);
722  SpatialDomains::BoundaryRegionCollection::const_iterator it;
723 
725  m_session->GetComm()->GetRowComm();
727  m_session->GetCompositeOrdering();
728  LibUtilities::BndRegionOrdering bndRegOrder =
729  m_session->GetBndRegionOrdering();
731  m_graph->GetComposites();
732 
733  // Unique collection of pairs of periodic composites (i.e. if
734  // composites 1 and 2 are periodic then this map will contain either
735  // the pair (1,2) or (2,1) but not both).
736  map<int,int> perComps;
737  map<int,vector<int> > allVerts;
738  set<int> locVerts;
739  map<int,StdRegions::Orientation> allEdges;
740 
741  int region1ID, region2ID, i, j, k, cnt;
743 
744  // Set up a set of all local verts and edges.
745  for(i = 0; i < (*m_exp).size(); ++i)
746  {
747  for(j = 0; j < (*m_exp)[i]->GetNverts(); ++j)
748  {
749  int id = (*m_exp)[i]->GetGeom()->GetVid(j);
750  locVerts.insert(id);
751  }
752  }
753 
754  // Construct list of all periodic pairs local to this process.
755  for (it = bregions.begin(); it != bregions.end(); ++it)
756  {
757  locBCond = GetBoundaryCondition(
758  bconditions, it->first, variable);
759 
760  if (locBCond->GetBoundaryConditionType()
762  {
763  continue;
764  }
765 
766  // Identify periodic boundary region IDs.
767  region1ID = it->first;
768  region2ID = boost::static_pointer_cast<
769  SpatialDomains::PeriodicBoundaryCondition>(
770  locBCond)->m_connectedBoundaryRegion;
771 
772  // From this identify composites. Note that in serial this will
773  // be an empty map.
774  int cId1, cId2;
775  if (vComm->GetSize() == 1)
776  {
777  cId1 = it->second->begin()->first;
778  cId2 = bregions.find(region2ID)->second->begin()->first;
779  }
780  else
781  {
782  cId1 = bndRegOrder.find(region1ID)->second[0];
783  cId2 = bndRegOrder.find(region2ID)->second[0];
784  }
785 
786  ASSERTL0(it->second->size() == 1,
787  "Boundary region "+boost::lexical_cast<string>(
788  region1ID)+" should only contain 1 composite.");
789 
790  // Construct set containing all periodic edges on this process
791  SpatialDomains::Composite c = it->second->begin()->second;
792 
793  vector<unsigned int> tmpOrder;
794 
795  for (i = 0; i < c->size(); ++i)
796  {
798  boost::dynamic_pointer_cast<
799  SpatialDomains::SegGeom>((*c)[i]);
800  ASSERTL0(segGeom, "Unable to cast to shared ptr");
801 
803  graph2D->GetElementsFromEdge(segGeom);
804  ASSERTL0(elmt->size() == 1,
805  "The periodic boundaries belong to "
806  "more than one element of the mesh");
807 
809  boost::dynamic_pointer_cast<SpatialDomains::Geometry2D>(
810  (*elmt)[0]->m_Element);
811 
812  allEdges[(*c)[i]->GetGlobalID()] =
813  geom->GetEorient((*elmt)[0]->m_EdgeIndx);
814 
815  // In serial mesh partitioning will not have occurred so
816  // need to fill composite ordering map manually.
817  if (vComm->GetSize() == 1)
818  {
819  tmpOrder.push_back((*c)[i]->GetGlobalID());
820  }
821 
822  vector<int> vertList(2);
823  vertList[0] = segGeom->GetVid(0);
824  vertList[1] = segGeom->GetVid(1);
825  allVerts[(*c)[i]->GetGlobalID()] = vertList;
826  }
827 
828  if (vComm->GetSize() == 1)
829  {
830  compOrder[it->second->begin()->first] = tmpOrder;
831  }
832 
833  // See if we already have either region1 or region2 stored in
834  // perComps map.
835  if (perComps.count(cId1) == 0)
836  {
837  if (perComps.count(cId2) == 0)
838  {
839  perComps[cId1] = cId2;
840  }
841  else
842  {
843  std::stringstream ss;
844  ss << "Boundary region " << cId2 << " should be "
845  << "periodic with " << perComps[cId2] << " but "
846  << "found " << cId1 << " instead!";
847  ASSERTL0(perComps[cId2] == cId1, ss.str());
848  }
849  }
850  else
851  {
852  std::stringstream ss;
853  ss << "Boundary region " << cId1 << " should be "
854  << "periodic with " << perComps[cId1] << " but "
855  << "found " << cId2 << " instead!";
856  ASSERTL0(perComps[cId1] == cId1, ss.str());
857  }
858  }
859 
860  // Process local edge list to obtain relative edge orientations.
861  int n = vComm->GetSize();
862  int p = vComm->GetRank();
863  int totEdges;
864  Array<OneD, int> edgecounts(n,0);
865  Array<OneD, int> edgeoffset(n,0);
866  Array<OneD, int> vertoffset(n,0);
867 
868  edgecounts[p] = allEdges.size();
869  vComm->AllReduce(edgecounts, LibUtilities::ReduceSum);
870 
871  edgeoffset[0] = 0;
872  for (i = 1; i < n; ++i)
873  {
874  edgeoffset[i] = edgeoffset[i-1] + edgecounts[i-1];
875  }
876 
877  totEdges = Vmath::Vsum(n, edgecounts, 1);
878  Array<OneD, int> edgeIds (totEdges, 0);
879  Array<OneD, int> edgeOrient(totEdges, 0);
880  Array<OneD, int> edgeVerts (totEdges, 0);
881 
883 
884  for (i = 0, sIt = allEdges.begin(); sIt != allEdges.end(); ++sIt)
885  {
886  edgeIds [edgeoffset[p] + i ] = sIt->first;
887  edgeOrient[edgeoffset[p] + i ] = sIt->second;
888  edgeVerts [edgeoffset[p] + i++] = allVerts[sIt->first].size();
889  }
890 
891  vComm->AllReduce(edgeIds, LibUtilities::ReduceSum);
892  vComm->AllReduce(edgeOrient, LibUtilities::ReduceSum);
893  vComm->AllReduce(edgeVerts, LibUtilities::ReduceSum);
894 
895  // Calculate number of vertices on each processor.
896  Array<OneD, int> procVerts(n,0);
897  int nTotVerts;
898 
899  // Note if there are no periodic edges at all calling Vsum will
900  // cause a segfault.
901  if (totEdges > 0)
902  {
903  nTotVerts = Vmath::Vsum(totEdges, edgeVerts, 1);
904  }
905  else
906  {
907  nTotVerts = 0;
908  }
909 
910  for (i = 0; i < n; ++i)
911  {
912  if (edgecounts[i] > 0)
913  {
914  procVerts[i] = Vmath::Vsum(
915  edgecounts[i], edgeVerts + edgeoffset[i], 1);
916  }
917  else
918  {
919  procVerts[i] = 0;
920  }
921  }
922  vertoffset[0] = 0;
923 
924  for (i = 1; i < n; ++i)
925  {
926  vertoffset[i] = vertoffset[i-1] + procVerts[i-1];
927  }
928 
929  Array<OneD, int> vertIds(nTotVerts, 0);
930  for (i = 0, sIt = allEdges.begin(); sIt != allEdges.end(); ++sIt)
931  {
932  for (j = 0; j < allVerts[sIt->first].size(); ++j)
933  {
934  vertIds[vertoffset[p] + i++] = allVerts[sIt->first][j];
935  }
936  }
937 
938  vComm->AllReduce(vertIds, LibUtilities::ReduceSum);
939 
940  // For simplicity's sake create a map of edge id -> orientation.
941  map<int, StdRegions::Orientation> orientMap;
942  map<int, vector<int> > vertMap;
943 
944  for (cnt = i = 0; i < totEdges; ++i)
945  {
946  ASSERTL0(orientMap.count(edgeIds[i]) == 0,
947  "Already found edge in orientation map!");
948  orientMap[edgeIds[i]] = (StdRegions::Orientation)edgeOrient[i];
949 
950  vector<int> verts(edgeVerts[i]);
951 
952  for (j = 0; j < edgeVerts[i]; ++j)
953  {
954  verts[j] = vertIds[cnt++];
955  }
956  vertMap[edgeIds[i]] = verts;
957  }
958 
959  // Go through list of composites and figure out which edges are
960  // parallel from original ordering in session file. This includes
961  // composites which are not necessarily on this process.
962  map<int,int>::iterator cIt, pIt;
963  map<int,int>::const_iterator oIt;
964 
965  map<int,int> allCompPairs;
966 
967  // Store temporary map of periodic vertices which will hold all
968  // periodic vertices on the entire mesh so that doubly periodic
969  // vertices can be counted properly across partitions. Local
970  // vertices are copied into m_periodicVerts at the end of the
971  // function.
972  PeriodicMap periodicVerts;
973 
974  for (cIt = perComps.begin(); cIt != perComps.end(); ++cIt)
975  {
977  const int id1 = cIt->first;
978  const int id2 = cIt->second;
979  std::string id1s = boost::lexical_cast<string>(id1);
980  std::string id2s = boost::lexical_cast<string>(id2);
981 
982  if (compMap.count(id1) > 0)
983  {
984  c[0] = compMap[id1];
985  }
986 
987  if (compMap.count(id2) > 0)
988  {
989  c[1] = compMap[id2];
990  }
991 
992  ASSERTL0(c[0] || c[1],
993  "Both composites not found on this process!");
994 
995  // Loop over composite ordering to construct list of all
996  // periodic edges regardless of whether they are on this
997  // process.
998  map<int,int> compPairs;
999 
1000  ASSERTL0(compOrder.count(id1) > 0,
1001  "Unable to find composite "+id1s+" in order map.");
1002  ASSERTL0(compOrder.count(id2) > 0,
1003  "Unable to find composite "+id2s+" in order map.");
1004  ASSERTL0(compOrder[id1].size() == compOrder[id2].size(),
1005  "Periodic composites "+id1s+" and "+id2s+
1006  " should have the same number of elements.");
1007  ASSERTL0(compOrder[id1].size() > 0,
1008  "Periodic composites "+id1s+" and "+id2s+
1009  " are empty!");
1010 
1011  // TODO: Add more checks.
1012  for (i = 0; i < compOrder[id1].size(); ++i)
1013  {
1014  int eId1 = compOrder[id1][i];
1015  int eId2 = compOrder[id2][i];
1016 
1017  ASSERTL0(compPairs.count(eId1) == 0,
1018  "Already paired.");
1019 
1020  if (compPairs.count(eId2) != 0)
1021  {
1022  ASSERTL0(compPairs[eId2] == eId1, "Pairing incorrect");
1023  }
1024  compPairs[eId1] = eId2;
1025  }
1026 
1027  // Construct set of all edges that we have locally on this
1028  // processor.
1029  set<int> locEdges;
1030  set<int>::iterator sIt;
1031  for (i = 0; i < 2; ++i)
1032  {
1033  if (!c[i])
1034  {
1035  continue;
1036  }
1037 
1038  if (c[i]->size() > 0)
1039  {
1040  for (j = 0; j < c[i]->size(); ++j)
1041  {
1042  locEdges.insert(c[i]->at(j)->GetGlobalID());
1043  }
1044  }
1045  }
1046 
1047  // Loop over all edges in the geometry composite.
1048  for (pIt = compPairs.begin(); pIt != compPairs.end(); ++pIt)
1049  {
1050  int ids [2] = {pIt->first, pIt->second};
1051  bool local[2] = {locEdges.count(pIt->first) > 0,
1052  locEdges.count(pIt->second) > 0};
1053 
1054  ASSERTL0(orientMap.count(ids[0]) > 0 &&
1055  orientMap.count(ids[1]) > 0,
1056  "Unable to find edge in orientation map.");
1057 
1058  allCompPairs[pIt->first ] = pIt->second;
1059  allCompPairs[pIt->second] = pIt->first;
1060 
1061  for (i = 0; i < 2; ++i)
1062  {
1063  if (!local[i])
1064  {
1065  continue;
1066  }
1067 
1068  int other = (i+1) % 2;
1069 
1071  orientMap[ids[i]] == orientMap[ids[other]] ?
1074 
1075  PeriodicEntity ent(ids [other], o,
1076  local[other]);
1077  m_periodicEdges[ids[i]].push_back(ent);
1078  }
1079 
1080  for (i = 0; i < 2; ++i)
1081  {
1082  int other = (i+1) % 2;
1083 
1085  orientMap[ids[i]] == orientMap[ids[other]] ?
1088 
1089  // Determine periodic vertices.
1090  vector<int> perVerts1 = vertMap[ids[i]];
1091  vector<int> perVerts2 = vertMap[ids[other]];
1092 
1093  map<int, pair<int, bool> > tmpMap;
1094  map<int, pair<int, bool> >::iterator mIt;
1095  if (o == StdRegions::eForwards)
1096  {
1097  tmpMap[perVerts1[0]] = make_pair(
1098  perVerts2[0], locVerts.count(perVerts2[0]) > 0);
1099  tmpMap[perVerts1[1]] = make_pair(
1100  perVerts2[1], locVerts.count(perVerts2[1]) > 0);
1101  }
1102  else
1103  {
1104  tmpMap[perVerts1[0]] = make_pair(
1105  perVerts2[1], locVerts.count(perVerts2[1]) > 0);
1106  tmpMap[perVerts1[1]] = make_pair(
1107  perVerts2[0], locVerts.count(perVerts2[0]) > 0);
1108  }
1109 
1110  for (mIt = tmpMap.begin(); mIt != tmpMap.end(); ++mIt)
1111  {
1112  // See if this vertex has been recorded already.
1113  PeriodicEntity ent2(mIt->second.first,
1115  mIt->second.second);
1116  PeriodicMap::iterator perIt = periodicVerts.find(
1117  mIt->first);
1118 
1119  if (perIt == periodicVerts.end())
1120  {
1121  periodicVerts[mIt->first].push_back(ent2);
1122  perIt = periodicVerts.find(mIt->first);
1123  }
1124  else
1125  {
1126  bool doAdd = true;
1127  for (j = 0; j < perIt->second.size(); ++j)
1128  {
1129  if (perIt->second[j].id == mIt->second.first)
1130  {
1131  doAdd = false;
1132  break;
1133  }
1134  }
1135 
1136  if (doAdd)
1137  {
1138  perIt->second.push_back(ent2);
1139  }
1140  }
1141  }
1142  }
1143  }
1144  }
1145 
1146  Array<OneD, int> pairSizes(n, 0);
1147  pairSizes[p] = allCompPairs.size();
1148  vComm->AllReduce(pairSizes, LibUtilities::ReduceSum);
1149 
1150  int totPairSizes = Vmath::Vsum(n, pairSizes, 1);
1151 
1152  Array<OneD, int> pairOffsets(n, 0);
1153  pairOffsets[0] = 0;
1154 
1155  for (i = 1; i < n; ++i)
1156  {
1157  pairOffsets[i] = pairOffsets[i-1] + pairSizes[i-1];
1158  }
1159 
1160  Array<OneD, int> first (totPairSizes, 0);
1161  Array<OneD, int> second(totPairSizes, 0);
1162 
1163  cnt = pairOffsets[p];
1164 
1165  for (pIt = allCompPairs.begin(); pIt != allCompPairs.end(); ++pIt)
1166  {
1167  first [cnt ] = pIt->first;
1168  second[cnt++] = pIt->second;
1169  }
1170 
1171  vComm->AllReduce(first, LibUtilities::ReduceSum);
1172  vComm->AllReduce(second, LibUtilities::ReduceSum);
1173 
1174  allCompPairs.clear();
1175 
1176  for(cnt = 0; cnt < totPairSizes; ++cnt)
1177  {
1178  allCompPairs[first[cnt]] = second[cnt];
1179  }
1180 
1181  // Search for periodic vertices and edges which are not in
1182  // a periodic composite but lie in this process. First, loop
1183  // over all information we have from other processors.
1184  for (cnt = i = 0; i < totEdges; ++i)
1185  {
1186  int edgeId = edgeIds[i];
1187 
1188  ASSERTL0(allCompPairs.count(edgeId) > 0,
1189  "Unable to find matching periodic edge.");
1190 
1191  int perEdgeId = allCompPairs[edgeId];
1192 
1193  for (j = 0; j < edgeVerts[i]; ++j, ++cnt)
1194  {
1195  int vId = vertIds[cnt];
1196 
1197  PeriodicMap::iterator perId = periodicVerts.find(vId);
1198 
1199  if (perId == periodicVerts.end())
1200  {
1201  // This vertex is not included in the map. Figure
1202  // out which vertex it is supposed to be periodic
1203  // with. perEdgeId is the edge ID which is periodic with
1204  // edgeId. The logic is much the same as the loop above.
1205  int perVertexId =
1206  orientMap[edgeId] == orientMap[perEdgeId] ?
1207  vertMap[perEdgeId][(j+1)%2] : vertMap[perEdgeId][j];
1208 
1209  PeriodicEntity ent(perVertexId,
1211  locVerts.count(perVertexId) > 0);
1212 
1213  periodicVerts[vId].push_back(ent);
1214  }
1215  }
1216  }
1217 
1218  // Loop over all periodic vertices to complete connectivity
1219  // information.
1220  PeriodicMap::iterator perIt, perIt2;
1221  for (perIt = periodicVerts.begin();
1222  perIt != periodicVerts.end(); ++perIt)
1223  {
1224  // Loop over associated vertices.
1225  for (i = 0; i < perIt->second.size(); ++i)
1226  {
1227  perIt2 = periodicVerts.find(perIt->second[i].id);
1228  ASSERTL0(perIt2 != periodicVerts.end(),
1229  "Couldn't find periodic vertex.");
1230 
1231  for (j = 0; j < perIt2->second.size(); ++j)
1232  {
1233  if (perIt2->second[j].id == perIt->first)
1234  {
1235  continue;
1236  }
1237 
1238  bool doAdd = true;
1239  for (k = 0; k < perIt->second.size(); ++k)
1240  {
1241  if (perIt2->second[j].id == perIt->second[k].id)
1242  {
1243  doAdd = false;
1244  break;
1245  }
1246  }
1247 
1248  if (doAdd)
1249  {
1250  perIt->second.push_back(perIt2->second[j]);
1251  }
1252  }
1253  }
1254  }
1255 
1256  // Do one final loop over periodic vertices to remove non-local
1257  // vertices from map.
1258  for (perIt = periodicVerts.begin();
1259  perIt != periodicVerts.end(); ++perIt)
1260  {
1261  if (locVerts.count(perIt->first) > 0)
1262  {
1263  m_periodicVerts.insert(*perIt);
1264  }
1265  }
1266  }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:198
PeriodicMap m_periodicEdges
A map which identifies pairs of periodic edges.
std::map< int, std::vector< unsigned int > > BndRegionOrdering
Definition: MeshPartition.h:54
PeriodicMap m_periodicVerts
A map which identifies groups of periodic vertices.
std::map< int, std::vector< unsigned int > > CompositeOrdering
Definition: MeshPartition.h:53
boost::shared_ptr< MeshGraph2D > MeshGraph2DSharedPtr
Definition: MeshGraph2D.h:238
boost::shared_ptr< Comm > CommSharedPtr
Pointer to a Communicator object.
Definition: Comm.h:55
boost::shared_ptr< SegGeom > SegGeomSharedPtr
Definition: Geometry2D.h:60
std::map< int, BoundaryRegionShPtr > BoundaryRegionCollection
Definition: Conditions.h:217
SpatialDomains::MeshGraphSharedPtr m_graph
Mesh associated with this expansion list.
Definition: ExpList.h:972
LibUtilities::SessionReaderSharedPtr m_session
Session.
Definition: ExpList.h:969
std::map< int, BoundaryConditionMapShPtr > BoundaryConditionCollection
Definition: Conditions.h:226
boost::shared_ptr< GeometryVector > Composite
Definition: MeshGraph.h:114
std::map< int, std::vector< PeriodicEntity > > PeriodicMap
std::map< int, Composite > CompositeMap
Definition: MeshGraph.h:115
boost::shared_ptr< Geometry2D > Geometry2DSharedPtr
Definition: Geometry2D.h:59
boost::shared_ptr< ElementEdgeVector > ElementEdgeVectorSharedPtr
Definition: MeshGraph.h:134
StandardMatrixTag boost::call_traits< LhsDataType >::const_reference rhs typedef NekMatrix< LhsDataType, StandardMatrixTag >::iterator iterator
static SpatialDomains::BoundaryConditionShPtr GetBoundaryCondition(const SpatialDomains::BoundaryConditionCollection &collection, unsigned int index, const std::string &variable)
Definition: ExpList.cpp:3037
boost::shared_ptr< BoundaryConditionBase > BoundaryConditionShPtr
Definition: Conditions.h:219
T Vsum(int n, const T *x, const int incx)
Subtract return sum(x)
Definition: Vmath.cpp:737
struct Nektar::MultiRegions::_PeriodicEntity PeriodicEntity
void Nektar::MultiRegions::DisContField2D::GenerateBoundaryConditionExpansion ( const SpatialDomains::MeshGraphSharedPtr graph2D,
const SpatialDomains::BoundaryConditions bcs,
const std::string &  variable,
const bool  DeclareCoeffPhysArrays = true 
)
protected

This function discretises the boundary conditions by setting up a list of one-dimensional boundary expansions.

According to their boundary region, the separate segmental boundary expansions are bundled together in an object of the class MultiRegions::ExpList1D.

Parameters
graph2DA mesh, containing information about the domain and the spectral/hp element expansion.
bcsAn entity containing information about the boundaries and boundary conditions.
variableAn optional parameter to indicate for which variable the boundary conditions should be discretised.

Definition at line 634 of file DisContField2D.cpp.

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), Nektar::SpatialDomains::eDirichlet, Nektar::SpatialDomains::ePeriodic, Nektar::MultiRegions::ExpList::GetBoundaryCondition(), Nektar::SpatialDomains::BoundaryConditions::GetBoundaryConditions(), Nektar::SpatialDomains::BoundaryConditions::GetBoundaryRegions(), m_bndCondExpansions, m_bndConditions, Nektar::MultiRegions::ExpList::m_session, and Nektar::MultiRegions::ExpList::SetUpPhysNormals().

Referenced by DisContField2D().

639  {
640  int cnt = 0;
644  bcs.GetBoundaryRegions();
645  const SpatialDomains::BoundaryConditionCollection &bconditions =
646  bcs.GetBoundaryConditions();
647  SpatialDomains::BoundaryRegionCollection::const_iterator it;
648 
649  // count the number of non-periodic boundary regions
650  for (it = bregions.begin(); it != bregions.end(); ++it)
651  {
652  bc = GetBoundaryCondition(bconditions, it->first, variable);
653 
654  if (bc->GetBoundaryConditionType() != SpatialDomains::ePeriodic)
655  {
656  cnt++;
657  }
658  }
659 
661  Array<OneD, MultiRegions::ExpListSharedPtr>(cnt);
662  m_bndConditions =
663  Array<OneD, SpatialDomains::BoundaryConditionShPtr>(cnt);
664 
665  cnt = 0;
666 
667  // list non-periodic boundaries
668  for (it = bregions.begin(); it != bregions.end(); ++it)
669  {
670  bc = GetBoundaryCondition(bconditions, it->first, variable);
671 
672  if (bc->GetBoundaryConditionType() != SpatialDomains::ePeriodic)
673  {
675  ::AllocateSharedPtr(m_session, *(it->second), graph2D,
676  DeclareCoeffPhysArrays, variable);
677 
678  m_bndCondExpansions[cnt] = locExpList;
679  m_bndConditions[cnt] = bc;
680 
681 
682  std::string type = m_bndConditions[cnt]->GetUserDefined();
683 
684  // Set up normals on non-Dirichlet boundary
685  // conditions. Second two conditions ideally
686  // should be in local solver setup (when made into factory)
687  if((bc->GetBoundaryConditionType() !=
689  boost::iequals(type,"I") ||
690  boost::iequals(type,"CalcBC"))
691  {
693  }
694 
695  cnt++;
696  }
697  }
698  }
static boost::shared_ptr< DataType > AllocateSharedPtr()
Allocate a shared pointer from the memory pool.
Array< OneD, MultiRegions::ExpListSharedPtr > m_bndCondExpansions
An object which contains the discretised boundary conditions.
boost::shared_ptr< ExpList1D > ExpList1DSharedPtr
Shared pointer to an ExpList1D object.
Definition: ExpList1D.h:50
std::map< int, BoundaryRegionShPtr > BoundaryRegionCollection
Definition: Conditions.h:217
LibUtilities::SessionReaderSharedPtr m_session
Session.
Definition: ExpList.h:969
std::map< int, BoundaryConditionMapShPtr > BoundaryConditionCollection
Definition: Conditions.h:226
Array< OneD, SpatialDomains::BoundaryConditionShPtr > m_bndConditions
An array which contains the information about the boundary condition on the different boundary region...
static SpatialDomains::BoundaryConditionShPtr GetBoundaryCondition(const SpatialDomains::BoundaryConditionCollection &collection, unsigned int index, const std::string &variable)
Definition: ExpList.cpp:3037
boost::shared_ptr< BoundaryConditionBase > BoundaryConditionShPtr
Definition: Conditions.h:219
const Array<OneD, const LibUtilities::BasisSharedPtr>& Nektar::MultiRegions::DisContField2D::GetBase ( ) const
inlineprotected

This function gets the shared point to basis.

Returns
returns the shared pointer to the bases

Definition at line 108 of file DisContField2D.h.

109  {
110  return(m_base);
111  }
Array< OneD, LibUtilities::BasisSharedPtr > m_base
LibUtilities::BasisType Nektar::MultiRegions::DisContField2D::GetBasisType ( const int  dir) const
inlineprotected

This function returns the type of basis used in the dir direction.

The different types of bases implemented in the code are defined in the LibUtilities::BasisType enumeration list. As a result, the function will return one of the types of this enumeration list.

Parameters
dirthe direction
Returns
returns the type of basis used in the dir direction

Definition at line 123 of file DisContField2D.h.

References ASSERTL1.

124  {
125  ASSERTL1(dir < m_base.num_elements(), "dir is larger than m_numbases");
126  return(m_base[dir]->GetBasisType());
127  }
LibUtilities::BasisType GetBasisType(const int dir) const
This function returns the type of basis used in the dir direction.
Array< OneD, LibUtilities::BasisSharedPtr > m_base
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Definition: ErrorUtil.hpp:228
GlobalLinSysSharedPtr Nektar::MultiRegions::DisContField2D::GetGlobalBndLinSys ( const GlobalLinSysKey mkey)

Definition at line 349 of file DisContField2D.cpp.

References ASSERTL0, ASSERTL1, Nektar::StdRegions::eHybridDGHelmBndLam, Nektar::MultiRegions::ExpList::GenGlobalBndLinSys(), Nektar::MultiRegions::GlobalLinSysKey::GetGlobalSysSolnType(), Nektar::MultiRegions::GlobalMatrixKey::GetMatrixType(), Nektar::iterator, m_globalBndMat, and m_traceMap.

Referenced by v_HelmSolve().

351  {
352  ASSERTL0(mkey.GetMatrixType() == StdRegions::eHybridDGHelmBndLam,
353  "Routine currently only tested for HybridDGHelmholtz");
354  ASSERTL1(mkey.GetGlobalSysSolnType() ==
355  m_traceMap->GetGlobalSysSolnType(),
356  "The local to global map is not set up for the requested "
357  "solution type");
358 
359  GlobalLinSysSharedPtr glo_matrix;
360  GlobalLinSysMap::iterator matrixIter = m_globalBndMat->find(mkey);
361 
362  if(matrixIter == m_globalBndMat->end())
363  {
364  glo_matrix = GenGlobalBndLinSys(mkey,m_traceMap);
365  (*m_globalBndMat)[mkey] = glo_matrix;
366  }
367  else
368  {
369  glo_matrix = matrixIter->second;
370  }
371 
372  return glo_matrix;
373  }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:198
boost::shared_ptr< GlobalLinSys > GenGlobalBndLinSys(const GlobalLinSysKey &mkey, const AssemblyMapSharedPtr &locToGloMap)
Generate a GlobalLinSys from information provided by the key "mkey" and the mapping provided in LocTo...
Definition: ExpList.cpp:1270
StandardMatrixTag boost::call_traits< LhsDataType >::const_reference rhs typedef NekMatrix< LhsDataType, StandardMatrixTag >::iterator iterator
boost::shared_ptr< GlobalLinSys > GlobalLinSysSharedPtr
Pointer to a GlobalLinSys object.
Definition: GlobalLinSys.h:52
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Definition: ErrorUtil.hpp:228
bool Nektar::MultiRegions::DisContField2D::IsLeftAdjacentEdge ( const int  n,
const int  e 
)
protected

Definition at line 1268 of file DisContField2D.cpp.

References ASSERTL2, Nektar::iterator, m_boundaryEdges, Nektar::MultiRegions::ExpList::m_exp, m_periodicEdges, m_trace, and m_traceMap.

Referenced by SetUpDG(), and v_AddFwdBwdTraceIntegral().

1269  {
1270  set<int>::iterator it;
1272  m_traceMap->GetElmtToTrace()[n][e]->
1273  as<LocalRegions::Expansion1D>();
1274 
1275 
1276  bool fwd = true;
1277  if (traceEl->GetLeftAdjacentElementEdge () == -1 ||
1278  traceEl->GetRightAdjacentElementEdge() == -1)
1279  {
1280  // Boundary edge (1 connected element). Do nothing in
1281  // serial.
1282  it = m_boundaryEdges.find(traceEl->GetElmtId());
1283 
1284  // If the edge does not have a boundary condition set on
1285  // it, then assume it is a partition edge.
1286  if (it == m_boundaryEdges.end())
1287  {
1288  int traceGeomId = traceEl->GetGeom1D()->GetGlobalID();
1290  traceGeomId);
1291 
1292  if (pIt != m_periodicEdges.end() && !pIt->second[0].isLocal)
1293  {
1294  fwd = traceGeomId == min(traceGeomId,pIt->second[0].id);
1295  }
1296  else
1297  {
1298  int offset = m_trace->GetPhys_Offset(traceEl->GetElmtId());
1299 
1300  fwd = m_traceMap->
1301  GetTraceToUniversalMapUnique(offset) >= 0;
1302  }
1303  }
1304  }
1305  else if (traceEl->GetLeftAdjacentElementEdge () != -1 &&
1306  traceEl->GetRightAdjacentElementEdge() != -1)
1307  {
1308  // Non-boundary edge (2 connected elements).
1309  fwd = dynamic_cast<Nektar::StdRegions::StdExpansion*>
1310  (traceEl->GetLeftAdjacentElementExp().get()) ==
1311  (*m_exp)[n].get();
1312  }
1313  else
1314  {
1315  ASSERTL2(false, "Unconnected trace element!");
1316  }
1317 
1318  return fwd;
1319  }
PeriodicMap m_periodicEdges
A map which identifies pairs of periodic edges.
The base class for all shapes.
Definition: StdExpansion.h:69
boost::shared_ptr< LocalRegions::ExpansionVector > m_exp
The list of local expansions.
Definition: ExpList.h:1036
std::set< int > m_boundaryEdges
A set storing the global IDs of any boundary edges.
StandardMatrixTag boost::call_traits< LhsDataType >::const_reference rhs typedef NekMatrix< LhsDataType, StandardMatrixTag >::iterator iterator
#define ASSERTL2(condition, msg)
Assert Level 2 – Debugging which is used FULLDEBUG compilation mode. This level assert is designed t...
Definition: ErrorUtil.hpp:250
boost::shared_ptr< Expansion1D > Expansion1DSharedPtr
Definition: Expansion1D.h:53
NekDouble Nektar::MultiRegions::DisContField2D::L2_DGDeriv ( const int  dir,
const Array< OneD, const NekDouble > &  soln 
)

Calculate the $ L^2 $ error of the $ Q_{\rm dir} $ derivative using the consistent DG evaluation of $ Q_{\rm dir} $.

The solution provided is of the primative variation at the quadrature points and the derivative is compared to the discrete derivative at these points, which is likely to be undesirable unless using a much higher number of quadrature points than the polynomial order used to evaluate $ Q_{\rm dir} $.

Definition at line 1804 of file DisContField2D.cpp.

References Nektar::MultiRegions::ExpList::BwdTrans(), Nektar::MultiRegions::ExpList::GetExpSize(), Nektar::MultiRegions::ExpList::L2(), Nektar::MultiRegions::ExpList::m_coeff_offset, Nektar::MultiRegions::ExpList::m_coeffs, Nektar::MultiRegions::ExpList::m_ncoeffs, Nektar::MultiRegions::ExpList::m_npoints, Nektar::MultiRegions::ExpList::m_offset_elmt_id, Nektar::MultiRegions::ExpList::m_phys, m_trace, m_traceMap, Vmath::Vcopy(), and Vmath::Vsub().

1807  {
1808  int i,e,ncoeff_edge;
1809  Array<OneD, const NekDouble> tmp_coeffs;
1810  Array<OneD, NekDouble> out_d(m_ncoeffs), out_tmp;
1811 
1812  Array<OneD, Array<OneD, LocalRegions::ExpansionSharedPtr> >
1813  &elmtToTrace = m_traceMap->GetElmtToTrace();
1814 
1815  StdRegions::Orientation edgedir;
1816 
1817  int eid,cnt;
1818  int LocBndCoeffs = m_traceMap->GetNumLocalBndCoeffs();
1819  Array<OneD, NekDouble> loc_lambda(LocBndCoeffs), edge_lambda;
1820  m_traceMap->GlobalToLocalBnd(m_trace->GetCoeffs(),loc_lambda);
1821 
1822  edge_lambda = loc_lambda;
1823 
1824  // Calculate Q using standard DG formulation.
1825  for(i = cnt = 0; i < GetExpSize(); ++i)
1826  {
1827  eid = m_offset_elmt_id[i];
1828 
1829  // Probably a better way of setting up lambda than this.
1830  // Note cannot use PutCoeffsInToElmts since lambda space
1831  // is mapped during the solve.
1832  int nEdges = (*m_exp)[i]->GetNedges();
1833  Array<OneD, Array<OneD, NekDouble> > edgeCoeffs(nEdges);
1834 
1835  for(e = 0; e < nEdges; ++e)
1836  {
1837  edgedir = (*m_exp)[eid]->GetEorient(e);
1838  ncoeff_edge = elmtToTrace[eid][e]->GetNcoeffs();
1839  edgeCoeffs[e] = Array<OneD, NekDouble>(ncoeff_edge);
1840  Vmath::Vcopy(ncoeff_edge, edge_lambda, 1, edgeCoeffs[e], 1);
1841  elmtToTrace[eid][e]->SetCoeffsToOrientation(
1842  edgedir, edgeCoeffs[e], edgeCoeffs[e]);
1843  edge_lambda = edge_lambda + ncoeff_edge;
1844  }
1845 
1846  (*m_exp)[eid]->DGDeriv(dir,
1847  tmp_coeffs=m_coeffs+m_coeff_offset[eid],
1848  elmtToTrace[eid],
1849  edgeCoeffs,
1850  out_tmp = out_d+cnt);
1851  cnt += (*m_exp)[eid]->GetNcoeffs();
1852  }
1853 
1854  BwdTrans(out_d,m_phys);
1855  Vmath::Vsub(m_npoints,m_phys,1,soln,1,m_phys,1);
1856  return L2(m_phys);
1857  }
void BwdTrans(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, CoeffState coeffstate=eLocal)
Definition: ExpList.h:1699
Array< OneD, NekDouble > m_phys
The global expansion evaluated at the quadrature points.
Definition: ExpList.h:1015
Array< OneD, NekDouble > m_coeffs
Concatenation of all local expansion coefficients.
Definition: ExpList.h:998
int GetExpSize(void)
This function returns the number of elements in the expansion.
Definition: ExpList.h:2054
Array< OneD, int > m_coeff_offset
Offset of elemental data into the array m_coeffs.
Definition: ExpList.h:1047
int m_ncoeffs
The total number of local degrees of freedom. m_ncoeffs .
Definition: ExpList.h:976
Array< OneD, int > m_offset_elmt_id
Array containing the element id m_offset_elmt_id[n] that the n^th consecutive block of data in m_coef...
Definition: ExpList.h:1058
void Vsub(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Subtract vector z = x-y.
Definition: Vmath.cpp:343
NekDouble L2(const Array< OneD, const NekDouble > &inarray, const Array< OneD, const NekDouble > &soln=NullNekDouble1DArray)
This function calculates the error with respect to soln of the global spectral/hp element approximat...
Definition: ExpList.h:528
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1061
bool Nektar::MultiRegions::DisContField2D::SameTypeOfBoundaryConditions ( const DisContField2D In)
protected

For each boundary region, checks that the types and number of boundary expansions in that region match.

Parameters
InContField2D to compare with.
Returns
True if boundary conditions match.

Definition at line 589 of file DisContField2D.cpp.

References Nektar::MultiRegions::ExpList::GetExpSize(), m_bndCondExpansions, m_bndConditions, Nektar::MultiRegions::ExpList::m_comm, and Nektar::LibUtilities::ReduceMin.

Referenced by Nektar::MultiRegions::ContField2D::ContField2D(), and DisContField2D().

591  {
592  int i;
593  bool returnval = true;
594 
595  for(i = 0; i < m_bndConditions.num_elements(); ++i)
596  {
597 
598  // check to see if boundary condition type is the same
599  // and there are the same number of boundary
600  // conditions in the boundary definition.
601  if((m_bndConditions[i]->GetBoundaryConditionType()
602  != In.m_bndConditions[i]->GetBoundaryConditionType())||
604  != In.m_bndCondExpansions[i]->GetExpSize()))
605  {
606  returnval = false;
607  break;
608  }
609  }
610 
611  // Compare with all other processes. Return true only if all
612  // processes report having the same boundary conditions.
613  int vSame = (returnval?1:0);
614  m_comm->GetRowComm()->AllReduce(vSame, LibUtilities::ReduceMin);
615 
616  return (vSame == 1);
617  }
int GetExpSize(void)
This function returns the number of elements in the expansion.
Definition: ExpList.h:2054
Array< OneD, MultiRegions::ExpListSharedPtr > m_bndCondExpansions
An object which contains the discretised boundary conditions.
Array< OneD, SpatialDomains::BoundaryConditionShPtr > m_bndConditions
An array which contains the information about the boundary condition on the different boundary region...
LibUtilities::CommSharedPtr m_comm
Communicator.
Definition: ExpList.h:966
void Nektar::MultiRegions::DisContField2D::SetUpDG ( const std::string  variable = "DefaultVar")
protected

Set up all DG member variables and maps.

Definition at line 378 of file DisContField2D.cpp.

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), ASSERTL1, Nektar::StdRegions::eForwards, Nektar::SpatialDomains::ePeriodic, Nektar::MultiRegions::_PeriodicEntity::id, IsLeftAdjacentEdge(), Nektar::MultiRegions::_PeriodicEntity::isLocal, Nektar::iterator, m_bndCondExpansions, m_bndConditions, m_boundaryEdges, Nektar::MultiRegions::ExpList::m_exp, m_globalBndMat, Nektar::MultiRegions::ExpList::m_graph, m_leftAdjacentEdges, m_locTraceToTraceMap, m_periodicBwdCopy, m_periodicEdges, m_periodicFwdCopy, Nektar::MultiRegions::ExpList::m_session, m_trace, m_traceMap, Nektar::MultiRegions::NullExpListSharedPtr, Nektar::MultiRegions::_PeriodicEntity::orient, and Nektar::MultiRegions::ExpList::SetUpPhysNormals().

Referenced by DisContField2D(), and v_GetTrace().

379  {
380  // Check for multiple calls
382  {
383  return;
384  }
385 
386  ExpList1DSharedPtr trace;
388  boost::dynamic_pointer_cast<SpatialDomains::MeshGraph2D>(
389  m_graph);
390 
391  // Set up matrix map
394 
395  // Set up trace space
398  graph2D, m_periodicEdges);
399 
400  m_trace = boost::dynamic_pointer_cast<ExpList>(trace);
402  AllocateSharedPtr(m_session, graph2D, trace, *this,
405  variable);
406 
407  if (m_session->DefinesCmdLineArgument("verbose"))
408  {
409  m_traceMap->PrintStats(std::cout, variable);
410  }
411 
412  Array<OneD, Array<OneD, LocalRegions::ExpansionSharedPtr> >
413  &elmtToTrace = m_traceMap->GetElmtToTrace();
414 
415  // Scatter trace segments to 2D elements. For each element,
416  // we find the trace segment associated to each edge. The
417  // element then retains a pointer to the trace space segments,
418  // to ensure uniqueness of normals when retrieving from two
419  //adjoining elements which do not lie in a plane.
420  for (int i = 0; i < m_exp->size(); ++i)
421  {
422  for (int j = 0; j < (*m_exp)[i]->GetNedges(); ++j)
423  {
425  (*m_exp)[i]->as<LocalRegions::Expansion2D>();
427  elmtToTrace[i][j]->as<LocalRegions::Expansion1D>();
428  LocalRegions::ExpansionSharedPtr exp = elmtToTrace[i][j];;
429  exp2d->SetEdgeExp (j, exp1d);
430  exp1d->SetAdjacentElementExp(j, exp2d);
431  }
432  }
433 
434  // Set up physical normals
436 
437  // Set up information for parallel and periodic problems.
438  for (int i = 0; i < m_trace->GetExpSize(); ++i)
439  {
441  m_trace->GetExp(i)->as<LocalRegions::Expansion1D>();
442 
443  int offset = m_trace->GetPhys_Offset(i);
444  int traceGeomId = traceEl->GetGeom1D()->GetGlobalID();
445  PeriodicMap::iterator pIt = m_periodicEdges.find(traceGeomId);
446 
447  if (pIt != m_periodicEdges.end() && !pIt->second[0].isLocal)
448  {
449  if (traceGeomId != min(pIt->second[0].id, traceGeomId))
450  {
451  traceEl->GetLeftAdjacentElementExp()->NegateEdgeNormal(
452  traceEl->GetLeftAdjacentElementEdge());
453  }
454  }
455  else if (m_traceMap->GetTraceToUniversalMapUnique(offset) < 0)
456  {
457  traceEl->GetLeftAdjacentElementExp()->NegateEdgeNormal(
458  traceEl->GetLeftAdjacentElementEdge());
459  }
460  }
461 
462  int cnt, n, e;
463 
464  // Identify boundary edges
465  for (cnt = 0, n = 0; n < m_bndCondExpansions.num_elements(); ++n)
466  {
467  if (m_bndConditions[n]->GetBoundaryConditionType() !=
469  {
470  for (e = 0; e < m_bndCondExpansions[n]->GetExpSize(); ++e)
471  {
472  m_boundaryEdges.insert(
473  m_traceMap->GetBndCondTraceToGlobalTraceMap(cnt+e));
474  }
475  }
476  cnt += m_bndCondExpansions[n]->GetExpSize();
477  }
478 
479  // Set up information for periodic boundary conditions.
480  boost::unordered_map<int,pair<int,int> > perEdgeToExpMap;
481  boost::unordered_map<int,pair<int,int> >::iterator it2;
482  for (cnt = n = 0; n < m_exp->size(); ++n)
483  {
484  for (e = 0; e < (*m_exp)[n]->GetNedges(); ++e, ++cnt)
485  {
487  (*m_exp)[n]->GetGeom()->GetEid(e));
488 
489  if (it != m_periodicEdges.end())
490  {
491  perEdgeToExpMap[it->first] = make_pair(n, e);
492  }
493  }
494  }
495 
496  // Set up left-adjacent edge list.
497  m_leftAdjacentEdges.resize(cnt);
498  cnt = 0;
499  for (int i = 0; i < m_exp->size(); ++i)
500  {
501  for (int j = 0; j < (*m_exp)[i]->GetNedges(); ++j, ++cnt)
502  {
504  }
505  }
506 
507  // Set up mapping to copy Fwd of periodic bcs to Bwd of other edge.
508  cnt = 0;
509  for (int n = 0; n < m_exp->size(); ++n)
510  {
511  for (int e = 0; e < (*m_exp)[n]->GetNedges(); ++e, ++cnt)
512  {
513  int edgeGeomId = (*m_exp)[n]->GetGeom()->GetEid(e);
514  int offset = m_trace->GetPhys_Offset(
515  elmtToTrace[n][e]->GetElmtId());
516 
517  // Check to see if this face is periodic.
518  PeriodicMap::iterator it = m_periodicEdges.find(edgeGeomId);
519 
520  if (it != m_periodicEdges.end())
521  {
522  const PeriodicEntity &ent = it->second[0];
523  it2 = perEdgeToExpMap.find(ent.id);
524 
525  if (it2 == perEdgeToExpMap.end())
526  {
527  if (m_session->GetComm()->
528  GetRowComm()->GetSize() > 1 && !ent.isLocal)
529  {
530  continue;
531  }
532  else
533  {
534  ASSERTL1(false, "Periodic edge not found!");
535  }
536  }
537 
539  "Periodic edge in non-forward space?");
540 
541  int offset2 = m_trace->GetPhys_Offset(
542  elmtToTrace[it2->second.first][it2->second.second]->
543  GetElmtId());
544 
545  // Calculate relative orientations between edges to
546  // calculate copying map.
547  int nquad = elmtToTrace[n][e]->GetNumPoints(0);
548 
549  vector<int> tmpBwd(nquad);
550  vector<int> tmpFwd(nquad);
551 
552  if (ent.orient == StdRegions::eForwards)
553  {
554  for (int i = 0; i < nquad; ++i)
555  {
556  tmpBwd[i] = offset2 + i;
557  tmpFwd[i] = offset + i;
558  }
559  }
560  else
561  {
562  for (int i = 0; i < nquad; ++i)
563  {
564  tmpBwd[i] = offset2 + i;
565  tmpFwd[i] = offset + nquad - i - 1;
566  }
567  }
568 
569  for (int i = 0; i < nquad; ++i)
570  {
571  m_periodicFwdCopy.push_back(tmpFwd[i]);
572  m_periodicBwdCopy.push_back(tmpBwd[i]);
573  }
574  }
575  }
576  }
577 
579  AllocateSharedPtr(*this, m_trace, elmtToTrace,
581  }
ExpList()
The default constructor.
Definition: ExpList.cpp:95
static ExpListSharedPtr NullExpListSharedPtr
Definition: ExpList.h:1485
static boost::shared_ptr< DataType > AllocateSharedPtr()
Allocate a shared pointer from the memory pool.
std::vector< int > m_periodicFwdCopy
A vector indicating degress of freedom which need to be copied from forwards to backwards space in ca...
PeriodicMap m_periodicEdges
A map which identifies pairs of periodic edges.
boost::shared_ptr< MeshGraph2D > MeshGraph2DSharedPtr
Definition: MeshGraph2D.h:238
LocTraceToTraceMapSharedPtr m_locTraceToTraceMap
Array< OneD, MultiRegions::ExpListSharedPtr > m_bndCondExpansions
An object which contains the discretised boundary conditions.
boost::shared_ptr< LocalRegions::ExpansionVector > m_exp
The list of local expansions.
Definition: ExpList.h:1036
boost::shared_ptr< ExpList1D > ExpList1DSharedPtr
Shared pointer to an ExpList1D object.
Definition: ExpList1D.h:50
std::set< int > m_boundaryEdges
A set storing the global IDs of any boundary edges.
SpatialDomains::MeshGraphSharedPtr m_graph
Mesh associated with this expansion list.
Definition: ExpList.h:972
LibUtilities::SessionReaderSharedPtr m_session
Session.
Definition: ExpList.h:969
boost::shared_ptr< Expansion > ExpansionSharedPtr
Definition: Expansion.h:68
Array< OneD, SpatialDomains::BoundaryConditionShPtr > m_bndConditions
An array which contains the information about the boundary condition on the different boundary region...
bool IsLeftAdjacentEdge(const int n, const int e)
StandardMatrixTag boost::call_traits< LhsDataType >::const_reference rhs typedef NekMatrix< LhsDataType, StandardMatrixTag >::iterator iterator
struct Nektar::MultiRegions::_PeriodicEntity PeriodicEntity
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Definition: ErrorUtil.hpp:228
boost::shared_ptr< Expansion1D > Expansion1DSharedPtr
Definition: Expansion1D.h:53
boost::shared_ptr< Expansion2D > Expansion2DSharedPtr
Definition: Expansion1D.h:49
void Nektar::MultiRegions::DisContField2D::v_AddFwdBwdTraceIntegral ( const Array< OneD, const NekDouble > &  Fwd,
const Array< OneD, const NekDouble > &  Bwd,
Array< OneD, NekDouble > &  outarray 
)
protectedvirtual

Add trace contributions into elemental coefficient spaces.

Given some quantity $ \vec{q} $, calculate the elemental integral

\[ \int_{\Omega^e} \vec{q}, \mathrm{d}S \]

and adds this to the coefficient space provided by outarray. The value of q is determined from the routine IsLeftAdjacentEdge() which if true we use Fwd else we use Bwd

See also
Expansion2D::AddEdgeNormBoundaryInt
Parameters
FwdThe trace quantities associated with left (fwd) adjancent elmt.
BwdThe trace quantities associated with right (bwd) adjacent elet.
outarrayResulting 2D coefficient space.

Reimplemented from Nektar::MultiRegions::ExpList.

Definition at line 1637 of file DisContField2D.cpp.

References Nektar::MultiRegions::ExpList::GetCoeff_Offset(), Nektar::MultiRegions::ExpList::GetExpSize(), Nektar::MultiRegions::ExpList::GetTrace(), IsLeftAdjacentEdge(), and m_traceMap.

1641  {
1642  int e,n,offset, t_offset;
1643  Array<OneD, NekDouble> e_outarray;
1644  Array<OneD, Array<OneD, LocalRegions::ExpansionSharedPtr> >
1645  &elmtToTrace = m_traceMap->GetElmtToTrace();
1646 
1647  for (n = 0; n < GetExpSize(); ++n)
1648  {
1649  offset = GetCoeff_Offset(n);
1650  for (e = 0; e < (*m_exp)[n]->GetNedges(); ++e)
1651  {
1652  t_offset = GetTrace()->GetPhys_Offset(
1653  elmtToTrace[n][e]->GetElmtId());
1654 
1655  // Evaluate upwind flux less local edge
1656  if (IsLeftAdjacentEdge(n, e))
1657  {
1658  (*m_exp)[n]->AddEdgeNormBoundaryInt(
1659  e, elmtToTrace[n][e], Fwd+t_offset,
1660  e_outarray = outarray+offset);
1661  }
1662  else
1663  {
1664  (*m_exp)[n]->AddEdgeNormBoundaryInt(
1665  e, elmtToTrace[n][e], Bwd+t_offset,
1666  e_outarray = outarray+offset);
1667  }
1668 
1669  }
1670  }
1671  }
int GetCoeff_Offset(int n) const
Get the start offset position for a global list of m_coeffs correspoinding to element n...
Definition: ExpList.h:2084
int GetExpSize(void)
This function returns the number of elements in the expansion.
Definition: ExpList.h:2054
boost::shared_ptr< ExpList > & GetTrace()
Definition: ExpList.h:2159
bool IsLeftAdjacentEdge(const int n, const int e)
void Nektar::MultiRegions::DisContField2D::v_AddTraceIntegral ( const Array< OneD, const NekDouble > &  Fx,
const Array< OneD, const NekDouble > &  Fy,
Array< OneD, NekDouble > &  outarray 
)
protectedvirtual

Reimplemented from Nektar::MultiRegions::ExpList.

Definition at line 1533 of file DisContField2D.cpp.

References Nektar::MultiRegions::ExpList::GetCoeff_Offset(), Nektar::MultiRegions::ExpList::GetExpSize(), Nektar::MultiRegions::ExpList::GetTrace(), and m_traceMap.

1537  {
1538  int e, n, offset, t_offset;
1539  Array<OneD, NekDouble> e_outarray;
1540  Array<OneD, Array<OneD, LocalRegions::ExpansionSharedPtr> >
1541  &elmtToTrace = m_traceMap->GetElmtToTrace();
1542 
1543  for(n = 0; n < GetExpSize(); ++n)
1544  {
1545  offset = GetCoeff_Offset(n);
1546  for(e = 0; e < (*m_exp)[n]->GetNedges(); ++e)
1547  {
1548  t_offset = GetTrace()->GetPhys_Offset(
1549  elmtToTrace[n][e]->GetElmtId());
1550 
1551  (*m_exp)[n]->AddEdgeNormBoundaryInt(
1552  e,elmtToTrace[n][e],
1553  Fx + t_offset,
1554  Fy + t_offset,
1555  e_outarray = outarray+offset);
1556  }
1557  }
1558  }
int GetCoeff_Offset(int n) const
Get the start offset position for a global list of m_coeffs correspoinding to element n...
Definition: ExpList.h:2084
int GetExpSize(void)
This function returns the number of elements in the expansion.
Definition: ExpList.h:2054
boost::shared_ptr< ExpList > & GetTrace()
Definition: ExpList.h:2159
void Nektar::MultiRegions::DisContField2D::v_AddTraceIntegral ( const Array< OneD, const NekDouble > &  Fn,
Array< OneD, NekDouble > &  outarray 
)
protectedvirtual

Add trace contributions into elemental coefficient spaces.

Given some quantity $ \vec{Fn} $, which conatins this routine calculates the integral

\[ \int_{\Omega^e} \vec{Fn}, \mathrm{d}S \]

and adds this to the coefficient space provided by outarray.

See also
Expansion2D::AddEdgeNormBoundaryInt
Parameters
FnThe trace quantities.
outarrayResulting 2D coefficient space.

Reimplemented from Nektar::MultiRegions::ExpList.

Definition at line 1577 of file DisContField2D.cpp.

References Nektar::LibUtilities::eGauss_Lagrange, Nektar::MultiRegions::ExpList::GetCoeff_Offset(), Nektar::MultiRegions::ExpList::GetExpSize(), Nektar::MultiRegions::ExpList::GetTrace(), m_locTraceToTraceMap, m_trace, and m_traceMap.

1580  {
1581  // Basis definition on each element
1582  LibUtilities::BasisSharedPtr basis = (*m_exp)[0]->GetBasis(0);
1583  if (basis->GetBasisType() != LibUtilities::eGauss_Lagrange)
1584  {
1585  Array<OneD, NekDouble> Fcoeffs(m_trace->GetNcoeffs());
1586  m_trace->IProductWRTBase(Fn, Fcoeffs);
1587 
1588  m_locTraceToTraceMap->AddTraceCoeffsToFieldCoeffs(Fcoeffs,
1589  outarray);
1590  }
1591  else
1592  {
1593  int e, n, offset, t_offset;
1594  Array<OneD, NekDouble> e_outarray;
1595  Array<OneD, Array<OneD, LocalRegions::ExpansionSharedPtr> >
1596  &elmtToTrace = m_traceMap->GetElmtToTrace();
1597 
1598  for(n = 0; n < GetExpSize(); ++n)
1599  {
1600  offset = GetCoeff_Offset(n);
1601  for(e = 0; e < (*m_exp)[n]->GetNedges(); ++e)
1602  {
1603  t_offset = GetTrace()->GetPhys_Offset(
1604  elmtToTrace[n][e]->GetElmtId());
1605  (*m_exp)[n]->AddEdgeNormBoundaryInt(
1606  e, elmtToTrace[n][e],
1607  Fn+t_offset,
1608  e_outarray = outarray+offset);
1609  }
1610  }
1611  }
1612  }
int GetCoeff_Offset(int n) const
Get the start offset position for a global list of m_coeffs correspoinding to element n...
Definition: ExpList.h:2084
Lagrange Polynomials using the Gauss points .
Definition: BasisType.h:54
int GetExpSize(void)
This function returns the number of elements in the expansion.
Definition: ExpList.h:2054
boost::shared_ptr< ExpList > & GetTrace()
Definition: ExpList.h:2159
LocTraceToTraceMapSharedPtr m_locTraceToTraceMap
boost::shared_ptr< Basis > BasisSharedPtr
void Nektar::MultiRegions::DisContField2D::v_EvaluateBoundaryConditions ( const NekDouble  time = 0.0,
const std::string  varName = "",
const NekDouble  x2_in = NekConstants::kNekUnsetDouble,
const NekDouble  x3_in = NekConstants::kNekUnsetDouble 
)
protectedvirtual

Evaluates the boundary condition expansions, bndCondExpansions, given the information provided by bndConditions.

Parameters
timeThe time at which the boundary conditions should be evaluated.
bndCondExpansionsList of boundary conditions.
bndConditionsInformation about the boundary conditions.

This will only be undertaken for time dependent boundary conditions unless time == 0.0 which is the case when the method is called from the constructor.

Reimplemented from Nektar::MultiRegions::ExpList.

Definition at line 2253 of file DisContField2D.cpp.

References ASSERTL0, Nektar::SpatialDomains::eDirichlet, Nektar::SpatialDomains::eNeumann, Nektar::SpatialDomains::eRobin, Nektar::LibUtilities::Equation::Evaluate(), Nektar::MultiRegions::ExpList::ExtractFileBCs(), Vmath::Fill(), Nektar::NekConstants::kNekUnsetDouble, m_bndCondExpansions, m_bndConditions, Nektar::SpatialDomains::DirichletBoundaryCondition::m_filename, Nektar::SpatialDomains::NeumannBoundaryCondition::m_filename, and Nektar::SpatialDomains::RobinBoundaryCondition::m_filename.

2258  {
2259  int i;
2260  int npoints;
2261  int nbnd = m_bndCondExpansions.num_elements();
2262 
2263  MultiRegions::ExpListSharedPtr locExpList;
2264 
2265  for (i = 0; i < nbnd; ++i)
2266  {
2267  if (time == 0.0 ||
2268  m_bndConditions[i]->IsTimeDependent())
2269  {
2270  locExpList = m_bndCondExpansions[i];
2271  npoints = locExpList->GetNpoints();
2272  Array<OneD, NekDouble> x0(npoints, 0.0);
2273  Array<OneD, NekDouble> x1(npoints, 0.0);
2274  Array<OneD, NekDouble> x2(npoints, 0.0);
2275 
2276  // Homogeneous input case for x2.
2277  if (x2_in == NekConstants::kNekUnsetDouble)
2278  {
2279  locExpList->GetCoords(x0, x1, x2);
2280  }
2281  else
2282  {
2283  locExpList->GetCoords(x0, x1, x2);
2284  Vmath::Fill(npoints, x2_in, x2, 1);
2285  }
2286 
2287  if (m_bndConditions[i]->GetBoundaryConditionType()
2289  {
2291  = boost::static_pointer_cast<
2292  SpatialDomains::DirichletBoundaryCondition>(
2293  m_bndConditions[i]);
2294  string filebcs = bcPtr->m_filename;
2295 
2296  if (filebcs != "")
2297  {
2298  ExtractFileBCs(filebcs, bcPtr->m_comm, varName, locExpList);
2299  }
2300  else
2301  {
2302  LibUtilities::Equation condition =
2303  boost::static_pointer_cast<
2304  SpatialDomains::DirichletBoundaryCondition>
2305  (m_bndConditions[i])->
2306  m_dirichletCondition;
2307 
2308  condition.Evaluate(x0, x1, x2, time,
2309  locExpList->UpdatePhys());
2310  }
2311 
2312  locExpList->FwdTrans_BndConstrained(
2313  locExpList->GetPhys(),
2314  locExpList->UpdateCoeffs());
2315  }
2316  else if (m_bndConditions[i]->GetBoundaryConditionType()
2318  {
2319  SpatialDomains::NeumannBCShPtr bcPtr = boost::static_pointer_cast<
2320  SpatialDomains::NeumannBoundaryCondition>(
2321  m_bndConditions[i]);
2322  string filebcs = bcPtr->m_filename;
2323  if (filebcs != "")
2324  {
2325  ExtractFileBCs(filebcs, bcPtr->m_comm, varName, locExpList);
2326  }
2327  else
2328  {
2329  LibUtilities::Equation condition =
2330  boost::static_pointer_cast<
2331  SpatialDomains::NeumannBoundaryCondition>
2332  (m_bndConditions[i])->
2333  m_neumannCondition;
2334  condition.Evaluate(x0, x1, x2, time,
2335  locExpList->UpdatePhys());
2336  }
2337 
2338  locExpList->IProductWRTBase(
2339  locExpList->GetPhys(),
2340  locExpList->UpdateCoeffs());
2341  }
2342  else if (m_bndConditions[i]->GetBoundaryConditionType()
2344  {
2345  SpatialDomains::RobinBCShPtr bcPtr = boost::static_pointer_cast<
2346  SpatialDomains::RobinBoundaryCondition>
2347  (m_bndConditions[i]);
2348  string filebcs = bcPtr->m_filename;
2349 
2350  if (filebcs != "")
2351  {
2352  ExtractFileBCs(filebcs, bcPtr->m_comm, varName, locExpList);
2353  }
2354  else
2355  {
2356  LibUtilities::Equation condition =
2357  boost::static_pointer_cast<
2358  SpatialDomains::RobinBoundaryCondition>
2359  (m_bndConditions[i])->
2360  m_robinFunction;
2361  condition.Evaluate(x0, x1, x2, time,
2362  locExpList->UpdatePhys());
2363  }
2364 
2365  locExpList->IProductWRTBase(
2366  locExpList->GetPhys(),
2367  locExpList->UpdateCoeffs());
2368  }
2369  else
2370  {
2371  ASSERTL0(false, "This type of BC not implemented yet");
2372  }
2373  }
2374  else if (boost::iequals(m_bndConditions[i]->GetUserDefined(),
2375  "MovingBody"))
2376  {
2377  locExpList = m_bndCondExpansions[i];
2378  if (m_bndConditions[i]->GetBoundaryConditionType()
2380  {
2381  locExpList->FwdTrans_IterPerExp(
2382  locExpList->GetPhys(),
2383  locExpList->UpdateCoeffs());
2384  }
2385  else
2386  {
2387  ASSERTL0(false, "This type of BC not implemented yet");
2388  }
2389  }
2390  }
2391  }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:198
void ExtractFileBCs(const std::string &fileName, LibUtilities::CommSharedPtr comm, const std::string &varName, const boost::shared_ptr< ExpList > locExpList)
Definition: ExpList.cpp:1987
void Fill(int n, const T alpha, T *x, const int incx)
Fill a vector with a constant value.
Definition: Vmath.cpp:46
boost::shared_ptr< NeumannBoundaryCondition > NeumannBCShPtr
Definition: Conditions.h:221
boost::shared_ptr< DirichletBoundaryCondition > DirichletBCShPtr
Definition: Conditions.h:220
Array< OneD, MultiRegions::ExpListSharedPtr > m_bndCondExpansions
An object which contains the discretised boundary conditions.
boost::shared_ptr< ExpList > ExpListSharedPtr
Shared pointer to an ExpList object.
Array< OneD, SpatialDomains::BoundaryConditionShPtr > m_bndConditions
An array which contains the information about the boundary condition on the different boundary region...
static const NekDouble kNekUnsetDouble
boost::shared_ptr< RobinBoundaryCondition > RobinBCShPtr
Definition: Conditions.h:222
void Nektar::MultiRegions::DisContField2D::v_ExtractTracePhys ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray 
)
protectedvirtual

This method extracts the trace (edges in 2D) from the field inarray and puts the values in outarray.

It assumes the field is C0 continuous so that it can overwrite the edge data when visited by the two adjacent elements.

Parameters
inarrayAn array containing the 2D data from which we wish to extract the edge data.
outarrayThe resulting edge information.

Reimplemented from Nektar::MultiRegions::ExpList.

Definition at line 1503 of file DisContField2D.cpp.

References ASSERTL1, Nektar::MultiRegions::ExpList::GetExpSize(), Nektar::MultiRegions::ExpList::GetPhys_Offset(), m_trace, and m_traceMap.

Referenced by v_ExtractTracePhys().

1506  {
1507  // Loop over elemente and collect forward expansion
1508  int nexp = GetExpSize();
1509  int n, e, offset, phys_offset;
1510  Array<OneD,NekDouble> e_tmp;
1511  Array<OneD, Array<OneD, LocalRegions::ExpansionSharedPtr> >
1512  &elmtToTrace = m_traceMap->GetElmtToTrace();
1513 
1514  ASSERTL1(outarray.num_elements() >= m_trace->GetNpoints(),
1515  "input array is of insufficient length");
1516 
1517  // use m_trace tmp space in element to fill values
1518  for(n = 0; n < nexp; ++n)
1519  {
1520  phys_offset = GetPhys_Offset(n);
1521 
1522  for(e = 0; e < (*m_exp)[n]->GetNedges(); ++e)
1523  {
1524  offset = m_trace->GetPhys_Offset(
1525  elmtToTrace[n][e]->GetElmtId());
1526  (*m_exp)[n]->GetEdgePhysVals(e, elmtToTrace[n][e],
1527  inarray + phys_offset,
1528  e_tmp = outarray + offset);
1529  }
1530  }
1531  }
int GetPhys_Offset(int n) const
Get the start offset position for a global list of m_phys correspoinding to element n...
Definition: ExpList.h:2092
int GetExpSize(void)
This function returns the number of elements in the expansion.
Definition: ExpList.h:2054
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Definition: ErrorUtil.hpp:228
void Nektar::MultiRegions::DisContField2D::v_ExtractTracePhys ( Array< OneD, NekDouble > &  outarray)
protectedvirtual

Reimplemented from Nektar::MultiRegions::ExpList.

Definition at line 1483 of file DisContField2D.cpp.

References ASSERTL1, Nektar::MultiRegions::ExpList::m_phys, Nektar::MultiRegions::ExpList::m_physState, and v_ExtractTracePhys().

1485  {
1486  ASSERTL1(m_physState == true,
1487  "Field must be in physical state to extract trace space.");
1488 
1489  v_ExtractTracePhys(m_phys, outarray);
1490  }
virtual void v_ExtractTracePhys(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray)
This method extracts the trace (edges in 2D) from the field inarray and puts the values in outarray...
Array< OneD, NekDouble > m_phys
The global expansion evaluated at the quadrature points.
Definition: ExpList.h:1015
bool m_physState
The state of the array m_phys.
Definition: ExpList.h:1024
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
Definition: ErrorUtil.hpp:228
void Nektar::MultiRegions::DisContField2D::v_GeneralMatrixOp ( const GlobalMatrixKey gkey,
const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray,
CoeffState  coeffstate = eLocal 
)
protectedvirtual

Calculates the result of the multiplication of a global matrix of type specified by mkey with a vector given by inarray.

Parameters
mkeyKey representing desired matrix multiplication.
inarrayInput vector.
outarrayResulting multiplication.

Reimplemented from Nektar::MultiRegions::ExpList.

Reimplemented in Nektar::MultiRegions::ContField2D.

Definition at line 2009 of file DisContField2D.cpp.

References Nektar::eWrapper, Nektar::MultiRegions::ExpList::GetBlockMatrix(), and m_traceMap.

2014  {
2015  int LocBndCoeffs = m_traceMap->GetNumLocalBndCoeffs();
2016  Array<OneD, NekDouble> loc_lambda(LocBndCoeffs);
2017  DNekVec LocLambda(LocBndCoeffs,loc_lambda,eWrapper);
2018  const DNekScalBlkMatSharedPtr& HDGHelm = GetBlockMatrix(gkey);
2019 
2020  m_traceMap->GlobalToLocalBnd(inarray, loc_lambda);
2021  LocLambda = (*HDGHelm) * LocLambda;
2022  m_traceMap->AssembleBnd(loc_lambda,outarray);
2023  }
const DNekScalBlkMatSharedPtr & GetBlockMatrix(const GlobalMatrixKey &gkey)
Definition: ExpList.cpp:890
boost::shared_ptr< DNekScalBlkMat > DNekScalBlkMatSharedPtr
Definition: NekTypeDefs.hpp:74
NekVector< NekDouble > DNekVec
Definition: NekTypeDefs.hpp:49
virtual const Array<OneD,const MultiRegions::ExpListSharedPtr>& Nektar::MultiRegions::DisContField2D::v_GetBndCondExpansions ( void  )
inlineprotectedvirtual

Reimplemented from Nektar::MultiRegions::ExpList.

Definition at line 268 of file DisContField2D.h.

References m_bndCondExpansions.

269  {
270  return m_bndCondExpansions;
271  }
Array< OneD, MultiRegions::ExpListSharedPtr > m_bndCondExpansions
An object which contains the discretised boundary conditions.
virtual const Array<OneD,const SpatialDomains::BoundaryConditionShPtr>& Nektar::MultiRegions::DisContField2D::v_GetBndConditions ( void  )
inlineprotectedvirtual

Reimplemented from Nektar::MultiRegions::ExpList.

Reimplemented in Nektar::MultiRegions::ContField2D.

Definition at line 275 of file DisContField2D.h.

References m_bndConditions.

276  {
277  return m_bndConditions;
278  }
Array< OneD, SpatialDomains::BoundaryConditionShPtr > m_bndConditions
An array which contains the information about the boundary condition on the different boundary region...
void Nektar::MultiRegions::DisContField2D::v_GetBndElmtExpansion ( int  i,
boost::shared_ptr< ExpList > &  result,
const bool  DeclareCoeffPhysArrays 
)
protectedvirtual

Reimplemented from Nektar::MultiRegions::ExpList.

Definition at line 1731 of file DisContField2D.cpp.

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), Nektar::MultiRegions::ExpList::GetBoundaryToElmtMap(), Nektar::MultiRegions::ExpList::GetCoeff_Offset(), Nektar::MultiRegions::ExpList::GetCoeffs(), Nektar::MultiRegions::ExpList::GetExp(), Nektar::MultiRegions::ExpList::GetPhys(), Nektar::MultiRegions::ExpList::GetPhys_Offset(), m_bndCondExpansions, and Vmath::Vcopy().

1734  {
1735  int n, cnt, nq;
1736  int offsetOld, offsetNew;
1737  std::vector<unsigned int> eIDs;
1738 
1739  Array<OneD, int> ElmtID,EdgeID;
1740  GetBoundaryToElmtMap(ElmtID,EdgeID);
1741 
1742  // Skip other boundary regions
1743  for (cnt = n = 0; n < i; ++n)
1744  {
1745  cnt += m_bndCondExpansions[n]->GetExpSize();
1746  }
1747 
1748  // Populate eIDs with information from BoundaryToElmtMap
1749  for (n = 0; n < m_bndCondExpansions[i]->GetExpSize(); ++n)
1750  {
1751  eIDs.push_back(ElmtID[cnt+n]);
1752  }
1753 
1754  // Create expansion list
1755  result =
1757  (*this, eIDs, DeclareCoeffPhysArrays);
1758 
1759  // Copy phys and coeffs to new explist
1760  if( DeclareCoeffPhysArrays)
1761  {
1762  Array<OneD, NekDouble> tmp1, tmp2;
1763  for (n = 0; n < result->GetExpSize(); ++n)
1764  {
1765  nq = GetExp(ElmtID[cnt+n])->GetTotPoints();
1766  offsetOld = GetPhys_Offset(ElmtID[cnt+n]);
1767  offsetNew = result->GetPhys_Offset(n);
1768  Vmath::Vcopy(nq, tmp1 = GetPhys()+ offsetOld, 1,
1769  tmp2 = result->UpdatePhys()+ offsetNew, 1);
1770 
1771  nq = GetExp(ElmtID[cnt+n])->GetNcoeffs();
1772  offsetOld = GetCoeff_Offset(ElmtID[cnt+n]);
1773  offsetNew = result->GetCoeff_Offset(n);
1774  Vmath::Vcopy(nq, tmp1 = GetCoeffs()+ offsetOld, 1,
1775  tmp2 = result->UpdateCoeffs()+ offsetNew, 1);
1776  }
1777  }
1778  }
const Array< OneD, const NekDouble > & GetCoeffs() const
This function returns (a reference to) the array (implemented as m_coeffs) containing all local expa...
Definition: ExpList.h:1946
int GetCoeff_Offset(int n) const
Get the start offset position for a global list of m_coeffs correspoinding to element n...
Definition: ExpList.h:2084
static boost::shared_ptr< DataType > AllocateSharedPtr()
Allocate a shared pointer from the memory pool.
int GetPhys_Offset(int n) const
Get the start offset position for a global list of m_phys correspoinding to element n...
Definition: ExpList.h:2092
const boost::shared_ptr< LocalRegions::ExpansionVector > GetExp() const
This function returns the vector of elements in the expansion.
Definition: ExpList.h:2075
void GetBoundaryToElmtMap(Array< OneD, int > &ElmtID, Array< OneD, int > &EdgeID)
Definition: ExpList.h:2302
Array< OneD, MultiRegions::ExpListSharedPtr > m_bndCondExpansions
An object which contains the discretised boundary conditions.
const Array< OneD, const NekDouble > & GetPhys() const
This function returns (a reference to) the array (implemented as m_phys) containing the function ev...
Definition: ExpList.h:2045
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1061
void Nektar::MultiRegions::DisContField2D::v_GetBoundaryToElmtMap ( Array< OneD, int > &  ElmtID,
Array< OneD, int > &  EdgeID 
)
protectedvirtual

Set up a list of element IDs and edge IDs that link to the boundary conditions.

Reimplemented from Nektar::MultiRegions::ExpList.

Definition at line 1677 of file DisContField2D.cpp.

References Nektar::MultiRegions::ExpList::GetExpSize(), m_BCtoEdgMap, m_BCtoElmMap, m_bndCondExpansions, m_bndConditions, and Nektar::MultiRegions::ExpList::m_graph.

1680  {
1681  if (m_BCtoElmMap.num_elements() == 0)
1682  {
1683  map<int, int> globalIdMap;
1684  int i,n;
1685  int cnt;
1686  int nbcs = 0;
1687 
1689  boost::dynamic_pointer_cast<SpatialDomains::MeshGraph2D>(
1690  m_graph);
1691 
1692  // Populate global ID map (takes global geometry ID to local
1693  // expansion list ID).
1694  for (i = 0; i < GetExpSize(); ++i)
1695  {
1696  globalIdMap[(*m_exp)[i]->GetGeom()->GetGlobalID()] = i;
1697  }
1698 
1699  // Determine number of boundary condition expansions.
1700  for(i = 0; i < m_bndConditions.num_elements(); ++i)
1701  {
1702  nbcs += m_bndCondExpansions[i]->GetExpSize();
1703  }
1704 
1705  // Initialize arrays
1706  m_BCtoElmMap = Array<OneD, int>(nbcs);
1707  m_BCtoEdgMap = Array<OneD, int>(nbcs);
1708 
1710  for (cnt = n = 0; n < m_bndCondExpansions.num_elements(); ++n)
1711  {
1712  for (i = 0; i < m_bndCondExpansions[n]->GetExpSize();
1713  ++i, ++cnt)
1714  {
1715  exp1d = m_bndCondExpansions[n]->GetExp(i)->
1716  as<LocalRegions::Expansion1D>();
1717  // Use edge to element map from MeshGraph2D.
1719  graph2D->GetElementsFromEdge(exp1d->GetGeom1D());
1720 
1721  m_BCtoElmMap[cnt] = globalIdMap[(*tmp)[0]->
1722  m_Element->GetGlobalID()];
1723  m_BCtoEdgMap[cnt] = (*tmp)[0]->m_EdgeIndx;
1724  }
1725  }
1726  }
1727  ElmtID = m_BCtoElmMap;
1728  EdgeID = m_BCtoEdgMap;
1729  }
boost::shared_ptr< MeshGraph2D > MeshGraph2DSharedPtr
Definition: MeshGraph2D.h:238
int GetExpSize(void)
This function returns the number of elements in the expansion.
Definition: ExpList.h:2054
Array< OneD, MultiRegions::ExpListSharedPtr > m_bndCondExpansions
An object which contains the discretised boundary conditions.
SpatialDomains::MeshGraphSharedPtr m_graph
Mesh associated with this expansion list.
Definition: ExpList.h:972
Array< OneD, SpatialDomains::BoundaryConditionShPtr > m_bndConditions
An array which contains the information about the boundary condition on the different boundary region...
boost::shared_ptr< ElementEdgeVector > ElementEdgeVectorSharedPtr
Definition: MeshGraph.h:134
boost::shared_ptr< Expansion1D > Expansion1DSharedPtr
Definition: Expansion1D.h:53
void Nektar::MultiRegions::DisContField2D::v_GetFwdBwdTracePhys ( const Array< OneD, const NekDouble > &  field,
Array< OneD, NekDouble > &  Fwd,
Array< OneD, NekDouble > &  Bwd 
)
protectedvirtual

This method extracts the "forward" and "backward" trace data from the array field and puts the data into output vectors Fwd and Bwd.

We first define the convention which defines "forwards" and "backwards". First an association is made between the edge of each element and its corresponding edge in the trace space using the mapping m_traceMap. The element can either be left-adjacent or right-adjacent to this trace edge (see Expansion1D::GetLeftAdjacentElementExp). Boundary edges are always left-adjacent since left-adjacency is populated first.

If the element is left-adjacent we extract the edge trace data from field into the forward trace space Fwd; otherwise, we place it in the backwards trace space Bwd. In this way, we form a unique set of trace normals since these are always extracted from left-adjacent elements.

Parameters
fieldis a NekDouble array which contains the 2D data from which we wish to extract the backward and forward orientated trace/edge arrays.
FwdThe resulting forwards space.
BwdThe resulting backwards space.

Reimplemented from Nektar::MultiRegions::ExpList.

Definition at line 1357 of file DisContField2D.cpp.

References ASSERTL0, Nektar::SpatialDomains::eDirichlet, Nektar::LibUtilities::eGauss_Lagrange, Nektar::SpatialDomains::eNeumann, Nektar::SpatialDomains::ePeriodic, Nektar::SpatialDomains::eRobin, Nektar::MultiRegions::ExpList::GetExpSize(), Nektar::MultiRegions::ExpList::GetPhys(), Nektar::MultiRegions::ExpList::GetPhys_Offset(), Nektar::iterator, m_bndCondExpansions, m_bndConditions, m_leftAdjacentEdges, m_locTraceToTraceMap, m_periodicBwdCopy, m_periodicFwdCopy, m_trace, m_traceMap, npts, Vmath::Vcopy(), and Vmath::Zero().

Referenced by v_GetFwdBwdTracePhys().

1361  {
1362  int cnt, n, e, npts, phys_offset;
1363 
1364  // Zero forward/backward vectors.
1365  Vmath::Zero(Fwd.num_elements(), Fwd, 1);
1366  Vmath::Zero(Bwd.num_elements(), Bwd, 1);
1367 
1368  // Basis definition on each element
1369  LibUtilities::BasisSharedPtr basis = (*m_exp)[0]->GetBasis(0);
1370  if (basis->GetBasisType() != LibUtilities::eGauss_Lagrange)
1371  {
1372 
1373  // blocked routine
1374  Array<OneD, NekDouble> edgevals(m_locTraceToTraceMap->
1375  GetNLocTracePts());
1376 
1377  m_locTraceToTraceMap->LocTracesFromField(field, edgevals);
1378  m_locTraceToTraceMap->InterpLocEdgesToTrace(0, edgevals, Fwd);
1379 
1380  Array<OneD, NekDouble> invals = edgevals + m_locTraceToTraceMap->
1381  GetNFwdLocTracePts();
1382  m_locTraceToTraceMap->InterpLocEdgesToTrace(1, invals, Bwd);
1383  }
1384  else
1385  {
1386  // Loop over elements and collect forward expansion
1387  int nexp = GetExpSize();
1388  Array<OneD,NekDouble> e_tmp;
1390  boost::unordered_map<int,pair<int,int> >::iterator it3;
1392 
1393  Array<OneD, Array<OneD, LocalRegions::ExpansionSharedPtr> >
1394  &elmtToTrace = m_traceMap->GetElmtToTrace();
1395 
1396  for(cnt = n = 0; n < nexp; ++n)
1397  {
1398  exp2d = (*m_exp)[n]->as<LocalRegions::Expansion2D>();
1399  phys_offset = GetPhys_Offset(n);
1400 
1401  for(e = 0; e < exp2d->GetNedges(); ++e, ++cnt)
1402  {
1403  int offset = m_trace->GetPhys_Offset(
1404  elmtToTrace[n][e]->GetElmtId());
1405 
1406  if (m_leftAdjacentEdges[cnt])
1407  {
1408  exp2d->GetEdgePhysVals(e, elmtToTrace[n][e],
1409  field + phys_offset,
1410  e_tmp = Fwd + offset);
1411  }
1412  else
1413  {
1414  exp2d->GetEdgePhysVals(e, elmtToTrace[n][e],
1415  field + phys_offset,
1416  e_tmp = Bwd + offset);
1417  }
1418 
1419  }
1420  }
1421  }
1422 
1423  // Fill boundary conditions into missing elements
1424  int id1, id2 = 0;
1425 
1426  for (cnt = n = 0; n < m_bndCondExpansions.num_elements(); ++n)
1427  {
1428  if (m_bndConditions[n]->GetBoundaryConditionType() ==
1430  {
1431  for (e = 0; e < m_bndCondExpansions[n]->GetExpSize(); ++e)
1432  {
1433  npts = m_bndCondExpansions[n]->GetExp(e)->GetNumPoints(0);
1434  id1 = m_bndCondExpansions[n]->GetPhys_Offset(e);
1435  id2 = m_trace->GetPhys_Offset(m_traceMap->
1436  GetBndCondTraceToGlobalTraceMap(cnt+e));
1437  Vmath::Vcopy(npts,
1438  &(m_bndCondExpansions[n]->GetPhys())[id1], 1,
1439  &Bwd[id2], 1);
1440  }
1441 
1442  cnt += e;
1443  }
1444  else if (m_bndConditions[n]->GetBoundaryConditionType() ==
1446  m_bndConditions[n]->GetBoundaryConditionType() ==
1448  {
1449  for(e = 0; e < m_bndCondExpansions[n]->GetExpSize(); ++e)
1450  {
1451  npts = m_bndCondExpansions[n]->GetExp(e)->GetNumPoints(0);
1452  id1 = m_bndCondExpansions[n]->GetPhys_Offset(e);
1453  ASSERTL0((m_bndCondExpansions[n]->GetPhys())[id1]==0.0,
1454  "Method not set up for non-zero Neumann "
1455  "boundary condition");
1456  id2 = m_trace->GetPhys_Offset(
1457  m_traceMap->GetBndCondTraceToGlobalTraceMap(cnt+e));
1458  Vmath::Vcopy(npts, &Fwd[id2], 1, &Bwd[id2], 1);
1459  }
1460 
1461  cnt += e;
1462  }
1463  else if (m_bndConditions[n]->GetBoundaryConditionType() !=
1465  {
1466  ASSERTL0(false,
1467  "Method not set up for this boundary condition.");
1468  }
1469  }
1470 
1471  // Copy any periodic boundary conditions.
1472  for (n = 0; n < m_periodicFwdCopy.size(); ++n)
1473  {
1474  Bwd[m_periodicBwdCopy[n]] = Fwd[m_periodicFwdCopy[n]];
1475  }
1476 
1477  // Do parallel exchange for forwards/backwards spaces.
1478  m_traceMap->UniversalTraceAssemble(Fwd);
1479  m_traceMap->UniversalTraceAssemble(Bwd);
1480  }
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:198
int GetPhys_Offset(int n) const
Get the start offset position for a global list of m_phys correspoinding to element n...
Definition: ExpList.h:2092
std::vector< int > m_periodicFwdCopy
A vector indicating degress of freedom which need to be copied from forwards to backwards space in ca...
Lagrange Polynomials using the Gauss points .
Definition: BasisType.h:54
int GetExpSize(void)
This function returns the number of elements in the expansion.
Definition: ExpList.h:2054
LocTraceToTraceMapSharedPtr m_locTraceToTraceMap
Array< OneD, MultiRegions::ExpListSharedPtr > m_bndCondExpansions
An object which contains the discretised boundary conditions.
static std::string npts
Definition: InputFld.cpp:43
Array< OneD, SpatialDomains::BoundaryConditionShPtr > m_bndConditions
An array which contains the information about the boundary condition on the different boundary region...
const Array< OneD, const NekDouble > & GetPhys() const
This function returns (a reference to) the array (implemented as m_phys) containing the function ev...
Definition: ExpList.h:2045
StandardMatrixTag boost::call_traits< LhsDataType >::const_reference rhs typedef NekMatrix< LhsDataType, StandardMatrixTag >::iterator iterator
boost::shared_ptr< Basis > BasisSharedPtr
void Zero(int n, T *x, const int incx)
Zero vector.
Definition: Vmath.cpp:373
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)
Definition: Vmath.cpp:1061
boost::shared_ptr< Expansion2D > Expansion2DSharedPtr
Definition: Expansion1D.h:49
void Nektar::MultiRegions::DisContField2D::v_GetFwdBwdTracePhys ( Array< OneD, NekDouble > &  Fwd,
Array< OneD, NekDouble > &  Bwd 
)
protectedvirtual

Reimplemented from Nektar::MultiRegions::ExpList.

Definition at line 1325 of file DisContField2D.cpp.

References Nektar::MultiRegions::ExpList::m_phys, and v_GetFwdBwdTracePhys().

1328  {
1329  v_GetFwdBwdTracePhys(m_phys, Fwd, Bwd);
1330  }
Array< OneD, NekDouble > m_phys
The global expansion evaluated at the quadrature points.
Definition: ExpList.h:1015
virtual void v_GetFwdBwdTracePhys(const Array< OneD, const NekDouble > &field, Array< OneD, NekDouble > &Fwd, Array< OneD, NekDouble > &Bwd)
This method extracts the "forward" and "backward" trace data from the array field and puts the data i...
virtual void Nektar::MultiRegions::DisContField2D::v_GetPeriodicEntities ( PeriodicMap periodicVerts,
PeriodicMap periodicEdges,
PeriodicMap periodicFaces 
)
inlineprotectedvirtual

Obtain a copy of the periodic edges and vertices for this field.

Reimplemented from Nektar::MultiRegions::ExpList.

Definition at line 252 of file DisContField2D.h.

References m_periodicEdges, and m_periodicVerts.

256  {
257  periodicVerts = m_periodicVerts;
258  periodicEdges = m_periodicEdges;
259  }
PeriodicMap m_periodicEdges
A map which identifies pairs of periodic edges.
PeriodicMap m_periodicVerts
A map which identifies groups of periodic vertices.
map< int, RobinBCInfoSharedPtr > Nektar::MultiRegions::DisContField2D::v_GetRobinBCInfo ( void  )
protectedvirtual

Search through the edge expansions and identify which ones have Robin/Mixed type boundary conditions.

If a Robin boundary is found then store the edge ID of the boundary condition and the array of points of the physical space boundary condition which are hold the boundary condition primitive variable coefficient at the quatrature points

Returns
A map containing the Robin boundary condition information using a key of the element ID.

Reimplemented from Nektar::MultiRegions::ExpList.

Definition at line 2037 of file DisContField2D.cpp.

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), Nektar::SpatialDomains::eRobin, Nektar::LibUtilities::Equation::Evaluate(), Nektar::MultiRegions::ExpList::GetBoundaryToElmtMap(), m_bndCondExpansions, and m_bndConditions.

2038  {
2039  int i,cnt;
2040  map<int, RobinBCInfoSharedPtr> returnval;
2041  Array<OneD, int> ElmtID,EdgeID;
2042  GetBoundaryToElmtMap(ElmtID,EdgeID);
2043 
2044  for(cnt = i = 0; i < m_bndCondExpansions.num_elements(); ++i)
2045  {
2046  MultiRegions::ExpListSharedPtr locExpList;
2047 
2048  if(m_bndConditions[i]->GetBoundaryConditionType() ==
2050  {
2051  int e,elmtid;
2052  Array<OneD, NekDouble> Array_tmp;
2053 
2054  locExpList = m_bndCondExpansions[i];
2055 
2056  int npoints = locExpList->GetNpoints();
2057  Array<OneD, NekDouble> x0(npoints, 0.0);
2058  Array<OneD, NekDouble> x1(npoints, 0.0);
2059  Array<OneD, NekDouble> x2(npoints, 0.0);
2060  Array<OneD, NekDouble> coeffphys(npoints);
2061 
2062  locExpList->GetCoords(x0, x1, x2);
2063 
2064  LibUtilities::Equation coeffeqn =
2065  boost::static_pointer_cast<
2066  SpatialDomains::RobinBoundaryCondition>
2067  (m_bndConditions[i])->m_robinPrimitiveCoeff;
2068 
2069  // evalaute coefficient
2070  coeffeqn.Evaluate(x0, x1, x2, 0.0, coeffphys);
2071 
2072  for(e = 0; e < locExpList->GetExpSize(); ++e)
2073  {
2074  RobinBCInfoSharedPtr rInfo =
2077  EdgeID[cnt+e],
2078  Array_tmp = coeffphys +
2079  locExpList->GetPhys_Offset(e));
2080 
2081  elmtid = ElmtID[cnt+e];
2082  // make link list if necessary
2083  if(returnval.count(elmtid) != 0)
2084  {
2085  rInfo->next = returnval.find(elmtid)->second;
2086  }
2087  returnval[elmtid] = rInfo;
2088  }
2089  }
2090  cnt += m_bndCondExpansions[i]->GetExpSize();
2091  }
2092 
2093  return returnval;
2094  }
static boost::shared_ptr< DataType > AllocateSharedPtr()
Allocate a shared pointer from the memory pool.
boost::shared_ptr< RobinBCInfo > RobinBCInfoSharedPtr
void GetBoundaryToElmtMap(Array< OneD, int > &ElmtID, Array< OneD, int > &EdgeID)
Definition: ExpList.h:2302
Array< OneD, MultiRegions::ExpListSharedPtr > m_bndCondExpansions
An object which contains the discretised boundary conditions.
boost::shared_ptr< ExpList > ExpListSharedPtr
Shared pointer to an ExpList object.
Array< OneD, SpatialDomains::BoundaryConditionShPtr > m_bndConditions
An array which contains the information about the boundary condition on the different boundary region...
virtual ExpListSharedPtr& Nektar::MultiRegions::DisContField2D::v_GetTrace ( )
inlinevirtual

Reimplemented from Nektar::MultiRegions::ExpList.

Definition at line 87 of file DisContField2D.h.

References m_trace, Nektar::MultiRegions::NullExpListSharedPtr, and SetUpDG().

88  {
90  {
91  SetUpDG();
92  }
93 
94  return m_trace;
95  }
static ExpListSharedPtr NullExpListSharedPtr
Definition: ExpList.h:1485
void SetUpDG(const std::string="DefaultVar")
Set up all DG member variables and maps.
virtual AssemblyMapDGSharedPtr& Nektar::MultiRegions::DisContField2D::v_GetTraceMap ( void  )
inlineprotectedvirtual

Reimplemented from Nektar::MultiRegions::ExpList.

Definition at line 262 of file DisContField2D.h.

References m_traceMap.

263  {
264  return m_traceMap;
265  }
void Nektar::MultiRegions::DisContField2D::v_HelmSolve ( const Array< OneD, const NekDouble > &  inarray,
Array< OneD, NekDouble > &  outarray,
const FlagList flags,
const StdRegions::ConstFactorMap factors,
const StdRegions::VarCoeffMap varcoeff,
const Array< OneD, const NekDouble > &  dirForcing,
const bool  PhysSpaceForcing 
)
protectedvirtual

Reimplemented from Nektar::MultiRegions::ExpList.

Reimplemented in Nektar::MultiRegions::ContField2D.

Definition at line 1859 of file DisContField2D.cpp.

References Nektar::SpatialDomains::eDirichlet, Nektar::StdRegions::eHybridDGHelmBndLam, Nektar::StdRegions::eHybridDGLamToU, Nektar::StdRegions::eInvHybridDGHelmholtz, Nektar::eWrapper, Nektar::MultiRegions::ExpList::GetBlockMatrix(), Nektar::MultiRegions::ExpList::GetExpSize(), GetGlobalBndLinSys(), Nektar::MultiRegions::ExpList::GetNcoeffs(), Nektar::MultiRegions::ExpList::IProductWRTBase(), m_bndCondExpansions, m_bndConditions, Nektar::MultiRegions::ExpList::m_ncoeffs, Nektar::MultiRegions::ExpList::m_offset_elmt_id, m_trace, m_traceMap, Vmath::Neg(), Nektar::MultiRegions::NullAssemblyMapSharedPtr, Vmath::Smul(), Nektar::Transpose(), and Vmath::Zero().

1868  {
1869  int i,j,n,cnt,cnt1,nbndry;
1870  int nexp = GetExpSize();
1872 
1873  Array<OneD,NekDouble> f(m_ncoeffs);
1874  DNekVec F(m_ncoeffs,f,eWrapper);
1875  Array<OneD,NekDouble> e_f, e_l;
1876 
1877  //----------------------------------
1878  // Setup RHS Inner product
1879  //----------------------------------
1880  if(PhysSpaceForcing)
1881  {
1882  IProductWRTBase(inarray,f);
1883  Vmath::Neg(m_ncoeffs,f,1);
1884  }
1885  else
1886  {
1887  Vmath::Smul(m_ncoeffs,-1.0,inarray,1,f,1);
1888  }
1889 
1890  //----------------------------------
1891  // Solve continuous flux System
1892  //----------------------------------
1893  int GloBndDofs = m_traceMap->GetNumGlobalBndCoeffs();
1894  int NumDirichlet = m_traceMap->GetNumLocalDirBndCoeffs();
1895  int e_ncoeffs,id;
1896 
1897  // Retrieve block matrix of U^e
1898  GlobalMatrixKey HDGLamToUKey(StdRegions::eHybridDGLamToU,
1899  NullAssemblyMapSharedPtr,factors,varcoeff);
1900  const DNekScalBlkMatSharedPtr &HDGLamToU = GetBlockMatrix(
1901  HDGLamToUKey);
1902 
1903  // Retrieve global trace space storage, \Lambda, from trace
1904  // expansion
1905  Array<OneD,NekDouble> BndSol = m_trace->UpdateCoeffs();
1906 
1907  // Create trace space forcing, F
1908  Array<OneD,NekDouble> BndRhs(GloBndDofs,0.0);
1909 
1910  // Zero \Lambda
1911  Vmath::Zero(GloBndDofs,BndSol,1);
1912 
1913  // Retrieve number of local trace space coefficients N_{\lambda},
1914  // and set up local elemental trace solution \lambda^e.
1915  int LocBndCoeffs = m_traceMap->GetNumLocalBndCoeffs();
1916  Array<OneD, NekDouble> loc_lambda(LocBndCoeffs);
1917  DNekVec LocLambda(LocBndCoeffs,loc_lambda,eWrapper);
1918 
1919  //----------------------------------
1920  // Evaluate Trace Forcing vector F
1921  // Kirby et al, 2010, P23, Step 5.
1922  //----------------------------------
1923  // Loop over all expansions in the domain
1924  for(cnt = cnt1 = n = 0; n < nexp; ++n)
1925  {
1926  nbndry = (*m_exp)[m_offset_elmt_id[n]]->NumDGBndryCoeffs();
1927 
1928  e_ncoeffs = (*m_exp)[m_offset_elmt_id[n]]->GetNcoeffs();
1929  e_f = f + cnt;
1930  e_l = loc_lambda + cnt1;
1931 
1932  // Local trace space \lambda^e
1933  DNekVec Floc (nbndry, e_l, eWrapper);
1934  // Local forcing f^e
1935  DNekVec ElmtFce (e_ncoeffs, e_f, eWrapper);
1936  // Compute local (U^e)^{\top} f^e
1937  Floc = Transpose(*(HDGLamToU->GetBlock(n,n)))*ElmtFce;
1938 
1939  cnt += e_ncoeffs;
1940  cnt1 += nbndry;
1941  }
1942 
1943  // Assemble local \lambda_e into global \Lambda
1944  m_traceMap->AssembleBnd(loc_lambda,BndRhs);
1945 
1946  // Copy Dirichlet boundary conditions and weak forcing into trace
1947  // space
1948  cnt = 0;
1949  for(i = 0; i < m_bndCondExpansions.num_elements(); ++i)
1950  {
1951  if(m_bndConditions[i]->GetBoundaryConditionType() ==
1953  {
1954  for(j = 0; j < (m_bndCondExpansions[i])->GetNcoeffs(); ++j)
1955  {
1956  id = m_traceMap->GetBndCondCoeffsToGlobalCoeffsMap(cnt++);
1957  BndSol[id] = m_bndCondExpansions[i]->GetCoeffs()[j];
1958  }
1959  }
1960  else
1961  {
1962  //Add weak boundary condition to trace forcing
1963  for(j = 0; j < (m_bndCondExpansions[i])->GetNcoeffs(); ++j)
1964  {
1965  id = m_traceMap->GetBndCondCoeffsToGlobalCoeffsMap(cnt++);
1966  BndRhs[id] += m_bndCondExpansions[i]->GetCoeffs()[j];
1967  }
1968  }
1969  }
1970 
1971  //----------------------------------
1972  // Solve trace problem: \Lambda = K^{-1} F
1973  // K is the HybridDGHelmBndLam matrix.
1974  //----------------------------------
1975  if(GloBndDofs - NumDirichlet > 0)
1976  {
1977  GlobalLinSysKey key(StdRegions::eHybridDGHelmBndLam,
1978  m_traceMap,factors,varcoeff);
1980  LinSys->Solve(BndRhs,BndSol,m_traceMap);
1981  }
1982 
1983  //----------------------------------
1984  // Internal element solves
1985  //----------------------------------
1986  GlobalMatrixKey invHDGhelmkey(StdRegions::eInvHybridDGHelmholtz,
1987  NullAssemblyMapSharedPtr,factors,varcoeff);
1988  const DNekScalBlkMatSharedPtr& InvHDGHelm = GetBlockMatrix(
1989  invHDGhelmkey);
1990  DNekVec out(m_ncoeffs,outarray,eWrapper);
1991  Vmath::Zero(m_ncoeffs,outarray,1);
1992 
1993  // get local trace solution from BndSol
1994  m_traceMap->GlobalToLocalBnd(BndSol,loc_lambda);
1995 
1996  // out = u_f + u_lam = (*InvHDGHelm)*f + (LamtoU)*Lam
1997  out = (*InvHDGHelm)*F + (*HDGLamToU)*LocLambda;
1998  }
const DNekScalBlkMatSharedPtr & GetBlockMatrix(const GlobalMatrixKey &gkey)
Definition: ExpList.cpp:890
GlobalLinSysSharedPtr GetGlobalBndLinSys(const GlobalLinSysKey &mkey)
int GetExpSize(void)
This function returns the number of elements in the expansion.
Definition: ExpList.h:2054
Array< OneD, MultiRegions::ExpListSharedPtr > m_bndCondExpansions
An object which contains the discretised boundary conditions.
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*y.
Definition: Vmath.cpp:213
int m_ncoeffs
The total number of local degrees of freedom. m_ncoeffs .
Definition: ExpList.h:976
Array< OneD, int > m_offset_elmt_id
Array containing the element id m_offset_elmt_id[n] that the n^th consecutive block of data in m_coef...
Definition: ExpList.h:1058
boost::shared_ptr< DNekScalBlkMat > DNekScalBlkMatSharedPtr
Definition: NekTypeDefs.hpp:74
NekMatrix< InnerMatrixType, BlockMatrixTag > Transpose(NekMatrix< InnerMatrixType, BlockMatrixTag > &rhs)
void Neg(int n, T *x, const int incx)
Negate x = -x.
Definition: Vmath.cpp:396
Array< OneD, SpatialDomains::BoundaryConditionShPtr > m_bndConditions
An array which contains the information about the boundary condition on the different boundary region...
static AssemblyMapSharedPtr NullAssemblyMapSharedPtr
Definition: AssemblyMap.h:55
NekVector< NekDouble > DNekVec
Definition: NekTypeDefs.hpp:49
void IProductWRTBase(const Array< OneD, const NekDouble > &inarray, Array< OneD, NekDouble > &outarray, CoeffState coeffstate=eLocal)
Definition: ExpList.h:1649
int GetNcoeffs(void) const
Returns the total number of local degrees of freedom .
Definition: ExpList.h:1493
boost::shared_ptr< GlobalLinSys > GlobalLinSysSharedPtr
Pointer to a GlobalLinSys object.
Definition: GlobalLinSys.h:52
void Zero(int n, T *x, const int incx)
Zero vector.
Definition: Vmath.cpp:373
boost::shared_ptr< StdExpansion > StdExpansionSharedPtr
void Nektar::MultiRegions::DisContField2D::v_Reset ( )
protectedvirtual

Reset this field, so that geometry information can be updated.

Reimplemented from Nektar::MultiRegions::ExpList.

Definition at line 1783 of file DisContField2D.cpp.

References m_bndCondExpansions, and Nektar::MultiRegions::ExpList::v_Reset().

1784  {
1785  ExpList::v_Reset();
1786 
1787  // Reset boundary condition expansions.
1788  for (int n = 0; n < m_bndCondExpansions.num_elements(); ++n)
1789  {
1790  m_bndCondExpansions[n]->Reset();
1791  }
1792  }
virtual void v_Reset()
Reset geometry information, metrics, matrix managers and geometry information.
Definition: ExpList.cpp:1513
Array< OneD, MultiRegions::ExpListSharedPtr > m_bndCondExpansions
An object which contains the discretised boundary conditions.
virtual MultiRegions::ExpListSharedPtr& Nektar::MultiRegions::DisContField2D::v_UpdateBndCondExpansion ( int  i)
inlineprotectedvirtual

Reimplemented from Nektar::MultiRegions::ExpList.

Definition at line 281 of file DisContField2D.h.

282  {
283  return m_bndCondExpansions[i];
284  }
Array< OneD, MultiRegions::ExpListSharedPtr > m_bndCondExpansions
An object which contains the discretised boundary conditions.
virtual Array<OneD, SpatialDomains::BoundaryConditionShPtr>& Nektar::MultiRegions::DisContField2D::v_UpdateBndConditions ( )
inlineprotectedvirtual

Reimplemented from Nektar::MultiRegions::ExpList.

Definition at line 287 of file DisContField2D.h.

References m_bndConditions.

288  {
289  return m_bndConditions;
290  }
Array< OneD, SpatialDomains::BoundaryConditionShPtr > m_bndConditions
An array which contains the information about the boundary condition on the different boundary region...

Member Data Documentation

Array<OneD, LibUtilities::BasisSharedPtr> Nektar::MultiRegions::DisContField2D::m_base
protected

Bases needed for the expansion

Definition at line 102 of file DisContField2D.h.

Array<OneD, int> Nektar::MultiRegions::DisContField2D::m_BCtoEdgMap

Definition at line 98 of file DisContField2D.h.

Referenced by v_GetBoundaryToElmtMap().

Array<OneD, int> Nektar::MultiRegions::DisContField2D::m_BCtoElmMap

Definition at line 97 of file DisContField2D.h.

Referenced by v_GetBoundaryToElmtMap().

Array<OneD,MultiRegions::ExpListSharedPtr> Nektar::MultiRegions::DisContField2D::m_bndCondExpansions
protected
Array<OneD,SpatialDomains::BoundaryConditionShPtr> Nektar::MultiRegions::DisContField2D::m_bndConditions
protected
std::set<int> Nektar::MultiRegions::DisContField2D::m_boundaryEdges
protected

A set storing the global IDs of any boundary edges.

Definition at line 164 of file DisContField2D.h.

Referenced by DisContField2D(), IsLeftAdjacentEdge(), and SetUpDG().

Array<OneD,StdRegions::Orientation> Nektar::MultiRegions::DisContField2D::m_edgedir
protected

Definition at line 159 of file DisContField2D.h.

GlobalLinSysMapShPtr Nektar::MultiRegions::DisContField2D::m_globalBndMat
protected

Definition at line 147 of file DisContField2D.h.

Referenced by DisContField2D(), GetGlobalBndLinSys(), and SetUpDG().

std::vector<bool> Nektar::MultiRegions::DisContField2D::m_leftAdjacentEdges
protected

Definition at line 189 of file DisContField2D.h.

Referenced by DisContField2D(), SetUpDG(), and v_GetFwdBwdTracePhys().

LocTraceToTraceMapSharedPtr Nektar::MultiRegions::DisContField2D::m_locTraceToTraceMap
protected

Map of local trace (the points at the face of the element) to the trace space discretisation

Definition at line 155 of file DisContField2D.h.

Referenced by DisContField2D(), SetUpDG(), v_AddTraceIntegral(), and v_GetFwdBwdTracePhys().

Array<OneD, Array<OneD, unsigned int> > Nektar::MultiRegions::DisContField2D::m_mapEdgeToElmn
protected

Definition at line 157 of file DisContField2D.h.

std::vector<int> Nektar::MultiRegions::DisContField2D::m_periodicBwdCopy
protected

Definition at line 183 of file DisContField2D.h.

Referenced by DisContField2D(), SetUpDG(), and v_GetFwdBwdTracePhys().

PeriodicMap Nektar::MultiRegions::DisContField2D::m_periodicEdges
protected

A map which identifies pairs of periodic edges.

Definition at line 174 of file DisContField2D.h.

Referenced by Nektar::MultiRegions::ContField2D::ContField2D(), DisContField2D(), FindPeriodicEdges(), IsLeftAdjacentEdge(), SetUpDG(), and v_GetPeriodicEntities().

std::vector<int> Nektar::MultiRegions::DisContField2D::m_periodicFwdCopy
protected

A vector indicating degress of freedom which need to be copied from forwards to backwards space in case of a periodic boundary condition.

Definition at line 182 of file DisContField2D.h.

Referenced by DisContField2D(), SetUpDG(), and v_GetFwdBwdTracePhys().

PeriodicMap Nektar::MultiRegions::DisContField2D::m_periodicVerts
protected

A map which identifies groups of periodic vertices.

Definition at line 169 of file DisContField2D.h.

Referenced by Nektar::MultiRegions::ContField2D::ContField2D(), DisContField2D(), FindPeriodicEdges(), and v_GetPeriodicEntities().

Array<OneD, Array<OneD, unsigned int> > Nektar::MultiRegions::DisContField2D::m_signEdgeToElmn
protected

Definition at line 158 of file DisContField2D.h.

ExpListSharedPtr Nektar::MultiRegions::DisContField2D::m_trace
protected
AssemblyMapDGSharedPtr Nektar::MultiRegions::DisContField2D::m_traceMap
protected