示例#1
0
    def test_gen(self):
        ewald = ls.Ewald([0.7, 0.7, 0.7], [0.2, 0.1, 0.05])
        self.assertTrue(len(ewald.scales) == 3)
        self.assertTrue(len(ewald.omegas) == 3)
        self.assertTrue(ewald.scales[0] == 0.7)
        self.assertTrue(ewald.scales[1] == 0.7)
        self.assertTrue(ewald.scales[2] == 0.7)
        self.assertTrue(ewald.omegas[0] == 0.2)
        self.assertTrue(ewald.omegas[1] == 0.1)
        self.assertTrue(ewald.omegas[2] == 0.05)
        self.assertFalse(ewald.is_coulomb)
        self.assertFalse(ewald.is_sr)
        self.assertFalse(ewald.is_lr)

        with self.assertRaises(IndexError):
            ewald.scales[3]
        with self.assertRaises(IndexError):
            ewald.omegas[3]

        with self.assertRaises(RuntimeError):
            ewald.sr_scale
        with self.assertRaises(RuntimeError):
            ewald.sr_omega

        with self.assertRaises(RuntimeError):
            ewald.lr_scale
        with self.assertRaises(RuntimeError):
            ewald.lr_omega
示例#2
0
    def test_fake_sr(self):
        ewald = ls.Ewald([-0.7, 0.7], [-1.0, -1.0])
        self.assertTrue(len(ewald.scales) == 2)
        self.assertTrue(len(ewald.omegas) == 2)
        self.assertTrue(ewald.scales[0] == -0.7)
        self.assertTrue(ewald.scales[1] == 0.7)
        self.assertTrue(ewald.omegas[0] == -1.0)
        self.assertTrue(ewald.omegas[1] == -1.0)
        self.assertFalse(ewald.is_coulomb)
        self.assertFalse(ewald.is_sr)
        self.assertFalse(ewald.is_lr)

        with self.assertRaises(IndexError):
            ewald.scales[2]
        with self.assertRaises(IndexError):
            ewald.omegas[2]

        with self.assertRaises(RuntimeError):
            ewald.sr_scale
        with self.assertRaises(RuntimeError):
            ewald.sr_omega

        with self.assertRaises(RuntimeError):
            ewald.lr_scale
        with self.assertRaises(RuntimeError):
            ewald.lr_omega
示例#3
0
    def test_lr(self):
        ewald = ls.Ewald([0.7], [0.3])
        self.assertTrue(len(ewald.scales) == 1)
        self.assertTrue(len(ewald.omegas) == 1)
        self.assertTrue(ewald.scales[0] == 0.7)
        self.assertTrue(ewald.omegas[0] == 0.3)
        self.assertFalse(ewald.is_coulomb)
        self.assertFalse(ewald.is_sr)
        self.assertTrue(ewald.is_lr)

        with self.assertRaises(IndexError):
            ewald.scales[1]
        with self.assertRaises(IndexError):
            ewald.omegas[1]

        with self.assertRaises(RuntimeError):
            ewald.sr_scale
        with self.assertRaises(RuntimeError):
            ewald.sr_omega

        self.assertTrue(ewald.lr_scale == 0.7)
        self.assertTrue(ewald.lr_omega == 0.3)
示例#4
0
    def test_coulomb(self):
        ewald = ls.Ewald([1.0], [-1.0])
        self.assertTrue(len(ewald.scales) == 1)
        self.assertTrue(len(ewald.omegas) == 1)
        self.assertTrue(ewald.scales[0] == 1.0)
        self.assertTrue(ewald.omegas[0] == -1.0)
        self.assertTrue(ewald.is_coulomb)
        self.assertFalse(ewald.is_sr)
        self.assertFalse(ewald.is_lr)

        with self.assertRaises(IndexError):
            ewald.scales[1]
        with self.assertRaises(IndexError):
            ewald.omegas[1]

        with self.assertRaises(RuntimeError):
            ewald.sr_scale
        with self.assertRaises(RuntimeError):
            ewald.sr_omega

        with self.assertRaises(RuntimeError):
            ewald.lr_scale
        with self.assertRaises(RuntimeError):
            ewald.lr_omega
