39 _functors_in(getParam<
std::vector<MooseFunctorName>>(
"functors_in")),
40 _functors_out(getParam<
std::vector<MooseFunctorName>>(
"functors_out")),
41 _smoothing_technique(getParam<
MooseEnum>(
"smoothing_technique"))
47 auto rm_params = factory.
getValidParams(
"ElementSideNeighborLayers");
48 rm_params.template set<std::string>(
"for_whom") =
name();
49 rm_params.template set<MooseMesh *>(
"mesh") = &
const_cast<MooseMesh &
>(
_mesh);
50 rm_params.template set<Moose::RelationshipManagerType>(
"rm_type") =
53 rm_params.template set<unsigned short>(
"layers") = 1;
54 rm_params.template set<bool>(
"use_point_neighbors") =
false;
55 rm_params.template set<bool>(
"use_displaced_mesh") =
56 parameters.template get<bool>(
"use_displaced_mesh");
57 mooseAssert(rm_params.areAllRequiredParamsValid(),
58 "All relationship manager parameters should be valid.");
59 auto rm_obj = factory.template create<RelationshipManager>(
60 "ElementSideNeighborLayers",
name() +
"_functor_smoothing", rm_params);
65 factory.releaseSharedObjects(*rm_obj);
77 const auto & functor_in = getFunctor<typename Moose::ADType<T>::type>(
_functors_in[i]);
81 if (!functor_in.hasBlocks(bid))
83 "Input functor '" + functor_in.functorName() +
87 addFunctorProperty<typename Moose::ADType<T>::type>(
95 const Elem * r_elem =
nullptr;
100 if (r_elem && r_elem->n_neighbors() == 0)
107 if constexpr (std::is_same_v<
const Moose::ElemArg &,
decltype(r)>)
109 unsigned int n_faces = 0;
110 for (
const auto side_index : r_elem->side_index_range())
116 r_elem->neighbor_ptr(side_index)->which_neighbor_am_i(r_elem));
121 average += functor_in(face_arg, t);
131 mooseError(
"Face averaging smoothing has only been defined for the ElemArg functor "
132 "argument, not for ",
134 ". Please contact a MOOSE developer or implement it yourself.");
138 if constexpr (std::is_same_v<
const Moose::NodeArg &,
decltype(r)>)
140 const Node * r_node = r.node;
144 for (
const auto & shared_elem_id : libmesh_map_find(node_to_elem_map, r_node->id()))
146 const auto & shared_elem =
_mesh.
elemPtr(shared_elem_id);
147 const auto node_index = shared_elem->get_node_index(r_node);
149 for (
const auto edge_index : shared_elem->edges_adjacent_to_node(node_index))
151 for (
const auto n : shared_elem->nodes_on_edge(edge_index))
159 average += functor_in(node_arg, t);
167 mooseError(
"Node averaging smoothing has only been defined for the "
168 "NodeArg functor argument at this time, not for ",
170 ". Please contact a MOOSE developer or implement it yourself.");
174 if constexpr (std::is_same_v<
const Moose::ElemArg &,
decltype(r)>)
176 unsigned int n_neighbors = 0;
177 for (
const auto neighbor : r_elem->neighbor_ptr_range())
183 average /= n_neighbors;
186 mooseError(
"Element layered averaging smoothing has only been defined for the "
187 "ElemArg functor argument, not for ",
189 ". Please contact a MOOSE developer or implement it yourself.");
193 if constexpr (std::is_same_v<
const Moose::ElemArg &,
decltype(r)>)
198 average += base_value / 2;
204 unsigned int furthest_one = 0;
205 unsigned int num_neighbors = 0;
206 for (
const auto side_index : r_elem->side_index_range())
208 auto neighbor = r_elem->neighbor_ptr(side_index);
212 auto neighbor_value = functor_in(
Moose::ElemArg{neighbor,
false}, t);
213 if (abs(neighbor_value - base_value) > delta)
215 furthest_one = side_index;
216 extreme_value = neighbor_value;
217 delta = abs(neighbor_value - base_value);
223 if (num_neighbors == 1)
225 average += extreme_value / 2;
229 average += extreme_value / 4;
234 auto opposite_side = r_elem->opposite_side(furthest_one);
235 auto neighbor = r_elem->neighbor_ptr(opposite_side);
242 average += extreme_value / 4;
251 for (
const auto side_index : r_elem->side_index_range())
253 auto neighbor = r_elem->neighbor_ptr(side_index);
254 auto neighbor_value =
255 neighbor ? functor_in(
Moose::ElemArg{neighbor,
false}, t) : base_value;
256 if (abs(neighbor_value - base_value) > delta && side_index != furthest_one)
258 second_extreme_value = neighbor_value;
259 delta = abs(neighbor_value - base_value);
262 average += second_extreme_value / 4;
266 mooseError(
"Checkerboard removal smoothing has only been defined for the "
267 "ElemArg functor argument, not for ",
269 ". Please contact a MOOSE developer or implement it yourself.");