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 29362 : MFEMFESpace::validParams() 17 : { 18 29362 : InputParameters params = MFEMGeneralUserObject::validParams(); 19 58724 : params.registerBase("MFEMFESpace"); 20 117448 : MooseEnum ordering("NODES VDIM", "VDIM", false); 21 117448 : params.addParam<MooseEnum>("ordering", ordering, "Ordering style to use for vector DoFs."); 22 117448 : params.addParam<int>("vdim", 1, "The number of degrees of freedom per basis function."); 23 88086 : params.addParam<std::string>("submesh", 24 : "Submesh to define the FESpace on. Leave blank to use base mesh."); 25 58724 : return params; 26 29362 : } 27 : 28 819 : MFEMFESpace::MFEMFESpace(const InputParameters & parameters) 29 : : MFEMGeneralUserObject(parameters), 30 819 : _ordering(parameters.get<MooseEnum>("ordering")), 31 819 : _pmesh( 32 819 : parameters.isParamValid("submesh") 33 1766 : ? getMFEMProblem().getProblemData().submeshes.GetRef(getParam<std::string>("submesh")) 34 2329 : : const_cast<mfem::ParMesh &>(getMFEMProblem().mesh().getMFEMParMesh())) 35 : { 36 819 : } 37 : 38 : void 39 803 : MFEMFESpace::buildFEC(const std::string & fec_name) const 40 : { 41 803 : auto name = fec_name.c_str(); 42 : // Handle a few cases that were not supported by mfem::FiniteElementCollection::New as of v4.7 43 803 : if (!strncmp(name, "RT_R1D", 6)) 44 : { 45 2 : _fec = std::make_shared<mfem::RT_R1D_FECollection>(atoi(name + 11), atoi(name + 7)); 46 : } 47 801 : else if (!strncmp(name, "RT_R2D", 6)) 48 : { 49 4 : _fec = std::make_shared<mfem::RT_R2D_FECollection>(atoi(name + 11), atoi(name + 7)); 50 : } 51 797 : else if (!strncmp(name, "ND_R1D", 6)) 52 : { 53 4 : _fec = std::make_shared<mfem::ND_R1D_FECollection>(atoi(name + 11), atoi(name + 7)); 54 : } 55 793 : else if (!strncmp(name, "ND_R2D", 6)) 56 : { 57 2 : _fec = std::make_shared<mfem::ND_R2D_FECollection>(atoi(name + 11), atoi(name + 7)); 58 : } 59 : else 60 : { 61 791 : _fec = std::shared_ptr<mfem::FiniteElementCollection>(mfem::FiniteElementCollection::New(name)); 62 : } 63 803 : } 64 : 65 : void 66 819 : MFEMFESpace::buildFESpace(const int vdim) const 67 : { 68 : _fespace = 69 819 : std::make_shared<mfem::ParFiniteElementSpace>(&_pmesh, getFEC().get(), vdim, _ordering); 70 803 : } 71 : 72 : #endif