示例#5
0
def run_mix_basis_4(run_dir):

    tol = 1.0E-12

    res = ls.ResourceList.build(1024**2,1024**2)
    ewald = ls.Ewald([1.0], [-1.0])

    xyz_list = ['h2o', 'nh3', 'ch4', 'c2h4']
    bas_list = ['sto-3g', '6-31gs', 'cc-pvdz', '3-21g']

    # molecule list

    mol = []
    for i, xyz_i in enumerate(xyz_list):
        mol.append(ls.Molecule.from_xyz_file(run_dir + xyz_i + '.xyz'))

    molC = ls.Molecule.concatenate(mol,0,1)
    xyzc = molC.xyzZ

    print("")
    print("  Task: J,K")
    print("\n  %-12s%-12s%-12s%-12s%15s" % \
            ("Mol1", "Mol2", "Mol3", "Mol4", "Max_Diff"))
    print("  %s" % ('-'*63))

    # reference npz file

    npzfile = run_dir + "mix"
    for xyzname in xyz_list:
        npzfile += "_" + xyzname
    npzfile += ".npz"

    refs = np.load(npzfile)

    # basis list

    bas_list_2 = bas_list + bas_list

    for ind in range(len(bas_list)):

        new_bas_list = bas_list_2[ind:ind+len(xyz_list)]

        bas = []
        N = []
        for i, bas_i in enumerate(new_bas_list):
            bas.append(ls.Basis.from_gbs_file(mol[i], bas_i))
            N.append(bas[i].nao)

        N1 = N[0]
        N2 = N[0] + N[1]
        N3 = N[0] + N[1] + N[2]
        N4 = N[0] + N[1] + N[2] + N[3]

        basC = ls.Basis.concatenate(bas)

        pairs_11 = ls.PairList.build_schwarz(bas[0],bas[0],True,1.0E-14)
        pairs_22 = ls.PairList.build_schwarz(bas[1],bas[1],True,1.0E-14)
        pairs_33 = ls.PairList.build_schwarz(bas[2],bas[2],True,1.0E-14)

        pairs_12 = ls.PairList.build_schwarz(bas[0],bas[1],False,1.0E-14)
        pairs_21 = ls.PairList.build_schwarz(bas[1],bas[0],False,1.0E-14)
        pairs_13 = ls.PairList.build_schwarz(bas[0],bas[2],False,1.0E-14)
        pairs_31 = ls.PairList.build_schwarz(bas[2],bas[0],False,1.0E-14)
        pairs_23 = ls.PairList.build_schwarz(bas[1],bas[2],False,1.0E-14)
        pairs_32 = ls.PairList.build_schwarz(bas[2],bas[1],False,1.0E-14)
        pairs_34 = ls.PairList.build_schwarz(bas[2],bas[3],False,1.0E-14)
        pairs_42 = ls.PairList.build_schwarz(bas[3],bas[1],False,1.0E-14)

        suffix = ""
        for basname in new_bas_list:
            suffix += "_" + basname.upper()

        # calculate integrals in mixed basis set

        vals = collections.OrderedDict()

        D11 = ls.Tensor.array(refs['D11'+suffix])
        D12 = ls.Tensor.array(refs['D12'+suffix])

        # D11 (11|pq) => Jpq
        vals['J1111'+suffix] = ls.IntBox.coulomb(
                res, ewald, pairs_11, pairs_11, D11, 1.0E-14, 1.0E-14
                )
        vals['J1112'+suffix] = ls.IntBox.coulomb(
                res, ewald, pairs_12, pairs_11, D11, 1.0E-14, 1.0E-14
                )
        vals['J1122'+suffix] = ls.IntBox.coulomb(
                res, ewald, pairs_22, pairs_11, D11, 1.0E-14, 1.0E-14
                )
        vals['J1123'+suffix] = ls.IntBox.coulomb(
                res, ewald, pairs_23, pairs_11, D11, 1.0E-14, 1.0E-14
                )

        # D12 (12|pq) => Jpq
        vals['J1234'+suffix] = ls.IntBox.coulomb(
                res, ewald, pairs_34, pairs_12, D12, 1.0E-14, 1.0E-14
                )
        vals['J1233'+suffix] = ls.IntBox.coulomb(
                res, ewald, pairs_33, pairs_12, D12, 1.0E-14, 1.0E-14
                )
        vals['J1223'+suffix] = ls.IntBox.coulomb(
                res, ewald, pairs_23, pairs_12, D12, 1.0E-14, 1.0E-14
                )
        vals['J1222'+suffix] = ls.IntBox.coulomb(
                res, ewald, pairs_22, pairs_12, D12, 1.0E-14, 1.0E-14
                )
        vals['J1213'+suffix] = ls.IntBox.coulomb(
                res, ewald, pairs_13, pairs_12, D12, 1.0E-14, 1.0E-14
                )
        vals['J1212'+suffix] = ls.IntBox.coulomb(
                res, ewald, pairs_12, pairs_12, D12, 1.0E-14, 1.0E-14
                )

        # D11 (1p|1q) => Kpq
        vals['K1111'+suffix] = ls.IntBox.exchange(
                res, ewald, pairs_11, pairs_11, D11, True, 1.0E-14, 1.0E-14
                )
        vals['K1112'+suffix] = ls.IntBox.exchange(
                res, ewald, pairs_11, pairs_21, D11, True, 1.0E-14, 1.0E-14
                )
        vals['K1122'+suffix] = ls.IntBox.exchange(
                res, ewald, pairs_21, pairs_21, D11, True, 1.0E-14, 1.0E-14
                )
        vals['K1123'+suffix] = ls.IntBox.exchange(
                res, ewald, pairs_21, pairs_31, D11, True, 1.0E-14, 1.0E-14
                )

        # D12 (1p|2q) => Kpq
        vals['K1234'+suffix] = ls.IntBox.exchange(
                res, ewald, pairs_31, pairs_42, D12, False, 1.0E-14, 1.0E-14
                )
        vals['K1233'+suffix] = ls.IntBox.exchange(
                res, ewald, pairs_31, pairs_32, D12, False, 1.0E-14, 1.0E-14
                )
        vals['K1223'+suffix] = ls.IntBox.exchange(
                res, ewald, pairs_21, pairs_32, D12, False, 1.0E-14, 1.0E-14
                )
        vals['K1222'+suffix] = ls.IntBox.exchange(
                res, ewald, pairs_21, pairs_22, D12, False, 1.0E-14, 1.0E-14
                )
        vals['K1213'+suffix] = ls.IntBox.exchange(
                res, ewald, pairs_11, pairs_32, D12, False, 1.0E-14, 1.0E-14
                )
        vals['K1212'+suffix] = ls.IntBox.exchange(
                res, ewald, pairs_11, pairs_22, D12, False, 1.0E-14, 1.0E-14
                )

        # compare with reference

        max_diff = 0.0
        error_str = "\n"
        for key, val in list(vals.items()):
            ref = ls.Tensor.array(refs[key])
            diff = np.max(np.abs(val.np - ref.np))
            if (diff > max_diff):
                max_diff = diff
            if (diff >= tol):
                error_str += "  %-6s diff=%15.6e\n" % (key, diff)

        print("  %-12s%-12s%-12s%-12s%15.6e" % \
                (xyz_list[0].upper() + '/' + new_bas_list[0],
                 xyz_list[1].upper() + '/' + new_bas_list[1],
                 xyz_list[2].upper() + '/' + new_bas_list[2],
                 xyz_list[3].upper() + '/' + new_bas_list[3], 
                 max_diff))

        if (max_diff >= tol): 
            print(error_str)
            return False

    return True
