PRISMS-PF Manual
Loading...
Searching...
No Matches
nucleus.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/point.h>
7
9
10#include <prismspf/config.h>
11
12#include <mpi.h>
13#include <ostream>
14#include <string>
15
17
21template <unsigned int dim>
22struct Nucleus
23{
24public:
28 Nucleus() = default;
29
30 Nucleus(const unsigned int &_field_index,
31 const dealii::Point<dim> &_location,
32 const double &_seed_time,
33 const unsigned int &_seed_increment)
38 {}
39
40 dealii::Point<dim, dealii::VectorizedArray<double>>
41 location_vectorized() const;
42
43 unsigned int field_index = 0;
44 dealii::Point<dim> location;
45 double seed_time = 0.0;
46 unsigned int seed_increment = 0;
47
48 static MPI_Datatype
50};
51
52template <unsigned int dim>
53inline dealii::Point<dim, dealii::VectorizedArray<double>>
55{
56 dealii::Point<dim, dealii::VectorizedArray<double>> result;
57 for (unsigned int d = 0; d < dim; ++d)
58 {
59 result[d] = dealii::VectorizedArray<double>(location[d]);
60 }
61 return result;
62}
63
64template <unsigned int dim, typename OStream>
67{
68 ost << "Field Index: " << std::to_string(nucleus.field_index)
69 << " ; Location: " << nucleus.location
70 << " ; Seed Time: " << std::to_string(nucleus.seed_time)
71 << " ; Seed Increment: " << std::to_string(nucleus.seed_increment);
72 return ost;
73}
74
75template <unsigned int dim>
76inline MPI_Datatype
78{
81 {
82 return MPI_NUCLEUS;
83 }
84
85 constexpr int block_lengths[4] = {1, static_cast<int>(dim), 1, 1};
88
92
93 MPI_Get_address(&dummy.field_index, &displacements[0]);
94 MPI_Get_address(&dummy.location[0], &displacements[1]);
95 MPI_Get_address(&dummy.seed_time, &displacements[2]);
96 MPI_Get_address(&dummy.seed_increment, &displacements[3]);
97
98 for (int i = 0; i < 4; ++i)
99 {
100 displacements[i] -= base;
101 }
102
105
106 return MPI_NUCLEUS;
107}
108
@ Value
Use value of the variable as a criterion for refinement.
Definition grid_refiner_criterion.h:31
Definition conditional_ostreams.cc:20
OStream & operator<<(OStream &ost, const Nucleus< dim > &nucleus)
Definition nucleus.h:66
This class contains mutable utilities for phase field problems.
Definition nucleus.h:23
static MPI_Datatype mpi_datatype()
Definition nucleus.h:77
dealii::Point< dim, dealii::VectorizedArray< double > > location_vectorized() const
Definition nucleus.h:54
Nucleus(const unsigned int &_field_index, const dealii::Point< dim > &_location, const double &_seed_time, const unsigned int &_seed_increment)
Definition nucleus.h:30
Nucleus()=default
Constructor.
unsigned int field_index
Definition nucleus.h:43
double seed_time
Definition nucleus.h:45
unsigned int seed_increment
Definition nucleus.h:46
dealii::Point< dim > location
Definition nucleus.h:44