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 "MFEMBlockRestrictable.h" 13 : 14 : InputParameters 15 156454 : MFEMBlockRestrictable::validParams() 16 : { 17 : // Create InputParameters object that will be appended to the parameters for the inheriting object 18 156454 : InputParameters params = emptyInputParameters(); 19 : // Create user-facing 'boundary' input for restricting inheriting object to boundaries 20 : // MFEM uses the boundary -1 to signify every sideset 21 469362 : params.addParam<std::vector<SubdomainName>>("block", 22 : {}, 23 : "The list of subdomains (names or ids) that this " 24 : "object will be restricted to. Leave empty to apply " 25 : "to all subdomains."); 26 156454 : return params; 27 0 : } 28 : 29 558 : MFEMBlockRestrictable::MFEMBlockRestrictable(const InputParameters & parameters, 30 558 : const mfem::ParMesh & mfem_mesh) 31 558 : : _mfem_mesh(mfem_mesh), 32 558 : _subdomain_names(parameters.get<std::vector<SubdomainName>>("block")), 33 558 : _subdomain_attributes(_subdomain_names.size()) 34 : { 35 558 : _subdomain_attributes = subdomainsToAttributes(_subdomain_names); 36 558 : if (!_subdomain_attributes.IsEmpty()) 37 75 : mfem::common::AttrToMarker( 38 75 : _mfem_mesh.attributes.Max(), _subdomain_attributes, _subdomain_markers); 39 558 : } 40 : 41 : mfem::Array<int> 42 657 : MFEMBlockRestrictable::subdomainsToAttributes(const std::vector<SubdomainName> & subdomain_names) 43 : { 44 657 : mfem::Array<int> attributes(subdomain_names.size()); 45 657 : auto & mesh = getMesh(); 46 657 : std::transform( 47 : subdomain_names.begin(), 48 : subdomain_names.end(), 49 : attributes.begin(), 50 156 : [&mesh](const SubdomainName & subdomain) -> int 51 : { 52 : try 53 : { 54 : // Is this a block ID? 55 156 : return std::stoi(subdomain); 56 : } 57 32 : catch (...) 58 : { 59 : // It was not 60 32 : auto & subdomain_ids = mesh.attribute_sets.GetAttributeSet(subdomain); 61 32 : if (subdomain_ids.Size() != 1) 62 0 : mooseError( 63 : "There should be a 1-to-1 correspondence between subdomain name and subdomain ID"); 64 32 : return subdomain_ids[0]; 65 32 : } 66 : }); 67 657 : return attributes; 68 0 : } 69 : 70 : std::vector<std::string> 71 99 : MFEMBlockRestrictable::subdomainsToStrings(const std::vector<SubdomainName> & subdomain_names) 72 : { 73 99 : auto attributes = subdomainsToAttributes(subdomain_names); 74 99 : std::vector<std::string> subdomain_attr_strings(subdomain_names.size()); 75 180 : for (const auto i : index_range(subdomain_names)) 76 81 : subdomain_attr_strings[i] = std::to_string(attributes[i]); 77 198 : return subdomain_attr_strings; 78 99 : } 79 : 80 : #endif