示例#6
0
def run_mix_basis_2(run_dir):

    tol = 1.0E-12

    res = ls.ResourceList.build(1024**2,1024**2)
    ewald = ls.Ewald([1.0], [-1.0])

    xyz_list = ['h2o', 'nh3']
    bas_list = ['sto-3g', '6-31gs', 'cc-pvdz']

    # molecule list

    mol = []
    for i, xyz_i in enumerate(xyz_list):
        mol.append(ls.Molecule.from_xyz_file(run_dir + xyz_i + '.xyz'))

    molC = ls.Molecule.concatenate(mol,0,1)
    xyzc = molC.xyzZ

    print("  Task: S,T,V,J,K")
    print("\n  %-15s%-15s%15s" % \
            ("Mol1", "Mol2", "Max_Diff"))
    print("  %s" % ('-'*45))

    # reference npz file

    npzfile = run_dir + "mix"
    for xyzname in xyz_list:
        npzfile += "_" + xyzname
    npzfile += ".npz"

    refs = np.load(npzfile)

    # basis list

    for a, bas_a in enumerate(bas_list):
        bas1 = ls.Basis.from_gbs_file(mol[0], bas_a)
        N1 = bas1.nao

        for b, bas_b in enumerate(bas_list):
            if (b == a): continue
            bas2 = ls.Basis.from_gbs_file(mol[1], bas_b)
            basC = ls.Basis.concatenate([bas1,bas2])
            N2 = bas2.nao

            pairs_11 = ls.PairList.build_schwarz(bas1,bas1,True,1.0E-14)
            pairs_12 = ls.PairList.build_schwarz(bas1,bas2,False,1.0E-14)
            pairs_21 = ls.PairList.build_schwarz(bas2,bas1,False,1.0E-14)
            pairs_22 = ls.PairList.build_schwarz(bas2,bas2,True,1.0E-14)

            suffix = "_" + bas_a.upper() + "_" + bas_b.upper()

            # calculate integrals in mixed basis set

            vals = collections.OrderedDict()

            # overlap
            vals['S'+suffix] = ls.Tensor.zeros((N1+N2,N1+N2))
            vals['S'+suffix].np[:N1,:N1] = ls.IntBox.overlap(res, pairs_11).np[:,:]
            vals['S'+suffix].np[:N1,N1:] = ls.IntBox.overlap(res, pairs_12).np[:,:]
            vals['S'+suffix].np[N1:,:N1] = ls.IntBox.overlap(res, pairs_21).np[:,:]
            vals['S'+suffix].np[N1:,N1:] = ls.IntBox.overlap(res, pairs_22).np[:,:]

            # kinetic
            vals['T'+suffix] = ls.Tensor.zeros((N1+N2,N1+N2))
            vals['T'+suffix].np[:N1,:N1] = ls.IntBox.kinetic(res, pairs_11).np[:,:]
            vals['T'+suffix].np[:N1,N1:] = ls.IntBox.kinetic(res, pairs_12).np[:,:]
            vals['T'+suffix].np[N1:,:N1] = ls.IntBox.kinetic(res, pairs_21).np[:,:]
            vals['T'+suffix].np[N1:,N1:] = ls.IntBox.kinetic(res, pairs_22).np[:,:]

            # nuclear potential
            vals['V'+suffix] = ls.Tensor.zeros((N1+N2,N1+N2))
            vals['V'+suffix].np[:N1,:N1] = ls.IntBox.potential(res, ewald, pairs_11, xyzc).np[:,:]
            vals['V'+suffix].np[:N1,N1:] = ls.IntBox.potential(res, ewald, pairs_12, xyzc).np[:,:]
            vals['V'+suffix].np[N1:,:N1] = ls.IntBox.potential(res, ewald, pairs_21, xyzc).np[:,:]
            vals['V'+suffix].np[N1:,N1:] = ls.IntBox.potential(res, ewald, pairs_22, xyzc).np[:,:]

            D12 = ls.Tensor.zeros((N1,N2))
            D12.np[...] = refs['D0'+suffix][:N1,N1:]

            # J0: (11|12), (12|12), (21|12), (22|12)
            vals['J0'+suffix] = ls.Tensor.zeros((N1+N2,N1+N2))
            vals['J0'+suffix].np[:N1,:N1] = ls.IntBox.coulomb(
                    res, ewald, pairs_11, pairs_12, D12, 1.0E-14, 1.0E-14
                    ).np[:,:]
            vals['J0'+suffix].np[:N1,N1:] = ls.IntBox.coulomb(
                    res, ewald, pairs_12, pairs_12, D12, 1.0E-14, 1.0E-14
                    ).np[:,:]
            vals['J0'+suffix].np[N1:,:N1] = ls.IntBox.coulomb(
                    res, ewald, pairs_21, pairs_12, D12, 1.0E-14, 1.0E-14
                    ).np[:,:]
            vals['J0'+suffix].np[N1:,N1:] = ls.IntBox.coulomb(
                    res, ewald, pairs_22, pairs_12, D12, 1.0E-14, 1.0E-14
                    ).np[:,:]

            # K0: (11|12), (11|22), (21|12), (21|22)
            vals['K0'+suffix] = ls.Tensor.zeros((N1+N2,N1+N2))
            vals['K0'+suffix].np[:N1,:N1] = ls.IntBox.exchange(
                    res, ewald, pairs_11, pairs_12, D12, False, 1.0E-14, 1.0E-14
                    ).np[:,:]
            vals['K0'+suffix].np[:N1,N1:] = ls.IntBox.exchange(
                    res, ewald, pairs_11, pairs_22, D12, False, 1.0E-14, 1.0E-14
                    ).np[:,:]
            vals['K0'+suffix].np[N1:,:N1] = ls.IntBox.exchange(
                    res, ewald, pairs_21, pairs_12, D12, False, 1.0E-14, 1.0E-14
                    ).np[:,:]
            vals['K0'+suffix].np[N1:,N1:] = ls.IntBox.exchange(
                    res, ewald, pairs_21, pairs_22, D12, False, 1.0E-14, 1.0E-14
                    ).np[:,:]

            D22 = ls.Tensor.zeros((N2,N2))
            D22.np[...] = refs['D1'+suffix][N1:,N1:]

            # J1: (11|22), (12|22), (21|22), (22|22)
            vals['J1'+suffix] = ls.Tensor.zeros((N1+N2,N1+N2))
            vals['J1'+suffix].np[:N1,:N1] = ls.IntBox.coulomb(
                    res, ewald, pairs_11, pairs_22, D22, 1.0E-14, 1.0E-14
                    ).np[:,:]
            vals['J1'+suffix].np[:N1,N1:] = ls.IntBox.coulomb(
                    res, ewald, pairs_12, pairs_22, D22, 1.0E-14, 1.0E-14
                    ).np[:,:]
            vals['J1'+suffix].np[N1:,:N1] = ls.IntBox.coulomb(
                    res, ewald, pairs_21, pairs_22, D22, 1.0E-14, 1.0E-14
                    ).np[:,:]
            vals['J1'+suffix].np[N1:,N1:] = ls.IntBox.coulomb(
                    res, ewald, pairs_22, pairs_22, D22, 1.0E-14, 1.0E-14
                    ).np[:,:]

            # K1: (12|12), (12|22), (22|12), (22|22)
            vals['K1'+suffix] = ls.Tensor.zeros((N1+N2,N1+N2))
            vals['K1'+suffix].np[:N1,:N1] = ls.IntBox.exchange(
                    res, ewald, pairs_12, pairs_12, D22, True, 1.0E-14, 1.0E-14
                    ).np[:,:]
            vals['K1'+suffix].np[:N1,N1:] = ls.IntBox.exchange(
                    res, ewald, pairs_12, pairs_22, D22, True, 1.0E-14, 1.0E-14
                    ).np[:,:]
            vals['K1'+suffix].np[N1:,:N1] = ls.IntBox.exchange(
                    res, ewald, pairs_22, pairs_12, D22, True, 1.0E-14, 1.0E-14
                    ).np[:,:]
            vals['K1'+suffix].np[N1:,N1:] = ls.IntBox.exchange(
                    res, ewald, pairs_22, pairs_22, D22, True, 1.0E-14, 1.0E-14
                    ).np[:,:]

            D11 = ls.Tensor.zeros((N1,N1))
            D11.np[...] = refs['D2'+suffix][:N1,:N1]

            # J2: (11|11), (12|11), (21|11), (22|11)
            vals['J2'+suffix] = ls.Tensor.zeros((N1+N2,N1+N2))
            vals['J2'+suffix].np[:N1,:N1] = ls.IntBox.coulomb(
                    res, ewald, pairs_11, pairs_11, D11, 1.0E-14, 1.0E-14
                    ).np[:,:]
            vals['J2'+suffix].np[:N1,N1:] = ls.IntBox.coulomb(
                    res, ewald, pairs_12, pairs_11, D11, 1.0E-14, 1.0E-14
                    ).np[:,:]
            vals['J2'+suffix].np[N1:,:N1] = ls.IntBox.coulomb(
                    res, ewald, pairs_21, pairs_11, D11, 1.0E-14, 1.0E-14
                    ).np[:,:]
            vals['J2'+suffix].np[N1:,N1:] = ls.IntBox.coulomb(
                    res, ewald, pairs_22, pairs_11, D11, 1.0E-14, 1.0E-14
                    ).np[:,:]

            # K2: (11|11), (11|21), (21|11), (21|21)
            vals['K2'+suffix] = ls.Tensor.zeros((N1+N2,N1+N2))
            vals['K2'+suffix].np[:N1,:N1] = ls.IntBox.exchange(
                    res, ewald, pairs_11, pairs_11, D11, True, 1.0E-14, 1.0E-14
                    ).np[:,:]
            vals['K2'+suffix].np[:N1,N1:] = ls.IntBox.exchange(
                    res, ewald, pairs_11, pairs_21, D11, True, 1.0E-14, 1.0E-14
                    ).np[:,:]
            vals['K2'+suffix].np[N1:,:N1] = ls.IntBox.exchange(
                    res, ewald, pairs_21, pairs_11, D11, True, 1.0E-14, 1.0E-14
                    ).np[:,:]
            vals['K2'+suffix].np[N1:,N1:] = ls.IntBox.exchange(
                    res, ewald, pairs_21, pairs_21, D11, True, 1.0E-14, 1.0E-14
                    ).np[:,:]

            D21 = ls.Tensor.zeros((N2,N1))
            D21.np[...] = refs['D3'+suffix][N1:,:N1]

            # J3: (11|21), (12|21), (21|21), (22|21)
            vals['J3'+suffix] = ls.Tensor.zeros((N1+N2,N1+N2))
            vals['J3'+suffix].np[:N1,:N1] = ls.IntBox.coulomb(
                    res, ewald, pairs_11, pairs_21, D21, 1.0E-14, 1.0E-14
                    ).np[:,:]
            vals['J3'+suffix].np[:N1,N1:] = ls.IntBox.coulomb(
                    res, ewald, pairs_12, pairs_21, D21, 1.0E-14, 1.0E-14
                    ).np[:,:]
            vals['J3'+suffix].np[N1:,:N1] = ls.IntBox.coulomb(
                    res, ewald, pairs_21, pairs_21, D21, 1.0E-14, 1.0E-14
                    ).np[:,:]
            vals['J3'+suffix].np[N1:,N1:] = ls.IntBox.coulomb(
                    res, ewald, pairs_22, pairs_21, D21, 1.0E-14, 1.0E-14
                    ).np[:,:]

            # K3: (12|11), (12|21), (22|11), (22|21)
            vals['K3'+suffix] = ls.Tensor.zeros((N1+N2,N1+N2))
            vals['K3'+suffix].np[:N1,:N1] = ls.IntBox.exchange(
                    res, ewald, pairs_12, pairs_11, D21, False, 1.0E-14, 1.0E-14
                    ).np[:,:]
            vals['K3'+suffix].np[:N1,N1:] = ls.IntBox.exchange(
                    res, ewald, pairs_12, pairs_21, D21, False, 1.0E-14, 1.0E-14
                    ).np[:,:]
            vals['K3'+suffix].np[N1:,:N1] = ls.IntBox.exchange(
                    res, ewald, pairs_22, pairs_11, D21, False, 1.0E-14, 1.0E-14
                    ).np[:,:]
            vals['K3'+suffix].np[N1:,N1:] = ls.IntBox.exchange(
                    res, ewald, pairs_22, pairs_21, D21, False, 1.0E-14, 1.0E-14
                    ).np[:,:]

            # compare with reference

            max_diff = 0.0
            error_str = "\n"
            for key, val in list(vals.items()):
                ref = ls.Tensor.array(refs[key])
                diff = np.max(np.abs(val.np - ref.np))
                if (diff > max_diff):
                    max_diff = diff
                if (diff >= tol):
                    error_str += "  %-6s diff=%15.6e\n" % (key, diff)

            print("  %-15s%-15s%15.6e" % \
                    (xyz_list[0].upper()+'/'+bas_a, 
                     xyz_list[1].upper()+'/'+bas_b, 
                     max_diff))

            if (max_diff >= tol): 
                print(error_str)
                return False

    return True
