Exemple #1
0
def build_3dgrid(me, sp1, R1, sp2, R2, level=3):
    from pyscf import dft
    from pyscf.nao.m_system_vars import system_vars_c
    from pyscf.nao.m_gauleg import leggauss_ab

    assert sp1 >= 0
    assert sp2 >= 0

    if ((R1 - R2)**2).sum() < 1e-7:
        mol = system_vars_c().init_xyzlike(
            [[int(me.aos[0].sp2charge[sp1]), R1]])
    else:
        mol = system_vars_c().init_xyzlike(
            [[int(me.aos[0].sp2charge[sp1]), R1],
             [int(me.aos[1].sp2charge[sp2]), R2]])

    atom2rcut = np.array([
        me.aos[isp].sp_mu2rcut[sp].max() for isp, sp in enumerate([sp1, sp2])
    ])
    grids = dft.gen_grid.Grids(mol)
    grids.level = level  # precision as implemented in pyscf
    grids.radi_method = leggauss_ab
    grids.build(atom2rcut=atom2rcut)
    #grids.build()
    return grids
Exemple #2
0
def build_3dgrid3c(me, sp1, sp2, R1, R2, sp3, R3, level=3):
    from pyscf import dft
    from pyscf.nao.m_system_vars import system_vars_c

    d12 = ((R1 - R2)**2).sum()
    d13 = ((R1 - R3)**2).sum()
    d23 = ((R2 - R3)**2).sum()
    z1 = int(me.aos[0].sp2charge[sp1])
    z2 = int(me.aos[0].sp2charge[sp2])
    z3 = int(me.aos[1].sp2charge[sp3])
    rc1 = me.aos[0].sp2rcut[sp1]
    rc2 = me.aos[0].sp2rcut[sp2]
    rc3 = me.aos[1].sp2rcut[sp3]

    if d12 < 1e-7 and d23 < 1e-7:
        mol = system_vars_c(atom=[[z1, R1]])
    elif d12 < 1e-7 and d23 > 1e-7 and d13 > 1e-7:
        mol = system_vars_c(atom=[[z1, R1], [z3, R3]])
    elif d23 < 1e-7 and d12 > 1e-7 and d13 > 1e-7:
        mol = system_vars_c(atom=[[z1, R1], [z2, R2]])
    elif d13 < 1e-7 and d12 > 1e-7 and d23 > 1e-7:
        mol = system_vars_c(atom=[[z1, R1], [z2, R2]])
    else:
        mol = system_vars_c(atom=[[z1, R1], [z2, R2], [z3, R3]])

    atom2rcut = np.array([rc1, rc2, rc3])
    grids = dft.gen_grid.Grids(mol)
    grids.level = level  # precision as implemented in pyscf
    grids.radi_method = gauss_legendre
    grids.build(atom2rcut=atom2rcut)
    return grids
Exemple #3
0
def build_3dgrid3c(me, sp1, sp2, R1, R2, sp3, R3, level=3):
  from pyscf import dft
  from pyscf.nao.m_system_vars import system_vars_c
  from pyscf.nao.m_gauleg import gauss_legendre

  d12 = ((R1-R2)**2).sum()
  d13 = ((R1-R3)**2).sum()
  d23 = ((R2-R3)**2).sum()
  z1 = int(me.aos[0].sp2charge[sp1])
  z2 = int(me.aos[0].sp2charge[sp2])
  z3 = int(me.aos[1].sp2charge[sp3])
  rc1 = me.aos[0].sp2rcut[sp1]
  rc2 = me.aos[0].sp2rcut[sp2]
  rc3 = me.aos[1].sp2rcut[sp3]
  
  if d12<1e-7 and d23<1e-7 :
    mol = system_vars_c(atom=[ [z1, R1] ])
  elif d12<1e-7 and d23>1e-7 and d13>1e-7:
    mol = system_vars_c(atom=[ [z1, R1], [z3, R3] ])
  elif d23<1e-7 and d12>1e-7 and d13>1e-7:
    mol = system_vars_c(atom=[ [z1, R1], [z2, R2] ])
  elif d13<1e-7 and d12>1e-7 and d23>1e-7:
    mol = system_vars_c(atom=[ [z1, R1], [z2, R2] ])
  else :
    mol = system_vars_c(atom=[ [z1, R1], [z2, R2], [z3, R3] ])

  atom2rcut=np.array([rc1, rc2, rc3])
  grids = dft.gen_grid.Grids(mol)
  grids.level = level # precision as implemented in pyscf
  grids.radi_method = gauss_legendre
  grids.build(atom2rcut=atom2rcut)
  return grids
