PRISMS-PF Manual
Loading...
Searching...
No Matches
nucleation_parameters.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: © 2025 PRISMS Center at the University of Michigan
2// SPDX-License-Identifier: GNU Lesser General Public Version 2.1
3
4#pragma once
5
6#include <deal.II/base/parameter_handler.h>
7
11
13
15
17
18#include <prismspf/config.h>
19
20#include <climits>
21#include <string>
22
24
29{
30public:
34 [[nodiscard]] bool
35 should_attempt_nucleation(unsigned int increment) const;
36
40 void
41 validate() const;
42
46 void
48
52 void
53 set_nucleation_period(const unsigned int &_nucleation_period)
54 {
55 nucleation_period = _nucleation_period;
56 }
57
61 [[nodiscard]] unsigned int
63 {
64 return nucleation_period;
65 }
66
70 void
71 set_exclusion_distance(const double &_nucleus_exclusion_distance)
72 {
73 AssertThrow(_nucleus_exclusion_distance >= 0.0,
74 dealii::ExcMessage("Nucleus exclusion distance must be non-negative."));
75 nucleus_exclusion_distance = _nucleus_exclusion_distance;
76 }
77
81 [[nodiscard]] double
86
90 void
91 set_same_field_exclusion_distance(const double &exclusion_distance)
92 {
93 AssertThrow(exclusion_distance >= 0.0,
94 dealii::ExcMessage("Nucleus exclusion distance must be non-negative."));
95 same_field_nucleus_exclusion_distance = exclusion_distance;
96 }
97
101 [[nodiscard]] double
106
110 void
111 set_refinement_radius(const double &_refinement_radius)
112 {
113 AssertThrow(_refinement_radius >= 0.0,
114 dealii::ExcMessage("Nucleation refinement radius must be non-negative."));
115 refinement_radius = _refinement_radius;
116 }
117
121 [[nodiscard]] double
123 {
124 return refinement_radius;
125 }
126
130 void
131 set_seeding_time(const double &_seeding_time)
132 {
133 seeding_time = _seeding_time;
134 }
135
139 [[nodiscard]] double
141 {
142 return seeding_time;
143 }
144
148 void
149 set_seeding_increments(const unsigned int &_seeding_increments)
150 {
151 seeding_increments = _seeding_increments;
152 }
153
157 [[nodiscard]] unsigned int
159 {
160 return seeding_increments;
161 }
162
169 template <unsigned int dim>
170 [[nodiscard]] bool
171 check_active(const Nucleus<dim> &nucleus, const SimulationTimer &time_info) const
172 {
173 return nucleus.seed_increment <= time_info.get_increment() &&
174 ((time_info.get_increment() - nucleus.seed_increment) < seeding_increments ||
175 time_info.get_time() - nucleus.seed_time < seeding_time);
176 }
177
181 [[nodiscard]] bool
186
190 void
191 declare_parameters(dealii::ParameterHandler &parameter_handler) const;
192
196 void
197 assign_parameters(dealii::ParameterHandler &parameter_handler);
198
199private:
200 // The number of steps between nucleationting relevant information to screen
201 unsigned int nucleation_period = UINT_MAX;
202
203 // Whether a postprocess field is being used for nucleation
205
206 // The radius around a nucleus to exclude other nuclei
208
209 // The radius around a nucleus to exclude other nuclei in the same field
211
212 // The radius around a nucleus to refine the mesh
213 double refinement_radius = 0.0;
214
215 // Seeding time
216 double seeding_time = 0.0;
217
218 // Seeding increments
219 unsigned int seeding_increments = 1;
220};
221
222inline bool
224{
225 return !bool(increment % nucleation_period);
226}
227
228inline void
230{
231 // Check if the nucleation period is valid
232 AssertThrow(nucleation_period > 0,
233 dealii::ExcMessage("Nucleation period must be positive."));
234}
235
236inline void
238{
240 << "================================================\n"
241 << " Nucleation Parameters\n"
242 << "================================================\n"
243 << "Nucleation period: " << nucleation_period << "\n"
244 << "\n\n"
245 << std::flush;
246}
247
248inline void
250 dealii::ParameterHandler &parameter_handler) const
251{
252 parameter_handler.enter_subsection("nucleation");
253 {
254 parameter_handler.declare_entry("nucleus exclusion distance",
255 "0.0",
256 dealii::Patterns::Double(),
257 "The minimum distance between nuclei.");
258 parameter_handler.declare_entry("same field nucleus exclusion distance",
259 "0.0",
260 dealii::Patterns::Double(),
261 "The minimum distance between nuclei.");
262 parameter_handler.declare_entry(
263 "nucleation period",
264 "2147483647",
265 dealii::Patterns::Integer(1),
266 "The number of increments between nucleation attempts.");
267 parameter_handler.declare_entry(
268 "refinement radius",
269 "0.0",
270 dealii::Patterns::Double(0.0),
271 "The radius around a nucleus in which AMR is applied.");
272 parameter_handler.declare_entry(
273 "seeding time",
274 "0.0",
275 dealii::Patterns::Double(0.0),
276 "The time duration over which nuclei are considered \"active\" and refinement and "
277 "exclusion zones are applied. Same as \"seeding increments\" but in time.");
278 parameter_handler.declare_entry(
279 "seeding increments",
280 "1",
281 dealii::Patterns::Integer(1, INT_MAX),
282 "The number of increments over which nuclei are considered \"active\" and "
283 "refinement and exclusion zones are applied. Same as \"seeding time\" but in "
284 "increments.");
285 { // Declare aliases for the parameters
286 //============================================================================================
287 parameter_handler.declare_alias("nucleus exclusion distance",
288 "nucleus_exclusion_distance");
289 parameter_handler.declare_alias("nucleus exclusion distance",
290 "nucleus exclusion radius");
291 parameter_handler.declare_alias("nucleus exclusion distance",
292 "nucleus_exclusion_radius");
293 parameter_handler.declare_alias("nucleus exclusion distance", "exclusion distance");
294 parameter_handler.declare_alias("nucleus exclusion distance", "exclusion_distance");
295 parameter_handler.declare_alias("nucleus exclusion distance", "exclusion radius");
296 parameter_handler.declare_alias("nucleus exclusion distance", "exclusion_radius");
297 //
298 parameter_handler.declare_alias("same field nucleus exclusion distance",
299 "same_field_nucleus_exclusion_distance");
300 parameter_handler.declare_alias("same field nucleus exclusion distance",
301 "same field nucleus exclusion radius");
302 parameter_handler.declare_alias("same field nucleus exclusion distance",
303 "same_field_nucleus_exclusion_radius");
304 parameter_handler.declare_alias("same field nucleus exclusion distance",
305 "same field exclusion distance");
306 parameter_handler.declare_alias("same field nucleus exclusion distance",
307 "same_field_exclusion_distance");
308 parameter_handler.declare_alias("same field nucleus exclusion distance",
309 "same field exclusion radius");
310 parameter_handler.declare_alias("same field nucleus exclusion distance",
311 "same_field_exclusion_radius");
312 }
313 }
314 parameter_handler.leave_subsection();
315}
316
317inline void
318NucleationParameters::assign_parameters(dealii::ParameterHandler &parameter_handler)
319{
320 parameter_handler.enter_subsection("nucleation");
321 {
322 set_exclusion_distance(parameter_handler.get_double("nucleus exclusion distance"));
323
325 parameter_handler.get_double("same field nucleus exclusion distance"));
326
328 static_cast<unsigned int>(parameter_handler.get_integer("nucleation period")));
329
330 set_refinement_radius(parameter_handler.get_double("refinement radius"));
331
332 set_seeding_time(parameter_handler.get_double("seeding time"));
333
335 static_cast<unsigned int>(parameter_handler.get_integer("seeding increments")));
336 }
337 parameter_handler.leave_subsection();
338}
339
340PRISMS_PF_END_NAMESPACE
static dealii::ConditionalOStream & pout_summary()
Log output stream for writing a summary.log file.
Definition conditional_ostreams.cc:35
Definition simulation_timer.h:13
unsigned int get_increment() const
Definition simulation_timer.h:22
double get_time() const
Definition simulation_timer.h:28
Definition conditional_ostreams.cc:20
Struct that holds nucleation parameters.
Definition nucleation_parameters.h:29
double get_seeding_time() const
Get the seeding time.
Definition nucleation_parameters.h:140
unsigned int nucleation_period
Definition nucleation_parameters.h:201
bool should_attempt_nucleation(unsigned int increment) const
Return if the increment should be nucleationted.
Definition nucleation_parameters.h:223
double get_exclusion_distance() const
Get the nucleus exclusion distance.
Definition nucleation_parameters.h:82
unsigned int seeding_increments
Definition nucleation_parameters.h:219
void set_seeding_time(const double &_seeding_time)
Set the seeding time.
Definition nucleation_parameters.h:131
double get_same_field_exclusion_distance() const
Get the nucleus exclusion distance.
Definition nucleation_parameters.h:102
bool check_active(const Nucleus< dim > &nucleus, const SimulationTimer &time_info) const
Check if a nucleus is still active based on its seed time and increment. A nucleus is considered acti...
Definition nucleation_parameters.h:171
unsigned int get_seeding_increments() const
Get the seeding increments.
Definition nucleation_parameters.h:158
void set_same_field_exclusion_distance(const double &exclusion_distance)
Set the nucleus exclusion distance.
Definition nucleation_parameters.h:91
bool postprocessed_nucleation_rate_exists() const
Whether a postprocessed nucleation rate exists.
Definition nucleation_parameters.h:182
double refinement_radius
Definition nucleation_parameters.h:213
void declare_parameters(dealii::ParameterHandler &parameter_handler) const
Declare the parameters to be read from an input file.
Definition nucleation_parameters.h:249
void set_refinement_radius(const double &_refinement_radius)
Set the refinement radius.
Definition nucleation_parameters.h:111
void set_exclusion_distance(const double &_nucleus_exclusion_distance)
Set the nucleus exclusion distance.
Definition nucleation_parameters.h:71
double same_field_nucleus_exclusion_distance
Definition nucleation_parameters.h:210
double nucleus_exclusion_distance
Definition nucleation_parameters.h:207
void print_parameter_summary() const
Print parameters to summary.log.
Definition nucleation_parameters.h:237
unsigned int get_nucleation_period() const
Get the nucleation period.
Definition nucleation_parameters.h:62
void validate() const
Postprocess and validate parameters.
Definition nucleation_parameters.h:229
bool pp_nucleation_rate_exists
Definition nucleation_parameters.h:204
void set_nucleation_period(const unsigned int &_nucleation_period)
Set the print nucleation period.
Definition nucleation_parameters.h:53
double seeding_time
Definition nucleation_parameters.h:216
void assign_parameters(dealii::ParameterHandler &parameter_handler)
Assign the parameters read from an input file to this object.
Definition nucleation_parameters.h:318
void set_seeding_increments(const unsigned int &_seeding_increments)
Set the seeding increments.
Definition nucleation_parameters.h:149
double get_refinement_radius() const
Get the refinement radius.
Definition nucleation_parameters.h:122
This class contains mutable utilities for phase field problems.
Definition nucleus.h:23
double seed_time
Definition nucleus.h:45
unsigned int seed_increment
Definition nucleus.h:46