26 #include <boost/mpi.hpp> 27 #include <boost/math/distributions/normal.hpp> 28 #include <boost/serialization/array.hpp> 40 class Threeph_process;
43 namespace serialization {
44 template <
class Archive>
47 const unsigned int file_version);
57 friend class boost::serialization::access;
58 template <
class Archive>
59 friend void boost::serialization::save_construct_data(
62 const unsigned int file_version);
65 const std::string& description,
69 const std::vector<Threeph_process>& processes,
70 const boost::mpi::communicator& comm);
72 friend std::tuple<std::string,
73 std::unique_ptr<Crystal_structure>,
74 std::unique_ptr<Symmetry_operations>,
75 std::unique_ptr<Gamma_grid>,
76 std::unique_ptr<std::vector<Threeph_process>>>
77 load_bulk_hdf5(
const char* filename,
const boost::mpi::communicator& comm);
84 bool gaussian_computed;
95 template <
class Archive>
96 void serialize(Archive& ar,
const unsigned int file_version) {
97 ar & this->gaussian_computed;
99 if (this->gaussian_computed)
101 ar & this->vp2_computed;
103 if (this->vp2_computed)
112 const std::array<std::size_t, 3>
q;
114 const std::array<std::size_t, 3>
alpha;
119 const std::array<std::size_t, 3>& _q,
120 const std::array<std::size_t, 3>& _alpha,
124 : domega(_domega), sigma(_sigma), gaussian_computed(false),
125 vp2_computed(false), c(_c), q(
std::move(_q)),
126 alpha(
std::move(_alpha)), type(_type) {
132 : domega(original.domega), sigma(original.sigma),
133 gaussian_computed(original.gaussian_computed),
134 gaussian(original.gaussian), vp2_computed(original.vp2_computed),
135 vp2(original.vp2), c(original.c), q(original.q),
136 alpha(original.alpha), type(original.type) {
147 if (!this->gaussian_computed) {
148 auto distr = boost::math::normal(0., this->sigma);
149 this->gaussian = boost::math::pdf(distr, this->domega);
150 this->gaussian_computed =
true;
152 return this->gaussian;
168 double compute_weighted_gaussian(
const Gamma_grid& grid,
double T);
181 const std::vector<Thirdorder_ifcs>& thirdorder);
189 if (!this->vp2_computed)
197 return this->vp2_computed;
207 double compute_gamma(
const Gamma_grid& grid,
double T);
216 double compute_gamma_reduced(
const Gamma_grid& grid,
double T);
225 Eigen::ArrayXd compute_collision(
const Gamma_grid& grid,
226 const Eigen::ArrayXXd& n0);
241 const boost::mpi::communicator& communicator,
242 double scalebroad = 1.0);
253 std::vector<alma::Threeph_process>& processes,
255 const boost::mpi::communicator& comm);
268 Eigen::ArrayXXd calc_w0_threeph(
270 std::vector<alma::Threeph_process>& processes,
273 const boost::mpi::communicator& comm);
277 namespace serialization {
282 template <
class Archive>
285 const unsigned int file_version) {
287 ar << make_array(t->
q.data(), t->
q.size());
288 ar << make_array(t->
alpha.data(), t->
alpha.size());
300 template <
class Archive>
303 const unsigned int file_version) {
307 std::array<std::size_t, 3> q;
308 ar >> make_array(q.data(), q.size());
309 std::array<std::size_t, 3> alpha;
310 ar >> make_array(alpha.data(), alpha.size());
std::vector< Threeph_process > find_allowed_threeph(const Gamma_grid &grid, const boost::mpi::communicator &communicator, double scalebroad=1.0)
Look for allowed three-phonon processes in a regular grid.
Definition: processes.cpp:26
Definition: analytic1d.hpp:26
const std::array< std::size_t, 3 > q
q point indices of each of the three phonons involved.
Definition: processes.hpp:112
Definition: isotopic_scattering.hpp:58
const threeph_type type
Type of process.
Definition: processes.hpp:116
void save_construct_data(Archive &ar, const alma::Twoph_process *t, const unsigned int file_version)
Overload required to serialize the const members of alma::Twoph_process.
Definition: isotopic_scattering.hpp:215
void save_bulk_hdf5(const char *filename, const std::string &description, const Crystal_structure &cell, const Symmetry_operations &symmetries, const Gamma_grid &grid, const std::vector< Threeph_process > &processes, const boost::mpi::communicator &comm)
Save all relevant information about a bulk material to an HDF5 file.
Definition: bulk_hdf5.cpp:125
Eigen::ArrayXXd calc_w0_threeph(const alma::Gamma_grid &grid, std::vector< alma::Threeph_process > &processes, double T, const boost::mpi::communicator &comm)
Compute and store the three-phonon contribution to the RTA scattering rates for all vibrational modes...
Definition: processes.cpp:240
Classes and functions used to manipulate grids in reciprocal space.
double get_vp2() const
Return the modulus squared of the matrix element of the process or throw an exception if it has not b...
Definition: processes.hpp:188
Threeph_process(std::size_t _c, const std::array< std::size_t, 3 > &_q, const std::array< std::size_t, 3 > &_alpha, threeph_type _type, double _domega, double _sigma)
Basic constructor.
Definition: processes.hpp:118
double compute_gaussian()
Compute and return the Gaussian factor of the process, i.e., the amplitude of the regularized delta...
Definition: processes.hpp:146
void load_construct_data(Archive &ar, alma::Twoph_process *t, const unsigned int file_version)
Overload required to deserialize the const members of alma::Twoph_process by calling the non-default ...
Definition: isotopic_scattering.hpp:233
const std::size_t c
Equivalence class of the first phonon.
Definition: processes.hpp:110
Base class for all exceptions in ALMA.
Definition: exceptions.hpp:25
const std::array< std::size_t, 3 > alpha
Mode indices of the three phonons involved.
Definition: processes.hpp:114
Definitions of the basic data-handling classes in ALMA.
Objects of this class hold a subset of the information provided by spg_get_dataset().
Definition: symmetry.hpp:47
bool is_vp2_computed() const
Definition: processes.hpp:196
Objects of this class represent a regular grid with the Gamma point in one corner.
Definition: qpoint_grid.hpp:32
Hold information about a crystal structure.
Definition: structures.hpp:51
Representation of a three-phonon process.
Definition: processes.hpp:55
std::tuple< std::string, std::unique_ptr< Crystal_structure >, std::unique_ptr< Symmetry_operations >, std::unique_ptr< Gamma_grid >, std::unique_ptr< std::vector< Threeph_process > > > load_bulk_hdf5(const char *filename, const boost::mpi::communicator &comm)
Reconstruct all data structures from a file saved with save_bulk_hdf5().
Definition: bulk_hdf5.cpp:442
threeph_type
Process type (emission or absorption).
Definition: processes.hpp:53
Threeph_process(const Threeph_process &original)
Copy constructor.
Definition: processes.hpp:131