Exemple #4
0
    def test_siesta2sv_df(self):
        from pyscf import scf
        from pyscf.nao.m_siesta_utils import get_siesta_command, get_pseudo
        import subprocess
        import os

        siesta_fdf = """
    xml.write                  .true.
    PAO.EnergyShift            100 meV
    %block ChemicalSpeciesLabel
     1  11  Na
    %endblock ChemicalSpeciesLabel
    
    NumberOfAtoms       2
    NumberOfSpecies     1
    %block AtomicCoordinatesAndAtomicSpecies
        0.77573521    0.00000000    0.00000000   1
       -0.77573521    0.00000000    0.00000000   1
    %endblock AtomicCoordinatesAndAtomicSpecies
    
    MD.NumCGsteps              0
    COOP.Write                 .true.
    WriteDenchar               .true.
    """
        label = 'siesta'
        fi = open(label + '.fdf', 'w')
        print(siesta_fdf, file=fi)
        fi.close()
        for sp in ['Na']:
            try:
                os.remove(sp + '.psf')
            except:
                pass
            try:
                pppath = get_pseudo(sp)
            except:
                print('get_pseudo( ' + sp +
                      ' ) is not working--> skip siesta run')
                return
            os.symlink(pppath, sp + '.psf')
        errorcode = subprocess.call(get_siesta_command(label), shell=True)
        if errorcode:
            raise RuntimeError(
                'siesta returned an error: {0}'.format(errorcode))

        # run test system_vars
        from pyscf.nao.m_system_vars import system_vars_c, diag_check, overlap_check
        sv = system_vars_c().init_siesta_xml(label)
        self.assertEqual(sv.norbs, 10)
        self.assertTrue(sv.diag_check())
        self.assertTrue(sv.overlap_check())
    if self._nelectron is None:
      return tot_electrons(self)
    else:
      return self._nelectron


#
# Example of reading pySCF orbitals.
#
if __name__=="__main__":
  from pyscf import gto
  from pyscf.nao.m_system_vars import system_vars_c
  import matplotlib.pyplot as plt
  """ Interpreting small Gaussian calculation """
  mol = gto.M(atom='O 0 0 0; H 0 0 1; H 0 1 0; Be 1 0 0', basis='ccpvtz') # coordinates in Angstrom!
  sv = system_vars_c(gto=mol, tol=1e-8, nr=512, rmin=1e-5)
  
  print(sv.ao_log.sp2norbs)
  print(sv.ao_log.sp2nmult)
  print(sv.ao_log.sp2rcut)
  print(sv.ao_log.sp_mu2rcut)
  print(sv.ao_log.nr)
  print(sv.ao_log.rr[0:4], sv.ao_log.rr[-1:-5:-1])
  print(sv.ao_log.psi_log[0].shape, sv.ao_log.psi_log_rl[0].shape)

  sp = 0
  for mu,[ff,j] in enumerate(zip(sv.ao_log.psi_log[sp], sv.ao_log.sp_mu2j[sp])):
    nc = abs(ff).max()
    if j==0 : plt.plot(sv.ao_log.rr, ff/nc, '--', label=str(mu)+' j='+str(j))
    if j>0 : plt.plot(sv.ao_log.rr, ff/nc, label=str(mu)+' j='+str(j))
            return tot_electrons(self)
        else:
            return self._nelectron


#
# Example of reading pySCF orbitals.
#
if __name__ == "__main__":
    from pyscf import gto
    from pyscf.nao.m_system_vars import system_vars_c
    import matplotlib.pyplot as plt
    """ Interpreting small Gaussian calculation """
    mol = gto.M(atom='O 0 0 0; H 0 0 1; H 0 1 0; Be 1 0 0',
                basis='ccpvtz')  # coordinates in Angstrom!
    sv = system_vars_c(gto=mol, tol=1e-8, nr=512, rmin=1e-5)

    print(sv.ao_log.sp2norbs)
    print(sv.ao_log.sp2nmult)
    print(sv.ao_log.sp2rcut)
    print(sv.ao_log.sp_mu2rcut)
    print(sv.ao_log.nr)
    print(sv.ao_log.rr[0:4], sv.ao_log.rr[-1:-5:-1])
    print(sv.ao_log.psi_log[0].shape, sv.ao_log.psi_log_rl[0].shape)

    sp = 0
    for mu, [ff,
             j] in enumerate(zip(sv.ao_log.psi_log[sp],
                                 sv.ao_log.sp_mu2j[sp])):
        nc = abs(ff).max()
        if j == 0:
