https://mooseframework.inl.gov
Loading...
Searching...
No Matches
NearestNodeValueAux.C
Go to the documentation of this file.
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 "NearestNodeValueAux.h"
11
12#include "SystemBase.h"
13#include "NearestNodeLocator.h"
14
16
19{
21 params.addClassDescription("Retrieves a field value from the closest node on the paired boundary "
22 "and stores it on this boundary or block.");
23 params.set<bool>("_dual_restrictable") = true;
24 params.addRequiredParam<BoundaryName>("paired_boundary", "The boundary to get the value from.");
25 params.addRequiredCoupledVar("paired_variable", "The variable to get the value of.");
26 params.set<bool>("use_displaced_mesh") = true;
27 return params;
28}
29
31 : AuxKernel(parameters),
32 _nearest_node(
33 getNearestNodeLocator(parameters.get<BoundaryName>("paired_boundary"), boundaryNames()[0])),
34 _serialized_solution(_nl_sys.currentSolution()),
35 _paired_variable(coupled("paired_variable"))
36{
37 if (boundaryNames().size() > 1)
38 paramError("boundary", "NearestNodeValueAux can only be used with one boundary at a time!");
39 if (boundaryNames().empty())
40 paramError("boundary", "Should be specified on a boundary");
41
42 // Check that the paired variable is from the solution system
43 if (_subproblem.hasAuxiliaryVariable("paired_variable"))
44 paramError("paired_variable", "Paired variable should not be auxiliary");
45 // Check that the paired variable has degrees of freedom on nodes (and thus can be sampled
46 // directly at the dof index of the node)
47 if (!getVar("paired_variable", 0)->hasDoFsOnNodes())
48 paramError("paired_variable", "Paired variable does not have degrees of freedom on nodes");
49
50 // TODO: avoid the runtime checks by making sure the paired variable is defined on the boundaries
51}
52
53Real
55{
56 if (isNodal())
57 {
58 // Assumes the variable you are coupling to is from the nonlinear system for now.
59 const Node * nearest = _nearest_node.nearestNode(_current_node->id());
60 if (nearest == nullptr)
61 mooseError("Could not locate the nearest node from node: ", _current_node->get_info());
62 dof_id_type dof_number = nearest->dof_number(_nl_sys.number(), _paired_variable, 0);
63 if (dof_number == libMesh::DofObject::invalid_id)
64 mooseError("Paired variable does not seem to be defined on nearest node: ",
65 nearest->get_info());
66 return (*_serialized_solution)(dof_number);
67 }
68 else
69 {
70 // Get a value for all the nodes on the boundary, then average them for the centroid value
71 Real average = 0;
72 Real sum_inv_dist = 0;
73 for (const auto & node : _current_elem->node_ref_range())
74 {
75 const Node * nearest = _nearest_node.nearestNode(node.id());
76 // Some of the element's nodes wont be on the boundary
77 if (!nearest)
78 continue;
79 const auto dof_number = nearest->dof_number(_nl_sys.number(), _paired_variable, 0);
80 const auto distance = _nearest_node.distance(node.id());
81
82 if (dof_number == libMesh::DofObject::invalid_id)
83 mooseError("Paired variable does not seem to be defined on nearest node: ",
84 nearest->get_info());
85
86 // inverse distance weighting should be a fine default
87 if (distance > 0)
88 {
89 average += (*_serialized_solution)(dof_number) / distance;
90 sum_inv_dist += 1. / distance;
91 }
92 // if node and nearest nodes coincide, weight with 1
93 else
94 {
95 average += (*_serialized_solution)(dof_number);
96 sum_inv_dist += 1.;
97 }
98 }
99
100 if (sum_inv_dist > 0)
101 return average / sum_inv_dist;
102 else
103 return 0.;
104 }
105}
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
Definition MooseError.h:311
registerMooseObject("MooseApp", NearestNodeValueAux)
SubProblem & _subproblem
Subproblem this kernel is part of.
SystemBase & _nl_sys
bool isNodal() const
Nodal or elemental kernel?
Definition AuxKernel.h:43
const Elem *const & _current_elem
Current element (valid only for elemental kernels)
Definition AuxKernel.h:133
const Node *const & _current_node
Current node (valid only for nodal kernels)
Definition AuxKernel.h:143
static InputParameters validParams()
Definition AuxKernel.C:27
const std::vector< BoundaryName > & boundaryNames() const
Return the boundary names for this object.
MooseVariable * getVar(const std::string &var_name, unsigned int comp)
Extract pointer to a coupled variable.
Definition Coupleable.C:319
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system.
void addRequiredCoupledVar(const std::string &name, const std::string &doc_string)
This method adds a coupled variable name pair.
void addRequiredParam(const std::string &name, const std::string &doc_string)
This method adds a parameter and documentation string to the InputParameters object that will be extr...
void addClassDescription(const std::string &doc_string)
This method adds a description of the class that will be displayed in the input file syntax dump.
T & set(const std::string &name, bool quiet_mode=false)
Returns a writable reference to the named parameters.
void paramError(const std::string &param, Args... args) const
Emits an error prefixed with the file and line number of the given param (from the input file) along ...
Definition MooseBase.h:457
const Node * nearestNode(dof_id_type node_id)
Valid to call this after findNodes() has been called to get a pointer to the nearest node.
Real distance(dof_id_type node_id)
Valid to call this after findNodes() has been called to get the distance to the nearest node.
Finds the closest node on a paired boundary to the current node or element and stores a corresponding...
NearestNodeLocator & _nearest_node
static InputParameters validParams()
virtual Real computeValue() override
Compute and return the value of the aux variable.
const NumericVector< Number > *const & _serialized_solution
NearestNodeValueAux(const InputParameters &parameters)
virtual bool hasAuxiliaryVariable(const std::string &var_name) const
Whether or not this problem has this auxiliary variable.
Definition SubProblem.C:812
unsigned int number() const
Gets the number of this system.
static constexpr dof_id_type invalid_id
Real distance(const Point &p)