1# Copyright 2014-2019 The PySCF Developers. All Rights Reserved.
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7#     http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14#
15# Author: Samragni Banerjee <samragnibanerjee4@gmail.com>
16#         Alexander Sokolov <alexander.y.sokolov@gmail.com>
17#
18
19import unittest
20import numpy
21from pyscf import gto
22from pyscf import scf
23from pyscf import adc
24from pyscf import df
25
26r = 1.098
27mol = gto.Mole()
28mol.atom = [
29    ['N', ( 0., 0.    , -r/2   )],
30    ['N', ( 0., 0.    ,  r/2)],]
31mol.basis = {'N':'cc-pvdz'}
32mol.verbose = 0
33mol.build()
34mf = scf.RHF(mol).density_fit(auxbasis='cc-pvdz-jkfit')
35mf.kernel()
36myadc = adc.ADC(mf)
37myadc = adc.ADC(mf).density_fit(auxbasis='cc-pvdz-ri')
38
39def tearDownModule():
40    global mol,mf
41    del mol,mf
42
43class KnownValues(unittest.TestCase):
44
45    def test_df_gs(self):
46
47        mf = scf.RHF(mol).run()
48        myadc.with_df = df.DF(mol, auxbasis='cc-pvdz-ri')
49        e, t_amp1, t_amp2 = myadc.kernel_gs()
50        self.assertAlmostEqual(e, -0.31081009625, 6)
51
52    def test_dfhf_dfadc_gs(self):
53
54        myadc.with_df = df.DF(mol, auxbasis='cc-pvdz-ri')
55        e, t_amp1, t_amp2 = myadc.kernel_gs()
56        self.assertAlmostEqual(e, -0.3108102956, 6)
57
58    def test_dfadc3_ip(self):
59
60        myadc = adc.ADC(mf).density_fit(auxbasis='cc-pvdz-ri')
61        myadc.max_memory = 2
62        myadc.method = "adc(3)"
63        myadc.method_type = "ip"
64
65        e,v,p,x = myadc.kernel(nroots=3)
66        e_corr = myadc.e_corr
67
68        self.assertAlmostEqual(e_corr, -0.3061165912 , 6)
69
70        self.assertAlmostEqual(e[0], 0.55609388, 6)
71        self.assertAlmostEqual(e[1], 0.60109239, 6)
72        self.assertAlmostEqual(e[2], 0.60109239, 6)
73
74        self.assertAlmostEqual(p[0], 1.83255357, 6)
75        self.assertAlmostEqual(p[1], 1.86389642, 6)
76        self.assertAlmostEqual(p[2], 1.86389642, 6)
77
78    def test_dfhf_dfadc2_ea(self):
79
80        myadc.max_memory = 20
81        myadc.method = "adc(2)"
82        myadc.method_type = "ea"
83
84        e,v,p,x = myadc.kernel(nroots=4)
85        myadc.analyze()
86
87        self.assertAlmostEqual(e[0], 0.14260766, 6)
88        self.assertAlmostEqual(e[1], 0.14260766, 6)
89        self.assertAlmostEqual(e[2], 0.55083845, 6)
90        self.assertAlmostEqual(e[3], 0.76736577, 6)
91
92        self.assertAlmostEqual(p[0], 1.86603796, 6)
93        self.assertAlmostEqual(p[1], 1.86603796, 6)
94        self.assertAlmostEqual(p[2], 1.92699634, 6)
95        self.assertAlmostEqual(p[3], 1.88366005, 6)
96
97    def test_hf_dfadc2_ea(self):
98
99        mf = scf.RHF(mol).run()
100        myadc = adc.ADC(mf).density_fit(auxbasis='cc-pvdz-ri')
101        myadc.max_memory = 20
102        myadc.method = "adc(2)"
103        myadc.method_type = "ea"
104
105        e,v,p,x = myadc.kernel(nroots=4)
106
107        self.assertAlmostEqual(e[0], 0.14265314, 6)
108        self.assertAlmostEqual(e[1], 0.14265314, 6)
109        self.assertAlmostEqual(e[2], 0.55092042, 6)
110        self.assertAlmostEqual(e[3], 0.76714415, 6)
111
112        self.assertAlmostEqual(p[0], 1.86604908, 6)
113        self.assertAlmostEqual(p[1], 1.86604908, 6)
114        self.assertAlmostEqual(p[2], 1.92697854, 6)
115        self.assertAlmostEqual(p[3], 1.88386011, 6)
116
117
118if __name__ == "__main__":
119    print("DF-ADC calculations for different RADC methods for nitrogen molecule")
120    unittest.main()
121