Files
mfem/fem/integ/bilininteg_mass_ea.cpp
T
Will Pazner e797278779 Merge remote-tracking branch 'origin/master' into hybridization-gpu
# Conflicts:
#	fem/integ/bilininteg_mass_pa.cpp
#	tests/unit/fem/test_assembly_levels.cpp
2025-02-07 14:24:06 -08:00

95 lines
3.3 KiB
C++

// Copyright (c) 2010-2025, 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.
#include "../../general/forall.hpp"
#include "../bilininteg.hpp"
#include "../gridfunc.hpp"
#include "bilininteg_mass_kernels.hpp"
namespace mfem
{
void MassIntegrator::AssembleEA_(Vector &ea_data,
const bool add)
{
using internal::EAMassAssemble1D;
using internal::EAMassAssemble2D;
using internal::EAMassAssemble3D;
const Array<real_t> &B = maps->B;
if (dim == 1)
{
auto kernel = EAMassAssemble1D<0,0>;
switch ((dofs1D << 4 ) | quad1D)
{
case 0x22: kernel = EAMassAssemble1D<2,2>; break;
case 0x33: kernel = EAMassAssemble1D<3,3>; break;
case 0x44: kernel = EAMassAssemble1D<4,4>; break;
case 0x55: kernel = EAMassAssemble1D<5,5>; break;
case 0x66: kernel = EAMassAssemble1D<6,6>; break;
case 0x77: kernel = EAMassAssemble1D<7,7>; break;
case 0x88: kernel = EAMassAssemble1D<8,8>; break;
case 0x99: kernel = EAMassAssemble1D<9,9>; break;
}
return kernel(ne,B,pa_data,ea_data,add,dofs1D,quad1D);
}
else if (dim == 2)
{
auto kernel = EAMassAssemble2D<0,0>;
switch ((dofs1D << 4 ) | quad1D)
{
case 0x22: kernel = EAMassAssemble2D<2,2>; break;
case 0x33: kernel = EAMassAssemble2D<3,3>; break;
case 0x44: kernel = EAMassAssemble2D<4,4>; break;
case 0x55: kernel = EAMassAssemble2D<5,5>; break;
case 0x66: kernel = EAMassAssemble2D<6,6>; break;
case 0x77: kernel = EAMassAssemble2D<7,7>; break;
case 0x88: kernel = EAMassAssemble2D<8,8>; break;
case 0x99: kernel = EAMassAssemble2D<9,9>; break;
}
return kernel(ne,B,pa_data,ea_data,add,dofs1D,quad1D);
}
else if (dim == 3)
{
auto kernel = EAMassAssemble3D<0,0>;
switch ((dofs1D << 4 ) | quad1D)
{
case 0x23: kernel = EAMassAssemble3D<2,3>; break;
case 0x34: kernel = EAMassAssemble3D<3,4>; break;
case 0x45: kernel = EAMassAssemble3D<4,5>; break;
case 0x56: kernel = EAMassAssemble3D<5,6>; break;
case 0x67: kernel = EAMassAssemble3D<6,7>; break;
case 0x78: kernel = EAMassAssemble3D<7,8>; break;
case 0x89: kernel = EAMassAssemble3D<8,9>; break;
}
return kernel(ne,B,pa_data,ea_data,add,dofs1D,quad1D);
}
MFEM_ABORT("Unknown kernel.");
}
void MassIntegrator::AssembleEA(const FiniteElementSpace &fes,
Vector &ea_data,
const bool add)
{
AssemblePA(fes);
if (ne > 0) { AssembleEA_(ea_data, add); }
}
void MassIntegrator::AssembleEABoundary(const FiniteElementSpace &fes,
Vector &ea_data,
const bool add)
{
AssemblePABoundary(fes);
if (ne > 0) { AssembleEA_(ea_data, add); }
}
}