1 /*
2  *            Copyright 2009-2020 The VOTCA Development Team
3  *                       (http://www.votca.org)
4  *
5  *      Licensed under the Apache License, Version 2.0 (the "License")
6  *
7  * You may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *              http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  */
19 
20 #pragma once
21 #ifndef VOTCA_XTP_AOTRANSFORM_H
22 #define VOTCA_XTP_AOTRANSFORM_H
23 
24 // Local VOTCA includes
25 #include "aoshell.h"
26 #include "eigen.h"
27 
28 namespace votca {
29 namespace xtp {
30 // clang-format off
31 //clang format puts one entry on each line
32 namespace Cart{
33 enum Cart {
34   s,  // s
35   x,  y,  z,  // p
36   xx,  xy,  xz,  yy,  yz,  zz,  // d
37   xxx,  xxy,  xxz,  xyy,  xyz,  xzz,  yyy,  yyz,  yzz,  zzz,  // f
38 
39   xxxx,  xxxy,  xxxz,  xxyy,  xxyz,  xxzz,  xyyy,  xyyz,  xyzz,  xzzz,  yyyy,
40   yyyz,  yyzz,  yzzz,  zzzz,  // g
41 
42   xxxxx,  xxxxy,  xxxxz,  xxxyy,  xxxyz,  xxxzz,  xxyyy,  xxyyz,  xxyzz,
43   xxzzz,  xyyyy,  xyyyz,  xyyzz,  xyzzz,  xzzzz,  yyyyy,  yyyyz,  yyyzz,
44   yyzzz,  yzzzz,  zzzzz,  // h
45 
46   xxxxxx,  xxxxxy,  xxxxxz,  xxxxyy,  xxxxyz,  xxxxzz,  xxxyyy,  xxxyyz,
47   xxxyzz,  xxxzzz,  xxyyyy,  xxyyyz,  xxyyzz,  xxyzzz,  xxzzzz,  xyyyyy,
48   xyyyyz,  xyyyzz,  xyyzzz,  xyzzzz,  xzzzzz,  yyyyyy,  yyyyyz,  yyyyzz,
49   yyyzzz,  yyzzzz,  yzzzzz,  zzzzzz, //i
50 
51   xxxxxxx,  xxxxxxy,  xxxxxxz,  xxxxxyy,  xxxxxyz,  xxxxxzz,  xxxxyyy,
52   xxxxyyz,  xxxxyzz,  xxxxzzz,  xxxyyyy,  xxxyyyz,  xxxyyzz,  xxxyzzz,
53   xxxzzzz,  xxyyyyy,  xxyyyyz,  xxyyyzz,  xxyyzzz,  xxyzzzz,  xxzzzzz,
54   xyyyyyy,  xyyyyyz,  xyyyyzz,  xyyyzzz,  xyyzzzz,  xyzzzzz,  xzzzzzz,
55   yyyyyyy,  yyyyyyz,  yyyyyzz,  yyyyzzz,  yyyzzzz,  yyzzzzz,  yzzzzzz,
56   zzzzzzz, //j
57 
58   xxxxxxxx,  xxxxxxxy,  xxxxxxxz,  xxxxxxyy,  xxxxxxyz,  xxxxxxzz,  xxxxxyyy,
59   xxxxxyyz,  xxxxxyzz,  xxxxxzzz,  xxxxyyyy,  xxxxyyyz,  xxxxyyzz,  xxxxyzzz,
60   xxxxzzzz,  xxxyyyyy,  xxxyyyyz,  xxxyyyzz,  xxxyyzzz,  xxxyzzzz,  xxxzzzzz,
61   xxyyyyyy,  xxyyyyyz,  xxyyyyzz,  xxyyyzzz,  xxyyzzzz,  xxyzzzzz,  xxzzzzzz,
62   xyyyyyyy,  xyyyyyyz,  xyyyyyzz,  xyyyyzzz,  xyyyzzzz,  xyyzzzzz,  xyzzzzzz,
63   xzzzzzzz,  yyyyyyyy,  yyyyyyyz,  yyyyyyzz,  yyyyyzzz,  yyyyzzzz,  yyyzzzzz,
64   yyzzzzzz,  yzzzzzzz,  zzzzzzzz, //k
65 };
66 }
67 
68 // clang-format on
69 
70 /* contains cartesian to spherical conversion
71  */
72 
73 class AOTransform {
74 
75  public:
76   static std::array<int, 9> n_orbitals();
77   static std::array<int, 165> nx();
78   static std::array<int, 165> ny();
79   static std::array<int, 165> nz();
80   static std::array<int, 165> i_less_x();
81   static std::array<int, 165> i_less_y();
82   static std::array<int, 165> i_less_z();
83   static std::array<int, 120> i_more_x();
84   static std::array<int, 120> i_more_y();
85   static std::array<int, 120> i_more_z();
86 
87   static Index getBlockSize(Index lmax);
88   static Eigen::VectorXd XIntegrate(Index size, double U);
89 
90   static double getNorm(L l, const AOGaussianPrimitive& gaussian);
91 
92   /// transforms a cartesian shell to a spherical cartesian shell
93   template <typename Matrix>
94   static Matrix tform(L l_row, L l_col, const Matrix& cartesian);
95 };
96 
97 }  // namespace xtp
98 }  // namespace votca
99 
100 #endif  // VOTCA_XTP_AOTRANSFORM_H
101