Exemple #7
0
      for mu1,l1,s1,f1 in self.ao1.sp2info[sp1]:
        f1f2_mom = self.ao1.psi_log_mom[sp2][mu2,:] * self.ao1.psi_log_mom[sp1][mu1,:]
        l2S.fill(0.0)
        for l3 in range( abs(l1-l2), l1+l2+1):
          l2S[l3] = (f1f2_mom[:]*bessel_pp[l3,:]).sum() + f1f2_mom[0]*bessel_pp[l3,0]/dkappa
        cS.fill(0.0)
        for m1 in range(-l1,l1+1):
          for m2 in range(-l2,l2+1):
            gc,m3 = self.get_gaunt(l1,-m1,l2,m2), m2-m1
            for l3ind,l3 in enumerate(range(abs(l1-l2),l1+l2+1)):
              if abs(m3) > l3 : continue
              cS[m1+_j,m2+_j] = cS[m1+_j,m2+_j] + l2S[l3]*ylm[ l3*(l3+1)+m3] *\
                    gc[l3ind] * (-1.0)**((3*l1+l2+l3)//2+m2)
        self.c2r_( l1,l2, self.jmx,cS,rS,cmat)
        oo2co[s1:f1,s2:f2] = rS[-l1+_j:l1+_j+1,-l2+_j:l2+_j+1]
  #sys.exit()

  oo2co = oo2co * (4*np.pi)**2 * self.interp_pp.dg_jt
  return oo2co


if __name__ == '__main__':
  from pyscf.nao.m_system_vars import system_vars_c
  from pyscf.nao.m_prod_log import prod_log_c
  from pyscf.nao.m_ao_matelem import ao_matelem_c
  
  sv = system_vars_c("siesta")
  ra = np.array([0.0, 0.1, 0.2])
  rb = np.array([0.0, 0.1, 0.0])
  coulo = ao_matelem_c(sv.ao_log).coulomb_am(me, 0, ra, 0, rb)
Exemple #8
0
#
# See above
#
def ao_eval_libnao(ao, ra, isp, coords):
  res = np.zeros((ao.sp2norbs[isp],coords.shape[0]), dtype='float64')
  ao_eval_libnao_(ao, ra, isp, coords, res)
  return res


if __name__ == '__main__':
  from pyscf.nao.m_system_vars import system_vars_c
  from pyscf.nao.m_ao_eval import ao_eval
  from pyscf.nao.m_ao_eval_libnao import ao_eval_libnao
  
  sv  = system_vars_c()
  ra = np.array([0.3, -0.5, 0.77], dtype='float64')
  #coords = np.array([[0.07716887, 2.82933578, 3.73214881]])
  coords = np.random.rand(35580,3)*5.0
  
  print('ao_val2 (reference)')
  ao_val1 = ao_eval(sv.ao_log, ra, 0, coords)

  print('ao_val2_libnao')
  ao_val2 = ao_eval_libnao(sv.ao_log, ra, 0, coords)
  
  print(np.allclose(ao_val1,ao_val2))
  for iorb,[oo1,oo2] in enumerate(zip(ao_val1,ao_val2)):
    print(iorb, abs(oo1-oo2).argmax(), abs(oo1-oo2).max(), coords[abs(oo1-oo2).argmax(),:])

Exemple #9
0
#
# See above
#
def ao_eval_libnao(ao, ra, isp, coords):
    res = np.zeros((ao.sp2norbs[isp], coords.shape[0]), dtype='float64')
    ao_eval_libnao_(ao, ra, isp, coords, res)
    return res


if __name__ == '__main__':
    from pyscf.nao.m_system_vars import system_vars_c
    from pyscf.nao.m_ao_eval import ao_eval
    from pyscf.nao.m_ao_eval_libnao import ao_eval_libnao

    sv = system_vars_c()
    ra = np.array([0.3, -0.5, 0.77], dtype='float64')
    #coords = np.array([[0.07716887, 2.82933578, 3.73214881]])
    coords = np.random.rand(35580, 3) * 5.0

    print('ao_val2 (reference)')
    ao_val1 = ao_eval(sv.ao_log, ra, 0, coords)

    print('ao_val2_libnao')
    ao_val2 = ao_eval_libnao(sv.ao_log, ra, 0, coords)

    print(np.allclose(ao_val1, ao_val2))
    for iorb, [oo1, oo2] in enumerate(zip(ao_val1, ao_val2)):
        print(iorb,
              abs(oo1 - oo2).argmax(),
              abs(oo1 - oo2).max(), coords[abs(oo1 - oo2).argmax(), :])
Exemple #10
0
                l2S.fill(0.0)
                for l3 in range(abs(l1 - l2), l1 + l2 + 1):
                    l2S[l3] = (f1f2_mom[:] * bessel_pp[l3, :]).sum(
                    ) + f1f2_mom[0] * bessel_pp[l3, 0] / dkappa
                cS.fill(0.0)
                for m1 in range(-l1, l1 + 1):
                    for m2 in range(-l2, l2 + 1):
                        gc, m3 = self.get_gaunt(l1, -m1, l2, m2), m2 - m1
                        for l3ind, l3 in enumerate(
                                range(abs(l1 - l2), l1 + l2 + 1)):
                            if abs(m3) > l3: continue
                            cS[m1+_j,m2+_j] = cS[m1+_j,m2+_j] + l2S[l3]*ylm[ l3*(l3+1)+m3] *\
                                  gc[l3ind] * (-1.0)**((3*l1+l2+l3)//2+m2)
                self.c2r_(l1, l2, self.jmx, cS, rS, cmat)
                oo2co[s1:f1, s2:f2] = rS[-l1 + _j:l1 + _j + 1,
                                         -l2 + _j:l2 + _j + 1]
    #sys.exit()

    oo2co = oo2co * (4 * np.pi)**2 * self.interp_pp.dg_jt
    return oo2co


if __name__ == '__main__':
    from pyscf.nao.m_system_vars import system_vars_c
    from pyscf.nao.m_ao_matelem import ao_matelem_c

    sv = system_vars_c("siesta")
    ra = np.array([0.0, 0.1, 0.2])
    rb = np.array([0.0, 0.1, 0.0])
    coulo = ao_matelem_c(sv.ao_log).coulomb_am(me, 0, ra, 0, rb)
Exemple #11
0
    grids = build_3dgrid3c(me, sp1, sp2, R1, R2, sp3, R3, **kvargs)

    ao1 = grids.weights * ao_eval(me.aos[0], R1, sp1, grids.coords)
    ao2 = ao_eval(me.aos[0], R2, sp2, grids.coords)
    aoao = np.einsum('ar,br->abr', ao1, ao2)
    pbf = ao_eval(me.aos[1], R3, sp3, grids.coords)

    abp2eri = np.einsum('abr,pr->abp', aoao, pbf)
    return abp2eri


if __name__ == "__main__":
    from pyscf.nao.m_system_vars import system_vars_c, ao_matelem_c, prod_log_c
    from pyscf.nao.m_eri3c import eri3c

    sv = system_vars_c(label='siesta')
    R0 = sv.atom2coord[0, :]

    prod_log = prod_log_c(sv.ao_log)
    me_prod = ao_matelem_c(prod_log)
    vc = me_prod.coulomb_am(0, R0, 0, R0)
    eri_am = np.einsum('pab,pq->abq', prod_log.sp2vertex[0], vc)
    print(eri_am.shape)
    print(eri_am.sum(), eri_am.max(), np.argmax(eri_am), eri_am.min(),
          np.argmin(eri_am))

    vhpf = prod_log.hartree_pot()
    me = ao_matelem_c(sv.ao_log, vhpf)
    eri_ni = eri3c(me, 0, 0, R0, R0, 0, R0, level=4)

    print(eri_ni.shape)
Exemple #12
0
#
def ao_log_hartree(ao, ao_log_hartree_method='lap'):
    if ao_log_hartree_method.upper() == 'LAP':
        return ao_log_hartree_lap_libnao(ao)
    if ao_log_hartree_method.upper() == 'SBT': return ao_log_hartree_sbt(ao)
    raise RuntimeError('!method')


#
#
#
if __name__ == '__main__':
    from pyscf.nao.m_system_vars import system_vars_c
    import matplotlib.pyplot as plt

    sv = system_vars_c('siesta')

    ao_h_lap = ao_log_hartree(sv.ao_log, ao_log_hartree_method='lap')
    ao_h_sbt = ao_log_hartree(sv.ao_log, ao_log_hartree_method='sbt')

    sp = 0
    for mu, [ff_lap, ff_sbt, j] in enumerate(
            zip(ao_h_lap.psi_log[sp], ao_h_sbt.psi_log[sp],
                ao_h_sbt.sp_mu2j[sp])):
        nc = abs(ff_lap).max()
        if j == 0:
            plt.plot(ao_h_lap.rr,
                     ff_lap / nc,
                     '--',
                     label=str(mu) + ' j=' + str(j))
            plt.plot(ao_h_lap.rr,
Exemple #13
0
  for ib,[at,l,ngto,nctr,a,b,c,d] in enumerate(_bas): atom2bas_s[at] = min(atom2bas_s[at],ib)
  return atom2bas_s


if __name__ == '__main__':
  """
    Compute only bilocal part of the four-orbitals, two-center Coulomb integrals
  """
  from pyscf import gto
  from pyscf.nao.m_system_vars import system_vars_c
  from pyscf.nao.m_conv_yzx2xyz import conv_yzx2xyz_c

  tol = 1e-5
  
  mol = gto.M(atom='O 0 0 0; H 0 -0.1 1; H 0 0.1 -1', basis='ccpvdz')
  sv = system_vars_c(gto=mol)
  na = sv.natm
  for ia1,n1 in zip(range(na), sv.atom2s[1:]-sv.atom2s[0:na]):
    for ia2,n2 in zip(range(ia1+1,sv.natm+1), sv.atom2s[ia1+2:]-sv.atom2s[ia1+1:na]):
      mol2 = gto.Mole_pure(atom=[mol._atom[ia1], mol._atom[ia2]], basis=mol.basis).build()
      bs = get_atom2bas_s(mol2._bas)
      ss = (bs[0],bs[1], bs[1],bs[2], bs[0],bs[1], bs[1],bs[2])
      eri = mol2.intor('cint2e_sph', shls_slice=ss).reshape([n1,n2,n1,n2])

      eri = conv_yzx2xyz_c(mol2).conv_yzx2xyz_4d(eri, 'pyscf2nao', ss).reshape([n1*n2,n1*n2])
      ee,xx = np.linalg.eigh(eri)

      nlinindep = list(ee>tol).count(True)
      print(' ia1, ia2, n1, n2: ', ia1, ia2, n1, n2, eri.shape, n1*n2, nlinindep, n1*n2/nlinindep)

Exemple #14
0
AtomicCoordinatesFormat  Ang
NumberOfAtoms       3
NumberOfSpecies     2
%block AtomicCoordinatesAndAtomicSpecies
    0.00000000   -0.00164806    0.00000000   1       1  O
    0.77573521    0.59332141    0.00000000   2       2  H
   -0.77573521    0.59332141    0.00000000   2       3  H
%endblock AtomicCoordinatesAndAtomicSpecies

MD.NumCGsteps              0
MaxSCFIterations           100
COOP.Write     .true.
WriteDenchar   .true.
"""

label = 'siesta'

print(siesta_fdf, file=open(label+'.fdf', 'w'))

for sp in ['O', 'H']:  os.symlink(get_pseudo(sp), sp+'.psf')

errorcode = subprocess.call(get_siesta_command(label), shell=True)
if errorcode: raise RuntimeError('siesta returned an error: {0}'.format(errorcode))

# run test system_vars
from pyscf.nao.m_system_vars import system_vars_c, diag_check, overlap_check
sv  = system_vars_c().init_siesta_xml(label = label)
assert sv.norbs == 23
assert diag_check(sv)
assert overlap_check(sv)
Exemple #15
0
    grids = build_3dgrid3c(me, sp1,sp2,R1,R2, sp3,R3, **kvargs)

    ao1 = grids.weights * ao_eval(me.aos[0], R1, sp1, grids.coords)
    ao2 = ao_eval(me.aos[0], R2, sp2, grids.coords)
    aoao = np.einsum('ar,br->abr', ao1, ao2)
    pbf = ao_eval(me.aos[1], R3, sp3, grids.coords)
    
    abp2eri = np.einsum('abr,pr->abp',aoao,pbf)
    return abp2eri


if __name__=="__main__":
  from pyscf.nao.m_system_vars import system_vars_c, ao_matelem_c, prod_log_c
  from pyscf.nao.m_eri3c import eri3c
  
  sv = system_vars_c(label='siesta')
  R0 = sv.atom2coord[0,:]
  
  prod_log = prod_log_c(sv.ao_log)
  me_prod = ao_matelem_c(prod_log)
  vc = me_prod.coulomb_am(0, R0, 0, R0)
  eri_am = np.einsum('pab,pq->abq', prod_log.sp2vertex[0], vc)
  print( eri_am.shape )
  print( eri_am.sum(), eri_am.max(), np.argmax(eri_am), eri_am.min(), np.argmin(eri_am))
  
  vhpf = prod_log.hartree_pot()
  me = ao_matelem_c(sv.ao_log, vhpf)
  eri_ni = eri3c(me, 0, 0, R0, R0, 0, R0, level=4)
  
  print( eri_ni.shape )
  print( eri_ni.sum(), eri_ni.max(), np.argmax(eri_ni), eri_ni.min(), np.argmin(eri_ni))
Exemple #16
0
 1  11  Na
%endblock ChemicalSpeciesLabel

NumberOfAtoms       2
NumberOfSpecies     1
%block AtomicCoordinatesAndAtomicSpecies
    0.77573521    0.00000000    0.00000000   1
   -0.77573521    0.00000000    0.00000000   1
%endblock AtomicCoordinatesAndAtomicSpecies

MD.NumCGsteps              0
COOP.Write                 .true.
WriteDenchar               .true.
"""

label = 'siesta'

print(siesta_fdf, file=open(label+'.fdf', 'w'))

for sp in ['Na']:  os.symlink(get_pseudo(sp), sp+'.psf')

errorcode = subprocess.call(get_siesta_command(label), shell=True)
if errorcode: raise RuntimeError('siesta returned an error: {0}'.format(errorcode))

# run test system_vars
from pyscf.nao.m_system_vars import system_vars_c, diag_check, overlap_check
sv  = system_vars_c().init_siesta_xml(label = label)
assert sv.norbs == 10
assert diag_check(sv)
assert overlap_check(sv)
Exemple #17
0
  for ib,[at,l,ngto,nctr,a,b,c,d] in enumerate(_bas): atom2bas_s[at] = min(atom2bas_s[at],ib)
  return atom2bas_s


if __name__ == '__main__':
  """
    Compute only bilocal part of the four-orbitals, two-center Coulomb integrals
  """
  from pyscf import gto
  from pyscf.nao.m_system_vars import system_vars_c
  from pyscf.nao.m_conv_yzx2xyz import conv_yzx2xyz_c

  tol = 1e-5
  
  mol = gto.M(atom='O 0 0 0; H 0 -0.1 1; H 0 0.1 -1', basis='ccpvdz')
  sv = system_vars_c(gto=mol)
  na = sv.natm
  for ia1,n1 in zip(range(na), sv.atom2s[1:]-sv.atom2s[0:na]):
    for ia2,n2 in zip(range(ia1+1,sv.natm+1), sv.atom2s[ia1+2:]-sv.atom2s[ia1+1:na]):
      mol2 = gto.Mole_pure(atom=[mol._atom[ia1], mol._atom[ia2]], basis=mol.basis).build()
      bs = get_atom2bas_s(mol2._bas)
      ss = (bs[0],bs[1], bs[1],bs[2], bs[0],bs[1], bs[1],bs[2])
      eri = mol2.intor('cint2e_sph', shls_slice=ss).reshape([n1,n2,n1,n2])

      eri = conv_yzx2xyz_c(mol2).conv_yzx2xyz_4d(eri, 'pyscf2nao', ss).reshape([n1*n2,n1*n2])
      ee,xx = np.linalg.eigh(eri)

      nlinindep = list(ee>tol).count(True)
      print(' ia1, ia2, n1, n2: ', ia1, ia2, n1, n2, eri.shape, n1*n2, nlinindep, n1*n2/nlinindep)