示例#7
0
def run_mix_grad_2(run_dir):

    tol = 1.0E-09

    res = ls.ResourceList.build(1024**2, 1024**2)
    ewald = ls.Ewald([1.0], [-1.0])

    xyz_list = ['h2o', 'nh3']
    bas_list = ['sto-3g', '6-31gs', 'cc-pvdz']

    # molecule list

    mol = []
    for i, xyz_i in enumerate(xyz_list):
        mol.append(ls.Molecule.from_xyz_file(run_dir + xyz_i + '.xyz'))

    molC = ls.Molecule.concatenate(mol, 0, 1)
    xyzc = molC.xyzZ

    print("  Task: V, J and K gradient")
    print("\n  %-15s%-15s%15s" % \
            ("Mol1", "Mol2", "G_Diff"))
    print("  %s" % ('-' * 45))

    # reference npz file

    npzfile = run_dir + "mix"
    for xyzname in xyz_list:
        npzfile += "_" + xyzname
    npzfile += ".npz"

    refs = np.load(npzfile)

    # basis list

    for a, bas_a in enumerate(bas_list):
        bas1 = ls.Basis.from_gbs_file(mol[0], bas_a)
        N1 = bas1.nao
        natom1 = mol[0].natom
        xyzc1 = mol[0].xyzZ

        for b, bas_b in enumerate(bas_list):
            if (b == a): continue
            bas2 = ls.Basis.from_gbs_file(mol[1], bas_b)
            basC = ls.Basis.concatenate([bas1, bas2])
            N2 = bas2.nao
            natom2 = mol[1].natom
            xyzc2 = mol[1].xyzZ

            xyzcC = ls.Molecule.concatenate(mol, 0, 1).xyzZ

            pairs_11 = ls.PairList.build_schwarz(bas1, bas1, True, 1.0E-14)
            pairs_22 = ls.PairList.build_schwarz(bas2, bas2, True, 1.0E-14)
            pairs_12 = ls.PairList.build_schwarz(bas1, bas2, False, 1.0E-14)
            pairs = ls.PairList.build_schwarz(basC, basC, True, 1.0E-14)

            suffix = "_" + bas_a.upper() + "_" + bas_b.upper()

            # read in density matrices of monomers

            D22 = ls.Tensor.zeros((N2, N2))
            D22.np[...] = refs['D1' + suffix][N1:, N1:]

            D11 = ls.Tensor.zeros((N1, N1))
            D11.np[...] = refs['D2' + suffix][:N1, :N1]

            # idiot check to make sure that the D11 and D22 are not zero
            assert (np.max(D22.np) > 0.1)
            assert (np.max(D11.np) > 0.1)

            # D == D1 (+) D2

            D = ls.Tensor.zeros((N1 + N2, N1 + N2))
            D1 = ls.Tensor.zeros((N1 + N2, N1 + N2))
            D2 = ls.Tensor.zeros((N1 + N2, N1 + N2))

            D.np[:N1, :N1] = D11.np[...]
            D.np[N1:, N1:] = D22.np[...]
            D1.np[:N1, :N1] = D11.np[...]
            D2.np[N1:, N1:] = D22.np[...]

            # reference V gradient

            Vgr = ls.IntBox.potentialGrad(res, ewald, pairs, D, xyzcC)

            # reference J and K gradient: (G(D1+D2) - G(D1) - G(D2)) / 2

            Jgr = ls.IntBox.coulombGrad(res, ewald, pairs, D, D, 1.0E-14,
                                        1.0E-14)

            Jgr.np[...] -= ls.IntBox.coulombGrad(res, ewald, pairs, D2, D2,
                                                 1.0E-14, 1.0E-14).np

            Jgr.np[...] -= ls.IntBox.coulombGrad(res, ewald, pairs, D1, D1,
                                                 1.0E-14, 1.0E-14).np

            Jgr.scale(0.5)

            Kgr = ls.IntBox.exchangeGrad(res, ewald, pairs, D, D, True, True,
                                         True, 1.0E-14, 1.0E-14)

            Kgr.np[...] -= ls.IntBox.exchangeGrad(res, ewald, pairs, D2, D2,
                                                  True, True, True, 1.0E-14,
                                                  1.0E-14).np

            Kgr.np[...] -= ls.IntBox.exchangeGrad(res, ewald, pairs, D1, D1,
                                                  True, True, True, 1.0E-14,
                                                  1.0E-14).np

            Kgr.scale(0.5)

            # calculated V gradient from advanced routine

            vec_v1 = ls.IntBox.potentialGradAdv2(
                res,
                ewald,
                pairs_11,
                D11,
                xyzcC,
            )

            vec_v2 = ls.IntBox.potentialGradAdv2(
                res,
                ewald,
                pairs_22,
                D22,
                xyzcC,
            )

            v12 = ls.Tensor.zeros((natom1 + natom2, 3))
            v12.np[:natom1, :] += vec_v1[0].np
            v12.np[natom1:, :] += vec_v2[0].np
            v12.np[:, :] += vec_v1[1].np
            v12.np[:, :] += vec_v2[1].np

            # calculated J and K gradient from advanced routine

            vec_j12 = ls.IntBox.coulombGradAdv(res, ewald, pairs_11, pairs_22,
                                               D11, D22, 1.0E-14, 1.0E-14)

            vec_k12 = ls.IntBox.exchangeGradAdv(res, ewald, pairs_12, pairs_12,
                                                D11, D22, True, True, False,
                                                1.0E-14, 1.0E-14)

            j12 = ls.Tensor.zeros((natom1 + natom2, 3))
            j12.np[:natom1, :] += vec_j12[0].np
            j12.np[:natom1, :] += vec_j12[1].np
            j12.np[natom1:, :] += vec_j12[2].np
            j12.np[natom1:, :] += vec_j12[3].np

            k12 = ls.Tensor.zeros((natom1 + natom2, 3))
            k12.np[:natom1, :] += vec_k12[0].np
            k12.np[natom1:, :] += vec_k12[1].np
            k12.np[:natom1, :] += vec_k12[2].np
            k12.np[natom1:, :] += vec_k12[3].np

            # compare results

            diff_Vgr = np.max(np.abs(v12.np - Vgr.np))
            diff_Jgr = np.max(np.abs(j12.np - Jgr.np))
            diff_Kgr = np.max(np.abs(k12.np - Kgr.np))
            print("  %-15s%-15s%15.6e" % \
                    (xyz_list[0].upper()+'/'+bas_a,
                     xyz_list[1].upper()+'/'+bas_b,
                     max(diff_Vgr, diff_Jgr, diff_Kgr)))

            if (diff_Vgr >= tol):
                print("  %-6s diff=%15.6e\n" % ("Vgr", diff_Vgr))
                return False

            if (diff_Jgr >= tol):
                print("  %-6s diff=%15.6e\n" % ("Jgr", diff_Jgr))
                return False

            if (diff_Kgr >= tol):
                print("  %-6s diff=%15.6e\n" % ("Kgr", diff_Kgr))
                return False

    return True
