diff --git a/include/reporters/ClosestElemsToLineNodalVarValue.h b/include/reporters/ClosestElemsToLineNodalVarValue.h new file mode 100644 index 000000000..65908fdf1 --- /dev/null +++ b/include/reporters/ClosestElemsToLineNodalVarValue.h @@ -0,0 +1,33 @@ +//* This file is part of the MOOSE framework +//* https://www.mooseframework.org +//* +//* All rights reserved, see COPYRIGHT for full restrictions +//* https://github.com/idaholab/moose/blob/master/COPYRIGHT +//* +//* Licensed under LGPL 2.1, please see LICENSE for details +//* https://www.gnu.org/licenses/lgpl-2.1.html + +#pragma once + +#include "ClosestElemsToLine.h" +#include "MooseVariableInterface.h" + +class ClosestElemsToLineNodalVarValue : public ClosestElemsToLine, + public MooseVariableInterface +{ +public: + static InputParameters validParams(); + + ClosestElemsToLineNodalVarValue(const InputParameters & parameters); + + virtual void initialSetup() override; + + virtual void initialize() override{}; + virtual void execute() override; + virtual void finalize() override; + +private: + std::string _var_name; + MooseVariable & _var; + std::vector & _value; +}; diff --git a/src/reporters/ClosestElemsToLine.C b/src/reporters/ClosestElemsToLine.C index afe858b8b..d1dcf056a 100644 --- a/src/reporters/ClosestElemsToLine.C +++ b/src/reporters/ClosestElemsToLine.C @@ -36,8 +36,9 @@ ClosestElemsToLine::validParams() params.addRequiredParam("point_z2", "input reporter of z-coordinate name for point. This uses " "the reporter syntax /."); - params.addParam("variable", - "Name for the variable in domain to determine uniqueness"); + params.addParam("variable_filter", + "Variable name to filter elements by. Only one element can be " + "found for each integer value of this variable."); params.addParam("projection_tolerance", libMesh::TOLERANCE, "Search tolerance between line and the closest node. If a node is not " @@ -59,7 +60,7 @@ ClosestElemsToLine::ClosestElemsToLine(const InputParameters & parameters) _pt_x(declareValueByName>("point_x", REPORTER_MODE_REPLICATED)), _pt_y(declareValueByName>("point_y", REPORTER_MODE_REPLICATED)), _pt_z(declareValueByName>("point_z", REPORTER_MODE_REPLICATED)), - _var(isParamValid("variable") ? getParam("variable") : "") + _var(isParamValid("variable_filter") ? getParam("variable_filter") : "") { } diff --git a/src/reporters/ClosestElemsToLineNodalVarValue.C b/src/reporters/ClosestElemsToLineNodalVarValue.C new file mode 100644 index 000000000..9186297c1 --- /dev/null +++ b/src/reporters/ClosestElemsToLineNodalVarValue.C @@ -0,0 +1,78 @@ +//* This file is part of the MOOSE framework +//* https://www.mooseframework.org +//* +//* All rights reserved, see COPYRIGHT for full restrictions +//* https://github.com/idaholab/moose/blob/master/COPYRIGHT +//* +//* Licensed under LGPL 2.1, please see LICENSE for details +//* https://www.gnu.org/licenses/lgpl-2.1.html + +#include "ClosestElemsToLineNodalVarValue.h" +#include "MooseMesh.h" +#include "MooseVariable.h" + +registerMooseObject("FalconApp", ClosestElemsToLineNodalVarValue); + +InputParameters +ClosestElemsToLineNodalVarValue::validParams() +{ + InputParameters params = ClosestElemsToLine::validParams(); + params.addClassDescription("Creates a real_vector_names reporter that has each " + "elements average nodal variable value."); + params.addRequiredParam("variable_to_sample", "The nodal variable to monitor."); + return params; +} + +ClosestElemsToLineNodalVarValue::ClosestElemsToLineNodalVarValue(const InputParameters & parameters) + : ClosestElemsToLine(parameters), + MooseVariableInterface(this, + false, + "variable_to_sample", + Moose::VarKindType::VAR_ANY, + Moose::VarFieldType::VAR_FIELD_STANDARD), + _var_name(parameters.get("variable_to_sample")), + _var(_subproblem.getStandardVariable(_tid, _var_name)), + _value(declareValueByName>(_var_name, REPORTER_MODE_REPLICATED)) +{ + if (!_var.isNodal()) + mooseError("variable_to_sample must be a nodal variable."); +} + +void +ClosestElemsToLineNodalVarValue::initialSetup() +{ + ClosestElemsToLine::initialSetup(); + _value.resize(_eid.size(), std::numeric_limits::max()); +} + +void +ClosestElemsToLineNodalVarValue::execute() +{ + const MooseMesh & mesh = _subproblem.mesh(); + for (size_t i = 0; i < _eid.size(); ++i) + { + Real value = 0.0; + size_t n = 0; + const Elem * elem = mesh.getMesh().query_elem_ptr(_eid[i]); + if (elem->processor_id() == processor_id()) + { + for (auto & node : elem->node_ref_range()) + { + value += _var.getNodalValue(node); + n++; + } + if (n > 0) + value /= (Real)n; + } + _value[i] = value; + } +} + +void +ClosestElemsToLineNodalVarValue::finalize() +{ + // for (size_t i = 0; i < _eid.size(); ++i) + // { + // gatherMax(_value[i]); + // } +} diff --git a/test/tests/reporters/closest_elems_to_line/constant_line_projection.i b/test/tests/reporters/closest_elems_to_line/constant_line_projection.i index 5ef3edff7..0e9583da2 100644 --- a/test/tests/reporters/closest_elems_to_line/constant_line_projection.i +++ b/test/tests/reporters/closest_elems_to_line/constant_line_projection.i @@ -107,7 +107,7 @@ point_x2 = pt/pt2_x point_y2 = pt/pt2_y point_z2 = pt/pt2_z - variable = oneID + variable_filter = oneID outputs = out [] [differentID_out] @@ -119,7 +119,7 @@ point_x2 = pt/pt2_x point_y2 = pt/pt2_y point_z2 = pt/pt2_z - variable = differentID + variable_filter = differentID outputs = out [] [noID_out] diff --git a/test/tests/reporters/closest_elems_to_line_NodalVarValue/dfn_test.i b/test/tests/reporters/closest_elems_to_line_NodalVarValue/dfn_test.i new file mode 100644 index 000000000..e8469b215 --- /dev/null +++ b/test/tests/reporters/closest_elems_to_line_NodalVarValue/dfn_test.i @@ -0,0 +1,72 @@ +[Mesh] + [cluster34] + type = FileMeshGenerator + file = 'Cluster_34_zid.e' + use_for_exodus_restart = true + [] +[] + +[Problem] + solve = false +[] + +[AuxVariables] + [z_id] + family = MONOMIAL + order = CONSTANT + initial_from_file_var = z_id + initial_from_file_timestep = 'LATEST' + [] + [one] + order = FIRST + family = LAGRANGE + initial_condition = 1 + [] +[] + +[Executioner] + type = Steady +[] + +[Reporters] + [pt] + type = ConstantReporter + real_vector_names = 'pt1_x pt1_y pt1_z pt2_x pt2_y pt2_z' + real_vector_values = '132.1; 97.5; 189.5; 136.5; 103.2; 50.6' + outputs = none + [] + + [no_var] + block = "9 10" + type = ClosestElemsToLineNodalVarValue + projection_tolerance = 5 + point_x1 = pt/pt1_x + point_y1 = pt/pt1_y + point_z1 = pt/pt1_z + point_x2 = pt/pt2_x + point_y2 = pt/pt2_y + point_z2 = pt/pt2_z + variable_to_sample = one + outputs = out + [] + [domain_var] + type = ClosestElemsToLineNodalVarValue + projection_tolerance = 5 + point_x1 = pt/pt1_x + point_y1 = pt/pt1_y + point_z1 = pt/pt1_z + point_x2 = pt/pt2_x + point_y2 = pt/pt2_y + point_z2 = pt/pt2_z + variable_filter = z_id + variable_to_sample = one + outputs = out + [] +[] + +[Outputs] + [out] + type = JSON + execute_system_information_on = none + [] +[] diff --git a/test/tests/reporters/closest_elems_to_line_NodalVarValue/gold/dfn_test_out.json b/test/tests/reporters/closest_elems_to_line_NodalVarValue/gold/dfn_test_out.json new file mode 100644 index 000000000..d0c4184d6 --- /dev/null +++ b/test/tests/reporters/closest_elems_to_line_NodalVarValue/gold/dfn_test_out.json @@ -0,0 +1,322 @@ +{ + "reporters": { + "domain_var": { + "type": "ClosestElemsToLineNodalVarValue", + "values": { + "elem_id": { + "type": "std::vector" + }, + "one": { + "type": "std::vector" + }, + "point_x": { + "type": "std::vector" + }, + "point_y": { + "type": "std::vector" + }, + "point_z": { + "type": "std::vector" + } + } + }, + "no_var": { + "type": "ClosestElemsToLineNodalVarValue", + "values": { + "elem_id": { + "type": "std::vector" + }, + "one": { + "type": "std::vector" + }, + "point_x": { + "type": "std::vector" + }, + "point_y": { + "type": "std::vector" + }, + "point_z": { + "type": "std::vector" + } + } + } + }, + "time_steps": [ + { + "domain_var": { + "elem_id": [ + 110, + 303, + 628, + 434, + 279, + 267 + ], + "one": [ + 1.7976931348623157e+308, + 1.7976931348623157e+308, + 1.7976931348623157e+308, + 1.7976931348623157e+308, + 1.7976931348623157e+308, + 1.7976931348623157e+308 + ], + "point_x": [ + 132.31579962862992, + 136.62863489764854, + 133.1505065809595, + 133.36205433341016, + 130.6388860022902, + 131.21958168890146 + ], + "point_y": [ + 103.88747400537234, + 101.94229151218796, + 100.3693613683613, + 103.31892237527849, + 99.23987905007077, + 96.4620647816879 + ], + "point_z": [ + 47.05334336259845, + 79.31579254190937, + 116.11480387075915, + 127.48618534186743, + 166.64027361408566, + 184.2144627093709 + ] + }, + "no_var": { + "elem_id": [ + 85, + 87, + 103, + 110, + 229, + 230, + 243, + 258, + 260, + 266, + 267, + 275, + 279, + 283, + 284, + 285 + ], + "one": [ + 1.7976931348623157e+308, + 1.7976931348623157e+308, + 1.7976931348623157e+308, + 1.7976931348623157e+308, + 1.7976931348623157e+308, + 1.7976931348623157e+308, + 1.7976931348623157e+308, + 1.7976931348623157e+308, + 1.7976931348623157e+308, + 1.7976931348623157e+308, + 1.7976931348623157e+308, + 1.7976931348623157e+308, + 1.7976931348623157e+308, + 1.7976931348623157e+308, + 1.7976931348623157e+308, + 1.7976931348623157e+308 + ], + "point_x": [ + 140.76898962760765, + 134.8338301753511, + 138.19846724231445, + 132.31579962862992, + 133.0216170696284, + 130.98340508719514, + 130.21564108872278, + 128.567355073909, + 130.75378086737598, + 133.17199292102518, + 131.21958168890146, + 128.96888889365528, + 130.6388860022902, + 130.5763383924798, + 132.3476458676604, + 132.38180357792507 + ], + "point_y": [ + 102.41067216300557, + 98.73930551868749, + 107.58193191028404, + 103.88747400537234, + 98.57879153654774, + 93.66963640885507, + 102.3935457625957, + 97.37044800564189, + 100.95062126817402, + 101.17218905220068, + 96.4620647816879, + 97.06680321183376, + 99.23987905007077, + 96.17458037002592, + 101.30961559471184, + 102.72222614643412 + ], + "point_z": [ + 54.12582894917744, + 47.493663172433344, + 53.6465151010781, + 47.05334336259845, + 194.7728187952084, + 193.1319295933873, + 149.20666601033295, + 152.19324646878002, + 160.8590702256984, + 185.7550220718987, + 184.2144627093709, + 157.72151883857208, + 166.64027361408566, + 178.52829513396, + 176.39594628840132, + 170.97437712175736 + ] + }, + "time": 0.0, + "time_step": 0 + }, + { + "domain_var": { + "elem_id": [ + 110, + 303, + 628, + 434, + 279, + 267 + ], + "one": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "point_x": [ + 132.31579962862992, + 136.62863489764854, + 133.1505065809595, + 133.36205433341016, + 130.6388860022902, + 131.21958168890146 + ], + "point_y": [ + 103.88747400537234, + 101.94229151218796, + 100.3693613683613, + 103.31892237527849, + 99.23987905007077, + 96.4620647816879 + ], + "point_z": [ + 47.05334336259845, + 79.31579254190937, + 116.11480387075915, + 127.48618534186743, + 166.64027361408566, + 184.2144627093709 + ] + }, + "no_var": { + "elem_id": [ + 85, + 87, + 103, + 110, + 229, + 230, + 243, + 258, + 260, + 266, + 267, + 275, + 279, + 283, + 284, + 285 + ], + "one": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "point_x": [ + 140.76898962760765, + 134.8338301753511, + 138.19846724231445, + 132.31579962862992, + 133.0216170696284, + 130.98340508719514, + 130.21564108872278, + 128.567355073909, + 130.75378086737598, + 133.17199292102518, + 131.21958168890146, + 128.96888889365528, + 130.6388860022902, + 130.5763383924798, + 132.3476458676604, + 132.38180357792507 + ], + "point_y": [ + 102.41067216300557, + 98.73930551868749, + 107.58193191028404, + 103.88747400537234, + 98.57879153654774, + 93.66963640885507, + 102.3935457625957, + 97.37044800564189, + 100.95062126817402, + 101.17218905220068, + 96.4620647816879, + 97.06680321183376, + 99.23987905007077, + 96.17458037002592, + 101.30961559471184, + 102.72222614643412 + ], + "point_z": [ + 54.12582894917744, + 47.493663172433344, + 53.6465151010781, + 47.05334336259845, + 194.7728187952084, + 193.1319295933873, + 149.20666601033295, + 152.19324646878002, + 160.8590702256984, + 185.7550220718987, + 184.2144627093709, + 157.72151883857208, + 166.64027361408566, + 178.52829513396, + 176.39594628840132, + 170.97437712175736 + ] + }, + "time": 1.0, + "time_step": 1 + } + ] +} diff --git a/test/tests/reporters/closest_elems_to_line_NodalVarValue/gold/nodal_var_value_out.json b/test/tests/reporters/closest_elems_to_line_NodalVarValue/gold/nodal_var_value_out.json new file mode 100644 index 000000000..2ef6e6fbf --- /dev/null +++ b/test/tests/reporters/closest_elems_to_line_NodalVarValue/gold/nodal_var_value_out.json @@ -0,0 +1,205 @@ +{ + "reporters": { + "domain_var": { + "type": "ClosestElemsToLineNodalVarValue", + "values": { + "elem_id": { + "type": "std::vector" + }, + "point_x": { + "type": "std::vector" + }, + "point_y": { + "type": "std::vector" + }, + "point_z": { + "type": "std::vector" + }, + "v": { + "type": "std::vector" + } + } + }, + "no_var": { + "type": "ClosestElemsToLineNodalVarValue", + "values": { + "elem_id": { + "type": "std::vector" + }, + "point_x": { + "type": "std::vector" + }, + "point_y": { + "type": "std::vector" + }, + "point_z": { + "type": "std::vector" + }, + "v": { + "type": "std::vector" + } + } + } + }, + "time_steps": [ + { + "domain_var": { + "elem_id": [ + 0 + ], + "point_x": [ + 1.0 + ], + "point_y": [ + 1.0 + ], + "point_z": [ + 0.0 + ], + "v": [ + 1.0 + ] + }, + "no_var": { + "elem_id": [ + 0, + 1, + 2, + 3 + ], + "point_x": [ + 1.0, + 3.0, + 1.0, + 3.0 + ], + "point_y": [ + 1.0, + 1.0, + 3.0, + 3.0 + ], + "point_z": [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + "v": [ + 1.0, + 3.0, + 3.0, + 9.0 + ] + }, + "time": 1.0, + "time_step": 1 + }, + { + "domain_var": { + "elem_id": [ + 0 + ], + "point_x": [ + 1.0 + ], + "point_y": [ + 1.0 + ], + "point_z": [ + 0.0 + ], + "v": [ + 2.0 + ] + }, + "no_var": { + "elem_id": [ + 0, + 1, + 2, + 3 + ], + "point_x": [ + 1.0, + 3.0, + 1.0, + 3.0 + ], + "point_y": [ + 1.0, + 1.0, + 3.0, + 3.0 + ], + "point_z": [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + "v": [ + 2.0, + 6.0, + 6.0, + 18.0 + ] + }, + "time": 2.0, + "time_step": 2 + }, + { + "domain_var": { + "elem_id": [ + 0 + ], + "point_x": [ + 1.0 + ], + "point_y": [ + 1.0 + ], + "point_z": [ + 0.0 + ], + "v": [ + 3.0 + ] + }, + "no_var": { + "elem_id": [ + 0, + 1, + 2, + 3 + ], + "point_x": [ + 1.0, + 3.0, + 1.0, + 3.0 + ], + "point_y": [ + 1.0, + 1.0, + 3.0, + 3.0 + ], + "point_z": [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + "v": [ + 3.0, + 9.0, + 9.0, + 27.0 + ] + }, + "time": 3.0, + "time_step": 3 + } + ] +} diff --git a/test/tests/reporters/closest_elems_to_line_NodalVarValue/nodal_var_value.i b/test/tests/reporters/closest_elems_to_line_NodalVarValue/nodal_var_value.i new file mode 100644 index 000000000..25eb5dfc6 --- /dev/null +++ b/test/tests/reporters/closest_elems_to_line_NodalVarValue/nodal_var_value.i @@ -0,0 +1,85 @@ +[Mesh] + type = GeneratedMesh + dim = 2 + nx = 2 + ny = 2 + xmin = 0 + xmax = 4 + ymin = 0 + ymax = 4 + elem_type = QUAD9 + # This test can only be run with renumering disabled, so the + # NodalVariableValue postprocessor's node id is well-defined. + allow_renumbering = false[] + + [Problem] + solve = false + [] + +[AuxVariables] + [./v] + order = SECOND + family = LAGRANGE + [../] +[] + +[AuxKernels] + [v] + type = ParsedAux + use_xyzt = true + variable = v + function = 't*x*y' + [] +[] + +[Reporters] + [pt] + type = ConstantReporter + real_vector_names = 'pt1_x pt1_y pt1_z pt2_x pt2_y pt2_z' + real_vector_values = '-1; -1; 0; 1; 1; 1' + outputs = none + [] + + [no_var] + type = ClosestElemsToLineNodalVarValue + projection_tolerance = 5 + point_x1 = pt/pt1_x + point_y1 = pt/pt1_y + point_z1 = pt/pt1_z + point_x2 = pt/pt2_x + point_y2 = pt/pt2_y + point_z2 = pt/pt2_z + variable_to_sample = v + outputs = out + [] + [domain_var] + type = ClosestElemsToLineNodalVarValue + projection_tolerance = 5 + point_x1 = pt/pt1_x + point_y1 = pt/pt1_y + point_z1 = pt/pt1_z + point_x2 = pt/pt2_x + point_y2 = pt/pt2_y + point_z2 = pt/pt2_z + variable_filter = v + variable_to_sample = v + outputs = out + [] +[] + +[Executioner] + type = Transient + solve_type = 'PJFNK' + dt = 1 + start_time = 0 + end_time = 3 +[] + +[Outputs] + [out] + type = JSON + execute_system_information_on = none + sync_times = '1 2 3' + sync_only = true + [] +[] diff --git a/test/tests/reporters/closest_elems_to_line_NodalVarValue/tests b/test/tests/reporters/closest_elems_to_line_NodalVarValue/tests new file mode 100644 index 000000000..52eeceea7 --- /dev/null +++ b/test/tests/reporters/closest_elems_to_line_NodalVarValue/tests @@ -0,0 +1,18 @@ +[Tests] + issues='108' + requirement = 'The system shall be able to report variable values ' + [./dfn] + type = 'JSONDiff' + input = 'dfn_test.i' + jsondiff = 'dfn_test_out.json' + skip_keys = 'type' + detail = 'on a mesh of a realistic DFN with sampling domain restricted by block and uniqueness determined by an auxvariable' + [../] + [./transient] + type = 'JSONDiff' + input = 'nodal_var_value.i' + jsondiff = 'nodal_var_value_out.json' + skip_keys = 'type' + detail = 'on a simple higher order mesh with variable values changing with time' + [../] +[] diff --git a/test/tests/reporters/closest_elems_to_line_with_values/dfn_test.i b/test/tests/reporters/closest_elems_to_line_with_values/dfn_test.i index bd754c2dc..529444e4e 100644 --- a/test/tests/reporters/closest_elems_to_line_with_values/dfn_test.i +++ b/test/tests/reporters/closest_elems_to_line_with_values/dfn_test.i @@ -54,7 +54,7 @@ point_x2 = pt/pt2_x point_y2 = pt/pt2_y point_z2 = pt/pt2_z - variable = z_id + variable_filter = z_id outputs = out [] []