Line data Source code
1 : //* This file is part of the MOOSE framework 2 : //* https://mooseframework.inl.gov 3 : //* 4 : //* All rights reserved, see COPYRIGHT for full restrictions 5 : //* https://github.com/idaholab/moose/blob/master/COPYRIGHT 6 : //* 7 : //* Licensed under LGPL 2.1, please see LICENSE for details 8 : //* https://www.gnu.org/licenses/lgpl-2.1.html 9 : 10 : #ifdef MOOSE_MFEM_ENABLED 11 : 12 : #include "MFEMFESpace.h" 13 : #include "MFEMProblem.h" 14 : 15 : InputParameters 16 26864 : MFEMFESpace::validParams() 17 : { 18 26864 : InputParameters params = MFEMGeneralUserObject::validParams(); 19 26864 : params.registerBase("MFEMFESpace"); 20 26864 : MooseEnum ordering("NODES VDIM", "VDIM", false); 21 26864 : params.addParam<MooseEnum>("ordering", ordering, "Ordering style to use for vector DoFs."); 22 26864 : params.addParam<int>("vdim", 1, "The number of degrees of freedom per basis function."); 23 26864 : params.addParam<std::string>("submesh", 24 : "Submesh to define the FESpace on. Leave blank to use base mesh."); 25 53728 : return params; 26 26864 : } 27 : 28 463 : MFEMFESpace::MFEMFESpace(const InputParameters & parameters) 29 : : MFEMGeneralUserObject(parameters), 30 463 : _ordering(parameters.get<MooseEnum>("ordering")), 31 463 : _pmesh( 32 926 : parameters.isParamValid("submesh") 33 902 : ? getMFEMProblem().getProblemData().submeshes.GetRef(getParam<std::string>("submesh")) 34 1365 : : const_cast<mfem::ParMesh &>(getMFEMProblem().mesh().getMFEMParMesh())) 35 : { 36 463 : } 37 : 38 : void 39 455 : MFEMFESpace::buildFEC(const std::string & fec_name) const 40 : { 41 455 : auto name = fec_name.c_str(); 42 : // Handle a few cases that were not supported by mfem::FiniteElementCollection::New as of v4.7 43 455 : if (!strncmp(name, "RT_R1D", 6)) 44 : { 45 1 : _fec = std::make_shared<mfem::RT_R1D_FECollection>(atoi(name + 11), atoi(name + 7)); 46 : } 47 454 : else if (!strncmp(name, "RT_R2D", 6)) 48 : { 49 2 : _fec = std::make_shared<mfem::RT_R2D_FECollection>(atoi(name + 11), atoi(name + 7)); 50 : } 51 452 : else if (!strncmp(name, "ND_R1D", 6)) 52 : { 53 2 : _fec = std::make_shared<mfem::ND_R1D_FECollection>(atoi(name + 11), atoi(name + 7)); 54 : } 55 450 : else if (!strncmp(name, "ND_R2D", 6)) 56 : { 57 1 : _fec = std::make_shared<mfem::ND_R2D_FECollection>(atoi(name + 11), atoi(name + 7)); 58 : } 59 : else 60 : { 61 449 : _fec = std::shared_ptr<mfem::FiniteElementCollection>(mfem::FiniteElementCollection::New(name)); 62 : } 63 455 : } 64 : 65 : int 66 592 : MFEMFESpace::getBasis(const std::string & basis_name) const 67 : { 68 : 69 592 : if (!strcmp(basis_name.c_str(), "GaussLegendre")) 70 163 : return mfem::BasisType::GaussLegendre; 71 429 : else if (!strcmp(basis_name.c_str(), "GaussLobatto")) 72 412 : return mfem::BasisType::GaussLobatto; 73 17 : else if (!strcmp(basis_name.c_str(), "Positive")) 74 0 : return mfem::BasisType::Positive; 75 17 : else if (!strcmp(basis_name.c_str(), "OpenUniform")) 76 0 : return mfem::BasisType::OpenUniform; 77 17 : else if (!strcmp(basis_name.c_str(), "ClosedUniform")) 78 0 : return mfem::BasisType::ClosedUniform; 79 17 : else if (!strcmp(basis_name.c_str(), "OpenHalfUniform")) 80 0 : return mfem::BasisType::OpenHalfUniform; 81 17 : else if (!strcmp(basis_name.c_str(), "Serendipity")) 82 0 : return mfem::BasisType::Serendipity; 83 17 : else if (!strcmp(basis_name.c_str(), "ClosedGL")) 84 0 : return mfem::BasisType::ClosedGL; 85 17 : else if (!strcmp(basis_name.c_str(), "IntegratedGLL")) 86 17 : return mfem::BasisType::IntegratedGLL; 87 0 : else if (!strcmp(basis_name.c_str(), "NumBasisTypes")) 88 0 : return mfem::BasisType::NumBasisTypes; 89 : else 90 0 : mooseError("Unknown basis type: ", basis_name); 91 : } 92 : 93 : void 94 463 : MFEMFESpace::buildFESpace(const int vdim) const 95 : { 96 : _fespace = 97 463 : std::make_shared<mfem::ParFiniteElementSpace>(&_pmesh, getFEC().get(), vdim, _ordering); 98 455 : } 99 : 100 : #endif