Line data Source code
1 : #include "ValueFractionHeuristicUserObject.h" 2 : 3 : registerMooseObject("CardinalApp", ValueFractionHeuristicUserObject); 4 : 5 : InputParameters 6 12 : ValueFractionHeuristicUserObject::validParams() 7 : { 8 : 9 12 : InputParameters param = ClusteringUserObjectBase::validParams(); 10 24 : param.addRequiredRangeCheckedParam<Real>("upper_fraction", 11 : "0.0 < upper_fraction & upper_fraction < 1.0", 12 : "upper percentage of error for the heuristics"); 13 24 : param.addRequiredRangeCheckedParam<Real>("lower_fraction", 14 : "0.0 < lower_fraction & lower_fraction < 1.0 ", 15 : "lower percentage of error for the heuristics"); 16 12 : param.addClassDescription("Clusters elements whose variable values both fall within either a" 17 : "specified upper or lower fraction of the extremes."); 18 : 19 12 : return param; 20 0 : } 21 9 : ValueFractionHeuristicUserObject::ValueFractionHeuristicUserObject(const InputParameters & params) 22 : : ClusteringUserObjectBase(params), 23 6 : _upper_fraction(getParam<Real>("upper_fraction")), 24 12 : _lower_fraction(getParam<Real>("lower_fraction")), 25 6 : _max(std::numeric_limits<Real>::min()), 26 9 : _min(std::numeric_limits<Real>::max()) 27 : { 28 6 : if (_lower_fraction + _upper_fraction > 1) 29 3 : mooseError("lower_fraction + upper_fraction must be less than 1"); 30 3 : } 31 : 32 : void 33 6 : ValueFractionHeuristicUserObject::extremesFinder() 34 : { 35 : 36 612 : for (auto & elem : _mesh.active_element_ptr_range()) 37 : { 38 600 : auto score = getMetricData(elem); 39 600 : _max = std::max(_max, score); 40 603 : _min = std::min(_min, score); 41 6 : } 42 6 : _upper_cut_off = (1 - _upper_fraction) * (_max - _min) + _min; 43 6 : _lower_cut_off = _lower_fraction * (_max - _min) + _min; 44 6 : } 45 : 46 : bool 47 1974 : ValueFractionHeuristicUserObject::evaluate(libMesh::Elem * base_element, 48 : libMesh::Elem * neighbor_element) const 49 : { 50 : 51 1974 : Real base_metric_value = getMetricData(base_element); 52 1974 : Real neighbor_metric_value = getMetricData(neighbor_element); 53 1974 : return (base_metric_value > _upper_cut_off && neighbor_metric_value > _upper_cut_off) || 54 1908 : (base_metric_value < _lower_cut_off && neighbor_metric_value < _lower_cut_off); 55 : }