12 #include "../tmop.hpp"
14 #include "../gridfunc.hpp"
15 #include "../kernels.hpp"
16 #include "../../general/forall.hpp"
17 #include "../../linalg/kernels.hpp"
31 constexpr
int DIM = 2;
32 constexpr
int NBZ = 1;
34 const int Q1D = T_Q1D ? T_Q1D : q1d;
39 MFEM_FORALL_2D(e, NE, Q1D, Q1D, NBZ,
41 const int Q1D = T_Q1D ? T_Q1D : q1d;
42 MFEM_FOREACH_THREAD(qy,y,Q1D)
44 MFEM_FOREACH_THREAD(qx,x,Q1D)
63 constexpr
int DIM = 2;
64 constexpr
int NBZ = 1;
66 const double detW = w_.
Det();
67 const int D1D = T_D1D ? T_D1D : d1d;
68 const int Q1D = T_Q1D ? T_Q1D : q1d;
76 MFEM_FORALL_2D(e, NE, Q1D, Q1D, NBZ,
78 const int D1D = T_D1D ? T_D1D : d1d;
79 const int Q1D = T_Q1D ? T_Q1D : q1d;
81 constexpr
int NBZ = 1;
82 constexpr
int MQ1 = T_Q1D ? T_Q1D : T_MAX;
83 constexpr
int MD1 = T_D1D ? T_D1D : T_MAX;
85 MFEM_SHARED
double BG[2][MQ1*MD1];
86 MFEM_SHARED
double XY[2][NBZ][MD1*MD1];
87 MFEM_SHARED
double DQ[4][NBZ][MD1*MQ1];
88 MFEM_SHARED
double QQ[4][NBZ][MQ1*MQ1];
90 kernels::internal::LoadX<MD1,NBZ>(e,D1D,X,XY);
91 kernels::internal::LoadBG<MD1,MQ1>(D1D,Q1D,
b,g,BG);
93 kernels::internal::GradX<MD1,MQ1,NBZ>(D1D,Q1D,BG,XY,DQ);
94 kernels::internal::GradY<MD1,MQ1,NBZ>(D1D,Q1D,BG,DQ,QQ);
96 MFEM_FOREACH_THREAD(qy,y,Q1D)
98 MFEM_FOREACH_THREAD(qx,x,Q1D)
101 const double *Wid = &W(0,0);
102 kernels::internal::PullGrad<MQ1,NBZ>(Q1D,qx,qy,QQ,Jtr);
103 const double detJ = kernels::Det<2>(Jtr);
104 const double alpha = std::pow(detJ/detW,1./2);
118 MFEM_ASSERT(target_type == IDEAL_SHAPE_UNIT_SIZE || nodes !=
nullptr,
"");
119 const Mesh *mesh = fes.GetMesh();
120 const int NE = mesh->
GetNE();
122 if (NE == 0) {
return true; }
125 "mixed meshes are not supported");
126 MFEM_VERIFY(!fes.IsVariableOrder(),
"variable orders are not supported");
131 const DofToQuad &maps = fe.GetDofToQuad(ir, mode);
132 const int D1D = maps.
ndof;
133 const int Q1D = maps.
nqpt;
134 const int id = (D1D << 4 ) | Q1D;
141 case IDEAL_SHAPE_UNIT_SIZE:
143 MFEM_LAUNCH_TMOP_KERNEL(TC_IDEAL_SHAPE_UNIT_SIZE_2D_KERNEL,
146 case IDEAL_SHAPE_EQUAL_SIZE:
return false;
147 case IDEAL_SHAPE_GIVEN_SIZE:
149 MFEM_VERIFY(nodes,
"");
151 const Operator *R = fes.GetElementRestriction(ordering);
155 MFEM_ASSERT(nodes->FESpace()->GetVDim() == 2,
"");
156 MFEM_LAUNCH_TMOP_KERNEL(TC_IDEAL_SHAPE_GIVEN_SIZE_2D_KERNEL,
159 case GIVEN_SHAPE_AND_SIZE:
return false;
160 default:
return false;
Abstract class for all finite elements.
Class for an integration rule - an Array of IntegrationPoint.
Tensor product representation using 1D matrices/tensors with dimensions using 1D number of quadrature...
int GetNumGeometries(int dim) const
Return the number of geometries of the given dimension present in the mesh.
int nqpt
Number of quadrature points. When mode is TENSOR, this is the 1D number.
Data type dense matrix using column-major storage.
int ndof
Number of degrees of freedom = number of basis functions. When mode is TENSOR, this is the 1D number...
int GetNE() const
Returns number of elements.
virtual void Mult(const Vector &x, Vector &y) const =0
Operator application: y=A(x).
virtual void UseDevice(bool use_dev) const
Enable execution of Vector operations using the mfem::Device.
const DenseMatrix & GetGeomToPerfGeomJac(int GeomType) const
int Height() const
Get the height (size of output) of the Operator. Synonym with NumRows().
static MemoryType GetDeviceMemoryType()
Get the current Device MemoryType. This is the MemoryType used by most MFEM classes when allocating m...
MFEM_REGISTER_TMOP_KERNELS(void, DatcSize, const int NE, const int ncomp, const int sizeidx, const DenseMatrix &w_, const Array< double > &b_, const Vector &x_, DenseTensor &j_, const int d1d, const int q1d)
const T * Read(bool on_dev=true) const
Shortcut for mfem::Read(a.GetMemory(), a.Size(), on_dev).
Class FiniteElementSpace - responsible for providing FEM view of the mesh, mainly managing the set of...
Structure representing the matrices/tensors needed to evaluate (in reference space) the values...
Array< double > B
Basis functions evaluated at quadrature points.
Mode
Type of data stored in the arrays B, Bt, G, and Gt.
ElementDofOrdering
Constants describing the possible orderings of the DOFs in one element.
Array< double > G
Gradients/divergences/curls of basis functions evaluated at quadrature points.
Lexicographic ordering for tensor-product FiniteElements.
MFEM_HOST_DEVICE void Set(const int height, const int width, const double alpha, const TA *Adata, TB *Bdata)
Compute B = alpha*A, where the matrices A and B are of size height x width with data Adata and Bdata...
double * Write(bool on_dev=true)
Shortcut for mfem::Write(GetMemory(), TotalSize(), on_dev).
Rank 3 tensor (array of matrices)
virtual const double * Read(bool on_dev=true) const
Shortcut for mfem::Read(vec.GetMemory(), vec.Size(), on_dev).
MFEM_HOST_DEVICE DeviceTensor< sizeof...(Dims), T > Reshape(T *ptr, Dims...dims)
Wrap a pointer as a DeviceTensor with automatically deduced template parameters.
const double * Read(bool on_dev=true) const
Shortcut for mfem::Read( GetMemory(), TotalSize(), on_dev).