Scine::Sparrow  5.0.0
Library for fast and agile quantum chemical calculations with semiempirical methods.
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Pages
ConstexprParameters.h
Go to the documentation of this file.
1 
7 #ifndef INCLUDE_SPARROW_CONSTEXPR_NDDO_PARAMETERS_H
8 #define INCLUDE_SPARROW_CONSTEXPR_NDDO_PARAMETERS_H
9 
11 #include <algorithm>
12 #include <array>
13 #include <tuple>
14 
15 namespace Scine {
16 namespace Sparrow {
17 namespace nddo {
18 
19 template<std::size_t s>
21  static constexpr std::size_t size = s;
22 
23  int Z;
25  std::array<Parameters::Atomic::GaussianRepulsion, size> gaussianRepulsion;
26 };
27 
28 template<typename... GRep>
29 constexpr auto atomic(int Z, Parameters::Atomic::Pack pack, GRep&&... greps) {
30  return ConstexprAtomic<sizeof...(greps)>{Z, std::move(pack), {std::forward<GRep>(greps)...}};
31 }
32 
33 template<std::size_t s>
34 Parameters::Atomic runtime(const ConstexprAtomic<s>& a) {
35  Parameters::Atomic atomic;
36  atomic.pack = a.pack;
37  atomic.gaussianRepulsion.resize(s);
38  std::copy(std::begin(a.gaussianRepulsion), std::end(a.gaussianRepulsion), std::begin(atomic.gaussianRepulsion));
39  return atomic;
40 }
41 
42 namespace detail {
43 
44 template<typename AtomicsTuple, std::size_t... Inds>
45 std::unordered_map<int, Parameters::Atomic> runtime(AtomicsTuple&& tup, std::index_sequence<Inds...> /* inds */) {
46  return std::unordered_map<int, Parameters::Atomic>{
47  {std::get<Inds>(tup).Z, runtime(std::get<Inds>(tup))}...,
48  };
49 }
50 
51 } // namespace detail
52 
53 template<typename AtomicsTuple>
54 std::unordered_map<int, Parameters::Atomic> runtime(AtomicsTuple&& tup) {
55  return detail::runtime(std::forward<AtomicsTuple>(tup),
56  std::make_index_sequence<std::tuple_size<std::decay_t<AtomicsTuple>>::value>{});
57 }
58 
60  int Z1 = 0;
61  int Z2 = 0;
62  Parameters::Diatomic constants;
63 };
64 
65 constexpr ConstexprDiatomic diatomic(int Z1, int Z2, double exponent, double factor) {
66  return {Z1, Z2, {exponent, factor}};
67 }
68 
69 template<typename AtomicList, std::size_t d>
71  static constexpr std::size_t diatomicSize = d;
72 
73  AtomicList atomic;
74  std::array<ConstexprDiatomic, d> diatomic;
75 };
76 
77 template<typename... Atomics>
78 constexpr auto collect(Atomics&&... atomics) {
79  return std::make_tuple(std::forward<Atomics>(atomics)...);
80 }
81 
82 template<typename AtomicList, typename... Diatomics>
83 constexpr auto make_parameters(AtomicList&& atomics, Diatomics... diatomics) {
84  return ConstexprParameters<AtomicList, sizeof...(Diatomics)>{std::forward<AtomicList>(atomics),
85  {
86  std::forward<Diatomics>(diatomics)...,
87  }};
88 }
89 
90 template<typename AtomicList, std::size_t s>
91 Parameters runtime(const ConstexprParameters<AtomicList, s>& a) {
92  Parameters nddo;
93 
94  nddo.atomic = runtime(a.atomic);
95 
96  for (const ConstexprDiatomic& diatomic : a.diatomic) {
97  nddo.diatomic.emplace(std::make_pair(diatomic.Z1, diatomic.Z2), diatomic.constants);
98  }
99 
100  return nddo;
101 }
102 
103 } // namespace nddo
104 } // namespace Sparrow
105 } // namespace Scine
106 
107 #endif
Pack of implicitly constexpr part of atomic parameters.
Definition: Parameters.h:33
Diatomic parameters.
Definition: Parameters.h:103
Definition: ConstexprParameters.h:59
Definition: ConstexprParameters.h:70
Definition: Parameters.h:24
std::vector< GaussianRepulsion > gaussianRepulsion
Gaussian repulsion parameters (usually 0-3)
Definition: Parameters.h:95
Pack pack
Gaussian repulsion parameters (usually 0-3)
Definition: Parameters.h:93
Definition: ConstexprParameters.h:20