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 : #include "ReporterPointMarker.h" 11 : #include "FEProblemBase.h" 12 : 13 : registerMooseObject("MooseApp", ReporterPointMarker); 14 : 15 : InputParameters 16 14324 : ReporterPointMarker::validParams() 17 : { 18 14324 : InputParameters params = Marker::validParams(); 19 14324 : params.addClassDescription("Marks the region inside or empty if it contains a reporter defined " 20 : "point for refinement or coarsening."); 21 14324 : params.addRequiredParam<ReporterName>("x_coord_name", "reporter x-coordinate name"); 22 14324 : params.addRequiredParam<ReporterName>("y_coord_name", "reporter y-coordinate name"); 23 14324 : params.addRequiredParam<ReporterName>("z_coord_name", "reporter z-coordinate name"); 24 14324 : MooseEnum marker_states = Marker::markerStates(); 25 14324 : params.addRequiredParam<MooseEnum>( 26 : "inside", marker_states, "How to mark elements containing a point"); 27 14324 : params.addRequiredParam<MooseEnum>( 28 : "empty", marker_states, "How to mark elements not containing a point"); 29 28648 : return params; 30 14324 : } 31 : 32 31 : ReporterPointMarker::ReporterPointMarker(const InputParameters & parameters) 33 : : Marker(parameters), 34 : ReporterInterface(this), 35 31 : _inside(parameters.get<MooseEnum>("inside").getEnum<MarkerValue>()), 36 31 : _empty(parameters.get<MooseEnum>("empty").getEnum<MarkerValue>()), 37 31 : _x_coord(getReporterValue<std::vector<Real>>("x_coord_name", REPORTER_MODE_REPLICATED)), 38 31 : _y_coord(getReporterValue<std::vector<Real>>("y_coord_name", REPORTER_MODE_REPLICATED)), 39 62 : _z_coord(getReporterValue<std::vector<Real>>("z_coord_name", REPORTER_MODE_REPLICATED)) 40 : { 41 31 : } 42 : 43 : void 44 88 : ReporterPointMarker::markerSetup() 45 : { 46 88 : _pl = _fe_problem.mesh().getPointLocator(); 47 88 : _pl->enable_out_of_mesh_mode(); 48 88 : const auto npoints = _x_coord.size(); 49 88 : if (npoints != _y_coord.size() || npoints != _z_coord.size()) 50 8 : mooseError("The coordinate vectors are a different size. \n", 51 : " x_coord size = ", 52 : npoints, 53 : "; y_coord size = ", 54 4 : _y_coord.size(), 55 : "; z_coord size = ", 56 4 : _z_coord.size()); 57 : 58 84 : _point_elems.clear(); 59 348 : for (std::size_t i = 0; i < npoints; ++i) 60 : { 61 264 : Point pt(_x_coord[i], _y_coord[i], _z_coord[i]); 62 264 : const auto elem = (*_pl)(pt); 63 264 : if (elem) 64 241 : _point_elems.insert(elem->id()); 65 : } 66 84 : } 67 : 68 : Marker::MarkerValue 69 2600 : ReporterPointMarker::computeElementMarker() 70 : { 71 2600 : return (_point_elems.count(_current_elem->id()) ? _inside : _empty); 72 : }