示例#8
0
def run_ewald_int(run_dir, run_xyz, run_basis):

    tol = 1.0E-12

    xyzfile = run_dir + run_xyz + ".xyz"

    mol = ls.Molecule.from_xyz_file(xyzfile)
    bas = ls.Basis.from_gbs_file(mol, run_basis)
    res = ls.ResourceList.build(1024**2, 1024**2)
    xyzc = mol.xyzZ

    # long-range, short-range, and mixed ewald operators

    ewald_ops = [
        ls.Ewald([1.0], [0.3]),  # lr
        ls.Ewald([0.7, 0.7, 0.7], [0.2, 0.1, 0.05]),  # lr2
        ls.Ewald([-0.7, 0.7], [0.3, -1.0]),  # sr
        ls.Ewald([-0.7, 0.7], [-1.0, -1.0]),  # sr2
        ls.Ewald([0.8, 0.2], [0.2, -1.0])  # mix
    ]

    ewald_names = ["lr", "lr2", "sr", "sr2", "mix"]

    # reference npz file

    npzfile = run_dir + "ewald_" + run_xyz + "_" + run_basis + ".npz"
    refs = np.load(npzfile)

    max_diff = 0.0
    error_str = "\n"

    # Test both symmetric and nonsymmetric pairlists

    for run in range(2):

        pairlist_sym = (run == 0)
        pairs = ls.PairList.build_schwarz(bas, bas, pairlist_sym, 1.0E-14)

        # Test ewald operators

        for ind, ewald in enumerate(ewald_ops):

            suffix = '_' + ewald_names[ind].upper()

            # calculate ewald-related integrals (V,J,K,ESP)

            vals = collections.OrderedDict()

            vals['V' + suffix] = ls.IntBox.potential(res, ewald, pairs, xyzc)

            D = ls.Tensor.array(refs['D' + suffix])
            D2 = ls.Tensor.array(refs['D2' + suffix])

            vals['J' + suffix] = ls.IntBox.coulomb(res, ewald, pairs, pairs, D,
                                                   1.0E-14, 1.0E-14)

            vals['J2' + suffix] = ls.IntBox.coulomb(res, ewald, pairs, pairs,
                                                    D2, 1.0E-14, 1.0E-14)

            vals['K' + suffix] = ls.IntBox.exchange(res, ewald, pairs, pairs,
                                                    D, True, 1.0E-14, 1.0E-14)

            vals['K2' + suffix] = ls.IntBox.exchange(res, ewald, pairs, pairs,
                                                     D2, False, 1.0E-14,
                                                     1.0E-14)

            XYZ = ls.Tensor.array(refs['XYZ' + suffix])

            vals['ESP' + suffix] = ls.IntBox.esp(res, ewald, pairs, D, XYZ)

            vals['ESP2' + suffix] = ls.IntBox.esp(res, ewald, pairs, D2, XYZ)

            # compare results

            for key, val in list(vals.items()):
                ref = ls.Tensor.array(refs[key])
                diff = np.max(np.abs(val.np - ref.np))
                if (diff > max_diff):
                    max_diff = diff
                if (diff >= tol):
                    error_str += "  %-6s diff=%15.6e\n" % (key, diff)

        symm_str = "yes" if pairlist_sym else "no"
        print("  %-12s %-6s %15.6e" %
              (run_xyz + '/' + run_basis, symm_str, max_diff))

        if (max_diff >= tol):
            print(error_str)
            return False

    return True
示例#9
0
    def test_bad_constructor(self):

        with self.assertRaises(RuntimeError):
            ewald = ls.Ewald([], [])
        with self.assertRaises(RuntimeError):
            ewald = ls.Ewald([1.0], [1.0, 1.0])
