19 "A function that returns an absorber fraction for multiple control drums application.");
22 "Name of the mesh generator to be used to retrieve control drums information.");
24 "angular_speeds",
"Vector of angular rotation speeds of the control drum.");
27 "Vector of initial angular positions of the beginning of the absorber components.");
29 "angle_ranges",
"Vector of angular ranges of the beginning of the absorber components.");
31 "rotation_start_time", 0.0,
"The time point at which the control drums start rotating.");
33 std::numeric_limits<Real>::max(),
34 "The time point at which the control drums stop rotating.");
36 "use_control_drum_id",
true,
"Whether extra element id user_control_drum_id is used.");
46 _mesh_generator(getParam<MeshGeneratorName>(
"mesh_generator")),
47 _angular_speeds(getParam<
std::vector<
Real>>(
"angular_speeds")),
48 _start_angles(getParam<
std::vector<
Real>>(
"start_angles")),
49 _angle_ranges(getParam<
std::vector<
Real>>(
"angle_ranges")),
50 _rotation_start_time(getParam<
Real>(
"rotation_start_time")),
51 _rotation_end_time(getParam<
Real>(
"rotation_end_time")),
52 _use_control_drum_id(getParam<bool>(
"use_control_drum_id")),
53 _control_drum_id(_use_control_drum_id ? getElementIDByName(
"control_drum_id")
54 : DofObject::invalid_id),
55 _control_drum_positions(
56 getMeshProperty<
std::vector<Point>>(
"control_drum_positions", _mesh_generator)),
57 _control_drums_azimuthal_meta(getMeshProperty<
std::vector<
std::vector<
Real>>>(
58 "control_drums_azimuthal_meta", _mesh_generator))
62 "the size of 'start_angles' must be identical to the size of 'angular_speeds'");
65 "the size of 'angle_ranges' must be identical to the size of 'angular_speeds'");
68 "the size of this parameter must be identical to the control drum number recorded " 69 "in the MeshMetaData.");
71 paramError(
"rotation_end_time",
"this parameter must be larger than rotation_start_time.");
83 std::vector<std::pair<Real, unsigned int>> meshcontrol_drum_dist_vec;
90 meshcontrol_drum_dist_vec.push_back(std::make_pair(cd_dist, i));
92 std::sort(meshcontrol_drum_dist_vec.begin(), meshcontrol_drum_dist_vec.end());
96 : meshcontrol_drum_dist_vec.front().second;
100 Real dynamic_end_angle = dynamic_start_angle +
_angle_ranges[cd_id] / 180.0 * M_PI;
102 dynamic_start_angle = atan2(std::sin(dynamic_start_angle),
103 std::cos(dynamic_start_angle)) /
105 dynamic_end_angle = atan2(std::sin(dynamic_end_angle),
106 std::cos(dynamic_end_angle)) /
112 dynamic_start_angle);
123 Real start_low, start_high, end_low, end_high;
130 start_low = *(start_bound - 1);
131 start_high = *start_bound;
148 end_low = *(end_bound - 1);
149 end_high = *end_bound;
161 Real azimuthal_p = atan2(p(1) - cd_pos(1), p(0) - cd_pos(0)) / M_PI * 180;
170 if (end_high >= start_low)
173 if (azimuthal_p >= start_high && azimuthal_p <= end_low)
176 else if (azimuthal_p <= start_low || azimuthal_p >= end_high)
180 else if (azimuthal_p < start_high && azimuthal_p > start_low)
182 Real start_interval = start_high - start_low;
183 Real stab_interval = start_high - dynamic_start_angle;
184 return stab_interval / start_interval * 100.0;
190 Real end_interval = end_high - end_low;
191 Real endab_interval = dynamic_end_angle - end_low;
192 return endab_interval / end_interval * 100.0;
197 else if (end_low >= end_high)
200 if (azimuthal_p >= start_high && azimuthal_p <= end_low)
203 else if (azimuthal_p <= start_low && azimuthal_p >= end_high)
207 else if (azimuthal_p < start_high && azimuthal_p > start_low)
209 Real start_interval = start_high - start_low;
210 Real stab_interval = start_high - dynamic_start_angle;
211 return stab_interval / start_interval * 100.0;
218 Real end_interval = end_high - end_low + 360.0;
219 Real endab_interval = (dynamic_end_angle - end_low >= 0.0)
220 ? (dynamic_end_angle - end_low)
221 : (dynamic_end_angle - end_low + 360.0);
222 return endab_interval / end_interval * 100.0;
226 else if (start_high >= end_low)
229 if (azimuthal_p >= start_high || azimuthal_p <= end_low)
232 else if (azimuthal_p >= end_high && azimuthal_p <= start_low)
236 else if (azimuthal_p < start_high && azimuthal_p > start_low)
238 Real start_interval = start_high - start_low;
239 Real stab_interval = start_high - dynamic_start_angle;
240 return stab_interval / start_interval * 100.0;
246 Real end_interval = end_high - end_low;
247 Real endab_interval = dynamic_end_angle - end_low;
248 return endab_interval / end_interval * 100.0;
256 if (azimuthal_p >= start_high && azimuthal_p <= end_low)
259 else if (azimuthal_p >= end_high && azimuthal_p <= start_low)
264 else if (azimuthal_p > start_low || azimuthal_p < start_high)
266 Real start_interval = start_high - start_low + 360.0;
267 Real stab_interval = (start_high - dynamic_start_angle >= 0.0)
268 ? (start_high - dynamic_start_angle)
269 : (start_high - dynamic_start_angle + 360.0);
270 return stab_interval / start_interval * 100.0;
276 Real end_interval = end_high - end_low;
277 Real endab_interval = dynamic_end_angle - end_low;
278 return endab_interval / end_interval * 100.0;
const std::vector< Real > _angle_ranges
Vector of angular ranges of control drums.
A function that returns an absorber fraction for multiple control drums application.
static InputParameters validParams()
const dof_id_type & _control_drum_id
ExtraElementID: control drum ExtraElementID.
const std::vector< std::vector< Real > > & _control_drums_azimuthal_meta
MeshMetaData: vector of azimuthal angles of all nodes of each control drum.
virtual Real value(Real t, const Point &p) const override
registerMooseObject("ReactorApp", MultiControlDrumFunction)
MultiControlDrumFunction(const InputParameters ¶meters)
const Real _rotation_start_time
Start time of control drums rotation.
const std::vector< Real > _start_angles
Vector of initial starting angles of control drums.
const std::vector< Real > _angular_speeds
Vector of angular speeds of control drums.
void paramError(const std::string ¶m, Args... args) const
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const Real _rotation_end_time
End time of control drums rotation.
const std::vector< Point > & _control_drum_positions
MeshMetaData: positions of control drums.
const bool _use_control_drum_id
Whether extra element id user_control_drum_id is used.
static InputParameters validParams()