Line data Source code
1 : /********************************************************************/ 2 : /* SOFTWARE COPYRIGHT NOTIFICATION */ 3 : /* Cardinal */ 4 : /* */ 5 : /* (c) 2021 UChicago Argonne, LLC */ 6 : /* ALL RIGHTS RESERVED */ 7 : /* */ 8 : /* Prepared by UChicago Argonne, LLC */ 9 : /* Under Contract No. DE-AC02-06CH11357 */ 10 : /* With the U. S. Department of Energy */ 11 : /* */ 12 : /* Prepared by Battelle Energy Alliance, LLC */ 13 : /* Under Contract No. DE-AC07-05ID14517 */ 14 : /* With the U. S. Department of Energy */ 15 : /* */ 16 : /* See LICENSE for full restrictions */ 17 : /********************************************************************/ 18 : 19 : #include "BooleanComboMarker.h" 20 : 21 : registerMooseObject("MooseApp", BooleanComboMarker); 22 : 23 : InputParameters 24 108 : BooleanComboMarker::validParams() 25 : { 26 108 : auto params = Marker::validParams(); 27 108 : params.addClassDescription("A class which takes multiple markers and ANDs / ORs them together to " 28 : "determine if an element should be refined or coarsened."); 29 216 : params.addRequiredParam<std::vector<MarkerName>>( 30 : "refine_markers", "A list of the marker names to be used for refinement."); 31 216 : params.addRequiredParam<std::vector<MarkerName>>( 32 : "coarsen_markers", "A list of the marker names to be used for coasening."); 33 216 : params.addParam<MooseEnum>( 34 : "boolean_operator", 35 324 : MooseEnum("and or", "and"), 36 : "How the different markers should be combined. Options are to AND each " 37 : "marker together or to OR them together."); 38 216 : params.addParam<MooseEnum>("priority", 39 324 : MooseEnum("refinement coarsening", "refinement"), 40 : "The operator to be prioritized when marking elements."); 41 : 42 108 : return params; 43 0 : } 44 : 45 54 : BooleanComboMarker::BooleanComboMarker(const InputParameters & parameters) 46 : : Marker(parameters), 47 54 : _refine_marker_names(parameters.get<std::vector<MarkerName>>("refine_markers")), 48 54 : _coarsen_marker_names(parameters.get<std::vector<MarkerName>>("coarsen_markers")), 49 108 : _use_and(getParam<MooseEnum>("boolean_operator") == "and"), 50 216 : _priority_refinement(getParam<MooseEnum>("priority") == "refinement") 51 : { 52 162 : for (const auto & marker_name : _refine_marker_names) 53 216 : _refine_markers.push_back(&getMarkerValue(marker_name)); 54 : 55 156 : for (const auto & marker_name : _coarsen_marker_names) 56 204 : _coarsen_markers.push_back(&getMarkerValue(marker_name)); 57 54 : } 58 : 59 : Marker::MarkerValue 60 296628 : BooleanComboMarker::computeElementMarker() 61 : { 62 296628 : bool refine = _use_and; 63 : bool coarsen = _use_and; 64 : 65 889884 : for (const auto m : _refine_markers) 66 : { 67 593256 : if (_use_and) 68 575712 : refine &= static_cast<MarkerValue>((*m)[0]) == MarkerValue::REFINE; 69 : else 70 17544 : refine |= static_cast<MarkerValue>((*m)[0]) == MarkerValue::REFINE; 71 : } 72 : 73 611484 : for (const auto m : _coarsen_markers) 74 : { 75 314856 : if (_use_and) 76 297312 : coarsen &= static_cast<MarkerValue>((*m)[0]) == MarkerValue::COARSEN; 77 : else 78 17544 : coarsen |= static_cast<MarkerValue>((*m)[0]) == MarkerValue::COARSEN; 79 : } 80 : 81 296628 : if (_priority_refinement) 82 : { 83 287982 : if (refine) 84 : return MarkerValue::REFINE; 85 285822 : if (coarsen) 86 117648 : return MarkerValue::COARSEN; 87 : } 88 : else 89 : { 90 8646 : if (coarsen) 91 : return MarkerValue::COARSEN; 92 5448 : if (refine) 93 1080 : return MarkerValue::REFINE; 94 : } 95 : 96 : return MarkerValue::DO_NOTHING; 97 : }