示例#10
0
def run_prop_int(run_dir, run_xyz, run_basis):

    tol = 1.0E-9

    xyzfile = run_dir + run_xyz + ".xyz"
    npzfile = run_dir + "prop_" + run_xyz + "_" + run_basis + ".npz"

    mol = ls.Molecule.from_xyz_file(xyzfile)
    bas = ls.Basis.from_gbs_file(mol, run_basis)
    res = ls.ResourceList.build(1024**2,1024**2)
    #res = ls.ResourceList.build_cpu()
    ewald = ls.Ewald([1.0], [-1.0])
    xyzc = mol.xyzZ
    xyz = mol.xyz

    print(res)

    vals = []
    timing = []

    for run in range(2):

        pairlist_sym = (run == 0)
        pairs = ls.PairList.build_schwarz(bas,bas,pairlist_sym,1.0E-14)

        # Calculate integrals and gradients
        # Each integral/gradient is calculated twice to test the accumulation

        vals.append(collections.OrderedDict())
        timing.append(collections.OrderedDict())

        t0 = time.time()
        vals[run]['S'] = ls.IntBox.overlap(res, pairs)
        timing[run]['S'] = time.time() - t0
        vals[run]['S'] = ls.IntBox.overlap(res, pairs, vals[run]['S'])

        t0 = time.time()
        vals[run]['T'] = ls.IntBox.kinetic(res, pairs)
        timing[run]['T'] = time.time() - t0
        vals[run]['T'] = ls.IntBox.kinetic(res, pairs, vals[run]['T'])

        t0 = time.time()
        vals[run]['V'] = ls.IntBox.potential(res, ewald, pairs, xyzc)
        timing[run]['V'] = time.time() - t0
        vals[run]['V'] = ls.IntBox.potential(res, ewald, pairs, xyzc, vals[run]['V'])


        D = ls.Tensor.array(np.load(npzfile)['D'])
        D2 = ls.Tensor.array(np.load(npzfile)['D2'])

        t0 = time.time()
        vals[run]['EF'] = ls.IntBox.field(res, ewald, pairs, D, xyz)
        vals[run]['EF'] = ls.IntBox.field(res, ewald, pairs, D, xyz, vals[run]['EF'])

        t0 = time.time()
        vals[run]['J'] = ls.IntBox.coulomb(
                res, ewald, pairs, pairs, D, 1.0E-14, 1.0E-14
                )
        timing[run]['J'] = time.time() - t0
        vals[run]['J'] = ls.IntBox.coulomb(
                res, ewald, pairs, pairs, D, 1.0E-14, 1.0E-14, vals[run]['J']
                )

        t0 = time.time()
        vals[run]['J2'] = ls.IntBox.coulomb(
                res, ewald, pairs, pairs, D2, 1.0E-14, 1.0E-14
                )
        timing[run]['J2'] = time.time() - t0
        vals[run]['J2'] = ls.IntBox.coulomb(
                res, ewald, pairs, pairs, D2, 1.0E-14, 1.0E-14, vals[run]['J2']
                )

        t0 = time.time()
        vals[run]['K'] = ls.IntBox.exchange(
                res, ewald, pairs, pairs, D, True, 1.0E-14, 1.0E-14
                )
        timing[run]['K'] = time.time() - t0
        vals[run]['K'] = ls.IntBox.exchange(
                res, ewald, pairs, pairs, D, True, 1.0E-14, 1.0E-14, vals[run]['K']
                )

        t0 = time.time()
        vals[run]['K2'] = ls.IntBox.exchange(
                res, ewald, pairs, pairs, D2, False, 1.0E-14, 1.0E-14
                )
        timing[run]['K2'] = time.time() - t0
        vals[run]['K2'] = ls.IntBox.exchange(
                res, ewald, pairs, pairs, D2, False, 1.0E-14, 1.0E-14, vals[run]['K2']
                )

        W = ls.Tensor.array(np.load(npzfile)['W'])
        W2 = ls.Tensor.array(np.load(npzfile)['W2'])

        if (pairlist_sym):

            """
            t0 = time.time()
            vals[run]['Vgr'] = ls.IntBox.potentialGrad(res, ewald, pairs, D, xyzc)
            timing[run]['Vgr'] = time.time() - t0
            vals[run]['Vgr'] = ls.IntBox.potentialGrad(res, ewald, pairs, D, xyzc, vals[run]['Vgr'])

            t0 = time.time()
            vals[run]['Vgr2'] = ls.IntBox.potentialGrad(res, ewald, pairs, D2, xyzc)
            timing[run]['Vgr2'] = time.time() - t0
            vals[run]['Vgr2'] = ls.IntBox.potentialGrad(res, ewald, pairs, D2, xyzc, vals[run]['Vgr2'])
            """

            t0 = time.time()
            Vgr = ls.IntBox.potentialGradAdv2(res, ewald, pairs, D, xyzc)
            timing[run]['Vgr'] = time.time() - t0
            Vgr = ls.IntBox.potentialGradAdv2(res, ewald, pairs, D, xyzc, Vgr)
            vals[run]['Vgr'] = Vgr[0].clone()
            vals[run]['Vgr'].np[...] += Vgr[1].np

            t0 = time.time()
            Vgr2 = ls.IntBox.potentialGradAdv2(res, ewald, pairs, D2, xyzc)
            timing[run]['Vgr2'] = time.time() - t0
            Vgr2 = ls.IntBox.potentialGradAdv2(res, ewald, pairs, D2, xyzc, Vgr2)
            vals[run]['Vgr2'] = Vgr2[0].clone()
            vals[run]['Vgr2'].np[...] += Vgr2[1].np

            t0 = time.time()
            vals[run]['Jgr'] = ls.IntBox.coulombGrad(
                    res, ewald, pairs, D, D, 1.0E-14, 1.0E-14
                    )
            timing[run]['Jgr'] = time.time() - t0
            vals[run]['Jgr'] = ls.IntBox.coulombGrad(
                    res, ewald, pairs, D, D, 1.0E-14, 1.0E-14, vals[run]['Jgr']
                    )

            t0 = time.time()
            vals[run]['Jgr2'] = ls.IntBox.coulombGrad(
                    res, ewald, pairs, D2, D2, 1.0E-14, 1.0E-14
                    )
            timing[run]['Jgr2'] = time.time() - t0
            vals[run]['Jgr2'] = ls.IntBox.coulombGrad(
                    res, ewald, pairs, D2, D2, 1.0E-14, 1.0E-14, vals[run]['Jgr2']
                    )

            t0 = time.time()
            vals[run]['Jgr3'] = ls.IntBox.coulombGrad(
                    res, ewald, pairs, D, D2, 1.0E-14, 1.0E-14
                    )
            timing[run]['Jgr3'] = time.time() - t0
            vals[run]['Jgr3'] = ls.IntBox.coulombGrad(
                    res, ewald, pairs, D, D2, 1.0E-14, 1.0E-14, vals[run]['Jgr3']
                    )

            t0 = time.time()
            vals[run]['Jgr4'] = ls.IntBox.coulombGrad(
                    res, ewald, pairs, D2, D, 1.0E-14, 1.0E-14
                    )
            timing[run]['Jgr4'] = time.time() - t0
            vals[run]['Jgr4'] = ls.IntBox.coulombGrad(
                    res, ewald, pairs, D2, D, 1.0E-14, 1.0E-14, vals[run]['Jgr4']
                    )

            t0 = time.time()
            vals[run]['Kgr'] = ls.IntBox.exchangeGrad(
                    res, ewald, pairs, D, D, True, True, True, 1.0E-14, 1.0E-14
                    )
            timing[run]['Kgr'] = time.time() - t0
            vals[run]['Kgr'] = ls.IntBox.exchangeGrad(
                    res, ewald, pairs, D, D, True, True, True, 1.0E-14, 1.0E-14, vals[run]['Kgr']
                    )

            t0 = time.time()
            vals[run]['Kgr2'] = ls.IntBox.exchangeGrad(
                    res, ewald, pairs, D2, D2, False, False, True, 1.0E-14, 1.0E-14
                    )
            timing[run]['Kgr2'] = time.time() - t0
            vals[run]['Kgr2'] = ls.IntBox.exchangeGrad(
                    res, ewald, pairs, D2, D2, False, False, True, 1.0E-14, 1.0E-14, vals[run]['Kgr2']
                    )

            t0 = time.time()
            vals[run]['Kgr3'] = ls.IntBox.exchangeGrad(
                    res, ewald, pairs, D, D2, True, False, False, 1.0E-14, 1.0E-14
                    )
            timing[run]['Kgr3'] = time.time() - t0
            vals[run]['Kgr3'] = ls.IntBox.exchangeGrad(
                    res, ewald, pairs, D, D2, True, False, False, 1.0E-14, 1.0E-14, vals[run]['Kgr3']
                    )

            t0 = time.time()
            vals[run]['Kgr4'] = ls.IntBox.exchangeGrad(
                    res, ewald, pairs, D2, D, False, True, False, 1.0E-14, 1.0E-14
                    )
            timing[run]['Kgr4'] = time.time() - t0
            vals[run]['Kgr4'] = ls.IntBox.exchangeGrad(
                    res, ewald, pairs, D2, D, False, True, False, 1.0E-14, 1.0E-14, vals[run]['Kgr4']
                    )

            t0 = time.time()
            vals[run]['Sgr'] = ls.IntBox.overlapGrad(res, pairs, W)
            timing[run]['Sgr'] = time.time() - t0
            vals[run]['Sgr'] = ls.IntBox.overlapGrad(res, pairs, W, vals[run]['Sgr'])

            t0 = time.time()
            vals[run]['Sgr2'] = ls.IntBox.overlapGrad(res, pairs, W2)
            timing[run]['Sgr2'] = time.time() - t0
            vals[run]['Sgr2'] = ls.IntBox.overlapGrad(res, pairs, W2, vals[run]['Sgr2'])

            t0 = time.time()
            vals[run]['Tgr'] = ls.IntBox.kineticGrad(res, pairs, D)
            timing[run]['Tgr'] = time.time() - t0
            vals[run]['Tgr'] = ls.IntBox.kineticGrad(res, pairs, D, vals[run]['Tgr'])

            t0 = time.time()
            vals[run]['Tgr2'] = ls.IntBox.kineticGrad(res, pairs, D2)
            timing[run]['Tgr2'] = time.time() - t0
            vals[run]['Tgr2'] = ls.IntBox.kineticGrad(res, pairs, D2, vals[run]['Tgr2'])

            t0 = time.time()
            Dipgrad = ls.IntBox.dipoleGrad(res, pairs, 0.0, 0.0 ,0.0, D)
            Dipgrad = ls.IntBox.dipoleGrad(res, pairs, 0.0, 0.0, 0.0, D, Dipgrad)
            vals[run]['DXgr'] = Dipgrad[0] 
            vals[run]['DYgr'] = Dipgrad[1] 
            vals[run]['DZgr'] = Dipgrad[2] 

        else:

            t0 = time.time()
            Vgr = ls.IntBox.potentialGradAdv(res, ewald, pairs, D, xyzc)
            timing[run]['Vgr'] = time.time() - t0
            Vgr = ls.IntBox.potentialGradAdv(res, ewald, pairs, D, xyzc, Vgr)
            vals[run]['Vgr'] = Vgr[0].clone()
            vals[run]['Vgr'].np[...] += Vgr[1].np
            vals[run]['Vgr'].np[...] += Vgr[2].np

            t0 = time.time()
            Vgr2 = ls.IntBox.potentialGradAdv(res, ewald, pairs, D2, xyzc)
            timing[run]['Vgr2'] = time.time() - t0
            Vgr2 = ls.IntBox.potentialGradAdv(res, ewald, pairs, D2, xyzc, Vgr2)
            vals[run]['Vgr2'] = Vgr2[0].clone()
            vals[run]['Vgr2'].np[...] += Vgr2[1].np
            vals[run]['Vgr2'].np[...] += Vgr2[2].np

            # TODO: Coulomb gradient with asymmetric pairlist
            vals[run]['Jgr'] = vals[0]['Jgr'].clone()
            vals[run]['Jgr2'] = vals[0]['Jgr2'].clone()
            vals[run]['Jgr3'] = vals[0]['Jgr3'].clone()
            vals[run]['Jgr4'] = vals[0]['Jgr4'].clone()

            t0 = time.time()
            Kgr = ls.IntBox.exchangeGradAdv(
                    res, ewald, pairs, pairs, D, D, True, True, True, 1.0E-14, 1.0E-14
                    )
            timing[run]['Kgr'] = time.time() - t0
            Kgr = ls.IntBox.exchangeGradAdv(
                    res, ewald, pairs, pairs, D, D, True, True, True, 1.0E-14, 1.0E-14, Kgr
                    )
            vals[run]['Kgr'] = Kgr[0].clone()
            vals[run]['Kgr'].np[...] += Kgr[1].np
            vals[run]['Kgr'].np[...] += Kgr[2].np
            vals[run]['Kgr'].np[...] += Kgr[3].np

            t0 = time.time()
            Kgr2 = ls.IntBox.exchangeGradAdv(
                    res, ewald, pairs, pairs, D2, D2, False, False, True, 1.0E-14, 1.0E-14
                    )
            timing[run]['Kgr2'] = time.time() - t0
            Kgr2 = ls.IntBox.exchangeGradAdv(
                    res, ewald, pairs, pairs, D2, D2, False, False, True, 1.0E-14, 1.0E-14, Kgr2
                    )
            vals[run]['Kgr2'] = Kgr2[0].clone()
            vals[run]['Kgr2'].np[...] += Kgr2[1].np
            vals[run]['Kgr2'].np[...] += Kgr2[2].np
            vals[run]['Kgr2'].np[...] += Kgr2[3].np

            t0 = time.time()
            Kgr3 = ls.IntBox.exchangeGradAdv(
                    res, ewald, pairs, pairs, D, D2, True, False, False, 1.0E-14, 1.0E-14
                    )
            timing[run]['Kgr3'] = time.time() - t0
            Kgr3 = ls.IntBox.exchangeGradAdv(
                    res, ewald, pairs, pairs, D, D2, True, False, False, 1.0E-14, 1.0E-14, Kgr3
                    )
            vals[run]['Kgr3'] = Kgr3[0].clone()
            vals[run]['Kgr3'].np[...] += Kgr3[1].np
            vals[run]['Kgr3'].np[...] += Kgr3[2].np
            vals[run]['Kgr3'].np[...] += Kgr3[3].np

            t0 = time.time()
            Kgr4 = ls.IntBox.exchangeGradAdv(
                    res, ewald, pairs, pairs, D2, D, False, True, False, 1.0E-14, 1.0E-14
                    )
            timing[run]['Kgr4'] = time.time() - t0
            Kgr4 = ls.IntBox.exchangeGradAdv(
                    res, ewald, pairs, pairs, D2, D, False, True, False, 1.0E-14, 1.0E-14, Kgr4
                    )
            vals[run]['Kgr4'] = Kgr4[0].clone()
            vals[run]['Kgr4'].np[...] += Kgr4[1].np
            vals[run]['Kgr4'].np[...] += Kgr4[2].np
            vals[run]['Kgr4'].np[...] += Kgr4[3].np

            t0 = time.time()
            Sgr = ls.IntBox.overlapGradAdv(res, pairs, W)
            timing[run]['Sgr'] = time.time() - t0
            Sgr = ls.IntBox.overlapGradAdv(res, pairs, W, Sgr)
            vals[run]['Sgr'] = Sgr[0].clone()
            vals[run]['Sgr'].np[...] += Sgr[1].np

            t0 = time.time()
            Sgr2 = ls.IntBox.overlapGradAdv(res, pairs, W2)
            timing[run]['Sgr2'] = time.time() - t0
            Sgr2 = ls.IntBox.overlapGradAdv(res, pairs, W2, Sgr2)
            vals[run]['Sgr2'] = Sgr2[0].clone()
            vals[run]['Sgr2'].np[...] += Sgr2[1].np

            t0 = time.time()
            Tgr = ls.IntBox.kineticGradAdv(res, pairs, D)
            timing[run]['Tgr'] = time.time() - t0
            Tgr = ls.IntBox.kineticGradAdv(res, pairs, D, Tgr)
            vals[run]['Tgr'] = Tgr[0].clone()
            vals[run]['Tgr'].np[...] += Tgr[1].np

            t0 = time.time()
            Tgr2 = ls.IntBox.kineticGradAdv(res, pairs, D2)
            timing[run]['Tgr2'] = time.time() - t0
            Tgr2 = ls.IntBox.kineticGradAdv(res, pairs, D2, Tgr2)
            vals[run]['Tgr2'] = Tgr2[0].clone()
            vals[run]['Tgr2'].np[...] += Tgr2[1].np

            t0 = time.time()
            Dipgrad = ls.IntBox.dipoleGradAdv(res, pairs, 0.0, 0.0 ,0.0, D)
            Dipgrad = ls.IntBox.dipoleGradAdv(res, pairs, 0.0, 0.0, 0.0, D, Dipgrad)
            vals[run]['DXgr'] = Dipgrad[0][0].clone()
            vals[run]['DXgr'].np[...] += Dipgrad[0][1]
            vals[run]['DYgr'] = Dipgrad[1][0].clone()
            vals[run]['DYgr'].np[...] += Dipgrad[1][1]
            vals[run]['DZgr'] = Dipgrad[2][0].clone()
            vals[run]['DZgr'].np[...] += Dipgrad[2][1]

        # anti-symmetric overlap gradient
        ASgr = ls.IntBox.overlapGradAdv(res, pairs, W)
        ASgr = ls.IntBox.overlapGradAdv(res, pairs, W, ASgr)
        vals[run]['ASgr'] = ASgr[1]

        ASgr2 = ls.IntBox.overlapGradAdv(res, pairs, W2)
        ASgr2 = ls.IntBox.overlapGradAdv(res, pairs, W2, ASgr2)
        vals[run]['ASgr2'] = ASgr2[1]

        # read in a number of grid points and calculate ESP
        XYZ = ls.Tensor.array(np.load(npzfile)['XYZ'])

        t0 = time.time()
        vals[run]['ESP'] = ls.IntBox.esp(res, ewald, pairs, D, XYZ)
        timing[run]['ESP'] = time.time() - t0
        vals[run]['ESP'] = ls.IntBox.esp(res, ewald, pairs, D, XYZ, vals[run]['ESP'])

        t0 = time.time()
        vals[run]['ESP2'] = ls.IntBox.esp(res, ewald, pairs, D2, XYZ)
        timing[run]['ESP2'] = time.time() - t0
        vals[run]['ESP2'] = ls.IntBox.esp(res, ewald, pairs, D2, XYZ, vals[run]['ESP2'])

        Dipole = ls.IntBox.dipole(res, pairs, 0., 0., 0.)
        Dipole = ls.IntBox.dipole(res, pairs, 0., 0., 0., Dipole)
        vals[run]['DX'] = Dipole[0]
        vals[run]['DY'] = Dipole[1]
        vals[run]['DZ'] = Dipole[2]

        Quadrupole = ls.IntBox.quadrupole(res, pairs, 0., 0., 0.)
        Quadrupole = ls.IntBox.quadrupole(res, pairs, 0., 0., 0., Quadrupole)
        vals[run]['QXX'] = Quadrupole[0]
        vals[run]['QXY'] = Quadrupole[1]
        vals[run]['QXZ'] = Quadrupole[2]
        vals[run]['QYY'] = Quadrupole[3]
        vals[run]['QYZ'] = Quadrupole[4]
        vals[run]['QZZ'] = Quadrupole[5]

        Nabla = ls.IntBox.nabla(res, pairs)
        Nabla = ls.IntBox.nabla(res, pairs, Nabla)
        vals[run]['PX'] = Nabla[0]
        vals[run]['PY'] = Nabla[1]
        vals[run]['PZ'] = Nabla[2]

        AngMom = ls.IntBox.angularMomentum(res, pairs, 0., 0., 0.)
        AngMom = ls.IntBox.angularMomentum(res, pairs, 0., 0., 0., AngMom)
        vals[run]['LX'] = AngMom[0]
        vals[run]['LY'] = AngMom[1]
        vals[run]['LZ'] = AngMom[2]

    # compare results

    print("%-11s %-27s %-25s" % (run_basis, "sym", "non-sym"))
    max_diff = 0.0
    max_diff2 = 0.0
    for key, val in list(vals[0].items()):

        ref = ls.Tensor.array(np.load(npzfile)[key])
        ref[...] *= 2.0
        val2 = vals[1][key]

        # Need the prefactor of 0.5 since each integral/gradient is calculated twice
        diff = np.max(np.abs(val.np - ref.np))
        diff2 = np.max(np.abs(val2.np - ref.np))

        time_str = ""
        if key in timing[0]:
            time_str += "%.0f ms" % (timing[0][key]*1000)
        time_str2 = ""
        if key in timing[1]:
            time_str2 += "%.0f ms" % (timing[1][key]*1000)

        print("  %-6s %15.6e%12s %15.6e%12s" % (key, diff, time_str, diff2, time_str2))
        if (diff > max_diff):
            max_diff = diff
        if (diff2 > max_diff2):
            max_diff2 = diff2
        if (diff >= tol):
            print("")
            ref.name = key + "(ref)"
            val.name = key + "(calc)"
            print(ref)
            print(val)
            print(ls.Tensor.array(ref[...] - val[...]))
        if (diff2 >= tol):
            print("")
            ref.name = key + "(ref)"
            val2.name = key + "(calc)"
            print(ref)
            print(val2)
    print("  %s" % ("-"*50))
    print("  %-6s%16.6e%28.6e" % ("MAX", max_diff, max_diff2))

    return (max_diff < tol and max_diff2 < tol)
