Files
mfem/mesh/tmesh.hpp
T
2020-03-09 15:36:41 -07:00

82 lines
2.2 KiB
C++

// Copyright (c) 2010-2020, Lawrence Livermore National Security, LLC. Produced
// at the Lawrence Livermore National Laboratory. All Rights reserved. See files
// LICENSE and NOTICE for details. LLNL-CODE-806117.
//
// This file is part of the MFEM library. For more information and source code
// availability visit https://mfem.org.
//
// MFEM is free software; you can redistribute it and/or modify it under the
// terms of the BSD-3 license. We welcome feedback and contributions, see file
// CONTRIBUTING.md for details.
#ifndef MFEM_TEMPLATE_MESH
#define MFEM_TEMPLATE_MESH
#include "../config/tconfig.hpp"
#include "../linalg/tlayout.hpp"
#include "mesh.hpp"
namespace mfem
{
template <typename FESpace,
typename nodeLayout =
VectorLayout<Ordering::byNODES,FESpace::FE_type::dim> >
class TMesh
{
public:
typedef FESpace FESpace_type;
typedef typename FESpace::FE_type FE_type;
typedef nodeLayout nodeLayout_type;
static const int dim = FE_type::dim;
static const int space_dim = nodeLayout::vec_dim;
const Mesh &m_mesh;
const FiniteElementSpace &fes;
const GridFunction &Nodes;
FE_type fe;
FESpace t_fes;
nodeLayout node_layout;
public:
TMesh(const Mesh &mesh)
: m_mesh(mesh), fes(*mesh.GetNodalFESpace()), Nodes(*mesh.GetNodes()),
fe(*fes.FEColl()), t_fes(fe, fes), node_layout(fes)
{
MFEM_STATIC_ASSERT(space_dim != 0, "dynamic space dim is not allowed");
}
int GetNE() const { return m_mesh.GetNE(); }
static bool MatchesGeometry(const Mesh &mesh)
{
if (mesh.Dimension() != dim) { return false; }
if (mesh.SpaceDimension() != space_dim) { return false; }
for (int i = 0; i < mesh.GetNE(); i++)
{
if (mesh.GetElementBaseGeometry(i) != FE_type::geom) { return false; }
}
return true;
}
static bool MatchesNodes(const Mesh &mesh)
{
if (!mesh.GetNodes()) { return false; }
return FESpace::template VectorMatches<nodeLayout>(
*mesh.GetNodalFESpace());
}
static bool Matches(const Mesh &mesh)
{
return MatchesGeometry(mesh) && MatchesNodes(mesh);
}
};
} // namespace mfem
#endif // MFEM_TEMPLATE_MESH