StatMech
Loading...
Searching...
No Matches
MicroCanonicalAverage.hpp
Go to the documentation of this file.
1
11#pragma once
12
13#ifndef __NVCC__
14 #define __host__
15 #define __device__
16#endif
17#include "Eigen/Dense"
18
26 private:
27 template<class T>
28 using Vector_t = Eigen::VectorX<T>;
29
30 int m_dim;
35
36 public:
37 template<typename InVector_t>
38 __host__ __device__ MicroCanonicalAverage(InVector_t const& eigVal, double const shellWidth)
40 m_idMin.resize(m_dim);
41 m_idMax.resize(m_dim);
42 m_dimShell.resize(m_dim);
43
44 // clang-format off
45 #pragma omp parallel for
46 // clang-format on
47 for(auto j = 0; j < m_dim; ++j) {
48 int idMin, idMax;
49 for(idMin = j; idMin >= 0 && eigVal[j] - eigVal[idMin] <= shellWidth; --idMin) {};
50 m_idMin[j] = (++idMin);
51 for(idMax = j; idMax < m_dim && eigVal[idMax] - eigVal[j] <= shellWidth; ++idMax) {};
52 m_idMax[j] = (--idMax);
53 m_dimShell[j] = idMax - idMin + 1;
54 }
55 }
56
63 __host__ void status(void) const {
64 std::cout << "MicroCanonicalAverage.status()"
65 << "\n"
66 << "\tDim: " << this->dim() << "\n"
67 << "\tShellWidth: " << this->shellWidth() << std::endl;
68 }
69
70 __host__ __device__ int dim() const { return m_dim; }
71 __host__ __device__ double shellWidth() const { return m_shellWidth; }
72
73 __host__ __device__ int dimShell(int index) const { return m_dimShell[index]; }
74 __host__ __device__ Vector_t<int>& dimShell() { return m_dimShell; }
75 __host__ __device__ Vector_t<int> const& dimShell() const { return m_dimShell; }
76
77 __host__ __device__ Vector_t<double>& eigVal() { return m_eigVal; }
78 __host__ __device__ Vector_t<double> const& eigVal() const { return m_eigVal; }
79
80 template<class VectorType>
81 __host__ __device__ void operator()(VectorType& res, VectorType const& expVal) const {
82 res.resize(m_dim);
83 // clang-format off
84 #pragma omp parallel for
85 // clang-format on
86 for(int j = 0; j < m_dim; ++j) {
87 res[j] = 0;
88 for(auto id = m_idMin[j]; id <= m_idMax[j]; ++id) res[j] += expVal[id];
89 res[j] /= double(m_dimShell[j]);
90 }
91 }
92};
Calculate the microcanonical averages with respect to a given sorted vector 'eigVal'.
Definition MicroCanonicalAverage.hpp:25
__host__ __device__ Vector_t< int > & dimShell()
Definition MicroCanonicalAverage.hpp:74
Vector_t< int > m_dimShell
Definition MicroCanonicalAverage.hpp:34
int m_dim
Definition MicroCanonicalAverage.hpp:30
__host__ __device__ Vector_t< double > & eigVal()
Definition MicroCanonicalAverage.hpp:77
__host__ __device__ Vector_t< double > const & eigVal() const
Definition MicroCanonicalAverage.hpp:78
Eigen::VectorX< T > Vector_t
Definition MicroCanonicalAverage.hpp:28
Vector_t< int > m_idMax
Definition MicroCanonicalAverage.hpp:33
__host__ __device__ int dimShell(int index) const
Definition MicroCanonicalAverage.hpp:73
__host__ __device__ void operator()(VectorType &res, VectorType const &expVal) const
Definition MicroCanonicalAverage.hpp:81
double m_shellWidth
Definition MicroCanonicalAverage.hpp:31
__host__ void status(void) const
Show the current status of the instance.
Definition MicroCanonicalAverage.hpp:63
Vector_t< double > m_eigVal
Definition MicroCanonicalAverage.hpp:32
__host__ __device__ Vector_t< int > const & dimShell() const
Definition MicroCanonicalAverage.hpp:75
__host__ __device__ int dim() const
Definition MicroCanonicalAverage.hpp:70
__host__ __device__ MicroCanonicalAverage(InVector_t const &eigVal, double const shellWidth)
Definition MicroCanonicalAverage.hpp:38
Vector_t< int > m_idMin
Definition MicroCanonicalAverage.hpp:33
__host__ __device__ double shellWidth() const
Definition MicroCanonicalAverage.hpp:71
__constant__ int size
Definition testEigenOnGPU.cu:4