示例#11
0
def run_charge(run_dir):

    energy_tol = 1.0E-11
    grad_tol = 1.0E-07

    res = ls.ResourceList.build_cpu()
    ewald = ls.Ewald([1.0], [-1.0])
    ewald_lr = ls.Ewald([0.8], [0.3])
    ewald_sr = ls.Ewald([-0.8, 0.8], [0.3, -1.0])

    xyz_list = ['h2o', 'nh3', 'ch4']

    ref_energy = [
        [8.002367030356384, 4.035198827718412, 2.3666947965666942],
        [20.55322877327911, 15.492218243839702, 0.9503647747835862],
        [18.525177050762682, 14.28124517557294, 0.5388964650372082],
        [11.880867186027105, 5.743556199066088, 3.7611375497555968],
        [11.715537761726901, 9.367396015926191, 0.005034193455331343],
        [13.686514602165177, 7.002374264251431, 3.9468374174807144]
    ]

    print("\n  %-7s%-7s%15s%15s" % ("Mol1", "Mol2", "E_Diff", "G_Diff"))
    print("  %s" % ('-' * 44))

    calc_energy = ls.Tensor.zeros(
        (len(xyz_list) * (len(xyz_list) + 1) // 2, 3))

    ind = 0

    for i in range(len(xyz_list)):
        mol_1 = ls.Molecule.from_xyz_file(run_dir + xyz_list[i] + ".xyz")
        xyzc_1 = mol_1.xyzZ

        for j in range(i, len(xyz_list)):
            mol_2 = ls.Molecule.from_xyz_file(run_dir + xyz_list[j] + ".xyz")
            xyzc_2 = mol_2.xyzZ

            # Calculate energies
            if ls.Molecule.equivalent(mol_1, mol_2):
                calc_energy.np[ind, :] = [
                    ls.IntBox.chargeEnergySelf(res, ewald, xyzc_1),
                    ls.IntBox.chargeEnergySelf(res, ewald_lr, xyzc_1),
                    ls.IntBox.chargeEnergySelf(res, ewald_sr, xyzc_1)
                ]
            else:
                calc_energy.np[ind, :] = [
                    ls.IntBox.chargeEnergyOther(res, ewald, xyzc_1, xyzc_2),
                    ls.IntBox.chargeEnergyOther(res, ewald_lr, xyzc_1, xyzc_2),
                    ls.IntBox.chargeEnergyOther(res, ewald_sr, xyzc_1, xyzc_2)
                ]

            diff_energy = np.max(
                np.abs(ref_energy[ind][:] - calc_energy.np[ind, :]))
            if (diff_energy >= energy_tol):
                print("\n  %s  %s  diff_energy %16.6e\n" %
                      (xyz_list[i], xyz_list[j], diff_energy))
                return False

            # Calculate gradients
            # Each gradient is calculated twice to test the accumulation
            if (ls.Molecule.equivalent(mol_1, mol_2)):
                for my_ewald in [ewald, ewald_sr, ewald_lr]:
                    ana_grad = ls.IntBox.chargeGradSelf(res, my_ewald, xyzc_1)
                    ana_grad = ls.IntBox.chargeGradSelf(
                        res, my_ewald, xyzc_1, ana_grad)
                    num_grad = run_num_grad_1(res, my_ewald, xyzc_1)
                    # Need the prefactor of 0.5 since each gradient is calculated twice
                    diff_grad = np.max(np.abs(ana_grad.np * 0.5 - num_grad.np))
                    if (diff_grad >= grad_tol):
                        print("\n  %s  diff_grad %16.6e\n" %
                              (xyz_list[i], diff_grad))
                        return False
            else:
                for my_ewald in [ewald, ewald_sr, ewald_lr]:
                    ana_grad = ls.IntBox.chargeGradOther(
                        res, my_ewald, xyzc_1, xyzc_2)
                    ana_grad = ls.IntBox.chargeGradOther(
                        res, my_ewald, xyzc_1, xyzc_2, ana_grad)
                    num_grad = [
                        run_num_grad_2(res, my_ewald, xyzc_1, xyzc_2),
                        run_num_grad_2(res, my_ewald, xyzc_2, xyzc_1)
                    ]
                    # Need the prefactor of 0.5 since each gradient is calculated twice
                    diff_grad = max(
                        np.max(np.abs(ana_grad[0].np * 0.5 - num_grad[0].np)),
                        np.max(np.abs(ana_grad[1].np * 0.5 - num_grad[1].np)))
                    if (diff_grad >= grad_tol):
                        print("\n  %s  %s  diff_grad %16.6e\n" %
                              (xyz_list[i], xyz_list[j], diff_grad))
                        return False

            print("  %-7s%-7s%15.6e%15.6e" %
                  (xyz_list[i].upper(), xyz_list[j].upper(), diff_energy,
                   diff_grad))

            ind += 1

    return True