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 "DiscreteNucleationMarker.h" 11 : #include "DiscreteNucleationMap.h" 12 : 13 : registerMooseObject("PhaseFieldApp", DiscreteNucleationMarker); 14 : 15 : InputParameters 16 40 : DiscreteNucleationMarker::validParams() 17 : { 18 40 : InputParameters params = Marker::validParams(); 19 40 : params.addClassDescription("Mark new nucleation sites for refinement"); 20 80 : params.addRequiredParam<UserObjectName>("map", "DiscreteNucleationMap user object"); 21 40 : return params; 22 0 : } 23 : 24 21 : DiscreteNucleationMarker::DiscreteNucleationMarker(const InputParameters & parameters) 25 : : Marker(parameters), 26 21 : _map(getUserObject<DiscreteNucleationMap>("map")), 27 21 : _periodic(_map.getPeriodic()), 28 21 : _inserter(_map.getInserter()), 29 21 : _int_width(_map.getWidth()), 30 42 : _nucleus_list(_inserter.getNucleusList()) 31 : { 32 21 : } 33 : 34 : Marker::MarkerValue 35 1440 : DiscreteNucleationMarker::computeElementMarker() 36 : { 37 1440 : const RealVectorValue centroid = _current_elem->vertex_average(); 38 1440 : const Real size = 0.5 * _current_elem->hmax(); 39 : 40 : // check if the surface of a nucleus might touch the element 41 2544 : for (unsigned i = 0; i < _nucleus_list.size(); ++i) 42 : { 43 : // get the radius of the current nucleus 44 1602 : const Real radius = _nucleus_list[i].radius; 45 : 46 : // use a non-periodic or periodic distance 47 1602 : const Real r = _periodic < 0 48 1602 : ? (centroid - _nucleus_list[i].center).norm() 49 1602 : : _mesh.minPeriodicDistance(_periodic, centroid, _nucleus_list[i].center); 50 1602 : if (r < radius + size && r > radius - size && size > _int_width) 51 : return REFINE; 52 : } 53 : 54 : // We return don't mark to allow coarsening when used in a ComboMarker 55 : return DONT_MARK; 56 : }