From ed993be237dac84d5bccdedd4c07c0978ce2a8c4 Mon Sep 17 00:00:00 2001 From: Qiming Sun Date: Thu, 10 Oct 2024 21:35:19 -0700 Subject: [PATCH] New Rys kernel (#221) * New Rys kernel Improve tasks generation Tune Fix cupy_helper Optimized cache Rpa Adapt to scf code q_cond double to float do_j and do_k cleanup and bugfix Add LR ERI Add SR ERI Tune sr-eri Rys ERI based j-engine Tune J-engine Task adjustment Fix condense function Add tests and examples for JK matrix evaluation * Solve merging conflicts * Missing import * Fix import errors * Conditionally compiling against CUDA_VERSION * Restore CMakeLists.txt * Missing code * test name conflicts * Fix various merging conflicts * Update unittest configuration * compilation for cuda<12.4 * Update the treatment of omega in get_jk * Handle h functions * Fix a gradients initialization bug * Add assertatin and comments * Compiling issue for rys-j * some code in legacy version --------- Co-authored-by: Qiming Sun Co-authored-by: xiaojie.wu --- .github/workflows/unittest.yml | 3 +- build.sh | 4 +- examples/23-j_engine.py | 41 + gpu4pyscf/__init__.py | 2 +- gpu4pyscf/cc/ccsd_incore.py | 16 +- gpu4pyscf/cc/tests/test_ccsd.py | 10 +- gpu4pyscf/df/int3c2e.py | 10 +- gpu4pyscf/dft/__init__.py | 1 - gpu4pyscf/dft/libxc.py | 4 +- gpu4pyscf/dft/xc_deriv.py | 2 +- gpu4pyscf/grad/rhf.py | 239 +- gpu4pyscf/grad/uhf.py | 2 +- gpu4pyscf/lib/CMakeLists.txt | 12 + gpu4pyscf/lib/cupy_helper.py | 123 + gpu4pyscf/lib/cupy_helper/CMakeLists.txt | 15 +- gpu4pyscf/lib/gvhf-rys/CMakeLists.txt | 20 + gpu4pyscf/lib/gvhf-rys/cart2xyz.c | 208 + gpu4pyscf/lib/gvhf-rys/count_tasks.cu | 89 + gpu4pyscf/lib/gvhf-rys/create_tasks.cu | 473 + gpu4pyscf/lib/gvhf-rys/gamma_inc.cu | 50 + gpu4pyscf/lib/gvhf-rys/gamma_inc_unrolled.cu | 50 + gpu4pyscf/lib/gvhf-rys/nr_sr_estimator.c | 83 + gpu4pyscf/lib/gvhf-rys/rys_contract_j.cu | 769 + gpu4pyscf/lib/gvhf-rys/rys_contract_jk.cu | 775 + gpu4pyscf/lib/gvhf-rys/rys_jk_driver.cu | 226 + gpu4pyscf/lib/gvhf-rys/rys_roots.cu | 72 + gpu4pyscf/lib/gvhf-rys/rys_roots.cuh | 50879 +++++++++++++++++ gpu4pyscf/lib/gvhf-rys/rys_roots_unrolled.cu | 68 + gpu4pyscf/lib/gvhf-rys/rys_tasks.c | 270 + gpu4pyscf/lib/gvhf-rys/unrolled_os.cu | 270 + gpu4pyscf/lib/gvhf-rys/unrolled_rys.cu | 22535 ++++++++ gpu4pyscf/lib/gvhf-rys/unrolled_rys_j.cu | 5532 ++ gpu4pyscf/lib/gvhf-rys/vhf.cuh | 120 + gpu4pyscf/lib/logger.py | 6 +- gpu4pyscf/qmmm/chelpg.py | 5 +- gpu4pyscf/scf/dispersion.py | 10 - gpu4pyscf/scf/hf.py | 574 +- gpu4pyscf/scf/int2c2e.py | 4 +- gpu4pyscf/scf/int4c2e.py | 313 +- gpu4pyscf/scf/jk.py | 742 + gpu4pyscf/scf/tests/test_scf_jk.py | 75 + gpu4pyscf/solvent/grad/pcm.py | 5 +- gpu4pyscf/solvent/pcm.py | 5 +- gpu4pyscf/solvent/smd.py | 8 +- gpu4pyscf/solvent/tests/test_pcm.py | 7 + gpu4pyscf/solvent/tests/test_pcm_grad.py | 3 +- gpu4pyscf/solvent/tests/test_pcm_hessian.py | 4 +- gpu4pyscf/solvent/tests/test_smd.py | 3 +- gpu4pyscf/solvent/tests/test_smd_grad.py | 3 +- gpu4pyscf/solvent/tests/test_smd_hessian.py | 3 +- 50 files changed, 83896 insertions(+), 847 deletions(-) create mode 100644 examples/23-j_engine.py create mode 100644 gpu4pyscf/lib/gvhf-rys/CMakeLists.txt create mode 100644 gpu4pyscf/lib/gvhf-rys/cart2xyz.c create mode 100644 gpu4pyscf/lib/gvhf-rys/count_tasks.cu create mode 100644 gpu4pyscf/lib/gvhf-rys/create_tasks.cu create mode 100644 gpu4pyscf/lib/gvhf-rys/gamma_inc.cu create mode 100644 gpu4pyscf/lib/gvhf-rys/gamma_inc_unrolled.cu create mode 100644 gpu4pyscf/lib/gvhf-rys/nr_sr_estimator.c create mode 100644 gpu4pyscf/lib/gvhf-rys/rys_contract_j.cu create mode 100644 gpu4pyscf/lib/gvhf-rys/rys_contract_jk.cu create mode 100644 gpu4pyscf/lib/gvhf-rys/rys_jk_driver.cu create mode 100644 gpu4pyscf/lib/gvhf-rys/rys_roots.cu create mode 100644 gpu4pyscf/lib/gvhf-rys/rys_roots.cuh create mode 100644 gpu4pyscf/lib/gvhf-rys/rys_roots_unrolled.cu create mode 100644 gpu4pyscf/lib/gvhf-rys/rys_tasks.c create mode 100644 gpu4pyscf/lib/gvhf-rys/unrolled_os.cu create mode 100644 gpu4pyscf/lib/gvhf-rys/unrolled_rys.cu create mode 100644 gpu4pyscf/lib/gvhf-rys/unrolled_rys_j.cu create mode 100644 gpu4pyscf/lib/gvhf-rys/vhf.cuh create mode 100644 gpu4pyscf/scf/jk.py create mode 100644 gpu4pyscf/scf/tests/test_scf_jk.py diff --git a/.github/workflows/unittest.yml b/.github/workflows/unittest.yml index a1a17926..7f33e0dd 100644 --- a/.github/workflows/unittest.yml +++ b/.github/workflows/unittest.yml @@ -33,8 +33,7 @@ jobs: - name: Build GPU4PySCF run: | export CUDA_HOME=/usr/local/cuda - export PATH=${CUDA_HOME}/bin:${PATH} - export LD_LIBRARY_PATH=${CUDA_HOME}/lib64:$LD_LIBRARY_PATH + export CMAKE_CONFIGURE_ARGS="-DBUILD_LIBXC=OFF -DCUDA_ARCHITECTURES=70-real -DBUILD_CUTLASS=ON" sh build.sh - name: Test with pytest run: | diff --git a/build.sh b/build.sh index 0f02b2d9..42b68753 100644 --- a/build.sh +++ b/build.sh @@ -1,8 +1,10 @@ #!/bin/bash +export CUDA_HOME=${CUDA_HOME:-/usr/local/cuda} echo "PATH=${PATH}" echo "CUDA_HOME=${CUDA_HOME}" -export PATH="$CUDA_HOME/bin:$PATH" +export PATH="${CUDA_HOME}/bin:$PATH" +export LD_LIBRARY_PATH=${CUDA_HOME}/lib64:$LD_LIBRARY_PATH python3 setup.py bdist_wheel rm -rf output && mv dist output CURRENT_PATH=`pwd` diff --git a/examples/23-j_engine.py b/examples/23-j_engine.py new file mode 100644 index 00000000..b7a77d49 --- /dev/null +++ b/examples/23-j_engine.py @@ -0,0 +1,41 @@ +# Copyright 2024 The GPU4PySCF Authors. All Rights Reserved. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +''' +Compute J and K matrices separately. The J matrix is evaluated using J-engine. +''' + +import pyscf +from gpu4pyscf import scf +from gpu4pyscf.scf import jk + +mol = pyscf.M( +atom = ''' +O 0.0000000000 -0.0000000000 0.1174000000 +H -0.7570000000 -0.0000000000 -0.4696000000 +H 0.7570000000 0.0000000000 -0.4696000000 +''', +basis='def2-tzvp', +verbose=5 +) + +def get_veff(self, mol, dm, *args, **kwargs): + vj = jk.get_j(mol, dm[0] + dm[1]) + _, vk = jk.get_jk(mol, dm, with_j=False) + return vj - vk + +scf.uhf.UHF.get_veff = get_veff + +mf = mol.UHF().to_gpu().run() diff --git a/gpu4pyscf/__init__.py b/gpu4pyscf/__init__.py index 598bf32a..185fb664 100644 --- a/gpu4pyscf/__init__.py +++ b/gpu4pyscf/__init__.py @@ -1,4 +1,4 @@ -from . import lib, grad, hessian, solvent, scf, dft +#from . import lib, grad, hessian, solvent, scf, dft __version__ = '1.0.2' diff --git a/gpu4pyscf/cc/ccsd_incore.py b/gpu4pyscf/cc/ccsd_incore.py index a6230b58..696b00fb 100644 --- a/gpu4pyscf/cc/ccsd_incore.py +++ b/gpu4pyscf/cc/ccsd_incore.py @@ -31,7 +31,7 @@ from pyscf.cc import ccsd from pyscf.cc import _ccsd from pyscf import __config__ -from gpu4pyscf.scf import hf as gpu_hf +from gpu4pyscf.scf import int4c2e from gpu4pyscf.lib.cupy_helper import load_library from gpu4pyscf.lib import logger @@ -171,7 +171,7 @@ def _direct_ovvv_vvvv(mycc, t1, t2): ((mem_avail-Ht2_mem)*.5/8/nao_cart**2)**.5))) logger.debug1(mycc, 'blksize %d nao %d', blksize, nao_cart) - vhfopt = gpu_hf._VHFOpt(mycc.mol, 'int2e') + vhfopt = int4c2e._VHFOpt(mycc.mol, 'int2e') vhfopt.build(group_size=blksize, diag_block_with_triu=True) mol = vhfopt.mol @@ -219,7 +219,7 @@ def contract_vvvv_(eri, i0, i1, j0, j1): log_qs = vhfopt.log_qs cp_idx, cp_jdx = np.tril_indices(len(vhfopt.uniq_l_ctr)) - if vhfopt.uniq_l_ctr[:,0].max() <= gpu_hf.LMAX_ON_GPU: + if vhfopt.uniq_l_ctr[:,0].max() <= int4c2e.LMAX_ON_GPU: # Computing ERIs on GPU idx, idy = cupy.tril_indices(nao) #eribuf = cupy.empty(blksize**2*nao**2) @@ -279,7 +279,7 @@ def fint(ish0, ish1, jsh0, jsh1, group_id): cpj = cp_jdx[cp_ij_id] li = vhfopt.uniq_l_ctr[cpi,0] lj = vhfopt.uniq_l_ctr[cpj,0] - if li > gpu_hf.LMAX_ON_GPU or lj > gpu_hf.LMAX_ON_GPU or log_q_ij.size == 0: + if li > int4c2e.LMAX_ON_GPU or lj > int4c2e.LMAX_ON_GPU or log_q_ij.size == 0: continue ish0 = l_ctr_offsets[cpi] @@ -375,7 +375,7 @@ def _fill_eri_block(eri, strides, ao_offsets, vhfopt, group_id): cpl = cp_jdx[cp_kl_id] lk = vhfopt.uniq_l_ctr[cpk,0] ll = vhfopt.uniq_l_ctr[cpl,0] - if lk > gpu_hf.LMAX_ON_GPU or ll > gpu_hf.LMAX_ON_GPU: + if lk > int4c2e.LMAX_ON_GPU or ll > int4c2e.LMAX_ON_GPU: raise NotImplementedError stream = cupy.cuda.get_current_stream() @@ -394,7 +394,7 @@ def _fill_eri_block(eri, strides, ao_offsets, vhfopt, group_id): cpj = cp_jdx[cp_ij_id] li = vhfopt.uniq_l_ctr[cpi,0] lj = vhfopt.uniq_l_ctr[cpj,0] - if li > gpu_hf.LMAX_ON_GPU or lj > gpu_hf.LMAX_ON_GPU or log_q_ij.size == 0: + if li > int4c2e.LMAX_ON_GPU or lj > int4c2e.LMAX_ON_GPU or log_q_ij.size == 0: continue t0 = time.perf_counter() @@ -446,7 +446,7 @@ def _make_eris_incore(mycc, mo_coeff=None): (mem_avail*.5/8/nao_cart**2)**.5))) logger.debug1(mycc, 'blksize %d nao %d', blksize, nao_cart) - vhfopt = gpu_hf._VHFOpt(mycc.mol, 'int2e') + vhfopt = int4c2e._VHFOpt(mycc.mol, 'int2e') vhfopt.build(group_size=blksize, diag_block_with_triu=True) mol = vhfopt.mol mo = vhfopt.coeff.dot(mo_coeff) @@ -470,7 +470,7 @@ def _make_eris_incore(mycc, mo_coeff=None): cpj = cp_jdx[cp_ij_id] li = vhfopt.uniq_l_ctr[cpi,0] lj = vhfopt.uniq_l_ctr[cpj,0] - if li > gpu_hf.LMAX_ON_GPU or lj > gpu_hf.LMAX_ON_GPU or log_q_ij.size == 0: + if li > int4c2e.LMAX_ON_GPU or lj > int4c2e.LMAX_ON_GPU or log_q_ij.size == 0: continue ish0 = l_ctr_offsets[cpi] diff --git a/gpu4pyscf/cc/tests/test_ccsd.py b/gpu4pyscf/cc/tests/test_ccsd.py index 91ca21d0..e14e2c66 100644 --- a/gpu4pyscf/cc/tests/test_ccsd.py +++ b/gpu4pyscf/cc/tests/test_ccsd.py @@ -65,4 +65,12 @@ def test_to_gpu(self): if __name__ == '__main__': print("Full Tests for CCSD") - unittest.main() + #unittest.main() + mol = pyscf.M(atom = [ + [8 , (0. , 0. , 0.)], + [1 , (0. , -0.757 , 0.587)], + [1 , (0. , 0.757 , 0.587)], + ], basis = 'cc-pvdz', verbose=0) + mf = mol.RHF().run() + mcc = ccsd_incore.CCSD(mf) + eris = mcc.ao2mo() diff --git a/gpu4pyscf/df/int3c2e.py b/gpu4pyscf/df/int3c2e.py index d4171d25..f2aa0a5a 100644 --- a/gpu4pyscf/df/int3c2e.py +++ b/gpu4pyscf/df/int3c2e.py @@ -20,9 +20,11 @@ import cupy from pyscf import gto, df, lib from pyscf.scf import _vhf -from gpu4pyscf.scf.hf import BasisProdCache, _make_s_index_offsets +from gpu4pyscf.scf.int4c2e import (BasisProdCache, _make_s_index_offsets, + libgvhf, libgint) from gpu4pyscf.lib.cupy_helper import ( - block_c2s_diag, cart2sph, block_diag, contract, load_library, get_avail_mem, print_mem_info, take_last2d) + block_c2s_diag, cart2sph, block_diag, contract, load_library, get_avail_mem, + print_mem_info, take_last2d, libcupy_helper) from gpu4pyscf.lib import logger from gpu4pyscf.gto.mole import basis_seg_contraction @@ -32,10 +34,6 @@ BLKSIZE = 128 NROOT_ON_GPU = 7 -libgvhf = load_library('libgvhf') -libgint = load_library('libgint') -libcupy_helper = load_library('libcupy_helper') - def make_fake_mol(): ''' fake mol for pairing with auxiliary basis diff --git a/gpu4pyscf/dft/__init__.py b/gpu4pyscf/dft/__init__.py index e66c7c3a..d1ae3570 100644 --- a/gpu4pyscf/dft/__init__.py +++ b/gpu4pyscf/dft/__init__.py @@ -10,4 +10,3 @@ def KS(mol, xc='LDA,VWN'): return RKS(mol, xc) else: return UKS(mol, xc) - \ No newline at end of file diff --git a/gpu4pyscf/dft/libxc.py b/gpu4pyscf/dft/libxc.py index 7a260731..8a07e3c3 100644 --- a/gpu4pyscf/dft/libxc.py +++ b/gpu4pyscf/dft/libxc.py @@ -40,12 +40,10 @@ libxc_path = os.path.abspath(os.path.join(path, 'gpu4pyscf', 'lib', 'deps', 'lib')) try: _libxc = np.ctypeslib.load_library('libxc', libxc_path) + break except Exception: _libxc = None - if _libxc is not None: - break - libgdft = load_library('libgdft') libgdft.GDFT_xc_lda.argtypes = ( ctypes.c_void_p, diff --git a/gpu4pyscf/dft/xc_deriv.py b/gpu4pyscf/dft/xc_deriv.py index 402027b8..37faf705 100644 --- a/gpu4pyscf/dft/xc_deriv.py +++ b/gpu4pyscf/dft/xc_deriv.py @@ -241,4 +241,4 @@ def transform_kxc(rho, fxc, kxc, xctype, spin=0): vp[4,0,4] = frtt vp[4,4,0] = frtt vp[4,4,4] = fttt - return vp \ No newline at end of file + return vp diff --git a/gpu4pyscf/grad/rhf.py b/gpu4pyscf/grad/rhf.py index f500b317..a952520c 100644 --- a/gpu4pyscf/grad/rhf.py +++ b/gpu4pyscf/grad/rhf.py @@ -21,7 +21,8 @@ from pyscf import lib, gto from pyscf.grad import rhf from gpu4pyscf.lib.cupy_helper import load_library -from gpu4pyscf.scf.hf import _VHFOpt, KohnShamDFT +from gpu4pyscf.scf.hf import KohnShamDFT +from gpu4pyscf.scf.int4c2e import _VHFOpt from gpu4pyscf.lib.cupy_helper import tag_array, contract, take_last2d from gpu4pyscf.df import int3c2e #TODO: move int3c2e to out of df from gpu4pyscf.lib import logger @@ -31,225 +32,6 @@ BINSIZE = 128 libgvhf = load_library('libgvhf') -''' -def get_jk(mol, dm, hermi=1, vhfopt=None, with_j=True, with_k=True, omega=None, - verbose=None): - - cput0 = (logger.process_clock(), logger.perf_counter()) - log = logger.new_logger(mol, verbose) - if hermi != 1: - raise NotImplementedError('JK-builder only supports hermitian density matrix') - if omega is None: - omega = 0.0 - if vhfopt is None: - vhfopt = _VHFOpt(mol, 'int2e').build(diag_block_with_triu=False) - out_cupy = isinstance(dm, cupy.ndarray) - if not isinstance(dm, cupy.ndarray): - dm = cupy.asarray(dm) - coeff = cupy.asarray(vhfopt.coeff) - nao, nao0 = coeff.shape - dm0 = dm - dms = cupy.asarray(dm0.reshape(-1,nao0,nao0)) - dms = [cupy.einsum('pi,ij,qj->pq', coeff, x, coeff) for x in dms] - if dm0.ndim == 2: - dms = cupy.asarray(dms[0], order='C').reshape(1,nao,nao) - else: - dms = cupy.asarray(dms, order='C') - n_dm = dms.shape[0] - scripts = [] - vj = vk = None - vj_ptr = vk_ptr = lib.c_null_ptr() - gradient_shape = list(dms.shape) - gradient_shape[0] *= 3 - if with_j: - vj = cupy.zeros(gradient_shape).transpose(0, 2, 1) - vj_ptr = ctypes.cast(vj.data.ptr, ctypes.c_void_p) - scripts.append('ji->s2kl') - if with_k: - vk = cupy.zeros(gradient_shape).transpose(0, 2, 1) - vk_ptr = ctypes.cast(vk.data.ptr, ctypes.c_void_p) - if hermi == 1: - scripts.append('jk->s2il') - else: - scripts.append('jk->s1il') - - l_symb = lib.param.ANGULAR - log_qs = vhfopt.log_qs - direct_scf_tol = vhfopt.direct_scf_tol - ncptype = len(log_qs) - cp_idx, cp_jdx = np.tril_indices(ncptype) - l_ctr_shell_locs = vhfopt.l_ctr_offsets - l_ctr_ao_locs = vhfopt.mol.ao_loc[l_ctr_shell_locs] - dm_ctr_cond = np.max( - [lib.condense('absmax', x, l_ctr_ao_locs) for x in dms.get()], axis=0) - - dm_shl = cupy.zeros([l_ctr_shell_locs[-1], l_ctr_shell_locs[-1]]) - assert dms.flags.c_contiguous - size_l = np.array([1,3,6,10,15,21,28]) - l_ctr = vhfopt.uniq_l_ctr[:,0] - r = 0 - - for i, li in enumerate(l_ctr): - i0 = l_ctr_ao_locs[i] - i1 = l_ctr_ao_locs[i+1] - ni_shls = (i1-i0)//size_l[li] - c = 0 - for j, lj in enumerate(l_ctr): - j0 = l_ctr_ao_locs[j] - j1 = l_ctr_ao_locs[j+1] - nj_shls = (j1-j0)//size_l[lj] - sub_dm = dms[0][i0:i1,j0:j1].reshape([ni_shls, size_l[li], nj_shls, size_l[lj]]) - dm_shl[r:r+ni_shls, c:c+nj_shls] = cupy.max(sub_dm, axis=[1,3]) - c += nj_shls - r += ni_shls - - dm_shl = cupy.asarray(np.log(dm_shl)) - nshls = dm_shl.shape[0] - t0 = time.perf_counter() - - if hermi != 1: - dm_ctr_cond = (dm_ctr_cond + dm_ctr_cond.T) * .5 - fn = libgvhf.GINTbuild_ip1_jk - for cp_ij_id, log_q_ij in enumerate(log_qs): - cpi = cp_idx[cp_ij_id] - cpj = cp_jdx[cp_ij_id] - li = vhfopt.uniq_l_ctr[cpi,0] - lj = vhfopt.uniq_l_ctr[cpj,0] - if li > LMAX_ON_GPU or lj > LMAX_ON_GPU or log_q_ij.size == 0: - continue - - for cp_kl_id, log_q_kl in enumerate(log_qs): - cpk = cp_idx[cp_kl_id] - cpl = cp_jdx[cp_kl_id] - lk = vhfopt.uniq_l_ctr[cpk,0] - ll = vhfopt.uniq_l_ctr[cpl,0] - if lk > LMAX_ON_GPU or ll > LMAX_ON_GPU or log_q_kl.size == 0: - continue - - # TODO: determine cutoff based on the relevant maximum value of dm blocks? - sub_dm_cond = max(dm_ctr_cond[cpi,cpj], dm_ctr_cond[cpk,cpl], - dm_ctr_cond[cpi,cpk], dm_ctr_cond[cpj,cpk], - dm_ctr_cond[cpi,cpl], dm_ctr_cond[cpj,cpl]) - - if sub_dm_cond < direct_scf_tol * 1e3: - continue - - log_cutoff = np.log(direct_scf_tol) - sub_dm_cond = np.log(sub_dm_cond) - - bins_locs_ij = vhfopt.bins[cp_ij_id] - bins_locs_kl = vhfopt.bins[cp_kl_id] - - log_q_ij = cupy.asarray(log_q_ij, dtype=np.float64) - log_q_kl = cupy.asarray(log_q_kl, dtype=np.float64) - - bins_floor_ij = vhfopt.bins_floor[cp_ij_id] - bins_floor_kl = vhfopt.bins_floor[cp_kl_id] - - nbins_ij = len(bins_locs_ij) - 1 - nbins_kl = len(bins_locs_kl) - 1 - - err = fn(vhfopt.bpcache, vj_ptr, vk_ptr, - ctypes.cast(dms.data.ptr, ctypes.c_void_p), - ctypes.c_int(nao), ctypes.c_int(n_dm), - bins_locs_ij.ctypes.data_as(ctypes.c_void_p), - bins_locs_kl.ctypes.data_as(ctypes.c_void_p), - bins_floor_ij.ctypes.data_as(ctypes.c_void_p), - bins_floor_kl.ctypes.data_as(ctypes.c_void_p), - ctypes.c_int(nbins_ij), - ctypes.c_int(nbins_kl), - ctypes.c_int(cp_ij_id), - ctypes.c_int(cp_kl_id), - ctypes.c_double(omega), - ctypes.c_double(log_cutoff), - ctypes.c_double(sub_dm_cond), - ctypes.cast(dm_shl.data.ptr, ctypes.c_void_p), - ctypes.c_int(nshls), - ctypes.cast(log_q_ij.data.ptr, ctypes.c_void_p), - ctypes.cast(log_q_kl.data.ptr, ctypes.c_void_p)) - if err != 0: - detail = f'CUDA Error for ({l_symb[li]}{l_symb[lj]}|{l_symb[lk]}{l_symb[ll]})' - raise RuntimeError(detail) - log.debug1('(%s%s|%s%s) on GPU %.3fs', - l_symb[li], l_symb[lj], l_symb[lk], l_symb[ll], - time.perf_counter() - t0) - if with_j: - vj = cupy.asarray([coeff.T @ vj_slice @ coeff * 2 for vj_slice in vj]) - # *2 because only the lower triangle part of dm was used in J contraction - if with_k: - vk = cupy.asarray([coeff.T @ vk_slice @ coeff for vk_slice in vk]) - - cput0 = log.timer_debug1('get_jk pass 1 on gpu', *cput0) - - #TODO: h_shls untested - h_shls = vhfopt.h_shls - if h_shls: - log.debug3('Integrals for %s functions on CPU', l_symb[LMAX_ON_GPU+1]) - pmol = vhfopt.mol - shls_excludes = [0, h_shls[0]] * 4 - vs_h = vhfopt.direct_mapdm('int2e_cart', 's8', scripts, - dms.get(), 1, pmol._atm, pmol._bas, pmol._env, - vhfopt=vhfopt, shls_excludes=shls_excludes) - coeff = vhfopt.coeff - pnao = coeff.shape[0] - idx, idy = np.tril_indices(pnao, -1) - if with_j and with_k: - vj1 = vs_h[0] - vk1 = vs_h[1] - elif with_j: - vj1 = vs_h[0] - else: - vk1 = vs_h[0] - - if with_j: - vj1[:,idy,idx] = vj1[:,idx,idy] - for i, v in enumerate(vj1): - vj[i] += coeff.T.dot(v).dot(coeff) - if with_k: - if hermi: - vk1[:,idy,idx] = vk1[:,idx,idy] - for i, v in enumerate(vk1): - vk[i] += coeff.T.dot(v).dot(coeff) - cput0 = log.timer_debug1('get_jk pass 2 for l>4 basis on cpu', *cput0) - - if FREE_CUPY_CACHE: - coeff = dms = None - cupy.get_default_memory_pool().free_all_blocks() - - if dm0.ndim != 2: - if with_j: - vj = vj.reshape((3,) + dm0.shape) - if with_k: - vk = vk.reshape((3,) + dm0.shape) - - if out_cupy: - return vj, vk - else: - return vj.get() if vj is not None else None, \ - vk.get() if vk is not None else None - -def _get_jk(gradient_object, mol=None, dm=None, hermi=1, with_j=True, with_k=True, - omega=None): - if omega is not None: - raise NotImplementedError('Range separated Coulomb integrals') - mf = gradient_object.base - cput0 = (logger.process_clock(), logger.perf_counter()) - log = logger.new_logger(gradient_object) - log.debug3('apply get_grad_jk on gpu') - if hasattr(mf, '_opt_gpu'): - vhfopt = mf._opt_gpu - else: - vhfopt = _VHFOpt(mol, getattr(mf.opt, '_intor', 'int2e'), - getattr(mf.opt, 'prescreen', 'CVHFnrs8_prescreen'), - getattr(mf.opt, '_qcondname', 'CVHFsetnr_direct_scf'), - getattr(mf.opt, '_dmcondname', 'CVHFsetnr_direct_scf_dm')) - vhfopt.build(mf.direct_scf_tol) - mf._opt_gpu = vhfopt - vj, vk = get_jk(mol, dm, hermi, vhfopt, with_j, with_k, omega, verbose=log) - log.timer('vj and vk gradient on gpu', *cput0) - return vj, vk -''' - def get_jk(mol, dm, hermi=1, vhfopt=None, with_j=True, with_k=True, omega=None, verbose=None, atmlst=None): if atmlst is None: @@ -263,6 +45,9 @@ def get_jk(mol, dm, hermi=1, vhfopt=None, with_j=True, with_k=True, omega=None, omega = 0.0 if vhfopt is None: vhfopt = _VHFOpt(mol, 'int2e').build(diag_block_with_triu=False) + if vhfopt.h_shls: + raise NotImplementedError + out_cupy = isinstance(dm, cupy.ndarray) if not isinstance(dm, cupy.ndarray): dm = cupy.asarray(dm) @@ -428,15 +213,11 @@ def _get_jk(gradient_object, mol=None, dm=None, hermi=1, with_j=True, with_k=Tru log = logger.new_logger(gradient_object) cput0 = log.init_timer() log.debug3('apply get_grad_jk on gpu') - if hasattr(mf, '_opt_gpu'): - vhfopt = mf._opt_gpu - else: - vhfopt = _VHFOpt(mol, getattr(mf.opt, '_intor', 'int2e'), - getattr(mf.opt, 'prescreen', 'CVHFnrs8_prescreen'), - getattr(mf.opt, '_qcondname', 'CVHFsetnr_direct_scf'), - getattr(mf.opt, '_dmcondname', 'CVHFsetnr_direct_scf_dm')) - vhfopt.build(mf.direct_scf_tol) - mf._opt_gpu = vhfopt + vhfopt = _VHFOpt(mol, getattr(mf.opt, '_intor', 'int2e'), + getattr(mf.opt, 'prescreen', 'CVHFnrs8_prescreen'), + getattr(mf.opt, '_qcondname', 'CVHFsetnr_direct_scf'), + getattr(mf.opt, '_dmcondname', 'CVHFsetnr_direct_scf_dm')) + vhfopt.build(mf.direct_scf_tol) vj, vk = get_jk(mol, dm, hermi, vhfopt, with_j, with_k, omega, verbose=log) log.timer('vj and vk gradient on gpu', *cput0) return vj, vk diff --git a/gpu4pyscf/grad/uhf.py b/gpu4pyscf/grad/uhf.py index 6c977211..1f6e8476 100644 --- a/gpu4pyscf/grad/uhf.py +++ b/gpu4pyscf/grad/uhf.py @@ -25,7 +25,7 @@ from gpu4pyscf.lib.cupy_helper import tag_array, contract from gpu4pyscf.df import int3c2e #TODO: move int3c2e to out of df from gpu4pyscf.lib import logger -from gpu4pyscf.scf.hf import _VHFOpt +from gpu4pyscf.scf.int4c2e import _VHFOpt from gpu4pyscf.grad import rhf as rhf_grad LMAX_ON_GPU = 3 diff --git a/gpu4pyscf/lib/CMakeLists.txt b/gpu4pyscf/lib/CMakeLists.txt index a8bc673f..e5115f5b 100644 --- a/gpu4pyscf/lib/CMakeLists.txt +++ b/gpu4pyscf/lib/CMakeLists.txt @@ -67,6 +67,16 @@ if (BUILD_MARCH_NATIVE) endif() endif() +option(ENABLE_OPENMP "Compiling C extensions with openmp" ON) +set(OPENMP_C_PROPERTIES "") +if(ENABLE_OPENMP) + find_package(OpenMP) + if(OPENMP_FOUND) + set(HAVE_OPENMP 1) + set(OPENMP_C_PROPERTIES OpenMP::OpenMP_C) + endif() +endif() + # See also https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/RPATH-handling if (WIN32) #? @@ -137,6 +147,8 @@ if(BUILD_SOLVENT) add_subdirectory(solvent) endif() +add_subdirectory(gvhf-rys) + option(BUILD_LIBXC "Using libxc for DFT" ON) if(BUILD_LIBXC) include(ExternalProject) diff --git a/gpu4pyscf/lib/cupy_helper.py b/gpu4pyscf/lib/cupy_helper.py index 13c9b875..a3b3b341 100644 --- a/gpu4pyscf/lib/cupy_helper.py +++ b/gpu4pyscf/lib/cupy_helper.py @@ -34,6 +34,8 @@ c2s_offset = np.cumsum([0] + [x.shape[0]*x.shape[1] for x in c2s_l]) _data = {'c2s': None} +_kernel_registery = {} + def load_library(libname): try: _loaderpath = os.path.dirname(__file__) @@ -796,3 +798,124 @@ def grouped_gemm(As, Bs, Cs=None): if err != 0: raise RuntimeError('failed in grouped_gemm kernel') return Cs + +def condense(opname, a, loc_x, loc_y=None): + assert opname in ('sum', 'max', 'min', 'abssum', 'absmax', 'norm') + assert a.dtype == np.float64 + if loc_y is None: + loc_y = loc_x + do_transpose = False + if a.ndim == 2: + if a.flags.f_contiguous: + a = a.T + loc_x, loc_y = loc_y, loc_x + do_transpose = True + a = a[None] + else: + assert a.flags.c_contiguous + loc_x = cupy.asarray(loc_x, cupy.int32) + loc_y = cupy.asarray(loc_y, cupy.int32) + nloc_x = loc_x.size - 1 + nloc_y = loc_y.size - 1 + counts, nx, ny = a.shape + assert loc_x[-1] == nx + assert loc_y[-1] == ny + + #if opname == 'absmax': + # out = cupy.zeros((nloc_x, nloc_y)) + # err = libcupy_helper.dabsmax_condense( + # ctypes.cast(out.ctypes.data, ctypes.c_void_p), + # ctypes.cast(a.ctypes.data, ctypes.c_void_p), + # ctypes.cast(loc_x.ctypes.data, ctypes.c_void_p), + # ctypes.cast(loc_y.ctypes.data, ctypes.c_void_p), + # ctypes.c_int(nloc_x), ctypes.c_int(nloc_y), ctypes.c_int(counts)) + # if err != 0: + # raise RuntimeError('failed in dabsmax_condense kernel') + # if do_transpose: + # out = out.T + # return out + + fn_name = f'd{opname}_condense' + if fn_name not in _kernel_registery: + if opname == 'sum': + init_code = '0' + code = 'val += a[ip*nj+jp];' + result_code = 'val' + elif opname == 'max': + init_code = '0' + code = 'double tmp = a[ip*nj+jp]; val = (val > tmp) ? val : tmp;' + result_code = 'val' + elif opname == 'min': + init_code = '0' + code = 'double tmp = a[ip*nj+jp]; val = (val < tmp) ? val : tmp;' + result_code = 'val' + elif opname == 'abssum': + init_code = '0' + code = 'val += fabs(a[ip*nj+jp]);' + result_code = 'val' + elif opname == 'absmax': + init_code = '0' + code = 'double tmp = fabs(a[ip*nj+jp]); val = (val > tmp) ? val : tmp;' + result_code = 'val' + elif opname == 'norm': + init_code = '0' + code = 'double tmp = a[ip*nj+jp]; val += tmp * tmp;' + result_code = 'fsqrt(val)' + + kernel_code = (f'''\ +extern "C" __global__ +void {fn_name}(double *out, double *a, int *loc_x, int *loc_y, + long long nloc_x, long long nloc_y, long long counts)''' +''' +{ + int j = blockIdx.x * blockDim.x + threadIdx.x; + int i = blockIdx.y * blockDim.y + threadIdx.y; + if (i >= nloc_x || j >= nloc_y) { + return; + } + size_t ni = loc_x[nloc_x]; + size_t nj = loc_y[nloc_y]; + size_t Nloc_y = nloc_y; + int i0 = loc_x[i]; + int i1 = loc_x[i+1]; + int j0 = loc_y[j]; + int j1 = loc_y[j+1]; + double val = ''' + init_code + '''; + for (int n = 0; n < counts; ++n) { + for (int ip = i0; ip < i1; ++ip) { + for (int jp = j0; jp < j1; ++jp) { + ''' + code + ''' + } } + a += ni * nj; + } + out[i*Nloc_y+j] = ''' + result_code + '''; +} +''') + _kernel_registery[fn_name] = cupy.RawKernel(kernel_code, fn_name) + + kernel = _kernel_registery[fn_name] + out = cupy.zeros((nloc_x, nloc_y)) + blocks = ((nloc_x+15)//16, (nloc_y+15)//16) + threads = (16, 16) + kernel(blocks, threads, (out, a, loc_x, loc_y, nloc_x, nloc_y, counts)) + cupy.cuda.Stream.null.synchronize() + if do_transpose: + out = out.T + return out + +def sandwich_dot(a, c, out=None): + '''Performs c.T.dot(a).dot(c)''' + a = cupy.asarray(a) + a_ndim = a.ndim + if a_ndim == 2: + a = a[None] + counts = a.shape[0] + m = c.shape[1] + out = cupy.empty((counts, m, m)) + tmp = None + for i in range(counts): + tmp = cupy.dot(c.T, a[i], out=tmp) + cupy.dot(tmp, c, out=out[i]) + if a_ndim == 2: + out = out[0] + return out diff --git a/gpu4pyscf/lib/cupy_helper/CMakeLists.txt b/gpu4pyscf/lib/cupy_helper/CMakeLists.txt index 3c440d0a..dbdc593f 100644 --- a/gpu4pyscf/lib/cupy_helper/CMakeLists.txt +++ b/gpu4pyscf/lib/cupy_helper/CMakeLists.txt @@ -17,7 +17,7 @@ #set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -arch=sm_80") -add_library(cupy_helper SHARED +set(cupy_helper_src transpose.cu block_diag.cu unpack.cu @@ -25,13 +25,22 @@ add_library(cupy_helper SHARED async_d2h_2d.cu add_sparse.cu dist_matrix.cu - grouped_gemm.cu - grouped_dot.cu cart2sph.cu ) +if(BUILD_CUTLASS) + set(cupy_helper_src ${cupy_helper_src} + grouped_gemm.cu + grouped_dot.cu + ) +endif() + +add_library(cupy_helper SHARED ${cupy_helper_src}) + +if(BUILD_CUTLASS) add_dependencies(cupy_helper cutlass) target_include_directories(cupy_helper PRIVATE ${cutlass_SOURCE_DIR}/tools/util/include ${cutlass_SOURCE_DIR}/include) +endif() set_target_properties(cupy_helper PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}) set_target_properties(cupy_helper PROPERTIES CUDA_ARCHITECTURES "${CMAKE_CUDA_ARCHITECTURES}") diff --git a/gpu4pyscf/lib/gvhf-rys/CMakeLists.txt b/gpu4pyscf/lib/gvhf-rys/CMakeLists.txt new file mode 100644 index 00000000..73dbf9f0 --- /dev/null +++ b/gpu4pyscf/lib/gvhf-rys/CMakeLists.txt @@ -0,0 +1,20 @@ +set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} --ptxas-options=-v")# -maxrregcount=128") + +add_library(gvhf_rys SHARED + rys_contract_jk.cu rys_jk_driver.cu unrolled_os.cu unrolled_rys.cu + nr_sr_estimator.c + rys_contract_j.cu cart2xyz.c unrolled_rys_j.cu + count_tasks.cu +) + +#option(BUILD_SHARED_LIBS "build shared libraries" 1) +#option(ENABLE_STATIC "Enforce static library build" 0) +#if(ENABLE_STATIC) +# set(BUILD_SHARED_LIBS 0) +#endif() + +set_target_properties(gvhf_rys PROPERTIES + LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR} + CUDA_SEPARABLE_COMPILATION ON) + +target_link_libraries(gvhf_rys OpenMP::OpenMP_C) diff --git a/gpu4pyscf/lib/gvhf-rys/cart2xyz.c b/gpu4pyscf/lib/gvhf-rys/cart2xyz.c new file mode 100644 index 00000000..ee564cf9 --- /dev/null +++ b/gpu4pyscf/lib/gvhf-rys/cart2xyz.c @@ -0,0 +1,208 @@ +// Edit based on pyscf/lib/dft/grid_common.c + +#include +#include "vhf.cuh" + +static int _LEN_CART0[] = { + 0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91, 105, 120, 136 +}; + +static int _BINOMIAL_COEF[] = { + 1, + 1, 1, + 1, 2, 1, + 1, 3, 3, 1, + 1, 4, 6, 4, 1, + 1, 5, 10, 10, 5, 1, + 1, 6, 15, 20, 15, 6, 1, + 1, 7, 21, 35, 35, 21, 7, 1, + 1, 8, 28, 56, 70, 56, 28, 8, 1, + 1, 9, 36, 84, 126, 126, 84, 36, 9, 1, + 1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1, + 1, 11, 55, 165, 330, 462, 462, 330, 165, 55, 11, 1, + 1, 12, 66, 220, 495, 792, 924, 792, 495, 220, 66, 12, 1, + 1, 13, 78, 286, 715,1287,1716,1716,1287, 715, 286, 78, 13, 1, + 1, 14, 91, 364,1001,2002,3003,3432,3003,2002,1001, 364, 91, 14, 1, + 1, 15, 105, 455,1365,3003,5005,6435,6435,5005,3003,1365, 455, 105, 15, 1, +}; + +#define BINOMIAL(n, i) (_BINOMIAL_COEF[_LEN_CART0[n]+i]) + +static void _get_dm_to_dm_xyz_coeff(double* pcx, double* rij, int lmax) +{ + int lmax1 = lmax + 1; + int l, lx; + double rx_pow[LMAX1]; + double ry_pow[LMAX1]; + double rz_pow[LMAX1]; + + rx_pow[0] = 1.0; + ry_pow[0] = 1.0; + rz_pow[0] = 1.0; + for (lx = 1; lx <= lmax; lx++) { + rx_pow[lx] = rx_pow[lx-1] * rij[0]; + ry_pow[lx] = ry_pow[lx-1] * rij[1]; + rz_pow[lx] = rz_pow[lx-1] * rij[2]; + } + + double *pcy = pcx + lmax1 * lmax1; + double *pcz = pcy + lmax1 * lmax1; + for (l = 0; l <= lmax; l++){ + for (lx = 0; lx <= l; lx++) { + pcx[l*lmax1+lx] = BINOMIAL(l, lx) * rx_pow[l-lx]; + pcy[l*lmax1+lx] = BINOMIAL(l, lx) * ry_pow[l-lx]; + pcz[l*lmax1+lx] = BINOMIAL(l, lx) * rz_pow[l-lx]; + } + } +} + +static void _dm_to_dm_xyz(double* dm_xyz, double* dm, int nao, int li, int lj, double* ri, double* rj) +{ + double rij[3]; + rij[0] = ri[0] - rj[0]; + rij[1] = ri[1] - rj[1]; + rij[2] = ri[2] - rj[2]; + + int lj1 = lj + 1; + int lij = li + lj; + int l1 = lij + 1; + int l1l1 = l1 * l1; + double pcx[LMAX1*LMAX1*3]; + double *pcy = pcx + lj1 * lj1; + double *pcz = pcy + lj1 * lj1; + _get_dm_to_dm_xyz_coeff(pcx, rij, lj); + + for (int lx = 0; lx <= lij; lx++) { + for (int ly = 0; ly <= lij-lx; ly++) { + for (int lz = 0; lz <= lij-lx-ly; lz++) { + dm_xyz[lx*l1l1+ly*l1+lz] = 0.; + } + } + } + + for (int i = 0, lx_i = li; lx_i >= 0; lx_i--) { + for (int ly_i = li-lx_i; ly_i >= 0; ly_i--, i++) { + int lz_i = li - lx_i - ly_i; + for (int j = 0, lx_j = lj; lx_j >= 0; lx_j--) { + for (int ly_j = lj-lx_j; ly_j >= 0; ly_j--, j++) { + int lz_j = lj - lx_j - ly_j; + double dm_ij = dm[i*nao+j]; + for (int jx = 0; jx <= lx_j; jx++) { + double cx = pcx[jx+lx_j*lj1]; + int lx = lx_i + jx; + for (int jy = 0; jy <= ly_j; jy++) { + double cxy = cx * pcy[jy+ly_j*lj1]; + int ly = ly_i + jy; + for (int jz = 0; jz <= lz_j; jz++) { + double cxyz = cxy * pcz[jz+lz_j*lj1]; + int lz = lz_i + jz; + dm_xyz[lx*l1l1+ly*l1+lz] += cxyz * dm_ij; + } + } + } + } + } + } + } +} + +static void _dm_xyz_to_dm(double* dm_xyz, double* dm, int nao, int li, int lj, double* ri, double* rj) +{ + double rij[3]; + rij[0] = ri[0] - rj[0]; + rij[1] = ri[1] - rj[1]; + rij[2] = ri[2] - rj[2]; + + int lj1 = lj + 1; + int l1 = li + lj + 1; + int l1l1 = l1 * l1; + double pcx[LMAX1*LMAX1*3]; + double *pcy = pcx + lj1 * lj1; + double *pcz = pcy + lj1 * lj1; + _get_dm_to_dm_xyz_coeff(pcx, rij, lj); + + for (int i = 0, lx_i = li; lx_i >= 0; lx_i--) { + for (int ly_i = li-lx_i; ly_i >= 0; ly_i--, i++) { + int lz_i = li - lx_i - ly_i; + for (int j = 0, lx_j = lj; lx_j >= 0; lx_j--) { + for (int ly_j = lj-lx_j; ly_j >= 0; ly_j--, j++) { + int lz_j = lj - lx_j - ly_j; + double dm_ij = 0; + for (int jx = 0; jx <= lx_j; jx++) { + double cx = pcx[jx+lx_j*lj1]; + int lx = lx_i + jx; + for (int jy = 0; jy <= ly_j; jy++) { + double cy = pcy[jy+ly_j*lj1]; + int ly = ly_i + jy; + for (int jz = 0; jz <= lz_j; jz++) { + double cz = pcz[jz+lz_j*lj1]; + int lz = lz_i + jz; + dm_ij += cx*cy*cz * dm_xyz[lx*l1l1+ly*l1+lz]; + } + } + } + dm[i*nao+j] = dm_ij; + } + } + } + } +} + +void transform_cart_to_xyz(double *dm_xyz, double *dm, int *ao_loc, int *pair_loc, + int *bas, int nbas, double *env) +{ + int nao = ao_loc[nbas]; + double cache[(LMAX*2+1)*(LMAX*2+1)*(LMAX*2+1)]; + for (int ish = 0; ish < nbas; ish++) { + int i0 = ao_loc[ish]; + int li = bas[ish*BAS_SLOTS+ANG_OF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + for (int jsh = 0; jsh < nbas; jsh++) { + int j0 = ao_loc[jsh]; + int lj = bas[jsh*BAS_SLOTS+ANG_OF]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + _dm_to_dm_xyz(cache, dm+i0*nao+j0, nao, li, lj, ri, rj); + + int lij = li + lj; + int l1 = lij + 1; + double *pdm_xyz = dm_xyz + pair_loc[ish*nbas+jsh]; + for (int ix = 0, n = 0; ix <= lij; ix++) { + for (int iy = 0; iy <= lij-ix; iy++) { + for (int iz = 0; iz <= lij-ix-iy; iz++, n++) { + pdm_xyz[n] = cache[(ix*l1+iy)*l1+iz]; + } + } + } + } + } +} + + +void transform_xyz_to_cart(double *vj, double *vj_xyz, int *ao_loc, int *pair_loc, + int *bas, int nbas, double *env) +{ + int nao = ao_loc[nbas]; + double cache[(LMAX*2+1)*(LMAX*2+1)*(LMAX*2+1)]; + for (int ish = 0; ish < nbas; ish++) { + int i0 = ao_loc[ish]; + int li = bas[ish*BAS_SLOTS+ANG_OF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + for (int jsh = 0; jsh < nbas; jsh++) { + int j0 = ao_loc[jsh]; + int lj = bas[jsh*BAS_SLOTS+ANG_OF]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + + int lij = li + lj; + int l1 = lij + 1; + double *pvj_xyz = vj_xyz + pair_loc[ish*nbas+jsh]; + for (int ix = 0, n = 0; ix <= lij; ix++) { + for (int iy = 0; iy <= lij-ix; iy++) { + for (int iz = 0; iz <= lij-ix-iy; iz++, n++) { + cache[(ix*l1+iy)*l1+iz] = pvj_xyz[n]; + } + } + } + _dm_xyz_to_dm(cache, vj+i0*nao+j0, nao, li, lj, ri, rj); + } + } +} diff --git a/gpu4pyscf/lib/gvhf-rys/count_tasks.cu b/gpu4pyscf/lib/gvhf-rys/count_tasks.cu new file mode 100644 index 00000000..cc9d2a47 --- /dev/null +++ b/gpu4pyscf/lib/gvhf-rys/count_tasks.cu @@ -0,0 +1,89 @@ +#include +#include +#include +#include +#include + +#include "vhf.cuh" +#include "create_tasks.cu" + +__global__ +static void count_jk_kernel(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.y * blockDim.x + threadIdx.x; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + double omega = envs.env[PTR_RANGE_OMEGA]; + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks; + if (omega >= 0) { + ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + } else { + ntasks = _fill_sr_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +extern "C" { +int RYS_count_jk_tasks(double *vj, double *vk, double *dm, int n_dm, int nao, + RysIntEnvVars envs, int *scheme, int *shls_slice, + int ntile_ij_pairs, int ntile_kl_pairs, + int *tile_ij_mapping, int *tile_kl_mapping, float *tile_q_cond, + float *q_cond, float *dm_cond, float cutoff, + ShellQuartet *pool, uint32_t *batch_head, int workers, + int *atm, int natm, int *bas, int nbas, double *env) +{ + uint16_t ish0 = shls_slice[0]; + uint16_t jsh0 = shls_slice[2]; + uint16_t ksh0 = shls_slice[4]; + uint16_t lsh0 = shls_slice[6]; + uint8_t li = bas[ANG_OF + ish0*BAS_SLOTS]; + uint8_t lj = bas[ANG_OF + jsh0*BAS_SLOTS]; + uint8_t lk = bas[ANG_OF + ksh0*BAS_SLOTS]; + uint8_t ll = bas[ANG_OF + lsh0*BAS_SLOTS]; + uint8_t iprim = bas[NPRIM_OF + ish0*BAS_SLOTS]; + uint8_t jprim = bas[NPRIM_OF + jsh0*BAS_SLOTS]; + uint8_t kprim = bas[NPRIM_OF + ksh0*BAS_SLOTS]; + uint8_t lprim = bas[NPRIM_OF + lsh0*BAS_SLOTS]; + uint8_t nfi = (li+1)*(li+2)/2; + uint8_t nfj = (lj+1)*(lj+2)/2; + uint8_t nfk = (lk+1)*(lk+2)/2; + uint8_t nfl = (ll+1)*(ll+2)/2; + uint8_t nfij = nfi * nfj; + uint8_t nfkl = nfk * nfl; + uint8_t order = li + lj + lk + ll; + uint8_t nroots = order / 2 + 1; + uint8_t stride_j = li + 1; + uint8_t stride_k = stride_j * (lj + 1); + uint8_t stride_l = stride_k * (lk + 1); + BoundsInfo bounds = {li, lj, lk, ll, nfi, nfk, nfij, nfkl, + nroots, stride_j, stride_k, stride_l, iprim, jprim, kprim, lprim, + ntile_ij_pairs, ntile_kl_pairs, tile_ij_mapping, tile_kl_mapping, + q_cond, dm_cond, cutoff}; + JKMatrix jk = {vj, vk, dm, (uint16_t)n_dm}; + + cudaMemset(batch_head, 0, 2*sizeof(uint32_t)); + + int threads = scheme[0]*scheme[1]; + int buflen = threads; + count_jk_kernel<<>>(envs, jk, bounds, pool, batch_head); + return 0; +} +} diff --git a/gpu4pyscf/lib/gvhf-rys/create_tasks.cu b/gpu4pyscf/lib/gvhf-rys/create_tasks.cu new file mode 100644 index 00000000..aec96997 --- /dev/null +++ b/gpu4pyscf/lib/gvhf-rys/create_tasks.cu @@ -0,0 +1,473 @@ +#include +#include +#include +#include +#include + +#include "vhf.cuh" + +__device__ +static int _fill_jk_tasks(ShellQuartet *shl_quartet_idx, + RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + int batch_ij, int batch_kl) +{ + int nbas = envs.nbas; + int *tile_ij_mapping = bounds.tile_ij_mapping; + int *tile_kl_mapping = bounds.tile_kl_mapping; + float *q_cond = bounds.q_cond; +#if TILE == 1 + float *tile_q_cond = q_cond; +#else + float *tile_q_cond = q_cond + nbas*nbas; +#endif + float *dm_cond = bounds.dm_cond; + float cutoff = bounds.cutoff; + int t_id = threadIdx.y * blockDim.x + threadIdx.x; + int t_kl0 = batch_kl * TILES_IN_BATCH; + int t_kl1 = MIN(t_kl0 + TILES_IN_BATCH, bounds.ntile_kl_pairs); + int threads = blockDim.x * blockDim.y; + + int tile_ij = tile_ij_mapping[batch_ij]; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + int ish1 = ish0 + TILE; + int jsh1 = jsh0 + TILE; + int do_j = jk.vj != NULL; + int do_k = jk.vk != NULL; + + int count = 0; + float tile_q_ij = tile_q_cond[tile_ij]; + for (int t_kl_id = t_kl0+t_id; t_kl_id < t_kl1; t_kl_id += threads) { + int tile_kl = tile_kl_mapping[t_kl_id]; + if (tile_q_ij + tile_q_cond[tile_kl] < cutoff) { + break; + } + int tile_k = tile_kl / nbas_tiles; + int tile_l = tile_kl % nbas_tiles; + int ksh0 = tile_k * TILE; + int lsh0 = tile_l * TILE; + int ksh1 = ksh0 + TILE; + int lsh1 = lsh0 + TILE; + for (int ish = ish0; ish < ish1; ++ish) { + for (int jsh = jsh0; jsh < MIN(ish+1, jsh1); ++jsh) { + int bas_ij = ish * nbas + jsh; + float q_ij = q_cond [bas_ij]; + float d_ij = dm_cond[bas_ij]; + for (int ksh = ksh0; ksh < MIN(ish+1, ksh1); ++ksh) { + float d_ik = dm_cond[ish*nbas+ksh]; + float d_jk = dm_cond[jsh*nbas+ksh]; + for (int lsh = lsh0; lsh < MIN(ksh+1, lsh1); ++lsh) { + int bas_kl = ksh * nbas + lsh; + if (bas_ij < bas_kl) { + continue; + } + float q_ijkl = q_ij + q_cond[bas_kl]; + if (q_ijkl < cutoff) { + continue; + } + float d_cutoff = cutoff - q_ijkl; + if ((do_k && (d_ik > d_cutoff || + d_jk > d_cutoff || + dm_cond[ish*nbas+lsh] > d_cutoff || + dm_cond[jsh*nbas+lsh] > d_cutoff)) || + (do_j && (d_ij > d_cutoff || + dm_cond[bas_kl ] > d_cutoff))) { + ++count; + } + } + } + } + } + } + + // https://developer.nvidia.com/gpugems/gpugems3/part-vi-gpu-computing/chapter-39-parallel-prefix-sum-scan-cuda + extern __shared__ int thread_offsets[]; + thread_offsets[t_id] = count; + // Up-sweep phase + for (int stride = 1; stride < threads; stride *= 2) { + __syncthreads(); + int index = (t_id + 1) * stride * 2 - 1; + if (index < threads) { + thread_offsets[index] += thread_offsets[index-stride]; + } + } + __syncthreads(); + if (t_id == threads-1) { thread_offsets[threads-1] = 0; } + // Down-sweep phase + for (int stride = threads/2; stride > 0; stride /= 2) { + __syncthreads(); + int index = (t_id + 1) * stride * 2 - 1; + if (index < threads) { + int temp = thread_offsets[index - stride]; + thread_offsets[index - stride] = thread_offsets[index]; + thread_offsets[index] += temp; + } + } + __syncthreads(); + __shared__ int ntasks; + if (t_id == threads-1) { + ntasks = thread_offsets[threads-1] + count; + } + __syncthreads(); + if (ntasks == 0) { + return ntasks; + } + + int offset = thread_offsets[t_id]; + for (int t_kl_id = t_kl0+t_id; t_kl_id < t_kl1; t_kl_id += threads) { + int tile_kl = tile_kl_mapping[t_kl_id]; + if (tile_q_ij + tile_q_cond[tile_kl] < cutoff) { + break; + } + int tile_k = tile_kl / nbas_tiles; + int tile_l = tile_kl % nbas_tiles; + int ksh0 = tile_k * TILE; + int lsh0 = tile_l * TILE; + int ksh1 = ksh0 + TILE; + int lsh1 = lsh0 + TILE; + ShellQuartet sq; + for (int ish = ish0; ish < ish1; ++ish) { + for (int jsh = jsh0; jsh < MIN(ish+1, jsh1); ++jsh) { + int bas_ij = ish * nbas + jsh; + float q_ij = q_cond [bas_ij]; + float d_ij = dm_cond[bas_ij]; + sq.i = ish; + sq.j = jsh; + for (int ksh = ksh0; ksh < MIN(ish+1, ksh1); ++ksh) { + float d_ik = dm_cond[ish*nbas+ksh]; + float d_jk = dm_cond[jsh*nbas+ksh]; + for (int lsh = lsh0; lsh < MIN(ksh+1, lsh1); ++lsh) { + int bas_kl = ksh * nbas + lsh; + if (bas_ij < bas_kl) { + continue; + } + float q_ijkl = q_ij + q_cond[bas_kl]; + if (q_ijkl < cutoff) { + continue; + } + float d_cutoff = cutoff - q_ijkl; + if ((do_k && (d_ik > d_cutoff || + d_jk > d_cutoff || + dm_cond[ish*nbas+lsh] > d_cutoff || + dm_cond[jsh*nbas+lsh] > d_cutoff)) || + (do_j && (d_ij > d_cutoff || + dm_cond[bas_kl ] > d_cutoff))) { + sq.k = ksh; + sq.l = lsh; + shl_quartet_idx[offset] = sq; + ++offset; + } + } + } + } + } + } + return ntasks; +} + +__device__ +static int _fill_sr_jk_tasks(ShellQuartet *shl_quartet_idx, + RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + int batch_ij, int batch_kl) +{ + int nbas = envs.nbas; + int *tile_ij_mapping = bounds.tile_ij_mapping; + int *tile_kl_mapping = bounds.tile_kl_mapping; + float *q_cond = bounds.q_cond; +#if TILE == 1 + float *tile_q_cond = q_cond; +#else + float *tile_q_cond = q_cond + nbas*nbas; +#endif + int nbas_tiles = nbas / TILE; + // TODO: implement q_ijij_cond + float *s_estimator = tile_q_cond + nbas_tiles*nbas_tiles; + float *dm_cond = bounds.dm_cond; + float cutoff = bounds.cutoff; + int t_id = threadIdx.y * blockDim.x + threadIdx.x; + int t_kl0 = batch_kl * TILES_IN_BATCH; + int t_kl1 = MIN(t_kl0 + TILES_IN_BATCH, bounds.ntile_kl_pairs); + int threads = blockDim.x * blockDim.y; + + int tile_ij = tile_ij_mapping[batch_ij]; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + int ish1 = ish0 + TILE; + int jsh1 = jsh0 + TILE; + int do_j = jk.vj != NULL; + int do_k = jk.vk != NULL; + + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *bas = envs.bas; + double *env = envs.env; + float omega = env[PTR_RANGE_OMEGA]; + float omega2 = omega * omega; + + int count = 0; + float tile_q_ij = tile_q_cond[tile_ij]; + for (int t_kl_id = t_kl0+t_id; t_kl_id < t_kl1; t_kl_id += threads) { + int tile_kl = tile_kl_mapping[t_kl_id]; + if (tile_q_ij + tile_q_cond[tile_kl] < cutoff) { + break; + } + int tile_k = tile_kl / nbas_tiles; + int tile_l = tile_kl % nbas_tiles; + int ksh0 = tile_k * TILE; + int lsh0 = tile_l * TILE; + int ksh1 = ksh0 + TILE; + int lsh1 = lsh0 + TILE; + for (int ish = ish0; ish < ish1; ++ish) { + for (int jsh = jsh0; jsh < MIN(ish+1, jsh1); ++jsh) { + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + float ai = expi[iprim-1]; + float aj = expj[jprim-1]; + float aij = ai + aj; + float aj_aij = aj / aij; + float xi = ri[0]; + float yi = ri[1]; + float zi = ri[2]; + float xj = rj[0]; + float yj = rj[1]; + float zj = rj[2]; + float xjxi = xj - xi; + float yjyi = yj - yi; + float zjzi = zj - zi; + float xpa = xjxi * aj_aij; + float ypa = yjyi * aj_aij; + float zpa = zjzi * aj_aij; + float xij = xi + xpa; + float yij = yi + ypa; + float zij = zi + zpa; + int bas_ij = ish * nbas + jsh; + float q_ij = q_cond [bas_ij]; + float d_ij = dm_cond[bas_ij]; + float skl_cutoff = cutoff - s_estimator[bas_ij]; + for (int ksh = ksh0; ksh < MIN(ish+1, ksh1); ++ksh) { + float d_ik = dm_cond[ish*nbas+ksh]; + float d_jk = dm_cond[jsh*nbas+ksh]; + for (int lsh = lsh0; lsh < MIN(ksh+1, lsh1); ++lsh) { + int bas_kl = ksh * nbas + lsh; + if (bas_ij < bas_kl) { + continue; + } + float q_ijkl = q_ij + q_cond[bas_kl]; + if (q_ijkl < cutoff) { + continue; + } + float d_cutoff = cutoff - q_ijkl; + if ((do_k && (d_ik > d_cutoff || + d_jk > d_cutoff || + dm_cond[ish*nbas+lsh] > d_cutoff || + dm_cond[jsh*nbas+lsh] > d_cutoff)) || + (do_j && (d_ij > d_cutoff || + dm_cond[bas_kl ] > d_cutoff))) { + + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + float ak = expk[kprim-1]; + float al = expl[lprim-1]; + float akl = ak + al; + float al_akl = al / akl; + float xk = rk[0]; + float yk = rk[1]; + float zk = rk[2]; + float xl = rl[0]; + float yl = rl[1]; + float zl = rl[2]; + float xlxk = xl - xk; + float ylyk = yl - yk; + float zlzk = zl - zk; + float xqc = xlxk * al_akl; + float yqc = ylyk * al_akl; + float zqc = zlzk * al_akl; + float xkl = xk + xqc; + float ykl = yk + yqc; + float zkl = zk + zqc; + float theta = 1./(1./aij+1./akl+1./omega2); + float xpq = xij - xkl; + float ypq = yij - ykl; + float zpq = zij - zkl; + float rr = xpq*xpq + ypq*ypq + zpq*zpq; + float theta_rr = logf(rr + 1e-30f) + theta * rr; + d_cutoff = skl_cutoff - s_estimator[bas_kl] + theta_rr; + if (d_cutoff > 0) { + continue; + } + if ((do_k && (d_ik > d_cutoff || + d_jk > d_cutoff || + dm_cond[ish*nbas+lsh] > d_cutoff || + dm_cond[jsh*nbas+lsh] > d_cutoff)) || + (do_j && (d_ij > d_cutoff || + dm_cond[bas_kl ] > d_cutoff))) { + ++count; + } + } + } + } + } + } + } + + // https://developer.nvidia.com/gpugems/gpugems3/part-vi-gpu-computing/chapter-39-parallel-prefix-sum-scan-cuda + extern __shared__ int thread_offsets[]; + thread_offsets[t_id] = count; + // Up-sweep phase + for (int stride = 1; stride < threads; stride *= 2) { + __syncthreads(); + int index = (t_id + 1) * stride * 2 - 1; + if (index < threads) { + thread_offsets[index] += thread_offsets[index-stride]; + } + } + __syncthreads(); + if (t_id == threads-1) { thread_offsets[threads-1] = 0; } + // Down-sweep phase + for (int stride = threads/2; stride > 0; stride /= 2) { + __syncthreads(); + int index = (t_id + 1) * stride * 2 - 1; + if (index < threads) { + int temp = thread_offsets[index - stride]; + thread_offsets[index - stride] = thread_offsets[index]; + thread_offsets[index] += temp; + } + } + __syncthreads(); + __shared__ int ntasks; + if (t_id == threads-1) { + ntasks = thread_offsets[threads-1] + count; + } + __syncthreads(); + if (ntasks == 0) { + return ntasks; + } + + int offset = thread_offsets[t_id]; + for (int t_kl_id = t_kl0+t_id; t_kl_id < t_kl1; t_kl_id += threads) { + int tile_kl = tile_kl_mapping[t_kl_id]; + if (tile_q_ij + tile_q_cond[tile_kl] < cutoff) { + break; + } + int tile_k = tile_kl / nbas_tiles; + int tile_l = tile_kl % nbas_tiles; + int ksh0 = tile_k * TILE; + int lsh0 = tile_l * TILE; + int ksh1 = ksh0 + TILE; + int lsh1 = lsh0 + TILE; + ShellQuartet sq; + for (int ish = ish0; ish < ish1; ++ish) { + for (int jsh = jsh0; jsh < MIN(ish+1, jsh1); ++jsh) { + sq.i = ish; + sq.j = jsh; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + float ai = expi[iprim-1]; + float aj = expj[jprim-1]; + float aij = ai + aj; + float aj_aij = aj / aij; + float xi = ri[0]; + float yi = ri[1]; + float zi = ri[2]; + float xj = rj[0]; + float yj = rj[1]; + float zj = rj[2]; + float xjxi = xj - xi; + float yjyi = yj - yi; + float zjzi = zj - zi; + float xpa = xjxi * aj_aij; + float ypa = yjyi * aj_aij; + float zpa = zjzi * aj_aij; + float xij = xi + xpa; + float yij = yi + ypa; + float zij = zi + zpa; + int bas_ij = ish * nbas + jsh; + float q_ij = q_cond [bas_ij]; + float d_ij = dm_cond[bas_ij]; + float skl_cutoff = cutoff - s_estimator[bas_ij]; + for (int ksh = ksh0; ksh < MIN(ish+1, ksh1); ++ksh) { + float d_ik = dm_cond[ish*nbas+ksh]; + float d_jk = dm_cond[jsh*nbas+ksh]; + for (int lsh = lsh0; lsh < MIN(ksh+1, lsh1); ++lsh) { + int bas_kl = ksh * nbas + lsh; + if (bas_ij < bas_kl) { + continue; + } + float q_ijkl = q_ij + q_cond[bas_kl]; + if (q_ijkl < cutoff) { + continue; + } + float d_cutoff = cutoff - q_ijkl; + if ((do_k && (d_ik > d_cutoff || + d_jk > d_cutoff || + dm_cond[ish*nbas+lsh] > d_cutoff || + dm_cond[jsh*nbas+lsh] > d_cutoff)) || + (do_j && (d_ij > d_cutoff || + dm_cond[bas_kl ] > d_cutoff))) { + + // TODO: cache in shared memory + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + float ak = expk[kprim-1]; + float al = expl[lprim-1]; + float akl = ak + al; + float al_akl = al / akl; + float xk = rk[0]; + float yk = rk[1]; + float zk = rk[2]; + float xl = rl[0]; + float yl = rl[1]; + float zl = rl[2]; + float xlxk = xl - xk; + float ylyk = yl - yk; + float zlzk = zl - zk; + float xqc = xlxk * al_akl; + float yqc = ylyk * al_akl; + float zqc = zlzk * al_akl; + float xkl = xk + xqc; + float ykl = yk + yqc; + float zkl = zk + zqc; + float theta = 1./(1./aij+1./akl+1./omega2); + float xpq = xij - xkl; + float ypq = yij - ykl; + float zpq = zij - zkl; + float rr = xpq*xpq + ypq*ypq + zpq*zpq; + float theta_rr = logf(rr + 1e-30f) + theta * rr; + d_cutoff = skl_cutoff - s_estimator[bas_kl] + theta_rr; + if (d_cutoff > 0) { + continue; + } + if ((do_k && (d_ik > d_cutoff || + d_jk > d_cutoff || + dm_cond[ish*nbas+lsh] > d_cutoff || + dm_cond[jsh*nbas+lsh] > d_cutoff)) || + (do_j && (d_ij > d_cutoff || + dm_cond[bas_kl ] > d_cutoff))) { + sq.k = ksh; + sq.l = lsh; + shl_quartet_idx[offset] = sq; + ++offset; + } + } + } + } + } + } + } + return ntasks; +} diff --git a/gpu4pyscf/lib/gvhf-rys/gamma_inc.cu b/gpu4pyscf/lib/gvhf-rys/gamma_inc.cu new file mode 100644 index 00000000..3953c63b --- /dev/null +++ b/gpu4pyscf/lib/gvhf-rys/gamma_inc.cu @@ -0,0 +1,50 @@ +#include +#define LSUM_MAX (LMAX*4) +#define EPS_FLOAT64 DBL_EPSILON +#define SQRTPIE4 .886226925452758013 + +__device__ +static void eval_gamma_inc_fn(double *f, double t, int m) +{ + int sq_id = threadIdx.x; + int block_size = blockDim.x; + if (t < EPS_FLOAT64) { + f[sq_id] = 1.; + for (int i = 1; i <= m; i++) { + f[sq_id + i*block_size] = 1./(2*i+1); + } + } else if (m > 0 && t < m*.5+.5) { + double bi = m + .5; + double e = .5 * exp(-t); + double x = e; + double s = e; + double tol = EPS_FLOAT64 * e; + while (x > tol) { + bi += 1.; + x *= t / bi; + s += x; + } + double b = m + 0.5; + double fval = s / b; + f[sq_id + m*block_size] = fval; + for (int i = m-1; i >= 0; i--) { + b -= 1.; + fval = (e + t * fval) / b; + f[sq_id + i*block_size] = fval; + } + } else { + double tt = sqrt(t); + double fval = SQRTPIE4 / tt * erf(tt); + f[sq_id] = fval; + if (m > 0) { + double e = .5 * exp(-t); + double b = 1. / t; + double b1 = .5; + for (int i = 1; i <= m; i++) { + fval = b * (b1 * fval - e); + f[sq_id + i*block_size] = fval; + b1 += 1.; + } + } + } +} diff --git a/gpu4pyscf/lib/gvhf-rys/gamma_inc_unrolled.cu b/gpu4pyscf/lib/gvhf-rys/gamma_inc_unrolled.cu new file mode 100644 index 00000000..17c8c570 --- /dev/null +++ b/gpu4pyscf/lib/gvhf-rys/gamma_inc_unrolled.cu @@ -0,0 +1,50 @@ +#include +#define LSUM_MAX (LMAX*4) +#define EPS_FLOAT64 DBL_EPSILON +#define SQRTPIE4 .886226925452758013 + +__device__ +static void eval_gamma_inc_fn(double *f, double t, int m) +{ + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + int block_size = blockDim.x * blockDim.y; + if (t < EPS_FLOAT64) { + f[t_id] = 1.; + for (int i = 1; i <= m; i++) { + f[t_id + i*block_size] = 1./(2*i+1); + } + } else if (m > 0 && t < m*.5+.5) { + double bi = m + .5; + double e = .5 * exp(-t); + double x = e; + double s = e; + double tol = EPS_FLOAT64 * e; + while (x > tol) { + bi += 1.; + x *= t / bi; + s += x; + } + double b = m + 0.5; + double fval = s / b; + f[t_id + m*block_size] = fval; + for (int i = m-1; i >= 0; i--) { + b -= 1.; + fval = (e + t * fval) / b; + f[t_id + i*block_size] = fval; + } + } else { + double tt = sqrt(t); + double fval = SQRTPIE4 / tt * erf(tt); + f[t_id] = fval; + if (m > 0) { + double e = .5 * exp(-t); + double b = 1. / t; + double b1 = .5; + for (int i = 1; i <= m; i++) { + fval = b * (b1 * fval - e); + f[t_id + i*block_size] = fval; + b1 += 1.; + } + } + } +} diff --git a/gpu4pyscf/lib/gvhf-rys/nr_sr_estimator.c b/gpu4pyscf/lib/gvhf-rys/nr_sr_estimator.c new file mode 100644 index 00000000..cb662f59 --- /dev/null +++ b/gpu4pyscf/lib/gvhf-rys/nr_sr_estimator.c @@ -0,0 +1,83 @@ +#include +#include +#include +#include +#include "vhf.cuh" + +// sqrt(-log(1e-9)) +#define R_GUESS_FAC 4.5f + +void sr_eri_s_estimator(float *s_estimator, float omega, + int *atm, int natm, int *bas, int nbas, double *env) +{ + float *exps = malloc(sizeof(float) * nbas * 5); + float *cs = exps + nbas; + float *rx = cs + nbas; + float *ry = rx + nbas; + float *rz = ry + nbas; + + for (int n = 0; n < nbas; n++) { + int ia = bas[ATOM_OF+n*BAS_SLOTS]; + int nprim = bas[NPRIM_OF+n*BAS_SLOTS]; + int nctr = bas[NCTR_OF+n*BAS_SLOTS]; + int ptr_coord = atm[PTR_COORD+ia*ATM_SLOTS]; + int ptr_coeff = bas[PTR_COEFF+n*BAS_SLOTS]; + exps[n] = env[bas[PTR_EXP+n*BAS_SLOTS] + nprim-1]; + rx[n] = env[ptr_coord+0]; + ry[n] = env[ptr_coord+1]; + rz[n] = env[ptr_coord+2]; + + float c_max = fabs(env[ptr_coeff + nprim-1]); + for (int m = 1; m < nctr; m++) { + float c1 = fabs(env[ptr_coeff + (m+1)*nprim-1]); + c_max = MAX(c_max, c1); + } + cs[n] = c_max; + } + float omega2 = omega * omega; + +#pragma omp parallel +{ + float fac_guess = .5f - logf(omega2)/4; + int ish, jsh, li, lj; + float ai, aj, aij, ai_aij, a1, ci, cj; + float xi, yi, zi, xj, yj, zj; + float dx, dy, dz, r2, v, log_fac, r_guess, theta, theta_r; +#pragma omp for schedule(dynamic, 1) + for (ish = 0; ish < nbas; ish++) { + li = bas[ANG_OF+ish*BAS_SLOTS]; + ai = exps[ish]; + ci = cs[ish]; + xi = rx[ish]; + yi = ry[ish]; + zi = rz[ish]; +#pragma GCC ivdep + for (jsh = 0; jsh <= ish; jsh++) { + lj = bas[ANG_OF+jsh*BAS_SLOTS]; + aj = exps[jsh]; + cj = cs[jsh]; + xj = rx[jsh]; + yj = ry[jsh]; + zj = rz[jsh]; + dx = xj - xi; + dy = yj - yi; + dz = zj - zi; + aij = ai + aj; + ai_aij = ai / aij; + a1 = ai_aij * aj; + + theta = omega2/(omega2+aij); + r_guess = R_GUESS_FAC / sqrtf(aij * theta); + theta_r = theta * r_guess; + // log(ci*cj * ((2*li+1)*(2*lj+1))**.5/(4*pi) * (pi/aij)**1.5) + log_fac = logf(ci*cj * sqrtf((2*li+1.f)*(2*lj+1.f))/(4*M_PI)) + + 1.5f*logf(M_PI/aij) + fac_guess; + r2 = dx * dx + dy * dy + dz * dz; + v = (li+lj)*logf(MAX(theta_r, 1.f)) - a1*r2 + log_fac; + s_estimator[ish*nbas+jsh] = v; + s_estimator[jsh*nbas+ish] = v; + } + } +} + free(exps); +} diff --git a/gpu4pyscf/lib/gvhf-rys/rys_contract_j.cu b/gpu4pyscf/lib/gvhf-rys/rys_contract_j.cu new file mode 100644 index 00000000..5e8c3723 --- /dev/null +++ b/gpu4pyscf/lib/gvhf-rys/rys_contract_j.cu @@ -0,0 +1,769 @@ +#include +#include +#include +#include +#include + +#include "vhf.cuh" +#include "rys_roots.cu" +#include "create_tasks.cu" + +__device__ +static void rys_j_general(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, + int ish0, int jsh0) +{ + // sq is short for shl_quartet + int sq_id = threadIdx.x; + int nsq_per_block = blockDim.x; + int gout_id = threadIdx.y; + int gout_stride = blockDim.y; + int t_id = threadIdx.y * blockDim.x + threadIdx.x; + int threads = blockDim.x * blockDim.y; + int li = bounds.li; + int lj = bounds.lj; + int lk = bounds.lk; + int ll = bounds.ll; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int lij = li + lj; + int lkl = lk + ll; + int lkl1 = lkl + 1; + int nroots = bounds.nroots; + int stride_k = bounds.stride_k; + int g_size = stride_k * lkl1; + int *bas = envs.bas; + int *pair_loc = envs.ao_loc; + int nbas = envs.nbas; + double *env = envs.env; + double *dm = jk.dm; + double *vj = jk.vj; + int nf_ij = (lij+1)*(lij+2)/2; + int nf_kl = (lkl+1)*(lkl+2)/2; + int nf3ij = nf_ij*(lij+3)/3; + int nf3kl = nf_kl*(lkl+3)/3; + int ij_fold2idx_cum = lij*(lij+1)*(lij+2)/6; + int kl_fold2idx_cum = lkl*(lkl+1)*(lkl+2)/6; + int ij_fold3idx_cum = ij_fold2idx_cum*(lij+3)/4; + int kl_fold3idx_cum = kl_fold2idx_cum*(lkl+3)/4; + Fold2Index *ij_fold2idx = c_i_in_fold2idx + ij_fold2idx_cum; + Fold2Index *kl_fold2idx = c_i_in_fold2idx + kl_fold2idx_cum; + Fold3Index *ij_fold3idx = c_i_in_fold3idx + ij_fold3idx_cum; + Fold3Index *kl_fold3idx = c_i_in_fold3idx + kl_fold3idx_cum; + + extern __shared__ double rw[]; + double *g = rw + nsq_per_block * nroots*2; + double *Rpa_cicj = g + nsq_per_block * g_size*3; + double *dm_ij_cache = Rpa_cicj + iprim*jprim*4*nsq_per_block; + double *vj_ij = dm_ij_cache + nf3ij*TILE2; + double *dm_kl = vj_ij + nf3ij*nsq_per_block; + double *vj_kl = dm_kl + nf3kl*nsq_per_block; + double *buf1 = vj_kl + nf3kl*nsq_per_block; + double *buf2 = buf1 + ((lij+1)*(lkl+1)*(MAX(lij,lkl)+2)/2)*nsq_per_block; + double Rqc[3], Rpq[3]; + + for (int n = t_id; n < nf3ij*TILE2; n += threads) { + int m = n / TILE2; + int ij_sh = n % TILE2; + int ish = ish0 + ij_sh / TILE; + int jsh = jsh0 + ij_sh % TILE; + int ij_pair0 = pair_loc[ish*nbas+jsh]; + dm_ij_cache[ij_sh+m*TILE2] = dm[ij_pair0+m]; + } + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int ij_pair0 = pair_loc[ish*nbas+jsh]; + int kl_pair0 = pair_loc[ksh*nbas+lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + for (int ij = gout_id; ij < iprim*jprim; ij += gout_stride) { + int ip = ij / jprim; + int jp = ij % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ij*4*nsq_per_block; + Rpa[sq_id+0*nsq_per_block] = xjxi * aj_aij; + Rpa[sq_id+1*nsq_per_block] = yjyi * aj_aij; + Rpa[sq_id+2*nsq_per_block] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sq_id+3*nsq_per_block] = fac_sym * ci[ip] * cj[jp] * Kab; + } + + for (int n = gout_id; n < nf3ij; n+=gout_stride) { + vj_ij[sq_id+n*nsq_per_block] = 0; + } + for (int n = gout_id; n < nf3kl; n+=gout_stride) { + dm_kl[sq_id+n*nsq_per_block] = dm[kl_pair0+n]; + vj_kl[sq_id+n*nsq_per_block] = 0; + } + + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + Rqc[0] = xlxk * al_akl; // (ak*xk+al*xl)/akl + Rqc[1] = ylyk * al_akl; + Rqc[2] = zlzk * al_akl; + __syncthreads(); + if (gout_id == 0) { + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = ck[kp] * cl[lp] * Kcd; + g[sq_id] = ckcl; + } + int ijprim = iprim * jprim; + for (int ijp = 0; ijp < ijprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp*4*nsq_per_block; + double xij = ri[0] + Rpa[sq_id+0*nsq_per_block]; + double yij = ri[1] + Rpa[sq_id+1*nsq_per_block]; + double zij = ri[2] + Rpa[sq_id+2*nsq_per_block]; + double xkl = rk[0] + Rqc[0]; + double ykl = rk[1] + Rqc[1]; + double zkl = rk[2] + Rqc[2]; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + Rpq[0] = xpq; + Rpq[1] = ypq; + Rpq[2] = zpq; + __syncthreads(); + if (gout_id == 0) { + double cicj = Rpa[sq_id+3*nsq_per_block]; + g[sq_id + g_size * nsq_per_block] = cicj / (aij*akl*sqrt(aij+akl)); + } + double rr = xpq*xpq + ypq*ypq + zpq*zpq; + double theta = aij * akl / (aij + akl); + rys_roots(nroots, theta*rr, rw); + double s0x, s1x, s2x; + for (int irys = 0; irys < nroots; ++irys) { + __syncthreads(); + if (gout_id == 0) { + g[sq_id + 2*g_size*nsq_per_block] = rw[sq_id+(irys*2+1)*nsq_per_block]; + } + double rt = rw[sq_id + irys*2*nsq_per_block]; + double rt_aa = rt / (aij + akl); + double rt_aij = rt_aa * akl; + double rt_akl = rt_aa * aij; + double b00 = .5 * rt_aa; + double b10 = .5/aij * (1 - rt_aij); + double b01 = .5/akl * (1 - rt_akl); + + // TRR + //for i in range(lij): + // trr(i+1,0) = c0 * trr(i,0) + i*b10 * trr(i-1,0) + //for k in range(lkl): + // for i in range(lij+1): + // trr(i,k+1) = c0p * trr(i,k) + k*b01 * trr(i,k-1) + i*b00 * trr(i-1,k) + if (lij > 0) { + __syncthreads(); + // gx(0,n+1) = c0*gx(0,n) + n*b10*gx(0,n-1) + for (int n = gout_id; n < 3; n += gout_stride) { + double *_gx = g + n * g_size * nsq_per_block; + int ir = sq_id + n * nsq_per_block; + double c0x = Rpa[ir] - rt_aij * Rpq[n]; + s0x = _gx[sq_id]; + s1x = c0x * s0x; + _gx[sq_id + nsq_per_block] = s1x; + for (int i = 1; i < lij; ++i) { + s2x = c0x * s1x + i * b10 * s0x; + _gx[sq_id + (i+1)*nsq_per_block] = s2x; + s0x = s1x; + s1x = s2x; + } + } + } + + if (lkl > 0) { + int lij3 = (lij+1)*3; + for (int n = gout_id; n < lij3+gout_id; n += gout_stride) { + __syncthreads(); + int i = n / 3; //for i in range(lij+1): + int _ix = n % 3; + double *_gx = g + (i + _ix * g_size) * nsq_per_block; + double cpx = Rqc[_ix] + rt_akl * Rpq[_ix]; + if (n < lij3) { + s0x = _gx[sq_id]; + s1x = cpx * s0x; + if (i > 0) { + s1x += i * b00 * _gx[sq_id-nsq_per_block]; + } + _gx[sq_id + stride_k*nsq_per_block] = s1x; + } + + for (int k = 1; k < lkl; ++k) { + __syncthreads(); + if (n < lij3) { + s2x = cpx*s1x + k*b01*s0x; + if (i > 0) { + s2x += i * b00 * _gx[sq_id + (k*stride_k-1)*nsq_per_block]; + } + _gx[sq_id + (k*stride_k+stride_k)*nsq_per_block] = s2x; + s0x = s1x; + s1x = s2x; + } + } + } + } + + __syncthreads(); + double *gx = g; + double *gy = gx + nsq_per_block * g_size; + double *gz = gy + nsq_per_block * g_size; + + //for (int ix = 0, ixy = 0, i3xy = 0; ix <= lij; ++ix) { + //for (int iy = 0; iy <= lij-ix; ++iy, ++ixy) { + // for (int kz = 0; kz <= lkl; ++kz) { + // double val = 0; + // for (int iz = 0; iz <= lij-ix-iy; ++iz) { + // val += gz[sq_id + (iz+stride_k*kz)*nsq_per_block] * + // dm_ij[sq_id + (i3xy+iz)*nsq_per_block]; + // } + // buf1[sq_id + (kz*nf_ij+ixy)*nsq_per_block] = val; + // } + // i3xy += lij-ix-iy; + //} } + for (int n = gout_id; n < nf_ij*(lkl+1); n+=gout_stride) { + int ixy = n % nf_ij; + int kz = n / nf_ij; + Fold2Index f2i = ij_fold2idx[ixy]; + int ix = f2i.x; + int iy = f2i.y; + int i3xy = f2i.fold3offset; + double val = 0; + for (int iz = 0; iz <= lij-ix-iy; ++iz) { + val += gz[sq_id + (iz+stride_k*kz)*nsq_per_block] * + dm_ij_cache[sh_ij+ (i3xy+iz)*TILE2]; + } + buf1[sq_id + n*nsq_per_block] = val; + } + + __syncthreads(); + //for (int ky = 0, jyz = 0; ky <= lkl; ++ky) { + //for (int kz = 0; kz <= lkl-ky; ++kz, ++jyz) { + //for (int ix = 0, ixy = 0; ix <= lij; ++ix) { + // double val = 0; + // for (int iy = 0; iy <= lij-ix; ++iy, ++ixy) { + // val += gy[sq_id + (iy+stride_k*ky)*nsq_per_block] * + // buf1[sq_id + (kz*nf_ij+ixy)*nsq_per_block]; + // } + // buf2[sq_id + (ix*nf_kl+jyz)*nsq_per_block] = val; + //} } } + for (int n = gout_id; n < nf_kl*(lij+1); n+=gout_stride) { + int jyz = n % nf_kl; + int ix = n / nf_kl; + Fold2Index f2i = kl_fold2idx[jyz]; + int ixy = nf_ij-(lij-ix+1)*(lij-ix+2)/2; + int ky = f2i.x; + int kz = f2i.y; + double val = 0; + for (int iy = 0; iy <= lij-ix; ++iy, ++ixy) { + val += gy[sq_id + (iy+stride_k*ky)*nsq_per_block] * + buf1[sq_id + (kz*nf_ij+ixy)*nsq_per_block]; + } + buf2[sq_id + n*nsq_per_block] = val; + } + + __syncthreads(); + //for (int kx = 0, jxyz = 0; kx <= lkl; ++kx) { + //for (int ky = 0, jyz = 0; ky <= lkl-kx; ++ky) { + //for (int kz = 0; kz <= lkl-kx-ky; ++kz, ++jyz, ++jxyz) { + // double val = 0; + // for (int ix = 0; ix <= lij; ++ix) { + // val += gx[sq_id + (ix+stride_k*kx)*nsq_per_block] * + // buf2[sq_id + (ix*nf_kl+jyz)*nsq_per_block]; + // } + // vj_kl[sq_id + jxyz*nsq_per_block] += val; + //} } } + for (int jxyz = gout_id; jxyz < nf3kl; jxyz+=gout_stride) { + Fold3Index f3i = kl_fold3idx[jxyz]; + int kx = f3i.x; + int jyz = f3i.fold2yz; + double val = 0; + for (int ix = 0; ix <= lij; ++ix) { + val += gx[sq_id + (ix+stride_k*kx)*nsq_per_block] * + buf2[sq_id + (ix*nf_kl+jyz)*nsq_per_block]; + } + vj_kl[sq_id + jxyz*nsq_per_block] += val; + } + + //for (int kx = 0, jxy = 0, j3xy = 0; kx <= lkl; ++kx) { + //for (int ky = 0; ky <= lkl-kx; ++ky, ++jxy) { + // for (int iz = 0; iz <= lij; ++iz) { + // double val = 0; + // for (int kz = 0; kz <= lkl-kx-ky; ++kz) { + // val += gz[sq_id + (iz+stride_k*kz)*nsq_per_block] * + // dm_kl[sq_id + (j3xy+kz)*nsq_per_block]; + // } + // buf1[sq_id + (iz*nf_kl+jxy)*nsq_per_block] = val; + // } + // j3xy += lkl-kx-ky; + //} } + for (int n = gout_id; n < nf_kl*(lij+1); n+=gout_stride) { + int jxy = n % nf_kl; + int iz = n / nf_kl; + Fold2Index f2i = kl_fold2idx[jxy]; + int kx = f2i.x; + int ky = f2i.y; + int j3xy = f2i.fold3offset; + double val = 0; + for (int kz = 0; kz <= lkl-kx-ky; ++kz) { + val += gz[sq_id + (iz+stride_k*kz)*nsq_per_block] * + dm_kl[sq_id + (j3xy+kz)*nsq_per_block]; + } + buf1[sq_id + n*nsq_per_block] = val; + } + + __syncthreads(); + //for (int iy = 0, iyz = 0; iy <= lij; ++iy) { + //for (int iz = 0; iz <= lij-iy; ++iz, ++iyz) { + //for (int kx = 0, jxy = 0; kx <= lkl; ++kx) { + // double val = 0; + // for (int ky = 0; ky <= lkl-kx; ++ky, ++jxy) { + // val += gy[sq_id + (iy+stride_k*ky)*nsq_per_block] * + // buf1[sq_id + (iz*nf_kl+jxy)*nsq_per_block]; + // } + // buf2[sq_id + (kx*nf_ij+iyz)*nsq_per_block] = val; + //} } } + for (int n = gout_id; n < nf_ij*(lkl+1); n+=gout_stride) { + int iyz = n % nf_ij; + int kx = n / nf_ij; + Fold2Index f2i = ij_fold2idx[iyz]; + int jxy = nf_kl-(lkl-kx+1)*(lkl-kx+2)/2; + int iy = f2i.x; + int iz = f2i.y; + double val = 0; + for (int ky = 0; ky <= lkl-kx; ++ky, ++jxy) { + val += gy[sq_id + (iy+stride_k*ky)*nsq_per_block] * + buf1[sq_id + (iz*nf_kl+jxy)*nsq_per_block]; + } + buf2[sq_id + n*nsq_per_block] = val; + } + + __syncthreads(); + //for (int ix = 0, ixyz = 0; ix <= lij; ++ix) { + //for (int iy = 0, iyz = 0; iy <= lij-ix; ++iy) { // TODO: fuse iy-iz loop + //for (int iz = 0; iz <= lij-ix-iy; ++iz, ++iyz, ++ixyz) { + // double val = 0; + // for (int kx = 0; kx <= lkl; ++kx) { + // val += gx[sq_id + (ix+stride_k*kx)*nsq_per_block] * + // buf2[sq_id + (kx*nf_ij+iyz)*nsq_per_block]; + // } + // vj_ij[sq_id + ixyz*nsq_per_block] += val; + //} } } + for (int ixyz = gout_id; ixyz < nf3ij; ixyz+=gout_stride) { + Fold3Index f3i = ij_fold3idx[ixyz]; + int ix = f3i.x; + int iyz = f3i.fold2yz; + double val = 0; + for (int kx = 0; kx <= lkl; ++kx) { + val += gx[sq_id + (ix+stride_k*kx)*nsq_per_block] * + buf2[sq_id + (kx*nf_ij+iyz)*nsq_per_block]; + } + vj_ij[sq_id + ixyz*nsq_per_block] += val; + } + } + } + } + __syncthreads(); + if (task_id >= ntasks) { + continue; + } + for (int n = gout_id; n < nf3ij; n+=gout_stride) { + atomicAdd(vj+ij_pair0+n, vj_ij[sq_id+n*nsq_per_block]); + } + for (int n = gout_id; n < nf3kl; n+=gout_stride) { + atomicAdd(vj+kl_pair0+n, vj_kl[sq_id+n*nsq_per_block]); + } + } +} + +#if CUDA_VERSION >= 12040 +__global__ __maxnreg__(128) +#else +__global__ +#endif +void rys_j_kernel(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.y * blockDim.x + threadIdx.x; + int nbas = envs.nbas; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + rys_j_general(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + __syncthreads(); + } +} + +__device__ +static void rys_j_with_gout(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks) +{ + // sq is short for shl_quartet + int sq_id = threadIdx.x; + int nsq_per_block = blockDim.x; + int gout_id = threadIdx.y; + int gout_stride = blockDim.y; + int li = bounds.li; + int lj = bounds.lj; + int lk = bounds.lk; + int ll = bounds.ll; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int lij = li + lj; + int lkl = lk + ll; + int lkl1 = lkl + 1; + int nroots = bounds.nroots; + int stride_k = bounds.stride_k; + int g_size = stride_k * lkl1; + int *bas = envs.bas; + int *pair_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao_pairs = pair_loc[nbas*nbas]; + double *env = envs.env; + int nf3ij = (lij+1)*(lij+2)*(lij+3)/6; + int nf3kl = (lkl+1)*(lkl+2)*(lkl+3)/6; + int ij_fold3idx_cum = lij*nf3ij/4; + int kl_fold3idx_cum = lkl*nf3kl/4; + Fold3Index *ij_fold3idx = c_i_in_fold3idx + ij_fold3idx_cum; + Fold3Index *kl_fold3idx = c_i_in_fold3idx + kl_fold3idx_cum; + + extern __shared__ double rw[]; + double *g = rw + nsq_per_block * nroots*2; + double *Rpa_cicj = g + nsq_per_block * g_size*3; + double *gout = Rpa_cicj + iprim*jprim*4*nsq_per_block; + double Rqc[3], Rpq[3]; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int ij_pair0 = pair_loc[ish*nbas+jsh]; + int kl_pair0 = pair_loc[ksh*nbas+lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + for (int ij = gout_id; ij < iprim*jprim; ij += gout_stride) { + int ip = ij / jprim; + int jp = ij % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ij*4*nsq_per_block; + Rpa[sq_id+0*nsq_per_block] = xjxi * aj_aij; + Rpa[sq_id+1*nsq_per_block] = yjyi * aj_aij; + Rpa[sq_id+2*nsq_per_block] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sq_id+3*nsq_per_block] = fac_sym * ci[ip] * cj[jp] * Kab; + } + + for (int n = gout_id; n < nf3ij*nf3kl; n += gout_stride) { + gout[sq_id+n*nsq_per_block] = 0; + } + + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + Rqc[0] = xlxk * al_akl; // (ak*xk+al*xl)/akl + Rqc[1] = ylyk * al_akl; + Rqc[2] = zlzk * al_akl; + __syncthreads(); + if (gout_id == 0) { + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = ck[kp] * cl[lp] * Kcd; + g[sq_id] = ckcl; + } + int ijprim = iprim * jprim; + for (int ijp = 0; ijp < ijprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp*4*nsq_per_block; + double xij = ri[0] + Rpa[sq_id+0*nsq_per_block]; + double yij = ri[1] + Rpa[sq_id+1*nsq_per_block]; + double zij = ri[2] + Rpa[sq_id+2*nsq_per_block]; + double xkl = rk[0] + Rqc[0]; + double ykl = rk[1] + Rqc[1]; + double zkl = rk[2] + Rqc[2]; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + Rpq[0] = xpq; + Rpq[1] = ypq; + Rpq[2] = zpq; + __syncthreads(); + if (gout_id == 0) { + double cicj = Rpa[sq_id+3*nsq_per_block]; + g[sq_id + g_size * nsq_per_block] = cicj / (aij*akl*sqrt(aij+akl)); + } + double rr = xpq*xpq + ypq*ypq + zpq*zpq; + double theta = aij * akl / (aij + akl); + rys_roots(nroots, theta*rr, rw); + double s0x, s1x, s2x; + for (int irys = 0; irys < nroots; ++irys) { + __syncthreads(); + if (gout_id == 0) { + g[sq_id + 2*g_size*nsq_per_block] = rw[sq_id+(irys*2+1)*nsq_per_block]; + } + double rt = rw[sq_id + irys*2*nsq_per_block]; + double rt_aa = rt / (aij + akl); + double rt_aij = rt_aa * akl; + double rt_akl = rt_aa * aij; + double b00 = .5 * rt_aa; + double b10 = .5/aij * (1 - rt_aij); + double b01 = .5/akl * (1 - rt_akl); + + // TRR + //for i in range(lij): + // trr(i+1,0) = c0 * trr(i,0) + i*b10 * trr(i-1,0) + //for k in range(lkl): + // for i in range(lij+1): + // trr(i,k+1) = c0p * trr(i,k) + k*b01 * trr(i,k-1) + i*b00 * trr(i-1,k) + if (lij > 0) { + __syncthreads(); + // gx(0,n+1) = c0*gx(0,n) + n*b10*gx(0,n-1) + for (int n = gout_id; n < 3; n += gout_stride) { + double *_gx = g + n * g_size * nsq_per_block; + int ir = sq_id + n * nsq_per_block; + double c0x = Rpa[ir] - rt_aij * Rpq[n]; + s0x = _gx[sq_id]; + s1x = c0x * s0x; + _gx[sq_id + nsq_per_block] = s1x; + for (int i = 1; i < lij; ++i) { + s2x = c0x * s1x + i * b10 * s0x; + _gx[sq_id + (i+1)*nsq_per_block] = s2x; + s0x = s1x; + s1x = s2x; + } + } + } + + if (lkl > 0) { + int lij3 = (lij+1)*3; + for (int n = gout_id; n < lij3+gout_id; n += gout_stride) { + __syncthreads(); + int i = n / 3; //for i in range(lij+1): + int _ix = n % 3; + double *_gx = g + (i + _ix * g_size) * nsq_per_block; + double cpx = Rqc[_ix] + rt_akl * Rpq[_ix]; + if (n < lij3) { + s0x = _gx[sq_id]; + s1x = cpx * s0x; + if (i > 0) { + s1x += i * b00 * _gx[sq_id-nsq_per_block]; + } + _gx[sq_id + stride_k*nsq_per_block] = s1x; + } + + for (int k = 1; k < lkl; ++k) { + __syncthreads(); + if (n < lij3) { + s2x = cpx*s1x + k*b01*s0x; + if (i > 0) { + s2x += i * b00 * _gx[sq_id + (k*stride_k-1)*nsq_per_block]; + } + _gx[sq_id + (k*stride_k+stride_k)*nsq_per_block] = s2x; + s0x = s1x; + s1x = s2x; + } + } + } + } + + __syncthreads(); + double *gx = g; + double *gy = gx + nsq_per_block * g_size; + double *gz = gy + nsq_per_block * g_size; + for (int n = gout_id; n < nf3ij*nf3kl; n+=gout_stride) { + int i = n % nf3ij; + int k = n / nf3ij; + Fold3Index f3i = ij_fold3idx[i]; + Fold3Index f3k = kl_fold3idx[k]; + int ix = f3i.x; + int iy = f3i.y; + int iz = f3i.z; + int kx = f3k.x; + int ky = f3k.y; + int kz = f3k.z; + gout[sq_id+n*nsq_per_block] += + gx[sq_id + (ix+stride_k*kx)*nsq_per_block] * + gy[sq_id + (iy+stride_k*ky)*nsq_per_block] * + gz[sq_id + (iz+stride_k*kz)*nsq_per_block]; + } + } + } + } + __syncthreads(); + if (task_id >= ntasks) { + continue; + } + double *dm = jk.dm; + double *vj = jk.vj; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + for (int k = gout_id; k < nf3kl; k += gout_stride) { + double vj_kl = 0.; + for (int i = 0; i < nf3ij; ++i) { + vj_kl += dm[ij_pair0+i] * gout[sq_id+(i+k*nf3ij)*nsq_per_block]; + } + atomicAdd(vj+kl_pair0+k, vj_kl); + } + for (int i = gout_id; i < nf3ij; i += gout_stride) { + double vj_ij = 0.; + for (int k = 0; k < nf3kl; ++k) { + vj_ij += dm[kl_pair0+k] * gout[sq_id+(i+k*nf3ij)*nsq_per_block]; + } + atomicAdd(vj+ij_pair0+i, vj_ij); + } + vj += nao_pairs; + dm += nao_pairs; + } + } +} + +#if CUDA_VERSION >= 12040 +__global__ __maxnreg__(128) +#else +__global__ +#endif +void rys_j_with_gout_kernel(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.y * blockDim.x + threadIdx.x; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + rys_j_with_gout(envs, jk, bounds, shl_quartet_idx, ntasks); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} diff --git a/gpu4pyscf/lib/gvhf-rys/rys_contract_jk.cu b/gpu4pyscf/lib/gvhf-rys/rys_contract_jk.cu new file mode 100644 index 00000000..0de25596 --- /dev/null +++ b/gpu4pyscf/lib/gvhf-rys/rys_contract_jk.cu @@ -0,0 +1,775 @@ +#include +#include +#include +#include + +#include "vhf.cuh" +#include "rys_roots.cu" +#include "create_tasks.cu" + +__device__ +static void rys_jk_general(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks) +{ + // sq is short for shl_quartet + int sq_id = threadIdx.x; + int nsq_per_block = blockDim.x; + int gout_id = threadIdx.y; + int gout_stride = blockDim.y; + int li = bounds.li; + int lj = bounds.lj; + int lk = bounds.lk; + int ll = bounds.ll; + int nfi = bounds.nfi; + int nfk = bounds.nfk; + int nfij = bounds.nfij; + int nfkl = bounds.nfkl; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int lij = li + lj; + int lkl = lk + ll; + int nroots = bounds.nroots; + int stride_j = bounds.stride_j; + int stride_k = bounds.stride_k; + int stride_l = bounds.stride_l; + int g_size = stride_l * (ll + 1); + int *idx_ij = c_g_pair_idx + c_g_pair_offsets[li*LMAX1+lj]; + int *idy_ij = idx_ij + nfij; + int *idz_ij = idy_ij + nfij; + int *idx_kl = c_g_pair_idx + c_g_pair_offsets[lk*LMAX1+ll]; + int *idy_kl = idx_kl + nfkl; + int *idz_kl = idy_kl + nfkl; + int *bas = envs.bas; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + //double *env = c_env; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + + extern __shared__ double rw[]; + double *g = rw + nsq_per_block * nroots*2; + double *Rpa_cicj = g + nsq_per_block * g_size*3; + double Rqc[3], Rpq[3]; + double gout[GWIDTH]; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + //int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + for (int ij = gout_id; ij < iprim*jprim; ij += gout_stride) { + int ip = ij / jprim; + int jp = ij % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ij*4*nsq_per_block; + Rpa[sq_id+0*nsq_per_block] = xjxi * aj_aij; + Rpa[sq_id+1*nsq_per_block] = yjyi * aj_aij; + Rpa[sq_id+2*nsq_per_block] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sq_id+3*nsq_per_block] = fac_sym * ci[ip] * cj[jp] * Kab; + } + for (int gout_start = 0; gout_start < nfij*nfkl; gout_start+=gout_stride*GWIDTH) { +#pragma unroll + for (int n = 0; n < GWIDTH; ++n) { gout[n] = 0; } + + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + Rqc[0] = xlxk * al_akl; // (ak*xk+al*xl)/akl + Rqc[1] = ylyk * al_akl; + Rqc[2] = zlzk * al_akl; + __syncthreads(); + if (gout_id == 0) { + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = ck[kp] * cl[lp] * Kcd; + g[sq_id] = ckcl; + } + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp*4*nsq_per_block; + double xij = ri[0] + Rpa[sq_id+0*nsq_per_block]; + double yij = ri[1] + Rpa[sq_id+1*nsq_per_block]; + double zij = ri[2] + Rpa[sq_id+2*nsq_per_block]; + double xkl = rk[0] + Rqc[0]; + double ykl = rk[1] + Rqc[1]; + double zkl = rk[2] + Rqc[2]; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + Rpq[0] = xpq; + Rpq[1] = ypq; + Rpq[2] = zpq; + __syncthreads(); + if (gout_id == 0) { + double cicj = Rpa[sq_id+3*nsq_per_block]; + g[sq_id + g_size * nsq_per_block] = cicj / (aij*akl*sqrt(aij+akl)); + } + double rr = xpq*xpq + ypq*ypq + zpq*zpq; + double theta = aij * akl / (aij + akl); + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(nroots, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(nroots, theta_fac*theta_rr, rw); + __syncthreads(); + double sqrt_theta_fac = sqrt(theta_fac); + for (int irys = gout_id; irys < nroots; irys+=gout_stride) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + rw[sq_id+(irys*2+1)*nsq_per_block] *= sqrt_theta_fac; + } + } + double s0x, s1x, s2x; + for (int irys = 0; irys < nroots; ++irys) { + __syncthreads(); + if (gout_id == 0) { + g[sq_id + 2*g_size*nsq_per_block] = rw[sq_id+(irys*2+1)*nsq_per_block]; + } + double rt = rw[sq_id + irys*2*nsq_per_block]; + double rt_aa = rt / (aij + akl); + double rt_aij = rt_aa * akl; + double rt_akl = rt_aa * aij; + double b00 = .5 * rt_aa; + double b10 = .5/aij * (1 - rt_aij); + double b01 = .5/akl * (1 - rt_akl); + + // TRR + //for i in range(lij): + // trr(i+1,0) = c0 * trr(i,0) + i*b10 * trr(i-1,0) + //for k in range(lkl): + // for i in range(lij+1): + // trr(i,k+1) = c0p * trr(i,k) + k*b01 * trr(i,k-1) + i*b00 * trr(i-1,k) + if (lij > 0) { + __syncthreads(); + // gx(0,n+1) = c0*gx(0,n) + n*b10*gx(0,n-1) + for (int n = gout_id; n < 3; n += gout_stride) { + double *_gx = g + n * g_size * nsq_per_block; + int ir = sq_id + n * nsq_per_block; + double c0x = Rpa[ir] - rt_aij * Rpq[n]; + s0x = _gx[sq_id]; + s1x = c0x * s0x; + _gx[sq_id + nsq_per_block] = s1x; + for (int i = 1; i < lij; ++i) { + s2x = c0x * s1x + i * b10 * s0x; + _gx[sq_id + (i+1)*nsq_per_block] = s2x; + s0x = s1x; + s1x = s2x; + } + } + } + + if (lkl > 0) { + int lij3 = (lij+1)*3; + for (int n = gout_id; n < lij3+gout_id; n += gout_stride) { + __syncthreads(); + int i = n / 3; //for i in range(lij+1): + int _ix = n % 3; // TODO: remove _ix for nroots > 2 + double *_gx = g + (i + _ix * g_size) * nsq_per_block; + double cpx = Rqc[_ix] + rt_akl * Rpq[_ix]; + //for i in range(lij+1): + // trr(i,1) = c0p * trr(i,0) + i*b00 * trr(i-1,0) + if (n < lij3) { + s0x = _gx[sq_id]; + s1x = cpx * s0x; + if (i > 0) { + s1x += i * b00 * _gx[sq_id-nsq_per_block]; + } + _gx[sq_id + stride_k*nsq_per_block] = s1x; + } + + //for k in range(1, lkl): + // for i in range(lij+1): + // trr(i,k+1) = cp * trr(i,k) + k*b01 * trr(i,k-1) + i*b00 * trr(i-1,k) + for (int k = 1; k < lkl; ++k) { + __syncthreads(); + if (n < lij3) { + s2x = cpx*s1x + k*b01*s0x; + if (i > 0) { + s2x += i * b00 * _gx[sq_id + (k*stride_k-1)*nsq_per_block]; + } + _gx[sq_id + (k*stride_k+stride_k)*nsq_per_block] = s2x; + s0x = s1x; + s1x = s2x; + } + } + } + } + + // hrr + // g(i,j+1) = rirj * g(i,j) + g(i+1,j) + // g(...,k,l+1) = rkrl * g(...,k,l) + g(...,k+1,l) + if (lj > 0) { + __syncthreads(); + if (task_id < ntasks) { + int lkl3 = (lkl+1)*3; + for (int m = gout_id; m < lkl3; m += gout_stride) { + int k = m / 3; + int _ix = m % 3; + double xixj = ri[_ix] - rj[_ix]; + double *_gx = g + (_ix*g_size + k*stride_k) * nsq_per_block; + for (int j = 0; j < lj; ++j) { + int ij = (lij-j) + j*stride_j; + s1x = _gx[sq_id + ij*nsq_per_block]; + for (--ij; ij >= j*stride_j; --ij) { + s0x = _gx[sq_id + ij*nsq_per_block]; + _gx[sq_id + (ij+stride_j)*nsq_per_block] = xixj * s0x + s1x; + s1x = s0x; + } + } + } + } + } + if (ll > 0) { + __syncthreads(); + if (task_id < ntasks) { + for (int n = gout_id; n < stride_k*3; n += gout_stride) { + int i = n / 3; + int _ix = n % 3; + double xkxl = rk[_ix] - rl[_ix]; + double *_gx = g + (_ix*g_size + i) * nsq_per_block; + for (int l = 0; l < ll; ++l) { + int kl = (lkl-l)*stride_k + l*stride_l; + s1x = _gx[sq_id + kl*nsq_per_block]; + for (kl-=stride_k; kl >= l*stride_l; kl-=stride_k) { + s0x = _gx[sq_id + kl*nsq_per_block]; + _gx[sq_id + (kl+stride_l)*nsq_per_block] = xkxl * s0x + s1x; + s1x = s0x; + } + } + } + } + } + + __syncthreads(); + double *gx = g; + double *gy = gx + nsq_per_block * g_size; + double *gz = gy + nsq_per_block * g_size; +#pragma unroll + for (int n = 0; n < GWIDTH; ++n) { + int ijkl = (gout_start + n*gout_stride+gout_id); + int kl = ijkl / nfij; + int ij = ijkl % nfij; + if (kl >= nfkl) break; + int addrx = sq_id + (idx_ij[ij] + idx_kl[kl] * stride_k) * nsq_per_block; + int addry = sq_id + (idy_ij[ij] + idy_kl[kl] * stride_k) * nsq_per_block; + int addrz = sq_id + (idz_ij[ij] + idz_kl[kl] * stride_k) * nsq_per_block; + gout[n] += gx[addrx] * gy[addry] * gz[addrz]; + } + } + } + } + if (task_id >= ntasks) { + continue; + } + double *dm = jk.dm; + double *vj = jk.vj; + double *vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { +#pragma unroll + for (int n = 0; n < GWIDTH; ++n) { + int ijkl = (gout_start + n*gout_stride+gout_id); + int kl = ijkl / nfij; + int ij = ijkl % nfij; + if (kl >= nfkl) break; + double s = gout[n]; + int i = ij % nfi; + int j = ij / nfi; + int k = kl % nfk; + int l = kl / nfk; + int _i = i + i0; + int _j = j + j0; + int _k = k + k0; + int _l = l + l0; + if (do_j) { + int _ji = _j*nao+_i; + int _lk = _l*nao+_k; + atomicAdd(vj+_lk, s * dm[_ji]); + atomicAdd(vj+_ji, s * dm[_lk]); + } + if (do_k) { + int _jl = _j*nao+_l; + int _jk = _j*nao+_k; + int _il = _i*nao+_l; + int _ik = _i*nao+_k; + atomicAdd(vk+_ik, s * dm[_jl]); + atomicAdd(vk+_il, s * dm[_jk]); + atomicAdd(vk+_jk, s * dm[_il]); + atomicAdd(vk+_jl, s * dm[_ik]); + } + } + vj += nao * nao; + vk += nao * nao; + dm += nao * nao; + } + } } +} + +__device__ +static void rys_sr_jk_general(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks) +{ + // sq is short for shl_quartet + int sq_id = threadIdx.x; + int nsq_per_block = blockDim.x; + int gout_id = threadIdx.y; + int gout_stride = blockDim.y; + int li = bounds.li; + int lj = bounds.lj; + int lk = bounds.lk; + int ll = bounds.ll; + int nfi = bounds.nfi; + int nfk = bounds.nfk; + int nfij = bounds.nfij; + int nfkl = bounds.nfkl; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int lij = li + lj; + int lkl = lk + ll; + int nroots = bounds.nroots; + int stride_j = bounds.stride_j; + int stride_k = bounds.stride_k; + int stride_l = bounds.stride_l; + int g_size = stride_l * (ll + 1); + int *idx_ij = c_g_pair_idx + c_g_pair_offsets[li*LMAX1+lj]; + int *idy_ij = idx_ij + nfij; + int *idz_ij = idy_ij + nfij; + int *idx_kl = c_g_pair_idx + c_g_pair_offsets[lk*LMAX1+ll]; + int *idy_kl = idx_kl + nfkl; + int *idz_kl = idy_kl + nfkl; + int *bas = envs.bas; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + //double *env = c_env; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + + extern __shared__ double rw[]; + double *g = rw + nsq_per_block * nroots*2; + double *Rpa_cicj = g + nsq_per_block * g_size*3; + double Rqc[3], Rpq[3]; + double gout[GWIDTH]; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + //int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + for (int ij = gout_id; ij < iprim*jprim; ij += gout_stride) { + int ip = ij / jprim; + int jp = ij % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ij*4*nsq_per_block; + Rpa[sq_id+0*nsq_per_block] = xjxi * aj_aij; + Rpa[sq_id+1*nsq_per_block] = yjyi * aj_aij; + Rpa[sq_id+2*nsq_per_block] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sq_id+3*nsq_per_block] = fac_sym * ci[ip] * cj[jp] * Kab; + } + for (int gout_start = 0; gout_start < nfij*nfkl; gout_start+=gout_stride*GWIDTH) { +#pragma unroll + for (int n = 0; n < GWIDTH; ++n) { gout[n] = 0; } + + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + Rqc[0] = xlxk * al_akl; // (ak*xk+al*xl)/akl + Rqc[1] = ylyk * al_akl; + Rqc[2] = zlzk * al_akl; + __syncthreads(); + if (gout_id == 0) { + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = ck[kp] * cl[lp] * Kcd; + g[sq_id] = ckcl; + } + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp*4*nsq_per_block; + double xij = ri[0] + Rpa[sq_id+0*nsq_per_block]; + double yij = ri[1] + Rpa[sq_id+1*nsq_per_block]; + double zij = ri[2] + Rpa[sq_id+2*nsq_per_block]; + double xkl = rk[0] + Rqc[0]; + double ykl = rk[1] + Rqc[1]; + double zkl = rk[2] + Rqc[2]; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + Rpq[0] = xpq; + Rpq[1] = ypq; + Rpq[2] = zpq; + __syncthreads(); + if (gout_id == 0) { + double cicj = Rpa[sq_id+3*nsq_per_block]; + g[sq_id + g_size * nsq_per_block] = cicj / (aij*akl*sqrt(aij+akl)); + } + double rr = xpq*xpq + ypq*ypq + zpq*zpq; + double theta = aij * akl / (aij + akl); + double theta_rr = theta * rr; + int _nroots = nroots/2; + rys_roots(_nroots, theta_rr, rw+nroots*nsq_per_block); + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(_nroots, theta_fac*theta_rr, rw); + __syncthreads(); + double sqrt_theta_fac = -sqrt(theta_fac); + for (int irys = gout_id; irys < _nroots; irys+=gout_stride) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + rw[sq_id+(irys*2+1)*nsq_per_block] *= sqrt_theta_fac; + } + double s0x, s1x, s2x; + for (int irys = 0; irys < nroots; ++irys) { + __syncthreads(); + if (gout_id == 0) { + g[sq_id + 2*g_size*nsq_per_block] = rw[sq_id+(irys*2+1)*nsq_per_block]; + } + double rt = rw[sq_id + irys*2*nsq_per_block]; + double rt_aa = rt / (aij + akl); + double rt_aij = rt_aa * akl; + double rt_akl = rt_aa * aij; + double b00 = .5 * rt_aa; + double b10 = .5/aij * (1 - rt_aij); + double b01 = .5/akl * (1 - rt_akl); + + // TRR + //for i in range(lij): + // trr(i+1,0) = c0 * trr(i,0) + i*b10 * trr(i-1,0) + //for k in range(lkl): + // for i in range(lij+1): + // trr(i,k+1) = c0p * trr(i,k) + k*b01 * trr(i,k-1) + i*b00 * trr(i-1,k) + if (lij > 0) { + __syncthreads(); + // gx(0,n+1) = c0*gx(0,n) + n*b10*gx(0,n-1) + for (int n = gout_id; n < 3; n += gout_stride) { + double *_gx = g + n * g_size * nsq_per_block; + int ir = sq_id + n * nsq_per_block; + double c0x = Rpa[ir] - rt_aij * Rpq[n]; + s0x = _gx[sq_id]; + s1x = c0x * s0x; + _gx[sq_id + nsq_per_block] = s1x; + for (int i = 1; i < lij; ++i) { + s2x = c0x * s1x + i * b10 * s0x; + _gx[sq_id + (i+1)*nsq_per_block] = s2x; + s0x = s1x; + s1x = s2x; + } + } + } + + if (lkl > 0) { + int lij3 = (lij+1)*3; + for (int n = gout_id; n < lij3+gout_id; n += gout_stride) { + __syncthreads(); + int i = n / 3; //for i in range(lij+1): + int _ix = n % 3; // TODO: remove _ix for nroots > 2 + double *_gx = g + (i + _ix * g_size) * nsq_per_block; + double cpx = Rqc[_ix] + rt_akl * Rpq[_ix]; + //for i in range(lij+1): + // trr(i,1) = c0p * trr(i,0) + i*b00 * trr(i-1,0) + if (n < lij3) { + s0x = _gx[sq_id]; + s1x = cpx * s0x; + if (i > 0) { + s1x += i * b00 * _gx[sq_id-nsq_per_block]; + } + _gx[sq_id + stride_k*nsq_per_block] = s1x; + } + + //for k in range(1, lkl): + // for i in range(lij+1): + // trr(i,k+1) = cp * trr(i,k) + k*b01 * trr(i,k-1) + i*b00 * trr(i-1,k) + for (int k = 1; k < lkl; ++k) { + __syncthreads(); + if (n < lij3) { + s2x = cpx*s1x + k*b01*s0x; + if (i > 0) { + s2x += i * b00 * _gx[sq_id + (k*stride_k-1)*nsq_per_block]; + } + _gx[sq_id + (k*stride_k+stride_k)*nsq_per_block] = s2x; + s0x = s1x; + s1x = s2x; + } + } + } + } + + // hrr + // g(i,j+1) = rirj * g(i,j) + g(i+1,j) + // g(...,k,l+1) = rkrl * g(...,k,l) + g(...,k+1,l) + if (lj > 0) { + __syncthreads(); + if (task_id < ntasks) { + int lkl3 = (lkl+1)*3; + for (int m = gout_id; m < lkl3; m += gout_stride) { + int k = m / 3; + int _ix = m % 3; + double xixj = ri[_ix] - rj[_ix]; + double *_gx = g + (_ix*g_size + k*stride_k) * nsq_per_block; + for (int j = 0; j < lj; ++j) { + int ij = (lij-j) + j*stride_j; + s1x = _gx[sq_id + ij*nsq_per_block]; + for (--ij; ij >= j*stride_j; --ij) { + s0x = _gx[sq_id + ij*nsq_per_block]; + _gx[sq_id + (ij+stride_j)*nsq_per_block] = xixj * s0x + s1x; + s1x = s0x; + } + } + } + } + } + if (ll > 0) { + __syncthreads(); + if (task_id < ntasks) { + for (int n = gout_id; n < stride_k*3; n += gout_stride) { + int i = n / 3; + int _ix = n % 3; + double xkxl = rk[_ix] - rl[_ix]; + double *_gx = g + (_ix*g_size + i) * nsq_per_block; + for (int l = 0; l < ll; ++l) { + int kl = (lkl-l)*stride_k + l*stride_l; + s1x = _gx[sq_id + kl*nsq_per_block]; + for (kl-=stride_k; kl >= l*stride_l; kl-=stride_k) { + s0x = _gx[sq_id + kl*nsq_per_block]; + _gx[sq_id + (kl+stride_l)*nsq_per_block] = xkxl * s0x + s1x; + s1x = s0x; + } + } + } + } + } + + __syncthreads(); + if (task_id >= ntasks) { + continue; + } + double *gx = g; + double *gy = gx + nsq_per_block * g_size; + double *gz = gy + nsq_per_block * g_size; +#pragma unroll + for (int n = 0; n < GWIDTH; ++n) { + int ijkl = gout_start + n*gout_stride+gout_id; + int kl = ijkl / nfij; + int ij = ijkl % nfij; + if (kl >= nfkl) break; + int addrx = sq_id + (idx_ij[ij] + idx_kl[kl] * stride_k) * nsq_per_block; + int addry = sq_id + (idy_ij[ij] + idy_kl[kl] * stride_k) * nsq_per_block; + int addrz = sq_id + (idz_ij[ij] + idz_kl[kl] * stride_k) * nsq_per_block; + gout[n] += gx[addrx] * gy[addry] * gz[addrz]; + } + } + } + } + if (task_id >= ntasks) { + continue; + } + double *dm = jk.dm; + double *vj = jk.vj; + double *vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { +#pragma unroll + for (int n = 0; n < GWIDTH; ++n) { + int ijkl = (gout_start + n*gout_stride+gout_id); + int kl = ijkl / nfij; + int ij = ijkl % nfij; + if (kl >= nfkl) break; + double s = gout[n]; + int i = ij % nfi; + int j = ij / nfi; + int k = kl % nfk; + int l = kl / nfk; + int _i = i + i0; + int _j = j + j0; + int _k = k + k0; + int _l = l + l0; + if (do_j) { + int _ji = _j*nao+_i; + int _lk = _l*nao+_k; + atomicAdd(vj+_lk, s * dm[_ji]); + atomicAdd(vj+_ji, s * dm[_lk]); + } + if (do_k) { + int _jl = _j*nao+_l; + int _jk = _j*nao+_k; + int _il = _i*nao+_l; + int _ik = _i*nao+_k; + atomicAdd(vk+_ik, s * dm[_jl]); + atomicAdd(vk+_il, s * dm[_jk]); + atomicAdd(vk+_jk, s * dm[_il]); + atomicAdd(vk+_jl, s * dm[_ik]); + } + } + vj += nao * nao; + vk += nao * nao; + dm += nao * nao; + } + } } +} + +__global__ +void rys_jk_kernel(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.y * blockDim.x + threadIdx.x; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + if (ntasks > 0) { + rys_jk_general(envs, jk, bounds, shl_quartet_idx, ntasks); + } + __syncthreads(); + } +} + +__global__ +void rys_sr_jk_kernel(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.y * blockDim.x + threadIdx.x; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_sr_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + rys_sr_jk_general(envs, jk, bounds, shl_quartet_idx, ntasks); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} diff --git a/gpu4pyscf/lib/gvhf-rys/rys_jk_driver.cu b/gpu4pyscf/lib/gvhf-rys/rys_jk_driver.cu new file mode 100644 index 00000000..57014154 --- /dev/null +++ b/gpu4pyscf/lib/gvhf-rys/rys_jk_driver.cu @@ -0,0 +1,226 @@ +#include +#include +#include +#include +#include +#include + +#include "vhf.cuh" + +__constant__ int c_g_pair_idx[3675]; +__constant__ int c_g_pair_offsets[LMAX1*LMAX1]; +// Putting _env in c_env reduces performance. Reason unclear +//__constant__ double c_env[6000]; +// TODO: reuse memory of c_g_pair_idx for c_i_in_fold2idx and c_i_in_fold2idx +__constant__ Fold2Index c_i_in_fold2idx[165]; +__constant__ Fold3Index c_i_in_fold3idx[495]; + +extern __global__ void rys_j_kernel(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head); +extern __global__ void rys_j_with_gout_kernel(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head); +extern __global__ void rys_jk_kernel(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head); +extern __global__ void rys_sr_jk_kernel(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head); +extern __global__ void rys_jk_ip1_kernel(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head); +extern int rys_j_unrolled(RysIntEnvVars *envs, JKMatrix *jk, BoundsInfo *bounds, + ShellQuartet *pool, uint32_t *batch_head, + int *scheme, int workers, double omega); +extern int rys_jk_unrolled(RysIntEnvVars *envs, JKMatrix *jk, BoundsInfo *bounds, + ShellQuartet *pool, uint32_t *batch_head, + int *scheme, int workers, double omega); +extern int rys_sr_jk_unrolled(RysIntEnvVars *envs, JKMatrix *jk, BoundsInfo *bounds, + ShellQuartet *pool, uint32_t *batch_head, + int *scheme, int workers, double omega); +extern int os_jk_unrolled(RysIntEnvVars *envs, JKMatrix *jk, BoundsInfo *bounds, + ShellQuartet *pool, uint32_t *batch_head, + int *scheme, int workers, double omega); + +extern "C" { +int RYS_build_j(double *vj, double *dm, int n_dm, int nao, + RysIntEnvVars envs, int *scheme, int *shls_slice, + int ntile_ij_pairs, int ntile_kl_pairs, + int *tile_ij_mapping, int *tile_kl_mapping, float *tile_q_cond, + float *q_cond, float *dm_cond, float cutoff, + ShellQuartet *pool, uint32_t *batch_head, int workers, + int *atm, int natm, int *bas, int nbas, double *env) +{ + uint16_t ish0 = shls_slice[0]; + uint16_t jsh0 = shls_slice[2]; + uint16_t ksh0 = shls_slice[4]; + uint16_t lsh0 = shls_slice[6]; + uint8_t li = bas[ANG_OF + ish0*BAS_SLOTS]; + uint8_t lj = bas[ANG_OF + jsh0*BAS_SLOTS]; + uint8_t lk = bas[ANG_OF + ksh0*BAS_SLOTS]; + uint8_t ll = bas[ANG_OF + lsh0*BAS_SLOTS]; + uint8_t iprim = bas[NPRIM_OF + ish0*BAS_SLOTS]; + uint8_t jprim = bas[NPRIM_OF + jsh0*BAS_SLOTS]; + uint8_t kprim = bas[NPRIM_OF + ksh0*BAS_SLOTS]; + uint8_t lprim = bas[NPRIM_OF + lsh0*BAS_SLOTS]; + uint8_t nfi = (li+1)*(li+2)/2; + uint8_t nfj = (lj+1)*(lj+2)/2; + uint8_t nfk = (lk+1)*(lk+2)/2; + uint8_t nfl = (ll+1)*(ll+2)/2; + uint8_t nfij = nfi * nfj; + uint8_t nfkl = nfk * nfl; + uint8_t order = li + lj + lk + ll; + uint8_t nroots = order / 2 + 1; + double omega = env[PTR_RANGE_OMEGA]; + if (omega < 0) { // SR ERIs + nroots *= 2; + } + int lij = li + lj; + int lkl = lk + ll; + uint8_t stride_j = 1; + uint8_t stride_k = lij + 1; + uint8_t stride_l = lij + 1; + int g_size = (lij + 1) * (lkl + 1); + BoundsInfo bounds = {li, lj, lk, ll, nfi, nfk, nfij, nfkl, + nroots, stride_j, stride_k, stride_l, iprim, jprim, kprim, lprim, + ntile_ij_pairs, ntile_kl_pairs, tile_ij_mapping, tile_kl_mapping, + q_cond, dm_cond, cutoff}; + + JKMatrix jk = {vj, NULL, dm, (uint16_t)n_dm}; + cudaMemset(batch_head, 0, 2*sizeof(uint32_t)); + + if (!rys_j_unrolled(&envs, &jk, &bounds, pool, batch_head, scheme, workers, omega)) { + int quartets_per_block = scheme[0]; + int gout_stride = scheme[1]; + int with_gout = scheme[2]; + dim3 threads(quartets_per_block, gout_stride); + int nmax = MAX(lij, lkl); + int nf3_ij = (lij+1)*(lij+2)*(lij+3)/6; + int nf3_kl = (lkl+1)*(lkl+2)*(lkl+3)/6; + int buflen = (nroots*2 + g_size*3 + iprim*jprim*4) * quartets_per_block; + if (with_gout) { + buflen += nf3_ij*nf3_kl * quartets_per_block; + rys_j_with_gout_kernel<<>>(envs, jk, bounds, pool, batch_head); + } else { + buflen += (nf3_ij+nf3_kl*2+(lij+1)*(lkl+1)*(nmax+2)) * quartets_per_block; + buflen += nf3_ij * TILE2; // dm_ij_cache + rys_j_kernel<<>>(envs, jk, bounds, pool, batch_head); + } + } + cudaError_t err = cudaGetLastError(); + if (err != cudaSuccess) { + fprintf(stderr, "CUDA Error in RYS_build_j: %s\n", cudaGetErrorString(err)); + return 1; + } + return 0; +} + +int RYS_build_jk(double *vj, double *vk, double *dm, int n_dm, int nao, + RysIntEnvVars envs, int *scheme, int *shls_slice, + int ntile_ij_pairs, int ntile_kl_pairs, + int *tile_ij_mapping, int *tile_kl_mapping, float *tile_q_cond, + float *q_cond, float *dm_cond, float cutoff, + ShellQuartet *pool, uint32_t *batch_head, int workers, + int *atm, int natm, int *bas, int nbas, double *env) +{ + uint16_t ish0 = shls_slice[0]; + uint16_t jsh0 = shls_slice[2]; + uint16_t ksh0 = shls_slice[4]; + uint16_t lsh0 = shls_slice[6]; + uint8_t li = bas[ANG_OF + ish0*BAS_SLOTS]; + uint8_t lj = bas[ANG_OF + jsh0*BAS_SLOTS]; + uint8_t lk = bas[ANG_OF + ksh0*BAS_SLOTS]; + uint8_t ll = bas[ANG_OF + lsh0*BAS_SLOTS]; + uint8_t iprim = bas[NPRIM_OF + ish0*BAS_SLOTS]; + uint8_t jprim = bas[NPRIM_OF + jsh0*BAS_SLOTS]; + uint8_t kprim = bas[NPRIM_OF + ksh0*BAS_SLOTS]; + uint8_t lprim = bas[NPRIM_OF + lsh0*BAS_SLOTS]; + uint8_t nfi = (li+1)*(li+2)/2; + uint8_t nfj = (lj+1)*(lj+2)/2; + uint8_t nfk = (lk+1)*(lk+2)/2; + uint8_t nfl = (ll+1)*(ll+2)/2; + uint8_t nfij = nfi * nfj; + uint8_t nfkl = nfk * nfl; + uint8_t order = li + lj + lk + ll; + uint8_t nroots = order / 2 + 1; + double omega = env[PTR_RANGE_OMEGA]; + if (omega < 0) { // SR ERIs + nroots *= 2; + } + uint8_t stride_j = li + 1; + uint8_t stride_k = stride_j * (lj + 1); + uint8_t stride_l = stride_k * (lk + 1); + uint16_t g_size = stride_l * (uint16_t)(ll + 1); + BoundsInfo bounds = {li, lj, lk, ll, nfi, nfk, nfij, nfkl, + nroots, stride_j, stride_k, stride_l, iprim, jprim, kprim, lprim, + ntile_ij_pairs, ntile_kl_pairs, tile_ij_mapping, tile_kl_mapping, + q_cond, dm_cond, cutoff}; + + JKMatrix jk = {vj, vk, dm, (uint16_t)n_dm}; + cudaMemset(batch_head, 0, 2*sizeof(uint32_t)); + + if (omega >= 0) { + if (order <= 0) { + os_jk_unrolled(&envs, &jk, &bounds, pool, batch_head, scheme, workers, omega); + } else if (!rys_jk_unrolled(&envs, &jk, &bounds, pool, batch_head, scheme, workers, omega)) { + int quartets_per_block = scheme[0]; + int gout_stride = scheme[1]; + int ij_prims = iprim * jprim; + dim3 threads(quartets_per_block, gout_stride); + int buflen = (nroots*2 + g_size*3 + ij_prims*4) * quartets_per_block;// + ij_prims*4*TILE2; + rys_jk_kernel<<>>(envs, jk, bounds, pool, batch_head); + } + } else if (!rys_sr_jk_unrolled(&envs, &jk, &bounds, pool, batch_head, scheme, workers, omega)) { + int quartets_per_block = scheme[0]; + int gout_stride = scheme[1]; + int ij_prims = iprim * jprim; + dim3 threads(quartets_per_block, gout_stride); + int buflen = (nroots*4 + g_size*3 + ij_prims*4) * quartets_per_block;// + ij_prims*4*TILE2; + rys_sr_jk_kernel<<>>(envs, jk, bounds, pool, batch_head); + } + cudaError_t err = cudaGetLastError(); + if (err != cudaSuccess) { + fprintf(stderr, "CUDA Error in RYS_build_jk: %s\n", cudaGetErrorString(err)); + return 1; + } + return 0; +} + +void RYS_init_constant(int *g_pair_idx, int *offsets, + double *env, int env_size, int shm_size) +{ + // TODO: test whether the constant memory c_env can improve performance + //cudaMemcpyToSymbol(c_env, env, sizeof(double)*env_size); + cudaMemcpyToSymbol(c_g_pair_idx, g_pair_idx, 3675*sizeof(int)); + cudaMemcpyToSymbol(c_g_pair_offsets, offsets, sizeof(int) * LMAX1*LMAX1); + cudaFuncSetAttribute(rys_jk_kernel, cudaFuncAttributeMaxDynamicSharedMemorySize, shm_size); + cudaFuncSetAttribute(rys_sr_jk_kernel, cudaFuncAttributeMaxDynamicSharedMemorySize, shm_size); +} + +void RYS_init_rysj_constant(int shm_size) +{ + Fold2Index i_in_fold2idx[165]; + Fold3Index i_in_fold3idx[495]; + int n2 = 0; + int n3 = 0; + for (int l = 0; l <= LMAX*2; ++l) { + for (int i = 0, ijk = 0; i <= l; ++i) { + for (int j = 0; j <= l-i; ++j, ++n2) { + i_in_fold2idx[n2].x = i; + i_in_fold2idx[n2].y = j; + i_in_fold2idx[n2].fold3offset = ijk; + for (int k = 0; k <= l-i-j; ++k, ++n3, ++ijk) { + i_in_fold3idx[n3].x = i; + i_in_fold3idx[n3].y = j; + i_in_fold3idx[n3].z = k; + i_in_fold3idx[n3].fold2yz = (l+1)*(l+2)/2 - (l-j+1)*(l-j+2)/2 + k; + } + } } + } + cudaMemcpyToSymbol(c_i_in_fold2idx, i_in_fold2idx, 165*sizeof(Fold2Index)); + cudaMemcpyToSymbol(c_i_in_fold3idx, i_in_fold3idx, 495*sizeof(Fold3Index)); + cudaFuncSetAttribute(rys_j_kernel, cudaFuncAttributeMaxDynamicSharedMemorySize, shm_size); + cudaFuncSetAttribute(rys_j_with_gout_kernel, cudaFuncAttributeMaxDynamicSharedMemorySize, shm_size); +} + +int cuda_version() +{ + return CUDA_VERSION; +} +} diff --git a/gpu4pyscf/lib/gvhf-rys/rys_roots.cu b/gpu4pyscf/lib/gvhf-rys/rys_roots.cu new file mode 100644 index 00000000..897a9c88 --- /dev/null +++ b/gpu4pyscf/lib/gvhf-rys/rys_roots.cu @@ -0,0 +1,72 @@ +#include "rys_roots.cuh" + +#define SQRTPIE4 .8862269254527580136 +#define PIE4 .7853981633974483096 + +__device__ +static void rys_roots(int nroots, double x, double *rw) +{ + int t_id = threadIdx.x; + int block_size = blockDim.x; + int ty = threadIdx.y; + int ny = blockDim.y; + + if (x < 3.e-7){ + int off = nroots * (nroots - 1) / 2; + for (int i = ty; i < nroots; i += ny) { + rw[t_id+(i*2 )*block_size] = ROOT_SMALLX_R0[off+i] + ROOT_SMALLX_R1[off+i] * x; + rw[t_id+(i*2+1)*block_size] = ROOT_SMALLX_W0[off+i] + ROOT_SMALLX_W1[off+i] * x; + } + return; + } + + if (nroots == 1) { + if (ty == 0) { + double tt = sqrt(x); + double fmt0 = SQRTPIE4 / tt * erf(tt); + rw[t_id+block_size] = fmt0; + double e = exp(-x); + double b = .5 / x; + double fmt1 = b * (fmt0 - e); + rw[t_id] = fmt1 / fmt0; + } + return; + } + + if (x > 35+nroots*5) { + int off = nroots * (nroots - 1) / 2; + double t = sqrt(PIE4/x); + for (int i = ty; i < nroots; i += ny) { + rw[t_id+(i*2 )*block_size] = ROOT_LARGEX_R_DATA[off+i] / x; + rw[t_id+(i*2+1)*block_size] = ROOT_LARGEX_W_DATA[off+i] * t; + } + return; + } + + double *datax = ROOT_RW_DATA + DEGREE1*INTERVALS * nroots*(nroots-1); + int it = (int)(x * .4); + double u = (x - it * 2.5) * 0.8 - 1.; + double u2 = u * 2.; + for (int rt_id = ty; rt_id < nroots*2; rt_id += ny) { + double *c = datax + rt_id * DEGREE1 * INTERVALS; + //for i in range(2, degree + 1): + // c0, c1 = c[degree-i] - c1, c0 + c1*u2 + double c0 = c[it + DEGREE *INTERVALS]; + double c1 = c[it +(DEGREE-1)*INTERVALS]; + double c2, c3; +#pragma unroll + for (int n = DEGREE-2; n > 0; n-=2) { + c2 = c[it + n *INTERVALS] - c1; + c3 = c0 + c1*u2; + c1 = c2 + c3*u2; + c0 = c[it +(n-1)*INTERVALS] - c3; + } + if (DEGREE % 2 == 0) { + c2 = c[it] - c1; + c3 = c0 + c1*u2; + rw[t_id + rt_id*block_size] = c2 + c3*u; + } else { + rw[t_id + rt_id*block_size] = c0 + c1*u; + } + } +} diff --git a/gpu4pyscf/lib/gvhf-rys/rys_roots.cuh b/gpu4pyscf/lib/gvhf-rys/rys_roots.cuh new file mode 100644 index 00000000..e24ba3a4 --- /dev/null +++ b/gpu4pyscf/lib/gvhf-rys/rys_roots.cuh @@ -0,0 +1,50879 @@ +#define MAX_ORDER 9 +#define DEGREE 13 +#define DEGREE1 (DEGREE+1) +#define INTERVAL 2.5 +#define INTERVALS 40 + +__device__ +static double ROOT_SMALLX_R0[] = { +// nroots = 1 +3.3333333333333333e-01, +// nroots = 2 +1.1558710999704792e-01, +7.4155574714580919e-01, +// nroots = 3 +5.6939115967007355e-02, +4.3719785275109391e-01, +8.6949939491826234e-01, +// nroots = 4 +3.3648268067506856e-02, +2.7618431387246445e-01, +6.3467747623463666e-01, +9.2215660849205872e-01, +// nroots = 5 +2.2163568807217638e-02, +1.8783156765244552e-01, +4.6159736149626673e-01, +7.4833462838728049e-01, +9.4849392628836859e-01, +// nroots = 6 +1.5683406607400457e-02, +1.3530001165524824e-01, +3.4494237942741723e-01, +5.9275012773154168e-01, +8.1742801326687498e-01, +9.6346127870282172e-01, +// nroots = 7 +1.1675871940146670e-02, +1.0183270400276963e-01, +2.6548115726893728e-01, +4.7237153700448453e-01, +6.8426201565314859e-01, +8.6199133320339327e-01, +9.7275575129749037e-01, +// nroots = 8 +9.0273770256471507e-03, +7.9300559811486662e-02, +2.0977936861551005e-01, +3.8177105339711559e-01, +5.7063582016217218e-01, +7.4931737854740332e-01, +8.9222197421379790e-01, +9.7891421016235114e-01, +// nroots = 9 +7.1868028362263902e-03, +6.3446670693112051e-02, +1.6953901896599990e-01, +3.1334338332121792e-01, +4.7843096553757491e-01, +6.4594166107702500e-01, +7.9673916319752014e-01, +9.1359942257426596e-01, +9.8320148322562917e-01, +// nroots = 10 +5.8563084367956137e-03, +5.1886393980323693e-02, +1.3965624074297703e-01, +2.6098509368222639e-01, +4.0456428476574752e-01, +5.5701131460044329e-01, +7.0411729240009036e-01, +8.3217165208702348e-01, +9.2924187657989554e-01, +9.8630441451934892e-01, +}; + +__device__ +static double ROOT_SMALLX_R1[] = { +// nroots = 1 +-8.8888888888888888e-02, +// nroots = 2 +-2.2717051111017395e-02, +-4.2589071337962206e-02, +// nroots = 3 +-8.2610850830620065e-03, +-3.7854752353988726e-02, +-1.7456953408467386e-02, +// nroots = 4 +-3.8254190733604766e-03, +-2.3518416310971822e-02, +-2.7277879693537514e-02, +-8.4451526948803105e-03, +// nroots = 5 +-2.0640328595186064e-03, +-1.4528654271016218e-02, +-2.3669070224376341e-02, +-1.7936182127976315e-02, +-4.6526855316612742e-03, +// nroots = 6 +-1.2349949891669921e-03, +-9.3595134801070339e-03, +-1.8076570744189519e-02, +-1.9311793104462620e-02, +-1.1939156511475573e-02, +-2.8162914514516294e-03, +// nroots = 7 +-7.9583075548854930e-04, +-6.3077796136726851e-03, +-1.3448338786488488e-02, +-1.7188735726379686e-02, +-1.4899828247409574e-02, +-8.2042948059055099e-03, +-1.8277241113893437e-03, +// nroots = 8 +-5.4217475695054356e-04, +-4.4249685469740290e-03, +-1.0046786976896245e-02, +-1.4304358556677109e-02, +-1.4849126115758624e-02, +-1.1384293621469744e-02, +-5.8279953299291455e-03, +-1.2509805639134184e-03, +// nroots = 9 +-3.8568392979565399e-04, +-3.2119562524903699e-03, +-7.6105697304889863e-03, +-1.1630232835136768e-02, +-1.3488366310938310e-02, +-1.2362217922274528e-02, +-8.7538307580992195e-03, +-4.2667847376342593e-03, +-8.9277441127308258e-04, +// nroots = 10 +-2.8400058967262097e-04, +-2.3997168829288937e-03, +-5.8610914714398374e-03, +-9.4083841247758968e-03, +-1.1750830451596424e-02, +-1.2036571219879479e-02, +-1.0162738094792977e-02, +-6.8127801731598745e-03, +-3.2073859214716955e-03, +-6.5892763019479263e-04, +}; + +__device__ +static double ROOT_SMALLX_W0[] = { +// nroots = 1 +1.0000000000000000e+00, +// nroots = 2 +6.5214515486254609e-01, +3.4785484513745385e-01, +// nroots = 3 +4.6791393457269104e-01, +3.6076157304813861e-01, +1.7132449237917036e-01, +// nroots = 4 +3.6268378337836199e-01, +3.1370664587788727e-01, +2.2238103445337448e-01, +1.0122853629037626e-01, +// nroots = 5 +2.9552422471475287e-01, +2.6926671930999635e-01, +2.1908636251598204e-01, +1.4945134915058059e-01, +6.6671344308688138e-02, +// nroots = 6 +2.4914704581340277e-01, +2.3349253653835481e-01, +2.0316742672306592e-01, +1.6007832854334622e-01, +1.0693932599531843e-01, +4.7175336386511828e-02, +// nroots = 7 +2.1526385346315779e-01, +2.0519846372129560e-01, +1.8553839747793782e-01, +1.5720316715819355e-01, +1.2151857068790319e-01, +8.0158087159760208e-02, +3.5119460331751860e-02, +// nroots = 8 +1.8945061045506850e-01, +1.8260341504492358e-01, +1.6915651939500254e-01, +1.4959598881657674e-01, +1.2462897125553388e-01, +9.5158511682492786e-02, +6.2253523938647894e-02, +2.7152459411754096e-02, +// nroots = 9 +1.6914238296314360e-01, +1.6427648374583273e-01, +1.5468467512626524e-01, +1.4064291467065065e-01, +1.2255520671147846e-01, +1.0094204410628717e-01, +7.6425730254889052e-02, +4.9714548894969797e-02, +2.1616013526483312e-02, +// nroots = 10 +1.5275338713072584e-01, +1.4917298647260374e-01, +1.4209610931838204e-01, +1.3168863844917664e-01, +1.1819453196151841e-01, +1.0193011981724044e-01, +8.3276741576704755e-02, +6.2672048334109068e-02, +4.0601429800386939e-02, +1.7614007139152118e-02, +}; + +__device__ +static double ROOT_SMALLX_W1[] = { +// nroots = 1 +-3.3333333333333331e-01, +// nroots = 2 +-1.2271362192859778e-01, +-2.1061971140473557e-01, +// nroots = 3 +-5.6487691723447885e-02, +-1.4907718645889767e-01, +-1.2776845515098778e-01, +// nroots = 4 +-3.1384430571429409e-02, +-8.9804624256712817e-02, +-1.2931437096375242e-01, +-8.2829907541438680e-02, +// nroots = 5 +-1.9686757690986864e-02, +-5.6173759018728280e-02, +-9.7115272681211257e-02, +-1.0297926219357020e-01, +-5.7378281748836732e-02, +// nroots = 6 +-1.3404459326117429e-02, +-3.7140259226780728e-02, +-6.9798025993402457e-02, +-8.9903208869919593e-02, +-8.1202949733650345e-02, +-4.1884430183462780e-02, +// nroots = 7 +-9.6762784934135981e-03, +-2.5810077192692869e-02, +-5.0559277860857933e-02, +-7.1997207281479375e-02, +-7.8739057440032886e-02, +-6.4711830138776669e-02, +-3.1839604926079998e-02, +// nroots = 8 +-7.2956931243810877e-03, +-1.8697575943681034e-02, +-3.7385544074891822e-02, +-5.6452682904581976e-02, +-6.8429140245654982e-02, +-6.7705342645285799e-02, +-5.2380981359025407e-02, +-2.4986373035831237e-02, +// nroots = 9 +-5.6884471222090364e-03, +-1.4017609368068548e-02, +-2.8279396473125228e-02, +-4.4297481709585342e-02, +-5.7192383961753759e-02, +-6.2644131890598725e-02, +-5.8019794346925377e-02, +-4.3080183147849817e-02, +-2.0113905313217502e-02, +// nroots = 10 +-4.5548069078836916e-03, +-1.0812068870036251e-02, +-2.1858322694621932e-02, +-3.5065901484532154e-02, +-4.7201253922888042e-02, +-5.5107972224754838e-02, +-5.6377251364257981e-02, +-4.9866349375738916e-02, +-3.5958202071776788e-02, +-1.6531204416842745e-02, +}; + +__device__ static double ROOT_LARGEX_R_DATA[] = { +// nroots = 1 +5.0000000000000000e-01, +// nroots = 2 +2.7247448713915889e+00, +2.7525512860841095e-01, +// nroots = 3 +5.5253437422632601e+00, +1.7844927485432516e+00, +1.9016350919348812e-01, +// nroots = 4 +8.5886356890120350e+00, +3.9269635013582871e+00, +1.3390972881263614e+00, +1.4530352150331710e-01, +// nroots = 5 +1.1807189489971737e+01, +6.4147297336620301e+00, +3.0859374437175502e+00, +1.0745620124369040e+00, +1.1758132021177814e-01, +// nroots = 6 +1.5129959781108086e+01, +9.1242480375311796e+00, +5.1961525300544658e+00, +2.5525898026681713e+00, +8.9830283456961768e-01, +9.8747014068481187e-02, +// nroots = 7 +1.8528277495852493e+01, +1.1989993039823879e+01, +7.5540913261017844e+00, +4.3897928867310139e+00, +2.1805918884504591e+00, +7.7213792004277704e-01, +8.5115442997594035e-02, +// nroots = 8 +2.1984272840962650e+01, +1.4972627088426393e+01, +1.0093323675221344e+01, +6.4831454286271706e+00, +3.8094763614849070e+00, +1.9051136350314284e+00, +6.7724908764928915e-01, +7.4791882596818265e-02, +// nroots = 9 +2.5485979166099078e+01, +1.8046505467728981e+01, +1.2771825354869193e+01, +8.7697567302686021e+00, +5.6944233429577551e+00, +3.3691762702432690e+00, +1.6923950797931788e+00, +6.0323635708174872e-01, +6.6702230958194400e-02, +// nroots = 10 +2.9024950340236227e+01, +2.1193892096301543e+01, +1.5561163332189350e+01, +1.1208130204348663e+01, +7.7774392315254453e+00, +5.0849077500985240e+00, +3.0225133764515739e+00, +1.5229441054044437e+00, +5.4386750029464603e-01, +6.0192063149587915e-02, +}; + +__device__ static double ROOT_LARGEX_W_DATA[] = { +// nroots = 1 +1.0000000000000000e+00, +// nroots = 2 +9.1751709536136983e-02, +9.0824829046386302e-01, +// nroots = 3 +5.1115688041124931e-03, +1.7723149208382905e-01, +8.1765693911205850e-01, +// nroots = 4 +2.2522907675073554e-04, +1.9270440241576533e-02, +2.3447981532351803e-01, +7.4602451535815473e-01, +// nroots = 5 +8.6213052614365738e-06, +1.5161418686244353e-03, +3.8223161001540572e-02, +2.7096740596053548e-01, +6.8928466986403814e-01, +// nroots = 6 +2.9998543352743358e-07, +9.6743698451812559e-05, +4.4067613750663976e-03, +5.8233375824728303e-02, +2.9393409609065996e-01, +6.4332872302566002e-01, +// nroots = 7 +9.7363225154967611e-09, +5.3219826881352609e-06, +4.0067910752148827e-04, +8.8578382138948062e-03, +7.7300217648506794e-02, +3.0816667968502726e-01, +6.0526925362603901e-01, +// nroots = 8 +2.9956294463236794e-10, +2.6189464325736453e-07, +3.0600064324974545e-05, +1.0519698531478185e-03, +1.4533875202369467e-02, +9.4569504708028052e-02, +3.1667674550189923e-01, +5.7313704247602426e-01, +// nroots = 9 +8.8331775387174107e-12, +1.1810976957673191e-08, +2.0431047952739623e-06, +1.0359792288232413e-04, +2.1309695925833040e-03, +2.1033035503882684e-02, +1.0979326496044525e-01, +3.2137060778702525e-01, +5.4556646930857577e-01, +// nroots = 10 +2.5156013448758539e-13, +4.9641247246303573e-10, +1.2254980519965896e-07, +8.8042421804617054e-06, +2.5765255992385888e-04, +3.6602062621609857e-03, +2.7995674894202006e-02, +1.2301274412795381e-01, +3.2347866796799990e-01, +5.2158612689910977e-01, +}; + +#define MAX_ORDER 9 +#define DEGREE 13 +#define DEGREE1 (DEGREE+1) +#define INTERVAL 2.5 +#define INTERVALS 40 +__device__ static double ROOT_RW_DATA[] = { +// nroots = 1 +// root 0 + 2.44302310464373174e-01, + 1.30267986625037496e-01, + 8.09867019360753781e-02, + 5.76899499769367441e-02, + 4.47181289689056669e-02, + 3.65145987674225514e-02, + 3.08606520659770560e-02, + 2.67261228254459492e-02, + 2.35702259344786856e-02, + 2.10818510596452319e-02, + 1.90692517842768819e-02, + 1.74077655955200382e-02, + 1.60128153805047975e-02, + 1.48249863332217176e-02, + 1.38013111868470623e-02, + 1.29099444873580545e-02, + 1.21267812518166488e-02, + 1.14332390095005908e-02, + 1.08147614087175017e-02, + 1.02597835208515405e-02, + 9.75900072948533356e-03, + 9.30484210398471040e-03, + 8.89108448948774249e-03, + 8.51256530758748645e-03, + 8.16496580927725951e-03, + 7.84464540552736074e-03, + 7.54851356096397207e-03, + 7.27392967453307972e-03, + 7.01862406343596330e-03, + 6.78063503620810176e-03, + 6.55825835783952968e-03, + 6.35000635000952315e-03, + 6.15457454896663637e-03, + 5.97081434026531990e-03, + 5.79771035652448287e-03, + 5.63436169819010995e-03, + 5.47996624351190873e-03, + 5.33380747062665080e-03, + 5.19524333466131038e-03, + 5.06369683541833294e-03, +-8.15849615325854732e-02, +-3.55246194172368010e-02, +-1.57562330574362863e-02, +-8.24084318051243776e-03, +-4.98095296765303786e-03, +-3.32615944379695315e-03, +-2.37740046044033386e-03, +-1.78372426778863652e-03, +-1.38768523195069026e-03, +-1.11034056726139652e-03, +-9.08574965617989856e-04, +-7.57217396156878810e-04, +-6.40769025431489722e-04, +-5.49261993988943561e-04, +-4.76048837130865299e-04, +-4.16558216199487490e-04, +-3.67562619898812175e-04, +-3.26730665041241055e-04, +-2.92344245095188982e-04, +-2.63114626420194635e-04, +-2.38059817797206763e-04, +-2.16420942684944555e-04, +-1.97604053896700702e-04, +-1.81138913223677356e-04, +-1.66649309171512091e-04, +-1.53831363790850496e-04, +-1.42437462180996821e-04, +-1.32264198638730538e-04, +-1.23143231699909757e-04, +-1.14934272556252735e-04, +-1.07519656422606495e-04, +-1.00800101200152557e-04, +-9.46913656627627290e-05, +-8.91215955530488688e-05, +-8.40292003788056888e-05, +-7.93611429956935345e-05, +-7.50715527388062093e-05, +-7.11205939974744950e-05, +-6.74735378419139865e-05, +-6.40999960966265932e-05, + 7.39649094374333037e-03, + 3.84204456221523289e-03, + 1.43039931803595603e-03, + 5.79829199069291671e-04, + 2.76695944074654043e-04, + 1.51435949881485076e-04, + 9.15690387385816414e-05, + 5.95232929484423113e-05, + 4.08496086424757826e-05, + 2.92397494042942040e-05, + 2.16450144699313061e-05, + 1.64690345071095562e-05, + 1.28205107646975359e-05, + 1.01750089766404454e-05, + 8.21017989759817551e-06, + 6.72042965224274741e-06, + 5.57040968833562543e-06, + 4.66853388569915651e-06, + 3.95131960892724755e-06, + 3.37381907208590051e-06, + 2.90360040031677995e-06, + 2.51686293594454836e-06, + 2.19587172760486332e-06, + 1.92722785072878372e-06, + 1.70068025366314222e-06, + 1.50829561200312279e-06, + 1.34386925774950444e-06, + 1.20250119428577115e-06, + 1.08028691780905446e-06, + 9.74089221547035995e-07, + 8.81367878975063660e-07, + 8.00051200101685650e-07, + 7.28438225887089820e-07, + 6.65123577897701050e-07, + 6.08939226185496401e-07, + 5.58909008238304376e-07, + 5.14212841847902406e-07, + 4.74158367958945122e-07, + 4.38158332115964407e-07, + 4.05712430377978366e-07, +-1.13941066481406886e-04, +-3.01406884698148284e-04, +-1.15632784414319828e-04, +-3.94160705849570179e-05, +-1.52510786736942583e-05, +-6.88482324907857213e-06, +-3.52611675686616298e-06, +-1.98624212942782615e-06, +-1.20249419386885160e-06, +-7.70000230271217329e-07, +-5.15649934867856154e-07, +-3.58191844254109645e-07, +-2.56512861284098041e-07, +-1.88490754499241349e-07, +-1.41596930172374307e-07, +-1.08422239567432635e-07, +-8.44195313014370728e-08, +-6.67069576679266320e-08, +-5.34059654459730250e-08, +-4.32612024879230368e-08, +-3.54150287210734426e-08, +-2.92698061447962865e-08, +-2.44015876645134935e-08, +-2.05047447971248579e-08, +-1.73556874587710134e-08, +-1.47886334562995717e-08, +-1.26791404045971678e-08, +-1.09327326446719371e-08, +-9.47693030838655796e-09, +-8.25558634910293183e-09, +-7.22481231716650066e-09, +-6.35001270028865761e-09, +-5.60370256796841636e-09, +-4.96388525287049420e-09, +-4.41283481849009462e-09, +-3.93617414901455714e-09, +-3.52217100989645787e-09, +-3.16119628974358106e-09, +-2.84530395383913021e-09, +-2.56790306037052623e-09, +-5.80001294175425128e-05, + 1.28999264851802801e-05, + 7.87435694478560954e-06, + 2.51939968628718260e-06, + 8.25610411666681582e-07, + 3.11708265839013328e-07, + 1.35674342231925454e-07, + 6.62703525713114445e-08, + 3.53972278867733365e-08, + 2.02771456821222433e-08, + 1.22843417227185626e-08, + 7.79046221960548155e-09, + 5.13231093568741290e-09, + 3.49176738822309774e-09, + 2.44205253652100780e-09, + 1.74920096522288400e-09, + 1.27937757971979707e-09, + 9.53151099023017290e-10, + 7.21834077398094652e-10, + 5.54721993698692301e-10, + 4.31954844988651254e-10, + 3.40392614785070628e-10, + 2.71162233750313782e-10, + 2.18160276046893286e-10, + 1.77117295761618691e-10, + 1.45000541265206912e-10, + 1.19625180243558925e-10, + 9.93966946364108738e-11, + 8.31373655232168444e-11, + 6.99676212910143615e-11, + 5.92237527391588739e-11, + 5.04001007764606323e-11, + 4.31079553889273177e-11, + 3.70459832100741861e-11, + 3.19787429888881989e-11, + 2.77209111640225498e-11, + 2.41255907877886679e-11, + 2.10755790348096540e-11, + 1.84767788427146299e-11, + 1.62532022946563769e-11, + 6.45632966224485070e-06, + 4.90720890144980901e-07, +-4.09461845027310656e-07, +-1.46390184460534389e-07, +-4.32129360737241304e-08, +-1.39768226522315783e-08, +-5.20860966097659921e-09, +-2.21010668347861338e-09, +-1.04188970163445917e-09, +-5.33970676818191765e-10, +-2.92649651066042208e-10, +-1.69437934157625439e-10, +-1.02687307264309822e-10, +-6.46845486186861250e-11, +-4.21168774581687102e-11, +-2.82202625385651475e-11, +-1.93889612202825414e-11, +-1.36192242870177527e-11, +-9.75629699689143287e-12, +-7.11298986720661597e-12, +-5.26852578447067311e-12, +-3.95858825418655596e-12, +-3.01328529768091968e-12, +-2.32111667644601290e-12, +-1.80750760095781685e-12, +-1.42171063455637457e-12, +-1.12863932202846405e-12, +-9.03680172485750139e-13, +-7.29330833941815611e-13, +-5.92988653393701434e-13, +-4.85472557262828853e-13, +-4.00025956907510290e-13, +-3.31618859625511429e-13, +-2.76477879069331063e-13, +-2.31742099665715767e-13, +-1.95227380649540253e-13, +-1.65251467389014951e-13, +-1.40509521124535619e-13, +-1.19984216905201110e-13, +-1.02872111491326805e-13, + 1.20088840563387649e-08, +-1.47472192833566785e-07, + 1.10634744237488337e-08, + 7.37914517595506420e-09, + 2.14173291395597199e-09, + 6.15082534828023496e-10, + 1.98913597418407590e-10, + 7.36164547560566719e-11, + 3.06596230155422805e-11, + 1.40607533691510889e-11, + 6.97173801038570212e-12, + 3.68517043188853111e-12, + 2.05456762394650031e-12, + 1.19827430489470411e-12, + 7.26370061138604700e-13, + 4.55284597028853153e-13, + 2.93840328030021627e-13, + 1.94600466685625320e-13, + 1.31866297985385116e-13, + 9.12073749111938348e-14, + 6.42605225265254285e-14, + 4.60374025551560463e-14, + 3.34855578657696586e-14, + 2.46958830681392470e-14, + 1.84461288619110653e-14, + 1.39399706025174246e-14, + 1.06486246533245571e-14, + 8.21642568865513264e-15, + 6.39822150836881451e-15, + 5.02514209173686174e-15, + 3.97987802289238519e-15, + 3.17473387613311893e-15, + 2.55121595265506166e-15, + 2.06350133600298286e-15, + 1.67925477717965261e-15, + 1.37485806134544011e-15, + 1.13186608507042231e-15, + 9.37284192069122548e-16, + 7.79176561186318612e-16, + 6.51251188854180486e-16, +-6.80901791664869698e-08, + 1.37252095113885262e-08, + 6.36951366092667889e-10, +-2.93820682416278016e-10, +-9.78382319764913157e-11, +-2.62252021890833766e-11, +-7.51709855709733155e-12, +-2.44503964158522214e-12, +-9.01613862626785867e-13, +-3.70203857480379697e-13, +-1.66080682537421855e-13, +-8.01495138749682132e-14, +-4.11088374096272795e-14, +-2.21974288954916237e-14, +-1.25263227421809502e-14, +-7.34507623894716860e-15, +-4.45301650643527144e-15, +-2.78056812730755864e-15, +-1.78258888638087049e-15, +-1.16937134467682426e-15, +-7.83355409909508494e-16, +-5.34351823968896242e-16, +-3.71794683598907319e-16, +-2.62403588836317139e-16, +-1.88227636670305470e-16, +-1.36762460466273424e-16, +-9.97524279646870710e-17, +-7.41043602934392741e-17, +-5.60457395010754753e-17, +-4.28459581611080215e-17, +-3.22094491084434049e-17, +-2.53806045857285688e-17, +-1.93675320774932466e-17, +-1.53262314737308242e-17, +-1.21241508567922434e-17, +-9.80239364404404650e-18, +-7.81999504836163175e-18, +-5.71577781856430215e-18, +-4.92104662089611293e-18, +-4.00022783926491971e-18, + 5.94974388673555067e-09, +-5.51983561748027154e-10, +-1.21791843604151766e-10, + 6.33497844492689368e-12, + 3.95711675684408890e-12, + 1.06517056352731058e-12, + 2.78890934150825694e-13, + 8.07309581621236307e-14, + 2.64721998441500976e-14, + 9.74295575228931619e-15, + 3.95732485425236348e-15, + 1.74285968561591631e-15, + 8.21956326753047645e-16, + 4.11701704473601059e-16, + 2.16767098189989122e-16, + 1.18918897502107411e-16, + 6.79793148213047722e-17, + 4.03135074617549562e-17, + 2.39247516420940133e-17, + 1.49107703659552903e-17, + 1.02039845843358741e-17, + 7.34767054946968265e-18, + 4.37578679337906845e-18, + 3.04195720295644029e-18, + 2.07924901265384087e-18, + 1.09766401019363557e-18, + 8.38306878086020697e-19, + 7.56028524562219389e-19, + 3.77987761852639185e-19, +-1.56878229730447249e-19, + 3.80544777484945784e-19, +-1.70561082987594316e-19, + 1.11826993784069377e-19, +-1.30360365950070343e-19, +-2.77936287550113914e-19, +-1.31782821086762757e-19, +-1.88942533590698458e-19, + 1.28539783403373664e-19, +-1.68906667663405325e-19, + 5.45074177838135756e-20, + 1.80870952654200007e-10, +-3.22756314260713393e-11, + 1.05191091140857088e-11, + 2.90550935958070962e-13, +-1.30421575422665755e-13, +-4.02950007314165907e-14, +-1.00480969543338573e-14, +-2.63864131411862817e-15, +-7.74795104680823605e-16, +-2.57019814766255502e-16, +-9.41624356115106421e-17, +-3.81809173207436605e-17, +-1.75305824275170486e-17, +-6.72355181762233340e-18, +-2.93935513440025614e-18, +-1.18338685711171139e-18, +-7.18971453359759001e-19, +-1.86682140283751205e-19, +-2.58842631917160804e-19, +-2.76206623237821227e-20, + 6.77909068426479594e-19, + 9.10449096531250500e-19, + 5.76576322390613120e-19, + 3.65460915086401519e-19, + 2.55403014774188526e-19, +-5.40864834781454002e-20, + 2.94831522819935126e-19, + 5.40664870653477088e-19, + 2.29721567912030784e-19, +-1.76447048967586036e-19, + 8.01765826389265836e-20, +-2.62647156627938567e-19, +-2.02142122743953101e-20, + 1.07604715451554930e-19, +-5.40731103586750604e-20, + 1.19779459543766230e-19, + 3.31019538714835682e-20, + 4.00814825978502279e-19, + 1.07140232334267256e-19, + 1.08307325647086370e-19, +-7.81191441606807203e-11, + 7.50478783773816010e-12, +-5.99910821026207966e-13, +-4.81158341705028941e-14, + 2.56575815725386400e-15, + 1.37291542852111858e-15, + 3.48057038953014607e-16, + 8.51454928710557754e-17, + 2.26282719119376019e-17, + 6.81186664189175863e-18, + 2.66924469308919513e-18, + 1.42395429128625563e-18, + 4.13266230585383847e-19, + 8.12188431390101133e-19, + 7.20296193185560673e-19, + 3.11293105171290333e-19, + 5.51190322221357704e-19, + 3.23191457680676254e-19, + 1.34243939602469734e-20, + 3.35238621688150765e-19, + 1.70784047532413852e-19, + 8.76375614127529168e-19, + 5.84966436453690778e-19, + 2.42803207147220258e-19, + 1.12407792337018995e-19, + 2.23770219343512833e-19, + 1.49963007892259151e-19, + 2.35168615454058430e-19, +-9.61913253185092163e-21, +-3.02865798327677445e-19, + 1.97898290938312001e-19, +-2.67187001149191855e-19, + 7.59001607515883767e-20, + 2.96133799960846446e-20, +-2.14271544457624234e-20, +-1.60779331551659141e-19, + 7.35347445655813560e-21, + 2.29023467279989045e-19, +-8.69897635098220406e-20, + 7.33840167313024734e-20, + 5.04295944054075696e-12, +-6.30231019063499144e-13, + 1.81037353249064619e-14, + 3.78520250286345898e-15, + 6.51879530178650016e-17, +-4.04857029622776147e-17, +-1.15324516159651961e-17, +-4.28549712936228457e-18, +-9.81340004647528042e-19, +-1.55334725628066757e-18, + 5.45501006545921375e-19, +-8.59482227980266832e-19, +-4.77820209303220380e-19, + 1.25659630951919999e-18, + 1.18425942663342196e-18, + 8.79492366300588005e-19, + 9.91461715186685091e-19, + 6.59581265344503771e-19, + 6.35711492187361359e-19, + 5.99130779032430070e-20, + 3.85622103806176175e-19, + 8.84256028930671253e-19, + 3.39975411575086027e-19, + 3.95168152566766881e-21, + 4.19974719097126046e-19, + 3.12453283615323743e-19, + 1.95901776054313730e-19, + 3.02008105436873833e-19, + 1.61744781763185962e-19, + 1.93147027372992842e-20, + 3.57680338514681458e-19, + 6.55416041962963160e-20, + 2.38894053651853886e-19, +-7.28521189509575319e-20, + 4.80468729292803367e-20, + 4.13569508477119313e-20, + 1.16341838873982467e-19, + 1.07486273288329819e-19, + 5.97795489899384997e-20, +-4.22735762301037837e-20, + 3.67661997046346356e-13, + 1.97690110705100841e-14, + 6.99758262545976956e-16, +-2.19642406134596593e-16, +-1.37606711923945664e-17, + 4.47943893213179555e-19, + 3.45565776499227488e-19, +-5.37902949432256083e-19, +-2.18497261464571799e-19, +-4.33368911431041552e-19, + 4.49156960253252713e-19, +-8.59385693059322917e-19, + 6.67058731178685515e-20, + 1.29035375206107185e-19, + 9.54519021764569794e-20, +-7.99988391028442712e-20, +-4.15238870685946710e-20, + 4.35950765001961101e-19, +-2.82469366493807725e-19, +-6.64110443119087190e-20, + 8.68584595184866539e-20, + 4.32066278501351534e-19, + 7.69221762106629382e-20, + 1.77377827650406523e-19, + 2.86223169158833646e-19, +-2.94099569919826014e-19, + 1.65629574557662811e-19, + 2.63045637101049188e-19, + 1.96076750988809914e-19, + 3.41417537023116065e-20, + 1.44825632644564623e-19, + 1.39455615990210162e-19, + 3.64338406337410402e-20, + 1.53206225502290931e-20, +-1.58987081601368846e-19, + 1.24222923160199689e-19, + 2.37568445849385088e-19, + 3.44494225886593457e-19, +-1.41529759605187832e-19, + 2.37130150212148029e-19, +-8.57813429196351609e-14, + 2.05603745584682664e-15, +-1.68095988877519432e-16, + 7.75785853486984486e-18, +-1.61321854090282855e-18, +-1.44062365806533989e-18, +-2.21510257186781778e-19, +-3.47458738037496559e-19, +-4.28012346216040143e-19, +-4.38789872098602486e-20, +-2.04626295915874077e-19, + 5.44431365787828610e-20, + 1.59628147296581479e-19, +-1.95666604540235336e-19, +-3.91549394558440579e-19, +-8.38688366302494985e-19, +-3.99454339057852706e-19, +-2.41696795721724146e-19, +-2.39774704182292174e-19, +-1.40895248221123248e-19, +-3.49659050576949322e-20, + 1.42155789553023208e-20, +-2.17715314081248662e-19, + 9.42277285166962920e-20, + 1.29108949232880426e-20, +-7.22129179128829577e-20, +-4.86057382804511268e-19, +-3.91308627897861919e-19, +-1.59885074146223569e-19, +-4.17187652970823845e-19, +-3.52823256611996350e-19, +-4.58217509864371494e-19, +-4.38912891561423752e-19, +-3.79901639215564879e-19, +-1.98032870619776046e-19, +-2.96885140406945917e-19, +-1.04051277763022935e-19, +-2.03403357172305722e-19, +-2.96133203780852331e-19, +-7.79394950856755896e-20, + 7.37239966088742316e-01, + 4.62828557669532514e-01, + 3.56977443029825259e-01, + 3.00745438826385547e-01, + 2.64836764362321619e-01, + 2.39369603006740372e-01, + 2.20090543378338194e-01, + 2.04836311576138769e-01, + 1.92374578658178169e-01, + 1.81944522604456482e-01, + 1.73047418857083690e-01, + 1.65340817477812929e-01, + 1.58580693492580027e-01, + 1.52587804007235039e-01, + 1.47227118722797923e-01, + 1.42394712186330208e-01, + 1.38009114896111978e-01, + 1.34005434194067935e-01, + 1.30331253841142330e-01, + 1.26943709196370824e-01, + 1.23807359251543209e-01, + 1.20892610968605888e-01, + 1.18174534089290129e-01, + 1.15631956955588519e-01, + 1.13246767831616593e-01, + 1.11003368705251362e-01, + 1.08888243733744519e-01, + 1.06889614934323293e-01, + 1.04997165009899210e-01, + 1.03201812366271198e-01, + 1.01495527088840035e-01, + 9.98711793470089260e-02, + 9.83224136816701344e-02, + 9.68435441095504834e-02, + 9.54294660890962626e-02, + 9.40755822352146998e-02, + 9.27777393149726570e-02, + 9.15321745538115322e-02, + 9.03354696686163583e-02, + 8.91845113468959366e-02, +-2.22024134738001838e-01, +-7.44237968784917242e-02, +-3.58615265141971756e-02, +-2.15922990416153211e-02, +-1.47636872218139623e-02, +-1.09057806306625746e-02, +-8.47914957717105580e-03, +-6.83643221211348209e-03, +-5.66359251125249288e-03, +-4.79174963251522822e-03, +-4.12280753536007228e-03, +-3.59627854959839680e-03, +-3.17304233433816007e-03, +-2.82679104703243995e-03, +-2.53924804550612017e-03, +-2.29736144326786202e-03, +-2.09158750735676403e-03, +-1.91480306227825923e-03, +-1.76159513438597687e-03, +-1.62778449844199358e-03, +-1.51009853996851313e-03, +-1.40594192141580581e-03, +-1.31323279567565222e-03, +-1.23028385993349072e-03, +-1.15571465717802138e-03, +-1.08838602122513623e-03, +-1.02735045498465109e-03, +-9.71814134529943056e-04, +-9.21107505397309400e-04, +-8.74662304505673615e-04, +-8.31993440135296754e-04, +-7.92684582161556255e-04, +-7.56376612707760948e-04, +-7.22758301456015309e-04, +-6.91558725394926087e-04, +-6.62541066981236094e-04, +-6.35497509365008564e-04, +-6.10245010688668411e-04, +-5.86621787294094453e-04, +-5.64484372064914981e-04, + 3.53567348810991042e-02, + 8.08949994366934232e-03, + 2.64711995535288520e-03, + 1.15882692483069158e-03, + 6.16882868455876786e-04, + 3.72574090023488637e-04, + 2.44967693127002097e-04, + 1.71108987345819689e-04, + 1.25044958688891474e-04, + 9.46423264668082509e-05, + 7.36650885652837759e-05, + 5.86638694055882499e-05, + 4.76154829072767045e-05, + 3.92750216796957237e-05, + 3.28452777048792897e-05, + 2.77981975186485458e-05, + 2.37737262898741057e-05, + 2.05201102733671013e-05, + 1.78574022805233445e-05, + 1.56544547369560875e-05, + 1.38140172508564663e-05, + 1.22628487690248925e-05, + 1.09450143459214533e-05, + 9.81725210630400406e-06, + 8.84571455312622530e-06, + 8.00363980841462210e-06, + 7.26966308517588879e-06, + 6.62657598054057040e-06, + 6.06040359554913744e-06, + 5.55971026560591122e-06, + 5.11507177759128062e-06, + 4.71867023255571189e-06, + 4.36398022641412045e-06, + 4.04552370367455731e-06, + 3.75867693640506247e-06, + 3.49951741464095743e-06, + 3.26470154669358504e-06, + 3.05136632682363848e-06, + 2.85704978302391532e-06, + 2.67962624104309231e-06, +-4.77626354470093127e-03, +-8.58679611179440820e-04, +-2.08647167248813441e-04, +-6.85142451725322479e-05, +-2.85974335306133055e-05, +-1.41390299996860710e-05, +-7.86317729638106166e-06, +-4.75841348552027362e-06, +-3.06753740538741372e-06, +-2.07695885708497553e-06, +-1.46245570814210992e-06, +-1.06326445894140563e-06, +-7.93915695386875316e-07, +-6.06308343755039034e-07, +-4.72058202611816817e-07, +-3.73730963229452435e-07, +-3.00243690532492489e-07, +-2.44337941321667616e-07, +-2.01134374825032074e-07, +-1.67276520007150125e-07, +-1.40407673972993153e-07, +-1.18842459444433499e-07, +-1.01355500728438829e-07, +-8.70424340968251358e-08, +-7.52266580395200222e-08, +-6.53956313202279362e-08, +-5.71566327206615231e-08, +-5.02055692004442966e-08, +-4.43046762730057810e-08, +-3.92663695865345198e-08, +-3.49414115226379337e-08, +-3.12101433976967939e-08, +-2.79759221812642799e-08, +-2.51601599839294256e-08, +-2.26985412841040583e-08, +-2.05381138518331604e-08, +-1.86350337241165503e-08, +-1.69528043263421375e-08, +-1.54608916248376932e-08, +-1.41336277689611525e-08, + 5.44719410199098687e-04, + 8.35045658204499746e-05, + 1.62706846863002728e-05, + 4.17815250342007693e-06, + 1.38649323400388852e-06, + 5.62991059182567911e-07, + 2.64986387359690598e-07, + 1.38940895461228091e-07, + 7.90130508499218493e-08, + 4.78582770535534957e-08, + 3.04853341913121042e-08, + 2.02348260269578688e-08, + 1.38991560931421857e-08, + 9.82785439108433995e-09, + 7.12371245660023784e-09, + 5.27581893181706029e-09, + 3.98142912467885302e-09, + 3.05485563593663525e-09, + 2.37871799683947938e-09, + 1.87681181819951122e-09, + 1.49847830917336977e-09, + 1.20931850821695046e-09, + 9.85523909588986951e-10, + 8.10328287652843130e-10, + 6.71737418765187763e-10, + 5.61046543916481240e-10, + 4.71854341430305787e-10, + 3.99395907904876222e-10, + 3.40084314865129358e-10, + 2.91191289422770685e-10, + 2.50621438068157019e-10, + 2.16750942826336671e-10, + 1.88310765639139133e-10, + 1.64301356378447691e-10, + 1.43929568145074965e-10, + 1.26561641535104183e-10, + 1.11687878421282809e-10, + 9.88958220336994489e-11, + 8.78497267005816498e-11, + 7.82748554662855074e-11, +-5.32717765177236421e-05, +-7.31351525758912001e-06, +-1.21176798929967159e-06, +-2.54429176161274290e-07, +-6.85520479769197876e-08, +-2.30133116124843912e-08, +-9.18172846476627183e-09, +-4.17258033790296557e-09, +-2.09332581017913961e-09, +-1.13427638356939885e-09, +-6.53630863779158005e-10, +-3.96087585641244442e-10, +-2.50285794020747872e-10, +-1.63854260322207255e-10, +-1.10573525291062613e-10, +-7.66045580095022439e-11, +-5.43047862952809439e-11, +-3.92847983037321870e-11, +-2.89356771752072335e-11, +-2.16591066050471627e-11, +-1.64491667413659898e-11, +-1.26573857701616336e-11, +-9.85646723418304808e-12, +-7.75935067692530492e-12, +-6.16966203437005171e-12, +-4.95088851883735628e-12, +-4.00667235983418236e-12, +-3.26805033844447849e-12, +-2.68508615234412769e-12, +-2.22110919616084592e-12, +-1.84896850560514818e-12, +-1.54830518924363245e-12, +-1.30375938834036536e-12, +-1.10357306069859335e-12, +-9.38709061217388817e-13, +-8.02182728193069311e-13, +-6.88508827435440140e-13, +-5.93388892804717167e-13, +-5.13424547226637535e-13, +-4.45877231334948916e-13, + 4.54228778614406936e-06, + 5.75869809913787431e-07, + 8.46423537094821895e-08, + 1.51412246535342510e-08, + 3.39993227297853123e-09, + 9.54049285707360035e-10, + 3.23723467665051312e-10, + 1.27604632122484035e-10, + 5.64844660624223849e-11, + 2.73808438945449726e-11, + 1.42738868996478724e-11, + 7.89680907741032557e-12, + 4.59042744133298491e-12, + 2.78243824254771802e-12, + 1.74809431071429693e-12, + 1.13289403423855018e-12, + 7.54414568404639801e-13, + 5.14552087088831113e-13, + 3.58511864271149867e-13, + 2.54592957181514188e-13, + 1.83927078589511855e-13, + 1.34931485153097773e-13, + 1.00404510792668556e-13, + 7.56760574384267611e-14, + 5.77160703861299003e-14, + 4.45007240110806325e-14, + 3.46477739997623693e-14, + 2.72379976106382627e-14, + 2.15876092864356762e-14, + 1.72550814172111299e-14, + 1.38960046955047275e-14, + 1.12723407189665326e-14, + 9.19965118266853589e-15, + 7.54818514568963421e-15, + 6.24366117871429079e-15, + 5.18408110108214462e-15, + 4.33077046177642313e-15, + 3.63497148018987222e-15, + 3.05475321094664492e-15, + 2.59377465226765985e-15, +-3.42629439604263479e-07, +-4.09263312408312679e-08, +-5.49818627481835782e-09, +-8.67350479505194595e-10, +-1.66898070629979692e-10, +-3.97460784994469584e-11, +-1.15367317373570436e-11, +-3.95107886015348117e-12, +-1.54377435197517410e-12, +-6.69534584896021193e-13, +-3.15749210991498114e-13, +-1.59476784476107890e-13, +-8.52757648513104251e-14, +-4.78628515388662097e-14, +-2.79951313574694036e-14, +-1.69612116064261941e-14, +-1.06144843612361455e-14, +-6.82269230119917035e-15, +-4.49335035504731535e-15, +-3.02170596591185643e-15, +-2.07097311368337186e-15, +-1.45839352879915232e-15, +-1.03205934222513125e-15, +-7.48957075865189686e-16, +-5.44721477864819705e-16, +-4.05006191457821701e-16, +-3.08033395851865133e-16, +-2.29548367885995262e-16, +-1.77354570741706822e-16, +-1.33884198786501532e-16, +-1.04722378172211890e-16, +-7.39768103122082728e-17, +-6.20403645997340738e-17, +-5.03897587177384096e-17, +-3.35986937449290120e-17, +-2.80246457506006266e-17, +-1.77398553818327179e-17, +-1.31227254577580294e-17, +-1.60170888246443298e-17, +-1.07286924814383297e-17, + 2.31456369885748070e-08, + 2.64054849906970169e-09, + 3.31165503209527900e-10, + 4.73467700597793862e-11, + 8.01745451855789328e-12, + 1.65017490680187127e-12, + 4.13345598464101434e-13, + 1.23394677903241498e-13, + 4.25872216133302662e-14, + 1.65256812423957719e-14, + 7.05547445883591448e-15, + 3.26489504366675798e-15, + 1.60127788865544205e-15, + 8.38765759659120279e-16, + 4.53184117987124615e-16, + 2.69716798023161516e-16, + 1.58503644013179723e-16, + 9.37063009109193304e-17, + 6.40133793733987472e-17, + 3.83532721847920372e-17, + 3.60045933462380669e-17, + 1.71537464637475777e-17, + 1.40092793317183719e-17, + 4.82216773430669889e-18, + 6.50420751229730057e-18, + 1.50496507973809596e-18, +-1.13942386887288170e-18, + 1.79981095459779726e-18, +-3.65319714676627937e-18, + 9.38535625288113336e-19, + 4.73418817966612404e-19, + 7.32064834997483170e-18, + 3.16424727890984178e-18, + 2.05580657022988146e-18, + 3.34716005430994684e-18, + 1.00610950412476221e-18, + 4.06544819303233567e-18, + 1.05466172388210231e-17, + 1.15495180509197070e-18, + 3.05852375416615923e-18, +-1.41471013255561413e-09, +-1.55634366833985759e-10, +-1.84994428593163937e-11, +-2.44792223671404434e-12, +-3.73432318861133190e-13, +-6.77291438983723701e-14, +-1.48143344516480214e-14, +-3.85991630976195382e-15, +-1.19195199890396692e-15, +-4.13768099242402060e-16, +-1.56821422483711050e-16, +-6.66790954872014279e-17, +-2.58614612673173133e-17, +-1.22801296104705282e-17, +-5.63083748753196587e-18, + 5.98618869415439746e-18, + 1.02883778839482065e-18, + 7.42922706508023238e-18, + 6.93285611651926027e-18, + 9.31443089540950916e-18, + 1.28868318288216729e-17, +-1.42484466369092946e-18, + 2.72294070977650987e-18, +-2.65745687447379239e-18, + 1.28412652879153017e-18, + 2.20076633050316272e-18, +-1.73961638714406708e-18, + 5.50051121808395621e-18, +-5.45966557661705944e-18, + 1.51193696062879141e-18, + 5.14667380757684746e-19, + 7.40042173422745738e-18, + 5.76351924587407068e-18, + 4.38478463649867071e-18, + 7.32776226210558901e-18, + 3.42746863983209357e-18, + 3.70571437663916202e-18, + 4.37844675327776910e-18, +-1.64255184183478188e-18, + 5.27056883179442245e-18, + 7.89180904530177214e-11, + 8.43048200249100654e-12, + 9.60236626733583182e-13, + 1.19499266825053151e-13, + 1.67541046530559515e-14, + 2.73116782919150648e-15, + 5.23311134775070621e-16, + 1.32751620963732822e-16, + 3.22671294829769426e-17, + 1.83636421864485301e-17, + 4.56036390059515264e-18, + 6.64843175589804827e-18, + 8.17778727142301412e-18, +-1.69934384577496839e-18, + 4.30903394693063553e-18, + 5.90312256766916214e-18, +-1.61001440283167384e-20, + 2.71671433011099500e-18, + 1.84246556045854159e-18, + 7.92356771615176573e-18, + 8.38012204475990983e-18, + 2.14852551479299360e-18, + 3.63820671061173262e-18, + 3.81447486630210774e-20, + 1.17865413178811669e-18, + 3.46616165036180314e-18, +-2.44844224543994735e-18, + 1.97479360016875442e-18, +-2.65649617290817359e-18, + 4.40976024572127871e-19, +-2.37187204077498544e-19, + 5.50756315922375081e-18, + 4.63500850105892258e-18, + 1.51822046678767721e-18, + 3.13891655586196584e-18, + 9.18146603062551596e-19, + 4.57796238542843947e-18, + 5.97057887804329493e-18, + 4.61687155135376016e-19, + 3.58302743241104762e-18, +-4.04751446658840817e-12, +-4.22038502691806595e-13, +-4.64389476489185291e-14, +-5.50063665502392535e-15, +-7.14599467117325264e-16, +-1.05850452777471385e-16, +-2.02607685371220039e-17, +-3.05698088832631652e-18, +-7.34660490661446398e-18, +-7.02048946742167034e-18, +-2.92229613598559339e-18, +-8.37838822579884578e-19, +-6.58592690177540102e-19, +-6.19051316023680007e-19, + 3.72939682293733821e-18, + 9.89602881789228130e-18, + 5.14126406979075809e-18, + 1.79961491643727937e-18, + 4.59327912346441564e-18, + 7.72208807443801010e-18, + 6.15063586742417300e-18, + 5.84984815843343901e-18, + 4.35281281959874018e-18, +-7.30621796379566859e-20, + 6.00848619648260326e-18, + 6.39645007359076767e-19, + 6.81092007905735901e-19, + 3.92070152384257697e-18, +-3.07674992131395680e-18, + 5.69143113046181794e-19, + 1.82959137167609071e-18, + 6.13675275655214224e-18, + 2.85597362484970623e-18, + 1.19254354077515511e-18, + 4.23544534072412753e-18, + 3.22353419872204095e-18, + 5.51824099300768759e-18, + 5.36846964578206135e-18, + 1.27871672522099428e-18, + 3.84544148437827467e-18, + 1.92017370490235204e-13, + 1.96102141558036927e-14, + 2.08691819420864110e-15, + 2.39881925896126724e-16, + 3.50684484763038625e-17, + 1.44065518579544625e-18, +-4.78753567020223743e-18, + 4.13954981302670934e-18, +-5.58790995215025500e-18, +-3.05832302933151946e-18, + 4.72028832577535562e-18, +-2.18792657578567293e-18, + 5.38667136866510557e-18, +-2.42570018478057761e-18, +-8.82637598561052680e-20, + 3.18411863091520246e-18, +-6.55447753037175813e-19, + 5.23385367802092922e-18, + 8.95402060716393700e-19, + 2.38046237938408046e-18, + 3.14933372481361144e-18, +-1.05776486679973453e-18, + 5.26475777171788722e-19, +-1.04578520677444444e-18, + 2.82536895191645736e-18, +-4.03977532708467476e-20, + 8.56779840084175994e-19, + 3.74428857697151501e-19, +-2.41659184821359648e-18, + 6.19811623281048161e-18, + 2.72580799047739473e-18, + 5.33847005637377113e-18, + 1.83004941504699441e-18, + 1.92311536474048240e-18, + 3.84931140063101876e-18, +-4.73254256561489834e-19, +-6.23895746300435008e-19, + 4.04508684431038126e-18, + 1.16999876606170990e-18, + 2.57820976055266796e-18, +-8.55635600545018950e-15, +-8.90931926120998672e-16, +-1.05442631216284073e-16, +-1.30981033617011326e-17, +-4.75196833869346382e-18, +-7.86495734644498412e-19, +-3.46389237699263470e-18, + 3.05282280969389443e-18, +-2.04648830135660967e-18, +-5.50053140224257799e-18, +-2.69906760050429345e-18, +-3.61030762746413521e-18, +-2.75549278728472584e-18, +-5.57864921615047155e-18, +-8.56355800444452257e-18, +-2.22448470322283143e-18, +-4.80823754093445358e-18, + 5.89275040170075042e-19, +-7.77815569981505465e-18, +-1.16168488171404044e-18, + 1.14158998375076615e-18, +-2.24146628181114137e-18, +-2.21865345720846857e-18, + 2.38716300936069963e-18, +-3.88936844767621014e-19, +-1.38655271050193165e-18, +-5.64081116869651414e-18, +-3.38170302196363015e-18, +-2.60236064552998245e-18, +-3.48151404111976490e-18, +-4.45114289872895619e-20, + 1.53826016445110869e-18, +-2.24126552637717142e-18, +-1.59086792600947045e-18, +-4.52089631288983049e-18, +-1.09927026100504612e-18, +-7.73650750691997068e-19, +-8.75661176241544010e-19, +-8.37003975332629113e-19, + 4.65006327598247517e-19, +// nroots = 2 +// root 0 + 6.80762805946769411e-01, + 5.43473117099473324e-01, + 4.10017872386520543e-01, + 3.09708123457607065e-01, + 2.43095573460293757e-01, + 1.98917229261980744e-01, + 1.68167369628083124e-01, + 1.45642961485165423e-01, + 1.28445627086255315e-01, + 1.14885323524210714e-01, + 1.03917691271508780e-01, + 9.48634399884604462e-02, + 8.72616731626775499e-02, + 8.07886109591941654e-02, + 7.52101037496268748e-02, + 7.03526100637529572e-02, + 6.60847700447497188e-02, + 6.23053187090619118e-02, + 5.89349313674533692e-02, + 5.59105850600563406e-02, + 5.31815743751438696e-02, + 5.07066416038817191e-02, + 4.84518737276820530e-02, + 4.63891373284699357e-02, + 4.44948974278317755e-02, + 4.27493146731925261e-02, + 4.11355472237328809e-02, + 3.96392051510941965e-02, + 3.82479198421454836e-02, + 3.69510010793722976e-02, + 3.57391616515685615e-02, + 3.46042944709849601e-02, + 3.35392908757880942e-02, + 3.25378915033385785e-02, + 3.15945631195079721e-02, + 3.07043962814174190e-02, + 2.98630198348162137e-02, + 2.90665291011602163e-02, + 2.83114252634994873e-02, + 2.75945639651758445e-02, +-6.31673139503715619e-02, +-7.19386651533996807e-02, +-5.97863158835605854e-02, +-4.07067810653997178e-02, +-2.65845214256049608e-02, +-1.80596809669001934e-02, +-1.29483349463114083e-02, +-9.71962353517384636e-03, +-7.56209913018108127e-03, +-6.05078190614217765e-03, +-4.95126921845069189e-03, +-4.12644836328851430e-03, +-3.49186422499962431e-03, +-2.99319760173230674e-03, +-2.59422325495231977e-03, +-2.27002972644603897e-03, +-2.00302872696862810e-03, +-1.78051540779492943e-03, +-1.59312696500791932e-03, +-1.43384045785308035e-03, +-1.29730453525471142e-03, +-1.17938370728507729e-03, +-1.07684126484244771e-03, +-9.87114649631321917e-04, +-9.08153700972060105e-04, +-8.38302439096590005e-04, +-7.76211489143413124e-04, +-7.20772393819202458e-04, +-6.71067778041826838e-04, +-6.26333139389544471e-04, +-5.85927264822565653e-04, +-5.49309117561730853e-04, +-5.16019625909355426e-04, +-4.85667220826810299e-04, +-4.57916265558571984e-04, +-4.32477734730577119e-04, +-4.09101656624928298e-04, +-3.87570947489885925e-04, +-3.67696352378801090e-04, +-3.49312271241008609e-04, +-2.26613656794571886e-03, + 3.14539898532008202e-04, + 2.37164185639430342e-03, + 2.17511237660053839e-03, + 1.36787265238009158e-03, + 8.08041915906188035e-04, + 4.97065960945458174e-04, + 3.24165116023009678e-04, + 2.22588379015598167e-04, + 1.59339610445469334e-04, + 1.17954079547692031e-04, + 8.97478150335738814e-05, + 6.98652400626376520e-05, + 5.54486068788267349e-05, + 4.47412911224823805e-05, + 3.66229124555414044e-05, + 3.03558904595509301e-05, + 2.54411275239376843e-05, + 2.15326756793063185e-05, + 1.83855924273367654e-05, + 1.58231405986670243e-05, + 1.37156187534176637e-05, + 1.19663804560445308e-05, + 1.05024084045532743e-05, + 9.26783959808857284e-06, + 8.21944146669105426e-06, + 7.32340173574416513e-06, + 6.55301792394250594e-06, + 5.88701247786619704e-06, + 5.30828922137677151e-06, + 4.80300521609326159e-06, + 4.35987080866229628e-06, + 3.96961664022461650e-06, + 3.62458411543961356e-06, + 3.31840806707795160e-06, + 3.04576890754719143e-06, + 2.80219760726095300e-06, + 2.58392116264621313e-06, + 2.38773933658359172e-06, + 2.21092572786544122e-06, + 1.23790502781878989e-04, + 2.55233546428569548e-04, + 6.26281240373687659e-05, +-6.51840295694568596e-05, +-5.98020011365445948e-05, +-3.45080988018283341e-05, +-1.88661884567462194e-05, +-1.07860734004969703e-05, +-6.54904146565783232e-06, +-4.19571245714654442e-06, +-2.80999019236417397e-06, +-1.95195904318525911e-06, +-1.39786385217935557e-06, +-1.02717840010591965e-06, +-7.71631015519408661e-07, +-5.90845882128741508e-07, +-4.60043369894293760e-07, +-3.63518881585765614e-07, +-2.91035260902289408e-07, +-2.35751479221540483e-07, +-1.92993835755337843e-07, +-1.59505508361691209e-07, +-1.32976201686718674e-07, +-1.11740396453753764e-07, +-9.45796407861698795e-08, +-8.05905063327613054e-08, +-6.90948455859315915e-08, +-5.95778144119805130e-08, +-5.16444345064295660e-08, +-4.49887331310861813e-08, +-3.93715406169997189e-08, +-3.46043290708633445e-08, +-3.05373196650026385e-08, +-2.70506417689061552e-08, +-2.40476980789258461e-08, +-2.14501406468482263e-08, +-1.91940347893170360e-08, +-1.72269067562919810e-08, +-1.55054547100644752e-08, +-1.39937613879093999e-08, + 1.55893133754410813e-05, +-3.90444840682888261e-06, +-1.38520074834271645e-05, +-2.29382807592421697e-06, + 1.65707541629717426e-06, + 1.30672956646946760e-06, + 6.92172772032106288e-07, + 3.55896093278660147e-07, + 1.92343679486458584e-07, + 1.10443840527702355e-07, + 6.69378260341036022e-08, + 4.24535042785537313e-08, + 2.79684243683646684e-08, + 1.90283457243579671e-08, + 1.33079397934477086e-08, + 9.53225267446333811e-09, + 6.97195499326249319e-09, + 5.19418713150706235e-09, + 3.93362740095353927e-09, + 3.02295181101279435e-09, + 2.35393349643691521e-09, + 1.85496605786918221e-09, + 1.47769580540907328e-09, + 1.18886218411551467e-09, + 9.65198885520378323e-10, + 7.90178958335365165e-10, + 6.51896189048037412e-10, + 5.41661264422794629e-10, + 4.53056223164013044e-10, + 3.81287835641378276e-10, + 3.22739233025057503e-10, + 2.74654838304434975e-10, + 2.34916363618455391e-10, + 2.01881705814461729e-10, + 1.74267834582957255e-10, + 1.51064824064738424e-10, + 1.31472162240905297e-10, + 1.14851152265978429e-10, + 1.00689019108183475e-10, + 8.85716591567371993e-11, +-4.83326540716553699e-08, +-1.38684331876274916e-06, + 4.28434294955298784e-07, + 4.35000058838331658e-07, + 3.04232360558800436e-08, +-3.60775476126489765e-08, +-2.33272048379709056e-08, +-1.14659862156563838e-08, +-5.61564986223360638e-09, +-2.90346568758980594e-09, +-1.59415126451979733e-09, +-9.23287765156501119e-10, +-5.59587424956338237e-10, +-3.52497223867656347e-10, +-2.29515441483840065e-10, +-1.53786030333494655e-10, +-1.05659947127149734e-10, +-7.42178269344063183e-11, +-5.31668425365167399e-11, +-3.87621691911794587e-11, +-2.87107755857184445e-11, +-2.15722892290959386e-11, +-1.64208718810877714e-11, +-1.26489025645956029e-11, +-9.84999587985019965e-12, +-7.74759888679970072e-12, +-6.15051032410397276e-12, +-4.92459735480483078e-12, +-3.97447810481615931e-12, +-3.23148420580821617e-12, +-2.64557917402869533e-12, +-2.17993208878990332e-12, +-1.80715213154214223e-12, +-1.50666112835242227e-12, +-1.26287565377248389e-12, +-1.06388525007581982e-12, +-9.00533741915031826e-13, +-7.65705738646162277e-13, +-6.53849920175433174e-13, +-5.60599935843225712e-13, +-8.67087170056464191e-08, + 3.47397991931307688e-08, + 5.00993385067259523e-08, +-2.40953231178015096e-08, +-7.72652517395246582e-09, + 2.79301438664913139e-11, + 6.38335874864238794e-10, + 3.48459430629414496e-10, + 1.61288294716347797e-10, + 7.60179186644074427e-11, + 3.79311395379329006e-11, + 2.00762607928797165e-11, + 1.11957615243870455e-11, + 6.52992251708476481e-12, + 3.95833529983492858e-12, + 2.48106710492789658e-12, + 1.60127586263335869e-12, + 1.06047074153866718e-12, + 7.18601018316187864e-13, + 4.97030391511692660e-13, + 3.50185524653636331e-13, + 2.50876944926877214e-13, + 1.82477131682406778e-13, + 1.34578775261931348e-13, + 1.00518543196911169e-13, + 7.59623443915528834e-14, + 5.80257255715483047e-14, + 4.47714445956119959e-14, + 3.48677826486111258e-14, + 2.73867564077885128e-14, + 2.16874352489522694e-14, + 1.73055387910120433e-14, + 1.39034537831177196e-14, + 1.12450860016362953e-14, + 9.15269384556742225e-15, + 7.49504423119150225e-15, + 6.16945515344795320e-15, + 5.10626060468315575e-15, + 4.24705995595439157e-15, + 3.54884468137037075e-15, +-3.04641345510981341e-09, + 7.96151970097861705e-09, +-4.87724635862642462e-09, +-1.78732358306690935e-11, + 5.49832445603480769e-10, + 8.38575351511903797e-11, +-7.93929708300297509e-12, +-9.24581572436889132e-12, +-4.45338285198978961e-12, +-1.96843173280219504e-12, +-9.00044615130537248e-13, +-4.36279043180221937e-13, +-2.23969847681568363e-13, +-1.20963912739242967e-13, +-6.82646434849309812e-14, +-4.00290893804801930e-14, +-2.42679557213440099e-14, +-1.51566814246354758e-14, +-9.71508962516809830e-15, +-6.37407213283077003e-15, +-4.27014423323314369e-15, +-2.91437195959050359e-15, +-2.02816743195388821e-15, +-1.43069789166553913e-15, +-1.02681955214503495e-15, +-7.47955543784921534e-16, +-5.48185839687710280e-16, +-4.05716291212485760e-16, +-3.03437770522100750e-16, +-2.32338868028407139e-16, +-1.76609029917064663e-16, +-1.34826867986655575e-16, +-1.05842129480819573e-16, +-8.31994441349123676e-17, +-6.59015150701886346e-17, +-5.05363500260542961e-17, +-3.96447496273074016e-17, +-3.17725201945700699e-17, +-2.63609661255796409e-17, +-2.09039446959901954e-17, + 3.67808351694894870e-10, +-2.70872027635929351e-10, +-2.25519766510479097e-11, + 1.04626922072110632e-10, +-2.03309888036801472e-11, +-6.90916778146385877e-12, +-5.65842682562090683e-13, + 1.67625943417722870e-13, + 1.12560254528634518e-13, + 4.96489753935119820e-14, + 2.12039083665413298e-14, + 9.46251627131652963e-15, + 4.47972464968308785e-15, + 2.24004331163015286e-15, + 1.17673710215466351e-15, + 6.44303371475946449e-16, + 3.66919116381257152e-16, + 2.17214711392128180e-16, + 1.29928273258338633e-16, + 8.02739238420441961e-17, + 5.37403533331670102e-17, + 3.61924270042006651e-17, + 2.17384837296310061e-17, + 1.58516691684637037e-17, + 9.96601439806880706e-18, + 5.10322163046790344e-18, + 1.78269378795148197e-18, + 2.16525784379132667e-18, + 5.03382617416269513e-18, +-9.17419664447197400e-20, + 1.11277200742897196e-18, + 3.04785252096045281e-18, + 1.02313977953030003e-18, + 9.65921905756004114e-19, + 5.96512608574016470e-19, + 1.91027351505696922e-18, + 9.27451724489565807e-19, + 7.44972318528859376e-19, + 6.08739771536309789e-19, + 1.84756694217632937e-19, + 3.14711849453701179e-11, +-4.60169013758462820e-11, + 2.75700850721365363e-11, +-7.67516117892717613e-12, +-1.25706086852631196e-13, + 3.50082464777558681e-13, + 5.80144991302472476e-14, + 1.48861539887703437e-15, +-2.29677028129596475e-15, +-1.18991365565121649e-15, +-4.89165524691946006e-16, +-2.08021859473911089e-16, +-9.13386292054445261e-17, +-3.81547807151500846e-17, +-1.89471397108927045e-17, +-9.11051233531540239e-18, +-4.32376376464774689e-18, +-3.02361478615021154e-18, +-2.70748583357832615e-18, +-1.96108113507146352e-18, + 1.18190480052285209e-18, + 1.31782318118402674e-18, +-1.11666745981347465e-20, + 1.67231031182591106e-18, +-5.67101583677902533e-19, +-3.21098800502439972e-18, +-1.21993572152451379e-19, + 9.30246784024812458e-19, + 1.50953305463890235e-18, + 2.38931316270802516e-19, + 1.31150507640653062e-18, + 2.82892657464627881e-18, + 1.85266421642754926e-18, + 1.05619564738379975e-18, + 5.44783607352169121e-20, + 2.47726620140530601e-18, + 6.99643145468218820e-19, + 1.63112360494793344e-18, + 1.45764908732758515e-18, + 1.29777783029536802e-18, +-8.75401318153104612e-13, + 1.97885107018734567e-12, +-1.25427877739822024e-12, + 1.15405234673260771e-13, + 7.55474982047603083e-14, +-1.09318189581434612e-14, +-3.30345561117134035e-15, +-3.45249623769380693e-16, + 2.07438336056407214e-17, + 2.38305999991629355e-17, + 1.38378387693996793e-17, + 2.64473788050020485e-18, + 3.02144264691084714e-18, + 1.18562057421757055e-18, + 7.94822415056438596e-19, + 2.01239925882236360e-18, + 1.08801323008991644e-19, +-2.09356891620916978e-18, + 1.90945590033191968e-19, +-1.43105007764775954e-18, +-1.06705357503713750e-18, + 1.60846054255883493e-18, + 7.05094653497948585e-20, + 1.61383156077898037e-19, +-1.27924598234710291e-18, +-2.12162464311330531e-18, +-1.27017589444376176e-18, + 1.27560297165626143e-18, + 1.68420682029608633e-18, +-7.39153019297532703e-20, + 1.22832872081567911e-18, + 4.29234148415166215e-19, + 1.31413778627291764e-18, + 1.35492702555438166e-18, +-9.19818498031674589e-21, + 1.73179459453271275e-18, + 6.91333713488859929e-19, + 9.55457155600516536e-19, + 7.27244927210817868e-19, + 3.13581572369798172e-19, +-2.12393933365472880e-13, + 2.64525406691844611e-13, +-8.73060793558213547e-14, + 2.44122746181565687e-14, +-5.62973177246495973e-15, + 8.86770336264350994e-18, + 1.27819753940494964e-16, + 1.93309034803981592e-17, +-3.20385081159578724e-18, +-4.61355185397311214e-18, +-2.25614011680813145e-18, +-1.33883441300654797e-18, + 2.02593957160372292e-19, + 3.68860879442714832e-18, + 3.41155418979299557e-18, + 2.77250635061585706e-18, + 2.66530776737953332e-18, + 3.15383587853336013e-18, + 1.27262280217963920e-19, + 6.96584207488188173e-19, + 2.68198371834856076e-18, + 3.28667059648293972e-18, + 1.95059781797839002e-18, + 2.11643675814344958e-18, + 1.76886162001211294e-18, + 1.42604024066822949e-19, +-1.70231217812285501e-18, + 1.46146945586293513e-18, + 2.27412384274647606e-18, +-4.81648244680999172e-19, + 1.74887844198137939e-18, + 2.06551346773672052e-18, + 9.05075628599102441e-19, +-2.48827525784826990e-19, +-2.99378548712293133e-19, + 5.37427411957370017e-19, + 1.35231628927789511e-18, + 1.21910840884783540e-18, + 5.92835193970685210e-19, + 6.06696763103994662e-19, +-3.16680583520791202e-15, +-1.39222976540340314e-14, + 1.10950324333914183e-14, +-2.27604841127541993e-15, + 1.91461619540455699e-16, + 2.31444242628951186e-17, +-4.84123529269741642e-18, +-8.66200920337053313e-18, + 3.27551472957803913e-18, + 5.19937046667770279e-20, +-1.65895275600950766e-18, +-9.22131411451710307e-19, + 1.77906095476802552e-18, +-1.04992006767326568e-18, + 4.19390679901870323e-19, + 2.25054016359927103e-18, +-5.26552945130078103e-18, +-8.43226435450760239e-19, +-1.19692277833043721e-18, +-9.91097474678840616e-19, +-2.03519199826100074e-19, + 9.66047450147901604e-19, +-1.16553607068051021e-18, +-7.35118007044551300e-19, +-2.63347600819887873e-18, +-1.63319516120241388e-18, + 7.44573573559226760e-19, + 1.68099910565066699e-18, + 8.89198996787697690e-19, + 1.57919308473098052e-18, +-4.26196783822779010e-19, + 1.11197039304556545e-18, + 1.33548535425268505e-18, +-6.17528744213539546e-19, + 1.57095960647931975e-18, + 1.28153697466346282e-18, + 1.54752258121639107e-18, + 1.18266841742859076e-18, + 9.97535756674329062e-19, + 1.96570801193473144e-19, + 1.04664962808117496e-15, +-1.55633881506799762e-15, +-1.14722649141251550e-16, + 5.95960004198587454e-17, +-1.12568588243585608e-17, +-3.63884942901108425e-18, +-3.94669032322083634e-18, +-1.40852756772823837e-19, +-2.40363334743688156e-18, +-6.09690808157579250e-19, + 3.03811452852180845e-19, +-3.23390796089864373e-18, +-5.56043764208668235e-19, +-4.67419383803528130e-18, +-3.48481430297483677e-18, +-1.65909838924456683e-18, +-2.53732761444106151e-18, +-1.49179204008132953e-18, +-1.69237625468204738e-18, +-1.25542208378452898e-18, + 1.15877847189471948e-19, +-1.29475997265772600e-18, +-1.42441410411773975e-18, + 5.66458729162946816e-19, +-7.01669227979244886e-19, +-1.25768311009965165e-18, +-3.10531713816451490e-18, +-3.35359078830051727e-18, +-2.58644975421366041e-18, +-1.69746350711146408e-18, +-2.43893035709472924e-18, +-1.59227373164663210e-18, +-1.75246319600883464e-18, +-1.73771818918999571e-18, +-9.99448426045984054e-19, +-1.31148494358557852e-18, +-1.31312942980700991e-18, +-1.94554832134292176e-18, +-1.05754899794642261e-18, +-1.92633264253086126e-18, + 1.97256667786868595e-01, + 6.69098602241017804e-02, + 3.73836848323655310e-02, + 2.83797223673166107e-02, + 2.44147417652991298e-02, + 2.19776396788305892e-02, + 2.01954886952396308e-02, + 1.87942853762761881e-02, + 1.76507184472995751e-02, + 1.66937232858744879e-02, + 1.58773967446304218e-02, + 1.51703026829803338e-02, + 1.45500497296517737e-02, + 1.40001918722491275e-02, + 1.35083398329175226e-02, + 1.30649582720039764e-02, + 1.26625722232876041e-02, + 1.22952276744380581e-02, + 1.19581153459130275e-02, + 1.16473023336252542e-02, + 1.13595368644837519e-02, + 1.10921037266567355e-02, + 1.08427155263288669e-02, + 1.06094297276842532e-02, + 1.03905845479928260e-02, + 1.01847488429769421e-02, + 9.99068251095861642e-03, + 9.80730490188356195e-03, + 9.63366938610612025e-03, + 9.46894271183302584e-03, + 9.31238812067237270e-03, + 9.16335143847820700e-03, + 9.02124954101249897e-03, + 8.88556072958954397e-03, + 8.75581665379539242e-03, + 8.63159549568838502e-03, + 8.51251618904680547e-03, + 8.39823349287230347e-03, + 8.28843377384540052e-03, + 8.18283138022270727e-03, +-1.21463829959438427e-01, +-2.53637044631925893e-02, +-6.94959815065305641e-03, +-2.64564481661124732e-03, +-1.45781399622718633e-03, +-1.01459422280986535e-03, +-7.79690969715439550e-04, +-6.27451004625169937e-04, +-5.19665788816921280e-04, +-4.39653486285564090e-04, +-3.78274871727777532e-04, +-3.29964728178118796e-04, +-2.91132060898070539e-04, +-2.59362911288890392e-04, +-2.32980349132751825e-04, +-2.10786839844248072e-04, +-1.91906729444600116e-04, +-1.75686454389077808e-04, +-1.61629365090456911e-04, +-1.49352010488476979e-04, +-1.38554122610136848e-04, +-1.28997574798420854e-04, +-1.20491354022161801e-04, +-1.12880647363614852e-04, +-1.06038795532054677e-04, +-9.98612780826400160e-05, +-9.42611605375691299e-05, +-8.91656081945030923e-05, +-8.45131882867684148e-05, +-8.02517617052129025e-05, +-7.63368204552648664e-05, +-7.27301655362611206e-05, +-6.93988472690898912e-05, +-6.63143097400246875e-05, +-6.34516952996171975e-05, +-6.07892755334255673e-05, +-5.83079828901977485e-05, +-5.59910229665841803e-05, +-5.38235518353773302e-05, +-5.17924061433893478e-05, + 2.48836560520231224e-02, + 4.41334572394793886e-03, + 9.75095822095739398e-04, + 2.50341677012898387e-04, + 8.07724130866584178e-05, + 3.76339125067450079e-05, + 2.29143679114127419e-05, + 1.57509840756826056e-05, + 1.14788052463882671e-05, + 8.68420543035753791e-06, + 6.75896096787831596e-06, + 5.38251668673404330e-06, + 4.36880258922550936e-06, + 3.60355044279066980e-06, + 3.01361038553476548e-06, + 2.55053214492053646e-06, + 2.18128002919210374e-06, + 1.88275519745628733e-06, + 1.63844718711214655e-06, + 1.43632298397071686e-06, + 1.26745969832706236e-06, + 1.12513733834189930e-06, + 1.00422377713560470e-06, + 9.00749663700804313e-07, + 8.11609432317748320e-07, + 7.34347634933619833e-07, + 6.67004015817033882e-07, + 6.07999674585759944e-07, + 5.56052390372143760e-07, + 5.10112921394432076e-07, + 4.69316579994411440e-07, + 4.32946060574730936e-07, + 4.00402646155672402e-07, + 3.71183715780148257e-07, + 3.44865034508294124e-07, + 3.21086705344343176e-07, + 2.99541948033638821e-07, + 2.79968076906627532e-07, + 2.62139201822029015e-07, + 2.45860288532780063e-07, +-3.74811624844459228e-03, +-5.82524313652952957e-04, +-1.14479383292995094e-04, +-2.63811105175243080e-05, +-6.33840215625377863e-06, +-1.86506547167604573e-06, +-7.96790871706148035e-07, +-4.45693237205439112e-07, +-2.82483495532168723e-07, +-1.90676277898238635e-07, +-1.34194509596146616e-07, +-9.75575242210784973e-08, +-7.28432412615158108e-08, +-5.56298387114849486e-08, +-4.33121482185208670e-08, +-3.42904548912358418e-08, +-2.75478718948429128e-08, +-2.24184238216489267e-08, +-1.84544227379465550e-08, +-1.53479066761892367e-08, +-1.28826441200193170e-08, +-1.09039988187815535e-08, +-9.29954046316683978e-09, +-7.98629213044170898e-09, +-6.90217447791220612e-09, +-6.00016096947131461e-09, +-5.24421876293595740e-09, +-4.60644680178901151e-09, +-4.06502978733193479e-09, +-3.60275653688402094e-09, +-3.20593424051357223e-09, +-2.86358401152262281e-09, +-2.56683868633650305e-09, +-2.30848769114588214e-09, +-2.08262996707114240e-09, +-1.88440705673054117e-09, +-1.70979620208660638e-09, +-1.55544877906936803e-09, +-1.41856323777893927e-09, +-1.29678451039985536e-09, + 4.52555228326584249e-04, + 6.30200902963680556e-05, + 1.07476460990009849e-05, + 2.37264672750519601e-06, + 5.39034183507209427e-07, + 1.20432474612435421e-07, + 3.39533995059927842e-08, + 1.39539372508698808e-08, + 7.38954246271802109e-09, + 4.40649811917549153e-09, + 2.79871639995984175e-09, + 1.85674819974721988e-09, + 1.27528826406221900e-09, + 9.01724113086551841e-10, + 6.53612957939665285e-10, + 4.84065421075953974e-10, + 3.65302929625667524e-10, + 2.80288226868670925e-10, + 2.18251441655939098e-10, + 1.72200692923719876e-10, + 1.37487945424919712e-10, + 1.10957041266350169e-10, + 9.04235033294891303e-11, + 7.43490059684969445e-11, + 6.16330559207635852e-11, + 5.14769800275055142e-11, + 4.32934433235670159e-11, + 3.66452579082845726e-11, + 3.12033188890040483e-11, + 2.67172984338638667e-11, + 2.29949457011916456e-11, + 1.98872697923421713e-11, + 1.72778349541524819e-11, + 1.50749296305493585e-11, + 1.32057835947851912e-11, + 1.16122464987887688e-11, + 1.02475532079225514e-11, + 9.07385996703691183e-12, + 8.06036284481994966e-12, + 7.18185113661616235e-12, +-4.57285778289221953e-05, +-5.90937750659679406e-06, +-8.66367886598797716e-07, +-1.71531776274527757e-07, +-4.07330854940685035e-08, +-8.56736452751612861e-09, +-1.81344385390652431e-09, +-5.09604314055802146e-10, +-2.07195349895800146e-10, +-1.05771485342791528e-10, +-6.01545885016253869e-11, +-3.63607480516250301e-11, +-2.29660811654998271e-11, +-1.50340992161859761e-11, +-1.01453291355151485e-11, +-7.02860232160831462e-12, +-4.98255781984920295e-12, +-3.60444775624861158e-12, +-2.65489856901978902e-12, +-1.98726002617457483e-12, +-1.50924038225357926e-12, +-1.16133611305481176e-12, +-9.04347707167437879e-13, +-7.11933781392484929e-13, +-5.66078028141824543e-13, +-4.54251982539920604e-13, +-3.67618482989963094e-13, +-2.99848531116316263e-13, +-2.46359994156779767e-13, +-2.03790585370477780e-13, +-1.69645359120240323e-13, +-1.42059725929059053e-13, +-1.19621971851011486e-13, +-1.01255521616127145e-13, +-8.61290911768611896e-14, +-7.36020617291450795e-14, +-6.31729266913776026e-14, +-5.44449100031098086e-14, +-4.71079953679244126e-14, +-4.09112099626844771e-14, + 3.96784523892111311e-06, + 4.87529060448941706e-07, + 6.50043374485581383e-08, + 1.03081007295093600e-08, + 2.52086114104966741e-09, + 5.69479703472735708e-10, + 1.09256515128110648e-10, + 2.26657372690062072e-11, + 6.53490142690117323e-12, + 2.66766439197180430e-12, + 1.32665047496469364e-12, + 7.26338298210070962e-13, + 4.21363129002027304e-13, + 2.55312733139217977e-13, + 1.60391794409319278e-13, + 1.03945096103315157e-13, + 6.92181709400489585e-14, + 4.72111346350197562e-14, + 3.28932588639693424e-14, + 2.33588171527566312e-14, + 1.68745194578492074e-14, + 1.23810511260671624e-14, + 9.21209604474186723e-15, + 6.94354028175898229e-15, + 5.29537722126876383e-15, + 4.08358413760129174e-15, + 3.17932758560721461e-15, + 2.49946833071829204e-15, + 1.98202435236804469e-15, + 1.58317947659652995e-15, + 1.27540691614971282e-15, + 1.03434326495125526e-15, + 8.43929482754341559e-16, + 6.92104666644029803e-16, + 5.72112016876089588e-16, + 4.75168983060129280e-16, + 3.96744335059813576e-16, + 3.33530500518006723e-16, + 2.80344940771653072e-16, + 2.37390593366984897e-16, +-3.01707184113679202e-07, +-3.54777007024968983e-08, +-4.60322041024004339e-09, +-5.79986227047215164e-10, +-1.23687543424319613e-10, +-3.24408716810155739e-11, +-6.45939515634269588e-12, +-1.15973839481393455e-12, +-2.44144046478341523e-13, +-7.35282292895955212e-14, +-3.03199828272480638e-14, +-1.47760201019041381e-14, +-7.83943181918303764e-15, +-4.39232222730464919e-15, +-2.56912123475759921e-15, +-1.55699547488546497e-15, +-9.74195935231002805e-16, +-6.25954810277378154e-16, +-4.12808344789100945e-16, +-2.77937700467237538e-16, +-1.90749754668537251e-16, +-1.33457465329849779e-16, +-9.50702598800078588e-17, +-6.87576441606969492e-17, +-5.05797209906554953e-17, +-3.68544974313275207e-17, +-2.78265769290489843e-17, +-2.06028238768075122e-17, +-1.56055700548849655e-17, +-1.25437424710589619e-17, +-9.54129148108760882e-18, +-6.43868419128907090e-18, +-5.78326488681014820e-18, +-4.91231264551662802e-18, +-3.85746035832795129e-18, +-2.91112202035490350e-18, +-2.41976158204016783e-18, +-1.58214198337274917e-18, +-1.84770176111433035e-18, +-1.48204843825630791e-18, + 2.04166912179949876e-08, + 2.31336452758856304e-09, + 2.91273407919136086e-10, + 3.55110481142881584e-11, + 4.83248233530945505e-12, + 1.50473641156933887e-12, + 3.43701905810702703e-13, + 6.08483481460159400e-14, + 1.06097052803178426e-14, + 2.33412625099952168e-15, + 7.41095868815125109e-16, + 3.09117008901710207e-16, + 1.48304159439102225e-16, + 7.69502662120484806e-17, + 4.13239757409236812e-17, + 2.40265699897362607e-17, + 1.39856558740998466e-17, + 8.72189890412764214e-18, + 5.33521018009257170e-18, + 3.63744919671542472e-18, + 2.60390879183461310e-18, + 2.29062428892747774e-18, + 6.65536988620480842e-19, + 9.61074559804205011e-19, + 4.04447376282078491e-19, + 6.03893208254414915e-19, +-6.57724307979262256e-20, + 9.60674937838175026e-19, + 2.94845404694084910e-19, +-1.41551830711749926e-19, + 1.05657934830985646e-19, + 7.88304942883487718e-19, + 5.81050623092228941e-19, +-5.54791111518435236e-19, +-1.12275139229449736e-19, +-2.93320728234152270e-19, + 1.74907014628215576e-19, + 2.10159505791550612e-20, +-1.54998783175690972e-19, + 8.28900075717296139e-20, +-1.24301255379524364e-09, +-1.37921802412166050e-10, +-1.58931004817466112e-11, +-2.29168471775083840e-12, +-1.77751155885928182e-13, +-5.32257421912000237e-14, +-1.56793268520945603e-14, +-3.00202836800984740e-15, +-4.91628933871417485e-16, +-8.57191067051423749e-17, +-1.97088432333838887e-17, +-5.86112422696509947e-18, +-2.66042627580956014e-18, +-4.37832773478677986e-19, +-9.32247563350547983e-19, + 7.62314911590880634e-20, +-1.98167148821943711e-19, +-1.81139882476548808e-19, +-2.59002633456676664e-20, + 2.03143457633960052e-19, + 3.07118485214866840e-19, + 6.77438406510289270e-19, +-1.43386615338327936e-19, + 2.02011511487673455e-19, +-1.87733901947119560e-19, + 7.29937271879492831e-19, +-4.51328234108696196e-19, + 6.88475591906210446e-19, + 3.86874061717924712e-19, + 4.62612509057192960e-20, + 1.53383581851635768e-19, + 6.41483016355821514e-19, + 4.91185473648350277e-19, +-1.03633121719736369e-19, + 2.38053534952264115e-19, + 6.94552888073544624e-20, + 3.11355578588314352e-19, + 4.68475110787874769e-19, +-9.25549133162217061e-20, +-1.41759607831774643e-19, + 6.87419885245918413e-11, + 7.51853674650284731e-12, + 7.98372775247333714e-13, + 1.26730631515328448e-13, + 9.82146545116003796e-15, + 1.22764237706063932e-15, + 5.83733214964363834e-16, + 1.33361878644244389e-16, + 2.19853810526273008e-17, + 3.55415602009841232e-18, + 1.59093561224298314e-18, + 1.01363851886832664e-18, + 6.70902155819021643e-19, + 5.56979167817747614e-19, + 1.73398104436266378e-19, + 7.00221123671084918e-20, + 3.05829629645797375e-19, + 3.83643603694091994e-19, +-6.08755860225748151e-20, + 3.17418937369260500e-19, + 5.29447803549877885e-19, + 2.89145006679821466e-19, + 1.59632412368308329e-19, + 4.54055569619206860e-19, +-3.23031582541834761e-19, + 1.30122189281429912e-19, +-3.52529064358748422e-19, + 4.05961378209615676e-19, + 2.69075350839990593e-19, + 7.37660389432203925e-20, + 2.21278248484357225e-19, + 4.47877257497736634e-19, + 4.50814326856024888e-19, +-1.37564099920511333e-19, +-1.38159828982167916e-19, +-8.96176148501054581e-20, + 1.03413975475012839e-19, + 4.35347318630003055e-19, +-1.70115345134264998e-19, +-1.27252971950007022e-19, +-3.48468150712003801e-12, +-3.71431034776099803e-13, +-4.19787729525140459e-14, +-4.85507637867320129e-15, +-7.64297166248819797e-16, +-9.62904554834702797e-18, +-1.64362767750881999e-17, +-5.45928076208742721e-18, +-1.49240350281667916e-18, + 4.29690042976444577e-19, +-2.18215101288271678e-19, + 1.82835416030908169e-19, + 3.41153456208082808e-19, + 5.64792346972724060e-19, +-2.04900430749485230e-21, + 5.14877383664049135e-19, + 4.38821907956660674e-19, + 3.48151577262120433e-19, + 2.79026837591913738e-19, + 4.11530325058845607e-19, + 6.51694050682491624e-19, + 5.88060331937395862e-19, +-1.61819151770067752e-20, + 1.67870655184030506e-19, + 4.20416332575661592e-19, + 2.51122644302705366e-19, + 2.07173703387277762e-19, + 5.95389495412407090e-19, + 3.53055229917591763e-19, +-3.94135805254853251e-21, + 2.31712768840376096e-19, + 5.26891614031383605e-19, + 2.38165933676482751e-19, + 1.57229999087512530e-19, + 1.01213661179300262e-19, +-1.87717064535161224e-19, +-2.63228640747698954e-20, + 4.08548642845307372e-19, + 2.58266062218288362e-19, + 2.97029113899388613e-19, + 1.62970327552356780e-13, + 1.70465743204174262e-14, + 2.15577156092906795e-15, + 1.00821909189538092e-16, + 4.98083764402699026e-17, +-3.77019323792735590e-19, +-4.17841370074284597e-19, +-2.13989680838472613e-19, +-3.61601698405219375e-20, + 1.74161130503449335e-19, + 3.49399507890427285e-20, + 7.48382991949783007e-19, + 1.94975066933250438e-19, + 2.23993966776673526e-19, +-4.79979023143192068e-19, +-3.60203825819383152e-20, +-8.22428931821061320e-20, +-1.66243902478362697e-19, +-2.45259671728023777e-20, + 1.17102901087684283e-19, +-1.64916229334882398e-20, + 3.43973697414235240e-19, + 3.76449254836118287e-19, +-7.60283113097895983e-20, +-4.80683984361169395e-20, + 7.52364946858386932e-20, + 8.98469506748276802e-20, + 4.97675791725750792e-19, + 4.37573840701552280e-19, + 1.06595057054229659e-19, + 1.70635459016680839e-19, + 3.03990356512787247e-19, + 1.60774960525902482e-19, + 6.71345396446715149e-20, + 1.08216901789996660e-19, +-1.17503756474432855e-19, + 2.70700029313986480e-19, + 8.95576752471113574e-22, + 1.80844385660283385e-19, + 2.19839202283950416e-19, +-7.14211854260923835e-15, +-7.67121702879710425e-16, +-8.32881009832713025e-17, +-3.22594608684337187e-18, +-3.62979118192636731e-18, +-4.69890319621169987e-19, +-8.90283634974996779e-21, + 5.85466399674660588e-19, + 4.15816597732363282e-19, +-1.12692293563859114e-19, +-5.02172312637259510e-20, + 9.04092002901479062e-20, + 4.01198469264339628e-19, +-3.12233054230236509e-19, +-3.87846968459261286e-19, +-1.57912564006587491e-19, +-2.86805446492873852e-19, +-1.28525083347119891e-19, +-8.29926931408083245e-20, +-1.77457008536290018e-19, +-1.62874815209491422e-19, +-6.50125102457693879e-20, +-2.51774680531166195e-20, +-3.42837078061639512e-20, +-1.69991089271563047e-19, +-3.28419132490991692e-19, +-5.50689416740047760e-19, +-3.28393042460950396e-19, +-6.23157290800547823e-19, +-2.86690466527927960e-19, +-1.35582228161628784e-19, +-1.80858726441170384e-19, +-3.12795029721496054e-19, +-2.64746592272874570e-19, + 4.58766724981720097e-21, +-3.53922462373089482e-19, +-7.41434563310895482e-20, + 1.32969683921992979e-20, +-2.20308857692452546e-19, +-3.06204787455942291e-19, +// root 1 + 9.28529850296634096e-02, + 6.07790447374054396e-02, + 4.24207701950143831e-02, + 3.14119040673487421e-02, + 2.45706201813023217e-02, + 2.00959576165661499e-02, + 1.69884675594611130e-02, + 1.47129370693842038e-02, + 1.29756442260845761e-02, + 1.16057745622882673e-02, + 1.04978186378774079e-02, + 9.58315350917374707e-03, + 8.81521911328532297e-03, + 8.16130703948169355e-03, + 7.59776337139540445e-03, + 7.10705686038990130e-03, + 6.67591746614967351e-03, + 6.29411534794156735e-03, + 5.95363708485163127e-03, + 5.64811606505289179e-03, + 5.37243000176812219e-03, + 5.12241102002653718e-03, + 4.89463320924439331e-03, + 4.68625451705498210e-03, + 4.49489742783178072e-03, + 4.31855775997162707e-03, + 4.15553414205094458e-03, + 4.00437289610428016e-03, + 3.86382453847030792e-03, + 3.73280913787631726e-03, + 3.61038849546861185e-03, + 3.49574362907219618e-03, + 3.38815641801172834e-03, + 3.28699453825335042e-03, + 3.19169901963892600e-03, + 3.10177390772324764e-03, + 3.01677762625524211e-03, + 2.93631572259968289e-03, + 2.86003474446837845e-03, + 2.78761704733415357e-03, +-2.10211169678469964e-02, +-1.17271906907320742e-02, +-6.93102355908773501e-03, +-4.23341466835084560e-03, +-2.69862256728112433e-03, +-1.82565935144584257e-03, +-1.30816391004298389e-03, +-9.81891870861076104e-04, +-7.63928077163478496e-04, +-6.11253182863890558e-04, +-5.00179770693435187e-04, +-4.16855937062207390e-04, +-3.52749920395228911e-04, +-3.02374361533122127e-04, +-2.62069767771396563e-04, +-2.29319570745275901e-04, +-2.02346992423740250e-04, +-1.79868582452472910e-04, +-1.60938505563209226e-04, +-1.44847300668089280e-04, +-1.31054371528529861e-04, +-1.19141948824596274e-04, +-1.08783058537759159e-04, +-9.97188297107423280e-05, +-9.17421540570147344e-05, +-8.46857436485157520e-05, +-7.84132839425716403e-05, +-7.28127980131844843e-05, +-6.77916121576281925e-05, +-6.32724959479706524e-05, +-5.91906737130733535e-05, +-5.54914896391772814e-05, +-5.21285680672195861e-05, +-4.90623524914823652e-05, +-4.62589367142599538e-05, +-4.36891232435799003e-05, +-4.13276598079062341e-05, +-3.91526164949632273e-05, +-3.71448746726808166e-05, +-3.52877053387513773e-05, + 1.61360311059394819e-03, + 8.01196943004402434e-04, + 4.38344657396202108e-04, + 2.50894510861755934e-04, + 1.41747939909926430e-04, + 8.19820234417779670e-05, + 5.02468435941994866e-05, + 3.27503207498773587e-05, + 2.24862597083392707e-05, + 1.60965929731090199e-05, + 1.19157838541225322e-05, + 9.06637062265821541e-06, + 7.05782250757807544e-06, + 5.60144679285278830e-06, + 4.51978824573176440e-06, + 3.69966545632666077e-06, + 3.06656767031587493e-06, + 2.57007579024072319e-06, + 2.17524197425678985e-06, + 1.85732200517719006e-06, + 1.59846180323326298e-06, + 1.38555886224607660e-06, + 1.20884990957909024e-06, + 1.06095869982025706e-06, + 9.36241923887726804e-07, + 8.30332205322573813e-07, + 7.39813810749732481e-07, + 6.61989241769883823e-07, + 5.94709028991043402e-07, + 5.36246107906266822e-07, + 4.85202057757269029e-07, + 4.40436391954871441e-07, + 4.01012715099882672e-07, + 3.66157351949557673e-07, + 3.35227290037019556e-07, + 3.07685141886274740e-07, + 2.83079443830034858e-07, + 2.61029045106178259e-07, + 2.41210656115173000e-07, + 2.23348854403296921e-07, +-9.56061659059923870e-05, +-4.38387764146576530e-05, +-2.04370709705528778e-05, +-1.18114584336398273e-05, +-6.69705211455182793e-06, +-3.55333501822584070e-06, +-1.91225241968544847e-06, +-1.09019856261112202e-06, +-6.61639918562440155e-07, +-4.23857667577770907e-07, +-2.83867061219226678e-07, +-1.97187942053036948e-07, +-1.41212928512889261e-07, +-1.03766090656615679e-07, +-7.79505621631753191e-08, +-5.96875549659136591e-08, +-4.64738178884486110e-08, +-3.67228644238482793e-08, +-2.94005317742208891e-08, +-2.38157357092708912e-08, +-1.94963365704078380e-08, +-1.61133285093574846e-08, +-1.34333243011609342e-08, +-1.12880723327670243e-08, +-9.55448396706579017e-09, +-8.14129440791357186e-09, +-6.97999684530222470e-09, +-6.01858146039024851e-09, +-5.21714734168044519e-09, +-4.54478496434678228e-09, +-3.97733328702462589e-09, +-3.49574712471383931e-09, +-3.08489574206204134e-09, +-2.73266974730008264e-09, +-2.42931083071749764e-09, +-2.16690424293019499e-09, +-1.93899126850802075e-09, +-1.74027098284155075e-09, +-1.56636901120658889e-09, +-1.41365697452227313e-09, + 3.82661556555824082e-06, + 2.31519363930618186e-06, + 8.05435360247869469e-07, + 3.85830077273396212e-07, + 2.56646347772675520e-07, + 1.41645451561349583e-07, + 7.08557789955947951e-08, + 3.60389666120766072e-08, + 1.94384358486633945e-08, + 1.11577852136531743e-08, + 6.76215445081142616e-09, + 4.28868014725952351e-09, + 2.82538507722495494e-09, + 1.92225331376816681e-09, + 1.34437492681285947e-09, + 9.62953069319674857e-10, + 7.04310480184623806e-10, + 5.24719456449903866e-10, + 3.97377063945509826e-10, + 3.05380147196669994e-10, + 2.37795572950662443e-10, + 1.87389625696655798e-10, + 1.49277591138018923e-10, + 1.20099469607522699e-10, + 9.75048879602788809e-11, + 7.98242850733306216e-11, + 6.58548889814538697e-11, + 5.47189000746324009e-11, + 4.57679724583824334e-11, + 3.85178933934921552e-11, + 3.26032834112104601e-11, + 2.77457727786703502e-11, + 2.37313716195651401e-11, + 2.03941938175429637e-11, + 1.76046262468139452e-11, + 1.52606461169073962e-11, + 1.32813853408705691e-11, + 1.16023222295716587e-11, + 1.01716565306759287e-11, + 8.94755452665711900e-12, + 1.13577764917047282e-08, +-1.01707677033962441e-07, +-4.33465552171660837e-08, +-7.90427454496254436e-09, +-6.33695970491041989e-09, +-4.74096913119563298e-09, +-2.46549001151970178e-09, +-1.16849835285518525e-09, +-5.68223377528272133e-10, +-2.93392490671210367e-10, +-1.61049298955794503e-10, +-9.32716452147328472e-11, +-5.65298651612689195e-11, +-3.56094551623472321e-11, +-2.31857685504784089e-11, +-1.55355435576602675e-11, +-1.06738220946583680e-11, +-7.49752292558573335e-12, +-5.37094128969156664e-12, +-3.91577415601669726e-12, +-2.90037738326229588e-12, +-2.17924348553994415e-12, +-1.65884449973604416e-12, +-1.27779864435685218e-12, +-9.95051602696316376e-13, +-7.82666145938929757e-13, +-6.21327124417515907e-13, +-4.97485142087943791e-13, +-4.01504140460116987e-13, +-3.26446141211943342e-13, +-2.67257757518210688e-13, +-2.20218167477661592e-13, +-1.82559607384056624e-13, +-1.52203701598165539e-13, +-1.27576173044175856e-13, +-1.07474381934427990e-13, +-9.09725492151638863e-14, +-7.73523125287666933e-14, +-6.60522376537862983e-14, +-5.66323303333197753e-14, +-1.52406623055126332e-08, + 1.07634353292185198e-09, + 2.63844575402910537e-09, + 3.90478532630441686e-10, + 6.28879956961440674e-13, + 1.05175751323433037e-10, + 7.50580696891171895e-11, + 3.62070604802519447e-11, + 1.63856822051929492e-11, + 7.68766288167622200e-12, + 3.83255827304417001e-12, + 2.02817877045021749e-12, + 1.13100730715849342e-12, + 6.59656949973686624e-13, + 3.99872871342603842e-13, + 2.50638512806843698e-13, + 1.61761738905232492e-13, + 1.07129248344713980e-13, + 7.25937578115292543e-14, + 5.02104386684626423e-14, + 3.53757205944760839e-14, + 2.53441795287983811e-14, + 1.84343645555122366e-14, + 1.35952313093295254e-14, + 1.01546605301367569e-14, + 7.67404949670090818e-15, + 5.86256291059020504e-15, + 4.52336400904912942e-15, + 3.52230840992258881e-15, + 2.76682797841431819e-15, + 2.19080806625218509e-15, + 1.74799189221742518e-15, + 1.40446105120528988e-15, + 1.13591861007836937e-15, + 9.24610819930803982e-16, + 7.57025504459915175e-16, + 6.23178091224040510e-16, + 5.15682502924181230e-16, + 4.29074637317398118e-16, + 3.58385572326143340e-16, + 1.23763139652013308e-09, + 1.92254822649224788e-10, +-5.98376842826920288e-11, +-5.16165818009385749e-11, + 5.40372627041079016e-12, + 4.89608198611234274e-13, +-1.67469108266924102e-12, +-1.01877358234047200e-12, +-4.57742222818178554e-13, +-1.99562736927721980e-13, +-9.09861587643772089e-14, +-4.40783987541491176e-14, +-2.26258328867686441e-14, +-1.22194010028844063e-14, +-6.89644859005569726e-15, +-4.04371057058118645e-15, +-2.45163183792448884e-15, +-1.53054401451946428e-15, +-9.80947331993371815e-16, +-6.43927638511733955e-16, +-4.31180898840574912e-16, +-2.94343386839027793e-16, +-2.04348786868690497e-16, +-1.44588565003124590e-16, +-1.03624056168457129e-16, +-7.53461013152625056e-17, +-5.49188754905112207e-17, +-4.05500530876138575e-17, +-3.09451808081122126e-17, +-2.33243318746928824e-17, +-1.77669501266515113e-17, +-1.37068272173537598e-17, +-1.07609966919943932e-17, +-8.32684480839000545e-18, +-6.60785893636512461e-18, +-5.10989677495161006e-18, +-4.26199748478870466e-18, +-3.45579115788071634e-18, +-2.54400671731294045e-18, +-2.32240076933225414e-18, +-5.62911512388482782e-11, +-1.12470510245569184e-11, +-5.29183782783268380e-12, + 3.34456927497381309e-12, + 2.06974437616382063e-13, +-1.76179526066133488e-13, + 5.09545171818080400e-15, + 2.31566803962809821e-14, + 1.19554297156157552e-14, + 5.06931798564386006e-15, + 2.14697707337874664e-15, + 9.56518245377932936e-16, + 4.52413282327751620e-16, + 2.26743051454806440e-16, + 1.18885889630091629e-16, + 6.53248627674953192e-17, + 3.71352320624645294e-17, + 2.20428615105541188e-17, + 1.35627081908398607e-17, + 8.24673258021379092e-18, + 5.58904406975495792e-18, + 3.84202623027822694e-18, + 2.74975301747448048e-18, + 1.54665462556435913e-18, + 1.13990953099086113e-18, + 4.43712228252222061e-19, + 6.63187389512633883e-19, + 6.08336117753498261e-19, + 3.23622804926451893e-19, + 2.21499316978833752e-19, + 1.38682332503831266e-19, + 1.06694017695813489e-19, + 7.36769685264793433e-20, + 1.02491157327984266e-20, +-1.59795023373649386e-20, + 1.11669891428444230e-19, +-9.04240933843994565e-20, +-1.29515076641708071e-19, + 1.35024622564519471e-19, +-1.03574389848970993e-19, + 3.89892939188624140e-13, + 5.58620016039213929e-13, + 3.08451329664961372e-13, +-2.11757068387182818e-14, +-5.20295947262038142e-14, + 7.23937782982777047e-15, + 1.98663357580315255e-15, +-2.52778410359772024e-16, +-2.71218215131274563e-16, +-1.23000055933639553e-16, +-4.97726009947317103e-17, +-2.11156374142964207e-17, +-8.86230807526461824e-18, +-3.64195845934015431e-18, +-1.96235555357241249e-18, +-1.05255694636939852e-18, +-3.84377774847473801e-19, +-2.06106125423246602e-19, + 2.06608297839553110e-19, + 8.94237219620831212e-20, + 2.31243359041054691e-19, + 3.43181930802586552e-19, + 2.60557373859808011e-19, + 9.44487750771133535e-20, + 3.09414522238341089e-19, +-1.48417133317850457e-19, + 3.55684285973676790e-19, + 1.97588951940057410e-19, +-2.29556476052765709e-20, + 2.33446292374077706e-20, + 1.93556361920217965e-19, + 4.36374801990065046e-20, +-4.51982302978535685e-20, + 4.05740772530019869e-20, + 1.77800231527303119e-19, + 1.55842724238825533e-19, +-3.14227875557719978e-20, +-1.18839268459268961e-19, + 1.71772840719161268e-19, +-2.49531642966087464e-20, + 2.03890599236449030e-13, +-5.41542758097188563e-14, + 1.44433376963479067e-14, +-1.17611032514634793e-14, + 3.40458165579135557e-15, + 7.12938035059508179e-17, +-1.23551240400345657e-16, +-1.20363861166251246e-17, + 4.88992062057003894e-18, + 3.64215714496747014e-18, + 1.26209078922162408e-18, + 7.69462558011982443e-19, + 5.28971556166304792e-19, + 6.35836380569628274e-19, +-1.75436287756602653e-20, + 8.74983267624154113e-20, + 1.12618548046304229e-19, +-5.91554953422970810e-22, + 1.99444203424907534e-19, + 1.14036393825865553e-19, + 1.64353195148330899e-19, + 3.21611134405952378e-19, + 3.39270169049127765e-19, + 1.63802174659578073e-19, +-6.70292046187570834e-20, + 2.53211241235052680e-20, + 9.87007819771226512e-20, + 1.98804641808166486e-19, + 1.27203126958641408e-19, + 1.93535660046969623e-21, + 4.86310472323390203e-20, + 7.68396789483828019e-20, + 2.21790576840377437e-20, +-3.99388530283506287e-20, + 1.09630296370819677e-19, + 3.22471115065390256e-20, + 5.31081820486942129e-20, +-9.78518820658939797e-20, + 1.63839661380218199e-19, +-9.23032904287588242e-21, +-1.86154861534034778e-14, + 1.61645558399787099e-15, +-1.13526595420496877e-15, + 6.81030327791363690e-16, +-6.65965606933620480e-17, +-2.73566473595937001e-17, + 2.82084929622043152e-18, + 3.03690450479170957e-19, +-5.57744671044464430e-19, +-4.70673340275255289e-19, +-3.94751211175725673e-20, +-3.74099486607826143e-19, + 6.50062649750286780e-20, + 7.74156308986862668e-20, + 3.04659570053264690e-19, + 4.35372427211500221e-19, + 4.11326398164015621e-19, + 3.65880824521602705e-19, + 3.64830301757081408e-19, +-9.30310545845724898e-21, + 2.76689143106005506e-19, + 3.29468336626685074e-19, + 3.62427261458946496e-19, + 1.79675276622857278e-19, + 2.68262911839338941e-19, + 1.12079939126913971e-19, + 1.40753152206822084e-19, + 1.60745051530355914e-19, + 9.86104485888919769e-20, + 7.24044808687198780e-20, + 1.25527052436793145e-19, + 2.53257900483029846e-20, + 3.23192776605219889e-20, + 9.80524407459238284e-20, + 1.25405397638297042e-19, + 1.49230014553957065e-19, + 1.51201850979689006e-19, +-1.89472465589668396e-20, + 1.92236233955296490e-19, +-2.83958626917924074e-20, + 7.94226534963285548e-16, + 1.61684633629524127e-16, +-9.45169768843559841e-17, + 1.33891293774538797e-17, +-7.09278760714315792e-18, + 2.41459155607888275e-18, +-2.16809199828541819e-19, +-5.87661464087048721e-19, + 2.51403310607980711e-19, + 2.67520878780188129e-19, +-5.58542738611035091e-20, +-2.10431938863215886e-19, + 3.24140167719752587e-19, + 1.53702886006785800e-19, +-1.00527863319317879e-19, + 3.95561560260821329e-20, +-7.15702171634704824e-20, +-1.39376629873860253e-19, + 1.15694737631308432e-19, +-1.45897416309068093e-20, + 1.08314556259095962e-19, + 5.02922377775065265e-20, +-1.09570523890094653e-19, +-1.40477383545723122e-19, + 3.88661917613793540e-20, +-6.54181925356212365e-21, + 3.02348529594168940e-19, + 1.38290257704195998e-19, + 9.40102281782455715e-20, + 1.12401720206893736e-19, + 8.51600692219405008e-20, + 8.39118193837377620e-20, + 7.95453118247121647e-20, + 4.57619319175746229e-20, +-3.41490853353562576e-21, + 1.36095916197495394e-19, + 1.85570934768705250e-20, + 4.72656532543565745e-20, + 1.36278658584214521e-19, + 1.16451996233185880e-19, +-1.78484710028483538e-17, +-1.39980780110714265e-17, + 5.89055248766077269e-18, +-5.31860549702635104e-18, + 7.40021328155647153e-21, +-8.80520145898580766e-19, +-7.31424407642944905e-20, +-3.05016493698452459e-19, +-4.87303834806458440e-20, + 1.00518405711610331e-20, + 5.71178676320606015e-20, +-4.95947425847927629e-19, + 1.49164132164683794e-19, +-1.04160212363261702e-19, +-3.87912885087903274e-19, +-2.66126297751677597e-19, +-3.28709487141126318e-19, +-2.26913148163461396e-19, +-3.36869630910065555e-19, +-2.59663168367756144e-19, +-1.00010406594971269e-19, +-3.91162823365051510e-20, + 3.14945529249399848e-20, +-5.21421160635595983e-20, +-1.32402720828863406e-19, +-6.93423363277663164e-20, +-1.52838897288763904e-19, +-1.77146454300676886e-19, +-2.55993074751879360e-19, +-2.25762893824156667e-19, +-1.77682441491860050e-19, +-9.91447673977158105e-20, +-1.65648172059267284e-19, +-1.41022139290605871e-19, +-1.15324555451757645e-19, +-1.07628684625655126e-19, +-1.50574527457827187e-19, +-1.67738357399917925e-19, +-9.44263427468507874e-20, +-1.33808347225735913e-19, + 5.39983298301873638e-01, + 3.95918697445430789e-01, + 3.19593758197459776e-01, + 2.72365716459068874e-01, + 2.40422022597022417e-01, + 2.17391963327909804e-01, + 1.99895054683098594e-01, + 1.86042026199862515e-01, + 1.74723860210878601e-01, + 1.65250799318581998e-01, + 1.57170022112453289e-01, + 1.50170514794832594e-01, + 1.44030643762928234e-01, + 1.38587612134985910e-01, + 1.33718778889880374e-01, + 1.29329753914326218e-01, + 1.25346542672824357e-01, + 1.21710206519629882e-01, + 1.18373138495229263e-01, + 1.15296406862745546e-01, + 1.12447822387059443e-01, + 1.09800507241949147e-01, + 1.07331818562961284e-01, + 1.05022527227904255e-01, + 1.02856183283623753e-01, + 1.00818619862274417e-01, + 9.88975612227859235e-02, + 9.70823100324397087e-02, + 9.53634956237931208e-02, + 9.37328696544381945e-02, + 9.21831389681676688e-02, + 9.07078279085307138e-02, + 8.93011641406575990e-02, + 8.79579833799609412e-02, + 8.66736494353008563e-02, + 8.54439867395263009e-02, + 8.42652231259258255e-02, + 8.31339410609392288e-02, + 8.20470358947709699e-02, + 8.10016799666732207e-02, +-1.00560304778563314e-01, +-4.90600924152991419e-02, +-2.89119283635440906e-02, +-1.89466542250040920e-02, +-1.33058732255867968e-02, +-9.89118640785271487e-03, +-7.69945860745559728e-03, +-6.20898120748832830e-03, +-5.14392672243557322e-03, +-4.35209614622965226e-03, +-3.74453266363228678e-03, +-3.26631382142027670e-03, +-2.88191027344010010e-03, +-2.56742813574355752e-03, +-2.30626769637337636e-03, +-2.08657460342361826e-03, +-1.89968077791216844e-03, +-1.73911660788917885e-03, +-1.59996576929553121e-03, +-1.47843248795352352e-03, +-1.37154441735838390e-03, +-1.27694434661738423e-03, +-1.19274144165348503e-03, +-1.11740321256987695e-03, +-1.04967586164596868e-03, +-9.88524743142497365e-04, +-9.33089294447074047e-04, +-8.82648526335444721e-04, +-8.36594317110527365e-04, +-7.94410542800456660e-04, +-7.55656619680024149e-04, +-7.19954416625304431e-04, +-6.86977765438679419e-04, +-6.56443991715985201e-04, +-6.28107030095311045e-04, +-6.01751791447814491e-04, +-5.77189526474819773e-04, +-5.54253987722090852e-04, +-5.32798235458720138e-04, +-5.12691965921524746e-04, + 1.04730788290760355e-02, + 3.67615421972140519e-03, + 1.67202413325716554e-03, + 9.08485247817779318e-04, + 5.36110455369208719e-04, + 3.34940177516735566e-04, + 2.22053325215609484e-04, + 1.55358003270124350e-04, + 1.13566153442517850e-04, + 8.59581210364525816e-05, + 6.69061275974178741e-05, + 5.32813527188560760e-05, + 4.32466803180476300e-05, + 3.56714712368964328e-05, + 2.98316673193347084e-05, + 2.52476653737147749e-05, + 2.15924462606732470e-05, + 1.86373550759114374e-05, + 1.62189550934058318e-05, + 1.42181317529739501e-05, + 1.25465575525229391e-05, + 1.11377114306858911e-05, + 9.94079056879460357e-06, + 8.91650244260195271e-06, + 8.03410512080680377e-06, + 7.26929217348125479e-06, + 6.60265906936609354e-06, + 6.01857630595125377e-06, + 5.50435120518939837e-06, + 5.04959734421876617e-06, + 4.64575519760491668e-06, + 4.28572417197264625e-06, + 3.96357758025043380e-06, + 3.67433998789290149e-06, + 3.41381190189532580e-06, + 3.17843070929222239e-06, + 2.96515959865291902e-06, + 2.77139824991002695e-06, + 2.59491058120131229e-06, + 2.43376595250987704e-06, +-1.02814729625636545e-03, +-2.76155297526473986e-04, +-9.41677839558022065e-05, +-4.21331346550209978e-05, +-2.22590313743819487e-05, +-1.22739645280153328e-05, +-7.06638642465234380e-06, +-4.31272024833265863e-06, +-2.78505390984577914e-06, +-1.88628257917820987e-06, +-1.32826119854245315e-06, +-9.65706934724391767e-07, +-7.21072454134639056e-07, +-5.50678505050250794e-07, +-4.28746054409244713e-07, +-3.39440508341194947e-07, +-2.72695818639306558e-07, +-2.21919517498039266e-07, +-1.82679952098843137e-07, +-1.51928613337058189e-07, +-1.27525029860686111e-07, +-1.07938460624879655e-07, +-9.20559602601971934e-08, +-7.90561419690281366e-08, +-6.83244835608063815e-08, +-5.93954703500567549e-08, +-5.19124139496392672e-08, +-4.55991224032773189e-08, +-4.02396464740398925e-08, +-3.56636130411531751e-08, +-3.17354772796640104e-08, +-2.83465593958000343e-08, +-2.54090835036067271e-08, +-2.28516722902284044e-08, +-2.06159113181913004e-08, +-1.86537067945589005e-08, +-1.69252375294020544e-08, +-1.53973555590671855e-08, +-1.40423283872362422e-08, +-1.28368432562068009e-08, + 9.21641818724979584e-05, + 2.04844755240938452e-05, + 5.52303858731810047e-06, + 1.80550577589771601e-06, + 8.47459050474924638e-07, + 4.42558584570245939e-07, + 2.31032987875894385e-07, + 1.24986958205639442e-07, + 7.16235084000364510e-08, + 4.34517789471632328e-08, + 2.76866177874167389e-08, + 1.83780778162362510e-08, + 1.26238678324185601e-08, + 8.92613027070631860e-09, + 6.47009949135802442e-09, + 4.79175350810363286e-09, + 3.61612619559972756e-09, + 2.77456740423104441e-09, + 2.16046654082436859e-09, + 1.70461112381967336e-09, + 1.36099035797206604e-09, + 1.09836146308612961e-09, + 8.95100415133338856e-10, + 7.35979277235785188e-10, + 6.10104360442692978e-10, + 5.09569564106592159e-10, + 4.28560906596469817e-10, + 3.62750648806085879e-10, + 3.08881010966840416e-10, + 2.64473998179587645e-10, + 2.27626498925804970e-10, + 1.96863664564362456e-10, + 1.71032922061931707e-10, + 1.49226428509569020e-10, + 1.30723785764864363e-10, + 1.14949391077036873e-10, + 1.01440320921296012e-10, + 8.98219522465669103e-11, + 7.97893669452509505e-11, + 7.10930027913033446e-11, +-7.54319868884005970e-06, +-1.40413775097015296e-06, +-3.45400102679363684e-07, +-8.28973999046592151e-08, +-2.78189624931016665e-08, +-1.44459471005103742e-08, +-7.36828459701528909e-09, +-3.66297603337886157e-09, +-1.88613045313871256e-09, +-1.02850488747965324e-09, +-5.93476273390954059e-10, +-3.59726849578824072e-10, +-2.27319711880802303e-10, +-1.48820157179952021e-10, +-1.00428200373218093e-10, +-6.95759639866878110e-11, +-4.93222261995460877e-11, +-3.56803560090961031e-11, +-2.62807840116953440e-11, +-1.96718524631163799e-11, +-1.49399359447273076e-11, +-1.14960477929231035e-11, +-8.95211039827388625e-12, +-7.04742018943986130e-12, +-5.60358970296997400e-12, +-4.49663614435137819e-12, +-3.63904877947878157e-12, +-2.96820637693174851e-12, +-2.43871339972303602e-12, +-2.01731397519075266e-12, +-1.67931522693502953e-12, +-1.40625166544168179e-12, +-1.18414681010361650e-12, +-1.00232087716367549e-12, +-8.52588956536752891e-13, +-7.28582369969612751e-13, +-6.25344629753992554e-13, +-5.38952575078556423e-13, +-4.66318328739680236e-13, +-4.04967680648090460e-13, + 5.74442547239628296e-07, + 8.83407494725577881e-08, + 1.96380162877195017e-08, + 4.83312390220807919e-09, + 8.79071121307963390e-10, + 3.84569582082892106e-10, + 2.14466965487671112e-10, + 1.04938880240334989e-10, + 4.99495692737997775e-11, + 2.47131837502293961e-11, + 1.29472401569963689e-11, + 7.17047253940955663e-12, + 4.16906118318771833e-12, + 2.52712140607060202e-12, + 1.58768863753091173e-12, + 1.02894695534860096e-12, + 6.85195048367119539e-13, + 4.67339531145400061e-13, + 3.25611473215466988e-13, + 2.31223721353464972e-13, + 1.67043537367325395e-13, + 1.22551599354122956e-13, + 9.11992660631585250e-14, + 6.87277880131718394e-14, + 5.24198751299508644e-14, + 4.04149677899157292e-14, + 3.14712708488064666e-14, + 2.47351004648707292e-14, + 1.96167668549553395e-14, + 1.56771335117137965e-14, + 1.26273409712889053e-14, + 1.02328917981942794e-14, + 8.34792737719205713e-15, + 6.86354193014288475e-15, + 5.66583606171602934e-15, + 4.70574381438610521e-15, + 3.92531111252709587e-15, + 3.29745971673443238e-15, + 2.77723446078650926e-15, + 2.35453144979046332e-15, +-4.09222555018272762e-08, +-5.44863053829355572e-09, +-8.94965834956328605e-10, +-2.87364258343869520e-10, +-4.32105388339040131e-11, +-7.30520881165149672e-12, +-5.07731961228979212e-12, +-2.79134951122894282e-12, +-1.29962297670448014e-12, +-5.95999235168546257e-13, +-2.85433446421336516e-13, +-1.44700284006853678e-13, +-7.74424957329129790e-14, +-4.34745026338667581e-14, +-2.54334423743566285e-14, +-1.54081407396103132e-14, +-9.64487803496427585e-15, +-6.20045229638921836e-15, +-4.08555982468016433e-15, +-2.75114020847573213e-15, +-1.88626912831429609e-15, +-1.32463429202423839e-15, +-9.33919370456811515e-16, +-6.79528847537172240e-16, +-4.97582699168129214e-16, +-3.69620449756797335e-16, +-2.76467412152707543e-16, +-2.08693244318547218e-16, +-1.51763176859670455e-16, +-1.17374824623698869e-16, +-8.92533483351611087e-17, +-7.24926132715050098e-17, +-6.23533718392172218e-17, +-4.37212554116118807e-17, +-3.25079422331338819e-17, +-2.98497117353925155e-17, +-2.70476665272918108e-17, +-1.68179290130470847e-17, +-1.50395851082008775e-17, +-1.14136012796458924e-17, + 2.72894574027053502e-09, + 3.27183974784248421e-10, + 3.98921189156587253e-11, + 1.18356951775035592e-11, + 3.18496836306752766e-12, + 1.45438851861910809e-13, + 6.96478220730825476e-14, + 6.25358308825640604e-14, + 3.19871018900816699e-14, + 1.41994699464066041e-14, + 6.31366236542424278e-15, + 2.94583021141690221e-15, + 1.45976227067113433e-15, + 7.55321632949355698e-16, + 4.08206000576689577e-16, + 2.34733865050906392e-16, + 1.45092575666769457e-16, + 8.24020578541763644e-17, + 5.19655562798667566e-17, + 3.25139509058230755e-17, + 2.50780433689258777e-17, + 1.47253456438885787e-17, + 1.86509350105462041e-17, + 5.81185614252534687e-18, + 5.97936120737218689e-18, + 4.26928523781887083e-19, +-4.01519060392752107e-19, +-8.18589337815160761e-19, + 3.40183473629344803e-18, + 4.41468235377388315e-18, + 2.53549271926729665e-18, + 7.12436015911158644e-19, +-3.85300501057398719e-18, + 1.44661306227129018e-18, + 1.32031950059106788e-20, + 2.32298355337770332e-18, + 9.07550458684394031e-19, + 2.35860135731301803e-18, + 1.74055735141785760e-18, + 3.84372578910035449e-18, +-1.71697567396319896e-10, +-1.77125412875709387e-11, +-2.60632657881158193e-12, +-1.56250552636653152e-13, +-1.95691530244314273e-13, +-1.44992411865138098e-14, + 8.74326059416905839e-16, +-8.68043776431315647e-16, +-6.91633217973286834e-16, +-3.22812992084147307e-16, +-1.36365084389753161e-16, +-6.13861490678151360e-17, +-2.80688062152108628e-17, +-1.86101339367775081e-17, +-1.14272226436949314e-17, +-2.67107571349878950e-18, + 4.08629475759239971e-18, + 1.97200802645903718e-18, + 4.11735099770768132e-18, +-6.53880064243654181e-20, + 7.69677080468756864e-18, +-1.20055114424209855e-18, + 6.17906466598294282e-18, +-2.85661800878774134e-18, + 2.88423882649337100e-18, + 3.86537225078747744e-19, + 8.47173944762986714e-19, + 8.35793372683437029e-19, + 3.20576136096219564e-18, + 6.55928267968039712e-18, + 3.66907542146704454e-18, + 1.03846481305557074e-18, +-1.73299081886584934e-18, + 4.36331100179320019e-19, + 3.71965762733534646e-19, + 8.31923890593551964e-19, + 1.17911588499939418e-19, + 4.08799878814062470e-18, + 1.00857540556586682e-18, + 3.08871045502925987e-18, + 1.01761107179831597e-11, + 9.11945539498865002e-13, + 1.61885169534247968e-13, +-7.23832454751458132e-15, + 6.93822557746502461e-15, + 1.50596204227356176e-15, +-4.89279548910235182e-17, +-4.42136611617019746e-18, + 1.05808032983581568e-17, + 1.29167315378084954e-17, + 8.77517801230472257e-18, + 2.73801367581930090e-18, + 9.17094707473123836e-18, +-8.01036379224876286e-19, +-7.18196415086188474e-19, + 5.19679597324165358e-18, + 1.85715097449794354e-18, + 6.21917474429595268e-19, + 7.48971641811169972e-19, + 1.60131332897484583e-18, + 4.29239185687889616e-18, + 5.55530324439321673e-19, + 5.53198200317382762e-18, +-2.91812456314037820e-18, +-1.35384011590862317e-18, + 1.58639688689904161e-18, + 1.37624902453129809e-18, +-1.90761396716806660e-18, + 2.38264234364217914e-18, + 5.55231196616149064e-18, + 4.03000856987154645e-18, + 3.53069130018498044e-18, +-4.59448599121478696e-18, + 1.23867082255166806e-18, + 2.94245026717660917e-18, +-6.58676958494142760e-19, +-1.45305931352831271e-19, + 1.75124104256513513e-19, + 2.10205689631074670e-18, + 2.14768165939663354e-18, +-5.62864913315609571e-13, +-5.06013773333484652e-14, +-4.45102019344766399e-15, +-6.54422160990376013e-16, + 3.62193677529905547e-17, +-9.07501580120823431e-17, +-2.28007065439433340e-18, +-5.51075312291415234e-18, +-8.71688540926181398e-18, +-2.38600189453089900e-18, + 2.05186682300085450e-18, + 1.23336277174146955e-18, +-1.02419782676491233e-19, + 5.15097874553448929e-18, + 9.14591187670856851e-19, + 4.81150585479350375e-18, + 2.74551464114412407e-18, + 4.93801341404893957e-18, + 2.39173663500032324e-18, + 1.68186729508282188e-18, + 5.22727777586522643e-18, + 2.16128445333836792e-18, + 5.83311901184748686e-18, + 9.77178323164507067e-20, + 2.12706717768080426e-18, + 2.00841676411566244e-18, + 6.41529177299228795e-20, +-2.17027073099725633e-18, + 6.78597442743637394e-18, + 4.91823714001507017e-18, + 3.36443068889596904e-18, + 2.51146467318275859e-19, +-1.84112456363846439e-18, + 2.32736182456448652e-18, + 2.32940312753983622e-18, + 3.03454086240349313e-18, + 3.04815683570526420e-18, + 2.93112426802661131e-18, + 5.14868057787881557e-19, + 1.47936480480655404e-18, + 2.90408054121953181e-14, + 2.54457239843807849e-15, +-6.60888109078879091e-17, + 1.35887932390313356e-16, +-2.10839877848794486e-17, + 5.31528854468405836e-18, + 5.70236374074446618e-18, +-3.67841740821066143e-18, + 8.72006620132835588e-19, +-2.74180576948963971e-18, + 3.98098106408196304e-18, +-1.46218301585992950e-18, + 1.24661706267988073e-18, + 2.07180446160893152e-19, +-2.72827008760055949e-18, + 1.17393123938916883e-18, + 2.26707648446881903e-18, + 1.13384820321623118e-18, + 1.66969001565935421e-18, +-1.35607502110393562e-19, + 1.70909416898988063e-18, + 7.01843948211766413e-20, + 5.52772197686823737e-18, + 2.50471561845221233e-19, + 1.72134481949613179e-19, +-9.04446911691639825e-20, + 1.52202659567614463e-18, + 3.64328833387935381e-19, +-1.46490603150313758e-20, + 1.49109222053166893e-18, + 4.72653957123688941e-18, +-1.38278940959013500e-18, +-1.52990248459505142e-18, + 4.68249192634874459e-19, + 2.92053298206897443e-18, + 2.05590839142480389e-18, + 1.13756984207402635e-18, + 3.54479563856237153e-18, +-2.26646665314629725e-18, + 4.59754268801119906e-18, +-1.41888029521202317e-15, +-1.19211712087026244e-16, +-2.48281550100008956e-17, +-1.75119552838068109e-17, +-2.87872451889293588e-18, +-2.85287295735693599e-18, + 4.84130333553564961e-18, + 1.10481745134584177e-18, +-1.78449404772457817e-18, +-3.01258688177744388e-18, +-1.86554722543989371e-18, + 4.39623485060061104e-18, +-6.53219367635966825e-18, +-4.25536607277726197e-18, +-3.05582181903485228e-18, +-4.53942817580965753e-18, +-6.23720022400169035e-19, +-1.90326246041095030e-18, +-2.89410721522114549e-18, +-8.58447040579995244e-19, + 2.54270130087172668e-18, +-3.53589056286377300e-18, +-3.16147179789359523e-18, +-3.26542582867788875e-18, +-1.03267434208434587e-18, + 5.27311493643539428e-19, +-7.52744187325059528e-18, +-2.54678021563557712e-18, +-1.49670655087396122e-18, + 7.79374302665070598e-19, +-1.16339733940184607e-18, +-4.21234062747985120e-18, +-3.81218103745000018e-18, +-4.67110335886229887e-18, +-5.44809066569012715e-19, +-2.49404838805525129e-18, +-1.06381343289808300e-18, +-3.52079707782017121e-18, +-8.44795434373130378e-19, + 9.00221823217835073e-19, +// nroots = 3 +// root 0 + 8.43777191764889412e-01, + 7.77267985371807302e-01, + 6.86224075676809209e-01, + 5.81003014022235642e-01, + 4.81550374294910044e-01, + 4.01168529516836403e-01, + 3.40655040694424815e-01, + 2.95287659777211331e-01, + 2.60459937149291720e-01, + 2.32968033212851922e-01, + 2.10728232138863769e-01, + 1.92367764678282122e-01, + 1.76952617089206315e-01, + 1.63826290774544941e-01, + 1.52513976785817323e-01, + 1.42663761970622027e-01, + 1.34009269806859371e-01, + 1.26345151229870056e-01, + 1.19510548547453049e-01, + 1.13377661347825370e-01, + 1.07843667222808706e-01, + 1.02824902183999228e-01, + 9.82525960918500391e-02, + 9.40696989057716593e-02, + 9.02284854801671671e-02, + 8.66887248034096808e-02, + 8.34162643349232874e-02, + 8.03819236176887691e-02, + 7.75606210964084886e-02, + 7.49306787317669254e-02, + 7.24732635552687299e-02, + 7.01719356987141885e-02, + 6.80122799408510587e-02, + 6.59816033024014648e-02, + 6.40686852757548914e-02, + 6.22635703014850425e-02, + 6.05573943828048578e-02, + 5.89422394605279773e-02, + 5.74110104974115687e-02, + 5.59573312445939136e-02, +-2.70885345128455794e-02, +-3.96318811949786937e-02, +-5.08611979898857189e-02, +-5.31576856123690059e-02, +-4.55648302841097225e-02, +-3.48493957014381142e-02, +-2.59489496666545465e-02, +-1.96630325604347199e-02, +-1.53282515094017580e-02, +-1.22691767901491680e-02, +-1.00402743767371988e-02, +-8.36776066693567522e-03, +-7.08093687448685827e-03, +-6.06972249103355024e-03, +-5.26066691016080501e-03, +-4.60325466460527206e-03, +-4.06181964331617761e-03, +-3.61059847096389464e-03, +-3.23060489044489120e-03, +-2.90759750917733185e-03, +-2.63072464910024629e-03, +-2.39160020271796895e-03, +-2.18366064528797543e-03, +-2.00170952132163902e-03, +-1.84158943516662087e-03, +-1.69994232657119703e-03, +-1.57403188065125509e-03, +-1.46161032454795677e-03, +-1.36081736935034009e-03, +-1.27010272728053327e-03, +-1.18816612156989764e-03, +-1.11391041677152709e-03, +-1.04640468942221541e-03, +-9.84854900579109401e-04, +-9.28580432960838110e-04, +-8.76995189660228049e-04, +-8.29592268294697855e-04, +-7.85931457979987722e-04, +-7.45628980166365956e-04, +-7.08349024623193611e-04, +-1.40516800532362917e-03, +-1.65020733343798870e-03, +-9.89281527830024538e-04, + 4.36012647801217236e-04, + 1.30940690608784532e-03, + 1.27823445569814399e-03, + 9.39694616489120311e-04, + 6.46412560525997867e-04, + 4.49804983743685083e-04, + 3.22907337376762043e-04, + 2.39165936932591276e-04, + 1.81991019824901350e-04, + 1.41675098320430154e-04, + 1.12440804299610597e-04, + 9.07281278865782831e-05, + 7.42653673852969158e-05, + 6.15568565781260478e-05, + 5.15905089768108042e-05, + 4.36647981492415102e-05, + 3.72830201949054897e-05, + 3.20867806038347832e-05, + 2.78130657464908520e-05, + 2.42658922178618807e-05, + 2.12971926898728328e-05, + 1.87936859943364846e-05, + 1.66677034425291695e-05, + 1.48506791874570301e-05, + 1.32884648978165905e-05, + 1.19379131223326032e-05, + 1.07643555693702685e-05, + 9.73972098944735528e-06, + 8.84111578394803074e-06, + 8.04974318606310898e-06, + 7.35007279794030530e-06, + 6.72919708565114493e-06, + 6.17632878233068427e-06, + 5.68240541579076525e-06, + 5.23977594248391371e-06, + 4.84195079695410236e-06, + 4.48340127669319662e-06, +-3.81136748504189407e-05, + 8.14723534732571054e-06, + 1.01814000842153263e-04, + 1.13447626049478222e-04, + 2.84640680401457532e-05, +-2.37428422832118024e-05, +-2.83805523087734766e-05, +-2.01741925892465391e-05, +-1.30256727752855667e-05, +-8.47340280776127739e-06, +-5.69375547388377317e-06, +-3.95771778025809935e-06, +-2.83457965741488239e-06, +-2.08294523041847785e-06, +-1.56474263489836600e-06, +-1.19814020113170287e-06, +-9.32893849090365098e-07, +-7.37157741296014857e-07, +-5.90172633851622614e-07, +-4.78066028889612694e-07, +-3.91360414655589523e-07, +-3.23451480455057833e-07, +-2.69654319408658384e-07, +-2.26591526718541169e-07, +-1.91792278184760759e-07, +-1.63424566650308708e-07, +-1.40113218181664005e-07, +-1.20814211813490426e-07, +-1.04726595146923392e-07, +-9.12299047392464954e-08, +-7.98391430590686039e-08, +-7.01720058693889852e-08, +-6.19247658323089750e-08, +-5.48543446381524055e-08, +-4.87648584988061962e-08, +-4.34974304037151995e-08, +-3.89224110999135759e-08, +-3.49333922805725551e-08, +-3.14425647934969766e-08, +-2.83770942149801021e-08, + 8.71949198500353186e-07, + 5.11329450484750919e-06, + 4.90165367877071434e-06, +-3.65895487470560389e-06, +-5.21011653603809292e-06, +-1.36541448713981255e-06, + 3.79456361506052283e-07, + 5.28350139777584469e-07, + 3.59350239214581151e-07, + 2.19603714832746367e-07, + 1.35166491454439888e-07, + 8.60178578701613742e-08, + 5.67070395271730259e-08, + 3.85854569863830730e-08, + 2.69862514342274681e-08, + 1.93298615241188121e-08, + 1.41380005619119252e-08, + 1.05329747955897271e-08, + 7.97676279947788497e-09, + 6.13005939018038431e-09, + 4.77339799180157665e-09, + 3.76157238738644796e-09, + 2.99652909470700931e-09, + 2.41082102271635665e-09, + 1.95726787972014399e-09, + 1.60235566363693938e-09, + 1.32194048496607802e-09, + 1.09840180558428081e-09, + 9.18725050698996946e-10, + 7.73190324589426520e-10, + 6.54463179116512720e-10, + 5.56955767984054331e-10, + 4.76372541580382661e-10, + 4.09383586058909866e-10, + 3.53387098874892880e-10, + 3.06335129499009395e-10, + 2.66604363396461729e-10, + 2.32899636316870625e-10, + 2.04181108997659984e-10, + 1.79609058726011900e-10, + 1.56230306764146130e-07, + 2.06963027927523620e-07, +-3.00266441043436679e-07, +-3.62068563151750758e-07, + 1.59689628902617469e-07, + 1.56279334453630414e-07, + 3.16585919695912936e-08, +-6.25215542245602736e-09, +-8.48641548128543812e-09, +-5.45635525010156961e-09, +-3.17416088919728466e-09, +-1.86484816159107064e-09, +-1.13385580309703076e-09, +-7.14703423167326324e-10, +-4.65408642742549311e-10, +-3.11852011002600467e-10, +-2.14261220218872506e-10, +-1.50501769251823380e-10, +-1.07813779277565008e-10, +-7.86034277034001032e-11, +-5.82208342143425012e-11, +-4.37451351787744877e-11, +-3.32988767662166337e-11, +-2.56499427911192589e-11, +-1.99742013839989943e-11, +-1.57108766445753854e-11, +-1.24722361388377857e-11, +-9.98628825016640593e-12, +-8.05960650715629958e-12, +-6.55292289892377902e-12, +-5.36481335951390784e-12, +-4.42055871542267787e-12, +-3.66461907462739720e-12, +-3.05526368095555960e-12, +-2.56090781129487801e-12, +-2.15739164491202750e-12, +-1.82614343837695210e-12, +-1.55272966704942430e-12, +-1.32590525873777582e-12, +-1.13681091209342538e-12, + 7.25322540145070643e-09, +-8.47161825517441303e-09, +-2.46558382486953192e-08, + 2.12778044388769900e-08, + 1.12254918327450340e-08, +-6.25413669019146172e-09, +-3.18738189439117653e-09, +-4.75638048541974356e-10, + 1.04754266369345198e-10, + 1.19154828491503604e-10, + 7.19873667999798829e-11, + 4.00680732134519629e-11, + 2.26239040065060244e-11, + 1.32322784282923728e-11, + 8.02579627761655914e-12, + 5.03108630742382039e-12, + 3.24711973202258391e-12, + 2.15047338430834558e-12, + 1.45721549256125053e-12, + 1.00790312162969113e-12, + 7.10115025200711219e-13, + 5.08732392231942794e-13, + 3.70035898245725326e-13, + 2.72898645093264678e-13, + 2.03839335796763997e-13, + 1.54042290818144303e-13, + 1.17675121607760300e-13, + 9.07929392030732363e-14, + 7.07052822345927054e-14, + 5.55378555700382649e-14, + 4.39748658373139370e-14, + 3.50832490756626369e-14, + 2.81889462724359423e-14, + 2.28034662989610154e-14, + 1.85581086640165058e-14, + 1.51955631410235799e-14, + 1.25059406824762507e-14, + 1.03527304651693949e-14, + 8.60948919204567681e-15, + 7.19388831836508670e-15, +-1.99878753283469448e-11, +-1.12618818624061696e-09, + 7.97593205658141954e-10, + 1.13946964254260353e-09, +-1.12500895883073114e-09, +-7.72374328883741034e-11, + 1.52120826216503138e-10, + 4.63093475946026249e-11, + 5.02580312389715422e-12, +-1.61093731523781845e-12, +-1.47401260044496741e-12, +-8.37395845360392890e-13, +-4.48197014668808790e-13, +-2.44569884990224689e-13, +-1.38358361890822643e-13, +-8.11572890294502543e-14, +-4.92132802312357763e-14, +-3.07161425185840524e-14, +-1.96894174065169661e-14, +-1.29229531985461752e-14, +-8.66477211377129175e-15, +-5.92000037822989147e-15, +-4.11188088197684669e-15, +-2.90783379065554683e-15, +-2.08093525782525831e-15, +-1.51321422202271610e-15, +-1.09988080506849156e-15, +-8.21796648508883653e-16, +-6.14297617574783893e-16, +-4.66632865148741921e-16, +-3.59368075365131923e-16, +-2.75857290397559523e-16, +-2.15852993289450530e-16, +-1.68379302309660820e-16, +-1.33541621487639763e-16, +-1.05333597098107831e-16, +-8.67799671551719210e-17, +-6.62195059584037509e-17, +-5.57453971118030735e-17, +-4.57515277317952831e-17, +-2.23616938194631652e-11, +-2.01127568215922257e-11, + 1.16313749084213652e-10, +-1.08479654563628052e-10, + 9.16992418250517101e-12, + 2.45157906630380673e-11, +-2.83248814214096581e-12, +-2.38529076151181226e-12, +-5.08421129258821992e-13, +-3.70162555372926784e-14, + 2.14941782407433188e-14, + 1.61932224717683552e-14, + 8.70415596501542593e-15, + 4.50088995213286735e-15, + 2.37899375458615622e-15, + 1.30521279587122139e-15, + 7.47372544076344646e-16, + 4.47468795058955492e-16, + 2.70128854433101058e-16, + 1.64599411156320978e-16, + 1.03265312877431479e-16, + 6.63704224124604673e-17, + 4.62261744509154127e-17, + 2.57942382249017644e-17, + 2.29408472903056825e-17, + 1.22042016870311262e-17, + 1.32740716246698782e-17, + 7.08611017916206988e-18, + 4.52012447811628812e-18, + 4.39374021580973603e-18, +-1.34908612084192254e-19, +-1.19346516479922263e-18, + 1.64089665119230036e-18, + 1.87266675482117245e-18, + 1.92529719566832505e-19, + 8.57103423386433987e-19, +-2.11657584286492827e-18, +-5.83966467588434270e-19, +-2.57981360020403217e-18, +-1.05570005990705538e-18, +-1.27208097839325454e-12, + 3.18389947136270054e-12, +-1.22906655269483686e-12, +-3.09924776679015131e-12, + 3.88328853414515826e-12, +-1.29429689821134277e-12, +-1.82528557960619458e-13, + 7.65081465533759661e-14, + 2.68852588042442464e-14, + 4.40282815701544587e-15, + 1.40342402541914068e-16, +-2.45664821062825644e-16, +-1.58519990795099771e-16, +-7.72020368972830824e-17, +-4.70141643077872521e-17, +-2.17761046437559941e-17, +-1.54125822151988362e-17, + 4.75068920771573807e-18, + 9.38998563969392488e-19, + 1.50503322150765761e-18, +-1.10159679884183244e-18, + 1.88107677115843906e-18, + 3.39693047849223025e-18, +-5.34103869996207619e-18, + 3.04090428149324824e-18, +-1.20603037236343963e-18, + 4.32579874379855639e-18, + 2.64180479589592599e-18, + 4.96155084294164013e-18, + 3.08252541137984377e-18, + 1.33860016312544156e-18, + 7.22583020334580249e-19, +-2.52567026706547741e-19, + 9.46491905107955979e-19, + 1.51739764410249804e-18, + 8.99110685997083791e-19, +-3.66391337535084129e-19, + 5.21706752962209738e-19, +-5.15040744724276891e-19, + 4.00512030449142196e-19, +-1.20308089521766563e-14, + 2.18171199918930019e-13, +-5.09049260624979678e-13, + 5.09866382002566900e-13, +-2.08795546431239975e-13, + 2.98856055831764732e-15, + 1.95400923646827418e-14, +-5.78550875347402159e-16, +-1.01092967578845671e-15, +-2.39828343492588816e-16, +-3.16337886092143586e-17, + 1.62310602048215658e-17, + 1.76363064102564561e-17, + 1.30447532329346809e-18, +-2.68860557169752860e-18, + 2.60152222163234875e-18, + 1.18575767369023280e-18, + 2.57191233019537194e-18, + 4.16201480501494383e-18, + 1.27620712050640387e-18, + 1.80970357704047428e-19, +-2.33855125981030844e-18, +-5.06652706223746852e-20, +-1.35502355423789927e-18, +-9.64018394919413009e-19, + 7.94186448631832593e-20, + 1.54756010433188239e-18, +-2.98485764046424648e-19, + 4.41327375321187467e-19, +-1.28462085404502584e-18, +-1.41758264383142761e-18, +-2.77002493039144703e-19, +-1.79124269437541473e-19, +-9.89762389401774595e-19, +-1.69801328193168430e-18, + 3.95114905028048934e-19, +-1.45944938495174425e-18, + 6.00454598135310004e-19, +-8.13393862192184581e-19, +-8.83241556205194733e-19, + 3.02907587969392499e-15, +-1.71241843341461363e-15, +-4.23638301887571768e-15, + 5.41057985723022858e-15, +-5.64872908557511742e-15, + 3.88428517309847439e-15, +-8.84436739005234295e-16, +-1.05046784222747048e-16, + 1.13426669547877866e-17, +-3.98469784313920934e-18, +-8.19211729883523646e-18, +-4.98843928343900187e-18, + 3.34560896131856063e-18, + 6.91834300864345130e-18, + 1.98193960465994372e-18, + 1.25199833982826532e-17, + 1.26652431438588614e-18, + 1.19871410039723984e-17, + 1.03043417486607168e-17, + 4.15192648462456362e-18, + 2.48733472496911552e-18, +-2.09834087950180729e-19, + 5.62371534364650567e-18, + 1.51070418068134533e-18, + 1.03914192928156636e-18, + 3.64629040531509363e-18, + 2.77184811276284909e-18, + 1.09836224151292941e-18, + 1.86137864420138770e-18, + 3.03883478719522188e-18, + 1.04535678324933465e-18, + 5.09220461933506293e-19, + 2.54981953899296643e-18, + 3.75826957275911084e-18, + 1.22001988386145827e-18, + 3.09923273336448066e-18, + 4.15715311653769415e-19, + 2.07081301981156794e-18, +-8.25738909688617426e-19, + 6.23852178945286360e-19, + 2.27726857578411668e-16, +-8.86303644629953593e-16, + 2.07380423249401641e-15, +-2.28064194667557090e-15, + 1.03890587639742914e-15, +-2.62326528335635475e-16, +-2.85518776816200995e-18, + 9.50129601826827067e-18, +-8.73792564579537527e-18, +-2.61487034799209030e-18, +-9.43749438468713517e-18, + 3.16367779313156438e-18, + 3.44602109604302534e-18, + 6.91157576934522478e-19, +-8.80465872407663970e-19, + 9.61841478058435696e-19, + 3.38568308043611634e-19, + 5.11664987404921259e-18, + 4.17805529985982566e-18, +-1.47186510031011691e-18, +-5.03534530241340030e-18, +-3.78139422807600380e-18, + 4.57120019328083087e-19, +-2.23584293461459546e-18, +-1.87651879006642072e-18, +-3.39547835619903454e-19, + 4.23250746269332701e-18, + 4.53346063695795261e-18, + 2.00452428218596877e-18, + 4.84166368772647985e-19, + 1.03994033980411183e-18, +-1.92409377050291940e-18, +-5.65741360823650424e-19, + 8.83015330546503974e-19, +-6.42995010378104619e-19, +-6.91656052284359799e-20, +-1.26538703116888026e-18, + 2.43272216558620404e-18, + 1.42164766041794861e-18, + 7.61438890546895604e-19, + 1.31873036012474728e-17, +-7.41156599218488708e-17, + 3.15912264040295231e-17, +-3.47096677868574468e-17, +-2.71564967099854280e-17, +-1.61628764005676224e-17, + 8.03696550234156196e-19, +-1.41504396876522968e-17, +-7.61369557343204148e-18, +-7.97854094531828170e-18, +-2.41570598940585606e-18, + 1.28384212225714739e-19, + 8.38640235765504922e-18, +-5.90689022181548155e-18, +-3.37744885165896596e-18, +-2.91955892491995596e-18, +-2.92495737065320312e-18, +-7.70816998456413617e-19, +-3.75610715724341239e-18, +-1.29823111700699897e-18, +-3.72310336698066531e-18, +-2.47051122619666796e-18, +-1.11432109021066940e-18, +-1.90852330292235017e-18, +-1.80449469924346887e-18, +-9.36649917416285272e-20, +-5.70485472410799246e-18, +-3.02308090142581035e-18, +-4.02219650519481569e-18, +-3.14728883377486445e-18, +-6.09478748483407904e-18, +-5.84665574143827178e-18, +-5.94328100717781901e-18, +-2.57175947974816350e-18, +-3.74485925087104675e-18, +-7.32924055807340545e-19, +-1.52729433234103654e-18, +-2.83004395225478040e-18, +-3.15327941803746904e-18, +-3.37449146112243930e-18, + 8.48072944111340626e-02, + 1.65545973834004580e-02, + 4.80612801385770904e-03, + 2.22783821011841420e-03, + 1.50964672659052962e-03, + 1.25506574044682091e-03, + 1.13058790418257859e-03, + 1.04791536390528412e-03, + 9.83462837321203744e-04, + 9.30039019900738627e-04, + 8.84545962801025465e-04, + 8.45151229894135886e-04, + 8.10596157000151502e-04, + 7.79963062415916022e-04, + 7.52561547579791521e-04, + 7.27860368725485570e-04, + 7.05443086390769797e-04, + 6.84977997008434170e-04, + 6.66197171335299997e-04, + 6.48881503806502400e-04, + 6.32849835269736838e-04, + 6.17950898874833647e-04, + 6.04057261891343756e-04, + 5.91060703932664894e-04, + 5.78868645614661519e-04, + 5.67401356625159780e-04, + 5.56589749804006122e-04, + 5.46373621181883771e-04, + 5.36700233184852701e-04, + 5.27523164619302792e-04, + 5.18801370024269196e-04, + 5.10498404780094714e-04, + 5.02581782520268409e-04, + 4.95022438950070429e-04, + 4.87794281854135408e-04, + 4.80873811382242795e-04, + 4.74239797998495297e-04, + 4.67873008021842248e-04, + 4.61755968662949602e-04, + 4.55872766010810028e-04, +-6.79601027814194930e-02, +-1.10093335526621743e-02, +-2.24725200888610446e-03, +-5.83190315090242558e-04, +-1.88073467428617459e-04, +-8.01912991685518211e-05, +-4.79373568649097936e-05, +-3.57023007887440416e-05, +-2.90625116106967638e-05, +-2.45088666316576583e-05, +-2.10760252097370785e-05, +-1.83828739124762265e-05, +-1.62192538036809917e-05, +-1.44493403434852959e-05, +-1.29795414782666611e-05, +-1.17431211271946079e-05, +-1.06912934581960875e-05, +-9.78764759963851258e-06, +-9.00451473445353724e-06, +-8.32053246205913266e-06, +-7.71897258803948635e-06, +-7.18656886590307431e-06, +-6.71267979091314374e-06, +-6.28868059863914624e-06, +-5.90751498808672043e-06, +-5.56336003292651326e-06, +-5.25137253659031985e-06, +-4.96749481345882759e-06, +-4.70830438982273075e-06, +-4.47089654984431727e-06, +-4.25279171382179653e-06, +-4.05186178167798748e-06, +-3.86627109767725474e-06, +-3.69442878663589195e-06, +-3.53495000694052564e-06, +-3.38662424942473544e-06, +-3.24838924396140245e-06, +-3.11930935950156304e-06, +-2.99855762774524426e-06, +-2.88540070665601872e-06, + 1.56375716929032342e-02, + 2.27224851579088108e-03, + 3.99731577013637946e-04, + 8.84407885119550032e-05, + 2.33768601721579087e-05, + 6.68275436873044760e-06, + 2.22624554326109293e-06, + 1.04511158379413991e-06, + 6.65640146059351463e-07, + 4.87528384465098843e-07, + 3.77042942503462485e-07, + 2.99927227485222148e-07, + 2.43397404467806426e-07, + 2.00757860993557284e-07, + 1.67890997272916656e-07, + 1.42092410356719751e-07, + 1.21521038864794115e-07, + 1.04889955658439437e-07, + 9.12793404330217670e-08, + 8.00188224801601472e-08, + 7.06112996390160637e-08, + 6.26823952172852015e-08, + 5.59461938911540486e-08, + 5.01815596087078139e-08, + 4.52154785598417530e-08, + 4.09111555640502854e-08, + 3.71593830425985857e-08, + 3.38721990602166321e-08, + 3.09781699593558544e-08, + 2.84188415535532928e-08, + 2.61460413291668545e-08, + 2.41198075575925925e-08, + 2.23067851871312536e-08, + 2.06789727600069993e-08, + 1.92127357728418009e-08, + 1.78880240461094516e-08, + 1.66877465808016398e-08, + 1.55972689260437141e-08, + 1.46040065426603446e-08, + 1.36970939004223356e-08, +-2.55578002943388513e-03, +-3.42041383824748149e-04, +-5.32091464272570975e-05, +-1.01870526789359857e-05, +-2.47468392766221547e-06, +-6.67459245911724490e-07, +-1.74229405008435182e-07, +-4.96374069268174357e-08, +-1.98236404386077325e-08, +-1.12274259560592348e-08, +-7.55882059397262351e-09, +-5.44567838770746130e-09, +-4.05947269682789581e-09, +-3.09934275587989781e-09, +-2.41297586828405609e-09, +-1.91035353137757246e-09, +-1.53471650059058997e-09, +-1.24895022191194078e-09, +-1.02811219830616815e-09, +-8.55045441607650246e-10, +-7.17703486238314841e-10, +-6.07471408320326683e-10, +-5.18085615693020111e-10, +-4.44923390750822955e-10, +-3.84526238462122882e-10, +-3.34274268965908658e-10, +-2.92160060752681843e-10, +-2.56629221284238703e-10, +-2.26466401104783625e-10, +-2.00712749809511596e-10, +-1.78605429103629971e-10, +-1.59532795381188435e-10, +-1.43000851072711635e-10, +-1.28607888885638505e-10, +-1.16025155541033856e-10, +-1.04981982058544731e-10, +-9.52542570631798766e-11, +-8.66554258171613131e-11, +-7.90294113522366142e-11, +-7.22450107529691710e-11, + 3.26170634680055232e-04, + 4.10295969893617298e-05, + 5.81173867749439385e-06, + 9.64461821916222340e-07, + 2.03737111146238675e-07, + 5.49133094131315976e-08, + 1.45222412756288306e-08, + 3.44950956489023731e-09, + 8.82846777349300693e-10, + 3.18515830856449402e-10, + 1.66245866524434395e-10, + 1.04805608866365472e-10, + 7.12185402178972979e-11, + 5.02564265180680784e-11, + 3.64157477399115676e-11, + 2.69679826471427262e-11, + 2.03513787998153002e-11, + 1.56151080123921642e-11, + 1.21589809700997648e-11, + 9.59345277702016536e-12, + 7.65957490215536555e-12, + 6.18151473092866304e-12, + 5.03757323783878192e-12, + 4.14204880205965693e-12, + 3.43363204080601003e-12, + 2.86782801821284532e-12, + 2.41191596546510381e-12, + 2.04153969177477775e-12, + 1.73836440578693334e-12, + 1.48844432430060480e-12, + 1.28106873886001881e-12, + 1.10793733702097064e-12, + 9.62563442901901632e-13, + 8.39837681548991418e-13, + 7.35705895332292059e-13, + 6.46928525372518454e-13, + 5.70900258606150837e-13, + 5.05512727041972074e-13, + 4.49049895898391947e-13, + 4.00107331259430862e-13, +-3.42549177601524554e-05, +-4.10590411793458518e-06, +-5.42707545605098165e-07, +-8.11771235043894150e-08, +-1.42083752280549945e-08, +-3.49532650830277979e-09, +-1.01054056241915393e-09, +-2.48396891283676407e-10, +-5.38744689134961578e-11, +-1.28365345984099850e-11, +-4.37244259219670019e-12, +-2.16453931866567866e-12, +-1.29725714998596503e-12, +-8.39740911546049148e-13, +-5.65461996026979361e-13, +-3.91598970491858171e-13, +-2.77585951715542668e-13, +-2.00807315479676594e-13, +-1.47906784921670267e-13, +-1.10712026182581810e-13, +-8.40811295619596552e-14, +-6.46991326987569317e-14, +-5.03820268147610991e-14, +-3.96624228044709899e-14, +-3.15366723002789729e-14, +-2.53067956805834172e-14, +-2.04803624234475203e-14, +-1.67048386738510254e-14, +-1.37249839706656102e-14, +-1.13533587747842361e-14, +-9.45108977667468894e-15, +-7.91429007809950969e-15, +-6.66425894885355568e-15, +-5.64100187339661774e-15, +-4.79832297109304695e-15, +-4.10042955574265213e-15, +-3.51938824004665531e-15, +-3.03323022132126130e-15, +-2.62444575983871369e-15, +-2.27911004229763081e-15, + 3.06188577936924500e-06, + 3.53035739538152210e-07, + 4.41459929455242520e-08, + 6.17394501479584685e-09, + 9.45419517649221935e-10, + 1.79816438255575653e-10, + 5.48110090335916788e-11, + 1.53952883554089427e-11, + 3.41871794370512547e-12, + 6.86784130754815061e-13, + 1.56865393644024788e-13, + 5.21263864192375991e-14, + 2.50068083069844917e-14, + 1.44148235258457918e-14, + 8.95849123431168250e-15, + 5.79354093641095474e-15, + 3.85652498717046370e-15, + 2.63022672682877200e-15, + 1.83255243221983617e-15, + 1.30134908555038993e-15, + 9.40088794902312275e-16, + 6.89703898977190396e-16, + 5.13222727521181987e-16, + 3.86840119538301720e-16, + 2.95034017384414325e-16, + 2.27482046947587013e-16, + 1.77109404408061818e-16, + 1.39229531678861058e-16, + 1.10384195475701851e-16, + 8.82137364129253044e-17, + 7.10540383611995154e-17, + 5.75996135416548434e-17, + 4.70207528880584759e-17, + 3.86084771053193522e-17, + 3.18989881418875908e-17, + 2.64802099386371942e-17, + 2.21123320962868448e-17, + 1.85140128880715338e-17, + 1.55936838353050551e-17, + 1.32596350008842636e-17, +-2.38476850289433180e-07, +-2.66397338337766665e-08, +-3.18268241634071928e-09, +-4.18601616332928858e-10, +-6.21219405082704555e-11, +-8.75863240095872776e-12, +-2.25051308893877327e-12, +-7.69038062080426281e-13, +-1.93078797889359997e-13, +-3.88113559208715236e-14, +-7.35934914514669433e-15, +-1.65228218256786955e-15, +-5.48858003455716004e-16, +-2.59049022734443857e-16, +-1.44874372898873393e-16, +-8.69387320957269497e-17, +-5.42703747621118931e-17, +-3.48680735541729057e-17, +-2.29880798149945339e-17, +-1.54720349330496604e-17, +-1.06356070672212601e-17, +-7.47192977935243885e-18, +-5.28229654936487336e-18, +-3.81508887798755536e-18, +-2.76697564774172413e-18, +-2.04994361107854853e-18, +-1.56047837314842526e-18, +-1.15590742411007402e-18, +-9.08175772100262590e-19, +-6.81471856885118321e-19, +-4.91573248561800267e-19, +-3.91507207378557279e-19, +-3.06086468462015515e-19, +-2.44337307403410679e-19, +-2.09295823309833171e-19, +-1.61885898609858518e-19, +-1.28347515227058080e-19, +-1.25736875570722967e-19, +-1.14029302999597265e-19, +-3.00262086436813635e-20, + 1.64670046550534550e-08, + 1.79184956452596822e-09, + 2.06478862580899550e-10, + 2.55268769954783479e-11, + 3.71458735614065153e-12, + 5.00337618380960524e-13, + 7.07392160270319653e-14, + 2.93741942367281720e-14, + 9.15052108238588460e-15, + 2.01390411613388805e-15, + 3.72413661800537252e-16, + 6.79491759668599979e-17, + 1.53335753088409931e-17, + 5.16638335831963085e-18, + 2.41440515511079652e-18, + 1.34403002518724472e-18, + 7.78019297787165308e-19, + 4.67021539955758434e-19, + 3.13907249044797051e-19, + 1.90886608260015956e-19, + 1.35802981473340904e-19, + 7.86179558827516739e-20, + 5.69176132632986006e-20, + 6.14848068329186937e-20, + 5.27835046275735574e-20, + 1.47643445880267151e-20, +-2.06467316300065713e-20, + 1.23459956280263162e-20, +-1.45000322562319864e-21, +-1.07521955821822373e-20, + 1.96803528231762668e-20, + 4.25696097825432616e-20, + 1.79837671189597235e-20, +-3.05068344827417191e-20, + 2.24235479535504767e-20, + 2.62006360217693955e-21, +-5.04108713270182117e-21, +-1.18695481682962036e-20, +-1.99905592950762918e-20, + 3.33770058420101710e-20, +-1.02155700125181172e-09, +-1.08741341762321118e-10, +-1.21603396638383347e-11, +-1.44403888890796413e-12, +-1.88217108589720273e-13, +-3.13712404647102921e-14, +-2.33324613383483716e-15, +-7.62407468171161340e-16, +-3.48729741831317415e-16, +-9.08080546641006063e-17, +-1.78171681853293062e-17, +-3.11605942608182926e-18, +-5.53495431970903762e-19, +-1.21661747729894445e-19, +-5.67739487485025430e-20, +-8.98267071677655508e-21, +-1.26990062059552985e-20, + 7.57171272655435496e-21, + 1.58503105263197458e-23, + 1.05705420170940876e-20, + 1.84130065229662906e-21, +-2.43321309070598413e-20, + 7.14239060194066124e-21, + 6.32273598734569077e-22, + 3.08626064603306239e-20, + 1.78883485353725937e-20, + 1.44676780303793179e-20, + 1.72958886733702885e-20, + 1.27129775188751333e-20, + 1.99028996575374762e-20, + 4.68721306934181210e-20, + 2.92046550135150793e-20, + 5.06133985628085196e-21, + 1.56516115562580110e-20, + 2.16257028377606917e-20, + 1.05905831164139085e-20, + 1.22383572056583981e-20, +-1.01957983936149870e-20, +-1.34122330166882961e-20, + 3.75023283044566717e-20, + 5.75343572677940642e-11, + 6.01314926280849198e-12, + 6.54761249821777963e-13, + 7.62519286285899379e-14, + 8.54370060498298216e-15, + 1.64480810382488651e-15, + 1.51322986150909571e-16, + 8.13450282410695000e-18, + 9.79143677998494998e-18, + 3.51328597637406994e-18, + 7.73523536902118365e-19, + 1.70309023683457464e-19, + 2.75842026048871785e-20, + 1.38623031286662077e-20, +-9.32346900813056618e-21, + 1.53400182658295428e-20, + 3.26064941319407806e-20, + 7.85218704637839481e-21, + 1.89617800626442763e-20, + 1.28619010969643170e-20, + 5.09963690072777379e-22, +-1.01483752532154555e-20, +-2.04899241212658219e-20, +-1.08565545916049759e-20, +-1.55221993798739691e-20, + 7.11494964640920092e-21, +-1.61884453953374615e-20, +-8.02944042182805310e-22, + 1.11199637190226331e-20, + 1.66655499455089895e-20, + 1.20189056403038714e-20, + 1.85620798344401834e-20, + 4.05374473133957205e-20, + 1.56912528321275227e-20, + 1.11647464849863196e-20, + 4.06678475858101837e-21, + 1.54698649072715907e-20, +-1.43940540409436125e-21, +-8.40266537743732261e-21, + 2.62400439903834202e-20, +-2.96648921785390810e-12, +-3.05401471276835258e-13, +-3.25420747188102698e-14, +-3.65420578028784651e-15, +-4.18972945898634987e-16, +-5.77330465265802512e-17, +-1.18798320385365905e-17, + 1.74444986043435428e-19, +-1.34918057661131486e-19, +-8.90061828886006409e-20, +-3.21878476446506978e-20, +-1.58275510400063128e-20, +-5.93934231389026451e-21, + 2.23241001771224111e-20, +-1.25285446360982899e-20, + 3.77258236332427728e-20, + 2.98889641795664803e-21, + 2.92213468940276878e-20, + 1.42394965144205627e-20, + 3.70416731023216005e-20, + 2.71540633562968892e-21, + 1.68042749188493896e-20, + 2.21911843934064443e-20, + 1.14757172147990890e-20, + 2.15136395586410192e-20, + 1.20965682660301358e-21, +-2.61469591457634089e-20, + 6.08429474997374583e-21, + 2.19313960774845734e-21, + 1.75406797817723136e-20, + 1.98762583343445105e-20, + 1.85405386523597684e-20, + 2.66868749986230949e-20, + 2.64716707933854270e-21, + 8.85516437549525650e-21, + 1.78452488860393983e-20, + 1.17407695915181350e-20, +-6.47156452000048441e-21, +-3.65174796477650458e-22, + 2.85656896338378133e-20, + 1.40968424214947037e-13, + 1.43390777000444988e-14, + 1.50114949763058847e-15, + 1.59752403277567246e-16, + 2.20410894248755529e-17, + 9.95667603022076566e-19, + 7.31282307098502190e-19, + 7.19298979321552744e-20, +-2.19594327052030684e-20, + 2.04350135967010185e-20, +-6.11160761363657419e-21, +-2.78581719885429577e-21, +-2.02840379529760631e-20, +-1.15220006117742283e-20, + 1.78434921150491755e-21, +-2.26004781780557036e-21, + 7.37087455646837438e-21, + 1.55061950632241246e-20, + 2.53237039840691790e-20, + 1.17881363965759837e-21, + 1.43571318397821798e-22, +-1.43495537688124658e-20, +-8.86523736925350904e-21, + 9.19529216219111848e-21, + 8.94755509007904395e-21, + 1.63662044698503527e-20, + 1.59124158165377282e-20, + 2.69271262631828599e-20, +-2.06811403632750374e-21, + 1.33415522905253856e-20, + 1.10794101538423565e-20, + 1.05246574820431496e-21, +-5.07400400644846294e-22, + 8.91497564206406149e-21, + 1.74301474433805350e-20, + 4.29177119688959054e-21, + 5.22360368619131705e-21, + 1.50686502034868309e-21, +-4.42461890125181301e-21, + 1.78015189008756239e-20, +-6.23154545495870164e-15, +-6.31191936660470414e-16, +-6.52670594867457691e-17, +-7.12623100664817319e-18, +-1.00390443346422917e-18, +-9.72194188951483759e-20, +-3.26657077699388294e-20, +-1.32689097681475781e-20, +-1.02131902154512047e-20, + 1.49493371282941539e-20, + 1.97904635353070193e-21, + 4.19936708433066527e-21, + 4.98141479981479961e-21, +-1.40870846412255075e-20, +-1.32100421169779307e-20, + 1.06214222052745023e-20, +-2.10243194473759620e-20, +-4.02503347075759666e-21, +-3.74039478838256093e-21, +-4.63259241218286610e-22, +-2.20608074384105054e-20, +-1.77777544816146475e-20, +-1.35427544002601518e-20, +-5.82787254423171198e-21, + 2.85742272910842172e-21, +-5.63571502887641320e-21, +-2.21811193561121644e-20, +-3.27142682521295495e-20, +-2.54272574304778993e-20, +-1.38556491840263122e-20, +-2.04952104181209395e-20, +-2.46667606151115047e-20, +-1.38685660232601815e-20, +-1.03699463061466160e-20, +-1.44570446191195636e-20, +-1.39881126879304346e-20, +-1.80518960164979856e-20, +-1.98869103439241335e-20, +-2.92097748346164618e-20, +-1.55293122005323070e-21, +// root 1 + 3.91746613034838653e-01, + 3.09682125607124936e-01, + 2.43995331498035067e-01, + 1.93959345720565418e-01, + 1.56840541850478188e-01, + 1.29778067547674819e-01, + 1.10049382973637325e-01, + 9.53713072246702848e-02, + 8.41198856843982379e-02, + 7.52405743633578483e-02, + 6.80578528745592187e-02, + 6.21280593974732481e-02, + 5.71495054568572913e-02, + 5.29101611731216739e-02, + 4.92566794618101919e-02, + 4.60754046430617709e-02, + 4.32803064140209401e-02, + 4.08050642096258048e-02, + 3.85977266221630144e-02, + 3.66170185891661892e-02, + 3.48297320695897458e-02, + 3.32088465218012899e-02, + 3.17321515963525022e-02, + 3.03812221257814472e-02, + 2.91406445575176989e-02, + 2.79974256821134276e-02, + 2.69405354236412174e-02, + 2.59605495152357042e-02, + 2.50493674919052937e-02, + 2.41999881052633384e-02, + 2.34063289652756273e-02, + 2.26630805695911958e-02, + 2.19655873059996336e-02, + 2.13097497862030499e-02, + 2.06919441787441032e-02, + 2.01089551861801871e-02, + 1.95579200476176038e-02, + 1.90362815069181554e-02, + 1.85417481152415423e-02, + 1.80722605672508536e-02, +-4.47372223009446512e-02, +-3.70717076495339429e-02, +-2.86879553792804415e-02, +-2.15013703635878704e-02, +-1.57656669200903279e-02, +-1.14416931872376188e-02, +-8.40767022623917920e-03, +-6.35395574577373497e-03, +-4.95090555792929675e-03, +-3.96256224633846198e-03, +-3.24266258539178658e-03, +-2.70249453526506594e-03, +-2.28689497153701385e-03, +-1.96030804745208178e-03, +-1.69901139092434720e-03, +-1.48669023180733237e-03, +-1.31182565963757175e-03, +-1.16609700498022007e-03, +-1.04337237090088388e-03, +-9.39052285764952832e-04, +-8.49632037157278786e-04, +-7.72403205708357965e-04, +-7.05246002522825566e-04, +-6.46482154253314963e-04, +-5.94768967532613565e-04, +-5.49021906366581086e-04, +-5.08357236765781865e-04, +-4.72049006725400774e-04, +-4.39496408001341908e-04, +-4.10198751871449505e-04, +-3.83736094424007106e-04, +-3.59754099288194093e-04, +-3.37952110749714391e-04, +-3.18073682006038655e-04, +-2.99898997483731295e-04, +-2.83238768383836540e-04, +-2.67929282968563541e-04, +-2.53828368521165782e-04, +-2.40812077994905833e-04, +-2.28771956432161831e-04, + 7.65268638069950655e-04, + 1.07342961789182179e-03, + 9.89432538748566751e-04, + 8.06258209342724814e-04, + 6.28191334173126836e-04, + 4.54669442230335840e-04, + 3.10013051538026710e-04, + 2.09642652283594010e-04, + 1.45378424838866875e-04, + 1.04300168188194723e-04, + 7.72436056157604000e-05, + 5.87768806983695187e-05, + 4.57561162833364623e-05, + 3.63144481116923500e-05, + 2.93020117354679898e-05, + 2.39851158290784673e-05, + 1.98807113763894114e-05, + 1.66619297292552079e-05, + 1.41022023784654567e-05, + 1.20411113380532589e-05, + 1.03629077180643099e-05, + 8.98264731653818386e-06, + 7.83703434928212092e-06, + 6.87824824883342892e-06, + 6.06970316050260999e-06, + 5.38308516455984065e-06, + 4.79624989089156682e-06, + 4.29170932263317287e-06, + 3.85552834235248882e-06, + 3.47651030457290914e-06, + 3.14558917765962820e-06, + 2.85537113009117198e-06, + 2.59978546371497540e-06, + 2.37381640328919604e-06, + 2.17329526686451824e-06, + 1.99473814459469042e-06, + 1.83521817497038602e-06, + 1.69226433856639558e-06, + 1.56378073275196848e-06, + 1.44798178000719949e-06, + 4.84909046679008723e-05, + 4.76702899221525096e-06, +-1.43065647081332076e-05, +-1.51240152013569134e-05, +-1.47871280538615387e-05, +-1.36955324164430087e-05, +-1.02075836222149333e-05, +-6.66268997379805805e-06, +-4.22544986226128685e-06, +-2.73881209725860856e-06, +-1.83913159287754491e-06, +-1.27823131378301386e-06, +-9.15472915277302775e-07, +-6.72718739694181865e-07, +-5.05357164980316761e-07, +-3.86957376174044018e-07, +-3.01292080295885861e-07, +-2.38076164202753515e-07, +-1.90605116108893076e-07, +-1.54398604264568145e-07, +-1.26395723884338412e-07, +-1.04463513634430809e-07, +-8.70889124800949971e-08, +-7.31811368036798843e-08, +-6.19421968347003818e-08, +-5.27804183251881918e-08, +-4.52516682173210667e-08, +-3.90187642543058973e-08, +-3.38230268283137238e-08, +-2.94640679476005138e-08, +-2.57852503787399654e-08, +-2.26631032320219340e-08, +-1.99995331939152500e-08, +-1.77160344752185993e-08, +-1.57493434665668118e-08, +-1.40481484510021852e-08, +-1.25705772529604767e-08, +-1.12822637130812371e-08, +-1.01548485442089444e-08, +-9.16480877981362655e-09, +-2.82915040914222144e-06, +-2.13049244121132263e-06, +-3.82482720993470956e-07, + 7.44308709303968759e-08, +-5.54905628866990814e-09, + 1.60855555317476732e-07, + 2.43702118039661258e-07, + 1.89020588760149916e-07, + 1.18475965985257290e-07, + 7.12174045424212298e-08, + 4.36876686449387150e-08, + 2.77844626240428261e-08, + 1.83147854312593638e-08, + 1.24617940014676962e-08, + 8.71561941245983269e-09, + 6.24286952363461621e-09, + 4.56607967110907921e-09, + 3.40178240811057100e-09, + 2.57621535061675723e-09, + 1.97979474837990815e-09, + 1.54164057689983580e-09, + 1.21485630204831379e-09, + 9.67774077780803288e-10, + 7.78610862182363708e-10, + 6.32129057442177032e-10, + 5.17504830285755882e-10, + 4.26940536261555518e-10, + 3.54745359374339248e-10, + 2.96716052368844959e-10, + 2.49713428143284379e-10, + 2.11368714948864345e-10, + 1.79877229727868843e-10, + 1.53851668302166697e-10, + 1.32216578134735481e-10, + 1.14131672025271525e-10, + 9.89355313433830884e-11, + 8.61038828567589987e-11, + 7.52184349030645986e-11, + 6.59433577995659501e-11, + 5.80074444970599061e-11, +-5.90472203072403930e-08, + 9.56972692906078949e-08, + 5.88825383367769152e-08, +-3.54658841782263713e-09, + 2.99244510064576381e-09, + 8.91788447924778255e-09, +-4.93220326390958255e-10, +-3.81846702886019573e-09, +-2.98970628700914509e-09, +-1.79330194400345465e-09, +-1.02878486282771814e-09, +-6.02688246349563526e-10, +-3.66239798657024306e-10, +-2.30828833263419813e-10, +-1.50311185290789762e-10, +-1.00717336567016725e-10, +-6.91988818101510037e-11, +-4.86068114752376038e-11, +-3.48200831304773681e-11, +-2.53861570953441142e-11, +-1.88032883889692790e-11, +-1.41281458264744435e-11, +-1.07543753224307138e-11, +-8.28403195623596167e-12, +-6.45097043072449673e-12, +-5.07406297683219414e-12, +-4.02809397948316658e-12, +-3.22522290784123713e-12, +-2.60297140781330872e-12, +-2.11636545398595396e-12, +-1.73264560694599573e-12, +-1.42768598543606568e-12, +-1.18354254333409908e-12, +-9.86743229389766467e-13, +-8.27083502556500584e-13, +-6.96762101449613680e-13, +-5.89780750270442386e-13, +-5.01477682073182008e-13, +-4.28219060718734841e-13, +-3.67148539685976048e-13, + 9.77513127406281091e-09, + 1.78981356289002367e-09, +-3.38006845924455379e-09, +-1.05215659009250642e-09, + 8.11062520665178371e-10, +-3.07205520807112969e-10, +-3.03270636363061470e-10, +-1.14997009084775294e-11, + 5.48487639971342721e-11, + 4.12070912667410549e-11, + 2.35764092882299074e-11, + 1.29778328921280883e-11, + 7.31080739685511681e-12, + 4.27399550727095675e-12, + 2.59209813807866087e-12, + 1.62487203705886018e-12, + 1.04870627053870371e-12, + 6.94524678759697974e-13, + 4.70626161169719184e-13, + 3.25515660833101143e-13, + 2.29344242117376486e-13, + 1.64305712198735517e-13, + 1.19508082034780655e-13, + 8.81395180075016275e-14, + 6.58313209530243468e-14, + 4.97526729568535251e-14, + 3.80075952630171352e-14, + 2.93228498584460730e-14, + 2.28344357087629654e-14, + 1.79373169020520299e-14, + 1.42039860916330926e-14, + 1.13317370753718607e-14, + 9.10522755748732921e-15, + 7.36483666962194136e-15, + 5.99400032777625861e-15, + 4.90826875088509228e-15, + 4.03799074508500275e-15, + 3.34332804625348360e-15, + 2.78262544718672721e-15, + 2.32485237864205313e-15, +-3.83678789872360822e-11, +-3.36834689660153021e-10, +-2.48405051053700944e-11, + 1.36567414738833736e-10, +-2.04343802132477686e-11, +-2.44486022901355977e-11, + 1.31463312637775200e-11, + 5.79492706578810973e-12, + 1.34721927863589679e-13, +-7.22413049480139393e-13, +-5.01027124483901996e-13, +-2.73353614522512898e-13, +-1.45076310194589664e-13, +-7.90234728184478405e-14, +-4.46849167486103412e-14, +-2.62085990347075441e-14, +-1.58920066236608990e-14, +-9.92291103521517992e-15, +-6.36229637142318546e-15, +-4.17514043054268439e-15, +-2.79544801553582870e-15, +-1.90851500818037578e-15, +-1.32756473548459780e-15, +-9.36235371022468503e-16, +-6.72451786916816516e-16, +-4.86918359172003144e-16, +-3.55022410521614116e-16, +-2.65913932987662568e-16, +-1.99660481220402344e-16, +-1.50544431846573686e-16, +-1.15148578387301568e-16, +-8.96035062021960658e-17, +-6.87459796171945758e-17, +-5.36127688781108243e-17, +-4.29489355193507318e-17, +-3.37313828107895206e-17, +-2.85772737736754212e-17, +-2.21310216842151297e-17, +-1.64365070710320943e-17, +-1.36135932976612460e-17, +-2.77499342779998056e-11, + 6.83592380124640365e-12, + 9.17453631176942028e-12, +-1.09661379999987427e-12, +-4.22733802103969925e-12, + 2.09256725116376221e-12, + 1.16341832044524380e-13, +-2.93321035037072149e-13, +-7.47312318051470710e-14, + 9.67163384069923431e-16, + 8.59635442896023334e-15, + 5.43072965350290752e-15, + 2.83221322474274076e-15, + 1.45649472937449135e-15, + 7.69804139013696627e-16, + 4.25333197464905025e-16, + 2.42971712264329253e-16, + 1.41400265378127056e-16, + 8.47242038576406563e-17, + 5.30262738211290129e-17, + 3.67971311642323802e-17, + 2.45212440481311266e-17, + 1.65678124566816014e-17, + 1.14039533811864658e-17, + 5.95279486723304772e-18, + 5.16257048212033001e-18, + 5.42228694410761657e-18, + 1.51831125643070391e-18, + 9.24884627090708254e-19, + 1.19669794382383248e-18, + 1.25174085073798806e-18, + 7.50873636481590405e-19, + 5.84760038419496734e-19, + 5.97309473216389411e-19, + 1.11968867392211289e-19, + 1.02091667433242442e-18, +-4.14904599167617316e-19, + 6.78795954169278387e-19, + 1.02578410385657833e-18, + 4.50233835079358632e-19, + 7.19009493772041449e-13, + 5.00456018393370645e-13, +-1.27604998370194654e-13, +-4.06811149642446856e-13, + 2.58252146790520204e-13, +-3.67068041631355581e-15, +-4.18920685122568555e-14, + 5.71259848787039904e-15, + 4.11645599631870936e-15, + 7.03361638150388261e-16, +-5.27459856103428864e-17, +-9.04199956243714369e-17, +-5.14201229967313047e-17, +-2.47833448001513319e-17, +-1.24945105978370959e-17, +-4.51836205952091176e-18, +-2.21489241909964970e-18, +-1.55630969204567744e-18, +-1.77831545456892976e-18, +-8.40035501038330907e-19, + 1.96012941383644067e-18, + 1.31548157728778517e-18, + 2.29137271448248213e-19, + 9.37175019685498673e-19, +-6.53840430960627304e-19, + 6.10161349541729698e-19, + 2.34669173534216299e-18, + 1.16546364295025384e-18, +-4.63109130572207586e-20, + 4.51933452234819526e-19, + 5.88375641081496972e-19, + 1.42818925120377525e-18, + 7.65918659578952860e-19, + 7.16489000884378535e-19, + 1.14654661176015554e-19, + 8.02032846982549909e-19, +-1.84649712114273337e-19, + 2.41737729541958757e-19, + 3.78151530318323792e-19, + 6.55007251368733668e-19, + 6.37098319159366904e-14, +-3.62091597010307581e-14, +-4.27788554601902349e-15, + 4.14435885199207057e-15, + 7.65902344593894222e-15, +-7.45741421065871370e-15, + 2.08823710063613932e-15, + 2.54948547092881308e-16, +-1.25925088933277512e-16, +-3.73947525149569538e-17, +-6.92464412668047898e-18, + 2.87750672884234191e-18, + 3.87056576026590090e-18, + 1.16557616248979185e-18, + 1.34809058464161101e-18, + 2.51804134306211078e-18, +-1.98025733287289348e-19, + 5.65036460679735733e-19, + 3.20842137585496659e-19, + 3.33018828160102153e-19, + 2.79436830462495421e-18, + 1.86771068987017589e-18, + 8.40796101074014327e-19, + 1.20469009359738931e-18, +-9.85401621838506790e-19, + 9.03400065375125685e-19, + 1.36578028478007699e-18, + 2.81197985903373603e-19, +-3.81900409793088598e-19, + 1.26010506239057374e-18, + 2.23216444849758065e-20, +-2.53718316964984273e-19, + 2.63390499628994726e-19, + 6.17378016966360089e-19, +-2.07746215235062901e-19, + 1.02778803587947775e-18, +-6.38178863478337993e-19, + 1.47734607024164863e-19, + 1.42793581203191878e-18, + 5.85536557437593425e-19, +-3.68223708455211415e-15, + 5.92991089538791879e-16, +-2.37707127007693549e-16, + 1.20611689768483399e-15, +-1.14759613218951052e-15, + 3.89338919199326079e-16, +-9.30492512425215210e-18, +-3.61504668441119681e-17, +-2.05026428868953779e-18, + 1.58762930529098207e-18, +-5.21219917471321357e-18, +-8.55441797792020348e-20, +-6.00205899970196446e-19, + 2.73506780367806624e-18, + 2.55515627607737443e-18, + 1.66219746680961955e-18, + 2.51455708164186428e-18, + 1.82473836086971118e-18, +-1.04724240349617022e-18, + 1.64296180273165857e-18, + 1.42791773313893913e-18, + 2.07272767481610120e-18, + 1.42339805296237174e-18, + 1.75760787182449782e-18, + 2.63693139437932609e-19, + 2.28296124884153595e-18, + 1.60892906318111661e-18, + 3.44609307338337650e-19, + 5.55778605295317987e-19, + 6.24768234179116957e-19, + 7.03152581105061587e-20, + 4.71709007856607221e-19, + 8.32205447464409889e-19, + 2.78032666042518543e-20, + 6.88661389036631881e-19, + 8.48586189998076505e-19, +-4.27541082924786418e-19, +-3.42619813920984833e-19, + 1.19224107109924329e-18, + 8.70037388402890882e-19, +-1.19173142196022703e-16, + 6.99223270188677166e-17, +-4.97408702054729661e-17, + 8.51770092878570816e-18, +-4.11624796021774625e-18, + 5.14716705824316427e-18, +-6.01428954644845458e-18, + 6.94283531052904552e-20, +-1.26236157526453549e-18, +-1.31461127042021806e-18, +-2.04399220607523833e-18, + 1.54948080742801837e-18, +-2.39250148610050092e-19, +-9.84441590632624888e-19, +-3.02221538427807727e-20, + 9.97817106874362738e-19, +-8.64376667663144613e-19, + 2.86678619869245273e-19, +-7.69205284940098520e-19, + 3.52522953943103831e-19, + 1.08683724620132369e-18, +-2.27412878896439016e-19, + 2.70882069404371704e-20, +-6.55099825558668301e-19, +-6.23300100536037261e-19, +-1.79500205367942501e-19, + 2.29843963628221100e-18, + 3.87836584955334141e-19, + 7.12598075311343526e-19, + 1.16467164948392044e-18, + 7.26487523963810295e-19, + 3.93512056778743530e-19, + 8.73143567397531626e-19, + 1.32927982167113728e-18, + 7.27121905571490846e-19, + 2.66158704570367030e-19, + 1.63222803535760986e-19, + 5.97163669675993393e-19, + 6.73615368646435910e-19, + 4.29734942043880367e-20, + 4.78192194447468474e-18, +-4.55296864645505725e-17, +-1.08333837611718446e-17, +-5.35359988795013824e-18, +-9.53118284332814241e-19, +-4.84648289656090673e-18, +-4.84395435495284453e-18, +-3.89091580496887582e-18, +-5.03491715943704758e-18, +-3.54603985459150483e-19, + 1.41977877827775638e-18, +-3.94843435490984175e-19, + 3.95026273826092271e-19, +-1.74827928110296307e-18, +-2.53566037146498313e-18, +-1.25907592516957520e-18, +-8.32603156964956765e-19, +-9.01508734059338759e-19, +-3.84036497625328989e-19, + 2.41758769699374242e-19, +-3.31395838711833115e-19, + 5.15618099080379397e-20, +-2.60633390381078932e-19, +-9.59685358769798165e-19, +-7.77164940842387929e-19, +-7.79418357054255319e-19, +-7.79203512047346703e-19, +-1.95308789937335140e-18, +-1.13982618692625692e-18, +-1.08369752215319227e-18, +-1.33679129884549931e-18, +-1.14299129546684495e-18, +-2.66753440799109283e-19, +-3.13749365065951738e-19, +-8.70761014725148435e-19, +-1.53637091497445977e-19, +-1.30779724671099033e-18, +-6.08349740871686453e-19, +-4.75957766806301243e-19, +-1.60833462568668309e-19, + 2.41167911606166213e-01, + 1.17190335714545249e-01, + 7.46974002469166509e-02, + 5.67636213133484585e-02, + 4.78458037791573906e-02, + 4.26240088924321470e-02, + 3.90444499730053032e-02, + 3.63095968735705280e-02, + 3.40957474143903996e-02, + 3.22464250258080523e-02, + 3.06694685735215689e-02, + 2.93036018058500970e-02, + 2.81054931643444500e-02, + 2.70433642058170824e-02, + 2.60932819295714886e-02, + 2.52368273059742076e-02, + 2.44595613542435211e-02, + 2.37499830495599452e-02, + 2.30988025834223364e-02, + 2.24984229915285334e-02, + 2.19425630111096531e-02, + 2.14259778238759004e-02, + 2.09442490029562133e-02, + 2.04936242638120505e-02, + 2.00708936364683843e-02, + 1.96732926619631113e-02, + 1.92984259073191999e-02, + 1.89442059430760534e-02, + 1.86088042192764508e-02, + 1.82906111914296066e-02, + 1.79882037057898028e-02, + 1.77003181318420855e-02, + 1.74258280820858841e-02, + 1.71637258212217481e-02, + 1.69131066637336937e-02, + 1.66731558082020628e-02, + 1.64431371709571270e-02, + 1.62223838698495083e-02, + 1.60102900774623594e-02, + 1.58063040167775483e-02, +-1.01532140102558163e-01, +-3.20660276632044119e-02, +-1.26709995808539332e-02, +-5.92579156534425635e-03, +-3.23416922511050430e-03, +-2.08312114325104845e-03, +-1.53301170810913744e-03, +-1.21684937006358469e-03, +-1.00456975298781953e-03, +-8.49362325402568813e-04, +-7.30706335256243252e-04, +-6.37375699635054781e-04, +-5.62363254928395745e-04, +-5.00996421612311116e-04, +-4.50034722883887767e-04, +-4.07164796779015061e-04, +-3.70695174788798982e-04, +-3.39363403778096973e-04, +-3.12210134115243102e-04, +-2.88494675449844310e-04, +-2.67637017432239015e-04, +-2.49177184515729413e-04, +-2.32746207831014697e-04, +-2.18045044182664543e-04, +-2.04829033114809817e-04, +-1.92896278504914244e-04, +-1.82078854029926463e-04, +-1.72236069090897482e-04, +-1.63249257551176751e-04, +-1.55017705297020165e-04, +-1.47455438799137735e-04, +-1.40488671248341173e-04, +-1.34053755647509164e-04, +-1.28095532183022666e-04, +-1.22565984765333179e-04, +-1.17423141867896937e-04, +-1.12630171800318205e-04, +-1.08154633781065533e-04, +-1.03967854651016098e-04, +-1.00044407519068302e-04, + 1.58938546038675452e-02, + 4.05430476183908130e-03, + 1.30938302279389124e-03, + 5.02749875390381094e-04, + 2.09496049795363811e-04, + 9.39538655276527229e-05, + 4.96400251117218441e-05, + 3.14779385152964470e-05, + 2.23478917903474682e-05, + 1.68007916028710573e-05, + 1.30594655126798866e-05, + 1.03975586176778622e-05, + 8.43902112286343762e-06, + 6.96077755076150422e-06, + 5.82121836117489649e-06, + 4.92671611118738516e-06, + 4.21345299232552760e-06, + 3.63680976250094132e-06, + 3.16489405102640847e-06, + 2.77446237080005136e-06, + 2.44827888903882365e-06, + 2.17336298453342090e-06, + 1.93980122340699037e-06, + 1.73992623896394631e-06, + 1.56773918880015592e-06, + 1.41849702534546107e-06, + 1.28841323553628479e-06, + 1.17443794843723369e-06, + 1.07409437187164183e-06, + 9.85355745927141301e-07, + 9.06551803257203993e-07, + 8.36296965966058592e-07, + 7.73434726951683076e-07, + 7.16994202262318281e-07, + 6.66155921700031601e-07, + 6.20224692970552802e-07, + 5.78607926328481083e-07, + 5.40798206995331716e-07, + 5.06359196002514349e-07, + 4.74914156926684693e-07, +-1.94804096416814122e-03, +-4.14715786820702358e-04, +-1.11296595753513307e-04, +-3.76265187370992301e-05, +-1.47715257330497674e-05, +-5.72404540307708192e-06, +-2.21631716465827787e-06, +-1.01024208870628241e-06, +-5.72298769613766311e-07, +-3.72469067466218531e-07, +-2.59804598177876906e-07, +-1.88524215833944661e-07, +-1.40716885053741152e-07, +-1.07458134114813891e-07, +-8.36637189834920032e-08, +-6.62369119766578874e-08, +-5.32126389940853167e-08, +-4.33043780987261666e-08, +-3.56473453803270269e-08, +-2.96466672336840226e-08, +-2.48846615611063899e-08, +-2.10626264106499320e-08, +-1.79633866259778430e-08, +-1.54266604683137373e-08, +-1.33325328471335828e-08, +-1.15901653153351076e-08, +-1.01299552961497962e-08, +-8.89800794030971451e-09, +-7.85218388069690544e-09, +-6.95923726912543568e-09, +-6.19271850123074800e-09, +-5.53142028401195203e-09, +-4.95821443169059139e-09, +-4.45917269509919729e-09, +-4.02289633971742111e-09, +-3.64000056174529924e-09, +-3.30271483219586206e-09, +-3.00457080724272307e-09, +-2.74015689121677873e-09, +-2.50492393861557991e-09, + 2.00253623978572434e-04, + 3.67882934252235252e-05, + 8.28022170749947670e-06, + 2.29888050816997552e-06, + 8.48568483506699169e-07, + 3.46729264049443760e-07, + 1.23237223505400706e-07, + 4.21155872231690366e-08, + 1.72457594845469150e-08, + 9.00246597387944261e-09, + 5.47852959815215666e-09, + 3.59644117169708932e-09, + 2.46466761655679460e-09, + 1.74196372433553512e-09, + 1.26256481667856895e-09, + 9.35043384319766775e-10, + 7.05634861281157093e-10, + 5.41416648335519507e-10, + 4.21583741444773737e-10, + 3.32630159710094761e-10, + 2.65577544254122918e-10, + 2.14329323048916283e-10, + 1.74665873219910947e-10, + 1.43615691979926329e-10, + 1.19053025701543251e-10, + 9.94351146318409333e-11, + 8.36274526639260131e-11, + 7.07855319565199114e-11, + 6.02736522155661665e-11, + 5.16082683689151589e-11, + 4.44180104392329910e-11, + 3.84150926637209076e-11, + 3.33745972058333047e-11, + 2.91193749415941597e-11, + 2.55088522792414639e-11, + 2.24307092268636107e-11, + 1.97946084534729434e-11, + 1.75274527811229528e-11, + 1.55697379685897565e-11, + 1.38727682352008421e-11, +-1.78546437780927775e-05, +-2.90688989607007826e-06, +-5.74310036415056345e-07, +-1.31184273226870287e-07, +-3.73574171580027455e-08, +-1.65399173451554154e-08, +-6.71630388798212249e-09, +-2.12725931123096674e-09, +-6.55777098726518420e-10, +-2.49756789100500376e-10, +-1.23231570798716719e-10, +-7.12272900134396254e-11, +-4.44927355766753570e-11, +-2.90568071293852968e-11, +-1.95991006778976468e-11, +-1.35769722560799828e-11, +-9.62454444132927254e-12, +-6.96250537591880434e-12, +-5.12831358870710414e-12, +-3.83867561291468067e-12, +-2.91531386535547012e-12, +-2.24328722123141142e-12, +-1.74687600058589675e-12, +-1.37520039076850529e-12, +-1.09345746373121171e-12, +-8.77453264935827414e-13, +-7.10106053022671875e-13, +-5.79201949121184426e-13, +-4.75880432484329103e-13, +-3.93649773403583691e-13, +-3.27697021583959505e-13, +-2.74409583996144011e-13, +-2.31068348540790695e-13, +-1.95588281755063305e-13, +-1.66369450024958234e-13, +-1.42172316980348523e-13, +-1.22026190428218264e-13, +-1.05168722902424032e-13, +-9.09956800016007301e-14, +-7.90247458126134169e-14, + 1.41047201329559195e-06, + 2.07055036274896677e-07, + 3.65351648593206510e-08, + 7.75321986936970603e-09, + 1.55037467611331679e-09, + 5.29713706470348473e-10, + 2.93253323030995059e-10, + 1.07044368857462054e-10, + 2.99686531924117025e-11, + 8.55876548740055345e-12, + 3.12196782936469830e-12, + 1.48505013457814372e-12, + 8.25036029915453252e-13, + 4.94588354567290548e-13, + 3.09994010120623570e-13, + 2.00804420439886132e-13, + 1.33708372565814418e-13, + 9.11960546760706925e-14, + 6.35387577069148954e-14, + 4.51211034384575478e-14, + 3.25945670674075975e-14, + 2.39142641594752007e-14, + 1.77949282401357994e-14, + 1.34126431190222388e-14, + 1.02295852973590435e-14, + 7.88602321681695701e-15, + 6.14284071659036342e-15, + 4.82679380920292053e-15, + 3.82678776479026596e-15, + 3.05896469440012794e-15, + 2.46109182847215627e-15, + 1.99728491935774010e-15, + 1.63004509866560769e-15, + 1.33822180893689530e-15, + 1.10572471900447813e-15, + 9.19129297279024812e-16, + 7.66351478266213053e-16, + 6.43099700137945141e-16, + 5.41349947923367271e-16, + 4.59198911588226426e-16, +-1.00167732453170232e-07, +-1.35015167807503761e-08, +-2.11697288513123252e-09, +-4.22560270857556081e-10, +-8.83090446703805212e-11, +-1.03038989513786527e-11, +-8.25790463452381873e-12, +-4.53750536020714609e-12, +-1.40005956397250442e-12, +-3.52164843024407814e-13, +-9.58022635109400293e-14, +-3.42725574481144526e-14, +-1.59443176614048839e-14, +-8.59196200341793839e-15, +-4.97480229963032783e-15, +-3.00957803923928944e-15, +-1.88023465354928887e-15, +-1.20901682829505391e-15, +-7.96633290428454308e-16, +-5.37163987369673678e-16, +-3.69338074176213071e-16, +-2.58056957838534285e-16, +-1.83292451504528282e-16, +-1.32333232804727262e-16, +-9.55112549102057196e-17, +-7.27230529703453542e-17, +-5.16444853458086033e-17, +-4.01024887834314840e-17, +-3.03005905698391036e-17, +-2.34698524940339939e-17, +-1.96513977839539254e-17, +-1.35585567575810291e-17, +-1.17677318022374066e-17, +-8.82128575556666769e-18, +-5.75484683026520764e-18, +-4.28794094036244542e-18, +-4.54931355477022794e-18, +-3.37172686484199115e-18, +-2.96949423298185206e-18, +-1.96929282246148296e-18, + 6.46035188460272619e-09, + 8.12370063907354317e-10, + 1.16218179909906780e-10, + 1.91088763081689804e-11, + 5.27963899857134694e-12, + 4.52782454216772454e-13, + 3.94556582916893683e-14, + 1.36792233890608651e-13, + 5.80784244330933429e-14, + 1.52183153394399411e-14, + 3.53323424516659998e-15, + 9.40751487934798517e-16, + 3.37888255227074373e-16, + 1.52680732429312875e-16, + 8.20246903267633380e-17, + 4.58481653575634566e-17, + 2.79025583990373265e-17, + 1.77151893031070889e-17, + 1.08213011011743283e-17, + 7.80479055188421632e-18, + 3.84383591110110337e-18, + 3.46170457072735743e-18, + 2.54204259591079093e-18, + 1.95094640205376716e-18, + 2.06366001560202273e-18, +-9.20166298383481918e-19, + 1.71889250448423856e-18, +-1.87749866317314129e-19, + 5.39608257582311099e-19, + 2.34021400790709503e-20, +-4.07378483757922924e-19, + 8.43955544612050812e-19, +-3.64361679618255237e-19, + 5.09295656645810680e-19, + 7.88379412763749940e-19, + 1.04711795910181940e-18, + 1.34171166139007701e-19, + 3.49276076609199191e-19, + 1.49725490046930592e-20, +-2.39379984661866808e-20, +-3.81621125446828200e-10, +-4.52008552102729424e-11, +-6.08414410518085867e-12, +-8.43415395606405261e-13, +-1.96994955574267716e-13, +-5.67232887025877428e-14, + 7.00412836176056871e-15, +-1.47389947654288004e-15, +-1.90625453277015699e-15, +-6.11408425226810030e-16, +-1.40825542859190706e-16, +-3.09877476671707295e-17, +-6.49679755665481043e-18, +-3.91000669151666143e-18, +-6.22504131478443695e-19, +-8.77808088451866590e-19, + 2.18537605347256476e-19, + 1.01345488896486132e-18, + 8.39888630443541342e-19, + 7.39667083072829598e-19, +-4.10610847406909852e-19, + 4.78069664323374986e-19, + 3.54366432525058699e-19, + 1.23757962959688470e-18, + 8.95289452241446836e-19, +-5.93658483738590980e-19, + 1.01825922791516379e-18, +-1.06192586323511341e-19, +-1.34311936853927231e-19, + 2.52819169862195661e-19, +-8.52275806016714410e-20, + 1.53348814276192857e-18, + 5.19072645777244023e-19, +-2.87521220814966201e-19, + 5.93734819283451053e-19, + 7.23673783214072015e-19, +-1.06694332348682660e-19, + 1.19502759721810675e-18, + 3.09329384567251742e-20, + 5.08769353583105161e-20, + 2.07988436605765914e-11, + 2.34024979264874627e-12, + 2.93059096184459385e-13, + 4.44351490597830163e-14, + 2.48993727975766872e-15, + 3.76400192014403030e-15, +-4.25496906739090213e-17, +-1.14066826363676880e-16, + 3.96237821946108973e-17, + 2.23562082374039212e-17, + 6.01396715031443532e-18, + 2.08680993828349950e-18, + 1.76250256675503489e-18, +-4.56952323497677176e-19, + 6.74046215746939355e-20, + 1.35044584478730906e-19, + 5.43779586008686207e-19, + 1.47530462693426635e-18, + 6.07566106955987311e-19, + 1.16229065917857250e-18, +-3.95631896493421877e-19, + 3.42631886104212755e-19, +-1.10139267612765598e-19, +-1.30132896428642275e-19, + 1.26602398875988465e-18, +-5.39767705991925745e-19, + 1.41660927799485559e-18, +-3.26642902824862398e-19, + 6.15384626780314050e-19, + 3.28613388323214345e-19, +-3.63764731824526070e-19, + 6.46159728843960182e-19, + 2.78708514779377332e-19, + 7.22957873515733416e-20, + 5.53186170699939736e-19, + 1.62841057855442171e-18, + 8.85739636479198580e-19, + 1.02532975847722540e-18, +-1.92615209228630489e-19, + 2.62813457096182337e-19, +-1.05243351121169023e-12, +-1.13353873206725400e-13, +-1.32380667654286031e-14, +-2.05242768329972207e-15, +-6.92244227898346936e-17, +-8.20111841170259639e-17, +-3.31855271631245440e-17, + 7.72781127272926216e-18, +-1.78558045922131254e-18, + 3.90246924987473850e-19, +-3.33348490690441811e-19, +-1.26877752908481918e-19, + 1.00197754483788121e-18, + 2.25994507017906842e-19, + 7.43675650894065217e-19, + 4.64827127500868539e-19, + 6.32335994551318418e-19, + 3.85205240580077951e-19, + 3.61625157533383538e-19, + 8.58241532919112753e-19, + 1.99416251250283638e-19, + 1.05550359199947568e-18, + 4.97195103299492304e-19, + 6.21285389046715770e-19, + 1.34292741420341039e-18, + 2.68492969553792901e-19, + 9.05003454123764036e-19, + 5.16326407377959450e-19, + 6.38077063951357889e-20, + 2.01787878111245579e-19, +-4.45025052612055180e-19, + 5.72383978930594637e-19, + 3.29874975752399960e-20, + 1.59450718996995684e-19, + 6.89344776156192641e-19, + 3.81754298790443744e-19, +-1.07950178997485083e-19, + 1.35039981395149174e-19, +-5.87655689917100364e-19, + 6.46543347854716448e-19, + 4.96879445206861561e-14, + 5.14136648332592278e-15, + 5.84554930418286299e-16, + 5.69982438322005980e-17, + 2.11471654389197066e-17, +-4.83354905530677584e-18, + 1.73329837254207667e-18, + 6.01772849500684068e-19, + 1.50810111339006348e-19, +-3.54218648960663697e-19, + 3.19347373577242403e-19, + 1.73295431613602295e-19, + 6.96655516752358496e-19, + 8.60365563492867582e-20, +-2.39117171107444177e-19, +-6.85567314327036337e-19, + 3.51406878551908028e-19, + 8.18906662810780149e-20, + 6.28633715475598067e-19, + 9.27882141358999123e-19, +-3.53029714063243272e-19, +-3.61784749666286611e-19, + 5.03383643673299105e-19, + 1.05423559092054036e-19, + 8.74275583569682143e-20, +-2.60914854617980228e-19, + 1.38521757052637809e-18, + 1.40871025234874178e-19, +-1.79999572175331001e-19, + 3.56330252731279022e-19, +-1.92313232361638874e-19, + 4.94563163381895268e-19, + 2.25269892773728171e-19, + 5.29565150964842617e-20, + 1.09883605499934941e-18, + 7.72113674421335305e-19, + 3.51821630922854358e-19, + 8.66789946549866167e-20, +-1.39640044289711193e-19, +-1.54820476659634800e-19, +-2.25009093662860538e-15, +-2.42318837056641755e-16, +-2.68326811544404784e-17, +-4.52758981855826007e-18, +-1.22970411770320457e-18, + 7.37293192091305641e-19, +-7.71582789982256024e-20, +-3.87148406848040830e-19, +-1.07692910230445487e-18, + 1.17571392651156362e-18, +-5.72291772424201511e-19, +-2.81586345303615216e-19, + 3.72223714662347359e-19, + 6.07887227809250937e-20, +-4.65554684884788995e-19, +-2.40890030003244540e-19, +-7.79115058776459549e-19, +-4.09677712307758746e-20, + 1.05245039251358610e-19, + 7.31647902932687122e-22, +-6.56586586222780707e-19, +-4.22913135392205819e-19, + 5.63229280827947688e-19, +-5.08660227811731360e-20, +-9.24646335436647254e-19, + 2.21425850009684347e-20, +-5.67238806935695435e-19, +-9.07941710993864305e-19, +-1.49988237493749870e-18, +-3.61608428739933637e-19, + 6.79088218850139940e-20, +-8.26025121611647930e-19, +-5.07095912373576888e-19, +-7.25958415677564267e-19, +-4.17914807622202716e-19, +-6.81048252164047894e-19, +-1.16263643562618746e-19, +-1.76655002284579392e-19, +-7.86915446198041780e-19, +-2.58471895503026406e-20, +// root 2 + 4.82923687464474199e-02, + 3.51772859620418515e-02, + 2.66523745944828895e-02, + 2.08371657214954341e-02, + 1.67493311634084770e-02, + 1.38359463852518062e-02, + 1.17282745708887706e-02, + 1.01633139894486794e-02, + 8.96420528343429973e-03, + 8.01797303912092120e-03, + 7.25254865007585615e-03, + 6.62064322818432111e-03, + 6.09010628880146156e-03, + 5.63834284520624719e-03, + 5.24901153303264974e-03, + 4.91000069436603979e-03, + 4.61214255612905997e-03, + 4.34836970298846468e-03, + 4.11314596114400587e-03, + 3.90207287578129463e-03, + 3.71161164988148117e-03, + 3.53888285397010354e-03, + 3.38151965411356359e-03, + 3.23755858225916165e-03, + 3.10535710147402536e-03, + 2.98353059738731396e-03, + 2.87090365589508364e-03, + 2.76647198507171512e-03, + 2.66937236322568319e-03, + 2.57885870609129509e-03, + 2.49428284704857582e-03, + 2.41507898183748911e-03, + 2.34075098764884981e-03, + 2.27086201537531019e-03, + 2.20502589336825025e-03, + 2.14289998518642482e-03, + 2.08417922225616337e-03, + 2.02859109195361285e-03, + 1.97589140726654820e-03, + 1.92586071943022172e-03, +-8.13204293127549674e-03, +-5.16138650843787385e-03, +-3.45599080613052945e-03, +-2.40721823069649666e-03, +-1.70770141116983933e-03, +-1.22451694906634237e-03, +-8.96778282795519192e-04, +-6.77218082294293714e-04, +-5.27604648419253280e-04, +-4.22269969506615904e-04, +-3.45552779392616419e-04, +-2.87989895705631732e-04, +-2.43701733792721467e-04, +-2.08899172104689461e-04, +-1.81054234353989982e-04, +-1.58428344300600002e-04, +-1.39793995291254125e-04, +-1.24264499650174792e-04, +-1.11186415079588189e-04, +-1.00069601360390013e-04, +-9.05405807005581795e-05, +-8.23107318478639706e-05, +-7.51541606397115403e-05, +-6.88920227802187281e-05, +-6.33812348734503822e-05, +-5.85062239249761553e-05, +-5.41728152979062972e-05, +-5.03036483076112315e-05, +-4.68346981469634912e-05, +-4.37126091917953069e-05, +-4.08926303452021155e-05, +-3.83370019425592276e-05, +-3.60136847695095375e-05, +-3.38953507105809783e-05, +-3.19585752375127624e-05, +-3.01831868913343367e-05, +-2.85517398188306835e-05, +-2.70490834609703953e-05, +-2.56620094674359829e-05, +-2.43789603940469087e-05, + 4.89153686208482490e-04, + 2.74158746095936050e-04, + 1.62738812382685075e-04, + 1.04860409521527646e-04, + 7.22048246118962785e-05, + 4.95805261429922212e-05, + 3.32276003194148303e-05, + 2.23679484486633176e-05, + 1.54957292752305701e-05, + 1.11151194952700813e-05, + 8.23147223769769666e-06, + 6.26353204170673201e-06, + 4.87597647694979011e-06, + 3.86982967551815542e-06, + 3.12255311402727482e-06, + 2.55596095825033488e-06, + 2.11857730651507267e-06, + 1.77556957283660316e-06, + 1.50279360554224998e-06, + 1.28315454826212232e-06, + 1.10431768283927872e-06, + 9.57230976116065374e-07, + 8.35149346920140064e-07, + 7.32976822219957942e-07, + 6.46814650105534786e-07, + 5.73645572959508582e-07, + 5.11109787901788436e-07, + 4.57343693829532340e-07, + 4.10862302452555093e-07, + 3.70472449274160793e-07, + 3.35208017512685804e-07, + 3.04281087491951648e-07, + 2.77044738530696402e-07, + 2.52964467240683103e-07, + 2.31596040274085135e-07, + 2.12568196652971582e-07, + 1.95569036956440958e-07, + 1.80335238328834359e-07, + 1.66643452035044285e-07, + 1.54303398968157113e-07, +-2.44902153436833566e-05, +-1.26176537074927845e-05, +-6.55449347208440908e-06, +-3.45429647304718347e-06, +-2.18798958630047581e-06, +-1.61477445114516953e-06, +-1.11710312972717279e-06, +-7.14502452235942509e-07, +-4.50887781442162931e-07, +-2.91934866817821868e-07, +-1.95994795380654621e-07, +-1.36215006191504224e-07, +-9.75569835758079245e-08, +-7.16879214271822778e-08, +-5.38531153969075683e-08, +-4.12359046162761009e-08, +-3.21070283685507850e-08, +-2.53704582878888387e-08, +-2.03117315992243699e-08, +-1.64534041535932006e-08, +-1.34692922798683399e-08, +-1.11320981001093796e-08, +-9.28058308030929471e-09, +-7.79850845183048836e-09, +-6.60083686305155344e-09, +-5.62451686819412684e-09, +-4.82221966578879651e-09, +-4.15801360951754851e-09, +-3.60433264778613269e-09, +-3.13982254090538492e-09, +-2.74779132691872204e-09, +-2.41508139678114197e-09, +-2.13123948960138764e-09, +-1.88789967773472276e-09, +-1.67832030903248094e-09, +-1.49703337787715936e-09, +-1.33957679835759159e-09, +-1.20228835962893766e-09, +-1.08214596915552311e-09, +-9.76642914533617485e-10, + 1.02548511815800656e-06, + 5.14425767163266850e-07, + 2.70637684372820608e-07, + 1.25482657026749419e-07, + 4.58202302590662808e-08, + 3.19260168790247622e-08, + 2.92209678070107862e-08, + 2.06853867341873735e-08, + 1.27020289294614366e-08, + 7.59903978387034883e-09, + 4.65672132996869861e-09, + 2.96096895939773464e-09, + 1.95171975472700331e-09, + 1.32798590943607795e-09, + 9.28775451070269524e-10, + 6.65268045635071737e-10, + 4.86581824130752344e-10, + 3.62509111721776950e-10, + 2.74533002153690308e-10, + 2.10975761878435418e-10, + 1.64284097984748910e-10, + 1.29460507857373377e-10, + 1.03130323640219605e-10, + 8.29722471010147506e-11, + 6.73624932370589244e-11, + 5.51476238448686964e-11, + 4.54966881155177619e-11, + 3.78032485751563566e-11, + 3.16193862862069387e-11, + 2.66105770824518183e-11, + 2.25243933334953798e-11, + 1.91685202978167333e-11, + 1.63951201217367072e-11, + 1.40895883524638300e-11, + 1.21623802543997743e-11, + 1.05430116750613851e-11, + 9.17561414699451910e-12, + 8.01561197825925756e-12, + 7.02721821594437623e-12, + 6.18153194455792032e-12, +-3.42794074369866065e-08, +-1.72782824521536830e-08, +-8.73186122149086084e-09, +-5.90518124750441394e-09, +-1.94871473228692957e-09, +-3.47978123876583902e-11, +-3.23657220319424913e-10, +-4.57796598523943204e-10, +-3.26262957559388735e-10, +-1.92120050148260772e-10, +-1.09756549791062025e-10, +-6.42395743827918022e-11, +-3.90297475957380193e-11, +-2.45983219801793874e-11, +-1.60178483156356768e-11, +-1.07328912716235108e-11, +-7.37414144052875689e-12, +-5.17975851831372108e-12, +-3.71058343550252572e-12, +-2.70526219644492695e-12, +-2.00376286875363404e-12, +-1.50555820642730026e-12, +-1.14603394370832125e-12, +-8.82783576453582563e-13, +-6.87443833972885955e-13, +-5.40714557765057356e-13, +-4.29251978692600991e-13, +-3.43693990465172796e-13, +-2.77384415255996112e-13, +-2.25529414563980280e-13, +-1.84638269794974324e-13, +-1.52140537128448663e-13, +-1.26123688619789676e-13, +-1.05151942729343738e-13, +-8.81376509135553004e-14, +-7.42499784366143951e-14, +-6.28494802779177139e-14, +-5.34398259317239534e-14, +-4.56331248608078371e-14, +-3.91251287357152509e-14, + 6.53107683398024700e-10, + 5.77787708899461591e-10, + 1.69014618051821040e-10, + 1.31405665885800538e-10, + 1.55161930304806724e-10, + 1.00513331439343871e-11, +-1.52484001403814255e-11, + 2.58498073720636197e-12, + 6.46985518053892023e-12, + 4.47825925474990081e-12, + 2.52340480024452262e-12, + 1.38427653780809353e-12, + 7.79218882069652730e-13, + 4.55472258616112142e-13, + 2.76227636569343126e-13, + 1.73152953992034837e-13, + 1.11755204668632975e-13, + 7.40119146930310174e-14, + 5.01522558852813138e-14, + 3.46885838940039324e-14, + 2.44396475240784376e-14, + 1.75089705567651355e-14, + 1.27355038428392000e-14, + 9.39228278144059800e-15, + 7.01566572633602967e-15, + 5.30194824573489140e-15, + 4.04994938758506759e-15, + 3.12497745036310736e-15, + 2.43329609548216227e-15, + 1.91149000503266458e-15, + 1.51362780064062734e-15, + 1.20755085027816864e-15, + 9.70198109501533598e-16, + 7.84744461921312045e-16, + 6.38728860961689025e-16, + 5.23014538768742018e-16, + 4.30535859403332922e-16, + 3.56239984390396493e-16, + 2.96310385053423984e-16, + 2.47677267760301924e-16, + 2.64893129139615918e-11, +-1.63706738437753855e-11, +-9.20516715966177168e-12, + 4.11064271614812166e-12, +-4.27635484866781474e-12, +-3.43295492672644776e-12, + 6.30245071081580764e-13, + 3.88308857318707592e-13, +-2.80132602299225121e-14, +-8.32587779921900963e-14, +-5.42147058510493366e-14, +-2.92299002098373395e-14, +-1.54715238621455907e-14, +-8.42236745098298547e-15, +-4.76190268326915776e-15, +-2.79380013911538571e-15, +-1.69330187933094634e-15, +-1.05742502163907016e-15, +-6.77880755049708832e-16, +-4.44504255327710518e-16, +-2.98206605397831319e-16, +-2.03519543449122027e-16, +-1.41435781080177014e-16, +-1.00014937680872267e-16, +-7.14698266766040706e-17, +-5.17893666087861573e-17, +-3.80170154469035271e-17, +-2.82281624739590078e-17, +-2.14628454375811479e-17, +-1.60285982997514243e-17, +-1.23003656248426065e-17, +-9.47687811657332011e-18, +-7.43685816730262975e-18, +-5.85663146404216161e-18, +-4.44075974016566966e-18, +-3.58529554973322384e-18, +-2.92010113097019948e-18, +-2.44176837195417820e-18, +-1.95258852544538849e-18, +-1.54265752223683724e-18, +-3.24167809764338312e-12, +-1.94034475284458891e-13, + 5.09236298931639637e-13, + 6.33329156300374745e-14, +-2.70744123702176110e-13, + 2.01670504543870090e-13, + 3.19038816455222000e-14, +-2.04139652295036984e-14, +-5.55444573116052970e-15, + 4.90782931306820294e-16, + 9.69360894406130990e-16, + 5.85005675989945104e-16, + 3.02484522858298070e-16, + 1.55479330207711525e-16, + 8.22183068917396698e-17, + 4.48479669225108986e-17, + 2.60993930648442250e-17, + 1.50659949650990008e-17, + 9.24808754462286472e-18, + 5.79121446548512009e-18, + 3.55771779180736015e-18, + 2.50522164946950694e-18, + 1.66011139136125209e-18, + 1.07874784963807588e-18, + 8.95029278615803213e-19, + 6.28538720228279584e-19, + 3.40465715052559940e-19, + 3.88463953002188448e-19, + 4.67730412574277880e-20, + 2.05225898539338030e-19, + 1.39097352258873104e-19, + 1.29509294228605159e-19, +-1.42600862710158553e-19, + 1.09524643873523288e-21, + 2.92721050402571849e-20, + 2.02996513471894530e-20, + 5.82562253200041849e-20, +-1.01737298383133458e-19, +-6.60334718848532104e-20, +-1.73728110597366081e-20, + 1.64174469102500086e-13, + 3.43684120853717814e-14, + 8.87204262718444264e-15, +-2.98461015957452583e-14, + 1.67840623997465417e-14, + 2.42857682564006388e-16, +-4.18593708826073532e-15, + 2.40903000937733929e-16, + 3.24298705769277089e-16, + 5.48851028513840790e-17, +-8.12708790233434085e-18, +-1.03062728000250437e-17, +-5.40453675454896120e-18, +-2.51636409403858298e-18, +-1.06679949726889386e-18, +-9.31397215767999149e-19, +-8.39737749645012097e-20, + 7.21862992593800493e-21, +-8.40757120782213612e-20, + 1.68106531718270555e-20, +-5.70423885992004763e-20, + 7.21049654374418228e-20, + 1.16058087137665695e-19, +-3.20288534516902441e-20, + 1.15330696524301453e-19, + 1.37021634902987435e-19, + 2.81451535185360449e-20, + 1.75076571190114861e-19, +-1.96814789977601598e-20, + 1.89104998845057329e-19, + 1.69260464455116547e-19, + 1.85888199307121997e-20, + 2.35161820511966748e-20, + 8.86460514317936880e-20, + 1.53017248975760776e-19, + 1.20202949268928749e-19, +-2.50313719447624385e-20, +-6.37170090222833775e-20, + 4.06350323011120618e-20, + 3.19243853575826465e-20, +-5.71072207168240706e-15, +-1.32936406685260555e-15, +-7.26752997006308441e-16, +-1.04208571948898916e-17, + 7.46827819728317041e-16, +-6.26077714233324355e-16, + 1.70327398120699893e-16, + 3.33757710475159992e-17, +-9.17480385028263833e-18, +-2.85038259200739994e-18, +-2.77677999148570134e-19, + 2.75398834678865802e-19, + 4.69335660302162335e-19, + 6.51542638495008888e-20, + 3.65771343499040339e-19, +-2.04155647309763258e-19, + 3.60325899819594204e-19, + 8.15410085019342014e-20, +-1.96365312384705967e-19, + 6.84176017615459524e-20, +-2.26007611822410435e-20, + 8.25138761645082783e-20, + 1.23026655312370782e-19, +-6.89628020823020373e-20, + 8.46003195616302938e-20, + 1.84688783732976826e-19, + 2.54407243828629171e-20, + 1.50175846030418078e-19, +-2.77504284913193332e-20, + 7.70345418005521057e-20, + 3.30157955833002283e-20, + 7.51627063918156845e-20, + 8.16086416639950363e-20, + 3.72361585163372459e-20, + 9.53477335374844573e-20, +-1.28715412748423471e-20, +-4.28055568388744619e-20, +-7.21772290081497153e-22, +-1.69692930557118311e-20, + 2.86335183171469338e-20, + 1.22646138238707630e-16, + 6.15549895470042655e-17, +-3.68720754705200662e-17, + 9.74990044429936480e-17, +-8.15828520934039594e-17, + 2.60169366976015560e-17, + 6.48361820261261377e-19, +-2.92454102821108859e-18, +-6.70469198928637493e-20, + 1.90877912932473620e-19, +-1.20224982679993488e-19, +-1.29879618443346699e-19, +-6.26402636351095681e-20, + 3.18314414588534617e-19, + 3.32197907172788113e-19, + 7.40412006762511787e-20, + 2.84513275688147334e-19, + 3.46243486007690899e-19, + 1.49443214968365261e-19, + 2.27061609261729384e-19, + 5.85370273169938390e-20, + 1.52468683794164246e-19, + 1.41765005510152865e-19, + 6.38726910660542919e-20, + 2.19299595306201822e-19, + 1.52288126107469995e-19, + 1.08608403499708731e-19, + 2.16913036181731766e-19, +-8.01593305802592557e-20, + 6.00186165761258701e-20, + 1.53287151224385160e-19, + 1.05416947834098800e-19, +-1.66776923085576787e-21, + 4.10785065273562284e-20, + 4.73087642446540497e-20, + 5.96330238148037719e-20, + 6.20090282770312564e-20, + 3.03064119762568800e-20, + 1.43196109031377135e-20, + 5.73912200213156543e-20, +-1.11919927883912128e-18, +-3.17615156466105051e-18, +-1.06784522593452300e-18, + 2.24118862448322054e-19, +-1.81208451549900638e-18, + 3.16748947355481194e-19, +-5.52280463710454833e-19, + 3.99221526638116681e-19, +-7.95696423399171853e-20, + 1.34134669484480667e-19, + 1.58826868216090329e-19, + 6.99221301919473417e-21, + 1.95549590264326269e-19, + 4.81522324116532834e-20, + 1.24133079987613513e-19, +-2.00793195926058654e-19, + 6.75020023699034769e-20, + 7.19675406102061573e-20, +-7.60073803918635107e-20, +-3.15787156540604675e-20, +-2.87947609259300795e-20, + 4.14284731641021071e-20, + 1.25385009240171560e-19, +-2.65687948473403881e-20, + 8.04744360276965020e-20, + 1.78729605348044491e-20, + 8.77042287871946112e-20, + 1.44904955363842075e-19, +-3.29005859978046940e-21, + 7.81746026534105020e-20, + 1.13253805762799278e-19, + 1.11397794590858215e-19, + 5.18624606025036807e-20, + 6.19803198393424562e-20, +-2.05598105316359443e-20, + 3.12934342909474930e-20, + 1.56609862909265086e-19, + 5.70490643616452694e-22, + 6.03703346114735524e-20, + 3.15065838493760931e-20, +-3.20106331633407523e-18, +-2.50308668630600321e-18, +-9.69437523402619949e-19, +-6.65697661305099728e-19, +-1.89733797394230478e-19, +-6.12837691663135639e-19, + 1.43270481796610374e-19, +-2.78261704198473325e-19, +-1.50654354046924350e-19, +-1.47000207003258625e-19, +-2.64711447026817234e-20, + 1.32016349560124021e-19, + 4.76589242462386281e-20, +-8.57147077999918391e-20, +-2.64855330391805778e-19, +-2.08993493144698176e-19, +-2.00778163754328391e-19, +-1.05904776150625480e-19, +-3.53154964376787462e-19, +-1.01453001234464654e-19, +-1.51006409123818119e-19, +-7.05075533513946238e-20, +-3.11422491090021696e-20, +-4.59418764062300177e-20, +-1.09883778945783914e-19, +-7.81069755949402939e-20, +-8.52634432422460392e-20, +-3.14075220886632932e-20, +-2.23342077730313246e-19, +-9.71214034042265179e-20, +-1.43093198567604497e-19, +-1.70956919186958304e-19, +-1.92195470711193840e-19, +-2.07754876250318670e-19, +-1.24846141764583977e-19, +-9.16556299950391168e-20, +-6.96418209863485438e-20, +-9.76336159202053288e-20, +-8.66838969615271286e-20, +-7.82449237371660724e-20, + 4.11264760071442081e-01, + 3.29083624571586852e-01, + 2.77473914769050867e-01, + 2.41753979302918615e-01, + 2.15481313856573709e-01, + 1.95490528373861439e-01, + 1.79915505501150291e-01, + 1.67478799338662887e-01, + 1.57295368406466574e-01, + 1.48768058558747723e-01, + 1.41493404320761074e-01, + 1.35192064442068660e-01, + 1.29664604171235376e-01, + 1.24764476739002025e-01, + 1.20381275245646638e-01, + 1.16430024511630481e-01, + 1.12844110455477681e-01, + 1.09570473147499570e-01, + 1.06566254086384676e-01, + 1.03796404701035780e-01, + 1.01231946405163781e-01, + 9.88486822458551351e-02, + 9.66262278244425787e-02, + 9.45472719878438089e-02, + 9.25970055495335398e-02, + 9.07626746866630751e-02, + 8.90332280766213263e-02, + 8.73990353700653255e-02, + 8.58516605574379255e-02, + 8.43836780102222850e-02, + 8.29885220130259504e-02, + 8.16603628103867302e-02, + 8.03940038170639498e-02, + 7.91847958493786808e-02, + 7.80285651435084077e-02, + 7.69215526156303842e-02, + 7.58603623460170073e-02, + 7.48419176759402005e-02, + 7.38634236224910562e-02, + 7.29223345641075715e-02, +-5.25318918540240987e-02, +-3.13484356626251431e-02, +-2.09432749244571441e-02, +-1.50833171611808071e-02, +-1.13414445292748349e-02, +-8.74246818824296786e-03, +-6.89820051219700199e-03, +-5.58388054126118371e-03, +-4.62996024665397916e-03, +-3.91787844048099333e-03, +-3.37102517489408244e-03, +-2.94051997605087895e-03, +-2.59445982560609729e-03, +-2.31134528507664656e-03, +-2.07623378114396269e-03, +-1.87845352536166257e-03, +-1.71020103910977223e-03, +-1.56565201090051601e-03, +-1.44038048553628197e-03, +-1.33096929053009129e-03, +-1.23474254994824931e-03, +-1.14957816803417778e-03, +-1.07377390805372345e-03, +-1.00595013515218179e-03, +-9.44978109075128342e-04, +-8.89926382687302180e-04, +-8.40020228418127970e-04, +-7.94610570625599029e-04, +-7.53149943456300330e-04, +-7.15173702658809763e-04, +-6.80285209622331194e-04, +-6.48144049131552905e-04, +-6.18456585962582576e-04, +-5.90968340486355782e-04, +-5.65457790622658058e-04, +-5.41731300863914343e-04, +-5.19618948320732825e-04, +-4.98971067548100865e-04, +-4.79655375015331290e-04, +-4.61554563839191515e-04, + 3.82530858432837380e-03, + 1.76294666603936997e-03, + 9.38005355545345554e-04, + 5.67636260928365880e-04, + 3.84009958488374054e-04, + 2.71937470127115442e-04, + 1.93101422472030361e-04, + 1.38585937246705094e-04, + 1.02031426752497475e-04, + 7.73540064794782953e-05, + 6.02285801101068156e-05, + 4.79663835604102748e-05, + 3.89330643799398843e-05, + 3.21134862679386916e-05, + 2.68561683464353247e-05, + 2.27293889970840411e-05, + 1.94387522586755236e-05, + 1.67784105552087136e-05, + 1.46012288890691731e-05, + 1.27999735436735120e-05, + 1.12951270621663147e-05, + 1.00268033892755582e-05, + 8.94926692862713421e-06, + 8.02714430773570283e-06, + 7.23275988576500763e-06, + 6.54423162750053508e-06, + 5.94409046660496397e-06, + 5.41826583303085520e-06, + 4.95533105372454151e-06, + 4.54593567812175760e-06, + 4.18237393300909985e-06, + 3.85825345901744530e-06, + 3.56823871427283781e-06, + 3.30785052865249979e-06, + 3.07330827892506251e-06, + 2.86140469762647005e-06, + 2.66940587377964918e-06, + 2.49497085089979184e-06, + 2.33608658047752751e-06, + 2.19101499021244118e-06, +-2.72442551098890933e-04, +-1.01922440534003310e-04, +-4.41414250680632637e-05, +-2.07006737564986194e-05, +-1.13512238698855305e-05, +-7.74752535069164877e-06, +-5.47263072670651674e-06, +-3.69853398991542639e-06, +-2.47541499532927127e-06, +-1.69326236365505495e-06, +-1.19509228936666646e-06, +-8.69294564737055099e-07, +-6.49139337644042168e-07, +-4.95750866890310131e-07, +-3.85981507761326057e-07, +-3.05583697732061226e-07, +-2.45496335040548170e-07, +-1.99784612998088681e-07, +-1.64458917246860467e-07, +-1.36774807333883308e-07, +-1.14805308938643101e-07, +-9.71723616300156193e-08, +-8.28740284897542388e-08, +-7.11708502289697025e-08, +-6.15095989538950578e-08, +-5.34711917416738219e-08, +-4.67345173582133530e-08, +-4.10509320464109267e-08, +-3.62260259856449534e-08, +-3.21064195661639499e-08, +-2.85700875898022149e-08, +-2.55191903320639503e-08, +-2.28747069052112798e-08, +-2.05723793964621376e-08, +-1.85596197933944169e-08, +-1.67931313001579624e-08, +-1.52370646346825285e-08, +-1.38615780943534681e-08, +-1.26417053214524001e-08, +-1.15564588194608682e-08, + 1.82951515404321331e-05, + 5.68667540586460184e-06, + 2.17872430128507185e-06, + 9.14810173333303722e-07, + 3.34187639352495529e-07, + 1.61348485734497694e-07, + 1.27226922587960125e-07, + 9.33757986534589166e-08, + 6.08844445936052823e-08, + 3.85372952588531175e-08, + 2.48405587220444168e-08, + 1.65335792229564185e-08, + 1.13632699371412273e-08, + 8.03563423428694822e-09, + 5.82473189764893907e-09, + 4.31380755060777143e-09, + 3.25544288806305354e-09, + 2.49782387606261106e-09, + 1.94497527054068315e-09, + 1.53458820923321790e-09, + 1.22524117723764201e-09, + 9.88807667914250419e-10, + 8.05820465523839128e-10, + 6.62570550908939649e-10, + 5.49250755454749463e-10, + 4.58743594673448738e-10, + 3.85814980597402080e-10, + 3.26568828838439896e-10, + 2.78072303335629045e-10, + 2.38094579514485702e-10, + 2.04922365215986930e-10, + 1.77227902488661608e-10, + 1.53973597481890779e-10, + 1.34342145911144630e-10, + 1.17685006630468205e-10, + 1.03484002080871973e-10, + 9.13223682368104078e-11, + 8.08628505564202512e-11, + 7.18309426501433595e-11, + 6.40019799596670783e-11, +-1.16221497947231943e-06, +-3.00721243568765860e-07, +-9.47504072937965728e-08, +-4.20677794180465025e-08, +-1.69862555794167051e-08, +-2.97806775621902833e-09, +-1.45488401365107836e-09, +-1.79692415667856436e-09, +-1.38367424428788520e-09, +-8.71683053111660083e-10, +-5.26026850713342901e-10, +-3.22695771636948203e-10, +-2.04495806089204773e-10, +-1.33957706617617793e-10, +-9.04089547821555997e-11, +-6.26359988336950538e-11, +-4.44026582864287865e-11, +-3.21214895019775158e-11, +-2.36594555366297754e-11, +-1.77097143620463873e-11, +-1.34497873705616900e-11, +-1.03494045354779563e-11, +-8.05920739343507992e-12, +-6.34448382489204993e-12, +-5.04467114825588040e-12, +-4.04813255251488624e-12, +-3.27608129278677408e-12, +-2.67215250633574578e-12, +-2.19547556146439463e-12, +-1.81610390774346222e-12, +-1.51181670056421435e-12, +-1.26599334011906692e-12, +-1.06603330131881745e-12, +-9.02342684044640406e-13, +-7.67547725519305741e-13, +-6.55910435539959722e-13, +-5.62967269159311638e-13, +-4.85189491955640260e-13, +-4.19805994796670863e-13, +-3.64578515516106498e-13, + 6.99299935144183349e-08, + 1.57790340924842480e-08, + 3.96119589494188182e-09, + 1.21405976705506771e-09, + 9.04138091332662220e-10, + 2.44519149090329718e-10, +-2.43408640172457574e-11, + 5.16495625757956066e-12, + 2.30970916574198031e-11, + 1.81352948346372183e-11, + 1.09950600271268686e-11, + 6.35962034717542147e-12, + 3.74038263202125218e-12, + 2.27343193200482174e-12, + 1.42914771131416219e-12, + 9.26294337691820643e-13, + 6.16848337065067476e-13, + 4.20730191561425579e-13, + 2.93140126581407038e-13, + 2.08167531202901393e-13, + 1.50379052754281035e-13, + 1.10324385896629481e-13, + 8.20972641277959199e-14, + 6.18809244953376345e-14, + 4.71898841581926132e-14, + 3.63803968579803771e-14, + 2.83303085369682929e-14, + 2.22631759367196140e-14, + 1.76549970299274410e-14, + 1.41083438712184944e-14, + 1.13640748687367749e-14, + 9.20914042573874961e-15, + 7.51730303151796436e-15, + 6.17520820775282631e-15, + 5.10178847711951217e-15, + 4.24012567656384784e-15, + 3.53829453320046680e-15, + 2.97204936194408692e-15, + 2.50143554503882210e-15, + 2.11960626621143005e-15, +-3.98485686799306146e-09, +-7.85080645740353967e-10, +-1.98530975088981407e-10, +-2.61886002571754011e-11, +-1.64670740755523732e-11, +-2.06835474064417974e-11, +-1.02831752483993711e-12, + 1.35544177084712574e-12, + 4.93708053969779201e-14, +-2.78556999091832843e-13, +-2.12590708830962101e-13, +-1.23564314868939424e-13, +-6.87972752316228770e-14, +-3.90155469096375745e-14, +-2.28696609923179644e-14, +-1.38754883325841897e-14, +-8.67720285150905083e-15, +-5.57910053417131994e-15, +-3.67069783158088343e-15, +-2.47349209962381225e-15, +-1.70347592429158434e-15, +-1.19397801825444950e-15, +-8.44502999865444556e-16, +-6.10034904950305588e-16, +-4.49114801619056582e-16, +-3.37086699060896811e-16, +-2.49394630021044788e-16, +-1.93684344733725751e-16, +-1.42644941745214025e-16, +-1.11486939444264080e-16, +-8.04990590782238081e-17, +-6.66596901042803998e-17, +-5.57984393485286625e-17, +-3.82757713544030783e-17, +-3.27207191680348827e-17, +-2.36780827491746658e-17, +-1.78524551678278850e-17, +-1.22402674648342148e-17, +-1.35432465688403199e-17, +-8.44847896681742769e-18, + 2.18280454646063406e-10, + 3.63288584339364343e-11, + 8.46846656210128501e-12, + 2.71101845512984560e-12, +-9.76762106890162239e-13, + 6.97065083448678547e-13, + 3.03146224513665124e-13, +-4.27878677193592797e-14, +-2.46368752616992921e-14, +-6.96916989912266383e-16, + 3.15592066244105325e-15, + 2.23956047062488627e-15, + 1.24483261255348051e-15, + 6.75719926342784120e-16, + 3.73478288412143761e-16, + 2.10567985654724087e-16, + 1.25884384265984043e-16, + 7.68500694977337345e-17, + 5.31272702509441466e-17, + 3.24557556852756736e-17, + 2.20441811611391505e-17, + 1.01232908176431634e-17, + 9.34336451418065021e-18, + 8.00289940246549984e-18, + 4.44189890428811490e-18, +-3.24913630505239780e-19, +-2.58253313174636633e-18, +-5.86408962783508147e-18, +-2.16718689781734174e-18, +-1.77958724149246737e-18, + 4.64001520618918890e-18, +-3.79795451814377444e-19, +-2.17725273538281025e-18, +-4.48536970916554351e-19, +-4.23009173852049930e-18, + 3.09777239444582460e-18, + 1.85416781638810757e-18, + 4.78293506745782873e-18, + 3.94861118880085759e-18, + 9.20492372047577417e-19, +-1.15319811147133436e-11, +-1.69216179174820167e-12, +-2.54957914394047372e-13, +-1.60470835331163762e-13, + 1.17921770713737101e-14, + 2.03709506144698785e-14, +-1.94847256098212053e-14, +-1.64029651723935906e-15, + 1.07131394092302201e-15, + 2.94907031883165978e-16, + 7.83182164204145922e-18, +-4.01072474724575341e-17, +-2.26302574174263549e-17, +-1.49303572958415931e-17, +-5.05104447769679059e-19, +-2.07102420424284590e-18, + 3.35402557014603776e-18, + 4.97873205208296520e-18, + 4.82229493411752218e-18, + 3.58741715877158852e-18, + 2.46042008731300805e-18, +-1.74363425513137104e-18, + 7.87018044869336804e-19, + 3.69047020599451915e-18, +-1.46302436599409724e-18, +-3.54730818115486215e-18, +-5.35929999665478936e-19, +-4.01017179944485395e-18, +-8.03097235828773883e-20, + 1.94695528717441728e-18, + 1.87694991234492767e-18, +-5.41207229574385387e-19, + 8.75666295007960516e-19, + 2.67537799352907991e-18, + 4.68311044432959078e-19, + 3.05147323115522217e-18, + 2.10966563941164023e-18, + 3.16946080500620960e-18, + 4.41790845552292120e-18, + 4.30325614624168542e-18, + 5.84903276004401973e-13, + 7.70909213164165340e-14, + 1.24230455802988582e-14, +-1.17731577795076828e-15, + 5.73087323958708277e-15, +-2.66844776819563432e-15, + 4.23855175222719326e-16, + 2.34829750829761921e-16, +-1.50319854690520299e-17, +-1.20701412661393489e-17, + 2.02329865273819249e-18, +-1.10418600919421638e-18, +-6.11062582767816652e-19, + 4.04560360688933310e-18, + 3.87817530545614129e-18, + 3.19174843493757012e-18, + 3.26590093362459361e-18, + 3.01558871774757718e-18, + 5.10153461214069173e-18, + 3.32668114896205632e-18, + 7.30325349585666511e-19, + 5.80098227730462024e-19, + 2.34787833250302535e-18, + 7.33684542935418242e-19, + 8.35513071801297811e-19, + 8.05880520711809970e-19, +-3.11382606405148143e-18, +-6.18685409347672153e-18, +-2.29831016571638453e-19, +-2.86769528716024028e-18, + 4.11711766274228455e-18, + 1.82482082459721709e-18, + 2.20647845735926418e-18, + 3.18527103431402516e-18, +-7.76035295801657029e-19, + 2.22990966748324325e-18, + 3.66076277831728664e-19, + 4.22396988269058714e-18, + 6.98911672976042547e-19, + 1.21224797489642922e-18, +-2.85933926090429359e-14, +-3.27771885761031130e-15, +-6.70875585346325787e-16, + 2.03980536879609379e-16, +-2.21638744018085669e-16, + 3.65620360963914511e-17, + 1.88242285765954984e-17, +-2.27675521097704333e-17, +-3.29982129533543138e-18, +-4.51956073954460238e-20, + 4.21575720443992776e-18, +-7.18332297960324679e-18, +-1.46695988371868535e-18, + 5.60096527546713644e-18, + 1.16972799429343320e-18, + 2.95159736741414452e-18, + 4.70446303751434837e-18, + 4.05330563543748911e-18, + 6.58717766026992739e-18, + 3.08431721187621317e-18, + 4.85519267413743870e-18, + 2.24425576621898031e-18, + 2.89686786433434678e-18, + 3.25088591070449374e-19, + 9.65681373214761197e-19, + 1.04065092008696648e-18, +-4.44172017529306290e-20, +-3.40151624124913297e-18, + 1.00229888856048412e-18, +-6.05828158859161835e-19, + 2.11963182593503716e-18, +-6.44522370751456682e-19, +-1.06301827034188026e-18, + 3.03853692170487270e-18, + 7.09744979726913233e-19, + 3.09224075174042374e-18, + 4.04216780090353628e-18, + 3.45006639693690433e-18, + 2.47722207588535016e-18, + 1.59833335847633582e-18, + 1.35022776746817228e-15, + 1.47207077743236966e-16, + 6.18440325013563665e-18, + 1.66045843664714876e-17, +-1.49987116657402770e-17, + 6.52401670881437180e-18, +-7.01577706819818979e-18, +-1.83585091958588093e-18, + 4.56888396389560584e-19, +-2.66235146999541121e-18, + 2.08063333691586934e-18, +-2.62126851894667098e-18, +-1.07093892674784221e-18, +-6.50284888518150126e-19, + 1.62339460060053441e-18, +-2.91906033570490316e-18, +-1.03911809344567389e-18, + 6.17088932230598840e-19, + 2.12770631716121495e-18, + 1.10463073652326986e-18, +-1.06721426753306818e-18, +-1.76176033732397815e-18, + 8.29472058812088615e-19, + 1.16923902430836417e-19, + 1.49687915199027757e-18, +-1.98488061232163953e-18, + 2.96252665704248239e-18, +-1.64630745440054196e-18, + 4.81068652868544750e-18, + 7.08192714866955893e-19, + 3.62905343767493541e-18, +-5.17303866348902446e-19, + 2.39728601743145234e-18, +-2.65776662573581044e-19, + 2.30586137564825220e-18, + 1.18231053645297791e-18, + 2.63640909827246593e-19, + 4.67853493217504827e-18, + 3.76637170296140883e-18, + 2.01214182193548774e-19, +-8.95341000657382802e-17, +-2.86870506384967923e-17, +-1.58924476817469407e-17, +-4.29731303137863584e-18, + 3.92039027385438195e-18, +-9.99343667143008986e-18, + 2.15279194465449521e-18, +-8.95527664908779810e-18, +-3.73693786404481775e-18, + 3.34447937596850467e-19, +-2.80551163937296993e-18, +-1.74866806155658445e-18, +-4.75264867540797379e-18, +-1.84495105506460340e-18, +-2.16925898288319176e-18, + 4.04552075399028711e-19, +-2.47678835560021887e-18, +-1.44149517105098049e-18, + 1.05232761327883521e-18, +-3.41191252144806537e-19, +-2.28770020367746214e-18, +-1.95338791057420742e-18, + 3.38594782059156171e-18, + 6.15687032204555640e-19, +-2.81749658262108884e-18, +-4.51153724888123668e-18, +-2.66564092746281179e-18, +-1.50137166955532937e-18, +-4.88260553642204863e-18, +-3.02071059702033903e-18, + 4.46951844135464453e-19, +-2.44423533847832269e-18, +-2.57143415419430666e-18, + 1.13023935274012924e-18, +-2.77133641284555166e-18, +-1.22494142882917837e-18, + 1.33635472891000858e-19, +-8.03660233023446539e-19, +-1.86051324129338834e-18, + 1.54074051273334811e-18, +// nroots = 4 +// root 0 + 9.09930278039341012e-01, + 8.78519239639498628e-01, + 8.32728075279711710e-01, + 7.69061200062356232e-01, + 6.89419441337196348e-01, + 6.03698072302539690e-01, + 5.24267871187185097e-01, + 4.57856312721538539e-01, + 4.04646671940319780e-01, + 3.62091224534350387e-01, + 3.27551969855373160e-01, + 2.99017087407912718e-01, + 2.75056362442681224e-01, + 2.54652798653586143e-01, + 2.37068865766018461e-01, + 2.21757619706752090e-01, + 2.08305012477269375e-01, + 1.96391849192849521e-01, + 1.85768091605763297e-01, + 1.76235085817405990e-01, + 1.67633003908700007e-01, + 1.59831797949809395e-01, + 1.52724571120871455e-01, + 1.46222644411583169e-01, + 1.40251833498243411e-01, + 1.34749602995113127e-01, + 1.29662865937372973e-01, + 1.24946264004116972e-01, + 1.20560810237969565e-01, + 1.16472808132284666e-01, + 1.12652983579804078e-01, + 1.09075782326289700e-01, + 1.05718797243879989e-01, + 1.02562298270535174e-01, + 9.95888441652017509e-02, + 9.67829599317560768e-02, + 9.41308673072151908e-02, + 9.16202584010861187e-02, + 8.92401046343480608e-02, + 8.69804947180223970e-02, +-1.28167827295583448e-02, +-1.88369675918586763e-02, +-2.71722577880163171e-02, +-3.64266780365371315e-02, +-4.26524326428054379e-02, +-4.23493340379750768e-02, +-3.67320009243554610e-02, +-2.97053227155343082e-02, +-2.36549404277656694e-02, +-1.90412180363243519e-02, +-1.56018784553247063e-02, +-1.30061984743427422e-02, +-1.10065618551643332e-02, +-9.43480883882889809e-03, +-8.17721834169977610e-03, +-7.15533331151346069e-03, +-6.31372284485098769e-03, +-5.61234129793988356e-03, +-5.02167643346014894e-03, +-4.51959134150847763e-03, +-4.08921809450130645e-03, +-3.71752126438661470e-03, +-3.39429845918127158e-03, +-3.11147226956345283e-03, +-2.86258040859929978e-03, +-2.64240308228698472e-03, +-2.44668694228001660e-03, +-2.27193803361437499e-03, +-2.11526470927624619e-03, +-1.97425719033451691e-03, +-1.84689431684302444e-03, +-1.73147069324729587e-03, +-1.62653928514498616e-03, +-1.53086583245721098e-03, +-1.44339237858509962e-03, +-1.36320789010719668e-03, +-1.28952443416411309e-03, +-1.22165774366089124e-03, +-1.15901127034592527e-03, +-1.10106302828203535e-03, +-6.11385329804307875e-04, +-9.01720155382022413e-04, +-1.16005407265001317e-03, +-1.07509759584077441e-03, +-4.04487440356551603e-04, + 4.51400634338742959e-04, + 8.70677408306975292e-04, + 8.43237507857343030e-04, + 6.64015995130705491e-04, + 4.95387627111002469e-04, + 3.70673233127269191e-04, + 2.82721790428630256e-04, + 2.20196993739266091e-04, + 1.74775587905820007e-04, + 1.41028059638189290e-04, + 1.15438590254437709e-04, + 9.56844323854658655e-05, + 8.01926727209842453e-05, + 6.78728891346978917e-05, + 5.79530057714710753e-05, + 4.98759320484608984e-05, + 4.32328376718943961e-05, + 3.77190845763847438e-05, + 3.31045157992536100e-05, + 2.92130462444216387e-05, + 2.59084030456530826e-05, + 2.30840069369619518e-05, + 2.06556893466338877e-05, + 1.85563815533361232e-05, + 1.67321949049391476e-05, + 1.51394952410302514e-05, + 1.37426965804695549e-05, + 1.25125810881908656e-05, + 1.14250081974819472e-05, + 1.04599143409206489e-05, + 9.60053171013502030e-06, + 8.83277353049199217e-06, + 8.14474696259182364e-06, + 7.52636457730629494e-06, + 6.96903251804364688e-06, +-2.13860422025278069e-05, +-2.57961128905419514e-05, +-1.29202215580996831e-05, + 3.14855500919058654e-05, + 7.43648641566379794e-05, + 5.84266010812023958e-05, + 1.22342123247039241e-05, +-1.23045251996301063e-05, +-1.55727444961866942e-05, +-1.22336697998945876e-05, +-8.68627741157733984e-06, +-6.12584361164789697e-06, +-4.40224954577571829e-06, +-3.23721142595973105e-06, +-2.43217683659626887e-06, +-1.86238907267145288e-06, +-1.45009607190702144e-06, +-1.14584337987424666e-06, +-9.17368745933886980e-07, +-7.43109413477154176e-07, +-6.08333558999278475e-07, +-5.02775403296312037e-07, +-4.19152693370889118e-07, +-3.52215565927703749e-07, +-2.98123353421437655e-07, +-2.54028370191905183e-07, +-2.17793035563225471e-07, +-1.87794515552099420e-07, +-1.62787803735710334e-07, +-1.41808447089988120e-07, +-1.24102561826993715e-07, +-1.09075891397254103e-07, +-9.62563197329317107e-08, +-8.52660040693446074e-08, +-7.58004612194259845e-08, +-6.76127315457595555e-08, +-6.05012872721292155e-08, +-5.43007265530970195e-08, +-4.88745581639827833e-08, +-4.41095677386653786e-08, +-4.48845067454175994e-07, + 4.71083766268398784e-08, + 1.77078546930493712e-06, + 3.45333841041389104e-06, + 1.12595081635072372e-06, +-2.70283645158010530e-06, +-2.45544941976081605e-06, +-6.89681809084278736e-07, + 1.16744834238627840e-07, + 2.43501990968996423e-07, + 1.91843704391706488e-07, + 1.30674901671693615e-07, + 8.76837374437621940e-08, + 5.99115873631274431e-08, + 4.19387059523314092e-08, + 3.00453243572477652e-08, + 2.19760692557025872e-08, + 1.63725173353950158e-08, + 1.23991377539661929e-08, + 9.52860997754314015e-09, + 7.41980557074611459e-09, + 5.84701631916526152e-09, + 4.65782726587612773e-09, + 3.74739826123935211e-09, + 3.04239185583773334e-09, + 2.49071364287567609e-09, + 2.05483419054541754e-09, + 1.70736398603985459e-09, + 1.42807308795117094e-09, + 1.20185283093488008e-09, + 1.01730247230090196e-09, + 8.65736220978020684e-10, + 7.40477049261433800e-10, + 6.36348912756730438e-10, + 5.49307558725273448e-10, + 4.76169619141201012e-10, + 4.14411825990634378e-10, + 3.62020941798500556e-10, + 3.17380652297660512e-10, + 2.79185670041681000e-10, + 5.13247502049584741e-09, + 5.17737306152678229e-08, + 1.13555207293744246e-07, + 1.05675428581121633e-08, +-2.20947268717300288e-07, +-9.91844894630217432e-08, + 8.83841219832814076e-08, + 6.81566072700784371e-08, + 1.75196900537617746e-08, +-6.61428801595283562e-10, +-3.35073159759754052e-09, +-2.62124851084123731e-09, +-1.71850282929836369e-09, +-1.10447830666589449e-09, +-7.22539367780654621e-10, +-4.84626815432967517e-10, +-3.33034213975725508e-10, +-2.33939245519051717e-10, +-1.67586337130667587e-10, +-1.22181731606205085e-10, +-9.04988890400232205e-11, +-6.79977383913024908e-11, +-5.17600316918879428e-11, +-3.98704585122550137e-11, +-3.10480538737073241e-11, +-2.44211089836388895e-11, +-1.93869353120237668e-11, +-1.55227711008779378e-11, +-1.25279108984237219e-11, +-1.01859135550410186e-11, +-8.33909653073795632e-12, +-6.87134698697337804e-12, +-5.69630908332359525e-12, +-4.74912400300189150e-12, +-3.98068954809794848e-12, +-3.35346630709574728e-12, +-2.83856302058475799e-12, +-2.41357222936356015e-12, +-2.06099361734773252e-12, +-1.76705924848706759e-12, + 1.04131098764056373e-09, + 2.85258350179829930e-09, + 8.72725848954572916e-10, +-9.92472836114627840e-09, +-4.21302888474970567e-09, + 1.10124703573947811e-08, + 2.64629045312867057e-09, +-2.55782021619402031e-09, +-1.37685615002766542e-09, +-3.03219141681302765e-10, + 1.53804965097683699e-12, + 4.15932853455885102e-11, + 3.17333204790010030e-11, + 2.00463110655130222e-11, + 1.24011023610055495e-11, + 7.81033230997646827e-12, + 5.04605050275077800e-12, + 3.34254382989244637e-12, + 2.26507831161673601e-12, + 1.56668669233430964e-12, + 1.10381799934250318e-12, + 7.90805523623492177e-13, + 5.75190013120435445e-13, + 4.24204597545280877e-13, + 3.16857899701843469e-13, + 2.39450998530293696e-13, + 1.82923329726110231e-13, + 1.41126303754865080e-13, + 1.09905198515220041e-13, + 8.63344035117400195e-14, + 6.83617354820873844e-14, + 5.45410335233378066e-14, + 4.38181939478626238e-14, + 3.54508437011078819e-14, + 2.88486987554729913e-14, + 2.36175444043374018e-14, + 1.94462341138711421e-14, + 1.60953322322661212e-14, + 1.33888175587086443e-14, + 1.11897945810547700e-14, + 5.44353034294767472e-11, + 5.06935874731775713e-11, +-2.55760687953904055e-10, +-3.22054376470293106e-10, + 7.17733331842475650e-10, + 5.48307360943911416e-11, +-3.80389949088109942e-10, +-1.28288145759524427e-11, + 5.57316057184040939e-11, + 2.11446983138326267e-11, + 3.98454183064591334e-12, +-1.79661786008189274e-14, +-4.71336735128799052e-13, +-3.44512687608948633e-13, +-2.09842448337207650e-13, +-1.25439586113674054e-13, +-7.63938641105867895e-14, +-4.77473061421941511e-14, +-3.06108403883974482e-14, +-2.00875652659692844e-14, +-1.34486072486286556e-14, +-9.17964546047548040e-15, +-6.38354294309988873e-15, +-4.51085132163508943e-15, +-3.23159622138660703e-15, +-2.35230678295299583e-15, +-1.71598945098128578e-15, +-1.28037489878340771e-15, +-9.61467933362439736e-16, +-7.24541660413047996e-16, +-5.55155810899851660e-16, +-4.28043369294548991e-16, +-3.35175439040139233e-16, +-2.53711632747709411e-16, +-2.06638264213349614e-16, +-1.63998670339492276e-16, +-1.31956566191461818e-16, +-1.00793342883266440e-16, +-8.25453968804308101e-17, +-6.38838685524697922e-17, + 1.41649033979728549e-12, +-3.36073969720020517e-12, +-1.43270659881305737e-11, + 2.13530109914769174e-11, + 1.71165820905025927e-11, +-3.77545844799661693e-11, + 9.48335155951583575e-12, + 7.09838419542998816e-12, +-8.00718071909176375e-13, +-8.89113281230459182e-13, +-2.57135092255559887e-13, +-4.18863417444050224e-14, + 8.81516161166302918e-16, + 4.90233070153261869e-15, + 3.37813219866484575e-15, + 1.99233484855701848e-15, + 1.15739573032506454e-15, + 6.85123525005173581e-16, + 4.19618214393607877e-16, + 2.60969348162145633e-16, + 1.74598492500452651e-16, + 1.35306238733570232e-16, + 7.03348339405339254e-17, + 4.96669402410867680e-17, + 3.21009820394023681e-17, + 1.75063620371329566e-17, + 2.24281794731333040e-17, + 8.08505472671588481e-18, + 9.33035703410318133e-18, + 1.05756683143666067e-17, + 4.09640009796723068e-18, + 4.19728971922177287e-18, + 1.46004114739921649e-18, + 6.45515478774204340e-18, + 3.24302483170115448e-19, +-1.69485861270281261e-18, +-1.15109401971460009e-18, +-5.45397580806220018e-19, + 3.91795235803425915e-18, +-1.20378632593265901e-19, +-1.45353873535635271e-14, +-2.96581535374437352e-13, + 9.38323647395560066e-15, + 1.64289953515113455e-12, +-2.36209697643266962e-12, + 6.75855564705083247e-13, + 7.12167887627754952e-13, +-3.76882456655308059e-13, +-6.27538691324136493e-14, + 2.20994112424575262e-14, + 1.08877981141575560e-14, + 2.54736950410288993e-15, + 3.67016896397195738e-16, +-5.06827064743416811e-18, +-5.03759006668865574e-17, +-2.91293893862342517e-17, +-1.41652303778022230e-17, +-8.03171264198932791e-18, + 1.46105498705201466e-18, +-2.88112610165591319e-19, + 5.93862449931680535e-18, + 2.20409992232843342e-17, + 1.34140784893700256e-18, + 7.90896961627207189e-18, +-7.42411250500839325e-19, + 1.54594849246800828e-18, + 8.78575788861602834e-18, +-1.62881106774380269e-18, + 4.89512182091452553e-18, + 7.19414841768197890e-18, + 3.85048688246958187e-18, + 3.11569447847474527e-18, + 1.48330540740517658e-18, + 5.70836586898885284e-18, + 3.82636391107695616e-18, + 3.87215940764713971e-19, + 1.76481522909143614e-18, + 4.32670638986767229e-18, + 4.55618058863703527e-18, + 3.21923470855928329e-18, +-3.26051508674641151e-15, +-9.12210008248440742e-15, + 3.87347025682607763e-14, +-1.79734449925318754e-14, +-7.01257625903733719e-14, + 1.11756057407154771e-13, +-5.98123183496867783e-14, + 3.70291925531934585e-15, + 5.50386018508827297e-15, + 9.24841092662129880e-17, +-3.04838938304406428e-16, +-1.15912734713145616e-16, +-1.11047551287941184e-17, +-2.28432793953432011e-18, +-4.03873504252659140e-18, +-2.98386544711655743e-19, + 1.97495848776306534e-18, + 8.19174837662772662e-22, + 6.45605220249945210e-18, +-4.57170677082881244e-18, + 9.36682959616346357e-18, + 1.85582810436652038e-17, + 5.05213919783802168e-18, +-4.75676871542652091e-18, +-2.75036583592057986e-18, + 1.67195092350951450e-18, + 7.13784782641851826e-18, + 9.39106470300100718e-22, + 1.61132581753878419e-18, + 4.29000361848191761e-18, + 1.53649933478043383e-18, + 6.61182391892131409e-18, + 3.24238359768892237e-18, + 3.34551754662729162e-18, + 5.05611767410873228e-19, + 6.87856643363958691e-19, + 1.54249438392304560e-18, + 5.04763418464328678e-18, + 3.04251816996657999e-18, + 5.26940323936957642e-18, +-1.72862324415667124e-16, + 1.28392454388690487e-16, + 1.82286460889634865e-15, +-5.73326509051288529e-15, + 7.68625605521562360e-15, +-4.70264240429588385e-15, + 4.68374764525606845e-16, + 7.28493118333330534e-16, +-2.33978214509079812e-16, +-4.28061912840486799e-17, + 1.45272716320046117e-17, +-1.83879273360268856e-18, +-4.61549518962457243e-18, + 1.51028071119421396e-17, + 4.15648103681457866e-18, + 6.73136296204977522e-18, + 1.05310251615070405e-17, + 6.49830202103012280e-18, + 1.09187947174723743e-17, + 8.28051255450749290e-18, + 9.70266217682852605e-18, + 1.66057700835771912e-17, + 5.95441583932384128e-18, + 7.11645115985365051e-18, + 6.07935515475277567e-18, + 6.67958754093109752e-18, + 9.84005385795695646e-18, + 3.33746718736531076e-18, + 1.90213250263760920e-18, + 4.59225336531472639e-18, + 3.67259935929470934e-18, + 3.44828669866335231e-18, +-1.10386441631279662e-18, + 5.80249984476458275e-18, + 1.84491576617050159e-18, + 1.55127279164478874e-19, +-1.51788759224153826e-19, + 1.35868215027455163e-18, + 2.61532906103615306e-18, + 1.65845509217485450e-18, + 3.14485945348789422e-18, + 3.40620232531847617e-17, +-2.39433888784823216e-17, +-1.06939535296010111e-16, + 2.73338507358502407e-16, +-3.10209831164537814e-16, + 1.41073285585759315e-16, +-3.64764833300199156e-17, +-1.18284659022336911e-18, + 4.03612378300836849e-18, +-6.58812976354931885e-19, +-4.92785779212666070e-18, + 9.23493163922813433e-18, + 9.60907659822964312e-18, +-3.86416661872999422e-18, + 1.46860806989986739e-18, + 1.11997103072893671e-18, +-1.82403065634889245e-18, + 1.55233433159860632e-18, +-4.57039681550591604e-18, + 4.51915287431622119e-18, + 7.65415976964267013e-18, +-2.47881515963167782e-18, + 1.53162429594579798e-18, +-1.58619469941138721e-18, +-2.52407952229457034e-18, + 9.59404254202821486e-18, +-2.09723812913678964e-18, + 3.59400782744316606e-18, + 4.99518864237260047e-18, + 7.02546954980074153e-18, + 4.51834829055655556e-18, + 1.51652334087263110e-18, + 4.28883073464412208e-18, + 1.62865591794065982e-18, + 3.61186584925279755e-18, + 2.56678198616042151e-18, + 2.24398015633073062e-18, + 5.24255460489561110e-18, + 1.56709436294827360e-18, +-2.22703274153225600e-17, + 1.64457572042898716e-18, +-3.17431147074994473e-17, + 2.54726674008352921e-17, +-4.83976278855457435e-17, + 1.19246986329549029e-17, +-1.03989373760070482e-17, +-8.56374530358290859e-18, +-7.01516119018683619e-18, +-7.12004843390876427e-18, + 1.96751638856636380e-18, + 8.14288922798089174e-18, + 3.92471009691455061e-18, +-5.75405044766223011e-18, +-1.03383416241513396e-17, +-8.79571731588658858e-18, +-3.10982981146861636e-18, +-5.13254093387716225e-18, +-3.15457103476296467e-18, +-4.81140987493730565e-18, +-3.43048617707779820e-18, +-8.38584065330905927e-19, +-2.10024221031623736e-18, +-1.51195975111839169e-18, + 4.00962417488212251e-19, + 2.51060842445303794e-18, +-2.51420453983300890e-18, +-6.90374159064382606e-18, +-7.75666493943006702e-18, +-5.46315734157149004e-18, +-5.17319297524580045e-18, +-5.46564193015393799e-18, +-4.48724955198784957e-18, +-5.83034907521482552e-18, +-6.46610001636279847e-18, +-5.69020226746567475e-18, +-5.63895859444462856e-18, +-4.15089362981671327e-18, +-3.48275481504787231e-18, +-4.96010661212725868e-18, + 4.70863193231050095e-02, + 6.87257071290205048e-03, + 1.25272203984467439e-03, + 3.16890739785309248e-04, + 1.21663740836838833e-04, + 7.01805299950216608e-05, + 5.36212242219517090e-05, + 4.70381115173634649e-05, + 4.35067438924982596e-05, + 4.10108786574880585e-05, + 3.89804680951901146e-05, + 3.72403424164751681e-05, + 3.57170953647895689e-05, + 3.43672255509005798e-05, + 3.31598300355953154e-05, + 3.20714298153412081e-05, + 3.10836655627052096e-05, + 3.01819202268894245e-05, + 2.93543879748496557e-05, + 2.85914144216634573e-05, + 2.78850172191774675e-05, + 2.72285311544455889e-05, + 2.66163412083792124e-05, + 2.60436789079880089e-05, + 2.55064649637199032e-05, + 2.50011862497052574e-05, + 2.45247986051603486e-05, + 2.40746492858992667e-05, + 2.36484145366242326e-05, + 2.32440489182579092e-05, + 2.28597438605487115e-05, + 2.24938935183339439e-05, + 2.21450664574264512e-05, + 2.18119820290631925e-05, + 2.14934905420627761e-05, + 2.11885565316253033e-05, + 2.08962445689317039e-05, + 2.06157071677421382e-05, + 2.03461744313065381e-05, + 2.00869451511268685e-05, +-4.17867311428288674e-02, +-5.62877346705940168e-03, +-8.87984955739169962e-04, +-1.72933124346905717e-04, +-4.26227118566749718e-05, +-1.28942612699620392e-05, +-4.67698683348245160e-06, +-2.20243687178883194e-06, +-1.41456756920532731e-06, +-1.10506338133222692e-06, +-9.32925837184129203e-07, +-8.10664204601772636e-07, +-7.14760562284602226e-07, +-6.36689320702734202e-07, +-5.71914328068843523e-07, +-5.17432832433364924e-07, +-4.71086352542034826e-07, +-4.31269329426643373e-07, +-3.96762446146160557e-07, +-3.66624399781861391e-07, +-3.40118099965268361e-07, +-3.16659000926254248e-07, +-2.95778210128881288e-07, +-2.77095697914156729e-07, +-2.60300545223497994e-07, +-2.45136178708943326e-07, +-2.31389194475638061e-07, +-2.18880800293494457e-07, +-2.07460193028808720e-07, +-1.96999383312482169e-07, +-1.87389114384340169e-07, +-1.78535616594792691e-07, +-1.70358006156018272e-07, +-1.62786184950865732e-07, +-1.55759133239615554e-07, +-1.49223512825631247e-07, +-1.43132517311675974e-07, +-1.37444920349153517e-07, +-1.32124283554114707e-07, +-1.27138293960398845e-07, + 1.03157277916057898e-02, + 1.30583484074507975e-03, + 1.87204606275981762e-04, + 3.18328282419885051e-05, + 6.71077018337537464e-06, + 1.75579827856225167e-06, + 5.20641734193342919e-07, + 1.60103781524728270e-07, + 5.57605979244433737e-08, + 2.67662182293784011e-08, + 1.75522136615791125e-08, + 1.33677472131614922e-08, + 1.07476836688515096e-08, + 8.84918529949058400e-09, + 7.39816000262295583e-09, + 6.26102079969033563e-09, + 5.35454178745293833e-09, + 4.62172639328098106e-09, + 4.02200633643765082e-09, + 3.52583840000502823e-09, + 3.11131835306538644e-09, + 2.76195010674465245e-09, + 2.46513547617444327e-09, + 2.21113062813621744e-09, + 1.99231212200233921e-09, + 1.80265240469554381e-09, + 1.63733950496554526e-09, + 1.49249759011584683e-09, + 1.36497910656201873e-09, + 1.25220841012458758e-09, + 1.15206289398116621e-09, + 1.06278173996772095e-09, + 9.82895237353830278e-10, + 9.11169568753931212e-10, + 8.46563336190043643e-10, + 7.88193076373323606e-10, + 7.35305715225644796e-10, + 6.87256420616338208e-10, + 6.43490684861572947e-10, + 6.03529744307055069e-10, +-1.77595768370085623e-03, +-2.14083019428551056e-04, +-2.85195428687695323e-05, +-4.35405347750598113e-06, +-7.94976267394650438e-07, +-1.81914959688390222e-07, +-5.13808422399963412e-08, +-1.52238064281390291e-08, +-4.23278140702199037e-09, +-1.22265547696780085e-09, +-4.70076403743104649e-10, +-2.63126760140087991e-10, +-1.82482835291928699e-10, +-1.37092818164111961e-10, +-1.06395182277285029e-10, +-8.41848811521307095e-11, +-6.76248621581083979e-11, +-5.50321642164247164e-11, +-4.53013282806760162e-11, +-3.76755383735557555e-11, +-3.16238910348516979e-11, +-2.67667774478592090e-11, +-2.28282058554461799e-11, +-1.96044870678202388e-11, +-1.69432307360743602e-11, +-1.47289976639289802e-11, +-1.28733356154857480e-11, +-1.13077539985285718e-11, +-9.97870133335354498e-12, +-8.84392816780148214e-12, +-7.86982185712853745e-12, +-7.02943178549773025e-12, +-6.30099112540312820e-12, +-5.66679960202954884e-12, +-5.11237149774836713e-12, +-4.62578041979271705e-12, +-4.19715144358822194e-12, +-3.81826446874450164e-12, +-3.48224234580179753e-12, +-3.18330393290718610e-12, + 2.35735589250369193e-04, + 2.73263775437341795e-05, + 3.43870826208210662e-06, + 4.83591571373293917e-07, + 7.84730483992930049e-08, + 1.52679149657566822e-08, + 3.85634721986232845e-09, + 1.18125437269019014e-09, + 3.41099746058520223e-10, + 8.66190869363205120e-11, + 2.20055815378090385e-11, + 7.23133266568380805e-12, + 3.56108334263582217e-12, + 2.27806528063785939e-12, + 1.61360431990901916e-12, + 1.18950193859613310e-12, + 8.96893873367736921e-13, + 6.88062445238433960e-13, + 5.35758912607186845e-13, + 4.22712884528412693e-13, + 3.37500917364983909e-13, + 2.72373695278588768e-13, + 2.21968641734486829e-13, + 1.82509494218763801e-13, + 1.51294798542097476e-13, + 1.26363996077216019e-13, + 1.06275320985749757e-13, + 8.99555719533501279e-14, + 7.65968759722146062e-14, + 6.55847471585467355e-14, + 5.64472362304167103e-14, + 4.88186126901285427e-14, + 4.24130588724714247e-14, + 3.70054449006800245e-14, + 3.24171232531458458e-14, + 2.85053618279725078e-14, + 2.51553555983488291e-14, + 2.22742123753666585e-14, + 1.97863142528488476e-14, + 1.76297736903814658e-14, +-2.55270477238190183e-05, +-2.86604902262055065e-06, +-3.44601880993815120e-07, +-4.54488979652437892e-08, +-6.76479648929029757e-09, +-1.15381964166168002e-09, +-2.37705281393440040e-10, +-6.94827879363763521e-11, +-2.23573775596178075e-11, +-6.06281041042441919e-12, +-1.41138329698084274e-12, +-3.26303559126421036e-13, +-9.62497148540848032e-14, +-4.30829460766038063e-14, +-2.58019148892584127e-14, +-1.73773723427657090e-14, +-1.22473747528493396e-14, +-8.85016295644826311e-15, +-6.51741398535502804e-15, +-4.87829354084053128e-15, +-3.70483695787713371e-15, +-2.85081130028100491e-15, +-2.21996218061894962e-15, +-1.74762981709548257e-15, +-1.38958653882843663e-15, +-1.11508314104368131e-15, +-9.02416448610613827e-16, +-7.36060134560566659e-16, +-6.04759741020225267e-16, +-5.00256789023280699e-16, +-4.16440838313948176e-16, +-3.48725963482789082e-16, +-2.93645622544891804e-16, +-2.48555384312021815e-16, +-2.11426182304644649e-16, +-1.80674747602860775e-16, +-1.55074429810817685e-16, +-1.33649975700637824e-16, +-1.15638257917227187e-16, +-1.00423787930269669e-16, + 2.33806920032282224e-06, + 2.55637897547740922e-07, + 2.96159136623396968e-08, + 3.70745752003540421e-09, + 5.14800986634293476e-10, + 8.12758594107079276e-11, + 1.39313401145427386e-11, + 3.19817717054500474e-12, + 1.12182118817505697e-12, + 3.52258491938921617e-13, + 8.76055043804267392e-14, + 1.88370779305697997e-14, + 4.05625018108971782e-15, + 1.11317924875401433e-15, + 4.66505349232770559e-16, + 2.65436587146638783e-16, + 1.71300878245299594e-16, + 1.16072343731981212e-16, + 8.07691999952986726e-17, + 5.73417133323675315e-17, + 4.14233870581261924e-17, + 3.03917500203786485e-17, + 2.26153738675266539e-17, + 1.70457719172878606e-17, + 1.30003008824837649e-17, + 1.00240146264783076e-17, + 7.80544952004595534e-18, + 6.13445389223256706e-18, + 4.86188138645904739e-18, + 3.88794474606553240e-18, + 3.12958211198324074e-18, + 2.53688316911165690e-18, + 2.07129713258396503e-18, + 1.70188215273925819e-18, + 1.40493032428132433e-18, + 1.16782948130688593e-18, + 9.73054458354718861e-19, + 8.16979753664547536e-19, + 6.89803000756175524e-19, + 5.83785405109624404e-19, +-1.85737745377224608e-07, +-1.98599041692995983e-08, +-2.23110888250498510e-09, +-2.67642657852756412e-10, +-3.49857767866309245e-11, +-5.18143439245883041e-12, +-8.46796037298992810e-13, +-1.33959896671101299e-13, +-4.17264342825467151e-14, +-1.61338223945676193e-14, +-4.63211599236804522e-15, +-1.05194869287216022e-15, +-2.11080136371850138e-16, +-4.30874538146955709e-17, +-1.13049210843154977e-17, +-4.54936659382685262e-18, +-2.48994041119464689e-18, +-1.54989321139680941e-18, +-1.01453475506573122e-18, +-6.83094305981203356e-19, +-4.68223882739535177e-19, +-3.28471491410680167e-19, +-2.31905415337319650e-19, +-1.67154607107467838e-19, +-1.22354104616894724e-19, +-8.95944877793247444e-20, +-6.71166072614918027e-20, +-5.08661604532307607e-20, +-3.97046796848306454e-20, +-2.91436709152847101e-20, +-2.31735623390708793e-20, +-1.79993730522571987e-20, +-1.39184108123897695e-20, +-9.77518300656310033e-21, +-7.77389354249671334e-21, +-5.69840850099084899e-21, +-6.36966215027187572e-21, +-4.14993573959375311e-21, +-2.46198040502132781e-21, +-2.32946282918771595e-21, + 1.30360664353384591e-08, + 1.36763288474754829e-09, + 1.49726296762070839e-10, + 1.73398865995083486e-11, + 2.15963809356581598e-12, + 2.95199112837701319e-13, + 4.90276091166758112e-14, + 6.79573900921867315e-15, + 1.13574446657400566e-15, + 5.51680090110548410e-16, + 2.00137848046857043e-16, + 5.12849123195582875e-17, + 1.07137047645570589e-17, + 2.02882820468684432e-18, + 3.98804976759204265e-19, + 1.01639851475755549e-19, + 4.06211620975254806e-20, + 2.33642829845082727e-20, + 1.41193827120450201e-20, + 7.84288463596864235e-21, + 6.39824172097757354e-21, + 3.97239128376010921e-21, + 3.29418747369874682e-21, + 2.93592564297864480e-21, + 1.83498284741712338e-21, + 1.19389859320197307e-21, + 1.14460084818181841e-21, +-1.75819344838536743e-22, +-1.62016020573062207e-21, + 2.79370948128267817e-22, + 4.24160468544016571e-22, + 2.23476715812653062e-24, +-6.72094790590156929e-23, + 8.83794889481976802e-22, + 6.91804562187568125e-22, + 4.79452379926156191e-22, +-1.44660448734257704e-22, + 6.80834010155455745e-22, + 9.92885039391302485e-22, + 7.42554888572433735e-22, +-8.19866326447294084e-10, +-8.46176988556583764e-11, +-9.06289600756381565e-12, +-1.01881612699871785e-12, +-1.22172337715586658e-13, +-1.56150825158474165e-14, +-2.38993141953461930e-15, +-4.15085953953482080e-16, +-3.10237751060333161e-17, +-1.21148165590543817e-17, +-6.75778048754039946e-18, +-2.11339314312585341e-18, +-4.85481446951081973e-19, +-9.25914591201230230e-20, +-1.62358070883800377e-20, +-2.46840611034632239e-21, +-3.47184752975350733e-22, + 8.58711783093154001e-22, + 5.36331474499911065e-22, +-3.55746769329817240e-22, + 3.70859868201464812e-22, + 3.85191002024209572e-22, + 1.12299463289754211e-21, + 1.89123595550619845e-21, + 4.21425251908343755e-22, + 7.67892893248092611e-22, + 1.39480874617112166e-21, + 1.82780165202256233e-22, +-1.21227371553542898e-21, + 1.40735577259871537e-21, + 1.19639711968225805e-21, + 1.00471719002308557e-21, + 1.00614501296756397e-21, + 8.51881451956216493e-22, + 7.01520488178832469e-22, + 2.16821087573247911e-21, +-1.04666883263190885e-21, + 5.44263034348496911e-22, + 3.26527679196265483e-22, + 4.36394970928414569e-22, + 4.67256174845088167e-11, + 4.75442253671477346e-12, + 4.99739215425187920e-13, + 5.47788635292270573e-14, + 6.34413629577174702e-15, + 7.93742781343497124e-16, + 9.76346112747309411e-17, + 2.20684288036171099e-17, + 1.96908445305338727e-18, + 6.43550465094061328e-20, + 1.60250010509425305e-19, + 7.14112569035136000e-20, + 2.03435574939087156e-20, + 5.68406043561321227e-21, +-1.66752727172294834e-22, +-2.81003197055326374e-22, +-3.00290783444363283e-23, + 1.03746307397611105e-21, + 4.34655844455494336e-22, +-3.05130139921587820e-22, + 6.13960426625001767e-22, + 9.43990613620451007e-22, + 1.14387939770537402e-21, + 1.32082143330992479e-21, + 5.95586355022530346e-22, + 8.45993622995792984e-22, + 3.38931441485044732e-22, + 9.02597093552908103e-22, +-5.30217047340610460e-22, + 5.61487576998196790e-22, +-6.66974294903767061e-23, + 2.47200566148509930e-22, +-4.10776913797399740e-22, + 7.07231184035532796e-22, + 5.72823515095050703e-22, + 1.13311424884626857e-21, +-6.77681899353485702e-22, +-4.80883400677571343e-23, + 9.83407395673000534e-22, + 5.48424606993429725e-22, +-2.43518420706153722e-12, +-2.44713408508893808e-13, +-2.53071969989510340e-14, +-2.71525235461281017e-15, +-3.04849905414547619e-16, +-3.74372597607354535e-17, +-4.11641789399476627e-18, +-8.02014643202066686e-19, +-1.58813798194217335e-19, + 3.18468781865697087e-21, +-2.36802001301596571e-21, +-2.59417806530711607e-21, +-5.57424668634365303e-22, + 6.84437325501737310e-22, + 5.58049369034185567e-22, + 8.93645024412380994e-23, + 1.15322796323291499e-21, +-9.41738144639115152e-23, + 1.48462916579930932e-21, + 2.29628195473861971e-22, + 6.87731420711080733e-22, + 7.84872352616845733e-22, + 9.63447326288004791e-22, + 1.28682753810481353e-21, + 4.76007492343875073e-22, + 9.87036315672250439e-22, + 1.51093725743740984e-21, + 1.33098425552100988e-22, +-2.40059641901042719e-22, + 8.27089023629354080e-22, + 9.16032618636868017e-22, + 1.48345390572831388e-22, + 2.33627859402535970e-22, + 6.29482442251804958e-22, + 5.36418753604877830e-22, + 2.47766430439727259e-22, + 3.95019619458614692e-22, + 5.12942075540626214e-22, + 9.27127694118829484e-22, + 8.80022918791785447e-22, + 1.16925448023398396e-13, + 1.16216256573971403e-14, + 1.18460874098035607e-15, + 1.24736269888538231e-16, + 1.37079075136594311e-17, + 1.56044944609810627e-18, + 2.14681920645172509e-19, + 1.42631284210181325e-20, + 9.81661914540635583e-21, +-2.66330526144559012e-22, +-1.53065859798210786e-21, + 2.24258513667459092e-22, + 3.88593114145700440e-22, + 7.99920921538807661e-22, + 8.89578359333001466e-22, +-5.72057356029705405e-22, +-8.66500420838985990e-22, + 1.04391571168242472e-21, + 3.50076723463100736e-22, + 1.80496767811887073e-22, + 8.09400064763737031e-23, + 2.43179005244291914e-22, + 5.93593474510763904e-22, +-1.55866860670630452e-22, + 6.45416460102261840e-22, + 1.16091299672354983e-21, + 7.67548273231238485e-22, + 1.86463691981878197e-22, +-6.29316854715824042e-22, + 1.31721055512936446e-22, + 8.25878074949135562e-22, + 8.61760235209662028e-22, + 9.16074148196121222e-23, + 8.00378636119726006e-22, + 6.58592464246882226e-22, + 3.78029126304259226e-22, +-1.18588023183467086e-22, +-6.98128313863967148e-23, +-6.94557261559665430e-24, + 1.01007951563524395e-22, +-5.22360773533311477e-15, +-5.15403756222267661e-16, +-5.18057034704333352e-17, +-5.42481814818825395e-18, +-5.91920148744709013e-19, +-6.67586553788965660e-20, +-1.09421430587933413e-20, +-1.12327365417552760e-21, +-9.95806467840211225e-22, +-5.02531696590381505e-22, +-3.83595650725375498e-23, + 6.02920304116271948e-22, + 1.61934825777638572e-21, +-7.60277361586882039e-22, +-2.01621120143904287e-22, +-1.48872452115079399e-21, +-8.46042256678252273e-22, +-7.25908387710458475e-22, +-3.16670904496481148e-23, +-2.43515035655597355e-22, + 2.31936653459654899e-23, +-4.50719922418238079e-22, +-6.57524439047065440e-22, + 4.07821428812121449e-22, +-1.89273939782620663e-22, +-4.90289709622755839e-22, +-6.84849466117506921e-22, +-2.88696666665992958e-22, +-1.35162215857249573e-21, + 1.18945118608890010e-22, +-8.53811560810883127e-22, +-4.43765794803049708e-22, +-1.10243838016700090e-21, +-5.83732655600929362e-24, +-9.39316503735866108e-22, +-7.31648046955397941e-22, +-3.55409190637888036e-22, + 4.99865777060648624e-23, +-3.64845349126192818e-22, +-1.60264764211139310e-25, +// root 1 + 5.99304541253505629e-01, + 5.26182764108345857e-01, + 4.53562978286056184e-01, + 3.86691841564606786e-01, + 3.28502560132101051e-01, + 2.79888678302705640e-01, + 2.40584737872695575e-01, + 2.09507351034771472e-01, + 1.85042058468277842e-01, + 1.65562066422721449e-01, + 1.49766416730047647e-01, + 1.36719011516453354e-01, + 1.25763440099369767e-01, + 1.16434354759261616e-01, + 1.08394489872086025e-01, + 1.01393761522384773e-01, + 9.52428547188060165e-02, + 8.97958245839539509e-02, + 8.49383466557172007e-02, + 8.05795908364259766e-02, + 7.66464793488337848e-02, + 7.30795506564994035e-02, + 6.98299285554222632e-02, + 6.68570665316496754e-02, + 6.41270454457402717e-02, + 6.16112723772078638e-02, + 5.92854744868271735e-02, + 5.71289126866767402e-02, + 5.51237610537360506e-02, + 5.32546126064409112e-02, + 5.15080824074275398e-02, + 4.98724863397615251e-02, + 4.83375792403612503e-02, + 4.68943399752171572e-02, + 4.55347939230371784e-02, + 4.42518654844873197e-02, + 4.30392548538934966e-02, + 4.18913345208460353e-02, + 4.08030619117797852e-02, + 3.97699053092625057e-02, +-3.57531960158831222e-02, +-3.70421691442038639e-02, +-3.52905765974256963e-02, +-3.14322543811090260e-02, +-2.67184415838843288e-02, +-2.19103253140243356e-02, +-1.74516957251387508e-02, +-1.37142854038563213e-02, +-1.08381503896401877e-02, +-8.70958440785367556e-03, +-7.13409206744655255e-03, +-5.94685961899566948e-03, +-5.03251470608989931e-03, +-4.31385841143813210e-03, +-3.73885214341632263e-03, +-3.27161773821305459e-03, +-2.88680997539375898e-03, +-2.56611879157474417e-03, +-2.29605036050227517e-03, +-2.06648306923543513e-03, +-1.86970443125751042e-03, +-1.69975428570648510e-03, +-1.55196781474553429e-03, +-1.42265180181016973e-03, +-1.30885150928619306e-03, +-1.20818030194167034e-03, +-1.11869343042175556e-03, +-1.03879336118139500e-03, +-9.67157952649704629e-04, +-9.02685386767131961e-04, +-8.44451532900317918e-04, +-7.91676636692434615e-04, +-7.43699073702881806e-04, +-6.99954505839270888e-04, +-6.59959205871781104e-04, +-6.23296623940327319e-04, +-5.89606495191168133e-04, +-5.58575953646012376e-04, +-5.29932240825419930e-04, +-5.03436690217323192e-04, +-3.52102452443890429e-04, + 3.75174579968151151e-05, + 3.80660413783176184e-04, + 5.59149188200247158e-04, + 6.06239603002699918e-04, + 5.88393353258855425e-04, + 5.18832630478564859e-04, + 4.12964459637801655e-04, + 3.08603816752715766e-04, + 2.27298345678953037e-04, + 1.69597016062503469e-04, + 1.29283844314445753e-04, + 1.00682202674321237e-04, + 7.99125149337309937e-05, + 6.44819871401668577e-05, + 5.27817427961670786e-05, + 4.37495884732012503e-05, + 3.66663240380841435e-05, + 3.10333757367811314e-05, + 2.64977287084120840e-05, + 2.28046655886847063e-05, + 1.97672577746865134e-05, + 1.72462162559310200e-05, + 1.51363068572288548e-05, + 1.33570185672358778e-05, + 1.18460436351957067e-05, + 1.05546510515532509e-05, + 9.44435660060203868e-06, + 8.48449459446296229e-06, + 7.65042564017300425e-06, + 6.92219898400930476e-06, + 6.28354372404057951e-06, + 5.72110065210544839e-06, + 5.22383202860055186e-06, + 4.78256423155322190e-06, + 4.38963055186375152e-06, + 4.03859012373517592e-06, + 3.72400520967271102e-06, + 3.44126355607644549e-06, + 3.18643581228092059e-06, + 2.89689054398965392e-05, + 3.32820290945216299e-05, + 2.22157395511469117e-05, + 8.20112272255263328e-06, + 6.66248232973858786e-07, +-3.61271474285178401e-06, +-7.80301806345862648e-06, +-9.26614989166842920e-06, +-7.85176963068009556e-06, +-5.71654819999390535e-06, +-3.99010566192830176e-06, +-2.80348277435864467e-06, +-2.01316980021540067e-06, +-1.48018576913479362e-06, +-1.11206414842965289e-06, +-8.51536769697679115e-07, +-6.63024390012679455e-07, +-5.23911522144374277e-07, +-4.19446547770892555e-07, +-3.39770325660604323e-07, +-2.78147050291158184e-07, +-2.29882920844789364e-07, +-1.91648288264815225e-07, +-1.61042768849586302e-07, +-1.36310302376165656e-07, +-1.16148847630084150e-07, +-9.95810431996865158e-08, +-8.58648841300667507e-08, +-7.44311188507934868e-08, +-6.48387725436073714e-08, +-5.67431485476372752e-08, +-4.98725362104325809e-08, +-4.40110709141346710e-08, +-3.89859924215132009e-08, +-3.46580825380189480e-08, +-3.09144244372007782e-08, +-2.76628740025944624e-08, +-2.48278049055916828e-08, +-2.23468095487108882e-08, +-2.01681231882556949e-08, + 7.72501024963436898e-07, +-2.80966755264501644e-07, +-9.49018207200879281e-07, +-6.96108406291087841e-07, +-2.97818108335019816e-07, +-2.76852270631729424e-07, +-2.04888568106987538e-07, + 2.00969500056613484e-08, + 1.30942271324269424e-07, + 1.25392993711126793e-07, + 8.99312722861979212e-08, + 6.00668872927246255e-08, + 4.01343748746872833e-08, + 2.73987415098060918e-08, + 1.91762197126338220e-08, + 1.37376394663773907e-08, + 1.00480803295843057e-08, + 7.48597207980670910e-09, + 5.66923130837850196e-09, + 4.35674594422745457e-09, + 3.39254181070956416e-09, + 2.67341873407042219e-09, + 2.12968838678046290e-09, + 1.71341488467009176e-09, + 1.39106631659720476e-09, + 1.13882367137337316e-09, + 9.39527427966840604e-10, + 7.80654385167241630e-10, + 6.52954801193710840e-10, + 5.49520598115094404e-10, + 4.65139030976873554e-10, + 3.95838717329047435e-10, + 3.38566734935092982e-10, + 2.90956450686017900e-10, + 2.51158716622487736e-10, + 2.17718011923689863e-10, + 1.89480630957952558e-10, + 1.65526055819805367e-10, + 1.45115279540527331e-10, + 1.27651464627282839e-10, +-3.97683243091726571e-08, +-5.40223786837152942e-08, +-7.73818265022086619e-09, + 2.49382311639356389e-08, + 9.72593967257642441e-09, +-2.25189559699627423e-09, + 9.97363732944645590e-09, + 9.62874949557509752e-09, + 1.78896807718700731e-09, +-1.55282864315404034e-09, +-1.74090233198637322e-09, +-1.22973516643326516e-09, +-7.90073530663692966e-10, +-5.05564144253858600e-10, +-3.30435852075788467e-10, +-2.21593399611920466e-10, +-1.52273513802432183e-10, +-1.06963650770797628e-10, +-7.66251531299170628e-11, +-5.58648932918830759e-11, +-4.13786108614268099e-11, +-3.10904698990684162e-11, +-2.36661225564852705e-11, +-1.82298784377483991e-11, +-1.41960298689149137e-11, +-1.11660041329620204e-11, +-8.86425383398680815e-12, +-7.09743691827761983e-12, +-5.72810985906266857e-12, +-4.65728065326442032e-12, +-3.81286734106386381e-12, +-3.14176941833236358e-12, +-2.60451116753329794e-12, +-2.17143094330067948e-12, +-1.82008400416324682e-12, +-1.53330031677725353e-12, +-1.29787115164262869e-12, +-1.10355443165787255e-12, +-9.42340093381414352e-13, +-8.07951494372556061e-13, +-1.89455969189766874e-09, + 9.63884934232436307e-10, + 2.23038152916999818e-09, + 2.32163192620612014e-10, +-1.04847983358652253e-09, + 2.38422209968805169e-10, + 3.94871746829086090e-10, +-3.18253326840628172e-10, +-2.49780176006134721e-10, +-4.96048421324278991e-11, + 1.67533459987119308e-11, + 2.15318643848664488e-11, + 1.48692118223528210e-11, + 9.21397507441943176e-12, + 5.67628314429581169e-12, + 3.57185613988055783e-12, + 2.30728629980137794e-12, + 1.52831571783615550e-12, + 1.03565480833099061e-12, + 7.16333263476647770e-13, + 5.04695371494131608e-13, + 3.61567965843091318e-13, + 2.62992308883758562e-13, + 1.93959327175961309e-13, + 1.44880065660137629e-13, + 1.09488101175907907e-13, + 8.36296541220148628e-14, + 6.45322254575819621e-14, + 5.02514799929686546e-14, + 3.94760655719429448e-14, + 3.12580269988638630e-14, + 2.49381107989296024e-14, + 2.00364175967593692e-14, + 1.62078122811125847e-14, + 1.31902144936911222e-14, + 1.07975378663162613e-14, + 8.89098803056322548e-15, + 7.35723987776927455e-15, + 6.12292798336020100e-15, + 5.11341533094752314e-15, + 5.63248461436884569e-11, + 1.09224142836201145e-10, +-2.89879598943193274e-11, +-8.52342718111328073e-11, + 9.77659976487686838e-12, + 4.84990868257369849e-11, +-2.97586455795340420e-11, +-1.00529035378084670e-11, + 8.70082317279815092e-12, + 4.54929239383592850e-12, + 7.95842256486425990e-13, +-1.78574846366352219e-13, +-2.40854315055251985e-13, +-1.61010112469361654e-13, +-9.63934804366006324e-14, +-5.74050481699786362e-14, +-3.49371591549283068e-14, +-2.18293783304259502e-14, +-1.40010811793653942e-14, +-9.18502259117659376e-15, +-6.15127000190346640e-15, +-4.20604747153121239e-15, +-2.91925858874898995e-15, +-2.05887681848525988e-15, +-1.47392707787472688e-15, +-1.06999153090220994e-15, +-7.89803722624793610e-16, +-5.81213968140458230e-16, +-4.39122370274445933e-16, +-3.29510857216544032e-16, +-2.53738786376116602e-16, +-1.95007684329134158e-16, +-1.54608703271165718e-16, +-1.17018735656764231e-16, +-9.47621478634363107e-17, +-7.66611759768585460e-17, +-6.02255735816246682e-17, +-4.99877608837690467e-17, +-3.41959519542547057e-17, +-3.03965582116666830e-17, + 4.61813961284692242e-12, +-2.32425793778478041e-12, +-4.28763332106481453e-12, + 9.84077498797198362e-13, + 3.81405668073593866e-12, +-2.09964469827646177e-12, +-9.52739664678217418e-13, + 1.15942050150284824e-12, + 4.67286354282582279e-14, +-1.72943751778941938e-13, +-6.25191464235746322e-14, +-9.27434499221753044e-15, + 1.94391095955719570e-15, + 2.46327339829996222e-15, + 1.58074300741782749e-15, + 9.17004834677278609e-16, + 5.27641530501873260e-16, + 3.13193712585088844e-16, + 1.87673978590824558e-16, + 1.19731079870945120e-16, + 7.77401445044055004e-17, + 4.69087729098518512e-17, + 3.47645429908869640e-17, + 2.51472873450058983e-17, + 1.49489466922093695e-17, + 1.40985137074379435e-17, + 3.66737718001308340e-18, + 6.52543588079583885e-18, + 2.05484569243060751e-18, + 4.49360926046034512e-18, + 2.33131478315256074e-18, + 3.96941610918945702e-18, +-2.37904629906430136e-18, + 2.63780884228670212e-18, +-4.21837036119093395e-19, +-2.00092457458294043e-18, + 1.42274949020720557e-18, +-1.05918888133215043e-18, + 3.39338657170072519e-18, +-1.03599749431438612e-18, +-5.89007710794545376e-14, +-2.16349396374791718e-13, + 1.03348759364309761e-13, + 1.47113567245987138e-13, +-4.85080765394953331e-14, +-1.48314753569451270e-13, + 1.34602389114012635e-13, +-2.03236283880769910e-14, +-2.01822086652593661e-14, + 2.27891277067719299e-15, + 2.49015072199759452e-15, + 6.84901180069980079e-16, + 8.07644365797856383e-17, +-1.30019681351574009e-17, +-1.98599388045550003e-17, +-1.18424106256369504e-17, +-6.99239617269573483e-18, +-1.73671889361277555e-18, +-3.67489017829077584e-18, +-9.95984634680480387e-20, + 1.56479609778587910e-18, + 5.39000476893234607e-19, + 4.07196120571350249e-18, + 3.53774911228562772e-18, + 2.04680421771845938e-18, + 2.74188935020624043e-18, +-1.36107687506620957e-18, + 3.25930108609294344e-18, + 2.32442783094888905e-18, + 3.30845748239726580e-18, + 1.96838672564305151e-18, + 2.07196100094223426e-18, + 6.94913760891564267e-19, + 4.62437077685437198e-18, + 5.31554065334790167e-19, +-1.24760542736147698e-18, + 9.81588333745292080e-19, + 5.49526390904223600e-20, + 5.10409398393902876e-18, + 5.14272407349125108e-19, +-1.00029313051849737e-14, + 5.33786980487158147e-15, + 5.34403184070623231e-15, +-1.25450589826348926e-15, +-9.12594352822904779e-15, + 8.62113231801712249e-15, +-1.01976432256975487e-15, +-2.31559116236010302e-15, + 9.61575657690364690e-16, + 1.62329910632192768e-16, +-5.17608017119541968e-17, +-2.24644845941459006e-17, + 1.72933340326365961e-18, + 2.74438817672664882e-18, + 5.01599577411155232e-18, + 2.30500101751810042e-18, + 2.53977609775020371e-18, + 1.78710287069224102e-20, + 7.58086180736285931e-19, + 2.09705784707871917e-19, + 3.13851187943270118e-18, +-2.27922273641130029e-18, + 1.78140540767913065e-18, + 1.43971608614845690e-18, + 3.19524107344833110e-18, + 3.56553359338649241e-18, +-1.07165214920285637e-19, + 1.99473415728024483e-18, + 6.27321413052204512e-19, + 1.39614655484801795e-18, + 2.05962710735508962e-18, + 6.07092778154949054e-19, +-1.58748048489231229e-18, + 2.94832330568529740e-18, +-1.13590538766198663e-19, +-1.03184982271492560e-18, + 5.45956790186453497e-19, + 1.74767845277537303e-19, + 3.35176618408515980e-18, +-8.91394398588751423e-19, + 1.50844541793469177e-17, + 4.04354794062655088e-16, +-2.63075589369322156e-16, +-7.23467956802884429e-17, +-6.35432353883532924e-17, + 4.11529734038685869e-16, +-4.08258746709178855e-16, + 1.54341558341438830e-16, +-1.39457151413504405e-17, +-1.31324372555147558e-17, +-5.10230220960239092e-18, + 8.06927567084997328e-19, + 2.86501554106248802e-18, + 8.36521965248860303e-18, + 6.60061705741345339e-18, + 8.26985685780001835e-18, + 1.90511724867101708e-18, + 5.44755420209892427e-18, + 2.02934897557334387e-18, + 3.49306568086252359e-18, + 4.43140491311113827e-18, + 2.72880358278593370e-18, + 3.30502930496117197e-18, + 6.23152466630050227e-18, + 4.47616261042782862e-18, + 2.31890307410385136e-18, +-4.92161232386565151e-19, + 2.45503617242150542e-18, + 6.64038070922764561e-19, + 3.74181287982997737e-18, + 2.43193591728530778e-18, + 8.04825306796274896e-19, + 3.18290114038608413e-19, + 2.73301514093048414e-18, + 1.93603223209444980e-18, + 1.03127716220319880e-18, +-1.53528317938709127e-19, +-1.37478469426419478e-18, + 2.73569000553271667e-18, + 2.37221706186545580e-19, + 2.65576585334923388e-17, +-1.31961476306566414e-17, +-1.43213941535515177e-17, +-9.27883885177038709e-18, + 2.29326767593526208e-17, +-2.77639590956718191e-17, + 1.20229585182745215e-17, +-6.36225949598715949e-18, +-1.65775635331835877e-18, + 8.21902064954208377e-19, + 5.40954229834641541e-18, + 4.02476606594689966e-18, +-3.85677429373671349e-18, + 1.50580673702030134e-18, + 2.15778203333108204e-18, +-1.98141425488794287e-18, +-1.72739097603842195e-18, + 7.51438117894234069e-20, +-3.05559485362501927e-18, +-5.50213343392715780e-19, +-4.26485853949091480e-19, +-1.10459857702332014e-18, + 1.72495371443805421e-18, + 2.91198935361971356e-18, + 1.33870547097490883e-18, + 1.38240728037772670e-18, + 8.20748302462310627e-19, + 2.53408423721545424e-18, + 2.65148383169222500e-19, + 3.93688264836720058e-18, + 2.59795707875612199e-18, + 1.27729580801869493e-18, + 8.53217312067204288e-19, + 1.06411152609813277e-18, + 2.51750336415136718e-18, + 1.29820996547701018e-18, + 5.50103942580753674e-19, + 6.14628020450406772e-20, + 1.43764529393015467e-18, +-5.00673911407455829e-19, +-2.89639411861533715e-18, +-9.38403664621001489e-18, +-1.00707140182799479e-17, +-4.13594684296227836e-18, +-8.95814624113752471e-18, +-1.14364376722052615e-17, +-5.93780948619827380e-18, +-3.09216109862609531e-18, +-2.40100130580536776e-18, + 2.86814227607321412e-18, + 1.12003980388638283e-18, +-2.85634049237217981e-18, + 3.18349311272823221e-18, +-2.43651393755107964e-18, +-3.88382350261542382e-18, +-2.89344485922236108e-18, +-4.04221480981309406e-18, +-3.05862891247304658e-18, +-3.05590634506530113e-18, + 2.68703827470542473e-18, +-1.03535176179096409e-18, + 3.20696397090201041e-19, +-2.65744389002889588e-18, + 1.72753391596167326e-18, +-4.00693203024693509e-19, +-2.49790534199577254e-18, +-3.83173034028685437e-18, +-9.48244414743219154e-19, +-2.40731316977144191e-18, +-2.38409453136140976e-18, +-3.55081102328364527e-18, +-1.19637840129124562e-18, +-2.62143179703613931e-18, +-1.66967015023017301e-18, +-2.73489684461325605e-18, +-1.59599433353460973e-18, +-1.80255683444871264e-18, +-2.09675738855512491e-18, +-1.27091213759836574e-18, +-8.41996545162703597e-19, + 1.26336104622483930e-01, + 3.85851966994175746e-02, + 1.62245973298144990e-02, + 9.02195278574576681e-03, + 6.21790520794921701e-03, + 4.96791212056419546e-03, + 4.34013407866883950e-03, + 3.97090022251138115e-03, + 3.71203244627447623e-03, + 3.50705031542687716e-03, + 3.33485039062459895e-03, + 3.18621368052319446e-03, + 3.05592318268953309e-03, + 2.94043463112113670e-03, + 2.83713145610660659e-03, + 2.74400879996133506e-03, + 2.65949640240051256e-03, + 2.58234371180461131e-03, + 2.51154063876981616e-03, + 2.44626116211439345e-03, + 2.38582231792444947e-03, + 2.32965383531870060e-03, + 2.27727529724381641e-03, + 2.22827871652921854e-03, + 2.18231507205085941e-03, + 2.13908378324823272e-03, + 2.09832439388134501e-03, + 2.05980993703700323e-03, + 2.02334159385821402e-03, + 1.98874435802662416e-03, + 1.95586348955280407e-03, + 1.92456159346230836e-03, + 1.89471619726019154e-03, + 1.86621772954557357e-03, + 1.83896782355548374e-03, + 1.81287788565522327e-03, + 1.78786788121774597e-03, + 1.76386529992077754e-03, + 1.74080426994382130e-03, + 1.71862479638456179e-03, +-7.87770725412395983e-02, +-1.86133331154615771e-02, +-5.57629392143595658e-03, +-2.04921052608669297e-03, +-8.74505179851418402e-04, +-4.17219857389282867e-04, +-2.27629627371633294e-04, +-1.48564138349784167e-04, +-1.12875091011450295e-04, +-9.30619390612557533e-05, +-7.95738775736397526e-05, +-6.93219139129492749e-05, +-6.11489135674863677e-05, +-5.44739304213949973e-05, +-4.89324847382163481e-05, +-4.42711738111248930e-05, +-4.03058130012152671e-05, +-3.68990980997031996e-05, +-3.39467137805825285e-05, +-3.13681239049701550e-05, +-2.91002636735357938e-05, +-2.70931197797908354e-05, +-2.53065741123485577e-05, +-2.37081116030247214e-05, +-2.22711302374630776e-05, +-2.09736777817862052e-05, +-1.97974955499379006e-05, +-1.87272862053786873e-05, +-1.77501471388262402e-05, +-1.68551276705359139e-05, +-1.60328798695109785e-05, +-1.52753808709633879e-05, +-1.45757103153109241e-05, +-1.39278706573114928e-05, +-1.33266410912638047e-05, +-1.27674580388524978e-05, +-1.22463167778891959e-05, +-1.17596900111962301e-05, +-1.13044600964576206e-05, +-1.08778623591810152e-05, + 1.49208569802010346e-02, + 2.99883724555066386e-03, + 7.49070790815800007e-04, + 2.31652956555988224e-04, + 8.59020698791741619e-05, + 3.52981578684428461e-05, + 1.46655942418759291e-05, + 6.24917379490881536e-06, + 3.13135082099377728e-06, + 1.97350700784500212e-06, + 1.44690988374758009e-06, + 1.13501258135411201e-06, + 9.18267963336534236e-07, + 7.56947682076922841e-07, + 6.32956816294678278e-07, + 5.35685332235067375e-07, + 4.58130404633399985e-07, + 3.95431587543591574e-07, + 3.44120006978856588e-07, + 3.01668234929947335e-07, + 2.66202193975519960e-07, + 2.36310494400335427e-07, + 2.10915244896686725e-07, + 1.89182770051150513e-07, + 1.70460813690303202e-07, + 1.54233662643060500e-07, + 1.40089608059543915e-07, + 1.27697036439166473e-07, + 1.16786645328195430e-07, + 1.07138064434144749e-07, + 9.85696850214951393e-08, + 9.09308527361587444e-08, + 8.40958201686399813e-08, + 7.79590227774968268e-08, + 7.24313592903574288e-08, + 6.74372412131053213e-08, + 6.29122360620753226e-08, + 5.88011724561929799e-08, + 5.50566071109840984e-08, + 5.16375773475183778e-08, +-2.08748873282233946e-03, +-3.68638155681808282e-04, +-7.88390748395107637e-05, +-2.05500623509707150e-05, +-6.56636018109030791e-06, +-2.55754424818956224e-06, +-1.07381175381342857e-06, +-4.13117354661968709e-07, +-1.48353035689854072e-07, +-6.02689292607896678e-08, +-3.21205660181562646e-08, +-2.11729453220113137e-08, +-1.54077991434961231e-08, +-1.16999760469902640e-08, +-9.09903960252656561e-09, +-7.20226518384860527e-09, +-5.78586753339068360e-09, +-4.70850463288385744e-09, +-3.87594855125105235e-09, +-3.22349225405784316e-09, +-2.70571769912841523e-09, +-2.29014651381105555e-09, +-1.95316512027161919e-09, +-1.67734602478519854e-09, +-1.44965081821694517e-09, +-1.26020260530259898e-09, +-1.10143347508444404e-09, +-9.67483421118142207e-10, +-8.53770616356097773e-10, +-7.56680228329735408e-10, +-6.73336382850319921e-10, +-6.01433203381141748e-10, +-5.39108336541253312e-10, +-4.84847359491430088e-10, +-4.37410883438552825e-10, +-3.95778495770248737e-10, +-3.59105303866123756e-10, +-3.26688002794916441e-10, +-2.97938188066069728e-10, +-2.72361229525414510e-10, + 2.35178798648877639e-04, + 3.74155907056165555e-05, + 7.05503714045252719e-06, + 1.58825206334832172e-06, + 4.22517203121705207e-07, + 1.38934100430208892e-07, + 5.99778448919921452e-08, + 2.60659541321617783e-08, + 9.24660836936723636e-09, + 2.89401432983930452e-09, + 1.00259034948761461e-09, + 4.66055760740274716e-10, + 2.80452365830562217e-10, + 1.91319609347640041e-10, + 1.37555576433271873e-10, + 1.01705528551458961e-10, + 7.67289117810634204e-11, + 5.88690500937539627e-11, + 4.58390213091332055e-11, + 3.61669995005161472e-11, + 2.88763377478310925e-11, + 2.33041002239916189e-11, + 1.89914795241272282e-11, + 1.56153828366988571e-11, + 1.29446757729477678e-11, + 1.08116139068330616e-11, + 9.09284118622276703e-12, + 7.69653493096399699e-12, + 6.55357464589500289e-12, + 5.61138468239192197e-12, + 4.82958536088774216e-12, + 4.17688607315652394e-12, + 3.62883141812090270e-12, + 3.16615942284177712e-12, + 2.77358613175929495e-12, + 2.43889836458158860e-12, + 2.15227451525043557e-12, + 1.90576592823139433e-12, + 1.69290303099369914e-12, + 1.50839068585796044e-12, +-2.23454412754135557e-05, +-3.26120949669741849e-06, +-5.53553509990998056e-07, +-1.11072133377743736e-07, +-2.60324777655129423e-08, +-6.66516461174920806e-09, +-2.31932455492987404e-09, +-1.20928869181570055e-09, +-5.21031786646927766e-10, +-1.66558660749271980e-10, +-4.63670481983937116e-11, +-1.42627391492947629e-11, +-5.97564644208656973e-12, +-3.34065571167217878e-12, +-2.15793820932463273e-12, +-1.48000830328778495e-12, +-1.04698657886289833e-12, +-7.57101155747215083e-13, +-5.57611567665107775e-13, +-4.17381611458418006e-13, +-3.16982888889360839e-13, +-2.43913325743315200e-13, +-1.89938592719892725e-13, +-1.49526120117146816e-13, +-1.18891995821466192e-13, +-9.54058089716791341e-14, +-7.72102344798537029e-14, +-6.29768716332399308e-14, +-5.17425579155996479e-14, +-4.28015280614174544e-14, +-3.56304800640800145e-14, +-2.98365693025959564e-14, +-2.51239979804541669e-14, +-2.12664440033498791e-14, +-1.80894398537680225e-14, +-1.54585665581673409e-14, +-1.32679454314422955e-14, +-1.14349440917162865e-14, +-9.89390775931824539e-15, +-8.59247665641047004e-15, + 1.84328372272923759e-06, + 2.50292450192882048e-07, + 3.88231283827666821e-08, + 7.01102347830387799e-09, + 1.51026553874457184e-09, + 3.59193867760317709e-10, + 7.31366767106686167e-11, + 3.43059559192257040e-11, + 2.18986550274761440e-11, + 8.62036340429535806e-12, + 2.45333380988002434e-12, + 6.18793322241103284e-13, + 1.74462226902981221e-13, + 6.78705678389833704e-14, + 3.58674365945566928e-14, + 2.21448715095469787e-14, + 1.45808285417073713e-14, + 9.92126771636343406e-15, + 6.90932636844781565e-15, + 4.90600628540734578e-15, + 3.54424351331074266e-15, + 2.60023691096675494e-15, + 1.93465893758551051e-15, + 1.45826061239994901e-15, + 1.11237920871944218e-15, + 8.57541118696013834e-16, + 6.67863604723335448e-16, + 5.24809188423142476e-16, + 4.16151481951756903e-16, + 3.32755404313155274e-16, + 2.67750190113791684e-16, + 2.17262605725391206e-16, + 1.77343595943102448e-16, + 1.45478978123243489e-16, + 1.20215136503865963e-16, + 9.97861953286551910e-17, + 8.33926456883341313e-17, + 6.99817659288135151e-17, + 5.89842523190820582e-17, + 4.97781784424180115e-17, +-1.34656910103333365e-07, +-1.72059489185259545e-08, +-2.47267431399658545e-09, +-4.06295233869827011e-10, +-7.77115247752951366e-11, +-1.93017218124607676e-11, +-3.77302159279679220e-12, +-3.49765368755047534e-13, +-5.47704472270215967e-13, +-3.47638731156900727e-13, +-1.18227828860566271e-13, +-3.00946199060185408e-14, +-7.00166189902105824e-15, +-1.85617409316645257e-15, +-6.87488441379513053e-16, +-3.48953999319351632e-16, +-2.07585849786677658e-16, +-1.31998095634394518e-16, +-8.66475393749512998e-17, +-5.83633539651803510e-17, +-3.99683276627311870e-17, +-2.79190703219782381e-17, +-2.00946889904706117e-17, +-1.45854731569139643e-17, +-1.04239755674131484e-17, +-7.85714333360255471e-18, +-5.75474900240250656e-18, +-4.44034994365574199e-18, +-3.26299385067789950e-18, +-2.27806118179073650e-18, +-2.01756074112578268e-18, +-1.45129186113225289e-18, +-1.07447951364949994e-18, +-1.01257181208175070e-18, +-7.06091383142669848e-19, +-6.64795554388351667e-19, +-4.48414869327726396e-19, +-2.70993607896275137e-19, +-2.63619140261312646e-19, +-3.23606048912580211e-19, + 8.83866736976740603e-09, + 1.07252118024095111e-09, + 1.44373487578157002e-10, + 2.19853108853984857e-11, + 3.74312934597781171e-12, + 7.87590040773246177e-13, + 2.59669439384747708e-13, + 6.29373028329816253e-15, +-1.01752341817426248e-15, + 9.20445188087720343e-15, + 4.65524444306087841e-15, + 1.35723557332165775e-15, + 3.13368761805840000e-16, + 6.81303708757886484e-17, + 1.74454202118837072e-17, + 6.31576860865526122e-18, + 3.17214633636362755e-18, + 1.93534606984370913e-18, + 1.27243581562116015e-18, + 7.76987824158297662e-19, + 6.24908260346941973e-19, + 3.42177012279493888e-19, + 1.87054047753000162e-19, + 7.56179793525544515e-20, + 2.47028764796243703e-19, + 5.41562411680752922e-20, + 7.23595592133747991e-20, + 2.05520109303477380e-20, + 3.08538633781679454e-20, + 1.99956819457528322e-19, +-2.44277645243474697e-20, + 1.48931371567083224e-19, + 1.11367655286743719e-19, +-3.57495971297437726e-20, + 3.71900361907736425e-20, +-9.89130929293403599e-21, + 8.64482578827543203e-21, + 7.21417336401224202e-20, + 7.44988226534898790e-20, +-1.06449133176360910e-19, +-5.27073226242772711e-10, +-6.12009851049268518e-11, +-7.78412410544402185e-12, +-1.10682461973269740e-12, +-1.80282802190837876e-13, +-2.61190095204439315e-14, +-1.07524427015971502e-14, +-2.49743994340082376e-15, + 6.31942586875322937e-16, +-4.01521057541286104e-17, +-1.34547059959413525e-16, +-5.19566834916201569e-17, +-1.30989430562593452e-17, +-2.91997562777539603e-18, +-5.01418011134091882e-19, +-7.87209381589307966e-20, + 8.49133620809852732e-20, +-1.58907831816125510e-20, + 5.06640641238664943e-20, + 6.87566489458971069e-21, + 2.02937963575506129e-19, + 4.50088327489956099e-20, +-1.01146396550807340e-19, +-9.67657666718032957e-20, + 8.98043700242030040e-20, + 2.05598663451540490e-20, + 1.46217687670447663e-19, +-3.81046643305765616e-20, + 9.18932206124692224e-20, + 2.05792407679674319e-19, +-3.50977148807371293e-20, + 1.28692657264747629e-19, + 9.84861254836538203e-20, + 1.74750204939035301e-20, + 7.56960836450672907e-20, + 4.23879682157603677e-21, + 3.16494767176009525e-20, + 1.41478725609068935e-19, + 6.34455898474180462e-20, +-4.68231804433135118e-20, + 2.88057401218852684e-11, + 3.22103667432150134e-12, + 3.90216315449874465e-13, + 5.20372301827477620e-14, + 8.00919883332337581e-15, + 1.28736622931925025e-15, + 9.32362966696713527e-17, + 2.02427826309020689e-16, +-8.78808699592547685e-18, +-1.01185734041134648e-17, + 2.00000564414647259e-18, + 1.64051662827507567e-18, + 6.21795867613770763e-19, + 2.48846443321520945e-21, + 9.66390455041141556e-20, + 7.03419966285986704e-21, + 9.50569296016793230e-20, + 7.07709140570291421e-20, + 4.06505054928554653e-20, +-3.78587211270306723e-20, + 1.54062468791237183e-19, +-1.54125103296072966e-20, +-1.91336971718752894e-20, + 1.24285625806962574e-20, + 9.59749170397675142e-20, +-4.08960029842218137e-21, + 4.69315369588973513e-20, + 1.15485033259978612e-20, + 5.33592840305484260e-20, + 1.65607016805237268e-19, + 6.57882840748845254e-20, + 7.67006514154772562e-20, + 1.12293580442988857e-19, + 5.14100431106207338e-21, + 4.07442514013512982e-20, +-3.53485845200570448e-20, + 9.18298854195330917e-21, + 1.09125507512077021e-19, + 7.83300034569631231e-20, +-4.93475009686144048e-20, +-1.45312995052768919e-12, +-1.57313107921184878e-13, +-1.82729106365458720e-14, +-2.31781548901749020e-15, +-3.13280645059281089e-16, +-7.29747513787176948e-17, + 6.27246836803431292e-18, +-5.94071193509749729e-18, +-1.66544321593895411e-18, + 3.75657097655312008e-19, + 1.85796181258476390e-20, + 2.39016165623539773e-20, +-1.39323096677545412e-20, +-6.29487083707231366e-20, + 1.42827021943637595e-19, + 1.18817789195729444e-19, + 1.08350977726865066e-19, + 3.46349936514659426e-20, + 8.14642365191775815e-20, + 1.13778274848731378e-19, + 2.12182473732176669e-19, + 2.52027688727978669e-20, +-1.79147574841051963e-20, + 6.78452521570210479e-20, + 8.43961711798048804e-20, + 7.23638210784514271e-20, + 2.36005881063207759e-20, + 7.55621531631220170e-20, + 1.58661369528970582e-19, + 1.24267122950311388e-19, +-1.93371817663704285e-20, + 8.99823209621443400e-20, + 9.28061400653593032e-20, + 1.40436406711035089e-20, + 5.48902846173595255e-20, + 6.10124999610548605e-21, + 3.40340679497788458e-20, + 5.40569874155515514e-20, + 3.71737271060267908e-20, +-3.44863511282080962e-20, + 6.80548217929925744e-14, + 7.16323254631364804e-15, + 8.00637361284607339e-16, + 9.70270026749627231e-17, + 1.24121673400533999e-17, + 1.85473454538780508e-18, + 5.47706910874715190e-19, +-6.08430697521035079e-20, + 1.31301283627447538e-19, +-7.95680097835376437e-20, +-3.25125290662682438e-20, +-3.43578947879636307e-20, + 4.77696363625676227e-20, +-7.81215651722023019e-20, +-5.49439385309171663e-21, + 2.39237519706514301e-20, + 6.88214606126150384e-20, +-4.81596878696934220e-20, +-2.20238455473591271e-20, + 3.72505820867833489e-20, +-1.63868376704959265e-20, + 1.11176786513980061e-20, +-1.18974584297247023e-19, +-4.84318169401603087e-20, + 2.96940937072199916e-20, +-1.72268408740779968e-20, + 5.92809201243183814e-20, + 1.80247804627372144e-20, + 7.12007520396668801e-20, + 7.31640754479966756e-20, + 1.63275602786306609e-20, + 2.11720332834993646e-20, + 5.12833279070348845e-20, +-9.21886317764465829e-21, + 2.44975655232339761e-20, +-7.14467909149119180e-24, + 2.90619228044914262e-20, + 5.93163458455125260e-20, + 9.63472453419998379e-20, + 2.81349105729071303e-20, +-3.00417463480052786e-15, +-3.18123749529563091e-16, +-3.57729667232198420e-17, +-4.19164228850735674e-18, +-8.66644175249333992e-19, +-3.08067819408520807e-20, +-6.39651582951896736e-20, + 1.01405116253505867e-20, +-1.12378817463841178e-19, +-8.32100379772448958e-20, + 7.55307725458086953e-21, + 6.29261563914297344e-20, + 5.77755241738191664e-20, +-7.23526355460794127e-20, +-6.01258886229522571e-20, +-5.77722167322198342e-20, +-6.22671167982631600e-20, + 3.27847546033017140e-20, +-4.60590712331660453e-20, + 6.76391250452206261e-20, + 9.34398420453695251e-20, + 2.47193675651255449e-20, +-5.42318902511636256e-20, +-5.16890579956524719e-20, +-1.97825563687796551e-20, +-1.40875474181480805e-19, +-1.43622304154790039e-20, +-1.45576867078671775e-19, +-1.38943982963038348e-20, + 5.75983302389663651e-20, +-4.53009921299848671e-20, +-2.96741217389012024e-20, +-5.24075468475072710e-20, +-3.39466328733479113e-20, +-3.97794698978479630e-20, +-4.96218052573671723e-20, +-4.47554828715414522e-20, +-2.53598951148892585e-20, + 2.95632672944188136e-20, +-7.36277656117025357e-20, +// root 2 + 2.48975969061502433e-01, + 2.01645942499112302e-01, + 1.64580208137171558e-01, + 1.35798682930216519e-01, + 1.13377354120028112e-01, + 9.58357261399273991e-02, + 8.21335868427408577e-02, + 7.14609199482055396e-02, + 6.31027133727551232e-02, + 5.64572829917311045e-02, + 5.10705244006591785e-02, + 4.66212878094126523e-02, + 4.28854218784401608e-02, + 3.97041961934768151e-02, + 3.69625965346215696e-02, + 3.45753432770237040e-02, + 3.24778797725476173e-02, + 3.06204387038368671e-02, + 2.89640353482474161e-02, + 2.74776965790663498e-02, + 2.61365028233533948e-02, + 2.49201776557797551e-02, + 2.38120542567507691e-02, + 2.27983062367778967e-02, + 2.18673671456952809e-02, + 2.10094867777092208e-02, + 2.02163880777438340e-02, + 1.94809990023782353e-02, + 1.87972408994510447e-02, + 1.81598599775217237e-02, + 1.75642919636299182e-02, + 1.70065525657658589e-02, + 1.64831481761854998e-02, + 1.59910025819105586e-02, + 1.55273964315281125e-02, + 1.50899169407388324e-02, + 1.46764158714215998e-02, + 1.42849742386085467e-02, + 1.39138725212030329e-02, + 1.35615654004054564e-02, +-2.64785994988550426e-02, +-2.09197450127905048e-02, +-1.62555350461674533e-02, +-1.26287299540767117e-02, +-9.86954659257418057e-03, +-7.72432216761567269e-03, +-6.01897134466515722e-03, +-4.69132764803125834e-03, +-3.69851250438907710e-03, +-2.97040896768388431e-03, +-2.43279432718643751e-03, +-2.02789205927866910e-03, +-1.71609216291688745e-03, +-1.47102886447427980e-03, +-1.27495120124788085e-03, +-1.11562392860838013e-03, +-9.84404211789251422e-04, +-8.75048294622220516e-04, +-7.82954771567779704e-04, +-7.04672165406229774e-04, +-6.37570512847620880e-04, +-5.79617394886261538e-04, +-5.29222105391688848e-04, +-4.85125254943964636e-04, +-4.46319275959406673e-04, +-4.11990324162214640e-04, +-3.81475238668348257e-04, +-3.54229259426659963e-04, +-3.29801535240929549e-04, +-3.07816345385707104e-04, +-2.87958560671581045e-04, +-2.69962284319971322e-04, +-2.53601901935972360e-04, +-2.38684973837164412e-04, +-2.25046548701369185e-04, +-2.12544582736282490e-04, +-2.01056225375940994e-04, +-1.90474789103909595e-04, +-1.80707263088795977e-04, +-1.71672261883806787e-04, + 7.28456509402058126e-04, + 6.47544707466702197e-04, + 5.16643646620921528e-04, + 3.93574179541750929e-04, + 3.01220331814610286e-04, + 2.38336704607921586e-04, + 1.88857240005581880e-04, + 1.43746729553797164e-04, + 1.05813760052755743e-04, + 7.76074771594611714e-05, + 5.78477620816002282e-05, + 4.40880084656413912e-05, + 3.43329842057927677e-05, + 2.72502591171694138e-05, + 2.19884068870032877e-05, + 1.79986115596350350e-05, + 1.49186401895175276e-05, + 1.25032420327097552e-05, + 1.05824027340817095e-05, + 9.03574393879093362e-06, + 7.77640684358515761e-06, + 6.74064866419842236e-06, + 5.88097175101466618e-06, + 5.16149117702480210e-06, + 4.55475263130124029e-06, + 4.03950912745250851e-06, + 3.59914335729703669e-06, + 3.22053217647577179e-06, + 2.89321856407396683e-06, + 2.60880046993480104e-06, + 2.36047467315417950e-06, + 2.14269278483961116e-06, + 1.95089930570868721e-06, + 1.78133035886299126e-06, + 1.63085773283878402e-06, + 1.49686707448287698e-06, + 1.37716204407641093e-06, + 1.26988836935131513e-06, + 1.17347326861366529e-06, + 1.08657683055618885e-06, +-2.10639199712649711e-06, +-9.98922202705843127e-06, +-1.11049969202577143e-05, +-9.12187040709104225e-06, +-6.29197687898817770e-06, +-4.44015304658049243e-06, +-3.92920242020550067e-06, +-3.52785228529273009e-06, +-2.75876073433702322e-06, +-1.96415840549146203e-06, +-1.36299852404375185e-06, +-9.56335601486235799e-07, +-6.86539501506184714e-07, +-5.04750482503706107e-07, +-3.79215405400318344e-07, +-2.90374721855072135e-07, +-2.26091789137211224e-07, +-1.78654195017934069e-07, +-1.43031564959788716e-07, +-1.15861917630452590e-07, +-9.48483378110683203e-08, +-7.83902360646445735e-08, +-6.53521997352667603e-08, +-5.49156963034548366e-08, +-4.64819080188818428e-08, +-3.96068379114278094e-08, +-3.39572050634563799e-08, +-2.92799852707211300e-08, +-2.53810633502991683e-08, +-2.21100665833643909e-08, +-1.93494531617561901e-08, +-1.70065695711081295e-08, +-1.50078058226961738e-08, +-1.32942505619893984e-08, +-1.18184302759764187e-08, +-1.05418402570069350e-08, +-9.43305929604788476e-09, +-8.46629875887850633e-09, +-7.62027761693826233e-09, +-6.87734404901440334e-09, +-7.86139395408746918e-07, +-2.34630536072542194e-07, + 5.65202918925492513e-08, + 1.71066454433322108e-07, + 1.62501636446503477e-07, + 6.45590259862236354e-08, + 1.56521194163825090e-08, + 3.86510020757450218e-08, + 5.28279066769909356e-08, + 4.43890977175621439e-08, + 3.09427351245240799e-08, + 2.05247886326004707e-08, + 1.36917391139768665e-08, + 9.34376899141439461e-09, + 6.53920256664308145e-09, + 4.68455655499060019e-09, + 3.42640379358053297e-09, + 2.55272185127547696e-09, + 1.93321184378965075e-09, + 1.48565340310269573e-09, + 1.15685911987556048e-09, + 9.11637650765605229e-10, + 7.26225220500548588e-10, + 5.84275668279186101e-10, + 4.74354580228979158e-10, + 3.88339663410437345e-10, + 3.20379509045651094e-10, + 2.66203690290659034e-10, + 2.22658042226000507e-10, + 1.87386904900546655e-10, + 1.58612733282776374e-10, + 1.34981278322226847e-10, + 1.15451494355208088e-10, + 9.92163503386575080e-11, + 8.56452978603237772e-11, + 7.42419940924886099e-11, + 6.46130262500997634e-11, + 5.64445007471869620e-11, + 4.94844098428097950e-11, + 4.35292380753865108e-11, + 3.15414608570537891e-08, + 2.11253860299385048e-08, + 9.14327934439985830e-09, + 2.68777165013045489e-09, +-3.49843236401109645e-09, +-4.82105422238942472e-09, + 5.16299093939477131e-11, + 1.39079074335308280e-09, +-3.10259577191799704e-12, +-6.67849813551415284e-10, +-6.18845293459799127e-10, +-4.23353785866820295e-10, +-2.69998614267115166e-10, +-1.72476845500221361e-10, +-1.12689040511475890e-10, +-7.55647607087489411e-11, +-5.19255235347005557e-11, +-3.64746970438511141e-11, +-2.61292313790552668e-11, +-1.90499672995236687e-11, +-1.41101361856392089e-11, +-1.06018718231282015e-11, +-8.07016637404974968e-12, +-6.21640098516111795e-12, +-4.84085735374090021e-12, +-3.80761665633707830e-12, +-3.02271524811136648e-12, +-2.42022967154328562e-12, +-1.95328943267966246e-12, +-1.58813802319211701e-12, +-1.30019072241862472e-12, +-1.07134609817084340e-12, +-8.88138744231462608e-13, +-7.40461332845347279e-13, +-6.20649310560767741e-13, +-5.22856234607102420e-13, +-4.42576114106789652e-13, +-3.76312830229928338e-13, +-3.21339866357123045e-13, +-2.75512106771285353e-13, + 3.28943070871695924e-11, +-6.23079311254672527e-10, +-3.46558079936322518e-10, +-2.47266191994158698e-10, +-2.23962827207363819e-10, + 1.36871981217709712e-10, + 1.72160356987764806e-10, +-3.91874736445139020e-11, +-5.09829481170026396e-11, +-7.63938961615411237e-12, + 7.57331022515829351e-12, + 7.65659256740258605e-12, + 5.11791526600377204e-12, + 3.14861026125883447e-12, + 1.93649158291478849e-12, + 1.21811588198970011e-12, + 7.86799140726178314e-13, + 5.21156833297647096e-13, + 3.53161645336751803e-13, + 2.44271233206197363e-13, + 1.72101391078278506e-13, + 1.23294563908756772e-13, + 8.96790581934033197e-14, + 6.61401530813782098e-14, + 4.94009321132877962e-14, + 3.73348902204343187e-14, + 2.85191623368503219e-14, + 2.20063353578713592e-14, + 1.71365596575482339e-14, + 1.34599611467632730e-14, + 1.06584719835220567e-14, + 8.50459696015745737e-15, + 6.83326636119834890e-15, + 5.52493181573608542e-15, + 4.49832925305432113e-15, + 3.68250130848214084e-15, + 3.03079080929361957e-15, + 2.50910339269270005e-15, + 2.08719487906448927e-15, + 1.74399216101167582e-15, +-5.64882841783878080e-11, + 2.71966846798825025e-12, + 9.79451659328061055e-12, +-1.67557964572359843e-12, + 7.54957197182085091e-12, + 1.19040122678222800e-11, +-7.91025088899564256e-12, +-3.99575643778080428e-12, + 1.65040290954694682e-12, + 1.05956024781615082e-12, + 1.58288702046204095e-13, +-8.14822852831980065e-14, +-8.53985224910928945e-14, +-5.53780287850473132e-14, +-3.29334481516745914e-14, +-1.95844184643481539e-14, +-1.19137601132267706e-14, +-7.44495890543896361e-15, +-4.77128565806328600e-15, +-3.13203015885279322e-15, +-2.09804335474040151e-15, +-1.43290490409410525e-15, +-9.96666512370344122e-16, +-7.02691263449438133e-16, +-5.04110371024933303e-16, +-3.65594176177033648e-16, +-2.67894605790122402e-16, +-1.97272014017193358e-16, +-1.48869509691137419e-16, +-1.13489860250501545e-16, +-8.60893882889651670e-17, +-6.59784584114813910e-17, +-5.11027757897415209e-17, +-4.14587987834418170e-17, +-3.18319539444380696e-17, +-2.58175039733185651e-17, +-2.11348773678531436e-17, +-1.65028320184250308e-17, +-1.30745987587858967e-17, +-1.08341994806153995e-17, + 2.21168488791189163e-12, + 1.02484284396678305e-12, +-3.35051330721582931e-13, +-1.49008037675744670e-13, + 5.81367732874919551e-13, +-5.21936066777853844e-13, +-2.91854549803000924e-13, + 3.03192669825475624e-13, + 3.88480750483686901e-14, +-3.91029501793856107e-14, +-1.56406859114853948e-14, +-2.01984035722436967e-15, + 8.55960973580237657e-16, + 8.66860188324140357e-16, + 5.43581137844951560e-16, + 3.13317175227995097e-16, + 1.81743031077597104e-16, + 1.06568909570304382e-16, + 6.56002195554588405e-17, + 4.03381103850776446e-17, + 2.61505996211924570e-17, + 1.70434067126996665e-17, + 1.06440595995918658e-17, + 8.44913996910405436e-18, + 5.52742015811719350e-18, + 4.32126696948856522e-18, + 1.84407881831042945e-18, + 2.52850107419379598e-18, + 1.39168615381524798e-18, + 3.34662515750963875e-19, +-2.19713445566734039e-19, + 8.30024117221543917e-19, + 9.15916461400854206e-19, +-8.37542591058969279e-19, + 4.73846875557330971e-19, + 2.77235805585978811e-19, +-8.44762685103607394e-19, +-1.43376093161830469e-19, + 2.25762799128482932e-19, + 3.42968695484676267e-19, + 2.51722895478235244e-14, +-5.52636331741048756e-14, +-1.55685749900753579e-14, + 2.31271736386440862e-14, +-1.78605168457920344e-15, +-3.26677233661866330e-14, + 3.22152580092162895e-14, +-2.77101169875016243e-15, +-5.84501102255639183e-15, + 2.53311394101901298e-16, + 6.16089087835254629e-16, + 1.78736263563335274e-16, + 1.67493425697949824e-17, +-6.92153187384177747e-18, +-6.10092640108360384e-18, +-3.62098285264105027e-18, +-2.02084201825141714e-18, +-8.01128200947719581e-19, + 8.99446333225377433e-19, +-1.90928553333815305e-19, + 1.15794173912191246e-18, + 5.09871242319655767e-19, + 2.81979101730200763e-19, + 3.70590430613771303e-19, + 1.82958224282662853e-19, + 1.86604015252884693e-19, +-2.96984031206951310e-19, + 1.74312814025137060e-18, + 8.81144412427731154e-19, + 1.95085821487613235e-19, + 4.26805983978253862e-19, + 2.87486386414990795e-19, + 1.29342771829095892e-18, + 1.20191511451676664e-19, + 3.37526932308369525e-19, + 2.06447786052045947e-19, + 1.09401950972328018e-19, + 2.72848724125814556e-19, + 8.29655050128893566e-19, + 2.57314584372017680e-19, +-4.87992239746859366e-15, + 3.32234862170729250e-16, + 1.15848037972245938e-15, + 6.50071055430034839e-16, +-1.99520192001405416e-15, + 1.63209365363083368e-15, + 2.10742380319764828e-18, +-6.81578037298576775e-16, + 2.24511105295276920e-16, + 5.99773762353215980e-17, +-1.35930795571237652e-17, +-5.72790794584378222e-18, +-1.88542948895698987e-18, + 5.76387525433460497e-19, + 1.99971739461628994e-19, + 1.82729872015821330e-18, + 1.04012640213406548e-18, + 1.00004267458412343e-18, + 7.01985190934053086e-19, +-6.51397787896279161e-20, + 1.14358426907600119e-18, + 1.80603364141615655e-19, + 6.78207774832958567e-19, + 2.56143281837447331e-19, + 5.93904973884770652e-19, + 1.25325466991312109e-18, + 4.19509554768990772e-19, + 1.71170711220698675e-18, + 8.48669697004981701e-19, + 3.26138784271981665e-19, +-3.22725830735753179e-19, + 6.85511555900148512e-19, + 6.37105779413980441e-19, + 9.48696726723258218e-20, + 5.93561378877155674e-19, +-6.32010624179663406e-20, +-4.91152216031612194e-19, + 2.27297442102356496e-20, + 3.66076055530522627e-19, + 4.37774861144027526e-19, + 1.32372085422401329e-16, + 6.45889674883174077e-17, +-3.98625146521218463e-18, +-3.56454756168958456e-17, +-3.55893898000919490e-17, + 9.47192397147568602e-17, +-9.55418221864219478e-17, + 3.82953426225976698e-17, +-2.10019501022381046e-19, +-4.97161280767114493e-18, +-4.12329116516442326e-18, +-1.58941544177711780e-18, +-5.67590302058874216e-19, + 2.28743609785772730e-18, + 3.43456440340380324e-18, + 1.99906233649369672e-18, + 2.01279051014536466e-18, + 1.73470248590169094e-18, + 1.24287924503512119e-18, + 1.26615237978672631e-18, + 2.11742919479810997e-18, + 4.00614668603776065e-19, + 7.02770713331189760e-19, + 8.79111484446395436e-19, + 3.15460223856332456e-19, + 8.77748288565407938e-19, + 3.61085615167673486e-19, + 1.37441052324109803e-18, + 1.16677717166682409e-18, + 8.35375048172065886e-19, + 2.39942200977890483e-19, + 1.55321424205566183e-19, + 8.94359671884596383e-19, + 6.15971387614864389e-19, +-8.09413759826045111e-20, +-9.82709105176994489e-20, +-1.01935223156375873e-19, + 4.79986562969936305e-19, + 1.73964333310762250e-19, + 4.12529651433412322e-19, +-1.49206928882767421e-17, +-9.99563134581835964e-18, + 1.07689027396424304e-18, +-4.75326775695926457e-18, + 3.57514117679823377e-18, +-8.97220388463307879e-18, + 2.43762165481118541e-18, + 1.22424235846995944e-19, + 5.03184038932518993e-21, + 5.88211176934447516e-19, +-2.82655663589623855e-18, +-2.46565318356488017e-18, + 4.50935030811776534e-19, +-4.80942397196090308e-19, +-2.25527152142446773e-19, + 4.70032798150010065e-19, +-5.78405287702097930e-20, +-2.12164822677544079e-19, + 1.36320810227826771e-20, +-4.04415710775513031e-19, +-1.38974102842098529e-19, +-6.26669391938357061e-19, +-2.70851705362663757e-19, + 2.27578121860460503e-19, +-3.69790167612726998e-19, + 9.11249807805002995e-20, + 5.22697584362605196e-19, + 1.21900916159691908e-18, + 4.22761639302309156e-20, + 1.07740244905799190e-18, + 8.95627760405050117e-19, + 7.31420110551616176e-19, + 6.51665166403139226e-19, +-4.09882617471016033e-19, + 6.67019148475639358e-19, + 1.07485952586922524e-19, +-2.06085982839486327e-19, + 1.80327745367436191e-19, +-8.04157738825060231e-20, + 3.77880716771241318e-19, +-7.89456205518043169e-18, +-1.38514390935022482e-17, +-8.04744784529907988e-18, +-3.85207427177481004e-18, +-4.80303319779152064e-18, +-3.85922074861134184e-18, +-3.78950948951268112e-19, +-3.54459720303474287e-18, +-9.84334406686350668e-19, +-2.61951157259318489e-19, +-1.03147020413341787e-18, + 3.01664889858428628e-19, + 3.89272717991506004e-19, +-1.25166011776721638e-18, +-2.14112845764463904e-18, + 2.76812449366082268e-19, +-1.74765368113156070e-19, +-1.12229567151442331e-18, +-4.53040906538634430e-19, + 2.89372149123679646e-19, +-1.11741954553870833e-18, +-1.31184295429999375e-19, +-5.25148997112418338e-19, +-4.03325683603467618e-19, +-3.46450750228659560e-19, +-7.28904910768575901e-19, +-9.56212349495025775e-19, +-1.36594704267798738e-18, +-1.07420723242311934e-18, +-1.18867471038689578e-18, +-1.12422977038149363e-18, +-6.13651235069334390e-19, +-6.08020390786465270e-20, +-7.35898914585923012e-19, +-4.79980770562321925e-19, +-4.31972873010502469e-19, +-6.13632619930997563e-19, +-3.22883658907734084e-19, +-4.62124404012772473e-19, +-7.57061767259833249e-19, + 2.34376370869577993e-01, + 1.39851391797057134e-01, + 9.80784913736020281e-02, + 7.67115149641986599e-02, + 6.45307088977691151e-02, + 5.69613172372102350e-02, + 5.18492015027454331e-02, + 4.80894846705307230e-02, + 4.51205242457393199e-02, + 4.26646657437018337e-02, + 4.05765245660536511e-02, + 3.87691466972856363e-02, + 3.71839809021782194e-02, + 3.57787613871211399e-02, + 3.45217877804406548e-02, + 3.33886858386465354e-02, + 3.23603517765708379e-02, + 3.14215694625094855e-02, + 3.05600483315935402e-02, + 2.97657374888520461e-02, + 2.90303267329948232e-02, + 2.83468770938966712e-02, + 2.77095429291995370e-02, + 2.71133599124433813e-02, + 2.65540812071427858e-02, + 2.60280493942957186e-02, + 2.55320952815906409e-02, + 2.50634571698020794e-02, + 2.46197158610141249e-02, + 2.41987419046956302e-02, + 2.37986524479543333e-02, + 2.34177756894285993e-02, + 2.30546214022405542e-02, + 2.27078563380823696e-02, + 2.23762835849932139e-02, + 2.20588251489655732e-02, + 2.17545071807082845e-02, + 2.14624473855377466e-02, + 2.11818442450604320e-02, + 2.09119677503383575e-02, +-7.00354619432293907e-02, +-2.90408237754851244e-02, +-1.41287534805940706e-02, +-7.74586656968001379e-03, +-4.64938886258903141e-03, +-3.02434065737152737e-03, +-2.14236053823799481e-03, +-1.64485995873041367e-03, +-1.33751570286062501e-03, +-1.12544344102996977e-03, +-9.67045452507221182e-04, +-8.43308064309308933e-04, +-7.44022415638350885e-04, +-6.62826586852766943e-04, +-5.95402568265543971e-04, +-5.38684907264885935e-04, +-4.90435055024602716e-04, +-4.48982668738874666e-04, +-4.13058501823316572e-04, +-3.81682608585573425e-04, +-3.54087626772640299e-04, +-3.29665002089229704e-04, +-3.07926583406822614e-04, +-2.88476732272709775e-04, +-2.70991759381782927e-04, +-2.55204553257569401e-04, +-2.40892944957331795e-04, +-2.27870798793365138e-04, +-2.15981117758663678e-04, +-2.05090655630932225e-04, +-1.95085668193302480e-04, +-1.85868534435042909e-04, +-1.77355048462744775e-04, +-1.69472233048945992e-04, +-1.62156562215971909e-04, +-1.55352507030007836e-04, +-1.49011338634464193e-04, +-1.43090137408379529e-04, +-1.37550968349469982e-04, +-1.32360191314793583e-04, + 8.40156983338891106e-03, + 2.84463642975602525e-03, + 1.14658788649691658e-03, + 5.31348346022506501e-04, + 2.72074510751212615e-04, + 1.46231620675138730e-04, + 8.04870228176441402e-05, + 4.73277762962276340e-05, + 3.11373165951508762e-05, + 2.25766993977302877e-05, + 1.73444575645329162e-05, + 1.37674961153563284e-05, + 1.11667334014033009e-05, + 9.20947168136035636e-06, + 7.70159232494161411e-06, + 6.51812122346620177e-06, + 5.57445959077326390e-06, + 4.81155174687630968e-06, + 4.18720039850859021e-06, + 3.67065365684452984e-06, + 3.23910821398512227e-06, + 2.87539051471441610e-06, + 2.56638494254505629e-06, + 2.30194746087255123e-06, + 2.07414151482372493e-06, + 1.87669198419234964e-06, + 1.70458925767770518e-06, + 1.55379831214345040e-06, + 1.42104231587392042e-06, + 1.30363983633239604e-06, + 1.19938108577696977e-06, + 1.10643292470060393e-06, + 1.02326527756536564e-06, + 9.48593650924236035e-07, + 8.81333873907355019e-07, + 8.20566197106031919e-07, + 7.65506615754314689e-07, + 7.15483812796599344e-07, + 6.69920505494227616e-07, + 6.28318266134898216e-07, +-8.18852556738254686e-04, +-2.32815099651353507e-04, +-7.91328509130065334e-05, +-3.13602069921645429e-05, +-1.43841647713922293e-05, +-7.42424861416767987e-06, +-3.84994317581219850e-06, +-1.87818418937615908e-06, +-9.40316006083475689e-07, +-5.38506507803368721e-07, +-3.53128272503520765e-07, +-2.51112195214961714e-07, +-1.86446597151943148e-07, +-1.42210478018544689e-07, +-1.10694273039130549e-07, +-8.76331995760920372e-08, +-7.04011933764138663e-08, +-5.72923289794815236e-08, +-4.71619527326232148e-08, +-3.92229677185163168e-08, +-3.29227654889386028e-08, +-2.78661579480345786e-08, +-2.37658190957086096e-08, +-2.04096938709792273e-08, +-1.76391328813487689e-08, +-1.53339555547892319e-08, +-1.34020766835903541e-08, +-1.17721925949692907e-08, +-1.03885523068688722e-08, +-9.20717108800576128e-09, +-8.19305572164946121e-09, +-7.31814866199607598e-09, +-6.55978906855296988e-09, +-5.89954966634604621e-09, +-5.32234976950538812e-09, +-4.81577314343194975e-09, +-4.36953926656776009e-09, +-3.97509043010712674e-09, +-3.62526701212287751e-09, +-3.31405042919812594e-09, + 6.88679973571943533e-05, + 1.68323278186021562e-05, + 4.91933205680164372e-06, + 1.66551273752365601e-06, + 6.34871352231682676e-07, + 2.94810662594455766e-07, + 1.65935895012641359e-07, + 8.53487552552772578e-08, + 3.72184821313771834e-08, + 1.61685590607869513e-08, + 8.21432391007411918e-09, + 4.94353611001254204e-09, + 3.29245816100909717e-09, + 2.30960569918214267e-09, + 1.67111882737270736e-09, + 1.23717690890597728e-09, + 9.33578512835221289e-10, + 7.16303738031132103e-10, + 5.57761570111928300e-10, + 4.40074514612248038e-10, + 3.51362917804106680e-10, + 2.83560779495037422e-10, + 2.31085462890847804e-10, + 1.90005628089348749e-10, + 1.57508867903971078e-10, + 1.31554089202533883e-10, + 1.10640321021724118e-10, + 9.36502788541875296e-11, + 7.97429107301095463e-11, + 6.82784808487649444e-11, + 5.87656691671496742e-11, + 5.08237199900521263e-11, + 4.41550728091577408e-11, + 3.85253510728707020e-11, + 3.37485772002283333e-11, + 2.96761495830187719e-11, + 2.61885514996655246e-11, + 2.31890715895036176e-11, + 2.05989892510791783e-11, + 1.83538729440584567e-11, +-5.15074722410949581e-06, +-1.10215042524473097e-06, +-2.81725061183280300e-07, +-8.50075550064248803e-08, +-2.81957055334456024e-08, +-9.32660353251305767e-09, +-4.78717121334414391e-09, +-3.25411513031482282e-09, +-1.61070032373281486e-09, +-6.22165111598061106e-10, +-2.38965262364556405e-10, +-1.10050320543312351e-10, +-6.17191292668262117e-11, +-3.89081371397372835e-11, +-2.60002413754533066e-11, +-1.79725416207285651e-11, +-1.27347676056015864e-11, +-9.21167336631596591e-12, +-6.78485745085231831e-12, +-5.07862681872445850e-12, +-3.85700132340087346e-12, +-2.96790292209061230e-12, +-2.31114312979860920e-12, +-1.81941036314711861e-12, +-1.44665934497656026e-12, +-1.16088367285140492e-12, +-9.39482407639334987e-13, +-7.66292313222512964e-13, +-6.29595193118557882e-13, +-5.20804803369659778e-13, +-4.33545329607358079e-13, +-3.63047896925888925e-13, +-3.05705970710757186e-13, +-2.58766824984956715e-13, +-2.20111291119048940e-13, +-1.88096941099308415e-13, +-1.61442963075023443e-13, +-1.39140207334578574e-13, +-1.20386830739992987e-13, +-1.04550332945153597e-13, + 3.48938170754228344e-07, + 6.63947608204947130e-08, + 1.49545703989876394e-08, + 3.98445492143619340e-09, + 1.30340928279009969e-09, + 3.90171380045546067e-10, + 7.23212177811453104e-11, + 7.05227081144202156e-11, + 5.80227582342015010e-11, + 2.57757297682658596e-11, + 8.78885324679474451e-12, + 3.04808125750968075e-12, + 1.30093772966362855e-12, + 6.90160861786525473e-13, + 4.15730659018221829e-13, + 2.66486994454489785e-13, + 1.77011077171112636e-13, + 1.20666580579520283e-13, + 8.40634464531125611e-14, + 5.96965178128264898e-14, + 4.31233674431848742e-14, + 3.16380326470706161e-14, + 2.35414589287825769e-14, + 1.77447842274782708e-14, + 1.35354654799371205e-14, + 1.04344277811734486e-14, + 8.12477534764666335e-15, + 6.38663411910239724e-15, + 5.06471524596451031e-15, + 4.04686199872946071e-15, + 3.25858114907673769e-15, + 2.64214146310611626e-15, + 2.15621557450365164e-15, + 1.77047478331189059e-15, + 1.46203111538739994e-15, + 1.21427877737676682e-15, + 1.01348304391836412e-15, + 8.50252898382052330e-16, + 7.18054092169608837e-16, + 6.07251730142021331e-16, +-2.16762190410586006e-08, +-3.71773341505571863e-09, +-7.50947200621619524e-10, +-1.73739849794035662e-10, +-4.87922295015659932e-11, +-2.09802286196428134e-11, +-3.02260439711562704e-12, + 5.58285548100802394e-13, +-1.18157161326172036e-12, +-9.16047982018184788e-13, +-3.48028281718436409e-13, +-1.05776292301762991e-13, +-3.38667553774845487e-14, +-1.36787203563908208e-14, +-6.96043903958598936e-15, +-4.03733132049178322e-15, +-2.49724314536426890e-15, +-1.60189732441112337e-15, +-1.05531403227298994e-15, +-7.10105134037129794e-16, +-4.87798183179203116e-16, +-3.43461546911237195e-16, +-2.43554469347146620e-16, +-1.75266123278597844e-16, +-1.26228633845622545e-16, +-9.51080273845816293e-17, +-7.12635780690038377e-17, +-5.39700027331691503e-17, +-3.95685330275515998e-17, +-3.08806781701700061e-17, +-2.37897478626033630e-17, +-1.89834241782804299e-17, +-1.49962319559636335e-17, +-1.20427335956275413e-17, +-9.78687691199640493e-18, +-7.54029449101875103e-18, +-6.15265760504732773e-18, +-4.53479718737971456e-18, +-2.27270172989394597e-18, +-2.79306862402303727e-18, + 1.24579321412702796e-09, + 1.94637901367885769e-10, + 3.56636986389275126e-11, + 7.63483311762240144e-12, + 1.55917031683593404e-12, + 6.24587765096811645e-13, + 3.71945704528824645e-13, +-5.84902601200982187e-14, +-1.87065684520745693e-14, + 2.11323880385678796e-14, + 1.22989411118125783e-14, + 3.98451725791833650e-15, + 1.09867910120568899e-15, + 3.31735759982073054e-16, + 1.27725880766241018e-16, + 6.63773313790643673e-17, + 3.65354102202002652e-17, + 2.18306660075653118e-17, + 1.32822445698313146e-17, + 9.14976199555281561e-18, + 5.87093754963841638e-18, + 2.19344129131197702e-18, + 1.92157640063388569e-18, + 2.56519055735481664e-18, + 2.97184138423117701e-18, + 7.76081967175252833e-19, + 1.42545077047531400e-19, + 6.51207928283028195e-20, + 1.59778247759896277e-18, +-5.37561467234472743e-19, + 2.23598398838731352e-19, + 1.40446334333003273e-18, +-1.77517993945152957e-19, + 4.11568878635723334e-19, +-3.77873457719252449e-19, +-1.25075339537394547e-19, +-1.05645281962869737e-19, + 1.29113486480829413e-19, + 1.17212593456189956e-18, + 2.21557838846791017e-20, +-6.66831349923674782e-11, +-9.59147417369422564e-12, +-1.59529991111482874e-12, +-3.17112463779909786e-13, +-7.30959662130986120e-14, + 7.76479349108681610e-16, +-1.67020539374018174e-14, +-3.34345790313338952e-15, + 2.32836280050455634e-15, + 6.41597039956616844e-17, +-3.23455689154521632e-16, +-1.36542634013674899e-16, +-3.97506961354628413e-17, +-8.18195398867337122e-18, +-2.61244482489872738e-18, +-3.08931376544044704e-19, + 1.00886269724727502e-18, +-6.86986801573683439e-19, +-4.71235117205937485e-19, + 3.82991397467054381e-19, +-3.99087809289166044e-19, +-1.24043191046266634e-18, + 5.26049946903356099e-20, +-5.74863015579306440e-19, + 1.43465927472070253e-18, + 1.17802784156155150e-19, + 6.89656627388441699e-20, + 8.64202529442089559e-19, + 1.55233833544398427e-18, + 6.54329303192633850e-19, + 1.37306257716456477e-18, + 9.76468356243820092e-19, + 9.09477322818710725e-19, +-2.68071419873719015e-19, +-9.56258613614950109e-20, + 2.89899147976697007e-19, + 2.97214731613215064e-19, +-1.10071025911463997e-19, + 1.30348085491047196e-18, + 5.27868471156171972e-19, + 3.34076433295006202e-12, + 4.46843828543949442e-13, + 6.83749951395393271e-14, + 1.17439314884513710e-14, + 3.25279037132749403e-15, + 2.05309286933327791e-16, +-1.71003313137872103e-16, + 4.14291785237484403e-16, +-4.72424616372232703e-17, +-3.18332259049164664e-17, + 2.68987079702505615e-18, + 6.36260690351589101e-18, + 2.24517377567166616e-18, + 1.64153960928455677e-19, +-1.76233622769127425e-18, + 3.55501103444358080e-19, + 5.37697877781516873e-20, + 9.57424747735725821e-19, +-6.73661979328857710e-20, + 6.36811101380304175e-19, + 5.61836091155512287e-19, +-8.44601220013045416e-19, +-2.29529966201509223e-19, + 1.14625265492435730e-19, + 1.13116428649824900e-18, +-1.64391603561132007e-19, +-5.31641176440848947e-19, + 2.71148967447143476e-20, + 7.60001790415122109e-19, + 1.45059902737042685e-20, + 8.18716259175924880e-19, + 8.75555563829774329e-19, + 2.71585310193371589e-21, + 2.26926771971586547e-19, + 5.46882335223039306e-20, + 4.02392561027431550e-19, + 2.45195180188397193e-19, + 4.98418844123292484e-19, + 7.16151516068836907e-19, + 1.03209253735332834e-18, +-1.57321984970460625e-13, +-1.97155788264013359e-14, +-2.80942410915757174e-15, +-4.56335783993229390e-16, +-6.12417892752627340e-17, +-7.40751320923556110e-17, + 3.60293822779238442e-17, +-1.56514417853489610e-17, +-3.68310328398671280e-18, + 1.29608233554374682e-18, + 7.36286468949023379e-19, + 1.10792939020406790e-18, + 5.27872143495697236e-19, + 5.19989851705797550e-19, + 1.37572179263634332e-18, + 6.89691904495460131e-19, + 1.15040511788176568e-18, + 3.33268642816958901e-19, + 1.94579704470707990e-19, + 5.06497873080390610e-19, +-7.52054682159290410e-20, +-1.65912303015537737e-19, + 1.56370990889491742e-19, + 8.97763866861364474e-19, + 8.63545536281023243e-19, + 4.65032744547191901e-19, + 5.48111020625725957e-19, + 7.23111179364405798e-19, + 2.27531204987206112e-18, + 6.51347420348643306e-19, + 2.47360600081807325e-19, + 1.33058347160904146e-18, + 4.14858823862540611e-19, +-1.31197485357581795e-19, + 3.96587571819158413e-20, +-7.59227913759081157e-20, + 2.51526997092258445e-19, + 2.36699817125201078e-19, + 3.10600803271791063e-19, +-8.75872753488384702e-20, + 6.97881028378156119e-15, + 8.14270123193097228e-16, + 1.02732274075054553e-16, + 1.81387116550133035e-17, + 4.12201247314845530e-18, + 4.52471188133889322e-19, + 9.05398028219482931e-21, +-1.16710680380999241e-18, +-5.68175329304542267e-19, + 4.99773660913692743e-19, +-3.25053920180695961e-19, + 1.15561796131892785e-18, + 1.02667951463561551e-18, + 6.05342358527458771e-19, +-2.03093684453727874e-18, + 2.03899800366697476e-18, +-1.29629752973578042e-19, +-1.05486986825745563e-19, +-1.11653679434480232e-18, +-4.45895533780800587e-19, + 3.58528213035233218e-20, +-1.09631674669803876e-18, +-2.04076850327368587e-19, +-9.98339637715958165e-20, + 2.66390400870996637e-19, +-4.82127752510812963e-19, + 7.97259429801182051e-19, + 9.25905993029468250e-19, + 8.25115908525318318e-19, + 6.42770858243328869e-19, + 2.46599960161198526e-19, + 2.93653634122657702e-19, + 7.41365812713422592e-19, + 8.25445572684121830e-19, + 7.86246152283444776e-19, + 3.30148670791129845e-19, + 7.90571971224047119e-19, +-2.68537645211229253e-19, + 5.53754661096548904e-19, + 7.78838703001221111e-19, +-3.21262671068954579e-16, +-4.96011689657703443e-17, +-1.05107685813314795e-17, +-4.71691687390584911e-18, +-3.30965745651531116e-18, +-2.25668162367260672e-19, +-1.72262658830125959e-18, +-6.04572509744940014e-19, +-4.10711658518605940e-19, + 1.02996695900951301e-18, + 3.06879426731464225e-19, + 1.48753560775851173e-18, +-9.94000194564542458e-20, +-4.32137231151388758e-19, +-1.06845585871615784e-18, +-6.06196437404475516e-19, + 4.27979945731548156e-19, +-1.76841982838676906e-18, +-4.21765556701631750e-19, +-7.79413041784331252e-19, +-5.13090474881445913e-19, + 3.58780759610519042e-20, +-1.17486740475098707e-18, +-1.93378331202025632e-19, + 3.73928792254588249e-19, +-3.32850193196798730e-19, +-6.84385482429941169e-19, +-3.57505158956220616e-19, +-5.15721249175494181e-19, +-4.99286357804523770e-20, +-3.45881233537163672e-19, +-7.25949340870113389e-19, + 7.05956271884263555e-21, +-2.32338177127025915e-19, +-3.78622424964102229e-19, +-4.94695194966970982e-19, +-4.95450533902569841e-19, +-8.02142858166610692e-19, +-1.62298218570744261e-19, +-1.69077982847935603e-19, +// root 3 + 2.95093773829068658e-02, + 2.29086842939089375e-02, + 1.82687240938607595e-02, + 1.48895382110945038e-02, + 1.23547002250403784e-02, + 1.04142481366486343e-02, + 8.91591390940721373e-03, + 7.75488172822108926e-03, + 6.84731910846250822e-03, + 6.12611987985011482e-03, + 5.54159227423453755e-03, + 5.05880933474657426e-03, + 4.65343552602570047e-03, + 4.30824525270034550e-03, + 4.01075820935581882e-03, + 3.75172078982711913e-03, + 3.52412804041288838e-03, + 3.32257978049592092e-03, + 3.14284583380467939e-03, + 2.98156535088229743e-03, + 2.83603434469525571e-03, + 2.70405264948261805e-03, + 2.58381177261218092e-03, + 2.47381143243885883e-03, + 2.37279657008433341e-03, + 2.27970920473588492e-03, + 2.19365120504721794e-03, + 2.11385519375426696e-03, + 2.03966158505033274e-03, + 1.97050029757961896e-03, + 1.90587606864529011e-03, + 1.84535656844961793e-03, + 1.78856271063908344e-03, + 1.73516069976611259e-03, + 1.68485546291851892e-03, + 1.63738519234086556e-03, + 1.59251678580316905e-03, + 1.55004201700550547e-03, + 1.50977430318584922e-03, + 1.47154596402297310e-03, +-3.93910540179882081e-03, +-2.72200067306971587e-03, +-1.95288147828466606e-03, +-1.44725227641472661e-03, +-1.10015853923690920e-03, +-8.47849389543019931e-04, +-6.55758731497996716e-04, +-5.09639247789986220e-04, +-4.01430936822002281e-04, +-3.22333046702655149e-04, +-2.63981748415923736e-04, +-2.20044033057901383e-04, +-1.86210743607714596e-04, +-1.59619233502998381e-04, +-1.38343122607430312e-04, +-1.21054748641819134e-04, +-1.06816285745491506e-04, +-9.49502323864247368e-05, +-8.49572966023795587e-05, +-7.64629635552285943e-05, +-6.91818597086839629e-05, +-6.28934501983735442e-05, +-5.74251297890432415e-05, +-5.26402439453680943e-05, +-4.84294629574317560e-05, +-4.47044777529369134e-05, +-4.13933296977889284e-05, +-3.84369076620437539e-05, +-3.57862904305915222e-05, +-3.34007090876909814e-05, +-3.12459694180630186e-05, +-2.92932193445456925e-05, +-2.75179777735154106e-05, +-2.58993633517045327e-05, +-2.44194774482966115e-05, +-2.30629070956051897e-05, +-2.18163219553408723e-05, +-2.06681455184815752e-05, +-1.96082853134347222e-05, +-1.86279103223773506e-05, + 1.91521291751772262e-04, + 1.18761221595625947e-04, + 7.67228298685728962e-05, + 5.15227121101841532e-05, + 3.63973028692040788e-05, + 2.72956360958950311e-05, + 2.09505562894438926e-05, + 1.57129758624967315e-05, + 1.15051924317411544e-05, + 8.42517239536945730e-06, + 6.27761622613094879e-06, + 4.78401813404997514e-06, + 3.72543512127207013e-06, + 2.95688802469353976e-06, + 2.38593061364086288e-06, + 1.95300348682164644e-06, + 1.61880020099987957e-06, + 1.35670881725807185e-06, + 1.14828130630046613e-06, + 9.80455584037997052e-07, + 8.43806726393279004e-07, + 7.31418095465968593e-07, + 6.38135789580640549e-07, + 5.60065986900464642e-07, + 4.94229659616509522e-07, + 4.38321327784063585e-07, + 3.90537871182020083e-07, + 3.49455316283320143e-07, + 3.13938986783324362e-07, + 2.83077188298541773e-07, + 2.56131713109922190e-07, + 2.32500513515527471e-07, + 2.11689278838086201e-07, + 1.93289596207044944e-07, + 1.76962027892579112e-07, + 1.62422894193887334e-07, + 1.49433873445584781e-07, + 1.37793761229287004e-07, + 1.27331897265069341e-07, + 1.17902889703240583e-07, +-7.96163842676507275e-06, +-4.51003659673662834e-06, +-2.66862918088252122e-06, +-1.61324516282989387e-06, +-9.57291226348562811e-07, +-6.04653842906736665e-07, +-4.74230739579531855e-07, +-3.97028067221719323e-07, +-3.02593421344512950e-07, +-2.13736207524502321e-07, +-1.47996593311314656e-07, +-1.03785412553534044e-07, +-7.44974648599358375e-08, +-5.47700176731552172e-08, +-4.11481520566576908e-08, +-3.15081476513531731e-08, +-2.45328954599697061e-08, +-1.93855099027012310e-08, +-1.55201494822935660e-08, +-1.25720101070208343e-08, +-1.02918567716743144e-08, +-8.50601181290638229e-09, +-7.09127323599666009e-09, +-5.95882325315419902e-09, +-5.04368501202190061e-09, +-4.29768103885621112e-09, +-3.68464750096688534e-09, +-3.17712910595805363e-09, +-2.75406269359918784e-09, +-2.39913153721724903e-09, +-2.09958134382468347e-09, +-1.84535841382347930e-09, +-1.62847543312098415e-09, +-1.44254001495230273e-09, +-1.28240087785156031e-09, +-1.14387993021747890e-09, +-1.02356770205599495e-09, +-9.18665906194960054e-10, +-8.26865368365617060e-10, +-7.46250715027814013e-10, + 2.92583539105120035e-07, + 1.53754272867994070e-07, + 8.44028028216671440e-08, + 5.13198928637832795e-08, + 3.12797756024488458e-08, + 1.34506094743910495e-08, + 4.89199024280311286e-09, + 5.39561954889942243e-09, + 6.05238346221536406e-09, + 4.88257767116628793e-09, + 3.36903118576374093e-09, + 2.22889577546818828e-09, + 1.48592514317472241e-09, + 1.01391302548275687e-09, + 7.09563818011993858e-10, + 5.08315029500522544e-10, + 3.71794212498100239e-10, + 2.76992185448623944e-10, + 2.09770038541891679e-10, + 1.61206114932169734e-10, + 1.25529119955750323e-10, + 9.89204909548180234e-11, + 7.88016546335264128e-11, + 6.33989127539860118e-11, + 5.14715333401201410e-11, + 4.21381785117059446e-11, + 3.47639198053437732e-11, + 2.88853793860736113e-11, + 2.41603039976317187e-11, + 2.03330836852597374e-11, + 1.72108396220097457e-11, + 1.46466243945749769e-11, + 1.25274754691490495e-11, + 1.07658237470049293e-11, + 9.29324804933799570e-12, + 8.05589199941979688e-12, + 7.01106667586968311e-12, + 6.12471164900771830e-12, + 5.36948213903800611e-12, + 4.72329517769068517e-12, +-9.50562247248419889e-09, +-4.84340712144256775e-09, +-2.34306777825534197e-09, +-1.15689347927371652e-09, +-9.50584148591649650e-10, +-7.38694597158896376e-10, +-1.22418911395486787e-10, + 8.12454151733598925e-11, +-2.37699281586588148e-11, +-7.79695413502333540e-11, +-6.81843583009708801e-11, +-4.61062829318653553e-11, +-2.93221423726725547e-11, +-1.87186555942042593e-11, +-1.22281742765358592e-11, +-8.19947961137258301e-12, +-5.63437058313230773e-12, +-3.95781775577777550e-12, +-2.83524544179280672e-12, +-2.06708458050070375e-12, +-1.53107059627430925e-12, +-1.15039369671894713e-12, +-8.75682213542414104e-13, +-6.74532815071622596e-13, +-5.25274727751271424e-13, +-4.13159186812420620e-13, +-3.27990629488605481e-13, +-2.62615776170014897e-13, +-2.11948600040807404e-13, +-1.72326571340858544e-13, +-1.41081813556440683e-13, +-1.16250337023854087e-13, +-9.63708165414561790e-14, +-8.03461893346645624e-14, +-6.73458419559500597e-14, +-5.67343942012159559e-14, +-4.80231212109117511e-14, +-4.08331144648617677e-14, +-3.48681077321787381e-14, +-2.98952945942166199e-14, + 2.58419250607699292e-10, + 1.39688815830943669e-10, + 7.44072844887589234e-11, + 2.53684727431045069e-11, +-3.18073955770060952e-13, + 2.19436849764418947e-11, + 2.08811118963823696e-11, +-1.76834831584999168e-12, +-4.26671987963028095e-12, +-4.68144623407937639e-13, + 8.96974865525291461e-13, + 8.43873718740730916e-13, + 5.57356135035725509e-13, + 3.41937915520493791e-13, + 2.10164172960499738e-13, + 1.32180687041351212e-13, + 8.53750508563907493e-14, + 5.65500570056935613e-14, + 3.83209675414306154e-14, + 2.65055035915954955e-14, + 1.86745843741197352e-14, + 1.33787381551397038e-14, + 9.73090198298933165e-15, + 7.17674865689962593e-15, + 5.36021146284683188e-15, + 4.05102432072586653e-15, + 3.09442462790160737e-15, + 2.38769115847380593e-15, + 1.85945659863823701e-15, + 1.46049806369477453e-15, + 1.15654154458695497e-15, + 9.22692461568800347e-16, + 7.41333793653731621e-16, + 5.99795878111366764e-16, + 4.88003532220811177e-16, + 3.99501712860056401e-16, + 3.28956748499800752e-16, + 2.72231169223871137e-16, + 2.26485420341880379e-16, + 1.89345558955177812e-16, +-5.05016338282908869e-12, +-3.11622460980713498e-12, +-1.85775416829019019e-12, +-1.60353330355660342e-12, + 7.32223176255582495e-14, + 8.76645778099905481e-13, +-8.54833879107896879e-13, +-4.55977882304570191e-13, + 1.32732878261036654e-13, + 9.64136922923323956e-14, + 1.26920028576671551e-14, +-9.68653761645015536e-15, +-9.40380783416849767e-15, +-6.02913899964271323e-15, +-3.57636611358285485e-15, +-2.12556290050360411e-15, +-1.29284304544548766e-15, +-8.07731276037886031e-16, +-5.17862014010624882e-16, +-3.39859871648241970e-16, +-2.27503066119737755e-16, +-1.55369917502218635e-16, +-1.08203844646216664e-16, +-7.62393382715125013e-17, +-5.49106851032920369e-17, +-3.98046667722754192e-17, +-2.92014115687898133e-17, +-2.15466187889742295e-17, +-1.63100312289010500e-17, +-1.23610036982311849e-17, +-9.41241809290353074e-18, +-7.30490952072588539e-18, +-5.62509617451652398e-18, +-4.30278530996298354e-18, +-3.44752554852481204e-18, +-2.79593218064387223e-18, +-2.19257872687185643e-18, +-1.76981786916540867e-18, +-1.41268158063395108e-18, +-1.04093244711487171e-18, +-1.00107957692429625e-16, + 6.86817276828244458e-14, + 1.21102348192141623e-14, + 2.04171208487485595e-14, + 7.19232338213174856e-14, +-4.08611268901145548e-14, +-2.66003844017395820e-14, + 3.03269872475291929e-14, + 4.91137468211131987e-15, +-3.52743467032321501e-15, +-1.47687467759333331e-15, +-1.73126031168677626e-16, + 1.00594832812400287e-16, + 9.55111604315264997e-17, + 5.90485172066813514e-17, + 3.38339940388763907e-17, + 1.96460603108768417e-17, + 1.16521367217361368e-17, + 7.13209275776042922e-18, + 4.49946592011753295e-18, + 3.00195094535321187e-18, + 1.89702323990014470e-18, + 1.17371177617467640e-18, + 8.50394549039969298e-19, + 4.41281997534729686e-19, + 3.58153541719109965e-19, + 6.92110124681362716e-20, + 2.04991177174714503e-19, + 1.23901129162428780e-19, + 5.11558973034383588e-20, + 5.57503229624162216e-20, +-1.97552133964026957e-20, + 9.30436039136626057e-21, + 7.21750825456728122e-20, +-1.32960095833892221e-21, +-6.67142015528329316e-20, + 7.79888183441605791e-20, +-3.34220365982056773e-20, + 6.31775022851865647e-21, + 5.73012207713736230e-20, + 7.76952856045746765e-15, +-1.33370901720675566e-15, +-1.07265878794193544e-15, + 1.63752219099030347e-15, +-5.27362243703260430e-16, +-3.29565182308894451e-15, + 2.94452214821410409e-15, +-2.19796003877595808e-16, +-5.94801303146037031e-16, + 1.01495349880956911e-17, + 5.86963296072643706e-17, + 1.69931497101759512e-17, + 1.50977937739501686e-18, +-7.19461406856856693e-19, +-6.96597956480665684e-19, +-5.16291278651408563e-19, +-2.00515987362809218e-19, +-5.92241627694587809e-20, +-3.23689498437995278e-20, +-2.01400847658105424e-20, + 9.42474782479768479e-20, + 9.84099292046616672e-20, +-7.70782216880005212e-20, + 6.24621153707740125e-20, +-2.33154858177130700e-19, +-3.30517555036543151e-20, + 2.02650084378534002e-20, + 6.89001664931161713e-20, + 7.57975943595480481e-20, + 5.34550446768995886e-20, +-9.10108674951792341e-21, + 1.10251391626656037e-20, + 6.45556160969778855e-20, + 1.41640718353914007e-19, + 5.58810498877213408e-20, +-1.16061818462804808e-20, + 5.51332347113173951e-20, + 1.54935883759425489e-20, + 5.09117467190915023e-20, + 8.31376524135150020e-20, +-4.67417846171431627e-16, +-6.32256448457014340e-17, + 5.25385856979904967e-17, + 5.93885087933140222e-17, +-1.80574886850533382e-16, + 1.51184726878326094e-16, + 9.65385388942061067e-18, +-6.74179993451878216e-17, + 2.16751610679284449e-17, + 5.98643160005203366e-18, +-8.59661258382722348e-19, +-5.68495115143659821e-19, +-9.60294867715309980e-20, + 8.62578887793689945e-20, + 1.11812241384833967e-19, + 1.35763930729711163e-20, + 8.66450405585021134e-20, + 9.68364270677299054e-20, + 1.14833290408975179e-19, + 1.74102505059679803e-19, + 1.28633455455205244e-19, + 2.04950489589165106e-19, + 6.37501821791324385e-20, + 8.64764499722078136e-20, +-1.02562763289360287e-19, + 6.47099198613883593e-21, +-3.74032525317583560e-20, + 4.29524108950622778e-20, + 4.81405019214271513e-20, + 7.71082457296907699e-21, + 2.02668392286915566e-20, +-3.20919754009775118e-20, + 3.22052112194926338e-20, + 9.32695021772188836e-20, + 1.22733953267684865e-20, +-1.83019821333751842e-21, + 1.69317774789400934e-20, +-1.43601369639795591e-20, + 5.29936420510576090e-20, + 4.79345590419792112e-20, + 1.49532692404283211e-17, + 4.84938058258727111e-18, + 2.23028972712554438e-18, +-2.54373235361290694e-18, +-3.06634138615817908e-18, + 9.62498634118993575e-18, +-9.07313848824960132e-18, + 2.96299576570444232e-18, + 1.29682949798192707e-19, +-6.31815045481646238e-19, +-9.57189156655256029e-20, +-5.16467377984789492e-20, +-2.50323446975937446e-19, + 2.98257971315436516e-19, + 2.80192651137635942e-19, + 1.32665225919672821e-19, + 2.43422882562476018e-19, + 2.11151892542678342e-19, + 2.37660778423311876e-19, + 1.76885523375232783e-19, + 1.90022529381967557e-19, + 1.86689818472537776e-19, + 4.99772018487669942e-20, + 1.43596281244241552e-19, + 6.93843762164308966e-22, + 8.88658118483282093e-20, +-1.67716872714809053e-20, + 1.14785583962426080e-19, + 9.62947831421098953e-20, + 8.41956376954023238e-20, + 6.05465527350774656e-20, + 1.35009930587452578e-20, + 7.83738475656908167e-20, + 1.33202387577755850e-19, +-1.73364737431983763e-20, + 1.27498555344069217e-20, + 5.08099300970018822e-20, + 3.74240069610860813e-20, + 5.79805279168382873e-20, + 6.55426244291746095e-20, +-5.50025919609878542e-19, +-4.70301524338092314e-19, + 6.69276638164179261e-19, +-8.18224722201708967e-19, + 1.02611100012346886e-19, +-7.42675828146966178e-19, +-1.37341153054804914e-19, +-2.15629324467354421e-20, +-1.05504786205904755e-19, +-2.17699442004194903e-20, +-6.18740781484110271e-20, + 2.20974937659518873e-20, +-6.08470939719500733e-20, + 4.36127227992456114e-21, +-3.41205502194815800e-20, +-6.30945046080485010e-20, + 3.07318354262016273e-21, + 3.90358186029004530e-20, + 3.12271786533756143e-20, + 1.36337110034887099e-20, + 1.00948493553820745e-19, + 5.58209157698557659e-20, +-2.18105527758691231e-20, + 2.76547963305566878e-20, + 3.20357586882390936e-20, + 3.55731007299962356e-20, + 2.87868784574020487e-20, + 6.35322417584339179e-20, + 7.52016378126195941e-20, + 1.01225920345114405e-20, + 1.27409009501525919e-20, + 5.11926603839652868e-20, + 6.62406823262876682e-20, + 8.66407832914716921e-20, + 2.82688896724647782e-20, + 1.27835654594477244e-20, + 6.54301395590229086e-20, + 8.05575784594779122e-20, + 5.98827600442140125e-20, + 5.60463017593985358e-20, +-3.07737092806751285e-18, +-1.90226760927854228e-18, +-3.02781394314869967e-19, +-4.78314067104796288e-19, +-3.85912762485106537e-19, +-3.61138746906921509e-19, + 2.00465816704676117e-19, +-1.39832643891174141e-19, +-1.19790617546742568e-21, +-1.19308646794279639e-19, + 1.71421780707175554e-20, + 1.80722540613865691e-19, + 1.11734929054312956e-19, +-4.42670558814584621e-20, +-3.58001780328648345e-19, +-1.77304621329840809e-19, +-5.72851733684985879e-20, +-7.86460672320056797e-20, +-2.21647840127864364e-21, +-5.39228874941565564e-20, +-4.11560244019490300e-20, + 3.76516070628195880e-20, +-9.66780611502214165e-20, + 2.03624394776136400e-20, +-5.48555730314121273e-20, +-7.70017863814202165e-20, +-1.14288552719638762e-19, +-2.72364217593210443e-20, +-9.91870961563380990e-20, +-9.32495300701198997e-20, +-1.23139564150192447e-19, +-9.62527611233304487e-20, +-9.09704879831438669e-20, +-4.78422762682528831e-20, +-6.03105803978611300e-20, +-7.30968143824853208e-20, +-5.74332518022588059e-20, +-6.71044716931807767e-20, +-8.31877186773260032e-20, +-1.46768563187401620e-20, + 3.29441171273575306e-01, + 2.77519398460155886e-01, + 2.41421632286564075e-01, + 2.14695080336655741e-01, + 1.93966486515766395e-01, + 1.77370193118970954e-01, + 1.63847586572701986e-01, + 1.52728888571579235e-01, + 1.43498515222271861e-01, + 1.35731795666670291e-01, + 1.29097063432310227e-01, + 1.23348216757587656e-01, + 1.18305072312347478e-01, + 1.13834240763441882e-01, + 1.09835039656215078e-01, + 1.06229946117906954e-01, + 1.02958183051577917e-01, + 9.99713390995269763e-02, + 9.72303104828040748e-02, + 9.47031191309826992e-02, + 9.23633251834047181e-02, + 9.01888515082360509e-02, + 8.81610995216383919e-02, + 8.62642746477079309e-02, + 8.44848650874592128e-02, + 8.28112343414576790e-02, + 8.12332992596673936e-02, + 7.97422731781983057e-02, + 7.83304591404902634e-02, + 7.69910820546306912e-02, + 7.57181514074723450e-02, + 7.45063481705996733e-02, + 7.33509310157119537e-02, + 7.22476580598934714e-02, + 7.11927211900054979e-02, + 7.01826906440622539e-02, + 6.92144680084776920e-02, + 6.82852461611852674e-02, + 6.73924749791807998e-02, + 6.65338318550218744e-02, +-3.14248691107039402e-02, +-2.11408665204856072e-02, +-1.52684941564279839e-02, +-1.16242888215017069e-02, +-9.19717046751684919e-03, +-7.45132585463180973e-03, +-6.10448242472793993e-03, +-5.04080567816151889e-03, +-4.21178714981121707e-03, +-3.57213918904266412e-03, +-3.07525527944203661e-03, +-2.68283790717152061e-03, +-2.36715624457003527e-03, +-2.10885384043756150e-03, +-1.89434107817428553e-03, +-1.71388792935942783e-03, +-1.56037555297840560e-03, +-1.42849002611024540e-03, +-1.31419315633594523e-03, +-1.21436714155167885e-03, +-1.12657053142238973e-03, +-1.04886714054586226e-03, +-9.79703859946359518e-04, +-9.17821920359838993e-04, +-8.62191467013556732e-04, +-8.11962654007076417e-04, +-7.66428625282892183e-04, +-7.24997168730904151e-04, +-6.87168780306775403e-04, +-6.52519521820889184e-04, +-6.20687502958095177e-04, +-5.91362131238965232e-04, +-5.64275495923548362e-04, +-5.39195411564806991e-04, +-5.15919762954454922e-04, +-4.94271878399557855e-04, +-4.74096721435348116e-04, +-4.55257738348751370e-04, +-4.37634234564611500e-04, +-4.21119180096988014e-04, + 1.71858027590337365e-03, + 9.40191427617570095e-04, + 5.64256671764202925e-04, + 3.63992794010197646e-04, + 2.52195517642109061e-04, + 1.89288513201345645e-04, + 1.49294434333299616e-04, + 1.17371933473132964e-04, + 9.07205306748307512e-05, + 7.00653538430069791e-05, + 5.48561689033321957e-05, + 4.37479929616704135e-05, + 3.55197338588720708e-05, + 2.92997531309719291e-05, + 2.45033304036474338e-05, + 2.07381299421270220e-05, + 1.77357817526745698e-05, + 1.53085052125588163e-05, + 1.33220598686904026e-05, + 1.16786070067704456e-05, + 1.03055955245255216e-05, + 9.14838580980166758e-06, + 8.16524902299916889e-06, + 7.32391074475928827e-06, + 6.59911991248959211e-06, + 5.97091150916662918e-06, + 5.42334687994503099e-06, + 4.94358813436719633e-06, + 4.52120965525381680e-06, + 4.14768015643222029e-06, + 3.81596894390337511e-06, + 3.52024367336865893e-06, + 3.25563623344298324e-06, + 3.01805986040055514e-06, + 2.80406513986738697e-06, + 2.61072578323932184e-06, + 2.43554738915850112e-06, + 2.27639408514286138e-06, + 2.13142917973173409e-06, + 1.99906686781097416e-06, +-9.39645714395096268e-05, +-4.31433364177244582e-05, +-2.21556986275153227e-05, +-1.22499223519065257e-05, +-6.85193231074147495e-06, +-3.97532217764381212e-06, +-2.88804152450871612e-06, +-2.45188813508141599e-06, +-1.97463558220093974e-06, +-1.47696076453529304e-06, +-1.07673679322603726e-06, +-7.90716191635743413e-07, +-5.91878816250426267e-07, +-4.52260796864136319e-07, +-3.52158494786593270e-07, +-2.78811313601502757e-07, +-2.23989004757403914e-07, +-1.82282075539903272e-07, +-1.50051172224018311e-07, +-1.24792384502288513e-07, +-1.04747566908466824e-07, +-8.86593882084105422e-08, +-7.56136883132577956e-08, +-6.49357897125581244e-08, +-5.61209311114096922e-08, +-4.87867441638030792e-08, +-4.26402492162353684e-08, +-3.74545854300424955e-08, +-3.30523746371455917e-08, +-2.92936743372414723e-08, +-2.60671495950600765e-08, +-2.32835321091856719e-08, +-2.08707237884847658e-08, +-1.87700961617370729e-08, +-1.69336682594503852e-08, +-1.53219364354817463e-08, +-1.39021920042355677e-08, +-1.26472076405388553e-08, +-1.15342041832976119e-08, +-1.05440328097867383e-08, + 4.93702494258812925e-06, + 1.93026975250503613e-06, + 8.57607226956151236e-07, + 4.40796131154567337e-07, + 2.50631630236031870e-07, + 1.13978381195764940e-07, + 3.52163002379929636e-08, + 2.63449316814136537e-08, + 3.22068606095582808e-08, + 2.87090845816764271e-08, + 2.12464143437069846e-08, + 1.48180028247426132e-08, + 1.03226844957610976e-08, + 7.32465102646712501e-09, + 5.31342445637216994e-09, + 3.93574697944311841e-09, + 2.97022480919072808e-09, + 2.27899478678704588e-09, + 1.77458163104278101e-09, + 1.40014758847820893e-09, + 1.11790153811318248e-09, + 9.02181251904021670e-10, + 7.35224994752236856e-10, + 6.04524768717232964e-10, + 5.01132577527753626e-10, + 4.18554471449772913e-10, + 3.52014918263377528e-10, + 2.97959140660844639e-10, + 2.53711247345013671e-10, + 2.17235844644499347e-10, + 1.86969739633871153e-10, + 1.61701509436516166e-10, + 1.40484448171709717e-10, + 1.22572841021358115e-10, + 1.07374989892053885e-10, + 9.44180823876709377e-11, + 8.33218946022802828e-11, + 7.37787004330275533e-11, + 6.55380501595612655e-11, + 5.83949532940880670e-11, +-2.48540294436108236e-07, +-8.41063130189661358e-08, +-3.18875371185914240e-08, +-1.29005898165029075e-08, +-7.55906819602928189e-09, +-5.86772383221629974e-09, +-1.83752741743913490e-09, + 3.60306249278285033e-10, + 6.07636743711421437e-11, +-3.39489795630318503e-10, +-3.66887183997765619e-10, +-2.71448221563477195e-10, +-1.82494761466722298e-10, +-1.21562367125944137e-10, +-8.23895341152312629e-11, +-5.71346447909817346e-11, +-4.05107860208960999e-11, +-2.93071734256500212e-11, +-2.15866977109799954e-11, +-1.61582269510923774e-11, +-1.22714961010859873e-11, +-9.44271988564389588e-12, +-7.35317009656713777e-12, +-5.78866391601004150e-12, +-4.60272688084552013e-12, +-3.69348615707450343e-12, +-2.98906695305966532e-12, +-2.43804714433365656e-12, +-2.00313419979760951e-12, +-1.65699888518585891e-12, +-1.37936957775486441e-12, +-1.15508343733223716e-12, +-9.72639242674752194e-13, +-8.23295702783936711e-13, +-7.00301002210564180e-13, +-5.98452527623066648e-13, +-5.13647968175007668e-13, +-4.42689129071066527e-13, +-3.83030474219878822e-13, +-3.32642863306647682e-13, + 1.19966923441820386e-08, + 3.54470135757127306e-09, + 1.24874126382609435e-09, + 4.38288719651245794e-10, + 7.14564592115594252e-11, + 1.23408175226713588e-10, + 1.64334236021938386e-10, + 1.95777688926148053e-11, +-2.45587686406957776e-11, +-7.36751079640818189e-12, + 2.94408875319141216e-12, + 4.21110523900028378e-12, + 3.11097360531681090e-12, + 2.02330389469876374e-12, + 1.29603748380806206e-12, + 8.43991850366323557e-13, + 5.62648434553545133e-13, + 3.83850973716319221e-13, + 2.67448265130431867e-13, + 1.89923592787788784e-13, + 1.37197965834598447e-13, + 1.00660949221293946e-13, + 7.49033164409740010e-14, + 5.64585960340510803e-14, + 4.30529449769978290e-14, + 3.31949583005316375e-14, + 2.58565779642260988e-14, + 2.03230347388602269e-14, + 1.61119397649371535e-14, + 1.28729289137023823e-14, + 1.03680583250448146e-14, + 8.40141299997299929e-15, + 6.85989941356258914e-15, + 5.63375274395701306e-15, + 4.65424797931961360e-15, + 3.86289501039602930e-15, + 3.22945648693606983e-15, + 2.70650324202520031e-15, + 2.27775921372057164e-15, + 1.92902917662608674e-15, +-5.58565109623584429e-10, +-1.42744727201964843e-10, +-4.34558670347794064e-11, +-1.96727589753691573e-11, +-5.40853684015333579e-12, + 5.71730763265163780e-12, +-3.89431306487594741e-12, +-4.02565674731804839e-12, + 2.27234611906872695e-13, + 6.10294564010572785e-13, + 1.55128002388071461e-13, +-2.25485278291120684e-14, +-4.41990312930242967e-14, +-3.22736913021662489e-14, +-2.03334099500592845e-14, +-1.25782037586976712e-14, +-7.90470433836810400e-15, +-5.08689532153903917e-15, +-3.35676461428409660e-15, +-2.26092305045958396e-15, +-1.55310635342431204e-15, +-1.08569231895604068e-15, +-7.73312944422413991e-16, +-5.57644747496203566e-16, +-4.07095776899506920e-16, +-3.05396388285413635e-16, +-2.24674688441212384e-16, +-1.67667734610050459e-16, +-1.27089948192947937e-16, +-9.85882736841432226e-17, +-7.36693666727395029e-17, +-6.25246315757574929e-17, +-4.53898681643296791e-17, +-3.64587360229290982e-17, +-2.74461227541249089e-17, +-2.70334652814692876e-17, +-1.81234400159554197e-17, +-1.42081524399636273e-17, +-1.21696119978820801e-17, +-1.28589078468374700e-17, + 2.51099595317464135e-11, + 5.75653233590288957e-12, + 1.40202721806512358e-12, + 3.86720400444173947e-13, + 5.55509958881788713e-13, +-5.71967597038955322e-14, +-2.67295880091034666e-13, + 1.68775009003804377e-13, + 6.11800930273425374e-14, +-1.43561029686715939e-14, +-1.01003942814211369e-14, +-2.13011757378350512e-15, + 1.85536965532503749e-16, + 4.40539504623008398e-16, + 3.11477885662111587e-16, + 1.88785800848284909e-16, + 1.13988254215144978e-16, + 7.47111478373723165e-17, + 4.04328644066143899e-17, + 2.63660319235527157e-17, + 1.58914207403346423e-17, + 1.33219951479526252e-17, + 9.73338747456143453e-18, + 5.89848842959770645e-18, + 1.87738542994417297e-18, +-8.39362890721153955e-19, + 6.92359606186001693e-19, + 3.21563619097448587e-18, + 5.37777319060467908e-18, + 2.02564615587187339e-18, + 2.43765152128911899e-18, +-4.35053190474463582e-20, + 1.15274640696393064e-18, +-3.21863207511818398e-18, + 3.12177642437983497e-18, + 4.86933633197314571e-19, + 3.45038801170459641e-18, + 4.24600913296614463e-19, +-1.83081695911689233e-18, +-2.26288008756255153e-18, +-1.08744102338920373e-12, +-2.24200904391880180e-13, +-5.71141673691808545e-14, +-5.17481016504164805e-15, + 2.11604658948278962e-15, +-2.67702319924819867e-14, + 1.50312775073331757e-14, + 2.38097590941313584e-15, +-4.11476635349606772e-15, +-4.19773811289646295e-16, + 3.03195794339193154e-16, + 1.27386121425732688e-16, + 3.15316828339322507e-17, + 7.37610886963560533e-18, + 7.59165292931396456e-19, +-3.12573297428557881e-18, + 1.92131709323498286e-18, + 4.78559008313767992e-18, + 7.22604446134548164e-19, + 2.37685060910538614e-18, +-2.75157160374499941e-18, +-5.36636322310924016e-19, +-1.74243071585370397e-18, + 2.41353722444334395e-18, +-2.11116362827816448e-18, +-3.70344777684552908e-18, + 4.01622558576170446e-18, + 1.13337293938568195e-18, + 3.88236177900318381e-18, + 2.30524315304977778e-18, + 3.35179485748891199e-18, + 5.61086453816118358e-19, + 9.73540879088881717e-19, +-1.34412100834506176e-18, + 1.05386916399118828e-18, +-2.99439526578366904e-19, + 8.62460980276924979e-19, + 4.42539988821115549e-18, +-5.42947744550522682e-19, +-8.12356090797382432e-19, + 4.59687971842820103e-14, + 8.19282049394905937e-15, + 1.91881306567661581e-15, + 9.37656430493459502e-16, +-8.44727996221490654e-16, + 4.52881719350541329e-16, + 5.06487193596616237e-16, +-5.15401203597160303e-16, + 9.09480842338848793e-17, + 5.90391946431308669e-17, +-1.81669320174573660e-18, + 4.33269601431271815e-19, + 6.78449944778669707e-18, + 7.23327152813450762e-18, + 3.45108467123738297e-18, +-7.57005557257977277e-19, + 9.96901038101690291e-19, + 3.31620986524713132e-18, + 2.87952475102882313e-18, +-9.38831176987942577e-19, +-2.44243577516634506e-18, + 2.83231292346799190e-18, +-1.38580380971273616e-18, + 3.67526169184177614e-19, +-1.64166013417883393e-18, +-2.89255055165506950e-18, + 1.38290614976440097e-18, + 4.26117166027044744e-18, + 3.52541992689520065e-18, +-1.10006432732923900e-18, +-8.84138964716904877e-19, +-3.49457352534525685e-19, + 5.02682585739925632e-18, +-2.46006412185836653e-20, + 3.09639250582142230e-18, + 1.06728342791388977e-18, + 3.27559283036560088e-18, +-1.26851617376017477e-18, +-1.44222278607420531e-18, +-3.61794467571453466e-18, +-1.91452376432781706e-15, +-2.87279525099867417e-16, +-4.62853310130570347e-17, +-2.41430196084659653e-17, +-4.12650948078378455e-17, + 7.70316489225919343e-17, +-5.63409883974343600e-17, + 1.30481155166903616e-17, +-4.17365443607413371e-18, +-4.83433874024354678e-18, +-2.01382817430413973e-18, + 1.04444929004799896e-18, + 3.52819671420977890e-18, + 7.59780023085923615e-18, + 5.82971387200441226e-18, + 2.60359820795461686e-18, + 1.50923518675271539e-18, + 4.49430928503279949e-18, + 3.40447081175746307e-18, +-4.28593833271030240e-19, + 7.65597498039607524e-19, + 2.07356941668217495e-18, +-3.08353289688685138e-19, + 1.92911321603752783e-18, +-6.70169228330442173e-19, + 7.30556549314294651e-19, + 2.67948705153806757e-18, + 2.46370696749599625e-18, + 1.77665226425798732e-18, + 2.08510234256403944e-18, + 7.98782887553957983e-19, + 3.44705236829619212e-18, + 3.46545165522798749e-18, +-1.44670790553186253e-18, + 4.87446501476517301e-19, +-8.56216105225113069e-20, + 6.11144412796136373e-18, + 1.20855971648823741e-18, + 2.13305490868136902e-18, + 1.11323426427127360e-18, + 7.59401284016867838e-17, + 1.31591913533913659e-17, +-7.14722423297762283e-18, +-1.71739633121303385e-18, + 3.92313241465142138e-18, + 2.80959373536263470e-18, + 4.88227993728382119e-18, +-1.53221557909581925e-18, +-3.17148084768204415e-19, + 3.89872802103924632e-18, +-2.53833717597191015e-19, + 3.46693452663614127e-18, + 4.21399591327033917e-18, + 1.84900374770561582e-18, +-3.77459783438571951e-19, +-2.71915736547045583e-18, +-1.31397133979296140e-18, + 3.12289651751697113e-19, +-1.43294213619989425e-18, +-1.69477749778561701e-18, +-2.34162314061702002e-18, +-1.93488755739112378e-18, +-8.54760777242784781e-19, +-2.23024050744241668e-18, +-1.35056037920979979e-18, + 1.50491757240876317e-18, + 2.14088828347013433e-18, +-5.55026168722413150e-19, + 1.88684074231395524e-18, +-6.01007933681925925e-19, + 4.09822793809683877e-19, + 5.76365825243960465e-20, + 9.83257217439562828e-19, +-7.93858994074547823e-19, +-1.60720775687517709e-18, +-2.57665036772528313e-18, + 8.75055640578221167e-19, + 5.21474627757854703e-18, + 4.89143937430021804e-19, + 1.65535074438437061e-18, +-1.74648895926527317e-17, +-2.73958509591048583e-18, +-2.74277902765624885e-18, +-6.05185110746948029e-18, +-6.06308211885995217e-18, + 7.61825512521603569e-18, +-2.23431831911163944e-18, + 1.45741964460886930e-18, +-2.89762928573635568e-18, +-3.28610304458907486e-18, + 6.70650137163244563e-19, + 8.56442238550276863e-19, + 4.17759748662720922e-19, +-1.29166305790573269e-18, +-4.00766973683240503e-18, +-3.46713050881547898e-18, +-1.56645520896870810e-19, +-7.21371783131556351e-19, +-1.22276029714024779e-18, +-1.48646349727850118e-18, + 4.58568840562660625e-19, +-3.87786524371397844e-18, +-3.36124353904849870e-18, +-2.16216081415239465e-18, +-3.16933296465161106e-18, +-1.35725233285060682e-18, +-1.62374849660808790e-18, +-1.19491891638061045e-18, +-1.58823707146137385e-18, +-2.03756933711216510e-18, + 1.30449237527417841e-18, +-1.31410395420336807e-18, +-2.35625218266693896e-18, +-1.88249052288571172e-18, +-5.10732855762795537e-19, +-6.59916430213309649e-19, +-6.23930826648470405e-19, +-4.52504645124832636e-19, +-1.80264158115923107e-18, +-2.53315117176123961e-18, +// nroots = 5 +// root 0 + 9.41894633224578337e-01, + 9.25451058081897759e-01, + 9.02096522781007271e-01, + 8.68799420941629319e-01, + 8.22470777631498784e-01, + 7.62159066116520290e-01, + 6.91780123510703726e-01, + 6.19643508642129803e-01, + 5.53590141614636599e-01, + 4.97154901789164883e-01, + 4.50172007813305686e-01, + 4.11048648837792574e-01, + 3.78128478317243055e-01, + 3.50082177512506754e-01, + 3.25909292315416710e-01, + 3.04860307295076294e-01, + 2.86366406291402642e-01, + 2.69988838671940068e-01, + 2.55383874448534332e-01, + 2.42278416309197581e-01, + 2.30452741691072216e-01, + 2.19728067791964327e-01, + 2.09957438677453034e-01, + 2.01018943264889061e-01, + 1.92810596978554016e-01, + 1.85246429569395410e-01, + 1.78253459963845895e-01, + 1.71769332007881026e-01, + 1.65740448551727704e-01, + 1.60120485469700924e-01, + 1.54869198310404410e-01, + 1.49951456474172545e-01, + 1.45336455859612801e-01, + 1.40997072649906491e-01, + 1.36909329574912364e-01, + 1.33051952451139155e-01, + 1.29405999671587446e-01, + 1.25954551017431415e-01, + 1.22682444997717494e-01, + 1.19576056111108969e-01, +-6.87527434724483338e-03, +-9.68471316845449966e-03, +-1.38315819865204252e-02, +-1.96422161427526783e-02, +-2.67608486412549418e-02, +-3.33470740102477306e-02, +-3.65552875814930053e-02, +-3.51408416473031684e-02, +-3.07384438451400489e-02, +-2.57245383712576929e-02, +-2.13503395661966550e-02, +-1.78612321509538756e-02, +-1.51278764392255172e-02, +-1.29699139349288128e-02, +-1.12415106406431476e-02, +-9.83675086596240596e-03, +-8.67976122189139179e-03, +-7.71554150745937511e-03, +-6.90352776466958504e-03, +-6.21328849942212429e-03, +-5.62163475685814162e-03, +-5.11064615969792583e-03, +-4.66629701668260129e-03, +-4.27748294487816181e-03, +-3.93531994352174907e-03, +-3.63263212355869692e-03, +-3.36357221288342834e-03, +-3.12333691213351541e-03, +-2.90795094217665426e-03, +-2.71410146992744203e-03, +-2.53900991455673986e-03, +-2.38033179095702326e-03, +-2.23607779488888513e-03, +-2.10455113268692663e-03, +-1.98429738312672294e-03, +-1.87406410698179099e-03, +-1.77276809698696976e-03, +-1.67946865993506898e-03, +-1.59334569371651124e-03, +-1.51368160043864239e-03, +-2.85215827077115955e-04, +-4.25017426311230973e-04, +-6.18839087542578156e-04, +-8.29478182699785126e-04, +-9.16330551959505584e-04, +-6.71552562882528521e-04, +-1.04029655057112451e-04, + 4.21476468121179354e-04, + 6.31569246171971815e-04, + 6.00087176468724198e-04, + 4.90471095841729112e-04, + 3.84756828118019132e-04, + 3.01994222395217025e-04, + 2.40149837404438537e-04, + 1.93858343818526017e-04, + 1.58695792420433861e-04, + 1.31541339987337918e-04, + 1.10244470021356671e-04, + 9.33079509547561631e-05, + 7.96706411769981744e-05, + 6.85667201335781563e-05, + 5.94341551944824488e-05, + 5.18541471651277897e-05, + 4.55102888475832383e-05, + 4.01605080336922242e-05, + 3.56174641956081008e-05, + 3.17346379519838469e-05, + 2.83963189257010547e-05, + 2.55103046842212950e-05, + 2.30025120379150835e-05, + 2.08129551148721069e-05, + 1.88927122425808500e-05, + 1.72016163295780178e-05, + 1.57064802369837637e-05, + 1.43797216628944674e-05, + 1.31982891358480693e-05, + 1.21428169237589149e-05, + 1.11969553974821570e-05, + 1.03468369078091646e-05, + 9.58064708781273874e-06, +-9.47771170620905855e-06, +-1.39597478885262942e-05, +-1.79616963341206369e-05, +-1.53248860917786131e-05, + 4.02437981007988896e-06, + 3.70524072896324372e-05, + 5.18815778938416263e-05, + 3.17148910759910854e-05, + 4.82944138908988458e-06, +-7.72920532282554126e-06, +-9.54100653781567759e-06, +-7.89192549139958612e-06, +-5.94914812630150372e-06, +-4.43220215991463422e-06, +-3.34065635954495880e-06, +-2.55985434875925856e-06, +-1.99344639175121455e-06, +-1.57523381859304613e-06, +-1.26114741908480033e-06, +-1.02158626231791605e-06, +-8.36303888419647928e-07, +-6.91188292344734927e-07, +-5.76228338509639897e-07, +-4.84206814499929542e-07, +-4.09843781095335702e-07, +-3.49224395041441571e-07, +-2.99410026660314110e-07, +-2.58169691960677855e-07, +-2.23791823868574626e-07, +-1.94950544730453708e-07, +-1.70609456109663743e-07, +-1.49951606411596250e-07, +-1.32327956130980772e-07, +-1.17219067565112143e-07, +-1.04206353776158137e-07, +-9.29503080857050310e-08, +-8.31738810558194374e-08, +-7.46496872298052792e-08, +-6.71900858788113326e-08, +-6.06394360569508140e-08, +-2.47271257468353392e-07, +-2.99690954056973261e-07, +-1.40932998435153808e-07, + 5.89188216922788117e-07, + 1.83251295430422820e-06, + 1.91680487030265048e-06, +-2.87109337237222494e-07, +-1.85765154865751972e-06, +-1.28254405536647096e-06, +-3.54513005927883682e-07, + 4.98083321234246300e-08, + 1.27634491555431503e-07, + 1.09760903453793261e-07, + 8.03684969388528487e-08, + 5.73165918142131883e-08, + 4.12510516209253201e-08, + 3.02034709202716181e-08, + 2.25068980682029158e-08, + 1.70455027330384419e-08, + 1.30993940883101449e-08, + 1.02003426547580103e-08, + 8.03815982594292368e-09, + 6.40332768560459621e-09, + 5.15171942710584539e-09, + 4.18251495611951463e-09, + 3.42409772475084688e-09, + 2.82487434317115847e-09, + 2.34719121552865999e-09, + 1.96323726083986763e-09, + 1.65224194700519991e-09, + 1.39853214895087545e-09, + 1.19016710007148572e-09, + 1.01796759943341210e-09, + 8.74817895407395567e-10, + 7.55158161765963894e-10, + 6.54612102386490332e-10, + 5.69710850384157930e-10, + 4.97686704339081625e-10, + 4.36317661342104129e-10, + 3.83809277131615919e-10, +-4.07556847978423208e-09, + 2.23090941100138869e-10, + 1.89496912877903709e-08, + 5.51697225658118093e-08, + 5.42321927962008727e-08, +-6.10393885888450886e-08, +-1.27659721833092016e-07, +-1.56147066237523427e-08, + 5.29942508653429589e-08, + 3.36104328262456271e-08, + 9.39307146593877671e-09, + 2.92629616293182006e-10, +-1.48470699674092370e-09, +-1.34639547910000449e-09, +-9.62861624564430081e-10, +-6.61253287657486896e-10, +-4.57070481650607916e-10, +-3.21494922907993862e-10, +-2.30372899310117845e-10, +-1.67966693538849711e-10, +-1.24412696602631752e-10, +-9.34795998104968750e-11, +-7.11568777329720722e-11, +-5.48117310784096976e-11, +-4.26831688929896689e-11, +-3.35728241195513689e-11, +-2.66521148333730178e-11, +-2.13398504532245310e-11, +-1.72226883956733840e-11, +-1.40030346707919737e-11, +-1.14641332504119745e-11, +-9.44634296782038734e-12, +-7.83097816536808476e-12, +-6.52884513956230022e-12, +-5.47244583764540142e-12, +-4.61016675676254651e-12, +-3.90230828212557813e-12, +-3.31806031430822477e-12, +-2.83334529877683732e-12, +-2.42926449158275454e-12, + 3.35137455780654511e-11, + 3.94624353712832459e-10, + 1.22819160515585002e-09, + 1.44351799636327188e-09, +-2.34976022127139160e-09, +-5.95246919394479718e-09, + 1.79058220162443808e-09, + 5.27854060360651041e-09, + 3.65355039409102029e-10, +-1.28080193002447243e-09, +-6.58521228857002880e-10, +-1.69837093863884297e-10, +-1.35675863263861009e-11, + 1.55254521769962093e-11, + 1.48081233788876698e-11, + 1.03562537433500618e-11, + 6.87664808447344862e-12, + 4.58610489841678440e-12, + 3.11262163512024324e-12, + 2.15362443927518937e-12, + 1.51742575676871000e-12, + 1.08711839388365086e-12, + 7.90731983969907822e-13, + 5.83173578433419798e-13, + 4.35592882894215956e-13, + 3.29179520828501711e-13, + 2.51464252634711212e-13, + 1.94022184048254408e-13, + 1.51088264905680527e-13, + 1.18683402923230636e-13, + 9.39805651061137445e-14, + 7.49909472710007103e-14, + 6.02471476571511468e-14, + 4.87319899177694541e-14, + 3.96548102072957630e-14, + 3.24715391915354657e-14, + 2.67301506117716930e-14, + 2.21211330754077370e-14, + 1.83990691420151795e-14, + 1.53738423995869849e-14, + 6.19969878704432651e-12, + 2.13791603620769078e-11, + 3.35668471254659176e-11, +-4.37671361755358707e-11, +-2.12863634523957622e-10, + 6.64184553472092641e-11, + 3.46273200312814914e-10, +-1.15243990691193112e-10, +-1.43384750087650994e-10, + 5.45961157096539193e-12, + 2.49369436351382962e-11, + 1.01530795361817111e-11, + 2.37328535731891993e-12, + 2.23701682059223672e-13, +-1.50450293522503040e-13, +-1.47891439642102902e-13, +-1.01016688166841088e-13, +-6.50363259912597984e-14, +-4.19844418196309204e-14, +-2.75966629584355138e-14, +-1.85091369800527706e-14, +-1.26461656447767115e-14, +-8.78971081226572493e-15, +-6.20158997857794477e-15, +-4.43662677397188809e-15, +-3.23487429478147218e-15, +-2.36079695578412949e-15, +-1.75209772929438189e-15, +-1.32284977148815024e-15, +-9.91577573481794860e-16, +-7.62264292296825621e-16, +-5.78211416295681874e-16, +-4.61343752649457423e-16, +-3.52960583117330659e-16, +-2.86114704480780252e-16, +-2.23369015236931956e-16, +-1.85245372684066441e-16, +-1.44870131084768253e-16, +-1.20298213830081268e-16, +-9.31140327820026493e-17, + 3.00092424446418082e-13, + 6.21649053499690139e-13, +-3.16405196648375752e-13, +-5.03487003161942758e-12, +-1.81236877265037608e-12, + 1.74851372883625317e-11, +-7.25594185706852020e-12, +-1.11515346035509027e-11, + 5.67894059742468785e-12, + 2.32695759876316934e-12, +-3.78006969029595821e-13, +-3.83604288165291564e-13, +-1.27457228701919511e-13, +-2.70458389848374721e-14, +-2.58267629847279789e-15, + 1.39082946025993722e-15, + 1.35810443389489946e-15, + 8.98689699356766831e-16, + 5.57941170969110826e-16, + 3.56674557706127336e-16, + 2.19494175934444106e-16, + 1.45228680168637198e-16, + 9.92569830604483360e-17, + 7.02288762643896261e-17, + 5.53190329725951175e-17, + 1.92018165719798793e-17, + 1.77560219829077217e-17, + 1.77437267356860305e-17, + 1.39469081011543027e-17, + 1.41802657893295149e-17, + 9.72790789899807344e-18, + 1.66867448539419692e-17, + 1.20617519151121563e-18, + 4.60561282738842953e-18, + 1.56426068000940369e-18, + 4.81450725057647012e-18, + 4.38753828740273758e-18, +-3.12192925804083407e-18, + 4.34540685605800090e-19, + 6.40068144202121980e-19, + 9.13833783951016836e-15, + 3.54915533011224576e-15, +-7.39044714893627082e-14, +-1.45675574810677105e-13, + 4.59985203690632807e-13, + 1.21086643753286607e-13, +-9.62630178033557678e-13, + 6.31210279247867846e-13, + 9.67860945345624603e-14, +-1.38298064001624419e-13, +-2.05180785718315561e-14, + 8.52295136781201848e-15, + 4.76265745323555682e-15, + 1.35287293748078877e-15, + 2.54712098091350121e-16, + 3.14566624227098681e-17, +-1.76032826649622686e-17, +-1.11852955117470741e-17, +-5.93317507920515473e-18, + 4.30097065904839874e-18, +-4.05691701381194886e-18, + 5.06126164576256349e-19, +-8.55538728940683624e-19, + 1.37867905371819524e-18, + 2.12998700921031856e-18, +-7.41904247739577973e-18, + 6.74685867232568573e-18, + 7.60028641215756405e-18, +-2.07258840821814015e-18, + 1.02554243507926295e-17, + 6.78271045226654856e-18, + 1.03728634439001365e-17, + 1.93396941719314033e-18, + 4.41100755064982752e-18, +-4.06217226345225003e-18, + 2.86309442424109026e-18, +-7.09596298956492906e-19, +-3.47431839627759252e-18, + 2.44634585073854008e-18, + 2.26137505970019061e-18, + 1.31621956369120338e-16, +-6.95972425332939636e-16, +-3.29273968578810556e-15, + 3.67770266119412330e-15, + 2.10016723664409080e-14, +-4.65728033003904869e-14, + 2.58906756886650585e-14, + 1.38183134401982949e-14, +-1.82550088691814308e-14, + 2.62875157257791982e-15, + 1.83727498590086403e-15, + 6.82914987104738139e-17, +-9.76986845627637287e-17, +-4.22514261276845450e-17, +-1.51985077128094994e-17, + 9.21174875173139460e-18, +-1.81698334156610949e-18, +-3.42967311373588919e-18, +-7.04899409867747650e-20, + 5.74448206945704649e-18, +-7.72715264294920833e-19, + 9.56267973231033330e-19, +-2.65376763704159338e-18, + 4.53913280022950998e-18, + 1.21981984656379592e-18, + 2.02870291761179646e-18, + 4.37530190315291400e-18, + 7.67292218807810338e-18, + 4.29724863709392648e-18, + 4.68116004494951207e-18, + 2.66494447904219271e-18, + 7.79899308427953274e-18, + 3.19436636401625491e-18, + 1.03021876576129942e-17, +-3.26054483572440121e-18, +-6.70351114807607501e-19, + 3.05373163300508462e-18, + 4.61666210488423533e-19, +-2.08318754272476200e-19, + 7.74262296540384389e-19, +-4.95864312129126355e-18, +-2.72579729183845218e-17, +-3.39455856828935113e-17, + 5.26792233448815292e-16, +-3.64252355416924301e-16, +-1.17808415438919195e-15, + 2.68111269093705178e-15, +-2.16471264183005864e-15, + 5.46276080985651320e-16, + 1.41589878295217864e-16, +-8.46574608151976235e-17, +-2.13791774034980188e-17, + 6.32840861355088034e-18, + 2.78661848182405434e-17, +-2.96170851787411544e-18, + 1.14360537224758397e-17, + 1.66140497570238198e-17, + 2.31806334024172115e-18, + 2.07817368525993151e-17, + 1.27991754441355894e-17, + 8.85625927942460409e-18, + 6.22646575839238236e-18, + 9.93530150464169902e-18, + 7.26880184237424969e-18, + 6.93809620658683272e-18, + 6.14030225356136383e-18, + 5.66898274958852043e-18, + 1.41112385643920746e-17, + 7.39400166773219953e-18, + 3.98954591246768207e-18, + 5.93655686785203863e-18, + 9.73086866996128567e-18, + 1.10433362126005294e-18, + 6.05051823278838185e-18, +-1.19315109672420310e-18, + 4.60716133334041103e-18, + 1.03672556117224366e-18, + 5.56912227945957314e-19, +-2.16669432043658510e-18, + 3.04785867478831715e-18, +-5.07997995826775249e-18, + 5.56867991463081561e-18, + 1.54280158557777374e-17, + 4.11208595323510735e-17, +-7.42636794822943162e-17, + 8.88013158357498416e-17, +-8.67492611671442031e-17, + 1.71935593857440655e-17, + 7.43950852246117730e-18, +-7.61732105151303702e-18, + 2.18769764750663161e-18, +-7.50794158315994679e-18, + 6.59123223326264118e-18, + 7.14394722712917807e-18, + 6.67718066780579946e-19, + 8.35311286644696624e-18, +-8.63638841611059305e-18, +-1.85514989849572322e-18, + 3.69099071956694279e-18, +-4.98554805584674126e-18, +-4.58742839671734974e-18, +-4.25417467278312573e-18, +-5.53554090347109056e-19, +-1.71946800218598942e-18, +-5.47543082877864190e-19, + 7.29147241428133193e-19, + 5.95164260111112335e-18, + 9.03912009575839179e-18, + 7.66101931428369869e-18, + 5.35396160133448930e-18, + 3.90538638176685072e-18, + 5.10455249977130570e-18, + 7.17430971978254117e-18, + 1.40074883398104697e-18, +-1.93383191929900924e-18, + 1.52707471731665660e-18, + 1.75964501080389985e-18, + 3.98610561600636675e-18, + 1.83180848108981449e-18, +-5.02634880671875479e-19, + 6.72031859925614213e-18, +-7.75794503175418647e-18, +-7.21562154056431229e-18, + 2.93173121614641925e-17, + 4.83714570295116991e-18, +-2.56116087689121152e-18, +-4.30216534991303671e-17, + 1.85527590199100746e-17, + 2.89964216556524189e-19, +-8.06715332059804843e-19, +-7.68619587054422035e-18, +-1.59052136649810873e-17, + 1.07034104939137839e-17, +-1.20637499577254851e-17, +-2.20760251323427756e-17, +-8.71376507370094241e-18, +-1.79026853408703431e-17, +-3.40623680193179595e-18, +-9.65786230747516717e-18, +-5.12468857745551477e-18, +-8.46936107604862366e-18, +-8.57954201707218796e-18, +-9.52414403635201103e-18, +-5.12264871605371565e-18, +-1.52058310370553165e-18, +-1.12678098952812717e-17, +-1.05946838215030852e-17, +-7.24357865458493437e-18, +-9.82778585661722745e-18, +-5.46831418103061212e-18, +-6.94800256935689871e-18, +-6.79271233996655778e-18, +-2.65730227313732017e-18, +-1.00274368149355781e-17, +-4.24002226416639735e-18, +-3.15036109904930668e-18, +-2.22611654314699804e-18, +-1.16808694885039788e-17, +-9.85340614779834034e-18, +-2.54571272925790494e-18, + 2.99976729164458215e-02, + 3.74239288803220787e-03, + 5.29392262433412515e-04, + 9.03623507706603746e-05, + 2.02786927631871456e-05, + 6.54432085802101597e-06, + 3.15142407028244894e-06, + 2.12123820969827884e-06, + 1.75242475801118906e-06, + 1.59088879372311900e-06, + 1.49663111792082106e-06, + 1.42636642068441339e-06, + 1.36733462746030984e-06, + 1.31553291623161366e-06, + 1.26929414364915260e-06, + 1.22762890965178619e-06, + 1.18981879830091103e-06, + 1.15530176728978176e-06, + 1.12362552612972329e-06, + 1.09442046821666952e-06, + 1.06738103774724682e-06, + 1.04225210301583714e-06, + 1.01881873251222440e-06, + 9.96898398891471735e-07, + 9.76334955347408164e-07, + 9.56993926655767927e-07, + 9.38758788610320082e-07, + 9.21527999626210837e-07, + 9.05212611135768197e-07, + 8.89734327943124004e-07, + 8.75023921703294572e-07, + 8.61019923970243791e-07, + 8.47667542390926084e-07, + 8.34917756367832396e-07, + 8.22726558090008650e-07, + 8.11054312097165503e-07, + 7.99865212100364481e-07, + 7.89126818071505963e-07, + 7.78809659948386214e-07, + 7.68886896913643580e-07, +-2.79874326248842446e-02, +-3.35127940858865421e-03, +-4.43320107035186735e-04, +-6.74929425828456889e-05, +-1.24153636646082985e-05, +-2.86197100295735299e-06, +-8.19660535559495812e-07, +-2.77478083434089035e-07, +-1.10641470035595212e-07, +-5.70406195309926945e-08, +-3.90853197133017259e-08, +-3.17185233721723848e-08, +-2.74870473085676358e-08, +-2.43930165903799167e-08, +-2.18952194425993638e-08, +-1.98067996061535709e-08, +-1.80322936587832162e-08, +-1.65081128045433367e-08, +-1.51872509004126783e-08, +-1.40336272578355308e-08, +-1.30190205131063597e-08, +-1.21210544875232252e-08, +-1.13217808112346116e-08, +-1.06066527147513323e-08, +-9.96376885465363444e-09, +-9.38330813126298948e-09, +-8.85710188289834083e-09, +-8.37830631116136540e-09, +-7.94114898263051999e-09, +-7.54073072781496521e-09, +-7.17286942291920906e-09, +-6.83397575884910033e-09, +-6.52095367076499474e-09, +-6.23111994708969227e-09, +-5.96213887783963236e-09, +-5.71196878668309949e-09, +-5.47881802111843026e-09, +-5.26110852141576622e-09, +-5.05744550127189603e-09, +-4.86659208688202028e-09, + 7.20639952711917952e-03, + 8.31892757494416459e-04, + 1.04155114278761782e-04, + 1.45928270063444419e-05, + 2.38074258370367169e-06, + 4.71755267625844607e-07, + 1.16443176610120170e-07, + 3.45385602438345220e-08, + 1.10469494664975325e-08, + 3.58037231891201193e-09, + 1.30655939447068111e-09, + 6.49418340679033149e-10, + 4.38163880511371927e-10, + 3.43490788963413987e-10, + 2.83975336105459305e-10, + 2.39782239176177093e-10, + 2.04979159810938002e-10, + 1.76912781583376503e-10, + 1.53954479434107749e-10, + 1.34961881279759190e-10, + 1.19094865851087460e-10, + 1.05721763400435150e-10, + 9.43603098640940014e-11, + 8.46375272487132208e-11, + 7.62616054194918063e-11, + 6.90018219910197388e-11, + 6.26739846052775235e-11, + 5.71297343663888689e-11, + 5.22485894047473710e-11, + 4.79319593649611880e-11, + 4.40985952287134537e-11, + 4.06810965028843190e-11, + 3.76232056868475188e-11, + 3.48776947916975823e-11, + 3.24047012478738911e-11, + 3.01704078993842324e-11, + 2.81459886214805708e-11, + 2.63067605678374294e-11, + 2.46314983265862784e-11, + 2.31018758105175499e-11, +-1.28338694484198814e-03, +-1.43679534074815613e-04, +-1.72080059237427096e-05, +-2.25948244731608357e-06, +-3.35663951120933926e-07, +-5.84728053462369703e-08, +-1.24043982168605061e-08, +-3.30376417567063033e-09, +-1.03800408973752128e-09, +-3.25925842584025595e-10, +-9.47508476904230618e-11, +-2.80847683739095194e-11, +-1.06950658502567515e-11, +-5.93751497534987665e-12, +-4.19090396730861023e-12, +-3.24142759623595832e-12, +-2.59143148267157919e-12, +-2.10693802920700099e-12, +-1.73410025829149003e-12, +-1.44214995320587967e-12, +-1.21049846720416651e-12, +-1.02457725464661064e-12, +-8.73816728480573397e-13, +-7.50419397077133985e-13, +-6.48551982961905239e-13, +-5.63795700428778868e-13, +-4.92764778244022469e-13, +-4.32837537837308031e-13, +-3.81964138679281456e-13, +-3.38527358690452217e-13, +-3.01240575084159433e-13, +-2.69072173533059582e-13, +-2.41188965099873712e-13, +-2.16913419676384288e-13, +-1.95691053379887496e-13, +-1.77065348948438834e-13, +-1.60658314331298010e-13, +-1.46155301284754136e-13, +-1.33293066306632578e-13, +-1.21850319485255030e-13, + 1.75092226190916241e-04, + 1.91049189191717380e-05, + 2.20671423534176303e-06, + 2.75184330320989690e-07, + 3.80110485272863120e-08, + 5.98934803145932229e-09, + 1.10591568585723390e-09, + 2.49513987061841581e-10, + 7.31065174657881358e-11, + 2.43272569302286253e-11, + 7.40484480411082766e-12, + 1.97794903068795149e-12, + 5.12731990045362390e-13, + 1.60981656507335170e-13, + 7.49377736647465262e-14, + 4.77155911562868721e-14, + 3.46721522866162801e-14, + 2.63882213637402515e-14, + 2.05149476787650333e-14, + 1.61815662598618853e-14, + 1.29189712388451178e-14, + 1.04259210943823324e-14, + 8.49650455154723695e-15, + 6.98608780045014010e-15, + 5.79125340760604752e-15, + 4.83695345438472400e-15, + 4.06800049602944272e-15, + 3.44331411151171780e-15, + 2.93197072095002485e-15, + 2.51044906975446327e-15, + 2.16068389681656515e-15, + 1.86867602365083659e-15, + 1.62348460215142255e-15, + 1.41649212043859412e-15, + 1.24086078901923908e-15, + 1.09112656724859720e-15, + 9.62895258048199552e-16, + 8.52610934168507664e-16, + 7.57379310894318906e-16, + 6.74831360658461718e-16, +-1.93928908611707551e-05, +-2.07049210012474048e-06, +-2.32074678779368053e-07, +-2.77514599840812326e-08, +-3.61613779557838711e-09, +-5.26934856923650055e-10, +-8.79353229398856735e-11, +-1.68849500834594464e-11, +-4.07746279749031734e-12, +-1.36204536765131794e-12, +-4.66037558222504566e-13, +-1.34228406644735358e-13, +-3.31883060534241255e-14, +-7.81485163010903721e-15, +-2.14167466909188097e-15, +-8.63594726346592403e-16, +-5.00689676926256647e-16, +-3.43613345111012368e-16, +-2.50176602553137202e-16, +-1.86829121751859977e-16, +-1.41826797165527551e-16, +-1.09124972658757841e-16, +-8.49758523171510373e-17, +-6.68957823180819896e-17, +-5.31905060904289783e-17, +-4.26831617044981572e-17, +-3.45426159611055718e-17, +-2.81748304509184121e-17, +-2.31489635825793562e-17, +-1.91488173045803729e-17, +-1.59405693321720102e-17, +-1.33484360536719543e-17, +-1.12400927255687768e-17, +-9.51429059411056781e-18, +-8.09289347169543845e-18, +-6.91585461439172935e-18, +-5.93590653204962981e-18, +-5.11591998241172840e-18, +-4.42639306777783750e-18, +-3.84411546395898785e-18, + 1.80998894099346032e-06, + 1.89680969913976459e-07, + 2.07304928583347150e-08, + 2.39440633527162225e-09, + 2.97446281724678210e-10, + 4.06287977144868666e-11, + 6.27152918575902389e-12, + 1.09914651581947400e-12, + 2.09487866273198503e-13, + 5.80278429097911397e-14, + 2.23217387736998341e-14, + 7.44025603435973195e-15, + 1.99320704949160758e-15, + 4.58853080322575468e-16, + 1.00308374246757564e-16, + 2.49495143806410258e-17, + 9.01311234751868082e-18, + 4.82636709980603839e-18, + 3.14853868144450390e-18, + 2.20303629117442563e-18, + 1.58668887404220908e-18, + 1.16345037281209271e-18, + 8.65568243549484606e-19, + 6.52438923076387813e-19, + 4.97614533121357696e-19, + 3.83589949566287201e-19, + 2.98848993245363293e-19, + 2.34894970864632896e-19, + 1.86111342465152372e-19, + 1.48806495114601492e-19, + 1.19752944933877506e-19, + 9.71843337447535551e-20, + 7.92924633982599493e-20, + 6.50827509551541124e-20, + 5.38128722356736689e-20, + 4.47144504453753805e-20, + 3.73061824182838049e-20, + 3.12183544853757929e-20, + 2.63726476442469166e-20, + 2.23182981069332696e-20, +-1.46093563842260910e-07, +-1.50658768930435297e-08, +-1.61156501814378809e-09, +-1.80800464467386199e-10, +-2.15886754632319909e-11, +-2.79451328840108873e-12, +-4.01232560140701929e-13, +-6.66064437821475438e-14, +-1.15681546174804926e-14, +-2.10762650401547253e-15, +-7.85644227897761330e-16, +-3.22719127630771795e-16, +-9.99642081496233518e-17, +-2.47773595339319668e-17, +-5.34609550742202275e-18, +-1.10059491925986321e-18, +-2.55133207450314171e-19, +-8.50584794735113786e-20, +-4.27270305316969340e-20, +-2.66876133585054689e-20, +-1.80039855812458463e-20, +-1.26239040939008039e-20, +-8.95705002942974825e-21, +-6.40694163351994690e-21, +-4.66947494579431198e-21, +-3.51010424670724713e-21, +-2.51665193624843829e-21, +-1.91532286928501094e-21, +-1.52669770734635275e-21, +-1.12081837812615819e-21, +-9.30313020985430000e-22, +-6.59453688199035661e-22, +-5.17772816789442994e-22, +-4.51264371796257238e-22, +-2.77136008480256747e-22, +-2.21362169779549515e-22, +-2.06199833412411416e-22, +-2.22130219420538133e-22, +-1.30316875609349892e-22, +-1.27889866792028943e-22, + 1.03941942024673451e-08, + 1.05697567147274230e-09, + 1.10992684793567322e-10, + 1.21484866517509880e-11, + 1.40321075865628604e-12, + 1.73784187395006159e-13, + 2.34439792859590321e-14, + 3.58383278369706368e-15, + 6.53519118075399560e-16, + 9.06666498002756673e-17, + 1.94060647428485647e-17, + 1.03935882934264368e-17, + 4.05326451408707922e-18, + 1.14225518133748245e-18, + 2.62773806693572394e-19, + 5.35115549047055958e-20, + 1.04669395129181289e-20, + 2.32824132872923085e-21, + 7.80378531277852942e-22, + 3.65369478860283208e-22, + 1.94797725549607522e-22, + 1.18153996053533989e-22, + 6.61112413205756392e-23, + 4.87767987990833526e-23, + 1.32167887821095556e-22, + 2.65473404255406724e-24, + 5.64250076285262815e-23, + 5.78820008258480814e-23, +-3.02189553459337875e-23, + 4.27112330375963316e-23, +-1.27638275879363515e-23, + 4.93912247879837985e-23, + 3.39359692092067229e-23, +-2.46019485899027766e-24, + 2.43098818533016835e-23, + 3.65242645497964062e-23, +-1.74504891118150025e-25, +-4.25815703894632377e-23, + 1.65367118369577529e-24, +-1.72891701797495236e-23, +-6.61454554919358111e-10, +-6.64389693267300329e-11, +-6.86577230588740818e-12, +-7.35740303271742191e-13, +-8.26175062277919547e-14, +-9.85558086651893091e-15, +-1.27056908315363853e-15, +-1.75397977353576465e-16, +-3.17708088456351657e-17, +-5.31470766894087462e-18, +-4.08818005832366227e-19, +-2.12000792172330470e-19, +-1.27024933623274127e-19, +-4.38198597411120524e-20, +-1.12291703607533890e-20, +-2.40167109277702599e-21, +-4.63010694047301349e-22, +-9.99855564485454038e-23, +-7.03048101553475773e-24, +-1.84353732057192988e-23, + 1.64881886348296488e-23, +-4.05049272794791679e-23, +-6.48511811355965384e-23, +-5.81067749573775840e-24, + 4.98203897301455898e-23, +-3.79510017001482845e-23, + 6.68540007634880006e-23, + 5.90156577494482180e-23, +-3.87330319933774383e-23, + 2.24927352602486605e-23, +-1.64527296295966699e-23, + 3.32397252391870124e-23, + 5.29979173143087158e-23, + 6.05526170932447271e-24, + 3.85230782944018894e-23, + 4.26436064155316136e-23, + 2.59271062930748594e-23, +-2.88914541786627421e-23, + 2.18757335746604499e-23, + 1.16882441425455276e-23, + 3.80867895740233970e-11, + 3.78408095056042366e-12, + 3.85598182850531127e-13, + 4.05713603988882478e-14, + 4.44717024572440860e-15, + 5.13648011767248638e-16, + 6.36739117229614749e-17, + 8.39746950230470534e-18, + 1.22164873623025340e-18, + 2.94523075896899715e-19, + 2.26409223319678222e-20, + 7.80557020919043523e-22, + 2.71787204326980270e-21, + 1.40183390602790010e-21, + 4.17516900321549555e-22, + 6.12796960518061840e-23, +-7.50395102861548149e-25, + 5.42855065585861537e-25, + 7.08597399418696412e-23, +-5.17212772359393622e-24, + 2.03844083729895198e-23, +-4.29812861553729304e-23, +-3.14369269561314993e-23, +-2.80065520333058311e-23, + 4.99428492215583137e-23, + 9.62192497620612141e-24, + 4.51743656503516233e-23, + 4.01742251376780566e-23, + 1.38016438567015309e-25, + 1.30936838605313724e-23, +-1.68750518508060441e-23, + 1.65272644764859177e-23, + 3.16597449850580594e-23, +-5.93025672821271755e-24, + 2.71087414344889894e-23, + 1.51951021019496233e-23, + 1.61366371308150984e-23, +-2.33142613155004571e-23, + 3.15022218368373252e-24, + 9.63331702705472642e-24, +-2.00299005903850053e-12, +-1.97081453459724295e-13, +-1.98357452228098592e-14, +-2.05402152681327678e-15, +-2.20504118069520011e-16, +-2.47868076061372257e-17, +-2.94547495790058170e-18, +-3.93695772045878973e-19, +-4.23458599317419029e-20, +-1.15716032331390936e-20, +-1.94739304165570241e-21, + 4.47661401445224043e-23, + 2.24298391866089363e-23, + 1.94069170306791585e-24, + 3.88185561981637406e-23, + 4.92318272122221893e-23, + 4.00259594206612941e-23, + 4.40479116628995988e-23, + 5.70759327306974532e-23, + 4.46065405290533307e-23, + 3.09587146730103695e-23, + 4.52407880684595867e-23, + 1.33631298213233470e-23, +-1.44770242664026345e-24, + 6.43653565511977763e-23, + 1.61863318071221753e-23, + 4.31701965979895810e-23, + 2.09897924202164264e-23, +-1.71228932503020418e-23, + 3.65662416811891556e-23, +-6.09137652978525137e-24, + 1.48465002275585326e-23, + 2.78464724845020691e-23, + 9.40964696032785515e-24, + 2.82543264041900898e-23, + 3.32817065000992451e-23, + 1.47478539714858484e-23, +-1.27342591285270773e-23, + 2.39268519913874987e-23, +-4.96290866230549109e-24, + 9.69550639309913345e-14, + 9.45663284187099532e-15, + 9.41238985992390245e-16, + 9.61201225302486121e-17, + 1.01306700444089481e-17, + 1.11285590527873703e-18, + 1.28011142384233620e-19, + 1.63050259119370431e-20, + 1.96597456683567280e-21, + 2.12103690363087229e-22, + 9.93738573235815591e-23, +-4.82925142226294883e-25, + 1.39202665682227597e-23, +-3.73400072996955036e-23, + 6.36745925604313303e-24, +-2.07330808386810871e-24, + 2.79112450746813158e-23, +-3.66191992491670459e-24, + 3.68529310644809855e-23, + 5.80953783562133411e-24, + 5.19114915411480381e-23, + 1.78274537163830528e-23, +-1.18970530931880135e-23, + 2.01808680790511853e-23, + 9.37550851185644629e-24, +-8.78738788563768392e-24, + 3.52132736944389350e-23, + 3.18048319708304806e-23, + 1.27433355739464181e-23, + 2.32589732290337899e-23, + 9.78042189401522290e-24, + 3.22056163266712186e-23, + 2.74564372181066088e-23, + 1.18412323101355602e-23, + 1.53269035881419843e-23, + 1.58944099858101389e-23, + 1.78828607556628476e-23, +-2.23455986611500894e-23, + 2.26532518268377241e-23, + 2.09148111007271708e-23, +-4.35690029045212557e-15, +-4.22232725119959773e-16, +-4.16556107976037430e-17, +-4.20697274571749356e-18, +-4.36878346058553282e-19, +-4.81323371165708894e-20, +-5.51119065297786854e-21, +-6.93232907729429338e-22, +-1.38408057838741629e-22, +-1.57582023106057702e-23, +-8.43354256194683703e-24, +-1.86782055347189137e-23, +-2.81653548640869958e-23, +-1.94135459632292489e-23, +-6.79306608830319657e-24, + 1.37121424439981568e-25, +-6.07195234315120737e-23, +-3.13836731732691674e-23, + 2.86656419421052802e-23, + 3.36311108907105178e-23, +-3.21523890606049689e-23, +-4.94511150863793396e-23, +-7.91757915419206830e-24, +-2.59781246447188357e-23, +-4.16853449047147877e-23, +-3.21447604154021185e-23, +-3.64038626497288510e-23, +-8.01039432579955747e-24, +-2.80734146598099610e-23, +-1.97171696763964138e-23, +-1.48132629372833542e-23, +-2.68406746414298297e-24, +-1.50173150733172857e-24, +-1.74755142319140651e-23, + 6.98118504000817714e-24, +-1.18460386776675561e-23, +-2.68978104421001757e-23, +-1.85516815633526449e-23, +-1.52912952097828104e-23, +-1.53177132320210264e-24, +// root 1 + 7.24437731507335259e-01, + 6.72046973878246634e-01, + 6.13699724561848403e-01, + 5.52417954505171505e-01, + 4.91781060192616915e-01, + 4.34811492279979339e-01, + 3.83486471549752184e-01, + 3.38883048440813073e-01, + 3.01291448027606878e-01, + 2.70206586273103067e-01, + 2.44593211858829818e-01, + 2.23321826556976827e-01, + 2.05433958409720840e-01, + 1.90196267940469288e-01, + 1.77063317514944640e-01, + 1.65627602962040960e-01, + 1.55580047619665041e-01, + 1.46682276328304301e-01, + 1.38747543125635003e-01, + 1.31627476822208433e-01, + 1.25202704300259843e-01, + 1.19376094622890755e-01, + 1.14067808078432864e-01, + 1.09211611576642192e-01, + 1.04752097902209351e-01, + 1.00642560265743197e-01, + 9.68433487689332878e-02, + 9.33205859275878374e-02, + 9.00451529382369914e-02, + 8.69918823597492508e-02, + 8.41389097781414658e-02, + 8.14671490846975849e-02, + 7.89598647145917237e-02, + 7.66023205653511841e-02, + 7.43814900223157827e-02, + 7.22858150311731784e-02, + 7.03050048034401381e-02, + 6.84298667509148639e-02, + 6.66521637849227799e-02, + 6.49644933048166284e-02, +-2.43846141595819160e-02, +-2.79231632435982535e-02, +-3.02597873111452934e-02, +-3.08263389964282264e-02, +-2.96497424879375721e-02, +-2.72190618159112614e-02, +-2.40507245886426961e-02, +-2.05366738451156078e-02, +-1.70833921538428093e-02, +-1.40590009834739970e-02, +-1.16150294053561868e-02, +-9.70647512025845337e-03, +-8.21924119830075295e-03, +-7.04648777412571811e-03, +-6.10741060493992603e-03, +-5.34421100244197866e-03, +-4.71562891601990351e-03, +-4.19177771190897951e-03, +-3.75061862812051637e-03, +-3.37561843300905173e-03, +-3.05417878298838577e-03, +-2.77656371202722376e-03, +-2.53515320004312015e-03, +-2.32391434515788562e-03, +-2.13802055727342448e-03, +-1.97357324655789059e-03, +-1.82739564767960081e-03, +-1.69687817541369548e-03, +-1.57986109976928886e-03, +-1.47454459116682268e-03, +-1.37941907401445190e-03, +-1.29321081264951597e-03, +-1.21483903767597486e-03, +-1.14338189781108975e-03, +-1.07804922033153685e-03, +-1.01816056734375395e-03, +-9.63127443011587412e-04, +-9.12438777982618981e-04, +-8.65649018859787449e-04, +-8.22368301777299843e-04, +-4.84319895012672085e-04, +-3.84691548145883928e-04, +-1.88181443867194864e-04, + 4.57082502760437217e-05, + 2.38384627665263392e-04, + 3.59556310042842716e-04, + 4.25915980769044392e-04, + 4.45018851114574476e-04, + 4.11070969637220322e-04, + 3.42378675953699326e-04, + 2.69749665377311688e-04, + 2.09616550103997219e-04, + 1.64164950551965979e-04, + 1.30485367142052093e-04, + 1.05323385394518647e-04, + 8.62181428882264586e-05, + 7.14651514256729525e-05, + 5.98947392714019883e-05, + 5.06932911396042299e-05, + 4.32842745631475956e-05, + 3.72516235852919303e-05, + 3.22899910140914023e-05, + 2.81718473238443707e-05, + 2.47252915951213277e-05, + 2.18188083812348967e-05, + 1.93506174189337616e-05, + 1.72411161716825945e-05, + 1.54274403314992291e-05, + 1.38594972251145981e-05, + 1.24970381853927758e-05, + 1.13074734790997015e-05, + 1.02642244434888377e-05, + 9.34546869346714415e-06, + 8.53317598340242759e-06, + 7.81236112041301108e-06, + 7.17050046712121243e-06, + 6.59707281206851646e-06, + 6.08319556281308921e-06, + 5.62133456215477376e-06, + 5.20507118092634107e-06, + 3.90481537137895347e-06, + 1.27654255925731892e-05, + 1.91447984766843501e-05, + 1.86927020880215906e-05, + 1.30304378901134895e-05, + 7.49230356537863680e-06, + 3.66968010082313435e-06, +-6.46719700349871704e-07, +-4.73859717567130946e-06, +-6.26241323035529929e-06, +-5.63603201606933982e-06, +-4.37257206069719721e-06, +-3.24647479729261485e-06, +-2.41021778489303441e-06, +-1.81527615639324343e-06, +-1.39078990856415667e-06, +-1.08302599745401073e-06, +-8.55809820369377483e-07, +-6.85169069990799265e-07, +-5.55017764729520193e-07, +-4.54355665365782124e-07, +-3.75515790288987728e-07, +-3.13059179730083226e-07, +-2.63064792249011533e-07, +-2.22664088780260297e-07, +-1.89730173498278260e-07, +-1.62666517900237633e-07, +-1.40261050331774901e-07, +-1.21583893266230682e-07, +-1.05914710448775353e-07, +-9.26904367927170239e-08, +-8.14672305553397196e-08, +-7.18924749636276198e-08, +-6.36839646545177156e-08, +-5.66142854377971660e-08, +-5.04989866981541582e-08, +-4.51875502037597075e-08, +-4.05564396775264479e-08, +-3.65037117460882302e-08, +-3.29448082281861892e-08, + 5.16147948990091512e-07, + 5.39264842169543611e-07, + 2.06505478918847811e-07, +-2.43882237531325503e-07, +-4.00047873101585402e-07, +-2.75852966721673114e-07, +-2.35237765635903209e-07, +-2.93960145765959893e-07, +-1.87365651880985591e-07, +-1.09790760144168379e-08, + 7.21837536276873570e-08, + 7.84595313310737017e-08, + 6.12501161120431159e-08, + 4.39257033335781252e-08, + 3.11792221901732784e-08, + 2.24169709733147850e-08, + 1.64100252770715320e-08, + 1.22278782742780227e-08, + 9.26066674216161152e-09, + 7.11677337891634644e-09, + 5.54174587974746224e-09, + 4.36705308005309279e-09, + 3.47886485527181024e-09, + 2.79887841665743444e-09, + 2.27231916446635660e-09, + 1.86027856967045057e-09, + 1.53472640219796677e-09, + 1.27520586228752388e-09, + 1.06660746129434778e-09, + 8.97646761194834310e-10, + 7.59808724250438389e-10, + 6.46606048702490577e-10, + 5.53051766578650285e-10, + 4.75279937870807716e-10, + 4.10269989911949806e-10, + 3.55644309128182802e-10, + 3.09518292421062284e-10, + 2.70388282750241041e-10, + 2.37047089677475079e-10, + 2.08519804078414535e-10, + 8.32646879466781192e-09, +-7.72521731415367518e-09, +-2.34111712191198881e-08, +-1.75894655050918234e-08, + 1.79177852063353868e-09, + 6.85969619803260202e-09, +-2.90836102043888639e-09, + 1.28434851555461583e-10, + 9.18544302430104418e-09, + 6.94498145630586187e-09, + 1.69995308496239296e-09, +-5.99783144078211040e-10, +-9.49685360009283101e-10, +-7.55672283578196966e-10, +-5.26891346704357492e-10, +-3.59807096134147912e-10, +-2.48399316815856700e-10, +-1.74675395094000025e-10, +-1.25160667263657475e-10, +-9.12548136068314600e-11, +-6.75922124295939957e-11, +-5.07865361041195085e-11, +-3.86588311349621903e-11, +-2.97786707880123835e-11, +-2.31893488838192503e-11, +-1.82397719826767029e-11, +-1.44798291381985799e-11, +-1.15937299838548789e-11, +-9.35692060401100204e-12, +-7.60772575451332593e-12, +-6.22836096791043741e-12, +-5.13212034393198917e-12, +-4.25449213346170385e-12, +-3.54705767821734273e-12, +-2.97312620980591123e-12, +-2.50465531540781660e-12, +-2.12008184078324892e-12, +-1.80266983005470981e-12, +-1.53932730115025070e-12, +-1.31979240486912148e-12, +-4.12334662493704638e-10, +-8.32249104381363965e-10, +-2.91715694350293836e-10, + 7.13383413013564103e-10, + 6.69912050704267723e-10, +-2.61493418229584175e-10, +-2.88284643650595269e-10, + 4.58873579694527537e-10, + 1.43565708199307442e-10, +-2.37556249603385610e-10, +-1.61930712106591735e-10, +-4.18913690124972051e-11, + 2.89711064438854075e-12, + 1.02614488718447105e-11, + 8.34114636322757742e-12, + 5.67117309334619240e-12, + 3.74241970069279118e-12, + 2.49245238191435034e-12, + 1.69117105284820777e-12, + 1.17006192011906698e-12, + 8.24410725719056467e-13, + 5.90627804606061861e-13, + 4.29595030458584515e-13, + 3.16833351196425767e-13, + 2.36650572005183288e-13, + 1.78844263852378465e-13, + 1.36620778795994557e-13, + 1.05412344502368179e-13, + 8.20844596614638457e-14, + 6.44734550295877791e-14, + 5.10460021837528050e-14, + 4.07287925319158040e-14, + 3.27254063174135240e-14, + 2.64712973243116042e-14, + 2.15416951855307352e-14, + 1.76432427559246825e-14, + 1.45222236465426969e-14, + 1.20164665992078330e-14, + 9.99790632523811831e-15, + 8.35439989297946951e-15, +-2.16446712242708920e-11, +-1.43182044073012161e-12, + 3.70004702754000153e-11, + 2.35316494839041226e-11, +-2.55393222562676715e-11, +-2.80204134454832757e-11, + 2.65025738349476070e-11, + 1.01348225795512520e-11, +-2.18862193981356771e-11, +-3.11498571332024630e-12, + 5.29996741628984329e-12, + 2.82531513427696015e-12, + 6.79115628743772638e-13, + 5.90603226139676800e-15, +-1.01295480353983245e-13, +-8.33956930339726443e-14, +-5.53121357417231218e-14, +-3.53979789350669313e-14, +-2.28230209804344348e-14, +-1.49889635464739841e-14, +-1.00572069199990011e-14, +-6.86246818921250540e-15, +-4.77482261154371488e-15, +-3.36839672553083068e-15, +-2.41536032074308706e-15, +-1.75491330950190627e-15, +-1.28624414276189592e-15, +-9.50923227434942531e-16, +-7.18043771374597365e-16, +-5.48797036284611573e-16, +-4.24637268324317079e-16, +-3.25949067886918595e-16, +-2.52241943557899775e-16, +-1.97575959162424652e-16, +-1.56652398145656450e-16, +-1.20191943945138409e-16, +-9.64563582536290175e-17, +-8.42179435091739088e-17, +-6.11511372165967500e-17, +-5.00287699883904226e-17, +-1.33155940067663282e-14, + 1.24398762194504497e-12, + 6.67698316139616917e-13, +-1.38920635951037400e-12, +-1.19111242738678255e-12, + 1.20602053237274001e-12, + 1.21096029194303798e-12, +-1.72542120613219565e-12, + 1.18576652478125396e-13, + 5.89888570947521322e-13, +-2.51429669502628510e-16, +-9.48237397995618435e-14, +-3.89915709541879766e-14, +-8.47366918965475625e-15, +-2.82504284258672227e-16, + 9.40037139145307971e-16, + 7.73298772738985399e-16, + 4.90761470684512399e-16, + 3.03507075488001839e-16, + 1.95125233987099317e-16, + 1.22746818018734745e-16, + 8.57739343607278230e-17, + 5.03765846987971878e-17, + 3.92873675710472466e-17, + 2.49337014486343484e-17, + 1.91520024858615085e-17, + 1.24094894283536757e-17, + 9.68029048888170353e-18, + 7.08799660743896696e-18, +-2.84853175118942015e-19, +-5.59731703199314345e-18, +-4.24410588817470708e-18, +-1.39189132903641544e-18, +-1.14218710363758525e-19, +-9.20266613716648819e-20, + 2.57182599084725298e-18, + 5.83996041321707165e-19, +-2.28185101687053676e-18, + 2.63448206221595356e-18, + 2.14446601649688811e-18, + 3.03025580455304840e-14, + 2.34670929296694652e-14, +-5.48782392110314974e-14, +-3.60521412301565568e-14, + 4.44066487222357400e-14, + 6.89123585969857480e-14, +-8.68952100642789537e-14, +-9.77080534405359879e-15, + 5.66711528129629101e-14, +-1.75641925896830143e-14, +-8.97005372695837008e-15, + 1.13984943292343399e-15, + 1.33401161347544255e-15, + 4.48388947967212108e-16, + 8.81505577877212610e-17, + 7.59383743626798426e-18, +-3.52536015964901327e-19, +-4.57513500097496070e-18, +-2.81458809197668384e-18, + 1.13898614157068246e-18, + 3.80343952165578116e-19, + 6.41224941671846680e-18, +-7.37051582198231654e-19, + 2.63171371674651827e-18, +-4.23144339674723191e-19, + 6.25304648600216513e-19, + 4.30008698725441146e-18, + 5.25232106067885643e-18, + 3.78661951879353260e-18, +-1.62512161089933199e-18, +-1.92523010307746849e-18, +-1.75852859346953007e-18, +-1.49315511119061818e-18, +-1.55635209412800814e-18, +-2.84070777317386636e-18, + 4.53070282860851230e-18, + 5.28136459599515261e-19, +-1.31970389378174473e-18, + 1.58342456358634682e-18, + 2.52851916940691608e-18, + 8.60332368095713625e-16, +-1.46889576602714368e-15, +-1.34462352229778882e-15, + 1.97310306521595017e-15, + 1.69509829437104237e-15, +-1.49173404163820905e-15, +-3.57130656650258742e-15, + 5.35216631333235774e-15, +-2.09504563349356439e-15, +-5.42261048396226520e-16, + 4.56542476741939446e-16, + 8.32032620767091011e-17, +-1.93176703355587363e-17, +-1.10504955198977357e-17, +-6.77097197628706674e-19, + 5.32078442430421791e-18, + 1.19606377916496824e-17, +-2.16706875239847154e-18, + 7.93359835006203095e-19, + 6.61151031513513467e-18, + 1.90189469072726276e-18, + 4.15274349556315257e-18, +-1.74017048960304481e-19, + 5.89233450228148949e-19, + 1.04929813666878886e-19, + 2.08813812606951296e-18, + 1.87871353109634359e-18, + 9.13822695744961848e-19, +-7.86613206519958960e-19, +-4.15609852806037919e-18, +-2.67811078225683651e-18, +-1.13547474691416916e-18, +-2.55706556734143352e-18, + 1.83544083212001465e-18, +-1.50477199819012281e-18, + 2.88303085906878698e-18, + 3.69323592754835501e-18, +-2.05277931138135302e-18, + 5.80188617906748485e-18, + 3.70340170062764359e-18, +-7.87545333184012935e-19, +-5.40643366387962472e-17, + 1.08395162583133963e-16, + 5.57843977171747762e-17, +-3.41905898106566002e-17, +-1.63296091946362650e-16, + 1.76462169775856406e-16, +-7.58809832011106022e-17, +-9.78872816781825769e-17, + 5.05061736820840237e-17, +-8.25960138074401773e-18, +-9.06663362519727562e-19, +-4.81196019876812689e-19, + 1.40882971106330788e-17, + 9.67649164933441502e-18, + 9.93512330063194348e-18, + 8.55944570794498822e-18, + 3.54825598077338025e-18, + 5.08742908710829306e-18, + 4.09424870956701272e-18, + 6.67196427410741799e-18, + 6.00498650800008926e-18, + 4.93482879254446919e-18, + 5.59055421370576596e-18, + 1.81029557362684432e-19, + 5.34884353508901911e-18, + 2.97326965695556948e-18, + 2.86349396205377946e-18, + 2.97702486825092558e-18, +-1.58578935344980733e-18, +-2.35609792240719950e-18, + 1.12939273936452375e-18, +-9.09615436939989869e-19, + 1.50257168763018194e-18, + 3.55266412490924591e-19, + 5.43693363853715039e-18, + 2.26878887694757206e-18, +-3.71463941589964427e-19, + 1.33137520433733235e-18, + 2.47480333814125055e-18, +-5.46309360133270766e-18, +-1.86937957465602876e-17, +-7.87542929591231065e-18, +-2.55882496839932246e-17, +-6.26989420884607814e-18, +-1.36315794409687118e-17, + 1.58312452384358323e-18, +-2.13594738254737274e-17, +-4.77940371814324389e-18, +-4.79005938048264495e-18, + 5.53535371809275468e-18, + 1.66874040985087770e-18, + 6.39101764128757200e-18, +-2.65591401123223102e-18, + 1.51865590896076051e-19, + 4.14718880581685356e-18, + 1.38243319341674504e-18, + 6.61846941786572167e-18, + 5.00957721178550048e-19, + 5.22647661398562815e-18, + 1.45321451769651664e-18, + 1.97054922947879646e-18, +-2.88462479957765022e-19, + 1.46458727867665348e-18, + 5.04543172965997105e-20, +-1.44995681223369857e-18, + 3.33681650432580994e-18, + 2.66129437423382164e-18, + 3.16943152794390602e-18, + 1.01988819155760809e-18, + 1.18024492550689990e-18, +-3.33474102869645832e-18, + 4.78866215617298035e-18, + 2.36686378668955600e-18, +-3.34770274154305366e-19, + 2.20527396418138243e-18, + 2.09171020217133309e-18, +-1.06987574386239645e-18, + 5.17169170945097885e-19, + 1.26777319053974482e-19, + 7.03004481475566700e-18, + 3.44346454663386968e-18, + 2.62389923814733633e-18, +-1.85482093386801085e-18, +-2.23333685393053075e-18, +-1.55277585225534895e-18, +-1.67647275050673708e-17, +-5.94721343976185615e-18, +-1.14424911427098900e-17, + 1.50864572819594218e-18, +-1.35966818262499850e-18, + 1.79814543900349854e-18, + 6.83267311556894763e-19, + 1.94521531198816312e-18, +-6.19947880005075385e-18, +-1.45613928611950281e-18, +-3.56336340800886135e-18, +-1.97729669553003225e-18, +-4.31798861537216915e-18, +-4.14939865773581526e-18, +-6.78518120033387614e-18, + 1.77516329591610797e-18, + 4.30547655901307669e-19, +-8.17803743641962615e-19, +-4.77563158831180378e-18, +-4.49824373987282431e-18, +-4.99552669727618457e-18, +-6.39916231580227557e-18, +-5.45937708452326597e-18, +-5.59969757681559721e-18, +-6.95141105139439339e-18, +-4.40266765193380084e-18, +-3.33880775646761054e-18, +-2.69613058494432270e-18, +-5.83834972232374647e-18, +-2.99020103835413254e-18, +-1.43723415649084070e-19, +-7.68965350899464016e-18, +-3.51477038157400585e-18, +-4.71898446210499714e-19, + 7.70278997764333034e-02, + 1.66304001032163244e-02, + 4.68859181652936819e-03, + 1.75766651918277356e-03, + 8.63897454463723028e-04, + 5.34841721868408674e-04, + 3.95700293075169408e-04, + 3.30952887062710909e-04, + 2.97557188764918299e-04, + 2.77334903160330009e-04, + 2.62692533987596733e-04, + 2.50745415728045493e-04, + 2.40442719301039277e-04, + 2.31346772085425247e-04, + 2.23217519889884534e-04, + 2.15890633627870707e-04, + 2.09241404391602898e-04, + 2.03171250388010249e-04, + 1.97600670871592740e-04, + 1.92464672488501076e-04, + 1.87709521007313777e-04, + 1.83290349097106354e-04, + 1.79169358937992276e-04, + 1.75314451291350273e-04, + 1.71698166195905259e-04, + 1.68296854852387028e-04, + 1.65090025325712400e-04, + 1.62059820523071296e-04, + 1.59190597958376823e-04, + 1.56468588646426762e-04, + 1.53881618097495901e-04, + 1.51418876476900206e-04, + 1.49070728006992127e-04, + 1.46828551930466768e-04, + 1.44684609038154584e-04, + 1.42631929042030125e-04, + 1.40664215051753349e-04, + 1.38775762167273845e-04, + 1.36961387786441988e-04, + 1.35216371685839917e-04, +-5.79000534601818023e-02, +-1.08017225471116699e-02, +-2.47871456545210476e-03, +-7.06011024081691597e-04, +-2.45174854679468441e-04, +-9.94384506323734633e-05, +-4.47731303247976995e-05, +-2.19648015106413369e-05, +-1.22980007352918491e-05, +-8.28206051075586508e-06, +-6.49149579993441300e-06, +-5.50282539116042503e-06, +-4.82031288108873842e-06, +-4.28747962728510275e-06, +-3.85013189648355530e-06, +-3.48316782849109333e-06, +-3.17114957460250264e-06, +-2.90311396784871870e-06, +-2.67082825834818446e-06, +-2.46795224702168067e-06, +-2.28952362423626628e-06, +-2.13160741216961395e-06, +-1.99104722480617956e-06, +-1.86528487034187597e-06, +-1.75222737993098454e-06, +-1.65014761600504495e-06, +-1.55760903855258575e-06, +-1.47340809788185298e-06, +-1.39652965443704495e-06, +-1.32611214076859101e-06, +-1.26142008900999756e-06, +-1.20182228362821651e-06, +-1.14677425097455646e-06, +-1.09580412173335835e-06, +-1.04850113818379863e-06, +-1.00450625133336760e-06, +-9.63504381354858394e-07, +-9.25218010824252582e-07, +-8.89401852763874487e-07, +-8.55838390671804544e-07, + 1.23799629429517891e-02, + 2.06674101678788313e-03, + 4.11861186508673488e-04, + 9.96282798510813705e-05, + 2.93278768117615113e-05, + 1.03606744352932634e-05, + 4.20312414443210958e-06, + 1.79478545098248167e-06, + 7.47837001195537058e-07, + 3.15236631595615163e-07, + 1.56160275907217876e-07, + 9.88905151369704780e-08, + 7.41719214813332108e-08, + 5.99058252550382267e-08, + 4.98586216991740074e-08, + 4.21555984932875516e-08, + 3.60457844989748550e-08, + 3.11116061392392739e-08, + 2.70743840865240795e-08, + 2.37343781259866887e-08, + 2.09440104323769498e-08, + 1.85922185114363515e-08, + 1.65941945105154015e-08, + 1.48843469541717349e-08, + 1.34113581920164780e-08, + 1.21346534149352318e-08, + 1.10218405742411737e-08, + 1.00468292897343965e-08, + 9.18843163199214612e-09, + 8.42930951110357620e-09, + 7.75517448302083249e-09, + 7.15417350379568678e-09, + 6.61641313512873568e-09, + 6.13358786764041223e-09, + 5.69868747391435638e-09, + 5.30576487232137451e-09, + 4.94975070349216920e-09, + 4.62630424460424022e-09, + 4.33169279678517002e-09, + 4.06269353628926758e-09, +-1.89128419049278758e-03, +-2.88643325203592023e-04, +-5.13337887144790607e-05, +-1.08309691882717449e-05, +-2.73005542186515044e-06, +-8.23037857537293008e-07, +-2.99505058103329264e-07, +-1.27735980852228707e-07, +-5.51671631252993432e-08, +-2.11949072342086389e-08, +-7.47193471990038367e-09, +-2.89187970946095193e-09, +-1.47475813053997205e-09, +-9.70792883133664690e-10, +-7.24710465252514848e-10, +-5.68097618283947313e-10, +-4.55438356895536325e-10, +-3.70484242502773148e-10, +-3.04952939479343502e-10, +-2.53615574765206318e-10, +-2.12878037612823029e-10, +-1.80182039380032738e-10, +-1.53669319626903745e-10, +-1.31968678857093128e-10, +-1.14054285905001798e-10, +-9.91490546726702904e-11, +-8.66575639260884045e-11, +-7.61187654831854274e-11, +-6.71721746528063128e-11, +-5.95333869598841157e-11, +-5.29761369600216828e-11, +-4.73190051477701218e-11, +-4.24154669219804485e-11, +-3.81463719881727631e-11, +-3.44142088047298062e-11, +-3.11386943122106925e-11, +-2.82533548656519396e-11, +-2.57028564322799028e-11, +-2.34409051159092109e-11, +-2.14285848321675720e-11, + 2.27373276201089323e-04, + 3.22299053543628961e-05, + 5.22115857094965728e-06, + 9.85031445992307913e-07, + 2.18475341319667080e-07, + 5.66309370892058530e-08, + 1.70879867548482698e-08, + 6.48829349743075470e-09, + 3.05879224650181828e-09, + 1.34745320177476225e-09, + 4.81271378701439327e-10, + 1.49073894101974743e-10, + 4.81677449040118652e-11, + 2.03500012876114002e-11, + 1.17938087312545156e-11, + 8.16639455929158947e-12, + 6.06293473339096920e-12, + 4.63558023292086915e-12, + 3.60704693313936060e-12, + 2.84559228538214652e-12, + 2.27191630847613848e-12, + 1.83349981243454500e-12, + 1.49419424328579168e-12, + 1.22857266129189868e-12, + 1.01844922590771372e-12, + 8.50626153793224592e-13, + 7.15398138061400167e-13, + 6.05540874222131916e-13, + 5.15616081573153816e-13, + 4.41487304677719467e-13, + 3.79977654621707912e-13, + 3.28625171201277773e-13, + 2.85505842316777248e-13, + 2.49104150776162987e-13, + 2.18217644270935097e-13, + 1.91885398251648357e-13, + 1.69334656529602404e-13, + 1.49940097666296954e-13, + 1.33192653863913669e-13, + 1.18675769621053028e-13, +-2.26792079826604019e-05, +-3.02189088545371034e-06, +-4.52668830663174156e-07, +-7.76972736840835631e-08, +-1.54924668895793927e-08, +-3.60132037883480089e-09, +-9.40191772944214004e-10, +-2.66978927116895923e-10, +-1.12822413700710237e-10, +-6.21708108985420843e-11, +-2.69860917254713899e-11, +-8.84424997427172441e-12, +-2.46443197975000809e-12, +-6.97700346434021800e-13, +-2.53755777227099239e-13, +-1.31235207686240239e-13, +-8.47975309600901875e-14, +-5.99408931783098827e-14, +-4.39263144086306902e-14, +-3.28461295803377583e-14, +-2.49403577941123154e-14, +-1.91905319070139740e-14, +-1.49438120313124821e-14, +-1.17642854440533363e-14, +-9.35408027182657103e-15, +-7.50624996233583218e-15, +-6.07467425834941405e-15, +-4.95481591619581952e-15, +-4.07095802573148602e-15, +-3.36751080427981853e-15, +-2.80329673319541305e-15, +-2.34745943844707780e-15, +-1.97667900952013018e-15, +-1.67318511262604357e-15, +-1.42322444012883506e-15, +-1.21622611066137837e-15, +-1.04389341746035961e-15, +-8.99663824138570410e-16, +-7.78422872379047321e-16, +-6.76030200114988335e-16, + 1.94025843419259673e-06, + 2.45329868722452703e-07, + 3.43855158770733101e-08, + 5.44179325374373951e-09, + 9.86612092739812205e-10, + 2.07621510755894067e-10, + 5.13085605585537709e-11, + 1.25920538093899362e-11, + 2.87070144060357025e-12, + 1.75587029567174962e-12, + 1.11294497894089114e-12, + 4.49251104235307673e-13, + 1.33804219788480737e-13, + 3.40556251740417502e-14, + 8.72781207406688773e-15, + 2.83175650664559849e-15, + 1.33211784497626281e-15, + 8.09963944040610472e-16, + 5.48021538335681277e-16, + 3.86635320414032869e-16, + 2.78928191716246484e-16, + 2.04591610877664401e-16, + 1.52238426350423617e-16, + 1.14725234001177910e-16, + 8.75088865133387868e-17, + 6.74713285525019766e-17, + 5.25366913313199763e-17, + 4.13060476292302162e-17, + 3.27486689468639073e-17, + 2.61642404976163528e-17, + 2.10675125607235210e-17, + 1.70805689844805787e-17, + 1.39491232569029741e-17, + 1.14329669843089695e-17, + 9.45903997058870398e-18, + 7.86179262291690490e-18, + 6.55222582959109319e-18, + 5.51018809990815652e-18, + 4.63383310565224274e-18, + 3.92048510062311623e-18, +-1.45657560072628269e-07, +-1.76106003405232288e-08, +-2.33166236547075581e-09, +-3.44100019326538256e-10, +-5.74435181833778308e-11, +-1.09170888120306820e-11, +-2.45455107194668298e-12, +-6.86167230275766032e-13, +-1.11487768522275167e-13, +-1.54550711741047717e-14, +-2.78175511354677487e-14, +-1.74194478815432563e-14, +-6.26665039100382797e-15, +-1.69667585754430455e-15, +-3.99362910607036024e-16, +-9.47627693560733582e-17, +-2.82448863832150081e-17, +-1.23372645094002540e-17, +-7.12700294413473728e-18, +-4.64148288246713931e-18, +-3.16498275965447886e-18, +-2.21296729728777691e-18, +-1.56325663421105500e-18, +-1.13650138514290522e-18, +-8.22840950882460104e-19, +-6.17531911859075252e-19, +-4.55885207040492367e-19, +-3.28610139064321718e-19, +-2.60120769232492037e-19, +-2.08279787784907398e-19, +-1.56560173596784611e-19, +-1.20518296144322573e-19, +-8.79505206028450645e-20, +-8.63289354117305002e-20, +-6.18523861423724471e-20, +-4.64812366465679588e-20, +-3.65086512569547711e-20, +-1.97129919807518376e-20, +-2.92063549726195982e-20, +-2.62771761350507934e-20, + 9.75564656971354749e-09, + 1.13490887384757095e-09, + 1.43059633297719760e-10, + 1.98682092753198404e-11, + 3.08841999962081108e-12, + 5.42227065250146955e-13, + 1.03925223806879107e-13, + 2.86144700811469790e-14, + 8.71140902439080164e-15, +-3.05642968624596143e-16, + 1.89621633464384511e-17, + 4.41769403936747128e-16, + 2.33626648567741304e-16, + 7.40119835590369218e-17, + 1.83490004105852423e-17, + 4.04262999922728875e-18, + 9.01995972797537924e-19, + 2.52350747776172190e-19, + 1.10236318639739347e-19, + 5.77574227646283316e-20, + 4.21675772903992556e-20, + 2.78449521404680429e-20, + 2.13299186411103689e-20, + 6.72950663541947853e-21, + 6.75950513963148897e-21, + 4.34629465060029550e-21, + 2.34996348988033378e-21, + 1.48787395835565660e-20, + 6.53264013505656422e-21, +-1.37105073898332243e-21, + 4.02517411419797903e-22, +-2.47642961722917940e-21, + 1.37288359079751362e-20, +-1.26154690613649437e-20, +-1.74995899998289301e-21, + 3.78877154221869897e-21, +-5.05427195339856555e-21, + 9.59348381683441619e-21, + 6.61154176294405154e-21, + 4.07022174200493881e-22, +-5.90357706047217820e-10, +-6.64259095397274340e-11, +-8.02414529086812193e-12, +-1.05685168288351697e-12, +-1.54073657785375918e-13, +-2.53355222807226667e-14, +-4.59024795557534107e-15, +-7.49139502719780860e-16, +-4.45841506773245806e-16, +-6.11269964047249522e-17, + 2.81406947719008486e-17, +-2.07059100469280694e-18, +-6.25149211027073162e-18, +-2.65443387140250012e-18, +-7.38455698973713319e-19, +-1.67949920538713542e-19, +-2.91305214972304276e-20, +-3.05432092714895463e-21, +-2.93590568584155348e-21, +-1.64581735756428745e-22, + 3.01057093248150223e-21, + 2.89825968609489561e-21, + 1.10210923183427789e-20, +-9.24690357506902690e-21, + 3.87229951171320511e-21, +-4.13138476382104638e-22, + 6.71925710381413494e-21, + 1.22409308752895526e-20, + 5.78319708349336700e-21, +-1.45498786608963493e-21, +-6.90105678718023069e-22, +-5.69051889630612910e-23, + 1.41285831089251313e-20, +-1.01520141989521616e-20, + 5.54419770293815488e-21, + 8.05405799208788259e-21, +-1.62537625854345185e-21, + 1.35923322361340958e-20, + 2.67615633590167157e-21, +-1.97746236835274854e-21, + 3.26010957757466138e-11, + 3.56337227876324011e-12, + 4.14782997128859366e-13, + 5.21577055361203648e-14, + 7.18705774327409943e-15, + 1.09638464025413414e-15, + 2.03086589608397772e-16, + 2.44734569759167354e-17, + 7.40553574580895022e-18, + 6.92746408883681912e-18, +-6.43322796107554372e-19, +-4.05569976193936150e-19, + 9.10803381139794042e-20, + 7.54463701939706337e-20, + 2.72870898151402552e-20, + 7.02033016008224490e-21, +-1.52052776998584373e-22, + 4.03619966858125631e-21, + 6.84930924791950361e-22, + 1.25800783299172064e-21, + 2.01258163140303348e-21, + 4.55423060365647814e-21, + 5.66337866842385612e-24, +-4.01991225335396887e-21, +-9.05785930267461374e-22, + 4.57014042145684815e-21, +-8.00670893419750989e-23, + 7.13567640745473791e-21, + 1.49511634049920379e-21, +-4.87586430409495830e-21, + 9.87223548156962017e-22, + 1.12137480012444037e-21, + 2.17418232248922750e-21, +-5.20346972269793416e-21, + 2.60375538226940298e-21, + 1.84042842051644159e-21, + 2.26630624215555004e-21, + 9.90747987877603329e-21, +-6.92011083605249012e-22, +-4.26011885269458803e-22, +-1.65617121776465714e-12, +-1.76496957087446700e-13, +-1.98894949955767216e-14, +-2.40140766535792723e-15, +-3.15163548369493711e-16, +-4.52720920872465144e-17, +-7.21554855505324986e-18, +-1.90625804518757285e-18, + 3.10841657074798177e-19, +-2.62851418542521158e-19, +-3.65543293113877087e-20, + 1.52553504325598840e-20, + 5.18745569151433775e-21, + 9.60250895476763887e-21, + 7.30435614951147257e-21, + 3.43606407047461995e-21, + 1.12707223613282318e-20, + 3.62402391891844717e-21, + 8.76321492141530581e-21, + 4.47774855269733774e-21, + 2.57450015985747348e-21, + 5.53457884639434051e-21, + 8.47440173032627075e-21, +-8.21352400666969731e-22, + 1.79508241036290078e-21, + 3.19750702773801343e-21, +-3.17906952022314078e-21, + 1.29196716839085447e-20, + 5.21775434304109040e-21, +-3.54864617306511837e-21, + 3.70414129878490010e-21, + 1.54117863314846313e-21, + 1.21102494482615264e-20, +-1.87509238095377740e-21, + 6.04058268955990862e-21, + 4.49763354615243192e-21, +-3.69060505340536539e-22, + 4.99330786156887435e-21, + 1.78055742693181369e-21, +-3.42983784731070521e-21, + 7.78956632014402071e-14, + 8.11884560525017913e-15, + 8.88531034599389685e-16, + 1.03237904750855105e-16, + 1.29364706036602551e-17, + 1.77777888522152844e-18, + 2.22255252313806410e-19, + 7.74315267810022535e-20, + 4.64563523830035995e-22, +-1.34040368845422893e-21, + 1.57888684470596773e-20, + 5.33214652849828637e-21, + 7.06805013095119717e-21, + 2.73963532376061057e-21, + 3.95236648137794059e-21, +-1.18526799773111071e-21, + 2.73521897462140211e-21, +-3.46337360324347825e-21, + 5.38762677019113027e-23, +-4.20332764820757135e-21, + 2.48399513931881550e-21, +-4.64174517248843137e-22, + 1.23874386495068555e-21, + 2.25770951425514550e-21, + 2.65697448021149792e-21, +-3.29706790592540452e-21, + 8.21193966665353765e-21, + 1.25747783863821562e-20, + 4.03975227457446028e-21, + 4.32918217024189232e-21, +-2.40615226682213151e-21, +-5.52677836548214698e-22, + 7.91006365102494210e-21, + 1.03812909580633926e-21, + 8.30955418002325593e-22, + 4.79405607252281599e-21, +-4.03016918843513842e-21, +-2.46704271064139152e-21, +-1.58270685856933145e-21, +-1.47402233887739719e-21, +-3.44445003426361509e-15, +-3.55220563009785414e-16, +-3.83057908174441340e-17, +-4.49258572537964489e-18, +-5.93754429674906066e-19, +-1.20428314269541758e-19, +-1.93276660476175994e-20, +-8.20974516105415664e-21, +-4.82629461667296493e-21, + 2.57115526596548278e-21, +-2.33800874310705766e-21, +-8.38549855392048306e-21, + 5.82807633258800186e-22, +-5.07207809935705153e-21, + 1.07540921139347429e-21, +-5.95197177810838078e-21, +-1.53637054926874875e-21, +-2.73097080194047084e-21, + 1.15155843259746930e-21, +-2.03404598003777826e-21, + 3.42778114847862136e-21, +-3.21749780120914201e-21, + 5.16936725987325943e-21, + 2.37332773890788851e-22, + 3.24554683509651275e-21, +-1.77492253321104171e-22, +-2.31576218063642799e-21, +-1.70895046088109712e-21, + 1.80118799856649382e-21, +-2.54237416791126993e-21, +-3.89429847272950290e-21, +-6.57764455912580172e-21, +-3.44559342182450162e-22, +-5.75560857015449594e-21, +-6.60815737559437754e-21, +-4.33398083731890378e-21, +-4.91089218944758290e-21, +-2.61689613436836371e-21, + 3.20514754798899440e-21, +-1.23168090349937059e-21, +// root 2 + 4.32474972858888196e-01, + 3.76664105091336188e-01, + 3.26147216985875565e-01, + 2.81997470110465775e-01, + 2.44260976628909804e-01, + 2.12384246179329161e-01, + 1.85638640736477095e-01, + 1.63375893063681971e-01, + 1.45030872441871822e-01, + 1.30007538546605850e-01, + 1.17670221838013817e-01, + 1.07434176014949048e-01, + 9.88283233818597062e-02, + 9.14978346811136378e-02, + 8.51799464253671507e-02, + 7.96785593109881202e-02, + 7.48449762690165110e-02, + 7.05645206697953914e-02, + 6.67473543448262874e-02, + 6.33221002619373391e-02, + 6.02313315286556183e-02, + 5.74283213131178763e-02, + 5.48746610827314171e-02, + 5.25384880495502471e-02, + 5.03931474350444997e-02, + 4.84161699792074601e-02, + 4.65884812843768356e-02, + 4.48937838912196810e-02, + 4.33180696014681121e-02, + 4.18492311008353893e-02, + 4.04767500640611511e-02, + 3.91914447266772104e-02, + 3.79852641016143883e-02, + 3.68511190842209096e-02, + 3.57827429540558545e-02, + 3.47745754717857236e-02, + 3.38216660423232146e-02, + 3.29195923823743450e-02, + 3.20643918713107295e-02, + 3.12525033361030005e-02, +-2.89415222159651077e-02, +-2.67484995520447869e-02, +-2.37141285687993385e-02, +-2.04365190304314562e-02, +-1.73319543515845879e-02, +-1.45846835478889887e-02, +-1.21945220899760398e-02, +-1.00964789294345388e-02, +-8.27958988060201358e-03, +-6.77769783620947846e-03, +-5.59052812067051090e-03, +-4.67001529220038587e-03, +-3.95411947681801809e-03, +-3.38987060399047104e-03, +-2.93809714771966352e-03, +-2.57094268848066364e-03, +-2.26855014450688111e-03, +-2.01654073709735477e-03, +-1.80431209820707829e-03, +-1.62391055446870218e-03, +-1.46927541106278594e-03, +-1.33572298125906133e-03, +-1.21958749789883420e-03, +-1.11796670966231564e-03, +-1.02853868628404333e-03, +-9.49427931080636177e-04, +-8.79106195864884474e-04, +-8.16318086085111058e-04, +-7.60024619286278603e-04, +-7.09359950495552934e-04, +-6.63597867380337296e-04, +-6.22125613248133329e-04, +-5.84423261790939551e-04, +-5.50047337522007428e-04, +-5.18617711629203019e-04, +-4.89807045493265494e-04, +-4.63332231109393397e-04, +-4.38947408072483001e-04, +-4.16438233772912147e-04, +-3.95617156193455105e-04, + 1.96206535638989799e-04, + 3.40983131895398789e-04, + 4.06260750162628444e-04, + 4.05484240238812197e-04, + 3.67393998959153500e-04, + 3.19687339121626265e-04, + 2.79345248049565767e-04, + 2.45317614102152481e-04, + 2.08065089525476341e-04, + 1.67405223792957202e-04, + 1.30353999510965764e-04, + 1.00951063733375405e-04, + 7.89938315338729343e-05, + 6.27756519100472878e-05, + 5.06684202620993080e-05, + 4.14770703420277919e-05, + 3.43797868389518133e-05, + 2.88135951678307365e-05, + 2.43870486613377009e-05, + 2.08227889956361234e-05, + 1.79206583671062015e-05, + 1.55337631461415343e-05, + 1.35526455712223257e-05, + 1.18946091742291453e-05, + 1.04963857491313416e-05, + 9.30901181055235823e-06, + 8.29419292389490470e-06, + 7.42168692312025636e-06, + 6.66739569924764497e-06, + 6.01195680459011663e-06, + 5.43969227883707770e-06, + 4.93781591057458806e-06, + 4.49582959339960674e-06, + 4.10505950747043750e-06, + 3.75829671806996263e-06, + 3.44951647230811607e-06, + 3.17365732540096707e-06, + 2.92644612386916483e-06, + 2.70425840670697709e-06, + 2.50400636057105465e-06, + 1.50440958043994177e-05, + 8.77444597904378762e-06, + 2.31912150683509681e-06, +-2.05305548619358935e-06, +-3.92377284700618069e-06, +-3.79072382569161585e-06, +-2.96085095449180561e-06, +-2.86974124181016988e-06, +-3.33260681740784904e-06, +-3.33451534055754267e-06, +-2.78869509200202151e-06, +-2.11918000807768084e-06, +-1.56459104683576036e-06, +-1.15994450200273970e-06, +-8.73346041176361796e-07, +-6.69078163240623598e-07, +-5.21013285931690168e-07, +-4.11705069753562576e-07, +-3.29614672409501366e-07, +-2.67002694120616354e-07, +-2.18577121881557535e-07, +-1.80649580941041010e-07, +-1.50603546052852299e-07, +-1.26552719483122230e-07, +-1.07117131582852044e-07, +-9.12735954436460004e-08, +-7.82540682619715434e-08, +-6.74754580632908651e-08, +-5.84904281842905999e-08, +-5.09524460672547884e-08, +-4.45906377056731395e-08, +-3.91914839163998784e-08, +-3.45853511570681560e-08, +-3.06364787333038756e-08, +-2.72354643976760869e-08, +-2.42935743812708730e-08, +-2.17383988021466269e-08, +-1.95105079980893522e-08, +-1.75608600209441594e-08, +-1.58487764103084307e-08, +-3.09071319819855122e-07, +-4.33705071279707641e-07, +-3.50429723481392749e-07, +-1.93346246736824255e-07, +-4.52489165831138228e-08, + 4.84113553239363685e-08, + 3.80245706766616931e-08, +-2.34907685669645743e-08, +-2.15928072806959834e-08, + 2.11460985972261073e-08, + 4.20419118435452378e-08, + 3.93622271484979732e-08, + 2.97732070317760186e-08, + 2.11839192930214068e-08, + 1.50076921787430950e-08, + 1.07853706730113128e-08, + 7.89455200042134266e-09, + 5.88249512900511630e-09, + 4.45503688841928303e-09, + 3.42367033139933322e-09, + 2.66597068019695354e-09, + 2.10086054967240990e-09, + 1.67357936373662067e-09, + 1.34645792347639006e-09, + 1.09314578817053804e-09, + 8.94925202250076695e-10, + 7.38311641518594906e-10, + 6.13463962041265579e-10, + 5.13113417691174750e-10, + 4.31831409384942226e-10, + 3.65521590903214946e-10, + 3.11063121128909528e-10, + 2.66056905893122857e-10, + 2.28643176467117083e-10, + 1.97368802676900771e-10, + 1.71089995763559338e-10, + 1.48900129742830667e-10, + 1.30075834737224867e-10, + 1.14036366817361097e-10, + 1.00312734187018921e-10, +-1.25747100979621069e-08, +-3.46149070037562202e-11, + 7.07479493498547625e-09, + 8.00560706957404500e-09, + 6.50618385224803573e-09, + 2.31498598049912364e-09, +-2.91905576844741634e-09, +-2.00900339236773336e-09, + 1.83862618883366693e-09, + 1.83797364868489939e-09, + 3.02566001708817820e-10, +-4.16910744493872192e-10, +-4.83157781278972136e-10, +-3.68259604463997433e-10, +-2.54246008160572970e-10, +-1.73210564806692594e-10, +-1.19514573707027439e-10, +-8.40335071774156701e-11, +-6.02114180234200769e-11, +-4.39000419254898548e-11, +-3.25166257519950822e-11, +-2.44319086337976045e-11, +-1.85976236695574179e-11, +-1.43256449642288850e-11, +-1.11557141826393736e-11, +-8.77461607119643511e-12, +-6.96582413018748818e-12, +-5.57740127621620912e-12, +-4.50134113927943810e-12, +-3.65984774940484225e-12, +-2.99627714077497142e-12, +-2.46890612888646087e-12, +-2.04671176327317808e-12, +-1.70638332557690046e-12, +-1.43028397452791344e-12, +-1.20491779795169989e-12, +-1.01990839214234916e-12, +-8.67209827086823303e-13, +-7.40527017094670505e-13, +-6.34912346306672908e-13, + 4.89405479011243298e-10, + 4.58790634671113671e-10, + 1.37044015136378480e-10, +-2.62721218956052803e-11, +-1.06058829118234246e-10, +-2.39495970976760704e-10, +-1.27275060903371744e-10, + 1.72208841683295042e-10, + 8.89738727784275986e-11, +-6.10330195755305691e-11, +-5.09315281015549046e-11, +-1.21367037768757798e-11, + 3.20436593824975328e-12, + 5.28315205422488287e-12, + 4.07201727855734020e-12, + 2.73757657847310337e-12, + 1.80174735131007734e-12, + 1.19924340044156096e-12, + 8.13601134577262356e-13, + 5.62884252180279822e-13, + 3.96597264950103604e-13, + 2.84132255827835835e-13, + 2.06664855730108580e-13, + 1.52417520708410839e-13, + 1.13843849535744552e-13, + 8.60369801490041179e-14, + 6.57198465765708238e-14, + 5.07100210994684073e-14, + 3.94872090754961737e-14, + 3.10181933931720620e-14, + 2.45627845464741076e-14, + 1.95989690433174370e-14, + 1.57428134996754020e-14, + 1.27378139200158264e-14, + 1.03653052910346515e-14, + 8.48635560404696226e-15, + 6.98775833549661563e-15, + 5.78215099644475705e-15, + 4.80696198805419170e-15, + 4.02113741443622337e-15, + 1.04463349955576758e-11, +-1.01282968220278219e-11, +-9.73667540167299242e-12, +-2.76923694945455181e-12, +-4.17859116582044448e-12, +-3.02090212235785648e-12, + 1.12694884075748602e-11, + 4.91802958888373136e-12, +-7.55419827708415433e-12, +-1.95122982996112827e-12, + 1.57435192499752911e-12, + 9.65622917359220753e-13, + 2.24605696725105931e-13, +-1.83398393697113049e-14, +-5.25529109374059576e-14, +-4.07540484100418774e-14, +-2.67077029311774372e-14, +-1.70367747833380610e-14, +-1.09790985296275353e-14, +-7.21475520849519161e-15, +-4.83780670043233228e-15, +-3.30196583006311583e-15, +-2.29848643034739487e-15, +-1.62191313146853103e-15, +-1.16342946251021156e-15, +-8.43027496308915161e-16, +-6.20655310044629380e-16, +-4.58243405199727064e-16, +-3.47200272431832263e-16, +-2.63268664876149656e-16, +-2.00605884191716719e-16, +-1.54260952016001434e-16, +-1.20457897692067956e-16, +-9.30831898182056790e-17, +-7.39360571863338608e-17, +-5.81140206864740568e-17, +-4.56027401903560720e-17, +-3.81161124797560367e-17, +-3.10776819640016193e-17, +-2.17914107077427273e-17, +-7.77978072875231786e-13, +-3.31673348316466577e-13, + 2.46070487186596553e-13, + 9.98975873670831516e-14, +-1.22965128103835475e-13, + 3.04070095681431985e-13, + 3.19693973445840717e-13, +-5.93714181182902336e-13, +-2.51817367033054939e-14, + 2.15023305153463113e-13, + 1.58283552361648138e-14, +-3.10396548107067154e-14, +-1.40333794754756241e-14, +-2.98579991445142311e-15, + 7.75485064603799424e-17, + 4.81200298547818850e-16, + 3.73327532559594344e-16, + 2.41694007300798084e-16, + 1.48662917994529778e-16, + 9.36474034616392076e-17, + 5.99795112444482480e-17, + 3.97381911966506545e-17, + 2.50172808630181666e-17, + 1.72473069622074308e-17, + 1.16586572075106951e-17, + 1.04401140261114606e-17, + 3.50902742825376168e-18, + 4.05352726789517273e-18, + 5.24909584903567421e-19, + 1.69918803537644713e-18, + 8.87547517466962030e-19, + 7.27328872505136998e-19, +-2.29745190393022310e-18, + 1.22588781673851425e-18, +-1.66920841886323008e-19, +-2.58776322063858035e-20, + 1.36900683043370213e-18, +-1.40570725344017588e-18, +-2.10113495693365015e-18, + 1.85548780053598504e-18, +-6.17585541874625170e-15, + 2.26528942558946665e-14, + 5.26672633746000530e-15, +-9.52901545787899482e-15, + 1.27504021365193894e-15, + 1.77447361721206944e-14, +-2.44845174967417814e-14, +-5.56438972410578803e-15, + 2.06439438574042824e-14, +-4.67449613582041025e-15, +-3.62988977418898743e-15, + 1.97462226690211627e-16, + 4.69343622461529708e-16, + 1.66964728837128594e-16, + 3.54316397836901467e-17, +-1.45628038466993522e-19, +-2.09569128852933670e-18, +-7.28105483077655163e-19, +-8.17249092345796132e-19, +-5.13488789579627692e-19, +-5.79660567885100809e-20, + 2.42496332150533420e-18, +-2.37328355131853237e-19, +-3.13276438465312485e-20, + 4.96222416564428074e-19, + 2.76941595781108310e-19, +-5.71097694223586835e-19, + 2.08744437103514529e-18, + 8.50175951016430581e-19, + 4.03771201432494638e-19, + 1.03191933426799208e-18, + 1.07193490775870246e-18, +-9.98712146234455756e-19, + 1.65716594168386681e-18, + 9.48598400000168021e-20, + 1.50730381481199804e-18, + 3.56362617843352405e-18, + 1.68298449002180515e-20, +-8.67490732992440739e-19, + 1.63072591817318291e-18, + 1.20907326380083119e-15, + 3.18439202767321960e-17, +-5.89952939101260153e-16, +-4.29634352529351626e-17, + 5.64721288201776675e-16, +-1.86656492518475788e-16, +-1.14006643888561668e-15, + 1.64806352735452849e-15, +-5.57613574753866572e-16, +-2.79830977393043847e-16, + 1.54617329811635545e-16, + 3.82610854419344485e-17, +-3.01824828752954738e-18, +-4.36244657355141597e-18, + 1.51883039501926019e-18, +-3.04051580189215178e-18, + 2.45097151073843026e-18, + 4.20620219103971325e-18, + 1.47922264780081351e-19, +-3.05499662398820580e-19, + 1.57277635147984197e-21, + 3.88066102712878301e-19, + 1.64097604163618382e-19, + 2.71820724226750436e-19, +-3.28793598434552199e-19, + 1.79265421532845397e-18, +-2.04972312597822800e-18, + 2.94698729770984134e-19, + 4.83175311316469224e-19, + 3.52624080283008955e-19, + 1.40035016663743921e-18, + 9.03879239941209542e-19, + 7.76790917363846005e-19, + 1.36721935949581782e-18, +-4.58804876848082937e-19, +-2.84544837172823596e-19, + 9.74531947364134393e-19, + 1.99274931654015156e-19, +-3.00784788923342407e-19, + 1.92519541685208021e-18, +-1.60728600825782535e-17, +-3.44369562474508433e-17, + 1.87949384380534361e-17, + 1.39577522565614049e-17, + 8.92534949648198649e-18, +-5.40130816074607589e-17, + 4.71221746660658529e-17, +-6.69548422973540818e-18, +-4.02922352618668043e-17, + 2.08276621912792535e-17, +-3.61823192020797698e-18, +-8.30240884135075051e-18, +-6.37516059458472568e-19, + 6.18721098386666177e-18, + 5.19565906856952784e-18, + 4.11200253324959159e-19, + 4.63755266958721733e-18, + 4.35279178733011623e-18, + 4.94272712472972726e-18, + 2.28047745458754848e-18, +-3.90313552880121560e-19, + 1.80031280788827598e-18, +-1.75885754713651031e-19, + 9.92083834886388569e-19, + 1.61689372445227622e-18, + 3.57716932984039469e-18, +-1.10093118470788513e-18, + 1.94004329209410993e-18, +-1.89186193820958892e-19, + 5.15890844460398208e-19, + 1.16732407525084727e-18, + 1.01356738444593149e-18, + 1.25982024487483369e-19, + 7.52234054129144602e-19, + 1.42992967175030945e-18, +-5.31878659655303090e-20, + 1.63468193159060667e-18, + 2.20965454998802684e-18, +-5.72385807160789218e-19, + 1.42490458808780915e-18, +-1.99101026226751735e-17, +-1.28381490031411997e-17, + 9.74930183464935086e-18, +-6.02382030140025065e-18, +-2.19000360640918762e-18, +-4.73266974453916584e-18, +-2.63407958143358711e-18, +-4.84881608341689295e-18, +-4.35270528184952883e-18, +-3.96097643439915447e-19, +-6.58604422717322735e-19, +-1.94171681083264716e-18, + 9.90225557757769483e-19, +-2.43372316380792063e-18, +-3.53894664162660816e-18, + 2.17525554861877877e-18, + 1.13756694647517200e-18, +-1.59343159567812171e-18, +-2.82626580422643276e-19, + 2.20911286023814731e-18, +-1.87324418989053635e-19, + 3.97982217829623969e-19, +-8.95423002735868620e-19, +-1.66985131775513674e-19, +-3.20457408387424153e-19, + 3.01765220649517007e-19, + 5.21368181951183018e-19, + 9.20587231276427438e-19, +-1.19448597876061257e-19, +-5.09241869503941868e-19, + 7.93907858761021006e-19, + 7.19686419573985059e-19, + 3.92352791159455436e-19, + 1.16395700854801042e-18, + 1.75246151162047497e-19, + 5.70786102208292560e-19, + 1.46508618495739433e-18, + 6.64153871073773486e-19, + 9.14823643812562236e-19, + 1.98631930548248009e-18, +-8.48359876234502942e-18, +-2.38683076612440501e-17, + 3.62042711620624515e-18, +-1.94651724963101461e-18, + 3.42476520833497247e-18, +-4.01942323494840314e-18, +-5.84443191206486144e-18, +-1.86915801745561225e-18, + 1.76358530063091047e-18, +-8.62840839013618254e-19, +-1.90745191570337734e-19, +-1.68128414838623722e-19, + 2.70349172635297270e-18, +-6.15101791684176808e-18, +-2.14210824478851847e-18, +-2.80762234456482342e-18, +-1.07636510527406768e-19, +-3.95526406580409265e-18, +-2.57555094758679458e-18, +-3.68748368905379636e-18, +-1.48500190370991341e-18, +-1.17959293880006583e-18, +-1.75628588070644049e-18, +-8.25898108785212368e-19, +-1.46281307214351825e-18, +-3.98615620786687713e-19, +-3.14324438840231389e-18, +-2.25701937270864525e-18, +-2.85545105137924028e-18, +-2.56851597544683234e-18, +-1.98661728644438730e-18, +-1.70446869393024370e-18, +-2.88952754504029146e-18, +-1.10577536839664990e-18, +-1.17661941958538177e-18, +-2.66997757270340767e-18, + 4.95017328176767389e-20, +-1.50910035501052190e-18, + 3.76841350428207659e-19, +-1.93264875419661571e-18, + 1.40196321634419280e-01, + 5.77918600056999687e-02, + 2.98774947268609058e-02, + 1.85487963921939919e-02, + 1.32431507346692165e-02, + 1.04829320377788724e-02, + 8.93602180922923282e-03, + 8.01060431271062579e-03, + 7.40716978156066158e-03, + 6.96837730655802765e-03, + 6.61754623863764803e-03, + 6.32047927989251232e-03, + 6.06157153653499436e-03, + 5.83240806047997679e-03, + 5.62748905452908291e-03, + 5.44277649645704027e-03, + 5.27514468934749212e-03, + 5.12211129624181097e-03, + 4.98167250045369533e-03, + 4.85218983492350948e-03, + 4.73230862587011719e-03, + 4.62089773295248918e-03, + 4.51700424277733104e-03, + 4.41981890763671129e-03, + 4.32864943973197171e-03, + 4.24289963373419409e-03, + 4.16205287140990893e-03, + 4.08565896102731484e-03, + 4.01332354287869952e-03, + 3.94469948972676464e-03, + 3.87947987285295432e-03, + 3.81739216759445499e-03, + 3.75819344821455180e-03, + 3.70166637845914439e-03, + 3.64761584661458214e-03, + 3.59586612609028109e-03, + 3.54625846719515978e-03, + 3.49864904479145304e-03, + 3.45290720129330870e-03, + 3.40891393605612450e-03, +-6.72606590807252047e-02, +-2.12990000607060290e-02, +-8.14400798045744265e-03, +-3.63535856897360867e-03, +-1.82546940831918329e-03, +-9.96301974679187187e-04, +-5.78842385337220017e-04, +-3.61324245156087920e-04, +-2.49933108629404172e-04, +-1.92583185767183153e-04, +-1.59862758667968707e-04, +-1.37944614121494387e-04, +-1.21376363578534953e-04, +-1.08065230064008496e-04, +-9.70607789237341292e-05, +-8.78128353318616164e-05, +-7.99471481952400138e-05, +-7.31898345820442139e-05, +-6.73337356559507486e-05, +-6.22190691214160647e-05, +-5.77207396423315430e-05, +-5.37395444237334053e-05, +-5.01959085819400885e-05, +-4.70253380558741582e-05, +-4.41750674131602216e-05, +-4.16015541211150040e-05, +-3.92685818458840454e-05, +-3.71458081277104655e-05, +-3.52076404785283846e-05, +-3.34323580870988127e-05, +-3.18014192145168762e-05, +-3.02989104074004584e-05, +-2.89111050453290042e-05, +-2.76261069217529721e-05, +-2.64335605027907151e-05, +-2.53244138733563188e-05, +-2.42907236165370277e-05, +-2.33254932939401818e-05, +-2.24225390227535014e-05, +-2.15763770362909769e-05, + 1.03026301081050996e-02, + 2.74945540690231223e-03, + 8.82119261986681808e-04, + 3.33711401648286994e-04, + 1.45450921980666087e-04, + 7.09557677962721048e-05, + 3.68626792936557632e-05, + 1.90955845747942983e-05, + 9.67711124291672764e-06, + 5.18417437130195597e-06, + 3.23165186267277920e-06, + 2.33706466279230103e-06, + 1.83914496944129386e-06, + 1.50472777601469108e-06, + 1.25604770588272232e-06, + 1.06263039524903132e-06, + 9.08721427961012125e-07, + 7.84345574498770895e-07, + 6.82566654712915328e-07, + 5.98362783219638346e-07, + 5.28015410618926404e-07, + 4.68724843494845141e-07, + 4.18353045590533443e-07, + 3.75246407862009196e-07, + 3.38111171539165919e-07, + 3.05924412995622265e-07, + 2.77869502532221856e-07, + 2.53288680593639854e-07, + 2.31647782367268815e-07, + 2.12509700604344017e-07, + 1.95514212089414109e-07, + 1.80362492011892788e-07, + 1.66805118801684201e-07, + 1.54632703861320421e-07, + 1.43668513692715503e-07, + 1.33762617567536895e-07, + 1.24787212841081104e-07, + 1.16632866384511983e-07, + 1.09205473846067011e-07, + 1.02423785235003301e-07, +-1.20096421493872513e-03, +-2.77996557109997484e-04, +-7.66008449163169158e-05, +-2.47899350089650377e-05, +-9.26398527308249761e-06, +-3.97928656626389050e-06, +-1.98041723258082231e-06, +-1.07005740385679065e-06, +-5.40307347930294073e-07, +-2.40187557767760048e-07, +-1.04345919965741740e-07, +-5.27099172506850357e-08, +-3.29453795057886447e-08, +-2.36758987980615061e-08, +-1.81320014522423554e-08, +-1.42997359237894506e-08, +-1.14785239374229316e-08, +-9.33970295152817816e-09, +-7.68803905778226158e-09, +-6.39384385377624318e-09, +-5.36682599043709577e-09, +-4.54253457220629327e-09, +-3.87412763696588908e-09, +-3.32703697388625216e-09, +-2.87540066184153923e-09, +-2.49962774463257399e-09, +-2.18470717426167298e-09, +-1.91901555431773896e-09, +-1.69346477435366437e-09, +-1.50088476653036780e-09, +-1.33557119838180512e-09, +-1.19295033638420264e-09, +-1.06932817800334981e-09, +-9.61700845639866844e-10, +-8.67609998280873289e-10, +-7.85031632276435012e-10, +-7.12289894450234440e-10, +-6.47989769646598107e-10, +-5.90964149534215190e-10, +-5.40231929890944528e-10, + 1.15483952722840119e-04, + 2.37053833484653449e-05, + 5.73775674901659767e-06, + 1.62473919201303008e-06, + 5.28329488320500766e-07, + 1.91110008718245397e-07, + 7.83148557508280703e-08, + 4.18157019857192624e-08, + 2.53736890270430219e-08, + 1.27560889406254509e-08, + 5.09668939654631365e-09, + 1.87580822915082024e-09, + 7.88754470525191083e-10, + 4.28245735426967854e-10, + 2.81995212642913786e-10, + 2.03311648546731115e-10, + 1.52446801488386209e-10, + 1.16806197479148639e-10, + 9.09279016481865730e-11, + 7.17384849175542237e-11, + 5.72766854744121220e-11, + 4.62239904589597533e-11, + 3.76698409067155041e-11, + 3.09733088284732962e-11, + 2.56759276156619058e-11, + 2.14449724492302942e-11, + 1.80357651990866226e-11, + 1.52661743740107876e-11, + 1.29990977767889159e-11, + 1.11302515167520967e-11, + 9.57954375978075556e-12, + 8.28490588726658132e-12, + 7.19783240153919330e-12, + 6.28011740125274950e-12, + 5.50144285596055006e-12, + 4.83758595949683746e-12, + 4.26906370001602834e-12, + 3.78011054602582816e-12, + 3.35789448700334439e-12, + 2.99191220928501552e-12, +-9.55617010899775618e-06, +-1.76837776466733480e-06, +-3.82093648546415502e-07, +-9.61591591659991500e-08, +-2.80336332457959119e-08, +-9.24589264361114669e-09, +-3.04830226620698056e-09, +-1.04191230930905658e-09, +-7.12983412502145505e-10, +-5.21050348192853018e-10, +-2.52572103217070978e-10, +-9.05917792804805251e-11, +-2.91588095301370787e-11, +-1.05637382669335598e-11, +-5.06253865096843865e-12, +-3.07627212546093690e-12, +-2.10012268561135247e-12, +-1.50538119948812392e-12, +-1.10657322647832427e-12, +-8.27958852308914616e-13, +-6.28750369792922213e-13, +-4.83806298256456972e-13, +-3.76745521222400920e-13, +-2.96586890815812123e-13, +-2.35823943649404208e-13, +-1.89238453236680036e-13, +-1.53147290487222007e-13, +-1.24914899197022444e-13, +-1.02632335604237681e-13, +-8.48979135495222990e-14, +-7.06733423055473814e-14, +-5.91814504756932083e-14, +-4.98340006833903852e-14, +-4.21820415170902597e-14, +-3.58807720921620144e-14, +-3.06619918046971807e-14, +-2.63172228359420332e-14, +-2.26814784189390892e-14, +-1.96245523165336980e-14, +-1.70431206156837876e-14, + 6.98535873702471917e-07, + 1.18077990951727593e-07, + 2.30767898940206452e-08, + 5.21288053414548055e-09, + 1.35376262748839492e-09, + 4.14359024991894254e-10, + 1.47360215462871786e-10, + 3.42509690627097917e-11, + 4.93282491322542002e-12, + 1.12944430183042272e-11, + 9.51987412068368499e-12, + 4.20278285585006971e-12, + 1.34998998615318959e-12, + 3.89140131711547113e-13, + 1.25392975904857320e-13, + 5.41812186194585077e-14, + 3.06942465174285016e-14, + 1.99650797243244927e-14, + 1.37486672179817593e-14, + 9.73772345623330846e-15, + 7.03069000477502541e-15, + 5.15793253795228208e-15, + 3.83781736961892594e-15, + 2.89265622083836177e-15, + 2.20633767777648500e-15, + 1.70096941226449210e-15, + 1.32466346123358783e-15, + 1.04128779588222635e-15, + 8.25376594808308314e-16, + 6.59593871459879036e-16, + 5.31254675942466767e-16, + 4.30669616105189568e-16, + 3.51429798807606922e-16, + 2.88802255788960615e-16, + 2.38372350972270708e-16, + 1.98082234117670391e-16, + 1.65342875836014391e-16, + 1.38656619734107713e-16, + 1.17008434362978833e-16, + 9.89016067433203019e-17, +-4.59117461153419649e-08, +-7.16670862428291789e-09, +-1.28104495428414011e-09, +-2.63186758171917083e-10, +-6.15550360323174125e-11, +-1.59590715562550181e-11, +-5.70771217092433387e-12, +-2.47453307139863385e-12, + 3.49586601117556635e-14, + 1.38143749335239485e-13, +-1.94250316168687743e-13, +-1.52400776201362033e-13, +-5.89134916973276398e-14, +-1.70281084211547512e-14, +-4.47976961036783627e-15, +-1.31848691568663993e-15, +-5.24747525438092079e-16, +-2.80162884555936908e-16, +-1.74638902454394782e-16, +-1.15904540145851917e-16, +-7.94849802132146344e-17, +-5.56006401947811115e-17, +-3.96246746799553835e-17, +-2.85867464190763482e-17, +-2.07987835690397739e-17, +-1.52335892955204495e-17, +-1.14276915435372595e-17, +-8.27775117271071984e-18, +-6.79822828577940443e-18, +-5.14499818242628854e-18, +-3.98131862591694614e-18, +-3.12082048288101847e-18, +-2.51451635115106225e-18, +-1.79373514216077029e-18, +-1.48445892466733040e-18, +-1.11683849637487617e-18, +-9.05831185679801603e-19, +-8.00371770100083050e-19, +-4.66146939330977527e-19, +-5.67661652602312239e-19, + 2.74801888268396344e-09, + 3.99802959327060869e-10, + 6.59599256279217594e-11, + 1.24236295862269943e-11, + 2.68599584246049478e-12, + 6.34187321113182323e-13, + 1.30713801096328824e-13, + 1.00336196114443808e-13, + 3.80162556769937810e-14, +-1.50503951014095346e-14, +-3.05686398054917046e-15, + 3.39657195554401143e-15, + 2.08711825826114605e-15, + 7.01171432500211564e-16, + 1.84401445570372477e-16, + 4.50307004098399185e-17, + 1.23861506155057933e-17, + 5.00484068929540872e-18, + 2.94077504479254184e-18, + 1.64414865057712651e-18, + 1.15256380223418112e-18, + 7.96892011624948801e-19, + 5.83885765845292654e-19, + 3.09501947116491323e-19, + 3.97238635663126997e-19, + 2.41998431094740395e-19, + 1.89012435075761885e-19, + 3.33086892392998204e-19, +-6.72361261639389180e-20, +-5.98045692319969384e-20, + 1.37216410896357907e-19, + 4.07147068637750594e-20, +-1.95129790785092294e-19, + 1.48359441968110050e-19, +-5.71792812265622035e-20, +-9.62480288827224064e-21, + 1.21063693205515661e-19, +-3.69775672962450061e-21, + 9.81064597869443056e-20, +-2.95613749872566350e-20, +-1.51230465864736843e-10, +-2.06713141638258319e-11, +-3.17413174070863331e-12, +-5.51540957639303696e-13, +-1.08987644075545188e-13, +-2.62222127075630841e-14, +-4.81292277325313104e-15, + 1.08984232932049738e-16, +-2.68958677634941183e-15, +-1.26193573058409818e-16, + 3.84853235923665590e-16, + 1.44932200238046716e-17, +-5.15311444263570017e-17, +-2.38288555548579179e-17, +-6.83663222958000839e-18, +-1.55495757089010178e-18, +-1.65736940063134976e-19, + 4.35452176075998281e-19, + 4.66310981305582452e-19, + 1.51510740093928653e-20, + 2.25328182846157968e-19, + 8.35846529400422921e-20, + 3.87852470591610523e-20, + 9.02406279242993605e-20, + 6.14149907872196319e-20, + 4.88506355753343464e-20, +-5.60550943119444447e-20, + 3.95253836806995758e-19, +-5.36809531220567649e-20, + 2.02776189600010624e-19, + 3.36854829066232191e-20, + 5.63102374034706490e-20, +-2.74622656445242442e-20, + 1.56553882665564103e-19, +-7.67862141533741784e-21, + 9.18785764104281109e-20, + 1.21684948187020705e-19, +-9.23040772082607549e-20, + 1.67537465485787804e-19, +-6.26574376476585589e-20, + 7.70960243636989718e-12, + 9.96968604320526041e-13, + 1.43535179061675143e-13, + 2.32274120809194849e-14, + 4.20625471944663380e-15, + 8.56512189590639160e-16, + 3.44014400116183621e-16, +-8.42174051552637411e-17, + 2.33441684853178227e-17, + 5.05417107196384881e-17, +-9.71522562386806986e-18, +-5.01608354028226017e-18, + 8.95047006735479324e-19, + 7.31665028136565344e-19, + 2.17356250436576227e-19, + 1.43437537689008808e-19, + 2.21010309698486490e-19, + 3.83940736543335633e-19, + 2.21686205222497092e-19, + 1.97149833633772240e-19, + 1.25825108412673457e-19, + 2.26260567856708165e-19, +-3.16042155579328718e-20, + 6.46128687757129082e-20, + 4.93135592218873216e-20, + 1.05300059258406077e-19, +-6.29829868191218211e-20, + 2.34918757913750712e-19, +-9.27767647702848725e-20, +-1.03880160740759106e-19, + 1.17810551397072088e-19, + 1.94498187497154221e-19, +-3.29481328758413575e-20, + 1.61298375765212782e-19, + 7.83626057582172748e-20, + 1.36563013793543067e-19, +-4.54928811961060476e-20, +-2.98920967470576895e-20, + 1.93276597503401564e-19, +-5.86463554453099167e-20, +-3.66269905398192397e-13, +-4.50824630172218815e-14, +-6.12478969011287883e-15, +-9.28628574666533433e-16, +-1.59245656445191791e-16, +-2.65507949129058055e-17, +-8.14480875084411810e-18, +-5.54466567823096520e-18, + 4.48649635891320330e-18, +-2.19887188061237861e-18, +-4.42100508147481180e-19, + 2.16968411236694462e-19, + 6.06621725056663390e-20, + 2.28764775830185888e-19, + 2.37614006524621019e-19, + 2.15560191942149560e-19, + 1.46497770805105601e-19, + 4.80653090490897150e-19, + 3.13908446382039967e-19, + 3.30376868156722613e-19, + 8.19877015032386944e-20, + 7.75791542800745740e-20, + 1.20084450157984764e-19, + 4.59030592880831946e-20, + 3.94071389892997328e-19, + 3.02134809368724119e-19, + 1.33439424849069542e-19, + 2.28964641300489687e-19, +-3.79858314156946401e-20, + 9.51033326354377156e-20, + 6.63213834789646477e-21, + 8.74725271745273473e-20, + 1.09807362249385876e-20, + 6.83845502279899793e-20, +-6.62128917206554638e-20, + 1.22736826898264487e-19, + 3.02019786617224681e-20, + 9.15378960745747974e-20, + 2.34619394966350808e-19, + 5.23036671624551493e-20, + 1.62821868942150544e-14, + 1.91794693946769016e-15, + 2.46043404045110970e-16, + 3.54389537510288963e-17, + 5.45069690015676078e-18, + 1.03468381574995274e-18, +-3.65053082787838799e-19, + 6.42168747828969453e-19, +-2.52713018853899396e-19, +-4.64572127036347563e-20, + 3.02714525537052105e-19, +-1.20902815404849911e-20, + 1.81260756746412464e-19, + 1.56355786681712003e-19, + 8.13645098486960296e-20, +-1.21017787106138205e-20, + 1.89506325825081826e-20, +-2.67710579998411210e-20, + 8.74931310016315002e-20, + 2.63600545185506205e-19, +-1.28654168177089997e-20, +-2.78602826990178385e-20, +-1.34707261351482845e-19, +-1.74170823273277711e-19, + 2.22176973513674893e-19, +-4.58278488409165547e-20, + 5.94068697036906426e-20, + 2.88164466955150146e-19, +-6.32063137707661604e-20, +-2.74834873868387692e-20, + 1.03197208989378248e-19, + 1.33645647111653427e-19, +-5.18372201917060685e-21, + 4.75119585005724271e-20, +-2.49482976891749659e-20, + 1.05768534214933605e-19, + 1.08513537302924483e-19, + 5.54517066932201674e-20, + 6.96315845496409606e-20, + 5.82139101366987399e-20, +-7.07366451794724767e-16, +-8.77713769367545269e-17, +-1.22673021606912930e-17, +-1.75395461054752864e-18, +-1.15432342501482606e-18, +-4.31980907705656104e-19, +-2.08936172184997673e-19, +-1.34347451488757819e-19, +-8.42330502083575255e-20, +-1.34829868217609793e-19, +-7.09419160607891741e-20, +-3.21341116398310899e-20, + 6.79687047449280218e-20, +-9.56382083528975360e-20, + 9.69971492070571550e-20, +-6.71350829721359997e-20, +-1.41462530944894634e-19, +-9.58513102795594018e-20, +-8.45879635549246740e-20, + 5.76603225280702530e-20, + 4.09889040019763040e-20, +-2.61331574485330787e-21, +-2.00585481640948406e-19, +-1.00951764235805953e-19, +-2.61444512935780661e-20, +-3.59022023613182654e-20, +-1.04024763240559838e-19, +-1.17606321731803901e-19, +-1.52954710993075619e-19, +-1.37778723529388847e-19, +-5.83919573484776341e-20, +-1.50547051371798878e-19, +-1.35519248342098945e-19, +-1.02896007004121272e-19, +-1.19525934056391394e-19, +-8.99816187416981503e-20, +-9.07592676178937160e-20, +-9.80297633799743397e-20, +-2.64388048425164852e-20, +-1.47259397693688738e-19, +// root 3 + 1.71122011126637802e-01, + 1.42092360435401521e-01, + 1.19105042233410827e-01, + 1.00853709440556064e-01, + 8.62490959416384179e-02, + 7.44438676906191837e-02, + 6.48179353035890221e-02, + 5.69437350169104059e-02, + 5.05156328117396733e-02, + 4.52733732330145716e-02, + 4.09748515379044984e-02, + 3.74100308015234140e-02, + 3.44132755775536994e-02, + 3.18606930011494649e-02, + 2.96607230355935454e-02, + 2.77450709109782478e-02, + 2.60619567987533142e-02, + 2.45714486191844633e-02, + 2.32422635643426793e-02, + 2.20495472543571595e-02, + 2.09733029264592558e-02, + 1.99972597133261515e-02, + 1.91080432835404115e-02, + 1.82945586158434967e-02, + 1.75475241829909680e-02, + 1.68591159076347877e-02, + 1.62226918459534124e-02, + 1.56325770187815578e-02, + 1.50838935962876609e-02, + 1.45724256602159201e-02, + 1.40945105981623801e-02, + 1.36469512049067088e-02, + 1.32269440260610795e-02, + 1.28320205467252584e-02, + 1.24599986164664594e-02, + 1.21089420904091551e-02, + 1.17771271094289174e-02, + 1.14630137791751317e-02, + 1.11652222655861406e-02, + 1.08825125236750118e-02, +-1.62371721556288512e-02, +-1.28664890944454602e-02, +-1.01897983421584543e-02, +-8.11832793909633005e-03, +-6.53029778281802743e-03, +-5.30702839153158936e-03, +-4.34063788118723738e-03, +-3.54884342950612195e-03, +-2.89264773259467929e-03, +-2.36238760733567272e-03, +-1.94716865444098880e-03, +-1.62624522594548857e-03, +-1.37688850482870244e-03, +-1.18039762194314642e-03, +-1.02308250756602244e-03, +-8.95234444731459627e-04, +-7.89937538426148497e-04, +-7.02184705508917466e-04, +-6.28284038478388665e-04, +-5.65465964651598314e-04, +-5.11620073749241263e-04, +-4.65115447405640959e-04, +-4.24675619641326811e-04, +-3.89289990248475144e-04, +-3.58150034069113204e-04, +-3.30602679702017858e-04, +-3.06115772015233783e-04, +-2.84252166925179491e-04, +-2.64650077746877955e-04, +-2.47008006432035030e-04, +-2.31073076764001881e-04, +-2.16631919198957435e-04, +-2.03503488893954189e-04, +-1.91533362138143797e-04, +-1.80589173325025544e-04, +-1.70556939053489765e-04, +-1.61338077575548571e-04, +-1.52846977223268553e-04, +-1.45009001219288647e-04, +-1.37758841605577849e-04, + 4.65402465611609612e-04, + 3.76838211394145189e-04, + 2.94150728745603217e-04, + 2.25999451328944543e-04, + 1.73173557374666349e-04, + 1.34640963261640887e-04, + 1.08511242768533295e-04, + 9.01123455293216741e-05, + 7.40324685722440603e-05, + 5.87194060865800439e-05, + 4.54864336761097985e-05, + 3.51709793862027971e-05, + 2.75098800801431447e-05, + 2.18597882331364378e-05, + 1.76434561431288163e-05, + 1.44428458450268749e-05, + 1.19714732832082306e-05, + 1.00332543986376474e-05, + 8.49187536820777757e-06, + 7.25075555340661744e-06, + 6.24019737002436530e-06, + 5.40905060183680446e-06, + 4.71920068519931565e-06, + 4.14185167539074163e-06, + 3.65497279177321257e-06, + 3.24151433636828709e-06, + 2.88814170812015927e-06, + 2.58432420657725285e-06, + 2.32167056882072125e-06, + 2.09343854839926064e-06, + 1.89416888345655954e-06, + 1.71940925526885018e-06, + 1.56550409189093212e-06, + 1.42943306077071220e-06, + 1.30868592068401809e-06, + 1.20116477732428070e-06, + 1.10510717231490439e-06, + 1.01902514017561686e-06, + 9.41656598249549588e-07, + 8.71926331314949274e-07, +-7.08321267543463350e-06, +-7.35352612749458296e-06, +-6.32872235594953575e-06, +-5.02828427109206571e-06, +-3.79060305489302857e-06, +-2.65136879948321254e-06, +-1.76734799700675439e-06, +-1.37898838393233377e-06, +-1.31824394124808873e-06, +-1.21094572917672484e-06, +-9.83464489150166684e-07, +-7.40514751401481104e-07, +-5.45286097347474366e-07, +-4.03986715024135835e-07, +-3.04122359252867744e-07, +-2.32983190293854037e-07, +-1.81423593870548967e-07, +-1.43360887959590546e-07, +-1.14775955633421274e-07, +-9.29736779309649942e-08, +-7.61112875547443314e-08, +-6.29044434026630230e-08, +-5.24420382728044501e-08, +-4.40672396661067099e-08, +-3.72995248862457257e-08, +-3.17826074554950689e-08, +-2.72490452578149080e-08, +-2.34957983858182326e-08, +-2.03670986079198719e-08, +-1.77422789607736566e-08, +-1.55270177267406991e-08, +-1.36469648512126460e-08, +-1.20430518171009060e-08, +-1.06680050532651291e-08, +-9.48372932567142341e-09, +-8.45932642874228760e-09, +-7.56958233674184425e-09, +-6.79380289364519109e-09, +-6.11491108452316978e-09, +-5.51874216078360724e-09, +-9.14132780788196470e-08, + 3.88649453063507172e-08, + 7.92276468273062376e-08, + 8.03270532385294631e-08, + 7.45606917377391669e-08, + 6.63024178172538870e-08, + 4.09519585342421308e-08, + 9.60879271760015712e-09, + 2.49552675588532074e-09, + 1.13439899995051878e-08, + 1.57874364276715485e-08, + 1.39695072497603058e-08, + 1.04188932056374389e-08, + 7.38550927202316913e-09, + 5.22731258407641733e-09, + 3.75581837816380481e-09, + 2.74901270664248969e-09, + 2.04836259168674566e-09, + 1.55130011385751055e-09, + 1.19216489596997591e-09, + 9.28324344644718767e-10, + 7.31545917400517659e-10, + 5.82761265631624375e-10, + 4.68853489298939435e-10, + 3.80647034453607966e-10, + 3.11624147608014872e-10, + 2.57089349801025931e-10, + 2.13615822715162534e-10, + 1.78672509731459023e-10, + 1.50369097531365531e-10, + 1.27279189081122678e-10, + 1.08316068430763686e-10, + 9.26443426146898445e-11, + 7.96164127151677580e-11, + 6.87262858253395790e-11, + 5.95756772254550762e-11, + 5.18488875963197360e-11, + 4.52940338413187266e-11, + 3.97088901775544187e-11, + 3.49301473041281420e-11, + 9.61237875118220929e-09, + 3.79789430661151208e-09, + 6.67022063173098034e-10, +-2.85564247164209384e-10, +-2.56193764419858679e-10, +-7.40244194261381266e-10, +-1.70711171183491147e-09, +-1.09679659589031394e-09, + 2.69871215923215614e-10, + 4.21571476118049553e-10, + 2.67495262350002211e-11, +-1.65633294908738400e-10, +-1.72578079929391440e-10, +-1.29033439019383834e-10, +-8.86655593677982123e-11, +-6.03348466418803996e-11, +-4.16194996161023658e-11, +-2.92619394354623501e-11, +-2.09664253793006204e-11, +-1.52865523095859698e-11, +-1.13226940623195745e-11, +-8.50749723745059521e-12, +-6.47592572811635793e-12, +-4.98836917646825529e-12, +-3.88455893817637197e-12, +-3.05543167712112151e-12, +-2.42558531677257778e-12, +-1.94212248194815399e-12, +-1.56742244077817351e-12, +-1.27440429723482504e-12, +-1.04334198236484156e-12, +-8.59704471583115627e-13, +-7.12690171403677964e-13, +-5.94184616975813544e-13, +-4.98041762259498422e-13, +-4.19566878502492146e-13, +-3.55145108549274991e-13, +-3.01972323177179741e-13, +-2.57860397365694758e-13, +-2.21085477724945951e-13, +-2.81849756626302440e-10, +-1.87718557289671891e-10, +-7.82882520650677663e-11, +-9.00058103316333216e-12, +-1.63863935310349719e-13, +-4.16788608098427126e-11, +-1.88320468525051861e-11, + 6.17771469626361546e-11, + 3.46374372009856534e-11, +-1.39186308512424028e-11, +-1.37769783975892003e-11, +-2.98134810358712096e-12, + 1.40908236542416752e-12, + 1.89760842204542387e-12, + 1.42808804092011850e-12, + 9.54890544479555624e-13, + 6.27636519886254396e-13, + 4.17627034887650398e-13, + 2.83309549849553016e-13, + 1.96002739115037797e-13, + 1.38103351164995745e-13, + 9.89366806646347476e-14, + 7.19629818151481897e-14, + 5.30739111438305011e-14, + 3.96421229877079110e-14, + 2.99594149135592194e-14, + 2.28865067520686649e-14, + 1.76568904704157364e-14, + 1.37505959700995272e-14, + 1.08012271041973067e-14, + 8.55202838921695117e-15, + 6.82369680345867683e-15, + 5.48266649856594499e-15, + 4.43472201403656106e-15, + 3.60956246213539418e-15, + 2.95511208057843426e-15, + 2.43305084703416088e-15, + 2.01427036977451459e-15, + 1.67464540493248233e-15, + 1.39940880572529589e-15, + 8.93539835492572053e-13, + 4.34404380162676731e-12, + 3.28233189161913215e-12, + 1.54208809775706287e-12, +-9.44176086173474610e-13, +-1.18869218455553682e-12, + 2.94006346613917613e-12, + 1.31323138870776674e-12, +-2.34418071690471437e-12, +-7.28728999427138545e-13, + 4.14065577847896205e-13, + 2.77286040350821140e-13, + 6.20469891544258748e-14, +-9.86794907727433402e-15, +-1.89461464305905873e-14, +-1.42992429024862879e-14, +-9.31552107302304452e-15, +-5.93447558890517875e-15, +-3.82523871602336484e-15, +-2.51367246518835793e-15, +-1.68210026840728097e-15, +-1.15126691943312301e-15, +-7.99735480965890049e-16, +-5.64942154348098534e-16, +-4.06001042300161072e-16, +-2.93410866283771146e-16, +-2.14171262896180029e-16, +-1.60541562257105370e-16, +-1.20065944538273783e-16, +-9.05893328881004164e-17, +-7.01071440038924204e-17, +-5.36461963291571824e-17, +-4.14511723550540368e-17, +-3.24981632508865980e-17, +-2.53075368828887923e-17, +-1.99947495025647471e-17, +-1.62527423424250910e-17, +-1.25694459084716749e-17, +-1.05938915077937137e-17, +-8.62846069988041135e-18, + 2.79029911349083013e-13, +-4.44132780948439768e-15, +-4.49988302717987053e-14, +-6.84209405461273774e-14, +-7.15064842299285607e-14, + 8.22667297106399078e-14, + 9.71026626148267018e-14, +-1.67333867468288984e-13, +-1.14863017485232857e-14, + 6.59106320742302397e-14, + 7.24446989340942762e-15, +-8.74738067545110817e-15, +-4.16432991358936640e-15, +-8.62763847026830815e-16, + 6.21814221261758361e-17, + 1.74232008990225901e-16, + 1.32213847606060234e-16, + 8.49006265124335076e-17, + 5.19367410448844433e-17, + 3.15038584316721319e-17, + 2.21277618362332806e-17, + 1.29475377257905979e-17, + 8.51390281757440332e-18, + 5.76338733455499150e-18, + 3.30271246877998941e-18, + 2.68993702346068468e-18, + 2.09838175948956296e-18, +-1.09282309215705723e-20, + 9.06731692151162409e-19, + 6.78278452110582781e-19, + 4.15877274572227442e-20, + 4.17182750112603325e-19, +-7.66066356906438851e-20, + 2.63993848177066862e-19, + 2.60678143896292731e-19, + 6.57656977186646178e-20, + 3.29444741268851505e-19, + 4.00526848262579621e-19, +-7.80561830593229651e-20, +-1.78215639010667629e-20, +-1.27603177464187027e-14, +-3.23057866828080542e-15, +-2.85428380663519271e-16, +-9.49013298562154479e-16, + 1.68937476613752363e-15, + 5.55688165399854520e-15, +-6.82782836809307140e-15, +-1.97618473601219495e-15, + 6.08501571059495614e-15, +-1.23298720182299036e-15, +-1.14885316739902673e-15, + 2.54466481047196916e-17, + 1.35590600467589404e-16, + 5.20467765733975748e-17, + 1.04435500694847577e-17, +-7.57456114880748801e-19, +-6.41676558706505711e-19, + 2.30861268865666476e-19, +-3.27315346396582938e-19, +-7.52586860985779755e-20, + 1.49041081054309282e-18, +-4.93142856809196728e-19, +-5.22386727164424705e-19, +-1.59663315333593335e-19, + 2.76758369733148543e-19, +-3.84170471595455823e-19, + 8.91148306891609791e-19, + 2.59204039314776553e-19, + 1.60788979850843061e-19, + 2.77276123253502558e-19, +-1.23356427665928548e-19, + 5.49206896337170188e-19, + 3.32609986615960545e-19, + 5.80028935850695827e-19, + 5.05439974006423755e-19, + 2.66531884517874360e-19, + 6.47920975801023521e-19, + 8.82965171141566080e-19, + 2.28575238732355121e-19, + 3.34942168422572676e-19, + 2.02999257289619381e-16, + 1.88207264833683622e-16, +-5.14398357784686652e-18, + 4.23098128745118338e-18, + 1.37188496014948063e-16, +-6.75292009013056252e-17, +-3.32039656040621850e-16, + 4.65943102307950302e-16, +-1.43030210271396147e-16, +-9.16495961316304538e-17, + 4.39029845134215165e-17, + 1.04012429566482757e-17, +-1.98427221100997542e-18, + 1.52604194370681085e-19, + 9.94132251472300085e-19, +-8.98158125624683268e-19, + 8.67162217398820803e-19, + 1.34108751812639741e-18, + 4.35013318840310778e-20, +-1.01626278427959879e-18, + 1.01550439583545980e-18, + 3.87739025443009389e-19, + 1.04545965162827881e-20, +-2.37326790046038056e-19, +-6.65574685239406292e-19, + 4.89660713464421283e-19, + 4.70518599290298832e-19, +-3.64646752277035513e-19, + 6.88072221626127981e-19, + 5.32339558762286506e-19, +-2.75668026170367438e-19, +-6.36114650597342794e-20, +-8.74849163087970056e-20, + 3.88415374558350507e-19, + 1.72412931548458097e-19, + 5.24484018269664187e-19, + 2.47172827228563940e-19, + 7.01218034002408674e-19, + 1.59116144967183575e-19, + 3.15350224594867239e-19, + 1.02260844834322374e-17, +-1.06949416200249207e-17, +-8.62154383669085512e-18, +-6.75046320396786157e-20, + 2.76271555408380185e-18, +-1.34737895368810096e-17, + 1.31309990475913400e-17, +-6.96702742152945798e-19, +-1.42458844841854694e-17, + 4.09819407818374174e-18, +-1.65851715505741375e-18, +-1.80414488315120781e-18, +-5.78889399758860620e-19, + 2.97751516630786572e-18, + 2.05802354238194987e-18, + 9.38495360286609744e-19, + 1.66150147264290991e-18, + 2.06443571805987267e-18, + 2.95256322555119259e-19, + 2.49224431022288901e-19, + 1.57686918613763566e-18, + 8.92718447798031025e-19, + 6.21575305576452916e-19, + 8.80539695703662528e-19, + 2.19761481961715244e-19, + 9.46242191413834708e-19, + 1.47484170699993592e-19, +-1.28623017171799455e-19, + 1.44852531645243374e-19, + 5.88364072729731555e-19, +-1.18231308826985463e-20, + 1.20813272911086770e-19, + 5.80389369828615904e-20, + 4.37691740100379265e-19, + 6.20895263349303970e-19, + 6.74117078039748621e-19, + 1.26594528736915344e-19, + 4.92210957676132831e-19, + 1.10909930443553027e-19, + 4.45682434349814330e-19, +-2.81068005305851768e-18, +-4.80554900588807121e-18, +-2.81659538544638254e-18, +-3.91108061596716318e-18, +-2.09794844708392657e-18, +-3.28462005214723847e-18, + 5.74112797859570516e-19, +-1.33649158014795817e-18, + 1.47056278129004838e-18, +-2.08385873299857209e-18, +-9.07870619621060909e-19, +-1.23591478165625977e-18, +-1.46239503177311973e-18, +-1.74440962630764977e-19, +-4.46873493364331182e-20, +-5.37956535103995682e-19, + 5.56567359760370407e-19, +-7.76274954995485561e-20, +-9.02430617912339937e-19, +-1.54309109276523929e-19, +-2.44372009217460578e-19, +-1.07480178714656810e-18, + 7.72563680142514128e-19, +-4.37056110538891075e-19, +-5.43406502498708480e-19, + 6.93367495196355625e-19, + 5.12913070349132649e-19, + 3.90188131154320955e-19, + 3.12025976513729964e-19, + 4.06631030251618751e-19, + 1.20223230876266122e-19, + 5.86741602667251885e-19, + 4.13721291067204506e-19, + 2.42219638315837458e-19, + 1.37948486034951844e-19, + 2.52368664746067089e-19, + 2.75448338417724597e-19, + 9.42627865029184080e-19, + 2.50561960331948444e-19, + 1.58863415610508745e-19, +-4.01192292798802390e-18, +-5.04541111171290868e-18, +-7.61708818353541272e-18, +-3.33677495085918459e-18, +-2.84670316700576762e-18, +-1.06440360882730264e-18, +-5.87433349620660097e-19, + 5.36920855473182749e-19, +-1.14663158295134938e-18, +-2.09776996429526462e-18, +-1.90179815695609002e-19, + 6.70414353402845420e-19, +-4.80229656245279324e-19, +-9.74911767987616330e-19, +-8.05302082249164845e-19, +-1.85342769973132219e-18, +-9.63564769989482358e-19, +-5.06129294244736453e-19, +-1.11652867971100885e-18, +-4.07976128873794035e-19, +-7.17382651901134509e-19, +-8.45341125706262866e-19, +-8.18573616334639801e-19, +-6.73316429517093545e-19, +-7.56331381952030829e-19, +-5.83404721515852520e-19, +-6.33579506664941763e-19, +-5.94343312922688207e-19, +-9.75739068554738976e-19, +-9.65894708588619920e-19, +-1.04792687789972654e-18, +-9.49811773264177728e-19, +-7.70718756985890600e-19, +-6.20905635294475494e-19, +-8.56230883282342765e-19, +-6.01253915597485527e-19, +-5.53876790031227234e-19, +-2.09182110980479692e-19, +-4.20815986774013718e-19, +-1.63073870188065784e-19, + 2.16083392929179913e-01, + 1.46121286321953259e-01, + 1.09667965962410852e-01, + 8.85805979475760008e-02, + 7.53593454900348958e-02, + 6.65324330502796019e-02, + 6.03273644847730703e-02, + 5.57501385522575429e-02, + 5.22020971619344409e-02, + 4.93205447286544363e-02, + 4.68946516795615553e-02, + 4.48028760250170771e-02, + 4.29703668422881657e-02, + 4.13463502891740012e-02, + 3.98937551104670551e-02, + 3.85843264982644665e-02, + 3.73959719669769639e-02, + 3.63111049029228444e-02, + 3.53155217709246530e-02, + 3.43976075842141113e-02, + 3.35477589752488231e-02, + 3.27579571939635994e-02, + 3.20214469527703507e-02, + 3.13324914223961776e-02, + 3.06861829127481715e-02, + 3.00782948709428441e-02, + 2.95051649441312909e-02, + 2.89636016828740891e-02, + 2.84508094359426922e-02, + 2.79643273873144173e-02, + 2.75019796918602455e-02, + 2.70618343978784141e-02, + 2.66421693831008187e-02, + 2.62414439313895902e-02, + 2.58582748783612940e-02, + 2.54914164825031549e-02, + 2.51397433530609199e-02, + 2.48022359007732396e-02, + 2.44779678823316103e-02, + 2.41660956915263347e-02, +-4.82202810007376567e-02, +-2.39488493117803909e-02, +-1.33327436194453190e-02, +-8.10754075472249619e-03, +-5.28067738436423934e-03, +-3.63286102437176397e-03, +-2.62158320368955115e-03, +-1.98587367124573606e-03, +-1.58051860709328184e-03, +-1.31156199526265759e-03, +-1.12036250090353021e-03, +-9.75164274958499806e-04, +-8.59924379126298039e-04, +-7.65991915482288005e-04, +-6.88057380233085309e-04, +-6.22510684801137184e-04, +-5.66752132693280311e-04, +-5.18849231784342200e-04, +-4.77334865718928938e-04, +-4.41076543246121146e-04, +-4.09187484151283230e-04, +-3.80964435381160994e-04, +-3.55843284067019745e-04, +-3.33366826121353921e-04, +-3.13161002686103841e-04, +-2.94917136855085216e-04, +-2.78378487799564979e-04, +-2.63329955109363641e-04, +-2.49590111348287199e-04, +-2.37004975743367638e-04, +-2.25443104249639740e-04, +-2.14791684973228485e-04, +-2.04953408674637413e-04, +-1.95843942081977955e-04, +-1.87389873889637999e-04, +-1.79527034262232663e-04, +-1.72199111607019846e-04, +-1.65356507546669996e-04, +-1.58955383983013502e-04, +-1.52956866003691762e-04, + 4.57480696260508749e-03, + 1.89408991253937811e-03, + 8.90867530043555319e-04, + 4.64297637555928858e-04, + 2.62790147963974131e-04, + 1.58359018013548829e-04, + 9.89055008591148053e-05, + 6.25508719160392901e-05, + 4.04835185977719969e-05, + 2.78086376994647793e-05, + 2.05444368446361806e-05, + 1.60305015127456190e-05, + 1.29296579445979002e-05, + 1.06473229780055987e-05, + 8.90086804657191337e-06, + 7.53254495231694098e-06, + 6.44192618445984255e-06, + 5.56028414255273412e-06, + 4.83877440595792264e-06, + 4.24184705036226835e-06, + 3.74314842804805357e-06, + 3.32283232161647186e-06, + 2.96574214563991574e-06, + 2.66015533691950608e-06, + 2.39690032633133557e-06, + 2.16872551712761336e-06, + 1.96984174839878481e-06, + 1.79558610384544698e-06, + 1.64217184136333515e-06, + 1.50650026856141896e-06, + 1.38601773087874659e-06, + 1.27860583249834051e-06, + 1.18249640161719784e-06, + 1.09620506373706693e-06, + 1.01847893929992146e-06, + 9.48255155957580749e-07, + 8.84627709340272089e-07, + 8.26820818212156757e-07, + 7.74167368406142383e-07, + 7.26091371479411499e-07, +-3.61469144768322172e-04, +-1.27691824167589435e-04, +-5.16917765649036059e-05, +-2.34212951189989593e-05, +-1.16650477303369059e-05, +-6.36700337701165523e-06, +-3.80663159860040423e-06, +-2.35393679130030598e-06, +-1.38434236986681316e-06, +-7.81545025460701127e-07, +-4.63625869260760707e-07, +-3.05131387501595476e-07, +-2.18831715443844982e-07, +-1.65010279783316217e-07, +-1.28040537269626379e-07, +-1.01290132118771534e-07, +-8.13595677162229489e-08, +-6.62081106043277347e-08, +-5.45009299661458173e-08, +-4.53264943487690887e-08, +-3.80459044787610059e-08, +-3.22024331168884773e-08, +-2.74640371317209907e-08, +-2.35856625779850498e-08, +-2.03839723862297558e-08, +-1.77200845798111249e-08, +-1.54875845000808265e-08, +-1.36040728527992005e-08, +-1.20051231996473334e-08, +-1.06399063088730270e-08, +-9.46798363826629716e-09, +-8.45693159725251026e-09, +-7.58056306200926856e-09, +-6.81758328361183459e-09, +-6.15056485195867125e-09, +-5.56515943473361342e-09, +-5.04948675039162773e-09, +-4.59365741519118812e-09, +-4.18939769681445272e-09, +-3.82975245232493824e-09, + 2.50988177934161420e-05, + 7.69507383804336935e-06, + 2.71860367903816138e-06, + 1.08362614088168575e-06, + 4.74620243476866876e-07, + 2.21279551037038123e-07, + 1.14366090746813626e-07, + 7.30292914271906992e-08, + 4.87151762118764240e-08, + 2.74595462277330068e-08, + 1.36553825192487394e-08, + 7.02490274445703175e-09, + 4.13116967595951608e-09, + 2.73833400695669238e-09, + 1.94430321415471194e-09, + 1.43197779681614561e-09, + 1.07922344969882104e-09, + 8.27825016218809219e-10, + 6.44563573460256744e-10, + 5.08556018645408514e-10, + 4.06038938872679807e-10, + 3.27685921738116266e-10, + 2.67044862974781963e-10, + 2.19572552582543469e-10, + 1.82018946610754758e-10, + 1.52025325819159468e-10, + 1.27857149902089689e-10, + 1.08223272541659337e-10, + 9.21517666544764657e-11, + 7.89033476178555987e-11, + 6.79102440483586587e-11, + 5.87324407446320459e-11, + 5.10260815151656783e-11, + 4.45203139469126199e-11, + 3.90002218102573884e-11, + 3.42940788970102762e-11, + 3.02637728788248719e-11, + 2.67975417999773914e-11, + 2.38044131287093898e-11, + 2.12099352472015414e-11, +-1.57458226691468374e-06, +-4.24773172026587494e-07, +-1.32373293952334013e-07, +-4.68831101879559085e-08, +-1.87248175544262876e-08, +-8.08137947832146217e-09, +-3.19216285424614468e-09, +-1.36193249277267281e-09, +-1.16073843985826565e-09, +-9.05862196160722138e-10, +-4.82995745651704022e-10, +-2.11689703082869394e-10, +-9.53834099972237122e-11, +-5.05236133534489333e-11, +-3.11636788615451356e-11, +-2.09720136979992106e-11, +-1.47504288295805792e-11, +-1.06504538180131506e-11, +-7.84145111218606972e-12, +-5.86903207090800786e-12, +-4.45720788772173463e-12, +-3.42973941869026705e-12, +-2.67077963724074335e-12, +-2.10253148802513769e-12, +-1.67177683560759288e-12, +-1.34152905648894564e-12, +-1.08567563146369369e-12, +-8.85537611341831644e-13, +-7.27568726788933241e-13, +-6.01848841831765579e-13, +-5.01007378331981656e-13, +-4.19540971007960079e-13, +-3.53274732937420503e-13, +-2.99032070764610975e-13, +-2.54361061045517444e-13, +-2.17367311789585847e-13, +-1.86565759844886154e-13, +-1.60791586011879129e-13, +-1.39121745608832925e-13, +-1.20818581286218230e-13, + 9.07565384471281407e-08, + 2.17944072065325900e-08, + 6.05160458669829209e-09, + 1.90493569070649317e-09, + 6.71920332589774816e-10, + 2.86135552651889277e-10, + 1.33887201400077686e-10, + 2.75793795077762414e-11, + 3.08243233687659860e-12, + 1.72609612967605211e-11, + 1.54202043301854993e-11, + 7.44518123992482655e-12, + 2.88037172601506851e-12, + 1.15399488230831802e-12, + 5.57462271143017686e-13, + 3.22674696825098616e-13, + 2.07120919978116762e-13, + 1.39866369096115020e-13, + 9.72113204619608578e-14, + 6.89919104271083669e-14, + 4.98349145632990915e-14, + 3.65648267556313321e-14, + 2.72093882256079346e-14, + 2.05046663422709036e-14, + 1.56401071745700587e-14, + 1.20578850559055753e-14, + 9.38995810076570270e-15, + 7.37905111301862483e-15, + 5.85118860026721458e-15, + 4.67462866071143444e-15, + 3.76780349765959994e-15, + 3.05514712776256888e-15, + 2.49338384405191699e-15, + 2.04596360170261936e-15, + 1.68978773001804757e-15, + 1.40323245345968211e-15, + 1.17173848572844862e-15, + 9.82578864863230541e-16, + 8.28422052870875445e-16, + 7.02847929586732289e-16, +-4.86026492729366497e-09, +-1.04911483117304790e-09, +-2.61983718651459324e-10, +-7.47583365459366884e-11, +-2.32478090197986737e-11, +-7.47096865951922645e-12, +-4.51736999347827275e-12, +-2.54054151238462210e-12, + 3.91002816873029964e-13, + 2.67877410084915275e-13, +-2.81351404769971998e-13, +-2.36032040872263260e-13, +-9.95919069599233532e-14, +-3.42905484798508364e-14, +-1.24381255062030484e-14, +-5.55847713387942552e-15, +-3.04902275409700975e-15, +-1.87424671842121898e-15, +-1.22207392050412298e-15, +-8.24653747676312794e-16, +-5.62657183354843174e-16, +-3.91681213835165734e-16, +-2.78010243190329773e-16, +-2.04030780305532329e-16, +-1.46650387847126044e-16, +-1.10095247472268405e-16, +-8.16747106294211401e-17, +-6.25390220326258031e-17, +-4.68822281112961822e-17, +-3.70662319474763288e-17, +-2.61627720630643593e-17, +-2.06851592091491309e-17, +-1.56838798994849219e-17, +-1.31015030475160544e-17, +-1.07569707490443126e-17, +-9.65297052595850726e-18, +-7.60826778557212920e-18, +-5.33815969176858353e-18, +-3.69335866372092582e-18, +-2.31641714370336799e-18, + 2.43782616074116179e-10, + 4.77129577201050777e-11, + 1.07699791342419747e-11, + 2.79048969414018467e-12, + 8.43528449887279229e-13, + 2.30248309518420705e-13, + 2.12441518093500874e-14, + 1.10452044778690428e-13, + 4.09884554822929326e-14, +-2.58533924515314738e-14, +-5.38330619534106184e-15, + 4.79106634213311838e-15, + 3.15192585795351404e-15, + 1.15344698297104402e-15, + 3.57199065238066918e-16, + 1.22391396707260461e-16, + 5.00263725801019803e-17, + 3.03915745078957106e-17, + 1.88718580105777906e-17, + 8.52465423945689574e-18, + 7.01668112661409412e-18, + 5.25559107720892500e-18, + 4.50786872862976265e-18, + 1.35790174567393112e-18, + 2.60640334621779814e-18, + 3.33351390432734522e-19, + 7.58397747247665155e-19, +-1.25102960057805750e-20, + 3.44581394079897646e-19, +-1.44319146392463571e-18, + 2.28356512622265448e-18, + 2.45046680536085263e-18, + 2.24124692855931105e-18, + 6.53538384958973510e-19, + 4.39708356805129693e-19, +-5.29338509140804145e-19, +-2.64929293173935279e-19, + 3.42590050803204023e-19, + 1.08598782734465944e-18, + 1.58107740487446204e-18, +-1.15209701834748075e-11, +-2.06093186606869915e-12, +-4.24193738480409227e-13, +-9.87730135020176618e-14, +-2.65917957973882475e-14, +-1.10151578230669091e-14, + 4.09333653048083703e-17, + 1.45332371611490248e-15, +-3.55130015256545565e-15, +-1.18872298530490248e-17, + 5.93267597698895217e-16, + 3.68012749577856616e-17, +-7.38366221926264984e-17, +-3.61832810502032551e-17, +-1.31038535226796497e-17, +-2.17368888630400707e-18, +-9.96405431613990713e-19, + 2.36961101300032883e-18, + 1.97842658822782601e-18, +-1.50123977380233341e-18, + 1.64921210962402293e-18, + 4.67292093512234481e-19, + 1.70546384774944542e-18, +-3.47057356831929309e-19, + 1.47307005935212062e-18, + 7.19830917843651350e-19, + 4.78751509984580790e-19, +-3.61878737810529032e-20, + 4.49971598302954303e-19, +-2.46186911523276813e-19, + 2.84552745824994032e-18, + 1.84381638237588072e-18, + 1.90876938685535830e-18, + 5.81906467773842149e-19, + 5.88024661907686551e-19, + 3.60350459480049507e-19, +-1.83620112017301384e-19, +-1.42329551958165139e-19, + 8.74396409571763095e-19, + 9.75856281332176886e-19, + 5.15379469070690681e-13, + 8.48367541691418111e-14, + 1.60476079761726078e-14, + 3.46452179231133308e-15, + 7.68002766951092587e-16, + 2.16559692276116511e-16, + 2.80501854102643636e-16, +-1.94766248126695205e-16, + 3.30340101922920592e-17, + 7.02477544897424492e-17, +-1.51091935555357728e-17, +-4.71439083126128717e-18, + 9.63347123354773785e-19, + 1.62976064593792741e-18, + 7.09713977878566599e-20, + 1.12558306441183280e-18, + 2.43345293500506836e-19, + 2.06367961734208979e-18, + 1.98221292120308460e-18, +-2.05074233749096638e-18, + 1.07412569611502457e-18, + 2.01817141541721923e-18, + 2.17941538535597774e-18, +-4.52333238447870094e-19, + 3.42667231942908318e-19, + 1.61403163042866198e-19, + 3.67622923321713726e-19, +-7.84082837689041533e-19, + 4.20722219831813088e-19, +-4.56464138976165096e-19, + 1.46755733279032576e-18, + 8.66417575172876112e-19, + 1.73877285158815013e-18, + 9.84009164551066913e-19, + 4.11585269697816580e-21, + 5.29755445018983379e-19, + 1.73418241793538383e-19, +-2.59428591389692587e-19, + 6.87463661247423773e-20, + 1.31940172522660597e-18, +-2.18915533011466313e-14, +-3.33788557331621811e-15, +-5.79239328602307927e-16, +-1.15634186926935893e-16, +-3.11094471613050812e-17, +-6.13735284640469687e-19, +-6.45858487212461348e-18, +-7.44910689449388254e-18, + 4.60022529803844286e-18, +-5.31359811466672038e-19, +-3.18671031989979015e-18, + 1.32889285789392675e-18, +-1.03074856862348358e-18, + 1.19538260890940018e-18, + 1.41278167659999965e-19, + 2.60952097090917911e-18, + 9.75707335332163853e-19, + 3.58906771722453536e-18, + 1.90004774749048795e-18, +-1.07746999947250132e-18, + 1.08573126258119850e-18, + 1.30961954078836401e-18, + 2.29546584703466110e-18, +-5.42635727725900456e-19, + 9.15079389352998981e-19, + 8.71054099209826073e-19, + 4.60084781471586740e-19, +-8.00424245665332609e-20, + 2.46473299472671304e-19, +-4.99796219207519100e-19, + 7.03601403800239638e-19, + 4.67642319665317365e-19, + 1.64641091969723006e-18, + 5.09541853095957642e-19, + 1.21504518235874290e-19, + 9.05300148491148220e-20, +-6.57313662614107125e-19, +-2.38041210891280961e-20, + 1.18900092347963119e-18, + 6.48081581077707338e-19, + 8.70690660146303261e-16, + 1.19181983186264894e-16, + 1.93370419778798186e-17, + 2.14938731374606592e-18, +-1.06042900521167106e-18, +-4.29623891531633008e-18, + 5.66454442694526310e-19, + 8.23265249531201592e-19, + 6.11469585682086048e-19, + 1.71726889783357624e-19, +-3.59842315186234860e-20, + 4.77854251200760475e-19, +-4.53989860472197636e-19, +-1.39856588211897963e-18, +-5.53719674171363012e-19, + 1.78893971518412663e-18, + 5.41836219032109500e-20, + 6.94324998995254155e-19, + 1.43774234292968341e-18, +-2.16249903454545429e-19, + 3.67716915137445775e-19, + 6.62567585226286969e-19, + 1.73939711694996549e-18, +-5.16219259937976035e-20, + 4.25566902436507861e-19, + 3.17379140132077868e-19, + 5.06280921695842679e-19, +-4.42472718711525347e-19, +-1.53303943765259712e-19, + 2.60213676705845145e-19, + 9.12655336588517087e-19, + 1.22728875992108714e-18, + 6.42442526814619386e-19, + 1.13345341508730697e-18, +-1.08593990212942830e-19, + 6.69131426392541215e-19, + 6.06912978828170204e-20, + 8.11130828669841304e-19, + 8.98510762728965244e-20, + 1.47136627150776915e-18, +-5.59448271840379079e-17, +-1.57111261830868623e-17, +-8.63206704606468478e-18, +-3.96438236323637619e-18, +-3.32013566934103514e-18, +-7.04565177011613976e-19, +-5.31518303391960226e-19, + 4.50154652365951330e-19, +-5.93659480924412606e-19, + 4.28977576450260125e-19, +-3.55983708850629063e-19, + 2.52935333903181041e-18, +-4.05838158996391745e-19, +-1.47436361447576590e-18, +-8.91209154259569248e-19, +-2.15484348350679504e-20, +-1.05740977154216440e-18, +-1.69341195878780637e-18, +-1.74740322551447962e-19, +-1.59287321289104083e-18, + 5.00467505842476746e-19, +-4.55445296008818711e-20, + 1.25534990549518657e-18, + 1.11051130022035358e-19, +-3.40706169722388767e-19, + 3.43233715978298631e-19, +-8.03219941372286381e-19, +-1.38100870167565993e-18, +-9.16966119051358982e-19, +-1.79351332248395986e-18, +-8.99122066335742755e-19, +-6.22021590089187784e-19, +-1.66834781954782452e-19, +-3.47702489833641577e-19, +-6.00854500589996392e-19, +-3.61664490874528372e-19, +-3.60997820551147769e-19, +-1.51409321762515064e-19, +-3.88054736682270431e-19, +-9.49554107284894809e-19, +// root 4 + 1.98773104287650326e-02, + 1.60993898395757722e-02, + 1.32940214264557956e-02, + 1.11565072698686096e-02, + 9.49089078449528827e-03, + 8.16752797655708254e-03, + 7.10037884413472660e-03, + 6.23335777015053809e-03, + 5.52818698972409959e-03, + 4.95407129822259071e-03, + 4.48360113853747601e-03, + 4.09350614240326822e-03, + 3.76558933763618091e-03, + 3.48627853721541299e-03, + 3.24555209671468971e-03, + 3.03593653230910471e-03, + 2.85176588469804879e-03, + 2.68867067211312318e-03, + 2.54322784816645190e-03, + 2.41271778290435548e-03, + 2.29495237943702678e-03, + 2.18815123789681352e-03, + 2.09085090477680339e-03, + 2.00183733451022791e-03, + 1.92009491867769859e-03, + 1.84476752675033343e-03, + 1.77512838026930905e-03, + 1.71055650851845826e-03, + 1.65051816689791141e-03, + 1.59455203886317348e-03, + 1.54225735200940015e-03, + 1.49328425997458905e-03, + 1.44732600161861244e-03, + 1.40411246573562683e-03, + 1.36340487585129570e-03, + 1.32499137404773894e-03, + 1.28868333125621744e-03, + 1.25431224830345293e-03, + 1.22172714022183559e-03, + 1.19079231812138121e-03, +-2.19396891392088875e-03, +-1.60859440842921588e-03, +-1.21212868863396477e-03, +-9.35309118362949487e-04, +-7.36911674708436615e-04, +-5.90847239496200571e-04, +-4.79136511305742389e-04, +-3.89796763985846137e-04, +-3.16952237168601121e-04, +-2.58603654785589075e-04, +-2.13086162439631108e-04, +-1.77951986377622136e-04, +-1.50663346727148204e-04, +-1.29162231183884395e-04, +-1.11948317297688903e-04, +-9.79588419399223209e-05, +-8.64369835380910555e-05, +-7.68348441441401848e-05, +-6.87484443546589166e-05, +-6.18747302525976875e-05, +-5.59827753280966810e-05, +-5.08941203242726581e-05, +-4.64690910726894545e-05, +-4.25971051171267938e-05, +-3.91896915695336820e-05, +-3.61753896890129430e-05, +-3.34959697017136042e-05, +-3.11035981853897481e-05, +-2.89586875168405128e-05, +-2.70282470094890713e-05, +-2.52846063017736630e-05, +-2.37044179531893362e-05, +-2.22678715745676437e-05, +-2.09580697290153287e-05, +-1.97605286337599291e-05, +-1.86627759338986275e-05, +-1.76540245627538803e-05, +-1.67249066729380231e-05, +-1.58672553176230809e-05, +-1.50739243332223994e-05, + 8.90555766492379835e-05, + 5.94023280358503666e-05, + 4.09321365126583556e-05, + 2.89992068331328230e-05, + 2.10613096176346486e-05, + 1.57788955219352971e-05, + 1.23696138201705152e-05, + 1.00672696863218959e-05, + 8.17130343024338302e-06, + 6.44451325181223322e-06, + 4.98161912699091251e-06, + 3.84935902756032126e-06, + 3.01035316821092429e-06, + 2.39197849708617878e-06, + 1.93059577727452637e-06, + 1.58037362185717031e-06, + 1.30994925983374280e-06, + 1.09786433453099618e-06, + 9.29202695286521247e-07, + 7.93396193799687040e-07, + 6.82818335914840335e-07, + 5.91872133481088377e-07, + 5.16386993480353845e-07, + 4.53211990073282788e-07, + 3.99936458967385671e-07, + 3.54694778657808304e-07, + 3.16027843036380875e-07, + 2.82783355960668918e-07, + 2.54043124007076822e-07, + 2.29069393347166427e-07, + 2.07264797604311502e-07, + 1.88142152690090329e-07, + 1.71301456585260161e-07, + 1.56412216786311935e-07, + 1.43199756287346398e-07, + 1.31434518133958536e-07, + 1.20923649628710842e-07, + 1.11504333787981881e-07, + 1.03038470304096035e-07, + 9.54084063803906449e-08, +-3.13142066748878111e-06, +-1.91770297750844886e-06, +-1.21878972326568647e-06, +-8.02038461586614868e-07, +-5.37549648854935063e-07, +-3.52120270688352209e-07, +-2.26167210175502616e-07, +-1.67544518269461993e-07, +-1.51203346374494090e-07, +-1.34733779902079699e-07, +-1.08176985225453967e-07, +-8.11483588308283150e-08, +-5.96887857676270233e-08, +-4.42090019749864186e-08, +-3.32784311804958360e-08, +-2.54937020864512109e-08, +-1.98518451533815615e-08, +-1.56869161805985746e-08, +-1.25590784543174174e-08, +-1.01734173531815329e-08, +-8.32829150275818790e-09, +-6.88316487766059950e-09, +-5.73834178319974298e-09, +-4.82194992779618837e-09, +-4.08140928922699249e-09, +-3.47773409186942856e-09, +-2.98166013585187992e-09, +-2.57097027585765803e-09, +-2.22861995435395830e-09, +-1.94140548416235128e-09, +-1.69900594105168593e-09, +-1.49328575314996003e-09, +-1.31778149192173536e-09, +-1.16732036290494893e-09, +-1.03773388757476647e-09, +-9.25641106003217449e-10, +-8.28283034667656752e-10, +-7.43395266555405234e-10, +-6.69109190451550337e-10, +-6.03874863999985958e-10, + 9.94989008614631769e-08, + 5.64809476883037451e-08, + 3.31041826956632974e-08, + 2.02450961029406564e-08, + 1.35589997440502767e-08, + 9.79752517894560509e-09, + 5.77316591513241211e-09, + 1.83420789205880304e-09, + 7.09572847133010443e-10, + 1.41717466826071183e-09, + 1.77914885904941096e-09, + 1.54061027615541767e-09, + 1.14244824853668997e-09, + 8.08563118825109146e-10, + 5.72054271491922806e-10, + 4.10981595668107146e-10, + 3.00805476434151346e-10, + 2.24137269985828950e-10, + 1.69747248044819692e-10, + 1.30449731728156320e-10, + 1.01579621365698999e-10, + 8.00476230580893162e-11, + 6.37672264494033280e-11, + 5.13031463037439134e-11, + 4.16513708486065764e-11, + 3.40987101377795154e-11, + 2.81313732089832866e-11, + 2.33743890865402750e-11, + 1.95508024757081814e-11, + 1.64537705702065740e-11, + 1.39272141184172393e-11, + 1.18522209286458421e-11, + 1.01373807247305566e-11, + 8.71183111937958995e-12, + 7.52020581486717839e-12, + 6.51892273469796871e-12, + 5.67343762379803341e-12, + 4.95618863256693124e-12, + 4.34504823200292170e-12, + 3.82214605471694652e-12, +-2.89066939976515652e-09, +-1.55295859963733770e-09, +-8.55648081467836821e-10, +-4.62214700621987965e-10, +-2.31252403382029256e-10, +-1.75234549487004196e-10, +-2.24248351818704401e-10, +-1.38703813716640481e-10, + 1.35334593888087108e-11, + 3.66326248368091594e-11, +-5.64723247948470608e-13, +-1.90508878003219867e-11, +-1.90835066507797278e-11, +-1.41564862850068993e-11, +-9.70831550543143734e-12, +-6.60297829736146149e-12, +-4.55425670833445833e-12, +-3.20193674448598953e-12, +-2.29420230197338331e-12, +-1.67269378634281449e-12, +-1.23895816560484864e-12, +-9.30912057029592983e-13, +-7.08612193476453836e-13, +-5.45840088656931312e-13, +-4.25058378475048791e-13, +-3.34333213743852890e-13, +-2.65413812971198465e-13, +-2.12511866038442113e-13, +-1.71511269237796009e-13, +-1.39448730699645347e-13, +-1.14165041251410359e-13, +-9.40710485267743753e-14, +-7.79842390161852799e-14, +-6.50172977210540168e-14, +-5.44970161897313050e-14, +-4.59100350133638876e-14, +-3.88609171501256925e-14, +-3.30427002812489532e-14, +-2.82156798296067736e-14, +-2.41916653109084717e-14, + 7.58719217553406576e-11, + 3.93475232288189630e-11, + 2.10400242635739840e-11, + 1.27125149536144060e-11, + 6.26613834111598899e-12, +-1.31847727529944655e-12, +-5.39130485888004947e-13, + 6.97286812654484066e-12, + 3.95992627265965436e-12, +-1.21186915142870882e-12, +-1.33479861877956437e-12, +-2.70511164030131097e-13, + 1.67568468316949807e-13, + 2.10324465167268985e-13, + 1.56740916639897696e-13, + 1.04563828700126439e-13, + 6.86890373215551147e-14, + 4.56990849005965754e-14, + 3.10008109093248057e-14, + 2.14472259455600845e-14, + 1.51114538656517292e-14, + 1.08259838756145851e-14, + 7.87457133913662905e-15, + 5.80749622634813458e-15, + 4.33768301769432539e-15, + 3.27812930737086466e-15, + 2.50421165797396717e-15, + 1.93208037794876084e-15, + 1.50463222301111220e-15, + 1.18178972400774617e-15, + 9.35928099720467485e-16, + 7.46696964595895784e-16, + 6.00000758184233050e-16, + 4.85202583108440137e-16, + 3.94996928231328264e-16, + 3.23358917364827590e-16, + 2.66145439764680158e-16, + 2.20263864091469633e-16, + 1.83325916662640403e-16, + 1.53152121558830092e-16, +-1.74185349597095580e-12, +-9.25486562491857201e-13, +-4.27812835866685022e-13, +-2.17431511650901730e-13, +-2.69769347838984439e-13, +-1.99507493800962224e-13, + 2.61802081675203344e-13, + 1.20096566957451020e-13, +-2.46358916338060033e-13, +-8.15840930387904926e-14, + 3.96298555273046104e-14, + 2.77463397621385652e-14, + 6.06004712164527597e-15, +-1.23975869750873081e-15, +-2.10343272768191038e-15, +-1.56956176195780869e-15, +-1.02025110098191959e-15, +-6.49795269473424491e-16, +-4.18297659781794162e-16, +-2.74910660723272637e-16, +-1.84193818342482906e-16, +-1.26109611993798817e-16, +-8.74402486090066947e-17, +-6.18883729999788737e-17, +-4.42856430079328408e-17, +-3.21933380264642676e-17, +-2.35414566542847359e-17, +-1.74338313716087335e-17, +-1.30893282037691015e-17, +-1.00462196900619745e-17, +-7.59826442533161771e-18, +-5.83702275899881358e-18, +-4.49838041267837269e-18, +-3.65619003254840414e-18, +-2.81547043898705081e-18, +-2.20515634090114257e-18, +-1.82139251650257493e-18, +-1.48903732518985892e-18, +-1.09480193773005085e-18, +-8.93017294534681761e-19, + 3.07696990369180419e-14, + 2.00413170138470318e-14, + 1.12553445070558965e-14, + 1.75797670283687656e-15, +-3.01043699745294900e-15, + 1.02940748484431463e-14, + 1.07592948800870607e-14, +-1.64895542481592190e-14, +-1.23633755102997105e-15, + 6.84250579764985872e-15, + 8.57150898577852181e-16, +-8.68971562331779861e-16, +-4.23119392086536130e-16, +-8.62714796929932570e-17, + 8.35093347911959506e-18, + 1.94655521695880673e-17, + 1.44106290693283002e-17, + 8.99358360023429751e-18, + 5.78253101368371235e-18, + 3.43933927732266889e-18, + 2.32653044030723662e-18, + 1.43629354602698556e-18, + 1.08560100062863231e-18, + 6.13663763610306113e-19, + 4.10805485527706971e-19, + 2.75849553585083133e-19, + 1.91445471188549130e-19, + 1.36193196766293859e-19, + 1.92101645521707690e-19, +-2.64996828014036842e-20, + 7.29590785712246552e-20, + 8.64008410944138988e-20, + 6.05454501824554689e-20, +-6.27080896700565813e-20, + 2.57132593899341020e-21, + 5.72211055785522167e-20, +-1.94114280206442613e-20, +-3.73385204705360201e-20, + 9.80747856710839798e-20, + 2.60841144747122246e-20, +-2.05920473784559197e-16, +-2.76890003777339008e-16, +-2.43453902141431439e-16, +-2.58905044933727209e-16, + 8.28920368798166664e-17, + 5.18290145455579065e-16, +-7.04352786145155542e-16, +-2.20839481732001335e-16, + 6.16828927636913419e-16, +-1.19723670760438080e-16, +-1.20424558407918416e-16, + 1.21235688059025054e-18, + 1.39438381508043649e-17, + 5.39723735575310289e-18, + 1.08442993373331119e-18, +-1.16280156316360580e-20, +-1.02846073914783876e-19, +-2.31127668779443472e-19, + 1.10532329904465303e-19, +-2.47295790978182707e-20, + 9.35323183582987648e-20, +-3.77289851892362293e-20, + 9.77556593166973250e-20, +-5.35721680099759522e-20, +-2.22484029460687693e-20, +-4.71539763369913312e-20, + 6.32141705184534593e-20, + 6.51374337694526832e-20, + 6.98593341980287225e-20, +-5.24281076389816618e-20, + 5.29994259230158430e-20, + 7.39539154164155969e-20, + 9.74869886422454917e-20, +-4.53015332635293191e-20, + 4.03098526894718651e-20, + 5.85844458165689074e-20, + 1.50848276993184117e-20, +-1.58003820807891105e-20, + 9.64283974670875302e-20, + 5.90380725403894429e-20, +-1.42873888128798459e-17, + 2.71917778333431231e-18, + 4.59042486352974408e-19, + 2.80785809369313759e-18, + 1.47936776610527881e-17, +-6.26005759022726898e-18, +-3.26788011919699331e-17, + 4.67267963944073496e-17, +-1.34851445314737011e-17, +-9.35672543622002991e-18, + 4.48779183107645363e-18, + 1.27292138137238425e-18, +-6.48106027222274695e-20, + 5.80196741830599895e-20, +-3.66657617806246110e-21, +-2.46422285084754130e-21, +-1.65784243989904076e-20, + 4.35236923825641116e-20, + 1.36172581712129669e-19, + 4.41303439416481087e-21, + 8.46168574000914369e-20, +-3.33697362162861010e-20, +-1.62519163952768907e-20, + 3.34750217469095428e-21, + 2.15794039509120505e-21, + 6.05019248500623468e-21, + 5.18758928240985914e-21, +-1.14393831680564662e-20, + 8.86287245847262397e-20, + 2.14890961302997148e-22, + 3.54660042467734471e-20, + 6.62974636485193230e-20, + 4.66686400832156801e-20, +-5.08276683063713267e-20, + 2.57522768780185352e-20, + 2.80801815586222375e-20, +-2.84432294232712679e-20, +-4.23734279449447616e-20, + 5.76959973759940738e-20, + 3.38799233958165366e-20, + 1.37477802441596372e-18, + 9.41741424931800031e-20, + 4.86779091749331774e-19, + 1.39953779771293409e-19, +-4.71022775128785020e-19, +-1.40025690947794571e-18, + 1.37933961156156878e-18, +-1.83331628499138301e-19, +-1.39878063791028846e-18, + 5.99725331447931694e-19, +-3.03845660063886812e-20, +-3.10695351346598660e-19, + 1.06348215704553491e-19, + 3.38604629915409998e-19, + 1.77818958529921775e-19, + 2.49981550283057402e-19, + 1.56247426303633675e-19, + 8.24881730990100698e-20, + 2.02957451828735631e-19, + 6.37292352025203740e-20, + 8.84501504579216758e-20, + 1.89449188559151799e-20, + 1.74698752335246349e-19, + 9.37145400108738832e-21, + 3.33464576217984365e-20, + 5.01706756333761270e-20, + 4.38121313436862505e-20, + 1.29573380254298419e-20, + 6.23455814950710991e-20, + 4.31928403111023283e-21, + 8.41635724073060349e-20, + 3.49218117946871768e-20, + 6.54940513925141935e-20, + 3.30117027983339386e-20, + 5.24163548852481181e-21, + 1.63927430791468395e-20, + 5.93671108711685405e-21, +-4.24992788593642293e-20, + 7.19415551691096210e-20, + 4.86438964445252160e-20, +-2.34794524999787127e-19, +-5.22427436388847237e-19, +-4.43754940071422549e-19, +-3.98880165682644241e-19, +-5.69517945892433519e-19, +-1.99859636195811846e-19, + 1.67960630546572221e-19, +-4.50787297962833176e-19, + 2.24046013018458131e-19, + 5.56727750297653844e-20, +-6.59044907042315906e-20, +-2.09801133422847358e-20, + 1.25678025189021616e-19, + 2.12107029057702916e-19, +-8.85401853845183114e-20, +-5.12234739256146905e-20, + 6.41916090406359002e-20, +-8.15659076051852492e-20, +-1.01077829275017368e-19, + 3.63889269852492579e-20, + 4.51288507665109541e-20, +-7.69223037620479418e-21, + 9.44884438893341549e-20, +-4.72115577372961205e-20, + 9.51061412372108670e-21, +-4.34063767688207484e-20, + 5.01294231293846471e-20, + 3.87127720815874471e-20, + 6.69495124186811135e-20, + 4.36963149775826959e-20, + 8.33108649832682193e-20, + 9.71441073161639634e-20, + 5.76066789437171336e-20, +-1.28696423242048957e-20, + 2.10441816959132190e-21, + 4.05046822625769569e-21, +-1.10121497591450584e-21, + 1.59232808368397147e-20, + 3.96441788932033911e-20, + 5.48040338740648356e-20, +-8.89724692086973054e-19, +-8.62275368660076775e-19, +-4.79257212046002590e-19, +-3.59674480759617127e-20, +-3.08040413397555057e-19, +-4.18182094731709044e-20, +-2.60207716654496409e-19, +-8.36623709919515599e-20, +-8.31421739098456529e-21, +-1.26937116946187582e-20, + 6.13540906648253435e-20, +-1.18704357964129070e-20, + 6.95489326610963071e-20, +-1.05356946564269926e-19, +-1.10741460155839915e-19, +-8.62266693587364405e-20, +-1.28329239169754804e-20, +-1.34100792851838170e-19, +-1.34610733457105979e-20, +-1.33270436812296767e-19, +-2.61253358428532264e-21, +-1.23776250292639673e-20, +-8.81016036874315673e-20, +-1.26166854404521579e-19, +-6.45476134549369385e-20, +-1.02042911274248005e-19, +-9.73561483603553729e-20, +-1.11674223503264023e-19, +-6.30222866377089138e-20, +-4.73012643542334773e-20, +-1.09075923658924189e-19, +-3.80674892572729838e-20, +-5.31412903254238892e-20, +-8.66428718770701685e-20, +-8.40161748415494204e-20, +-4.01600426264619390e-20, +-7.39841679252292036e-20, +-1.02113304454925085e-19, +-6.55146616704652885e-20, +-3.53861712911722661e-20, + 2.73934678832263967e-01, + 2.38542618350630731e-01, + 2.12213998261590819e-01, + 1.91768015616662069e-01, + 1.75350091990390533e-01, + 1.61812851875955455e-01, + 1.50428305367190457e-01, + 1.40742494585898104e-01, + 1.32466002101160135e-01, + 1.25376674777289948e-01, + 1.19271031773778971e-01, + 1.13965290390754592e-01, + 1.09306945059828325e-01, + 1.05176383352579408e-01, + 1.01481387743768220e-01, + 9.81504909290711325e-02, + 9.51275670165976223e-02, + 9.23678914427480124e-02, + 8.98353352733662486e-02, + 8.75003526842765000e-02, + 8.53385147483791684e-02, + 8.33294234404896861e-02, + 8.14558947160719665e-02, + 7.97033352758653724e-02, + 7.80592609779851981e-02, + 7.65129203517952716e-02, + 7.50549971340890298e-02, + 7.36773729418991885e-02, + 7.23729362205083326e-02, + 7.11354271662556492e-02, + 6.99593108821076337e-02, + 6.88396728851351641e-02, + 6.77721324548053589e-02, + 6.67527703300149211e-02, + 6.57780680285241226e-02, + 6.48448566432671264e-02, + 6.39502734144526963e-02, + 6.30917247192614855e-02, + 6.22668543875450620e-02, + 6.14735164607307163e-02, +-2.06557085714729020e-02, +-1.50229455503050179e-02, +-1.14627402418071081e-02, +-9.07589575125467181e-03, +-7.39995021078648785e-03, +-6.17431720997630839e-03, +-5.23313119728391687e-03, +-4.46699201611760500e-03, +-3.82073215332447407e-03, +-3.27926535035510947e-03, +-2.83605169466891573e-03, +-2.47763511660387039e-03, +-2.18689379170495125e-03, +-1.94842202884227210e-03, +-1.75025785923337788e-03, +-1.58353494850677480e-03, +-1.44169904459997590e-03, +-1.31984437383120636e-03, +-1.21424051750185203e-03, +-1.12200690020017898e-03, +-1.04088777353016472e-03, +-9.69094213144252236e-04, +-9.05191234021069735e-04, +-8.48015804233205888e-04, +-7.96616395929968381e-04, +-7.50207799324801141e-04, +-7.08136919198753840e-04, +-6.69856584888672358e-04, +-6.34905282767060154e-04, +-6.02891317803709277e-04, +-5.73480323712701519e-04, +-5.46385330521550593e-04, +-5.21358803783153837e-04, +-4.98186217210603308e-04, +-4.76680827725441190e-04, +-4.56679400625528936e-04, +-4.38038690942080863e-04, +-4.20632530728720405e-04, +-4.04349404990060070e-04, +-3.89090424042176403e-04, + 8.92935340317967574e-04, + 5.47320849945330382e-04, + 3.58116862535232539e-04, + 2.46596778769048728e-04, + 1.76933179115760657e-04, + 1.32426874510740755e-04, + 1.04879945653202605e-04, + 8.76332068437358304e-05, + 7.41254448975544515e-05, + 6.13306973921193109e-05, + 4.97315330226852432e-05, + 4.01967632965672344e-05, + 3.27720699078560719e-05, + 2.70627216096310845e-05, + 2.26382193553873587e-05, + 1.91606267903310154e-05, + 1.63868279137947569e-05, + 1.41441920374030935e-05, + 1.23088328812845869e-05, + 1.07903755633624069e-05, + 9.52179030687832597e-06, + 8.45259366364475276e-06, + 7.54423059987653113e-06, + 6.76688137704273965e-06, + 6.09721543546225724e-06, + 5.51678622304938197e-06, + 5.01086731969974778e-06, + 4.56759723708175153e-06, + 4.17734329161234153e-06, + 3.83222305497070093e-06, + 3.52574056155167768e-06, + 3.25250705343628957e-06, + 3.00802466965441454e-06, + 2.78851747051150638e-06, + 2.59079839123264059e-06, + 2.41216370583387716e-06, + 2.25030872781548507e-06, + 2.10326003121477601e-06, + 1.96932061647952035e-06, + 1.84702528891056687e-06, +-3.91590496591216522e-05, +-2.06683706234701423e-05, +-1.18127511293539902e-05, +-7.21256340899162784e-06, +-4.60268115422342445e-06, +-2.91122939354047348e-06, +-1.76421900886903389e-06, +-1.20337954536090275e-06, +-1.08668252036819889e-06, +-1.03370544079193640e-06, +-8.86917233346693839e-07, +-7.02503189713286628e-07, +-5.40653147258875339e-07, +-4.16645434776488942e-07, +-3.25156762526996095e-07, +-2.57569756153676405e-07, +-2.06947569084988327e-07, +-1.68417536577267013e-07, +-1.38638718768154868e-07, +-1.15301124081060584e-07, +-9.67808549786386777e-08, +-8.19162851330200578e-08, +-6.98627928222382628e-08, +-5.99970154431759025e-08, +-5.18525821482488780e-08, +-4.50762061478840371e-08, +-3.93971907042771705e-08, +-3.46059291868930482e-08, +-3.05385341492438073e-08, +-2.70657065930225642e-08, +-2.40845793055586175e-08, +-2.15126733988465766e-08, +-1.92833742905598574e-08, +-1.73425125677007431e-08, +-1.56457565419891670e-08, +-1.41566070225206534e-08, +-1.28448430713559760e-08, +-1.16853081396087022e-08, +-1.06569555768713764e-08, +-9.74209295303443548e-09, + 1.67113729078954856e-06, + 7.69284360405026489e-07, + 3.86451451970832205e-07, + 2.09571394213833485e-07, + 1.27057112339713370e-07, + 8.79812142937111966e-08, + 5.41115384321800127e-08, + 1.73580945461687461e-08, + 1.79228686515659627e-09, + 6.27086141997624887e-09, + 1.12445860551519889e-08, + 1.11830632001757315e-08, + 8.93055145799610764e-09, + 6.64076366127608936e-09, + 4.88554528324459777e-09, + 3.63231536649113911e-09, + 2.74366127709114320e-09, + 2.10556245748319144e-09, + 1.63959895170130339e-09, + 1.29365554591072520e-09, + 1.03287783507389807e-09, + 8.33564672118593270e-10, + 6.79306518356350776e-10, + 5.58546862255626065e-10, + 4.63018305379772647e-10, + 3.86720778997522491e-10, + 3.25241980111606141e-10, + 2.75297478959939611e-10, + 2.34414914386912130e-10, + 2.00713698113296007e-10, + 1.72749520426680832e-10, + 1.49403096699997767e-10, + 1.29799721486361076e-10, + 1.13250406046507169e-10, + 9.92084404385838045e-11, + 8.72370004460233351e-11, + 7.69847399617471083e-11, + 6.81673696587447539e-11, + 6.05534720168458446e-11, + 5.39536557499992994e-11, +-6.89252980042110632e-08, +-2.79813353282576315e-08, +-1.25575373357889606e-08, +-5.93817312967912430e-09, +-2.68499250806110484e-09, +-1.55778427330070559e-09, +-1.91313623591410174e-09, +-1.48487167985799366e-09, +-1.02704070273911116e-10, + 3.56169010086438519e-10, + 1.09389113806636621e-10, +-8.48276316293903046e-11, +-1.23245971193145686e-10, +-1.02061392689175592e-10, +-7.40914062256454588e-11, +-5.24241840698570344e-11, +-3.73689267500188298e-11, +-2.70686777503967277e-11, +-1.99434806971314707e-11, +-1.49290855387383310e-11, +-1.13381379110410024e-11, +-8.72454013937046133e-12, +-6.79390779498393680e-12, +-5.34839901400118816e-12, +-4.25265442936884466e-12, +-3.41257594510506953e-12, +-2.76172862504207736e-12, +-2.25261485986159355e-12, +-1.85077913038182752e-12, +-1.53096886700231120e-12, +-1.27446271976327763e-12, +-1.06723242541597256e-12, +-8.98667327981283951e-13, +-7.60679177408011191e-13, +-6.47043857204533956e-13, +-5.52932441470484147e-13, +-4.74582680115794033e-13, +-4.09018914764077030e-13, +-3.53895217880850476e-13, +-3.07341177147549947e-13, + 2.74799881443024442e-09, + 9.86573093122211574e-10, + 3.97950509136173687e-10, + 1.87208837927838450e-10, + 9.01909276657415297e-11, + 5.30438951976761199e-12, +-1.51040337829399754e-11, + 5.20830664187861462e-11, + 4.53890223359423924e-11, +-2.98846777975379084e-12, +-1.18014483248936821e-11, +-4.20784475453708151e-12, + 2.24250726895426130e-13, + 1.20478899218981880e-12, + 1.05641122022200711e-12, + 7.53178785715573544e-13, + 5.15260485473725211e-13, + 3.53913946639954397e-13, + 2.46999826057223870e-13, + 1.75471668032068734e-13, + 1.26765450498202692e-13, + 9.30076406812557670e-14, + 6.92084992483398262e-14, + 5.21638455091516201e-14, + 3.97832006279488433e-14, + 3.06717688889569985e-14, + 2.38915706329811394e-14, + 1.87758871945218584e-14, + 1.48858797431799871e-14, + 1.18936752105765987e-14, + 9.58211181676496848e-15, + 7.76313321963310612e-15, + 6.33401265143234349e-15, + 5.20608890591772957e-15, + 4.29993647165466105e-15, + 3.57321783522812645e-15, + 2.97912196904058640e-15, + 2.50476502338719556e-15, + 2.10893839109830994e-15, + 1.78368310835423820e-15, +-1.06304668464720399e-10, +-3.40305797620875689e-11, +-1.19302016259071234e-11, +-4.50490560426687015e-12, +-3.06304771652504092e-12, +-2.60444244215997242e-12, + 1.54414253894888497e-12, + 1.81675705575034226e-12, +-1.84667242271101639e-12, +-1.05799804220568713e-12, + 1.88454856431877823e-13, + 2.46692628536607410e-13, + 7.95776912371289811e-14, + 5.17866867760386068e-15, +-1.06743481004479325e-14, +-9.99655879946434717e-15, +-7.00251694669124895e-15, +-4.65289275837971052e-15, +-3.09095044919250520e-15, +-2.08147005700594772e-15, +-1.43421504630866519e-15, +-1.00615905091339003e-15, +-7.11447626415942993e-16, +-5.16890256092668454e-16, +-3.72809132771729741e-16, +-2.77109881812922171e-16, +-2.02241703208776755e-16, +-1.51415838782402746e-16, +-1.15423366628058527e-16, +-8.93110994195314964e-17, +-6.80295265849125412e-17, +-5.55868468867331920e-17, +-4.40795156304163627e-17, +-3.58886738482505866e-17, +-2.95514595798608383e-17, +-1.96273504066906274e-17, +-1.44975743534363645e-17, +-1.22131469588983164e-17, +-9.36196587592259926e-18, +-1.07237973192753843e-17, + 3.99471712549335318e-12, + 1.14801668310666817e-12, + 3.83294219449470759e-13, + 1.15954080455397661e-13, +-3.70417435690205764e-15, + 6.97321124004607403e-14, + 1.34023043549410704e-13, +-1.19607926443699110e-13, +-4.57763533950513700e-14, + 5.76384672710329921e-14, + 1.54620057429817110e-14, +-5.38550784996176452e-15, +-3.88107886938202979e-15, +-1.09786358198107172e-15, +-1.06690511655750171e-16, + 8.61711668795190414e-17, + 9.47902937438387788e-17, + 6.27513136949228598e-17, + 4.04376892934644652e-17, + 3.33959783846090836e-17, + 1.80383615831410681e-17, + 1.11153527684904341e-17, + 1.37562631493364285e-17, + 3.34131143230576212e-18, + 9.11516500270705553e-18, + 2.71732845180012966e-19, + 4.38550371337106000e-18, + 5.68052267516499141e-18, + 5.47074571120206048e-18, + 2.40467746107634714e-19, + 5.78438176624045343e-18, +-1.97738914911203323e-18, +-1.17014392575451484e-18, + 1.65452090875377247e-18, +-3.67239325165448440e-18, + 2.84688514186089457e-18, +-5.29370201446695229e-19, + 5.61294822624943707e-19, + 1.75058625529168581e-18, +-3.07498238551537031e-20, +-1.46431834132767182e-13, +-3.72465204630112753e-14, +-1.11876025973387147e-14, +-5.01922308564003971e-15, +-1.17419265598723987e-15, + 4.68763097573594316e-15, +-4.17431153038724107e-15, +-4.51499170728137481e-15, + 5.53219718879217108e-15, +-2.11883715540515043e-16, +-1.16118907190134136e-15, +-1.16607431723655955e-16, + 9.35681420104973367e-17, + 4.99579255754755032e-17, + 1.26157599143776334e-17, + 3.69525490503626046e-18, + 8.70967836338953626e-18, + 8.37641762199013226e-19, + 5.73628246620443936e-18, + 7.72511940722944711e-18, +-3.00171426572471644e-18, + 1.36940965899841505e-19, + 4.72866181673653009e-18, + 1.25962136920946567e-20, + 2.06698616985328975e-18, + 2.96307010845429078e-19, + 4.35367706757418707e-18, + 2.75103087245894304e-18, + 3.59141118808182559e-18, + 1.89367565796814615e-18, + 4.27668877931823764e-18, +-2.36013250175018555e-18, + 2.05486784819770062e-18, +-1.45726300229273071e-18, + 9.52126280867266538e-19, + 3.21870198072138911e-18, +-8.11852583667646648e-19, + 2.56090669127830717e-18, + 1.72081134347221766e-18, + 1.73648583203147384e-18, + 5.23478712329382218e-15, + 1.21684906617570904e-15, + 2.95544896309961339e-16, + 8.16548595317251588e-17, + 1.49612652172400261e-16, + 4.27207200174526236e-17, +-3.63237386580635310e-16, + 3.74263053017875237e-16, +-2.95866076365529671e-17, +-1.18141886802578909e-16, + 3.50196376177453578e-17, + 1.62719025265040347e-17, +-5.94099210602034520e-18, + 1.43253011504872235e-19, + 4.21425874570166612e-18, + 5.09202126146276756e-20, + 6.88193688467487196e-18, + 2.62588168175653371e-18, + 1.14340384986749828e-18, + 3.27520932682186130e-18, + 1.86221281602954319e-18, +-1.05552390222338182e-18, + 4.71150573379925662e-18, +-4.34615822113815656e-19, + 1.43224916569412518e-18, +-1.68371780794681948e-18, + 4.58926088183035325e-18, + 1.98274753131839401e-18, + 2.17328779622966573e-18, + 2.40175555369822227e-19, +-2.36654425094699983e-18, + 1.48993660218872577e-18, + 2.87532849930039524e-19, + 1.46853079983534719e-18, +-5.50515777067454981e-19, + 3.42931966249339920e-18, +-4.90058836460241782e-20, + 1.84110460770688015e-19, + 3.15918321979512656e-19, + 4.40040096095217597e-19, +-1.95725316816491353e-16, +-4.53738638906280632e-17, +-1.16222991022149777e-17, + 3.46574464580482390e-18, +-4.25182934181662311e-18, +-7.94406630734874478e-18, + 1.72984594071905877e-19, + 6.48451744272493692e-18, +-1.00768736258279664e-17, +-1.63218248679891787e-18, + 5.22487359055245705e-18, +-5.94234738387865119e-18, +-3.22357372323481542e-18, + 1.12899411101121036e-18, + 2.72953458336688720e-18, + 8.33430431580858272e-19, + 6.19835192539733678e-18, + 2.51810180999684082e-18, + 2.92553438997838852e-18, + 5.01609401081618865e-18, + 2.32770470777049112e-18, + 2.49455326250631527e-18, + 2.48149751660687590e-18, + 3.08684954250099111e-18, + 4.87781764845611613e-18, + 2.85294657482393274e-19, + 6.72058488231171037e-18, + 3.55494399184142521e-18, + 1.11509101217141050e-18, + 2.25633399921107096e-18, + 2.07765061751149650e-18, +-2.64298034166198594e-19, + 2.69082346270932903e-18, + 5.02713334848134567e-19, + 1.14382405934331332e-18, + 5.42683623671154013e-18, + 1.47656192275783992e-18, + 3.58118789689205820e-18, + 3.39076690935846376e-18, + 7.46117478730335291e-19, +-1.27164156370468489e-19, +-9.74741669487732441e-18, +-1.98897761309357783e-18, + 4.20767448306597466e-19, +-2.33770180979822408e-18, +-2.05497567079310900e-18, + 5.09808504269057323e-18, +-6.77355842049469696e-18, +-2.38002646099850828e-18, +-1.74657539360272672e-18, + 3.47807992698233564e-18, +-1.40764832080798948e-18, +-3.82449182434142407e-18, + 8.27634676797608860e-20, +-3.89958777481502007e-19, +-2.77531520383419548e-18, + 1.77275646858071821e-18, + 3.33835329400316032e-20, +-2.45168500349553514e-19, + 4.60117872233408472e-18, + 4.57392578076041952e-19, +-9.83721372158244699e-19, + 1.19494012188764093e-18, + 6.05010206819387873e-19, + 1.05486185731562206e-18, +-1.95001961867405918e-18, + 1.14879332716559435e-18, + 2.01776922579570108e-18, + 7.03089744817383606e-19, + 1.90524201572402969e-18, + 2.43858125691703534e-18, +-5.00315230419456324e-19, + 1.53121651905455693e-19, + 2.89636909887488482e-18, + 5.78509293465536817e-19, + 7.87811349992283940e-19, + 3.13633300908319184e-18, + 1.65272203269333519e-18, + 1.47369063581375869e-18, + 4.98713096233207600e-19, +-7.84677210690996156e-18, +-9.74027052070179810e-18, +-4.03959602724646227e-18, +-2.96597655421429716e-18, +-1.19490398903487566e-18, +-3.70076442875605263e-18, +-1.66926064596631491e-18, +-1.52104830109204830e-18, +-2.58992767581224073e-19, +-2.44083678612583230e-18, +-1.28911094795552069e-19, +-2.49732463159162187e-18, + 3.09583381849749827e-19, +-3.30577279677680235e-18, +-2.72840804089321081e-18, +-3.16048281269625724e-19, + 1.50761616070922947e-18, +-1.77449033573277592e-18, +-1.69391583828793308e-18, + 1.38453386909543646e-18, +-2.15933076870396732e-18, + 9.49384208981014909e-19, + 1.78832434139960006e-18, +-8.86265681424538771e-19, + 1.37797640507505535e-18, + 1.06945492645775646e-18, + 4.09559636185517273e-19, +-1.69543138178311134e-18, +-1.16556079202785980e-18, +-2.59187429626613888e-18, +-1.54359718964223955e-18, +-1.98263822133976152e-18, + 2.53225170106949340e-18, + 8.25184589826478866e-19, +-2.64736036025200979e-18, +-1.16260648027538720e-18, +-8.79580875166445047e-19, + 1.66080361842044959e-18, +-5.44420243397355751e-19, +-1.79740660924711275e-18, +// nroots = 6 +// root 0 + 9.59534352782618449e-01, + 9.50030789473728099e-01, + 9.37074209673927405e-01, + 9.19104942546573489e-01, + 8.93981766912974818e-01, + 8.59232149786355759e-01, + 8.13102753954919044e-01, + 7.56443592188877467e-01, + 6.93839892652749812e-01, + 6.31825390471694948e-01, + 5.75380245899862919e-01, + 5.26364438308671634e-01, + 4.84462530233353617e-01, + 4.48586468018451812e-01, + 4.17623580125648597e-01, + 3.90653371356454227e-01, + 3.66955342485990099e-01, + 3.45968879948163166e-01, + 3.27253808405297775e-01, + 3.10460223792732581e-01, + 2.95306577043682406e-01, + 2.81563773600533140e-01, + 2.69043501472084556e-01, + 2.57589541475621242e-01, + 2.47071208616964078e-01, + 2.37378338965365282e-01, + 2.28417413169067551e-01, + 2.20108526852588249e-01, + 2.12382999597007072e-01, + 2.05181470776401975e-01, + 1.98452370376456050e-01, + 1.92150681370850118e-01, + 1.86236930791393307e-01, + 1.80676361657355455e-01, + 1.75438249033458504e-01, + 1.70495331771664455e-01, + 1.65823337732330267e-01, + 1.61400585021510112e-01, + 1.57207645412990982e-01, + 1.53227058927207310e-01, +-4.06934873155473820e-03, +-5.48844794802141617e-03, +-7.54848165924095014e-03, +-1.05334279714566353e-02, +-1.47254956913350950e-02, +-2.01305445429770385e-02, +-2.59664200928273088e-02, +-3.04399103653766184e-02, +-3.17925565474007354e-02, +-2.99513852176135631e-02, +-2.64070158738252229e-02, +-2.26361972514870988e-02, +-1.93272143479372473e-02, +-1.66079106645169554e-02, +-1.44028126096958364e-02, +-1.26045993540643084e-02, +-1.11223459368504900e-02, +-9.88683270030318341e-03, +-8.84631168713133180e-03, +-7.96182719028400328e-03, +-7.20367090360788005e-03, +-6.54888031258304189e-03, +-5.97948277546333281e-03, +-5.48124894365519064e-03, +-5.04279469061855948e-03, +-4.65492469445583611e-03, +-4.31014614824301503e-03, +-4.00230401176894599e-03, +-3.72630428587061337e-03, +-3.47790184249400711e-03, +-3.25353615470519442e-03, +-3.05020295417983422e-03, +-2.86535310819159257e-03, +-2.69681231269161027e-03, +-2.54271684433999331e-03, +-2.40146180341520819e-03, +-2.27165914728694488e-03, +-2.15210345358061907e-03, +-2.04174382767446190e-03, +-1.93966072582230043e-03, +-1.46713681226150552e-04, +-2.11893399802565022e-04, +-3.08401974786246219e-04, +-4.43499248883900553e-04, +-6.05802834009149514e-04, +-7.32102274308713105e-04, +-6.91943260925279523e-04, +-3.89842157587239155e-04, + 5.25756426864374454e-05, + 3.76272985735855766e-04, + 4.81428432821202272e-04, + 4.49550839769067765e-04, + 3.76153655169812935e-04, + 3.05361016665961125e-04, + 2.47943492606960900e-04, + 2.03269717594831167e-04, + 1.68544835423665458e-04, + 1.41266988571903129e-04, + 1.19566232663444229e-04, + 1.02091437343183094e-04, + 8.78627064921153999e-05, + 7.61600688735057646e-05, + 6.64469016956406735e-05, + 5.83177597213332244e-05, + 5.14624476743762507e-05, + 4.56409038949581191e-05, + 4.06653756415981742e-05, + 3.63875894125599740e-05, + 3.26893952370173002e-05, + 2.94758614904596899e-05, + 2.66701211224993869e-05, + 2.42094849607462755e-05, + 2.20424821213990001e-05, + 2.01265859661272471e-05, + 1.84264520026613598e-05, + 1.69125416319044645e-05, + 1.55600392321729134e-05, + 1.43479940741890671e-05, + 1.32586358853494850e-05, + 1.22768255086248898e-05, +-4.40052604109702547e-06, +-6.59238188648208914e-06, +-9.60724015439774112e-06, +-1.28109205986822224e-05, +-1.34638524267265323e-05, +-5.75715144540033960e-06, + 1.40506547415839217e-05, + 3.46149365618307110e-05, + 3.51625766667097654e-05, + 1.75145655509636844e-05, + 1.38208625022996093e-06, +-5.38332809402379933e-06, +-6.31756125642153393e-06, +-5.37225754159567956e-06, +-4.21653752245343002e-06, +-3.26799038895008229e-06, +-2.55226878640113168e-06, +-2.01817289661326493e-06, +-1.61600125261648366e-06, +-1.30907161053665744e-06, +-1.07165462764150135e-06, +-8.85701797864176051e-07, +-7.38390055135338313e-07, +-6.20471924893775866e-07, +-5.25181705979990424e-07, +-4.47502858741093684e-07, +-3.83669768749525743e-07, +-3.30823610416558164e-07, +-2.86771148824832215e-07, +-2.49813378840988636e-07, +-2.18622239574341943e-07, +-1.92150873515416717e-07, +-1.69567588949799022e-07, +-1.50206768458332567e-07, +-1.33532026637176004e-07, +-1.19108313116719652e-07, +-1.06580611455828820e-07, +-9.56575454547737886e-08, +-8.60986687714140501e-08, +-7.77045400558932745e-08, +-1.11923464490700220e-07, +-1.63550740561702610e-07, +-2.08442208295669895e-07, +-1.66441182592456586e-07, + 1.47016627550191650e-07, + 8.72022189142660037e-07, + 1.49014056063785021e-06, + 8.21118202375304019e-07, +-7.25526021701924270e-07, +-1.23801980868627256e-06, +-7.08278049030554335e-07, +-1.86589585061607865e-07, + 2.88593245407404019e-08, + 7.41359271774649130e-08, + 6.70111521483806500e-08, + 5.15713266161552350e-08, + 3.84661805644660445e-08, + 2.88000190196578274e-08, + 2.18358184094046394e-08, + 1.67847918832724717e-08, + 1.30707633818396210e-08, + 1.03002309168753964e-08, + 8.20534428039605300e-09, + 6.60151199876386057e-09, + 5.35955508823565549e-09, + 4.38770473426135476e-09, + 3.61984832974190587e-09, + 3.00773598848778472e-09, + 2.51572999148093672e-09, + 2.11721461891271769e-09, + 1.79210598915266105e-09, + 1.52510301704062451e-09, + 1.30444327029001985e-09, + 1.12100847750556830e-09, + 9.67674198968210394e-10, + 8.38832554225153239e-10, + 7.30038434861590610e-10, + 6.37745322406606028e-10, + 5.59105844925918785e-10, + 4.91820595659207348e-10, +-2.29741532499600624e-09, +-2.73893948253853274e-09, +-1.15475289964830644e-09, + 6.91679413873814331e-09, + 2.61546621144659246e-08, + 4.26168843144419629e-08, + 6.97673454128444949e-09, +-7.11107848581310819e-08, +-6.31594130064810785e-08, + 1.00785397633532099e-08, + 3.25613379708061473e-08, + 1.78769224147767415e-08, + 5.14382918939653444e-09, + 3.38383406798997057e-10, +-7.34331859812332158e-10, +-7.41345826375416837e-10, +-5.65315647555281583e-10, +-4.08342837145647544e-10, +-2.94598501322127114e-10, +-2.15139797797898082e-10, +-1.59410289141687509e-10, +-1.19784435370705703e-10, +-9.11814971220980819e-11, +-7.02367513921806100e-11, +-5.46950105760030812e-11, +-4.30208102585242364e-11, +-3.41525329724741836e-11, +-2.73452870763527428e-11, +-2.20694911629043340e-11, +-1.79437669293280746e-11, +-1.46903699453139977e-11, +-1.21047404933547899e-11, +-1.00347603117183540e-11, +-8.36618939810110671e-12, +-7.01249275476406971e-12, +-5.90754802715347049e-12, +-5.00049736209791635e-12, +-4.25181128389912020e-12, +-3.63070069329271903e-12, +-3.11290626420531056e-12, +-2.98934403860628098e-11, + 3.79607577523136309e-12, + 1.58863604306401574e-10, + 5.57911526090816681e-10, + 9.77252152466901541e-10, +-6.67956485329813373e-12, +-3.02700046763449900e-09, +-2.27767311159513970e-09, + 2.71865548574480195e-09, + 2.35140749769532497e-09, +-2.27635375420578226e-10, +-7.05153902580813533e-10, +-3.40355226798236398e-10, +-9.48334322577911490e-11, +-1.19809457162242334e-11, + 6.21174766403302409e-12, + 7.38182720256618836e-12, + 5.61191109658777445e-12, + 3.94292965075547060e-12, + 2.75228072948697547e-12, + 1.94331962483128548e-12, + 1.39288128924852487e-12, + 1.01321345374222553e-12, + 7.47311934018821783e-13, + 5.58201576965970507e-13, + 4.21842039430223448e-13, + 3.22230976917861658e-13, + 2.48625685208961842e-13, + 1.93612520975245584e-13, + 1.52087003690940550e-13, + 1.20417812014126286e-13, + 9.60779682968216690e-14, + 7.72040765818112340e-14, + 6.24414200968192277e-14, + 5.08166303751014159e-14, + 4.16116955324891414e-14, + 3.42443607173309728e-14, + 2.83539832326243204e-14, + 2.35759927492425131e-14, + 1.96987238131674454e-14, + 2.57403329474762159e-13, + 2.63556083116846334e-12, + 9.33191512151822524e-12, + 1.85767591746354327e-11, + 2.64218807803328683e-12, +-8.29364787440929656e-11, +-9.07840742341813794e-11, + 1.58119750039329120e-10, + 1.13366928113203017e-10, +-1.02654440855029554e-10, +-5.47865672936964876e-11, + 8.26624176055717159e-12, + 1.25991918804116902e-11, + 5.19510907503361586e-12, + 1.35843664016733203e-12, + 1.98712274589716012e-13, +-4.56539597621023522e-14, +-6.70534939592209440e-14, +-5.08862162555832698e-14, +-3.48751671385958161e-14, +-2.36248986779159459e-14, +-1.61877091349527392e-14, +-1.12638273030365776e-14, +-7.93486946635178139e-15, +-5.68043258457165900e-15, +-4.11290736012771233e-15, +-3.03346909060655212e-15, +-2.23620289039541278e-15, +-1.69350211931057345e-15, +-1.27406772019867366e-15, +-9.86607229720072686e-16, +-7.56036145557216001e-16, +-5.87654373294891151e-16, +-4.53620120901514918e-16, +-3.63223701876343862e-16, +-2.83481195020222356e-16, +-2.33663732054899239e-16, +-1.78088156139958945e-16, +-1.52280078510321295e-16, +-1.18997720618954172e-16, + 3.49506967827482363e-14, + 1.28035689107531829e-13, + 2.93057061971530125e-13, + 1.57255434746693682e-13, +-1.50387140220492882e-12, +-3.18810138498688283e-12, + 4.58314104125069821e-12, + 6.70076009124005177e-12, +-8.37199232563960760e-12, +-2.12550666822198512e-12, + 2.99280110210850051e-12, + 7.91065529067346756e-13, +-2.19086004751658822e-13, +-1.85297501688083803e-13, +-6.56959986072518354e-14, +-1.60145028497664479e-14, +-2.43118350229892641e-15, + 3.29444688860132012e-16, + 5.74932960846518666e-16, + 4.32429449375395228e-16, + 2.85145150692376752e-16, + 1.80980291134174345e-16, + 1.22062047421381488e-16, + 9.54638573198207034e-17, + 8.05391943825848313e-17, + 5.65628289048497320e-17, + 2.90859351457137026e-17, + 2.52458189572362233e-17, + 1.55686280031351003e-17, + 3.22367625367011920e-18, + 4.00788586609152768e-18, + 6.43643282768307272e-18, + 6.71684456298758293e-18, + 9.59829467020673702e-19, + 3.36182960974906351e-18, + 9.24044695195536250e-18, +-8.19361558770627363e-18, + 1.02347660089108727e-17, +-4.23695918732951404e-18, +-8.97322205948955643e-18, + 1.46164999837663252e-15, + 3.83435157369401887e-15, + 4.00446391157964079e-15, +-1.80378467875748515e-14, +-7.40464194092032852e-14, + 4.21920722801781063e-14, + 3.26443017914560048e-13, +-3.45278342163065983e-13, +-1.74679213636827798e-13, + 3.10285165001026342e-13, +-2.12887626262194034e-14, +-5.60321189053293447e-14, +-6.44395540619503901e-15, + 4.01400575889028323e-15, + 2.29582590703261847e-15, + 7.25287199269075810e-16, + 1.55086334410593543e-16, + 3.47991032510520357e-17, + 2.34701134139191482e-17, +-1.55347427639400140e-18, + 5.36907577003518275e-18, +-1.51054780098440344e-18, +-2.87005181830144870e-18, + 1.82868054886239201e-17, + 1.46671658409833382e-17, + 1.60918628402527187e-17, + 4.59571867231725885e-18, + 1.44881320059160521e-17, + 3.37658688923325578e-18, + 9.29342753989825791e-18, + 1.23088307298408294e-17, + 3.09426696407163678e-18, + 7.57837750878895113e-18, + 6.98272986291267924e-18, +-4.11602552954220551e-18, + 1.30032344053770431e-17, +-5.43420157636068867e-18, + 5.93865021763246222e-18, + 5.75284149989520831e-18, +-2.39421406544918395e-18, + 1.81790572221727177e-17, + 5.78971281130463424e-17, +-1.46679438513699035e-16, +-1.10033410690850078e-15, +-8.74151575423078949e-16, + 8.05021986476801347e-15, +-2.10402746663937608e-15, +-1.95214914810704067e-14, + 2.34808704054673796e-14, +-4.64494126602295525e-15, +-5.28864355002139868e-15, + 1.50510358915704699e-15, + 7.19328843969179783e-16, + 1.00223575985555066e-17, +-3.58570360408669181e-17, +-1.43809454918677211e-17, +-1.56686380815960587e-17, + 1.59412396348600469e-17, + 1.28912293057151623e-17, + 8.89734599346381315e-18, + 1.23866933148959362e-17, +-8.02236084084489566e-19, +-1.17082896297218196e-17, + 1.79149079720465097e-17, + 1.55104912293235821e-17, + 1.48530375451041812e-17, + 7.03905100369215004e-18, + 9.02275778825337799e-18, +-8.55805897666663777e-19, +-1.51536288160381306e-19, + 8.42489521909557526e-20, + 2.52684956145348172e-18, + 7.78631498640162373e-18, + 7.17028102458411684e-19, + 2.10220420385716689e-18, + 9.34672890307198671e-18, + 9.51813091163213002e-20, + 7.50299206322564397e-18, +-4.62293467511252278e-18, + 9.95188868241916205e-19, +-9.58673423290227249e-18, +-3.31807234930010514e-17, +-3.25289703511608735e-17, +-4.83904753009075747e-17, + 1.19687526197996470e-16, + 2.15913843092906195e-16, +-8.12234851859664841e-16, + 7.05420125847192544e-16, + 1.56803653008350681e-16, +-6.41192564026393199e-16, + 2.53945579070995561e-16, +-1.99774518028825791e-17, +-3.67551070273534875e-17, + 1.55044427991638231e-17, + 3.83360088091177308e-17, + 2.58002953084866738e-17, + 8.47610190482459247e-18, + 2.74161943653861938e-17, + 8.14295553771151087e-18, + 1.53588806965375026e-17, + 6.79088393939650044e-18, + 1.64081235902212281e-17, + 1.24622236911481378e-18, + 1.98022553173648930e-17, + 2.03797955309791084e-17, + 2.06764393766341726e-17, + 5.10034401652109682e-18, + 1.29092270098101969e-17, + 1.33534581619142107e-18, + 8.35619207499424787e-18, + 4.90333881890643760e-18, + 6.47033917429461500e-18, + 2.19209239573723010e-18, + 6.06803205736929782e-18, + 3.61071840237771244e-18, + 6.98547736452092156e-18, +-5.10060047301241225e-18, + 8.15089208926949641e-18, +-1.98767783237561616e-19, +-1.11619730546063846e-19, +-5.49492392373311543e-18, +-1.91664984877228857e-17, +-3.00442716330794146e-17, +-1.22469327439219343e-17, + 4.41546472166589507e-17, +-4.31573972841214603e-17, +-7.83321428964057828e-18, + 3.34347877038638040e-17, +-5.87948084238162948e-17, + 2.75972543765697000e-17, +-4.98790621746695245e-18, +-2.39081218162556044e-17, + 2.27140503025043878e-17, +-9.59423611117359143e-18, + 1.22978043020596821e-17, +-1.40018524365017830e-18, +-6.98612441965188032e-18, + 8.30192861691461386e-18, + 1.08613620930454996e-17, + 8.90830401526640195e-19, +-4.68037638098735329e-18, +-1.01546553442516075e-18, + 8.05397921702541731e-19, +-3.02247940232216409e-18, + 2.23881467121881142e-19, + 2.22635499334751477e-18, + 5.80688181014548055e-18, + 1.42628302189679010e-17, + 2.84763818700371550e-18, + 3.01920508931786113e-18, + 5.77750833353648304e-18, + 7.31708813503125385e-18, + 1.43363612481373001e-17, + 5.51324409217227478e-18, + 1.13224750958044274e-18, + 1.10284795837741865e-17, + 8.11876501512515411e-20, + 6.96217312931050089e-18, + 5.18855570492202491e-18, + 2.08799215508261144e-18, +-1.79618341998064570e-17, +-3.18562799346944453e-17, + 7.90322725167643481e-18, +-1.33123062327147418e-17, + 9.36032016312171537e-18, +-1.54928504483720729e-18, +-8.63869925867692077e-18, +-7.75801076535833027e-18, +-2.42953851722413420e-17, +-9.62629853660465065e-18, +-1.67623287888727943e-17, + 3.78535825097235962e-19, + 6.04928261579723347e-18, +-1.24977333030453728e-17, +-1.82773141995974228e-17, +-1.74695595919113076e-17, +-1.81777293402801293e-17, +-6.84752013960500966e-18, +-4.81535296907316546e-18, + 2.58346095147184662e-18, +-1.58574073218485268e-17, +-7.99923447259073730e-18, +-8.05683777362332093e-18, +-6.51732043354952972e-18, +-1.70379251574001524e-18, +-4.96070607645808092e-18, +-1.15403931262049761e-17, +-1.35234237248712353e-17, +-1.06920346066235993e-17, +-1.07069694269173253e-17, +-1.65212746970039497e-17, +-6.61508174216462558e-18, +-1.58347339926362906e-18, +-8.65024351408077115e-18, +-9.65485467199499112e-18, +-1.05119662056933244e-17, +-9.88946793151573525e-18, +-7.11597544164838884e-18, +-9.27911195413730071e-18, +-6.09871699456426912e-18, + 2.08026150996958419e-02, + 2.36269849979727853e-03, + 2.89725818299387894e-04, + 3.96643926763377131e-05, + 6.37433325217661063e-06, + 1.28997063675063544e-06, + 3.56885045476821832e-07, + 1.43350496562211047e-07, + 8.25366836357556081e-08, + 6.19674832022348271e-08, + 5.39416966303869233e-08, + 5.01031016516897965e-08, + 4.76846099996203055e-08, + 4.57971909196053578e-08, + 4.41703652266765368e-08, + 4.27171164254319015e-08, + 4.14008546815952641e-08, + 4.01996991649633947e-08, + 3.90974808923844777e-08, + 3.80812641110990054e-08, + 3.71404044068282008e-08, + 3.62660223211113904e-08, + 3.54506388419544765e-08, + 3.46879027371164012e-08, + 3.39723807435699209e-08, + 3.32993936840531496e-08, + 3.26648870025085629e-08, + 3.20653274756534472e-08, + 3.14976200646461036e-08, + 3.09590404235127272e-08, + 3.04471796948410538e-08, + 2.99598990333085408e-08, + 2.94952918937594806e-08, + 2.90516525640366415e-08, + 2.86274497560290605e-08, + 2.82213043211766056e-08, + 2.78319703500972867e-08, + 2.74583190652338678e-08, + 2.70993250314442099e-08, + 2.67540543003308937e-08, +-1.99753438949547141e-02, +-2.21518460663758980e-03, +-2.62053319040160440e-04, +-3.39088527720762966e-05, +-4.96988531521787957e-06, +-8.61910882473274408e-07, +-1.84331548476049841e-07, +-4.92498560989164428e-08, +-1.58593949488079989e-08, +-5.85482899720776936e-09, +-2.53823072885832240e-09, +-1.42374363595991668e-09, +-1.03350756837757747e-09, +-8.65460477206470446e-10, +-7.65166731159704497e-10, +-6.89801676966460040e-10, +-6.27553566183380020e-10, +-5.74430623636405936e-10, +-5.28455626539657128e-10, +-4.88312050549730974e-10, +-4.53007624901726898e-10, +-4.21762105201236001e-10, +-3.93950710679953194e-10, +-3.69067237236811547e-10, +-3.46697562487478192e-10, +-3.26499952424963453e-10, +-3.08190171623489325e-10, +-2.91530084455092230e-10, +-2.76318834331985547e-10, +-2.62385950607237074e-10, +-2.49585912830967271e-10, +-2.37793828030248677e-10, +-2.26901966073148484e-10, +-2.16816962397832927e-10, +-2.07457544047277047e-10, +-1.98752669208095941e-10, +-1.90639995852467657e-10, +-1.83064614089398294e-10, +-1.75977991178054640e-10, +-1.69337089073354894e-10, + 5.28383322123326428e-03, + 5.72560307240310620e-04, + 6.55312504808750211e-05, + 8.07874091105823871e-06, + 1.10208719693227213e-06, + 1.72220744072318497e-07, + 3.20448290787845281e-08, + 7.33436026238278496e-09, + 2.06807833373171776e-09, + 6.72063254775889038e-10, + 2.26120548344586328e-10, + 7.63733501485568287e-11, + 2.92339832157004349e-11, + 1.51684066475904944e-11, + 1.05488095267688372e-11, + 8.47088629525259918e-12, + 7.15512640135564196e-12, + 6.15964266658983512e-12, + 5.35758350145773042e-12, + 4.69620355696621275e-12, + 4.14401796218177253e-12, + 3.67867799964235817e-12, + 3.28334514954646932e-12, + 2.94503266634891617e-12, + 2.65358551997338785e-12, + 2.40097535835562266e-12, + 2.18079303228853977e-12, + 1.98787626833267352e-12, + 1.81803279996844262e-12, + 1.66783209431675884e-12, + 1.53444702472392634e-12, + 1.41553233538511209e-12, + 1.30913050012694716e-12, + 1.21359818209324678e-12, + 1.12754833025641454e-12, + 1.04980424876739331e-12, + 9.79362908821319450e-13, + 9.15365450398993239e-13, + 8.57073317771342341e-13, + 8.03848839610050085e-13, +-9.62930751830168513e-04, +-1.02247097224854970e-04, +-1.13773347385316723e-05, +-1.34770522506889727e-06, +-1.73629273953876290e-07, +-2.50103314736319720e-08, +-4.15850090200850365e-09, +-8.24110445137214041e-10, +-2.00930902720117968e-10, +-6.06731556606310673e-11, +-2.04979567131045218e-11, +-6.67331325490074647e-12, +-2.00399223566798024e-12, +-6.11004856594876859e-13, +-2.34697035816418565e-13, +-1.30523881104194626e-13, +-9.34444108578936357e-14, +-7.38789893867724138e-14, +-6.04322369998139383e-14, +-5.01953066426107724e-14, +-4.21224719869700227e-14, +-3.56513270791242500e-14, +-3.04052187419796931e-14, +-2.61114684523310250e-14, +-2.25669024404660980e-14, +-1.96177369177525192e-14, +-1.71461572533064070e-14, +-1.50609394431245604e-14, +-1.32907575151809752e-14, +-1.17793389006353111e-14, +-1.04819144849223319e-14, +-9.36258839964352011e-15, +-8.39236914413371840e-15, +-7.54768149939167399e-15, +-6.80923174817977376e-15, +-6.16113498692367191e-15, +-5.59023867152435156e-15, +-5.08559435978156114e-15, +-4.63804227572865140e-15, +-4.23988245343058818e-15, + 1.33970091236812098e-04, + 1.39767395383155600e-05, + 1.51842618011680271e-06, + 1.74002509804249729e-07, + 2.14021372020624518e-08, + 2.89018599895024855e-09, + 4.40167679782042712e-10, + 7.76051764436217944e-11, + 1.61940557651128981e-11, + 4.20157809356807587e-12, + 1.38467349453050286e-12, + 4.85140965274089368e-13, + 1.52541560016187018e-13, + 4.22904774955396303e-14, + 1.12527980256053700e-14, + 3.47881597956831868e-15, + 1.55613885692642051e-15, + 9.80729884968595136e-16, + 7.24361368180572934e-16, + 5.64734976309438105e-16, + 4.49784116940445214e-16, + 3.62816529105399519e-16, + 2.95648307623626229e-16, + 2.43087439067205052e-16, + 2.01511543002784455e-16, + 1.68305805804590800e-16, + 1.41549436694804798e-16, + 1.19812955852761650e-16, + 1.02020344968039883e-16, + 8.73531483036794771e-17, + 7.51827820714141755e-17, + 6.50221236803142776e-17, + 5.64904869160259864e-17, + 4.92880148138339497e-17, + 4.31767736829006267e-17, + 3.79666483277370956e-17, + 3.35047361562335520e-17, + 2.96673011846113464e-17, + 2.63536396800143728e-17, + 2.34813155789582368e-17, +-1.50888090216282933e-05, +-1.55017118127049125e-06, +-1.64991702962212094e-07, +-1.83878589578162640e-08, +-2.17683795105582933e-09, +-2.78932583013882299e-10, +-3.95882655592564398e-11, +-6.38044052459421270e-12, +-1.18419108614326390e-12, +-2.54544855968720242e-13, +-7.17077947555407310e-14, +-2.63591574604608567e-14, +-9.33558224843125515e-15, +-2.79354343976879532e-15, +-7.23299866378932672e-16, +-1.75487067281381847e-16, +-4.67665020338344697e-17, +-1.74054064137965765e-17, +-9.65091938942486514e-18, +-6.65606074126500855e-18, +-4.95925079039277682e-18, +-3.80073837683737383e-18, +-2.95733182794527948e-18, +-2.32776835931919152e-18, +-1.85081957179087016e-18, +-1.48519386706122423e-18, +-1.20193916091073384e-18, +-9.80367296357928787e-19, +-8.05483903409811734e-19, +-6.66299043257693369e-19, +-5.54663604530541670e-19, +-4.64470533032896138e-19, +-3.91108435089692083e-19, +-3.31056114787826437e-19, +-2.81600375236231792e-19, +-2.40644313539167693e-19, +-2.06543894974643295e-19, +-1.78012678561806630e-19, +-1.54018694558120505e-19, +-1.33757837365166109e-19, + 1.42876346622302379e-06, + 1.44821651304460384e-07, + 1.51434455191818056e-08, + 1.64821584124492068e-09, + 1.88975510131445936e-10, + 2.31854466408796451e-11, + 3.10414853860768836e-12, + 4.64106169308140056e-13, + 7.93789316399333901e-14, + 1.51586459062762399e-14, + 3.24830019407972464e-15, + 1.06969461773951019e-15, + 4.34843820630831343e-16, + 1.49697421099142671e-16, + 4.21318269184997725e-17, + 1.02467189557565046e-17, + 2.31789648744291595e-18, + 5.56773237041551350e-19, + 1.79425465586531436e-19, + 8.84518188107027429e-20, + 5.71030159717773627e-20, + 4.07713197559795782e-20, + 3.01633021025370756e-20, + 2.27054207677181091e-20, + 1.73159849352831217e-20, + 1.33510109892785229e-20, + 1.03971847215884997e-20, + 8.17121789362295170e-21, + 6.47942816257841303e-21, + 5.17835208789844608e-21, + 4.16961207368315569e-21, + 3.38149412166698505e-21, + 2.75966904347424458e-21, + 2.26588807910813448e-21, + 1.87172082453546437e-21, + 1.55381350512840001e-21, + 1.29856939075558255e-21, + 1.08670359974929515e-21, + 9.18416043012781581e-22, + 7.77243074410869088e-22, +-1.16781302155967938e-07, +-1.16971796066395585e-08, +-1.20440686719300839e-09, +-1.28449547210681154e-10, +-1.43331008960494683e-11, +-1.69567796875164521e-12, +-2.16263305335533955e-13, +-3.03118176472838872e-14, +-4.79557386513209085e-15, +-8.77917786222614870e-16, +-1.58630708446558733e-16, +-3.46095816381466931e-17, +-1.48799709301681788e-17, +-6.27330342161108617e-18, +-2.03035310702503117e-18, +-5.34949614612020738e-19, +-1.22802014582576971e-19, +-2.62344512760622641e-20, +-5.84067351592870841e-21, +-1.68653893970898974e-21, +-7.49092624863155951e-22, +-4.58612342728928168e-22, +-3.12862929405909863e-22, +-2.26931175705720489e-22, +-1.65482366170895508e-22, +-1.20102111194874795e-22, +-8.96301604884890030e-23, +-6.80825426618073408e-23, +-5.09906841385595506e-23, +-3.77642812794988466e-23, +-3.13147173905853713e-23, +-2.36167478042110521e-23, +-1.75998696875358186e-23, +-1.44234645779249187e-23, +-1.10189587014516177e-23, +-9.14112489451189335e-24, +-7.37834846815425957e-24, +-7.46649014562082549e-24, +-3.74127385979973761e-24, +-2.59902569931252334e-24, + 8.40082789068035620e-09, + 8.32608664626813156e-10, + 8.45770090462883477e-11, + 8.86250845906008449e-12, + 9.66208889193234618e-13, + 1.10833652535289334e-13, + 1.35701479604124332e-14, + 1.80370626302019555e-15, + 2.64053860560360852e-16, + 4.54959485301940488e-17, + 8.64903840164792506e-18, + 1.21539789019979020e-18, + 3.48707379389197937e-19, + 1.95988607249860126e-19, + 7.88422246486733304e-20, + 2.35905367900206986e-20, + 5.82569123879357994e-21, + 1.26805624298190716e-21, + 2.57374476732513353e-22, + 5.56474895067066347e-23, + 1.73333779710079174e-23, + 5.39421192202455992e-24, + 3.98235733051569945e-24, + 2.00040519848687563e-24, + 1.06626255894678542e-24, + 2.77290449027715441e-24, + 2.37864099636051634e-24, +-2.10241106510503068e-25, +-2.97282264057337129e-25, + 3.52242354964534801e-25, + 1.42669910517942614e-24, + 1.24873003961012661e-24, + 9.70644425913077476e-25, + 1.02320841673202260e-24, + 5.01801390310818879e-25, + 1.62685025677067871e-25, + 1.58564663912582590e-25, +-4.98537643742382491e-25, + 1.22124807273741905e-24, + 8.36064378724325097e-25, +-5.39841144060454762e-10, +-5.30009028914796832e-11, +-5.31980554386494194e-12, +-5.48920235961645083e-13, +-5.86542473594243589e-14, +-6.55279062138716813e-15, +-7.74851128853660911e-16, +-9.85120899420390521e-17, +-1.36271610379244834e-17, +-2.07198997930345463e-18, +-4.29394548579572024e-19, +-6.55275609364797898e-20, +-5.65624261163829791e-21, +-3.92833491552526891e-21, +-2.36197045746557226e-21, +-8.58919941019778631e-22, +-2.35016920808924028e-22, +-5.52599666868229169e-23, +-1.03062893024677798e-23, +-1.63981604050581579e-24, + 2.95376427145644573e-24, +-2.15552037784426471e-24, + 1.17955555095768884e-24, + 6.73131663717390894e-25, + 1.54899299868484246e-24, + 3.01556762520388216e-25, + 1.86047320370271234e-24, +-8.17105665143802300e-25, + 2.53299623173096881e-24, + 4.62337837819945949e-25, + 9.80339843664690387e-25, + 1.08507046130204831e-24, + 1.51352507122108256e-24, + 8.94062920778125203e-25, + 1.68694080989596982e-24, + 1.67419374191714872e-25, + 4.75232167362744101e-25, +-1.63198193058023393e-25, + 1.13618395778223872e-24, + 1.46679619891253570e-24, + 3.13553354474593884e-11, + 3.05240775720457131e-12, + 3.03130250495156489e-13, + 3.08568406584351695e-14, + 3.23996278219292543e-15, + 3.53804338525009975e-16, + 4.06069271446212564e-17, + 4.96245195089277763e-18, + 6.60852637571360861e-19, + 9.05499122697960936e-20, + 1.65200864518320575e-20, + 3.81955362604733188e-21, + 2.30468016408304541e-22, + 1.51383456008831273e-23, + 4.99164001474614913e-23, + 2.78642401662452102e-23, + 9.99992253059666251e-24, + 3.04323360200216854e-24, + 1.47350286520392786e-25, + 9.23299533494835900e-25, + 2.65186551654419383e-24, +-4.12838511225996505e-25, + 4.24167351017989396e-25, +-4.91973242048182787e-25, +-1.52916285152791118e-25, + 6.70840266209438498e-25, + 1.24650535600368915e-24, +-3.57738085650372081e-26, + 1.76489089827957493e-24, + 5.21767864365626938e-25, + 1.38077101247568722e-25, + 1.96661715829703505e-25, + 7.26643815916313283e-25, + 1.79326173948693659e-26, + 7.44684052397704637e-25, + 1.06804519138030827e-24, + 7.46205353839065930e-25, +-5.13534534208215153e-25, + 1.20702971027134540e-24, + 7.55955039168817512e-25, +-1.66186587363674971e-12, +-1.60544901469284730e-13, +-1.57922027520431853e-14, +-1.58834678160087375e-15, +-1.64234853555884698e-16, +-1.75821222918478987e-17, +-1.96677638863626346e-18, +-2.32407835773525821e-19, +-2.95463632468208545e-20, +-4.12351164712179287e-21, +-4.93490030402492927e-22, +-1.66117115741095061e-22, +-2.27830300702985629e-23, + 2.90047191299929968e-24, + 2.56264613761949900e-24, + 1.35111867323000171e-24, + 2.48312487675768450e-24, + 1.04236784961015135e-24, + 8.17448093458366507e-25, + 8.95731098662395580e-25, + 3.20260763847236193e-24, + 9.05250441402085980e-25, + 7.34310142020784594e-27, +-1.17535599613707140e-24, + 1.42276489428457416e-24, + 2.80465294617485788e-25, + 2.21867380451682686e-24, + 2.38407801893818073e-25, + 6.02666557386130095e-25, + 7.82798609724783667e-25, + 6.44959389290943939e-25, + 6.77348013125260487e-25, + 2.65195953523991765e-25, + 1.30151739707861031e-24, + 7.63359089727570644e-25, + 4.82782624784454758e-25, + 6.55093224465301531e-25, +-8.67818863211986713e-26, + 8.44744017642048831e-25, + 1.24727986455452759e-24, + 8.10077405784634629e-14, + 7.77124801370056443e-15, + 7.57846264024781218e-16, + 7.54128720864802250e-17, + 7.69288140387320406e-18, + 8.09324950841700730e-19, + 8.85333491110139920e-20, + 1.01749718379681366e-20, + 1.22687094510902794e-21, + 1.77166919403389882e-22, + 1.64817485289558344e-23, + 3.78813794261572627e-24, + 2.69656747177585466e-24, + 5.32642123505972316e-25, + 1.13065906228870127e-24, + 1.34688263612526347e-24, + 6.64839454481027583e-25, + 8.48192436534750410e-25, +-1.12166703549227848e-24, + 4.94399606713075251e-25, + 1.66586539324457773e-25, +-8.63643387196694387e-25, +-1.75619892101394522e-26, + 9.44733189653239497e-25, + 8.18493921054041715e-25, + 7.83881124721716832e-27, + 7.67663091951455528e-25, + 3.84514053630904924e-25, + 4.14322664449217513e-25, + 2.50312092909091371e-25, + 1.23103561138543216e-24, + 9.01865427063093836e-25, + 1.13452900622966983e-24, + 1.17829501490999000e-24, + 1.01799434897433048e-24, + 7.29306031884632390e-25, + 8.06736728052521378e-26, + 2.87986910721194112e-25, + 9.10078922845185916e-25, +-1.51461247160530263e-25, +-3.65748096829635493e-15, +-3.49358268062085964e-16, +-3.37498313009769739e-17, +-3.33423924218879681e-18, +-3.36001776202620331e-19, +-3.50445564334150361e-20, +-3.78880936336899855e-21, +-4.35869755903925203e-22, +-5.68058904971390921e-23, +-6.20972227933047493e-24, +-1.70480847380245654e-24, +-1.94956172757356972e-25, +-2.21457683822081649e-25, +-9.94141164723508552e-25, + 5.28034682822217253e-25, + 1.01191315132304936e-25, +-3.09466345983612405e-25, +-4.57267007941045145e-25, +-1.20041716819717645e-24, + 7.61089909667896027e-25, + 8.71089619162039907e-25, + 1.92791327705759721e-25, +-1.28836150833734437e-24, +-9.45581177466240782e-25, + 2.95099421185626144e-25, + 2.47832423640981520e-25, +-1.13288619706682746e-25, +-9.98763610981450475e-25, +-1.84233648058728004e-24, +-7.48426389387253966e-25, +-2.21131060953450753e-24, +-1.33575609084143233e-24, +-6.58055494165527382e-25, +-1.65443685808779399e-25, +-1.01071303079048142e-24, +-7.06945984003617166e-25, +-6.46877174610481314e-25, +-1.35719827148932479e-24, +-2.05415659964472726e-25, +-2.35293862395790728e-25, +// root 1 + 8.01402775278661883e-01, + 7.65530175967033877e-01, + 7.23501995917475216e-01, + 6.75924476447922085e-01, + 6.24366677801765246e-01, + 5.71098263361227820e-01, + 5.18504780881717475e-01, + 4.68597070759340484e-01, + 4.22876015553283524e-01, + 3.82328728755903402e-01, + 3.47306994025092686e-01, + 3.17496639750890097e-01, + 2.92172273859076459e-01, + 2.70526124913601285e-01, + 2.51851758287373328e-01, + 2.35586824206935358e-01, + 2.21295479282655666e-01, + 2.08639410773788780e-01, + 1.97353130152129852e-01, + 1.87225619170627106e-01, + 1.78087086488763813e-01, + 1.69799374610937498e-01, + 1.62248920409105157e-01, + 1.55341514604175474e-01, + 1.48998346523608494e-01, + 1.43152980893021253e-01, + 1.37749020089805940e-01, + 1.32738277115996506e-01, + 1.28079333673949441e-01, + 1.23736391844673860e-01, + 1.19678351902279573e-01, + 1.15878065954769877e-01, + 1.12311729500496324e-01, + 1.08958382053257738e-01, + 1.05799494685385451e-01, + 1.02818627334903906e-01, + 1.00001142486201289e-01, + 9.73339646928687019e-02, + 9.48053776015608252e-02, + 9.24048518264371371e-02, +-1.63976544457496709e-02, +-1.94883869170487944e-02, +-2.25096177483079148e-02, +-2.49842538746944953e-02, +-2.64506033436316922e-02, +-2.66896997007865407e-02, +-2.57984928950830694e-02, +-2.40314930028217404e-02, +-2.16368715879553669e-02, +-1.88915214367395452e-02, +-1.61487813743404658e-02, +-1.37019601190684816e-02, +-1.16657073084907980e-02, +-1.00174225605032322e-02, +-8.68605713933852039e-03, +-7.60136003503819949e-03, +-6.70743107039596057e-03, +-5.96233781274448094e-03, +-5.33484197426921641e-03, +-4.80144610444650788e-03, +-4.34423363317623049e-03, +-3.94935672072703990e-03, +-3.60597680162508781e-03, +-3.30551274696068171e-03, +-3.04109926432271846e-03, +-2.80719103835813406e-03, +-2.59926946955167312e-03, +-2.41362270973013993e-03, +-2.24717878034628180e-03, +-2.09737762163292188e-03, +-1.96207202821998671e-03, +-1.83945025111685221e-03, +-1.72797501463922720e-03, +-1.62633508665310528e-03, +-1.53340653330325200e-03, +-1.44822150646937032e-03, +-1.36994293550293626e-03, +-1.29784388041902644e-03, +-1.23129059047873048e-03, +-1.16972852718080192e-03, +-3.75420809516121515e-04, +-3.91299336693288601e-04, +-3.54949012919551082e-04, +-2.54745045535038374e-04, +-1.07663083104199035e-04, + 4.57079681574125310e-05, + 1.72024546678596033e-04, + 2.65357564155282034e-04, + 3.28450533219760705e-04, + 3.51054681032751897e-04, + 3.28990651157284701e-04, + 2.80769254435905499e-04, + 2.28912762470889763e-04, + 1.84547669484605632e-04, + 1.49594483714328511e-04, + 1.22595068085325925e-04, + 1.01644173011625620e-04, + 8.51925016979648223e-05, + 7.21054493314755390e-05, + 6.15670954305244330e-05, + 5.29863363637512956e-05, + 4.59289628278511709e-05, + 4.00713565236403117e-05, + 3.51690098593358767e-05, + 3.10348569325585581e-05, + 2.75241265555028863e-05, + 2.45235928754228234e-05, + 2.19438383241802363e-05, + 1.97136115795946478e-05, + 1.77756633361597113e-05, + 1.60836382801688835e-05, + 1.45997311849183834e-05, + 1.32929021060234934e-05, + 1.21375050007014388e-05, + 1.11122250790088211e-05, + 1.01992488431576938e-05, + 9.38361102621248267e-06, + 8.65267711664910651e-06, + 7.99573060388504408e-06, + 7.40364169335666787e-06, +-2.86286683989991939e-06, + 5.43555949889699109e-07, + 5.69565266473334733e-06, + 1.07792998330371907e-05, + 1.31536195141770909e-05, + 1.19376749915929515e-05, + 9.07280734890735838e-06, + 6.56381396182698355e-06, + 3.77686867899531314e-06, +-9.70215642034292694e-08, +-3.29883550161746415e-06, +-4.42220599911160256e-06, +-4.08299545178477881e-06, +-3.29517176650833548e-06, +-2.55300340194437176e-06, +-1.97252564475971827e-06, +-1.53944551489936239e-06, +-1.21711840789878912e-06, +-9.74549187404653861e-07, +-7.89447389317499682e-07, +-6.46270351454638772e-07, +-5.34129848629346072e-07, +-4.45292263777968305e-07, +-3.74180753212189229e-07, +-3.16715194245505912e-07, +-2.69870319545609827e-07, +-2.31375243902695850e-07, +-1.99505928757014934e-07, +-1.72939725525175482e-07, +-1.50652035092663696e-07, +-1.31841959207913138e-07, +-1.15878181821361386e-07, +-1.02259144323341350e-07, +-9.05834405492314022e-08, +-8.05275988516364678e-08, +-7.18292585031726534e-08, +-6.42743238471133136e-08, +-5.76870780926099476e-08, +-5.19225180268924752e-08, +-4.68603689143385448e-08, + 1.47698820712415841e-07, + 2.77282564623653672e-07, + 3.47864173786898468e-07, + 2.57768198467056812e-07, + 2.85404289533193167e-08, +-1.57489721298100127e-07, +-1.76496701746243964e-07, +-1.46943789688684185e-07, +-2.14212950456493840e-07, +-2.47159380548847146e-07, +-1.37178481979066124e-07, +-1.20520590694426015e-08, + 4.34666357147403711e-08, + 5.03746578366539144e-08, + 4.15060288842466220e-08, + 3.12942272692968657e-08, + 2.32293586194101778e-08, + 1.73730898567847595e-08, + 1.31690163595483937e-08, + 1.01223147531461565e-08, + 7.88244723263202964e-09, + 6.21164185622429385e-09, + 4.94830134815349214e-09, + 3.98109672980388700e-09, + 3.23212424997335104e-09, + 2.64604180697084815e-09, + 2.18297963431378706e-09, + 1.81384018735319620e-09, + 1.51713190934170893e-09, + 1.27680385996532563e-09, + 1.08074442129851803e-09, + 9.19726054862267284e-10, + 7.86655351181501791e-10, + 6.76033480642239762e-10, + 5.83563981860322628e-10, + 5.05864942919349026e-10, + 4.40255754746149591e-10, + 3.84597617899486857e-10, + 3.37173432453862785e-10, + 2.96596500912070757e-10, + 6.28175486437036481e-09, + 5.96889130323076859e-09, + 1.15718751285607240e-10, +-9.01516244646483818e-09, +-1.21958610842486440e-08, +-5.18936839734834779e-09, + 2.12216320489737268e-09, +-7.66236030518276970e-10, +-4.49406745952539295e-09, + 2.34012406127560254e-09, + 7.21691478038530801e-09, + 4.60910927151388349e-09, + 1.21756915856186580e-09, +-2.44939370222499146e-10, +-5.34923876962407880e-10, +-4.64099669051137923e-10, +-3.43828367501903247e-10, +-2.46721615770873353e-10, +-1.77731229633618535e-10, +-1.29752217014947850e-10, +-9.61351516627657505e-11, +-7.22371879275131608e-11, +-5.49877808628142804e-11, +-4.23568612207657364e-11, +-3.29842877878338394e-11, +-2.59440724657146480e-11, +-2.05959609624057947e-11, +-1.64908063471882398e-11, +-1.33091778991878678e-11, +-1.08211522888370853e-11, +-8.85914445647776234e-12, +-7.29985955175087448e-12, +-6.05155657504895285e-12, +-5.04530071038582968e-12, +-4.22893233024257981e-12, +-3.56260147770565349e-12, +-3.01558768042511569e-12, +-2.56409535272624562e-12, +-2.18951907394252150e-12, +-1.87725928009441637e-12, + 6.46334045089937650e-11, +-1.15977105273710122e-10, +-3.59417488520756914e-10, +-3.28019501663547910e-10, + 1.01123128364007671e-10, + 4.04258283939463691e-10, + 1.13191376961413109e-10, +-2.77453394330387353e-10, + 8.01734034726130028e-11, + 3.61213084072666404e-10, + 1.06200434187981273e-11, +-1.66836669730871068e-10, +-1.00692099220950611e-10, +-2.88317576975032448e-11, +-9.49356733509038772e-13, + 4.96857378124595504e-12, + 4.66894932150454499e-12, + 3.42025807075484438e-12, + 2.38343171554062773e-12, + 1.66061149805698363e-12, + 1.17205584281655271e-12, + 8.40007687781882039e-13, + 6.11050591365928600e-13, + 4.50670472883601513e-13, + 3.36612882819434014e-13, + 2.54385454250105169e-13, + 1.94329139285390767e-13, + 1.49938637620877130e-13, + 1.16769980406606194e-13, + 9.17026236382529232e-14, + 7.26241191291477831e-14, + 5.79473272581364078e-14, + 4.65479363687477672e-14, + 3.76586706392809439e-14, + 3.06556254593200784e-14, + 2.50903147749126743e-14, + 2.06575577029624488e-14, + 1.70957392596048325e-14, + 1.42239873496196980e-14, + 1.18847113697211325e-14, +-3.61181526380435108e-12, +-8.95446847178974015e-12, +-6.12140122077324121e-12, + 9.52030700129193428e-12, + 1.74888124060297543e-11, + 7.66307654838421791e-13, +-1.85232869205691079e-11, +-2.21182227792697280e-12, + 2.09529692804039016e-11, +-5.12619853193449950e-12, +-1.29540799422323193e-11, +-1.74427633779972183e-13, + 3.27927008134422373e-12, + 1.69222564753464035e-12, + 4.65860091934953337e-13, + 4.64461817510657840e-14, +-4.11853258914849263e-14, +-4.27818540313092291e-14, +-3.10620512289717929e-14, +-2.10961073502172255e-14, +-1.42629643381098452e-14, +-9.76246435044665037e-15, +-6.78675990339686018e-15, +-4.78320620945970973e-15, +-3.43232279576186571e-15, +-2.48732564895340771e-15, +-1.81944423464248534e-15, +-1.35236670550897259e-15, +-1.01548129656753116e-15, +-7.78058997950711486e-16, +-5.86932696318288594e-16, +-4.51205563059272799e-16, +-3.62099319153160117e-16, +-2.77743306651494307e-16, +-2.14570130376549619e-16, +-1.72314095174839025e-16, +-1.39570630449140942e-16, +-1.09967618012138472e-16, +-8.66889805008439758e-17, +-7.25081414064185285e-17, +-1.73608732552146598e-13, +-1.04956056911436074e-13, + 3.24323157819435393e-13, + 5.28380786432819442e-13, +-1.44756365447337547e-13, +-7.70430200308949126e-13, +-1.93568997074706238e-13, + 1.08958409590234276e-12, +-1.33908497423583287e-13, +-9.07637707434849437e-13, + 3.35419220126196351e-13, + 2.84434534405137186e-13, +-1.86532042815364158e-14, +-5.37358724300420053e-14, +-2.30968256695857812e-14, +-5.90732769234902909e-15, +-7.37708674064947246e-16, + 3.19352784722398560e-16, + 3.79849656360719056e-16, + 2.53579548257405425e-16, + 1.77688910264296958e-16, + 1.23892947984248838e-16, + 8.28948881114899405e-17, + 6.59693103981428972e-17, + 3.86116528731862544e-17, + 3.00674445827860908e-17, + 2.42249594708730266e-17, + 1.27776092332047687e-17, + 1.21804721912253121e-17, +-2.03856202545934917e-18, + 6.56398865102006414e-18, + 9.75616929695635270e-18, +-4.61757233474790257e-18, + 1.54819369120109855e-18, + 5.55482942908166052e-18, + 3.22506018180059028e-19, + 2.39848600135756210e-18, + 1.86913282889665168e-18, + 5.57247997692338256e-18, + 3.54531068275315662e-18, +-2.01141724440143045e-15, + 7.22480399309115722e-15, + 1.37256370710982364e-14, +-6.76995346798803438e-15, +-2.51745683263954116e-14, +-3.83500435172105173e-15, + 3.58264929773464115e-14, + 1.33177852701322287e-14, +-6.18082835994594444e-14, + 2.82591429993088637e-14, + 1.83495436536309001e-14, +-1.15049405737133941e-14, +-3.89016316572761247e-15, + 7.03075078830374549e-16, + 7.19999849056986298e-16, + 2.79303043259322814e-16, + 5.61887395926741486e-17, + 1.48295158032153017e-17, + 1.19958892232515499e-17, + 3.42609218194095967e-18, + 2.90284029237618656e-18, + 7.45138976091021025e-19, + 1.53061107307039164e-18, + 1.13563943788528877e-17, + 6.20645837431512021e-18, + 2.59406163576134925e-18, + 2.59805077981150518e-19, + 7.07600315921699522e-18, + 1.01525580317958892e-17, +-2.89752078716989718e-18, + 7.88032697820225583e-18, + 9.28574791568138600e-18, +-2.32515231084077595e-18, + 1.81605843466303401e-18, + 5.51117802369153480e-18, + 7.23997881831182683e-18, + 3.86429864396333718e-19, + 2.34599969276921966e-19, + 7.65811965270102398e-18, + 2.82604115662460321e-18, + 9.89881883416105555e-17, + 3.16925433231861503e-16, +-1.31071369456265199e-16, +-7.57389999019234152e-16, + 6.39201958538177836e-17, + 9.17923210765974421e-16, + 8.30587145809361107e-16, +-2.31570279383694808e-15, + 4.58331128415376927e-16, + 1.85447890885229959e-15, +-1.35153086349785889e-15, +-5.16083016145624774e-17, + 2.27323113589374012e-16, + 4.55993013109917179e-17, +-2.34609584662897037e-17, + 8.50185940479102605e-18, +-9.75980542653353708e-18, + 8.18618436857964818e-20, + 1.07930368516142668e-17, + 8.25848769552623779e-20, + 9.95969092160911259e-20, + 1.28117415913388357e-18, + 3.55714460848804512e-18, + 5.28566632980781154e-18, + 1.08250458479283479e-18, + 3.55837082112905128e-18, + 2.24911782308442882e-18, + 6.54900408754901388e-19, + 7.36849521362325566e-18, +-4.18650062130331567e-19, + 2.12510230243149718e-18, + 2.99222265077726275e-18, +-7.60082308939370350e-19, + 2.92485720678548953e-18, + 6.98493708224017855e-18, + 2.44191605630758253e-18, + 3.73997826642468605e-18, + 2.61565622776653707e-18, + 2.99881196925626291e-18, +-1.20792937053563858e-18, +-9.02453525717027738e-18, + 6.52103674115347150e-18, +-2.24769664071344192e-17, +-3.20007333942759133e-17, + 9.02434433655498118e-18, + 1.37461017774741240e-17, +-5.63426093585249536e-17, +-8.47400379117328993e-17, + 1.33076311570602990e-16, +-1.13923181612002209e-16, +-1.13311820395071816e-17, + 9.60639256568401772e-18, + 3.57150012626687206e-18, + 2.30088814434911353e-17, + 1.59048220276707387e-17, + 2.15427774958778382e-17, + 5.68144524665992703e-18, + 9.13518469612546849e-18, + 1.27743651278627992e-17, + 3.79073854440147503e-18, + 4.02457482514059103e-18, + 5.84152993438173261e-18, + 2.73762611992568856e-18, + 8.87474236376831569e-18, + 5.69828755425875736e-18, + 3.66271007945337502e-18, + 1.04566098167098389e-17, + 7.48477895968555144e-18, + 6.29385567681001341e-18, +-2.06248189980634803e-18, + 4.08436811541096195e-18, + 2.08684075254182509e-18, +-3.25200916146256495e-19, + 1.81384873286783126e-18, + 4.76040899429123545e-18, + 1.95148609779486328e-18, + 4.46601125060565283e-18, + 7.32198260320409490e-20, + 3.77403893611507674e-18, + 2.54424388516939916e-18, +-1.19509927990281589e-17, +-3.81428219695041568e-18, + 1.84818579159348704e-17, + 9.28905552606281212e-18, +-6.36325097382371383e-18, + 1.13575129230458788e-17, + 1.55921199263621594e-17, +-1.12598150474928065e-17, +-1.75604392043556274e-17, + 6.65741569096536625e-18, + 3.27406507480233164e-18, +-1.08505607986768118e-17, + 2.96977970661717619e-18, +-5.40502891273092637e-18, +-7.07087421912592601e-18, +-1.18338240628262811e-18, +-1.91823616308196535e-18, + 2.88807686561721597e-18, + 7.04153868667667278e-18, + 5.76090948680640448e-19, + 1.94047327686975968e-18, +-8.00754325344279066e-19, +-5.96228609933205415e-18, + 5.79412485093436658e-18, + 1.00564429498703556e-20, +-3.19899160000373864e-18, + 6.62347967490670621e-18, + 4.95931241057122907e-18, + 4.02104252776609318e-18, + 3.84497162609953896e-18, + 3.67497520674652261e-18, + 3.62484137298085792e-18, + 1.57278473909669636e-18, + 1.66000907010786098e-18, + 2.39472843052374127e-18, + 4.31318492243106520e-18, + 1.93123744126982288e-18, +-1.55405045999396379e-18, + 4.90026610897962227e-18, + 2.89657840510928388e-18, +-3.16655785467631577e-17, + 3.91403292156327997e-18, +-2.16574519110612262e-17, + 3.91568944910877149e-18, +-1.69702138924228736e-17, + 5.64721539025690376e-18, +-1.61490727722894101e-17, +-1.29240607342035807e-18, +-9.96798240608880218e-18, + 6.53984223633937528e-18, + 2.40480978739733438e-18, +-1.78068498789486040e-17, + 2.94727189873892560e-18, +-1.36330437323953560e-17, +-1.52131170738367341e-17, +-5.92229881348644472e-18, +-4.98024338183533578e-18, +-3.92358132744465673e-18, +-4.94365688649505481e-18, +-3.31969572648379170e-18, +-1.14150589141536836e-17, +-7.67986842504646682e-18, +-4.67869636618220951e-19, +-6.21099823047019831e-18, + 5.99349116888138069e-19, +-3.23690183871498540e-18, +-6.22628706363790528e-18, +-5.10202672054684419e-18, +-7.33608950617315584e-18, +-1.19237105936461536e-17, +-6.88228138000291465e-18, +-4.53812329531599564e-18, +-8.53988682558009948e-18, +-3.82135083721616750e-18, +-2.24317596750253402e-18, +-3.11613508487832744e-18, +-4.89103032264051838e-18, +-4.48089479857944703e-18, +-2.93395884908447616e-18, +-4.11623353864750862e-18, + 5.19481907013865582e-02, + 8.86716057877981641e-03, + 1.84357936118573229e-03, + 4.84293072385497613e-04, + 1.64443892277302321e-04, + 7.22090501926230742e-05, + 4.01045804571245666e-05, + 2.71195931600004829e-05, + 2.13049788451669404e-05, + 1.85025064253248153e-05, + 1.70073402934454421e-05, + 1.60650129743561470e-05, + 1.53577983417211024e-05, + 1.47653057142936054e-05, + 1.42439556462270224e-05, + 1.37759106258285164e-05, + 1.33515326148179398e-05, + 1.29641846326523810e-05, + 1.26087280357655783e-05, + 1.22810039998899881e-05, + 1.19775818406773152e-05, + 1.16955983021589562e-05, + 1.14326414908304277e-05, + 1.11866631751327249e-05, + 1.09559111577480192e-05, + 1.07388764291566703e-05, + 1.05342514167249103e-05, + 1.03408966748365382e-05, + 1.01578140700128969e-05, + 9.98412501524308284e-06, + 9.81905266689051260e-06, + 9.66190725877392093e-06, + 9.51207394027386255e-06, + 9.36900262833916068e-06, + 9.23219949074100130e-06, + 9.10121975944230577e-06, + 8.97566163532858626e-06, + 8.85516109367261250e-06, + 8.73938743712348108e-06, + 8.62803947231635522e-06, +-4.31695643334346971e-02, +-6.75490258202208777e-03, +-1.24140524904209934e-03, +-2.74904184441717456e-04, +-7.43261375670292940e-05, +-2.43715738807830513e-05, +-9.41239587266456695e-06, +-4.08824442571865218e-06, +-1.91468942235372395e-06, +-9.68401276935604310e-07, +-5.63041441816583943e-07, +-3.94250734040924121e-07, +-3.18436689416307844e-07, +-2.76011079991821415e-07, +-2.46167977349756163e-07, +-2.22350843476988807e-07, +-2.02364657026209528e-07, +-1.85247906887281354e-07, +-1.70423667684621130e-07, +-1.57477959328993432e-07, +-1.46092527542638146e-07, +-1.36016022669727794e-07, +-1.27046997772458871e-07, +-1.19022210781121316e-07, +-1.11808110293726813e-07, +-1.05294489037004742e-07, +-9.93896826214205368e-08, +-9.40168935821811332e-08, +-8.91113467438576581e-08, +-8.46180662342643902e-08, +-8.04901224863344956e-08, +-7.66872381840396066e-08, +-7.31746709358029390e-08, +-6.99223111696046882e-08, +-6.69039487913262089e-08, +-6.40966731959744923e-08, +-6.14803794128867167e-08, +-5.90373592957882857e-08, +-5.67519612952430168e-08, +-5.46103058718088118e-08, + 9.97625123813352527e-03, + 1.44893413960768113e-03, + 2.41291598801733707e-04, + 4.71593392395836360e-05, + 1.09966599023507298e-05, + 3.07736134178903979e-06, + 1.02778666307976947e-06, + 4.00771776298221340e-07, + 1.72560122875150335e-07, + 7.51696745477638847e-08, + 3.13877584022163795e-08, + 1.32914449536830549e-08, + 6.65516022469401604e-09, + 4.28280439319023963e-09, + 3.27997563062856985e-09, + 2.70919381209997298e-09, + 2.30355508825740683e-09, + 1.98580366449970793e-09, + 1.72769015405535977e-09, + 1.51448516417886533e-09, + 1.33642139831958905e-09, + 1.18635367119242092e-09, + 1.05886121314889773e-09, + 9.49757283604983098e-10, + 8.55767142139569461e-10, + 7.74301716247654708e-10, + 7.03294093373284909e-10, + 6.41079468430678670e-10, + 5.86305857946170798e-10, + 5.37866933414851375e-10, + 4.94850961611324608e-10, + 4.56501610071138734e-10, + 4.22187587074136736e-10, + 3.91378925268250553e-10, + 3.63628308113501376e-10, + 3.38556257489641986e-10, + 3.15839301967731984e-10, + 2.95200463787930467e-10, + 2.76401562670537633e-10, + 2.59236953026891041e-10, +-1.61832679208381218e-03, +-2.20819636279449567e-04, +-3.39104364461448622e-05, +-5.98656606440908571e-06, +-1.23532140878186625e-06, +-3.00412820390015408e-07, +-8.61208197498648076e-08, +-2.91870302673462909e-08, +-1.17697365437634305e-08, +-5.31217610925801195e-09, +-2.31163457304025819e-09, +-8.84865422395954632e-10, +-3.11100707881855459e-10, +-1.18529064587725273e-10, +-5.91447820566949946e-11, +-3.88987711154539578e-11, +-2.95612831595957265e-11, +-2.37284443577452898e-11, +-1.94734555197412206e-11, +-1.61853150803917203e-11, +-1.35839162220490117e-11, +-1.14973114466970739e-11, +-9.80551340960980735e-12, +-8.42080801422924935e-12, +-7.27770525785245764e-12, +-6.32661525531036629e-12, +-5.52954404182973292e-12, +-4.85707244789143405e-12, +-4.28619823987929077e-12, +-3.79877381805794463e-12, +-3.38036137946215870e-12, +-3.01938470258156030e-12, +-2.70649417942790640e-12, +-2.43408693053101872e-12, +-2.19594083271489759e-12, +-1.98693309229507924e-12, +-1.80282208355508254e-12, +-1.64007699040099722e-12, +-1.49574383703535940e-12, +-1.36733942257590761e-12, + 2.03881594416236334e-04, + 2.63909482570251984e-05, + 3.78714993754337112e-06, + 6.14381763976976076e-07, + 1.14580694929023924e-07, + 2.48229222216302287e-08, + 6.24692169907840034e-09, + 1.80521852860070174e-09, + 6.09102730777785168e-10, + 2.61200094520600442e-10, + 1.28710623521974275e-10, + 5.63538935170303110e-11, + 2.01716616626044920e-11, + 6.28488638953079810e-12, + 1.98243370527721862e-12, + 7.88633244464653855e-13, + 4.39679098516678194e-13, + 3.05435827030082343e-13, + 2.31814413454281853e-13, + 1.81842919421408634e-13, + 1.45010581383190202e-13, + 1.17000226057086800e-13, + 9.53441301306903481e-14, + 7.83942819175502208e-14, + 6.49863783821626983e-14, + 5.42777192387394670e-14, + 4.56489355692884607e-14, + 3.86390372400878252e-14, + 3.29010157097096541e-14, + 2.81709224791152761e-14, + 2.42460456894743989e-14, + 2.09692868576405204e-14, + 1.82178796953119576e-14, + 1.58951211843978822e-14, + 1.39242789913721937e-14, + 1.22440420244664954e-14, + 1.08050979908586474e-14, + 9.56754701385802245e-15, + 8.49890773662222806e-15, + 7.57259859522177985e-15, +-2.10995683419332209e-05, +-2.61105940627015375e-06, +-3.53744523712164800e-07, +-5.34177689198333324e-08, +-9.14040595948894845e-09, +-1.79443297914852201e-09, +-4.06821311498279731e-10, +-1.05578598779857213e-10, +-2.97011343125018498e-11, +-9.52884335335526704e-12, +-4.72462672916760529e-12, +-2.61574465266682280e-12, +-1.12253650306450442e-12, +-3.73871359381663871e-13, +-1.06153189459047458e-13, +-2.93855344955800763e-14, +-9.78203709021667290e-15, +-4.65617264271552075e-15, +-2.95003694785230357e-15, +-2.12041744830697583e-15, +-1.59531228885749420e-15, +-1.22512191034775999e-15, +-9.53638445129787276e-16, +-7.50679760621804173e-16, +-5.96878691695846618e-16, +-4.78968374394430500e-16, +-3.87619554713400529e-16, +-3.16163903437971424e-16, +-2.59764140161085987e-16, +-2.14878287113796322e-16, +-1.78876036243577127e-16, +-1.49789675569321925e-16, +-1.26130476120979707e-16, +-1.06763765105723023e-16, +-9.08143498290361873e-17, +-7.76060276353889241e-17, +-6.66095537454196819e-17, +-5.74074169361096417e-17, +-4.96708766174698347e-17, +-4.31363800193018256e-17, + 1.85859136822960110e-06, + 2.21265163202508980e-07, + 2.85334393090200680e-08, + 4.05174639755423195e-09, + 6.43680550299233790e-10, + 1.15889078464351754e-10, + 2.38534881882786352e-11, + 5.68278942222081969e-12, + 1.53538027616900111e-12, + 3.74147305580688641e-13, + 1.06513162748467608e-13, + 7.63807489598479608e-14, + 4.60934471416699145e-14, + 1.86261467666209425e-14, + 5.73564375544922588e-15, + 1.50539332049148025e-15, + 3.78734470608907757e-16, + 1.10277097803381107e-16, + 4.57325987172298119e-17, + 2.65196293734185492e-17, + 1.80994566261380995e-17, + 1.31014315075663188e-17, + 9.72001794811946514e-18, + 7.32309547735606110e-18, + 5.58283779050777688e-18, + 4.30422992885121803e-18, + 3.35260037831258505e-18, + 2.63491750102624840e-18, + 2.08968324095147675e-18, + 1.66942741886091196e-18, + 1.34466507184287246e-18, + 1.09003709938879559e-18, + 8.90204811928133188e-19, + 7.30452630625216316e-19, + 6.03881585426217736e-19, + 5.01769283964682345e-19, + 4.17883126260330060e-19, + 3.50989476028852496e-19, + 2.95754952989767709e-19, + 2.50782426109981264e-19, +-1.42800495155975086e-07, +-1.64391299510298499e-08, +-2.03133973467892602e-09, +-2.73498092401534042e-10, +-4.07346216934262149e-11, +-6.80096493889537630e-12, +-1.28313767109457599e-12, +-2.74566310028962207e-13, +-7.14861587884157770e-14, +-2.02868658855886257e-14, +-2.61389821964322549e-15, +-7.91024069554921660e-16, +-1.19502182851915633e-15, +-7.06922364711165507e-16, +-2.60827865540295400e-16, +-7.41767478307391279e-17, +-1.81692768954873667e-17, +-4.24407336612229198e-18, +-1.11791850588017926e-18, +-4.13984406588851897e-19, +-2.21310877338229142e-19, +-1.44000486279155086e-19, +-1.00776746154037573e-19, +-7.16277920549096478e-20, +-5.34873464118771384e-20, +-3.99109063914978469e-20, +-2.91643352853203504e-20, +-2.21908518601106954e-20, +-1.64483442544335289e-20, +-1.28705529837694854e-20, +-9.61314884739739241e-21, +-7.49117459541472880e-21, +-5.77123592320188330e-21, +-4.87620278976255464e-21, +-3.22923659580713573e-21, +-2.38225316913798048e-21, +-2.39751543060623365e-21, +-1.41653739815281130e-21, +-1.23570045180038440e-21, +-1.33486190276315780e-21, + 9.74221450663304490e-09, + 1.08914449859586092e-09, + 1.29672905453602008e-10, + 1.66677245458908533e-11, + 2.34613135685556971e-12, + 3.66508832279710971e-13, + 6.42478997466724193e-14, + 1.25600299014541546e-14, + 2.71243529348502893e-15, + 9.34851688929749537e-16, + 2.21046737777918170e-16, +-2.29170608079012255e-17, + 5.98687887730525283e-18, + 1.79448438434957529e-17, + 9.37212175326014581e-18, + 3.11927037671744307e-18, + 8.22660503509679614e-19, + 1.88847408820108396e-19, + 4.17400642246288358e-20, + 1.02782569829894359e-20, + 3.99863803264969644e-21, + 1.71810195458074595e-21, + 1.34994253932900817e-21, + 1.42609057734465532e-21, + 4.70079932004778401e-22, +-6.82384114489489538e-22, + 3.40906183157607548e-22, +-1.25043290127519263e-22, + 5.94589019616401015e-22, + 3.56081427070300145e-22, + 5.15068498012279158e-22, + 3.13052504674659995e-22, + 1.85671402539086988e-22, +-1.15153089658459829e-22, + 6.17188505938916687e-22, + 5.33298325785597398e-22, + 2.91990075668210689e-22, + 9.86805588658605652e-23, + 1.38926428328323227e-22, + 5.77866244655983086e-22, +-5.98226688886131668e-10, +-6.51831164851566969e-11, +-7.51224203346058371e-12, +-9.27149500210609006e-13, +-1.24179483790911949e-13, +-1.82843753964428494e-14, +-2.99469927529536733e-15, +-5.55550270193710786e-16, +-1.03437616086665643e-16, +-2.40141808705617194e-17, +-1.44437223380586323e-17, +-7.18571912117566736e-19, + 9.43258422837054848e-19, +-1.29965156698628742e-19, +-2.42141643944824785e-19, +-1.07424517289015689e-19, +-3.16688206772859971e-20, +-8.70597320351110679e-21, +-1.93824458846866527e-21, +-3.28294916364766995e-22, + 6.18527627162218396e-22, + 1.12344525601410134e-22, + 2.24937677822459200e-22, + 6.92356605165344724e-22, +-2.30700670011445822e-22, +-6.42711997391957692e-22, + 7.47281103454565285e-23, +-1.89147894758238458e-22, + 7.17580933126292763e-22, + 3.51004463763609756e-22, + 7.07416181598347382e-22, +-2.50843505385894277e-22, + 5.66731941188912613e-22, + 1.35529961763932055e-22, + 6.32669782206062923e-22, + 9.01232746880390231e-22, + 1.63823058941369873e-22, + 2.48063191346518267e-22, + 7.47920768069240935e-23, + 2.40545729507458360e-22, + 3.34191373203385381e-11, + 3.55984986020701126e-12, + 3.98694173049394345e-13, + 4.74781174702424546e-14, + 6.08627577170596608e-15, + 8.50442656637251902e-16, + 1.30823650178429793e-16, + 2.25416505929811070e-17, + 4.69550556051035746e-18, + 3.29955274177927319e-19, + 3.93396588971863324e-19, + 1.80025909391865089e-19, +-3.10392570565681552e-20, +-1.30181927004983279e-20, + 2.97261467275935011e-21, + 2.75785922499794854e-21, + 1.16676669582547692e-21, + 2.42602577953553134e-22, + 1.92870207331649527e-22, + 4.68358516083836292e-22, + 3.41977018904947997e-22, + 7.20885668670491171e-24, +-1.70701168427465208e-22, + 5.50132226890344521e-22, +-2.66393963772534015e-22, +-4.21736160364952454e-22, + 2.07545870640728555e-22, +-4.81176456758297823e-23, + 4.23525648876150284e-22, +-5.64826027406127728e-23, + 4.39716619074426409e-22, + 1.78554203537900539e-22, + 3.67587114570259146e-22, + 8.86050380410012678e-23, + 2.69050209175182195e-22, + 4.82921043573924357e-22, + 2.15315090890350242e-22, + 1.94311465766002089e-22, + 2.68395757743353340e-22, + 2.22318904652635645e-22, +-1.71314894239366817e-12, +-1.78866551818764914e-13, +-1.95328086596617891e-14, +-2.25382951696357682e-15, +-2.77921458068026071e-16, +-3.70623249170945697e-17, +-5.41271706061480612e-18, +-8.55533088722698425e-19, +-1.77772376744110370e-19, +-3.07219813494932035e-20, + 5.63892171126250004e-21, +-8.88230094772470467e-21, +-7.15365240075319222e-22, + 7.85011708935205637e-22, + 5.65246046480216440e-22, +-3.16693306470170931e-22, + 6.57429358335654739e-22, + 1.86622014590348060e-24, + 5.97235274751332391e-22, + 3.84874487423664090e-23, + 2.68341315516513322e-22, + 4.19737118820647975e-22, + 4.63022479266692454e-22, + 5.78627060508790526e-22, + 3.90674025103855671e-23, +-5.20958804173815975e-22, + 3.67520138729923067e-22, +-3.95439976992476522e-22, + 5.02536454475271216e-22, + 1.26680371055369110e-22, + 2.76740133460208017e-22, +-2.13317280218691202e-22, + 1.12802451744617208e-22, + 2.27477437369461379e-22, + 3.14589787175940409e-22, + 4.57149219617764819e-22, +-3.27593416871464101e-23, + 2.59108095205817715e-22, + 3.75977018937891027e-22, + 4.66867547688748367e-22, + 8.11450399416478926e-14, + 8.32394120452453845e-15, + 8.88596624201575437e-16, + 9.96879790117598308e-17, + 1.18668756901683596e-17, + 1.51965295505618154e-18, + 2.10353855152543494e-19, + 3.16733284447020556e-20, + 3.94275345464662458e-21, + 1.96128644050830884e-21, +-5.02628148846964409e-22, + 3.11483813653499421e-22, + 4.09261077722803385e-22, +-2.02815780784791283e-22, + 6.72389825358041937e-23, +-2.44206473921440458e-22, + 3.00558460059769814e-23, +-8.77138462673095355e-23, + 2.36194289702550128e-23, +-2.67014420298601938e-22, + 1.60776665903130250e-22, + 1.64487180572192797e-23, +-1.17652241148939225e-22, + 4.82647413016106586e-22, + 8.53094088651848009e-24, +-2.26371142428248697e-22, + 2.72223258965052741e-22, + 3.61223606825769557e-22, + 1.74493532965379916e-22, + 4.03648710049990005e-23, + 1.63287733331544303e-22, + 1.36949125926118906e-23, + 2.45283677779042158e-22, + 1.60386789922582859e-22, + 5.33776336777857459e-22, + 4.26050333466944063e-22, + 2.84818157278499621e-22, + 6.63483218616810793e-23, +-2.98843168571916555e-24, + 2.18693474254767771e-22, +-3.59676705533093426e-15, +-3.64624533435354613e-16, +-3.83440417446590306e-17, +-4.23388573152207719e-18, +-4.92751082008932319e-19, +-6.96170491114102492e-20, +-1.21150099490768537e-20, +-2.45091088059826271e-21, +-6.97144120965740542e-22, +-1.40127862525304075e-22, + 1.40464297162173376e-22, +-1.50292892537536519e-22, +-5.48706645566995690e-23, +-1.42945944464123132e-22, +-2.31308495641467373e-22, +-3.71156448606920261e-22, + 1.33325255450177233e-23, +-6.59026536342382697e-22, +-2.83232668142678230e-22, +-1.88105390541348542e-22, + 2.65005781036062877e-22, + 2.34034939372339684e-22, + 1.21052296347872238e-23, +-1.62979484959746952e-22, +-2.53205170309701313e-22, + 9.10865839931121711e-23, +-3.27584658728677018e-22, +-1.28568949172770938e-22, +-3.92167181136156455e-22, +-2.19325999829630510e-22, +-1.47687117641575881e-22, + 3.19000219188026888e-23, +-2.99750577169415179e-22, +-3.96485814827574118e-22, + 1.30722415910114329e-22, +-6.43386313792735169e-23, +-1.00827753134820651e-22, +-6.60835532816551827e-23, +-1.21641862855002912e-22, +-4.34550065060111175e-22, +// root 2 + 5.68197150726061806e-01, + 5.18337180139386344e-01, + 4.68651220507356581e-01, + 4.20967114470669257e-01, + 3.76655612631535575e-01, + 3.36482625320836060e-01, + 3.00677987260935642e-01, + 2.69138669961857202e-01, + 2.41649866207420766e-01, + 2.17986155062934672e-01, + 1.97853933401859139e-01, + 1.80825813574396810e-01, + 1.66391782334267047e-01, + 1.54062037622159170e-01, + 1.43426729398491160e-01, + 1.34163956764231540e-01, + 1.26025189409621041e-01, + 1.18817704322814077e-01, + 1.12390299212444852e-01, + 1.06622800126391568e-01, + 1.01418512652319340e-01, + 9.66987576793387621e-02, + 9.23988623297702233e-02, + 8.84651755205244916e-02, + 8.48528154953653302e-02, + 8.15239481426218993e-02, + 7.84464556759067178e-02, + 7.55928961635266156e-02, + 7.29396823694478807e-02, + 7.04664277975373815e-02, + 6.81554215176774225e-02, + 6.59912031229278329e-02, + 6.39602162280436121e-02, + 6.20505240813102599e-02, + 6.02515746751553505e-02, + 5.85540055865850367e-02, + 5.69494809216749484e-02, + 5.54305543666401418e-02, + 5.39905535952979534e-02, + 5.26234822455755244e-02, +-2.46748916729291404e-02, +-2.50815226896913233e-02, +-2.45065174452292443e-02, +-2.31051728813477346e-02, +-2.11670301994789332e-02, +-1.89955408353539197e-02, +-1.68162059804910641e-02, +-1.47351016627478501e-02, +-1.27647918357590515e-02, +-1.09135502214720050e-02, +-9.24143267144183003e-03, +-7.81410739219725974e-03, +-6.64584311640199939e-03, +-5.70526083572317662e-03, +-4.94668903369645339e-03, +-4.32889911348745531e-03, +-3.81980565799506025e-03, +-3.39548196029392088e-03, +-3.03813014790378253e-03, +-2.73436739980631579e-03, +-2.47399023997797209e-03, +-2.24911245651202279e-03, +-2.05356160903781386e-03, +-1.88245084445455395e-03, +-1.73187045896387119e-03, +-1.59866246032674161e-03, +-1.48025355897260665e-03, +-1.37452990078454069e-03, +-1.27974202991313463e-03, +-1.19443202226627849e-03, +-1.11737706950183237e-03, +-1.04754540176182930e-03, +-9.84061558525751740e-04, +-9.26178808430933465e-04, +-8.73257084293564321e-04, +-8.24745207930171770e-04, +-7.80166477397724973e-04, +-7.39106908877912284e-04, +-7.01205588737968742e-04, +-6.66146713787935498e-04, +-1.12231809289620171e-04, + 1.17362607747267051e-05, + 1.28989802411923644e-04, + 2.15799112501019404e-04, + 2.63014821434343505e-04, + 2.75656877392808247e-04, + 2.67289078001319415e-04, + 2.52977192474535591e-04, + 2.39600053652697516e-04, + 2.21974871015120841e-04, + 1.94713665107883567e-04, + 1.61891074430896693e-04, + 1.30823201212545016e-04, + 1.05191426511884163e-04, + 8.52096550428947940e-05, + 6.98194349421038616e-05, + 5.78856480306469241e-05, + 4.85162068113702830e-05, + 4.10632207567074864e-05, + 3.50617422126810402e-05, + 3.01750989799265549e-05, + 2.61560071219320029e-05, + 2.28201688247621349e-05, + 2.00283397396145118e-05, + 1.76739880050555578e-05, + 1.56746681206759403e-05, + 1.39658992874194364e-05, + 1.24967592461517706e-05, + 1.12266712023202445e-05, + 1.01230323460865343e-05, + 9.15944386848855952e-06, + 8.31437613517277429e-06, + 7.57015226086881694e-06, + 6.91216712418605697e-06, + 6.32828220159094117e-06, + 5.80835291445618678e-06, + 5.34385671831224991e-06, + 4.92759840662864455e-06, + 4.55347505198341280e-06, + 4.21628734316831743e-06, + 9.80628811992230138e-06, + 1.04662290299531696e-05, + 8.75135139329542725e-06, + 5.60014244251393002e-06, + 2.34325204031245284e-06, +-5.09849025122671017e-08, +-1.13241524670071540e-06, +-1.15373430926581536e-06, +-1.16522320130118699e-06, +-1.86016517224816527e-06, +-2.61600389504437931e-06, +-2.74849357957955448e-06, +-2.38347884194847990e-06, +-1.88923017548470162e-06, +-1.45636709183689681e-06, +-1.12376885168110737e-06, +-8.76769113963983098e-07, +-6.93146140427258199e-07, +-5.54996074824358013e-07, +-4.49581299742222712e-07, +-3.68043439707027599e-07, +-3.04180705582684636e-07, +-2.53588736180934341e-07, +-2.13091562197355380e-07, +-1.80365598480676970e-07, +-1.53687990275405361e-07, +-1.31765494988750461e-07, +-1.13616292792439057e-07, +-9.84871507923618958e-08, +-8.57945717856436526e-08, +-7.50824536060932466e-08, +-6.59912691103047545e-08, +-5.82353865497439925e-08, +-5.15862098315411778e-08, +-4.58595256081970780e-08, +-4.09059225223441990e-08, +-3.66034756055381658e-08, +-3.28521162014974576e-08, +-2.95692666725432407e-08, +-2.66864319680798350e-08, + 1.16734201939538388e-07, +-3.74237495334087225e-08, +-1.66406148670514347e-07, +-2.13274653981806710e-07, +-1.84129557749124570e-07, +-1.10464526958805911e-07, +-2.68200118821374517e-08, + 1.21998302126725779e-08, +-2.22366683407466533e-08, +-5.63027072738787139e-08, +-3.02957651872380524e-08, + 1.14855973612658882e-08, + 3.00347557818879099e-08, + 2.99361524783990202e-08, + 2.38943848858062299e-08, + 1.78695658526610850e-08, + 1.32370813981877540e-08, + 9.89510005445800378e-09, + 7.49980410716772821e-09, + 5.76456960639446839e-09, + 4.48896568249393615e-09, + 3.53745795657602515e-09, + 2.81799981820307256e-09, + 2.26718803251501910e-09, + 1.84065694997002483e-09, + 1.50688986415983190e-09, + 1.24318135939768999e-09, + 1.03296076122542382e-09, + 8.63988869913347313e-10, + 7.27124870250065642e-10, + 6.15471301684631327e-10, + 5.23773230368054900e-10, + 4.47991025863239315e-10, + 3.84993157144726997e-10, + 3.32332857097378822e-10, + 2.88084168012487769e-10, + 2.50720504130618302e-10, + 2.19023844106334358e-10, + 1.92016328633252486e-10, + 1.68908238130025263e-10, +-6.83535908533581074e-09, +-7.81333872432547333e-09, +-4.58739158604447036e-09, +-1.96819747219131403e-10, + 2.83221004258685460e-09, + 4.28562172952844169e-09, + 3.60292102674633349e-09, +-5.57613651097350300e-11, +-2.64508788229392081e-09, +-1.63220021033278729e-10, + 2.24662618907440300e-09, + 1.59853541157904061e-09, + 3.36166305216069263e-10, +-2.33910436811906919e-10, +-3.25557589985327447e-10, +-2.68402000467022700e-10, +-1.96540256222900637e-10, +-1.40627281131865887e-10, +-1.01235048848973773e-10, +-7.38952399190813313e-11, +-5.47482597227565968e-11, +-4.11382863848804558e-11, +-3.13148985486186845e-11, +-2.41217365002153422e-11, +-1.87841737775225956e-11, +-1.47748392135324644e-11, +-1.17291691754768556e-11, +-9.39132920801196567e-12, +-7.57942542483025665e-12, +-6.16251334970943229e-12, +-5.04518275889576858e-12, +-4.15718960077712866e-12, +-3.44628557130735681e-12, +-2.87324019094833835e-12, +-2.40832986389351097e-12, +-2.02885901592383115e-12, +-1.71733973615718181e-12, +-1.46022064116000903e-12, +-1.24690678193304938e-12, +-1.06907828814091406e-12, +-1.34198570126006931e-10, + 5.88746526752084666e-11, + 1.85005420429968775e-10, + 1.62182060309279189e-10, + 9.15913692121276626e-11, + 2.63125174829574298e-11, +-9.46755899150686523e-11, +-1.79870685725546219e-10, + 4.21529762036561224e-12, + 1.52484163235187022e-10, + 2.72692785506614168e-11, +-5.79197436342003570e-11, +-3.92755375776461563e-11, +-1.08040500921402440e-11, + 8.27923804544848599e-13, + 3.11547152762807551e-12, + 2.71250732699460892e-12, + 1.95704402858257882e-12, + 1.35882089644034736e-12, + 9.45928316359177447e-13, + 6.67502483271544853e-13, + 4.78385138603613796e-13, + 3.47985644786225596e-13, + 2.56650325457591738e-13, + 1.91692030340526125e-13, + 1.44878377170117860e-13, + 1.10661617927325329e-13, + 8.53781573644951963e-14, + 6.64946260949614123e-14, + 5.22285611274624812e-14, + 4.13535163731849641e-14, + 3.29968298532305678e-14, + 2.65162089013524117e-14, + 2.14430010824110214e-14, + 1.74551311583565360e-14, + 1.42892920043997577e-14, + 1.17649553742448379e-14, + 9.73487314342802167e-15, + 8.10020887773962334e-15, + 6.76977500328526591e-15, + 5.56611739028947095e-12, + 6.87670675848151845e-12, + 1.59477577201980435e-12, +-2.43179006760061348e-12, +-2.24494698141075548e-12, +-2.97688471321793181e-12, +-5.25956523194515306e-12, + 1.29853913045664690e-12, + 9.48698269563599620e-12, +-7.96120756343139181e-13, +-5.41734010070054693e-12, +-5.70521519048657079e-13, + 1.22469756855635838e-12, + 7.01082332442129236e-13, + 1.92185105731683690e-13, + 9.88441050725912559e-15, +-2.67213153966935985e-14, +-2.49538668228179199e-14, +-1.77976983222934253e-14, +-1.20305001474593174e-14, +-8.12819787915013827e-15, +-5.55526505418387936e-15, +-3.85894993666904521e-15, +-2.72366177942204327e-15, +-1.95703564528522641e-15, +-1.41527330458833118e-15, +-1.04618102811426053e-15, +-7.76229540108026196e-16, +-5.79937124381679520e-16, +-4.42723517895040076e-16, +-3.41618955208405276e-16, +-2.60333195486083861e-16, +-2.03605483033192436e-16, +-1.61461399811760689e-16, +-1.24032038708555658e-16, +-9.86106150749396799e-17, +-7.89779253677325842e-17, +-6.33474856731441249e-17, +-4.93507994251254987e-17, +-3.86535744274921055e-17, + 1.59275953456729254e-13, +-8.89851412328857672e-14, +-1.89423852345509417e-13, +-4.54028512889001736e-14, + 2.23259157585216128e-14, +-7.76227879034945983e-14, + 5.61485849303311670e-15, + 3.82051596908369080e-13, +-4.74984732506264075e-14, +-3.90119825124210133e-13, + 9.60845515417517164e-14, + 1.26484771002084095e-13, + 9.24217179373563556e-16, +-2.13078184289113904e-14, +-9.95766209200221003e-15, +-2.56372604791368642e-15, +-2.33170820304262173e-16, + 2.12464999440496278e-16, + 2.14623199677663290e-16, + 1.50217237634627380e-16, + 9.50256524310413485e-17, + 7.00832361038739509e-17, + 5.00128196324294743e-17, + 3.29535419297229803e-17, + 1.70353869342118845e-17, + 1.73871475114957091e-17, + 4.94021979730212066e-18, +-4.16818233588195121e-19, + 7.71435993037199553e-18, +-3.84619202203828477e-19, +-1.52871995585796037e-18, + 2.90900352979082741e-18, +-8.73358831962078769e-19, +-7.23740492061077392e-19, + 1.45527653714970969e-18, + 7.76615837892692844e-19, + 4.25304026606995648e-19, + 7.02937630554940920e-19, + 1.63216910714026645e-18, + 7.27223564413818276e-19, +-4.84115947777421718e-15, +-6.71232659329040961e-15, + 1.62547390483213341e-15, + 4.46462443305990976e-15, +-1.16391788960856029e-15, +-2.60194807351940823e-15, + 8.87947592606262366e-15, + 4.38833717522327717e-15, +-2.27115758035416973e-14, + 8.81416789173132544e-15, + 9.06466565271770848e-15, +-4.12472956384667939e-15, +-1.90674881744703498e-15, + 1.91773840895913626e-16, + 3.04074820295390345e-16, + 1.19369524525180398e-16, + 3.02241608530869072e-17, + 5.45509204101283957e-18, +-2.52896172128606633e-19, +-2.96122137709331314e-18, +-6.75870809937327281e-19, + 6.75715525888324598e-18, + 5.42051691890478921e-18, + 3.57032331782418679e-18, +-7.97834036277624906e-19, + 6.64831912049216105e-18, +-2.27195191418659226e-20, + 7.95477178463111927e-19, + 2.93188084571577689e-18, + 4.45089291992933034e-18, + 1.04554230536862576e-18, + 8.66199209603187086e-19, + 9.99778411002762409e-19, + 5.89003190757004734e-19, + 2.05744255098716177e-18, + 1.46855435021225621e-18, + 1.72747432233781499e-18, + 4.87374173036696552e-19, + 1.63095602084981745e-18, + 1.58565473636759465e-18, +-1.87944870988641792e-16, + 1.31188829811355064e-16, + 2.00054404224963968e-16, +-5.74356267405449090e-17, +-1.46967310896547263e-16, + 1.21683718928845548e-16, + 3.39317046892411539e-16, +-7.20897228135646709e-16, + 7.31401934708617594e-17, + 7.89054634696395172e-16, +-5.00101460937348504e-16, +-6.46471535401922561e-17, + 9.27849988021370629e-17, + 2.47159702517825494e-17, +-7.63373798726666757e-18, +-8.78586513505387033e-18, + 6.62981428762000267e-18, + 1.62620204524077757e-18, +-2.08819961622009318e-19, +-1.23397609501566931e-19, +-2.40360381999132536e-18, + 2.17417732155013312e-18, + 4.59162050549304292e-18, + 8.19987287907287396e-18, +-1.31295166905849515e-18, + 2.71031226398502967e-18, +-7.21873036313829508e-19, +-4.89137064307426389e-19, + 1.42275840027265531e-18, + 3.86958811080609085e-18, +-1.73196971357761239e-18, +-2.19029765790682057e-19, + 2.13667951190486743e-18, + 2.21007438803512959e-19, + 1.20226821900887099e-18, + 1.31495961431241462e-18, + 9.08467901381217265e-19, + 7.45368472811900973e-19, + 2.48233334707579609e-18, +-3.54400673345029395e-19, + 1.45027436543391318e-18, +-2.70689399640568207e-18, +-7.25594987220922674e-18, +-4.73975146989018438e-18, +-9.24996725698093396e-18, +-5.92817852519898167e-18, +-2.14106715176014471e-17, +-3.13720798833479334e-17, + 4.32858251496965594e-17, +-3.82639185637469527e-17, +-1.54787514505029959e-17, + 4.25671893952762997e-18, +-5.23968113122212585e-18, + 1.33379784156790044e-17, + 4.05483881252153557e-18, + 4.57475229004148208e-18, + 1.18831448657178002e-17, + 9.48121944086232172e-18, + 4.82288640517709227e-18, + 6.62050506579033871e-18, + 5.88159742915228446e-19, + 5.22919064011805012e-18, + 4.39328388210261579e-18, + 6.65996163414932092e-18, + 2.30735836880954371e-18, + 8.10165995622614850e-18, + 1.69700574414088680e-18, +-6.35542475261856999e-19, + 4.27196002785533141e-18, + 1.46514513029249144e-18, +-7.97621180993607811e-19, + 2.91511817511706998e-18, + 2.05177876143354437e-18, + 8.45983701539579142e-19, + 8.32732001295304872e-19, + 1.08949540384539792e-18, + 1.07756884800552469e-18, + 1.01198521378127093e-18, + 2.36792030731844778e-18, + 1.42093932777981362e-18, + 2.31762881557639170e-18, + 1.39390380339878035e-17, +-2.72533688068086621e-17, + 8.27427488382860123e-18, +-6.46155996344244060e-18, +-4.56624497241477888e-21, +-7.42618609913365445e-19, + 1.50986322632926752e-17, +-3.10544049236051145e-18, +-7.00724575404843048e-19, +-5.68710990335869515e-18, +-4.23520624123481090e-18, + 2.71811822447929368e-18, +-3.63108775760704743e-18, +-1.98532443718224395e-18, +-5.18264881825588490e-18, +-4.89429894991855909e-19, +-2.78703438676317628e-18, +-3.44120016860336052e-18, + 4.88840020160006838e-20, +-2.77168091193488430e-18, + 1.55804957490729357e-18, +-2.43098640306174859e-19, + 3.77943174392422527e-18, +-1.05738146117959078e-18, + 4.82621645395687160e-19, + 1.20738306534955829e-18, + 2.52811323938892424e-18, + 2.35682079636030686e-18, + 3.77884460449952754e-18, + 3.65723797598542007e-18, + 3.50074414201727241e-18, + 1.11049466483312283e-18, + 2.62676043993228939e-18, + 1.17780568987807746e-18, + 2.52251879627005126e-18, + 1.12997957209205308e-18, +-1.83326177461544605e-19, + 2.11139201101328156e-18, + 1.75362239798894840e-18, + 1.93929211705689178e-17, +-1.30323491310983444e-17, +-3.32573799850359469e-18, +-5.31302888045728709e-18, +-1.10528544610909741e-17, + 5.79245833315513049e-18, +-2.17105368713118646e-18, +-7.32464023625370998e-18, +-8.48392927136391404e-19, +-2.45122929472190221e-18, +-4.24282045105349529e-18, +-6.01468669837419673e-18, + 6.37681200856916813e-18, +-1.88087745046974638e-18, +-9.69530554797176482e-18, +-3.83514941525989925e-18, +-6.50238612182837568e-18, +-3.33288070110567575e-18, +-4.28930681797223009e-18, +-3.49136150712034874e-18, +-3.17152365247348065e-18, +-1.09291439809439978e-18, +-2.04941206401958033e-18, +-8.34800242033508991e-19, +-2.97915200771392898e-18, +-5.85844487635310909e-19, +-4.56549297527433633e-18, +-4.98367979061438601e-18, +-1.38995889610681242e-18, +-3.17733466290135017e-18, +-2.37163624452769172e-18, +-5.21408325817893446e-18, +-2.45941640445098761e-18, +-3.02629962574937146e-18, +-2.18719689255021109e-18, +-3.24797012841504869e-18, +-2.35680149744808243e-18, +-3.46290455810973182e-18, +-3.01894795229166753e-18, +-2.54952978069533617e-18, + 9.16414875891052721e-02, + 2.72722615298158985e-02, + 1.02048603353518171e-02, + 4.73168755630244079e-03, + 2.64579129426574652e-03, + 1.72701213818786782e-03, + 1.27472989827136316e-03, + 1.03427972281247647e-03, + 8.99586372996305028e-04, + 8.19833200446747480e-04, + 7.68056556809641722e-04, + 7.30072957485373227e-04, + 6.99170840652540353e-04, + 6.72491396407479429e-04, + 6.48809179172608040e-04, + 6.27502151075567905e-04, + 6.08173690450810288e-04, + 5.90530045626925658e-04, + 5.74338746989208095e-04, + 5.59410636237816648e-04, + 5.45589488951827347e-04, + 5.32744888583016121e-04, + 5.20766972346029737e-04, + 5.09562441635879205e-04, + 4.99051482331564801e-04, + 4.89165357712566663e-04, + 4.79844506684682433e-04, + 4.71037026488296470e-04, + 4.62697451257096989e-04, + 4.54785760572533695e-04, + 4.47266568517105500e-04, + 4.40108455628727871e-04, + 4.33283414915683752e-04, + 4.26766389606506101e-04, + 4.20534885204637966e-04, + 4.14568642131026715e-04, + 4.08849358079200489e-04, + 4.03360451399571978e-04, + 3.98086858534140667e-04, + 3.93014859857671842e-04, +-5.67049390826932023e-02, +-1.41493274770410123e-02, +-4.26657538838944462e-03, +-1.53548384554592627e-03, +-6.44158043463991447e-04, +-3.05519864419411457e-04, +-1.58390848263458017e-04, +-8.70468121672367631e-05, +-5.01101163078388479e-05, +-3.09844765729363811e-05, +-2.14968214713900623e-05, +-1.68103940281237820e-05, +-1.42253442316883947e-05, +-1.25114359374233695e-05, +-1.12009749412398133e-05, +-1.01260213396333915e-05, +-9.21749769977365498e-06, +-8.43814210639901668e-06, +-7.76293925743127300e-06, +-7.17325936020722445e-06, +-6.65464414002444984e-06, +-6.19565058643557731e-06, +-5.78710356481884776e-06, +-5.42156739491068577e-06, +-5.09295871192762816e-06, +-4.79625747950711159e-06, +-4.52728830368450709e-06, +-4.28255299179025943e-06, +-4.05910097706859386e-06, +-3.85442805972215332e-06, +-3.66639655629683588e-06, +-3.49317179928022746e-06, +-3.33317124188415531e-06, +-3.18502336636495627e-06, +-3.04753427966053576e-06, +-2.91966038336818801e-06, +-2.80048587822068632e-06, +-2.68920414242986754e-06, +-2.58510223402004110e-06, +-2.48754792764429541e-06, + 1.02283008049458054e-02, + 2.23489955190637156e-03, + 5.80002216162415368e-04, + 1.78035865755750915e-04, + 6.38706006682950071e-05, + 2.63539163702978770e-05, + 1.22685920053622483e-05, + 6.23965365937899418e-06, + 3.26835217093690933e-06, + 1.65360616387201359e-06, + 8.05079469318453564e-07, + 4.14396677374533162e-07, + 2.52711099814788792e-07, + 1.83362874202152849e-07, + 1.46951454857085596e-07, + 1.22934282405181941e-07, + 1.04844413574035815e-07, + 9.04408361072251428e-08, + 7.86955267040085686e-08, + 6.89857914304641052e-08, + 6.08751292697448937e-08, + 5.40394557625589614e-08, + 4.82320675142389660e-08, + 4.32622875338148369e-08, + 3.89809532465004231e-08, + 3.52701307700920735e-08, + 3.20356704938097565e-08, + 2.92017390800549816e-08, + 2.67067524822402745e-08, + 2.45003164550437339e-08, + 2.25409007401781075e-08, + 2.07940537224603158e-08, + 1.92310195032866101e-08, + 1.78276575992607546e-08, + 1.65635923446719909e-08, + 1.54215381742317778e-08, + 1.43867606770248334e-08, + 1.34466432701503952e-08, + 1.25903366304494981e-08, + 1.18084734186030398e-08, +-1.34754798285910134e-03, +-2.63768564524524728e-04, +-6.04146637790850839e-05, +-1.61879157905596808e-05, +-5.03390488505116929e-06, +-1.79359011061244779e-06, +-7.25761023729012102e-07, +-3.36572027537201685e-07, +-1.78279620918817405e-07, +-9.74523412596020699e-08, +-4.78040559909304415e-08, +-2.03575435750601169e-08, +-8.33631067280696091e-09, +-3.93407947281129495e-09, +-2.36891837739815378e-09, +-1.70645444148634302e-09, +-1.33438825488803507e-09, +-1.07873716870072978e-09, +-8.86685130250358087e-10, +-7.37200833010524639e-10, +-6.18751213613150425e-10, +-5.23711549574144282e-10, +-4.46649674854224154e-10, +-3.83575259894704314e-10, +-3.31505934179982474e-10, +-2.88182942630617876e-10, +-2.51875641454954065e-10, +-2.21243963141081285e-10, +-1.95240136099709479e-10, +-1.73037520809363136e-10, +-1.53978462702990144e-10, +-1.37535654480624981e-10, +-1.23283213349313616e-10, +-1.10874821201859546e-10, +-1.00027055036283556e-10, +-9.05065668080768774e-11, +-8.21201468880467884e-11, +-7.47069633750892407e-11, +-6.81324600398941066e-11, +-6.22835249564807513e-11, + 1.42330195985586349e-04, + 2.53765068972175790e-05, + 5.22691111518750903e-06, + 1.24748066392827333e-06, + 3.43640646262693702e-07, + 1.08071416362355099e-07, + 3.79620858098097436e-08, + 1.45830555607684565e-08, + 6.60086967083038692e-09, + 3.89940513102086361e-09, + 2.35794423903586030e-09, + 1.14350421712211893e-09, + 4.42792271968148942e-10, + 1.54375005912517133e-10, + 5.88449021724201762e-11, + 2.92441937661998345e-11, + 1.87337874836695661e-11, + 1.36800551804462656e-11, + 1.05199548953616068e-11, + 8.27677630570388176e-12, + 6.60438795171651117e-12, + 5.32932039105716822e-12, + 4.34298923322024205e-12, + 3.57092630171824144e-12, + 2.96018688408155046e-12, + 2.47239828106496788e-12, + 2.07934952546839158e-12, + 1.76004249231297893e-12, + 1.49867048690205807e-12, + 1.28321053631122822e-12, + 1.10442888183693506e-12, + 9.55169652090959974e-13, + 8.29840569139769737e-13, + 7.24036872005503518e-13, + 6.34263257106343098e-13, + 5.57726968534007970e-13, + 4.92181772972367812e-13, + 4.35810214165345712e-13, + 3.87132785813861166e-13, + 3.44938589573262405e-13, +-1.26704203204760993e-05, +-2.08404250130795004e-06, +-3.91453396419964135e-07, +-8.44160455553189799e-08, +-2.08886559043665248e-08, +-5.90678846618010437e-09, +-1.89499287344939284e-09, +-6.56003405284994098e-10, +-2.14870941895872144e-10, +-8.81267449011059940e-11, +-7.03162242905072792e-11, +-4.85514013360624195e-11, +-2.27342478161333710e-11, +-8.05437525111832672e-12, +-2.49088574690497335e-12, +-8.07125500210963714e-13, +-3.37426053532291688e-13, +-1.91868299512236824e-13, +-1.30846113806865896e-13, +-9.60047998123028175e-14, +-7.25764442665438833e-14, +-5.57915869175884266e-14, +-4.34371164987065213e-14, +-3.41938951990162997e-14, +-2.71882942664978882e-14, +-2.18174135447361921e-14, +-1.76564457149549852e-14, +-1.44014975742733990e-14, +-1.18324918172205492e-14, +-9.78787715927033416e-15, +-8.14795640904226826e-15, +-6.82304851641621889e-15, +-5.74540401683030236e-15, +-4.86319474647745126e-15, +-4.13671337843448769e-15, +-3.53503015589261125e-15, +-3.03415458322191913e-15, +-2.61498807013630991e-15, +-2.26255812438653381e-15, +-1.96491277096816278e-15, + 9.80650538411159668e-07, + 1.50328686537548861e-07, + 2.60393168012217334e-08, + 5.13274728937950309e-09, + 1.15305560297965117e-09, + 2.94021121192619349e-10, + 8.52528497352463372e-11, + 2.91439573986235705e-11, + 1.01765251880883420e-11, + 1.75563102149045992e-12, + 5.43188810282013286e-13, + 1.16505677482717988e-12, + 8.72555543630185051e-13, + 3.79201841276197828e-13, + 1.22848340905008213e-13, + 3.45160639303345412e-14, + 9.89896133157250427e-15, + 3.58533963468984047e-15, + 1.82309343550335674e-15, + 1.16385661535091941e-15, + 8.17352837385441857e-16, + 5.95705913682865291e-16, + 4.42591907862241882e-16, + 3.33519950906516110e-16, + 2.54326380623477788e-16, + 1.96069351846914079e-16, + 1.52681173761745901e-16, + 1.20048053482215031e-16, + 9.51653091271094784e-17, + 7.60476824881330385e-17, + 6.12253813387563840e-17, + 4.96435054905935969e-17, + 4.05108619368075013e-17, + 3.32701054040871290e-17, + 2.74886348747438767e-17, + 2.28645222850966996e-17, + 1.90181495507197921e-17, + 1.59728281534013929e-17, + 1.34613421354183379e-17, + 1.13995945460003338e-17, +-6.73928579251780868e-08, +-9.70988179307425096e-09, +-1.56539584106607872e-09, +-2.84769738203727379e-10, +-5.86829773929323533e-11, +-1.36695344550842082e-11, +-3.53512602879186078e-12, +-1.03344083995323187e-12, +-4.50222848651713275e-13, +-1.51748644013778511e-13, + 2.42332260100492496e-14, + 5.39292604514840266e-15, +-1.93325887889614463e-14, +-1.36667562538555753e-14, +-5.35373244943703166e-15, +-1.58935712696163436e-15, +-4.12082692894229580e-16, +-1.07550188455823817e-16, +-3.47560739805849990e-17, +-1.60338226979964304e-17, +-9.58026253998981252e-18, +-6.44100477959560930e-18, +-4.58018638241780932e-18, +-3.29517909141084614e-18, +-2.42297647907894507e-18, +-1.77560194988247127e-18, +-1.34222392220593073e-18, +-9.87220724075853693e-19, +-7.67319125051141583e-19, +-5.82412720879550987e-19, +-4.46728142719517049e-19, +-3.44794291048292031e-19, +-2.92102680955911346e-19, +-2.22979470371167994e-19, +-1.75446168339342312e-19, +-1.12163047001912550e-19, +-1.31783314487502530e-19, +-1.07673747544127292e-19, +-8.17776157687356527e-20, +-5.66588875982314139e-20, + 4.17527442771504620e-09, + 5.69437355016090064e-10, + 8.61141312085159090e-11, + 1.45745736568907730e-11, + 2.77579089555985274e-12, + 5.96649802226212602e-13, + 1.44497784171936296e-13, + 3.48476534189034841e-14, + 9.66814464881603585e-15, + 8.90997144894337963e-15, + 1.52440752183668700e-15, +-1.36816200824963851e-15, +-1.30334798617836550e-16, + 3.10723932240902018e-16, + 1.84801102213352046e-16, + 6.46118989855840718e-17, + 1.76609072660894542e-17, + 4.29976038241096834e-18, + 1.03840550250320800e-18, + 3.12632855435036947e-19, + 1.95692242157671189e-19, + 1.11653675137122530e-19, + 5.28813519278149385e-20, + 1.45390808379433663e-20, + 4.16246640637355975e-21, +-7.70893592356585736e-21, +-1.73175816850815539e-20, + 2.38310278775977961e-20, + 5.77881637746536650e-21, + 1.31978448015193993e-20, +-5.47553974932488496e-22, + 3.67347929902564593e-21, +-1.66878614507365688e-20, + 2.69239657999058445e-21, +-1.84476843179780454e-21, + 2.31419776003147319e-20, +-2.58446396707731333e-20, +-1.51716154020138661e-20, +-5.48986793753120849e-21, +-4.23526702366875570e-21, +-2.35886059192132064e-10, +-3.06386131328019775e-11, +-4.37566688069956027e-12, +-6.93923551698031217e-13, +-1.22994028903867127e-13, +-2.44115363841451404e-14, +-5.50962111193995212e-15, +-1.47969255899584132e-15, +-1.23242509316290184e-16, +-1.05593693154544031e-16, +-1.98050413243415795e-16, + 1.60479050484158156e-17, + 2.87434185541309960e-17, + 7.09404915031454647e-21, +-4.43442282734085697e-18, +-2.15855131788174141e-18, +-7.02646016800627137e-19, +-1.45108237074860249e-19, +-1.72838053425074175e-20, +-1.00168985071208400e-20, + 2.73545276729345059e-20, + 1.04934228360104211e-20, +-9.69296849082949173e-21, + 2.56242457696484287e-21, +-3.08271141116301789e-20, +-1.30122372568215902e-20, +-1.13267993189750592e-20, + 2.43027146211623669e-20, + 1.89578377211810591e-20, + 9.46731770274302571e-21, + 6.66292633612518397e-21, + 1.10143832168509314e-20, +-4.74949654484099981e-21, + 1.85697067192628774e-20, + 1.25755672487595536e-20, + 2.72493991704188280e-20, +-1.03779880169489287e-20, +-1.66549168017873318e-20, +-4.57494318544977416e-21, + 1.70161090108027562e-21, + 1.22617073960340502e-11, + 1.52480906447786993e-12, + 2.06866619375572401e-13, + 3.09317715996197409e-14, + 5.13708511844734514e-15, + 9.50725932398190313e-16, + 1.92062840017418458e-16, + 5.03990868769599999e-17, + 1.74882797026074199e-17, +-9.07879716516812923e-18, + 5.28805854478669336e-18, + 2.79831571462385894e-18, +-8.60384280042696129e-19, +-3.59798810555499330e-19, + 4.72944813573079966e-20, + 2.25663509125895900e-20, +-8.71542010021181989e-21, + 2.09436843736645117e-20, +-8.13409121644931251e-21, + 6.83323267425724148e-21, + 3.33637664039709442e-20, + 6.34712059288957595e-21, +-1.14988009569592451e-20, + 1.36138013999968239e-20, +-9.56477717849147059e-21, + 3.14341243420624856e-21, +-8.49912790354301829e-21, + 2.69548166745944171e-20, + 1.17001470960855416e-20, + 3.37676024328451966e-21, + 7.94615448295149789e-21, + 7.00241400419300084e-21, +-7.71679004894446344e-21, + 1.13095026722742940e-20, +-4.65448850538306328e-23, + 1.51969231416352782e-20, +-1.44084998193878814e-20, +-1.42370221980477678e-20, + 2.29776928896970900e-21, + 1.00063791230819843e-20, +-5.90677731471131637e-13, +-7.06485720922961443e-14, +-9.15127107905885808e-15, +-1.29764750753715431e-15, +-2.03182196506886691e-16, +-3.52727099072275201e-17, +-6.91103795441394040e-18, +-1.07261146125912024e-18, +-9.56164632897497121e-19, + 3.78713198434212454e-20, + 2.04666229700017779e-19, +-1.62482181297220293e-19, + 3.10823130553210287e-20, + 4.15247479630471958e-20, + 1.29539353775619167e-20, + 3.14039497501806598e-20, + 1.47678066843811081e-20, +-3.95001482803948142e-21, + 3.07092045482106084e-21, + 4.98600020826472221e-23, + 3.34679979522117281e-20, + 1.43688347658486846e-20, +-2.62718936478363967e-20, + 2.38493718026218350e-20, + 2.62288375631921844e-20, + 7.40981650646035288e-21, + 4.11817961425209183e-21, + 1.13554547567346212e-20, + 9.36691272227680513e-21, + 3.27542822612200241e-21, + 6.29889557398685252e-22, + 1.44159260499286391e-20, + 7.39224217685396207e-23, + 5.83565521000742510e-21, + 6.83229645034328973e-21, + 1.83886160527938801e-20, +-6.00899178853651812e-21, +-4.61172124033549850e-21, +-1.55994118189892239e-21, +-5.86235196816978105e-22, + 2.65040708581870271e-14, + 3.06016083439676463e-15, + 3.78662338032183461e-16, + 5.09034735316195267e-17, + 7.53704288878676228e-18, + 1.16079417808501141e-18, + 1.97155379950272911e-19, + 3.09040041661439643e-20, +-3.06355810145166001e-20, + 1.98644296790512615e-20, + 4.69390247948293207e-21, + 1.98536078573786682e-21, + 2.32600902654206391e-20, +-1.79940944040747424e-20, +-9.03066711286754989e-21, +-3.64021529998742361e-22, +-9.92257453462172962e-21, + 7.81197602711183495e-21, + 1.58979577539479859e-20, + 3.59932856457629293e-20, + 1.06781057665384660e-20, +-1.28543350803104161e-21, +-1.38938713473822704e-20, + 6.35435253280566276e-21, +-7.90932129609413784e-21, +-8.76663981774598251e-22, + 2.67704290993977976e-21, + 1.47260228279436553e-20, + 4.02385366891816959e-21, + 4.00967421416849038e-21, + 4.22896867803567390e-21, + 4.42862422003925937e-21, +-6.96131350913607810e-22, + 1.57122237330734079e-21, + 6.75878399562127727e-21, + 2.04315968574871486e-20, +-1.06854490262877223e-20, +-2.93219171983385903e-21, + 1.35084854597674490e-20, + 1.50041986009383968e-20, +-1.14536400478896611e-15, +-1.32091238081646366e-16, +-1.72139205630289700e-17, +-2.40536203101226766e-18, +-5.32211653256994595e-19, +-3.29646511002492587e-20, +-8.32292388724989029e-20, +-8.99244769938908567e-21, +-1.45298360047799182e-20, +-6.51222189514611876e-21, + 1.56543757130928897e-21, + 3.06167814836513628e-20, +-7.81914216109339557e-22, +-1.40222054873550962e-20, +-1.15142555167593277e-20, +-8.79676774734194593e-21, +-5.76300795301787229e-21, +-2.28586523475672064e-20, +-7.87874953065492759e-21, + 1.68467973576969174e-21, + 7.87812461174471949e-21, +-4.16112202291062435e-21, +-1.03835731161431163e-20, +-6.58873303554580387e-22, +-1.94380652232068149e-20, +-7.45741292271847632e-21, +-6.42227656689121582e-21, +-9.20413176025705423e-21, +-9.52808028049476535e-21, +-5.04363997661054598e-21, +-1.23102062184838243e-20, +-1.16231483287076333e-20, +-1.53444760670878025e-20, +-8.47901167483211121e-21, +-2.18028568930785960e-21, +-4.29901365218695980e-21, +-1.86018708463890548e-20, +-4.62033564945071008e-21, +-1.46571632525985130e-20, +-3.66377356620238123e-22, +// root 3 + 3.23183075424290922e-01, + 2.82663598851170206e-01, + 2.47128321020613329e-01, + 2.16472704692803358e-01, + 1.90271494528918395e-01, + 1.67959693053144565e-01, + 1.48955069293634640e-01, + 1.32738532471654042e-01, + 1.18902452608504100e-01, + 1.07145509827084387e-01, + 9.72112977159943492e-02, + 8.88337993081849547e-02, + 8.17401142390175584e-02, + 7.56825301068761447e-02, + 7.04578517428622042e-02, + 6.59075284325073285e-02, + 6.19093868106705830e-02, + 5.83687371002485425e-02, + 5.52112991496998690e-02, + 5.23780375519878605e-02, + 4.98214514878337067e-02, + 4.75028901394774078e-02, + 4.53905832049666391e-02, + 4.34581747973777494e-02, + 4.16836169277893451e-02, + 4.00483237353935415e-02, + 3.85365174820380546e-02, + 3.71347174250771031e-02, + 3.58313364261761760e-02, + 3.46163596980786706e-02, + 3.34810868149689883e-02, + 3.24179229118248952e-02, + 3.14202084669065809e-02, + 3.04820795971722826e-02, + 2.95983526697760901e-02, + 2.87644284306883928e-02, + 2.79762119043086149e-02, + 2.72300451178337892e-02, + 2.65226503168724918e-02, + 2.58510818117838569e-02, +-2.14730974097248513e-02, +-1.90252822407828009e-02, +-1.65170496165543586e-02, +-1.41620124902185150e-02, +-1.20694552494601624e-02, +-1.02732151019031132e-02, +-8.75882228534929572e-03, +-7.47893338789693950e-03, +-6.37230874470726388e-03, +-5.39752420406260525e-03, +-4.55062078436022695e-03, +-3.84137637653741070e-03, +-3.26534528033238167e-03, +-2.80280605185737964e-03, +-2.43006337325378519e-03, +-2.12655856522731002e-03, +-1.87646531449795861e-03, +-1.66801744858585156e-03, +-1.49246967955814691e-03, +-1.34324739516126753e-03, +-1.21533812243067633e-03, +-1.10486778217308893e-03, +-1.00880418580542104e-03, +-9.24746685511782483e-04, +-8.50774654424430875e-04, +-7.85336741085949745e-04, +-7.27168826962269212e-04, +-6.75232489406599667e-04, +-6.28668315009582959e-04, +-5.86760104208345267e-04, +-5.48907157141460171e-04, +-5.14602620862854147e-04, +-4.83416428782985322e-04, +-4.54981752012458679e-04, +-4.28984160026598131e-04, +-4.05152888677792148e-04, +-3.83253759983082066e-04, +-3.63083405995316840e-04, +-3.44464529290428761e-04, +-3.27241992774636946e-04, + 2.90315198117664067e-04, + 3.15744979435661390e-04, + 3.07427896191993265e-04, + 2.79409017352395610e-04, + 2.43172314618661766e-04, + 2.06176982224445170e-04, + 1.73315938139896391e-04, + 1.47853931262533297e-04, + 1.29607335314238243e-04, + 1.14094056083502231e-04, + 9.73846671826639486e-05, + 8.00139924910382418e-05, + 6.43817748369146471e-05, + 5.16990007160219759e-05, + 4.18634778529623883e-05, + 3.42993251490031519e-05, + 2.84362311890121991e-05, + 2.38334189766917504e-05, + 2.01721511472110117e-05, + 1.72239454768222180e-05, + 1.48234005473114343e-05, + 1.28490371891163224e-05, + 1.12103195404016217e-05, + 9.83884431580029500e-06, + 8.68227814586852609e-06, + 7.70011999717569474e-06, + 6.86069392689652805e-06, + 6.13898457245969955e-06, + 5.51505874071319727e-06, + 4.97290042762492167e-06, + 4.49954132054444127e-06, + 4.08440506998580054e-06, + 3.71880797454535686e-06, + 3.39557532491262210e-06, + 3.10874411841355085e-06, + 2.85333087009892776e-06, + 2.62514891300674572e-06, + 2.42066362980057283e-06, + 2.23687698102625925e-06, + 2.07123482519826477e-06, + 3.87192178401382313e-06, + 5.13485393241140531e-07, +-1.70765163863359746e-06, +-2.81110034944063963e-06, +-3.13397300745670153e-06, +-2.97020947454441075e-06, +-2.46080029022958723e-06, +-1.78222921622994716e-06, +-1.32601898084249446e-06, +-1.31789778890804064e-06, +-1.45418028248939153e-06, +-1.40489410472272799e-06, +-1.18522337469446302e-06, +-9.31292447975291741e-07, +-7.16075202462041070e-07, +-5.52163588018361591e-07, +-4.30729131563280474e-07, +-3.40508494794325805e-07, +-2.72640147383499185e-07, +-2.20855141020414960e-07, +-1.80799923760077249e-07, +-1.49427594658961500e-07, +-1.24574484529614811e-07, +-1.04680404531100251e-07, +-8.86039015904938276e-08, +-7.54986299009694617e-08, +-6.47292890052681607e-08, +-5.58135637276209380e-08, +-4.83814313285219304e-08, +-4.21462510565990819e-08, +-3.68839644921549180e-08, +-3.24179553302294414e-08, +-2.86079080659676548e-08, +-2.53415257558394747e-08, +-2.25283143163232456e-08, +-2.00948759858529409e-08, +-1.79813156041246058e-08, +-1.61384748296131365e-08, +-1.45257877165769483e-08, +-1.31096063315830973e-08, +-2.35308237306334062e-07, +-1.77334610699726143e-07, +-1.01027244795741787e-07, +-4.06756334906930207e-08, +-2.76034548910140501e-09, + 2.20487626319864372e-08, + 4.01853979955729294e-08, + 4.02233843300300219e-08, + 1.38956092192561661e-08, +-9.01273682456845518e-09, +-4.26704340394120049e-09, + 9.88006694670062515e-09, + 1.60261636771153187e-08, + 1.50175102813738980e-08, + 1.18040688939750048e-08, + 8.79093758927319037e-09, + 6.50487105956542026e-09, + 4.86129134872542292e-09, + 3.68430585368941701e-09, + 2.83183080142675129e-09, + 2.20518818960094606e-09, + 1.73776267787397269e-09, + 1.38433151253685708e-09, + 1.11374733626243853e-09, + 9.04215602734701549e-10, + 7.40253807364922705e-10, + 6.10708030244844185e-10, + 5.07437979769008940e-10, + 4.24431185674595058e-10, + 3.57197277447004697e-10, + 3.02347897828769177e-10, + 2.57301569151218232e-10, + 2.20073853351013334e-10, + 1.89126397708264951e-10, + 1.63257228433604500e-10, + 1.41520232951866817e-10, + 1.23165476637984036e-10, + 1.07594614651816644e-10, + 9.43272744522437734e-11, + 8.29755191795566631e-11, + 1.53544032574063635e-09, + 3.77480679954105159e-09, + 3.57558334709205111e-09, + 2.41795842498746708e-09, + 1.46518115619275347e-09, + 1.08581021807080692e-09, + 6.18583420635613836e-10, +-7.33435215516559080e-10, +-1.60374202559685228e-09, +-4.42923721745414872e-10, + 7.06792163712427123e-10, + 5.57377094695793346e-10, + 8.15754726675550860e-11, +-1.37976677035335539e-10, +-1.65218685152712672e-10, +-1.32916844689816782e-10, +-9.67444366786473138e-11, +-6.91156178929882968e-11, +-4.97365850964403743e-11, +-3.63015478812097960e-11, +-2.68949830889350452e-11, +-2.02090418971306914e-11, +-1.53833274620273347e-11, +-1.18497150023222208e-11, +-9.22764655238330787e-12, +-7.25808335891628526e-12, +-5.76190606760921775e-12, +-4.61344870938045792e-12, +-3.72336299303966825e-12, +-3.02731013957409524e-12, +-2.47842419807365454e-12, +-2.04220357492679206e-12, +-1.69297644735430006e-12, +-1.41146825416477203e-12, +-1.18308411174157130e-12, +-9.96667925391172668e-13, +-8.43635583581749649e-13, +-7.17328850900048516e-13, +-6.12539891523660822e-13, +-5.25178651524330713e-13, + 1.56433469134498355e-10, + 3.32633033570273700e-11, +-3.86311344819449791e-11, +-4.97410581581276176e-11, +-2.68612466775611626e-11, +-9.66409220868577522e-12, +-3.71095125405539784e-11, +-6.50998226160748669e-11, + 8.30646220078947259e-12, + 6.87559014530935661e-11, + 1.76778203251571854e-11, +-2.07239942273711310e-11, +-1.52353137872773157e-11, +-3.97215261437165859e-12, + 7.46135949619350075e-13, + 1.60367541438699514e-12, + 1.34656864899670304e-12, + 9.63868703286064919e-13, + 6.67926366034386836e-13, + 4.64744267548851696e-13, + 3.27920473786416082e-13, + 2.35004799431450707e-13, + 1.70942998064770483e-13, + 1.26072644323359579e-13, + 9.41722437545012270e-14, + 7.11671443666233813e-14, + 5.43657356919498075e-14, + 4.19466633672394413e-14, + 3.26673248822080753e-14, + 2.56586634623603875e-14, + 2.03205432377192221e-14, + 1.62093458745732765e-14, + 1.30221338893424925e-14, + 1.05340739284222850e-14, + 8.57378248561489479e-15, + 7.02048937533513565e-15, + 5.77998167318760567e-15, + 4.78149253017112351e-15, + 3.97796016822729191e-15, + 3.32561860339946319e-15, +-4.37210636927152744e-12, +-3.77422671238360531e-12, +-1.36106977236344101e-12, + 4.02429893906259054e-13, + 1.00127786316028130e-12, +-6.04637509741186872e-14, +-1.67954374576663975e-12, + 5.75223223217947302e-13, + 3.78244150906445623e-12, +-2.61522906792222134e-13, +-2.30294710806929222e-12, +-3.55624736252963695e-13, + 4.66770311770047863e-13, + 2.84253370008458671e-13, + 7.67189530399649614e-14, + 6.90673711554458265e-16, +-1.39794585168514625e-14, +-1.24116849510825637e-14, +-8.76702116430132089e-15, +-5.91482425232386132e-15, +-3.99130969533877930e-15, +-2.73008662267354543e-15, +-1.90104411690548629e-15, +-1.34260935023669619e-15, +-9.58017498278371808e-16, +-6.96341522891457544e-16, +-5.12178003298350051e-16, +-3.77211543313676486e-16, +-2.83853534976194369e-16, +-2.14722169776916837e-16, +-1.62950995253358194e-16, +-1.27722541680305893e-16, +-1.01177910685838783e-16, +-7.86581791262068292e-17, +-6.11685303456206178e-17, +-4.77475062293501160e-17, +-3.74651706454157532e-17, +-3.21133326599545188e-17, +-2.57494596067447570e-17, +-1.87550046986121457e-17, +-5.47639944281003285e-14, + 6.82610353105482858e-14, + 7.01783915548593056e-14, + 3.89483820448878091e-14, +-5.06163813471993415e-15, +-5.79211853088649463e-14, +-1.40052628207635126e-14, + 1.45383155702003585e-13, +-1.56542281866816431e-14, +-1.59064656139251545e-13, + 3.38103149636088651e-14, + 5.42333170164515510e-14, + 2.39204758815231138e-15, +-8.46681602816150889e-15, +-4.13828042761905586e-15, +-1.06298382526791104e-15, +-7.73010618325103615e-17, + 1.15806992033473381e-16, + 1.07723247959339590e-16, + 7.13483216916687721e-17, + 4.94626000011727532e-17, + 3.47356929935373814e-17, + 2.05645505319968757e-17, + 1.24462033877363016e-17, + 1.20958113318420397e-17, + 8.67057147041518766e-18, + 4.70832374644322279e-18, + 4.83902124263251547e-18, + 3.45849756559480790e-18, + 2.58170600571132605e-18, + 2.86957916420381174e-18, + 4.46200560911194749e-19, +-1.44867229410492327e-18, +-1.03595915499278497e-18, + 5.36157072947743887e-19, + 1.20594289028509576e-18, + 7.56054499791826071e-19, +-6.19831895613376402e-19, +-8.04120851678216479e-19, + 1.09817011283894398e-18, + 5.24925571874466395e-15, + 1.37590095893742463e-15, +-7.39003848524688088e-16, +-9.53123994523225943e-16, +-1.52739991628547147e-15, +-8.90626066560339021e-16, + 3.87827200478684765e-15, + 1.98370425928874318e-15, +-8.88396954392312909e-15, + 3.13814698165618948e-15, + 3.91106905332038186e-15, +-1.58844632811732120e-15, +-8.45427989501632765e-16, + 5.32023127063475209e-17, + 1.26251889605976807e-16, + 5.45292095297241728e-17, + 1.40559511978160585e-17, + 4.29980356392160470e-18, + 1.02872820066903516e-18, +-3.21555549254093555e-18, + 1.25676980316782627e-18, + 2.21227751688503918e-18, + 6.52639079885386647e-19, +-1.08598678030827456e-18, + 1.58030012215636609e-18, + 2.01104576050758868e-18, + 9.45783133374632266e-19, + 1.45560570436409086e-18, + 1.86168899487368665e-18, + 2.32289293153447366e-18, + 4.48290796442639239e-18, + 1.15119533563593523e-18, + 3.99086969993839914e-19, + 5.76444685561904260e-19, + 1.28173456921010985e-18, + 1.81168762828606850e-18, + 1.05769556038317411e-18, + 9.93398835374884055e-20, + 4.26555204600830816e-19, + 1.57443069683585028e-18, +-3.04419644801998700e-17, +-8.81500254479716951e-17, +-1.45567063944911478e-17, + 1.73917867115855401e-18, +-8.73960878705231529e-18, + 6.70808754649980420e-17, + 1.37854051847660173e-16, +-2.87412286857559373e-16, + 8.91762500879671849e-18, + 3.23140939183353530e-16, +-1.88917583786873811e-16, +-3.48698247992003631e-17, + 4.00584400725715686e-17, + 5.63466269053886955e-18, +-2.87831137268783440e-18, + 6.46326443200043005e-19, +-1.89649169839866460e-18, + 3.96649115925203500e-18, + 1.12110209180053427e-18, +-1.31495841394386409e-18, + 4.51730681888659350e-19, + 1.91715166378864780e-18, + 7.75373228052191132e-19, + 6.28323482660122539e-19, + 2.66691590473891732e-18, + 5.75372369423586116e-19, + 2.53456103536621226e-20, + 2.10476884905122993e-18, + 2.20813105317144456e-18, + 5.97838237077370817e-19, + 1.52364355633759766e-18, + 9.22280517498614463e-19, +-1.34435712862821925e-18, +-3.42094511728256891e-19, + 2.33008993514148783e-19, + 1.29533368204651884e-18, + 2.82644172928722999e-19, +-7.02372036383794050e-19, + 2.76780038246087294e-19, + 1.17917724802489027e-18, + 1.12048197560491902e-17, + 9.25368765238322824e-18, + 5.18529960168176858e-18, + 5.44343889366490118e-18, + 4.74279331774225130e-18, + 5.27546659113244613e-18, +-5.69229161435949261e-18, +-1.81162718988455381e-17, + 1.64579092425075052e-17, +-1.55491266953859936e-17, +-3.17413074609702510e-18, +-1.32811362918939719e-18, + 1.40036178030614478e-18, + 3.12778215227484123e-18, + 4.82303638321603277e-18, + 4.90397292697971850e-18, + 4.27329595896153194e-18, + 3.96404186054997260e-18, + 3.70894460983217419e-18, + 7.82038139116779944e-19, + 1.31831756445978023e-18, + 3.44028921320850725e-18, + 1.41976081509001381e-18, + 3.79241407750867750e-19, + 3.74702025582625385e-18, + 2.59747530312018467e-18, + 1.04672137495772444e-18, + 4.72786782760918572e-19, + 1.73573791840392832e-18, + 8.07933641387990680e-19, + 1.65523262914095846e-18, + 1.15217451019013949e-18, +-2.65194152529511553e-19, + 9.21589156834406223e-19, + 9.48560378993209464e-19, + 8.65811016703438713e-19, + 9.47117018520492430e-19, + 8.30625657417642192e-19, + 1.43875304311838065e-19, + 1.70258667109041680e-18, + 6.97885404971668283e-18, +-5.79794892840488219e-18, +-1.20823047929445396e-17, +-6.07243301945154212e-18, + 8.72230378517203820e-19, +-2.42586533077481646e-18, +-2.05660393365384260e-18, +-2.63781774235123474e-19, +-7.73055108654246415e-19, +-1.96219096277935734e-18, + 2.91222655501051145e-18, +-1.89951228887092540e-18, + 5.42485780833533693e-18, +-8.38957966518445468e-19, +-1.70536892997158226e-18, +-2.51443320123399456e-19, +-8.94876030939465128e-19, + 7.82033637405415044e-19, + 6.33244932986358369e-19, + 1.57965908278052217e-19, + 1.44920162374423584e-18, + 5.11529232611133486e-19, +-7.34390609980960975e-19, +-7.20205137756708246e-19, + 1.78634440044219746e-18, +-7.93787433794384383e-19, + 1.95144277098400572e-18, + 1.96787873504436870e-18, +-2.59565424260973211e-20, + 1.69580864007234593e-19, + 1.43354076243181699e-18, + 9.14328982237886638e-19, + 4.37765982220332472e-19, + 7.36895021406049909e-19, + 6.38349832545981883e-19, + 8.95143751861415700e-19, + 4.48743778848652538e-19, + 9.69997266348407744e-19, +-9.38144165331764378e-20, + 7.74730762596319003e-19, + 9.13126499025863810e-19, +-2.25282962701119206e-17, +-6.07280328228571962e-18, + 3.01769671793089434e-19, +-3.64224556662918105e-18, +-8.55642831853308525e-18, +-2.00669478687563287e-18, +-1.48591867459419991e-18, +-7.45375941110037329e-19, +-2.32294287737793862e-18, +-1.41422820542202263e-18, +-1.02206163420072624e-18, + 3.27571404008532935e-18, +-2.86529962581250793e-18, +-2.09255328100660548e-18, +-2.94955907011971778e-18, +-1.09388336654554969e-18, +-5.67448169177108429e-19, +-1.84031807717725200e-18, +-1.00299358628848958e-18, +-9.24516775222277725e-19, +-2.15469388103451773e-18, +-8.26948173061391200e-19, +-1.60791323367409159e-18, +-8.20206192758018645e-19, +-1.75956547877138957e-18, +-1.40093895657289307e-18, +-1.60515831943943371e-18, +-2.36904042974119561e-18, +-1.53424136997365479e-18, +-1.27022804901530939e-18, +-1.08807510833923440e-18, +-2.18337899624527874e-18, +-1.76880527964942949e-18, +-1.21965420791945891e-18, +-1.96251094501855905e-18, +-1.15731895626298315e-18, +-1.53275492737236468e-18, +-1.70889677135502251e-18, +-7.33561900335494036e-19, + 1.42221618784944770e-01, + 7.14550895722971258e-02, + 4.21974892145776520e-02, + 2.83319650833795331e-02, + 2.10050244205597959e-02, + 1.67936883433150511e-02, + 1.42162710742098873e-02, + 1.25639069078443810e-02, + 1.14610921702270711e-02, + 1.06870873116782419e-02, + 1.01054023905850152e-02, + 9.63594254309145873e-03, + 9.23649554610975893e-03, + 8.88609137222277912e-03, + 8.57360885020244483e-03, + 8.29213889528787780e-03, + 8.03673909556667891e-03, + 7.80358921279070833e-03, + 7.58962894954629246e-03, + 7.39236073570581024e-03, + 7.20972048254406740e-03, + 7.03998484916253282e-03, + 6.88170205656056695e-03, + 6.73363920674717540e-03, + 6.59474159207474979e-03, + 6.46410088762384722e-03, + 6.34093002024177163e-03, + 6.22454311823094058e-03, + 6.11433937055247314e-03, + 6.00978992531816299e-03, + 5.91042717349331455e-03, + 5.81583592097321359e-03, + 5.72564606791910354e-03, + 5.63952650033010608e-03, + 5.55717996351950787e-03, + 5.47833873623339122e-03, + 5.40276096169747290e-03, + 5.33022752084673888e-03, + 5.26053935551587960e-03, + 5.19351516700853645e-03, +-5.35165649536975332e-02, +-2.09284395462391061e-02, +-9.45703259758133227e-03, +-4.80635211448494047e-03, +-2.67927115766216197e-03, +-1.60239876943137332e-03, +-1.00926971272586284e-03, +-6.61534689531638248e-04, +-4.52349219639591727e-04, +-3.28609003139970865e-04, +-2.57121216723997981e-04, +-2.14412868608895591e-04, +-1.86046457107522529e-04, +-1.64900870228696338e-04, +-1.47928033777848219e-04, +-1.33794321293429131e-04, +-1.21802192062706841e-04, +-1.11505780443971300e-04, +-1.02583684915481159e-04, +-9.47913946418169274e-05, +-8.79381370182277615e-05, +-8.18727444700657588e-05, +-7.64739789598651014e-05, +-7.16435823898359605e-05, +-6.73011659780203207e-05, +-6.33803922164388446e-05, +-5.98260851488329167e-05, +-5.65920177278658092e-05, +-5.36391995367794868e-05, +-5.09345386980020629e-05, +-4.84497866831069184e-05, +-4.61606991834821398e-05, +-4.40463635528461103e-05, +-4.20886557991302925e-05, +-4.02717991607927863e-05, +-3.85820029528343315e-05, +-3.70071652985314679e-05, +-3.55366270525993248e-05, +-3.41609670064713691e-05, +-3.28718305856418405e-05, + 6.71552139047162759e-03, + 2.22762534807031346e-03, + 8.56219775183541349e-04, + 3.73774197268531591e-04, + 1.81769608736457726e-04, + 9.68063293149495988e-05, + 5.54816866879269386e-05, + 3.32586547374818408e-05, + 1.99401323257972064e-05, + 1.15839270419637874e-05, + 6.71833648328268963e-06, + 4.21784427678981479e-06, + 2.99599560666321296e-06, + 2.34115896831468073e-06, + 1.92439079548117857e-06, + 1.62109646511794046e-06, + 1.38484902799470756e-06, + 1.19502853879753718e-06, + 1.03990879791485808e-06, + 9.11613617737361384e-07, + 8.04437139216282260e-07, + 7.14107121778796892e-07, + 6.37365139535754260e-07, + 5.71691732254636145e-07, + 5.15115820115103043e-07, + 4.66078964943043181e-07, + 4.23337022560932033e-07, + 3.85887889506483181e-07, + 3.52917760229431937e-07, + 3.23760697373384322e-07, + 2.97867897195361533e-07, + 2.74784097044885350e-07, + 2.54129300616545980e-07, + 2.35584502243812103e-07, + 2.18880446641321191e-07, + 2.03788712812296695e-07, + 1.90114592124065850e-07, + 1.77691362088335890e-07, + 1.66375653764262918e-07, + 1.56043681964448309e-07, +-6.55826564387056057e-04, +-1.89087560196078003e-04, +-6.30536059562157678e-05, +-2.39246415987454423e-05, +-1.01518372412925591e-05, +-4.74464110200314978e-06, +-2.43444383184776458e-06, +-1.39309839384610931e-06, +-8.73093265180543673e-07, +-5.35585889035109684e-07, +-2.89964128072623893e-07, +-1.41606952108011382e-07, +-7.12246093005336708e-08, +-4.19020157723950791e-08, +-2.90110950174039311e-08, +-2.20795756504872171e-08, +-1.75444913563422139e-08, +-1.42393532624234937e-08, +-1.17145350813108169e-08, +-9.74136420006517816e-09, +-8.17645687170331421e-09, +-6.92060409115821011e-09, +-5.90227389021516156e-09, +-5.06877490513542011e-09, +-4.38070226628274003e-09, +-3.80820837779030347e-09, +-3.32842367350468028e-09, +-2.92363977957345842e-09, +-2.58001086397142044e-09, +-2.28661325740502592e-09, +-2.03475634875311889e-09, +-1.81747201061258328e-09, +-1.62913239063096865e-09, +-1.46516105221753976e-09, +-1.32181268511820315e-09, +-1.19600370230993737e-09, +-1.08518092234485969e-09, +-9.87219026422217048e-10, +-9.00339913064518909e-10, +-8.23048857688983467e-10, + 5.37807668378949107e-05, + 1.37310667291829189e-05, + 4.04371944665627981e-06, + 1.35616662358339519e-06, + 5.10454571870425224e-07, + 2.11583546294446590e-07, + 9.35143716901783226e-08, + 4.35796271497908820e-08, + 2.47430430273513845e-08, + 1.81699145979307936e-08, + 1.23312927580442979e-08, + 6.44320695452289536e-09, + 2.76052821211845449e-09, + 1.14861760682137322e-09, + 5.58799314000547985e-10, + 3.38929727311622916e-10, + 2.38180557996203575e-10, + 1.79062221628129016e-10, + 1.38722675449365260e-10, + 1.09326139713246344e-10, + 8.72666135097413695e-11, + 7.04234744198521957e-11, + 5.73904967108763725e-11, + 4.71881675043292689e-11, + 3.91175401497484917e-11, + 3.26716350765890688e-11, + 2.74776723919654418e-11, + 2.32581723344401824e-11, + 1.98042577590768881e-11, + 1.69570517912462252e-11, + 1.45945327176206959e-11, + 1.26221387890559525e-11, + 1.09659717115134265e-11, + 9.56782275183319288e-12, + 8.38150491405451167e-12, + 7.37011200029917880e-12, + 6.50396218968328763e-12, + 5.75903698760677087e-12, + 5.11578584829488388e-12, + 4.55820882889312146e-12, +-3.85213441564734910e-06, +-8.83157550703250092e-07, +-2.32722484775323528e-07, +-6.97880051279149924e-08, +-2.35491200689279577e-08, +-8.88991342637606439e-09, +-3.71689222737768875e-09, +-1.53400713266212777e-09, +-4.96963089943650410e-10, +-2.62013767579508641e-10, +-3.17701858975093352e-10, +-2.48351279434344781e-10, +-1.23478178649209619e-10, +-4.72432845035593477e-11, +-1.68802619472650066e-11, +-6.93217703134827228e-12, +-3.68281981456983303e-12, +-2.38779127734368600e-12, +-1.70291775807923550e-12, +-1.26429452502466077e-12, +-9.58372444683231672e-13, +-7.37155408032380183e-13, +-5.73985870384400241e-13, +-4.51854523939113324e-13, +-3.59280081387009722e-13, +-2.88306504898401130e-13, +-2.33321446429679448e-13, +-1.90309463031318738e-13, +-1.56361479245337301e-13, +-1.29342954460087881e-13, +-1.07671287190606830e-13, +-9.01635675207596470e-14, +-7.59224786747137564e-14, +-6.42650075300487404e-14, +-5.46643078010705771e-14, +-4.67136963496310553e-14, +-4.00943752350300980e-14, +-3.45556488501034346e-14, +-2.98988737805719699e-14, +-2.59651588717918418e-14, + 2.46918298782094700e-07, + 5.14055298228859861e-08, + 1.22504705485644007e-08, + 3.31735218660075459e-09, + 1.00871019450454411e-09, + 3.39491759542461035e-10, + 1.30274836949365690e-10, + 6.26032357188862516e-11, + 2.46469765202091594e-11, +-1.01115541720837271e-12, +-4.45193087621042221e-13, + 5.22994385300254287e-12, + 4.43117197801852657e-12, + 2.02369367563400924e-12, + 6.96975154820168486e-13, + 2.20466725431995273e-13, + 7.86542658515884424e-14, + 3.69759574709672897e-14, + 2.21792325298279345e-14, + 1.50510138106114635e-14, + 1.07472217469988150e-14, + 7.86389707104190814e-15, + 5.84779298687456520e-15, + 4.40720595919271527e-15, + 3.36156209292452565e-15, + 2.59175130472650875e-15, + 2.01820392693996518e-15, + 1.58639259372974368e-15, + 1.25715635695192662e-15, + 1.00467187830898403e-15, + 8.09375069715560768e-16, + 6.55959956473806762e-16, + 5.35523832952582984e-16, + 4.39609637762853112e-16, + 3.63542804605032357e-16, + 3.02157951379902255e-16, + 2.52137569277897913e-16, + 2.11193125405297767e-16, + 1.77744687843801310e-16, + 1.50961653546736148e-16, +-1.43970828386470923e-08, +-2.74732860455294419e-09, +-5.97335569516562916e-10, +-1.47308702939310832e-10, +-4.09198050807259549e-11, +-1.25630630162637333e-11, +-3.95160344147577112e-12, +-1.51115437341364770e-12, +-1.27104178354408771e-12, +-4.12550553734569063e-13, + 2.70303480952509379e-13, + 7.39226805302906391e-14, +-8.86705774672846407e-14, +-6.94458540567922788e-14, +-2.83581117003643474e-14, +-8.85666519673787288e-15, +-2.53765868720433231e-15, +-8.08088986599359444e-16, +-3.41458238787546873e-16, +-1.90931379752609696e-16, +-1.23449362474932496e-16, +-8.47230719685131994e-17, +-6.00655126749715327e-17, +-4.33746439521780598e-17, +-3.15071794111773788e-17, +-2.33955775354203384e-17, +-1.73040920943573734e-17, +-1.29251743370710696e-17, +-1.02780049732900258e-17, +-8.01740574128577875e-18, +-5.74068175962924822e-18, +-4.64151328413196410e-18, +-3.77005298482855109e-18, +-3.13461580830557837e-18, +-1.83259207922337963e-18, +-1.45188732184760699e-18, +-1.25750643194455501e-18, +-1.29549942780723943e-18, +-1.17817322688309386e-18, +-5.10474970334684085e-19, + 7.72567408096547388e-10, + 1.36222669039240057e-10, + 2.72297936763522825e-11, + 6.15291223211940980e-12, + 1.56385271350577427e-12, + 4.50854531561171455e-13, + 1.44061679608614823e-13, + 2.40575117919710971e-14, + 9.77053420897748072e-15, + 3.56029412063606060e-14, + 3.17489743178874649e-15, +-8.87257736696166986e-15, +-1.24635546253782631e-15, + 1.47112783234158026e-15, + 9.42714937467858639e-16, + 3.41207723848541637e-16, + 9.73424152072809599e-17, + 2.60215661791072585e-17, + 7.75959481449092646e-18, + 2.92155453764643900e-18, + 1.89437629730988914e-18, + 1.40720277571348562e-18, + 8.77130995542065001e-19, + 6.24040477704102586e-19, + 8.08043635735700252e-19, + 6.03384896941651730e-19, + 3.70558762923018179e-19, + 3.28127775046470764e-19, +-3.09937636705550829e-19, + 2.39587505556950306e-21, + 4.25670727408564423e-19, + 2.39663540055316896e-19, + 1.80315827767516724e-19, +-4.12751449739251900e-20, + 2.43433918099097988e-19, + 3.70413729245579809e-19, + 2.47382181096624652e-19, +-1.47086782679248077e-20, +-2.85078283560577770e-19, + 1.11604711823366165e-19, +-3.84884160485160019e-11, +-6.31517933784329467e-12, +-1.16852681407045576e-12, +-2.43656793978672082e-13, +-5.68557698450674545e-14, +-1.46571619560879415e-14, +-4.79283459386373045e-15, +-2.01828216896815508e-15, + 9.90068373152075610e-16, +-2.51090864434782094e-16, +-9.17511756542339893e-16, + 1.36333136483265964e-16, + 1.68035433399861646e-16, + 6.77784489868574870e-18, +-2.17865034892697978e-17, +-1.09481089130388209e-17, +-3.81888255233356384e-18, +-3.76622435058077368e-19, + 1.19247259525859966e-19, +-1.08121384846469979e-19, + 1.64378177152682409e-19, + 3.13440037665357299e-19, + 3.70241489556945440e-19, +-1.55759148866479277e-20, + 1.55626361531822031e-19, + 2.14418699470929394e-19, + 2.67614047778214998e-19, + 3.74997544256471796e-19, +-1.48209982009559406e-19, +-5.60487087666302355e-20, + 5.35372608362474994e-19, + 6.19433044741366022e-20, + 2.21766339205386200e-19, + 1.99963469357579706e-19, + 4.20761840735798256e-19, + 3.39606561556213323e-19, + 2.18718223541422600e-19, + 1.41355154214779919e-19, +-2.94930591558782842e-19, + 3.00640447724395005e-19, + 1.79223581427424552e-12, + 2.75373772018856244e-13, + 4.74533383324412587e-14, + 9.18268195731803858e-15, + 1.99330930534518519e-15, + 4.75162469621968549e-16, + 1.00960483347036320e-16, + 7.53459745354242123e-17, + 3.66536618039446559e-17, +-6.03709824478022483e-17, + 2.68070754088750639e-17, + 1.34036258323477071e-17, +-5.42861521368412457e-18, +-1.80535468437115127e-18, +-2.68754592386327791e-21, + 4.65563154350933882e-20, + 9.86179328850614910e-20, + 2.92203747052047426e-19, + 2.94747602726569171e-19, +-1.01156827546933500e-19, + 1.59249273418725140e-19, + 3.92117883594156930e-19, + 1.49606230203962046e-19, + 2.42654817891725163e-19, + 3.06339846590337803e-19, + 2.84064174522493930e-19, + 3.27588810126118603e-19, + 2.74270613116723208e-19, +-4.25341942844191359e-20, +-9.48871296929000369e-20, + 1.17209908458611604e-19, +-1.89415470801735071e-20, + 1.11856390907902152e-19, + 2.01942370166903766e-20, + 1.85762727042880073e-19, + 3.12505347676654692e-19, + 2.98334333685083729e-19, +-2.07755748830058710e-20, +-1.81409226081428256e-19, +-1.05285616304827080e-19, +-7.84278249929831078e-14, +-1.13497352469837877e-14, +-1.83084905783782883e-15, +-3.30354176402661172e-16, +-6.74550607926811911e-17, +-1.60259072778410125e-17, +-4.17073175845558278e-18, + 7.24175587388092360e-19, +-4.00624042624237336e-18, + 1.29223102533693907e-18, + 1.13252395590756627e-18, +-9.39751140846605486e-19, +-4.42136752874662786e-19, + 5.76291369078225372e-19, +-4.60091297260090028e-19, + 1.19240077278237664e-19, + 6.85682347646891323e-20, + 3.18025355391111866e-19, + 2.41769532501982473e-19, +-1.69187096059449145e-22, + 1.86075721098804312e-19, + 2.24644672632735827e-19, + 2.51184854510575038e-19, + 3.04012021714346041e-19, + 2.99254267260449951e-19, + 2.36589456946134256e-19, + 8.14430786919722217e-20, + 1.13162376781249563e-19, +-8.01695259453247872e-20, +-1.15704318509373956e-19, + 3.21634805110197499e-19, + 2.25849637686310110e-19, + 7.25833713602021448e-20, + 7.61460256426336370e-20, + 1.54648145343462328e-19, + 3.63398621181978917e-19, + 1.71187966192755566e-19, + 6.71327001433916746e-22, +-1.60316904277374734e-19, + 1.04468092670089290e-19, + 3.21987293645387525e-15, + 4.37630076489255606e-16, + 6.41417692461604216e-17, + 1.03120210290993247e-17, + 5.64287182960706236e-19, + 7.93196158281815231e-20, +-2.03787523511841270e-19, +-1.99168597393447969e-19, +-1.09240015478296117e-19, + 3.32569107676565476e-19, +-2.39673740247063193e-19, + 1.09789171132555234e-19, +-5.49436390576669382e-20, + 4.60235812087386262e-20, + 6.48009489980356444e-20, +-2.13151865919471999e-19, + 6.76960920745138585e-20, +-1.14630238441661502e-19, + 8.65279315832404004e-20, + 6.57481947760215916e-20, + 8.88400365756853181e-20, + 1.17873662541166196e-19, + 4.77573645671402990e-20, + 9.35013539646624063e-20, + 1.19411336037123813e-19, + 8.11288836417289658e-20, + 2.18133820375406251e-19, + 2.62513341489541354e-19, + 1.32676312238914240e-20, +-1.38941115931230829e-20, + 1.05212668639694868e-19, + 7.79211602450983983e-20, + 2.16285822952098315e-19, + 1.22541799038050303e-19, + 3.29288895428157394e-19, + 1.70842451587214673e-19, + 1.42966793413868120e-19, +-7.82040286019663622e-20, +-1.85304912401754579e-20, + 1.25485414496799329e-19, +-1.43902846604808347e-16, +-3.32706834944769299e-17, +-4.57076565982652301e-18, +-2.37433401593086351e-18, +-1.82882511883964316e-18, +-9.35247217178985483e-19, +-4.85102622909354216e-19, +-4.31233790227894074e-19, + 8.30900705165486774e-20, +-8.10400535351948554e-20, + 1.44100556992408564e-19, +-3.70802323985440955e-20, + 2.36706655656570541e-20, + 7.17261967914221018e-20, +-1.71301203413591931e-19, + 1.31996683927746505e-19, + 1.53487008055239363e-19, + 9.33794596153353300e-20, +-7.75972652725437932e-20, +-2.44452904138859684e-19, + 1.41417755492727122e-21, +-8.19678248014502834e-20, +-3.05833783093400263e-20, +-1.74377146313200797e-19, + 8.72410956526613384e-20, + 1.84564074650553217e-21, +-1.91734308192000300e-19, +-7.70476531807543536e-20, +-1.29416887518737141e-19, +-1.13791453849513329e-19, +-7.79367689820225197e-20, +-1.17782090381808613e-19, +-1.83742747944718784e-19, +-1.33803692193390539e-20, +-2.52144010695402698e-20, +-1.28146598487674534e-19, +-2.51560000070953091e-19, +-1.11396991747830491e-19, + 3.06211742983123932e-20, +-7.32051347994358543e-20, +// root 4 + 1.24505654349590031e-01, + 1.05607834241440934e-01, + 9.03772384078960767e-02, + 7.80253373767564457e-02, + 6.79251494122540544e-02, + 5.95893914773360442e-02, + 5.26438017341453804e-02, + 4.68073411703769302e-02, + 4.18787879012268091e-02, + 3.77175383828254329e-02, + 3.42134478334951003e-02, + 3.12629484887573944e-02, + 2.87659859509551627e-02, + 2.66340895382997968e-02, + 2.47954062190399067e-02, + 2.31940602953718406e-02, + 2.17870407316119660e-02, + 2.05410215084891878e-02, + 1.94298615790280751e-02, + 1.84327852262034728e-02, + 1.75330760340937294e-02, + 1.67171320742392111e-02, + 1.59737727985793873e-02, + 1.52937230905257019e-02, + 1.46692238612750412e-02, + 1.40937344079574527e-02, + 1.35617022572022596e-02, + 1.30683832901862425e-02, + 1.26096997819261109e-02, + 1.21821273464156020e-02, + 1.17826041453742703e-02, + 1.14084574074972585e-02, + 1.10573435258135150e-02, + 1.07271988930985208e-02, + 1.04161992945591472e-02, + 1.01227261689493236e-02, + 9.84533841978513583e-03, + 9.58274873982504355e-03, + 9.33380362761033859e-03, + 9.09746644131498305e-03, +-1.05016398306831769e-02, +-8.44577253058813142e-03, +-6.82589335737731479e-03, +-5.55848357095656363e-03, +-4.56688242030619303e-03, +-3.78822841121363892e-03, +-3.17192323076545633e-03, +-2.67489531001849704e-03, +-2.26074058721032877e-03, +-1.90605350318753439e-03, +-1.60342903949528570e-03, +-1.35235823251566439e-03, +-1.14924792879681848e-03, +-9.86381202791185687e-04, +-8.55187717480752744e-04, +-7.48375394843124792e-04, +-6.60362429166323414e-04, +-5.87005732461286754e-04, +-5.25227260873467757e-04, +-4.72713219437648918e-04, +-4.27699616806651625e-04, +-3.88823092347214511e-04, +-3.55016563448468483e-04, +-3.25435198395779355e-04, +-2.99403093615212702e-04, +-2.76374300278001486e-04, +-2.55903952052177362e-04, +-2.37626609098501215e-04, +-2.21239828188183723e-04, +-2.06491565652956656e-04, +-1.93170424272758441e-04, +-1.81098033266000285e-04, +-1.70123044368254971e-04, +-1.60116363813341212e-04, +-1.50967337773798114e-04, +-1.42580679415431528e-04, +-1.34873977241624084e-04, +-1.27775662368412914e-04, +-1.21223340603662097e-04, +-1.15162416379001935e-04, + 2.87381209525585486e-04, + 2.27910786725423988e-04, + 1.78624900463528180e-04, + 1.39636950442702679e-04, + 1.09404892909186665e-04, + 8.61689006650029658e-05, + 6.86887232793833701e-05, + 5.62489939767078068e-05, + 4.77271223989203506e-05, + 4.10554012660964399e-05, + 3.45858392992846484e-05, + 2.82479825546480078e-05, + 2.26787448028714689e-05, + 1.81984030812206340e-05, + 1.47333978711096067e-05, + 1.20707121281168290e-05, + 1.00072532095965711e-05, + 8.38741815677647907e-06, + 7.09894792481485809e-06, + 6.06142014951352159e-06, + 5.21662460063496855e-06, + 4.52181017117461097e-06, + 3.94511558793347481e-06, + 3.46246848146429074e-06, + 3.05545178500819433e-06, + 2.70981244724932142e-06, + 2.41440312705228706e-06, + 2.16042046279944155e-06, + 1.94084960083321535e-06, + 1.75005421767984879e-06, + 1.58347052796332452e-06, + 1.43737652170634549e-06, + 1.30871624624751607e-06, + 1.19496479072956468e-06, + 1.09402366592715613e-06, + 1.00413909273500964e-06, + 9.23837706808097631e-07, + 8.51875611945128987e-07, + 7.87197743460844818e-07, + 7.28905252457546461e-07, +-5.30475174140437244e-06, +-4.55427714699302295e-06, +-3.66226224868408448e-06, +-2.85762980687000309e-06, +-2.20499608377858119e-06, +-1.68395804420718865e-06, +-1.23715243037257190e-06, +-8.49426764227073510e-07, +-6.00350891649865755e-07, +-5.35246246012087391e-07, +-5.42025030434781285e-07, +-5.04382254762538120e-07, +-4.19765260041055122e-07, +-3.28345118307138882e-07, +-2.52122296617682605e-07, +-1.94338931225077398e-07, +-1.51585267970675941e-07, +-1.19831757217413508e-07, +-9.59471268506450921e-08, +-7.77229596815979074e-08, +-6.36267874982852890e-08, +-5.25862919208643577e-08, +-4.38400296594276433e-08, +-3.68389406013307028e-08, +-3.11813264624848839e-08, +-2.65693427022723673e-08, +-2.27794155311161393e-08, +-1.96418094491532957e-08, +-1.70263067175463800e-08, +-1.48320332364499378e-08, +-1.29801387681284405e-08, +-1.14084688144346930e-08, +-1.00676438006681636e-08, +-8.91814438532353181e-09, +-7.92812405117891494e-09, +-7.07175279007350526e-09, +-6.32795240429878174e-09, +-5.67942317601998111e-09, +-5.11188921333371634e-09, +-4.61350919605392401e-09, + 3.35930000050524673e-08, + 5.50277984333310344e-08, + 5.43361726273564276e-08, + 4.56714526496268145e-08, + 3.61483279395226210e-08, + 2.96442347945806429e-08, + 2.64547284220121302e-08, + 2.10497302125577100e-08, + 9.41856414272647253e-09, + 9.54930138715122966e-11, + 3.67537914757429256e-10, + 4.23813085470384112e-09, + 5.87319461253163313e-09, + 5.34314016006749226e-09, + 4.16659694008376039e-09, + 3.09610834301433303e-09, + 2.28961088063085147e-09, + 1.71084781373001826e-09, + 1.29658540216414679e-09, + 9.96574479710738976e-10, + 7.76046115929617507e-10, + 6.11550364663317116e-10, + 4.87171473558632032e-10, + 3.91947971203821878e-10, + 3.18209933396884010e-10, + 2.60508795830437607e-10, + 2.14919276305383154e-10, + 1.78576664446088635e-10, + 1.49365062553634417e-10, + 1.25704225772789577e-10, + 1.06401729279067667e-10, + 9.05491088911150457e-11, + 7.74479978648990810e-11, + 6.65570244791347944e-11, + 5.74531921744230006e-11, + 4.98035472955348607e-11, + 4.33441734526278941e-11, + 3.78645050472988419e-11, + 3.31954861671634284e-11, + 2.92005959292508754e-11, + 1.98268970045024331e-09, + 3.58170419508506676e-10, +-3.15535873521529175e-10, +-4.97016780251327593e-10, +-4.23406882712071023e-10, +-2.20842547543438676e-10, +-1.48713099402455455e-10, +-4.40502103262312217e-10, +-6.36458822289793005e-10, +-2.21296665497235438e-10, + 1.80350586487250525e-10, + 1.56040810121879144e-10, + 1.36089718401013152e-11, +-5.28191221061379698e-11, +-5.91385723248994114e-11, +-4.69791860832546212e-11, +-3.40837438312723738e-11, +-2.43294839018708443e-11, +-1.75042444946969050e-11, +-1.27753330129791254e-11, +-9.46485838579059976e-12, +-7.11193276178237715e-12, +-5.41367417890225390e-12, +-4.17012902798464654e-12, +-3.24737967313953353e-12, +-2.55425144276699133e-12, +-2.02772030762534180e-12, +-1.62355755531410694e-12, +-1.31031923374001597e-12, +-1.06536582780117277e-12, +-8.72203635609567506e-13, +-7.18686880581971035e-13, +-5.95787371182570387e-13, +-4.96721028581076326e-13, +-4.16348753003549272e-13, +-3.50745244273139105e-13, +-2.96891325971161907e-13, +-2.52440282473269408e-13, +-2.15563190638633149e-13, +-1.84820607852655430e-13, +-9.45002406844111578e-11, +-4.41242585792929693e-11, +-1.53174239260443836e-11, +-1.33012357481852356e-12, + 6.83177600203350308e-12, + 8.23698579469010189e-12, +-4.54017333666070969e-12, +-1.62704103549579802e-11, + 5.07351076784989592e-12, + 2.34892364282634235e-11, + 6.93373087517743174e-12, +-5.97753055332549648e-12, +-4.64371368922528784e-12, +-1.15466710013348093e-12, + 3.25774524385173242e-13, + 5.78223876332423530e-13, + 4.76582440296085312e-13, + 3.39682031549247060e-13, + 2.35134506024320304e-13, + 1.63565520130456139e-13, + 1.15401791616202634e-13, + 8.27023158071009314e-14, + 6.01578085964414195e-14, + 4.43690893841647511e-14, + 3.31392319294884355e-14, + 2.50458241965225454e-14, + 1.91313399669130861e-14, + 1.47608959771470290e-14, + 1.14952381832186887e-14, + 9.02943471619591985e-15, + 7.14965029072767653e-15, + 5.70535599774415365e-15, + 4.58402510645596799e-15, + 3.70782391345600323e-15, + 3.01751222472771400e-15, + 2.47098863160700925e-15, + 2.03303274340999180e-15, + 1.68375618162308730e-15, + 1.40045129952637331e-15, + 1.17005782968274728e-15, + 2.09540057937980186e-12, + 1.41233693776459729e-12, + 6.97716781080058651e-13, + 3.61913943071201649e-13, + 2.15481305922919163e-13, +-1.79517527621950634e-13, +-6.56819907455929640e-13, + 9.89012924814712265e-14, + 1.14849238590890482e-12, +-9.16236701240975270e-14, +-7.53044664867223453e-13, +-1.35982556993974622e-13, + 1.41272663874451424e-13, + 8.92998360604428128e-14, + 2.37476258931408178e-14, +-5.38728465762037623e-16, +-5.08147601883963039e-15, +-4.39961985956502162e-15, +-3.09010317673865504e-15, +-2.08099050556700504e-15, +-1.40560729494965753e-15, +-9.61152700391803108e-16, +-6.69324205376091833e-16, +-4.71097806980572765e-16, +-3.39055237650139854e-16, +-2.44523526759025351e-16, +-1.80052542941011750e-16, +-1.33628515606002711e-16, +-1.00348903120043260e-16, +-7.61719989881523601e-17, +-5.87097732551782214e-17, +-4.41869505045054198e-17, +-3.42527044770481579e-17, +-2.72798431006041501e-17, +-2.11895528321406268e-17, +-1.63570707719676460e-17, +-1.42194984316526371e-17, +-1.04212046104286119e-17, +-8.42745068706223779e-18, +-7.12207810784575366e-18, +-8.04914129680472466e-15, +-2.62648546817212881e-14, +-1.66551026586968553e-14, +-5.38716233196981184e-15, +-6.47296810960728876e-15, +-1.80773538574367640e-14, +-2.90628668154654518e-15, + 4.69802998203891911e-14, +-3.46373627326280408e-15, +-5.00056258289361043e-14, + 1.00797239714569430e-14, + 1.77050395513691181e-14, + 1.12513221348217620e-15, +-2.63281460839949849e-15, +-1.32229526908379177e-15, +-3.36682564557010684e-16, +-1.74738129956037290e-17, + 4.19580208491541797e-17, + 3.82604689772597829e-17, + 2.61357797086971607e-17, + 1.70924846616251406e-17, + 1.14148935261973312e-17, + 7.43192310213655242e-18, + 5.99224919896713956e-18, + 2.97117535722872864e-18, + 3.31305963705155515e-18, + 1.15423323604514181e-18, + 6.56609770524216906e-19, + 1.20874278886847170e-18, + 2.63944820271528044e-19, +-2.96801737092454582e-19, + 1.08855503899848068e-18, + 4.43977095067695238e-19, + 4.15691472441250048e-19, + 3.17757351961302689e-19, + 3.11606510827193440e-19, +-4.54278660316715124e-19, + 9.13951429770741817e-20, + 4.70551151202678451e-19, + 1.35465279877088655e-19, +-1.36610227305875870e-15, + 6.45967264405796018e-17, + 3.64743576192408059e-16, + 1.95345121519245573e-16, +-2.58411506853231400e-16, +-2.08328016436484635e-16, + 1.22992600138694505e-15, + 6.11463688556056581e-16, +-2.78403929852163394e-15, + 9.19987841696458571e-16, + 1.26702499269160733e-15, +-4.87661304838990316e-16, +-2.80443635449381136e-16, + 1.32771309676138874e-17, + 3.98670329213623235e-17, + 1.68340766816038835e-17, + 4.16012957890902927e-18, + 7.80844198277089331e-19, + 3.37528033713837868e-19, +-5.48182410808240310e-19, +-5.87972532911764912e-19, +-3.19070348819119341e-19, +-5.50716658013049562e-20, + 8.73480148169658385e-19, +-7.44990734038677796e-19, + 7.03116711546958176e-19, + 6.93769439841377505e-19, + 6.28151093041082810e-19, + 6.00265492058101126e-19, + 2.11480292290792134e-19, +-1.37730135647175230e-19, + 1.30804117699688742e-18, + 6.03853358593543370e-19, + 6.81106113735396836e-19, + 7.03143425396706674e-19, + 2.81187138118978116e-19, +-2.86152758019056255e-19, + 4.60303898171320573e-19, + 3.64802632493648483e-19, + 2.75028079946836869e-19, + 5.63478294272403437e-17, + 1.91768357143459186e-17, + 2.69217079653122535e-18, +-7.39349566808306133e-18, +-9.48522364037804719e-18, + 1.83730033481407072e-17, + 3.90722387130856514e-17, +-9.02879304303431474e-17, + 2.02982931414686714e-18, + 1.02457800217454618e-16, +-5.77518637925435633e-17, +-1.27513997285974220e-17, + 1.30770581990933824e-17, + 3.64921358718445827e-18, +-4.26755380471585015e-19, + 2.09713253080080621e-20, + 8.08237937959795869e-20, + 5.66569814103279611e-20, + 1.34815767691180308e-19, + 4.35014704956899369e-19, + 1.28839605710422363e-19, + 6.25583546304474823e-19, + 1.07120143703463232e-19, + 4.35807000914255580e-19, +-6.06264380538518520e-19, + 8.15849194280788714e-19, + 2.44828787110275052e-19, + 2.71371382043621077e-19, + 3.84992110345121581e-19, +-5.06374053310336131e-20, +-1.21446775588212195e-19, + 8.98540152843635987e-19, + 3.46308253502209528e-19, + 4.26943652170553485e-19, + 2.67917913816765751e-19, + 5.31107634449649944e-19, + 2.41452053099339072e-20, + 2.82198271403181888e-19, + 4.26487080331678125e-19, + 2.62988781160352058e-19, +-5.12681547232661277e-19, +-1.73067456652091134e-19, +-2.06901903614205492e-19, + 3.48355605793490207e-19, +-1.24876432874391700e-18, + 1.28137607986781419e-18, +-2.59504031828066498e-18, +-4.20316460928647070e-18, + 5.38480227271649324e-18, +-6.51042332896749212e-18, +-2.58281556816568304e-18, + 7.32366153746680165e-19, + 2.71263083341779533e-19, + 1.49961825249211044e-18, + 1.76533013614081706e-18, + 9.98971336300494614e-19, + 1.10494129371343157e-18, + 1.27128309836712801e-18, + 7.85261551657808338e-19, + 2.13092175998333885e-19, + 8.45695954996852663e-22, + 3.39171955320030446e-19, + 8.31441097271310490e-19, + 7.90082581286293340e-19, +-3.34309055777212032e-20, + 1.07486772919781025e-18, + 2.83919378889519730e-19, + 5.34076758497391559e-19, + 4.49544687275232363e-19, +-2.77614603660363469e-19, + 1.21010503010733095e-20, + 6.53070504477168869e-19, + 5.21748379200149355e-19, + 2.59747423743661394e-19, + 2.13575962215830669e-19, + 5.41484566945854619e-19, +-1.05423365156510601e-19, + 5.21173209914257211e-19, + 7.02670839042868188e-19, + 5.41208647064411025e-20, +-1.65147858248681293e-18, +-1.16386220804652794e-18, +-3.62140506561778262e-18, +-1.52196302467202736e-18, +-2.07085622763639468e-18, +-3.25051896595342636e-18, +-1.20733836437296168e-18, + 2.93899507157124716e-19, + 8.61079214093242923e-19, +-1.88291809068675121e-18, +-2.43724569725200719e-19, + 7.26700423038339892e-20, + 6.62178192665647240e-19, + 8.93115048697532963e-19, +-1.88250890958724600e-19, +-1.83200150070217947e-19, + 1.34184890732276978e-20, +-4.22457888739710392e-19, + 2.73373095692921188e-19, + 7.25158977054419689e-20, +-4.86639233976273433e-19, +-8.18496540058579156e-20, +-5.09741325925057645e-19, + 3.00538095403093461e-19, +-3.37137641409114127e-19, +-3.57475505759205856e-19, + 3.12230160738424585e-19, + 4.98484943456458471e-19, + 3.83677634549621672e-19, + 2.86041376079998471e-19, + 4.33690819353022760e-19, + 5.17589584002828270e-19, + 3.99141294094670330e-19, + 4.78791337029083953e-19, + 2.21735000525146399e-19, + 5.26713762803630117e-19, + 1.63677610622434064e-19, + 3.62186659040279071e-19, + 3.99630532761530244e-19, + 3.05443416368265489e-19, +-7.59271970255723690e-18, +-2.75651026518996810e-18, +-4.50514661012519233e-18, +-9.48389877314228263e-19, +-2.87853786376428565e-18, +-1.26132241114711144e-18, +-1.82040712621529198e-18, +-6.77327768756566710e-19, +-7.44538393061990312e-19, +-3.69163489483779852e-19, +-6.76511568207283522e-19, +-5.10689388740686329e-19, +-1.78661349237431731e-19, +-2.99108805794534629e-19, +-5.35500883656750435e-19, +-1.02126072540291735e-18, +-8.45720631357695716e-19, +-9.19915950210827205e-19, +-1.58254405874196200e-19, +-8.28250872612468520e-19, +-6.70174949395349926e-19, +-5.75431376215004231e-19, +-4.47769985932449693e-19, +-6.64774536705596757e-19, +-5.63617621021382330e-19, +-2.49470634037501899e-19, +-7.12824578321866381e-19, +-8.07042985450209040e-19, +-8.79257433122417369e-19, +-7.46877584262446216e-19, +-7.20262086963082483e-19, +-5.25081618204839521e-19, +-7.36700785819466346e-19, +-5.59594233985109821e-19, +-9.33019450502124087e-20, +-4.99282987821043641e-19, +-5.61713933285193893e-19, +-1.85008871929225029e-19, +-4.57612954342746566e-19, +-1.43109964182139764e-19, + 1.96530144901794379e-01, + 1.44293805920342411e-01, + 1.13777079906860992e-01, + 9.45204706389448507e-02, + 8.16013894886565699e-02, + 7.24955186395814244e-02, + 6.58130972707291761e-02, + 6.07397782119806148e-02, + 5.67674842288996770e-02, + 5.35599769450576246e-02, + 5.08895387926626697e-02, + 4.86060759737564491e-02, + 4.66138966603226457e-02, + 4.48511095919869457e-02, + 4.32751398250689340e-02, + 4.18546739023208658e-02, + 4.05655866785301286e-02, + 3.93887665401874212e-02, + 3.83087993482838576e-02, + 3.73130844258243791e-02, + 3.63912042322580079e-02, + 3.55344603292786637e-02, + 3.47355248584953757e-02, + 3.39881747469383683e-02, + 3.32870863377754886e-02, + 3.26276748433963690e-02, + 3.20059674967776847e-02, + 3.14185023471990274e-02, + 3.08622467892665994e-02, + 3.03345314327978198e-02, + 2.98329960121032842e-02, + 2.93555448268712528e-02, + 2.89003097909736467e-02, + 2.84656196000566790e-02, + 2.80499738553127917e-02, + 2.76520212285103796e-02, + 2.72705409428813661e-02, + 2.69044269906871039e-02, + 2.65526746219699773e-02, + 2.62143687280370595e-02, +-3.41407175855544739e-02, +-1.92309940894317202e-02, +-1.17804240462867690e-02, +-7.71375658167449720e-03, +-5.32900384731320714e-03, +-3.84571974144156748e-03, +-2.87737438653631016e-03, +-2.22152141815064492e-03, +-1.76788406903298566e-03, +-1.45129837325642008e-03, +-1.22679561634928165e-03, +-1.06149930897583389e-03, +-9.33802155704283412e-04, +-8.31149329751514608e-04, +-7.46425141691510626e-04, +-6.75283079177581855e-04, +-6.14790706565104209e-04, +-5.62826214497052493e-04, +-5.17792922781568597e-04, +-4.78461372754022268e-04, +-4.43869450474719161e-04, +-4.13254267987878034e-04, +-3.86003894775853614e-04, +-3.61622374307498057e-04, +-3.39703943096747733e-04, +-3.19913761346571303e-04, +-3.01973327354244166e-04, +-2.85649309201186860e-04, +-2.70744902001279015e-04, +-2.57093073859449657e-04, +-2.44551239779527150e-04, +-2.32997026142662286e-04, +-2.22324875960372442e-04, +-2.12443308030493973e-04, +-2.03272688842568491e-04, +-1.94743409646073209e-04, +-1.86794385983071000e-04, +-1.79371815610608593e-04, +-1.72428144795379378e-04, +-1.65921203660207160e-04, + 2.63809148379066157e-03, + 1.26365710855331419e-03, + 6.65926627477754279e-04, + 3.79276823308922725e-04, + 2.30205850626734424e-04, + 1.47282676311429538e-04, + 9.83258660457975674e-05, + 6.75570096684601959e-05, + 4.69892876374280091e-05, + 3.29640000198769815e-05, + 2.37625640879433042e-05, + 1.79502062385923315e-05, + 1.41946679796452653e-05, + 1.15928087048293939e-05, + 9.66492580839479021e-06, + 8.17294193421607132e-06, + 6.98829683892907681e-06, + 6.03162728510284226e-06, + 5.24891043366465478e-06, + 4.60137973293833830e-06, + 4.06041093452335389e-06, + 3.60446940628535370e-06, + 3.21711290380096916e-06, + 2.88562512469271882e-06, + 2.60005711154671853e-06, + 2.35254263253371587e-06, + 2.13680184782951763e-06, + 1.94777662101466088e-06, + 1.78135925280448436e-06, + 1.63418841144520576e-06, + 1.50349399938584323e-06, + 1.38697806955343627e-06, + 1.28272258320847311e-06, + 1.18911735305270803e-06, + 1.10480330779742395e-06, + 1.02862748802498637e-06, + 9.59607098131910568e-07, + 8.96900603116871602e-07, + 8.39784345456514606e-07, + 7.87633517017912542e-07, +-1.72927802762256374e-04, +-7.18449473731764204e-05, +-3.31408114645399899e-05, +-1.66788050327152489e-05, +-9.02307408295772306e-06, +-5.18898000811660351e-06, +-3.16554485180877308e-06, +-2.06268902588156358e-06, +-1.40956321136218650e-06, +-9.47754572945148706e-07, +-6.04597343337144839e-07, +-3.82108964482541567e-07, +-2.55482028041361472e-07, +-1.84109634879332108e-07, +-1.40124635331128570e-07, +-1.10138713277232595e-07, +-8.83068093000865744e-08, +-7.18290780341865468e-08, +-5.91219070741349160e-08, +-4.91685382384123719e-08, +-4.12706434908081870e-08, +-3.49318569151048346e-08, +-2.97918383522361143e-08, +-2.55847393060208377e-08, +-2.21116797482469357e-08, +-1.92220057827363570e-08, +-1.68002831711493390e-08, +-1.47571286013492266e-08, +-1.30226549711793990e-08, +-1.15417248512140919e-08, +-1.02704722132157210e-08, +-9.17372529188831626e-09, +-8.22307740048709699e-09, +-7.39542888246231397e-09, +-6.67187521608517143e-09, +-6.03685192975644660e-09, +-5.47747179372051531e-09, +-4.98300721620533144e-09, +-4.54448320647266533e-09, +-4.15435510520863410e-09, + 1.00892255988280804e-05, + 3.68349363898765564e-06, + 1.50306476825267347e-06, + 6.74355837552206240e-07, + 3.27911047002278799e-07, + 1.69875887768618070e-07, + 9.13146847110863952e-08, + 5.10851058538352911e-08, + 3.31816216620899940e-08, + 2.51225402825455991e-08, + 1.76259146131068598e-08, + 1.04717947302966812e-08, + 5.79726648903740709e-09, + 3.40081190587555049e-09, + 2.22300210059257536e-09, + 1.57938032964155555e-09, + 1.17602940489065754e-09, + 8.98992930145395437e-10, + 6.99371579960137900e-10, + 5.51689432078153386e-10, + 4.40458638978910662e-10, + 3.55460662929078731e-10, + 2.89679184731624730e-10, + 2.38183127069785765e-10, + 1.97446532048631669e-10, + 1.64910707826999593e-10, + 1.38694084528559694e-10, + 1.17396075382743183e-10, + 9.99623778743172852e-11, + 8.55910487319831320e-11, + 7.36661862819699973e-11, + 6.37104896850449499e-11, + 5.53509532077808833e-11, + 4.82937705307123672e-11, + 4.23058071525024849e-11, + 3.72007805528353082e-11, + 3.28288747189874959e-11, + 2.90688527563183008e-11, + 2.58220291419741197e-11, + 2.30076456800898866e-11, +-5.37668473842601419e-07, +-1.74337460798418480e-07, +-6.34757980105499283e-08, +-2.55451111446143359e-08, +-1.12268862428203431e-08, +-5.38245178608563831e-09, +-2.77820530592559002e-09, +-1.35461040834947100e-09, +-5.39109107750653631e-10, +-3.51182285772559411e-10, +-3.90674461959761964e-10, +-3.03622345029515236e-10, +-1.67805738223812632e-10, +-8.13946386199707235e-11, +-4.18129987764059410e-11, +-2.47397786746164134e-11, +-1.64334845606988980e-11, +-1.16383391365417203e-11, +-8.52156609006751508e-12, +-6.36911926281377671e-12, +-4.83541552275512577e-12, +-3.72050471113622519e-12, +-2.89716171821585067e-12, +-2.28073779058253961e-12, +-1.81347448423056511e-12, +-1.45523455235725780e-12, +-1.17769483202792940e-12, +-9.60592567429932549e-13, +-7.89237039918054094e-13, +-6.52859889259164406e-13, +-5.43474510281248036e-13, +-4.55102133275037668e-13, +-3.83221652331155212e-13, +-3.24378169007515633e-13, +-2.75921115503029974e-13, +-2.35790036517061055e-13, +-2.02377766638821154e-13, +-1.74418189557354534e-13, +-1.50915461594855250e-13, +-1.31061970620388575e-13, + 2.65821244471725579e-08, + 7.72299831496049297e-09, + 2.52854382173744004e-09, + 9.19099714978822349e-10, + 3.64206201052479905e-10, + 1.54715224245717638e-10, + 7.55512530342398939e-11, + 4.65464391926614827e-11, + 2.01495337538440959e-11, +-1.05911689712310871e-12, + 4.86105491071955268e-13, + 5.76756517880263235e-12, + 4.85550469161136708e-12, + 2.43954635445132177e-12, + 1.04082483994975715e-12, + 4.71277332490242785e-13, + 2.53077185569112922e-13, + 1.57614183672844490e-13, + 1.06566284474329725e-13, + 7.50390136523701806e-14, + 5.40949192667087011e-14, + 3.96681986997699262e-14, + 2.95124945913077097e-14, + 2.22451378901081808e-14, + 1.69636220861810997e-14, + 1.30811602244208322e-14, + 1.01870703038625604e-14, + 8.00591463152472211e-15, + 6.34643363512916118e-15, + 5.07155269488547677e-15, + 4.08372705603817126e-15, + 3.31128751889141521e-15, + 2.70326130020907125e-15, + 2.21883498983085727e-15, + 1.83390469258424800e-15, + 1.52261048423021061e-15, + 1.27160653289597051e-15, + 1.06808910051751714e-15, + 8.96977771703036941e-16, + 7.59711033730927793e-16, +-1.23199371771226165e-09, +-3.23135026550591830e-10, +-9.57254800926735194e-11, +-3.16390284034364781e-11, +-1.15669759543421272e-11, +-4.48920274347599649e-12, +-1.57583883577389178e-12, +-8.08609098435754014e-13, +-1.03745863872774174e-12, +-3.20242195740039499e-13, + 2.63057211941840039e-13, + 6.32075023202885823e-14, +-8.86649231616197031e-14, +-7.09027090372659952e-14, +-3.16571254053329847e-14, +-1.19829132061753285e-14, +-4.84428107462520400e-15, +-2.37741599691075188e-15, +-1.39465593279766247e-15, +-9.02090925777154863e-16, +-6.11280360752743480e-16, +-4.25540509929895820e-16, +-3.03880035989387585e-16, +-2.18726477983789238e-16, +-1.60827753178793389e-16, +-1.17805002361007489e-16, +-8.79355124631976415e-17, +-6.76309976741175090e-17, +-5.12365949918496970e-17, +-3.97514062522142877e-17, +-3.03909378078361896e-17, +-2.38473587548056170e-17, +-1.87208405330996568e-17, +-1.48141787389062214e-17, +-1.21250438633593857e-17, +-9.09865404564007469e-18, +-6.79611106279128697e-18, +-4.22735122287179594e-18, +-6.49843885979246978e-18, +-5.64513735739154931e-18, + 5.39279539383355301e-11, + 1.28547547293006576e-11, + 3.46533396921789444e-12, + 1.04200050581276728e-12, + 3.47222703167779893e-13, + 1.34856021753058455e-13, + 5.49777399290733324e-14, +-3.15779041068408115e-15, + 3.60650719274012494e-15, + 3.14735512091372830e-14, + 1.76204544708928779e-15, +-8.34763971387325434e-15, +-1.16644387997116493e-15, + 1.38110194414424679e-15, + 9.21059224164276579e-16, + 3.65306124833190797e-16, + 1.23894925010086749e-16, + 4.66068174419912989e-17, + 2.21468656402663201e-17, + 1.37823325426161533e-17, + 1.05160303700832416e-17, + 7.38078484238096241e-18, + 5.58613991376692855e-18, + 2.28174132930285006e-18, + 2.22052076401353825e-18, + 1.22791694171019971e-18, + 1.75255216159247817e-18, + 2.61305699980194968e-19, + 5.57272553804513952e-19, +-7.02101238137921555e-19, + 3.79743729666690036e-19, + 2.12644831103077537e-19, +-6.14032560357456920e-19, +-1.83986298032599178e-19, +-6.21921652355039735e-19, +-2.10308001671577764e-19, + 1.25347953515632975e-18, + 1.39553358404859391e-18, +-9.72048499094241619e-19, +-9.09485589183279894e-19, +-2.24191522641187480e-12, +-4.88568880461829120e-13, +-1.20528616198068069e-13, +-3.33010267054145477e-14, +-9.99745270175324127e-15, +-3.17239769338585772e-15, +-1.80105604616899685e-15, +-1.06971593372045509e-15, + 1.23837728099871774e-15, +-2.49733301298924625e-16, +-8.14760959544502321e-16, + 1.37107305552280845e-16, + 1.56200721842874327e-16, + 7.55658641525378686e-18, +-2.02554304375005741e-17, +-9.35314534192055616e-18, +-2.30874747518388250e-18, +-2.94293508010009797e-19, + 9.64799070524766171e-19, + 4.36562994731922943e-19, + 2.45699746768045246e-18, + 1.14362251152783531e-18, + 4.15436615214864660e-19, + 1.22818199308669041e-18, + 7.21680189503015458e-20, + 2.12175624505568474e-19, + 1.47841335978408222e-18, +-8.76470407490316766e-19, + 7.75510964688342808e-19, +-4.26199029434952423e-19, + 8.84635071946704115e-19, + 3.02696174599982427e-20, + 3.14420113290057661e-19, + 6.57663482943633613e-19, + 1.17180537484178377e-19, + 1.12296647756685342e-18, + 1.15352720216062322e-18, + 1.61659134187056650e-18, +-9.98256059541596433e-19, +-6.97683233211211598e-19, + 8.89104251398264182e-14, + 1.78169742577942933e-14, + 4.03698053992949583e-15, + 1.02587883612177858e-15, + 2.95234944211604734e-16, + 8.50845065009761303e-17, +-6.70931335136185868e-19, + 5.54326795893218106e-17, + 2.29814212416831128e-17, +-5.70307487517521464e-17, + 2.42853368593475367e-17, + 1.03804604323538242e-17, +-4.35720610327067817e-18, +-2.10030365294214108e-18, +-7.71940619859482585e-19, + 2.11136819760209287e-18, + 9.92773140186926403e-19, + 1.70957272871488818e-18, + 1.20345683165168155e-18, + 1.84682149271596305e-18, + 1.51080937011544851e-19, + 7.24950606161058191e-19, + 1.14963856739531446e-18, + 4.42720045932233193e-19, +-2.82021622978592376e-19, +-5.24394059498296615e-19, + 7.41565571468043795e-19, + 9.22706275304335689e-19, +-3.95831716451648567e-19, + 1.81536293205277526e-19, + 4.81449918868711528e-19, +-1.67782272000245610e-20, +-3.98147585546606602e-19, +-1.67207192857513179e-19, + 5.01055325549524901e-19, + 8.65122533898268701e-19, + 9.46582719348785818e-19, + 4.76408443167446899e-19, +-2.01000366527360121e-19, +-4.89030514704030135e-19, +-3.36629972701151873e-15, +-6.20627230547798714e-16, +-1.34700360212703212e-16, +-3.47272722811735136e-17, +-1.01597222367758719e-17, +-7.71122213710203573e-18, +-3.86706178930758826e-18, + 1.69360715907808041e-18, +-2.33068551019239990e-18, +-7.39491377367970123e-19, +-8.42182647168202214e-19, +-6.69467160310937959e-19, + 3.69614670661388032e-19, + 1.72215685915060246e-19, + 2.03321612078076865e-19, + 1.97039530052630827e-18, + 1.72317715655620749e-18, + 1.08100092147894693e-18, + 1.62315065757049925e-18, + 1.39975460484959190e-18, + 8.08675419634272680e-19, + 1.55481878704873348e-18, + 1.75482796521560816e-18, + 1.16955522428182564e-18, + 7.10463248936456201e-20, + 4.68416809609934816e-19, + 2.33455013344144066e-19, + 1.61489030481513275e-18, + 5.51302650483851267e-19, +-6.65748826892864767e-19, + 5.63514020688681632e-19, + 2.17802252515067983e-19, + 5.95219909916574910e-19, + 1.88434761599845724e-19, +-2.28781283616765308e-20, + 9.39031084473609123e-19, + 3.53230585060904712e-19, + 1.98895125481685815e-18, +-3.93998022671285934e-19, + 8.94272084814783250e-19, + 1.18640787866028770e-16, + 2.02233074684002700e-17, +-3.27928651893727740e-18, +-3.66125668197457418e-18, +-2.27807295065640595e-18, +-8.23348525531692349e-19, + 3.85464758387560648e-19, + 9.48823507668924382e-19, + 3.63797258514018773e-19, +-4.71192375381799443e-19, +-1.48710183166403096e-18, +-7.11408005796669406e-19, + 1.96244134266237196e-21, +-7.55771982372842262e-19, + 2.42065755138350768e-19, +-7.12425866361418749e-19, + 1.74375414382958420e-18, + 5.18438668100778142e-19, +-5.75695743124357589e-19, +-1.42518588011030425e-19, +-2.12907164626144820e-19, +-7.39446760923065263e-19, + 4.64858841840938931e-19, + 1.31135703133763963e-19, + 2.84341647380484285e-19, +-7.34971994336483302e-20, + 1.93610992053201842e-18, +-1.38422695261099846e-19, +-2.71085688808491588e-19, + 2.44562821967232617e-19, + 1.06661826882204682e-18, + 1.17275076804370754e-18, + 5.29933257484109367e-19, + 3.63776755036586814e-19, + 3.12668111099847424e-19, + 6.17801521042039133e-19, + 1.18623945818980317e-18, + 1.06406867076568654e-18, + 7.06004979709231606e-22, + 2.28306897740798031e-19, +-2.04291284887524375e-17, +-1.32055089109480113e-17, +-6.61111588169999131e-18, +-2.34027785286862709e-18, +-2.21565722569723830e-18, +-3.27203802204853320e-19, +-9.65781912467601472e-19, +-5.40607827186500880e-19, +-7.16296720833311939e-19, +-1.15083764571319571e-18, +-1.42545846432167870e-18, +-3.16882967121675292e-20, +-1.64243034660687617e-19, +-2.24740452308340456e-18, +-1.15360686168485365e-18, +-1.15161105415915351e-18, +-1.84099748940959833e-18, + 9.89292050058762314e-19, +-1.89836156957279614e-18, +-4.81654448734191363e-19, + 4.16247645417875347e-19, + 7.87442260875630991e-19, +-8.60137632809678041e-20, +-2.71144808033984334e-19, +-3.71807280914243943e-19, +-1.06174150357512192e-18, +-3.26099902611660973e-19, +-1.90294209375684891e-18, +-2.46794357580998320e-19, +-1.01059657352403733e-18, +-5.29506044671767309e-19, +-7.42289484410973334e-20, +-6.53490783802393887e-19, +-9.86925385200792007e-19, +-1.26184529395293759e-18, +-5.14464280860778509e-19, +-7.35555823736079888e-19, +-6.20913683099950746e-20, +-2.60505001541363234e-19, +-1.03008420588574089e-18, +// root 5 + 1.42917229636169620e-02, + 1.19311118681176363e-02, + 1.01061099421141196e-02, + 8.66726020264816169e-03, + 7.51323206112828375e-03, + 6.57342958994240785e-03, + 5.79759458897175731e-03, + 5.14984610249931852e-03, + 4.60524355090060657e-03, + 4.14667885267247082e-03, + 3.76110058917873084e-03, + 3.43665198698499827e-03, + 3.16214285322451941e-03, + 2.92778559662606021e-03, + 2.72566495588952773e-03, + 2.54963487636288618e-03, + 2.39496653120280407e-03, + 2.25799637130413454e-03, + 2.13585078549138538e-03, + 2.02624597410254719e-03, + 1.92734436448081131e-03, + 1.83765074826996067e-03, + 1.75593609033172717e-03, + 1.68118081237398362e-03, + 1.61253198727468361e-03, + 1.54927062044370612e-03, + 1.49078634960125985e-03, + 1.43655767180852112e-03, + 1.38613633826698327e-03, + 1.33913492662735608e-03, + 1.29521686065262910e-03, + 1.25408833275867087e-03, + 1.21549171914464918e-03, + 1.17920017531693744e-03, + 1.14501317228140448e-03, + 1.11275278775618044e-03, + 1.08226060748574490e-03, + 1.05339512268107943e-03, + 1.02602953331396691e-03, + 1.00004988529115574e-03, +-1.34352277341457456e-03, +-1.02857100075362724e-03, +-8.04018843989113391e-04, +-6.39991650082728553e-04, +-5.17642824956956386e-04, +-4.24737242004821682e-04, +-3.52945323638686776e-04, +-2.96082107588533435e-04, +-2.49382205301260183e-04, +-2.09839696699568609e-04, +-1.76354478635483528e-04, +-1.48684276537965028e-04, +-1.26338005467737925e-04, +-1.08430252387570834e-04, +-9.40077393854601349e-05, +-8.22660961951829513e-05, +-7.25911359753157070e-05, +-6.45273084731698193e-05, +-5.77362353076427801e-05, +-5.19635663499648000e-05, +-4.70153921982919803e-05, +-4.27418437222825944e-05, +-3.90256205773014674e-05, +-3.57738536245055924e-05, +-3.29122433544736838e-05, +-3.03807756888510831e-05, +-2.81305481637304920e-05, +-2.61213893674703807e-05, +-2.43200528662185279e-05, +-2.26988324581256548e-05, +-2.12344900508025534e-05, +-1.99074180226314340e-05, +-1.87009792345290898e-05, +-1.76009828997647840e-05, +-1.65952652639381881e-05, +-1.56733518077730996e-05, +-1.48261833488831663e-05, +-1.40458925920549579e-05, +-1.33256207810513961e-05, +-1.26593664326862725e-05, + 4.67037407029381968e-05, + 3.28950292640678291e-05, + 2.37724652547283274e-05, + 1.75693699156331361e-05, + 1.32355896031984137e-05, + 1.01389804979041498e-05, + 7.92013625446493744e-06, + 6.38371350728965938e-06, + 5.34686517749936043e-06, + 4.55609798256674294e-06, + 3.81696792080400593e-06, + 3.10952563863728353e-06, + 2.49404203767071805e-06, + 2.00070614785680233e-06, + 1.61962972047629927e-06, + 1.32689516760232608e-06, + 1.10006056188819265e-06, + 9.21997178534629678e-07, + 7.80360375835654666e-07, + 6.66308867820128489e-07, + 5.73443702440003031e-07, + 4.97065394293791165e-07, + 4.33671552043520404e-07, + 3.80615991282841816e-07, + 3.35874193856395327e-07, + 2.97879376034271831e-07, + 2.65406153002188694e-07, + 2.37486804698834651e-07, + 2.13350214941789170e-07, + 1.92376804128318192e-07, + 1.74064892689554510e-07, + 1.58005334224013306e-07, + 1.43862199479401724e-07, + 1.31357934607888656e-07, + 1.20261860670086087e-07, + 1.10381191398870494e-07, + 1.01553965456327370e-07, + 9.36434460628803942e-08, + 8.65336539713119219e-08, + 8.01257821406384941e-08, +-1.41681204190702605e-06, +-9.23103505114879065e-07, +-6.19569109802899916e-07, +-4.27563458677952620e-07, +-3.02787004622130253e-07, +-2.17868783799177502e-07, +-1.54248601200979162e-07, +-1.04029367908216194e-07, +-7.23282582685385813e-08, +-6.22200020618793083e-08, +-6.10247681149803263e-08, +-5.59242267931992961e-08, +-4.62723698161616677e-08, +-3.61233687162242431e-08, +-2.77208682347570655e-08, +-2.13640536438044073e-08, +-1.66633831124656910e-08, +-1.31726801392228405e-08, +-1.05471074579591802e-08, +-8.54379004388299972e-09, +-6.99425085395073804e-09, +-5.78061108150411153e-09, +-4.81916772440301394e-09, +-4.04956463026495130e-09, +-3.42764462530795954e-09, +-2.92066679161277221e-09, +-2.50405451176978382e-09, +-2.15914940871932381e-09, +-1.87163714102613827e-09, +-1.63042900262155644e-09, +-1.42685728688610681e-09, +-1.25408958677933175e-09, +-1.10669779266265158e-09, +-9.80337693773087166e-10, +-8.71508523735530944e-10, +-7.77370888240646817e-10, +-6.95607740508233730e-10, +-6.24317389168413023e-10, +-5.61930539201525831e-10, +-5.07145519200815574e-10, + 3.92809357318169668e-08, + 2.38193281559736611e-08, + 1.48807828881009007e-08, + 9.54657497173975776e-09, + 6.31588799320049924e-09, + 4.48795407938325990e-09, + 3.55079337878197496e-09, + 2.65668732182582368e-09, + 1.25217127061312602e-09, + 1.64397085524014924e-10, + 1.28700462691954264e-10, + 5.02191414679004184e-10, + 6.56864354919660710e-10, + 5.90182948908823281e-10, + 4.58632506180191302e-10, + 3.40462698188274036e-10, + 2.51709465469270157e-10, + 1.88070525471909605e-10, + 1.42529256307685036e-10, + 1.09549725322460505e-10, + 8.53078100646041013e-11, + 6.72254072647105284e-11, + 5.35529073230732984e-11, + 4.30853496997480433e-11, + 3.49796078252552504e-11, + 2.86367409716887709e-11, + 2.36252587222069947e-11, + 1.96302533547347465e-11, + 1.64191332030066403e-11, + 1.38181874881871365e-11, + 1.16963376992038093e-11, + 9.95371902612184347e-12, + 8.51356375471567798e-12, + 7.31636043921080821e-12, + 6.31561085476160388e-12, + 5.47471430735560652e-12, + 4.76466012926299250e-12, + 4.16230085384432698e-12, + 3.64905343660547531e-12, + 3.20991049236050952e-12, +-1.01192105323143016e-09, +-5.77173758723058006e-10, +-3.39475873842574175e-10, +-2.05706828841196681e-10, +-1.22558535389580977e-10, +-6.37761615844096674e-11, +-3.73159925287295565e-11, +-5.82245199927716487e-11, +-7.37299064695489949e-11, +-2.74415392468568649e-11, + 1.66299804582487340e-11, + 1.52589264067079903e-11, + 7.73673122414854256e-13, +-6.01241804017913059e-12, +-6.54945688940521876e-12, +-5.17424238220679708e-12, +-3.74855727637329024e-12, +-2.67476784209713490e-12, +-1.92422676837791062e-12, +-1.40435152887603006e-12, +-1.04043698648047327e-12, +-7.81787909763957397e-13, +-5.95104673886193663e-13, +-4.58406547487542681e-13, +-3.56972077507206175e-13, +-2.80779317954914643e-13, +-2.22899519244184112e-13, +-1.78471615549243978e-13, +-1.44038493617452005e-13, +-1.17111557048893179e-13, +-9.58777557556431947e-14, +-7.90026650544360576e-14, +-6.54927777785388486e-14, +-5.46027058619449816e-14, +-4.57676121166324895e-14, +-3.85563355517408777e-14, +-3.26361539055278340e-14, +-2.77499401036568245e-14, +-2.36961503138281209e-14, +-2.03166042133415072e-14, + 2.42232293476462216e-11, + 1.31468722837161841e-11, + 7.26678974630866475e-12, + 4.23534540259046986e-12, + 2.88385399017663565e-12, + 1.94903462603138282e-12, + 7.45449010310025096e-14, +-1.41974241069481861e-12, + 6.80291383218897776e-13, + 2.55621239331597134e-12, + 7.94862591968915645e-13, +-5.96002321032770206e-13, +-4.76491993683231582e-13, +-1.15248732571455828e-13, + 3.88797857675789163e-14, + 6.42406711129916635e-14, + 5.25222000190080466e-14, + 3.73638071052139641e-14, + 2.58513406973598750e-14, + 1.79808766398719768e-14, + 1.26859165156510121e-14, + 9.09127611976587673e-15, + 6.61294632245460320e-15, + 4.87724596770084838e-15, + 3.64286884583471678e-15, + 2.75308973691081949e-15, + 2.10303646120334400e-15, + 1.62254345452737480e-15, + 1.26354332782467721e-15, + 9.92618051654659514e-16, + 7.86119502766481881e-16, + 6.27035785681958615e-16, + 5.03849788530960376e-16, + 4.07444028235450077e-16, + 3.31714703634048453e-16, + 2.71468057705338182e-16, + 2.23568599901505596e-16, + 1.84953449395684498e-16, + 1.53855681754251194e-16, + 1.28640186986225194e-16, +-5.33449022195265668e-13, +-2.83223773408262100e-13, +-1.50083375789845310e-13, +-7.23846957482050560e-14, +-3.13423295419832806e-14, +-4.54076749110117137e-14, +-8.19975459653400307e-14, + 3.75200597311069306e-15, + 1.17038011419609868e-13, +-1.04978999944028619e-14, +-8.01887034744198474e-14, +-1.54047307217983785e-14, + 1.44617382886891089e-14, + 9.30611260210581172e-15, + 2.45352166749718709e-15, +-9.75565312419486366e-17, +-5.66440115366560065e-16, +-4.85106952697338254e-16, +-3.40100973606061645e-16, +-2.28747083632817870e-16, +-1.54453745085064736e-16, +-1.05597389332442834e-16, +-7.35241060205661509e-17, +-5.18974464969192260e-17, +-3.72106327543607310e-17, +-2.70424048534001872e-17, +-1.97277707795037976e-17, +-1.48036904908039804e-17, +-1.10790894158659487e-17, +-8.32624500258641840e-18, +-6.26750741303237017e-18, +-4.93433102392408078e-18, +-3.85397306016507439e-18, +-3.05320397873405453e-18, +-2.38121768848419086e-18, +-1.96940590371216509e-18, +-1.51870184719423727e-18, +-1.29754476003830754e-18, +-1.04180509959584342e-18, +-7.41724889887908550e-19, + 1.04427686953660726e-14, + 5.59976540623166422e-15, + 3.05755336426997189e-15, + 1.89905919920062425e-15, + 5.23117119511265204e-16, +-1.31168686042939809e-15, +-1.24596352215968024e-17, + 5.05427978849768363e-15, +-2.66757197217371975e-16, +-5.21106447181900271e-15, + 1.03381941721998772e-15, + 1.88111476943410101e-15, + 1.35731587881512928e-16, +-2.73335426373992965e-16, +-1.38940775511923449e-16, +-3.54400358509192145e-17, +-1.50347712735180730e-18, + 4.70199651867366678e-18, + 4.08382586251210622e-18, + 2.97695803199759011e-18, + 1.89922717676380375e-18, + 1.30061443620299790e-18, + 8.12027678553597188e-19, + 6.08937303814265179e-19, + 3.45616045907740015e-19, + 2.57393261678375222e-19, + 1.79279544280951766e-19, + 6.50606170277635365e-20, + 7.30125473265430561e-20, + 5.78831734427983503e-20, + 1.56850669123504432e-19, + 2.91080343872879760e-20, + 2.97110472204860931e-21, +-6.66106186180254563e-21, +-2.79393730491152367e-21, +-5.42666026371082338e-20, + 2.00571108146566228e-20, +-8.53028153178582687e-20, +-5.61174525564633363e-20, + 7.38356988071075256e-20, +-1.67849861753652319e-16, +-1.00448884147791014e-16, +-4.46050569482298239e-17, +-2.79855045473369895e-17, +-5.06304953520397666e-17, +-3.33624758650245498e-17, + 1.23215967964900551e-16, + 6.06491963340410315e-17, +-2.91722972992404159e-16, + 9.29302178928116594e-17, + 1.33920694094389099e-16, +-5.05539544923522792e-17, +-3.01177837649269878e-17, + 1.12692772172278308e-18, + 4.11707621052323852e-18, + 1.60333480699337554e-18, + 5.72111932477579219e-19, + 6.58434352715897189e-20, +-3.67795496566954473e-20, + 1.52068552815751326e-19, + 9.70389324408896321e-21, + 6.88727029346055040e-20, +-1.62526977938661392e-20, + 1.12103152709030444e-20, +-1.32382893962778707e-20, + 4.53129871442039777e-20, + 7.58393840325431543e-20, + 1.44847089937493304e-20, + 4.96660250402204601e-20, + 4.91683250858390604e-20, + 1.65620055455128254e-19, + 2.68778905836963425e-20, + 2.73041182535975254e-20, + 6.85662013418202046e-21, + 4.28709169184798706e-20, +-8.64623914682199998e-20, + 6.02597887341874900e-21, +-4.55097146174226030e-20, + 1.34070985758728408e-20, + 5.20663713277462883e-20, + 1.44869826237990073e-18, + 2.11414981389584414e-18, + 1.57942156817110932e-18, + 1.58113817572615758e-19, +-2.67703239903545045e-19, + 2.14638440392153101e-18, + 4.34994452448892580e-18, +-9.75089863769704017e-18, + 1.39339093856142966e-19, + 1.08283513759620626e-17, +-6.07070485639131524e-18, +-1.28619889765722700e-18, + 1.22004325124503911e-18, + 3.69699906664601336e-19, +-1.17411609274119873e-19, +-8.55676567055459858e-20, + 1.77477928001655684e-19, + 9.65940976566092738e-20, + 1.53976537285969975e-20, + 1.62185693530295954e-19, + 3.54903376308047730e-20, + 7.19799021504451599e-20, +-7.36972672202778314e-21, + 5.06451957023298941e-20, +-4.50204694185136892e-20, + 2.16724448697769099e-20, + 3.80944933851305317e-20, +-2.13756816470505891e-20, + 3.22287893508763120e-20, + 2.69955730308527441e-20, + 1.55071546661373633e-19, +-1.91836700181822765e-20, +-1.25152517562901150e-20, + 9.80532948969376863e-21, + 1.56149581747965995e-20, +-5.09804500071633381e-20, +-5.28357978625367423e-20, +-2.82928911298746132e-20, +-8.05538961618909089e-20, + 1.25693827249416696e-20, +-3.22327091175623046e-19, + 2.91151709498842568e-19, + 4.37957792306086705e-19, +-2.01060894556467153e-19, +-1.72013008460803580e-20, + 8.06360831352367555e-20, +-3.46268177957006597e-19, +-7.22696586757443809e-19, + 6.58366477891664475e-19, +-6.46460695147376907e-19, +-1.83061644632719943e-19, +-3.84720025215542609e-20, +-1.56245264533574260e-19, + 1.75051948818963888e-19, + 1.77483458384310072e-19, +-4.41288176675864238e-20, + 2.16905124445934443e-19, + 1.54862338669571759e-19, + 5.90176725758708595e-20, + 7.88973121472951639e-20, + 1.12137044098219010e-19, + 1.17370912903737556e-19, + 2.62892712844234504e-20, + 6.99054651644693917e-20, + 9.57579390013169815e-21, + 5.12150991193363843e-20, + 9.82583096419563606e-20, + 2.44500547812036474e-20, + 5.79662429449601231e-20, + 2.54284016005485740e-20, + 1.32816354612724676e-19, + 3.80709564221314839e-20, + 4.97880955356202211e-20, + 9.38625060594135689e-21, + 4.80768694905410309e-20, +-6.42283306913285360e-21, +-2.63158198867312505e-20, +-4.86311250978662949e-20, +-1.53377755187380842e-20, + 1.73918129697226020e-20, +-6.56392409782673717e-19, +-2.08341009954184947e-19, + 2.32064983637364718e-19, +-7.56305375815686026e-20, + 1.09422482333694379e-19, +-5.73917674810928149e-20, +-1.96662769243783565e-19, +-1.76955719931319832e-19, + 8.27169089040390195e-20, +-1.12341085275593657e-19, + 7.94838135699018926e-20, +-6.15863126698214369e-20, + 3.88851270669809016e-20, + 1.09244407806705854e-20, +-7.26550734841082847e-20, +-1.17245680940169320e-19, +-1.74272927688023583e-20, + 2.01621374121562571e-20, + 4.82477803955642864e-20, + 3.95722689619430066e-20, + 2.03632172183205272e-20, + 3.39891333678610340e-21, +-4.59869191912124309e-20, +-2.21923376206194889e-20, +-1.42602692144505460e-20, + 1.28284473791713122e-20, + 7.43762929144222870e-20, + 5.42855256215686680e-21, + 4.60612478237803737e-20, + 4.99093569748099095e-20, + 9.49007206498040857e-20, +-2.87574911617434575e-20, +-1.00853099029810625e-20, + 2.27750186667988936e-21, + 1.40428627611535989e-20, +-4.05822892756690616e-20, + 1.60375631179469179e-20, + 1.62353090790184480e-20, + 9.30408892974540076e-21, + 3.13624849518827233e-20, +-4.57477297186092148e-19, +-5.66301689054085515e-19, +-4.48467400031837171e-19, + 5.77525788427905283e-21, +-2.23132031768420573e-19, +-2.90947300776376102e-19, +-2.06266981735419483e-19, + 7.29566692244389363e-21, +-4.62278521190894848e-20, +-1.72511773741574453e-19, + 2.11981909181004599e-21, +-1.44937545133825669e-20, +-3.29464523976785537e-20, +-6.49966834721154782e-20, +-1.03144231236934675e-19, +-6.71125430308732760e-20, +-2.09998621994712794e-20, +-1.13064528119784743e-19, + 2.82421842408540345e-20, +-7.91623401072199888e-20, +-6.84907030475730178e-20, +-5.62723004624248304e-20, +-6.02069661125811999e-20, +-9.27726500043979065e-20, +-6.78424957599312947e-20, +-7.70527911613144931e-20, +-8.77376298992302082e-20, +-1.07194014788460332e-19, +-6.90386439306280369e-20, +-9.29441097270104644e-20, +-4.29226813845432695e-20, +-5.74225830637885287e-20, +-4.22861566663480786e-20, +-5.35242116584970697e-20, +-7.65081808814072189e-20, +-5.68390929447661037e-20, +-5.32563683081315115e-20, +-3.63214628071976195e-20, +-3.20714919541913447e-20, +-3.98031038705996077e-20, + 2.34095909011815595e-01, + 2.08577541568499975e-01, + 1.88664708393549735e-01, + 1.72637358082696812e-01, + 1.59413740933309955e-01, + 1.48279884864826628e-01, + 1.38745983669625150e-01, + 1.30471083789844677e-01, + 1.23225028370526332e-01, + 1.16859060673365364e-01, + 1.11267359835036245e-01, + 1.06352610887403623e-01, + 1.02015724962543353e-01, + 9.81633005437126255e-02, + 9.47152727423424406e-02, + 9.16065786099035939e-02, + 8.87852224980948401e-02, + 8.62095440111310812e-02, + 8.38458389708062607e-02, + 8.16665343133388122e-02, + 7.96488303255441787e-02, + 7.77736890372572043e-02, + 7.60250721097584931e-02, + 7.43893592091892375e-02, + 7.28548985358962869e-02, + 7.14116554406957482e-02, + 7.00509347937366827e-02, + 6.87651594804027239e-02, + 6.75476920871329739e-02, + 6.63926901635270295e-02, + 6.52949878348797336e-02, + 6.42499982763779232e-02, + 6.32536328386295171e-02, + 6.23022335652762826e-02, + 6.13925165581188162e-02, + 6.05215241872761184e-02, + 5.96865845587089133e-02, + 5.88852769714653668e-02, + 5.81154023458341981e-02, + 5.73749577984660475e-02, +-1.45170048876671499e-02, +-1.11449485771202058e-02, +-8.85403591385736100e-03, +-7.22789346269615742e-03, +-6.03195815049237249e-03, +-5.12690877060698741e-03, +-4.42451790222426946e-03, +-3.86219179798217389e-03, +-3.39131855745476805e-03, +-2.97988352343996109e-03, +-2.61682830114286225e-03, +-2.30316030350787970e-03, +-2.03864890709768180e-03, +-1.81795253457433105e-03, +-1.63344696195145164e-03, +-1.47793498081207780e-03, +-1.34557411881858820e-03, +-1.23184710289331745e-03, +-1.13328463530819952e-03, +-1.04720050541456749e-03, +-9.71489762800388144e-04, +-9.04482820586652954e-04, +-8.44840377426637275e-04, +-7.91476944563223369e-04, +-7.43504434583474975e-04, +-7.00189989193624731e-04, +-6.60924056305090164e-04, +-6.25195946185430401e-04, +-5.92574915216599347e-04, +-5.62695383436311340e-04, +-5.35245277407966338e-04, +-5.09956760004127551e-04, +-4.86598800379763313e-04, +-4.64971175131893583e-04, +-4.44899591705573384e-04, +-4.26231698573101877e-04, +-4.08833801185781341e-04, +-3.92588143459128558e-04, +-3.77390645318944240e-04, +-3.63149010248463050e-04, + 5.14736742524287728e-04, + 3.41823488291331681e-04, + 2.38148487246584535e-04, + 1.72501958346841779e-04, + 1.28938061325099856e-04, + 9.88815859409298539e-05, + 7.78317168957691691e-05, + 6.36455631439104011e-05, + 5.46725583535318679e-05, + 4.83649515033015846e-05, + 4.23474946457861091e-05, + 3.60680543945157684e-05, + 3.01654238269423257e-05, + 2.51533931595542203e-05, + 2.11057191216995175e-05, + 1.78785071721926748e-05, + 1.52934252991518471e-05, + 1.32010216500605229e-05, + 1.14881544744914657e-05, + 1.00709564134755895e-05, + 8.88695348241939166e-06, + 7.88904275285026126e-06, + 7.04124209050829730e-06, + 6.31572025951014450e-06, + 5.69070224749188537e-06, + 5.14897137747741148e-06, + 4.67678306941499971e-06, + 4.26306666359875466e-06, + 3.89883170614533675e-06, + 3.57672130556560634e-06, + 3.29067259486331208e-06, + 3.03565609508691244e-06, + 2.80747382636826953e-06, + 2.60260159825104315e-06, + 2.41806483376034844e-06, + 2.25134006956199061e-06, + 2.10027627709021351e-06, + 1.96303160251187192e-06, + 1.83802218853069985e-06, + 1.72388052783369208e-06, +-1.87036507784962844e-05, +-1.09118055813680850e-05, +-6.75031486428214679e-06, +-4.38861146104158314e-06, +-2.97966663858886189e-06, +-2.08639562710656560e-06, +-1.44714826833186905e-06, +-9.36042897571883383e-07, +-5.94630640471455644e-07, +-4.90793204575902934e-07, +-5.17758048220729280e-07, +-5.18299460051727695e-07, +-4.58559642671968518e-07, +-3.76243473557056073e-07, +-3.00494174420570930e-07, +-2.39767190578017354e-07, +-1.93028346891887323e-07, +-1.57166970528607075e-07, +-1.29391713670933119e-07, +-1.07613181229442214e-07, +-9.03281963707075522e-08, +-7.64547539254203501e-08, +-6.52049028983869889e-08, +-5.59968977023973520e-08, +-4.83954698204941062e-08, +-4.20708879762636460e-08, +-3.67705035369724896e-08, +-3.22986847202876838e-08, +-2.85024708111336432e-08, +-2.52611833992851332e-08, +-2.24788136539752249e-08, +-2.00783817017334997e-08, +-1.79977142974146272e-08, +-1.61862535942232667e-08, +-1.46026235797389827e-08, +-1.32127585617448486e-08, +-1.19884524513638610e-08, +-1.09062259663886170e-08, +-9.94643566739837364e-09, +-9.09256870458190123e-09, + 6.67536123729435259e-07, + 3.45810759719922311e-07, + 1.91413238553190215e-07, + 1.11765104562260406e-07, + 6.85041367270662477e-08, + 4.57471005260792113e-08, + 3.55081557835578624e-08, + 2.78102831736158830e-08, + 1.38622197239769542e-08, + 4.01015376897863708e-10, +-1.95991272332826731e-09, + 2.11948107180524953e-09, + 4.87824492252063015e-09, + 5.11772270004120933e-09, + 4.28107244637509969e-09, + 3.32747255543935594e-09, + 2.54804414045309899e-09, + 1.96281401202686055e-09, + 1.52987122536477857e-09, + 1.20733706637924524e-09, + 9.64003197668181955e-10, + 7.77987685573965578e-10, + 6.34015598442053595e-10, + 5.21307427999939586e-10, + 4.32147966151862790e-10, + 3.60937360183460411e-10, + 3.03557457293819163e-10, + 2.56942862736295750e-10, + 2.18786009320114934e-10, + 1.87331726307677107e-10, + 1.61231974739091471e-10, + 1.39442104948781938e-10, + 1.21145719443241248e-10, + 1.05699778780612304e-10, + 9.25940238994047401e-11, + 8.14207349044425635e-11, + 7.18520173169602922e-11, + 6.36225160491932848e-11, + 5.65162512993108616e-11, + 5.03564603537442410e-11, +-2.31759441669499893e-08, +-1.07471572456635717e-08, +-5.38008339925507438e-09, +-2.87438645825816110e-09, +-1.57014185492404849e-09, +-7.60792388631047532e-10, +-3.45228471372996685e-10, +-5.16000371590119557e-10, +-8.11497339584358885e-10, +-4.23170189069066605e-10, + 1.29858006781812164e-10, + 2.07079529317398717e-10, + 6.48642425931878924e-11, +-2.67852878549998779e-11, +-4.92825073697407670e-11, +-4.40959275720615060e-11, +-3.38412279049487930e-11, +-2.50621245702482299e-11, +-1.85774001103246007e-11, +-1.39275604863530995e-11, +-1.05812155312788569e-11, +-8.14270425405472391e-12, +-6.34093049494733687e-12, +-4.99181046061973262e-12, +-3.96912387132575356e-12, +-3.18504661160785108e-12, +-2.57760586803594744e-12, +-2.10242783633417569e-12, +-1.72739239835235330e-12, +-1.42889814052728741e-12, +-1.18949025985151607e-12, +-9.96069874302780795e-13, +-8.38748319566077161e-13, +-7.09963645141265101e-13, +-6.03902320328115314e-13, +-5.16071577661659145e-13, +-4.42941761398012344e-13, +-3.81751942306050950e-13, +-3.30303830339316208e-13, +-2.86848592934383488e-13, + 7.81990102712523376e-10, + 3.25780728634397839e-10, + 1.47137719198670795e-10, + 7.20632173126418793e-11, + 4.13042144807163862e-11, + 2.67466422129771343e-11, + 5.68690115948207132e-12, +-1.68359060778620963e-11, +-1.03327550971056648e-13, + 2.73061847573009709e-11, + 1.35800225770074599e-11, +-4.34321427461058259e-12, +-5.61533558733774745e-12, +-2.07877334014956365e-12, +-1.18339884997739913e-13, + 4.05116321924866098e-13, + 4.12398599920068311e-13, + 3.16272771819514285e-13, + 2.27886338957974954e-13, + 1.63306968429192590e-13, + 1.18235085795720162e-13, + 8.67955533167653854e-14, + 6.45883319956215724e-14, + 4.86849978158713924e-14, + 3.71298956014576273e-14, + 2.86295206676969866e-14, + 2.22940869363330762e-14, + 1.75245355397427507e-14, + 1.38877842492036822e-14, + 1.11010159917044995e-14, + 8.93961885071651774e-15, + 7.25156651453322336e-15, + 5.91452810923667672e-15, + 4.85471219655309037e-15, + 4.01292258564299901e-15, + 3.33092298917565924e-15, + 2.78242041758837676e-15, + 2.33276256522113427e-15, + 1.96482040171275367e-15, + 1.66499743491768129e-15, +-2.57077679117580283e-11, +-9.67626843879428142e-12, +-3.98276833718484283e-12, +-1.68538003354610500e-12, +-6.60590041483418433e-13, +-5.27641513204946528e-13, +-9.74752620564668423e-13, +-2.93008933437522266e-13, + 1.29124118600941260e-12, + 2.36182718591350821e-13, +-8.70579542407600019e-13, +-3.01183962683543674e-13, + 1.12593539650331582e-13, + 1.06871841244180249e-13, + 3.76298762108030808e-14, + 5.52921508531958298e-15, +-2.80482066619840117e-15, +-3.52507514404983259e-15, +-2.73092353419719239e-15, +-1.91513106672163630e-15, +-1.33281939005735605e-15, +-9.35893980327400529e-16, +-6.69819191269579285e-16, +-4.80495375687607218e-16, +-3.51389370617057839e-16, +-2.58610219947449819e-16, +-1.95970289548237237e-16, +-1.43651578044042966e-16, +-1.13329630955676565e-16, +-8.46813786604308230e-17, +-6.57497397766380835e-17, +-4.78242556163983694e-17, +-4.04562908251351252e-17, +-3.30488817362539299e-17, +-2.66507899823631735e-17, +-2.39889139350872920e-17, +-1.57685843892512105e-17, +-1.57671552673479305e-17, +-1.33120232428985350e-17, +-6.28635611336392567e-18, + 8.24822464506079311e-13, + 2.80535328893243099e-13, + 1.06343685678950875e-13, + 4.70432486603538511e-14, + 1.82401973075160227e-14, +-9.53346747632883574e-15, +-8.00049491007760327e-15, + 5.32711639875603278e-14, + 1.65736152769866663e-14, +-6.04309215213553001e-14, + 3.61428658825432539e-16, + 2.18625484713387046e-14, + 4.14414222895362011e-15, +-2.34208246468837148e-15, +-1.61084455978208598e-15, +-5.18680474169645990e-16, +-8.90196886297197245e-17, + 1.96374042843740838e-17, + 2.41379938794173124e-17, + 2.59739085368622651e-17, + 1.34367960789469866e-17, + 9.03071315139740130e-18, + 4.30499207706358597e-18, + 4.11942501127430447e-18, + 4.17609454635169961e-18, + 5.66159089484359616e-18, +-4.83980042339777388e-19, + 3.20165134442746386e-18, +-3.52113422135801083e-18, + 3.51260290921053630e-18, + 2.62376987694381040e-18, +-2.27203641060372364e-18, + 1.60675410042841536e-18, +-1.86633063580299530e-18, + 9.39646220962799627e-19, +-5.81229921826784095e-19, +-2.18564159979512115e-19, + 3.67799682518953073e-19, +-1.37716789592401182e-18, + 3.10777094555059302e-19, +-2.58872133395205909e-14, +-7.99925022553560572e-15, +-2.66050002281877962e-15, +-9.83164353401494850e-16, +-7.52356576820070518e-16, +-6.56293596300828482e-16, + 1.06825683311868340e-15, + 1.34648113345181939e-15, +-3.17259468153943611e-15, + 2.26575885436530852e-16, + 1.78102257547579695e-15, +-3.58098995432742591e-16, +-3.80694851262434956e-16, +-2.20478929108930608e-17, + 3.44144692624261444e-17, + 1.86185667227801705e-17, + 6.24767540973961288e-18, + 3.09062484696342923e-18, +-2.24629609903456695e-18, + 1.94651241282888941e-18, +-1.07870833341139005e-18, +-8.34570824009146429e-19, + 1.29458221473622044e-18, + 5.95565653756634466e-19, + 3.37600609370623136e-19, + 1.07584041966351779e-18, + 1.59411868904243948e-19, + 2.46531375500952301e-18, + 1.13839344262481472e-18, + 2.48978900642576011e-18, + 1.76979780956185715e-18, + 3.15454781822305713e-18, + 2.51877713751361140e-18, +-1.01269567074839934e-18, + 1.97275694632344326e-18, +-9.44043335811897745e-19, + 1.07973712892981836e-18, +-3.85571635909987935e-20, +-1.16815281267636539e-18, + 1.57360499903734078e-18, + 8.09060360505133385e-16, + 2.21269403884223848e-16, + 7.06166117901216558e-17, + 2.47438935747929708e-17, + 6.14109582987556608e-18, + 1.43436952851108721e-17, + 6.65778555680313676e-17, +-8.21275611554787338e-17, +-4.12875921142725417e-17, + 1.40929799522489321e-16, +-5.25612029401630458e-17, +-2.65968524699773929e-17, + 1.52402334019883387e-17, + 1.09624600818807909e-17, + 5.75592274092884473e-19, +-2.43326168984804729e-18, + 1.77526803796536465e-18, + 1.01500291611861927e-18, +-2.70470063320704985e-18, + 2.46327448959542477e-19, +-4.13754095115626549e-18, +-7.57154691888562687e-20, +-3.27722197921255269e-19, +-1.32511820277934062e-18, +-1.56059208358426552e-18, + 3.41282648962523708e-18, +-4.39922843390568807e-20, + 2.10549915204446018e-18, +-7.71049579041687447e-19, + 2.48918698076462100e-18, + 8.49091277183316341e-19, + 1.50633830843905182e-18, +-7.23422087371210836e-20, + 6.41672106789076047e-19, +-3.12660885116617271e-19, + 2.12321540638399362e-19, + 8.24707709251124068e-19, + 1.88910927753596088e-19, + 1.10354532546178053e-18, + 1.51001772386066178e-18, +-1.85273315418139398e-17, +-7.97484417107817394e-18, +-5.43151751837558791e-18, + 3.62115005101887433e-18, + 1.68290469307901310e-18, + 4.05423904767284108e-18, + 7.05577066929641524e-19, +-7.47631856821354228e-18, + 7.65705150881784450e-18, +-1.52139500071633730e-18, +-3.20587214110087636e-18, +-1.66224756981976281e-18, +-7.84184867593092126e-19, + 2.91041132859112995e-18, + 7.17511815888876872e-20, + 1.84148692027539947e-20, + 3.32953043538512550e-18, + 2.63623138286936456e-18, + 3.65502774286519813e-19, + 3.34609105663548832e-18, + 6.82735199195131295e-19, + 2.03025816882873299e-18, + 1.61886243442953963e-18, + 1.24025907832364815e-18, +-4.65024632700951876e-19, + 1.34356697599355427e-18, + 2.36351798481888635e-18, + 1.55211019467813055e-18, +-1.06456956562581803e-18, + 2.83424414529574224e-18, + 6.01869897030954552e-19, + 1.31240291491839384e-18, + 6.19615540951672604e-19, +-1.69852804024954139e-18, + 8.29142135301011111e-19, + 1.36937313599402282e-18, + 1.71869835825383092e-18, + 1.59084774114755063e-19, + 3.08444957191626228e-19, + 1.07376018274226481e-18, + 1.27241595088101679e-18, + 2.48637335998131192e-18, +-4.31746421459650388e-18, +-9.96516450330714406e-19, + 6.62346570250718811e-18, + 5.51742550761201651e-18, + 1.92580949697004860e-18, +-1.17109728036035335e-18, + 3.32894260165190887e-19, + 1.28373453183769338e-18, +-7.93607023103591497e-19, +-1.52423736100907421e-18, +-5.13568988492282218e-19, +-1.00757474300278291e-18, + 1.19923122488407769e-19, +-1.07594373873654559e-18, +-2.36239584855550326e-18, + 2.58528724125015946e-18, + 1.57317139710124996e-18, +-1.92378954540098605e-18, +-2.39847853043651562e-19, +-1.04197576645979947e-18, + 1.26563892890192202e-19, + 9.42011263528042169e-19, +-4.42249848225306740e-19, +-7.71640519533687712e-19, + 1.25698020467477117e-18, + 1.67010556007459953e-18, + 4.12371061307005073e-19, + 2.22437818624324370e-18, + 3.02446562200532838e-18, + 1.96728572830063778e-18, + 1.80049978422339175e-18, + 2.87704543315065184e-18, + 1.16488978324084234e-18, + 1.14605576479025551e-18, + 2.82801127278233751e-21, +-1.05634682800585461e-19, + 2.53209872940530188e-19, + 9.36649864179166463e-19, +-1.02792017744451349e-19, +-3.31024420616008237e-18, +-6.82055684166513381e-18, + 9.31027226871812636e-19, +-4.71006209469656341e-18, +-2.91226400371623566e-19, +-4.41886727708443894e-18, +-4.50374133824248743e-18, + 1.48805959036448675e-18, + 8.24178665016373372e-19, +-1.45225312015064758e-18, + 1.86587984435335494e-18, + 1.32862420311750751e-18, + 4.82101382615653571e-19, +-3.19585893346321000e-18, +-3.29706038528227559e-18, + 5.71308265954792613e-19, +-5.53818177702709508e-19, +-1.79207753648359553e-18, +-1.96736203283726742e-18, +-9.29861461022223086e-19, +-1.33573018075214019e-18, +-2.39648596953134966e-19, + 1.84755373040782238e-18, +-1.74985675923974535e-18, +-2.73992256605698674e-18, +-1.78377291054473468e-18, +-4.04500311620505127e-18, +-6.66338785074626045e-19, +-1.25860782035158394e-18, +-2.93208277751429233e-18, +-2.30511723552867316e-18, +-1.39285637139441324e-18, +-1.34689619969820468e-18, +-9.94946065514908076e-19, +-3.24191012528365763e-19, +-3.93186658689450776e-19, + 3.64219739883703548e-19, +-1.57037649119531337e-18, +-5.57360923814659516e-19, +// nroots = 7 +// root 0 + 9.70241660147893592e-01, + 9.64301707168431554e-01, + 9.56501884712121941e-01, + 9.46070867571446872e-01, + 9.31890067478836515e-01, + 9.12408448863571198e-01, + 8.85706309441474438e-01, + 8.49980837909440456e-01, + 8.04679564235395883e-01, + 7.51792578354161911e-01, + 6.95805848815537642e-01, + 6.41637652137426517e-01, + 5.92429265548897521e-01, + 5.49128607268395297e-01, + 5.11376622731695929e-01, + 4.78387255564250324e-01, + 4.49374655213766849e-01, + 4.23676072608793364e-01, + 4.00757735837133033e-01, + 3.80192221536765740e-01, + 3.61634945502531946e-01, + 3.44805392856879611e-01, + 3.29472961282366861e-01, + 3.15446344435603376e-01, + 3.02565504516105033e-01, + 2.90695533860245436e-01, + 2.79721907877478193e-01, + 2.69546774990127858e-01, + 2.60086028572818428e-01, + 2.51266975097927059e-01, + 2.43026461487089340e-01, + 2.35309359506803817e-01, + 2.28067330224330012e-01, + 2.21257809945302586e-01, + 2.14843172652526976e-01, + 2.08790034112138118e-01, + 2.03068670455386069e-01, + 1.97652529850443293e-01, + 1.92517820326165656e-01, + 1.87643160243001983e-01, +-2.59404573029876602e-03, +-3.37273981159315339e-03, +-4.46650728421312069e-03, +-6.02203568931710884e-03, +-8.23966139449031423e-03, +-1.13449351631342791e-02, +-1.54594421519017970e-02, +-2.03060670598625877e-02, +-2.48927476781606108e-02, +-2.77430878323612039e-02, +-2.79688788658273152e-02, +-2.60340567251236069e-02, +-2.31331043514421790e-02, +-2.01927785076243399e-02, +-1.76028508387595269e-02, +-1.54280827204366939e-02, +-1.36189884098247109e-02, +-1.21072118295019598e-02, +-1.08332175653163554e-02, +-9.75011272383010004e-03, +-8.82167529838626119e-03, +-8.01981434233706679e-03, +-7.32252545662243765e-03, +-6.71238409419001522e-03, +-6.17544928896229632e-03, +-5.70046039167062830e-03, +-5.27824165017634888e-03, +-4.90125555028828475e-03, +-4.56326393734377174e-03, +-4.25906819141234124e-03, +-3.98430806091356303e-03, +-3.73530449329284022e-03, +-3.50893579892182618e-03, +-3.30253930656004488e-03, +-3.11383268474622280e-03, +-2.94085055962446402e-03, +-2.78189312237823701e-03, +-2.63548420251016316e-03, +-2.50033686552376131e-03, +-2.37532503032270720e-03, +-8.21096427012682050e-05, +-1.14358400141165975e-04, +-1.61735472961670515e-04, +-2.30836414122608652e-04, +-3.27915568237088534e-04, +-4.51242530674666673e-04, +-5.73178946052050860e-04, +-6.20130284908085609e-04, +-4.96990087036610555e-04, +-1.97305661537911848e-04, + 1.30613885659908169e-04, + 3.28853796300050737e-04, + 3.79129608442591579e-04, + 3.49446794980728221e-04, + 2.97299334448730755e-04, + 2.47467598691751144e-04, + 2.06095398390517052e-04, + 1.72937221192706581e-04, + 1.46410959293097380e-04, + 1.25020164535997910e-04, + 1.07597108295043987e-04, + 9.32662194146502649e-05, + 8.13714337676515759e-05, + 7.14164237037553040e-05, + 6.30213511816952744e-05, + 5.58922392674309748e-05, + 4.97991650483738891e-05, + 4.45605516331930702e-05, + 4.00317115765499044e-05, + 3.60963908050946196e-05, + 3.26604572751507238e-05, + 2.96471412927745207e-05, + 2.69934111756398116e-05, + 2.46471884406567246e-05, + 2.25651899217352887e-05, + 2.07112423991596625e-05, + 1.90549564513909584e-05, + 1.75706756370236430e-05, + 1.62366383291327277e-05, + 1.50343049871308994e-05, +-2.20603591387392399e-06, +-3.23346272659073659e-06, +-4.75054660685219260e-06, +-6.85699658768070380e-06, +-9.32546012971664452e-06, +-1.09063511864514796e-05, +-8.44137629652702535e-06, + 2.03296633755073915e-06, + 1.87295062000316727e-05, + 2.90214650032853062e-05, + 2.33055263711442471e-05, + 9.63209132801026557e-06, +-2.10904226214200041e-07, +-3.97261109967734642e-06, +-4.42277917957401326e-06, +-3.81942649615606136e-06, +-3.08517304269920871e-06, +-2.46329255601478907e-06, +-1.97742533284399750e-06, +-1.60282590435530902e-06, +-1.31231106253253027e-06, +-1.08463048065631394e-06, +-9.04237583737995160e-07, +-7.59835025030158620e-07, +-6.43141960896271386e-07, +-5.48015805265805539e-07, +-4.69845263156381510e-07, +-4.05129408432199989e-07, +-3.51182389116281566e-07, +-3.05923589520567892e-07, +-2.67726654947648088e-07, +-2.35309594799305755e-07, +-2.07653912378849713e-07, +-1.83944486839470358e-07, +-1.63524456137279280e-07, +-1.45861053797877764e-07, +-1.30519523718111221e-07, +-1.17143044170316905e-07, +-1.05437162422753441e-07, +-9.51576409570816004e-08, +-5.20216893971655609e-08, +-7.79240746985762426e-08, +-1.12964497216185951e-07, +-1.48775526027304275e-07, +-1.48453550624841907e-07, +-1.71754419337466795e-08, + 3.72365215093766652e-07, + 9.28918393394462320e-07, + 1.01432474598943978e-06, + 1.51861545258088005e-07, +-7.62304059835505249e-07, +-8.12398179827503975e-07, +-4.04522809366162441e-07, +-9.94836415433821978e-08, + 2.04504279142361326e-08, + 4.65929517201863488e-08, + 4.32078868525221730e-08, + 3.44397744111210829e-08, + 2.65777770545731448e-08, + 2.05249883583467377e-08, + 1.60014013895547249e-08, + 1.26128973238594678e-08, + 1.00481994365918307e-08, + 8.08424717094854257e-09, + 6.56335369444266235e-09, + 5.37322008913742471e-09, + 4.43289698849184077e-09, + 3.68329904136475139e-09, + 3.08078435257645246e-09, + 2.59275902052345750e-09, + 2.19462824453275073e-09, + 1.86765414217987826e-09, + 1.59743230444202404e-09, + 1.37279651927069705e-09, + 1.18502203691346539e-09, + 1.02724148403310689e-09, + 8.94011296278383831e-10, + 7.80988337857762125e-10, + 6.84685776506409879e-10, + 6.02287698848735076e-10, +-1.06533951800282318e-09, +-1.53592118034003130e-09, +-1.91563063852588297e-09, +-1.39546856205808940e-09, + 2.19403689765744461e-09, + 1.21637345618736230e-08, + 2.65004545533345214e-08, + 2.34573483603908846e-08, +-2.05513896029373299e-08, +-5.67435808061134872e-08, +-2.55897885526058546e-08, + 1.55562872237278043e-08, + 2.02550857787737474e-08, + 9.99212468905038469e-09, + 2.88971201279713937e-09, + 2.36878650299674608e-10, +-4.00830254121708982e-10, +-4.34410143443732652e-10, +-3.47309884746018709e-10, +-2.60904420952347506e-10, +-1.94758688483038504e-10, +-1.46611795958947906e-10, +-1.11649101344351038e-10, +-8.60105840853774178e-11, +-6.69797190507589531e-11, +-5.26836432396479450e-11, +-4.18234823226159204e-11, +-3.34873122523260285e-11, +-2.70264807276962818e-11, +-2.19741035135323871e-11, +-1.79899543813682222e-11, +-1.48235556784506633e-11, +-1.22886694924880882e-11, +-1.02453064255828740e-11, +-8.58757990909901258e-12, +-7.23443999562997294e-12, +-6.12363805518460130e-12, +-5.20681395714900857e-12, +-4.44618923699583748e-12, +-3.81207595423668635e-12, +-1.77472738441798942e-11, +-2.03816021444958989e-11, +-6.33407941248058031e-12, + 6.41132023351225824e-11, + 2.61128913142881692e-10, + 5.69337297823369332e-10, + 4.74917645865546701e-10, +-9.69120791779882019e-10, +-2.33071968441405352e-09, +-1.10411961682515058e-10, + 2.14500267388557385e-09, + 9.38612971935318625e-10, +-3.24666634007895734e-10, +-4.08613054570313545e-10, +-1.85994654301686502e-10, +-5.39702952551153395e-11, +-8.34610821740048053e-12, + 2.66911643036906113e-12, + 3.92045259163104762e-12, + 3.19069008860591671e-12, + 2.34666165535587710e-12, + 1.69996027206409560e-12, + 1.23987457241568144e-12, + 9.14984286851275785e-13, + 6.83515213951469697e-13, + 5.16570150461736898e-13, + 3.94587739939102630e-13, + 3.04435400918803672e-13, + 2.37081835399057357e-13, + 1.86231079065634610e-13, + 1.47459778046721075e-13, + 1.17668658119172340e-13, + 9.45242834080150062e-14, + 7.64667662497765770e-14, + 6.22210966817651144e-14, + 5.09610909222078487e-14, + 4.19538984338353730e-14, + 3.47111755158372829e-14, + 2.88785000629687433e-14, + 2.41487010995545211e-14, +-1.80513918570650083e-13, + 6.53045980194272355e-14, + 1.16083819967717671e-12, + 4.32756273968307681e-12, + 9.92092348505718549e-12, + 9.36438071645410158e-12, +-2.35717218265709681e-11, +-7.30174040582800547e-11, + 6.35783057742693833e-12, + 1.24495060140002801e-10, + 9.34803233831789648e-12, +-6.54374302921035032e-11, +-1.97942373130287315e-11, + 7.05457264322958224e-12, + 6.86223575903836751e-12, + 2.80281192231211593e-12, + 7.82121026737784076e-13, + 1.39805007820382256e-13, +-1.12513140110083972e-14, +-3.20876043617534053e-14, +-2.68990782577947610e-14, +-1.94655525587740223e-14, +-1.36979001701794047e-14, +-9.71186658872341519e-15, +-6.98524284192785158e-15, +-5.05830286930937560e-15, +-3.70536322001891702e-15, +-2.78004605749305112e-15, +-2.07738644485212553e-15, +-1.57779274326518112e-15, +-1.21033826432382608e-15, +-9.13516163173991321e-16, +-7.30977305889377157e-16, +-5.59634494684181768e-16, +-4.60909192530739619e-16, +-3.45594441462269848e-16, +-2.76223256386279010e-16, +-2.26405251518264755e-16, +-1.78940569748080179e-16, +-1.33999187446193086e-16, + 2.08139563690147097e-15, + 1.61783978440252937e-14, + 5.89868875150713375e-14, + 1.44604688657529144e-13, + 1.70205563578155639e-13, +-3.60840823983602657e-13, +-1.72361695311718241e-12, +-3.87569669927247390e-13, + 5.05965406336763580e-12, + 3.12204881399110754e-14, +-4.90981705717183856e-12, + 4.36414998425433849e-13, + 1.49185515383975008e-12, + 2.55143366181055794e-13, +-1.35486305196488403e-13, +-9.69212513550202499e-14, +-3.53954099527222144e-14, +-9.36015435634462175e-15, +-1.75343047322869102e-15, + 1.25382886692135030e-17, + 2.54845708035461500e-16, + 2.08149748806225036e-16, + 1.80119810084972612e-16, + 1.19326371209397720e-16, + 7.86587001397577584e-17, + 5.32885802931787647e-17, + 2.03671921033184083e-17, + 3.04453271249344885e-18, + 1.65194458569207978e-17, + 7.52719870452791245e-18, + 1.85556602944286357e-18, + 9.96974249310168742e-18, +-2.04852702791597883e-18, +-5.01675606664501120e-19, +-1.75062049996904699e-17, + 2.09970175028409007e-18, + 1.20866311706965071e-18, + 1.04375274711850637e-18, + 5.23420916440321223e-18, + 8.82804694118939772e-18, + 1.76242012342738644e-16, + 6.63239537418962281e-16, + 1.83603734150443647e-15, + 2.63018768767616947e-15, +-3.45757443803750999e-15, +-2.93704855871861029e-14, +-3.02537715248226032e-14, + 1.28757657031904928e-13, + 7.12075428497423068e-14, +-2.82199052221193814e-13, + 7.47199886901737227e-14, + 1.18946283795102481e-13, +-3.18393286923869661e-14, +-2.37598298129793369e-14, +-1.68501247148664889e-15, + 2.15747200810106425e-15, + 1.17366831857791306e-15, + 3.99047031780845149e-16, + 1.03719962933973209e-16, + 3.62336036737513831e-17, + 2.01277291795161590e-17, +-1.07649457038729355e-17, + 1.24481433776790096e-17, + 2.19713791268904640e-17, +-5.06440852076516412e-19, + 6.39911158626437039e-18, +-2.50120544729776547e-18, +-1.02419221423219298e-17, +-4.51399192716730227e-18, + 4.96611273455667848e-18, + 3.15021699999052653e-18, + 1.45311730160055543e-17, +-2.44134442480866828e-18, +-1.01192766612524355e-18, +-6.48448406101299587e-18, + 1.02493249203105933e-17, + 8.06259040990722952e-18, + 1.39502988718933537e-18, + 4.91825672946571431e-18, + 1.59482141592210217e-17, + 9.11133111539101611e-18, + 1.02149010717827352e-18, + 6.09923695045621191e-17, +-3.69207823930506312e-17, +-3.26990905302517704e-16, +-8.44177983849727215e-16, + 1.64279666384727523e-15, + 4.74461990282480459e-15, +-9.72571290153307888e-15, + 1.00614203896222547e-16, + 9.60997964144666685e-15, +-4.92884695926120116e-15, +-1.20759560329829188e-15, + 8.13460749694880407e-16, + 2.80217248762146385e-16, + 1.35014228205026258e-17, +-1.88848517073726164e-17, + 6.89772317115955373e-18, + 2.58870789173958618e-19, + 1.18877211156381148e-17, + 8.79585698343521727e-18, + 9.65416491953410951e-20, + 1.20235540269535889e-17, + 1.16242938324279283e-17, + 1.28858796228727066e-17, + 6.18493513138171073e-18, + 5.58418800984987326e-18, +-4.63218277669595537e-18, + 2.93206570673297321e-18, +-1.34129713377838237e-17, +-5.08326300944514727e-18, + 1.18157078398840410e-17, +-6.48230472401978992e-18, + 5.49630222816288212e-20, +-5.73368553879978689e-18, + 6.71949408931897725e-18, + 6.77044480036615100e-18, +-4.54821235717592601e-18, + 3.10600406493363851e-18, + 1.09664595400418984e-17, + 1.01563562635750323e-17, +-1.11657385649031053e-17, + 3.16855415092746966e-17, +-2.63259153920608715e-17, + 1.30316995887551125e-17, +-4.57665903577986455e-18, + 1.01878765405234486e-16, +-1.12663114837071895e-16, +-3.28582240330422178e-16, + 6.81238109024447615e-16, +-3.70756355069517578e-16, +-5.29718194601353911e-17, + 1.31001986874435714e-16, + 1.19184495053374523e-17, + 8.49569136381494418e-18, + 3.35499613791545556e-17, + 2.83091912772559412e-17, + 2.07450306895072447e-17, + 1.79276048743531092e-17, + 1.84270969257620161e-17, + 1.24903240010845153e-17, + 1.71079835962963306e-17, + 9.91973712164423141e-18, + 1.59119922338112423e-17, + 1.57971937085474662e-17, + 2.04735039365186767e-17, + 1.80351439096270783e-17, + 9.05830248305779738e-19, + 1.18385006736160852e-18, + 1.44395310710794918e-17, + 1.39750418955284416e-18, + 1.30027185397346176e-17, + 2.06200902934086605e-18, + 5.95936619500729061e-18, +-3.75339278043883481e-18, + 6.10318071277574059e-18, + 1.86697604121254918e-18, + 3.57936213690359918e-20, + 6.99212260817382634e-18, + 9.77704194482164098e-18, + 4.99006799194324951e-19, +-2.61998587715724184e-17, + 3.35832326372350738e-17, + 1.25167545568357698e-17, + 2.32408058988851224e-17, + 3.55964505708724165e-18, + 6.26691477471165976e-18, +-8.73976619607709293e-19, + 9.09973060483630242e-18, + 3.61893974451555301e-17, +-2.56249225733848971e-17, + 3.07206018115594171e-17, + 2.35527436106488005e-18, +-3.78849897895360891e-17, + 1.07456025335629797e-17, + 8.65811670462081272e-18, + 6.64376669842896375e-18, + 1.80588619951188048e-18, +-6.51474158564133781e-18, + 9.72227178825240821e-18, + 3.71591627643333587e-18, + 5.28320452078845147e-18, + 3.54720290905004759e-18, +-3.85304897277055600e-19, +-7.82710236109933016e-18, + 7.96371680771796431e-18, + 1.21954542216800313e-17, + 1.26285340201855645e-17, + 6.33875265651582434e-18, + 6.30714549470742459e-18, + 8.61173681130329032e-18, + 8.74368514205561465e-18, +-3.79225012634290330e-19, + 3.51664527756068005e-18, +-4.92839506299922695e-19, + 6.04007709619515747e-19, + 2.81738820226080821e-18, + 4.89481830862525849e-18, +-9.44560032427588754e-19, + 3.79098411304311079e-18, + 1.21727151513750676e-19, +-3.50278261899643163e-17, + 1.39087939317865082e-17, + 2.63336349678644509e-19, + 7.27281770522906265e-18, + 1.26839186732085452e-17, +-1.02237796175856000e-17, + 1.67554507356800558e-18, + 3.41092458367824427e-19, + 1.59331725470200909e-17, +-1.63015417083129582e-18, +-2.47900156343558334e-17, + 1.79300042120354934e-18, +-2.76710776372189911e-17, + 7.22444314661020451e-19, +-5.70483443946314383e-18, +-1.65153947934744171e-17, +-4.50815736824379483e-18, +-1.17542933555066591e-17, +-1.01986472624626089e-17, +-5.53679821251287157e-18, +-1.42692062380999951e-18, + 3.50669854274775534e-18, +-5.12645461873376856e-18, +-3.25781052386634303e-18, +-2.24997644438317175e-17, +-9.98249981713683353e-18, +-1.45077300602016020e-17, +-1.86227859410193291e-17, +-2.19231566296400679e-17, +-1.76356502909540969e-17, +-9.98091083439528355e-18, +-1.22441525774212074e-17, +-6.21388887748293080e-18, +-1.46839562450305908e-17, +-9.40289874423125866e-18, +-8.74732073610745066e-18, +-8.71108851125984623e-18, +-9.44531671591329951e-18, +-2.63980120902600584e-18, + 1.52815625872879841e-02, + 1.63254521717757389e-03, + 1.83392958203747788e-04, + 2.20734918103101795e-05, + 2.92704127472929336e-06, + 4.45524520612272068e-07, + 8.24684781101392652e-08, + 1.99552287929594712e-08, + 6.75635446510575223e-09, + 3.27876526271001431e-09, + 2.16686612649918834e-09, + 1.75780593523109518e-09, + 1.58576354849570030e-09, + 1.49633592197950260e-09, + 1.43594273261838467e-09, + 1.38693537943229836e-09, + 1.34380796279029666e-09, + 1.30474014759315860e-09, + 1.26895068061984156e-09, + 1.23596549762410198e-09, + 1.20542847762967724e-09, + 1.17704946551368121e-09, + 1.15058537934349296e-09, + 1.12583002636060068e-09, + 1.10260705549529382e-09, + 1.08076459802778254e-09, + 1.06017105913869181e-09, + 1.04071176455795584e-09, + 1.02228626174922693e-09, + 1.00480612938180067e-09, + 9.88193185617284875e-10, + 9.72378012125498210e-10, + 9.57298730106831536e-10, + 9.42899978994320258e-10, + 9.29132059325102667e-10, + 9.15950209475187951e-10, + 9.03313992229257072e-10, + 8.91186772000655100e-10, + 8.79535267282524193e-10, + 8.68329165860359283e-10, +-1.49464520200727584e-02, +-1.57254479589216765e-03, +-1.72891346347455241e-04, +-2.01650893530703945e-05, +-2.54924282479529364e-06, +-3.59888181192343124e-07, +-5.89661982138934583e-08, +-1.16881683305168874e-08, +-2.87964749209189537e-09, +-8.71213368529743591e-10, +-3.07259541692528683e-10, +-1.21830565640518639e-10, +-5.71537362248407534e-11, +-3.46849861573735859e-11, +-2.64826897705087271e-11, +-2.27617571903122066e-11, +-2.04457786457821242e-11, +-1.86588571393487615e-11, +-1.71543202116126590e-11, +-1.58491301313095560e-11, +-1.47028883881037260e-11, +-1.36887170275843224e-11, +-1.27860600401137835e-11, +-1.19784407441191546e-11, +-1.12524106813085831e-11, +-1.05968773300871289e-11, +-1.00026153670101019e-11, +-9.46189583901466456e-12, +-8.96819974400777798e-12, +-8.51599428881673744e-12, +-8.10055646393512680e-12, +-7.71783274498684889e-12, +-7.36432664450178628e-12, +-7.03700792372830971e-12, +-6.73323878885080917e-12, +-6.45071350789066417e-12, +-6.18740870897275874e-12, +-5.94154223753767612e-12, +-5.71153891571243093e-12, +-5.49600190138165930e-12, + 4.02689168896740429e-03, + 4.17131951375206698e-04, + 4.48981682783520508e-05, + 5.08346313001481333e-06, + 6.15867642984162014e-07, + 8.17237338125938006e-08, + 1.22424393033596742e-08, + 2.14449216625657662e-09, + 4.54324914419487039e-10, + 1.18627113363569857e-10, + 3.72716481080378844e-11, + 1.29166301801724054e-11, + 4.49965053675022744e-12, + 1.57484011052557526e-12, + 6.33364078313521016e-13, + 3.44792746013923722e-13, + 2.47481273146967703e-13, + 2.02995113369955528e-13, + 1.74466677258451607e-13, + 1.52523535578817328e-13, + 1.34515776569082712e-13, + 1.19397976834312154e-13, + 1.06564646567693576e-13, + 9.55840017316040307e-14, + 8.61247398819249612e-14, + 7.79260199147012269e-14, + 7.07797845769301700e-14, + 6.45184809473309394e-14, + 5.90060439839982515e-14, + 5.41311322391620815e-14, + 4.98019885166004844e-14, + 4.59424952283748880e-14, + 4.24891189355651580e-14, + 3.93885235230988514e-14, + 3.65956908843756942e-14, + 3.40724301975950011e-14, + 3.17861871753551977e-14, + 2.97090866708611355e-14, + 2.78171581303379959e-14, + 2.60897053037626568e-14, +-7.45995718882768691e-04, +-7.61903549606390211e-05, +-8.04757652395894834e-06, +-8.88024503033425677e-07, +-1.03803809545226628e-07, +-1.30974172786451385e-08, +-1.82767831905652979e-09, +-2.90318277174240212e-10, +-5.40695744763921655e-11, +-1.21318163892435770e-11, +-3.35875115571584172e-12, +-1.11989286730149671e-12, +-3.96573361204695814e-13, +-1.32060745711441849e-13, +-4.06550672788976003e-14, +-1.27523447101252758e-14, +-4.99793815873239248e-15, +-2.81205848665878955e-15, +-2.04242154003836337e-15, +-1.64402397544019574e-15, +-1.36971770052105063e-15, +-1.15752949286804876e-15, +-9.86899980393527726e-16, +-8.47483974667240614e-16, +-7.32432604410530765e-16, +-6.36713188765982582e-16, +-5.56495442552180588e-16, +-4.88817618243698380e-16, +-4.31364617716983370e-16, +-3.82310038319331138e-16, +-3.40200851816509938e-16, +-3.03872021964827913e-16, +-2.72382601076288614e-16, +-2.44967432091402822e-16, +-2.21000318541643675e-16, +-1.99965700268051567e-16, +-1.81436698502599167e-16, +-1.65057970504797255e-16, +-1.50532227259430478e-16, +-1.37609558259956980e-16, + 1.05295311457641742e-04, + 1.06192722966328526e-05, + 1.10325402881720318e-06, + 1.19075900371496694e-07, + 1.35059982027797054e-08, + 1.63484551438174760e-09, + 2.15458496957353156e-10, + 3.16751007039770906e-11, + 5.32911870458771197e-12, + 1.04739695804899527e-12, + 2.45802833354497012e-13, + 7.26100540539482621e-14, + 2.61038363466889828e-14, + 9.42435905971944175e-15, + 3.02403006477508111e-15, + 8.62064103280477385e-16, + 2.35370075063008493e-16, + 7.28673653587297831e-17, + 3.18739894869746058e-17, + 1.99178905739922133e-17, + 1.48826259327571306e-17, + 1.18239646011885696e-17, + 9.60343563601329231e-18, + 7.89087604434373222e-18, + 6.54044218242281147e-18, + 5.46255791692704738e-18, + 4.59413007775025414e-18, + 3.88864799286859565e-18, + 3.31117064015898847e-18, + 2.83513241328002068e-18, + 2.44013114057223237e-18, + 2.11035701450969712e-18, + 1.83345428695051434e-18, + 1.59969104088059771e-18, + 1.40134473647674366e-18, + 1.23224497612132125e-18, + 1.08742912584757955e-18, + 9.62881574641171322e-19, + 8.55333278022244704e-19, + 7.62109231844320798e-19, +-1.20105830581973078e-05, +-1.19775416790162683e-06, +-1.22641209706630311e-07, +-1.29859513216821465e-08, +-1.43566668480750544e-09, +-1.67858924948818195e-10, +-2.11052620773087755e-11, +-2.91303092832869019e-12, +-4.51769157108557102e-13, +-8.03712970572873464e-14, +-1.64401581872366601e-14, +-3.96509477887402948e-15, +-1.28644583291746932e-15, +-5.03243101962829508e-16, +-1.81448037630230067e-16, +-5.56684931613261454e-17, +-1.49277969421577401e-17, +-3.73265648888644421e-18, +-9.90582596855849504e-19, +-3.49717552211843439e-19, +-1.85653514309041553e-19, +-1.27670551038380944e-19, +-9.67013011128075359e-20, +-7.56645744297722427e-20, +-6.00877643630596811e-20, +-4.82061298570686419e-20, +-3.90106013997410758e-20, +-3.18188233506713500e-20, +-2.61428441462337051e-20, +-2.16253631960881362e-20, +-1.80021825884724322e-20, +-1.50748936288731330e-20, +-1.26939057896938560e-20, +-1.07447446105692947e-20, +-9.13959071529806305e-21, +-7.81031253882931326e-21, +-6.70362286478205118e-21, +-5.77744976901786361e-21, +-4.99888543913874871e-21, +-4.34121864571141355e-21, + 1.15010938497521165e-06, + 1.13547543991617331e-07, + 1.14781816951563615e-08, + 1.19528621990599095e-09, + 1.29271735940203401e-10, + 1.46774653137674634e-11, + 1.77423486795811248e-12, + 2.32381423360274258e-13, + 3.36595196118699111e-14, + 5.51583244043950428e-15, + 1.03646399583118936e-15, + 2.12868550572988587e-16, + 5.23601280284572460e-17, + 1.98898441040244225e-17, + 8.31337941896465408e-18, + 2.91041067696508156e-18, + 8.47196159216224957e-19, + 2.15045255888739645e-19, + 5.04162965357657071e-20, + 1.20701684260828687e-20, + 3.61408175815936969e-21, + 1.64005316003803263e-21, + 1.03302274759648686e-21, + 7.45884342520471001e-22, + 5.63457394968630342e-22, + 4.33494090492746681e-22, + 3.37375743684468413e-22, + 2.65219280238074904e-22, + 2.10226297994781934e-22, + 1.68085712176854144e-22, + 1.35259689953392945e-22, + 1.09722628282448475e-22, + 8.95009467780022183e-23, + 7.35225176495918262e-23, + 6.08076046444130637e-23, + 5.04724798403333306e-23, + 4.20669599487153870e-23, + 3.53612674643247563e-23, + 2.97651793572410081e-23, + 2.52409313763985773e-23, +-9.49472878248856879e-08, +-9.28969328916364179e-09, +-9.28426000687694836e-10, +-9.52786115531500857e-11, +-1.01101106887800774e-11, +-1.11944243276837232e-12, +-1.30889457116153421e-13, +-1.64053610686270320e-14, +-2.24359286192445469e-15, +-3.41313686471063572e-16, +-5.95704755773496462e-17, +-1.17166216854060071e-17, +-2.20635664134677862e-18, +-5.95025413747884264e-19, +-2.81314101550439982e-19, +-1.19308970312117027e-19, +-3.96147601880188522e-20, +-1.09003064697948529e-20, +-2.62954594738801800e-21, +-5.85101793646904657e-22, +-1.30073822798089553e-22, +-3.44757487043784483e-23, +-1.36157003169942778e-23, +-7.81258964029701939e-24, +-5.35737787943611188e-24, +-3.97252427312890598e-24, +-2.95456504070295377e-24, +-2.13637148215596545e-24, +-1.69663056428451403e-24, +-1.29728008292268662e-24, +-1.05114983887849957e-24, +-7.33456460871778385e-25, +-6.41656027164518321e-25, +-4.81237329062418826e-25, +-3.37411024894816801e-25, +-2.68735698989997964e-25, +-2.57586486536596988e-25, +-1.70537525727661041e-25, +-1.72581040049889996e-25, +-9.39288267351627757e-26, + 6.89136038459171485e-09, + 6.68786564775118154e-10, + 6.61626909623294873e-11, + 6.70272078379865432e-12, + 6.99500308800286457e-13, + 7.57913004955795776e-14, + 8.61312439056024410e-15, + 1.03996069547264356e-15, + 1.35518975395127035e-16, + 1.93669116740463826e-17, + 3.09220582069191678e-18, + 5.96138886470130432e-19, + 1.12680833633973856e-19, + 1.68718459585512689e-20, + 6.48759193451813894e-21, + 3.67806454833706219e-21, + 1.49319731416184642e-21, + 4.64118134749611604e-22, + 1.20659488810657381e-22, + 2.77632903746632349e-23, + 5.95386357443692741e-24, + 1.29480107842138082e-24, + 3.18009662859859434e-25, + 1.96731812982820017e-25, + 1.39627843261093545e-25, + 3.08755582864914368e-26, +-2.45621392736190717e-26, + 5.07001898906594525e-26, +-2.36987476772341785e-26, + 6.86729464887946883e-27, + 8.99271791921526549e-27, + 1.75126562234841804e-26, +-1.15108209924183408e-26, + 1.72908961128017147e-26, + 3.86021161690067792e-26, + 4.84421115192708494e-26, +-2.65955701914984145e-26, + 5.26510228037363847e-26, + 1.50083755050587651e-26, + 1.59955155607271004e-26, +-4.46409554106779919e-10, +-4.30042589694322608e-11, +-4.21568489328176555e-12, +-4.22200463536251293e-13, +-4.34210416085585742e-14, +-4.61672795071044966e-15, +-5.11931759018145750e-16, +-5.98633937171451569e-17, +-7.48412649075158452e-18, +-1.01713845271000822e-18, +-1.50385707003815116e-19, +-2.59345767902248455e-20, +-5.75223188503336848e-21, +-7.77273826841225091e-22, +-8.75698919855474445e-23, +-7.46689793813098410e-23, +-4.36787794673232052e-23, +-1.64160198253572209e-23, +-4.78896540762398721e-24, +-1.10743313187752887e-24, +-2.28447581151429577e-25, +-4.96824393789301995e-26, +-6.80436424475192297e-27, + 6.77248113238180826e-26, + 7.04029917582684123e-26, + 1.08802437160420061e-26, +-2.36058307311507193e-26, + 6.77869403823124914e-26, +-4.25725090400558541e-26, + 2.69188192484412140e-26, +-5.90758606618902776e-26, + 1.08644775380346352e-26, + 4.09815576999250415e-26, + 3.75091927391839087e-26, + 6.84821285351137790e-26, + 4.54864120633548239e-26, +-2.49253255777363950e-26, + 3.25429206010018021e-26, +-1.74647043312862492e-27, + 3.79223231115133229e-26, + 2.61174254353400116e-11, + 2.49914769458245549e-12, + 2.42978070129774811e-13, + 2.40856346963018879e-14, + 2.44518368787963354e-15, + 2.55714612409132765e-16, + 2.77563226972715464e-17, + 3.15726209972006323e-18, + 3.80836266553261850e-19, + 4.94613062724721710e-20, + 7.03517716899825885e-21, + 1.01883415619714276e-21, + 2.31993450892372847e-22, + 4.73771863996763522e-23, + 1.98776765665201391e-24, + 4.46361547787012476e-25, + 8.81509939660897946e-25, + 4.11252654409708083e-25, + 9.30822106686342969e-26, + 5.15412223688548571e-26, + 7.30430273111265633e-26, + 2.44320153220129845e-26, + 3.81516901413027369e-26, + 2.91299706417079792e-26, + 1.28124874257497844e-26, + 6.22110231968741026e-27, +-8.04494023031278565e-28, + 8.52225820202033497e-26, +-9.72032748985292529e-27, + 2.70028385378411553e-26, + 3.87179377973254975e-27, + 9.83191150877570922e-27, +-2.13004977224021616e-26, + 8.48123402443445742e-27, + 1.75090841583255614e-26, + 3.77226648829154977e-26, +-1.10657908036553832e-26, + 2.54892180014799227e-26, + 1.07219170898863161e-26, + 4.18057630476429405e-26, +-1.39340866126452402e-12, +-1.32517996242341409e-13, +-1.27879833475087979e-14, +-1.25599134080428972e-15, +-1.26045305678711275e-16, +-1.29904077959797627e-17, +-1.38393632592239868e-18, +-1.53691701155717257e-19, +-1.79779872031096640e-20, +-2.23924842399624067e-21, +-3.07901668039037929e-22, +-4.24739021961415590e-23, +-6.60799116985705635e-24, +-2.20066948679248912e-24, +-1.18660940489367841e-25, + 9.31895560954360826e-26, + 1.63015293429844711e-26, +-2.82800021956728167e-26, +-5.12272090362469536e-27, + 5.80459742194216665e-26, + 4.34012464678206970e-26, + 4.97377027769159860e-26, + 4.18419173317026558e-26, + 7.85113415540256581e-26, + 1.71304613031213468e-26, +-3.18674390118136514e-26, + 4.61262425252609019e-26, + 7.78351762707816465e-26, + 1.04454920954240964e-26, + 7.75847362782963475e-27, + 1.73556303659047552e-26, + 3.05968907545236074e-26, + 3.07742938043957510e-26, + 1.30118836962599482e-26, + 2.59718129313308241e-26, + 2.93667863079093947e-26, + 6.27550240352968608e-27, + 1.12441044161502020e-26, +-2.02847830477972221e-27, + 2.81481012536246895e-26, + 6.83321451989184681e-14, + 6.46192752592198761e-15, + 6.19329015176799040e-16, + 6.03231341421600023e-17, + 5.99130190765595980e-18, + 6.09584669284835558e-19, + 6.38748113095329133e-20, + 6.94632684197324613e-21, + 7.91122726168771720e-22, + 9.53093814665522359e-23, + 1.22421112614519654e-23, + 1.95616880120358679e-24, + 2.03851328551076967e-25, + 6.12213260817411357e-26, + 6.73016571296407287e-27, +-1.81599279180938783e-26, + 1.38783737753196582e-26, +-5.81433253485652550e-26, +-1.50545656410895370e-26, +-2.42073646307237574e-26, + 3.86388248521406771e-26, + 7.34473743346701200e-27, + 2.47203460584768527e-26, + 1.65229021643291512e-26, + 4.40306119819166392e-26, + 1.21368561181947236e-26, +-2.41816015441415207e-26, + 3.06496833251056267e-26, + 1.19444813384328746e-27, + 2.60557471024577722e-26, + 2.29875386508655324e-27, + 3.92761310837527240e-27, + 8.06640406228995986e-27, + 3.29116069626964954e-26, + 5.48366916575961548e-26, + 3.43741863765036082e-26, + 4.78705619310338426e-28, + 1.51386720078679487e-26, + 2.31701180075121193e-26, + 2.07639596908833731e-26, +-3.10317614193019351e-15, +-2.92445152155001627e-16, +-2.78218678797491698e-17, +-2.69065680740126481e-18, +-2.65103761191522032e-19, +-2.67127421915801620e-20, +-2.76673394053862755e-21, +-2.97791386042320049e-22, +-3.37484283732773747e-23, +-4.09557939868017845e-24, +-5.55288676450150445e-25, +-1.90825049303903319e-26, + 5.91956849941864996e-27, +-2.46885017790211348e-27, +-1.01992186221697639e-27, + 3.02665465301564686e-27, + 2.31248286039292260e-28, +-3.32574083981483605e-26, +-4.47133101270298285e-26, +-4.63427887503455767e-26, +-1.65650024800275065e-27, +-3.76586504387567618e-26, +-2.41183388503504057e-26, +-1.49156216089940068e-26, + 1.61709944466758962e-26, +-3.33687157223595754e-26, +-3.78490852544767651e-26, +-5.79790544466045280e-26, +-1.51087346990596691e-26, +-4.55604559442759116e-26, +-3.61052462144207660e-26, + 1.17730143425743762e-27, +-4.31219804322716466e-26, + 3.31804678634753951e-27, +-3.49387579103280130e-26, +-2.43533845224482107e-26, +-3.09422716286462507e-26, +-1.47866890061941752e-26, +-9.73904377883418844e-27, +-6.03041363622572425e-27, +// root 1 + 8.50980725605755883e-01, + 8.26232765203270603e-01, + 7.96737777937160496e-01, + 7.62168384557009748e-01, + 7.22672859075663032e-01, + 6.79039445921238327e-01, + 6.32661356352169357e-01, + 5.85264145920695533e-01, + 5.38557531574098136e-01, + 4.94031703425833135e-01, + 4.52898681198970032e-01, + 4.15983708675301544e-01, + 3.83564975403954234e-01, + 3.55394377839519382e-01, + 3.30930068496751550e-01, + 3.09574939525253390e-01, + 2.90798990408313585e-01, + 2.74168716933623768e-01, + 2.59337793792231708e-01, + 2.46029460287463531e-01, + 2.34020700727266079e-01, + 2.23129983985287411e-01, + 2.13208082269743748e-01, + 2.04131197574975720e-01, + 1.95795766446836245e-01, + 1.88114487624259363e-01, + 1.81013250113940372e-01, + 1.74428732339638903e-01, + 1.68306507339475081e-01, + 1.62599533779442140e-01, + 1.57266944127725489e-01, + 1.52273063878903298e-01, + 1.47586612010374318e-01, + 1.43180044763723618e-01, + 1.39029013643286736e-01, + 1.35111915090299350e-01, + 1.31409514236355190e-01, + 1.27904628897148293e-01, + 1.24581862845561039e-01, + 1.21427379624888032e-01, +-1.12681175084378606e-02, +-1.35112993451575389e-02, +-1.60024371344029102e-02, +-1.85605856286328690e-02, +-2.08937171156055972e-02, +-2.26649956600762648e-02, +-2.36204359719071819e-02, +-2.36862873158106557e-02, +-2.29426528847816551e-02, +-2.15193159461579409e-02, +-1.95691639026783319e-02, +-1.73314378256678274e-02, +-1.51021999689266908e-02, +-1.30984328105303045e-02, +-1.13977747818408155e-02, +-9.98509367954260145e-03, +-8.81333611941373211e-03, +-7.83484238893412781e-03, +-7.01038320613034567e-03, +-6.30948035125899771e-03, +-5.70867034602811230e-03, +-5.18977107210810175e-03, +-4.73854244344215723e-03, +-4.34370861490541906e-03, +-3.99624811373363708e-03, +-3.68887396226472500e-03, +-3.41564836031344517e-03, +-3.17169364219159391e-03, +-2.95297298196654052e-03, +-2.75612225597336117e-03, +-2.57831986430261118e-03, +-2.41718502360672039e-03, +-2.27069763045588706e-03, +-2.13713462075809570e-03, +-2.01501905536768640e-03, +-1.90307910430165934e-03, +-1.80021478965410671e-03, +-1.70547085403572967e-03, +-1.61801449819367325e-03, +-1.53711701410258819e-03, +-2.60950198734690244e-04, +-2.98582861079244239e-04, +-3.20926143765295970e-04, +-3.13152847604450900e-04, +-2.63696572308207502e-04, +-1.74255295711152076e-04, +-6.33284835579913112e-05, + 4.51274179195576810e-05, + 1.38348104168505823e-04, + 2.14916566452542343e-04, + 2.68206625425599385e-04, + 2.85461786638722135e-04, + 2.67769062283927531e-04, + 2.31892737106308914e-04, + 1.93682615799494845e-04, + 1.60404406933164633e-04, + 1.33417769084970121e-04, + 1.11919648794960123e-04, + 9.47467192787543186e-05, + 8.09031077369168756e-05, + 6.96281261338119639e-05, + 6.03543108558716004e-05, + 5.26569692599583174e-05, + 4.62148964079280106e-05, + 4.07822887185638782e-05, + 3.61689077671591339e-05, + 3.22259660919681877e-05, + 2.88359618994786521e-05, + 2.59052652510669912e-05, + 2.33586459730313513e-05, + 2.11351894688726422e-05, + 1.91852166414672101e-05, + 1.74679385166676039e-05, + 1.59496541392511374e-05, + 1.46023541672867948e-05, + 1.34026302373538003e-05, + 1.23308167894976628e-05, + 1.13703110631970438e-05, + 1.05070307048344468e-05, + 9.72897843280194798e-06, +-3.42476672338578063e-06, +-2.69754495874600207e-06, +-8.23881829489055231e-07, + 2.28613768023101459e-06, + 5.94189351767786428e-06, + 8.70638304307409737e-06, + 9.44060931591684360e-06, + 8.46791283657422506e-06, + 7.08265306767465758e-06, + 5.59683499857713907e-06, + 3.07742387662270449e-06, +-1.88295123843724095e-07, +-2.51098424230275074e-06, +-3.25267983862479408e-06, +-3.02713821823987098e-06, +-2.50705365323101850e-06, +-2.00341964047490664e-06, +-1.59530947352726187e-06, +-1.27984636605948804e-06, +-1.03725398864588884e-06, +-8.49226450937829772e-07, +-7.01885395112622736e-07, +-5.85149082761509910e-07, +-4.91703396610286100e-07, +-4.16189129282509351e-07, +-3.54631222364535378e-07, +-3.04045610117111764e-07, +-2.62166776613886204e-07, +-2.27256656862419199e-07, +-1.97968845727146747e-07, +-1.73250898791774418e-07, +-1.52273216143145914e-07, +-1.34376709570406005e-07, +-1.19033899257741482e-07, +-1.05819717519273227e-07, +-9.43894012918670506e-08, +-8.44616117865949600e-08, +-7.58054430278771134e-08, +-6.82303492015024991e-08, +-6.15782796451929403e-08, + 1.77520513474094702e-08, + 7.76114603735170654e-08, + 1.58081905551388272e-07, + 2.23838585396510761e-07, + 2.17498725025791984e-07, + 1.15064882602919839e-07, +-1.95497009445968392e-08, +-8.64289647544936458e-08, +-8.28921843809590546e-08, +-1.16005020851642744e-07, +-1.96343075299587408e-07, +-1.91060704702418540e-07, +-9.31596567449867369e-08, +-7.32778464668908090e-09, + 2.84678453431479006e-08, + 3.36429789854967665e-08, + 2.86790560311252311e-08, + 2.24226843175062903e-08, + 1.72230728470159946e-08, + 1.32861372212522929e-08, + 1.03554486480205459e-08, + 8.16213914209670557e-09, + 6.50239130807296092e-09, + 5.23146880627298989e-09, + 4.24726856559441868e-09, + 3.47711071123463682e-09, + 2.86861012145601469e-09, + 2.38353133449254598e-09, + 1.99363287722689135e-09, + 1.67782258614777321e-09, + 1.42018477360209395e-09, + 1.20859373691414707e-09, + 1.03372817269733612e-09, + 8.88362173459209941e-10, + 7.66849816723151319e-10, + 6.64747069353066263e-10, + 5.78531338049384700e-10, + 5.05392093495186386e-10, + 4.43072908857780298e-10, + 3.89751564169888496e-10, + 2.28873741581598003e-09, + 3.66241624812344431e-09, + 4.09707099030994692e-09, + 1.96080359995061939e-09, +-2.85354847564964973e-09, +-6.82578750935134082e-09, +-5.68293798529247022e-09, +-9.48391579929315635e-10, + 2.04055296108852900e-10, +-3.70080767194985157e-09, +-2.88028165852088015e-09, + 3.40027987722672857e-09, + 5.33286158769659190e-09, + 2.98912941863587897e-09, + 8.01886535280558964e-10, +-1.13151494359805202e-10, +-3.17494498658040794e-10, +-2.92613583935613126e-10, +-2.26859247939777954e-10, +-1.69199395042749690e-10, +-1.26091371642651686e-10, +-9.48844927382476021e-11, +-7.22516354061133719e-11, +-5.56592643547537118e-11, +-4.33438525315789123e-11, +-3.40925607689440083e-11, +-2.70647424856682936e-11, +-2.16702554180323434e-11, +-1.74893355310921716e-11, +-1.42198584641005354e-11, +-1.16416265824416730e-11, +-9.59259524255405276e-12, +-7.95221094622314082e-12, +-6.62992277224070690e-12, +-5.55717606030415304e-12, +-4.68154250940440590e-12, +-3.96272440837669733e-12, +-3.36942481071407217e-12, +-2.87721143324259190e-12, +-2.46687718296847083e-12, + 5.82755727488571496e-11, + 4.86777093732698744e-11, +-2.51238107644891062e-11, +-1.55819917964844284e-10, +-2.19379269574359250e-10, +-7.65028912210628191e-11, + 1.61841508756104600e-10, + 1.74576686032537556e-10, +-9.73382844299166687e-11, +-1.39549835015353546e-10, + 2.15323778723911697e-10, + 2.17105596216109832e-10, +-4.50658694397445091e-11, +-1.14620684468399082e-10, +-6.25235874121889238e-11, +-1.87151525891950447e-11, +-1.59760246501555236e-12, + 2.52002360865990980e-12, + 2.68831310864417720e-12, + 2.09165763148021838e-12, + 1.52306945810896421e-12, + 1.10080003534517889e-12, + 8.02432664542518017e-13, + 5.92113317085956749e-13, + 4.42319875946442655e-13, + 3.34284679421137585e-13, + 2.55356357408206188e-13, + 1.97009895706381558e-13, + 1.53428822748729676e-13, + 1.20505242413626197e-13, + 9.54422194114978365e-14, + 7.61457825801810417e-14, + 6.11776511006640641e-14, + 4.94844518912452825e-14, + 4.02713836157300996e-14, + 3.29736797914454194e-14, + 2.71507422596275617e-14, + 2.24694031586895834e-14, + 1.86889647768567812e-14, + 1.56162652839922177e-14, + 3.51734071752762239e-13, +-1.29091007648416300e-12, +-4.00192934831237194e-12, +-4.55475874714341613e-12, + 1.05141046382551162e-12, + 8.49348725728559319e-12, + 6.31081590778304944e-12, +-6.05022361926951417e-12, +-9.77323870429937072e-12, + 8.68784365819023387e-12, + 1.01864667463099877e-11, +-8.67186421431108991e-12, +-6.75434372018277093e-12, + 8.50955008297976095e-13, + 2.06997102847110158e-12, + 1.01897931299235641e-12, + 3.00711066466658290e-13, + 4.48233951062642840e-14, +-1.63974874419390195e-14, +-2.24642074457920119e-14, +-1.77055934402172831e-14, +-1.26359196584222448e-14, +-8.89851196922085308e-15, +-6.28979051452841885e-15, +-4.50882498602234999e-15, +-3.26727448697255687e-15, +-2.39252632755994092e-15, +-1.80166441821089637e-15, +-1.33645846038152913e-15, +-1.02836049688186981e-15, +-7.75163931391899846e-16, +-5.88376340566849686e-16, +-4.61205619487806275e-16, +-3.59764624586891252e-16, +-2.90442415395969965e-16, +-2.30746091057124659e-16, +-1.84206398996856022e-16, +-1.41563406578391509e-16, +-1.17708929071075351e-16, +-9.85635479037331889e-17, +-2.79602783312790310e-14, +-7.51579914108213104e-14, +-7.70538754144434501e-14, + 6.96197857680129067e-14, + 2.59246485734966435e-13, + 1.33809996670319156e-13, +-2.77426305614843125e-13, +-3.90768374624268334e-13, + 2.77434319468929286e-13, + 6.04136327595564310e-13, +-5.45974553748713415e-13, +-3.20099361774308153e-13, + 2.89705747248688942e-13, + 1.30151639497122643e-13, +-2.18436297978781578e-14, +-3.16915011886213596e-14, +-1.36706861398402900e-14, +-3.82865189983653151e-15, +-6.51640846818011228e-16, + 9.16678946557705013e-17, + 1.75012607785617969e-16, + 1.39911378175882971e-16, + 9.52960962834779288e-17, + 6.53335310974840966e-17, + 4.45554842460944670e-17, + 3.50274703724246032e-17, + 2.94528708186657195e-17, + 6.94120367909710691e-18, + 9.69023058866386506e-18, +-2.46840219526651115e-18, + 7.95244702508456222e-18, + 1.42255968975966647e-17, + 1.49278247880666335e-18, + 4.94443487209564697e-18, + 1.22024552742883118e-18, +-4.73195700631878792e-19, + 1.84410283109811532e-18, + 3.68528736631682366e-18, + 1.83413364698301244e-18, +-1.22649783492099333e-19, +-1.12464436838550945e-15, +-1.16686199455620365e-15, + 1.71502578604294507e-15, + 6.11977049356485095e-15, + 2.38506503958909185e-15, +-9.32251603358508389e-15, +-1.04230748271346599e-14, + 7.00527447823206836e-15, + 2.54711661469894362e-14, +-1.82646518562334238e-14, +-2.34812656325563186e-14, + 2.57877593495274637e-14, + 3.00213400450444291e-15, +-6.72870580818942499e-15, +-1.61371596858016718e-15, + 4.67767984583467316e-16, + 4.36456613844474342e-16, + 1.55087816498855043e-16, + 3.87357023330805136e-17, + 7.51771132906545080e-18, + 3.02743723501782627e-18, + 1.29244647711466325e-18, +-5.18668871922561473e-18, + 2.54992900526229379e-18, + 3.94117721837535383e-18, + 6.38971159795777642e-18, + 8.06425736251432725e-18, +-3.12628359823368542e-18, + 1.21991186838563717e-17, +-1.59894252436020086e-18, + 8.07568502360091764e-18, + 8.10218883340509295e-18, + 6.35512609201139073e-18, + 5.48919856324652094e-18, + 3.56655240780890445e-18, + 8.00486671106524629e-18, + 4.85991417775435744e-18, + 5.19682925861736701e-18, + 3.24993779625669536e-18, + 1.09972690025303609e-18, + 2.68739887095406301e-17, + 6.10763882177119088e-17, + 1.29298817578106244e-16, + 7.75597068223020830e-17, +-2.33894949912130250e-16, +-2.32235339862287619e-16, + 2.12767636483160448e-16, + 6.40281502792217004e-16, +-1.11943736210773244e-16, +-1.54267281416053916e-15, + 1.48764568432832400e-15, + 1.51786727811263307e-16, +-6.37164040654145497e-16, + 8.54828132955111600e-17, + 1.19702008156584522e-16, + 1.35111423539716349e-17, + 8.40549796121113911e-18, +-9.94064165454127627e-18, + 8.57613686640723674e-18, + 1.59168716839927967e-18, + 4.72362196445751147e-18, + 6.60423124709790826e-18, +-5.13801754909173767e-18, + 1.73787452995659762e-18, +-5.13746647568395963e-18, + 1.55344145837659781e-18, + 5.75523965760248349e-18, +-2.89530383994528102e-18, + 1.84197809299476598e-18, +-1.11636868633252868e-18, + 4.49618902582259211e-18, + 2.55645954314796783e-18, + 1.45888323536241751e-18, +-1.41031046524334911e-20, + 5.22267080205548821e-18, +-1.75830295023195205e-18, + 4.30021586652338547e-18, + 5.58614980190688256e-18, + 5.19591438841837603e-18, +-1.72354686997988945e-18, + 2.17876912445508247e-17, + 2.15442179944074139e-17, + 2.41943087025103601e-17, + 7.78192329175296711e-18, +-8.48554536782856954e-18, + 1.16398642195374999e-17, + 1.79068211073968409e-17, +-3.53163810267602384e-17, +-6.11808384899282747e-17, + 2.05902389314992458e-17, + 4.16306737582801059e-17, +-8.05382562576116243e-17, + 3.29060650696849412e-17, + 2.54607992102879903e-17, + 3.46014650643309833e-17, + 1.28194946835733474e-17, + 3.90215584179911311e-17, + 8.33168099213992260e-18, + 9.90138977148521719e-18, + 9.32883344916479930e-18, + 5.22501946017678237e-18, + 8.90399556965960076e-18, + 3.46991285397727981e-18, + 1.25693718126140516e-17, + 5.96212884555930234e-18, + 7.22826632737465017e-18, + 1.52413659525492655e-17, + 4.33943970354166136e-18, + 5.26381136910711977e-18, +-4.17807531958457948e-18, + 7.94917603077643159e-18, + 6.63015579528455642e-18, + 4.11165689220678459e-18, + 3.42964659761114688e-18, + 2.36730459311363821e-18, + 5.85844284478908793e-18, + 2.94344664783818634e-18, + 5.06175407956224487e-18, + 5.72187078419553288e-18, + 2.09999474405151987e-18, + 3.64710014655945969e-17, + 1.63055088439428829e-17, + 1.54761086814160250e-17, +-2.10360318720203823e-18, +-2.58189466729793426e-17, + 3.50474812568736236e-17, +-5.21138688124612449e-19, +-1.54050523311237133e-18, +-8.36556462258438632e-18, +-2.78319453251647783e-18, +-2.59110532274272814e-18, + 3.47816413709351164e-18, + 1.51936090185109555e-18, +-2.69484148070299149e-18, +-2.40542305007954830e-18, + 2.50791879617289011e-18, + 4.03360868342384183e-18, +-3.62761172826848742e-18, + 2.53495601619795435e-18, +-3.79873293378768843e-18, +-4.27992715414713230e-18, +-2.32283142665247966e-18, +-6.44528763023732571e-19, + 5.80781264238438991e-18, + 3.51732512935170614e-19, +-1.14844252937230351e-18, + 1.02339749099026532e-17, + 1.27821141603130778e-18, + 3.40661049511014545e-18, + 1.01363372767695246e-17, + 4.26985314280338487e-18, + 5.20888983612664502e-18, + 4.40577714907609866e-18, + 6.49698890327206689e-18, + 5.42888572627497446e-18, + 6.19016396539702879e-18, +-3.81530757288387894e-19, +-4.18828541743466543e-19, +-2.04964354801158193e-19, +-4.49480488011421576e-19, +-1.05174410375606633e-18, +-1.24432651661360611e-17, +-1.59585568028120789e-18, + 1.11554168301703340e-18, + 1.02483855675834666e-18, + 6.06114260595097864e-19, +-1.24800339032534840e-17, + 9.54532200138810362e-18, + 9.26222690340243739e-18, + 5.49062189592911363e-18, + 1.04018964916633667e-19, +-3.09307209310376907e-18, + 1.49521010146297424e-18, +-2.52856656464777899e-17, +-5.06296152843931488e-18, +-1.95415152614461555e-17, +-7.55673848025421652e-18, +-1.90877611554343563e-18, + 2.33171175047983045e-19, +-1.10322304095732969e-17, +-5.16033408052032736e-18, +-5.02208814530930129e-18, +-1.17658690147406607e-18, +-7.66120385212680005e-18, +-2.49857373443368494e-19, +-6.66574395127092866e-18, +-1.00926958281168098e-17, +-1.31623961631878165e-17, +-7.12440685999477851e-18, +-1.06774480799744054e-17, +-1.20764821603152513e-17, +-9.84254717644195948e-18, +-8.09685477774835854e-18, +-3.35033561247816235e-18, +-8.19907455682168094e-18, +-2.87574855664808181e-18, +-7.89316548568807832e-18, +-2.64163843296442832e-18, +-2.98462489119068703e-18, +-5.99680697787643596e-18, + 3.74835356715503762e-02, + 5.45662549983957999e-03, + 9.15333634419754848e-04, + 1.83019715964631010e-04, + 4.50717151039267263e-05, + 1.40094379790040665e-05, + 5.54553086757747228e-06, + 2.76906661396405923e-06, + 1.70027632622697999e-06, + 1.23738002532810633e-06, + 1.02125289886004432e-06, + 9.13742021592075607e-07, + 8.54101842309270909e-07, + 8.14780240276825208e-07, + 7.84193561545281149e-07, + 7.57966198559412404e-07, + 7.34511521242353903e-07, + 7.13180222579090111e-07, + 6.93621692338310713e-07, + 6.75592397357019401e-07, + 6.58900651351415107e-07, + 6.43388387252081841e-07, + 6.28922825298405710e-07, + 6.15391273216194114e-07, + 6.02697337902042382e-07, + 5.90758006576138943e-07, + 5.79501348092729078e-07, + 5.68864680221951599e-07, + 5.58793094485970320e-07, + 5.49238258797479449e-07, + 5.40157438089970051e-07, + 5.31512687528433236e-07, + 5.23270183469521879e-07, + 5.15399665208691156e-07, + 5.07873966464161291e-07, + 5.00668620032057675e-07, + 4.93761522478610684e-07, + 4.87132648382759702e-07, + 4.80763805700944338e-07, + 4.74638425437982921e-07, +-3.30680271411809348e-02, +-4.55628901505415219e-03, +-7.07967731337965115e-04, +-1.27308513101330760e-04, +-2.71291769705099735e-05, +-6.95826153384424626e-06, +-2.15037044130851821e-06, +-7.86782145935883269e-07, +-3.28830886147376637e-07, +-1.50033349993591034e-07, +-7.25062459823180349e-08, +-3.79209938835178462e-08, +-2.30479263435910091e-08, +-1.68181270007715010e-08, +-1.39673828378609813e-08, +-1.23312473727932728e-08, +-1.11535891763568933e-08, +-1.01949245903375581e-08, +-9.37598974658528420e-09, +-8.66318338960961900e-09, +-8.03674217617941187e-09, +-7.48240241069144473e-09, +-6.98900280055348622e-09, +-6.54754949362826129e-09, +-6.15069341098581036e-09, +-5.79237156482278707e-09, +-5.46754133633315559e-09, +-5.17197800008830850e-09, +-4.90211819764046841e-09, +-4.65493764254428048e-09, +-4.42785468504228160e-09, +-4.21865362341561373e-09, +-4.02542323854112461e-09, +-3.84650716805496357e-09, +-3.68046356438066711e-09, +-3.52603208865281568e-09, +-3.38210674319363347e-09, +-3.24771338240606565e-09, +-3.12199099646209496e-09, +-3.00417605585238746e-09, + 8.04675638231482776e-03, + 1.05366062527819694e-03, + 1.53026504454617057e-04, + 2.51966486563768049e-05, + 4.80323130629517730e-06, + 1.07742010100073545e-06, + 2.86701832940130095e-07, + 9.04070827260304558e-08, + 3.34104360559466182e-08, + 1.40338000159359861e-08, + 6.27641074010796509e-09, + 2.75688917958577323e-09, + 1.15338871459450247e-09, + 4.94883084754651657e-10, + 2.53783591577324388e-10, + 1.67317278225624695e-10, + 1.30831195794808693e-10, + 1.10090372279790481e-10, + 9.52056639774485535e-11, + 8.33432103305547222e-11, + 7.35231881638615458e-11, + 6.52635268089946679e-11, + 5.82493122897233274e-11, + 5.22472663996909504e-11, + 4.70767427667707080e-11, + 4.25952329408492205e-11, + 3.86890211492918976e-11, + 3.52665226584696305e-11, + 3.22533630198373173e-11, + 2.95886817847400555e-11, + 2.72223234489090322e-11, + 2.51126812886176728e-11, + 2.32250272163127146e-11, + 2.15302071153815872e-11, + 2.00036135858614904e-11, + 1.86243710975479159e-11, + 1.73746851134287964e-11, + 1.62393187664386924e-11, + 1.52051694844469253e-11, + 1.42609244654905483e-11, +-1.36150838892143237e-03, +-1.70566604787897395e-04, +-2.33874938936133051e-05, +-3.57758395471132374e-06, +-6.22193806901563688e-07, +-1.24978842190604363e-07, +-2.92709973371834480e-08, +-8.00750495376406866e-09, +-2.55480853796271857e-09, +-9.56718519742192210e-10, +-4.17982471843213569e-10, +-1.94654480885630871e-10, +-8.43585549111276693e-11, +-3.21207380824709741e-11, +-1.13271428308509705e-11, +-4.32034115949666432e-12, +-2.14709068807912002e-12, +-1.41815415233760367e-12, +-1.09381884259984455e-12, +-8.94593763213009775e-13, +-7.48013138145718728e-13, +-6.32606029362272160e-13, +-5.39432897951892637e-13, +-4.63241533089218753e-13, +-4.00355452607269021e-13, +-3.48034487738774739e-13, +-3.04186619771228689e-13, +-2.67193171468185021e-13, +-2.35788720227644584e-13, +-2.08974939176787937e-13, +-1.85957587252136438e-13, +-1.66099842933908277e-13, +-1.48887373583289884e-13, +-1.33901935870570564e-13, +-1.20801243733955111e-13, +-1.09303486359103951e-13, +-9.91753268645545409e-14, +-9.02225312061532584e-14, +-8.22825975496375326e-14, +-7.52189223070953829e-14, + 1.77518127618547257e-04, + 2.14041898738569534e-05, + 2.79398744531380743e-06, + 4.01567331769367141e-07, + 6.46550312338281821e-08, + 1.18426182724233978e-08, + 2.49469306940648801e-09, + 6.06580496310418514e-10, + 1.69103454687806993e-10, + 5.35503804545335606e-11, + 2.01217102887354343e-11, + 9.48902841582976416e-12, + 4.74352154043004220e-12, + 2.04624161640353043e-12, + 7.31442806635011949e-13, + 2.29915438303036759e-13, + 7.22229671598238090e-14, + 2.78124964672855900e-14, + 1.50537892639001241e-14, + 1.04496295235042695e-14, + 8.05846180755022566e-15, + 6.45034576146370100e-15, + 5.24730313711174447e-15, + 4.31292609269458040e-15, + 3.57503171523908769e-15, + 2.98588842806028252e-15, + 2.51120184214774513e-15, + 2.12557832402229095e-15, + 1.80992293684504143e-15, + 1.54971502477045072e-15, + 1.33380293030644008e-15, + 1.15354471575638088e-15, + 1.00218658691086136e-15, + 8.74408950185559545e-16, + 7.65990688272634749e-16, + 6.73558875460873592e-16, + 5.94400958110570137e-16, + 5.26321776565766936e-16, + 4.67534766860775217e-16, + 4.16577418940795307e-16, +-1.88948869196558134e-05, +-2.20370072831049503e-06, +-2.75706871663696905e-07, +-3.75633949701340621e-08, +-5.66202477227773509e-09, +-9.58344661420951844e-10, +-1.84305619901197657e-10, +-4.05629724485786664e-11, +-1.02222267612306335e-11, +-2.88167913787434144e-12, +-8.63162345804772954e-13, +-3.20560233613698319e-13, +-1.77143093475338054e-13, +-9.60200594711209850e-14, +-4.04629276964874724e-14, +-1.35977401065281063e-14, +-3.93631684141678532e-15, +-1.09078749621613773e-15, +-3.46104958569258445e-16, +-1.53786016847831589e-16, +-9.47530915048751746e-17, +-6.86366251422354751e-17, +-5.26701732049126025e-17, +-4.13295976680046958e-17, +-3.28402147204510335e-17, +-2.63493037578083376e-17, +-2.13235610043455991e-17, +-1.73925063493590148e-17, +-1.42899204940341067e-17, +-1.18207022062082479e-17, +-9.84021356099991422e-18, +-8.24009973273638566e-18, +-6.93861859680326372e-18, +-5.87323909826501708e-18, +-4.99580305334030316e-18, +-4.26922179938169749e-18, +-3.66421954269721960e-18, +-3.15807430488287013e-18, +-2.73239745659913314e-18, +-2.37296799243889286e-18, + 1.70331426470166995e-06, + 1.92959915506600835e-07, + 2.32668042015154971e-08, + 3.02655356593037027e-09, + 4.30912399145922011e-10, + 6.81105170812370646e-11, + 1.20963233938178761e-11, + 2.43360843055972976e-12, + 5.58074701214858366e-13, + 1.47398397622977581e-13, + 4.15901257101223054e-14, + 1.01339209121243340e-14, + 3.87630343608279725e-15, + 2.92974254391636632e-15, + 1.66645537186177890e-15, + 6.67263452252885564e-16, + 2.10077450694641005e-16, + 5.68134305619081658e-17, + 1.44201643432804546e-17, + 3.98247962942660469e-18, + 1.48929605930110561e-18, + 8.11120364863730490e-19, + 5.50455437626847976e-19, + 4.05426335011605339e-19, + 3.07579691863018694e-19, + 2.36949862346728408e-19, + 1.84394263947365556e-19, + 1.45009065569535859e-19, + 1.14934738547457436e-19, + 9.18389152818405285e-20, + 7.39315106161470575e-20, + 5.99527409471896339e-20, + 4.89333219463542963e-20, + 4.01844680607264017e-20, + 3.32340166563894532e-20, + 2.75935596826472143e-20, + 2.30412358540074024e-20, + 1.92944714362472264e-20, + 1.63160706488628214e-20, + 1.37944411846867129e-20, +-1.33392230423974528e-07, +-1.47295347937547872e-08, +-1.71961292360881489e-09, +-2.14830278399564130e-10, +-2.91027134379816013e-11, +-4.33283841706383114e-12, +-7.17592972028600305e-13, +-1.33387973041848508e-13, +-2.78957931970894187e-14, +-6.65358091678338511e-15, +-1.95376425682766494e-15, +-5.12367762351341322e-16, +-5.51333350895060556e-17, +-3.78890871580634108e-17, +-4.51838641044758826e-17, +-2.50679049057120362e-17, +-9.32959497582021703e-18, +-2.74811256730466613e-18, +-6.99866409739428482e-19, +-1.66055854477490806e-19, +-4.14234805380997566e-20, +-1.34714769431794535e-20, +-6.46869920775001606e-21, +-4.14343879621936651e-21, +-2.92971643083473243e-21, +-2.13181358923572602e-21, +-1.62039911343657772e-21, +-1.17773275590858953e-21, +-8.74910542742216002e-22, +-6.98202278463875153e-22, +-5.84982503709014718e-22, +-4.36666109832954082e-22, +-3.37111334118409480e-22, +-2.77418216829252579e-22, +-1.96968280102947041e-22, +-1.58611500163384713e-22, +-1.11642750743812169e-22, +-1.28882072201605153e-22, +-4.56513777483376918e-23, +-4.73134636504994076e-23, + 9.24530979851715192e-09, + 9.98056781880192174e-10, + 1.13252246085713774e-10, + 1.36553130787609795e-11, + 1.77080787313672517e-12, + 2.50110119723325362e-13, + 3.89376986407497715e-14, + 6.74944730901288942e-15, + 1.31007196156097730e-15, + 2.78041775981906216e-16, + 7.05209693210618161e-17, + 2.69120334496823696e-17, + 4.27042106688110952e-18, +-8.43134110684346600e-19, + 4.14031656906949894e-19, + 6.48621768657121946e-19, + 3.27506009861288778e-19, + 1.12144870580866103e-19, + 3.09553951480188521e-20, + 7.52056644219061458e-21, + 1.72472816827658447e-21, + 3.83983788259714452e-22, + 1.44205269023599810e-22, + 8.75198921310185701e-23, + 3.56546681743604800e-23, + 4.18134677767426221e-23, +-3.15061488824387087e-23, + 5.07886719563273710e-23, + 2.41293638198972784e-23, + 2.01235486562120061e-23, +-1.19714386927987862e-23, +-1.28560198540963076e-23, +-1.87248901449052945e-23, +-8.06423040545275873e-24, + 3.28808003054471717e-23, + 1.57059105977697911e-23, + 5.20046482993008198e-23, + 1.53056578692002628e-23, + 2.44175100479198908e-23, + 2.38218912051815142e-23, +-5.75201352202389634e-10, +-6.08596029432085263e-11, +-6.73432389217296153e-12, +-7.86946058752894386e-13, +-9.81910845541554523e-14, +-1.32369938736550504e-14, +-1.95037726919282022e-15, +-3.17274916633163378e-16, +-5.76005100498758378e-17, +-1.17019266662529006e-17, +-2.17227368919332116e-18, +-8.11358071114336176e-19, +-3.76954702650289359e-19, + 1.38119838179315766e-20, + 2.57184757925852623e-20, +-6.59406240700844534e-21, +-8.38140340518240998e-21, +-3.69475379818149564e-21, +-1.14915370574922195e-21, +-2.70659360781257411e-22, +-1.81118360682109855e-23, +-1.86849377328884188e-23, + 5.34241935381905076e-23, + 4.19203335187395355e-23, +-4.21412995533163445e-24, + 2.03204246985508185e-23, +-2.71778741172580608e-23, + 3.77780363015364813e-23, + 2.17040961544406507e-23, +-8.88677031015483449e-24, + 7.21945101989292290e-24, + 2.75658802021968856e-23, +-2.19750899771082338e-24, + 1.77715547251597933e-24, + 2.39362047007510798e-23, + 2.16704615077481343e-23, + 1.87916254064168620e-23, +-1.74044467362834034e-23, + 5.23807184841221587e-23, + 3.16083668525802222e-23, + 3.24840159586551595e-11, + 3.37597957228902669e-12, + 3.65305009803686082e-13, + 4.15186923561261547e-14, + 5.00642720738520466e-15, + 6.47534197330397298e-16, + 9.08397981114618524e-17, + 1.39615679582659963e-17, + 2.36450585892039244e-18, + 4.61942780068178883e-19, + 9.30356449128146790e-20, + 6.40577017754493300e-21, + 1.46500998515262328e-20, + 3.57495477338935015e-21, +-1.14549255627128114e-21, +-3.19055498271848832e-22, + 9.44533839493227978e-23, + 1.06691321657681133e-22, + 3.77564977723313613e-23, + 5.32116290201728530e-23, + 3.43981961388620593e-23, + 4.43962369295799926e-24, + 4.01125799978111126e-23, + 1.31000203775186469e-23, + 5.46164892015172683e-24, + 1.67401634454631440e-23, +-7.79197302108116393e-24, + 1.42094758759007751e-23, + 3.69262038099501124e-23, + 1.22345656744075269e-23, +-6.61417278755227688e-24, +-1.54771202230761840e-23, +-1.49814457097645538e-24, +-1.21950044496122430e-23, + 2.45972957585942236e-23, + 2.13373520991998649e-23, + 2.68161244702172064e-23, +-1.79205603603848272e-23, + 3.19537060950661046e-23, +-1.91008731622421296e-24, +-1.68028632999859065e-12, +-1.71850202017516066e-13, +-1.82283201161998625e-14, +-2.02116743366557998e-15, +-2.36418449413113605e-16, +-2.94721544935371624e-17, +-3.95741797092732627e-18, +-5.78680475630628647e-19, +-9.27876019327143124e-20, +-1.59360532760452723e-20, +-4.30187840187045365e-21, +-1.22572364899654150e-22, +-4.67591039068170247e-23, +-2.52103633905706471e-22, + 1.91090002199999035e-23, + 2.56185389020799542e-23, + 6.66127857113294948e-24, + 2.88815385416373538e-23, + 2.29826468852540055e-23, + 5.31719964785902402e-23, + 4.33689443992412730e-23, + 1.39746769693243154e-23, + 2.81782610083734918e-23, + 2.31574634925531085e-23, +-3.51432594167561503e-25, + 3.43201958740981410e-23, +-4.44726180811144514e-24, + 3.21997574083233713e-23, + 2.93179425029506968e-23, + 7.69882767646450410e-24, + 9.23744755189746960e-24, + 1.60067919466084282e-23, +-9.73585866389680705e-24, + 8.42058168800602185e-24, + 1.31140113833454508e-23, +-1.90587407470022428e-23, + 3.59049093749384825e-23, + 7.54610608602648148e-24, + 1.25006965827457430e-23, + 1.73930935218685448e-23, + 8.01995940119969703e-14, + 8.08451153213346073e-15, + 8.42283739973117858e-16, + 9.13167190387729714e-17, + 1.03947970771908079e-17, + 1.25264672061160489e-18, + 1.61150606831422490e-19, + 2.25684108969465754e-20, + 3.46932907654851231e-21, + 5.69480710565019492e-22, + 6.22703011623070957e-23, + 2.40966099948017612e-23, +-2.38813208294848552e-23, +-1.13375322899740797e-23, + 2.88146854734906652e-23, +-1.13066154997189507e-23, +-6.55696837944976240e-25, +-2.79696665909756274e-24, + 1.39683991408644871e-23, + 2.47096265278217664e-23, + 2.57243417000617754e-23, + 9.86845848848657795e-24, + 1.68738927857218352e-23, +-3.56741289261535889e-24, +-1.38875662276629730e-23, + 2.26315038280140548e-23, +-1.45296672944396894e-24, + 2.34267855371041211e-23, + 2.85321615317928729e-23, +-1.33712899478490131e-23, + 2.88688880545173419e-24, + 9.36922083071004821e-24, +-6.00982285759267929e-24, + 1.02170302240249217e-23, + 3.62849540740810770e-23, + 7.22233750535816785e-25, + 2.88588887620927301e-23, + 1.51212009567261808e-23, + 2.68139509103382138e-23, + 1.44945373446607311e-23, +-3.56704718338323743e-15, +-3.55563108051164627e-16, +-3.65501067173058265e-17, +-3.88961609080813804e-18, +-4.41094405238580549e-19, +-5.24353368879103692e-20, +-7.20932878297396332e-21, +-1.14352198489335661e-21, +-3.23103287163528595e-22, +-3.90542324313094531e-23, +-1.03783835270511855e-23, +-9.64370958332728124e-24, + 5.12658471404001126e-24, +-3.00001894843239205e-23, +-1.26185696865914845e-23, +-1.10903267821229531e-23, +-2.33390835167049570e-23, + 2.70678278071682056e-24, +-7.69513703741519130e-24, +-4.11827108797029465e-24, + 5.87356845663565443e-24, + 5.96294910339057304e-24, +-8.84338677726801077e-25, + 7.24837517230499374e-25, +-2.40113263368758242e-24, +-1.98470751061234162e-23, +-8.27741197579325175e-24, + 1.16496187380919616e-23, +-6.24042345575732394e-24, +-1.92136799907506817e-23, +-1.37685557172917901e-23, +-1.19309254679689950e-23, + 2.64302278554415168e-24, +-1.06913787944986504e-23, + 2.69886504294319552e-23, +-3.32498235590328198e-24, + 1.38707170436644083e-23, +-8.61677540344193475e-24, +-1.29234305648596457e-23, +-5.63339315843689594e-24, +// root 2 + 6.65001913266645039e-01, + 6.24616968037956299e-01, + 5.81952393055789274e-01, + 5.38224823402755681e-01, + 4.94761622791499045e-01, + 4.52769163816896414e-01, + 4.13159334492142094e-01, + 3.76488393307529867e-01, + 3.43010893953280938e-01, + 3.12808261925642317e-01, + 2.85901967794947753e-01, + 2.62257131198748439e-01, + 2.41705141347512531e-01, + 2.23921210006351984e-01, + 2.08499222127383088e-01, + 1.95042892549188468e-01, + 1.83213046377726951e-01, + 1.72735354889866299e-01, + 1.63391371547152942e-01, + 1.55006680180137552e-01, + 1.47440765003877566e-01, + 1.40579253976137158e-01, + 1.34328128431228655e-01, + 1.28609391504077325e-01, + 1.23357794795307799e-01, + 1.18518335628442342e-01, + 1.14044321631674592e-01, + 1.09895858122128820e-01, + 1.06038654317541670e-01, + 1.02443072624962980e-01, + 9.90833651505802354e-02, + 9.59370557785963890e-02, + 9.29844364323913486e-02, + 9.02081536351248270e-02, + 8.75928670309441965e-02, + 8.51249656648360581e-02, + 8.27923309348878034e-02, + 8.05841374979153480e-02, + 7.84906852227062329e-02, + 7.65032566848853623e-02, +-1.94662111924539007e-02, +-2.08707873242114893e-02, +-2.17289347310494763e-02, +-2.19277499510109920e-02, +-2.14713351579275541e-02, +-2.04732014512199224e-02, +-1.91080769923230934e-02, +-1.75506182686064084e-02, +-1.59235854415666830e-02, +-1.42779259391470573e-02, +-1.26294125743263291e-02, +-1.10239961928994407e-02, +-9.54557934234204382e-03, +-8.26021780918901119e-03, +-7.18272212986535447e-03, +-6.29129593790385411e-03, +-5.55276024828470303e-03, +-4.93622127709959172e-03, +-4.41677480089201335e-03, +-3.97518117847541364e-03, +-3.59665077334509658e-03, +-3.26972706307553790e-03, +-2.98543812862354235e-03, +-2.73667978486305617e-03, +-2.51776820160597549e-03, +-2.32411234175894594e-03, +-2.15197119514264242e-03, +-1.99827167138071603e-03, +-1.86047043690478787e-03, +-1.73644798277799452e-03, +-1.62442660793491052e-03, +-1.52290634029250281e-03, +-1.43061444801961574e-03, +-1.34646534387126765e-03, +-1.26952850744160026e-03, +-1.19900264386657747e-03, +-1.13419473076240419e-03, +-1.07450292444706509e-03, +-1.01940253390600858e-03, +-9.68434449033369954e-04, +-2.02515959902442670e-04, +-1.45036690690908464e-04, +-6.73493580752751821e-05, + 1.75518408933068921e-05, + 9.43739103579662152e-05, + 1.51842925438673353e-04, + 1.86142838030170168e-04, + 2.00931984526660722e-04, + 2.04977634159869622e-04, + 2.06321546541525774e-04, + 2.04988638844933358e-04, + 1.94681508019566832e-04, + 1.73645173946201893e-04, + 1.47472356526450534e-04, + 1.22356456397839503e-04, + 1.01131050726319187e-04, + 8.40715713715671406e-05, + 7.05156317774472367e-05, + 5.96940013977286410e-05, + 5.09717002294174357e-05, + 4.38680287546990756e-05, + 3.80252094453394248e-05, + 3.31756287433658092e-05, + 2.91169100226298130e-05, + 2.56941878533304507e-05, + 2.27876055923202590e-05, + 2.03034222057498252e-05, + 1.81676076826309481e-05, + 1.63211720710324800e-05, + 1.47167178786841145e-05, + 1.33158668993411766e-05, + 1.20873196622502388e-05, + 1.10053777675554123e-05, + 1.00488085011731738e-05, + 9.19996505330926970e-06, + 8.44409938242776927e-06, + 7.76882153675568662e-06, + 7.16367122918863704e-06, + 6.61977611219148565e-06, + 6.12957750241933092e-06, + 3.73176949869109047e-06, + 5.77417074636190848e-06, + 6.99672811359907007e-06, + 6.94455238093664482e-06, + 5.70757913786852494e-06, + 3.82131490516193270e-06, + 1.94582343836129573e-06, + 6.41167271244264678e-07, + 1.50860165462784212e-07, + 7.20282620384778073e-08, +-3.96935935825140935e-07, +-1.34750634873776142e-06, +-2.07257898299220260e-06, +-2.20361921480462750e-06, +-1.94765872554635160e-06, +-1.58878958136059182e-06, +-1.26413250406428499e-06, +-1.00546116142776115e-06, +-8.06410072730769975e-07, +-6.53515101855342878e-07, +-5.35042429218131341e-07, +-4.42211230307983564e-07, +-3.68663273531572237e-07, +-3.09789373422840619e-07, +-2.62212887904813042e-07, +-2.23429374246858688e-07, +-1.91558768944295524e-07, +-1.65173721661591827e-07, +-1.43179194074928406e-07, +-1.24726906458839712e-07, +-1.09153784113341224e-07, +-9.59371517191155793e-08, +-8.46617619256180309e-08, +-7.49952850611461759e-08, +-6.66699144426748566e-08, +-5.94684379919101745e-08, +-5.32136029407674212e-08, +-4.77599309521927259e-08, +-4.29873718390708861e-08, +-3.87963484706832226e-08, + 1.38691627551379200e-07, + 1.09118373805330883e-07, + 3.87659694862958338e-08, +-4.42440394474752884e-08, +-1.04605557224689331e-07, +-1.24350097666905203e-07, +-1.04300504008005099e-07, +-5.58720738807615601e-08, +-9.55068052672446820e-09, +-9.94944202336053066e-09, +-4.97666528814866805e-08, +-6.02120484544891057e-08, +-2.66352220042235854e-08, + 7.46584018290186324e-09, + 2.14914934996094025e-08, + 2.20766509663446027e-08, + 1.82611404989503812e-08, + 1.41652435247722458e-08, + 1.08581375191522185e-08, + 8.37192068635873786e-09, + 6.52447372347296282e-09, + 5.14244826132340736e-09, + 4.09672584593902264e-09, + 3.29599868609189705e-09, + 2.67591947200121906e-09, + 2.19069452437532499e-09, + 1.80731904994959040e-09, + 1.50170341682660164e-09, + 1.25605450662512755e-09, + 1.05708360803750302e-09, + 8.94763275143500977e-10, + 7.61453931692344763e-10, + 6.51282868694991180e-10, + 5.59697484487840893e-10, + 4.83140702156710662e-10, + 4.18812590704826417e-10, + 3.64493841058468008e-10, + 3.18413693212521383e-10, + 2.79150549844940271e-10, + 2.45556351634104453e-10, +-3.22224263267048526e-10, +-2.63346186900720292e-09, +-4.15348762252058108e-09, +-3.83536043873094630e-09, +-2.05600017712046715e-09, + 6.29585316893465055e-11, + 1.85982373014356584e-09, + 2.74330388456840990e-09, + 1.45470445611156018e-09, +-1.46917543774503911e-09, +-1.80009937888768563e-09, + 8.63384051754887264e-10, + 2.04415587430085333e-09, + 1.21056950549565537e-09, + 2.71204522907517858e-10, +-1.35528510217656760e-10, +-2.15090653799927169e-10, +-1.87505792716843024e-10, +-1.43532211435877458e-10, +-1.06708919565916923e-10, +-7.94598726111537683e-11, +-5.97832722490915356e-11, +-4.55213535810709291e-11, +-3.50672491805494263e-11, +-2.73080617325585362e-11, +-2.14794483680425342e-11, +-1.70516860317128406e-11, +-1.36529635556591150e-11, +-1.10188595500532081e-11, +-8.95897173246466761e-12, +-7.33460718228163051e-12, +-6.04366481477116944e-12, +-5.01015897222452343e-12, +-4.17707066220958172e-12, +-3.50119153913840571e-12, +-2.94952477187868855e-12, +-2.49664123639254012e-12, +-2.12284903867150811e-12, +-1.81274339176386114e-12, +-1.55420918211478101e-12, +-9.14748918487575102e-11, +-9.06790291760109471e-11, +-2.78394401044624431e-11, + 5.11334882790312844e-11, + 8.83467067025522781e-11, + 8.41292685825650706e-11, + 6.26035595499753304e-11, + 6.11295961373123756e-13, +-1.07708636876136389e-10, +-9.92641685701706109e-11, + 7.62767534784041856e-11, + 1.04748565735409996e-10, +-6.44785649586512723e-12, +-4.70672381868028768e-11, +-2.77833641076726689e-11, +-8.10201515221801037e-12, +-5.98713036601748086e-14, + 1.79851347587995252e-12, + 1.73604675781927189e-12, + 1.32566056159982166e-12, + 9.60937824999577422e-13, + 6.93760773216701702e-13, + 5.05612115178291382e-13, + 3.73058854553785954e-13, + 2.78684466749811125e-13, + 2.10607661030332632e-13, + 1.60880151959496110e-13, + 1.24135189588364084e-13, + 9.66691746055883255e-14, + 7.59289889729431030e-14, + 6.01272606045923185e-14, + 4.79652320055729898e-14, + 3.85442770035873724e-14, + 3.11773010523033644e-14, + 2.53744374712849324e-14, + 2.07710943295682529e-14, + 1.71098941065793959e-14, + 1.41543418575758612e-14, + 1.17682779439191706e-14, + 9.83896920618173805e-15, +-1.02386255712460284e-12, + 1.21997323234887506e-12, + 2.96013115459647513e-12, + 2.28271345970481823e-12, + 4.06272943449363698e-13, +-5.04855435972568108e-13, +-1.20226634277345613e-12, +-3.41335713924213675e-12, +-3.20227917402772017e-12, + 4.49829437645822886e-12, + 5.41200211872406879e-12, +-3.09089433763085130e-12, +-3.28013243761951495e-12, + 1.01862912142406181e-13, + 8.89883390330014872e-13, + 4.74876934971398170e-13, + 1.40882719366829028e-13, + 1.65333941105513691e-14, +-1.28087661157349470e-14, +-1.46263867850382310e-14, +-1.12509405649656211e-14, +-7.98161585768543997e-15, +-5.59584156042091601e-15, +-3.96816205702827636e-15, +-2.84016599266595158e-15, +-2.06386311333539838e-15, +-1.51297261654332662e-15, +-1.12051977655884472e-15, +-8.45585398485178152e-16, +-6.42933448775292209e-16, +-4.86113549135114771e-16, +-3.82788769927651820e-16, +-2.91916586049422049e-16, +-2.28215043288416327e-16, +-1.79198255236743224e-16, +-1.43191172595536554e-16, +-1.11146135865624464e-16, +-9.34953869965942144e-17, +-7.83678449192843418e-17, +-5.72161030453571403e-17, + 5.17211378452852447e-14, + 7.69690323150590138e-14, + 1.96131120413076499e-14, +-5.40926428879572182e-14, +-4.92137307711567554e-14, +-1.27243984973065860e-14, +-4.40524392720407044e-14, +-7.44773304315256360e-14, + 1.34473260843798492e-13, + 2.49732170769404932e-13, +-2.19806411214882021e-13, +-1.76087399713834735e-13, + 1.12031349966187667e-13, + 6.72330338583700879e-14, +-5.39751355312067908e-15, +-1.41875487995963022e-14, +-6.57302759421072955e-15, +-1.87116304351477811e-15, +-2.85380428964260032e-16, + 7.82650799102672062e-17, + 1.05078975725028695e-16, + 8.89993033347852627e-17, + 6.90774537401447684e-17, + 4.13821679420343237e-17, + 3.67801347527906494e-17, + 1.91877135817978504e-17, + 1.42216593759074242e-17, + 1.37406110410736577e-17, + 7.80390585685894147e-18, + 1.05597625469176222e-18, + 4.47849100590982490e-18, +-5.89785410125066633e-18, + 2.81012545246333781e-18, + 5.76063082851567565e-18, + 3.52981196998559111e-18, + 7.94970552295653101e-19, + 3.01641974989374295e-18, + 8.72076655679130916e-20, +-4.75065841349093462e-18, + 7.61442445857885220e-19, + 1.53273039267639885e-15, +-4.43199021335406136e-16, +-2.40520865116649033e-15, +-1.12202849626666260e-15, + 1.16033043767653956e-15, + 3.29767204622810490e-16, +-1.78955214315612803e-15, + 1.58360727389684094e-15, + 8.77704744043417935e-15, +-6.88749642357780591e-15, +-1.09104298981953475e-14, + 1.04109527460669277e-14, + 2.59665980303419048e-15, +-2.87745350470735904e-15, +-9.21459341672711815e-16, + 1.53382238389653349e-16, + 2.03982458533263168e-16, + 8.10627867108608816e-17, + 2.95690780533109696e-17, + 5.51824778571755394e-18, +-2.11822206755331290e-18, + 1.70569276764515173e-18, + 6.23440259936419245e-18, +-3.42397406820894101e-18, + 2.57766649601318976e-18, + 2.69824264050611054e-18, + 6.03049288419044044e-18, + 1.12119048427798909e-17, + 3.61660387723327824e-18, +-1.10441266850296165e-19, + 6.99521940391717476e-18, + 1.50353585870124714e-18, + 3.06216836924756426e-18, + 4.72349609004173848e-18, + 5.27550507745900882e-18, + 2.70546477423622351e-18, + 3.37434933448381829e-18, + 1.52092590858216639e-18, +-2.12915299037795812e-18, + 2.92207893017818656e-18, + 1.34668804088777507e-17, +-5.16975963235938898e-17, +-2.76433298930451128e-17, + 7.99773575402633891e-17, + 4.32098861117582209e-17, +-4.03115413097081935e-17, +-2.80491620728957522e-17, + 2.17423546692279864e-16, +-8.25674890757044588e-18, +-5.98534777215603232e-16, + 5.56394706712839184e-16, + 1.72424369916732553e-16, +-2.94517346548899630e-16, + 2.27360689708955640e-17, + 5.33020527583317860e-17, + 1.11007719798963067e-17, + 4.44550459042774964e-18, +-3.45680961552193954e-18, + 9.06148086716722576e-18, + 1.99953409561569639e-18, +-8.10571164092427811e-18, +-2.54875909909383020e-18, + 7.98069852595954596e-18, +-4.03767219623220190e-18, + 1.84586823155476383e-18, + 2.07485136030895369e-18, + 3.95436909931606806e-18, + 4.15851542452513894e-18, + 4.68916690087721945e-18, + 2.32379727068219691e-19, + 4.07179547010328724e-18, +-3.62442722101573958e-18, + 1.41580940798290062e-18, + 4.68357118105525540e-19, + 8.58683612838684748e-19, + 3.26702351364758449e-19, + 4.30513084460178164e-18, + 4.96852392107790212e-19, +-1.26701338305665809e-19, + 1.54471464880801465e-18, + 1.04993503462554732e-17, + 8.31322559625249864e-18, + 7.16883154442211109e-18, + 1.22066121578138625e-17, +-3.00043342068322287e-19, + 1.05793725214867249e-17, +-7.77603667053856433e-18, +-1.15896887774183027e-17, +-2.50118738355054843e-17, + 2.49118660322363883e-18, + 5.57639941995132504e-18, +-2.83333132471337110e-17, + 5.78432914575386109e-18, + 2.65600182635007901e-17, + 1.37503293607400735e-17, + 4.58862894319751979e-18, + 1.40576453049105350e-17, + 7.83423664363846621e-18, + 1.17236047458672888e-17, + 1.03904866220793589e-17, + 9.78080359187024857e-19, + 5.38296268095482761e-19, + 8.79829412484389605e-18, + 2.51101612143706041e-18, + 6.66106876520390437e-18, + 6.51178362042067322e-18, + 2.89429504555706531e-18, + 6.40224287352789790e-18, + 4.96141279953856740e-18, + 4.02085656982790309e-18, + 2.24240617663447917e-18, +-3.35924718774714206e-19, + 5.90481442075419604e-18, + 3.77691205581869585e-18, + 3.78745365327252965e-18, + 6.05710120420379572e-19, + 7.20774665062694109e-18, + 5.54668620015545863e-18, + 1.68689677394388301e-18, + 2.86264395753460268e-18, + 3.74958726473774746e-17, + 1.91961160059718686e-17, +-1.90171056710180122e-17, + 9.43184981251932151e-18, + 7.24026528609202453e-18, +-5.46085231494522483e-18, + 2.38495085995106299e-19, +-3.76472223005979650e-18, + 1.32692151710771605e-17, + 1.42452589967791695e-17, +-2.02972613924550852e-18, + 5.75871355947845709e-18, + 7.75060940046645845e-18, +-4.46513304985101710e-19, + 2.24705605867709179e-19, +-3.53548374803762147e-18, + 3.11188878528153713e-18, +-1.95676861079973137e-18, +-2.64259085136772459e-18, + 1.70228420964515419e-18, + 1.35067863383784956e-18, +-2.82297600571048136e-18, + 1.33383509669613639e-18, +-2.35323878711793078e-18, + 2.65868494679984952e-18, + 3.45955991447193294e-20, + 4.08069360350756977e-18, + 5.39644375176263021e-18, + 2.39755042566213467e-20, + 6.99004748842067544e-19, + 1.95434883852465745e-18, +-5.35093680636057465e-19, + 2.16265643764988207e-18, + 3.05220985845144138e-18, + 5.97355265370653794e-19, + 1.54388205891165675e-18, + 4.08407051826637649e-18, + 2.00135883218804359e-18, +-7.17866608193466296e-19, + 2.36600614434564645e-18, +-3.51737942283662632e-18, +-1.98095033928244667e-17, +-1.25664146541070773e-17, +-1.57197496875322038e-18, +-2.40876126244157050e-18, + 1.09636543335102723e-17, +-1.10767572286400494e-17, +-8.55184011679035776e-18, +-8.76817430598928250e-18, +-9.69578942875631090e-18, + 2.19600191571479319e-18, +-2.98141578019052863e-18, +-1.23712957970988432e-18, +-3.85956418232166926e-18, +-3.61628275173938679e-18, +-5.96739115280348371e-18, +-6.61085801856320875e-18, +-4.89186332666391940e-18, +-5.40590413746629914e-18, +-5.11923488749638662e-18, +-8.25699519971492409e-18, +-1.49649553229117969e-18, +-6.36915439083350120e-18, +-7.54405798557854131e-18, +-2.01397545170925670e-18, +-3.14748852100934984e-18, +-6.67670784429046144e-18, +-2.63418454697329737e-18, +-5.59079825832302646e-18, +-5.75111195440914415e-18, +-3.29670160142311280e-18, +-4.88293520670249847e-18, +-3.67291112024310334e-18, +-1.82685916361650739e-18, +-5.99370397891123996e-18, +-3.31707828375205101e-18, +-3.46041992675922649e-18, +-2.48495679484912464e-18, +-2.48252144782037710e-18, +-5.84454006408488336e-18, + 6.44418546707024448e-02, + 1.48557952707889934e-02, + 4.18310013450061673e-03, + 1.44879169048531221e-03, + 6.13834309009535901e-04, + 3.12939218544827777e-04, + 1.87489624237077468e-04, + 1.28605933614824806e-04, + 9.84620109550594306e-05, + 8.21458855817427784e-05, + 7.29669283830067749e-05, + 6.75138472415589489e-05, + 6.39283959594968412e-05, + 6.12444492260275233e-05, + 5.90166790149377880e-05, + 5.70603525584061135e-05, + 5.52985585814391576e-05, + 5.36934072983685440e-05, + 5.22210522685380427e-05, + 5.08636993437347685e-05, + 4.96070234083775054e-05, + 4.84391436597828153e-05, + 4.73500668800259033e-05, + 4.63313093183032580e-05, + 4.53756138650988745e-05, + 4.44767307047882270e-05, + 4.36292443188313661e-05, + 4.28284355152018479e-05, + 4.20701703684530848e-05, + 4.13508100735176669e-05, + 4.06671372113794608e-05, + 4.00162950078780211e-05, + 3.93957369633301488e-05, + 3.88031848230325712e-05, + 3.82365933038312128e-05, + 3.76941203295702031e-05, + 3.71741017865845255e-05, + 3.66750300097222839e-05, + 3.61955353643556794e-05, + 3.57343704112143086e-05, +-4.62466652140177611e-02, +-9.47561094860407960e-03, +-2.29859694074484007e-03, +-6.63114896380294448e-04, +-2.26146161413783448e-04, +-8.97369484934273774e-05, +-4.04610741449526806e-05, +-2.01311457498038928e-05, +-1.07058851092767802e-05, +-5.92966174145255973e-06, +-3.41689931844538275e-06, +-2.12911180874939941e-06, +-1.50415226393546942e-06, +-1.20112614206742741e-06, +-1.03522915246060035e-06, +-9.24672808228450982e-07, +-8.38949040893162405e-07, +-7.67399497902850120e-07, +-7.05867621224804827e-07, +-6.52225126366991701e-07, +-6.05065928821061332e-07, +-5.63331715132406208e-07, +-5.26184969624811144e-07, +-4.92949042781093440e-07, +-4.63070717941830529e-07, +-4.36093539702344800e-07, +-4.11637863426028273e-07, +-3.89385620101722054e-07, +-3.69068533194131356e-07, +-3.50458911552047685e-07, +-3.33362389057146506e-07, +-3.17612150926543520e-07, +-3.03064306129875156e-07, +-2.89594151181142506e-07, +-2.77093132889938641e-07, +-2.65466363414375343e-07, +-2.54630574884502630e-07, +-2.44512426252179889e-07, +-2.35047094185658475e-07, +-2.26177094408797130e-07, + 9.32341825418649475e-03, + 1.73087634671336798e-03, + 3.73315024140033328e-04, + 9.41642924646724497e-05, + 2.77556030291674819e-05, + 9.48916513201062673e-06, + 3.71908608740878205e-06, + 1.64798848011148867e-06, + 8.09462513139807242e-07, + 4.23760772446796935e-07, + 2.21814162563301800e-07, + 1.09984565153362262e-07, + 5.23877792530648421e-08, + 2.66222952118524823e-08, + 1.62299140011587571e-08, + 1.19032483714168820e-08, + 9.69797346841308596e-09, + 8.25768239301269608e-09, + 7.16198315869688461e-09, + 6.27366731672447558e-09, + 5.53520482068480964e-09, + 4.91350309322438637e-09, + 4.38544426117881350e-09, + 3.93356868273699011e-09, + 3.54429314175177280e-09, + 3.20689127400048444e-09, + 2.91280211957226123e-09, + 2.65513055015957708e-09, + 2.42827710393914132e-09, + 2.22765974730658129e-09, + 2.04950239475500774e-09, + 1.89067257746331950e-09, + 1.74855570235922549e-09, + 1.62095682704477328e-09, + 1.50602332033851812e-09, + 1.40218351445628121e-09, + 1.30809770205001965e-09, + 1.22261873654889064e-09, + 1.14476015720677090e-09, + 1.07367025075015061e-09, +-1.33957350642275826e-03, +-2.28744060891831037e-04, +-4.47050546970463846e-05, +-1.00791917454201597e-05, +-2.62614264762210203e-06, +-7.87188776773211912e-07, +-2.68903770528905845e-07, +-1.03615079100617827e-07, +-4.50341169681359430e-08, +-2.23828468156183182e-08, +-1.23507340503537269e-08, +-6.69810977942833920e-09, +-3.18968790737556682e-09, +-1.32246164826349530e-09, +-5.27315577129445307e-10, +-2.40924141030460577e-10, +-1.42108013087229838e-10, +-1.02636640045018574e-10, +-8.15403549347686678e-11, +-6.72025508727861136e-11, +-5.62900600851987074e-11, +-4.76230354467788089e-11, +-4.06118967050080248e-11, +-3.48762196486849577e-11, +-3.01417705281720363e-11, +-2.62026661631518390e-11, +-2.29014690081775863e-11, +-2.01163227219560077e-11, +-1.77519581520396444e-11, +-1.57332139211321972e-11, +-1.40002935838751366e-11, +-1.25052524097591835e-11, +-1.12093675357256795e-11, +-1.00811504465754472e-11, +-9.09483126441640406e-12, +-8.22919312646282588e-12, +-7.46666868366776530e-12, +-6.79263451193424005e-12, +-6.19485625715707319e-12, +-5.66304936146599296e-12, + 1.51560060203026638e-04, + 2.40839152590297286e-05, + 4.32561759163388357e-06, + 8.85945792114763380e-07, + 2.07727200915745797e-07, + 5.56753837408140895e-08, + 1.69437195663728641e-08, + 5.77583431264572216e-09, + 2.15553819569109090e-09, + 8.83684119603797695e-10, + 4.45839863621119906e-10, + 2.78585525051209704e-10, + 1.63239129042898987e-10, + 7.63036604883344793e-11, + 2.90019853753299964e-11, + 9.91340490386474024e-12, + 3.60348849386973739e-12, + 1.68526870617319479e-12, + 1.04981355767891955e-12, + 7.70816489480093917e-13, + 6.03847825912074217e-13, + 4.85144375819684179e-13, + 3.94977361881491844e-13, + 3.24697261179871295e-13, + 2.69153545019094681e-13, + 2.24799985515507028e-13, + 1.89062231037913400e-13, + 1.60029599621401263e-13, + 1.36264687471952319e-13, + 1.16674268819145475e-13, + 1.00418775302923120e-13, + 8.68475689293243417e-14, + 7.54521860713301226e-14, + 6.58321217605746743e-14, + 5.76695719441251305e-14, + 5.07106077670522495e-14, + 4.47509980564666593e-14, + 3.96254859893278440e-14, + 3.51995499303128132e-14, + 3.13630987549720299e-14, +-1.42574879933550223e-05, +-2.12799056790063613e-06, +-3.55090936849173127e-07, +-6.68782394394551506e-08, +-1.42943898878478407e-08, +-3.47007569251388512e-09, +-9.53954179346876601e-10, +-2.95677353639898777e-10, +-1.01770561660806618e-10, +-3.59255988956354539e-11, +-1.21037273054787825e-11, +-6.32540684377431681e-12, +-5.22762286740671900e-12, +-3.34056485900910923e-12, +-1.50944250527100156e-12, +-5.32397877173771901e-13, +-1.63701036807440677e-13, +-5.06448351870789755e-14, +-1.93025782459207798e-14, +-1.02411846787544727e-14, +-6.88618241407119731e-15, +-5.12416396699585763e-15, +-3.95819102995453671e-15, +-3.11045256159113740e-15, +-2.47228274070698455e-15, +-1.98374953519371468e-15, +-1.60539421106992285e-15, +-1.30944446186992715e-15, +-1.07585223738768485e-15, +-8.89951647953358653e-16, +-7.40842025489438843e-16, +-6.20379552428559590e-16, +-5.22393546801492508e-16, +-4.42179445059166609e-16, +-3.76123254633438861e-16, +-3.21417639055856643e-16, +-2.75873204613928908e-16, +-2.37761404711873027e-16, +-2.05717620976309716e-16, +-1.78655578432364279e-16, + 1.15373778283503251e-06, + 1.62969531779999080e-07, + 2.54887847425102609e-08, + 4.45787767892175800e-09, + 8.77613502443007537e-10, + 1.94960345210758954e-10, + 4.87755115534907350e-11, + 1.36879218735291694e-11, + 4.36745177154368493e-12, + 1.60755749596965883e-12, + 5.08493382037120131e-13, + 6.94901256128750732e-14, + 5.72732171830525603e-14, + 8.84090944565224118e-14, + 5.88840378102678603e-14, + 2.50409840529824347e-14, + 8.20779965796203054e-15, + 2.32516840638128969e-15, + 6.41841725406225775e-16, + 2.07967100655596547e-16, + 9.44945011946788228e-17, + 5.78865071479815472e-17, + 4.08921274480653757e-17, + 3.04318718728870587e-17, + 2.31422928110499614e-17, + 1.78337086300173402e-17, + 1.38836717156896126e-17, + 1.09107271177001016e-17, + 8.65360460292071944e-18, + 6.91575711083781374e-18, + 5.56743090912869607e-18, + 4.51149592041921794e-18, + 3.68339667038046415e-18, + 3.02494329863410840e-18, + 2.49986248713812011e-18, + 2.07718036764748487e-18, + 1.73302627828819772e-18, + 1.45452294250947736e-18, + 1.22591575304250861e-18, + 1.03731310955568467e-18, +-8.21942102831331063e-08, +-1.10575084270302335e-08, +-1.63285272830104812e-09, +-2.67345929416406012e-10, +-4.88949764507953799e-11, +-1.00291515821044980e-11, +-2.30753241811577335e-12, +-5.91389966675921606e-13, +-1.65653983053419012e-13, +-5.61527296464419645e-14, +-2.64741023424263464e-14, +-5.72944219061123691e-15, + 2.06910862980013544e-15, +-2.43673177333745240e-16, +-1.41811028244883688e-15, +-9.00849464117912630e-16, +-3.53002051939805162e-16, +-1.07639614397912125e-16, +-2.84658452717161064e-17, +-7.21899383918187573e-18, +-2.06290324410945618e-18, +-8.20747540065812631e-19, +-4.57904076749043178e-19, +-3.06079670795607202e-19, +-2.22536637057818384e-19, +-1.60827011395682251e-19, +-1.21978017354632473e-19, +-9.42397916632070540e-20, +-6.80632433669920712e-20, +-5.26253855347799860e-20, +-4.15020855809081709e-20, +-3.39696606795865702e-20, +-2.63443385877051728e-20, +-2.09016953581319505e-20, +-1.44415749835885984e-20, +-1.23516275414330192e-20, +-9.21568544510163903e-21, +-6.52178095205240965e-21, +-6.18717686916143281e-21, +-4.84832017552476958e-21, + 5.24235319811294541e-09, + 6.75284998403247883e-10, + 9.47354379975357552e-11, + 1.46205732821238338e-11, + 2.50216933485636676e-12, + 4.77289181342942820e-13, + 1.01695827355742226e-13, + 2.42419080830923157e-14, + 6.31999627638814909e-15, + 1.52749239835069129e-15, + 6.90487714647602444e-16, + 5.14210094110276829e-16, + 4.15496633721845593e-18, +-8.02074118922767054e-17, + 1.55547567756247088e-18, + 2.12928827274547626e-17, + 1.19679131188054544e-17, + 4.28304375169578832e-18, + 1.21803676920999772e-18, + 3.03451997495719646e-19, + 7.48599146469813681e-20, + 1.62497021477741980e-20, + 5.42738122486176747e-21, + 4.53203231917693390e-21, + 1.75346992915905719e-21, + 1.58537819630919994e-21, + 3.44072671209927531e-23, +-2.43196294591944039e-21, + 1.57606504001895930e-21, + 1.64026064182590974e-21, + 1.14126293505945540e-21, +-1.82728469524875922e-21, +-1.23672685073136698e-21, + 1.17665671940401745e-21, + 2.22569146913881876e-21, + 2.57290614329363687e-21, + 1.27208714053039683e-21, + 7.52206078563679088e-22, +-5.73764551720318000e-22, + 1.31165018528884952e-21, +-3.03155941191363084e-10, +-3.75640066882997242e-11, +-5.03320049400889833e-12, +-7.36527494570331392e-13, +-1.18697413573767283e-13, +-2.11921803232943063e-14, +-4.20272284466486671e-15, +-9.26598828770156504e-16, +-2.35552557346438694e-16, +-6.12022593378179913e-17, +-5.98160673005432608e-19, +-1.36438752013121386e-17, +-9.17909473227843833e-18, + 2.12225806766863439e-18, + 1.48741538108726317e-18, +-1.00662674179653929e-19, +-2.84973537030390940e-19, +-1.36708360298989759e-19, +-4.51436398213995249e-20, +-1.14597204593248922e-20, +-1.41818593789820842e-21, +-1.11776613998255007e-21, +-7.16111407163053554e-24, + 7.50215593300998560e-22, +-6.86193555437520831e-22, + 8.69655943940396204e-22, +-2.36605517090695480e-22, +-1.59373331775747634e-21, + 2.43771383568620312e-21, + 1.12685266582106458e-21, +-4.47652487167227838e-23, +-9.26925962889673866e-22, + 2.77528611582766328e-22, + 6.43874666245738888e-22, + 1.84028859361491237e-21, + 6.87256133225106918e-22, + 1.10720568047290276e-21, +-8.99951853686741565e-23, + 3.36055152565739843e-22, + 2.42860964401416571e-21, + 1.60533097730954335e-11, + 1.92110480971621525e-12, + 2.46990657480427391e-13, + 3.44475983607428776e-14, + 5.25666386137149602e-15, + 8.83548707500719506e-16, + 1.64225401175686737e-16, + 3.36426393989894903e-17, + 7.49356051497358605e-18, + 2.60764844621623781e-18, + 3.18987212465928373e-19, +-3.60872399743678999e-19, + 4.13179240471223810e-19, + 8.94048587094963098e-20, +-5.79923836537807809e-20, +-1.78315862118543606e-20, + 5.81961615887234297e-21, + 5.05818291420202442e-21, + 1.19209250816187288e-21, + 1.01611692290054946e-21, + 6.89756052821265644e-22, +-1.85973946538956733e-21, +-9.04189129549833812e-22, + 1.00202220291543635e-21, +-3.29012073621512125e-22, + 1.06418960583128475e-21, +-1.41565055912652923e-21, +-1.44377874526689580e-21, + 1.39650307106839698e-21, +-4.91143612742246361e-22, +-3.35014566977221898e-22, +-2.59426814774495355e-22, +-7.69540711382786823e-22, + 6.04190618982830570e-22, + 6.63662438656680803e-22, + 2.22390298851170581e-21, + 8.35707489332810190e-22, + 1.56908759490971317e-21, + 2.00467279635954181e-22, + 7.03444121018414372e-22, +-7.84659564063607396e-13, +-9.10050795333083211e-14, +-1.12721814032673931e-14, +-1.50526028885915259e-15, +-2.18635112522393179e-16, +-3.47772572665056113e-17, +-6.10090660626689819e-18, +-1.19541148303307178e-18, +-2.46608978471438151e-19, +-5.00819094194265344e-20, +-5.41841329903332633e-20, + 1.93269822140019620e-20, + 6.29344216533831342e-22, +-7.04319333569948153e-21, + 1.27303475943408513e-21, + 6.76310488693388272e-22, + 4.44738835714221945e-21, + 2.07385806960741064e-21, + 4.02174111906535478e-22, + 7.77611969396706674e-22, + 2.98427127706989470e-21, +-3.01531887808477100e-22, + 1.31570104722197779e-21, + 1.02810060038449011e-21, + 1.10916381477954500e-21, + 1.27795388564862848e-21, +-1.14224626757723871e-21, +-1.51519763308976375e-21, + 1.79009543850541658e-21, + 7.56065748080138327e-22, + 1.18877984878952520e-22, +-7.21788234740427343e-23, + 2.56340639765110735e-22, + 1.24724649824343259e-21, + 7.23681146362247749e-23, + 2.92507103982662907e-21, + 2.00149567684180077e-21, + 5.97795189826573595e-22, +-9.61382419428977145e-23, + 1.90289520350688811e-21, + 3.56214967604915228e-14, + 4.01441299118762057e-15, + 4.80025284014396981e-16, + 6.14709724530788131e-17, + 8.50117491275051762e-18, + 1.26533137065315090e-18, + 2.00072269328236702e-19, + 3.34074561769970586e-20, + 6.09312555460278283e-21, + 9.86396822890759780e-22, + 2.82206464510747584e-21, + 1.61159504710360032e-21, + 1.00598348315840887e-21, + 1.27514830126795995e-21, +-3.80261661734622198e-22, +-9.53854927126195629e-22, + 3.52872422224001457e-22, + 5.06497221249534615e-22, +-1.83410376123276262e-22, +-1.26318368101294829e-22, +-2.81236724312252640e-22, +-1.51078792156434708e-21, +-1.71142623657717605e-21, + 2.93811782856357206e-23, + 5.90989316469448949e-22, + 1.18038737494552145e-21, +-1.20490799337929991e-21, +-3.03830804153689228e-22, + 1.05409429271608304e-21, + 5.56397380266038739e-22, +-3.53987509727262278e-22, +-3.44453934657970265e-22, + 8.28435340984428414e-23, + 1.92644159764284863e-21, + 1.96089049421107282e-21, + 7.38907988395731551e-22, + 4.00908444219482903e-22, + 3.43801662453631774e-22, +-6.22911227499484646e-22, + 8.40701595478038037e-23, +-1.53588184842494186e-15, +-1.70764310109728852e-16, +-1.99836529116396554e-17, +-2.61282513662782432e-18, +-3.89826541668818909e-19, +-7.34381985584630666e-20, +-2.13931727242369547e-20, +-3.22015471160973288e-21, +-1.61791961685999419e-22, +-2.35207994093969231e-21, +-7.37134408793266220e-22, + 8.51920090839218029e-22, + 2.72540083244598465e-22, +-1.17963955900114990e-21, +-1.10383062445723453e-21, +-1.57516113710209852e-21, + 1.54620170649615906e-22, +-1.36500964966328595e-21, +-1.19333211108013824e-21, +-1.53967020111060230e-21, + 4.27048966702754208e-22, +-1.59572484940443192e-21, +-1.86242421917039986e-21, + 1.09227825094728554e-21, +-1.59252390655355457e-21, +-5.55230696496343250e-22, +-1.30654720330919743e-21, +-2.37715327424676883e-21, +-1.51630364602799872e-21, +-6.71334362601929421e-22, +-6.71340531453403267e-22, +-3.46755786649094672e-21, + 5.16438468101691331e-22, +-6.79573066945897843e-22, +-6.15282095622488237e-22, +-1.05524994648005500e-21, +-1.41077421671117371e-21, +-1.23617992083607373e-21, +-1.12841916609895835e-21, +-5.32585341361935758e-22, +// root 3 + 4.51064028394609573e-01, + 4.09417233973975281e-01, + 3.70002722738751788e-01, + 3.33545726216157523e-01, + 3.00427942853726537e-01, + 2.70734824636869265e-01, + 2.44338713642395428e-01, + 2.20985092436089769e-01, + 2.00371582437973011e-01, + 1.82217526738638863e-01, + 1.66303657518067333e-01, + 1.52452802244483626e-01, + 1.40472526602729991e-01, + 1.30127322842406717e-01, + 1.21162697237889513e-01, + 1.13342426625167275e-01, + 1.06467807413296187e-01, + 1.00379044521626326e-01, + 9.49491150997742867e-02, + 9.00766476955955908e-02, + 8.56799836855813846e-02, + 8.16926593164762072e-02, + 7.80600388879326146e-02, + 7.47367972691942994e-02, + 7.16850176597971095e-02, + 6.88727372002032601e-02, + 6.62728222706219089e-02, + 6.38620894876935630e-02, + 6.16206119766206095e-02, + 5.95311668989308360e-02, + 5.75787917771763691e-02, + 5.57504254119371573e-02, + 5.40346151518189474e-02, + 5.24212766377764802e-02, + 5.09014953647958374e-02, + 4.94673618079692484e-02, + 4.81118336705893060e-02, + 4.68286201874992189e-02, + 4.56120844706658785e-02, + 4.44571606973634889e-02, +-2.12375382624648383e-02, +-2.03542645855693295e-02, +-1.90222861707073330e-02, +-1.74152196356957764e-02, +-1.56987383636643177e-02, +-1.40016439296253049e-02, +-1.24082732017725527e-02, +-1.09616095096698590e-02, +-9.66684957730745351e-03, +-8.49847010246222376e-03, +-7.42411284658583102e-03, +-6.43654127043843081e-03, +-5.55623823549108997e-03, +-4.80252106550943091e-03, +-4.17453577209100056e-03, +-3.65607922124728830e-03, +-3.22681236191841182e-03, +-2.86851434280086925e-03, +-2.56665307869115506e-03, +-2.31003599819340098e-03, +-2.09006635335349730e-03, +-1.90008619208765638e-03, +-1.73488173466220235e-03, +-1.59032462471535838e-03, +-1.46311190383836853e-03, +-1.35057565303346922e-03, +-1.25054191656999913e-03, +-1.16122487670664498e-03, +-1.08114656513061879e-03, +-1.00907530421807251e-03, +-9.43978045895442226e-04, +-8.84983134460388021e-04, +-8.31350966842487812e-04, +-7.82450692425780956e-04, +-7.37741572201144305e-04, +-6.96757962010673918e-04, +-6.59097136417325768e-04, +-6.24409355260399472e-04, +-5.92389712922015174e-04, +-5.62771413808915515e-04, + 7.61893215730385411e-05, + 1.42093493545206287e-04, + 1.87630741594244934e-04, + 2.11056576211371877e-04, + 2.15704215244219712e-04, + 2.07042278900557462e-04, + 1.90523391313353660e-04, + 1.71055975359424365e-04, + 1.53149084815208236e-04, + 1.39617852420477630e-04, + 1.29110417840731540e-04, + 1.17330835291190209e-04, + 1.02350668676058935e-04, + 8.61122052555316110e-05, + 7.12056183131353724e-05, + 5.87913380449260969e-05, + 4.88597652372243504e-05, + 4.09785122357059185e-05, + 3.46892052437795722e-05, + 2.96204247014191957e-05, + 2.54923566305229841e-05, + 2.20970056131885185e-05, + 1.92788428739395018e-05, + 1.69202620245555095e-05, + 1.49312681317680990e-05, + 1.32422106932928800e-05, + 1.17986154161763082e-05, + 1.05574623778473891e-05, + 9.48447165484897379e-06, + 8.55209987158125592e-06, + 7.73804489143326219e-06, + 7.02411813445906744e-06, + 6.39538588484225297e-06, + 5.83950950210840551e-06, + 5.34623416712954407e-06, + 4.90698957739036231e-06, + 4.51457575081938946e-06, + 4.16291406169669186e-06, + 3.84684865917211092e-06, + 3.56198708186276954e-06, + 6.15702575021478310e-06, + 4.71550994585495522e-06, + 2.85395922507087624e-06, + 1.09830084174849667e-06, +-2.49339855499248827e-07, +-1.12277857552797233e-06, +-1.56720896732077310e-06, +-1.61701681770628408e-06, +-1.32599567387312004e-06, +-9.47999508733194135e-07, +-8.69140182696510042e-07, +-1.12134670313474015e-06, +-1.34377279306075433e-06, +-1.32604901599204427e-06, +-1.14415431762480006e-06, +-9.26177163953965647e-07, +-7.35220841523843154e-07, +-5.84407490597179963e-07, +-4.68638255852016111e-07, +-3.79770856265583846e-07, +-3.10921572611686503e-07, +-2.56975502243783710e-07, +-2.14235630777727303e-07, +-1.80023135044123862e-07, +-1.52375742173662273e-07, +-1.29838075245158713e-07, +-1.11317600625733119e-07, +-9.59848639804010657e-08, +-8.32035225040145095e-08, +-7.24806284615636976e-08, +-6.34308594361174507e-08, +-5.57504811606129555e-08, +-4.91981873486276950e-08, +-4.35808563447968036e-08, +-3.87428617863562089e-08, +-3.45579785586590885e-08, +-3.09232024898665528e-08, +-2.77539939757004640e-08, +-2.49805901121382738e-08, +-2.25451251777366104e-08, +-6.50519175272151662e-08, +-1.09492601454390489e-07, +-1.17677765787155604e-07, +-9.87541863996351061e-08, +-6.91874260543844845e-08, +-4.05981223078579130e-08, +-1.52806857467083849e-08, + 8.77440767633184204e-09, + 2.50671858671237497e-08, + 1.75970642172734330e-08, +-8.15015418358022963e-09, +-1.89276767207796740e-08, +-6.68590685356530597e-09, + 7.79862888617045672e-09, + 1.35496967624378953e-08, + 1.31008168972468308e-08, + 1.06728704531275466e-08, + 8.24403682867526088e-09, + 6.31214986297784375e-09, + 4.86545434092301888e-09, + 3.79153502325052333e-09, + 2.98836263396329915e-09, + 2.38066891689979030e-09, + 1.91535325438946019e-09, + 1.55501594947801556e-09, + 1.27304461628777831e-09, + 1.05025952271610418e-09, + 8.72661806642305523e-10, + 7.29911635819687969e-10, + 6.14286735261861175e-10, + 5.19960015910205864e-10, + 4.42492012451099832e-10, + 3.78469988353705692e-10, + 3.25248389189613173e-10, + 2.80760125092553506e-10, + 2.43378118235186735e-10, + 2.11812694882976175e-10, + 1.85034851838166290e-10, + 1.62218468377766410e-10, + 1.42696384793384406e-10, +-3.04826478461811728e-09, +-1.30780697029282959e-09, + 4.02162170307770263e-10, + 1.34561751562621992e-09, + 1.51282052724645371e-09, + 1.33141319307305476e-09, + 1.22952738318885871e-09, + 1.12918692744293686e-09, + 3.36274698732049133e-10, +-1.05609987881392163e-09, +-1.17858912913484437e-09, + 1.64039069487507174e-10, + 8.44785264512217213e-10, + 5.18308812878659685e-10, + 8.97687415431435737e-11, +-9.81727761842139449e-11, +-1.29695844160240039e-10, +-1.09972311183263680e-10, +-8.36063509630354597e-11, +-6.20460464220021130e-11, +-4.61814268843289685e-11, +-3.47419206843531823e-11, +-2.64532682891769712e-11, +-2.03781063317255210e-11, +-1.58691177856636389e-11, +-1.24820147373887349e-11, +-9.90898428632537132e-12, +-7.93393358916057957e-12, +-6.40321640939295150e-12, +-5.20619145796595456e-12, +-4.26224909789715282e-12, +-3.51205958938313568e-12, +-2.91148113035547089e-12, +-2.42735740341056460e-12, +-2.03459296866310364e-12, +-1.71401175805374476e-12, +-1.45083735229542336e-12, +-1.23361789987809077e-12, +-1.05340554135609559e-12, +-9.03174196115946856e-13, + 5.70005573501039183e-11, + 7.95381111682665593e-11, + 5.77340099821854622e-11, + 2.10898710925382023e-11, +-3.95058590466598900e-12, +-7.86591092374583595e-12, +-9.07067468713480303e-13, +-1.32335353566909666e-11, +-5.38202892951450995e-11, +-4.58930299782001271e-11, + 3.80561807453249977e-11, + 5.44928211165798409e-11, + 1.31968567070538502e-12, +-2.08579999105136257e-11, +-1.29118700649434823e-11, +-3.62286247754605909e-12, + 2.55232211484777696e-13, + 1.11176337449554284e-12, + 1.02254937376200886e-12, + 7.72947016126370453e-13, + 5.58878182996062453e-13, + 4.03239515487225031e-13, + 2.93834904604973209e-13, + 2.16790031633975353e-13, + 1.61942006306355629e-13, + 1.22392568661226430e-13, + 9.34923527681080262e-14, + 7.21400427635769046e-14, + 5.61767706345447880e-14, + 4.41241240212985452e-14, + 3.49391538237095189e-14, + 2.78754810338320730e-14, + 2.23933562387091725e-14, + 1.81175080555455959e-14, + 1.47493467126136156e-14, + 1.20717568684723489e-14, + 9.93678085793105486e-15, + 8.22402816960330786e-15, + 6.84308132125939880e-15, + 5.71631238300372393e-15, + 1.71089730387479588e-12, +-1.11578718424356674e-13, +-1.24535067088897913e-12, +-1.21123151906397012e-12, +-5.21256030450790122e-13, + 1.85760049888158998e-13, + 1.13414667392735265e-13, +-1.11272898702659931e-12, +-1.25594485516682958e-12, + 2.16683943904948757e-12, + 2.63623964183971935e-12, +-1.38400064578919098e-12, +-1.65394621754773647e-12, +-3.21470154663471921e-14, + 4.09088430841108255e-13, + 2.28584468632145570e-13, + 6.73461175975788817e-14, + 5.97332545007807870e-15, +-8.24248919274658934e-15, +-8.66024259664784919e-15, +-6.56210209051949438e-15, +-4.63715229257227939e-15, +-3.24466682503411361e-15, +-2.30297585882344212e-15, +-1.65350097012644372e-15, +-1.19732182731681857e-15, +-8.75484342294122377e-16, +-6.50159577116322584e-16, +-4.86735982157289764e-16, +-3.73410773048615926e-16, +-2.84113467778156263e-16, +-2.20870971127550866e-16, +-1.74641489015543885e-16, +-1.32088116193630328e-16, +-1.01884932758124289e-16, +-8.30319904861044610e-17, +-6.76720964956041420e-17, +-5.37873003487925508e-17, +-4.21619622905752177e-17, +-3.45451442508379844e-17, +-5.05856413581960939e-14, +-5.29922274065728456e-14, +-1.57890061661989925e-14, + 1.46726960599353571e-14, + 2.53758607927118675e-14, + 1.45476203955765645e-14, +-2.24820562938120628e-14, +-4.27972354000107637e-14, + 5.59400978155322302e-14, + 1.13961268068337367e-13, +-9.95151786791250888e-14, +-8.87839784084824302e-14, + 5.02138437690507246e-14, + 3.44349922180272343e-14, +-1.31809132362957550e-15, +-6.70209572184915047e-15, +-3.23475083142853737e-15, +-9.23863355759918955e-16, +-1.27015497127688111e-16, + 5.46885972298526733e-17, + 6.71112400913019289e-17, + 5.64432039886112211e-17, + 4.28359671121847150e-17, + 2.50810817564762204e-17, + 1.62199334213123258e-17, + 1.72078150007931895e-17, + 1.03385121235840307e-17, + 6.98792746934039173e-18, + 5.68891201778440702e-18, + 1.86499041063782020e-18, + 1.73915602630149181e-18, + 1.05808603898903874e-18, +-1.89203400609046724e-18, + 1.75771915250037871e-18, + 2.63935749945428076e-18, +-4.96577061801863153e-19, +-7.01809735207400340e-19, + 1.09791010301640295e-18, + 2.38819340258568864e-18, + 7.41895174222736046e-19, +-9.66686671414542919e-16, + 7.41642522585611028e-16, + 1.08850363145293937e-15, + 5.59795204936807923e-16, + 4.86175750993180632e-17, +-6.99946421149311389e-16, +-1.23095872649315890e-15, + 7.13038297768488372e-16, + 4.14457891396093311e-15, +-2.98535220290026791e-15, +-5.20725690850103875e-15, + 4.69542703555475184e-15, + 1.47117071549303991e-15, +-1.34497508504808020e-15, +-4.88138612025900348e-16, + 6.54987425809648834e-17, + 9.87035691872881734e-17, + 4.17140553797720806e-17, + 1.49845094164351907e-17, + 1.24871958359144193e-18, + 3.92427862578342730e-18, + 2.55348760771940330e-18, + 7.73149935428872594e-18, + 2.59370665552798330e-18, +-1.59587062300848695e-19, + 5.60117073157129706e-18, + 5.63792502832328581e-18, + 5.80738547293936825e-18, + 4.75160471603954785e-18, + 7.24843250250542263e-19, + 8.95826865467172609e-19, + 1.38914983105557874e-18, +-1.99221425074798772e-18, + 1.33731929055170052e-18, + 3.68975537815120602e-18, + 1.52409578510549993e-18, +-2.27880719877212555e-18, + 1.77316842206798349e-18, + 1.72751632686479413e-18, + 1.80584498563770373e-18, + 5.00060165096408224e-17, + 3.37578572365931219e-17, +-1.18880786899839691e-17, +-3.16846657304609384e-18, + 4.72668251329219582e-18, +-1.80326208348427786e-17, +-1.72175851608914441e-18, + 9.40602185143215470e-17, + 9.16650291230705534e-18, +-2.78520847067644747e-16, + 2.39949731268442565e-16, + 8.93957992800701428e-17, +-1.42983269537163855e-16, + 3.94984589987454860e-18, + 2.73163595813583570e-17, + 5.92356514229742480e-18, + 5.00057685445668895e-18, +-2.18036776000308014e-18, + 1.89598505473484675e-18, +-1.70527014933769844e-18, + 8.43790872378704084e-20, + 3.51373805119930140e-18, + 5.27940804458141532e-18, + 1.45965095663633575e-18, +-2.77464680409781652e-18, + 2.09943455253519990e-18, + 3.75977957935375928e-18, + 2.35628124792208090e-18, + 3.62061254833227726e-18, + 1.04258029491456693e-18, + 1.27945452449206543e-18, +-4.23746259288445193e-19, +-1.87825416892431534e-18, + 2.13392684393953944e-18, + 3.61814824855015606e-18, +-3.44247628897799863e-20, +-4.85573074583804469e-19, + 3.94348232163460726e-19, + 1.39388962821165305e-18, +-3.22905600647230591e-19, + 1.99291906580956659e-18, + 4.76646519299276142e-18, +-4.75783440104985128e-18, +-6.58124357442881959e-18, +-3.41160426600724988e-19, +-1.46367439818657658e-17, +-5.60723963727975380e-18, +-7.41327313607243847e-18, +-5.23221518175206052e-18, + 1.21254438454064485e-19, + 7.08779420452552018e-18, +-1.03526822079567061e-17, + 2.87748974000171486e-18, + 4.93403183857014122e-18, + 1.00997604081663609e-17, + 4.19008086618127044e-18, + 6.50615337467553582e-18, + 7.27372900186598090e-18, + 1.52557949105639598e-18, + 1.42381096656929829e-18, + 1.95933462870304048e-18, + 5.93892861299644530e-18, + 7.61576574067587375e-18, + 1.69608044010647683e-19, + 2.05612749606746198e-18, + 3.65105714485943087e-18, + 3.87947100012050500e-18, + 4.58973015543004177e-18, + 2.91694595575853354e-18, + 1.28384689497501208e-18, + 1.15308866530247072e-18, + 8.55366874544645915e-19, +-1.02465898159111422e-19, + 2.39032792611299702e-18, + 1.21468673116758148e-18, + 1.41733383444925920e-18, + 2.15223691299255818e-19, + 2.06061215180099390e-18, + 1.00498658887733233e-18, + 2.32120196360722776e-18, + 8.03538811599778921e-18, +-1.03561976756059870e-18, +-4.50281851076960751e-18, +-3.33446328142280283e-18, +-4.47462435914133692e-18, +-4.89472171253524650e-18, +-1.42856821177563524e-17, +-5.93132216528032131e-18, +-3.68170554179606715e-19, +-2.10929983648448826e-18, + 4.44078026010150593e-18, + 6.89740008489646488e-18, +-2.01851213197861615e-18, +-6.84161324142325574e-19, + 1.65955929598233968e-19, +-4.96367768750538628e-19, + 1.77458986781462954e-18, + 3.43959030863405703e-19, + 4.93065935085880873e-19, +-1.38818047396479728e-18, +-2.39938284721660386e-19, + 2.91089798475508877e-18, + 3.73925947514270586e-18, +-3.54308208009735907e-18, + 6.11458459439690827e-19, +-1.08788361855743241e-18, + 1.38907314130376351e-18, + 4.55035419710557328e-18, + 2.45563256101959759e-18, + 1.66801751206766405e-18, + 1.81644469125748919e-18, + 1.60421288938798838e-18, +-5.05675100231889031e-19, + 3.09244143207319694e-18, + 1.77227475334274782e-18, + 8.77644749363785575e-19, + 8.08910035080247922e-19, + 1.94427470262821791e-18, + 2.06776813849066572e-18, +-3.22351780632730892e-19, +-6.25671018577361443e-18, +-5.29126207552580786e-18, +-2.00122186546581772e-17, +-8.62354994156318927e-18, +-4.28098541398614438e-18, +-6.59456697842987012e-19, +-6.36123757256472457e-18, +-4.58458898330823810e-18, + 2.41082386818120768e-18, +-6.75147500840759761e-18, +-2.21537369328244578e-18, + 2.23802984865785149e-18, +-3.26973245561559584e-18, +-6.96167876694736198e-18, +-7.10642492864610643e-19, +-6.30999452158108726e-18, +-1.08802545663639460e-18, +-4.15522553273333098e-18, +-3.31951788764329663e-18, +-5.13688431381468682e-18, +-2.13189677050212115e-18, + 1.08571162978343320e-18, +-1.85940945251326238e-18, + 1.39744786981389259e-19, +-5.06036756662315928e-18, +-8.90969642459662082e-19, +-3.94694064189837720e-18, +-3.80449731002573923e-18, +-2.64262706353950574e-18, +-3.69974860671511864e-18, +-3.04150329864851730e-18, +-2.80465129614712006e-18, +-3.99654526493582567e-18, +-2.13066210538703314e-18, +-1.39839694714994619e-18, +-4.61981389667909236e-18, +-2.12571428341723971e-18, +-2.12712135591071914e-18, +-2.77946302864116410e-18, +-1.38053936288417861e-18, + 9.84360688936774531e-02, + 3.70913713782182880e-02, + 1.67815440318335451e-02, + 8.92716329218699693e-03, + 5.44902412680535724e-03, + 3.72465621339260720e-03, + 2.78914031813444745e-03, + 2.24583047021747507e-03, + 1.91486622010176894e-03, + 1.70653479726356246e-03, + 1.57107317305272892e-03, + 1.47812253430989701e-03, + 1.40889645102791161e-03, + 1.35275595848803674e-03, + 1.30439940051698625e-03, + 1.26137342830104859e-03, + 1.22247571592491288e-03, + 1.18700103636751623e-03, + 1.15445363286721539e-03, + 1.12444692042790845e-03, + 1.09666557158981273e-03, + 1.07084719139660688e-03, + 1.04677090430179949e-03, + 1.02424916711892685e-03, + 1.00312154770626581e-03, + 9.83249881189462820e-04, + 9.64514446388796995e-04, + 9.46810915833769143e-04, + 9.30047900575306529e-04, + 9.14144957321159067e-04, + 8.99030958386922872e-04, + 8.84642748886677217e-04, + 8.70924033191871152e-04, + 8.57824445782583785e-04, + 8.45298771455575606e-04, + 8.33306287317488290e-04, + 8.21810204702935342e-04, + 8.10777193563641508e-04, + 8.00176975300805277e-04, + 7.89981972696069995e-04, +-5.01703589110845463e-02, +-1.57117786536252052e-02, +-5.76459705585742697e-03, +-2.43500011041299135e-03, +-1.15958314657727728e-03, +-6.08990010927425857e-04, +-3.45153351804982614e-04, +-2.06766744828934307e-04, +-1.28559875430116162e-04, +-8.22348420614927715e-05, +-5.47622651578665652e-05, +-3.91471231068432515e-05, +-3.06128351115635312e-05, +-2.57853319180323365e-05, +-2.26879925549318482e-05, +-2.03958299447400932e-05, +-1.85369086735952371e-05, +-1.69630111009018547e-05, +-1.56042995452125902e-05, +-1.44187183811671867e-05, +-1.33762198484784355e-05, +-1.24536079128798415e-05, +-1.16324039283893510e-05, +-1.08976554319031341e-05, +-1.02371334610890045e-05, +-9.64074729118838648e-06, +-9.10010411935210623e-06, +-8.60817237765974981e-06, +-8.15902126041586838e-06, +-7.74761718510393108e-06, +-7.36966328774022914e-06, +-7.02147178343601302e-06, +-6.69986166413918346e-06, +-6.40207610204673335e-06, +-6.12571530495550324e-06, +-5.86868158138101683e-06, +-5.62913412328835906e-06, +-5.40545157551682007e-06, +-5.19620088459687843e-06, +-5.00011124202296699e-06, + 7.64356956060296792e-03, + 2.08454353432501382e-03, + 6.60502860749545518e-04, + 2.40415441441751678e-04, + 9.90929020103091838e-05, + 4.55595399566677045e-05, + 2.30403432764628850e-05, + 1.26451405428650554e-05, + 7.38415992017613610e-06, + 4.41731819761069369e-06, + 2.57104061267298586e-06, + 1.41895938590421682e-06, + 7.76468074722625743e-07, + 4.65576980162095869e-07, + 3.24491948075252407e-07, + 2.54669700353102268e-07, + 2.12498547648771810e-07, + 1.82163006814132980e-07, + 1.58255499455989990e-07, + 1.38678797944837088e-07, + 1.22364788648326584e-07, + 1.08622738076539758e-07, + 9.69492312501354808e-08, + 8.69596408413274229e-08, + 7.83539098832833258e-08, + 7.08949467600946005e-08, + 6.43934995084732792e-08, + 5.86971379518823384e-08, + 5.36820745609111876e-08, + 4.92470140489209987e-08, + 4.53084782584093685e-08, + 4.17972175045515334e-08, + 3.86554308141882149e-08, + 3.58345944576954368e-08, + 3.32937522010306511e-08, + 3.09981590856451409e-08, + 2.89181981172530320e-08, + 2.70285092542316144e-08, + 2.53072847470812669e-08, + 2.37356957168857132e-08, +-8.66459776646685310e-04, +-2.10295626334197145e-04, +-5.88382841533366990e-05, +-1.88268604671794346e-05, +-6.81102407725992104e-06, +-2.74907247184247914e-06, +-1.22162478939300011e-06, +-5.93142110532647941e-07, +-3.17825728427077661e-07, +-1.90864667731661625e-07, +-1.21692272693082998e-07, +-7.23943412536969944e-08, +-3.70809138212742204e-08, +-1.69206488696599171e-08, +-7.85160014602750368e-09, +-4.31054306373094880e-09, +-2.90074201091511582e-09, +-2.21706567672543625e-09, +-1.79226458405255045e-09, +-1.48371800062155748e-09, +-1.24406662851202565e-09, +-1.05274803408621683e-09, +-8.97800497600209865e-10, +-7.71009342318150779e-10, +-6.66345799645341540e-10, +-5.79263956327675406e-10, +-5.06284210207257310e-10, +-4.44712810089893454e-10, +-3.92443654602059990e-10, +-3.47815149025096923e-10, +-3.09505370242047421e-10, +-2.76454401012650965e-10, +-2.47806192645076562e-10, +-2.22864626500010894e-10, +-2.01060006309825557e-10, +-1.81923289644893796e-10, +-1.65066113838610236e-10, +-1.50165198074651697e-10, +-1.36950076639883032e-10, +-1.25193388068329332e-10, + 7.99475941295095592e-05, + 1.75411955810339701e-05, + 4.40554374056243269e-06, + 1.26009745726260965e-06, + 4.06940042218039049e-07, + 1.46795760259864510e-07, + 5.83727580107438634e-08, + 2.50348917694476712e-08, + 1.12355943887051997e-08, + 5.49506257581324618e-09, + 3.51821460729391218e-09, + 2.67075001161867412e-09, + 1.71912278581745199e-09, + 8.49102333290018689e-10, + 3.44166897356697313e-10, + 1.31706210184597425e-10, + 5.73683366031409025e-11, + 3.21772727126597842e-11, + 2.21506893524814106e-11, + 1.68359335805395698e-11, + 1.33121141302939530e-11, + 1.07187051323675645e-11, + 8.73073328181463798e-12, + 7.17793574089569190e-12, + 5.95016880124022565e-12, + 4.96966358580107048e-12, + 4.17961020302859490e-12, + 3.53778444361264343e-12, + 3.01241191599310737e-12, + 2.57932537596735444e-12, + 2.21996417514807033e-12, + 1.91994463324089655e-12, + 1.66802622347817423e-12, + 1.45535489224982461e-12, + 1.27490490638829280e-12, + 1.12106255633003248e-12, + 9.89313154738877494e-13, + 8.76003087176014769e-13, + 7.78158693705923190e-13, + 6.93346031251378197e-13, +-6.29759286577929521e-06, +-1.26408390186609420e-06, +-2.88499925177683969e-07, +-7.46563548089636245e-08, +-2.17654523551216818e-08, +-7.08889178646117847e-09, +-2.56148848238715625e-09, +-1.02430507352642596e-09, +-4.37350413905679839e-10, +-1.67229017130862295e-10, +-5.24729718954889776e-11, +-4.25138949988859395e-11, +-4.95365766591330084e-11, +-3.49245480622653056e-11, +-1.65057406733161001e-11, +-6.09645567641336367e-12, +-2.03337674669391955e-12, +-7.33396175787709293e-13, +-3.42090944465210831e-13, +-2.09357512001069339e-13, +-1.49030525951964067e-13, +-1.12712441811400469e-13, +-8.74082493931208517e-14, +-6.87474706738449206e-14, +-5.46525101731711895e-14, +-4.38545469120295001e-14, +-3.54903705881389887e-14, +-2.89478883673725684e-14, +-2.37840311322067964e-14, +-1.96742200471012316e-14, +-1.63778344190864743e-14, +-1.37147740248627258e-14, +-1.15485604385520971e-14, +-9.77523049262213815e-15, +-8.31490679278231068e-15, +-7.10558739968419535e-15, +-6.09870056180117630e-15, +-5.25625281305816411e-15, +-4.54782407922761353e-15, +-3.94947331400651494e-15, + 4.36130694455396734e-07, + 8.08597429007321507e-08, + 1.69353313491520585e-08, + 4.00346495181966880e-09, + 1.06353907599843217e-09, + 3.15111732268996191e-10, + 1.02993698938522419e-10, + 3.70654656657779458e-11, + 1.56903375758872301e-11, + 7.69125902575391084e-12, + 2.08423837792768570e-12, +-5.30503230919935406e-13, + 1.95887693206254226e-13, + 8.41587822008953283e-13, + 6.16429235425921550e-13, + 2.72208432014210743e-13, + 9.24462200884548586e-14, + 2.78199719871340545e-14, + 8.69471866162763585e-15, + 3.43761989163446897e-15, + 1.86264620035387383e-15, + 1.23840953790079244e-15, + 8.96911406846071146e-16, + 6.71629268515595073e-16, + 5.11444166649417358e-16, + 3.94219269727934552e-16, + 3.07036289957623066e-16, + 2.41271515024856363e-16, + 1.91268674232699025e-16, + 1.52853171074457302e-16, + 1.23103391616607599e-16, + 9.97450902709206111e-17, + 8.14083461885602981e-17, + 6.69380220565113429e-17, + 5.53278631325029549e-17, + 4.59278725402619283e-17, + 3.83596420931884360e-17, + 3.21084081498480918e-17, + 2.71086204291240008e-17, + 2.30008118166261075e-17, +-2.70850899815872106e-08, +-4.67555884591476504e-09, +-9.06009290588491338e-10, +-1.97231360880750752e-10, +-4.81140616810984040e-11, +-1.30899753449157494e-11, +-3.93955826139835257e-12, +-1.26967837853077821e-12, +-4.16857101077089066e-13, +-2.19155124444861602e-13, +-1.67621938193022362e-13, +-1.51015674114281509e-14, + 4.04500665071749846e-14, + 3.27973515534855583e-15, +-1.37597916751255488e-14, +-9.48000408031356301e-15, +-3.83529542419707277e-15, +-1.20374570333606306e-15, +-3.33656175983154566e-16, +-9.35378220541652729e-17, +-3.22211121619712466e-17, +-1.55388167778565737e-17, +-9.61849531345587694e-18, +-6.67253551920913141e-18, +-4.88762266572553898e-18, +-3.59105394444486154e-18, +-2.59220736413066232e-18, +-2.02814479688579549e-18, +-1.55636439508798118e-18, +-1.18826685271767450e-18, +-8.82202138482343669e-19, +-7.73628390529706143e-19, +-5.71443868777378085e-19, +-4.08484069138199385e-19, +-2.84062175606311886e-19, +-2.22976566756916727e-19, +-1.89140314814717790e-19, +-1.98692723473221654e-19, +-1.15229524713691807e-19, +-5.12695616160738379e-20, + 1.52995169796781121e-09, + 2.47591250044542596e-10, + 4.47000834210424354e-11, + 9.02282901359849512e-12, + 2.03402088936794342e-12, + 5.10176936741825155e-13, + 1.42202584634861983e-13, + 4.45340264406481043e-14, + 1.35197267850718919e-14, + 1.30951979270831772e-15, + 3.55815922850698643e-15, + 4.27457272609024429e-15, +-5.42183983190621236e-16, +-1.08840608432786841e-15, +-5.63579555611128212e-17, + 2.11730959759179122e-16, + 1.26836130752106779e-16, + 4.65215675047417292e-17, + 1.36203176483269736e-17, + 3.62333368977150902e-18, + 9.41792309272013979e-19, + 3.16588885320428605e-19, + 1.55571155366782334e-19, + 9.11407927376692492e-20, + 2.67881853586538133e-20, +-1.68616405207256812e-21, + 8.50763306584238813e-20, + 1.13799336314453921e-20, +-6.49386534269100465e-21, + 8.15071584664700637e-21, + 5.65186622275164276e-21, +-3.96173484992999130e-20, +-3.42293655502916094e-20, + 2.67318119790590962e-20, + 7.15975827909148308e-20, + 5.34003586447329819e-20, + 2.26666809744522649e-20, +-1.08730976250917233e-20, + 8.16106243466777914e-21, + 5.66103523167668252e-20, +-7.94472553152349832e-11, +-1.21246815095874487e-11, +-2.05194492612164828e-12, +-3.86384392309692435e-13, +-8.09798590253410705e-14, +-1.88343882938718436e-14, +-4.81820642320569062e-15, +-1.37242546025613064e-15, +-5.40443036375965908e-16, +-1.19261984087367042e-16, + 1.43503028488646622e-16, +-1.18975488997504455e-16, +-8.49856923837058547e-17, + 2.93652961264171056e-17, + 1.85315436805027396e-17, +-2.56733093079772164e-19, +-2.87891383092033513e-18, +-1.54394882000647381e-18, +-4.55228407320887675e-19, +-9.38229872108441472e-20, +-4.69590244034841445e-20, +-2.63856038964513147e-20, + 8.31475080521917996e-21, + 8.71443990827812786e-21, +-7.15152338322075122e-21, + 3.37098838885791426e-20, + 6.54654798431546078e-20, + 3.52043296370338430e-21, + 2.44112162388472212e-20, + 2.44644492201534060e-20, + 2.05818158762422951e-20, +-3.19555115355393909e-20, + 9.07304113377495333e-21, + 5.72336511014680629e-20, + 8.61005175742554302e-20, + 6.77919536845068475e-20, + 2.48397828283570421e-20, +-4.37929904784421477e-21, + 1.86893302180170529e-20, + 7.24437402880200626e-20, + 3.82402368425157066e-12, + 5.53246587438180810e-13, + 8.82441141940366743e-14, + 1.55838455418090507e-14, + 3.05218428092797401e-15, + 6.62516166470700568e-16, + 1.58829589741242046e-16, + 3.95703979359465232e-17, + 1.03333570010781897e-17, + 1.19948523327819523e-17, +-2.28201014647248390e-18, +-4.84409028529891167e-18, + 4.31062283176558928e-18, + 8.57004155301382520e-19, +-6.63478855494577382e-19, +-1.98731026568668415e-19, + 5.87700375124815519e-20, + 1.97646723688323845e-20, + 2.96420300848117091e-20, + 3.88784860694077596e-20, +-2.02350865649968856e-20, + 3.99212226800939373e-20, +-9.60595925897365437e-23, + 4.77200499958278890e-20, + 2.21738539036517622e-21, + 7.29083393309586947e-21, + 5.81944708816495338e-20, + 1.33012829826640642e-20, + 3.10904685819466906e-21, + 3.85893675847942947e-20, + 3.82572975392996834e-20, +-1.93393861989650111e-20, +-8.01033338553529030e-22, + 3.42954405853130503e-20, + 5.95098639476238861e-20, + 3.30749114138268815e-20, + 6.22759595328082951e-20, +-1.15748571704320265e-22, + 4.39402984997379281e-20, + 5.88760353884919684e-20, +-1.71742802541049348e-13, +-2.36667109588273147e-14, +-3.57447541991887797e-15, +-5.95447685899175969e-16, +-1.09686359143807170e-16, +-2.23992035267278532e-17, +-5.05984648750217014e-18, +-1.44867397527041262e-18, +-2.15457329094520826e-19, +-5.68934131832022037e-20, +-4.43757996609301044e-19, + 3.01117859988584815e-19, + 1.37845701902350259e-20, +-2.25149080886161078e-20, + 6.13242658644457652e-20, + 6.72279494122426600e-20, + 7.07207562294104676e-20, + 2.46149310395688626e-21, + 7.60447472135276468e-20, + 2.64418412142537572e-20, + 1.82092850655171396e-20, + 3.65390073793592597e-20, + 3.77867161731055752e-21, + 3.27548868157211581e-20, +-4.03919439511197039e-21, + 3.96318720506404942e-20, + 2.22906971511564967e-20, + 3.16704914927400220e-20, + 4.01099834060471510e-20, + 3.41223480871176531e-20, + 1.75321926464893208e-20, +-1.89995891321940725e-20, +-8.11556527328469541e-22, + 3.26717215322358894e-20, + 2.43985307759502447e-20, + 1.64638959591347538e-20, + 2.33794407835291385e-20, + 5.11372362575665069e-21, + 2.55428505932227459e-21, + 3.86773294509908890e-20, + 7.22301611734272311e-15, + 9.47974293146989513e-16, + 1.35296897589676811e-16, + 2.11231875175051480e-17, + 3.59202131967715621e-18, + 5.13316674470605560e-19, + 9.25978530777725151e-20, +-1.16990294921626444e-20, + 4.18129793866674684e-20, +-4.33085065961566193e-20, + 2.23885824347676384e-20, + 5.91246718701451082e-20, + 2.44045041249310803e-20, + 3.73823190894487476e-21, +-1.28662377498098614e-20, +-1.62337601428993316e-20, + 2.01233837799147291e-20, +-3.83217368880906698e-20, + 6.25625442129761719e-20, + 5.02541035101686588e-20, + 3.07225881728011912e-20, + 2.72886939657311679e-20, +-1.25953962510064480e-20, + 4.16575873665411707e-20, +-4.54127157730288614e-21, + 4.57733168911343663e-21, + 3.87302889902058175e-20, + 4.28804748921406253e-21, + 2.63449132854140492e-20, + 1.33139061030102618e-20, + 3.27373932572473004e-20, +-6.75153577580144549e-22, + 2.33879929165014412e-21, + 3.41883676417622302e-20, + 3.59965916321159937e-20, + 1.50131161689626036e-20, + 2.80109088590289110e-20, + 1.01893905339720788e-21, + 4.18409446286391662e-21, + 1.45373500973943083e-20, +-3.09291981161198649e-16, +-4.54400889000419369e-17, +-7.30529854898012468e-18, +-1.40328342199631939e-18, +-5.64521061382947616e-19, +-2.63128403607309582e-19, +-5.12895920043696049e-20, +-4.50052547757684423e-20, + 1.60818521324126332e-20, + 1.44747806273823859e-20, +-2.45083695967291012e-21, + 2.74965302001919761e-20, +-1.66599195743518663e-20, +-2.62349075739247522e-20, +-4.12890880893259033e-20, +-4.55106950420639336e-21, +-3.77164881009179902e-20, +-7.69583339704053270e-20, +-2.17389994762376866e-20, +-2.20353473436595428e-20, +-3.91095157446135735e-20, + 3.77574173883583484e-21, +-9.21267606557391558e-21, + 1.45603670550366318e-20, +-5.60160975151780880e-20, + 2.81210142223749806e-21, + 7.20461526026379630e-21, +-4.23630655837034394e-21, +-3.05896264661420561e-20, +-1.73193154026867200e-20, +-2.10901438642769327e-20, +-2.53659481755329060e-20, +-5.05997345819632223e-20, +-1.75969087105078065e-20, + 9.10436864345656822e-22, + 6.96886966711461534e-21, + 9.31132697699037226e-21, +-1.80180943308873537e-20, +-1.92392750157810569e-20, +-1.51487890537334154e-20, +// root 4 + 2.49436980930355684e-01, + 2.19874212546391334e-01, + 1.94191214800589373e-01, + 1.72041384663840530e-01, + 1.53001091431255204e-01, + 1.36638222809721016e-01, + 1.22549380554594758e-01, + 1.10377014168662108e-01, + 9.98188342032650389e-02, + 9.06362659266846810e-02, + 8.26549561000883698e-02, + 7.57440983085815589e-02, + 6.97825637314724023e-02, + 6.46406255683399655e-02, + 6.01867493793402791e-02, + 5.63019211390067831e-02, + 5.28869767509580896e-02, + 4.98624291574481168e-02, + 4.71651571381459869e-02, + 4.47448006202335324e-02, + 4.25607955262175125e-02, + 4.05801264095987588e-02, + 3.87756534314520340e-02, + 3.71248617187981897e-02, + 3.56089164263049471e-02, + 3.42119402781171297e-02, + 3.29204548817914194e-02, + 3.17229440908916721e-02, + 3.06095094016232971e-02, + 2.95715955169967397e-02, + 2.86017699549346097e-02, + 2.76935446768793517e-02, + 2.68412306766805803e-02, + 2.60398186356524675e-02, + 2.52848803500450199e-02, + 2.45724868313386170e-02, + 2.38991398791688070e-02, + 2.32617146100098648e-02, + 2.26574109481775393e-02, + 2.20837124897709479e-02, +-1.57887773380390901e-02, +-1.37835394681406938e-02, +-1.19182560901335468e-02, +-1.02541125947026995e-02, +-8.80893410842246115e-03, +-7.57504987660449595e-03, +-6.53247057231751138e-03, +-5.65570813868169955e-03, +-4.91492514802831064e-03, +-4.27657119742962805e-03, +-3.71126587902943783e-03, +-3.20575990944837932e-03, +-2.76260966509968156e-03, +-2.38629818341580579e-03, +-2.07382558753515470e-03, +-1.81615998045064203e-03, +-1.60289794767588963e-03, +-1.42491105527422666e-03, +-1.27496306543850146e-03, +-1.14749056245628698e-03, +-1.03822250328255311e-03, +-9.43851486446455057e-04, +-8.61787591385312717e-04, +-7.89980089313951223e-04, +-7.26788263532638767e-04, +-6.70886848135089924e-04, +-6.21195949285591490e-04, +-5.76828477367887990e-04, +-5.37050264324779474e-04, +-5.01249484882233917e-04, +-4.68912981288231322e-04, +-4.39607766064073404e-04, +-4.12966447741031605e-04, +-3.88675656697483449e-04, +-3.66466785478000647e-04, +-3.46108529349128740e-04, +-3.27400837911240110e-04, +-3.10169980745344371e-04, +-2.94264498606262913e-04, +-2.79551863076021195e-04, + 2.55240023862416115e-04, + 2.43867374949543623e-04, + 2.21376658457670430e-04, + 1.94372231649477813e-04, + 1.67089532209470381e-04, + 1.41759821551890980e-04, + 1.19350478195505967e-04, + 1.00382055708662891e-04, + 8.54416773055502790e-05, + 7.47142228484856127e-05, + 6.68538742775431617e-05, + 5.94392821259252333e-05, + 5.12457383065492266e-05, + 4.28933811842234248e-05, + 3.54004455665794953e-05, + 2.92107280296258358e-05, + 2.42720193277535097e-05, + 2.03559783652410772e-05, + 1.72316095673469006e-05, + 1.47136989286385533e-05, + 1.26631102647920672e-05, + 1.09764978101185645e-05, + 9.57659953303070815e-06, + 8.40499474356676508e-06, + 7.41697911836028562e-06, + 6.57795435190945045e-06, + 5.86086080490613614e-06, + 5.24432870018523366e-06, + 4.71132978034124091e-06, + 4.24818211026599794e-06, + 3.84380729526751952e-06, + 3.48917031457568984e-06, + 3.17685297321457548e-06, + 2.90072615756122322e-06, + 2.65569587436204126e-06, + 2.43750489949522760e-06, + 2.24257670374352236e-06, + 2.06789178202336093e-06, + 1.91088900974018274e-06, + 1.76938646945107246e-06, +-2.62472248083813588e-07, +-1.52184394014304388e-06, +-2.13984102761149902e-06, +-2.30640091022052225e-06, +-2.21272326319506852e-06, +-1.99748554962745101e-06, +-1.73152062999668889e-06, +-1.42161543275053169e-06, +-1.06385000481804325e-06, +-7.41981625704184860e-07, +-6.03882311279752374e-07, +-6.48767590955729295e-07, +-7.05944503904141771e-07, +-6.71499671341756958e-07, +-5.71884947962062147e-07, +-4.60917345510087931e-07, +-3.65396150939599130e-07, +-2.90335027249623578e-07, +-2.32798533494717023e-07, +-1.88649028057966071e-07, +-1.54447801831847076e-07, +-1.27650400747888882e-07, +-1.06419712647276013e-07, +-8.94249457508779862e-08, +-7.56913404181630419e-08, +-6.44959480012516969e-08, +-5.52960613935358522e-08, +-4.76796562452259879e-08, +-4.13306347161481428e-08, +-3.60041292545493097e-08, +-3.15087342684972970e-08, +-2.76935723703906389e-08, +-2.44387767282834042e-08, +-2.16484158363220134e-08, +-1.92451836171541843e-08, +-1.71663788393306527e-08, +-1.53608350659697099e-08, +-1.37865579756358146e-08, +-1.24088934417461110e-08, +-1.11990971678391196e-08, +-1.01230319392147806e-07, +-5.69809417360267750e-08, +-2.23108606390689768e-08, +-4.73890534440888161e-10, + 1.07813073584715440e-08, + 1.54106409440106750e-08, + 1.78172429947788473e-08, + 2.10923637960359997e-08, + 2.27974036440565082e-08, + 1.56417120164855768e-08, + 1.58276756117032635e-09, +-5.12067287876926058e-09, +-9.42213151525050321e-10, + 4.83176642431217477e-09, + 7.03084351683255468e-09, + 6.58607694742036274e-09, + 5.31953895116146673e-09, + 4.09883601575864830e-09, + 3.13620452620230349e-09, + 2.41699647695474767e-09, + 1.88343319021905513e-09, + 1.48444676950305146e-09, + 1.18257732510309590e-09, + 9.51435342065161345e-10, + 7.72440822960328560e-10, + 6.32373968726597595e-10, + 5.21707389854911596e-10, + 4.33487247749636709e-10, + 3.62577329037254204e-10, + 3.05141655574972027e-10, + 2.58285670905687538e-10, + 2.19804103489234141e-10, + 1.88001717400943852e-10, + 1.61564340110305136e-10, + 1.39465178971007164e-10, + 1.20895990626355005e-10, + 1.05216137654221281e-10, + 9.19144727799471316e-11, + 8.05806301184189920e-11, + 7.08832031628491790e-11, + 2.27385595281987545e-09, + 2.03805572320315213e-09, + 1.40780300809911476e-09, + 7.97433968926326813e-10, + 3.60821293348732307e-10, + 1.38899940880964902e-10, + 1.31225427422879001e-10, + 1.78153781816243041e-10, +-8.20972855323676869e-11, +-6.25343181752753567e-10, +-6.34459861926070096e-10, +-7.44672845084400941e-12, + 3.29336134594508382e-10, + 2.07306404802321532e-10, + 2.57010811416236246e-11, +-5.42985614813182253e-11, +-6.57903766948286743e-11, +-5.49253307290262530e-11, +-4.15896976051715867e-11, +-3.08316706735610814e-11, +-2.29421009147405280e-11, +-1.72580593133907242e-11, +-1.31404868869477985e-11, +-1.01226586851294781e-11, +-7.88284664354901527e-12, +-6.20033564289696386e-12, +-4.92220124758832835e-12, +-3.94111827468074533e-12, +-3.18074706511661186e-12, +-2.58613063439783761e-12, +-2.11723520536849510e-12, +-1.74458511815686803e-12, +-1.44625002816245106e-12, +-1.20577144285333041e-12, +-1.01066674184794616e-12, +-8.51419641061480768e-13, +-7.20689722773312766e-13, +-6.12788397425500856e-13, +-5.23270384933130698e-13, +-4.48645174236593734e-13, + 7.02498868302014004e-12, +-2.20291917853986135e-11, +-2.76697392446410195e-11, +-2.22741184439441222e-11, +-1.38967991213621677e-11, +-4.49562240362661462e-12, + 2.88025389174857269e-12, +-1.87534055073255070e-12, +-2.03280255734230941e-11, +-1.78215303208930613e-11, + 1.82403036639070862e-11, + 2.55960697664216244e-11, + 1.89563747069769383e-12, +-8.66388816753942572e-12, +-5.53323688347171178e-12, +-1.49504662949385260e-12, + 2.10025969924077498e-13, + 5.71717023201334543e-13, + 5.12006636997145106e-13, + 3.84731455309124917e-13, + 2.77751924008208430e-13, + 2.00326378923802744e-13, + 1.45957859241720112e-13, + 1.07690583230928815e-13, + 8.04479623794275692e-14, + 6.07947406262217339e-14, + 4.64411560145900793e-14, + 3.58294195778847271e-14, + 2.79034878744434402e-14, + 2.19167495502864728e-14, + 1.73569547684441096e-14, + 1.38470478434732588e-14, + 1.11276821625104108e-14, + 8.99745697637882219e-15, + 7.32680205686056422e-15, + 5.99768192239045968e-15, + 4.93820466344499305e-15, + 4.08588349055739906e-15, + 3.39921019370956697e-15, + 2.83997598413169881e-15, +-1.55130565972700574e-12, +-5.50395884877670352e-13, + 6.59607369234512889e-14, + 2.71411895794025225e-13, + 3.20444679055315071e-13, + 3.38724527905249033e-13, + 1.20909307551676221e-13, +-4.98531851496602428e-13, +-5.81344360268948403e-13, + 9.12797145452305061e-13, + 1.14795723488429467e-12, +-6.01810483058411207e-13, +-7.55364967360757093e-13, +-3.68625268234039313e-14, + 1.74874412738832209e-13, + 1.00538199669089324e-13, + 2.93426612094780234e-14, + 1.91390407565344174e-15, +-4.32704421186985064e-15, +-4.34957492038569628e-15, +-3.27262368159076212e-15, +-2.30541166502882125e-15, +-1.61811637473059711e-15, +-1.14433025467038251e-15, +-8.17094253928534462e-16, +-5.97007288395898490e-16, +-4.36170167140882181e-16, +-3.25260157053144815e-16, +-2.44743472812111609e-16, +-1.85728408919341100e-16, +-1.40649169070377643e-16, +-1.09005088791487753e-16, +-8.32581347850820438e-17, +-6.77211466255508020e-17, +-5.09286917119608204e-17, +-4.01377999370792639e-17, +-3.29279666006576417e-17, +-2.71687013212414143e-17, +-1.98256851295730942e-17, +-1.70469242824977235e-17, + 3.14432059834571071e-14, + 2.69827366857931280e-14, + 1.17463300226270868e-14, + 2.62862508174429687e-15, + 1.23434305823658280e-15, +-1.30066243750378542e-15, +-1.38625703972604090e-14, +-2.00859088831333563e-14, + 2.42687964499238316e-14, + 5.00497562467838867e-14, +-4.21989214391731076e-14, +-3.98509953320208890e-14, + 2.14682187837736402e-14, + 1.57908298407127046e-14, +-2.36103844197556910e-16, +-2.91630730291661395e-15, +-1.44568078902199757e-15, +-4.13782877236349487e-16, +-4.97020915624529256e-17, + 2.87602457481507799e-17, + 3.06251353658873253e-17, + 2.70886506876131683e-17, + 1.53519764288342350e-17, + 1.17379836359725352e-17, + 1.11815608190126498e-17, + 4.99253715681707912e-18, + 6.27047819695454921e-18, + 2.59241431906095366e-18, + 1.35987280567106482e-18, +-3.24951777718278056e-19, + 1.45728601244380357e-18, + 2.83144708428199934e-19, + 1.02701452255144948e-18, +-1.56325841515038241e-18, + 1.54085296751478944e-18, + 1.43672718262517755e-18, + 1.24231570623741506e-18, +-2.63817080193013030e-19, + 5.68286460733572949e-19, +-3.18117850169663833e-19, + 3.13927264164089118e-16, +-3.89565840434323195e-16, +-3.69583227824339267e-16, +-1.26297279466684371e-16, + 4.20793844805949773e-18, +-1.95230794995882244e-16, +-4.37143505031630117e-16, + 3.66188179264734771e-16, + 1.81498386177514476e-15, +-1.26422222567196203e-15, +-2.29581898502536433e-15, + 1.99809051223667823e-15, + 7.02033285161327469e-16, +-5.84193389485645644e-16, +-2.28541518992318186e-16, + 2.81507286342221423e-17, + 4.05823802945749181e-17, + 1.75916316288201358e-17, + 7.96633099361283902e-18, + 1.74193656425750267e-18, +-2.96702692045610001e-18, + 6.23045183891955494e-19, + 1.27132162885653659e-19, + 1.39510366649262584e-18, + 2.37000420737447294e-18, +-9.64272084642251982e-20, + 9.37224335584973507e-19, +-3.95914516035091118e-19, +-1.93951122816546130e-19, +-2.11186237381623533e-19, + 1.85630769040822884e-18, + 4.16437362295989904e-19, + 1.48917349024611198e-18, +-1.31348411562679086e-19, + 1.68916341565910824e-18, + 2.37655172356771872e-18, + 8.60952739302252099e-19, + 6.75808415191687310e-19, + 1.13288934759041804e-18, + 4.18488583330725607e-19, +-2.61907948782055264e-17, +-2.84753822700432412e-19, + 1.82629196586877903e-17, + 6.54884750224423771e-18, +-5.09942803958702413e-18, +-6.75110445612322400e-18, + 1.48819309930939877e-18, + 4.28217177431723374e-17, +-6.47123554512100210e-18, +-1.19348966836335852e-16, + 9.76873684360853715e-17, + 4.45671838606852749e-17, +-5.61450404331347453e-17, + 2.21711842207949117e-18, + 1.19119870072189968e-17, + 5.11750447525239806e-18, +-1.80821129865208463e-18, +-1.07535408285643554e-18, + 3.50447505007728555e-19, +-1.51964062678598155e-20, +-1.33972436464737594e-18, + 1.26591360529458617e-19, +-2.68970658547643572e-19, +-2.95501673034193848e-19, + 2.37741500135077461e-18, + 2.15579416863156101e-20, + 1.28356224362365785e-19, +-6.03389460667884380e-19, +-3.59094504739988441e-19, +-2.50259350014481613e-19, + 1.06488140710159373e-18, + 2.99582411193322712e-19, + 5.49935843613259394e-19, +-2.73392621884610680e-19, + 9.31580083847208112e-19, + 5.52102050860619836e-19, + 8.61028305285301115e-19, +-5.57896189560367333e-19, + 1.29517332380828495e-18, + 1.90736850920984199e-19, + 1.22579267309747678e-17, + 3.87248964515041400e-18, + 2.13228932433276540e-18, +-7.26186273013902842e-18, +-2.46924592320638980e-18, +-1.20370339790767028e-18, +-1.69552337477105652e-18, +-2.65823349527322601e-18, +-8.75781094640489077e-18, + 1.40414268171539638e-18, +-2.38474705533910488e-19, +-7.42491874001237784e-18, +-5.82400835418752254e-19, + 3.36627209656764210e-18, + 3.69187392477678629e-18, + 4.26511738358636993e-18, + 3.13246727314661637e-18, + 1.78367492983038902e-18, + 3.07917578863234782e-18, + 1.21385989220195799e-18, + 2.95883758998194483e-19, + 9.70268811941899650e-19, +-4.09561790362485095e-19, + 2.72246657715429830e-18, + 2.70077594560623336e-18, + 1.97162797283627478e-18, + 1.04888849608141270e-18, + 1.05704511003345643e-18, +-3.95387790834264943e-20, + 3.89174968965142415e-19, + 7.01928501606181324e-19, + 3.95174552718732714e-19, + 1.41883580834807123e-18, +-4.07465484382426455e-19, + 2.45134326314687455e-18, + 1.43266955215354826e-18, + 3.52854292155768201e-19, + 8.07449811334458669e-19, + 1.10634238136486793e-18, + 4.94792463465306228e-19, +-1.44258867701831711e-18, + 7.20760535166382151e-18, + 1.53030025837957263e-18, +-2.94261848107791304e-18, + 1.53768279904766445e-19, +-7.36901379692331871e-19, +-3.12016570670303250e-18, +-2.75785767584014310e-18, +-3.21526556738596535e-18, + 1.07301435808106646e-18, +-3.28116169745278845e-18, + 5.37148961879497548e-19, + 8.17243845815969602e-19, + 4.39223906730963806e-19, +-1.78393922763264011e-18, + 4.03618438543208089e-19, +-4.48028108919405257e-19, + 1.23535708497901010e-19, +-5.03906670658145523e-19, +-3.61761489513482178e-19, +-6.64127893093468050e-19, +-1.09142767851270212e-18, +-1.09665604601132939e-18, +-3.54280416475653116e-20, + 1.15135432552321663e-18, + 1.72549879322027981e-19, + 2.36246982930288303e-18, +-1.90763529736958925e-19, + 2.14266359742706988e-19, + 3.75072956084214296e-19, + 5.16647921221825472e-19, + 4.81324351051610547e-19, + 1.46008060592150595e-18, + 3.47399669644183711e-19, + 9.39404064034313493e-19, + 1.22018568908764422e-18, + 5.40487370265131405e-19, + 8.11724010038352293e-19, + 1.94417569458688053e-19, + 1.71165784560258921e-19, +-1.06872992940687616e-17, +-7.15688081204060895e-18, + 2.36697840247469477e-19, +-2.02294165674186476e-18, +-3.74105649833187785e-18, + 9.97035355834466995e-19, +-3.26871514584643397e-19, +-3.09186954460414920e-18, + 2.77606239631321579e-18, + 2.30954176412098562e-19, +-2.48558499750738028e-18, + 1.35839949610168233e-18, + 1.35269600572149814e-18, +-4.14378368519399435e-18, +-2.61218510498305550e-18, +-3.45486626923112994e-18, +-2.24747143081410932e-18, +-1.52315226153244108e-18, +-1.34570169695078691e-19, +-4.65603460288396497e-19, +-1.08453256753133914e-18, +-5.07908389892103712e-19, + 2.33999745513422785e-19, + 2.17629456700048091e-19, +-1.44516650685830356e-18, +-6.33198419789778898e-19, +-2.03290458258625252e-18, +-2.60110620360338237e-18, +-1.68853033441818810e-18, +-2.33684611965950274e-18, +-1.43158483426216708e-18, +-2.59872116921460582e-18, +-1.45905681250511546e-18, +-9.09921451093666237e-19, +-1.08713191485415217e-18, +-8.57320668000753920e-19, +-6.07440980610687433e-19, +-8.23392880055783925e-19, +-1.20713398281875131e-18, +-1.14179019992183834e-18, + 1.38834806221969531e-01, + 7.99610671464099920e-02, + 5.18381084297629413e-02, + 3.69240360232876985e-02, + 2.83183941314375139e-02, + 2.30072155575016569e-02, + 1.95507242544669217e-02, + 1.72066215932907933e-02, + 1.55653894952375374e-02, + 1.43844425314741137e-02, + 1.35075957301640237e-02, + 1.28278044419473259e-02, + 1.22730142462028936e-02, + 1.17991309704858615e-02, + 1.13816941715231337e-02, + 1.10073691509197675e-02, + 1.06681818904590994e-02, + 1.03586584293797832e-02, + 1.00746359767082492e-02, + 9.81277664437357235e-03, + 9.57033586570063717e-03, + 9.34502514782874910e-03, + 9.13491720682776953e-03, + 8.93837543997161310e-03, + 8.75399980140033167e-03, + 8.58058456063712574e-03, + 8.41708493998262995e-03, + 8.26259049878834244e-03, + 8.11630370774140027e-03, + 7.97752255763312448e-03, + 7.84562633431725234e-03, + 7.72006390033684597e-03, + 7.60034397731962439e-03, + 7.48602703752102114e-03, + 7.37671849876793927e-03, + 7.27206298219209429e-03, + 7.17173944198381055e-03, + 7.07545701485074851e-03, + 6.98295146676412935e-03, + 6.89398213799078015e-03, +-4.19257674455023183e-02, +-1.91443027023336203e-02, +-9.77206483927139415e-03, +-5.46305119122303395e-03, +-3.28594960940737594e-03, +-2.09489863865768705e-03, +-1.39798737229465610e-03, +-9.66388811057684871e-04, +-6.86951071152745794e-04, +-5.01887950902203239e-04, +-3.80455284990323416e-04, +-3.03049953331337597e-04, +-2.53974318255328034e-04, +-2.21118836864080928e-04, +-1.96972396485437374e-04, +-1.77749609108954649e-04, +-1.61715509683609302e-04, +-1.48021796041172810e-04, +-1.36173025942737554e-04, +-1.25828334718297569e-04, +-1.16730986368705235e-04, +-1.08679623131199317e-04, +-1.01513181964585939e-04, +-9.51012102993338245e-05, +-8.93369945625275489e-05, +-8.41324763296003969e-05, +-7.94144137720663830e-05, +-7.51214441131230822e-05, +-7.12018106448934274e-05, +-6.76115865072343810e-05, +-6.43132740045882439e-05, +-6.12746907277048199e-05, +-5.84680767865501509e-05, +-5.58693740098149499e-05, +-5.34576399897521387e-05, +-5.12145686787241210e-05, +-4.91240957889996970e-05, +-4.71720721451494347e-05, +-4.53459918351895543e-05, +-4.36347648197985536e-05, + 4.38695349782223208e-03, + 1.71825050069162656e-03, + 7.56571664495057656e-04, + 3.68202827649658697e-04, + 1.95048527281271102e-04, + 1.11000654707467793e-04, + 6.71357662624059439e-05, + 4.27175765865909972e-05, + 2.81427227893805519e-05, + 1.86513358633463490e-05, + 1.20494825392847622e-05, + 7.58971369605748566e-06, + 4.90303492974636930e-06, + 3.44530342527057653e-06, + 2.65645658694589795e-06, + 2.17852090071720142e-06, + 1.84448872473634824e-06, + 1.58762710255170909e-06, + 1.38065744781135579e-06, + 1.21014343714979056e-06, + 1.06783535815102672e-06, + 9.47922344475702187e-07, + 8.46052225071728504e-07, + 7.58875760562062902e-07, + 6.83775665588108895e-07, + 6.18683099949615728e-07, + 5.61946538826639479e-07, + 5.12235765575382364e-07, + 4.68470516976012591e-07, + 4.29766813594147816e-07, + 3.95396161695947526e-07, + 3.64754235987385132e-07, + 3.37336621315900620e-07, + 3.12719862796183799e-07, + 2.90546545254588807e-07, + 2.70513457816112802e-07, + 2.52362140116412660e-07, + 2.35871281188839426e-07, + 2.20850570060387439e-07, + 2.07135691648741476e-07, +-3.63535941993195478e-04, +-1.24681163745219879e-04, +-4.81620582523483294e-05, +-2.06452634703098152e-05, +-9.68320026571340111e-06, +-4.90535892623727844e-06, +-2.65523052649413106e-06, +-1.53189784779812529e-06, +-9.56603080368873351e-07, +-6.52577074521862675e-07, +-4.55787657979239813e-07, +-2.91485054776717437e-07, +-1.63809470123713389e-07, +-8.67829065175790656e-08, +-4.92858205078302102e-08, +-3.23992738284774949e-08, +-2.40600482405231453e-08, +-1.90743747765646726e-08, +-1.55856218799675268e-08, +-1.29376866737050078e-08, +-1.08548264362327768e-08, +-9.18676614579046848e-09, +-7.83483779428533829e-09, +-6.72840466671699580e-09, +-5.81503788189171851e-09, +-5.05509665771314386e-09, +-4.41822016572609654e-09, +-3.88090142828691688e-09, +-3.42476111856331683e-09, +-3.03529891550188344e-09, +-2.70097871553930819e-09, +-2.41255087832976611e-09, +-2.16254487365210812e-09, +-1.94488584286375302e-09, +-1.75460218160099330e-09, +-1.58760067118406362e-09, +-1.44049216324579010e-09, +-1.31045546440302417e-09, +-1.19513028761270592e-09, +-1.09253250264737989e-09, + 2.56419087520217133e-05, + 7.82244118984929121e-06, + 2.68971362828998315e-06, + 1.02907213819569316e-06, + 4.32616387992407030e-07, + 1.97508642604294636e-07, + 9.65568378340778827e-08, + 4.91893796088713266e-08, + 2.53135896926210766e-08, + 1.43369774862426256e-08, + 1.10175918070197661e-08, + 9.37997879425637891e-09, + 6.40289190365111297e-09, + 3.36731254573444301e-09, + 1.52469775591950818e-09, + 7.04766994359813378e-10, + 3.85491518479487949e-10, + 2.54232636274043548e-10, + 1.87711280601375407e-10, + 1.45831484073025061e-10, + 1.15971556755712306e-10, + 9.35048150768097890e-11, + 7.61852461787412383e-11, + 6.26391982487417974e-11, + 5.19255482942316375e-11, + 4.33690348121908519e-11, + 3.64744465755638561e-11, + 3.08733913608874937e-11, + 2.62885919511229141e-11, + 2.25091499417846946e-11, + 1.93730922915252292e-11, + 1.67548946380949228e-11, + 1.45564630753330926e-11, + 1.27005306676591071e-11, + 1.11257868923961881e-11, + 9.78324215359621926e-12, + 8.63349720123399143e-12, + 7.64466832099420968e-12, + 6.79080321601650345e-12, + 6.05066310411545555e-12, +-1.59762667668050919e-06, +-4.38632630393764774e-07, +-1.35718730124013484e-07, +-4.67982486104086086e-08, +-1.77759442124294395e-08, +-7.36369173741137563e-09, +-3.32100704087316517e-09, +-1.63926346987795047e-09, +-8.23365683841855150e-10, +-3.10525827075400422e-10, +-7.56040004587287233e-11, +-1.14196539011639869e-10, +-1.67669429082622600e-10, +-1.25066568650706537e-10, +-6.18765821850464439e-11, +-2.47498695940447108e-11, +-9.63532332806742248e-12, +-4.39497227936891102e-12, +-2.54054304570474001e-12, +-1.73650761333149107e-12, +-1.28339737600596902e-12, +-9.80550574648068805e-13, +-7.62270690984415668e-13, +-5.99858115020524291e-13, +-4.76925263971414824e-13, +-3.82705812763284660e-13, +-3.09715629558057410e-13, +-2.52621181230010758e-13, +-2.07557248021754251e-13, +-1.71692347886094826e-13, +-1.42925436305580169e-13, +-1.19685163907355423e-13, +-1.00780968106871950e-13, +-8.53067592795605929e-14, +-7.25628188601593336e-14, +-6.20095323052778625e-14, +-5.32222345142326011e-14, +-4.58692703069963442e-14, +-3.96878810187303368e-14, +-3.44667549877891851e-14, + 8.99542770753223502e-08, + 2.24367200266967160e-08, + 6.30162771231664113e-09, + 1.97421896364121530e-09, + 6.82736194903762777e-10, + 2.57280154037035500e-10, + 1.03760483825439966e-10, + 4.56901489970119988e-11, + 2.60288056717174880e-11, + 1.64602446007869359e-11, + 2.83375857391570215e-12, +-3.78195866232316329e-12, + 3.61153826332369060e-14, + 2.79775582775325694e-12, + 2.16592150886230906e-12, + 9.91454612997479485e-13, + 3.57198815937960236e-13, + 1.21448865582350675e-13, + 4.72029370150619468e-14, + 2.38751007927431360e-14, + 1.50487630266585050e-14, + 1.05848030012425559e-14, + 7.78825125586558952e-15, + 5.85506469118070397e-15, + 4.46312569427756315e-15, + 3.44033823921365174e-15, + 2.67893955570000537e-15, + 2.10556636438102254e-15, + 1.66874610023100279e-15, + 1.33353494609644082e-15, + 1.07431525947979725e-15, + 8.70931092739686052e-16, + 7.11052939112790475e-16, + 5.83596694498238869e-16, + 4.82329878776972843e-16, + 4.00198348000373512e-16, + 3.34383925840759872e-16, + 2.80904499654204368e-16, + 2.36522285906343424e-16, + 2.00220654753351059e-16, +-4.64773537830031095e-09, +-1.06145801363237940e-09, +-2.72579567138988644e-10, +-7.80880228401153980e-11, +-2.47442862962166044e-11, +-8.61700259553699227e-12, +-3.24731547232535042e-12, +-1.18868936039314199e-12, +-3.73858589231844256e-13, +-4.12978633544280537e-13, +-4.61630390692386186e-13, + 1.20344707706122475e-14, + 1.70262954130766945e-13, + 2.13146638592304938e-14, +-4.56369856538597576e-14, +-3.30391067001298816e-14, +-1.37662626723071658e-14, +-4.52293673868072232e-15, +-1.38108436133319895e-15, +-4.70848437558875287e-16, +-2.09537325899350600e-16, +-1.21639324047902438e-16, +-8.18301020089774460e-17, +-5.75102379767633632e-17, +-4.15709321600970075e-17, +-3.09010169311463760e-17, +-2.32751500083402848e-17, +-1.74855602689490354e-17, +-1.34482551848217792e-17, +-1.03634524632216495e-17, +-7.48073515180849472e-18, +-6.28438938103426962e-18, +-4.78727996233858215e-18, +-3.87349530466989561e-18, +-3.03112425730344307e-18, +-2.43040729611745689e-18, +-1.71486598728179137e-18, +-1.04097894447529269e-18, +-1.26980461270733404e-18, +-8.65928328254959263e-19, + 2.22782444818080483e-10, + 4.69043600994913816e-11, + 1.10824924618776170e-11, + 2.91979524033734806e-12, + 8.50429101627638634e-13, + 2.71610543044136907e-13, + 9.70380368103809259e-14, + 4.09368999355183044e-14, + 1.05995792120716831e-14, +-8.21671107540651892e-15, + 9.29983537072502639e-15, + 1.36269663899685841e-14, +-2.76417117201556909e-15, +-4.16939021600158085e-15, +-3.25935395769174850e-16, + 7.07435242726361450e-16, + 4.41347143517291047e-16, + 1.66027534757499827e-16, + 5.05672018779190747e-17, + 1.42700737228476366e-17, + 4.54079935872172643e-18, + 1.94389117451618620e-18, + 6.66588892021329098e-19, + 1.25531696266298760e-18, + 9.61497169696748442e-19, + 7.81296736695465230e-19, + 4.61434660574062558e-19, + 1.55988059556335733e-19, +-2.19111108444366092e-19, +-2.95761782932700615e-19, + 1.40470020065956618e-19, + 2.00544881800224789e-19, + 2.02125776971133080e-19, + 1.63108426209825627e-20, + 1.00821665335798615e-19, +-1.41411017045548367e-19, + 1.05383086832882714e-19, + 5.17356999503952319e-19, + 1.91810051904057622e-20, + 1.44721782510977157e-19, +-9.98804547930846337e-12, +-1.95021800017905128e-12, +-4.26332934639264455e-13, +-1.03842413848966594e-13, +-2.80001761235235423e-14, +-8.24694795359454727e-15, +-2.55164778780743128e-15, +-9.52372681540061830e-16, +-8.10080972961460717e-16, +-7.55737050586389363e-18, + 6.35443609961769008e-16, +-4.07519270976326646e-16, +-2.79481716421555695e-16, + 1.12976202996930756e-16, + 6.91270473912832603e-17, + 1.31531282841354703e-18, +-9.43444880195290177e-18, +-4.96780283216413159e-18, +-1.44857526386250621e-18, +-2.36913863358501790e-19, + 2.84411341058475495e-19, +-1.21444447567706130e-19, + 1.18606723478468288e-19, + 5.56792260339863568e-19, + 4.71415454968069738e-19, + 4.38046062269972847e-19, + 6.59196736102590029e-19, + 7.90443257852195492e-20, +-2.55517560659260971e-19, + 1.81165375065849977e-19, + 1.69537152400224551e-19, + 1.44232988921924514e-19, + 4.43751356003721391e-19, +-7.03966165684877155e-20, + 2.16143044139882165e-19, + 1.23064731772105774e-19, + 1.71015990936666159e-19, + 3.66837894147891420e-19, + 1.60881830030919277e-19, + 1.68338088212886761e-19, + 4.21480142988550327e-13, + 7.67327170034361660e-14, + 1.56060227652873866e-14, + 3.52876662747151006e-15, + 8.85602314010816655e-16, + 2.45061897497537853e-16, + 7.44708655377689046e-17, + 1.56086328092137801e-17, + 3.55197467176355459e-18, + 3.45531288498946884e-17, +-1.39781040671533461e-17, +-1.72995327951116134e-17, + 1.54044413227636514e-17, + 3.00952015211855044e-18, +-2.49113399655080328e-18, +-7.18490443254812013e-20, + 3.70719553771863219e-19, + 2.21022653773528857e-19, + 1.22272679212595580e-19, +-7.45506048181962937e-20, + 8.03925896665461942e-20, +-7.05332023052272759e-21, +-1.88881054879792168e-19, + 7.11469472064189510e-19, + 7.70535728969567461e-19, + 1.13005701658211903e-19, + 3.81126882016034919e-19, + 2.03883449631415676e-19, +-5.50411326050792956e-19, + 1.55286958309710895e-19, + 5.81501150328016958e-19, + 1.85038184179631167e-19, + 1.13393482774643951e-19, + 1.42130112832292776e-20, + 1.57648807501745243e-20, + 1.87530223832679942e-19, + 1.50544884946046417e-19, + 4.89528211353693808e-19, +-1.15688595635511653e-19, + 2.48572096135303542e-19, +-1.68248788755604549e-14, +-2.87150807019771452e-15, +-5.43504645265891690e-16, +-1.15297836080392258e-16, +-2.72826166681837294e-17, +-7.23962531664821240e-18, +-2.86813163422128704e-18, +-1.25404743998284329e-18, + 7.53143805656372948e-19, + 2.41967764162494021e-19, +-1.61716427087896693e-18, + 9.11030048659949897e-19, +-2.29265538223795685e-20, + 1.72825687290607850e-19, + 4.29391318968568141e-19, + 6.74825301181315909e-19, + 4.16209912774043945e-19, + 2.04627773210323453e-19, + 4.76252727444807795e-19, + 2.91455648801382155e-20, + 9.35508877986498135e-20, +-2.93967106181243085e-21, +-9.72145123065601174e-20, + 1.79692855396098998e-19, + 7.69692541078288087e-19, + 5.70114866845236301e-19, + 5.39337527645089604e-19, +-8.18492018623155392e-20, + 5.71026433582573446e-20, + 3.07588397181093864e-19, + 2.67406970230192367e-19, + 1.10888419101472325e-19, + 1.87007749133754332e-19, +-6.89561462497770717e-20, + 1.81101635046451458e-19, + 2.24532204447233326e-19, + 4.60854709399302280e-20, + 1.11866724478460898e-19, +-1.85004790137526771e-20, + 1.34795101094885214e-19, + 6.24282276206445751e-16, + 9.83410493867040654e-17, + 1.60700224169029274e-17, + 1.68454514091219064e-18, + 2.59064774858831223e-19, +-7.25447818299986819e-19, + 6.58312694400952876e-20, +-1.97976730385146167e-19, +-6.05682198061554751e-19, +-1.75761625040826239e-19, + 3.86536665239356320e-20, +-2.48125843860878629e-19, + 1.94206062342944550e-19, + 1.72821042491000383e-19, +-1.06643632106748790e-19, +-1.38981367992173417e-19, + 3.29477869103863289e-19, +-1.29801696291837089e-19, + 1.92573881188554100e-20, + 1.32694774454203051e-19, + 2.19621805354249247e-19, +-1.52256630249425701e-19, + 2.00690819276323170e-19, + 5.06146683835395948e-19, + 8.89610047106332690e-20, +-1.59527251480955178e-19, + 3.68822205112130782e-19, + 2.24460650018504006e-19, + 1.88803631687531752e-19, + 1.39992004868662410e-19, + 1.66634870017929466e-19, + 1.24013235190380807e-19, + 1.86386244101631181e-19, +-6.57971750486394495e-21, + 2.02052680990671584e-19, + 9.45202204571796990e-20, + 2.31319241285515994e-19, + 1.54406516304927654e-19, + 4.06506934530072408e-20, + 2.36888670168658121e-19, +-4.76599554147770823e-17, +-1.38767968275291616e-17, +-3.77111014350766963e-18, +-2.35702636413067644e-18, +-1.32718582445449334e-18, +-1.19041971911195310e-18, +-2.56845819895381694e-19, +-1.58239166223315697e-19, + 3.36576227096651392e-19, +-1.24377609361132597e-19, + 1.54058767493263405e-19, + 3.45244755974973993e-20, + 3.25157242130085501e-20, +-4.94939521470131084e-19, +-2.67371535318639724e-19, + 1.63337296193798569e-20, + 2.37916056495850814e-19, +-6.87815153102780560e-19, +-2.14080618814515332e-19, +-1.61273616887591563e-19, +-3.78095219858160743e-19, +-2.15802327311348630e-19, + 1.55652495664583373e-19, + 1.25232680042685067e-19, + 2.59220163351604279e-19, + 1.30315944382683311e-19, +-2.53132519954902439e-19, +-3.61827114687247214e-19, +-1.26658051442968103e-19, + 1.67932605003694308e-20, +-1.44733346415436544e-19, +-3.64628583672310661e-20, +-3.74673412475470238e-20, +-3.27375599346071275e-19, +-1.79876531930672344e-19, +-1.34421696083473852e-19, +-9.57530474743551344e-20, +-2.03736908395070499e-19, +-1.65929986624342169e-20, +-3.37187745205620580e-20, +// root 5 + 9.45204865513796372e-02, + 8.15951141278478398e-02, + 7.09915750027027559e-02, + 6.22303757077800127e-02, + 5.49343216942882531e-02, + 4.88090584863154764e-02, + 4.36248950889520509e-02, + 3.92021489180236909e-02, + 3.54012971918710173e-02, + 3.21176794702522292e-02, + 2.92766363327122033e-02, + 2.68235260244708978e-02, + 2.47105063496502880e-02, + 2.28891601114471731e-02, + 2.13119060478466592e-02, + 1.99362698428065775e-02, + 1.87270457350169270e-02, + 1.76560654097919247e-02, + 1.67009730881819488e-02, + 1.58439355319123232e-02, + 1.50705890037831722e-02, + 1.43692428497794525e-02, + 1.37302869681853439e-02, + 1.31457489414981664e-02, + 1.26089594343687297e-02, + 1.21142963737908890e-02, + 1.16569871207544071e-02, + 1.12329538588627539e-02, + 1.08386915718072518e-02, + 1.04711708668538111e-02, + 1.01277599350507452e-02, + 9.80616139070956093e-03, + 9.50436078197462210e-03, + 9.22058433130810290e-03, + 8.95326403139456301e-03, + 8.70100864481840319e-03, + 8.46257947433983262e-03, + 8.23687001255657587e-03, + 8.02288876508297152e-03, + 7.81974468445420685e-03, +-7.12726530953215927e-03, +-5.82918861191185616e-03, +-4.79920301157663216e-03, +-3.98149958090489135e-03, +-3.32975553331718577e-03, +-2.80736611049257033e-03, +-2.38608599276360529e-03, +-2.04389466539288585e-03, +-1.76238319273865464e-03, +-1.52505122204742876e-03, +-1.31872973252485548e-03, +-1.13681659584910413e-03, +-9.78744989924233005e-04, +-8.45115706889037772e-04, +-7.34365035999633891e-04, +-6.43101148030657808e-04, +-5.67580421072069502e-04, +-5.04554937144113987e-04, +-4.51458812054424260e-04, +-4.06321327844982676e-04, +-3.67629986563559755e-04, +-3.34213626951777420e-04, +-3.05155165397468387e-04, +-2.79728447251593483e-04, +-2.57352501900489944e-04, +-2.37558058546814171e-04, +-2.19962731568828037e-04, +-2.04252406466017293e-04, +-1.90167117584220691e-04, +-1.77490220306426676e-04, +-1.66040007747730493e-04, +-1.55663160961572769e-04, +-1.46229588257711150e-04, +-1.37628326842448577e-04, +-1.29764264006697024e-04, +-1.22555495769823057e-04, +-1.15931185172245577e-04, +-1.09829815042833404e-04, +-1.04197754334365580e-04, +-9.89880753215989690e-05, + 1.81477992887691265e-04, + 1.44177674630758672e-04, + 1.14343414295619430e-04, + 9.09266231075319921e-05, + 7.26736926266245388e-05, + 5.84342061730242131e-05, + 4.72815161856507179e-05, + 3.85974413373805172e-05, + 3.20842988260394406e-05, + 2.74978528622347951e-05, + 2.42021352200680152e-05, + 2.12737996050424817e-05, + 1.82257958005395296e-05, + 1.52119082518501165e-05, + 1.25411230766136376e-05, + 1.03447384747089291e-05, + 8.59489104761678387e-06, + 7.20801415097964542e-06, + 6.10164587421350092e-06, + 5.21005712521074233e-06, + 4.48395145425492648e-06, + 3.88672924892266261e-06, + 3.39103144251624767e-06, + 2.97617137596438006e-06, + 2.62631942273707293e-06, + 2.32922447265605700e-06, + 2.07530482688452579e-06, + 1.85699354199674850e-06, + 1.66826098753255335e-06, + 1.50426245092394808e-06, + 1.36107512172856908e-06, + 1.23549973914948191e-06, + 1.12490955323254109e-06, + 1.02713427201953014e-06, + 9.40370135079079005e-07, + 8.63109678229699984e-07, + 7.94086468328455009e-07, + 7.32231312013204854e-07, + 6.76637326419241277e-07, + 6.26531904255137928e-07, +-3.43387674855527012e-06, +-2.78604392882605214e-06, +-2.20095938107529669e-06, +-1.71853604211419743e-06, +-1.33873095740980719e-06, +-1.04670388693792041e-06, +-8.20202500758166871e-07, +-6.30660023839118471e-07, +-4.57223431625869223e-07, +-3.15535294169454560e-07, +-2.47148040895138619e-07, +-2.47551407597527943e-07, +-2.57511011422364505e-07, +-2.40313092675130422e-07, +-2.03210761865175055e-07, +-1.63380122641465400e-07, +-1.29422178581781552e-07, +-1.02813662890822712e-07, +-8.24342730424258883e-08, +-6.68000168837019641e-08, +-5.46893200313951210e-08, +-4.52004469548107936e-08, +-3.76827493388958474e-08, +-3.16649769562816537e-08, +-2.68019680837085774e-08, +-2.28377292463738417e-08, +-1.95800901842493458e-08, +-1.68831548875918849e-08, +-1.46349945120515235e-08, +-1.27489025437219226e-08, +-1.11571031105374902e-08, +-9.80617119640112103e-09, +-8.65366249057663692e-09, +-7.66560806828574454e-09, +-6.81463419643839620e-09, +-6.07853863944580773e-09, +-5.43920359471054260e-09, +-4.88175905601061405e-09, +-4.39393415322178248e-09, +-3.96555065597782710e-09, + 4.04630301401216820e-08, + 3.92930410097887591e-08, + 3.34939171761414398e-08, + 2.68344809346769499e-08, + 2.07961985115354226e-08, + 1.59279950290810305e-08, + 1.26835746746973802e-08, + 1.12579983298672834e-08, + 1.02646368507519292e-08, + 6.92532218169728489e-09, + 1.65131758925516983e-09, +-9.89740314512782134e-10, + 1.27901207760589159e-10, + 1.89915428337050420e-09, + 2.54932184504564454e-09, + 2.34786463968147486e-09, + 1.88725565481232775e-09, + 1.45213288377116257e-09, + 1.11065993265671560e-09, + 8.55873388939119324e-10, + 6.66919665671938835e-10, + 5.25636712571526249e-10, + 4.18745495804362492e-10, + 3.36899053168404755e-10, + 2.73517871876760805e-10, + 2.23920819881897474e-10, + 1.84734274759111057e-10, + 1.53495913259880838e-10, + 1.28387025655826546e-10, + 1.08049308357348816e-10, + 9.14578102996446672e-11, + 7.78316588779198374e-11, + 6.65705743441333116e-11, + 5.72092175797638691e-11, + 4.93840007090473728e-11, + 4.28087343113448418e-11, + 3.72565677328496832e-11, + 3.25465079977358844e-11, + 2.85332436494322800e-11, + 2.50994279354873555e-11, + 1.65116603363336142e-10, +-2.19931178348084896e-10, +-3.30916163656857579e-10, +-3.24097499863987443e-10, +-2.76037467937288255e-10, +-2.07049324779149125e-10, +-1.14402151110834119e-10, +-3.88353725155707309e-11, +-8.80285685955590091e-11, +-2.45073686688296970e-10, +-2.35292289587394594e-10, +-1.95953087704370869e-11, + 9.93739875673364113e-11, + 6.36714548457727481e-11, + 5.37602915871101195e-12, +-2.03320712373785787e-11, +-2.35717289616497795e-11, +-1.95094240083554994e-11, +-1.47388297404267160e-11, +-1.09195931525991523e-11, +-8.12408206533279051e-12, +-6.11106610391658499e-12, +-4.65299785553248205e-12, +-3.58438934493017273e-12, +-2.79128191008716958e-12, +-2.19551149059599471e-12, +-1.74292977641620833e-12, +-1.39553141357348780e-12, +-1.12628712067582731e-12, +-9.15736744640770558e-13, +-7.49703674077509872e-13, +-6.17749931260215488e-13, +-5.12110880977229347e-13, +-4.26956883299983776e-13, +-3.57873845917921353e-13, +-3.01483850144344880e-13, +-2.55192898215125339e-13, +-2.16984740391176968e-13, +-1.85287911199191634e-13, +-1.58862947558981887e-13, +-2.49085796081314135e-11, +-8.90586115326208695e-12, +-1.39175454358194016e-12, + 1.45336694550387710e-12, + 2.43124860655940470e-12, + 3.38847304338115493e-12, + 4.09689563763848888e-12, + 1.32214667188629717e-12, +-5.52869832935149903e-12, +-5.17945848021338351e-12, + 6.42300170014428139e-12, + 8.80091640484075340e-12, + 8.97804866762218804e-13, +-2.74526342219928834e-12, +-1.78790955461974894e-12, +-4.69084706887952291e-13, + 9.10688638001045018e-14, + 2.06387103541745635e-13, + 1.82127410709637310e-13, + 1.36391666622776935e-13, + 9.83807691294898136e-14, + 7.09388661487660157e-14, + 5.16846325633097064e-14, + 3.81324209634311256e-14, + 2.84853114049720313e-14, + 2.15269065367787993e-14, + 1.64449931941855059e-14, + 1.26882594419861736e-14, + 9.88121723187722840e-15, + 7.76204825696269964e-15, + 6.14580761304762922e-15, + 4.90339026062406879e-15, + 3.93974932001672335e-15, + 3.18711864746993834e-15, + 2.59357330162964646e-15, + 2.12397543991438166e-15, + 1.74843545614183780e-15, + 1.44733552271258222e-15, + 1.20350235233155680e-15, + 1.00559819113808405e-15, + 7.69910088708219209e-13, + 3.94712561677616072e-13, + 1.65178587440135708e-13, + 5.41302380262923428e-14, + 2.73239340293358587e-14, + 4.09220297330714107e-14, +-1.21909939899871563e-14, +-1.99009024426465906e-13, +-2.12667849074295646e-13, + 2.86933695623624199e-13, + 3.73079002611509804e-13, +-1.98904806918742874e-13, +-2.54837388645143518e-13, +-1.66995306005495395e-14, + 5.65275000181722901e-14, + 3.30531724821590289e-14, + 9.57224524093924004e-15, + 4.66700042535734278e-16, +-1.58130666313071033e-15, +-1.55009632116144539e-15, +-1.15906062173167002e-15, +-8.17600387270713675e-16, +-5.72547863950822485e-16, +-4.04780746714430869e-16, +-2.90572323399625932e-16, +-2.10857716421216965e-16, +-1.53982549166243294e-16, +-1.14705967416708842e-16, +-8.59225462941252271e-17, +-6.50981901302682061e-17, +-4.98155347212572914e-17, +-3.82439817659167680e-17, +-2.97415352460025369e-17, +-2.31189467845966099e-17, +-1.88692252654191847e-17, +-1.40475560674656886e-17, +-1.12454432698768677e-17, +-8.84985101897008970e-18, +-7.19794069295863947e-18, +-6.14715516446539883e-18, +-1.34225063163751742e-14, +-9.47789704668668735e-15, +-5.08621307295313838e-15, +-2.01542115796345944e-15, + 1.65371062608310473e-16, + 9.62583933252310575e-17, +-3.98448509877369154e-15, +-6.12635265271593939e-15, + 8.33220633766837608e-15, + 1.66705883355231967e-14, +-1.35711406792680260e-14, +-1.32400857451285245e-14, + 6.98109431643462719e-15, + 5.33071928532400815e-15, +-1.05502002226396289e-17, +-9.54720564779387315e-16, +-4.79527931302536166e-16, +-1.36719799191234993e-16, +-1.66532601154276854e-17, + 1.11021502000900919e-17, + 1.22032750843274453e-17, + 8.64441062273162548e-18, + 6.91350874377161979e-18, + 4.54603869884904429e-18, + 3.57900234517331649e-18, + 2.11170443300977729e-18, + 1.65998240162103932e-18, + 9.84612349044371051e-19, + 1.31676432968540953e-18, + 5.96543775199668564e-19, + 7.87209554586512257e-19, + 6.34767821583197147e-19, + 6.64057717661764821e-19, + 5.07305152836544672e-19, +-2.27164928216425693e-19, + 3.49837582121066622e-19, + 3.94440400826998059e-19, + 4.31639825187899599e-19, + 1.32183206838035077e-19, + 7.20742015109777817e-20, + 4.11280743188356034e-17, + 1.32279122128431685e-16, + 9.92364077498334860e-17, + 7.57076408774639699e-17, + 4.31523836749108186e-17, +-5.85389494694713590e-17, +-1.47187176014058307e-16, + 1.17751008238631451e-16, + 5.95039646443410122e-16, +-4.14152194795367395e-16, +-7.60222052229364681e-16, + 6.44969093293307785e-16, + 2.40734952414726419e-16, +-1.91567342055226032e-16, +-7.83767556182753143e-17, + 6.87715399009154342e-18, + 1.41894938569253481e-17, + 6.45038668651459816e-18, + 1.78046216418195472e-18, +-6.63490408123829627e-20, + 1.58952437081436075e-19, + 3.34611548113778693e-20, + 3.72199607608675437e-19, + 3.44888635096203850e-19, + 5.04058346228690950e-19, + 9.70664946047691327e-20, + 9.06598436870331598e-19, + 6.68751930318428452e-19, + 7.10934908979351324e-19, + 3.62572342168274924e-19, + 5.46071345665716549e-19, + 9.16269122240921733e-20, + 2.78040253386204915e-19, + 6.64070890478275605e-19, + 7.23376374101672333e-20, + 4.50070950290573336e-19, + 9.50391543805017618e-19, + 5.95493511447280509e-19, + 3.96699716449990586e-19, + 1.17835883473038270e-19, + 6.54411385387965410e-18, + 1.74942756192030918e-18, +-1.77094354233550343e-18, + 6.22993662596563114e-19, + 2.32323868146953430e-18, +-3.78033527554708318e-18, + 5.40555961613281999e-19, + 1.37867980898359058e-17, + 8.69409306687869826e-19, +-3.58473047392410334e-17, + 3.26457551723825179e-17, + 1.41393841175145003e-17, +-1.81386394813500631e-17, + 4.06118594310847349e-20, + 3.67616002000517746e-18, + 9.74402415233526439e-19, +-7.11847116910367193e-20, +-3.36339579969957113e-19, +-5.39027169263323711e-19, +-2.30976792345178684e-19, + 1.64170724287710128e-19, + 2.01994382274901909e-19, + 4.80467927865951280e-19, + 5.34862932346973985e-20, + 7.48581344086921622e-19, + 4.35660988228897980e-19, + 5.37008124486179892e-19, + 1.27916769837013757e-19, + 4.01864714432502917e-19, + 7.32725903103277063e-19, + 1.49881963340378503e-19, + 3.16067229281979646e-19, + 1.72404850939721154e-19, + 1.52088113777698672e-19, +-6.54922523894475963e-20, + 1.60696214412678516e-19, + 4.75852196576942539e-19, + 5.37953351471331300e-19, + 1.79760274239293646e-19, +-5.59281527232208025e-20, + 4.66011505412827731e-20, +-1.65298525495014480e-18, +-1.25940435516402763e-18, + 3.59887047750047521e-19, + 6.01714614114832531e-19, +-1.07665874499301040e-18, +-3.11431274584848804e-19, +-1.39126476209773466e-18, +-1.91251334854509180e-18, +-1.35434066834757336e-18, + 3.46652025112328125e-19, +-2.78467546093825875e-18, + 1.36684502792144642e-18, + 1.50322523876040229e-18, +-4.35247258225697359e-20, + 1.02779444917117856e-18, + 5.88947708524446907e-19, + 2.71326994454757411e-19, + 5.61620253035937929e-19, + 6.77131754938332867e-19, + 1.26966459399397967e-18, + 5.66454624267651015e-19, + 3.31019248633366517e-19, + 4.98547159491264531e-19, + 5.80894046837951578e-19, + 6.75001550301862676e-19, + 8.08865874513737246e-19, + 1.07527793549934906e-20, +-9.59839756069641416e-21, + 4.95804235992502202e-19, + 1.89929454121869081e-19, + 4.01092073697351113e-19, + 3.15579155705489528e-19, + 3.90464921768404709e-19, + 3.86255533339201244e-19, + 3.60131657682659434e-19, + 6.20191513575040559e-19, + 3.50577784037906614e-19, + 2.91504997919009116e-19, + 1.40930189692911336e-19, + 2.59623180238829085e-18, +-4.97048780056541324e-19, +-3.61544429721605962e-18, + 7.06442874493355159e-19, +-6.44067174717697946e-19, +-1.18705938268702410e-18, + 5.58228718048162465e-19, +-4.87044451928160763e-19, + 2.52282866650614452e-19, + 2.68528633012982040e-19, +-3.32219611852160548e-19, +-1.27667507703950002e-18, + 9.57303389286686793e-19, + 1.91555125770729267e-19, +-1.17442822900793230e-18, +-1.61293393403065219e-19, +-2.08457527793699128e-19, +-3.34482424280340533e-19, +-2.29111625178246699e-19, +-9.21839714506182016e-20, +-9.61495980949180523e-20, + 1.68118773380966773e-19, + 1.47774924827645638e-19, + 2.85131626365605853e-19, +-3.49413766905801616e-19, + 4.81590148799098930e-20, + 5.86493936066834825e-19, + 5.12438416150415292e-19, + 4.18077784439418882e-19, + 4.90464052551024958e-19, + 2.61484923960975574e-19, + 2.38873212239509873e-19, + 2.70693763881042912e-19, + 2.31351433841461826e-19, + 4.49142679195027467e-19, + 2.42644300132958158e-19, + 3.51941887364061515e-19, + 7.62051455483816509e-19, + 1.94534411880205858e-19, + 6.10024774932154293e-19, +-5.02347244897017501e-20, +-3.38671304668296072e-18, +-8.18030946694992482e-19, +-1.64762278271561333e-18, +-1.79134868699681948e-18, +-1.07250546810488593e-18, +-8.57979271491387440e-19, +-4.37893134839967706e-19, + 3.13104104615981545e-19, + 1.08216746041826292e-18, +-3.40760304024951509e-19, +-7.84376250540177976e-19, + 3.66346476992862362e-19, +-8.48090743956683002e-19, +-1.01655709082721772e-18, +-1.06930575764632846e-18, +-4.22855803448536481e-19, +-6.47725595689462110e-19, +-6.31138236976565860e-19, + 4.95131538050149566e-20, +-3.42541231898255467e-19, +-3.60974091555135681e-19, +-5.30036700873970663e-19, +-1.99485693334042331e-19, + 2.75013851107128919e-20, +-1.10473978169720740e-19, +-5.58762629948283344e-19, +-8.33272975226806955e-19, +-5.60573785086553626e-19, +-3.15665744916734158e-19, +-3.76047179115946832e-20, +-3.97524637989912352e-19, +-1.58661579536297630e-19, +-4.62861867455232600e-19, +-4.47936670502625679e-19, +-2.71801265954812954e-19, +-4.53079762632826227e-19, +-2.66166397059193790e-19, + 2.73212567161010658e-19, +-6.62570725223328972e-19, + 1.78548364778366164e-01, + 1.38818114882712007e-01, + 1.13584303167321307e-01, + 9.65908839811688152e-02, + 8.45876916700911419e-02, + 7.57687823328982990e-02, + 6.90725725805688695e-02, + 6.38446873021328853e-02, + 5.96644765720578119e-02, + 5.62498106017822810e-02, + 5.34027131773861449e-02, + 5.09798255025282893e-02, + 4.88779085464602289e-02, + 4.70248769032711317e-02, + 4.53710904002021104e-02, + 4.38814412770509449e-02, + 4.25298390871683349e-02, + 4.12960152620475002e-02, + 4.01637507770785523e-02, + 3.91198215486745215e-02, + 3.81533028509997707e-02, + 3.72550745254478372e-02, + 3.64174537943651871e-02, + 3.56339162405972798e-02, + 3.48988804277467063e-02, + 3.42075395677524860e-02, + 3.35557285281623610e-02, + 3.29398177271215536e-02, + 3.23566277174415703e-02, + 3.18033598543909848e-02, + 3.12775395858495633e-02, + 3.07769697355955996e-02, + 3.02996917628979706e-02, + 2.98439534371706568e-02, + 2.94081817087916905e-02, + 2.89909598168618457e-02, + 2.85910078733781388e-02, + 2.82071663165984372e-02, + 2.78383817455649836e-02, + 2.74836947411045557e-02, +-2.49474506326112892e-02, +-1.54032464848352715e-02, +-1.01334885457304794e-02, +-7.01951521254394646e-03, +-5.07330085107506653e-03, +-3.79872743404363351e-03, +-2.93043208033397966e-03, +-2.31873142669965443e-03, +-1.87580651235713723e-03, +-1.54897279383125379e-03, +-1.30550201779278054e-03, +-1.12270625265195926e-03, +-9.82901654912484270e-04, +-8.72657397362084850e-04, +-7.82919340745387719e-04, +-7.08067446905061184e-04, +-6.44578748523302078e-04, +-5.90082775784823337e-04, +-5.42865732196659979e-04, +-5.01629088838976612e-04, +-4.65362077725444442e-04, +-4.33264457780894454e-04, +-4.04694590930178852e-04, +-3.79132492282030801e-04, +-3.56152748580053238e-04, +-3.35404306378583937e-04, +-3.16595178585801773e-04, +-2.99480735109110057e-04, +-2.83854641571249682e-04, +-2.69541778225168213e-04, +-2.56392655966219203e-04, +-2.44278975722244437e-04, +-2.33090069329560572e-04, +-2.22730025974488379e-04, +-2.13115356212166719e-04, +-2.04173080766584486e-04, +-1.95839157409118461e-04, +-1.88057178738284419e-04, +-1.80777288421320837e-04, +-1.73955274673333419e-04, + 1.60867913875748685e-03, + 8.59262953694927244e-04, + 4.93843294740481365e-04, + 3.01524046488012558e-04, + 1.93598143966582076e-04, + 1.29669378287512407e-04, + 9.00321598517532480e-05, + 6.44436351676662449e-05, + 4.72188667898838544e-05, + 3.50655990032724296e-05, + 2.62053498176604013e-05, + 1.98158845640146763e-05, + 1.53809618949967069e-05, + 1.23428147607710032e-05, + 1.01911593573191135e-05, + 8.58412875616799906e-06, + 7.33031715247230335e-06, + 6.32446552489935677e-06, + 5.50322297911303540e-06, + 4.82421200721043385e-06, + 4.25702518373168024e-06, + 3.77900228130291916e-06, + 3.37288887298507201e-06, + 3.02535000729821690e-06, + 2.72595448657928170e-06, + 2.46645510563276760e-06, + 2.24026793546051509e-06, + 2.04208991761306514e-06, + 1.86761445359628974e-06, + 1.71331745256273795e-06, + 1.57629468604907862e-06, + 1.45413693809110552e-06, + 1.34483329658512623e-06, + 1.24669560734977200e-06, + 1.15829899149765053e-06, + 1.07843466216936728e-06, + 1.00607223580732951e-06, + 9.40329429436265322e-07, + 8.80447545325256378e-07, + 8.25771521497392491e-07, +-8.93009577451026152e-05, +-4.19839053454558315e-05, +-2.14177774196363315e-05, +-1.17035060995761603e-05, +-6.77681875452930593e-06, +-4.12073047286593512e-06, +-2.61266993536449552e-06, +-1.72335087263060245e-06, +-1.18930094992476404e-06, +-8.58747604781283948e-07, +-6.27620944642133336e-07, +-4.43496756394186111e-07, +-3.03171542864267119e-07, +-2.10022469763452190e-07, +-1.52982002153493084e-07, +-1.17247631056005624e-07, +-9.30318502153823407e-08, +-7.54087548241075686e-08, +-6.20057021446652042e-08, +-5.15533832015209153e-08, +-4.32697441941072357e-08, +-3.66234188017522904e-08, +-3.12344097954737622e-08, +-2.68235813082688015e-08, +-2.31823499443044018e-08, +-2.01527546465399504e-08, +-1.76137697344125258e-08, +-1.54716835628789693e-08, +-1.36532249794652418e-08, +-1.21005867384828369e-08, +-1.07677787747134260e-08, +-9.61792626763557104e-09, +-8.62124705236623624e-09, +-7.75352296123371535e-09, +-6.99493410348424730e-09, +-6.32916235267162837e-09, +-5.74269646798956588e-09, +-5.22428942435796576e-09, +-4.76453164001669225e-09, +-4.35551314176362260e-09, + 4.45448014117202407e-06, + 1.86261610435667831e-06, + 8.50674367600063067e-07, + 4.18978046153493397e-07, + 2.20182021872879790e-07, + 1.22358178485935284e-07, + 7.11542734725980103e-08, + 4.25016750753089165e-08, + 2.57080140367697123e-08, + 1.66739083284987840e-08, + 1.27487407074555879e-08, + 1.02372408111588649e-08, + 7.24845819188639987e-09, + 4.52470733575973189e-09, + 2.76278459361844474e-09, + 1.80058716055866419e-09, + 1.27303708636303640e-09, + 9.52200389164744616e-10, + 7.35342615579769477e-10, + 5.78824932237200556e-10, + 4.61865083758724711e-10, + 3.72686383611754263e-10, + 3.03708089958009675e-10, + 2.49716575199425735e-10, + 2.07007154396013975e-10, + 1.72895859529229031e-10, + 1.45409793943072153e-10, + 1.23080512214065103e-10, + 1.04802656314081291e-10, + 8.97354538986679237e-11, + 7.72331753324466979e-11, + 6.67954147310845790e-11, + 5.80311012711834102e-11, + 5.06322045824414082e-11, + 4.43542957152178635e-11, + 3.90020800747299520e-11, + 3.44184836612203086e-11, + 3.04763932744271264e-11, + 2.70723565030363700e-11, + 2.41217001738445093e-11, +-2.04585265775163800e-07, +-7.67283390870383886e-08, +-3.15933985790871156e-08, +-1.41039530747041800e-08, +-6.75177198679308458e-09, +-3.43847821519295095e-09, +-1.86536100501784279e-09, +-1.08221467437975348e-09, +-6.25996244333810998e-10, +-2.95921788056389803e-10, +-1.30643007009413688e-10, +-1.36647652910270494e-10, +-1.52872728175535076e-10, +-1.13485303050659135e-10, +-6.48104621319657733e-11, +-3.46134271262482840e-11, +-1.99439897359452017e-11, +-1.29137385358174248e-11, +-9.09871328666688088e-12, +-6.71203417305379671e-12, +-5.07626000611768606e-12, +-3.90187395360885338e-12, +-3.03765344099460509e-12, +-2.39120704719210328e-12, +-1.90128767778566333e-12, +-1.52569937548370305e-12, +-1.23471916782329169e-12, +-1.00710341968111272e-12, +-8.27450796815065482e-13, +-6.84471184741630528e-13, +-5.69792381352555755e-13, +-4.77139672476267345e-13, +-4.01777715064035911e-13, +-3.40083829882799938e-13, +-2.89283202545930744e-13, +-2.47206695810917390e-13, +-2.12175402006062029e-13, +-1.82866151447719231e-13, +-1.58223727290514574e-13, +-1.37406409237777698e-13, + 8.77880718742416815e-09, + 2.97382430289510412e-09, + 1.11067816772915414e-09, + 4.51885488906411444e-10, + 1.98092762153361912e-10, + 9.22652919487693100e-11, + 4.47794948584416660e-11, + 2.35109298394706178e-11, + 1.59395586906984276e-11, + 1.10548949509698418e-11, + 2.51352892433724686e-12, +-1.59601846138404997e-12, + 6.54854171196646029e-13, + 2.19139150524364015e-12, + 1.68571652179695333e-12, + 8.72400456065063599e-13, + 4.07787369078843540e-13, + 2.06907299959996730e-13, + 1.22091192933615518e-13, + 8.09717679574690548e-14, + 5.71746847645200404e-14, + 4.16772517198267044e-14, + 3.09598742610937039e-14, + 2.33272599214228348e-14, + 1.77907406022458790e-14, + 1.37140849547125230e-14, + 1.06803647470423086e-14, + 8.39439472982255072e-15, + 6.65454844372308694e-15, + 5.31773193570333830e-15, + 4.28010674984528686e-15, + 3.47158809392198965e-15, + 2.83242752779198445e-15, + 2.32865769660166007e-15, + 1.92173702302550372e-15, + 1.59663473484108457e-15, + 1.33428729010520341e-15, + 1.11780669370894385e-15, + 9.39631090476680687e-16, + 7.97241681679951485e-16, +-3.55409769964871320e-10, +-1.09393280052333407e-10, +-3.72473555080360103e-11, +-1.38668896368669737e-11, +-5.59359949715592327e-12, +-2.43881954108567815e-12, +-1.12299468638718855e-12, +-4.58035312580920877e-13, +-1.48872297682177967e-13, +-2.51327958022573919e-13, +-2.89265407290703739e-13, + 6.83204087730306395e-15, + 9.88713575762474685e-14, + 8.08009447220865819e-15, +-3.16323568604010901e-14, +-2.32896861928350989e-14, +-1.07979327787868300e-14, +-4.45244511332269248e-15, +-2.00354018821847576e-15, +-1.07234261238852538e-15, +-6.71923271325795613e-16, +-4.52116976237631046e-16, +-3.16586510382099788e-16, +-2.27154241389502881e-16, +-1.65438402766890354e-16, +-1.25057906561821592e-16, +-9.13130585714729035e-17, +-6.90724908442070551e-17, +-5.40908213134668685e-17, +-4.06734046796301822e-17, +-3.27307590971994363e-17, +-2.60384408461553063e-17, +-2.02531319607579035e-17, +-1.46021098002215782e-17, +-1.27680201960192003e-17, +-9.08956546003662283e-18, +-6.15531761563205100e-18, +-6.91774869505084543e-18, +-6.81276296259375972e-18, +-4.45517670327955590e-18, + 1.36711099100196362e-11, + 3.84340099369518185e-12, + 1.19852958962459675e-12, + 4.09931533011161558e-13, + 1.51792406770119803e-13, + 6.03585187266714498e-14, + 2.75333023589089256e-14, + 1.54151322955749302e-14, + 2.87418697576458886e-15, +-6.31448024725825472e-15, + 6.07571646062006902e-15, + 8.23952737434746735e-15, +-1.76673294774652720e-15, +-2.50105395932370241e-15, +-1.74801085122186397e-16, + 4.54473901115635348e-16, + 2.93637550706824274e-16, + 1.24022185487507503e-16, + 4.19982681230849066e-17, + 2.01169617023165475e-17, + 6.91410563547255358e-18, + 7.65706509231960212e-18, + 5.94404461419076681e-18, + 5.59687433946691362e-18, + 4.86795684187196644e-18, +-7.64699096191162737e-20, + 1.42183070386423824e-18, + 1.37597364755483040e-18, + 1.23773052514987588e-18, +-3.58012875580441692e-19, +-1.61318173296599538e-18, +-1.26699350135717893e-18, +-9.96231293985818362e-19, + 8.34961369764331007e-19, +-2.39309107990181506e-19, + 6.56079110107689506e-19, + 1.33045959607538168e-18, + 3.00213154300751165e-19, +-2.11470791449740253e-18, + 6.18304182948033562e-19, +-5.02266880778603033e-13, +-1.29575943450111102e-13, +-3.71543352903597571e-14, +-1.17230767069284306e-14, +-4.03788777277782955e-15, +-1.46963231561595557e-15, +-5.04410428484412885e-16, +-2.77117046841198044e-16, +-4.24001137889607830e-16, + 6.48758892074133975e-17, + 3.97078870858226965e-16, +-2.61600580746369943e-16, +-1.64128175921533825e-16, + 6.78190841001862178e-17, + 4.29005094014822013e-17, + 2.78856819050192347e-18, +-4.88998649752722134e-18, +-8.44714688865156898e-19, +-3.77550113564897827e-18, + 1.33940168717477959e-18, +-1.15382234560506304e-18, + 1.19616922458958560e-18, + 7.77754886847834327e-19, + 2.28403931533695770e-18, + 2.60670906692661099e-18, +-1.35190485539196976e-18, + 1.72886505441107470e-18, +-2.44508974803578903e-20, + 2.26674485230130003e-18, + 2.25614301265360633e-18, +-1.49439324876568666e-19, +-6.57923699212167855e-19, +-1.81638297304564634e-19, + 1.59435368139154258e-18, +-5.56357224825042888e-19, + 5.23140420645255805e-20, + 1.73676512360018573e-18, + 5.44804438734361706e-20, +-7.37724793349709782e-19, + 1.18954165943112266e-18, + 1.77043690784208002e-14, + 4.20993503806426475e-15, + 1.12062500560580883e-15, + 3.26369735780153078e-16, + 1.08585661670764057e-16, + 3.71732412690201427e-17, + 1.70850668453470929e-17, +-4.76626112873037119e-18, + 3.81504941332379877e-19, + 2.25318792359000519e-17, +-7.84278888143103235e-18, +-7.97790849834952987e-18, + 1.22501977042424133e-17, +-7.69312044280242242e-19, +-9.16355002409149432e-19, + 3.14718147283646275e-19, + 4.38452728307837608e-19, + 3.37719581064325432e-18, +-6.24458279262144406e-19, +-6.50298658447353587e-20, +-1.52725524265077752e-18, + 1.28087916718913636e-18, + 2.35291279440847317e-18, + 2.37407263649164767e-18, + 1.28441657352541158e-18, +-8.28438909787681646e-20, + 7.94013387721962363e-20, + 4.26787928554929327e-19, + 1.38285554697805342e-19, + 1.45560737025312064e-18, +-3.67766207730138023e-19, + 7.94714372282835643e-20, + 1.26648233276932088e-19, + 1.41022878470501844e-18, +-4.67010332303539678e-19, + 1.14361392176812316e-18, + 2.09350372666465257e-18, +-1.11461543225759486e-19, +-8.75053031622557406e-19, + 3.16019296267631112e-19, +-5.97670746844404987e-16, +-1.32736306525198281e-16, +-3.58065324125105971e-17, +-7.22430203130667220e-18, +-3.16310215586701872e-18, +-8.16536512021526681e-19, + 1.42463393868433117e-18, +-6.44431909780956713e-19, +-1.63447387661573976e-18, +-7.40471913428277672e-19, +-2.22380650445530455e-18, +-8.35176788992700613e-19, + 3.71537464160482424e-19, +-2.74437938035993311e-19, + 1.95678596721055058e-18, + 1.93998763814601007e-18, + 3.26555699325580392e-18, + 2.58814792996027404e-18, +-1.00011041587746201e-18, + 1.72563297340717664e-18, + 1.14242445482011308e-19, + 5.99694764398602529e-19, + 2.24349237408276595e-18, + 1.71262474922150897e-18, + 2.48481169164386056e-18, +-3.20618577119030850e-19, + 1.94866773749699861e-18, + 1.01761875884890909e-18, + 8.48874915763746138e-19, + 4.70521867941412087e-19, +-7.54374538294923657e-20, + 2.05618829606170668e-20, + 1.71701228668129594e-19, + 1.26792004806582427e-18, +-5.33533257386918973e-19, + 9.24306589744570282e-19, + 1.18516060503651491e-18, +-2.48072948978153501e-19, +-5.44536967082067996e-19, + 1.33352672599912224e-19, + 2.13616144035544592e-17, + 2.21789369591766255e-19, + 3.18942691116585641e-19, +-1.24960506746891930e-18, +-4.64904893958711715e-19, +-6.87350132606959981e-19, + 3.87435643824792743e-19, +-3.02828401595123783e-18, +-5.87337213712333805e-19, +-2.89744879215366972e-19, + 2.22572789089130441e-19, +-2.96949890120113823e-19, + 2.64466761428104024e-19, +-1.12258434312267665e-18, +-7.48182751831075043e-19, + 1.88765214953247826e-20, + 1.08071544196783452e-18, + 1.69377425629871271e-18, +-6.20088561941731434e-19, + 4.25262319461273801e-19, +-3.56720253407525010e-19, + 2.32353636655510993e-19, + 1.09055466477317257e-18, + 1.22884642107982609e-18, + 2.46030128510161868e-18, +-1.40814209314832052e-19, + 1.62611839702151520e-18, + 8.32869249198474567e-19, +-5.94798169614526089e-20, + 8.64611455386535780e-19, +-9.06398379526227794e-19, +-1.57495118003168663e-19, + 3.73667272909969118e-19, + 5.52715108889163727e-19, + 6.92508542083797070e-19, + 6.78111384360196051e-19, + 1.17810649893829974e-18, + 9.69849594439748208e-20, +-5.24800572889471077e-19, + 6.62218685220524067e-19, +-1.41601678852904044e-17, +-1.24945779388038269e-17, +-2.40261922433737067e-18, +-2.00459796365347253e-18, +-1.78023007684742315e-18, +-5.95744142681007911e-19, + 2.03901556019177518e-18, +-1.31202123290610762e-18, +-9.26585221278635071e-19, +-1.44744233186758095e-18, +-1.22548618284912306e-18, +-8.11067147440428064e-19, +-9.04636589365131087e-19, +-1.54085003277976346e-18, +-3.36316515298631763e-19, + 6.25198430647825184e-19, +-3.16715874580953437e-19, + 7.25104468232616140e-19, +-4.53283190923942282e-19, +-2.45037761916096426e-19, +-1.19382074370317979e-18, + 7.87684031121283169e-19, +-4.44707631732517280e-19, + 1.79370296989871339e-19, +-2.27352215870241130e-19, +-1.13077252455188409e-18, +-6.21048608110183007e-19, +-9.97662879398697186e-19, +-4.61345085345875635e-19, +-3.96805682599104219e-19, + 4.10600001668368549e-19, +-1.08018355111528467e-18, +-7.09404433591825733e-19, +-1.43342922659728515e-19, +-1.18514048234095712e-18, +-1.04614432180070917e-18, +-3.20141782948147373e-19, +-3.76437782749566536e-19, +-1.36387247678967806e-18, +-5.22720870521273735e-19, +// root 6 + 1.07673102359597539e-02, + 9.19510146689305786e-03, + 7.94162637890734671e-03, + 6.92672234078919088e-03, + 6.09371886456704266e-03, + 5.40167358075616545e-03, + 4.82039987215789490e-03, + 4.32725647706866737e-03, + 3.90518464643614758e-03, + 3.54162686079420672e-03, + 3.22770870872831836e-03, + 2.95699455080264146e-03, + 2.72396565080939125e-03, + 2.52316173626097743e-03, + 2.34928765694064363e-03, + 2.19764469072101284e-03, + 2.06434734148188120e-03, + 1.94628938977985610e-03, + 1.84100623485737905e-03, + 1.74653200801811359e-03, + 1.66128333558920958e-03, + 1.58397151462135182e-03, + 1.51353718998487085e-03, + 1.44910153438512421e-03, + 1.38992936383120738e-03, + 1.33540093770065978e-03, + 1.28499015142954226e-03, + 1.23824749316244994e-03, + 1.19478659278585034e-03, + 1.15427350982371941e-03, + 1.11641813084037010e-03, + 1.08096720703719181e-03, + 1.04769867839402554e-03, + 1.01641701525613981e-03, + 9.86949370734640672e-04, + 9.59142383900254969e-04, + 9.32859508856754877e-04, + 9.07978771452527551e-04, + 8.84390875819990189e-04, + 8.61997598704292937e-04, +-8.81079021631643957e-04, +-6.97039060213596687e-04, +-5.60527321859884240e-04, +-4.57275777785341655e-04, +-3.77826284417592557e-04, +-3.15769170476645853e-04, +-2.66670276704619443e-04, +-2.27354710377237861e-04, +-1.95366495739814419e-04, +-1.68644633677521500e-04, +-1.45596419959801479e-04, +-1.25398729980674060e-04, +-1.07916412484637933e-04, +-9.31670011783962860e-05, +-8.09532573450283800e-05, +-7.08916251352657465e-05, +-6.25664294749846795e-05, +-5.56188548036057489e-05, +-4.97658740683995160e-05, +-4.47902106636884553e-05, +-4.05251295106744041e-05, +-3.68415281546634587e-05, +-3.36383130689295101e-05, +-3.08354376711206238e-05, +-2.83688595485701004e-05, +-2.61868493516583442e-05, +-2.42472553859351982e-05, +-2.25154517197090595e-05, +-2.09627814365856499e-05, +-1.95653630484631658e-05, +-1.83031663747185513e-05, +-1.71592905357063360e-05, +-1.61193950728663344e-05, +-1.51712481723003599e-05, +-1.43043652299511957e-05, +-1.35097176857476151e-05, +-1.27794969357613808e-05, +-1.21069217286942571e-05, +-1.14860801280589085e-05, +-1.09117991278168262e-05, + 2.67526918697776564e-05, + 1.96495313116727121e-05, + 1.47326611200635088e-05, + 1.12491949393062051e-05, + 8.72792713396245386e-06, + 6.86578072420027367e-06, + 5.46570379849028093e-06, + 4.40720809195455504e-06, + 3.62759302755201859e-06, + 3.08279135816617827e-06, + 2.69414077116696454e-06, + 2.35636149614257734e-06, + 2.01308842864160691e-06, + 1.67804527866378647e-06, + 1.38275369284087488e-06, + 1.14040487388909567e-06, + 9.47458759421513704e-07, + 7.94567099203234186e-07, + 6.72606081142342468e-07, + 5.74322761445480389e-07, + 4.94281545433524111e-07, + 4.28447657844556513e-07, + 3.73805166389987016e-07, + 3.28073701031135056e-07, + 2.89508305862920793e-07, + 2.56758498301246403e-07, + 2.28768054398383165e-07, + 2.04702843712126344e-07, + 1.83898199147425691e-07, + 1.65820071222352612e-07, + 1.50036034925589587e-07, + 1.36193424634988794e-07, + 1.24002684585572505e-07, + 1.13224575961770406e-07, + 1.03660263990873519e-07, + 9.51435756631931033e-08, + 8.75349076579495735e-08, + 8.07163990795924280e-08, + 7.45880810822451210e-08, + 6.90647864825122204e-08, +-7.12139966693387370e-07, +-4.87344681542102206e-07, +-3.41671816852039320e-07, +-2.44891410569768938e-07, +-1.79183366936733235e-07, +-1.33703280634190322e-07, +-1.01193752413231283e-07, +-7.59863556217617890e-08, +-5.44282745037479149e-08, +-3.73996142479342795e-08, +-2.88906203802965299e-08, +-2.81714031735244805e-08, +-2.87616310896526881e-08, +-2.66176280344241645e-08, +-2.24363183694411544e-08, +-1.80186275595943193e-08, +-1.42685372751757341e-08, +-1.13338801213857462e-08, +-9.08708483833463941e-09, +-7.36360964906584453e-09, +-6.02859553481894434e-09, +-4.98260246606096115e-09, +-4.15390030224023339e-09, +-3.49054032505328731e-09, +-2.95447397178698489e-09, +-2.51748216413964604e-09, +-2.15838130302385566e-09, +-1.86108876425502130e-09, +-1.61326624290521626e-09, +-1.40535577855869260e-09, +-1.22988620188487103e-09, +-1.08096828790310550e-09, +-9.53923252922397622e-10, +-8.45006584597284170e-10, +-7.51200780812257252e-10, +-6.70058412706690898e-10, +-5.99582291593046853e-10, +-5.38133245290611878e-10, +-4.84358613039027637e-10, +-4.37136413120726616e-10, + 1.74413473717678910e-08, + 1.11659872143200943e-08, + 7.33658059099302645e-09, + 4.93433859022385686e-09, + 3.38448843818380652e-09, + 2.37098470292190370e-09, + 1.74983192903563403e-09, + 1.44141171704484794e-09, + 1.24422004337700419e-09, + 8.33074769257430296e-10, + 2.35941162832172441e-10, +-6.85331305263395398e-11, + 3.69418279897443554e-11, + 2.18730379102129944e-10, + 2.84016553762363863e-10, + 2.59608496745478697e-10, + 2.08222776896516241e-10, + 1.60111987671151001e-10, + 1.22439245956885082e-10, + 9.43472086332536819e-11, + 7.35170916666416993e-11, + 5.79427951126327058e-11, + 4.61597748848278804e-11, + 3.71375528314807136e-11, + 3.01508245041384249e-11, + 2.46835692446356881e-11, + 2.03639002133781510e-11, + 1.69203872902000864e-11, + 1.41525474300537363e-11, + 1.19106501886327011e-11, + 1.00817118470455000e-11, + 8.57965396461891317e-12, + 7.33830552612579675e-12, + 6.30637051285024900e-12, + 5.44376988003291123e-12, + 4.71895536475869428e-12, + 4.10692076020928008e-12, + 3.58771446423614388e-12, + 3.14531842113142942e-12, + 2.76679705881202312e-12, +-4.00524408938673019e-10, +-2.41408011250298047e-10, +-1.49510683328685641e-10, +-9.52383607722773998e-11, +-6.22580024319458546e-11, +-4.01868008011114145e-11, +-2.23902833668366217e-11, +-1.00095299618737040e-11, +-1.28710884669361221e-11, +-2.82788677468193926e-11, +-2.64883832986077171e-11, +-2.99140206397637596e-12, + 1.01081155349223980e-11, + 6.53686280076047875e-12, + 4.06721838839006804e-13, +-2.29681984147773366e-12, +-2.61232588879491983e-12, +-2.15366946599826045e-12, +-1.62532907561734672e-12, +-1.20381922128545415e-12, +-8.95565661039461884e-13, +-6.73647282041821679e-13, +-5.12916620418245143e-13, +-3.95119747279209391e-13, +-3.07692680264848396e-13, +-2.42018833592335221e-13, +-1.92129196732313516e-13, +-1.53834291862517394e-13, +-1.24154577927590321e-13, +-1.00944922578088928e-13, +-8.26424790981614748e-14, +-6.80965885766011457e-14, +-5.64517612559012967e-14, +-4.70650572531203615e-14, +-3.94495970093500797e-14, +-3.32336251085306358e-14, +-2.81308533516900826e-14, +-2.39191428381247801e-14, +-2.04250161541155889e-14, +-1.75119845028278630e-14, + 8.66726279651758494e-12, + 4.95449450362469292e-12, + 2.89737374504086194e-12, + 1.73160604201160812e-12, + 1.08569026627908403e-12, + 8.02373035178075727e-13, + 6.76395040895918302e-13, + 2.72450011752573778e-13, +-5.16383705214427313e-13, +-5.11127527912832162e-13, + 7.08400421935221648e-13, + 9.57702999159500047e-13, + 1.09823400173961361e-13, +-2.86828550263104950e-13, +-1.88592290212572277e-13, +-4.86923737735334079e-14, + 1.08799708422898461e-14, + 2.29505766922879377e-14, + 2.01189462093265139e-14, + 1.50429904746318767e-14, + 1.08463703593509784e-14, + 7.82011453793055432e-15, + 5.69738539915014764e-15, + 4.20349536173005225e-15, + 3.14007404548271407e-15, + 2.37308942596577813e-15, + 1.81274647634372512e-15, + 1.39867559100238276e-15, + 1.08916812168225796e-15, + 8.55493474019615390e-16, + 6.77467786326410099e-16, + 5.40571986895075093e-16, + 4.34318530700329455e-16, + 3.51210895589693227e-16, + 2.85975197202924244e-16, + 2.34127526648783162e-16, + 1.92690163716162404e-16, + 1.59453275255696404e-16, + 1.32589363843208173e-16, + 1.10886207388042462e-16, +-1.76370528069948577e-13, +-9.69082192877003483e-14, +-5.43654975193387603e-14, +-3.10021562250699084e-14, +-1.58923939994643196e-14, +-5.37350456496297266e-15, +-6.46293917692265539e-15, +-2.40183913384479832e-14, +-2.41731599817781636e-14, + 2.97226913331076370e-14, + 3.94264110252722618e-14, +-2.12806386459991456e-14, +-2.74719609302681597e-14, +-2.01071687420368932e-15, + 5.96718437839201439e-15, + 3.51716789993564226e-15, + 1.01426113289980361e-15, + 4.07500581789440143e-17, +-1.76556820869487158e-16, +-1.71382639362424896e-16, +-1.27809337784360021e-16, +-9.00651684506461914e-17, +-6.31293173804950689e-17, +-4.46557466367304951e-17, +-3.20164603520293239e-17, +-2.32066187337243242e-17, +-1.69970904820197363e-17, +-1.26867400170974425e-17, +-9.53765645023997159e-18, +-7.22474060096962683e-18, +-5.52932240163876886e-18, +-4.17780387885780606e-18, +-3.29102173156845276e-18, +-2.60442207360060751e-18, +-2.04013555658665292e-18, +-1.58079455578018039e-18, +-1.27914882523817129e-18, +-1.06220665778822493e-18, +-8.73904403877430188e-19, +-6.27405636182718356e-19, + 3.33188060389567944e-15, + 1.78790052029584377e-15, + 9.59095019754336343e-16, + 5.57887428014030788e-16, + 4.08952594505843029e-16, + 2.07544020620211473e-16, +-3.24598622018742576e-16, +-5.99327047669636903e-16, + 9.17113282680249222e-16, + 1.79105482825974967e-15, +-1.42911232110531191e-15, +-1.41516969875739590e-15, + 7.39929040827596885e-16, + 5.74616649571806763e-16, + 2.35743793351252589e-18, +-1.01460131828600892e-16, +-5.11976728655475172e-17, +-1.45028614980521664e-17, +-1.59505650293055080e-18, + 1.12887962733829307e-18, + 1.38932545427421329e-18, + 1.06756746405063950e-18, + 6.98488923042493120e-19, + 5.40019879234223755e-19, + 4.15989602893098108e-19, + 2.30547236011742536e-19, + 2.16423427001372809e-19, + 1.00607379428792322e-19, + 9.88808442786092658e-20, +-1.40162698464751364e-20, + 6.85658367878898807e-21, + 7.27562607249891935e-20, + 7.66954488098312320e-21, +-6.26964215137348801e-20, + 5.37291358363024399e-20, + 5.06643871803990273e-20, + 2.01182674053025046e-20, +-3.13728592728403383e-20, +-2.09939148725898532e-20, + 9.81654186238021603e-21, +-5.64922982881397753e-17, +-3.13165303382828822e-17, +-1.60034379895400517e-17, +-6.57902829380120814e-18, +-2.80988679658731733e-18, +-9.56136794391899776e-18, +-1.74044330579148740e-17, + 1.19798566673532027e-17, + 6.24878728726177649e-17, +-4.42014651893978399e-17, +-8.13337597568931807e-17, + 6.82743270006343038e-17, + 2.59400828277481016e-17, +-2.02466344005508208e-17, +-8.47285110416873417e-18, + 7.18820167030744646e-19, + 1.54933152502732283e-18, + 6.59415450197247062e-19, + 2.95247567156624945e-19, +-1.84489847302795718e-20, + 1.18216795720618136e-19, + 2.49645418747317542e-20, + 7.97150356189247152e-21, + 5.61631793876329523e-20, + 7.24453094727994912e-20, + 4.17677418493061730e-20, + 8.05623516608156928e-20, + 2.35946913478428027e-20, +-1.60011481502671939e-20, + 8.62564265598160394e-21, + 6.13291619131451616e-21, + 1.26927244072141113e-19, + 1.10429715582022610e-19, +-1.34877916670178198e-20, + 4.93725120795530488e-20, + 6.80244878518749312e-20, + 1.09197438012434441e-20, + 9.56210773356092298e-22, +-1.91987153098634577e-20, + 2.54850822191126049e-20, + 1.63008805413390231e-18, + 1.29851402593249471e-18, + 5.41806914208994981e-19, + 2.43407911127314867e-19, + 3.15831233795960738e-20, +-7.34211315901936751e-20, + 1.36310763918246171e-19, + 1.53907153894416432e-18, +-9.13595835861841209e-20, +-4.09910245728589788e-18, + 3.28489816484941965e-18, + 1.68714548415820854e-18, +-2.10290731301535092e-18, + 6.51403241045437819e-20, + 4.41085429137794460e-19, + 8.63742160793995275e-20, + 4.09824028061714947e-20, +-2.88785969888872005e-20, + 2.19929009959247111e-20, +-3.36060129770375856e-20, + 6.52821362054698578e-20, + 4.26592762609138284e-20, + 1.47911970502671053e-20, + 2.86383293933276636e-20, + 4.06970834222774952e-21, + 1.00258873605732954e-19, + 8.51093743068136909e-20, +-1.72169882840076714e-21, + 3.26728411199912235e-21, + 1.65286154012090660e-20, + 3.86460221820404435e-21, + 5.85109629540028883e-20, + 3.22444109613045774e-20, +-4.70910460426474199e-20, + 2.53245288282699458e-20, + 4.14622272661865805e-20, + 1.68129604152890028e-20, +-4.88210134871311385e-21, +-2.62544431611355814e-20, + 1.56973785489710292e-20, +-4.01741780293325751e-21, + 8.32363043814342351e-20, + 1.76811656833286359e-19, +-8.56238657849581664e-20, +-1.08122751085916466e-19, + 1.10482408811255766e-19, +-1.17890513531725712e-19, +-9.44898094726603774e-20, +-1.97704832144349222e-19, +-8.74852219104120123e-20, + 4.75276703477217670e-21, +-2.15513568480523045e-19, +-6.45183413853399016e-21, + 2.54634149157741179e-19, + 6.50256742968772247e-20, + 2.03244603439468881e-20, + 9.18139072160703799e-20, + 1.22332868400285161e-19, + 1.15212172642854114e-19, + 7.44116541561689449e-20, + 3.13623257371012358e-20, + 5.49548206063930221e-20, + 7.72616021329236345e-20, + 6.62769373825909797e-20, + 8.37742096760784196e-20, + 1.07390833943042036e-19, + 7.79522130948688533e-20, + 9.38268020324993515e-20, + 5.68547466236447412e-20, + 8.42650340884204724e-21, +-1.32998118697660506e-20, + 7.02197402499662064e-20, + 6.19666712071799964e-20, + 4.31419434202707503e-20, + 1.41112918846793315e-20, + 4.47610697478229247e-20, + 3.50390804111699661e-20, + 1.24525907555077125e-20, +-3.56385674769162477e-21, + 4.41189534550199036e-20, + 1.01710718848650185e-19, +-1.94680139270207547e-19, + 7.58378722458687084e-20, +-1.50343624159078671e-19, +-3.32452887171773095e-20, +-4.07804917343130504e-20, +-1.61447634348376099e-19, +-1.11928919648063114e-19, +-2.26694816849760249e-19, + 5.57779933240475271e-20, +-9.22632535328602283e-20, +-3.17359039036199003e-20, + 9.66935127137889802e-20, +-7.28910952047748155e-20, +-1.69202266596086272e-21, +-6.84792785645816911e-20, +-6.41293547837446107e-20, +-3.37216482297245922e-20, + 2.17803070445073460e-20, +-3.50519510056928881e-20, + 1.77402934815704585e-20, + 4.67022406213593704e-21, +-3.51490146954360862e-20, + 3.50506002499703984e-20, + 4.99552543854104185e-20, + 1.10416411133697411e-20, + 9.67067261469579593e-20, + 4.36084365682756884e-20, + 3.56529678148460992e-20, +-1.81983761601807835e-20, +-2.23963125392943584e-21, + 1.13708985720783550e-19, + 3.31955450034983004e-20, +-8.62937208319175814e-22, + 3.11639057190012702e-20, + 1.51275202133293358e-20, + 3.51828217317641288e-20, + 2.57480106134317023e-20, +-4.04142400116182187e-21, + 2.88433195923268262e-20, +-7.54573611440872413e-19, +-4.11492371443820337e-19, +-2.17534596753782955e-19, + 3.18871024058288354e-20, +-9.17842204523860788e-20, +-4.44269892224823680e-20, +-1.47252769614488094e-19, +-6.15957026822824773e-20, +-1.42949973339889593e-20, +-2.63709115022972150e-20, +-1.79182206770207455e-20, + 5.13906813776510797e-20, +-4.59024443720289406e-21, +-1.22740660457356265e-19, +-1.13263948445130328e-19, +-1.77687752449873612e-19, +-5.24877175447129440e-20, +-3.47184188478793527e-20, +-7.68526375346993237e-21, +-7.65428531995470255e-20, +-3.77461708665678467e-20, +-3.79155806145518647e-20, +-6.94776534531095299e-21, +-1.16044372158760387e-20, + 1.53651030223496570e-20, + 2.10822293998027505e-21, +-8.82578851560152591e-20, +-9.03999306387794424e-20, +-4.96957707116323267e-20, +-9.47189036939260650e-20, +-5.39452334640070728e-20, +-4.20021796503211373e-20, +-6.08115412581696340e-20, +-7.06089650301705650e-20, + 2.22320586846061305e-20, +-4.76088142844229624e-20, +-4.54554843312231479e-20, +-5.80762598393498911e-20, +-2.71259787260315329e-20, +-5.10686581732007710e-20, + 2.04213773265188414e-01, + 1.85013038274386088e-01, + 1.69491660673783434e-01, + 1.56649470631481713e-01, + 1.45819821368599334e-01, + 1.36541554721903352e-01, + 1.28484988601585165e-01, + 1.21407777255039942e-01, + 1.15129677327145311e-01, + 1.09520348129564224e-01, + 1.04492046428332777e-01, + 9.99866356519582972e-02, + 9.59560901653236237e-02, + 9.23489794491877819e-02, + 8.91101324420364577e-02, + 8.61867086243660874e-02, + 8.35325837886489592e-02, + 8.11093515740120424e-02, + 7.88854975115767104e-02, + 7.68351235551882061e-02, + 7.49367878337647425e-02, + 7.31725803948361786e-02, + 7.15274120435046845e-02, + 6.99884682814791853e-02, + 6.85447866409532452e-02, + 6.71869261261963391e-02, + 6.59067060133727844e-02, + 6.46969974516724139e-02, + 6.35515556983917429e-02, + 6.24648839437874984e-02, + 6.14321219274436212e-02, + 6.04489541821163698e-02, + 5.95115339438151147e-02, + 5.86164196616880059e-02, + 5.77605217136786947e-02, + 5.69410574439434408e-02, + 5.61555130282846982e-02, + 5.54016109749538230e-02, + 5.46772823022811105e-02, + 5.39806426179387025e-02, +-1.07194133735321641e-02, +-8.56002427814722688e-03, +-7.01192005490758590e-03, +-5.86414402860064611e-03, +-4.98902903354518212e-03, +-4.30610944882537077e-03, +-3.76290636195295361e-03, +-3.32361561346316723e-03, +-2.96123745666957436e-03, +-2.65257347941545056e-03, +-2.37859825459513750e-03, +-2.12920806587507325e-03, +-1.90402626871477533e-03, +-1.70601150193419181e-03, +-1.53561909270236987e-03, +-1.39021153049175288e-03, +-1.26590621740041280e-03, +-1.15895786627000751e-03, +-1.06623681593608901e-03, +-9.85247452344676332e-04, +-9.14016138652021313e-04, +-8.50973404784571082e-04, +-7.94859432094003455e-04, +-7.44652993349491582e-04, +-6.99518547910581482e-04, +-6.58766594717616707e-04, +-6.21823643100040532e-04, +-5.88209215870056984e-04, +-5.57518052301147148e-04, +-5.29406200222977039e-04, +-5.03580048532452471e-04, +-4.79787605405797345e-04, +-4.57811507833819238e-04, +-4.37463377674303692e-04, +-4.18579233558360781e-04, +-4.01015737108339598e-04, +-3.84647103174570835e-04, +-3.69362542148550532e-04, +-3.55064131356269219e-04, +-3.41665034563296021e-04, + 3.20466358447740881e-04, + 2.25774031590979463e-04, + 1.64962438494838933e-04, + 1.24240205000198664e-04, + 9.59685932192579907e-05, + 7.56962081050110492e-05, + 6.07413933767291740e-05, + 4.95620949936666303e-05, + 4.14558819153498936e-05, + 3.60701602030112287e-05, + 3.26110877507124140e-05, + 2.97265573886313607e-05, + 2.65014723401879713e-05, + 2.29942077603494216e-05, + 1.96566854815847292e-05, + 1.67688072509581257e-05, + 1.43765928128618902e-05, + 1.24174866633416903e-05, + 1.08080089908431759e-05, + 9.47506333158748871e-06, + 8.36118305778129000e-06, + 7.42232251915498937e-06, + 6.62468021648540122e-06, + 5.94208078608798873e-06, + 5.35403903506748072e-06, + 4.84435709164451842e-06, + 4.40010354947298963e-06, + 4.01086269780439214e-06, + 3.66817596095133608e-06, + 3.36512168284179475e-06, + 3.09599567706490260e-06, + 2.85606600976172011e-06, + 2.64138305448012323e-06, + 2.44863111265046152e-06, + 2.27501158392084892e-06, + 2.11815029360496184e-06, + 1.97602346847243963e-06, + 1.84689821916901743e-06, + 1.72928438974210369e-06, + 1.62189537490884098e-06, +-9.88925408897268078e-06, +-6.21789511422203959e-06, +-4.08892230884510252e-06, +-2.79381493231967510e-06, +-1.97425016906128227e-06, +-1.43860309250290577e-06, +-1.07364959893713873e-06, +-7.98109752258023433e-07, +-5.56164651582673497e-07, +-3.51417812890164404e-07, +-2.44582757561208276e-07, +-2.48994422377147198e-07, +-2.86579325546011681e-07, +-2.91227604159643144e-07, +-2.61400096432451165e-07, +-2.19528258051735120e-07, +-1.80106789967403464e-07, +-1.47533688438269044e-07, +-1.21668150015287187e-07, +-1.01233633351117111e-07, +-8.49819972919806895e-08, +-7.19312696626211762e-08, +-6.13473003251121725e-08, +-5.26840984539534994e-08, +-4.55323815498918035e-08, +-3.95819647194621209e-08, +-3.45951523880267082e-08, +-3.03878873980653645e-08, +-2.68162583362294236e-08, +-2.37667262127236846e-08, +-2.11489620751174137e-08, +-1.88905402057703053e-08, +-1.69329655406916389e-08, +-1.52286712532549248e-08, +-1.37387291409417274e-08, +-1.24310888461385951e-08, +-1.12792129566024387e-08, +-1.02610112286780395e-08, +-9.35800233611985976e-09, +-8.55465033248397049e-09, + 3.01927897135586363e-07, + 1.70935515685270357e-07, + 1.01893884110959664e-07, + 6.34158375451773589e-08, + 4.08665515402879895e-08, + 2.71756303106942352e-08, + 1.92486469129839174e-08, + 1.58008590796145144e-08, + 1.44258819787528370e-08, + 1.04140467786766899e-08, + 2.73457968025177651e-09, +-2.34129077508280298e-09, +-1.63932553677450221e-09, + 1.00837284474205082e-09, + 2.46232676270681058e-09, + 2.62861437671588013e-09, + 2.26185623937291488e-09, + 1.81453218023294516e-09, + 1.43244849574748028e-09, + 1.13453817988910574e-09, + 9.06717612538894045e-10, + 7.31916998397245195e-10, + 5.96499611125662716e-10, + 4.90465575158022825e-10, + 4.06581815408406289e-10, + 3.39584199452508669e-10, + 2.85598930084928667e-10, + 2.41742059521923841e-10, + 2.05842585723751289e-10, + 1.76249138533177428e-10, + 1.51693451058495502e-10, + 1.31192676553284111e-10, + 1.13978715496269043e-10, + 9.94465607746544444e-11, + 8.71161458083917701e-11, + 7.66038648890826803e-11, + 6.76012353817865300e-11, + 5.98585939377443353e-11, + 5.31727383908348321e-11, + 4.73773603906575930e-11, +-9.01373828996468101e-09, +-4.62492213545931301e-09, +-2.51691716575973325e-09, +-1.44303393636532486e-09, +-8.66798091358299239e-10, +-5.25970603789924824e-10, +-2.74506872071922031e-10, +-8.76437804254533736e-11, +-9.41689040536575231e-11, +-3.21712094824426256e-10, +-3.81927565918930145e-10, +-9.60795820961087037e-11, + 1.25198988187684620e-10, + 1.13059254300151898e-10, + 3.41693526875027561e-11, +-1.05987590128377787e-11, +-2.25244453510492325e-11, +-2.11909555361709076e-11, +-1.69346886854951283e-11, +-1.29908207571764080e-11, +-9.93351584336625251e-12, +-7.65705786708336422e-12, +-5.96511825337461592e-12, +-4.69637261145679762e-12, +-3.73429080602812384e-12, +-2.99661626485732588e-12, +-2.42511120174280678e-12, +-1.97805417266131648e-12, +-1.62519639809130974e-12, +-1.34436768534606867e-12, +-1.11912247141186680e-12, +-9.37145243090367063e-13, +-7.89128347547651264e-13, +-6.67958866363884297e-13, +-5.68174255366418963e-13, +-4.85542893452850434e-13, +-4.16738517781249882e-13, +-3.59167467694737537e-13, +-3.10760160273944561e-13, +-2.69878506496024490e-13, + 2.62574932650787586e-10, + 1.22531402501750347e-10, + 6.09458687706394697e-11, + 3.19377761141422494e-11, + 1.77665972112043979e-11, + 1.16437769523051300e-11, + 9.54372200581950479e-12, + 4.98415262071886840e-12, +-6.13342133107770217e-12, +-9.58602009579656140e-12, + 6.29123766780031166e-12, + 1.37254440847220509e-11, + 3.64236359801098838e-12, +-3.13965774739914653e-12, +-2.78053143159982660e-12, +-1.02887789501357347e-12, +-1.11441671568205124e-13, + 1.55996344655985748e-13, + 1.79859132262114430e-13, + 1.46085013378424118e-13, + 1.09727741263713625e-13, + 8.13725853899255959e-14, + 6.07253427970052342e-14, + 4.58045710555739020e-14, + 3.49309413116386204e-14, + 2.69367339723564564e-14, + 2.09760721496732519e-14, + 1.64850421172756347e-14, + 1.30685750342460603e-14, + 1.04463236756400256e-14, + 8.40950575299606180e-15, + 6.82022884882686542e-15, + 5.56539178680292343e-15, + 4.57205438460482310e-15, + 3.77832611140664619e-15, + 3.13214243452134485e-15, + 2.61702716903271253e-15, + 2.19514620682445786e-15, + 1.84842668539020230e-15, + 1.56618848485194401e-15, +-7.47595055654960618e-12, +-3.18460448251923226e-12, +-1.45838032825536150e-12, +-7.09395035882232580e-13, +-3.38334419904039648e-13, +-1.18851567681498547e-13, +-7.08490479662840503e-14, +-2.93509217649866781e-13, +-4.08385564542018584e-13, + 2.77083985134580352e-13, + 6.31244195373338763e-13, +-1.57000456056105132e-13, +-3.96877581659461106e-13, +-8.02575772595034856e-14, + 6.44977541148996263e-14, + 4.97685344859269748e-14, + 1.81487481767539905e-14, + 3.46392437810196328e-15, +-7.54513847136254664e-16, +-1.38559457368724046e-15, +-1.16765520623093974e-15, +-8.62584164569718527e-16, +-6.17056241269913905e-16, +-4.46342659619997602e-16, +-3.30411170340882885e-16, +-2.43191221159304455e-16, +-1.82933335007610104e-16, +-1.39920636901915710e-16, +-1.05038605669301942e-16, +-7.75927541953081395e-17, +-6.37599911043023225e-17, +-4.68013855887142849e-17, +-3.90121896814880770e-17, +-3.07770818072858434e-17, +-2.19578790035443077e-17, +-2.22062522179368772e-17, +-1.56721040179101127e-17, +-1.48138537847802549e-17, +-1.11143724769564611e-17, +-7.65367909191496249e-18, + 2.08372866925973641e-13, + 8.11316850284344441e-14, + 3.40409585742571939e-14, + 1.56015942254916311e-14, + 8.72631373570137910e-15, + 4.83772421410275126e-15, +-2.68157047061581857e-15, +-9.53476251110352715e-15, + 7.83420820521191829e-15, + 2.79352631673099761e-14, +-1.26454483586020887e-14, +-2.34327946074044088e-14, + 6.66623685158167854e-15, + 8.67352273959969498e-15, + 1.01398554002485144e-15, +-1.13389765434977585e-15, +-7.17380937332682762e-16, +-2.46259571978105610e-16, +-5.09844499720599194e-17, + 1.42713276823307547e-19, + 8.06121692040876113e-18, + 8.17220820762313457e-18, + 8.07049688289315050e-18, + 9.76471811519305682e-18, + 4.73723673240893691e-19, + 2.81771464438544788e-18, + 2.72305851928715804e-18, +-1.93249127501716934e-18, + 1.99766401257336009e-18, + 3.72577856074210437e-19, + 1.18220482941113480e-18, + 2.32067502912121495e-18, +-4.46118351031095857e-19, +-4.24049757740974252e-20, + 2.69941124249781719e-18, +-3.26131568992712632e-18, +-9.86623988025115384e-20, +-6.18256296167954955e-19, +-3.96223855784147181e-19, + 9.33728955669560632e-19, +-5.69962295012963546e-15, +-2.03472679638113493e-15, +-7.86756257854146257e-16, +-3.09303538036336492e-16, +-1.18267009306029736e-16, +-1.34430245889806705e-16, +-2.67672872597444925e-16, + 2.77672145769733473e-17, + 8.88193220240537056e-16, +-2.69205720287854380e-16, +-1.33469576441170555e-15, + 7.30575208440612900e-16, + 5.09015371081567923e-16, +-2.24357020791701549e-16, +-1.36163954609273970e-16, +-4.16500894942047440e-18, + 1.81429417353798698e-17, + 1.21212251509212923e-17, + 4.94002248524892093e-18, + 1.24441073559061976e-18, +-2.16531084946340291e-18, +-3.10879982329298437e-18, + 5.15226495744606487e-18, + 3.96445473275650837e-18, +-6.62541172511293301e-19, + 2.59871904055293775e-18, +-6.27386242216544026e-19, + 2.94365572157829503e-19, + 7.33859879302887878e-19, + 7.69866122793702145e-19, + 1.65886463685561088e-18, + 1.60321106216752013e-18, + 6.40946610511453358e-19, + 1.95523999666731297e-18, + 3.33323415966739633e-18, +-1.33236368946140773e-18, + 6.49549527572568341e-19, +-5.99149727709950723e-19, + 1.02371588059066373e-18, + 2.01951751227032140e-18, + 1.64138728104685499e-16, + 5.48430258055566149e-17, + 2.25546629665842713e-17, + 4.99230584559184249e-18, +-2.57437369676824366e-19, + 6.41176138023193682e-18, +-4.25015758480262268e-18, + 2.14873296821450262e-17, + 1.21569880208045368e-17, +-5.34718674379455320e-17, + 2.85228687010611591e-17, + 2.85943070980424530e-17, +-2.57056588797290464e-17, +-4.58269028903902602e-18, + 6.89225260887967374e-18, + 3.21748719427315127e-18, +-7.07417013594628594e-19, + 6.45292193781137601e-19, + 1.18993388124321386e-18, +-1.76194675650969496e-18, +-7.09482859455682910e-19, + 7.11195304831584632e-19, + 4.45530053868008064e-18, + 4.31439535880385639e-18, +-2.00341578810098070e-18, + 2.03046704776643187e-18, +-8.37657205252341580e-19, +-4.93256110901829990e-18, + 3.48501179385141762e-18, + 2.28473190641651950e-18, + 3.79403240065629336e-19, + 2.17031419078547454e-18, + 1.09353851323872869e-18, + 4.78549845983934943e-19, + 2.72561368036043568e-18, +-9.37533662395119184e-19, +-1.58363427906966036e-18, + 2.91448662081248909e-19, + 1.16543406357524679e-19, +-5.69024484413889897e-19, + 3.69272149691262087e-19, + 4.72091149555805734e-18, + 4.60109360168463311e-18, +-4.38608873414257521e-18, +-1.54436621849424239e-18, + 2.24780921425485675e-18, +-3.18750203797025541e-18, +-2.30186902653970962e-18, +-4.16320008415829786e-18, + 8.07099148406466859e-19, +-3.98746603989434092e-18, +-7.35852042085350660e-18, + 3.93812760435120802e-18, + 1.90540408168932341e-18, + 2.38437684110224027e-18, + 9.43527821093271215e-19, + 1.06091318616844236e-18, + 1.20319937554172480e-18, +-2.56538931358101413e-19, + 1.95499238076340975e-18, +-9.95780863249427655e-19, +-1.52722050256159069e-18, + 4.94023544386405142e-18, + 6.45954920175677263e-18, + 3.51965579164958423e-18, + 7.89900632777327775e-19, + 1.03816506710129509e-18, +-1.98244794733165083e-18, + 1.47282711779194412e-18, + 6.19280177469367806e-19, + 1.22632199566990245e-18, + 2.68273222053426875e-18, + 9.38414886972021196e-19, + 6.61275007558207654e-19, + 2.28248030922813282e-18, +-1.14045713343264782e-18, + 8.69005146228998635e-20, +-8.31446653671650944e-19, + 7.91407715708505103e-20, + 1.20000072006245535e-18, +-1.58372098577746790e-18, +-2.81020865608021612e-18, + 1.99957275814397923e-18, + 1.29885413252540845e-18, +-4.80155969837316440e-18, + 2.29995660378222113e-18, +-7.05843302534819033e-18, +-1.64483262687761661e-18, + 7.70472564689458282e-19, + 4.41056200503054396e-18, +-2.71180201728303289e-18, +-2.25064257244443364e-18, + 5.98302594104516961e-19, +-2.22915804141577929e-18, +-2.07652185794972679e-18, + 1.04342273662050828e-18, +-6.92628622873299505e-20, +-7.48537295091099561e-19, + 4.39277723875035447e-19, +-3.51860192236938439e-18, + 1.21424277662796652e-18, + 5.70517618165080829e-19, + 3.55014047091843960e-19, + 2.00392584674573928e-21, +-1.69803753314204394e-18, +-9.25429435237640985e-19, + 2.23597354651470345e-18, +-4.42879691056107217e-19, + 4.60311494842865973e-19, + 1.15705381672149679e-18, +-3.68991839234943252e-19, + 1.08174447438685432e-18, + 1.48645612329355543e-19, + 1.81875793884324054e-18, + 2.25183382836367039e-18, +-9.56817584364251024e-19, + 1.91381256045703506e-18, +-4.10444384478857931e-19, +-7.60689380506595026e-19, +-5.76253028046778804e-19, +-4.43497072067296872e-18, + 7.96200031553857225e-19, +-1.80850577628952492e-18, + 1.93314214004708221e-19, +-6.47664373352737857e-19, + 9.28001588198247449e-19, +-8.99863336420612880e-19, + 1.37542136893288434e-19, +-1.67195406117359513e-18, + 1.40947349026671110e-18, +-2.88099087289223063e-18, +-2.50708188733049349e-18, +-1.64325906607610467e-18, +-5.24259532756155584e-18, +-6.51068453721806752e-19, +-2.53702556201332290e-18, +-1.58663681037865609e-18, + 9.06070572852713673e-20, +-2.42267506313044601e-18, + 6.06923148866177988e-19, +-4.32759215054468755e-18, +-3.21973427823112057e-18, + 9.92625075899313052e-19, +-2.34296626507974843e-18, +-7.34638669661034516e-19, + 6.28911543235382504e-19, +-5.41307806168744913e-18, +-5.92095310140597911e-19, +-2.51496850388952190e-18, +-1.82175716625371460e-18, +-1.86451390309454153e-18, +-7.88145768156907905e-19, +-9.74120876779777186e-19, +-2.34866092107893059e-18, + 1.03676206852957944e-18, +-2.65612852614552900e-18, +-1.54321609456851483e-18, +-1.51854675319788852e-19, +-1.30406818038221021e-18, +-1.39115368408820079e-18, +// nroots = 8 +// root 0 + 9.77212003037213450e-01, + 9.73267233110016505e-01, + 9.68247020577381323e-01, + 9.61752813969570575e-01, + 9.53209932137817573e-01, + 9.41794409199968596e-01, + 9.26359517699342216e-01, + 9.05427204412222353e-01, + 8.77397984047491364e-01, + 8.41183665219639165e-01, + 7.97214917916193810e-01, + 7.48075273079634284e-01, + 6.97752753024686756e-01, + 6.49829116346907210e-01, + 6.06259787205050693e-01, + 5.67488570194758180e-01, + 5.33163777665762395e-01, + 5.02695758593403208e-01, + 4.75507893361072465e-01, + 4.51107486661174950e-01, + 4.29089019795556581e-01, + 4.09120366519048761e-01, + 3.90928053106590567e-01, + 3.74285116366954385e-01, + 3.59001672140750183e-01, + 3.44917649866020415e-01, + 3.31897163335079737e-01, + 3.19824109181705230e-01, + 3.08598692757428239e-01, + 2.98134661341977081e-01, + 2.88357082200535408e-01, + 2.79200544280909568e-01, + 2.70607692209054340e-01, + 2.62528023078250461e-01, + 2.54916892661418204e-01, + 2.47734689715362028e-01, + 2.40946146113261955e-01, + 2.34519757430842302e-01, + 2.28427293888773808e-01, + 2.22643385627511542e-01, +-1.75024888183574292e-03, +-2.20874463934297560e-03, +-2.83183622451398673e-03, +-3.69177391463476915e-03, +-4.89344175973117392e-03, +-6.58157076753042476e-03, +-8.93148422424943668e-03, +-1.20884956510950749e-02, +-1.60053829427959510e-02, +-2.01926339702582849e-02, +-2.36360220044773764e-02, +-2.52804868735369455e-02, +-2.48459442926238956e-02, +-2.29780059161503215e-02, +-2.05742160738611110e-02, +-1.82192826283969177e-02, +-1.61377820239777918e-02, +-1.43606369348125446e-02, +-1.28528619699077636e-02, +-1.15685544298849367e-02, +-1.04671044978239241e-02, +-9.51570712925893514e-03, +-8.68836168885499249e-03, +-7.96441438801487843e-03, +-7.32732773275188674e-03, +-6.76374134149758562e-03, +-6.26276806203036711e-03, +-5.81546445982985844e-03, +-5.41442880840318011e-03, +-5.05349281330641584e-03, +-4.72748292512202399e-03, +-4.43203385436150964e-03, +-4.16344163682706974e-03, +-3.91854694532030225e-03, +-3.69464173547115211e-03, +-3.48939404117596004e-03, +-3.30078699600926291e-03, +-3.12706908610363259e-03, +-2.96671333092329717e-03, +-2.81838360658577449e-03, +-4.92049149946200819e-05, +-6.62967198896168480e-05, +-9.07731940154633696e-05, +-1.26104729225190931e-04, +-1.76959195288805605e-04, +-2.48374208899316455e-04, +-3.42077701159060864e-04, +-4.46897238681381545e-04, +-5.23744263754710162e-04, +-5.03559158414223574e-04, +-3.35946352373449157e-04, +-6.96822973951301977e-05, + 1.64738830594272337e-04, + 2.84621209584514875e-04, + 3.05721601776586687e-04, + 2.79334153550004098e-04, + 2.40737502902986923e-04, + 2.04285417555200987e-04, + 1.73520826565283563e-04, + 1.48298862339400647e-04, + 1.27658881400387764e-04, + 1.10661317678547791e-04, + 9.65490294170945606e-05, + 8.47373630952282669e-05, + 7.47764305786384486e-05, + 6.63175634559178511e-05, + 5.90879766897587445e-05, + 5.28722286700291109e-05, + 4.74986446918903248e-05, + 4.28292864354470226e-05, + 3.87524638492299042e-05, + 3.51770877395760336e-05, + 3.20283694113856219e-05, + 2.92445164189191631e-05, + 2.67741721840585708e-05, + 2.45744162607610615e-05, + 2.26091908270298538e-05, + 2.08480538620584369e-05, + 1.92651846415732773e-05, + 1.78385855287932648e-05, +-1.18833787279454917e-06, +-1.69090306120644540e-06, +-2.43341392568051842e-06, +-3.51673481331677688e-06, +-5.02896968823208850e-06, +-6.90884519974021615e-06, +-8.58671169863323947e-06, +-8.38724391180232875e-06, +-3.45587073083539486e-06, + 7.62438960893618550e-06, + 1.96643346590752288e-05, + 2.27720593428162223e-05, + 1.51479971227536662e-05, + 5.16334747246906865e-06, +-9.04996898300889914e-07, +-3.03615268610400796e-06, +-3.22676241574009281e-06, +-2.81203891503895479e-06, +-2.32071204233649943e-06, +-1.89635935362398038e-06, +-1.55601117300358167e-06, +-1.28673946585569133e-06, +-1.07286489276013546e-06, +-9.01557460214966300e-07, +-7.63103300810500367e-07, +-6.50234542279453406e-07, +-5.57483339141934004e-07, +-4.80696351010931709e-07, +-4.16686842667562693e-07, +-3.62986125400903310e-07, +-3.17664490405120383e-07, +-2.79200823447897185e-07, +-2.46386652348765289e-07, +-2.18254815500490151e-07, +-1.94025929304051106e-07, +-1.73067852888932429e-07, +-1.54864736954283597e-07, +-1.38993203486220524e-07, +-1.25103876859243701e-07, +-1.12906963027553060e-07, +-2.56691069776944998e-08, +-3.79363579610582869e-08, +-5.59159627769922531e-08, +-8.05043389219312658e-08, +-1.08265843202647006e-07, +-1.21707464535750041e-07, +-7.16854010821327302e-08, + 1.27636286284132303e-07, + 5.10083876870465323e-07, + 8.22880386560964713e-07, + 5.64365745564570634e-07, +-1.97164887473218772e-07, +-6.53257798400847087e-07, +-5.28695758289333942e-07, +-2.36023918976375980e-07, +-5.29620278290945365e-08, + 1.59611577464790325e-08, + 3.10912745267308644e-08, + 2.91391831125120804e-08, + 2.38191972528121831e-08, + 1.88758339406559649e-08, + 1.49442056542708608e-08, + 1.19185441162633545e-08, + 9.59148498048882808e-09, + 7.78747254646547356e-09, + 6.37544411731371422e-09, + 5.25974225428086499e-09, + 4.37032766451189187e-09, + 3.65542897197312584e-09, + 3.07637458483974642e-09, + 2.60398227482918042e-09, + 2.21601917455397688e-09, + 1.89539411763733907e-09, + 1.62885801518343273e-09, + 1.40605884023636749e-09, + 1.21884814413150160e-09, + 1.06076714083831377e-09, + 9.26662560560645661e-10, + 8.12397110598623119e-10, + 7.14629661201263509e-10, +-4.97882099740269722e-10, +-7.42612771610237154e-10, +-1.06519629884418949e-09, +-1.37329008965156889e-09, +-1.27674215501272417e-09, + 3.17990338704192588e-10, + 5.43822345268078951e-09, + 1.50056429126455724e-08, + 2.12930697034129620e-08, + 5.01477575135420656e-09, +-3.07296110979469490e-08, +-3.71852612182376077e-08, +-6.19070079029745388e-09, + 1.43128822252951643e-08, + 1.27129950996723615e-08, + 5.78122571195404423e-09, + 1.65906626490039541e-09, + 1.42471054163518383e-10, +-2.38233889421969572e-10, +-2.68566039416497928e-10, +-2.22242933433773261e-10, +-1.72185914770567087e-10, +-1.32140352334468353e-10, +-1.01994005335237956e-10, +-7.94629203018318159e-11, +-6.25087823210007432e-11, +-4.96243672781866751e-11, +-3.97334478942978867e-11, +-3.20676068348998489e-11, +-2.60728058753908448e-11, +-2.13455417782791848e-11, +-1.75885120173193086e-11, +-1.45807985534615992e-11, +-1.21563304927374330e-11, +-1.01893514313045739e-11, +-8.58386035074084034e-12, +-7.26586287565999718e-12, +-6.17800982679792608e-12, +-5.27550252598943416e-12, +-4.52314303048802851e-12, +-8.46696270902012230e-12, +-1.19754523557057064e-11, +-1.44068186050707470e-11, +-8.90307563383095959e-12, + 2.40695294702044475e-11, + 1.23557284681012519e-10, + 3.14995055513553991e-10, + 4.36572964343690807e-10, +-6.91934139181464996e-11, +-1.30626029473997946e-09, +-1.24856264446810630e-09, + 7.86556910535767270e-10, + 1.36300847058674014e-09, + 2.94611781504290135e-10, +-2.83344698670885235e-10, +-2.44424288922187490e-10, +-1.05864465766236112e-10, +-3.13869952026153172e-11, +-5.41336973152899860e-12, + 1.24322272088477502e-12, + 2.20673765669384339e-12, + 1.89639537172014409e-12, + 1.44762613961659621e-12, + 1.08133017800892895e-12, + 8.10255319978035393e-13, + 6.12822608470014528e-13, + 4.68160533049397632e-13, + 3.61255996263161985e-13, + 2.81305986469739020e-13, + 2.20990716356920430e-13, + 1.74985750102199533e-13, + 1.39624290924666465e-13, + 1.12174328770702646e-13, + 9.07228005660818695e-14, + 7.38327725046906194e-14, + 6.04452783277513617e-14, + 4.97682623031284198e-14, + 4.12059001606492405e-14, + 3.42656492574911000e-14, + 2.86279301623710324e-14, +-1.16489350698224215e-13, +-1.25610969135720556e-13, +-1.23073379507281136e-14, + 5.13671225770573844e-13, + 2.08061567862924403e-12, + 5.27081535851952702e-12, + 7.67185367777338551e-12, +-2.60405393027446976e-12, +-3.59448393354791200e-11, +-3.83020820325007270e-11, + 5.06049492382322482e-11, + 6.62987940854683414e-11, +-2.39162637889979210e-11, +-3.64429464790304387e-11, +-5.92638193763733454e-12, + 5.22191955192964492e-12, + 3.92557185513486427e-12, + 1.57626008507885026e-12, + 4.57807984575322700e-13, + 9.18280148385308847e-14, +-5.06503335004239770e-16, +-1.62011154851201972e-14, +-1.48893293583219519e-14, +-1.12750152265669342e-14, +-8.22960668825075284e-15, +-5.95842686750035601e-15, +-4.42139993652492772e-15, +-3.26535836028619260e-15, +-2.46966495782832339e-15, +-1.83692867625327702e-15, +-1.43029833408514587e-15, +-1.07043955404182467e-15, +-8.60534488004226759e-16, +-6.71243620548411148e-16, +-5.27198153591818010e-16, +-4.29910787994649043e-16, +-3.39201949072550496e-16, +-2.63502067288771315e-16, +-2.15768341114821640e-16, +-1.77581147625290448e-16, +-9.03880295593033831e-16, + 7.68495503836540787e-16, + 7.73545656015463834e-15, + 2.84912077923000334e-14, + 7.37608741024349264e-14, + 1.17548890600848971e-13, +-2.88152672421265519e-14, +-7.08683752737666631e-13, +-1.10567539225353713e-12, + 1.51551111834745558e-12, + 2.89934925927812963e-12, +-2.19490693559254880e-12, +-2.07020584732590517e-12, + 8.54919087309934186e-13, + 7.15972041196535248e-13, + 6.40760523841098367e-14, +-8.57145074792425273e-14, +-5.36504658396007120e-14, +-1.97948512194173607e-14, +-5.51587496481815743e-15, +-1.15246476582206044e-15, +-8.89464893228499579e-17, + 1.25206209463950831e-16, + 1.26592941471029078e-16, + 8.95546231868367988e-17, + 8.93429728867106060e-17, + 2.42033203442479420e-17, + 3.66384942848297248e-17, + 1.07680775002975392e-17, + 1.91966260505093444e-17, + 1.07411666413193880e-17, + 2.89148433066260479e-17, + 5.01105999740586532e-18, + 1.19139061459310441e-17, +-7.21487981432445189e-18, +-7.41212219110410198e-18, +-5.09219690705439485e-18, + 1.45935119148788115e-18, + 5.16459026935851256e-18, +-3.70665377954591192e-18, + 3.26398020898603475e-17, + 8.54396197431986048e-17, + 3.63046948642729323e-16, + 9.03857318194971418e-16, + 1.61849813123847544e-15, + 5.93258123440542876e-17, +-1.02975212445234759e-14, +-2.51792379166560546e-14, + 2.10250254062102247e-14, + 1.06697121127855960e-13, +-7.66420062510171374e-14, +-1.19165184357594303e-13, + 9.78640447169605786e-14, + 3.40549104664086115e-14, +-2.29115432368048327e-14, +-1.02205021253927012e-14, +-1.65345510020732753e-16, + 1.21459393028902026e-15, + 6.57934492019718213e-16, + 2.23962082922894836e-16, + 6.12551399591508061e-17, + 1.68874172239124804e-17, + 5.68411075622526214e-18, + 3.08622142953887085e-18, + 4.86464387045018181e-18, + 1.35548226125991355e-17, +-7.20057328574907118e-18, + 8.89686601288564427e-18, +-2.84104354142122654e-18, + 1.36822131953533105e-17, +-8.18457635199231370e-19, + 2.66831664749461336e-17, + 8.19732030508997038e-18, + 3.25139786425759492e-18, + 1.25162484684694552e-18, +-5.49690219949552908e-18, + 1.85937756130783413e-18, + 9.13967253104450959e-18, + 9.72578412611557002e-18, + 6.97249782090783927e-19, +-2.32922896057342644e-18, + 2.01130859590381375e-17, + 2.20738927584902181e-17, + 2.41331665213290507e-17, + 6.13197690279356730e-17, +-1.44860816938181918e-16, +-4.19783507576193017e-16, +-1.64677541601697624e-17, + 2.57808783739939819e-15, +-2.78946496298287721e-16, +-6.57535095492554462e-15, + 5.49516864515523438e-15, + 1.85798137641081464e-15, +-2.78719776137281245e-15, +-1.01111612819139582e-16, + 4.18503639646703646e-16, + 1.23198835897274402e-16, +-5.15717368233622401e-19, + 3.50931027244710281e-18, +-2.77905826708606206e-18, + 4.01435797793797202e-19, + 3.30258808109682365e-18, + 1.90159259396378483e-18, + 2.31983511161464460e-17, + 1.59519768849447171e-17, + 2.34168119579995359e-17, +-9.11267308180468650e-19, + 1.26404918769364006e-17, +-3.00307419999949143e-18, + 7.55794281214600064e-18, +-3.19960407035678878e-18, + 1.60123831604507369e-17, + 7.88808767176141006e-18, + 1.40568871195025553e-18, +-7.87332636431820277e-18, + 3.36753265505034352e-18, +-3.02247765591436508e-19, + 7.56122023564347648e-18, + 6.53617349334505901e-18, + 1.74669692515665063e-18, + 3.66760849698578418e-18, + 2.85561139974306610e-18, + 1.99467484113715364e-17, +-4.53262347721798609e-18, + 3.81666107010530503e-17, +-2.38325940705474183e-17, + 1.28538977569939204e-18, + 5.15469418698253957e-17, + 6.92330956121032484e-17, +-2.19135663997263164e-16, + 9.78667484201636175e-17, + 2.25162272932084292e-16, +-2.38651777194996119e-16, + 6.96927123888903434e-17, + 6.30610890561154251e-17, + 2.72798521921509838e-17, + 1.94243072849333846e-18, + 4.62262876912658387e-17, + 3.31549323383730496e-17, + 1.68344182857999372e-17, + 1.46379962428923626e-17, + 1.11123185660521633e-17, + 1.61927788425317693e-17, + 2.85736912305991208e-17, + 8.10923350138355550e-18, + 2.75913204195562440e-17, + 4.26314720197296606e-18, + 1.14554811029575529e-17, + 8.92483964408881592e-18, + 2.25824459089154421e-17, +-8.19460775501381538e-19, + 1.70894267054393057e-17, + 4.57180280930691917e-18, + 2.69448719549135413e-18, + 2.62199389789777101e-18, + 4.94924061758588329e-18, +-8.18347968536867870e-19, + 5.72383177240278596e-18, + 7.68195838871332969e-18, +-1.54295574382087952e-18, +-1.32905624738299383e-17, + 5.08410687732749027e-18, + 1.97429582147385781e-17, + 4.50766337861218587e-18, + 1.32223768606963534e-17, +-1.35071606869998336e-17, + 2.53694259716446502e-17, + 1.67791861871966789e-17, + 7.73263664734375715e-18, + 1.34358578526745206e-17, + 3.69477505470646652e-17, +-1.04443765442427288e-17, + 1.62730930208594503e-17, +-2.37494663107553319e-17, +-1.44212985492640681e-17, +-2.52107146181783779e-17, + 4.23036452113962860e-18, +-7.45246203977720748e-18, +-4.82912894705630339e-18, +-4.59969144499834334e-18, + 1.86642497892338764e-19, + 4.51743725744223343e-18, +-1.55072402251053419e-18, +-3.71576814045040961e-18, +-1.16705060579161368e-17, + 2.75427965376539862e-18, + 1.10284727037604528e-17, + 9.42430843643575886e-18, + 7.80153521211915180e-18, + 1.42855167512020891e-17, + 1.82035379405012203e-17, + 1.19284664626849466e-17, + 5.83168141249169149e-18, + 1.04272081322394393e-17, + 5.89846546723251579e-18, + 5.86603554003182191e-18, + 6.69402283163558590e-18, + 7.06950887545484622e-18, + 6.15573268264320724e-18, + 3.34816232709185409e-18, + 2.91173658032852613e-18, +-8.72897694261825235e-18, +-3.44074933346804228e-18, +-1.71975119938276117e-17, +-4.79906552758936480e-18, +-8.59457931185338662e-18, +-1.92538674297686860e-17, + 7.14770394241757016e-18, +-1.52762681220625490e-17, +-1.36509118289334229e-18, + 7.39242769338493732e-18, + 1.23406282420717824e-17, + 1.22588089439834756e-17, +-4.30309977978995764e-17, +-1.53043330827517431e-18, +-2.26804318512902635e-17, +-7.91736304208066824e-18, +-7.77330085406721249e-18, +-1.61331278228602586e-17, +-1.37126279899829294e-17, +-1.83350560728815096e-17, +-1.86743846235648137e-17, +-1.48764530714785410e-17, +-9.81668816685268112e-18, +-1.45557890747740806e-17, +-2.28944150795084556e-18, +-6.89215425132037269e-18, +-2.22514484986406173e-17, +-2.01505913955979030e-17, +-1.26529863543578543e-17, +-1.14482756600671667e-17, +-1.84343125078397381e-17, +-3.84047622139454940e-18, +-9.35996021335624695e-18, +-2.33849255953609715e-17, +-1.29435377505664408e-17, +-1.30268969787992071e-17, +-1.12454234236871741e-17, +-9.97303499067745817e-18, +-1.39126652345849333e-18, + 1.17045363532054855e-02, + 1.19820953682908335e-03, + 1.27019329629163562e-04, + 1.40998622092971043e-05, + 1.66551171081126666e-06, + 2.14299329983171108e-07, + 3.10715419657541153e-08, + 5.32514171969845533e-09, + 1.14796437994671293e-09, + 3.32929492191957341e-10, + 1.35943259542682050e-10, + 7.72642038779175994e-11, + 5.66908043712769473e-11, + 4.85877802487044285e-11, + 4.49316937272216856e-11, + 4.28733475485454076e-11, + 4.13946516099575764e-11, + 4.01546942059194794e-11, + 3.90448355198982865e-11, + 3.80281065172529511e-11, + 3.70881856464118222e-11, + 3.62149622828579504e-11, + 3.54007141036999503e-11, + 3.46390499622884452e-11, + 3.39245353122906842e-11, + 3.32524960043579765e-11, + 3.26188829303658367e-11, + 3.20201678005859246e-11, + 3.14532599284504280e-11, + 3.09154388038421492e-11, + 3.04042989617478531e-11, + 2.99177045690974030e-11, + 2.94537517658429337e-11, + 2.90107372420915581e-11, + 2.85871318663443767e-11, + 2.81815584323853921e-11, + 2.77927727855274151e-11, + 2.74196477379436771e-11, + 2.70611592986786777e-11, + 2.67163748346749786e-11, +-1.15938372572488031e-02, +-1.17453787585004811e-03, +-1.22777145444888901e-04, +-1.33676861470357742e-05, +-1.53601934580019114e-06, +-1.89741979269322155e-07, +-2.58497316058890962e-08, +-4.01677035976472660e-09, +-7.40360482549271266e-10, +-1.67470580474089563e-10, +-4.68755165842139307e-11, +-1.56965470085922369e-11, +-5.94603367088829678e-12, +-2.51273176501699968e-12, +-1.27335826083348789e-12, +-8.31039215564505160e-13, +-6.62684068163183801e-13, +-5.81985301901983820e-13, +-5.29513548101298752e-13, +-4.87988334249289218e-13, +-4.52439122476638476e-13, +-4.21180739048292225e-13, +-3.93398080882787518e-13, +-3.68547823347336036e-13, +-3.46209345204828561e-13, +-3.26040130698166646e-13, +-3.07756128875464336e-13, +-2.91119503983992272e-13, +-2.75929676669968484e-13, +-2.62016415500915465e-13, +-2.49234404842333738e-13, +-2.37458927597079709e-13, +-2.26582405353804237e-13, +-2.16511605041652018e-13, +-2.07165368165512147e-13, +-1.98472752964772213e-13, +-1.90371505211919342e-13, +-1.82806792349111898e-13, +-1.75730149987321135e-13, +-1.69098600694719362e-13, + 3.16510413464344458e-03, + 3.17127755266335531e-04, + 3.26742532310615396e-05, + 3.48917953306820708e-06, + 3.90385034257309739e-07, + 4.64509982478394940e-08, + 5.99830565111207071e-09, + 8.63129718719958258e-10, + 1.42867729025730456e-10, + 2.81127294395433910e-11, + 6.74718277767624262e-12, + 1.97957961199654035e-12, + 6.76684823249217666e-13, + 2.45014815163740923e-13, + 8.75260751782391080e-14, + 3.16793295681445578e-14, + 1.34181556888861397e-14, + 7.68634540080361417e-15, + 5.69536263915700966e-15, + 4.76185850323340823e-15, + 4.15239804646161464e-15, + 3.67614717199237482e-15, + 3.27919221111349801e-15, + 2.94096533506957102e-15, + 2.64986150150343493e-15, + 2.39759600548270052e-15, + 2.17772200328209982e-15, + 1.98507666196234092e-15, + 1.81547235381781568e-15, + 1.66548317947902701e-15, + 1.53228596384241430e-15, + 1.41353874962911696e-15, + 1.30728676694498545e-15, + 1.21188899325321252e-15, + 1.12596033099000564e-15, + 1.04832574152082127e-15, + 9.77983608671233135e-16, + 9.14076282011451868e-16, + 8.55866245964116835e-16, + 8.02716727280630654e-16, +-5.93505545067104221e-04, +-5.88584755068082157e-05, +-5.98451289927298806e-06, +-6.28027879241438988e-07, +-6.86412149586380293e-08, +-7.91001134960428391e-09, +-9.77039142788100415e-10, +-1.32156883531449252e-10, +-2.00909963160866323e-11, +-3.53005492558366630e-12, +-7.35331842829991600e-13, +-1.85730652954670648e-13, +-5.75592340041060103e-14, +-2.06624256097712027e-14, +-7.52914021778484610e-15, +-2.54309095098519724e-15, +-7.98862847772385100e-16, +-2.57796891160984379e-16, +-1.03895925972569333e-16, +-5.96235811241283596e-17, +-4.39970235987536336e-17, +-3.59722210278908961e-17, +-3.04300432727821827e-17, +-2.60864802616563133e-17, +-2.25370929344365333e-17, +-1.95904266191296974e-17, +-1.71220590379347578e-17, +-1.50397357129646823e-17, +-1.32720404028485126e-17, +-1.17627494577290081e-17, +-1.04671521494237088e-17, +-9.34940246660706341e-18, +-8.38054962818773921e-18, +-7.53705161086233883e-18, +-6.79964186705051671e-18, +-6.15245786284289209e-18, +-5.58236557733619179e-18, +-5.07843198702062159e-18, +-4.63151022134631124e-18, +-4.23391115217698428e-18, + 8.46930091890756991e-05, + 8.32087479591210580e-06, + 8.36027255498813571e-07, + 8.63919434277703148e-08, + 9.25208474283820453e-09, + 1.03745126022285466e-09, + 1.23475884974607797e-10, + 1.58772459351438000e-11, + 2.25431059563481590e-12, + 3.62102113814135891e-13, + 6.72680661975367104e-14, + 1.46716271687263283e-14, + 3.86168402240500905e-15, + 1.27983676460524542e-15, + 4.88176779672049976e-16, + 1.79023001087605513e-16, + 5.81833459194097355e-17, + 1.69465686716200853e-17, + 4.73886788953303535e-18, + 1.48315540494632954e-18, + 6.43792905277052683e-19, + 4.00897819966906979e-19, + 3.02464148609432188e-19, + 2.44035534688692833e-19, + 2.01448271507716879e-19, + 1.68105039736677582e-19, + 1.41355846337126741e-19, + 1.19645103953815576e-19, + 1.01876794611578026e-19, + 8.72301417639305958e-20, + 7.50768992315529603e-20, + 6.49305472924596888e-20, + 5.64109264201716369e-20, + 4.92185987910896720e-20, + 4.31159654245916257e-20, + 3.79131766468169352e-20, + 3.34575485659751840e-20, + 2.96255192548649652e-20, + 2.63165240201323706e-20, + 2.34482461834326619e-20, +-9.75601635216558423e-06, +-9.50405646028118827e-07, +-9.44770096779262728e-08, +-9.63054608988009826e-09, +-1.01322337513036158e-09, +-1.10979755320262240e-10, +-1.28007304017490770e-11, +-1.57806143148656948e-12, +-2.11803377027942395e-13, +-3.16181703513288693e-14, +-5.36477244023028838e-15, +-1.04840404873606566e-15, +-2.34830179633370957e-16, +-6.39599246171208467e-17, +-2.33661093755995087e-17, +-9.47160270009308262e-18, +-3.44131220387401223e-18, +-1.07361412057780027e-18, +-2.95791480765845552e-19, +-7.60129761259349465e-20, +-2.03231412092194491e-20, +-6.95806433606833481e-21, +-3.56446683244448550e-21, +-2.43647005027187716e-21, +-1.86778791777134676e-21, +-1.48638604526171261e-21, +-1.20077938033626312e-21, +-9.79067662272088620e-22, +-8.04362313092048970e-22, +-6.65363210012152471e-22, +-5.53882717324747241e-22, +-4.63820813967057665e-22, +-3.90559474785938844e-22, +-3.30588895755209044e-22, +-2.81204210846461606e-22, +-2.40305878405240481e-22, +-2.06253570446282820e-22, +-1.77760790240644027e-22, +-1.53803983660421744e-22, +-1.33568544177576002e-22, + 9.42528177456963596e-07, + 9.11139535531895212e-08, + 8.97091341681360921e-09, + 9.03427972990555706e-10, + 9.35792753560321484e-11, + 1.00437152858643291e-11, + 1.12783627553302061e-12, + 1.34180311059444307e-13, + 1.71815171455925321e-14, + 2.41233822742607978e-15, + 3.78989089323779446e-16, + 6.80074036806173846e-17, + 1.38587103226732594e-17, + 3.05755373810170424e-18, + 8.78673708382736892e-19, + 3.70295162404124509e-19, + 1.56190170904155367e-19, + 5.51070307042113486e-20, + 1.64253156211334212e-20, + 4.31101803827058541e-21, + 1.04412583066518006e-21, + 2.52648070653959618e-22, + 7.25367205268588971e-23, + 3.06740981727356015e-23, + 1.87236420947720424e-23, + 1.35764677159548834e-23, + 1.04216152623362568e-23, + 8.16869454844830688e-24, + 6.46954955316991279e-24, + 5.17014749630426429e-24, + 4.16255617574030243e-24, + 3.37408600781783581e-24, + 2.75466678146710453e-24, + 2.26213439421963920e-24, + 1.86849263540011103e-24, + 1.55205559029669145e-24, + 1.29518153222965611e-24, + 1.08593727490131488e-24, + 9.16798512429645301e-25, + 7.76072670563116110e-25, +-7.84361512671622717e-08, +-7.52939940319291457e-09, +-7.34944040026575507e-10, +-7.32161355113614442e-11, +-7.48024053054754852e-12, +-7.88729841206545252e-13, +-8.65444926577087679e-14, +-9.98850402278148388e-15, +-1.22907324969815547e-15, +-1.63875779136397515e-16, +-2.40992065795985177e-17, +-3.98733572663770887e-18, +-7.64241688682577137e-19, +-1.57031847630763060e-19, +-3.16550973031982611e-20, +-1.06231458221194267e-20, +-5.28030002248334357e-21, +-2.22725286092091814e-21, +-7.50520481745200105e-22, +-2.13124552171881755e-22, +-5.34744483435336632e-23, +-1.23489529807219682e-23, +-2.78794700518989608e-24, +-7.08200010293469856e-25, +-2.53076296031725032e-25, +-1.36178660782173713e-25, +-9.08221001925411958e-26, +-6.59881043069808197e-26, +-5.14038905343858938e-26, +-3.77814972265111095e-26, +-2.96472300260812656e-26, +-2.45025233794955243e-26, +-1.85597170707652163e-26, +-1.36696017406448386e-26, +-1.20059452349646624e-26, +-1.00579779431070083e-26, +-7.58159117791866967e-27, +-6.71207786123919320e-27, +-4.12307174014058876e-27, +-2.51145594290217222e-27, + 5.73452295769976676e-09, + 5.46963607769852303e-10, + 5.29722442477258807e-11, + 5.22611278581502726e-12, + 5.27443986745717710e-13, + 5.47541771454100609e-14, + 5.88834786862184019e-15, + 6.62060576127962674e-16, + 7.87380813308416756e-17, + 1.00466854886395671e-17, + 1.39769494806072240e-18, + 2.14888622418340165e-19, + 3.77385267930585282e-20, + 7.91872813871285685e-21, + 1.44542530401583382e-21, + 2.50386535996340546e-22, + 1.22820255938782224e-22, + 6.84178934403132202e-23, + 2.77140985960894801e-23, + 8.83152143575256033e-24, + 2.38832516024607743e-24, + 5.76860138528849462e-25, + 1.28951479677162750e-25, + 2.63585036838444383e-26, + 6.79866571426043907e-27, + 2.67356882482591551e-27, + 2.47919305934453333e-27, + 1.56938892955457685e-27, + 4.87720048737918792e-28, + 1.29266799497765772e-27, + 5.37725273388711202e-28, +-7.13295675955678564e-28, + 8.62235814602700781e-28, + 1.35919313879669595e-27, + 3.33999493317892315e-28, + 5.87513918472601147e-28, +-2.92590526370758487e-29, +-2.60448797885333152e-28, + 4.88802860552772004e-28, + 1.67450893382355800e-27, +-3.73943481707416947e-10, +-3.54581732491032490e-11, +-3.40965436281542825e-12, +-3.33451879594969804e-13, +-3.32877678825564147e-14, +-3.40825673194444440e-15, +-3.60124135823214040e-16, +-3.95814368241262931e-17, +-4.57112611166321020e-18, +-5.61600821084398381e-19, +-7.44947531041096842e-20, +-1.08261367895833847e-20, +-1.71450402732220861e-21, +-3.40944652589460212e-22, +-7.50932742553345811e-23, +-8.93518153149650032e-24, +-1.55344747281662594e-24, +-1.42752956788264206e-24, +-7.97457900975659788e-25, +-3.03133438269480600e-25, +-9.01994683384969311e-26, +-2.15205839217465099e-26, +-2.97495979649810990e-27, +-2.55190115101019030e-27, + 3.18059828161618373e-28, + 1.11773312972989634e-27, + 1.01103486515882775e-27, + 2.31252666166222881e-27, +-2.85441398009197199e-28, + 2.13672355316387921e-27, + 5.43878426359867758e-28, + 5.13137181837631681e-28, +-6.96884655525233219e-28, + 4.53380141098612359e-28, + 1.06359362703421246e-27, + 6.45564395819627471e-28, + 3.77385332915753473e-28, +-2.04669472332900274e-28, + 1.30662060281116050e-27, + 1.13265769257695895e-27, + 2.20109972879006328e-11, + 2.07589047632539641e-12, + 1.98322399706826399e-13, + 1.92417796084893836e-14, + 1.90210072593976660e-15, + 1.92373473257172978e-16, + 2.00128541506438461e-17, + 2.15634126528600286e-18, + 2.42755009697010888e-19, + 2.88646612847887342e-20, + 3.67151285282270276e-21, + 5.08849075989052415e-22, + 7.61405263838427661e-23, + 1.23159739749887740e-23, + 3.24791599255527867e-24, + 5.59582562378820366e-25, + 1.24370694079563306e-26, + 1.12426578052876944e-26, + 1.84530970984303270e-26, + 7.07026221800975152e-27, + 4.28211336225444692e-27, + 2.91037048991655001e-27, + 1.16707412055738298e-27, +-2.23202201291758741e-27, + 1.08197357745482433e-28, +-1.12659323653950430e-28, + 4.01220477819175750e-28, + 1.18857082282408888e-27, + 9.54399204404327803e-28, + 5.29079219464878096e-28, + 1.54846044126027394e-27, +-3.97796530537322213e-29, + 1.21789240954014209e-28, + 1.29546893999239344e-27, + 7.32465694889889785e-28, + 1.11741430590225942e-29, +-9.22176046732067518e-30, +-2.56011200123042836e-28, + 4.64558129364205595e-28, + 4.56082271374911935e-28, +-1.18089751072130634e-12, +-1.10818699561228934e-13, +-1.05242013993552875e-14, +-1.01374004503918250e-15, +-9.93268202154632031e-17, +-9.93576298258291600e-18, +-1.01945845693442639e-18, +-1.07940908326136598e-19, +-1.18837222286568060e-20, +-1.37346417665272609e-21, +-1.68534449339878632e-22, +-2.22328563901395978e-23, +-3.29173698291913304e-24, +-4.36287822660241030e-25, +-9.61667752308431560e-26, +-2.51237926843531682e-26, + 6.11138029125487792e-28, + 2.13867848861560468e-27, + 6.37044691099445983e-28, +-3.99120531827319989e-28, + 8.48204371455465617e-28, + 1.72470194160650224e-27, + 7.37529223889737029e-28, + 1.32563324320713921e-29, + 1.57262363195937294e-27, + 1.17865695211580263e-27, + 8.85653271594006573e-28, + 7.48233260432291233e-28, + 1.23967326047591733e-27, + 2.13637452177241482e-27, + 1.22337692459851672e-27, + 4.85860691810321677e-28, + 1.20388403518101195e-27, + 6.86353618157419785e-28, + 5.46052906707125621e-28, + 4.34717647310594628e-28, + 6.48772852193145986e-28, +-5.59056323064211613e-28, + 8.95216329489740377e-28, + 1.25411068207726965e-27, + 5.82086878415291485e-14, + 5.43748104960281875e-15, + 5.13531140054134077e-16, + 4.91385550957415061e-17, + 4.77651169406184780e-18, + 4.73078162681082540e-19, + 4.79419332077641110e-20, + 4.99842178857416662e-21, + 5.39631521111575861e-22, + 6.08164960653741827e-23, + 7.24232863156958447e-24, + 9.15595226148520731e-25, + 1.30487760064913215e-25, + 1.74423138655639165e-26, + 3.23838651607288577e-27, + 1.99809785840049286e-27, + 2.86441075690302443e-28, + 1.32041877347910404e-27, +-4.26882645503073838e-28, +-4.64491243921665482e-28, + 2.32623736618273363e-28, + 1.61455481351498001e-27, + 7.18968336275642100e-28, +-4.23058253923348356e-28, + 4.37198329483451840e-28, +-1.29480542462025086e-27, +-6.26036209682496221e-28, + 9.28220321322203594e-28, + 1.37888160698100639e-27, + 8.90394144701147500e-28, + 5.70878602205536872e-28, +-7.74837325588224112e-28, + 1.19291843079909109e-27, + 9.70069458326008994e-29, + 8.97702024409481463e-28, + 4.09356045289481371e-28, + 5.14057160451012269e-28, + 1.79200182648416928e-28, + 5.93030571690996738e-28, + 1.29987735550912073e-27, +-2.65513791497501911e-15, +-2.47174911161549103e-16, +-2.32082553948755909e-17, +-2.20757361518658852e-18, +-2.13241850662440373e-19, +-2.09478627519464620e-20, +-2.09925886125761961e-21, +-2.16638801203617925e-22, +-2.29967577172260648e-23, +-2.55851513004736560e-24, +-3.09421998624805884e-25, +-4.32956217585500517e-26, +-5.59158781558939141e-27, +-3.19964802784879856e-27, +-7.30554379656590476e-28, +-2.08981168864527769e-28, +-1.44393061111355607e-27, +-1.56462031031703110e-28, + 4.87777965374212233e-28, +-1.32831638919378359e-27, +-5.31730798017855786e-28, + 5.76890799571199262e-28, + 2.80900860607389264e-28, + 2.13136209796610683e-30, +-1.75847214877315267e-27, +-1.96059371345880321e-28, +-1.62102124508808661e-27, +-1.22967460775072787e-27, + 1.88407450740569111e-28, +-6.84294440435001177e-28, +-1.14944513108646881e-27, +-3.62230426869735905e-28, +-6.18630984484289074e-28, + 3.24133716027155971e-28, +-6.82332032158982781e-28, +-4.55438274235095178e-28, +-4.59371810128868981e-28, +-6.77075701385470983e-28, +-4.82870307074607106e-28, + 1.58639584915883790e-28, +// root 1 + 8.84423611085977890e-01, + 8.66946128476546618e-01, + 8.46090521107805582e-01, + 8.21361999922444963e-01, + 7.92402855334694567e-01, + 7.59141319416308025e-01, + 7.21930694471271450e-01, + 6.81595747760856963e-01, + 6.39327451181573636e-01, + 5.96469829398903917e-01, + 5.54332734876974209e-01, + 5.14106634873708668e-01, + 4.76790062255910918e-01, + 4.43033733788899875e-01, + 4.13017777236298456e-01, + 3.86521457491423637e-01, + 3.63122737003270191e-01, + 3.42367531677803760e-01, + 3.23850012827284095e-01, + 3.07231676535186016e-01, + 2.92235729953342349e-01, + 2.78635857062120518e-01, + 2.66245784133107954e-01, + 2.54910931700716881e-01, + 2.44501976483362832e-01, + 2.34909900592631532e-01, + 2.26042157240016556e-01, + 2.17819672968377176e-01, + 2.10174481551355680e-01, + 2.03047839639723726e-01, + 1.96388713482973681e-01, + 1.90152554175664457e-01, + 1.84300299219195052e-01, + 1.78797553062042619e-01, + 1.73613910269897476e-01, + 1.68722393176626712e-01, + 1.64098982042537284e-01, + 1.59722220438311302e-01, + 1.55572882167033216e-01, + 1.51633688811127043e-01, +-7.97389989856745265e-03, +-9.53117393473719432e-03, +-1.13509840628490503e-02, +-1.33972694772347238e-02, +-1.55667004778499984e-02, +-1.76768510457561666e-02, +-1.94900276288929933e-02, +-2.07811967783806360e-02, +-2.14156567339086022e-02, +-2.13732877136203307e-02, +-2.07014851817438617e-02, +-1.94713227654324458e-02, +-1.78102175863380993e-02, +-1.59373486957696958e-02, +-1.40917477888732774e-02, +-1.24277942253091227e-02, +-1.09950890902043123e-02, +-9.78134165288393163e-03, +-8.75374824965215181e-03, +-7.87891958862645299e-03, +-7.12874009739245321e-03, +-6.48077625141132378e-03, +-5.91730295296359534e-03, +-5.42425068762787503e-03, +-4.99035590397852932e-03, +-4.60651928637781545e-03, +-4.26532600890910420e-03, +-3.96068504667511107e-03, +-3.68755537340438892e-03, +-3.44173600532746539e-03, +-3.21970344058267535e-03, +-3.01848465149099710e-03, +-2.83555701312472076e-03, +-2.66876883148271359e-03, +-2.51627576362102026e-03, +-2.37648959877160507e-03, +-2.24803672821454349e-03, +-2.12972426446312191e-03, +-2.02051224088760232e-03, +-1.91949067584876718e-03, +-1.78207077522377755e-04, +-2.11279283028677353e-04, +-2.43070624926762887e-04, +-2.66649472499352240e-04, +-2.72338772393254723e-04, +-2.50716392931536703e-04, +-1.98292855730172355e-04, +-1.21984938650902437e-04, +-3.63873012497332573e-05, + 4.59913568531162848e-05, + 1.20758928124474314e-04, + 1.84586385920094341e-04, + 2.26510153803832542e-04, + 2.37086836456128875e-04, + 2.21475521501114919e-04, + 1.93720428860077044e-04, + 1.64768154340625545e-04, + 1.39303744775754135e-04, + 1.18212503549123242e-04, + 1.01006929967420591e-04, + 8.69445917270588039e-05, + 7.53672791454021315e-05, + 6.57557928726897138e-05, + 5.77113035873307541e-05, + 5.09272985371983687e-05, + 4.51662948589943452e-05, + 4.02425064100696929e-05, + 3.60092038969927553e-05, + 3.23494663357346880e-05, + 2.91693493298899166e-05, + 2.63927851591837198e-05, + 2.39577365415651968e-05, + 2.18132678263368591e-05, + 1.99172945991779001e-05, + 1.82348399063950426e-05, + 1.67366723134284640e-05, + 1.53982342501433380e-05, + 1.41987928486138971e-05, + 1.31207626249239145e-05, + 1.21491618503573437e-05, +-2.68530204307732378e-06, +-2.77815442381538259e-06, +-2.43002043165825273e-06, +-1.36976568099101755e-06, + 5.52883519754196407e-07, + 3.10403085568342521e-06, + 5.53962711769466811e-06, + 6.97221812455900789e-06, + 7.12002029707483944e-06, + 6.56477204117763629e-06, + 5.87168128386986474e-06, + 4.60680218031438004e-06, + 2.23199391838340326e-06, +-3.89041627125185084e-07, +-2.00979994514872535e-06, +-2.47077087219778889e-06, +-2.29825868233577183e-06, +-1.93773905858519951e-06, +-1.58520002090635739e-06, +-1.29243196208682364e-06, +-1.05990098047417155e-06, +-8.76375958163489659e-07, +-7.30690901558859712e-07, +-6.14016210779904532e-07, +-5.19719880379812842e-07, +-4.42849293410183276e-07, +-3.79680067604204219e-07, +-3.27383455713194380e-07, +-2.83789086576561346e-07, +-2.47215631547773712e-07, +-2.16348841215042825e-07, +-1.90152744303536685e-07, +-1.67804297716541093e-07, +-1.48644805590639673e-07, +-1.32143460268441703e-07, +-1.17869735376865817e-07, +-1.05472306141320782e-07, +-9.46628264020879656e-08, +-8.52033501087461374e-08, +-7.68965098550660052e-08, +-1.43864270909483853e-08, + 5.12333356345375706e-09, + 4.12771708301378172e-08, + 9.30711992516805877e-08, + 1.45117776075130126e-07, + 1.65933519773063371e-07, + 1.28678208683844873e-07, + 4.71568797380913030e-08, +-2.17804176113601921e-08, +-4.04856201029471013e-08, +-5.15893276247841822e-08, +-1.14356240711929742e-07, +-1.72166566314651216e-07, +-1.40954315074030770e-07, +-6.09098448310145061e-08, +-2.90178762567891990e-09, + 1.99164781082059755e-08, + 2.33331075355440145e-08, + 2.03119302679020797e-08, + 1.63155264229942875e-08, + 1.28730511418684914e-08, + 1.01810090131856939e-08, + 8.11777700200725998e-09, + 6.53246961489320925e-09, + 5.30375579638513945e-09, + 4.34206727599270983e-09, + 3.58220472690045423e-09, + 2.97645902268826798e-09, + 2.48956950894398629e-09, + 2.09519820966118563e-09, + 1.77347032688522752e-09, + 1.50924385532395387e-09, + 1.29087869505419674e-09, + 1.10935139359586237e-09, + 9.57611603197006392e-10, + 8.30109728853043747e-10, + 7.22446955556229438e-10, + 6.31113573474119887e-10, + 5.53291838726149287e-10, + 4.86706264119413584e-10, + 6.32931939287471545e-10, + 1.36202574323190275e-09, + 2.25342227370987510e-09, + 2.80492499821563267e-09, + 2.12664384503724471e-09, +-3.00421875691433926e-10, +-3.32099855011352885e-09, +-4.30880906844877819e-09, +-2.20883531935079126e-09, +-5.92564420697181798e-11, +-1.70361550747621034e-09, +-4.01468902336344923e-09, +-8.85918841525827263e-10, + 3.53578325553457342e-09, + 3.81314455773321531e-09, + 1.92651432263335637e-09, + 5.10455603512639073e-10, +-6.27710725305874480e-11, +-1.98780616783260221e-10, +-1.90533405711302026e-10, +-1.52839952617170218e-10, +-1.17539031332556726e-10, +-9.00424092407250239e-11, +-6.94718513118336323e-11, +-5.41203114479959935e-11, +-4.25724674215864712e-11, +-3.37972257536734301e-11, +-2.70609076682368480e-11, +-2.18399880760104975e-11, +-1.77571822375280572e-11, +-1.45376050884829150e-11, +-1.19788569973430648e-11, +-9.93040505318876941e-12, +-8.27918789780048877e-12, +-6.93956902448573027e-12, +-5.84612936598539567e-12, +-4.94848762925803569e-12, +-4.20759268443853204e-12, +-3.59294933145237669e-12, +-3.08054818294412345e-12, + 2.45226799074056953e-11, + 3.56238230954767588e-11, + 3.53056858329624394e-11, + 4.07156143069924058e-12, +-6.52862752289918501e-11, +-1.29198123410916018e-10, +-1.02084730315858130e-10, + 2.93651426507723057e-11, + 1.22777493960565227e-10, + 2.26951349276916926e-11, +-1.36882689293757883e-10, + 2.13210240552052217e-12, + 2.18791723590140939e-10, + 1.04951319714829364e-10, +-6.00958977624663776e-11, +-7.78991294097223113e-11, +-3.91376748388156008e-11, +-1.19320419301855464e-11, +-1.37273916144260083e-12, + 1.35502454621646681e-12, + 1.60554587714611142e-12, + 1.31094624886812232e-12, + 9.89361921779346877e-13, + 7.37036222632272035e-13, + 5.51937575374786612e-13, + 4.17381054437725319e-13, + 3.18869671819025758e-13, + 2.46035177924402868e-13, + 1.91595549022022193e-13, + 1.50490116319593783e-13, + 1.19175372753477379e-13, + 9.50926809351467150e-14, + 7.64015852445024204e-14, + 6.18012711345066447e-14, + 5.02944187141025760e-14, + 4.11653929022683183e-14, + 3.38962982569400781e-14, + 2.80626150139946782e-14, + 2.33388071959374026e-14, + 1.94919595839360733e-14, + 4.33027373068620030e-13, + 2.93415171657531133e-13, +-4.41689714542006560e-13, +-1.86067506338084121e-12, +-2.84203182557461668e-12, +-1.13892416974484134e-12, + 3.22798186509521415e-12, + 5.23208815008025057e-12, + 3.14828054187681790e-13, +-6.75337395538394189e-12, +-1.78431653965627773e-12, + 1.01585287588588273e-11, + 1.96501413588436429e-12, +-7.52438833802811510e-12, +-3.11243072125346344e-12, + 1.05613481192768171e-12, + 1.32623932797684372e-12, + 6.22527299177111730e-13, + 1.90820494670016966e-13, + 3.42783815129025754e-14, +-6.33142210708294330e-15, +-1.21937307219339179e-14, +-1.03513706730274358e-14, +-7.71125903890617491e-15, +-5.60281802179565031e-15, +-4.06799200400434759e-15, +-2.99177031408661586e-15, +-2.22693932590004136e-15, +-1.66829775167946270e-15, +-1.27226756925280683e-15, +-9.72473614520222630e-16, +-7.38281833294687435e-16, +-5.74484978568695319e-16, +-4.58422418800032340e-16, +-3.60666928998764143e-16, +-2.88956297283299014e-16, +-2.29810254876003574e-16, +-1.74064505562765101e-16, +-1.53288130089086470e-16, +-1.21635275621922385e-16, + 9.97533439282076063e-16, +-1.17070682621298494e-14, +-3.52945362396416151e-14, +-4.78551602852624954e-14, + 1.85744307330099083e-16, + 1.08593898721076359e-13, + 1.34999167630463199e-13, +-3.86924614698701887e-14, +-2.45965062990625528e-13, +-1.06950477732421628e-13, + 4.10681482493283530e-13, + 1.21971685762718057e-13, +-4.79157961362012821e-13, +-2.60984927734559922e-14, + 1.96209064559310026e-13, + 5.50788372237201497e-14, +-1.92226388914811010e-14, +-1.92935737694208193e-14, +-8.23891898166621658e-15, +-2.42977957351105728e-15, +-4.84692540055333494e-16, + 2.24805144982848313e-17, + 1.03502623955919729e-16, + 7.61107376369790486e-17, + 6.87180936770649243e-17, + 5.51005301143319788e-17, + 2.78868822368790650e-17, + 2.04772446694158402e-17, + 1.66785853188105324e-17, + 9.35082705503896121e-18, + 1.28359186773316565e-17, + 1.50125522734641256e-17, + 1.31407359018613160e-17, + 5.30208246011601593e-18, + 1.12372087978758148e-18, +-3.06394394972881693e-18, + 3.22477699532982946e-18, + 7.33513648331560752e-18, +-1.49098447976534267e-18, +-3.88445685505626403e-18, +-1.86862476117716448e-16, +-5.17385922611269971e-16, +-7.17558472243235091e-16, + 2.70960741018042091e-16, + 2.51887719886670323e-15, + 2.78626082771712163e-15, +-2.05799916505300166e-15, +-6.82173433411399928e-15, +-2.87391419935866143e-15, + 1.16723181717005363e-14, + 9.72033233318878906e-15, +-2.37211794645416248e-14, + 2.93814360890860906e-16, + 1.49885107443769515e-14, +-1.83187574523375297e-15, +-3.72864106851564815e-15, +-6.11794614547595257e-16, + 3.17113555887273808e-16, + 2.33020189298023400e-16, + 9.94686568580823354e-17, + 3.04140257952479794e-17, + 1.90880270458484259e-17, + 2.09335100551190481e-18, + 2.20296979831804118e-18, + 6.04814552424358104e-18, + 1.56308644955015101e-17, + 1.08933348600631523e-17, + 1.42798510021572124e-17, + 1.13851850152425550e-17, + 2.39628846537441306e-18, + 4.05137021029802670e-18, + 1.07932467023721873e-17, + 6.58405246492764972e-18, + 6.85109483286177803e-18, + 7.19438780115759449e-18, + 6.34114645003634260e-18, + 7.16458412914500091e-18, + 1.12979526217604762e-17, +-2.11561763697321083e-18, +-3.31370408774705029e-18, +-1.81850115509029198e-17, +-3.44890665128436295e-18, +-6.34300620970798065e-18, + 6.29546148375614476e-17, + 6.15929845456302056e-17, +-5.00124531402593188e-17, +-1.60868228398553210e-16, +-7.27655612272010275e-17, + 2.45568817906244266e-16, + 4.00595545132826185e-16, +-6.50156761654954241e-16, +-3.19500155625703158e-16, + 1.05246861289473631e-15, +-3.33059721654949354e-16, +-2.60838996364297857e-16, + 9.03317454315271538e-17, + 5.62507653547635062e-17, + 9.84979569736597698e-18, +-1.27311540472336181e-17, + 7.98868337273438063e-18, + 2.37371547471280106e-18, + 8.73703226020589783e-18, +-1.10521477596313689e-18, + 6.64527601877833519e-18, + 8.52214631470920585e-18, + 1.41638309499329493e-17, + 3.40025428438991730e-18, + 8.14605596568973064e-18, + 3.88737338123301757e-18, + 8.36307252911094278e-18, + 4.89232966437700295e-18, + 9.91172443318960788e-18, + 2.46225494219705418e-18, + 2.03158471083981970e-18, + 3.20560305409849718e-18, +-3.64158947781309721e-18, + 1.48245748667912504e-18, + 7.00343490261542544e-18, + 1.81218005010222704e-18, +-4.62600897119305627e-18, + 1.56908332871091472e-17, + 1.04059072284625806e-17, +-1.57853928017233840e-17, + 1.97068550510003042e-17, + 1.09403992845330548e-17, +-3.00111321722125999e-18, +-1.79449391995527492e-17, +-4.60948482192904945e-17, + 2.92638858025264097e-18, +-4.45236546875349767e-17, +-2.55593334370556334e-17, + 2.72363757483227292e-17, +-1.13107887424094236e-17, + 1.87638628943066505e-18, + 3.47341287962526237e-17, + 1.40126430510824671e-17, + 1.95041138540533187e-17, + 7.48594175254485026e-18, + 9.18802632972164121e-19, + 1.49083123942526814e-17, + 1.25877040936334530e-17, + 1.85832684374729983e-17, + 1.08825795408143222e-17, + 7.44272100832504041e-18, + 9.38717396584556684e-18, + 1.68090381363296047e-17, + 1.56658996113573944e-17, + 2.94532125336268646e-18, + 6.01662387063919590e-18, + 3.86659939810632526e-18, + 7.47394627218158470e-18, + 6.29785905730492249e-18, + 4.55124913222581123e-18, + 6.60773117461885050e-18, + 5.29191549102311927e-18, + 3.97621380490380795e-18, + 6.90109916232195549e-18, + 4.95811822249721173e-18, + 6.20961656528540890e-19, + 2.87949944525984316e-19, + 5.63533860426961382e-18, + 1.37271576366276246e-17, +-1.51854159171702374e-17, + 3.33967820150248270e-18, + 8.41872529229764950e-18, + 1.83657350704212624e-17, +-1.22471011062047839e-17, + 1.25147754396225418e-18, +-3.80570996047792943e-18, +-9.23075924923607496e-18, +-2.91506948368905149e-18, +-4.33505986086628913e-18, + 6.94426854376330679e-18, + 5.36517479727336427e-18, +-1.43204673120090967e-17, +-9.25082801418019878e-18, + 1.00698978505014708e-17, +-3.73618060435391835e-18, +-9.27041064364848306e-18, + 2.54825149688225717e-18, +-1.06692399315798495e-17, + 6.36163476725748680e-18, +-4.04718249927368752e-18, + 3.77543540166809947e-18, + 5.47189789508715679e-18, + 7.88689200718002558e-18, + 7.53477060544334781e-18, + 5.40538996536225089e-18, + 1.01102549605821702e-17, + 2.08784478992758294e-18, + 2.49660667118363319e-18, + 1.07346429174373374e-17, + 4.47032413054069397e-18, + 5.31839920411808418e-18, + 3.04451858336202497e-18, + 2.88248296867085955e-18, + 4.00106226492232108e-19, + 1.37700935841055345e-17, +-1.12204261640005457e-18, + 1.24207610020531850e-18, + 7.54575164025362021e-19, + 1.53604255393805429e-17, +-2.44059536218261452e-17, + 3.69801420591354360e-17, +-2.85038931178410405e-17, +-2.40529200065590229e-18, +-1.17277572149996882e-17, +-8.18582303103446550e-18, + 1.79000995629897870e-17, + 1.04991990818682336e-17, +-7.05428929681637613e-18, + 1.70600574343251138e-18, + 2.12094113144432623e-18, +-2.01270019023652864e-17, +-2.74928889591056898e-18, +-5.06947242881424752e-18, +-1.18411058968386975e-17, +-1.46761262689415548e-17, +-1.49011663234508316e-17, + 6.40512312983534024e-18, + 3.63592088110385022e-18, +-1.82521361302627496e-18, +-9.73413311353153697e-18, +-3.11529797701560394e-18, + 6.45218647969457208e-19, +-7.54328852313260416e-18, +-8.22222344780925616e-18, +-1.22657382974083953e-17, +-1.46890420743141552e-17, +-1.14259611695713582e-17, +-8.88509243554876097e-18, +-9.94392621780918858e-18, +-6.91922188999152347e-18, +-1.15272776756602350e-17, +-1.32928647299726915e-17, +-1.01514555332228659e-17, +-6.60966315179982907e-18, +-1.07776665844610440e-17, +-5.71396749699543707e-18, +-4.07269743272691534e-18, + 2.83677004333855974e-02, + 3.69596549345057278e-03, + 5.33606375081766156e-04, + 8.76226801978300225e-05, + 1.68515711419040738e-05, + 3.90945768375573246e-06, + 1.12140301488843772e-06, + 4.03320889596115884e-07, + 1.81770250177384130e-07, + 1.01104366096275797e-07, + 6.75425926417345017e-08, + 5.22518559162988882e-08, + 4.48782581232845894e-08, + 4.10936769601951526e-08, + 3.89009461980660565e-08, + 3.73859286868311161e-08, + 3.61670421884251880e-08, + 3.51006020815267061e-08, + 3.41341833595477202e-08, + 3.32461024437527705e-08, + 3.24245267636338073e-08, + 3.16611349021429071e-08, + 3.09492787747884656e-08, + 3.02833903368460433e-08, + 2.96587218968002604e-08, + 2.90711876529563572e-08, + 2.85172477484072160e-08, + 2.79938175712651952e-08, + 2.74981950733200008e-08, + 2.70280018331805796e-08, + 2.65811348591502875e-08, + 2.61557268867772169e-08, + 2.57501134553640210e-08, + 2.53628054363495729e-08, + 2.49924659776446261e-08, + 2.46378910487204123e-08, + 2.42979929401195233e-08, + 2.39717862013412924e-08, + 2.36583756023487593e-08, + 2.33569457832776915e-08, +-2.60101249914593755e-02, +-3.26656972179870629e-03, +-4.48686766898158645e-04, +-6.88411488832272125e-05, +-1.20716754772289486e-05, +-2.47327053445490470e-06, +-6.02058460423835704e-07, +-1.75231757233690735e-07, +-6.04671875446253220e-08, +-2.41238020209787839e-08, +-1.06996161059290287e-08, +-5.06281474167700719e-09, +-2.51561911502266675e-09, +-1.36576464971438703e-09, +-8.71042748413514084e-10, +-6.61857680113193290e-10, +-5.63555706100549807e-10, +-5.05244827307646958e-10, +-4.62183215506911584e-10, +-4.26479155626884844e-10, +-3.95519935254461762e-10, +-3.68214781113781021e-10, +-3.43929712930345813e-10, +-3.22204934969378596e-10, +-3.02675507587076660e-10, +-2.85042473447877361e-10, +-2.69057581627339378e-10, +-2.54512916182351848e-10, +-2.41233121543291078e-10, +-2.29069372211394138e-10, +-2.17894625197008144e-10, +-2.07599845860858748e-10, +-1.98090983153319778e-10, +-1.89286527521122795e-10, +-1.81115525678824618e-10, +-1.73515956380406590e-10, +-1.66433393506094458e-10, +-1.59819899373896775e-10, +-1.53633103710382766e-10, +-1.47835433246298169e-10, + 6.55997690082849201e-03, + 7.94790634686250576e-04, + 1.04154173231544770e-04, + 1.50285678560659659e-05, + 2.43464742189543825e-06, + 4.51402691070690511e-07, + 9.73293055019955375e-08, + 2.46448250391390934e-08, + 7.34312821272655206e-09, + 2.56000899552422272e-09, + 1.02729166216523565e-09, + 4.55873037699484464e-10, + 2.08416233965170061e-10, + 9.16633868476727066e-11, + 3.84664234773960983e-11, + 1.68323563573010514e-11, + 8.91808558003694740e-12, + 6.05483274210706757e-12, + 4.83394856404893245e-12, + 4.13343952700874141e-12, + 3.62455363688109363e-12, + 3.21285003777536310e-12, + 2.86667054633798081e-12, + 2.57112541063816704e-12, + 2.31665184208687652e-12, + 2.09611144793684805e-12, + 1.90388598426631994e-12, + 1.73546477719731108e-12, + 1.58718724129750647e-12, + 1.45605833714737388e-12, + 1.33960989850271174e-12, + 1.23579445721175849e-12, + 1.14290304457916076e-12, + 1.05950098716250430e-12, + 9.84377355376608325e-13, + 9.16504864879408420e-13, + 8.55007846911345943e-13, + 7.99136495609058398e-13, + 7.48246033693845947e-13, + 7.01779758460207538e-13, +-1.14432270136976622e-03, +-1.34262931954534008e-04, +-1.68820246980021090e-05, +-2.31020288316433996e-06, +-3.49962082287906631e-07, +-5.97029495914202171e-08, +-1.16447718523696643e-08, +-2.62392258162840356e-09, +-6.85672266581159494e-10, +-2.07410274699480108e-10, +-7.26318035797761510e-11, +-2.96616878561056602e-11, +-1.37470991288682707e-11, +-6.48338809039132220e-12, +-2.78050414170345973e-12, +-1.05264789029543401e-12, +-3.73420040400616719e-13, +-1.43984610234465035e-13, +-7.21988671706942716e-14, +-4.81744815297195291e-14, +-3.76793108526827830e-14, +-3.13013601243999926e-14, +-2.65772388006387822e-14, +-2.28017318751603812e-14, +-1.97024380303088441e-14, +-1.71269252641651730e-14, +-1.49690411318540808e-14, +-1.31485734919462484e-14, +-1.16031579582167264e-14, +-1.02836519382100527e-14, +-9.15096851633199395e-15, +-8.17376937660055185e-15, +-7.32674416240998866e-15, +-6.58931112356590015e-15, +-5.94462637416628721e-15, +-5.37882200048294591e-15, +-4.88041551028852326e-15, +-4.43984864424147080e-15, +-4.04912469564711261e-15, +-3.70152140230316539e-15, + 1.53087318803303899e-04, + 1.74593061489841444e-05, + 2.11739534613583581e-06, + 2.76777194846891817e-07, + 3.95874405576781251e-08, + 6.29296048408940871e-09, + 1.12792347262183014e-09, + 2.30491281638959393e-10, + 5.40096120187626390e-11, + 1.44853541886150543e-11, + 4.39950431147799821e-12, + 1.51605566245773970e-12, + 6.32015804076114187e-13, + 3.18157636783496273e-13, + 1.58246683765113950e-13, + 6.70196024920367901e-14, + 2.38786130058580515e-14, + 7.57157759826000585e-15, + 2.39031743505203783e-15, + 9.07993780096448598e-16, + 4.82720754570567537e-16, + 3.34964695903368223e-16, + 2.61580179921112844e-16, + 2.12849776487629249e-16, + 1.76033263868419610e-16, + 1.46953176430447861e-16, + 1.23579030183027544e-16, + 1.04600100665167844e-16, + 8.90663323246839645e-17, + 7.62614488795614217e-17, + 6.56364151595722726e-17, + 5.67659089008050656e-17, + 4.93175795191611419e-17, + 4.30296448774999800e-17, + 3.76943816235284572e-17, + 3.31458140897668064e-17, + 2.92504566850157364e-17, + 2.59002845358925763e-17, + 2.30073746999649619e-17, + 2.04997652877512326e-17, +-1.66519228913968763e-05, +-1.85207272560914425e-06, +-2.17604298086773221e-07, +-2.73321899907114207e-08, +-3.71983777064152038e-09, +-5.56410869712524124e-10, +-9.27325421440674168e-11, +-1.74179763401045058e-11, +-3.71540841530858000e-12, +-9.02811957510568410e-13, +-2.48364373694981689e-13, +-7.44732572185727685e-14, +-2.39352801858665703e-14, +-1.03911232133629410e-14, +-6.07295950980947123e-15, +-3.18455698254801123e-15, +-1.31533481171196379e-15, +-4.43998441735237465e-16, +-1.30692867268570630e-16, +-3.65693079215599556e-17, +-1.13429105323392236e-17, +-4.79463161157675291e-18, +-2.87264836651695932e-18, +-2.08632312508372971e-18, +-1.62540326939813298e-18, +-1.29824129897525703e-18, +-1.04959039881447588e-18, +-8.55927127813756739e-19, +-7.03213130748934962e-19, +-5.81697875146932885e-19, +-4.84233964937982326e-19, +-4.05496366853966353e-19, +-3.41449430924232590e-19, +-2.89020924688982387e-19, +-2.45845674596342329e-19, +-2.10088653585190204e-19, +-1.80318816113580300e-19, +-1.55407276190639902e-19, +-1.34463120102805432e-19, +-1.16773777636218052e-19, + 1.52894012059386554e-06, + 1.66309423947832736e-07, + 1.90015840783175862e-08, + 2.30469187397209575e-09, + 3.00352342350210199e-10, + 4.26083830227106306e-11, + 6.66533799304744356e-12, + 1.16299093483761662e-12, + 2.28239462714971425e-13, + 5.06198031497040278e-14, + 1.27696269139306112e-14, + 3.65671078450721049e-15, + 1.03690715565863303e-15, + 2.66966654315380642e-16, + 1.37012100044601011e-16, + 1.01555379875009906e-16, + 5.45155786776211404e-17, + 2.15442696502053306e-17, + 6.88222451903629817e-18, + 1.90880868276736198e-18, + 4.92903783989221777e-19, + 1.33276598910843970e-19, + 4.63039634920239639e-20, + 2.36595790360353108e-20, + 1.58127134049269902e-20, + 1.17746848254476832e-20, + 9.09573716139760172e-21, + 7.13715103980649073e-21, + 5.65698875167668940e-21, + 4.51876685035810593e-21, + 3.63990048256028067e-21, + 2.94999407415464894e-21, + 2.40752332621741933e-21, + 1.97769605606922646e-21, + 1.63238481435501608e-21, + 1.35603439286787409e-21, + 1.13309043020550236e-21, + 9.50583083249461466e-22, + 8.01753817349337860e-22, + 6.78482396404371940e-22, +-1.21618053028742691e-07, +-1.29691369714700766e-08, +-1.44553820955129633e-09, +-1.70004588748905978e-10, +-2.13267878757758666e-11, +-2.88798180635444287e-12, +-4.27319804986402430e-13, +-6.98717876047619839e-14, +-1.27396018024865797e-14, +-2.60250198929574642e-15, +-5.95485595233023145e-16, +-1.58264141521662521e-16, +-4.98062664747326511e-17, +-1.12541435060932915e-17, +-1.29376682208510655e-18, +-1.59434112428255086e-18, +-1.54323077603128918e-18, +-8.06321346505487989e-19, +-3.00119302851789133e-19, +-9.06304581138671751e-20, +-2.38545546573920221e-20, +-5.80013292676368331e-21, +-1.42852474447962030e-21, +-4.24320784141445017e-22, +-1.88003215796708382e-22, +-1.13996827103880456e-22, +-7.97263731878724400e-23, +-5.96616654486038148e-23, +-4.38525802467292299e-23, +-3.49824222876243366e-23, +-2.57731900464315420e-23, +-2.13809069794196693e-23, +-1.72262635672527012e-23, +-1.33442799769373336e-23, +-1.04420930248585138e-23, +-8.38093891257462338e-24, +-5.84321888082248797e-24, +-5.45621909109216219e-24, +-3.46631057485598817e-24, +-1.82576414313436962e-24, + 8.54191178306164194e-09, + 8.94876863742438254e-10, + 9.75680683788952381e-11, + 1.11651461853721847e-11, + 1.35422914873857167e-12, + 1.76003538981813015e-13, + 2.47914799503211968e-14, + 3.82650763000728233e-15, + 6.53321024748096643e-16, + 1.24269153447998778e-16, + 2.62665202900653419e-17, + 6.00622490770988521e-18, + 1.84999832332830801e-18, + 6.73099516054434013e-19, + 5.59141843742968874e-20, +-2.08568652166221788e-20, + 1.96235048196612618e-20, + 2.13893972131842157e-20, + 1.03873435332070080e-20, + 3.61104016225699133e-21, + 1.03089515804111000e-21, + 2.57817523294906273e-22, + 6.01899359945580748e-23, + 1.40183798513786395e-23, + 3.48063400944359548e-24, + 9.02111375397181355e-25, + 1.04048333851332509e-24, + 3.57028049055266051e-25, + 1.42573071768884064e-24, +-2.22458486064367456e-25, + 9.56520244012227087e-25, + 1.80294873111709428e-25, +-6.13653393918915413e-25, +-1.45839851345338538e-25, +-1.34457062512383266e-24, + 1.18002067260687381e-26, + 7.55189635242275911e-25, + 1.33001397987342871e-25, + 1.43475713798013898e-24, + 1.59442950078963332e-24, +-5.37495419123826227e-10, +-5.54198273021662582e-11, +-5.92448581195291609e-12, +-6.61652611633026978e-13, +-7.78844833208391957e-14, +-9.75977163808342232e-15, +-1.31587626856163547e-15, +-1.92915039724379339e-16, +-3.10457864661232803e-17, +-5.52683069581319348e-18, +-1.10114510763082879e-18, +-2.34586155316927633e-19, +-4.73034821871165495e-20, +-2.53517074114399272e-20, +-8.00475143446642315e-21, + 1.14606852131091260e-21, + 5.73771930562232143e-22, +-2.75516206668912464e-22, +-2.63313339316170271e-22, +-1.16125196273005202e-22, +-3.75687155908424440e-23, +-9.40967053211014460e-24, +-2.61987820279050147e-24, +-8.70996258085373926e-25, +-1.51387430482158507e-24, + 1.27394302401312368e-25, +-1.29026427748921634e-25, + 7.78636072519511169e-25, + 1.65726294479946416e-24, +-2.76846979170209189e-25, + 1.60281131209310825e-24, + 3.76506074375696829e-25, +-6.35500686890392936e-26, + 2.57716950764885967e-25, +-2.97064976239563093e-25, + 7.84134080176556361e-25, + 4.44156289118116584e-25, + 4.82922095009127560e-25, + 9.97845393680076810e-25, + 1.40108585248481282e-24, + 3.06501335599776400e-11, + 3.11523098687690804e-12, + 3.27186610039298939e-13, + 3.57531928741448205e-14, + 4.09759110223900201e-15, + 4.97039466116606958e-16, + 6.44463525195277050e-17, + 9.02278098220374276e-18, + 1.37696161697107725e-18, + 2.30685739048090390e-19, + 4.27197500087487566e-20, + 9.37987982291527605e-21, + 1.51138450293028704e-21, + 3.03423570820585428e-22, + 4.25976292974762069e-22, + 5.10457641190008489e-23, +-3.45057020201429650e-23, +-6.57325478141605225e-24, + 5.57042435320131959e-24, + 3.06515864204488269e-24, + 2.24495323465404123e-24, +-6.42165490189863307e-25, +-2.81725025847219969e-25, +-2.51548712582852976e-26, +-5.37437214064920842e-25, +-7.31994460882189792e-25, + 4.76036437318084031e-25, + 1.20530349857327575e-24, + 1.21468271101146601e-24, +-1.13235551742622529e-25, + 9.64039659161666594e-25, + 8.68169616652903363e-26, +-5.52809729286384352e-26, + 3.47834749959708066e-26, +-2.05402950879848460e-25, +-1.46977111747158419e-25, + 3.27503301545041448e-25, + 1.64667883318185081e-25, + 1.08418141577983965e-24, + 5.53710172700161417e-25, +-1.59863491875903157e-12, +-1.60388471183446779e-13, +-1.65791060724022097e-14, +-1.77660410408537550e-15, +-1.98799600846637935e-16, +-2.34230008356485468e-17, +-2.93261772695026464e-18, +-3.94016015066267249e-19, +-5.73461964336613811e-20, +-9.11836284937459827e-21, +-1.57866320503432103e-21, +-3.14192146030424955e-22, +-8.73344854121428002e-23, + 1.21358030279247080e-23, +-5.45915104529093002e-24, +-5.25682985561009703e-24, + 8.82521097939143763e-25, + 8.06427964358602338e-25, + 2.03154622552600056e-24, + 1.44181580781608164e-24, + 3.29352728956510509e-25, +-1.58335746497727913e-26, +-9.46418910201331566e-26, + 1.92166055208541172e-24, +-4.46786078668955741e-25, + 8.12072208034878745e-25, + 3.55975234898944131e-25, + 1.27737305081446250e-24, + 7.79375690722282514e-25, + 5.37065990883521743e-25, + 1.12403505187791016e-24, + 3.52001970982346803e-25, + 4.82428043718337259e-25, + 7.29774199787311647e-26, + 1.52541602963862427e-25, + 4.73561737224819656e-26, + 5.46979047066280998e-25, + 3.51291707314859025e-25, + 6.12116162937511432e-25, + 3.54874386880201268e-25, + 7.68465214290707963e-14, + 7.61944592094449087e-15, + 7.76310572461727409e-16, + 8.17422346099983135e-17, + 8.95023010460558410e-18, + 1.02728949918733290e-18, + 1.24589339082615739e-19, + 1.60996359841563103e-20, + 2.24158698278351849e-21, + 3.33487600067480082e-22, + 5.27357822124446312e-23, + 6.75614377940823953e-24, + 4.62866926529711413e-24, + 7.25498903656197224e-25, +-1.23765081160763452e-24, +-4.13534381086888021e-25, + 4.10918540860058383e-25, + 7.85303767523782712e-25, + 1.37157652175163090e-24, + 2.54188117931493825e-25, + 7.29326740978763029e-25, +-5.56484323612621542e-25, +-1.96050063095149379e-25, + 2.43143372418167005e-25, +-9.82659690494067564e-25, + 7.05367498265849482e-25, + 3.63961158393009726e-25, + 8.90639541319999829e-26, + 9.94308362351366298e-25, + 2.98784244177434985e-25, + 1.22725980800504437e-24, + 7.60060099694192226e-25, + 1.15982169878300228e-25, + 1.68712370258248906e-25, +-6.53871400520168454e-26, +-1.75594434072385873e-25, +-7.17874544356534299e-26, + 6.58544051480814861e-25, + 2.25646571518323172e-25, + 1.16361199071354343e-24, +-3.43613168868327970e-15, +-3.37867838992383381e-16, +-3.39757613004370283e-17, +-3.52622644566347571e-18, +-3.80203264260886572e-19, +-4.34757202805829327e-20, +-5.13097819236691052e-21, +-6.52331495567423446e-22, +-1.05973809497080794e-22, +-1.65006561395314857e-23, +-3.21379659859829314e-24, +-1.54288380897744682e-24, + 1.92543515730566869e-25, +-6.61531596390315288e-25, +-5.68823640409967808e-25, +-7.22459966554418029e-25, +-8.14274741250797017e-25, +-2.93719838497221590e-25, +-4.14228987015919062e-25, +-7.24647011971165644e-25, + 2.39941190650238379e-25, +-1.52421287375677932e-24, +-2.01808652714432964e-25, +-1.15757801329177607e-24, +-6.41936130582162466e-26, +-3.60186706803428991e-25, +-1.04418889161477857e-24, +-3.34002311752118586e-25, +-8.34973515861683928e-25, +-3.05449701301487190e-25, + 1.89519521594509727e-25, +-5.80174601404838299e-25, +-9.92274728174848617e-25, +-1.75662156531355605e-24, +-1.15256448622774055e-24, +-5.12977732207984094e-25, +-3.43017636651026365e-25, +-4.32986558241335831e-25, + 2.37584870621385105e-25, +-3.86081666932634757e-25, +// root 2 + 7.34484529625055393e-01, + 7.02861090794997589e-01, + 6.68327773496989908e-01, + 6.31412265256805161e-01, + 5.92894143969361243e-01, + 5.53713384414020737e-01, + 5.14832927580780364e-01, + 4.77102244684013854e-01, + 4.41167090882004009e-01, + 4.07451009545092835e-01, + 3.76208414900037424e-01, + 3.47610432346974585e-01, + 3.21785711528498053e-01, + 2.98772834719641056e-01, + 2.78454397263984299e-01, + 2.60568917344090101e-01, + 2.44789433435398190e-01, + 2.30796610272464231e-01, + 2.18313325873448899e-01, + 2.07110543871913660e-01, + 1.97001489887937808e-01, + 1.87833563313109186e-01, + 1.79481186661433867e-01, + 1.71840153831644249e-01, + 1.64823285407623560e-01, + 1.58357090388708571e-01, + 1.52379181274924530e-01, + 1.46836253191677563e-01, + 1.41682488853906885e-01, + 1.36878288287988342e-01, + 1.32389248702799833e-01, + 1.28185338860714010e-01, + 1.24240226011999355e-01, + 1.20530723481902177e-01, + 1.17036334407169096e-01, + 1.13738872646205136e-01, + 1.10622146050105036e-01, + 1.07671690444696835e-01, + 1.04874545096545771e-01, + 1.02219062306142514e-01, +-1.50329733205681413e-02, +-1.65775667659586977e-02, +-1.79281242877920993e-02, +-1.89461086939810147e-02, +-1.95220282027238866e-02, +-1.96075625635951378e-02, +-1.92279870499048045e-02, +-1.84689299386815234e-02, +-1.74445779094990309e-02, +-1.62589628715185848e-02, +-1.49750863941699956e-02, +-1.36157548935795722e-02, +-1.22063362793834000e-02, +-1.08127738763127614e-02, +-9.51994739243893287e-03, +-8.38310894796108312e-03, +-7.41322905664701121e-03, +-6.59404694707269642e-03, +-5.90111546670790774e-03, +-5.31133462368631962e-03, +-4.80561673189481165e-03, +-4.36881092369507690e-03, +-3.98896294896825161e-03, +-3.65658729590511745e-03, +-3.36409082473788316e-03, +-3.10533949062297143e-03, +-2.87533481828958475e-03, +-2.66997073497225604e-03, +-2.48584899191469201e-03, +-2.32013762857198385e-03, +-2.17046138744381775e-03, +-2.03481609581638006e-03, +-1.91150120576600332e-03, +-1.79906622073816602e-03, +-1.69626783518662190e-03, +-1.60203540698211589e-03, +-1.51544296118843211e-03, +-1.43568635038104366e-03, +-1.36206451390146355e-03, +-1.29396401636735527e-03, +-1.99594976967916573e-04, +-1.84088476528919897e-04, +-1.50948965708345219e-04, +-1.01479571091772365e-04, +-4.15921394487789038e-05, + 1.97178782977501325e-05, + 7.35464321757288826e-05, + 1.14053549875230961e-04, + 1.40066825231045415e-04, + 1.55183044194292792e-04, + 1.65474202527254416e-04, + 1.73999821704156878e-04, + 1.77092866330422037e-04, + 1.69625518964212359e-04, + 1.52549092324709271e-04, + 1.31507054283406437e-04, + 1.11300832390125450e-04, + 9.39582811945076444e-05, + 7.96997765119419833e-05, + 6.80926673754249134e-05, + 5.86113210691212121e-05, + 5.08065350562488132e-05, + 4.43272016380743991e-05, + 3.89042543247591070e-05, + 3.43310301460892657e-05, + 3.04474312431165424e-05, + 2.71282147337488675e-05, + 2.42744675389773024e-05, + 2.18073710458607571e-05, + 1.96635956030765475e-05, + 1.77918625588508046e-05, + 1.61503514387664105e-05, + 1.47047255825740315e-05, + 1.34266151115013645e-05, + 1.22924414168703532e-05, + 1.12824990502920575e-05, + 1.03802333014613921e-05, + 9.57166776223604345e-06, + 8.84494773408403027e-06, + 8.18997375773467395e-06, + 6.07747395738616329e-07, + 2.01301000207864077e-06, + 3.49458250693918529e-06, + 4.67109199321132637e-06, + 5.18816555453555006e-06, + 4.90986939633434650e-06, + 3.98337204267350794e-06, + 2.75224013426452393e-06, + 1.63285602717977354e-06, + 9.74116621626059378e-07, + 7.88511953243771108e-07, + 5.75656063394403654e-07, +-1.40932419077279043e-07, +-1.08733172031060320e-06, +-1.67563131577689490e-06, +-1.76677434993105161e-06, +-1.57649973112099468e-06, +-1.31274037873643976e-06, +-1.07001342381591593e-06, +-8.71532682138286292e-07, +-7.14551413774420247e-07, +-5.90790523526258450e-07, +-4.92573777255843667e-07, +-4.13919893288362016e-07, +-3.50352783422130087e-07, +-2.98532870876847867e-07, +-2.55949327143066941e-07, +-2.20695217144603875e-07, +-1.91307449912884645e-07, +-1.66652610263699877e-07, +-1.45844738416558491e-07, +-1.28185467037232927e-07, +-1.13119967589366553e-07, +-1.00204201074214118e-07, +-8.90803402862369738e-08, +-7.94581594573596257e-08, +-7.11008240814824579e-08, +-6.38139547176571581e-08, +-5.74371475232248948e-08, +-5.18373535069255082e-08, + 7.94019751278400363e-08, + 9.37643001197316488e-08, + 8.74230064790398373e-08, + 5.58585090730343403e-08, + 7.34098355158533787e-09, +-4.05364772039609640e-08, +-7.16962809569665796e-08, +-7.79062329574848962e-08, +-5.82213588136796326e-08, +-2.36620183892449775e-08, +-5.16656607108965696e-09, +-2.73436801828242304e-08, +-5.87991322765273837e-08, +-5.25530568263296874e-08, +-1.98772449827100643e-08, + 5.86797594256769760e-09, + 1.57606678328866146e-08, + 1.63273107035345785e-08, + 1.38293372889492534e-08, + 1.10271688173045532e-08, + 8.68351356683374733e-09, + 6.86422090363857765e-09, + 5.47251915517697457e-09, + 4.40368729191574269e-09, + 3.57536412629172154e-09, + 2.92706822013363499e-09, + 2.41483027527551371e-09, + 2.00648586034310080e-09, + 1.67826464526131449e-09, + 1.41241170903626867e-09, + 1.19552900586383993e-09, + 1.01740907322441010e-09, + 8.70205100939222874e-10, + 7.47834212658001930e-10, + 6.45543621291119875e-10, + 5.59592257149590167e-10, + 4.87014800584231190e-10, + 4.25445274206903993e-10, + 3.72984221520159152e-10, + 3.28097666580660440e-10, + 1.05705383618994874e-09, + 2.81775022822311379e-10, +-9.59136678758960408e-10, +-2.12698959195443748e-09, +-2.57080995963094341e-09, +-2.08054782870027868e-09, +-9.71171121633147240e-10, + 3.61093350830051264e-10, + 1.53047032112863208e-09, + 1.65537234680621054e-09, +-7.07775145130215127e-11, +-1.85107486895362426e-09, +-8.18215582633649651e-10, + 1.29426893247126589e-09, + 1.65679909269275185e-09, + 8.62979140551250889e-10, + 1.93471160439043225e-10, +-8.47462742726271357e-11, +-1.44372665687934549e-10, +-1.30722419880743733e-10, +-1.03493463350377770e-10, +-7.93223585597626797e-11, +-6.07147925732815592e-11, +-4.68349118856793741e-11, +-3.64839232886593984e-11, +-2.86989642558112669e-11, +-2.27833598718619218e-11, +-1.82422656521748879e-11, +-1.47227530605930912e-11, +-1.19704450775448738e-11, +-9.80006973460414217e-12, +-8.07517431661219137e-12, +-6.69427203610712183e-12, +-5.58114653216854461e-12, +-4.67808583155388157e-12, +-3.94098398738861286e-12, +-3.33586429057361972e-12, +-2.83642783747006501e-12, +-2.42207168277520590e-12, +-2.07664172845636703e-12, +-1.96652411205965365e-11, +-4.43428319996305915e-11, +-5.51530245879456773e-11, +-3.72458598324942799e-11, + 1.76816357663795297e-12, + 3.65066156085933626e-11, + 5.31214576343607607e-11, + 5.58112403067743775e-11, + 3.55079473740716680e-11, +-3.31134992524064346e-11, +-9.81031022265287323e-11, +-2.39003565767460226e-11, + 9.38818487695221143e-11, + 5.85698058691013715e-11, +-2.07704422311121011e-11, +-3.56705858999396710e-11, +-1.89957071669542436e-11, +-5.66946810030983951e-12, +-2.93437524206049990e-13, + 1.06114094389813965e-12, + 1.11364594949073916e-12, + 8.89862325085777919e-13, + 6.68058990967727631e-13, + 4.97033305025626628e-13, + 3.72109598830299000e-13, + 2.81360615316946032e-13, + 2.14947094362579999e-13, + 1.65849757256496780e-13, + 1.29155120164445083e-13, + 1.01449697268155743e-13, + 8.03349752799877416e-14, + 6.41044909583854340e-14, + 5.15040964493348837e-14, + 4.16616237035545225e-14, + 3.39037818706879389e-14, + 2.77539805070692773e-14, + 2.28494920885575774e-14, + 1.89073464746860023e-14, + 1.57299092318657114e-14, + 1.31505152817766092e-14, +-8.93301558716311324e-13, +-7.57554781040292117e-13, + 8.79964475886688394e-14, + 1.14421687521866362e-12, + 1.47020264098335373e-12, + 9.23651958259578476e-13, + 3.13185338037558534e-13, +-1.63309121771304258e-13, +-1.50117353430471618e-12, +-3.15589590676477430e-12, +-3.96060374624367807e-13, + 5.07281790011147691e-12, + 1.74089833785886899e-12, +-3.24617312800331537e-12, +-1.73638987078692091e-12, + 3.55095667870831606e-13, + 6.27764285542542809e-13, + 3.14420909729212791e-13, + 9.71977660978363502e-14, + 1.51838805663911523e-14, +-6.02933558160471138e-15, +-8.58965526694054665e-15, +-7.05460023319205608e-15, +-5.21820904238183004e-15, +-3.77319172384849162e-15, +-2.75346915375697364e-15, +-2.02861865867517798e-15, +-1.50550320804993675e-15, +-1.13280894871250421e-15, +-8.53653993845013413e-16, +-6.57096230144390000e-16, +-5.00429023900950710e-16, +-3.91942675789209164e-16, +-2.97433237144032327e-16, +-2.38847222870273888e-16, +-1.93471944378060298e-16, +-1.54806367020218898e-16, +-1.25358209597989883e-16, +-1.01330271631942156e-16, +-7.85755831284929709e-17, +-5.35103173153240036e-15, + 1.55581090977600311e-14, + 3.45683854528127909e-14, + 2.57539948400408134e-14, +-6.25636852957763500e-15, +-2.26882607920730111e-14, +-1.39645040797033769e-14, +-2.24185245505213578e-14, +-6.11518644047969453e-14, +-1.20431805220893976e-14, + 1.85048886349048247e-13, + 6.77009805048231979e-14, +-2.19502318324674245e-13, +-4.07925662380046308e-14, + 8.88559489679064278e-14, + 3.26900167979161585e-14, +-6.99545091438432516e-15, +-9.40372590861458139e-15, +-4.26610717316754626e-15, +-1.26509246611869367e-15, +-2.33474737579716130e-16, + 3.25009656688073965e-17, + 5.88813486555645105e-17, + 5.45832233683061963e-17, + 4.79147693260318194e-17, + 2.83771848125267497e-17, + 1.21662705461794593e-17, + 1.34167590367984593e-17, + 9.20781730166290406e-19, + 6.51291253784385732e-18, + 5.88287107601693409e-18, + 7.21157238841951510e-18, + 7.60973646617364471e-18, + 8.31296665325663238e-18, + 4.16549091443473866e-18, +-2.80921810361235793e-18, + 3.91962640403203339e-19, +-2.01005853810092904e-18, +-1.69932647107269271e-18, + 2.59746896985158044e-18, + 4.41584234767905925e-16, + 6.89470553096452740e-16, + 2.29190018982450862e-16, +-6.80994391175437406e-16, +-8.70360321267160434e-16, +-9.37688182433782882e-18, + 2.24903592011662224e-16, +-8.21816588643586937e-16, +-7.56604681603227610e-16, + 4.20614126313289868e-15, + 3.89858121161559750e-15, +-1.00698096217510751e-14, +-1.25919471640775285e-15, + 7.15597638270962345e-15, +-1.40769080583630887e-16, +-1.80917580169391423e-15, +-4.06043036906660619e-16, + 1.32626465233827117e-16, + 1.21613644598144199e-16, + 6.18754768384757968e-17, + 2.15497281104319267e-17, + 1.24108073884790301e-17, + 3.20499607962515951e-18, +-4.23145965689888189e-18, + 9.89984819659077044e-18, +-3.04136447356675311e-18, + 4.19281510093350187e-18, + 7.01636992255536009e-18, + 2.62583108641989263e-18, + 2.10274517155525197e-18, +-9.17671769494582658e-19, + 9.71589040403106963e-18, + 3.98664240221611564e-18, + 5.63221340458289580e-18, + 5.65191812122232362e-18, + 1.77972160687676030e-18, + 8.18623037062656960e-19, +-3.78043939158139647e-20, + 2.14140278200325014e-18, + 4.80437239063512437e-18, + 4.42469350279812304e-17, + 1.11857569198332050e-17, +-1.83987574429410554e-17, +-1.63511860354556095e-17, +-2.66002597980372297e-17, +-6.66240750859045440e-18, +-4.40120833246018928e-18, +-8.25973977352749579e-19, + 6.35076901711655649e-17, + 1.82195381771939366e-16, +-2.54829261620286355e-16, +-1.85974637567896934e-16, + 4.66612753017719848e-16, +-1.13047835848973219e-16, +-1.50318490857123106e-16, + 3.12858196960410092e-17, + 2.87116527287579348e-17, +-1.49100796514953455e-18, + 6.91633503745427510e-18, + 6.68959080807933844e-18, + 6.28164410430262175e-18, + 8.46773196775163563e-18, +-1.16792520833496233e-18, +-7.49920540540402838e-19, + 5.55638276399734173e-18, + 8.01432523600065500e-18, +-3.95101895445181072e-18, +-5.72393081229863373e-19, +-6.98391295176126973e-18, + 7.20053994941559971e-19, + 2.82882911969537933e-18, + 4.82820422554832881e-18, + 3.84855510276187649e-18, + 4.65385182728005793e-18, + 3.94912977123427951e-18, + 1.73169070589628159e-18, + 2.67104245669300418e-18, + 8.15772391831731029e-19, + 3.17742597336061035e-18, + 1.55098103838513050e-18, + 2.54201706531373577e-17, +-1.97874255383572667e-17, + 1.76299863086399680e-17, + 7.33950504313350836e-18, + 1.05962039087655545e-18, +-5.00799689257011293e-18, +-1.80199913788869679e-18, + 8.01215772405390861e-18, +-1.14325061689363671e-17, + 3.00294304834762417e-18, +-2.27469977591969379e-17, + 7.10206499991472164e-18, +-1.45928588466941880e-17, +-4.10274473873252775e-18, + 1.99062451466585245e-17, + 9.04858303704060054e-18, + 1.89337032715188544e-17, + 5.95170488853992404e-18, + 7.95004871229483896e-18, + 2.11298291590651144e-17, + 1.12277790534404059e-17, + 1.24840746507778543e-17, + 6.84474180430521197e-18, +-8.00181176609879997e-19, + 1.06983955261969920e-17, + 5.04059636089610380e-18, + 6.62655788931530882e-18, + 4.30770406142636555e-18, + 1.46173059811001085e-18, + 3.41663787667685885e-18, + 2.30366614193128934e-18, + 5.92762338265061717e-18, + 7.44319775776122163e-18, + 5.75217309816333982e-18, + 3.96136744425661019e-18, + 2.32113664475544091e-18, + 2.66618101932313107e-18, + 9.04461416236976843e-19, +-3.27593934510844028e-19, + 5.80956953747229714e-18, + 3.24122109579283562e-17, +-5.05180262579730729e-18, +-4.00106558990365331e-18, +-1.47074812476778447e-18, +-3.05132876926838136e-17, +-1.86460830151332629e-17, +-1.93695999598818644e-17, + 6.01796709863772295e-19, + 1.67129148473973522e-18, + 8.41975120869897929e-18, + 2.98468970246352784e-19, +-7.91784501970129954e-18, + 1.08436637516483240e-17, +-1.52855372693811214e-17, +-6.07674809796504498e-18, + 1.69185704298307651e-18, +-3.30284301222154820e-18, +-7.47749557072839243e-18, + 4.52840954411902338e-18, + 5.00064148372230199e-18, + 5.45818186969564011e-18, + 2.28018776842435625e-18, +-5.50710715168446460e-18, +-4.83274074600574479e-18, + 1.07459687744170538e-18, + 3.48096003854650300e-18, + 1.43246067937637888e-18, + 3.04606338374837295e-18, +-3.99207787828765336e-19, + 3.45717259656970687e-18, + 3.94436325368911593e-18, + 4.07180207617810048e-18, + 4.29701742821377189e-18, + 4.59961030779957407e-18, + 2.56634365971303147e-18, + 1.89840322687017898e-18, + 2.82268818904111171e-18, + 3.18049069168632725e-18, + 4.30444527893750018e-18, + 3.42965069438257763e-18, +-6.60408554108095886e-18, +-1.09599820951580089e-17, +-1.19086996085659936e-18, +-4.23524491603647944e-18, +-2.24523335166203318e-17, +-1.60158482928951290e-17, +-2.35446736536039639e-17, + 1.24665908996302897e-17, +-7.92796009895689287e-18, +-1.62184648292126630e-18, + 1.80796939746614965e-18, +-1.19373723363796688e-18, +-8.23781525319924202e-19, +-2.17119726984325728e-17, + 9.03514042258456272e-19, +-1.87498411248335453e-17, + 1.47933094829052914e-18, +-7.63253196465570017e-18, +-4.06037347294197794e-18, +-3.81124687400203647e-18, + 1.11193320866151224e-18, +-7.31914031478882780e-18, +-4.92848475408017632e-18, +-2.58213973847297125e-18, + 5.85841672243076069e-19, +-7.36901272879757223e-18, +-7.17785246661416488e-18, +-1.14080886440126122e-17, +-9.18105750762201986e-18, +-1.01789388207461828e-17, +-1.32789228805902964e-17, +-7.68604101654094233e-18, +-3.03831235366963924e-18, +-1.02613532304725988e-18, +-5.19494647871454254e-18, +-5.56171129312616801e-18, +-3.89219371954402598e-18, +-8.01557733901108005e-18, +-3.56544737066423798e-18, +-3.27622180727278711e-18, + 4.78451701668061863e-02, + 9.09227130489683594e-03, + 2.03553251511743574e-03, + 5.45729704051502976e-04, + 1.76833398387097717e-04, + 6.92497765532980791e-05, + 3.24704180943547770e-05, + 1.79292895408821155e-05, + 1.14195337386877161e-05, + 8.20764260709318809e-06, + 6.51353388842778180e-06, + 5.58381121439252865e-06, + 5.05716076108292697e-06, + 4.74036439796047172e-06, + 4.52717273890500689e-06, + 4.36338778642292691e-06, + 4.22462129678986789e-06, + 4.10092914307060733e-06, + 3.98822081928480934e-06, + 3.88450099938561064e-06, + 3.78851608087199259e-06, + 3.69932220305447953e-06, + 3.61614843704473291e-06, + 3.53834533630932986e-06, + 3.46535838273778678e-06, + 3.39671022305998893e-06, + 3.33198726254545596e-06, + 3.27082909267084433e-06, + 3.21292000324415387e-06, + 3.15798209686203257e-06, + 3.10576965761572638e-06, + 3.05606451222954537e-06, + 3.00867218324586284e-06, + 2.96341867921075405e-06, + 2.92014780082432227e-06, + 2.87871886780700175e-06, + 2.83900479096388247e-06, + 2.80089042915143134e-06, + 2.76427118268644801e-06, + 2.72905178400643772e-06, +-3.76832614404288974e-02, +-6.60458602781751995e-03, +-1.33359952000641183e-03, +-3.14187431210122899e-04, +-8.69142135287904083e-05, +-2.81833159984409296e-05, +-1.06047016475340822e-05, +-4.54914741255204253e-06, +-2.17212481094539754e-06, +-1.12166289913149549e-06, +-6.07983936759197225e-07, +-3.39225575603061614e-07, +-1.97015428804120285e-07, +-1.25101993888369828e-07, +-9.07574606068868489e-08, +-7.41887008477214134e-08, +-6.50382720948448174e-08, +-5.88435908399428272e-08, +-5.39607701613346322e-08, +-4.98219214865625643e-08, +-4.62113852668965377e-08, +-4.30223352892666126e-08, +-4.01850828394773854e-08, +-3.76467779784934579e-08, +-3.53649449371775632e-08, +-3.33046825906739431e-08, +-3.14369900577101305e-08, +-2.97375750361523702e-08, +-2.81859489164858555e-08, +-2.67647227806625185e-08, +-2.54590527861189235e-08, +-2.42561992035625738e-08, +-2.31451730027644462e-08, +-2.21164505159634681e-08, +-2.11617414815824165e-08, +-2.02737992675632280e-08, +-1.94462646649304381e-08, +-1.86735365810683109e-08, +-1.79506644256306531e-08, +-1.72732580956293693e-08, + 8.20838682738047123e-03, + 1.33755212838944739e-03, + 2.47115495636679168e-04, + 5.23836514626958578e-05, + 1.28335071333852894e-05, + 3.63885216681343573e-06, + 1.18896636176193834e-06, + 4.43821465000146411e-07, + 1.87223365721605773e-07, + 8.80729902014909012e-08, + 4.51229963325773539e-08, + 2.40285825775537747e-08, + 1.24814321775808063e-08, + 6.07837988986144681e-09, + 2.86316487274264993e-09, + 1.45997584370178465e-09, + 9.02425140796672968e-10, + 6.72822817126018770e-10, + 5.56936849066302896e-10, + 4.81296880858991746e-10, + 4.23168722347908000e-10, + 3.75331555908887016e-10, + 3.34934042380840101e-10, + 3.00411306570252851e-10, + 2.70679895101732346e-10, + 2.44911967206047991e-10, + 2.22452169611723583e-10, + 2.02773653014847113e-10, + 1.85448740118719611e-10, + 1.70127491793245829e-10, + 1.56521525426582768e-10, + 1.44391612645025443e-10, + 1.33538075641272253e-10, + 1.23793285560446785e-10, + 1.15015756030607066e-10, + 1.07085457994275461e-10, + 9.99000773306207026e-11, + 9.33720058796550737e-11, + 8.74259071403971050e-11, + 8.19967353425919049e-11, +-1.25604604832243853e-03, +-1.92085386576340859e-04, +-3.28812400919273226e-05, +-6.37310271841301827e-06, +-1.40968603864004286e-06, +-3.56953425267885247e-07, +-1.03258901500581460e-07, +-3.38975936597701186e-08, +-1.25103760089771066e-08, +-5.15962647291053020e-09, +-2.39667484344198146e-09, +-1.26316292756499496e-09, +-7.11751109612049842e-10, +-3.78660559648794235e-10, +-1.75244968329361405e-10, +-7.12960926024415804e-11, +-2.81126825171406375e-11, +-1.27048292843881902e-11, +-7.44908829344612800e-12, +-5.41158744117865041e-12, +-4.35797894536070238e-12, +-3.64869975318502972e-12, +-3.10374302967421871e-12, +-2.66390531927950750e-12, +-2.30200890566124145e-12, +-2.00112173049652999e-12, +-1.74899841402088648e-12, +-1.53629392033941296e-12, +-1.35572598451198091e-12, +-1.20155344090487031e-12, +-1.06920944091140202e-12, +-9.55032395961234308e-13, +-8.56065018524450262e-13, +-7.69902514014925067e-13, +-6.94576823658997995e-13, +-6.28467604977611413e-13, +-5.70233230676210630e-13, +-5.18756903164622913e-13, +-4.73104278090153017e-13, +-4.32489918897325806e-13, + 1.49631824995022632e-04, + 2.16472373382979114e-05, + 3.46790196802163048e-06, + 6.22088929259012101e-07, + 1.26007247435600531e-07, + 2.89507384229730605e-08, + 7.54605763159243671e-09, + 2.22230988636633751e-09, + 7.33036407392495220e-10, + 2.66483352596585525e-10, + 1.04835016024818251e-10, + 4.63738051122990899e-11, + 2.58474055066053198e-11, + 1.64382619730321820e-11, + 9.23849100251762266e-12, + 4.17317856615184668e-12, + 1.56436670323225736e-12, + 5.30957228463974623e-13, + 1.88934109286911281e-13, + 8.51777661422036714e-14, + 5.19372529650078530e-14, + 3.82470869948801367e-14, + 3.03956536788460812e-14, + 2.48395824519164516e-14, + 2.05627793014433640e-14, + 1.71693258590282394e-14, + 1.44389775261981944e-14, + 1.22215722016354395e-14, + 1.04066070032479946e-14, + 8.91047320494602695e-15, + 7.66903244290152927e-15, + 6.63259255117626842e-15, + 5.76232143275373816e-15, + 5.02763201461437762e-15, + 4.40425387038979493e-15, + 3.87279421665789808e-15, + 3.41765632016287796e-15, + 3.02621830121795036e-15, + 2.68820763272485374e-15, + 2.39521543084600513e-15, +-1.46876242304847788e-05, +-2.02341024667392152e-06, +-3.05817483722824244e-07, +-5.12590440389030090e-08, +-9.61125444417707702e-09, +-2.02722870615896168e-09, +-4.81875285422275993e-10, +-1.28866491016313695e-10, +-3.86262898743233644e-11, +-1.29022382511300466e-11, +-4.65928238820616877e-12, +-1.65174013181403304e-12, +-6.09799162822931238e-13, +-3.96039140467400793e-13, +-3.16142072394941265e-13, +-1.87464497324685261e-13, +-8.19646839598387767e-14, +-2.88054617195839443e-14, +-8.88931509753492558e-15, +-2.70428652420159925e-15, +-9.74295254547617993e-16, +-4.87458063471693906e-16, +-3.21504339046625807e-16, +-2.41167459789296875e-16, +-1.89457586244740780e-16, +-1.51611331673381568e-16, +-1.22622970009231094e-16, +-1.00005658604107117e-16, +-8.21641279046285844e-17, +-6.79659894621653142e-17, +-5.65784511957858125e-17, +-4.73785503185775397e-17, +-3.98953338158867420e-17, +-3.37696276653351791e-17, +-2.87249102572175815e-17, +-2.45469389165523099e-17, +-2.10685960142685503e-17, +-1.81579971013479880e-17, +-1.57106821135965961e-17, +-1.36440982595475475e-17, + 1.23116559366436816e-06, + 1.62405311587253151e-07, + 2.33121037101841473e-08, + 3.67942819243197385e-09, + 6.44224643683713268e-10, + 1.25920280418372622e-10, + 2.75614370629114691e-11, + 6.75250538868467131e-12, + 1.84502437360789042e-12, + 5.62025344956688611e-13, + 1.95290246787989637e-13, + 7.37144585654753394e-14, + 1.99249415183211798e-14, + 2.97444329921888144e-15, + 4.62361524714202010e-15, + 5.38095338717898704e-15, + 3.24749393199167294e-15, + 1.34997654297894480e-15, + 4.46240785810505361e-16, + 1.28293304257272722e-16, + 3.51705198726286128e-17, + 1.07158619175234940e-17, + 4.43222571564633511e-18, + 2.57900644037944721e-18, + 1.81449913382949718e-18, + 1.36997154276857804e-18, + 1.06173208735464087e-18, + 8.33550265831084400e-19, + 6.60879462712749696e-19, + 5.28119480423075246e-19, + 4.25311764730070499e-19, + 3.44779657815139373e-19, + 2.81430507842410556e-19, + 2.30934840138981161e-19, + 1.90788720888605065e-19, + 1.58505896502114954e-19, + 1.32432358127326258e-19, + 1.11017633979914304e-19, + 9.37261539812783420e-20, + 7.91373025643078388e-20, +-9.03146980688419822e-08, +-1.14610911745189843e-08, +-1.57122289350329842e-09, +-2.35037762513452756e-10, +-3.87060925094979311e-11, +-7.06550996729807188e-12, +-1.43562545351297609e-12, +-3.25070639658524438e-13, +-8.18154568502855497e-14, +-2.26195772396805740e-14, +-6.86055262176536120e-15, +-2.72487742229305406e-15, +-1.20868014661439568e-15, +-1.15519640514339645e-16, + 1.02466204258115623e-16, +-4.66000346547949932e-17, +-8.39569647672092711e-17, +-4.86720876366454113e-17, +-1.89463416673713329e-17, +-5.89564549844764170e-18, +-1.59773162172832646e-18, +-4.06513605404532668e-19, +-1.09646659993709245e-19, +-3.83077387096724395e-20, +-1.94888875011984072e-20, +-1.30907974553348429e-20, +-9.43738706176160027e-21, +-7.08829581453330142e-21, +-5.24809582074373199e-21, +-3.96467337825085149e-21, +-3.11403981424696462e-21, +-2.43370635892648104e-21, +-1.96192516062205288e-21, +-1.62184216375224334e-21, +-1.30272336140769967e-21, +-1.01081229054792469e-21, +-6.27725483819069394e-22, +-5.84788379441246886e-22, +-2.86124266301612508e-22, +-4.70224818273587972e-22, + 5.90205087243995104e-09, + 7.23431235658915815e-10, + 9.51724497691938859e-11, + 1.35675631127430051e-11, + 2.11442061445723387e-12, + 3.62842344679600544e-13, + 6.89020298002176585e-14, + 1.45127466636744451e-14, + 3.39274491760704437e-15, + 8.79180626973984102e-16, + 2.37345703594640487e-16, + 6.25128275816800266e-17, + 4.21410243232403951e-17, + 2.10222599961621922e-17, +-3.32636895841556176e-18, +-3.47298057699719334e-18, + 5.92666170102371053e-19, + 1.19929014801177658e-18, + 6.35649568380568130e-19, + 2.29576285796264128e-19, + 6.74191760369293174e-20, + 1.72643950427262783e-20, + 4.25925351123640329e-21, + 1.15139268995452533e-21, + 4.00435948241478670e-22, +-3.23851665539834717e-23, +-6.86215018864936524e-23, +-4.03713275202188869e-23, + 2.91911522312231752e-23, + 8.18582236536939363e-23, + 1.76363286989444435e-22, + 3.00451868880743052e-24, +-5.73608167069897404e-23, +-7.01578858729686404e-23, +-6.97808387864405573e-23, + 3.53422252607379466e-23, + 4.39427874609873990e-23, + 1.83297966451419885e-23, + 2.02060286642134580e-22, + 5.15595533849131933e-23, +-3.48260860347841907e-10, +-4.13747439942540288e-11, +-5.24494121742731130e-12, +-7.15951201311993855e-13, +-1.06149850048718695e-13, +-1.72219478046766397e-14, +-3.07460242187804773e-15, +-6.05887358760181682e-16, +-1.31815888494346023e-16, +-3.18614502130632193e-17, +-8.91364284847869334e-18, +-1.83625719452851879e-18, +-1.39571122594407213e-19, +-9.18566966894700998e-19, +-2.85254889759687697e-19, + 1.41691607282580286e-19, + 5.95568398775209568e-20, +-1.03519969907060671e-20, +-1.50060527470589445e-20, +-7.50023845317566892e-21, +-2.35596278678626981e-21, +-7.89388174412708120e-22, +-7.52910734142984257e-23, + 5.94629347261601686e-23, + 1.39906972132973661e-22, +-1.70681505889882370e-22, +-1.02665625790270591e-22, + 3.50302315242823732e-23, + 1.03957764554228614e-22, + 1.36513028063078972e-22, + 1.94916866713158590e-22, + 1.03837806812791615e-22, + 1.99893090991542430e-23, + 9.41434920251561584e-23, + 9.90765963876489784e-23, + 6.62049884378765712e-23, + 8.25992989509141727e-23, + 1.79962650414667145e-22, + 1.95438138090741068e-22, + 4.68473901768844421e-23, + 1.87520793954635491e-11, + 2.16588212668731160e-12, + 2.65516635275078367e-13, + 3.48485781199420170e-14, + 4.93830363289865671e-15, + 7.61283537742724682e-16, + 1.28440590355462341e-16, + 2.38148356921753706e-17, + 4.85854305459000876e-18, + 1.07729012463633921e-18, + 2.75142997932414330e-19, + 1.07928694325918947e-19, +-1.45677834595760132e-20, +-1.44265688600997413e-21, + 2.06267468703766557e-20, + 1.34959294821647815e-21, +-2.77507915336864412e-21, +-6.51131154847859036e-22, + 2.49754443245920556e-22, + 4.72414453113228499e-24, + 1.02260885338392438e-22, + 1.12622688483603010e-24, + 1.00854839348341957e-22, + 6.76753947649859292e-23, + 1.44982779934924319e-22, +-5.09031450520642960e-23, +-1.13618404866936554e-23, +-1.87451539809116958e-23, + 7.54259607518640316e-23, + 6.97755869972763329e-23, + 1.28952659641598048e-22, + 4.21445361717664371e-23, +-9.38951971139059009e-24, + 5.66772996171314701e-23, +-2.93754908882799544e-23, +-3.98556601131866046e-23, + 5.11999396372911615e-23, + 9.22866595742919735e-23, + 7.67105059752843393e-23, + 1.90188574863950711e-23, +-9.29235250721519468e-13, +-1.04621120934593542e-13, +-1.24422299096564127e-14, +-1.57596438153398586e-15, +-2.14325681196915886e-16, +-3.15385164555373999e-17, +-5.05567620950340368e-18, +-8.89685648396637867e-19, +-1.71579471400224288e-19, +-3.70578033120221952e-20, +-7.40596998082748972e-21, +-3.07501812230411606e-21, +-1.66622958161259288e-21, + 1.65209716386640067e-21, +-2.23877185605699781e-22, +-7.06309331675879465e-23, +-6.04257846597954792e-23, + 1.12431239089859542e-22, + 2.53629000789472640e-22, +-7.11840934106252523e-24, + 8.71359201137079540e-23, + 9.08771279251105402e-23, + 2.07645210163815433e-22, + 5.26079751851873575e-23, + 1.54460410343093345e-22, + 2.72418147170673458e-23, +-2.33396723608085322e-23, +-1.28467105275396026e-23, + 5.68654049318770440e-23, + 1.07992840601232587e-22, + 1.02249422130686673e-22, + 2.82529371757671141e-23, + 5.20683456390687426e-23, +-2.04031500535881437e-23, + 2.89417137596461481e-23, + 1.40314078367137274e-22, + 1.44762804956577541e-22, + 7.36228841855394592e-23, + 1.31093384470718826e-22, + 1.36976563469520587e-23, + 4.26621609972447680e-14, + 4.69304933708649147e-15, + 5.42577582917301576e-16, + 6.65523419970218322e-17, + 8.69454111473473060e-18, + 1.22649248051159981e-18, + 1.86001385799633617e-19, + 3.06280142501793347e-20, + 4.86000756411922916e-21, + 7.25948343007174719e-22, + 2.38366468389588189e-22, +-4.92421947859908932e-23, + 1.72996712752199828e-22, + 2.06173764513320858e-23, +-6.48750714416509123e-23, +-2.99129502718074481e-23, +-3.28846076829325794e-23, + 1.94331613572368256e-22, +-1.54881788321443768e-24, +-1.51816475883515116e-22, +-3.00301080868127689e-23, +-1.25609337045657271e-22, + 5.18875275020373526e-23, + 3.88565199717515665e-24, + 5.44796082417670471e-24, +-3.11715247322193414e-23, + 8.64002623383203177e-24, + 9.82032998669990202e-23, + 7.35331149572127346e-23, + 5.81463441190228212e-23, + 1.07554804833038934e-22, +-3.20460973551140506e-24, + 9.09468108522861386e-23, + 7.57754394151092985e-24, + 9.23325787379792722e-23, + 9.97016786246462894e-23, + 9.53561580556994785e-23, + 1.08587860955994405e-22, + 1.67380328963884355e-22, + 9.71010833339187065e-23, +-1.84647226863458570e-15, +-2.00573740192072805e-16, +-2.26708367316923762e-17, +-2.79210401070688236e-18, +-3.66988723816288162e-19, +-5.25583739326687850e-20, +-1.07775261299338107e-20, +-2.94366760136619345e-21, +-4.76513384092346461e-22, +-7.60551245917054821e-24, + 2.36349518212984207e-23, +-6.68277397693613663e-23, +-8.96943229371399988e-23, + 2.24090810274945230e-23, +-1.15079161507365627e-22, + 9.96126766955698509e-23, +-1.88359060323218631e-22, +-1.27849506937148825e-22, + 7.75856376991473194e-23, +-6.74485696971737697e-23, +-6.25019782058518182e-24, +-5.51420323404404725e-23, +-3.17836426890616217e-23, +-4.58769019292831308e-23, +-7.16089115683721589e-24, +-6.02517416595736072e-23, +-7.06387387656001559e-23, +-8.38985116548237048e-23, +-7.89530944783738411e-23, +-6.30491176082411820e-23, + 1.98000152342114648e-23, +-6.01190059329834184e-23, +-8.58155456621087654e-23, +-2.71082344263016916e-23, +-8.38579927862415797e-23, +-1.35947125558061869e-23, + 7.58164730541195244e-23, +-7.83342245358249790e-23, +-1.23686922400636684e-23, +-1.10185409103974300e-22, +// root 3 + 5.51892651336817641e-01, + 5.14076895156872826e-01, + 4.76337987899460080e-01, + 4.39501392105201949e-01, + 4.04266647834614024e-01, + 3.71144929859517247e-01, + 3.40442936067194446e-01, + 3.12283245787131403e-01, + 2.86645169658842847e-01, + 2.63415930905680662e-01, + 2.42448361190065964e-01, + 2.23612675462356081e-01, + 2.06812046448472425e-01, + 1.91946828974143779e-01, + 1.78867788352421231e-01, + 1.67371399977756075e-01, + 1.57233811671923601e-01, + 1.48245449173261656e-01, + 1.40227079166673346e-01, + 1.33031285483965755e-01, + 1.26538032273646545e-01, + 1.20649287383007606e-01, + 1.15284387234326033e-01, + 1.10376397671519078e-01, + 1.05869321515011605e-01, + 1.01715953998921471e-01, + 9.78762223712127261e-02, + 9.43158878351838537e-02, + 9.10055210242314006e-02, + 8.79196860763630933e-02, + 8.50362853847665134e-02, + 8.23360292796355003e-02, + 7.98020037045563541e-02, + 7.74193153905453207e-02, + 7.51747987888122249e-02, + 7.30567725737064910e-02, + 7.10548362013108947e-02, + 6.91596990407412349e-02, + 6.73630361514305082e-02, + 6.56573659809924770e-02, +-1.87965932980412864e-02, +-1.89740202661339598e-02, +-1.87211526310297680e-02, +-1.80785605899347231e-02, +-1.71294611481704814e-02, +-1.59764475681963870e-02, +-1.47194613234406229e-02, +-1.34416669610368435e-02, +-1.22026986167662332e-02, +-1.10346118407245921e-02, +-9.93986003680622475e-03, +-8.90055848792172845e-03, +-7.90484658489804329e-03, +-6.96812481366579015e-03, +-6.12181441253091888e-03, +-5.38649647651051958e-03, +-4.76211030642224604e-03, +-4.23558627068427399e-03, +-3.79042513363491351e-03, +-3.41158110940720412e-03, +-3.08674524924936172e-03, +-2.80617551137346414e-03, +-2.56219139797045532e-03, +-2.34869979450584142e-03, +-2.16082340745930423e-03, +-1.99462220488119636e-03, +-1.84688556345698912e-03, +-1.71497606952923393e-03, +-1.59671095932011520e-03, +-1.49027120743085379e-03, +-1.39413113804749949e-03, +-1.30700343060183191e-03, +-1.22779578885400366e-03, +-1.15557652960341728e-03, +-1.08954705261409229e-03, +-1.02901966284630665e-03, +-9.73399587917061397e-04, +-9.22170307711951557e-04, +-8.74881516826205301e-04, +-8.31139193337729126e-04, +-4.90798822890487954e-05, + 5.01651834513413541e-06, + 5.74303953856255910e-05, + 1.01649309988527606e-04, + 1.33708189607018875e-04, + 1.52694823208278358e-04, + 1.60023806231996552e-04, + 1.58330171297342044e-04, + 1.50820022525322098e-04, + 1.41171916930621865e-04, + 1.32903747388382029e-04, + 1.27194248781061577e-04, + 1.21422216398099639e-04, + 1.12116773983439468e-04, + 9.90676576678222522e-05, + 8.47847323939324138e-05, + 7.15712260142650390e-05, + 6.03697889875300512e-05, + 5.11966739000610011e-05, + 4.37380597368189938e-05, + 3.76473755151471694e-05, + 3.26340873067026589e-05, + 2.84722600699599636e-05, + 2.49889881128617849e-05, + 2.20515133927595615e-05, + 1.95569993776952572e-05, + 1.74249996354422237e-05, + 1.55919802361448315e-05, + 1.40073143848395860e-05, + 1.26303241674000453e-05, + 1.14280722710269736e-05, + 1.03736965612162204e-05, + 9.44514190839823040e-06, + 8.62418576704058398e-06, + 7.89568312112299567e-06, + 7.24697676356741119e-06, + 6.66743326994129605e-06, + 6.14807531135650300e-06, + 5.68128837575133093e-06, + 5.26058537668499425e-06, + 4.37592501421702022e-06, + 4.54297203817177485e-06, + 4.10508737966464467e-06, + 3.21244808221048650e-06, + 2.12002280597829093e-06, + 1.06455632977689102e-06, + 1.92191529549912255e-07, +-4.32827606967934926e-07, +-7.70452053390868756e-07, +-7.88309296746498590e-07, +-5.71093701923656440e-07, +-4.19526121740983108e-07, +-5.95214034862313755e-07, +-9.56737458120761719e-07, +-1.18030692270920720e-06, +-1.16885764165341997e-06, +-1.02206577215095531e-06, +-8.45511353696687236e-07, +-6.87803075459398843e-07, +-5.59907538440982986e-07, +-4.58990735598057964e-07, +-3.79480266938624386e-07, +-3.16390691210551170e-07, +-2.65869199490830755e-07, +-2.25038677135702011e-07, +-1.91753688283327403e-07, +-1.64401416937875978e-07, +-1.41756990524747744e-07, +-1.22880634702040967e-07, +-1.07044333774001190e-07, +-9.36790178850368374e-08, +-8.23361116089806993e-08, +-7.26592373735747643e-08, +-6.43631799699746902e-08, +-5.72180997556326775e-08, +-5.10375788728921431e-08, +-4.56694937592721599e-08, +-4.09889905503290658e-08, +-3.68930386404655703e-08, +-3.32961779720865914e-08, + 2.95474918593972435e-08, +-9.12282733860118026e-09, +-4.40010654447676987e-08, +-6.48799709257692188e-08, +-6.92200425490812604e-08, +-6.12617961074377491e-08, +-4.72139133284808895e-08, +-3.05482559441635936e-08, +-1.12023210931795217e-08, + 8.30461764122668284e-09, + 1.55432053458168855e-08, + 2.14035369520246872e-10, +-2.04202458733932831e-08, +-2.09581832276466627e-08, +-6.13825001960350841e-09, + 6.32699036685248107e-09, + 1.09169357961364185e-08, + 1.06973203820893090e-08, + 8.93214518237868405e-09, + 7.09350422562923057e-09, + 5.57968103399138690e-09, + 4.40941490650022667e-09, + 3.51517763180090562e-09, + 2.82858864708904351e-09, + 2.29653034731974191e-09, + 1.88011525748188964e-09, + 1.55109426352928191e-09, + 1.28880635737633027e-09, + 1.07798324093637031e-09, + 9.07220537957449141e-10, + 7.67912412470599036e-10, + 6.53502371762752779e-10, + 5.58950290335656624e-10, + 4.80348995477245650e-10, + 4.14645690649770318e-10, + 3.59437404486436357e-10, + 3.12819433253893720e-10, + 2.73272089165341915e-10, + 2.39575292748411005e-10, + 2.10743752532408373e-10, +-1.80765768887781141e-09, +-1.94867700510992541e-09, +-1.45142056874648284e-09, +-6.16961324366033182e-10, + 1.43969420486619416e-10, + 5.97077974492764003e-10, + 7.78319427601478869e-10, + 8.94175302278852870e-10, + 1.02924926042916524e-09, + 8.11859467529384849e-10, +-2.04769885482068129e-10, +-1.16867595634859723e-09, +-6.39518071174505134e-10, + 5.20095607825149829e-10, + 7.92735305211516356e-10, + 4.17203469019902971e-10, + 7.44668563546087454e-11, +-6.90280081099611579e-11, +-9.64141036600455546e-11, +-8.47957092913770900e-11, +-6.66473794532173788e-11, +-5.09833183842794946e-11, +-3.90042942164284451e-11, +-3.00840217927717560e-11, +-2.34345323666528139e-11, +-1.84339495712233009e-11, +-1.46341988448739853e-11, +-1.17173700840552857e-11, +-9.45672052564496664e-12, +-7.68885182283488559e-12, +-6.29477501698692644e-12, +-5.18684548285507115e-12, +-4.29986659994156945e-12, +-3.58489110921811883e-12, +-3.00483039701067636e-12, +-2.53136393237469288e-12, +-2.14269243023266884e-12, +-1.82188658449961526e-12, +-1.55574379604684263e-12, +-1.33386959584716359e-12, +-1.96561521697335535e-11, + 8.43128277492896585e-12, + 3.07308783622659106e-11, + 3.57835097499954407e-11, + 2.59713286235090382e-11, + 1.20997511858682726e-11, + 4.61782044340881532e-12, + 5.92563481906573724e-12, + 2.65303980988021486e-12, +-2.51564141044580784e-11, +-5.36010409234836940e-11, +-1.34851220503367709e-11, + 4.97242410717178091e-11, + 3.42210143716581587e-11, +-8.12915383813156224e-12, +-1.79226609152833953e-11, +-9.85013552656858820e-12, +-2.84617891779459496e-12, + 3.15522569900644162e-14, + 7.34560183700198090e-13, + 7.26814239546579568e-13, + 5.73873170572433954e-13, + 4.29549573913332041e-13, + 3.19346247436577484e-13, + 2.39017563879099945e-13, + 1.80723467411427666e-13, + 1.38073470976385164e-13, + 1.06535947513452584e-13, + 8.29561757823235280e-14, + 6.51678490369471815e-14, + 5.16106436737564733e-14, + 4.11700291395436100e-14, + 3.30773324250841456e-14, + 2.67540242172501958e-14, + 2.17760153730303705e-14, + 1.78335649795557547e-14, + 1.46782676565234046e-14, + 1.21494624181109538e-14, + 1.01047888424583746e-14, + 8.44126255585139604e-15, + 8.90979868688890549e-13, + 1.00419612069498201e-12, + 5.15711383150671843e-13, +-1.36172242715232139e-13, +-4.95695465266311288e-13, +-4.29806547930663245e-13, +-8.45739890700779293e-14, + 9.78740807384650006e-14, +-4.83581499887513335e-13, +-1.39096290205388060e-12, +-8.70637335427561066e-14, + 2.66110283301358972e-12, + 1.02884843870957849e-12, +-1.65148033869970384e-12, +-9.88308889421893589e-13, + 1.37712364380738457e-13, + 3.23484334835171247e-13, + 1.67947332123325422e-13, + 5.17601777151203949e-14, + 6.95613041981915247e-15, +-4.52002398392036310e-15, +-5.65218275000104265e-15, +-4.54977960529089445e-15, +-3.34675176355468206e-15, +-2.43158578225628508e-15, +-1.77122175849044296e-15, +-1.29298758683232802e-15, +-9.62382476374357827e-16, +-7.33975017487446617e-16, +-5.45807303954554670e-16, +-4.11432558408433675e-16, +-3.23273863524098261e-16, +-2.51306888993872901e-16, +-1.96919434964479128e-16, +-1.51493048303821002e-16, +-1.17793404178733887e-16, +-9.61943732947201378e-17, +-7.65523390483907463e-17, +-6.26562413307816152e-17, +-4.83857694279840025e-17, + 1.36048961257046324e-14, +-7.10266081756921108e-15, +-2.07983044466790671e-14, +-1.73915117059620764e-14, +-4.46710496823814094e-15, + 7.87590149515087652e-15, + 1.14561238221799333e-14, +-3.73189024615629253e-15, +-3.15921646016176785e-14, +-9.04935788054518056e-15, + 9.11440808217321216e-14, + 3.61274838896604143e-14, +-1.12168964444834020e-13, +-2.70129251609518997e-14, + 4.55094823332533981e-14, + 1.89461491882118335e-14, +-2.96592478004393621e-15, +-4.93872190485995309e-15, +-2.31021281372911433e-15, +-7.03877565102780446e-16, +-1.19724353264991459e-16, + 2.51737459346409968e-17, + 4.42863713838427951e-17, + 4.09400869874502384e-17, + 2.65314322587824151e-17, + 1.85202768125145737e-17, + 1.67503461241843866e-17, + 9.55540615576409957e-18, +-7.02496618146591321e-19, + 6.99790188276041145e-18, + 9.61975519659286498e-18, + 1.07760459702030355e-18, +-2.22851743530004892e-19, + 4.04257017639653346e-21, + 3.24918961069471649e-18, + 4.99555448812449148e-18, + 7.76974665386710153e-19, + 5.82853011579219708e-18, + 9.90564454486073177e-19, +-1.87452167821442693e-18, +-5.08871871472212633e-16, +-5.77370567327077202e-16, +-1.50872642142470061e-16, + 2.97894699552621190e-16, + 3.79988318940496838e-16, + 2.63387098554276565e-16, +-1.23723019576633084e-16, +-7.15374675203722217e-16, +-5.32080978050250382e-16, + 2.11204601049622822e-15, + 2.02561671983179845e-15, +-4.97168787819200784e-15, +-9.10726872504473710e-16, + 3.72330155334381029e-15, + 1.08045893055182125e-16, +-9.60955593832144622e-16, +-2.53677410662447952e-16, + 6.24512880993874603e-17, + 7.88129897873351639e-17, + 2.87919373227064431e-17, + 1.46622706948737045e-17, + 5.21131580962254149e-18, + 3.54376870821520324e-18, + 7.01304442677635634e-18, + 1.29496125903879280e-18, + 2.38653687850513653e-18, + 4.83534669713687295e-18, + 8.53982108666255995e-18, +-6.70202679043050025e-18, + 3.68550520515911958e-18, + 4.59053154862411545e-18, +-9.24230157082590707e-19, + 9.19243896532440705e-19, +-7.71235394034615500e-19, + 5.26738045683514874e-18, + 7.65625516179177119e-18, + 2.53601664226514690e-18, + 5.95786208687529374e-18, + 6.50818413528939861e-18, + 2.74421154389109927e-18, +-3.55740068669714397e-17, + 1.92499804075872864e-17, + 1.42665665380776867e-17, + 1.99584963820192479e-17, +-8.03318366163876977e-18, + 2.11632613707395470e-18, +-1.87672680671243660e-17, + 6.88461445047248991e-18, + 3.18975837609722435e-17, + 9.47913649194271363e-17, +-1.20780539826496837e-16, +-9.59602151833157768e-17, + 2.29353045192082713e-16, +-2.87428139378505090e-17, +-7.13709981738264662e-17, + 7.08207796035254752e-18, + 7.22749388730877694e-18, + 7.91178655628479668e-18, + 1.20433619282413743e-17, +-5.69491094874547989e-19, + 7.13841289479879341e-18, + 2.47249804721480039e-18, + 3.04700005356627362e-18, + 7.72958883711692170e-18, + 7.71505277426314030e-19, + 2.19156353062911745e-18, + 4.30842365026784838e-18, + 3.42839104556310516e-18, +-3.19044174806909309e-18, + 2.92180390387790739e-18, + 4.59311527991100293e-18, + 1.26668756543837974e-18, +-2.17962020655013874e-19, +-1.00132814773493254e-18, + 3.04223591484893297e-18, + 6.33302452736817297e-18, + 6.42010363830558861e-19, +-4.01172999255110923e-20, + 2.15093218132697374e-18, + 2.03557464762049058e-18, +-2.13338087068708339e-17, +-1.25351121937269920e-17, +-8.80929625021034900e-18, +-2.32776642773052946e-18, +-1.63563252710001431e-17, +-6.10146832703083368e-18, +-6.94273800758401397e-18, +-1.08880363855483259e-17, + 1.75778133727445904e-18, +-1.60229082394111069e-17, +-1.28307988493789787e-17, + 5.75145601639046086e-18, +-6.18168739492490989e-18, + 7.28392362657401597e-18, + 1.21803575523303256e-17, + 3.73912408584550254e-18, + 3.14054023473025477e-18, + 1.03358575173703094e-17, + 6.64661632739338301e-18, + 5.56479506622296168e-18, + 4.81022860136866790e-18, + 6.85252158577891583e-18, + 5.56994756739456328e-18, + 7.06093227227951117e-18, + 1.20979104751080920e-18, + 3.29684798917125563e-18, + 7.20510318789829250e-18, + 6.27948503343652581e-18, +-7.13711938138969487e-19, + 4.25521766863634899e-18, + 5.82869143764334184e-18, + 1.64328200328648840e-18, + 3.56258683221729657e-18, + 3.78940744960879897e-18, + 4.32508680855116626e-18, + 5.25708697782892918e-18, + 1.99986738926958511e-18, + 4.81931087218770252e-18, + 3.66987741092962913e-18, + 8.77394792433943311e-19, + 7.70960940205322904e-18, + 1.10918360520389498e-17, +-1.19538878225556314e-17, +-2.54734923361759129e-18, +-8.14344197731474278e-18, + 1.47057077343117575e-17, + 5.55298262210075730e-18, + 7.13168275489681623e-18, +-5.69130622195451218e-18, + 7.21240171669985501e-19, +-1.17765781125144014e-17, + 4.03285457503016865e-18, +-1.42167213158628198e-18, + 1.54746824978145890e-18, + 2.78579841188892133e-18, +-3.30889903419013863e-18, +-6.39211408860722901e-18, +-2.32433411934371567e-19, +-8.14175286908192425e-19, +-3.45370098602069976e-18, + 5.37899240240523595e-18, + 1.13658269939057270e-18, +-4.20843671048555960e-19, + 1.99841566016286089e-19, +-9.51088003551554806e-19, + 1.06884307494690170e-18, + 4.18853161346486973e-18, + 5.54894743558428369e-18, + 7.12232691296598200e-19, + 7.38359662105258014e-18, + 5.67774432827520461e-18, + 2.79438346945204852e-18, + 5.48133566703478537e-19, + 1.24205145227531279e-18, + 3.00795171016114547e-18, + 3.42834463232395034e-18, +-2.57692694644882933e-19, + 1.55911056463390534e-18, + 1.72622384236842065e-18, + 1.79773432480801120e-18, +-8.47825670732665842e-19, +-2.87308569629931509e-17, +-7.73336572171964178e-18, +-8.20834907918546828e-18, +-5.09012080718824547e-18, + 4.99536010812429908e-19, +-8.16219796281074864e-19, + 1.18700244421021798e-17, +-6.42766721266855540e-18, +-1.81400496001529542e-18, + 1.74420840394763098e-18, + 6.93823913358115204e-19, +-6.91911757655890459e-19, +-1.92439031284994470e-18, +-1.33851819453389880e-18, +-1.04180672049285577e-19, +-5.92839532565142222e-18, +-7.09160540601654589e-18, +-3.71632920478269859e-18, +-7.60652156075011189e-18, +-3.75136838962150891e-18, +-1.15926655309459393e-18, + 1.20389267614116834e-18, +-2.38201879048852537e-19, +-2.49146003724923894e-18, +-2.69151858274600090e-18, +-4.23594142939635319e-18, +-3.98458917986415553e-18, +-6.83925985379609797e-18, +-4.88455940310933868e-18, +-4.66854900477293300e-18, +-4.29726616903812539e-18, +-7.41293519041036106e-18, +-1.00609888575915771e-18, +-4.61288397604158599e-18, +-1.64367435093989276e-18, +-2.54555743665317596e-18, +-2.32246093799233074e-18, +-2.50398436448268690e-18, +-1.85340910209566057e-18, + 7.17301471066463248e-02, + 2.11074760119085748e-02, + 7.41920670983123223e-03, + 3.09434363599871186e-03, + 1.51111068739340128e-03, + 8.48952447079606774e-04, + 5.38123315926960100e-04, + 3.77542527648550366e-04, + 2.88092817114785332e-04, + 2.35475105275860665e-04, + 2.03422015021350108e-04, + 1.83443800452984398e-04, + 1.70613528019487686e-04, + 1.61856439442790631e-04, + 1.55297177308933040e-04, + 1.49912014314362776e-04, + 1.45211081278233807e-04, + 1.40976572230112700e-04, + 1.37106039333818901e-04, + 1.33541256885458883e-04, + 1.30241667345405406e-04, + 1.27175392751089668e-04, + 1.24316049112191846e-04, + 1.21641333086683733e-04, + 1.19132185775345489e-04, + 1.16772197483632189e-04, + 1.14547149771308771e-04, + 1.12444652525664764e-04, + 1.10453852256426721e-04, + 1.08565195399538673e-04, + 1.06770234726807960e-04, + 1.05061469871372499e-04, + 1.03432215081845585e-04, + 1.01876488875238114e-04, + 1.00388921427721302e-04, + 9.89646764287742907e-05, + 9.75993848025583327e-05, + 9.62890882236736050e-05, + 9.50301907613335448e-05, + 9.38194173046540662e-05, +-4.41030056916754398e-02, +-1.13466833682508757e-02, +-3.40677629467531348e-03, +-1.18653500528819594e-03, +-4.73761144012885336e-04, +-2.13431282275270036e-04, +-1.06513916373467141e-04, +-5.77465615407378040e-05, +-3.33312546743372252e-05, +-2.00712398055855366e-05, +-1.23976680804294772e-05, +-7.82657345348704892e-06, +-5.16013590264090319e-06, +-3.69245958864489632e-06, +-2.91777811885770670e-06, +-2.49099011553297196e-06, +-2.22022517553615522e-06, +-2.01917374910128570e-06, +-1.85423515136678125e-06, +-1.71260816652851584e-06, +-1.58862298250511313e-06, +-1.47901688123703506e-06, +-1.38148279998536676e-06, +-1.29422178562428337e-06, +-1.21577701999323384e-06, +-1.14494928956404242e-06, +-1.08074170828704271e-06, +-1.02231917254230694e-06, +-9.68977327208662520e-07, +-9.20118376027984852e-07, +-8.75232017039528904e-07, +-8.33880283489095903e-07, +-7.95685394194640357e-07, +-7.60319944244045310e-07, +-7.27498930796792517e-07, +-6.96973228936663363e-07, +-6.68524221602522083e-07, +-6.41959354278353130e-07, +-6.17108435433087614e-07, +-5.93820541985363390e-07, + 7.71359949511444924e-03, + 1.77711443702018848e-03, + 4.71767567605495047e-04, + 1.43891610405701294e-04, + 5.00499471699555670e-05, + 1.96441488049369668e-05, + 8.59613951743403392e-06, + 4.14459155710051048e-06, + 2.17778817992179179e-06, + 1.23081985224153605e-06, + 7.29606159449265398e-07, + 4.33483968619668005e-07, + 2.45465426229042544e-07, + 1.30673922916569592e-07, + 6.92886072542088643e-08, + 4.07900240968280000e-08, + 2.83589534547771089e-08, + 2.24536608497939384e-08, + 1.89896473870639706e-08, + 1.65124306028597363e-08, + 1.45409597985926379e-08, + 1.29018792031862731e-08, + 1.15141408638921567e-08, + 1.03275082894198359e-08, + 9.30543425708586064e-09, + 8.41958928365907188e-09, + 7.64746664131040772e-09, + 6.97095819656684470e-09, + 6.37536188568420970e-09, + 5.84864759240755165e-09, + 5.38090130681869329e-09, + 4.96389883160785646e-09, + 4.59077563792293558e-09, + 4.25576897646206382e-09, + 3.95401482482011672e-09, + 3.68138682075811118e-09, + 3.43436760663643207e-09, + 3.20994538672121860e-09, + 3.00553024067800220e-09, + 2.81888602328322960e-09, +-9.75003043973959459e-04, +-2.04393140405933983e-04, +-4.88724060790436167e-05, +-1.33180174192856085e-05, +-4.11558407654523116e-06, +-1.43040701308432914e-06, +-5.53357059594291497e-07, +-2.35577836616274790e-07, +-1.09322691207668295e-07, +-5.53381908527944620e-08, +-3.11125106511145753e-08, +-1.94036689537838773e-08, +-1.23187010697728435e-08, +-7.05246164321042789e-09, +-3.45731551087557426e-09, +-1.51659155534927002e-09, +-6.75695299847157914e-10, +-3.57446157040241628e-10, +-2.36652004015522560e-10, +-1.81681650236256272e-10, +-1.48911014945704101e-10, +-1.25257560656134605e-10, +-1.06667672217029114e-10, +-9.15739992375631328e-11, +-7.91375409237869580e-11, +-6.87944571891351023e-11, +-6.01270902123547669e-11, +-5.28147507550753352e-11, +-4.66071846113678442e-11, +-4.13070371680695937e-11, +-3.67573115710416830e-11, +-3.28321299734090188e-11, +-2.94298267570054966e-11, +-2.64677297995018190e-11, +-2.38781811437104072e-11, +-2.16054766211509919e-11, +-1.96034936997922898e-11, +-1.78338390879218005e-11, +-1.62643918978866790e-11, +-1.48681503232848931e-11, + 9.82431817498204493e-05, + 1.89666439573005772e-05, + 4.14028237994315055e-06, + 1.02281127453147929e-06, + 2.85124740786946009e-07, + 8.91559304497950540e-08, + 3.10172811046849799e-08, + 1.18876689020504011e-08, + 4.94799610868368941e-09, + 2.18215344647287852e-09, + 1.00503465947014353e-09, + 5.34811515502440427e-10, + 3.76600877718673573e-10, + 2.79953646113965065e-10, + 1.69166822420786865e-10, + 7.97813116273628527e-11, + 3.13681114335314133e-11, + 1.15603342814971401e-11, + 4.73988299519181469e-12, + 2.51316553875169686e-12, + 1.69528843142264350e-12, + 1.29658550895148268e-12, + 1.04145602896255098e-12, + 8.53304168177446009e-13, + 7.06798401051443456e-13, + 5.90229370149232793e-13, + 4.96380657681129519e-13, + 4.20153106647348261e-13, + 3.57758553229956876e-13, + 3.06324473552911950e-13, + 2.63646197630854529e-13, + 2.28015457567305648e-13, + 1.98097244331705964e-13, + 1.72840080908274109e-13, + 1.51409567598375954e-13, + 1.33139019584461625e-13, + 1.17492273916571832e-13, + 1.04035414667820155e-13, + 9.24152612171610886e-14, + 8.23427909567575877e-14, +-8.31872845769406543e-06, +-1.49308557195291102e-06, +-3.00655876662319482e-07, +-6.80723296112376141e-08, +-1.73088848998517041e-08, +-4.92200162289723519e-09, +-1.55531366658912890e-09, +-5.42444587756633669e-10, +-2.08042543332156198e-10, +-8.70714747857169442e-11, +-3.69233993149815927e-11, +-1.30552917662628289e-11, +-4.91247754879109279e-12, +-5.29133218500849068e-12, +-5.36283991248254656e-12, +-3.42198321968354760e-12, +-1.55050884040450513e-12, +-5.63496986876292540e-13, +-1.83673270903133573e-13, +-6.22354409929587684e-14, +-2.64745586392512127e-14, +-1.52778021507236271e-14, +-1.07608193745478641e-14, +-8.23648195511760942e-15, +-6.50354221872954302e-15, +-5.21045294889640603e-15, +-4.21525780698913189e-15, +-3.43794536021194940e-15, +-2.82463119145836093e-15, +-2.33654222711358703e-15, +-1.94506051681932585e-15, +-1.62877233750468644e-15, +-1.37151655241415544e-15, +-1.16092324350896212e-15, +-9.87499446251077657e-16, +-8.43883843444114467e-16, +-7.24300004160206147e-16, +-6.24235483497320148e-16, +-5.40114912703268075e-16, +-4.69052093825309215e-16, + 6.11607551214961469e-07, + 1.02849252271914686e-07, + 1.92652348348302326e-08, + 4.03292346044409825e-09, + 9.43700065477185129e-10, + 2.46188809028886939e-10, + 7.12344019623544067e-11, + 2.26856596609303823e-11, + 7.88677076691117605e-12, + 3.04662082648375953e-12, + 1.40267080722408270e-12, + 6.34974470143946274e-13, + 9.04858451193142256e-14, +-5.12893139108194439e-14, + 5.18268083709621299e-14, + 9.18054149607665149e-14, + 5.94394962551905828e-14, + 2.54806635157598469e-14, + 8.64439699833888490e-15, + 2.58281781169649865e-15, + 7.66104712082453363e-16, + 2.70555145040985750e-16, + 1.32326118294728977e-16, + 8.48161406109493720e-17, + 6.16701410208998525e-17, + 4.69789170437057120e-17, + 3.64863304707412425e-17, + 2.86650401475274957e-17, + 2.27191759858934947e-17, + 1.81515478710841865e-17, + 1.46158157749584482e-17, + 1.18592367714221629e-17, + 9.67470418840853203e-18, + 7.94510394557521559e-18, + 6.56679218516918281e-18, + 5.44445108433096164e-18, + 4.54489583308850639e-18, + 3.81914827916690852e-18, + 3.21348582576191814e-18, + 2.72843101107674451e-18, +-3.99176441713688202e-08, +-6.33016929737366728e-09, +-1.11075720174948155e-09, +-2.16560013699949740e-10, +-4.69785517245514150e-11, +-1.13248407867091952e-11, +-3.02337711007664226e-12, +-8.89350142908893657e-13, +-2.84666654899336568e-13, +-9.49436289933345990e-14, +-3.49646153578639720e-14, +-2.35127864210369851e-14, +-1.32209940145979298e-14, + 1.79061499001917288e-15, + 3.43344106174471444e-15, +-3.84964671372369923e-16, +-1.45150241458548868e-15, +-8.95543254680510701e-16, +-3.58104950395585135e-16, +-1.13852234629474654e-16, +-3.17528275006748897e-17, +-8.56241924721308098e-18, +-2.62451880171496058e-18, +-1.08605816490533429e-18, +-6.32521438121746748e-19, +-4.37930354993244446e-19, +-3.13847550099643091e-19, +-2.31777392148858777e-19, +-1.81508056130102500e-19, +-1.43755089544743111e-19, +-1.10455965030979041e-19, +-8.00429862760950453e-20, +-6.39746215404606432e-20, +-4.95877938751784065e-20, +-3.86587444689451472e-20, +-4.07291036230500999e-20, +-2.79430637240585696e-20, +-2.31242334756414441e-20, +-1.90090893775303521e-20, +-7.03810313856691766e-21, + 2.34989248757839667e-09, + 3.53375911085413220e-10, + 5.84349089921631185e-11, + 1.06770778382152729e-11, + 2.16077815549130489e-12, + 4.84263139075861757e-13, + 1.19896016511939990e-13, + 3.26856668513091745e-14, + 9.84340082980547835e-15, + 3.24239813160002639e-15, + 8.39977243204133889e-16, + 1.46846200110955262e-16, + 5.16840603042001206e-16, + 2.85213728239821144e-16, +-1.11689952247875746e-16, +-8.38675352242190520e-17, + 5.07060731689768634e-18, + 2.10779791161413573e-17, + 1.17659486071047284e-17, + 4.35459825453956056e-18, + 1.30925431396100901e-18, + 3.46445439074893781e-19, + 8.08109505654158196e-20, + 3.31290570663627689e-20, + 7.64155275099468391e-21, + 3.04148006663893467e-21, + 1.12182788630701168e-20, + 7.14550350964324136e-21, + 3.32825785889936217e-21, +-3.38303989413040634e-21, +-2.23551411608812714e-21, + 3.86422267485592138e-21, + 1.19793814746950359e-21, + 5.23452950464152819e-21, + 2.92907840557135036e-21, +-1.50890304276196410e-21, +-3.11261828740834675e-21, + 2.57810492145707913e-22, +-1.89299714742312359e-21, + 4.07790325077121853e-21, +-1.26276049545053310e-10, +-1.80946128187555055e-11, +-2.83451252327531191e-12, +-4.88018570832317389e-13, +-9.26431841735299408e-14, +-1.94086770875894771e-14, +-4.48103647228835038e-15, +-1.13501686204650558e-15, +-3.13100797076562495e-16, +-1.00392212097618395e-16, +-4.18541072476330596e-17, + 2.81815058834589985e-18, + 6.54496472145818825e-18, +-1.50203530868341542e-17, +-4.12450242651081452e-18, + 3.19485580680630970e-18, + 1.32663837965614044e-18, +-1.32216930843412012e-19, +-2.73082976977733007e-19, +-1.31813907094199679e-19, +-3.95053375959451241e-20, +-1.31505434762047106e-20, +-6.04846641116724427e-21, + 1.96028730043913188e-21, +-2.83681761552088451e-22, + 2.81185881476172444e-21, + 6.27651882756594797e-21, + 7.61629628564601978e-21, + 3.56382981245958592e-21, + 9.24314154246192090e-22, + 3.33210603231746867e-21, + 9.21018730529605780e-21, + 3.77392188298790142e-21, + 2.05159694283837363e-21, + 2.36767864651353092e-21, + 3.55388052688927456e-22, +-2.59568650999132241e-21, + 3.25658388307093819e-21, +-3.85190747697526285e-22, + 4.85341257101886831e-21, + 6.25214185747695817e-12, + 8.57323585214254577e-13, + 1.27808789740178012e-13, + 2.08346296529730897e-14, + 3.72823906998772866e-15, + 7.33654136856977432e-16, + 1.58687760292036066e-16, + 3.77090078629490357e-17, + 9.71486340793937068e-18, + 2.45820626598753599e-18, + 1.08073150981081443e-18, + 9.22341194515649253e-19, +-6.51364470010268774e-19, +-7.04172218883376533e-20, + 3.62537305453524116e-19, + 7.79867066899749400e-21, +-5.48480144080470430e-20, +-1.12582236189117184e-20, + 4.52381579008316040e-21, + 1.82418956533938458e-21, +-4.22135914418170240e-21, +-1.65273445538984604e-21, +-3.57359893476153538e-21, + 7.74117980495227464e-21, + 1.48403632928327494e-21, + 4.57820312639561654e-22, + 5.05797745890447049e-21, + 6.42082200932225392e-21, + 1.43549845422990695e-21, +-4.63217949843462091e-21, + 6.08654860850671832e-22, + 2.77954852145893696e-21, + 8.12333890354964075e-22, + 7.63016134589386149e-22, + 6.66705541604199352e-22, + 6.29072946732009401e-22, + 1.09348066734957773e-21, +-1.43071664583565086e-21, +-1.46544708545619657e-21, + 3.87043824630412827e-21, +-2.87343982329072297e-13, +-3.78483582679308098e-14, +-5.39185566603987409e-15, +-8.35817290631751699e-16, +-1.41736024021977756e-16, +-2.63167240686765435e-17, +-5.40615780239713048e-18, +-1.24493706811813325e-18, +-3.16692401821684644e-19, +-8.83356865259615703e-20, +-1.15206812062807739e-20, +-2.94617232271510816e-20, +-1.84928388299851669e-20, + 3.85888285165871668e-20, +-4.29400292696100637e-21, +-5.08858309519214675e-21, + 4.92185792457067577e-21, +-2.36790902915637668e-21, + 4.68031978385090792e-21, +-2.88103403880268836e-21, + 1.50971487957541255e-21, +-2.08155441234466169e-21, +-1.40718888827420092e-21, + 5.54684524034429859e-21, + 2.10108702059848089e-21, + 4.32014191419771146e-21, + 2.30346026302538676e-21, + 6.17619869945058041e-21, + 3.00485488772735237e-21, + 1.78653582235283246e-21, + 2.74618483607734630e-22, + 6.55976425715429949e-21, + 3.90959547136814146e-22, + 1.29016173746414405e-21, + 1.58357698715226769e-21, + 1.84757099451338158e-21, + 1.98575195915380206e-22, +-1.77779269856767907e-22, +-3.13119169762028292e-21, + 5.20113179186989520e-21, + 1.23241754160477507e-14, + 1.56083162900165971e-15, + 2.12372906503693212e-16, + 3.13388053754764615e-17, + 4.95709185966868890e-18, + 8.35435882995917933e-19, + 1.65462485052706580e-19, + 2.54229760509098806e-20, +-1.87649668226605509e-21, + 2.90932814830594697e-22, + 4.11369394644953842e-21, +-5.59153136605339348e-21, + 9.20283005769585459e-22, + 2.26914809665762956e-21, +-3.86065002806918125e-21, + 4.45593801358159856e-22, +-4.43470229563720596e-22, +-5.87294292462647228e-21, + 1.88044973161981753e-21, + 3.40090912241312857e-21, + 2.22013975578591359e-21, +-1.74866903126258142e-21, +-3.47010577248589709e-22, +-1.47037125635448831e-21, +-2.48558215516946219e-21, +-3.51404684678279880e-21, + 2.57778365315208449e-21, + 3.07246195095327860e-21, + 3.36113901859337354e-21, + 1.77504663731863864e-21, + 1.59381742263604703e-21, + 3.13942126958957851e-21, + 2.31759928522205396e-22, + 3.70767025177436002e-21, + 9.64516489420539136e-22, +-8.43657762856034815e-22, + 5.43967682678055360e-22, + 3.70788786557927480e-21, + 1.37536018043513123e-21, + 3.83891995287969676e-21, +-5.16716075471209160e-16, +-6.68816866924924996e-17, +-9.98851044622774083e-18, +-1.50770577756499440e-18, +-2.86625271312173333e-19, +-1.28994566263679433e-19, +-4.84934404621054952e-20, +-4.66402715719221295e-21, +-6.73051450662499049e-21, +-5.70444318950926097e-21, +-1.37927044105750909e-21, + 2.05244115969871734e-21, + 3.60836274702088697e-21, +-1.91438138550190823e-22, +-2.55804194395937867e-21, +-4.06278063762622829e-21, +-2.64734936808131923e-21, +-2.82293797240270859e-21, +-1.76741543055397962e-21, +-1.29382175804419336e-21, +-4.00504114750767691e-21, +-1.63611508817066541e-21, +-1.25279973664567048e-20, +-7.95420298914797331e-22, +-2.36035544073543271e-21, +-1.20182054408106882e-21, +-2.45723689855136760e-21, +-3.61351424415153121e-21, +-1.44726758817277953e-21, +-5.21145240721816146e-21, +-4.95447578202034581e-21, +-3.00105180135977561e-21, +-6.19708061152943348e-23, +-1.71845503472322659e-21, +-1.19456516567875144e-21, +-4.63827164445209790e-21, +-2.86194553494407746e-21, +-1.09820385322551559e-21, +-4.35447173020934232e-21, + 8.97559118952608353e-22, +// root 4 + 3.64281143173086575e-01, + 3.30763580953599201e-01, + 2.99832840071932283e-01, + 2.71681697180840731e-01, + 2.46322898411914848e-01, + 2.23640699249723657e-01, + 2.03440546496718500e-01, + 1.85488433952720994e-01, + 1.69538891298532862e-01, + 1.55356016377689976e-01, + 1.42733060676140694e-01, + 1.31508434213054526e-01, + 1.21564389321430710e-01, + 1.12801006164338830e-01, + 1.05106034305970680e-01, + 9.83479021749631421e-02, + 9.23903311560955870e-02, + 8.71086190035868235e-02, + 8.23970109488759289e-02, + 7.81687769385694398e-02, + 7.43533598183017258e-02, + 7.08931511285112587e-02, + 6.77407522179222926e-02, + 6.48568326028311354e-02, + 6.22084884812796335e-02, + 5.97679824725180012e-02, + 5.75117679495826262e-02, + 5.54197263004603882e-02, + 5.34745649196148518e-02, + 5.16613377725819722e-02, + 4.99670603734009774e-02, + 4.83803981712806891e-02, + 4.68914125185700761e-02, + 4.54913521761116796e-02, + 4.41724811078325133e-02, + 4.29279354026223664e-02, + 4.17516037327877246e-02, + 4.06380269521276552e-02, + 3.95823133511085806e-02, + 3.85800667925041418e-02, +-1.73548754716003582e-02, +-1.61413800532958021e-02, +-1.47796059385320276e-02, +-1.33712552547849781e-02, +-1.19939306777064100e-02, +-1.06986790303368311e-02, +-9.51385254191256489e-03, +-8.45118431283562246e-03, +-7.51078306462241510e-03, +-6.68299259297835523e-03, +-5.94838661659896802e-03, +-5.28215989208773943e-03, +-4.66683340911952602e-03, +-4.10235382002423470e-03, +-3.59960468326900058e-03, +-3.16575119942842653e-03, +-2.79836196701230711e-03, +-2.48885299269310497e-03, +-2.22724944400008815e-03, +-2.00463598522002389e-03, +-1.81376228985872254e-03, +-1.64890016382037525e-03, +-1.50553581102583450e-03, +-1.38008879383158404e-03, +-1.26969320429787843e-03, +-1.17203388747170382e-03, +-1.08522429025191959e-03, +-1.00771467635746813e-03, +-9.38222460473535119e-04, +-8.75678788854758277e-04, +-8.19187179073764364e-04, +-7.67991205514520318e-04, +-7.21449038258035504e-04, +-6.79013223114314146e-04, +-6.40214505035073393e-04, +-6.04648796525035330e-04, +-5.71966611156897583e-04, +-5.41864443296290492e-04, +-5.14077694869052642e-04, +-4.88374839802748037e-04, + 1.37844522066426253e-04, + 1.63415965553749618e-04, + 1.75148289589808213e-04, + 1.75521065520043969e-04, + 1.67888716393367171e-04, + 1.55420759588967272e-04, + 1.40582920666861694e-04, + 1.25085765589565714e-04, + 1.10188329108367467e-04, + 9.71200843991353908e-05, + 8.70134195182655331e-05, + 7.98891713028218017e-05, + 7.39263001239112206e-05, + 6.69581010230070492e-05, + 5.85874438349578541e-05, + 4.99305193311298017e-05, + 4.20838981911429659e-05, + 3.54798291385295531e-05, + 3.00844443827133345e-05, + 2.57006346457264216e-05, + 2.21215354912016370e-05, + 1.91756989698184177e-05, + 1.67302142420477584e-05, + 1.46834529980338390e-05, + 1.29574016486422558e-05, + 1.14916328332487729e-05, + 1.02388763211683532e-05, + 9.16179974567060649e-06, + 8.23065495360536872e-06, + 7.42153972686583318e-06, + 6.71510020144548477e-06, + 6.09555226953820568e-06, + 5.54993640463834809e-06, + 5.06754509493767698e-06, + 4.63947917547077049e-06, + 4.25830131021086911e-06, + 3.91776333158365744e-06, + 3.61259018867761230e-06, + 3.33830761757156669e-06, + 3.09110382617314120e-06, + 2.73530755587337554e-06, + 1.53097001001510904e-06, + 4.58779895723096859e-07, +-3.51478346955300067e-07, +-8.78618598185180737e-07, +-1.16721685454718769e-06, +-1.28393550341078751e-06, +-1.28324473917738038e-06, +-1.18372856852545484e-06, +-9.77923886074760212e-07, +-7.04588588559316605e-07, +-5.08973494344452942e-07, +-5.16928657761990584e-07, +-6.48794401308760931e-07, +-7.29093345661351609e-07, +-6.98680117913224715e-07, +-6.03917810789472579e-07, +-4.97653877038994533e-07, +-4.04338162329354927e-07, +-3.29038619935527304e-07, +-2.69709003007867647e-07, +-2.22982795970003473e-07, +-1.85910433678651464e-07, +-1.56223964611210463e-07, +-1.32232042353580890e-07, +-1.12673879817992441e-07, +-9.66017683009686195e-08, +-8.32959726982354349e-08, +-7.22042839132237117e-08, +-6.28989220838271529e-08, +-5.50455034788427590e-08, +-4.83804465431760078e-08, +-4.26943449380756571e-08, +-3.78196070609735155e-08, +-3.36211798550150694e-08, +-2.99895247495638598e-08, +-2.68352544056590405e-08, +-2.40850050809461529e-08, +-2.16782363036430472e-08, +-1.95647320138086660e-08, +-7.48362248172433555e-08, +-7.31825836405136724e-08, +-5.95536971090544376e-08, +-4.15666850220667234e-08, +-2.48191940537528872e-08, +-1.19587004951940015e-08, +-3.20529736771698622e-09, + 3.10787861818861909e-09, + 9.48948977423615330e-09, + 1.59510170319584841e-08, + 1.66162712454865479e-08, + 6.28513924388352405e-09, +-6.31473156236202095e-09, +-8.11531719182900278e-09, +-1.38581058028781821e-09, + 4.59540009667496152e-09, + 6.69303286871942035e-09, + 6.36071279150460294e-09, + 5.26638014973196971e-09, + 4.17199215002552601e-09, + 3.27937846606382787e-09, + 2.59110404494352507e-09, + 2.06553337935418470e-09, + 1.66207436540138705e-09, + 1.34943489829556568e-09, + 1.10475007071821139e-09, + 9.11418242315793309e-10, + 7.57298661758757093e-10, + 6.33419648019782618e-10, + 5.33080000061020373e-10, + 4.51222970626819699e-10, + 3.83995993383189996e-10, + 3.28437474559690598e-10, + 2.82251595040950459e-10, + 2.43644534021550373e-10, + 2.11204312385469848e-10, + 1.83811737911073862e-10, + 1.60573841890392109e-10, + 1.40773709157900311e-10, + 1.23832381100171209e-10, +-3.35330364086179603e-10, + 4.47844791601777781e-10, + 8.49902699120447857e-10, + 9.02767545366372354e-10, + 7.51123322355551881e-10, + 5.33529246306768314e-10, + 3.55898443857968216e-10, + 2.98658253285017513e-10, + 3.43998653225863856e-10, + 2.49626090720449601e-10, +-2.42388048622350828e-10, +-7.10381168664249745e-10, +-4.18407308441863110e-10, + 2.06699509400128784e-10, + 3.77498196880113924e-10, + 1.99115697557629202e-10, + 2.65688913836613976e-11, +-4.57112351732725975e-11, +-5.79754361748038122e-11, +-5.01285013119251429e-11, +-3.92251353849579786e-11, +-2.99699578172111688e-11, +-2.29210592568410931e-11, +-1.76776761460207718e-11, +-1.37701197480691223e-11, +-1.08317394848610444e-11, +-8.59901619454746822e-12, +-6.88509339675435698e-12, +-5.55673711840099214e-12, +-4.51794913107283255e-12, +-3.69879631636172929e-12, +-3.04777122083060455e-12, +-2.52658973874133223e-12, +-2.10646935060737396e-12, +-1.76562976391905710e-12, +-1.48742643032639369e-12, +-1.25904031292584699e-12, +-1.07053592476507977e-12, +-9.14149648854788129e-13, +-7.83777642981167096e-13, + 3.85555418630860463e-11, + 2.52079497317608808e-11, + 8.63324535320149062e-12, +-3.15165682238763368e-12, +-8.52866143758584922e-12, +-8.90132522369305430e-12, +-5.30514922599921664e-12, + 5.43024537044674470e-13, + 1.50122782588710215e-12, +-1.18035169095281045e-11, +-2.62373946221673771e-11, +-6.01545819323042017e-12, + 2.64822021045862674e-11, + 1.90126811015805910e-11, +-3.19796294150548875e-12, +-8.91369893672029793e-12, +-4.99420832000015992e-12, +-1.39595564143652663e-12, + 9.67133008561821414e-14, + 4.50781172378659737e-13, + 4.31288251365393143e-13, + 3.38054482610770946e-13, + 2.52558183706440305e-13, + 1.87663081656829268e-13, + 1.40455135588954427e-13, + 1.06197579605258255e-13, + 8.11289028515317384e-14, + 6.25982484912574421e-14, + 4.87454489678364364e-14, + 3.82898496841930754e-14, + 3.03188870585006898e-14, + 2.41960606452309174e-14, + 1.94366727366169762e-14, + 1.57210001826955263e-14, + 1.27967281511526918e-14, + 1.04761508875675051e-14, + 8.62406642484732503e-15, + 7.13990773146212934e-15, + 5.93795825805853627e-15, + 4.96135703943230213e-15, +-2.74759730391114276e-13, +-6.02332349485588032e-13, +-5.33278642976026175e-13, +-3.01568788516852716e-13, +-9.31500892280362388e-14, + 6.10381422628838241e-14, + 1.89548264010905586e-13, + 1.86391314032497161e-13, +-1.90257888678389320e-13, +-6.96869160427168850e-13, +-4.97674384453705329e-14, + 1.35146807215969139e-12, + 5.47822885112303108e-13, +-8.45104273321139555e-13, +-5.36180862344407485e-13, + 5.44406621360843313e-14, + 1.64123363956663376e-13, + 8.71042331057568426e-14, + 2.66641335606739655e-14, + 3.08252330628243978e-15, +-2.89383895229148621e-15, +-3.37779918472509216e-15, +-2.68800024330026414e-15, +-1.97564953445984184e-15, +-1.42564100404574991e-15, +-1.03643420594994156e-15, +-7.62959339249373898e-16, +-5.65339237762001189e-16, +-4.28086943668234151e-16, +-3.23602633493093189e-16, +-2.49384960734644582e-16, +-1.85789511736756339e-16, +-1.48361032928278916e-16, +-1.16096792924449681e-16, +-9.14950708072540802e-17, +-7.37233977390669203e-17, +-5.81129209549552493e-17, +-4.55102064444399262e-17, +-3.44094054052675374e-17, +-2.94831782229719281e-17, +-1.73615627742195625e-14, +-3.08617787524945515e-15, + 6.03764788101386079e-15, + 7.44434184347646135e-15, + 5.49276443826892336e-15, + 4.42580873376435930e-15, + 3.10682975464646970e-15, +-4.87091526914377899e-15, +-1.80701094390382821e-14, +-5.43800077411364168e-15, + 4.60681592012700310e-14, + 1.90855516366922462e-14, +-5.68066489163999327e-14, +-1.53259259160816215e-14, + 2.31891872189384249e-14, + 1.03551777372230518e-14, +-1.28758836006503782e-15, +-2.54228097413929259e-15, +-1.21570479498686718e-15, +-3.69190715847246038e-16, +-6.27869227249737058e-17, + 1.01619991359190138e-17, + 1.88019550525820608e-17, + 1.65893680959175442e-17, + 1.89059736809844941e-17, + 1.19227870930830026e-17, + 7.16450156921482755e-18, + 6.55576404334073540e-18, + 1.64714097026291568e-18, + 1.04615510974910583e-18, + 1.49384085479756282e-18, + 4.19819668026973053e-18, + 7.55584602879655591e-19, + 1.17994328056730780e-18, + 1.87785390656439127e-19, +-4.84675078655221484e-19, +-5.92725989096095566e-19, + 9.12751165353509235e-19, + 2.43928153870167352e-18, + 1.20286342360369511e-19, + 3.59443998942305059e-16, + 3.72021501794345189e-16, + 1.29041130227842200e-16, +-2.04605108316846859e-17, +-4.60435859159676163e-17, +-9.57776998699582288e-18, +-9.57055217984478273e-17, +-3.63810970598882997e-16, +-2.27483176566146678e-16, + 1.09351093187332527e-15, + 1.03753050146280610e-15, +-2.48750898531779128e-15, +-5.30537343149914519e-16, + 1.89000035422170853e-15, + 1.00033847790797172e-16, +-4.90191329408664384e-16, +-1.39910786893102628e-16, + 2.56159035288816337e-17, + 3.46482500642873140e-17, + 1.65314988142087345e-17, + 5.17198677613323906e-18, +-9.31872399198704847e-19, +-3.02595357378306593e-18, +-2.05587414968201760e-19, + 3.93825102612017923e-18, + 2.62463384409641497e-18, + 2.11389257846430972e-18, + 1.01744428644139219e-18, + 1.11892790574008677e-19, + 1.63889571621155088e-18, + 8.56655504203274787e-19, + 3.09872209091818914e-18, + 1.47668035771624319e-18, + 1.79480853702627316e-18, + 1.68761453164890676e-18, +-9.05317733936644978e-20, + 3.21532408477250644e-19, + 3.52528419075001752e-18, + 2.19572474510821348e-18, + 4.68053090578155128e-19, + 1.67978285598134715e-17, +-5.82652825414803579e-18, +-6.58801722336835818e-18, + 6.94063167349138311e-18, + 1.37253332638313232e-17, + 2.60374014815837593e-18, +-4.74499070186916109e-18, +-7.82491774473797195e-18, + 2.30649501429626440e-17, + 4.36687286812765738e-17, +-6.04031633070094174e-17, +-4.86924308697791652e-17, + 1.15321245998020463e-16, +-1.72042329170150257e-17, +-4.15227885960139857e-17, + 7.73706585219397936e-18, + 6.88597581244852967e-18, + 5.04047290839146794e-20, + 2.68289937599207994e-18, + 1.41722891808898012e-18, + 7.97912224615704744e-19, + 1.42606725454842192e-19, +-8.39559499528374401e-19, +-2.12687514590912445e-18, + 1.57227876671668122e-18, + 4.53051830468789611e-18, + 2.39499192252428995e-18, + 1.19888977488104757e-18, +-1.15074779427257032e-18, +-6.85713965708743521e-19, +-4.77953019618223362e-19, + 2.79180121646347355e-18, +-9.24819879641031645e-19, +-1.56896933759676287e-19, + 9.93612396517274136e-19, +-2.68378855226293973e-19, + 6.11677597477845887e-19, + 1.53858367559923592e-18, + 8.77612430089548171e-19, + 1.83069707813034958e-18, +-5.66855377855972210e-18, + 8.58712586061024014e-18, + 7.72603541084159306e-18, + 4.72546982044837549e-18, +-2.82247614734610033e-18, + 4.86774590759588403e-18, +-2.17395314633879814e-18, +-4.99489686379633403e-18, + 6.09594241423493483e-19, +-9.82310479235140915e-18, +-8.12850045704494760e-18, + 5.46280830138790096e-18, + 1.77500399836124447e-18, +-5.82409348904399138e-19, + 6.74321966364332473e-18, + 8.03053427290812894e-18, + 4.24590697940595053e-18, + 2.01680279904154242e-18, + 6.96277972653500410e-18, + 2.36078608980309314e-18, + 6.93671091978427928e-18, + 1.58267931665528693e-18, +-1.18042773527061974e-18, +-3.86143043213193201e-19, + 3.84425836336758317e-18, + 4.37623473671315592e-18, + 4.44888124443500576e-19, + 3.07422632536521833e-18, + 1.34244903925883896e-18, + 1.46088650580333894e-18, + 7.30076416443613317e-19, + 2.86024870089622445e-18, + 2.29779509500158816e-18, + 1.65953007199957489e-18, + 8.49731303989204756e-19, + 1.97253535587929006e-18, + 9.23606581906100771e-19, + 1.80758089795709284e-18, + 1.23087681257530635e-18, + 2.10737653188437648e-18, +-5.34334229733072571e-18, + 4.65361128908789273e-19, + 5.02462337919876356e-19, +-3.29683902304675266e-18, + 7.89274874341854895e-18, +-4.23514727330243379e-18, +-1.86155314673651734e-18, +-3.92928084569794065e-18, + 2.77915982974586476e-18, +-4.15892356687871962e-18, + 8.54467360049919501e-19, + 1.74607638784491395e-18, + 2.21240513989083107e-18, +-3.30235895952670378e-18, +-9.17837608381023366e-19, +-5.84735667305466149e-19, + 3.34492766476618848e-19, +-2.05507144205988829e-18, + 1.28178324592202176e-18, + 2.17290397571278790e-18, +-1.69842510827567697e-18, +-5.95239533001488096e-19, +-1.52189854896028955e-18, +-2.32169884472057420e-18, + 1.12583896503362544e-18, + 4.39660639584605361e-19, + 2.09980812030261090e-18, + 1.18343369770364639e-18, + 9.97910054182546920e-19, + 1.12526403911627595e-18, + 7.64018878510875407e-19, + 2.81539416640744723e-18, + 6.79702842035393721e-19, + 2.70434193760582086e-19, + 1.40237651515264255e-18, + 4.42739211800400461e-19, + 6.11306391153240944e-19, + 1.45915961009094101e-18, + 6.72188156930272572e-19, + 7.64975932466135729e-19, + 3.18538050500520217e-18, +-1.12238455431947156e-17, + 1.11718189394589878e-17, +-1.19081398733640737e-17, +-1.31545812390309168e-18, +-2.35390672838303531e-18, +-1.75730644177348182e-20, +-3.88012811624931255e-18, +-5.72470612360028973e-19, +-5.69956855522639096e-18, +-9.07352378491680200e-19, +-2.66779416730935533e-18, + 3.31937493484868206e-18, +-4.14853105838142950e-18, +-4.12250171738813478e-18, +-4.72440524457931861e-18, +-1.80418571285092645e-18, +-3.07240394931454389e-18, +-2.56309265013827667e-18, +-3.70876820181683231e-18, +-3.70555086880776589e-18, +-2.54393828396160116e-18, +-2.07532285585327795e-18, +-3.28749965395175993e-18, +-1.95656624108170826e-18, +-1.82171369170225767e-18, +-2.22134190931627488e-18, +-2.62865903932033666e-18, +-3.58806403040093210e-18, +-2.30137692158426047e-18, +-2.21726498382242178e-18, +-1.92398651586215583e-18, +-2.07344550853617624e-18, +-1.74911537793270155e-18, +-2.62417051861927481e-18, +-1.59684234055413836e-18, +-2.75185910303337123e-18, +-2.10090749418903210e-18, +-1.22870884450649847e-18, +-1.74275118878585630e-18, + 1.00757624426522710e-01, + 4.51819451266304434e-02, + 2.34076749028794794e-02, + 1.37381425280611452e-02, + 8.95654472869679419e-03, + 6.36951542492498676e-03, + 4.86311823371051409e-03, + 3.93311364265356081e-03, + 3.33260019960691153e-03, + 2.93202382347810663e-03, + 2.65863435107725234e-03, + 2.46813922423387653e-03, + 2.33107796334178913e-03, + 2.22705654954562368e-03, + 2.14272934218028097e-03, + 2.07037607552932636e-03, + 2.00601826276883928e-03, + 1.94766753103515025e-03, + 1.89422886145710072e-03, + 1.84498619903986668e-03, + 1.79940112587112793e-03, + 1.75703819703376652e-03, + 1.71753394390871468e-03, + 1.68058043404533731e-03, + 1.64591439110128553e-03, + 1.61330910786210082e-03, + 1.58256814544019517e-03, + 1.55352032388608534e-03, + 1.52601569285665847e-03, + 1.49992226158976233e-03, + 1.47512332430791413e-03, + 1.45151525694288733e-03, + 1.42900569004513812e-03, + 1.40751198424336949e-03, + 1.38695995076767433e-03, + 1.36728277179685651e-03, + 1.34842008476177976e-03, + 1.33031720196659506e-03, + 1.31292444251110245e-03, + 1.29619655790008930e-03, +-4.27023871357566989e-02, +-1.59388363172492005e-02, +-6.77155574424879655e-03, +-3.22029403675241780e-03, +-1.68506551028367612e-03, +-9.54342437632108563e-04, +-5.76206201855571868e-04, +-3.65798118365986903e-04, +-2.41082879914937862e-04, +-1.63100235148235526e-04, +-1.12506677248059753e-04, +-7.94867773261035408e-05, +-5.86266735787692900e-05, +-4.60808706858970984e-05, +-3.86339848946571640e-05, +-3.39135195124322581e-05, +-3.05403625708415774e-05, +-2.78641496828905325e-05, +-2.56106085197504383e-05, +-2.36596546151890087e-05, +-2.19479069869440946e-05, +-2.04338449036608041e-05, +-1.90863723564084800e-05, +-1.78807939306760964e-05, +-1.67970129014010629e-05, +-1.58184666530012480e-05, +-1.49313833093416933e-05, +-1.41242253522837822e-05, +-1.33872615315754056e-05, +-1.27122327779259966e-05, +-1.20920888281197751e-05, +-1.15207787919788615e-05, +-1.09930832950855519e-05, +-1.05044789548381684e-05, +-1.00510282099994787e-05, +-9.62928918394996493e-06, +-9.23624149252764131e-06, +-8.86922482821775226e-06, +-8.52588784752331012e-06, +-8.20414541727937671e-06, + 5.54460929243087361e-03, + 1.80600868794272146e-03, + 6.67587302984183183e-04, + 2.76554987568547158e-04, + 1.26706028137880375e-04, + 6.33890261857013927e-05, + 3.42319072790333738e-05, + 1.97600650088042892e-05, + 1.20868016658126879e-05, + 7.74309819235105517e-06, + 5.07442544282686915e-06, + 3.27339112263051698e-06, + 2.01005375572405657e-06, + 1.18593523336542924e-06, + 7.19412620663420222e-07, + 4.85149152343238735e-07, + 3.69212127727742645e-07, + 3.04401416569793559e-07, + 2.60995637039146921e-07, + 2.27838383273576678e-07, + 2.00836184073632936e-07, + 1.78239216590010515e-07, + 1.59075758282347379e-07, + 1.42683116371299439e-07, + 1.28562578448730675e-07, + 1.16323913001033385e-07, + 1.05656377746514734e-07, + 9.63098285795737890e-08, + 8.80811495722687247e-08, + 8.08041351672126949e-08, + 7.43418148674021890e-08, + 6.85805642811932370e-08, + 6.34255439964310550e-08, + 5.87971366374719311e-08, + 5.46281415198039496e-08, + 5.08615493729539611e-08, + 4.74487648526465203e-08, + 4.43481773907351352e-08, + 4.15240049934127837e-08, + 3.89453533762214484e-08, +-5.44094759243127853e-04, +-1.57774132399197763e-04, +-5.17444553676225745e-05, +-1.89997481491123831e-05, +-7.72284055611038717e-06, +-3.43520039043080232e-06, +-1.65358617626612227e-06, +-8.52672022876760152e-07, +-4.68247413824286949e-07, +-2.76081804201226918e-07, +-1.78796320892001137e-07, +-1.25348471073221320e-07, +-8.61462000012783913e-08, +-5.22013980482490149e-08, +-2.72981073904907070e-08, +-1.32779855128966178e-08, +-6.89727941305345622e-09, +-4.26258433168306608e-09, +-3.10177311889486269e-09, +-2.47203734904813231e-09, +-2.04933144392291046e-09, +-1.72896290853044057e-09, +-1.47341160680042870e-09, +-1.26512173487610452e-09, +-1.09334477473091747e-09, +-9.50453579474233854e-10, +-8.30707627238498375e-10, +-7.29681517421603745e-10, +-6.43918641808131543e-10, +-5.70692516098918601e-10, +-5.07834114613424297e-10, +-4.53604329214370086e-10, +-4.06598561639023661e-10, +-3.65674625199315647e-10, +-3.29897766222487114e-10, +-2.98498383515900354e-10, +-2.70839254513477446e-10, +-2.46389942461970750e-10, +-2.24706669398158220e-10, +-2.05416382203016610e-10, + 4.40023468531899312e-05, + 1.15222834333614240e-05, + 3.40139365596289617e-06, + 1.12283564435742968e-06, + 4.10563307817594500e-07, + 1.64630801849527757e-07, + 7.16903157508841660e-08, + 3.35454925606673387e-08, + 1.65667665530799007e-08, + 8.35500553162440139e-09, + 4.29479469994951682e-09, + 2.68855660342842357e-09, + 2.29314100703835215e-09, + 1.89208755019964032e-09, + 1.20087352962397261e-09, + 5.90561982239876272e-10, + 2.48139068977039257e-10, + 1.03288014067023644e-10, + 5.04553860325752628e-11, + 3.11215936048614444e-11, + 2.26309244824126741e-11, + 1.77517178138251411e-11, + 1.43575037894475417e-11, + 1.17834581141293948e-11, + 9.76404275022431744e-12, + 8.15436454979929056e-12, + 6.85790228926621054e-12, + 5.80477501342905810e-12, + 4.94274380505817085e-12, + 4.23213799807316782e-12, + 3.64250070052339841e-12, + 3.15023118190728716e-12, + 2.73688528070319804e-12, + 2.38793549785406796e-12, + 2.09185453198220005e-12, + 1.83943118125306077e-12, + 1.62325765062227605e-12, + 1.43733950576836493e-12, + 1.27679695505796512e-12, + 1.13763692252462751e-12, +-3.06968336822529873e-06, +-7.33719662224101968e-07, +-1.97048618742135670e-07, +-5.90849738869234451e-08, +-1.96228810190733968e-08, +-7.15439812701626748e-09, +-2.83880213402065606e-09, +-1.21967533883994060e-09, +-5.69721145951906634e-10, +-2.85556736846677903e-10, +-1.32108877626085808e-10, +-3.82554244099369408e-11, +-1.24673694203063713e-11, +-2.94991628007170845e-11, +-3.56960377260987702e-11, +-2.38865840513115967e-11, +-1.11584734297541917e-11, +-4.23527015851736615e-12, +-1.50396525496117848e-12, +-5.95374332065807074e-13, +-3.04613271194220079e-13, +-1.98046635251480784e-13, +-1.46077185548201900e-13, +-1.13307174353069683e-13, +-8.97650658321520305e-14, +-7.19721198402610610e-14, +-5.82350059307153970e-14, +-4.74978567607417758e-14, +-3.90246924107438010e-14, +-3.22812753656319240e-14, +-2.68726704343297077e-14, +-2.25028785557426135e-14, +-1.89486737417918498e-14, +-1.60391523960897694e-14, +-1.36430462328117099e-14, +-1.16587983228775054e-14, +-1.00067241377319013e-14, +-8.62429893135237534e-15, +-7.46204903183441322e-15, +-6.48037137109400076e-15, + 1.89972986479554696e-07, + 4.18078017796049546e-08, + 1.03021774075499526e-08, + 2.82905145920940327e-09, + 8.60074720310775110e-10, + 2.87253333966534536e-10, + 1.04446893498407088e-10, + 4.08251812643091436e-11, + 1.70221843463285675e-11, + 8.15451937836801401e-12, + 5.08276364051488322e-12, + 2.56978154385133191e-12, +-2.36193161046373693e-13, +-7.36010291031670219e-13, + 2.32150383740849279e-13, + 6.08825266820653462e-13, + 4.12492776541601603e-13, + 1.81175283734966119e-13, + 6.33688367537940000e-14, + 2.01031259008567721e-14, + 6.75359629347138144e-15, + 2.88192855137447351e-15, + 1.65109082606765127e-15, + 1.13746234807679194e-15, + 8.45783431141070026e-16, + 6.47884174503758494e-16, + 5.03960010840162410e-16, + 3.95926764319348276e-16, + 3.13839350187724595e-16, + 2.50833790984944790e-16, + 2.01950586680828619e-16, + 1.63833637108089862e-16, + 1.33715408907825523e-16, + 1.09800650279083653e-16, + 9.07595653708224086e-17, + 7.54254460376052597e-17, + 6.29093700897908335e-17, + 5.27975465262656717e-17, + 4.44134433791832107e-17, + 3.76601464293056091e-17, +-1.06276751738415430e-08, +-2.16904481844121304e-09, +-4.93916533449693296e-10, +-1.25063004027038836e-10, +-3.50259802306386862e-11, +-1.07808051266524863e-11, +-3.62477674392356108e-12, +-1.32269001836209117e-12, +-5.05103923802857388e-13, +-1.75351567452626862e-13, +-7.63699850317125019e-14, +-1.08844124575571315e-13, +-6.91382496664378991e-14, + 2.52054303060303839e-14, + 2.95468720342369286e-14, +-7.90587588607827281e-16, +-9.66707273915826946e-15, +-6.21029968761384172e-15, +-2.53427642425239227e-15, +-8.24561186442230626e-16, +-2.40129203300136010e-16, +-7.14078149727922832e-17, +-2.61279784416578108e-17, +-1.29915854912376994e-17, +-8.38077417956761101e-18, +-6.02898401157474898e-18, +-4.30260230320572965e-18, +-3.28013819162736621e-18, +-2.53213700109941117e-18, +-1.96282682582021469e-18, +-1.47425988973930563e-18, +-1.09977725253130755e-18, +-8.60147904221470196e-19, +-6.79678850535682136e-19, +-4.10848743586017293e-19, +-3.69475913012187520e-19, +-2.68818601040152505e-19, +-2.41069903553022190e-19, +-2.72762533066475590e-19, +-1.42706962184004017e-19, + 5.44711430214190184e-10, + 1.03741343066995983e-10, + 2.19633007288276514e-11, + 5.15798012715399959e-12, + 1.33813151122914477e-12, + 3.81285235056608194e-13, + 1.18510348582139140e-13, + 4.01782180908219641e-14, + 1.54157214451186621e-14, + 6.27531356353883707e-15, + 1.92815716658033104e-16, +-8.47251283443959812e-16, + 3.15159361881529514e-15, + 1.72204903208974226e-15, +-9.46632555435991880e-16, +-6.57068694154894480e-16, + 1.11378000191212620e-17, + 1.41545525322886556e-16, + 8.17075463562287599e-17, + 3.07875943685767298e-17, + 9.45778703002406381e-18, + 2.56424325757867596e-18, + 5.92595707398893860e-19, + 3.34111778162757165e-19, + 1.11124699372940676e-19, + 3.08710314919632951e-20, + 1.45455002813241841e-19, + 1.12184894104380370e-19, +-2.12768954385531002e-20, + 3.61354444436376500e-20, + 3.02037981520551223e-20, + 9.23278653455750313e-20, + 8.66209009063821109e-20, + 3.08754617775631666e-20, + 9.66500874976355551e-20, + 7.03990887404676771e-20, + 2.91254541843541662e-20, + 4.09647322992882793e-20, + 1.13222380186491375e-21, + 3.07015035576693933e-20, +-2.58365953075329825e-11, +-4.61667687056823476e-12, +-9.13597710305414667e-13, +-2.00019853204994869e-13, +-4.83029768183175336e-14, +-1.28093273332854013e-14, +-3.70591727970204780e-15, +-1.14928226066748933e-15, +-3.76513113294239862e-16, +-1.88580739974170588e-16, +-1.33372013099330484e-16, + 8.74440601688755517e-17, + 6.06016129154565359e-17, +-1.02981656767332599e-16, +-2.54004824182571019e-17, + 2.42173796153583799e-17, + 1.01865647932093084e-17, +-6.07732078362518789e-19, +-1.80815518902025934e-18, +-1.00847722597151869e-18, +-2.81487135513163855e-19, +-8.11448593183392891e-20, +-1.01373749083055260e-19, + 6.37571398117139964e-20, +-1.02424935312226303e-21, +-2.03295417338049700e-20, + 9.76803605583452480e-20, + 4.98323522501147350e-20, + 7.68600900548672655e-20, + 7.98741015459349048e-20, + 2.96474401699640381e-20, + 1.39750326113677886e-19, + 1.20578716555283634e-19, + 9.03179150111491798e-20, + 8.86022663985204094e-20, + 8.66774954691871487e-20, + 6.17681436946185440e-20, + 6.07664209451580078e-20, + 2.88842601487680868e-20, + 4.70290326876184441e-20, + 1.14293298605774877e-12, + 1.92538552290602765e-13, + 3.57878346075300402e-14, + 7.33666304410161427e-15, + 1.65635869404325963e-15, + 4.10653763802759451e-16, + 1.10955220669377067e-16, + 3.31659216604852258e-17, + 9.82791723669019972e-18, + 1.25822728871881949e-18, + 3.55960285929436318e-18, + 4.86608325894116978e-18, +-5.36133576143567358e-18, +-4.65751415899628205e-19, + 2.58681842259569860e-18, + 1.02204271034161279e-19, +-4.29356306172857814e-19, +-3.69484014876303092e-20, + 9.42979911141100290e-21, + 2.34168718624799424e-20, + 8.43676715749151969e-20, +-1.43449442435593818e-22, +-5.09083365566701945e-20, + 3.37134157140834555e-20, + 6.69380164505397273e-21, +-2.69859412515505606e-20, + 3.44647029667538379e-20, + 6.92175245324109761e-20, +-3.48932456416995322e-21, + 1.68545563855942254e-20, + 1.23571402797713694e-20, + 1.04130061197373712e-19, + 3.50633577760831060e-20, + 4.67077801703299530e-20, + 6.08749282090813853e-20, + 8.34455919193838333e-20, + 7.26206561899648933e-20, + 6.83857034908202636e-20, + 7.56706806838974089e-21, + 4.70165217583211207e-20, +-4.74459750075917650e-14, +-7.56989074941829426e-15, +-1.32546223256872402e-15, +-2.56434995693269399e-16, +-5.48003634939156407e-17, +-1.27757498932454651e-17, +-3.48368442001952912e-18, +-1.25225891625326757e-18, +-4.87294779395513867e-19, +-1.72952335952737058e-19, +-2.65592860983844767e-20, +-2.71534692127603742e-19, +-1.26255838685268241e-19, + 2.14675590457589923e-19, + 8.21770716962893518e-20, + 3.36987995107086180e-20, + 6.76681301099944668e-20, + 1.02911001676712318e-19, + 3.06064575382841780e-20, + 6.23166249405215844e-20, + 1.00991194548111943e-19, + 4.50635136053299847e-20, +-2.87069411561658557e-20, + 4.68729498072782056e-20, + 1.07041451743355499e-22, +-3.74537491405556545e-20, + 4.54074031603899288e-20, + 8.59763722384664858e-20, + 3.69408903795630852e-20, + 4.51813914373099979e-20, + 1.14970958473244050e-20, + 5.52161617442705201e-20, + 7.09151855207309392e-20, + 5.66218468020908796e-20, + 4.36478951081268449e-20, + 5.01710322335371039e-20, + 5.24458841813715013e-20, +-9.82957507470771596e-21, +-1.58960947802666305e-20, + 8.15728100770060193e-21, + 1.84926523172570959e-15, + 2.79697013291397965e-16, + 4.56710716773471924e-17, + 7.05398133757637628e-18, + 6.96653701944932951e-19, + 1.87296960625469001e-19, +-1.82529887260440604e-19, +-5.53418162053863769e-20, + 2.11849568014211671e-20, +-2.33029589187347635e-20, +-3.34216230245643161e-20, +-3.13682010604492099e-20, +-4.69058569655000265e-20, + 7.87694145126299693e-21, + 6.90368692251542938e-21, + 6.36193257252720000e-20, +-8.53094277967187322e-20, +-5.51367694663506289e-20, + 1.57219083419764392e-20, + 2.14388296168556263e-21, + 3.77682281040863439e-20, +-6.38358230881187687e-21, +-2.28338504212613581e-20, + 9.47336892361716198e-21, + 2.83975365209782561e-21, +-3.17556952169731354e-20, + 5.42148748016910043e-20, + 5.33444144813238261e-20, + 1.64984891532954495e-20, +-2.00937290795676246e-20, + 4.51534556217333355e-20, + 9.63325053876635870e-20, + 4.77343503258699624e-20, + 2.22301794805305280e-20, + 6.48099586231448178e-20, + 7.26554702203825313e-20, + 1.43042229159820279e-20, + 3.73688941764363079e-20, + 1.75064241337023133e-20, +-1.18849588298274933e-20, +-9.40273494456107971e-17, +-1.85319008794867736e-17, +-5.20774451670540104e-18, +-1.09370557571094099e-18, +-6.48835823910781427e-19, +-1.47323299219278682e-19, +-1.47153976652135206e-19, +-1.59814698853832932e-19, +-8.03664329008720097e-20, +-1.23370238310856989e-20, +-6.65698269607615345e-20, +-5.88016387960099775e-20, + 4.32473948369502836e-20, +-1.68933771696911455e-20, +-1.92923549738099462e-20, + 3.86996267214733291e-20, +-3.29502872993627105e-20, + 7.37528752905270232e-21, +-2.36433937974939302e-20, +-2.50087376647902581e-20, +-2.95588189552252199e-20, + 2.09131287996882802e-20, +-4.54972059388084441e-20, + 2.05113421249964104e-20, +-3.32351412719630496e-20, +-8.58429510461652360e-20, +-3.90230423302982410e-20, +-4.34667587921731208e-20, +-6.11234661112632654e-20, +-4.90486603238848276e-20, +-3.57519898118879566e-20, +-4.62560796689806197e-20, +-4.09843643522004228e-20, + 3.96750730739507284e-20, + 2.26004859491501214e-20, +-1.55241608930549493e-20, +-2.59746939368395453e-21, + 1.33009010239498256e-20, +-2.86363223985611287e-20, + 1.21722159803564207e-20, +// root 5 + 1.97829908366819546e-01, + 1.75872245048646680e-01, + 1.56801598121757896e-01, + 1.40281447331943004e-01, + 1.25974487735031171e-01, + 1.13566708357708809e-01, + 1.02778121098889147e-01, + 9.33652696028508533e-02, + 8.51196885523679836e-02, + 7.78660187721088720e-02, + 7.14624288638669586e-02, + 6.58018518350674819e-02, + 6.08070876580311045e-02, + 5.64158222620248784e-02, + 5.25645792585999541e-02, + 4.91839516094337986e-02, + 4.62043427437578633e-02, + 4.35629100039916575e-02, + 4.12066293970713496e-02, + 3.90920931963062782e-02, + 3.71840081275432999e-02, + 3.54535626671829696e-02, + 3.38770525033744857e-02, + 3.24348084601664699e-02, + 3.11103753835718332e-02, + 2.98898818477949073e-02, + 2.87615522183764377e-02, + 2.77153252064183987e-02, + 2.67425528048220937e-02, + 2.58357605233036185e-02, + 2.49884548391578060e-02, + 2.41949673598786004e-02, + 2.34503277821074829e-02, + 2.27501596237612985e-02, + 2.20905941043554356e-02, + 2.14681985918416217e-02, + 2.08799168200529961e-02, + 2.03230186778466555e-02, + 1.97950578283388225e-02, + 1.92938357696419184e-02, +-1.17485740434716199e-02, +-1.02247986950645825e-02, +-8.86367261598872483e-03, +-7.67420847516755728e-03, +-6.64917529383396346e-03, +-5.77319981078721137e-03, +-5.02805233581788899e-03, +-4.39563962766523642e-03, +-3.85907857310041494e-03, +-3.40199694092387355e-03, +-3.00714321515977183e-03, +-2.65733618403332953e-03, +-2.34054082641692611e-03, +-2.05400021926057698e-03, +-1.80091263213398600e-03, +-1.58339420679283341e-03, +-1.39950729892878399e-03, +-1.24468304715366542e-03, +-1.11384655484543754e-03, +-1.00251601300183481e-03, +-9.07059987240266740e-04, +-8.24612608325291465e-04, +-7.52916290428468668e-04, +-6.90180416052746815e-04, +-6.34971740602301832e-04, +-5.86132457035099278e-04, +-5.42719102639387324e-04, +-5.03956656500227727e-04, +-4.69203699545789365e-04, +-4.37925699558545890e-04, +-4.09674326969186814e-04, +-3.84071294417909800e-04, +-3.60795623687752449e-04, +-3.39573533727736672e-04, +-3.20170350764899811e-04, +-3.02383991225549701e-04, +-2.86039677451357249e-04, +-2.70985626712245964e-04, +-2.57089513892875252e-04, +-2.44235553138291120e-04, + 1.99561637657121206e-04, + 1.80751348528941321e-04, + 1.59388306219467209e-04, + 1.38126095098051665e-04, + 1.18423029298740803e-04, + 1.00909141423318632e-04, + 8.57097681800599427e-05, + 7.26995215961193672e-05, + 6.17352905841627749e-05, + 5.28504936721789322e-05, + 4.61883041927927665e-05, + 4.14943575612207233e-05, + 3.77462312841648419e-05, + 3.38129498693166055e-05, + 2.94146681727946134e-05, + 2.50046633539702170e-05, + 2.10551296356489402e-05, + 1.77455345283526991e-05, + 1.50456439374880206e-05, + 1.28529415612795070e-05, + 1.10629651194499261e-05, + 9.58974244687388715e-06, + 8.36675653344853514e-06, + 7.34317375449757652e-06, + 6.47997789281406861e-06, + 5.74694901072488370e-06, + 5.12044728383014462e-06, + 4.58180284133764295e-06, + 4.11613867352387068e-06, + 3.71150131538529301e-06, + 3.35821192742447113e-06, + 3.04837690007759411e-06, + 2.77551519283127812e-06, + 2.53427199447110901e-06, + 2.32019684542491082e-06, + 2.12957034467288203e-06, + 1.95926779262850234e-06, + 1.80665114392563815e-06, + 1.66948282563723699e-06, + 1.54585656602825478e-06, +-1.35976666029188063e-06, +-1.72188561057691973e-06, +-1.80446543307049655e-06, +-1.72078909227098948e-06, +-1.55530182138606438e-06, +-1.36238386369207852e-06, +-1.17279579610990000e-06, +-9.97759960563135054e-07, +-8.29156379086979261e-07, +-6.48964305313671820e-07, +-4.63902720928348519e-07, +-3.32830565951389188e-07, +-3.08348039088618346e-07, +-3.50475819033670433e-07, +-3.75417769452922721e-07, +-3.53056547702209035e-07, +-3.03061631136501797e-07, +-2.49137852917457023e-07, +-2.02268206262835489e-07, +-1.64564074618291191e-07, +-1.34883477076359981e-07, +-1.11513812408464283e-07, +-9.29736158374302164e-08, +-7.81273920545134536e-08, +-6.61290557215944191e-08, +-5.63480451324366194e-08, +-4.83104050728617019e-08, +-4.16561958401757641e-08, +-3.61092582641149369e-08, +-3.14556602322994125e-08, +-2.75281769109502982e-08, +-2.41949915516932874e-08, +-2.13513803384364006e-08, +-1.89135309535688327e-08, +-1.68139035629071897e-08, +-1.49977180828774416e-08, +-1.34202720287405040e-08, +-1.20448763092240630e-08, +-1.08412547138358326e-08, +-9.78429426815417968e-09, +-3.39285419925450498e-08, +-1.25830834480007940e-08, + 1.10245391111580161e-09, + 8.51151312715410846e-09, + 1.16374229738838776e-08, + 1.21736469652022970e-08, + 1.14104830899674616e-08, + 1.05562780434276336e-08, + 1.07392582309113795e-08, + 1.17643918644968865e-08, + 1.07116788845741656e-08, + 5.01188540712519269e-09, +-1.47689160696147443e-09, +-2.81369162920799240e-09, +-2.64719165645476058e-11, + 2.56537273223564479e-09, + 3.43302809420030451e-09, + 3.20438659383669885e-09, + 2.63934217803799159e-09, + 2.08763689081072059e-09, + 1.64026039359314309e-09, + 1.29585420241789476e-09, + 1.03297862067847767e-09, + 8.31202414595083601e-10, + 6.74850674845039819e-10, + 5.52483951102132612e-10, + 4.55798954058942689e-10, + 3.78723967916072111e-10, + 3.16772254182864460e-10, + 2.66592538502358585e-10, + 2.25655957896016707e-10, + 1.92035842575137834e-10, + 1.64251107090113160e-10, + 1.41153617164868611e-10, + 1.21846280757081653e-10, + 1.05622971078139728e-10, + 9.19239868984518041e-11, + 8.03027465646635799e-11, + 7.04007296291755052e-11, + 6.19283928849741730e-11, + 1.25639730757541279e-09, + 8.70742642030436004e-10, + 5.10728417079431169e-10, + 2.47085042878441451e-10, + 7.93160594132448778e-11, +-1.55620858071278424e-11, +-5.10943242928947124e-11, +-2.40794042473127448e-11, + 4.26923750321588349e-11, + 3.38410147515226413e-11, +-1.67770638210095655e-10, +-3.66601995313797635e-10, +-2.22535181044991353e-10, + 7.46453558899574908e-11, + 1.62756203366843384e-10, + 8.57490252834900476e-11, + 8.03678953850544355e-12, +-2.44552451377690187e-11, +-2.94077346426523237e-11, +-2.51649194391196328e-11, +-1.96366127550978695e-11, +-1.49918732456982523e-11, +-1.14635107458700963e-11, +-8.84070473319194683e-12, +-6.88644043388652666e-12, +-5.41694337157180697e-12, +-4.30035725184313460e-12, +-3.44322605205628235e-12, +-2.77891548815446734e-12, +-2.25942009417720560e-12, +-1.84976002338271650e-12, +-1.52418613327748933e-12, +-1.26354462480558643e-12, +-1.05344062709967274e-12, +-8.82989653889356546e-13, +-7.43860459514584795e-13, +-6.29642565098549520e-13, +-5.35373395761142954e-13, +-4.57164234981509751e-13, +-3.91967435025680877e-13, +-1.44068322167557893e-11, +-1.64046776407152306e-11, +-1.31579065947291547e-11, +-8.84963904018495001e-12, +-5.31017995953612288e-12, +-2.69753205782172868e-12, +-2.12033712717337292e-13, + 2.37345108851167861e-12, + 2.36948196892268753e-12, +-4.21429899099202348e-12, +-1.12120315438340494e-11, +-2.25314523173906309e-12, + 1.25416989968007154e-11, + 9.18464789575211943e-12, +-1.15476066892119488e-12, +-3.98221636165512860e-12, +-2.25845160285088692e-12, +-6.13314119730422782e-13, + 7.26811440503390777e-14, + 2.31452793883912772e-13, + 2.17024637338114680e-13, + 1.69338400604641713e-13, + 1.26358375527739741e-13, + 9.38645661319763808e-14, + 7.02421315281309916e-14, + 5.31066033279948905e-14, + 4.05727215131317542e-14, + 3.13041227189275332e-14, + 2.43784340659372832e-14, + 1.91491711396525321e-14, + 1.51639005257449332e-14, + 1.21001146099832794e-14, + 9.71963278857638534e-15, + 7.86414249960364273e-15, + 6.39939924946005937e-15, + 5.23775161719022346e-15, + 4.31514932478333387e-15, + 3.57139563787200078e-15, + 2.97110208524898158e-15, + 2.48056178852578689e-15, +-2.34815476356562993e-13, + 5.49823172876159997e-14, + 1.52255687918131504e-13, + 1.45269491161200071e-13, + 1.06946526191442085e-13, + 8.52199525381358406e-14, + 9.54465615197339081e-14, + 7.34068061484454917e-14, +-1.05131366490861134e-13, +-3.35196551192627688e-13, +-3.48373747742443847e-14, + 6.10355477773938218e-13, + 2.53204901509848544e-13, +-3.88180230912521872e-13, +-2.54457272534806440e-13, + 1.99490865660138779e-14, + 7.44335704209255948e-14, + 4.00588761909381802e-14, + 1.21825412572118736e-14, + 1.22856646851549474e-15, +-1.51963822345704694e-15, +-1.69910707990692471e-15, +-1.34547267058295052e-15, +-9.84947947989995168e-16, +-7.14912570276263276e-16, +-5.19978088483595331e-16, +-3.82276797597170906e-16, +-2.84248842915948306e-16, +-2.11687556962537765e-16, +-1.61801441626632639e-16, +-1.22800375398491657e-16, +-9.37540026718530909e-17, +-7.44990568689639690e-17, +-5.62813777049568340e-17, +-4.56196094790980035e-17, +-3.75050976894985270e-17, +-2.77583789763411382e-17, +-2.17329462016373910e-17, +-1.70065581093620019e-17, +-1.55123509692296654e-17, + 1.26067105963236605e-14, + 5.63542746744195424e-15, + 9.51866084041702953e-16, +-1.00350648424204514e-15, +-1.13431972622035827e-15, +-9.87053399971447736e-17, + 4.24732113223435804e-16, +-2.58835811964239916e-15, +-8.32147540117984770e-15, +-2.35170041649114892e-15, + 2.11708905135228306e-14, + 8.98992645871709796e-15, +-2.57797295946824431e-14, +-7.37880029737831452e-15, + 1.05957168756725519e-14, + 4.92507456106012428e-15, +-5.18209701370058268e-16, +-1.16175185475850409e-15, +-5.63763106743713081e-16, +-1.73272836441280340e-16, +-2.78095012672773846e-17, + 1.06666484177405401e-17, + 1.34140289059647658e-17, + 1.10399555383151490e-17, + 7.30478050442794802e-18, + 4.26792582971359904e-18, + 2.69592668664353164e-18, + 1.33126528658296862e-18, + 1.12821963901078457e-18, + 5.41374846748876463e-20, + 1.16270936591536441e-18, + 1.54539917319980491e-18, + 2.54729704864350176e-20, + 2.02965390307794782e-18, +-2.30994467054064675e-19, +-5.99443083949444186e-19, + 1.07192596718636486e-18, + 2.04543687553105787e-19, + 1.48245676790064112e-18, +-9.90722488424169418e-19, +-1.92203719110059480e-16, +-1.76709099601887446e-16, +-8.97636326775458448e-17, +-1.51768879047798767e-17, + 1.81646330243295740e-17, + 4.01326674971512002e-17, +-2.27609802264900870e-17, +-1.50624016163902697e-16, +-9.89055089272636609e-17, + 5.04569394561095979e-16, + 4.73078560772102887e-16, +-1.12716788953214762e-15, +-2.61866556528887950e-16, + 8.64878235813839975e-16, + 5.99414672846672156e-17, +-2.26197037604416537e-16, +-6.78376791906908661e-17, + 1.36958689456388163e-17, + 1.71183430023154499e-17, + 6.26596373896293768e-18, + 3.35438642790132695e-18, + 2.77122279799719716e-18, +-1.78833052444987082e-19, + 1.02617007547636732e-18, + 7.63507945455546285e-19, + 1.18936872094534242e-19, + 4.25391041863843702e-19, + 4.85789608035808167e-19, + 5.28668170558634912e-19, + 6.01843535005279440e-19, + 9.69694783983707743e-19, + 2.32272615583437504e-18, + 9.91442951743410684e-19, + 1.87749219057299310e-18, + 5.69471548726665732e-19, +-1.10515819548996285e-18, + 1.65218615317804104e-18, + 1.46077571936835122e-18, + 1.95711413261563661e-18, +-1.82313608538498603e-19, +-4.38241972352591186e-19, + 3.25062888979943755e-18, + 4.95420708321744191e-19, + 2.06281947025518493e-18, + 7.73209075600464603e-18, + 6.11258239597397959e-18, +-1.95412021126843101e-18, +-6.27508053614050192e-19, + 1.14072049864369445e-17, + 2.26693203156308281e-17, +-2.52097015977218433e-17, +-2.27365008916015940e-17, + 5.33862717146747658e-17, +-6.54483654739501810e-18, +-1.77101985603327614e-17, + 3.79888087246904510e-18, + 3.46998613554269850e-18, + 2.40031601615259758e-19, + 1.07685221335039251e-18, +-1.59420715642530564e-18, + 7.06222317783395368e-19, + 2.36189589600011942e-18, + 1.86476901081261676e-18, + 3.75817023215909687e-19, +-1.30121774603356448e-18, + 4.76197107709822151e-19, +-9.22225026489770392e-19, + 6.51875559703957019e-19, + 7.82018595011939964e-19, +-4.89112678723048567e-19, +-3.82548322619860492e-20, + 1.42387939478441546e-18, +-4.27561543999302625e-19, + 1.69131536480870983e-18, + 1.99788413186010124e-19, + 2.16162244156135619e-19, + 1.10359070674350631e-18, + 3.61931865392326407e-19, + 1.23760162399931823e-18, +-4.47829213288874529e-19, + 9.68797249737748039e-19, +-4.20975680426683219e-18, + 1.53069653182017741e-18, + 3.77697190297115001e-18, + 1.68070236802268037e-18, + 5.01474317894692546e-18, +-4.16296990087909274e-18, +-1.34672518452216069e-18, + 2.70288701442902850e-18, +-3.41068292755705774e-18, +-2.60648890753637294e-18, +-3.95847764899863739e-19, +-2.78281575467810256e-19, + 4.36746308856328812e-21, + 3.86718135061567633e-18, + 2.26087842426853356e-18, + 2.84440671006771021e-18, + 1.24275247362370486e-18, + 1.88472196501961495e-18, +-5.19874884366719995e-19, + 3.35893000452934262e-18, + 1.32134122023144718e-18, + 1.44397895254767484e-18, + 1.96895930531229657e-18, + 1.81845441707413146e-18, + 9.00751124854647980e-19, + 6.65168223912645492e-19, + 2.74539044592961895e-19, + 1.06072430557156798e-18, + 7.86746788536863560e-19, + 6.31553791842227347e-19, + 1.15410004051951269e-18, + 3.86527269201844148e-19, + 1.33114061336492083e-18, + 6.70137919206926675e-19, + 4.49563065758982121e-19, + 1.88192115261043547e-18, + 7.56655065230205866e-19, + 1.67971822952441489e-18, +-6.56874826883118322e-19, + 3.20516898468812144e-18, +-6.11575793548971766e-18, +-2.17660723433390725e-18, + 2.74271999960142688e-19, + 4.46942049257984961e-19, + 1.19423940209466906e-18, +-1.32716010974227316e-18, +-3.71474879533577811e-18, + 1.90237327816637679e-18, + 6.97125706790467162e-19, + 1.24011234458060943e-18, + 1.82236696462609107e-18, + 1.08174378348194995e-19, +-1.00170492828446092e-19, +-1.74073067385613243e-19, + 1.23046337543845518e-18, +-9.47743992391888647e-19, +-7.04155779603726874e-19, + 9.13488090560840643e-19, +-9.39297862271962485e-19, +-8.24703743308156911e-19, + 1.89062717784201426e-19, +-2.15953951450301926e-19, + 1.07301200473478093e-19, +-6.96138753515910831e-19, +-3.94421575857650760e-19, + 1.31740531311812916e-18, + 7.03815599000309503e-19, + 1.08696632642736861e-18, +-2.93119836312761610e-19, + 5.57314884565863665e-19, + 1.38390649391005324e-18, + 4.71828397408419351e-19, + 9.88589817870398398e-19, + 3.33311354459712043e-20, + 6.49991703619774811e-19, + 8.03994855591025288e-19, + 2.61241181066961878e-19, + 5.28345101534576000e-19, + 1.85040690080324155e-19, +-5.56095097129105436e-18, +-8.70638736956396099e-18, +-8.10622345129583801e-18, +-3.16011526096132369e-18, +-1.00334745446326830e-18, +-3.09488854651230885e-18, +-2.78393260194187031e-18, +-3.20558095986083828e-18, + 3.11282304535983086e-19, + 1.72786694461683223e-18, +-1.84584500179920705e-18, + 1.00759986139093586e-18, +-9.99870436098211055e-20, +-2.14153173905902544e-18, +-1.97895834562121879e-18, +-5.12419656308949778e-19, + 7.59993515135262124e-20, +-3.94878081848057597e-19, +-5.68867749565065567e-19, +-2.29535994112901510e-18, +-1.71343377024319981e-18, +-5.23258336274765145e-19, + 1.48684548500426311e-19, + 5.14843340174379540e-19, +-1.52996631716243597e-18, +-7.53842876208277555e-19, +-1.73579019239444407e-18, +-1.49692860578849289e-18, +-1.52663790179642438e-18, +-1.15319707537410592e-18, +-1.58520404330812822e-18, +-1.78102288108967666e-18, +-1.10311282313209408e-18, +-7.06029132872503726e-19, +-1.10515809497749231e-18, +-1.80896004705290912e-18, +-1.31726748681495224e-18, +-9.12636282279085342e-19, +-7.65918314402847501e-19, +-9.56282312077333618e-19, + 1.33070685382079917e-01, + 8.45587429858136869e-02, + 5.87298777084785117e-02, + 4.38090775812982752e-02, + 3.45943843603832707e-02, + 2.85851749965389083e-02, + 2.44887592394246456e-02, + 2.15939028617584614e-02, + 1.94878150282387537e-02, + 1.79192543425670710e-02, + 1.67274265601451214e-02, + 1.58025688637944452e-02, + 1.50646475172783404e-02, + 1.44544335535511451e-02, + 1.39308763202218924e-02, + 1.34683650904943511e-02, + 1.30520071327169824e-02, + 1.26729571640338840e-02, + 1.23253903009994167e-02, + 1.20050094463432372e-02, + 1.17084017494177815e-02, + 1.14327545447762430e-02, + 1.11757071934454159e-02, + 1.09352569036952618e-02, + 1.07096907445943211e-02, + 1.04975335995315024e-02, + 1.02975072784506991e-02, + 1.01084979427742833e-02, + 9.92952989073377090e-03, + 9.75974428044918546e-03, + 9.59838172687185569e-03, + 9.44476796545327783e-03, + 9.29830196357338441e-03, + 9.15844600061025728e-03, + 9.02471734259739124e-03, + 8.89668121710361463e-03, + 8.77394485494750395e-03, + 8.65615241240272337e-03, + 8.54298062412813843e-03, + 8.43413506570345368e-03, +-3.29407890236906170e-02, +-1.69087989571356442e-02, +-9.47002794392412008e-03, +-5.69874452901663036e-03, +-3.63708574603271691e-03, +-2.43554587697371880e-03, +-1.69611695461865226e-03, +-1.21935727922859436e-03, +-8.99351253876244303e-04, +-6.77320368068657719e-04, +-5.20078958663590125e-04, +-4.08891541386078097e-04, +-3.32105380608511633e-04, +-2.80229166288725577e-04, +-2.44625066629486430e-04, +-2.18627032542740603e-04, +-1.98170831418336584e-04, +-1.81172962297214575e-04, +-1.66613736797422904e-04, +-1.53943098851552323e-04, +-1.42810126572162334e-04, +-1.32959391550013724e-04, +-1.24191803730524277e-04, +-1.16347340200140630e-04, +-1.09295363524700267e-04, +-1.02928127087915144e-04, +-9.71560237095075047e-05, +-9.19039813737732654e-05, +-8.71086805687126391e-05, +-8.27163809239468711e-05, +-7.86812075539326735e-05, +-7.49637883247099610e-05, +-7.15301616365098013e-05, +-6.83508945923107735e-05, +-6.54003661371142428e-05, +-6.26561805531446241e-05, +-6.00986847038349504e-05, +-5.77105684113740956e-05, +-5.54765318753409794e-05, +-5.33830074816021234e-05, + 2.92317659563202546e-03, + 1.30252482933842714e-03, + 6.37404921463697932e-04, + 3.37938215572518687e-04, + 1.91811835394729803e-04, + 1.15375201784476849e-04, + 7.29258076674726399e-05, + 4.81088821783160888e-05, + 3.29239964765341709e-05, + 2.31678959762302171e-05, + 1.64692477804855294e-05, + 1.15292145812168285e-05, + 7.83810954681345241e-06, + 5.29190916115209386e-06, + 3.73205212930239300e-06, + 2.83984293088505921e-06, + 2.31013693962787543e-06, + 1.95673635064019404e-06, + 1.69260065906602226e-06, + 1.48127386823144347e-06, + 1.30655654385566477e-06, + 1.15972465857249704e-06, + 1.03507065333648299e-06, + 9.28413731539161480e-07, + 8.36535022709076737e-07, + 7.56900281519331327e-07, + 6.87488441910703229e-07, + 6.26672009083888099e-07, + 5.73129366465975245e-07, + 5.25779046153968270e-07, + 4.83729804554307607e-07, + 4.46242306773903833e-07, + 4.12699448567496238e-07, + 3.82583172941028029e-07, + 3.55456216232513369e-07, + 3.30947628619232919e-07, + 3.08741208290042225e-07, + 2.88566202209174663e-07, + 2.70189782906227278e-07, + 2.53410926416968500e-07, +-2.08356436128612183e-04, +-8.20251855117633960e-05, +-3.55883355042534266e-05, +-1.68069952879204137e-05, +-8.54299026933136474e-06, +-4.62732302019182565e-06, +-2.64718026588817050e-06, +-1.58749620271725631e-06, +-9.95558314198985643e-07, +-6.60411678466800355e-07, +-4.72697041694446795e-07, +-3.56742461297781934e-07, +-2.59015661412836218e-07, +-1.67308298742985088e-07, +-9.71545789728999156e-08, +-5.56636347346898595e-08, +-3.49912519909844590e-08, +-2.49673481165622383e-08, +-1.94896828483156619e-08, +-1.59268296719641074e-08, +-1.33011544843284552e-08, +-1.12434275899967005e-08, +-9.58599710916283649e-09, +-8.23171361147075200e-09, +-7.11417418062182854e-09, +-6.18443682199332588e-09, +-5.40527514139486602e-09, +-4.74791592036580646e-09, +-4.18987130696356222e-09, +-3.71340112530199244e-09, +-3.30439198288351122e-09, +-2.95152780347975627e-09, +-2.64566910503055488e-09, +-2.37938386796819066e-09, +-2.14658980754154261e-09, +-1.94227925516052487e-09, +-1.76230591001732082e-09, +-1.60321830977287904e-09, +-1.46212886395103780e-09, +-1.33661017867451108e-09, + 1.27772845238349732e-05, + 4.50369685141996177e-06, + 1.75370377477953582e-06, + 7.45859075297289522e-07, + 3.42843004553073402e-07, + 1.68741107123988927e-07, + 8.82062429125363015e-08, + 4.85016628211519660e-08, + 2.74740640594109064e-08, + 1.54447392661276073e-08, + 8.76790889812308938e-09, + 6.29843599093308097e-09, + 6.02249519446944887e-09, + 5.23499481983499143e-09, + 3.46095131622495180e-09, + 1.82181573571229261e-09, + 8.70058350625883092e-10, + 4.42456329823585773e-10, + 2.66545479749120154e-10, + 1.87590657003209338e-10, + 1.43956468597168196e-10, + 1.14828765089886936e-10, + 9.32906212443641052e-11, + 7.66489274940466967e-11, + 6.35287867653632692e-11, + 5.30583849384291152e-11, + 4.46231126782220280e-11, + 3.77706866201744033e-11, + 3.21616079217109864e-11, + 2.75378170047510372e-11, + 2.37011449090942512e-11, + 2.04980293393951520e-11, + 1.78084555143664548e-11, + 1.55378976148941980e-11, + 1.36113475970910509e-11, + 1.19688709747609353e-11, + 1.05622670326162650e-11, + 9.35252763872398435e-12, + 8.30790504967029649e-12, + 7.40241295948429482e-12, +-6.98257632197624003e-07, +-2.22566498776295362e-07, +-7.84963424404227087e-08, +-3.03156878832877187e-08, +-1.26931763139169530e-08, +-5.70834861431709269e-09, +-2.73700038933893405e-09, +-1.40048363524990147e-09, +-7.76482267935546585e-10, +-4.53594404782077675e-10, +-2.19870754824108226e-10, +-4.35138368441124936e-11, +-9.89685824299851075e-12, +-7.15352908993926668e-11, +-9.44056914552918034e-11, +-6.52453393263320948e-11, +-3.18815570558479824e-11, +-1.32350382075033257e-11, +-5.56562195180877680e-12, +-2.78397496333991138e-12, +-1.72802549962124446e-12, +-1.23416789954560842e-12, +-9.39592818866665232e-13, +-7.35213389408269414e-13, +-5.83716910006804322e-13, +-4.68246533381827672e-13, +-3.78915176551031914e-13, +-3.09058905803978269e-13, +-2.53926783982445720e-13, +-2.10048856518157672e-13, +-1.74856390636427715e-13, +-1.46422602751790546e-13, +-1.23296373828155498e-13, +-1.04364781362474455e-13, +-8.87740471012031615e-14, +-7.58629411201443224e-14, +-6.51124695132733484e-14, +-5.61179488018802674e-14, +-4.85546211328108170e-14, +-4.21675377902701834e-14, + 3.47464590759027709e-08, + 1.00951842020448943e-08, + 3.24841231297444729e-09, + 1.14684206880986294e-09, + 4.40163474119203897e-10, + 1.82028989347235527e-10, + 8.02055319738885376e-11, + 3.68986923931945439e-11, + 1.77106563970175457e-11, + 1.06621406761901554e-11, + 9.03009803519783089e-12, + 4.81439693303284706e-12, +-1.62853165485913930e-12, +-2.37653350451901711e-12, + 4.63456891779708237e-13, + 1.57179502747090116e-12, + 1.09709572894840206e-12, + 4.97602019923241067e-13, + 1.85250068736861725e-13, + 6.69729526392979920e-14, + 2.81059417578765172e-14, + 1.51864021999040434e-14, + 1.00022805851704022e-14, + 7.25581926620080384e-15, + 5.47647313712029388e-15, + 4.21177812086109800e-15, + 3.27824813420877440e-15, + 2.57624828316744842e-15, + 2.04219271502486693e-15, + 1.63231452946104102e-15, + 1.31375565391627242e-15, + 1.06619064443339805e-15, + 8.69539088941484143e-16, + 7.13830518413376989e-16, + 5.89328541349235270e-16, + 4.89489584812326902e-16, + 4.09278083707599383e-16, + 3.42323007060791692e-16, + 2.88517009150338477e-16, + 2.44403908108323652e-16, +-1.59742422997803678e-09, +-4.25854110286222524e-10, +-1.25781459638766446e-10, +-4.08152823457990145e-11, +-1.44263394914578001e-11, +-5.51284449832448462e-12, +-2.27164228487074898e-12, +-1.00380726913729277e-12, +-4.27991213980404516e-13, +-1.09265159197394334e-13, +-6.30611605844767044e-14, +-2.38173616998263504e-13, +-1.56856355821947152e-13, + 8.15106085900034367e-14, + 8.42297780254603028e-14, + 3.93731847840925028e-16, +-2.46940563904169763e-14, +-1.63068630505646670e-14, +-6.81979527714251877e-15, +-2.32100490998060068e-15, +-7.46819831826099504e-16, +-2.69293419691704194e-16, +-1.26846475718960580e-16, +-7.65908564386777637e-17, +-5.24970950208098196e-17, +-3.83239043210736833e-17, +-2.83306874482707440e-17, +-2.12732871523364249e-17, +-1.65114276736284249e-17, +-1.25426366357648289e-17, +-1.00979239806140836e-17, +-6.97709800546944137e-18, +-6.08922196353766102e-18, +-4.78508509988877302e-18, +-4.07564008256355266e-18, +-3.33676693933885797e-18, +-2.26360576751243931e-18, +-1.98390284983141962e-18, +-1.99652912603790903e-18, +-1.61035087601830004e-18, + 6.85547229963608232e-11, + 1.68654411204049599e-11, + 4.59652601131013434e-12, + 1.37751261921561802e-12, + 4.50328958478765019e-13, + 1.59116343360907162e-13, + 6.01744539600480609e-14, + 2.50084177801323738e-14, + 1.31119574488870765e-14, + 6.49216653300093237e-15, +-3.81105809440230493e-15, +-3.70984990780640673e-15, + 7.98344125587362952e-15, + 4.20032846193633683e-15, +-2.68177866060905171e-15, +-1.80633561480535023e-15, +-5.72756077909949236e-18, + 3.60306249817419737e-16, + 2.13666249532158338e-16, + 8.21119458599481807e-17, + 2.59767278267575263e-17, + 7.53904772098085556e-18, + 2.18638007831088103e-18, + 9.25624664008416630e-19, + 6.76384511986416046e-19, + 6.07163176772398894e-19, + 5.50045796153902669e-19, + 6.12521568338653634e-19, + 5.45712188752520772e-19, + 9.71512741466655544e-20, +-3.08269985288854308e-19, + 6.18311591198680243e-19, +-8.97553653405119722e-20, + 3.52458383116374299e-20, +-1.07055129592710013e-19, + 6.40588891240345635e-20, +-1.58746921218829128e-19, +-7.00870697660889401e-19, +-2.05613550230352593e-19, +-2.24368278328895847e-19, +-2.76764234425374012e-12, +-6.31517186289120585e-13, +-1.59552339297799158e-13, +-4.43417243715374968e-14, +-1.34642358423145459e-14, +-4.43799937358259923e-15, +-1.56568992450591691e-15, +-5.49570868101894082e-16, +-1.88190491695728270e-16, +-2.35366824955070818e-16, +-2.54033177026542081e-16, + 2.91438518956595797e-16, + 1.65806051856421090e-16, +-2.70614759121518781e-16, +-6.27773154789075177e-17, + 6.55830682879611725e-17, + 2.80330140898802242e-17, +-1.16544781575401699e-18, +-4.29484055976892849e-18, +-1.92907170022117313e-18, +-4.89821600443650688e-19, + 8.82461275981374480e-20, +-2.20033720556672790e-19, +-1.64517229160958687e-19, + 1.18989365862293298e-19, + 5.71649518044307193e-19, + 8.05892339640389358e-19, + 5.09628117363036912e-19, + 2.09061479800439507e-19, + 3.82633365292038856e-19, + 1.49103513405862805e-19, + 8.13840514745079818e-19, + 1.03188817762538950e-19, +-2.63619909176323471e-20, +-8.68338694773428433e-20, +-2.29671250127684624e-19, + 1.48013722263666082e-19, +-1.65373890981986151e-19, + 1.36685962987596109e-19, +-3.73161138414148501e-19, + 1.05751153420427627e-13, + 2.24818089020332118e-14, + 5.28940204621306134e-15, + 1.36840885173536905e-15, + 3.87543560700024747e-16, + 1.19757065119309279e-16, + 4.02292971556877044e-17, + 1.56383306975576620e-17, + 4.20722521340574471e-18, +-3.47099111710594534e-18, + 7.28174819782877520e-18, + 1.15183994348005473e-17, +-1.52308086159004522e-17, +-1.66213156143033860e-18, + 6.42262893503831876e-18, + 1.04025291551760712e-19, +-1.09472871953257971e-18, +-5.12604259348742263e-19, + 1.19731917678992818e-19, +-4.43286404702609250e-20, + 1.90326128604111622e-19, + 3.06150344534222717e-19, +-1.80277253696067780e-19, +-1.91307037385848478e-19, +-1.91071291650157042e-19, + 3.03238871096973925e-19, +-3.65185283180043251e-20, + 1.87312278598241665e-19, + 2.03112585948559492e-19, +-2.07790891978372868e-20, +-2.17617969729823785e-19, + 9.40263817159137270e-19, + 2.48290884684497930e-19, + 4.19722323374805712e-19, +-1.46162900757449993e-19, +-1.14157105897295583e-19, + 4.43541274821604850e-19, +-1.50511155430966496e-19, + 2.55848639486262561e-19, +-1.70665080619867286e-19, +-3.83922092346306932e-15, +-7.64522430157338212e-16, +-1.66426241865333777e-16, +-4.13916537780011884e-17, +-1.02668908807353355e-17, +-2.87352832294257465e-18, +-1.00473277479484863e-18, +-1.07996133447939849e-18, +-7.59921528043919185e-19, +-3.20980122313363350e-19, + 3.32619185968417875e-19, +-9.47482939070421298e-19, +-2.07501194636775957e-19, + 4.71255529593945555e-19, +-7.01451518862237301e-20, + 1.83498800343607616e-19, + 5.88278621443926375e-19, +-8.89452342878428781e-20, + 5.06997436372261299e-19, + 6.03601268189792364e-20, + 4.16783789821853106e-19, + 1.59030570774574380e-19, + 1.65894641938446100e-19, +-1.76997245426754880e-19, + 3.16197223759560222e-19, + 1.35446229445251689e-20, + 2.72447030324149092e-19, + 5.38338073232899490e-19, + 1.19175040669818564e-19, + 2.00587688074192981e-19, + 1.81987314747902634e-19, + 3.01053941328084893e-19, + 5.76051994108843161e-20, + 7.71855458216022782e-20, + 1.38972678236032074e-19, +-1.42692375819935241e-19, + 5.52404523807471660e-19, +-1.02963323910697060e-19, +-3.44449781866786803e-20, +-5.04208903427267787e-20, + 1.31931881604726529e-16, + 2.37334651718622516e-17, + 6.12537983515670699e-19, + 1.50487073866219314e-18, +-2.50231507081490231e-18, + 3.58856744418860469e-19, + 9.19232977220124562e-21, +-2.58864570455022475e-19, + 1.13954382052920302e-19, + 1.94547865737469609e-19, +-3.70978465524645320e-19, + 2.62881323437491101e-19, + 5.56297950665827760e-19, +-2.20476707580954430e-19, +-3.35793709135000597e-19, + 2.99349881624842371e-20, +-2.90505637052379471e-20, +-7.75428275071172902e-20, + 1.06506216148506235e-19, + 5.62453614743044251e-20, +-5.14532186362718925e-21, +-9.02012677256001076e-20, +-1.47965870850571732e-19, +-4.29275727954345490e-20, + 9.82248765035649248e-20, + 3.71302298955732111e-19, +-1.02388752247500345e-19, + 4.23997522850220944e-19, +-8.19186198644356350e-20, + 3.90814683971482445e-19, + 2.99792755250939141e-19, + 1.39977266559243533e-19, + 3.05926171413024213e-20, + 1.10070910681967172e-19, +-1.04092380146266106e-19, +-1.02764215744371890e-19, + 3.15137676836046231e-20, + 3.45866572183666353e-20, + 3.13340524629733313e-20, + 5.00446842133490553e-20, +-2.65782938450212582e-17, +-1.31348713504440335e-17, +-4.80101388222182522e-18, +-2.10852601561757393e-18, +-8.39636523324941447e-19, +-1.01598589717401048e-18, +-3.29363977169187992e-19, +-3.39326480832509697e-19, +-3.80973477779219718e-19, + 3.29556436480821367e-19, +-4.81141876901491874e-19, +-2.86272579705289794e-19, + 3.32440699001432081e-19, +-2.46691898144776511e-19, +-4.44319554762376151e-19, +-5.62129025386152453e-20, +-5.13371720579707005e-19, + 1.05980261669362865e-19, +-3.45582958231905456e-19, +-2.91104785059157363e-19, +-1.95500108094722310e-19, +-2.12912088788728686e-19, +-3.04024672696140259e-19, + 3.47792452134277121e-19, +-9.06452326256525692e-20, +-2.21957897257834143e-19, +-5.14808352581294721e-19, +-2.65743322100908686e-19, +-1.57946418469568105e-19, + 6.97533956629049876e-20, +-7.07336761550960952e-19, +-4.24582157544672349e-19, +-1.04558193839002199e-19, +-3.20048152056259698e-20, +-1.76447744822039121e-19, + 1.79335872466143594e-19, + 1.40308493761898781e-19, +-3.71160439496451965e-19, +-2.72226075593536051e-19, +-7.34376142134111003e-20, +// root 6 + 7.41426993252308347e-02, + 6.49389121228780286e-02, + 5.72653294518849568e-02, + 5.08222978020907365e-02, + 4.53733719456142215e-02, + 4.07322408062917446e-02, + 3.67516961639183862e-02, + 3.33147596869988530e-02, + 3.03278583797445545e-02, + 2.77161452234766861e-02, + 2.54210582016278046e-02, + 2.33990794237530636e-02, + 2.16190011782035098e-02, + 2.00561450023278541e-02, + 1.86864414590765492e-02, + 1.74844740832107194e-02, + 1.64252027893090000e-02, + 1.54861876482948763e-02, + 1.46485505584682974e-02, + 1.38968532888685513e-02, + 1.32185477853432251e-02, + 1.26033914911187778e-02, + 1.20429576899970785e-02, + 1.15302541717141448e-02, + 1.10594312893211536e-02, + 1.06255578875400561e-02, + 1.02244478445256068e-02, + 9.85252447140280187e-03, + 9.50671348703035872e-03, + 9.18435778390943973e-03, + 8.88314897883028462e-03, + 8.60107201422228608e-03, + 8.33635999631437974e-03, + 8.08745712893596189e-03, + 7.85298809882208244e-03, + 7.63173263917070379e-03, + 7.42260427753468552e-03, + 7.22463248635772225e-03, + 7.03694761703084655e-03, + 6.85876812383931847e-03, +-5.03716298924721407e-03, +-4.18616349334953453e-03, +-3.50292412895171794e-03, +-2.95232942733540020e-03, +-2.50622258083968126e-03, +-2.14251349802257324e-03, +-1.84407565451708867e-03, +-1.59770112122890602e-03, +-1.39308220886460066e-03, +-1.22167608850076346e-03, +-1.07566130541357865e-03, +-9.47897952563407338e-04, +-8.33417371537911039e-04, +-7.30679729072560491e-04, +-6.40364658525601816e-04, +-5.62924460908772106e-04, +-4.97521708541838275e-04, +-4.42474925466039516e-04, +-3.95961947968609710e-04, +-3.56384640423071191e-04, +-3.22450887394261376e-04, +-2.93141643729312115e-04, +-2.67654308047855706e-04, +-2.45352323685652722e-04, +-2.25726184581574594e-04, +-2.08364301463680190e-04, +-1.92931282603950847e-04, +-1.79151615711368019e-04, +-1.66797282637592227e-04, +-1.55678262456669241e-04, +-1.45635178433145372e-04, +-1.36533553145517335e-04, +-1.28259282006742183e-04, +-1.20715038556302260e-04, +-1.13817398584890934e-04, +-1.07494523377275761e-04, +-1.01684281201543575e-04, +-9.63327147957310399e-05, +-9.13927838878117802e-05, +-8.68233277495261598e-05, + 1.18487822856321308e-04, + 9.50323835499490788e-05, + 7.64172533984910300e-05, + 6.17426693508715834e-05, + 5.01843974731860235e-05, + 4.10529565455350402e-05, + 3.37952632619679141e-05, + 2.79839235020351821e-05, + 2.33240756094345414e-05, + 1.96696225637243727e-05, + 1.69678927059883671e-05, + 1.50671365797267152e-05, + 1.35780409438497132e-05, + 1.20878709197162832e-05, + 1.04805985195181634e-05, + 8.89613511819461509e-06, + 7.48679439862738063e-06, + 6.30881216403691129e-06, + 5.34867508844005604e-06, + 4.56911332837048297e-06, + 3.93277854622914503e-06, + 3.40905941351467982e-06, + 2.97429945231067154e-06, + 2.61042578715419142e-06, + 2.30356816551636599e-06, + 2.04298363286054406e-06, + 1.82026845416903271e-06, + 1.62878567296198663e-06, + 1.46324665889988513e-06, + 1.31940207315471800e-06, + 1.19381118383649535e-06, + 1.08366789068310781e-06, + 9.86668247782359997e-07, + 9.00908672611035736e-07, + 8.24807070736092858e-07, + 7.57041231817141128e-07, + 6.96500355998229957e-07, + 6.42246644202441059e-07, + 5.93484661343344763e-07, + 5.49536746643458833e-07, +-2.17997426121408462e-06, +-1.74005385961032376e-06, +-1.37442292571398945e-06, +-1.08214099483382668e-06, +-8.53209164582104268e-07, +-6.75877646352706609e-07, +-5.39311899049878312e-07, +-4.33124548227643953e-07, +-3.45367901605366438e-07, +-2.64089742086528540e-07, +-1.87883321253478039e-07, +-1.34336664384750045e-07, +-1.19810633074362563e-07, +-1.29938196517668029e-07, +-1.35692515345878000e-07, +-1.26268637128968877e-07, +-1.07954407921595851e-07, +-8.86213495641548649e-08, +-7.19169339923328234e-08, +-5.85035345042293922e-08, +-4.79502569185094302e-08, +-3.96421533758288407e-08, +-3.30512188774183411e-08, +-2.77735192400463810e-08, +-2.35082268389355211e-08, +-2.00311737761198698e-08, +-1.71738720336437262e-08, +-1.48083663412721224e-08, +-1.28364847985701908e-08, +-1.11821766432779942e-08, +-9.78599510099740364e-09, +-8.60108061571413334e-09, +-7.59020490315206398e-09, +-6.72357351692032938e-09, +-5.97717670986338560e-09, +-5.33154070211932378e-09, +-4.77077420591267477e-09, +-4.28183460688059019e-09, +-3.85395901344688656e-09, +-3.47822000906964665e-09, + 2.95331243884999532e-08, + 2.52490613331126864e-08, + 2.04795436138423536e-08, + 1.61629900062570165e-08, + 1.25738918470823951e-08, + 9.70057291984566248e-09, + 7.47142385477475101e-09, + 5.92207080622990773e-09, + 5.17948985958563056e-09, + 5.00942410065116146e-09, + 4.31706647976193483e-09, + 2.16701392373391565e-09, +-1.82829870738952901e-10, +-7.46422459004622231e-10, + 1.27537465799220548e-10, + 9.67343552029446466e-10, + 1.23834328879275167e-09, + 1.14405124785490207e-09, + 9.39452201544540359e-10, + 7.42395861343970390e-10, + 5.83149351500704772e-10, + 4.60673412748551514e-10, + 3.67215497383433038e-10, + 2.95484557222006860e-10, + 2.39902803471141361e-10, + 1.96402597476863065e-10, + 1.62032029689400792e-10, + 1.34632632255177980e-10, + 1.12609408577997487e-10, + 9.47710159401256731e-11, + 8.02184644672867234e-11, + 6.82668445100985680e-11, + 5.83896470477935535e-11, + 5.01787166873456688e-11, + 4.33151496070330937e-11, + 3.75479241403568780e-11, + 3.26780689816895305e-11, + 2.85468330016554614e-11, + 2.50267635709800799e-11, + 2.20149335344945606e-11, +-1.72336077246848427e-10, +-2.38453172614342165e-10, +-2.31425119826702349e-10, +-1.98294941867389084e-10, +-1.60882670267162866e-10, +-1.27184433939752876e-10, +-9.54741928082045310e-11, +-5.80349823168437004e-11, +-1.74630894649773055e-11, +-9.18748774514587634e-12, +-7.02564666812058401e-11, +-1.33095479681647508e-10, +-8.18811115270615412e-11, + 2.07524079278605320e-11, + 5.25689300181599315e-11, + 2.76405226887046862e-11, + 1.76682233430802964e-12, +-9.02760815736313922e-12, +-1.05415153833366847e-11, +-8.96618060329424801e-12, +-6.98492238746209091e-12, +-5.33030880472784596e-12, +-4.07532177859560737e-12, +-3.14281163815430406e-12, +-2.44806532421685566e-12, +-1.92567069384665614e-12, +-1.52873426701005520e-12, +-1.22403212934097418e-12, +-9.87876857572040838e-13, +-8.03200357721719861e-13, +-6.57572182788797309e-13, +-5.41834572265219968e-13, +-4.49176926030358469e-13, +-3.74488256012760123e-13, +-3.13894237062572575e-13, +-2.64434590031201894e-13, +-2.23832724078581255e-13, +-1.90320320087079600e-13, +-1.62517924974167556e-13, +-1.39339545645985235e-13, +-5.32959984031589864e-12, +-7.78706690561602270e-13, + 1.05633209212827121e-12, + 1.56377215899759647e-12, + 1.50159569522678146e-12, + 1.31923399737304069e-12, + 1.38698547164397371e-12, + 1.73731959942193432e-12, + 1.38990498638037188e-12, +-1.05710300862739981e-12, +-3.55708781979182418e-12, +-6.26564237927463182e-13, + 4.32722133862153027e-12, + 3.19904576598025031e-12, +-3.22737342056710928e-13, +-1.31919782259517596e-12, +-7.53617843922893411e-13, +-2.00375706333688015e-13, + 3.09397967749942679e-14, + 8.35542687457771434e-14, + 7.74349686900943773e-14, + 6.02556805374047471e-14, + 4.49297395914621272e-14, + 3.33685432678073448e-14, + 2.49709835332957831e-14, + 1.88786860069470316e-14, + 1.44233479175409848e-14, + 1.11291219554629936e-14, + 8.66654090660543888e-15, + 6.80788056176901150e-15, + 5.38989234303502329e-15, + 4.30013662095528010e-15, + 3.45567136467282956e-15, + 2.79466984991164890e-15, + 2.27423520282037074e-15, + 1.86256416060847058e-15, + 1.53325319602525238e-15, + 1.26898026756686909e-15, + 1.05552391762524402e-15, + 8.82438559801084937e-16, + 2.34362165705525569e-13, + 1.03394172703994070e-13, + 3.57372504613902448e-14, + 4.75058995183462596e-15, +-6.73445055747045470e-15, +-3.98225378346163415e-15, + 9.55190685091947262e-15, + 9.68104024577736955e-15, +-4.54392806261354637e-14, +-1.19406101371170120e-13, +-1.56613078366064380e-14, + 2.03330020901452384e-13, + 8.53585370218880314e-14, +-1.31275832424042060e-13, +-8.76109047614506203e-14, + 5.67813121169089299e-15, + 2.49082747851556788e-14, + 1.35168358318755189e-14, + 4.09018266502299850e-15, + 3.72760802696005824e-16, +-5.55319564919418646e-16, +-6.08196792299872485e-16, +-4.79284830195039733e-16, +-3.51581085246421202e-16, +-2.53702318823617227e-16, +-1.85294918525954186e-16, +-1.35558004037771693e-16, +-1.00579050757821704e-16, +-7.59318331102093866e-17, +-5.70968930962266911e-17, +-4.40321210242643190e-17, +-3.40662665968843439e-17, +-2.60067025807030236e-17, +-2.04186113603026344e-17, +-1.64316752784495154e-17, +-1.26246365783077227e-17, +-1.01359540321107033e-17, +-8.41780440563203669e-18, +-6.57848779196786113e-18, +-4.85070921214902977e-18, +-5.34791646259130255e-15, +-2.95054729707389036e-15, +-1.41818055822557276e-15, +-6.05413238290326431e-16, +-1.34153082588437848e-16, + 3.01964516812100279e-16, + 4.23858704931631284e-16, +-6.79048760362051545e-16, +-2.67551411969417244e-15, +-6.93929203500660752e-16, + 7.18863040621005598e-15, + 3.09287783041446976e-15, +-8.63593307254061818e-15, +-2.55137355886035556e-15, + 3.56723507214030986e-15, + 1.69644957506413465e-15, +-1.60162219849387785e-16, +-3.91454287617914834e-16, +-1.91012387951738250e-16, +-5.71888362201051653e-17, +-8.66413530598412427e-18, + 3.42892996586068144e-18, + 4.51747093049120107e-18, + 3.22992508504961001e-18, + 3.38293523626166075e-18, + 1.43920975934398777e-18, + 1.70367896388183386e-18, + 7.32359449498531625e-19, + 8.13246199455586571e-19, + 6.91794368520642904e-19, +-5.25427331039390145e-20, +-2.19975059482503737e-19, + 1.84556259470904675e-19, + 3.80788228023797573e-19, +-6.42853632973103105e-22, + 2.51330303434621507e-19, +-1.14116567368155486e-19, +-1.47077727138546827e-19, +-5.09314246710083866e-20, + 2.81602082956068375e-19, + 7.25075723290012836e-17, + 5.65279136552134289e-17, + 3.27755605877752232e-17, + 1.55605860837406059e-17, + 1.19009997499517175e-17, + 1.16525440165263065e-17, +-8.24447545125980059e-18, +-5.37435245445251047e-17, +-3.55800393596784130e-17, + 1.67676094264750115e-16, + 1.58326799115970284e-16, +-3.79958270326764214e-16, +-9.11548376577657999e-17, + 2.90589604662729202e-16, + 2.36096182983041783e-17, +-7.68177324341897946e-17, +-2.29213140691548449e-17, + 3.71195472270323186e-18, + 5.89071511755159720e-18, + 3.22272380674795968e-18, + 1.46019439107688971e-18, + 8.05684495978032382e-19, + 3.93286527123663304e-19, +-1.23737888800026941e-20, + 2.34475974085815409e-19, +-1.31829516627306550e-19, + 8.09699260824384179e-19, + 3.96244323036765320e-19, + 2.77568501481369210e-19, + 6.46215671702833618e-19, + 1.10835934343325349e-19, +-2.20908837983215587e-19, + 5.59181233660217550e-19, + 6.29690235740138563e-19, +-6.79935145330721892e-20, + 3.45409997544303146e-19, + 2.25989077664158238e-19, + 1.40749059316896392e-19, + 1.68748142442638067e-19, + 4.42917696558882377e-19, + 3.90317816429290231e-18, + 1.77646626563112289e-18, + 1.12617265979954468e-18, +-1.69181928342736371e-20, +-8.77771623849506889e-19, +-2.73261538559917298e-19, +-9.50847079842519418e-19, + 5.69209046972332755e-19, + 3.77329172827091993e-18, + 5.72867425420925861e-18, +-9.65649094793570947e-18, +-8.36858992763059136e-18, + 1.84644620087458905e-17, +-2.55398011691614664e-18, +-5.75195380486493752e-18, + 4.57849600867438671e-19, + 1.74592466644766813e-18, + 1.66041491036416577e-20, + 4.63022983820590621e-19, + 5.16662126670413173e-19, + 2.79334112232781577e-19, + 5.78433422316200863e-19, +-4.79436196073470204e-19, +-2.01319795814722076e-19, + 5.49422654454383102e-19, +-4.13313462263902360e-19, + 3.42127593540676986e-19, +-1.63643489824225698e-20, +-7.39626180204994788e-20, + 2.24826258635911367e-19, + 2.64666098022749768e-20, + 2.01687001479942245e-19, + 1.75424949471513636e-19, + 2.76828195643775802e-19, +-3.62831198206045657e-19, + 2.58780293261714284e-19, +-5.35410684545498739e-20, + 3.08573995822860037e-21, + 7.06317933065605771e-20, + 5.13808501846821220e-19, + 8.72125081870093339e-19, + 1.56698751436078051e-19, +-4.23524718296637457e-19, +-1.22308605548905247e-18, +-1.51323116211973837e-18, +-5.59718795236668540e-19, +-1.72072774120758549e-18, +-1.90130890839755092e-18, +-8.39454297167982079e-19, +-1.66642615064327804e-18, +-4.34732163834313502e-19, +-2.88547646097886733e-19, +-6.11972699190985512e-20, + 1.21963095964851990e-18, + 1.81324310783101059e-18, + 1.14811308859967024e-18, + 1.23861376655657236e-18, + 9.23204043013371554e-19, + 1.21595502943409436e-18, + 1.11682493986203979e-18, + 9.25059056869699082e-19, + 5.69576143101132363e-19, + 3.33941707642567535e-19, + 1.36276634987873485e-19, + 8.76644214797170877e-19, + 4.24421756830216133e-19, + 5.00876988884606961e-19, + 4.72871076991609863e-19, +-5.10852581391187040e-20, + 4.19584095823660885e-19, +-1.13157775605685688e-19, +-1.41962419424892829e-19, + 2.54529151631872331e-19, + 1.75604017056444463e-19, + 1.48993578137119292e-19, + 3.71621732044637302e-19, + 1.48237033523522778e-19, + 2.98333869749488966e-20, + 1.87327747073942015e-19, + 4.87599459174278944e-19, + 2.42384302025866638e-18, + 1.05628614739150975e-18, +-2.32218174902901768e-19, +-6.60070364093816924e-19, + 1.76213198430247488e-19, + 8.86426246707680370e-20, + 2.70331556248762773e-19, +-1.13609328586578686e-18, + 3.33682746186878362e-19, +-4.46604042766462202e-19, + 7.01422972418731960e-19, +-1.12257519808536682e-18, + 7.77171346225822108e-19, +-2.09188523220665078e-19, + 1.10204075485035002e-19, + 2.04760753206870533e-19, + 4.01630452667971895e-19, +-5.62889430816853573e-19, + 7.60091540568560779e-20, + 2.60463037228253258e-19, +-2.67743230512240158e-20, + 3.38229865761774849e-19, + 8.73275866647678475e-20, +-2.93573396650259252e-19, + 1.75624595073593198e-19, + 4.35655112110447017e-20, + 3.17906729914041289e-19, + 1.57185202462117635e-19, + 4.68282004794162878e-19, + 4.12139936005818829e-19, + 2.04119170249234776e-19, + 2.66203650915707126e-19, + 3.03757436328862320e-19, + 2.89667208123722608e-19, + 1.81340795427568162e-19, + 1.78952527769194166e-19, + 1.21335507515166551e-19, + 3.85601308203049446e-19, + 1.52811424121625256e-19, + 2.92944930526686858e-19, +-3.62765440508012922e-18, +-9.40897106801297099e-20, +-4.39385190734949916e-19, +-1.10569831750256141e-18, +-2.06944490933916546e-19, +-4.79202327238596680e-19, + 6.51587575315409280e-19, +-5.14123785425221039e-19, +-3.69786049813002661e-19, +-5.12931520160074609e-19, + 1.76778934907453820e-19, +-3.66120502377011942e-19, + 5.05645791572058005e-19, +-9.69120507889299417e-19, +-9.16490216127522636e-19, +-6.45396730483235113e-19, +-9.82135858272968107e-19, + 1.55283390549983728e-19, +-4.70266917090295776e-19, +-2.03911551451961560e-19, +-4.48013963787795577e-19, +-5.77146312383119276e-19, +-9.99274941855744316e-20, +-6.05027487044436739e-19, +-2.73437249572802441e-19, +-1.65200776890183406e-19, +-2.97150938712877078e-19, +-5.49533388725419705e-19, +-5.37353183474675799e-19, +-6.26175002879281890e-19, +-4.50639596179797910e-19, +-7.91380118723607761e-19, +-3.33210526498998144e-19, +-3.66718771622882366e-19, +-3.24759958512584991e-19, +-2.19780115802917421e-19, +-3.32687385439555187e-19, +-2.52514121280397663e-19, +-4.09646604523446611e-19, +-1.65785023166896126e-19, + 1.62750609543493241e-01, + 1.31916153353095866e-01, + 1.11050933415085665e-01, + 9.62717940606781231e-02, + 8.53985738418308049e-02, + 7.71396191931980890e-02, + 7.06938425410392063e-02, + 6.55445845765087048e-02, + 6.13472347356093448e-02, + 5.78649966627747675e-02, + 5.49303226986831220e-02, + 5.24207683569130750e-02, + 5.02441171222959421e-02, + 4.83301744074386835e-02, + 4.66263279306254746e-02, + 4.50939246128357132e-02, + 4.37044906776788561e-02, + 4.24364549987773787e-02, + 4.12728882708505440e-02, + 4.02001229345017655e-02, + 3.92069120308178101e-02, + 3.82838786765360567e-02, + 3.74231268706279874e-02, + 3.66179518070821747e-02, + 3.58626178759120506e-02, + 3.51521855413873957e-02, + 3.44823746490291461e-02, + 3.38494553853540964e-02, + 3.32501605022609698e-02, + 3.26816140700484578e-02, + 3.21412732014937225e-02, + 3.16268800450472815e-02, + 3.11364219746027050e-02, + 3.06680983714820721e-02, + 3.02202927460788577e-02, + 2.97915492134440719e-02, + 2.93805525412891358e-02, + 2.89861111464127796e-02, + 2.86071425380429699e-02, + 2.82426608025122053e-02, +-1.87710575052660450e-02, +-1.24214830713480408e-02, +-8.63484404028497417e-03, +-6.25266028736221318e-03, +-4.68526114852331563e-03, +-3.61406777313096452e-03, +-2.85787552987125252e-03, +-2.30890308943045106e-03, +-1.90052087806831917e-03, +-1.59027912955942916e-03, +-1.35066976783572738e-03, +-1.16363328089418125e-03, +-1.01664684869154495e-03, +-9.00011551110329070e-04, +-8.05820227986749548e-04, +-7.28042425084436326e-04, +-6.62499411304154893e-04, +-6.06408751398654681e-04, +-5.57864196227528730e-04, +-5.15483184332569998e-04, +-4.78213426106053555e-04, +-4.45229175086330907e-04, +-4.15870299131040943e-04, +-3.89602290751984894e-04, +-3.65987956685927002e-04, +-3.44666543102842412e-04, +-3.25337998582423381e-04, +-3.07750937356896014e-04, +-2.91693327066771169e-04, +-2.76985212004072492e-04, +-2.63472974900977005e-04, +-2.51024773688459030e-04, +-2.39526884086045444e-04, +-2.28880746689570679e-04, +-2.19000566481507899e-04, +-2.09811348852976062e-04, +-2.01247283040277379e-04, +-1.93250403943665201e-04, +-1.85769478440798606e-04, +-1.78759073832201624e-04, + 1.03024404535002998e-03, + 5.98385898266305520e-04, + 3.68115279183096260e-04, + 2.37635370499180907e-04, + 1.59773250549893946e-04, + 1.11207804646147883e-04, + 7.97435235988470448e-05, + 5.86815814234857555e-05, + 4.41700559025170369e-05, + 3.38812999633437110e-05, + 2.63423420289471088e-05, + 2.06392080816999081e-05, + 1.62823093763037681e-05, + 1.30213346876656022e-05, + 1.06364293909763796e-05, + 8.88309915491854860e-06, + 7.55224688593055888e-06, + 6.50446242152883750e-06, + 5.65650867144079232e-06, + 4.95772852285325938e-06, + 4.37464515057592406e-06, + 3.88337203410058256e-06, + 3.46603391148824188e-06, + 3.10889586637708386e-06, + 2.80123216708886167e-06, + 2.53456661820996939e-06, + 2.30213324852395326e-06, + 2.09848251561407443e-06, + 1.91918888710968760e-06, + 1.76063095285404338e-06, + 1.61982428353893703e-06, + 1.49429313233862630e-06, + 1.38197105553470542e-06, + 1.28112328033081260e-06, + 1.19028557961174663e-06, + 1.10821578569474787e-06, + 1.03385506083936835e-06, + 9.66296757705956810e-07, + 9.04761227026980925e-07, + 8.48575317173181761e-07, +-4.92808675063561747e-05, +-2.55138106836835110e-05, +-1.40948095411264585e-05, +-8.22871195956448262e-06, +-5.03623013181499592e-06, +-3.20974014555433753e-06, +-2.11816159465242514e-06, +-1.44060963740063932e-06, +-1.00740537368738586e-06, +-7.26196131315668611e-07, +-5.42069131218308032e-07, +-4.14564894301029997e-07, +-3.14496826202171403e-07, +-2.31803893742678261e-07, +-1.68985375736788656e-07, +-1.26005261306533246e-07, +-9.75896772559619568e-08, +-7.80892808629578038e-08, +-6.38753215507954106e-08, +-5.30143133223497217e-08, +-4.44727600604931742e-08, +-3.76364264604573974e-08, +-3.20972671258385054e-08, +-2.75643753714965887e-08, +-2.38225436799484201e-08, +-2.07092774218000368e-08, +-1.81001767076766844e-08, +-1.58989363041459220e-08, +-1.40302606995834344e-08, +-1.24347461271184185e-08, +-1.10651324830853751e-08, +-9.88352664175265511e-09, +-8.85932399044188915e-09, +-7.96763757995924437e-09, +-7.18810018228559805e-09, +-6.50394305407938338e-09, +-5.90128183438368853e-09, +-5.36855890773366060e-09, +-4.89610484026955017e-09, +-4.47579124458465397e-09, + 2.13411859444552740e-06, + 9.93342719417408244e-07, + 4.96360530385865749e-07, + 2.63672263134924389e-07, + 1.47680606016137047e-07, + 8.66174343498757336e-08, + 5.28975409342945070e-08, + 3.34278222729675337e-08, + 2.16096940286073281e-08, + 1.40666677334674475e-08, + 9.35215051496896142e-09, + 6.89299682267597186e-09, + 5.70775079942438456e-09, + 4.58320428737332140e-09, + 3.26869882716977925e-09, + 2.16353605504416075e-09, + 1.44723236301125625e-09, + 1.02595895047944972e-09, + 7.69264430123126428e-10, + 5.98248105415431003e-10, + 4.75406297426300600e-10, + 3.83144298059953812e-10, + 3.12127841765627234e-10, + 2.56618649175317238e-10, + 2.12724768446631444e-10, + 1.77670590772821544e-10, + 1.49425333770259583e-10, + 1.26479400377527766e-10, + 1.07696796056400236e-10, + 9.22135125304111587e-11, + 7.93659833078487785e-11, + 6.86399809467886509e-11, + 5.96336388892586030e-11, + 5.20304193861463953e-11, + 4.55791471359101476e-11, + 4.00791275238209947e-11, + 3.53689514858349088e-11, + 3.13180006310754994e-11, + 2.78199692289859877e-11, + 2.47878246628351826e-11, +-8.56187820929486019e-08, +-3.60753975424505614e-08, +-1.64001690781755118e-08, +-7.96551919545834889e-09, +-4.09847799796164652e-09, +-2.21756456778696123e-09, +-1.25483913811567024e-09, +-7.43288813223990719e-10, +-4.65095367674865846e-10, +-3.00207515763287098e-10, +-1.74488402450921515e-10, +-7.95602303372739619e-11, +-5.03743363268668541e-11, +-6.35676905725012316e-11, +-6.37121735318346759e-11, +-4.54393406376217196e-11, +-2.71962046542441266e-11, +-1.60466093970722553e-11, +-1.02448864800144730e-11, +-7.14225803325279831e-12, +-5.27588535304096614e-12, +-4.02277468972660271e-12, +-3.12423687925882040e-12, +-2.45776371799275709e-12, +-1.95389003516802143e-12, +-1.56784663380178969e-12, +-1.26882233974339538e-12, +-1.03491843992038914e-12, +-8.50304184089895737e-13, +-7.03372839387412984e-13, +-5.85523123077409507e-13, +-4.90314509913689899e-13, +-4.12872104027226946e-13, +-3.49476488030961735e-13, +-2.97269720434927370e-13, +-2.54034971439022222e-13, +-2.18037607714265795e-13, +-1.87918770541271877e-13, +-1.62587741650768407e-13, +-1.41201336981446344e-13, + 3.22658602830890660e-09, + 1.23772099561911173e-09, + 5.14456441243985407e-10, + 2.29454002761610332e-10, + 1.08896814092486834e-10, + 5.45846621719014665e-11, + 2.86135683189596843e-11, + 1.54041387440901139e-11, + 8.56024267780986409e-12, + 5.71290197650948300e-12, + 4.82005575578144311e-12, + 2.74011265019546710e-12, +-1.14314115646732699e-13, +-5.23351616817436803e-13, + 5.07232301585761139e-13, + 8.63392139276647784e-13, + 6.15585618178073673e-13, + 3.31406235392571948e-13, + 1.71031994395057413e-13, + 9.70647887870090018e-14, + 6.23757573932045204e-14, + 4.36720839691832958e-14, + 3.19923523738266401e-14, + 2.39997723100228835e-14, + 1.82844108329470249e-14, + 1.40963134079174725e-14, + 1.09738756757610756e-14, + 8.62401539052282398e-15, + 6.83630223281118696e-15, + 5.46613953091430261e-15, + 4.40104733261787089e-15, + 3.56799928023112651e-15, + 2.91115794405742692e-15, + 2.39191526249437433e-15, + 1.97522709668928615e-15, + 1.64038460547003528e-15, + 1.36888238814840662e-15, + 1.14565944350803828e-15, + 9.70687032667792631e-16, + 8.19257406173623175e-16, +-1.15281611734462320e-10, +-4.04554000301320982e-11, +-1.54388420778720826e-11, +-6.34586229411260207e-12, +-2.78537691445276605e-12, +-1.29754855448514436e-12, +-6.42356983783875830e-13, +-3.36204165545180507e-13, +-1.64370256281109627e-13, +-4.92460513628814968e-14, +-3.72283821245642266e-14, +-1.09194581738190667e-13, +-6.84083032890571691e-14, + 2.91104870777270984e-14, + 2.99802607822948556e-14, +-2.33023846104214684e-15, +-1.16416726457407223e-14, +-7.94667844451150051e-15, +-3.83200617769142185e-15, +-1.73399740532959343e-15, +-8.72943332358608646e-16, +-5.11378643762789887e-16, +-3.39032501003851931e-16, +-2.40783387588457509e-16, +-1.73886131648707664e-16, +-1.25793766075864656e-16, +-9.54343663300068966e-17, +-7.32437052768161544e-17, +-5.60060281365150245e-17, +-3.98765505248057031e-17, +-3.13654437384443334e-17, +-2.62846670998020679e-17, +-2.03412458249057523e-17, +-1.61000013763813738e-17, +-1.22351787769962609e-17, +-1.04742533413960454e-17, +-9.09120330622515830e-18, +-9.32266078432058544e-18, +-3.29589544196353499e-18, +-4.51154045871672608e-18, + 3.93101050180504029e-12, + 1.26733941719182316e-12, + 4.45708066676902391e-13, + 1.69407762821075050e-13, + 6.89809201169354757e-14, + 2.97665218655797714e-14, + 1.34589061415798548e-14, + 6.72823215364061249e-15, + 4.43685590340062951e-15, + 2.42450343822048878e-15, +-1.74275520819526514e-15, +-1.31314644196474969e-15, + 3.40561704893112350e-15, + 1.65588575824149725e-15, +-1.04661678340853586e-15, +-6.86567226973903572e-16, + 1.18821508524814429e-17, + 1.54466781156582757e-16, + 9.66642938488845949e-17, + 4.16686907658883168e-17, + 1.67328875481947457e-17, + 7.71608293588481910e-18, + 5.32985550242702129e-18, + 2.11259728282502499e-18, + 1.12160307831733639e-18, + 3.78264270280157279e-18, + 3.58658940745548430e-19, +-8.96122575467599139e-19, +-1.86908257279119479e-18, + 1.52144343810451718e-18, + 1.96915747838248662e-18, + 1.25368716263028801e-18, +-2.40781785812843783e-19, + 1.40496868421892052e-19, + 7.81816471919791465e-19, + 4.29576107243942372e-20, +-5.21517782352704492e-19, +-2.59375908998105940e-18, + 1.62942110413513005e-18, +-1.04486747972310388e-20, +-1.28565515399754350e-13, +-3.82281466923191650e-14, +-1.24298881601720127e-14, +-4.37845381850603321e-15, +-1.65864405398154066e-15, +-6.74939073302727352e-16, +-2.81861874378195051e-16, +-1.09087904778034690e-16, +-3.67484812292814821e-17, +-9.27598591031216437e-17, +-9.63119412017740379e-17, + 1.31868592734946141e-16, + 5.88006582076419991e-17, +-1.07446522532946774e-16, +-2.29339522342350513e-17, + 2.64840163210595476e-17, + 1.12976893132975464e-17, + 5.53718916787815780e-19, + 5.54745534308531491e-19, +-5.19872339597984790e-19, +-9.03375042928587129e-19, + 5.71995966768730108e-19, + 4.11074816493793984e-19, +-2.12264296235967522e-18, +-4.05333683938255548e-19, + 2.61419488857801865e-18, + 1.74393397192985339e-18, +-1.29384000332343086e-18, +-3.86088924281616590e-19, + 1.93149651240431221e-18, + 2.64735823238157268e-18, +-9.37047780016458293e-20, + 5.00679153767797153e-20, + 8.73057389705621255e-19, + 4.82004359459985300e-19, + 8.71576652849618662e-19, +-7.31054300280836228e-19, +-1.19897385558079654e-18, + 1.49423590831193041e-18, + 3.24780659037228979e-19, + 4.05808382789109630e-15, + 1.12029528035006821e-15, + 3.37725247020319652e-16, + 1.15360719575984264e-16, + 4.42465602219511258e-17, + 1.52665721658672774e-17, + 7.06671526531098300e-18, + 3.99653200095413579e-18, +-4.11634733031566947e-20, +-2.85455382501140659e-19, + 7.42960464918309225e-18, + 7.61097536060027177e-18, +-6.00142702648676699e-18, + 1.09818439310804938e-18, + 2.62371714928686375e-18, + 2.29155655294385804e-19, +-1.93385683341181038e-19, +-7.59702256182128545e-20, + 1.41849877276969565e-18, + 1.28312610068627219e-18, +-9.64608744508968057e-19, +-3.67742276164299487e-19, +-2.20731904045278481e-20, +-5.06794095786096812e-19, + 1.07085542518775129e-19, + 2.90609170274574503e-18, + 3.25563198363802615e-19, +-4.32617992661125683e-19, +-1.67410956662013935e-19, + 4.82625733103352914e-19, + 1.42602023410951766e-18, +-2.29455795964875464e-19, + 8.53947537718349725e-19, + 9.12542002375340560e-19, + 1.47320953091281835e-19, +-5.97449660956833126e-19, + 3.78664654141534338e-19, +-1.66983713521548905e-18, + 1.48933549792139354e-18, + 5.38803985683367922e-19, +-1.21319492822521156e-16, +-2.73208722499431319e-17, +-1.01650068947523203e-17, +-1.23559973805006068e-18, +-1.57156625391008257e-18, + 1.64427467751968997e-18, +-4.68693534452265662e-19, +-3.54849189419838300e-18, + 1.58614285368891171e-18, +-1.62009710784504712e-18, +-2.00505229922042795e-19, +-1.23843240621524459e-18, + 2.03718798418411615e-20, + 8.91165607569002753e-19, + 3.57540332366895614e-19, + 1.70221449747830186e-18, + 8.23807466416742674e-19, + 6.26842481846619279e-19, + 2.60554574806738759e-18, + 9.25928451850393967e-19, +-7.54920275710936477e-21, + 7.86522430315927263e-19, + 8.89669169847053908e-19, +-4.29644184040302453e-19, + 5.65111816934982358e-19, + 1.07475428602877519e-18, + 1.73032728119146268e-18, +-6.17843385341585527e-19, +-1.63129178062799700e-18, + 7.79983160477574519e-19, +-3.58218975983928969e-19, +-3.36389494367294341e-19, + 3.00386003503815751e-19, + 1.06271171621375436e-18, + 9.76404717928353815e-19, +-2.88666696651744449e-19, +-2.51340874603839658e-21, +-1.00584115606286765e-18, + 1.35779183131304459e-18, + 2.87342364003633759e-19, + 5.76241670478095695e-18, + 8.74660750641137026e-19, +-4.88912342719327080e-19, + 9.31129253024921201e-19, +-1.90495352752836156e-18, + 1.53276941314136330e-18, +-8.86898587373632814e-19, + 4.45913660482492930e-20, +-3.35478963633275296e-18, +-1.95250898908272089e-19, + 2.35780306610619947e-18, + 1.07034941094064071e-18, + 3.62468508697435944e-19, + 8.74506865842012411e-19, +-2.07158970799756276e-18, + 2.29080554399315344e-19, + 1.53677833183275198e-18, + 8.04882908159468794e-19, + 1.30800929787409826e-18, + 8.72048414106237994e-19, +-7.21484972953802828e-19, + 1.38566473711804812e-18, +-3.57141904746931775e-19, +-4.89930171504143092e-19, +-1.08269485827850810e-18, + 1.75004562127995634e-18, + 1.64348539455900243e-18, + 1.66891011982465232e-19, +-1.02016837520948990e-19, +-7.73688600391466959e-19, + 1.56614348093141436e-19, + 1.14831894452073069e-18, + 3.24862937877869564e-19, +-7.68490518012758823e-20, + 1.02853602231847344e-18, + 2.16107251158409065e-19, +-2.03157376634395972e-19, +-7.03139915106837839e-19, + 1.56700774569343488e-18, +-1.35547301142666304e-19, +-1.06860831429424060e-17, +-4.62614639527130001e-18, +-4.50816152044694026e-18, +-3.95257464107035882e-18, +-1.34898668329830780e-18, +-2.27709175580101249e-18, +-1.54598183350802555e-18, +-2.75302424282629307e-18, + 3.95215644951881814e-19, +-1.58693471469461381e-19, +-3.09860969139669863e-20, +-4.17435678432823556e-19, + 6.22571753148665682e-19, + 2.87943169446212601e-19, +-1.12333773414559201e-19, + 8.47568784277970047e-20, +-1.22948003575468915e-19, +-7.72736416492597661e-19, + 3.59119230073161654e-19, +-1.06395376770233697e-18, +-2.96372238979291607e-19, +-3.64125841249664531e-19, + 4.06137610208094613e-19, +-7.05483076298779229e-19, +-1.86654311508468381e-19, + 9.92334091764695344e-19, +-4.32707819745590883e-19, +-1.30840861478544125e-18, +-1.27725030329350350e-18, +-8.42595461059082837e-19, +-3.48811939771524565e-19, +-1.85445051278349899e-18, +-8.08840227227364915e-19, +-8.40920788780918606e-19, +-7.15363815889199163e-20, +-1.08012839826429171e-18, +-7.84012784817324441e-19, +-1.17535566576769315e-18, +-5.94122253607213728e-19, + 2.68598616775167094e-20, +// root 7 + 8.40207001896484985e-03, + 7.30288067531507847e-03, + 6.40502128241546894e-03, + 5.66241599225073174e-03, + 5.04136457499065188e-03, + 4.51677899034500039e-03, + 4.06967408232468669e-03, + 3.68545709162989817e-03, + 3.35275314188131788e-03, + 3.06264068817267135e-03, + 2.80823142848669275e-03, + 2.58443994329255562e-03, + 2.38762804645928492e-03, + 2.21494190451227996e-03, + 2.06364686024285192e-03, + 1.93089814234816116e-03, + 1.81391513442830587e-03, + 1.71021454868637156e-03, + 1.61771011063181129e-03, + 1.53469652883456544e-03, + 1.45978797589440905e-03, + 1.39185329895321892e-03, + 1.32996189159403965e-03, + 1.27334156967121373e-03, + 1.22134632835024098e-03, + 1.17343159635558639e-03, + 1.12913508006239212e-03, + 1.08806178847011470e-03, + 1.04987221388737426e-03, + 1.01427291911989292e-03, + 9.81008978278271769e-04, + 9.49857858837925497e-04, + 9.20624434199356794e-04, + 8.93136890289045605e-04, + 8.67243344631073209e-04, + 8.42809037278088738e-04, + 8.19713983838539950e-04, + 7.97851004274281153e-04, + 7.77124059095782868e-04, + 7.57446838440976314e-04, +-6.08518877051575846e-04, +-4.93954321007383009e-04, +-4.06265640374549070e-04, +-3.38069243201557883e-04, +-2.84271703817740311e-04, +-2.41290959688752338e-04, +-2.06565863352395921e-04, +-1.78238232582046962e-04, +-1.54927571322615942e-04, +-1.35542460893184780e-04, +-1.19129506975144216e-04, +-1.04846355114277101e-04, +-9.21087915575946641e-05, +-8.07182836360630909e-05, +-7.07266873859996694e-05, +-6.21687057692450805e-05, +-5.49442743990805665e-05, +-4.88647638502957848e-05, +-4.37280130843299778e-05, +-3.93572794070331711e-05, +-3.56098073416521877e-05, +-3.23730454717267494e-05, +-2.95583559537378601e-05, +-2.70954402530692780e-05, +-2.49280310665308066e-05, +-2.30106745903465908e-05, +-2.13063318960873301e-05, +-1.97845768324681696e-05, +-1.84202282557514071e-05, +-1.71923012387510262e-05, +-1.60831950400190288e-05, +-1.50780586694182568e-05, +-1.41642910071634165e-05, +-1.33311438228894889e-05, +-1.25694041788722449e-05, +-1.18711385793664002e-05, +-1.12294855176032049e-05, +-1.06384862329502320e-05, +-1.00929458413287929e-05, +-9.58831876503082898e-06, + 1.63911971287842158e-05, + 1.24452017051448609e-05, + 9.60908614008553016e-06, + 7.53132717070292669e-06, + 5.98238687860499978e-06, + 4.80886065179143743e-06, + 3.90584539437996804e-06, + 3.20084546758939665e-06, + 2.64637513916771115e-06, + 2.21719338775558851e-06, + 1.90176911408824911e-06, + 1.68004265795079666e-06, + 1.50763054427123310e-06, + 1.33838491313786730e-06, + 1.15865358465819859e-06, + 9.82815195240044792e-07, + 8.26901180981277100e-07, + 6.96735863172953545e-07, + 5.90685033937710086e-07, + 5.04590233866519409e-07, + 4.34315891304977241e-07, + 3.76478904547678892e-07, + 3.28466237099576542e-07, + 2.88281908691193044e-07, + 2.54394140992959757e-07, + 2.25616534327154305e-07, + 2.01021023141865407e-07, + 1.79874656237214525e-07, + 1.61593384647440697e-07, + 1.45707933392576470e-07, + 1.31838325857596222e-07, + 1.19674670858938510e-07, + 1.08962532539225109e-07, + 9.94916891010319842e-08, + 9.10874222269577095e-08, + 8.36037138529666148e-08, + 7.69178929946028880e-08, + 7.09263939773466026e-08, + 6.55413730688940807e-08, + 6.06879929217877917e-08, +-3.88255560139012769e-07, +-2.76409679477775841e-07, +-2.00750843778052498e-07, +-1.48470334823590410e-07, +-1.11646931222961659e-07, +-8.52848651161861717e-08, +-6.61519564353704829e-08, +-5.19647760968993223e-08, +-4.07666998009576673e-08, +-3.08790268807971461e-08, +-2.19203599357973140e-08, +-1.56498409373844626e-08, +-1.37497158005704530e-08, +-1.46223073070139594e-08, +-1.50995508024939416e-08, +-1.39835237713351346e-08, +-1.19332175287385126e-08, +-9.78974391674368878e-09, +-7.94278668025593850e-09, +-6.46096426508125381e-09, +-5.29540481720554659e-09, +-4.37787907381213007e-09, +-3.65000633904998402e-09, +-3.06716380294795751e-09, +-2.59612687480584421e-09, +-2.21213911847162994e-09, +-1.89659350552357158e-09, +-1.63535930443798881e-09, +-1.41759491678871680e-09, +-1.23490168967952565e-09, +-1.08071462923541900e-09, +-9.49858808690192317e-10, +-8.38222929084358263e-10, +-7.42516646072442024e-10, +-6.60088447289559466e-10, +-5.88787749627013712e-10, +-5.26859601249080005e-10, +-4.72863643578987628e-10, +-4.25611278538292506e-10, +-3.84116608428121667e-10, + 8.49804243065029550e-09, + 5.68883104619821878e-09, + 3.89350319156909771e-09, + 2.71903926797816752e-09, + 1.93283473758168853e-09, + 1.39401559316824558e-09, + 1.01978489297706401e-09, + 7.73048317091832829e-10, + 6.44735861942613353e-10, + 5.96600725531343407e-10, + 5.03081096557507683e-10, + 2.58974485700718148e-10, +-2.84162172279381797e-12, +-6.95486090298323204e-11, + 2.10638134458632266e-11, + 1.09663951997161316e-10, + 1.37678597805696374e-10, + 1.26597258636702335e-10, + 1.03809978087714156e-10, + 8.19999393446056516e-11, + 6.44027531314823598e-11, + 5.08749102744270606e-11, + 4.05534720326514675e-11, + 3.26318006348679766e-11, + 2.64936260142669654e-11, + 2.16896863834998872e-11, + 1.78939783949758584e-11, + 1.48681308184909695e-11, + 1.24360000143937156e-11, + 1.04660203063970776e-11, + 8.85891188524988753e-12, + 7.53903689311495448e-12, + 6.44825034343011951e-12, + 5.54147767642619852e-12, + 4.78350085117255684e-12, + 4.14659831347644992e-12, + 3.60879678430227232e-12, + 3.15256445368087112e-12, + 2.76382617008923001e-12, + 2.43121522118257711e-12, +-1.75394802058100954e-10, +-1.10867434736151667e-10, +-7.17588007762816545e-11, +-4.75227820738934444e-11, +-3.22153307285616893e-11, +-2.23320348550191596e-11, +-1.53834772162365023e-11, +-9.31472580002164628e-12, +-3.75238492028627677e-12, +-2.16037556864660303e-12, +-8.32600755396166137e-12, +-1.48505990303200363e-11, +-9.18464578687767709e-12, + 2.00030906011640944e-12, + 5.53750016833289426e-12, + 2.90758799432019844e-12, + 1.39241553189466504e-13, +-1.01416071581881623e-12, +-1.16866541902845824e-12, +-9.91231253447589760e-13, +-7.71602316446254324e-13, +-5.88695734735669697e-13, +-4.50065653006824481e-13, +-3.47077238607740084e-13, +-2.70351979656003256e-13, +-2.12661112385588245e-13, +-1.68825510819676702e-13, +-1.35175773085619462e-13, +-1.09096040656386121e-13, +-8.87013204096198170e-14, +-7.26188057008729420e-14, +-5.98373744764664142e-14, +-4.96047696219177470e-14, +-4.13565537032521063e-14, +-3.46648371853936605e-14, +-2.92027629071961619e-14, +-2.47188660460578806e-14, +-2.10179676464674839e-14, +-1.79476545902454931e-14, +-1.53879910967910842e-14, + 3.43925279095272852e-12, + 2.06274292930704001e-12, + 1.26573565510021101e-12, + 7.93074864932244268e-13, + 5.05456039564946018e-13, + 3.34582746478636391e-13, + 2.59339632151702318e-13, + 2.51139241329097505e-13, + 1.87354606934491440e-13, +-9.17810237422510650e-14, +-3.70054187602114263e-13, +-5.98256682703621136e-14, + 4.71520832264497106e-13, + 3.49932804595841439e-13, +-3.12656967497564966e-14, +-1.40805207167995787e-13, +-8.07134259987925688e-14, +-2.12225507882749599e-14, + 3.67999146006619076e-15, + 9.29304387903161341e-15, + 8.56631760253008712e-15, + 6.65738950220004154e-15, + 4.96233003022977340e-15, + 3.68518305421725583e-15, + 2.75767292841054898e-15, + 2.08489776026489202e-15, + 1.59281919731465916e-15, + 1.22903711726051965e-15, + 9.57075545653100287e-16, + 7.51814255448215587e-16, + 5.95240747158062668e-16, + 4.74918647015172478e-16, + 3.81645226815946633e-16, + 3.08664283566944963e-16, + 2.51222897252469143e-16, + 2.05679382178121809e-16, + 1.69368840046300012e-16, + 1.40114466620836444e-16, + 1.16547263013331848e-16, + 9.74174888147732179e-17, +-6.41662774428109519e-14, +-3.68015730979387404e-14, +-2.15704874831076138e-14, +-1.29841110798763146e-14, +-7.95219935274682180e-15, +-4.34710838897269331e-15, +-1.12959014257304857e-15, +-1.76139297361921575e-16, +-5.60814414895545872e-15, +-1.32809746542457859e-14, +-1.92913841477524398e-15, + 2.17550696710872108e-14, + 9.17966157000619361e-15, +-1.41644163033323802e-14, +-9.52931140170799506e-15, + 5.57241215960146408e-16, + 2.67229538275113081e-15, + 1.45570379489380244e-15, + 4.39297997375738753e-16, + 3.76363117197245252e-17, +-6.21823437885896247e-17, +-6.72475238272643999e-17, +-5.30304340400957997e-17, +-3.87760443771806909e-17, +-2.80404069375600064e-17, +-2.04133362698684035e-17, +-1.49459877294064023e-17, +-1.10974102476341684e-17, +-8.39697894207298878e-18, +-6.31330439351722258e-18, +-4.84413240838950433e-18, +-3.75113752344830281e-18, +-2.88846830207047213e-18, +-2.27058712201407096e-18, +-1.79770099635859184e-18, +-1.42341689082408457e-18, +-1.11265640919659752e-18, +-8.77220014072712231e-19, +-7.56183954535802454e-19, +-5.83882218351308133e-19, + 1.13334785550270137e-15, + 6.27488589736498294e-16, + 3.52221519820252032e-16, + 2.00487276471740791e-16, + 1.25623251665184460e-16, + 1.06639770961546697e-16, + 8.51876334682077463e-17, +-5.20669799112451634e-17, +-2.76486908120724617e-16, +-6.73779757406380521e-17, + 7.77845480744200465e-16, + 3.36830184340713747e-16, +-9.27061624202344503e-16, +-2.77621108671501743e-16, + 3.84065070981109953e-16, + 1.84608236687179691e-16, +-1.63266003146957271e-17, +-4.20887505480078353e-17, +-2.06490339313391465e-17, +-6.26471447646910130e-18, +-9.53203664133379245e-19, + 4.60950932144485682e-19, + 4.30436237781648820e-19, + 3.64100703556804973e-19, + 3.34159904018752812e-19, + 1.87294033185367514e-19, + 1.56008683960429073e-19, + 1.62381747510577068e-19, + 1.65246414880822749e-20, + 8.10360544552066334e-20, + 4.15193742899322069e-20, + 8.14759817129272610e-21, + 5.78114070206899103e-20, + 3.42080350714113107e-20, +-5.26071938644286818e-21, + 5.38135078931501916e-21, + 2.99387979190475493e-20, + 2.38532432612237495e-21, +-8.70345725157031940e-21, +-9.67277260962137293e-21, +-1.87179400922917155e-17, +-1.03893301140677984e-17, +-5.49509083115267475e-18, +-2.85714831859409456e-18, +-1.04216872410492778e-18, +-1.67438517661915890e-19, +-1.88453815941374686e-18, +-6.09521002640196603e-18, +-3.76314158195893196e-18, + 1.82180661918270272e-17, + 1.69249538740612036e-17, +-4.05780442056407578e-17, +-1.00203510101415822e-17, + 3.13334964665403598e-17, + 2.59465964648074641e-18, +-8.21908332390834946e-18, +-2.43859192392861326e-18, + 4.26027974838986415e-19, + 6.42869625698027561e-19, + 2.78599587331313703e-19, + 1.58225730446126561e-19, + 9.66403470398021535e-20, +-7.94638725807548893e-20, +-7.60779819807274104e-21, + 4.82765769638885378e-20, + 2.78603277255627967e-20, + 6.74255101693542821e-20, + 5.41906246118048263e-20, + 1.94980343402709475e-20, + 1.60926110441599315e-20, + 8.93270282038558311e-21, + 3.64336323474508041e-20, + 5.37634790798452420e-20, + 1.08144381514623229e-20, + 3.58456280784388427e-20, + 5.38332037282432905e-21, + 6.27901362365293498e-20, + 2.82312159810830575e-20, +-6.56339407142792671e-21, + 2.03243167537610560e-20, + 6.91361622811230105e-19, + 8.93359257457045402e-20, + 2.50547708325238087e-19, + 4.40265779366441744e-19, + 1.76963375889029455e-19, +-1.74108327353988817e-20, + 9.24077376962538529e-20, +-2.96370727366124539e-20, + 5.09836734457076612e-19, + 7.39370592747250562e-19, +-1.02215250906197813e-18, +-7.17499136512057385e-19, + 1.98218326773995240e-18, +-1.03706054935006149e-19, +-6.22755345868299107e-19, + 1.25736048809286033e-19, + 2.62716902735560375e-19, + 2.41538199264955350e-20, + 3.74466832383961759e-20, + 2.82727659487712018e-20, + 4.72885658220463270e-20, + 8.86092942478338266e-20, +-9.56987909761818250e-21, + 1.29831677051919446e-20, + 3.29892814489628481e-20, +-1.84865189674604542e-20, + 5.01465586007253979e-20, + 4.42279960391644384e-20, + 7.82453538644286094e-22, + 2.53609766689826623e-20, +-3.56466121929505467e-21, +-2.23639046082516042e-20, + 2.63163387293972514e-20, + 2.32492210534798023e-20, + 1.59749671309325153e-21, + 1.31142525873822308e-20, + 2.18811285541777796e-20, + 4.06942688998208937e-21, + 1.26985634027828010e-20, + 1.72921442393668044e-20, + 2.96209285747622604e-20, +-1.00308427589832568e-19, + 3.17152565077987180e-20, + 9.62470546768834786e-20, +-1.11425190824044821e-19, +-7.12738847742043685e-20, +-1.19291851490692984e-19, +-7.27399282594930990e-20, + 1.27720896840712851e-19, +-3.12981559808113766e-20, +-1.42574678971216600e-19, +-5.72552263884004595e-21, + 7.13509558817063450e-20, +-2.98765870038546462e-20, + 1.80295446729352264e-19, + 7.11299839478821107e-20, + 1.44910556335304891e-19, + 5.80816354011954634e-20, + 1.36667039309153954e-19, + 1.60114490842155694e-20, + 5.19261230298310606e-20, + 1.26474072638360173e-19, + 3.89139768953676437e-20, + 4.93519641842034932e-20, + 8.82224705311193198e-20, + 2.81538207588309146e-20, + 5.33411417013718111e-21, + 5.58487142538163001e-20, + 1.78765404774556525e-20, + 8.42080003405089132e-20, + 2.52259603282558109e-21, + 1.60499612593079238e-20, + 2.61661891107443090e-20, + 1.56197909088536088e-20, + 1.06864918564320931e-20, + 1.74953602976575723e-20, + 1.80313486916552763e-20, + 2.92978904121584746e-20, + 1.76209370352439431e-20, + 4.69016021519749123e-21, +-9.36618394370120797e-20, +-3.81764831148711715e-19, + 5.12517329537096827e-20, + 1.99347779074286563e-20, +-1.64670141981192528e-19, +-2.81046033398044846e-20, +-7.09340983768160587e-20, +-2.23875033623122445e-21, + 6.97455655368828961e-20, +-3.52652961780669367e-20, + 1.75136180019964982e-20, + 3.98943741256174435e-20, + 3.92065957510749303e-20, + 5.55268890432698172e-20, + 2.10211475526046317e-20, + 2.11546667217865076e-20, + 3.44136886167595511e-20, +-4.43314071230955130e-20, + 3.06696682645654229e-20, +-1.03635476832740383e-20, + 1.93568608526636671e-20, + 6.25617826059424996e-20, +-5.28947521222172495e-20, +-2.24228183477769666e-20, +-4.71843561739568989e-21, + 7.13468755719373070e-21, + 7.04188385073776722e-20, + 8.47209232063068748e-20, + 2.55727933724267706e-20, + 6.72722688653782441e-20, + 2.68470003881810233e-20, + 2.06071006728645161e-20, + 3.84908166900190896e-20, + 1.81025442455642997e-20, + 1.20428595535924132e-20, + 9.93330647857135756e-21, + 2.04073339475772534e-20, + 2.46025857386323856e-20, + 1.64777032148018559e-20, + 2.52831895029912722e-20, +-2.95147036352696431e-19, +-1.75416638084598145e-19, +-1.70750458667699877e-19, + 3.59490693631605952e-20, +-3.57309196784716244e-20, + 4.56630908325283859e-20, + 1.24514572988178672e-19, +-1.92626411178274824e-20, +-3.97973167374911498e-20, +-1.49501122099754744e-19, + 1.24481850197942799e-20, +-4.42131367738393556e-20, + 1.28781608181680146e-19, +-1.40301877493665286e-19, +-9.01570144463355937e-20, +-8.88986741950775386e-20, +-2.83594323176099037e-20, +-3.99933896526535327e-20, +-5.39875945710723374e-20, +-2.94338492417489481e-20, +-1.34708910444175183e-20, + 4.58080524377339006e-22, +-4.07004878963360721e-20, +-4.62060080074500168e-20, +-1.93829408401841116e-20, +-8.25067984215933643e-20, +-6.41340882550423805e-20, +-8.82878576222660938e-20, +-5.98612310145214731e-20, +-4.98432804355675597e-20, +-6.30616502247644745e-20, +-7.60014787257069176e-20, +-6.15873704187462884e-20, +-5.26400867448098009e-20, +-4.20256884502350931e-20, +-4.34882703197373257e-20, +-2.97067460303460668e-20, +-4.55062857143735993e-20, +-4.46323611693641460e-20, +-1.81403186437386672e-20, + 1.81013492676602883e-01, + 1.66077793856907518e-01, + 1.53673592073722082e-01, + 1.43184628773890626e-01, + 1.34180800262777511e-01, + 1.26352967411431760e-01, + 1.19473077155585680e-01, + 1.13368830031997214e-01, + 1.07907233425655155e-01, + 1.02984463590458014e-01, + 9.85210320197325157e-02, + 9.44602610920840385e-02, + 9.07651352659344379e-02, + 8.74095015505940987e-02, + 8.43673218338445441e-02, + 8.16077335765679618e-02, + 7.90971269119354059e-02, + 7.68032418580915643e-02, + 7.46976179744539420e-02, + 7.27561315744705284e-02, + 7.09585817003952207e-02, + 6.92880331379558123e-02, + 6.77302028990793004e-02, + 6.62729578143133602e-02, + 6.49059175832044088e-02, + 6.36201424443235269e-02, + 6.24078859739240210e-02, + 6.12623977748527546e-02, + 6.01777646221398135e-02, + 5.91487815177701437e-02, + 5.81708462202429610e-02, + 5.72398723595372722e-02, + 5.63522173866165960e-02, + 5.55046224538441671e-02, + 5.46941619593706782e-02, + 5.39182009715009625e-02, + 5.31743591185949993e-02, + 5.24604798151707477e-02, + 5.17746039165533772e-02, + 5.11149470680293677e-02, +-8.21967169247590085e-03, +-6.76230153904167682e-03, +-5.67325905871450369e-03, +-4.83766891695546278e-03, +-4.18199176460956178e-03, +-3.65754693213834244e-03, +-3.23120436461253428e-03, +-2.87989876760759694e-03, +-2.58707291235967625e-03, +-2.33983270576157941e-03, +-2.12653573310387940e-03, +-1.93609607245165470e-03, +-1.76030375856274686e-03, +-1.59665052908756697e-03, +-1.44715935809965187e-03, +-1.31421262462316215e-03, +-1.19809107439740846e-03, +-1.09727867573274030e-03, +-1.00959793420702239e-03, +-9.32935703587536727e-04, +-8.65491849963223960e-04, +-8.05797102023312240e-04, +-7.52662308251751027e-04, +-7.05121243913608238e-04, +-6.62382879079347173e-04, +-6.23794345040704881e-04, +-5.88812601319685098e-04, +-5.56982678895376034e-04, +-5.27920831445067933e-04, +-5.01301366369525866e-04, +-4.76846259638577844e-04, +-4.54316897036425628e-04, +-4.33507454805360875e-04, +-4.14239555321495876e-04, +-3.96357922571337264e-04, +-3.79726827648532868e-04, +-3.64227163018336414e-04, +-3.49754020611856486e-04, +-3.36214676221735119e-04, +-3.23526903529217243e-04, + 2.11637589719366635e-04, + 1.55995572759662316e-04, + 1.18300962017154322e-04, + 9.19053419329331754e-05, + 7.28832676138813047e-05, + 5.88212027460990417e-05, + 4.81780210913167680e-05, + 3.99445377583242350e-05, + 3.34916071024539023e-05, + 2.85285513707189814e-05, + 2.50033101184022894e-05, + 2.27640852162217922e-05, + 2.12268542771095824e-05, + 1.96389983863088920e-05, + 1.76851932378592984e-05, + 1.55478394165077101e-05, + 1.35128600264772263e-05, + 1.17313775384386611e-05, + 1.02277458890914874e-05, + 8.97061609689864190e-06, + 7.91701161511187110e-06, + 7.02823243248029798e-06, + 6.27298207795745471e-06, + 5.62662889835550402e-06, + 5.06980635142915856e-06, + 4.58718239592771419e-06, + 4.16651319213444810e-06, + 3.79793615796439472e-06, + 3.47344179278133500e-06, + 3.18647589862965118e-06, + 2.93163711066067570e-06, + 2.70444470149711998e-06, + 2.50115872039198742e-06, + 2.31863949078938475e-06, + 2.15423698295502050e-06, + 2.00570306112385496e-06, + 1.87112138904298856e-06, + 1.74885107206338460e-06, + 1.63748106284939501e-06, + 1.53579305873433817e-06, +-5.65414308955566603e-06, +-3.76654814117959374e-06, +-2.59938306754207582e-06, +-1.84943887581865408e-06, +-1.35149916093873530e-06, +-1.01179304421087474e-06, +-7.75011487466232183e-07, +-6.05404112814916471e-07, +-4.73787473186494739e-07, +-3.53560485443503496e-07, +-2.35310661714190358e-07, +-1.45911952970684221e-07, +-1.21212750931816480e-07, +-1.47557126963691602e-07, +-1.74984792004140550e-07, +-1.77195138842161572e-07, +-1.60061299675732385e-07, +-1.36648432782747354e-07, +-1.14423423923009358e-07, +-9.56761981979855666e-08, +-8.04311212793046968e-08, +-6.81047048914336980e-08, +-5.80890268721992291e-08, +-4.98869626425112072e-08, +-4.31151361261198405e-08, +-3.74806507652739498e-08, +-3.27585821568534038e-08, +-2.87746712473106206e-08, +-2.53926510912941002e-08, +-2.25050109243458649e-08, +-2.00262172572187398e-08, +-1.78876892923551667e-08, +-1.60340373020672304e-08, +-1.44202196810717335e-08, +-1.30093748215198146e-08, +-1.17711538266947010e-08, +-1.06804281100909495e-08, +-9.71628013695650317e-09, +-8.86120969788936570e-09, +-8.10050561434257110e-09, + 1.50325490355795920e-07, + 9.11805757818515331e-08, + 5.76197755875686438e-08, + 3.77161785733876863e-08, + 2.54348020824104118e-08, + 1.75646352521163606e-08, + 1.23775496884857654e-08, + 9.10957047025128530e-09, + 7.62522978897406385e-09, + 7.52838027147255745e-09, + 6.95614362785281301e-09, + 3.77212055795372392e-09, +-5.27315063298162158e-10, +-2.17914360803970658e-09, +-9.85375260452448296e-10, + 6.15883461457477302e-10, + 1.38304292533247420e-09, + 1.47105345891913065e-09, + 1.28752147591872321e-09, + 1.05725220748199745e-09, + 8.54736896568526151e-10, + 6.92258561788933111e-10, + 5.64675827292097595e-10, + 4.64398894255750043e-10, + 3.84992281802365451e-10, + 3.21555664776462295e-10, + 2.70437065820607012e-10, + 2.28908571099854940e-10, + 1.94914920067343513e-10, + 1.66892519879763416e-10, + 1.43640433350752257e-10, + 1.24227986685687912e-10, + 1.07927874644181516e-10, + 9.41671922346967217e-11, + 8.24913687460346393e-11, + 7.25371651419350949e-11, + 6.40124639834915376e-11, + 5.66808546310398820e-11, + 5.03499345149710162e-11, + 4.48622223775686624e-11, +-3.92480346848312062e-09, +-2.17950875820357041e-09, +-1.26819086311857187e-09, +-7.68885446983817021e-10, +-4.84312161234354232e-10, +-3.16379358216710465e-10, +-2.08364562319800693e-10, +-1.18825454624624726e-10, +-3.14309706154024452e-11, + 5.99042301906396488e-12, +-8.53264182701347422e-11, +-2.19975546157029073e-10, +-1.72000783269171751e-10, + 6.44572051853168997e-12, + 8.89254595206483825e-11, + 6.15793371211611065e-11, + 1.75652368128810412e-11, +-5.17513199599912804e-12, +-1.14285165059178951e-11, +-1.10725307863595824e-11, +-9.11319813175638066e-12, +-7.18662261326048819e-12, +-5.63547244668635467e-12, +-4.44458742254394473e-12, +-3.53559862918256568e-12, +-2.83745848132581389e-12, +-2.29635052862373115e-12, +-1.87303787236480154e-12, +-1.53891770786134173e-12, +-1.27299597959277780e-12, +-1.05971019624752691e-12, +-8.87400044571261465e-13, +-7.47233292893890806e-13, +-6.32501444307755918e-13, +-5.38010952181094622e-13, +-4.59758255015944325e-13, +-3.94605481271626490e-13, +-3.40095431521123363e-13, +-2.94261414504455077e-13, +-2.55547937392721861e-13, + 1.00311666329806984e-10, + 5.11615750312683760e-11, + 2.74715263657175566e-11, + 1.54056289903487913e-11, + 8.94093852652006557e-12, + 5.42111166265179396e-12, + 3.86847015277951271e-12, + 3.74126008086658321e-12, + 3.21417029268476928e-12, +-8.10393895439419435e-13, +-6.27013945099563896e-12, +-2.93989345553028671e-12, + 6.45800100210787018e-12, + 6.46638462310553264e-12, + 4.88664937777981338e-13, +-2.00840620406806431e-12, +-1.43350716812157417e-12, +-5.22485302967958714e-13, +-7.02435862383895597e-14, + 6.77292290578504507e-14, + 8.58767463155160780e-14, + 7.29134527126633903e-14, + 5.66203363288740845e-14, + 4.31910270263950664e-14, + 3.30454095415733089e-14, + 2.54983416081358860e-14, + 1.98618996188730322e-14, + 1.56116653080073634e-14, + 1.23765824460531538e-14, + 9.89511463379212530e-15, + 7.96592597821166927e-15, + 6.45371607680731760e-15, + 5.27091478651656637e-15, + 4.32638691985551326e-15, + 3.57795223453001332e-15, + 2.97266471841960909e-15, + 2.48374345959800888e-15, + 2.08006914887648187e-15, + 1.75488083411466069e-15, + 1.48882477036458364e-15, +-2.51204877033468245e-12, +-1.18006376070105612e-12, +-5.87081492472794676e-13, +-3.07827269842338498e-13, +-1.68701119134800334e-13, +-8.78134532904342854e-14, +-2.50762892841050440e-14, + 5.88346650398675073e-15, +-6.58476280956745552e-14, +-2.15334548750629365e-13, +-9.66487956430678290e-14, + 3.23134102606463933e-13, + 2.23601923083072016e-13, +-1.85346842614239073e-13, +-1.75288409006155468e-13, +-1.38105988259544225e-14, + 3.69229453902769125e-14, + 2.45823497328531009e-14, + 9.06608991317222879e-15, + 1.97156682761041488e-15, +-1.92751205820544252e-16, +-5.91028824135054620e-16, +-5.41728596519615978e-16, +-4.18702911882095457e-16, +-3.10818327423345444e-16, +-2.34005084964195997e-16, +-1.68772892808060440e-16, +-1.27498754481431884e-16, +-9.94951652573880052e-17, +-7.34663201999544083e-17, +-5.75168653533869005e-17, +-5.06418920509774391e-17, +-3.41277637018141649e-17, +-3.09171955916991350e-17, +-1.94046552134799929e-17, +-1.54112926479618533e-17, +-9.59593604147941194e-18, +-1.08440145359026499e-17, +-8.94117041162503560e-18, +-4.48831787086894014e-18, + 6.17193690913448874e-14, + 2.67538013015566844e-14, + 1.23126601927196334e-14, + 5.97756483619682108e-15, + 3.13280587187294124e-15, + 2.14565439520385277e-15, + 1.73084488200201227e-15, +-2.24614370403239236e-16, +-4.33474859937081947e-15, +-2.91952133873011530e-15, + 1.13105860647529057e-14, + 8.91031467173073260e-15, +-1.34952300013198935e-14, +-7.04582341176323660e-15, + 5.24315462913227585e-15, + 3.49911902408496447e-15, + 1.28247974255516572e-16, +-5.85792978695501106e-16, +-3.47548869581155588e-16, +-1.22910140969848310e-16, +-3.05321716911254505e-17, +-1.22300315994500331e-18, + 3.82382950125577938e-18, + 3.11215279383104191e-18, + 5.63933155046936141e-18, + 3.86914077093529320e-18, + 2.13737111985305307e-18, + 3.34272602727378878e-18, + 2.11192311675424302e-18, + 1.65371509685085353e-18, + 1.64045760479126942e-18, +-1.77443977246796982e-18, + 5.60791453988570030e-19, + 4.25966107251331547e-19, + 2.60912480211092891e-18, + 2.57140123375957207e-18, + 4.47467212139937969e-18, + 1.56142778672753870e-18, + 2.04305218496871837e-18, + 4.19390095983608222e-18, +-1.48534225760122701e-15, +-5.89609263215351163e-16, +-2.57140502684644217e-16, +-1.05687830793145264e-16, +-4.82929975950198621e-17, +-4.15489419071291162e-18, +-1.71296952540042104e-17, +-9.73190932608519303e-17, +-1.01182857685179097e-16, + 2.42291264736279764e-16, + 3.76671099083474051e-16, +-5.77267730335607092e-16, +-3.17923684138867972e-16, + 4.88722204060795892e-16, + 1.12291991610749428e-16, +-1.19086012291492162e-16, +-5.37627932141777239e-17, + 7.24614836530663741e-19, + 5.37814923237770802e-18, + 5.80339275531649451e-18, + 7.81178387702680195e-19, + 2.70929665828080727e-18, + 7.77814164314488718e-19, + 1.40535554462262104e-18, +-9.27475589582064191e-19, + 1.59710487326775186e-18, + 3.33427468263284876e-18, + 2.55951532861783352e-18, + 1.61678980766057447e-18, + 2.84265267634511062e-18, + 4.14875906571126427e-18, +-1.40130291924316483e-18, + 4.01422057055047890e-19, +-1.15166714557808909e-18, + 3.28738371301241312e-18, + 3.94062232888763663e-18, + 5.45201066906933580e-18, + 1.38854158376055058e-18, + 1.59723942841928939e-18, + 3.54099476951913564e-18, + 3.47068338607441559e-17, + 2.29892031442645414e-17, + 3.41241500008954769e-18, + 1.23396389219768968e-17, + 6.86418106930971363e-18, + 6.70665405085693429e-18, + 5.26157191006339838e-18, +-4.70747141463562179e-18, + 7.05065598256942080e-18, + 1.27028977798230371e-17, +-1.31655673923300144e-17, +-1.98459740605343333e-17, + 3.04383741827946365e-17, + 5.71827158917458998e-18, +-1.14697391338153576e-17, + 1.43675757718647013e-18, + 1.54737665520931377e-18, +-1.47685517550987241e-18, + 1.30542104659767390e-18, + 1.52810108527830451e-19, + 2.17091352259794301e-18, +-5.51194930214364242e-19, +-2.40894069596331851e-18, + 5.80889574615746037e-19, + 2.29644748609237982e-18, + 1.13848713111152256e-18, + 2.34010495733607595e-18, + 3.14933063350733691e-18, + 1.21778050869839756e-18, + 1.84879200066320572e-18, + 1.98875641263322008e-18, +-1.62760023655855549e-18, + 2.42611320497766070e-18, +-1.31946155957151757e-19, + 1.50248905243686191e-18, + 2.08496905656467937e-18, + 4.37807275942454092e-18, + 1.43756729983635410e-18, + 9.97811115114935142e-19, + 3.43606129801977040e-18, +-3.95722679985621534e-18, + 6.66894066497716535e-19, +-7.58028298370792232e-19, + 4.21446170764860791e-18, +-3.90011599146949553e-20, + 5.14807344497388830e-18, + 3.12044574964214371e-18, +-6.59790178724985139e-18, +-1.00987662110591811e-18, +-3.04050383879608883e-18, +-1.85049887914202653e-18, + 4.84484662796551282e-19, + 3.41744896940365796e-19, + 2.76636778062490704e-18, + 4.45131356461290267e-18, + 6.05064716938875988e-19, + 3.00978159500262873e-18, + 8.81054605334236969e-19, +-9.33268669903853200e-19, + 1.28873361160591112e-18, + 2.57111523167831144e-18, + 2.81971203829939727e-18, + 1.00832821159415787e-19, + 2.94065365593010691e-18, + 3.30104487665233566e-18, + 6.08537613124741388e-19, + 2.48695592149730767e-18, + 2.00941853995130558e-18, + 9.43383894104335556e-19, + 2.33058035768524567e-18, + 4.21956556423399170e-19, + 9.74893158970043273e-19, + 2.69398847470887854e-18, + 9.49943859671794362e-19, + 2.35060501139780277e-18, + 2.78530178866683698e-18, + 4.38315141669508942e-18, + 1.83785213040456130e-18, + 1.09518203359096623e-18, + 1.93520567148613569e-18, +-2.34516641422179837e-18, + 3.42098648421222220e-18, + 4.24115780897740721e-18, + 5.84552106704506721e-18, +-1.55902440973073225e-18, +-6.05617809203539738e-19, + 1.89140303612504919e-18, +-2.61785932457237386e-19, + 2.74616282215123268e-18, + 1.80699877705308565e-18, + 1.53289630403599638e-18, + 1.24895065374757733e-19, +-3.59373165360436101e-19, + 1.27266254721890767e-18, + 3.38980048352725628e-19, +-3.22983385946728426e-18, +-4.33623757721633774e-19, + 9.45866115551121416e-19, +-1.85217410049852163e-18, +-6.08589268195793110e-20, +-2.70899559684121711e-18, +-1.88192628335414713e-18, + 1.91705898200763850e-18, +-7.43767173778712089e-19, + 2.29531959274649386e-18, + 1.00133711040272156e-18, + 1.82607377420553047e-18, + 2.41784500012462995e-18, + 1.43380642371260675e-18, + 1.85307489593242713e-18, + 2.65854273106219380e-18, +-1.07654457412994802e-20, + 1.36897739335719007e-18, + 1.80571964781922360e-18, + 1.47093021670405904e-18, + 1.11145012571945627e-18, + 2.05078655261296940e-18, + 2.14368003973839369e-18, + 6.88872002195034400e-19, + 6.87958224003516121e-19, +-6.22041602880731394e-18, +-7.64587006833978702e-18, +-5.48774183368390299e-18, +-8.37656876921197012e-19, +-5.87061730746693502e-19, + 8.11238799649424547e-19, +-3.28893502779472999e-19, +-2.05995717875303461e-18, + 1.18146580734389984e-18, +-9.70489970681788039e-19, +-1.04774319600662266e-18, +-5.53542717815752256e-19, +-1.10117586359026580e-18, +-8.88263764088740590e-19, +-1.35416470012877397e-18, +-5.20318272216055354e-19, +-3.49973135942851420e-18, + 1.63357737902651765e-19, +-2.31395969424081500e-18, +-2.61934205489995455e-18, +-1.29036429434966303e-19, +-1.65333715268390181e-18, + 7.32054931427139363e-20, + 3.22026315296607831e-19, + 7.17049640278748011e-19, + 1.19907682412935655e-18, +-1.08977627598889600e-18, +-4.33708409394359066e-19, +-1.74084336015268503e-19, +-7.42540129741952636e-19, +-5.89931836998987059e-19, +-1.62029079079726603e-18, +-1.06310982576421144e-18, +-2.66066013135678412e-18, +-1.07668704713236506e-18, +-1.04238556755736526e-18, + 4.53877635754785980e-19, +-1.32540865189106852e-18, +-1.17685083168276637e-18, + 1.80730517571485403e-19, +// nroots = 9 +// root 0 + 9.81997283116290198e-01, + 9.79249882507517877e-01, + 9.75842104339020855e-01, + 9.71555754925114701e-01, + 9.66083156794439790e-01, + 9.58987196807463693e-01, + 9.49647901750687806e-01, + 9.37202728293555665e-01, + 9.20512992965333954e-01, + 8.98241353196059245e-01, + 8.69184448800250253e-01, + 8.32947748766433627e-01, + 7.90685435016646232e-01, + 7.45159727196668342e-01, + 6.99699613931746400e-01, + 6.56843087495890265e-01, + 6.17783290574604682e-01, + 5.82685811081050553e-01, + 5.51228358098928783e-01, + 5.22956535337698480e-01, + 4.97434389723130310e-01, + 4.74285827918293046e-01, + 4.53195951070353431e-01, + 4.33902117451859803e-01, + 4.16184295846767971e-01, + 3.99856938545183505e-01, + 3.84762518667547293e-01, + 3.70766440276590448e-01, + 3.57753013310044166e-01, + 3.45622246531325783e-01, + 3.34287271747569670e-01, + 3.23672259081876690e-01, + 3.13710717462334365e-01, + 3.04344099761295062e-01, + 2.95520650714919675e-01, + 2.87194449708679522e-01, + 2.79324611026141589e-01, + 2.71874612144748840e-01, + 2.64811726779986545e-01, + 2.58106544101826874e-01, +-1.23469344320924820e-03, +-1.52073283997695530e-03, +-1.89821752706111047e-03, +-2.40387866663800080e-03, +-3.09110509191923158e-03, +-4.03669429786531093e-03, +-5.34719632998565189e-03, +-7.15764439671786462e-03, +-9.60390630925383321e-03, +-1.27354020025285501e-02, +-1.63483029807900658e-02, +-1.98295150224002577e-02, +-2.22804479187071157e-02, +-2.30605742568893400e-02, +-2.22635606797192756e-02, +-2.05340790450580964e-02, +-1.85213420517701191e-02, +-1.65953717119856937e-02, +-1.48866700307901563e-02, +-1.34080721366703678e-02, +-1.21336415542465728e-02, +-1.10312498877543647e-02, +-1.00722367210915858e-02, +-9.23299980566363518e-03, +-8.49444069877138691e-03, +-7.84108570415040229e-03, +-7.26031636063604723e-03, +-6.74176521759840917e-03, +-6.27685167443766713e-03, +-5.85842495157830410e-03, +-5.48048744705048607e-03, +-5.13797855825335204e-03, +-4.82660434498094568e-03, +-4.54270225502899968e-03, +-4.28313290039640353e-03, +-4.04519287397208174e-03, +-3.82654405813579075e-03, +-3.62515595380046018e-03, +-3.43925835940401756e-03, +-3.26730233013133647e-03, +-3.11610041656984956e-05, +-4.08032449658493382e-05, +-5.42267968648544693e-05, +-7.31475204829891965e-05, +-1.00044239168546858e-04, +-1.38292644303407105e-04, +-1.91839905053260110e-04, +-2.63415845043905319e-04, +-3.49410603410289593e-04, +-4.30161954067623275e-04, +-4.61722718452304887e-04, +-3.90913187702737579e-04, +-2.08898019168037117e-04, + 1.16392411069969435e-05, + 1.74487037695184347e-04, + 2.45486805694664848e-04, + 2.51131442950381322e-04, + 2.28263984197246927e-04, + 1.98833813169566525e-04, + 1.71346636410174677e-04, + 1.47862140697433537e-04, + 1.28259959904158309e-04, + 1.11922022460518461e-04, + 9.82334694420251625e-05, + 8.66868025122577950e-05, + 7.68807462210507268e-05, + 6.84996419600239536e-05, + 6.12938398193319808e-05, + 5.50643396115218879e-05, + 4.96512351895897505e-05, + 4.49250467990154763e-05, + 4.07801764347118714e-05, + 3.71299228974664191e-05, + 3.39026512983621540e-05, + 3.10388248639815521e-05, + 2.84886866794421513e-05, + 2.62104355486008153e-05, + 2.41687805744534995e-05, + 2.23337882475487636e-05, + 2.06799570960627935e-05, +-6.80892903593853317e-07, +-9.41041785477522161e-07, +-1.31825235491333477e-06, +-1.86722796915769299e-06, +-2.65977620829450745e-06, +-3.76842513399255978e-06, +-5.19827768032681007e-06, +-6.69820081357579094e-06, +-7.39435329546906691e-06, +-5.47754339786530456e-06, + 9.95017294088579162e-07, + 1.09996349132079758e-05, + 1.82912897055188872e-05, + 1.70583693631717808e-05, + 9.65704346590510261e-06, + 2.60952102914464793e-06, +-1.15736482719811224e-06, +-2.37529326250561203e-06, +-2.42988062517526355e-06, +-2.13011855546264835e-06, +-1.78753971588050812e-06, +-1.48808542435184484e-06, +-1.24300562039946461e-06, +-1.04501323038703633e-06, +-8.84624889914010426e-07, +-7.53800550586220779e-07, +-6.46279752080785967e-07, +-5.57262650121426388e-07, +-4.83057673957614119e-07, +-4.20803399797363151e-07, +-3.68262831857324122e-07, +-3.23672582675752491e-07, +-2.85631693766155486e-07, +-2.53018952276139340e-07, +-2.24930832479346126e-07, +-2.00634504678362771e-07, +-1.79531953907526939e-07, +-1.61132365583021397e-07, +-1.45030714569221379e-07, +-1.30891047809907297e-07, +-1.34621336147763223e-08, +-1.94332412802892540e-08, +-2.82644081167360445e-08, +-4.10897615683330275e-08, +-5.87660772094188572e-08, +-8.00483065432140360e-08, +-9.65631654087359527e-08, +-8.26453591818538595e-08, + 1.42895873268086970e-08, + 2.48337878343411182e-07, + 5.54538088074687170e-07, + 6.26810991611196350e-07, + 2.14632888031773481e-07, +-3.38695216569570569e-07, +-5.10585767212620588e-07, +-3.42498116371387470e-07, +-1.39551548051500192e-07, +-2.76136294351903239e-08, + 1.29401843113523851e-08, + 2.17172594888730809e-08, + 2.03897974451183424e-08, + 1.69788331810279798e-08, + 1.37425706791226825e-08, + 1.11042040211238009e-08, + 9.02500032928680093e-09, + 7.39041391956538484e-09, + 6.09743421463291210e-09, + 5.06642812480946812e-09, + 4.23767171686540209e-09, + 3.56638632406314867e-09, + 3.01875059172161358e-09, + 2.56899184592387936e-09, + 2.19729693827221023e-09, + 1.88830629617618363e-09, + 1.63001917325670204e-09, + 1.41298914103679582e-09, + 1.22972866782122624e-09, + 1.07426354035023863e-09, + 9.41797620727673619e-10, + 8.28457542976649504e-10, +-2.43463183021425672e-10, +-3.61120440267962715e-10, +-5.31526078956295179e-10, +-7.59264266822644190e-10, +-1.00209482129102024e-09, +-1.06677796708864577e-09, +-3.87737072275084302e-10, + 2.21780198400618756e-09, + 8.01714242777024714e-09, + 1.50297204876399412e-08, + 1.28790052290399198e-08, +-8.39031283687225390e-09, +-2.95943705465381284e-08, +-2.05728974175127391e-08, + 2.55566052250123668e-09, + 1.13420104202733629e-08, + 8.04040196199473210e-09, + 3.43006143898109944e-09, + 9.68583845860345431e-10, + 7.74375266635800681e-11, +-1.51961012583010493e-10, +-1.73763666628069695e-10, +-1.47378908199330962e-10, +-1.17022892996270174e-10, +-9.18798032884656609e-11, +-7.24203354885150207e-11, +-5.75205644149508775e-11, +-4.60609248591138335e-11, +-3.71751821266187904e-11, +-3.02256923234523474e-11, +-2.47454782354075653e-11, +-2.03900972760792209e-11, +-1.69032433801242224e-11, +-1.40926165940213694e-11, +-1.18123410716266871e-11, +-9.95109485137912872e-12, +-8.42314275385171640e-12, +-7.16204994273192679e-12, +-6.11580680093297748e-12, +-5.24361053152949437e-12, +-3.99457520264675358e-12, +-5.91067054855395885e-12, +-8.34317298309104695e-12, +-1.04125278448601661e-11, +-8.65969031461275743e-12, + 6.89649100552100206e-12, + 5.78941929689795673e-11, + 1.69996702270013960e-10, + 3.04930331176119436e-10, + 2.05523256823113983e-10, +-4.81828532862912370e-10, +-1.15204570479266900e-09, +-3.41738434006883450e-10, + 9.41201302503695407e-10, + 7.52946628712803622e-10, + 2.38083770854000198e-11, +-2.15782435020585314e-10, +-1.49472257470268469e-10, +-6.21278668157665981e-11, +-1.86164199420016053e-11, +-3.41521889836913692e-12, + 6.37479709125399623e-13, + 1.30901841153495498e-12, + 1.17299892415198592e-12, + 9.22867241765842015e-13, + 7.07232849972334520e-13, + 5.42179592804260319e-13, + 4.18687793047585169e-13, + 3.26108040006324277e-13, + 2.56196019932276247e-13, + 2.02845766186402361e-13, + 1.61830172454414070e-13, + 1.30055715068633523e-13, + 1.05167822846414464e-13, + 8.56000157135640181e-14, + 7.01052629131374196e-14, + 5.77176317145915534e-14, + 4.77661008928967867e-14, + 3.97303015624868627e-14, + 3.31730318271199610e-14, +-5.74774970380362990e-14, +-7.92856395480681995e-14, +-9.02083087142947084e-14, +-3.95716648583898423e-14, + 2.19572048652880170e-13, + 1.01929977066149340e-12, + 2.80726765830644176e-12, + 5.08770774348247376e-12, + 3.07427406315904071e-12, +-1.30014939016255327e-11, +-3.30774732990166978e-11, +-2.96946576645267109e-12, + 5.38596965546830213e-11, + 2.24126382394321759e-11, +-2.70429942087992025e-11, +-1.85240437254037401e-11, +-6.63622819278186896e-13, + 3.65375635786543294e-12, + 2.32347890796850093e-12, + 9.15707277888585164e-13, + 2.72811972425842969e-13, + 5.88837738417342819e-14, + 2.27089403757500309e-15, +-8.59372493557812326e-15, +-8.59208665934854068e-15, +-6.75352904896805879e-15, +-5.06353743354189623e-15, +-3.79143284288423999e-15, +-2.84726770525068445e-15, +-2.13157524332030479e-15, +-1.64465739082705682e-15, +-1.28388874488270336e-15, +-9.78046607935591841e-16, +-7.86027191163314725e-16, +-6.17529543260948227e-16, +-4.68763470675119109e-16, +-3.58126719796458960e-16, +-3.08544037454928475e-16, +-2.43239909814009871e-16, +-2.06200127540287723e-16, +-5.90356430474983055e-16, +-6.34404267883454770e-16, + 1.92871043371537473e-16, + 3.65130133074037016e-15, + 1.42542227735277459e-14, + 3.85428706600452772e-14, + 7.24724288062282627e-14, + 4.77095595688337684e-14, +-2.35193455219286162e-13, +-7.49426544709026046e-13, +-1.50372626963346021e-13, + 1.98371164457424446e-12, + 6.86757658367135612e-13, +-2.08792748664415860e-12, +-5.40792514718324523e-13, + 6.91476416406457325e-13, + 3.30107934868512102e-13, +-1.22025728980698164e-15, +-5.47939692451657682e-14, +-3.09343189957247643e-14, +-1.14139294060676386e-14, +-3.32825667646926682e-15, +-7.37124527334396312e-16, +-7.33494104694119345e-17, + 6.24047115635817655e-17, + 7.10471066332884275e-17, + 4.63549010989259594e-17, + 4.03912116944716461e-17, + 2.13485338799240292e-17, + 3.13351533667971382e-17, + 2.72921371051248047e-17, + 7.05526991638630973e-18, + 1.66348212531036372e-17, +-1.37220675699097563e-17, +-1.38116532374686999e-17, + 1.26880810944509521e-17, + 2.60083381571359590e-17, + 4.27291878935263729e-19, + 1.46715995249825169e-17, +-4.91955302008823224e-18, + 3.37877479864158574e-17, + 1.88554952256420513e-17, + 6.92506249898678972e-17, + 1.59118038457007390e-16, + 4.81275315398036393e-16, + 9.61638174653001304e-16, + 6.68683100923452591e-16, +-3.09895293903961456e-15, +-1.32609155240256307e-14, +-8.76409215290343293e-15, + 4.89905018744112542e-14, + 3.77043198714053018e-14, +-1.00750002526908181e-13, +-1.28734441390635192e-14, + 6.33458154731091347e-14, + 3.07990761605860363e-15, +-1.38515303997904687e-14, +-4.36239300976738437e-15, + 2.69618906451304120e-16, + 7.45248730813929685e-16, + 4.04526507851236695e-16, + 1.09971636411350211e-16, + 4.49443827273555641e-17, + 1.78833885667622430e-17, + 2.68377422751430431e-18, + 3.08160842269292737e-18, + 1.18787094944825610e-17, + 2.28426321353740028e-17, + 7.29221424017413496e-18, + 2.77689653327636249e-17, + 9.40345451937401933e-18, + 4.73965454036985452e-18, + 5.79511772039714585e-18, +-5.11081164661702490e-18, + 1.28740883543624982e-17, + 2.82002615041409115e-17, + 3.23189574223353654e-17, + 7.24644771975474896e-18, + 1.04191315603028136e-17, + 7.20224429933918250e-18, + 4.64762489283778963e-17, + 1.05291889517652234e-17, + 8.39973600935627651e-18, +-1.23698969508530048e-17, + 2.87240494519650657e-17, + 2.48386347976315825e-17, +-6.76396035482296423e-17, +-1.80819442160780566e-16, +-2.91440862419737151e-16, + 7.57415391435844714e-16, + 1.63741489439741481e-15, +-2.92359552094967024e-15, +-1.51981597307392653e-15, + 4.18117866834836515e-15, +-7.47853160439525722e-16, +-1.22271972566995050e-15, + 1.14719418019537235e-16, + 2.14405022728284465e-16, + 4.68104956904392167e-17, + 2.10991729224911268e-17, +-3.79357327482794170e-18, +-2.12737055574403559e-17, + 9.47469485950447701e-18, + 1.86442933893894009e-17, + 9.22057618183580772e-18, + 2.29497497429492834e-17, + 2.86535831966043133e-18, + 8.23790263341092931e-18, +-1.68289173910588619e-17, + 2.04200842177091976e-18, + 5.10553948253070403e-18, + 1.06344096226483436e-17, + 1.83534167960117333e-17, +-8.67187495746236351e-18, +-5.12239772105377034e-18, + 3.22472521409247473e-18, + 2.33436948950216581e-17, + 1.12550965898746738e-17, + 1.32629041380575179e-17, + 8.80970865668165470e-18, + 2.58639874787239310e-17, + 3.01787470270129791e-18, + 1.10013571512193662e-17, +-6.22904841442725939e-18, + 4.51848494864139168e-18, + 1.50874953168078062e-17, +-4.29600764751432238e-17, + 3.76972352221301899e-18, +-3.13582573148921728e-17, + 6.93890704541551850e-17, +-2.09129339588842748e-17, +-1.52001634913111242e-16, + 1.69348544273802528e-16, + 8.46413347500468271e-18, +-7.09260471309139818e-17, + 6.68485863433878066e-17, + 2.97385695003452423e-17, + 1.76975963202573370e-17, + 1.50899846944478295e-17, + 8.85305470322216576e-18, + 3.91765153111135044e-17, + 4.39244221992834612e-18, + 1.59112677957962145e-17, + 2.13946007513978347e-17, + 8.48215204903964733e-18, + 8.18822261374422524e-18, + 1.40732425853498088e-17, + 1.33409973231929202e-17, + 5.75854209697288009e-18, + 2.48008075906278691e-17, + 1.16059069355989831e-17, + 2.94938361151841564e-18, + 1.87882154042893345e-17, +-5.71818696321507348e-18, + 4.56901096150727111e-18, + 2.29902933849014000e-17, + 2.13648243271646279e-17, + 4.72993981435780487e-18, + 5.60619452732487898e-18, +-4.81740505709802363e-19, + 1.23244834838816478e-17, + 5.04068027984788479e-18, + 2.98865421386419466e-17, + 1.35886706968362069e-17, +-1.82858368506065085e-18, + 1.88202240905026421e-17, +-2.72794877162023374e-17, + 1.34473015251348716e-18, + 8.82534993918982878e-18, + 2.57203019599481844e-17, + 7.47826990184296097e-18, +-1.35075150332400659e-17, + 2.73237101402517007e-17, +-1.21059508426461242e-18, + 1.12837230871202035e-18, +-1.65051363288472234e-17, + 6.02876722878928829e-18, +-2.50276668759347211e-17, +-1.54026684372010633e-17, + 2.41865164777073659e-18, +-2.68807436144522172e-19, +-9.26014334680009844e-18, + 6.84989158813368770e-18, + 3.10609620032156719e-18, +-3.53477866465549815e-18, +-1.79369881662536798e-18, + 1.90417399794735140e-17, + 2.41401148741000709e-17, + 2.28780749497736236e-18, + 2.34603181349920401e-17, + 2.02904275895183816e-17, + 6.73845775663186025e-19, + 1.18812161310232431e-17, + 3.62441076821963730e-18, + 2.61977416569235464e-18, + 1.07833222901847230e-17, + 2.27805536641403662e-17, + 6.68613462707946089e-18, + 1.34527826314389361e-18, + 1.43106576556664347e-18, + 5.88901370116390382e-18, +-2.96419104260850232e-18, +-6.94808188968325236e-18, + 3.19908692064653826e-18, + 8.85571325174671973e-18, + 1.77352616987717238e-17, +-8.97648550501139616e-18, + 1.91452810449871236e-17, +-2.54572606313551022e-17, + 4.83793817477443332e-18, +-3.97831100203344679e-18, +-1.38125116826105552e-17, + 1.07448713462919207e-17, +-1.87032083332351379e-17, +-1.92023135394669609e-17, +-4.21621172875722798e-17, +-2.98540036923611393e-17, +-1.92140659714545610e-17, +-3.09810219663319561e-17, +-6.90510839840368566e-18, +-1.49261898747692976e-17, +-2.49563898206116306e-17, +-8.24467357917729456e-18, + 8.48283642476215383e-19, +-1.00107690405887429e-17, +-1.16669153577902420e-17, +-3.19681938304406490e-17, +-2.22999821420655378e-17, +-2.43130315702851640e-17, +-1.02481368518369928e-17, +-4.28327571765607201e-18, +-2.04652061329713661e-17, +-1.43012190981227601e-17, +-7.18802623236362365e-18, +-7.81284727727636589e-18, +-9.61054786096796731e-18, +-7.32095210775030470e-18, +-9.63798574856592434e-18, +-1.48400529089262842e-17, +-1.06198551641543296e-17, + 9.25358067681295547e-03, + 9.18196910961608802e-04, + 9.34520065062515912e-05, + 9.82472850692770182e-06, + 1.07740746527631943e-06, + 1.24960633338495669e-07, + 1.56345701317403571e-08, + 2.17072704274824519e-09, + 3.48017326254179805e-10, + 6.79300206102278012e-11, + 1.71791769726601094e-11, + 5.94794883628456315e-12, + 2.87168211117682096e-12, + 1.85572065797204248e-12, + 1.47249763127561643e-12, + 1.31240134039465686e-12, + 1.23498667345353038e-12, + 1.18795362026142101e-12, + 1.15229020988424654e-12, + 1.12155769478709789e-12, + 1.09366440735837509e-12, + 1.06787649685101215e-12, + 1.04385869545017807e-12, + 1.02139798604343079e-12, + 1.00032887383262863e-12, + 9.80512474832237477e-13, + 9.61829190717909982e-13, + 9.44174946072684821e-13, + 9.27458599643501077e-13, + 9.11599930956178049e-13, + 8.96528010162547109e-13, + 8.82179858173381122e-13, + 8.68499336085433210e-13, + 8.55436218598273423e-13, + 8.42945416390000235e-13, + 8.30986319941861110e-13, + 8.19522243009995670e-13, + 8.08519948338689169e-13, + 7.97949241626310021e-13, + 7.87782622430889101e-13, +-9.25080266969007664e-03, +-9.11037470806357508e-04, +-9.18271392406321403e-05, +-9.53080820526898748e-06, +-1.02713476947413040e-06, +-1.16267439768540742e-07, +-1.40459289561059861e-08, +-1.85111702200636905e-09, +-2.74016752347670719e-10, +-4.72151012498522131e-11, +-9.81876168656052257e-12, +-2.51876660118179536e-12, +-7.87652707024373358e-13, +-2.86045659599928853e-13, +-1.14866059453074830e-13, +-5.16007868018615787e-14, +-2.82218480269906333e-14, +-1.96734642588577271e-14, +-1.62746829425730425e-14, +-1.45491365451934620e-14, +-1.33769805398745788e-14, +-1.24269007621172489e-14, +-1.16016004323253077e-14, +-1.08676152768336233e-14, +-1.02086870889391631e-14, +-9.61391644251052112e-15, +-9.07477056290869309e-15, +-8.58420704624828447e-15, +-8.13630616889187424e-15, +-7.72604742853202674e-15, +-7.34914576872999300e-15, +-7.00192364657972722e-15, +-6.68120890620200842e-15, +-6.38425239434572499e-15, +-6.10866099986294248e-15, +-5.85234287133659171e-15, +-5.61346232563385514e-15, +-5.39040252152963100e-15, +-5.18173439524838852e-15, +-4.98619067628090081e-15, + 2.55051347732503575e-03, + 2.49139283771635043e-04, + 2.48533555349480101e-05, + 2.54525870579759463e-06, + 2.69492565284066369e-07, + 2.97846066712252423e-08, + 3.48126706693346724e-09, + 4.37965497252076383e-10, + 6.06934918957142888e-11, + 9.53266303207333130e-12, + 1.75080365109315357e-12, + 3.86746382648893303e-13, + 1.04322031950719283e-13, + 3.38094210594811094e-14, + 1.23057651510346546e-14, + 4.58700369308622257e-15, + 1.67142344740885109e-15, + 6.25906814761143498e-16, + 2.79985706928792596e-16, + 1.68975922284511828e-16, + 1.29148438551002686e-16, + 1.09866127054340913e-16, + 9.69955125291082947e-17, + 8.67789518015862557e-17, + 7.81471602040921127e-17, + 7.06995996870348488e-17, + 6.42145726722748733e-17, + 5.85337798498607595e-17, + 5.35326302087698989e-17, + 4.91099092944406762e-17, + 4.51823373566958112e-17, + 4.16808519437898735e-17, + 3.85478121201681564e-17, + 3.57348291123499415e-17, + 3.32010606899909241e-17, + 3.09118586233696109e-17, + 2.88376883728606519e-17, + 2.69532605003582366e-17, + 2.52368279704403741e-17, + 2.36696143244523413e-17, +-4.82721537769455243e-04, +-4.67898985404050402e-05, +-4.62260931137015510e-06, +-4.67593376261603040e-07, +-4.87203596704201398e-08, +-5.27132137420134965e-09, +-5.98698749390549894e-10, +-7.24213854174242741e-11, +-9.50798260124063191e-12, +-1.38677116930365002e-12, +-2.30672535906571165e-13, +-4.48743649016934971e-14, +-1.04243943483603958e-14, +-2.94401125060217466e-15, +-1.00416040206064378e-15, +-3.79471980917044708e-16, +-1.40481140813541364e-16, +-4.78830378890168603e-17, +-1.53074386754721733e-17, +-5.08448390326459750e-18, +-2.11934689776216156e-18, +-1.24829996936426236e-18, +-9.37295072492606258e-19, +-7.77257462509829448e-19, +-6.66087165650977439e-19, +-5.77941754360176893e-19, +-5.04925499632730146e-19, +-4.43483283258992718e-19, +-3.91352473039737963e-19, +-3.46847036330824254e-19, +-3.08643725769485763e-19, +-2.75684742924901769e-19, +-2.47116288270126558e-19, +-2.22244160128053330e-19, +-2.00500245084944675e-19, +-1.81416805945031717e-19, +-1.64606561315772542e-19, +-1.49747130520315023e-19, +-1.36568800587566720e-19, +-1.24844843404676084e-19, + 6.94739912157775653e-05, + 6.68606430299230135e-06, + 6.54717422705060002e-07, + 6.54910243622820217e-08, + 6.72672141488304566e-09, + 7.14334463011820929e-10, + 7.91486991665067766e-11, + 9.26146106036042808e-12, + 1.16257889145403323e-12, + 1.59645491166085252e-13, + 2.45280450346372218e-14, + 4.31248539111414458e-15, + 8.82479950571255403e-16, + 2.12801315340121458e-16, + 6.26588827668126725e-17, + 2.28423824963542280e-17, + 9.03583006562808594e-18, + 3.33479484113266075e-18, + 1.09265144998712395e-18, + 3.23741655330774622e-19, + 9.25416142272736485e-20, + 2.94469807271096404e-20, + 1.28308408975541967e-20, + 8.00955942171709502e-21, + 6.10011203524430227e-21, + 4.98686188711589764e-21, + 4.17351749554957114e-21, + 3.52888839201772867e-21, + 3.00418367267694738e-21, + 2.57216988583024956e-21, + 2.21378769540272277e-21, + 1.91460006686806917e-21, + 1.66338244917006372e-21, + 1.45130305987883361e-21, + 1.27135542167483931e-21, + 1.11794143998188758e-21, + 9.86558888769142850e-22, + 8.73564230503883812e-22, + 7.75992302608649316e-22, + 6.91415625811531321e-22, +-8.06548998796377219e-06, +-7.71119396700862766e-07, +-7.49023173416325179e-08, +-7.41731581213135982e-09, +-7.52185550636929375e-10, +-7.85759667623635017e-11, +-8.52149221255591218e-12, +-9.69251445788372312e-13, +-1.17163192728164643e-13, +-1.53026827485236625e-14, +-2.20213495765417186e-15, +-3.56522768395365083e-16, +-6.61255701051562291e-17, +-1.41002236553134510e-17, +-3.45497151755440748e-18, +-1.06689567755668213e-18, +-4.26433262820299288e-19, +-1.75701653131055730e-19, +-6.39335149782326284e-20, +-2.01757491295807220e-20, +-5.67837052720039487e-21, +-1.49481612183843175e-21, +-4.04875615614405857e-22, +-1.36601130035787412e-22, +-6.82216291629754028e-23, +-4.63583573308625920e-23, +-3.58715893049524337e-23, +-2.89515031963954404e-23, +-2.37319958271930148e-23, +-1.96217625165492595e-23, +-1.63326151949024166e-23, +-1.36766141523208434e-23, +-1.15164349682042915e-23, +-9.74807038791765229e-24, +-8.29186335386876646e-24, +-7.08583504120474602e-24, +-6.08174101956838184e-24, +-5.24161962626815747e-24, +-4.53512313243260796e-24, +-3.93857709775051893e-24, + 7.84776136063725071e-07, + 7.45778264290108971e-08, + 7.19090356987331153e-09, + 7.05638137777174038e-10, + 7.07465138037123464e-11, + 7.28393426271431135e-12, + 7.75282746787931642e-13, + 8.60533153428275767e-14, + 1.00732419366753962e-14, + 1.26125816214968644e-15, + 1.71800622013159829e-16, + 2.59400637506176041e-17, + 4.42596420744121716e-18, + 8.66091547823637419e-19, + 1.88762585919986642e-19, + 4.53067442711185640e-20, + 1.52597363687379325e-20, + 6.86265224075116574e-21, + 2.88716464685843352e-21, + 1.02117930482660099e-21, + 3.09607760981565857e-22, + 8.34426479305470329e-23, + 2.07920473713709068e-23, + 5.11322307457189156e-24, + 1.43768342846570389e-24, + 5.75962403295857720e-25, + 3.40423503062966846e-25, + 2.46783706079315416e-25, + 1.91843440538478569e-25, + 1.52615089395384298e-25, + 1.22798399356684481e-25, + 9.95219293839169473e-26, + 8.12114556476310093e-26, + 6.66981899316524541e-26, + 5.50821241998214990e-26, + 4.57771863258070728e-26, + 3.82567743622733520e-26, + 3.20409013746761761e-26, + 2.70661597574287003e-26, + 2.28421000493221705e-26, +-6.57357985394507026e-08, +-6.21222279435404765e-09, +-5.94972196796596090e-10, +-5.79046554659729860e-11, +-5.74630143249227592e-12, +-5.84047652792442474e-13, +-6.11498233549002512e-14, +-6.64473432112409071e-15, +-7.56621453411221111e-16, +-9.13851758928092033e-17, +-1.18815132013942132e-17, +-1.69085129134496493e-18, +-2.67859733518395784e-19, +-4.82879875530250716e-20, +-1.00285886145723312e-20, +-2.11099547883904946e-21, +-4.76752429916053228e-22, +-1.94226004127622535e-22, +-9.80817447274124593e-23, +-4.08973778844635977e-23, +-1.38950473241201352e-23, +-4.03928308126301818e-24, +-1.04590318690729048e-24, +-2.49658465122132877e-25, +-5.75867512818076626e-26, +-1.42357160155915550e-26, +-4.69664276969430072e-27, +-2.32457695936779797e-27, +-1.56456959623649968e-27, +-1.18773545197656332e-27, +-8.83347314938495513e-28, +-7.16866556733120521e-28, +-5.96169098215065974e-28, +-4.54217414241383941e-28, +-3.57359975019516410e-28, +-2.79734916691470069e-28, +-2.06462000127019051e-28, +-2.16155788059906012e-28, +-9.66883254325174675e-29, +-1.28769829711185858e-28, + 4.83489988773165781e-09, + 4.54569414817840397e-10, + 4.32683234292271776e-11, + 4.17955214111035249e-12, + 4.10954865924249411e-13, + 4.12905216835438669e-14, + 4.26063905212821964e-15, + 4.54440938795784376e-16, + 5.05204241330772312e-17, + 5.91566887729081704e-18, + 7.39053851082659069e-19, + 9.99973482178035877e-20, + 1.48787272459185174e-20, + 2.46447060476247222e-21, + 4.78931882767210217e-22, + 1.04903305512725555e-22, + 1.84364990865179768e-23, + 4.04451612200081810e-24, + 2.33268512203302741e-24, + 1.25859684287971378e-24, + 5.05651381506896117e-25, + 1.63786737561425567e-25, + 4.56766496897024699e-26, + 1.13770883954770680e-26, + 2.62820821067064630e-27, + 6.33603133179633198e-28, + 1.94974190375200357e-28, + 8.76871843812060603e-29, + 5.36599339488054379e-29, +-1.56739754145665854e-29, + 2.98958877933300947e-29, +-7.51021923949705467e-30, +-9.94252484233933681e-30, + 5.44058668595084690e-30, +-9.98486883246416011e-30, + 1.14792056352414878e-29, + 4.10436695753871655e-29, +-2.25794986375383312e-29, + 3.21929145552864876e-29, +-1.95804483801717670e-29, +-3.17027587585973685e-10, +-2.96649985437826158e-11, +-2.80770070670893019e-12, +-2.69362908473407755e-13, +-2.62645807230376308e-14, +-2.61176430208240236e-15, +-2.66030817925006165e-16, +-2.79132105947542362e-17, +-3.03877056683075988e-18, +-3.46382076118243930e-19, +-4.18085722064802796e-20, +-5.41512047885597458e-21, +-7.64220550099568536e-22, +-1.18434196503005345e-22, +-2.03913057753800948e-23, +-4.60161319761282065e-24, +-9.46259267190448188e-25, +-1.02115212583609618e-25, +-3.03009236212987116e-26, +-2.71620428018982776e-26, +-1.44787835782415510e-26, +-5.50846068484664793e-27, +-1.59894320619644648e-27, +-4.44788634344497426e-28, +-1.15207740310428846e-28, + 2.29603014340736032e-29, + 5.04439763512880485e-29, + 4.82424425627811343e-29, + 2.59817680883647658e-30, + 3.26588557025393026e-30, + 4.19935430824020441e-29, +-3.40830482290461783e-30, + 4.68599452990438527e-30, + 2.07968415909360435e-29, + 1.71093119009320074e-29, + 4.33944613475271251e-29, + 3.60852932804532254e-29, +-7.81364671106450029e-30, + 3.99172738768057017e-29, +-1.42637351900779638e-29, + 1.87564600046238332e-11, + 1.74735930112708340e-12, + 1.64519520462273223e-13, + 1.56848990712223959e-14, + 1.51779178753549581e-15, + 1.49528010882674807e-16, + 1.50551934664392246e-17, + 1.55683686334704105e-18, + 1.66387815904238395e-19, + 1.85256472816610106e-20, + 2.17009481135170505e-21, + 2.70605566370890126e-22, + 3.64139505043863495e-23, + 5.38865211946420255e-24, + 8.38512996166282401e-25, + 1.61319659899931128e-25, + 4.42257045634821553e-26, + 6.11512129467500206e-27, + 2.15045902217643285e-29, + 1.99949016336733580e-28, + 3.12979199659114503e-28, + 1.62190398758821491e-28, + 1.06319220965070822e-28, + 4.25163154303027389e-29, + 4.59286975627699625e-29, + 3.03736519302021000e-29, +-2.52596245296764638e-30, + 1.61423387199440029e-29, + 3.43759883691807318e-29, + 3.77469263757803690e-29, + 2.67314397523284417e-29, + 1.00974151911692270e-29, + 7.02791249446989173e-30, +-4.57565829634238134e-30, + 7.52732830873427834e-30, + 1.72581710395134551e-29, + 1.75014122636284530e-29, +-3.87308375297148510e-30, + 3.66933313144718066e-29, + 5.03192159094123673e-30, +-1.01107136685187559e-12, +-9.38062985518920408e-14, +-8.78952797923492585e-15, +-8.33162121108071524e-16, +-8.00657399805543719e-17, +-7.82141441735557322e-18, +-7.79330055533415200e-19, +-7.95507949096961883e-20, +-8.36439589980330567e-21, +-9.12258572911213976e-22, +-1.04100569970508472e-22, +-1.25608093921925064e-23, +-1.62056016936699306e-24, +-2.27671917659086613e-25, +-3.50685740506636382e-26, +-4.81683347208291567e-27, +-1.44912655880508895e-27, +-3.71894686040892277e-28, + 4.36139714452201517e-29, + 3.52212529540295157e-30, + 1.17753372439063298e-29, + 1.48678438831100514e-29, + 8.12231624157681706e-29, + 4.66641945133891608e-29, +-8.28003336083580693e-30, + 5.80148513260279159e-29, + 3.32313261812738590e-29, + 2.01813675827809124e-29, + 6.24961851789288727e-29, +-1.75410781806625577e-29, + 3.19013245932606354e-29, + 1.63163150638891936e-29, + 8.50374090848831976e-31, + 1.54273892762519500e-29, + 1.54486782631265274e-29, + 3.40744297485035804e-29, + 3.39991865271167650e-29, +-1.27891114352159950e-29, + 9.02029584866038166e-30, + 1.94849930287386926e-29, + 5.00586527135364963e-14, + 4.62668338203708484e-15, + 4.31560736229455864e-16, + 4.06922408980408187e-17, + 3.88575396824501659e-18, + 3.76667670471187931e-19, + 3.71777266645266678e-20, + 3.75132131666355880e-21, + 3.88757891402351096e-22, + 4.16272075010651698e-23, + 4.64201899569509402e-24, + 5.44219206073002015e-25, + 6.81041292873497544e-26, + 8.95043175630833239e-27, + 1.39798635273531473e-27, + 1.88842869032659987e-28, + 5.11910114761133470e-29, +-1.09517736197034559e-29, + 1.40969909235209119e-29, + 1.93933069283385265e-29, + 9.68093942058814355e-30, +-1.15195272468310482e-29, + 1.58331488175962047e-29, + 5.05083061579686564e-30, +-4.42938714897400172e-31, +-1.55738995745574705e-29, +-9.53321228427550793e-30, + 3.97872015085111940e-29, +-3.12533934060597087e-30, + 6.01860829837847795e-30, + 2.99834152063944902e-29, + 1.75112392582259615e-29, + 8.31856196178680735e-30, + 8.80389553078222596e-30, +-6.64550918546314831e-31, + 1.09939945416757969e-29, + 3.94151100902925051e-29, + 3.42205393984903293e-32, + 1.69745126557926619e-29, +-1.11608570703552416e-30, +-2.29384487971560117e-15, +-2.11426262733872926e-16, +-1.96290604898940461e-17, +-1.84033675721035229e-18, +-1.74753191878669120e-19, +-1.68316528807665419e-20, +-1.64751314067633524e-21, +-1.64967869133403357e-22, +-1.68736399452459607e-23, +-1.78614785056062784e-24, +-1.95144492497537443e-25, +-2.29990964271187496e-26, +-2.77636155346800381e-27, +-6.82329822176211118e-28, +-1.27249816894590520e-28, +-6.04948540805356580e-29, +-6.91579858309720360e-29, +-7.39076990618542878e-29, +-3.84270274419059283e-29, +-2.04261916758108922e-29, + 2.14443247452721353e-29, +-4.72270156188494615e-29, +-3.30016269947958489e-29, + 1.65012494499480472e-29, +-6.38634046777166962e-30, +-1.17657906602935308e-29, +-6.90873108105817068e-30, +-2.16386571994970976e-29, +-1.77663424174914294e-29, +-2.99744503921021668e-29, +-1.01156731712161652e-29, +-1.51928506915213459e-29, +-2.65313714165707155e-29, +-1.10581741700724142e-29, +-3.40038746091250689e-29, +-1.88772255798740504e-29, +-3.52175258447417799e-29, +-1.89389520895176306e-29, +-9.41348294468644949e-30, +-1.37530309934279802e-29, +// root 1 + 9.07912200793037139e-01, + 8.95236595530367496e-01, + 8.80197374232358665e-01, + 8.62368551463648769e-01, + 8.41327175222294721e-01, + 8.16723395358474713e-01, + 7.88381068220173731e-01, + 7.56406646871735533e-01, + 7.21258590858475435e-01, + 6.83727005621132089e-01, + 6.44819078018766811e-01, + 6.05616185998786527e-01, + 5.67181595700783414e-01, + 5.30508128105753429e-01, + 4.96414191911377145e-01, + 4.65387889127304333e-01, + 4.37522503272273766e-01, + 4.12614470474675199e-01, + 3.90326084360215153e-01, + 3.70303916753492612e-01, + 3.52231171975282920e-01, + 3.35839657111575929e-01, + 3.20905988454462165e-01, + 3.07244108835727003e-01, + 2.94698199554703721e-01, + 2.83136872289750485e-01, + 2.72448582483140633e-01, + 2.62538023283615640e-01, + 2.53323275072988241e-01, + 2.44733534511136691e-01, + 2.36707290627050065e-01, + 2.29190848631119715e-01, + 2.22137126498943877e-01, + 2.15504667276785439e-01, + 2.09256823298656053e-01, + 2.03361078387101130e-01, + 1.97788481553015844e-01, + 1.92513171364954994e-01, + 1.87511974490295774e-01, + 1.82764065254597763e-01, +-5.80824547659259793e-03, +-6.88778677231819715e-03, +-8.17388217275502767e-03, +-9.67745989272088269e-03, +-1.13828689574878815e-02, +-1.32309104168453553e-02, +-1.51064308875197579e-02, +-1.68439829054860164e-02, +-1.82620271775411624e-02, +-1.92159748917107229e-02, +-1.96349896456122254e-02, +-1.95123140770224711e-02, +-1.88698622083981402e-02, +-1.77596433713236058e-02, +-1.63083075519240492e-02, +-1.47139957446372639e-02, +-1.31632828087110652e-02, +-1.17631800044285077e-02, +-1.05439413589111450e-02, +-9.49478076857708519e-03, +-8.59189327518101835e-03, +-7.81119984721359659e-03, +-7.13210883411889186e-03, +-6.53784569460911461e-03, +-6.01487478538531919e-03, +-5.55223700006725936e-03, +-5.14099686420602716e-03, +-4.77381316526779079e-03, +-4.44461000796936029e-03, +-4.14832395617013416e-03, +-3.88070813502865500e-03, +-3.63817915491102071e-03, +-3.41769649635934123e-03, +-3.21666672288161131e-03, +-3.03286684817000640e-03, +-2.86438260199399801e-03, +-2.70955837394351671e-03, +-2.56695637688713132e-03, +-2.43532313918222703e-03, +-2.31356186007835272e-03, +-1.22914830867800352e-04, +-1.47418692340212576e-04, +-1.74333159741752933e-04, +-2.01312864492859988e-04, +-2.23990137191090792e-04, +-2.35913806701168325e-04, +-2.29878144246073050e-04, +-2.01079810161220368e-04, +-1.50707914551957256e-04, +-8.65135600071089799e-05, +-1.82148423261802606e-05, + 4.84799113099715307e-05, + 1.11316088755626915e-04, + 1.63940186467540064e-04, + 1.95067533394828382e-04, + 1.99951572119406833e-04, + 1.85800994062275518e-04, + 1.63759563855111096e-04, + 1.41304597144565106e-04, + 1.21442914562582669e-04, + 1.04723881175845663e-04, + 9.08248453882377086e-05, + 7.92523158390430086e-05, + 6.95588202612221321e-05, + 6.13825543585821265e-05, + 5.44389094855643639e-05, + 4.85042843332825945e-05, + 4.34018881840824203e-05, + 3.89908074470797836e-05, + 3.51578129113700838e-05, + 3.18112204918777577e-05, + 2.88762567138885460e-05, + 2.62915288527210891e-05, + 2.40063125705091452e-05, + 2.19784501497556686e-05, + 2.01727089462783368e-05, + 1.85594897239845903e-05, + 1.71138031598612060e-05, + 1.58144534725386280e-05, + 1.46433831862925703e-05, +-1.90895563782373675e-06, +-2.16389000514316699e-06, +-2.29224654255345207e-06, +-2.14777923062332926e-06, +-1.54607855800422314e-06, +-3.42764246035637724e-07, + 1.41703225591845916e-06, + 3.36864550151348579e-06, + 4.91860866909805572e-06, + 5.64359911706303845e-06, + 5.66536184128460642e-06, + 5.43521074215749420e-06, + 4.95833072365237481e-06, + 3.64365642246174015e-06, + 1.47305634048236869e-06, +-5.49542914016442940e-07, +-1.65225048227883074e-06, +-1.92416746836687652e-06, +-1.78259235087076435e-06, +-1.52272803266793660e-06, +-1.26884200428344681e-06, +-1.05432891941455464e-06, +-8.80285021870141324e-07, +-7.39990551205507065e-07, +-6.26402567970468033e-07, +-5.33763349401629998e-07, +-4.57627841570823450e-07, +-3.94595153560609543e-07, +-3.42050935466879557e-07, +-2.97968966204893904e-07, +-2.60765229650895351e-07, +-2.29191077779364086e-07, +-2.02254498047656362e-07, +-1.79161564691244325e-07, +-1.59272495343638667e-07, +-1.42068376597171687e-07, +-1.27125756763429218e-07, +-1.14097092272544308e-07, +-1.02695586712631267e-07, +-9.26833532418833145e-08, +-1.77313904705276198e-08, +-1.32315349496042111e-08, +-1.33559059644366736e-09, + 2.13204255627764407e-08, + 5.55072787566919646e-08, + 9.46258903718591911e-08, + 1.21622851538164440e-07, + 1.15910646291360551e-07, + 7.30904619859116812e-08, + 1.89583047795945772e-08, +-1.06946354082433829e-08, +-1.76369647923289583e-08, +-4.95660031275243766e-08, +-1.15704386636987079e-07, +-1.43623563946062420e-07, +-1.00791445452927210e-07, +-3.87786587650733142e-08, + 1.26648614359076866e-10, + 1.46184364189135549e-08, + 1.67209117847798995e-08, + 1.47397964851834942e-08, + 1.20856606432439014e-08, + 9.74341823857438096e-09, + 7.86513643450338758e-09, + 6.39096986633844443e-09, + 5.23318789074419879e-09, + 4.31757673508274983e-09, + 3.58751640024780566e-09, + 3.00067628754598119e-09, + 2.52534188367038979e-09, + 2.13756350531032964e-09, + 1.81909139783905765e-09, + 1.55589591466817616e-09, + 1.33710109513805653e-09, + 1.15420913392010337e-09, + 1.00053115860483340e-09, + 8.70765226077746246e-10, + 7.60681096892043428e-10, + 6.66882586082559820e-10, + 5.86627015003743933e-10, + 9.70703741207378057e-11, + 3.79519972306208364e-10, + 8.39615377702744943e-10, + 1.43661052628880202e-09, + 1.93221482388889810e-09, + 1.83614697101801310e-09, + 6.77499777465823977e-10, +-1.30075886301081051e-09, +-2.75468015951297067e-09, +-2.31928416192477877e-09, +-6.41485644111853552e-10, +-5.28054230538935441e-10, +-2.80998741120931487e-09, +-3.06055941238538714e-09, + 5.76668827366657693e-10, + 3.16846514792940358e-09, + 2.67241724735684828e-09, + 1.24065401676356380e-09, + 3.19176116893263642e-10, +-4.22149371274940027e-11, +-1.30622888941055592e-10, +-1.28055995578970584e-10, +-1.05377144634431046e-10, +-8.30584829530696287e-11, +-6.50951717509149585e-11, +-5.12866987386068606e-11, +-4.07311131145221935e-11, +-3.26157143285008996e-11, +-2.63236014441888323e-11, +-2.14027069825110694e-11, +-1.75221783659482589e-11, +-1.44381349019187860e-11, +-1.19691224627596333e-11, +-9.97889621605604264e-12, +-8.36426559005939349e-12, +-7.04633368478206508e-12, +-5.96440478729908624e-12, +-5.07142387100589018e-12, +-4.33057561166279003e-12, +-3.71296036974555062e-12, + 8.52923708241217164e-12, + 1.53312695691575205e-11, + 2.28215735380457802e-11, + 2.53712058775465379e-11, + 1.24227255851447593e-11, +-2.41950366296619555e-11, +-7.11361412509379709e-11, +-8.37704070225617335e-11, +-2.63324958508934835e-11, + 5.86431323745888461e-11, + 5.88631043948503867e-11, +-5.93819028512305193e-11, +-9.31464613031545232e-11, + 9.03854603488676243e-11, + 1.67608353766948321e-10, + 3.50088962902986479e-11, +-5.69894771872101176e-11, +-5.26383612125402029e-11, +-2.47382297008865493e-11, +-7.57771871735285601e-12, +-9.98520274962049078e-13, + 7.76509795471643939e-13, + 9.95640307601031673e-13, + 8.44217758141768855e-13, + 6.56044831965879444e-13, + 5.01239654996734127e-13, + 3.83984174261254994e-13, + 2.96467045448347410e-13, + 2.30933630170257157e-13, + 1.81387944370517859e-13, + 1.43626308015413129e-13, + 1.14590203584851418e-13, + 9.20779079268702040e-14, + 7.44839897670970247e-14, + 6.06196881827894128e-14, + 4.96285622138458333e-14, + 4.08627533050734566e-14, + 3.38103121600633271e-14, + 2.81258988814303933e-14, + 2.35136386532344641e-14, + 2.04784568406388243e-13, + 2.73593218634322486e-13, + 2.29434771413954185e-13, +-1.12915804084014518e-13, +-8.72875303491215463e-13, +-1.67507573964383236e-12, +-1.39121129924579791e-12, + 7.52548870963237761e-13, + 3.10125543324482485e-12, + 2.21545828639172233e-12, +-2.54397989613286498e-12, +-4.54203450024397664e-12, + 3.39210680130682656e-12, + 7.11127804321373074e-12, +-2.25736947473752263e-12, +-5.22650346158701634e-12, +-1.17574908988367239e-12, + 9.53981764982997833e-13, + 8.58991129418167442e-13, + 3.86166538206134897e-13, + 1.20889802948701569e-13, + 2.41462809101396179e-14, +-2.26881122762171262e-15, +-6.86360744045910047e-15, +-6.23140798081739991e-15, +-4.82622718139998124e-15, +-3.61216902104261208e-15, +-2.69361079362407774e-15, +-2.00565123577307455e-15, +-1.53730178261613534e-15, +-1.17906722877987984e-15, +-9.07554033430596125e-16, +-6.98514868642499849e-16, +-5.41530912116565952e-16, +-4.28720453844417983e-16, +-3.39909595906401288e-16, +-2.66702973786550866e-16, +-2.26404516897504590e-16, +-1.74747561451064720e-16, +-1.38585602570990236e-16, + 2.66839824788837600e-15, + 1.09952267038811905e-15, +-4.93419229684933707e-15, +-1.72794327910839480e-14, +-2.84847061769653819e-14, +-1.52532609895506486e-14, + 3.84944892723915768e-14, + 8.68388949860247445e-14, + 3.94083265094894423e-14, +-1.00817261876293768e-13, +-1.61339522121639317e-13, + 9.28693294149489777e-14, + 3.14028782046736568e-13, +-1.55238746316467533e-13, +-2.80391343036423535e-13, + 7.94264275051832942e-14, + 1.18103475487332603e-13, + 1.98957338590931165e-14, +-1.51395950048225996e-14, +-1.20099590499824307e-14, +-5.02277573514738754e-15, +-1.53949466925313868e-15, +-3.14510554049829420e-16, +-2.99159596799864092e-18, + 6.03773512941922621e-17, + 3.77703502928972936e-17, + 1.75758830650187783e-17, + 1.31051778084541877e-17, + 2.02093963850338205e-17, + 6.01930505090970693e-18, +-4.50027507977714100e-18, + 3.66412057710909575e-19, + 9.41959492685371657e-18, + 5.63084352280673266e-18, + 5.16982896974926479e-18, + 8.10078674805653907e-19, + 4.29732768812500405e-18, +-1.14736905907738650e-18, +-4.20972026390438197e-18, + 5.96572518108335695e-19, + 2.54738198268494966e-17, +-1.49576384818143838e-16, +-2.30192704489528459e-16, +-3.72544200652020082e-16, +-7.48162084278220012e-17, + 9.79107631573614884e-16, + 1.86705526641210330e-15, + 3.78082895420997359e-16, +-3.01902508846821412e-15, +-3.94848734219262713e-15, + 1.99959142086631320e-15, + 1.09029559490086076e-14, +-3.72897409371410740e-15, +-1.50990759058020049e-14, + 8.44618158115088261e-15, + 6.55930303440496711e-15, +-2.59212645526154370e-15, +-1.97760264742139351e-15, +-1.98400617569261585e-16, + 2.31631172635168767e-16, + 1.44080833887211300e-16, + 7.04225420724661500e-17, + 3.87145042470389904e-17, + 2.71619722497075553e-17, + 1.14409088853114519e-17, + 2.71957556920357535e-18, +-2.35739720352675352e-18, + 6.53323851124718254e-18, + 6.02589647304063832e-18, + 4.11772214243785682e-18, + 3.76787541720317951e-18, +-2.03105638772846776e-18, + 1.72278192038494711e-17, + 1.24823926604769144e-17, + 5.28853334362366657e-18, + 5.01926009074914203e-18, + 9.83775661196818111e-18, +-7.42326492042019698e-18, + 7.37387279467547753e-18, + 1.37774409007091489e-17, + 2.18239036931003958e-17, +-3.57861636776488504e-17, +-2.38775020493265703e-18, + 3.81552350621014000e-17, + 4.31729105460127262e-17, + 5.41089899035520872e-17, + 3.42886008407576894e-17, +-6.83588997923285494e-17, +-8.41080002899026629e-17, + 6.14389951730529610e-17, + 2.47368493343104203e-16, + 9.79467584554418139e-17, +-6.38990158318381192e-16, + 3.74948774420627155e-16, + 4.40690253947226785e-16, +-3.13879941636698477e-16, +-6.13889376278302669e-17, + 5.22512001389716332e-17, + 3.55638946599276167e-17, +-3.68183220821070193e-19, +-2.25364890868398001e-18, +-5.77893028484555658e-18, + 9.92562497471267609e-18, + 1.92183013948153550e-17, + 1.54004844553553166e-17, +-1.22436340414496444e-17, + 7.97295816524096622e-18, +-3.89626149971289174e-18, +-2.23083742076732056e-18, + 2.21428053261176339e-18, +-3.16396347334156735e-18, +-7.26766990074375881e-22, + 4.56950251654925001e-19, + 3.63175665559498336e-18, + 7.25856825805746817e-18, + 1.22628075431299032e-17, + 5.02118584928659468e-18, +-3.09243835013390456e-18, + 3.78352699950686626e-18, + 4.87281928740779590e-18, + 3.21029922119145463e-17, +-5.65575133183795801e-17, + 1.47178703008929749e-17, + 1.78171091646563521e-17, + 2.82905706659267156e-17, + 8.88873203004368525e-18, + 2.55711719250181082e-17, + 1.52845867386797746e-18, +-1.21194664044175616e-17, +-2.01036837265314946e-17, + 2.37564224757284170e-17, +-8.79315574129221742e-18, + 2.44382433859218564e-17, + 7.61719937216544766e-17, + 6.01907345998618348e-18, + 9.13699654444282196e-18, + 2.41754503041888961e-17, + 1.51952337931951519e-17, + 5.34135554316182734e-18, + 2.33955995156148283e-17, + 3.76826039998142691e-18, + 8.72537207755193375e-18, + 1.61432993899798180e-17, + 2.48468465437474484e-17, + 1.06585926150404250e-17, + 5.86997413281898214e-18, + 8.05736402910101931e-18, + 7.24209015598640606e-18, + 6.90743996344025488e-18, + 5.26211937943498476e-18, + 1.09720273654101556e-17, + 4.75671731937987744e-18, + 8.32220065203104170e-18, + 4.20045886794996469e-18, + 3.13928793647980134e-18, + 1.56749540471339633e-18, + 1.30019415604260974e-17, + 1.29950199036012868e-18, + 6.12499209944298162e-18, + 5.35960182014169361e-18, +-1.19254886479509275e-18, +-2.98578713596222078e-17, + 1.03129829632218420e-17, + 1.84218392476151207e-17, +-2.44733341800805267e-18, + 2.67894866351005007e-18, + 8.14110797216023247e-18, +-2.15442141293042207e-17, +-1.64749092000867650e-17, +-1.74678493000609619e-17, +-1.43632264163256787e-17, + 4.59441495708513666e-18, + 1.48113920801669746e-17, + 2.48164456060829832e-18, + 1.59626169362257614e-17, +-3.17901675590360246e-18, +-8.72580472118301187e-18, +-5.16484387130456531e-18, + 6.19444854473741913e-18, +-2.11828353553488437e-18, +-3.39680242362068972e-18, +-4.71061615141022477e-19, + 1.12443270858036798e-17, + 2.15829237295952457e-18, + 5.66947732044172635e-18, +-1.70363118745465381e-18, + 9.80678037998372067e-18, + 5.76562497034876515e-18, + 7.87155408319931067e-18, + 5.57865312229784343e-18, + 6.12108637609286974e-18, + 7.60467669226750070e-18, + 8.00687391677333997e-18, + 1.00318678786534358e-17, + 1.05679511596583447e-17, + 2.07073013600438566e-18, + 1.29739797541761672e-17, + 2.50612754772291907e-18, + 1.10100686501779870e-17, + 5.32562768780793218e-18, +-7.44351243734465233e-20, +-1.60049311279875132e-17, + 2.41798913604948906e-17, + 1.98232893595304287e-17, + 2.07334680798449156e-17, +-5.47324758442804350e-18, + 1.75481228519191995e-17, +-4.49581839289243814e-18, +-1.95310601828808513e-18, +-1.46823382751071248e-17, + 4.90724913964246371e-18, + 2.33845491097461841e-17, + 8.89627462315352435e-18, +-8.06301894493498598e-18, +-1.29325030518617986e-17, +-1.90308018990429475e-17, +-1.23692785995378433e-17, +-1.33452426504259313e-17, +-9.77769437088377640e-19, +-1.12219639400971407e-18, +-5.55339547726343320e-18, +-1.15595229691638112e-17, +-4.00496200864711801e-18, +-4.14354049194446551e-19, + 4.10916258062000937e-18, +-5.35641274275443738e-19, +-2.90630675546625390e-17, +-1.97019957145671220e-17, +-1.45071605493711842e-17, +-7.45909463767546515e-18, +-1.74117771730398679e-17, +-7.38697532991146584e-18, +-1.22212307360914772e-17, +-8.21495676049336356e-18, +-1.31261651631244117e-17, +-1.36496338655744153e-17, +-9.18339695963258532e-18, +-5.15759113319892731e-18, +-6.67053229425185902e-18, +-1.01488564169867668e-17, + 2.22411045097554751e-02, + 2.67514681268483240e-03, + 3.47105243012575833e-04, + 4.95155569276151391e-05, + 7.94435225838457831e-06, + 1.47094859475322856e-06, + 3.22831839386687892e-07, + 8.60341223223834468e-08, + 2.83141397910349499e-08, + 1.15724384525326857e-08, + 5.83269241033359722e-09, + 3.55805042987838520e-09, + 2.55296875743530126e-09, + 2.07731387686902920e-09, + 1.84164300952079941e-09, + 1.71658668686466898e-09, + 1.64063498022735391e-09, + 1.58567424822053027e-09, + 1.54008542573163649e-09, + 1.49950460326930033e-09, + 1.46232442604542098e-09, + 1.42786783534788996e-09, + 1.39575827187101006e-09, + 1.36572667461364645e-09, + 1.33755501862583858e-09, + 1.31105823924084180e-09, + 1.28607653925048365e-09, + 1.26247077925585141e-09, + 1.24011909659275825e-09, + 1.21891422785427375e-09, + 1.19876133175410683e-09, + 1.17957619800330470e-09, + 1.16128376241703658e-09, + 1.14381686797731097e-09, + 1.12711522506137149e-09, + 1.11112453405981000e-09, + 1.09579574123415216e-09, + 1.08108440454078823e-09, + 1.06695015071661341e-09, + 1.05335620849953143e-09, +-2.09392172088312227e-02, +-2.45462450026227245e-03, +-3.07856465395395088e-04, +-4.19738747204107410e-05, +-6.33849918053522440e-06, +-1.08217839420252745e-06, +-2.13216210958066568e-07, +-4.93203089197218802e-08, +-1.35257903897951729e-08, +-4.39029965075492506e-09, +-1.65999814866517997e-09, +-7.09253886131314600e-10, +-3.28998020893389308e-10, +-1.60115023163852008e-10, +-8.17705937052700413e-11, +-4.62825299586230435e-11, +-3.10217448727480717e-11, +-2.44817785209106039e-11, +-2.13052386702912492e-11, +-1.93481827121136828e-11, +-1.78636327791938359e-11, +-1.66115043421865672e-11, +-1.55117644890759304e-11, +-1.45310851448183565e-11, +-1.36501615781832460e-11, +-1.28549096993397952e-11, +-1.21340138250133711e-11, +-1.14780745599625168e-11, +-1.08791795553587493e-11, +-1.03306163294871311e-11, +-9.82665535116632446e-12, +-9.36237933473062471e-12, +-8.93354674403141102e-12, +-8.53648164446638479e-12, +-8.16798417051772120e-12, +-7.82525727562775108e-12, +-7.50584643976890021e-12, +-7.20758975977905183e-12, +-6.92857641259960731e-12, +-6.66711191142525827e-12, + 5.41915738276538619e-03, + 6.18879028865573365e-04, + 7.50521002575749055e-05, + 9.79808427888454569e-06, + 1.39911544370225922e-06, + 2.22388194610349609e-07, + 4.00505082916975745e-08, + 8.30117579467485355e-09, + 2.00207304652101321e-09, + 5.64365442776450483e-10, + 1.85510054312685936e-10, + 7.04484655651422528e-11, + 3.02179115192459658e-11, + 1.39379746877269836e-11, + 6.43795911474038886e-12, + 2.82456400317535747e-12, + 1.19174046901913137e-12, + 5.34938206232607412e-13, + 2.94621356137581627e-13, + 2.06580322293141918e-13, + 1.68321010253997880e-13, + 1.45980485676780590e-13, + 1.29509577649742939e-13, + 1.15998327858009539e-13, + 1.04485363812369554e-13, + 9.45323963682713200e-14, + 8.58620989909393523e-14, + 7.82663823986906285e-14, + 7.15792947158137711e-14, + 6.56656110201136314e-14, + 6.04139950835853145e-14, + 5.57321054147447498e-14, + 5.15428699018928920e-14, + 4.77815872464481340e-14, + 4.43936466872067813e-14, + 4.13327195472457238e-14, + 3.85593147415670648e-14, + 3.60396173753808153e-14, + 3.37445491542464065e-14, + 3.16490037881868512e-14, +-9.67049825793530877e-04, +-1.07830344779844922e-04, +-1.26858592740513787e-05, +-1.59348476218152219e-06, +-2.16688455304269505e-07, +-3.23924441302803037e-08, +-5.40781159554782014e-09, +-1.02296389585657058e-09, +-2.21697079400386017e-10, +-5.53591063664406924e-11, +-1.59234680409119559e-11, +-5.26087439926866863e-12, +-2.00295486721412820e-12, +-8.80806413448751332e-13, +-4.24606557985574747e-13, +-2.00149378370700844e-13, +-8.46840514541607487e-14, +-3.18897712622591245e-14, +-1.14046181482155231e-14, +-4.47496523112287673e-15, +-2.28579175937164714e-15, +-1.54880400416149461e-15, +-1.22843878083382767e-15, +-1.03442622119955572e-15, +-8.89729536743998157e-16, +-7.72612806922643879e-16, +-6.75115733080582982e-16, +-5.92983649868333649e-16, +-5.23282636562053567e-16, +-4.63774366604863697e-16, +-4.12692234347092812e-16, +-3.68622288799479964e-16, +-3.30422972992764982e-16, +-2.97166069831480252e-16, +-2.68091948153969367e-16, +-2.42575189530945640e-16, +-2.20097953994102940e-16, +-2.00229181417917624e-16, +-1.82608234724876669e-16, +-1.66931951819858131e-16, + 1.31943551650591425e-04, + 1.43994129607346547e-05, + 1.64887148551707995e-06, + 2.00192301787087238e-07, + 2.60865582842515900e-08, + 3.69832841574074568e-09, + 5.78634843512051353e-10, + 1.01277588525071029e-10, + 2.00536904125434401e-11, + 4.52395150300588466e-12, + 1.16433006058330194e-12, + 3.39736851102289326e-13, + 1.11202143706486555e-13, + 4.16848316966319330e-14, + 1.90970465318385180e-14, + 9.97391944842943973e-15, + 4.87940223404921668e-15, + 2.02713137991440032e-15, + 7.19331057469907819e-16, + 2.29936909633423446e-16, + 7.32829851754759425e-17, + 2.78088113512058997e-17, + 1.46822016174978047e-17, + 1.02109225127085221e-17, + 8.06106601477377070e-18, + 6.65054372706993508e-18, + 5.57740638413313251e-18, + 4.71801107588055654e-18, + 4.01685466433660584e-18, + 3.43927413142339582e-18, + 2.96008736704525909e-18, + 2.56004092698068100e-18, + 2.22413406783548192e-18, + 1.94055960638544467e-18, + 1.69994875361373848e-18, + 1.49481654474992901e-18, + 1.31914290883485459e-18, + 1.16805612578017767e-18, + 1.03759114162651014e-18, + 9.24502552242261741e-19, +-1.45982605599187523e-05, +-1.56272091863403206e-06, +-1.74691383909855130e-07, +-2.05816916192800907e-08, +-2.58347457323949432e-09, +-3.49727167759972462e-10, +-5.17238408285207650e-11, +-8.46498769991123737e-12, +-1.55015454290520627e-12, +-3.20225680292845575e-13, +-7.49369554518623850e-14, +-1.98557153387829501e-14, +-5.86669079907867962e-15, +-1.84737115465844696e-15, +-6.51272639439118859e-16, +-3.25702085500815856e-16, +-1.93066696518216926e-16, +-9.75384332780671700e-17, +-3.95012081671681828e-17, +-1.33577323238145911e-17, +-3.98664765144945006e-18, +-1.12963619440534911e-18, +-3.47672667661183309e-19, +-1.42248493802814091e-19, +-8.32582801010548792e-20, +-6.04933634925044674e-20, +-4.76964557610347883e-20, +-3.86652738718635284e-20, +-3.17248988806785275e-20, +-2.62354048052897940e-20, +-2.18383150141609107e-20, +-1.82870773171692541e-20, +-1.53987533751593564e-20, +-1.30342651971630302e-20, +-1.10872073712706472e-20, +-9.47464458117111585e-21, +-8.13207842152650762e-21, +-7.00865430425458650e-21, +-6.06406369133242123e-21, +-5.26624672645563063e-21, + 1.36025690129881667e-06, + 1.43111084138773911e-07, + 1.56577231717466484e-08, + 1.79619524859278214e-09, + 2.18140792953247074e-10, + 2.83553892289242122e-11, + 3.99204113985815366e-12, + 6.16038970907204621e-13, + 1.05347170114628828e-13, + 2.01358993671824995e-14, + 4.32416675510543363e-15, + 1.04649504657585916e-15, + 2.87466825045267891e-16, + 8.68347921445248649e-17, + 2.42471043124343602e-17, + 7.20749519537218733e-18, + 4.61973937576452948e-18, + 3.23946195078813736e-18, + 1.64965221885829017e-18, + 6.42779944867761744e-19, + 2.07308469902018038e-19, + 5.86942353839934187e-20, + 1.54441107596510381e-20, + 4.15764367165039320e-21, + 1.37699536201221746e-21, + 6.65079295612572341e-22, + 4.35858352759520657e-22, + 3.26493145339920484e-22, + 2.55767191875718589e-22, + 2.03904936676127910e-22, + 1.64173970081857102e-22, + 1.33142550630301095e-22, + 1.08590982952981710e-22, + 8.92266577387236896e-23, + 7.36627500629312191e-23, + 6.11549941653736404e-23, + 5.11137686649874017e-23, + 4.28327084195044280e-23, + 3.61092194647488107e-23, + 3.07076604328126612e-23, +-1.09591035950110980e-07, +-1.13512364315543011e-08, +-1.21823663401375000e-09, +-1.36466738331886535e-10, +-1.60946870266346283e-11, +-2.01833320553207425e-12, +-2.72060171823541381e-13, +-3.98619727801946607e-14, +-6.41636765145697344e-15, +-1.14482933658978549e-15, +-2.27786335056379267e-16, +-5.05933472497290347e-17, +-1.25892323847885561e-17, +-3.71618861662790076e-18, +-1.17081404562933337e-18, +-2.19774413589916043e-19, +-4.02495919975807133e-20, +-5.93293730912642668e-20, +-4.85294431480731534e-20, +-2.40511905582823169e-20, +-8.91486685110109008e-21, +-2.74038643105271695e-21, +-7.40983686656836112e-22, +-1.84726115945575407e-22, +-4.55349670944665801e-23, +-1.27796052548844846e-23, +-5.13627920536189178e-24, +-2.98099845795532418e-24, +-2.19409699056819018e-24, +-1.65842527744772741e-24, +-1.16729103967543045e-24, +-8.97748548254810848e-25, +-7.79960212332878838e-25, +-5.70989467112669508e-25, +-4.75298765923364410e-25, +-4.33702723831328946e-25, +-3.06043197389230818e-25, +-2.83293519923564903e-25, +-1.64774805523067344e-25, +-1.71635504876380721e-26, + 7.78315258754248953e-09, + 7.94861295292961485e-10, + 8.38404200093388577e-11, + 9.19387559972876300e-12, + 1.05633611316752415e-12, + 1.28306863669098795e-13, + 1.66399497367688527e-14, + 2.32833666559151285e-15, + 3.55120163170764296e-16, + 5.95773948289263293e-17, + 1.10724500364828508e-17, + 2.28860340723361886e-18, + 5.18545389523394061e-19, + 1.30309553763482975e-19, + 4.75350904732845150e-20, + 1.45052945361694734e-20, + 1.22234469057099526e-22, +-3.02409946698587491e-22, + 7.60010585164438440e-22, + 6.54416884397254532e-22, + 3.05836323857662556e-22, + 1.07092512034133730e-22, + 3.13773469835299085e-23, + 8.15868671361379065e-24, + 1.91438191501833123e-24, + 5.39747029770268090e-25, + 1.20522966210016134e-25, +-4.04164654540511385e-26, +-8.23240043509197170e-26, +-6.37720546563532873e-26, + 8.52801212649876556e-26, + 7.85506144929993292e-26, +-3.44104890966169202e-26, +-1.02690933937963171e-26, + 3.75470897432617151e-28, +-4.36633670565962980e-27, +-9.25161900695570025e-27, +-2.59376529066345020e-26, + 1.49544165857488397e-26, + 1.07051848993862677e-25, +-4.94515195602587079e-10, +-4.98604048063198059e-11, +-5.17755117079298461e-12, +-5.56999051879538131e-13, +-6.25156632617914176e-14, +-7.37990606198911471e-15, +-9.24673746762951490e-16, +-1.24173387337536055e-16, +-1.80476345856336141e-17, +-2.86471351708880357e-18, +-5.00255676334988635e-19, +-9.67578742920690477e-20, +-2.08837545075393824e-20, +-4.47306101309598765e-21, +-1.17059560709139908e-21, +-6.91094220532558488e-22, +-1.33692017783376193e-22, + 4.29002569403678394e-23, + 9.81368289913390031e-24, +-9.87317796687686912e-24, +-7.89942563899466830e-24, +-3.36145667466626527e-24, +-1.14302621086561593e-24, +-2.70965460394895482e-25, +-6.61444204726034964e-26, + 6.26589637979719443e-26, + 4.08606911256658961e-26, + 1.30545071874101329e-26, +-4.58795671818205855e-26, +-7.71755024419719309e-26, + 7.71743614971634701e-26, + 7.17430492716670641e-26, +-7.53823108603356368e-27, + 3.85332707484527658e-26, + 4.50647772086207310e-26, + 2.33159073133723728e-26, + 5.80533684227234668e-26, +-1.14718422557110780e-26, + 2.14551407847331405e-26, + 7.32598915974787980e-26, + 2.84386905218682847e-11, + 2.83420350322507359e-12, + 2.90167077800007577e-13, + 3.06815439695199683e-14, + 3.37184541005533168e-15, + 3.87988097920171247e-16, + 4.71353789938398644e-17, + 6.10075946962047163e-18, + 8.49120347764220799e-19, + 1.28221415351714472e-19, + 2.11665087876854830e-20, + 3.83495377071223053e-21, + 7.79080732864926544e-22, + 1.80891511290751380e-22, + 2.09840400554228055e-23, + 1.37168317849323053e-23, + 1.01487681034802303e-23, + 1.70060883090828115e-25, +-9.21215214104095982e-25, +-7.88634794548283394e-26, + 1.53587541517425590e-25, + 1.23643446609444554e-25, + 5.73224510803017145e-26, + 1.79268315565349796e-26, + 1.89718207132210991e-26, + 1.12968517368434709e-25, + 5.36524197066506427e-26, +-1.69930632526505641e-27, +-6.46657511844330077e-26, +-2.89700090188392688e-26, + 4.11531296812181742e-26, + 6.17636046439633572e-26, +-2.78133960993487967e-26, + 6.44475357732981539e-26, + 1.54760110279030294e-26, +-2.44681936538277018e-26, + 4.25039946239470757e-26, + 1.65489631876593838e-26, + 3.63721981992340935e-26, + 7.40198198061306559e-26, +-1.49430414958624488e-12, +-1.47350725075901811e-13, +-1.48929510087067735e-14, +-1.55033477170984893e-15, +-1.67173376593077650e-16, +-1.87983538256579753e-17, +-2.22126258388240625e-18, +-2.78148531005728415e-19, +-3.72378679954216149e-20, +-5.37590624782047782e-21, +-8.44306296220905343e-22, +-1.45119732515156194e-22, +-2.67523938396013784e-23, +-6.16143020402555825e-24, +-1.11557312080574245e-24, + 3.25902518574876792e-25, +-2.31828288560931500e-25, +-6.27096514291571587e-26, + 2.91923141137132289e-26, + 7.66652390574817771e-26, + 1.13351338310950000e-25, + 2.47583965489498935e-26, + 1.96265749707153981e-26, + 4.34341624704471039e-27, +-1.67217972065651861e-27, + 6.26365285469984941e-26, + 6.99296999674017105e-26, +-5.18889263234744527e-27, + 1.49240907203559039e-26, + 5.04393381500198046e-27, + 6.95641097461980701e-26, + 3.73395022605599792e-26, + 7.73977398985310485e-27, + 3.93719251706766766e-26, +-1.06627460137596941e-26, + 2.65259337865402267e-26, + 2.71709697820853453e-26, +-5.00148005701807912e-26, + 2.57207179305653081e-28, + 3.54437903887399937e-26, + 7.22975263105129780e-14, + 7.06028458479565463e-15, + 7.05234390732311433e-16, + 7.23824265203954235e-17, + 7.67078256061172024e-18, + 8.44826862353989902e-19, + 9.73192354153323978e-20, + 1.18357551888926985e-20, + 1.53290170456484639e-21, + 2.10932029862016595e-22, + 3.15172659991877613e-23, + 5.02137292761657250e-24, + 8.86092566772287461e-25, + 1.05762103554586615e-25, + 7.15678008025595388e-26, + 1.93813594123522592e-26, + 3.10805413709674027e-26, +-1.64351442776323272e-26, + 6.94266434075501936e-27, + 1.66718323054947465e-26, + 2.53614615342475099e-26, +-1.53024488343065131e-26, +-1.58286163238215316e-26, + 1.25446858291046141e-26, + 1.22696960941510783e-26, + 5.95484253781496087e-26, + 5.35329480394201591e-26, + 9.53497714278017412e-27, +-5.73720638418957687e-27, + 6.77069396182626996e-27, + 3.43928976370642595e-27, + 7.43023847669403419e-26, +-1.97869494568959085e-26, + 3.69174704908008565e-26, + 5.84790166067769912e-27, + 2.71074032749650048e-27, + 2.88300077414435160e-26, +-1.57714774318509502e-26, + 9.95033372474636005e-27, + 9.06475726226319098e-26, +-3.24795627100114881e-15, +-3.14680058022229969e-16, +-3.10546136027051754e-17, +-3.15592974217671581e-18, +-3.29437300405266106e-19, +-3.59292096276568664e-20, +-4.06257202798080530e-21, +-4.81518196593669470e-22, +-6.40928407508390186e-23, +-9.51845779715760558e-24, +-1.44251813903906204e-24, +-3.06050528123075137e-25, +-7.64324003284626883e-27, +-1.79648715116139232e-25, +-1.27541439643139618e-25, + 2.46902913478864474e-27, +-7.21553869403528890e-27, +-1.17124933924004048e-26, +-7.56877338991244420e-27, +-9.49561865386684147e-27, +-5.95704145141753213e-27, + 3.88831632489529774e-26, +-4.80445640713270594e-26, +-2.90496035773372459e-27, +-7.43888778270809289e-27, + 9.14025515979409152e-28, +-1.89976279109966009e-26, +-3.71077385808156260e-26, +-8.01055340761276531e-26, +-6.39729203672075063e-26, +-5.74131133608424040e-26, +-2.08308419264840555e-26, +-2.42825017985941321e-26, +-5.59196267309374654e-26, +-2.63668698844001258e-26, + 1.63406597861282086e-26, +-2.22080856706137615e-26, +-9.38056637471510087e-27, +-5.02547210689091292e-26, +-2.90507507593926024e-26, +// root 2 + 7.85295546330676331e-01, + 7.60705637267032331e-01, + 7.33381898273596455e-01, + 7.03436950914813175e-01, + 6.71176483470301011e-01, + 6.37103005175521098e-01, + 6.01876581885849471e-01, + 5.66236858433065149e-01, + 5.30907876076346708e-01, + 4.96514936804628437e-01, + 4.63538947206625085e-01, + 4.32322428086150234e-01, + 4.03119383410995735e-01, + 3.76145026761234180e-01, + 3.51566835705158176e-01, + 3.29439370154064048e-01, + 3.09663323502479160e-01, + 2.92019683015824760e-01, + 2.76241755330459027e-01, + 2.62070771029617289e-01, + 2.49280169757104514e-01, + 2.37679568109487593e-01, + 2.27110743374385332e-01, + 2.17441992411262414e-01, + 2.08563034254768576e-01, + 2.00380882106334396e-01, + 1.92816593766728661e-01, + 1.85802718891510260e-01, + 1.79281281539067139e-01, + 1.73202172955067651e-01, + 1.67521860756868507e-01, + 1.62202344209263077e-01, + 1.57210302545849279e-01, + 1.52516395960434342e-01, + 1.48094688263294194e-01, + 1.43922167190896594e-01, + 1.39978343625425383e-01, + 1.36244914982680293e-01, + 1.32705481092685040e-01, + 1.29345303263933536e-01, +-1.16118626295919642e-02, +-1.29807683140133485e-02, +-1.43373745054332334e-02, +-1.55916940370509419e-02, +-1.66423203950611595e-02, +-1.73962038508267448e-02, +-1.77909903503055272e-02, +-1.78104075865283575e-02, +-1.74856677765824475e-02, +-1.68822706846640178e-02, +-1.60762826791340137e-02, +-1.51274462798232211e-02, +-1.40643341676256611e-02, +-1.29007131370972600e-02, +-1.16742722457122538e-02, +-1.04586749262647206e-02, +-9.32936084919326614e-03, +-8.32857116251958449e-03, +-7.46298625479504228e-03, +-6.71981085301827548e-03, +-6.08067132984238361e-03, +-5.52812945379800840e-03, +-5.04751871292317793e-03, +-4.62694720012992323e-03, +-4.25683139596770045e-03, +-3.92941456434654779e-03, +-3.63837277178802104e-03, +-3.37851048978485540e-03, +-3.14552769755143324e-03, +-2.93584091271498421e-03, +-2.74644454808418634e-03, +-2.57480257656207950e-03, +-2.41876316971759197e-03, +-2.27649090750164972e-03, +-2.14641254389482056e-03, +-2.02717331660759014e-03, +-1.91760152139776817e-03, +-1.81667961134062078e-03, +-1.72352048278416234e-03, +-1.63734791078782140e-03, +-1.68880543062382467e-04, +-1.72114314884520868e-04, +-1.65374011196425900e-04, +-1.46314980936288234e-04, +-1.14596476962917050e-04, +-7.27038947971857534e-05, +-2.56932130453992334e-05, + 2.02415525799454119e-05, + 5.96990741696136191e-05, + 8.97041994213022191e-05, + 1.10665534073953260e-04, + 1.26056769708577624e-04, + 1.39569648571840092e-04, + 1.50682763849814311e-04, + 1.54493829807525766e-04, + 1.47946861248389862e-04, + 1.33614833915057639e-04, + 1.16500837145381973e-04, + 1.00157842555585248e-04, + 8.59830256446543619e-05, + 7.41225957563276588e-05, + 6.42798683386309788e-05, + 5.60885350865732241e-05, + 4.92280386393260157e-05, + 4.34415091010008239e-05, + 3.85273632988092073e-05, + 3.43273247050263539e-05, + 3.07162701197976999e-05, + 2.75944716364770183e-05, + 2.48817948262561165e-05, + 2.25133532459460503e-05, + 2.04362284051226238e-05, + 1.86069716056640621e-05, + 1.69896843526133147e-05, + 1.55545308971434201e-05, + 1.42765764849732092e-05, + 1.31348732226254981e-05, + 1.21117357322281213e-05, + 1.11921633911361979e-05, + 1.03633766101781651e-05, +-6.00136948235841255e-07, + 1.03416390438923688e-07, + 1.05230788982975749e-06, + 2.12993719339341108e-06, + 3.12379596387696235e-06, + 3.79032168347949851e-06, + 3.96128412370738409e-06, + 3.62187703594293722e-06, + 2.91423713520570588e-06, + 2.09202680751582526e-06, + 1.45066397530418818e-06, + 1.17025328151693455e-06, + 1.07635735115752670e-06, + 7.00686096104709243e-07, +-1.11765553640115957e-07, +-9.39366566368349122e-07, +-1.37804768743942487e-06, +-1.42763120649186103e-06, +-1.27961609817415966e-06, +-1.08208967211864496e-06, +-8.98976557209767575e-07, +-7.46374698137311745e-07, +-6.23033791923383308e-07, +-5.23711756101805353e-07, +-4.43317324791611961e-07, +-3.77753822541808541e-07, +-3.23871209360272222e-07, +-2.79261849574057427e-07, +-2.42075388752766287e-07, +-2.10877812712869119e-07, +-1.84548082063530143e-07, +-1.62202506366004016e-07, +-1.43139021071389411e-07, +-1.26795751079249954e-07, +-1.12719911236856155e-07, +-1.00544257588466342e-07, +-8.99691060147775392e-08, +-8.07484938626402749e-08, +-7.26794503590647206e-08, +-6.55936188296265415e-08, + 3.54849586980097322e-08, + 5.23060275322299601e-08, + 6.51406029621263147e-08, + 6.73619254046192849e-08, + 5.43050208371962762e-08, + 2.72339020014389099e-08, +-6.00945807798559040e-09, +-3.49367105145422975e-08, +-5.09153305158072668e-08, +-4.87482811163317244e-08, +-2.93029619531086520e-08, +-7.46858768072876614e-09, +-9.78234280781710951e-09, +-3.91543319728282098e-08, +-5.72758358766650514e-08, +-4.16750490317486478e-08, +-1.35181572677056045e-08, + 5.13720020236160072e-09, + 1.18657539647530577e-08, + 1.22332585471715634e-08, + 1.05262428836190470e-08, + 8.57384467423993277e-09, + 6.89977501553194884e-09, + 5.56709607831019145e-09, + 4.52314644890757539e-09, + 3.70364339433864239e-09, + 3.05562830091315942e-09, + 2.53894836081447299e-09, + 2.12363083473715605e-09, + 1.78722831858879803e-09, + 1.51279082711110840e-09, + 1.28740258729232588e-09, + 1.10113456640452008e-09, + 9.46289637676133568e-10, + 8.16853846143225430e-10, + 7.08093277706271395e-10, + 6.16255667136436423e-10, + 5.38347225346571980e-10, + 4.71964390663372697e-10, + 4.15166128625574738e-10, + 8.44751756596385754e-10, + 7.94931868956663466e-10, + 4.31580866987386259e-10, +-2.51229081330546337e-10, +-1.04497984801907552e-09, +-1.59451339024426428e-09, +-1.64021999070088865e-09, +-1.18166053416007567e-09, +-3.72839913027881128e-10, + 5.90816082521650217e-10, + 1.23600308694253137e-09, + 6.96346859266129446e-10, +-9.81437240694675360e-10, +-1.57505260605508870e-09, +-2.44695249335645571e-11, + 1.35712116080956990e-09, + 1.26470651020690913e-09, + 5.96347529144185054e-10, + 1.29254116301964574e-10, +-5.76018417500360585e-11, +-9.94424838725955810e-11, +-9.22286731616322718e-11, +-7.49157330940423291e-11, +-5.88489471113582096e-11, +-4.60815345028358995e-11, +-3.62987203117032821e-11, +-2.88264879573377794e-11, +-2.30827648503250796e-11, +-1.86296713058904231e-11, +-1.51470744889159238e-11, +-1.24007463576847566e-11, +-1.02181071917377718e-11, +-8.47075030501212583e-12, +-7.06226041104822459e-12, +-5.91953634176840942e-12, +-4.98680884909592145e-12, +-4.22112173593928415e-12, +-3.58913606810930070e-12, +-3.06483357164773184e-12, +-2.62772769794644177e-12, + 2.88395604136451300e-12, +-7.96416207545135491e-12, +-2.24417492259685668e-11, +-3.29948607868467768e-11, +-3.05286258176449501e-11, +-1.33523780266765220e-11, + 9.44117161089881176e-12, + 2.75882570958564525e-11, + 3.86809169444541452e-11, + 3.86634323171021978e-11, + 8.26242011254442371e-12, +-5.46704235573177285e-11, +-6.69567863243071193e-11, + 2.75477331025688203e-11, + 8.07909061548769221e-11, + 2.49981987587613483e-11, +-2.42214037771715898e-11, +-2.60442400897264101e-11, +-1.28018454266951922e-11, +-3.84230937375911928e-12, +-2.90851319374241837e-13, + 6.50453585797420639e-13, + 7.26968783446853862e-13, + 6.02039466216344293e-13, + 4.65168136553412010e-13, + 3.54902022180576380e-13, + 2.71778078247645056e-13, + 2.09827063262266696e-13, + 1.63437980502519208e-13, + 1.28367731640877287e-13, + 1.01649175338981361e-13, + 8.11081877797554427e-14, + 6.51704845511587651e-14, + 5.26924374547312426e-14, + 4.28973441335880572e-14, + 3.51162279735946327e-14, + 2.89106962082478193e-14, + 2.39324763229592423e-14, + 1.99020533757967805e-14, + 1.66400531038336831e-14, +-2.81937452384004854e-13, +-4.81498027906282208e-13, +-5.06038189143758830e-13, +-1.87880569430174909e-13, + 3.77059979291783994e-13, + 7.89259277189036957e-13, + 7.70920208520362111e-13, + 5.17945237010839098e-13, + 2.63714146409864199e-13, +-3.93702791956030414e-13, +-1.85547821734120930e-12, +-2.09586254888538198e-12, + 1.76175164869954059e-12, + 3.83602493071034206e-12, +-5.09413716909738589e-13, +-2.54351554447404204e-12, +-7.82904022078891060e-13, + 4.02385352804447528e-13, + 4.36330900764553674e-13, + 2.06915442107960389e-13, + 6.53694885004765262e-14, + 1.18191536308583340e-14, +-2.84304785114752708e-15, +-5.13735284849088624e-15, +-4.46549689034710378e-15, +-3.41840687532009534e-15, +-2.55315614157322428e-15, +-1.90059338238744431e-15, +-1.42028635662438108e-15, +-1.08987617582541630e-15, +-8.27410178313237039e-16, +-6.28310556452927315e-16, +-4.96733672898260586e-16, +-3.98631091311797570e-16, +-3.17169015736516547e-16, +-2.42092608580220201e-16, +-1.99243990644606601e-16, +-1.54868610408372281e-16, +-1.25762966911726435e-16, +-9.85992943562902222e-17, +-6.79825357007407771e-15, +-4.59211437334149843e-15, + 4.15103466640786652e-15, + 1.53203544336278030e-14, + 1.76774276884508233e-14, + 6.41756116945889021e-15, +-6.25905557793829821e-15, +-7.85521691068520817e-15, +-1.03250020268417788e-14, +-3.44134827795003130e-14, +-4.69316174871493967e-14, + 5.51250003676944910e-14, + 1.50273112551205584e-13, +-5.85412698788855234e-14, +-1.46653739708825401e-13, + 2.15554551193355514e-14, + 5.98474439858104226e-14, + 1.41081676442446234e-14, +-6.55185875255361390e-15, +-6.24183735054475594e-15, +-2.75739964832901458e-15, +-8.46876044381513910e-16, +-1.79894961128279891e-16, + 8.06533049741686676e-18, + 3.16544186885063447e-17, + 2.97939962844831634e-17, + 1.52024024466200733e-17, + 1.30999237646396802e-17, + 9.16103092862240419e-18, +-3.00431799193030495e-18, + 5.20912163162328687e-18, + 1.28032080222716562e-17, + 5.92712550480582124e-18, +-1.21480475435071375e-17, + 2.98577034117202771e-18, + 9.12742653078109120e-19, +-1.58258771492083983e-18, +-2.48220767649641128e-18, +-5.98784063638660496e-18, + 9.54272192957725543e-18, + 3.84385031417460505e-17, + 1.92618408720779066e-16, + 3.16221980989761667e-16, + 2.64173827888527517e-16, +-1.40224684131554649e-16, +-4.20524504533836803e-16, +-2.22094788510009039e-16, + 3.96979351904166122e-17, +-3.45087050027761584e-16, +-9.14350811158204407e-16, + 8.15643225231547526e-16, + 4.46280584041423993e-15, +-1.41723054039787290e-15, +-7.28566588185926219e-15, + 3.12153935144339295e-15, + 3.70905554412586755e-15, +-9.54736620154269467e-16, +-1.06527383377075114e-15, +-1.66366735077111746e-16, + 1.03153801018867406e-16, + 8.90611631767113230e-17, + 4.23609246724943859e-17, + 1.80631265011827190e-17, + 1.37405226646917199e-17, +-1.05494571623583466e-18, + 7.88763481233456914e-18, + 3.72092578191824449e-18, + 2.07866374934077030e-18, + 1.05954028135249546e-17, + 1.01176446792998029e-18, + 8.10654259905734170e-18, + 1.19207359078675030e-17, + 4.58432952942622795e-18, +-8.05172572180821073e-18, + 6.03708635734372016e-18, + 3.65856397673894147e-18, + 4.08633566897617418e-19, + 2.38302987894252632e-18, +-4.73396609843305961e-19, + 2.21014549945042551e-18, + 4.77274937140409428e-17, + 2.24209951114493216e-17, + 2.23426662976221813e-18, +-8.13608358654555604e-18, + 3.48942574817383115e-18, + 1.82558290716670434e-17, + 1.00712985536951761e-17, + 1.71828251830637358e-17, + 8.01867127074064590e-19, + 5.08401756293722968e-18, + 1.01372011554043131e-16, + 5.75973774089308950e-17, +-2.71255932460063953e-16, + 1.31514869362686401e-16, + 2.23926025594350286e-16, +-1.45070808368735474e-16, +-6.79193498033355548e-17, + 1.77530613320903102e-17, + 2.03811171853602858e-17, + 7.29982009675254637e-18, + 6.22240191779222026e-18, + 8.05620936572351824e-18, + 1.97878165550747270e-18, + 5.11417576789981939e-18, + 2.20773621729831104e-18, + 5.00242580702503421e-19, +-6.65345329881428254e-19, + 1.32337384571093433e-18, + 4.43625826150933809e-18, +-2.02090831608147324e-18, + 3.82261795670902650e-18, + 8.52885949765603065e-18, + 7.88964349170877253e-18, +-3.33387153767859961e-18, +-4.78043200943405630e-18, + 1.03939500882441684e-18, + 8.06740998272325789e-18, + 2.60443174438163064e-18, +-2.91921620808535299e-18, + 4.90061338235983205e-18, + 2.56959060503675199e-17, + 9.64003782955001481e-18, +-4.78368964925509785e-18, + 8.01895939319986218e-18, +-2.57656207367334455e-17, +-1.99580501209599051e-17, +-2.20070589642328376e-17, +-2.72290903243187923e-17, +-1.82590824667816607e-17, +-1.52288402925388538e-17, +-1.11555397006914194e-17, +-4.04645973539074594e-18, + 4.51317138089976581e-18, + 4.94528624433991287e-17, + 1.25875864896821311e-17, + 1.12290186305765360e-17, + 1.93991625119995371e-17, + 1.34660122700640497e-17, + 2.28594224710224974e-17, + 5.77854180611393698e-18, + 1.56256753544757416e-17, + 2.29294197203433273e-17, + 7.52086107438998275e-18, + 6.56215755889562908e-18, + 1.29163375134456802e-17, + 1.11437675267952373e-17, + 1.78512729025740743e-18, + 2.97769771281797020e-18, + 9.06937188260917137e-18, + 4.68994526206050596e-18, + 9.19431696252858300e-18, + 7.74694521018257536e-18, + 3.15936793989503609e-18, +-2.24633636320301147e-18, +-3.57813065877165779e-18, + 2.56677890134434215e-18, + 9.29702263271197300e-19, + 3.00165162913071789e-18, + 3.73128503474579682e-18, + 5.71813003805577830e-18, + 1.85081884865402812e-17, + 8.95803135226824378e-18, + 1.52545103722919308e-17, +-3.65620217684651228e-18, + 4.86246467808756391e-18, +-1.40808086041318053e-17, +-7.75761320244823332e-21, + 3.28203698740273990e-18, +-8.79292453956885626e-18, +-1.31394725460695882e-17, + 1.63800943621453650e-18, +-2.70311542345566390e-18, + 1.25172957221873442e-17, + 2.17462590921315539e-18, +-9.23612573698007788e-18, +-1.43987330933453635e-17, +-3.33178106244224209e-18, +-1.27154827626796635e-17, + 3.35799306871491409e-18, + 1.21287450106348299e-17, + 6.33130095632015448e-18, + 2.30712617968363427e-19, + 4.83626778329405032e-18, +-2.57783502998423296e-18, +-2.61720129278125154e-18, +-1.54258960967592186e-18, +-2.63442612215466940e-18, + 5.20115945306999649e-19, + 6.14022060903396143e-18, +-5.08854788773217115e-19, +-7.88134654709721686e-19, + 6.42058440327057010e-18, + 9.37956883845328156e-18, +-6.65652515695531356e-20, + 4.50232023897851831e-19, + 8.76954561665445299e-18, + 1.88551943611490869e-18, +-9.07257681365133828e-19, + 5.30866494509651461e-18, + 1.86802436500480901e-18, +-1.07341095992569841e-17, + 4.08013745214358423e-18, + 3.74102678025513685e-18, + 3.34129971453403919e-18, +-9.88042729407919891e-18, +-1.38262400615309828e-17, +-3.01592439075244606e-17, + 8.73598831663879070e-19, + 3.10464703429724799e-18, +-7.31721365299587961e-18, + 5.95580494923351067e-18, + 2.85462000009507668e-18, + 1.47424893862693698e-17, +-9.70564743443942735e-18, +-7.25746895639529728e-18, +-1.43196391836739789e-17, +-4.69001391157409648e-18, +-1.75506682053159869e-17, +-8.91937952773492316e-18, +-5.65492797290176668e-18, +-6.62835950357498497e-18, +-5.30199986305458828e-19, +-1.65294376291749073e-18, +-7.99730536612790007e-19, + 1.39237665523440888e-18, +-3.04854028064281960e-18, +-1.16633907744550072e-17, +-8.95180755390296638e-18, +-1.20057394954453320e-17, +-7.27774945477347253e-18, +-1.12881228477642578e-17, +-1.54818562043052885e-18, +-4.58204709006642752e-18, +-7.63831730957201000e-18, +-8.17521908185141655e-18, +-5.84634289562976568e-18, +-3.41499683689515337e-18, +-6.05027758152448155e-18, +-5.52223322373812416e-18, +-1.03102110214856776e-17, + 3.69893050303101989e-02, + 6.07557981630031142e-03, + 1.13765101362741359e-03, + 2.47297906072111817e-04, + 6.33746431844667393e-05, + 1.93452708412586530e-05, + 7.05746681673888176e-06, + 3.06381801285081147e-06, + 1.56523669595033908e-06, + 9.26145414743226100e-07, + 6.23127274321424605e-07, + 4.67655392881605345e-07, + 3.83800901044700544e-07, + 3.37283774762791860e-07, + 3.10676782207830757e-07, + 2.94351654765144029e-07, + 2.83031793474223419e-07, + 2.74086444344065689e-07, + 2.66357338012998769e-07, + 2.59377584575510615e-07, + 2.52955467716680960e-07, + 2.46997121550437333e-07, + 2.41443125465141132e-07, + 2.36248237548915729e-07, + 2.31375020171793408e-07, + 2.26791515899358167e-07, + 2.22470093090967712e-07, + 2.18386684865005081e-07, + 2.14520211326293015e-07, + 2.10852117727171951e-07, + 2.07365998094169945e-07, + 2.04047285433554981e-07, + 2.00882994875932644e-07, + 1.97861509361548384e-07, + 1.94972399777066595e-07, + 1.92206273182957136e-07, + 1.89554644089098216e-07, + 1.87009824752745715e-07, + 1.84564831263275688e-07, + 1.82213302797008136e-07, +-3.09973030334846980e-02, +-4.80800618602459859e-03, +-8.37091927850524263e-04, +-1.66023810937800830e-04, +-3.79682134520284656e-05, +-1.00871659431338646e-05, +-3.11707773038844601e-06, +-1.11386100172440960e-06, +-4.54468990942942708e-07, +-2.07757058075992935e-07, +-1.03847865623243049e-07, +-5.51698569575274861e-08, +-3.03227306044129256e-08, +-1.70480268211770249e-08, +-1.00401951550463487e-08, +-6.54882936004353086e-09, +-4.89974336673814457e-09, +-4.10045850454464864e-09, +-3.65021947743464739e-09, +-3.33842540452560915e-09, +-3.08821093265694077e-09, +-2.87311628914104523e-09, +-2.68320032234503530e-09, +-2.51362362618965547e-09, +-2.36125073694182836e-09, +-2.22368751184011381e-09, +-2.09898478010048168e-09, +-1.98551814140190898e-09, +-1.88191916493938416e-09, +-1.78702674915895809e-09, +-1.69984978726494940e-09, +-1.61953767096714447e-09, +-1.54535668445822228e-09, +-1.47667095152912579e-09, +-1.41292694806796754e-09, +-1.35364083101529892e-09, +-1.29838800876832799e-09, +-1.24679450763003658e-09, +-1.19852978663274800e-09, +-1.15330072742306757e-09, + 7.13706714909441084e-03, + 1.04839945717191164e-03, + 1.70735765167710155e-04, + 3.12338398622691988e-05, + 6.49032440237273488e-06, + 1.54368916964182792e-06, + 4.21504445461233832e-07, + 1.31866664106153078e-07, + 4.69751219532310440e-08, + 1.88877356007614282e-08, + 8.48451840247376291e-09, + 4.19609359085067192e-09, + 2.21817610139666787e-09, + 1.18934806704586167e-09, + 6.10220355872014337e-10, + 2.92605720033136438e-10, + 1.37406362333464216e-10, + 7.10975770078606674e-11, + 4.49754075709367260e-11, + 3.42144272875130532e-11, + 2.87609965317563906e-11, + 2.51746061435608579e-11, + 2.23870878630630661e-11, + 2.00626986816053161e-11, + 1.80736727316065381e-11, + 1.63524472086875398e-11, + 1.48527135496799716e-11, + 1.35387942177137314e-11, + 1.23820404715169390e-11, + 1.13590708345048877e-11, + 1.04506276971086764e-11, + 9.64073778245659409e-12, + 8.91606892750637642e-12, + 8.26542887842394250e-12, + 7.67937087265296945e-12, + 7.14988081099748164e-12, + 6.67012738517733589e-12, + 6.23426117446373171e-12, + 5.83725211203051280e-12, + 5.47475722258575666e-12, +-1.14449482059181024e-03, +-1.60147104441636841e-04, +-2.45906114132836428e-05, +-4.19366824411716983e-06, +-8.02749534877739442e-07, +-1.73831744219901442e-07, +-4.27569917738614609e-08, +-1.19430281367581285e-08, +-3.77172335094678525e-09, +-1.33648452892420760e-09, +-5.27147133036895515e-10, +-2.31313028502661183e-10, +-1.14294233998571629e-10, +-6.30232224752463632e-11, +-3.56609909457328802e-11, +-1.84986215006423314e-11, +-8.33808115221176242e-12, +-3.34564889787492308e-12, +-1.31622918180271868e-12, +-5.96547595072146066e-13, +-3.51705086029031103e-13, +-2.57980075003277390e-13, +-2.10386994268239465e-13, +-1.78514932440684293e-13, +-1.53827782803792737e-13, +-1.33634583679238846e-13, +-1.16781341294068905e-13, +-1.02575984799587489e-13, +-9.05192200607872521e-14, +-8.02253278205830388e-14, +-7.13889685239354333e-14, +-6.37655941293223106e-14, +-5.71577408511589511e-14, +-5.14048435271111388e-14, +-4.63754985514574029e-14, +-4.19615188897126982e-14, +-3.80733267687953095e-14, +-3.46363558260880255e-14, +-3.15882218196738179e-14, +-2.88764826960023414e-14, + 1.41826734832928481e-04, + 1.90067714009588983e-05, + 2.77090933623912164e-06, + 4.44375123516370664e-07, + 7.91930234496382986e-08, + 1.58094636719264926e-08, + 3.55307672439238961e-09, + 9.00232045727213574e-10, + 2.56560841135322720e-10, + 8.17678585493779590e-11, + 2.88333500364550424e-11, + 1.10540403636508738e-11, + 4.58305305640780317e-12, + 2.21067066910527174e-12, + 1.33007306442279684e-12, + 8.37403371766037507e-13, + 4.50331922495178522e-13, + 1.97279256043354181e-13, + 7.31310465837000077e-14, + 2.47824349239511926e-14, + 8.75627162425500321e-15, + 3.87473440859493908e-15, + 2.33280273187646724e-15, + 1.72340403002205519e-15, + 1.38601522826250808e-15, + 1.14886266513800570e-15, + 9.64518381763003581e-16, + 8.16089934768890602e-16, + 6.94841774323256781e-16, + 5.94936603618848995e-16, + 5.12046242943428570e-16, + 4.42844928855843848e-16, + 3.84738620591122534e-16, + 3.35684888235353822e-16, + 2.94063186133647511e-16, + 2.58578701025504327e-16, + 2.28190030100279121e-16, + 2.02054511047981992e-16, + 1.79486202753942463e-16, + 1.59923703386242522e-16, +-1.43927020073979967e-05, +-1.85595724798142714e-06, +-2.58391506089319343e-07, +-3.92462288887774434e-08, +-6.56674047495517235e-09, +-1.22028202999223111e-09, +-2.53271504924794785e-10, +-5.88656354119189555e-11, +-1.53127133414619847e-11, +-4.44480542541710472e-12, +-1.43385670625951402e-12, +-5.08818200339313807e-13, +-1.88900676732068839e-13, +-6.75286785824590105e-14, +-2.92176157316055899e-14, +-2.18435042369629250e-14, +-1.63267512369446591e-14, +-9.05742718067087793e-15, +-3.84617955410977579e-15, +-1.34664556529076260e-15, +-4.18101219572571108e-16, +-1.26774140898168461e-16, +-4.42486606588896913e-17, +-2.11849079080207486e-17, +-1.37097731062875517e-17, +-1.03314801327947399e-17, +-8.22635035232837385e-18, +-6.68417323456881892e-18, +-5.48713975004805283e-18, +-4.53814486176577825e-18, +-3.77765341735159446e-18, +-3.16337729807679814e-18, +-2.66373220392641434e-18, +-2.25472464925239045e-18, +-1.91790129547514585e-18, +-1.63894671750330054e-18, +-1.40670907352824994e-18, +-1.21236666696795744e-18, +-1.04898564290969946e-18, +-9.11004703456207995e-19, + 1.24093604506730719e-06, + 1.54594492204993354e-07, + 2.06557380422214647e-08, + 2.98898033372271122e-09, + 4.72817606416977252e-10, + 8.24298409058789424e-11, + 1.59355465613316748e-11, + 3.42836421596373334e-12, + 8.21341860532602689e-13, + 2.18613349227140278e-13, + 6.44087556471974440e-14, + 2.11431174610400145e-14, + 7.87649223228169252e-15, + 2.88524054814900476e-15, + 6.51324018467670495e-16, + 1.69952188340793917e-16, + 2.95580173420389539e-16, + 2.77619170326477890e-16, + 1.54589927079221866e-16, + 6.28899599538265460e-17, + 2.09002901265492312e-17, + 6.09721610790839039e-18, + 1.68033814925196227e-18, + 4.96388441027579966e-19, + 1.91455730473688411e-19, + 1.05789965527336882e-19, + 7.36720970918912023e-20, + 5.61779629131235693e-20, + 4.42123930002501873e-20, + 3.52839249240023050e-20, + 2.84043498339441210e-20, + 2.30190213424202586e-20, + 1.87787453798116106e-20, + 1.54233087364231478e-20, + 1.27462441880211954e-20, + 1.05915827597009004e-20, + 8.83572604704112659e-21, + 7.42115470601212388e-21, + 6.24454630804458229e-21, + 5.27139592191365686e-21, +-9.32356639046661513e-08, +-1.12602948232537552e-08, +-1.44997467494595900e-09, +-2.00899884890496051e-10, +-3.02196084123438291e-11, +-4.97499300816687950e-12, +-9.02215730668832642e-13, +-1.81016724159021135e-13, +-4.02537175454639615e-14, +-9.91305085113272248e-15, +-2.68901346033761043e-15, +-7.92258336024529830e-16, +-2.64671694305741868e-16, +-1.18740803480886103e-16, +-4.35373139752161870e-17, + 1.21391487821435705e-18, + 3.21990537206952847e-18, +-3.68664488389838447e-18, +-4.23530319801981685e-18, +-2.27746575011775962e-18, +-8.77988565630628367e-19, +-2.77209953099789370e-19, +-7.68052206425762942e-20, +-1.97980874967677813e-20, +-5.23662469563745921e-21, +-1.68168265854402020e-21, +-7.66251994245182913e-22, +-4.84912448356552084e-22, +-3.59217477517987941e-22, +-2.62022055743264471e-22, +-1.93391335308940061e-22, +-1.60653146770836129e-22, +-1.35334281413580599e-22, +-1.07583118394408767e-22, +-8.17257480729107871e-23, +-5.82629053167955976e-23, +-4.79624079067931359e-23, +-3.38723103651694268e-23, +-3.25233843277375367e-23, +-4.96571158407070146e-23, + 6.21808382290824436e-09, + 7.30220332928569792e-10, + 9.09505652517090084e-11, + 1.21178820728831112e-11, + 1.74191074568131468e-12, + 2.72303080918811627e-13, + 4.66036461360714488e-14, + 8.77507745730672421e-15, + 1.82267967107665346e-15, + 4.17891215204871418e-16, + 1.05762791535012605e-16, + 2.92132141301417335e-17, + 7.95419061168801899e-18, + 2.69112976008585938e-18, + 2.07050980435743224e-18, + 6.11748221475722132e-19, +-2.50286612471654939e-19, +-1.14629034156510972e-19, + 4.88997751473196186e-20, + 5.83195926970095164e-20, + 2.92861064466145962e-20, + 1.06442696607936006e-20, + 3.18853319700269003e-21, + 8.55241879342402485e-22, + 2.04848394888703842e-22, + 5.94906475190454932e-23, + 3.05112537007759047e-23, + 5.94994208855849211e-24, + 2.19148941967791530e-24, + 9.59057563103429231e-24, + 1.21695216369541654e-23, + 4.74605055375849610e-24, +-6.71222822791662336e-24, + 8.61883990983469209e-25, +-7.74540824475059452e-25, + 6.69618494352287631e-24, + 3.50200020384929912e-24, + 8.08978658465353116e-24, + 1.88771468442621947e-24, +-1.02305660323412196e-23, +-3.73304227490299298e-10, +-4.27398396601087759e-11, +-5.16533247681258090e-12, +-6.64262639125236780e-13, +-9.16412920980156226e-14, +-1.36686195963942502e-14, +-2.21923312989077767e-15, +-3.94310169306342488e-16, +-7.69299737899518034e-17, +-1.64976597507197343e-17, +-3.88698372866627837e-18, +-1.02537657524391208e-18, +-2.96933354636567630e-19, +-3.95335232192468638e-20, +-2.45937337694389050e-20, +-4.26714200539184258e-20, +-4.85855495975979583e-21, + 6.87672872207235484e-21, + 1.89369909550672759e-21, +-6.92855445784492572e-22, +-7.04792149098161922e-22, +-3.27514558653470693e-22, +-9.40455011273521611e-23, +-1.99255975943479180e-23, +-9.79030900679789080e-24, + 1.80860185878723652e-24, + 1.34974911849201060e-23, + 7.33022516708570405e-24, + 5.66789133822923727e-24, + 5.95853429496995910e-24, + 1.34957084647044331e-23, + 8.53884646332960245e-24, + 2.25458599389523108e-24, +-1.75808383215823204e-25, + 9.94494563970400994e-24, + 1.10263320366564006e-23, + 4.43598571698173931e-24, + 6.76311587414078183e-24, +-1.93876272218485886e-24, +-5.22505287927324768e-24, + 2.03976178580077207e-11, + 2.28206744250849654e-12, + 2.68356946691533758e-13, + 3.34188623084323717e-14, + 4.44144454026506103e-15, + 6.34731777070864930e-16, + 9.82109793197998216e-17, + 1.65460558448367561e-17, + 3.04745152502250377e-18, + 6.14916734400699792e-19, + 1.35582619025756606e-19, + 3.22341915172913940e-20, + 9.99867080267827234e-21, + 3.11205697473080236e-21, +-1.21084229037333314e-21, + 6.42820379224645698e-22, + 7.48077707112757344e-22, +-3.61340828593040676e-23, +-1.27076199682579637e-22, +-2.30299152630797014e-23, + 2.02146961523775869e-23, + 1.71822148328550104e-23, + 6.95529005262461166e-24, + 1.13905406973085433e-23, + 2.18328467311758242e-24, + 9.35025404862304532e-24, + 9.93005846310233342e-24, + 6.44199894536996780e-24, + 5.10742908891533804e-24, + 1.49622752621486628e-23, + 1.19312697713860546e-23, + 3.96120549404040305e-24, +-4.97125693955517948e-25, +-6.71759552378140541e-24, + 7.66565966594400800e-24, + 9.54609653313911667e-24, + 5.37669996212127386e-24, + 5.38731846670127540e-24, + 5.66232372455396878e-24, +-5.94097266738743820e-24, +-1.02341742890147453e-12, +-1.12117341539144182e-13, +-1.28598069873290290e-14, +-1.55530942327655224e-15, +-1.99789206611959294e-16, +-2.74599287890099429e-17, +-4.06653302850391413e-18, +-6.52997312033726847e-19, +-1.14216813471216464e-19, +-2.18117787708244142e-20, +-4.64221240105816745e-21, +-1.04710655451300282e-21, +-2.08029047522035910e-22, +-1.19470766321854151e-22, + 1.42789532639382604e-23, + 3.81479452765694826e-23, +-2.19180639929783191e-23, + 1.01614268722153748e-24, + 1.05468209532243214e-23, + 1.64412469699979436e-23, + 1.13273455958454934e-23, + 1.38302591198855377e-23, + 1.96138935363433144e-23, + 9.05207483643806599e-24, + 4.32998474546018497e-24, + 1.11819735323202495e-23, + 1.62406570842969430e-23, + 2.49167121292696083e-24, + 8.48298623253338139e-24, + 7.81697439726630033e-24, + 1.04432977252291012e-23, +-3.33877882534180425e-24, + 1.84175866515952073e-24, +-1.34774939291089542e-24, + 7.69662956147655065e-25, + 7.09185977044090072e-24, + 3.88588082883728650e-24, + 1.12189164766948776e-23, + 3.28013794893525109e-24, +-1.57559845311794906e-24, + 4.74959006679549893e-14, + 5.10440194142455847e-15, + 5.71984898814854605e-16, + 6.73615255278579010e-17, + 8.38684325946576387e-18, + 1.11110016140064173e-18, + 1.57768613133494637e-19, + 2.41408095407610426e-20, + 3.90555502260567486e-21, + 6.93358363584902539e-22, + 1.49270531883063637e-22, + 2.40775404401788951e-23, + 1.20281602125301965e-23, +-3.28916208239883822e-24, + 3.84237694950771852e-25, +-7.75572846418256609e-24, +-2.37130906748231966e-24, + 8.02057825798056189e-24, +-2.47160605155474629e-24, + 5.18219423302592546e-24, + 1.96968275529942026e-24, + 2.53612278340325764e-25, + 6.16355585406831761e-24, + 8.65983819321850319e-24, + 1.41442296959486778e-24, + 7.03475078279320217e-24, + 9.81625397387445916e-24, + 6.93551747432201995e-24, + 7.41366973157508223e-26, + 4.48343254127729183e-24, + 1.20326327189318450e-23, + 4.87013556122855802e-24, +-1.79831439481775035e-24, + 6.95844311145699390e-24, + 5.45506404536177963e-24, + 3.23649531616809186e-24, + 6.07662543370426418e-24, + 7.49255262106914204e-24, + 4.72389736692890065e-24, +-3.29432852254049113e-24, +-2.06746195248353126e-15, +-2.19001542810906725e-16, +-2.41332357806324175e-17, +-2.79549367204439927e-18, +-3.49428042019331559e-19, +-4.66124777510216961e-20, +-6.36553335031353582e-21, +-1.21550033587041213e-21, +-3.57456505698057016e-22, +-4.38598337963991824e-23, +-3.69673575070500673e-23, +-6.51408248115292254e-24, + 4.45663424025743479e-24, +-1.82104993780234874e-23, +-1.16319003351861615e-23, +-1.19166249512759757e-23, + 2.03660382052575810e-24, +-2.24864395555900380e-24, +-8.62871356261987960e-24, +-5.26678115949534438e-24, +-9.74670759896659934e-24, + 3.93092669167876866e-24, +-8.46560218148340027e-24, +-4.93450757363186336e-24, +-1.94225715510848623e-24, +-5.75791676696900665e-24, +-3.55099224535978793e-24, +-2.68006339005056257e-24, +-2.94340190659793173e-24, +-6.88289461140550143e-24, +-2.92405357889569578e-25, +-7.08412725161504911e-24, +-6.32444442045276708e-24, +-5.39998676199059780e-24, +-4.17240832084851612e-24, +-6.43630847463700290e-25, +-4.90129165418637281e-24, +-6.11429478220673286e-24, +-2.13559729139565797e-24, +-8.53718719641703514e-24, +// root 3 + 6.30166779217503081e-01, + 5.97694418116995307e-01, + 5.64120497686075861e-01, + 5.30043295036953244e-01, + 4.96093691421353400e-01, + 4.62867280656249547e-01, + 4.30867788696666421e-01, + 4.00473323375544032e-01, + 3.71927429723255543e-01, + 3.45350093759444476e-01, + 3.20763334946199186e-01, + 2.98129141389279428e-01, + 2.77394580830487347e-01, + 2.58524032202132048e-01, + 2.41491401874410122e-01, + 2.26237268734251901e-01, + 2.12637877693316907e-01, + 2.00516961076744465e-01, + 1.89681507899979229e-01, + 1.79950646918826090e-01, + 1.71167915038190510e-01, + 1.63202360384309825e-01, + 1.55945287731730969e-01, + 1.49306252246334842e-01, + 1.43209527440749912e-01, + 1.37591263636083705e-01, + 1.32397255201735592e-01, + 1.27581187436214355e-01, + 1.23103251234888675e-01, + 1.18929039488532270e-01, + 1.15028660745002592e-01, + 1.11376021850488130e-01, + 1.07948243145479919e-01, + 1.04725178491452145e-01, + 1.01689018838557133e-01, + 9.88239628469406994e-02, + 9.61159416913666409e-02, + 9.35523879269700015e-02, + 9.11220403990582600e-02, + 8.88147788048995052e-02, +-1.58785805298389156e-02, +-1.65672448655743536e-02, +-1.69750615434456006e-02, +-1.70687832475449781e-02, +-1.68493878606840106e-02, +-1.63505482800987111e-02, +-1.56291948761313471e-02, +-1.47526704971682656e-02, +-1.37871552066518768e-02, +-1.27893028729971388e-02, +-1.17997762474814152e-02, +-1.08374436729565763e-02, +-9.89891763682051659e-03, +-8.97261572950775431e-03, +-8.06284544365602936e-03, +-7.19785217361650336e-03, +-6.41101452991420673e-03, +-5.72016557171639746e-03, +-5.12478454523554883e-03, +-4.61422484674968957e-03, +-4.17530075791307069e-03, +-3.79588582815029631e-03, +-3.46587254073232529e-03, +-3.17708718859271164e-03, +-2.92294758041917362e-03, +-2.69812723733875263e-03, +-2.49828377872948109e-03, +-2.31984969131646167e-03, +-2.15987236980793142e-03, +-2.01589122055178789e-03, +-1.88584246109279870e-03, +-1.76798473182300975e-03, +-1.66084048263859490e-03, +-1.56314942482724002e-03, +-1.47383129112223926e-03, +-1.39195583581657551e-03, +-1.31671850976571221e-03, +-1.24742061574012247e-03, +-1.18345302520830669e-03, +-1.12428274435716780e-03, +-1.01430323005365235e-04, +-6.96136745548042794e-05, +-3.17179632217397093e-05, + 8.26617596983592169e-06, + 4.59480003870131834e-05, + 7.76962702725028469e-05, + 1.01390198693261093e-04, + 1.16517974717827755e-04, + 1.23815659970375543e-04, + 1.24893015782545869e-04, + 1.22139777244495548e-04, + 1.18534035197076469e-04, + 1.16368526694542100e-04, + 1.15150221146731184e-04, + 1.11727696031271135e-04, + 1.03862702859285194e-04, + 9.25199731630976455e-05, + 8.02227094176471230e-05, + 6.88327388854758287e-05, + 5.90542524417840030e-05, + 5.08992761014096814e-05, + 4.41383192659238347e-05, + 3.85132398193240355e-05, + 3.38023891349022247e-05, + 2.98290578454935270e-05, + 2.64547629430457333e-05, + 2.35708115236713483e-05, + 2.10912856499728071e-05, + 1.89477068987184314e-05, + 1.70850510072731223e-05, + 1.54587637760820902e-05, + 1.40325087931777811e-05, + 1.27764520681021460e-05, + 1.16659439474563524e-05, + 1.06804977543323916e-05, + 9.80299207321642236e-06, + 9.01904306118235242e-06, + 8.31650707722921989e-06, + 7.68508396400129445e-06, + 7.11599863372410448e-06, + 2.31474777953310712e-06, + 2.95393864274560964e-06, + 3.30854055570051108e-06, + 3.29658205094749002e-06, + 2.93534940811975241e-06, + 2.32832431993022559e-06, + 1.61460193024446851e-06, + 9.16875254609946497e-07, + 3.20428852378430057e-07, +-1.09751963466504799e-07, +-3.08652448131601008e-07, +-2.58750442014873554e-07, +-1.08195699758996993e-07, +-1.42254226745264027e-07, +-4.61213319514984234e-07, +-8.33659179160800101e-07, +-1.02040098863880598e-06, +-1.00451882330964821e-06, +-8.85493901072920682e-07, +-7.44740267955178302e-07, +-6.17677237371135048e-07, +-5.12581502293512054e-07, +-4.27822139988017828e-07, +-3.59609149409416881e-07, +-3.04403816772801916e-07, +-2.59384253399797705e-07, +-2.22385747333438992e-07, +-1.91754776619302098e-07, +-1.66220741044871839e-07, +-1.44798966987075268e-07, +-1.26719692749678825e-07, +-1.11376133201909729e-07, +-9.82862166170006630e-08, +-8.70641322079231168e-08, +-7.73989756936291717e-08, +-6.90385794631497095e-08, +-6.17771658325298118e-08, +-5.54458448872122948e-08, +-4.99052469947366218e-08, +-4.50397702956204587e-08, + 4.59870053467216725e-08, + 3.23831959371319333e-08, + 1.10787231939743472e-08, +-1.23845710825835984e-08, +-3.16730985456685375e-08, +-4.27510382828401985e-08, +-4.52107989186400361e-08, +-4.11726943836676722e-08, +-3.27656553620232478e-08, +-2.03127226849425970e-08, +-4.21415909120317818e-09, + 8.98802048609611537e-09, + 6.53837621762969744e-09, +-1.20384045384397546e-08, +-2.50268295612496406e-08, +-1.88577277660515201e-08, +-4.50137697965374448e-09, + 5.33555648694854810e-09, + 8.71250212220090901e-09, + 8.55305209510534463e-09, + 7.26501844571873993e-09, + 5.89549266220949758e-09, + 4.73943314514147300e-09, + 3.82297215909367784e-09, + 3.10587390397999456e-09, + 2.54311259261969225e-09, + 2.09814490964795494e-09, + 1.74336580229153768e-09, + 1.45818829875878135e-09, + 1.22719794946926730e-09, + 1.03875578993042367e-09, + 8.83993250673939269e-10, + 7.56092565421339513e-10, + 6.49768524037046547e-10, + 5.60891597841059229e-10, + 4.86211301075536546e-10, + 4.23151132773552724e-10, + 3.69655394277534511e-10, + 3.24073718883556370e-10, + 2.85073260922591113e-10, +-4.34718105319686447e-10, +-9.07942133931629204e-10, +-1.17505955633688523e-09, +-1.11691235720215401e-09, +-7.77968382717214252e-10, +-3.27571203499838454e-10, + 6.20274477613239537e-11, + 3.22569253743207000e-10, + 5.16801782837047814e-10, + 7.31434843056586610e-10, + 8.28168823024421881e-10, + 3.69720073031225578e-10, +-6.35091907925714286e-10, +-1.00965167613282182e-09, +-1.60820214862620029e-10, + 6.58916349567440902e-10, + 6.63834317685083650e-10, + 3.12167493254849319e-10, + 5.37776751196094145e-11, +-4.99661182746228757e-11, +-7.09899491112741534e-11, +-6.39634832275661419e-11, +-5.15777371783586323e-11, +-4.04361178446862801e-11, +-3.16470612795913688e-11, +-2.49254141653178232e-11, +-1.97938268731405272e-11, +-1.58497688242439379e-11, +-1.27920487723716977e-11, +-1.04007044131969304e-11, +-8.51495372919155268e-12, +-7.01625525029334086e-12, +-5.81643661776010277e-12, +-4.84928305510110516e-12, +-4.06463974266570434e-12, +-3.42418353984587056e-12, +-2.89842244041427471e-12, +-2.46447889204680521e-12, +-2.10445633001273309e-12, +-1.80432666808219155e-12, +-2.12605908176800854e-11, +-1.67225278447746534e-11, +-4.65517726929713050e-12, + 9.16486907184171070e-12, + 1.78287303082445983e-11, + 1.84500702675168017e-11, + 1.35270432160155769e-11, + 8.68087158648740699e-12, + 8.29417884937500027e-12, + 8.79374787395064440e-12, +-4.25386660866164082e-12, +-3.48554255370216466e-11, +-3.92764830986117595e-11, + 1.36941061902009894e-11, + 4.58305238756083957e-11, + 1.67180680730074465e-11, +-1.18858463413746228e-11, +-1.42201678257709836e-11, +-7.14726709391676599e-12, +-2.08139215746618907e-12, +-4.18011418011425470e-14, + 4.86061607205653989e-13, + 5.08085052715890606e-13, + 4.15260735388687585e-13, + 3.19763981185963497e-13, + 2.43750433737021296e-13, + 1.86634078717964770e-13, + 1.44092741918936142e-13, + 1.12217506282614362e-13, + 8.81540787846564466e-14, + 6.98003992815452149e-14, + 5.56895169703185774e-14, + 4.47466162930773342e-14, + 3.61907355516747297e-14, + 2.94562389485802572e-14, + 2.41217767420925272e-14, + 1.98563943151791030e-14, + 1.64246862967260250e-14, + 1.36717576191455981e-14, + 1.14244032523298828e-14, + 4.29419604724407594e-15, + 3.17626852795131319e-13, + 5.07541691869002035e-13, + 4.35393393918474250e-13, + 1.65780054749707736e-13, +-1.05153955353145903e-13, +-2.11073008245977122e-13, +-1.05024642310123689e-13, + 6.01880025293168450e-14, +-1.20120953170576033e-13, +-8.70563234668214350e-13, +-1.02817573372890230e-12, + 1.00942604378086479e-12, + 2.17105363577976584e-12, +-1.65793913867730829e-13, +-1.41379354108670320e-12, +-4.98529589912565619e-13, + 1.97513018420016716e-13, + 2.42937412546410814e-13, + 1.18583647147183286e-13, + 3.74001193691830865e-14, + 6.08844942278841806e-15, +-2.44508139378985585e-15, +-3.62625940254421446e-15, +-3.09063026541149297e-15, +-2.35751226373727460e-15, +-1.75009734942238980e-15, +-1.29329103603964863e-15, +-9.79436628549241814e-16, +-7.39177039429587354e-16, +-5.70159186994096626e-16, +-4.41765191968768450e-16, +-3.42213302510559485e-16, +-2.69082615766763184e-16, +-2.11962359240929037e-16, +-1.64587992422269339e-16, +-1.29885543978983681e-16, +-1.11184927232351983e-16, +-8.48829968660190168e-17, +-6.74114474087604148e-17, + 9.41159948842285586e-15, + 9.03554111132210237e-15, + 2.09015613395886328e-15, +-6.20739920667881118e-15, +-9.52916698255533025e-15, +-6.51046233872468098e-15, + 1.67829379977054399e-16, + 5.74298731602945279e-15, + 2.36689800239372567e-15, +-1.55431018939577287e-14, +-2.55068821807005744e-14, + 2.83335549602590128e-14, + 8.04805429600726555e-14, +-2.89783622035006979e-14, +-8.24073446583320775e-14, + 7.70041092260185561e-15, + 3.36140217645023794e-14, + 9.14773220518536303e-15, +-3.28331492492841837e-15, +-3.51447609771811351e-15, +-1.59685797647273374e-15, +-4.97053099956424403e-16, +-1.09202741595977547e-16, + 1.31961998451923944e-17, + 1.92617424756680767e-17, + 1.56205752392937971e-17, + 1.64972203449158674e-17, + 1.63083833471893163e-17, + 5.61889011386256497e-18, + 6.03131036847559161e-18, + 2.43295471742647011e-18, + 5.73883662529333018e-19, + 1.79333794845562301e-18, + 6.84733884216133334e-19, +-3.76641024945583567e-18, + 2.52459700038754405e-18, + 2.40902376324518993e-18, +-4.23720162250448345e-18, + 4.12355880099794533e-18, +-5.98684492048983112e-19, + 5.45138488809407606e-17, +-9.74762898876222510e-17, +-2.40220600397884112e-16, +-1.95158961866342093e-16, + 1.94896863523535297e-17, + 1.40652642265079387e-16, + 1.96123870140414321e-16, + 5.06099188456757503e-17, +-2.97986251133118445e-16, +-6.21899557242859437e-16, + 3.81759437555211209e-16, + 2.39054792160107618e-15, +-6.71369911496807675e-16, +-3.94076419409445769e-15, + 1.49652225911928876e-15, + 2.15871640571271804e-15, +-4.16782519819551154e-16, +-6.20670264771890355e-16, +-1.12321090033324931e-16, + 5.99759916629735130e-17, + 5.19690917017440881e-17, + 3.17742973871875466e-17, + 9.18849212078297018e-18, + 1.17954588520200774e-17, + 1.61133004650464617e-18, +-4.86993683690977809e-18, + 2.48227350153988818e-18, + 7.49857162507493841e-18, + 4.41828313249704108e-18, + 5.15782962062749807e-18, + 3.02238121060004521e-18, + 2.19885867147261241e-18, + 3.68844829232338317e-18, + 3.53266345980014188e-18, + 1.39605827804696726e-18, + 3.13490643142064036e-18, + 4.75570491094297860e-18, + 1.06003415008934712e-18, + 2.07261763470672863e-18, + 1.82287860418803970e-18, + 5.57215700109554724e-18, + 3.72728143516873405e-17, + 2.52057147585608788e-17, + 2.28086772017459856e-17, + 1.94363236888406871e-17, +-1.94676484306850323e-18, + 6.02794334745525934e-18, +-7.48584253411170902e-19, + 6.25526590218510634e-18, + 4.03113230721287297e-18, + 6.14078655394893003e-17, + 2.24809663481572190e-17, +-1.36662202790946603e-16, + 5.95713123852462012e-17, + 1.32209686114019032e-16, +-6.11940397183563330e-17, +-1.44137591958449652e-17, + 9.14086409529272668e-18, + 8.79651106581093227e-18, + 6.91015629248370404e-18, +-8.39511939888023024e-19, + 1.00761353234758760e-17, +-6.99432339456576822e-19, + 1.39473366830380674e-18, + 4.73558659863707844e-18, +-5.09836437317133802e-18, +-2.17623699985605221e-18, + 3.82718678246679531e-18, + 2.74906971812180689e-18, + 6.97418351477333617e-18, + 5.81790237908451652e-19, + 4.89680457306337576e-20, + 1.60755237862981650e-18, +-1.15362754605881090e-18, + 1.31731895833586378e-18, + 3.22392112687974666e-18, + 5.07238773645944935e-18, +-9.33398383976329798e-19, + 1.00564220906775526e-19, + 2.29680185976085131e-18, +-1.94620400425214847e-17, + 2.75160186877832618e-17, + 4.93333605284604157e-18, +-1.64769971775010863e-17, + 1.87425365960624660e-17, +-1.42903386864142374e-17, +-3.70656140545459247e-18, +-2.05495685920210664e-17, +-7.29609498258243208e-18, +-3.21015132098728866e-18, + 7.33689815544466317e-18, +-4.76306425724120754e-18, + 9.30062033263344730e-18, + 2.64929662635818974e-17, + 7.77426218115582285e-18, + 1.04424354912935190e-17, + 2.77659609381467297e-17, + 2.09290635003103705e-18, + 1.32114562908926769e-17, + 7.91492097573236896e-18, + 8.87806326510583160e-18, + 6.27123182936009395e-18, + 2.75271201224042833e-18, + 1.09006124946610322e-17, + 7.51828144667919358e-18, + 9.49609852687330308e-18, + 6.39774704379355887e-18, + 9.62788829099483575e-18, + 2.22038245791943511e-18, + 1.78043399162761327e-18, + 3.47490931464826091e-18, + 4.66204071505977130e-18, + 3.63002506645515342e-18, + 4.00418590206801284e-18, + 1.75607076060361240e-18, + 3.20414603061924395e-18, + 5.11748022523179359e-18, +-1.29144212966718111e-18, + 2.46925808274659834e-18, + 2.16313996758677410e-18, +-1.15764551149357955e-17, +-1.20391551919550681e-17, + 1.15381162525977949e-17, +-2.04431581253727466e-17, +-4.31145070745821310e-18, +-1.37467316766955153e-17, +-4.22913425221379478e-18, +-6.91660286321354889e-18, +-1.72877264099909609e-18, +-2.10925968184049419e-18, + 1.08089551416285067e-17, +-3.18947435854809190e-18, + 8.24008727751785367e-18, +-5.62984070194036846e-18, +-1.40525812097496913e-18, + 3.40486705542872854e-18, + 1.10965371365187813e-17, +-3.96148265536567317e-18, +-1.53266142458415757e-18, +-3.70192190795377553e-18, + 4.07975617890018109e-19, + 5.93929351148237637e-18, +-2.55664107356605452e-18, +-6.54538216798052993e-19, +-2.69592619042386621e-18, +-6.57932766780204110e-18, + 5.76429290362172603e-18, + 1.16442213684820524e-17, + 6.70002336529218422e-18, + 6.41612842037292415e-18, + 2.27647349240672153e-18, + 3.56280546662924587e-18, + 3.49118020820542160e-18, + 3.05564795934654649e-18, + 2.08036651068695936e-18, + 6.32938253320574595e-18, + 9.03638697024498220e-19, + 5.43390359593820882e-19, + 3.69735400687575574e-18, + 2.85355813108216824e-18, +-9.43543078402538727e-18, + 3.42713086155684778e-18, +-2.36012860504250507e-18, +-8.50403348596448526e-18, +-4.08962640779522911e-18, +-2.62635688699139663e-18, +-7.16311042426940733e-18, +-7.69869475572424394e-18, +-2.33452660415738592e-18, + 9.03908921879634128e-18, +-1.30974464029401983e-18, + 5.86217713459207819e-19, + 1.04286013198712499e-17, + 5.41867638715450544e-18, +-8.83580682756877735e-18, +-5.81278859788592543e-18, + 2.81484638260039800e-19, +-4.09331576277612624e-18, +-3.54194286146884614e-18, + 8.90180253164924494e-19, +-1.07881102978706251e-18, +-2.35584859444353963e-18, +-4.81920390972012806e-18, + 8.87690518041667329e-19, +-3.12951078569079094e-18, +-3.15160071396736863e-18, +-4.88103888699750948e-18, +-5.87468662789952817e-18, +-6.07512838426524139e-18, +-3.70566977781135437e-18, +-9.32649179230471004e-18, +-8.79642879799638352e-18, +-4.01726871949670904e-18, +-6.51269673530960696e-18, +-4.38315829395674854e-18, +-2.18181932145471809e-18, +-4.80855167753073523e-18, +-1.50434022445065703e-18, +-4.69363520026410906e-18, +-2.55869169420498858e-18, + 5.45556562040844517e-02, + 1.31125813368490520e-02, + 3.69721323091448976e-03, + 1.22709484883384541e-03, + 4.78151834439185619e-04, + 2.16951419370321757e-04, + 1.13186664013934871e-04, + 6.68705535624838714e-05, + 4.40187754077617737e-05, + 3.17794411983761952e-05, + 2.48002531343631171e-05, + 2.06481716955046015e-05, + 1.81173053069676375e-05, + 1.65485335858095138e-05, + 1.55442681048472107e-05, + 1.48543167020653995e-05, + 1.43296582329240345e-05, + 1.38918128796677435e-05, + 1.35044104882539004e-05, + 1.31516698868045323e-05, + 1.28263114479952121e-05, + 1.25242499026229998e-05, + 1.22426415499050201e-05, + 1.19792315622027572e-05, + 1.17321301029629172e-05, + 1.14997184627549364e-05, + 1.12805958825229075e-05, + 1.10735420857723958e-05, + 1.08774882036990378e-05, + 1.06914933988588703e-05, + 1.05147257882537883e-05, + 1.03464467361586796e-05, + 1.01859978301977021e-05, + 1.00327900143121777e-05, + 9.88629446859955909e-06, + 9.74603491351351146e-06, + 9.61158108274890439e-06, + 9.48254316067719535e-06, + 9.35856702026784862e-06, + 9.23933012881348432e-06, +-3.79322231512517830e-02, +-8.26391394395600137e-03, +-2.07191373415600366e-03, +-5.99238103390298477e-04, +-1.99359048884080432e-04, +-7.56982855432446677e-05, +-3.24167843960506584e-05, +-1.54249097782472853e-05, +-8.01909955922911034e-06, +-4.47221642996276425e-06, +-2.62350524248115126e-06, +-1.58717383621065623e-06, +-9.76228450783521295e-07, +-6.12558311375614155e-07, +-4.04474296603774919e-07, +-2.93032883229218233e-07, +-2.35502565011294097e-07, +-2.04083059022550920e-07, +-1.84060657797233335e-07, +-1.69026089769475725e-07, +-1.56533638568188167e-07, +-1.45672289648685358e-07, +-1.36052202941088198e-07, +-1.27455631948303027e-07, +-1.19729782588569821e-07, +-1.12754556864161115e-07, +-1.06431377633647957e-07, +-1.00677926499827703e-07, +-9.54248244288531842e-08, +-9.06131979887994012e-08, +-8.61927922525675922e-08, +-8.21204762132033707e-08, +-7.83590459933539960e-08, +-7.48762587768079713e-08, +-7.16440475020637856e-08, +-6.86378783634959603e-08, +-6.58362219671062226e-08, +-6.32201155566486520e-08, +-6.07727986811855301e-08, +-5.84794084454584996e-08, + 7.33014131715836736e-03, + 1.46456478359571264e-03, + 3.32470672154379972e-04, + 8.60315233167517526e-05, + 2.53530370962867961e-05, + 8.46806827250998453e-06, + 3.18055025899151630e-06, + 1.33034863553352035e-06, + 6.13416564074689856e-07, + 3.08836192170383492e-07, + 1.68147803087038066e-07, + 9.74759915732096807e-08, + 5.82807264844072134e-08, + 3.42051816352322354e-08, + 1.88636178151489725e-08, + 9.77859664688600981e-09, + 5.10697953092427120e-09, + 3.00488513439013244e-09, + 2.10832983631704161e-09, + 1.69019174119887715e-09, + 1.44770546974662718e-09, + 1.27414463082605984e-09, + 1.13467044711212834e-09, + 1.01720463404822575e-09, + 9.16427633275832713e-10, + 8.29165913933714500e-10, + 7.53122949770048639e-10, + 6.86499668488351766e-10, + 6.27845250664505923e-10, + 5.75974439525542907e-10, + 5.29910812198879098e-10, + 4.88844434956032504e-10, + 4.52099286970613404e-10, + 4.19107852674299995e-10, + 3.89391123396546451e-10, + 3.62542735246666969e-10, + 3.38216299067112432e-10, + 3.16115213411007421e-10, + 2.95984423092224870e-10, + 2.77603712672478219e-10, +-1.00516627853677941e-03, +-1.86206052285968807e-04, +-3.87930783218630326e-05, +-9.12573687946840857e-06, +-2.42523811956252642e-06, +-7.25983521023768334e-07, +-2.43336004659910522e-07, +-9.05830878687639042e-08, +-3.70934209449544574e-08, +-1.65505703650870282e-08, +-8.00599023236928554e-09, +-4.23586947571574451e-09, +-2.49536932295463921e-09, +-1.59240108555546065e-09, +-9.92078710381587095e-10, +-5.45653316593847747e-10, +-2.57958857928229319e-10, +-1.10314146302490690e-10, +-4.81972948801115647e-11, +-2.51031757460516008e-11, +-1.65399035418680741e-11, +-1.27816069433064516e-11, +-1.06032204664193982e-11, +-9.03864589313663741e-12, +-7.79747220911767863e-12, +-6.77562397558457964e-12, +-5.92144636185408978e-12, +-5.20121640442483615e-12, +-4.58987637668412211e-12, +-4.06791496354243803e-12, +-3.61985775642297728e-12, +-3.23330604509229565e-12, +-2.89824743155478337e-12, +-2.60654031374825563e-12, +-2.35152173021862740e-12, +-2.12770593537640977e-12, +-1.93055078760190128e-12, +-1.75627531650761957e-12, +-1.60171625873473992e-12, +-1.46421447964775887e-12, + 1.08348016052093614e-04, + 1.87751513555701964e-05, + 3.62720246027756529e-06, + 7.84909202528689189e-07, + 1.90569436655148999e-07, + 5.18401312397005882e-08, + 1.57348436358225567e-08, + 5.29577241353345666e-09, + 1.96101438631533590e-09, + 7.90930739526720615e-10, + 3.41742805115320129e-10, + 1.54480816068229785e-10, + 7.42751443558485524e-11, + 4.37748390343638254e-11, + 3.24909596356467868e-11, + 2.30536962099481830e-11, + 1.31115898323442375e-11, + 5.94897378242786865e-12, + 2.29203532510792538e-12, + 8.29464955350733823e-13, + 3.29479486804202803e-13, + 1.68571936766913873e-13, + 1.12007465217096202e-13, + 8.60652540693635569e-14, + 7.00167983835220052e-14, + 5.82047414992431753e-14, + 4.88980159747023250e-14, + 4.13791975811989854e-14, + 3.52324714384187836e-14, + 3.01668852765826213e-14, + 2.59638720720567142e-14, + 2.24549486254164235e-14, + 1.95086041092693862e-14, + 1.70212799150418321e-14, + 1.49108038068297748e-14, + 1.31115220632805453e-14, + 1.15706315783229872e-14, + 1.02454005813465054e-14, + 9.10104912592059910e-15, + 8.10911169350583851e-15, +-9.70666270149863545e-06, +-1.58483952671642075e-06, +-2.86285260455795433e-07, +-5.75132941044679628e-08, +-1.28833273125864087e-08, +-3.21751699453202363e-09, +-8.93456024525874247e-10, +-2.74538962259066116e-10, +-9.27967502215647893e-11, +-3.43327883984536439e-11, +-1.38661310781796336e-11, +-5.97692407157296959e-12, +-2.45603586356177249e-12, +-8.35264848164742887e-13, +-4.40510061363275865e-13, +-5.11019943257777599e-13, +-4.48964015302523338e-13, +-2.63241506740535833e-13, +-1.15112947847695572e-13, +-4.14031639661490293e-14, +-1.33962225630527688e-14, +-4.40766188102274078e-15, +-1.76645026741287375e-15, +-9.69724267910282345e-16, +-6.73716171459590708e-16, +-5.19700319945385962e-16, +-4.16355299332951331e-16, +-3.38791686890201814e-16, +-2.78207933356927981e-16, +-2.30108558557015503e-16, +-1.91550318385285216e-16, +-1.60402093454572795e-16, +-1.35066832856091465e-16, +-1.14327874802143320e-16, +-9.72493182691499604e-17, +-8.31055555616583841e-17, +-7.13287397074374832e-17, +-6.14750707228195560e-17, +-5.31900416899359124e-17, +-4.61925326404358457e-17, + 7.48356744402232660e-07, + 1.15825274861104105e-07, + 1.96972121237096408e-08, + 3.70117599780756668e-09, + 7.71031030729670092e-10, + 1.78238313694400778e-10, + 4.56550375224009835e-11, + 1.29113647942448279e-11, + 4.00895111698912295e-12, + 1.35656209361420225e-12, + 4.99386269051549058e-13, + 2.07870015763395168e-13, + 1.00081270615208197e-13, + 3.80360217970117551e-14, + 5.70100643547434834e-16, +-1.94217357755834327e-15, + 6.53588064941116809e-15, + 7.67115420716938647e-15, + 4.50458225073856305e-15, + 1.88070086493582283e-15, + 6.38372987430255143e-16, + 1.91564781933471310e-16, + 5.57945901402262404e-17, + 1.84321556401200738e-17, + 8.27232648730177115e-18, + 5.07659134571573425e-18, + 3.67985320163165387e-18, + 2.83824055632345598e-18, + 2.24009867332395950e-18, + 1.78824140787417573e-18, + 1.43967679312981359e-18, + 1.16738770547782243e-18, + 9.52727360655911304e-19, + 7.82621523942471663e-19, + 6.46024679935071261e-19, + 5.36097387470131201e-19, + 4.47648319710474903e-19, + 3.75825981716431482e-19, + 3.16546918574754516e-19, + 2.68255708995391320e-19, +-5.08429209811206666e-08, +-7.49786437605569561e-09, +-1.20732985535560751e-09, +-2.13523239396487590e-10, +-4.16409911774167880e-11, +-8.97084304501463366e-12, +-2.13404449489055648e-12, +-5.59250960763121365e-13, +-1.60836213747992426e-13, +-5.04484533248954528e-14, +-1.69203013292577574e-14, +-5.85912593647693394e-15, +-2.61361017649096432e-15, +-1.88988678495053863e-15, +-6.67728851885717775e-16, + 2.99300461759693057e-16, + 1.93895221295351838e-16, +-7.80506064325232422e-17, +-1.18090824581385696e-16, +-6.66630356946461166e-17, +-2.63072123950634165e-17, +-8.45598729615939851e-18, +-2.39246153965854729e-18, +-6.41644958707524856e-19, +-1.84539075656422008e-19, +-6.81958241509757784e-20, +-3.63797669010134740e-20, +-2.47010103939452591e-20, +-1.76996262232663964e-20, +-1.40606272664486986e-20, +-1.03700341374734841e-20, +-8.24409252646235826e-21, +-6.61799049691171695e-21, +-5.30439884079533410e-21, +-4.36035643113082269e-21, +-3.60416547213395270e-21, +-2.76331992676236015e-21, +-2.25850835117479372e-21, +-1.99114610375993233e-21, +-1.17657212936227702e-21, + 3.09647588874355663e-09, + 4.37033468179093599e-10, + 6.69634509255749567e-11, + 1.12064932257778940e-11, + 2.05751557604014344e-12, + 4.15482742611936228e-13, + 9.23225713252446651e-14, + 2.25408887109128923e-14, + 6.02923146411763708e-15, + 1.76382215777649332e-15, + 5.67051410154990221e-16, + 1.87150730079443234e-16, + 3.94735918224982660e-17, + 2.42430650613553334e-17, + 4.47426262388262438e-17, + 1.06557638057998099e-17, +-1.06721446032162782e-17, +-4.62434372739791474e-18, + 1.06438133138860171e-18, + 1.64428365235861360e-18, + 8.61148571963711758e-19, + 3.19689869623079008e-19, + 9.77927453086829411e-20, + 2.65182837363454673e-20, + 5.99472753179360190e-21, + 2.57128545497537293e-21, + 5.48255583815769122e-22, + 1.85282049871959036e-22, + 4.12068934083289444e-22, + 1.69160585931748923e-22, + 2.07116337672453207e-22, +-7.72653701136338542e-23, + 3.36501583746784400e-22, + 1.64567417320225990e-22, +-1.91693213560920569e-23, +-1.95004106023189583e-22, + 2.47688930744484058e-22, +-2.76302411833791944e-22, +-1.71127906077034768e-22, + 4.31056402942815963e-23, +-1.71247865347732492e-10, +-2.32218107715869244e-11, +-3.40037275479166822e-12, +-5.41001431100726853e-13, +-9.39733873499049770e-14, +-1.78773215524074770e-14, +-3.72941152573191749e-15, +-8.52656937182810364e-16, +-2.13113230594109746e-16, +-5.78942111928092938e-17, +-1.71665087829053361e-17, +-6.25987879640686366e-18, +-2.15387133303848324e-18, + 8.50061800133303927e-19, +-2.76136514203890076e-19, +-1.10890057436450166e-18, +-6.10723462715612170e-20, + 2.40051209236104405e-19, + 7.03050120548495490e-20, +-1.62644256067839214e-20, +-2.05738900455700643e-20, +-9.67834169901777458e-21, +-2.70242862054221660e-21, +-7.94357833242021191e-22, +-4.60950463898420725e-22, + 5.50497431359224008e-22, + 5.80770327343065891e-22, +-1.13140884655673893e-22, + 4.13594628145679505e-22, + 1.88721590737758689e-22, + 2.61658083380601247e-22, + 2.45255172732703681e-22, + 4.05307141990824125e-23, + 5.34364939615779554e-22, + 3.52775088458217468e-22, +-1.49110998861929583e-22, +-1.49121873684568265e-22, + 4.82955446589239929e-22, + 3.07951745451768255e-22, + 2.90310958064402363e-22, + 8.68708178078692244e-12, + 1.13567706201488582e-12, + 1.59530586506445784e-13, + 2.42294421698545016e-14, + 3.99915100800577869e-15, + 7.19950775093422877e-16, + 1.41619694737973024e-16, + 3.04626697259777443e-17, + 7.15062623913546191e-18, + 1.83010842708770282e-18, + 4.94335350821308587e-19, + 1.34981254640277021e-19, + 9.76655614860765843e-20, + 2.66532720785455949e-20, +-5.31228907738785082e-20, + 1.73161961201980423e-20, + 2.11885781104680967e-20, +-2.23054765702986021e-21, +-3.48712731139277083e-21, +-4.37198009852173417e-22, + 1.48699163259123869e-22, + 4.96128477078608048e-22, + 5.76732869889070434e-22, + 1.09711476001669113e-22, +-1.01377145665333123e-22, + 7.24707548067768496e-22, + 4.04755793533328675e-22, + 1.60994166393697403e-22, + 5.43237893668676469e-23, +-1.06607208948213346e-22, +-3.81742597986712360e-23, + 1.93156874693393582e-22, + 2.80738458418564080e-22, +-3.60431441083490652e-23, + 2.36135221753831416e-22, + 1.00612182343120347e-22, +-1.88425094066558510e-22, + 1.94322401997582636e-22, + 1.92181743425756245e-22, + 5.25880948809744984e-23, +-4.07489742580124343e-13, +-5.15144925792657237e-14, +-6.96525676325474907e-15, +-1.01371939661225414e-15, +-1.59649054920599437e-16, +-2.73254125733783425e-17, +-5.09929864033228398e-18, +-1.04480756045914662e-18, +-2.33539827904869754e-19, +-5.66565402433923476e-20, +-1.57392659686531386e-20, +-3.42489220049271739e-21, + 2.70081203751613480e-22, +-1.98497123024637100e-21, + 8.16508799360944872e-22, + 2.05211242138089026e-21, +-1.58424505375391528e-22, + 4.76032978879038380e-22, + 5.94656394676322256e-22, + 5.55646774996606791e-22, + 1.54916216545614525e-22, + 3.16614984809665307e-22, + 3.55489096768580719e-22, + 3.55219230713138804e-22, + 2.67306640199436822e-23, + 7.36546792669884094e-22, + 4.15406650447739715e-22, + 2.85642016332999026e-22, + 2.98569744185239968e-22, + 3.68297707057220954e-22, + 4.36357530226877142e-22, + 4.05674478837249418e-22, + 6.83266668597255475e-24, + 7.05719803163989627e-25, +-1.34490211842031141e-22, + 1.15941380545587940e-22, + 1.03526006574651743e-22, + 1.31565801300238829e-22, + 2.11384692727641890e-23, +-1.79612452652961534e-22, + 1.77911950805551326e-14, + 2.17958650840694690e-15, + 2.84483746516144665e-16, + 3.96771795752218842e-17, + 5.96985977534426905e-18, + 9.73901624555018365e-19, + 1.65393547394476123e-19, + 3.27618215142986830e-20, + 2.50405481685653719e-21, + 2.15464832097029662e-21, + 2.80329554420194642e-23, +-6.35351527500980114e-23, + 1.11903584615967839e-21, + 1.57204443334801397e-22, + 2.39264885162591835e-22, + 6.88895661323597175e-24, + 1.15513734832710921e-22, + 2.55393891023552900e-22, + 1.86477312082668106e-23, +-2.28329400008761527e-22, +-3.10515884229766836e-22, + 3.47729229421039331e-22, + 3.53719868811051747e-22, +-2.63350972537063857e-22, +-1.53045058776952170e-22, + 4.53869352386727780e-23, + 8.51859251992533311e-23, +-5.16701521446238606e-23, + 8.40419883462535405e-22, + 1.50726107905223422e-22, + 1.64495680962347888e-22, + 1.03642968414976426e-22, + 4.03920047312205159e-23, + 1.36223865769106714e-22, + 1.14443707189648929e-22, +-2.63500192657011423e-22, +-1.41329322436261863e-22, +-1.33742631500963428e-23, +-2.94248258298935106e-22, + 2.49403776671080103e-22, +-7.44902848290868177e-16, +-9.07268134062768523e-17, +-1.18988328469157245e-17, +-1.78758715755042698e-18, +-2.55647346329785337e-19, +-6.41381065565063231e-20, +-1.86014371095608115e-20, +-3.75284565755418571e-21, +-2.87181324120934174e-21, +-3.85787083622584839e-22, +-1.16520996978812442e-21, + 1.72589496569001740e-23, + 5.40497596615391953e-22, +-8.99938977232583122e-22, +-7.03518355282873914e-22, +-2.36257112434444593e-22, +-1.47645121627549047e-22, +-1.00505805359917807e-23, +-2.28212271902457329e-22, +-2.33737719422806152e-22, +-2.89238706445933405e-22, +-3.83105551249510291e-22, +-1.46493879074484019e-22, +-1.69697087222627062e-23, +-9.87167242351777808e-23, +-8.92690189720224845e-23, +-4.58153389915893535e-22, +-1.20198000310402633e-22, +-3.38912126996376140e-22, +-1.56848729238909701e-22, +-4.53863569021880934e-22, +-4.28297635971504281e-22, +-2.33920616718329984e-22, +-3.22843066562957172e-22, +-3.60482164861578789e-22, +-2.75814802908512900e-22, +-1.48191369373298515e-22, +-5.30100979155129498e-22, +-2.05243129519915480e-22, + 1.79368422131805446e-22, +// root 4 + 4.61656831516207677e-01, + 4.28584180834732709e-01, + 3.96637919428975638e-01, + 3.66254649760395568e-01, + 3.37741498493405734e-01, + 3.11275073253098389e-01, + 2.86917705608515983e-01, + 2.64642299138085846e-01, + 2.44358376036490466e-01, + 2.25935228124714699e-01, + 2.09222180776035299e-01, + 1.94068952137595591e-01, + 1.80346722632536316e-01, + 1.67960859071243862e-01, + 1.56841155300780910e-01, + 1.46912751938252872e-01, + 1.38074334482998884e-01, + 1.30201533915862089e-01, + 1.23165165791710732e-01, + 1.16846518969443536e-01, + 1.11143635977057717e-01, + 1.05971394019371820e-01, + 1.01259193023679570e-01, + 9.69483002429472607e-02, + 9.29895436282135446e-02, + 8.93414637998095618e-02, + 8.59688636475373497e-02, + 8.28416698666100265e-02, + 7.99340334044277012e-02, + 7.72236128605026939e-02, + 7.46909989640556354e-02, + 7.23192487748480356e-02, + 7.00935059552185713e-02, + 6.80006891113474898e-02, + 6.60292343798019044e-02, + 6.41688815536817364e-02, + 6.24104953913494701e-02, + 6.07459155351577212e-02, + 5.91678298344821274e-02, + 5.76696669225349456e-02, +-1.67401892919926479e-02, +-1.63039127793731531e-02, +-1.56194359634376067e-02, +-1.47478384896335864e-02, +-1.37562395160632858e-02, +-1.27071229498002623e-02, +-1.16518440179408638e-02, +-1.06284375135062750e-02, +-9.66243124462556197e-03, +-8.76870454669514618e-03, +-7.95232875594253062e-03, +-7.20772156466769134e-03, +-6.51936792189716178e-03, +-5.86990664209412639e-03, +-5.25351611820543563e-03, +-4.68020761757372353e-03, +-4.16484086088169270e-03, +-3.71480070372929520e-03, +-3.32778923812760254e-03, +-2.99616365912386924e-03, +-2.71113438476679961e-03, +-2.46476536579638781e-03, +-2.25047835886816108e-03, +-2.06296256664625140e-03, +-1.89794329695473752e-03, +-1.75196179401555015e-03, +-1.62219841511789800e-03, +-1.50633667968066271e-03, +-1.40245938613530927e-03, +-1.30896880908448494e-03, +-1.22452488271699677e-03, +-1.14799689849293942e-03, +-1.07842544601311646e-03, +-1.01499218815783387e-03, +-9.56995680254287234e-04, +-9.03831890396965482e-04, +-8.54978404615881109e-04, +-8.09981541248482647e-04, +-7.68445777837869506e-04, +-7.30025028112260489e-04, + 3.70223979627665875e-05, + 7.12494786111706016e-05, + 9.87293154950904438e-05, + 1.17924003202919922e-04, + 1.28823466195244975e-04, + 1.32515471525366239e-04, + 1.30613191445186030e-04, + 1.24777574544671972e-04, + 1.16454851954983496e-04, + 1.06881694039207150e-04, + 9.73130537734237104e-05, + 8.91380654939348598e-05, + 8.33000922095638560e-05, + 7.91831824745322196e-05, + 7.47032148461825989e-05, + 6.83236361911686914e-05, + 6.03811191220863237e-05, + 5.21820669721169081e-05, + 4.47191031864167983e-05, + 3.83512514395002217e-05, + 3.30514741304637237e-05, + 2.86603876058813546e-05, + 2.50076663739189522e-05, + 2.19487500743390086e-05, + 1.93687582850148181e-05, + 1.71777424190557014e-05, + 1.53051200734415495e-05, + 1.36951015972932531e-05, + 1.23032220605876750e-05, + 1.10937527990050991e-05, + 1.00377636469779846e-05, + 9.11166045877088963e-06, + 8.29607127478390597e-06, + 7.57499045586359424e-06, + 6.93511548807048347e-06, + 6.36532900620891161e-06, + 5.85629121973275270e-06, + 5.40011695752668485e-06, + 4.99011806863196428e-06, + 4.62059666814869711e-06, + 3.05895960139190451e-06, + 2.60489737791159883e-06, + 1.95507550460864633e-06, + 1.24457013884247274e-06, + 5.87010882510456713e-07, + 5.00092641901930024e-08, +-3.45055820234345931e-07, +-6.08723432002146139e-07, +-7.62671056777659842e-07, +-8.16827650359071866e-07, +-7.59089233622898580e-07, +-5.89134113104854287e-07, +-3.91683461325838942e-07, +-3.25177375349157156e-07, +-4.43754633917106723e-07, +-6.13255939357905155e-07, +-6.91428931402131093e-07, +-6.61878047354229448e-07, +-5.77739301745118091e-07, +-4.84286076214913816e-07, +-4.01238025497455774e-07, +-3.32867497987909311e-07, +-2.77802807623391398e-07, +-2.33504614851991215e-07, +-1.97657291537876011e-07, +-1.68424754303127954e-07, +-1.44400659257084827e-07, +-1.24511194532764703e-07, +-1.07931302842132093e-07, +-9.40216066719011098e-08, +-8.22822797346008790e-08, +-7.23193210741629627e-08, +-6.38197094164494014e-08, +-5.65329281114506076e-08, +-5.02570991925007705e-08, +-4.48284839058765788e-08, +-4.01134656371597319e-08, +-3.60023798898198426e-08, +-3.24047304984761809e-08, +-2.92454542557969759e-08, +-1.96950744661122641e-08, +-3.59094019187750228e-08, +-4.39116241098460936e-08, +-4.37367462450273566e-08, +-3.77819667193334821e-08, +-2.91450680423032399e-08, +-2.03655416306255131e-08, +-1.28357959943524436e-08, +-6.52377651326616809e-09, +-9.22608345615918298e-11, + 7.41012357786413433e-09, + 1.30013977028535823e-08, + 9.85214861712054644e-09, +-2.21714710094593588e-09, +-1.09917663459092387e-08, +-8.60891839643020114e-09, +-1.09917792884634051e-09, + 4.17085863826975855e-09, + 5.88262490452690804e-09, + 5.61589501100937119e-09, + 4.73269245237288719e-09, + 3.83154704928003974e-09, + 3.07815596871628402e-09, + 2.48249389277264689e-09, + 2.01674838606881065e-09, + 1.65131158725534525e-09, + 1.36237899519856220e-09, + 1.13201133234099685e-09, + 9.46838313708168722e-10, + 7.96850457433675330e-10, + 6.74490221499082221e-10, + 5.73999030633648684e-10, + 4.90949901694614434e-10, + 4.21911025058163422e-10, + 3.64201008194017908e-10, + 3.15709209884588437e-10, + 2.74762653301609480e-10, + 2.40026539387097362e-10, + 2.10429208503730891e-10, + 1.85105233739967085e-10, +-9.75619729604925330e-10, +-6.18717341645079069e-10, +-1.82713440345238592e-10, + 1.79180901896337505e-10, + 3.90054500890453622e-10, + 4.52580021641457661e-10, + 4.13840264167684283e-10, + 3.39322265184275141e-10, + 3.03987705321209860e-10, + 3.50463938320986231e-10, + 3.77027960343585650e-10, + 1.16019381826533022e-10, +-4.41763986050552570e-10, +-6.45886345509291363e-10, +-1.57058482570632808e-10, + 3.29977419510996843e-10, + 3.55241861408892865e-10, + 1.65476843889602169e-10, + 2.11820482685676065e-11, +-3.66236856419571793e-11, +-4.72016073861178541e-11, +-4.17961922961215662e-11, +-3.35481826681345900e-11, +-2.62678896814320604e-11, +-2.05514763758525739e-11, +-1.61851003309396309e-11, +-1.28526974333930964e-11, +-1.02916656932723570e-11, +-8.30620498586619262e-12, +-6.75344291426474300e-12, +-5.52898091702436155e-12, +-4.55582633681114666e-12, +-3.77675418763336796e-12, +-3.14876399810987563e-12, +-2.63927079252942612e-12, +-2.22340769419187499e-12, +-1.88202466557748342e-12, +-1.60024186969553804e-12, +-1.36647406336560822e-12, +-1.17159124413653141e-12, + 1.08384963034182005e-11, + 1.77525906051893009e-11, + 1.74813930213942513e-11, + 1.21539674350413473e-11, + 5.46718894715716850e-12, + 8.37052810384145993e-14, +-2.86514020450452366e-12, +-2.81158640889181402e-12, + 2.47835890641538092e-13, + 2.99884398731012091e-12, +-2.91846113098729030e-12, +-1.94284792497566348e-11, +-2.17464686219740816e-11, + 7.94639824712851434e-12, + 2.65943659588555602e-11, + 1.05804698138094575e-11, +-6.06605305630026731e-12, +-7.87766395137366108e-12, +-4.00913276361237686e-12, +-1.13134277965843836e-12, + 3.66286389890761221e-14, + 3.31803521451244443e-13, + 3.33635460125865612e-13, + 2.70425583176229263e-13, + 2.07788449278552957e-13, + 1.58315278429383812e-13, + 1.21194333987050187e-13, + 9.35563421467884195e-14, + 7.28631310067753458e-14, + 5.72381996201737229e-14, + 4.53174805373522156e-14, + 3.61645934862822867e-14, + 2.90574797778643396e-14, + 2.35006027969336341e-14, + 1.91300581055512349e-14, + 1.56590338373397402e-14, + 1.28885856513063362e-14, + 1.06708209903996298e-14, + 8.87820037003630941e-15, + 7.41971511995020620e-15, + 3.64658924385597785e-13, + 1.16549434410548415e-13, +-1.21452981891694000e-13, +-2.35610370992594788e-13, +-2.26173846523526403e-13, +-1.52551792528367343e-13, +-5.49799837122881898e-14, + 6.06975312036165792e-14, + 1.40613509424322159e-13, + 9.76757098965668112e-16, +-4.54258730829936642e-13, +-5.62329325863487906e-13, + 5.63860238951177433e-13, + 1.22661909065162130e-12, +-6.54921650156650503e-14, +-8.02519739239470403e-13, +-3.04831276118338246e-13, + 1.01312856641317476e-13, + 1.36671868016068079e-13, + 6.78901071844653672e-14, + 2.13030604428004872e-14, + 3.12975960868875843e-15, +-1.78810273715301352e-15, +-2.40367660289833676e-15, +-2.01454285856689737e-15, +-1.52554826536041953e-15, +-1.12910392236518410e-15, +-8.43537015312785461e-16, +-6.39256976588108752e-16, +-4.78907393971273020e-16, +-3.75619266358736155e-16, +-2.81145810899841415e-16, +-2.17257402072352787e-16, +-1.75707799403411394e-16, +-1.37620324813664370e-16, +-1.06659552217420100e-16, +-8.90418478708040201e-17, +-6.79254168084043261e-17, +-5.26502751306336673e-17, +-4.24632408082575770e-17, +-6.08878743233816139e-15, +-8.45535250133065054e-15, +-5.75408759362927137e-15, +-1.37673665072872562e-15, + 1.61668526322336604e-15, + 2.76396341888604540e-15, + 3.36581886416944872e-15, + 3.66367532476019463e-15, + 3.16818814857603561e-16, +-9.96638502542000289e-15, +-1.51338959298689781e-14, + 1.53641390222519926e-14, + 4.47766450469585776e-14, +-1.52519251496361113e-14, +-4.66519398653367416e-14, + 3.06480488329136468e-15, + 1.91016220756748809e-14, + 5.63151747854656254e-15, +-1.71632688045352658e-15, +-2.00865605151631264e-15, +-9.27437919863659315e-16, +-2.88350733613983328e-16, +-5.59871388938336459e-17, + 8.42000784765506394e-18, + 1.49120494997914096e-17, + 1.78933160182883797e-17, + 9.19737951031659510e-18, + 6.94898508087706005e-18, + 2.68724958591885785e-18, + 4.27724749034115835e-18, +-2.36874777988202427e-18, + 5.48433719606568322e-18, + 4.34968767439151201e-18, +-2.81193215603550397e-18, + 2.63558794291685407e-18, + 2.44792981569252670e-18, +-2.30403675665175296e-18, + 1.44712727814560547e-18, + 5.39372763304316632e-18, + 1.67416507977154381e-18, +-1.64114534514569823e-16, + 1.94513076969447542e-17, + 1.27091206004560168e-16, + 1.07054207436349319e-16, + 4.02210617002372496e-17, + 2.09034669796976343e-17, + 1.38215668377280928e-17, +-3.13892462272423831e-17, +-1.86491584930473902e-16, +-3.36780009390956211e-16, + 2.26739517933293291e-16, + 1.32951981685195983e-15, +-3.51248901965706716e-16, +-2.20486344577789482e-15, + 7.59365703871183467e-16, + 1.23672882147471896e-15, +-2.07207310341952945e-16, +-3.48171580637398484e-16, +-7.27078839697391537e-17, + 2.85398633361381320e-17, + 2.98251502614107241e-17, + 1.72293002313238074e-17, + 3.85804786406449441e-18, + 3.21045064599131252e-18, + 1.38997491502636790e-18, + 4.52855345395768828e-18, + 5.39774979160153294e-18, + 4.86180990356201351e-18, + 9.17877830611291982e-19, + 4.11209161535494391e-18, +-4.48825614841597749e-19, + 3.06947605660160184e-18, + 6.03617446605955963e-18, +-1.05987746706114742e-18, + 2.47928403967868942e-18, + 1.42621579770355002e-18, +-1.21738352486473500e-19, + 3.75380786182048296e-18, + 5.44076776547292841e-18, + 4.06800739924773177e-18, + 8.24515385908506542e-18, + 2.32189290208726235e-17, + 2.79641167379487673e-17, + 9.85475885811280683e-18, +-1.04793111870112799e-17, +-1.05380254199142812e-18, +-7.66922344497942945e-19, + 1.59186407939194799e-18, +-2.21914736181986702e-18, + 8.53266807450013586e-18, + 2.81683413488919421e-17, + 6.49699839897170027e-18, +-8.12979026940857709e-17, + 2.50200505581865053e-17, + 6.33934556256164328e-17, +-3.97207776965403465e-17, +-1.42958652778109152e-17, + 7.74449100826870640e-18, + 8.65711933821865726e-18, + 2.05746988526730770e-18, + 1.42473890201802350e-18, + 2.48234263889867766e-18, +-1.18187559931395284e-18, + 8.23830078975196070e-19, +-7.92270764173705244e-19, + 7.15164217028969575e-18, + 5.57359894692481030e-18, + 1.31067868036708521e-18, + 3.23987569285594667e-18, + 2.12181382662803201e-18, +-2.90664195298501394e-18, + 1.90204534029820673e-18, + 3.25189374835075067e-18, + 1.47838076761228337e-18, + 3.44339617082253940e-18, + 9.54220962079375444e-19, +-1.09426161906986938e-18, + 1.54915828525559822e-18, + 2.43072806844893718e-18, + 2.76359220528295005e-18, +-4.20015845005673118e-18, + 3.47216274172890972e-18, + 9.11263477823117007e-19, +-1.07800442958878594e-18, +-4.43993651468836247e-18, +-9.83977633436815483e-18, +-4.51958389963904057e-18, +-8.46013311005136815e-18, + 4.27194411019171956e-19, +-4.25829168062564730e-18, +-1.12462524173482905e-17, +-9.40547209941119389e-18, + 8.24096324676617713e-19, + 1.26955029586749607e-17, +-2.92517738386569505e-18, + 1.32624097127957446e-18, + 1.10753373487436923e-17, + 4.47180658244464617e-18, + 3.23790037027553855e-18, + 5.96898369466987125e-20, + 7.23529522478016148e-18, + 7.40362467564106000e-18, + 2.20234380580639515e-18, + 6.30248351446491769e-18, + 3.16412925634901522e-18, + 6.21229820348819726e-18, + 4.27018998356561000e-18, + 2.13622963651861012e-18, +-5.71526640608684505e-19, + 2.60952395039274322e-18, + 1.81898874778810163e-19, + 4.37193931998730071e-18, + 1.90722873297090275e-18, + 1.99628060556929957e-19, + 1.82473953001954899e-18, + 2.06268372595940233e-18, + 9.59837840391991548e-19, + 3.66802123579761566e-18, + 3.84498430078777136e-18, + 4.03743273678041338e-18, + 5.06840223139893102e-18, + 7.12826082746465710e-19, +-2.29711632106252441e-18, +-3.89676717638574224e-18, +-8.17469807804261133e-18, +-1.11020451673738334e-17, +-2.96586968551050340e-18, +-1.25812696767668959e-18, + 3.80288912222285304e-18, +-2.75441955088226349e-19, + 1.80582089886730689e-20, + 2.80801682668270178e-18, + 4.01548542308350958e-18, +-1.02499332234525953e-18, +-1.04891864812604448e-18, +-4.18515104293166698e-18, + 2.42146030299060765e-18, + 6.74160557988888298e-18, +-1.23927171868895545e-18, +-2.75722707049706455e-18, +-5.86543507441374864e-19, +-2.61348118605624996e-18, +-2.10849717190302709e-18, +-6.65868190681414771e-19, +-2.89467883344208789e-19, + 3.23338905075584263e-18, + 5.65777205561554493e-18, + 5.68088353788683446e-18, + 1.43179921233652185e-18, + 3.85345781773654520e-18, +-2.35068779791132413e-18, + 7.16789986433085893e-18, + 3.73817582209210337e-19, + 4.21114821775617824e-19, + 1.66032689058599860e-18, + 2.10296881550247626e-19, + 7.31868946928848490e-19, + 1.86817337497354764e-18, + 2.33296741956138105e-18, + 2.31984662422642707e-18, +-1.67992205859813358e-17, + 7.74916178584729413e-18, +-4.20679419072307484e-18, +-8.31127801093126384e-18, +-8.52714664024205497e-18, + 7.69667680725656010e-18, +-1.20179400833213103e-17, +-2.82060055364616633e-19, +-6.26159618492662643e-18, +-2.30355511663656906e-18, + 2.56500702245793077e-18, + 5.97450942726134810e-19, +-2.22644920099790170e-18, +-2.45182315726635852e-18, +-7.28335645552508811e-18, +-1.12410206598885952e-17, +-4.41951776420274231e-18, +-6.88797889545727868e-18, +-3.79573609716418403e-18, +-6.15173925276143598e-18, +-2.66149476066998731e-18, +-2.09145753600410701e-18, +-1.64289466477635157e-18, +-3.09904287316481785e-18, +-2.43781409618021953e-18, +-3.88551571432400848e-18, +-4.08468459708782117e-18, +-4.97641463344407878e-18, +-4.33653222964551669e-18, +-4.58305586782125913e-18, +-5.93264286626113292e-18, +-3.86511417703425503e-18, +-4.28996876049796346e-18, +-3.59437896735617939e-18, +-4.74786268097822266e-19, +-3.93488338818098209e-18, +-4.05937614016365192e-18, +-3.68188417935456467e-18, +-2.13043498998573793e-18, +-1.45892468292363876e-18, + 7.57638925520820322e-02, + 2.70198477913611568e-02, + 1.12067562536602491e-02, + 5.34497175162053795e-03, + 2.89013431709585081e-03, + 1.74450153897572047e-03, + 1.15742472598287364e-03, + 8.31935258864647609e-04, + 6.39477683993264212e-04, + 5.19781950137595964e-04, + 4.42531617590525889e-04, + 3.91450108262717965e-04, + 3.57152460748357610e-04, + 3.33728822954406485e-04, + 3.17150038763465620e-04, + 3.04647592164005126e-04, + 2.94475303654559602e-04, + 2.85670394115892015e-04, + 2.77760261605103462e-04, + 2.70519987069369318e-04, + 2.63831242190164207e-04, + 2.57618799294636756e-04, + 2.51826402959327768e-04, + 2.46408196428224478e-04, + 2.41325420937698297e-04, + 2.36544803776617818e-04, + 2.32037536452739612e-04, + 2.27778519198868780e-04, + 2.23745765945282643e-04, + 2.19919924052280961e-04, + 2.16283882009573914e-04, + 2.12822446363915735e-04, + 2.09522073825036515e-04, + 2.06370647735452126e-04, + 2.03357290472323642e-04, + 2.00472205147812516e-04, + 1.97706541348827196e-04, + 1.95052280717199650e-04, + 1.92502138995552828e-04, + 1.90049481809635885e-04, +-3.99662669333086459e-02, +-1.23749977618060007e-02, +-4.38307664781940453e-03, +-1.75842976491268174e-03, +-7.89126362012901989e-04, +-3.90639650890835829e-04, +-2.10263166053457635e-04, +-1.21328398771618565e-04, +-7.40352269633759685e-05, +-4.71406385611104347e-05, +-3.09120878029313801e-05, +-2.06360386822982333e-05, +-1.39590149862587529e-05, +-9.67082150132040692e-06, +-7.05097597191427306e-06, +-5.54074086409529476e-06, +-4.67945326616206486e-06, +-4.14831313678037988e-06, +-3.77258641333619483e-06, +-3.47345368974155903e-06, +-3.21906586705337216e-06, +-2.99625695195225500e-06, +-2.79850786934580674e-06, +-2.62170698615312488e-06, +-2.46279455813486957e-06, +-2.31931783160853426e-06, +-2.18925263477468349e-06, +-2.07090637935802547e-06, +-1.96285208695963955e-06, +-1.86387877490918604e-06, +-1.77295272219209821e-06, +-1.68918674110112021e-06, +-1.61181556222217027e-06, +-1.54017596319004522e-06, +-1.47369061530229348e-06, +-1.41185486757472970e-06, +-1.35422586861926760e-06, +-1.30041356180323376e-06, +-1.25007319107058596e-06, +-1.20289903235881611e-06, + 6.08195380019701214e-03, + 1.67936070504983749e-03, + 5.26275817306926441e-04, + 1.85869874645159730e-04, + 7.32996764684859271e-05, + 3.19405223553888856e-05, + 1.52153138460181835e-05, + 7.84371847647397642e-06, + 4.33698297483460233e-06, + 2.55248826953148758e-06, + 1.58575682673126303e-06, + 1.02390768849305893e-06, + 6.66123202584849416e-07, + 4.18388149121021776e-07, + 2.46688025811036618e-07, + 1.39412995726672253e-07, + 8.17190623193100785e-08, + 5.41328938152692131e-08, + 4.11303506730801243e-08, + 3.41783039195252933e-08, + 2.96369031710409641e-08, + 2.61769014464461733e-08, + 2.33330612937767688e-08, + 2.09221827239256010e-08, + 1.88503141986016455e-08, + 1.70555797264565222e-08, + 1.54914426720784159e-08, + 1.41210338953520345e-08, + 1.29145361049548726e-08, + 1.18475735711399556e-08, + 1.09000624299003872e-08, + 1.00553427842019536e-08, + 9.29950916530367059e-09, + 8.62088799861287000e-09, + 8.00962625980277291e-09, + 7.45736519930880538e-09, + 6.95697972484558731e-09, + 6.50236885828191613e-09, + 6.08828621211853998e-09, + 5.71020203914260618e-09, +-6.77362245632614221e-04, +-1.69469642845939702e-04, +-4.78165909543511796e-05, +-1.51381370218259938e-05, +-5.33798721779487443e-06, +-2.07811926826387625e-06, +-8.84766669997433799e-07, +-4.08007335789325631e-07, +-2.01897892304215593e-07, +-1.06406625124754292e-07, +-5.97527610887702827e-08, +-3.63785697271061672e-08, +-2.44222671133045444e-08, +-1.72553754545038523e-08, +-1.14726177406651271e-08, +-6.60262838280209397e-09, +-3.28212059227766557e-09, +-1.52109888110043190e-09, +-7.53067747882878239e-10, +-4.49206511891697651e-10, +-3.23115552113924570e-10, +-2.58908044700543729e-10, +-2.17230956310357279e-10, +-1.85742383440520524e-10, +-1.60356191265456793e-10, +-1.39365529282927361e-10, +-1.21800734125080183e-10, +-1.06986832220947855e-10, +-9.44119663623639651e-11, +-8.36754473993135089e-11, +-7.44590867215346263e-11, +-6.65078667623979926e-11, +-5.96158395352025086e-11, +-5.36155358860142592e-11, +-4.83699012903054510e-11, +-4.37660961116922170e-11, +-3.97106902323619378e-11, +-3.61259105436724773e-11, +-3.29466899236718141e-11, +-3.01183310073976195e-11, + 6.07790533848074680e-05, + 1.39403547564776209e-05, + 3.58602800807300070e-06, + 1.03100647599114146e-06, + 3.29410757671342197e-07, + 1.16117052479240836e-07, + 4.47951658161480231e-08, + 1.87562354195753995e-08, + 8.45136359144428478e-09, + 4.05007879382123066e-09, + 2.01751336850627840e-09, + 1.01516960222249658e-09, + 5.44422990479576209e-10, + 3.85996855429044843e-10, + 3.39185034210411958e-10, + 2.61033762763336347e-10, + 1.54320473563400365e-10, + 7.22681944935438564e-11, + 2.91939907733585559e-11, + 1.15443450079930662e-11, + 5.27572403813876919e-12, + 3.09700135586337506e-12, + 2.21966368915943413e-12, + 1.75241966375230129e-12, + 1.43663035898246646e-12, + 1.19656614714974040e-12, + 1.00568918347873846e-12, + 8.51132538299515783e-13, + 7.24714794168055677e-13, + 6.20520694343871213e-13, + 5.34066801326814904e-13, + 4.61889679053982070e-13, + 4.01284507433329686e-13, + 3.50121184470573241e-13, + 3.06709519131137086e-13, + 2.69699000472924390e-13, + 2.38003462416905684e-13, + 2.10743976757242436e-13, + 1.87205093604892823e-13, + 1.66801333639628503e-13, +-4.62475620882129302e-06, +-9.81320000587803121e-07, +-2.32352968447358075e-07, +-6.12593801934472455e-08, +-1.79064466365444276e-08, +-5.76869206410445318e-09, +-2.03395852790671828e-09, +-7.79115747031073506e-10, +-3.22240351261004195e-10, +-1.43795101977688522e-10, +-6.93966223685301359e-11, +-3.44720839719054302e-11, +-1.41421903026073057e-11, +-3.40481366221919965e-12, +-2.55616662295339449e-12, +-5.11086625650543126e-12, +-5.04543250027318172e-12, +-3.06924481691020785e-12, +-1.37381288317977564e-12, +-5.08969559456334866e-13, +-1.74239803861422214e-13, +-6.40471717736371776e-14, +-2.99717092847075738e-14, +-1.85390585536867917e-14, +-1.35663583187647244e-14, +-1.06329124632631222e-14, +-8.55361308857201346e-15, +-6.96690082004198112e-15, +-5.72229078770976640e-15, +-4.73317365331419289e-15, +-3.94011726683551555e-15, +-3.29940767565032365e-15, +-2.77827837724148609e-15, +-2.35169217578007710e-15, +-2.00038584958512080e-15, +-1.70944319109974314e-15, +-1.46720070183220433e-15, +-1.26450898442924148e-15, +-1.09409607007010339e-15, +-9.50158288877174193e-16, + 3.07990570625566069e-07, + 6.09090047718518457e-08, + 1.33770614987784753e-08, + 3.25943853222096581e-09, + 8.78375343903434440e-10, + 2.60557405428062966e-10, + 8.45742000454672809e-11, + 2.98329503642776615e-11, + 1.13361868913098931e-11, + 4.59090859634090262e-12, + 2.00915224650364353e-12, + 1.06170202480866215e-12, + 6.56913345544563580e-13, + 2.23427758450423018e-13, +-9.93066903071706080e-14, +-6.71267464420784772e-14, + 6.16762240006352100e-14, + 8.61722815115192844e-14, + 5.24040222878796644e-14, + 2.23010904816198024e-14, + 7.72774501907601620e-15, + 2.40580512981989953e-15, + 7.58462304142457987e-16, + 2.88917215954044708e-16, + 1.50750883413376730e-16, + 1.00498127595319245e-16, + 7.49485514165299468e-17, + 5.82580396825915146e-17, + 4.60690626722816303e-17, + 3.67911182061461875e-17, + 2.95997382559292295e-17, + 2.40238830560992219e-17, + 1.96033839642104717e-17, + 1.60818580018145985e-17, + 1.32860303076800298e-17, + 1.10382765272015055e-17, + 9.21716233692354246e-18, + 7.73852150496701683e-18, + 6.51594993794741578e-18, + 5.51672494545408965e-18, +-1.83374595715585741e-08, +-3.40103859871634229e-09, +-6.97312977257228924e-10, +-1.58045265853482746e-10, +-3.95172058204592710e-11, +-1.08598830581829316e-11, +-3.26408822336730124e-12, +-1.06727926639827064e-12, +-3.77760374883704800e-13, +-1.43022040767389592e-13, +-5.44262705562473988e-14, +-1.91551345551497353e-14, +-1.35035824108343525e-14, +-1.61590949185877177e-14, +-4.89204848917127456e-15, + 5.05437671069697173e-15, + 2.91742526221852400e-15, +-6.99350409377383089e-16, +-1.33177349822656664e-15, +-7.76221245844813815e-16, +-3.11423348497110845e-16, +-1.01697197372068386e-16, +-2.95016521454834841e-17, +-8.37616015013737686e-18, +-2.69906463955968437e-18, +-1.18068904874270035e-18, +-6.98126480040304963e-19, +-4.80232445037140906e-19, +-3.63909408280512540e-19, +-2.75123558600614168e-19, +-2.28421509934495422e-19, +-1.65537040932831275e-19, +-1.34579040797507626e-19, +-1.11763336517243797e-19, +-8.95911302768417571e-20, +-7.35663524429945054e-20, +-5.70646573491171804e-20, +-3.77660403499530112e-20, +-3.20242931577865601e-20, +-3.01509967782717156e-20, + 9.91089268886647147e-10, + 1.73316257207279293e-10, + 3.33571919008671755e-11, + 7.07170371482050210e-12, + 1.64954674285861789e-12, + 4.22185234168647080e-13, + 1.18069044140247671e-13, + 3.58905209524707580e-14, + 1.18056671525870675e-14, + 4.24355358813706340e-15, + 1.71441428914121348e-15, + 5.76455657415897662e-16, +-1.19842916008750566e-16, + 1.11349117884001229e-16, + 4.71513632963913697e-16, + 8.84935596734033359e-17, +-1.44921176260438608e-16, +-6.24227832226457609e-17, + 9.75801389204515944e-18, + 1.86859385999876396e-17, + 1.00635334526832465e-17, + 3.78466710770308878e-18, + 1.19283986529778018e-18, + 3.25752449481903898e-19, + 9.45780723175370752e-20, + 2.65338731168629365e-20, + 1.55332974428970286e-20, + 1.42676074947398053e-20, + 1.53434049159241293e-20, + 1.26293847989390619e-20, +-8.51964706553820346e-21, + 1.02594560442137168e-20, + 1.64302720907337993e-21, +-1.28329729746216726e-20, +-9.19424386278639734e-21, +-1.07190746700069695e-21, +-9.29983993884127306e-22, + 4.95456450368052298e-21, +-6.78648808048455809e-22, + 2.33162588170606867e-21, +-4.91831465663763995e-11, +-8.14761158900008918e-12, +-1.47914092391022895e-12, +-2.94733284717082526e-13, +-6.44428538103203186e-14, +-1.54317126732967282e-14, +-4.03418558143865844e-15, +-1.14636187837521811e-15, +-3.51229111953068438e-16, +-1.13837970022863149e-16, +-4.15871196947276876e-17, +-2.60659354492009905e-17, +-8.36953126299931433e-18, + 1.66881710260551457e-17, +-2.28817143967914145e-18, +-1.25722736345574625e-17, +-2.78917759899998398e-19, + 3.03970665404491534e-18, + 9.23972311589487143e-19, +-1.41894666870594461e-19, +-2.30020393797367265e-19, +-1.18913382190578439e-19, +-2.76174101799173981e-20, +-1.72333290731393138e-20, + 8.63343944113615238e-21, + 7.21801798908973709e-21, + 1.20115802765829559e-20, + 1.20285958842468783e-20, + 1.34884111284384211e-20, + 1.15700813639496266e-20, +-5.75268294092583406e-21, + 1.10698722315853719e-20, + 4.46545890825676029e-21, +-1.42787309368982501e-21, +-2.56630579803809492e-21, + 7.37540106008279839e-21, + 4.43905008715997674e-21, + 1.16712309141907153e-20, + 5.44771681271766970e-21, + 1.36208764998063871e-20, + 2.26097104139909676e-12, + 3.56288071401031807e-13, + 6.12738905983953312e-14, + 1.15253916146525224e-14, + 2.37213734360782499e-15, + 5.33643828044790034e-16, + 1.30890785226172387e-16, + 3.49076121194520833e-17, + 1.01222710507487940e-17, + 3.15413492196258196e-18, + 8.59153185146080228e-19, + 1.95075077383830788e-19, + 7.74647252436650117e-19, + 1.22824505110469685e-19, +-6.88903828901165593e-19, + 2.24504913510162802e-19, + 2.38497772287483404e-19, +-1.99183311699833539e-20, +-4.00767251139486017e-20, +-3.01053616087813090e-21, + 3.33152350447866833e-21, + 4.75326878146641418e-21, + 1.68980175713605925e-20, +-1.78494167550754485e-21, + 6.31491767614626329e-21, + 4.94377316430122281e-21, + 9.09063076978142761e-21, + 1.08175280821953652e-20, + 1.02102542916887312e-20, + 9.06049700732707340e-21, + 3.37212326009128709e-22, + 1.29582998047515384e-20, + 3.33178101481171046e-21, +-6.64392516790631819e-21, +-6.96590549278067696e-21, + 6.68549850513888880e-22, + 1.64329244967726374e-21, + 7.86807552159907874e-21, + 2.75396356242234682e-22, + 4.08207122946655551e-21, +-9.69654318112877898e-14, +-1.45889597138718433e-14, +-2.38618858432588925e-15, +-4.25377019614209316e-16, +-8.29645661326061943e-17, +-1.76191451749842818e-17, +-4.14723264367590082e-18, +-1.12921457483792731e-18, +-3.49210961761068059e-19, +-1.31162841280488905e-19, +-4.44606866778284288e-20, +-2.26651754913497951e-20, + 8.27293855914408514e-21, +-1.80779920467709959e-20, + 3.27470026416460344e-20, + 3.39750204698543888e-20, + 6.71113096877491324e-22, + 6.18914533648579120e-21, + 1.06043917136913616e-20, + 1.34620815323249346e-20, + 1.88987446823841589e-20, + 2.10633464921613203e-21, + 3.45970930371860642e-21, + 4.86703682640912821e-21, + 1.34234068301169213e-20, + 5.01091038651142606e-21, + 5.66033284247235999e-21, + 7.19279247663573096e-21, + 1.29011300146268002e-20, + 1.17387591154972083e-20, +-4.15681323573890144e-21, + 5.68988647786437028e-21, + 3.86283199597436695e-21, +-6.27189584493369958e-21, +-1.37335814309145843e-21, + 5.66902955505344568e-21, + 4.22804082874349230e-21, + 5.78407191048183961e-21, + 5.96250765017971661e-21, + 8.31141204144093787e-21, + 3.88852430343135358e-15, + 5.60967338977838026e-16, + 8.56498277948845539e-17, + 1.41853104151814041e-17, + 2.43366602112447442e-18, + 3.74390441299001061e-19, + 6.07561079427864190e-20, + 3.37192054013415723e-20, + 6.90007539729223149e-21, +-3.22916317447376631e-21, +-1.51244099107667177e-21, +-4.66495738494621226e-21, +-1.43510860204699569e-21, +-9.17171181752706451e-21, +-6.59735231354992975e-21, + 1.15091030899520667e-20, +-7.04171909503214978e-21, + 5.78642683518344476e-21, +-6.94466298613606448e-22, + 9.05934035570732616e-21, + 3.14123087873806030e-21, + 1.24561599140825103e-21, + 6.26465003238235270e-21, + 2.78514707012265105e-21, + 4.36176326789777082e-21, +-2.35228926143169842e-21, + 1.01060424139393430e-20, + 1.29701649960666843e-20, + 4.77419578615759364e-21, + 2.87511988334933938e-21, + 4.31014714445295601e-21, + 4.08229631719583052e-21, +-1.04011800256847161e-21, +-6.58399659891153046e-22, + 3.91101850305639402e-22, + 2.31264048548826815e-21, + 6.83973761969170787e-21, + 1.81981435736362544e-21, + 6.40732248431360481e-21, + 4.79307028719510158e-21, +-1.70982659786413675e-16, +-2.99498022418195848e-17, +-5.09567747734710335e-18, +-1.08021004055221294e-18, +-3.40727602250579894e-19, +-1.30696724009657376e-19, +-4.93975503381964496e-20, +-2.78168206329996773e-20, +-3.78603580217040163e-20, +-2.52871073010419286e-20, +-7.64491941923768571e-21, +-4.87846148954645974e-21, +-6.16378246360065213e-21, +-1.53325284043478298e-20, +-1.40541303935150914e-20, +-4.77284007197162746e-21, + 4.26838734396612601e-21, +-7.20729752237384661e-21, + 2.62357321509059079e-21, +-4.05773743646418046e-21, + 1.10388235798997971e-21, + 1.44649720267248312e-21, +-1.63700344521725725e-22, +-3.25214982668121918e-21, +-6.78310038360015344e-21, +-6.57117865304810976e-21, +-9.56799380500992066e-21, +-8.79143315270364929e-21, +-2.80996607232185140e-21, + 3.34523771664938194e-22, +-2.82600123748411857e-21, +-5.10910172070350727e-21, +-6.93660852856009240e-21, +-4.21226960401220163e-21, +-4.64730706612180322e-21, +-3.86038375502619136e-21, +-9.53203059055870651e-22, +-1.05698499399681125e-21, +-6.05686571456804516e-21, +-7.58826502674547310e-22, +// root 5 + 2.99228317147423206e-01, + 2.72452278961093086e-01, + 2.48043031616924592e-01, + 2.25974878810458024e-01, + 2.06138971753756700e-01, + 1.88375497703315159e-01, + 1.72499449442615749e-01, + 1.58318912935848544e-01, + 1.45646662298631879e-01, + 1.34306830571774449e-01, + 1.24139235120031707e-01, + 1.15004299584959113e-01, + 1.06789395091028860e-01, + 9.94117542095865614e-02, + 9.28101833711638818e-02, + 8.69270428828711472e-02, + 8.16946371244580138e-02, + 7.70356788910038920e-02, + 7.28722771809110215e-02, + 6.91337108731041733e-02, + 6.57595157052845991e-02, + 6.26992916637001962e-02, + 5.99112588709627414e-02, + 5.73606655281249864e-02, + 5.50184180076730631e-02, + 5.28599862809801119e-02, + 5.08645455276620848e-02, + 4.90143025012659550e-02, + 4.72939632885040415e-02, + 4.56903093223342757e-02, + 4.41918568667134803e-02, + 4.27885814206920984e-02, + 4.14716930476431017e-02, + 4.02334519785002703e-02, + 3.90670163098918513e-02, + 3.79663154630193664e-02, + 3.69259444587489369e-02, + 3.59410751201631601e-02, + 3.50073811225608059e-02, + 3.41209744351947675e-02, +-1.39725901067854069e-02, +-1.27988794836115770e-02, +-1.16119573875191236e-02, +-1.04620956611050885e-02, +-9.38231706754600117e-03, +-8.39092025268864741e-03, +-7.49520301478455182e-03, +-6.69512876659766280e-03, +-5.98630812154346114e-03, +-5.36189900666974185e-03, +-4.81301638443135116e-03, +-4.32781824058151195e-03, +-3.89133895823165791e-03, +-3.48934052770385507e-03, +-3.11512226557851025e-03, +-2.77155778404494140e-03, +-2.46495037137628437e-03, +-2.19812239510291029e-03, +-1.96898171190533228e-03, +-1.77272985785073079e-03, +-1.60407898398685195e-03, +-1.45830956667513008e-03, +-1.33152356423070126e-03, +-1.22057743394668157e-03, +-1.12294171888218872e-03, +-1.03656994753561962e-03, +-9.59793832873342143e-04, +-8.91242798541109311e-04, +-8.29782508109888520e-04, +-7.74467647459301596e-04, +-7.24505350006143063e-04, +-6.79226618003139770e-04, +-6.38063804375785834e-04, +-6.00532729807098085e-04, +-5.66218375847579139e-04, +-5.34763359520947683e-04, +-5.05858588115801265e-04, +-4.79235635243794146e-04, +-4.54660485132669836e-04, +-4.31928371542880923e-04, + 1.43347468932423215e-04, + 1.48849131046304556e-04, + 1.46964406885101781e-04, + 1.39904826797125468e-04, + 1.29714233172629464e-04, + 1.18009593794800888e-04, + 1.05926573074198368e-04, + 9.41760356581072730e-05, + 8.31547321089220803e-05, + 7.31070367752609945e-05, + 6.43277971304240828e-05, + 5.72523938049865385e-05, + 5.21440606385229987e-05, + 4.84835312245303238e-05, + 4.50027546817130238e-05, + 4.07570330459421250e-05, + 3.58415899728876394e-05, + 3.09093630244192599e-05, + 2.64680480573451971e-05, + 2.26932844586756437e-05, + 1.95558268984347464e-05, + 1.69573808338615239e-05, + 1.47961172273927425e-05, + 1.29862543857593961e-05, + 1.14597670064269960e-05, + 1.01634246916775136e-05, + 9.05546433237539966e-06, + 8.10287689532250832e-06, + 7.27935408386040136e-06, + 6.56375657861338863e-06, + 5.93896748608046497e-06, + 5.39102703668202834e-06, + 4.90847356999071074e-06, + 4.48183715086342250e-06, + 4.10324718176798688e-06, + 3.76612593556125206e-06, + 3.46494740921816518e-06, + 3.19504624332856793e-06, + 2.95246531035486260e-06, + 2.73383338594287161e-06, + 8.22395507333970122e-07, + 1.19695390790703376e-07, +-4.04277988610590713e-07, +-7.45365267010835874e-07, +-9.31958528222553721e-07, +-1.00411768714270869e-06, +-1.00061485292038545e-06, +-9.52861692020828719e-07, +-8.81148100450346152e-07, +-7.89830365399793595e-07, +-6.67288773326765496e-07, +-5.07429693766349495e-07, +-3.50592400587574939e-07, +-2.77906342127564535e-07, +-3.15751089877523577e-07, +-3.89634592931310565e-07, +-4.19974741746275692e-07, +-3.95280812866215236e-07, +-3.42894559270354695e-07, +-2.86809749574827053e-07, +-2.37462226293865864e-07, +-1.96959236393529965e-07, +-1.64368330462348500e-07, +-1.38156450482577382e-07, +-1.16946490059677876e-07, +-9.96506143193795426e-08, +-8.54364457721862948e-08, +-7.36685945915036930e-08, +-6.38588954256464894e-08, +-5.56290509268095186e-08, +-4.86833323828962806e-08, +-4.27886241993333217e-08, +-3.77597234310812948e-08, +-3.34484088055529171e-08, +-2.97352367124489513e-08, +-2.65233290767013093e-08, +-2.37336299724281979e-08, +-2.13012550486712760e-08, +-1.91726611209266622e-08, +-1.73034361114750146e-08, +-4.86268012179170683e-08, +-3.86278516802113988e-08, +-2.68531517798328844e-08, +-1.60899536970598434e-08, +-7.64906868266760810e-09, +-1.76508969780000362e-09, + 1.88483672950163194e-09, + 3.87519676806499904e-09, + 5.04210581678781042e-09, + 6.50980774611836563e-09, + 8.92281418935763343e-09, + 1.06642496015132398e-08, + 7.99881552327574751e-09, + 7.48572480810244726e-10, +-4.59006902263252983e-09, +-3.75908729627904347e-09, + 2.88270611825196918e-11, + 2.73473149705905093e-09, + 3.56685750803352130e-09, + 3.34680589775318088e-09, + 2.80615500779220041e-09, + 2.26834563832411465e-09, + 1.82151651279330900e-09, + 1.46885514246418003e-09, + 1.19324485634188767e-09, + 9.77020899349232693e-10, + 8.06068771802298538e-10, + 6.69768613874963526e-10, + 5.60208652507763314e-10, + 4.71466467775788279e-10, + 3.99070519870285815e-10, + 3.39613649735800016e-10, + 2.90476602832906568e-10, + 2.49628893123473660e-10, + 2.15484042883650742e-10, + 1.86793270812309866e-10, + 1.62566737302916265e-10, + 1.42014683562821603e-10, + 1.24503053106861248e-10, + 1.09519806369038156e-10, + 3.91969913840226168e-10, + 5.74281788296353822e-10, + 5.80391954927258379e-10, + 4.85681442900489303e-10, + 3.56970379849080014e-10, + 2.34321665801801933e-10, + 1.35301697893506724e-10, + 7.03916825502422014e-11, + 5.59776458879239369e-11, + 9.78450619965305939e-11, + 1.31028191099509474e-10, + 7.04658333457519998e-12, +-2.80057278271423142e-10, +-3.81560792120123392e-10, +-1.11859571462185480e-10, + 1.60186559996297045e-10, + 1.82468807863361603e-10, + 8.40255542203425995e-11, + 7.32341191087699256e-12, +-2.32755872743650054e-11, +-2.83574654586819990e-11, +-2.48325143043025449e-11, +-1.98719309283775536e-11, +-1.55463863212467660e-11, +-1.21604339960799652e-11, +-9.57628292704959820e-12, +-7.60448985520188559e-12, +-6.08919725058325156e-12, +-4.91446817689740765e-12, +-3.99575681477239288e-12, +-3.27128598113234950e-12, +-2.69551235063851420e-12, +-2.23456238466090681e-12, +-1.86300465730973277e-12, +-1.56156106779750968e-12, +-1.31551146199584993e-12, +-1.11352097411554141e-12, +-9.46803961965781507e-13, +-8.08490388265559133e-13, +-6.93189115143472530e-13, + 1.20280840459834711e-11, + 3.44977044772411959e-12, +-2.39077656850153913e-12, +-5.03479151120350169e-12, +-5.42193218847662742e-12, +-4.69065095034983091e-12, +-3.50152686462776474e-12, +-1.78755691091173461e-12, + 6.74707157746263942e-13, + 2.40831280432189901e-12, +-8.20336738696470561e-13, +-9.83452218084788302e-12, +-1.12487988330608416e-11, + 4.53720519105425520e-12, + 1.46545696961575365e-11, + 6.13443745371118136e-12, +-3.00948505836548140e-12, +-4.16585380947789224e-12, +-2.13574457885452490e-12, +-5.85553285096091611e-13, + 4.62789477198650665e-14, + 2.02631119797244008e-13, + 1.98871951302869600e-13, + 1.60309431923606712e-13, + 1.23003766532804528e-13, + 9.36767267093994203e-14, + 7.17076701852344056e-14, + 5.53548681806905969e-14, + 4.31114765641103988e-14, + 3.38674474171577789e-14, + 2.68161024955202585e-14, + 2.13962140569158938e-14, + 1.71918775183882973e-14, + 1.39034188832972674e-14, + 1.13138914634200018e-14, + 9.26384533117497055e-15, + 7.62794397429975808e-15, + 6.31482846262220322e-15, + 5.25279852528403721e-15, + 4.38681491155488260e-15, +-3.27505072797899574e-13, +-2.67086998770465804e-13, +-1.48319476756721689e-13, +-4.68075403432593927e-14, + 1.20823079496873650e-14, + 3.60810267218112947e-14, + 4.95091690437372569e-14, + 7.54739321687640598e-14, + 9.30120322639071930e-14, + 2.80176381723853846e-15, +-2.48575656666439751e-13, +-3.07398715192813880e-13, + 2.95789964188973133e-13, + 6.56809557824080834e-13, +-2.82425154115783857e-14, +-4.34196213637222631e-13, +-1.72493988296578625e-13, + 5.06131584145111193e-14, + 7.31517742187498593e-14, + 3.67529408882584541e-14, + 1.14611352227754351e-14, + 1.52963716095584704e-15, +-1.13027744801005317e-15, +-1.44394979566376883e-15, +-1.19586935690022626e-15, +-9.04780298145729023e-16, +-6.70931588015539286e-16, +-5.00210326398117448e-16, +-3.78264238625694438e-16, +-2.84556092036319439e-16, +-2.18207748041518411e-16, +-1.68533206284397751e-16, +-1.29398857103121713e-16, +-1.03817847995320804e-16, +-8.31925472125548996e-17, +-6.65562017388704859e-17, +-5.19481036529207011e-17, +-3.93579495597495534e-17, +-2.94330891628135463e-17, +-2.70757979771264263e-17, +-1.22500581645860448e-16, + 3.30979423579111992e-15, + 3.70225854168667119e-15, + 2.52720130580847266e-15, + 1.20268952462734044e-15, + 4.38132338675581431e-16, + 5.59634739394036908e-16, + 9.99259888346268099e-16, +-4.56506545644670274e-16, +-5.69686503743616964e-15, +-8.22193446201523576e-15, + 8.25456090747758452e-15, + 2.40060487072919509e-14, +-7.80603012836570930e-15, +-2.50811874911857980e-14, + 1.25324768051857904e-15, + 1.03159569232221365e-14, + 3.19569321582345904e-15, +-8.71464759976461471e-16, +-1.08093565768418518e-15, +-5.08148192142993813e-16, +-1.61843310434721625e-16, +-2.67210994461887514e-17, + 1.32447370452183839e-18, + 1.02800719627152253e-17, + 9.39852262802740745e-18, + 6.56914704468408934e-18, + 4.59220406289943108e-18, + 1.78695102133240496e-18, + 1.37877607743029327e-18, + 2.61881453706106139e-18, + 2.22435631209773807e-18, + 2.06447002194507084e-18, +-4.74718062836488280e-19, +-2.20475945887351530e-18, +-9.47578114731297022e-19, +-1.05215522315288840e-18, + 9.89862327259136322e-19, + 2.17170374579012463e-18, + 8.29299043225261497e-19, + 1.44838093419853306e-16, + 3.81806058514823362e-17, +-1.19943187373947969e-17, +-4.23033907534180361e-17, +-3.34354842100372720e-17, +-2.09964117938549843e-18, + 2.06854314444171704e-17, +-4.88574812928326890e-18, +-1.01136646847799881e-16, +-1.78912583797266362e-16, + 1.31324555028534307e-16, + 7.14226035157803731e-16, +-1.82746873289447209e-16, +-1.17883845962335296e-15, + 3.88800527501320041e-16, + 6.71630877711434020e-16, +-9.99591546616832381e-17, +-1.87481217195482305e-16, +-4.57515233265253351e-17, + 1.86216569527295759e-17, + 1.59240023558404202e-17, + 6.94784445286261497e-18, + 6.21190311681232510e-18, +-9.61744808674629964e-19, + 2.54650473585629759e-19, + 1.12166810860398631e-18, + 1.70687023864925553e-18, + 2.43033615728600491e-18, + 6.70428590219641534e-19, + 1.80618234825302313e-18, + 1.52505930243388487e-18, + 2.91598600285176455e-18, + 2.57597127570891005e-18, +-1.23779904241216410e-19, +-7.43332854617708677e-19, +-2.40496332490703696e-18, + 1.45443774479325726e-18, + 1.05706836684454678e-18, + 2.06807010267310124e-18, +-7.72525321612596272e-19, + 6.67383653989324580e-18, + 2.88000518939229835e-18, + 1.67442746294968475e-17, + 2.54178771870981528e-18, +-2.49644431812669437e-19, + 5.78267655545568516e-18, + 2.65478623932490552e-18, + 4.24876949337595996e-18, +-1.51478754200885923e-18, +-1.31936664568612927e-18, + 1.60924415763542474e-17, + 9.74813512605317914e-18, +-3.70223384423621687e-17, + 1.35359311730219278e-17, + 3.87590146643602988e-17, +-1.37580144645376102e-17, +-9.21205691576154975e-18, + 4.41593913465641331e-18, + 8.45767814325940743e-19, + 2.08855637181667519e-18, + 1.38328953558815773e-18, +-2.68322067755526343e-18, + 3.87551337929318763e-18, +-1.83187702423707638e-18, +-4.81166077046010085e-19, + 2.43809071519045719e-18, + 1.50075986132221105e-18, + 6.66456686665901345e-19, + 9.05601770707613334e-19, + 1.98253621636431151e-18, + 2.69668602965132966e-18, + 8.98148891730146943e-19, + 1.00423769904734748e-18, +-7.92481955247090575e-21, +-1.23647373414977647e-18, +-1.94060603499237105e-18, + 8.33427458910819938e-19, + 1.62890637176314522e-18, + 2.41401485406644601e-18, +-9.11269268579718987e-19, +-1.99741668524317478e-19, + 2.15261574429860490e-18, + 6.62121410931742835e-19, +-1.40460651483265205e-18, +-1.20601791978576127e-18, +-6.66336637133295347e-18, +-6.03275631330740821e-18, + 2.89711064312525468e-18, +-4.53835307913935213e-18, +-4.76504322194596664e-18, +-3.62356844376289232e-18, +-4.37599589319139551e-19, +-1.42995917943830169e-19, + 7.19086576765442834e-18, + 1.48860306657935638e-18, + 7.22239263438193673e-18, + 5.50793303003262785e-18, + 3.87066844215355985e-18, + 3.49859344016917986e-18, + 5.09903401358421247e-18, + 4.56759834445413795e-18, + 2.23711278967911820e-18, + 3.63519468005041430e-18, + 5.99720571012740691e-19, + 2.93040840553731464e-18, + 3.54757133751154812e-18, + 2.14090606038673729e-18, + 1.45928157017147707e-18, + 5.76115732538094105e-19, + 1.07236983648350658e-18, + 1.61427451927867784e-18, + 1.31200285073361047e-18, + 2.17832327052674201e-18, + 7.31550743330262503e-19, +-9.21192289414431202e-20, + 3.51805888595332552e-19, + 2.20317545085226383e-18, + 1.58248960952017082e-18, + 7.35587007784302371e-19, + 2.61240042608603699e-19, +-1.01302041617154485e-17, +-1.18824838238856457e-17, +-1.88753339675820034e-18, +-8.26047964632894479e-18, +-3.95115419966062841e-18, +-1.24229861083685566e-18, +-2.04423215049364116e-18, +-5.79463775271273071e-20, +-4.14034633594498005e-18, +-6.44233560706548434e-18, +-2.37269229933420895e-18, +-3.82548650881032824e-19, + 2.01222294013817104e-18, +-9.46207065323679211e-19, +-1.52166696592470608e-18, + 9.99534185682987677e-19, +-9.10834839650292653e-19, +-1.82041472022800972e-18, + 1.32066306392045216e-18, + 6.01402593629642444e-19, + 3.67691996625348219e-18, +-6.23292812864231805e-19, + 1.43543191478576539e-18, +-4.05598719421594625e-19, +-5.45678469898601679e-19, + 9.90709756602517198e-20, + 1.78809850906041927e-18, +-2.17890308889849397e-19, + 9.00628200029384791e-19, + 1.09072818658379440e-18, + 1.07535445245749251e-18, + 1.29062972533164312e-18, + 2.38207530868520313e-18, + 6.73028821630239615e-19, +-5.98806818806138177e-19, + 3.65239845848614399e-19, + 1.35619533791550758e-18, + 4.23818583579273919e-19, + 1.38056996530509235e-18, + 5.11190440326372847e-19, +-3.33838878022379271e-18, +-9.05659407699325717e-18, +-1.32457071157607202e-18, +-6.60049683265259945e-18, +-5.57028082199249554e-18, +-6.73205925157862550e-18, + 7.23175934323953773e-19, +-4.49809241133378497e-20, + 5.60753655576481342e-18, + 5.27336064165656783e-19, + 1.37894448317716475e-18, +-3.46031794278770874e-19, +-2.00184942790939701e-18, +-5.92084904670370724e-18, +-5.34685084338477021e-18, +-2.70728642805261124e-18, +-8.59009286863677354e-19, +-4.45016041863240387e-18, +-1.62705584345911325e-18, +-2.79118746038866637e-18, +-2.50468337877936719e-18, +-2.25923963709919958e-18, +-4.50963435556414848e-19, +-1.14811025828126503e-18, +-1.48674471397216362e-18, +-2.84406215831341571e-18, +-3.67195328422536775e-18, +-1.22378889950210834e-18, +-2.15807522352371821e-18, +-2.88298647344999841e-18, +-3.10922354680269156e-18, +-2.46211958768347802e-18, +-3.24505237562218757e-18, +-1.58741512020390140e-18, +-2.19160740312606676e-18, +-2.40692050093638433e-18, +-2.56766799026171988e-19, +-2.01372355284520040e-18, +-4.14500450459039838e-19, +-8.38187353040619956e-19, + 1.00445678438590036e-01, + 5.13464174169052032e-02, + 2.94340488570058317e-02, + 1.86112926044404298e-02, + 1.27816787977349695e-02, + 9.40385793571515277e-03, + 7.32434341512056778e-03, + 5.97886097121814487e-03, + 5.07268097803578732e-03, + 4.44282526844214185e-03, + 3.99452435926900880e-03, + 3.66989439361117007e-03, + 3.43136979007023024e-03, + 3.25259874205661385e-03, + 3.11397275675406046e-03, + 3.00116587313151162e-03, + 2.90470995599478561e-03, + 2.81910144829322423e-03, + 2.74140811117802889e-03, + 2.67004676282780670e-03, + 2.60405249473020118e-03, + 2.54274025055683216e-03, + 2.48556950586416216e-03, + 2.43209111989247306e-03, + 2.38192330017347785e-03, + 2.33473779707988119e-03, + 2.29025029675550664e-03, + 2.24821306596720933e-03, + 2.20840909946937690e-03, + 2.17064738356624164e-03, + 2.13475902474507487e-03, + 2.10059406102030589e-03, + 2.06801881779401309e-03, + 2.03691370157800446e-03, + 2.00717134836853007e-03, + 1.97869506120170596e-03, + 1.95139748498179182e-03, + 1.92519947713790497e-03, + 1.90002914079992523e-03, + 1.87582099355569024e-03, +-3.58207880585233313e-02, +-1.53367911152320572e-02, +-7.29850243403375783e-03, +-3.80528808160590561e-03, +-2.14400854271967669e-03, +-1.28908608742584353e-03, +-8.17849925930260683e-04, +-5.42118339829908966e-04, +-3.72145003977790369e-04, +-2.62444116810007220e-04, +-1.88762552710367796e-04, +-1.37762531728147881e-04, +-1.02104584632191857e-04, +-7.76800589650326466e-05, +-6.16911656618019739e-05, +-5.16023153541524644e-05, +-4.51293940906294749e-05, +-4.06229073925377202e-05, +-3.71479550655055447e-05, +-3.42615150068149271e-05, +-3.17676155204032784e-05, +-2.95724603533741385e-05, +-2.76215257325512079e-05, +-2.58766536369089120e-05, +-2.43081966510181539e-05, +-2.28920634783469553e-05, +-2.16082988793726777e-05, +-2.04402012421988533e-05, +-1.93736868715836608e-05, +-1.83968033057806741e-05, +-1.74993475655474518e-05, +-1.66725629600121767e-05, +-1.59088961493929172e-05, +-1.52018010152509232e-05, +-1.45455792242515825e-05, +-1.39352497845966197e-05, +-1.33664416771033727e-05, +-1.28353049758821608e-05, +-1.23384368795078098e-05, +-1.18728198390282008e-05, + 4.00703921857515320e-03, + 1.50534936641775444e-03, + 6.28625780669703964e-04, + 2.88425092453393713e-04, + 1.43762964734770149e-04, + 7.70347424815259497e-05, + 4.39636115588798573e-05, + 2.65073832367654817e-05, + 1.67728217503709810e-05, + 1.10753619824609361e-05, + 7.57902695890009739e-06, + 5.29950953946469648e-06, + 3.68587356982076422e-06, + 2.46898499196237371e-06, + 1.57470739743821523e-06, + 9.90190520951921654e-07, + 6.58228007417263103e-07, + 4.84871127542995433e-07, + 3.91412449564070817e-07, + 3.33486540978708665e-07, + 2.91583874663010161e-07, + 2.58159181862584125e-07, + 2.30256647984721658e-07, + 2.06496605890559266e-07, + 1.86054137325114671e-07, + 1.68341189129286195e-07, + 1.52903143048546283e-07, + 1.39377018252052339e-07, + 1.27468685697014370e-07, + 1.16937583679199252e-07, + 1.07585486345214878e-07, + 9.92479585387866691e-08, + 9.17877510414176855e-08, + 8.50896436912564199e-08, + 7.90563854509694172e-08, + 7.36054740287291095e-08, + 6.86665835411520104e-08, + 6.41794962872515250e-08, + 6.00924295226213939e-08, + 5.63606738649834639e-08, +-3.43307765417959969e-04, +-1.15231849360110722e-04, +-4.29611370510287873e-05, +-1.76132257235963040e-05, +-7.86105695123845864e-06, +-3.78277640455704018e-06, +-1.94507841262987134e-06, +-1.05993165125298730e-06, +-6.07580878318520705e-07, +-3.64656248382102895e-07, +-2.30355719134811211e-07, +-1.56568549506305642e-07, +-1.15785985209961707e-07, +-8.77848895225563263e-08, +-6.12563157898743109e-08, +-3.69425332154437387e-08, +-1.96980122085740606e-08, +-1.02413640489156836e-08, +-5.89358893551265803e-09, +-3.99567778631951599e-09, +-3.07669354712365886e-09, +-2.52893014270499276e-09, +-2.13828311686742238e-09, +-1.83210787062752715e-09, +-1.58250832142027584e-09, +-1.37551792363832731e-09, +-1.20218632494551923e-09, +-1.05597704569648657e-09, +-9.31862083332117689e-10, +-8.25890986580360482e-10, +-7.34923955368158363e-10, +-6.56444055253499559e-10, +-5.88418564692967243e-10, +-5.29194538379269839e-10, +-4.77419224811017926e-10, +-4.31978877805207007e-10, +-3.91951325973460405e-10, +-3.56568935497062551e-10, +-3.25189482492031264e-10, +-2.97273094512535261e-10, + 2.44922519304556758e-05, + 7.43988741592987647e-06, + 2.50795770663650128e-06, + 9.30132596850346406e-07, + 3.76136474236453217e-07, + 1.64401528731326527e-07, + 7.70302948729211097e-08, + 3.84056107206523705e-08, + 2.02207973449457779e-08, + 1.10912188158656932e-08, + 6.14764162420832878e-09, + 3.33737318205158424e-09, + 1.96720230664503168e-09, + 1.65273858620717542e-09, + 1.64470461894485608e-09, + 1.33548543596425596e-09, + 8.15399467761713073e-10, + 3.97809835005749354e-10, + 1.73234580405951074e-10, + 7.81978668402411559e-11, + 4.22487076392345916e-11, + 2.81242381760433497e-11, + 2.13484941418534512e-11, + 1.71769504816720232e-11, + 1.41556645201188913e-11, + 1.18056979723062570e-11, + 9.92548111090081599e-12, + 8.40067591214461785e-12, + 7.15303427348009633e-12, + 6.12464152107943826e-12, + 5.27133062664401084e-12, + 4.55893032581510453e-12, + 3.96074698384665054e-12, + 3.45575615338089114e-12, + 3.02727560694180500e-12, + 2.66197540492944402e-12, + 2.34913509448313246e-12, + 2.08007912975512495e-12, + 1.84774644052110275e-12, + 1.64635784486297538e-12, +-1.52015802964362579e-06, +-4.21940277925960302e-07, +-1.29812504946056896e-07, +-4.39419286462947688e-08, +-1.62359595704675554e-08, +-6.49539195390132503e-09, +-2.79154000804920816e-09, +-1.27974080180784667e-09, +-6.23832990739513000e-10, +-3.26042961399789925e-10, +-1.83999493021390602e-10, +-1.01794743575342227e-10, +-3.75725577109109249e-11, +-5.92920921267182687e-13, +-5.82367678984393001e-12, +-2.37200757528254066e-11, +-2.53319878487601113e-11, +-1.58341727116536663e-11, +-7.27506923604374326e-12, +-2.82240065540461126e-12, +-1.06125555518614670e-12, +-4.57501053967313536e-13, +-2.53733257122862381e-13, +-1.73607126187767126e-13, +-1.31947389992128265e-13, +-1.04563663814301103e-13, +-8.43534711883518643e-14, +-6.87517811499153269e-14, +-5.64777496381092306e-14, +-4.67169252006491253e-14, +-3.88893024160428479e-14, +-3.25656560502649546e-14, +-2.74220786825807895e-14, +-2.32116113935743744e-14, +-1.97440837726883540e-14, +-1.68723165079056053e-14, +-1.44815216420048387e-14, +-1.24809758221532403e-14, +-1.07988944833537260e-14, +-9.37815059317810310e-15, + 8.43174912632569343e-08, + 2.15500285196655559e-08, + 6.09617663245199993e-09, + 1.89684084076483917e-09, + 6.44643421261185213e-10, + 2.37552241817181102e-10, + 9.42315236317078568e-11, + 3.99144447966338479e-11, + 1.78225998284357338e-11, + 8.25874778578359908e-12, + 4.20136501303800894e-12, + 2.94568242183231690e-12, + 2.30879350657946517e-12, + 6.14142460374526250e-13, +-7.94970278046997992e-13, +-4.71482988012830204e-13, + 2.70477654412848808e-13, + 4.29437141235619741e-13, + 2.67707289831142365e-13, + 1.16087709925565644e-13, + 4.14390285026314438e-14, + 1.37382556825238975e-14, + 4.92447903725716936e-15, + 2.25313323244237825e-15, + 1.35831131431409524e-15, + 9.65580347490650756e-16, + 7.34564308234987289e-16, + 5.73926778454400534e-16, + 4.54517753028029124e-16, + 3.63115183755817061e-16, + 2.92485856063144492e-16, + 2.36981728525647605e-16, + 1.93499142841511242e-16, + 1.58772917721791184e-16, + 1.31087064954224608e-16, + 1.09036724084797477e-16, + 9.09971491217697527e-17, + 7.63866665878750333e-17, + 6.42756014736424457e-17, + 5.46113720040432853e-17, +-4.25525142557159028e-09, +-1.00788798115904735e-09, +-2.63787645756617226e-10, +-7.58901151074442387e-11, +-2.38525556711056755e-11, +-8.13641910040198521e-12, +-2.99282417718745990e-12, +-1.18174273677865018e-12, +-5.00029523710068551e-13, +-2.20191426673028106e-13, +-8.32168949930588775e-14, +-1.90545066325906313e-14, +-3.91399808815674363e-14, +-7.14564574543224320e-14, +-1.80150116027128364e-14, + 3.01050873014515182e-14, + 1.68052138871236570e-14, +-2.89645484957036651e-15, +-6.62878330166076579e-15, +-3.95130073642196280e-15, +-1.60871915373502465e-15, +-5.36291546887074503e-16, +-1.62466123366374144e-16, +-5.08575311060466064e-17, +-1.93149347167256251e-17, +-1.02031004413178958e-17, +-6.61542598957853334e-18, +-4.90464437620749624e-18, +-3.58614705211865632e-18, +-2.71129411091387044e-18, +-1.95142558724373260e-18, +-1.56608698282636856e-18, +-1.24303883628019010e-18, +-1.13599435429920884e-18, +-8.26678688964925780e-19, +-6.00705806519753678e-19, +-5.22183833061023369e-19, +-4.02491553786396952e-19, +-3.43663770556451324e-19, +-1.03492257830201131e-19, + 1.97915129640609714e-10, + 4.36834753453612577e-11, + 1.06340298206223845e-11, + 2.84296211427157595e-12, + 8.30298290965740886e-13, + 2.63330917470366764e-13, + 9.00925724993329251e-14, + 3.29946909220521944e-14, + 1.29380446403075136e-14, + 5.77255791252572007e-15, + 3.11964229088391068e-15, + 7.16152216526131300e-16, +-1.59260524666907163e-15, + 3.05443177420643708e-16, + 2.33515531787547247e-15, + 3.62690998838426427e-16, +-7.95792408890136229e-16, +-3.43322252713143427e-16, + 4.10777041193723668e-17, + 9.31509654418801341e-17, + 5.12517770273782597e-17, + 1.94984776235145335e-17, + 6.20528679451723081e-18, + 1.58476220678133430e-18, + 6.92647797130428886e-19, + 1.49948335658246803e-19, + 9.53905030613916554e-20, +-8.48290754515000658e-21, + 1.47826495886710515e-19, + 1.19716341325241287e-19, + 1.71208522099359896e-19, + 1.69650233220356782e-19, + 1.08362275936410979e-19, +-1.44057092484637155e-19, +-4.13320559197778657e-20, + 7.59095362334683480e-20, + 1.05803102062128923e-19, + 2.27272878374636422e-20, + 2.25801269183234889e-20, + 9.47608230292992150e-20, +-8.56507990633958091e-12, +-1.77019264049013539e-12, +-4.02681330478404993e-13, +-1.00483452722932191e-13, +-2.73810286164617949e-14, +-8.10549342666647583e-15, +-2.59363091341613270e-15, +-8.91249782774561930e-16, +-3.20039926819712272e-16, +-1.11780843302257326e-16, +-5.54399007963604583e-17, +-8.14376227386768504e-17, +-1.73112588691732472e-17, + 9.82728494765311535e-17, +-1.17305554267302131e-17, +-6.38357898983326781e-17, +-4.19416959339435552e-19, + 1.62187628654206376e-17, + 5.08339495832748165e-18, +-6.38345911436097626e-19, +-1.09181492928716003e-18, +-4.94791516295797244e-19, +-1.66445060087608671e-19, +-1.50085354719168236e-19, + 1.27918799113497642e-19, + 8.91126443404143613e-20, + 3.06143887753314557e-20, +-8.19198712298320867e-20, + 5.63853775459096964e-20, + 5.43986463917907409e-20, + 2.69750480724742441e-19, + 1.15386499620996220e-19, + 5.79138538903106271e-20, +-4.75563228791336548e-20, + 2.01625886974811481e-20, +-6.96793383546642285e-22, + 9.99538139292722502e-20, + 4.00736598530682588e-20, +-1.21250734708416970e-21, + 9.36340396963751309e-20, + 3.47461489345526649e-13, + 6.75399114386569536e-14, + 1.44174132213095804e-14, + 3.37194367786610862e-15, + 8.60509361366891901e-16, + 2.39436506907027594e-16, + 7.10620947018392307e-17, + 2.31022942888699402e-17, + 8.73028486419901118e-18, + 3.24461803245024066e-18, + 8.18628392549181106e-20, +-2.32181828159260505e-19, + 3.82293293183927772e-18, + 2.28556928200775542e-19, +-3.57727557307148138e-18, + 1.27983074118051903e-18, + 1.01156943128323398e-18, +-1.58993436116150467e-19, +-1.94551891871159752e-19, + 3.91286275272912042e-20, + 6.86275278340030538e-20, + 8.33056001433100001e-20, + 6.50059324730053009e-20, +-5.72254866576340436e-20, + 1.35269332141536037e-19, + 8.29615376651442797e-21, + 6.25261862872972277e-20, +-4.34764271484853870e-20, + 4.84703591531848874e-20, + 9.31826836927044231e-20, + 1.14785620180168848e-19, + 6.21296461356846811e-20, +-7.77073147144397303e-22, + 4.47015634751652679e-20, + 4.12479895155001022e-20, + 6.38715499635243949e-20, +-2.53764517369001307e-20, + 2.68286461097591206e-20, +-1.81508945541778781e-21, + 8.62685172269049897e-20, +-1.32871786934810800e-14, +-2.43768685179589564e-15, +-4.89898858249707512e-16, +-1.08926883983920637e-16, +-2.66865427625432035e-17, +-6.93534558956082891e-18, +-2.45015713474801334e-18, +-1.12040270952940990e-18, +-4.42592072018997904e-19, +-1.30765812578357872e-19, +-1.41909951474929376e-20, + 8.67957779163536863e-20, + 4.38629689927970885e-20, + 6.09750487134711216e-20, + 2.17190168169978350e-19, + 1.86159607744550100e-19, +-2.44151603563126980e-20, + 9.53648758612217848e-20, + 5.58297360323076509e-20, + 9.00707725176792752e-20, + 7.95553599371617502e-20, + 3.48085252038878974e-20, + 1.01422582382835183e-19, +-2.57361901345676998e-20, + 9.47116791489411413e-20, + 1.30468057226042146e-19, + 3.35425031298277440e-20, +-1.08396279089215737e-20, + 2.15383636004738258e-19, + 1.11224906985045976e-19, + 1.64217901721051713e-19, + 1.33021016349892424e-19, + 5.20787462518693322e-20, + 6.46608409512256470e-20, +-6.57004694506350799e-21, + 2.28002584430591648e-20, + 1.07175448320733836e-19, + 6.95763835578731038e-21, +-9.37483224178059300e-22, + 8.89333337477015135e-20, + 4.77633604704117675e-16, + 8.21154365149707232e-17, + 1.36625417770721951e-17, + 1.48771899031786133e-18, + 3.24256897814694092e-19, + 1.37373813558742251e-19, +-3.29153374074926242e-19, +-2.59686988136412851e-19, + 3.70795786220472750e-20, + 6.44967577637087120e-20, +-4.80004262697256715e-20, + 8.98612154370390684e-20, + 3.17165926891802997e-21, +-8.46576020659721863e-22, +-3.93582352254727651e-21, + 9.80769253567129035e-20, +-3.47743448933608239e-20, + 6.62038392955561936e-20, +-2.84524440653198559e-20, + 4.94225612179458131e-20, +-1.37079461802351909e-20, + 4.42143877110149920e-20, + 6.71911547566671797e-20, +-5.19514120309845025e-20, +-1.93064726783856814e-20, +-3.75701013461506512e-20, + 5.14886198189855707e-20, +-4.99765823169347255e-22, + 5.64868625696123989e-20, + 3.27234356889341621e-20, + 1.45918781195262864e-19, + 2.68381770510147921e-20, + 1.73737209881965228e-20, +-6.20529294171147386e-20, +-6.98301552435795176e-20, + 4.07688402798137291e-20, + 3.58216164503575782e-20, + 3.74732206666643508e-20, +-7.43592489599543118e-21, + 9.18278904613142271e-20, +-3.45833501342370831e-17, +-1.17189145525855295e-17, +-4.51727509792758781e-18, +-2.21494469829590325e-18, +-6.14089016739671114e-19, +-2.07301091834648074e-19, +-2.83217774096973648e-19, +-4.52765729914120107e-21, + 7.47973365495688671e-21, +-5.68508236876658726e-20, +-2.78565454464532334e-20, +-4.22961960901027189e-20, + 8.27099641197572974e-20, +-6.30348473385604279e-20, +-1.31245154363443580e-19, +-3.04326821334574922e-20, +-1.07963660314917271e-19, + 1.98539348631121905e-21, + 1.73345762310833304e-20, + 1.60941819399879380e-20, +-7.90330261320218879e-20, +-3.08466111307336085e-20, +-4.24663491022493011e-20, + 4.23808627530354385e-20, + 4.14221165890282436e-20, +-4.11202739488110076e-20, +-1.58381328311872142e-20, +-1.72690104802057392e-19, +-7.12031108703072870e-20, + 3.43512070021270477e-20, + 2.33823090021560662e-20, +-7.09571725863205559e-20, +-1.23933548901020077e-20, + 2.79503147870257926e-20, +-4.49211846631116922e-20, +-3.70488268779273760e-20, +-1.94165005926707498e-20, +-6.83009608544246194e-20, +-6.08694613209030657e-20, +-3.56587515410348545e-21, +// root 6 + 1.60489672744315581e-01, + 1.43847293242148538e-01, + 1.29339805399999175e-01, + 1.16694701934415890e-01, + 1.05658893524767539e-01, + 9.60060300795648608e-02, + 8.75384074833357034e-02, + 8.00858014366011284e-02, + 7.35027658655776350e-02, + 6.76654551845120300e-02, + 6.24689903173372418e-02, + 5.78264253142578288e-02, + 5.36693682414616097e-02, + 4.99476854485718103e-02, + 4.66244037680168186e-02, + 4.36663402206592874e-02, + 4.10370250960195582e-02, + 3.86964508080438543e-02, + 3.66050215166074250e-02, + 3.47270555189517077e-02, + 3.30321348351365340e-02, + 3.14949308067945175e-02, + 3.00944538819146908e-02, + 2.88132470233699520e-02, + 2.76366958775904233e-02, + 2.65524785659711111e-02, + 2.55501344193058491e-02, + 2.46207255836650291e-02, + 2.37565696637199175e-02, + 2.29510267462984564e-02, + 2.21983283536394474e-02, + 2.14934390068230070e-02, + 2.08319433697829043e-02, + 2.02099536236471679e-02, + 1.96240329628959917e-02, + 1.90711320315841669e-02, + 1.85485358159045294e-02, + 1.80538190397052864e-02, + 1.75848085158182184e-02, + 1.71395512196525594e-02, +-8.89707200866380991e-03, +-7.75987659362862778e-03, +-6.76191190966761359e-03, +-5.89642100101372968e-03, +-5.15118719309708671e-03, +-4.51196343544566988e-03, +-3.96450489801399106e-03, +-3.49565300102386203e-03, +-3.09381290792380822e-03, +-2.74895238707361126e-03, +-2.45204832690968646e-03, +-2.19408282742029372e-03, +-1.96554979740003665e-03, +-1.75798262210985815e-03, +-1.56697078992403200e-03, +-1.39299538540379607e-03, +-1.23843783983295405e-03, +-1.10422488675212638e-03, +-9.89071078308564064e-04, +-8.90476758478755785e-04, +-8.05757298246055826e-04, +-7.32534109766690383e-04, +-6.68847179137567168e-04, +-6.13117005198548668e-04, +-5.64072904227776845e-04, +-5.20686879811873768e-04, +-4.82120919233997242e-04, +-4.47686557835975853e-04, +-4.16813998848636488e-04, +-3.89028394743160281e-04, +-3.63931475020673684e-04, +-3.41187190627486139e-04, +-3.20510402693096892e-04, +-3.01657899634591746e-04, +-2.84421210560086815e-04, +-2.68620815865348492e-04, +-2.54101452975178863e-04, +-2.40728286706589083e-04, +-2.28383766919787278e-04, +-2.16965036017383961e-04, + 1.50854012508609101e-04, + 1.33388174907025648e-04, + 1.16236770468012947e-04, + 1.00365531159665166e-04, + 8.62066398497849664e-05, + 7.38610754247787305e-05, + 6.32443627950602218e-05, + 5.41800133529727663e-05, + 4.64617752107418256e-05, + 3.99155063953513989e-05, + 3.44732625175376154e-05, + 3.01945216700435506e-05, + 2.71007402641647301e-05, + 2.48739622347173177e-05, + 2.28625545776894443e-05, + 2.05799309535914654e-05, + 1.80415460267831335e-05, + 1.55377874100134403e-05, + 1.32984533748994078e-05, + 1.13999828251171489e-05, + 9.82339749777179987e-06, + 8.51801907775440320e-06, + 7.43235070079183909e-06, + 6.52321982566043740e-06, + 5.75643793302781563e-06, + 5.10526273999886413e-06, + 4.54871519753094580e-06, + 4.07021416910845034e-06, + 3.65654452245694208e-06, + 3.29708761063856237e-06, + 2.98324532357648497e-06, + 2.70800542924649744e-06, + 2.46561053884781948e-06, + 2.25130374137804718e-06, + 2.06113150058288230e-06, + 1.89178971119023204e-06, + 1.74050256702004863e-06, + 1.60492657795270521e-06, + 1.48307401088717722e-06, + 1.37325144196727010e-06, +-1.42768703198340268e-06, +-1.46103183547130336e-06, +-1.38529666130180753e-06, +-1.25456665017841856e-06, +-1.10413374211958405e-06, +-9.54685096817463536e-07, +-8.17144097206006733e-07, +-6.96346798396308019e-07, +-5.92407732947552703e-07, +-4.99587073230785309e-07, +-4.06456618643121268e-07, +-3.05855981086973019e-07, +-2.13840264452353703e-07, +-1.66659080565693239e-07, +-1.75490148912265813e-07, +-2.04278955011610011e-07, +-2.14464505438615960e-07, +-1.99748326636447045e-07, +-1.72590991936714315e-07, +-1.44160247366908399e-07, +-1.19302787679867463e-07, +-9.89406784255161685e-08, +-8.25659864100737317e-08, +-6.93985399857896696e-08, +-5.87442630919617195e-08, +-5.00562201515561301e-08, +-4.29161944024637486e-08, +-3.70049999055823287e-08, +-3.20774194749339489e-08, +-2.79434272814252620e-08, +-2.44544736127720630e-08, +-2.14934604970106144e-08, +-1.89673573070176284e-08, +-1.68017099555597653e-08, +-1.49365198659910953e-08, +-1.33231235246001885e-08, +-1.19218097744202863e-08, +-1.06999860946116466e-08, +-9.63075682437069688e-09, +-8.69181300751133362e-09, +-6.91119739290964424e-09, + 2.00555057501652846e-09, + 6.91974064344338527e-09, + 9.07258701451464933e-09, + 9.52937464032754050e-09, + 9.04617936387746571e-09, + 8.09950192443496139e-09, + 6.99735319903695562e-09, + 6.05116784237743764e-09, + 5.67553891859065440e-09, + 6.06257723863085693e-09, + 6.35539982606520777e-09, + 4.72254258472101467e-09, + 1.02778026341274378e-09, +-1.70380719409022039e-09, +-1.46601984796796571e-09, + 2.31391262789255680e-10, + 1.45979377370847591e-09, + 1.81977193130774435e-09, + 1.68905250261757980e-09, + 1.41155816700829902e-09, + 1.13988105423119667e-09, + 9.15074758551227622e-10, + 7.37850172164359869e-10, + 5.99390950028630818e-10, + 4.90775010928939789e-10, + 4.04902289754038345e-10, + 3.36436290107976326e-10, + 2.81402426013296796e-10, + 2.36825698319524965e-10, + 2.00459972901787401e-10, + 1.70593765602863937e-10, + 1.45911384727267781e-10, + 1.25392880603755977e-10, + 1.08241339091564419e-10, + 9.38294684494860453e-11, + 8.16600639769429257e-11, + 7.13364127784190321e-11, + 6.25400196525325957e-11, + 5.50136817152386396e-11, + 5.64764523707792527e-10, + 3.35368007819445227e-10, + 1.66507701806584707e-10, + 5.75196014190074228e-11, +-5.73151487122264951e-12, +-3.88074153314562994e-11, +-5.35123519435617885e-11, +-5.43050407347399841e-11, +-3.67153577307677090e-11, + 1.56076719487706430e-12, + 3.05081046260519866e-11, +-1.87982695713222542e-11, +-1.47947729969674588e-10, +-1.91981023251174034e-10, +-6.20840922671503258e-11, + 6.95532901112302604e-11, + 8.29117461338213838e-11, + 3.77709212056879373e-11, + 1.99559606480329921e-12, +-1.22155292137383860e-11, +-1.43856867269730200e-11, +-1.25079297116505168e-11, +-9.98957103059937095e-12, +-7.81077236216618860e-12, +-6.10869657874802569e-12, +-4.81038660564486803e-12, +-3.81987598413236131e-12, +-3.05871071312666889e-12, +-2.46862202335423410e-12, +-2.00714025108596376e-12, +-1.64322296585005365e-12, +-1.35400400489536813e-12, +-1.12245936865404895e-12, +-9.35817448834279250e-13, +-7.84395202835864558e-13, +-6.60802399786535848e-13, +-5.59341004715230283e-13, +-4.75595292551542846e-13, +-4.06120324588983098e-13, +-3.48198647370506528e-13, +-1.05155374809391499e-11, +-8.37976375230922692e-12, +-5.71262256866981035e-12, +-3.47396916588367429e-12, +-1.90604465295170120e-12, +-9.33173428579310787e-13, +-3.24987979745052370e-13, + 2.95643060650629927e-13, + 1.21011538809000622e-12, + 1.79270012861288288e-12, + 7.18612020228378079e-14, +-4.32359411405665143e-12, +-5.09662300196770300e-12, + 2.25911243549577353e-12, + 7.03405430092826705e-12, + 3.03665683549964817e-12, +-1.33377990420170506e-12, +-1.93653307651222367e-12, +-9.97158017812586293e-13, +-2.66987389814860969e-13, + 3.12889070993357566e-14, + 1.03866976647793458e-13, + 1.00379856939054390e-13, + 8.06313346377113494e-14, + 6.18083801146100593e-14, + 4.70599986556736160e-14, + 3.60187746467649687e-14, + 2.78056658905495959e-14, + 2.16548376457829731e-14, + 1.70087986597924129e-14, + 1.34707063482717310e-14, + 1.07459910050804890e-14, + 8.63625383150375897e-15, + 6.98520021359272100e-15, + 5.68676138201357050e-15, + 4.65446483259357135e-15, + 3.83174922425311688e-15, + 3.17199852232250643e-15, + 2.63717823173281217e-15, + 2.20585858322083326e-15, + 4.55647432615304769e-14, + 9.45830385550650074e-14, + 9.06154550910837363e-14, + 6.81291344560141607e-14, + 4.44121539878366173e-14, + 2.64010168828048989e-14, + 1.93557442974981829e-14, + 2.71675380157404486e-14, + 3.50381381597998523e-14, +-6.51202182915402411e-15, +-1.23433431156658693e-13, +-1.49148093195215139e-13, + 1.35794869371764745e-13, + 3.07852856532482966e-13, +-1.17570610929793675e-14, +-2.05592102325946899e-13, +-8.39709023679908858e-14, + 2.25880714033199921e-14, + 3.43128237699218671e-14, + 1.73627248898663399e-14, + 5.38431401783159353e-15, + 6.65368368053424876e-16, +-5.95230894557702599e-16, +-7.29625015649214574e-16, +-6.02175357268658950e-16, +-4.53619037542255077e-16, +-3.38572396515415663e-16, +-2.51511625300702755e-16, +-1.90134761737201605e-16, +-1.44742348755549323e-16, +-1.09660962294108108e-16, +-8.57481634948325724e-17, +-6.52345367556866109e-17, +-5.13907739140603432e-17, +-3.90924177598030130e-17, +-3.18257483430212222e-17, +-2.61949779528740269e-17, +-1.99118101128785849e-17, +-1.70227804780473009e-17, +-1.21168374144628995e-17, + 2.82995529998625922e-15, + 4.77562209024212400e-16, +-5.36824121172978739e-16, +-7.68995042622827691e-16, +-6.72204083337352690e-16, +-4.21995389846538940e-16, + 1.79727218470747051e-17, + 4.09931166621973036e-16, +-1.98115517745326986e-16, +-2.64216882085919526e-15, +-3.81824936059170345e-15, + 3.94270741623453832e-15, + 1.13200502127187616e-14, +-3.54978072047300350e-15, +-1.18068435483895414e-14, + 4.75553593334252998e-16, + 4.87660017120773063e-15, + 1.55641795591478118e-15, +-3.93392885762532566e-16, +-5.09671898408545807e-16, +-2.42593556367199156e-16, +-7.57745989056918261e-17, +-1.29949594424195183e-17, + 2.38943667924752488e-18, + 4.42568324749465901e-18, + 4.91668766805262266e-18, + 2.27924463833799138e-18, + 1.91946489670591888e-18, + 7.97932667000076609e-19, +-4.49717491561368208e-19, + 4.76744817491198940e-19, + 5.72251360933602684e-19, + 1.19217335415103509e-18, + 3.24024408019555516e-20, + 1.72502136481875126e-18, + 6.65161068302531747e-19, +-1.69038746796287910e-19, + 9.23436813162536340e-19, +-1.46866783163035463e-19, + 1.03775263599707731e-18, +-9.25436956601225736e-17, +-4.34246823403871598e-17, +-1.21300808873891412e-17, + 7.09727413772571432e-18, + 6.56771684505258686e-18, + 1.25794948630336919e-17, + 1.94234726499860132e-17, +-8.49675864421804670e-19, +-4.22769351183809759e-17, +-8.33971778209594358e-17, + 5.88669595825145211e-17, + 3.38082719943525809e-16, +-8.39771364334058550e-17, +-5.51133888288265152e-16, + 1.77205785152916736e-16, + 3.18845588542119374e-16, +-4.46134282560828455e-17, +-9.10407876045331812e-17, +-2.13610327428722022e-17, + 7.43303507970060511e-18, + 6.01182174015214437e-18, + 2.66342587767598943e-18, + 1.82355557656455707e-18, + 1.60676188203829328e-19, +-7.09713351699467092e-20, + 8.61495392821134508e-19, + 3.71998656481337173e-19, + 6.86162469035356116e-19, + 7.87028507703380195e-20, + 9.62021302027481997e-20, + 1.38562219617262607e-18, +-6.57003026671923219e-19, + 1.82412960129852057e-18, + 1.11575689574037821e-18, + 2.44863445881149976e-18, + 1.27421803230229715e-18, + 2.98074708330015549e-19, + 1.20773956142013318e-18, + 4.52177579706932164e-19, + 1.54437684981970220e-18, + 3.32223593639807881e-18, + 7.27857513789898353e-18, + 8.04281940772113804e-18, + 3.05157703173744507e-18, + 4.68500126341183397e-18, + 1.85806819372720576e-18, + 2.23082049824557962e-18, +-4.41500205200647619e-18, +-3.45018164032149942e-19, + 4.90141329650647736e-18, + 8.10468987576649454e-18, + 5.23213408034173036e-18, +-1.71885828333504638e-17, + 7.94543837583518535e-18, + 1.96677734647834612e-17, +-8.63472854325195376e-18, +-1.91255004688468515e-18, + 2.16082470104238274e-18, + 7.50502275048437561e-19, +-7.16882403620591098e-19, + 2.38773641506678374e-19, + 6.59178050701871554e-19, + 7.65318979511924463e-19, + 6.54868148416715280e-19, + 1.21327600987286742e-19, + 1.28422276108658639e-18, + 4.00493563226417413e-19, + 8.68041595592404276e-19, + 2.74028429369655279e-19, +-4.90175793811137280e-19, + 7.61228852275614492e-19, +-6.74994943042494794e-20, + 1.54625352468700200e-18, + 5.39519377551588390e-19, + 1.01535379812606965e-18, + 6.46238261637435046e-19, + 5.63324671014184413e-19, + 9.45209313990690735e-19, +-1.54334002108346236e-19, + 1.24073400188859043e-18, +-5.64226197403760276e-18, + 3.53265517201932071e-19, + 1.03910014989617617e-18, + 3.32228326617459265e-18, + 1.68935755972240482e-18, +-3.26638567067486893e-18, + 1.24651929916715117e-18, +-4.45404387667078612e-18, +-1.96351711765352589e-18, +-1.56187773616253589e-20, +-3.54469206251798571e-18, +-2.71224340570582218e-19, + 1.42364932858507047e-18, + 4.15760480036781404e-18, + 3.12298209547024495e-18, + 1.27070283084118185e-18, + 3.25706755206400957e-18, + 9.27512484791959038e-19, +-9.92215402845860318e-19, + 1.18876930750901595e-18, + 7.71351464024872772e-19, + 2.97020039560589965e-19, + 1.38496405761016543e-18, + 1.07327187448990567e-18, + 9.08229528437130001e-19, + 2.02272042840071592e-18, +-1.57325931456826155e-20, + 7.85508576416099881e-19, +-3.70217953198630647e-20, + 8.21766047995438364e-20, + 8.16881886452393300e-19, +-1.47465174473564990e-19, + 9.77776270366402698e-19, + 7.95526724064532739e-19, + 1.52603262231538758e-18, + 8.03364925292956688e-19, + 6.39858453813175452e-19, + 7.69551635770435475e-19, +-3.42687240077462535e-19, + 1.30399018461634826e-18, +-5.07637050325136106e-18, +-4.21352070968778278e-18, +-2.21114650626067551e-19, + 1.98842910714349206e-18, +-1.70245497912142657e-19, +-1.51047382627800725e-18, + 2.76582118766553436e-18, +-2.22687594410005076e-18, + 5.95608678748720827e-19, + 1.03108321479778501e-18, +-2.68650103355047945e-18, + 1.65025286598765077e-18, + 2.03733066897521430e-18, + 2.19591164322850785e-19, + 5.03692347544333032e-19, + 5.57111699708215580e-19, +-4.21684895564195541e-20, +-6.05794186119316646e-19, +-6.50922517687464847e-19, +-2.04187757604820280e-18, + 6.06835400921097848e-19, + 3.19250710839156367e-19, + 1.46984367986588899e-19, + 2.39911918880060734e-19, + 5.05864499512954405e-19, +-2.24497910740543952e-19, + 6.05478602221073126e-19, + 9.83748419678698611e-19, + 8.83393719485825599e-19, + 1.03675781645652554e-19, + 1.53798717510688792e-18, + 4.43525226070795268e-19, + 1.56715539266647801e-18, +-2.48772695341619755e-19, + 9.11084394378755856e-19, + 4.42420133590237608e-19, + 2.88605185105503019e-19, + 3.77092451572181717e-19, +-1.72843809430996613e-19, + 2.71045473996960969e-19, +-3.36111458444992150e-18, +-4.92552787960818622e-18, +-7.47596244214294435e-18, + 1.87662358970745743e-19, +-4.50663400754694593e-18, +-4.14666598523298694e-18, +-2.01817182842823929e-18, +-2.98177517156265062e-19, +-2.43507055885076188e-18, +-1.12802364223716459e-18, +-4.53787613811261376e-19, +-1.49075218918280607e-18, + 1.58645743147116296e-18, +-8.35688837767080636e-19, +-1.94849278214391266e-18, + 2.55469467393732290e-19, +-1.40674708292561665e-18, +-1.51087458649862302e-18, +-1.26430908796121506e-18, +-2.34039601787338515e-18, +-1.32367911005102953e-18, +-4.66413270421793610e-19, +-4.37702213279699052e-19, +-1.26935502809017239e-18, +-5.04345400246742334e-19, +-1.04169709214179249e-18, +-1.35418721964127947e-18, +-9.59633464470064109e-19, +-1.41416606927736968e-18, +-1.03663168005381285e-18, +-1.00590522631438133e-18, +-9.15697629595794503e-19, +-1.34372089189928765e-18, +-4.89557299768193691e-19, +-9.13373635023495135e-19, +-4.76696759978000261e-19, +-1.00086238809879313e-18, +-7.33879707696466101e-19, +-1.01786440839163418e-18, + 1.91308677384313199e-19, + 1.26424666305441885e-01, + 8.64416292260617031e-02, + 6.32895590655070950e-02, + 4.89848575500516151e-02, + 3.96577530250394536e-02, + 3.32982972059065463e-02, + 2.87980812666048490e-02, + 2.55132778257057997e-02, + 2.30527098515106721e-02, + 2.11692791785155626e-02, + 1.97014086117650970e-02, + 1.85395789238415737e-02, + 1.76059025499065852e-02, + 1.68415157981830453e-02, + 1.62002011217384466e-02, + 1.56467220094993545e-02, + 1.51565280405899384e-02, + 1.47140574317232032e-02, + 1.43097981203653499e-02, + 1.39376377321917370e-02, + 1.35932307257837677e-02, + 1.32731979663315847e-02, + 1.29747686343410305e-02, + 1.26956102219595007e-02, + 1.24337324109799734e-02, + 1.21874222760751712e-02, + 1.19551957960701734e-02, + 1.17357598141248388e-02, + 1.15279815580467439e-02, + 1.13308639295311691e-02, + 1.11435252979655182e-02, + 1.09651828559583654e-02, + 1.07951388169021268e-02, + 1.06327688981284474e-02, + 1.04775126553539721e-02, + 1.03288653266590848e-02, + 1.01863709150399086e-02, + 1.00496162931923549e-02, + 9.91822615665266007e-03, + 9.79185868467757903e-03, +-2.61326471765078658e-02, +-1.46868435071293765e-02, +-8.84676802509641591e-03, +-5.64567749700243919e-03, +-3.78011805525835373e-03, +-2.63428697892878353e-03, +-1.89809391534799879e-03, +-1.40637458461660573e-03, +-1.06667736941833168e-03, +-8.24946414110851417e-04, +-6.48490187578711183e-04, +-5.17308478207039466e-04, +-4.19389981308096189e-04, +-3.47396882955943094e-04, +-2.95754919775405593e-04, +-2.58990131089886842e-04, +-2.31991338569515192e-04, +-2.10955301285931996e-04, +-1.93611290612686016e-04, +-1.78770308810365650e-04, +-1.65810458957641789e-04, +-1.54365533797865586e-04, +-1.44184647624564355e-04, +-1.35076985698515085e-04, +-1.26889704969820459e-04, +-1.19497458281969324e-04, +-1.12796161310950907e-04, +-1.06698646864787863e-04, +-1.01131400413325846e-04, +-9.60320301520506338e-05, +-9.13472762185169631e-05, +-8.70314283593830130e-05, +-8.30450578489162110e-05, +-7.93539936941220335e-05, +-7.59284903729934817e-05, +-7.27425469142470066e-05, +-6.97733464274166308e-05, +-6.70007921493313618e-05, +-6.44071213239511789e-05, +-6.19765822281546089e-05, + 1.99639763316026555e-03, + 9.85075819495384716e-04, + 5.24382798903453478e-04, + 2.97932232432219243e-04, + 1.78995966331071575e-04, + 1.12820002029937464e-04, + 7.41048249511347005e-05, + 5.04457128464643476e-05, + 3.54315935854358498e-05, + 2.55805708720739432e-05, + 1.88892583501198328e-05, + 1.41187100799056695e-05, + 1.04883427445697051e-05, + 7.60778261065988403e-06, + 5.40357319055515955e-06, + 3.88326507919834018e-06, + 2.93611523115449163e-06, + 2.36312980914754499e-06, + 1.99342935229841014e-06, + 1.72754127193336771e-06, + 1.51883936947039758e-06, + 1.34686741310403960e-06, + 1.20179299571777675e-06, + 1.07788910547544368e-06, + 9.71203888516646724e-07, + 8.78746479378628482e-07, + 7.98160174233178844e-07, + 7.27553434289678799e-07, + 6.65391501326785096e-07, + 6.10418742867850078e-07, + 5.61600431057718970e-07, + 5.18078211116595475e-07, + 4.79135637283171998e-07, + 4.44171255902373513e-07, + 4.12677412779583921e-07, + 3.84223442739444967e-07, + 3.58442241931683093e-07, + 3.35019471611458769e-07, + 3.13684823831767044e-07, + 2.94204913876760318e-07, +-1.23947162402929901e-04, +-5.45202431502796685e-05, +-2.59792129182014853e-05, +-1.32752154278994394e-05, +-7.20962338501368211e-06, +-4.12894693248819418e-06, +-2.47655594955314418e-06, +-1.54625893092917525e-06, +-9.99582147462454645e-07, +-6.67408859483038652e-07, +-4.63542576787236664e-07, +-3.41672996158531511e-07, +-2.68421260698963206e-07, +-2.12242255188473805e-07, +-1.54694957432317569e-07, +-1.00223724979563550e-07, +-6.04241215376319827e-08, +-3.73480525254781454e-08, +-2.55254026652780214e-08, +-1.93567586444660848e-08, +-1.56728329830733407e-08, +-1.31092431781723099e-08, +-1.11416720955482243e-08, +-9.55948125835697444e-09, +-8.25993267231297043e-09, +-7.18010339024713640e-09, +-6.27543190984232877e-09, +-5.51223657505573018e-09, +-4.86435559768339114e-09, +-4.31118300659247989e-09, +-3.83633166710463782e-09, +-3.42666354702035619e-09, +-3.07156783726095132e-09, +-2.76241611107511177e-09, +-2.49214695731564508e-09, +-2.25494657536665907e-09, +-2.04600119635337276e-09, +-1.86130373836193804e-09, +-1.69750177165313452e-09, +-1.55177713901509907e-09, + 6.67892093400889770e-06, + 2.64904201601794854e-06, + 1.14173540485421802e-06, + 5.29632401081049181e-07, + 2.62157840547485158e-07, + 1.37411534264807318e-07, + 7.57751856201042160e-08, + 4.37211054569636361e-08, + 2.62282053794274600e-08, + 1.61169125293462587e-08, + 9.80242926301048004e-09, + 5.75173641990662290e-09, + 3.73716390411846273e-09, + 3.48654953655358438e-09, + 3.63941033755781605e-09, + 3.03219617805195644e-09, + 1.92798193897759375e-09, + 1.02052486604255215e-09, + 5.15470493467246332e-10, + 2.86279480896057437e-10, + 1.86819110018420457e-10, + 1.38375199400325734e-10, + 1.09497999662226360e-10, + 8.92473656582985844e-11, + 7.38087871512995340e-11, + 6.16100143056883591e-11, + 5.18084296416791283e-11, + 4.38513337761569422e-11, + 3.73390271259899125e-11, + 3.19708523882288465e-11, + 2.75165478053337574e-11, + 2.37977931836576870e-11, + 2.06752538261179760e-11, + 1.80391830189616647e-11, + 1.58024973649935520e-11, + 1.38956160926606069e-11, + 1.22625757514512920e-11, + 1.08580941300395036e-11, + 9.64530778887042639e-12, + 8.59405070854858702e-12, +-3.23004368455194854e-07, +-1.16510047459296496e-07, +-4.57779147008843477e-08, +-1.94159825641084854e-08, +-8.81547877760104448e-09, +-4.25217828533700393e-09, +-2.16396984439498558e-09, +-1.15564097145980786e-09, +-6.48808931040399595e-10, +-3.90356241482112324e-10, +-2.53152370801385978e-10, +-1.52557509627788665e-10, +-4.97559209089106339e-11, + 1.21098101601913476e-11, +-7.72567699030411616e-12, +-4.94976972982422952e-11, +-5.44461888771145721e-11, +-3.49362358992874609e-11, +-1.68853509369948716e-11, +-7.26835982438494703e-12, +-3.28917905526137577e-12, +-1.78747093543325248e-12, +-1.17894834836604243e-12, +-8.73659215827948528e-13, +-6.81952329727908782e-13, +-5.44478960604661156e-13, +-4.40075703074362877e-13, +-3.58840803507347601e-13, +-2.94809845526339158e-13, +-2.43863491582487942e-13, +-2.03004291889009066e-13, +-1.69994596718624488e-13, +-1.43144268652607081e-13, +-1.21164838467757192e-13, +-1.03063867844514218e-13, +-8.80743343885753877e-14, +-7.55943610480698011e-14, +-6.51509651224225305e-14, +-5.63713223127179168e-14, +-4.89551869088942860e-14, + 1.43109002695758665e-08, + 4.72650473868964601e-09, + 1.70352566157495283e-09, + 6.64375806326298149e-10, + 2.78151073401359726e-10, + 1.24110633393715271e-10, + 5.86262663966184973e-11, + 2.90508467136127854e-11, + 1.47880795173706517e-11, + 7.55926900145213716e-12, + 4.45501372505392804e-12, + 4.24313861311283505e-12, + 3.96145199644167963e-12, + 8.02344941582880013e-13, +-1.92907841170557823e-12, +-1.09527637775992798e-12, + 5.32711221112884188e-13, + 8.97158113082994823e-13, + 5.71063899830045708e-13, + 2.55929451720275904e-13, + 9.79027890689861016e-14, + 3.74381598226267642e-14, + 1.68781131068944284e-14, + 9.69002390445308640e-15, + 6.63788641171709078e-15, + 4.94769074702718202e-15, + 3.81603238202934879e-15, + 2.99309522137712960e-15, + 2.37059465754810639e-15, + 1.89449751026019076e-15, + 1.52526755642928035e-15, + 1.23704275558168649e-15, + 1.01007136615707062e-15, + 8.29282214035109747e-16, + 6.85373528487000566e-16, + 5.69306943816738750e-16, + 4.74687693131120130e-16, + 3.98565518434518406e-16, + 3.35012110731149428e-16, + 2.84501369196015979e-16, +-5.88953456224049880e-10, +-1.79111702327071198e-10, +-5.95234104586604398e-11, +-2.14457414400230352e-11, +-8.31333510189516065e-12, +-3.44267561239906369e-12, +-1.51467388597594221e-12, +-7.08846715154138216e-13, +-3.55090449696552611e-13, +-1.76492703324725226e-13, +-4.98943014904756038e-14, + 1.68028428636154893e-14, +-5.98663159964420563e-14, +-1.40659620129932127e-13, +-3.07162788554148865e-14, + 6.70036638290764110e-14, + 3.68478342067221116e-14, +-5.34486655020378668e-15, +-1.36579621636231967e-14, +-8.29212542233335209e-15, +-3.45494142636750638e-15, +-1.20775725376712817e-15, +-4.06266269460904610e-16, +-1.54384638961742479e-16, +-7.67657603272251608e-17, +-4.82254631710237970e-17, +-3.39525286689453829e-17, +-2.50695762724405096e-17, +-2.00741100167722967e-17, +-1.46443998579615592e-17, +-1.15613085585141289e-17, +-8.85522552830720850e-18, +-6.80748617612075452e-18, +-5.32055691810043099e-18, +-4.17203499149455457e-18, +-3.12385283380493134e-18, +-3.16563949690461641e-18, +-2.22159109266642160e-18, +-2.32556544631935244e-18, +-1.46213241877653891e-18, + 2.27369240811019074e-11, + 6.39816832129845343e-12, + 1.96926045868095063e-12, + 6.58118716314105864e-13, + 2.37109395301070469e-13, + 9.14535162934901736e-14, + 3.74310860823518134e-14, + 1.60560903519352195e-14, + 7.37578277147677405e-15, + 4.42604854272602292e-15, + 3.45769640730075189e-15, + 4.84185805489805401e-17, +-4.07392102579060858e-15, + 5.01528343830043536e-16, + 4.82584953779154938e-15, + 6.57784583061474978e-16, +-1.70979837412764802e-15, +-7.38966697016588264e-16, + 7.45082406723927152e-17, + 1.90288371236732843e-16, + 1.06804359740760754e-16, + 4.09371741002700159e-17, + 1.34646550059029530e-17, + 4.54775233036104200e-18, + 1.15594648157574504e-18, + 5.52519495635962694e-19, +-1.00632182902787390e-20, + 3.24111069086924728e-19, +-8.18573706503834813e-19, + 4.74753405041966644e-19, + 1.59308881567481409e-19, +-1.52567907336269850e-19, + 2.64153520387096750e-19, + 5.02750793737775150e-19, + 3.36764463452896689e-19, + 4.46474613408057483e-19, + 2.09628975450889105e-19, + 3.73372236962959960e-19, +-7.26238947279660979e-19, +-4.18109727952549659e-20, +-8.29488662422180569e-13, +-2.16911566386617387e-13, +-6.20743242741033516e-14, +-1.93087804950558400e-14, +-6.48802232467255058e-15, +-2.33759455523265338e-15, +-9.02003517077834403e-16, +-3.68164917476783728e-16, +-1.42231150201514061e-16, +-3.58095274371795133e-17, +-4.14576306164902935e-17, +-1.46918696016970333e-16, +-1.79216567739811079e-17, + 2.14175551573942032e-16, +-2.65709032778133894e-17, +-1.32814705322984847e-16, + 7.08685316580229226e-19, + 3.43607533718556536e-17, + 1.04074240710998250e-17, +-1.65439346527051857e-18, +-2.37167708496172111e-18, +-1.59699379333450114e-18, + 1.60960960890699798e-20, + 4.90583506077694371e-19, +-3.65950682195640405e-19, + 1.07605749443868431e-20, +-3.41805703802765145e-19, + 2.58393614209265461e-19, +-3.11263329977521823e-19, + 5.74563355358566084e-20, + 4.95521236456020019e-20, + 1.02228547929862586e-19, + 8.87307118800863834e-20, + 2.65210359056036935e-19, + 7.28843439185654876e-19, + 3.74151222999964901e-19, + 8.99230457544674795e-20, + 1.24418493006783091e-20, +-2.69407964528496808e-20, + 4.73515836990116645e-20, + 2.87767360038841734e-14, + 7.02192667545950349e-15, + 1.87562550519461641e-15, + 5.46232000331801640e-16, + 1.72092025198991945e-16, + 5.88314482704878266e-17, + 2.02055789745156073e-17, + 9.23521251029616096e-18, + 5.63412363301245959e-18, + 1.18664118494046484e-18, +-2.27999684578912239e-18, +-1.50369842776948339e-18, + 7.89856891109643314e-18, +-2.18976328463290919e-19, +-6.71959746564172384e-18, + 2.40434114118296776e-18, + 2.85317759005703518e-18, +-4.61506939650189072e-19, +-6.96123660399330703e-19, +-8.81613694165500613e-20, + 2.73956828972974118e-20, +-3.25749966314011676e-19, + 3.17253077066176585e-19, + 7.10235821909178822e-19, +-2.27860162016593156e-19, + 9.51843163886295603e-20, +-7.45888224357754136e-20, + 1.05861371869104891e-19, +-3.69796798078370379e-19, + 4.49832671360003847e-19, +-1.36023112319178011e-19, + 3.50776172930492375e-19, + 9.45841240631919580e-20, + 3.28935959676538050e-19, + 2.33975637755004900e-19, + 6.19516214914121270e-19, +-6.96235700372336461e-20, + 2.16281066233399677e-19, +-1.52565454151817133e-19, + 6.12151548956829707e-20, +-9.52641713054460671e-16, +-2.16779766814152409e-16, +-5.36741620383534348e-17, +-1.49874367539170991e-17, +-6.13149288185622845e-18, +-7.07498400883504687e-19, +-1.02291289667447630e-18, +-4.36761340903618548e-19, +-3.86359351449964004e-19, +-1.14841077154400003e-18, +-6.84150470347831647e-19, +-5.51437990918509031e-20, +-3.88016593420283021e-19, + 4.55088608460046140e-20, + 9.92090046323887561e-19, +-1.72711470505806957e-19, + 7.68681831179569128e-19, +-3.27169854685727641e-20, + 7.07520688136333227e-20, + 2.13971511797111360e-19, + 4.12311737517990115e-19, + 2.99842446215702058e-20, + 3.69891525005436100e-19, + 5.13720692677031830e-19, + 3.80689942821973036e-20, + 2.07646531203319591e-19, +-3.18124766855239775e-20, + 1.22484526600570599e-19, +-3.20131517014816477e-20, + 2.67430398690256441e-19, + 7.70686296098314791e-20, +-1.81547764200637166e-19, + 3.86753510690103495e-19, + 2.78043961169029313e-19, + 4.06981568978814590e-19, + 5.26795527600468466e-19, +-2.77533569464678493e-19, + 8.75555786500141870e-20, + 7.93703522102123095e-20, +-7.71394817614486703e-20, + 2.50612109091639698e-17, + 3.39851864191383495e-18, +-1.34317972244052140e-18, +-2.53321750581818704e-18, +-2.76782215088158895e-18, + 3.03400090837441772e-19, +-1.28596402137044856e-18, + 3.32229626736269692e-19, + 5.10565076301481026e-19, +-5.74608005341541859e-20, +-2.30574825509329962e-19, + 1.94873210108119070e-20, + 2.30834164558106244e-19, +-1.88582261499361699e-19, + 1.28992724562717573e-19, +-1.69561112992953206e-19, +-5.49839994786075101e-20, +-1.82094723105914303e-19, + 1.33409581569225711e-19, +-1.13404440986885798e-19, + 7.76033099381386609e-20, + 1.44752087610281736e-19, + 6.32594358676527338e-20, + 4.37882081810490171e-19, +-3.27589937376434882e-20, + 5.10082060545039242e-19, + 4.24710644799719243e-19, + 4.29769842349366779e-19, +-2.13134238726586171e-19, + 3.04942239435310945e-19, + 2.81829055273436618e-19, + 5.22443296469604407e-20, + 2.36274575213042129e-19, + 2.87748524204915729e-19, + 1.98136752500061769e-19, + 1.68808038225673527e-19, + 7.71992608584884121e-20, + 8.91797322566559671e-20, +-2.10196486023945063e-19, +-1.15701875213086539e-19, +-1.36839942288681395e-17, +-5.04678937715008313e-18, +-4.09259035532077924e-18, +-3.53909947570008445e-18, +-2.18867101269423341e-18, +-4.87675911415779542e-19, +-4.00357517243339689e-19, +-7.04205617157704676e-19, + 4.46726231567517633e-20, +-5.40224652779222880e-19, +-1.35731571087662450e-19, +-2.73026239484772786e-19, +-1.11530339090881867e-20, +-1.12110372459296698e-18, + 5.81233861214159141e-19, +-9.39868459769177238e-19, +-3.35742501575675777e-19, +-2.30891942491173789e-19, +-4.36293477840886326e-19, +-5.65903600231093936e-19, + 1.41591057508994980e-19, +-2.32716189709658266e-20, +-3.69963133189431702e-19, + 1.47281725764516836e-19, +-1.08086119933183213e-19, + 9.42694056995310147e-20, +-2.10796657575925404e-19, +-6.37650610244017819e-19, +-4.48968813994944272e-19, +-2.19435176978575260e-19, +-2.39487390612534538e-19, +-2.69948451283319587e-19, +-2.72447103062989202e-19, +-1.61504039590276432e-19, +-3.04081738179102815e-19, +-3.20963707717440275e-19, +-2.37397261029752285e-19, +-4.48984466944697888e-19, +-5.63162514860235217e-20, +-1.90733679295110515e-19, +// root 7 + 5.96831937161778903e-02, + 5.29092357377984740e-02, + 4.71801308675302705e-02, + 4.23027360464840879e-02, + 3.81233746056136302e-02, + 3.45195404342434967e-02, + 3.13931829479134963e-02, + 2.86653879524395375e-02, + 2.62722020693878962e-02, + 2.41614053340520746e-02, + 2.22902014532273332e-02, + 2.06239356714421999e-02, + 1.91356918797136837e-02, + 1.78057772743777931e-02, + 1.66196903948680440e-02, + 1.55647064749417016e-02, + 1.46273022377256829e-02, + 1.37929645090072994e-02, + 1.30474790205677964e-02, + 1.23780935242600795e-02, + 1.17739559540314953e-02, + 1.12260355991060726e-02, + 1.07268503443174630e-02, + 1.02701776792671704e-02, + 9.85080844451103124e-03, + 9.46435063121798051e-03, + 9.10707564332314742e-03, + 8.77579767699194872e-03, + 8.46777842349483341e-03, + 8.18065115588426095e-03, + 7.91235976116782397e-03, + 7.66110939605139495e-03, + 7.42532626061335587e-03, + 7.20362458286623406e-03, + 6.99477934976991227e-03, + 6.79770365059427506e-03, + 6.61142974733416010e-03, + 6.43509317591247319e-03, + 6.26791932670865172e-03, + 6.10921206472826977e-03, +-3.68207007435167105e-03, +-3.10443686220533395e-03, +-2.63465793983663505e-03, +-2.25068253170793630e-03, +-1.93501246972672524e-03, +-1.67389141743081197e-03, +-1.45654707629987016e-03, +-1.27455617590578043e-03, +-1.12133304816791537e-03, +-9.91683636431698505e-04, +-8.81323515288193887e-04, +-7.86342712693261382e-04, +-7.02912603929909535e-04, +-6.27729823976287313e-04, +-5.58999376449762441e-04, +-4.96689224659072081e-04, +-4.41482249571584738e-04, +-3.93604527148559106e-04, +-3.52547805302849291e-04, +-3.17401936956546182e-04, +-2.87203875513392234e-04, +-2.61104088341360173e-04, +-2.38403522547466656e-04, +-2.18539084302058487e-04, +-2.01057831203890774e-04, +-1.85593340690354898e-04, +-1.71846911206064183e-04, +-1.59573146654506232e-04, +-1.48568948969720152e-04, +-1.38665063759783235e-04, +-1.29719531709873351e-04, +-1.21612571682867658e-04, +-1.14242548938996291e-04, +-1.07522773277467020e-04, +-1.01378937450005295e-04, +-9.57470535891313183e-05, +-9.05717799892546868e-05, +-8.58050560730535855e-05, +-8.14049823343465791e-05, +-7.73348962685662425e-05, + 7.99853076822754647e-05, + 6.49196703977365032e-05, + 5.29255421489842676e-05, + 4.33855765755725227e-05, + 3.57811393815503977e-05, + 2.96941964554567987e-05, + 2.47944106060059528e-05, + 2.08224914646818459e-05, + 1.75770105282597025e-05, + 1.49122641422980922e-05, + 1.27482347238879337e-05, + 1.10676703608517145e-05, + 9.85260024694562817e-06, + 8.97661406166970049e-06, + 8.20390937204659871e-06, + 7.35840761653873352e-06, + 6.43882836499860362e-06, + 5.54076147142129646e-06, + 4.74076548327985867e-06, + 4.06356822342712565e-06, + 3.50148343969762186e-06, + 3.03616575731707918e-06, + 2.64918447295011599e-06, + 2.32513312015722144e-06, + 2.05182157362964427e-06, + 1.81971700874116420e-06, + 1.62134150613037642e-06, + 1.45078486556085142e-06, + 1.30333668753265526e-06, + 1.17521206660179672e-06, + 1.06334629706917016e-06, + 9.65239942848773528e-07, + 8.78840843485603553e-07, + 8.02453448280801960e-07, + 7.34668560977388688e-07, + 6.74308468139838531e-07, + 6.20383762962910961e-07, + 5.72059133134403780e-07, + 5.28626072181993110e-07, + 4.89480977048405349e-07, +-1.40187419591148979e-06, +-1.11802751813877895e-06, +-8.89078234918793490e-07, +-7.07667427117594240e-07, +-5.65162141762347332e-07, +-4.53605353611746068e-07, +-3.66381875838454728e-07, +-2.98223404687577982e-07, +-2.44605576079874953e-07, +-2.00569384780212574e-07, +-1.60241375045024006e-07, +-1.19898576170771746e-07, +-8.42298178570857511e-08, +-6.51387739710015616e-08, +-6.61361315464987782e-08, +-7.46376998001761861e-08, +-7.71943668923366108e-08, +-7.14548659433821115e-08, +-6.15937761825975363e-08, +-5.14041199090709140e-08, +-4.25288923215984669e-08, +-3.52673822157089872e-08, +-2.94299829732234595e-08, +-2.47364171148805023e-08, +-2.09387797133101110e-08, +-1.78420124499565367e-08, +-1.52970245824295812e-08, +-1.31900415344854221e-08, +-1.14336574894810568e-08, +-9.96013961539367339e-09, +-8.71653891723920645e-09, +-7.66111705562320524e-09, +-6.76071424623410395e-09, +-5.98879211332731049e-09, +-5.32396479990903471e-09, +-4.74888670865697979e-09, +-4.24940321749049501e-09, +-3.81389706800758103e-09, +-3.43278158328926449e-09, +-3.09810497453404153e-09, + 1.95409980867817833e-08, + 1.59641478507302432e-08, + 1.27327330937348777e-08, + 1.00320004371545132e-08, + 7.86153847862764944e-09, + 6.14939165476668960e-09, + 4.80576923099342130e-09, + 3.75801683869158080e-09, + 2.99289975598804917e-09, + 2.57343375353757379e-09, + 2.51323606139793412e-09, + 2.48375377596270484e-09, + 1.83465208813205502e-09, + 5.04340295228591681e-10, +-4.80242366557293108e-10, +-4.33072869696795136e-10, + 1.28712740286506871e-10, + 5.38789774093020538e-10, + 6.54692614416483952e-10, + 6.03755195614416514e-10, + 5.03565353222265549e-10, + 4.06397263562528457e-10, + 3.26189702524465786e-10, + 2.63003079506775198e-10, + 2.13647361688285745e-10, + 1.74931712790375874e-10, + 1.44323170779602457e-10, + 1.19919168254754978e-10, + 1.00302923654009078e-10, + 8.44140194919277701e-11, + 7.14518407251265827e-11, + 6.08063468690787374e-11, + 5.20085722557564966e-11, + 4.46949685576959625e-11, + 3.85814816180247888e-11, + 3.34445231206979911e-11, + 2.91068677833863277e-11, + 2.54271109949147707e-11, + 2.22917301997094868e-11, + 1.96090455581542372e-11, +-1.80156841514229139e-10, +-1.73000428870122827e-10, +-1.48816616218039505e-10, +-1.21348876173528608e-10, +-9.63217847885285101e-11, +-7.56474324874376399e-11, +-5.93429647849551398e-11, +-4.55705458313651661e-11, +-3.03386832213601407e-11, +-1.11988429394683365e-11, + 2.62541164951291619e-12, +-1.17767638408284748e-11, +-5.44360035773360606e-11, +-6.85552853562755230e-11, +-2.33643197429911288e-11, + 2.25031524785894643e-11, + 2.77030423819286922e-11, + 1.25169736334720333e-11, + 3.49939140926028544e-13, +-4.46720155931391746e-12, +-5.15826941956677407e-12, +-4.46575302018140167e-12, +-3.56232928124325131e-12, +-2.78440813397712338e-12, +-2.17744706932744103e-12, +-1.71462297801280860e-12, +-1.36155620360643793e-12, +-1.09024468902485443e-12, +-8.79914558447181476e-13, +-7.15423867687897980e-13, +-5.85709634455291981e-13, +-4.82620121173883840e-13, +-4.00089166358221284e-13, +-3.33562589471688311e-13, +-2.79590210194005432e-13, +-2.35535958489710721e-13, +-1.99370628186878524e-13, +-1.69521160139306360e-13, +-1.44756827843231903e-13, +-1.24112271726802785e-13, +-3.83635627942464018e-13, + 7.89998436240691504e-13, + 1.13651930736284721e-12, + 1.11624938685556538e-12, + 9.57618202258369966e-13, + 7.65053829827955304e-13, + 6.05490612099979038e-13, + 5.71476911622205708e-13, + 7.22710203224894351e-13, + 8.15314494619030131e-13, + 1.53687950262915983e-13, +-1.39917772694389100e-12, +-1.69425311726900194e-12, + 8.04848658977102984e-13, + 2.43967630190881120e-12, + 1.07222672629903070e-12, +-4.38431878770720496e-13, +-6.57273810185800238e-13, +-3.39272086013050579e-13, +-8.93264974587191099e-14, + 1.28930873502651254e-14, + 3.74752098948420261e-14, + 3.58845402191043280e-14, + 2.87632985650021367e-14, + 2.20348966738267317e-14, + 1.67748592837350859e-14, + 1.28387125328366100e-14, + 9.91184447389098042e-15, + 7.71862950201440035e-15, + 6.06302710575928174e-15, + 4.80132760208798613e-15, + 3.83045435551254636e-15, + 3.07809432675528523e-15, + 2.48969289250799383e-15, + 2.02649680623056846e-15, + 1.65890497503990481e-15, + 1.36618175975000320e-15, + 1.13042719605033617e-15, + 9.40459767192778263e-16, + 7.86188121010586045e-16, + 6.51601708798282849e-14, + 2.34555056766058912e-14, + 3.91459374748975515e-15, +-4.08494392477002235e-15, +-6.68459429519152363e-15, +-6.72424630947539984e-15, +-4.11029365105606398e-15, + 2.21376599202760446e-15, + 7.35018584399599186e-15, +-5.33989113810836980e-15, +-4.43798028430674952e-14, +-5.24040109774202071e-14, + 4.55900630515260776e-14, + 1.05022476730657144e-13, +-3.78810505820821214e-15, +-7.06744340335045510e-14, +-2.93398574787574036e-14, + 7.46695301728727757e-15, + 1.17166796291608691e-14, + 5.95412913581135028e-15, + 1.84027936498271617e-15, + 2.14927054139045133e-16, +-2.18019136964184767e-16, +-2.60928612991508450e-16, +-2.15186055787107191e-16, +-1.61830722034991298e-16, +-1.20430652171475767e-16, +-8.90583795452745368e-17, +-6.75476446826551251e-17, +-5.13787783974907256e-17, +-3.94742987952628356e-17, +-3.02800032570273619e-17, +-2.34494538561635484e-17, +-1.81782753809661774e-17, +-1.42411375040726853e-17, +-1.13152315112591811e-17, +-8.70442585916751383e-18, +-7.21025221765192646e-18, +-5.38106305626626766e-18, +-4.30924135396059565e-18, +-1.79952858725305393e-15, +-8.86189812916316258e-16, +-3.85379528629118553e-16, +-1.41715583964930572e-16, +-3.37488519273965760e-17, + 3.22045770203962230e-17, + 1.40662085345576663e-16, + 2.36576465219506055e-16, +-6.73447366892371804e-18, +-8.68011551823242140e-16, +-1.27954581882174850e-15, + 1.36804692627352006e-15, + 3.88464337410671061e-15, +-1.18954139436295670e-15, +-4.04185904719739724e-15, + 1.40186403321184306e-16, + 1.67441018846231632e-15, + 5.44762315716044684e-16, +-1.30017510831510887e-16, +-1.74352154657276934e-16, +-8.31146451355428553e-17, +-2.54006765056839130e-17, +-5.04728585458162417e-18, + 1.07955557902671844e-18, + 1.33922522114108087e-18, + 1.76433073095621436e-18, + 1.19027959006667731e-18, + 1.66933403842443787e-18, + 2.67786062768264225e-19, +-2.18152006266622204e-19, + 3.45179797496465303e-19, + 5.62796853578386676e-20, + 1.13707460777364847e-19, + 3.03406750484375365e-19, + 2.33082452431311866e-19, + 1.88107241097958435e-19, + 3.33414257126416807e-19, +-1.56700808165737816e-19, + 4.03316429556628594e-19, + 2.58781043562048778e-19, + 3.21710052498056107e-17, + 1.93078648426227290e-17, + 1.11413901069581328e-17, + 4.07799009771880925e-18, + 1.63766570947416218e-18, + 2.78629173222314983e-18, + 4.53794632385859109e-18, + 1.38537702369222513e-19, +-1.55702025537456328e-17, +-2.95072310853802754e-17, + 2.07356135439710864e-17, + 1.12503192850853402e-16, +-2.95913296706059134e-17, +-1.89072046043877952e-16, + 5.85565274528828597e-17, + 1.09722848523129659e-16, +-1.39120702830847058e-17, +-3.09978699493428530e-17, +-6.39988552219164284e-18, + 2.83256131347987807e-18, + 2.33587860758566081e-18, + 1.29311088824111019e-18, + 1.51192388360045931e-19, + 4.98998907946602347e-19, + 2.32642429777993233e-19, + 4.28676960763974768e-19, + 2.55039396930031207e-19, + 9.25213683324005578e-19, +-3.91800048015462969e-19, +-3.53127786032891006e-20, + 1.75432308616910329e-19, + 7.46185514814641039e-20, + 3.25336273396686042e-19, + 2.32225962412167303e-19, + 4.35711510946325778e-19, + 3.04585674770719632e-19, + 4.73088262757763113e-19, + 2.68683213995158199e-19, + 4.48032394058829330e-19, + 3.72571831514106062e-19, + 2.75903509248709144e-19, + 1.73446360160495256e-18, + 2.58445280102540340e-18, + 1.93185035194838345e-19, + 8.26479924680383365e-19, + 1.47664387987092654e-19, + 7.39652864640315258e-19, + 1.81429912902685055e-18, + 8.47990430005524694e-19, + 1.65985627758288493e-19, + 2.44072402613754511e-18, +-7.85724008007385456e-20, +-6.54084440927573477e-18, + 2.22971701647157666e-18, + 5.72369773291376098e-18, +-2.19995865181985235e-18, +-1.22467506525549544e-18, + 7.75160768844967705e-19, + 8.42900047083159429e-19, + 4.73638706982140915e-19, + 2.66866506263007068e-19, + 4.31984742909496196e-19, +-1.27351127847386283e-19, + 2.25991063690538028e-19, +-2.77556637966580905e-19, + 3.30449146805391624e-19, + 3.90406364748789300e-19, + 5.83862362914292232e-19, +-8.38287044703600358e-20, +-1.14909457530171948e-19, + 1.76231973066379041e-19, +-2.18502116257876510e-22, + 3.76054976982685051e-20, + 1.68394024801468092e-19, + 3.51479866656190973e-19, + 1.44287483821183023e-19, + 3.94453051383251075e-19, + 8.42097153631077607e-20, + 1.91583623984395999e-19, + 1.33777965745100840e-19, + 1.86211600002064383e-18, + 5.49317937027831834e-19, + 1.17045550030559309e-18, + 1.99651243267083705e-19, +-5.44325188753355722e-19, +-1.36772975166090732e-18, + 3.57169728922890489e-19, +-5.48469960063595734e-19, +-8.28616939685977266e-19, +-9.52137368297428658e-19, +-1.06844056697668970e-18, +-2.03123322761174114e-18, +-9.77987308414610391e-20, + 3.52868575474419771e-19, + 6.21634670115401264e-20, + 6.49682713570691558e-19, + 1.26121565367516609e-18, + 6.01414227133697053e-19, + 8.34210807303934781e-19, + 5.28923606924025287e-19, + 3.52714642249626209e-19, + 8.64640612515367435e-19, +-4.35526649518539609e-21, + 1.07941824595690226e-19, + 1.32012559099346022e-19, + 4.68247753457376216e-19, + 4.44188630421649449e-19, + 4.86571504206623333e-19, + 6.82609756311888065e-20, +-2.85581269135567739e-19, + 5.25380981104035469e-19, + 6.31521993096892037e-20, + 1.03958412362983793e-19, + 1.45605987301921114e-19, + 2.86903907569260770e-19, + 4.64815976197133346e-20, + 4.86239497636916156e-19, + 2.69286666515945582e-19, + 1.90867148017179245e-19, + 2.60232019703217242e-19, +-1.82973787742516967e-18, +-8.42282478935703036e-19, + 8.65112527081874412e-19, +-1.63412310430276603e-19, +-1.06534634717747957e-18, +-1.01358012986104200e-18, +-9.74507575517694991e-19, + 4.00312981651694029e-19, +-1.14626961509425476e-19, +-7.29278045933249672e-19, +-1.87621576340114840e-19, + 6.07016322261036861e-20, + 6.76071681369206045e-19, +-6.39402755250406609e-19, +-3.57546899041907179e-22, + 1.84796980743583238e-20, + 7.50466592751763892e-19, +-1.56084971610560998e-19, + 1.43532076900697538e-19, + 4.21109999569600697e-20, + 6.63688640131593445e-20, + 1.39694129820377432e-19, +-2.83171967243772536e-19, + 1.64710156520893606e-20, +-1.54667997134275952e-19, + 5.74898273230464801e-20, + 4.60378192481126822e-19, + 3.47417807987078136e-19, + 1.08857009477169687e-19, + 5.03572195947179603e-20, + 1.61404422414232047e-19, + 2.64618102451376669e-19, + 1.70147437016869558e-19, + 3.57343847752707428e-19, + 1.38129080103466419e-19, + 1.80043344148090015e-19, + 2.58582659051205023e-19, + 1.97387590795645729e-19, + 2.48059218424011780e-19, + 2.70601944906680614e-19, +-8.69774741671441706e-19, +-1.49877919787982132e-18, +-1.11402152437647750e-18, +-8.20419223306720266e-20, +-5.73723763861815522e-19, +-7.01140882992097403e-20, + 5.72207832011892153e-19, + 3.63560567621607858e-19, +-9.37071946185962858e-19, +-1.31157432379139888e-19, + 4.47889997194944483e-19, +-3.99417346325346469e-19, + 6.52262538255159307e-19, +-1.25256938494209325e-18, +-1.21906536955801501e-18, +-5.18732243984062990e-19, + 9.00619334898177426e-20, +-1.82295705300702535e-19, +-5.65186176044220085e-19, +-7.32688119461788321e-19, +-3.86702221531224365e-19, +-9.67030458810401961e-20, + 3.69505803049885231e-20, + 2.45689959272260993e-19, +-2.69612222049692066e-19, +-5.30356305976664517e-19, +-6.30799796435508684e-19, +-1.79132480897367011e-19, +-7.52349744022634534e-19, +-5.10385500812158154e-19, +-7.45740524825351263e-19, +-3.90716976492168722e-19, +-4.12535940005987304e-19, +-2.81099974137838185e-19, +-2.46698501939834114e-19, +-1.13245798022591969e-19, +-3.08179953189058754e-19, +-2.94992723772181612e-19, +-9.89699081461449991e-20, +-2.78168331345262259e-19, + 1.49066249470761608e-01, + 1.24670093083412731e-01, + 1.07324058151010870e-01, + 9.45332158923313237e-02, + 8.48066292962916662e-02, + 7.72134287430961269e-02, + 7.11500462567959263e-02, + 6.62121017750672419e-02, + 6.21208268246306317e-02, + 5.86791920580774715e-02, + 5.57448227857853459e-02, + 5.32126613053537090e-02, + 5.10034453964529760e-02, + 4.90559631191818737e-02, + 4.73221499170838819e-02, + 4.57642539956874192e-02, + 4.43529664753558664e-02, + 4.30656661181175460e-02, + 4.18847023005296040e-02, + 4.07959935090952894e-02, + 3.97880500334593656e-02, + 3.88513326603485629e-02, + 3.79778220056959451e-02, + 3.71607123172203804e-02, + 3.63941826136222890e-02, + 3.56732200682138081e-02, + 3.49934810697457230e-02, + 3.43511805175927068e-02, + 3.37430027351504069e-02, + 3.31660291648718172e-02, + 3.26176792282051042e-02, + 3.20956616071552819e-02, + 3.15979338439656560e-02, + 3.11226686307358238e-02, + 3.06682255178441811e-02, + 3.02331270408492218e-02, + 2.98160384727589357e-02, + 2.94157505684264943e-02, + 2.90311647921296309e-02, + 2.86612806167407946e-02, +-1.44922712432620192e-02, +-1.01206514468222802e-02, +-7.34960520096948448e-03, +-5.51601103787844639e-03, +-4.25753129138963394e-03, +-3.36625663567187558e-03, +-2.71769623962217141e-03, +-2.23447275839940744e-03, +-1.86688131806280323e-03, +-1.58205122327606702e-03, +-1.35771102549318953e-03, +-1.17852508439495753e-03, +-1.03384520710525659e-03, +-9.16121978000692901e-04, +-8.19645464943552981e-04, +-7.39764550080856042e-04, +-6.72688631836438700e-04, +-6.15521068513659431e-04, +-5.66169435472363403e-04, +-5.23133427099018323e-04, +-4.85303951256491842e-04, +-4.51828995483293655e-04, +-4.22034542965559183e-04, +-3.95377095638052740e-04, +-3.71412726272237934e-04, +-3.49775277951314882e-04, +-3.30160240267831154e-04, +-3.12312499093205756e-04, +-2.96016878850500153e-04, +-2.81090756407984541e-04, +-2.67378237531191033e-04, +-2.54745525952678722e-04, +-2.43077211741786909e-04, +-2.32273274622040322e-04, +-2.22246647900587591e-04, +-2.12921225379624933e-04, +-2.04230220831778361e-04, +-1.96114809984022101e-04, +-1.88523000323813009e-04, +-1.81408685736779651e-04, + 6.88051699948328318e-04, + 4.26907972054959607e-04, + 2.77353292548913790e-04, + 1.87377227187482116e-04, + 1.30898545618038901e-04, + 9.41201747050627810e-05, + 6.93930148985221721e-05, + 5.22979083575059642e-05, + 4.01869879382549917e-05, + 3.14193692177742659e-05, + 2.49408784282146301e-05, + 2.00465845682707028e-05, + 1.62583496064625939e-05, + 1.32748824350089994e-05, + 1.09287756674796784e-05, + 9.11075251273309323e-06, + 7.71082441064107283e-06, + 6.61872423073141195e-06, + 5.74610936389407812e-06, + 5.03284348172619775e-06, + 4.43990327100694837e-06, + 3.94102985022413732e-06, + 3.51742960751257047e-06, + 3.15498106605250673e-06, + 2.84275358285443060e-06, + 2.57213475891613092e-06, + 2.33625607395523821e-06, + 2.12958675549604984e-06, + 1.94763558778028868e-06, + 1.78672746730932540e-06, + 1.64383372605760500e-06, + 1.51644192058590775e-06, + 1.40245497773484488e-06, + 1.30011241146498644e-06, + 1.20792829152707232e-06, + 1.12464203850547901e-06, + 1.04917912029962193e-06, + 9.80619451027408844e-07, + 9.18171825249910002e-07, + 8.61153113724479636e-07, +-2.87749915481124962e-05, +-1.60862467706989592e-05, +-9.47726925479174917e-06, +-5.84138572260609291e-06, +-3.74364408752346676e-06, +-2.48196123650157110e-06, +-1.69489523204789625e-06, +-1.18777463163947374e-06, +-8.51526965330314161e-07, +-6.23152461596152216e-07, +-4.65611618121831705e-07, +-3.56275876180823039e-07, +-2.78973023996114104e-07, +-2.20331024146670661e-07, +-1.72015960701274575e-07, +-1.32433451822925146e-07, +-1.02363004984926790e-07, +-8.08103238270987555e-08, +-6.53958209575128915e-08, +-5.39777863162383082e-08, +-4.51804272220515983e-08, +-3.82062544046265004e-08, +-3.25757452207497511e-08, +-2.79735203391261100e-08, +-2.41757633826249835e-08, +-2.10162576179647421e-08, +-1.83684660929201917e-08, +-1.61345950356301119e-08, +-1.42382208625023353e-08, +-1.26190570792448989e-08, +-1.12291426649895425e-08, +-1.00300227549122924e-08, +-8.99063911555129993e-09, +-8.08573590760000868e-09, +-7.29464400819393119e-09, +-6.60034613037452028e-09, +-5.98875211754489729e-09, +-5.44813303583683780e-09, +-4.96867613711847913e-09, +-4.54213254626740983e-09, + 1.09612395949984067e-06, + 5.56127168632907824e-07, + 2.98977736214607167e-07, + 1.69032136550405256e-07, + 9.98585686447592186e-08, + 6.13111272161427669e-08, + 3.89462308016224627e-08, + 2.54992749571111027e-08, + 1.71439195854443099e-08, + 1.17630388871737556e-08, + 8.14799533315473375e-09, + 5.67664320416964184e-09, + 4.12387622153200813e-09, + 3.29312045219591310e-09, + 2.75603875104732847e-09, + 2.17888995500693096e-09, + 1.59116838645150194e-09, + 1.12878836664229746e-09, + 8.19902594900229209e-10, + 6.20847490190310237e-10, + 4.86531193453066812e-10, + 3.89896165915966142e-10, + 3.17010818972122734e-10, + 2.60479061901163810e-10, + 2.15889583381609347e-10, + 1.80306363959348225e-10, + 1.51640579056709781e-10, + 1.28354186222782048e-10, + 1.09293119895017619e-10, + 9.35803248935860723e-11, + 8.05423624376917843e-11, + 6.96573818231923891e-11, + 6.05175452427538183e-11, + 5.28016254415473524e-11, + 4.62547335902080435e-11, + 4.06731922082693968e-11, + 3.58931977106867269e-11, + 3.17822045849690542e-11, + 2.82323222643416158e-11, + 2.51552363790277339e-11, +-3.88731242849771279e-08, +-1.80018538388112393e-08, +-8.87455257668427468e-09, +-4.62155377782295691e-09, +-2.52560966133110035e-09, +-1.44012950087295339e-09, +-8.52557152352970593e-10, +-5.21900436410247820e-10, +-3.30213591115623307e-10, +-2.17463313672746184e-10, +-1.48994087614760665e-10, +-9.96301102936950856e-11, +-5.69092198610321474e-11, +-3.00480303803567313e-11, +-2.66809142781547090e-11, +-3.04537448186895698e-11, +-2.70235996813969321e-11, +-1.90559230770338752e-11, +-1.22520918891448059e-11, +-8.03039807686313213e-12, +-5.61443238368630368e-12, +-4.15652045395561525e-12, +-3.18935221727565941e-12, +-2.49855122240622776e-12, +-1.98378793398828427e-12, +-1.59128097006403438e-12, +-1.28766637754353054e-12, +-1.05026458601735613e-12, +-8.62907468718208434e-13, +-7.13799239136563929e-13, +-5.94205243733095840e-13, +-4.97579946473678822e-13, +-4.18990711175755452e-13, +-3.54658390322919744e-13, +-3.01675061944686412e-13, +-2.57798187133834937e-13, +-2.21270275745318845e-13, +-1.90703058872987887e-13, +-1.64998196774434697e-13, +-1.43294375364633790e-13, + 1.30051983441627142e-09, + 5.52328317860725913e-10, + 2.50721881899420139e-10, + 1.20703731555337135e-10, + 6.12146579117117837e-11, + 3.25159800987372739e-11, + 1.79999852369196270e-11, + 1.03184472248681284e-11, + 6.04380844509068043e-12, + 3.57657524026304070e-12, + 2.30350092918417697e-12, + 1.90813419119145369e-12, + 1.56904260373276503e-12, + 5.91731018724847253e-13, +-1.69344120875492806e-13, +-3.61994921262233076e-14, + 2.88426060134706536e-13, + 3.32454328611633107e-13, + 2.27457109857584833e-13, + 1.31118951887096801e-13, + 7.61589134466985972e-14, + 4.83887298728616017e-14, + 3.35789132037862868e-14, + 2.46308081097599176e-14, + 1.86176416200493344e-14, + 1.43123736857261043e-14, + 1.11371014385981737e-14, + 8.75293211944692926e-15, + 6.94110777185402044e-15, + 5.54485584060212796e-15, + 4.46276856305713735e-15, + 3.62388064650503529e-15, + 2.95620338631709634e-15, + 2.42516951794707233e-15, + 2.00603937389914093e-15, + 1.66630065914055908e-15, + 1.38792935369859740e-15, + 1.16457487173622390e-15, + 9.84142459940398013e-16, + 8.32278982699947912e-16, +-4.14082009535434407e-11, +-1.61928678141460573e-11, +-6.79231905179201020e-12, +-3.03234400712241026e-12, +-1.43090403697592797e-12, +-7.09371388602556762e-13, +-3.67838342136743228e-13, +-1.99875180964566923e-13, +-1.14442013915884146e-13, +-6.50376198474407814e-14, +-2.70932260974349188e-14, +-6.25936135747632408e-15, +-2.36227882017142146e-14, +-3.95210841166291142e-14, +-9.82598540878895591e-15, + 1.35674284909779129e-14, + 6.83232170007793812e-15, +-2.44459793634479199e-15, +-4.09186550672200367e-15, +-2.66378732531498223e-15, +-1.37103627181091104e-15, +-6.96158361868365537e-16, +-3.97503239045100794e-16, +-2.55826605164619176e-16, +-1.78701526871778066e-16, +-1.35531487049619054e-16, +-9.86287807528708250e-17, +-7.41957126901215653e-17, +-5.56556608858027707e-17, +-4.36867645113223238e-17, +-3.43325404095701419e-17, +-2.40655043042594140e-17, +-1.93842732231470058e-17, +-1.81795230408732136e-17, +-1.13139450840701169e-17, +-9.33700612561426686e-18, +-9.82625506415561252e-18, +-8.43670657404665830e-18, +-4.89038109014972369e-18, +-3.59410504260070281e-18, + 1.26270815863906495e-12, + 4.56275919814788160e-13, + 1.77401988620923275e-13, + 7.36413110504434642e-14, + 3.24190634419976676e-14, + 1.50412986572308469e-14, + 7.28837860528549879e-15, + 3.64079041234126232e-15, + 1.92606500434865083e-15, + 1.30070355526189390e-15, + 1.04701529163961767e-15, + 8.15356498723366517e-17, +-9.33544075478287191e-16, + 2.76424376672341056e-16, + 1.19166546301394773e-15, + 1.56713720358111624e-16, +-3.81725619404483225e-16, +-1.56936017164981516e-16, + 2.43292912240683676e-17, + 5.06923536755377789e-17, + 2.80654838088828387e-17, + 1.64869622130444833e-17, + 7.62127814258772835e-18, + 3.98088046602140773e-18, + 1.97417599704450183e-18, +-1.21281137154701132e-19, +-1.11601446703696475e-18, +-8.69656598963727359e-19, + 7.65468157767084757e-19, +-6.17050815180736952e-20, +-1.18280177460085410e-18, + 6.04508225079718333e-19, + 1.94839535233930578e-18, +-1.09196047586940037e-18, + 4.59400259960764949e-19, + 1.19337788315911685e-18, +-1.45771419960141292e-18, +-1.64003073446367235e-18, + 1.12912853635138919e-18, + 1.00912226062789446e-18, +-3.70519683018487487e-14, +-1.24074684113955241e-14, +-4.48262179083552196e-15, +-1.73536532880222228e-15, +-7.12838182898556880e-16, +-3.10335598267360880e-16, +-1.46139633894085628e-16, +-6.98301683777435271e-17, +-3.20684274751437471e-17, +-6.35169322115473987e-18, +-1.35407129932119726e-17, +-4.21677696412662344e-17, +-9.30131487649079247e-19, + 5.54475186048811509e-17, +-9.34160939518821194e-18, +-2.83299395521296825e-17, +-1.73467661583865839e-18, + 8.88788944208688446e-18, + 2.76431593795792780e-18, + 3.95361296332433061e-19, +-1.11324903939110884e-18, + 2.04270582786393922e-18, + 2.87868763541158375e-19, +-2.25752185493547188e-19, + 4.26907626933346028e-19, +-2.78907954575808678e-18, +-1.08091941219731864e-18, + 1.12568036841235389e-19, + 1.73646021810863440e-18, +-2.30050895948561667e-19, + 7.07022208145581242e-19, + 2.40799367465801210e-18, + 8.58988228509971177e-19, +-1.11953152538909104e-18, + 1.54257920501374674e-18, + 1.38237070000509897e-18, +-8.02583162814119448e-19, +-1.10909574229335771e-18, + 1.28395469939301255e-18, + 1.06360109003635184e-18, + 1.05840543415258275e-15, + 3.34143087558820209e-16, + 1.16184178148013916e-16, + 4.08841961043677419e-17, + 1.73042629218828540e-17, + 3.28021177035709427e-18, +-1.41081684677343542e-18, +-1.13058735057919076e-18, + 1.34482104562578220e-18, + 1.64066818012085401e-18, +-1.64720451968813866e-18, + 5.40353768091512667e-19, + 2.22125415569344782e-18, + 1.18965800373044388e-18, +-1.26819515676576483e-18, + 2.82867781364812384e-18, +-8.91909664285550768e-19, + 1.97414498010233735e-18, + 1.17344226445527985e-18, + 3.75980812465618192e-19, +-9.95832105055718769e-19, + 3.24315712307697103e-18, + 7.11562467152189786e-19, + 5.24146136083120532e-19, +-3.03621924197129583e-19, +-1.19144481137473369e-18, +-1.25084383686933394e-18, +-7.39023669061617571e-19, + 1.00074497373164925e-18, + 7.74934818937255561e-19, +-1.24654885567843244e-18, + 1.29987675252439467e-18, + 1.76520420645010510e-18, + 8.67741120528474380e-20, + 5.12066648143941524e-19, + 1.44660624584541368e-18, +-6.77386766218261522e-19, +-3.87881963707921630e-19, + 6.10451133083169408e-19, + 9.17304556810290175e-19, +-3.16295426121710391e-17, + 2.06944416705321548e-19, +-8.08128872427570348e-19, +-3.41460427660274414e-18, +-2.03348502542865126e-18, +-1.13007481490945558e-18, +-2.41078229467753075e-18, +-2.51438918139613026e-18, +-1.32465428909853237e-18, + 6.37833722117541994e-19, +-1.16839745770745563e-18, +-1.60910535429593589e-19, + 7.89403119282279950e-19, + 3.12651088746723880e-18, + 1.82686159419435566e-18, + 3.13241025922486199e-18, +-3.17311913200163386e-19, + 7.90567982690382974e-19, + 1.01879505326115837e-18, + 1.75426867590923605e-18, + 2.85397859553009756e-19, + 2.73524222743914017e-18, + 5.86833534670770785e-19, + 8.26187776543547821e-19, + 1.62470123690511570e-18, +-1.18167740793002022e-18, +-8.18752877843254824e-19, +-1.76467901039707212e-18, + 1.22459038029528188e-18, + 1.59358675990539075e-18, +-1.63329716869206590e-20, + 5.99222893599539651e-19, + 9.20736568181207340e-19, +-5.72098497772453040e-19, + 1.49046209537333944e-18, + 1.46558923601141420e-18, +-5.21124124045587538e-19, +-9.74059137976139434e-19, + 1.37945705451419535e-18, + 5.47274788848601079e-19, + 1.76377061385257159e-18, +-1.92680392508229121e-18, +-1.67349632259205468e-18, +-8.96953136535157189e-19, +-2.66345558345406228e-18, +-3.09928202343453151e-18, +-3.17122896520026728e-19, +-1.06468607058936912e-18, +-2.05463631058019097e-18, + 1.36149800748206416e-18, +-1.38712054896503947e-18, +-6.10809119944411489e-19, +-1.03010098906137071e-18, + 6.90386851561277303e-19, +-4.30124428543451468e-19, + 1.30040177226065937e-18, +-6.28435868946314228e-19, +-1.61901810716623541e-18, +-5.34466058667505945e-19, + 9.54655177438107688e-20, +-4.55197663731330654e-19, + 6.21433097177645599e-19, +-5.25397168863003321e-19, +-9.57111841928894225e-19, +-1.44402021608231362e-18, +-1.60123269855962394e-18, + 4.89766208574517428e-19, + 1.36493028203703575e-18, + 2.79704928907633988e-19, + 3.96957911261503019e-19, +-1.13237043959103869e-18, + 5.94710952762679686e-19, + 2.22181495547260291e-18, +-1.00421912028460098e-19, + 1.23698239820897190e-18, +-1.87037208086907154e-19, + 4.18927300394300396e-19, + 3.22244715457193458e-20, + 3.56824746493668076e-19, + 2.69669511327248163e-19, +-1.12216925092139100e-17, +-7.21900022325083618e-18, +-1.36024355727042970e-18, + 1.70669381990650986e-18, +-4.44625024234770949e-18, +-4.25969772439813542e-19, +-9.30641950534792010e-19, +-4.23462360793972506e-18, +-2.17606815340523547e-19, +-3.22533978557430771e-19, +-7.61556689083673164e-20, + 1.56440173691927655e-19, + 7.60658541998084352e-20, +-6.54621180559487862e-19, +-1.72114341981313368e-18, + 1.50096904702112610e-18, +-9.81203930820146691e-19, +-1.00051234735835078e-18, +-1.91547793121791179e-18, +-1.04038567652132593e-18, +-3.47583288895686028e-19, + 8.35529677626303516e-19, + 3.04413351687107944e-19, + 1.37321687255372990e-19, + 1.41881600644568000e-18, + 7.48375252168362008e-19, +-8.60228516671077924e-19, + 1.63519485209652113e-19, +-2.19070738895660839e-19, + 3.07773634390618303e-19, +-2.67162860220817650e-19, +-9.23820671429486126e-19, +-1.55869321057970195e-18, +-8.02842820179809330e-19, +-6.60347541925990625e-19, +-1.43841569622147373e-19, +-1.25308956094883146e-18, +-9.58985998136243656e-19, +-2.19067166627082560e-20, +-5.27301783260380552e-19, +// root 8 + 6.73833931308871238e-03, + 5.93996139954093040e-03, + 5.27491837362637113e-03, + 4.71522199837540006e-03, + 4.23981868328190698e-03, + 3.83263588180129348e-03, + 3.48123622335506184e-03, + 3.17587237043834552e-03, + 2.90881069855739591e-03, + 2.67384335111721470e-03, + 2.46595127277252383e-03, + 2.28111019409596829e-03, + 2.11621149723231977e-03, + 1.96898298706979459e-03, + 1.83775262563632942e-03, + 1.72106689967072729e-03, + 1.61740329500975133e-03, + 1.52514388115916198e-03, + 1.44271167735204550e-03, + 1.36869484588241202e-03, + 1.30189291216798678e-03, + 1.24130717939368793e-03, + 1.18611028832822239e-03, + 1.13561418431957811e-03, + 1.08924286854803864e-03, + 1.04651069893795770e-03, + 1.00700538981707711e-03, + 9.70374674240357749e-04, + 9.36315766574777461e-04, + 9.04566968456554411e-04, + 8.74900927336212230e-04, + 8.47119180288668562e-04, + 8.21047706029194840e-04, + 7.96533274265753106e-04, + 7.73440430459223409e-04, + 7.51648990589362433e-04, + 7.31051948035680698e-04, + 7.11553715584563144e-04, + 6.93068641585197647e-04, + 6.75519751636703475e-04, +-4.37644455980761124e-04, +-3.62673227823926434e-04, +-3.03807781365343264e-04, +-2.56971763646766959e-04, +-2.19259429848761670e-04, +-1.88564653576385780e-04, +-1.63338015318336728e-04, +-1.42425241735049030e-04, +-1.24957385962525533e-04, +-1.10270018599069387e-04, +-9.78312356756254374e-05, +-8.71714357026734670e-05, +-7.78439623613075532e-05, +-6.94685770922842308e-05, +-6.18352151579814853e-05, +-5.49298061011050987e-05, +-4.88192730401549739e-05, +-4.35232084346875021e-05, +-3.89828087978630073e-05, +-3.50964354018705203e-05, +-3.17572791938466317e-05, +-2.88713142935302393e-05, +-2.63612212301099460e-05, +-2.41647313651498463e-05, +-2.22317599779833878e-05, +-2.05217900595704075e-05, +-1.90017929562185601e-05, +-1.76446342432005133e-05, +-1.64278565624595150e-05, +-1.53327447859465169e-05, +-1.43436019104669029e-05, +-1.34471832617199288e-05, +-1.26322506843682870e-05, +-1.18892184998844294e-05, +-1.12098702617989770e-05, +-1.05871305784100508e-05, +-1.00148800983482178e-05, +-9.48780457340703617e-06, +-9.00127100939562017e-06, +-8.55122548811309382e-06, + 1.05887508634203523e-05, + 8.25842086445281182e-06, + 6.53110862439181200e-06, + 5.23012997797301546e-06, + 4.23586375399066314e-06, + 3.46575340397806638e-06, + 2.86172985669848915e-06, + 2.38214527988068944e-06, + 1.99678740106908954e-06, + 1.68459861351221552e-06, + 1.43355507356064338e-06, + 1.23962676483210701e-06, + 1.09944128628421540e-06, + 9.98317420480809696e-07, + 9.09987141185163324e-07, + 8.14841813136018107e-07, + 7.12390311624688762e-07, + 6.12793833536981676e-07, + 5.24240473344467292e-07, + 4.49333479110011350e-07, + 3.87174834657551046e-07, + 3.35721272942270208e-07, + 2.92930891158036832e-07, + 2.57099184722581676e-07, + 2.26878033016466310e-07, + 2.01213310593819333e-07, + 1.79278145922889402e-07, + 1.60419023231357315e-07, + 1.44115094736389018e-07, + 1.29947848420061027e-07, + 1.17578407639141300e-07, + 1.06730399854344134e-07, + 9.71769095637035611e-08, + 8.87304530173542657e-08, + 8.12352098090456401e-08, + 7.45609555042849800e-08, + 6.85982874772364268e-08, + 6.32548419407046651e-08, + 5.84522765301315593e-08, + 5.41238484673582504e-08, +-2.25769943655415719e-07, +-1.66014045897303954e-07, +-1.24128648887574359e-07, +-9.42320404367328933e-08, +-7.25371385992151884e-08, +-5.65598309711319531e-08, +-4.46462025430391353e-08, +-3.56748078469327871e-08, +-2.88260893447580943e-08, +-2.33619163486906062e-08, +-1.85212769045704754e-08, +-1.38232372357358621e-08, +-9.72876455783800699e-09, +-7.49970367573278482e-09, +-7.49880207167173710e-09, +-8.34781302572825320e-09, +-8.57481265261369356e-09, +-7.91446190875167570e-09, +-6.81462553662290120e-09, +-5.68499266906009776e-09, +-4.70283383432086094e-09, +-3.89970788323140591e-09, +-3.25420069940894761e-09, +-2.73520565042336755e-09, +-2.31528411677967797e-09, +-1.97286198457078487e-09, +-1.69145254873576835e-09, +-1.45847508637712568e-09, +-1.26426475088957050e-09, +-1.10133204874040492e-09, +-9.63822198657775964e-10, +-8.47120027207023003e-10, +-7.47558925800957043e-10, +-6.62204441169474854e-10, +-5.88691854484710580e-10, +-5.25103194335321129e-10, +-4.69873328342917969e-10, +-4.21717690052559227e-10, +-3.79576242930844733e-10, +-3.42569726026306304e-10, + 4.46138399499824665e-09, + 3.09927694330389388e-09, + 2.19402690768897877e-09, + 1.58022898326849959e-09, + 1.15606801549012630e-09, + 8.57384382632926809e-10, + 6.42835176521453916e-10, + 4.86564149794651588e-10, + 3.76762459765102986e-10, + 3.14176920282359421e-10, + 2.96612694197591620e-10, + 2.86133707106200865e-10, + 2.10756826042004174e-10, + 6.29100522963959226e-11, +-4.65346898742868025e-11, +-4.32520559168965084e-11, + 1.66349608895554612e-11, + 6.05387052552079153e-11, + 7.27085721047596876e-11, + 6.68492813374395153e-11, + 5.57038314138040100e-11, + 4.49421509837823709e-11, + 3.60691923362459302e-11, + 2.90815117337958226e-11, + 2.36238758337587979e-11, + 1.93428991112795877e-11, + 1.59583853089040087e-11, + 1.32599370310377444e-11, + 1.10908912076446139e-11, + 9.33399222350256072e-12, + 7.90071278925947593e-12, + 6.72359842265460374e-12, + 5.75079361322472254e-12, + 4.94209945481484689e-12, + 4.26610701656596892e-12, + 3.69809323725418751e-12, + 3.21846148931617808e-12, + 2.81157632748736514e-12, + 2.46488476227184822e-12, + 2.16824973735677015e-12, +-8.34491726298109178e-11, +-5.49276543655644592e-11, +-3.69051867940444082e-11, +-2.52812347249772267e-11, +-1.76441952418367193e-11, +-1.25540289140235941e-11, +-9.11032975787725660e-12, +-6.61343338398861866e-12, +-4.34936900478151016e-12, +-1.89380559082548362e-12, +-1.57891572899992364e-13, +-1.57435097893053771e-12, +-6.11163121368726164e-12, +-7.58848500498352171e-12, +-2.64703178051207563e-12, + 2.37041336202950156e-12, + 2.96750696142393375e-12, + 1.33487735808370003e-12, + 1.98395676563125165e-14, +-4.99876204049794201e-13, +-5.71978474054524866e-13, +-4.94187159355258347e-13, +-3.93987949115956727e-13, +-3.07901056228982054e-13, +-2.40772354505837818e-13, +-1.89593379612101518e-13, +-1.50552834370499121e-13, +-1.20552794296525257e-13, +-9.72956423695445810e-14, +-7.91072298646623512e-14, +-6.47641647191872220e-14, +-5.33651513726938949e-14, +-4.42394317803980221e-14, +-3.68833383535032711e-14, +-3.09154575677601317e-14, +-2.60441470435139398e-14, +-2.20452440668736978e-14, +-1.87445858023724316e-14, +-1.60063849109739485e-14, +-1.37236337941394981e-14, + 1.49072920937443505e-12, + 9.32854095510484649e-13, + 5.96129550153844434e-13, + 3.88511668776428715e-13, + 2.57452038892025310e-13, + 1.72636375814937302e-13, + 1.18915616001032556e-13, + 9.41866042083416926e-14, + 9.82304630797466433e-14, + 1.00809128270020544e-13, + 2.43403562421281661e-14, +-1.47052551402843714e-13, +-1.80866404903250515e-13, + 8.90793436336501325e-14, + 2.66315732045709763e-13, + 1.18015132851521406e-13, +-4.65847295780568140e-14, +-7.09714406204066567e-14, +-3.66746515028407467e-14, +-9.57246324309594650e-15, + 1.51671656327877685e-15, + 4.16750013307860063e-15, + 3.97351839489292024e-15, + 3.18161120989985512e-15, + 2.43676569171670129e-15, + 1.85491141446533112e-15, + 1.41967344464323807e-15, + 1.09587763565320582e-15, + 8.53474444345489434e-16, + 6.70411072848790398e-16, + 5.30945015481897860e-16, + 4.23648174410201562e-16, + 3.40349443707860037e-16, + 2.75283301018549794e-16, + 2.24010689108027618e-16, + 1.83440883276838609e-16, + 1.51014512633082943e-16, + 1.25038472425798546e-16, + 1.03943604855933671e-16, + 8.68719165973402584e-17, +-2.55194412137573028e-14, +-1.52583119495355302e-14, +-9.31477071786083599e-15, +-5.81295151974186148e-15, +-3.72208115341755816e-15, +-2.42526754734348498e-15, +-1.41913974620083964e-15, +-3.27176370973089298e-16, + 4.59992454958640474e-16, +-7.87408601051831499e-16, +-4.94700807065565725e-15, +-5.76495133171917057e-15, + 4.89257637445000477e-15, + 1.13685158665556901e-14, +-4.00747876799621423e-16, +-7.68086697550991916e-15, +-3.21309326300453741e-15, + 7.95848693532907099e-16, + 1.26885169934487605e-15, + 6.46112839346986112e-16, + 1.99284604609939679e-16, + 2.25407167474219283e-17, +-2.44216281523185280e-17, +-2.89695289735505318e-17, +-2.37806182055769255e-17, +-1.79662387661496852e-17, +-1.33789152704538979e-17, +-9.91168208328732474e-18, +-7.49336283159384616e-18, +-5.69645236103208949e-18, +-4.30146536315463985e-18, +-3.30736953223852583e-18, +-2.60286230153739513e-18, +-2.05375586919992328e-18, +-1.66054051778935711e-18, +-1.26103056720362790e-18, +-9.90535338078050686e-19, +-7.84821196792337550e-19, +-6.58766835473930504e-19, +-5.23939789524322980e-19, + 4.18107149564475884e-16, + 2.40732513446524825e-16, + 1.40862342569376651e-16, + 8.39228832476093245e-17, + 5.03021752643996271e-17, + 3.33673504778876191e-17, + 3.20823812293816950e-17, + 3.49447574397143258e-17, + 4.64911175140596990e-18, +-9.10490825604951671e-17, +-1.36950977370651496e-16, + 1.49899372877850982e-16, + 4.21918699241436824e-16, +-1.27577732062716363e-16, +-4.38165435569338085e-16, + 1.42363817778560560e-17, + 1.81718771448839414e-16, + 5.96539811584746233e-17, +-1.40295181933823218e-17, +-1.90079423742383404e-17, +-9.04927314292359335e-18, +-2.82890557454616150e-18, +-5.42988521511123264e-19, + 9.44577942519538478e-20, + 2.10572636628794532e-19, + 2.02538471706628576e-19, + 8.81693114378583728e-20, + 6.16977040125097371e-20, + 2.20923371239259476e-20, + 2.24897861832919174e-20, + 4.55042197382367407e-20, + 6.14095724252578023e-20, + 1.64609961619046553e-21, +-1.10527829091168256e-20, +-4.94384981699531434e-20, +-9.75797493103438480e-21, + 3.83536220316263319e-22, + 2.35767189859163589e-20, +-1.05415696038737603e-20, +-2.37547659152178872e-21, +-6.42676895748388707e-18, +-3.48539980029428585e-18, +-1.96685962928874918e-18, +-7.00240533835435323e-19, +-7.34814767741853707e-19, +-2.46571917860655816e-19, + 1.76860500394678150e-19, +-3.19698708533205325e-19, +-1.82718240918682511e-18, +-3.05382789010462361e-18, + 2.15179996761758068e-18, + 1.23632211738438180e-17, +-3.13812879474601797e-18, +-2.03023812656311566e-17, + 6.44443606809908817e-18, + 1.19714772975352626e-17, +-1.63829562402333011e-18, +-3.31957388880212098e-18, +-7.78353492343230262e-19, + 1.81637771759719531e-19, + 2.39324515963859329e-19, + 1.13679388356316317e-19, + 3.41143549903287414e-20, + 9.67232411714496374e-21, + 2.42429081372029270e-22, + 6.01863511646561083e-20, +-1.99033653831566319e-20, + 2.81230745737541590e-20, + 6.18532110968584120e-22, +-2.66647238055741220e-21, + 6.14705505392122389e-20, + 5.87416066724432512e-20, +-3.96949843833551495e-22, + 2.01754448344024331e-20, +-2.54331786588633610e-20, + 3.23649135703896709e-20, +-7.72239891484829923e-21, + 1.94665886478597598e-20, + 2.39644212784413658e-20, + 1.40608404763665267e-20, + 7.76071364457603850e-20, + 5.83178703695700832e-19, + 2.84538278850077656e-19, + 2.78750116309612105e-19, + 4.90034606476836639e-20, + 7.02093885720073903e-20, + 8.62362922641396380e-20, + 1.08146443395133191e-19, + 6.09933845615785577e-20, + 1.46804380917479692e-19, + 2.48170052926055571e-19, + 8.55119659171978940e-20, +-5.73533178101944361e-19, + 2.80813350047737874e-19, + 7.34450140442077315e-19, +-2.23873645808084051e-19, +-2.02288248259958509e-19, + 8.45284595917198797e-20, +-2.78029142845885602e-21, +-2.90886343504693498e-20, + 9.32574476941498580e-21, + 1.45420792325263832e-20, +-5.68234483855887473e-20, +-5.75523156439546956e-21, +-4.37583575869338101e-20, + 4.08497869482815413e-20, + 1.05913064553799015e-20, +-2.19045293355419130e-20, +-3.84496430414834837e-20, + 4.34907359515793534e-21, + 2.39547883670788158e-20, + 2.73101556878407224e-20, + 4.81476171223298687e-21, + 3.85292041922939606e-23, +-4.32107537751603731e-21, + 1.13342650078533649e-20, + 1.15551656193987542e-20, + 2.82990186778179578e-20, + 1.52896665887508982e-20, +-2.92817511558528368e-21, + 4.90296912017423656e-20, +-1.27506708738816459e-20, + 1.00302421337310337e-19, + 1.44284619473473289e-19, + 7.32743928728278146e-20, +-2.48661565141957840e-20, + 5.72090201825039864e-20, +-1.42104199530642932e-19, +-4.71616551711534516e-20, +-6.49361512764314057e-20, +-1.63657274215418510e-19, +-7.88215596779132437e-20, + 3.10934444047788069e-20, + 1.66196399555842060e-19, + 1.27569669391595573e-19, + 1.18689546389307952e-19, + 5.37887391959195359e-20, + 8.57018739309208296e-20, + 9.90696013159752638e-20, + 4.12150193049419826e-20, + 4.32001736415136351e-20, + 4.46390799783935679e-20, + 5.01153902137866083e-20, + 6.58723142635206739e-20, + 2.60668276583111757e-20, + 7.38538473840001473e-20, + 8.57059549814658271e-20, + 4.31212108400300530e-20, +-1.34753885043641754e-20, + 9.11976142110827308e-21, + 4.43127701796040034e-20, + 2.72958671512329084e-20, + 1.70794037897738656e-20, + 3.15772042199276725e-20, + 4.00396711826714096e-21, + 1.72059367880242028e-20, + 2.08440902348625472e-20, + 4.19937686787244294e-20, + 9.89340947414234370e-21, + 1.59923115829695152e-20, +-2.19584700891977782e-19, + 1.35830805614948491e-19, + 8.46651899415400716e-20, + 5.38581965381087167e-20, + 6.63979949015453529e-20, +-9.47702862723311105e-20, +-7.32564329135037387e-20, +-5.66658396938683457e-20, +-8.17241059247633165e-20, + 5.84883339628976504e-21, +-2.50303537006410026e-20, +-5.70717765120213683e-20, +-8.52845891744990913e-21, + 2.43925032131781704e-20, + 6.79461220553199606e-21, +-8.57329652662199270e-21, + 2.81583125363039962e-20, + 3.90026667958617195e-20, + 9.71632836452366296e-21, +-3.44272526233563167e-20, + 2.72149574336642586e-21, +-7.10610225993514043e-21, + 4.39958981327711814e-21, +-3.99976455048891723e-20, +-7.09212013836352136e-22, + 3.37229784915580106e-21, + 4.73739084521767835e-20, +-1.57940057359366150e-20, + 2.06103247749459542e-20, + 1.68243840819417664e-20, + 3.92555164779837443e-20, + 2.45207205376183860e-20, + 3.61414663168994943e-20, +-1.14613639394923769e-21, +-5.40212516956979394e-21, + 1.28271852294484504e-20, + 1.40755166833704248e-20, + 2.90077964531734860e-20, +-1.74947858271885742e-21, + 2.15616384366579668e-20, +-3.16846340980925348e-19, +-1.35330690861200762e-19, + 7.97993210586677527e-20, +-4.39076448873475089e-22, + 8.56943369027512656e-21, +-2.85988584201636395e-20, +-7.42636068828206076e-21, +-2.89734967680061798e-20, +-2.90657638832626697e-20, +-3.17090482729690151e-20, +-8.20548997554207657e-20, + 2.48790841054639298e-20, + 2.74601432240494887e-20, +-6.46801736519566826e-20, +-6.26009207814301260e-20, +-1.73531544553478876e-20, +-4.31108554730349064e-20, +-6.00719369620679402e-20, +-4.60132941929727707e-20, +-2.32889093415324084e-20, +-1.77415941465373133e-20, +-5.43204909497291053e-21, +-6.12413052981296978e-20, +-3.63403223147721262e-20, +-3.24302147532870715e-20, + 2.59035482449890997e-20, +-7.05380141481491390e-20, +-4.09078428788149266e-20, +-6.99191972069757561e-20, +-5.73360015943392151e-20, +-2.59649200125096930e-20, +-3.30602134747731202e-20, +-5.92215637937887447e-20, +-4.22819932307114073e-20, +-5.66729928202930005e-20, +-4.53578930115153389e-20, +-3.13727042259868643e-20, +-3.69561850157481462e-20, +-2.48400666163518272e-20, +-1.64528989275817009e-20, + 1.62499832900903779e-01, + 1.50569065274995945e-01, + 1.40447599208580548e-01, + 1.31737367987601078e-01, + 1.24150020688812313e-01, + 1.17471624983607165e-01, + 1.11540065116593770e-01, + 1.06230113168858151e-01, + 1.01443270645747000e-01, + 9.71007269223021496e-02, + 9.31387022523934155e-02, + 8.95061133556569744e-02, + 8.61643196333534284e-02, + 8.30871096283289506e-02, + 8.02577881004555016e-02, + 7.76627723295919697e-02, + 7.52858207886204361e-02, + 7.31067713156318549e-02, + 7.11038127384002183e-02, + 6.92560986570890658e-02, + 6.75451140250458437e-02, + 6.59549486161143950e-02, + 6.44720620589521731e-02, + 6.30849182535401232e-02, + 6.17836392422246583e-02, + 6.05597159380884612e-02, + 5.94057746817064289e-02, + 5.83153898252540548e-02, + 5.72829326018258270e-02, + 5.63034483989072743e-02, + 5.53725563644705474e-02, + 5.44863667020310805e-02, + 5.36414120862059585e-02, + 5.28345904351767773e-02, + 5.20631168822306978e-02, + 5.13244832482146474e-02, + 5.06164236685010607e-02, + 4.99368852994592216e-02, + 4.92840032404389672e-02, + 4.86560789725366261e-02, +-6.49261526314210205e-03, +-5.46693094645276777e-03, +-4.67488493963554019e-03, +-4.05012606296207070e-03, +-3.54821007414728509e-03, +-3.13852738042489504e-03, +-2.79948520595081326e-03, +-2.51554818829005959e-03, +-2.27536622447287347e-03, +-2.07048282875438782e-03, +-1.89420265884986290e-03, +-1.74040336112015023e-03, +-1.60273666533930015e-03, +-1.47529153887018881e-03, +-1.35469092277622823e-03, +-1.24116407783215620e-03, +-1.13685825623568125e-03, +-1.04334726393037346e-03, +-9.60706134623310845e-04, +-8.87973409958151428e-04, +-8.23837808640432941e-04, +-7.67030112799447009e-04, +-7.16454820557000218e-04, +-6.71201434176330481e-04, +-6.30519130033117261e-04, +-5.93786912573002960e-04, +-5.60487959386207334e-04, +-5.30189206019100138e-04, +-5.02525369544024264e-04, +-4.77186425301865823e-04, +-4.53907723621800368e-04, +-4.32462128765122636e-04, +-4.12653718062538325e-04, +-3.94312694688818421e-04, +-3.77291252133251862e-04, +-3.61460190684891676e-04, +-3.46706132438665731e-04, +-3.32929215894593256e-04, +-3.20041177313524507e-04, +-3.07963745847323050e-04, + 1.46413202875221989e-04, + 1.11823527246553915e-04, + 8.73703728093082305e-05, + 6.96137919487238159e-05, + 5.64137457958556720e-05, + 4.63947182081372666e-05, + 3.86453413926426305e-05, + 3.25433099876524327e-05, + 2.76541179874352006e-05, + 2.36862382990982986e-05, + 2.04933484189668026e-05, + 1.80734146090606471e-05, + 1.64562645590155297e-05, + 1.54695749914601054e-05, + 1.46720531351599372e-05, + 1.36645023785084850e-05, + 1.23815939990233257e-05, + 1.09961756938504080e-05, + 9.68316716394035935e-06, + 8.52468052547245917e-06, + 7.53257719761140010e-06, + 6.68931595706680869e-06, + 5.97104484627382069e-06, + 5.35592576275325529e-06, + 4.82591802435916652e-06, + 4.36651618829386145e-06, + 3.96608418968710651e-06, + 3.61523762181246650e-06, + 3.30635298572532430e-06, + 3.03319149895235080e-06, + 2.79061164980388406e-06, + 2.57434825857908975e-06, + 2.38084128425554262e-06, + 2.20710208351540350e-06, + 2.05060810546224110e-06, + 1.90921936018856880e-06, + 1.78111169617279393e-06, + 1.66472315348992528e-06, + 1.55871056276490335e-06, + 1.46191422739166589e-06, +-3.43891700770114061e-06, +-2.39822900456619826e-06, +-1.72079874984956634e-06, +-1.26579801459524268e-06, +-9.51725419639041273e-07, +-7.29747127128182595e-07, +-5.69781525375569681e-07, +-4.52819434649817643e-07, +-3.65853172603849182e-07, +-2.97390861719410326e-07, +-2.34643741511379790e-07, +-1.67895979128388979e-07, +-1.03701481431552217e-07, +-6.70384913852183840e-08, +-7.15901856386547596e-08, +-9.69642723647740121e-08, +-1.14210049454487050e-07, +-1.14303410309925219e-07, +-1.03516969586173792e-07, +-8.94713865454303541e-08, +-7.61377107941763279e-08, +-6.47260825349182333e-08, +-5.52717545068764349e-08, +-4.74823640441947760e-08, +-4.10401452827715522e-08, +-3.56774768317830541e-08, +-3.11827087425855213e-08, +-2.73904693322455101e-08, +-2.41711448397060343e-08, +-2.14224144594874593e-08, +-1.90628624903886121e-08, +-1.70272077410396687e-08, +-1.52627250902230651e-08, +-1.37265396488477382e-08, +-1.23835630292721764e-08, +-1.12049062597184366e-08, +-1.01666495586516881e-08, +-9.24888160484429817e-09, +-8.43494405455118938e-09, +-7.71083340067466524e-09, + 8.07662389203479235e-08, + 5.17544431452598113e-08, + 3.42851258030133488e-08, + 2.33812407390548181e-08, + 1.63538530855693213e-08, + 1.16875586997715758e-08, + 8.49380634724094582e-09, + 6.25212537860138327e-09, + 4.72997347035584928e-09, + 3.95964584086320365e-09, + 3.99798957735335535e-09, + 4.28802469246854089e-09, + 3.44752039220288659e-09, + 9.63421551290506649e-10, +-1.28946647242936813e-09, +-1.55568750307074823e-09, +-5.21007956802791582e-10, + 4.29316082561074668e-10, + 8.38550432802812705e-10, + 8.79088158020449864e-10, + 7.77265241854640405e-10, + 6.49653429631502621e-10, + 5.35332581309894439e-10, + 4.41584696795533676e-10, + 3.66375338579247974e-10, + 3.06068535998462004e-10, + 2.57424309275587681e-10, + 2.17896376681780995e-10, + 1.85538492973568441e-10, + 1.58864188556030984e-10, + 1.36730654908353014e-10, + 1.18252043321302439e-10, + 1.02736041773421816e-10, + 8.96373099684437429e-11, + 7.85231438655141161e-11, + 6.90477863024735819e-11, + 6.09331566685578630e-11, + 5.39542414475466172e-11, + 4.79278693799710048e-11, + 4.27041359377441785e-11, +-1.86952972139182428e-09, +-1.10598775116022020e-09, +-6.79580809810374256e-10, +-4.31800560367523491e-10, +-2.82825430975808637e-10, +-1.90817658382307187e-10, +-1.32730073146300979e-10, +-9.33435597791147922e-11, +-5.84531611789889452e-11, +-1.75056297957297450e-11, + 1.72888228560115996e-11, +-1.12719673690009596e-12, +-8.92550354861838776e-11, +-1.41013641448614466e-10, +-6.73167011277451939e-11, + 3.27110086225722176e-11, + 5.80078988622505148e-11, + 3.38831646621138014e-11, + 8.96963592186049718e-12, +-2.98621928809881390e-12, +-6.29626452988005528e-12, +-6.18730884907223128e-12, +-5.20264851816424506e-12, +-4.19399941245276686e-12, +-3.35772237506660390e-12, +-2.69940702387167718e-12, +-2.18558636365507059e-12, +-1.78288639605194391e-12, +-1.46488197264292506e-12, +-1.21176004200790846e-12, +-1.00873127226433137e-12, +-8.44706967830215962e-13, +-7.11287347350731214e-13, +-6.02073861810359860e-13, +-5.12132284153136837e-13, +-4.37646312719532038e-13, +-3.75632251802772363e-13, +-3.23736671590787819e-13, +-2.80106406606508736e-13, +-2.43257965287290290e-13, + 4.24773703322862121e-11, + 2.32659325641737530e-11, + 1.32911449058254440e-11, + 7.87601396454325278e-12, + 4.81182807517406437e-12, + 3.00554425200946542e-12, + 1.93358196667295398e-12, + 1.44609785920208284e-12, + 1.54807823886048774e-12, + 1.79877792617819534e-12, + 7.36559247519634931e-13, +-2.49194181419992908e-12, +-4.01402320514551025e-12, + 5.09784583048138578e-13, + 4.73955063489978349e-12, + 2.80474662814392995e-12, +-4.05722327256187871e-13, +-1.23862712554943685e-12, +-7.64791965062384947e-13, +-2.72792786022921276e-13, +-3.99787370383679578e-14, + 3.27687634012228328e-14, + 4.42094666623843604e-14, + 3.87953670998944698e-14, + 3.09423217809258958e-14, + 2.41646346806693831e-14, + 1.88897821345251730e-14, + 1.48529059130104006e-14, + 1.17789647908769040e-14, + 9.41588815484401891e-15, + 7.58413419399675872e-15, + 6.14798993890204125e-15, + 5.01924439580023380e-15, + 4.11965796763086447e-15, + 3.40305527479382626e-15, + 2.82632640192973854e-15, + 2.36017806797545788e-15, + 1.98119804388035540e-15, + 1.66853732001110616e-15, + 1.41403216983336342e-15, +-9.47559081436022467e-13, +-4.81679317974093916e-13, +-2.56539416621591586e-13, +-1.42509969933016100e-13, +-8.24855282982173110e-14, +-4.95137663728346018e-14, +-2.78393290373593059e-14, +-6.57534730707666404e-15, + 1.18190615610991804e-14, +-3.17986934004433660e-15, +-8.12800412969009480e-14, +-1.25118627165095059e-13, + 5.37412109286686312e-14, + 2.21946163622890800e-13, + 3.61664587307165987e-14, +-1.32997921797793641e-13, +-7.42172977377657523e-14, + 4.64010667350069667e-15, + 2.13327191037372714e-14, + 1.27230467357499587e-14, + 4.68557499852020661e-15, + 1.09586529500277487e-15, +-3.39298613996155851e-17, +-2.71565476887496759e-16, +-2.68596546600376068e-16, +-2.15803744015314278e-16, +-1.57167948392450789e-16, +-1.24481414944619075e-16, +-9.69210711894133718e-17, +-7.33306825027842730e-17, +-5.37388080814469874e-17, +-4.22173182220511298e-17, +-3.36608566508618209e-17, +-2.64586078466288349e-17, +-2.25181147370773942e-17, +-1.65678778078420726e-17, +-1.44166632620120138e-17, +-1.04627931456021772e-17, +-7.89611490395594550e-18, +-5.85894539388479204e-18, + 2.07879115918141571e-14, + 9.80589680088379088e-15, + 4.87369985836603351e-15, + 2.52857084509448407e-15, + 1.35845546306185693e-15, + 7.87641848149048403e-16, + 6.34929126405748264e-16, + 7.00114933507346139e-16, + 2.89049732097149721e-16, +-1.45278494946477997e-15, +-2.97160059690281523e-15, + 1.60579527520248545e-15, + 8.27742217857536997e-15, +-3.82978136777310575e-16, +-8.41512192794208574e-15, +-1.01226469073200647e-15, + 3.19380251428610404e-15, + 1.39834655522975846e-15, +-9.12157606861555101e-17, +-3.12101656964418252e-16, +-1.76049757076088894e-16, +-6.34998860709639916e-17, +-1.50389315730138440e-17, + 6.30619368698634861e-19, + 6.47738618889794415e-19, + 7.83636101234297005e-19, + 6.56384801555059407e-18, +-2.10505729830034213e-18, +-1.07190517416093325e-18, +-7.78958612425859764e-20, + 2.35889084980705277e-18, + 2.58634364033141149e-18, + 1.12814626127001004e-18, + 4.19976886082786148e-20, +-1.48595823431063241e-18, + 8.26547987251509205e-19, + 1.09539273659180923e-18, +-1.36231820460426780e-19, + 1.45412742395403184e-18, + 2.57278208902443287e-18, +-4.38773993797779480e-16, +-2.06403046400407479e-16, +-8.56611333211117343e-17, +-4.36284212387363302e-17, +-2.13317636322063956e-17, +-6.79735115243682179e-18, + 1.97091266826682340e-18, +-3.20422684599831348e-18, +-2.58790803190413981e-17, +-6.22939055877224365e-17, + 1.10231761634673695e-17, + 2.30420369410963959e-16, + 1.91838933738031054e-17, +-3.93072809905856287e-16, + 4.41545909914908661e-17, + 2.40589636093183965e-16, +-1.11973090164357008e-18, +-6.51741639120965530e-17, +-2.26511691772659384e-17, + 7.78373442864832051e-18, + 2.86428509684329516e-18, + 1.89617332229776222e-18, + 2.31688300560828700e-18, + 1.94480665858224966e-18, + 7.72390783909916340e-19, +-2.99396219332855916e-18, + 6.06357901681566189e-18, +-6.00701307553051861e-19, +-3.82075277381791137e-19, + 6.07366070408529663e-19, + 1.70671835377174555e-18, + 3.08145905246528290e-19, + 2.47505932058734418e-18, +-5.17054549757153916e-19, + 1.41211516684504979e-18, + 7.78068356313241450e-19, + 3.11940898841819832e-20, + 2.47739414530067440e-18, + 2.07903563303387233e-18, + 3.46265480377997150e-18, + 2.14006907691462319e-17, +-1.61283644590615768e-18, + 3.53592523541538724e-18, + 1.12460661705455426e-18, + 5.80411788871472907e-18, + 2.16815472469117731e-18, + 3.51454925720679624e-18, + 3.15697297512567831e-18, + 2.25242609682681519e-18, + 6.06980114637133073e-18, + 5.29072702003033838e-18, + 9.61348652947432880e-19, +-9.33241043793658861e-18, + 1.38280512413575056e-18, + 1.54680455482800560e-17, +-2.63646033468771022e-18, +-6.43009669046796990e-18, + 6.69875007002887803e-19, + 3.36356869976045060e-19, + 4.17830158064672058e-18, +-2.27019009653581013e-18, + 1.32465271876037526e-18, + 1.97469662597116547e-18, + 2.04542275040536895e-18, +-4.23086478192981943e-19, + 4.06961352660308078e-19, + 3.91192017263829737e-18, +-1.58786837501059442e-18, + 3.23932009149650484e-19, + 2.16456952946089594e-18, + 1.55918722335784804e-18, + 2.02835628699374704e-18, + 1.16231296724277276e-18, +-2.47260270096280746e-19, + 1.45230711019001695e-19, + 1.06940524897999958e-18, + 8.48301944430795906e-19, + 1.94045920329551289e-18, + 4.68009780423616419e-19, + 2.29919108781967587e-18, + 6.07997560118093022e-18, +-5.50662911459314151e-18, +-3.87265466898346306e-18, +-2.67892536468907008e-18, + 2.21178519868987124e-18, + 2.92840982940585627e-18, +-1.32573675521041604e-18, +-8.13543693174065021e-19, + 1.42256293897433012e-18, +-2.41033689608482960e-18, +-3.76030725187457566e-19, +-2.00360609700469597e-18, + 4.85315894256298154e-19, + 2.26075977988289652e-18, + 3.24197593162083987e-18, + 1.70616810367090035e-18, + 4.26402781674121917e-18, +-4.41048960654992625e-19, +-5.70538515780112006e-20, + 7.33605038217951744e-19, +-1.35400338595523299e-18, +-1.40437250892204472e-18, + 4.07466652917579000e-18, + 3.20763996835296730e-18, + 1.99711552109934128e-19, + 1.12369121138857425e-18, + 2.72215761854880426e-18, +-9.56577818810904312e-19, +-1.67587883919761117e-18, + 1.53399977213578661e-19, + 1.41757212219276047e-18, + 7.15805165340575298e-19, + 1.90345190432281392e-18, + 1.23446144621893784e-18, + 1.36522381425272075e-18, + 1.49458813378481079e-19, + 3.87359003269302376e-19, + 2.23686587011720783e-18, + 1.21197218411275740e-18, + 1.85733700367493180e-18, +-2.17635429984096945e-18, +-4.29551774921121631e-18, +-5.99971765468534007e-19, +-1.24370548039931540e-18, +-1.30313575207250448e-18, + 2.10661150779724235e-18, + 2.51767782416506093e-18, +-6.20081025853319293e-19, + 1.78592225814286121e-19, + 8.76271257746810231e-19, +-3.99144744623494929e-19, +-1.67149281450880374e-18, + 5.87383353942813732e-19, + 4.87099306870680338e-19, +-1.17458814030882974e-18, + 7.94073902901013087e-19, +-2.08826946385956946e-19, +-6.12624492822259296e-19, +-1.52693783958105453e-18, + 9.47249876923442384e-19, + 1.92476966867585058e-18, +-2.66614727697405524e-18, + 1.15909945730652224e-18, + 1.17514483978852314e-18, +-2.81969785902139288e-19, +-5.91690197359728702e-19, + 3.12011384783770060e-18, + 2.71860523057241719e-19, + 1.46579124263855935e-18, + 1.64836879493827659e-18, + 1.73161707391413970e-18, + 7.93243979092432836e-19, + 6.86885970943171640e-19, + 5.75865803896798991e-19, + 4.39139669098965542e-19, +-4.19982928943100459e-19, + 1.91169815865913247e-18, + 1.22971539896335801e-18, + 1.33868533352857732e-18, + 7.89640434041210588e-19, +-1.19447591384382192e-18, +-4.03764324713520238e-18, +-3.45151719633275006e-18, + 4.82425048448397739e-18, +-1.50249862179835972e-20, +-1.63511027994422865e-18, + 1.12392899636450846e-18, +-1.68606907107183136e-18, +-2.48319985773817318e-19, + 7.25094051803012116e-20, + 3.94356046311070239e-19, +-2.30309425162987350e-18, +-1.25896861680747411e-18, +-1.74083232398549905e-18, + 5.57745770821871343e-19, +-1.22511872450735032e-18, +-3.18204624559337623e-18, +-1.91578681506865955e-19, +-4.96791848461219760e-19, + 2.27013019435949701e-18, +-1.24623714184325475e-18, +-7.26958259223636176e-19, +-3.54663061379510362e-18, +-2.16284900654101364e-18, +-1.93707114820752586e-18, +-5.33144400526748955e-19, +-5.67827796628160163e-19, +-2.42209152317807645e-18, +-2.50497283732659557e-18, +-7.05007530386602945e-19, + 3.97795241468872862e-19, +-4.49794504486919683e-19, +-7.39410596864583351e-19, +-1.58317348941213062e-18, + 2.61471809069975830e-19, +-1.29084681392147310e-18, +-9.86232409687966777e-19, +-2.57883762266923171e-19, +-6.67053283576951153e-19, +-3.51868811739800344e-19, +}; diff --git a/gpu4pyscf/lib/gvhf-rys/rys_roots_unrolled.cu b/gpu4pyscf/lib/gvhf-rys/rys_roots_unrolled.cu new file mode 100644 index 00000000..e4278ac3 --- /dev/null +++ b/gpu4pyscf/lib/gvhf-rys/rys_roots_unrolled.cu @@ -0,0 +1,68 @@ +#include "rys_roots.cuh" + +#define SQRTPIE4 .8862269254527580136 +#define PIE4 .7853981633974483096 + +__device__ +static void rys_roots(int nroots, double x, double *rw) +{ + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + int block_size = blockDim.x * blockDim.y; + + if (x < 3.e-7){ + int off = nroots * (nroots - 1) / 2; + for (int i = 0; i < nroots; ++i) { + rw[t_id+(i*2 )*block_size] = ROOT_SMALLX_R0[off+i] + ROOT_SMALLX_R1[off+i] * x; + rw[t_id+(i*2+1)*block_size] = ROOT_SMALLX_W0[off+i] + ROOT_SMALLX_W1[off+i] * x; + } + return; + } + + if (x > 35+nroots*5) { + int off = nroots * (nroots - 1) / 2; + double t = sqrt(PIE4/x); + for (int i = 0; i < nroots; ++i) { + rw[t_id+(i*2 )*block_size] = ROOT_LARGEX_R_DATA[off+i] / x; + rw[t_id+(i*2+1)*block_size] = ROOT_LARGEX_W_DATA[off+i] * t; + } + return; + } + + if (nroots == 1) { + double tt = sqrt(x); + double fmt0 = SQRTPIE4 / tt * erf(tt); + rw[t_id+block_size] = fmt0; + double e = exp(-x); + double b = .5 / x; + double fmt1 = b * (fmt0 - e); + rw[t_id] = fmt1 / fmt0; + return; + } + + double *datax = ROOT_RW_DATA + DEGREE1*INTERVALS * nroots*(nroots-1); + int it = (int)(x * .4); + double u = (x - it * 2.5) * 0.8 - 1.; + double u2 = u * 2.; + for (int rt_id = 0; rt_id < nroots*2; ++rt_id) { + double *c = datax + rt_id * DEGREE1 * INTERVALS; + //for i in range(2, degree + 1): + // c0, c1 = c[degree-i] - c1, c0 + c1*u2 + double c0 = c[it + DEGREE *INTERVALS]; + double c1 = c[it +(DEGREE-1)*INTERVALS]; + double c2, c3; +#pragma unroll + for (int n = DEGREE-2; n > 0; n-=2) { + c2 = c[it + n *INTERVALS] - c1; + c3 = c0 + c1*u2; + c1 = c2 + c3*u2; + c0 = c[it +(n-1)*INTERVALS] - c3; + } + if (DEGREE % 2 == 0) { + c2 = c[it] - c1; + c3 = c0 + c1*u2; + rw[t_id + rt_id*block_size] = c2 + c3*u; + } else { + rw[t_id + rt_id*block_size] = c0 + c1*u; + } + } +} diff --git a/gpu4pyscf/lib/gvhf-rys/rys_tasks.c b/gpu4pyscf/lib/gvhf-rys/rys_tasks.c new file mode 100644 index 00000000..15758892 --- /dev/null +++ b/gpu4pyscf/lib/gvhf-rys/rys_tasks.c @@ -0,0 +1,270 @@ +#include +#include "vhf.cuh" + +#define AO_BLOCKSIZE 64 +#define SHL_BLOCKSIZE 4 + +static int _create_tasks_1t(uint16_t *shl_quartets, double *vj, double *vk, + double *q_cond, double *dm_cond, double cutoff, + int *shls_slice, int *ao_loc, int max_tasks, + int *atm, int natm, int *bas, int nbas, double *env) +{ + // the first shell-quartet in the bin + int ish0 = shls_slice[0]; + int ish1 = shls_slice[1]; + int jsh0 = shls_slice[2]; + int jsh1 = shls_slice[3]; + int ksh0 = shls_slice[4]; + int ksh1 = shls_slice[5]; + int lsh0 = shls_slice[6]; + int lsh1 = shls_slice[7]; + //int di = ao_loc[ish0+1] - ao_loc[ish0]; + //int dj = ao_loc[jsh0+1] - ao_loc[jsh0]; + //int dk = ao_loc[ksh0+1] - ao_loc[ksh0]; + //int dl = ao_loc[lsh0+1] - ao_loc[lsh0]; + int basblk_i = SHL_BLOCKSIZE; //MAX(AO_BLOCKSIZE/di, 4); + int basblk_j = SHL_BLOCKSIZE; //MAX(AO_BLOCKSIZE/dj, 4); + int basblk_k = SHL_BLOCKSIZE; //MAX(AO_BLOCKSIZE/dk, 4); + int basblk_l = SHL_BLOCKSIZE; //MAX(AO_BLOCKSIZE/dl, 4); + int _ish0, _jsh0, _ksh0, _lsh0, _ish1, _jsh1, _ksh1, _lsh1; + + int ntasks = 0; + for (_ish0 = ish0; _ish0 < ish1; _ish0+=basblk_i) { + _ish1 = MIN(_ish0+basblk_i, ish1); + jsh1 = MIN(shls_slice[3], _ish1); + ksh1 = MIN(shls_slice[5], _ish1); + for (_jsh0 = jsh0; _jsh0 < jsh1; _jsh0+=basblk_j) { + _jsh1 = MIN(_jsh0+basblk_j, jsh1); + for (_ksh0 = ksh0; _ksh0 < ksh1; _ksh0+=basblk_k) { + _ksh1 = MIN(_ksh0+basblk_k, ksh1); + lsh1 = MIN(shls_slice[7], _ksh1); + for (_lsh0 = lsh0; _lsh0 < lsh1; _lsh0+=basblk_l) { + _lsh1 = MIN(_lsh0+basblk_l, lsh1); + for (int ish = _ish0; ish < _ish1; ish++) { + for (int jsh = _jsh0; jsh < MIN(ish+1, _jsh1); jsh++) { + int bas_ij = ish * nbas + jsh; + double q_ij = q_cond[bas_ij]; + for (int ksh = _ksh0; ksh < MIN(ish+1, _ksh1); ksh++) { + for (int lsh = _lsh0; lsh < MIN(ksh+1, _lsh1); lsh++) { + int bas_kl = ksh * nbas + lsh; + if (bas_ij < bas_kl) continue; + + double q_kl = q_cond[bas_kl]; + double q_ijkl = q_ij + q_kl; + if (q_ijkl < cutoff) continue; + double d_cutoff = cutoff - q_ijkl; + if (vk == NULL) { + // J only + if ((dm_cond[jsh*nbas+ish] < d_cutoff) && + (dm_cond[lsh*nbas+ksh] < d_cutoff)) { + continue; + } + } else if (vj == NULL) { + // K only + if ((dm_cond[jsh*nbas+ksh] < d_cutoff) && + (dm_cond[jsh*nbas+lsh] < d_cutoff) && + (dm_cond[ish*nbas+ksh] < d_cutoff) && + (dm_cond[ish*nbas+lsh] < d_cutoff)) { + continue; + } + } else if ((dm_cond[jsh*nbas+ish] < d_cutoff) && + (dm_cond[lsh*nbas+ksh] < d_cutoff) && + (dm_cond[jsh*nbas+ksh] < d_cutoff) && + (dm_cond[jsh*nbas+lsh] < d_cutoff) && + (dm_cond[ish*nbas+ksh] < d_cutoff) && + (dm_cond[ish*nbas+lsh] < d_cutoff)) { + continue; + } + + if (ntasks >= max_tasks) { + return -1; + } + shl_quartets[ntasks*4+0] = ish; + shl_quartets[ntasks*4+1] = jsh; + shl_quartets[ntasks*4+2] = ksh; + shl_quartets[ntasks*4+3] = lsh; + ntasks++; + } } + } } + } } } } + return ntasks; +} + +static int _create_tasks_mt(uint16_t *shl_quartets, double *vj, double *vk, + double *q_cond, double *dm_cond, double cutoff, + int *shls_slice, int *ao_loc, int max_tasks, + int *atm, int natm, int *bas, int nbas, double *env) +{ + // the first shell-quartet in the bin + int ish0 = shls_slice[0]; + int ish1 = shls_slice[1]; + int jsh0 = shls_slice[2]; + int jsh1 = shls_slice[3]; + int ksh0 = shls_slice[4]; + int ksh1 = shls_slice[5]; + int lsh0 = shls_slice[6]; + int lsh1 = shls_slice[7]; + //int di = ao_loc[ish0+1] - ao_loc[ish0]; + //int dj = ao_loc[jsh0+1] - ao_loc[jsh0]; + //int dk = ao_loc[ksh0+1] - ao_loc[ksh0]; + //int dl = ao_loc[lsh0+1] - ao_loc[lsh0]; + int basblk_i = SHL_BLOCKSIZE; //MAX(AO_BLOCKSIZE/di, 4); + int basblk_j = SHL_BLOCKSIZE; //MAX(AO_BLOCKSIZE/dj, 4); + int basblk_k = SHL_BLOCKSIZE; //MAX(AO_BLOCKSIZE/dk, 4); + int basblk_l = SHL_BLOCKSIZE; //MAX(AO_BLOCKSIZE/dl, 4); + int nthreads = omp_get_num_threads(); + int tasks_per_thread[256]; + int tasks_offsets[256]; + int tot_tasks = 0; + +#pragma omp parallel +{ + int ntasks = 0; + int thread_id = omp_get_thread_num(); + int _ish0, _jsh0, _ksh0, _lsh0, _ish1, _jsh1, _ksh1, _lsh1; +#pragma omp for schedule(static, 1) + for (_ish0 = ish0; _ish0 < ish1; _ish0+=basblk_i) { + _ish1 = MIN(_ish0+basblk_i, ish1); + jsh1 = MIN(shls_slice[3], _ish1); + ksh1 = MIN(shls_slice[5], _ish1); + for (_jsh0 = jsh0; _jsh0 < jsh1; _jsh0+=basblk_j) { + _jsh1 = MIN(_jsh0+basblk_j, jsh1); + for (_ksh0 = ksh0; _ksh0 < ksh1; _ksh0+=basblk_k) { + _ksh1 = MIN(_ksh0+basblk_k, ksh1); + lsh1 = MIN(shls_slice[7], _ksh1); + for (_lsh0 = lsh0; _lsh0 < lsh1; _lsh0+=basblk_l) { + _lsh1 = MIN(_lsh0+basblk_l, lsh1); + for (int ish = _ish0; ish < _ish1; ish++) { + for (int jsh = _jsh0; jsh < MIN(ish+1, _jsh1); jsh++) { + int bas_ij = ish * nbas + jsh; + double q_ij = q_cond[bas_ij]; + for (int ksh = _ksh0; ksh < MIN(ish+1, _ksh1); ksh++) { + for (int lsh = _lsh0; lsh < MIN(ksh+1, _lsh1); lsh++) { + int bas_kl = ksh * nbas + lsh; + if (bas_ij < bas_kl) continue; + + double q_kl = q_cond[bas_kl]; + double q_ijkl = q_ij + q_kl; + if (q_ijkl < cutoff) continue; + double d_cutoff = cutoff - q_ijkl; + if (vk == NULL) { + // J only + if ((dm_cond[jsh*nbas+ish] < d_cutoff) && + (dm_cond[lsh*nbas+ksh] < d_cutoff)) { + continue; + } + } else if (vj == NULL) { + // K only + if ((dm_cond[jsh*nbas+ksh] < d_cutoff) && + (dm_cond[jsh*nbas+lsh] < d_cutoff) && + (dm_cond[ish*nbas+ksh] < d_cutoff) && + (dm_cond[ish*nbas+lsh] < d_cutoff)) { + continue; + } + } else if ((dm_cond[jsh*nbas+ish] < d_cutoff) && + (dm_cond[lsh*nbas+ksh] < d_cutoff) && + (dm_cond[jsh*nbas+ksh] < d_cutoff) && + (dm_cond[jsh*nbas+lsh] < d_cutoff) && + (dm_cond[ish*nbas+ksh] < d_cutoff) && + (dm_cond[ish*nbas+lsh] < d_cutoff)) { + continue; + } + ntasks++; + } } + } } + } } } } + tasks_per_thread[thread_id] = ntasks; +#pragma omp barrier +#pragma omp master + for (int n = 0; n < nthreads; n++) { + tasks_offsets[n] = tot_tasks; + tot_tasks += tasks_per_thread[n]; + } +} + if (tot_tasks >= max_tasks) { + return -1; + } + +#pragma omp parallel +{ + int thread_id = omp_get_thread_num(); + int ntasks = tasks_offsets[thread_id]; + int _ish0, _jsh0, _ksh0, _lsh0, _ish1, _jsh1, _ksh1, _lsh1; +#pragma omp for schedule(static, 1) + for (_ish0 = ish0; _ish0 < ish1; _ish0+=basblk_i) { + _ish1 = MIN(_ish0+basblk_i, ish1); + jsh1 = MIN(shls_slice[3], _ish1); + ksh1 = MIN(shls_slice[5], _ish1); + for (_jsh0 = jsh0; _jsh0 < jsh1; _jsh0+=basblk_j) { + _jsh1 = MIN(_jsh0+basblk_j, jsh1); + for (_ksh0 = ksh0; _ksh0 < ksh1; _ksh0+=basblk_k) { + _ksh1 = MIN(_ksh0+basblk_k, ksh1); + lsh1 = MIN(shls_slice[7], _ksh1); + for (_lsh0 = lsh0; _lsh0 < lsh1; _lsh0+=basblk_l) { + _lsh1 = MIN(_lsh0+basblk_l, lsh1); + for (int ish = _ish0; ish < _ish1; ish++) { + for (int jsh = _jsh0; jsh < MIN(ish+1, _jsh1); jsh++) { + int bas_ij = ish * nbas + jsh; + double q_ij = q_cond[bas_ij]; + for (int ksh = _ksh0; ksh < MIN(ish+1, _ksh1); ksh++) { + for (int lsh = _lsh0; lsh < MIN(ksh+1, _lsh1); lsh++) { + int bas_kl = ksh * nbas + lsh; + if (bas_ij < bas_kl) continue; + + double q_kl = q_cond[bas_kl]; + double q_ijkl = q_ij + q_kl; + if (q_ijkl < cutoff) continue; + double d_cutoff = cutoff - q_ijkl; + if (vk == NULL) { + // J only + if ((dm_cond[jsh*nbas+ish] < d_cutoff) && + (dm_cond[lsh*nbas+ksh] < d_cutoff)) { + continue; + } + } else if (vj == NULL) { + // K only + if ((dm_cond[jsh*nbas+ksh] < d_cutoff) && + (dm_cond[jsh*nbas+lsh] < d_cutoff) && + (dm_cond[ish*nbas+ksh] < d_cutoff) && + (dm_cond[ish*nbas+lsh] < d_cutoff)) { + continue; + } + } else if ((dm_cond[jsh*nbas+ish] < d_cutoff) && + (dm_cond[lsh*nbas+ksh] < d_cutoff) && + (dm_cond[jsh*nbas+ksh] < d_cutoff) && + (dm_cond[jsh*nbas+lsh] < d_cutoff) && + (dm_cond[ish*nbas+ksh] < d_cutoff) && + (dm_cond[ish*nbas+lsh] < d_cutoff)) { + continue; + } + + shl_quartets[ntasks*4+0] = ish; + shl_quartets[ntasks*4+1] = jsh; + shl_quartets[ntasks*4+2] = ksh; + shl_quartets[ntasks*4+3] = lsh; + ntasks++; + } } + } } + } } } } +} + return tot_tasks; +} + +int RYS_create_tasks(uint16_t *shl_quartets, double *vj, double *vk, + double *q_cond, double *dm_cond, double cutoff, + int *shls_slice, int *ao_loc, int max_tasks, + int *atm, int natm, int *bas, int nbas, double *env) +{ + int nthreads = omp_get_num_threads(); + int (*f)(uint16_t *shl_quartets, double *vj, double *vk, + double *q_cond, double *dm_cond, double cutoff, + int *shls_slice, int *ao_loc, int max_tasks, + int *atm, int natm, int *bas, int nbas, double *env); + if (nthreads == 1) { + f = _create_tasks_1t; + } else { + f = _create_tasks_mt; + } + return (*f)(shl_quartets, vj, vk, q_cond, dm_cond, cutoff, + shls_slice, ao_loc, max_tasks, atm, natm, bas, nbas, env); +} diff --git a/gpu4pyscf/lib/gvhf-rys/unrolled_os.cu b/gpu4pyscf/lib/gvhf-rys/unrolled_os.cu new file mode 100644 index 00000000..275c6d97 --- /dev/null +++ b/gpu4pyscf/lib/gvhf-rys/unrolled_os.cu @@ -0,0 +1,270 @@ +#include +#include "vhf.cuh" +#include "gamma_inc_unrolled.cu" +#include "create_tasks.cu" + + +__device__ static +void _os_jk_0000(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *gamma_inc = Rpa_cicj + iprim*jprim*TILE2*4; + int t_id = threadIdx.y * blockDim.x + threadIdx.x; + for (int n = t_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; // (ai*xi+aj*xj)/aij + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta = aij * akl / (aij + akl); + double theta_rr = theta * rr; + if (omega == 0) { + eval_gamma_inc_fn(gamma_inc, theta_rr, 0); + } else if (omega > 0) { + double theta_fac = omega * omega / (omega * omega + theta); + eval_gamma_inc_fn(gamma_inc, theta_fac*theta_rr, 0); + double scale = sqrt(theta_fac); + for (int n = 0 ; n <= 0; ++n) { + gamma_inc[sq_id+n*nsq_per_block] *= scale; + scale *= theta_fac; + } + } else { // omega < 0 + eval_gamma_inc_fn(gamma_inc, theta_rr, 0); + double theta_fac = omega * omega / (omega * omega + theta); + double *gamma_inc1 = gamma_inc + nsq_per_block * 1; + eval_gamma_inc_fn(gamma_inc1, theta_fac*theta_rr, 0); + __syncthreads(); + double scale = sqrt(theta_fac); + for (int n = 0 ; n <= 0; ++n) { + gamma_inc[sq_id+n*nsq_per_block] -= scale * gamma_inc1[sq_id+n*nsq_per_block]; + scale *= theta_fac; + } + } + __syncthreads(); + if (task_id < ntasks) { + double vrr_0_000 = fac * gamma_inc[sq_id+0*nsq_per_block]; + gout0 += vrr_0_000; + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +#if CUDA_VERSION >= 12040 +__global__ __maxnreg__(128) +#else +__global__ +#endif +void os_jk_0000(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.y * blockDim.x + threadIdx.x; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int nbas = envs.nbas; + double omega = envs.env[PTR_RANGE_OMEGA]; + int ntasks; + if (omega >= 0) { + ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + } else { + ntasks = _fill_sr_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + } + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _os_jk_0000(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +int os_jk_unrolled(RysIntEnvVars *envs, JKMatrix *jk, BoundsInfo *bounds, + ShellQuartet *pool, uint32_t *batch_head, + int *scheme, int workers, double omega) +{ + int li = bounds->li; + int lj = bounds->lj; + int lk = bounds->lk; + int ll = bounds->ll; + int threads = scheme[0] * scheme[1]; + int iprim = bounds->iprim; + int jprim = bounds->jprim; + int ij_prims = iprim * jprim; + int order = li + lj + lk + ll; + int buflen = (order + 1) * threads + ij_prims*TILE2*4; + if (omega < 0) { + buflen += (order + 1) * threads; + } + int ijkl = li*8 + lj*4 + lk*2 + ll; + switch (ijkl) { + case 0: os_jk_0000<<>>(*envs, *jk, *bounds, pool, batch_head); break; + default: return 1; + } + return 0; +} diff --git a/gpu4pyscf/lib/gvhf-rys/unrolled_rys.cu b/gpu4pyscf/lib/gvhf-rys/unrolled_rys.cu new file mode 100644 index 00000000..a6c219ef --- /dev/null +++ b/gpu4pyscf/lib/gvhf-rys/unrolled_rys.cu @@ -0,0 +1,22535 @@ +#include +#include "vhf.cuh" +#include "rys_roots_unrolled.cu" +#include "create_tasks.cu" + + +__device__ static +void _rys_jk_0000(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(1, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(1, theta_fac*theta_rr, rw); + fac *= sqrt(theta_fac); + for (int irys = 0; irys < 1; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + } + } + if (task_id < ntasks) { + for (int irys = 0; irys < 1; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + gout0 += fac * 1 * wt; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +#if CUDA_VERSION >= 12040 +__global__ __maxnreg__(128) +#else +__global__ +#endif +void rys_jk_0000(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_jk_0000(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_sr_jk_0000(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + rys_roots(1, theta_rr, rw+2*nsq_per_block); + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(1, theta_fac*theta_rr, rw); + double sqrt_theta_fac = -sqrt(theta_fac); + for (int irys = 0; irys < 1; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + rw[sq_id+(irys*2+1)*nsq_per_block] *= sqrt_theta_fac; + } + if (task_id < ntasks) { + for (int irys = 0; irys < 2; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + gout0 += fac * 1 * wt; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +#if CUDA_VERSION >= 12040 +__global__ __maxnreg__(128) +#else +__global__ +#endif +void rys_sr_jk_0000(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_sr_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_sr_jk_0000(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_jk_1000(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(1, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(1, theta_fac*theta_rr, rw); + fac *= sqrt(theta_fac); + for (int irys = 0; irys < 1; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + } + } + if (task_id < ntasks) { + for (int irys = 0; irys < 1; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double rt_aij = rt_aa * akl; + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + gout0 += trr_10x * 1 * wt; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += fac * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += fac * 1 * trr_10z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +#if CUDA_VERSION >= 12040 +__global__ __maxnreg__(128) +#else +__global__ +#endif +void rys_jk_1000(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_jk_1000(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_sr_jk_1000(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + rys_roots(1, theta_rr, rw+2*nsq_per_block); + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(1, theta_fac*theta_rr, rw); + double sqrt_theta_fac = -sqrt(theta_fac); + for (int irys = 0; irys < 1; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + rw[sq_id+(irys*2+1)*nsq_per_block] *= sqrt_theta_fac; + } + if (task_id < ntasks) { + for (int irys = 0; irys < 2; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double rt_aij = rt_aa * akl; + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + gout0 += trr_10x * 1 * wt; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += fac * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += fac * 1 * trr_10z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +#if CUDA_VERSION >= 12040 +__global__ __maxnreg__(128) +#else +__global__ +#endif +void rys_sr_jk_1000(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_sr_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_sr_jk_1000(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_jk_1010(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double gout3; + double gout4; + double gout5; + double gout6; + double gout7; + double gout8; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + gout3 = 0; + gout4 = 0; + gout5 = 0; + gout6 = 0; + gout7 = 0; + gout8 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(2, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(2, theta_fac*theta_rr, rw); + fac *= sqrt(theta_fac); + for (int irys = 0; irys < 2; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + } + } + if (task_id < ntasks) { + for (int irys = 0; irys < 2; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double b00 = .5 * rt_aa; + double rt_akl = rt_aa * aij; + double cpx = xqc + xpq*rt_akl; + double rt_aij = rt_aa * akl; + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_11x = cpx * trr_10x + 1*b00 * fac; + gout0 += trr_11x * 1 * wt; + double trr_01x = cpx * fac; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += trr_01x * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += trr_01x * 1 * trr_10z; + double cpy = yqc + ypq*rt_akl; + double trr_01y = cpy * 1; + gout3 += trr_10x * trr_01y * wt; + double trr_11y = cpy * trr_10y + 1*b00 * 1; + gout4 += fac * trr_11y * wt; + gout5 += fac * trr_01y * trr_10z; + double cpz = zqc + zpq*rt_akl; + double trr_01z = cpz * wt; + gout6 += trr_10x * 1 * trr_01z; + gout7 += fac * trr_10y * trr_01z; + double trr_11z = cpz * trr_10z + 1*b00 * wt; + gout8 += fac * 1 * trr_11z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + val += gout3 * dm[(l0+0)*nao+(k0+1)]; + val += gout6 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + val += gout4 * dm[(l0+0)*nao+(k0+1)]; + val += gout7 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + val += gout5 * dm[(l0+0)*nao+(k0+1)]; + val += gout8 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(i0+0)]; + val += gout4 * dm[(j0+0)*nao+(i0+1)]; + val += gout5 * dm[(j0+0)*nao+(i0+2)]; + atomicAdd(vj+(k0+1)*nao+(l0+0), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(i0+0)]; + val += gout7 * dm[(j0+0)*nao+(i0+1)]; + val += gout8 * dm[(j0+0)*nao+(i0+2)]; + atomicAdd(vj+(k0+2)*nao+(l0+0), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + val += gout3 * dm[(j0+0)*nao+(k0+1)]; + val += gout6 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + val += gout4 * dm[(j0+0)*nao+(k0+1)]; + val += gout7 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + val += gout5 * dm[(j0+0)*nao+(k0+1)]; + val += gout8 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout3 * dm[(i0+0)*nao+(k0+1)]; + val += gout6 * dm[(i0+0)*nao+(k0+2)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout4 * dm[(i0+1)*nao+(k0+1)]; + val += gout7 * dm[(i0+1)*nao+(k0+2)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + val += gout5 * dm[(i0+2)*nao+(k0+1)]; + val += gout8 * dm[(i0+2)*nao+(k0+2)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+1), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+2), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+1), val); + val = 0; + val += gout7 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+2), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+1), val); + val = 0; + val += gout8 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+2), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + val = 0; + val += gout3 * dm[(i0+0)*nao+(l0+0)]; + val += gout4 * dm[(i0+1)*nao+(l0+0)]; + val += gout5 * dm[(i0+2)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+1), val); + val = 0; + val += gout6 * dm[(i0+0)*nao+(l0+0)]; + val += gout7 * dm[(i0+1)*nao+(l0+0)]; + val += gout8 * dm[(i0+2)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+2), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +#if CUDA_VERSION >= 12040 +__global__ __maxnreg__(128) +#else +__global__ +#endif +void rys_jk_1010(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_jk_1010(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_sr_jk_1010(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double gout3; + double gout4; + double gout5; + double gout6; + double gout7; + double gout8; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + gout3 = 0; + gout4 = 0; + gout5 = 0; + gout6 = 0; + gout7 = 0; + gout8 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + rys_roots(2, theta_rr, rw+4*nsq_per_block); + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(2, theta_fac*theta_rr, rw); + double sqrt_theta_fac = -sqrt(theta_fac); + for (int irys = 0; irys < 2; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + rw[sq_id+(irys*2+1)*nsq_per_block] *= sqrt_theta_fac; + } + if (task_id < ntasks) { + for (int irys = 0; irys < 4; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double b00 = .5 * rt_aa; + double rt_akl = rt_aa * aij; + double cpx = xqc + xpq*rt_akl; + double rt_aij = rt_aa * akl; + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_11x = cpx * trr_10x + 1*b00 * fac; + gout0 += trr_11x * 1 * wt; + double trr_01x = cpx * fac; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += trr_01x * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += trr_01x * 1 * trr_10z; + double cpy = yqc + ypq*rt_akl; + double trr_01y = cpy * 1; + gout3 += trr_10x * trr_01y * wt; + double trr_11y = cpy * trr_10y + 1*b00 * 1; + gout4 += fac * trr_11y * wt; + gout5 += fac * trr_01y * trr_10z; + double cpz = zqc + zpq*rt_akl; + double trr_01z = cpz * wt; + gout6 += trr_10x * 1 * trr_01z; + gout7 += fac * trr_10y * trr_01z; + double trr_11z = cpz * trr_10z + 1*b00 * wt; + gout8 += fac * 1 * trr_11z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + val += gout3 * dm[(l0+0)*nao+(k0+1)]; + val += gout6 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + val += gout4 * dm[(l0+0)*nao+(k0+1)]; + val += gout7 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + val += gout5 * dm[(l0+0)*nao+(k0+1)]; + val += gout8 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(i0+0)]; + val += gout4 * dm[(j0+0)*nao+(i0+1)]; + val += gout5 * dm[(j0+0)*nao+(i0+2)]; + atomicAdd(vj+(k0+1)*nao+(l0+0), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(i0+0)]; + val += gout7 * dm[(j0+0)*nao+(i0+1)]; + val += gout8 * dm[(j0+0)*nao+(i0+2)]; + atomicAdd(vj+(k0+2)*nao+(l0+0), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + val += gout3 * dm[(j0+0)*nao+(k0+1)]; + val += gout6 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + val += gout4 * dm[(j0+0)*nao+(k0+1)]; + val += gout7 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + val += gout5 * dm[(j0+0)*nao+(k0+1)]; + val += gout8 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout3 * dm[(i0+0)*nao+(k0+1)]; + val += gout6 * dm[(i0+0)*nao+(k0+2)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout4 * dm[(i0+1)*nao+(k0+1)]; + val += gout7 * dm[(i0+1)*nao+(k0+2)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + val += gout5 * dm[(i0+2)*nao+(k0+1)]; + val += gout8 * dm[(i0+2)*nao+(k0+2)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+1), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+2), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+1), val); + val = 0; + val += gout7 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+2), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+1), val); + val = 0; + val += gout8 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+2), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + val = 0; + val += gout3 * dm[(i0+0)*nao+(l0+0)]; + val += gout4 * dm[(i0+1)*nao+(l0+0)]; + val += gout5 * dm[(i0+2)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+1), val); + val = 0; + val += gout6 * dm[(i0+0)*nao+(l0+0)]; + val += gout7 * dm[(i0+1)*nao+(l0+0)]; + val += gout8 * dm[(i0+2)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+2), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +#if CUDA_VERSION >= 12040 +__global__ __maxnreg__(128) +#else +__global__ +#endif +void rys_sr_jk_1010(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_sr_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_sr_jk_1010(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_jk_1011(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double gout3; + double gout4; + double gout5; + double gout6; + double gout7; + double gout8; + double gout9; + double gout10; + double gout11; + double gout12; + double gout13; + double gout14; + double gout15; + double gout16; + double gout17; + double gout18; + double gout19; + double gout20; + double gout21; + double gout22; + double gout23; + double gout24; + double gout25; + double gout26; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + gout3 = 0; + gout4 = 0; + gout5 = 0; + gout6 = 0; + gout7 = 0; + gout8 = 0; + gout9 = 0; + gout10 = 0; + gout11 = 0; + gout12 = 0; + gout13 = 0; + gout14 = 0; + gout15 = 0; + gout16 = 0; + gout17 = 0; + gout18 = 0; + gout19 = 0; + gout20 = 0; + gout21 = 0; + gout22 = 0; + gout23 = 0; + gout24 = 0; + gout25 = 0; + gout26 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(2, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(2, theta_fac*theta_rr, rw); + fac *= sqrt(theta_fac); + for (int irys = 0; irys < 2; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + } + } + if (task_id < ntasks) { + for (int irys = 0; irys < 2; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double b00 = .5 * rt_aa; + double rt_akl = rt_aa * aij; + double b01 = .5/akl * (1 - rt_akl); + double cpx = xqc + xpq*rt_akl; + double rt_aij = rt_aa * akl; + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_11x = cpx * trr_10x + 1*b00 * fac; + double trr_01x = cpx * fac; + double trr_12x = cpx * trr_11x + 1*b01 * trr_10x + 1*b00 * trr_01x; + double hrr_1011x = trr_12x - xlxk * trr_11x; + gout0 += hrr_1011x * 1 * wt; + double trr_02x = cpx * trr_01x + 1*b01 * fac; + double hrr_0011x = trr_02x - xlxk * trr_01x; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += hrr_0011x * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += hrr_0011x * 1 * trr_10z; + double hrr_1001x = trr_11x - xlxk * trr_10x; + double cpy = yqc + ypq*rt_akl; + double trr_01y = cpy * 1; + gout3 += hrr_1001x * trr_01y * wt; + double hrr_0001x = trr_01x - xlxk * fac; + double trr_11y = cpy * trr_10y + 1*b00 * 1; + gout4 += hrr_0001x * trr_11y * wt; + gout5 += hrr_0001x * trr_01y * trr_10z; + double cpz = zqc + zpq*rt_akl; + double trr_01z = cpz * wt; + gout6 += hrr_1001x * 1 * trr_01z; + gout7 += hrr_0001x * trr_10y * trr_01z; + double trr_11z = cpz * trr_10z + 1*b00 * wt; + gout8 += hrr_0001x * 1 * trr_11z; + double hrr_0001y = trr_01y - ylyk * 1; + gout9 += trr_11x * hrr_0001y * wt; + double hrr_1001y = trr_11y - ylyk * trr_10y; + gout10 += trr_01x * hrr_1001y * wt; + gout11 += trr_01x * hrr_0001y * trr_10z; + double trr_02y = cpy * trr_01y + 1*b01 * 1; + double hrr_0011y = trr_02y - ylyk * trr_01y; + gout12 += trr_10x * hrr_0011y * wt; + double trr_12y = cpy * trr_11y + 1*b01 * trr_10y + 1*b00 * trr_01y; + double hrr_1011y = trr_12y - ylyk * trr_11y; + gout13 += fac * hrr_1011y * wt; + gout14 += fac * hrr_0011y * trr_10z; + gout15 += trr_10x * hrr_0001y * trr_01z; + gout16 += fac * hrr_1001y * trr_01z; + gout17 += fac * hrr_0001y * trr_11z; + double hrr_0001z = trr_01z - zlzk * wt; + gout18 += trr_11x * 1 * hrr_0001z; + gout19 += trr_01x * trr_10y * hrr_0001z; + double hrr_1001z = trr_11z - zlzk * trr_10z; + gout20 += trr_01x * 1 * hrr_1001z; + gout21 += trr_10x * trr_01y * hrr_0001z; + gout22 += fac * trr_11y * hrr_0001z; + gout23 += fac * trr_01y * hrr_1001z; + double trr_02z = cpz * trr_01z + 1*b01 * wt; + double hrr_0011z = trr_02z - zlzk * trr_01z; + gout24 += trr_10x * 1 * hrr_0011z; + gout25 += fac * trr_10y * hrr_0011z; + double trr_12z = cpz * trr_11z + 1*b01 * trr_10z + 1*b00 * trr_01z; + double hrr_1011z = trr_12z - zlzk * trr_11z; + gout26 += fac * 1 * hrr_1011z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + val += gout3 * dm[(l0+0)*nao+(k0+1)]; + val += gout6 * dm[(l0+0)*nao+(k0+2)]; + val += gout9 * dm[(l0+1)*nao+(k0+0)]; + val += gout12 * dm[(l0+1)*nao+(k0+1)]; + val += gout15 * dm[(l0+1)*nao+(k0+2)]; + val += gout18 * dm[(l0+2)*nao+(k0+0)]; + val += gout21 * dm[(l0+2)*nao+(k0+1)]; + val += gout24 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + val += gout4 * dm[(l0+0)*nao+(k0+1)]; + val += gout7 * dm[(l0+0)*nao+(k0+2)]; + val += gout10 * dm[(l0+1)*nao+(k0+0)]; + val += gout13 * dm[(l0+1)*nao+(k0+1)]; + val += gout16 * dm[(l0+1)*nao+(k0+2)]; + val += gout19 * dm[(l0+2)*nao+(k0+0)]; + val += gout22 * dm[(l0+2)*nao+(k0+1)]; + val += gout25 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + val += gout5 * dm[(l0+0)*nao+(k0+1)]; + val += gout8 * dm[(l0+0)*nao+(k0+2)]; + val += gout11 * dm[(l0+1)*nao+(k0+0)]; + val += gout14 * dm[(l0+1)*nao+(k0+1)]; + val += gout17 * dm[(l0+1)*nao+(k0+2)]; + val += gout20 * dm[(l0+2)*nao+(k0+0)]; + val += gout23 * dm[(l0+2)*nao+(k0+1)]; + val += gout26 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(i0+0)]; + val += gout4 * dm[(j0+0)*nao+(i0+1)]; + val += gout5 * dm[(j0+0)*nao+(i0+2)]; + atomicAdd(vj+(k0+1)*nao+(l0+0), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(i0+0)]; + val += gout7 * dm[(j0+0)*nao+(i0+1)]; + val += gout8 * dm[(j0+0)*nao+(i0+2)]; + atomicAdd(vj+(k0+2)*nao+(l0+0), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(i0+0)]; + val += gout10 * dm[(j0+0)*nao+(i0+1)]; + val += gout11 * dm[(j0+0)*nao+(i0+2)]; + atomicAdd(vj+(k0+0)*nao+(l0+1), val); + val = 0; + val += gout12 * dm[(j0+0)*nao+(i0+0)]; + val += gout13 * dm[(j0+0)*nao+(i0+1)]; + val += gout14 * dm[(j0+0)*nao+(i0+2)]; + atomicAdd(vj+(k0+1)*nao+(l0+1), val); + val = 0; + val += gout15 * dm[(j0+0)*nao+(i0+0)]; + val += gout16 * dm[(j0+0)*nao+(i0+1)]; + val += gout17 * dm[(j0+0)*nao+(i0+2)]; + atomicAdd(vj+(k0+2)*nao+(l0+1), val); + val = 0; + val += gout18 * dm[(j0+0)*nao+(i0+0)]; + val += gout19 * dm[(j0+0)*nao+(i0+1)]; + val += gout20 * dm[(j0+0)*nao+(i0+2)]; + atomicAdd(vj+(k0+0)*nao+(l0+2), val); + val = 0; + val += gout21 * dm[(j0+0)*nao+(i0+0)]; + val += gout22 * dm[(j0+0)*nao+(i0+1)]; + val += gout23 * dm[(j0+0)*nao+(i0+2)]; + atomicAdd(vj+(k0+1)*nao+(l0+2), val); + val = 0; + val += gout24 * dm[(j0+0)*nao+(i0+0)]; + val += gout25 * dm[(j0+0)*nao+(i0+1)]; + val += gout26 * dm[(j0+0)*nao+(i0+2)]; + atomicAdd(vj+(k0+2)*nao+(l0+2), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + val += gout3 * dm[(j0+0)*nao+(k0+1)]; + val += gout6 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(k0+0)]; + val += gout12 * dm[(j0+0)*nao+(k0+1)]; + val += gout15 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+0)*nao+(l0+1), val); + val = 0; + val += gout18 * dm[(j0+0)*nao+(k0+0)]; + val += gout21 * dm[(j0+0)*nao+(k0+1)]; + val += gout24 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+0)*nao+(l0+2), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + val += gout4 * dm[(j0+0)*nao+(k0+1)]; + val += gout7 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout10 * dm[(j0+0)*nao+(k0+0)]; + val += gout13 * dm[(j0+0)*nao+(k0+1)]; + val += gout16 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+1)*nao+(l0+1), val); + val = 0; + val += gout19 * dm[(j0+0)*nao+(k0+0)]; + val += gout22 * dm[(j0+0)*nao+(k0+1)]; + val += gout25 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+1)*nao+(l0+2), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + val += gout5 * dm[(j0+0)*nao+(k0+1)]; + val += gout8 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout11 * dm[(j0+0)*nao+(k0+0)]; + val += gout14 * dm[(j0+0)*nao+(k0+1)]; + val += gout17 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+2)*nao+(l0+1), val); + val = 0; + val += gout20 * dm[(j0+0)*nao+(k0+0)]; + val += gout23 * dm[(j0+0)*nao+(k0+1)]; + val += gout26 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+2)*nao+(l0+2), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout3 * dm[(i0+0)*nao+(k0+1)]; + val += gout6 * dm[(i0+0)*nao+(k0+2)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout4 * dm[(i0+1)*nao+(k0+1)]; + val += gout7 * dm[(i0+1)*nao+(k0+2)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + val += gout5 * dm[(i0+2)*nao+(k0+1)]; + val += gout8 * dm[(i0+2)*nao+(k0+2)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout9 * dm[(i0+0)*nao+(k0+0)]; + val += gout12 * dm[(i0+0)*nao+(k0+1)]; + val += gout15 * dm[(i0+0)*nao+(k0+2)]; + val += gout10 * dm[(i0+1)*nao+(k0+0)]; + val += gout13 * dm[(i0+1)*nao+(k0+1)]; + val += gout16 * dm[(i0+1)*nao+(k0+2)]; + val += gout11 * dm[(i0+2)*nao+(k0+0)]; + val += gout14 * dm[(i0+2)*nao+(k0+1)]; + val += gout17 * dm[(i0+2)*nao+(k0+2)]; + atomicAdd(vk+(j0+0)*nao+(l0+1), val); + val = 0; + val += gout18 * dm[(i0+0)*nao+(k0+0)]; + val += gout21 * dm[(i0+0)*nao+(k0+1)]; + val += gout24 * dm[(i0+0)*nao+(k0+2)]; + val += gout19 * dm[(i0+1)*nao+(k0+0)]; + val += gout22 * dm[(i0+1)*nao+(k0+1)]; + val += gout25 * dm[(i0+1)*nao+(k0+2)]; + val += gout20 * dm[(i0+2)*nao+(k0+0)]; + val += gout23 * dm[(i0+2)*nao+(k0+1)]; + val += gout26 * dm[(i0+2)*nao+(k0+2)]; + atomicAdd(vk+(j0+0)*nao+(l0+2), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + val += gout9 * dm[(j0+0)*nao+(l0+1)]; + val += gout18 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(l0+0)]; + val += gout12 * dm[(j0+0)*nao+(l0+1)]; + val += gout21 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+0)*nao+(k0+1), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(l0+0)]; + val += gout15 * dm[(j0+0)*nao+(l0+1)]; + val += gout24 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+0)*nao+(k0+2), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + val += gout10 * dm[(j0+0)*nao+(l0+1)]; + val += gout19 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(l0+0)]; + val += gout13 * dm[(j0+0)*nao+(l0+1)]; + val += gout22 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+1)*nao+(k0+1), val); + val = 0; + val += gout7 * dm[(j0+0)*nao+(l0+0)]; + val += gout16 * dm[(j0+0)*nao+(l0+1)]; + val += gout25 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+1)*nao+(k0+2), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + val += gout11 * dm[(j0+0)*nao+(l0+1)]; + val += gout20 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(l0+0)]; + val += gout14 * dm[(j0+0)*nao+(l0+1)]; + val += gout23 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+2)*nao+(k0+1), val); + val = 0; + val += gout8 * dm[(j0+0)*nao+(l0+0)]; + val += gout17 * dm[(j0+0)*nao+(l0+1)]; + val += gout26 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+2)*nao+(k0+2), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout9 * dm[(i0+0)*nao+(l0+1)]; + val += gout18 * dm[(i0+0)*nao+(l0+2)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout10 * dm[(i0+1)*nao+(l0+1)]; + val += gout19 * dm[(i0+1)*nao+(l0+2)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + val += gout11 * dm[(i0+2)*nao+(l0+1)]; + val += gout20 * dm[(i0+2)*nao+(l0+2)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + val = 0; + val += gout3 * dm[(i0+0)*nao+(l0+0)]; + val += gout12 * dm[(i0+0)*nao+(l0+1)]; + val += gout21 * dm[(i0+0)*nao+(l0+2)]; + val += gout4 * dm[(i0+1)*nao+(l0+0)]; + val += gout13 * dm[(i0+1)*nao+(l0+1)]; + val += gout22 * dm[(i0+1)*nao+(l0+2)]; + val += gout5 * dm[(i0+2)*nao+(l0+0)]; + val += gout14 * dm[(i0+2)*nao+(l0+1)]; + val += gout23 * dm[(i0+2)*nao+(l0+2)]; + atomicAdd(vk+(j0+0)*nao+(k0+1), val); + val = 0; + val += gout6 * dm[(i0+0)*nao+(l0+0)]; + val += gout15 * dm[(i0+0)*nao+(l0+1)]; + val += gout24 * dm[(i0+0)*nao+(l0+2)]; + val += gout7 * dm[(i0+1)*nao+(l0+0)]; + val += gout16 * dm[(i0+1)*nao+(l0+1)]; + val += gout25 * dm[(i0+1)*nao+(l0+2)]; + val += gout8 * dm[(i0+2)*nao+(l0+0)]; + val += gout17 * dm[(i0+2)*nao+(l0+1)]; + val += gout26 * dm[(i0+2)*nao+(l0+2)]; + atomicAdd(vk+(j0+0)*nao+(k0+2), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +__global__ +void rys_jk_1011(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_jk_1011(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_sr_jk_1011(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double gout3; + double gout4; + double gout5; + double gout6; + double gout7; + double gout8; + double gout9; + double gout10; + double gout11; + double gout12; + double gout13; + double gout14; + double gout15; + double gout16; + double gout17; + double gout18; + double gout19; + double gout20; + double gout21; + double gout22; + double gout23; + double gout24; + double gout25; + double gout26; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + gout3 = 0; + gout4 = 0; + gout5 = 0; + gout6 = 0; + gout7 = 0; + gout8 = 0; + gout9 = 0; + gout10 = 0; + gout11 = 0; + gout12 = 0; + gout13 = 0; + gout14 = 0; + gout15 = 0; + gout16 = 0; + gout17 = 0; + gout18 = 0; + gout19 = 0; + gout20 = 0; + gout21 = 0; + gout22 = 0; + gout23 = 0; + gout24 = 0; + gout25 = 0; + gout26 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + rys_roots(2, theta_rr, rw+4*nsq_per_block); + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(2, theta_fac*theta_rr, rw); + double sqrt_theta_fac = -sqrt(theta_fac); + for (int irys = 0; irys < 2; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + rw[sq_id+(irys*2+1)*nsq_per_block] *= sqrt_theta_fac; + } + if (task_id < ntasks) { + for (int irys = 0; irys < 4; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double b00 = .5 * rt_aa; + double rt_akl = rt_aa * aij; + double b01 = .5/akl * (1 - rt_akl); + double cpx = xqc + xpq*rt_akl; + double rt_aij = rt_aa * akl; + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_11x = cpx * trr_10x + 1*b00 * fac; + double trr_01x = cpx * fac; + double trr_12x = cpx * trr_11x + 1*b01 * trr_10x + 1*b00 * trr_01x; + double hrr_1011x = trr_12x - xlxk * trr_11x; + gout0 += hrr_1011x * 1 * wt; + double trr_02x = cpx * trr_01x + 1*b01 * fac; + double hrr_0011x = trr_02x - xlxk * trr_01x; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += hrr_0011x * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += hrr_0011x * 1 * trr_10z; + double hrr_1001x = trr_11x - xlxk * trr_10x; + double cpy = yqc + ypq*rt_akl; + double trr_01y = cpy * 1; + gout3 += hrr_1001x * trr_01y * wt; + double hrr_0001x = trr_01x - xlxk * fac; + double trr_11y = cpy * trr_10y + 1*b00 * 1; + gout4 += hrr_0001x * trr_11y * wt; + gout5 += hrr_0001x * trr_01y * trr_10z; + double cpz = zqc + zpq*rt_akl; + double trr_01z = cpz * wt; + gout6 += hrr_1001x * 1 * trr_01z; + gout7 += hrr_0001x * trr_10y * trr_01z; + double trr_11z = cpz * trr_10z + 1*b00 * wt; + gout8 += hrr_0001x * 1 * trr_11z; + double hrr_0001y = trr_01y - ylyk * 1; + gout9 += trr_11x * hrr_0001y * wt; + double hrr_1001y = trr_11y - ylyk * trr_10y; + gout10 += trr_01x * hrr_1001y * wt; + gout11 += trr_01x * hrr_0001y * trr_10z; + double trr_02y = cpy * trr_01y + 1*b01 * 1; + double hrr_0011y = trr_02y - ylyk * trr_01y; + gout12 += trr_10x * hrr_0011y * wt; + double trr_12y = cpy * trr_11y + 1*b01 * trr_10y + 1*b00 * trr_01y; + double hrr_1011y = trr_12y - ylyk * trr_11y; + gout13 += fac * hrr_1011y * wt; + gout14 += fac * hrr_0011y * trr_10z; + gout15 += trr_10x * hrr_0001y * trr_01z; + gout16 += fac * hrr_1001y * trr_01z; + gout17 += fac * hrr_0001y * trr_11z; + double hrr_0001z = trr_01z - zlzk * wt; + gout18 += trr_11x * 1 * hrr_0001z; + gout19 += trr_01x * trr_10y * hrr_0001z; + double hrr_1001z = trr_11z - zlzk * trr_10z; + gout20 += trr_01x * 1 * hrr_1001z; + gout21 += trr_10x * trr_01y * hrr_0001z; + gout22 += fac * trr_11y * hrr_0001z; + gout23 += fac * trr_01y * hrr_1001z; + double trr_02z = cpz * trr_01z + 1*b01 * wt; + double hrr_0011z = trr_02z - zlzk * trr_01z; + gout24 += trr_10x * 1 * hrr_0011z; + gout25 += fac * trr_10y * hrr_0011z; + double trr_12z = cpz * trr_11z + 1*b01 * trr_10z + 1*b00 * trr_01z; + double hrr_1011z = trr_12z - zlzk * trr_11z; + gout26 += fac * 1 * hrr_1011z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + val += gout3 * dm[(l0+0)*nao+(k0+1)]; + val += gout6 * dm[(l0+0)*nao+(k0+2)]; + val += gout9 * dm[(l0+1)*nao+(k0+0)]; + val += gout12 * dm[(l0+1)*nao+(k0+1)]; + val += gout15 * dm[(l0+1)*nao+(k0+2)]; + val += gout18 * dm[(l0+2)*nao+(k0+0)]; + val += gout21 * dm[(l0+2)*nao+(k0+1)]; + val += gout24 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + val += gout4 * dm[(l0+0)*nao+(k0+1)]; + val += gout7 * dm[(l0+0)*nao+(k0+2)]; + val += gout10 * dm[(l0+1)*nao+(k0+0)]; + val += gout13 * dm[(l0+1)*nao+(k0+1)]; + val += gout16 * dm[(l0+1)*nao+(k0+2)]; + val += gout19 * dm[(l0+2)*nao+(k0+0)]; + val += gout22 * dm[(l0+2)*nao+(k0+1)]; + val += gout25 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + val += gout5 * dm[(l0+0)*nao+(k0+1)]; + val += gout8 * dm[(l0+0)*nao+(k0+2)]; + val += gout11 * dm[(l0+1)*nao+(k0+0)]; + val += gout14 * dm[(l0+1)*nao+(k0+1)]; + val += gout17 * dm[(l0+1)*nao+(k0+2)]; + val += gout20 * dm[(l0+2)*nao+(k0+0)]; + val += gout23 * dm[(l0+2)*nao+(k0+1)]; + val += gout26 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(i0+0)]; + val += gout4 * dm[(j0+0)*nao+(i0+1)]; + val += gout5 * dm[(j0+0)*nao+(i0+2)]; + atomicAdd(vj+(k0+1)*nao+(l0+0), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(i0+0)]; + val += gout7 * dm[(j0+0)*nao+(i0+1)]; + val += gout8 * dm[(j0+0)*nao+(i0+2)]; + atomicAdd(vj+(k0+2)*nao+(l0+0), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(i0+0)]; + val += gout10 * dm[(j0+0)*nao+(i0+1)]; + val += gout11 * dm[(j0+0)*nao+(i0+2)]; + atomicAdd(vj+(k0+0)*nao+(l0+1), val); + val = 0; + val += gout12 * dm[(j0+0)*nao+(i0+0)]; + val += gout13 * dm[(j0+0)*nao+(i0+1)]; + val += gout14 * dm[(j0+0)*nao+(i0+2)]; + atomicAdd(vj+(k0+1)*nao+(l0+1), val); + val = 0; + val += gout15 * dm[(j0+0)*nao+(i0+0)]; + val += gout16 * dm[(j0+0)*nao+(i0+1)]; + val += gout17 * dm[(j0+0)*nao+(i0+2)]; + atomicAdd(vj+(k0+2)*nao+(l0+1), val); + val = 0; + val += gout18 * dm[(j0+0)*nao+(i0+0)]; + val += gout19 * dm[(j0+0)*nao+(i0+1)]; + val += gout20 * dm[(j0+0)*nao+(i0+2)]; + atomicAdd(vj+(k0+0)*nao+(l0+2), val); + val = 0; + val += gout21 * dm[(j0+0)*nao+(i0+0)]; + val += gout22 * dm[(j0+0)*nao+(i0+1)]; + val += gout23 * dm[(j0+0)*nao+(i0+2)]; + atomicAdd(vj+(k0+1)*nao+(l0+2), val); + val = 0; + val += gout24 * dm[(j0+0)*nao+(i0+0)]; + val += gout25 * dm[(j0+0)*nao+(i0+1)]; + val += gout26 * dm[(j0+0)*nao+(i0+2)]; + atomicAdd(vj+(k0+2)*nao+(l0+2), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + val += gout3 * dm[(j0+0)*nao+(k0+1)]; + val += gout6 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(k0+0)]; + val += gout12 * dm[(j0+0)*nao+(k0+1)]; + val += gout15 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+0)*nao+(l0+1), val); + val = 0; + val += gout18 * dm[(j0+0)*nao+(k0+0)]; + val += gout21 * dm[(j0+0)*nao+(k0+1)]; + val += gout24 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+0)*nao+(l0+2), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + val += gout4 * dm[(j0+0)*nao+(k0+1)]; + val += gout7 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout10 * dm[(j0+0)*nao+(k0+0)]; + val += gout13 * dm[(j0+0)*nao+(k0+1)]; + val += gout16 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+1)*nao+(l0+1), val); + val = 0; + val += gout19 * dm[(j0+0)*nao+(k0+0)]; + val += gout22 * dm[(j0+0)*nao+(k0+1)]; + val += gout25 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+1)*nao+(l0+2), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + val += gout5 * dm[(j0+0)*nao+(k0+1)]; + val += gout8 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout11 * dm[(j0+0)*nao+(k0+0)]; + val += gout14 * dm[(j0+0)*nao+(k0+1)]; + val += gout17 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+2)*nao+(l0+1), val); + val = 0; + val += gout20 * dm[(j0+0)*nao+(k0+0)]; + val += gout23 * dm[(j0+0)*nao+(k0+1)]; + val += gout26 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+2)*nao+(l0+2), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout3 * dm[(i0+0)*nao+(k0+1)]; + val += gout6 * dm[(i0+0)*nao+(k0+2)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout4 * dm[(i0+1)*nao+(k0+1)]; + val += gout7 * dm[(i0+1)*nao+(k0+2)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + val += gout5 * dm[(i0+2)*nao+(k0+1)]; + val += gout8 * dm[(i0+2)*nao+(k0+2)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout9 * dm[(i0+0)*nao+(k0+0)]; + val += gout12 * dm[(i0+0)*nao+(k0+1)]; + val += gout15 * dm[(i0+0)*nao+(k0+2)]; + val += gout10 * dm[(i0+1)*nao+(k0+0)]; + val += gout13 * dm[(i0+1)*nao+(k0+1)]; + val += gout16 * dm[(i0+1)*nao+(k0+2)]; + val += gout11 * dm[(i0+2)*nao+(k0+0)]; + val += gout14 * dm[(i0+2)*nao+(k0+1)]; + val += gout17 * dm[(i0+2)*nao+(k0+2)]; + atomicAdd(vk+(j0+0)*nao+(l0+1), val); + val = 0; + val += gout18 * dm[(i0+0)*nao+(k0+0)]; + val += gout21 * dm[(i0+0)*nao+(k0+1)]; + val += gout24 * dm[(i0+0)*nao+(k0+2)]; + val += gout19 * dm[(i0+1)*nao+(k0+0)]; + val += gout22 * dm[(i0+1)*nao+(k0+1)]; + val += gout25 * dm[(i0+1)*nao+(k0+2)]; + val += gout20 * dm[(i0+2)*nao+(k0+0)]; + val += gout23 * dm[(i0+2)*nao+(k0+1)]; + val += gout26 * dm[(i0+2)*nao+(k0+2)]; + atomicAdd(vk+(j0+0)*nao+(l0+2), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + val += gout9 * dm[(j0+0)*nao+(l0+1)]; + val += gout18 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(l0+0)]; + val += gout12 * dm[(j0+0)*nao+(l0+1)]; + val += gout21 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+0)*nao+(k0+1), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(l0+0)]; + val += gout15 * dm[(j0+0)*nao+(l0+1)]; + val += gout24 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+0)*nao+(k0+2), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + val += gout10 * dm[(j0+0)*nao+(l0+1)]; + val += gout19 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(l0+0)]; + val += gout13 * dm[(j0+0)*nao+(l0+1)]; + val += gout22 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+1)*nao+(k0+1), val); + val = 0; + val += gout7 * dm[(j0+0)*nao+(l0+0)]; + val += gout16 * dm[(j0+0)*nao+(l0+1)]; + val += gout25 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+1)*nao+(k0+2), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + val += gout11 * dm[(j0+0)*nao+(l0+1)]; + val += gout20 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(l0+0)]; + val += gout14 * dm[(j0+0)*nao+(l0+1)]; + val += gout23 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+2)*nao+(k0+1), val); + val = 0; + val += gout8 * dm[(j0+0)*nao+(l0+0)]; + val += gout17 * dm[(j0+0)*nao+(l0+1)]; + val += gout26 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+2)*nao+(k0+2), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout9 * dm[(i0+0)*nao+(l0+1)]; + val += gout18 * dm[(i0+0)*nao+(l0+2)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout10 * dm[(i0+1)*nao+(l0+1)]; + val += gout19 * dm[(i0+1)*nao+(l0+2)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + val += gout11 * dm[(i0+2)*nao+(l0+1)]; + val += gout20 * dm[(i0+2)*nao+(l0+2)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + val = 0; + val += gout3 * dm[(i0+0)*nao+(l0+0)]; + val += gout12 * dm[(i0+0)*nao+(l0+1)]; + val += gout21 * dm[(i0+0)*nao+(l0+2)]; + val += gout4 * dm[(i0+1)*nao+(l0+0)]; + val += gout13 * dm[(i0+1)*nao+(l0+1)]; + val += gout22 * dm[(i0+1)*nao+(l0+2)]; + val += gout5 * dm[(i0+2)*nao+(l0+0)]; + val += gout14 * dm[(i0+2)*nao+(l0+1)]; + val += gout23 * dm[(i0+2)*nao+(l0+2)]; + atomicAdd(vk+(j0+0)*nao+(k0+1), val); + val = 0; + val += gout6 * dm[(i0+0)*nao+(l0+0)]; + val += gout15 * dm[(i0+0)*nao+(l0+1)]; + val += gout24 * dm[(i0+0)*nao+(l0+2)]; + val += gout7 * dm[(i0+1)*nao+(l0+0)]; + val += gout16 * dm[(i0+1)*nao+(l0+1)]; + val += gout25 * dm[(i0+1)*nao+(l0+2)]; + val += gout8 * dm[(i0+2)*nao+(l0+0)]; + val += gout17 * dm[(i0+2)*nao+(l0+1)]; + val += gout26 * dm[(i0+2)*nao+(l0+2)]; + atomicAdd(vk+(j0+0)*nao+(k0+2), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +__global__ +void rys_sr_jk_1011(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_sr_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_sr_jk_1011(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_jk_1100(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double gout3; + double gout4; + double gout5; + double gout6; + double gout7; + double gout8; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + gout3 = 0; + gout4 = 0; + gout5 = 0; + gout6 = 0; + gout7 = 0; + gout8 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(2, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(2, theta_fac*theta_rr, rw); + fac *= sqrt(theta_fac); + for (int irys = 0; irys < 2; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + } + } + if (task_id < ntasks) { + for (int irys = 0; irys < 2; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + double hrr_1100x = trr_20x - xjxi * trr_10x; + gout0 += hrr_1100x * 1 * wt; + double hrr_0100x = trr_10x - xjxi * fac; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += hrr_0100x * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += hrr_0100x * 1 * trr_10z; + double hrr_0100y = trr_10y - yjyi * 1; + gout3 += trr_10x * hrr_0100y * wt; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + double hrr_1100y = trr_20y - yjyi * trr_10y; + gout4 += fac * hrr_1100y * wt; + gout5 += fac * hrr_0100y * trr_10z; + double hrr_0100z = trr_10z - zjzi * wt; + gout6 += trr_10x * 1 * hrr_0100z; + gout7 += fac * trr_10y * hrr_0100z; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + double hrr_1100z = trr_20z - zjzi * trr_10z; + gout8 += fac * 1 * hrr_1100z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout3 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+1), val); + val = 0; + val += gout6 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+2), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout4 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+1), val); + val = 0; + val += gout7 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+2), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout5 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+1), val); + val = 0; + val += gout8 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+2), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + val += gout3 * dm[(j0+1)*nao+(i0+0)]; + val += gout4 * dm[(j0+1)*nao+(i0+1)]; + val += gout5 * dm[(j0+1)*nao+(i0+2)]; + val += gout6 * dm[(j0+2)*nao+(i0+0)]; + val += gout7 * dm[(j0+2)*nao+(i0+1)]; + val += gout8 * dm[(j0+2)*nao+(i0+2)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + val += gout3 * dm[(j0+1)*nao+(k0+0)]; + val += gout6 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + val += gout4 * dm[(j0+1)*nao+(k0+0)]; + val += gout7 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + val += gout5 * dm[(j0+1)*nao+(k0+0)]; + val += gout8 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout3 * dm[(i0+0)*nao+(k0+0)]; + val += gout4 * dm[(i0+1)*nao+(k0+0)]; + val += gout5 * dm[(i0+2)*nao+(k0+0)]; + atomicAdd(vk+(j0+1)*nao+(l0+0), val); + val = 0; + val += gout6 * dm[(i0+0)*nao+(k0+0)]; + val += gout7 * dm[(i0+1)*nao+(k0+0)]; + val += gout8 * dm[(i0+2)*nao+(k0+0)]; + atomicAdd(vk+(j0+2)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + val += gout3 * dm[(j0+1)*nao+(l0+0)]; + val += gout6 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + val += gout4 * dm[(j0+1)*nao+(l0+0)]; + val += gout7 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + val += gout5 * dm[(j0+1)*nao+(l0+0)]; + val += gout8 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + val = 0; + val += gout3 * dm[(i0+0)*nao+(l0+0)]; + val += gout4 * dm[(i0+1)*nao+(l0+0)]; + val += gout5 * dm[(i0+2)*nao+(l0+0)]; + atomicAdd(vk+(j0+1)*nao+(k0+0), val); + val = 0; + val += gout6 * dm[(i0+0)*nao+(l0+0)]; + val += gout7 * dm[(i0+1)*nao+(l0+0)]; + val += gout8 * dm[(i0+2)*nao+(l0+0)]; + atomicAdd(vk+(j0+2)*nao+(k0+0), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +#if CUDA_VERSION >= 12040 +__global__ __maxnreg__(128) +#else +__global__ +#endif +void rys_jk_1100(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_jk_1100(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_sr_jk_1100(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double gout3; + double gout4; + double gout5; + double gout6; + double gout7; + double gout8; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + gout3 = 0; + gout4 = 0; + gout5 = 0; + gout6 = 0; + gout7 = 0; + gout8 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + rys_roots(2, theta_rr, rw+4*nsq_per_block); + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(2, theta_fac*theta_rr, rw); + double sqrt_theta_fac = -sqrt(theta_fac); + for (int irys = 0; irys < 2; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + rw[sq_id+(irys*2+1)*nsq_per_block] *= sqrt_theta_fac; + } + if (task_id < ntasks) { + for (int irys = 0; irys < 4; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + double hrr_1100x = trr_20x - xjxi * trr_10x; + gout0 += hrr_1100x * 1 * wt; + double hrr_0100x = trr_10x - xjxi * fac; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += hrr_0100x * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += hrr_0100x * 1 * trr_10z; + double hrr_0100y = trr_10y - yjyi * 1; + gout3 += trr_10x * hrr_0100y * wt; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + double hrr_1100y = trr_20y - yjyi * trr_10y; + gout4 += fac * hrr_1100y * wt; + gout5 += fac * hrr_0100y * trr_10z; + double hrr_0100z = trr_10z - zjzi * wt; + gout6 += trr_10x * 1 * hrr_0100z; + gout7 += fac * trr_10y * hrr_0100z; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + double hrr_1100z = trr_20z - zjzi * trr_10z; + gout8 += fac * 1 * hrr_1100z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout3 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+1), val); + val = 0; + val += gout6 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+2), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout4 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+1), val); + val = 0; + val += gout7 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+2), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout5 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+1), val); + val = 0; + val += gout8 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+2), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + val += gout3 * dm[(j0+1)*nao+(i0+0)]; + val += gout4 * dm[(j0+1)*nao+(i0+1)]; + val += gout5 * dm[(j0+1)*nao+(i0+2)]; + val += gout6 * dm[(j0+2)*nao+(i0+0)]; + val += gout7 * dm[(j0+2)*nao+(i0+1)]; + val += gout8 * dm[(j0+2)*nao+(i0+2)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + val += gout3 * dm[(j0+1)*nao+(k0+0)]; + val += gout6 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + val += gout4 * dm[(j0+1)*nao+(k0+0)]; + val += gout7 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + val += gout5 * dm[(j0+1)*nao+(k0+0)]; + val += gout8 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout3 * dm[(i0+0)*nao+(k0+0)]; + val += gout4 * dm[(i0+1)*nao+(k0+0)]; + val += gout5 * dm[(i0+2)*nao+(k0+0)]; + atomicAdd(vk+(j0+1)*nao+(l0+0), val); + val = 0; + val += gout6 * dm[(i0+0)*nao+(k0+0)]; + val += gout7 * dm[(i0+1)*nao+(k0+0)]; + val += gout8 * dm[(i0+2)*nao+(k0+0)]; + atomicAdd(vk+(j0+2)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + val += gout3 * dm[(j0+1)*nao+(l0+0)]; + val += gout6 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + val += gout4 * dm[(j0+1)*nao+(l0+0)]; + val += gout7 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + val += gout5 * dm[(j0+1)*nao+(l0+0)]; + val += gout8 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + val = 0; + val += gout3 * dm[(i0+0)*nao+(l0+0)]; + val += gout4 * dm[(i0+1)*nao+(l0+0)]; + val += gout5 * dm[(i0+2)*nao+(l0+0)]; + atomicAdd(vk+(j0+1)*nao+(k0+0), val); + val = 0; + val += gout6 * dm[(i0+0)*nao+(l0+0)]; + val += gout7 * dm[(i0+1)*nao+(l0+0)]; + val += gout8 * dm[(i0+2)*nao+(l0+0)]; + atomicAdd(vk+(j0+2)*nao+(k0+0), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +#if CUDA_VERSION >= 12040 +__global__ __maxnreg__(128) +#else +__global__ +#endif +void rys_sr_jk_1100(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_sr_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_sr_jk_1100(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_jk_1110(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double gout3; + double gout4; + double gout5; + double gout6; + double gout7; + double gout8; + double gout9; + double gout10; + double gout11; + double gout12; + double gout13; + double gout14; + double gout15; + double gout16; + double gout17; + double gout18; + double gout19; + double gout20; + double gout21; + double gout22; + double gout23; + double gout24; + double gout25; + double gout26; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + gout3 = 0; + gout4 = 0; + gout5 = 0; + gout6 = 0; + gout7 = 0; + gout8 = 0; + gout9 = 0; + gout10 = 0; + gout11 = 0; + gout12 = 0; + gout13 = 0; + gout14 = 0; + gout15 = 0; + gout16 = 0; + gout17 = 0; + gout18 = 0; + gout19 = 0; + gout20 = 0; + gout21 = 0; + gout22 = 0; + gout23 = 0; + gout24 = 0; + gout25 = 0; + gout26 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(2, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(2, theta_fac*theta_rr, rw); + fac *= sqrt(theta_fac); + for (int irys = 0; irys < 2; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + } + } + if (task_id < ntasks) { + for (int irys = 0; irys < 2; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double b00 = .5 * rt_aa; + double rt_akl = rt_aa * aij; + double cpx = xqc + xpq*rt_akl; + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + double trr_21x = cpx * trr_20x + 2*b00 * trr_10x; + double trr_11x = cpx * trr_10x + 1*b00 * fac; + double hrr_1110x = trr_21x - xjxi * trr_11x; + gout0 += hrr_1110x * 1 * wt; + double trr_01x = cpx * fac; + double hrr_0110x = trr_11x - xjxi * trr_01x; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += hrr_0110x * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += hrr_0110x * 1 * trr_10z; + double hrr_0100y = trr_10y - yjyi * 1; + gout3 += trr_11x * hrr_0100y * wt; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + double hrr_1100y = trr_20y - yjyi * trr_10y; + gout4 += trr_01x * hrr_1100y * wt; + gout5 += trr_01x * hrr_0100y * trr_10z; + double hrr_0100z = trr_10z - zjzi * wt; + gout6 += trr_11x * 1 * hrr_0100z; + gout7 += trr_01x * trr_10y * hrr_0100z; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + double hrr_1100z = trr_20z - zjzi * trr_10z; + gout8 += trr_01x * 1 * hrr_1100z; + double hrr_1100x = trr_20x - xjxi * trr_10x; + double cpy = yqc + ypq*rt_akl; + double trr_01y = cpy * 1; + gout9 += hrr_1100x * trr_01y * wt; + double hrr_0100x = trr_10x - xjxi * fac; + double trr_11y = cpy * trr_10y + 1*b00 * 1; + gout10 += hrr_0100x * trr_11y * wt; + gout11 += hrr_0100x * trr_01y * trr_10z; + double hrr_0110y = trr_11y - yjyi * trr_01y; + gout12 += trr_10x * hrr_0110y * wt; + double trr_21y = cpy * trr_20y + 2*b00 * trr_10y; + double hrr_1110y = trr_21y - yjyi * trr_11y; + gout13 += fac * hrr_1110y * wt; + gout14 += fac * hrr_0110y * trr_10z; + gout15 += trr_10x * trr_01y * hrr_0100z; + gout16 += fac * trr_11y * hrr_0100z; + gout17 += fac * trr_01y * hrr_1100z; + double cpz = zqc + zpq*rt_akl; + double trr_01z = cpz * wt; + gout18 += hrr_1100x * 1 * trr_01z; + gout19 += hrr_0100x * trr_10y * trr_01z; + double trr_11z = cpz * trr_10z + 1*b00 * wt; + gout20 += hrr_0100x * 1 * trr_11z; + gout21 += trr_10x * hrr_0100y * trr_01z; + gout22 += fac * hrr_1100y * trr_01z; + gout23 += fac * hrr_0100y * trr_11z; + double hrr_0110z = trr_11z - zjzi * trr_01z; + gout24 += trr_10x * 1 * hrr_0110z; + gout25 += fac * trr_10y * hrr_0110z; + double trr_21z = cpz * trr_20z + 2*b00 * trr_10z; + double hrr_1110z = trr_21z - zjzi * trr_11z; + gout26 += fac * 1 * hrr_1110z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + val += gout9 * dm[(l0+0)*nao+(k0+1)]; + val += gout18 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout3 * dm[(l0+0)*nao+(k0+0)]; + val += gout12 * dm[(l0+0)*nao+(k0+1)]; + val += gout21 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+0)*nao+(j0+1), val); + val = 0; + val += gout6 * dm[(l0+0)*nao+(k0+0)]; + val += gout15 * dm[(l0+0)*nao+(k0+1)]; + val += gout24 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+0)*nao+(j0+2), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + val += gout10 * dm[(l0+0)*nao+(k0+1)]; + val += gout19 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout4 * dm[(l0+0)*nao+(k0+0)]; + val += gout13 * dm[(l0+0)*nao+(k0+1)]; + val += gout22 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+1)*nao+(j0+1), val); + val = 0; + val += gout7 * dm[(l0+0)*nao+(k0+0)]; + val += gout16 * dm[(l0+0)*nao+(k0+1)]; + val += gout25 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+1)*nao+(j0+2), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + val += gout11 * dm[(l0+0)*nao+(k0+1)]; + val += gout20 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout5 * dm[(l0+0)*nao+(k0+0)]; + val += gout14 * dm[(l0+0)*nao+(k0+1)]; + val += gout23 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+2)*nao+(j0+1), val); + val = 0; + val += gout8 * dm[(l0+0)*nao+(k0+0)]; + val += gout17 * dm[(l0+0)*nao+(k0+1)]; + val += gout26 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+2)*nao+(j0+2), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + val += gout3 * dm[(j0+1)*nao+(i0+0)]; + val += gout4 * dm[(j0+1)*nao+(i0+1)]; + val += gout5 * dm[(j0+1)*nao+(i0+2)]; + val += gout6 * dm[(j0+2)*nao+(i0+0)]; + val += gout7 * dm[(j0+2)*nao+(i0+1)]; + val += gout8 * dm[(j0+2)*nao+(i0+2)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(i0+0)]; + val += gout10 * dm[(j0+0)*nao+(i0+1)]; + val += gout11 * dm[(j0+0)*nao+(i0+2)]; + val += gout12 * dm[(j0+1)*nao+(i0+0)]; + val += gout13 * dm[(j0+1)*nao+(i0+1)]; + val += gout14 * dm[(j0+1)*nao+(i0+2)]; + val += gout15 * dm[(j0+2)*nao+(i0+0)]; + val += gout16 * dm[(j0+2)*nao+(i0+1)]; + val += gout17 * dm[(j0+2)*nao+(i0+2)]; + atomicAdd(vj+(k0+1)*nao+(l0+0), val); + val = 0; + val += gout18 * dm[(j0+0)*nao+(i0+0)]; + val += gout19 * dm[(j0+0)*nao+(i0+1)]; + val += gout20 * dm[(j0+0)*nao+(i0+2)]; + val += gout21 * dm[(j0+1)*nao+(i0+0)]; + val += gout22 * dm[(j0+1)*nao+(i0+1)]; + val += gout23 * dm[(j0+1)*nao+(i0+2)]; + val += gout24 * dm[(j0+2)*nao+(i0+0)]; + val += gout25 * dm[(j0+2)*nao+(i0+1)]; + val += gout26 * dm[(j0+2)*nao+(i0+2)]; + atomicAdd(vj+(k0+2)*nao+(l0+0), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + val += gout9 * dm[(j0+0)*nao+(k0+1)]; + val += gout18 * dm[(j0+0)*nao+(k0+2)]; + val += gout3 * dm[(j0+1)*nao+(k0+0)]; + val += gout12 * dm[(j0+1)*nao+(k0+1)]; + val += gout21 * dm[(j0+1)*nao+(k0+2)]; + val += gout6 * dm[(j0+2)*nao+(k0+0)]; + val += gout15 * dm[(j0+2)*nao+(k0+1)]; + val += gout24 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + val += gout10 * dm[(j0+0)*nao+(k0+1)]; + val += gout19 * dm[(j0+0)*nao+(k0+2)]; + val += gout4 * dm[(j0+1)*nao+(k0+0)]; + val += gout13 * dm[(j0+1)*nao+(k0+1)]; + val += gout22 * dm[(j0+1)*nao+(k0+2)]; + val += gout7 * dm[(j0+2)*nao+(k0+0)]; + val += gout16 * dm[(j0+2)*nao+(k0+1)]; + val += gout25 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + val += gout11 * dm[(j0+0)*nao+(k0+1)]; + val += gout20 * dm[(j0+0)*nao+(k0+2)]; + val += gout5 * dm[(j0+1)*nao+(k0+0)]; + val += gout14 * dm[(j0+1)*nao+(k0+1)]; + val += gout23 * dm[(j0+1)*nao+(k0+2)]; + val += gout8 * dm[(j0+2)*nao+(k0+0)]; + val += gout17 * dm[(j0+2)*nao+(k0+1)]; + val += gout26 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout9 * dm[(i0+0)*nao+(k0+1)]; + val += gout18 * dm[(i0+0)*nao+(k0+2)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout10 * dm[(i0+1)*nao+(k0+1)]; + val += gout19 * dm[(i0+1)*nao+(k0+2)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + val += gout11 * dm[(i0+2)*nao+(k0+1)]; + val += gout20 * dm[(i0+2)*nao+(k0+2)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout3 * dm[(i0+0)*nao+(k0+0)]; + val += gout12 * dm[(i0+0)*nao+(k0+1)]; + val += gout21 * dm[(i0+0)*nao+(k0+2)]; + val += gout4 * dm[(i0+1)*nao+(k0+0)]; + val += gout13 * dm[(i0+1)*nao+(k0+1)]; + val += gout22 * dm[(i0+1)*nao+(k0+2)]; + val += gout5 * dm[(i0+2)*nao+(k0+0)]; + val += gout14 * dm[(i0+2)*nao+(k0+1)]; + val += gout23 * dm[(i0+2)*nao+(k0+2)]; + atomicAdd(vk+(j0+1)*nao+(l0+0), val); + val = 0; + val += gout6 * dm[(i0+0)*nao+(k0+0)]; + val += gout15 * dm[(i0+0)*nao+(k0+1)]; + val += gout24 * dm[(i0+0)*nao+(k0+2)]; + val += gout7 * dm[(i0+1)*nao+(k0+0)]; + val += gout16 * dm[(i0+1)*nao+(k0+1)]; + val += gout25 * dm[(i0+1)*nao+(k0+2)]; + val += gout8 * dm[(i0+2)*nao+(k0+0)]; + val += gout17 * dm[(i0+2)*nao+(k0+1)]; + val += gout26 * dm[(i0+2)*nao+(k0+2)]; + atomicAdd(vk+(j0+2)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + val += gout3 * dm[(j0+1)*nao+(l0+0)]; + val += gout6 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(l0+0)]; + val += gout12 * dm[(j0+1)*nao+(l0+0)]; + val += gout15 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+1), val); + val = 0; + val += gout18 * dm[(j0+0)*nao+(l0+0)]; + val += gout21 * dm[(j0+1)*nao+(l0+0)]; + val += gout24 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+2), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + val += gout4 * dm[(j0+1)*nao+(l0+0)]; + val += gout7 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout10 * dm[(j0+0)*nao+(l0+0)]; + val += gout13 * dm[(j0+1)*nao+(l0+0)]; + val += gout16 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+1), val); + val = 0; + val += gout19 * dm[(j0+0)*nao+(l0+0)]; + val += gout22 * dm[(j0+1)*nao+(l0+0)]; + val += gout25 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+2), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + val += gout5 * dm[(j0+1)*nao+(l0+0)]; + val += gout8 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout11 * dm[(j0+0)*nao+(l0+0)]; + val += gout14 * dm[(j0+1)*nao+(l0+0)]; + val += gout17 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+1), val); + val = 0; + val += gout20 * dm[(j0+0)*nao+(l0+0)]; + val += gout23 * dm[(j0+1)*nao+(l0+0)]; + val += gout26 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+2), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + val = 0; + val += gout9 * dm[(i0+0)*nao+(l0+0)]; + val += gout10 * dm[(i0+1)*nao+(l0+0)]; + val += gout11 * dm[(i0+2)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+1), val); + val = 0; + val += gout18 * dm[(i0+0)*nao+(l0+0)]; + val += gout19 * dm[(i0+1)*nao+(l0+0)]; + val += gout20 * dm[(i0+2)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+2), val); + val = 0; + val += gout3 * dm[(i0+0)*nao+(l0+0)]; + val += gout4 * dm[(i0+1)*nao+(l0+0)]; + val += gout5 * dm[(i0+2)*nao+(l0+0)]; + atomicAdd(vk+(j0+1)*nao+(k0+0), val); + val = 0; + val += gout12 * dm[(i0+0)*nao+(l0+0)]; + val += gout13 * dm[(i0+1)*nao+(l0+0)]; + val += gout14 * dm[(i0+2)*nao+(l0+0)]; + atomicAdd(vk+(j0+1)*nao+(k0+1), val); + val = 0; + val += gout21 * dm[(i0+0)*nao+(l0+0)]; + val += gout22 * dm[(i0+1)*nao+(l0+0)]; + val += gout23 * dm[(i0+2)*nao+(l0+0)]; + atomicAdd(vk+(j0+1)*nao+(k0+2), val); + val = 0; + val += gout6 * dm[(i0+0)*nao+(l0+0)]; + val += gout7 * dm[(i0+1)*nao+(l0+0)]; + val += gout8 * dm[(i0+2)*nao+(l0+0)]; + atomicAdd(vk+(j0+2)*nao+(k0+0), val); + val = 0; + val += gout15 * dm[(i0+0)*nao+(l0+0)]; + val += gout16 * dm[(i0+1)*nao+(l0+0)]; + val += gout17 * dm[(i0+2)*nao+(l0+0)]; + atomicAdd(vk+(j0+2)*nao+(k0+1), val); + val = 0; + val += gout24 * dm[(i0+0)*nao+(l0+0)]; + val += gout25 * dm[(i0+1)*nao+(l0+0)]; + val += gout26 * dm[(i0+2)*nao+(l0+0)]; + atomicAdd(vk+(j0+2)*nao+(k0+2), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +__global__ +void rys_jk_1110(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_jk_1110(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_sr_jk_1110(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double gout3; + double gout4; + double gout5; + double gout6; + double gout7; + double gout8; + double gout9; + double gout10; + double gout11; + double gout12; + double gout13; + double gout14; + double gout15; + double gout16; + double gout17; + double gout18; + double gout19; + double gout20; + double gout21; + double gout22; + double gout23; + double gout24; + double gout25; + double gout26; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + gout3 = 0; + gout4 = 0; + gout5 = 0; + gout6 = 0; + gout7 = 0; + gout8 = 0; + gout9 = 0; + gout10 = 0; + gout11 = 0; + gout12 = 0; + gout13 = 0; + gout14 = 0; + gout15 = 0; + gout16 = 0; + gout17 = 0; + gout18 = 0; + gout19 = 0; + gout20 = 0; + gout21 = 0; + gout22 = 0; + gout23 = 0; + gout24 = 0; + gout25 = 0; + gout26 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + rys_roots(2, theta_rr, rw+4*nsq_per_block); + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(2, theta_fac*theta_rr, rw); + double sqrt_theta_fac = -sqrt(theta_fac); + for (int irys = 0; irys < 2; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + rw[sq_id+(irys*2+1)*nsq_per_block] *= sqrt_theta_fac; + } + if (task_id < ntasks) { + for (int irys = 0; irys < 4; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double b00 = .5 * rt_aa; + double rt_akl = rt_aa * aij; + double cpx = xqc + xpq*rt_akl; + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + double trr_21x = cpx * trr_20x + 2*b00 * trr_10x; + double trr_11x = cpx * trr_10x + 1*b00 * fac; + double hrr_1110x = trr_21x - xjxi * trr_11x; + gout0 += hrr_1110x * 1 * wt; + double trr_01x = cpx * fac; + double hrr_0110x = trr_11x - xjxi * trr_01x; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += hrr_0110x * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += hrr_0110x * 1 * trr_10z; + double hrr_0100y = trr_10y - yjyi * 1; + gout3 += trr_11x * hrr_0100y * wt; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + double hrr_1100y = trr_20y - yjyi * trr_10y; + gout4 += trr_01x * hrr_1100y * wt; + gout5 += trr_01x * hrr_0100y * trr_10z; + double hrr_0100z = trr_10z - zjzi * wt; + gout6 += trr_11x * 1 * hrr_0100z; + gout7 += trr_01x * trr_10y * hrr_0100z; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + double hrr_1100z = trr_20z - zjzi * trr_10z; + gout8 += trr_01x * 1 * hrr_1100z; + double hrr_1100x = trr_20x - xjxi * trr_10x; + double cpy = yqc + ypq*rt_akl; + double trr_01y = cpy * 1; + gout9 += hrr_1100x * trr_01y * wt; + double hrr_0100x = trr_10x - xjxi * fac; + double trr_11y = cpy * trr_10y + 1*b00 * 1; + gout10 += hrr_0100x * trr_11y * wt; + gout11 += hrr_0100x * trr_01y * trr_10z; + double hrr_0110y = trr_11y - yjyi * trr_01y; + gout12 += trr_10x * hrr_0110y * wt; + double trr_21y = cpy * trr_20y + 2*b00 * trr_10y; + double hrr_1110y = trr_21y - yjyi * trr_11y; + gout13 += fac * hrr_1110y * wt; + gout14 += fac * hrr_0110y * trr_10z; + gout15 += trr_10x * trr_01y * hrr_0100z; + gout16 += fac * trr_11y * hrr_0100z; + gout17 += fac * trr_01y * hrr_1100z; + double cpz = zqc + zpq*rt_akl; + double trr_01z = cpz * wt; + gout18 += hrr_1100x * 1 * trr_01z; + gout19 += hrr_0100x * trr_10y * trr_01z; + double trr_11z = cpz * trr_10z + 1*b00 * wt; + gout20 += hrr_0100x * 1 * trr_11z; + gout21 += trr_10x * hrr_0100y * trr_01z; + gout22 += fac * hrr_1100y * trr_01z; + gout23 += fac * hrr_0100y * trr_11z; + double hrr_0110z = trr_11z - zjzi * trr_01z; + gout24 += trr_10x * 1 * hrr_0110z; + gout25 += fac * trr_10y * hrr_0110z; + double trr_21z = cpz * trr_20z + 2*b00 * trr_10z; + double hrr_1110z = trr_21z - zjzi * trr_11z; + gout26 += fac * 1 * hrr_1110z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + val += gout9 * dm[(l0+0)*nao+(k0+1)]; + val += gout18 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout3 * dm[(l0+0)*nao+(k0+0)]; + val += gout12 * dm[(l0+0)*nao+(k0+1)]; + val += gout21 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+0)*nao+(j0+1), val); + val = 0; + val += gout6 * dm[(l0+0)*nao+(k0+0)]; + val += gout15 * dm[(l0+0)*nao+(k0+1)]; + val += gout24 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+0)*nao+(j0+2), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + val += gout10 * dm[(l0+0)*nao+(k0+1)]; + val += gout19 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout4 * dm[(l0+0)*nao+(k0+0)]; + val += gout13 * dm[(l0+0)*nao+(k0+1)]; + val += gout22 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+1)*nao+(j0+1), val); + val = 0; + val += gout7 * dm[(l0+0)*nao+(k0+0)]; + val += gout16 * dm[(l0+0)*nao+(k0+1)]; + val += gout25 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+1)*nao+(j0+2), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + val += gout11 * dm[(l0+0)*nao+(k0+1)]; + val += gout20 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout5 * dm[(l0+0)*nao+(k0+0)]; + val += gout14 * dm[(l0+0)*nao+(k0+1)]; + val += gout23 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+2)*nao+(j0+1), val); + val = 0; + val += gout8 * dm[(l0+0)*nao+(k0+0)]; + val += gout17 * dm[(l0+0)*nao+(k0+1)]; + val += gout26 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+2)*nao+(j0+2), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + val += gout3 * dm[(j0+1)*nao+(i0+0)]; + val += gout4 * dm[(j0+1)*nao+(i0+1)]; + val += gout5 * dm[(j0+1)*nao+(i0+2)]; + val += gout6 * dm[(j0+2)*nao+(i0+0)]; + val += gout7 * dm[(j0+2)*nao+(i0+1)]; + val += gout8 * dm[(j0+2)*nao+(i0+2)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(i0+0)]; + val += gout10 * dm[(j0+0)*nao+(i0+1)]; + val += gout11 * dm[(j0+0)*nao+(i0+2)]; + val += gout12 * dm[(j0+1)*nao+(i0+0)]; + val += gout13 * dm[(j0+1)*nao+(i0+1)]; + val += gout14 * dm[(j0+1)*nao+(i0+2)]; + val += gout15 * dm[(j0+2)*nao+(i0+0)]; + val += gout16 * dm[(j0+2)*nao+(i0+1)]; + val += gout17 * dm[(j0+2)*nao+(i0+2)]; + atomicAdd(vj+(k0+1)*nao+(l0+0), val); + val = 0; + val += gout18 * dm[(j0+0)*nao+(i0+0)]; + val += gout19 * dm[(j0+0)*nao+(i0+1)]; + val += gout20 * dm[(j0+0)*nao+(i0+2)]; + val += gout21 * dm[(j0+1)*nao+(i0+0)]; + val += gout22 * dm[(j0+1)*nao+(i0+1)]; + val += gout23 * dm[(j0+1)*nao+(i0+2)]; + val += gout24 * dm[(j0+2)*nao+(i0+0)]; + val += gout25 * dm[(j0+2)*nao+(i0+1)]; + val += gout26 * dm[(j0+2)*nao+(i0+2)]; + atomicAdd(vj+(k0+2)*nao+(l0+0), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + val += gout9 * dm[(j0+0)*nao+(k0+1)]; + val += gout18 * dm[(j0+0)*nao+(k0+2)]; + val += gout3 * dm[(j0+1)*nao+(k0+0)]; + val += gout12 * dm[(j0+1)*nao+(k0+1)]; + val += gout21 * dm[(j0+1)*nao+(k0+2)]; + val += gout6 * dm[(j0+2)*nao+(k0+0)]; + val += gout15 * dm[(j0+2)*nao+(k0+1)]; + val += gout24 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + val += gout10 * dm[(j0+0)*nao+(k0+1)]; + val += gout19 * dm[(j0+0)*nao+(k0+2)]; + val += gout4 * dm[(j0+1)*nao+(k0+0)]; + val += gout13 * dm[(j0+1)*nao+(k0+1)]; + val += gout22 * dm[(j0+1)*nao+(k0+2)]; + val += gout7 * dm[(j0+2)*nao+(k0+0)]; + val += gout16 * dm[(j0+2)*nao+(k0+1)]; + val += gout25 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + val += gout11 * dm[(j0+0)*nao+(k0+1)]; + val += gout20 * dm[(j0+0)*nao+(k0+2)]; + val += gout5 * dm[(j0+1)*nao+(k0+0)]; + val += gout14 * dm[(j0+1)*nao+(k0+1)]; + val += gout23 * dm[(j0+1)*nao+(k0+2)]; + val += gout8 * dm[(j0+2)*nao+(k0+0)]; + val += gout17 * dm[(j0+2)*nao+(k0+1)]; + val += gout26 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout9 * dm[(i0+0)*nao+(k0+1)]; + val += gout18 * dm[(i0+0)*nao+(k0+2)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout10 * dm[(i0+1)*nao+(k0+1)]; + val += gout19 * dm[(i0+1)*nao+(k0+2)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + val += gout11 * dm[(i0+2)*nao+(k0+1)]; + val += gout20 * dm[(i0+2)*nao+(k0+2)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout3 * dm[(i0+0)*nao+(k0+0)]; + val += gout12 * dm[(i0+0)*nao+(k0+1)]; + val += gout21 * dm[(i0+0)*nao+(k0+2)]; + val += gout4 * dm[(i0+1)*nao+(k0+0)]; + val += gout13 * dm[(i0+1)*nao+(k0+1)]; + val += gout22 * dm[(i0+1)*nao+(k0+2)]; + val += gout5 * dm[(i0+2)*nao+(k0+0)]; + val += gout14 * dm[(i0+2)*nao+(k0+1)]; + val += gout23 * dm[(i0+2)*nao+(k0+2)]; + atomicAdd(vk+(j0+1)*nao+(l0+0), val); + val = 0; + val += gout6 * dm[(i0+0)*nao+(k0+0)]; + val += gout15 * dm[(i0+0)*nao+(k0+1)]; + val += gout24 * dm[(i0+0)*nao+(k0+2)]; + val += gout7 * dm[(i0+1)*nao+(k0+0)]; + val += gout16 * dm[(i0+1)*nao+(k0+1)]; + val += gout25 * dm[(i0+1)*nao+(k0+2)]; + val += gout8 * dm[(i0+2)*nao+(k0+0)]; + val += gout17 * dm[(i0+2)*nao+(k0+1)]; + val += gout26 * dm[(i0+2)*nao+(k0+2)]; + atomicAdd(vk+(j0+2)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + val += gout3 * dm[(j0+1)*nao+(l0+0)]; + val += gout6 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(l0+0)]; + val += gout12 * dm[(j0+1)*nao+(l0+0)]; + val += gout15 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+1), val); + val = 0; + val += gout18 * dm[(j0+0)*nao+(l0+0)]; + val += gout21 * dm[(j0+1)*nao+(l0+0)]; + val += gout24 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+2), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + val += gout4 * dm[(j0+1)*nao+(l0+0)]; + val += gout7 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout10 * dm[(j0+0)*nao+(l0+0)]; + val += gout13 * dm[(j0+1)*nao+(l0+0)]; + val += gout16 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+1), val); + val = 0; + val += gout19 * dm[(j0+0)*nao+(l0+0)]; + val += gout22 * dm[(j0+1)*nao+(l0+0)]; + val += gout25 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+2), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + val += gout5 * dm[(j0+1)*nao+(l0+0)]; + val += gout8 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout11 * dm[(j0+0)*nao+(l0+0)]; + val += gout14 * dm[(j0+1)*nao+(l0+0)]; + val += gout17 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+1), val); + val = 0; + val += gout20 * dm[(j0+0)*nao+(l0+0)]; + val += gout23 * dm[(j0+1)*nao+(l0+0)]; + val += gout26 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+2), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + val = 0; + val += gout9 * dm[(i0+0)*nao+(l0+0)]; + val += gout10 * dm[(i0+1)*nao+(l0+0)]; + val += gout11 * dm[(i0+2)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+1), val); + val = 0; + val += gout18 * dm[(i0+0)*nao+(l0+0)]; + val += gout19 * dm[(i0+1)*nao+(l0+0)]; + val += gout20 * dm[(i0+2)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+2), val); + val = 0; + val += gout3 * dm[(i0+0)*nao+(l0+0)]; + val += gout4 * dm[(i0+1)*nao+(l0+0)]; + val += gout5 * dm[(i0+2)*nao+(l0+0)]; + atomicAdd(vk+(j0+1)*nao+(k0+0), val); + val = 0; + val += gout12 * dm[(i0+0)*nao+(l0+0)]; + val += gout13 * dm[(i0+1)*nao+(l0+0)]; + val += gout14 * dm[(i0+2)*nao+(l0+0)]; + atomicAdd(vk+(j0+1)*nao+(k0+1), val); + val = 0; + val += gout21 * dm[(i0+0)*nao+(l0+0)]; + val += gout22 * dm[(i0+1)*nao+(l0+0)]; + val += gout23 * dm[(i0+2)*nao+(l0+0)]; + atomicAdd(vk+(j0+1)*nao+(k0+2), val); + val = 0; + val += gout6 * dm[(i0+0)*nao+(l0+0)]; + val += gout7 * dm[(i0+1)*nao+(l0+0)]; + val += gout8 * dm[(i0+2)*nao+(l0+0)]; + atomicAdd(vk+(j0+2)*nao+(k0+0), val); + val = 0; + val += gout15 * dm[(i0+0)*nao+(l0+0)]; + val += gout16 * dm[(i0+1)*nao+(l0+0)]; + val += gout17 * dm[(i0+2)*nao+(l0+0)]; + atomicAdd(vk+(j0+2)*nao+(k0+1), val); + val = 0; + val += gout24 * dm[(i0+0)*nao+(l0+0)]; + val += gout25 * dm[(i0+1)*nao+(l0+0)]; + val += gout26 * dm[(i0+2)*nao+(l0+0)]; + atomicAdd(vk+(j0+2)*nao+(k0+2), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +__global__ +void rys_sr_jk_1110(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_sr_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_sr_jk_1110(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_jk_1111(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double gout3; + double gout4; + double gout5; + double gout6; + double gout7; + double gout8; + double gout9; + double gout10; + double gout11; + double gout12; + double gout13; + double gout14; + double gout15; + double gout16; + double gout17; + double gout18; + double gout19; + double gout20; + double gout21; + double gout22; + double gout23; + double gout24; + double gout25; + double gout26; + double gout27; + double gout28; + double gout29; + double gout30; + double gout31; + double gout32; + double gout33; + double gout34; + double gout35; + double gout36; + double gout37; + double gout38; + double gout39; + double gout40; + double gout41; + double gout42; + double gout43; + double gout44; + double gout45; + double gout46; + double gout47; + double gout48; + double gout49; + double gout50; + double gout51; + double gout52; + double gout53; + double gout54; + double gout55; + double gout56; + double gout57; + double gout58; + double gout59; + double gout60; + double gout61; + double gout62; + double gout63; + double gout64; + double gout65; + double gout66; + double gout67; + double gout68; + double gout69; + double gout70; + double gout71; + double gout72; + double gout73; + double gout74; + double gout75; + double gout76; + double gout77; + double gout78; + double gout79; + double gout80; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + gout3 = 0; + gout4 = 0; + gout5 = 0; + gout6 = 0; + gout7 = 0; + gout8 = 0; + gout9 = 0; + gout10 = 0; + gout11 = 0; + gout12 = 0; + gout13 = 0; + gout14 = 0; + gout15 = 0; + gout16 = 0; + gout17 = 0; + gout18 = 0; + gout19 = 0; + gout20 = 0; + gout21 = 0; + gout22 = 0; + gout23 = 0; + gout24 = 0; + gout25 = 0; + gout26 = 0; + gout27 = 0; + gout28 = 0; + gout29 = 0; + gout30 = 0; + gout31 = 0; + gout32 = 0; + gout33 = 0; + gout34 = 0; + gout35 = 0; + gout36 = 0; + gout37 = 0; + gout38 = 0; + gout39 = 0; + gout40 = 0; + gout41 = 0; + gout42 = 0; + gout43 = 0; + gout44 = 0; + gout45 = 0; + gout46 = 0; + gout47 = 0; + gout48 = 0; + gout49 = 0; + gout50 = 0; + gout51 = 0; + gout52 = 0; + gout53 = 0; + gout54 = 0; + gout55 = 0; + gout56 = 0; + gout57 = 0; + gout58 = 0; + gout59 = 0; + gout60 = 0; + gout61 = 0; + gout62 = 0; + gout63 = 0; + gout64 = 0; + gout65 = 0; + gout66 = 0; + gout67 = 0; + gout68 = 0; + gout69 = 0; + gout70 = 0; + gout71 = 0; + gout72 = 0; + gout73 = 0; + gout74 = 0; + gout75 = 0; + gout76 = 0; + gout77 = 0; + gout78 = 0; + gout79 = 0; + gout80 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(3, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(3, theta_fac*theta_rr, rw); + fac *= sqrt(theta_fac); + for (int irys = 0; irys < 3; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + } + } + if (task_id < ntasks) { + for (int irys = 0; irys < 3; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double b00 = .5 * rt_aa; + double rt_akl = rt_aa * aij; + double b01 = .5/akl * (1 - rt_akl); + double cpx = xqc + xpq*rt_akl; + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + double trr_21x = cpx * trr_20x + 2*b00 * trr_10x; + double trr_11x = cpx * trr_10x + 1*b00 * fac; + double trr_22x = cpx * trr_21x + 1*b01 * trr_20x + 2*b00 * trr_11x; + double hrr_2011x = trr_22x - xlxk * trr_21x; + double trr_01x = cpx * fac; + double trr_12x = cpx * trr_11x + 1*b01 * trr_10x + 1*b00 * trr_01x; + double hrr_1011x = trr_12x - xlxk * trr_11x; + double hrr_1111x = hrr_2011x - xjxi * hrr_1011x; + gout0 += hrr_1111x * 1 * wt; + double trr_02x = cpx * trr_01x + 1*b01 * fac; + double hrr_0011x = trr_02x - xlxk * trr_01x; + double hrr_0111x = hrr_1011x - xjxi * hrr_0011x; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += hrr_0111x * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += hrr_0111x * 1 * trr_10z; + double hrr_0100y = trr_10y - yjyi * 1; + gout3 += hrr_1011x * hrr_0100y * wt; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + double hrr_1100y = trr_20y - yjyi * trr_10y; + gout4 += hrr_0011x * hrr_1100y * wt; + gout5 += hrr_0011x * hrr_0100y * trr_10z; + double hrr_0100z = trr_10z - zjzi * wt; + gout6 += hrr_1011x * 1 * hrr_0100z; + gout7 += hrr_0011x * trr_10y * hrr_0100z; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + double hrr_1100z = trr_20z - zjzi * trr_10z; + gout8 += hrr_0011x * 1 * hrr_1100z; + double hrr_2001x = trr_21x - xlxk * trr_20x; + double hrr_1001x = trr_11x - xlxk * trr_10x; + double hrr_1101x = hrr_2001x - xjxi * hrr_1001x; + double cpy = yqc + ypq*rt_akl; + double trr_01y = cpy * 1; + gout9 += hrr_1101x * trr_01y * wt; + double hrr_0001x = trr_01x - xlxk * fac; + double hrr_0101x = hrr_1001x - xjxi * hrr_0001x; + double trr_11y = cpy * trr_10y + 1*b00 * 1; + gout10 += hrr_0101x * trr_11y * wt; + gout11 += hrr_0101x * trr_01y * trr_10z; + double hrr_0110y = trr_11y - yjyi * trr_01y; + gout12 += hrr_1001x * hrr_0110y * wt; + double trr_21y = cpy * trr_20y + 2*b00 * trr_10y; + double hrr_1110y = trr_21y - yjyi * trr_11y; + gout13 += hrr_0001x * hrr_1110y * wt; + gout14 += hrr_0001x * hrr_0110y * trr_10z; + gout15 += hrr_1001x * trr_01y * hrr_0100z; + gout16 += hrr_0001x * trr_11y * hrr_0100z; + gout17 += hrr_0001x * trr_01y * hrr_1100z; + double cpz = zqc + zpq*rt_akl; + double trr_01z = cpz * wt; + gout18 += hrr_1101x * 1 * trr_01z; + gout19 += hrr_0101x * trr_10y * trr_01z; + double trr_11z = cpz * trr_10z + 1*b00 * wt; + gout20 += hrr_0101x * 1 * trr_11z; + gout21 += hrr_1001x * hrr_0100y * trr_01z; + gout22 += hrr_0001x * hrr_1100y * trr_01z; + gout23 += hrr_0001x * hrr_0100y * trr_11z; + double hrr_0110z = trr_11z - zjzi * trr_01z; + gout24 += hrr_1001x * 1 * hrr_0110z; + gout25 += hrr_0001x * trr_10y * hrr_0110z; + double trr_21z = cpz * trr_20z + 2*b00 * trr_10z; + double hrr_1110z = trr_21z - zjzi * trr_11z; + gout26 += hrr_0001x * 1 * hrr_1110z; + double hrr_1110x = trr_21x - xjxi * trr_11x; + double hrr_0001y = trr_01y - ylyk * 1; + gout27 += hrr_1110x * hrr_0001y * wt; + double hrr_0110x = trr_11x - xjxi * trr_01x; + double hrr_1001y = trr_11y - ylyk * trr_10y; + gout28 += hrr_0110x * hrr_1001y * wt; + gout29 += hrr_0110x * hrr_0001y * trr_10z; + double hrr_0101y = hrr_1001y - yjyi * hrr_0001y; + gout30 += trr_11x * hrr_0101y * wt; + double hrr_2001y = trr_21y - ylyk * trr_20y; + double hrr_1101y = hrr_2001y - yjyi * hrr_1001y; + gout31 += trr_01x * hrr_1101y * wt; + gout32 += trr_01x * hrr_0101y * trr_10z; + gout33 += trr_11x * hrr_0001y * hrr_0100z; + gout34 += trr_01x * hrr_1001y * hrr_0100z; + gout35 += trr_01x * hrr_0001y * hrr_1100z; + double hrr_1100x = trr_20x - xjxi * trr_10x; + double trr_02y = cpy * trr_01y + 1*b01 * 1; + double hrr_0011y = trr_02y - ylyk * trr_01y; + gout36 += hrr_1100x * hrr_0011y * wt; + double hrr_0100x = trr_10x - xjxi * fac; + double trr_12y = cpy * trr_11y + 1*b01 * trr_10y + 1*b00 * trr_01y; + double hrr_1011y = trr_12y - ylyk * trr_11y; + gout37 += hrr_0100x * hrr_1011y * wt; + gout38 += hrr_0100x * hrr_0011y * trr_10z; + double hrr_0111y = hrr_1011y - yjyi * hrr_0011y; + gout39 += trr_10x * hrr_0111y * wt; + double trr_22y = cpy * trr_21y + 1*b01 * trr_20y + 2*b00 * trr_11y; + double hrr_2011y = trr_22y - ylyk * trr_21y; + double hrr_1111y = hrr_2011y - yjyi * hrr_1011y; + gout40 += fac * hrr_1111y * wt; + gout41 += fac * hrr_0111y * trr_10z; + gout42 += trr_10x * hrr_0011y * hrr_0100z; + gout43 += fac * hrr_1011y * hrr_0100z; + gout44 += fac * hrr_0011y * hrr_1100z; + gout45 += hrr_1100x * hrr_0001y * trr_01z; + gout46 += hrr_0100x * hrr_1001y * trr_01z; + gout47 += hrr_0100x * hrr_0001y * trr_11z; + gout48 += trr_10x * hrr_0101y * trr_01z; + gout49 += fac * hrr_1101y * trr_01z; + gout50 += fac * hrr_0101y * trr_11z; + gout51 += trr_10x * hrr_0001y * hrr_0110z; + gout52 += fac * hrr_1001y * hrr_0110z; + gout53 += fac * hrr_0001y * hrr_1110z; + double hrr_0001z = trr_01z - zlzk * wt; + gout54 += hrr_1110x * 1 * hrr_0001z; + gout55 += hrr_0110x * trr_10y * hrr_0001z; + double hrr_1001z = trr_11z - zlzk * trr_10z; + gout56 += hrr_0110x * 1 * hrr_1001z; + gout57 += trr_11x * hrr_0100y * hrr_0001z; + gout58 += trr_01x * hrr_1100y * hrr_0001z; + gout59 += trr_01x * hrr_0100y * hrr_1001z; + double hrr_0101z = hrr_1001z - zjzi * hrr_0001z; + gout60 += trr_11x * 1 * hrr_0101z; + gout61 += trr_01x * trr_10y * hrr_0101z; + double hrr_2001z = trr_21z - zlzk * trr_20z; + double hrr_1101z = hrr_2001z - zjzi * hrr_1001z; + gout62 += trr_01x * 1 * hrr_1101z; + gout63 += hrr_1100x * trr_01y * hrr_0001z; + gout64 += hrr_0100x * trr_11y * hrr_0001z; + gout65 += hrr_0100x * trr_01y * hrr_1001z; + gout66 += trr_10x * hrr_0110y * hrr_0001z; + gout67 += fac * hrr_1110y * hrr_0001z; + gout68 += fac * hrr_0110y * hrr_1001z; + gout69 += trr_10x * trr_01y * hrr_0101z; + gout70 += fac * trr_11y * hrr_0101z; + gout71 += fac * trr_01y * hrr_1101z; + double trr_02z = cpz * trr_01z + 1*b01 * wt; + double hrr_0011z = trr_02z - zlzk * trr_01z; + gout72 += hrr_1100x * 1 * hrr_0011z; + gout73 += hrr_0100x * trr_10y * hrr_0011z; + double trr_12z = cpz * trr_11z + 1*b01 * trr_10z + 1*b00 * trr_01z; + double hrr_1011z = trr_12z - zlzk * trr_11z; + gout74 += hrr_0100x * 1 * hrr_1011z; + gout75 += trr_10x * hrr_0100y * hrr_0011z; + gout76 += fac * hrr_1100y * hrr_0011z; + gout77 += fac * hrr_0100y * hrr_1011z; + double hrr_0111z = hrr_1011z - zjzi * hrr_0011z; + gout78 += trr_10x * 1 * hrr_0111z; + gout79 += fac * trr_10y * hrr_0111z; + double trr_22z = cpz * trr_21z + 1*b01 * trr_20z + 2*b00 * trr_11z; + double hrr_2011z = trr_22z - zlzk * trr_21z; + double hrr_1111z = hrr_2011z - zjzi * hrr_1011z; + gout80 += fac * 1 * hrr_1111z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + val += gout9 * dm[(l0+0)*nao+(k0+1)]; + val += gout18 * dm[(l0+0)*nao+(k0+2)]; + val += gout27 * dm[(l0+1)*nao+(k0+0)]; + val += gout36 * dm[(l0+1)*nao+(k0+1)]; + val += gout45 * dm[(l0+1)*nao+(k0+2)]; + val += gout54 * dm[(l0+2)*nao+(k0+0)]; + val += gout63 * dm[(l0+2)*nao+(k0+1)]; + val += gout72 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout3 * dm[(l0+0)*nao+(k0+0)]; + val += gout12 * dm[(l0+0)*nao+(k0+1)]; + val += gout21 * dm[(l0+0)*nao+(k0+2)]; + val += gout30 * dm[(l0+1)*nao+(k0+0)]; + val += gout39 * dm[(l0+1)*nao+(k0+1)]; + val += gout48 * dm[(l0+1)*nao+(k0+2)]; + val += gout57 * dm[(l0+2)*nao+(k0+0)]; + val += gout66 * dm[(l0+2)*nao+(k0+1)]; + val += gout75 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+0)*nao+(j0+1), val); + val = 0; + val += gout6 * dm[(l0+0)*nao+(k0+0)]; + val += gout15 * dm[(l0+0)*nao+(k0+1)]; + val += gout24 * dm[(l0+0)*nao+(k0+2)]; + val += gout33 * dm[(l0+1)*nao+(k0+0)]; + val += gout42 * dm[(l0+1)*nao+(k0+1)]; + val += gout51 * dm[(l0+1)*nao+(k0+2)]; + val += gout60 * dm[(l0+2)*nao+(k0+0)]; + val += gout69 * dm[(l0+2)*nao+(k0+1)]; + val += gout78 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+0)*nao+(j0+2), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + val += gout10 * dm[(l0+0)*nao+(k0+1)]; + val += gout19 * dm[(l0+0)*nao+(k0+2)]; + val += gout28 * dm[(l0+1)*nao+(k0+0)]; + val += gout37 * dm[(l0+1)*nao+(k0+1)]; + val += gout46 * dm[(l0+1)*nao+(k0+2)]; + val += gout55 * dm[(l0+2)*nao+(k0+0)]; + val += gout64 * dm[(l0+2)*nao+(k0+1)]; + val += gout73 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout4 * dm[(l0+0)*nao+(k0+0)]; + val += gout13 * dm[(l0+0)*nao+(k0+1)]; + val += gout22 * dm[(l0+0)*nao+(k0+2)]; + val += gout31 * dm[(l0+1)*nao+(k0+0)]; + val += gout40 * dm[(l0+1)*nao+(k0+1)]; + val += gout49 * dm[(l0+1)*nao+(k0+2)]; + val += gout58 * dm[(l0+2)*nao+(k0+0)]; + val += gout67 * dm[(l0+2)*nao+(k0+1)]; + val += gout76 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+1)*nao+(j0+1), val); + val = 0; + val += gout7 * dm[(l0+0)*nao+(k0+0)]; + val += gout16 * dm[(l0+0)*nao+(k0+1)]; + val += gout25 * dm[(l0+0)*nao+(k0+2)]; + val += gout34 * dm[(l0+1)*nao+(k0+0)]; + val += gout43 * dm[(l0+1)*nao+(k0+1)]; + val += gout52 * dm[(l0+1)*nao+(k0+2)]; + val += gout61 * dm[(l0+2)*nao+(k0+0)]; + val += gout70 * dm[(l0+2)*nao+(k0+1)]; + val += gout79 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+1)*nao+(j0+2), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + val += gout11 * dm[(l0+0)*nao+(k0+1)]; + val += gout20 * dm[(l0+0)*nao+(k0+2)]; + val += gout29 * dm[(l0+1)*nao+(k0+0)]; + val += gout38 * dm[(l0+1)*nao+(k0+1)]; + val += gout47 * dm[(l0+1)*nao+(k0+2)]; + val += gout56 * dm[(l0+2)*nao+(k0+0)]; + val += gout65 * dm[(l0+2)*nao+(k0+1)]; + val += gout74 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout5 * dm[(l0+0)*nao+(k0+0)]; + val += gout14 * dm[(l0+0)*nao+(k0+1)]; + val += gout23 * dm[(l0+0)*nao+(k0+2)]; + val += gout32 * dm[(l0+1)*nao+(k0+0)]; + val += gout41 * dm[(l0+1)*nao+(k0+1)]; + val += gout50 * dm[(l0+1)*nao+(k0+2)]; + val += gout59 * dm[(l0+2)*nao+(k0+0)]; + val += gout68 * dm[(l0+2)*nao+(k0+1)]; + val += gout77 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+2)*nao+(j0+1), val); + val = 0; + val += gout8 * dm[(l0+0)*nao+(k0+0)]; + val += gout17 * dm[(l0+0)*nao+(k0+1)]; + val += gout26 * dm[(l0+0)*nao+(k0+2)]; + val += gout35 * dm[(l0+1)*nao+(k0+0)]; + val += gout44 * dm[(l0+1)*nao+(k0+1)]; + val += gout53 * dm[(l0+1)*nao+(k0+2)]; + val += gout62 * dm[(l0+2)*nao+(k0+0)]; + val += gout71 * dm[(l0+2)*nao+(k0+1)]; + val += gout80 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+2)*nao+(j0+2), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + val += gout3 * dm[(j0+1)*nao+(i0+0)]; + val += gout4 * dm[(j0+1)*nao+(i0+1)]; + val += gout5 * dm[(j0+1)*nao+(i0+2)]; + val += gout6 * dm[(j0+2)*nao+(i0+0)]; + val += gout7 * dm[(j0+2)*nao+(i0+1)]; + val += gout8 * dm[(j0+2)*nao+(i0+2)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(i0+0)]; + val += gout10 * dm[(j0+0)*nao+(i0+1)]; + val += gout11 * dm[(j0+0)*nao+(i0+2)]; + val += gout12 * dm[(j0+1)*nao+(i0+0)]; + val += gout13 * dm[(j0+1)*nao+(i0+1)]; + val += gout14 * dm[(j0+1)*nao+(i0+2)]; + val += gout15 * dm[(j0+2)*nao+(i0+0)]; + val += gout16 * dm[(j0+2)*nao+(i0+1)]; + val += gout17 * dm[(j0+2)*nao+(i0+2)]; + atomicAdd(vj+(k0+1)*nao+(l0+0), val); + val = 0; + val += gout18 * dm[(j0+0)*nao+(i0+0)]; + val += gout19 * dm[(j0+0)*nao+(i0+1)]; + val += gout20 * dm[(j0+0)*nao+(i0+2)]; + val += gout21 * dm[(j0+1)*nao+(i0+0)]; + val += gout22 * dm[(j0+1)*nao+(i0+1)]; + val += gout23 * dm[(j0+1)*nao+(i0+2)]; + val += gout24 * dm[(j0+2)*nao+(i0+0)]; + val += gout25 * dm[(j0+2)*nao+(i0+1)]; + val += gout26 * dm[(j0+2)*nao+(i0+2)]; + atomicAdd(vj+(k0+2)*nao+(l0+0), val); + val = 0; + val += gout27 * dm[(j0+0)*nao+(i0+0)]; + val += gout28 * dm[(j0+0)*nao+(i0+1)]; + val += gout29 * dm[(j0+0)*nao+(i0+2)]; + val += gout30 * dm[(j0+1)*nao+(i0+0)]; + val += gout31 * dm[(j0+1)*nao+(i0+1)]; + val += gout32 * dm[(j0+1)*nao+(i0+2)]; + val += gout33 * dm[(j0+2)*nao+(i0+0)]; + val += gout34 * dm[(j0+2)*nao+(i0+1)]; + val += gout35 * dm[(j0+2)*nao+(i0+2)]; + atomicAdd(vj+(k0+0)*nao+(l0+1), val); + val = 0; + val += gout36 * dm[(j0+0)*nao+(i0+0)]; + val += gout37 * dm[(j0+0)*nao+(i0+1)]; + val += gout38 * dm[(j0+0)*nao+(i0+2)]; + val += gout39 * dm[(j0+1)*nao+(i0+0)]; + val += gout40 * dm[(j0+1)*nao+(i0+1)]; + val += gout41 * dm[(j0+1)*nao+(i0+2)]; + val += gout42 * dm[(j0+2)*nao+(i0+0)]; + val += gout43 * dm[(j0+2)*nao+(i0+1)]; + val += gout44 * dm[(j0+2)*nao+(i0+2)]; + atomicAdd(vj+(k0+1)*nao+(l0+1), val); + val = 0; + val += gout45 * dm[(j0+0)*nao+(i0+0)]; + val += gout46 * dm[(j0+0)*nao+(i0+1)]; + val += gout47 * dm[(j0+0)*nao+(i0+2)]; + val += gout48 * dm[(j0+1)*nao+(i0+0)]; + val += gout49 * dm[(j0+1)*nao+(i0+1)]; + val += gout50 * dm[(j0+1)*nao+(i0+2)]; + val += gout51 * dm[(j0+2)*nao+(i0+0)]; + val += gout52 * dm[(j0+2)*nao+(i0+1)]; + val += gout53 * dm[(j0+2)*nao+(i0+2)]; + atomicAdd(vj+(k0+2)*nao+(l0+1), val); + val = 0; + val += gout54 * dm[(j0+0)*nao+(i0+0)]; + val += gout55 * dm[(j0+0)*nao+(i0+1)]; + val += gout56 * dm[(j0+0)*nao+(i0+2)]; + val += gout57 * dm[(j0+1)*nao+(i0+0)]; + val += gout58 * dm[(j0+1)*nao+(i0+1)]; + val += gout59 * dm[(j0+1)*nao+(i0+2)]; + val += gout60 * dm[(j0+2)*nao+(i0+0)]; + val += gout61 * dm[(j0+2)*nao+(i0+1)]; + val += gout62 * dm[(j0+2)*nao+(i0+2)]; + atomicAdd(vj+(k0+0)*nao+(l0+2), val); + val = 0; + val += gout63 * dm[(j0+0)*nao+(i0+0)]; + val += gout64 * dm[(j0+0)*nao+(i0+1)]; + val += gout65 * dm[(j0+0)*nao+(i0+2)]; + val += gout66 * dm[(j0+1)*nao+(i0+0)]; + val += gout67 * dm[(j0+1)*nao+(i0+1)]; + val += gout68 * dm[(j0+1)*nao+(i0+2)]; + val += gout69 * dm[(j0+2)*nao+(i0+0)]; + val += gout70 * dm[(j0+2)*nao+(i0+1)]; + val += gout71 * dm[(j0+2)*nao+(i0+2)]; + atomicAdd(vj+(k0+1)*nao+(l0+2), val); + val = 0; + val += gout72 * dm[(j0+0)*nao+(i0+0)]; + val += gout73 * dm[(j0+0)*nao+(i0+1)]; + val += gout74 * dm[(j0+0)*nao+(i0+2)]; + val += gout75 * dm[(j0+1)*nao+(i0+0)]; + val += gout76 * dm[(j0+1)*nao+(i0+1)]; + val += gout77 * dm[(j0+1)*nao+(i0+2)]; + val += gout78 * dm[(j0+2)*nao+(i0+0)]; + val += gout79 * dm[(j0+2)*nao+(i0+1)]; + val += gout80 * dm[(j0+2)*nao+(i0+2)]; + atomicAdd(vj+(k0+2)*nao+(l0+2), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + val += gout9 * dm[(j0+0)*nao+(k0+1)]; + val += gout18 * dm[(j0+0)*nao+(k0+2)]; + val += gout3 * dm[(j0+1)*nao+(k0+0)]; + val += gout12 * dm[(j0+1)*nao+(k0+1)]; + val += gout21 * dm[(j0+1)*nao+(k0+2)]; + val += gout6 * dm[(j0+2)*nao+(k0+0)]; + val += gout15 * dm[(j0+2)*nao+(k0+1)]; + val += gout24 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout27 * dm[(j0+0)*nao+(k0+0)]; + val += gout36 * dm[(j0+0)*nao+(k0+1)]; + val += gout45 * dm[(j0+0)*nao+(k0+2)]; + val += gout30 * dm[(j0+1)*nao+(k0+0)]; + val += gout39 * dm[(j0+1)*nao+(k0+1)]; + val += gout48 * dm[(j0+1)*nao+(k0+2)]; + val += gout33 * dm[(j0+2)*nao+(k0+0)]; + val += gout42 * dm[(j0+2)*nao+(k0+1)]; + val += gout51 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+0)*nao+(l0+1), val); + val = 0; + val += gout54 * dm[(j0+0)*nao+(k0+0)]; + val += gout63 * dm[(j0+0)*nao+(k0+1)]; + val += gout72 * dm[(j0+0)*nao+(k0+2)]; + val += gout57 * dm[(j0+1)*nao+(k0+0)]; + val += gout66 * dm[(j0+1)*nao+(k0+1)]; + val += gout75 * dm[(j0+1)*nao+(k0+2)]; + val += gout60 * dm[(j0+2)*nao+(k0+0)]; + val += gout69 * dm[(j0+2)*nao+(k0+1)]; + val += gout78 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+0)*nao+(l0+2), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + val += gout10 * dm[(j0+0)*nao+(k0+1)]; + val += gout19 * dm[(j0+0)*nao+(k0+2)]; + val += gout4 * dm[(j0+1)*nao+(k0+0)]; + val += gout13 * dm[(j0+1)*nao+(k0+1)]; + val += gout22 * dm[(j0+1)*nao+(k0+2)]; + val += gout7 * dm[(j0+2)*nao+(k0+0)]; + val += gout16 * dm[(j0+2)*nao+(k0+1)]; + val += gout25 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout28 * dm[(j0+0)*nao+(k0+0)]; + val += gout37 * dm[(j0+0)*nao+(k0+1)]; + val += gout46 * dm[(j0+0)*nao+(k0+2)]; + val += gout31 * dm[(j0+1)*nao+(k0+0)]; + val += gout40 * dm[(j0+1)*nao+(k0+1)]; + val += gout49 * dm[(j0+1)*nao+(k0+2)]; + val += gout34 * dm[(j0+2)*nao+(k0+0)]; + val += gout43 * dm[(j0+2)*nao+(k0+1)]; + val += gout52 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+1)*nao+(l0+1), val); + val = 0; + val += gout55 * dm[(j0+0)*nao+(k0+0)]; + val += gout64 * dm[(j0+0)*nao+(k0+1)]; + val += gout73 * dm[(j0+0)*nao+(k0+2)]; + val += gout58 * dm[(j0+1)*nao+(k0+0)]; + val += gout67 * dm[(j0+1)*nao+(k0+1)]; + val += gout76 * dm[(j0+1)*nao+(k0+2)]; + val += gout61 * dm[(j0+2)*nao+(k0+0)]; + val += gout70 * dm[(j0+2)*nao+(k0+1)]; + val += gout79 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+1)*nao+(l0+2), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + val += gout11 * dm[(j0+0)*nao+(k0+1)]; + val += gout20 * dm[(j0+0)*nao+(k0+2)]; + val += gout5 * dm[(j0+1)*nao+(k0+0)]; + val += gout14 * dm[(j0+1)*nao+(k0+1)]; + val += gout23 * dm[(j0+1)*nao+(k0+2)]; + val += gout8 * dm[(j0+2)*nao+(k0+0)]; + val += gout17 * dm[(j0+2)*nao+(k0+1)]; + val += gout26 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout29 * dm[(j0+0)*nao+(k0+0)]; + val += gout38 * dm[(j0+0)*nao+(k0+1)]; + val += gout47 * dm[(j0+0)*nao+(k0+2)]; + val += gout32 * dm[(j0+1)*nao+(k0+0)]; + val += gout41 * dm[(j0+1)*nao+(k0+1)]; + val += gout50 * dm[(j0+1)*nao+(k0+2)]; + val += gout35 * dm[(j0+2)*nao+(k0+0)]; + val += gout44 * dm[(j0+2)*nao+(k0+1)]; + val += gout53 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+2)*nao+(l0+1), val); + val = 0; + val += gout56 * dm[(j0+0)*nao+(k0+0)]; + val += gout65 * dm[(j0+0)*nao+(k0+1)]; + val += gout74 * dm[(j0+0)*nao+(k0+2)]; + val += gout59 * dm[(j0+1)*nao+(k0+0)]; + val += gout68 * dm[(j0+1)*nao+(k0+1)]; + val += gout77 * dm[(j0+1)*nao+(k0+2)]; + val += gout62 * dm[(j0+2)*nao+(k0+0)]; + val += gout71 * dm[(j0+2)*nao+(k0+1)]; + val += gout80 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+2)*nao+(l0+2), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout9 * dm[(i0+0)*nao+(k0+1)]; + val += gout18 * dm[(i0+0)*nao+(k0+2)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout10 * dm[(i0+1)*nao+(k0+1)]; + val += gout19 * dm[(i0+1)*nao+(k0+2)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + val += gout11 * dm[(i0+2)*nao+(k0+1)]; + val += gout20 * dm[(i0+2)*nao+(k0+2)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout27 * dm[(i0+0)*nao+(k0+0)]; + val += gout36 * dm[(i0+0)*nao+(k0+1)]; + val += gout45 * dm[(i0+0)*nao+(k0+2)]; + val += gout28 * dm[(i0+1)*nao+(k0+0)]; + val += gout37 * dm[(i0+1)*nao+(k0+1)]; + val += gout46 * dm[(i0+1)*nao+(k0+2)]; + val += gout29 * dm[(i0+2)*nao+(k0+0)]; + val += gout38 * dm[(i0+2)*nao+(k0+1)]; + val += gout47 * dm[(i0+2)*nao+(k0+2)]; + atomicAdd(vk+(j0+0)*nao+(l0+1), val); + val = 0; + val += gout54 * dm[(i0+0)*nao+(k0+0)]; + val += gout63 * dm[(i0+0)*nao+(k0+1)]; + val += gout72 * dm[(i0+0)*nao+(k0+2)]; + val += gout55 * dm[(i0+1)*nao+(k0+0)]; + val += gout64 * dm[(i0+1)*nao+(k0+1)]; + val += gout73 * dm[(i0+1)*nao+(k0+2)]; + val += gout56 * dm[(i0+2)*nao+(k0+0)]; + val += gout65 * dm[(i0+2)*nao+(k0+1)]; + val += gout74 * dm[(i0+2)*nao+(k0+2)]; + atomicAdd(vk+(j0+0)*nao+(l0+2), val); + val = 0; + val += gout3 * dm[(i0+0)*nao+(k0+0)]; + val += gout12 * dm[(i0+0)*nao+(k0+1)]; + val += gout21 * dm[(i0+0)*nao+(k0+2)]; + val += gout4 * dm[(i0+1)*nao+(k0+0)]; + val += gout13 * dm[(i0+1)*nao+(k0+1)]; + val += gout22 * dm[(i0+1)*nao+(k0+2)]; + val += gout5 * dm[(i0+2)*nao+(k0+0)]; + val += gout14 * dm[(i0+2)*nao+(k0+1)]; + val += gout23 * dm[(i0+2)*nao+(k0+2)]; + atomicAdd(vk+(j0+1)*nao+(l0+0), val); + val = 0; + val += gout30 * dm[(i0+0)*nao+(k0+0)]; + val += gout39 * dm[(i0+0)*nao+(k0+1)]; + val += gout48 * dm[(i0+0)*nao+(k0+2)]; + val += gout31 * dm[(i0+1)*nao+(k0+0)]; + val += gout40 * dm[(i0+1)*nao+(k0+1)]; + val += gout49 * dm[(i0+1)*nao+(k0+2)]; + val += gout32 * dm[(i0+2)*nao+(k0+0)]; + val += gout41 * dm[(i0+2)*nao+(k0+1)]; + val += gout50 * dm[(i0+2)*nao+(k0+2)]; + atomicAdd(vk+(j0+1)*nao+(l0+1), val); + val = 0; + val += gout57 * dm[(i0+0)*nao+(k0+0)]; + val += gout66 * dm[(i0+0)*nao+(k0+1)]; + val += gout75 * dm[(i0+0)*nao+(k0+2)]; + val += gout58 * dm[(i0+1)*nao+(k0+0)]; + val += gout67 * dm[(i0+1)*nao+(k0+1)]; + val += gout76 * dm[(i0+1)*nao+(k0+2)]; + val += gout59 * dm[(i0+2)*nao+(k0+0)]; + val += gout68 * dm[(i0+2)*nao+(k0+1)]; + val += gout77 * dm[(i0+2)*nao+(k0+2)]; + atomicAdd(vk+(j0+1)*nao+(l0+2), val); + val = 0; + val += gout6 * dm[(i0+0)*nao+(k0+0)]; + val += gout15 * dm[(i0+0)*nao+(k0+1)]; + val += gout24 * dm[(i0+0)*nao+(k0+2)]; + val += gout7 * dm[(i0+1)*nao+(k0+0)]; + val += gout16 * dm[(i0+1)*nao+(k0+1)]; + val += gout25 * dm[(i0+1)*nao+(k0+2)]; + val += gout8 * dm[(i0+2)*nao+(k0+0)]; + val += gout17 * dm[(i0+2)*nao+(k0+1)]; + val += gout26 * dm[(i0+2)*nao+(k0+2)]; + atomicAdd(vk+(j0+2)*nao+(l0+0), val); + val = 0; + val += gout33 * dm[(i0+0)*nao+(k0+0)]; + val += gout42 * dm[(i0+0)*nao+(k0+1)]; + val += gout51 * dm[(i0+0)*nao+(k0+2)]; + val += gout34 * dm[(i0+1)*nao+(k0+0)]; + val += gout43 * dm[(i0+1)*nao+(k0+1)]; + val += gout52 * dm[(i0+1)*nao+(k0+2)]; + val += gout35 * dm[(i0+2)*nao+(k0+0)]; + val += gout44 * dm[(i0+2)*nao+(k0+1)]; + val += gout53 * dm[(i0+2)*nao+(k0+2)]; + atomicAdd(vk+(j0+2)*nao+(l0+1), val); + val = 0; + val += gout60 * dm[(i0+0)*nao+(k0+0)]; + val += gout69 * dm[(i0+0)*nao+(k0+1)]; + val += gout78 * dm[(i0+0)*nao+(k0+2)]; + val += gout61 * dm[(i0+1)*nao+(k0+0)]; + val += gout70 * dm[(i0+1)*nao+(k0+1)]; + val += gout79 * dm[(i0+1)*nao+(k0+2)]; + val += gout62 * dm[(i0+2)*nao+(k0+0)]; + val += gout71 * dm[(i0+2)*nao+(k0+1)]; + val += gout80 * dm[(i0+2)*nao+(k0+2)]; + atomicAdd(vk+(j0+2)*nao+(l0+2), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + val += gout27 * dm[(j0+0)*nao+(l0+1)]; + val += gout54 * dm[(j0+0)*nao+(l0+2)]; + val += gout3 * dm[(j0+1)*nao+(l0+0)]; + val += gout30 * dm[(j0+1)*nao+(l0+1)]; + val += gout57 * dm[(j0+1)*nao+(l0+2)]; + val += gout6 * dm[(j0+2)*nao+(l0+0)]; + val += gout33 * dm[(j0+2)*nao+(l0+1)]; + val += gout60 * dm[(j0+2)*nao+(l0+2)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(l0+0)]; + val += gout36 * dm[(j0+0)*nao+(l0+1)]; + val += gout63 * dm[(j0+0)*nao+(l0+2)]; + val += gout12 * dm[(j0+1)*nao+(l0+0)]; + val += gout39 * dm[(j0+1)*nao+(l0+1)]; + val += gout66 * dm[(j0+1)*nao+(l0+2)]; + val += gout15 * dm[(j0+2)*nao+(l0+0)]; + val += gout42 * dm[(j0+2)*nao+(l0+1)]; + val += gout69 * dm[(j0+2)*nao+(l0+2)]; + atomicAdd(vk+(i0+0)*nao+(k0+1), val); + val = 0; + val += gout18 * dm[(j0+0)*nao+(l0+0)]; + val += gout45 * dm[(j0+0)*nao+(l0+1)]; + val += gout72 * dm[(j0+0)*nao+(l0+2)]; + val += gout21 * dm[(j0+1)*nao+(l0+0)]; + val += gout48 * dm[(j0+1)*nao+(l0+1)]; + val += gout75 * dm[(j0+1)*nao+(l0+2)]; + val += gout24 * dm[(j0+2)*nao+(l0+0)]; + val += gout51 * dm[(j0+2)*nao+(l0+1)]; + val += gout78 * dm[(j0+2)*nao+(l0+2)]; + atomicAdd(vk+(i0+0)*nao+(k0+2), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + val += gout28 * dm[(j0+0)*nao+(l0+1)]; + val += gout55 * dm[(j0+0)*nao+(l0+2)]; + val += gout4 * dm[(j0+1)*nao+(l0+0)]; + val += gout31 * dm[(j0+1)*nao+(l0+1)]; + val += gout58 * dm[(j0+1)*nao+(l0+2)]; + val += gout7 * dm[(j0+2)*nao+(l0+0)]; + val += gout34 * dm[(j0+2)*nao+(l0+1)]; + val += gout61 * dm[(j0+2)*nao+(l0+2)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout10 * dm[(j0+0)*nao+(l0+0)]; + val += gout37 * dm[(j0+0)*nao+(l0+1)]; + val += gout64 * dm[(j0+0)*nao+(l0+2)]; + val += gout13 * dm[(j0+1)*nao+(l0+0)]; + val += gout40 * dm[(j0+1)*nao+(l0+1)]; + val += gout67 * dm[(j0+1)*nao+(l0+2)]; + val += gout16 * dm[(j0+2)*nao+(l0+0)]; + val += gout43 * dm[(j0+2)*nao+(l0+1)]; + val += gout70 * dm[(j0+2)*nao+(l0+2)]; + atomicAdd(vk+(i0+1)*nao+(k0+1), val); + val = 0; + val += gout19 * dm[(j0+0)*nao+(l0+0)]; + val += gout46 * dm[(j0+0)*nao+(l0+1)]; + val += gout73 * dm[(j0+0)*nao+(l0+2)]; + val += gout22 * dm[(j0+1)*nao+(l0+0)]; + val += gout49 * dm[(j0+1)*nao+(l0+1)]; + val += gout76 * dm[(j0+1)*nao+(l0+2)]; + val += gout25 * dm[(j0+2)*nao+(l0+0)]; + val += gout52 * dm[(j0+2)*nao+(l0+1)]; + val += gout79 * dm[(j0+2)*nao+(l0+2)]; + atomicAdd(vk+(i0+1)*nao+(k0+2), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + val += gout29 * dm[(j0+0)*nao+(l0+1)]; + val += gout56 * dm[(j0+0)*nao+(l0+2)]; + val += gout5 * dm[(j0+1)*nao+(l0+0)]; + val += gout32 * dm[(j0+1)*nao+(l0+1)]; + val += gout59 * dm[(j0+1)*nao+(l0+2)]; + val += gout8 * dm[(j0+2)*nao+(l0+0)]; + val += gout35 * dm[(j0+2)*nao+(l0+1)]; + val += gout62 * dm[(j0+2)*nao+(l0+2)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout11 * dm[(j0+0)*nao+(l0+0)]; + val += gout38 * dm[(j0+0)*nao+(l0+1)]; + val += gout65 * dm[(j0+0)*nao+(l0+2)]; + val += gout14 * dm[(j0+1)*nao+(l0+0)]; + val += gout41 * dm[(j0+1)*nao+(l0+1)]; + val += gout68 * dm[(j0+1)*nao+(l0+2)]; + val += gout17 * dm[(j0+2)*nao+(l0+0)]; + val += gout44 * dm[(j0+2)*nao+(l0+1)]; + val += gout71 * dm[(j0+2)*nao+(l0+2)]; + atomicAdd(vk+(i0+2)*nao+(k0+1), val); + val = 0; + val += gout20 * dm[(j0+0)*nao+(l0+0)]; + val += gout47 * dm[(j0+0)*nao+(l0+1)]; + val += gout74 * dm[(j0+0)*nao+(l0+2)]; + val += gout23 * dm[(j0+1)*nao+(l0+0)]; + val += gout50 * dm[(j0+1)*nao+(l0+1)]; + val += gout77 * dm[(j0+1)*nao+(l0+2)]; + val += gout26 * dm[(j0+2)*nao+(l0+0)]; + val += gout53 * dm[(j0+2)*nao+(l0+1)]; + val += gout80 * dm[(j0+2)*nao+(l0+2)]; + atomicAdd(vk+(i0+2)*nao+(k0+2), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout27 * dm[(i0+0)*nao+(l0+1)]; + val += gout54 * dm[(i0+0)*nao+(l0+2)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout28 * dm[(i0+1)*nao+(l0+1)]; + val += gout55 * dm[(i0+1)*nao+(l0+2)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + val += gout29 * dm[(i0+2)*nao+(l0+1)]; + val += gout56 * dm[(i0+2)*nao+(l0+2)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + val = 0; + val += gout9 * dm[(i0+0)*nao+(l0+0)]; + val += gout36 * dm[(i0+0)*nao+(l0+1)]; + val += gout63 * dm[(i0+0)*nao+(l0+2)]; + val += gout10 * dm[(i0+1)*nao+(l0+0)]; + val += gout37 * dm[(i0+1)*nao+(l0+1)]; + val += gout64 * dm[(i0+1)*nao+(l0+2)]; + val += gout11 * dm[(i0+2)*nao+(l0+0)]; + val += gout38 * dm[(i0+2)*nao+(l0+1)]; + val += gout65 * dm[(i0+2)*nao+(l0+2)]; + atomicAdd(vk+(j0+0)*nao+(k0+1), val); + val = 0; + val += gout18 * dm[(i0+0)*nao+(l0+0)]; + val += gout45 * dm[(i0+0)*nao+(l0+1)]; + val += gout72 * dm[(i0+0)*nao+(l0+2)]; + val += gout19 * dm[(i0+1)*nao+(l0+0)]; + val += gout46 * dm[(i0+1)*nao+(l0+1)]; + val += gout73 * dm[(i0+1)*nao+(l0+2)]; + val += gout20 * dm[(i0+2)*nao+(l0+0)]; + val += gout47 * dm[(i0+2)*nao+(l0+1)]; + val += gout74 * dm[(i0+2)*nao+(l0+2)]; + atomicAdd(vk+(j0+0)*nao+(k0+2), val); + val = 0; + val += gout3 * dm[(i0+0)*nao+(l0+0)]; + val += gout30 * dm[(i0+0)*nao+(l0+1)]; + val += gout57 * dm[(i0+0)*nao+(l0+2)]; + val += gout4 * dm[(i0+1)*nao+(l0+0)]; + val += gout31 * dm[(i0+1)*nao+(l0+1)]; + val += gout58 * dm[(i0+1)*nao+(l0+2)]; + val += gout5 * dm[(i0+2)*nao+(l0+0)]; + val += gout32 * dm[(i0+2)*nao+(l0+1)]; + val += gout59 * dm[(i0+2)*nao+(l0+2)]; + atomicAdd(vk+(j0+1)*nao+(k0+0), val); + val = 0; + val += gout12 * dm[(i0+0)*nao+(l0+0)]; + val += gout39 * dm[(i0+0)*nao+(l0+1)]; + val += gout66 * dm[(i0+0)*nao+(l0+2)]; + val += gout13 * dm[(i0+1)*nao+(l0+0)]; + val += gout40 * dm[(i0+1)*nao+(l0+1)]; + val += gout67 * dm[(i0+1)*nao+(l0+2)]; + val += gout14 * dm[(i0+2)*nao+(l0+0)]; + val += gout41 * dm[(i0+2)*nao+(l0+1)]; + val += gout68 * dm[(i0+2)*nao+(l0+2)]; + atomicAdd(vk+(j0+1)*nao+(k0+1), val); + val = 0; + val += gout21 * dm[(i0+0)*nao+(l0+0)]; + val += gout48 * dm[(i0+0)*nao+(l0+1)]; + val += gout75 * dm[(i0+0)*nao+(l0+2)]; + val += gout22 * dm[(i0+1)*nao+(l0+0)]; + val += gout49 * dm[(i0+1)*nao+(l0+1)]; + val += gout76 * dm[(i0+1)*nao+(l0+2)]; + val += gout23 * dm[(i0+2)*nao+(l0+0)]; + val += gout50 * dm[(i0+2)*nao+(l0+1)]; + val += gout77 * dm[(i0+2)*nao+(l0+2)]; + atomicAdd(vk+(j0+1)*nao+(k0+2), val); + val = 0; + val += gout6 * dm[(i0+0)*nao+(l0+0)]; + val += gout33 * dm[(i0+0)*nao+(l0+1)]; + val += gout60 * dm[(i0+0)*nao+(l0+2)]; + val += gout7 * dm[(i0+1)*nao+(l0+0)]; + val += gout34 * dm[(i0+1)*nao+(l0+1)]; + val += gout61 * dm[(i0+1)*nao+(l0+2)]; + val += gout8 * dm[(i0+2)*nao+(l0+0)]; + val += gout35 * dm[(i0+2)*nao+(l0+1)]; + val += gout62 * dm[(i0+2)*nao+(l0+2)]; + atomicAdd(vk+(j0+2)*nao+(k0+0), val); + val = 0; + val += gout15 * dm[(i0+0)*nao+(l0+0)]; + val += gout42 * dm[(i0+0)*nao+(l0+1)]; + val += gout69 * dm[(i0+0)*nao+(l0+2)]; + val += gout16 * dm[(i0+1)*nao+(l0+0)]; + val += gout43 * dm[(i0+1)*nao+(l0+1)]; + val += gout70 * dm[(i0+1)*nao+(l0+2)]; + val += gout17 * dm[(i0+2)*nao+(l0+0)]; + val += gout44 * dm[(i0+2)*nao+(l0+1)]; + val += gout71 * dm[(i0+2)*nao+(l0+2)]; + atomicAdd(vk+(j0+2)*nao+(k0+1), val); + val = 0; + val += gout24 * dm[(i0+0)*nao+(l0+0)]; + val += gout51 * dm[(i0+0)*nao+(l0+1)]; + val += gout78 * dm[(i0+0)*nao+(l0+2)]; + val += gout25 * dm[(i0+1)*nao+(l0+0)]; + val += gout52 * dm[(i0+1)*nao+(l0+1)]; + val += gout79 * dm[(i0+1)*nao+(l0+2)]; + val += gout26 * dm[(i0+2)*nao+(l0+0)]; + val += gout53 * dm[(i0+2)*nao+(l0+1)]; + val += gout80 * dm[(i0+2)*nao+(l0+2)]; + atomicAdd(vk+(j0+2)*nao+(k0+2), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +__global__ +void rys_jk_1111(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_jk_1111(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_sr_jk_1111(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double gout3; + double gout4; + double gout5; + double gout6; + double gout7; + double gout8; + double gout9; + double gout10; + double gout11; + double gout12; + double gout13; + double gout14; + double gout15; + double gout16; + double gout17; + double gout18; + double gout19; + double gout20; + double gout21; + double gout22; + double gout23; + double gout24; + double gout25; + double gout26; + double gout27; + double gout28; + double gout29; + double gout30; + double gout31; + double gout32; + double gout33; + double gout34; + double gout35; + double gout36; + double gout37; + double gout38; + double gout39; + double gout40; + double gout41; + double gout42; + double gout43; + double gout44; + double gout45; + double gout46; + double gout47; + double gout48; + double gout49; + double gout50; + double gout51; + double gout52; + double gout53; + double gout54; + double gout55; + double gout56; + double gout57; + double gout58; + double gout59; + double gout60; + double gout61; + double gout62; + double gout63; + double gout64; + double gout65; + double gout66; + double gout67; + double gout68; + double gout69; + double gout70; + double gout71; + double gout72; + double gout73; + double gout74; + double gout75; + double gout76; + double gout77; + double gout78; + double gout79; + double gout80; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + gout3 = 0; + gout4 = 0; + gout5 = 0; + gout6 = 0; + gout7 = 0; + gout8 = 0; + gout9 = 0; + gout10 = 0; + gout11 = 0; + gout12 = 0; + gout13 = 0; + gout14 = 0; + gout15 = 0; + gout16 = 0; + gout17 = 0; + gout18 = 0; + gout19 = 0; + gout20 = 0; + gout21 = 0; + gout22 = 0; + gout23 = 0; + gout24 = 0; + gout25 = 0; + gout26 = 0; + gout27 = 0; + gout28 = 0; + gout29 = 0; + gout30 = 0; + gout31 = 0; + gout32 = 0; + gout33 = 0; + gout34 = 0; + gout35 = 0; + gout36 = 0; + gout37 = 0; + gout38 = 0; + gout39 = 0; + gout40 = 0; + gout41 = 0; + gout42 = 0; + gout43 = 0; + gout44 = 0; + gout45 = 0; + gout46 = 0; + gout47 = 0; + gout48 = 0; + gout49 = 0; + gout50 = 0; + gout51 = 0; + gout52 = 0; + gout53 = 0; + gout54 = 0; + gout55 = 0; + gout56 = 0; + gout57 = 0; + gout58 = 0; + gout59 = 0; + gout60 = 0; + gout61 = 0; + gout62 = 0; + gout63 = 0; + gout64 = 0; + gout65 = 0; + gout66 = 0; + gout67 = 0; + gout68 = 0; + gout69 = 0; + gout70 = 0; + gout71 = 0; + gout72 = 0; + gout73 = 0; + gout74 = 0; + gout75 = 0; + gout76 = 0; + gout77 = 0; + gout78 = 0; + gout79 = 0; + gout80 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + rys_roots(3, theta_rr, rw+6*nsq_per_block); + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(3, theta_fac*theta_rr, rw); + double sqrt_theta_fac = -sqrt(theta_fac); + for (int irys = 0; irys < 3; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + rw[sq_id+(irys*2+1)*nsq_per_block] *= sqrt_theta_fac; + } + if (task_id < ntasks) { + for (int irys = 0; irys < 6; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double b00 = .5 * rt_aa; + double rt_akl = rt_aa * aij; + double b01 = .5/akl * (1 - rt_akl); + double cpx = xqc + xpq*rt_akl; + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + double trr_21x = cpx * trr_20x + 2*b00 * trr_10x; + double trr_11x = cpx * trr_10x + 1*b00 * fac; + double trr_22x = cpx * trr_21x + 1*b01 * trr_20x + 2*b00 * trr_11x; + double hrr_2011x = trr_22x - xlxk * trr_21x; + double trr_01x = cpx * fac; + double trr_12x = cpx * trr_11x + 1*b01 * trr_10x + 1*b00 * trr_01x; + double hrr_1011x = trr_12x - xlxk * trr_11x; + double hrr_1111x = hrr_2011x - xjxi * hrr_1011x; + gout0 += hrr_1111x * 1 * wt; + double trr_02x = cpx * trr_01x + 1*b01 * fac; + double hrr_0011x = trr_02x - xlxk * trr_01x; + double hrr_0111x = hrr_1011x - xjxi * hrr_0011x; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += hrr_0111x * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += hrr_0111x * 1 * trr_10z; + double hrr_0100y = trr_10y - yjyi * 1; + gout3 += hrr_1011x * hrr_0100y * wt; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + double hrr_1100y = trr_20y - yjyi * trr_10y; + gout4 += hrr_0011x * hrr_1100y * wt; + gout5 += hrr_0011x * hrr_0100y * trr_10z; + double hrr_0100z = trr_10z - zjzi * wt; + gout6 += hrr_1011x * 1 * hrr_0100z; + gout7 += hrr_0011x * trr_10y * hrr_0100z; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + double hrr_1100z = trr_20z - zjzi * trr_10z; + gout8 += hrr_0011x * 1 * hrr_1100z; + double hrr_2001x = trr_21x - xlxk * trr_20x; + double hrr_1001x = trr_11x - xlxk * trr_10x; + double hrr_1101x = hrr_2001x - xjxi * hrr_1001x; + double cpy = yqc + ypq*rt_akl; + double trr_01y = cpy * 1; + gout9 += hrr_1101x * trr_01y * wt; + double hrr_0001x = trr_01x - xlxk * fac; + double hrr_0101x = hrr_1001x - xjxi * hrr_0001x; + double trr_11y = cpy * trr_10y + 1*b00 * 1; + gout10 += hrr_0101x * trr_11y * wt; + gout11 += hrr_0101x * trr_01y * trr_10z; + double hrr_0110y = trr_11y - yjyi * trr_01y; + gout12 += hrr_1001x * hrr_0110y * wt; + double trr_21y = cpy * trr_20y + 2*b00 * trr_10y; + double hrr_1110y = trr_21y - yjyi * trr_11y; + gout13 += hrr_0001x * hrr_1110y * wt; + gout14 += hrr_0001x * hrr_0110y * trr_10z; + gout15 += hrr_1001x * trr_01y * hrr_0100z; + gout16 += hrr_0001x * trr_11y * hrr_0100z; + gout17 += hrr_0001x * trr_01y * hrr_1100z; + double cpz = zqc + zpq*rt_akl; + double trr_01z = cpz * wt; + gout18 += hrr_1101x * 1 * trr_01z; + gout19 += hrr_0101x * trr_10y * trr_01z; + double trr_11z = cpz * trr_10z + 1*b00 * wt; + gout20 += hrr_0101x * 1 * trr_11z; + gout21 += hrr_1001x * hrr_0100y * trr_01z; + gout22 += hrr_0001x * hrr_1100y * trr_01z; + gout23 += hrr_0001x * hrr_0100y * trr_11z; + double hrr_0110z = trr_11z - zjzi * trr_01z; + gout24 += hrr_1001x * 1 * hrr_0110z; + gout25 += hrr_0001x * trr_10y * hrr_0110z; + double trr_21z = cpz * trr_20z + 2*b00 * trr_10z; + double hrr_1110z = trr_21z - zjzi * trr_11z; + gout26 += hrr_0001x * 1 * hrr_1110z; + double hrr_1110x = trr_21x - xjxi * trr_11x; + double hrr_0001y = trr_01y - ylyk * 1; + gout27 += hrr_1110x * hrr_0001y * wt; + double hrr_0110x = trr_11x - xjxi * trr_01x; + double hrr_1001y = trr_11y - ylyk * trr_10y; + gout28 += hrr_0110x * hrr_1001y * wt; + gout29 += hrr_0110x * hrr_0001y * trr_10z; + double hrr_0101y = hrr_1001y - yjyi * hrr_0001y; + gout30 += trr_11x * hrr_0101y * wt; + double hrr_2001y = trr_21y - ylyk * trr_20y; + double hrr_1101y = hrr_2001y - yjyi * hrr_1001y; + gout31 += trr_01x * hrr_1101y * wt; + gout32 += trr_01x * hrr_0101y * trr_10z; + gout33 += trr_11x * hrr_0001y * hrr_0100z; + gout34 += trr_01x * hrr_1001y * hrr_0100z; + gout35 += trr_01x * hrr_0001y * hrr_1100z; + double hrr_1100x = trr_20x - xjxi * trr_10x; + double trr_02y = cpy * trr_01y + 1*b01 * 1; + double hrr_0011y = trr_02y - ylyk * trr_01y; + gout36 += hrr_1100x * hrr_0011y * wt; + double hrr_0100x = trr_10x - xjxi * fac; + double trr_12y = cpy * trr_11y + 1*b01 * trr_10y + 1*b00 * trr_01y; + double hrr_1011y = trr_12y - ylyk * trr_11y; + gout37 += hrr_0100x * hrr_1011y * wt; + gout38 += hrr_0100x * hrr_0011y * trr_10z; + double hrr_0111y = hrr_1011y - yjyi * hrr_0011y; + gout39 += trr_10x * hrr_0111y * wt; + double trr_22y = cpy * trr_21y + 1*b01 * trr_20y + 2*b00 * trr_11y; + double hrr_2011y = trr_22y - ylyk * trr_21y; + double hrr_1111y = hrr_2011y - yjyi * hrr_1011y; + gout40 += fac * hrr_1111y * wt; + gout41 += fac * hrr_0111y * trr_10z; + gout42 += trr_10x * hrr_0011y * hrr_0100z; + gout43 += fac * hrr_1011y * hrr_0100z; + gout44 += fac * hrr_0011y * hrr_1100z; + gout45 += hrr_1100x * hrr_0001y * trr_01z; + gout46 += hrr_0100x * hrr_1001y * trr_01z; + gout47 += hrr_0100x * hrr_0001y * trr_11z; + gout48 += trr_10x * hrr_0101y * trr_01z; + gout49 += fac * hrr_1101y * trr_01z; + gout50 += fac * hrr_0101y * trr_11z; + gout51 += trr_10x * hrr_0001y * hrr_0110z; + gout52 += fac * hrr_1001y * hrr_0110z; + gout53 += fac * hrr_0001y * hrr_1110z; + double hrr_0001z = trr_01z - zlzk * wt; + gout54 += hrr_1110x * 1 * hrr_0001z; + gout55 += hrr_0110x * trr_10y * hrr_0001z; + double hrr_1001z = trr_11z - zlzk * trr_10z; + gout56 += hrr_0110x * 1 * hrr_1001z; + gout57 += trr_11x * hrr_0100y * hrr_0001z; + gout58 += trr_01x * hrr_1100y * hrr_0001z; + gout59 += trr_01x * hrr_0100y * hrr_1001z; + double hrr_0101z = hrr_1001z - zjzi * hrr_0001z; + gout60 += trr_11x * 1 * hrr_0101z; + gout61 += trr_01x * trr_10y * hrr_0101z; + double hrr_2001z = trr_21z - zlzk * trr_20z; + double hrr_1101z = hrr_2001z - zjzi * hrr_1001z; + gout62 += trr_01x * 1 * hrr_1101z; + gout63 += hrr_1100x * trr_01y * hrr_0001z; + gout64 += hrr_0100x * trr_11y * hrr_0001z; + gout65 += hrr_0100x * trr_01y * hrr_1001z; + gout66 += trr_10x * hrr_0110y * hrr_0001z; + gout67 += fac * hrr_1110y * hrr_0001z; + gout68 += fac * hrr_0110y * hrr_1001z; + gout69 += trr_10x * trr_01y * hrr_0101z; + gout70 += fac * trr_11y * hrr_0101z; + gout71 += fac * trr_01y * hrr_1101z; + double trr_02z = cpz * trr_01z + 1*b01 * wt; + double hrr_0011z = trr_02z - zlzk * trr_01z; + gout72 += hrr_1100x * 1 * hrr_0011z; + gout73 += hrr_0100x * trr_10y * hrr_0011z; + double trr_12z = cpz * trr_11z + 1*b01 * trr_10z + 1*b00 * trr_01z; + double hrr_1011z = trr_12z - zlzk * trr_11z; + gout74 += hrr_0100x * 1 * hrr_1011z; + gout75 += trr_10x * hrr_0100y * hrr_0011z; + gout76 += fac * hrr_1100y * hrr_0011z; + gout77 += fac * hrr_0100y * hrr_1011z; + double hrr_0111z = hrr_1011z - zjzi * hrr_0011z; + gout78 += trr_10x * 1 * hrr_0111z; + gout79 += fac * trr_10y * hrr_0111z; + double trr_22z = cpz * trr_21z + 1*b01 * trr_20z + 2*b00 * trr_11z; + double hrr_2011z = trr_22z - zlzk * trr_21z; + double hrr_1111z = hrr_2011z - zjzi * hrr_1011z; + gout80 += fac * 1 * hrr_1111z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + val += gout9 * dm[(l0+0)*nao+(k0+1)]; + val += gout18 * dm[(l0+0)*nao+(k0+2)]; + val += gout27 * dm[(l0+1)*nao+(k0+0)]; + val += gout36 * dm[(l0+1)*nao+(k0+1)]; + val += gout45 * dm[(l0+1)*nao+(k0+2)]; + val += gout54 * dm[(l0+2)*nao+(k0+0)]; + val += gout63 * dm[(l0+2)*nao+(k0+1)]; + val += gout72 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout3 * dm[(l0+0)*nao+(k0+0)]; + val += gout12 * dm[(l0+0)*nao+(k0+1)]; + val += gout21 * dm[(l0+0)*nao+(k0+2)]; + val += gout30 * dm[(l0+1)*nao+(k0+0)]; + val += gout39 * dm[(l0+1)*nao+(k0+1)]; + val += gout48 * dm[(l0+1)*nao+(k0+2)]; + val += gout57 * dm[(l0+2)*nao+(k0+0)]; + val += gout66 * dm[(l0+2)*nao+(k0+1)]; + val += gout75 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+0)*nao+(j0+1), val); + val = 0; + val += gout6 * dm[(l0+0)*nao+(k0+0)]; + val += gout15 * dm[(l0+0)*nao+(k0+1)]; + val += gout24 * dm[(l0+0)*nao+(k0+2)]; + val += gout33 * dm[(l0+1)*nao+(k0+0)]; + val += gout42 * dm[(l0+1)*nao+(k0+1)]; + val += gout51 * dm[(l0+1)*nao+(k0+2)]; + val += gout60 * dm[(l0+2)*nao+(k0+0)]; + val += gout69 * dm[(l0+2)*nao+(k0+1)]; + val += gout78 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+0)*nao+(j0+2), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + val += gout10 * dm[(l0+0)*nao+(k0+1)]; + val += gout19 * dm[(l0+0)*nao+(k0+2)]; + val += gout28 * dm[(l0+1)*nao+(k0+0)]; + val += gout37 * dm[(l0+1)*nao+(k0+1)]; + val += gout46 * dm[(l0+1)*nao+(k0+2)]; + val += gout55 * dm[(l0+2)*nao+(k0+0)]; + val += gout64 * dm[(l0+2)*nao+(k0+1)]; + val += gout73 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout4 * dm[(l0+0)*nao+(k0+0)]; + val += gout13 * dm[(l0+0)*nao+(k0+1)]; + val += gout22 * dm[(l0+0)*nao+(k0+2)]; + val += gout31 * dm[(l0+1)*nao+(k0+0)]; + val += gout40 * dm[(l0+1)*nao+(k0+1)]; + val += gout49 * dm[(l0+1)*nao+(k0+2)]; + val += gout58 * dm[(l0+2)*nao+(k0+0)]; + val += gout67 * dm[(l0+2)*nao+(k0+1)]; + val += gout76 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+1)*nao+(j0+1), val); + val = 0; + val += gout7 * dm[(l0+0)*nao+(k0+0)]; + val += gout16 * dm[(l0+0)*nao+(k0+1)]; + val += gout25 * dm[(l0+0)*nao+(k0+2)]; + val += gout34 * dm[(l0+1)*nao+(k0+0)]; + val += gout43 * dm[(l0+1)*nao+(k0+1)]; + val += gout52 * dm[(l0+1)*nao+(k0+2)]; + val += gout61 * dm[(l0+2)*nao+(k0+0)]; + val += gout70 * dm[(l0+2)*nao+(k0+1)]; + val += gout79 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+1)*nao+(j0+2), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + val += gout11 * dm[(l0+0)*nao+(k0+1)]; + val += gout20 * dm[(l0+0)*nao+(k0+2)]; + val += gout29 * dm[(l0+1)*nao+(k0+0)]; + val += gout38 * dm[(l0+1)*nao+(k0+1)]; + val += gout47 * dm[(l0+1)*nao+(k0+2)]; + val += gout56 * dm[(l0+2)*nao+(k0+0)]; + val += gout65 * dm[(l0+2)*nao+(k0+1)]; + val += gout74 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout5 * dm[(l0+0)*nao+(k0+0)]; + val += gout14 * dm[(l0+0)*nao+(k0+1)]; + val += gout23 * dm[(l0+0)*nao+(k0+2)]; + val += gout32 * dm[(l0+1)*nao+(k0+0)]; + val += gout41 * dm[(l0+1)*nao+(k0+1)]; + val += gout50 * dm[(l0+1)*nao+(k0+2)]; + val += gout59 * dm[(l0+2)*nao+(k0+0)]; + val += gout68 * dm[(l0+2)*nao+(k0+1)]; + val += gout77 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+2)*nao+(j0+1), val); + val = 0; + val += gout8 * dm[(l0+0)*nao+(k0+0)]; + val += gout17 * dm[(l0+0)*nao+(k0+1)]; + val += gout26 * dm[(l0+0)*nao+(k0+2)]; + val += gout35 * dm[(l0+1)*nao+(k0+0)]; + val += gout44 * dm[(l0+1)*nao+(k0+1)]; + val += gout53 * dm[(l0+1)*nao+(k0+2)]; + val += gout62 * dm[(l0+2)*nao+(k0+0)]; + val += gout71 * dm[(l0+2)*nao+(k0+1)]; + val += gout80 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+2)*nao+(j0+2), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + val += gout3 * dm[(j0+1)*nao+(i0+0)]; + val += gout4 * dm[(j0+1)*nao+(i0+1)]; + val += gout5 * dm[(j0+1)*nao+(i0+2)]; + val += gout6 * dm[(j0+2)*nao+(i0+0)]; + val += gout7 * dm[(j0+2)*nao+(i0+1)]; + val += gout8 * dm[(j0+2)*nao+(i0+2)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(i0+0)]; + val += gout10 * dm[(j0+0)*nao+(i0+1)]; + val += gout11 * dm[(j0+0)*nao+(i0+2)]; + val += gout12 * dm[(j0+1)*nao+(i0+0)]; + val += gout13 * dm[(j0+1)*nao+(i0+1)]; + val += gout14 * dm[(j0+1)*nao+(i0+2)]; + val += gout15 * dm[(j0+2)*nao+(i0+0)]; + val += gout16 * dm[(j0+2)*nao+(i0+1)]; + val += gout17 * dm[(j0+2)*nao+(i0+2)]; + atomicAdd(vj+(k0+1)*nao+(l0+0), val); + val = 0; + val += gout18 * dm[(j0+0)*nao+(i0+0)]; + val += gout19 * dm[(j0+0)*nao+(i0+1)]; + val += gout20 * dm[(j0+0)*nao+(i0+2)]; + val += gout21 * dm[(j0+1)*nao+(i0+0)]; + val += gout22 * dm[(j0+1)*nao+(i0+1)]; + val += gout23 * dm[(j0+1)*nao+(i0+2)]; + val += gout24 * dm[(j0+2)*nao+(i0+0)]; + val += gout25 * dm[(j0+2)*nao+(i0+1)]; + val += gout26 * dm[(j0+2)*nao+(i0+2)]; + atomicAdd(vj+(k0+2)*nao+(l0+0), val); + val = 0; + val += gout27 * dm[(j0+0)*nao+(i0+0)]; + val += gout28 * dm[(j0+0)*nao+(i0+1)]; + val += gout29 * dm[(j0+0)*nao+(i0+2)]; + val += gout30 * dm[(j0+1)*nao+(i0+0)]; + val += gout31 * dm[(j0+1)*nao+(i0+1)]; + val += gout32 * dm[(j0+1)*nao+(i0+2)]; + val += gout33 * dm[(j0+2)*nao+(i0+0)]; + val += gout34 * dm[(j0+2)*nao+(i0+1)]; + val += gout35 * dm[(j0+2)*nao+(i0+2)]; + atomicAdd(vj+(k0+0)*nao+(l0+1), val); + val = 0; + val += gout36 * dm[(j0+0)*nao+(i0+0)]; + val += gout37 * dm[(j0+0)*nao+(i0+1)]; + val += gout38 * dm[(j0+0)*nao+(i0+2)]; + val += gout39 * dm[(j0+1)*nao+(i0+0)]; + val += gout40 * dm[(j0+1)*nao+(i0+1)]; + val += gout41 * dm[(j0+1)*nao+(i0+2)]; + val += gout42 * dm[(j0+2)*nao+(i0+0)]; + val += gout43 * dm[(j0+2)*nao+(i0+1)]; + val += gout44 * dm[(j0+2)*nao+(i0+2)]; + atomicAdd(vj+(k0+1)*nao+(l0+1), val); + val = 0; + val += gout45 * dm[(j0+0)*nao+(i0+0)]; + val += gout46 * dm[(j0+0)*nao+(i0+1)]; + val += gout47 * dm[(j0+0)*nao+(i0+2)]; + val += gout48 * dm[(j0+1)*nao+(i0+0)]; + val += gout49 * dm[(j0+1)*nao+(i0+1)]; + val += gout50 * dm[(j0+1)*nao+(i0+2)]; + val += gout51 * dm[(j0+2)*nao+(i0+0)]; + val += gout52 * dm[(j0+2)*nao+(i0+1)]; + val += gout53 * dm[(j0+2)*nao+(i0+2)]; + atomicAdd(vj+(k0+2)*nao+(l0+1), val); + val = 0; + val += gout54 * dm[(j0+0)*nao+(i0+0)]; + val += gout55 * dm[(j0+0)*nao+(i0+1)]; + val += gout56 * dm[(j0+0)*nao+(i0+2)]; + val += gout57 * dm[(j0+1)*nao+(i0+0)]; + val += gout58 * dm[(j0+1)*nao+(i0+1)]; + val += gout59 * dm[(j0+1)*nao+(i0+2)]; + val += gout60 * dm[(j0+2)*nao+(i0+0)]; + val += gout61 * dm[(j0+2)*nao+(i0+1)]; + val += gout62 * dm[(j0+2)*nao+(i0+2)]; + atomicAdd(vj+(k0+0)*nao+(l0+2), val); + val = 0; + val += gout63 * dm[(j0+0)*nao+(i0+0)]; + val += gout64 * dm[(j0+0)*nao+(i0+1)]; + val += gout65 * dm[(j0+0)*nao+(i0+2)]; + val += gout66 * dm[(j0+1)*nao+(i0+0)]; + val += gout67 * dm[(j0+1)*nao+(i0+1)]; + val += gout68 * dm[(j0+1)*nao+(i0+2)]; + val += gout69 * dm[(j0+2)*nao+(i0+0)]; + val += gout70 * dm[(j0+2)*nao+(i0+1)]; + val += gout71 * dm[(j0+2)*nao+(i0+2)]; + atomicAdd(vj+(k0+1)*nao+(l0+2), val); + val = 0; + val += gout72 * dm[(j0+0)*nao+(i0+0)]; + val += gout73 * dm[(j0+0)*nao+(i0+1)]; + val += gout74 * dm[(j0+0)*nao+(i0+2)]; + val += gout75 * dm[(j0+1)*nao+(i0+0)]; + val += gout76 * dm[(j0+1)*nao+(i0+1)]; + val += gout77 * dm[(j0+1)*nao+(i0+2)]; + val += gout78 * dm[(j0+2)*nao+(i0+0)]; + val += gout79 * dm[(j0+2)*nao+(i0+1)]; + val += gout80 * dm[(j0+2)*nao+(i0+2)]; + atomicAdd(vj+(k0+2)*nao+(l0+2), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + val += gout9 * dm[(j0+0)*nao+(k0+1)]; + val += gout18 * dm[(j0+0)*nao+(k0+2)]; + val += gout3 * dm[(j0+1)*nao+(k0+0)]; + val += gout12 * dm[(j0+1)*nao+(k0+1)]; + val += gout21 * dm[(j0+1)*nao+(k0+2)]; + val += gout6 * dm[(j0+2)*nao+(k0+0)]; + val += gout15 * dm[(j0+2)*nao+(k0+1)]; + val += gout24 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout27 * dm[(j0+0)*nao+(k0+0)]; + val += gout36 * dm[(j0+0)*nao+(k0+1)]; + val += gout45 * dm[(j0+0)*nao+(k0+2)]; + val += gout30 * dm[(j0+1)*nao+(k0+0)]; + val += gout39 * dm[(j0+1)*nao+(k0+1)]; + val += gout48 * dm[(j0+1)*nao+(k0+2)]; + val += gout33 * dm[(j0+2)*nao+(k0+0)]; + val += gout42 * dm[(j0+2)*nao+(k0+1)]; + val += gout51 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+0)*nao+(l0+1), val); + val = 0; + val += gout54 * dm[(j0+0)*nao+(k0+0)]; + val += gout63 * dm[(j0+0)*nao+(k0+1)]; + val += gout72 * dm[(j0+0)*nao+(k0+2)]; + val += gout57 * dm[(j0+1)*nao+(k0+0)]; + val += gout66 * dm[(j0+1)*nao+(k0+1)]; + val += gout75 * dm[(j0+1)*nao+(k0+2)]; + val += gout60 * dm[(j0+2)*nao+(k0+0)]; + val += gout69 * dm[(j0+2)*nao+(k0+1)]; + val += gout78 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+0)*nao+(l0+2), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + val += gout10 * dm[(j0+0)*nao+(k0+1)]; + val += gout19 * dm[(j0+0)*nao+(k0+2)]; + val += gout4 * dm[(j0+1)*nao+(k0+0)]; + val += gout13 * dm[(j0+1)*nao+(k0+1)]; + val += gout22 * dm[(j0+1)*nao+(k0+2)]; + val += gout7 * dm[(j0+2)*nao+(k0+0)]; + val += gout16 * dm[(j0+2)*nao+(k0+1)]; + val += gout25 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout28 * dm[(j0+0)*nao+(k0+0)]; + val += gout37 * dm[(j0+0)*nao+(k0+1)]; + val += gout46 * dm[(j0+0)*nao+(k0+2)]; + val += gout31 * dm[(j0+1)*nao+(k0+0)]; + val += gout40 * dm[(j0+1)*nao+(k0+1)]; + val += gout49 * dm[(j0+1)*nao+(k0+2)]; + val += gout34 * dm[(j0+2)*nao+(k0+0)]; + val += gout43 * dm[(j0+2)*nao+(k0+1)]; + val += gout52 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+1)*nao+(l0+1), val); + val = 0; + val += gout55 * dm[(j0+0)*nao+(k0+0)]; + val += gout64 * dm[(j0+0)*nao+(k0+1)]; + val += gout73 * dm[(j0+0)*nao+(k0+2)]; + val += gout58 * dm[(j0+1)*nao+(k0+0)]; + val += gout67 * dm[(j0+1)*nao+(k0+1)]; + val += gout76 * dm[(j0+1)*nao+(k0+2)]; + val += gout61 * dm[(j0+2)*nao+(k0+0)]; + val += gout70 * dm[(j0+2)*nao+(k0+1)]; + val += gout79 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+1)*nao+(l0+2), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + val += gout11 * dm[(j0+0)*nao+(k0+1)]; + val += gout20 * dm[(j0+0)*nao+(k0+2)]; + val += gout5 * dm[(j0+1)*nao+(k0+0)]; + val += gout14 * dm[(j0+1)*nao+(k0+1)]; + val += gout23 * dm[(j0+1)*nao+(k0+2)]; + val += gout8 * dm[(j0+2)*nao+(k0+0)]; + val += gout17 * dm[(j0+2)*nao+(k0+1)]; + val += gout26 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout29 * dm[(j0+0)*nao+(k0+0)]; + val += gout38 * dm[(j0+0)*nao+(k0+1)]; + val += gout47 * dm[(j0+0)*nao+(k0+2)]; + val += gout32 * dm[(j0+1)*nao+(k0+0)]; + val += gout41 * dm[(j0+1)*nao+(k0+1)]; + val += gout50 * dm[(j0+1)*nao+(k0+2)]; + val += gout35 * dm[(j0+2)*nao+(k0+0)]; + val += gout44 * dm[(j0+2)*nao+(k0+1)]; + val += gout53 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+2)*nao+(l0+1), val); + val = 0; + val += gout56 * dm[(j0+0)*nao+(k0+0)]; + val += gout65 * dm[(j0+0)*nao+(k0+1)]; + val += gout74 * dm[(j0+0)*nao+(k0+2)]; + val += gout59 * dm[(j0+1)*nao+(k0+0)]; + val += gout68 * dm[(j0+1)*nao+(k0+1)]; + val += gout77 * dm[(j0+1)*nao+(k0+2)]; + val += gout62 * dm[(j0+2)*nao+(k0+0)]; + val += gout71 * dm[(j0+2)*nao+(k0+1)]; + val += gout80 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+2)*nao+(l0+2), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout9 * dm[(i0+0)*nao+(k0+1)]; + val += gout18 * dm[(i0+0)*nao+(k0+2)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout10 * dm[(i0+1)*nao+(k0+1)]; + val += gout19 * dm[(i0+1)*nao+(k0+2)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + val += gout11 * dm[(i0+2)*nao+(k0+1)]; + val += gout20 * dm[(i0+2)*nao+(k0+2)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout27 * dm[(i0+0)*nao+(k0+0)]; + val += gout36 * dm[(i0+0)*nao+(k0+1)]; + val += gout45 * dm[(i0+0)*nao+(k0+2)]; + val += gout28 * dm[(i0+1)*nao+(k0+0)]; + val += gout37 * dm[(i0+1)*nao+(k0+1)]; + val += gout46 * dm[(i0+1)*nao+(k0+2)]; + val += gout29 * dm[(i0+2)*nao+(k0+0)]; + val += gout38 * dm[(i0+2)*nao+(k0+1)]; + val += gout47 * dm[(i0+2)*nao+(k0+2)]; + atomicAdd(vk+(j0+0)*nao+(l0+1), val); + val = 0; + val += gout54 * dm[(i0+0)*nao+(k0+0)]; + val += gout63 * dm[(i0+0)*nao+(k0+1)]; + val += gout72 * dm[(i0+0)*nao+(k0+2)]; + val += gout55 * dm[(i0+1)*nao+(k0+0)]; + val += gout64 * dm[(i0+1)*nao+(k0+1)]; + val += gout73 * dm[(i0+1)*nao+(k0+2)]; + val += gout56 * dm[(i0+2)*nao+(k0+0)]; + val += gout65 * dm[(i0+2)*nao+(k0+1)]; + val += gout74 * dm[(i0+2)*nao+(k0+2)]; + atomicAdd(vk+(j0+0)*nao+(l0+2), val); + val = 0; + val += gout3 * dm[(i0+0)*nao+(k0+0)]; + val += gout12 * dm[(i0+0)*nao+(k0+1)]; + val += gout21 * dm[(i0+0)*nao+(k0+2)]; + val += gout4 * dm[(i0+1)*nao+(k0+0)]; + val += gout13 * dm[(i0+1)*nao+(k0+1)]; + val += gout22 * dm[(i0+1)*nao+(k0+2)]; + val += gout5 * dm[(i0+2)*nao+(k0+0)]; + val += gout14 * dm[(i0+2)*nao+(k0+1)]; + val += gout23 * dm[(i0+2)*nao+(k0+2)]; + atomicAdd(vk+(j0+1)*nao+(l0+0), val); + val = 0; + val += gout30 * dm[(i0+0)*nao+(k0+0)]; + val += gout39 * dm[(i0+0)*nao+(k0+1)]; + val += gout48 * dm[(i0+0)*nao+(k0+2)]; + val += gout31 * dm[(i0+1)*nao+(k0+0)]; + val += gout40 * dm[(i0+1)*nao+(k0+1)]; + val += gout49 * dm[(i0+1)*nao+(k0+2)]; + val += gout32 * dm[(i0+2)*nao+(k0+0)]; + val += gout41 * dm[(i0+2)*nao+(k0+1)]; + val += gout50 * dm[(i0+2)*nao+(k0+2)]; + atomicAdd(vk+(j0+1)*nao+(l0+1), val); + val = 0; + val += gout57 * dm[(i0+0)*nao+(k0+0)]; + val += gout66 * dm[(i0+0)*nao+(k0+1)]; + val += gout75 * dm[(i0+0)*nao+(k0+2)]; + val += gout58 * dm[(i0+1)*nao+(k0+0)]; + val += gout67 * dm[(i0+1)*nao+(k0+1)]; + val += gout76 * dm[(i0+1)*nao+(k0+2)]; + val += gout59 * dm[(i0+2)*nao+(k0+0)]; + val += gout68 * dm[(i0+2)*nao+(k0+1)]; + val += gout77 * dm[(i0+2)*nao+(k0+2)]; + atomicAdd(vk+(j0+1)*nao+(l0+2), val); + val = 0; + val += gout6 * dm[(i0+0)*nao+(k0+0)]; + val += gout15 * dm[(i0+0)*nao+(k0+1)]; + val += gout24 * dm[(i0+0)*nao+(k0+2)]; + val += gout7 * dm[(i0+1)*nao+(k0+0)]; + val += gout16 * dm[(i0+1)*nao+(k0+1)]; + val += gout25 * dm[(i0+1)*nao+(k0+2)]; + val += gout8 * dm[(i0+2)*nao+(k0+0)]; + val += gout17 * dm[(i0+2)*nao+(k0+1)]; + val += gout26 * dm[(i0+2)*nao+(k0+2)]; + atomicAdd(vk+(j0+2)*nao+(l0+0), val); + val = 0; + val += gout33 * dm[(i0+0)*nao+(k0+0)]; + val += gout42 * dm[(i0+0)*nao+(k0+1)]; + val += gout51 * dm[(i0+0)*nao+(k0+2)]; + val += gout34 * dm[(i0+1)*nao+(k0+0)]; + val += gout43 * dm[(i0+1)*nao+(k0+1)]; + val += gout52 * dm[(i0+1)*nao+(k0+2)]; + val += gout35 * dm[(i0+2)*nao+(k0+0)]; + val += gout44 * dm[(i0+2)*nao+(k0+1)]; + val += gout53 * dm[(i0+2)*nao+(k0+2)]; + atomicAdd(vk+(j0+2)*nao+(l0+1), val); + val = 0; + val += gout60 * dm[(i0+0)*nao+(k0+0)]; + val += gout69 * dm[(i0+0)*nao+(k0+1)]; + val += gout78 * dm[(i0+0)*nao+(k0+2)]; + val += gout61 * dm[(i0+1)*nao+(k0+0)]; + val += gout70 * dm[(i0+1)*nao+(k0+1)]; + val += gout79 * dm[(i0+1)*nao+(k0+2)]; + val += gout62 * dm[(i0+2)*nao+(k0+0)]; + val += gout71 * dm[(i0+2)*nao+(k0+1)]; + val += gout80 * dm[(i0+2)*nao+(k0+2)]; + atomicAdd(vk+(j0+2)*nao+(l0+2), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + val += gout27 * dm[(j0+0)*nao+(l0+1)]; + val += gout54 * dm[(j0+0)*nao+(l0+2)]; + val += gout3 * dm[(j0+1)*nao+(l0+0)]; + val += gout30 * dm[(j0+1)*nao+(l0+1)]; + val += gout57 * dm[(j0+1)*nao+(l0+2)]; + val += gout6 * dm[(j0+2)*nao+(l0+0)]; + val += gout33 * dm[(j0+2)*nao+(l0+1)]; + val += gout60 * dm[(j0+2)*nao+(l0+2)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(l0+0)]; + val += gout36 * dm[(j0+0)*nao+(l0+1)]; + val += gout63 * dm[(j0+0)*nao+(l0+2)]; + val += gout12 * dm[(j0+1)*nao+(l0+0)]; + val += gout39 * dm[(j0+1)*nao+(l0+1)]; + val += gout66 * dm[(j0+1)*nao+(l0+2)]; + val += gout15 * dm[(j0+2)*nao+(l0+0)]; + val += gout42 * dm[(j0+2)*nao+(l0+1)]; + val += gout69 * dm[(j0+2)*nao+(l0+2)]; + atomicAdd(vk+(i0+0)*nao+(k0+1), val); + val = 0; + val += gout18 * dm[(j0+0)*nao+(l0+0)]; + val += gout45 * dm[(j0+0)*nao+(l0+1)]; + val += gout72 * dm[(j0+0)*nao+(l0+2)]; + val += gout21 * dm[(j0+1)*nao+(l0+0)]; + val += gout48 * dm[(j0+1)*nao+(l0+1)]; + val += gout75 * dm[(j0+1)*nao+(l0+2)]; + val += gout24 * dm[(j0+2)*nao+(l0+0)]; + val += gout51 * dm[(j0+2)*nao+(l0+1)]; + val += gout78 * dm[(j0+2)*nao+(l0+2)]; + atomicAdd(vk+(i0+0)*nao+(k0+2), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + val += gout28 * dm[(j0+0)*nao+(l0+1)]; + val += gout55 * dm[(j0+0)*nao+(l0+2)]; + val += gout4 * dm[(j0+1)*nao+(l0+0)]; + val += gout31 * dm[(j0+1)*nao+(l0+1)]; + val += gout58 * dm[(j0+1)*nao+(l0+2)]; + val += gout7 * dm[(j0+2)*nao+(l0+0)]; + val += gout34 * dm[(j0+2)*nao+(l0+1)]; + val += gout61 * dm[(j0+2)*nao+(l0+2)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout10 * dm[(j0+0)*nao+(l0+0)]; + val += gout37 * dm[(j0+0)*nao+(l0+1)]; + val += gout64 * dm[(j0+0)*nao+(l0+2)]; + val += gout13 * dm[(j0+1)*nao+(l0+0)]; + val += gout40 * dm[(j0+1)*nao+(l0+1)]; + val += gout67 * dm[(j0+1)*nao+(l0+2)]; + val += gout16 * dm[(j0+2)*nao+(l0+0)]; + val += gout43 * dm[(j0+2)*nao+(l0+1)]; + val += gout70 * dm[(j0+2)*nao+(l0+2)]; + atomicAdd(vk+(i0+1)*nao+(k0+1), val); + val = 0; + val += gout19 * dm[(j0+0)*nao+(l0+0)]; + val += gout46 * dm[(j0+0)*nao+(l0+1)]; + val += gout73 * dm[(j0+0)*nao+(l0+2)]; + val += gout22 * dm[(j0+1)*nao+(l0+0)]; + val += gout49 * dm[(j0+1)*nao+(l0+1)]; + val += gout76 * dm[(j0+1)*nao+(l0+2)]; + val += gout25 * dm[(j0+2)*nao+(l0+0)]; + val += gout52 * dm[(j0+2)*nao+(l0+1)]; + val += gout79 * dm[(j0+2)*nao+(l0+2)]; + atomicAdd(vk+(i0+1)*nao+(k0+2), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + val += gout29 * dm[(j0+0)*nao+(l0+1)]; + val += gout56 * dm[(j0+0)*nao+(l0+2)]; + val += gout5 * dm[(j0+1)*nao+(l0+0)]; + val += gout32 * dm[(j0+1)*nao+(l0+1)]; + val += gout59 * dm[(j0+1)*nao+(l0+2)]; + val += gout8 * dm[(j0+2)*nao+(l0+0)]; + val += gout35 * dm[(j0+2)*nao+(l0+1)]; + val += gout62 * dm[(j0+2)*nao+(l0+2)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout11 * dm[(j0+0)*nao+(l0+0)]; + val += gout38 * dm[(j0+0)*nao+(l0+1)]; + val += gout65 * dm[(j0+0)*nao+(l0+2)]; + val += gout14 * dm[(j0+1)*nao+(l0+0)]; + val += gout41 * dm[(j0+1)*nao+(l0+1)]; + val += gout68 * dm[(j0+1)*nao+(l0+2)]; + val += gout17 * dm[(j0+2)*nao+(l0+0)]; + val += gout44 * dm[(j0+2)*nao+(l0+1)]; + val += gout71 * dm[(j0+2)*nao+(l0+2)]; + atomicAdd(vk+(i0+2)*nao+(k0+1), val); + val = 0; + val += gout20 * dm[(j0+0)*nao+(l0+0)]; + val += gout47 * dm[(j0+0)*nao+(l0+1)]; + val += gout74 * dm[(j0+0)*nao+(l0+2)]; + val += gout23 * dm[(j0+1)*nao+(l0+0)]; + val += gout50 * dm[(j0+1)*nao+(l0+1)]; + val += gout77 * dm[(j0+1)*nao+(l0+2)]; + val += gout26 * dm[(j0+2)*nao+(l0+0)]; + val += gout53 * dm[(j0+2)*nao+(l0+1)]; + val += gout80 * dm[(j0+2)*nao+(l0+2)]; + atomicAdd(vk+(i0+2)*nao+(k0+2), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout27 * dm[(i0+0)*nao+(l0+1)]; + val += gout54 * dm[(i0+0)*nao+(l0+2)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout28 * dm[(i0+1)*nao+(l0+1)]; + val += gout55 * dm[(i0+1)*nao+(l0+2)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + val += gout29 * dm[(i0+2)*nao+(l0+1)]; + val += gout56 * dm[(i0+2)*nao+(l0+2)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + val = 0; + val += gout9 * dm[(i0+0)*nao+(l0+0)]; + val += gout36 * dm[(i0+0)*nao+(l0+1)]; + val += gout63 * dm[(i0+0)*nao+(l0+2)]; + val += gout10 * dm[(i0+1)*nao+(l0+0)]; + val += gout37 * dm[(i0+1)*nao+(l0+1)]; + val += gout64 * dm[(i0+1)*nao+(l0+2)]; + val += gout11 * dm[(i0+2)*nao+(l0+0)]; + val += gout38 * dm[(i0+2)*nao+(l0+1)]; + val += gout65 * dm[(i0+2)*nao+(l0+2)]; + atomicAdd(vk+(j0+0)*nao+(k0+1), val); + val = 0; + val += gout18 * dm[(i0+0)*nao+(l0+0)]; + val += gout45 * dm[(i0+0)*nao+(l0+1)]; + val += gout72 * dm[(i0+0)*nao+(l0+2)]; + val += gout19 * dm[(i0+1)*nao+(l0+0)]; + val += gout46 * dm[(i0+1)*nao+(l0+1)]; + val += gout73 * dm[(i0+1)*nao+(l0+2)]; + val += gout20 * dm[(i0+2)*nao+(l0+0)]; + val += gout47 * dm[(i0+2)*nao+(l0+1)]; + val += gout74 * dm[(i0+2)*nao+(l0+2)]; + atomicAdd(vk+(j0+0)*nao+(k0+2), val); + val = 0; + val += gout3 * dm[(i0+0)*nao+(l0+0)]; + val += gout30 * dm[(i0+0)*nao+(l0+1)]; + val += gout57 * dm[(i0+0)*nao+(l0+2)]; + val += gout4 * dm[(i0+1)*nao+(l0+0)]; + val += gout31 * dm[(i0+1)*nao+(l0+1)]; + val += gout58 * dm[(i0+1)*nao+(l0+2)]; + val += gout5 * dm[(i0+2)*nao+(l0+0)]; + val += gout32 * dm[(i0+2)*nao+(l0+1)]; + val += gout59 * dm[(i0+2)*nao+(l0+2)]; + atomicAdd(vk+(j0+1)*nao+(k0+0), val); + val = 0; + val += gout12 * dm[(i0+0)*nao+(l0+0)]; + val += gout39 * dm[(i0+0)*nao+(l0+1)]; + val += gout66 * dm[(i0+0)*nao+(l0+2)]; + val += gout13 * dm[(i0+1)*nao+(l0+0)]; + val += gout40 * dm[(i0+1)*nao+(l0+1)]; + val += gout67 * dm[(i0+1)*nao+(l0+2)]; + val += gout14 * dm[(i0+2)*nao+(l0+0)]; + val += gout41 * dm[(i0+2)*nao+(l0+1)]; + val += gout68 * dm[(i0+2)*nao+(l0+2)]; + atomicAdd(vk+(j0+1)*nao+(k0+1), val); + val = 0; + val += gout21 * dm[(i0+0)*nao+(l0+0)]; + val += gout48 * dm[(i0+0)*nao+(l0+1)]; + val += gout75 * dm[(i0+0)*nao+(l0+2)]; + val += gout22 * dm[(i0+1)*nao+(l0+0)]; + val += gout49 * dm[(i0+1)*nao+(l0+1)]; + val += gout76 * dm[(i0+1)*nao+(l0+2)]; + val += gout23 * dm[(i0+2)*nao+(l0+0)]; + val += gout50 * dm[(i0+2)*nao+(l0+1)]; + val += gout77 * dm[(i0+2)*nao+(l0+2)]; + atomicAdd(vk+(j0+1)*nao+(k0+2), val); + val = 0; + val += gout6 * dm[(i0+0)*nao+(l0+0)]; + val += gout33 * dm[(i0+0)*nao+(l0+1)]; + val += gout60 * dm[(i0+0)*nao+(l0+2)]; + val += gout7 * dm[(i0+1)*nao+(l0+0)]; + val += gout34 * dm[(i0+1)*nao+(l0+1)]; + val += gout61 * dm[(i0+1)*nao+(l0+2)]; + val += gout8 * dm[(i0+2)*nao+(l0+0)]; + val += gout35 * dm[(i0+2)*nao+(l0+1)]; + val += gout62 * dm[(i0+2)*nao+(l0+2)]; + atomicAdd(vk+(j0+2)*nao+(k0+0), val); + val = 0; + val += gout15 * dm[(i0+0)*nao+(l0+0)]; + val += gout42 * dm[(i0+0)*nao+(l0+1)]; + val += gout69 * dm[(i0+0)*nao+(l0+2)]; + val += gout16 * dm[(i0+1)*nao+(l0+0)]; + val += gout43 * dm[(i0+1)*nao+(l0+1)]; + val += gout70 * dm[(i0+1)*nao+(l0+2)]; + val += gout17 * dm[(i0+2)*nao+(l0+0)]; + val += gout44 * dm[(i0+2)*nao+(l0+1)]; + val += gout71 * dm[(i0+2)*nao+(l0+2)]; + atomicAdd(vk+(j0+2)*nao+(k0+1), val); + val = 0; + val += gout24 * dm[(i0+0)*nao+(l0+0)]; + val += gout51 * dm[(i0+0)*nao+(l0+1)]; + val += gout78 * dm[(i0+0)*nao+(l0+2)]; + val += gout25 * dm[(i0+1)*nao+(l0+0)]; + val += gout52 * dm[(i0+1)*nao+(l0+1)]; + val += gout79 * dm[(i0+1)*nao+(l0+2)]; + val += gout26 * dm[(i0+2)*nao+(l0+0)]; + val += gout53 * dm[(i0+2)*nao+(l0+1)]; + val += gout80 * dm[(i0+2)*nao+(l0+2)]; + atomicAdd(vk+(j0+2)*nao+(k0+2), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +__global__ +void rys_sr_jk_1111(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_sr_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_sr_jk_1111(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_jk_2000(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double gout3; + double gout4; + double gout5; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + gout3 = 0; + gout4 = 0; + gout5 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(2, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(2, theta_fac*theta_rr, rw); + fac *= sqrt(theta_fac); + for (int irys = 0; irys < 2; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + } + } + if (task_id < ntasks) { + for (int irys = 0; irys < 2; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + gout0 += trr_20x * 1 * wt; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += trr_10x * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += trr_10x * 1 * trr_10z; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + gout3 += fac * trr_20y * wt; + gout4 += fac * trr_10y * trr_10z; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + gout5 += fac * 1 * trr_20z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout3 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+0), val); + val = 0; + val += gout4 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+0), val); + val = 0; + val += gout5 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + val += gout3 * dm[(j0+0)*nao+(i0+3)]; + val += gout4 * dm[(j0+0)*nao+(i0+4)]; + val += gout5 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+3)*nao+(l0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+4)*nao+(l0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+5)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + val += gout3 * dm[(i0+3)*nao+(k0+0)]; + val += gout4 * dm[(i0+4)*nao+(k0+0)]; + val += gout5 * dm[(i0+5)*nao+(k0+0)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + val += gout3 * dm[(i0+3)*nao+(l0+0)]; + val += gout4 * dm[(i0+4)*nao+(l0+0)]; + val += gout5 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +#if CUDA_VERSION >= 12040 +__global__ __maxnreg__(128) +#else +__global__ +#endif +void rys_jk_2000(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_jk_2000(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_sr_jk_2000(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double gout3; + double gout4; + double gout5; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + gout3 = 0; + gout4 = 0; + gout5 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + rys_roots(2, theta_rr, rw+4*nsq_per_block); + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(2, theta_fac*theta_rr, rw); + double sqrt_theta_fac = -sqrt(theta_fac); + for (int irys = 0; irys < 2; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + rw[sq_id+(irys*2+1)*nsq_per_block] *= sqrt_theta_fac; + } + if (task_id < ntasks) { + for (int irys = 0; irys < 4; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + gout0 += trr_20x * 1 * wt; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += trr_10x * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += trr_10x * 1 * trr_10z; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + gout3 += fac * trr_20y * wt; + gout4 += fac * trr_10y * trr_10z; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + gout5 += fac * 1 * trr_20z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout3 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+0), val); + val = 0; + val += gout4 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+0), val); + val = 0; + val += gout5 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + val += gout3 * dm[(j0+0)*nao+(i0+3)]; + val += gout4 * dm[(j0+0)*nao+(i0+4)]; + val += gout5 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+3)*nao+(l0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+4)*nao+(l0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+5)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + val += gout3 * dm[(i0+3)*nao+(k0+0)]; + val += gout4 * dm[(i0+4)*nao+(k0+0)]; + val += gout5 * dm[(i0+5)*nao+(k0+0)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + val += gout3 * dm[(i0+3)*nao+(l0+0)]; + val += gout4 * dm[(i0+4)*nao+(l0+0)]; + val += gout5 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +#if CUDA_VERSION >= 12040 +__global__ __maxnreg__(128) +#else +__global__ +#endif +void rys_sr_jk_2000(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_sr_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_sr_jk_2000(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_jk_2010(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double gout3; + double gout4; + double gout5; + double gout6; + double gout7; + double gout8; + double gout9; + double gout10; + double gout11; + double gout12; + double gout13; + double gout14; + double gout15; + double gout16; + double gout17; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + gout3 = 0; + gout4 = 0; + gout5 = 0; + gout6 = 0; + gout7 = 0; + gout8 = 0; + gout9 = 0; + gout10 = 0; + gout11 = 0; + gout12 = 0; + gout13 = 0; + gout14 = 0; + gout15 = 0; + gout16 = 0; + gout17 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(2, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(2, theta_fac*theta_rr, rw); + fac *= sqrt(theta_fac); + for (int irys = 0; irys < 2; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + } + } + if (task_id < ntasks) { + for (int irys = 0; irys < 2; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double b00 = .5 * rt_aa; + double rt_akl = rt_aa * aij; + double cpx = xqc + xpq*rt_akl; + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + double trr_21x = cpx * trr_20x + 2*b00 * trr_10x; + gout0 += trr_21x * 1 * wt; + double trr_11x = cpx * trr_10x + 1*b00 * fac; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += trr_11x * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += trr_11x * 1 * trr_10z; + double trr_01x = cpx * fac; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + gout3 += trr_01x * trr_20y * wt; + gout4 += trr_01x * trr_10y * trr_10z; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + gout5 += trr_01x * 1 * trr_20z; + double cpy = yqc + ypq*rt_akl; + double trr_01y = cpy * 1; + gout6 += trr_20x * trr_01y * wt; + double trr_11y = cpy * trr_10y + 1*b00 * 1; + gout7 += trr_10x * trr_11y * wt; + gout8 += trr_10x * trr_01y * trr_10z; + double trr_21y = cpy * trr_20y + 2*b00 * trr_10y; + gout9 += fac * trr_21y * wt; + gout10 += fac * trr_11y * trr_10z; + gout11 += fac * trr_01y * trr_20z; + double cpz = zqc + zpq*rt_akl; + double trr_01z = cpz * wt; + gout12 += trr_20x * 1 * trr_01z; + gout13 += trr_10x * trr_10y * trr_01z; + double trr_11z = cpz * trr_10z + 1*b00 * wt; + gout14 += trr_10x * 1 * trr_11z; + gout15 += fac * trr_20y * trr_01z; + gout16 += fac * trr_10y * trr_11z; + double trr_21z = cpz * trr_20z + 2*b00 * trr_10z; + gout17 += fac * 1 * trr_21z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + val += gout6 * dm[(l0+0)*nao+(k0+1)]; + val += gout12 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + val += gout7 * dm[(l0+0)*nao+(k0+1)]; + val += gout13 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + val += gout8 * dm[(l0+0)*nao+(k0+1)]; + val += gout14 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout3 * dm[(l0+0)*nao+(k0+0)]; + val += gout9 * dm[(l0+0)*nao+(k0+1)]; + val += gout15 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+3)*nao+(j0+0), val); + val = 0; + val += gout4 * dm[(l0+0)*nao+(k0+0)]; + val += gout10 * dm[(l0+0)*nao+(k0+1)]; + val += gout16 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+4)*nao+(j0+0), val); + val = 0; + val += gout5 * dm[(l0+0)*nao+(k0+0)]; + val += gout11 * dm[(l0+0)*nao+(k0+1)]; + val += gout17 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+5)*nao+(j0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + val += gout3 * dm[(j0+0)*nao+(i0+3)]; + val += gout4 * dm[(j0+0)*nao+(i0+4)]; + val += gout5 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(i0+0)]; + val += gout7 * dm[(j0+0)*nao+(i0+1)]; + val += gout8 * dm[(j0+0)*nao+(i0+2)]; + val += gout9 * dm[(j0+0)*nao+(i0+3)]; + val += gout10 * dm[(j0+0)*nao+(i0+4)]; + val += gout11 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+1)*nao+(l0+0), val); + val = 0; + val += gout12 * dm[(j0+0)*nao+(i0+0)]; + val += gout13 * dm[(j0+0)*nao+(i0+1)]; + val += gout14 * dm[(j0+0)*nao+(i0+2)]; + val += gout15 * dm[(j0+0)*nao+(i0+3)]; + val += gout16 * dm[(j0+0)*nao+(i0+4)]; + val += gout17 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+2)*nao+(l0+0), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + val += gout6 * dm[(j0+0)*nao+(k0+1)]; + val += gout12 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + val += gout7 * dm[(j0+0)*nao+(k0+1)]; + val += gout13 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + val += gout8 * dm[(j0+0)*nao+(k0+1)]; + val += gout14 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(k0+0)]; + val += gout9 * dm[(j0+0)*nao+(k0+1)]; + val += gout15 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+3)*nao+(l0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(k0+0)]; + val += gout10 * dm[(j0+0)*nao+(k0+1)]; + val += gout16 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+4)*nao+(l0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(k0+0)]; + val += gout11 * dm[(j0+0)*nao+(k0+1)]; + val += gout17 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+5)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout6 * dm[(i0+0)*nao+(k0+1)]; + val += gout12 * dm[(i0+0)*nao+(k0+2)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout7 * dm[(i0+1)*nao+(k0+1)]; + val += gout13 * dm[(i0+1)*nao+(k0+2)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + val += gout8 * dm[(i0+2)*nao+(k0+1)]; + val += gout14 * dm[(i0+2)*nao+(k0+2)]; + val += gout3 * dm[(i0+3)*nao+(k0+0)]; + val += gout9 * dm[(i0+3)*nao+(k0+1)]; + val += gout15 * dm[(i0+3)*nao+(k0+2)]; + val += gout4 * dm[(i0+4)*nao+(k0+0)]; + val += gout10 * dm[(i0+4)*nao+(k0+1)]; + val += gout16 * dm[(i0+4)*nao+(k0+2)]; + val += gout5 * dm[(i0+5)*nao+(k0+0)]; + val += gout11 * dm[(i0+5)*nao+(k0+1)]; + val += gout17 * dm[(i0+5)*nao+(k0+2)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+1), val); + val = 0; + val += gout12 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+2), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout7 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+1), val); + val = 0; + val += gout13 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+2), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout8 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+1), val); + val = 0; + val += gout14 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+2), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+0), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+1), val); + val = 0; + val += gout15 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+2), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+0), val); + val = 0; + val += gout10 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+1), val); + val = 0; + val += gout16 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+2), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+0), val); + val = 0; + val += gout11 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+1), val); + val = 0; + val += gout17 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+2), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + val += gout3 * dm[(i0+3)*nao+(l0+0)]; + val += gout4 * dm[(i0+4)*nao+(l0+0)]; + val += gout5 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + val = 0; + val += gout6 * dm[(i0+0)*nao+(l0+0)]; + val += gout7 * dm[(i0+1)*nao+(l0+0)]; + val += gout8 * dm[(i0+2)*nao+(l0+0)]; + val += gout9 * dm[(i0+3)*nao+(l0+0)]; + val += gout10 * dm[(i0+4)*nao+(l0+0)]; + val += gout11 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+1), val); + val = 0; + val += gout12 * dm[(i0+0)*nao+(l0+0)]; + val += gout13 * dm[(i0+1)*nao+(l0+0)]; + val += gout14 * dm[(i0+2)*nao+(l0+0)]; + val += gout15 * dm[(i0+3)*nao+(l0+0)]; + val += gout16 * dm[(i0+4)*nao+(l0+0)]; + val += gout17 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+2), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +#if CUDA_VERSION >= 12040 +__global__ __maxnreg__(128) +#else +__global__ +#endif +void rys_jk_2010(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_jk_2010(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_sr_jk_2010(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double gout3; + double gout4; + double gout5; + double gout6; + double gout7; + double gout8; + double gout9; + double gout10; + double gout11; + double gout12; + double gout13; + double gout14; + double gout15; + double gout16; + double gout17; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + gout3 = 0; + gout4 = 0; + gout5 = 0; + gout6 = 0; + gout7 = 0; + gout8 = 0; + gout9 = 0; + gout10 = 0; + gout11 = 0; + gout12 = 0; + gout13 = 0; + gout14 = 0; + gout15 = 0; + gout16 = 0; + gout17 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + rys_roots(2, theta_rr, rw+4*nsq_per_block); + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(2, theta_fac*theta_rr, rw); + double sqrt_theta_fac = -sqrt(theta_fac); + for (int irys = 0; irys < 2; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + rw[sq_id+(irys*2+1)*nsq_per_block] *= sqrt_theta_fac; + } + if (task_id < ntasks) { + for (int irys = 0; irys < 4; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double b00 = .5 * rt_aa; + double rt_akl = rt_aa * aij; + double cpx = xqc + xpq*rt_akl; + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + double trr_21x = cpx * trr_20x + 2*b00 * trr_10x; + gout0 += trr_21x * 1 * wt; + double trr_11x = cpx * trr_10x + 1*b00 * fac; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += trr_11x * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += trr_11x * 1 * trr_10z; + double trr_01x = cpx * fac; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + gout3 += trr_01x * trr_20y * wt; + gout4 += trr_01x * trr_10y * trr_10z; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + gout5 += trr_01x * 1 * trr_20z; + double cpy = yqc + ypq*rt_akl; + double trr_01y = cpy * 1; + gout6 += trr_20x * trr_01y * wt; + double trr_11y = cpy * trr_10y + 1*b00 * 1; + gout7 += trr_10x * trr_11y * wt; + gout8 += trr_10x * trr_01y * trr_10z; + double trr_21y = cpy * trr_20y + 2*b00 * trr_10y; + gout9 += fac * trr_21y * wt; + gout10 += fac * trr_11y * trr_10z; + gout11 += fac * trr_01y * trr_20z; + double cpz = zqc + zpq*rt_akl; + double trr_01z = cpz * wt; + gout12 += trr_20x * 1 * trr_01z; + gout13 += trr_10x * trr_10y * trr_01z; + double trr_11z = cpz * trr_10z + 1*b00 * wt; + gout14 += trr_10x * 1 * trr_11z; + gout15 += fac * trr_20y * trr_01z; + gout16 += fac * trr_10y * trr_11z; + double trr_21z = cpz * trr_20z + 2*b00 * trr_10z; + gout17 += fac * 1 * trr_21z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + val += gout6 * dm[(l0+0)*nao+(k0+1)]; + val += gout12 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + val += gout7 * dm[(l0+0)*nao+(k0+1)]; + val += gout13 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + val += gout8 * dm[(l0+0)*nao+(k0+1)]; + val += gout14 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout3 * dm[(l0+0)*nao+(k0+0)]; + val += gout9 * dm[(l0+0)*nao+(k0+1)]; + val += gout15 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+3)*nao+(j0+0), val); + val = 0; + val += gout4 * dm[(l0+0)*nao+(k0+0)]; + val += gout10 * dm[(l0+0)*nao+(k0+1)]; + val += gout16 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+4)*nao+(j0+0), val); + val = 0; + val += gout5 * dm[(l0+0)*nao+(k0+0)]; + val += gout11 * dm[(l0+0)*nao+(k0+1)]; + val += gout17 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+5)*nao+(j0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + val += gout3 * dm[(j0+0)*nao+(i0+3)]; + val += gout4 * dm[(j0+0)*nao+(i0+4)]; + val += gout5 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(i0+0)]; + val += gout7 * dm[(j0+0)*nao+(i0+1)]; + val += gout8 * dm[(j0+0)*nao+(i0+2)]; + val += gout9 * dm[(j0+0)*nao+(i0+3)]; + val += gout10 * dm[(j0+0)*nao+(i0+4)]; + val += gout11 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+1)*nao+(l0+0), val); + val = 0; + val += gout12 * dm[(j0+0)*nao+(i0+0)]; + val += gout13 * dm[(j0+0)*nao+(i0+1)]; + val += gout14 * dm[(j0+0)*nao+(i0+2)]; + val += gout15 * dm[(j0+0)*nao+(i0+3)]; + val += gout16 * dm[(j0+0)*nao+(i0+4)]; + val += gout17 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+2)*nao+(l0+0), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + val += gout6 * dm[(j0+0)*nao+(k0+1)]; + val += gout12 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + val += gout7 * dm[(j0+0)*nao+(k0+1)]; + val += gout13 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + val += gout8 * dm[(j0+0)*nao+(k0+1)]; + val += gout14 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(k0+0)]; + val += gout9 * dm[(j0+0)*nao+(k0+1)]; + val += gout15 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+3)*nao+(l0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(k0+0)]; + val += gout10 * dm[(j0+0)*nao+(k0+1)]; + val += gout16 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+4)*nao+(l0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(k0+0)]; + val += gout11 * dm[(j0+0)*nao+(k0+1)]; + val += gout17 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+5)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout6 * dm[(i0+0)*nao+(k0+1)]; + val += gout12 * dm[(i0+0)*nao+(k0+2)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout7 * dm[(i0+1)*nao+(k0+1)]; + val += gout13 * dm[(i0+1)*nao+(k0+2)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + val += gout8 * dm[(i0+2)*nao+(k0+1)]; + val += gout14 * dm[(i0+2)*nao+(k0+2)]; + val += gout3 * dm[(i0+3)*nao+(k0+0)]; + val += gout9 * dm[(i0+3)*nao+(k0+1)]; + val += gout15 * dm[(i0+3)*nao+(k0+2)]; + val += gout4 * dm[(i0+4)*nao+(k0+0)]; + val += gout10 * dm[(i0+4)*nao+(k0+1)]; + val += gout16 * dm[(i0+4)*nao+(k0+2)]; + val += gout5 * dm[(i0+5)*nao+(k0+0)]; + val += gout11 * dm[(i0+5)*nao+(k0+1)]; + val += gout17 * dm[(i0+5)*nao+(k0+2)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+1), val); + val = 0; + val += gout12 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+2), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout7 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+1), val); + val = 0; + val += gout13 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+2), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout8 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+1), val); + val = 0; + val += gout14 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+2), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+0), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+1), val); + val = 0; + val += gout15 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+2), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+0), val); + val = 0; + val += gout10 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+1), val); + val = 0; + val += gout16 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+2), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+0), val); + val = 0; + val += gout11 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+1), val); + val = 0; + val += gout17 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+2), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + val += gout3 * dm[(i0+3)*nao+(l0+0)]; + val += gout4 * dm[(i0+4)*nao+(l0+0)]; + val += gout5 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + val = 0; + val += gout6 * dm[(i0+0)*nao+(l0+0)]; + val += gout7 * dm[(i0+1)*nao+(l0+0)]; + val += gout8 * dm[(i0+2)*nao+(l0+0)]; + val += gout9 * dm[(i0+3)*nao+(l0+0)]; + val += gout10 * dm[(i0+4)*nao+(l0+0)]; + val += gout11 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+1), val); + val = 0; + val += gout12 * dm[(i0+0)*nao+(l0+0)]; + val += gout13 * dm[(i0+1)*nao+(l0+0)]; + val += gout14 * dm[(i0+2)*nao+(l0+0)]; + val += gout15 * dm[(i0+3)*nao+(l0+0)]; + val += gout16 * dm[(i0+4)*nao+(l0+0)]; + val += gout17 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+2), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +#if CUDA_VERSION >= 12040 +__global__ __maxnreg__(128) +#else +__global__ +#endif +void rys_sr_jk_2010(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_sr_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_sr_jk_2010(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_jk_2011(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double gout3; + double gout4; + double gout5; + double gout6; + double gout7; + double gout8; + double gout9; + double gout10; + double gout11; + double gout12; + double gout13; + double gout14; + double gout15; + double gout16; + double gout17; + double gout18; + double gout19; + double gout20; + double gout21; + double gout22; + double gout23; + double gout24; + double gout25; + double gout26; + double gout27; + double gout28; + double gout29; + double gout30; + double gout31; + double gout32; + double gout33; + double gout34; + double gout35; + double gout36; + double gout37; + double gout38; + double gout39; + double gout40; + double gout41; + double gout42; + double gout43; + double gout44; + double gout45; + double gout46; + double gout47; + double gout48; + double gout49; + double gout50; + double gout51; + double gout52; + double gout53; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + gout3 = 0; + gout4 = 0; + gout5 = 0; + gout6 = 0; + gout7 = 0; + gout8 = 0; + gout9 = 0; + gout10 = 0; + gout11 = 0; + gout12 = 0; + gout13 = 0; + gout14 = 0; + gout15 = 0; + gout16 = 0; + gout17 = 0; + gout18 = 0; + gout19 = 0; + gout20 = 0; + gout21 = 0; + gout22 = 0; + gout23 = 0; + gout24 = 0; + gout25 = 0; + gout26 = 0; + gout27 = 0; + gout28 = 0; + gout29 = 0; + gout30 = 0; + gout31 = 0; + gout32 = 0; + gout33 = 0; + gout34 = 0; + gout35 = 0; + gout36 = 0; + gout37 = 0; + gout38 = 0; + gout39 = 0; + gout40 = 0; + gout41 = 0; + gout42 = 0; + gout43 = 0; + gout44 = 0; + gout45 = 0; + gout46 = 0; + gout47 = 0; + gout48 = 0; + gout49 = 0; + gout50 = 0; + gout51 = 0; + gout52 = 0; + gout53 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(3, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(3, theta_fac*theta_rr, rw); + fac *= sqrt(theta_fac); + for (int irys = 0; irys < 3; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + } + } + if (task_id < ntasks) { + for (int irys = 0; irys < 3; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double b00 = .5 * rt_aa; + double rt_akl = rt_aa * aij; + double b01 = .5/akl * (1 - rt_akl); + double cpx = xqc + xpq*rt_akl; + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + double trr_21x = cpx * trr_20x + 2*b00 * trr_10x; + double trr_11x = cpx * trr_10x + 1*b00 * fac; + double trr_22x = cpx * trr_21x + 1*b01 * trr_20x + 2*b00 * trr_11x; + double hrr_2011x = trr_22x - xlxk * trr_21x; + gout0 += hrr_2011x * 1 * wt; + double trr_01x = cpx * fac; + double trr_12x = cpx * trr_11x + 1*b01 * trr_10x + 1*b00 * trr_01x; + double hrr_1011x = trr_12x - xlxk * trr_11x; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += hrr_1011x * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += hrr_1011x * 1 * trr_10z; + double trr_02x = cpx * trr_01x + 1*b01 * fac; + double hrr_0011x = trr_02x - xlxk * trr_01x; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + gout3 += hrr_0011x * trr_20y * wt; + gout4 += hrr_0011x * trr_10y * trr_10z; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + gout5 += hrr_0011x * 1 * trr_20z; + double hrr_2001x = trr_21x - xlxk * trr_20x; + double cpy = yqc + ypq*rt_akl; + double trr_01y = cpy * 1; + gout6 += hrr_2001x * trr_01y * wt; + double hrr_1001x = trr_11x - xlxk * trr_10x; + double trr_11y = cpy * trr_10y + 1*b00 * 1; + gout7 += hrr_1001x * trr_11y * wt; + gout8 += hrr_1001x * trr_01y * trr_10z; + double hrr_0001x = trr_01x - xlxk * fac; + double trr_21y = cpy * trr_20y + 2*b00 * trr_10y; + gout9 += hrr_0001x * trr_21y * wt; + gout10 += hrr_0001x * trr_11y * trr_10z; + gout11 += hrr_0001x * trr_01y * trr_20z; + double cpz = zqc + zpq*rt_akl; + double trr_01z = cpz * wt; + gout12 += hrr_2001x * 1 * trr_01z; + gout13 += hrr_1001x * trr_10y * trr_01z; + double trr_11z = cpz * trr_10z + 1*b00 * wt; + gout14 += hrr_1001x * 1 * trr_11z; + gout15 += hrr_0001x * trr_20y * trr_01z; + gout16 += hrr_0001x * trr_10y * trr_11z; + double trr_21z = cpz * trr_20z + 2*b00 * trr_10z; + gout17 += hrr_0001x * 1 * trr_21z; + double hrr_0001y = trr_01y - ylyk * 1; + gout18 += trr_21x * hrr_0001y * wt; + double hrr_1001y = trr_11y - ylyk * trr_10y; + gout19 += trr_11x * hrr_1001y * wt; + gout20 += trr_11x * hrr_0001y * trr_10z; + double hrr_2001y = trr_21y - ylyk * trr_20y; + gout21 += trr_01x * hrr_2001y * wt; + gout22 += trr_01x * hrr_1001y * trr_10z; + gout23 += trr_01x * hrr_0001y * trr_20z; + double trr_02y = cpy * trr_01y + 1*b01 * 1; + double hrr_0011y = trr_02y - ylyk * trr_01y; + gout24 += trr_20x * hrr_0011y * wt; + double trr_12y = cpy * trr_11y + 1*b01 * trr_10y + 1*b00 * trr_01y; + double hrr_1011y = trr_12y - ylyk * trr_11y; + gout25 += trr_10x * hrr_1011y * wt; + gout26 += trr_10x * hrr_0011y * trr_10z; + double trr_22y = cpy * trr_21y + 1*b01 * trr_20y + 2*b00 * trr_11y; + double hrr_2011y = trr_22y - ylyk * trr_21y; + gout27 += fac * hrr_2011y * wt; + gout28 += fac * hrr_1011y * trr_10z; + gout29 += fac * hrr_0011y * trr_20z; + gout30 += trr_20x * hrr_0001y * trr_01z; + gout31 += trr_10x * hrr_1001y * trr_01z; + gout32 += trr_10x * hrr_0001y * trr_11z; + gout33 += fac * hrr_2001y * trr_01z; + gout34 += fac * hrr_1001y * trr_11z; + gout35 += fac * hrr_0001y * trr_21z; + double hrr_0001z = trr_01z - zlzk * wt; + gout36 += trr_21x * 1 * hrr_0001z; + gout37 += trr_11x * trr_10y * hrr_0001z; + double hrr_1001z = trr_11z - zlzk * trr_10z; + gout38 += trr_11x * 1 * hrr_1001z; + gout39 += trr_01x * trr_20y * hrr_0001z; + gout40 += trr_01x * trr_10y * hrr_1001z; + double hrr_2001z = trr_21z - zlzk * trr_20z; + gout41 += trr_01x * 1 * hrr_2001z; + gout42 += trr_20x * trr_01y * hrr_0001z; + gout43 += trr_10x * trr_11y * hrr_0001z; + gout44 += trr_10x * trr_01y * hrr_1001z; + gout45 += fac * trr_21y * hrr_0001z; + gout46 += fac * trr_11y * hrr_1001z; + gout47 += fac * trr_01y * hrr_2001z; + double trr_02z = cpz * trr_01z + 1*b01 * wt; + double hrr_0011z = trr_02z - zlzk * trr_01z; + gout48 += trr_20x * 1 * hrr_0011z; + gout49 += trr_10x * trr_10y * hrr_0011z; + double trr_12z = cpz * trr_11z + 1*b01 * trr_10z + 1*b00 * trr_01z; + double hrr_1011z = trr_12z - zlzk * trr_11z; + gout50 += trr_10x * 1 * hrr_1011z; + gout51 += fac * trr_20y * hrr_0011z; + gout52 += fac * trr_10y * hrr_1011z; + double trr_22z = cpz * trr_21z + 1*b01 * trr_20z + 2*b00 * trr_11z; + double hrr_2011z = trr_22z - zlzk * trr_21z; + gout53 += fac * 1 * hrr_2011z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + val += gout6 * dm[(l0+0)*nao+(k0+1)]; + val += gout12 * dm[(l0+0)*nao+(k0+2)]; + val += gout18 * dm[(l0+1)*nao+(k0+0)]; + val += gout24 * dm[(l0+1)*nao+(k0+1)]; + val += gout30 * dm[(l0+1)*nao+(k0+2)]; + val += gout36 * dm[(l0+2)*nao+(k0+0)]; + val += gout42 * dm[(l0+2)*nao+(k0+1)]; + val += gout48 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + val += gout7 * dm[(l0+0)*nao+(k0+1)]; + val += gout13 * dm[(l0+0)*nao+(k0+2)]; + val += gout19 * dm[(l0+1)*nao+(k0+0)]; + val += gout25 * dm[(l0+1)*nao+(k0+1)]; + val += gout31 * dm[(l0+1)*nao+(k0+2)]; + val += gout37 * dm[(l0+2)*nao+(k0+0)]; + val += gout43 * dm[(l0+2)*nao+(k0+1)]; + val += gout49 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + val += gout8 * dm[(l0+0)*nao+(k0+1)]; + val += gout14 * dm[(l0+0)*nao+(k0+2)]; + val += gout20 * dm[(l0+1)*nao+(k0+0)]; + val += gout26 * dm[(l0+1)*nao+(k0+1)]; + val += gout32 * dm[(l0+1)*nao+(k0+2)]; + val += gout38 * dm[(l0+2)*nao+(k0+0)]; + val += gout44 * dm[(l0+2)*nao+(k0+1)]; + val += gout50 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout3 * dm[(l0+0)*nao+(k0+0)]; + val += gout9 * dm[(l0+0)*nao+(k0+1)]; + val += gout15 * dm[(l0+0)*nao+(k0+2)]; + val += gout21 * dm[(l0+1)*nao+(k0+0)]; + val += gout27 * dm[(l0+1)*nao+(k0+1)]; + val += gout33 * dm[(l0+1)*nao+(k0+2)]; + val += gout39 * dm[(l0+2)*nao+(k0+0)]; + val += gout45 * dm[(l0+2)*nao+(k0+1)]; + val += gout51 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+3)*nao+(j0+0), val); + val = 0; + val += gout4 * dm[(l0+0)*nao+(k0+0)]; + val += gout10 * dm[(l0+0)*nao+(k0+1)]; + val += gout16 * dm[(l0+0)*nao+(k0+2)]; + val += gout22 * dm[(l0+1)*nao+(k0+0)]; + val += gout28 * dm[(l0+1)*nao+(k0+1)]; + val += gout34 * dm[(l0+1)*nao+(k0+2)]; + val += gout40 * dm[(l0+2)*nao+(k0+0)]; + val += gout46 * dm[(l0+2)*nao+(k0+1)]; + val += gout52 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+4)*nao+(j0+0), val); + val = 0; + val += gout5 * dm[(l0+0)*nao+(k0+0)]; + val += gout11 * dm[(l0+0)*nao+(k0+1)]; + val += gout17 * dm[(l0+0)*nao+(k0+2)]; + val += gout23 * dm[(l0+1)*nao+(k0+0)]; + val += gout29 * dm[(l0+1)*nao+(k0+1)]; + val += gout35 * dm[(l0+1)*nao+(k0+2)]; + val += gout41 * dm[(l0+2)*nao+(k0+0)]; + val += gout47 * dm[(l0+2)*nao+(k0+1)]; + val += gout53 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+5)*nao+(j0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + val += gout3 * dm[(j0+0)*nao+(i0+3)]; + val += gout4 * dm[(j0+0)*nao+(i0+4)]; + val += gout5 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(i0+0)]; + val += gout7 * dm[(j0+0)*nao+(i0+1)]; + val += gout8 * dm[(j0+0)*nao+(i0+2)]; + val += gout9 * dm[(j0+0)*nao+(i0+3)]; + val += gout10 * dm[(j0+0)*nao+(i0+4)]; + val += gout11 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+1)*nao+(l0+0), val); + val = 0; + val += gout12 * dm[(j0+0)*nao+(i0+0)]; + val += gout13 * dm[(j0+0)*nao+(i0+1)]; + val += gout14 * dm[(j0+0)*nao+(i0+2)]; + val += gout15 * dm[(j0+0)*nao+(i0+3)]; + val += gout16 * dm[(j0+0)*nao+(i0+4)]; + val += gout17 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+2)*nao+(l0+0), val); + val = 0; + val += gout18 * dm[(j0+0)*nao+(i0+0)]; + val += gout19 * dm[(j0+0)*nao+(i0+1)]; + val += gout20 * dm[(j0+0)*nao+(i0+2)]; + val += gout21 * dm[(j0+0)*nao+(i0+3)]; + val += gout22 * dm[(j0+0)*nao+(i0+4)]; + val += gout23 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+0)*nao+(l0+1), val); + val = 0; + val += gout24 * dm[(j0+0)*nao+(i0+0)]; + val += gout25 * dm[(j0+0)*nao+(i0+1)]; + val += gout26 * dm[(j0+0)*nao+(i0+2)]; + val += gout27 * dm[(j0+0)*nao+(i0+3)]; + val += gout28 * dm[(j0+0)*nao+(i0+4)]; + val += gout29 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+1)*nao+(l0+1), val); + val = 0; + val += gout30 * dm[(j0+0)*nao+(i0+0)]; + val += gout31 * dm[(j0+0)*nao+(i0+1)]; + val += gout32 * dm[(j0+0)*nao+(i0+2)]; + val += gout33 * dm[(j0+0)*nao+(i0+3)]; + val += gout34 * dm[(j0+0)*nao+(i0+4)]; + val += gout35 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+2)*nao+(l0+1), val); + val = 0; + val += gout36 * dm[(j0+0)*nao+(i0+0)]; + val += gout37 * dm[(j0+0)*nao+(i0+1)]; + val += gout38 * dm[(j0+0)*nao+(i0+2)]; + val += gout39 * dm[(j0+0)*nao+(i0+3)]; + val += gout40 * dm[(j0+0)*nao+(i0+4)]; + val += gout41 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+0)*nao+(l0+2), val); + val = 0; + val += gout42 * dm[(j0+0)*nao+(i0+0)]; + val += gout43 * dm[(j0+0)*nao+(i0+1)]; + val += gout44 * dm[(j0+0)*nao+(i0+2)]; + val += gout45 * dm[(j0+0)*nao+(i0+3)]; + val += gout46 * dm[(j0+0)*nao+(i0+4)]; + val += gout47 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+1)*nao+(l0+2), val); + val = 0; + val += gout48 * dm[(j0+0)*nao+(i0+0)]; + val += gout49 * dm[(j0+0)*nao+(i0+1)]; + val += gout50 * dm[(j0+0)*nao+(i0+2)]; + val += gout51 * dm[(j0+0)*nao+(i0+3)]; + val += gout52 * dm[(j0+0)*nao+(i0+4)]; + val += gout53 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+2)*nao+(l0+2), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + val += gout6 * dm[(j0+0)*nao+(k0+1)]; + val += gout12 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout18 * dm[(j0+0)*nao+(k0+0)]; + val += gout24 * dm[(j0+0)*nao+(k0+1)]; + val += gout30 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+0)*nao+(l0+1), val); + val = 0; + val += gout36 * dm[(j0+0)*nao+(k0+0)]; + val += gout42 * dm[(j0+0)*nao+(k0+1)]; + val += gout48 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+0)*nao+(l0+2), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + val += gout7 * dm[(j0+0)*nao+(k0+1)]; + val += gout13 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout19 * dm[(j0+0)*nao+(k0+0)]; + val += gout25 * dm[(j0+0)*nao+(k0+1)]; + val += gout31 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+1)*nao+(l0+1), val); + val = 0; + val += gout37 * dm[(j0+0)*nao+(k0+0)]; + val += gout43 * dm[(j0+0)*nao+(k0+1)]; + val += gout49 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+1)*nao+(l0+2), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + val += gout8 * dm[(j0+0)*nao+(k0+1)]; + val += gout14 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout20 * dm[(j0+0)*nao+(k0+0)]; + val += gout26 * dm[(j0+0)*nao+(k0+1)]; + val += gout32 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+2)*nao+(l0+1), val); + val = 0; + val += gout38 * dm[(j0+0)*nao+(k0+0)]; + val += gout44 * dm[(j0+0)*nao+(k0+1)]; + val += gout50 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+2)*nao+(l0+2), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(k0+0)]; + val += gout9 * dm[(j0+0)*nao+(k0+1)]; + val += gout15 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+3)*nao+(l0+0), val); + val = 0; + val += gout21 * dm[(j0+0)*nao+(k0+0)]; + val += gout27 * dm[(j0+0)*nao+(k0+1)]; + val += gout33 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+3)*nao+(l0+1), val); + val = 0; + val += gout39 * dm[(j0+0)*nao+(k0+0)]; + val += gout45 * dm[(j0+0)*nao+(k0+1)]; + val += gout51 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+3)*nao+(l0+2), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(k0+0)]; + val += gout10 * dm[(j0+0)*nao+(k0+1)]; + val += gout16 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+4)*nao+(l0+0), val); + val = 0; + val += gout22 * dm[(j0+0)*nao+(k0+0)]; + val += gout28 * dm[(j0+0)*nao+(k0+1)]; + val += gout34 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+4)*nao+(l0+1), val); + val = 0; + val += gout40 * dm[(j0+0)*nao+(k0+0)]; + val += gout46 * dm[(j0+0)*nao+(k0+1)]; + val += gout52 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+4)*nao+(l0+2), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(k0+0)]; + val += gout11 * dm[(j0+0)*nao+(k0+1)]; + val += gout17 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+5)*nao+(l0+0), val); + val = 0; + val += gout23 * dm[(j0+0)*nao+(k0+0)]; + val += gout29 * dm[(j0+0)*nao+(k0+1)]; + val += gout35 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+5)*nao+(l0+1), val); + val = 0; + val += gout41 * dm[(j0+0)*nao+(k0+0)]; + val += gout47 * dm[(j0+0)*nao+(k0+1)]; + val += gout53 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+5)*nao+(l0+2), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout6 * dm[(i0+0)*nao+(k0+1)]; + val += gout12 * dm[(i0+0)*nao+(k0+2)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout7 * dm[(i0+1)*nao+(k0+1)]; + val += gout13 * dm[(i0+1)*nao+(k0+2)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + val += gout8 * dm[(i0+2)*nao+(k0+1)]; + val += gout14 * dm[(i0+2)*nao+(k0+2)]; + val += gout3 * dm[(i0+3)*nao+(k0+0)]; + val += gout9 * dm[(i0+3)*nao+(k0+1)]; + val += gout15 * dm[(i0+3)*nao+(k0+2)]; + val += gout4 * dm[(i0+4)*nao+(k0+0)]; + val += gout10 * dm[(i0+4)*nao+(k0+1)]; + val += gout16 * dm[(i0+4)*nao+(k0+2)]; + val += gout5 * dm[(i0+5)*nao+(k0+0)]; + val += gout11 * dm[(i0+5)*nao+(k0+1)]; + val += gout17 * dm[(i0+5)*nao+(k0+2)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout18 * dm[(i0+0)*nao+(k0+0)]; + val += gout24 * dm[(i0+0)*nao+(k0+1)]; + val += gout30 * dm[(i0+0)*nao+(k0+2)]; + val += gout19 * dm[(i0+1)*nao+(k0+0)]; + val += gout25 * dm[(i0+1)*nao+(k0+1)]; + val += gout31 * dm[(i0+1)*nao+(k0+2)]; + val += gout20 * dm[(i0+2)*nao+(k0+0)]; + val += gout26 * dm[(i0+2)*nao+(k0+1)]; + val += gout32 * dm[(i0+2)*nao+(k0+2)]; + val += gout21 * dm[(i0+3)*nao+(k0+0)]; + val += gout27 * dm[(i0+3)*nao+(k0+1)]; + val += gout33 * dm[(i0+3)*nao+(k0+2)]; + val += gout22 * dm[(i0+4)*nao+(k0+0)]; + val += gout28 * dm[(i0+4)*nao+(k0+1)]; + val += gout34 * dm[(i0+4)*nao+(k0+2)]; + val += gout23 * dm[(i0+5)*nao+(k0+0)]; + val += gout29 * dm[(i0+5)*nao+(k0+1)]; + val += gout35 * dm[(i0+5)*nao+(k0+2)]; + atomicAdd(vk+(j0+0)*nao+(l0+1), val); + val = 0; + val += gout36 * dm[(i0+0)*nao+(k0+0)]; + val += gout42 * dm[(i0+0)*nao+(k0+1)]; + val += gout48 * dm[(i0+0)*nao+(k0+2)]; + val += gout37 * dm[(i0+1)*nao+(k0+0)]; + val += gout43 * dm[(i0+1)*nao+(k0+1)]; + val += gout49 * dm[(i0+1)*nao+(k0+2)]; + val += gout38 * dm[(i0+2)*nao+(k0+0)]; + val += gout44 * dm[(i0+2)*nao+(k0+1)]; + val += gout50 * dm[(i0+2)*nao+(k0+2)]; + val += gout39 * dm[(i0+3)*nao+(k0+0)]; + val += gout45 * dm[(i0+3)*nao+(k0+1)]; + val += gout51 * dm[(i0+3)*nao+(k0+2)]; + val += gout40 * dm[(i0+4)*nao+(k0+0)]; + val += gout46 * dm[(i0+4)*nao+(k0+1)]; + val += gout52 * dm[(i0+4)*nao+(k0+2)]; + val += gout41 * dm[(i0+5)*nao+(k0+0)]; + val += gout47 * dm[(i0+5)*nao+(k0+1)]; + val += gout53 * dm[(i0+5)*nao+(k0+2)]; + atomicAdd(vk+(j0+0)*nao+(l0+2), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + val += gout18 * dm[(j0+0)*nao+(l0+1)]; + val += gout36 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(l0+0)]; + val += gout24 * dm[(j0+0)*nao+(l0+1)]; + val += gout42 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+0)*nao+(k0+1), val); + val = 0; + val += gout12 * dm[(j0+0)*nao+(l0+0)]; + val += gout30 * dm[(j0+0)*nao+(l0+1)]; + val += gout48 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+0)*nao+(k0+2), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + val += gout19 * dm[(j0+0)*nao+(l0+1)]; + val += gout37 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout7 * dm[(j0+0)*nao+(l0+0)]; + val += gout25 * dm[(j0+0)*nao+(l0+1)]; + val += gout43 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+1)*nao+(k0+1), val); + val = 0; + val += gout13 * dm[(j0+0)*nao+(l0+0)]; + val += gout31 * dm[(j0+0)*nao+(l0+1)]; + val += gout49 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+1)*nao+(k0+2), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + val += gout20 * dm[(j0+0)*nao+(l0+1)]; + val += gout38 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout8 * dm[(j0+0)*nao+(l0+0)]; + val += gout26 * dm[(j0+0)*nao+(l0+1)]; + val += gout44 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+2)*nao+(k0+1), val); + val = 0; + val += gout14 * dm[(j0+0)*nao+(l0+0)]; + val += gout32 * dm[(j0+0)*nao+(l0+1)]; + val += gout50 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+2)*nao+(k0+2), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(l0+0)]; + val += gout21 * dm[(j0+0)*nao+(l0+1)]; + val += gout39 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+3)*nao+(k0+0), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(l0+0)]; + val += gout27 * dm[(j0+0)*nao+(l0+1)]; + val += gout45 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+3)*nao+(k0+1), val); + val = 0; + val += gout15 * dm[(j0+0)*nao+(l0+0)]; + val += gout33 * dm[(j0+0)*nao+(l0+1)]; + val += gout51 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+3)*nao+(k0+2), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(l0+0)]; + val += gout22 * dm[(j0+0)*nao+(l0+1)]; + val += gout40 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+4)*nao+(k0+0), val); + val = 0; + val += gout10 * dm[(j0+0)*nao+(l0+0)]; + val += gout28 * dm[(j0+0)*nao+(l0+1)]; + val += gout46 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+4)*nao+(k0+1), val); + val = 0; + val += gout16 * dm[(j0+0)*nao+(l0+0)]; + val += gout34 * dm[(j0+0)*nao+(l0+1)]; + val += gout52 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+4)*nao+(k0+2), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(l0+0)]; + val += gout23 * dm[(j0+0)*nao+(l0+1)]; + val += gout41 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+5)*nao+(k0+0), val); + val = 0; + val += gout11 * dm[(j0+0)*nao+(l0+0)]; + val += gout29 * dm[(j0+0)*nao+(l0+1)]; + val += gout47 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+5)*nao+(k0+1), val); + val = 0; + val += gout17 * dm[(j0+0)*nao+(l0+0)]; + val += gout35 * dm[(j0+0)*nao+(l0+1)]; + val += gout53 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+5)*nao+(k0+2), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout18 * dm[(i0+0)*nao+(l0+1)]; + val += gout36 * dm[(i0+0)*nao+(l0+2)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout19 * dm[(i0+1)*nao+(l0+1)]; + val += gout37 * dm[(i0+1)*nao+(l0+2)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + val += gout20 * dm[(i0+2)*nao+(l0+1)]; + val += gout38 * dm[(i0+2)*nao+(l0+2)]; + val += gout3 * dm[(i0+3)*nao+(l0+0)]; + val += gout21 * dm[(i0+3)*nao+(l0+1)]; + val += gout39 * dm[(i0+3)*nao+(l0+2)]; + val += gout4 * dm[(i0+4)*nao+(l0+0)]; + val += gout22 * dm[(i0+4)*nao+(l0+1)]; + val += gout40 * dm[(i0+4)*nao+(l0+2)]; + val += gout5 * dm[(i0+5)*nao+(l0+0)]; + val += gout23 * dm[(i0+5)*nao+(l0+1)]; + val += gout41 * dm[(i0+5)*nao+(l0+2)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + val = 0; + val += gout6 * dm[(i0+0)*nao+(l0+0)]; + val += gout24 * dm[(i0+0)*nao+(l0+1)]; + val += gout42 * dm[(i0+0)*nao+(l0+2)]; + val += gout7 * dm[(i0+1)*nao+(l0+0)]; + val += gout25 * dm[(i0+1)*nao+(l0+1)]; + val += gout43 * dm[(i0+1)*nao+(l0+2)]; + val += gout8 * dm[(i0+2)*nao+(l0+0)]; + val += gout26 * dm[(i0+2)*nao+(l0+1)]; + val += gout44 * dm[(i0+2)*nao+(l0+2)]; + val += gout9 * dm[(i0+3)*nao+(l0+0)]; + val += gout27 * dm[(i0+3)*nao+(l0+1)]; + val += gout45 * dm[(i0+3)*nao+(l0+2)]; + val += gout10 * dm[(i0+4)*nao+(l0+0)]; + val += gout28 * dm[(i0+4)*nao+(l0+1)]; + val += gout46 * dm[(i0+4)*nao+(l0+2)]; + val += gout11 * dm[(i0+5)*nao+(l0+0)]; + val += gout29 * dm[(i0+5)*nao+(l0+1)]; + val += gout47 * dm[(i0+5)*nao+(l0+2)]; + atomicAdd(vk+(j0+0)*nao+(k0+1), val); + val = 0; + val += gout12 * dm[(i0+0)*nao+(l0+0)]; + val += gout30 * dm[(i0+0)*nao+(l0+1)]; + val += gout48 * dm[(i0+0)*nao+(l0+2)]; + val += gout13 * dm[(i0+1)*nao+(l0+0)]; + val += gout31 * dm[(i0+1)*nao+(l0+1)]; + val += gout49 * dm[(i0+1)*nao+(l0+2)]; + val += gout14 * dm[(i0+2)*nao+(l0+0)]; + val += gout32 * dm[(i0+2)*nao+(l0+1)]; + val += gout50 * dm[(i0+2)*nao+(l0+2)]; + val += gout15 * dm[(i0+3)*nao+(l0+0)]; + val += gout33 * dm[(i0+3)*nao+(l0+1)]; + val += gout51 * dm[(i0+3)*nao+(l0+2)]; + val += gout16 * dm[(i0+4)*nao+(l0+0)]; + val += gout34 * dm[(i0+4)*nao+(l0+1)]; + val += gout52 * dm[(i0+4)*nao+(l0+2)]; + val += gout17 * dm[(i0+5)*nao+(l0+0)]; + val += gout35 * dm[(i0+5)*nao+(l0+1)]; + val += gout53 * dm[(i0+5)*nao+(l0+2)]; + atomicAdd(vk+(j0+0)*nao+(k0+2), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +__global__ +void rys_jk_2011(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_jk_2011(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_sr_jk_2011(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double gout3; + double gout4; + double gout5; + double gout6; + double gout7; + double gout8; + double gout9; + double gout10; + double gout11; + double gout12; + double gout13; + double gout14; + double gout15; + double gout16; + double gout17; + double gout18; + double gout19; + double gout20; + double gout21; + double gout22; + double gout23; + double gout24; + double gout25; + double gout26; + double gout27; + double gout28; + double gout29; + double gout30; + double gout31; + double gout32; + double gout33; + double gout34; + double gout35; + double gout36; + double gout37; + double gout38; + double gout39; + double gout40; + double gout41; + double gout42; + double gout43; + double gout44; + double gout45; + double gout46; + double gout47; + double gout48; + double gout49; + double gout50; + double gout51; + double gout52; + double gout53; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + gout3 = 0; + gout4 = 0; + gout5 = 0; + gout6 = 0; + gout7 = 0; + gout8 = 0; + gout9 = 0; + gout10 = 0; + gout11 = 0; + gout12 = 0; + gout13 = 0; + gout14 = 0; + gout15 = 0; + gout16 = 0; + gout17 = 0; + gout18 = 0; + gout19 = 0; + gout20 = 0; + gout21 = 0; + gout22 = 0; + gout23 = 0; + gout24 = 0; + gout25 = 0; + gout26 = 0; + gout27 = 0; + gout28 = 0; + gout29 = 0; + gout30 = 0; + gout31 = 0; + gout32 = 0; + gout33 = 0; + gout34 = 0; + gout35 = 0; + gout36 = 0; + gout37 = 0; + gout38 = 0; + gout39 = 0; + gout40 = 0; + gout41 = 0; + gout42 = 0; + gout43 = 0; + gout44 = 0; + gout45 = 0; + gout46 = 0; + gout47 = 0; + gout48 = 0; + gout49 = 0; + gout50 = 0; + gout51 = 0; + gout52 = 0; + gout53 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + rys_roots(3, theta_rr, rw+6*nsq_per_block); + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(3, theta_fac*theta_rr, rw); + double sqrt_theta_fac = -sqrt(theta_fac); + for (int irys = 0; irys < 3; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + rw[sq_id+(irys*2+1)*nsq_per_block] *= sqrt_theta_fac; + } + if (task_id < ntasks) { + for (int irys = 0; irys < 6; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double b00 = .5 * rt_aa; + double rt_akl = rt_aa * aij; + double b01 = .5/akl * (1 - rt_akl); + double cpx = xqc + xpq*rt_akl; + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + double trr_21x = cpx * trr_20x + 2*b00 * trr_10x; + double trr_11x = cpx * trr_10x + 1*b00 * fac; + double trr_22x = cpx * trr_21x + 1*b01 * trr_20x + 2*b00 * trr_11x; + double hrr_2011x = trr_22x - xlxk * trr_21x; + gout0 += hrr_2011x * 1 * wt; + double trr_01x = cpx * fac; + double trr_12x = cpx * trr_11x + 1*b01 * trr_10x + 1*b00 * trr_01x; + double hrr_1011x = trr_12x - xlxk * trr_11x; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += hrr_1011x * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += hrr_1011x * 1 * trr_10z; + double trr_02x = cpx * trr_01x + 1*b01 * fac; + double hrr_0011x = trr_02x - xlxk * trr_01x; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + gout3 += hrr_0011x * trr_20y * wt; + gout4 += hrr_0011x * trr_10y * trr_10z; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + gout5 += hrr_0011x * 1 * trr_20z; + double hrr_2001x = trr_21x - xlxk * trr_20x; + double cpy = yqc + ypq*rt_akl; + double trr_01y = cpy * 1; + gout6 += hrr_2001x * trr_01y * wt; + double hrr_1001x = trr_11x - xlxk * trr_10x; + double trr_11y = cpy * trr_10y + 1*b00 * 1; + gout7 += hrr_1001x * trr_11y * wt; + gout8 += hrr_1001x * trr_01y * trr_10z; + double hrr_0001x = trr_01x - xlxk * fac; + double trr_21y = cpy * trr_20y + 2*b00 * trr_10y; + gout9 += hrr_0001x * trr_21y * wt; + gout10 += hrr_0001x * trr_11y * trr_10z; + gout11 += hrr_0001x * trr_01y * trr_20z; + double cpz = zqc + zpq*rt_akl; + double trr_01z = cpz * wt; + gout12 += hrr_2001x * 1 * trr_01z; + gout13 += hrr_1001x * trr_10y * trr_01z; + double trr_11z = cpz * trr_10z + 1*b00 * wt; + gout14 += hrr_1001x * 1 * trr_11z; + gout15 += hrr_0001x * trr_20y * trr_01z; + gout16 += hrr_0001x * trr_10y * trr_11z; + double trr_21z = cpz * trr_20z + 2*b00 * trr_10z; + gout17 += hrr_0001x * 1 * trr_21z; + double hrr_0001y = trr_01y - ylyk * 1; + gout18 += trr_21x * hrr_0001y * wt; + double hrr_1001y = trr_11y - ylyk * trr_10y; + gout19 += trr_11x * hrr_1001y * wt; + gout20 += trr_11x * hrr_0001y * trr_10z; + double hrr_2001y = trr_21y - ylyk * trr_20y; + gout21 += trr_01x * hrr_2001y * wt; + gout22 += trr_01x * hrr_1001y * trr_10z; + gout23 += trr_01x * hrr_0001y * trr_20z; + double trr_02y = cpy * trr_01y + 1*b01 * 1; + double hrr_0011y = trr_02y - ylyk * trr_01y; + gout24 += trr_20x * hrr_0011y * wt; + double trr_12y = cpy * trr_11y + 1*b01 * trr_10y + 1*b00 * trr_01y; + double hrr_1011y = trr_12y - ylyk * trr_11y; + gout25 += trr_10x * hrr_1011y * wt; + gout26 += trr_10x * hrr_0011y * trr_10z; + double trr_22y = cpy * trr_21y + 1*b01 * trr_20y + 2*b00 * trr_11y; + double hrr_2011y = trr_22y - ylyk * trr_21y; + gout27 += fac * hrr_2011y * wt; + gout28 += fac * hrr_1011y * trr_10z; + gout29 += fac * hrr_0011y * trr_20z; + gout30 += trr_20x * hrr_0001y * trr_01z; + gout31 += trr_10x * hrr_1001y * trr_01z; + gout32 += trr_10x * hrr_0001y * trr_11z; + gout33 += fac * hrr_2001y * trr_01z; + gout34 += fac * hrr_1001y * trr_11z; + gout35 += fac * hrr_0001y * trr_21z; + double hrr_0001z = trr_01z - zlzk * wt; + gout36 += trr_21x * 1 * hrr_0001z; + gout37 += trr_11x * trr_10y * hrr_0001z; + double hrr_1001z = trr_11z - zlzk * trr_10z; + gout38 += trr_11x * 1 * hrr_1001z; + gout39 += trr_01x * trr_20y * hrr_0001z; + gout40 += trr_01x * trr_10y * hrr_1001z; + double hrr_2001z = trr_21z - zlzk * trr_20z; + gout41 += trr_01x * 1 * hrr_2001z; + gout42 += trr_20x * trr_01y * hrr_0001z; + gout43 += trr_10x * trr_11y * hrr_0001z; + gout44 += trr_10x * trr_01y * hrr_1001z; + gout45 += fac * trr_21y * hrr_0001z; + gout46 += fac * trr_11y * hrr_1001z; + gout47 += fac * trr_01y * hrr_2001z; + double trr_02z = cpz * trr_01z + 1*b01 * wt; + double hrr_0011z = trr_02z - zlzk * trr_01z; + gout48 += trr_20x * 1 * hrr_0011z; + gout49 += trr_10x * trr_10y * hrr_0011z; + double trr_12z = cpz * trr_11z + 1*b01 * trr_10z + 1*b00 * trr_01z; + double hrr_1011z = trr_12z - zlzk * trr_11z; + gout50 += trr_10x * 1 * hrr_1011z; + gout51 += fac * trr_20y * hrr_0011z; + gout52 += fac * trr_10y * hrr_1011z; + double trr_22z = cpz * trr_21z + 1*b01 * trr_20z + 2*b00 * trr_11z; + double hrr_2011z = trr_22z - zlzk * trr_21z; + gout53 += fac * 1 * hrr_2011z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + val += gout6 * dm[(l0+0)*nao+(k0+1)]; + val += gout12 * dm[(l0+0)*nao+(k0+2)]; + val += gout18 * dm[(l0+1)*nao+(k0+0)]; + val += gout24 * dm[(l0+1)*nao+(k0+1)]; + val += gout30 * dm[(l0+1)*nao+(k0+2)]; + val += gout36 * dm[(l0+2)*nao+(k0+0)]; + val += gout42 * dm[(l0+2)*nao+(k0+1)]; + val += gout48 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + val += gout7 * dm[(l0+0)*nao+(k0+1)]; + val += gout13 * dm[(l0+0)*nao+(k0+2)]; + val += gout19 * dm[(l0+1)*nao+(k0+0)]; + val += gout25 * dm[(l0+1)*nao+(k0+1)]; + val += gout31 * dm[(l0+1)*nao+(k0+2)]; + val += gout37 * dm[(l0+2)*nao+(k0+0)]; + val += gout43 * dm[(l0+2)*nao+(k0+1)]; + val += gout49 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + val += gout8 * dm[(l0+0)*nao+(k0+1)]; + val += gout14 * dm[(l0+0)*nao+(k0+2)]; + val += gout20 * dm[(l0+1)*nao+(k0+0)]; + val += gout26 * dm[(l0+1)*nao+(k0+1)]; + val += gout32 * dm[(l0+1)*nao+(k0+2)]; + val += gout38 * dm[(l0+2)*nao+(k0+0)]; + val += gout44 * dm[(l0+2)*nao+(k0+1)]; + val += gout50 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout3 * dm[(l0+0)*nao+(k0+0)]; + val += gout9 * dm[(l0+0)*nao+(k0+1)]; + val += gout15 * dm[(l0+0)*nao+(k0+2)]; + val += gout21 * dm[(l0+1)*nao+(k0+0)]; + val += gout27 * dm[(l0+1)*nao+(k0+1)]; + val += gout33 * dm[(l0+1)*nao+(k0+2)]; + val += gout39 * dm[(l0+2)*nao+(k0+0)]; + val += gout45 * dm[(l0+2)*nao+(k0+1)]; + val += gout51 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+3)*nao+(j0+0), val); + val = 0; + val += gout4 * dm[(l0+0)*nao+(k0+0)]; + val += gout10 * dm[(l0+0)*nao+(k0+1)]; + val += gout16 * dm[(l0+0)*nao+(k0+2)]; + val += gout22 * dm[(l0+1)*nao+(k0+0)]; + val += gout28 * dm[(l0+1)*nao+(k0+1)]; + val += gout34 * dm[(l0+1)*nao+(k0+2)]; + val += gout40 * dm[(l0+2)*nao+(k0+0)]; + val += gout46 * dm[(l0+2)*nao+(k0+1)]; + val += gout52 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+4)*nao+(j0+0), val); + val = 0; + val += gout5 * dm[(l0+0)*nao+(k0+0)]; + val += gout11 * dm[(l0+0)*nao+(k0+1)]; + val += gout17 * dm[(l0+0)*nao+(k0+2)]; + val += gout23 * dm[(l0+1)*nao+(k0+0)]; + val += gout29 * dm[(l0+1)*nao+(k0+1)]; + val += gout35 * dm[(l0+1)*nao+(k0+2)]; + val += gout41 * dm[(l0+2)*nao+(k0+0)]; + val += gout47 * dm[(l0+2)*nao+(k0+1)]; + val += gout53 * dm[(l0+2)*nao+(k0+2)]; + atomicAdd(vj+(i0+5)*nao+(j0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + val += gout3 * dm[(j0+0)*nao+(i0+3)]; + val += gout4 * dm[(j0+0)*nao+(i0+4)]; + val += gout5 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(i0+0)]; + val += gout7 * dm[(j0+0)*nao+(i0+1)]; + val += gout8 * dm[(j0+0)*nao+(i0+2)]; + val += gout9 * dm[(j0+0)*nao+(i0+3)]; + val += gout10 * dm[(j0+0)*nao+(i0+4)]; + val += gout11 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+1)*nao+(l0+0), val); + val = 0; + val += gout12 * dm[(j0+0)*nao+(i0+0)]; + val += gout13 * dm[(j0+0)*nao+(i0+1)]; + val += gout14 * dm[(j0+0)*nao+(i0+2)]; + val += gout15 * dm[(j0+0)*nao+(i0+3)]; + val += gout16 * dm[(j0+0)*nao+(i0+4)]; + val += gout17 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+2)*nao+(l0+0), val); + val = 0; + val += gout18 * dm[(j0+0)*nao+(i0+0)]; + val += gout19 * dm[(j0+0)*nao+(i0+1)]; + val += gout20 * dm[(j0+0)*nao+(i0+2)]; + val += gout21 * dm[(j0+0)*nao+(i0+3)]; + val += gout22 * dm[(j0+0)*nao+(i0+4)]; + val += gout23 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+0)*nao+(l0+1), val); + val = 0; + val += gout24 * dm[(j0+0)*nao+(i0+0)]; + val += gout25 * dm[(j0+0)*nao+(i0+1)]; + val += gout26 * dm[(j0+0)*nao+(i0+2)]; + val += gout27 * dm[(j0+0)*nao+(i0+3)]; + val += gout28 * dm[(j0+0)*nao+(i0+4)]; + val += gout29 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+1)*nao+(l0+1), val); + val = 0; + val += gout30 * dm[(j0+0)*nao+(i0+0)]; + val += gout31 * dm[(j0+0)*nao+(i0+1)]; + val += gout32 * dm[(j0+0)*nao+(i0+2)]; + val += gout33 * dm[(j0+0)*nao+(i0+3)]; + val += gout34 * dm[(j0+0)*nao+(i0+4)]; + val += gout35 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+2)*nao+(l0+1), val); + val = 0; + val += gout36 * dm[(j0+0)*nao+(i0+0)]; + val += gout37 * dm[(j0+0)*nao+(i0+1)]; + val += gout38 * dm[(j0+0)*nao+(i0+2)]; + val += gout39 * dm[(j0+0)*nao+(i0+3)]; + val += gout40 * dm[(j0+0)*nao+(i0+4)]; + val += gout41 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+0)*nao+(l0+2), val); + val = 0; + val += gout42 * dm[(j0+0)*nao+(i0+0)]; + val += gout43 * dm[(j0+0)*nao+(i0+1)]; + val += gout44 * dm[(j0+0)*nao+(i0+2)]; + val += gout45 * dm[(j0+0)*nao+(i0+3)]; + val += gout46 * dm[(j0+0)*nao+(i0+4)]; + val += gout47 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+1)*nao+(l0+2), val); + val = 0; + val += gout48 * dm[(j0+0)*nao+(i0+0)]; + val += gout49 * dm[(j0+0)*nao+(i0+1)]; + val += gout50 * dm[(j0+0)*nao+(i0+2)]; + val += gout51 * dm[(j0+0)*nao+(i0+3)]; + val += gout52 * dm[(j0+0)*nao+(i0+4)]; + val += gout53 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+2)*nao+(l0+2), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + val += gout6 * dm[(j0+0)*nao+(k0+1)]; + val += gout12 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout18 * dm[(j0+0)*nao+(k0+0)]; + val += gout24 * dm[(j0+0)*nao+(k0+1)]; + val += gout30 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+0)*nao+(l0+1), val); + val = 0; + val += gout36 * dm[(j0+0)*nao+(k0+0)]; + val += gout42 * dm[(j0+0)*nao+(k0+1)]; + val += gout48 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+0)*nao+(l0+2), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + val += gout7 * dm[(j0+0)*nao+(k0+1)]; + val += gout13 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout19 * dm[(j0+0)*nao+(k0+0)]; + val += gout25 * dm[(j0+0)*nao+(k0+1)]; + val += gout31 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+1)*nao+(l0+1), val); + val = 0; + val += gout37 * dm[(j0+0)*nao+(k0+0)]; + val += gout43 * dm[(j0+0)*nao+(k0+1)]; + val += gout49 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+1)*nao+(l0+2), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + val += gout8 * dm[(j0+0)*nao+(k0+1)]; + val += gout14 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout20 * dm[(j0+0)*nao+(k0+0)]; + val += gout26 * dm[(j0+0)*nao+(k0+1)]; + val += gout32 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+2)*nao+(l0+1), val); + val = 0; + val += gout38 * dm[(j0+0)*nao+(k0+0)]; + val += gout44 * dm[(j0+0)*nao+(k0+1)]; + val += gout50 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+2)*nao+(l0+2), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(k0+0)]; + val += gout9 * dm[(j0+0)*nao+(k0+1)]; + val += gout15 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+3)*nao+(l0+0), val); + val = 0; + val += gout21 * dm[(j0+0)*nao+(k0+0)]; + val += gout27 * dm[(j0+0)*nao+(k0+1)]; + val += gout33 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+3)*nao+(l0+1), val); + val = 0; + val += gout39 * dm[(j0+0)*nao+(k0+0)]; + val += gout45 * dm[(j0+0)*nao+(k0+1)]; + val += gout51 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+3)*nao+(l0+2), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(k0+0)]; + val += gout10 * dm[(j0+0)*nao+(k0+1)]; + val += gout16 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+4)*nao+(l0+0), val); + val = 0; + val += gout22 * dm[(j0+0)*nao+(k0+0)]; + val += gout28 * dm[(j0+0)*nao+(k0+1)]; + val += gout34 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+4)*nao+(l0+1), val); + val = 0; + val += gout40 * dm[(j0+0)*nao+(k0+0)]; + val += gout46 * dm[(j0+0)*nao+(k0+1)]; + val += gout52 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+4)*nao+(l0+2), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(k0+0)]; + val += gout11 * dm[(j0+0)*nao+(k0+1)]; + val += gout17 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+5)*nao+(l0+0), val); + val = 0; + val += gout23 * dm[(j0+0)*nao+(k0+0)]; + val += gout29 * dm[(j0+0)*nao+(k0+1)]; + val += gout35 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+5)*nao+(l0+1), val); + val = 0; + val += gout41 * dm[(j0+0)*nao+(k0+0)]; + val += gout47 * dm[(j0+0)*nao+(k0+1)]; + val += gout53 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+5)*nao+(l0+2), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout6 * dm[(i0+0)*nao+(k0+1)]; + val += gout12 * dm[(i0+0)*nao+(k0+2)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout7 * dm[(i0+1)*nao+(k0+1)]; + val += gout13 * dm[(i0+1)*nao+(k0+2)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + val += gout8 * dm[(i0+2)*nao+(k0+1)]; + val += gout14 * dm[(i0+2)*nao+(k0+2)]; + val += gout3 * dm[(i0+3)*nao+(k0+0)]; + val += gout9 * dm[(i0+3)*nao+(k0+1)]; + val += gout15 * dm[(i0+3)*nao+(k0+2)]; + val += gout4 * dm[(i0+4)*nao+(k0+0)]; + val += gout10 * dm[(i0+4)*nao+(k0+1)]; + val += gout16 * dm[(i0+4)*nao+(k0+2)]; + val += gout5 * dm[(i0+5)*nao+(k0+0)]; + val += gout11 * dm[(i0+5)*nao+(k0+1)]; + val += gout17 * dm[(i0+5)*nao+(k0+2)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout18 * dm[(i0+0)*nao+(k0+0)]; + val += gout24 * dm[(i0+0)*nao+(k0+1)]; + val += gout30 * dm[(i0+0)*nao+(k0+2)]; + val += gout19 * dm[(i0+1)*nao+(k0+0)]; + val += gout25 * dm[(i0+1)*nao+(k0+1)]; + val += gout31 * dm[(i0+1)*nao+(k0+2)]; + val += gout20 * dm[(i0+2)*nao+(k0+0)]; + val += gout26 * dm[(i0+2)*nao+(k0+1)]; + val += gout32 * dm[(i0+2)*nao+(k0+2)]; + val += gout21 * dm[(i0+3)*nao+(k0+0)]; + val += gout27 * dm[(i0+3)*nao+(k0+1)]; + val += gout33 * dm[(i0+3)*nao+(k0+2)]; + val += gout22 * dm[(i0+4)*nao+(k0+0)]; + val += gout28 * dm[(i0+4)*nao+(k0+1)]; + val += gout34 * dm[(i0+4)*nao+(k0+2)]; + val += gout23 * dm[(i0+5)*nao+(k0+0)]; + val += gout29 * dm[(i0+5)*nao+(k0+1)]; + val += gout35 * dm[(i0+5)*nao+(k0+2)]; + atomicAdd(vk+(j0+0)*nao+(l0+1), val); + val = 0; + val += gout36 * dm[(i0+0)*nao+(k0+0)]; + val += gout42 * dm[(i0+0)*nao+(k0+1)]; + val += gout48 * dm[(i0+0)*nao+(k0+2)]; + val += gout37 * dm[(i0+1)*nao+(k0+0)]; + val += gout43 * dm[(i0+1)*nao+(k0+1)]; + val += gout49 * dm[(i0+1)*nao+(k0+2)]; + val += gout38 * dm[(i0+2)*nao+(k0+0)]; + val += gout44 * dm[(i0+2)*nao+(k0+1)]; + val += gout50 * dm[(i0+2)*nao+(k0+2)]; + val += gout39 * dm[(i0+3)*nao+(k0+0)]; + val += gout45 * dm[(i0+3)*nao+(k0+1)]; + val += gout51 * dm[(i0+3)*nao+(k0+2)]; + val += gout40 * dm[(i0+4)*nao+(k0+0)]; + val += gout46 * dm[(i0+4)*nao+(k0+1)]; + val += gout52 * dm[(i0+4)*nao+(k0+2)]; + val += gout41 * dm[(i0+5)*nao+(k0+0)]; + val += gout47 * dm[(i0+5)*nao+(k0+1)]; + val += gout53 * dm[(i0+5)*nao+(k0+2)]; + atomicAdd(vk+(j0+0)*nao+(l0+2), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + val += gout18 * dm[(j0+0)*nao+(l0+1)]; + val += gout36 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(l0+0)]; + val += gout24 * dm[(j0+0)*nao+(l0+1)]; + val += gout42 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+0)*nao+(k0+1), val); + val = 0; + val += gout12 * dm[(j0+0)*nao+(l0+0)]; + val += gout30 * dm[(j0+0)*nao+(l0+1)]; + val += gout48 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+0)*nao+(k0+2), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + val += gout19 * dm[(j0+0)*nao+(l0+1)]; + val += gout37 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout7 * dm[(j0+0)*nao+(l0+0)]; + val += gout25 * dm[(j0+0)*nao+(l0+1)]; + val += gout43 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+1)*nao+(k0+1), val); + val = 0; + val += gout13 * dm[(j0+0)*nao+(l0+0)]; + val += gout31 * dm[(j0+0)*nao+(l0+1)]; + val += gout49 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+1)*nao+(k0+2), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + val += gout20 * dm[(j0+0)*nao+(l0+1)]; + val += gout38 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout8 * dm[(j0+0)*nao+(l0+0)]; + val += gout26 * dm[(j0+0)*nao+(l0+1)]; + val += gout44 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+2)*nao+(k0+1), val); + val = 0; + val += gout14 * dm[(j0+0)*nao+(l0+0)]; + val += gout32 * dm[(j0+0)*nao+(l0+1)]; + val += gout50 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+2)*nao+(k0+2), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(l0+0)]; + val += gout21 * dm[(j0+0)*nao+(l0+1)]; + val += gout39 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+3)*nao+(k0+0), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(l0+0)]; + val += gout27 * dm[(j0+0)*nao+(l0+1)]; + val += gout45 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+3)*nao+(k0+1), val); + val = 0; + val += gout15 * dm[(j0+0)*nao+(l0+0)]; + val += gout33 * dm[(j0+0)*nao+(l0+1)]; + val += gout51 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+3)*nao+(k0+2), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(l0+0)]; + val += gout22 * dm[(j0+0)*nao+(l0+1)]; + val += gout40 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+4)*nao+(k0+0), val); + val = 0; + val += gout10 * dm[(j0+0)*nao+(l0+0)]; + val += gout28 * dm[(j0+0)*nao+(l0+1)]; + val += gout46 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+4)*nao+(k0+1), val); + val = 0; + val += gout16 * dm[(j0+0)*nao+(l0+0)]; + val += gout34 * dm[(j0+0)*nao+(l0+1)]; + val += gout52 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+4)*nao+(k0+2), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(l0+0)]; + val += gout23 * dm[(j0+0)*nao+(l0+1)]; + val += gout41 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+5)*nao+(k0+0), val); + val = 0; + val += gout11 * dm[(j0+0)*nao+(l0+0)]; + val += gout29 * dm[(j0+0)*nao+(l0+1)]; + val += gout47 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+5)*nao+(k0+1), val); + val = 0; + val += gout17 * dm[(j0+0)*nao+(l0+0)]; + val += gout35 * dm[(j0+0)*nao+(l0+1)]; + val += gout53 * dm[(j0+0)*nao+(l0+2)]; + atomicAdd(vk+(i0+5)*nao+(k0+2), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout18 * dm[(i0+0)*nao+(l0+1)]; + val += gout36 * dm[(i0+0)*nao+(l0+2)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout19 * dm[(i0+1)*nao+(l0+1)]; + val += gout37 * dm[(i0+1)*nao+(l0+2)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + val += gout20 * dm[(i0+2)*nao+(l0+1)]; + val += gout38 * dm[(i0+2)*nao+(l0+2)]; + val += gout3 * dm[(i0+3)*nao+(l0+0)]; + val += gout21 * dm[(i0+3)*nao+(l0+1)]; + val += gout39 * dm[(i0+3)*nao+(l0+2)]; + val += gout4 * dm[(i0+4)*nao+(l0+0)]; + val += gout22 * dm[(i0+4)*nao+(l0+1)]; + val += gout40 * dm[(i0+4)*nao+(l0+2)]; + val += gout5 * dm[(i0+5)*nao+(l0+0)]; + val += gout23 * dm[(i0+5)*nao+(l0+1)]; + val += gout41 * dm[(i0+5)*nao+(l0+2)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + val = 0; + val += gout6 * dm[(i0+0)*nao+(l0+0)]; + val += gout24 * dm[(i0+0)*nao+(l0+1)]; + val += gout42 * dm[(i0+0)*nao+(l0+2)]; + val += gout7 * dm[(i0+1)*nao+(l0+0)]; + val += gout25 * dm[(i0+1)*nao+(l0+1)]; + val += gout43 * dm[(i0+1)*nao+(l0+2)]; + val += gout8 * dm[(i0+2)*nao+(l0+0)]; + val += gout26 * dm[(i0+2)*nao+(l0+1)]; + val += gout44 * dm[(i0+2)*nao+(l0+2)]; + val += gout9 * dm[(i0+3)*nao+(l0+0)]; + val += gout27 * dm[(i0+3)*nao+(l0+1)]; + val += gout45 * dm[(i0+3)*nao+(l0+2)]; + val += gout10 * dm[(i0+4)*nao+(l0+0)]; + val += gout28 * dm[(i0+4)*nao+(l0+1)]; + val += gout46 * dm[(i0+4)*nao+(l0+2)]; + val += gout11 * dm[(i0+5)*nao+(l0+0)]; + val += gout29 * dm[(i0+5)*nao+(l0+1)]; + val += gout47 * dm[(i0+5)*nao+(l0+2)]; + atomicAdd(vk+(j0+0)*nao+(k0+1), val); + val = 0; + val += gout12 * dm[(i0+0)*nao+(l0+0)]; + val += gout30 * dm[(i0+0)*nao+(l0+1)]; + val += gout48 * dm[(i0+0)*nao+(l0+2)]; + val += gout13 * dm[(i0+1)*nao+(l0+0)]; + val += gout31 * dm[(i0+1)*nao+(l0+1)]; + val += gout49 * dm[(i0+1)*nao+(l0+2)]; + val += gout14 * dm[(i0+2)*nao+(l0+0)]; + val += gout32 * dm[(i0+2)*nao+(l0+1)]; + val += gout50 * dm[(i0+2)*nao+(l0+2)]; + val += gout15 * dm[(i0+3)*nao+(l0+0)]; + val += gout33 * dm[(i0+3)*nao+(l0+1)]; + val += gout51 * dm[(i0+3)*nao+(l0+2)]; + val += gout16 * dm[(i0+4)*nao+(l0+0)]; + val += gout34 * dm[(i0+4)*nao+(l0+1)]; + val += gout52 * dm[(i0+4)*nao+(l0+2)]; + val += gout17 * dm[(i0+5)*nao+(l0+0)]; + val += gout35 * dm[(i0+5)*nao+(l0+1)]; + val += gout53 * dm[(i0+5)*nao+(l0+2)]; + atomicAdd(vk+(j0+0)*nao+(k0+2), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +__global__ +void rys_sr_jk_2011(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_sr_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_sr_jk_2011(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_jk_2020(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double gout3; + double gout4; + double gout5; + double gout6; + double gout7; + double gout8; + double gout9; + double gout10; + double gout11; + double gout12; + double gout13; + double gout14; + double gout15; + double gout16; + double gout17; + double gout18; + double gout19; + double gout20; + double gout21; + double gout22; + double gout23; + double gout24; + double gout25; + double gout26; + double gout27; + double gout28; + double gout29; + double gout30; + double gout31; + double gout32; + double gout33; + double gout34; + double gout35; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + gout3 = 0; + gout4 = 0; + gout5 = 0; + gout6 = 0; + gout7 = 0; + gout8 = 0; + gout9 = 0; + gout10 = 0; + gout11 = 0; + gout12 = 0; + gout13 = 0; + gout14 = 0; + gout15 = 0; + gout16 = 0; + gout17 = 0; + gout18 = 0; + gout19 = 0; + gout20 = 0; + gout21 = 0; + gout22 = 0; + gout23 = 0; + gout24 = 0; + gout25 = 0; + gout26 = 0; + gout27 = 0; + gout28 = 0; + gout29 = 0; + gout30 = 0; + gout31 = 0; + gout32 = 0; + gout33 = 0; + gout34 = 0; + gout35 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(3, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(3, theta_fac*theta_rr, rw); + fac *= sqrt(theta_fac); + for (int irys = 0; irys < 3; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + } + } + if (task_id < ntasks) { + for (int irys = 0; irys < 3; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double b00 = .5 * rt_aa; + double rt_akl = rt_aa * aij; + double b01 = .5/akl * (1 - rt_akl); + double cpx = xqc + xpq*rt_akl; + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + double trr_21x = cpx * trr_20x + 2*b00 * trr_10x; + double trr_11x = cpx * trr_10x + 1*b00 * fac; + double trr_22x = cpx * trr_21x + 1*b01 * trr_20x + 2*b00 * trr_11x; + gout0 += trr_22x * 1 * wt; + double trr_01x = cpx * fac; + double trr_12x = cpx * trr_11x + 1*b01 * trr_10x + 1*b00 * trr_01x; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += trr_12x * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += trr_12x * 1 * trr_10z; + double trr_02x = cpx * trr_01x + 1*b01 * fac; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + gout3 += trr_02x * trr_20y * wt; + gout4 += trr_02x * trr_10y * trr_10z; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + gout5 += trr_02x * 1 * trr_20z; + double cpy = yqc + ypq*rt_akl; + double trr_01y = cpy * 1; + gout6 += trr_21x * trr_01y * wt; + double trr_11y = cpy * trr_10y + 1*b00 * 1; + gout7 += trr_11x * trr_11y * wt; + gout8 += trr_11x * trr_01y * trr_10z; + double trr_21y = cpy * trr_20y + 2*b00 * trr_10y; + gout9 += trr_01x * trr_21y * wt; + gout10 += trr_01x * trr_11y * trr_10z; + gout11 += trr_01x * trr_01y * trr_20z; + double cpz = zqc + zpq*rt_akl; + double trr_01z = cpz * wt; + gout12 += trr_21x * 1 * trr_01z; + gout13 += trr_11x * trr_10y * trr_01z; + double trr_11z = cpz * trr_10z + 1*b00 * wt; + gout14 += trr_11x * 1 * trr_11z; + gout15 += trr_01x * trr_20y * trr_01z; + gout16 += trr_01x * trr_10y * trr_11z; + double trr_21z = cpz * trr_20z + 2*b00 * trr_10z; + gout17 += trr_01x * 1 * trr_21z; + double trr_02y = cpy * trr_01y + 1*b01 * 1; + gout18 += trr_20x * trr_02y * wt; + double trr_12y = cpy * trr_11y + 1*b01 * trr_10y + 1*b00 * trr_01y; + gout19 += trr_10x * trr_12y * wt; + gout20 += trr_10x * trr_02y * trr_10z; + double trr_22y = cpy * trr_21y + 1*b01 * trr_20y + 2*b00 * trr_11y; + gout21 += fac * trr_22y * wt; + gout22 += fac * trr_12y * trr_10z; + gout23 += fac * trr_02y * trr_20z; + gout24 += trr_20x * trr_01y * trr_01z; + gout25 += trr_10x * trr_11y * trr_01z; + gout26 += trr_10x * trr_01y * trr_11z; + gout27 += fac * trr_21y * trr_01z; + gout28 += fac * trr_11y * trr_11z; + gout29 += fac * trr_01y * trr_21z; + double trr_02z = cpz * trr_01z + 1*b01 * wt; + gout30 += trr_20x * 1 * trr_02z; + gout31 += trr_10x * trr_10y * trr_02z; + double trr_12z = cpz * trr_11z + 1*b01 * trr_10z + 1*b00 * trr_01z; + gout32 += trr_10x * 1 * trr_12z; + gout33 += fac * trr_20y * trr_02z; + gout34 += fac * trr_10y * trr_12z; + double trr_22z = cpz * trr_21z + 1*b01 * trr_20z + 2*b00 * trr_11z; + gout35 += fac * 1 * trr_22z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + val += gout6 * dm[(l0+0)*nao+(k0+1)]; + val += gout12 * dm[(l0+0)*nao+(k0+2)]; + val += gout18 * dm[(l0+0)*nao+(k0+3)]; + val += gout24 * dm[(l0+0)*nao+(k0+4)]; + val += gout30 * dm[(l0+0)*nao+(k0+5)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + val += gout7 * dm[(l0+0)*nao+(k0+1)]; + val += gout13 * dm[(l0+0)*nao+(k0+2)]; + val += gout19 * dm[(l0+0)*nao+(k0+3)]; + val += gout25 * dm[(l0+0)*nao+(k0+4)]; + val += gout31 * dm[(l0+0)*nao+(k0+5)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + val += gout8 * dm[(l0+0)*nao+(k0+1)]; + val += gout14 * dm[(l0+0)*nao+(k0+2)]; + val += gout20 * dm[(l0+0)*nao+(k0+3)]; + val += gout26 * dm[(l0+0)*nao+(k0+4)]; + val += gout32 * dm[(l0+0)*nao+(k0+5)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout3 * dm[(l0+0)*nao+(k0+0)]; + val += gout9 * dm[(l0+0)*nao+(k0+1)]; + val += gout15 * dm[(l0+0)*nao+(k0+2)]; + val += gout21 * dm[(l0+0)*nao+(k0+3)]; + val += gout27 * dm[(l0+0)*nao+(k0+4)]; + val += gout33 * dm[(l0+0)*nao+(k0+5)]; + atomicAdd(vj+(i0+3)*nao+(j0+0), val); + val = 0; + val += gout4 * dm[(l0+0)*nao+(k0+0)]; + val += gout10 * dm[(l0+0)*nao+(k0+1)]; + val += gout16 * dm[(l0+0)*nao+(k0+2)]; + val += gout22 * dm[(l0+0)*nao+(k0+3)]; + val += gout28 * dm[(l0+0)*nao+(k0+4)]; + val += gout34 * dm[(l0+0)*nao+(k0+5)]; + atomicAdd(vj+(i0+4)*nao+(j0+0), val); + val = 0; + val += gout5 * dm[(l0+0)*nao+(k0+0)]; + val += gout11 * dm[(l0+0)*nao+(k0+1)]; + val += gout17 * dm[(l0+0)*nao+(k0+2)]; + val += gout23 * dm[(l0+0)*nao+(k0+3)]; + val += gout29 * dm[(l0+0)*nao+(k0+4)]; + val += gout35 * dm[(l0+0)*nao+(k0+5)]; + atomicAdd(vj+(i0+5)*nao+(j0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + val += gout3 * dm[(j0+0)*nao+(i0+3)]; + val += gout4 * dm[(j0+0)*nao+(i0+4)]; + val += gout5 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(i0+0)]; + val += gout7 * dm[(j0+0)*nao+(i0+1)]; + val += gout8 * dm[(j0+0)*nao+(i0+2)]; + val += gout9 * dm[(j0+0)*nao+(i0+3)]; + val += gout10 * dm[(j0+0)*nao+(i0+4)]; + val += gout11 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+1)*nao+(l0+0), val); + val = 0; + val += gout12 * dm[(j0+0)*nao+(i0+0)]; + val += gout13 * dm[(j0+0)*nao+(i0+1)]; + val += gout14 * dm[(j0+0)*nao+(i0+2)]; + val += gout15 * dm[(j0+0)*nao+(i0+3)]; + val += gout16 * dm[(j0+0)*nao+(i0+4)]; + val += gout17 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+2)*nao+(l0+0), val); + val = 0; + val += gout18 * dm[(j0+0)*nao+(i0+0)]; + val += gout19 * dm[(j0+0)*nao+(i0+1)]; + val += gout20 * dm[(j0+0)*nao+(i0+2)]; + val += gout21 * dm[(j0+0)*nao+(i0+3)]; + val += gout22 * dm[(j0+0)*nao+(i0+4)]; + val += gout23 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+3)*nao+(l0+0), val); + val = 0; + val += gout24 * dm[(j0+0)*nao+(i0+0)]; + val += gout25 * dm[(j0+0)*nao+(i0+1)]; + val += gout26 * dm[(j0+0)*nao+(i0+2)]; + val += gout27 * dm[(j0+0)*nao+(i0+3)]; + val += gout28 * dm[(j0+0)*nao+(i0+4)]; + val += gout29 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+4)*nao+(l0+0), val); + val = 0; + val += gout30 * dm[(j0+0)*nao+(i0+0)]; + val += gout31 * dm[(j0+0)*nao+(i0+1)]; + val += gout32 * dm[(j0+0)*nao+(i0+2)]; + val += gout33 * dm[(j0+0)*nao+(i0+3)]; + val += gout34 * dm[(j0+0)*nao+(i0+4)]; + val += gout35 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+5)*nao+(l0+0), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + val += gout6 * dm[(j0+0)*nao+(k0+1)]; + val += gout12 * dm[(j0+0)*nao+(k0+2)]; + val += gout18 * dm[(j0+0)*nao+(k0+3)]; + val += gout24 * dm[(j0+0)*nao+(k0+4)]; + val += gout30 * dm[(j0+0)*nao+(k0+5)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + val += gout7 * dm[(j0+0)*nao+(k0+1)]; + val += gout13 * dm[(j0+0)*nao+(k0+2)]; + val += gout19 * dm[(j0+0)*nao+(k0+3)]; + val += gout25 * dm[(j0+0)*nao+(k0+4)]; + val += gout31 * dm[(j0+0)*nao+(k0+5)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + val += gout8 * dm[(j0+0)*nao+(k0+1)]; + val += gout14 * dm[(j0+0)*nao+(k0+2)]; + val += gout20 * dm[(j0+0)*nao+(k0+3)]; + val += gout26 * dm[(j0+0)*nao+(k0+4)]; + val += gout32 * dm[(j0+0)*nao+(k0+5)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(k0+0)]; + val += gout9 * dm[(j0+0)*nao+(k0+1)]; + val += gout15 * dm[(j0+0)*nao+(k0+2)]; + val += gout21 * dm[(j0+0)*nao+(k0+3)]; + val += gout27 * dm[(j0+0)*nao+(k0+4)]; + val += gout33 * dm[(j0+0)*nao+(k0+5)]; + atomicAdd(vk+(i0+3)*nao+(l0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(k0+0)]; + val += gout10 * dm[(j0+0)*nao+(k0+1)]; + val += gout16 * dm[(j0+0)*nao+(k0+2)]; + val += gout22 * dm[(j0+0)*nao+(k0+3)]; + val += gout28 * dm[(j0+0)*nao+(k0+4)]; + val += gout34 * dm[(j0+0)*nao+(k0+5)]; + atomicAdd(vk+(i0+4)*nao+(l0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(k0+0)]; + val += gout11 * dm[(j0+0)*nao+(k0+1)]; + val += gout17 * dm[(j0+0)*nao+(k0+2)]; + val += gout23 * dm[(j0+0)*nao+(k0+3)]; + val += gout29 * dm[(j0+0)*nao+(k0+4)]; + val += gout35 * dm[(j0+0)*nao+(k0+5)]; + atomicAdd(vk+(i0+5)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout6 * dm[(i0+0)*nao+(k0+1)]; + val += gout12 * dm[(i0+0)*nao+(k0+2)]; + val += gout18 * dm[(i0+0)*nao+(k0+3)]; + val += gout24 * dm[(i0+0)*nao+(k0+4)]; + val += gout30 * dm[(i0+0)*nao+(k0+5)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout7 * dm[(i0+1)*nao+(k0+1)]; + val += gout13 * dm[(i0+1)*nao+(k0+2)]; + val += gout19 * dm[(i0+1)*nao+(k0+3)]; + val += gout25 * dm[(i0+1)*nao+(k0+4)]; + val += gout31 * dm[(i0+1)*nao+(k0+5)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + val += gout8 * dm[(i0+2)*nao+(k0+1)]; + val += gout14 * dm[(i0+2)*nao+(k0+2)]; + val += gout20 * dm[(i0+2)*nao+(k0+3)]; + val += gout26 * dm[(i0+2)*nao+(k0+4)]; + val += gout32 * dm[(i0+2)*nao+(k0+5)]; + val += gout3 * dm[(i0+3)*nao+(k0+0)]; + val += gout9 * dm[(i0+3)*nao+(k0+1)]; + val += gout15 * dm[(i0+3)*nao+(k0+2)]; + val += gout21 * dm[(i0+3)*nao+(k0+3)]; + val += gout27 * dm[(i0+3)*nao+(k0+4)]; + val += gout33 * dm[(i0+3)*nao+(k0+5)]; + val += gout4 * dm[(i0+4)*nao+(k0+0)]; + val += gout10 * dm[(i0+4)*nao+(k0+1)]; + val += gout16 * dm[(i0+4)*nao+(k0+2)]; + val += gout22 * dm[(i0+4)*nao+(k0+3)]; + val += gout28 * dm[(i0+4)*nao+(k0+4)]; + val += gout34 * dm[(i0+4)*nao+(k0+5)]; + val += gout5 * dm[(i0+5)*nao+(k0+0)]; + val += gout11 * dm[(i0+5)*nao+(k0+1)]; + val += gout17 * dm[(i0+5)*nao+(k0+2)]; + val += gout23 * dm[(i0+5)*nao+(k0+3)]; + val += gout29 * dm[(i0+5)*nao+(k0+4)]; + val += gout35 * dm[(i0+5)*nao+(k0+5)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+1), val); + val = 0; + val += gout12 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+2), val); + val = 0; + val += gout18 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+3), val); + val = 0; + val += gout24 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+4), val); + val = 0; + val += gout30 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+5), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout7 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+1), val); + val = 0; + val += gout13 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+2), val); + val = 0; + val += gout19 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+3), val); + val = 0; + val += gout25 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+4), val); + val = 0; + val += gout31 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+5), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout8 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+1), val); + val = 0; + val += gout14 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+2), val); + val = 0; + val += gout20 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+3), val); + val = 0; + val += gout26 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+4), val); + val = 0; + val += gout32 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+5), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+0), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+1), val); + val = 0; + val += gout15 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+2), val); + val = 0; + val += gout21 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+3), val); + val = 0; + val += gout27 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+4), val); + val = 0; + val += gout33 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+5), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+0), val); + val = 0; + val += gout10 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+1), val); + val = 0; + val += gout16 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+2), val); + val = 0; + val += gout22 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+3), val); + val = 0; + val += gout28 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+4), val); + val = 0; + val += gout34 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+5), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+0), val); + val = 0; + val += gout11 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+1), val); + val = 0; + val += gout17 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+2), val); + val = 0; + val += gout23 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+3), val); + val = 0; + val += gout29 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+4), val); + val = 0; + val += gout35 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+5), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + val += gout3 * dm[(i0+3)*nao+(l0+0)]; + val += gout4 * dm[(i0+4)*nao+(l0+0)]; + val += gout5 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + val = 0; + val += gout6 * dm[(i0+0)*nao+(l0+0)]; + val += gout7 * dm[(i0+1)*nao+(l0+0)]; + val += gout8 * dm[(i0+2)*nao+(l0+0)]; + val += gout9 * dm[(i0+3)*nao+(l0+0)]; + val += gout10 * dm[(i0+4)*nao+(l0+0)]; + val += gout11 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+1), val); + val = 0; + val += gout12 * dm[(i0+0)*nao+(l0+0)]; + val += gout13 * dm[(i0+1)*nao+(l0+0)]; + val += gout14 * dm[(i0+2)*nao+(l0+0)]; + val += gout15 * dm[(i0+3)*nao+(l0+0)]; + val += gout16 * dm[(i0+4)*nao+(l0+0)]; + val += gout17 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+2), val); + val = 0; + val += gout18 * dm[(i0+0)*nao+(l0+0)]; + val += gout19 * dm[(i0+1)*nao+(l0+0)]; + val += gout20 * dm[(i0+2)*nao+(l0+0)]; + val += gout21 * dm[(i0+3)*nao+(l0+0)]; + val += gout22 * dm[(i0+4)*nao+(l0+0)]; + val += gout23 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+3), val); + val = 0; + val += gout24 * dm[(i0+0)*nao+(l0+0)]; + val += gout25 * dm[(i0+1)*nao+(l0+0)]; + val += gout26 * dm[(i0+2)*nao+(l0+0)]; + val += gout27 * dm[(i0+3)*nao+(l0+0)]; + val += gout28 * dm[(i0+4)*nao+(l0+0)]; + val += gout29 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+4), val); + val = 0; + val += gout30 * dm[(i0+0)*nao+(l0+0)]; + val += gout31 * dm[(i0+1)*nao+(l0+0)]; + val += gout32 * dm[(i0+2)*nao+(l0+0)]; + val += gout33 * dm[(i0+3)*nao+(l0+0)]; + val += gout34 * dm[(i0+4)*nao+(l0+0)]; + val += gout35 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+5), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +__global__ +void rys_jk_2020(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_jk_2020(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_sr_jk_2020(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double gout3; + double gout4; + double gout5; + double gout6; + double gout7; + double gout8; + double gout9; + double gout10; + double gout11; + double gout12; + double gout13; + double gout14; + double gout15; + double gout16; + double gout17; + double gout18; + double gout19; + double gout20; + double gout21; + double gout22; + double gout23; + double gout24; + double gout25; + double gout26; + double gout27; + double gout28; + double gout29; + double gout30; + double gout31; + double gout32; + double gout33; + double gout34; + double gout35; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + gout3 = 0; + gout4 = 0; + gout5 = 0; + gout6 = 0; + gout7 = 0; + gout8 = 0; + gout9 = 0; + gout10 = 0; + gout11 = 0; + gout12 = 0; + gout13 = 0; + gout14 = 0; + gout15 = 0; + gout16 = 0; + gout17 = 0; + gout18 = 0; + gout19 = 0; + gout20 = 0; + gout21 = 0; + gout22 = 0; + gout23 = 0; + gout24 = 0; + gout25 = 0; + gout26 = 0; + gout27 = 0; + gout28 = 0; + gout29 = 0; + gout30 = 0; + gout31 = 0; + gout32 = 0; + gout33 = 0; + gout34 = 0; + gout35 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + rys_roots(3, theta_rr, rw+6*nsq_per_block); + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(3, theta_fac*theta_rr, rw); + double sqrt_theta_fac = -sqrt(theta_fac); + for (int irys = 0; irys < 3; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + rw[sq_id+(irys*2+1)*nsq_per_block] *= sqrt_theta_fac; + } + if (task_id < ntasks) { + for (int irys = 0; irys < 6; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double b00 = .5 * rt_aa; + double rt_akl = rt_aa * aij; + double b01 = .5/akl * (1 - rt_akl); + double cpx = xqc + xpq*rt_akl; + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + double trr_21x = cpx * trr_20x + 2*b00 * trr_10x; + double trr_11x = cpx * trr_10x + 1*b00 * fac; + double trr_22x = cpx * trr_21x + 1*b01 * trr_20x + 2*b00 * trr_11x; + gout0 += trr_22x * 1 * wt; + double trr_01x = cpx * fac; + double trr_12x = cpx * trr_11x + 1*b01 * trr_10x + 1*b00 * trr_01x; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += trr_12x * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += trr_12x * 1 * trr_10z; + double trr_02x = cpx * trr_01x + 1*b01 * fac; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + gout3 += trr_02x * trr_20y * wt; + gout4 += trr_02x * trr_10y * trr_10z; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + gout5 += trr_02x * 1 * trr_20z; + double cpy = yqc + ypq*rt_akl; + double trr_01y = cpy * 1; + gout6 += trr_21x * trr_01y * wt; + double trr_11y = cpy * trr_10y + 1*b00 * 1; + gout7 += trr_11x * trr_11y * wt; + gout8 += trr_11x * trr_01y * trr_10z; + double trr_21y = cpy * trr_20y + 2*b00 * trr_10y; + gout9 += trr_01x * trr_21y * wt; + gout10 += trr_01x * trr_11y * trr_10z; + gout11 += trr_01x * trr_01y * trr_20z; + double cpz = zqc + zpq*rt_akl; + double trr_01z = cpz * wt; + gout12 += trr_21x * 1 * trr_01z; + gout13 += trr_11x * trr_10y * trr_01z; + double trr_11z = cpz * trr_10z + 1*b00 * wt; + gout14 += trr_11x * 1 * trr_11z; + gout15 += trr_01x * trr_20y * trr_01z; + gout16 += trr_01x * trr_10y * trr_11z; + double trr_21z = cpz * trr_20z + 2*b00 * trr_10z; + gout17 += trr_01x * 1 * trr_21z; + double trr_02y = cpy * trr_01y + 1*b01 * 1; + gout18 += trr_20x * trr_02y * wt; + double trr_12y = cpy * trr_11y + 1*b01 * trr_10y + 1*b00 * trr_01y; + gout19 += trr_10x * trr_12y * wt; + gout20 += trr_10x * trr_02y * trr_10z; + double trr_22y = cpy * trr_21y + 1*b01 * trr_20y + 2*b00 * trr_11y; + gout21 += fac * trr_22y * wt; + gout22 += fac * trr_12y * trr_10z; + gout23 += fac * trr_02y * trr_20z; + gout24 += trr_20x * trr_01y * trr_01z; + gout25 += trr_10x * trr_11y * trr_01z; + gout26 += trr_10x * trr_01y * trr_11z; + gout27 += fac * trr_21y * trr_01z; + gout28 += fac * trr_11y * trr_11z; + gout29 += fac * trr_01y * trr_21z; + double trr_02z = cpz * trr_01z + 1*b01 * wt; + gout30 += trr_20x * 1 * trr_02z; + gout31 += trr_10x * trr_10y * trr_02z; + double trr_12z = cpz * trr_11z + 1*b01 * trr_10z + 1*b00 * trr_01z; + gout32 += trr_10x * 1 * trr_12z; + gout33 += fac * trr_20y * trr_02z; + gout34 += fac * trr_10y * trr_12z; + double trr_22z = cpz * trr_21z + 1*b01 * trr_20z + 2*b00 * trr_11z; + gout35 += fac * 1 * trr_22z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + val += gout6 * dm[(l0+0)*nao+(k0+1)]; + val += gout12 * dm[(l0+0)*nao+(k0+2)]; + val += gout18 * dm[(l0+0)*nao+(k0+3)]; + val += gout24 * dm[(l0+0)*nao+(k0+4)]; + val += gout30 * dm[(l0+0)*nao+(k0+5)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + val += gout7 * dm[(l0+0)*nao+(k0+1)]; + val += gout13 * dm[(l0+0)*nao+(k0+2)]; + val += gout19 * dm[(l0+0)*nao+(k0+3)]; + val += gout25 * dm[(l0+0)*nao+(k0+4)]; + val += gout31 * dm[(l0+0)*nao+(k0+5)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + val += gout8 * dm[(l0+0)*nao+(k0+1)]; + val += gout14 * dm[(l0+0)*nao+(k0+2)]; + val += gout20 * dm[(l0+0)*nao+(k0+3)]; + val += gout26 * dm[(l0+0)*nao+(k0+4)]; + val += gout32 * dm[(l0+0)*nao+(k0+5)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout3 * dm[(l0+0)*nao+(k0+0)]; + val += gout9 * dm[(l0+0)*nao+(k0+1)]; + val += gout15 * dm[(l0+0)*nao+(k0+2)]; + val += gout21 * dm[(l0+0)*nao+(k0+3)]; + val += gout27 * dm[(l0+0)*nao+(k0+4)]; + val += gout33 * dm[(l0+0)*nao+(k0+5)]; + atomicAdd(vj+(i0+3)*nao+(j0+0), val); + val = 0; + val += gout4 * dm[(l0+0)*nao+(k0+0)]; + val += gout10 * dm[(l0+0)*nao+(k0+1)]; + val += gout16 * dm[(l0+0)*nao+(k0+2)]; + val += gout22 * dm[(l0+0)*nao+(k0+3)]; + val += gout28 * dm[(l0+0)*nao+(k0+4)]; + val += gout34 * dm[(l0+0)*nao+(k0+5)]; + atomicAdd(vj+(i0+4)*nao+(j0+0), val); + val = 0; + val += gout5 * dm[(l0+0)*nao+(k0+0)]; + val += gout11 * dm[(l0+0)*nao+(k0+1)]; + val += gout17 * dm[(l0+0)*nao+(k0+2)]; + val += gout23 * dm[(l0+0)*nao+(k0+3)]; + val += gout29 * dm[(l0+0)*nao+(k0+4)]; + val += gout35 * dm[(l0+0)*nao+(k0+5)]; + atomicAdd(vj+(i0+5)*nao+(j0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + val += gout3 * dm[(j0+0)*nao+(i0+3)]; + val += gout4 * dm[(j0+0)*nao+(i0+4)]; + val += gout5 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(i0+0)]; + val += gout7 * dm[(j0+0)*nao+(i0+1)]; + val += gout8 * dm[(j0+0)*nao+(i0+2)]; + val += gout9 * dm[(j0+0)*nao+(i0+3)]; + val += gout10 * dm[(j0+0)*nao+(i0+4)]; + val += gout11 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+1)*nao+(l0+0), val); + val = 0; + val += gout12 * dm[(j0+0)*nao+(i0+0)]; + val += gout13 * dm[(j0+0)*nao+(i0+1)]; + val += gout14 * dm[(j0+0)*nao+(i0+2)]; + val += gout15 * dm[(j0+0)*nao+(i0+3)]; + val += gout16 * dm[(j0+0)*nao+(i0+4)]; + val += gout17 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+2)*nao+(l0+0), val); + val = 0; + val += gout18 * dm[(j0+0)*nao+(i0+0)]; + val += gout19 * dm[(j0+0)*nao+(i0+1)]; + val += gout20 * dm[(j0+0)*nao+(i0+2)]; + val += gout21 * dm[(j0+0)*nao+(i0+3)]; + val += gout22 * dm[(j0+0)*nao+(i0+4)]; + val += gout23 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+3)*nao+(l0+0), val); + val = 0; + val += gout24 * dm[(j0+0)*nao+(i0+0)]; + val += gout25 * dm[(j0+0)*nao+(i0+1)]; + val += gout26 * dm[(j0+0)*nao+(i0+2)]; + val += gout27 * dm[(j0+0)*nao+(i0+3)]; + val += gout28 * dm[(j0+0)*nao+(i0+4)]; + val += gout29 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+4)*nao+(l0+0), val); + val = 0; + val += gout30 * dm[(j0+0)*nao+(i0+0)]; + val += gout31 * dm[(j0+0)*nao+(i0+1)]; + val += gout32 * dm[(j0+0)*nao+(i0+2)]; + val += gout33 * dm[(j0+0)*nao+(i0+3)]; + val += gout34 * dm[(j0+0)*nao+(i0+4)]; + val += gout35 * dm[(j0+0)*nao+(i0+5)]; + atomicAdd(vj+(k0+5)*nao+(l0+0), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + val += gout6 * dm[(j0+0)*nao+(k0+1)]; + val += gout12 * dm[(j0+0)*nao+(k0+2)]; + val += gout18 * dm[(j0+0)*nao+(k0+3)]; + val += gout24 * dm[(j0+0)*nao+(k0+4)]; + val += gout30 * dm[(j0+0)*nao+(k0+5)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + val += gout7 * dm[(j0+0)*nao+(k0+1)]; + val += gout13 * dm[(j0+0)*nao+(k0+2)]; + val += gout19 * dm[(j0+0)*nao+(k0+3)]; + val += gout25 * dm[(j0+0)*nao+(k0+4)]; + val += gout31 * dm[(j0+0)*nao+(k0+5)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + val += gout8 * dm[(j0+0)*nao+(k0+1)]; + val += gout14 * dm[(j0+0)*nao+(k0+2)]; + val += gout20 * dm[(j0+0)*nao+(k0+3)]; + val += gout26 * dm[(j0+0)*nao+(k0+4)]; + val += gout32 * dm[(j0+0)*nao+(k0+5)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(k0+0)]; + val += gout9 * dm[(j0+0)*nao+(k0+1)]; + val += gout15 * dm[(j0+0)*nao+(k0+2)]; + val += gout21 * dm[(j0+0)*nao+(k0+3)]; + val += gout27 * dm[(j0+0)*nao+(k0+4)]; + val += gout33 * dm[(j0+0)*nao+(k0+5)]; + atomicAdd(vk+(i0+3)*nao+(l0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(k0+0)]; + val += gout10 * dm[(j0+0)*nao+(k0+1)]; + val += gout16 * dm[(j0+0)*nao+(k0+2)]; + val += gout22 * dm[(j0+0)*nao+(k0+3)]; + val += gout28 * dm[(j0+0)*nao+(k0+4)]; + val += gout34 * dm[(j0+0)*nao+(k0+5)]; + atomicAdd(vk+(i0+4)*nao+(l0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(k0+0)]; + val += gout11 * dm[(j0+0)*nao+(k0+1)]; + val += gout17 * dm[(j0+0)*nao+(k0+2)]; + val += gout23 * dm[(j0+0)*nao+(k0+3)]; + val += gout29 * dm[(j0+0)*nao+(k0+4)]; + val += gout35 * dm[(j0+0)*nao+(k0+5)]; + atomicAdd(vk+(i0+5)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout6 * dm[(i0+0)*nao+(k0+1)]; + val += gout12 * dm[(i0+0)*nao+(k0+2)]; + val += gout18 * dm[(i0+0)*nao+(k0+3)]; + val += gout24 * dm[(i0+0)*nao+(k0+4)]; + val += gout30 * dm[(i0+0)*nao+(k0+5)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout7 * dm[(i0+1)*nao+(k0+1)]; + val += gout13 * dm[(i0+1)*nao+(k0+2)]; + val += gout19 * dm[(i0+1)*nao+(k0+3)]; + val += gout25 * dm[(i0+1)*nao+(k0+4)]; + val += gout31 * dm[(i0+1)*nao+(k0+5)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + val += gout8 * dm[(i0+2)*nao+(k0+1)]; + val += gout14 * dm[(i0+2)*nao+(k0+2)]; + val += gout20 * dm[(i0+2)*nao+(k0+3)]; + val += gout26 * dm[(i0+2)*nao+(k0+4)]; + val += gout32 * dm[(i0+2)*nao+(k0+5)]; + val += gout3 * dm[(i0+3)*nao+(k0+0)]; + val += gout9 * dm[(i0+3)*nao+(k0+1)]; + val += gout15 * dm[(i0+3)*nao+(k0+2)]; + val += gout21 * dm[(i0+3)*nao+(k0+3)]; + val += gout27 * dm[(i0+3)*nao+(k0+4)]; + val += gout33 * dm[(i0+3)*nao+(k0+5)]; + val += gout4 * dm[(i0+4)*nao+(k0+0)]; + val += gout10 * dm[(i0+4)*nao+(k0+1)]; + val += gout16 * dm[(i0+4)*nao+(k0+2)]; + val += gout22 * dm[(i0+4)*nao+(k0+3)]; + val += gout28 * dm[(i0+4)*nao+(k0+4)]; + val += gout34 * dm[(i0+4)*nao+(k0+5)]; + val += gout5 * dm[(i0+5)*nao+(k0+0)]; + val += gout11 * dm[(i0+5)*nao+(k0+1)]; + val += gout17 * dm[(i0+5)*nao+(k0+2)]; + val += gout23 * dm[(i0+5)*nao+(k0+3)]; + val += gout29 * dm[(i0+5)*nao+(k0+4)]; + val += gout35 * dm[(i0+5)*nao+(k0+5)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+1), val); + val = 0; + val += gout12 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+2), val); + val = 0; + val += gout18 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+3), val); + val = 0; + val += gout24 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+4), val); + val = 0; + val += gout30 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+5), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout7 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+1), val); + val = 0; + val += gout13 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+2), val); + val = 0; + val += gout19 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+3), val); + val = 0; + val += gout25 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+4), val); + val = 0; + val += gout31 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+5), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout8 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+1), val); + val = 0; + val += gout14 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+2), val); + val = 0; + val += gout20 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+3), val); + val = 0; + val += gout26 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+4), val); + val = 0; + val += gout32 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+5), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+0), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+1), val); + val = 0; + val += gout15 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+2), val); + val = 0; + val += gout21 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+3), val); + val = 0; + val += gout27 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+4), val); + val = 0; + val += gout33 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+5), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+0), val); + val = 0; + val += gout10 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+1), val); + val = 0; + val += gout16 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+2), val); + val = 0; + val += gout22 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+3), val); + val = 0; + val += gout28 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+4), val); + val = 0; + val += gout34 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+5), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+0), val); + val = 0; + val += gout11 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+1), val); + val = 0; + val += gout17 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+2), val); + val = 0; + val += gout23 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+3), val); + val = 0; + val += gout29 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+4), val); + val = 0; + val += gout35 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+5), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + val += gout3 * dm[(i0+3)*nao+(l0+0)]; + val += gout4 * dm[(i0+4)*nao+(l0+0)]; + val += gout5 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + val = 0; + val += gout6 * dm[(i0+0)*nao+(l0+0)]; + val += gout7 * dm[(i0+1)*nao+(l0+0)]; + val += gout8 * dm[(i0+2)*nao+(l0+0)]; + val += gout9 * dm[(i0+3)*nao+(l0+0)]; + val += gout10 * dm[(i0+4)*nao+(l0+0)]; + val += gout11 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+1), val); + val = 0; + val += gout12 * dm[(i0+0)*nao+(l0+0)]; + val += gout13 * dm[(i0+1)*nao+(l0+0)]; + val += gout14 * dm[(i0+2)*nao+(l0+0)]; + val += gout15 * dm[(i0+3)*nao+(l0+0)]; + val += gout16 * dm[(i0+4)*nao+(l0+0)]; + val += gout17 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+2), val); + val = 0; + val += gout18 * dm[(i0+0)*nao+(l0+0)]; + val += gout19 * dm[(i0+1)*nao+(l0+0)]; + val += gout20 * dm[(i0+2)*nao+(l0+0)]; + val += gout21 * dm[(i0+3)*nao+(l0+0)]; + val += gout22 * dm[(i0+4)*nao+(l0+0)]; + val += gout23 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+3), val); + val = 0; + val += gout24 * dm[(i0+0)*nao+(l0+0)]; + val += gout25 * dm[(i0+1)*nao+(l0+0)]; + val += gout26 * dm[(i0+2)*nao+(l0+0)]; + val += gout27 * dm[(i0+3)*nao+(l0+0)]; + val += gout28 * dm[(i0+4)*nao+(l0+0)]; + val += gout29 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+4), val); + val = 0; + val += gout30 * dm[(i0+0)*nao+(l0+0)]; + val += gout31 * dm[(i0+1)*nao+(l0+0)]; + val += gout32 * dm[(i0+2)*nao+(l0+0)]; + val += gout33 * dm[(i0+3)*nao+(l0+0)]; + val += gout34 * dm[(i0+4)*nao+(l0+0)]; + val += gout35 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+5), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +__global__ +void rys_sr_jk_2020(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_sr_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_sr_jk_2020(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_jk_2100(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double gout3; + double gout4; + double gout5; + double gout6; + double gout7; + double gout8; + double gout9; + double gout10; + double gout11; + double gout12; + double gout13; + double gout14; + double gout15; + double gout16; + double gout17; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + gout3 = 0; + gout4 = 0; + gout5 = 0; + gout6 = 0; + gout7 = 0; + gout8 = 0; + gout9 = 0; + gout10 = 0; + gout11 = 0; + gout12 = 0; + gout13 = 0; + gout14 = 0; + gout15 = 0; + gout16 = 0; + gout17 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(2, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(2, theta_fac*theta_rr, rw); + fac *= sqrt(theta_fac); + for (int irys = 0; irys < 2; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + } + } + if (task_id < ntasks) { + for (int irys = 0; irys < 2; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + double trr_30x = c0x * trr_20x + 2*b10 * trr_10x; + double hrr_2100x = trr_30x - xjxi * trr_20x; + gout0 += hrr_2100x * 1 * wt; + double hrr_1100x = trr_20x - xjxi * trr_10x; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += hrr_1100x * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += hrr_1100x * 1 * trr_10z; + double hrr_0100x = trr_10x - xjxi * fac; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + gout3 += hrr_0100x * trr_20y * wt; + gout4 += hrr_0100x * trr_10y * trr_10z; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + gout5 += hrr_0100x * 1 * trr_20z; + double hrr_0100y = trr_10y - yjyi * 1; + gout6 += trr_20x * hrr_0100y * wt; + double hrr_1100y = trr_20y - yjyi * trr_10y; + gout7 += trr_10x * hrr_1100y * wt; + gout8 += trr_10x * hrr_0100y * trr_10z; + double trr_30y = c0y * trr_20y + 2*b10 * trr_10y; + double hrr_2100y = trr_30y - yjyi * trr_20y; + gout9 += fac * hrr_2100y * wt; + gout10 += fac * hrr_1100y * trr_10z; + gout11 += fac * hrr_0100y * trr_20z; + double hrr_0100z = trr_10z - zjzi * wt; + gout12 += trr_20x * 1 * hrr_0100z; + gout13 += trr_10x * trr_10y * hrr_0100z; + double hrr_1100z = trr_20z - zjzi * trr_10z; + gout14 += trr_10x * 1 * hrr_1100z; + gout15 += fac * trr_20y * hrr_0100z; + gout16 += fac * trr_10y * hrr_1100z; + double trr_30z = c0z * trr_20z + 2*b10 * trr_10z; + double hrr_2100z = trr_30z - zjzi * trr_20z; + gout17 += fac * 1 * hrr_2100z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout6 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+1), val); + val = 0; + val += gout12 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+2), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout7 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+1), val); + val = 0; + val += gout13 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+2), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout8 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+1), val); + val = 0; + val += gout14 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+2), val); + val = 0; + val += gout3 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+0), val); + val = 0; + val += gout9 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+1), val); + val = 0; + val += gout15 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+2), val); + val = 0; + val += gout4 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+0), val); + val = 0; + val += gout10 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+1), val); + val = 0; + val += gout16 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+2), val); + val = 0; + val += gout5 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+0), val); + val = 0; + val += gout11 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+1), val); + val = 0; + val += gout17 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+2), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + val += gout3 * dm[(j0+0)*nao+(i0+3)]; + val += gout4 * dm[(j0+0)*nao+(i0+4)]; + val += gout5 * dm[(j0+0)*nao+(i0+5)]; + val += gout6 * dm[(j0+1)*nao+(i0+0)]; + val += gout7 * dm[(j0+1)*nao+(i0+1)]; + val += gout8 * dm[(j0+1)*nao+(i0+2)]; + val += gout9 * dm[(j0+1)*nao+(i0+3)]; + val += gout10 * dm[(j0+1)*nao+(i0+4)]; + val += gout11 * dm[(j0+1)*nao+(i0+5)]; + val += gout12 * dm[(j0+2)*nao+(i0+0)]; + val += gout13 * dm[(j0+2)*nao+(i0+1)]; + val += gout14 * dm[(j0+2)*nao+(i0+2)]; + val += gout15 * dm[(j0+2)*nao+(i0+3)]; + val += gout16 * dm[(j0+2)*nao+(i0+4)]; + val += gout17 * dm[(j0+2)*nao+(i0+5)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + val += gout6 * dm[(j0+1)*nao+(k0+0)]; + val += gout12 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + val += gout7 * dm[(j0+1)*nao+(k0+0)]; + val += gout13 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + val += gout8 * dm[(j0+1)*nao+(k0+0)]; + val += gout14 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(k0+0)]; + val += gout9 * dm[(j0+1)*nao+(k0+0)]; + val += gout15 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+3)*nao+(l0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(k0+0)]; + val += gout10 * dm[(j0+1)*nao+(k0+0)]; + val += gout16 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+4)*nao+(l0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(k0+0)]; + val += gout11 * dm[(j0+1)*nao+(k0+0)]; + val += gout17 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+5)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + val += gout3 * dm[(i0+3)*nao+(k0+0)]; + val += gout4 * dm[(i0+4)*nao+(k0+0)]; + val += gout5 * dm[(i0+5)*nao+(k0+0)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout6 * dm[(i0+0)*nao+(k0+0)]; + val += gout7 * dm[(i0+1)*nao+(k0+0)]; + val += gout8 * dm[(i0+2)*nao+(k0+0)]; + val += gout9 * dm[(i0+3)*nao+(k0+0)]; + val += gout10 * dm[(i0+4)*nao+(k0+0)]; + val += gout11 * dm[(i0+5)*nao+(k0+0)]; + atomicAdd(vk+(j0+1)*nao+(l0+0), val); + val = 0; + val += gout12 * dm[(i0+0)*nao+(k0+0)]; + val += gout13 * dm[(i0+1)*nao+(k0+0)]; + val += gout14 * dm[(i0+2)*nao+(k0+0)]; + val += gout15 * dm[(i0+3)*nao+(k0+0)]; + val += gout16 * dm[(i0+4)*nao+(k0+0)]; + val += gout17 * dm[(i0+5)*nao+(k0+0)]; + atomicAdd(vk+(j0+2)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + val += gout6 * dm[(j0+1)*nao+(l0+0)]; + val += gout12 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + val += gout7 * dm[(j0+1)*nao+(l0+0)]; + val += gout13 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + val += gout8 * dm[(j0+1)*nao+(l0+0)]; + val += gout14 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(l0+0)]; + val += gout9 * dm[(j0+1)*nao+(l0+0)]; + val += gout15 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(l0+0)]; + val += gout10 * dm[(j0+1)*nao+(l0+0)]; + val += gout16 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(l0+0)]; + val += gout11 * dm[(j0+1)*nao+(l0+0)]; + val += gout17 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + val += gout3 * dm[(i0+3)*nao+(l0+0)]; + val += gout4 * dm[(i0+4)*nao+(l0+0)]; + val += gout5 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + val = 0; + val += gout6 * dm[(i0+0)*nao+(l0+0)]; + val += gout7 * dm[(i0+1)*nao+(l0+0)]; + val += gout8 * dm[(i0+2)*nao+(l0+0)]; + val += gout9 * dm[(i0+3)*nao+(l0+0)]; + val += gout10 * dm[(i0+4)*nao+(l0+0)]; + val += gout11 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+1)*nao+(k0+0), val); + val = 0; + val += gout12 * dm[(i0+0)*nao+(l0+0)]; + val += gout13 * dm[(i0+1)*nao+(l0+0)]; + val += gout14 * dm[(i0+2)*nao+(l0+0)]; + val += gout15 * dm[(i0+3)*nao+(l0+0)]; + val += gout16 * dm[(i0+4)*nao+(l0+0)]; + val += gout17 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+2)*nao+(k0+0), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +#if CUDA_VERSION >= 12040 +__global__ __maxnreg__(128) +#else +__global__ +#endif +void rys_jk_2100(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_jk_2100(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_sr_jk_2100(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double gout3; + double gout4; + double gout5; + double gout6; + double gout7; + double gout8; + double gout9; + double gout10; + double gout11; + double gout12; + double gout13; + double gout14; + double gout15; + double gout16; + double gout17; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + gout3 = 0; + gout4 = 0; + gout5 = 0; + gout6 = 0; + gout7 = 0; + gout8 = 0; + gout9 = 0; + gout10 = 0; + gout11 = 0; + gout12 = 0; + gout13 = 0; + gout14 = 0; + gout15 = 0; + gout16 = 0; + gout17 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + rys_roots(2, theta_rr, rw+4*nsq_per_block); + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(2, theta_fac*theta_rr, rw); + double sqrt_theta_fac = -sqrt(theta_fac); + for (int irys = 0; irys < 2; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + rw[sq_id+(irys*2+1)*nsq_per_block] *= sqrt_theta_fac; + } + if (task_id < ntasks) { + for (int irys = 0; irys < 4; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + double trr_30x = c0x * trr_20x + 2*b10 * trr_10x; + double hrr_2100x = trr_30x - xjxi * trr_20x; + gout0 += hrr_2100x * 1 * wt; + double hrr_1100x = trr_20x - xjxi * trr_10x; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += hrr_1100x * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += hrr_1100x * 1 * trr_10z; + double hrr_0100x = trr_10x - xjxi * fac; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + gout3 += hrr_0100x * trr_20y * wt; + gout4 += hrr_0100x * trr_10y * trr_10z; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + gout5 += hrr_0100x * 1 * trr_20z; + double hrr_0100y = trr_10y - yjyi * 1; + gout6 += trr_20x * hrr_0100y * wt; + double hrr_1100y = trr_20y - yjyi * trr_10y; + gout7 += trr_10x * hrr_1100y * wt; + gout8 += trr_10x * hrr_0100y * trr_10z; + double trr_30y = c0y * trr_20y + 2*b10 * trr_10y; + double hrr_2100y = trr_30y - yjyi * trr_20y; + gout9 += fac * hrr_2100y * wt; + gout10 += fac * hrr_1100y * trr_10z; + gout11 += fac * hrr_0100y * trr_20z; + double hrr_0100z = trr_10z - zjzi * wt; + gout12 += trr_20x * 1 * hrr_0100z; + gout13 += trr_10x * trr_10y * hrr_0100z; + double hrr_1100z = trr_20z - zjzi * trr_10z; + gout14 += trr_10x * 1 * hrr_1100z; + gout15 += fac * trr_20y * hrr_0100z; + gout16 += fac * trr_10y * hrr_1100z; + double trr_30z = c0z * trr_20z + 2*b10 * trr_10z; + double hrr_2100z = trr_30z - zjzi * trr_20z; + gout17 += fac * 1 * hrr_2100z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout6 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+1), val); + val = 0; + val += gout12 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+2), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout7 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+1), val); + val = 0; + val += gout13 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+2), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout8 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+1), val); + val = 0; + val += gout14 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+2), val); + val = 0; + val += gout3 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+0), val); + val = 0; + val += gout9 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+1), val); + val = 0; + val += gout15 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+2), val); + val = 0; + val += gout4 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+0), val); + val = 0; + val += gout10 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+1), val); + val = 0; + val += gout16 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+2), val); + val = 0; + val += gout5 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+0), val); + val = 0; + val += gout11 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+1), val); + val = 0; + val += gout17 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+2), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + val += gout3 * dm[(j0+0)*nao+(i0+3)]; + val += gout4 * dm[(j0+0)*nao+(i0+4)]; + val += gout5 * dm[(j0+0)*nao+(i0+5)]; + val += gout6 * dm[(j0+1)*nao+(i0+0)]; + val += gout7 * dm[(j0+1)*nao+(i0+1)]; + val += gout8 * dm[(j0+1)*nao+(i0+2)]; + val += gout9 * dm[(j0+1)*nao+(i0+3)]; + val += gout10 * dm[(j0+1)*nao+(i0+4)]; + val += gout11 * dm[(j0+1)*nao+(i0+5)]; + val += gout12 * dm[(j0+2)*nao+(i0+0)]; + val += gout13 * dm[(j0+2)*nao+(i0+1)]; + val += gout14 * dm[(j0+2)*nao+(i0+2)]; + val += gout15 * dm[(j0+2)*nao+(i0+3)]; + val += gout16 * dm[(j0+2)*nao+(i0+4)]; + val += gout17 * dm[(j0+2)*nao+(i0+5)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + val += gout6 * dm[(j0+1)*nao+(k0+0)]; + val += gout12 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + val += gout7 * dm[(j0+1)*nao+(k0+0)]; + val += gout13 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + val += gout8 * dm[(j0+1)*nao+(k0+0)]; + val += gout14 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(k0+0)]; + val += gout9 * dm[(j0+1)*nao+(k0+0)]; + val += gout15 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+3)*nao+(l0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(k0+0)]; + val += gout10 * dm[(j0+1)*nao+(k0+0)]; + val += gout16 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+4)*nao+(l0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(k0+0)]; + val += gout11 * dm[(j0+1)*nao+(k0+0)]; + val += gout17 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+5)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + val += gout3 * dm[(i0+3)*nao+(k0+0)]; + val += gout4 * dm[(i0+4)*nao+(k0+0)]; + val += gout5 * dm[(i0+5)*nao+(k0+0)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout6 * dm[(i0+0)*nao+(k0+0)]; + val += gout7 * dm[(i0+1)*nao+(k0+0)]; + val += gout8 * dm[(i0+2)*nao+(k0+0)]; + val += gout9 * dm[(i0+3)*nao+(k0+0)]; + val += gout10 * dm[(i0+4)*nao+(k0+0)]; + val += gout11 * dm[(i0+5)*nao+(k0+0)]; + atomicAdd(vk+(j0+1)*nao+(l0+0), val); + val = 0; + val += gout12 * dm[(i0+0)*nao+(k0+0)]; + val += gout13 * dm[(i0+1)*nao+(k0+0)]; + val += gout14 * dm[(i0+2)*nao+(k0+0)]; + val += gout15 * dm[(i0+3)*nao+(k0+0)]; + val += gout16 * dm[(i0+4)*nao+(k0+0)]; + val += gout17 * dm[(i0+5)*nao+(k0+0)]; + atomicAdd(vk+(j0+2)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + val += gout6 * dm[(j0+1)*nao+(l0+0)]; + val += gout12 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + val += gout7 * dm[(j0+1)*nao+(l0+0)]; + val += gout13 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + val += gout8 * dm[(j0+1)*nao+(l0+0)]; + val += gout14 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(l0+0)]; + val += gout9 * dm[(j0+1)*nao+(l0+0)]; + val += gout15 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(l0+0)]; + val += gout10 * dm[(j0+1)*nao+(l0+0)]; + val += gout16 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(l0+0)]; + val += gout11 * dm[(j0+1)*nao+(l0+0)]; + val += gout17 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + val += gout3 * dm[(i0+3)*nao+(l0+0)]; + val += gout4 * dm[(i0+4)*nao+(l0+0)]; + val += gout5 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + val = 0; + val += gout6 * dm[(i0+0)*nao+(l0+0)]; + val += gout7 * dm[(i0+1)*nao+(l0+0)]; + val += gout8 * dm[(i0+2)*nao+(l0+0)]; + val += gout9 * dm[(i0+3)*nao+(l0+0)]; + val += gout10 * dm[(i0+4)*nao+(l0+0)]; + val += gout11 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+1)*nao+(k0+0), val); + val = 0; + val += gout12 * dm[(i0+0)*nao+(l0+0)]; + val += gout13 * dm[(i0+1)*nao+(l0+0)]; + val += gout14 * dm[(i0+2)*nao+(l0+0)]; + val += gout15 * dm[(i0+3)*nao+(l0+0)]; + val += gout16 * dm[(i0+4)*nao+(l0+0)]; + val += gout17 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+2)*nao+(k0+0), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +#if CUDA_VERSION >= 12040 +__global__ __maxnreg__(128) +#else +__global__ +#endif +void rys_sr_jk_2100(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_sr_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_sr_jk_2100(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_jk_2110(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double gout3; + double gout4; + double gout5; + double gout6; + double gout7; + double gout8; + double gout9; + double gout10; + double gout11; + double gout12; + double gout13; + double gout14; + double gout15; + double gout16; + double gout17; + double gout18; + double gout19; + double gout20; + double gout21; + double gout22; + double gout23; + double gout24; + double gout25; + double gout26; + double gout27; + double gout28; + double gout29; + double gout30; + double gout31; + double gout32; + double gout33; + double gout34; + double gout35; + double gout36; + double gout37; + double gout38; + double gout39; + double gout40; + double gout41; + double gout42; + double gout43; + double gout44; + double gout45; + double gout46; + double gout47; + double gout48; + double gout49; + double gout50; + double gout51; + double gout52; + double gout53; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + gout3 = 0; + gout4 = 0; + gout5 = 0; + gout6 = 0; + gout7 = 0; + gout8 = 0; + gout9 = 0; + gout10 = 0; + gout11 = 0; + gout12 = 0; + gout13 = 0; + gout14 = 0; + gout15 = 0; + gout16 = 0; + gout17 = 0; + gout18 = 0; + gout19 = 0; + gout20 = 0; + gout21 = 0; + gout22 = 0; + gout23 = 0; + gout24 = 0; + gout25 = 0; + gout26 = 0; + gout27 = 0; + gout28 = 0; + gout29 = 0; + gout30 = 0; + gout31 = 0; + gout32 = 0; + gout33 = 0; + gout34 = 0; + gout35 = 0; + gout36 = 0; + gout37 = 0; + gout38 = 0; + gout39 = 0; + gout40 = 0; + gout41 = 0; + gout42 = 0; + gout43 = 0; + gout44 = 0; + gout45 = 0; + gout46 = 0; + gout47 = 0; + gout48 = 0; + gout49 = 0; + gout50 = 0; + gout51 = 0; + gout52 = 0; + gout53 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(3, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(3, theta_fac*theta_rr, rw); + fac *= sqrt(theta_fac); + for (int irys = 0; irys < 3; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + } + } + if (task_id < ntasks) { + for (int irys = 0; irys < 3; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double b00 = .5 * rt_aa; + double rt_akl = rt_aa * aij; + double cpx = xqc + xpq*rt_akl; + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + double trr_30x = c0x * trr_20x + 2*b10 * trr_10x; + double trr_31x = cpx * trr_30x + 3*b00 * trr_20x; + double trr_21x = cpx * trr_20x + 2*b00 * trr_10x; + double hrr_2110x = trr_31x - xjxi * trr_21x; + gout0 += hrr_2110x * 1 * wt; + double trr_11x = cpx * trr_10x + 1*b00 * fac; + double hrr_1110x = trr_21x - xjxi * trr_11x; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += hrr_1110x * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += hrr_1110x * 1 * trr_10z; + double trr_01x = cpx * fac; + double hrr_0110x = trr_11x - xjxi * trr_01x; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + gout3 += hrr_0110x * trr_20y * wt; + gout4 += hrr_0110x * trr_10y * trr_10z; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + gout5 += hrr_0110x * 1 * trr_20z; + double hrr_0100y = trr_10y - yjyi * 1; + gout6 += trr_21x * hrr_0100y * wt; + double hrr_1100y = trr_20y - yjyi * trr_10y; + gout7 += trr_11x * hrr_1100y * wt; + gout8 += trr_11x * hrr_0100y * trr_10z; + double trr_30y = c0y * trr_20y + 2*b10 * trr_10y; + double hrr_2100y = trr_30y - yjyi * trr_20y; + gout9 += trr_01x * hrr_2100y * wt; + gout10 += trr_01x * hrr_1100y * trr_10z; + gout11 += trr_01x * hrr_0100y * trr_20z; + double hrr_0100z = trr_10z - zjzi * wt; + gout12 += trr_21x * 1 * hrr_0100z; + gout13 += trr_11x * trr_10y * hrr_0100z; + double hrr_1100z = trr_20z - zjzi * trr_10z; + gout14 += trr_11x * 1 * hrr_1100z; + gout15 += trr_01x * trr_20y * hrr_0100z; + gout16 += trr_01x * trr_10y * hrr_1100z; + double trr_30z = c0z * trr_20z + 2*b10 * trr_10z; + double hrr_2100z = trr_30z - zjzi * trr_20z; + gout17 += trr_01x * 1 * hrr_2100z; + double hrr_2100x = trr_30x - xjxi * trr_20x; + double cpy = yqc + ypq*rt_akl; + double trr_01y = cpy * 1; + gout18 += hrr_2100x * trr_01y * wt; + double hrr_1100x = trr_20x - xjxi * trr_10x; + double trr_11y = cpy * trr_10y + 1*b00 * 1; + gout19 += hrr_1100x * trr_11y * wt; + gout20 += hrr_1100x * trr_01y * trr_10z; + double hrr_0100x = trr_10x - xjxi * fac; + double trr_21y = cpy * trr_20y + 2*b00 * trr_10y; + gout21 += hrr_0100x * trr_21y * wt; + gout22 += hrr_0100x * trr_11y * trr_10z; + gout23 += hrr_0100x * trr_01y * trr_20z; + double hrr_0110y = trr_11y - yjyi * trr_01y; + gout24 += trr_20x * hrr_0110y * wt; + double hrr_1110y = trr_21y - yjyi * trr_11y; + gout25 += trr_10x * hrr_1110y * wt; + gout26 += trr_10x * hrr_0110y * trr_10z; + double trr_31y = cpy * trr_30y + 3*b00 * trr_20y; + double hrr_2110y = trr_31y - yjyi * trr_21y; + gout27 += fac * hrr_2110y * wt; + gout28 += fac * hrr_1110y * trr_10z; + gout29 += fac * hrr_0110y * trr_20z; + gout30 += trr_20x * trr_01y * hrr_0100z; + gout31 += trr_10x * trr_11y * hrr_0100z; + gout32 += trr_10x * trr_01y * hrr_1100z; + gout33 += fac * trr_21y * hrr_0100z; + gout34 += fac * trr_11y * hrr_1100z; + gout35 += fac * trr_01y * hrr_2100z; + double cpz = zqc + zpq*rt_akl; + double trr_01z = cpz * wt; + gout36 += hrr_2100x * 1 * trr_01z; + gout37 += hrr_1100x * trr_10y * trr_01z; + double trr_11z = cpz * trr_10z + 1*b00 * wt; + gout38 += hrr_1100x * 1 * trr_11z; + gout39 += hrr_0100x * trr_20y * trr_01z; + gout40 += hrr_0100x * trr_10y * trr_11z; + double trr_21z = cpz * trr_20z + 2*b00 * trr_10z; + gout41 += hrr_0100x * 1 * trr_21z; + gout42 += trr_20x * hrr_0100y * trr_01z; + gout43 += trr_10x * hrr_1100y * trr_01z; + gout44 += trr_10x * hrr_0100y * trr_11z; + gout45 += fac * hrr_2100y * trr_01z; + gout46 += fac * hrr_1100y * trr_11z; + gout47 += fac * hrr_0100y * trr_21z; + double hrr_0110z = trr_11z - zjzi * trr_01z; + gout48 += trr_20x * 1 * hrr_0110z; + gout49 += trr_10x * trr_10y * hrr_0110z; + double hrr_1110z = trr_21z - zjzi * trr_11z; + gout50 += trr_10x * 1 * hrr_1110z; + gout51 += fac * trr_20y * hrr_0110z; + gout52 += fac * trr_10y * hrr_1110z; + double trr_31z = cpz * trr_30z + 3*b00 * trr_20z; + double hrr_2110z = trr_31z - zjzi * trr_21z; + gout53 += fac * 1 * hrr_2110z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + val += gout18 * dm[(l0+0)*nao+(k0+1)]; + val += gout36 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout6 * dm[(l0+0)*nao+(k0+0)]; + val += gout24 * dm[(l0+0)*nao+(k0+1)]; + val += gout42 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+0)*nao+(j0+1), val); + val = 0; + val += gout12 * dm[(l0+0)*nao+(k0+0)]; + val += gout30 * dm[(l0+0)*nao+(k0+1)]; + val += gout48 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+0)*nao+(j0+2), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + val += gout19 * dm[(l0+0)*nao+(k0+1)]; + val += gout37 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout7 * dm[(l0+0)*nao+(k0+0)]; + val += gout25 * dm[(l0+0)*nao+(k0+1)]; + val += gout43 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+1)*nao+(j0+1), val); + val = 0; + val += gout13 * dm[(l0+0)*nao+(k0+0)]; + val += gout31 * dm[(l0+0)*nao+(k0+1)]; + val += gout49 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+1)*nao+(j0+2), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + val += gout20 * dm[(l0+0)*nao+(k0+1)]; + val += gout38 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout8 * dm[(l0+0)*nao+(k0+0)]; + val += gout26 * dm[(l0+0)*nao+(k0+1)]; + val += gout44 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+2)*nao+(j0+1), val); + val = 0; + val += gout14 * dm[(l0+0)*nao+(k0+0)]; + val += gout32 * dm[(l0+0)*nao+(k0+1)]; + val += gout50 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+2)*nao+(j0+2), val); + val = 0; + val += gout3 * dm[(l0+0)*nao+(k0+0)]; + val += gout21 * dm[(l0+0)*nao+(k0+1)]; + val += gout39 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+3)*nao+(j0+0), val); + val = 0; + val += gout9 * dm[(l0+0)*nao+(k0+0)]; + val += gout27 * dm[(l0+0)*nao+(k0+1)]; + val += gout45 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+3)*nao+(j0+1), val); + val = 0; + val += gout15 * dm[(l0+0)*nao+(k0+0)]; + val += gout33 * dm[(l0+0)*nao+(k0+1)]; + val += gout51 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+3)*nao+(j0+2), val); + val = 0; + val += gout4 * dm[(l0+0)*nao+(k0+0)]; + val += gout22 * dm[(l0+0)*nao+(k0+1)]; + val += gout40 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+4)*nao+(j0+0), val); + val = 0; + val += gout10 * dm[(l0+0)*nao+(k0+0)]; + val += gout28 * dm[(l0+0)*nao+(k0+1)]; + val += gout46 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+4)*nao+(j0+1), val); + val = 0; + val += gout16 * dm[(l0+0)*nao+(k0+0)]; + val += gout34 * dm[(l0+0)*nao+(k0+1)]; + val += gout52 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+4)*nao+(j0+2), val); + val = 0; + val += gout5 * dm[(l0+0)*nao+(k0+0)]; + val += gout23 * dm[(l0+0)*nao+(k0+1)]; + val += gout41 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+5)*nao+(j0+0), val); + val = 0; + val += gout11 * dm[(l0+0)*nao+(k0+0)]; + val += gout29 * dm[(l0+0)*nao+(k0+1)]; + val += gout47 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+5)*nao+(j0+1), val); + val = 0; + val += gout17 * dm[(l0+0)*nao+(k0+0)]; + val += gout35 * dm[(l0+0)*nao+(k0+1)]; + val += gout53 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+5)*nao+(j0+2), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + val += gout3 * dm[(j0+0)*nao+(i0+3)]; + val += gout4 * dm[(j0+0)*nao+(i0+4)]; + val += gout5 * dm[(j0+0)*nao+(i0+5)]; + val += gout6 * dm[(j0+1)*nao+(i0+0)]; + val += gout7 * dm[(j0+1)*nao+(i0+1)]; + val += gout8 * dm[(j0+1)*nao+(i0+2)]; + val += gout9 * dm[(j0+1)*nao+(i0+3)]; + val += gout10 * dm[(j0+1)*nao+(i0+4)]; + val += gout11 * dm[(j0+1)*nao+(i0+5)]; + val += gout12 * dm[(j0+2)*nao+(i0+0)]; + val += gout13 * dm[(j0+2)*nao+(i0+1)]; + val += gout14 * dm[(j0+2)*nao+(i0+2)]; + val += gout15 * dm[(j0+2)*nao+(i0+3)]; + val += gout16 * dm[(j0+2)*nao+(i0+4)]; + val += gout17 * dm[(j0+2)*nao+(i0+5)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + val = 0; + val += gout18 * dm[(j0+0)*nao+(i0+0)]; + val += gout19 * dm[(j0+0)*nao+(i0+1)]; + val += gout20 * dm[(j0+0)*nao+(i0+2)]; + val += gout21 * dm[(j0+0)*nao+(i0+3)]; + val += gout22 * dm[(j0+0)*nao+(i0+4)]; + val += gout23 * dm[(j0+0)*nao+(i0+5)]; + val += gout24 * dm[(j0+1)*nao+(i0+0)]; + val += gout25 * dm[(j0+1)*nao+(i0+1)]; + val += gout26 * dm[(j0+1)*nao+(i0+2)]; + val += gout27 * dm[(j0+1)*nao+(i0+3)]; + val += gout28 * dm[(j0+1)*nao+(i0+4)]; + val += gout29 * dm[(j0+1)*nao+(i0+5)]; + val += gout30 * dm[(j0+2)*nao+(i0+0)]; + val += gout31 * dm[(j0+2)*nao+(i0+1)]; + val += gout32 * dm[(j0+2)*nao+(i0+2)]; + val += gout33 * dm[(j0+2)*nao+(i0+3)]; + val += gout34 * dm[(j0+2)*nao+(i0+4)]; + val += gout35 * dm[(j0+2)*nao+(i0+5)]; + atomicAdd(vj+(k0+1)*nao+(l0+0), val); + val = 0; + val += gout36 * dm[(j0+0)*nao+(i0+0)]; + val += gout37 * dm[(j0+0)*nao+(i0+1)]; + val += gout38 * dm[(j0+0)*nao+(i0+2)]; + val += gout39 * dm[(j0+0)*nao+(i0+3)]; + val += gout40 * dm[(j0+0)*nao+(i0+4)]; + val += gout41 * dm[(j0+0)*nao+(i0+5)]; + val += gout42 * dm[(j0+1)*nao+(i0+0)]; + val += gout43 * dm[(j0+1)*nao+(i0+1)]; + val += gout44 * dm[(j0+1)*nao+(i0+2)]; + val += gout45 * dm[(j0+1)*nao+(i0+3)]; + val += gout46 * dm[(j0+1)*nao+(i0+4)]; + val += gout47 * dm[(j0+1)*nao+(i0+5)]; + val += gout48 * dm[(j0+2)*nao+(i0+0)]; + val += gout49 * dm[(j0+2)*nao+(i0+1)]; + val += gout50 * dm[(j0+2)*nao+(i0+2)]; + val += gout51 * dm[(j0+2)*nao+(i0+3)]; + val += gout52 * dm[(j0+2)*nao+(i0+4)]; + val += gout53 * dm[(j0+2)*nao+(i0+5)]; + atomicAdd(vj+(k0+2)*nao+(l0+0), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + val += gout18 * dm[(j0+0)*nao+(k0+1)]; + val += gout36 * dm[(j0+0)*nao+(k0+2)]; + val += gout6 * dm[(j0+1)*nao+(k0+0)]; + val += gout24 * dm[(j0+1)*nao+(k0+1)]; + val += gout42 * dm[(j0+1)*nao+(k0+2)]; + val += gout12 * dm[(j0+2)*nao+(k0+0)]; + val += gout30 * dm[(j0+2)*nao+(k0+1)]; + val += gout48 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + val += gout19 * dm[(j0+0)*nao+(k0+1)]; + val += gout37 * dm[(j0+0)*nao+(k0+2)]; + val += gout7 * dm[(j0+1)*nao+(k0+0)]; + val += gout25 * dm[(j0+1)*nao+(k0+1)]; + val += gout43 * dm[(j0+1)*nao+(k0+2)]; + val += gout13 * dm[(j0+2)*nao+(k0+0)]; + val += gout31 * dm[(j0+2)*nao+(k0+1)]; + val += gout49 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + val += gout20 * dm[(j0+0)*nao+(k0+1)]; + val += gout38 * dm[(j0+0)*nao+(k0+2)]; + val += gout8 * dm[(j0+1)*nao+(k0+0)]; + val += gout26 * dm[(j0+1)*nao+(k0+1)]; + val += gout44 * dm[(j0+1)*nao+(k0+2)]; + val += gout14 * dm[(j0+2)*nao+(k0+0)]; + val += gout32 * dm[(j0+2)*nao+(k0+1)]; + val += gout50 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(k0+0)]; + val += gout21 * dm[(j0+0)*nao+(k0+1)]; + val += gout39 * dm[(j0+0)*nao+(k0+2)]; + val += gout9 * dm[(j0+1)*nao+(k0+0)]; + val += gout27 * dm[(j0+1)*nao+(k0+1)]; + val += gout45 * dm[(j0+1)*nao+(k0+2)]; + val += gout15 * dm[(j0+2)*nao+(k0+0)]; + val += gout33 * dm[(j0+2)*nao+(k0+1)]; + val += gout51 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+3)*nao+(l0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(k0+0)]; + val += gout22 * dm[(j0+0)*nao+(k0+1)]; + val += gout40 * dm[(j0+0)*nao+(k0+2)]; + val += gout10 * dm[(j0+1)*nao+(k0+0)]; + val += gout28 * dm[(j0+1)*nao+(k0+1)]; + val += gout46 * dm[(j0+1)*nao+(k0+2)]; + val += gout16 * dm[(j0+2)*nao+(k0+0)]; + val += gout34 * dm[(j0+2)*nao+(k0+1)]; + val += gout52 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+4)*nao+(l0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(k0+0)]; + val += gout23 * dm[(j0+0)*nao+(k0+1)]; + val += gout41 * dm[(j0+0)*nao+(k0+2)]; + val += gout11 * dm[(j0+1)*nao+(k0+0)]; + val += gout29 * dm[(j0+1)*nao+(k0+1)]; + val += gout47 * dm[(j0+1)*nao+(k0+2)]; + val += gout17 * dm[(j0+2)*nao+(k0+0)]; + val += gout35 * dm[(j0+2)*nao+(k0+1)]; + val += gout53 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+5)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout18 * dm[(i0+0)*nao+(k0+1)]; + val += gout36 * dm[(i0+0)*nao+(k0+2)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout19 * dm[(i0+1)*nao+(k0+1)]; + val += gout37 * dm[(i0+1)*nao+(k0+2)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + val += gout20 * dm[(i0+2)*nao+(k0+1)]; + val += gout38 * dm[(i0+2)*nao+(k0+2)]; + val += gout3 * dm[(i0+3)*nao+(k0+0)]; + val += gout21 * dm[(i0+3)*nao+(k0+1)]; + val += gout39 * dm[(i0+3)*nao+(k0+2)]; + val += gout4 * dm[(i0+4)*nao+(k0+0)]; + val += gout22 * dm[(i0+4)*nao+(k0+1)]; + val += gout40 * dm[(i0+4)*nao+(k0+2)]; + val += gout5 * dm[(i0+5)*nao+(k0+0)]; + val += gout23 * dm[(i0+5)*nao+(k0+1)]; + val += gout41 * dm[(i0+5)*nao+(k0+2)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout6 * dm[(i0+0)*nao+(k0+0)]; + val += gout24 * dm[(i0+0)*nao+(k0+1)]; + val += gout42 * dm[(i0+0)*nao+(k0+2)]; + val += gout7 * dm[(i0+1)*nao+(k0+0)]; + val += gout25 * dm[(i0+1)*nao+(k0+1)]; + val += gout43 * dm[(i0+1)*nao+(k0+2)]; + val += gout8 * dm[(i0+2)*nao+(k0+0)]; + val += gout26 * dm[(i0+2)*nao+(k0+1)]; + val += gout44 * dm[(i0+2)*nao+(k0+2)]; + val += gout9 * dm[(i0+3)*nao+(k0+0)]; + val += gout27 * dm[(i0+3)*nao+(k0+1)]; + val += gout45 * dm[(i0+3)*nao+(k0+2)]; + val += gout10 * dm[(i0+4)*nao+(k0+0)]; + val += gout28 * dm[(i0+4)*nao+(k0+1)]; + val += gout46 * dm[(i0+4)*nao+(k0+2)]; + val += gout11 * dm[(i0+5)*nao+(k0+0)]; + val += gout29 * dm[(i0+5)*nao+(k0+1)]; + val += gout47 * dm[(i0+5)*nao+(k0+2)]; + atomicAdd(vk+(j0+1)*nao+(l0+0), val); + val = 0; + val += gout12 * dm[(i0+0)*nao+(k0+0)]; + val += gout30 * dm[(i0+0)*nao+(k0+1)]; + val += gout48 * dm[(i0+0)*nao+(k0+2)]; + val += gout13 * dm[(i0+1)*nao+(k0+0)]; + val += gout31 * dm[(i0+1)*nao+(k0+1)]; + val += gout49 * dm[(i0+1)*nao+(k0+2)]; + val += gout14 * dm[(i0+2)*nao+(k0+0)]; + val += gout32 * dm[(i0+2)*nao+(k0+1)]; + val += gout50 * dm[(i0+2)*nao+(k0+2)]; + val += gout15 * dm[(i0+3)*nao+(k0+0)]; + val += gout33 * dm[(i0+3)*nao+(k0+1)]; + val += gout51 * dm[(i0+3)*nao+(k0+2)]; + val += gout16 * dm[(i0+4)*nao+(k0+0)]; + val += gout34 * dm[(i0+4)*nao+(k0+1)]; + val += gout52 * dm[(i0+4)*nao+(k0+2)]; + val += gout17 * dm[(i0+5)*nao+(k0+0)]; + val += gout35 * dm[(i0+5)*nao+(k0+1)]; + val += gout53 * dm[(i0+5)*nao+(k0+2)]; + atomicAdd(vk+(j0+2)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + val += gout6 * dm[(j0+1)*nao+(l0+0)]; + val += gout12 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout18 * dm[(j0+0)*nao+(l0+0)]; + val += gout24 * dm[(j0+1)*nao+(l0+0)]; + val += gout30 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+1), val); + val = 0; + val += gout36 * dm[(j0+0)*nao+(l0+0)]; + val += gout42 * dm[(j0+1)*nao+(l0+0)]; + val += gout48 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+2), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + val += gout7 * dm[(j0+1)*nao+(l0+0)]; + val += gout13 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout19 * dm[(j0+0)*nao+(l0+0)]; + val += gout25 * dm[(j0+1)*nao+(l0+0)]; + val += gout31 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+1), val); + val = 0; + val += gout37 * dm[(j0+0)*nao+(l0+0)]; + val += gout43 * dm[(j0+1)*nao+(l0+0)]; + val += gout49 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+2), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + val += gout8 * dm[(j0+1)*nao+(l0+0)]; + val += gout14 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout20 * dm[(j0+0)*nao+(l0+0)]; + val += gout26 * dm[(j0+1)*nao+(l0+0)]; + val += gout32 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+1), val); + val = 0; + val += gout38 * dm[(j0+0)*nao+(l0+0)]; + val += gout44 * dm[(j0+1)*nao+(l0+0)]; + val += gout50 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+2), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(l0+0)]; + val += gout9 * dm[(j0+1)*nao+(l0+0)]; + val += gout15 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+0), val); + val = 0; + val += gout21 * dm[(j0+0)*nao+(l0+0)]; + val += gout27 * dm[(j0+1)*nao+(l0+0)]; + val += gout33 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+1), val); + val = 0; + val += gout39 * dm[(j0+0)*nao+(l0+0)]; + val += gout45 * dm[(j0+1)*nao+(l0+0)]; + val += gout51 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+2), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(l0+0)]; + val += gout10 * dm[(j0+1)*nao+(l0+0)]; + val += gout16 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+0), val); + val = 0; + val += gout22 * dm[(j0+0)*nao+(l0+0)]; + val += gout28 * dm[(j0+1)*nao+(l0+0)]; + val += gout34 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+1), val); + val = 0; + val += gout40 * dm[(j0+0)*nao+(l0+0)]; + val += gout46 * dm[(j0+1)*nao+(l0+0)]; + val += gout52 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+2), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(l0+0)]; + val += gout11 * dm[(j0+1)*nao+(l0+0)]; + val += gout17 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+0), val); + val = 0; + val += gout23 * dm[(j0+0)*nao+(l0+0)]; + val += gout29 * dm[(j0+1)*nao+(l0+0)]; + val += gout35 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+1), val); + val = 0; + val += gout41 * dm[(j0+0)*nao+(l0+0)]; + val += gout47 * dm[(j0+1)*nao+(l0+0)]; + val += gout53 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+2), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + val += gout3 * dm[(i0+3)*nao+(l0+0)]; + val += gout4 * dm[(i0+4)*nao+(l0+0)]; + val += gout5 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + val = 0; + val += gout18 * dm[(i0+0)*nao+(l0+0)]; + val += gout19 * dm[(i0+1)*nao+(l0+0)]; + val += gout20 * dm[(i0+2)*nao+(l0+0)]; + val += gout21 * dm[(i0+3)*nao+(l0+0)]; + val += gout22 * dm[(i0+4)*nao+(l0+0)]; + val += gout23 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+1), val); + val = 0; + val += gout36 * dm[(i0+0)*nao+(l0+0)]; + val += gout37 * dm[(i0+1)*nao+(l0+0)]; + val += gout38 * dm[(i0+2)*nao+(l0+0)]; + val += gout39 * dm[(i0+3)*nao+(l0+0)]; + val += gout40 * dm[(i0+4)*nao+(l0+0)]; + val += gout41 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+2), val); + val = 0; + val += gout6 * dm[(i0+0)*nao+(l0+0)]; + val += gout7 * dm[(i0+1)*nao+(l0+0)]; + val += gout8 * dm[(i0+2)*nao+(l0+0)]; + val += gout9 * dm[(i0+3)*nao+(l0+0)]; + val += gout10 * dm[(i0+4)*nao+(l0+0)]; + val += gout11 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+1)*nao+(k0+0), val); + val = 0; + val += gout24 * dm[(i0+0)*nao+(l0+0)]; + val += gout25 * dm[(i0+1)*nao+(l0+0)]; + val += gout26 * dm[(i0+2)*nao+(l0+0)]; + val += gout27 * dm[(i0+3)*nao+(l0+0)]; + val += gout28 * dm[(i0+4)*nao+(l0+0)]; + val += gout29 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+1)*nao+(k0+1), val); + val = 0; + val += gout42 * dm[(i0+0)*nao+(l0+0)]; + val += gout43 * dm[(i0+1)*nao+(l0+0)]; + val += gout44 * dm[(i0+2)*nao+(l0+0)]; + val += gout45 * dm[(i0+3)*nao+(l0+0)]; + val += gout46 * dm[(i0+4)*nao+(l0+0)]; + val += gout47 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+1)*nao+(k0+2), val); + val = 0; + val += gout12 * dm[(i0+0)*nao+(l0+0)]; + val += gout13 * dm[(i0+1)*nao+(l0+0)]; + val += gout14 * dm[(i0+2)*nao+(l0+0)]; + val += gout15 * dm[(i0+3)*nao+(l0+0)]; + val += gout16 * dm[(i0+4)*nao+(l0+0)]; + val += gout17 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+2)*nao+(k0+0), val); + val = 0; + val += gout30 * dm[(i0+0)*nao+(l0+0)]; + val += gout31 * dm[(i0+1)*nao+(l0+0)]; + val += gout32 * dm[(i0+2)*nao+(l0+0)]; + val += gout33 * dm[(i0+3)*nao+(l0+0)]; + val += gout34 * dm[(i0+4)*nao+(l0+0)]; + val += gout35 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+2)*nao+(k0+1), val); + val = 0; + val += gout48 * dm[(i0+0)*nao+(l0+0)]; + val += gout49 * dm[(i0+1)*nao+(l0+0)]; + val += gout50 * dm[(i0+2)*nao+(l0+0)]; + val += gout51 * dm[(i0+3)*nao+(l0+0)]; + val += gout52 * dm[(i0+4)*nao+(l0+0)]; + val += gout53 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+2)*nao+(k0+2), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +__global__ +void rys_jk_2110(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_jk_2110(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_sr_jk_2110(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double gout3; + double gout4; + double gout5; + double gout6; + double gout7; + double gout8; + double gout9; + double gout10; + double gout11; + double gout12; + double gout13; + double gout14; + double gout15; + double gout16; + double gout17; + double gout18; + double gout19; + double gout20; + double gout21; + double gout22; + double gout23; + double gout24; + double gout25; + double gout26; + double gout27; + double gout28; + double gout29; + double gout30; + double gout31; + double gout32; + double gout33; + double gout34; + double gout35; + double gout36; + double gout37; + double gout38; + double gout39; + double gout40; + double gout41; + double gout42; + double gout43; + double gout44; + double gout45; + double gout46; + double gout47; + double gout48; + double gout49; + double gout50; + double gout51; + double gout52; + double gout53; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + gout3 = 0; + gout4 = 0; + gout5 = 0; + gout6 = 0; + gout7 = 0; + gout8 = 0; + gout9 = 0; + gout10 = 0; + gout11 = 0; + gout12 = 0; + gout13 = 0; + gout14 = 0; + gout15 = 0; + gout16 = 0; + gout17 = 0; + gout18 = 0; + gout19 = 0; + gout20 = 0; + gout21 = 0; + gout22 = 0; + gout23 = 0; + gout24 = 0; + gout25 = 0; + gout26 = 0; + gout27 = 0; + gout28 = 0; + gout29 = 0; + gout30 = 0; + gout31 = 0; + gout32 = 0; + gout33 = 0; + gout34 = 0; + gout35 = 0; + gout36 = 0; + gout37 = 0; + gout38 = 0; + gout39 = 0; + gout40 = 0; + gout41 = 0; + gout42 = 0; + gout43 = 0; + gout44 = 0; + gout45 = 0; + gout46 = 0; + gout47 = 0; + gout48 = 0; + gout49 = 0; + gout50 = 0; + gout51 = 0; + gout52 = 0; + gout53 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + rys_roots(3, theta_rr, rw+6*nsq_per_block); + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(3, theta_fac*theta_rr, rw); + double sqrt_theta_fac = -sqrt(theta_fac); + for (int irys = 0; irys < 3; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + rw[sq_id+(irys*2+1)*nsq_per_block] *= sqrt_theta_fac; + } + if (task_id < ntasks) { + for (int irys = 0; irys < 6; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double b00 = .5 * rt_aa; + double rt_akl = rt_aa * aij; + double cpx = xqc + xpq*rt_akl; + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + double trr_30x = c0x * trr_20x + 2*b10 * trr_10x; + double trr_31x = cpx * trr_30x + 3*b00 * trr_20x; + double trr_21x = cpx * trr_20x + 2*b00 * trr_10x; + double hrr_2110x = trr_31x - xjxi * trr_21x; + gout0 += hrr_2110x * 1 * wt; + double trr_11x = cpx * trr_10x + 1*b00 * fac; + double hrr_1110x = trr_21x - xjxi * trr_11x; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += hrr_1110x * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += hrr_1110x * 1 * trr_10z; + double trr_01x = cpx * fac; + double hrr_0110x = trr_11x - xjxi * trr_01x; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + gout3 += hrr_0110x * trr_20y * wt; + gout4 += hrr_0110x * trr_10y * trr_10z; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + gout5 += hrr_0110x * 1 * trr_20z; + double hrr_0100y = trr_10y - yjyi * 1; + gout6 += trr_21x * hrr_0100y * wt; + double hrr_1100y = trr_20y - yjyi * trr_10y; + gout7 += trr_11x * hrr_1100y * wt; + gout8 += trr_11x * hrr_0100y * trr_10z; + double trr_30y = c0y * trr_20y + 2*b10 * trr_10y; + double hrr_2100y = trr_30y - yjyi * trr_20y; + gout9 += trr_01x * hrr_2100y * wt; + gout10 += trr_01x * hrr_1100y * trr_10z; + gout11 += trr_01x * hrr_0100y * trr_20z; + double hrr_0100z = trr_10z - zjzi * wt; + gout12 += trr_21x * 1 * hrr_0100z; + gout13 += trr_11x * trr_10y * hrr_0100z; + double hrr_1100z = trr_20z - zjzi * trr_10z; + gout14 += trr_11x * 1 * hrr_1100z; + gout15 += trr_01x * trr_20y * hrr_0100z; + gout16 += trr_01x * trr_10y * hrr_1100z; + double trr_30z = c0z * trr_20z + 2*b10 * trr_10z; + double hrr_2100z = trr_30z - zjzi * trr_20z; + gout17 += trr_01x * 1 * hrr_2100z; + double hrr_2100x = trr_30x - xjxi * trr_20x; + double cpy = yqc + ypq*rt_akl; + double trr_01y = cpy * 1; + gout18 += hrr_2100x * trr_01y * wt; + double hrr_1100x = trr_20x - xjxi * trr_10x; + double trr_11y = cpy * trr_10y + 1*b00 * 1; + gout19 += hrr_1100x * trr_11y * wt; + gout20 += hrr_1100x * trr_01y * trr_10z; + double hrr_0100x = trr_10x - xjxi * fac; + double trr_21y = cpy * trr_20y + 2*b00 * trr_10y; + gout21 += hrr_0100x * trr_21y * wt; + gout22 += hrr_0100x * trr_11y * trr_10z; + gout23 += hrr_0100x * trr_01y * trr_20z; + double hrr_0110y = trr_11y - yjyi * trr_01y; + gout24 += trr_20x * hrr_0110y * wt; + double hrr_1110y = trr_21y - yjyi * trr_11y; + gout25 += trr_10x * hrr_1110y * wt; + gout26 += trr_10x * hrr_0110y * trr_10z; + double trr_31y = cpy * trr_30y + 3*b00 * trr_20y; + double hrr_2110y = trr_31y - yjyi * trr_21y; + gout27 += fac * hrr_2110y * wt; + gout28 += fac * hrr_1110y * trr_10z; + gout29 += fac * hrr_0110y * trr_20z; + gout30 += trr_20x * trr_01y * hrr_0100z; + gout31 += trr_10x * trr_11y * hrr_0100z; + gout32 += trr_10x * trr_01y * hrr_1100z; + gout33 += fac * trr_21y * hrr_0100z; + gout34 += fac * trr_11y * hrr_1100z; + gout35 += fac * trr_01y * hrr_2100z; + double cpz = zqc + zpq*rt_akl; + double trr_01z = cpz * wt; + gout36 += hrr_2100x * 1 * trr_01z; + gout37 += hrr_1100x * trr_10y * trr_01z; + double trr_11z = cpz * trr_10z + 1*b00 * wt; + gout38 += hrr_1100x * 1 * trr_11z; + gout39 += hrr_0100x * trr_20y * trr_01z; + gout40 += hrr_0100x * trr_10y * trr_11z; + double trr_21z = cpz * trr_20z + 2*b00 * trr_10z; + gout41 += hrr_0100x * 1 * trr_21z; + gout42 += trr_20x * hrr_0100y * trr_01z; + gout43 += trr_10x * hrr_1100y * trr_01z; + gout44 += trr_10x * hrr_0100y * trr_11z; + gout45 += fac * hrr_2100y * trr_01z; + gout46 += fac * hrr_1100y * trr_11z; + gout47 += fac * hrr_0100y * trr_21z; + double hrr_0110z = trr_11z - zjzi * trr_01z; + gout48 += trr_20x * 1 * hrr_0110z; + gout49 += trr_10x * trr_10y * hrr_0110z; + double hrr_1110z = trr_21z - zjzi * trr_11z; + gout50 += trr_10x * 1 * hrr_1110z; + gout51 += fac * trr_20y * hrr_0110z; + gout52 += fac * trr_10y * hrr_1110z; + double trr_31z = cpz * trr_30z + 3*b00 * trr_20z; + double hrr_2110z = trr_31z - zjzi * trr_21z; + gout53 += fac * 1 * hrr_2110z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + val += gout18 * dm[(l0+0)*nao+(k0+1)]; + val += gout36 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout6 * dm[(l0+0)*nao+(k0+0)]; + val += gout24 * dm[(l0+0)*nao+(k0+1)]; + val += gout42 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+0)*nao+(j0+1), val); + val = 0; + val += gout12 * dm[(l0+0)*nao+(k0+0)]; + val += gout30 * dm[(l0+0)*nao+(k0+1)]; + val += gout48 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+0)*nao+(j0+2), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + val += gout19 * dm[(l0+0)*nao+(k0+1)]; + val += gout37 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout7 * dm[(l0+0)*nao+(k0+0)]; + val += gout25 * dm[(l0+0)*nao+(k0+1)]; + val += gout43 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+1)*nao+(j0+1), val); + val = 0; + val += gout13 * dm[(l0+0)*nao+(k0+0)]; + val += gout31 * dm[(l0+0)*nao+(k0+1)]; + val += gout49 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+1)*nao+(j0+2), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + val += gout20 * dm[(l0+0)*nao+(k0+1)]; + val += gout38 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout8 * dm[(l0+0)*nao+(k0+0)]; + val += gout26 * dm[(l0+0)*nao+(k0+1)]; + val += gout44 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+2)*nao+(j0+1), val); + val = 0; + val += gout14 * dm[(l0+0)*nao+(k0+0)]; + val += gout32 * dm[(l0+0)*nao+(k0+1)]; + val += gout50 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+2)*nao+(j0+2), val); + val = 0; + val += gout3 * dm[(l0+0)*nao+(k0+0)]; + val += gout21 * dm[(l0+0)*nao+(k0+1)]; + val += gout39 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+3)*nao+(j0+0), val); + val = 0; + val += gout9 * dm[(l0+0)*nao+(k0+0)]; + val += gout27 * dm[(l0+0)*nao+(k0+1)]; + val += gout45 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+3)*nao+(j0+1), val); + val = 0; + val += gout15 * dm[(l0+0)*nao+(k0+0)]; + val += gout33 * dm[(l0+0)*nao+(k0+1)]; + val += gout51 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+3)*nao+(j0+2), val); + val = 0; + val += gout4 * dm[(l0+0)*nao+(k0+0)]; + val += gout22 * dm[(l0+0)*nao+(k0+1)]; + val += gout40 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+4)*nao+(j0+0), val); + val = 0; + val += gout10 * dm[(l0+0)*nao+(k0+0)]; + val += gout28 * dm[(l0+0)*nao+(k0+1)]; + val += gout46 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+4)*nao+(j0+1), val); + val = 0; + val += gout16 * dm[(l0+0)*nao+(k0+0)]; + val += gout34 * dm[(l0+0)*nao+(k0+1)]; + val += gout52 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+4)*nao+(j0+2), val); + val = 0; + val += gout5 * dm[(l0+0)*nao+(k0+0)]; + val += gout23 * dm[(l0+0)*nao+(k0+1)]; + val += gout41 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+5)*nao+(j0+0), val); + val = 0; + val += gout11 * dm[(l0+0)*nao+(k0+0)]; + val += gout29 * dm[(l0+0)*nao+(k0+1)]; + val += gout47 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+5)*nao+(j0+1), val); + val = 0; + val += gout17 * dm[(l0+0)*nao+(k0+0)]; + val += gout35 * dm[(l0+0)*nao+(k0+1)]; + val += gout53 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+5)*nao+(j0+2), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + val += gout3 * dm[(j0+0)*nao+(i0+3)]; + val += gout4 * dm[(j0+0)*nao+(i0+4)]; + val += gout5 * dm[(j0+0)*nao+(i0+5)]; + val += gout6 * dm[(j0+1)*nao+(i0+0)]; + val += gout7 * dm[(j0+1)*nao+(i0+1)]; + val += gout8 * dm[(j0+1)*nao+(i0+2)]; + val += gout9 * dm[(j0+1)*nao+(i0+3)]; + val += gout10 * dm[(j0+1)*nao+(i0+4)]; + val += gout11 * dm[(j0+1)*nao+(i0+5)]; + val += gout12 * dm[(j0+2)*nao+(i0+0)]; + val += gout13 * dm[(j0+2)*nao+(i0+1)]; + val += gout14 * dm[(j0+2)*nao+(i0+2)]; + val += gout15 * dm[(j0+2)*nao+(i0+3)]; + val += gout16 * dm[(j0+2)*nao+(i0+4)]; + val += gout17 * dm[(j0+2)*nao+(i0+5)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + val = 0; + val += gout18 * dm[(j0+0)*nao+(i0+0)]; + val += gout19 * dm[(j0+0)*nao+(i0+1)]; + val += gout20 * dm[(j0+0)*nao+(i0+2)]; + val += gout21 * dm[(j0+0)*nao+(i0+3)]; + val += gout22 * dm[(j0+0)*nao+(i0+4)]; + val += gout23 * dm[(j0+0)*nao+(i0+5)]; + val += gout24 * dm[(j0+1)*nao+(i0+0)]; + val += gout25 * dm[(j0+1)*nao+(i0+1)]; + val += gout26 * dm[(j0+1)*nao+(i0+2)]; + val += gout27 * dm[(j0+1)*nao+(i0+3)]; + val += gout28 * dm[(j0+1)*nao+(i0+4)]; + val += gout29 * dm[(j0+1)*nao+(i0+5)]; + val += gout30 * dm[(j0+2)*nao+(i0+0)]; + val += gout31 * dm[(j0+2)*nao+(i0+1)]; + val += gout32 * dm[(j0+2)*nao+(i0+2)]; + val += gout33 * dm[(j0+2)*nao+(i0+3)]; + val += gout34 * dm[(j0+2)*nao+(i0+4)]; + val += gout35 * dm[(j0+2)*nao+(i0+5)]; + atomicAdd(vj+(k0+1)*nao+(l0+0), val); + val = 0; + val += gout36 * dm[(j0+0)*nao+(i0+0)]; + val += gout37 * dm[(j0+0)*nao+(i0+1)]; + val += gout38 * dm[(j0+0)*nao+(i0+2)]; + val += gout39 * dm[(j0+0)*nao+(i0+3)]; + val += gout40 * dm[(j0+0)*nao+(i0+4)]; + val += gout41 * dm[(j0+0)*nao+(i0+5)]; + val += gout42 * dm[(j0+1)*nao+(i0+0)]; + val += gout43 * dm[(j0+1)*nao+(i0+1)]; + val += gout44 * dm[(j0+1)*nao+(i0+2)]; + val += gout45 * dm[(j0+1)*nao+(i0+3)]; + val += gout46 * dm[(j0+1)*nao+(i0+4)]; + val += gout47 * dm[(j0+1)*nao+(i0+5)]; + val += gout48 * dm[(j0+2)*nao+(i0+0)]; + val += gout49 * dm[(j0+2)*nao+(i0+1)]; + val += gout50 * dm[(j0+2)*nao+(i0+2)]; + val += gout51 * dm[(j0+2)*nao+(i0+3)]; + val += gout52 * dm[(j0+2)*nao+(i0+4)]; + val += gout53 * dm[(j0+2)*nao+(i0+5)]; + atomicAdd(vj+(k0+2)*nao+(l0+0), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + val += gout18 * dm[(j0+0)*nao+(k0+1)]; + val += gout36 * dm[(j0+0)*nao+(k0+2)]; + val += gout6 * dm[(j0+1)*nao+(k0+0)]; + val += gout24 * dm[(j0+1)*nao+(k0+1)]; + val += gout42 * dm[(j0+1)*nao+(k0+2)]; + val += gout12 * dm[(j0+2)*nao+(k0+0)]; + val += gout30 * dm[(j0+2)*nao+(k0+1)]; + val += gout48 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + val += gout19 * dm[(j0+0)*nao+(k0+1)]; + val += gout37 * dm[(j0+0)*nao+(k0+2)]; + val += gout7 * dm[(j0+1)*nao+(k0+0)]; + val += gout25 * dm[(j0+1)*nao+(k0+1)]; + val += gout43 * dm[(j0+1)*nao+(k0+2)]; + val += gout13 * dm[(j0+2)*nao+(k0+0)]; + val += gout31 * dm[(j0+2)*nao+(k0+1)]; + val += gout49 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + val += gout20 * dm[(j0+0)*nao+(k0+1)]; + val += gout38 * dm[(j0+0)*nao+(k0+2)]; + val += gout8 * dm[(j0+1)*nao+(k0+0)]; + val += gout26 * dm[(j0+1)*nao+(k0+1)]; + val += gout44 * dm[(j0+1)*nao+(k0+2)]; + val += gout14 * dm[(j0+2)*nao+(k0+0)]; + val += gout32 * dm[(j0+2)*nao+(k0+1)]; + val += gout50 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(k0+0)]; + val += gout21 * dm[(j0+0)*nao+(k0+1)]; + val += gout39 * dm[(j0+0)*nao+(k0+2)]; + val += gout9 * dm[(j0+1)*nao+(k0+0)]; + val += gout27 * dm[(j0+1)*nao+(k0+1)]; + val += gout45 * dm[(j0+1)*nao+(k0+2)]; + val += gout15 * dm[(j0+2)*nao+(k0+0)]; + val += gout33 * dm[(j0+2)*nao+(k0+1)]; + val += gout51 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+3)*nao+(l0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(k0+0)]; + val += gout22 * dm[(j0+0)*nao+(k0+1)]; + val += gout40 * dm[(j0+0)*nao+(k0+2)]; + val += gout10 * dm[(j0+1)*nao+(k0+0)]; + val += gout28 * dm[(j0+1)*nao+(k0+1)]; + val += gout46 * dm[(j0+1)*nao+(k0+2)]; + val += gout16 * dm[(j0+2)*nao+(k0+0)]; + val += gout34 * dm[(j0+2)*nao+(k0+1)]; + val += gout52 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+4)*nao+(l0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(k0+0)]; + val += gout23 * dm[(j0+0)*nao+(k0+1)]; + val += gout41 * dm[(j0+0)*nao+(k0+2)]; + val += gout11 * dm[(j0+1)*nao+(k0+0)]; + val += gout29 * dm[(j0+1)*nao+(k0+1)]; + val += gout47 * dm[(j0+1)*nao+(k0+2)]; + val += gout17 * dm[(j0+2)*nao+(k0+0)]; + val += gout35 * dm[(j0+2)*nao+(k0+1)]; + val += gout53 * dm[(j0+2)*nao+(k0+2)]; + atomicAdd(vk+(i0+5)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout18 * dm[(i0+0)*nao+(k0+1)]; + val += gout36 * dm[(i0+0)*nao+(k0+2)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout19 * dm[(i0+1)*nao+(k0+1)]; + val += gout37 * dm[(i0+1)*nao+(k0+2)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + val += gout20 * dm[(i0+2)*nao+(k0+1)]; + val += gout38 * dm[(i0+2)*nao+(k0+2)]; + val += gout3 * dm[(i0+3)*nao+(k0+0)]; + val += gout21 * dm[(i0+3)*nao+(k0+1)]; + val += gout39 * dm[(i0+3)*nao+(k0+2)]; + val += gout4 * dm[(i0+4)*nao+(k0+0)]; + val += gout22 * dm[(i0+4)*nao+(k0+1)]; + val += gout40 * dm[(i0+4)*nao+(k0+2)]; + val += gout5 * dm[(i0+5)*nao+(k0+0)]; + val += gout23 * dm[(i0+5)*nao+(k0+1)]; + val += gout41 * dm[(i0+5)*nao+(k0+2)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout6 * dm[(i0+0)*nao+(k0+0)]; + val += gout24 * dm[(i0+0)*nao+(k0+1)]; + val += gout42 * dm[(i0+0)*nao+(k0+2)]; + val += gout7 * dm[(i0+1)*nao+(k0+0)]; + val += gout25 * dm[(i0+1)*nao+(k0+1)]; + val += gout43 * dm[(i0+1)*nao+(k0+2)]; + val += gout8 * dm[(i0+2)*nao+(k0+0)]; + val += gout26 * dm[(i0+2)*nao+(k0+1)]; + val += gout44 * dm[(i0+2)*nao+(k0+2)]; + val += gout9 * dm[(i0+3)*nao+(k0+0)]; + val += gout27 * dm[(i0+3)*nao+(k0+1)]; + val += gout45 * dm[(i0+3)*nao+(k0+2)]; + val += gout10 * dm[(i0+4)*nao+(k0+0)]; + val += gout28 * dm[(i0+4)*nao+(k0+1)]; + val += gout46 * dm[(i0+4)*nao+(k0+2)]; + val += gout11 * dm[(i0+5)*nao+(k0+0)]; + val += gout29 * dm[(i0+5)*nao+(k0+1)]; + val += gout47 * dm[(i0+5)*nao+(k0+2)]; + atomicAdd(vk+(j0+1)*nao+(l0+0), val); + val = 0; + val += gout12 * dm[(i0+0)*nao+(k0+0)]; + val += gout30 * dm[(i0+0)*nao+(k0+1)]; + val += gout48 * dm[(i0+0)*nao+(k0+2)]; + val += gout13 * dm[(i0+1)*nao+(k0+0)]; + val += gout31 * dm[(i0+1)*nao+(k0+1)]; + val += gout49 * dm[(i0+1)*nao+(k0+2)]; + val += gout14 * dm[(i0+2)*nao+(k0+0)]; + val += gout32 * dm[(i0+2)*nao+(k0+1)]; + val += gout50 * dm[(i0+2)*nao+(k0+2)]; + val += gout15 * dm[(i0+3)*nao+(k0+0)]; + val += gout33 * dm[(i0+3)*nao+(k0+1)]; + val += gout51 * dm[(i0+3)*nao+(k0+2)]; + val += gout16 * dm[(i0+4)*nao+(k0+0)]; + val += gout34 * dm[(i0+4)*nao+(k0+1)]; + val += gout52 * dm[(i0+4)*nao+(k0+2)]; + val += gout17 * dm[(i0+5)*nao+(k0+0)]; + val += gout35 * dm[(i0+5)*nao+(k0+1)]; + val += gout53 * dm[(i0+5)*nao+(k0+2)]; + atomicAdd(vk+(j0+2)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + val += gout6 * dm[(j0+1)*nao+(l0+0)]; + val += gout12 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout18 * dm[(j0+0)*nao+(l0+0)]; + val += gout24 * dm[(j0+1)*nao+(l0+0)]; + val += gout30 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+1), val); + val = 0; + val += gout36 * dm[(j0+0)*nao+(l0+0)]; + val += gout42 * dm[(j0+1)*nao+(l0+0)]; + val += gout48 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+2), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + val += gout7 * dm[(j0+1)*nao+(l0+0)]; + val += gout13 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout19 * dm[(j0+0)*nao+(l0+0)]; + val += gout25 * dm[(j0+1)*nao+(l0+0)]; + val += gout31 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+1), val); + val = 0; + val += gout37 * dm[(j0+0)*nao+(l0+0)]; + val += gout43 * dm[(j0+1)*nao+(l0+0)]; + val += gout49 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+2), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + val += gout8 * dm[(j0+1)*nao+(l0+0)]; + val += gout14 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout20 * dm[(j0+0)*nao+(l0+0)]; + val += gout26 * dm[(j0+1)*nao+(l0+0)]; + val += gout32 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+1), val); + val = 0; + val += gout38 * dm[(j0+0)*nao+(l0+0)]; + val += gout44 * dm[(j0+1)*nao+(l0+0)]; + val += gout50 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+2), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(l0+0)]; + val += gout9 * dm[(j0+1)*nao+(l0+0)]; + val += gout15 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+0), val); + val = 0; + val += gout21 * dm[(j0+0)*nao+(l0+0)]; + val += gout27 * dm[(j0+1)*nao+(l0+0)]; + val += gout33 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+1), val); + val = 0; + val += gout39 * dm[(j0+0)*nao+(l0+0)]; + val += gout45 * dm[(j0+1)*nao+(l0+0)]; + val += gout51 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+2), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(l0+0)]; + val += gout10 * dm[(j0+1)*nao+(l0+0)]; + val += gout16 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+0), val); + val = 0; + val += gout22 * dm[(j0+0)*nao+(l0+0)]; + val += gout28 * dm[(j0+1)*nao+(l0+0)]; + val += gout34 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+1), val); + val = 0; + val += gout40 * dm[(j0+0)*nao+(l0+0)]; + val += gout46 * dm[(j0+1)*nao+(l0+0)]; + val += gout52 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+2), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(l0+0)]; + val += gout11 * dm[(j0+1)*nao+(l0+0)]; + val += gout17 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+0), val); + val = 0; + val += gout23 * dm[(j0+0)*nao+(l0+0)]; + val += gout29 * dm[(j0+1)*nao+(l0+0)]; + val += gout35 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+1), val); + val = 0; + val += gout41 * dm[(j0+0)*nao+(l0+0)]; + val += gout47 * dm[(j0+1)*nao+(l0+0)]; + val += gout53 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+2), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + val += gout3 * dm[(i0+3)*nao+(l0+0)]; + val += gout4 * dm[(i0+4)*nao+(l0+0)]; + val += gout5 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + val = 0; + val += gout18 * dm[(i0+0)*nao+(l0+0)]; + val += gout19 * dm[(i0+1)*nao+(l0+0)]; + val += gout20 * dm[(i0+2)*nao+(l0+0)]; + val += gout21 * dm[(i0+3)*nao+(l0+0)]; + val += gout22 * dm[(i0+4)*nao+(l0+0)]; + val += gout23 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+1), val); + val = 0; + val += gout36 * dm[(i0+0)*nao+(l0+0)]; + val += gout37 * dm[(i0+1)*nao+(l0+0)]; + val += gout38 * dm[(i0+2)*nao+(l0+0)]; + val += gout39 * dm[(i0+3)*nao+(l0+0)]; + val += gout40 * dm[(i0+4)*nao+(l0+0)]; + val += gout41 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+2), val); + val = 0; + val += gout6 * dm[(i0+0)*nao+(l0+0)]; + val += gout7 * dm[(i0+1)*nao+(l0+0)]; + val += gout8 * dm[(i0+2)*nao+(l0+0)]; + val += gout9 * dm[(i0+3)*nao+(l0+0)]; + val += gout10 * dm[(i0+4)*nao+(l0+0)]; + val += gout11 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+1)*nao+(k0+0), val); + val = 0; + val += gout24 * dm[(i0+0)*nao+(l0+0)]; + val += gout25 * dm[(i0+1)*nao+(l0+0)]; + val += gout26 * dm[(i0+2)*nao+(l0+0)]; + val += gout27 * dm[(i0+3)*nao+(l0+0)]; + val += gout28 * dm[(i0+4)*nao+(l0+0)]; + val += gout29 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+1)*nao+(k0+1), val); + val = 0; + val += gout42 * dm[(i0+0)*nao+(l0+0)]; + val += gout43 * dm[(i0+1)*nao+(l0+0)]; + val += gout44 * dm[(i0+2)*nao+(l0+0)]; + val += gout45 * dm[(i0+3)*nao+(l0+0)]; + val += gout46 * dm[(i0+4)*nao+(l0+0)]; + val += gout47 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+1)*nao+(k0+2), val); + val = 0; + val += gout12 * dm[(i0+0)*nao+(l0+0)]; + val += gout13 * dm[(i0+1)*nao+(l0+0)]; + val += gout14 * dm[(i0+2)*nao+(l0+0)]; + val += gout15 * dm[(i0+3)*nao+(l0+0)]; + val += gout16 * dm[(i0+4)*nao+(l0+0)]; + val += gout17 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+2)*nao+(k0+0), val); + val = 0; + val += gout30 * dm[(i0+0)*nao+(l0+0)]; + val += gout31 * dm[(i0+1)*nao+(l0+0)]; + val += gout32 * dm[(i0+2)*nao+(l0+0)]; + val += gout33 * dm[(i0+3)*nao+(l0+0)]; + val += gout34 * dm[(i0+4)*nao+(l0+0)]; + val += gout35 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+2)*nao+(k0+1), val); + val = 0; + val += gout48 * dm[(i0+0)*nao+(l0+0)]; + val += gout49 * dm[(i0+1)*nao+(l0+0)]; + val += gout50 * dm[(i0+2)*nao+(l0+0)]; + val += gout51 * dm[(i0+3)*nao+(l0+0)]; + val += gout52 * dm[(i0+4)*nao+(l0+0)]; + val += gout53 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+2)*nao+(k0+2), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +__global__ +void rys_sr_jk_2110(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_sr_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_sr_jk_2110(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_jk_2200(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double gout3; + double gout4; + double gout5; + double gout6; + double gout7; + double gout8; + double gout9; + double gout10; + double gout11; + double gout12; + double gout13; + double gout14; + double gout15; + double gout16; + double gout17; + double gout18; + double gout19; + double gout20; + double gout21; + double gout22; + double gout23; + double gout24; + double gout25; + double gout26; + double gout27; + double gout28; + double gout29; + double gout30; + double gout31; + double gout32; + double gout33; + double gout34; + double gout35; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + gout3 = 0; + gout4 = 0; + gout5 = 0; + gout6 = 0; + gout7 = 0; + gout8 = 0; + gout9 = 0; + gout10 = 0; + gout11 = 0; + gout12 = 0; + gout13 = 0; + gout14 = 0; + gout15 = 0; + gout16 = 0; + gout17 = 0; + gout18 = 0; + gout19 = 0; + gout20 = 0; + gout21 = 0; + gout22 = 0; + gout23 = 0; + gout24 = 0; + gout25 = 0; + gout26 = 0; + gout27 = 0; + gout28 = 0; + gout29 = 0; + gout30 = 0; + gout31 = 0; + gout32 = 0; + gout33 = 0; + gout34 = 0; + gout35 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(3, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(3, theta_fac*theta_rr, rw); + fac *= sqrt(theta_fac); + for (int irys = 0; irys < 3; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + } + } + if (task_id < ntasks) { + for (int irys = 0; irys < 3; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + double trr_30x = c0x * trr_20x + 2*b10 * trr_10x; + double trr_40x = c0x * trr_30x + 3*b10 * trr_20x; + double hrr_3100x = trr_40x - xjxi * trr_30x; + double hrr_2100x = trr_30x - xjxi * trr_20x; + double hrr_2200x = hrr_3100x - xjxi * hrr_2100x; + gout0 += hrr_2200x * 1 * wt; + double hrr_1100x = trr_20x - xjxi * trr_10x; + double hrr_1200x = hrr_2100x - xjxi * hrr_1100x; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += hrr_1200x * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += hrr_1200x * 1 * trr_10z; + double hrr_0100x = trr_10x - xjxi * fac; + double hrr_0200x = hrr_1100x - xjxi * hrr_0100x; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + gout3 += hrr_0200x * trr_20y * wt; + gout4 += hrr_0200x * trr_10y * trr_10z; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + gout5 += hrr_0200x * 1 * trr_20z; + double hrr_0100y = trr_10y - yjyi * 1; + gout6 += hrr_2100x * hrr_0100y * wt; + double hrr_1100y = trr_20y - yjyi * trr_10y; + gout7 += hrr_1100x * hrr_1100y * wt; + gout8 += hrr_1100x * hrr_0100y * trr_10z; + double trr_30y = c0y * trr_20y + 2*b10 * trr_10y; + double hrr_2100y = trr_30y - yjyi * trr_20y; + gout9 += hrr_0100x * hrr_2100y * wt; + gout10 += hrr_0100x * hrr_1100y * trr_10z; + gout11 += hrr_0100x * hrr_0100y * trr_20z; + double hrr_0100z = trr_10z - zjzi * wt; + gout12 += hrr_2100x * 1 * hrr_0100z; + gout13 += hrr_1100x * trr_10y * hrr_0100z; + double hrr_1100z = trr_20z - zjzi * trr_10z; + gout14 += hrr_1100x * 1 * hrr_1100z; + gout15 += hrr_0100x * trr_20y * hrr_0100z; + gout16 += hrr_0100x * trr_10y * hrr_1100z; + double trr_30z = c0z * trr_20z + 2*b10 * trr_10z; + double hrr_2100z = trr_30z - zjzi * trr_20z; + gout17 += hrr_0100x * 1 * hrr_2100z; + double hrr_0200y = hrr_1100y - yjyi * hrr_0100y; + gout18 += trr_20x * hrr_0200y * wt; + double hrr_1200y = hrr_2100y - yjyi * hrr_1100y; + gout19 += trr_10x * hrr_1200y * wt; + gout20 += trr_10x * hrr_0200y * trr_10z; + double trr_40y = c0y * trr_30y + 3*b10 * trr_20y; + double hrr_3100y = trr_40y - yjyi * trr_30y; + double hrr_2200y = hrr_3100y - yjyi * hrr_2100y; + gout21 += fac * hrr_2200y * wt; + gout22 += fac * hrr_1200y * trr_10z; + gout23 += fac * hrr_0200y * trr_20z; + gout24 += trr_20x * hrr_0100y * hrr_0100z; + gout25 += trr_10x * hrr_1100y * hrr_0100z; + gout26 += trr_10x * hrr_0100y * hrr_1100z; + gout27 += fac * hrr_2100y * hrr_0100z; + gout28 += fac * hrr_1100y * hrr_1100z; + gout29 += fac * hrr_0100y * hrr_2100z; + double hrr_0200z = hrr_1100z - zjzi * hrr_0100z; + gout30 += trr_20x * 1 * hrr_0200z; + gout31 += trr_10x * trr_10y * hrr_0200z; + double hrr_1200z = hrr_2100z - zjzi * hrr_1100z; + gout32 += trr_10x * 1 * hrr_1200z; + gout33 += fac * trr_20y * hrr_0200z; + gout34 += fac * trr_10y * hrr_1200z; + double trr_40z = c0z * trr_30z + 3*b10 * trr_20z; + double hrr_3100z = trr_40z - zjzi * trr_30z; + double hrr_2200z = hrr_3100z - zjzi * hrr_2100z; + gout35 += fac * 1 * hrr_2200z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout6 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+1), val); + val = 0; + val += gout12 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+2), val); + val = 0; + val += gout18 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+3), val); + val = 0; + val += gout24 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+4), val); + val = 0; + val += gout30 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+5), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout7 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+1), val); + val = 0; + val += gout13 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+2), val); + val = 0; + val += gout19 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+3), val); + val = 0; + val += gout25 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+4), val); + val = 0; + val += gout31 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+5), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout8 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+1), val); + val = 0; + val += gout14 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+2), val); + val = 0; + val += gout20 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+3), val); + val = 0; + val += gout26 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+4), val); + val = 0; + val += gout32 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+5), val); + val = 0; + val += gout3 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+0), val); + val = 0; + val += gout9 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+1), val); + val = 0; + val += gout15 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+2), val); + val = 0; + val += gout21 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+3), val); + val = 0; + val += gout27 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+4), val); + val = 0; + val += gout33 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+5), val); + val = 0; + val += gout4 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+0), val); + val = 0; + val += gout10 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+1), val); + val = 0; + val += gout16 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+2), val); + val = 0; + val += gout22 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+3), val); + val = 0; + val += gout28 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+4), val); + val = 0; + val += gout34 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+5), val); + val = 0; + val += gout5 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+0), val); + val = 0; + val += gout11 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+1), val); + val = 0; + val += gout17 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+2), val); + val = 0; + val += gout23 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+3), val); + val = 0; + val += gout29 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+4), val); + val = 0; + val += gout35 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+5), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + val += gout3 * dm[(j0+0)*nao+(i0+3)]; + val += gout4 * dm[(j0+0)*nao+(i0+4)]; + val += gout5 * dm[(j0+0)*nao+(i0+5)]; + val += gout6 * dm[(j0+1)*nao+(i0+0)]; + val += gout7 * dm[(j0+1)*nao+(i0+1)]; + val += gout8 * dm[(j0+1)*nao+(i0+2)]; + val += gout9 * dm[(j0+1)*nao+(i0+3)]; + val += gout10 * dm[(j0+1)*nao+(i0+4)]; + val += gout11 * dm[(j0+1)*nao+(i0+5)]; + val += gout12 * dm[(j0+2)*nao+(i0+0)]; + val += gout13 * dm[(j0+2)*nao+(i0+1)]; + val += gout14 * dm[(j0+2)*nao+(i0+2)]; + val += gout15 * dm[(j0+2)*nao+(i0+3)]; + val += gout16 * dm[(j0+2)*nao+(i0+4)]; + val += gout17 * dm[(j0+2)*nao+(i0+5)]; + val += gout18 * dm[(j0+3)*nao+(i0+0)]; + val += gout19 * dm[(j0+3)*nao+(i0+1)]; + val += gout20 * dm[(j0+3)*nao+(i0+2)]; + val += gout21 * dm[(j0+3)*nao+(i0+3)]; + val += gout22 * dm[(j0+3)*nao+(i0+4)]; + val += gout23 * dm[(j0+3)*nao+(i0+5)]; + val += gout24 * dm[(j0+4)*nao+(i0+0)]; + val += gout25 * dm[(j0+4)*nao+(i0+1)]; + val += gout26 * dm[(j0+4)*nao+(i0+2)]; + val += gout27 * dm[(j0+4)*nao+(i0+3)]; + val += gout28 * dm[(j0+4)*nao+(i0+4)]; + val += gout29 * dm[(j0+4)*nao+(i0+5)]; + val += gout30 * dm[(j0+5)*nao+(i0+0)]; + val += gout31 * dm[(j0+5)*nao+(i0+1)]; + val += gout32 * dm[(j0+5)*nao+(i0+2)]; + val += gout33 * dm[(j0+5)*nao+(i0+3)]; + val += gout34 * dm[(j0+5)*nao+(i0+4)]; + val += gout35 * dm[(j0+5)*nao+(i0+5)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + val += gout6 * dm[(j0+1)*nao+(k0+0)]; + val += gout12 * dm[(j0+2)*nao+(k0+0)]; + val += gout18 * dm[(j0+3)*nao+(k0+0)]; + val += gout24 * dm[(j0+4)*nao+(k0+0)]; + val += gout30 * dm[(j0+5)*nao+(k0+0)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + val += gout7 * dm[(j0+1)*nao+(k0+0)]; + val += gout13 * dm[(j0+2)*nao+(k0+0)]; + val += gout19 * dm[(j0+3)*nao+(k0+0)]; + val += gout25 * dm[(j0+4)*nao+(k0+0)]; + val += gout31 * dm[(j0+5)*nao+(k0+0)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + val += gout8 * dm[(j0+1)*nao+(k0+0)]; + val += gout14 * dm[(j0+2)*nao+(k0+0)]; + val += gout20 * dm[(j0+3)*nao+(k0+0)]; + val += gout26 * dm[(j0+4)*nao+(k0+0)]; + val += gout32 * dm[(j0+5)*nao+(k0+0)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(k0+0)]; + val += gout9 * dm[(j0+1)*nao+(k0+0)]; + val += gout15 * dm[(j0+2)*nao+(k0+0)]; + val += gout21 * dm[(j0+3)*nao+(k0+0)]; + val += gout27 * dm[(j0+4)*nao+(k0+0)]; + val += gout33 * dm[(j0+5)*nao+(k0+0)]; + atomicAdd(vk+(i0+3)*nao+(l0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(k0+0)]; + val += gout10 * dm[(j0+1)*nao+(k0+0)]; + val += gout16 * dm[(j0+2)*nao+(k0+0)]; + val += gout22 * dm[(j0+3)*nao+(k0+0)]; + val += gout28 * dm[(j0+4)*nao+(k0+0)]; + val += gout34 * dm[(j0+5)*nao+(k0+0)]; + atomicAdd(vk+(i0+4)*nao+(l0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(k0+0)]; + val += gout11 * dm[(j0+1)*nao+(k0+0)]; + val += gout17 * dm[(j0+2)*nao+(k0+0)]; + val += gout23 * dm[(j0+3)*nao+(k0+0)]; + val += gout29 * dm[(j0+4)*nao+(k0+0)]; + val += gout35 * dm[(j0+5)*nao+(k0+0)]; + atomicAdd(vk+(i0+5)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + val += gout3 * dm[(i0+3)*nao+(k0+0)]; + val += gout4 * dm[(i0+4)*nao+(k0+0)]; + val += gout5 * dm[(i0+5)*nao+(k0+0)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout6 * dm[(i0+0)*nao+(k0+0)]; + val += gout7 * dm[(i0+1)*nao+(k0+0)]; + val += gout8 * dm[(i0+2)*nao+(k0+0)]; + val += gout9 * dm[(i0+3)*nao+(k0+0)]; + val += gout10 * dm[(i0+4)*nao+(k0+0)]; + val += gout11 * dm[(i0+5)*nao+(k0+0)]; + atomicAdd(vk+(j0+1)*nao+(l0+0), val); + val = 0; + val += gout12 * dm[(i0+0)*nao+(k0+0)]; + val += gout13 * dm[(i0+1)*nao+(k0+0)]; + val += gout14 * dm[(i0+2)*nao+(k0+0)]; + val += gout15 * dm[(i0+3)*nao+(k0+0)]; + val += gout16 * dm[(i0+4)*nao+(k0+0)]; + val += gout17 * dm[(i0+5)*nao+(k0+0)]; + atomicAdd(vk+(j0+2)*nao+(l0+0), val); + val = 0; + val += gout18 * dm[(i0+0)*nao+(k0+0)]; + val += gout19 * dm[(i0+1)*nao+(k0+0)]; + val += gout20 * dm[(i0+2)*nao+(k0+0)]; + val += gout21 * dm[(i0+3)*nao+(k0+0)]; + val += gout22 * dm[(i0+4)*nao+(k0+0)]; + val += gout23 * dm[(i0+5)*nao+(k0+0)]; + atomicAdd(vk+(j0+3)*nao+(l0+0), val); + val = 0; + val += gout24 * dm[(i0+0)*nao+(k0+0)]; + val += gout25 * dm[(i0+1)*nao+(k0+0)]; + val += gout26 * dm[(i0+2)*nao+(k0+0)]; + val += gout27 * dm[(i0+3)*nao+(k0+0)]; + val += gout28 * dm[(i0+4)*nao+(k0+0)]; + val += gout29 * dm[(i0+5)*nao+(k0+0)]; + atomicAdd(vk+(j0+4)*nao+(l0+0), val); + val = 0; + val += gout30 * dm[(i0+0)*nao+(k0+0)]; + val += gout31 * dm[(i0+1)*nao+(k0+0)]; + val += gout32 * dm[(i0+2)*nao+(k0+0)]; + val += gout33 * dm[(i0+3)*nao+(k0+0)]; + val += gout34 * dm[(i0+4)*nao+(k0+0)]; + val += gout35 * dm[(i0+5)*nao+(k0+0)]; + atomicAdd(vk+(j0+5)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + val += gout6 * dm[(j0+1)*nao+(l0+0)]; + val += gout12 * dm[(j0+2)*nao+(l0+0)]; + val += gout18 * dm[(j0+3)*nao+(l0+0)]; + val += gout24 * dm[(j0+4)*nao+(l0+0)]; + val += gout30 * dm[(j0+5)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + val += gout7 * dm[(j0+1)*nao+(l0+0)]; + val += gout13 * dm[(j0+2)*nao+(l0+0)]; + val += gout19 * dm[(j0+3)*nao+(l0+0)]; + val += gout25 * dm[(j0+4)*nao+(l0+0)]; + val += gout31 * dm[(j0+5)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + val += gout8 * dm[(j0+1)*nao+(l0+0)]; + val += gout14 * dm[(j0+2)*nao+(l0+0)]; + val += gout20 * dm[(j0+3)*nao+(l0+0)]; + val += gout26 * dm[(j0+4)*nao+(l0+0)]; + val += gout32 * dm[(j0+5)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(l0+0)]; + val += gout9 * dm[(j0+1)*nao+(l0+0)]; + val += gout15 * dm[(j0+2)*nao+(l0+0)]; + val += gout21 * dm[(j0+3)*nao+(l0+0)]; + val += gout27 * dm[(j0+4)*nao+(l0+0)]; + val += gout33 * dm[(j0+5)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(l0+0)]; + val += gout10 * dm[(j0+1)*nao+(l0+0)]; + val += gout16 * dm[(j0+2)*nao+(l0+0)]; + val += gout22 * dm[(j0+3)*nao+(l0+0)]; + val += gout28 * dm[(j0+4)*nao+(l0+0)]; + val += gout34 * dm[(j0+5)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(l0+0)]; + val += gout11 * dm[(j0+1)*nao+(l0+0)]; + val += gout17 * dm[(j0+2)*nao+(l0+0)]; + val += gout23 * dm[(j0+3)*nao+(l0+0)]; + val += gout29 * dm[(j0+4)*nao+(l0+0)]; + val += gout35 * dm[(j0+5)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + val += gout3 * dm[(i0+3)*nao+(l0+0)]; + val += gout4 * dm[(i0+4)*nao+(l0+0)]; + val += gout5 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + val = 0; + val += gout6 * dm[(i0+0)*nao+(l0+0)]; + val += gout7 * dm[(i0+1)*nao+(l0+0)]; + val += gout8 * dm[(i0+2)*nao+(l0+0)]; + val += gout9 * dm[(i0+3)*nao+(l0+0)]; + val += gout10 * dm[(i0+4)*nao+(l0+0)]; + val += gout11 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+1)*nao+(k0+0), val); + val = 0; + val += gout12 * dm[(i0+0)*nao+(l0+0)]; + val += gout13 * dm[(i0+1)*nao+(l0+0)]; + val += gout14 * dm[(i0+2)*nao+(l0+0)]; + val += gout15 * dm[(i0+3)*nao+(l0+0)]; + val += gout16 * dm[(i0+4)*nao+(l0+0)]; + val += gout17 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+2)*nao+(k0+0), val); + val = 0; + val += gout18 * dm[(i0+0)*nao+(l0+0)]; + val += gout19 * dm[(i0+1)*nao+(l0+0)]; + val += gout20 * dm[(i0+2)*nao+(l0+0)]; + val += gout21 * dm[(i0+3)*nao+(l0+0)]; + val += gout22 * dm[(i0+4)*nao+(l0+0)]; + val += gout23 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+3)*nao+(k0+0), val); + val = 0; + val += gout24 * dm[(i0+0)*nao+(l0+0)]; + val += gout25 * dm[(i0+1)*nao+(l0+0)]; + val += gout26 * dm[(i0+2)*nao+(l0+0)]; + val += gout27 * dm[(i0+3)*nao+(l0+0)]; + val += gout28 * dm[(i0+4)*nao+(l0+0)]; + val += gout29 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+4)*nao+(k0+0), val); + val = 0; + val += gout30 * dm[(i0+0)*nao+(l0+0)]; + val += gout31 * dm[(i0+1)*nao+(l0+0)]; + val += gout32 * dm[(i0+2)*nao+(l0+0)]; + val += gout33 * dm[(i0+3)*nao+(l0+0)]; + val += gout34 * dm[(i0+4)*nao+(l0+0)]; + val += gout35 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+5)*nao+(k0+0), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +__global__ +void rys_jk_2200(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_jk_2200(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_sr_jk_2200(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double gout3; + double gout4; + double gout5; + double gout6; + double gout7; + double gout8; + double gout9; + double gout10; + double gout11; + double gout12; + double gout13; + double gout14; + double gout15; + double gout16; + double gout17; + double gout18; + double gout19; + double gout20; + double gout21; + double gout22; + double gout23; + double gout24; + double gout25; + double gout26; + double gout27; + double gout28; + double gout29; + double gout30; + double gout31; + double gout32; + double gout33; + double gout34; + double gout35; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + gout3 = 0; + gout4 = 0; + gout5 = 0; + gout6 = 0; + gout7 = 0; + gout8 = 0; + gout9 = 0; + gout10 = 0; + gout11 = 0; + gout12 = 0; + gout13 = 0; + gout14 = 0; + gout15 = 0; + gout16 = 0; + gout17 = 0; + gout18 = 0; + gout19 = 0; + gout20 = 0; + gout21 = 0; + gout22 = 0; + gout23 = 0; + gout24 = 0; + gout25 = 0; + gout26 = 0; + gout27 = 0; + gout28 = 0; + gout29 = 0; + gout30 = 0; + gout31 = 0; + gout32 = 0; + gout33 = 0; + gout34 = 0; + gout35 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + rys_roots(3, theta_rr, rw+6*nsq_per_block); + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(3, theta_fac*theta_rr, rw); + double sqrt_theta_fac = -sqrt(theta_fac); + for (int irys = 0; irys < 3; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + rw[sq_id+(irys*2+1)*nsq_per_block] *= sqrt_theta_fac; + } + if (task_id < ntasks) { + for (int irys = 0; irys < 6; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + double trr_30x = c0x * trr_20x + 2*b10 * trr_10x; + double trr_40x = c0x * trr_30x + 3*b10 * trr_20x; + double hrr_3100x = trr_40x - xjxi * trr_30x; + double hrr_2100x = trr_30x - xjxi * trr_20x; + double hrr_2200x = hrr_3100x - xjxi * hrr_2100x; + gout0 += hrr_2200x * 1 * wt; + double hrr_1100x = trr_20x - xjxi * trr_10x; + double hrr_1200x = hrr_2100x - xjxi * hrr_1100x; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += hrr_1200x * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += hrr_1200x * 1 * trr_10z; + double hrr_0100x = trr_10x - xjxi * fac; + double hrr_0200x = hrr_1100x - xjxi * hrr_0100x; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + gout3 += hrr_0200x * trr_20y * wt; + gout4 += hrr_0200x * trr_10y * trr_10z; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + gout5 += hrr_0200x * 1 * trr_20z; + double hrr_0100y = trr_10y - yjyi * 1; + gout6 += hrr_2100x * hrr_0100y * wt; + double hrr_1100y = trr_20y - yjyi * trr_10y; + gout7 += hrr_1100x * hrr_1100y * wt; + gout8 += hrr_1100x * hrr_0100y * trr_10z; + double trr_30y = c0y * trr_20y + 2*b10 * trr_10y; + double hrr_2100y = trr_30y - yjyi * trr_20y; + gout9 += hrr_0100x * hrr_2100y * wt; + gout10 += hrr_0100x * hrr_1100y * trr_10z; + gout11 += hrr_0100x * hrr_0100y * trr_20z; + double hrr_0100z = trr_10z - zjzi * wt; + gout12 += hrr_2100x * 1 * hrr_0100z; + gout13 += hrr_1100x * trr_10y * hrr_0100z; + double hrr_1100z = trr_20z - zjzi * trr_10z; + gout14 += hrr_1100x * 1 * hrr_1100z; + gout15 += hrr_0100x * trr_20y * hrr_0100z; + gout16 += hrr_0100x * trr_10y * hrr_1100z; + double trr_30z = c0z * trr_20z + 2*b10 * trr_10z; + double hrr_2100z = trr_30z - zjzi * trr_20z; + gout17 += hrr_0100x * 1 * hrr_2100z; + double hrr_0200y = hrr_1100y - yjyi * hrr_0100y; + gout18 += trr_20x * hrr_0200y * wt; + double hrr_1200y = hrr_2100y - yjyi * hrr_1100y; + gout19 += trr_10x * hrr_1200y * wt; + gout20 += trr_10x * hrr_0200y * trr_10z; + double trr_40y = c0y * trr_30y + 3*b10 * trr_20y; + double hrr_3100y = trr_40y - yjyi * trr_30y; + double hrr_2200y = hrr_3100y - yjyi * hrr_2100y; + gout21 += fac * hrr_2200y * wt; + gout22 += fac * hrr_1200y * trr_10z; + gout23 += fac * hrr_0200y * trr_20z; + gout24 += trr_20x * hrr_0100y * hrr_0100z; + gout25 += trr_10x * hrr_1100y * hrr_0100z; + gout26 += trr_10x * hrr_0100y * hrr_1100z; + gout27 += fac * hrr_2100y * hrr_0100z; + gout28 += fac * hrr_1100y * hrr_1100z; + gout29 += fac * hrr_0100y * hrr_2100z; + double hrr_0200z = hrr_1100z - zjzi * hrr_0100z; + gout30 += trr_20x * 1 * hrr_0200z; + gout31 += trr_10x * trr_10y * hrr_0200z; + double hrr_1200z = hrr_2100z - zjzi * hrr_1100z; + gout32 += trr_10x * 1 * hrr_1200z; + gout33 += fac * trr_20y * hrr_0200z; + gout34 += fac * trr_10y * hrr_1200z; + double trr_40z = c0z * trr_30z + 3*b10 * trr_20z; + double hrr_3100z = trr_40z - zjzi * trr_30z; + double hrr_2200z = hrr_3100z - zjzi * hrr_2100z; + gout35 += fac * 1 * hrr_2200z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout6 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+1), val); + val = 0; + val += gout12 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+2), val); + val = 0; + val += gout18 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+3), val); + val = 0; + val += gout24 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+4), val); + val = 0; + val += gout30 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+5), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout7 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+1), val); + val = 0; + val += gout13 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+2), val); + val = 0; + val += gout19 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+3), val); + val = 0; + val += gout25 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+4), val); + val = 0; + val += gout31 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+5), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout8 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+1), val); + val = 0; + val += gout14 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+2), val); + val = 0; + val += gout20 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+3), val); + val = 0; + val += gout26 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+4), val); + val = 0; + val += gout32 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+5), val); + val = 0; + val += gout3 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+0), val); + val = 0; + val += gout9 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+1), val); + val = 0; + val += gout15 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+2), val); + val = 0; + val += gout21 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+3), val); + val = 0; + val += gout27 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+4), val); + val = 0; + val += gout33 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+5), val); + val = 0; + val += gout4 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+0), val); + val = 0; + val += gout10 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+1), val); + val = 0; + val += gout16 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+2), val); + val = 0; + val += gout22 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+3), val); + val = 0; + val += gout28 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+4), val); + val = 0; + val += gout34 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+5), val); + val = 0; + val += gout5 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+0), val); + val = 0; + val += gout11 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+1), val); + val = 0; + val += gout17 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+2), val); + val = 0; + val += gout23 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+3), val); + val = 0; + val += gout29 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+4), val); + val = 0; + val += gout35 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+5), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + val += gout3 * dm[(j0+0)*nao+(i0+3)]; + val += gout4 * dm[(j0+0)*nao+(i0+4)]; + val += gout5 * dm[(j0+0)*nao+(i0+5)]; + val += gout6 * dm[(j0+1)*nao+(i0+0)]; + val += gout7 * dm[(j0+1)*nao+(i0+1)]; + val += gout8 * dm[(j0+1)*nao+(i0+2)]; + val += gout9 * dm[(j0+1)*nao+(i0+3)]; + val += gout10 * dm[(j0+1)*nao+(i0+4)]; + val += gout11 * dm[(j0+1)*nao+(i0+5)]; + val += gout12 * dm[(j0+2)*nao+(i0+0)]; + val += gout13 * dm[(j0+2)*nao+(i0+1)]; + val += gout14 * dm[(j0+2)*nao+(i0+2)]; + val += gout15 * dm[(j0+2)*nao+(i0+3)]; + val += gout16 * dm[(j0+2)*nao+(i0+4)]; + val += gout17 * dm[(j0+2)*nao+(i0+5)]; + val += gout18 * dm[(j0+3)*nao+(i0+0)]; + val += gout19 * dm[(j0+3)*nao+(i0+1)]; + val += gout20 * dm[(j0+3)*nao+(i0+2)]; + val += gout21 * dm[(j0+3)*nao+(i0+3)]; + val += gout22 * dm[(j0+3)*nao+(i0+4)]; + val += gout23 * dm[(j0+3)*nao+(i0+5)]; + val += gout24 * dm[(j0+4)*nao+(i0+0)]; + val += gout25 * dm[(j0+4)*nao+(i0+1)]; + val += gout26 * dm[(j0+4)*nao+(i0+2)]; + val += gout27 * dm[(j0+4)*nao+(i0+3)]; + val += gout28 * dm[(j0+4)*nao+(i0+4)]; + val += gout29 * dm[(j0+4)*nao+(i0+5)]; + val += gout30 * dm[(j0+5)*nao+(i0+0)]; + val += gout31 * dm[(j0+5)*nao+(i0+1)]; + val += gout32 * dm[(j0+5)*nao+(i0+2)]; + val += gout33 * dm[(j0+5)*nao+(i0+3)]; + val += gout34 * dm[(j0+5)*nao+(i0+4)]; + val += gout35 * dm[(j0+5)*nao+(i0+5)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + val += gout6 * dm[(j0+1)*nao+(k0+0)]; + val += gout12 * dm[(j0+2)*nao+(k0+0)]; + val += gout18 * dm[(j0+3)*nao+(k0+0)]; + val += gout24 * dm[(j0+4)*nao+(k0+0)]; + val += gout30 * dm[(j0+5)*nao+(k0+0)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + val += gout7 * dm[(j0+1)*nao+(k0+0)]; + val += gout13 * dm[(j0+2)*nao+(k0+0)]; + val += gout19 * dm[(j0+3)*nao+(k0+0)]; + val += gout25 * dm[(j0+4)*nao+(k0+0)]; + val += gout31 * dm[(j0+5)*nao+(k0+0)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + val += gout8 * dm[(j0+1)*nao+(k0+0)]; + val += gout14 * dm[(j0+2)*nao+(k0+0)]; + val += gout20 * dm[(j0+3)*nao+(k0+0)]; + val += gout26 * dm[(j0+4)*nao+(k0+0)]; + val += gout32 * dm[(j0+5)*nao+(k0+0)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(k0+0)]; + val += gout9 * dm[(j0+1)*nao+(k0+0)]; + val += gout15 * dm[(j0+2)*nao+(k0+0)]; + val += gout21 * dm[(j0+3)*nao+(k0+0)]; + val += gout27 * dm[(j0+4)*nao+(k0+0)]; + val += gout33 * dm[(j0+5)*nao+(k0+0)]; + atomicAdd(vk+(i0+3)*nao+(l0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(k0+0)]; + val += gout10 * dm[(j0+1)*nao+(k0+0)]; + val += gout16 * dm[(j0+2)*nao+(k0+0)]; + val += gout22 * dm[(j0+3)*nao+(k0+0)]; + val += gout28 * dm[(j0+4)*nao+(k0+0)]; + val += gout34 * dm[(j0+5)*nao+(k0+0)]; + atomicAdd(vk+(i0+4)*nao+(l0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(k0+0)]; + val += gout11 * dm[(j0+1)*nao+(k0+0)]; + val += gout17 * dm[(j0+2)*nao+(k0+0)]; + val += gout23 * dm[(j0+3)*nao+(k0+0)]; + val += gout29 * dm[(j0+4)*nao+(k0+0)]; + val += gout35 * dm[(j0+5)*nao+(k0+0)]; + atomicAdd(vk+(i0+5)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + val += gout3 * dm[(i0+3)*nao+(k0+0)]; + val += gout4 * dm[(i0+4)*nao+(k0+0)]; + val += gout5 * dm[(i0+5)*nao+(k0+0)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout6 * dm[(i0+0)*nao+(k0+0)]; + val += gout7 * dm[(i0+1)*nao+(k0+0)]; + val += gout8 * dm[(i0+2)*nao+(k0+0)]; + val += gout9 * dm[(i0+3)*nao+(k0+0)]; + val += gout10 * dm[(i0+4)*nao+(k0+0)]; + val += gout11 * dm[(i0+5)*nao+(k0+0)]; + atomicAdd(vk+(j0+1)*nao+(l0+0), val); + val = 0; + val += gout12 * dm[(i0+0)*nao+(k0+0)]; + val += gout13 * dm[(i0+1)*nao+(k0+0)]; + val += gout14 * dm[(i0+2)*nao+(k0+0)]; + val += gout15 * dm[(i0+3)*nao+(k0+0)]; + val += gout16 * dm[(i0+4)*nao+(k0+0)]; + val += gout17 * dm[(i0+5)*nao+(k0+0)]; + atomicAdd(vk+(j0+2)*nao+(l0+0), val); + val = 0; + val += gout18 * dm[(i0+0)*nao+(k0+0)]; + val += gout19 * dm[(i0+1)*nao+(k0+0)]; + val += gout20 * dm[(i0+2)*nao+(k0+0)]; + val += gout21 * dm[(i0+3)*nao+(k0+0)]; + val += gout22 * dm[(i0+4)*nao+(k0+0)]; + val += gout23 * dm[(i0+5)*nao+(k0+0)]; + atomicAdd(vk+(j0+3)*nao+(l0+0), val); + val = 0; + val += gout24 * dm[(i0+0)*nao+(k0+0)]; + val += gout25 * dm[(i0+1)*nao+(k0+0)]; + val += gout26 * dm[(i0+2)*nao+(k0+0)]; + val += gout27 * dm[(i0+3)*nao+(k0+0)]; + val += gout28 * dm[(i0+4)*nao+(k0+0)]; + val += gout29 * dm[(i0+5)*nao+(k0+0)]; + atomicAdd(vk+(j0+4)*nao+(l0+0), val); + val = 0; + val += gout30 * dm[(i0+0)*nao+(k0+0)]; + val += gout31 * dm[(i0+1)*nao+(k0+0)]; + val += gout32 * dm[(i0+2)*nao+(k0+0)]; + val += gout33 * dm[(i0+3)*nao+(k0+0)]; + val += gout34 * dm[(i0+4)*nao+(k0+0)]; + val += gout35 * dm[(i0+5)*nao+(k0+0)]; + atomicAdd(vk+(j0+5)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + val += gout6 * dm[(j0+1)*nao+(l0+0)]; + val += gout12 * dm[(j0+2)*nao+(l0+0)]; + val += gout18 * dm[(j0+3)*nao+(l0+0)]; + val += gout24 * dm[(j0+4)*nao+(l0+0)]; + val += gout30 * dm[(j0+5)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + val += gout7 * dm[(j0+1)*nao+(l0+0)]; + val += gout13 * dm[(j0+2)*nao+(l0+0)]; + val += gout19 * dm[(j0+3)*nao+(l0+0)]; + val += gout25 * dm[(j0+4)*nao+(l0+0)]; + val += gout31 * dm[(j0+5)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + val += gout8 * dm[(j0+1)*nao+(l0+0)]; + val += gout14 * dm[(j0+2)*nao+(l0+0)]; + val += gout20 * dm[(j0+3)*nao+(l0+0)]; + val += gout26 * dm[(j0+4)*nao+(l0+0)]; + val += gout32 * dm[(j0+5)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(l0+0)]; + val += gout9 * dm[(j0+1)*nao+(l0+0)]; + val += gout15 * dm[(j0+2)*nao+(l0+0)]; + val += gout21 * dm[(j0+3)*nao+(l0+0)]; + val += gout27 * dm[(j0+4)*nao+(l0+0)]; + val += gout33 * dm[(j0+5)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(l0+0)]; + val += gout10 * dm[(j0+1)*nao+(l0+0)]; + val += gout16 * dm[(j0+2)*nao+(l0+0)]; + val += gout22 * dm[(j0+3)*nao+(l0+0)]; + val += gout28 * dm[(j0+4)*nao+(l0+0)]; + val += gout34 * dm[(j0+5)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(l0+0)]; + val += gout11 * dm[(j0+1)*nao+(l0+0)]; + val += gout17 * dm[(j0+2)*nao+(l0+0)]; + val += gout23 * dm[(j0+3)*nao+(l0+0)]; + val += gout29 * dm[(j0+4)*nao+(l0+0)]; + val += gout35 * dm[(j0+5)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + val += gout3 * dm[(i0+3)*nao+(l0+0)]; + val += gout4 * dm[(i0+4)*nao+(l0+0)]; + val += gout5 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + val = 0; + val += gout6 * dm[(i0+0)*nao+(l0+0)]; + val += gout7 * dm[(i0+1)*nao+(l0+0)]; + val += gout8 * dm[(i0+2)*nao+(l0+0)]; + val += gout9 * dm[(i0+3)*nao+(l0+0)]; + val += gout10 * dm[(i0+4)*nao+(l0+0)]; + val += gout11 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+1)*nao+(k0+0), val); + val = 0; + val += gout12 * dm[(i0+0)*nao+(l0+0)]; + val += gout13 * dm[(i0+1)*nao+(l0+0)]; + val += gout14 * dm[(i0+2)*nao+(l0+0)]; + val += gout15 * dm[(i0+3)*nao+(l0+0)]; + val += gout16 * dm[(i0+4)*nao+(l0+0)]; + val += gout17 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+2)*nao+(k0+0), val); + val = 0; + val += gout18 * dm[(i0+0)*nao+(l0+0)]; + val += gout19 * dm[(i0+1)*nao+(l0+0)]; + val += gout20 * dm[(i0+2)*nao+(l0+0)]; + val += gout21 * dm[(i0+3)*nao+(l0+0)]; + val += gout22 * dm[(i0+4)*nao+(l0+0)]; + val += gout23 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+3)*nao+(k0+0), val); + val = 0; + val += gout24 * dm[(i0+0)*nao+(l0+0)]; + val += gout25 * dm[(i0+1)*nao+(l0+0)]; + val += gout26 * dm[(i0+2)*nao+(l0+0)]; + val += gout27 * dm[(i0+3)*nao+(l0+0)]; + val += gout28 * dm[(i0+4)*nao+(l0+0)]; + val += gout29 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+4)*nao+(k0+0), val); + val = 0; + val += gout30 * dm[(i0+0)*nao+(l0+0)]; + val += gout31 * dm[(i0+1)*nao+(l0+0)]; + val += gout32 * dm[(i0+2)*nao+(l0+0)]; + val += gout33 * dm[(i0+3)*nao+(l0+0)]; + val += gout34 * dm[(i0+4)*nao+(l0+0)]; + val += gout35 * dm[(i0+5)*nao+(l0+0)]; + atomicAdd(vk+(j0+5)*nao+(k0+0), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +__global__ +void rys_sr_jk_2200(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_sr_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_sr_jk_2200(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_jk_3000(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double gout3; + double gout4; + double gout5; + double gout6; + double gout7; + double gout8; + double gout9; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + gout3 = 0; + gout4 = 0; + gout5 = 0; + gout6 = 0; + gout7 = 0; + gout8 = 0; + gout9 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(2, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(2, theta_fac*theta_rr, rw); + fac *= sqrt(theta_fac); + for (int irys = 0; irys < 2; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + } + } + if (task_id < ntasks) { + for (int irys = 0; irys < 2; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + double trr_30x = c0x * trr_20x + 2*b10 * trr_10x; + gout0 += trr_30x * 1 * wt; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += trr_20x * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += trr_20x * 1 * trr_10z; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + gout3 += trr_10x * trr_20y * wt; + gout4 += trr_10x * trr_10y * trr_10z; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + gout5 += trr_10x * 1 * trr_20z; + double trr_30y = c0y * trr_20y + 2*b10 * trr_10y; + gout6 += fac * trr_30y * wt; + gout7 += fac * trr_20y * trr_10z; + gout8 += fac * trr_10y * trr_20z; + double trr_30z = c0z * trr_20z + 2*b10 * trr_10z; + gout9 += fac * 1 * trr_30z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout3 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+0), val); + val = 0; + val += gout4 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+0), val); + val = 0; + val += gout5 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+0), val); + val = 0; + val += gout6 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+6)*nao+(j0+0), val); + val = 0; + val += gout7 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+7)*nao+(j0+0), val); + val = 0; + val += gout8 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+8)*nao+(j0+0), val); + val = 0; + val += gout9 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+9)*nao+(j0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + val += gout3 * dm[(j0+0)*nao+(i0+3)]; + val += gout4 * dm[(j0+0)*nao+(i0+4)]; + val += gout5 * dm[(j0+0)*nao+(i0+5)]; + val += gout6 * dm[(j0+0)*nao+(i0+6)]; + val += gout7 * dm[(j0+0)*nao+(i0+7)]; + val += gout8 * dm[(j0+0)*nao+(i0+8)]; + val += gout9 * dm[(j0+0)*nao+(i0+9)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+3)*nao+(l0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+4)*nao+(l0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+5)*nao+(l0+0), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+6)*nao+(l0+0), val); + val = 0; + val += gout7 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+7)*nao+(l0+0), val); + val = 0; + val += gout8 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+8)*nao+(l0+0), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+9)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + val += gout3 * dm[(i0+3)*nao+(k0+0)]; + val += gout4 * dm[(i0+4)*nao+(k0+0)]; + val += gout5 * dm[(i0+5)*nao+(k0+0)]; + val += gout6 * dm[(i0+6)*nao+(k0+0)]; + val += gout7 * dm[(i0+7)*nao+(k0+0)]; + val += gout8 * dm[(i0+8)*nao+(k0+0)]; + val += gout9 * dm[(i0+9)*nao+(k0+0)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+0), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+6)*nao+(k0+0), val); + val = 0; + val += gout7 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+7)*nao+(k0+0), val); + val = 0; + val += gout8 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+8)*nao+(k0+0), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+9)*nao+(k0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + val += gout3 * dm[(i0+3)*nao+(l0+0)]; + val += gout4 * dm[(i0+4)*nao+(l0+0)]; + val += gout5 * dm[(i0+5)*nao+(l0+0)]; + val += gout6 * dm[(i0+6)*nao+(l0+0)]; + val += gout7 * dm[(i0+7)*nao+(l0+0)]; + val += gout8 * dm[(i0+8)*nao+(l0+0)]; + val += gout9 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +#if CUDA_VERSION >= 12040 +__global__ __maxnreg__(128) +#else +__global__ +#endif +void rys_jk_3000(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_jk_3000(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_sr_jk_3000(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double gout3; + double gout4; + double gout5; + double gout6; + double gout7; + double gout8; + double gout9; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + gout3 = 0; + gout4 = 0; + gout5 = 0; + gout6 = 0; + gout7 = 0; + gout8 = 0; + gout9 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + rys_roots(2, theta_rr, rw+4*nsq_per_block); + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(2, theta_fac*theta_rr, rw); + double sqrt_theta_fac = -sqrt(theta_fac); + for (int irys = 0; irys < 2; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + rw[sq_id+(irys*2+1)*nsq_per_block] *= sqrt_theta_fac; + } + if (task_id < ntasks) { + for (int irys = 0; irys < 4; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + double trr_30x = c0x * trr_20x + 2*b10 * trr_10x; + gout0 += trr_30x * 1 * wt; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += trr_20x * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += trr_20x * 1 * trr_10z; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + gout3 += trr_10x * trr_20y * wt; + gout4 += trr_10x * trr_10y * trr_10z; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + gout5 += trr_10x * 1 * trr_20z; + double trr_30y = c0y * trr_20y + 2*b10 * trr_10y; + gout6 += fac * trr_30y * wt; + gout7 += fac * trr_20y * trr_10z; + gout8 += fac * trr_10y * trr_20z; + double trr_30z = c0z * trr_20z + 2*b10 * trr_10z; + gout9 += fac * 1 * trr_30z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout3 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+0), val); + val = 0; + val += gout4 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+0), val); + val = 0; + val += gout5 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+0), val); + val = 0; + val += gout6 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+6)*nao+(j0+0), val); + val = 0; + val += gout7 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+7)*nao+(j0+0), val); + val = 0; + val += gout8 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+8)*nao+(j0+0), val); + val = 0; + val += gout9 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+9)*nao+(j0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + val += gout3 * dm[(j0+0)*nao+(i0+3)]; + val += gout4 * dm[(j0+0)*nao+(i0+4)]; + val += gout5 * dm[(j0+0)*nao+(i0+5)]; + val += gout6 * dm[(j0+0)*nao+(i0+6)]; + val += gout7 * dm[(j0+0)*nao+(i0+7)]; + val += gout8 * dm[(j0+0)*nao+(i0+8)]; + val += gout9 * dm[(j0+0)*nao+(i0+9)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+3)*nao+(l0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+4)*nao+(l0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+5)*nao+(l0+0), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+6)*nao+(l0+0), val); + val = 0; + val += gout7 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+7)*nao+(l0+0), val); + val = 0; + val += gout8 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+8)*nao+(l0+0), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(k0+0)]; + atomicAdd(vk+(i0+9)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + val += gout3 * dm[(i0+3)*nao+(k0+0)]; + val += gout4 * dm[(i0+4)*nao+(k0+0)]; + val += gout5 * dm[(i0+5)*nao+(k0+0)]; + val += gout6 * dm[(i0+6)*nao+(k0+0)]; + val += gout7 * dm[(i0+7)*nao+(k0+0)]; + val += gout8 * dm[(i0+8)*nao+(k0+0)]; + val += gout9 * dm[(i0+9)*nao+(k0+0)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+0), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+6)*nao+(k0+0), val); + val = 0; + val += gout7 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+7)*nao+(k0+0), val); + val = 0; + val += gout8 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+8)*nao+(k0+0), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+9)*nao+(k0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + val += gout3 * dm[(i0+3)*nao+(l0+0)]; + val += gout4 * dm[(i0+4)*nao+(l0+0)]; + val += gout5 * dm[(i0+5)*nao+(l0+0)]; + val += gout6 * dm[(i0+6)*nao+(l0+0)]; + val += gout7 * dm[(i0+7)*nao+(l0+0)]; + val += gout8 * dm[(i0+8)*nao+(l0+0)]; + val += gout9 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +#if CUDA_VERSION >= 12040 +__global__ __maxnreg__(128) +#else +__global__ +#endif +void rys_sr_jk_3000(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_sr_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_sr_jk_3000(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_jk_3010(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double gout3; + double gout4; + double gout5; + double gout6; + double gout7; + double gout8; + double gout9; + double gout10; + double gout11; + double gout12; + double gout13; + double gout14; + double gout15; + double gout16; + double gout17; + double gout18; + double gout19; + double gout20; + double gout21; + double gout22; + double gout23; + double gout24; + double gout25; + double gout26; + double gout27; + double gout28; + double gout29; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + gout3 = 0; + gout4 = 0; + gout5 = 0; + gout6 = 0; + gout7 = 0; + gout8 = 0; + gout9 = 0; + gout10 = 0; + gout11 = 0; + gout12 = 0; + gout13 = 0; + gout14 = 0; + gout15 = 0; + gout16 = 0; + gout17 = 0; + gout18 = 0; + gout19 = 0; + gout20 = 0; + gout21 = 0; + gout22 = 0; + gout23 = 0; + gout24 = 0; + gout25 = 0; + gout26 = 0; + gout27 = 0; + gout28 = 0; + gout29 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(3, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(3, theta_fac*theta_rr, rw); + fac *= sqrt(theta_fac); + for (int irys = 0; irys < 3; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + } + } + if (task_id < ntasks) { + for (int irys = 0; irys < 3; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double b00 = .5 * rt_aa; + double rt_akl = rt_aa * aij; + double cpx = xqc + xpq*rt_akl; + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + double trr_30x = c0x * trr_20x + 2*b10 * trr_10x; + double trr_31x = cpx * trr_30x + 3*b00 * trr_20x; + gout0 += trr_31x * 1 * wt; + double trr_21x = cpx * trr_20x + 2*b00 * trr_10x; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += trr_21x * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += trr_21x * 1 * trr_10z; + double trr_11x = cpx * trr_10x + 1*b00 * fac; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + gout3 += trr_11x * trr_20y * wt; + gout4 += trr_11x * trr_10y * trr_10z; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + gout5 += trr_11x * 1 * trr_20z; + double trr_01x = cpx * fac; + double trr_30y = c0y * trr_20y + 2*b10 * trr_10y; + gout6 += trr_01x * trr_30y * wt; + gout7 += trr_01x * trr_20y * trr_10z; + gout8 += trr_01x * trr_10y * trr_20z; + double trr_30z = c0z * trr_20z + 2*b10 * trr_10z; + gout9 += trr_01x * 1 * trr_30z; + double cpy = yqc + ypq*rt_akl; + double trr_01y = cpy * 1; + gout10 += trr_30x * trr_01y * wt; + double trr_11y = cpy * trr_10y + 1*b00 * 1; + gout11 += trr_20x * trr_11y * wt; + gout12 += trr_20x * trr_01y * trr_10z; + double trr_21y = cpy * trr_20y + 2*b00 * trr_10y; + gout13 += trr_10x * trr_21y * wt; + gout14 += trr_10x * trr_11y * trr_10z; + gout15 += trr_10x * trr_01y * trr_20z; + double trr_31y = cpy * trr_30y + 3*b00 * trr_20y; + gout16 += fac * trr_31y * wt; + gout17 += fac * trr_21y * trr_10z; + gout18 += fac * trr_11y * trr_20z; + gout19 += fac * trr_01y * trr_30z; + double cpz = zqc + zpq*rt_akl; + double trr_01z = cpz * wt; + gout20 += trr_30x * 1 * trr_01z; + gout21 += trr_20x * trr_10y * trr_01z; + double trr_11z = cpz * trr_10z + 1*b00 * wt; + gout22 += trr_20x * 1 * trr_11z; + gout23 += trr_10x * trr_20y * trr_01z; + gout24 += trr_10x * trr_10y * trr_11z; + double trr_21z = cpz * trr_20z + 2*b00 * trr_10z; + gout25 += trr_10x * 1 * trr_21z; + gout26 += fac * trr_30y * trr_01z; + gout27 += fac * trr_20y * trr_11z; + gout28 += fac * trr_10y * trr_21z; + double trr_31z = cpz * trr_30z + 3*b00 * trr_20z; + gout29 += fac * 1 * trr_31z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + val += gout10 * dm[(l0+0)*nao+(k0+1)]; + val += gout20 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + val += gout11 * dm[(l0+0)*nao+(k0+1)]; + val += gout21 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + val += gout12 * dm[(l0+0)*nao+(k0+1)]; + val += gout22 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout3 * dm[(l0+0)*nao+(k0+0)]; + val += gout13 * dm[(l0+0)*nao+(k0+1)]; + val += gout23 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+3)*nao+(j0+0), val); + val = 0; + val += gout4 * dm[(l0+0)*nao+(k0+0)]; + val += gout14 * dm[(l0+0)*nao+(k0+1)]; + val += gout24 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+4)*nao+(j0+0), val); + val = 0; + val += gout5 * dm[(l0+0)*nao+(k0+0)]; + val += gout15 * dm[(l0+0)*nao+(k0+1)]; + val += gout25 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+5)*nao+(j0+0), val); + val = 0; + val += gout6 * dm[(l0+0)*nao+(k0+0)]; + val += gout16 * dm[(l0+0)*nao+(k0+1)]; + val += gout26 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+6)*nao+(j0+0), val); + val = 0; + val += gout7 * dm[(l0+0)*nao+(k0+0)]; + val += gout17 * dm[(l0+0)*nao+(k0+1)]; + val += gout27 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+7)*nao+(j0+0), val); + val = 0; + val += gout8 * dm[(l0+0)*nao+(k0+0)]; + val += gout18 * dm[(l0+0)*nao+(k0+1)]; + val += gout28 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+8)*nao+(j0+0), val); + val = 0; + val += gout9 * dm[(l0+0)*nao+(k0+0)]; + val += gout19 * dm[(l0+0)*nao+(k0+1)]; + val += gout29 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+9)*nao+(j0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + val += gout3 * dm[(j0+0)*nao+(i0+3)]; + val += gout4 * dm[(j0+0)*nao+(i0+4)]; + val += gout5 * dm[(j0+0)*nao+(i0+5)]; + val += gout6 * dm[(j0+0)*nao+(i0+6)]; + val += gout7 * dm[(j0+0)*nao+(i0+7)]; + val += gout8 * dm[(j0+0)*nao+(i0+8)]; + val += gout9 * dm[(j0+0)*nao+(i0+9)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + val = 0; + val += gout10 * dm[(j0+0)*nao+(i0+0)]; + val += gout11 * dm[(j0+0)*nao+(i0+1)]; + val += gout12 * dm[(j0+0)*nao+(i0+2)]; + val += gout13 * dm[(j0+0)*nao+(i0+3)]; + val += gout14 * dm[(j0+0)*nao+(i0+4)]; + val += gout15 * dm[(j0+0)*nao+(i0+5)]; + val += gout16 * dm[(j0+0)*nao+(i0+6)]; + val += gout17 * dm[(j0+0)*nao+(i0+7)]; + val += gout18 * dm[(j0+0)*nao+(i0+8)]; + val += gout19 * dm[(j0+0)*nao+(i0+9)]; + atomicAdd(vj+(k0+1)*nao+(l0+0), val); + val = 0; + val += gout20 * dm[(j0+0)*nao+(i0+0)]; + val += gout21 * dm[(j0+0)*nao+(i0+1)]; + val += gout22 * dm[(j0+0)*nao+(i0+2)]; + val += gout23 * dm[(j0+0)*nao+(i0+3)]; + val += gout24 * dm[(j0+0)*nao+(i0+4)]; + val += gout25 * dm[(j0+0)*nao+(i0+5)]; + val += gout26 * dm[(j0+0)*nao+(i0+6)]; + val += gout27 * dm[(j0+0)*nao+(i0+7)]; + val += gout28 * dm[(j0+0)*nao+(i0+8)]; + val += gout29 * dm[(j0+0)*nao+(i0+9)]; + atomicAdd(vj+(k0+2)*nao+(l0+0), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + val += gout10 * dm[(j0+0)*nao+(k0+1)]; + val += gout20 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + val += gout11 * dm[(j0+0)*nao+(k0+1)]; + val += gout21 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + val += gout12 * dm[(j0+0)*nao+(k0+1)]; + val += gout22 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(k0+0)]; + val += gout13 * dm[(j0+0)*nao+(k0+1)]; + val += gout23 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+3)*nao+(l0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(k0+0)]; + val += gout14 * dm[(j0+0)*nao+(k0+1)]; + val += gout24 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+4)*nao+(l0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(k0+0)]; + val += gout15 * dm[(j0+0)*nao+(k0+1)]; + val += gout25 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+5)*nao+(l0+0), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(k0+0)]; + val += gout16 * dm[(j0+0)*nao+(k0+1)]; + val += gout26 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+6)*nao+(l0+0), val); + val = 0; + val += gout7 * dm[(j0+0)*nao+(k0+0)]; + val += gout17 * dm[(j0+0)*nao+(k0+1)]; + val += gout27 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+7)*nao+(l0+0), val); + val = 0; + val += gout8 * dm[(j0+0)*nao+(k0+0)]; + val += gout18 * dm[(j0+0)*nao+(k0+1)]; + val += gout28 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+8)*nao+(l0+0), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(k0+0)]; + val += gout19 * dm[(j0+0)*nao+(k0+1)]; + val += gout29 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+9)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout10 * dm[(i0+0)*nao+(k0+1)]; + val += gout20 * dm[(i0+0)*nao+(k0+2)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout11 * dm[(i0+1)*nao+(k0+1)]; + val += gout21 * dm[(i0+1)*nao+(k0+2)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + val += gout12 * dm[(i0+2)*nao+(k0+1)]; + val += gout22 * dm[(i0+2)*nao+(k0+2)]; + val += gout3 * dm[(i0+3)*nao+(k0+0)]; + val += gout13 * dm[(i0+3)*nao+(k0+1)]; + val += gout23 * dm[(i0+3)*nao+(k0+2)]; + val += gout4 * dm[(i0+4)*nao+(k0+0)]; + val += gout14 * dm[(i0+4)*nao+(k0+1)]; + val += gout24 * dm[(i0+4)*nao+(k0+2)]; + val += gout5 * dm[(i0+5)*nao+(k0+0)]; + val += gout15 * dm[(i0+5)*nao+(k0+1)]; + val += gout25 * dm[(i0+5)*nao+(k0+2)]; + val += gout6 * dm[(i0+6)*nao+(k0+0)]; + val += gout16 * dm[(i0+6)*nao+(k0+1)]; + val += gout26 * dm[(i0+6)*nao+(k0+2)]; + val += gout7 * dm[(i0+7)*nao+(k0+0)]; + val += gout17 * dm[(i0+7)*nao+(k0+1)]; + val += gout27 * dm[(i0+7)*nao+(k0+2)]; + val += gout8 * dm[(i0+8)*nao+(k0+0)]; + val += gout18 * dm[(i0+8)*nao+(k0+1)]; + val += gout28 * dm[(i0+8)*nao+(k0+2)]; + val += gout9 * dm[(i0+9)*nao+(k0+0)]; + val += gout19 * dm[(i0+9)*nao+(k0+1)]; + val += gout29 * dm[(i0+9)*nao+(k0+2)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout10 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+1), val); + val = 0; + val += gout20 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+2), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout11 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+1), val); + val = 0; + val += gout21 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+2), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout12 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+1), val); + val = 0; + val += gout22 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+2), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+0), val); + val = 0; + val += gout13 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+1), val); + val = 0; + val += gout23 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+2), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+0), val); + val = 0; + val += gout14 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+1), val); + val = 0; + val += gout24 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+2), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+0), val); + val = 0; + val += gout15 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+1), val); + val = 0; + val += gout25 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+2), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+6)*nao+(k0+0), val); + val = 0; + val += gout16 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+6)*nao+(k0+1), val); + val = 0; + val += gout26 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+6)*nao+(k0+2), val); + val = 0; + val += gout7 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+7)*nao+(k0+0), val); + val = 0; + val += gout17 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+7)*nao+(k0+1), val); + val = 0; + val += gout27 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+7)*nao+(k0+2), val); + val = 0; + val += gout8 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+8)*nao+(k0+0), val); + val = 0; + val += gout18 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+8)*nao+(k0+1), val); + val = 0; + val += gout28 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+8)*nao+(k0+2), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+9)*nao+(k0+0), val); + val = 0; + val += gout19 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+9)*nao+(k0+1), val); + val = 0; + val += gout29 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+9)*nao+(k0+2), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + val += gout3 * dm[(i0+3)*nao+(l0+0)]; + val += gout4 * dm[(i0+4)*nao+(l0+0)]; + val += gout5 * dm[(i0+5)*nao+(l0+0)]; + val += gout6 * dm[(i0+6)*nao+(l0+0)]; + val += gout7 * dm[(i0+7)*nao+(l0+0)]; + val += gout8 * dm[(i0+8)*nao+(l0+0)]; + val += gout9 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + val = 0; + val += gout10 * dm[(i0+0)*nao+(l0+0)]; + val += gout11 * dm[(i0+1)*nao+(l0+0)]; + val += gout12 * dm[(i0+2)*nao+(l0+0)]; + val += gout13 * dm[(i0+3)*nao+(l0+0)]; + val += gout14 * dm[(i0+4)*nao+(l0+0)]; + val += gout15 * dm[(i0+5)*nao+(l0+0)]; + val += gout16 * dm[(i0+6)*nao+(l0+0)]; + val += gout17 * dm[(i0+7)*nao+(l0+0)]; + val += gout18 * dm[(i0+8)*nao+(l0+0)]; + val += gout19 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+1), val); + val = 0; + val += gout20 * dm[(i0+0)*nao+(l0+0)]; + val += gout21 * dm[(i0+1)*nao+(l0+0)]; + val += gout22 * dm[(i0+2)*nao+(l0+0)]; + val += gout23 * dm[(i0+3)*nao+(l0+0)]; + val += gout24 * dm[(i0+4)*nao+(l0+0)]; + val += gout25 * dm[(i0+5)*nao+(l0+0)]; + val += gout26 * dm[(i0+6)*nao+(l0+0)]; + val += gout27 * dm[(i0+7)*nao+(l0+0)]; + val += gout28 * dm[(i0+8)*nao+(l0+0)]; + val += gout29 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+2), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +__global__ +void rys_jk_3010(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_jk_3010(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_sr_jk_3010(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double gout3; + double gout4; + double gout5; + double gout6; + double gout7; + double gout8; + double gout9; + double gout10; + double gout11; + double gout12; + double gout13; + double gout14; + double gout15; + double gout16; + double gout17; + double gout18; + double gout19; + double gout20; + double gout21; + double gout22; + double gout23; + double gout24; + double gout25; + double gout26; + double gout27; + double gout28; + double gout29; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + gout3 = 0; + gout4 = 0; + gout5 = 0; + gout6 = 0; + gout7 = 0; + gout8 = 0; + gout9 = 0; + gout10 = 0; + gout11 = 0; + gout12 = 0; + gout13 = 0; + gout14 = 0; + gout15 = 0; + gout16 = 0; + gout17 = 0; + gout18 = 0; + gout19 = 0; + gout20 = 0; + gout21 = 0; + gout22 = 0; + gout23 = 0; + gout24 = 0; + gout25 = 0; + gout26 = 0; + gout27 = 0; + gout28 = 0; + gout29 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + rys_roots(3, theta_rr, rw+6*nsq_per_block); + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(3, theta_fac*theta_rr, rw); + double sqrt_theta_fac = -sqrt(theta_fac); + for (int irys = 0; irys < 3; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + rw[sq_id+(irys*2+1)*nsq_per_block] *= sqrt_theta_fac; + } + if (task_id < ntasks) { + for (int irys = 0; irys < 6; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double b00 = .5 * rt_aa; + double rt_akl = rt_aa * aij; + double cpx = xqc + xpq*rt_akl; + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + double trr_30x = c0x * trr_20x + 2*b10 * trr_10x; + double trr_31x = cpx * trr_30x + 3*b00 * trr_20x; + gout0 += trr_31x * 1 * wt; + double trr_21x = cpx * trr_20x + 2*b00 * trr_10x; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += trr_21x * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += trr_21x * 1 * trr_10z; + double trr_11x = cpx * trr_10x + 1*b00 * fac; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + gout3 += trr_11x * trr_20y * wt; + gout4 += trr_11x * trr_10y * trr_10z; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + gout5 += trr_11x * 1 * trr_20z; + double trr_01x = cpx * fac; + double trr_30y = c0y * trr_20y + 2*b10 * trr_10y; + gout6 += trr_01x * trr_30y * wt; + gout7 += trr_01x * trr_20y * trr_10z; + gout8 += trr_01x * trr_10y * trr_20z; + double trr_30z = c0z * trr_20z + 2*b10 * trr_10z; + gout9 += trr_01x * 1 * trr_30z; + double cpy = yqc + ypq*rt_akl; + double trr_01y = cpy * 1; + gout10 += trr_30x * trr_01y * wt; + double trr_11y = cpy * trr_10y + 1*b00 * 1; + gout11 += trr_20x * trr_11y * wt; + gout12 += trr_20x * trr_01y * trr_10z; + double trr_21y = cpy * trr_20y + 2*b00 * trr_10y; + gout13 += trr_10x * trr_21y * wt; + gout14 += trr_10x * trr_11y * trr_10z; + gout15 += trr_10x * trr_01y * trr_20z; + double trr_31y = cpy * trr_30y + 3*b00 * trr_20y; + gout16 += fac * trr_31y * wt; + gout17 += fac * trr_21y * trr_10z; + gout18 += fac * trr_11y * trr_20z; + gout19 += fac * trr_01y * trr_30z; + double cpz = zqc + zpq*rt_akl; + double trr_01z = cpz * wt; + gout20 += trr_30x * 1 * trr_01z; + gout21 += trr_20x * trr_10y * trr_01z; + double trr_11z = cpz * trr_10z + 1*b00 * wt; + gout22 += trr_20x * 1 * trr_11z; + gout23 += trr_10x * trr_20y * trr_01z; + gout24 += trr_10x * trr_10y * trr_11z; + double trr_21z = cpz * trr_20z + 2*b00 * trr_10z; + gout25 += trr_10x * 1 * trr_21z; + gout26 += fac * trr_30y * trr_01z; + gout27 += fac * trr_20y * trr_11z; + gout28 += fac * trr_10y * trr_21z; + double trr_31z = cpz * trr_30z + 3*b00 * trr_20z; + gout29 += fac * 1 * trr_31z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + val += gout10 * dm[(l0+0)*nao+(k0+1)]; + val += gout20 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + val += gout11 * dm[(l0+0)*nao+(k0+1)]; + val += gout21 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + val += gout12 * dm[(l0+0)*nao+(k0+1)]; + val += gout22 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout3 * dm[(l0+0)*nao+(k0+0)]; + val += gout13 * dm[(l0+0)*nao+(k0+1)]; + val += gout23 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+3)*nao+(j0+0), val); + val = 0; + val += gout4 * dm[(l0+0)*nao+(k0+0)]; + val += gout14 * dm[(l0+0)*nao+(k0+1)]; + val += gout24 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+4)*nao+(j0+0), val); + val = 0; + val += gout5 * dm[(l0+0)*nao+(k0+0)]; + val += gout15 * dm[(l0+0)*nao+(k0+1)]; + val += gout25 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+5)*nao+(j0+0), val); + val = 0; + val += gout6 * dm[(l0+0)*nao+(k0+0)]; + val += gout16 * dm[(l0+0)*nao+(k0+1)]; + val += gout26 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+6)*nao+(j0+0), val); + val = 0; + val += gout7 * dm[(l0+0)*nao+(k0+0)]; + val += gout17 * dm[(l0+0)*nao+(k0+1)]; + val += gout27 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+7)*nao+(j0+0), val); + val = 0; + val += gout8 * dm[(l0+0)*nao+(k0+0)]; + val += gout18 * dm[(l0+0)*nao+(k0+1)]; + val += gout28 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+8)*nao+(j0+0), val); + val = 0; + val += gout9 * dm[(l0+0)*nao+(k0+0)]; + val += gout19 * dm[(l0+0)*nao+(k0+1)]; + val += gout29 * dm[(l0+0)*nao+(k0+2)]; + atomicAdd(vj+(i0+9)*nao+(j0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + val += gout3 * dm[(j0+0)*nao+(i0+3)]; + val += gout4 * dm[(j0+0)*nao+(i0+4)]; + val += gout5 * dm[(j0+0)*nao+(i0+5)]; + val += gout6 * dm[(j0+0)*nao+(i0+6)]; + val += gout7 * dm[(j0+0)*nao+(i0+7)]; + val += gout8 * dm[(j0+0)*nao+(i0+8)]; + val += gout9 * dm[(j0+0)*nao+(i0+9)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + val = 0; + val += gout10 * dm[(j0+0)*nao+(i0+0)]; + val += gout11 * dm[(j0+0)*nao+(i0+1)]; + val += gout12 * dm[(j0+0)*nao+(i0+2)]; + val += gout13 * dm[(j0+0)*nao+(i0+3)]; + val += gout14 * dm[(j0+0)*nao+(i0+4)]; + val += gout15 * dm[(j0+0)*nao+(i0+5)]; + val += gout16 * dm[(j0+0)*nao+(i0+6)]; + val += gout17 * dm[(j0+0)*nao+(i0+7)]; + val += gout18 * dm[(j0+0)*nao+(i0+8)]; + val += gout19 * dm[(j0+0)*nao+(i0+9)]; + atomicAdd(vj+(k0+1)*nao+(l0+0), val); + val = 0; + val += gout20 * dm[(j0+0)*nao+(i0+0)]; + val += gout21 * dm[(j0+0)*nao+(i0+1)]; + val += gout22 * dm[(j0+0)*nao+(i0+2)]; + val += gout23 * dm[(j0+0)*nao+(i0+3)]; + val += gout24 * dm[(j0+0)*nao+(i0+4)]; + val += gout25 * dm[(j0+0)*nao+(i0+5)]; + val += gout26 * dm[(j0+0)*nao+(i0+6)]; + val += gout27 * dm[(j0+0)*nao+(i0+7)]; + val += gout28 * dm[(j0+0)*nao+(i0+8)]; + val += gout29 * dm[(j0+0)*nao+(i0+9)]; + atomicAdd(vj+(k0+2)*nao+(l0+0), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + val += gout10 * dm[(j0+0)*nao+(k0+1)]; + val += gout20 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + val += gout11 * dm[(j0+0)*nao+(k0+1)]; + val += gout21 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + val += gout12 * dm[(j0+0)*nao+(k0+1)]; + val += gout22 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(k0+0)]; + val += gout13 * dm[(j0+0)*nao+(k0+1)]; + val += gout23 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+3)*nao+(l0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(k0+0)]; + val += gout14 * dm[(j0+0)*nao+(k0+1)]; + val += gout24 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+4)*nao+(l0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(k0+0)]; + val += gout15 * dm[(j0+0)*nao+(k0+1)]; + val += gout25 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+5)*nao+(l0+0), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(k0+0)]; + val += gout16 * dm[(j0+0)*nao+(k0+1)]; + val += gout26 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+6)*nao+(l0+0), val); + val = 0; + val += gout7 * dm[(j0+0)*nao+(k0+0)]; + val += gout17 * dm[(j0+0)*nao+(k0+1)]; + val += gout27 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+7)*nao+(l0+0), val); + val = 0; + val += gout8 * dm[(j0+0)*nao+(k0+0)]; + val += gout18 * dm[(j0+0)*nao+(k0+1)]; + val += gout28 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+8)*nao+(l0+0), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(k0+0)]; + val += gout19 * dm[(j0+0)*nao+(k0+1)]; + val += gout29 * dm[(j0+0)*nao+(k0+2)]; + atomicAdd(vk+(i0+9)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout10 * dm[(i0+0)*nao+(k0+1)]; + val += gout20 * dm[(i0+0)*nao+(k0+2)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout11 * dm[(i0+1)*nao+(k0+1)]; + val += gout21 * dm[(i0+1)*nao+(k0+2)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + val += gout12 * dm[(i0+2)*nao+(k0+1)]; + val += gout22 * dm[(i0+2)*nao+(k0+2)]; + val += gout3 * dm[(i0+3)*nao+(k0+0)]; + val += gout13 * dm[(i0+3)*nao+(k0+1)]; + val += gout23 * dm[(i0+3)*nao+(k0+2)]; + val += gout4 * dm[(i0+4)*nao+(k0+0)]; + val += gout14 * dm[(i0+4)*nao+(k0+1)]; + val += gout24 * dm[(i0+4)*nao+(k0+2)]; + val += gout5 * dm[(i0+5)*nao+(k0+0)]; + val += gout15 * dm[(i0+5)*nao+(k0+1)]; + val += gout25 * dm[(i0+5)*nao+(k0+2)]; + val += gout6 * dm[(i0+6)*nao+(k0+0)]; + val += gout16 * dm[(i0+6)*nao+(k0+1)]; + val += gout26 * dm[(i0+6)*nao+(k0+2)]; + val += gout7 * dm[(i0+7)*nao+(k0+0)]; + val += gout17 * dm[(i0+7)*nao+(k0+1)]; + val += gout27 * dm[(i0+7)*nao+(k0+2)]; + val += gout8 * dm[(i0+8)*nao+(k0+0)]; + val += gout18 * dm[(i0+8)*nao+(k0+1)]; + val += gout28 * dm[(i0+8)*nao+(k0+2)]; + val += gout9 * dm[(i0+9)*nao+(k0+0)]; + val += gout19 * dm[(i0+9)*nao+(k0+1)]; + val += gout29 * dm[(i0+9)*nao+(k0+2)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout10 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+1), val); + val = 0; + val += gout20 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+2), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout11 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+1), val); + val = 0; + val += gout21 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+2), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout12 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+1), val); + val = 0; + val += gout22 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+2), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+0), val); + val = 0; + val += gout13 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+1), val); + val = 0; + val += gout23 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+2), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+0), val); + val = 0; + val += gout14 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+1), val); + val = 0; + val += gout24 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+2), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+0), val); + val = 0; + val += gout15 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+1), val); + val = 0; + val += gout25 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+2), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+6)*nao+(k0+0), val); + val = 0; + val += gout16 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+6)*nao+(k0+1), val); + val = 0; + val += gout26 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+6)*nao+(k0+2), val); + val = 0; + val += gout7 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+7)*nao+(k0+0), val); + val = 0; + val += gout17 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+7)*nao+(k0+1), val); + val = 0; + val += gout27 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+7)*nao+(k0+2), val); + val = 0; + val += gout8 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+8)*nao+(k0+0), val); + val = 0; + val += gout18 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+8)*nao+(k0+1), val); + val = 0; + val += gout28 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+8)*nao+(k0+2), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+9)*nao+(k0+0), val); + val = 0; + val += gout19 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+9)*nao+(k0+1), val); + val = 0; + val += gout29 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+9)*nao+(k0+2), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + val += gout3 * dm[(i0+3)*nao+(l0+0)]; + val += gout4 * dm[(i0+4)*nao+(l0+0)]; + val += gout5 * dm[(i0+5)*nao+(l0+0)]; + val += gout6 * dm[(i0+6)*nao+(l0+0)]; + val += gout7 * dm[(i0+7)*nao+(l0+0)]; + val += gout8 * dm[(i0+8)*nao+(l0+0)]; + val += gout9 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + val = 0; + val += gout10 * dm[(i0+0)*nao+(l0+0)]; + val += gout11 * dm[(i0+1)*nao+(l0+0)]; + val += gout12 * dm[(i0+2)*nao+(l0+0)]; + val += gout13 * dm[(i0+3)*nao+(l0+0)]; + val += gout14 * dm[(i0+4)*nao+(l0+0)]; + val += gout15 * dm[(i0+5)*nao+(l0+0)]; + val += gout16 * dm[(i0+6)*nao+(l0+0)]; + val += gout17 * dm[(i0+7)*nao+(l0+0)]; + val += gout18 * dm[(i0+8)*nao+(l0+0)]; + val += gout19 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+1), val); + val = 0; + val += gout20 * dm[(i0+0)*nao+(l0+0)]; + val += gout21 * dm[(i0+1)*nao+(l0+0)]; + val += gout22 * dm[(i0+2)*nao+(l0+0)]; + val += gout23 * dm[(i0+3)*nao+(l0+0)]; + val += gout24 * dm[(i0+4)*nao+(l0+0)]; + val += gout25 * dm[(i0+5)*nao+(l0+0)]; + val += gout26 * dm[(i0+6)*nao+(l0+0)]; + val += gout27 * dm[(i0+7)*nao+(l0+0)]; + val += gout28 * dm[(i0+8)*nao+(l0+0)]; + val += gout29 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+2), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +__global__ +void rys_sr_jk_3010(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_sr_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_sr_jk_3010(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_jk_3020(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double gout3; + double gout4; + double gout5; + double gout6; + double gout7; + double gout8; + double gout9; + double gout10; + double gout11; + double gout12; + double gout13; + double gout14; + double gout15; + double gout16; + double gout17; + double gout18; + double gout19; + double gout20; + double gout21; + double gout22; + double gout23; + double gout24; + double gout25; + double gout26; + double gout27; + double gout28; + double gout29; + double gout30; + double gout31; + double gout32; + double gout33; + double gout34; + double gout35; + double gout36; + double gout37; + double gout38; + double gout39; + double gout40; + double gout41; + double gout42; + double gout43; + double gout44; + double gout45; + double gout46; + double gout47; + double gout48; + double gout49; + double gout50; + double gout51; + double gout52; + double gout53; + double gout54; + double gout55; + double gout56; + double gout57; + double gout58; + double gout59; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + gout3 = 0; + gout4 = 0; + gout5 = 0; + gout6 = 0; + gout7 = 0; + gout8 = 0; + gout9 = 0; + gout10 = 0; + gout11 = 0; + gout12 = 0; + gout13 = 0; + gout14 = 0; + gout15 = 0; + gout16 = 0; + gout17 = 0; + gout18 = 0; + gout19 = 0; + gout20 = 0; + gout21 = 0; + gout22 = 0; + gout23 = 0; + gout24 = 0; + gout25 = 0; + gout26 = 0; + gout27 = 0; + gout28 = 0; + gout29 = 0; + gout30 = 0; + gout31 = 0; + gout32 = 0; + gout33 = 0; + gout34 = 0; + gout35 = 0; + gout36 = 0; + gout37 = 0; + gout38 = 0; + gout39 = 0; + gout40 = 0; + gout41 = 0; + gout42 = 0; + gout43 = 0; + gout44 = 0; + gout45 = 0; + gout46 = 0; + gout47 = 0; + gout48 = 0; + gout49 = 0; + gout50 = 0; + gout51 = 0; + gout52 = 0; + gout53 = 0; + gout54 = 0; + gout55 = 0; + gout56 = 0; + gout57 = 0; + gout58 = 0; + gout59 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(3, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(3, theta_fac*theta_rr, rw); + fac *= sqrt(theta_fac); + for (int irys = 0; irys < 3; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + } + } + if (task_id < ntasks) { + for (int irys = 0; irys < 3; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double b00 = .5 * rt_aa; + double rt_akl = rt_aa * aij; + double b01 = .5/akl * (1 - rt_akl); + double cpx = xqc + xpq*rt_akl; + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + double trr_30x = c0x * trr_20x + 2*b10 * trr_10x; + double trr_31x = cpx * trr_30x + 3*b00 * trr_20x; + double trr_21x = cpx * trr_20x + 2*b00 * trr_10x; + double trr_32x = cpx * trr_31x + 1*b01 * trr_30x + 3*b00 * trr_21x; + gout0 += trr_32x * 1 * wt; + double trr_11x = cpx * trr_10x + 1*b00 * fac; + double trr_22x = cpx * trr_21x + 1*b01 * trr_20x + 2*b00 * trr_11x; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += trr_22x * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += trr_22x * 1 * trr_10z; + double trr_01x = cpx * fac; + double trr_12x = cpx * trr_11x + 1*b01 * trr_10x + 1*b00 * trr_01x; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + gout3 += trr_12x * trr_20y * wt; + gout4 += trr_12x * trr_10y * trr_10z; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + gout5 += trr_12x * 1 * trr_20z; + double trr_02x = cpx * trr_01x + 1*b01 * fac; + double trr_30y = c0y * trr_20y + 2*b10 * trr_10y; + gout6 += trr_02x * trr_30y * wt; + gout7 += trr_02x * trr_20y * trr_10z; + gout8 += trr_02x * trr_10y * trr_20z; + double trr_30z = c0z * trr_20z + 2*b10 * trr_10z; + gout9 += trr_02x * 1 * trr_30z; + double cpy = yqc + ypq*rt_akl; + double trr_01y = cpy * 1; + gout10 += trr_31x * trr_01y * wt; + double trr_11y = cpy * trr_10y + 1*b00 * 1; + gout11 += trr_21x * trr_11y * wt; + gout12 += trr_21x * trr_01y * trr_10z; + double trr_21y = cpy * trr_20y + 2*b00 * trr_10y; + gout13 += trr_11x * trr_21y * wt; + gout14 += trr_11x * trr_11y * trr_10z; + gout15 += trr_11x * trr_01y * trr_20z; + double trr_31y = cpy * trr_30y + 3*b00 * trr_20y; + gout16 += trr_01x * trr_31y * wt; + gout17 += trr_01x * trr_21y * trr_10z; + gout18 += trr_01x * trr_11y * trr_20z; + gout19 += trr_01x * trr_01y * trr_30z; + double cpz = zqc + zpq*rt_akl; + double trr_01z = cpz * wt; + gout20 += trr_31x * 1 * trr_01z; + gout21 += trr_21x * trr_10y * trr_01z; + double trr_11z = cpz * trr_10z + 1*b00 * wt; + gout22 += trr_21x * 1 * trr_11z; + gout23 += trr_11x * trr_20y * trr_01z; + gout24 += trr_11x * trr_10y * trr_11z; + double trr_21z = cpz * trr_20z + 2*b00 * trr_10z; + gout25 += trr_11x * 1 * trr_21z; + gout26 += trr_01x * trr_30y * trr_01z; + gout27 += trr_01x * trr_20y * trr_11z; + gout28 += trr_01x * trr_10y * trr_21z; + double trr_31z = cpz * trr_30z + 3*b00 * trr_20z; + gout29 += trr_01x * 1 * trr_31z; + double trr_02y = cpy * trr_01y + 1*b01 * 1; + gout30 += trr_30x * trr_02y * wt; + double trr_12y = cpy * trr_11y + 1*b01 * trr_10y + 1*b00 * trr_01y; + gout31 += trr_20x * trr_12y * wt; + gout32 += trr_20x * trr_02y * trr_10z; + double trr_22y = cpy * trr_21y + 1*b01 * trr_20y + 2*b00 * trr_11y; + gout33 += trr_10x * trr_22y * wt; + gout34 += trr_10x * trr_12y * trr_10z; + gout35 += trr_10x * trr_02y * trr_20z; + double trr_32y = cpy * trr_31y + 1*b01 * trr_30y + 3*b00 * trr_21y; + gout36 += fac * trr_32y * wt; + gout37 += fac * trr_22y * trr_10z; + gout38 += fac * trr_12y * trr_20z; + gout39 += fac * trr_02y * trr_30z; + gout40 += trr_30x * trr_01y * trr_01z; + gout41 += trr_20x * trr_11y * trr_01z; + gout42 += trr_20x * trr_01y * trr_11z; + gout43 += trr_10x * trr_21y * trr_01z; + gout44 += trr_10x * trr_11y * trr_11z; + gout45 += trr_10x * trr_01y * trr_21z; + gout46 += fac * trr_31y * trr_01z; + gout47 += fac * trr_21y * trr_11z; + gout48 += fac * trr_11y * trr_21z; + gout49 += fac * trr_01y * trr_31z; + double trr_02z = cpz * trr_01z + 1*b01 * wt; + gout50 += trr_30x * 1 * trr_02z; + gout51 += trr_20x * trr_10y * trr_02z; + double trr_12z = cpz * trr_11z + 1*b01 * trr_10z + 1*b00 * trr_01z; + gout52 += trr_20x * 1 * trr_12z; + gout53 += trr_10x * trr_20y * trr_02z; + gout54 += trr_10x * trr_10y * trr_12z; + double trr_22z = cpz * trr_21z + 1*b01 * trr_20z + 2*b00 * trr_11z; + gout55 += trr_10x * 1 * trr_22z; + gout56 += fac * trr_30y * trr_02z; + gout57 += fac * trr_20y * trr_12z; + gout58 += fac * trr_10y * trr_22z; + double trr_32z = cpz * trr_31z + 1*b01 * trr_30z + 3*b00 * trr_21z; + gout59 += fac * 1 * trr_32z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + val += gout10 * dm[(l0+0)*nao+(k0+1)]; + val += gout20 * dm[(l0+0)*nao+(k0+2)]; + val += gout30 * dm[(l0+0)*nao+(k0+3)]; + val += gout40 * dm[(l0+0)*nao+(k0+4)]; + val += gout50 * dm[(l0+0)*nao+(k0+5)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + val += gout11 * dm[(l0+0)*nao+(k0+1)]; + val += gout21 * dm[(l0+0)*nao+(k0+2)]; + val += gout31 * dm[(l0+0)*nao+(k0+3)]; + val += gout41 * dm[(l0+0)*nao+(k0+4)]; + val += gout51 * dm[(l0+0)*nao+(k0+5)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + val += gout12 * dm[(l0+0)*nao+(k0+1)]; + val += gout22 * dm[(l0+0)*nao+(k0+2)]; + val += gout32 * dm[(l0+0)*nao+(k0+3)]; + val += gout42 * dm[(l0+0)*nao+(k0+4)]; + val += gout52 * dm[(l0+0)*nao+(k0+5)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout3 * dm[(l0+0)*nao+(k0+0)]; + val += gout13 * dm[(l0+0)*nao+(k0+1)]; + val += gout23 * dm[(l0+0)*nao+(k0+2)]; + val += gout33 * dm[(l0+0)*nao+(k0+3)]; + val += gout43 * dm[(l0+0)*nao+(k0+4)]; + val += gout53 * dm[(l0+0)*nao+(k0+5)]; + atomicAdd(vj+(i0+3)*nao+(j0+0), val); + val = 0; + val += gout4 * dm[(l0+0)*nao+(k0+0)]; + val += gout14 * dm[(l0+0)*nao+(k0+1)]; + val += gout24 * dm[(l0+0)*nao+(k0+2)]; + val += gout34 * dm[(l0+0)*nao+(k0+3)]; + val += gout44 * dm[(l0+0)*nao+(k0+4)]; + val += gout54 * dm[(l0+0)*nao+(k0+5)]; + atomicAdd(vj+(i0+4)*nao+(j0+0), val); + val = 0; + val += gout5 * dm[(l0+0)*nao+(k0+0)]; + val += gout15 * dm[(l0+0)*nao+(k0+1)]; + val += gout25 * dm[(l0+0)*nao+(k0+2)]; + val += gout35 * dm[(l0+0)*nao+(k0+3)]; + val += gout45 * dm[(l0+0)*nao+(k0+4)]; + val += gout55 * dm[(l0+0)*nao+(k0+5)]; + atomicAdd(vj+(i0+5)*nao+(j0+0), val); + val = 0; + val += gout6 * dm[(l0+0)*nao+(k0+0)]; + val += gout16 * dm[(l0+0)*nao+(k0+1)]; + val += gout26 * dm[(l0+0)*nao+(k0+2)]; + val += gout36 * dm[(l0+0)*nao+(k0+3)]; + val += gout46 * dm[(l0+0)*nao+(k0+4)]; + val += gout56 * dm[(l0+0)*nao+(k0+5)]; + atomicAdd(vj+(i0+6)*nao+(j0+0), val); + val = 0; + val += gout7 * dm[(l0+0)*nao+(k0+0)]; + val += gout17 * dm[(l0+0)*nao+(k0+1)]; + val += gout27 * dm[(l0+0)*nao+(k0+2)]; + val += gout37 * dm[(l0+0)*nao+(k0+3)]; + val += gout47 * dm[(l0+0)*nao+(k0+4)]; + val += gout57 * dm[(l0+0)*nao+(k0+5)]; + atomicAdd(vj+(i0+7)*nao+(j0+0), val); + val = 0; + val += gout8 * dm[(l0+0)*nao+(k0+0)]; + val += gout18 * dm[(l0+0)*nao+(k0+1)]; + val += gout28 * dm[(l0+0)*nao+(k0+2)]; + val += gout38 * dm[(l0+0)*nao+(k0+3)]; + val += gout48 * dm[(l0+0)*nao+(k0+4)]; + val += gout58 * dm[(l0+0)*nao+(k0+5)]; + atomicAdd(vj+(i0+8)*nao+(j0+0), val); + val = 0; + val += gout9 * dm[(l0+0)*nao+(k0+0)]; + val += gout19 * dm[(l0+0)*nao+(k0+1)]; + val += gout29 * dm[(l0+0)*nao+(k0+2)]; + val += gout39 * dm[(l0+0)*nao+(k0+3)]; + val += gout49 * dm[(l0+0)*nao+(k0+4)]; + val += gout59 * dm[(l0+0)*nao+(k0+5)]; + atomicAdd(vj+(i0+9)*nao+(j0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + val += gout3 * dm[(j0+0)*nao+(i0+3)]; + val += gout4 * dm[(j0+0)*nao+(i0+4)]; + val += gout5 * dm[(j0+0)*nao+(i0+5)]; + val += gout6 * dm[(j0+0)*nao+(i0+6)]; + val += gout7 * dm[(j0+0)*nao+(i0+7)]; + val += gout8 * dm[(j0+0)*nao+(i0+8)]; + val += gout9 * dm[(j0+0)*nao+(i0+9)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + val = 0; + val += gout10 * dm[(j0+0)*nao+(i0+0)]; + val += gout11 * dm[(j0+0)*nao+(i0+1)]; + val += gout12 * dm[(j0+0)*nao+(i0+2)]; + val += gout13 * dm[(j0+0)*nao+(i0+3)]; + val += gout14 * dm[(j0+0)*nao+(i0+4)]; + val += gout15 * dm[(j0+0)*nao+(i0+5)]; + val += gout16 * dm[(j0+0)*nao+(i0+6)]; + val += gout17 * dm[(j0+0)*nao+(i0+7)]; + val += gout18 * dm[(j0+0)*nao+(i0+8)]; + val += gout19 * dm[(j0+0)*nao+(i0+9)]; + atomicAdd(vj+(k0+1)*nao+(l0+0), val); + val = 0; + val += gout20 * dm[(j0+0)*nao+(i0+0)]; + val += gout21 * dm[(j0+0)*nao+(i0+1)]; + val += gout22 * dm[(j0+0)*nao+(i0+2)]; + val += gout23 * dm[(j0+0)*nao+(i0+3)]; + val += gout24 * dm[(j0+0)*nao+(i0+4)]; + val += gout25 * dm[(j0+0)*nao+(i0+5)]; + val += gout26 * dm[(j0+0)*nao+(i0+6)]; + val += gout27 * dm[(j0+0)*nao+(i0+7)]; + val += gout28 * dm[(j0+0)*nao+(i0+8)]; + val += gout29 * dm[(j0+0)*nao+(i0+9)]; + atomicAdd(vj+(k0+2)*nao+(l0+0), val); + val = 0; + val += gout30 * dm[(j0+0)*nao+(i0+0)]; + val += gout31 * dm[(j0+0)*nao+(i0+1)]; + val += gout32 * dm[(j0+0)*nao+(i0+2)]; + val += gout33 * dm[(j0+0)*nao+(i0+3)]; + val += gout34 * dm[(j0+0)*nao+(i0+4)]; + val += gout35 * dm[(j0+0)*nao+(i0+5)]; + val += gout36 * dm[(j0+0)*nao+(i0+6)]; + val += gout37 * dm[(j0+0)*nao+(i0+7)]; + val += gout38 * dm[(j0+0)*nao+(i0+8)]; + val += gout39 * dm[(j0+0)*nao+(i0+9)]; + atomicAdd(vj+(k0+3)*nao+(l0+0), val); + val = 0; + val += gout40 * dm[(j0+0)*nao+(i0+0)]; + val += gout41 * dm[(j0+0)*nao+(i0+1)]; + val += gout42 * dm[(j0+0)*nao+(i0+2)]; + val += gout43 * dm[(j0+0)*nao+(i0+3)]; + val += gout44 * dm[(j0+0)*nao+(i0+4)]; + val += gout45 * dm[(j0+0)*nao+(i0+5)]; + val += gout46 * dm[(j0+0)*nao+(i0+6)]; + val += gout47 * dm[(j0+0)*nao+(i0+7)]; + val += gout48 * dm[(j0+0)*nao+(i0+8)]; + val += gout49 * dm[(j0+0)*nao+(i0+9)]; + atomicAdd(vj+(k0+4)*nao+(l0+0), val); + val = 0; + val += gout50 * dm[(j0+0)*nao+(i0+0)]; + val += gout51 * dm[(j0+0)*nao+(i0+1)]; + val += gout52 * dm[(j0+0)*nao+(i0+2)]; + val += gout53 * dm[(j0+0)*nao+(i0+3)]; + val += gout54 * dm[(j0+0)*nao+(i0+4)]; + val += gout55 * dm[(j0+0)*nao+(i0+5)]; + val += gout56 * dm[(j0+0)*nao+(i0+6)]; + val += gout57 * dm[(j0+0)*nao+(i0+7)]; + val += gout58 * dm[(j0+0)*nao+(i0+8)]; + val += gout59 * dm[(j0+0)*nao+(i0+9)]; + atomicAdd(vj+(k0+5)*nao+(l0+0), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + val += gout10 * dm[(j0+0)*nao+(k0+1)]; + val += gout20 * dm[(j0+0)*nao+(k0+2)]; + val += gout30 * dm[(j0+0)*nao+(k0+3)]; + val += gout40 * dm[(j0+0)*nao+(k0+4)]; + val += gout50 * dm[(j0+0)*nao+(k0+5)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + val += gout11 * dm[(j0+0)*nao+(k0+1)]; + val += gout21 * dm[(j0+0)*nao+(k0+2)]; + val += gout31 * dm[(j0+0)*nao+(k0+3)]; + val += gout41 * dm[(j0+0)*nao+(k0+4)]; + val += gout51 * dm[(j0+0)*nao+(k0+5)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + val += gout12 * dm[(j0+0)*nao+(k0+1)]; + val += gout22 * dm[(j0+0)*nao+(k0+2)]; + val += gout32 * dm[(j0+0)*nao+(k0+3)]; + val += gout42 * dm[(j0+0)*nao+(k0+4)]; + val += gout52 * dm[(j0+0)*nao+(k0+5)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(k0+0)]; + val += gout13 * dm[(j0+0)*nao+(k0+1)]; + val += gout23 * dm[(j0+0)*nao+(k0+2)]; + val += gout33 * dm[(j0+0)*nao+(k0+3)]; + val += gout43 * dm[(j0+0)*nao+(k0+4)]; + val += gout53 * dm[(j0+0)*nao+(k0+5)]; + atomicAdd(vk+(i0+3)*nao+(l0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(k0+0)]; + val += gout14 * dm[(j0+0)*nao+(k0+1)]; + val += gout24 * dm[(j0+0)*nao+(k0+2)]; + val += gout34 * dm[(j0+0)*nao+(k0+3)]; + val += gout44 * dm[(j0+0)*nao+(k0+4)]; + val += gout54 * dm[(j0+0)*nao+(k0+5)]; + atomicAdd(vk+(i0+4)*nao+(l0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(k0+0)]; + val += gout15 * dm[(j0+0)*nao+(k0+1)]; + val += gout25 * dm[(j0+0)*nao+(k0+2)]; + val += gout35 * dm[(j0+0)*nao+(k0+3)]; + val += gout45 * dm[(j0+0)*nao+(k0+4)]; + val += gout55 * dm[(j0+0)*nao+(k0+5)]; + atomicAdd(vk+(i0+5)*nao+(l0+0), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(k0+0)]; + val += gout16 * dm[(j0+0)*nao+(k0+1)]; + val += gout26 * dm[(j0+0)*nao+(k0+2)]; + val += gout36 * dm[(j0+0)*nao+(k0+3)]; + val += gout46 * dm[(j0+0)*nao+(k0+4)]; + val += gout56 * dm[(j0+0)*nao+(k0+5)]; + atomicAdd(vk+(i0+6)*nao+(l0+0), val); + val = 0; + val += gout7 * dm[(j0+0)*nao+(k0+0)]; + val += gout17 * dm[(j0+0)*nao+(k0+1)]; + val += gout27 * dm[(j0+0)*nao+(k0+2)]; + val += gout37 * dm[(j0+0)*nao+(k0+3)]; + val += gout47 * dm[(j0+0)*nao+(k0+4)]; + val += gout57 * dm[(j0+0)*nao+(k0+5)]; + atomicAdd(vk+(i0+7)*nao+(l0+0), val); + val = 0; + val += gout8 * dm[(j0+0)*nao+(k0+0)]; + val += gout18 * dm[(j0+0)*nao+(k0+1)]; + val += gout28 * dm[(j0+0)*nao+(k0+2)]; + val += gout38 * dm[(j0+0)*nao+(k0+3)]; + val += gout48 * dm[(j0+0)*nao+(k0+4)]; + val += gout58 * dm[(j0+0)*nao+(k0+5)]; + atomicAdd(vk+(i0+8)*nao+(l0+0), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(k0+0)]; + val += gout19 * dm[(j0+0)*nao+(k0+1)]; + val += gout29 * dm[(j0+0)*nao+(k0+2)]; + val += gout39 * dm[(j0+0)*nao+(k0+3)]; + val += gout49 * dm[(j0+0)*nao+(k0+4)]; + val += gout59 * dm[(j0+0)*nao+(k0+5)]; + atomicAdd(vk+(i0+9)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout10 * dm[(i0+0)*nao+(k0+1)]; + val += gout20 * dm[(i0+0)*nao+(k0+2)]; + val += gout30 * dm[(i0+0)*nao+(k0+3)]; + val += gout40 * dm[(i0+0)*nao+(k0+4)]; + val += gout50 * dm[(i0+0)*nao+(k0+5)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout11 * dm[(i0+1)*nao+(k0+1)]; + val += gout21 * dm[(i0+1)*nao+(k0+2)]; + val += gout31 * dm[(i0+1)*nao+(k0+3)]; + val += gout41 * dm[(i0+1)*nao+(k0+4)]; + val += gout51 * dm[(i0+1)*nao+(k0+5)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + val += gout12 * dm[(i0+2)*nao+(k0+1)]; + val += gout22 * dm[(i0+2)*nao+(k0+2)]; + val += gout32 * dm[(i0+2)*nao+(k0+3)]; + val += gout42 * dm[(i0+2)*nao+(k0+4)]; + val += gout52 * dm[(i0+2)*nao+(k0+5)]; + val += gout3 * dm[(i0+3)*nao+(k0+0)]; + val += gout13 * dm[(i0+3)*nao+(k0+1)]; + val += gout23 * dm[(i0+3)*nao+(k0+2)]; + val += gout33 * dm[(i0+3)*nao+(k0+3)]; + val += gout43 * dm[(i0+3)*nao+(k0+4)]; + val += gout53 * dm[(i0+3)*nao+(k0+5)]; + val += gout4 * dm[(i0+4)*nao+(k0+0)]; + val += gout14 * dm[(i0+4)*nao+(k0+1)]; + val += gout24 * dm[(i0+4)*nao+(k0+2)]; + val += gout34 * dm[(i0+4)*nao+(k0+3)]; + val += gout44 * dm[(i0+4)*nao+(k0+4)]; + val += gout54 * dm[(i0+4)*nao+(k0+5)]; + val += gout5 * dm[(i0+5)*nao+(k0+0)]; + val += gout15 * dm[(i0+5)*nao+(k0+1)]; + val += gout25 * dm[(i0+5)*nao+(k0+2)]; + val += gout35 * dm[(i0+5)*nao+(k0+3)]; + val += gout45 * dm[(i0+5)*nao+(k0+4)]; + val += gout55 * dm[(i0+5)*nao+(k0+5)]; + val += gout6 * dm[(i0+6)*nao+(k0+0)]; + val += gout16 * dm[(i0+6)*nao+(k0+1)]; + val += gout26 * dm[(i0+6)*nao+(k0+2)]; + val += gout36 * dm[(i0+6)*nao+(k0+3)]; + val += gout46 * dm[(i0+6)*nao+(k0+4)]; + val += gout56 * dm[(i0+6)*nao+(k0+5)]; + val += gout7 * dm[(i0+7)*nao+(k0+0)]; + val += gout17 * dm[(i0+7)*nao+(k0+1)]; + val += gout27 * dm[(i0+7)*nao+(k0+2)]; + val += gout37 * dm[(i0+7)*nao+(k0+3)]; + val += gout47 * dm[(i0+7)*nao+(k0+4)]; + val += gout57 * dm[(i0+7)*nao+(k0+5)]; + val += gout8 * dm[(i0+8)*nao+(k0+0)]; + val += gout18 * dm[(i0+8)*nao+(k0+1)]; + val += gout28 * dm[(i0+8)*nao+(k0+2)]; + val += gout38 * dm[(i0+8)*nao+(k0+3)]; + val += gout48 * dm[(i0+8)*nao+(k0+4)]; + val += gout58 * dm[(i0+8)*nao+(k0+5)]; + val += gout9 * dm[(i0+9)*nao+(k0+0)]; + val += gout19 * dm[(i0+9)*nao+(k0+1)]; + val += gout29 * dm[(i0+9)*nao+(k0+2)]; + val += gout39 * dm[(i0+9)*nao+(k0+3)]; + val += gout49 * dm[(i0+9)*nao+(k0+4)]; + val += gout59 * dm[(i0+9)*nao+(k0+5)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout10 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+1), val); + val = 0; + val += gout20 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+2), val); + val = 0; + val += gout30 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+3), val); + val = 0; + val += gout40 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+4), val); + val = 0; + val += gout50 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+5), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout11 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+1), val); + val = 0; + val += gout21 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+2), val); + val = 0; + val += gout31 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+3), val); + val = 0; + val += gout41 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+4), val); + val = 0; + val += gout51 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+5), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout12 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+1), val); + val = 0; + val += gout22 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+2), val); + val = 0; + val += gout32 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+3), val); + val = 0; + val += gout42 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+4), val); + val = 0; + val += gout52 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+5), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+0), val); + val = 0; + val += gout13 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+1), val); + val = 0; + val += gout23 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+2), val); + val = 0; + val += gout33 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+3), val); + val = 0; + val += gout43 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+4), val); + val = 0; + val += gout53 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+5), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+0), val); + val = 0; + val += gout14 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+1), val); + val = 0; + val += gout24 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+2), val); + val = 0; + val += gout34 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+3), val); + val = 0; + val += gout44 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+4), val); + val = 0; + val += gout54 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+5), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+0), val); + val = 0; + val += gout15 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+1), val); + val = 0; + val += gout25 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+2), val); + val = 0; + val += gout35 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+3), val); + val = 0; + val += gout45 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+4), val); + val = 0; + val += gout55 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+5), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+6)*nao+(k0+0), val); + val = 0; + val += gout16 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+6)*nao+(k0+1), val); + val = 0; + val += gout26 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+6)*nao+(k0+2), val); + val = 0; + val += gout36 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+6)*nao+(k0+3), val); + val = 0; + val += gout46 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+6)*nao+(k0+4), val); + val = 0; + val += gout56 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+6)*nao+(k0+5), val); + val = 0; + val += gout7 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+7)*nao+(k0+0), val); + val = 0; + val += gout17 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+7)*nao+(k0+1), val); + val = 0; + val += gout27 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+7)*nao+(k0+2), val); + val = 0; + val += gout37 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+7)*nao+(k0+3), val); + val = 0; + val += gout47 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+7)*nao+(k0+4), val); + val = 0; + val += gout57 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+7)*nao+(k0+5), val); + val = 0; + val += gout8 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+8)*nao+(k0+0), val); + val = 0; + val += gout18 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+8)*nao+(k0+1), val); + val = 0; + val += gout28 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+8)*nao+(k0+2), val); + val = 0; + val += gout38 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+8)*nao+(k0+3), val); + val = 0; + val += gout48 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+8)*nao+(k0+4), val); + val = 0; + val += gout58 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+8)*nao+(k0+5), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+9)*nao+(k0+0), val); + val = 0; + val += gout19 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+9)*nao+(k0+1), val); + val = 0; + val += gout29 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+9)*nao+(k0+2), val); + val = 0; + val += gout39 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+9)*nao+(k0+3), val); + val = 0; + val += gout49 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+9)*nao+(k0+4), val); + val = 0; + val += gout59 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+9)*nao+(k0+5), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + val += gout3 * dm[(i0+3)*nao+(l0+0)]; + val += gout4 * dm[(i0+4)*nao+(l0+0)]; + val += gout5 * dm[(i0+5)*nao+(l0+0)]; + val += gout6 * dm[(i0+6)*nao+(l0+0)]; + val += gout7 * dm[(i0+7)*nao+(l0+0)]; + val += gout8 * dm[(i0+8)*nao+(l0+0)]; + val += gout9 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + val = 0; + val += gout10 * dm[(i0+0)*nao+(l0+0)]; + val += gout11 * dm[(i0+1)*nao+(l0+0)]; + val += gout12 * dm[(i0+2)*nao+(l0+0)]; + val += gout13 * dm[(i0+3)*nao+(l0+0)]; + val += gout14 * dm[(i0+4)*nao+(l0+0)]; + val += gout15 * dm[(i0+5)*nao+(l0+0)]; + val += gout16 * dm[(i0+6)*nao+(l0+0)]; + val += gout17 * dm[(i0+7)*nao+(l0+0)]; + val += gout18 * dm[(i0+8)*nao+(l0+0)]; + val += gout19 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+1), val); + val = 0; + val += gout20 * dm[(i0+0)*nao+(l0+0)]; + val += gout21 * dm[(i0+1)*nao+(l0+0)]; + val += gout22 * dm[(i0+2)*nao+(l0+0)]; + val += gout23 * dm[(i0+3)*nao+(l0+0)]; + val += gout24 * dm[(i0+4)*nao+(l0+0)]; + val += gout25 * dm[(i0+5)*nao+(l0+0)]; + val += gout26 * dm[(i0+6)*nao+(l0+0)]; + val += gout27 * dm[(i0+7)*nao+(l0+0)]; + val += gout28 * dm[(i0+8)*nao+(l0+0)]; + val += gout29 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+2), val); + val = 0; + val += gout30 * dm[(i0+0)*nao+(l0+0)]; + val += gout31 * dm[(i0+1)*nao+(l0+0)]; + val += gout32 * dm[(i0+2)*nao+(l0+0)]; + val += gout33 * dm[(i0+3)*nao+(l0+0)]; + val += gout34 * dm[(i0+4)*nao+(l0+0)]; + val += gout35 * dm[(i0+5)*nao+(l0+0)]; + val += gout36 * dm[(i0+6)*nao+(l0+0)]; + val += gout37 * dm[(i0+7)*nao+(l0+0)]; + val += gout38 * dm[(i0+8)*nao+(l0+0)]; + val += gout39 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+3), val); + val = 0; + val += gout40 * dm[(i0+0)*nao+(l0+0)]; + val += gout41 * dm[(i0+1)*nao+(l0+0)]; + val += gout42 * dm[(i0+2)*nao+(l0+0)]; + val += gout43 * dm[(i0+3)*nao+(l0+0)]; + val += gout44 * dm[(i0+4)*nao+(l0+0)]; + val += gout45 * dm[(i0+5)*nao+(l0+0)]; + val += gout46 * dm[(i0+6)*nao+(l0+0)]; + val += gout47 * dm[(i0+7)*nao+(l0+0)]; + val += gout48 * dm[(i0+8)*nao+(l0+0)]; + val += gout49 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+4), val); + val = 0; + val += gout50 * dm[(i0+0)*nao+(l0+0)]; + val += gout51 * dm[(i0+1)*nao+(l0+0)]; + val += gout52 * dm[(i0+2)*nao+(l0+0)]; + val += gout53 * dm[(i0+3)*nao+(l0+0)]; + val += gout54 * dm[(i0+4)*nao+(l0+0)]; + val += gout55 * dm[(i0+5)*nao+(l0+0)]; + val += gout56 * dm[(i0+6)*nao+(l0+0)]; + val += gout57 * dm[(i0+7)*nao+(l0+0)]; + val += gout58 * dm[(i0+8)*nao+(l0+0)]; + val += gout59 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+5), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +__global__ +void rys_jk_3020(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_jk_3020(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_sr_jk_3020(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double gout3; + double gout4; + double gout5; + double gout6; + double gout7; + double gout8; + double gout9; + double gout10; + double gout11; + double gout12; + double gout13; + double gout14; + double gout15; + double gout16; + double gout17; + double gout18; + double gout19; + double gout20; + double gout21; + double gout22; + double gout23; + double gout24; + double gout25; + double gout26; + double gout27; + double gout28; + double gout29; + double gout30; + double gout31; + double gout32; + double gout33; + double gout34; + double gout35; + double gout36; + double gout37; + double gout38; + double gout39; + double gout40; + double gout41; + double gout42; + double gout43; + double gout44; + double gout45; + double gout46; + double gout47; + double gout48; + double gout49; + double gout50; + double gout51; + double gout52; + double gout53; + double gout54; + double gout55; + double gout56; + double gout57; + double gout58; + double gout59; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + gout3 = 0; + gout4 = 0; + gout5 = 0; + gout6 = 0; + gout7 = 0; + gout8 = 0; + gout9 = 0; + gout10 = 0; + gout11 = 0; + gout12 = 0; + gout13 = 0; + gout14 = 0; + gout15 = 0; + gout16 = 0; + gout17 = 0; + gout18 = 0; + gout19 = 0; + gout20 = 0; + gout21 = 0; + gout22 = 0; + gout23 = 0; + gout24 = 0; + gout25 = 0; + gout26 = 0; + gout27 = 0; + gout28 = 0; + gout29 = 0; + gout30 = 0; + gout31 = 0; + gout32 = 0; + gout33 = 0; + gout34 = 0; + gout35 = 0; + gout36 = 0; + gout37 = 0; + gout38 = 0; + gout39 = 0; + gout40 = 0; + gout41 = 0; + gout42 = 0; + gout43 = 0; + gout44 = 0; + gout45 = 0; + gout46 = 0; + gout47 = 0; + gout48 = 0; + gout49 = 0; + gout50 = 0; + gout51 = 0; + gout52 = 0; + gout53 = 0; + gout54 = 0; + gout55 = 0; + gout56 = 0; + gout57 = 0; + gout58 = 0; + gout59 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + rys_roots(3, theta_rr, rw+6*nsq_per_block); + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(3, theta_fac*theta_rr, rw); + double sqrt_theta_fac = -sqrt(theta_fac); + for (int irys = 0; irys < 3; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + rw[sq_id+(irys*2+1)*nsq_per_block] *= sqrt_theta_fac; + } + if (task_id < ntasks) { + for (int irys = 0; irys < 6; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double b00 = .5 * rt_aa; + double rt_akl = rt_aa * aij; + double b01 = .5/akl * (1 - rt_akl); + double cpx = xqc + xpq*rt_akl; + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + double trr_30x = c0x * trr_20x + 2*b10 * trr_10x; + double trr_31x = cpx * trr_30x + 3*b00 * trr_20x; + double trr_21x = cpx * trr_20x + 2*b00 * trr_10x; + double trr_32x = cpx * trr_31x + 1*b01 * trr_30x + 3*b00 * trr_21x; + gout0 += trr_32x * 1 * wt; + double trr_11x = cpx * trr_10x + 1*b00 * fac; + double trr_22x = cpx * trr_21x + 1*b01 * trr_20x + 2*b00 * trr_11x; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += trr_22x * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += trr_22x * 1 * trr_10z; + double trr_01x = cpx * fac; + double trr_12x = cpx * trr_11x + 1*b01 * trr_10x + 1*b00 * trr_01x; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + gout3 += trr_12x * trr_20y * wt; + gout4 += trr_12x * trr_10y * trr_10z; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + gout5 += trr_12x * 1 * trr_20z; + double trr_02x = cpx * trr_01x + 1*b01 * fac; + double trr_30y = c0y * trr_20y + 2*b10 * trr_10y; + gout6 += trr_02x * trr_30y * wt; + gout7 += trr_02x * trr_20y * trr_10z; + gout8 += trr_02x * trr_10y * trr_20z; + double trr_30z = c0z * trr_20z + 2*b10 * trr_10z; + gout9 += trr_02x * 1 * trr_30z; + double cpy = yqc + ypq*rt_akl; + double trr_01y = cpy * 1; + gout10 += trr_31x * trr_01y * wt; + double trr_11y = cpy * trr_10y + 1*b00 * 1; + gout11 += trr_21x * trr_11y * wt; + gout12 += trr_21x * trr_01y * trr_10z; + double trr_21y = cpy * trr_20y + 2*b00 * trr_10y; + gout13 += trr_11x * trr_21y * wt; + gout14 += trr_11x * trr_11y * trr_10z; + gout15 += trr_11x * trr_01y * trr_20z; + double trr_31y = cpy * trr_30y + 3*b00 * trr_20y; + gout16 += trr_01x * trr_31y * wt; + gout17 += trr_01x * trr_21y * trr_10z; + gout18 += trr_01x * trr_11y * trr_20z; + gout19 += trr_01x * trr_01y * trr_30z; + double cpz = zqc + zpq*rt_akl; + double trr_01z = cpz * wt; + gout20 += trr_31x * 1 * trr_01z; + gout21 += trr_21x * trr_10y * trr_01z; + double trr_11z = cpz * trr_10z + 1*b00 * wt; + gout22 += trr_21x * 1 * trr_11z; + gout23 += trr_11x * trr_20y * trr_01z; + gout24 += trr_11x * trr_10y * trr_11z; + double trr_21z = cpz * trr_20z + 2*b00 * trr_10z; + gout25 += trr_11x * 1 * trr_21z; + gout26 += trr_01x * trr_30y * trr_01z; + gout27 += trr_01x * trr_20y * trr_11z; + gout28 += trr_01x * trr_10y * trr_21z; + double trr_31z = cpz * trr_30z + 3*b00 * trr_20z; + gout29 += trr_01x * 1 * trr_31z; + double trr_02y = cpy * trr_01y + 1*b01 * 1; + gout30 += trr_30x * trr_02y * wt; + double trr_12y = cpy * trr_11y + 1*b01 * trr_10y + 1*b00 * trr_01y; + gout31 += trr_20x * trr_12y * wt; + gout32 += trr_20x * trr_02y * trr_10z; + double trr_22y = cpy * trr_21y + 1*b01 * trr_20y + 2*b00 * trr_11y; + gout33 += trr_10x * trr_22y * wt; + gout34 += trr_10x * trr_12y * trr_10z; + gout35 += trr_10x * trr_02y * trr_20z; + double trr_32y = cpy * trr_31y + 1*b01 * trr_30y + 3*b00 * trr_21y; + gout36 += fac * trr_32y * wt; + gout37 += fac * trr_22y * trr_10z; + gout38 += fac * trr_12y * trr_20z; + gout39 += fac * trr_02y * trr_30z; + gout40 += trr_30x * trr_01y * trr_01z; + gout41 += trr_20x * trr_11y * trr_01z; + gout42 += trr_20x * trr_01y * trr_11z; + gout43 += trr_10x * trr_21y * trr_01z; + gout44 += trr_10x * trr_11y * trr_11z; + gout45 += trr_10x * trr_01y * trr_21z; + gout46 += fac * trr_31y * trr_01z; + gout47 += fac * trr_21y * trr_11z; + gout48 += fac * trr_11y * trr_21z; + gout49 += fac * trr_01y * trr_31z; + double trr_02z = cpz * trr_01z + 1*b01 * wt; + gout50 += trr_30x * 1 * trr_02z; + gout51 += trr_20x * trr_10y * trr_02z; + double trr_12z = cpz * trr_11z + 1*b01 * trr_10z + 1*b00 * trr_01z; + gout52 += trr_20x * 1 * trr_12z; + gout53 += trr_10x * trr_20y * trr_02z; + gout54 += trr_10x * trr_10y * trr_12z; + double trr_22z = cpz * trr_21z + 1*b01 * trr_20z + 2*b00 * trr_11z; + gout55 += trr_10x * 1 * trr_22z; + gout56 += fac * trr_30y * trr_02z; + gout57 += fac * trr_20y * trr_12z; + gout58 += fac * trr_10y * trr_22z; + double trr_32z = cpz * trr_31z + 1*b01 * trr_30z + 3*b00 * trr_21z; + gout59 += fac * 1 * trr_32z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + val += gout10 * dm[(l0+0)*nao+(k0+1)]; + val += gout20 * dm[(l0+0)*nao+(k0+2)]; + val += gout30 * dm[(l0+0)*nao+(k0+3)]; + val += gout40 * dm[(l0+0)*nao+(k0+4)]; + val += gout50 * dm[(l0+0)*nao+(k0+5)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + val += gout11 * dm[(l0+0)*nao+(k0+1)]; + val += gout21 * dm[(l0+0)*nao+(k0+2)]; + val += gout31 * dm[(l0+0)*nao+(k0+3)]; + val += gout41 * dm[(l0+0)*nao+(k0+4)]; + val += gout51 * dm[(l0+0)*nao+(k0+5)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + val += gout12 * dm[(l0+0)*nao+(k0+1)]; + val += gout22 * dm[(l0+0)*nao+(k0+2)]; + val += gout32 * dm[(l0+0)*nao+(k0+3)]; + val += gout42 * dm[(l0+0)*nao+(k0+4)]; + val += gout52 * dm[(l0+0)*nao+(k0+5)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout3 * dm[(l0+0)*nao+(k0+0)]; + val += gout13 * dm[(l0+0)*nao+(k0+1)]; + val += gout23 * dm[(l0+0)*nao+(k0+2)]; + val += gout33 * dm[(l0+0)*nao+(k0+3)]; + val += gout43 * dm[(l0+0)*nao+(k0+4)]; + val += gout53 * dm[(l0+0)*nao+(k0+5)]; + atomicAdd(vj+(i0+3)*nao+(j0+0), val); + val = 0; + val += gout4 * dm[(l0+0)*nao+(k0+0)]; + val += gout14 * dm[(l0+0)*nao+(k0+1)]; + val += gout24 * dm[(l0+0)*nao+(k0+2)]; + val += gout34 * dm[(l0+0)*nao+(k0+3)]; + val += gout44 * dm[(l0+0)*nao+(k0+4)]; + val += gout54 * dm[(l0+0)*nao+(k0+5)]; + atomicAdd(vj+(i0+4)*nao+(j0+0), val); + val = 0; + val += gout5 * dm[(l0+0)*nao+(k0+0)]; + val += gout15 * dm[(l0+0)*nao+(k0+1)]; + val += gout25 * dm[(l0+0)*nao+(k0+2)]; + val += gout35 * dm[(l0+0)*nao+(k0+3)]; + val += gout45 * dm[(l0+0)*nao+(k0+4)]; + val += gout55 * dm[(l0+0)*nao+(k0+5)]; + atomicAdd(vj+(i0+5)*nao+(j0+0), val); + val = 0; + val += gout6 * dm[(l0+0)*nao+(k0+0)]; + val += gout16 * dm[(l0+0)*nao+(k0+1)]; + val += gout26 * dm[(l0+0)*nao+(k0+2)]; + val += gout36 * dm[(l0+0)*nao+(k0+3)]; + val += gout46 * dm[(l0+0)*nao+(k0+4)]; + val += gout56 * dm[(l0+0)*nao+(k0+5)]; + atomicAdd(vj+(i0+6)*nao+(j0+0), val); + val = 0; + val += gout7 * dm[(l0+0)*nao+(k0+0)]; + val += gout17 * dm[(l0+0)*nao+(k0+1)]; + val += gout27 * dm[(l0+0)*nao+(k0+2)]; + val += gout37 * dm[(l0+0)*nao+(k0+3)]; + val += gout47 * dm[(l0+0)*nao+(k0+4)]; + val += gout57 * dm[(l0+0)*nao+(k0+5)]; + atomicAdd(vj+(i0+7)*nao+(j0+0), val); + val = 0; + val += gout8 * dm[(l0+0)*nao+(k0+0)]; + val += gout18 * dm[(l0+0)*nao+(k0+1)]; + val += gout28 * dm[(l0+0)*nao+(k0+2)]; + val += gout38 * dm[(l0+0)*nao+(k0+3)]; + val += gout48 * dm[(l0+0)*nao+(k0+4)]; + val += gout58 * dm[(l0+0)*nao+(k0+5)]; + atomicAdd(vj+(i0+8)*nao+(j0+0), val); + val = 0; + val += gout9 * dm[(l0+0)*nao+(k0+0)]; + val += gout19 * dm[(l0+0)*nao+(k0+1)]; + val += gout29 * dm[(l0+0)*nao+(k0+2)]; + val += gout39 * dm[(l0+0)*nao+(k0+3)]; + val += gout49 * dm[(l0+0)*nao+(k0+4)]; + val += gout59 * dm[(l0+0)*nao+(k0+5)]; + atomicAdd(vj+(i0+9)*nao+(j0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + val += gout3 * dm[(j0+0)*nao+(i0+3)]; + val += gout4 * dm[(j0+0)*nao+(i0+4)]; + val += gout5 * dm[(j0+0)*nao+(i0+5)]; + val += gout6 * dm[(j0+0)*nao+(i0+6)]; + val += gout7 * dm[(j0+0)*nao+(i0+7)]; + val += gout8 * dm[(j0+0)*nao+(i0+8)]; + val += gout9 * dm[(j0+0)*nao+(i0+9)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + val = 0; + val += gout10 * dm[(j0+0)*nao+(i0+0)]; + val += gout11 * dm[(j0+0)*nao+(i0+1)]; + val += gout12 * dm[(j0+0)*nao+(i0+2)]; + val += gout13 * dm[(j0+0)*nao+(i0+3)]; + val += gout14 * dm[(j0+0)*nao+(i0+4)]; + val += gout15 * dm[(j0+0)*nao+(i0+5)]; + val += gout16 * dm[(j0+0)*nao+(i0+6)]; + val += gout17 * dm[(j0+0)*nao+(i0+7)]; + val += gout18 * dm[(j0+0)*nao+(i0+8)]; + val += gout19 * dm[(j0+0)*nao+(i0+9)]; + atomicAdd(vj+(k0+1)*nao+(l0+0), val); + val = 0; + val += gout20 * dm[(j0+0)*nao+(i0+0)]; + val += gout21 * dm[(j0+0)*nao+(i0+1)]; + val += gout22 * dm[(j0+0)*nao+(i0+2)]; + val += gout23 * dm[(j0+0)*nao+(i0+3)]; + val += gout24 * dm[(j0+0)*nao+(i0+4)]; + val += gout25 * dm[(j0+0)*nao+(i0+5)]; + val += gout26 * dm[(j0+0)*nao+(i0+6)]; + val += gout27 * dm[(j0+0)*nao+(i0+7)]; + val += gout28 * dm[(j0+0)*nao+(i0+8)]; + val += gout29 * dm[(j0+0)*nao+(i0+9)]; + atomicAdd(vj+(k0+2)*nao+(l0+0), val); + val = 0; + val += gout30 * dm[(j0+0)*nao+(i0+0)]; + val += gout31 * dm[(j0+0)*nao+(i0+1)]; + val += gout32 * dm[(j0+0)*nao+(i0+2)]; + val += gout33 * dm[(j0+0)*nao+(i0+3)]; + val += gout34 * dm[(j0+0)*nao+(i0+4)]; + val += gout35 * dm[(j0+0)*nao+(i0+5)]; + val += gout36 * dm[(j0+0)*nao+(i0+6)]; + val += gout37 * dm[(j0+0)*nao+(i0+7)]; + val += gout38 * dm[(j0+0)*nao+(i0+8)]; + val += gout39 * dm[(j0+0)*nao+(i0+9)]; + atomicAdd(vj+(k0+3)*nao+(l0+0), val); + val = 0; + val += gout40 * dm[(j0+0)*nao+(i0+0)]; + val += gout41 * dm[(j0+0)*nao+(i0+1)]; + val += gout42 * dm[(j0+0)*nao+(i0+2)]; + val += gout43 * dm[(j0+0)*nao+(i0+3)]; + val += gout44 * dm[(j0+0)*nao+(i0+4)]; + val += gout45 * dm[(j0+0)*nao+(i0+5)]; + val += gout46 * dm[(j0+0)*nao+(i0+6)]; + val += gout47 * dm[(j0+0)*nao+(i0+7)]; + val += gout48 * dm[(j0+0)*nao+(i0+8)]; + val += gout49 * dm[(j0+0)*nao+(i0+9)]; + atomicAdd(vj+(k0+4)*nao+(l0+0), val); + val = 0; + val += gout50 * dm[(j0+0)*nao+(i0+0)]; + val += gout51 * dm[(j0+0)*nao+(i0+1)]; + val += gout52 * dm[(j0+0)*nao+(i0+2)]; + val += gout53 * dm[(j0+0)*nao+(i0+3)]; + val += gout54 * dm[(j0+0)*nao+(i0+4)]; + val += gout55 * dm[(j0+0)*nao+(i0+5)]; + val += gout56 * dm[(j0+0)*nao+(i0+6)]; + val += gout57 * dm[(j0+0)*nao+(i0+7)]; + val += gout58 * dm[(j0+0)*nao+(i0+8)]; + val += gout59 * dm[(j0+0)*nao+(i0+9)]; + atomicAdd(vj+(k0+5)*nao+(l0+0), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + val += gout10 * dm[(j0+0)*nao+(k0+1)]; + val += gout20 * dm[(j0+0)*nao+(k0+2)]; + val += gout30 * dm[(j0+0)*nao+(k0+3)]; + val += gout40 * dm[(j0+0)*nao+(k0+4)]; + val += gout50 * dm[(j0+0)*nao+(k0+5)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + val += gout11 * dm[(j0+0)*nao+(k0+1)]; + val += gout21 * dm[(j0+0)*nao+(k0+2)]; + val += gout31 * dm[(j0+0)*nao+(k0+3)]; + val += gout41 * dm[(j0+0)*nao+(k0+4)]; + val += gout51 * dm[(j0+0)*nao+(k0+5)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + val += gout12 * dm[(j0+0)*nao+(k0+1)]; + val += gout22 * dm[(j0+0)*nao+(k0+2)]; + val += gout32 * dm[(j0+0)*nao+(k0+3)]; + val += gout42 * dm[(j0+0)*nao+(k0+4)]; + val += gout52 * dm[(j0+0)*nao+(k0+5)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(k0+0)]; + val += gout13 * dm[(j0+0)*nao+(k0+1)]; + val += gout23 * dm[(j0+0)*nao+(k0+2)]; + val += gout33 * dm[(j0+0)*nao+(k0+3)]; + val += gout43 * dm[(j0+0)*nao+(k0+4)]; + val += gout53 * dm[(j0+0)*nao+(k0+5)]; + atomicAdd(vk+(i0+3)*nao+(l0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(k0+0)]; + val += gout14 * dm[(j0+0)*nao+(k0+1)]; + val += gout24 * dm[(j0+0)*nao+(k0+2)]; + val += gout34 * dm[(j0+0)*nao+(k0+3)]; + val += gout44 * dm[(j0+0)*nao+(k0+4)]; + val += gout54 * dm[(j0+0)*nao+(k0+5)]; + atomicAdd(vk+(i0+4)*nao+(l0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(k0+0)]; + val += gout15 * dm[(j0+0)*nao+(k0+1)]; + val += gout25 * dm[(j0+0)*nao+(k0+2)]; + val += gout35 * dm[(j0+0)*nao+(k0+3)]; + val += gout45 * dm[(j0+0)*nao+(k0+4)]; + val += gout55 * dm[(j0+0)*nao+(k0+5)]; + atomicAdd(vk+(i0+5)*nao+(l0+0), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(k0+0)]; + val += gout16 * dm[(j0+0)*nao+(k0+1)]; + val += gout26 * dm[(j0+0)*nao+(k0+2)]; + val += gout36 * dm[(j0+0)*nao+(k0+3)]; + val += gout46 * dm[(j0+0)*nao+(k0+4)]; + val += gout56 * dm[(j0+0)*nao+(k0+5)]; + atomicAdd(vk+(i0+6)*nao+(l0+0), val); + val = 0; + val += gout7 * dm[(j0+0)*nao+(k0+0)]; + val += gout17 * dm[(j0+0)*nao+(k0+1)]; + val += gout27 * dm[(j0+0)*nao+(k0+2)]; + val += gout37 * dm[(j0+0)*nao+(k0+3)]; + val += gout47 * dm[(j0+0)*nao+(k0+4)]; + val += gout57 * dm[(j0+0)*nao+(k0+5)]; + atomicAdd(vk+(i0+7)*nao+(l0+0), val); + val = 0; + val += gout8 * dm[(j0+0)*nao+(k0+0)]; + val += gout18 * dm[(j0+0)*nao+(k0+1)]; + val += gout28 * dm[(j0+0)*nao+(k0+2)]; + val += gout38 * dm[(j0+0)*nao+(k0+3)]; + val += gout48 * dm[(j0+0)*nao+(k0+4)]; + val += gout58 * dm[(j0+0)*nao+(k0+5)]; + atomicAdd(vk+(i0+8)*nao+(l0+0), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(k0+0)]; + val += gout19 * dm[(j0+0)*nao+(k0+1)]; + val += gout29 * dm[(j0+0)*nao+(k0+2)]; + val += gout39 * dm[(j0+0)*nao+(k0+3)]; + val += gout49 * dm[(j0+0)*nao+(k0+4)]; + val += gout59 * dm[(j0+0)*nao+(k0+5)]; + atomicAdd(vk+(i0+9)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout10 * dm[(i0+0)*nao+(k0+1)]; + val += gout20 * dm[(i0+0)*nao+(k0+2)]; + val += gout30 * dm[(i0+0)*nao+(k0+3)]; + val += gout40 * dm[(i0+0)*nao+(k0+4)]; + val += gout50 * dm[(i0+0)*nao+(k0+5)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout11 * dm[(i0+1)*nao+(k0+1)]; + val += gout21 * dm[(i0+1)*nao+(k0+2)]; + val += gout31 * dm[(i0+1)*nao+(k0+3)]; + val += gout41 * dm[(i0+1)*nao+(k0+4)]; + val += gout51 * dm[(i0+1)*nao+(k0+5)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + val += gout12 * dm[(i0+2)*nao+(k0+1)]; + val += gout22 * dm[(i0+2)*nao+(k0+2)]; + val += gout32 * dm[(i0+2)*nao+(k0+3)]; + val += gout42 * dm[(i0+2)*nao+(k0+4)]; + val += gout52 * dm[(i0+2)*nao+(k0+5)]; + val += gout3 * dm[(i0+3)*nao+(k0+0)]; + val += gout13 * dm[(i0+3)*nao+(k0+1)]; + val += gout23 * dm[(i0+3)*nao+(k0+2)]; + val += gout33 * dm[(i0+3)*nao+(k0+3)]; + val += gout43 * dm[(i0+3)*nao+(k0+4)]; + val += gout53 * dm[(i0+3)*nao+(k0+5)]; + val += gout4 * dm[(i0+4)*nao+(k0+0)]; + val += gout14 * dm[(i0+4)*nao+(k0+1)]; + val += gout24 * dm[(i0+4)*nao+(k0+2)]; + val += gout34 * dm[(i0+4)*nao+(k0+3)]; + val += gout44 * dm[(i0+4)*nao+(k0+4)]; + val += gout54 * dm[(i0+4)*nao+(k0+5)]; + val += gout5 * dm[(i0+5)*nao+(k0+0)]; + val += gout15 * dm[(i0+5)*nao+(k0+1)]; + val += gout25 * dm[(i0+5)*nao+(k0+2)]; + val += gout35 * dm[(i0+5)*nao+(k0+3)]; + val += gout45 * dm[(i0+5)*nao+(k0+4)]; + val += gout55 * dm[(i0+5)*nao+(k0+5)]; + val += gout6 * dm[(i0+6)*nao+(k0+0)]; + val += gout16 * dm[(i0+6)*nao+(k0+1)]; + val += gout26 * dm[(i0+6)*nao+(k0+2)]; + val += gout36 * dm[(i0+6)*nao+(k0+3)]; + val += gout46 * dm[(i0+6)*nao+(k0+4)]; + val += gout56 * dm[(i0+6)*nao+(k0+5)]; + val += gout7 * dm[(i0+7)*nao+(k0+0)]; + val += gout17 * dm[(i0+7)*nao+(k0+1)]; + val += gout27 * dm[(i0+7)*nao+(k0+2)]; + val += gout37 * dm[(i0+7)*nao+(k0+3)]; + val += gout47 * dm[(i0+7)*nao+(k0+4)]; + val += gout57 * dm[(i0+7)*nao+(k0+5)]; + val += gout8 * dm[(i0+8)*nao+(k0+0)]; + val += gout18 * dm[(i0+8)*nao+(k0+1)]; + val += gout28 * dm[(i0+8)*nao+(k0+2)]; + val += gout38 * dm[(i0+8)*nao+(k0+3)]; + val += gout48 * dm[(i0+8)*nao+(k0+4)]; + val += gout58 * dm[(i0+8)*nao+(k0+5)]; + val += gout9 * dm[(i0+9)*nao+(k0+0)]; + val += gout19 * dm[(i0+9)*nao+(k0+1)]; + val += gout29 * dm[(i0+9)*nao+(k0+2)]; + val += gout39 * dm[(i0+9)*nao+(k0+3)]; + val += gout49 * dm[(i0+9)*nao+(k0+4)]; + val += gout59 * dm[(i0+9)*nao+(k0+5)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout10 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+1), val); + val = 0; + val += gout20 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+2), val); + val = 0; + val += gout30 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+3), val); + val = 0; + val += gout40 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+4), val); + val = 0; + val += gout50 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+5), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout11 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+1), val); + val = 0; + val += gout21 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+2), val); + val = 0; + val += gout31 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+3), val); + val = 0; + val += gout41 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+4), val); + val = 0; + val += gout51 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+5), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout12 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+1), val); + val = 0; + val += gout22 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+2), val); + val = 0; + val += gout32 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+3), val); + val = 0; + val += gout42 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+4), val); + val = 0; + val += gout52 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+5), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+0), val); + val = 0; + val += gout13 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+1), val); + val = 0; + val += gout23 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+2), val); + val = 0; + val += gout33 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+3), val); + val = 0; + val += gout43 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+4), val); + val = 0; + val += gout53 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+5), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+0), val); + val = 0; + val += gout14 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+1), val); + val = 0; + val += gout24 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+2), val); + val = 0; + val += gout34 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+3), val); + val = 0; + val += gout44 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+4), val); + val = 0; + val += gout54 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+5), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+0), val); + val = 0; + val += gout15 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+1), val); + val = 0; + val += gout25 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+2), val); + val = 0; + val += gout35 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+3), val); + val = 0; + val += gout45 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+4), val); + val = 0; + val += gout55 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+5), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+6)*nao+(k0+0), val); + val = 0; + val += gout16 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+6)*nao+(k0+1), val); + val = 0; + val += gout26 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+6)*nao+(k0+2), val); + val = 0; + val += gout36 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+6)*nao+(k0+3), val); + val = 0; + val += gout46 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+6)*nao+(k0+4), val); + val = 0; + val += gout56 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+6)*nao+(k0+5), val); + val = 0; + val += gout7 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+7)*nao+(k0+0), val); + val = 0; + val += gout17 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+7)*nao+(k0+1), val); + val = 0; + val += gout27 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+7)*nao+(k0+2), val); + val = 0; + val += gout37 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+7)*nao+(k0+3), val); + val = 0; + val += gout47 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+7)*nao+(k0+4), val); + val = 0; + val += gout57 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+7)*nao+(k0+5), val); + val = 0; + val += gout8 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+8)*nao+(k0+0), val); + val = 0; + val += gout18 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+8)*nao+(k0+1), val); + val = 0; + val += gout28 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+8)*nao+(k0+2), val); + val = 0; + val += gout38 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+8)*nao+(k0+3), val); + val = 0; + val += gout48 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+8)*nao+(k0+4), val); + val = 0; + val += gout58 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+8)*nao+(k0+5), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+9)*nao+(k0+0), val); + val = 0; + val += gout19 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+9)*nao+(k0+1), val); + val = 0; + val += gout29 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+9)*nao+(k0+2), val); + val = 0; + val += gout39 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+9)*nao+(k0+3), val); + val = 0; + val += gout49 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+9)*nao+(k0+4), val); + val = 0; + val += gout59 * dm[(j0+0)*nao+(l0+0)]; + atomicAdd(vk+(i0+9)*nao+(k0+5), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + val += gout3 * dm[(i0+3)*nao+(l0+0)]; + val += gout4 * dm[(i0+4)*nao+(l0+0)]; + val += gout5 * dm[(i0+5)*nao+(l0+0)]; + val += gout6 * dm[(i0+6)*nao+(l0+0)]; + val += gout7 * dm[(i0+7)*nao+(l0+0)]; + val += gout8 * dm[(i0+8)*nao+(l0+0)]; + val += gout9 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + val = 0; + val += gout10 * dm[(i0+0)*nao+(l0+0)]; + val += gout11 * dm[(i0+1)*nao+(l0+0)]; + val += gout12 * dm[(i0+2)*nao+(l0+0)]; + val += gout13 * dm[(i0+3)*nao+(l0+0)]; + val += gout14 * dm[(i0+4)*nao+(l0+0)]; + val += gout15 * dm[(i0+5)*nao+(l0+0)]; + val += gout16 * dm[(i0+6)*nao+(l0+0)]; + val += gout17 * dm[(i0+7)*nao+(l0+0)]; + val += gout18 * dm[(i0+8)*nao+(l0+0)]; + val += gout19 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+1), val); + val = 0; + val += gout20 * dm[(i0+0)*nao+(l0+0)]; + val += gout21 * dm[(i0+1)*nao+(l0+0)]; + val += gout22 * dm[(i0+2)*nao+(l0+0)]; + val += gout23 * dm[(i0+3)*nao+(l0+0)]; + val += gout24 * dm[(i0+4)*nao+(l0+0)]; + val += gout25 * dm[(i0+5)*nao+(l0+0)]; + val += gout26 * dm[(i0+6)*nao+(l0+0)]; + val += gout27 * dm[(i0+7)*nao+(l0+0)]; + val += gout28 * dm[(i0+8)*nao+(l0+0)]; + val += gout29 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+2), val); + val = 0; + val += gout30 * dm[(i0+0)*nao+(l0+0)]; + val += gout31 * dm[(i0+1)*nao+(l0+0)]; + val += gout32 * dm[(i0+2)*nao+(l0+0)]; + val += gout33 * dm[(i0+3)*nao+(l0+0)]; + val += gout34 * dm[(i0+4)*nao+(l0+0)]; + val += gout35 * dm[(i0+5)*nao+(l0+0)]; + val += gout36 * dm[(i0+6)*nao+(l0+0)]; + val += gout37 * dm[(i0+7)*nao+(l0+0)]; + val += gout38 * dm[(i0+8)*nao+(l0+0)]; + val += gout39 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+3), val); + val = 0; + val += gout40 * dm[(i0+0)*nao+(l0+0)]; + val += gout41 * dm[(i0+1)*nao+(l0+0)]; + val += gout42 * dm[(i0+2)*nao+(l0+0)]; + val += gout43 * dm[(i0+3)*nao+(l0+0)]; + val += gout44 * dm[(i0+4)*nao+(l0+0)]; + val += gout45 * dm[(i0+5)*nao+(l0+0)]; + val += gout46 * dm[(i0+6)*nao+(l0+0)]; + val += gout47 * dm[(i0+7)*nao+(l0+0)]; + val += gout48 * dm[(i0+8)*nao+(l0+0)]; + val += gout49 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+4), val); + val = 0; + val += gout50 * dm[(i0+0)*nao+(l0+0)]; + val += gout51 * dm[(i0+1)*nao+(l0+0)]; + val += gout52 * dm[(i0+2)*nao+(l0+0)]; + val += gout53 * dm[(i0+3)*nao+(l0+0)]; + val += gout54 * dm[(i0+4)*nao+(l0+0)]; + val += gout55 * dm[(i0+5)*nao+(l0+0)]; + val += gout56 * dm[(i0+6)*nao+(l0+0)]; + val += gout57 * dm[(i0+7)*nao+(l0+0)]; + val += gout58 * dm[(i0+8)*nao+(l0+0)]; + val += gout59 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+5), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +__global__ +void rys_sr_jk_3020(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_sr_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_sr_jk_3020(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_jk_3100(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double gout3; + double gout4; + double gout5; + double gout6; + double gout7; + double gout8; + double gout9; + double gout10; + double gout11; + double gout12; + double gout13; + double gout14; + double gout15; + double gout16; + double gout17; + double gout18; + double gout19; + double gout20; + double gout21; + double gout22; + double gout23; + double gout24; + double gout25; + double gout26; + double gout27; + double gout28; + double gout29; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + gout3 = 0; + gout4 = 0; + gout5 = 0; + gout6 = 0; + gout7 = 0; + gout8 = 0; + gout9 = 0; + gout10 = 0; + gout11 = 0; + gout12 = 0; + gout13 = 0; + gout14 = 0; + gout15 = 0; + gout16 = 0; + gout17 = 0; + gout18 = 0; + gout19 = 0; + gout20 = 0; + gout21 = 0; + gout22 = 0; + gout23 = 0; + gout24 = 0; + gout25 = 0; + gout26 = 0; + gout27 = 0; + gout28 = 0; + gout29 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(3, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(3, theta_fac*theta_rr, rw); + fac *= sqrt(theta_fac); + for (int irys = 0; irys < 3; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + } + } + if (task_id < ntasks) { + for (int irys = 0; irys < 3; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + double trr_30x = c0x * trr_20x + 2*b10 * trr_10x; + double trr_40x = c0x * trr_30x + 3*b10 * trr_20x; + double hrr_3100x = trr_40x - xjxi * trr_30x; + gout0 += hrr_3100x * 1 * wt; + double hrr_2100x = trr_30x - xjxi * trr_20x; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += hrr_2100x * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += hrr_2100x * 1 * trr_10z; + double hrr_1100x = trr_20x - xjxi * trr_10x; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + gout3 += hrr_1100x * trr_20y * wt; + gout4 += hrr_1100x * trr_10y * trr_10z; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + gout5 += hrr_1100x * 1 * trr_20z; + double hrr_0100x = trr_10x - xjxi * fac; + double trr_30y = c0y * trr_20y + 2*b10 * trr_10y; + gout6 += hrr_0100x * trr_30y * wt; + gout7 += hrr_0100x * trr_20y * trr_10z; + gout8 += hrr_0100x * trr_10y * trr_20z; + double trr_30z = c0z * trr_20z + 2*b10 * trr_10z; + gout9 += hrr_0100x * 1 * trr_30z; + double hrr_0100y = trr_10y - yjyi * 1; + gout10 += trr_30x * hrr_0100y * wt; + double hrr_1100y = trr_20y - yjyi * trr_10y; + gout11 += trr_20x * hrr_1100y * wt; + gout12 += trr_20x * hrr_0100y * trr_10z; + double hrr_2100y = trr_30y - yjyi * trr_20y; + gout13 += trr_10x * hrr_2100y * wt; + gout14 += trr_10x * hrr_1100y * trr_10z; + gout15 += trr_10x * hrr_0100y * trr_20z; + double trr_40y = c0y * trr_30y + 3*b10 * trr_20y; + double hrr_3100y = trr_40y - yjyi * trr_30y; + gout16 += fac * hrr_3100y * wt; + gout17 += fac * hrr_2100y * trr_10z; + gout18 += fac * hrr_1100y * trr_20z; + gout19 += fac * hrr_0100y * trr_30z; + double hrr_0100z = trr_10z - zjzi * wt; + gout20 += trr_30x * 1 * hrr_0100z; + gout21 += trr_20x * trr_10y * hrr_0100z; + double hrr_1100z = trr_20z - zjzi * trr_10z; + gout22 += trr_20x * 1 * hrr_1100z; + gout23 += trr_10x * trr_20y * hrr_0100z; + gout24 += trr_10x * trr_10y * hrr_1100z; + double hrr_2100z = trr_30z - zjzi * trr_20z; + gout25 += trr_10x * 1 * hrr_2100z; + gout26 += fac * trr_30y * hrr_0100z; + gout27 += fac * trr_20y * hrr_1100z; + gout28 += fac * trr_10y * hrr_2100z; + double trr_40z = c0z * trr_30z + 3*b10 * trr_20z; + double hrr_3100z = trr_40z - zjzi * trr_30z; + gout29 += fac * 1 * hrr_3100z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout10 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+1), val); + val = 0; + val += gout20 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+2), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout11 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+1), val); + val = 0; + val += gout21 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+2), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout12 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+1), val); + val = 0; + val += gout22 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+2), val); + val = 0; + val += gout3 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+0), val); + val = 0; + val += gout13 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+1), val); + val = 0; + val += gout23 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+2), val); + val = 0; + val += gout4 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+0), val); + val = 0; + val += gout14 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+1), val); + val = 0; + val += gout24 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+2), val); + val = 0; + val += gout5 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+0), val); + val = 0; + val += gout15 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+1), val); + val = 0; + val += gout25 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+2), val); + val = 0; + val += gout6 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+6)*nao+(j0+0), val); + val = 0; + val += gout16 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+6)*nao+(j0+1), val); + val = 0; + val += gout26 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+6)*nao+(j0+2), val); + val = 0; + val += gout7 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+7)*nao+(j0+0), val); + val = 0; + val += gout17 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+7)*nao+(j0+1), val); + val = 0; + val += gout27 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+7)*nao+(j0+2), val); + val = 0; + val += gout8 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+8)*nao+(j0+0), val); + val = 0; + val += gout18 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+8)*nao+(j0+1), val); + val = 0; + val += gout28 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+8)*nao+(j0+2), val); + val = 0; + val += gout9 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+9)*nao+(j0+0), val); + val = 0; + val += gout19 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+9)*nao+(j0+1), val); + val = 0; + val += gout29 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+9)*nao+(j0+2), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + val += gout3 * dm[(j0+0)*nao+(i0+3)]; + val += gout4 * dm[(j0+0)*nao+(i0+4)]; + val += gout5 * dm[(j0+0)*nao+(i0+5)]; + val += gout6 * dm[(j0+0)*nao+(i0+6)]; + val += gout7 * dm[(j0+0)*nao+(i0+7)]; + val += gout8 * dm[(j0+0)*nao+(i0+8)]; + val += gout9 * dm[(j0+0)*nao+(i0+9)]; + val += gout10 * dm[(j0+1)*nao+(i0+0)]; + val += gout11 * dm[(j0+1)*nao+(i0+1)]; + val += gout12 * dm[(j0+1)*nao+(i0+2)]; + val += gout13 * dm[(j0+1)*nao+(i0+3)]; + val += gout14 * dm[(j0+1)*nao+(i0+4)]; + val += gout15 * dm[(j0+1)*nao+(i0+5)]; + val += gout16 * dm[(j0+1)*nao+(i0+6)]; + val += gout17 * dm[(j0+1)*nao+(i0+7)]; + val += gout18 * dm[(j0+1)*nao+(i0+8)]; + val += gout19 * dm[(j0+1)*nao+(i0+9)]; + val += gout20 * dm[(j0+2)*nao+(i0+0)]; + val += gout21 * dm[(j0+2)*nao+(i0+1)]; + val += gout22 * dm[(j0+2)*nao+(i0+2)]; + val += gout23 * dm[(j0+2)*nao+(i0+3)]; + val += gout24 * dm[(j0+2)*nao+(i0+4)]; + val += gout25 * dm[(j0+2)*nao+(i0+5)]; + val += gout26 * dm[(j0+2)*nao+(i0+6)]; + val += gout27 * dm[(j0+2)*nao+(i0+7)]; + val += gout28 * dm[(j0+2)*nao+(i0+8)]; + val += gout29 * dm[(j0+2)*nao+(i0+9)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + val += gout10 * dm[(j0+1)*nao+(k0+0)]; + val += gout20 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + val += gout11 * dm[(j0+1)*nao+(k0+0)]; + val += gout21 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + val += gout12 * dm[(j0+1)*nao+(k0+0)]; + val += gout22 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(k0+0)]; + val += gout13 * dm[(j0+1)*nao+(k0+0)]; + val += gout23 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+3)*nao+(l0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(k0+0)]; + val += gout14 * dm[(j0+1)*nao+(k0+0)]; + val += gout24 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+4)*nao+(l0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(k0+0)]; + val += gout15 * dm[(j0+1)*nao+(k0+0)]; + val += gout25 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+5)*nao+(l0+0), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(k0+0)]; + val += gout16 * dm[(j0+1)*nao+(k0+0)]; + val += gout26 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+6)*nao+(l0+0), val); + val = 0; + val += gout7 * dm[(j0+0)*nao+(k0+0)]; + val += gout17 * dm[(j0+1)*nao+(k0+0)]; + val += gout27 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+7)*nao+(l0+0), val); + val = 0; + val += gout8 * dm[(j0+0)*nao+(k0+0)]; + val += gout18 * dm[(j0+1)*nao+(k0+0)]; + val += gout28 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+8)*nao+(l0+0), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(k0+0)]; + val += gout19 * dm[(j0+1)*nao+(k0+0)]; + val += gout29 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+9)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + val += gout3 * dm[(i0+3)*nao+(k0+0)]; + val += gout4 * dm[(i0+4)*nao+(k0+0)]; + val += gout5 * dm[(i0+5)*nao+(k0+0)]; + val += gout6 * dm[(i0+6)*nao+(k0+0)]; + val += gout7 * dm[(i0+7)*nao+(k0+0)]; + val += gout8 * dm[(i0+8)*nao+(k0+0)]; + val += gout9 * dm[(i0+9)*nao+(k0+0)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout10 * dm[(i0+0)*nao+(k0+0)]; + val += gout11 * dm[(i0+1)*nao+(k0+0)]; + val += gout12 * dm[(i0+2)*nao+(k0+0)]; + val += gout13 * dm[(i0+3)*nao+(k0+0)]; + val += gout14 * dm[(i0+4)*nao+(k0+0)]; + val += gout15 * dm[(i0+5)*nao+(k0+0)]; + val += gout16 * dm[(i0+6)*nao+(k0+0)]; + val += gout17 * dm[(i0+7)*nao+(k0+0)]; + val += gout18 * dm[(i0+8)*nao+(k0+0)]; + val += gout19 * dm[(i0+9)*nao+(k0+0)]; + atomicAdd(vk+(j0+1)*nao+(l0+0), val); + val = 0; + val += gout20 * dm[(i0+0)*nao+(k0+0)]; + val += gout21 * dm[(i0+1)*nao+(k0+0)]; + val += gout22 * dm[(i0+2)*nao+(k0+0)]; + val += gout23 * dm[(i0+3)*nao+(k0+0)]; + val += gout24 * dm[(i0+4)*nao+(k0+0)]; + val += gout25 * dm[(i0+5)*nao+(k0+0)]; + val += gout26 * dm[(i0+6)*nao+(k0+0)]; + val += gout27 * dm[(i0+7)*nao+(k0+0)]; + val += gout28 * dm[(i0+8)*nao+(k0+0)]; + val += gout29 * dm[(i0+9)*nao+(k0+0)]; + atomicAdd(vk+(j0+2)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + val += gout10 * dm[(j0+1)*nao+(l0+0)]; + val += gout20 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + val += gout11 * dm[(j0+1)*nao+(l0+0)]; + val += gout21 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + val += gout12 * dm[(j0+1)*nao+(l0+0)]; + val += gout22 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(l0+0)]; + val += gout13 * dm[(j0+1)*nao+(l0+0)]; + val += gout23 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(l0+0)]; + val += gout14 * dm[(j0+1)*nao+(l0+0)]; + val += gout24 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(l0+0)]; + val += gout15 * dm[(j0+1)*nao+(l0+0)]; + val += gout25 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+0), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(l0+0)]; + val += gout16 * dm[(j0+1)*nao+(l0+0)]; + val += gout26 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+6)*nao+(k0+0), val); + val = 0; + val += gout7 * dm[(j0+0)*nao+(l0+0)]; + val += gout17 * dm[(j0+1)*nao+(l0+0)]; + val += gout27 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+7)*nao+(k0+0), val); + val = 0; + val += gout8 * dm[(j0+0)*nao+(l0+0)]; + val += gout18 * dm[(j0+1)*nao+(l0+0)]; + val += gout28 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+8)*nao+(k0+0), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(l0+0)]; + val += gout19 * dm[(j0+1)*nao+(l0+0)]; + val += gout29 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+9)*nao+(k0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + val += gout3 * dm[(i0+3)*nao+(l0+0)]; + val += gout4 * dm[(i0+4)*nao+(l0+0)]; + val += gout5 * dm[(i0+5)*nao+(l0+0)]; + val += gout6 * dm[(i0+6)*nao+(l0+0)]; + val += gout7 * dm[(i0+7)*nao+(l0+0)]; + val += gout8 * dm[(i0+8)*nao+(l0+0)]; + val += gout9 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + val = 0; + val += gout10 * dm[(i0+0)*nao+(l0+0)]; + val += gout11 * dm[(i0+1)*nao+(l0+0)]; + val += gout12 * dm[(i0+2)*nao+(l0+0)]; + val += gout13 * dm[(i0+3)*nao+(l0+0)]; + val += gout14 * dm[(i0+4)*nao+(l0+0)]; + val += gout15 * dm[(i0+5)*nao+(l0+0)]; + val += gout16 * dm[(i0+6)*nao+(l0+0)]; + val += gout17 * dm[(i0+7)*nao+(l0+0)]; + val += gout18 * dm[(i0+8)*nao+(l0+0)]; + val += gout19 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+1)*nao+(k0+0), val); + val = 0; + val += gout20 * dm[(i0+0)*nao+(l0+0)]; + val += gout21 * dm[(i0+1)*nao+(l0+0)]; + val += gout22 * dm[(i0+2)*nao+(l0+0)]; + val += gout23 * dm[(i0+3)*nao+(l0+0)]; + val += gout24 * dm[(i0+4)*nao+(l0+0)]; + val += gout25 * dm[(i0+5)*nao+(l0+0)]; + val += gout26 * dm[(i0+6)*nao+(l0+0)]; + val += gout27 * dm[(i0+7)*nao+(l0+0)]; + val += gout28 * dm[(i0+8)*nao+(l0+0)]; + val += gout29 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+2)*nao+(k0+0), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +__global__ +void rys_jk_3100(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_jk_3100(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_sr_jk_3100(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double gout3; + double gout4; + double gout5; + double gout6; + double gout7; + double gout8; + double gout9; + double gout10; + double gout11; + double gout12; + double gout13; + double gout14; + double gout15; + double gout16; + double gout17; + double gout18; + double gout19; + double gout20; + double gout21; + double gout22; + double gout23; + double gout24; + double gout25; + double gout26; + double gout27; + double gout28; + double gout29; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + gout3 = 0; + gout4 = 0; + gout5 = 0; + gout6 = 0; + gout7 = 0; + gout8 = 0; + gout9 = 0; + gout10 = 0; + gout11 = 0; + gout12 = 0; + gout13 = 0; + gout14 = 0; + gout15 = 0; + gout16 = 0; + gout17 = 0; + gout18 = 0; + gout19 = 0; + gout20 = 0; + gout21 = 0; + gout22 = 0; + gout23 = 0; + gout24 = 0; + gout25 = 0; + gout26 = 0; + gout27 = 0; + gout28 = 0; + gout29 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + rys_roots(3, theta_rr, rw+6*nsq_per_block); + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(3, theta_fac*theta_rr, rw); + double sqrt_theta_fac = -sqrt(theta_fac); + for (int irys = 0; irys < 3; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + rw[sq_id+(irys*2+1)*nsq_per_block] *= sqrt_theta_fac; + } + if (task_id < ntasks) { + for (int irys = 0; irys < 6; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + double trr_30x = c0x * trr_20x + 2*b10 * trr_10x; + double trr_40x = c0x * trr_30x + 3*b10 * trr_20x; + double hrr_3100x = trr_40x - xjxi * trr_30x; + gout0 += hrr_3100x * 1 * wt; + double hrr_2100x = trr_30x - xjxi * trr_20x; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += hrr_2100x * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += hrr_2100x * 1 * trr_10z; + double hrr_1100x = trr_20x - xjxi * trr_10x; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + gout3 += hrr_1100x * trr_20y * wt; + gout4 += hrr_1100x * trr_10y * trr_10z; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + gout5 += hrr_1100x * 1 * trr_20z; + double hrr_0100x = trr_10x - xjxi * fac; + double trr_30y = c0y * trr_20y + 2*b10 * trr_10y; + gout6 += hrr_0100x * trr_30y * wt; + gout7 += hrr_0100x * trr_20y * trr_10z; + gout8 += hrr_0100x * trr_10y * trr_20z; + double trr_30z = c0z * trr_20z + 2*b10 * trr_10z; + gout9 += hrr_0100x * 1 * trr_30z; + double hrr_0100y = trr_10y - yjyi * 1; + gout10 += trr_30x * hrr_0100y * wt; + double hrr_1100y = trr_20y - yjyi * trr_10y; + gout11 += trr_20x * hrr_1100y * wt; + gout12 += trr_20x * hrr_0100y * trr_10z; + double hrr_2100y = trr_30y - yjyi * trr_20y; + gout13 += trr_10x * hrr_2100y * wt; + gout14 += trr_10x * hrr_1100y * trr_10z; + gout15 += trr_10x * hrr_0100y * trr_20z; + double trr_40y = c0y * trr_30y + 3*b10 * trr_20y; + double hrr_3100y = trr_40y - yjyi * trr_30y; + gout16 += fac * hrr_3100y * wt; + gout17 += fac * hrr_2100y * trr_10z; + gout18 += fac * hrr_1100y * trr_20z; + gout19 += fac * hrr_0100y * trr_30z; + double hrr_0100z = trr_10z - zjzi * wt; + gout20 += trr_30x * 1 * hrr_0100z; + gout21 += trr_20x * trr_10y * hrr_0100z; + double hrr_1100z = trr_20z - zjzi * trr_10z; + gout22 += trr_20x * 1 * hrr_1100z; + gout23 += trr_10x * trr_20y * hrr_0100z; + gout24 += trr_10x * trr_10y * hrr_1100z; + double hrr_2100z = trr_30z - zjzi * trr_20z; + gout25 += trr_10x * 1 * hrr_2100z; + gout26 += fac * trr_30y * hrr_0100z; + gout27 += fac * trr_20y * hrr_1100z; + gout28 += fac * trr_10y * hrr_2100z; + double trr_40z = c0z * trr_30z + 3*b10 * trr_20z; + double hrr_3100z = trr_40z - zjzi * trr_30z; + gout29 += fac * 1 * hrr_3100z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout10 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+1), val); + val = 0; + val += gout20 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+2), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout11 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+1), val); + val = 0; + val += gout21 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+2), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout12 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+1), val); + val = 0; + val += gout22 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+2), val); + val = 0; + val += gout3 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+0), val); + val = 0; + val += gout13 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+1), val); + val = 0; + val += gout23 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+2), val); + val = 0; + val += gout4 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+0), val); + val = 0; + val += gout14 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+1), val); + val = 0; + val += gout24 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+2), val); + val = 0; + val += gout5 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+0), val); + val = 0; + val += gout15 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+1), val); + val = 0; + val += gout25 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+2), val); + val = 0; + val += gout6 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+6)*nao+(j0+0), val); + val = 0; + val += gout16 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+6)*nao+(j0+1), val); + val = 0; + val += gout26 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+6)*nao+(j0+2), val); + val = 0; + val += gout7 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+7)*nao+(j0+0), val); + val = 0; + val += gout17 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+7)*nao+(j0+1), val); + val = 0; + val += gout27 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+7)*nao+(j0+2), val); + val = 0; + val += gout8 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+8)*nao+(j0+0), val); + val = 0; + val += gout18 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+8)*nao+(j0+1), val); + val = 0; + val += gout28 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+8)*nao+(j0+2), val); + val = 0; + val += gout9 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+9)*nao+(j0+0), val); + val = 0; + val += gout19 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+9)*nao+(j0+1), val); + val = 0; + val += gout29 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+9)*nao+(j0+2), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + val += gout3 * dm[(j0+0)*nao+(i0+3)]; + val += gout4 * dm[(j0+0)*nao+(i0+4)]; + val += gout5 * dm[(j0+0)*nao+(i0+5)]; + val += gout6 * dm[(j0+0)*nao+(i0+6)]; + val += gout7 * dm[(j0+0)*nao+(i0+7)]; + val += gout8 * dm[(j0+0)*nao+(i0+8)]; + val += gout9 * dm[(j0+0)*nao+(i0+9)]; + val += gout10 * dm[(j0+1)*nao+(i0+0)]; + val += gout11 * dm[(j0+1)*nao+(i0+1)]; + val += gout12 * dm[(j0+1)*nao+(i0+2)]; + val += gout13 * dm[(j0+1)*nao+(i0+3)]; + val += gout14 * dm[(j0+1)*nao+(i0+4)]; + val += gout15 * dm[(j0+1)*nao+(i0+5)]; + val += gout16 * dm[(j0+1)*nao+(i0+6)]; + val += gout17 * dm[(j0+1)*nao+(i0+7)]; + val += gout18 * dm[(j0+1)*nao+(i0+8)]; + val += gout19 * dm[(j0+1)*nao+(i0+9)]; + val += gout20 * dm[(j0+2)*nao+(i0+0)]; + val += gout21 * dm[(j0+2)*nao+(i0+1)]; + val += gout22 * dm[(j0+2)*nao+(i0+2)]; + val += gout23 * dm[(j0+2)*nao+(i0+3)]; + val += gout24 * dm[(j0+2)*nao+(i0+4)]; + val += gout25 * dm[(j0+2)*nao+(i0+5)]; + val += gout26 * dm[(j0+2)*nao+(i0+6)]; + val += gout27 * dm[(j0+2)*nao+(i0+7)]; + val += gout28 * dm[(j0+2)*nao+(i0+8)]; + val += gout29 * dm[(j0+2)*nao+(i0+9)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + val += gout10 * dm[(j0+1)*nao+(k0+0)]; + val += gout20 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + val += gout11 * dm[(j0+1)*nao+(k0+0)]; + val += gout21 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + val += gout12 * dm[(j0+1)*nao+(k0+0)]; + val += gout22 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(k0+0)]; + val += gout13 * dm[(j0+1)*nao+(k0+0)]; + val += gout23 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+3)*nao+(l0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(k0+0)]; + val += gout14 * dm[(j0+1)*nao+(k0+0)]; + val += gout24 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+4)*nao+(l0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(k0+0)]; + val += gout15 * dm[(j0+1)*nao+(k0+0)]; + val += gout25 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+5)*nao+(l0+0), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(k0+0)]; + val += gout16 * dm[(j0+1)*nao+(k0+0)]; + val += gout26 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+6)*nao+(l0+0), val); + val = 0; + val += gout7 * dm[(j0+0)*nao+(k0+0)]; + val += gout17 * dm[(j0+1)*nao+(k0+0)]; + val += gout27 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+7)*nao+(l0+0), val); + val = 0; + val += gout8 * dm[(j0+0)*nao+(k0+0)]; + val += gout18 * dm[(j0+1)*nao+(k0+0)]; + val += gout28 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+8)*nao+(l0+0), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(k0+0)]; + val += gout19 * dm[(j0+1)*nao+(k0+0)]; + val += gout29 * dm[(j0+2)*nao+(k0+0)]; + atomicAdd(vk+(i0+9)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + val += gout3 * dm[(i0+3)*nao+(k0+0)]; + val += gout4 * dm[(i0+4)*nao+(k0+0)]; + val += gout5 * dm[(i0+5)*nao+(k0+0)]; + val += gout6 * dm[(i0+6)*nao+(k0+0)]; + val += gout7 * dm[(i0+7)*nao+(k0+0)]; + val += gout8 * dm[(i0+8)*nao+(k0+0)]; + val += gout9 * dm[(i0+9)*nao+(k0+0)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout10 * dm[(i0+0)*nao+(k0+0)]; + val += gout11 * dm[(i0+1)*nao+(k0+0)]; + val += gout12 * dm[(i0+2)*nao+(k0+0)]; + val += gout13 * dm[(i0+3)*nao+(k0+0)]; + val += gout14 * dm[(i0+4)*nao+(k0+0)]; + val += gout15 * dm[(i0+5)*nao+(k0+0)]; + val += gout16 * dm[(i0+6)*nao+(k0+0)]; + val += gout17 * dm[(i0+7)*nao+(k0+0)]; + val += gout18 * dm[(i0+8)*nao+(k0+0)]; + val += gout19 * dm[(i0+9)*nao+(k0+0)]; + atomicAdd(vk+(j0+1)*nao+(l0+0), val); + val = 0; + val += gout20 * dm[(i0+0)*nao+(k0+0)]; + val += gout21 * dm[(i0+1)*nao+(k0+0)]; + val += gout22 * dm[(i0+2)*nao+(k0+0)]; + val += gout23 * dm[(i0+3)*nao+(k0+0)]; + val += gout24 * dm[(i0+4)*nao+(k0+0)]; + val += gout25 * dm[(i0+5)*nao+(k0+0)]; + val += gout26 * dm[(i0+6)*nao+(k0+0)]; + val += gout27 * dm[(i0+7)*nao+(k0+0)]; + val += gout28 * dm[(i0+8)*nao+(k0+0)]; + val += gout29 * dm[(i0+9)*nao+(k0+0)]; + atomicAdd(vk+(j0+2)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + val += gout10 * dm[(j0+1)*nao+(l0+0)]; + val += gout20 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + val += gout11 * dm[(j0+1)*nao+(l0+0)]; + val += gout21 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + val += gout12 * dm[(j0+1)*nao+(l0+0)]; + val += gout22 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(l0+0)]; + val += gout13 * dm[(j0+1)*nao+(l0+0)]; + val += gout23 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(l0+0)]; + val += gout14 * dm[(j0+1)*nao+(l0+0)]; + val += gout24 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(l0+0)]; + val += gout15 * dm[(j0+1)*nao+(l0+0)]; + val += gout25 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+0), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(l0+0)]; + val += gout16 * dm[(j0+1)*nao+(l0+0)]; + val += gout26 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+6)*nao+(k0+0), val); + val = 0; + val += gout7 * dm[(j0+0)*nao+(l0+0)]; + val += gout17 * dm[(j0+1)*nao+(l0+0)]; + val += gout27 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+7)*nao+(k0+0), val); + val = 0; + val += gout8 * dm[(j0+0)*nao+(l0+0)]; + val += gout18 * dm[(j0+1)*nao+(l0+0)]; + val += gout28 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+8)*nao+(k0+0), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(l0+0)]; + val += gout19 * dm[(j0+1)*nao+(l0+0)]; + val += gout29 * dm[(j0+2)*nao+(l0+0)]; + atomicAdd(vk+(i0+9)*nao+(k0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + val += gout3 * dm[(i0+3)*nao+(l0+0)]; + val += gout4 * dm[(i0+4)*nao+(l0+0)]; + val += gout5 * dm[(i0+5)*nao+(l0+0)]; + val += gout6 * dm[(i0+6)*nao+(l0+0)]; + val += gout7 * dm[(i0+7)*nao+(l0+0)]; + val += gout8 * dm[(i0+8)*nao+(l0+0)]; + val += gout9 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + val = 0; + val += gout10 * dm[(i0+0)*nao+(l0+0)]; + val += gout11 * dm[(i0+1)*nao+(l0+0)]; + val += gout12 * dm[(i0+2)*nao+(l0+0)]; + val += gout13 * dm[(i0+3)*nao+(l0+0)]; + val += gout14 * dm[(i0+4)*nao+(l0+0)]; + val += gout15 * dm[(i0+5)*nao+(l0+0)]; + val += gout16 * dm[(i0+6)*nao+(l0+0)]; + val += gout17 * dm[(i0+7)*nao+(l0+0)]; + val += gout18 * dm[(i0+8)*nao+(l0+0)]; + val += gout19 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+1)*nao+(k0+0), val); + val = 0; + val += gout20 * dm[(i0+0)*nao+(l0+0)]; + val += gout21 * dm[(i0+1)*nao+(l0+0)]; + val += gout22 * dm[(i0+2)*nao+(l0+0)]; + val += gout23 * dm[(i0+3)*nao+(l0+0)]; + val += gout24 * dm[(i0+4)*nao+(l0+0)]; + val += gout25 * dm[(i0+5)*nao+(l0+0)]; + val += gout26 * dm[(i0+6)*nao+(l0+0)]; + val += gout27 * dm[(i0+7)*nao+(l0+0)]; + val += gout28 * dm[(i0+8)*nao+(l0+0)]; + val += gout29 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+2)*nao+(k0+0), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +__global__ +void rys_sr_jk_3100(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_sr_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_sr_jk_3100(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_jk_3200(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double gout3; + double gout4; + double gout5; + double gout6; + double gout7; + double gout8; + double gout9; + double gout10; + double gout11; + double gout12; + double gout13; + double gout14; + double gout15; + double gout16; + double gout17; + double gout18; + double gout19; + double gout20; + double gout21; + double gout22; + double gout23; + double gout24; + double gout25; + double gout26; + double gout27; + double gout28; + double gout29; + double gout30; + double gout31; + double gout32; + double gout33; + double gout34; + double gout35; + double gout36; + double gout37; + double gout38; + double gout39; + double gout40; + double gout41; + double gout42; + double gout43; + double gout44; + double gout45; + double gout46; + double gout47; + double gout48; + double gout49; + double gout50; + double gout51; + double gout52; + double gout53; + double gout54; + double gout55; + double gout56; + double gout57; + double gout58; + double gout59; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + gout3 = 0; + gout4 = 0; + gout5 = 0; + gout6 = 0; + gout7 = 0; + gout8 = 0; + gout9 = 0; + gout10 = 0; + gout11 = 0; + gout12 = 0; + gout13 = 0; + gout14 = 0; + gout15 = 0; + gout16 = 0; + gout17 = 0; + gout18 = 0; + gout19 = 0; + gout20 = 0; + gout21 = 0; + gout22 = 0; + gout23 = 0; + gout24 = 0; + gout25 = 0; + gout26 = 0; + gout27 = 0; + gout28 = 0; + gout29 = 0; + gout30 = 0; + gout31 = 0; + gout32 = 0; + gout33 = 0; + gout34 = 0; + gout35 = 0; + gout36 = 0; + gout37 = 0; + gout38 = 0; + gout39 = 0; + gout40 = 0; + gout41 = 0; + gout42 = 0; + gout43 = 0; + gout44 = 0; + gout45 = 0; + gout46 = 0; + gout47 = 0; + gout48 = 0; + gout49 = 0; + gout50 = 0; + gout51 = 0; + gout52 = 0; + gout53 = 0; + gout54 = 0; + gout55 = 0; + gout56 = 0; + gout57 = 0; + gout58 = 0; + gout59 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(3, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(3, theta_fac*theta_rr, rw); + fac *= sqrt(theta_fac); + for (int irys = 0; irys < 3; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + } + } + if (task_id < ntasks) { + for (int irys = 0; irys < 3; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + double trr_30x = c0x * trr_20x + 2*b10 * trr_10x; + double trr_40x = c0x * trr_30x + 3*b10 * trr_20x; + double trr_50x = c0x * trr_40x + 4*b10 * trr_30x; + double hrr_4100x = trr_50x - xjxi * trr_40x; + double hrr_3100x = trr_40x - xjxi * trr_30x; + double hrr_3200x = hrr_4100x - xjxi * hrr_3100x; + gout0 += hrr_3200x * 1 * wt; + double hrr_2100x = trr_30x - xjxi * trr_20x; + double hrr_2200x = hrr_3100x - xjxi * hrr_2100x; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += hrr_2200x * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += hrr_2200x * 1 * trr_10z; + double hrr_1100x = trr_20x - xjxi * trr_10x; + double hrr_1200x = hrr_2100x - xjxi * hrr_1100x; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + gout3 += hrr_1200x * trr_20y * wt; + gout4 += hrr_1200x * trr_10y * trr_10z; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + gout5 += hrr_1200x * 1 * trr_20z; + double hrr_0100x = trr_10x - xjxi * fac; + double hrr_0200x = hrr_1100x - xjxi * hrr_0100x; + double trr_30y = c0y * trr_20y + 2*b10 * trr_10y; + gout6 += hrr_0200x * trr_30y * wt; + gout7 += hrr_0200x * trr_20y * trr_10z; + gout8 += hrr_0200x * trr_10y * trr_20z; + double trr_30z = c0z * trr_20z + 2*b10 * trr_10z; + gout9 += hrr_0200x * 1 * trr_30z; + double hrr_0100y = trr_10y - yjyi * 1; + gout10 += hrr_3100x * hrr_0100y * wt; + double hrr_1100y = trr_20y - yjyi * trr_10y; + gout11 += hrr_2100x * hrr_1100y * wt; + gout12 += hrr_2100x * hrr_0100y * trr_10z; + double hrr_2100y = trr_30y - yjyi * trr_20y; + gout13 += hrr_1100x * hrr_2100y * wt; + gout14 += hrr_1100x * hrr_1100y * trr_10z; + gout15 += hrr_1100x * hrr_0100y * trr_20z; + double trr_40y = c0y * trr_30y + 3*b10 * trr_20y; + double hrr_3100y = trr_40y - yjyi * trr_30y; + gout16 += hrr_0100x * hrr_3100y * wt; + gout17 += hrr_0100x * hrr_2100y * trr_10z; + gout18 += hrr_0100x * hrr_1100y * trr_20z; + gout19 += hrr_0100x * hrr_0100y * trr_30z; + double hrr_0100z = trr_10z - zjzi * wt; + gout20 += hrr_3100x * 1 * hrr_0100z; + gout21 += hrr_2100x * trr_10y * hrr_0100z; + double hrr_1100z = trr_20z - zjzi * trr_10z; + gout22 += hrr_2100x * 1 * hrr_1100z; + gout23 += hrr_1100x * trr_20y * hrr_0100z; + gout24 += hrr_1100x * trr_10y * hrr_1100z; + double hrr_2100z = trr_30z - zjzi * trr_20z; + gout25 += hrr_1100x * 1 * hrr_2100z; + gout26 += hrr_0100x * trr_30y * hrr_0100z; + gout27 += hrr_0100x * trr_20y * hrr_1100z; + gout28 += hrr_0100x * trr_10y * hrr_2100z; + double trr_40z = c0z * trr_30z + 3*b10 * trr_20z; + double hrr_3100z = trr_40z - zjzi * trr_30z; + gout29 += hrr_0100x * 1 * hrr_3100z; + double hrr_0200y = hrr_1100y - yjyi * hrr_0100y; + gout30 += trr_30x * hrr_0200y * wt; + double hrr_1200y = hrr_2100y - yjyi * hrr_1100y; + gout31 += trr_20x * hrr_1200y * wt; + gout32 += trr_20x * hrr_0200y * trr_10z; + double hrr_2200y = hrr_3100y - yjyi * hrr_2100y; + gout33 += trr_10x * hrr_2200y * wt; + gout34 += trr_10x * hrr_1200y * trr_10z; + gout35 += trr_10x * hrr_0200y * trr_20z; + double trr_50y = c0y * trr_40y + 4*b10 * trr_30y; + double hrr_4100y = trr_50y - yjyi * trr_40y; + double hrr_3200y = hrr_4100y - yjyi * hrr_3100y; + gout36 += fac * hrr_3200y * wt; + gout37 += fac * hrr_2200y * trr_10z; + gout38 += fac * hrr_1200y * trr_20z; + gout39 += fac * hrr_0200y * trr_30z; + gout40 += trr_30x * hrr_0100y * hrr_0100z; + gout41 += trr_20x * hrr_1100y * hrr_0100z; + gout42 += trr_20x * hrr_0100y * hrr_1100z; + gout43 += trr_10x * hrr_2100y * hrr_0100z; + gout44 += trr_10x * hrr_1100y * hrr_1100z; + gout45 += trr_10x * hrr_0100y * hrr_2100z; + gout46 += fac * hrr_3100y * hrr_0100z; + gout47 += fac * hrr_2100y * hrr_1100z; + gout48 += fac * hrr_1100y * hrr_2100z; + gout49 += fac * hrr_0100y * hrr_3100z; + double hrr_0200z = hrr_1100z - zjzi * hrr_0100z; + gout50 += trr_30x * 1 * hrr_0200z; + gout51 += trr_20x * trr_10y * hrr_0200z; + double hrr_1200z = hrr_2100z - zjzi * hrr_1100z; + gout52 += trr_20x * 1 * hrr_1200z; + gout53 += trr_10x * trr_20y * hrr_0200z; + gout54 += trr_10x * trr_10y * hrr_1200z; + double hrr_2200z = hrr_3100z - zjzi * hrr_2100z; + gout55 += trr_10x * 1 * hrr_2200z; + gout56 += fac * trr_30y * hrr_0200z; + gout57 += fac * trr_20y * hrr_1200z; + gout58 += fac * trr_10y * hrr_2200z; + double trr_50z = c0z * trr_40z + 4*b10 * trr_30z; + double hrr_4100z = trr_50z - zjzi * trr_40z; + double hrr_3200z = hrr_4100z - zjzi * hrr_3100z; + gout59 += fac * 1 * hrr_3200z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout10 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+1), val); + val = 0; + val += gout20 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+2), val); + val = 0; + val += gout30 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+3), val); + val = 0; + val += gout40 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+4), val); + val = 0; + val += gout50 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+5), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout11 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+1), val); + val = 0; + val += gout21 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+2), val); + val = 0; + val += gout31 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+3), val); + val = 0; + val += gout41 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+4), val); + val = 0; + val += gout51 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+5), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout12 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+1), val); + val = 0; + val += gout22 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+2), val); + val = 0; + val += gout32 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+3), val); + val = 0; + val += gout42 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+4), val); + val = 0; + val += gout52 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+5), val); + val = 0; + val += gout3 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+0), val); + val = 0; + val += gout13 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+1), val); + val = 0; + val += gout23 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+2), val); + val = 0; + val += gout33 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+3), val); + val = 0; + val += gout43 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+4), val); + val = 0; + val += gout53 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+5), val); + val = 0; + val += gout4 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+0), val); + val = 0; + val += gout14 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+1), val); + val = 0; + val += gout24 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+2), val); + val = 0; + val += gout34 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+3), val); + val = 0; + val += gout44 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+4), val); + val = 0; + val += gout54 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+5), val); + val = 0; + val += gout5 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+0), val); + val = 0; + val += gout15 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+1), val); + val = 0; + val += gout25 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+2), val); + val = 0; + val += gout35 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+3), val); + val = 0; + val += gout45 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+4), val); + val = 0; + val += gout55 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+5), val); + val = 0; + val += gout6 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+6)*nao+(j0+0), val); + val = 0; + val += gout16 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+6)*nao+(j0+1), val); + val = 0; + val += gout26 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+6)*nao+(j0+2), val); + val = 0; + val += gout36 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+6)*nao+(j0+3), val); + val = 0; + val += gout46 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+6)*nao+(j0+4), val); + val = 0; + val += gout56 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+6)*nao+(j0+5), val); + val = 0; + val += gout7 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+7)*nao+(j0+0), val); + val = 0; + val += gout17 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+7)*nao+(j0+1), val); + val = 0; + val += gout27 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+7)*nao+(j0+2), val); + val = 0; + val += gout37 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+7)*nao+(j0+3), val); + val = 0; + val += gout47 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+7)*nao+(j0+4), val); + val = 0; + val += gout57 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+7)*nao+(j0+5), val); + val = 0; + val += gout8 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+8)*nao+(j0+0), val); + val = 0; + val += gout18 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+8)*nao+(j0+1), val); + val = 0; + val += gout28 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+8)*nao+(j0+2), val); + val = 0; + val += gout38 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+8)*nao+(j0+3), val); + val = 0; + val += gout48 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+8)*nao+(j0+4), val); + val = 0; + val += gout58 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+8)*nao+(j0+5), val); + val = 0; + val += gout9 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+9)*nao+(j0+0), val); + val = 0; + val += gout19 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+9)*nao+(j0+1), val); + val = 0; + val += gout29 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+9)*nao+(j0+2), val); + val = 0; + val += gout39 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+9)*nao+(j0+3), val); + val = 0; + val += gout49 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+9)*nao+(j0+4), val); + val = 0; + val += gout59 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+9)*nao+(j0+5), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + val += gout3 * dm[(j0+0)*nao+(i0+3)]; + val += gout4 * dm[(j0+0)*nao+(i0+4)]; + val += gout5 * dm[(j0+0)*nao+(i0+5)]; + val += gout6 * dm[(j0+0)*nao+(i0+6)]; + val += gout7 * dm[(j0+0)*nao+(i0+7)]; + val += gout8 * dm[(j0+0)*nao+(i0+8)]; + val += gout9 * dm[(j0+0)*nao+(i0+9)]; + val += gout10 * dm[(j0+1)*nao+(i0+0)]; + val += gout11 * dm[(j0+1)*nao+(i0+1)]; + val += gout12 * dm[(j0+1)*nao+(i0+2)]; + val += gout13 * dm[(j0+1)*nao+(i0+3)]; + val += gout14 * dm[(j0+1)*nao+(i0+4)]; + val += gout15 * dm[(j0+1)*nao+(i0+5)]; + val += gout16 * dm[(j0+1)*nao+(i0+6)]; + val += gout17 * dm[(j0+1)*nao+(i0+7)]; + val += gout18 * dm[(j0+1)*nao+(i0+8)]; + val += gout19 * dm[(j0+1)*nao+(i0+9)]; + val += gout20 * dm[(j0+2)*nao+(i0+0)]; + val += gout21 * dm[(j0+2)*nao+(i0+1)]; + val += gout22 * dm[(j0+2)*nao+(i0+2)]; + val += gout23 * dm[(j0+2)*nao+(i0+3)]; + val += gout24 * dm[(j0+2)*nao+(i0+4)]; + val += gout25 * dm[(j0+2)*nao+(i0+5)]; + val += gout26 * dm[(j0+2)*nao+(i0+6)]; + val += gout27 * dm[(j0+2)*nao+(i0+7)]; + val += gout28 * dm[(j0+2)*nao+(i0+8)]; + val += gout29 * dm[(j0+2)*nao+(i0+9)]; + val += gout30 * dm[(j0+3)*nao+(i0+0)]; + val += gout31 * dm[(j0+3)*nao+(i0+1)]; + val += gout32 * dm[(j0+3)*nao+(i0+2)]; + val += gout33 * dm[(j0+3)*nao+(i0+3)]; + val += gout34 * dm[(j0+3)*nao+(i0+4)]; + val += gout35 * dm[(j0+3)*nao+(i0+5)]; + val += gout36 * dm[(j0+3)*nao+(i0+6)]; + val += gout37 * dm[(j0+3)*nao+(i0+7)]; + val += gout38 * dm[(j0+3)*nao+(i0+8)]; + val += gout39 * dm[(j0+3)*nao+(i0+9)]; + val += gout40 * dm[(j0+4)*nao+(i0+0)]; + val += gout41 * dm[(j0+4)*nao+(i0+1)]; + val += gout42 * dm[(j0+4)*nao+(i0+2)]; + val += gout43 * dm[(j0+4)*nao+(i0+3)]; + val += gout44 * dm[(j0+4)*nao+(i0+4)]; + val += gout45 * dm[(j0+4)*nao+(i0+5)]; + val += gout46 * dm[(j0+4)*nao+(i0+6)]; + val += gout47 * dm[(j0+4)*nao+(i0+7)]; + val += gout48 * dm[(j0+4)*nao+(i0+8)]; + val += gout49 * dm[(j0+4)*nao+(i0+9)]; + val += gout50 * dm[(j0+5)*nao+(i0+0)]; + val += gout51 * dm[(j0+5)*nao+(i0+1)]; + val += gout52 * dm[(j0+5)*nao+(i0+2)]; + val += gout53 * dm[(j0+5)*nao+(i0+3)]; + val += gout54 * dm[(j0+5)*nao+(i0+4)]; + val += gout55 * dm[(j0+5)*nao+(i0+5)]; + val += gout56 * dm[(j0+5)*nao+(i0+6)]; + val += gout57 * dm[(j0+5)*nao+(i0+7)]; + val += gout58 * dm[(j0+5)*nao+(i0+8)]; + val += gout59 * dm[(j0+5)*nao+(i0+9)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + val += gout10 * dm[(j0+1)*nao+(k0+0)]; + val += gout20 * dm[(j0+2)*nao+(k0+0)]; + val += gout30 * dm[(j0+3)*nao+(k0+0)]; + val += gout40 * dm[(j0+4)*nao+(k0+0)]; + val += gout50 * dm[(j0+5)*nao+(k0+0)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + val += gout11 * dm[(j0+1)*nao+(k0+0)]; + val += gout21 * dm[(j0+2)*nao+(k0+0)]; + val += gout31 * dm[(j0+3)*nao+(k0+0)]; + val += gout41 * dm[(j0+4)*nao+(k0+0)]; + val += gout51 * dm[(j0+5)*nao+(k0+0)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + val += gout12 * dm[(j0+1)*nao+(k0+0)]; + val += gout22 * dm[(j0+2)*nao+(k0+0)]; + val += gout32 * dm[(j0+3)*nao+(k0+0)]; + val += gout42 * dm[(j0+4)*nao+(k0+0)]; + val += gout52 * dm[(j0+5)*nao+(k0+0)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(k0+0)]; + val += gout13 * dm[(j0+1)*nao+(k0+0)]; + val += gout23 * dm[(j0+2)*nao+(k0+0)]; + val += gout33 * dm[(j0+3)*nao+(k0+0)]; + val += gout43 * dm[(j0+4)*nao+(k0+0)]; + val += gout53 * dm[(j0+5)*nao+(k0+0)]; + atomicAdd(vk+(i0+3)*nao+(l0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(k0+0)]; + val += gout14 * dm[(j0+1)*nao+(k0+0)]; + val += gout24 * dm[(j0+2)*nao+(k0+0)]; + val += gout34 * dm[(j0+3)*nao+(k0+0)]; + val += gout44 * dm[(j0+4)*nao+(k0+0)]; + val += gout54 * dm[(j0+5)*nao+(k0+0)]; + atomicAdd(vk+(i0+4)*nao+(l0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(k0+0)]; + val += gout15 * dm[(j0+1)*nao+(k0+0)]; + val += gout25 * dm[(j0+2)*nao+(k0+0)]; + val += gout35 * dm[(j0+3)*nao+(k0+0)]; + val += gout45 * dm[(j0+4)*nao+(k0+0)]; + val += gout55 * dm[(j0+5)*nao+(k0+0)]; + atomicAdd(vk+(i0+5)*nao+(l0+0), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(k0+0)]; + val += gout16 * dm[(j0+1)*nao+(k0+0)]; + val += gout26 * dm[(j0+2)*nao+(k0+0)]; + val += gout36 * dm[(j0+3)*nao+(k0+0)]; + val += gout46 * dm[(j0+4)*nao+(k0+0)]; + val += gout56 * dm[(j0+5)*nao+(k0+0)]; + atomicAdd(vk+(i0+6)*nao+(l0+0), val); + val = 0; + val += gout7 * dm[(j0+0)*nao+(k0+0)]; + val += gout17 * dm[(j0+1)*nao+(k0+0)]; + val += gout27 * dm[(j0+2)*nao+(k0+0)]; + val += gout37 * dm[(j0+3)*nao+(k0+0)]; + val += gout47 * dm[(j0+4)*nao+(k0+0)]; + val += gout57 * dm[(j0+5)*nao+(k0+0)]; + atomicAdd(vk+(i0+7)*nao+(l0+0), val); + val = 0; + val += gout8 * dm[(j0+0)*nao+(k0+0)]; + val += gout18 * dm[(j0+1)*nao+(k0+0)]; + val += gout28 * dm[(j0+2)*nao+(k0+0)]; + val += gout38 * dm[(j0+3)*nao+(k0+0)]; + val += gout48 * dm[(j0+4)*nao+(k0+0)]; + val += gout58 * dm[(j0+5)*nao+(k0+0)]; + atomicAdd(vk+(i0+8)*nao+(l0+0), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(k0+0)]; + val += gout19 * dm[(j0+1)*nao+(k0+0)]; + val += gout29 * dm[(j0+2)*nao+(k0+0)]; + val += gout39 * dm[(j0+3)*nao+(k0+0)]; + val += gout49 * dm[(j0+4)*nao+(k0+0)]; + val += gout59 * dm[(j0+5)*nao+(k0+0)]; + atomicAdd(vk+(i0+9)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + val += gout3 * dm[(i0+3)*nao+(k0+0)]; + val += gout4 * dm[(i0+4)*nao+(k0+0)]; + val += gout5 * dm[(i0+5)*nao+(k0+0)]; + val += gout6 * dm[(i0+6)*nao+(k0+0)]; + val += gout7 * dm[(i0+7)*nao+(k0+0)]; + val += gout8 * dm[(i0+8)*nao+(k0+0)]; + val += gout9 * dm[(i0+9)*nao+(k0+0)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout10 * dm[(i0+0)*nao+(k0+0)]; + val += gout11 * dm[(i0+1)*nao+(k0+0)]; + val += gout12 * dm[(i0+2)*nao+(k0+0)]; + val += gout13 * dm[(i0+3)*nao+(k0+0)]; + val += gout14 * dm[(i0+4)*nao+(k0+0)]; + val += gout15 * dm[(i0+5)*nao+(k0+0)]; + val += gout16 * dm[(i0+6)*nao+(k0+0)]; + val += gout17 * dm[(i0+7)*nao+(k0+0)]; + val += gout18 * dm[(i0+8)*nao+(k0+0)]; + val += gout19 * dm[(i0+9)*nao+(k0+0)]; + atomicAdd(vk+(j0+1)*nao+(l0+0), val); + val = 0; + val += gout20 * dm[(i0+0)*nao+(k0+0)]; + val += gout21 * dm[(i0+1)*nao+(k0+0)]; + val += gout22 * dm[(i0+2)*nao+(k0+0)]; + val += gout23 * dm[(i0+3)*nao+(k0+0)]; + val += gout24 * dm[(i0+4)*nao+(k0+0)]; + val += gout25 * dm[(i0+5)*nao+(k0+0)]; + val += gout26 * dm[(i0+6)*nao+(k0+0)]; + val += gout27 * dm[(i0+7)*nao+(k0+0)]; + val += gout28 * dm[(i0+8)*nao+(k0+0)]; + val += gout29 * dm[(i0+9)*nao+(k0+0)]; + atomicAdd(vk+(j0+2)*nao+(l0+0), val); + val = 0; + val += gout30 * dm[(i0+0)*nao+(k0+0)]; + val += gout31 * dm[(i0+1)*nao+(k0+0)]; + val += gout32 * dm[(i0+2)*nao+(k0+0)]; + val += gout33 * dm[(i0+3)*nao+(k0+0)]; + val += gout34 * dm[(i0+4)*nao+(k0+0)]; + val += gout35 * dm[(i0+5)*nao+(k0+0)]; + val += gout36 * dm[(i0+6)*nao+(k0+0)]; + val += gout37 * dm[(i0+7)*nao+(k0+0)]; + val += gout38 * dm[(i0+8)*nao+(k0+0)]; + val += gout39 * dm[(i0+9)*nao+(k0+0)]; + atomicAdd(vk+(j0+3)*nao+(l0+0), val); + val = 0; + val += gout40 * dm[(i0+0)*nao+(k0+0)]; + val += gout41 * dm[(i0+1)*nao+(k0+0)]; + val += gout42 * dm[(i0+2)*nao+(k0+0)]; + val += gout43 * dm[(i0+3)*nao+(k0+0)]; + val += gout44 * dm[(i0+4)*nao+(k0+0)]; + val += gout45 * dm[(i0+5)*nao+(k0+0)]; + val += gout46 * dm[(i0+6)*nao+(k0+0)]; + val += gout47 * dm[(i0+7)*nao+(k0+0)]; + val += gout48 * dm[(i0+8)*nao+(k0+0)]; + val += gout49 * dm[(i0+9)*nao+(k0+0)]; + atomicAdd(vk+(j0+4)*nao+(l0+0), val); + val = 0; + val += gout50 * dm[(i0+0)*nao+(k0+0)]; + val += gout51 * dm[(i0+1)*nao+(k0+0)]; + val += gout52 * dm[(i0+2)*nao+(k0+0)]; + val += gout53 * dm[(i0+3)*nao+(k0+0)]; + val += gout54 * dm[(i0+4)*nao+(k0+0)]; + val += gout55 * dm[(i0+5)*nao+(k0+0)]; + val += gout56 * dm[(i0+6)*nao+(k0+0)]; + val += gout57 * dm[(i0+7)*nao+(k0+0)]; + val += gout58 * dm[(i0+8)*nao+(k0+0)]; + val += gout59 * dm[(i0+9)*nao+(k0+0)]; + atomicAdd(vk+(j0+5)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + val += gout10 * dm[(j0+1)*nao+(l0+0)]; + val += gout20 * dm[(j0+2)*nao+(l0+0)]; + val += gout30 * dm[(j0+3)*nao+(l0+0)]; + val += gout40 * dm[(j0+4)*nao+(l0+0)]; + val += gout50 * dm[(j0+5)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + val += gout11 * dm[(j0+1)*nao+(l0+0)]; + val += gout21 * dm[(j0+2)*nao+(l0+0)]; + val += gout31 * dm[(j0+3)*nao+(l0+0)]; + val += gout41 * dm[(j0+4)*nao+(l0+0)]; + val += gout51 * dm[(j0+5)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + val += gout12 * dm[(j0+1)*nao+(l0+0)]; + val += gout22 * dm[(j0+2)*nao+(l0+0)]; + val += gout32 * dm[(j0+3)*nao+(l0+0)]; + val += gout42 * dm[(j0+4)*nao+(l0+0)]; + val += gout52 * dm[(j0+5)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(l0+0)]; + val += gout13 * dm[(j0+1)*nao+(l0+0)]; + val += gout23 * dm[(j0+2)*nao+(l0+0)]; + val += gout33 * dm[(j0+3)*nao+(l0+0)]; + val += gout43 * dm[(j0+4)*nao+(l0+0)]; + val += gout53 * dm[(j0+5)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(l0+0)]; + val += gout14 * dm[(j0+1)*nao+(l0+0)]; + val += gout24 * dm[(j0+2)*nao+(l0+0)]; + val += gout34 * dm[(j0+3)*nao+(l0+0)]; + val += gout44 * dm[(j0+4)*nao+(l0+0)]; + val += gout54 * dm[(j0+5)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(l0+0)]; + val += gout15 * dm[(j0+1)*nao+(l0+0)]; + val += gout25 * dm[(j0+2)*nao+(l0+0)]; + val += gout35 * dm[(j0+3)*nao+(l0+0)]; + val += gout45 * dm[(j0+4)*nao+(l0+0)]; + val += gout55 * dm[(j0+5)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+0), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(l0+0)]; + val += gout16 * dm[(j0+1)*nao+(l0+0)]; + val += gout26 * dm[(j0+2)*nao+(l0+0)]; + val += gout36 * dm[(j0+3)*nao+(l0+0)]; + val += gout46 * dm[(j0+4)*nao+(l0+0)]; + val += gout56 * dm[(j0+5)*nao+(l0+0)]; + atomicAdd(vk+(i0+6)*nao+(k0+0), val); + val = 0; + val += gout7 * dm[(j0+0)*nao+(l0+0)]; + val += gout17 * dm[(j0+1)*nao+(l0+0)]; + val += gout27 * dm[(j0+2)*nao+(l0+0)]; + val += gout37 * dm[(j0+3)*nao+(l0+0)]; + val += gout47 * dm[(j0+4)*nao+(l0+0)]; + val += gout57 * dm[(j0+5)*nao+(l0+0)]; + atomicAdd(vk+(i0+7)*nao+(k0+0), val); + val = 0; + val += gout8 * dm[(j0+0)*nao+(l0+0)]; + val += gout18 * dm[(j0+1)*nao+(l0+0)]; + val += gout28 * dm[(j0+2)*nao+(l0+0)]; + val += gout38 * dm[(j0+3)*nao+(l0+0)]; + val += gout48 * dm[(j0+4)*nao+(l0+0)]; + val += gout58 * dm[(j0+5)*nao+(l0+0)]; + atomicAdd(vk+(i0+8)*nao+(k0+0), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(l0+0)]; + val += gout19 * dm[(j0+1)*nao+(l0+0)]; + val += gout29 * dm[(j0+2)*nao+(l0+0)]; + val += gout39 * dm[(j0+3)*nao+(l0+0)]; + val += gout49 * dm[(j0+4)*nao+(l0+0)]; + val += gout59 * dm[(j0+5)*nao+(l0+0)]; + atomicAdd(vk+(i0+9)*nao+(k0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + val += gout3 * dm[(i0+3)*nao+(l0+0)]; + val += gout4 * dm[(i0+4)*nao+(l0+0)]; + val += gout5 * dm[(i0+5)*nao+(l0+0)]; + val += gout6 * dm[(i0+6)*nao+(l0+0)]; + val += gout7 * dm[(i0+7)*nao+(l0+0)]; + val += gout8 * dm[(i0+8)*nao+(l0+0)]; + val += gout9 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + val = 0; + val += gout10 * dm[(i0+0)*nao+(l0+0)]; + val += gout11 * dm[(i0+1)*nao+(l0+0)]; + val += gout12 * dm[(i0+2)*nao+(l0+0)]; + val += gout13 * dm[(i0+3)*nao+(l0+0)]; + val += gout14 * dm[(i0+4)*nao+(l0+0)]; + val += gout15 * dm[(i0+5)*nao+(l0+0)]; + val += gout16 * dm[(i0+6)*nao+(l0+0)]; + val += gout17 * dm[(i0+7)*nao+(l0+0)]; + val += gout18 * dm[(i0+8)*nao+(l0+0)]; + val += gout19 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+1)*nao+(k0+0), val); + val = 0; + val += gout20 * dm[(i0+0)*nao+(l0+0)]; + val += gout21 * dm[(i0+1)*nao+(l0+0)]; + val += gout22 * dm[(i0+2)*nao+(l0+0)]; + val += gout23 * dm[(i0+3)*nao+(l0+0)]; + val += gout24 * dm[(i0+4)*nao+(l0+0)]; + val += gout25 * dm[(i0+5)*nao+(l0+0)]; + val += gout26 * dm[(i0+6)*nao+(l0+0)]; + val += gout27 * dm[(i0+7)*nao+(l0+0)]; + val += gout28 * dm[(i0+8)*nao+(l0+0)]; + val += gout29 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+2)*nao+(k0+0), val); + val = 0; + val += gout30 * dm[(i0+0)*nao+(l0+0)]; + val += gout31 * dm[(i0+1)*nao+(l0+0)]; + val += gout32 * dm[(i0+2)*nao+(l0+0)]; + val += gout33 * dm[(i0+3)*nao+(l0+0)]; + val += gout34 * dm[(i0+4)*nao+(l0+0)]; + val += gout35 * dm[(i0+5)*nao+(l0+0)]; + val += gout36 * dm[(i0+6)*nao+(l0+0)]; + val += gout37 * dm[(i0+7)*nao+(l0+0)]; + val += gout38 * dm[(i0+8)*nao+(l0+0)]; + val += gout39 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+3)*nao+(k0+0), val); + val = 0; + val += gout40 * dm[(i0+0)*nao+(l0+0)]; + val += gout41 * dm[(i0+1)*nao+(l0+0)]; + val += gout42 * dm[(i0+2)*nao+(l0+0)]; + val += gout43 * dm[(i0+3)*nao+(l0+0)]; + val += gout44 * dm[(i0+4)*nao+(l0+0)]; + val += gout45 * dm[(i0+5)*nao+(l0+0)]; + val += gout46 * dm[(i0+6)*nao+(l0+0)]; + val += gout47 * dm[(i0+7)*nao+(l0+0)]; + val += gout48 * dm[(i0+8)*nao+(l0+0)]; + val += gout49 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+4)*nao+(k0+0), val); + val = 0; + val += gout50 * dm[(i0+0)*nao+(l0+0)]; + val += gout51 * dm[(i0+1)*nao+(l0+0)]; + val += gout52 * dm[(i0+2)*nao+(l0+0)]; + val += gout53 * dm[(i0+3)*nao+(l0+0)]; + val += gout54 * dm[(i0+4)*nao+(l0+0)]; + val += gout55 * dm[(i0+5)*nao+(l0+0)]; + val += gout56 * dm[(i0+6)*nao+(l0+0)]; + val += gout57 * dm[(i0+7)*nao+(l0+0)]; + val += gout58 * dm[(i0+8)*nao+(l0+0)]; + val += gout59 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+5)*nao+(k0+0), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +__global__ +void rys_jk_3200(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_jk_3200(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_sr_jk_3200(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int *ao_loc = envs.ao_loc; + int nbas = envs.nbas; + int nao = ao_loc[nbas]; + int *bas = envs.bas; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double gout0; + double gout1; + double gout2; + double gout3; + double gout4; + double gout5; + double gout6; + double gout7; + double gout8; + double gout9; + double gout10; + double gout11; + double gout12; + double gout13; + double gout14; + double gout15; + double gout16; + double gout17; + double gout18; + double gout19; + double gout20; + double gout21; + double gout22; + double gout23; + double gout24; + double gout25; + double gout26; + double gout27; + double gout28; + double gout29; + double gout30; + double gout31; + double gout32; + double gout33; + double gout34; + double gout35; + double gout36; + double gout37; + double gout38; + double gout39; + double gout40; + double gout41; + double gout42; + double gout43; + double gout44; + double gout45; + double gout46; + double gout47; + double gout48; + double gout49; + double gout50; + double gout51; + double gout52; + double gout53; + double gout54; + double gout55; + double gout56; + double gout57; + double gout58; + double gout59; + double val; + double *dm, *vj, *vk; + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int i0 = ao_loc[ish]; + int j0 = ao_loc[jsh]; + int k0 = ao_loc[ksh]; + int l0 = ao_loc[lsh]; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + + gout0 = 0; + gout1 = 0; + gout2 = 0; + gout3 = 0; + gout4 = 0; + gout5 = 0; + gout6 = 0; + gout7 = 0; + gout8 = 0; + gout9 = 0; + gout10 = 0; + gout11 = 0; + gout12 = 0; + gout13 = 0; + gout14 = 0; + gout15 = 0; + gout16 = 0; + gout17 = 0; + gout18 = 0; + gout19 = 0; + gout20 = 0; + gout21 = 0; + gout22 = 0; + gout23 = 0; + gout24 = 0; + gout25 = 0; + gout26 = 0; + gout27 = 0; + gout28 = 0; + gout29 = 0; + gout30 = 0; + gout31 = 0; + gout32 = 0; + gout33 = 0; + gout34 = 0; + gout35 = 0; + gout36 = 0; + gout37 = 0; + gout38 = 0; + gout39 = 0; + gout40 = 0; + gout41 = 0; + gout42 = 0; + gout43 = 0; + gout44 = 0; + gout45 = 0; + gout46 = 0; + gout47 = 0; + gout48 = 0; + gout49 = 0; + gout50 = 0; + gout51 = 0; + gout52 = 0; + gout53 = 0; + gout54 = 0; + gout55 = 0; + gout56 = 0; + gout57 = 0; + gout58 = 0; + gout59 = 0; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + rys_roots(3, theta_rr, rw+6*nsq_per_block); + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(3, theta_fac*theta_rr, rw); + double sqrt_theta_fac = -sqrt(theta_fac); + for (int irys = 0; irys < 3; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + rw[sq_id+(irys*2+1)*nsq_per_block] *= sqrt_theta_fac; + } + if (task_id < ntasks) { + for (int irys = 0; irys < 6; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + double trr_30x = c0x * trr_20x + 2*b10 * trr_10x; + double trr_40x = c0x * trr_30x + 3*b10 * trr_20x; + double trr_50x = c0x * trr_40x + 4*b10 * trr_30x; + double hrr_4100x = trr_50x - xjxi * trr_40x; + double hrr_3100x = trr_40x - xjxi * trr_30x; + double hrr_3200x = hrr_4100x - xjxi * hrr_3100x; + gout0 += hrr_3200x * 1 * wt; + double hrr_2100x = trr_30x - xjxi * trr_20x; + double hrr_2200x = hrr_3100x - xjxi * hrr_2100x; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout1 += hrr_2200x * trr_10y * wt; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout2 += hrr_2200x * 1 * trr_10z; + double hrr_1100x = trr_20x - xjxi * trr_10x; + double hrr_1200x = hrr_2100x - xjxi * hrr_1100x; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + gout3 += hrr_1200x * trr_20y * wt; + gout4 += hrr_1200x * trr_10y * trr_10z; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + gout5 += hrr_1200x * 1 * trr_20z; + double hrr_0100x = trr_10x - xjxi * fac; + double hrr_0200x = hrr_1100x - xjxi * hrr_0100x; + double trr_30y = c0y * trr_20y + 2*b10 * trr_10y; + gout6 += hrr_0200x * trr_30y * wt; + gout7 += hrr_0200x * trr_20y * trr_10z; + gout8 += hrr_0200x * trr_10y * trr_20z; + double trr_30z = c0z * trr_20z + 2*b10 * trr_10z; + gout9 += hrr_0200x * 1 * trr_30z; + double hrr_0100y = trr_10y - yjyi * 1; + gout10 += hrr_3100x * hrr_0100y * wt; + double hrr_1100y = trr_20y - yjyi * trr_10y; + gout11 += hrr_2100x * hrr_1100y * wt; + gout12 += hrr_2100x * hrr_0100y * trr_10z; + double hrr_2100y = trr_30y - yjyi * trr_20y; + gout13 += hrr_1100x * hrr_2100y * wt; + gout14 += hrr_1100x * hrr_1100y * trr_10z; + gout15 += hrr_1100x * hrr_0100y * trr_20z; + double trr_40y = c0y * trr_30y + 3*b10 * trr_20y; + double hrr_3100y = trr_40y - yjyi * trr_30y; + gout16 += hrr_0100x * hrr_3100y * wt; + gout17 += hrr_0100x * hrr_2100y * trr_10z; + gout18 += hrr_0100x * hrr_1100y * trr_20z; + gout19 += hrr_0100x * hrr_0100y * trr_30z; + double hrr_0100z = trr_10z - zjzi * wt; + gout20 += hrr_3100x * 1 * hrr_0100z; + gout21 += hrr_2100x * trr_10y * hrr_0100z; + double hrr_1100z = trr_20z - zjzi * trr_10z; + gout22 += hrr_2100x * 1 * hrr_1100z; + gout23 += hrr_1100x * trr_20y * hrr_0100z; + gout24 += hrr_1100x * trr_10y * hrr_1100z; + double hrr_2100z = trr_30z - zjzi * trr_20z; + gout25 += hrr_1100x * 1 * hrr_2100z; + gout26 += hrr_0100x * trr_30y * hrr_0100z; + gout27 += hrr_0100x * trr_20y * hrr_1100z; + gout28 += hrr_0100x * trr_10y * hrr_2100z; + double trr_40z = c0z * trr_30z + 3*b10 * trr_20z; + double hrr_3100z = trr_40z - zjzi * trr_30z; + gout29 += hrr_0100x * 1 * hrr_3100z; + double hrr_0200y = hrr_1100y - yjyi * hrr_0100y; + gout30 += trr_30x * hrr_0200y * wt; + double hrr_1200y = hrr_2100y - yjyi * hrr_1100y; + gout31 += trr_20x * hrr_1200y * wt; + gout32 += trr_20x * hrr_0200y * trr_10z; + double hrr_2200y = hrr_3100y - yjyi * hrr_2100y; + gout33 += trr_10x * hrr_2200y * wt; + gout34 += trr_10x * hrr_1200y * trr_10z; + gout35 += trr_10x * hrr_0200y * trr_20z; + double trr_50y = c0y * trr_40y + 4*b10 * trr_30y; + double hrr_4100y = trr_50y - yjyi * trr_40y; + double hrr_3200y = hrr_4100y - yjyi * hrr_3100y; + gout36 += fac * hrr_3200y * wt; + gout37 += fac * hrr_2200y * trr_10z; + gout38 += fac * hrr_1200y * trr_20z; + gout39 += fac * hrr_0200y * trr_30z; + gout40 += trr_30x * hrr_0100y * hrr_0100z; + gout41 += trr_20x * hrr_1100y * hrr_0100z; + gout42 += trr_20x * hrr_0100y * hrr_1100z; + gout43 += trr_10x * hrr_2100y * hrr_0100z; + gout44 += trr_10x * hrr_1100y * hrr_1100z; + gout45 += trr_10x * hrr_0100y * hrr_2100z; + gout46 += fac * hrr_3100y * hrr_0100z; + gout47 += fac * hrr_2100y * hrr_1100z; + gout48 += fac * hrr_1100y * hrr_2100z; + gout49 += fac * hrr_0100y * hrr_3100z; + double hrr_0200z = hrr_1100z - zjzi * hrr_0100z; + gout50 += trr_30x * 1 * hrr_0200z; + gout51 += trr_20x * trr_10y * hrr_0200z; + double hrr_1200z = hrr_2100z - zjzi * hrr_1100z; + gout52 += trr_20x * 1 * hrr_1200z; + gout53 += trr_10x * trr_20y * hrr_0200z; + gout54 += trr_10x * trr_10y * hrr_1200z; + double hrr_2200z = hrr_3100z - zjzi * hrr_2100z; + gout55 += trr_10x * 1 * hrr_2200z; + gout56 += fac * trr_30y * hrr_0200z; + gout57 += fac * trr_20y * hrr_1200z; + gout58 += fac * trr_10y * hrr_2200z; + double trr_50z = c0z * trr_40z + 4*b10 * trr_30z; + double hrr_4100z = trr_50z - zjzi * trr_40z; + double hrr_3200z = hrr_4100z - zjzi * hrr_3100z; + gout59 += fac * 1 * hrr_3200z; + } + } + } + } + if (task_id < ntasks) { + dm = jk.dm; + vj = jk.vj; + vk = jk.vk; + int do_j = vj != NULL; + int do_k = vk != NULL; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + if (do_j) { + val = 0; + val += gout0 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+0), val); + val = 0; + val += gout10 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+1), val); + val = 0; + val += gout20 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+2), val); + val = 0; + val += gout30 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+3), val); + val = 0; + val += gout40 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+4), val); + val = 0; + val += gout50 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+0)*nao+(j0+5), val); + val = 0; + val += gout1 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+0), val); + val = 0; + val += gout11 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+1), val); + val = 0; + val += gout21 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+2), val); + val = 0; + val += gout31 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+3), val); + val = 0; + val += gout41 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+4), val); + val = 0; + val += gout51 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+1)*nao+(j0+5), val); + val = 0; + val += gout2 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+0), val); + val = 0; + val += gout12 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+1), val); + val = 0; + val += gout22 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+2), val); + val = 0; + val += gout32 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+3), val); + val = 0; + val += gout42 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+4), val); + val = 0; + val += gout52 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+2)*nao+(j0+5), val); + val = 0; + val += gout3 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+0), val); + val = 0; + val += gout13 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+1), val); + val = 0; + val += gout23 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+2), val); + val = 0; + val += gout33 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+3), val); + val = 0; + val += gout43 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+4), val); + val = 0; + val += gout53 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+3)*nao+(j0+5), val); + val = 0; + val += gout4 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+0), val); + val = 0; + val += gout14 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+1), val); + val = 0; + val += gout24 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+2), val); + val = 0; + val += gout34 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+3), val); + val = 0; + val += gout44 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+4), val); + val = 0; + val += gout54 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+4)*nao+(j0+5), val); + val = 0; + val += gout5 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+0), val); + val = 0; + val += gout15 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+1), val); + val = 0; + val += gout25 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+2), val); + val = 0; + val += gout35 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+3), val); + val = 0; + val += gout45 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+4), val); + val = 0; + val += gout55 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+5)*nao+(j0+5), val); + val = 0; + val += gout6 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+6)*nao+(j0+0), val); + val = 0; + val += gout16 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+6)*nao+(j0+1), val); + val = 0; + val += gout26 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+6)*nao+(j0+2), val); + val = 0; + val += gout36 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+6)*nao+(j0+3), val); + val = 0; + val += gout46 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+6)*nao+(j0+4), val); + val = 0; + val += gout56 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+6)*nao+(j0+5), val); + val = 0; + val += gout7 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+7)*nao+(j0+0), val); + val = 0; + val += gout17 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+7)*nao+(j0+1), val); + val = 0; + val += gout27 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+7)*nao+(j0+2), val); + val = 0; + val += gout37 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+7)*nao+(j0+3), val); + val = 0; + val += gout47 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+7)*nao+(j0+4), val); + val = 0; + val += gout57 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+7)*nao+(j0+5), val); + val = 0; + val += gout8 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+8)*nao+(j0+0), val); + val = 0; + val += gout18 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+8)*nao+(j0+1), val); + val = 0; + val += gout28 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+8)*nao+(j0+2), val); + val = 0; + val += gout38 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+8)*nao+(j0+3), val); + val = 0; + val += gout48 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+8)*nao+(j0+4), val); + val = 0; + val += gout58 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+8)*nao+(j0+5), val); + val = 0; + val += gout9 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+9)*nao+(j0+0), val); + val = 0; + val += gout19 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+9)*nao+(j0+1), val); + val = 0; + val += gout29 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+9)*nao+(j0+2), val); + val = 0; + val += gout39 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+9)*nao+(j0+3), val); + val = 0; + val += gout49 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+9)*nao+(j0+4), val); + val = 0; + val += gout59 * dm[(l0+0)*nao+(k0+0)]; + atomicAdd(vj+(i0+9)*nao+(j0+5), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(i0+0)]; + val += gout1 * dm[(j0+0)*nao+(i0+1)]; + val += gout2 * dm[(j0+0)*nao+(i0+2)]; + val += gout3 * dm[(j0+0)*nao+(i0+3)]; + val += gout4 * dm[(j0+0)*nao+(i0+4)]; + val += gout5 * dm[(j0+0)*nao+(i0+5)]; + val += gout6 * dm[(j0+0)*nao+(i0+6)]; + val += gout7 * dm[(j0+0)*nao+(i0+7)]; + val += gout8 * dm[(j0+0)*nao+(i0+8)]; + val += gout9 * dm[(j0+0)*nao+(i0+9)]; + val += gout10 * dm[(j0+1)*nao+(i0+0)]; + val += gout11 * dm[(j0+1)*nao+(i0+1)]; + val += gout12 * dm[(j0+1)*nao+(i0+2)]; + val += gout13 * dm[(j0+1)*nao+(i0+3)]; + val += gout14 * dm[(j0+1)*nao+(i0+4)]; + val += gout15 * dm[(j0+1)*nao+(i0+5)]; + val += gout16 * dm[(j0+1)*nao+(i0+6)]; + val += gout17 * dm[(j0+1)*nao+(i0+7)]; + val += gout18 * dm[(j0+1)*nao+(i0+8)]; + val += gout19 * dm[(j0+1)*nao+(i0+9)]; + val += gout20 * dm[(j0+2)*nao+(i0+0)]; + val += gout21 * dm[(j0+2)*nao+(i0+1)]; + val += gout22 * dm[(j0+2)*nao+(i0+2)]; + val += gout23 * dm[(j0+2)*nao+(i0+3)]; + val += gout24 * dm[(j0+2)*nao+(i0+4)]; + val += gout25 * dm[(j0+2)*nao+(i0+5)]; + val += gout26 * dm[(j0+2)*nao+(i0+6)]; + val += gout27 * dm[(j0+2)*nao+(i0+7)]; + val += gout28 * dm[(j0+2)*nao+(i0+8)]; + val += gout29 * dm[(j0+2)*nao+(i0+9)]; + val += gout30 * dm[(j0+3)*nao+(i0+0)]; + val += gout31 * dm[(j0+3)*nao+(i0+1)]; + val += gout32 * dm[(j0+3)*nao+(i0+2)]; + val += gout33 * dm[(j0+3)*nao+(i0+3)]; + val += gout34 * dm[(j0+3)*nao+(i0+4)]; + val += gout35 * dm[(j0+3)*nao+(i0+5)]; + val += gout36 * dm[(j0+3)*nao+(i0+6)]; + val += gout37 * dm[(j0+3)*nao+(i0+7)]; + val += gout38 * dm[(j0+3)*nao+(i0+8)]; + val += gout39 * dm[(j0+3)*nao+(i0+9)]; + val += gout40 * dm[(j0+4)*nao+(i0+0)]; + val += gout41 * dm[(j0+4)*nao+(i0+1)]; + val += gout42 * dm[(j0+4)*nao+(i0+2)]; + val += gout43 * dm[(j0+4)*nao+(i0+3)]; + val += gout44 * dm[(j0+4)*nao+(i0+4)]; + val += gout45 * dm[(j0+4)*nao+(i0+5)]; + val += gout46 * dm[(j0+4)*nao+(i0+6)]; + val += gout47 * dm[(j0+4)*nao+(i0+7)]; + val += gout48 * dm[(j0+4)*nao+(i0+8)]; + val += gout49 * dm[(j0+4)*nao+(i0+9)]; + val += gout50 * dm[(j0+5)*nao+(i0+0)]; + val += gout51 * dm[(j0+5)*nao+(i0+1)]; + val += gout52 * dm[(j0+5)*nao+(i0+2)]; + val += gout53 * dm[(j0+5)*nao+(i0+3)]; + val += gout54 * dm[(j0+5)*nao+(i0+4)]; + val += gout55 * dm[(j0+5)*nao+(i0+5)]; + val += gout56 * dm[(j0+5)*nao+(i0+6)]; + val += gout57 * dm[(j0+5)*nao+(i0+7)]; + val += gout58 * dm[(j0+5)*nao+(i0+8)]; + val += gout59 * dm[(j0+5)*nao+(i0+9)]; + atomicAdd(vj+(k0+0)*nao+(l0+0), val); + vj += nao * nao; + } + if (do_k) { + val = 0; + val += gout0 * dm[(j0+0)*nao+(k0+0)]; + val += gout10 * dm[(j0+1)*nao+(k0+0)]; + val += gout20 * dm[(j0+2)*nao+(k0+0)]; + val += gout30 * dm[(j0+3)*nao+(k0+0)]; + val += gout40 * dm[(j0+4)*nao+(k0+0)]; + val += gout50 * dm[(j0+5)*nao+(k0+0)]; + atomicAdd(vk+(i0+0)*nao+(l0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(k0+0)]; + val += gout11 * dm[(j0+1)*nao+(k0+0)]; + val += gout21 * dm[(j0+2)*nao+(k0+0)]; + val += gout31 * dm[(j0+3)*nao+(k0+0)]; + val += gout41 * dm[(j0+4)*nao+(k0+0)]; + val += gout51 * dm[(j0+5)*nao+(k0+0)]; + atomicAdd(vk+(i0+1)*nao+(l0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(k0+0)]; + val += gout12 * dm[(j0+1)*nao+(k0+0)]; + val += gout22 * dm[(j0+2)*nao+(k0+0)]; + val += gout32 * dm[(j0+3)*nao+(k0+0)]; + val += gout42 * dm[(j0+4)*nao+(k0+0)]; + val += gout52 * dm[(j0+5)*nao+(k0+0)]; + atomicAdd(vk+(i0+2)*nao+(l0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(k0+0)]; + val += gout13 * dm[(j0+1)*nao+(k0+0)]; + val += gout23 * dm[(j0+2)*nao+(k0+0)]; + val += gout33 * dm[(j0+3)*nao+(k0+0)]; + val += gout43 * dm[(j0+4)*nao+(k0+0)]; + val += gout53 * dm[(j0+5)*nao+(k0+0)]; + atomicAdd(vk+(i0+3)*nao+(l0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(k0+0)]; + val += gout14 * dm[(j0+1)*nao+(k0+0)]; + val += gout24 * dm[(j0+2)*nao+(k0+0)]; + val += gout34 * dm[(j0+3)*nao+(k0+0)]; + val += gout44 * dm[(j0+4)*nao+(k0+0)]; + val += gout54 * dm[(j0+5)*nao+(k0+0)]; + atomicAdd(vk+(i0+4)*nao+(l0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(k0+0)]; + val += gout15 * dm[(j0+1)*nao+(k0+0)]; + val += gout25 * dm[(j0+2)*nao+(k0+0)]; + val += gout35 * dm[(j0+3)*nao+(k0+0)]; + val += gout45 * dm[(j0+4)*nao+(k0+0)]; + val += gout55 * dm[(j0+5)*nao+(k0+0)]; + atomicAdd(vk+(i0+5)*nao+(l0+0), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(k0+0)]; + val += gout16 * dm[(j0+1)*nao+(k0+0)]; + val += gout26 * dm[(j0+2)*nao+(k0+0)]; + val += gout36 * dm[(j0+3)*nao+(k0+0)]; + val += gout46 * dm[(j0+4)*nao+(k0+0)]; + val += gout56 * dm[(j0+5)*nao+(k0+0)]; + atomicAdd(vk+(i0+6)*nao+(l0+0), val); + val = 0; + val += gout7 * dm[(j0+0)*nao+(k0+0)]; + val += gout17 * dm[(j0+1)*nao+(k0+0)]; + val += gout27 * dm[(j0+2)*nao+(k0+0)]; + val += gout37 * dm[(j0+3)*nao+(k0+0)]; + val += gout47 * dm[(j0+4)*nao+(k0+0)]; + val += gout57 * dm[(j0+5)*nao+(k0+0)]; + atomicAdd(vk+(i0+7)*nao+(l0+0), val); + val = 0; + val += gout8 * dm[(j0+0)*nao+(k0+0)]; + val += gout18 * dm[(j0+1)*nao+(k0+0)]; + val += gout28 * dm[(j0+2)*nao+(k0+0)]; + val += gout38 * dm[(j0+3)*nao+(k0+0)]; + val += gout48 * dm[(j0+4)*nao+(k0+0)]; + val += gout58 * dm[(j0+5)*nao+(k0+0)]; + atomicAdd(vk+(i0+8)*nao+(l0+0), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(k0+0)]; + val += gout19 * dm[(j0+1)*nao+(k0+0)]; + val += gout29 * dm[(j0+2)*nao+(k0+0)]; + val += gout39 * dm[(j0+3)*nao+(k0+0)]; + val += gout49 * dm[(j0+4)*nao+(k0+0)]; + val += gout59 * dm[(j0+5)*nao+(k0+0)]; + atomicAdd(vk+(i0+9)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(k0+0)]; + val += gout1 * dm[(i0+1)*nao+(k0+0)]; + val += gout2 * dm[(i0+2)*nao+(k0+0)]; + val += gout3 * dm[(i0+3)*nao+(k0+0)]; + val += gout4 * dm[(i0+4)*nao+(k0+0)]; + val += gout5 * dm[(i0+5)*nao+(k0+0)]; + val += gout6 * dm[(i0+6)*nao+(k0+0)]; + val += gout7 * dm[(i0+7)*nao+(k0+0)]; + val += gout8 * dm[(i0+8)*nao+(k0+0)]; + val += gout9 * dm[(i0+9)*nao+(k0+0)]; + atomicAdd(vk+(j0+0)*nao+(l0+0), val); + val = 0; + val += gout10 * dm[(i0+0)*nao+(k0+0)]; + val += gout11 * dm[(i0+1)*nao+(k0+0)]; + val += gout12 * dm[(i0+2)*nao+(k0+0)]; + val += gout13 * dm[(i0+3)*nao+(k0+0)]; + val += gout14 * dm[(i0+4)*nao+(k0+0)]; + val += gout15 * dm[(i0+5)*nao+(k0+0)]; + val += gout16 * dm[(i0+6)*nao+(k0+0)]; + val += gout17 * dm[(i0+7)*nao+(k0+0)]; + val += gout18 * dm[(i0+8)*nao+(k0+0)]; + val += gout19 * dm[(i0+9)*nao+(k0+0)]; + atomicAdd(vk+(j0+1)*nao+(l0+0), val); + val = 0; + val += gout20 * dm[(i0+0)*nao+(k0+0)]; + val += gout21 * dm[(i0+1)*nao+(k0+0)]; + val += gout22 * dm[(i0+2)*nao+(k0+0)]; + val += gout23 * dm[(i0+3)*nao+(k0+0)]; + val += gout24 * dm[(i0+4)*nao+(k0+0)]; + val += gout25 * dm[(i0+5)*nao+(k0+0)]; + val += gout26 * dm[(i0+6)*nao+(k0+0)]; + val += gout27 * dm[(i0+7)*nao+(k0+0)]; + val += gout28 * dm[(i0+8)*nao+(k0+0)]; + val += gout29 * dm[(i0+9)*nao+(k0+0)]; + atomicAdd(vk+(j0+2)*nao+(l0+0), val); + val = 0; + val += gout30 * dm[(i0+0)*nao+(k0+0)]; + val += gout31 * dm[(i0+1)*nao+(k0+0)]; + val += gout32 * dm[(i0+2)*nao+(k0+0)]; + val += gout33 * dm[(i0+3)*nao+(k0+0)]; + val += gout34 * dm[(i0+4)*nao+(k0+0)]; + val += gout35 * dm[(i0+5)*nao+(k0+0)]; + val += gout36 * dm[(i0+6)*nao+(k0+0)]; + val += gout37 * dm[(i0+7)*nao+(k0+0)]; + val += gout38 * dm[(i0+8)*nao+(k0+0)]; + val += gout39 * dm[(i0+9)*nao+(k0+0)]; + atomicAdd(vk+(j0+3)*nao+(l0+0), val); + val = 0; + val += gout40 * dm[(i0+0)*nao+(k0+0)]; + val += gout41 * dm[(i0+1)*nao+(k0+0)]; + val += gout42 * dm[(i0+2)*nao+(k0+0)]; + val += gout43 * dm[(i0+3)*nao+(k0+0)]; + val += gout44 * dm[(i0+4)*nao+(k0+0)]; + val += gout45 * dm[(i0+5)*nao+(k0+0)]; + val += gout46 * dm[(i0+6)*nao+(k0+0)]; + val += gout47 * dm[(i0+7)*nao+(k0+0)]; + val += gout48 * dm[(i0+8)*nao+(k0+0)]; + val += gout49 * dm[(i0+9)*nao+(k0+0)]; + atomicAdd(vk+(j0+4)*nao+(l0+0), val); + val = 0; + val += gout50 * dm[(i0+0)*nao+(k0+0)]; + val += gout51 * dm[(i0+1)*nao+(k0+0)]; + val += gout52 * dm[(i0+2)*nao+(k0+0)]; + val += gout53 * dm[(i0+3)*nao+(k0+0)]; + val += gout54 * dm[(i0+4)*nao+(k0+0)]; + val += gout55 * dm[(i0+5)*nao+(k0+0)]; + val += gout56 * dm[(i0+6)*nao+(k0+0)]; + val += gout57 * dm[(i0+7)*nao+(k0+0)]; + val += gout58 * dm[(i0+8)*nao+(k0+0)]; + val += gout59 * dm[(i0+9)*nao+(k0+0)]; + atomicAdd(vk+(j0+5)*nao+(l0+0), val); + val = 0; + val += gout0 * dm[(j0+0)*nao+(l0+0)]; + val += gout10 * dm[(j0+1)*nao+(l0+0)]; + val += gout20 * dm[(j0+2)*nao+(l0+0)]; + val += gout30 * dm[(j0+3)*nao+(l0+0)]; + val += gout40 * dm[(j0+4)*nao+(l0+0)]; + val += gout50 * dm[(j0+5)*nao+(l0+0)]; + atomicAdd(vk+(i0+0)*nao+(k0+0), val); + val = 0; + val += gout1 * dm[(j0+0)*nao+(l0+0)]; + val += gout11 * dm[(j0+1)*nao+(l0+0)]; + val += gout21 * dm[(j0+2)*nao+(l0+0)]; + val += gout31 * dm[(j0+3)*nao+(l0+0)]; + val += gout41 * dm[(j0+4)*nao+(l0+0)]; + val += gout51 * dm[(j0+5)*nao+(l0+0)]; + atomicAdd(vk+(i0+1)*nao+(k0+0), val); + val = 0; + val += gout2 * dm[(j0+0)*nao+(l0+0)]; + val += gout12 * dm[(j0+1)*nao+(l0+0)]; + val += gout22 * dm[(j0+2)*nao+(l0+0)]; + val += gout32 * dm[(j0+3)*nao+(l0+0)]; + val += gout42 * dm[(j0+4)*nao+(l0+0)]; + val += gout52 * dm[(j0+5)*nao+(l0+0)]; + atomicAdd(vk+(i0+2)*nao+(k0+0), val); + val = 0; + val += gout3 * dm[(j0+0)*nao+(l0+0)]; + val += gout13 * dm[(j0+1)*nao+(l0+0)]; + val += gout23 * dm[(j0+2)*nao+(l0+0)]; + val += gout33 * dm[(j0+3)*nao+(l0+0)]; + val += gout43 * dm[(j0+4)*nao+(l0+0)]; + val += gout53 * dm[(j0+5)*nao+(l0+0)]; + atomicAdd(vk+(i0+3)*nao+(k0+0), val); + val = 0; + val += gout4 * dm[(j0+0)*nao+(l0+0)]; + val += gout14 * dm[(j0+1)*nao+(l0+0)]; + val += gout24 * dm[(j0+2)*nao+(l0+0)]; + val += gout34 * dm[(j0+3)*nao+(l0+0)]; + val += gout44 * dm[(j0+4)*nao+(l0+0)]; + val += gout54 * dm[(j0+5)*nao+(l0+0)]; + atomicAdd(vk+(i0+4)*nao+(k0+0), val); + val = 0; + val += gout5 * dm[(j0+0)*nao+(l0+0)]; + val += gout15 * dm[(j0+1)*nao+(l0+0)]; + val += gout25 * dm[(j0+2)*nao+(l0+0)]; + val += gout35 * dm[(j0+3)*nao+(l0+0)]; + val += gout45 * dm[(j0+4)*nao+(l0+0)]; + val += gout55 * dm[(j0+5)*nao+(l0+0)]; + atomicAdd(vk+(i0+5)*nao+(k0+0), val); + val = 0; + val += gout6 * dm[(j0+0)*nao+(l0+0)]; + val += gout16 * dm[(j0+1)*nao+(l0+0)]; + val += gout26 * dm[(j0+2)*nao+(l0+0)]; + val += gout36 * dm[(j0+3)*nao+(l0+0)]; + val += gout46 * dm[(j0+4)*nao+(l0+0)]; + val += gout56 * dm[(j0+5)*nao+(l0+0)]; + atomicAdd(vk+(i0+6)*nao+(k0+0), val); + val = 0; + val += gout7 * dm[(j0+0)*nao+(l0+0)]; + val += gout17 * dm[(j0+1)*nao+(l0+0)]; + val += gout27 * dm[(j0+2)*nao+(l0+0)]; + val += gout37 * dm[(j0+3)*nao+(l0+0)]; + val += gout47 * dm[(j0+4)*nao+(l0+0)]; + val += gout57 * dm[(j0+5)*nao+(l0+0)]; + atomicAdd(vk+(i0+7)*nao+(k0+0), val); + val = 0; + val += gout8 * dm[(j0+0)*nao+(l0+0)]; + val += gout18 * dm[(j0+1)*nao+(l0+0)]; + val += gout28 * dm[(j0+2)*nao+(l0+0)]; + val += gout38 * dm[(j0+3)*nao+(l0+0)]; + val += gout48 * dm[(j0+4)*nao+(l0+0)]; + val += gout58 * dm[(j0+5)*nao+(l0+0)]; + atomicAdd(vk+(i0+8)*nao+(k0+0), val); + val = 0; + val += gout9 * dm[(j0+0)*nao+(l0+0)]; + val += gout19 * dm[(j0+1)*nao+(l0+0)]; + val += gout29 * dm[(j0+2)*nao+(l0+0)]; + val += gout39 * dm[(j0+3)*nao+(l0+0)]; + val += gout49 * dm[(j0+4)*nao+(l0+0)]; + val += gout59 * dm[(j0+5)*nao+(l0+0)]; + atomicAdd(vk+(i0+9)*nao+(k0+0), val); + val = 0; + val += gout0 * dm[(i0+0)*nao+(l0+0)]; + val += gout1 * dm[(i0+1)*nao+(l0+0)]; + val += gout2 * dm[(i0+2)*nao+(l0+0)]; + val += gout3 * dm[(i0+3)*nao+(l0+0)]; + val += gout4 * dm[(i0+4)*nao+(l0+0)]; + val += gout5 * dm[(i0+5)*nao+(l0+0)]; + val += gout6 * dm[(i0+6)*nao+(l0+0)]; + val += gout7 * dm[(i0+7)*nao+(l0+0)]; + val += gout8 * dm[(i0+8)*nao+(l0+0)]; + val += gout9 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+0)*nao+(k0+0), val); + val = 0; + val += gout10 * dm[(i0+0)*nao+(l0+0)]; + val += gout11 * dm[(i0+1)*nao+(l0+0)]; + val += gout12 * dm[(i0+2)*nao+(l0+0)]; + val += gout13 * dm[(i0+3)*nao+(l0+0)]; + val += gout14 * dm[(i0+4)*nao+(l0+0)]; + val += gout15 * dm[(i0+5)*nao+(l0+0)]; + val += gout16 * dm[(i0+6)*nao+(l0+0)]; + val += gout17 * dm[(i0+7)*nao+(l0+0)]; + val += gout18 * dm[(i0+8)*nao+(l0+0)]; + val += gout19 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+1)*nao+(k0+0), val); + val = 0; + val += gout20 * dm[(i0+0)*nao+(l0+0)]; + val += gout21 * dm[(i0+1)*nao+(l0+0)]; + val += gout22 * dm[(i0+2)*nao+(l0+0)]; + val += gout23 * dm[(i0+3)*nao+(l0+0)]; + val += gout24 * dm[(i0+4)*nao+(l0+0)]; + val += gout25 * dm[(i0+5)*nao+(l0+0)]; + val += gout26 * dm[(i0+6)*nao+(l0+0)]; + val += gout27 * dm[(i0+7)*nao+(l0+0)]; + val += gout28 * dm[(i0+8)*nao+(l0+0)]; + val += gout29 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+2)*nao+(k0+0), val); + val = 0; + val += gout30 * dm[(i0+0)*nao+(l0+0)]; + val += gout31 * dm[(i0+1)*nao+(l0+0)]; + val += gout32 * dm[(i0+2)*nao+(l0+0)]; + val += gout33 * dm[(i0+3)*nao+(l0+0)]; + val += gout34 * dm[(i0+4)*nao+(l0+0)]; + val += gout35 * dm[(i0+5)*nao+(l0+0)]; + val += gout36 * dm[(i0+6)*nao+(l0+0)]; + val += gout37 * dm[(i0+7)*nao+(l0+0)]; + val += gout38 * dm[(i0+8)*nao+(l0+0)]; + val += gout39 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+3)*nao+(k0+0), val); + val = 0; + val += gout40 * dm[(i0+0)*nao+(l0+0)]; + val += gout41 * dm[(i0+1)*nao+(l0+0)]; + val += gout42 * dm[(i0+2)*nao+(l0+0)]; + val += gout43 * dm[(i0+3)*nao+(l0+0)]; + val += gout44 * dm[(i0+4)*nao+(l0+0)]; + val += gout45 * dm[(i0+5)*nao+(l0+0)]; + val += gout46 * dm[(i0+6)*nao+(l0+0)]; + val += gout47 * dm[(i0+7)*nao+(l0+0)]; + val += gout48 * dm[(i0+8)*nao+(l0+0)]; + val += gout49 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+4)*nao+(k0+0), val); + val = 0; + val += gout50 * dm[(i0+0)*nao+(l0+0)]; + val += gout51 * dm[(i0+1)*nao+(l0+0)]; + val += gout52 * dm[(i0+2)*nao+(l0+0)]; + val += gout53 * dm[(i0+3)*nao+(l0+0)]; + val += gout54 * dm[(i0+4)*nao+(l0+0)]; + val += gout55 * dm[(i0+5)*nao+(l0+0)]; + val += gout56 * dm[(i0+6)*nao+(l0+0)]; + val += gout57 * dm[(i0+7)*nao+(l0+0)]; + val += gout58 * dm[(i0+8)*nao+(l0+0)]; + val += gout59 * dm[(i0+9)*nao+(l0+0)]; + atomicAdd(vk+(j0+5)*nao+(k0+0), val); + vk += nao * nao; + } + dm += nao * nao; + } + } + } +} +__global__ +void rys_sr_jk_3200(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_sr_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_sr_jk_3200(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +int rys_jk_unrolled(RysIntEnvVars *envs, JKMatrix *jk, BoundsInfo *bounds, + ShellQuartet *pool, uint32_t *batch_head, + int *scheme, int workers, double omega) +{ + int li = bounds->li; + int lj = bounds->lj; + int lk = bounds->lk; + int ll = bounds->ll; + int threads = scheme[0] * scheme[1]; + int nroots = (li + lj + lk + ll) / 2 + 1; + int iprim = bounds->iprim; + int jprim = bounds->jprim; + int ij_prims = iprim * jprim; + int buflen = nroots*2 * threads + ij_prims*TILE2*4; + if (omega < 0) { + buflen += nroots*2 * threads; + } + int ijkl = li*125 + lj*25 + lk*5 + ll; + switch (ijkl) { + case 0: rys_jk_0000<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 125: rys_jk_1000<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 130: rys_jk_1010<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 131: rys_jk_1011<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 150: rys_jk_1100<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 155: rys_jk_1110<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 156: rys_jk_1111<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 250: rys_jk_2000<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 255: rys_jk_2010<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 256: rys_jk_2011<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 260: rys_jk_2020<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 275: rys_jk_2100<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 280: rys_jk_2110<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 300: rys_jk_2200<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 375: rys_jk_3000<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 380: rys_jk_3010<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 385: rys_jk_3020<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 400: rys_jk_3100<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 425: rys_jk_3200<<>>(*envs, *jk, *bounds, pool, batch_head); break; + default: return 0; + } + return 1; +} + +int rys_sr_jk_unrolled(RysIntEnvVars *envs, JKMatrix *jk, BoundsInfo *bounds, + ShellQuartet *pool, uint32_t *batch_head, + int *scheme, int workers, double omega) +{ + int li = bounds->li; + int lj = bounds->lj; + int lk = bounds->lk; + int ll = bounds->ll; + int threads = scheme[0] * scheme[1]; + int nroots = (li + lj + lk + ll) / 2 + 1; + int iprim = bounds->iprim; + int jprim = bounds->jprim; + int ij_prims = iprim * jprim; + int buflen = nroots*2 * threads + ij_prims*TILE2*4; + if (omega < 0) { + buflen += nroots*2 * threads; + } + int ijkl = li*125 + lj*25 + lk*5 + ll; + switch (ijkl) { + case 0: rys_sr_jk_0000<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 125: rys_sr_jk_1000<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 130: rys_sr_jk_1010<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 131: rys_sr_jk_1011<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 150: rys_sr_jk_1100<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 155: rys_sr_jk_1110<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 156: rys_sr_jk_1111<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 250: rys_sr_jk_2000<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 255: rys_sr_jk_2010<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 256: rys_sr_jk_2011<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 260: rys_sr_jk_2020<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 275: rys_sr_jk_2100<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 280: rys_sr_jk_2110<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 300: rys_sr_jk_2200<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 375: rys_sr_jk_3000<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 380: rys_sr_jk_3010<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 385: rys_sr_jk_3020<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 400: rys_sr_jk_3100<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 425: rys_sr_jk_3200<<>>(*envs, *jk, *bounds, pool, batch_head); break; + default: return 0; + } + return 1; +} diff --git a/gpu4pyscf/lib/gvhf-rys/unrolled_rys_j.cu b/gpu4pyscf/lib/gvhf-rys/unrolled_rys_j.cu new file mode 100644 index 00000000..646863e9 --- /dev/null +++ b/gpu4pyscf/lib/gvhf-rys/unrolled_rys_j.cu @@ -0,0 +1,5532 @@ +#include +#include "vhf.cuh" +#include "rys_roots_unrolled.cu" +#include "create_tasks.cu" + + +__device__ static +void _rys_j_0_0(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int nbas = envs.nbas; + int *bas = envs.bas; + int *pair_loc = envs.ao_loc; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int ij_pair0 = pair_loc[ish*nbas+jsh]; + int kl_pair0 = pair_loc[ksh*nbas+lsh]; + double gout_0_0 = 0.; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(1, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(1, theta_fac*theta_rr, rw); + fac *= sqrt(theta_fac); + for (int irys = 0; irys < 1; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + } + } + for (int irys = 0; irys < 1; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + gout_0_0 += fac * 1 * wt; + } + } + } + if (task_id >= ntasks) { + continue; + } + int nao_pairs = pair_loc[nbas*nbas]; + double *vj = jk.vj; + double *dm = jk.dm; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + atomicAdd(vj+ij_pair0+0, gout_0_0*dm[kl_pair0+0]); + atomicAdd(vj+kl_pair0+0, gout_0_0*dm[ij_pair0+0]); + vj += nao_pairs; + dm += nao_pairs; + } + } +} +#if CUDA_VERSION >= 12040 +__global__ __maxnreg__(128) +#else +__global__ +#endif +void rys_j_0_0(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_j_0_0(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_j_1_0(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int nbas = envs.nbas; + int *bas = envs.bas; + int *pair_loc = envs.ao_loc; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int ij_pair0 = pair_loc[ish*nbas+jsh]; + int kl_pair0 = pair_loc[ksh*nbas+lsh]; + double gout_1_0 = 0.; + double gout_2_0 = 0.; + double gout_3_0 = 0.; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(1, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(1, theta_fac*theta_rr, rw); + fac *= sqrt(theta_fac); + for (int irys = 0; irys < 1; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + } + } + for (int irys = 0; irys < 1; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double rt_aij = rt_aa * akl; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout_1_0 += fac * 1 * trr_10z; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout_2_0 += fac * trr_10y * wt; + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + gout_3_0 += trr_10x * 1 * wt; + } + } + } + if (task_id >= ntasks) { + continue; + } + int nao_pairs = pair_loc[nbas*nbas]; + double *vj = jk.vj; + double *dm = jk.dm; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + atomicAdd(vj+ij_pair0+1, gout_1_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+2, gout_2_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+3, gout_3_0*dm[kl_pair0+0]); + atomicAdd(vj+kl_pair0+0, gout_1_0*dm[ij_pair0+1] + gout_2_0*dm[ij_pair0+2] + gout_3_0*dm[ij_pair0+3]); + vj += nao_pairs; + dm += nao_pairs; + } + } +} +#if CUDA_VERSION >= 12040 +__global__ __maxnreg__(128) +#else +__global__ +#endif +void rys_j_1_0(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_j_1_0(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_j_1_1(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int nbas = envs.nbas; + int *bas = envs.bas; + int *pair_loc = envs.ao_loc; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int ij_pair0 = pair_loc[ish*nbas+jsh]; + int kl_pair0 = pair_loc[ksh*nbas+lsh]; + double gout_1_1 = 0.; + double gout_1_2 = 0.; + double gout_1_3 = 0.; + double gout_2_1 = 0.; + double gout_2_2 = 0.; + double gout_2_3 = 0.; + double gout_3_1 = 0.; + double gout_3_2 = 0.; + double gout_3_3 = 0.; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(2, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(2, theta_fac*theta_rr, rw); + fac *= sqrt(theta_fac); + for (int irys = 0; irys < 2; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + } + } + for (int irys = 0; irys < 2; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double b00 = .5 * rt_aa; + double rt_akl = rt_aa * aij; + double cpz = zqc + zpq*rt_akl; + double rt_aij = rt_aa * akl; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + double trr_11z = cpz * trr_10z + 1*b00 * wt; + gout_1_1 += fac * 1 * trr_11z; + double cpy = yqc + ypq*rt_akl; + double trr_01y = cpy * 1; + gout_1_2 += fac * trr_01y * trr_10z; + double cpx = xqc + xpq*rt_akl; + double trr_01x = cpx * fac; + gout_1_3 += trr_01x * 1 * trr_10z; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + double trr_01z = cpz * wt; + gout_2_1 += fac * trr_10y * trr_01z; + double trr_11y = cpy * trr_10y + 1*b00 * 1; + gout_2_2 += fac * trr_11y * wt; + gout_2_3 += trr_01x * trr_10y * wt; + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + gout_3_1 += trr_10x * 1 * trr_01z; + gout_3_2 += trr_10x * trr_01y * wt; + double trr_11x = cpx * trr_10x + 1*b00 * fac; + gout_3_3 += trr_11x * 1 * wt; + } + } + } + if (task_id >= ntasks) { + continue; + } + int nao_pairs = pair_loc[nbas*nbas]; + double *vj = jk.vj; + double *dm = jk.dm; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + atomicAdd(vj+ij_pair0+1, gout_1_1*dm[kl_pair0+1] + gout_1_2*dm[kl_pair0+2] + gout_1_3*dm[kl_pair0+3]); + atomicAdd(vj+ij_pair0+2, gout_2_1*dm[kl_pair0+1] + gout_2_2*dm[kl_pair0+2] + gout_2_3*dm[kl_pair0+3]); + atomicAdd(vj+ij_pair0+3, gout_3_1*dm[kl_pair0+1] + gout_3_2*dm[kl_pair0+2] + gout_3_3*dm[kl_pair0+3]); + atomicAdd(vj+kl_pair0+1, gout_1_1*dm[ij_pair0+1] + gout_2_1*dm[ij_pair0+2] + gout_3_1*dm[ij_pair0+3]); + atomicAdd(vj+kl_pair0+2, gout_1_2*dm[ij_pair0+1] + gout_2_2*dm[ij_pair0+2] + gout_3_2*dm[ij_pair0+3]); + atomicAdd(vj+kl_pair0+3, gout_1_3*dm[ij_pair0+1] + gout_2_3*dm[ij_pair0+2] + gout_3_3*dm[ij_pair0+3]); + vj += nao_pairs; + dm += nao_pairs; + } + } +} +#if CUDA_VERSION >= 12040 +__global__ __maxnreg__(128) +#else +__global__ +#endif +void rys_j_1_1(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_j_1_1(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_j_1_2(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int nbas = envs.nbas; + int *bas = envs.bas; + int *pair_loc = envs.ao_loc; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int ij_pair0 = pair_loc[ish*nbas+jsh]; + int kl_pair0 = pair_loc[ksh*nbas+lsh]; + double gout_1_1 = 0.; + double gout_1_2 = 0.; + double gout_1_3 = 0.; + double gout_1_4 = 0.; + double gout_1_5 = 0.; + double gout_1_6 = 0.; + double gout_1_7 = 0.; + double gout_1_8 = 0.; + double gout_1_9 = 0.; + double gout_2_1 = 0.; + double gout_2_2 = 0.; + double gout_2_3 = 0.; + double gout_2_4 = 0.; + double gout_2_5 = 0.; + double gout_2_6 = 0.; + double gout_2_7 = 0.; + double gout_2_8 = 0.; + double gout_2_9 = 0.; + double gout_3_1 = 0.; + double gout_3_2 = 0.; + double gout_3_3 = 0.; + double gout_3_4 = 0.; + double gout_3_5 = 0.; + double gout_3_6 = 0.; + double gout_3_7 = 0.; + double gout_3_8 = 0.; + double gout_3_9 = 0.; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(2, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(2, theta_fac*theta_rr, rw); + fac *= sqrt(theta_fac); + for (int irys = 0; irys < 2; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + } + } + for (int irys = 0; irys < 2; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double b00 = .5 * rt_aa; + double rt_akl = rt_aa * aij; + double b01 = .5/akl * (1 - rt_akl); + double cpz = zqc + zpq*rt_akl; + double rt_aij = rt_aa * akl; + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + double trr_11z = cpz * trr_10z + 1*b00 * wt; + gout_1_1 += fac * 1 * trr_11z; + double trr_01z = cpz * wt; + double trr_12z = cpz * trr_11z + 1*b01 * trr_10z + 1*b00 * trr_01z; + gout_1_2 += fac * 1 * trr_12z; + double cpy = yqc + ypq*rt_akl; + double trr_01y = cpy * 1; + gout_1_3 += fac * trr_01y * trr_10z; + gout_1_4 += fac * trr_01y * trr_11z; + double trr_02y = cpy * trr_01y + 1*b01 * 1; + gout_1_5 += fac * trr_02y * trr_10z; + double cpx = xqc + xpq*rt_akl; + double trr_01x = cpx * fac; + gout_1_6 += trr_01x * 1 * trr_10z; + gout_1_7 += trr_01x * 1 * trr_11z; + gout_1_8 += trr_01x * trr_01y * trr_10z; + double trr_02x = cpx * trr_01x + 1*b01 * fac; + gout_1_9 += trr_02x * 1 * trr_10z; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout_2_1 += fac * trr_10y * trr_01z; + double trr_02z = cpz * trr_01z + 1*b01 * wt; + gout_2_2 += fac * trr_10y * trr_02z; + double trr_11y = cpy * trr_10y + 1*b00 * 1; + gout_2_3 += fac * trr_11y * wt; + gout_2_4 += fac * trr_11y * trr_01z; + double trr_12y = cpy * trr_11y + 1*b01 * trr_10y + 1*b00 * trr_01y; + gout_2_5 += fac * trr_12y * wt; + gout_2_6 += trr_01x * trr_10y * wt; + gout_2_7 += trr_01x * trr_10y * trr_01z; + gout_2_8 += trr_01x * trr_11y * wt; + gout_2_9 += trr_02x * trr_10y * wt; + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + gout_3_1 += trr_10x * 1 * trr_01z; + gout_3_2 += trr_10x * 1 * trr_02z; + gout_3_3 += trr_10x * trr_01y * wt; + gout_3_4 += trr_10x * trr_01y * trr_01z; + gout_3_5 += trr_10x * trr_02y * wt; + double trr_11x = cpx * trr_10x + 1*b00 * fac; + gout_3_6 += trr_11x * 1 * wt; + gout_3_7 += trr_11x * 1 * trr_01z; + gout_3_8 += trr_11x * trr_01y * wt; + double trr_12x = cpx * trr_11x + 1*b01 * trr_10x + 1*b00 * trr_01x; + gout_3_9 += trr_12x * 1 * wt; + } + } + } + if (task_id >= ntasks) { + continue; + } + int nao_pairs = pair_loc[nbas*nbas]; + double *vj = jk.vj; + double *dm = jk.dm; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + atomicAdd(vj+ij_pair0+1, gout_1_1*dm[kl_pair0+1] + gout_1_2*dm[kl_pair0+2] + gout_1_3*dm[kl_pair0+3] + gout_1_4*dm[kl_pair0+4] + gout_1_5*dm[kl_pair0+5] + gout_1_6*dm[kl_pair0+6] + gout_1_7*dm[kl_pair0+7] + gout_1_8*dm[kl_pair0+8] + gout_1_9*dm[kl_pair0+9]); + atomicAdd(vj+ij_pair0+2, gout_2_1*dm[kl_pair0+1] + gout_2_2*dm[kl_pair0+2] + gout_2_3*dm[kl_pair0+3] + gout_2_4*dm[kl_pair0+4] + gout_2_5*dm[kl_pair0+5] + gout_2_6*dm[kl_pair0+6] + gout_2_7*dm[kl_pair0+7] + gout_2_8*dm[kl_pair0+8] + gout_2_9*dm[kl_pair0+9]); + atomicAdd(vj+ij_pair0+3, gout_3_1*dm[kl_pair0+1] + gout_3_2*dm[kl_pair0+2] + gout_3_3*dm[kl_pair0+3] + gout_3_4*dm[kl_pair0+4] + gout_3_5*dm[kl_pair0+5] + gout_3_6*dm[kl_pair0+6] + gout_3_7*dm[kl_pair0+7] + gout_3_8*dm[kl_pair0+8] + gout_3_9*dm[kl_pair0+9]); + atomicAdd(vj+kl_pair0+1, gout_1_1*dm[ij_pair0+1] + gout_2_1*dm[ij_pair0+2] + gout_3_1*dm[ij_pair0+3]); + atomicAdd(vj+kl_pair0+2, gout_1_2*dm[ij_pair0+1] + gout_2_2*dm[ij_pair0+2] + gout_3_2*dm[ij_pair0+3]); + atomicAdd(vj+kl_pair0+3, gout_1_3*dm[ij_pair0+1] + gout_2_3*dm[ij_pair0+2] + gout_3_3*dm[ij_pair0+3]); + atomicAdd(vj+kl_pair0+4, gout_1_4*dm[ij_pair0+1] + gout_2_4*dm[ij_pair0+2] + gout_3_4*dm[ij_pair0+3]); + atomicAdd(vj+kl_pair0+5, gout_1_5*dm[ij_pair0+1] + gout_2_5*dm[ij_pair0+2] + gout_3_5*dm[ij_pair0+3]); + atomicAdd(vj+kl_pair0+6, gout_1_6*dm[ij_pair0+1] + gout_2_6*dm[ij_pair0+2] + gout_3_6*dm[ij_pair0+3]); + atomicAdd(vj+kl_pair0+7, gout_1_7*dm[ij_pair0+1] + gout_2_7*dm[ij_pair0+2] + gout_3_7*dm[ij_pair0+3]); + atomicAdd(vj+kl_pair0+8, gout_1_8*dm[ij_pair0+1] + gout_2_8*dm[ij_pair0+2] + gout_3_8*dm[ij_pair0+3]); + atomicAdd(vj+kl_pair0+9, gout_1_9*dm[ij_pair0+1] + gout_2_9*dm[ij_pair0+2] + gout_3_9*dm[ij_pair0+3]); + vj += nao_pairs; + dm += nao_pairs; + } + } +} +__global__ +void rys_j_1_2(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_j_1_2(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_j_2_0(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int nbas = envs.nbas; + int *bas = envs.bas; + int *pair_loc = envs.ao_loc; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int ij_pair0 = pair_loc[ish*nbas+jsh]; + int kl_pair0 = pair_loc[ksh*nbas+lsh]; + double gout_1_0 = 0.; + double gout_2_0 = 0.; + double gout_3_0 = 0.; + double gout_4_0 = 0.; + double gout_5_0 = 0.; + double gout_6_0 = 0.; + double gout_7_0 = 0.; + double gout_8_0 = 0.; + double gout_9_0 = 0.; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(2, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(2, theta_fac*theta_rr, rw); + fac *= sqrt(theta_fac); + for (int irys = 0; irys < 2; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + } + } + for (int irys = 0; irys < 2; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + gout_1_0 += fac * 1 * trr_10z; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + gout_2_0 += fac * 1 * trr_20z; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout_3_0 += fac * trr_10y * wt; + gout_4_0 += fac * trr_10y * trr_10z; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + gout_5_0 += fac * trr_20y * wt; + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + gout_6_0 += trr_10x * 1 * wt; + gout_7_0 += trr_10x * 1 * trr_10z; + gout_8_0 += trr_10x * trr_10y * wt; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + gout_9_0 += trr_20x * 1 * wt; + } + } + } + if (task_id >= ntasks) { + continue; + } + int nao_pairs = pair_loc[nbas*nbas]; + double *vj = jk.vj; + double *dm = jk.dm; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + atomicAdd(vj+ij_pair0+1, gout_1_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+2, gout_2_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+3, gout_3_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+4, gout_4_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+5, gout_5_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+6, gout_6_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+7, gout_7_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+8, gout_8_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+9, gout_9_0*dm[kl_pair0+0]); + atomicAdd(vj+kl_pair0+0, gout_1_0*dm[ij_pair0+1] + gout_2_0*dm[ij_pair0+2] + gout_3_0*dm[ij_pair0+3] + gout_4_0*dm[ij_pair0+4] + gout_5_0*dm[ij_pair0+5] + gout_6_0*dm[ij_pair0+6] + gout_7_0*dm[ij_pair0+7] + gout_8_0*dm[ij_pair0+8] + gout_9_0*dm[ij_pair0+9]); + vj += nao_pairs; + dm += nao_pairs; + } + } +} +#if CUDA_VERSION >= 12040 +__global__ __maxnreg__(128) +#else +__global__ +#endif +void rys_j_2_0(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_j_2_0(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_j_2_1(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int nbas = envs.nbas; + int *bas = envs.bas; + int *pair_loc = envs.ao_loc; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int ij_pair0 = pair_loc[ish*nbas+jsh]; + int kl_pair0 = pair_loc[ksh*nbas+lsh]; + double gout_1_1 = 0.; + double gout_1_2 = 0.; + double gout_1_3 = 0.; + double gout_2_1 = 0.; + double gout_2_2 = 0.; + double gout_2_3 = 0.; + double gout_3_1 = 0.; + double gout_3_2 = 0.; + double gout_3_3 = 0.; + double gout_4_1 = 0.; + double gout_4_2 = 0.; + double gout_4_3 = 0.; + double gout_5_1 = 0.; + double gout_5_2 = 0.; + double gout_5_3 = 0.; + double gout_6_1 = 0.; + double gout_6_2 = 0.; + double gout_6_3 = 0.; + double gout_7_1 = 0.; + double gout_7_2 = 0.; + double gout_7_3 = 0.; + double gout_8_1 = 0.; + double gout_8_2 = 0.; + double gout_8_3 = 0.; + double gout_9_1 = 0.; + double gout_9_2 = 0.; + double gout_9_3 = 0.; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(2, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(2, theta_fac*theta_rr, rw); + fac *= sqrt(theta_fac); + for (int irys = 0; irys < 2; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + } + } + for (int irys = 0; irys < 2; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double b00 = .5 * rt_aa; + double rt_akl = rt_aa * aij; + double cpz = zqc + zpq*rt_akl; + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + double trr_11z = cpz * trr_10z + 1*b00 * wt; + gout_1_1 += fac * 1 * trr_11z; + double cpy = yqc + ypq*rt_akl; + double trr_01y = cpy * 1; + gout_1_2 += fac * trr_01y * trr_10z; + double cpx = xqc + xpq*rt_akl; + double trr_01x = cpx * fac; + gout_1_3 += trr_01x * 1 * trr_10z; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + double trr_21z = cpz * trr_20z + 2*b00 * trr_10z; + gout_2_1 += fac * 1 * trr_21z; + gout_2_2 += fac * trr_01y * trr_20z; + gout_2_3 += trr_01x * 1 * trr_20z; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + double trr_01z = cpz * wt; + gout_3_1 += fac * trr_10y * trr_01z; + double trr_11y = cpy * trr_10y + 1*b00 * 1; + gout_3_2 += fac * trr_11y * wt; + gout_3_3 += trr_01x * trr_10y * wt; + gout_4_1 += fac * trr_10y * trr_11z; + gout_4_2 += fac * trr_11y * trr_10z; + gout_4_3 += trr_01x * trr_10y * trr_10z; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + gout_5_1 += fac * trr_20y * trr_01z; + double trr_21y = cpy * trr_20y + 2*b00 * trr_10y; + gout_5_2 += fac * trr_21y * wt; + gout_5_3 += trr_01x * trr_20y * wt; + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + gout_6_1 += trr_10x * 1 * trr_01z; + gout_6_2 += trr_10x * trr_01y * wt; + double trr_11x = cpx * trr_10x + 1*b00 * fac; + gout_6_3 += trr_11x * 1 * wt; + gout_7_1 += trr_10x * 1 * trr_11z; + gout_7_2 += trr_10x * trr_01y * trr_10z; + gout_7_3 += trr_11x * 1 * trr_10z; + gout_8_1 += trr_10x * trr_10y * trr_01z; + gout_8_2 += trr_10x * trr_11y * wt; + gout_8_3 += trr_11x * trr_10y * wt; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + gout_9_1 += trr_20x * 1 * trr_01z; + gout_9_2 += trr_20x * trr_01y * wt; + double trr_21x = cpx * trr_20x + 2*b00 * trr_10x; + gout_9_3 += trr_21x * 1 * wt; + } + } + } + if (task_id >= ntasks) { + continue; + } + int nao_pairs = pair_loc[nbas*nbas]; + double *vj = jk.vj; + double *dm = jk.dm; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + atomicAdd(vj+ij_pair0+1, gout_1_1*dm[kl_pair0+1] + gout_1_2*dm[kl_pair0+2] + gout_1_3*dm[kl_pair0+3]); + atomicAdd(vj+ij_pair0+2, gout_2_1*dm[kl_pair0+1] + gout_2_2*dm[kl_pair0+2] + gout_2_3*dm[kl_pair0+3]); + atomicAdd(vj+ij_pair0+3, gout_3_1*dm[kl_pair0+1] + gout_3_2*dm[kl_pair0+2] + gout_3_3*dm[kl_pair0+3]); + atomicAdd(vj+ij_pair0+4, gout_4_1*dm[kl_pair0+1] + gout_4_2*dm[kl_pair0+2] + gout_4_3*dm[kl_pair0+3]); + atomicAdd(vj+ij_pair0+5, gout_5_1*dm[kl_pair0+1] + gout_5_2*dm[kl_pair0+2] + gout_5_3*dm[kl_pair0+3]); + atomicAdd(vj+ij_pair0+6, gout_6_1*dm[kl_pair0+1] + gout_6_2*dm[kl_pair0+2] + gout_6_3*dm[kl_pair0+3]); + atomicAdd(vj+ij_pair0+7, gout_7_1*dm[kl_pair0+1] + gout_7_2*dm[kl_pair0+2] + gout_7_3*dm[kl_pair0+3]); + atomicAdd(vj+ij_pair0+8, gout_8_1*dm[kl_pair0+1] + gout_8_2*dm[kl_pair0+2] + gout_8_3*dm[kl_pair0+3]); + atomicAdd(vj+ij_pair0+9, gout_9_1*dm[kl_pair0+1] + gout_9_2*dm[kl_pair0+2] + gout_9_3*dm[kl_pair0+3]); + atomicAdd(vj+kl_pair0+1, gout_1_1*dm[ij_pair0+1] + gout_2_1*dm[ij_pair0+2] + gout_3_1*dm[ij_pair0+3] + gout_4_1*dm[ij_pair0+4] + gout_5_1*dm[ij_pair0+5] + gout_6_1*dm[ij_pair0+6] + gout_7_1*dm[ij_pair0+7] + gout_8_1*dm[ij_pair0+8] + gout_9_1*dm[ij_pair0+9]); + atomicAdd(vj+kl_pair0+2, gout_1_2*dm[ij_pair0+1] + gout_2_2*dm[ij_pair0+2] + gout_3_2*dm[ij_pair0+3] + gout_4_2*dm[ij_pair0+4] + gout_5_2*dm[ij_pair0+5] + gout_6_2*dm[ij_pair0+6] + gout_7_2*dm[ij_pair0+7] + gout_8_2*dm[ij_pair0+8] + gout_9_2*dm[ij_pair0+9]); + atomicAdd(vj+kl_pair0+3, gout_1_3*dm[ij_pair0+1] + gout_2_3*dm[ij_pair0+2] + gout_3_3*dm[ij_pair0+3] + gout_4_3*dm[ij_pair0+4] + gout_5_3*dm[ij_pair0+5] + gout_6_3*dm[ij_pair0+6] + gout_7_3*dm[ij_pair0+7] + gout_8_3*dm[ij_pair0+8] + gout_9_3*dm[ij_pair0+9]); + vj += nao_pairs; + dm += nao_pairs; + } + } +} +__global__ +void rys_j_2_1(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_j_2_1(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_j_2_2(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int nbas = envs.nbas; + int *bas = envs.bas; + int *pair_loc = envs.ao_loc; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *dm_ij_cache = Rpa_cicj + iprim*jprim*TILE2*4; + double *rw = dm_ij_cache + 10*TILE2; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double *dm = jk.dm; + for (int n = sq_id; n < 10*TILE2; n += nsq_per_block) { + int m = n / TILE2; + int ij_sh = n % TILE2; + int ish = ish0 + ij_sh / TILE; + int jsh = jsh0 + ij_sh % TILE; + int ij_pair0 = pair_loc[ish*nbas+jsh]; + dm_ij_cache[ij_sh+m*TILE2] = dm[ij_pair0+m]; + } + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int ij_pair0 = pair_loc[ish*nbas+jsh]; + int kl_pair0 = pair_loc[ksh*nbas+lsh]; + double dm_kl_001 = dm[kl_pair0+1]; + double dm_kl_002 = dm[kl_pair0+2]; + double dm_kl_010 = dm[kl_pair0+3]; + double dm_kl_011 = dm[kl_pair0+4]; + double dm_kl_020 = dm[kl_pair0+5]; + double dm_kl_100 = dm[kl_pair0+6]; + double dm_kl_101 = dm[kl_pair0+7]; + double dm_kl_110 = dm[kl_pair0+8]; + double dm_kl_200 = dm[kl_pair0+9]; + double vj_ij_001 = 0; + double vj_ij_002 = 0; + double vj_ij_010 = 0; + double vj_ij_011 = 0; + double vj_ij_020 = 0; + double vj_ij_100 = 0; + double vj_ij_101 = 0; + double vj_ij_110 = 0; + double vj_ij_200 = 0; + double vj_kl_001 = 0; + double vj_kl_002 = 0; + double vj_kl_010 = 0; + double vj_kl_011 = 0; + double vj_kl_020 = 0; + double vj_kl_100 = 0; + double vj_kl_101 = 0; + double vj_kl_110 = 0; + double vj_kl_200 = 0; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(3, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(3, theta_fac*theta_rr, rw); + fac *= sqrt(theta_fac); + for (int irys = 0; irys < 3; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + } + } + for (int irys = 0; irys < 3; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double b00 = .5 * rt_aa; + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + double dot_lij_z_000 = trr_10z * dm_ij_cache[sh_ij+1*TILE2] + trr_20z * dm_ij_cache[sh_ij+2*TILE2]; + double rt_akl = rt_aa * aij; + double b01 = .5/akl * (1 - rt_akl); + double cpz = zqc + zpq*rt_akl; + double trr_11z = cpz * trr_10z + 1*b00 * wt; + double trr_21z = cpz * trr_20z + 2*b00 * trr_10z; + double dot_lij_z_001 = trr_11z * dm_ij_cache[sh_ij+1*TILE2] + trr_21z * dm_ij_cache[sh_ij+2*TILE2]; + double trr_01z = cpz * wt; + double trr_12z = cpz * trr_11z + 1*b01 * trr_10z + 1*b00 * trr_01z; + double trr_22z = cpz * trr_21z + 1*b01 * trr_20z + 2*b00 * trr_11z; + double dot_lij_z_002 = trr_12z * dm_ij_cache[sh_ij+1*TILE2] + trr_22z * dm_ij_cache[sh_ij+2*TILE2]; + double dot_lij_z_010 = wt * dm_ij_cache[sh_ij+3*TILE2] + trr_10z * dm_ij_cache[sh_ij+4*TILE2]; + double dot_lij_z_011 = trr_01z * dm_ij_cache[sh_ij+3*TILE2] + trr_11z * dm_ij_cache[sh_ij+4*TILE2]; + double trr_02z = cpz * trr_01z + 1*b01 * wt; + double dot_lij_z_012 = trr_02z * dm_ij_cache[sh_ij+3*TILE2] + trr_12z * dm_ij_cache[sh_ij+4*TILE2]; + double dot_lij_z_020 = wt * dm_ij_cache[sh_ij+5*TILE2]; + double dot_lij_z_021 = trr_01z * dm_ij_cache[sh_ij+5*TILE2]; + double dot_lij_z_022 = trr_02z * dm_ij_cache[sh_ij+5*TILE2]; + double dot_lij_z_100 = wt * dm_ij_cache[sh_ij+6*TILE2] + trr_10z * dm_ij_cache[sh_ij+7*TILE2]; + double dot_lij_z_101 = trr_01z * dm_ij_cache[sh_ij+6*TILE2] + trr_11z * dm_ij_cache[sh_ij+7*TILE2]; + double dot_lij_z_102 = trr_02z * dm_ij_cache[sh_ij+6*TILE2] + trr_12z * dm_ij_cache[sh_ij+7*TILE2]; + double dot_lij_z_110 = wt * dm_ij_cache[sh_ij+8*TILE2]; + double dot_lij_z_111 = trr_01z * dm_ij_cache[sh_ij+8*TILE2]; + double dot_lij_z_112 = trr_02z * dm_ij_cache[sh_ij+8*TILE2]; + double dot_lij_z_200 = wt * dm_ij_cache[sh_ij+9*TILE2]; + double dot_lij_z_201 = trr_01z * dm_ij_cache[sh_ij+9*TILE2]; + double dot_lij_z_202 = trr_02z * dm_ij_cache[sh_ij+9*TILE2]; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + double dot_lij_y_000 = 1 * dot_lij_z_000 + trr_10y * dot_lij_z_010 + trr_20y * dot_lij_z_020; + double dot_lij_y_001 = 1 * dot_lij_z_001 + trr_10y * dot_lij_z_011 + trr_20y * dot_lij_z_021; + double dot_lij_y_002 = 1 * dot_lij_z_002 + trr_10y * dot_lij_z_012 + trr_20y * dot_lij_z_022; + double cpy = yqc + ypq*rt_akl; + double trr_01y = cpy * 1; + double trr_11y = cpy * trr_10y + 1*b00 * 1; + double trr_21y = cpy * trr_20y + 2*b00 * trr_10y; + double dot_lij_y_010 = trr_01y * dot_lij_z_000 + trr_11y * dot_lij_z_010 + trr_21y * dot_lij_z_020; + double dot_lij_y_011 = trr_01y * dot_lij_z_001 + trr_11y * dot_lij_z_011 + trr_21y * dot_lij_z_021; + double trr_02y = cpy * trr_01y + 1*b01 * 1; + double trr_12y = cpy * trr_11y + 1*b01 * trr_10y + 1*b00 * trr_01y; + double trr_22y = cpy * trr_21y + 1*b01 * trr_20y + 2*b00 * trr_11y; + double dot_lij_y_020 = trr_02y * dot_lij_z_000 + trr_12y * dot_lij_z_010 + trr_22y * dot_lij_z_020; + double dot_lij_y_100 = 1 * dot_lij_z_100 + trr_10y * dot_lij_z_110; + double dot_lij_y_101 = 1 * dot_lij_z_101 + trr_10y * dot_lij_z_111; + double dot_lij_y_102 = 1 * dot_lij_z_102 + trr_10y * dot_lij_z_112; + double dot_lij_y_110 = trr_01y * dot_lij_z_100 + trr_11y * dot_lij_z_110; + double dot_lij_y_111 = trr_01y * dot_lij_z_101 + trr_11y * dot_lij_z_111; + double dot_lij_y_120 = trr_02y * dot_lij_z_100 + trr_12y * dot_lij_z_110; + double dot_lij_y_200 = 1 * dot_lij_z_200; + double dot_lij_y_201 = 1 * dot_lij_z_201; + double dot_lij_y_202 = 1 * dot_lij_z_202; + double dot_lij_y_210 = trr_01y * dot_lij_z_200; + double dot_lij_y_211 = trr_01y * dot_lij_z_201; + double dot_lij_y_220 = trr_02y * dot_lij_z_200; + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + vj_kl_001 += fac * dot_lij_y_001 + trr_10x * dot_lij_y_101 + trr_20x * dot_lij_y_201; + vj_kl_002 += fac * dot_lij_y_002 + trr_10x * dot_lij_y_102 + trr_20x * dot_lij_y_202; + vj_kl_010 += fac * dot_lij_y_010 + trr_10x * dot_lij_y_110 + trr_20x * dot_lij_y_210; + vj_kl_011 += fac * dot_lij_y_011 + trr_10x * dot_lij_y_111 + trr_20x * dot_lij_y_211; + vj_kl_020 += fac * dot_lij_y_020 + trr_10x * dot_lij_y_120 + trr_20x * dot_lij_y_220; + double cpx = xqc + xpq*rt_akl; + double trr_01x = cpx * fac; + double trr_11x = cpx * trr_10x + 1*b00 * fac; + double trr_21x = cpx * trr_20x + 2*b00 * trr_10x; + vj_kl_100 += trr_01x * dot_lij_y_000 + trr_11x * dot_lij_y_100 + trr_21x * dot_lij_y_200; + vj_kl_101 += trr_01x * dot_lij_y_001 + trr_11x * dot_lij_y_101 + trr_21x * dot_lij_y_201; + vj_kl_110 += trr_01x * dot_lij_y_010 + trr_11x * dot_lij_y_110 + trr_21x * dot_lij_y_210; + double trr_02x = cpx * trr_01x + 1*b01 * fac; + double trr_12x = cpx * trr_11x + 1*b01 * trr_10x + 1*b00 * trr_01x; + double trr_22x = cpx * trr_21x + 1*b01 * trr_20x + 2*b00 * trr_11x; + vj_kl_200 += trr_02x * dot_lij_y_000 + trr_12x * dot_lij_y_100 + trr_22x * dot_lij_y_200; + double dot_lkl_z_000 = trr_01z * dm_kl_001 + trr_02z * dm_kl_002; + double dot_lkl_z_001 = trr_11z * dm_kl_001 + trr_12z * dm_kl_002; + double dot_lkl_z_002 = trr_21z * dm_kl_001 + trr_22z * dm_kl_002; + double dot_lkl_z_010 = wt * dm_kl_010 + trr_01z * dm_kl_011; + double dot_lkl_z_011 = trr_10z * dm_kl_010 + trr_11z * dm_kl_011; + double dot_lkl_z_012 = trr_20z * dm_kl_010 + trr_21z * dm_kl_011; + double dot_lkl_z_020 = wt * dm_kl_020; + double dot_lkl_z_021 = trr_10z * dm_kl_020; + double dot_lkl_z_022 = trr_20z * dm_kl_020; + double dot_lkl_z_100 = wt * dm_kl_100 + trr_01z * dm_kl_101; + double dot_lkl_z_101 = trr_10z * dm_kl_100 + trr_11z * dm_kl_101; + double dot_lkl_z_102 = trr_20z * dm_kl_100 + trr_21z * dm_kl_101; + double dot_lkl_z_110 = wt * dm_kl_110; + double dot_lkl_z_111 = trr_10z * dm_kl_110; + double dot_lkl_z_112 = trr_20z * dm_kl_110; + double dot_lkl_z_200 = wt * dm_kl_200; + double dot_lkl_z_201 = trr_10z * dm_kl_200; + double dot_lkl_z_202 = trr_20z * dm_kl_200; + double dot_lkl_y_000 = 1 * dot_lkl_z_000 + trr_01y * dot_lkl_z_010 + trr_02y * dot_lkl_z_020; + double dot_lkl_y_001 = 1 * dot_lkl_z_001 + trr_01y * dot_lkl_z_011 + trr_02y * dot_lkl_z_021; + double dot_lkl_y_002 = 1 * dot_lkl_z_002 + trr_01y * dot_lkl_z_012 + trr_02y * dot_lkl_z_022; + double dot_lkl_y_010 = trr_10y * dot_lkl_z_000 + trr_11y * dot_lkl_z_010 + trr_12y * dot_lkl_z_020; + double dot_lkl_y_011 = trr_10y * dot_lkl_z_001 + trr_11y * dot_lkl_z_011 + trr_12y * dot_lkl_z_021; + double dot_lkl_y_020 = trr_20y * dot_lkl_z_000 + trr_21y * dot_lkl_z_010 + trr_22y * dot_lkl_z_020; + double dot_lkl_y_100 = 1 * dot_lkl_z_100 + trr_01y * dot_lkl_z_110; + double dot_lkl_y_101 = 1 * dot_lkl_z_101 + trr_01y * dot_lkl_z_111; + double dot_lkl_y_102 = 1 * dot_lkl_z_102 + trr_01y * dot_lkl_z_112; + double dot_lkl_y_110 = trr_10y * dot_lkl_z_100 + trr_11y * dot_lkl_z_110; + double dot_lkl_y_111 = trr_10y * dot_lkl_z_101 + trr_11y * dot_lkl_z_111; + double dot_lkl_y_120 = trr_20y * dot_lkl_z_100 + trr_21y * dot_lkl_z_110; + double dot_lkl_y_200 = 1 * dot_lkl_z_200; + double dot_lkl_y_201 = 1 * dot_lkl_z_201; + double dot_lkl_y_202 = 1 * dot_lkl_z_202; + double dot_lkl_y_210 = trr_10y * dot_lkl_z_200; + double dot_lkl_y_211 = trr_10y * dot_lkl_z_201; + double dot_lkl_y_220 = trr_20y * dot_lkl_z_200; + vj_ij_001 += fac * dot_lkl_y_001 + trr_01x * dot_lkl_y_101 + trr_02x * dot_lkl_y_201; + vj_ij_002 += fac * dot_lkl_y_002 + trr_01x * dot_lkl_y_102 + trr_02x * dot_lkl_y_202; + vj_ij_010 += fac * dot_lkl_y_010 + trr_01x * dot_lkl_y_110 + trr_02x * dot_lkl_y_210; + vj_ij_011 += fac * dot_lkl_y_011 + trr_01x * dot_lkl_y_111 + trr_02x * dot_lkl_y_211; + vj_ij_020 += fac * dot_lkl_y_020 + trr_01x * dot_lkl_y_120 + trr_02x * dot_lkl_y_220; + vj_ij_100 += trr_10x * dot_lkl_y_000 + trr_11x * dot_lkl_y_100 + trr_12x * dot_lkl_y_200; + vj_ij_101 += trr_10x * dot_lkl_y_001 + trr_11x * dot_lkl_y_101 + trr_12x * dot_lkl_y_201; + vj_ij_110 += trr_10x * dot_lkl_y_010 + trr_11x * dot_lkl_y_110 + trr_12x * dot_lkl_y_210; + vj_ij_200 += trr_20x * dot_lkl_y_000 + trr_21x * dot_lkl_y_100 + trr_22x * dot_lkl_y_200; + } + } + } + if (task_id >= ntasks) { + continue; + } + double *vj = jk.vj; + atomicAdd(vj+ij_pair0+1, vj_ij_001); + atomicAdd(vj+ij_pair0+2, vj_ij_002); + atomicAdd(vj+ij_pair0+3, vj_ij_010); + atomicAdd(vj+ij_pair0+4, vj_ij_011); + atomicAdd(vj+ij_pair0+5, vj_ij_020); + atomicAdd(vj+ij_pair0+6, vj_ij_100); + atomicAdd(vj+ij_pair0+7, vj_ij_101); + atomicAdd(vj+ij_pair0+8, vj_ij_110); + atomicAdd(vj+ij_pair0+9, vj_ij_200); + atomicAdd(vj+kl_pair0+1, vj_kl_001); + atomicAdd(vj+kl_pair0+2, vj_kl_002); + atomicAdd(vj+kl_pair0+3, vj_kl_010); + atomicAdd(vj+kl_pair0+4, vj_kl_011); + atomicAdd(vj+kl_pair0+5, vj_kl_020); + atomicAdd(vj+kl_pair0+6, vj_kl_100); + atomicAdd(vj+kl_pair0+7, vj_kl_101); + atomicAdd(vj+kl_pair0+8, vj_kl_110); + atomicAdd(vj+kl_pair0+9, vj_kl_200); + } +} +__global__ +void rys_j_2_2(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_j_2_2(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_j_2_3(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int nbas = envs.nbas; + int *bas = envs.bas; + int *pair_loc = envs.ao_loc; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *dm_ij_cache = Rpa_cicj + iprim*jprim*TILE2*4; + double *rw = dm_ij_cache + 10*TILE2; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double *dm = jk.dm; + for (int n = sq_id; n < 10*TILE2; n += nsq_per_block) { + int m = n / TILE2; + int ij_sh = n % TILE2; + int ish = ish0 + ij_sh / TILE; + int jsh = jsh0 + ij_sh % TILE; + int ij_pair0 = pair_loc[ish*nbas+jsh]; + dm_ij_cache[ij_sh+m*TILE2] = dm[ij_pair0+m]; + } + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int ij_pair0 = pair_loc[ish*nbas+jsh]; + int kl_pair0 = pair_loc[ksh*nbas+lsh]; + double dm_kl_002 = dm[kl_pair0+2]; + double dm_kl_003 = dm[kl_pair0+3]; + double dm_kl_011 = dm[kl_pair0+5]; + double dm_kl_012 = dm[kl_pair0+6]; + double dm_kl_020 = dm[kl_pair0+7]; + double dm_kl_021 = dm[kl_pair0+8]; + double dm_kl_030 = dm[kl_pair0+9]; + double dm_kl_101 = dm[kl_pair0+11]; + double dm_kl_102 = dm[kl_pair0+12]; + double dm_kl_110 = dm[kl_pair0+13]; + double dm_kl_111 = dm[kl_pair0+14]; + double dm_kl_120 = dm[kl_pair0+15]; + double dm_kl_200 = dm[kl_pair0+16]; + double dm_kl_201 = dm[kl_pair0+17]; + double dm_kl_210 = dm[kl_pair0+18]; + double dm_kl_300 = dm[kl_pair0+19]; + double vj_ij_001 = 0; + double vj_ij_002 = 0; + double vj_ij_010 = 0; + double vj_ij_011 = 0; + double vj_ij_020 = 0; + double vj_ij_100 = 0; + double vj_ij_101 = 0; + double vj_ij_110 = 0; + double vj_ij_200 = 0; + double vj_kl_002 = 0; + double vj_kl_003 = 0; + double vj_kl_011 = 0; + double vj_kl_012 = 0; + double vj_kl_020 = 0; + double vj_kl_021 = 0; + double vj_kl_030 = 0; + double vj_kl_101 = 0; + double vj_kl_102 = 0; + double vj_kl_110 = 0; + double vj_kl_111 = 0; + double vj_kl_120 = 0; + double vj_kl_200 = 0; + double vj_kl_201 = 0; + double vj_kl_210 = 0; + double vj_kl_300 = 0; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(3, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(3, theta_fac*theta_rr, rw); + fac *= sqrt(theta_fac); + for (int irys = 0; irys < 3; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + } + } + for (int irys = 0; irys < 3; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double b00 = .5 * rt_aa; + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + double dot_lij_z_000 = trr_10z * dm_ij_cache[sh_ij+1*TILE2] + trr_20z * dm_ij_cache[sh_ij+2*TILE2]; + double rt_akl = rt_aa * aij; + double b01 = .5/akl * (1 - rt_akl); + double cpz = zqc + zpq*rt_akl; + double trr_11z = cpz * trr_10z + 1*b00 * wt; + double trr_21z = cpz * trr_20z + 2*b00 * trr_10z; + double dot_lij_z_001 = trr_11z * dm_ij_cache[sh_ij+1*TILE2] + trr_21z * dm_ij_cache[sh_ij+2*TILE2]; + double trr_01z = cpz * wt; + double trr_12z = cpz * trr_11z + 1*b01 * trr_10z + 1*b00 * trr_01z; + double trr_22z = cpz * trr_21z + 1*b01 * trr_20z + 2*b00 * trr_11z; + double dot_lij_z_002 = trr_12z * dm_ij_cache[sh_ij+1*TILE2] + trr_22z * dm_ij_cache[sh_ij+2*TILE2]; + double trr_02z = cpz * trr_01z + 1*b01 * wt; + double trr_13z = cpz * trr_12z + 2*b01 * trr_11z + 1*b00 * trr_02z; + double trr_23z = cpz * trr_22z + 2*b01 * trr_21z + 2*b00 * trr_12z; + double dot_lij_z_003 = trr_13z * dm_ij_cache[sh_ij+1*TILE2] + trr_23z * dm_ij_cache[sh_ij+2*TILE2]; + double dot_lij_z_010 = wt * dm_ij_cache[sh_ij+3*TILE2] + trr_10z * dm_ij_cache[sh_ij+4*TILE2]; + double dot_lij_z_011 = trr_01z * dm_ij_cache[sh_ij+3*TILE2] + trr_11z * dm_ij_cache[sh_ij+4*TILE2]; + double dot_lij_z_012 = trr_02z * dm_ij_cache[sh_ij+3*TILE2] + trr_12z * dm_ij_cache[sh_ij+4*TILE2]; + double trr_03z = cpz * trr_02z + 2*b01 * trr_01z; + double dot_lij_z_013 = trr_03z * dm_ij_cache[sh_ij+3*TILE2] + trr_13z * dm_ij_cache[sh_ij+4*TILE2]; + double dot_lij_z_020 = wt * dm_ij_cache[sh_ij+5*TILE2]; + double dot_lij_z_021 = trr_01z * dm_ij_cache[sh_ij+5*TILE2]; + double dot_lij_z_022 = trr_02z * dm_ij_cache[sh_ij+5*TILE2]; + double dot_lij_z_023 = trr_03z * dm_ij_cache[sh_ij+5*TILE2]; + double dot_lij_z_100 = wt * dm_ij_cache[sh_ij+6*TILE2] + trr_10z * dm_ij_cache[sh_ij+7*TILE2]; + double dot_lij_z_101 = trr_01z * dm_ij_cache[sh_ij+6*TILE2] + trr_11z * dm_ij_cache[sh_ij+7*TILE2]; + double dot_lij_z_102 = trr_02z * dm_ij_cache[sh_ij+6*TILE2] + trr_12z * dm_ij_cache[sh_ij+7*TILE2]; + double dot_lij_z_103 = trr_03z * dm_ij_cache[sh_ij+6*TILE2] + trr_13z * dm_ij_cache[sh_ij+7*TILE2]; + double dot_lij_z_110 = wt * dm_ij_cache[sh_ij+8*TILE2]; + double dot_lij_z_111 = trr_01z * dm_ij_cache[sh_ij+8*TILE2]; + double dot_lij_z_112 = trr_02z * dm_ij_cache[sh_ij+8*TILE2]; + double dot_lij_z_113 = trr_03z * dm_ij_cache[sh_ij+8*TILE2]; + double dot_lij_z_200 = wt * dm_ij_cache[sh_ij+9*TILE2]; + double dot_lij_z_201 = trr_01z * dm_ij_cache[sh_ij+9*TILE2]; + double dot_lij_z_202 = trr_02z * dm_ij_cache[sh_ij+9*TILE2]; + double dot_lij_z_203 = trr_03z * dm_ij_cache[sh_ij+9*TILE2]; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + double dot_lij_y_000 = 1 * dot_lij_z_000 + trr_10y * dot_lij_z_010 + trr_20y * dot_lij_z_020; + double dot_lij_y_001 = 1 * dot_lij_z_001 + trr_10y * dot_lij_z_011 + trr_20y * dot_lij_z_021; + double dot_lij_y_002 = 1 * dot_lij_z_002 + trr_10y * dot_lij_z_012 + trr_20y * dot_lij_z_022; + double dot_lij_y_003 = 1 * dot_lij_z_003 + trr_10y * dot_lij_z_013 + trr_20y * dot_lij_z_023; + double cpy = yqc + ypq*rt_akl; + double trr_01y = cpy * 1; + double trr_11y = cpy * trr_10y + 1*b00 * 1; + double trr_21y = cpy * trr_20y + 2*b00 * trr_10y; + double dot_lij_y_010 = trr_01y * dot_lij_z_000 + trr_11y * dot_lij_z_010 + trr_21y * dot_lij_z_020; + double dot_lij_y_011 = trr_01y * dot_lij_z_001 + trr_11y * dot_lij_z_011 + trr_21y * dot_lij_z_021; + double dot_lij_y_012 = trr_01y * dot_lij_z_002 + trr_11y * dot_lij_z_012 + trr_21y * dot_lij_z_022; + double trr_02y = cpy * trr_01y + 1*b01 * 1; + double trr_12y = cpy * trr_11y + 1*b01 * trr_10y + 1*b00 * trr_01y; + double trr_22y = cpy * trr_21y + 1*b01 * trr_20y + 2*b00 * trr_11y; + double dot_lij_y_020 = trr_02y * dot_lij_z_000 + trr_12y * dot_lij_z_010 + trr_22y * dot_lij_z_020; + double dot_lij_y_021 = trr_02y * dot_lij_z_001 + trr_12y * dot_lij_z_011 + trr_22y * dot_lij_z_021; + double trr_03y = cpy * trr_02y + 2*b01 * trr_01y; + double trr_13y = cpy * trr_12y + 2*b01 * trr_11y + 1*b00 * trr_02y; + double trr_23y = cpy * trr_22y + 2*b01 * trr_21y + 2*b00 * trr_12y; + double dot_lij_y_030 = trr_03y * dot_lij_z_000 + trr_13y * dot_lij_z_010 + trr_23y * dot_lij_z_020; + double dot_lij_y_100 = 1 * dot_lij_z_100 + trr_10y * dot_lij_z_110; + double dot_lij_y_101 = 1 * dot_lij_z_101 + trr_10y * dot_lij_z_111; + double dot_lij_y_102 = 1 * dot_lij_z_102 + trr_10y * dot_lij_z_112; + double dot_lij_y_103 = 1 * dot_lij_z_103 + trr_10y * dot_lij_z_113; + double dot_lij_y_110 = trr_01y * dot_lij_z_100 + trr_11y * dot_lij_z_110; + double dot_lij_y_111 = trr_01y * dot_lij_z_101 + trr_11y * dot_lij_z_111; + double dot_lij_y_112 = trr_01y * dot_lij_z_102 + trr_11y * dot_lij_z_112; + double dot_lij_y_120 = trr_02y * dot_lij_z_100 + trr_12y * dot_lij_z_110; + double dot_lij_y_121 = trr_02y * dot_lij_z_101 + trr_12y * dot_lij_z_111; + double dot_lij_y_130 = trr_03y * dot_lij_z_100 + trr_13y * dot_lij_z_110; + double dot_lij_y_200 = 1 * dot_lij_z_200; + double dot_lij_y_201 = 1 * dot_lij_z_201; + double dot_lij_y_202 = 1 * dot_lij_z_202; + double dot_lij_y_203 = 1 * dot_lij_z_203; + double dot_lij_y_210 = trr_01y * dot_lij_z_200; + double dot_lij_y_211 = trr_01y * dot_lij_z_201; + double dot_lij_y_212 = trr_01y * dot_lij_z_202; + double dot_lij_y_220 = trr_02y * dot_lij_z_200; + double dot_lij_y_221 = trr_02y * dot_lij_z_201; + double dot_lij_y_230 = trr_03y * dot_lij_z_200; + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + vj_kl_002 += fac * dot_lij_y_002 + trr_10x * dot_lij_y_102 + trr_20x * dot_lij_y_202; + vj_kl_003 += fac * dot_lij_y_003 + trr_10x * dot_lij_y_103 + trr_20x * dot_lij_y_203; + vj_kl_011 += fac * dot_lij_y_011 + trr_10x * dot_lij_y_111 + trr_20x * dot_lij_y_211; + vj_kl_012 += fac * dot_lij_y_012 + trr_10x * dot_lij_y_112 + trr_20x * dot_lij_y_212; + vj_kl_020 += fac * dot_lij_y_020 + trr_10x * dot_lij_y_120 + trr_20x * dot_lij_y_220; + vj_kl_021 += fac * dot_lij_y_021 + trr_10x * dot_lij_y_121 + trr_20x * dot_lij_y_221; + vj_kl_030 += fac * dot_lij_y_030 + trr_10x * dot_lij_y_130 + trr_20x * dot_lij_y_230; + double cpx = xqc + xpq*rt_akl; + double trr_01x = cpx * fac; + double trr_11x = cpx * trr_10x + 1*b00 * fac; + double trr_21x = cpx * trr_20x + 2*b00 * trr_10x; + vj_kl_101 += trr_01x * dot_lij_y_001 + trr_11x * dot_lij_y_101 + trr_21x * dot_lij_y_201; + vj_kl_102 += trr_01x * dot_lij_y_002 + trr_11x * dot_lij_y_102 + trr_21x * dot_lij_y_202; + vj_kl_110 += trr_01x * dot_lij_y_010 + trr_11x * dot_lij_y_110 + trr_21x * dot_lij_y_210; + vj_kl_111 += trr_01x * dot_lij_y_011 + trr_11x * dot_lij_y_111 + trr_21x * dot_lij_y_211; + vj_kl_120 += trr_01x * dot_lij_y_020 + trr_11x * dot_lij_y_120 + trr_21x * dot_lij_y_220; + double trr_02x = cpx * trr_01x + 1*b01 * fac; + double trr_12x = cpx * trr_11x + 1*b01 * trr_10x + 1*b00 * trr_01x; + double trr_22x = cpx * trr_21x + 1*b01 * trr_20x + 2*b00 * trr_11x; + vj_kl_200 += trr_02x * dot_lij_y_000 + trr_12x * dot_lij_y_100 + trr_22x * dot_lij_y_200; + vj_kl_201 += trr_02x * dot_lij_y_001 + trr_12x * dot_lij_y_101 + trr_22x * dot_lij_y_201; + vj_kl_210 += trr_02x * dot_lij_y_010 + trr_12x * dot_lij_y_110 + trr_22x * dot_lij_y_210; + double trr_03x = cpx * trr_02x + 2*b01 * trr_01x; + double trr_13x = cpx * trr_12x + 2*b01 * trr_11x + 1*b00 * trr_02x; + double trr_23x = cpx * trr_22x + 2*b01 * trr_21x + 2*b00 * trr_12x; + vj_kl_300 += trr_03x * dot_lij_y_000 + trr_13x * dot_lij_y_100 + trr_23x * dot_lij_y_200; + double dot_lkl_z_000 = trr_02z * dm_kl_002 + trr_03z * dm_kl_003; + double dot_lkl_z_001 = trr_12z * dm_kl_002 + trr_13z * dm_kl_003; + double dot_lkl_z_002 = trr_22z * dm_kl_002 + trr_23z * dm_kl_003; + double dot_lkl_z_010 = trr_01z * dm_kl_011 + trr_02z * dm_kl_012; + double dot_lkl_z_011 = trr_11z * dm_kl_011 + trr_12z * dm_kl_012; + double dot_lkl_z_012 = trr_21z * dm_kl_011 + trr_22z * dm_kl_012; + double dot_lkl_z_020 = wt * dm_kl_020 + trr_01z * dm_kl_021; + double dot_lkl_z_021 = trr_10z * dm_kl_020 + trr_11z * dm_kl_021; + double dot_lkl_z_022 = trr_20z * dm_kl_020 + trr_21z * dm_kl_021; + double dot_lkl_z_030 = wt * dm_kl_030; + double dot_lkl_z_031 = trr_10z * dm_kl_030; + double dot_lkl_z_032 = trr_20z * dm_kl_030; + double dot_lkl_z_100 = trr_01z * dm_kl_101 + trr_02z * dm_kl_102; + double dot_lkl_z_101 = trr_11z * dm_kl_101 + trr_12z * dm_kl_102; + double dot_lkl_z_102 = trr_21z * dm_kl_101 + trr_22z * dm_kl_102; + double dot_lkl_z_110 = wt * dm_kl_110 + trr_01z * dm_kl_111; + double dot_lkl_z_111 = trr_10z * dm_kl_110 + trr_11z * dm_kl_111; + double dot_lkl_z_112 = trr_20z * dm_kl_110 + trr_21z * dm_kl_111; + double dot_lkl_z_120 = wt * dm_kl_120; + double dot_lkl_z_121 = trr_10z * dm_kl_120; + double dot_lkl_z_122 = trr_20z * dm_kl_120; + double dot_lkl_z_200 = wt * dm_kl_200 + trr_01z * dm_kl_201; + double dot_lkl_z_201 = trr_10z * dm_kl_200 + trr_11z * dm_kl_201; + double dot_lkl_z_202 = trr_20z * dm_kl_200 + trr_21z * dm_kl_201; + double dot_lkl_z_210 = wt * dm_kl_210; + double dot_lkl_z_211 = trr_10z * dm_kl_210; + double dot_lkl_z_212 = trr_20z * dm_kl_210; + double dot_lkl_z_300 = wt * dm_kl_300; + double dot_lkl_z_301 = trr_10z * dm_kl_300; + double dot_lkl_z_302 = trr_20z * dm_kl_300; + double dot_lkl_y_000 = 1 * dot_lkl_z_000 + trr_01y * dot_lkl_z_010 + trr_02y * dot_lkl_z_020 + trr_03y * dot_lkl_z_030; + double dot_lkl_y_001 = 1 * dot_lkl_z_001 + trr_01y * dot_lkl_z_011 + trr_02y * dot_lkl_z_021 + trr_03y * dot_lkl_z_031; + double dot_lkl_y_002 = 1 * dot_lkl_z_002 + trr_01y * dot_lkl_z_012 + trr_02y * dot_lkl_z_022 + trr_03y * dot_lkl_z_032; + double dot_lkl_y_010 = trr_10y * dot_lkl_z_000 + trr_11y * dot_lkl_z_010 + trr_12y * dot_lkl_z_020 + trr_13y * dot_lkl_z_030; + double dot_lkl_y_011 = trr_10y * dot_lkl_z_001 + trr_11y * dot_lkl_z_011 + trr_12y * dot_lkl_z_021 + trr_13y * dot_lkl_z_031; + double dot_lkl_y_020 = trr_20y * dot_lkl_z_000 + trr_21y * dot_lkl_z_010 + trr_22y * dot_lkl_z_020 + trr_23y * dot_lkl_z_030; + double dot_lkl_y_100 = 1 * dot_lkl_z_100 + trr_01y * dot_lkl_z_110 + trr_02y * dot_lkl_z_120; + double dot_lkl_y_101 = 1 * dot_lkl_z_101 + trr_01y * dot_lkl_z_111 + trr_02y * dot_lkl_z_121; + double dot_lkl_y_102 = 1 * dot_lkl_z_102 + trr_01y * dot_lkl_z_112 + trr_02y * dot_lkl_z_122; + double dot_lkl_y_110 = trr_10y * dot_lkl_z_100 + trr_11y * dot_lkl_z_110 + trr_12y * dot_lkl_z_120; + double dot_lkl_y_111 = trr_10y * dot_lkl_z_101 + trr_11y * dot_lkl_z_111 + trr_12y * dot_lkl_z_121; + double dot_lkl_y_120 = trr_20y * dot_lkl_z_100 + trr_21y * dot_lkl_z_110 + trr_22y * dot_lkl_z_120; + double dot_lkl_y_200 = 1 * dot_lkl_z_200 + trr_01y * dot_lkl_z_210; + double dot_lkl_y_201 = 1 * dot_lkl_z_201 + trr_01y * dot_lkl_z_211; + double dot_lkl_y_202 = 1 * dot_lkl_z_202 + trr_01y * dot_lkl_z_212; + double dot_lkl_y_210 = trr_10y * dot_lkl_z_200 + trr_11y * dot_lkl_z_210; + double dot_lkl_y_211 = trr_10y * dot_lkl_z_201 + trr_11y * dot_lkl_z_211; + double dot_lkl_y_220 = trr_20y * dot_lkl_z_200 + trr_21y * dot_lkl_z_210; + double dot_lkl_y_300 = 1 * dot_lkl_z_300; + double dot_lkl_y_301 = 1 * dot_lkl_z_301; + double dot_lkl_y_302 = 1 * dot_lkl_z_302; + double dot_lkl_y_310 = trr_10y * dot_lkl_z_300; + double dot_lkl_y_311 = trr_10y * dot_lkl_z_301; + double dot_lkl_y_320 = trr_20y * dot_lkl_z_300; + vj_ij_001 += fac * dot_lkl_y_001 + trr_01x * dot_lkl_y_101 + trr_02x * dot_lkl_y_201 + trr_03x * dot_lkl_y_301; + vj_ij_002 += fac * dot_lkl_y_002 + trr_01x * dot_lkl_y_102 + trr_02x * dot_lkl_y_202 + trr_03x * dot_lkl_y_302; + vj_ij_010 += fac * dot_lkl_y_010 + trr_01x * dot_lkl_y_110 + trr_02x * dot_lkl_y_210 + trr_03x * dot_lkl_y_310; + vj_ij_011 += fac * dot_lkl_y_011 + trr_01x * dot_lkl_y_111 + trr_02x * dot_lkl_y_211 + trr_03x * dot_lkl_y_311; + vj_ij_020 += fac * dot_lkl_y_020 + trr_01x * dot_lkl_y_120 + trr_02x * dot_lkl_y_220 + trr_03x * dot_lkl_y_320; + vj_ij_100 += trr_10x * dot_lkl_y_000 + trr_11x * dot_lkl_y_100 + trr_12x * dot_lkl_y_200 + trr_13x * dot_lkl_y_300; + vj_ij_101 += trr_10x * dot_lkl_y_001 + trr_11x * dot_lkl_y_101 + trr_12x * dot_lkl_y_201 + trr_13x * dot_lkl_y_301; + vj_ij_110 += trr_10x * dot_lkl_y_010 + trr_11x * dot_lkl_y_110 + trr_12x * dot_lkl_y_210 + trr_13x * dot_lkl_y_310; + vj_ij_200 += trr_20x * dot_lkl_y_000 + trr_21x * dot_lkl_y_100 + trr_22x * dot_lkl_y_200 + trr_23x * dot_lkl_y_300; + } + } + } + if (task_id >= ntasks) { + continue; + } + double *vj = jk.vj; + atomicAdd(vj+ij_pair0+1, vj_ij_001); + atomicAdd(vj+ij_pair0+2, vj_ij_002); + atomicAdd(vj+ij_pair0+3, vj_ij_010); + atomicAdd(vj+ij_pair0+4, vj_ij_011); + atomicAdd(vj+ij_pair0+5, vj_ij_020); + atomicAdd(vj+ij_pair0+6, vj_ij_100); + atomicAdd(vj+ij_pair0+7, vj_ij_101); + atomicAdd(vj+ij_pair0+8, vj_ij_110); + atomicAdd(vj+ij_pair0+9, vj_ij_200); + atomicAdd(vj+kl_pair0+2, vj_kl_002); + atomicAdd(vj+kl_pair0+3, vj_kl_003); + atomicAdd(vj+kl_pair0+5, vj_kl_011); + atomicAdd(vj+kl_pair0+6, vj_kl_012); + atomicAdd(vj+kl_pair0+7, vj_kl_020); + atomicAdd(vj+kl_pair0+8, vj_kl_021); + atomicAdd(vj+kl_pair0+9, vj_kl_030); + atomicAdd(vj+kl_pair0+11, vj_kl_101); + atomicAdd(vj+kl_pair0+12, vj_kl_102); + atomicAdd(vj+kl_pair0+13, vj_kl_110); + atomicAdd(vj+kl_pair0+14, vj_kl_111); + atomicAdd(vj+kl_pair0+15, vj_kl_120); + atomicAdd(vj+kl_pair0+16, vj_kl_200); + atomicAdd(vj+kl_pair0+17, vj_kl_201); + atomicAdd(vj+kl_pair0+18, vj_kl_210); + atomicAdd(vj+kl_pair0+19, vj_kl_300); + } +} +__global__ +void rys_j_2_3(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_j_2_3(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_j_2_4(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int nbas = envs.nbas; + int *bas = envs.bas; + int *pair_loc = envs.ao_loc; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *dm_ij_cache = Rpa_cicj + iprim*jprim*TILE2*4; + double *rw = dm_ij_cache + 10*TILE2; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double *dm = jk.dm; + for (int n = sq_id; n < 10*TILE2; n += nsq_per_block) { + int m = n / TILE2; + int ij_sh = n % TILE2; + int ish = ish0 + ij_sh / TILE; + int jsh = jsh0 + ij_sh % TILE; + int ij_pair0 = pair_loc[ish*nbas+jsh]; + dm_ij_cache[ij_sh+m*TILE2] = dm[ij_pair0+m]; + } + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int ij_pair0 = pair_loc[ish*nbas+jsh]; + int kl_pair0 = pair_loc[ksh*nbas+lsh]; + double dm_kl_002 = dm[kl_pair0+2]; + double dm_kl_003 = dm[kl_pair0+3]; + double dm_kl_004 = dm[kl_pair0+4]; + double dm_kl_011 = dm[kl_pair0+6]; + double dm_kl_012 = dm[kl_pair0+7]; + double dm_kl_013 = dm[kl_pair0+8]; + double dm_kl_020 = dm[kl_pair0+9]; + double dm_kl_021 = dm[kl_pair0+10]; + double dm_kl_022 = dm[kl_pair0+11]; + double dm_kl_030 = dm[kl_pair0+12]; + double dm_kl_031 = dm[kl_pair0+13]; + double dm_kl_040 = dm[kl_pair0+14]; + double dm_kl_101 = dm[kl_pair0+16]; + double dm_kl_102 = dm[kl_pair0+17]; + double dm_kl_103 = dm[kl_pair0+18]; + double dm_kl_110 = dm[kl_pair0+19]; + double dm_kl_111 = dm[kl_pair0+20]; + double dm_kl_112 = dm[kl_pair0+21]; + double dm_kl_120 = dm[kl_pair0+22]; + double dm_kl_121 = dm[kl_pair0+23]; + double dm_kl_130 = dm[kl_pair0+24]; + double dm_kl_200 = dm[kl_pair0+25]; + double dm_kl_201 = dm[kl_pair0+26]; + double dm_kl_202 = dm[kl_pair0+27]; + double dm_kl_210 = dm[kl_pair0+28]; + double dm_kl_211 = dm[kl_pair0+29]; + double dm_kl_220 = dm[kl_pair0+30]; + double dm_kl_300 = dm[kl_pair0+31]; + double dm_kl_301 = dm[kl_pair0+32]; + double dm_kl_310 = dm[kl_pair0+33]; + double dm_kl_400 = dm[kl_pair0+34]; + double vj_ij_001 = 0; + double vj_ij_002 = 0; + double vj_ij_010 = 0; + double vj_ij_011 = 0; + double vj_ij_020 = 0; + double vj_ij_100 = 0; + double vj_ij_101 = 0; + double vj_ij_110 = 0; + double vj_ij_200 = 0; + double vj_kl_002 = 0; + double vj_kl_003 = 0; + double vj_kl_004 = 0; + double vj_kl_011 = 0; + double vj_kl_012 = 0; + double vj_kl_013 = 0; + double vj_kl_020 = 0; + double vj_kl_021 = 0; + double vj_kl_022 = 0; + double vj_kl_030 = 0; + double vj_kl_031 = 0; + double vj_kl_040 = 0; + double vj_kl_101 = 0; + double vj_kl_102 = 0; + double vj_kl_103 = 0; + double vj_kl_110 = 0; + double vj_kl_111 = 0; + double vj_kl_112 = 0; + double vj_kl_120 = 0; + double vj_kl_121 = 0; + double vj_kl_130 = 0; + double vj_kl_200 = 0; + double vj_kl_201 = 0; + double vj_kl_202 = 0; + double vj_kl_210 = 0; + double vj_kl_211 = 0; + double vj_kl_220 = 0; + double vj_kl_300 = 0; + double vj_kl_301 = 0; + double vj_kl_310 = 0; + double vj_kl_400 = 0; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(4, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(4, theta_fac*theta_rr, rw); + fac *= sqrt(theta_fac); + for (int irys = 0; irys < 4; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + } + } + for (int irys = 0; irys < 4; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double b00 = .5 * rt_aa; + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + double dot_lij_z_000 = trr_10z * dm_ij_cache[sh_ij+1*TILE2] + trr_20z * dm_ij_cache[sh_ij+2*TILE2]; + double rt_akl = rt_aa * aij; + double b01 = .5/akl * (1 - rt_akl); + double cpz = zqc + zpq*rt_akl; + double trr_11z = cpz * trr_10z + 1*b00 * wt; + double trr_21z = cpz * trr_20z + 2*b00 * trr_10z; + double dot_lij_z_001 = trr_11z * dm_ij_cache[sh_ij+1*TILE2] + trr_21z * dm_ij_cache[sh_ij+2*TILE2]; + double trr_01z = cpz * wt; + double trr_12z = cpz * trr_11z + 1*b01 * trr_10z + 1*b00 * trr_01z; + double trr_22z = cpz * trr_21z + 1*b01 * trr_20z + 2*b00 * trr_11z; + double dot_lij_z_002 = trr_12z * dm_ij_cache[sh_ij+1*TILE2] + trr_22z * dm_ij_cache[sh_ij+2*TILE2]; + double trr_02z = cpz * trr_01z + 1*b01 * wt; + double trr_13z = cpz * trr_12z + 2*b01 * trr_11z + 1*b00 * trr_02z; + double trr_23z = cpz * trr_22z + 2*b01 * trr_21z + 2*b00 * trr_12z; + double dot_lij_z_003 = trr_13z * dm_ij_cache[sh_ij+1*TILE2] + trr_23z * dm_ij_cache[sh_ij+2*TILE2]; + double trr_03z = cpz * trr_02z + 2*b01 * trr_01z; + double trr_14z = cpz * trr_13z + 3*b01 * trr_12z + 1*b00 * trr_03z; + double trr_24z = cpz * trr_23z + 3*b01 * trr_22z + 2*b00 * trr_13z; + double dot_lij_z_004 = trr_14z * dm_ij_cache[sh_ij+1*TILE2] + trr_24z * dm_ij_cache[sh_ij+2*TILE2]; + double dot_lij_z_010 = wt * dm_ij_cache[sh_ij+3*TILE2] + trr_10z * dm_ij_cache[sh_ij+4*TILE2]; + double dot_lij_z_011 = trr_01z * dm_ij_cache[sh_ij+3*TILE2] + trr_11z * dm_ij_cache[sh_ij+4*TILE2]; + double dot_lij_z_012 = trr_02z * dm_ij_cache[sh_ij+3*TILE2] + trr_12z * dm_ij_cache[sh_ij+4*TILE2]; + double dot_lij_z_013 = trr_03z * dm_ij_cache[sh_ij+3*TILE2] + trr_13z * dm_ij_cache[sh_ij+4*TILE2]; + double trr_04z = cpz * trr_03z + 3*b01 * trr_02z; + double dot_lij_z_014 = trr_04z * dm_ij_cache[sh_ij+3*TILE2] + trr_14z * dm_ij_cache[sh_ij+4*TILE2]; + double dot_lij_z_020 = wt * dm_ij_cache[sh_ij+5*TILE2]; + double dot_lij_z_021 = trr_01z * dm_ij_cache[sh_ij+5*TILE2]; + double dot_lij_z_022 = trr_02z * dm_ij_cache[sh_ij+5*TILE2]; + double dot_lij_z_023 = trr_03z * dm_ij_cache[sh_ij+5*TILE2]; + double dot_lij_z_024 = trr_04z * dm_ij_cache[sh_ij+5*TILE2]; + double dot_lij_z_100 = wt * dm_ij_cache[sh_ij+6*TILE2] + trr_10z * dm_ij_cache[sh_ij+7*TILE2]; + double dot_lij_z_101 = trr_01z * dm_ij_cache[sh_ij+6*TILE2] + trr_11z * dm_ij_cache[sh_ij+7*TILE2]; + double dot_lij_z_102 = trr_02z * dm_ij_cache[sh_ij+6*TILE2] + trr_12z * dm_ij_cache[sh_ij+7*TILE2]; + double dot_lij_z_103 = trr_03z * dm_ij_cache[sh_ij+6*TILE2] + trr_13z * dm_ij_cache[sh_ij+7*TILE2]; + double dot_lij_z_104 = trr_04z * dm_ij_cache[sh_ij+6*TILE2] + trr_14z * dm_ij_cache[sh_ij+7*TILE2]; + double dot_lij_z_110 = wt * dm_ij_cache[sh_ij+8*TILE2]; + double dot_lij_z_111 = trr_01z * dm_ij_cache[sh_ij+8*TILE2]; + double dot_lij_z_112 = trr_02z * dm_ij_cache[sh_ij+8*TILE2]; + double dot_lij_z_113 = trr_03z * dm_ij_cache[sh_ij+8*TILE2]; + double dot_lij_z_114 = trr_04z * dm_ij_cache[sh_ij+8*TILE2]; + double dot_lij_z_200 = wt * dm_ij_cache[sh_ij+9*TILE2]; + double dot_lij_z_201 = trr_01z * dm_ij_cache[sh_ij+9*TILE2]; + double dot_lij_z_202 = trr_02z * dm_ij_cache[sh_ij+9*TILE2]; + double dot_lij_z_203 = trr_03z * dm_ij_cache[sh_ij+9*TILE2]; + double dot_lij_z_204 = trr_04z * dm_ij_cache[sh_ij+9*TILE2]; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + double dot_lij_y_000 = 1 * dot_lij_z_000 + trr_10y * dot_lij_z_010 + trr_20y * dot_lij_z_020; + double dot_lij_y_001 = 1 * dot_lij_z_001 + trr_10y * dot_lij_z_011 + trr_20y * dot_lij_z_021; + double dot_lij_y_002 = 1 * dot_lij_z_002 + trr_10y * dot_lij_z_012 + trr_20y * dot_lij_z_022; + double dot_lij_y_003 = 1 * dot_lij_z_003 + trr_10y * dot_lij_z_013 + trr_20y * dot_lij_z_023; + double dot_lij_y_004 = 1 * dot_lij_z_004 + trr_10y * dot_lij_z_014 + trr_20y * dot_lij_z_024; + double cpy = yqc + ypq*rt_akl; + double trr_01y = cpy * 1; + double trr_11y = cpy * trr_10y + 1*b00 * 1; + double trr_21y = cpy * trr_20y + 2*b00 * trr_10y; + double dot_lij_y_010 = trr_01y * dot_lij_z_000 + trr_11y * dot_lij_z_010 + trr_21y * dot_lij_z_020; + double dot_lij_y_011 = trr_01y * dot_lij_z_001 + trr_11y * dot_lij_z_011 + trr_21y * dot_lij_z_021; + double dot_lij_y_012 = trr_01y * dot_lij_z_002 + trr_11y * dot_lij_z_012 + trr_21y * dot_lij_z_022; + double dot_lij_y_013 = trr_01y * dot_lij_z_003 + trr_11y * dot_lij_z_013 + trr_21y * dot_lij_z_023; + double trr_02y = cpy * trr_01y + 1*b01 * 1; + double trr_12y = cpy * trr_11y + 1*b01 * trr_10y + 1*b00 * trr_01y; + double trr_22y = cpy * trr_21y + 1*b01 * trr_20y + 2*b00 * trr_11y; + double dot_lij_y_020 = trr_02y * dot_lij_z_000 + trr_12y * dot_lij_z_010 + trr_22y * dot_lij_z_020; + double dot_lij_y_021 = trr_02y * dot_lij_z_001 + trr_12y * dot_lij_z_011 + trr_22y * dot_lij_z_021; + double dot_lij_y_022 = trr_02y * dot_lij_z_002 + trr_12y * dot_lij_z_012 + trr_22y * dot_lij_z_022; + double trr_03y = cpy * trr_02y + 2*b01 * trr_01y; + double trr_13y = cpy * trr_12y + 2*b01 * trr_11y + 1*b00 * trr_02y; + double trr_23y = cpy * trr_22y + 2*b01 * trr_21y + 2*b00 * trr_12y; + double dot_lij_y_030 = trr_03y * dot_lij_z_000 + trr_13y * dot_lij_z_010 + trr_23y * dot_lij_z_020; + double dot_lij_y_031 = trr_03y * dot_lij_z_001 + trr_13y * dot_lij_z_011 + trr_23y * dot_lij_z_021; + double trr_04y = cpy * trr_03y + 3*b01 * trr_02y; + double trr_14y = cpy * trr_13y + 3*b01 * trr_12y + 1*b00 * trr_03y; + double trr_24y = cpy * trr_23y + 3*b01 * trr_22y + 2*b00 * trr_13y; + double dot_lij_y_040 = trr_04y * dot_lij_z_000 + trr_14y * dot_lij_z_010 + trr_24y * dot_lij_z_020; + double dot_lij_y_100 = 1 * dot_lij_z_100 + trr_10y * dot_lij_z_110; + double dot_lij_y_101 = 1 * dot_lij_z_101 + trr_10y * dot_lij_z_111; + double dot_lij_y_102 = 1 * dot_lij_z_102 + trr_10y * dot_lij_z_112; + double dot_lij_y_103 = 1 * dot_lij_z_103 + trr_10y * dot_lij_z_113; + double dot_lij_y_104 = 1 * dot_lij_z_104 + trr_10y * dot_lij_z_114; + double dot_lij_y_110 = trr_01y * dot_lij_z_100 + trr_11y * dot_lij_z_110; + double dot_lij_y_111 = trr_01y * dot_lij_z_101 + trr_11y * dot_lij_z_111; + double dot_lij_y_112 = trr_01y * dot_lij_z_102 + trr_11y * dot_lij_z_112; + double dot_lij_y_113 = trr_01y * dot_lij_z_103 + trr_11y * dot_lij_z_113; + double dot_lij_y_120 = trr_02y * dot_lij_z_100 + trr_12y * dot_lij_z_110; + double dot_lij_y_121 = trr_02y * dot_lij_z_101 + trr_12y * dot_lij_z_111; + double dot_lij_y_122 = trr_02y * dot_lij_z_102 + trr_12y * dot_lij_z_112; + double dot_lij_y_130 = trr_03y * dot_lij_z_100 + trr_13y * dot_lij_z_110; + double dot_lij_y_131 = trr_03y * dot_lij_z_101 + trr_13y * dot_lij_z_111; + double dot_lij_y_140 = trr_04y * dot_lij_z_100 + trr_14y * dot_lij_z_110; + double dot_lij_y_200 = 1 * dot_lij_z_200; + double dot_lij_y_201 = 1 * dot_lij_z_201; + double dot_lij_y_202 = 1 * dot_lij_z_202; + double dot_lij_y_203 = 1 * dot_lij_z_203; + double dot_lij_y_204 = 1 * dot_lij_z_204; + double dot_lij_y_210 = trr_01y * dot_lij_z_200; + double dot_lij_y_211 = trr_01y * dot_lij_z_201; + double dot_lij_y_212 = trr_01y * dot_lij_z_202; + double dot_lij_y_213 = trr_01y * dot_lij_z_203; + double dot_lij_y_220 = trr_02y * dot_lij_z_200; + double dot_lij_y_221 = trr_02y * dot_lij_z_201; + double dot_lij_y_222 = trr_02y * dot_lij_z_202; + double dot_lij_y_230 = trr_03y * dot_lij_z_200; + double dot_lij_y_231 = trr_03y * dot_lij_z_201; + double dot_lij_y_240 = trr_04y * dot_lij_z_200; + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + vj_kl_002 += fac * dot_lij_y_002 + trr_10x * dot_lij_y_102 + trr_20x * dot_lij_y_202; + vj_kl_003 += fac * dot_lij_y_003 + trr_10x * dot_lij_y_103 + trr_20x * dot_lij_y_203; + vj_kl_004 += fac * dot_lij_y_004 + trr_10x * dot_lij_y_104 + trr_20x * dot_lij_y_204; + vj_kl_011 += fac * dot_lij_y_011 + trr_10x * dot_lij_y_111 + trr_20x * dot_lij_y_211; + vj_kl_012 += fac * dot_lij_y_012 + trr_10x * dot_lij_y_112 + trr_20x * dot_lij_y_212; + vj_kl_013 += fac * dot_lij_y_013 + trr_10x * dot_lij_y_113 + trr_20x * dot_lij_y_213; + vj_kl_020 += fac * dot_lij_y_020 + trr_10x * dot_lij_y_120 + trr_20x * dot_lij_y_220; + vj_kl_021 += fac * dot_lij_y_021 + trr_10x * dot_lij_y_121 + trr_20x * dot_lij_y_221; + vj_kl_022 += fac * dot_lij_y_022 + trr_10x * dot_lij_y_122 + trr_20x * dot_lij_y_222; + vj_kl_030 += fac * dot_lij_y_030 + trr_10x * dot_lij_y_130 + trr_20x * dot_lij_y_230; + vj_kl_031 += fac * dot_lij_y_031 + trr_10x * dot_lij_y_131 + trr_20x * dot_lij_y_231; + vj_kl_040 += fac * dot_lij_y_040 + trr_10x * dot_lij_y_140 + trr_20x * dot_lij_y_240; + double cpx = xqc + xpq*rt_akl; + double trr_01x = cpx * fac; + double trr_11x = cpx * trr_10x + 1*b00 * fac; + double trr_21x = cpx * trr_20x + 2*b00 * trr_10x; + vj_kl_101 += trr_01x * dot_lij_y_001 + trr_11x * dot_lij_y_101 + trr_21x * dot_lij_y_201; + vj_kl_102 += trr_01x * dot_lij_y_002 + trr_11x * dot_lij_y_102 + trr_21x * dot_lij_y_202; + vj_kl_103 += trr_01x * dot_lij_y_003 + trr_11x * dot_lij_y_103 + trr_21x * dot_lij_y_203; + vj_kl_110 += trr_01x * dot_lij_y_010 + trr_11x * dot_lij_y_110 + trr_21x * dot_lij_y_210; + vj_kl_111 += trr_01x * dot_lij_y_011 + trr_11x * dot_lij_y_111 + trr_21x * dot_lij_y_211; + vj_kl_112 += trr_01x * dot_lij_y_012 + trr_11x * dot_lij_y_112 + trr_21x * dot_lij_y_212; + vj_kl_120 += trr_01x * dot_lij_y_020 + trr_11x * dot_lij_y_120 + trr_21x * dot_lij_y_220; + vj_kl_121 += trr_01x * dot_lij_y_021 + trr_11x * dot_lij_y_121 + trr_21x * dot_lij_y_221; + vj_kl_130 += trr_01x * dot_lij_y_030 + trr_11x * dot_lij_y_130 + trr_21x * dot_lij_y_230; + double trr_02x = cpx * trr_01x + 1*b01 * fac; + double trr_12x = cpx * trr_11x + 1*b01 * trr_10x + 1*b00 * trr_01x; + double trr_22x = cpx * trr_21x + 1*b01 * trr_20x + 2*b00 * trr_11x; + vj_kl_200 += trr_02x * dot_lij_y_000 + trr_12x * dot_lij_y_100 + trr_22x * dot_lij_y_200; + vj_kl_201 += trr_02x * dot_lij_y_001 + trr_12x * dot_lij_y_101 + trr_22x * dot_lij_y_201; + vj_kl_202 += trr_02x * dot_lij_y_002 + trr_12x * dot_lij_y_102 + trr_22x * dot_lij_y_202; + vj_kl_210 += trr_02x * dot_lij_y_010 + trr_12x * dot_lij_y_110 + trr_22x * dot_lij_y_210; + vj_kl_211 += trr_02x * dot_lij_y_011 + trr_12x * dot_lij_y_111 + trr_22x * dot_lij_y_211; + vj_kl_220 += trr_02x * dot_lij_y_020 + trr_12x * dot_lij_y_120 + trr_22x * dot_lij_y_220; + double trr_03x = cpx * trr_02x + 2*b01 * trr_01x; + double trr_13x = cpx * trr_12x + 2*b01 * trr_11x + 1*b00 * trr_02x; + double trr_23x = cpx * trr_22x + 2*b01 * trr_21x + 2*b00 * trr_12x; + vj_kl_300 += trr_03x * dot_lij_y_000 + trr_13x * dot_lij_y_100 + trr_23x * dot_lij_y_200; + vj_kl_301 += trr_03x * dot_lij_y_001 + trr_13x * dot_lij_y_101 + trr_23x * dot_lij_y_201; + vj_kl_310 += trr_03x * dot_lij_y_010 + trr_13x * dot_lij_y_110 + trr_23x * dot_lij_y_210; + double trr_04x = cpx * trr_03x + 3*b01 * trr_02x; + double trr_14x = cpx * trr_13x + 3*b01 * trr_12x + 1*b00 * trr_03x; + double trr_24x = cpx * trr_23x + 3*b01 * trr_22x + 2*b00 * trr_13x; + vj_kl_400 += trr_04x * dot_lij_y_000 + trr_14x * dot_lij_y_100 + trr_24x * dot_lij_y_200; + double dot_lkl_z_000 = trr_02z * dm_kl_002 + trr_03z * dm_kl_003 + trr_04z * dm_kl_004; + double dot_lkl_z_001 = trr_12z * dm_kl_002 + trr_13z * dm_kl_003 + trr_14z * dm_kl_004; + double dot_lkl_z_002 = trr_22z * dm_kl_002 + trr_23z * dm_kl_003 + trr_24z * dm_kl_004; + double dot_lkl_z_010 = trr_01z * dm_kl_011 + trr_02z * dm_kl_012 + trr_03z * dm_kl_013; + double dot_lkl_z_011 = trr_11z * dm_kl_011 + trr_12z * dm_kl_012 + trr_13z * dm_kl_013; + double dot_lkl_z_012 = trr_21z * dm_kl_011 + trr_22z * dm_kl_012 + trr_23z * dm_kl_013; + double dot_lkl_z_020 = wt * dm_kl_020 + trr_01z * dm_kl_021 + trr_02z * dm_kl_022; + double dot_lkl_z_021 = trr_10z * dm_kl_020 + trr_11z * dm_kl_021 + trr_12z * dm_kl_022; + double dot_lkl_z_022 = trr_20z * dm_kl_020 + trr_21z * dm_kl_021 + trr_22z * dm_kl_022; + double dot_lkl_z_030 = wt * dm_kl_030 + trr_01z * dm_kl_031; + double dot_lkl_z_031 = trr_10z * dm_kl_030 + trr_11z * dm_kl_031; + double dot_lkl_z_032 = trr_20z * dm_kl_030 + trr_21z * dm_kl_031; + double dot_lkl_z_040 = wt * dm_kl_040; + double dot_lkl_z_041 = trr_10z * dm_kl_040; + double dot_lkl_z_042 = trr_20z * dm_kl_040; + double dot_lkl_z_100 = trr_01z * dm_kl_101 + trr_02z * dm_kl_102 + trr_03z * dm_kl_103; + double dot_lkl_z_101 = trr_11z * dm_kl_101 + trr_12z * dm_kl_102 + trr_13z * dm_kl_103; + double dot_lkl_z_102 = trr_21z * dm_kl_101 + trr_22z * dm_kl_102 + trr_23z * dm_kl_103; + double dot_lkl_z_110 = wt * dm_kl_110 + trr_01z * dm_kl_111 + trr_02z * dm_kl_112; + double dot_lkl_z_111 = trr_10z * dm_kl_110 + trr_11z * dm_kl_111 + trr_12z * dm_kl_112; + double dot_lkl_z_112 = trr_20z * dm_kl_110 + trr_21z * dm_kl_111 + trr_22z * dm_kl_112; + double dot_lkl_z_120 = wt * dm_kl_120 + trr_01z * dm_kl_121; + double dot_lkl_z_121 = trr_10z * dm_kl_120 + trr_11z * dm_kl_121; + double dot_lkl_z_122 = trr_20z * dm_kl_120 + trr_21z * dm_kl_121; + double dot_lkl_z_130 = wt * dm_kl_130; + double dot_lkl_z_131 = trr_10z * dm_kl_130; + double dot_lkl_z_132 = trr_20z * dm_kl_130; + double dot_lkl_z_200 = wt * dm_kl_200 + trr_01z * dm_kl_201 + trr_02z * dm_kl_202; + double dot_lkl_z_201 = trr_10z * dm_kl_200 + trr_11z * dm_kl_201 + trr_12z * dm_kl_202; + double dot_lkl_z_202 = trr_20z * dm_kl_200 + trr_21z * dm_kl_201 + trr_22z * dm_kl_202; + double dot_lkl_z_210 = wt * dm_kl_210 + trr_01z * dm_kl_211; + double dot_lkl_z_211 = trr_10z * dm_kl_210 + trr_11z * dm_kl_211; + double dot_lkl_z_212 = trr_20z * dm_kl_210 + trr_21z * dm_kl_211; + double dot_lkl_z_220 = wt * dm_kl_220; + double dot_lkl_z_221 = trr_10z * dm_kl_220; + double dot_lkl_z_222 = trr_20z * dm_kl_220; + double dot_lkl_z_300 = wt * dm_kl_300 + trr_01z * dm_kl_301; + double dot_lkl_z_301 = trr_10z * dm_kl_300 + trr_11z * dm_kl_301; + double dot_lkl_z_302 = trr_20z * dm_kl_300 + trr_21z * dm_kl_301; + double dot_lkl_z_310 = wt * dm_kl_310; + double dot_lkl_z_311 = trr_10z * dm_kl_310; + double dot_lkl_z_312 = trr_20z * dm_kl_310; + double dot_lkl_z_400 = wt * dm_kl_400; + double dot_lkl_z_401 = trr_10z * dm_kl_400; + double dot_lkl_z_402 = trr_20z * dm_kl_400; + double dot_lkl_y_000 = 1 * dot_lkl_z_000 + trr_01y * dot_lkl_z_010 + trr_02y * dot_lkl_z_020 + trr_03y * dot_lkl_z_030 + trr_04y * dot_lkl_z_040; + double dot_lkl_y_001 = 1 * dot_lkl_z_001 + trr_01y * dot_lkl_z_011 + trr_02y * dot_lkl_z_021 + trr_03y * dot_lkl_z_031 + trr_04y * dot_lkl_z_041; + double dot_lkl_y_002 = 1 * dot_lkl_z_002 + trr_01y * dot_lkl_z_012 + trr_02y * dot_lkl_z_022 + trr_03y * dot_lkl_z_032 + trr_04y * dot_lkl_z_042; + double dot_lkl_y_010 = trr_10y * dot_lkl_z_000 + trr_11y * dot_lkl_z_010 + trr_12y * dot_lkl_z_020 + trr_13y * dot_lkl_z_030 + trr_14y * dot_lkl_z_040; + double dot_lkl_y_011 = trr_10y * dot_lkl_z_001 + trr_11y * dot_lkl_z_011 + trr_12y * dot_lkl_z_021 + trr_13y * dot_lkl_z_031 + trr_14y * dot_lkl_z_041; + double dot_lkl_y_020 = trr_20y * dot_lkl_z_000 + trr_21y * dot_lkl_z_010 + trr_22y * dot_lkl_z_020 + trr_23y * dot_lkl_z_030 + trr_24y * dot_lkl_z_040; + double dot_lkl_y_100 = 1 * dot_lkl_z_100 + trr_01y * dot_lkl_z_110 + trr_02y * dot_lkl_z_120 + trr_03y * dot_lkl_z_130; + double dot_lkl_y_101 = 1 * dot_lkl_z_101 + trr_01y * dot_lkl_z_111 + trr_02y * dot_lkl_z_121 + trr_03y * dot_lkl_z_131; + double dot_lkl_y_102 = 1 * dot_lkl_z_102 + trr_01y * dot_lkl_z_112 + trr_02y * dot_lkl_z_122 + trr_03y * dot_lkl_z_132; + double dot_lkl_y_110 = trr_10y * dot_lkl_z_100 + trr_11y * dot_lkl_z_110 + trr_12y * dot_lkl_z_120 + trr_13y * dot_lkl_z_130; + double dot_lkl_y_111 = trr_10y * dot_lkl_z_101 + trr_11y * dot_lkl_z_111 + trr_12y * dot_lkl_z_121 + trr_13y * dot_lkl_z_131; + double dot_lkl_y_120 = trr_20y * dot_lkl_z_100 + trr_21y * dot_lkl_z_110 + trr_22y * dot_lkl_z_120 + trr_23y * dot_lkl_z_130; + double dot_lkl_y_200 = 1 * dot_lkl_z_200 + trr_01y * dot_lkl_z_210 + trr_02y * dot_lkl_z_220; + double dot_lkl_y_201 = 1 * dot_lkl_z_201 + trr_01y * dot_lkl_z_211 + trr_02y * dot_lkl_z_221; + double dot_lkl_y_202 = 1 * dot_lkl_z_202 + trr_01y * dot_lkl_z_212 + trr_02y * dot_lkl_z_222; + double dot_lkl_y_210 = trr_10y * dot_lkl_z_200 + trr_11y * dot_lkl_z_210 + trr_12y * dot_lkl_z_220; + double dot_lkl_y_211 = trr_10y * dot_lkl_z_201 + trr_11y * dot_lkl_z_211 + trr_12y * dot_lkl_z_221; + double dot_lkl_y_220 = trr_20y * dot_lkl_z_200 + trr_21y * dot_lkl_z_210 + trr_22y * dot_lkl_z_220; + double dot_lkl_y_300 = 1 * dot_lkl_z_300 + trr_01y * dot_lkl_z_310; + double dot_lkl_y_301 = 1 * dot_lkl_z_301 + trr_01y * dot_lkl_z_311; + double dot_lkl_y_302 = 1 * dot_lkl_z_302 + trr_01y * dot_lkl_z_312; + double dot_lkl_y_310 = trr_10y * dot_lkl_z_300 + trr_11y * dot_lkl_z_310; + double dot_lkl_y_311 = trr_10y * dot_lkl_z_301 + trr_11y * dot_lkl_z_311; + double dot_lkl_y_320 = trr_20y * dot_lkl_z_300 + trr_21y * dot_lkl_z_310; + double dot_lkl_y_400 = 1 * dot_lkl_z_400; + double dot_lkl_y_401 = 1 * dot_lkl_z_401; + double dot_lkl_y_402 = 1 * dot_lkl_z_402; + double dot_lkl_y_410 = trr_10y * dot_lkl_z_400; + double dot_lkl_y_411 = trr_10y * dot_lkl_z_401; + double dot_lkl_y_420 = trr_20y * dot_lkl_z_400; + vj_ij_001 += fac * dot_lkl_y_001 + trr_01x * dot_lkl_y_101 + trr_02x * dot_lkl_y_201 + trr_03x * dot_lkl_y_301 + trr_04x * dot_lkl_y_401; + vj_ij_002 += fac * dot_lkl_y_002 + trr_01x * dot_lkl_y_102 + trr_02x * dot_lkl_y_202 + trr_03x * dot_lkl_y_302 + trr_04x * dot_lkl_y_402; + vj_ij_010 += fac * dot_lkl_y_010 + trr_01x * dot_lkl_y_110 + trr_02x * dot_lkl_y_210 + trr_03x * dot_lkl_y_310 + trr_04x * dot_lkl_y_410; + vj_ij_011 += fac * dot_lkl_y_011 + trr_01x * dot_lkl_y_111 + trr_02x * dot_lkl_y_211 + trr_03x * dot_lkl_y_311 + trr_04x * dot_lkl_y_411; + vj_ij_020 += fac * dot_lkl_y_020 + trr_01x * dot_lkl_y_120 + trr_02x * dot_lkl_y_220 + trr_03x * dot_lkl_y_320 + trr_04x * dot_lkl_y_420; + vj_ij_100 += trr_10x * dot_lkl_y_000 + trr_11x * dot_lkl_y_100 + trr_12x * dot_lkl_y_200 + trr_13x * dot_lkl_y_300 + trr_14x * dot_lkl_y_400; + vj_ij_101 += trr_10x * dot_lkl_y_001 + trr_11x * dot_lkl_y_101 + trr_12x * dot_lkl_y_201 + trr_13x * dot_lkl_y_301 + trr_14x * dot_lkl_y_401; + vj_ij_110 += trr_10x * dot_lkl_y_010 + trr_11x * dot_lkl_y_110 + trr_12x * dot_lkl_y_210 + trr_13x * dot_lkl_y_310 + trr_14x * dot_lkl_y_410; + vj_ij_200 += trr_20x * dot_lkl_y_000 + trr_21x * dot_lkl_y_100 + trr_22x * dot_lkl_y_200 + trr_23x * dot_lkl_y_300 + trr_24x * dot_lkl_y_400; + } + } + } + if (task_id >= ntasks) { + continue; + } + double *vj = jk.vj; + atomicAdd(vj+ij_pair0+1, vj_ij_001); + atomicAdd(vj+ij_pair0+2, vj_ij_002); + atomicAdd(vj+ij_pair0+3, vj_ij_010); + atomicAdd(vj+ij_pair0+4, vj_ij_011); + atomicAdd(vj+ij_pair0+5, vj_ij_020); + atomicAdd(vj+ij_pair0+6, vj_ij_100); + atomicAdd(vj+ij_pair0+7, vj_ij_101); + atomicAdd(vj+ij_pair0+8, vj_ij_110); + atomicAdd(vj+ij_pair0+9, vj_ij_200); + atomicAdd(vj+kl_pair0+2, vj_kl_002); + atomicAdd(vj+kl_pair0+3, vj_kl_003); + atomicAdd(vj+kl_pair0+4, vj_kl_004); + atomicAdd(vj+kl_pair0+6, vj_kl_011); + atomicAdd(vj+kl_pair0+7, vj_kl_012); + atomicAdd(vj+kl_pair0+8, vj_kl_013); + atomicAdd(vj+kl_pair0+9, vj_kl_020); + atomicAdd(vj+kl_pair0+10, vj_kl_021); + atomicAdd(vj+kl_pair0+11, vj_kl_022); + atomicAdd(vj+kl_pair0+12, vj_kl_030); + atomicAdd(vj+kl_pair0+13, vj_kl_031); + atomicAdd(vj+kl_pair0+14, vj_kl_040); + atomicAdd(vj+kl_pair0+16, vj_kl_101); + atomicAdd(vj+kl_pair0+17, vj_kl_102); + atomicAdd(vj+kl_pair0+18, vj_kl_103); + atomicAdd(vj+kl_pair0+19, vj_kl_110); + atomicAdd(vj+kl_pair0+20, vj_kl_111); + atomicAdd(vj+kl_pair0+21, vj_kl_112); + atomicAdd(vj+kl_pair0+22, vj_kl_120); + atomicAdd(vj+kl_pair0+23, vj_kl_121); + atomicAdd(vj+kl_pair0+24, vj_kl_130); + atomicAdd(vj+kl_pair0+25, vj_kl_200); + atomicAdd(vj+kl_pair0+26, vj_kl_201); + atomicAdd(vj+kl_pair0+27, vj_kl_202); + atomicAdd(vj+kl_pair0+28, vj_kl_210); + atomicAdd(vj+kl_pair0+29, vj_kl_211); + atomicAdd(vj+kl_pair0+30, vj_kl_220); + atomicAdd(vj+kl_pair0+31, vj_kl_300); + atomicAdd(vj+kl_pair0+32, vj_kl_301); + atomicAdd(vj+kl_pair0+33, vj_kl_310); + atomicAdd(vj+kl_pair0+34, vj_kl_400); + } +} +__global__ +void rys_j_2_4(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_j_2_4(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_j_3_0(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int nbas = envs.nbas; + int *bas = envs.bas; + int *pair_loc = envs.ao_loc; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int ij_pair0 = pair_loc[ish*nbas+jsh]; + int kl_pair0 = pair_loc[ksh*nbas+lsh]; + double gout_2_0 = 0.; + double gout_3_0 = 0.; + double gout_5_0 = 0.; + double gout_6_0 = 0.; + double gout_7_0 = 0.; + double gout_8_0 = 0.; + double gout_9_0 = 0.; + double gout_11_0 = 0.; + double gout_12_0 = 0.; + double gout_13_0 = 0.; + double gout_14_0 = 0.; + double gout_15_0 = 0.; + double gout_16_0 = 0.; + double gout_17_0 = 0.; + double gout_18_0 = 0.; + double gout_19_0 = 0.; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(2, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(2, theta_fac*theta_rr, rw); + fac *= sqrt(theta_fac); + for (int irys = 0; irys < 2; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + } + } + for (int irys = 0; irys < 2; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + gout_2_0 += fac * 1 * trr_20z; + double trr_30z = c0z * trr_20z + 2*b10 * trr_10z; + gout_3_0 += fac * 1 * trr_30z; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout_5_0 += fac * trr_10y * trr_10z; + gout_6_0 += fac * trr_10y * trr_20z; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + gout_7_0 += fac * trr_20y * wt; + gout_8_0 += fac * trr_20y * trr_10z; + double trr_30y = c0y * trr_20y + 2*b10 * trr_10y; + gout_9_0 += fac * trr_30y * wt; + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + gout_11_0 += trr_10x * 1 * trr_10z; + gout_12_0 += trr_10x * 1 * trr_20z; + gout_13_0 += trr_10x * trr_10y * wt; + gout_14_0 += trr_10x * trr_10y * trr_10z; + gout_15_0 += trr_10x * trr_20y * wt; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + gout_16_0 += trr_20x * 1 * wt; + gout_17_0 += trr_20x * 1 * trr_10z; + gout_18_0 += trr_20x * trr_10y * wt; + double trr_30x = c0x * trr_20x + 2*b10 * trr_10x; + gout_19_0 += trr_30x * 1 * wt; + } + } + } + if (task_id >= ntasks) { + continue; + } + int nao_pairs = pair_loc[nbas*nbas]; + double *vj = jk.vj; + double *dm = jk.dm; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + atomicAdd(vj+ij_pair0+2, gout_2_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+3, gout_3_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+5, gout_5_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+6, gout_6_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+7, gout_7_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+8, gout_8_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+9, gout_9_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+11, gout_11_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+12, gout_12_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+13, gout_13_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+14, gout_14_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+15, gout_15_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+16, gout_16_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+17, gout_17_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+18, gout_18_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+19, gout_19_0*dm[kl_pair0+0]); + atomicAdd(vj+kl_pair0+0, gout_2_0*dm[ij_pair0+2] + gout_3_0*dm[ij_pair0+3] + gout_5_0*dm[ij_pair0+5] + gout_6_0*dm[ij_pair0+6] + gout_7_0*dm[ij_pair0+7] + gout_8_0*dm[ij_pair0+8] + gout_9_0*dm[ij_pair0+9] + gout_11_0*dm[ij_pair0+11] + gout_12_0*dm[ij_pair0+12] + gout_13_0*dm[ij_pair0+13] + gout_14_0*dm[ij_pair0+14] + gout_15_0*dm[ij_pair0+15] + gout_16_0*dm[ij_pair0+16] + gout_17_0*dm[ij_pair0+17] + gout_18_0*dm[ij_pair0+18] + gout_19_0*dm[ij_pair0+19]); + vj += nao_pairs; + dm += nao_pairs; + } + } +} +__global__ +void rys_j_3_0(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_j_3_0(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_j_3_1(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int nbas = envs.nbas; + int *bas = envs.bas; + int *pair_loc = envs.ao_loc; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int ij_pair0 = pair_loc[ish*nbas+jsh]; + int kl_pair0 = pair_loc[ksh*nbas+lsh]; + double gout_2_1 = 0.; + double gout_2_2 = 0.; + double gout_2_3 = 0.; + double gout_3_1 = 0.; + double gout_3_2 = 0.; + double gout_3_3 = 0.; + double gout_5_1 = 0.; + double gout_5_2 = 0.; + double gout_5_3 = 0.; + double gout_6_1 = 0.; + double gout_6_2 = 0.; + double gout_6_3 = 0.; + double gout_7_1 = 0.; + double gout_7_2 = 0.; + double gout_7_3 = 0.; + double gout_8_1 = 0.; + double gout_8_2 = 0.; + double gout_8_3 = 0.; + double gout_9_1 = 0.; + double gout_9_2 = 0.; + double gout_9_3 = 0.; + double gout_11_1 = 0.; + double gout_11_2 = 0.; + double gout_11_3 = 0.; + double gout_12_1 = 0.; + double gout_12_2 = 0.; + double gout_12_3 = 0.; + double gout_13_1 = 0.; + double gout_13_2 = 0.; + double gout_13_3 = 0.; + double gout_14_1 = 0.; + double gout_14_2 = 0.; + double gout_14_3 = 0.; + double gout_15_1 = 0.; + double gout_15_2 = 0.; + double gout_15_3 = 0.; + double gout_16_1 = 0.; + double gout_16_2 = 0.; + double gout_16_3 = 0.; + double gout_17_1 = 0.; + double gout_17_2 = 0.; + double gout_17_3 = 0.; + double gout_18_1 = 0.; + double gout_18_2 = 0.; + double gout_18_3 = 0.; + double gout_19_1 = 0.; + double gout_19_2 = 0.; + double gout_19_3 = 0.; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(3, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(3, theta_fac*theta_rr, rw); + fac *= sqrt(theta_fac); + for (int irys = 0; irys < 3; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + } + } + for (int irys = 0; irys < 3; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double b00 = .5 * rt_aa; + double rt_akl = rt_aa * aij; + double cpz = zqc + zpq*rt_akl; + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + double trr_21z = cpz * trr_20z + 2*b00 * trr_10z; + gout_2_1 += fac * 1 * trr_21z; + double cpy = yqc + ypq*rt_akl; + double trr_01y = cpy * 1; + gout_2_2 += fac * trr_01y * trr_20z; + double cpx = xqc + xpq*rt_akl; + double trr_01x = cpx * fac; + gout_2_3 += trr_01x * 1 * trr_20z; + double trr_30z = c0z * trr_20z + 2*b10 * trr_10z; + double trr_31z = cpz * trr_30z + 3*b00 * trr_20z; + gout_3_1 += fac * 1 * trr_31z; + gout_3_2 += fac * trr_01y * trr_30z; + gout_3_3 += trr_01x * 1 * trr_30z; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + double trr_11z = cpz * trr_10z + 1*b00 * wt; + gout_5_1 += fac * trr_10y * trr_11z; + double trr_11y = cpy * trr_10y + 1*b00 * 1; + gout_5_2 += fac * trr_11y * trr_10z; + gout_5_3 += trr_01x * trr_10y * trr_10z; + gout_6_1 += fac * trr_10y * trr_21z; + gout_6_2 += fac * trr_11y * trr_20z; + gout_6_3 += trr_01x * trr_10y * trr_20z; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + double trr_01z = cpz * wt; + gout_7_1 += fac * trr_20y * trr_01z; + double trr_21y = cpy * trr_20y + 2*b00 * trr_10y; + gout_7_2 += fac * trr_21y * wt; + gout_7_3 += trr_01x * trr_20y * wt; + gout_8_1 += fac * trr_20y * trr_11z; + gout_8_2 += fac * trr_21y * trr_10z; + gout_8_3 += trr_01x * trr_20y * trr_10z; + double trr_30y = c0y * trr_20y + 2*b10 * trr_10y; + gout_9_1 += fac * trr_30y * trr_01z; + double trr_31y = cpy * trr_30y + 3*b00 * trr_20y; + gout_9_2 += fac * trr_31y * wt; + gout_9_3 += trr_01x * trr_30y * wt; + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + gout_11_1 += trr_10x * 1 * trr_11z; + gout_11_2 += trr_10x * trr_01y * trr_10z; + double trr_11x = cpx * trr_10x + 1*b00 * fac; + gout_11_3 += trr_11x * 1 * trr_10z; + gout_12_1 += trr_10x * 1 * trr_21z; + gout_12_2 += trr_10x * trr_01y * trr_20z; + gout_12_3 += trr_11x * 1 * trr_20z; + gout_13_1 += trr_10x * trr_10y * trr_01z; + gout_13_2 += trr_10x * trr_11y * wt; + gout_13_3 += trr_11x * trr_10y * wt; + gout_14_1 += trr_10x * trr_10y * trr_11z; + gout_14_2 += trr_10x * trr_11y * trr_10z; + gout_14_3 += trr_11x * trr_10y * trr_10z; + gout_15_1 += trr_10x * trr_20y * trr_01z; + gout_15_2 += trr_10x * trr_21y * wt; + gout_15_3 += trr_11x * trr_20y * wt; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + gout_16_1 += trr_20x * 1 * trr_01z; + gout_16_2 += trr_20x * trr_01y * wt; + double trr_21x = cpx * trr_20x + 2*b00 * trr_10x; + gout_16_3 += trr_21x * 1 * wt; + gout_17_1 += trr_20x * 1 * trr_11z; + gout_17_2 += trr_20x * trr_01y * trr_10z; + gout_17_3 += trr_21x * 1 * trr_10z; + gout_18_1 += trr_20x * trr_10y * trr_01z; + gout_18_2 += trr_20x * trr_11y * wt; + gout_18_3 += trr_21x * trr_10y * wt; + double trr_30x = c0x * trr_20x + 2*b10 * trr_10x; + gout_19_1 += trr_30x * 1 * trr_01z; + gout_19_2 += trr_30x * trr_01y * wt; + double trr_31x = cpx * trr_30x + 3*b00 * trr_20x; + gout_19_3 += trr_31x * 1 * wt; + } + } + } + if (task_id >= ntasks) { + continue; + } + int nao_pairs = pair_loc[nbas*nbas]; + double *vj = jk.vj; + double *dm = jk.dm; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + atomicAdd(vj+ij_pair0+2, gout_2_1*dm[kl_pair0+1] + gout_2_2*dm[kl_pair0+2] + gout_2_3*dm[kl_pair0+3]); + atomicAdd(vj+ij_pair0+3, gout_3_1*dm[kl_pair0+1] + gout_3_2*dm[kl_pair0+2] + gout_3_3*dm[kl_pair0+3]); + atomicAdd(vj+ij_pair0+5, gout_5_1*dm[kl_pair0+1] + gout_5_2*dm[kl_pair0+2] + gout_5_3*dm[kl_pair0+3]); + atomicAdd(vj+ij_pair0+6, gout_6_1*dm[kl_pair0+1] + gout_6_2*dm[kl_pair0+2] + gout_6_3*dm[kl_pair0+3]); + atomicAdd(vj+ij_pair0+7, gout_7_1*dm[kl_pair0+1] + gout_7_2*dm[kl_pair0+2] + gout_7_3*dm[kl_pair0+3]); + atomicAdd(vj+ij_pair0+8, gout_8_1*dm[kl_pair0+1] + gout_8_2*dm[kl_pair0+2] + gout_8_3*dm[kl_pair0+3]); + atomicAdd(vj+ij_pair0+9, gout_9_1*dm[kl_pair0+1] + gout_9_2*dm[kl_pair0+2] + gout_9_3*dm[kl_pair0+3]); + atomicAdd(vj+ij_pair0+11, gout_11_1*dm[kl_pair0+1] + gout_11_2*dm[kl_pair0+2] + gout_11_3*dm[kl_pair0+3]); + atomicAdd(vj+ij_pair0+12, gout_12_1*dm[kl_pair0+1] + gout_12_2*dm[kl_pair0+2] + gout_12_3*dm[kl_pair0+3]); + atomicAdd(vj+ij_pair0+13, gout_13_1*dm[kl_pair0+1] + gout_13_2*dm[kl_pair0+2] + gout_13_3*dm[kl_pair0+3]); + atomicAdd(vj+ij_pair0+14, gout_14_1*dm[kl_pair0+1] + gout_14_2*dm[kl_pair0+2] + gout_14_3*dm[kl_pair0+3]); + atomicAdd(vj+ij_pair0+15, gout_15_1*dm[kl_pair0+1] + gout_15_2*dm[kl_pair0+2] + gout_15_3*dm[kl_pair0+3]); + atomicAdd(vj+ij_pair0+16, gout_16_1*dm[kl_pair0+1] + gout_16_2*dm[kl_pair0+2] + gout_16_3*dm[kl_pair0+3]); + atomicAdd(vj+ij_pair0+17, gout_17_1*dm[kl_pair0+1] + gout_17_2*dm[kl_pair0+2] + gout_17_3*dm[kl_pair0+3]); + atomicAdd(vj+ij_pair0+18, gout_18_1*dm[kl_pair0+1] + gout_18_2*dm[kl_pair0+2] + gout_18_3*dm[kl_pair0+3]); + atomicAdd(vj+ij_pair0+19, gout_19_1*dm[kl_pair0+1] + gout_19_2*dm[kl_pair0+2] + gout_19_3*dm[kl_pair0+3]); + atomicAdd(vj+kl_pair0+1, gout_2_1*dm[ij_pair0+2] + gout_3_1*dm[ij_pair0+3] + gout_5_1*dm[ij_pair0+5] + gout_6_1*dm[ij_pair0+6] + gout_7_1*dm[ij_pair0+7] + gout_8_1*dm[ij_pair0+8] + gout_9_1*dm[ij_pair0+9] + gout_11_1*dm[ij_pair0+11] + gout_12_1*dm[ij_pair0+12] + gout_13_1*dm[ij_pair0+13] + gout_14_1*dm[ij_pair0+14] + gout_15_1*dm[ij_pair0+15] + gout_16_1*dm[ij_pair0+16] + gout_17_1*dm[ij_pair0+17] + gout_18_1*dm[ij_pair0+18] + gout_19_1*dm[ij_pair0+19]); + atomicAdd(vj+kl_pair0+2, gout_2_2*dm[ij_pair0+2] + gout_3_2*dm[ij_pair0+3] + gout_5_2*dm[ij_pair0+5] + gout_6_2*dm[ij_pair0+6] + gout_7_2*dm[ij_pair0+7] + gout_8_2*dm[ij_pair0+8] + gout_9_2*dm[ij_pair0+9] + gout_11_2*dm[ij_pair0+11] + gout_12_2*dm[ij_pair0+12] + gout_13_2*dm[ij_pair0+13] + gout_14_2*dm[ij_pair0+14] + gout_15_2*dm[ij_pair0+15] + gout_16_2*dm[ij_pair0+16] + gout_17_2*dm[ij_pair0+17] + gout_18_2*dm[ij_pair0+18] + gout_19_2*dm[ij_pair0+19]); + atomicAdd(vj+kl_pair0+3, gout_2_3*dm[ij_pair0+2] + gout_3_3*dm[ij_pair0+3] + gout_5_3*dm[ij_pair0+5] + gout_6_3*dm[ij_pair0+6] + gout_7_3*dm[ij_pair0+7] + gout_8_3*dm[ij_pair0+8] + gout_9_3*dm[ij_pair0+9] + gout_11_3*dm[ij_pair0+11] + gout_12_3*dm[ij_pair0+12] + gout_13_3*dm[ij_pair0+13] + gout_14_3*dm[ij_pair0+14] + gout_15_3*dm[ij_pair0+15] + gout_16_3*dm[ij_pair0+16] + gout_17_3*dm[ij_pair0+17] + gout_18_3*dm[ij_pair0+18] + gout_19_3*dm[ij_pair0+19]); + vj += nao_pairs; + dm += nao_pairs; + } + } +} +__global__ +void rys_j_3_1(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_j_3_1(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_j_3_2(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int nbas = envs.nbas; + int *bas = envs.bas; + int *pair_loc = envs.ao_loc; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *dm_ij_cache = Rpa_cicj + iprim*jprim*TILE2*4; + double *rw = dm_ij_cache + 20*TILE2; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double *dm = jk.dm; + for (int n = sq_id; n < 20*TILE2; n += nsq_per_block) { + int m = n / TILE2; + int ij_sh = n % TILE2; + int ish = ish0 + ij_sh / TILE; + int jsh = jsh0 + ij_sh % TILE; + int ij_pair0 = pair_loc[ish*nbas+jsh]; + dm_ij_cache[ij_sh+m*TILE2] = dm[ij_pair0+m]; + } + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int ij_pair0 = pair_loc[ish*nbas+jsh]; + int kl_pair0 = pair_loc[ksh*nbas+lsh]; + double dm_kl_001 = dm[kl_pair0+1]; + double dm_kl_002 = dm[kl_pair0+2]; + double dm_kl_010 = dm[kl_pair0+3]; + double dm_kl_011 = dm[kl_pair0+4]; + double dm_kl_020 = dm[kl_pair0+5]; + double dm_kl_100 = dm[kl_pair0+6]; + double dm_kl_101 = dm[kl_pair0+7]; + double dm_kl_110 = dm[kl_pair0+8]; + double dm_kl_200 = dm[kl_pair0+9]; + double vj_ij_002 = 0; + double vj_ij_003 = 0; + double vj_ij_011 = 0; + double vj_ij_012 = 0; + double vj_ij_020 = 0; + double vj_ij_021 = 0; + double vj_ij_030 = 0; + double vj_ij_101 = 0; + double vj_ij_102 = 0; + double vj_ij_110 = 0; + double vj_ij_111 = 0; + double vj_ij_120 = 0; + double vj_ij_200 = 0; + double vj_ij_201 = 0; + double vj_ij_210 = 0; + double vj_ij_300 = 0; + double vj_kl_001 = 0; + double vj_kl_002 = 0; + double vj_kl_010 = 0; + double vj_kl_011 = 0; + double vj_kl_020 = 0; + double vj_kl_100 = 0; + double vj_kl_101 = 0; + double vj_kl_110 = 0; + double vj_kl_200 = 0; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(3, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(3, theta_fac*theta_rr, rw); + fac *= sqrt(theta_fac); + for (int irys = 0; irys < 3; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + } + } + for (int irys = 0; irys < 3; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double b00 = .5 * rt_aa; + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + double trr_30z = c0z * trr_20z + 2*b10 * trr_10z; + double dot_lij_z_000 = trr_20z * dm_ij_cache[sh_ij+2*TILE2] + trr_30z * dm_ij_cache[sh_ij+3*TILE2]; + double rt_akl = rt_aa * aij; + double b01 = .5/akl * (1 - rt_akl); + double cpz = zqc + zpq*rt_akl; + double trr_21z = cpz * trr_20z + 2*b00 * trr_10z; + double trr_31z = cpz * trr_30z + 3*b00 * trr_20z; + double dot_lij_z_001 = trr_21z * dm_ij_cache[sh_ij+2*TILE2] + trr_31z * dm_ij_cache[sh_ij+3*TILE2]; + double trr_11z = cpz * trr_10z + 1*b00 * wt; + double trr_22z = cpz * trr_21z + 1*b01 * trr_20z + 2*b00 * trr_11z; + double trr_32z = cpz * trr_31z + 1*b01 * trr_30z + 3*b00 * trr_21z; + double dot_lij_z_002 = trr_22z * dm_ij_cache[sh_ij+2*TILE2] + trr_32z * dm_ij_cache[sh_ij+3*TILE2]; + double dot_lij_z_010 = trr_10z * dm_ij_cache[sh_ij+5*TILE2] + trr_20z * dm_ij_cache[sh_ij+6*TILE2]; + double dot_lij_z_011 = trr_11z * dm_ij_cache[sh_ij+5*TILE2] + trr_21z * dm_ij_cache[sh_ij+6*TILE2]; + double trr_01z = cpz * wt; + double trr_12z = cpz * trr_11z + 1*b01 * trr_10z + 1*b00 * trr_01z; + double dot_lij_z_012 = trr_12z * dm_ij_cache[sh_ij+5*TILE2] + trr_22z * dm_ij_cache[sh_ij+6*TILE2]; + double dot_lij_z_020 = wt * dm_ij_cache[sh_ij+7*TILE2] + trr_10z * dm_ij_cache[sh_ij+8*TILE2]; + double dot_lij_z_021 = trr_01z * dm_ij_cache[sh_ij+7*TILE2] + trr_11z * dm_ij_cache[sh_ij+8*TILE2]; + double trr_02z = cpz * trr_01z + 1*b01 * wt; + double dot_lij_z_022 = trr_02z * dm_ij_cache[sh_ij+7*TILE2] + trr_12z * dm_ij_cache[sh_ij+8*TILE2]; + double dot_lij_z_030 = wt * dm_ij_cache[sh_ij+9*TILE2]; + double dot_lij_z_031 = trr_01z * dm_ij_cache[sh_ij+9*TILE2]; + double dot_lij_z_032 = trr_02z * dm_ij_cache[sh_ij+9*TILE2]; + double dot_lij_z_100 = trr_10z * dm_ij_cache[sh_ij+11*TILE2] + trr_20z * dm_ij_cache[sh_ij+12*TILE2]; + double dot_lij_z_101 = trr_11z * dm_ij_cache[sh_ij+11*TILE2] + trr_21z * dm_ij_cache[sh_ij+12*TILE2]; + double dot_lij_z_102 = trr_12z * dm_ij_cache[sh_ij+11*TILE2] + trr_22z * dm_ij_cache[sh_ij+12*TILE2]; + double dot_lij_z_110 = wt * dm_ij_cache[sh_ij+13*TILE2] + trr_10z * dm_ij_cache[sh_ij+14*TILE2]; + double dot_lij_z_111 = trr_01z * dm_ij_cache[sh_ij+13*TILE2] + trr_11z * dm_ij_cache[sh_ij+14*TILE2]; + double dot_lij_z_112 = trr_02z * dm_ij_cache[sh_ij+13*TILE2] + trr_12z * dm_ij_cache[sh_ij+14*TILE2]; + double dot_lij_z_120 = wt * dm_ij_cache[sh_ij+15*TILE2]; + double dot_lij_z_121 = trr_01z * dm_ij_cache[sh_ij+15*TILE2]; + double dot_lij_z_122 = trr_02z * dm_ij_cache[sh_ij+15*TILE2]; + double dot_lij_z_200 = wt * dm_ij_cache[sh_ij+16*TILE2] + trr_10z * dm_ij_cache[sh_ij+17*TILE2]; + double dot_lij_z_201 = trr_01z * dm_ij_cache[sh_ij+16*TILE2] + trr_11z * dm_ij_cache[sh_ij+17*TILE2]; + double dot_lij_z_202 = trr_02z * dm_ij_cache[sh_ij+16*TILE2] + trr_12z * dm_ij_cache[sh_ij+17*TILE2]; + double dot_lij_z_210 = wt * dm_ij_cache[sh_ij+18*TILE2]; + double dot_lij_z_211 = trr_01z * dm_ij_cache[sh_ij+18*TILE2]; + double dot_lij_z_212 = trr_02z * dm_ij_cache[sh_ij+18*TILE2]; + double dot_lij_z_300 = wt * dm_ij_cache[sh_ij+19*TILE2]; + double dot_lij_z_301 = trr_01z * dm_ij_cache[sh_ij+19*TILE2]; + double dot_lij_z_302 = trr_02z * dm_ij_cache[sh_ij+19*TILE2]; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + double trr_30y = c0y * trr_20y + 2*b10 * trr_10y; + double dot_lij_y_000 = 1 * dot_lij_z_000 + trr_10y * dot_lij_z_010 + trr_20y * dot_lij_z_020 + trr_30y * dot_lij_z_030; + double dot_lij_y_001 = 1 * dot_lij_z_001 + trr_10y * dot_lij_z_011 + trr_20y * dot_lij_z_021 + trr_30y * dot_lij_z_031; + double dot_lij_y_002 = 1 * dot_lij_z_002 + trr_10y * dot_lij_z_012 + trr_20y * dot_lij_z_022 + trr_30y * dot_lij_z_032; + double cpy = yqc + ypq*rt_akl; + double trr_01y = cpy * 1; + double trr_11y = cpy * trr_10y + 1*b00 * 1; + double trr_21y = cpy * trr_20y + 2*b00 * trr_10y; + double trr_31y = cpy * trr_30y + 3*b00 * trr_20y; + double dot_lij_y_010 = trr_01y * dot_lij_z_000 + trr_11y * dot_lij_z_010 + trr_21y * dot_lij_z_020 + trr_31y * dot_lij_z_030; + double dot_lij_y_011 = trr_01y * dot_lij_z_001 + trr_11y * dot_lij_z_011 + trr_21y * dot_lij_z_021 + trr_31y * dot_lij_z_031; + double trr_02y = cpy * trr_01y + 1*b01 * 1; + double trr_12y = cpy * trr_11y + 1*b01 * trr_10y + 1*b00 * trr_01y; + double trr_22y = cpy * trr_21y + 1*b01 * trr_20y + 2*b00 * trr_11y; + double trr_32y = cpy * trr_31y + 1*b01 * trr_30y + 3*b00 * trr_21y; + double dot_lij_y_020 = trr_02y * dot_lij_z_000 + trr_12y * dot_lij_z_010 + trr_22y * dot_lij_z_020 + trr_32y * dot_lij_z_030; + double dot_lij_y_100 = 1 * dot_lij_z_100 + trr_10y * dot_lij_z_110 + trr_20y * dot_lij_z_120; + double dot_lij_y_101 = 1 * dot_lij_z_101 + trr_10y * dot_lij_z_111 + trr_20y * dot_lij_z_121; + double dot_lij_y_102 = 1 * dot_lij_z_102 + trr_10y * dot_lij_z_112 + trr_20y * dot_lij_z_122; + double dot_lij_y_110 = trr_01y * dot_lij_z_100 + trr_11y * dot_lij_z_110 + trr_21y * dot_lij_z_120; + double dot_lij_y_111 = trr_01y * dot_lij_z_101 + trr_11y * dot_lij_z_111 + trr_21y * dot_lij_z_121; + double dot_lij_y_120 = trr_02y * dot_lij_z_100 + trr_12y * dot_lij_z_110 + trr_22y * dot_lij_z_120; + double dot_lij_y_200 = 1 * dot_lij_z_200 + trr_10y * dot_lij_z_210; + double dot_lij_y_201 = 1 * dot_lij_z_201 + trr_10y * dot_lij_z_211; + double dot_lij_y_202 = 1 * dot_lij_z_202 + trr_10y * dot_lij_z_212; + double dot_lij_y_210 = trr_01y * dot_lij_z_200 + trr_11y * dot_lij_z_210; + double dot_lij_y_211 = trr_01y * dot_lij_z_201 + trr_11y * dot_lij_z_211; + double dot_lij_y_220 = trr_02y * dot_lij_z_200 + trr_12y * dot_lij_z_210; + double dot_lij_y_300 = 1 * dot_lij_z_300; + double dot_lij_y_301 = 1 * dot_lij_z_301; + double dot_lij_y_302 = 1 * dot_lij_z_302; + double dot_lij_y_310 = trr_01y * dot_lij_z_300; + double dot_lij_y_311 = trr_01y * dot_lij_z_301; + double dot_lij_y_320 = trr_02y * dot_lij_z_300; + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + double trr_30x = c0x * trr_20x + 2*b10 * trr_10x; + vj_kl_001 += fac * dot_lij_y_001 + trr_10x * dot_lij_y_101 + trr_20x * dot_lij_y_201 + trr_30x * dot_lij_y_301; + vj_kl_002 += fac * dot_lij_y_002 + trr_10x * dot_lij_y_102 + trr_20x * dot_lij_y_202 + trr_30x * dot_lij_y_302; + vj_kl_010 += fac * dot_lij_y_010 + trr_10x * dot_lij_y_110 + trr_20x * dot_lij_y_210 + trr_30x * dot_lij_y_310; + vj_kl_011 += fac * dot_lij_y_011 + trr_10x * dot_lij_y_111 + trr_20x * dot_lij_y_211 + trr_30x * dot_lij_y_311; + vj_kl_020 += fac * dot_lij_y_020 + trr_10x * dot_lij_y_120 + trr_20x * dot_lij_y_220 + trr_30x * dot_lij_y_320; + double cpx = xqc + xpq*rt_akl; + double trr_01x = cpx * fac; + double trr_11x = cpx * trr_10x + 1*b00 * fac; + double trr_21x = cpx * trr_20x + 2*b00 * trr_10x; + double trr_31x = cpx * trr_30x + 3*b00 * trr_20x; + vj_kl_100 += trr_01x * dot_lij_y_000 + trr_11x * dot_lij_y_100 + trr_21x * dot_lij_y_200 + trr_31x * dot_lij_y_300; + vj_kl_101 += trr_01x * dot_lij_y_001 + trr_11x * dot_lij_y_101 + trr_21x * dot_lij_y_201 + trr_31x * dot_lij_y_301; + vj_kl_110 += trr_01x * dot_lij_y_010 + trr_11x * dot_lij_y_110 + trr_21x * dot_lij_y_210 + trr_31x * dot_lij_y_310; + double trr_02x = cpx * trr_01x + 1*b01 * fac; + double trr_12x = cpx * trr_11x + 1*b01 * trr_10x + 1*b00 * trr_01x; + double trr_22x = cpx * trr_21x + 1*b01 * trr_20x + 2*b00 * trr_11x; + double trr_32x = cpx * trr_31x + 1*b01 * trr_30x + 3*b00 * trr_21x; + vj_kl_200 += trr_02x * dot_lij_y_000 + trr_12x * dot_lij_y_100 + trr_22x * dot_lij_y_200 + trr_32x * dot_lij_y_300; + double dot_lkl_z_000 = trr_01z * dm_kl_001 + trr_02z * dm_kl_002; + double dot_lkl_z_001 = trr_11z * dm_kl_001 + trr_12z * dm_kl_002; + double dot_lkl_z_002 = trr_21z * dm_kl_001 + trr_22z * dm_kl_002; + double dot_lkl_z_003 = trr_31z * dm_kl_001 + trr_32z * dm_kl_002; + double dot_lkl_z_010 = wt * dm_kl_010 + trr_01z * dm_kl_011; + double dot_lkl_z_011 = trr_10z * dm_kl_010 + trr_11z * dm_kl_011; + double dot_lkl_z_012 = trr_20z * dm_kl_010 + trr_21z * dm_kl_011; + double dot_lkl_z_013 = trr_30z * dm_kl_010 + trr_31z * dm_kl_011; + double dot_lkl_z_020 = wt * dm_kl_020; + double dot_lkl_z_021 = trr_10z * dm_kl_020; + double dot_lkl_z_022 = trr_20z * dm_kl_020; + double dot_lkl_z_023 = trr_30z * dm_kl_020; + double dot_lkl_z_100 = wt * dm_kl_100 + trr_01z * dm_kl_101; + double dot_lkl_z_101 = trr_10z * dm_kl_100 + trr_11z * dm_kl_101; + double dot_lkl_z_102 = trr_20z * dm_kl_100 + trr_21z * dm_kl_101; + double dot_lkl_z_103 = trr_30z * dm_kl_100 + trr_31z * dm_kl_101; + double dot_lkl_z_110 = wt * dm_kl_110; + double dot_lkl_z_111 = trr_10z * dm_kl_110; + double dot_lkl_z_112 = trr_20z * dm_kl_110; + double dot_lkl_z_113 = trr_30z * dm_kl_110; + double dot_lkl_z_200 = wt * dm_kl_200; + double dot_lkl_z_201 = trr_10z * dm_kl_200; + double dot_lkl_z_202 = trr_20z * dm_kl_200; + double dot_lkl_z_203 = trr_30z * dm_kl_200; + double dot_lkl_y_000 = 1 * dot_lkl_z_000 + trr_01y * dot_lkl_z_010 + trr_02y * dot_lkl_z_020; + double dot_lkl_y_001 = 1 * dot_lkl_z_001 + trr_01y * dot_lkl_z_011 + trr_02y * dot_lkl_z_021; + double dot_lkl_y_002 = 1 * dot_lkl_z_002 + trr_01y * dot_lkl_z_012 + trr_02y * dot_lkl_z_022; + double dot_lkl_y_003 = 1 * dot_lkl_z_003 + trr_01y * dot_lkl_z_013 + trr_02y * dot_lkl_z_023; + double dot_lkl_y_010 = trr_10y * dot_lkl_z_000 + trr_11y * dot_lkl_z_010 + trr_12y * dot_lkl_z_020; + double dot_lkl_y_011 = trr_10y * dot_lkl_z_001 + trr_11y * dot_lkl_z_011 + trr_12y * dot_lkl_z_021; + double dot_lkl_y_012 = trr_10y * dot_lkl_z_002 + trr_11y * dot_lkl_z_012 + trr_12y * dot_lkl_z_022; + double dot_lkl_y_020 = trr_20y * dot_lkl_z_000 + trr_21y * dot_lkl_z_010 + trr_22y * dot_lkl_z_020; + double dot_lkl_y_021 = trr_20y * dot_lkl_z_001 + trr_21y * dot_lkl_z_011 + trr_22y * dot_lkl_z_021; + double dot_lkl_y_030 = trr_30y * dot_lkl_z_000 + trr_31y * dot_lkl_z_010 + trr_32y * dot_lkl_z_020; + double dot_lkl_y_100 = 1 * dot_lkl_z_100 + trr_01y * dot_lkl_z_110; + double dot_lkl_y_101 = 1 * dot_lkl_z_101 + trr_01y * dot_lkl_z_111; + double dot_lkl_y_102 = 1 * dot_lkl_z_102 + trr_01y * dot_lkl_z_112; + double dot_lkl_y_103 = 1 * dot_lkl_z_103 + trr_01y * dot_lkl_z_113; + double dot_lkl_y_110 = trr_10y * dot_lkl_z_100 + trr_11y * dot_lkl_z_110; + double dot_lkl_y_111 = trr_10y * dot_lkl_z_101 + trr_11y * dot_lkl_z_111; + double dot_lkl_y_112 = trr_10y * dot_lkl_z_102 + trr_11y * dot_lkl_z_112; + double dot_lkl_y_120 = trr_20y * dot_lkl_z_100 + trr_21y * dot_lkl_z_110; + double dot_lkl_y_121 = trr_20y * dot_lkl_z_101 + trr_21y * dot_lkl_z_111; + double dot_lkl_y_130 = trr_30y * dot_lkl_z_100 + trr_31y * dot_lkl_z_110; + double dot_lkl_y_200 = 1 * dot_lkl_z_200; + double dot_lkl_y_201 = 1 * dot_lkl_z_201; + double dot_lkl_y_202 = 1 * dot_lkl_z_202; + double dot_lkl_y_203 = 1 * dot_lkl_z_203; + double dot_lkl_y_210 = trr_10y * dot_lkl_z_200; + double dot_lkl_y_211 = trr_10y * dot_lkl_z_201; + double dot_lkl_y_212 = trr_10y * dot_lkl_z_202; + double dot_lkl_y_220 = trr_20y * dot_lkl_z_200; + double dot_lkl_y_221 = trr_20y * dot_lkl_z_201; + double dot_lkl_y_230 = trr_30y * dot_lkl_z_200; + vj_ij_002 += fac * dot_lkl_y_002 + trr_01x * dot_lkl_y_102 + trr_02x * dot_lkl_y_202; + vj_ij_003 += fac * dot_lkl_y_003 + trr_01x * dot_lkl_y_103 + trr_02x * dot_lkl_y_203; + vj_ij_011 += fac * dot_lkl_y_011 + trr_01x * dot_lkl_y_111 + trr_02x * dot_lkl_y_211; + vj_ij_012 += fac * dot_lkl_y_012 + trr_01x * dot_lkl_y_112 + trr_02x * dot_lkl_y_212; + vj_ij_020 += fac * dot_lkl_y_020 + trr_01x * dot_lkl_y_120 + trr_02x * dot_lkl_y_220; + vj_ij_021 += fac * dot_lkl_y_021 + trr_01x * dot_lkl_y_121 + trr_02x * dot_lkl_y_221; + vj_ij_030 += fac * dot_lkl_y_030 + trr_01x * dot_lkl_y_130 + trr_02x * dot_lkl_y_230; + vj_ij_101 += trr_10x * dot_lkl_y_001 + trr_11x * dot_lkl_y_101 + trr_12x * dot_lkl_y_201; + vj_ij_102 += trr_10x * dot_lkl_y_002 + trr_11x * dot_lkl_y_102 + trr_12x * dot_lkl_y_202; + vj_ij_110 += trr_10x * dot_lkl_y_010 + trr_11x * dot_lkl_y_110 + trr_12x * dot_lkl_y_210; + vj_ij_111 += trr_10x * dot_lkl_y_011 + trr_11x * dot_lkl_y_111 + trr_12x * dot_lkl_y_211; + vj_ij_120 += trr_10x * dot_lkl_y_020 + trr_11x * dot_lkl_y_120 + trr_12x * dot_lkl_y_220; + vj_ij_200 += trr_20x * dot_lkl_y_000 + trr_21x * dot_lkl_y_100 + trr_22x * dot_lkl_y_200; + vj_ij_201 += trr_20x * dot_lkl_y_001 + trr_21x * dot_lkl_y_101 + trr_22x * dot_lkl_y_201; + vj_ij_210 += trr_20x * dot_lkl_y_010 + trr_21x * dot_lkl_y_110 + trr_22x * dot_lkl_y_210; + vj_ij_300 += trr_30x * dot_lkl_y_000 + trr_31x * dot_lkl_y_100 + trr_32x * dot_lkl_y_200; + } + } + } + if (task_id >= ntasks) { + continue; + } + double *vj = jk.vj; + atomicAdd(vj+ij_pair0+2, vj_ij_002); + atomicAdd(vj+ij_pair0+3, vj_ij_003); + atomicAdd(vj+ij_pair0+5, vj_ij_011); + atomicAdd(vj+ij_pair0+6, vj_ij_012); + atomicAdd(vj+ij_pair0+7, vj_ij_020); + atomicAdd(vj+ij_pair0+8, vj_ij_021); + atomicAdd(vj+ij_pair0+9, vj_ij_030); + atomicAdd(vj+ij_pair0+11, vj_ij_101); + atomicAdd(vj+ij_pair0+12, vj_ij_102); + atomicAdd(vj+ij_pair0+13, vj_ij_110); + atomicAdd(vj+ij_pair0+14, vj_ij_111); + atomicAdd(vj+ij_pair0+15, vj_ij_120); + atomicAdd(vj+ij_pair0+16, vj_ij_200); + atomicAdd(vj+ij_pair0+17, vj_ij_201); + atomicAdd(vj+ij_pair0+18, vj_ij_210); + atomicAdd(vj+ij_pair0+19, vj_ij_300); + atomicAdd(vj+kl_pair0+1, vj_kl_001); + atomicAdd(vj+kl_pair0+2, vj_kl_002); + atomicAdd(vj+kl_pair0+3, vj_kl_010); + atomicAdd(vj+kl_pair0+4, vj_kl_011); + atomicAdd(vj+kl_pair0+5, vj_kl_020); + atomicAdd(vj+kl_pair0+6, vj_kl_100); + atomicAdd(vj+kl_pair0+7, vj_kl_101); + atomicAdd(vj+kl_pair0+8, vj_kl_110); + atomicAdd(vj+kl_pair0+9, vj_kl_200); + } +} +__global__ +void rys_j_3_2(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_j_3_2(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_j_3_3(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int nbas = envs.nbas; + int *bas = envs.bas; + int *pair_loc = envs.ao_loc; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *dm_ij_cache = Rpa_cicj + iprim*jprim*TILE2*4; + double *rw = dm_ij_cache + 20*TILE2; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double *dm = jk.dm; + for (int n = sq_id; n < 20*TILE2; n += nsq_per_block) { + int m = n / TILE2; + int ij_sh = n % TILE2; + int ish = ish0 + ij_sh / TILE; + int jsh = jsh0 + ij_sh % TILE; + int ij_pair0 = pair_loc[ish*nbas+jsh]; + dm_ij_cache[ij_sh+m*TILE2] = dm[ij_pair0+m]; + } + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int ij_pair0 = pair_loc[ish*nbas+jsh]; + int kl_pair0 = pair_loc[ksh*nbas+lsh]; + double dm_kl_002 = dm[kl_pair0+2]; + double dm_kl_003 = dm[kl_pair0+3]; + double dm_kl_011 = dm[kl_pair0+5]; + double dm_kl_012 = dm[kl_pair0+6]; + double dm_kl_020 = dm[kl_pair0+7]; + double dm_kl_021 = dm[kl_pair0+8]; + double dm_kl_030 = dm[kl_pair0+9]; + double dm_kl_101 = dm[kl_pair0+11]; + double dm_kl_102 = dm[kl_pair0+12]; + double dm_kl_110 = dm[kl_pair0+13]; + double dm_kl_111 = dm[kl_pair0+14]; + double dm_kl_120 = dm[kl_pair0+15]; + double dm_kl_200 = dm[kl_pair0+16]; + double dm_kl_201 = dm[kl_pair0+17]; + double dm_kl_210 = dm[kl_pair0+18]; + double dm_kl_300 = dm[kl_pair0+19]; + double vj_ij_002 = 0; + double vj_ij_003 = 0; + double vj_ij_011 = 0; + double vj_ij_012 = 0; + double vj_ij_020 = 0; + double vj_ij_021 = 0; + double vj_ij_030 = 0; + double vj_ij_101 = 0; + double vj_ij_102 = 0; + double vj_ij_110 = 0; + double vj_ij_111 = 0; + double vj_ij_120 = 0; + double vj_ij_200 = 0; + double vj_ij_201 = 0; + double vj_ij_210 = 0; + double vj_ij_300 = 0; + double vj_kl_002 = 0; + double vj_kl_003 = 0; + double vj_kl_011 = 0; + double vj_kl_012 = 0; + double vj_kl_020 = 0; + double vj_kl_021 = 0; + double vj_kl_030 = 0; + double vj_kl_101 = 0; + double vj_kl_102 = 0; + double vj_kl_110 = 0; + double vj_kl_111 = 0; + double vj_kl_120 = 0; + double vj_kl_200 = 0; + double vj_kl_201 = 0; + double vj_kl_210 = 0; + double vj_kl_300 = 0; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(4, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(4, theta_fac*theta_rr, rw); + fac *= sqrt(theta_fac); + for (int irys = 0; irys < 4; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + } + } + for (int irys = 0; irys < 4; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double b00 = .5 * rt_aa; + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + double trr_30z = c0z * trr_20z + 2*b10 * trr_10z; + double dot_lij_z_000 = trr_20z * dm_ij_cache[sh_ij+2*TILE2] + trr_30z * dm_ij_cache[sh_ij+3*TILE2]; + double rt_akl = rt_aa * aij; + double b01 = .5/akl * (1 - rt_akl); + double cpz = zqc + zpq*rt_akl; + double trr_21z = cpz * trr_20z + 2*b00 * trr_10z; + double trr_31z = cpz * trr_30z + 3*b00 * trr_20z; + double dot_lij_z_001 = trr_21z * dm_ij_cache[sh_ij+2*TILE2] + trr_31z * dm_ij_cache[sh_ij+3*TILE2]; + double trr_11z = cpz * trr_10z + 1*b00 * wt; + double trr_22z = cpz * trr_21z + 1*b01 * trr_20z + 2*b00 * trr_11z; + double trr_32z = cpz * trr_31z + 1*b01 * trr_30z + 3*b00 * trr_21z; + double dot_lij_z_002 = trr_22z * dm_ij_cache[sh_ij+2*TILE2] + trr_32z * dm_ij_cache[sh_ij+3*TILE2]; + double trr_01z = cpz * wt; + double trr_12z = cpz * trr_11z + 1*b01 * trr_10z + 1*b00 * trr_01z; + double trr_23z = cpz * trr_22z + 2*b01 * trr_21z + 2*b00 * trr_12z; + double trr_33z = cpz * trr_32z + 2*b01 * trr_31z + 3*b00 * trr_22z; + double dot_lij_z_003 = trr_23z * dm_ij_cache[sh_ij+2*TILE2] + trr_33z * dm_ij_cache[sh_ij+3*TILE2]; + double dot_lij_z_010 = trr_10z * dm_ij_cache[sh_ij+5*TILE2] + trr_20z * dm_ij_cache[sh_ij+6*TILE2]; + double dot_lij_z_011 = trr_11z * dm_ij_cache[sh_ij+5*TILE2] + trr_21z * dm_ij_cache[sh_ij+6*TILE2]; + double dot_lij_z_012 = trr_12z * dm_ij_cache[sh_ij+5*TILE2] + trr_22z * dm_ij_cache[sh_ij+6*TILE2]; + double trr_02z = cpz * trr_01z + 1*b01 * wt; + double trr_13z = cpz * trr_12z + 2*b01 * trr_11z + 1*b00 * trr_02z; + double dot_lij_z_013 = trr_13z * dm_ij_cache[sh_ij+5*TILE2] + trr_23z * dm_ij_cache[sh_ij+6*TILE2]; + double dot_lij_z_020 = wt * dm_ij_cache[sh_ij+7*TILE2] + trr_10z * dm_ij_cache[sh_ij+8*TILE2]; + double dot_lij_z_021 = trr_01z * dm_ij_cache[sh_ij+7*TILE2] + trr_11z * dm_ij_cache[sh_ij+8*TILE2]; + double dot_lij_z_022 = trr_02z * dm_ij_cache[sh_ij+7*TILE2] + trr_12z * dm_ij_cache[sh_ij+8*TILE2]; + double trr_03z = cpz * trr_02z + 2*b01 * trr_01z; + double dot_lij_z_023 = trr_03z * dm_ij_cache[sh_ij+7*TILE2] + trr_13z * dm_ij_cache[sh_ij+8*TILE2]; + double dot_lij_z_030 = wt * dm_ij_cache[sh_ij+9*TILE2]; + double dot_lij_z_031 = trr_01z * dm_ij_cache[sh_ij+9*TILE2]; + double dot_lij_z_032 = trr_02z * dm_ij_cache[sh_ij+9*TILE2]; + double dot_lij_z_033 = trr_03z * dm_ij_cache[sh_ij+9*TILE2]; + double dot_lij_z_100 = trr_10z * dm_ij_cache[sh_ij+11*TILE2] + trr_20z * dm_ij_cache[sh_ij+12*TILE2]; + double dot_lij_z_101 = trr_11z * dm_ij_cache[sh_ij+11*TILE2] + trr_21z * dm_ij_cache[sh_ij+12*TILE2]; + double dot_lij_z_102 = trr_12z * dm_ij_cache[sh_ij+11*TILE2] + trr_22z * dm_ij_cache[sh_ij+12*TILE2]; + double dot_lij_z_103 = trr_13z * dm_ij_cache[sh_ij+11*TILE2] + trr_23z * dm_ij_cache[sh_ij+12*TILE2]; + double dot_lij_z_110 = wt * dm_ij_cache[sh_ij+13*TILE2] + trr_10z * dm_ij_cache[sh_ij+14*TILE2]; + double dot_lij_z_111 = trr_01z * dm_ij_cache[sh_ij+13*TILE2] + trr_11z * dm_ij_cache[sh_ij+14*TILE2]; + double dot_lij_z_112 = trr_02z * dm_ij_cache[sh_ij+13*TILE2] + trr_12z * dm_ij_cache[sh_ij+14*TILE2]; + double dot_lij_z_113 = trr_03z * dm_ij_cache[sh_ij+13*TILE2] + trr_13z * dm_ij_cache[sh_ij+14*TILE2]; + double dot_lij_z_120 = wt * dm_ij_cache[sh_ij+15*TILE2]; + double dot_lij_z_121 = trr_01z * dm_ij_cache[sh_ij+15*TILE2]; + double dot_lij_z_122 = trr_02z * dm_ij_cache[sh_ij+15*TILE2]; + double dot_lij_z_123 = trr_03z * dm_ij_cache[sh_ij+15*TILE2]; + double dot_lij_z_200 = wt * dm_ij_cache[sh_ij+16*TILE2] + trr_10z * dm_ij_cache[sh_ij+17*TILE2]; + double dot_lij_z_201 = trr_01z * dm_ij_cache[sh_ij+16*TILE2] + trr_11z * dm_ij_cache[sh_ij+17*TILE2]; + double dot_lij_z_202 = trr_02z * dm_ij_cache[sh_ij+16*TILE2] + trr_12z * dm_ij_cache[sh_ij+17*TILE2]; + double dot_lij_z_203 = trr_03z * dm_ij_cache[sh_ij+16*TILE2] + trr_13z * dm_ij_cache[sh_ij+17*TILE2]; + double dot_lij_z_210 = wt * dm_ij_cache[sh_ij+18*TILE2]; + double dot_lij_z_211 = trr_01z * dm_ij_cache[sh_ij+18*TILE2]; + double dot_lij_z_212 = trr_02z * dm_ij_cache[sh_ij+18*TILE2]; + double dot_lij_z_213 = trr_03z * dm_ij_cache[sh_ij+18*TILE2]; + double dot_lij_z_300 = wt * dm_ij_cache[sh_ij+19*TILE2]; + double dot_lij_z_301 = trr_01z * dm_ij_cache[sh_ij+19*TILE2]; + double dot_lij_z_302 = trr_02z * dm_ij_cache[sh_ij+19*TILE2]; + double dot_lij_z_303 = trr_03z * dm_ij_cache[sh_ij+19*TILE2]; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + double trr_30y = c0y * trr_20y + 2*b10 * trr_10y; + double dot_lij_y_000 = 1 * dot_lij_z_000 + trr_10y * dot_lij_z_010 + trr_20y * dot_lij_z_020 + trr_30y * dot_lij_z_030; + double dot_lij_y_001 = 1 * dot_lij_z_001 + trr_10y * dot_lij_z_011 + trr_20y * dot_lij_z_021 + trr_30y * dot_lij_z_031; + double dot_lij_y_002 = 1 * dot_lij_z_002 + trr_10y * dot_lij_z_012 + trr_20y * dot_lij_z_022 + trr_30y * dot_lij_z_032; + double dot_lij_y_003 = 1 * dot_lij_z_003 + trr_10y * dot_lij_z_013 + trr_20y * dot_lij_z_023 + trr_30y * dot_lij_z_033; + double cpy = yqc + ypq*rt_akl; + double trr_01y = cpy * 1; + double trr_11y = cpy * trr_10y + 1*b00 * 1; + double trr_21y = cpy * trr_20y + 2*b00 * trr_10y; + double trr_31y = cpy * trr_30y + 3*b00 * trr_20y; + double dot_lij_y_010 = trr_01y * dot_lij_z_000 + trr_11y * dot_lij_z_010 + trr_21y * dot_lij_z_020 + trr_31y * dot_lij_z_030; + double dot_lij_y_011 = trr_01y * dot_lij_z_001 + trr_11y * dot_lij_z_011 + trr_21y * dot_lij_z_021 + trr_31y * dot_lij_z_031; + double dot_lij_y_012 = trr_01y * dot_lij_z_002 + trr_11y * dot_lij_z_012 + trr_21y * dot_lij_z_022 + trr_31y * dot_lij_z_032; + double trr_02y = cpy * trr_01y + 1*b01 * 1; + double trr_12y = cpy * trr_11y + 1*b01 * trr_10y + 1*b00 * trr_01y; + double trr_22y = cpy * trr_21y + 1*b01 * trr_20y + 2*b00 * trr_11y; + double trr_32y = cpy * trr_31y + 1*b01 * trr_30y + 3*b00 * trr_21y; + double dot_lij_y_020 = trr_02y * dot_lij_z_000 + trr_12y * dot_lij_z_010 + trr_22y * dot_lij_z_020 + trr_32y * dot_lij_z_030; + double dot_lij_y_021 = trr_02y * dot_lij_z_001 + trr_12y * dot_lij_z_011 + trr_22y * dot_lij_z_021 + trr_32y * dot_lij_z_031; + double trr_03y = cpy * trr_02y + 2*b01 * trr_01y; + double trr_13y = cpy * trr_12y + 2*b01 * trr_11y + 1*b00 * trr_02y; + double trr_23y = cpy * trr_22y + 2*b01 * trr_21y + 2*b00 * trr_12y; + double trr_33y = cpy * trr_32y + 2*b01 * trr_31y + 3*b00 * trr_22y; + double dot_lij_y_030 = trr_03y * dot_lij_z_000 + trr_13y * dot_lij_z_010 + trr_23y * dot_lij_z_020 + trr_33y * dot_lij_z_030; + double dot_lij_y_100 = 1 * dot_lij_z_100 + trr_10y * dot_lij_z_110 + trr_20y * dot_lij_z_120; + double dot_lij_y_101 = 1 * dot_lij_z_101 + trr_10y * dot_lij_z_111 + trr_20y * dot_lij_z_121; + double dot_lij_y_102 = 1 * dot_lij_z_102 + trr_10y * dot_lij_z_112 + trr_20y * dot_lij_z_122; + double dot_lij_y_103 = 1 * dot_lij_z_103 + trr_10y * dot_lij_z_113 + trr_20y * dot_lij_z_123; + double dot_lij_y_110 = trr_01y * dot_lij_z_100 + trr_11y * dot_lij_z_110 + trr_21y * dot_lij_z_120; + double dot_lij_y_111 = trr_01y * dot_lij_z_101 + trr_11y * dot_lij_z_111 + trr_21y * dot_lij_z_121; + double dot_lij_y_112 = trr_01y * dot_lij_z_102 + trr_11y * dot_lij_z_112 + trr_21y * dot_lij_z_122; + double dot_lij_y_120 = trr_02y * dot_lij_z_100 + trr_12y * dot_lij_z_110 + trr_22y * dot_lij_z_120; + double dot_lij_y_121 = trr_02y * dot_lij_z_101 + trr_12y * dot_lij_z_111 + trr_22y * dot_lij_z_121; + double dot_lij_y_130 = trr_03y * dot_lij_z_100 + trr_13y * dot_lij_z_110 + trr_23y * dot_lij_z_120; + double dot_lij_y_200 = 1 * dot_lij_z_200 + trr_10y * dot_lij_z_210; + double dot_lij_y_201 = 1 * dot_lij_z_201 + trr_10y * dot_lij_z_211; + double dot_lij_y_202 = 1 * dot_lij_z_202 + trr_10y * dot_lij_z_212; + double dot_lij_y_203 = 1 * dot_lij_z_203 + trr_10y * dot_lij_z_213; + double dot_lij_y_210 = trr_01y * dot_lij_z_200 + trr_11y * dot_lij_z_210; + double dot_lij_y_211 = trr_01y * dot_lij_z_201 + trr_11y * dot_lij_z_211; + double dot_lij_y_212 = trr_01y * dot_lij_z_202 + trr_11y * dot_lij_z_212; + double dot_lij_y_220 = trr_02y * dot_lij_z_200 + trr_12y * dot_lij_z_210; + double dot_lij_y_221 = trr_02y * dot_lij_z_201 + trr_12y * dot_lij_z_211; + double dot_lij_y_230 = trr_03y * dot_lij_z_200 + trr_13y * dot_lij_z_210; + double dot_lij_y_300 = 1 * dot_lij_z_300; + double dot_lij_y_301 = 1 * dot_lij_z_301; + double dot_lij_y_302 = 1 * dot_lij_z_302; + double dot_lij_y_303 = 1 * dot_lij_z_303; + double dot_lij_y_310 = trr_01y * dot_lij_z_300; + double dot_lij_y_311 = trr_01y * dot_lij_z_301; + double dot_lij_y_312 = trr_01y * dot_lij_z_302; + double dot_lij_y_320 = trr_02y * dot_lij_z_300; + double dot_lij_y_321 = trr_02y * dot_lij_z_301; + double dot_lij_y_330 = trr_03y * dot_lij_z_300; + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + double trr_30x = c0x * trr_20x + 2*b10 * trr_10x; + vj_kl_002 += fac * dot_lij_y_002 + trr_10x * dot_lij_y_102 + trr_20x * dot_lij_y_202 + trr_30x * dot_lij_y_302; + vj_kl_003 += fac * dot_lij_y_003 + trr_10x * dot_lij_y_103 + trr_20x * dot_lij_y_203 + trr_30x * dot_lij_y_303; + vj_kl_011 += fac * dot_lij_y_011 + trr_10x * dot_lij_y_111 + trr_20x * dot_lij_y_211 + trr_30x * dot_lij_y_311; + vj_kl_012 += fac * dot_lij_y_012 + trr_10x * dot_lij_y_112 + trr_20x * dot_lij_y_212 + trr_30x * dot_lij_y_312; + vj_kl_020 += fac * dot_lij_y_020 + trr_10x * dot_lij_y_120 + trr_20x * dot_lij_y_220 + trr_30x * dot_lij_y_320; + vj_kl_021 += fac * dot_lij_y_021 + trr_10x * dot_lij_y_121 + trr_20x * dot_lij_y_221 + trr_30x * dot_lij_y_321; + vj_kl_030 += fac * dot_lij_y_030 + trr_10x * dot_lij_y_130 + trr_20x * dot_lij_y_230 + trr_30x * dot_lij_y_330; + double cpx = xqc + xpq*rt_akl; + double trr_01x = cpx * fac; + double trr_11x = cpx * trr_10x + 1*b00 * fac; + double trr_21x = cpx * trr_20x + 2*b00 * trr_10x; + double trr_31x = cpx * trr_30x + 3*b00 * trr_20x; + vj_kl_101 += trr_01x * dot_lij_y_001 + trr_11x * dot_lij_y_101 + trr_21x * dot_lij_y_201 + trr_31x * dot_lij_y_301; + vj_kl_102 += trr_01x * dot_lij_y_002 + trr_11x * dot_lij_y_102 + trr_21x * dot_lij_y_202 + trr_31x * dot_lij_y_302; + vj_kl_110 += trr_01x * dot_lij_y_010 + trr_11x * dot_lij_y_110 + trr_21x * dot_lij_y_210 + trr_31x * dot_lij_y_310; + vj_kl_111 += trr_01x * dot_lij_y_011 + trr_11x * dot_lij_y_111 + trr_21x * dot_lij_y_211 + trr_31x * dot_lij_y_311; + vj_kl_120 += trr_01x * dot_lij_y_020 + trr_11x * dot_lij_y_120 + trr_21x * dot_lij_y_220 + trr_31x * dot_lij_y_320; + double trr_02x = cpx * trr_01x + 1*b01 * fac; + double trr_12x = cpx * trr_11x + 1*b01 * trr_10x + 1*b00 * trr_01x; + double trr_22x = cpx * trr_21x + 1*b01 * trr_20x + 2*b00 * trr_11x; + double trr_32x = cpx * trr_31x + 1*b01 * trr_30x + 3*b00 * trr_21x; + vj_kl_200 += trr_02x * dot_lij_y_000 + trr_12x * dot_lij_y_100 + trr_22x * dot_lij_y_200 + trr_32x * dot_lij_y_300; + vj_kl_201 += trr_02x * dot_lij_y_001 + trr_12x * dot_lij_y_101 + trr_22x * dot_lij_y_201 + trr_32x * dot_lij_y_301; + vj_kl_210 += trr_02x * dot_lij_y_010 + trr_12x * dot_lij_y_110 + trr_22x * dot_lij_y_210 + trr_32x * dot_lij_y_310; + double trr_03x = cpx * trr_02x + 2*b01 * trr_01x; + double trr_13x = cpx * trr_12x + 2*b01 * trr_11x + 1*b00 * trr_02x; + double trr_23x = cpx * trr_22x + 2*b01 * trr_21x + 2*b00 * trr_12x; + double trr_33x = cpx * trr_32x + 2*b01 * trr_31x + 3*b00 * trr_22x; + vj_kl_300 += trr_03x * dot_lij_y_000 + trr_13x * dot_lij_y_100 + trr_23x * dot_lij_y_200 + trr_33x * dot_lij_y_300; + double dot_lkl_z_000 = trr_02z * dm_kl_002 + trr_03z * dm_kl_003; + double dot_lkl_z_001 = trr_12z * dm_kl_002 + trr_13z * dm_kl_003; + double dot_lkl_z_002 = trr_22z * dm_kl_002 + trr_23z * dm_kl_003; + double dot_lkl_z_003 = trr_32z * dm_kl_002 + trr_33z * dm_kl_003; + double dot_lkl_z_010 = trr_01z * dm_kl_011 + trr_02z * dm_kl_012; + double dot_lkl_z_011 = trr_11z * dm_kl_011 + trr_12z * dm_kl_012; + double dot_lkl_z_012 = trr_21z * dm_kl_011 + trr_22z * dm_kl_012; + double dot_lkl_z_013 = trr_31z * dm_kl_011 + trr_32z * dm_kl_012; + double dot_lkl_z_020 = wt * dm_kl_020 + trr_01z * dm_kl_021; + double dot_lkl_z_021 = trr_10z * dm_kl_020 + trr_11z * dm_kl_021; + double dot_lkl_z_022 = trr_20z * dm_kl_020 + trr_21z * dm_kl_021; + double dot_lkl_z_023 = trr_30z * dm_kl_020 + trr_31z * dm_kl_021; + double dot_lkl_z_030 = wt * dm_kl_030; + double dot_lkl_z_031 = trr_10z * dm_kl_030; + double dot_lkl_z_032 = trr_20z * dm_kl_030; + double dot_lkl_z_033 = trr_30z * dm_kl_030; + double dot_lkl_z_100 = trr_01z * dm_kl_101 + trr_02z * dm_kl_102; + double dot_lkl_z_101 = trr_11z * dm_kl_101 + trr_12z * dm_kl_102; + double dot_lkl_z_102 = trr_21z * dm_kl_101 + trr_22z * dm_kl_102; + double dot_lkl_z_103 = trr_31z * dm_kl_101 + trr_32z * dm_kl_102; + double dot_lkl_z_110 = wt * dm_kl_110 + trr_01z * dm_kl_111; + double dot_lkl_z_111 = trr_10z * dm_kl_110 + trr_11z * dm_kl_111; + double dot_lkl_z_112 = trr_20z * dm_kl_110 + trr_21z * dm_kl_111; + double dot_lkl_z_113 = trr_30z * dm_kl_110 + trr_31z * dm_kl_111; + double dot_lkl_z_120 = wt * dm_kl_120; + double dot_lkl_z_121 = trr_10z * dm_kl_120; + double dot_lkl_z_122 = trr_20z * dm_kl_120; + double dot_lkl_z_123 = trr_30z * dm_kl_120; + double dot_lkl_z_200 = wt * dm_kl_200 + trr_01z * dm_kl_201; + double dot_lkl_z_201 = trr_10z * dm_kl_200 + trr_11z * dm_kl_201; + double dot_lkl_z_202 = trr_20z * dm_kl_200 + trr_21z * dm_kl_201; + double dot_lkl_z_203 = trr_30z * dm_kl_200 + trr_31z * dm_kl_201; + double dot_lkl_z_210 = wt * dm_kl_210; + double dot_lkl_z_211 = trr_10z * dm_kl_210; + double dot_lkl_z_212 = trr_20z * dm_kl_210; + double dot_lkl_z_213 = trr_30z * dm_kl_210; + double dot_lkl_z_300 = wt * dm_kl_300; + double dot_lkl_z_301 = trr_10z * dm_kl_300; + double dot_lkl_z_302 = trr_20z * dm_kl_300; + double dot_lkl_z_303 = trr_30z * dm_kl_300; + double dot_lkl_y_000 = 1 * dot_lkl_z_000 + trr_01y * dot_lkl_z_010 + trr_02y * dot_lkl_z_020 + trr_03y * dot_lkl_z_030; + double dot_lkl_y_001 = 1 * dot_lkl_z_001 + trr_01y * dot_lkl_z_011 + trr_02y * dot_lkl_z_021 + trr_03y * dot_lkl_z_031; + double dot_lkl_y_002 = 1 * dot_lkl_z_002 + trr_01y * dot_lkl_z_012 + trr_02y * dot_lkl_z_022 + trr_03y * dot_lkl_z_032; + double dot_lkl_y_003 = 1 * dot_lkl_z_003 + trr_01y * dot_lkl_z_013 + trr_02y * dot_lkl_z_023 + trr_03y * dot_lkl_z_033; + double dot_lkl_y_010 = trr_10y * dot_lkl_z_000 + trr_11y * dot_lkl_z_010 + trr_12y * dot_lkl_z_020 + trr_13y * dot_lkl_z_030; + double dot_lkl_y_011 = trr_10y * dot_lkl_z_001 + trr_11y * dot_lkl_z_011 + trr_12y * dot_lkl_z_021 + trr_13y * dot_lkl_z_031; + double dot_lkl_y_012 = trr_10y * dot_lkl_z_002 + trr_11y * dot_lkl_z_012 + trr_12y * dot_lkl_z_022 + trr_13y * dot_lkl_z_032; + double dot_lkl_y_020 = trr_20y * dot_lkl_z_000 + trr_21y * dot_lkl_z_010 + trr_22y * dot_lkl_z_020 + trr_23y * dot_lkl_z_030; + double dot_lkl_y_021 = trr_20y * dot_lkl_z_001 + trr_21y * dot_lkl_z_011 + trr_22y * dot_lkl_z_021 + trr_23y * dot_lkl_z_031; + double dot_lkl_y_030 = trr_30y * dot_lkl_z_000 + trr_31y * dot_lkl_z_010 + trr_32y * dot_lkl_z_020 + trr_33y * dot_lkl_z_030; + double dot_lkl_y_100 = 1 * dot_lkl_z_100 + trr_01y * dot_lkl_z_110 + trr_02y * dot_lkl_z_120; + double dot_lkl_y_101 = 1 * dot_lkl_z_101 + trr_01y * dot_lkl_z_111 + trr_02y * dot_lkl_z_121; + double dot_lkl_y_102 = 1 * dot_lkl_z_102 + trr_01y * dot_lkl_z_112 + trr_02y * dot_lkl_z_122; + double dot_lkl_y_103 = 1 * dot_lkl_z_103 + trr_01y * dot_lkl_z_113 + trr_02y * dot_lkl_z_123; + double dot_lkl_y_110 = trr_10y * dot_lkl_z_100 + trr_11y * dot_lkl_z_110 + trr_12y * dot_lkl_z_120; + double dot_lkl_y_111 = trr_10y * dot_lkl_z_101 + trr_11y * dot_lkl_z_111 + trr_12y * dot_lkl_z_121; + double dot_lkl_y_112 = trr_10y * dot_lkl_z_102 + trr_11y * dot_lkl_z_112 + trr_12y * dot_lkl_z_122; + double dot_lkl_y_120 = trr_20y * dot_lkl_z_100 + trr_21y * dot_lkl_z_110 + trr_22y * dot_lkl_z_120; + double dot_lkl_y_121 = trr_20y * dot_lkl_z_101 + trr_21y * dot_lkl_z_111 + trr_22y * dot_lkl_z_121; + double dot_lkl_y_130 = trr_30y * dot_lkl_z_100 + trr_31y * dot_lkl_z_110 + trr_32y * dot_lkl_z_120; + double dot_lkl_y_200 = 1 * dot_lkl_z_200 + trr_01y * dot_lkl_z_210; + double dot_lkl_y_201 = 1 * dot_lkl_z_201 + trr_01y * dot_lkl_z_211; + double dot_lkl_y_202 = 1 * dot_lkl_z_202 + trr_01y * dot_lkl_z_212; + double dot_lkl_y_203 = 1 * dot_lkl_z_203 + trr_01y * dot_lkl_z_213; + double dot_lkl_y_210 = trr_10y * dot_lkl_z_200 + trr_11y * dot_lkl_z_210; + double dot_lkl_y_211 = trr_10y * dot_lkl_z_201 + trr_11y * dot_lkl_z_211; + double dot_lkl_y_212 = trr_10y * dot_lkl_z_202 + trr_11y * dot_lkl_z_212; + double dot_lkl_y_220 = trr_20y * dot_lkl_z_200 + trr_21y * dot_lkl_z_210; + double dot_lkl_y_221 = trr_20y * dot_lkl_z_201 + trr_21y * dot_lkl_z_211; + double dot_lkl_y_230 = trr_30y * dot_lkl_z_200 + trr_31y * dot_lkl_z_210; + double dot_lkl_y_300 = 1 * dot_lkl_z_300; + double dot_lkl_y_301 = 1 * dot_lkl_z_301; + double dot_lkl_y_302 = 1 * dot_lkl_z_302; + double dot_lkl_y_303 = 1 * dot_lkl_z_303; + double dot_lkl_y_310 = trr_10y * dot_lkl_z_300; + double dot_lkl_y_311 = trr_10y * dot_lkl_z_301; + double dot_lkl_y_312 = trr_10y * dot_lkl_z_302; + double dot_lkl_y_320 = trr_20y * dot_lkl_z_300; + double dot_lkl_y_321 = trr_20y * dot_lkl_z_301; + double dot_lkl_y_330 = trr_30y * dot_lkl_z_300; + vj_ij_002 += fac * dot_lkl_y_002 + trr_01x * dot_lkl_y_102 + trr_02x * dot_lkl_y_202 + trr_03x * dot_lkl_y_302; + vj_ij_003 += fac * dot_lkl_y_003 + trr_01x * dot_lkl_y_103 + trr_02x * dot_lkl_y_203 + trr_03x * dot_lkl_y_303; + vj_ij_011 += fac * dot_lkl_y_011 + trr_01x * dot_lkl_y_111 + trr_02x * dot_lkl_y_211 + trr_03x * dot_lkl_y_311; + vj_ij_012 += fac * dot_lkl_y_012 + trr_01x * dot_lkl_y_112 + trr_02x * dot_lkl_y_212 + trr_03x * dot_lkl_y_312; + vj_ij_020 += fac * dot_lkl_y_020 + trr_01x * dot_lkl_y_120 + trr_02x * dot_lkl_y_220 + trr_03x * dot_lkl_y_320; + vj_ij_021 += fac * dot_lkl_y_021 + trr_01x * dot_lkl_y_121 + trr_02x * dot_lkl_y_221 + trr_03x * dot_lkl_y_321; + vj_ij_030 += fac * dot_lkl_y_030 + trr_01x * dot_lkl_y_130 + trr_02x * dot_lkl_y_230 + trr_03x * dot_lkl_y_330; + vj_ij_101 += trr_10x * dot_lkl_y_001 + trr_11x * dot_lkl_y_101 + trr_12x * dot_lkl_y_201 + trr_13x * dot_lkl_y_301; + vj_ij_102 += trr_10x * dot_lkl_y_002 + trr_11x * dot_lkl_y_102 + trr_12x * dot_lkl_y_202 + trr_13x * dot_lkl_y_302; + vj_ij_110 += trr_10x * dot_lkl_y_010 + trr_11x * dot_lkl_y_110 + trr_12x * dot_lkl_y_210 + trr_13x * dot_lkl_y_310; + vj_ij_111 += trr_10x * dot_lkl_y_011 + trr_11x * dot_lkl_y_111 + trr_12x * dot_lkl_y_211 + trr_13x * dot_lkl_y_311; + vj_ij_120 += trr_10x * dot_lkl_y_020 + trr_11x * dot_lkl_y_120 + trr_12x * dot_lkl_y_220 + trr_13x * dot_lkl_y_320; + vj_ij_200 += trr_20x * dot_lkl_y_000 + trr_21x * dot_lkl_y_100 + trr_22x * dot_lkl_y_200 + trr_23x * dot_lkl_y_300; + vj_ij_201 += trr_20x * dot_lkl_y_001 + trr_21x * dot_lkl_y_101 + trr_22x * dot_lkl_y_201 + trr_23x * dot_lkl_y_301; + vj_ij_210 += trr_20x * dot_lkl_y_010 + trr_21x * dot_lkl_y_110 + trr_22x * dot_lkl_y_210 + trr_23x * dot_lkl_y_310; + vj_ij_300 += trr_30x * dot_lkl_y_000 + trr_31x * dot_lkl_y_100 + trr_32x * dot_lkl_y_200 + trr_33x * dot_lkl_y_300; + } + } + } + if (task_id >= ntasks) { + continue; + } + double *vj = jk.vj; + atomicAdd(vj+ij_pair0+2, vj_ij_002); + atomicAdd(vj+ij_pair0+3, vj_ij_003); + atomicAdd(vj+ij_pair0+5, vj_ij_011); + atomicAdd(vj+ij_pair0+6, vj_ij_012); + atomicAdd(vj+ij_pair0+7, vj_ij_020); + atomicAdd(vj+ij_pair0+8, vj_ij_021); + atomicAdd(vj+ij_pair0+9, vj_ij_030); + atomicAdd(vj+ij_pair0+11, vj_ij_101); + atomicAdd(vj+ij_pair0+12, vj_ij_102); + atomicAdd(vj+ij_pair0+13, vj_ij_110); + atomicAdd(vj+ij_pair0+14, vj_ij_111); + atomicAdd(vj+ij_pair0+15, vj_ij_120); + atomicAdd(vj+ij_pair0+16, vj_ij_200); + atomicAdd(vj+ij_pair0+17, vj_ij_201); + atomicAdd(vj+ij_pair0+18, vj_ij_210); + atomicAdd(vj+ij_pair0+19, vj_ij_300); + atomicAdd(vj+kl_pair0+2, vj_kl_002); + atomicAdd(vj+kl_pair0+3, vj_kl_003); + atomicAdd(vj+kl_pair0+5, vj_kl_011); + atomicAdd(vj+kl_pair0+6, vj_kl_012); + atomicAdd(vj+kl_pair0+7, vj_kl_020); + atomicAdd(vj+kl_pair0+8, vj_kl_021); + atomicAdd(vj+kl_pair0+9, vj_kl_030); + atomicAdd(vj+kl_pair0+11, vj_kl_101); + atomicAdd(vj+kl_pair0+12, vj_kl_102); + atomicAdd(vj+kl_pair0+13, vj_kl_110); + atomicAdd(vj+kl_pair0+14, vj_kl_111); + atomicAdd(vj+kl_pair0+15, vj_kl_120); + atomicAdd(vj+kl_pair0+16, vj_kl_200); + atomicAdd(vj+kl_pair0+17, vj_kl_201); + atomicAdd(vj+kl_pair0+18, vj_kl_210); + atomicAdd(vj+kl_pair0+19, vj_kl_300); + } +} +__global__ +void rys_j_3_3(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_j_3_3(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_j_4_0(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int nbas = envs.nbas; + int *bas = envs.bas; + int *pair_loc = envs.ao_loc; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *rw = Rpa_cicj + iprim*jprim*TILE2*4; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int ij_pair0 = pair_loc[ish*nbas+jsh]; + int kl_pair0 = pair_loc[ksh*nbas+lsh]; + double gout_2_0 = 0.; + double gout_3_0 = 0.; + double gout_4_0 = 0.; + double gout_6_0 = 0.; + double gout_7_0 = 0.; + double gout_8_0 = 0.; + double gout_9_0 = 0.; + double gout_10_0 = 0.; + double gout_11_0 = 0.; + double gout_12_0 = 0.; + double gout_13_0 = 0.; + double gout_14_0 = 0.; + double gout_16_0 = 0.; + double gout_17_0 = 0.; + double gout_18_0 = 0.; + double gout_19_0 = 0.; + double gout_20_0 = 0.; + double gout_21_0 = 0.; + double gout_22_0 = 0.; + double gout_23_0 = 0.; + double gout_24_0 = 0.; + double gout_25_0 = 0.; + double gout_26_0 = 0.; + double gout_27_0 = 0.; + double gout_28_0 = 0.; + double gout_29_0 = 0.; + double gout_30_0 = 0.; + double gout_31_0 = 0.; + double gout_32_0 = 0.; + double gout_33_0 = 0.; + double gout_34_0 = 0.; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(3, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(3, theta_fac*theta_rr, rw); + fac *= sqrt(theta_fac); + for (int irys = 0; irys < 3; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + } + } + for (int irys = 0; irys < 3; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + gout_2_0 += fac * 1 * trr_20z; + double trr_30z = c0z * trr_20z + 2*b10 * trr_10z; + gout_3_0 += fac * 1 * trr_30z; + double trr_40z = c0z * trr_30z + 3*b10 * trr_20z; + gout_4_0 += fac * 1 * trr_40z; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + gout_6_0 += fac * trr_10y * trr_10z; + gout_7_0 += fac * trr_10y * trr_20z; + gout_8_0 += fac * trr_10y * trr_30z; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + gout_9_0 += fac * trr_20y * wt; + gout_10_0 += fac * trr_20y * trr_10z; + gout_11_0 += fac * trr_20y * trr_20z; + double trr_30y = c0y * trr_20y + 2*b10 * trr_10y; + gout_12_0 += fac * trr_30y * wt; + gout_13_0 += fac * trr_30y * trr_10z; + double trr_40y = c0y * trr_30y + 3*b10 * trr_20y; + gout_14_0 += fac * trr_40y * wt; + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + gout_16_0 += trr_10x * 1 * trr_10z; + gout_17_0 += trr_10x * 1 * trr_20z; + gout_18_0 += trr_10x * 1 * trr_30z; + gout_19_0 += trr_10x * trr_10y * wt; + gout_20_0 += trr_10x * trr_10y * trr_10z; + gout_21_0 += trr_10x * trr_10y * trr_20z; + gout_22_0 += trr_10x * trr_20y * wt; + gout_23_0 += trr_10x * trr_20y * trr_10z; + gout_24_0 += trr_10x * trr_30y * wt; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + gout_25_0 += trr_20x * 1 * wt; + gout_26_0 += trr_20x * 1 * trr_10z; + gout_27_0 += trr_20x * 1 * trr_20z; + gout_28_0 += trr_20x * trr_10y * wt; + gout_29_0 += trr_20x * trr_10y * trr_10z; + gout_30_0 += trr_20x * trr_20y * wt; + double trr_30x = c0x * trr_20x + 2*b10 * trr_10x; + gout_31_0 += trr_30x * 1 * wt; + gout_32_0 += trr_30x * 1 * trr_10z; + gout_33_0 += trr_30x * trr_10y * wt; + double trr_40x = c0x * trr_30x + 3*b10 * trr_20x; + gout_34_0 += trr_40x * 1 * wt; + } + } + } + if (task_id >= ntasks) { + continue; + } + int nao_pairs = pair_loc[nbas*nbas]; + double *vj = jk.vj; + double *dm = jk.dm; + for (int i_dm = 0; i_dm < jk.n_dm; ++i_dm) { + atomicAdd(vj+ij_pair0+2, gout_2_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+3, gout_3_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+4, gout_4_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+6, gout_6_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+7, gout_7_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+8, gout_8_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+9, gout_9_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+10, gout_10_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+11, gout_11_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+12, gout_12_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+13, gout_13_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+14, gout_14_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+16, gout_16_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+17, gout_17_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+18, gout_18_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+19, gout_19_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+20, gout_20_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+21, gout_21_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+22, gout_22_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+23, gout_23_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+24, gout_24_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+25, gout_25_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+26, gout_26_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+27, gout_27_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+28, gout_28_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+29, gout_29_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+30, gout_30_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+31, gout_31_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+32, gout_32_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+33, gout_33_0*dm[kl_pair0+0]); + atomicAdd(vj+ij_pair0+34, gout_34_0*dm[kl_pair0+0]); + atomicAdd(vj+kl_pair0+0, gout_2_0*dm[ij_pair0+2] + gout_3_0*dm[ij_pair0+3] + gout_4_0*dm[ij_pair0+4] + gout_6_0*dm[ij_pair0+6] + gout_7_0*dm[ij_pair0+7] + gout_8_0*dm[ij_pair0+8] + gout_9_0*dm[ij_pair0+9] + gout_10_0*dm[ij_pair0+10] + gout_11_0*dm[ij_pair0+11] + gout_12_0*dm[ij_pair0+12] + gout_13_0*dm[ij_pair0+13] + gout_14_0*dm[ij_pair0+14] + gout_16_0*dm[ij_pair0+16] + gout_17_0*dm[ij_pair0+17] + gout_18_0*dm[ij_pair0+18] + gout_19_0*dm[ij_pair0+19] + gout_20_0*dm[ij_pair0+20] + gout_21_0*dm[ij_pair0+21] + gout_22_0*dm[ij_pair0+22] + gout_23_0*dm[ij_pair0+23] + gout_24_0*dm[ij_pair0+24] + gout_25_0*dm[ij_pair0+25] + gout_26_0*dm[ij_pair0+26] + gout_27_0*dm[ij_pair0+27] + gout_28_0*dm[ij_pair0+28] + gout_29_0*dm[ij_pair0+29] + gout_30_0*dm[ij_pair0+30] + gout_31_0*dm[ij_pair0+31] + gout_32_0*dm[ij_pair0+32] + gout_33_0*dm[ij_pair0+33] + gout_34_0*dm[ij_pair0+34]); + vj += nao_pairs; + dm += nao_pairs; + } + } +} +__global__ +void rys_j_4_0(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_j_4_0(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_j_4_1(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int nbas = envs.nbas; + int *bas = envs.bas; + int *pair_loc = envs.ao_loc; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *dm_ij_cache = Rpa_cicj + iprim*jprim*TILE2*4; + double *rw = dm_ij_cache + 35*TILE2; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double *dm = jk.dm; + for (int n = sq_id; n < 35*TILE2; n += nsq_per_block) { + int m = n / TILE2; + int ij_sh = n % TILE2; + int ish = ish0 + ij_sh / TILE; + int jsh = jsh0 + ij_sh % TILE; + int ij_pair0 = pair_loc[ish*nbas+jsh]; + dm_ij_cache[ij_sh+m*TILE2] = dm[ij_pair0+m]; + } + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int ij_pair0 = pair_loc[ish*nbas+jsh]; + int kl_pair0 = pair_loc[ksh*nbas+lsh]; + double dm_kl_001 = dm[kl_pair0+1]; + double dm_kl_010 = dm[kl_pair0+2]; + double dm_kl_100 = dm[kl_pair0+3]; + double vj_ij_002 = 0; + double vj_ij_003 = 0; + double vj_ij_004 = 0; + double vj_ij_011 = 0; + double vj_ij_012 = 0; + double vj_ij_013 = 0; + double vj_ij_020 = 0; + double vj_ij_021 = 0; + double vj_ij_022 = 0; + double vj_ij_030 = 0; + double vj_ij_031 = 0; + double vj_ij_040 = 0; + double vj_ij_101 = 0; + double vj_ij_102 = 0; + double vj_ij_103 = 0; + double vj_ij_110 = 0; + double vj_ij_111 = 0; + double vj_ij_112 = 0; + double vj_ij_120 = 0; + double vj_ij_121 = 0; + double vj_ij_130 = 0; + double vj_ij_200 = 0; + double vj_ij_201 = 0; + double vj_ij_202 = 0; + double vj_ij_210 = 0; + double vj_ij_211 = 0; + double vj_ij_220 = 0; + double vj_ij_300 = 0; + double vj_ij_301 = 0; + double vj_ij_310 = 0; + double vj_ij_400 = 0; + double vj_kl_001 = 0; + double vj_kl_010 = 0; + double vj_kl_100 = 0; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(3, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(3, theta_fac*theta_rr, rw); + fac *= sqrt(theta_fac); + for (int irys = 0; irys < 3; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + } + } + for (int irys = 0; irys < 3; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double b00 = .5 * rt_aa; + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + double trr_30z = c0z * trr_20z + 2*b10 * trr_10z; + double trr_40z = c0z * trr_30z + 3*b10 * trr_20z; + double dot_lij_z_000 = trr_20z * dm_ij_cache[sh_ij+2*TILE2] + trr_30z * dm_ij_cache[sh_ij+3*TILE2] + trr_40z * dm_ij_cache[sh_ij+4*TILE2]; + double rt_akl = rt_aa * aij; + double cpz = zqc + zpq*rt_akl; + double trr_21z = cpz * trr_20z + 2*b00 * trr_10z; + double trr_31z = cpz * trr_30z + 3*b00 * trr_20z; + double trr_41z = cpz * trr_40z + 4*b00 * trr_30z; + double dot_lij_z_001 = trr_21z * dm_ij_cache[sh_ij+2*TILE2] + trr_31z * dm_ij_cache[sh_ij+3*TILE2] + trr_41z * dm_ij_cache[sh_ij+4*TILE2]; + double dot_lij_z_010 = trr_10z * dm_ij_cache[sh_ij+6*TILE2] + trr_20z * dm_ij_cache[sh_ij+7*TILE2] + trr_30z * dm_ij_cache[sh_ij+8*TILE2]; + double trr_11z = cpz * trr_10z + 1*b00 * wt; + double dot_lij_z_011 = trr_11z * dm_ij_cache[sh_ij+6*TILE2] + trr_21z * dm_ij_cache[sh_ij+7*TILE2] + trr_31z * dm_ij_cache[sh_ij+8*TILE2]; + double dot_lij_z_020 = wt * dm_ij_cache[sh_ij+9*TILE2] + trr_10z * dm_ij_cache[sh_ij+10*TILE2] + trr_20z * dm_ij_cache[sh_ij+11*TILE2]; + double trr_01z = cpz * wt; + double dot_lij_z_021 = trr_01z * dm_ij_cache[sh_ij+9*TILE2] + trr_11z * dm_ij_cache[sh_ij+10*TILE2] + trr_21z * dm_ij_cache[sh_ij+11*TILE2]; + double dot_lij_z_030 = wt * dm_ij_cache[sh_ij+12*TILE2] + trr_10z * dm_ij_cache[sh_ij+13*TILE2]; + double dot_lij_z_031 = trr_01z * dm_ij_cache[sh_ij+12*TILE2] + trr_11z * dm_ij_cache[sh_ij+13*TILE2]; + double dot_lij_z_040 = wt * dm_ij_cache[sh_ij+14*TILE2]; + double dot_lij_z_041 = trr_01z * dm_ij_cache[sh_ij+14*TILE2]; + double dot_lij_z_100 = trr_10z * dm_ij_cache[sh_ij+16*TILE2] + trr_20z * dm_ij_cache[sh_ij+17*TILE2] + trr_30z * dm_ij_cache[sh_ij+18*TILE2]; + double dot_lij_z_101 = trr_11z * dm_ij_cache[sh_ij+16*TILE2] + trr_21z * dm_ij_cache[sh_ij+17*TILE2] + trr_31z * dm_ij_cache[sh_ij+18*TILE2]; + double dot_lij_z_110 = wt * dm_ij_cache[sh_ij+19*TILE2] + trr_10z * dm_ij_cache[sh_ij+20*TILE2] + trr_20z * dm_ij_cache[sh_ij+21*TILE2]; + double dot_lij_z_111 = trr_01z * dm_ij_cache[sh_ij+19*TILE2] + trr_11z * dm_ij_cache[sh_ij+20*TILE2] + trr_21z * dm_ij_cache[sh_ij+21*TILE2]; + double dot_lij_z_120 = wt * dm_ij_cache[sh_ij+22*TILE2] + trr_10z * dm_ij_cache[sh_ij+23*TILE2]; + double dot_lij_z_121 = trr_01z * dm_ij_cache[sh_ij+22*TILE2] + trr_11z * dm_ij_cache[sh_ij+23*TILE2]; + double dot_lij_z_130 = wt * dm_ij_cache[sh_ij+24*TILE2]; + double dot_lij_z_131 = trr_01z * dm_ij_cache[sh_ij+24*TILE2]; + double dot_lij_z_200 = wt * dm_ij_cache[sh_ij+25*TILE2] + trr_10z * dm_ij_cache[sh_ij+26*TILE2] + trr_20z * dm_ij_cache[sh_ij+27*TILE2]; + double dot_lij_z_201 = trr_01z * dm_ij_cache[sh_ij+25*TILE2] + trr_11z * dm_ij_cache[sh_ij+26*TILE2] + trr_21z * dm_ij_cache[sh_ij+27*TILE2]; + double dot_lij_z_210 = wt * dm_ij_cache[sh_ij+28*TILE2] + trr_10z * dm_ij_cache[sh_ij+29*TILE2]; + double dot_lij_z_211 = trr_01z * dm_ij_cache[sh_ij+28*TILE2] + trr_11z * dm_ij_cache[sh_ij+29*TILE2]; + double dot_lij_z_220 = wt * dm_ij_cache[sh_ij+30*TILE2]; + double dot_lij_z_221 = trr_01z * dm_ij_cache[sh_ij+30*TILE2]; + double dot_lij_z_300 = wt * dm_ij_cache[sh_ij+31*TILE2] + trr_10z * dm_ij_cache[sh_ij+32*TILE2]; + double dot_lij_z_301 = trr_01z * dm_ij_cache[sh_ij+31*TILE2] + trr_11z * dm_ij_cache[sh_ij+32*TILE2]; + double dot_lij_z_310 = wt * dm_ij_cache[sh_ij+33*TILE2]; + double dot_lij_z_311 = trr_01z * dm_ij_cache[sh_ij+33*TILE2]; + double dot_lij_z_400 = wt * dm_ij_cache[sh_ij+34*TILE2]; + double dot_lij_z_401 = trr_01z * dm_ij_cache[sh_ij+34*TILE2]; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + double trr_30y = c0y * trr_20y + 2*b10 * trr_10y; + double trr_40y = c0y * trr_30y + 3*b10 * trr_20y; + double dot_lij_y_000 = 1 * dot_lij_z_000 + trr_10y * dot_lij_z_010 + trr_20y * dot_lij_z_020 + trr_30y * dot_lij_z_030 + trr_40y * dot_lij_z_040; + double dot_lij_y_001 = 1 * dot_lij_z_001 + trr_10y * dot_lij_z_011 + trr_20y * dot_lij_z_021 + trr_30y * dot_lij_z_031 + trr_40y * dot_lij_z_041; + double cpy = yqc + ypq*rt_akl; + double trr_01y = cpy * 1; + double trr_11y = cpy * trr_10y + 1*b00 * 1; + double trr_21y = cpy * trr_20y + 2*b00 * trr_10y; + double trr_31y = cpy * trr_30y + 3*b00 * trr_20y; + double trr_41y = cpy * trr_40y + 4*b00 * trr_30y; + double dot_lij_y_010 = trr_01y * dot_lij_z_000 + trr_11y * dot_lij_z_010 + trr_21y * dot_lij_z_020 + trr_31y * dot_lij_z_030 + trr_41y * dot_lij_z_040; + double dot_lij_y_100 = 1 * dot_lij_z_100 + trr_10y * dot_lij_z_110 + trr_20y * dot_lij_z_120 + trr_30y * dot_lij_z_130; + double dot_lij_y_101 = 1 * dot_lij_z_101 + trr_10y * dot_lij_z_111 + trr_20y * dot_lij_z_121 + trr_30y * dot_lij_z_131; + double dot_lij_y_110 = trr_01y * dot_lij_z_100 + trr_11y * dot_lij_z_110 + trr_21y * dot_lij_z_120 + trr_31y * dot_lij_z_130; + double dot_lij_y_200 = 1 * dot_lij_z_200 + trr_10y * dot_lij_z_210 + trr_20y * dot_lij_z_220; + double dot_lij_y_201 = 1 * dot_lij_z_201 + trr_10y * dot_lij_z_211 + trr_20y * dot_lij_z_221; + double dot_lij_y_210 = trr_01y * dot_lij_z_200 + trr_11y * dot_lij_z_210 + trr_21y * dot_lij_z_220; + double dot_lij_y_300 = 1 * dot_lij_z_300 + trr_10y * dot_lij_z_310; + double dot_lij_y_301 = 1 * dot_lij_z_301 + trr_10y * dot_lij_z_311; + double dot_lij_y_310 = trr_01y * dot_lij_z_300 + trr_11y * dot_lij_z_310; + double dot_lij_y_400 = 1 * dot_lij_z_400; + double dot_lij_y_401 = 1 * dot_lij_z_401; + double dot_lij_y_410 = trr_01y * dot_lij_z_400; + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + double trr_30x = c0x * trr_20x + 2*b10 * trr_10x; + double trr_40x = c0x * trr_30x + 3*b10 * trr_20x; + vj_kl_001 += fac * dot_lij_y_001 + trr_10x * dot_lij_y_101 + trr_20x * dot_lij_y_201 + trr_30x * dot_lij_y_301 + trr_40x * dot_lij_y_401; + vj_kl_010 += fac * dot_lij_y_010 + trr_10x * dot_lij_y_110 + trr_20x * dot_lij_y_210 + trr_30x * dot_lij_y_310 + trr_40x * dot_lij_y_410; + double cpx = xqc + xpq*rt_akl; + double trr_01x = cpx * fac; + double trr_11x = cpx * trr_10x + 1*b00 * fac; + double trr_21x = cpx * trr_20x + 2*b00 * trr_10x; + double trr_31x = cpx * trr_30x + 3*b00 * trr_20x; + double trr_41x = cpx * trr_40x + 4*b00 * trr_30x; + vj_kl_100 += trr_01x * dot_lij_y_000 + trr_11x * dot_lij_y_100 + trr_21x * dot_lij_y_200 + trr_31x * dot_lij_y_300 + trr_41x * dot_lij_y_400; + double dot_lkl_z_000 = trr_01z * dm_kl_001; + double dot_lkl_z_001 = trr_11z * dm_kl_001; + double dot_lkl_z_002 = trr_21z * dm_kl_001; + double dot_lkl_z_003 = trr_31z * dm_kl_001; + double dot_lkl_z_004 = trr_41z * dm_kl_001; + double dot_lkl_z_010 = wt * dm_kl_010; + double dot_lkl_z_011 = trr_10z * dm_kl_010; + double dot_lkl_z_012 = trr_20z * dm_kl_010; + double dot_lkl_z_013 = trr_30z * dm_kl_010; + double dot_lkl_z_014 = trr_40z * dm_kl_010; + double dot_lkl_z_100 = wt * dm_kl_100; + double dot_lkl_z_101 = trr_10z * dm_kl_100; + double dot_lkl_z_102 = trr_20z * dm_kl_100; + double dot_lkl_z_103 = trr_30z * dm_kl_100; + double dot_lkl_z_104 = trr_40z * dm_kl_100; + double dot_lkl_y_000 = 1 * dot_lkl_z_000 + trr_01y * dot_lkl_z_010; + double dot_lkl_y_001 = 1 * dot_lkl_z_001 + trr_01y * dot_lkl_z_011; + double dot_lkl_y_002 = 1 * dot_lkl_z_002 + trr_01y * dot_lkl_z_012; + double dot_lkl_y_003 = 1 * dot_lkl_z_003 + trr_01y * dot_lkl_z_013; + double dot_lkl_y_004 = 1 * dot_lkl_z_004 + trr_01y * dot_lkl_z_014; + double dot_lkl_y_010 = trr_10y * dot_lkl_z_000 + trr_11y * dot_lkl_z_010; + double dot_lkl_y_011 = trr_10y * dot_lkl_z_001 + trr_11y * dot_lkl_z_011; + double dot_lkl_y_012 = trr_10y * dot_lkl_z_002 + trr_11y * dot_lkl_z_012; + double dot_lkl_y_013 = trr_10y * dot_lkl_z_003 + trr_11y * dot_lkl_z_013; + double dot_lkl_y_020 = trr_20y * dot_lkl_z_000 + trr_21y * dot_lkl_z_010; + double dot_lkl_y_021 = trr_20y * dot_lkl_z_001 + trr_21y * dot_lkl_z_011; + double dot_lkl_y_022 = trr_20y * dot_lkl_z_002 + trr_21y * dot_lkl_z_012; + double dot_lkl_y_030 = trr_30y * dot_lkl_z_000 + trr_31y * dot_lkl_z_010; + double dot_lkl_y_031 = trr_30y * dot_lkl_z_001 + trr_31y * dot_lkl_z_011; + double dot_lkl_y_040 = trr_40y * dot_lkl_z_000 + trr_41y * dot_lkl_z_010; + double dot_lkl_y_100 = 1 * dot_lkl_z_100; + double dot_lkl_y_101 = 1 * dot_lkl_z_101; + double dot_lkl_y_102 = 1 * dot_lkl_z_102; + double dot_lkl_y_103 = 1 * dot_lkl_z_103; + double dot_lkl_y_104 = 1 * dot_lkl_z_104; + double dot_lkl_y_110 = trr_10y * dot_lkl_z_100; + double dot_lkl_y_111 = trr_10y * dot_lkl_z_101; + double dot_lkl_y_112 = trr_10y * dot_lkl_z_102; + double dot_lkl_y_113 = trr_10y * dot_lkl_z_103; + double dot_lkl_y_120 = trr_20y * dot_lkl_z_100; + double dot_lkl_y_121 = trr_20y * dot_lkl_z_101; + double dot_lkl_y_122 = trr_20y * dot_lkl_z_102; + double dot_lkl_y_130 = trr_30y * dot_lkl_z_100; + double dot_lkl_y_131 = trr_30y * dot_lkl_z_101; + double dot_lkl_y_140 = trr_40y * dot_lkl_z_100; + vj_ij_002 += fac * dot_lkl_y_002 + trr_01x * dot_lkl_y_102; + vj_ij_003 += fac * dot_lkl_y_003 + trr_01x * dot_lkl_y_103; + vj_ij_004 += fac * dot_lkl_y_004 + trr_01x * dot_lkl_y_104; + vj_ij_011 += fac * dot_lkl_y_011 + trr_01x * dot_lkl_y_111; + vj_ij_012 += fac * dot_lkl_y_012 + trr_01x * dot_lkl_y_112; + vj_ij_013 += fac * dot_lkl_y_013 + trr_01x * dot_lkl_y_113; + vj_ij_020 += fac * dot_lkl_y_020 + trr_01x * dot_lkl_y_120; + vj_ij_021 += fac * dot_lkl_y_021 + trr_01x * dot_lkl_y_121; + vj_ij_022 += fac * dot_lkl_y_022 + trr_01x * dot_lkl_y_122; + vj_ij_030 += fac * dot_lkl_y_030 + trr_01x * dot_lkl_y_130; + vj_ij_031 += fac * dot_lkl_y_031 + trr_01x * dot_lkl_y_131; + vj_ij_040 += fac * dot_lkl_y_040 + trr_01x * dot_lkl_y_140; + vj_ij_101 += trr_10x * dot_lkl_y_001 + trr_11x * dot_lkl_y_101; + vj_ij_102 += trr_10x * dot_lkl_y_002 + trr_11x * dot_lkl_y_102; + vj_ij_103 += trr_10x * dot_lkl_y_003 + trr_11x * dot_lkl_y_103; + vj_ij_110 += trr_10x * dot_lkl_y_010 + trr_11x * dot_lkl_y_110; + vj_ij_111 += trr_10x * dot_lkl_y_011 + trr_11x * dot_lkl_y_111; + vj_ij_112 += trr_10x * dot_lkl_y_012 + trr_11x * dot_lkl_y_112; + vj_ij_120 += trr_10x * dot_lkl_y_020 + trr_11x * dot_lkl_y_120; + vj_ij_121 += trr_10x * dot_lkl_y_021 + trr_11x * dot_lkl_y_121; + vj_ij_130 += trr_10x * dot_lkl_y_030 + trr_11x * dot_lkl_y_130; + vj_ij_200 += trr_20x * dot_lkl_y_000 + trr_21x * dot_lkl_y_100; + vj_ij_201 += trr_20x * dot_lkl_y_001 + trr_21x * dot_lkl_y_101; + vj_ij_202 += trr_20x * dot_lkl_y_002 + trr_21x * dot_lkl_y_102; + vj_ij_210 += trr_20x * dot_lkl_y_010 + trr_21x * dot_lkl_y_110; + vj_ij_211 += trr_20x * dot_lkl_y_011 + trr_21x * dot_lkl_y_111; + vj_ij_220 += trr_20x * dot_lkl_y_020 + trr_21x * dot_lkl_y_120; + vj_ij_300 += trr_30x * dot_lkl_y_000 + trr_31x * dot_lkl_y_100; + vj_ij_301 += trr_30x * dot_lkl_y_001 + trr_31x * dot_lkl_y_101; + vj_ij_310 += trr_30x * dot_lkl_y_010 + trr_31x * dot_lkl_y_110; + vj_ij_400 += trr_40x * dot_lkl_y_000 + trr_41x * dot_lkl_y_100; + } + } + } + if (task_id >= ntasks) { + continue; + } + double *vj = jk.vj; + atomicAdd(vj+ij_pair0+2, vj_ij_002); + atomicAdd(vj+ij_pair0+3, vj_ij_003); + atomicAdd(vj+ij_pair0+4, vj_ij_004); + atomicAdd(vj+ij_pair0+6, vj_ij_011); + atomicAdd(vj+ij_pair0+7, vj_ij_012); + atomicAdd(vj+ij_pair0+8, vj_ij_013); + atomicAdd(vj+ij_pair0+9, vj_ij_020); + atomicAdd(vj+ij_pair0+10, vj_ij_021); + atomicAdd(vj+ij_pair0+11, vj_ij_022); + atomicAdd(vj+ij_pair0+12, vj_ij_030); + atomicAdd(vj+ij_pair0+13, vj_ij_031); + atomicAdd(vj+ij_pair0+14, vj_ij_040); + atomicAdd(vj+ij_pair0+16, vj_ij_101); + atomicAdd(vj+ij_pair0+17, vj_ij_102); + atomicAdd(vj+ij_pair0+18, vj_ij_103); + atomicAdd(vj+ij_pair0+19, vj_ij_110); + atomicAdd(vj+ij_pair0+20, vj_ij_111); + atomicAdd(vj+ij_pair0+21, vj_ij_112); + atomicAdd(vj+ij_pair0+22, vj_ij_120); + atomicAdd(vj+ij_pair0+23, vj_ij_121); + atomicAdd(vj+ij_pair0+24, vj_ij_130); + atomicAdd(vj+ij_pair0+25, vj_ij_200); + atomicAdd(vj+ij_pair0+26, vj_ij_201); + atomicAdd(vj+ij_pair0+27, vj_ij_202); + atomicAdd(vj+ij_pair0+28, vj_ij_210); + atomicAdd(vj+ij_pair0+29, vj_ij_211); + atomicAdd(vj+ij_pair0+30, vj_ij_220); + atomicAdd(vj+ij_pair0+31, vj_ij_300); + atomicAdd(vj+ij_pair0+32, vj_ij_301); + atomicAdd(vj+ij_pair0+33, vj_ij_310); + atomicAdd(vj+ij_pair0+34, vj_ij_400); + atomicAdd(vj+kl_pair0+1, vj_kl_001); + atomicAdd(vj+kl_pair0+2, vj_kl_010); + atomicAdd(vj+kl_pair0+3, vj_kl_100); + } +} +__global__ +void rys_j_4_1(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_j_4_1(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +__device__ static +void _rys_j_4_2(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *shl_quartet_idx, int ntasks, int ish0, int jsh0) +{ + int sq_id = threadIdx.x + blockDim.x * threadIdx.y; + int nsq_per_block = blockDim.x * blockDim.y; + int iprim = bounds.iprim; + int jprim = bounds.jprim; + int kprim = bounds.kprim; + int lprim = bounds.lprim; + int nbas = envs.nbas; + int *bas = envs.bas; + int *pair_loc = envs.ao_loc; + double *env = envs.env; + double omega = env[PTR_RANGE_OMEGA]; + extern __shared__ double Rpa_cicj[]; + double *dm_ij_cache = Rpa_cicj + iprim*jprim*TILE2*4; + double *rw = dm_ij_cache + 35*TILE2; + for (int n = sq_id; n < iprim*jprim*TILE2; n += nsq_per_block) { + int ijp = n / TILE2; + int sh_ij = n % TILE2; + int ish = ish0 + sh_ij / TILE; + int jsh = jsh0 + sh_ij % TILE; + int ip = ijp / jprim; + int jp = ijp % jprim; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *ci = env + bas[ish*BAS_SLOTS+PTR_COEFF]; + double *cj = env + bas[jsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rj = env + bas[jsh*BAS_SLOTS+PTR_BAS_COORD]; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double aj_aij = aj / aij; + double xjxi = rj[0] - ri[0]; + double yjyi = rj[1] - ri[1]; + double zjzi = rj[2] - ri[2]; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + Rpa[sh_ij+0*TILE2] = xjxi * aj_aij; + Rpa[sh_ij+1*TILE2] = yjyi * aj_aij; + Rpa[sh_ij+2*TILE2] = zjzi * aj_aij; + double theta_ij = ai * aj / aij; + double Kab = exp(-theta_ij * (xjxi*xjxi+yjyi*yjyi+zjzi*zjzi)); + Rpa[sh_ij+3*TILE2] = ci[ip] * cj[jp] * Kab; + } + double *dm = jk.dm; + for (int n = sq_id; n < 35*TILE2; n += nsq_per_block) { + int m = n / TILE2; + int ij_sh = n % TILE2; + int ish = ish0 + ij_sh / TILE; + int jsh = jsh0 + ij_sh % TILE; + int ij_pair0 = pair_loc[ish*nbas+jsh]; + dm_ij_cache[ij_sh+m*TILE2] = dm[ij_pair0+m]; + } + + for (int task0 = 0; task0 < ntasks; task0 += nsq_per_block) { + __syncthreads(); + int task_id = task0 + sq_id; + double fac_sym = PI_FAC; + ShellQuartet sq; + if (task_id >= ntasks) { + // To avoid __syncthreads blocking blocking idle warps, all remaining + // threads compute a valid shell quartet with zero normalization factor + sq = shl_quartet_idx[0]; + fac_sym = 0.; + } else { + sq = shl_quartet_idx[task_id]; + } + int ish = sq.i; + int jsh = sq.j; + int ksh = sq.k; + int lsh = sq.l; + int sh_ij = (ish % TILE) * TILE + (jsh % TILE); + if (ish == jsh) fac_sym *= .5; + if (ksh == lsh) fac_sym *= .5; + if (ish*nbas+jsh == ksh*nbas+lsh) fac_sym *= .5; + int ij_pair0 = pair_loc[ish*nbas+jsh]; + int kl_pair0 = pair_loc[ksh*nbas+lsh]; + double dm_kl_001 = dm[kl_pair0+1]; + double dm_kl_002 = dm[kl_pair0+2]; + double dm_kl_010 = dm[kl_pair0+3]; + double dm_kl_011 = dm[kl_pair0+4]; + double dm_kl_020 = dm[kl_pair0+5]; + double dm_kl_100 = dm[kl_pair0+6]; + double dm_kl_101 = dm[kl_pair0+7]; + double dm_kl_110 = dm[kl_pair0+8]; + double dm_kl_200 = dm[kl_pair0+9]; + double vj_ij_002 = 0; + double vj_ij_003 = 0; + double vj_ij_004 = 0; + double vj_ij_011 = 0; + double vj_ij_012 = 0; + double vj_ij_013 = 0; + double vj_ij_020 = 0; + double vj_ij_021 = 0; + double vj_ij_022 = 0; + double vj_ij_030 = 0; + double vj_ij_031 = 0; + double vj_ij_040 = 0; + double vj_ij_101 = 0; + double vj_ij_102 = 0; + double vj_ij_103 = 0; + double vj_ij_110 = 0; + double vj_ij_111 = 0; + double vj_ij_112 = 0; + double vj_ij_120 = 0; + double vj_ij_121 = 0; + double vj_ij_130 = 0; + double vj_ij_200 = 0; + double vj_ij_201 = 0; + double vj_ij_202 = 0; + double vj_ij_210 = 0; + double vj_ij_211 = 0; + double vj_ij_220 = 0; + double vj_ij_300 = 0; + double vj_ij_301 = 0; + double vj_ij_310 = 0; + double vj_ij_400 = 0; + double vj_kl_001 = 0; + double vj_kl_002 = 0; + double vj_kl_010 = 0; + double vj_kl_011 = 0; + double vj_kl_020 = 0; + double vj_kl_100 = 0; + double vj_kl_101 = 0; + double vj_kl_110 = 0; + double vj_kl_200 = 0; + double *expi = env + bas[ish*BAS_SLOTS+PTR_EXP]; + double *expj = env + bas[jsh*BAS_SLOTS+PTR_EXP]; + double *expk = env + bas[ksh*BAS_SLOTS+PTR_EXP]; + double *expl = env + bas[lsh*BAS_SLOTS+PTR_EXP]; + double *ck = env + bas[ksh*BAS_SLOTS+PTR_COEFF]; + double *cl = env + bas[lsh*BAS_SLOTS+PTR_COEFF]; + double *ri = env + bas[ish*BAS_SLOTS+PTR_BAS_COORD]; + double *rk = env + bas[ksh*BAS_SLOTS+PTR_BAS_COORD]; + double *rl = env + bas[lsh*BAS_SLOTS+PTR_BAS_COORD]; + for (int klp = 0; klp < kprim*lprim; ++klp) { + int kp = klp / lprim; + int lp = klp % lprim; + double ak = expk[kp]; + double al = expl[lp]; + double akl = ak + al; + double al_akl = al / akl; + double xlxk = rl[0] - rk[0]; + double ylyk = rl[1] - rk[1]; + double zlzk = rl[2] - rk[2]; + double theta_kl = ak * al / akl; + double Kcd = exp(-theta_kl * (xlxk*xlxk+ylyk*ylyk+zlzk*zlzk)); + double ckcl = fac_sym * ck[kp] * cl[lp] * Kcd; + double xqc = xlxk * al_akl; + double yqc = ylyk * al_akl; + double zqc = zlzk * al_akl; + for (int ijp = 0; ijp < iprim*jprim; ++ijp) { + int ip = ijp / jprim; + int jp = ijp % jprim; + double ai = expi[ip]; + double aj = expj[jp]; + double aij = ai + aj; + double *Rpa = Rpa_cicj + ijp * TILE2*4; + double cicj = Rpa[sh_ij+3*TILE2]; + double fac = cicj * ckcl / (aij*akl*sqrt(aij+akl)); + double xpa = Rpa[sh_ij+0*TILE2]; + double ypa = Rpa[sh_ij+1*TILE2]; + double zpa = Rpa[sh_ij+2*TILE2]; + double xij = ri[0] + xpa; + double yij = ri[1] + ypa; + double zij = ri[2] + zpa; + double xkl = rk[0] + xqc; + double ykl = rk[1] + yqc; + double zkl = rk[2] + zqc; + double xpq = xij - xkl; + double ypq = yij - ykl; + double zpq = zij - zkl; + double theta = aij * akl / (aij + akl); + double rr = xpq * xpq + ypq * ypq + zpq * zpq; + double theta_rr = theta * rr; + if (omega == 0) { + rys_roots(4, theta_rr, rw); + } else { + double theta_fac = omega * omega / (omega * omega + theta); + rys_roots(4, theta_fac*theta_rr, rw); + fac *= sqrt(theta_fac); + for (int irys = 0; irys < 4; ++irys) { + rw[sq_id+ irys*2 *nsq_per_block] *= theta_fac; + } + } + for (int irys = 0; irys < 4; ++irys) { + double wt = rw[sq_id + (2*irys+1)*nsq_per_block]; + double rt = rw[sq_id + 2*irys *nsq_per_block]; + double rt_aa = rt / (aij + akl); + double b00 = .5 * rt_aa; + double rt_aij = rt_aa * akl; + double b10 = .5/aij * (1 - rt_aij); + double c0z = Rpa[sh_ij+2*TILE2] - zpq*rt_aij; + double trr_10z = c0z * wt; + double trr_20z = c0z * trr_10z + 1*b10 * wt; + double trr_30z = c0z * trr_20z + 2*b10 * trr_10z; + double trr_40z = c0z * trr_30z + 3*b10 * trr_20z; + double dot_lij_z_000 = trr_20z * dm_ij_cache[sh_ij+2*TILE2] + trr_30z * dm_ij_cache[sh_ij+3*TILE2] + trr_40z * dm_ij_cache[sh_ij+4*TILE2]; + double rt_akl = rt_aa * aij; + double b01 = .5/akl * (1 - rt_akl); + double cpz = zqc + zpq*rt_akl; + double trr_21z = cpz * trr_20z + 2*b00 * trr_10z; + double trr_31z = cpz * trr_30z + 3*b00 * trr_20z; + double trr_41z = cpz * trr_40z + 4*b00 * trr_30z; + double dot_lij_z_001 = trr_21z * dm_ij_cache[sh_ij+2*TILE2] + trr_31z * dm_ij_cache[sh_ij+3*TILE2] + trr_41z * dm_ij_cache[sh_ij+4*TILE2]; + double trr_11z = cpz * trr_10z + 1*b00 * wt; + double trr_22z = cpz * trr_21z + 1*b01 * trr_20z + 2*b00 * trr_11z; + double trr_32z = cpz * trr_31z + 1*b01 * trr_30z + 3*b00 * trr_21z; + double trr_42z = cpz * trr_41z + 1*b01 * trr_40z + 4*b00 * trr_31z; + double dot_lij_z_002 = trr_22z * dm_ij_cache[sh_ij+2*TILE2] + trr_32z * dm_ij_cache[sh_ij+3*TILE2] + trr_42z * dm_ij_cache[sh_ij+4*TILE2]; + double dot_lij_z_010 = trr_10z * dm_ij_cache[sh_ij+6*TILE2] + trr_20z * dm_ij_cache[sh_ij+7*TILE2] + trr_30z * dm_ij_cache[sh_ij+8*TILE2]; + double dot_lij_z_011 = trr_11z * dm_ij_cache[sh_ij+6*TILE2] + trr_21z * dm_ij_cache[sh_ij+7*TILE2] + trr_31z * dm_ij_cache[sh_ij+8*TILE2]; + double trr_01z = cpz * wt; + double trr_12z = cpz * trr_11z + 1*b01 * trr_10z + 1*b00 * trr_01z; + double dot_lij_z_012 = trr_12z * dm_ij_cache[sh_ij+6*TILE2] + trr_22z * dm_ij_cache[sh_ij+7*TILE2] + trr_32z * dm_ij_cache[sh_ij+8*TILE2]; + double dot_lij_z_020 = wt * dm_ij_cache[sh_ij+9*TILE2] + trr_10z * dm_ij_cache[sh_ij+10*TILE2] + trr_20z * dm_ij_cache[sh_ij+11*TILE2]; + double dot_lij_z_021 = trr_01z * dm_ij_cache[sh_ij+9*TILE2] + trr_11z * dm_ij_cache[sh_ij+10*TILE2] + trr_21z * dm_ij_cache[sh_ij+11*TILE2]; + double trr_02z = cpz * trr_01z + 1*b01 * wt; + double dot_lij_z_022 = trr_02z * dm_ij_cache[sh_ij+9*TILE2] + trr_12z * dm_ij_cache[sh_ij+10*TILE2] + trr_22z * dm_ij_cache[sh_ij+11*TILE2]; + double dot_lij_z_030 = wt * dm_ij_cache[sh_ij+12*TILE2] + trr_10z * dm_ij_cache[sh_ij+13*TILE2]; + double dot_lij_z_031 = trr_01z * dm_ij_cache[sh_ij+12*TILE2] + trr_11z * dm_ij_cache[sh_ij+13*TILE2]; + double dot_lij_z_032 = trr_02z * dm_ij_cache[sh_ij+12*TILE2] + trr_12z * dm_ij_cache[sh_ij+13*TILE2]; + double dot_lij_z_040 = wt * dm_ij_cache[sh_ij+14*TILE2]; + double dot_lij_z_041 = trr_01z * dm_ij_cache[sh_ij+14*TILE2]; + double dot_lij_z_042 = trr_02z * dm_ij_cache[sh_ij+14*TILE2]; + double dot_lij_z_100 = trr_10z * dm_ij_cache[sh_ij+16*TILE2] + trr_20z * dm_ij_cache[sh_ij+17*TILE2] + trr_30z * dm_ij_cache[sh_ij+18*TILE2]; + double dot_lij_z_101 = trr_11z * dm_ij_cache[sh_ij+16*TILE2] + trr_21z * dm_ij_cache[sh_ij+17*TILE2] + trr_31z * dm_ij_cache[sh_ij+18*TILE2]; + double dot_lij_z_102 = trr_12z * dm_ij_cache[sh_ij+16*TILE2] + trr_22z * dm_ij_cache[sh_ij+17*TILE2] + trr_32z * dm_ij_cache[sh_ij+18*TILE2]; + double dot_lij_z_110 = wt * dm_ij_cache[sh_ij+19*TILE2] + trr_10z * dm_ij_cache[sh_ij+20*TILE2] + trr_20z * dm_ij_cache[sh_ij+21*TILE2]; + double dot_lij_z_111 = trr_01z * dm_ij_cache[sh_ij+19*TILE2] + trr_11z * dm_ij_cache[sh_ij+20*TILE2] + trr_21z * dm_ij_cache[sh_ij+21*TILE2]; + double dot_lij_z_112 = trr_02z * dm_ij_cache[sh_ij+19*TILE2] + trr_12z * dm_ij_cache[sh_ij+20*TILE2] + trr_22z * dm_ij_cache[sh_ij+21*TILE2]; + double dot_lij_z_120 = wt * dm_ij_cache[sh_ij+22*TILE2] + trr_10z * dm_ij_cache[sh_ij+23*TILE2]; + double dot_lij_z_121 = trr_01z * dm_ij_cache[sh_ij+22*TILE2] + trr_11z * dm_ij_cache[sh_ij+23*TILE2]; + double dot_lij_z_122 = trr_02z * dm_ij_cache[sh_ij+22*TILE2] + trr_12z * dm_ij_cache[sh_ij+23*TILE2]; + double dot_lij_z_130 = wt * dm_ij_cache[sh_ij+24*TILE2]; + double dot_lij_z_131 = trr_01z * dm_ij_cache[sh_ij+24*TILE2]; + double dot_lij_z_132 = trr_02z * dm_ij_cache[sh_ij+24*TILE2]; + double dot_lij_z_200 = wt * dm_ij_cache[sh_ij+25*TILE2] + trr_10z * dm_ij_cache[sh_ij+26*TILE2] + trr_20z * dm_ij_cache[sh_ij+27*TILE2]; + double dot_lij_z_201 = trr_01z * dm_ij_cache[sh_ij+25*TILE2] + trr_11z * dm_ij_cache[sh_ij+26*TILE2] + trr_21z * dm_ij_cache[sh_ij+27*TILE2]; + double dot_lij_z_202 = trr_02z * dm_ij_cache[sh_ij+25*TILE2] + trr_12z * dm_ij_cache[sh_ij+26*TILE2] + trr_22z * dm_ij_cache[sh_ij+27*TILE2]; + double dot_lij_z_210 = wt * dm_ij_cache[sh_ij+28*TILE2] + trr_10z * dm_ij_cache[sh_ij+29*TILE2]; + double dot_lij_z_211 = trr_01z * dm_ij_cache[sh_ij+28*TILE2] + trr_11z * dm_ij_cache[sh_ij+29*TILE2]; + double dot_lij_z_212 = trr_02z * dm_ij_cache[sh_ij+28*TILE2] + trr_12z * dm_ij_cache[sh_ij+29*TILE2]; + double dot_lij_z_220 = wt * dm_ij_cache[sh_ij+30*TILE2]; + double dot_lij_z_221 = trr_01z * dm_ij_cache[sh_ij+30*TILE2]; + double dot_lij_z_222 = trr_02z * dm_ij_cache[sh_ij+30*TILE2]; + double dot_lij_z_300 = wt * dm_ij_cache[sh_ij+31*TILE2] + trr_10z * dm_ij_cache[sh_ij+32*TILE2]; + double dot_lij_z_301 = trr_01z * dm_ij_cache[sh_ij+31*TILE2] + trr_11z * dm_ij_cache[sh_ij+32*TILE2]; + double dot_lij_z_302 = trr_02z * dm_ij_cache[sh_ij+31*TILE2] + trr_12z * dm_ij_cache[sh_ij+32*TILE2]; + double dot_lij_z_310 = wt * dm_ij_cache[sh_ij+33*TILE2]; + double dot_lij_z_311 = trr_01z * dm_ij_cache[sh_ij+33*TILE2]; + double dot_lij_z_312 = trr_02z * dm_ij_cache[sh_ij+33*TILE2]; + double dot_lij_z_400 = wt * dm_ij_cache[sh_ij+34*TILE2]; + double dot_lij_z_401 = trr_01z * dm_ij_cache[sh_ij+34*TILE2]; + double dot_lij_z_402 = trr_02z * dm_ij_cache[sh_ij+34*TILE2]; + double c0y = Rpa[sh_ij+1*TILE2] - ypq*rt_aij; + double trr_10y = c0y * 1; + double trr_20y = c0y * trr_10y + 1*b10 * 1; + double trr_30y = c0y * trr_20y + 2*b10 * trr_10y; + double trr_40y = c0y * trr_30y + 3*b10 * trr_20y; + double dot_lij_y_000 = 1 * dot_lij_z_000 + trr_10y * dot_lij_z_010 + trr_20y * dot_lij_z_020 + trr_30y * dot_lij_z_030 + trr_40y * dot_lij_z_040; + double dot_lij_y_001 = 1 * dot_lij_z_001 + trr_10y * dot_lij_z_011 + trr_20y * dot_lij_z_021 + trr_30y * dot_lij_z_031 + trr_40y * dot_lij_z_041; + double dot_lij_y_002 = 1 * dot_lij_z_002 + trr_10y * dot_lij_z_012 + trr_20y * dot_lij_z_022 + trr_30y * dot_lij_z_032 + trr_40y * dot_lij_z_042; + double cpy = yqc + ypq*rt_akl; + double trr_01y = cpy * 1; + double trr_11y = cpy * trr_10y + 1*b00 * 1; + double trr_21y = cpy * trr_20y + 2*b00 * trr_10y; + double trr_31y = cpy * trr_30y + 3*b00 * trr_20y; + double trr_41y = cpy * trr_40y + 4*b00 * trr_30y; + double dot_lij_y_010 = trr_01y * dot_lij_z_000 + trr_11y * dot_lij_z_010 + trr_21y * dot_lij_z_020 + trr_31y * dot_lij_z_030 + trr_41y * dot_lij_z_040; + double dot_lij_y_011 = trr_01y * dot_lij_z_001 + trr_11y * dot_lij_z_011 + trr_21y * dot_lij_z_021 + trr_31y * dot_lij_z_031 + trr_41y * dot_lij_z_041; + double trr_02y = cpy * trr_01y + 1*b01 * 1; + double trr_12y = cpy * trr_11y + 1*b01 * trr_10y + 1*b00 * trr_01y; + double trr_22y = cpy * trr_21y + 1*b01 * trr_20y + 2*b00 * trr_11y; + double trr_32y = cpy * trr_31y + 1*b01 * trr_30y + 3*b00 * trr_21y; + double trr_42y = cpy * trr_41y + 1*b01 * trr_40y + 4*b00 * trr_31y; + double dot_lij_y_020 = trr_02y * dot_lij_z_000 + trr_12y * dot_lij_z_010 + trr_22y * dot_lij_z_020 + trr_32y * dot_lij_z_030 + trr_42y * dot_lij_z_040; + double dot_lij_y_100 = 1 * dot_lij_z_100 + trr_10y * dot_lij_z_110 + trr_20y * dot_lij_z_120 + trr_30y * dot_lij_z_130; + double dot_lij_y_101 = 1 * dot_lij_z_101 + trr_10y * dot_lij_z_111 + trr_20y * dot_lij_z_121 + trr_30y * dot_lij_z_131; + double dot_lij_y_102 = 1 * dot_lij_z_102 + trr_10y * dot_lij_z_112 + trr_20y * dot_lij_z_122 + trr_30y * dot_lij_z_132; + double dot_lij_y_110 = trr_01y * dot_lij_z_100 + trr_11y * dot_lij_z_110 + trr_21y * dot_lij_z_120 + trr_31y * dot_lij_z_130; + double dot_lij_y_111 = trr_01y * dot_lij_z_101 + trr_11y * dot_lij_z_111 + trr_21y * dot_lij_z_121 + trr_31y * dot_lij_z_131; + double dot_lij_y_120 = trr_02y * dot_lij_z_100 + trr_12y * dot_lij_z_110 + trr_22y * dot_lij_z_120 + trr_32y * dot_lij_z_130; + double dot_lij_y_200 = 1 * dot_lij_z_200 + trr_10y * dot_lij_z_210 + trr_20y * dot_lij_z_220; + double dot_lij_y_201 = 1 * dot_lij_z_201 + trr_10y * dot_lij_z_211 + trr_20y * dot_lij_z_221; + double dot_lij_y_202 = 1 * dot_lij_z_202 + trr_10y * dot_lij_z_212 + trr_20y * dot_lij_z_222; + double dot_lij_y_210 = trr_01y * dot_lij_z_200 + trr_11y * dot_lij_z_210 + trr_21y * dot_lij_z_220; + double dot_lij_y_211 = trr_01y * dot_lij_z_201 + trr_11y * dot_lij_z_211 + trr_21y * dot_lij_z_221; + double dot_lij_y_220 = trr_02y * dot_lij_z_200 + trr_12y * dot_lij_z_210 + trr_22y * dot_lij_z_220; + double dot_lij_y_300 = 1 * dot_lij_z_300 + trr_10y * dot_lij_z_310; + double dot_lij_y_301 = 1 * dot_lij_z_301 + trr_10y * dot_lij_z_311; + double dot_lij_y_302 = 1 * dot_lij_z_302 + trr_10y * dot_lij_z_312; + double dot_lij_y_310 = trr_01y * dot_lij_z_300 + trr_11y * dot_lij_z_310; + double dot_lij_y_311 = trr_01y * dot_lij_z_301 + trr_11y * dot_lij_z_311; + double dot_lij_y_320 = trr_02y * dot_lij_z_300 + trr_12y * dot_lij_z_310; + double dot_lij_y_400 = 1 * dot_lij_z_400; + double dot_lij_y_401 = 1 * dot_lij_z_401; + double dot_lij_y_402 = 1 * dot_lij_z_402; + double dot_lij_y_410 = trr_01y * dot_lij_z_400; + double dot_lij_y_411 = trr_01y * dot_lij_z_401; + double dot_lij_y_420 = trr_02y * dot_lij_z_400; + double c0x = Rpa[sh_ij+0*TILE2] - xpq*rt_aij; + double trr_10x = c0x * fac; + double trr_20x = c0x * trr_10x + 1*b10 * fac; + double trr_30x = c0x * trr_20x + 2*b10 * trr_10x; + double trr_40x = c0x * trr_30x + 3*b10 * trr_20x; + vj_kl_001 += fac * dot_lij_y_001 + trr_10x * dot_lij_y_101 + trr_20x * dot_lij_y_201 + trr_30x * dot_lij_y_301 + trr_40x * dot_lij_y_401; + vj_kl_002 += fac * dot_lij_y_002 + trr_10x * dot_lij_y_102 + trr_20x * dot_lij_y_202 + trr_30x * dot_lij_y_302 + trr_40x * dot_lij_y_402; + vj_kl_010 += fac * dot_lij_y_010 + trr_10x * dot_lij_y_110 + trr_20x * dot_lij_y_210 + trr_30x * dot_lij_y_310 + trr_40x * dot_lij_y_410; + vj_kl_011 += fac * dot_lij_y_011 + trr_10x * dot_lij_y_111 + trr_20x * dot_lij_y_211 + trr_30x * dot_lij_y_311 + trr_40x * dot_lij_y_411; + vj_kl_020 += fac * dot_lij_y_020 + trr_10x * dot_lij_y_120 + trr_20x * dot_lij_y_220 + trr_30x * dot_lij_y_320 + trr_40x * dot_lij_y_420; + double cpx = xqc + xpq*rt_akl; + double trr_01x = cpx * fac; + double trr_11x = cpx * trr_10x + 1*b00 * fac; + double trr_21x = cpx * trr_20x + 2*b00 * trr_10x; + double trr_31x = cpx * trr_30x + 3*b00 * trr_20x; + double trr_41x = cpx * trr_40x + 4*b00 * trr_30x; + vj_kl_100 += trr_01x * dot_lij_y_000 + trr_11x * dot_lij_y_100 + trr_21x * dot_lij_y_200 + trr_31x * dot_lij_y_300 + trr_41x * dot_lij_y_400; + vj_kl_101 += trr_01x * dot_lij_y_001 + trr_11x * dot_lij_y_101 + trr_21x * dot_lij_y_201 + trr_31x * dot_lij_y_301 + trr_41x * dot_lij_y_401; + vj_kl_110 += trr_01x * dot_lij_y_010 + trr_11x * dot_lij_y_110 + trr_21x * dot_lij_y_210 + trr_31x * dot_lij_y_310 + trr_41x * dot_lij_y_410; + double trr_02x = cpx * trr_01x + 1*b01 * fac; + double trr_12x = cpx * trr_11x + 1*b01 * trr_10x + 1*b00 * trr_01x; + double trr_22x = cpx * trr_21x + 1*b01 * trr_20x + 2*b00 * trr_11x; + double trr_32x = cpx * trr_31x + 1*b01 * trr_30x + 3*b00 * trr_21x; + double trr_42x = cpx * trr_41x + 1*b01 * trr_40x + 4*b00 * trr_31x; + vj_kl_200 += trr_02x * dot_lij_y_000 + trr_12x * dot_lij_y_100 + trr_22x * dot_lij_y_200 + trr_32x * dot_lij_y_300 + trr_42x * dot_lij_y_400; + double dot_lkl_z_000 = trr_01z * dm_kl_001 + trr_02z * dm_kl_002; + double dot_lkl_z_001 = trr_11z * dm_kl_001 + trr_12z * dm_kl_002; + double dot_lkl_z_002 = trr_21z * dm_kl_001 + trr_22z * dm_kl_002; + double dot_lkl_z_003 = trr_31z * dm_kl_001 + trr_32z * dm_kl_002; + double dot_lkl_z_004 = trr_41z * dm_kl_001 + trr_42z * dm_kl_002; + double dot_lkl_z_010 = wt * dm_kl_010 + trr_01z * dm_kl_011; + double dot_lkl_z_011 = trr_10z * dm_kl_010 + trr_11z * dm_kl_011; + double dot_lkl_z_012 = trr_20z * dm_kl_010 + trr_21z * dm_kl_011; + double dot_lkl_z_013 = trr_30z * dm_kl_010 + trr_31z * dm_kl_011; + double dot_lkl_z_014 = trr_40z * dm_kl_010 + trr_41z * dm_kl_011; + double dot_lkl_z_020 = wt * dm_kl_020; + double dot_lkl_z_021 = trr_10z * dm_kl_020; + double dot_lkl_z_022 = trr_20z * dm_kl_020; + double dot_lkl_z_023 = trr_30z * dm_kl_020; + double dot_lkl_z_024 = trr_40z * dm_kl_020; + double dot_lkl_z_100 = wt * dm_kl_100 + trr_01z * dm_kl_101; + double dot_lkl_z_101 = trr_10z * dm_kl_100 + trr_11z * dm_kl_101; + double dot_lkl_z_102 = trr_20z * dm_kl_100 + trr_21z * dm_kl_101; + double dot_lkl_z_103 = trr_30z * dm_kl_100 + trr_31z * dm_kl_101; + double dot_lkl_z_104 = trr_40z * dm_kl_100 + trr_41z * dm_kl_101; + double dot_lkl_z_110 = wt * dm_kl_110; + double dot_lkl_z_111 = trr_10z * dm_kl_110; + double dot_lkl_z_112 = trr_20z * dm_kl_110; + double dot_lkl_z_113 = trr_30z * dm_kl_110; + double dot_lkl_z_114 = trr_40z * dm_kl_110; + double dot_lkl_z_200 = wt * dm_kl_200; + double dot_lkl_z_201 = trr_10z * dm_kl_200; + double dot_lkl_z_202 = trr_20z * dm_kl_200; + double dot_lkl_z_203 = trr_30z * dm_kl_200; + double dot_lkl_z_204 = trr_40z * dm_kl_200; + double dot_lkl_y_000 = 1 * dot_lkl_z_000 + trr_01y * dot_lkl_z_010 + trr_02y * dot_lkl_z_020; + double dot_lkl_y_001 = 1 * dot_lkl_z_001 + trr_01y * dot_lkl_z_011 + trr_02y * dot_lkl_z_021; + double dot_lkl_y_002 = 1 * dot_lkl_z_002 + trr_01y * dot_lkl_z_012 + trr_02y * dot_lkl_z_022; + double dot_lkl_y_003 = 1 * dot_lkl_z_003 + trr_01y * dot_lkl_z_013 + trr_02y * dot_lkl_z_023; + double dot_lkl_y_004 = 1 * dot_lkl_z_004 + trr_01y * dot_lkl_z_014 + trr_02y * dot_lkl_z_024; + double dot_lkl_y_010 = trr_10y * dot_lkl_z_000 + trr_11y * dot_lkl_z_010 + trr_12y * dot_lkl_z_020; + double dot_lkl_y_011 = trr_10y * dot_lkl_z_001 + trr_11y * dot_lkl_z_011 + trr_12y * dot_lkl_z_021; + double dot_lkl_y_012 = trr_10y * dot_lkl_z_002 + trr_11y * dot_lkl_z_012 + trr_12y * dot_lkl_z_022; + double dot_lkl_y_013 = trr_10y * dot_lkl_z_003 + trr_11y * dot_lkl_z_013 + trr_12y * dot_lkl_z_023; + double dot_lkl_y_020 = trr_20y * dot_lkl_z_000 + trr_21y * dot_lkl_z_010 + trr_22y * dot_lkl_z_020; + double dot_lkl_y_021 = trr_20y * dot_lkl_z_001 + trr_21y * dot_lkl_z_011 + trr_22y * dot_lkl_z_021; + double dot_lkl_y_022 = trr_20y * dot_lkl_z_002 + trr_21y * dot_lkl_z_012 + trr_22y * dot_lkl_z_022; + double dot_lkl_y_030 = trr_30y * dot_lkl_z_000 + trr_31y * dot_lkl_z_010 + trr_32y * dot_lkl_z_020; + double dot_lkl_y_031 = trr_30y * dot_lkl_z_001 + trr_31y * dot_lkl_z_011 + trr_32y * dot_lkl_z_021; + double dot_lkl_y_040 = trr_40y * dot_lkl_z_000 + trr_41y * dot_lkl_z_010 + trr_42y * dot_lkl_z_020; + double dot_lkl_y_100 = 1 * dot_lkl_z_100 + trr_01y * dot_lkl_z_110; + double dot_lkl_y_101 = 1 * dot_lkl_z_101 + trr_01y * dot_lkl_z_111; + double dot_lkl_y_102 = 1 * dot_lkl_z_102 + trr_01y * dot_lkl_z_112; + double dot_lkl_y_103 = 1 * dot_lkl_z_103 + trr_01y * dot_lkl_z_113; + double dot_lkl_y_104 = 1 * dot_lkl_z_104 + trr_01y * dot_lkl_z_114; + double dot_lkl_y_110 = trr_10y * dot_lkl_z_100 + trr_11y * dot_lkl_z_110; + double dot_lkl_y_111 = trr_10y * dot_lkl_z_101 + trr_11y * dot_lkl_z_111; + double dot_lkl_y_112 = trr_10y * dot_lkl_z_102 + trr_11y * dot_lkl_z_112; + double dot_lkl_y_113 = trr_10y * dot_lkl_z_103 + trr_11y * dot_lkl_z_113; + double dot_lkl_y_120 = trr_20y * dot_lkl_z_100 + trr_21y * dot_lkl_z_110; + double dot_lkl_y_121 = trr_20y * dot_lkl_z_101 + trr_21y * dot_lkl_z_111; + double dot_lkl_y_122 = trr_20y * dot_lkl_z_102 + trr_21y * dot_lkl_z_112; + double dot_lkl_y_130 = trr_30y * dot_lkl_z_100 + trr_31y * dot_lkl_z_110; + double dot_lkl_y_131 = trr_30y * dot_lkl_z_101 + trr_31y * dot_lkl_z_111; + double dot_lkl_y_140 = trr_40y * dot_lkl_z_100 + trr_41y * dot_lkl_z_110; + double dot_lkl_y_200 = 1 * dot_lkl_z_200; + double dot_lkl_y_201 = 1 * dot_lkl_z_201; + double dot_lkl_y_202 = 1 * dot_lkl_z_202; + double dot_lkl_y_203 = 1 * dot_lkl_z_203; + double dot_lkl_y_204 = 1 * dot_lkl_z_204; + double dot_lkl_y_210 = trr_10y * dot_lkl_z_200; + double dot_lkl_y_211 = trr_10y * dot_lkl_z_201; + double dot_lkl_y_212 = trr_10y * dot_lkl_z_202; + double dot_lkl_y_213 = trr_10y * dot_lkl_z_203; + double dot_lkl_y_220 = trr_20y * dot_lkl_z_200; + double dot_lkl_y_221 = trr_20y * dot_lkl_z_201; + double dot_lkl_y_222 = trr_20y * dot_lkl_z_202; + double dot_lkl_y_230 = trr_30y * dot_lkl_z_200; + double dot_lkl_y_231 = trr_30y * dot_lkl_z_201; + double dot_lkl_y_240 = trr_40y * dot_lkl_z_200; + vj_ij_002 += fac * dot_lkl_y_002 + trr_01x * dot_lkl_y_102 + trr_02x * dot_lkl_y_202; + vj_ij_003 += fac * dot_lkl_y_003 + trr_01x * dot_lkl_y_103 + trr_02x * dot_lkl_y_203; + vj_ij_004 += fac * dot_lkl_y_004 + trr_01x * dot_lkl_y_104 + trr_02x * dot_lkl_y_204; + vj_ij_011 += fac * dot_lkl_y_011 + trr_01x * dot_lkl_y_111 + trr_02x * dot_lkl_y_211; + vj_ij_012 += fac * dot_lkl_y_012 + trr_01x * dot_lkl_y_112 + trr_02x * dot_lkl_y_212; + vj_ij_013 += fac * dot_lkl_y_013 + trr_01x * dot_lkl_y_113 + trr_02x * dot_lkl_y_213; + vj_ij_020 += fac * dot_lkl_y_020 + trr_01x * dot_lkl_y_120 + trr_02x * dot_lkl_y_220; + vj_ij_021 += fac * dot_lkl_y_021 + trr_01x * dot_lkl_y_121 + trr_02x * dot_lkl_y_221; + vj_ij_022 += fac * dot_lkl_y_022 + trr_01x * dot_lkl_y_122 + trr_02x * dot_lkl_y_222; + vj_ij_030 += fac * dot_lkl_y_030 + trr_01x * dot_lkl_y_130 + trr_02x * dot_lkl_y_230; + vj_ij_031 += fac * dot_lkl_y_031 + trr_01x * dot_lkl_y_131 + trr_02x * dot_lkl_y_231; + vj_ij_040 += fac * dot_lkl_y_040 + trr_01x * dot_lkl_y_140 + trr_02x * dot_lkl_y_240; + vj_ij_101 += trr_10x * dot_lkl_y_001 + trr_11x * dot_lkl_y_101 + trr_12x * dot_lkl_y_201; + vj_ij_102 += trr_10x * dot_lkl_y_002 + trr_11x * dot_lkl_y_102 + trr_12x * dot_lkl_y_202; + vj_ij_103 += trr_10x * dot_lkl_y_003 + trr_11x * dot_lkl_y_103 + trr_12x * dot_lkl_y_203; + vj_ij_110 += trr_10x * dot_lkl_y_010 + trr_11x * dot_lkl_y_110 + trr_12x * dot_lkl_y_210; + vj_ij_111 += trr_10x * dot_lkl_y_011 + trr_11x * dot_lkl_y_111 + trr_12x * dot_lkl_y_211; + vj_ij_112 += trr_10x * dot_lkl_y_012 + trr_11x * dot_lkl_y_112 + trr_12x * dot_lkl_y_212; + vj_ij_120 += trr_10x * dot_lkl_y_020 + trr_11x * dot_lkl_y_120 + trr_12x * dot_lkl_y_220; + vj_ij_121 += trr_10x * dot_lkl_y_021 + trr_11x * dot_lkl_y_121 + trr_12x * dot_lkl_y_221; + vj_ij_130 += trr_10x * dot_lkl_y_030 + trr_11x * dot_lkl_y_130 + trr_12x * dot_lkl_y_230; + vj_ij_200 += trr_20x * dot_lkl_y_000 + trr_21x * dot_lkl_y_100 + trr_22x * dot_lkl_y_200; + vj_ij_201 += trr_20x * dot_lkl_y_001 + trr_21x * dot_lkl_y_101 + trr_22x * dot_lkl_y_201; + vj_ij_202 += trr_20x * dot_lkl_y_002 + trr_21x * dot_lkl_y_102 + trr_22x * dot_lkl_y_202; + vj_ij_210 += trr_20x * dot_lkl_y_010 + trr_21x * dot_lkl_y_110 + trr_22x * dot_lkl_y_210; + vj_ij_211 += trr_20x * dot_lkl_y_011 + trr_21x * dot_lkl_y_111 + trr_22x * dot_lkl_y_211; + vj_ij_220 += trr_20x * dot_lkl_y_020 + trr_21x * dot_lkl_y_120 + trr_22x * dot_lkl_y_220; + vj_ij_300 += trr_30x * dot_lkl_y_000 + trr_31x * dot_lkl_y_100 + trr_32x * dot_lkl_y_200; + vj_ij_301 += trr_30x * dot_lkl_y_001 + trr_31x * dot_lkl_y_101 + trr_32x * dot_lkl_y_201; + vj_ij_310 += trr_30x * dot_lkl_y_010 + trr_31x * dot_lkl_y_110 + trr_32x * dot_lkl_y_210; + vj_ij_400 += trr_40x * dot_lkl_y_000 + trr_41x * dot_lkl_y_100 + trr_42x * dot_lkl_y_200; + } + } + } + if (task_id >= ntasks) { + continue; + } + double *vj = jk.vj; + atomicAdd(vj+ij_pair0+2, vj_ij_002); + atomicAdd(vj+ij_pair0+3, vj_ij_003); + atomicAdd(vj+ij_pair0+4, vj_ij_004); + atomicAdd(vj+ij_pair0+6, vj_ij_011); + atomicAdd(vj+ij_pair0+7, vj_ij_012); + atomicAdd(vj+ij_pair0+8, vj_ij_013); + atomicAdd(vj+ij_pair0+9, vj_ij_020); + atomicAdd(vj+ij_pair0+10, vj_ij_021); + atomicAdd(vj+ij_pair0+11, vj_ij_022); + atomicAdd(vj+ij_pair0+12, vj_ij_030); + atomicAdd(vj+ij_pair0+13, vj_ij_031); + atomicAdd(vj+ij_pair0+14, vj_ij_040); + atomicAdd(vj+ij_pair0+16, vj_ij_101); + atomicAdd(vj+ij_pair0+17, vj_ij_102); + atomicAdd(vj+ij_pair0+18, vj_ij_103); + atomicAdd(vj+ij_pair0+19, vj_ij_110); + atomicAdd(vj+ij_pair0+20, vj_ij_111); + atomicAdd(vj+ij_pair0+21, vj_ij_112); + atomicAdd(vj+ij_pair0+22, vj_ij_120); + atomicAdd(vj+ij_pair0+23, vj_ij_121); + atomicAdd(vj+ij_pair0+24, vj_ij_130); + atomicAdd(vj+ij_pair0+25, vj_ij_200); + atomicAdd(vj+ij_pair0+26, vj_ij_201); + atomicAdd(vj+ij_pair0+27, vj_ij_202); + atomicAdd(vj+ij_pair0+28, vj_ij_210); + atomicAdd(vj+ij_pair0+29, vj_ij_211); + atomicAdd(vj+ij_pair0+30, vj_ij_220); + atomicAdd(vj+ij_pair0+31, vj_ij_300); + atomicAdd(vj+ij_pair0+32, vj_ij_301); + atomicAdd(vj+ij_pair0+33, vj_ij_310); + atomicAdd(vj+ij_pair0+34, vj_ij_400); + atomicAdd(vj+kl_pair0+1, vj_kl_001); + atomicAdd(vj+kl_pair0+2, vj_kl_002); + atomicAdd(vj+kl_pair0+3, vj_kl_010); + atomicAdd(vj+kl_pair0+4, vj_kl_011); + atomicAdd(vj+kl_pair0+5, vj_kl_020); + atomicAdd(vj+kl_pair0+6, vj_kl_100); + atomicAdd(vj+kl_pair0+7, vj_kl_101); + atomicAdd(vj+kl_pair0+8, vj_kl_110); + atomicAdd(vj+kl_pair0+9, vj_kl_200); + } +} +__global__ +void rys_j_4_2(RysIntEnvVars envs, JKMatrix jk, BoundsInfo bounds, + ShellQuartet *pool, uint32_t *batch_head) +{ + int b_id = blockIdx.x; + int t_id = threadIdx.x + blockDim.x * threadIdx.y; + ShellQuartet *shl_quartet_idx = pool + b_id * QUEUE_DEPTH; + __shared__ int batch_id; + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + } + __syncthreads(); + int nbatches_kl = (bounds.ntile_kl_pairs + TILES_IN_BATCH - 1) / TILES_IN_BATCH; + int nbatches = bounds.ntile_ij_pairs * nbatches_kl; + while (batch_id < nbatches) { + int batch_ij = batch_id / nbatches_kl; + int batch_kl = batch_id % nbatches_kl; + int ntasks = _fill_jk_tasks(shl_quartet_idx, envs, jk, bounds, + batch_ij, batch_kl); + if (ntasks > 0) { + int tile_ij = bounds.tile_ij_mapping[batch_ij]; + int nbas = envs.nbas; + int nbas_tiles = nbas / TILE; + int tile_i = tile_ij / nbas_tiles; + int tile_j = tile_ij % nbas_tiles; + int ish0 = tile_i * TILE; + int jsh0 = tile_j * TILE; + _rys_j_4_2(envs, jk, bounds, shl_quartet_idx, ntasks, ish0, jsh0); + } + if (t_id == 0) { + batch_id = atomicAdd(batch_head, 1); + atomicAdd(batch_head+1, ntasks); + } + __syncthreads(); + } +} + +int rys_j_unrolled(RysIntEnvVars *envs, JKMatrix *jk, BoundsInfo *bounds, + ShellQuartet *pool, uint32_t *batch_head, + int *scheme, int workers, double omega) +{ + int li = bounds->li; + int lj = bounds->lj; + int lk = bounds->lk; + int ll = bounds->ll; + int lij = li + lj; + int lkl = lk + ll; + int threads = scheme[0] * scheme[1]; + int nroots = (lij + lkl) / 2 + 1; + int nf3_ij = (lij+1)*(lij+2)*(lij+3)/6; + int iprim = bounds->iprim; + int jprim = bounds->jprim; + int buflen = (nroots*2) * threads + iprim*jprim*TILE2*4 + nf3_ij*TILE2; + if (omega < 0) { + buflen += nroots*2 * threads; + } + int ijkl = lij*9 + lkl; + switch (ijkl) { + case 0: rys_j_0_0<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 9: rys_j_1_0<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 10: rys_j_1_1<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 11: rys_j_1_2<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 18: rys_j_2_0<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 19: rys_j_2_1<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 20: rys_j_2_2<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 21: rys_j_2_3<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 22: rys_j_2_4<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 27: rys_j_3_0<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 28: rys_j_3_1<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 29: rys_j_3_2<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 30: rys_j_3_3<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 36: rys_j_4_0<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 37: rys_j_4_1<<>>(*envs, *jk, *bounds, pool, batch_head); break; + case 38: rys_j_4_2<<>>(*envs, *jk, *bounds, pool, batch_head); break; + default: return 0; + } + return 1; +} diff --git a/gpu4pyscf/lib/gvhf-rys/vhf.cuh b/gpu4pyscf/lib/gvhf-rys/vhf.cuh new file mode 100644 index 00000000..13ca09e6 --- /dev/null +++ b/gpu4pyscf/lib/gvhf-rys/vhf.cuh @@ -0,0 +1,120 @@ +#include +#include +#include + +#define PTR_RANGE_OMEGA 8 +// slots of atm +#define CHARGE_OF 0 +#define PTR_COORD 1 +#define NUC_MOD_OF 2 +#define PTR_ZETA 3 +#define PTR_FRAC_CHARGE 4 +#define RESERVE_ATMSLOT 5 +#define ATM_SLOTS 6 + +// slots of bas +#define ATOM_OF 0 +#define ANG_OF 1 +#define NPRIM_OF 2 +#define NCTR_OF 3 +#define KAPPA_OF 4 +#define PTR_EXP 5 +#define PTR_COEFF 6 +#define PTR_BAS_COORD 7 +#define BAS_SLOTS 8 + +#define LMAX 4 +#define LMAX1 (LMAX+1) +#define NCART_MAX ((LMAX+1)*(LMAX+2)/2) + +// performance drop when TILE>2, reason unclear +#define TILE 2 +#define TILE2 (TILE*TILE) +#define TILE4 (TILE2*TILE2) +// when nroots > 5, GWIDTH=57 may be better +#define GWIDTH 42 +// 2MB per block +#define QUEUE_DEPTH 262144 +#define TILES_IN_BATCH (QUEUE_DEPTH/(TILE*TILE*TILE*TILE)) +#define QUEUE_DEPTH1 65536 + +#define MIN(x, y) ((x) < (y) ? (x) : (y)) +#define MAX(x, y) ((x) > (y) ? (x) : (y)) + +// 2*pi**2.5 +#define PI_FAC 34.98683665524972497 + + +#ifndef HAVE_DEFINED_INTENVVAS_H +#define HAVE_DEFINED_INTENVVAS_H +typedef struct { + uint16_t natm; + uint16_t nbas; + int *atm; + int *bas; + double *env; + int *ao_loc; +} RysIntEnvVars; + +typedef struct { + double *vj; + double *vk; + double *dm; + uint16_t n_dm; + uint16_t atom_offset; +} JKMatrix; + +typedef struct { + uint8_t li; + uint8_t lj; + uint8_t lk; + uint8_t ll; + uint8_t nfi; + uint8_t nfk; + uint8_t nfij; + uint8_t nfkl; + uint8_t nroots; + uint8_t stride_j; + uint8_t stride_k; + uint8_t stride_l; + uint8_t iprim; + uint8_t jprim; + uint8_t kprim; + uint8_t lprim; + union {int ntile_ij_pairs; int npairs_ij;}; + union {int ntile_kl_pairs; int npairs_kl;}; + int *tile_ij_mapping; + int *tile_kl_mapping; + float *q_cond; + float *dm_cond; + float cutoff; +} BoundsInfo; + +typedef struct { + uint16_t i; + uint16_t j; + uint16_t k; + uint16_t l; +} ShellQuartet; + +typedef struct { + uint8_t x; + uint8_t y; + uint16_t fold3offset; +} Fold2Index; + +typedef struct { + uint8_t x; + uint8_t y; + uint8_t z; + uint8_t fold2yz; +} Fold3Index; +#endif + +#ifdef __CUDACC__ +extern __constant__ int c_g_pair_idx[]; +extern __constant__ int c_g_pair_offsets[]; +//extern __constant__ double c_env[]; +extern __constant__ Fold2Index c_i_in_fold2idx[]; +extern __constant__ Fold3Index c_i_in_fold3idx[]; +#endif diff --git a/gpu4pyscf/lib/logger.py b/gpu4pyscf/lib/logger.py index f5a1d5db..687665f0 100644 --- a/gpu4pyscf/lib/logger.py +++ b/gpu4pyscf/lib/logger.py @@ -57,19 +57,19 @@ def timer(rec, msg, cpu0=None, wall0=None, gpu0=None): rec._e0.record() rec._e0.synchronize() - flush(rec, ' CPU time for %50s %9.2f sec, wall time %9.2f sec, GPU time for %9.2f ms' + flush(rec, ' CPU time for %-50s %9.2f sec, wall time %9.2f sec, GPU time %9.2f ms' % (msg, rec._t0-cpu0, rec._w0-wall0, cupy.cuda.get_elapsed_time(gpu0,rec._e0))) return rec._t0, rec._w0, rec._e0 elif wall0: rec._t0, rec._w0 = process_clock(), perf_counter() if rec.verbose >= TIMER_LEVEL: - flush(rec, ' CPU time for %50s %9.2f sec, wall time %9.2f sec' + flush(rec, ' CPU time for %s %9.2f sec, wall time %9.2f sec' % (msg, rec._t0-cpu0, rec._w0-wall0)) return rec._t0, rec._w0 else: rec._t0 = process_clock() if rec.verbose >= TIMER_LEVEL: - flush(rec, ' CPU time for %50s %9.2f sec' % (msg, rec._t0-cpu0)) + flush(rec, ' CPU time for %s %9.2f sec' % (msg, rec._t0-cpu0)) return rec._t0, def _timer_debug1(rec, msg, cpu0=None, wall0=None, gpu0=None, sync=True): diff --git a/gpu4pyscf/qmmm/chelpg.py b/gpu4pyscf/qmmm/chelpg.py index 5b9f004f..874ab513 100644 --- a/gpu4pyscf/qmmm/chelpg.py +++ b/gpu4pyscf/qmmm/chelpg.py @@ -22,13 +22,10 @@ from pyscf import lib, gto from pyscf.scf import _vhf from gpu4pyscf.df import int3c2e -from gpu4pyscf.scf.hf import BasisProdCache +from gpu4pyscf.scf.int4c2e import BasisProdCache, libgint, libgvhf from gpu4pyscf.lib.cupy_helper import load_library, block_c2s_diag from gpu4pyscf.lib import logger -libgint = load_library('libgint') -libgvhf = load_library('libgvhf') - from pyscf.data import radii modified_Bondi = radii.VDW.copy() modified_Bondi[1] = 1.1/radii.BOHR # modified version diff --git a/gpu4pyscf/scf/dispersion.py b/gpu4pyscf/scf/dispersion.py index 57b7e11e..10925b19 100644 --- a/gpu4pyscf/scf/dispersion.py +++ b/gpu4pyscf/scf/dispersion.py @@ -20,13 +20,3 @@ ''' from pyscf.scf import dispersion -from gpu4pyscf.scf import hf, uhf -from gpu4pyscf.dft import rks, uks - -# Inject to SCF class -hf.SCF.do_disp = dispersion.check_disp - -hf.RHF.get_dispersion = dispersion.get_dispersion -uhf.UHF.get_dispersion = dispersion.get_dispersion -rks.RKS.get_dispersion = dispersion.get_dispersion -uks.UKS.get_dispersion = dispersion.get_dispersion diff --git a/gpu4pyscf/scf/hf.py b/gpu4pyscf/scf/hf.py index 15fe67af..bcdbab88 100644 --- a/gpu4pyscf/scf/hf.py +++ b/gpu4pyscf/scf/hf.py @@ -15,9 +15,6 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -import copy -import ctypes -import sys import h5py import numpy as np import cupy @@ -25,12 +22,11 @@ from functools import reduce from pyscf import gto from pyscf import lib as pyscf_lib -from pyscf.scf import hf, _vhf +from pyscf.scf import hf from pyscf.scf import chkfile from gpu4pyscf import lib -from gpu4pyscf.lib.cupy_helper import (eigh, load_library, tag_array, - return_cupy_array, cond) -from gpu4pyscf.scf import diis +from gpu4pyscf.lib.cupy_helper import eigh, tag_array, return_cupy_array, cond +from gpu4pyscf.scf import diis, jk from gpu4pyscf.lib import logger __all__ = [ @@ -38,253 +34,25 @@ 'energy_elec', 'RHF' ] -LMAX_ON_GPU = 4 -FREE_CUPY_CACHE = True -BINSIZE = 128 # TODO bug for 256 -libgvhf = load_library('libgvhf') - def get_jk(mol, dm, hermi=1, vhfopt=None, with_j=True, with_k=True, omega=None, verbose=None): '''Compute J, K matrices with CPU-GPU hybrid algorithm ''' - log = logger.new_logger(mol, verbose) - cput0 = log.init_timer() - if hermi != 1: - raise NotImplementedError('JK-builder only supports hermitian density matrix') - if omega is None: - omega = 0.0 - if vhfopt is None: - vhfopt = _VHFOpt(mol, 'int2e').build() - out_cupy = isinstance(dm, cupy.ndarray) - if not isinstance(dm, cupy.ndarray): dm = cupy.asarray(dm) - coeff = cupy.asarray(vhfopt.coeff) - nao, nao0 = coeff.shape - dm0 = dm - dms = dm0.reshape(-1,nao0,nao0) - dms = cupy.einsum('pi,xij,qj->xpq', coeff, dms, coeff.conj()) - dms = cupy.asarray(dms, order='C') - n_dm = dms.shape[0] - scripts = [] - vj = vk = None - vj_ptr = vk_ptr = pyscf_lib.c_null_ptr() - if with_j: - vj = cupy.zeros(dms.shape).transpose(0, 2, 1) - vj_ptr = ctypes.cast(vj.data.ptr, ctypes.c_void_p) - scripts.append('ji->s2kl') - if with_k: - vk = cupy.zeros(dms.shape).transpose(0, 2, 1) - vk_ptr = ctypes.cast(vk.data.ptr, ctypes.c_void_p) - if hermi == 1: - scripts.append('jk->s2il') - else: - scripts.append('jk->s1il') - - l_symb = pyscf_lib.param.ANGULAR - log_qs = vhfopt.log_qs - direct_scf_tol = vhfopt.direct_scf_tol - cp_idx, cp_jdx = np.tril_indices(len(vhfopt.uniq_l_ctr)) - l_ctr_shell_locs = vhfopt.l_ctr_offsets - l_ctr_ao_locs = vhfopt.mol.ao_loc[l_ctr_shell_locs] - dm_ctr_cond = np.max( - [pyscf_lib.condense('absmax', x, l_ctr_ao_locs) for x in dms.get()], axis=0) - - dm_shl = cupy.zeros([n_dm, l_ctr_shell_locs[-1], l_ctr_shell_locs[-1]]) - assert dms.flags.c_contiguous - size_l = np.array([1,3,6,10,15,21,28]) - l_ctr = vhfopt.uniq_l_ctr[:,0] - r = 0 - for i, li in enumerate(l_ctr): - i0 = l_ctr_ao_locs[i] - i1 = l_ctr_ao_locs[i+1] - ni_shls = (i1-i0)//size_l[li] - c = 0 - for j, lj in enumerate(l_ctr): - j0 = l_ctr_ao_locs[j] - j1 = l_ctr_ao_locs[j+1] - nj_shls = (j1-j0)//size_l[lj] - for idm in range(n_dm): - sub_dm = dms[idm][i0:i1,j0:j1].reshape([ni_shls, size_l[li], nj_shls, size_l[lj]]) - dm_shl[idm, r:r+ni_shls, c:c+nj_shls] = cupy.max(cupy.abs(sub_dm), axis=[1,3]) - c += nj_shls - r += ni_shls - dm_shl = cupy.max(dm_shl, axis=0) - dm_shl = cupy.log(dm_shl) - nshls = dm_shl.shape[1] - if hermi != 1: - dm_ctr_cond = (dm_ctr_cond + dm_ctr_cond.T) * .5 - fn = libgvhf.GINTbuild_jk - for cp_ij_id, log_q_ij in enumerate(log_qs): - cpi = cp_idx[cp_ij_id] - cpj = cp_jdx[cp_ij_id] - li = vhfopt.uniq_l_ctr[cpi,0] - lj = vhfopt.uniq_l_ctr[cpj,0] - if li > LMAX_ON_GPU or lj > LMAX_ON_GPU or log_q_ij.size == 0: - continue - - for cp_kl_id, log_q_kl in enumerate(log_qs[:cp_ij_id+1]): - cpk = cp_idx[cp_kl_id] - cpl = cp_jdx[cp_kl_id] - lk = vhfopt.uniq_l_ctr[cpk,0] - ll = vhfopt.uniq_l_ctr[cpl,0] - if lk > LMAX_ON_GPU or ll > LMAX_ON_GPU or log_q_kl.size == 0: - continue - - # TODO: determine cutoff based on the relevant maximum value of dm blocks? - sub_dm_cond = max(dm_ctr_cond[cpi,cpj], dm_ctr_cond[cpk,cpl], - dm_ctr_cond[cpi,cpk], dm_ctr_cond[cpj,cpk], - dm_ctr_cond[cpi,cpl], dm_ctr_cond[cpj,cpl]) - if sub_dm_cond < direct_scf_tol * 1e3: - continue - - #log_cutoff = np.log(direct_scf_tol / sub_dm_cond) - log_cutoff = np.log(direct_scf_tol) - sub_dm_cond = np.log(sub_dm_cond) - - bins_locs_ij = vhfopt.bins[cp_ij_id] - bins_locs_kl = vhfopt.bins[cp_kl_id] - - log_q_ij = cupy.asarray(log_q_ij, dtype=np.float64) - log_q_kl = cupy.asarray(log_q_kl, dtype=np.float64) - - bins_floor_ij = vhfopt.bins_floor[cp_ij_id] - bins_floor_kl = vhfopt.bins_floor[cp_kl_id] - #if li + lj + lk + ll < 8: - # continue - nbins_ij = len(bins_locs_ij) - 1 - nbins_kl = len(bins_locs_kl) - 1 - err = fn(vhfopt.bpcache, vj_ptr, vk_ptr, - ctypes.cast(dms.data.ptr, ctypes.c_void_p), - ctypes.c_int(nao), ctypes.c_int(n_dm), - bins_locs_ij.ctypes.data_as(ctypes.c_void_p), - bins_locs_kl.ctypes.data_as(ctypes.c_void_p), - bins_floor_ij.ctypes.data_as(ctypes.c_void_p), - bins_floor_kl.ctypes.data_as(ctypes.c_void_p), - ctypes.c_int(nbins_ij), - ctypes.c_int(nbins_kl), - ctypes.c_int(cp_ij_id), - ctypes.c_int(cp_kl_id), - ctypes.c_double(omega), - ctypes.c_double(log_cutoff), - ctypes.c_double(sub_dm_cond), - ctypes.cast(dm_shl.data.ptr, ctypes.c_void_p), - ctypes.c_int(nshls), - ctypes.cast(log_q_ij.data.ptr, ctypes.c_void_p), - ctypes.cast(log_q_kl.data.ptr, ctypes.c_void_p) - ) - if err != 0: - detail = f'CUDA Error for ({l_symb[li]}{l_symb[lj]}|{l_symb[lk]}{l_symb[ll]})' - raise RuntimeError(detail) - #log.debug1('(%s%s|%s%s) on GPU %.3fs', - # l_symb[li], l_symb[lj], l_symb[lk], l_symb[ll], - # time.perf_counter() - t0) - #print(li, lj, lk, ll, time.perf_counter() - t0) - #exit() - - if with_j: - vj_ao = [] - #vj = [cupy.einsum('pi,pq,qj->ij', coeff, x, coeff) for x in vj] - for x in vj: - #x = cupy.einsum('pi,pq->iq', coeff, x) - #x = cupy.einsum('iq,qj->ij', x, coeff) - x = coeff.T @ x @ coeff - vj_ao.append(2.0*(x + x.T)) - vj = vj_ao - - if with_k: - vk_ao = [] - for x in vk: - #x = cupy.einsum('pi,pq->iq', coeff, x) - #x = cupy.einsum('iq,qj->ij', x, coeff) - x = coeff.T @ x @ coeff - vk_ao.append(x + x.T) - vk = vk_ao - - cput0 = log.timer_debug1('get_jk pass 1 on gpu', *cput0) - h_shls = vhfopt.h_shls - if h_shls: - log.debug3('Integrals for %s functions on CPU', l_symb[LMAX_ON_GPU+1]) - pmol = vhfopt.mol - shls_excludes = [0, h_shls[0]] * 4 - vs_h = _vhf.direct_mapdm('int2e_cart', 's8', scripts, - dms.get(), 1, pmol._atm, pmol._bas, pmol._env, - vhfopt=vhfopt, shls_excludes=shls_excludes) - coeff = vhfopt.coeff - idx, idy = np.tril_indices(nao, -1) - if with_j and with_k: - vj1 = vs_h[0].reshape(n_dm,nao,nao) - vk1 = vs_h[1].reshape(n_dm,nao,nao) - elif with_j: - vj1 = vs_h[0].reshape(n_dm,nao,nao) - else: - vk1 = vs_h[0].reshape(n_dm,nao,nao) - - if with_j: - vj1[:,idy,idx] = vj1[:,idx,idy] - vj1 = cupy.asarray(vj1) - for i, v in enumerate(vj1): - vj[i] += coeff.T.dot(v).dot(coeff) - if with_k: - if hermi: - vk1[:,idy,idx] = vk1[:,idx,idy] - vk1 = cupy.asarray(vk1) - for i, v in enumerate(vk1): - vk[i] += coeff.T.dot(v).dot(coeff) - cput0 = log.timer_debug1('get_jk pass 2 for l>4 basis on cpu', *cput0) - - if FREE_CUPY_CACHE: - coeff = dms = None - cupy.get_default_memory_pool().free_all_blocks() - - if dm0.ndim == 2: - if with_j: - vj = vj[0] - if with_k: - vk = vk[0] - else: - if with_j: - vj = cupy.asarray(vj).reshape(dm0.shape) - if with_k: - vk = cupy.asarray(vk).reshape(dm0.shape) - if out_cupy: - return vj, vk - else: - if with_j: - vj = vj.get() - if with_k: - vk = vk.get() - return vj, vk + with mol.with_range_coulomb(omega): + vj, vk = jk.get_jk(mol, dm, hermi, vhfopt, with_j, with_k, verbose) + if not isinstance(dm, cupy.ndarray): + if with_j: vj = vj.get() + if with_k: vk = vk.get() + return vj, vk def _get_jk(mf, mol=None, dm=None, hermi=1, with_j=True, with_k=True, omega=None): - if omega is not None: - assert omega >= 0 - - log = logger.new_logger(mf) - cput0 = log.init_timer() - log.debug3('apply get_jk on gpu') - if omega is None: - if hasattr(mf, '_opt_gpu'): - vhfopt = mf._opt_gpu - else: - vhfopt = _VHFOpt(mol, getattr(mf.opt, '_intor', 'int2e'), - getattr(mf.opt, 'prescreen', 'CVHFnrs8_prescreen'), - getattr(mf.opt, '_qcondname', 'CVHFsetnr_direct_scf'), - getattr(mf.opt, '_dmcondname', 'CVHFsetnr_direct_scf_dm')) - vhfopt.build(mf.direct_scf_tol) - mf._opt_gpu = vhfopt - else: - if hasattr(mf, '_opt_gpu_omega'): - vhfopt = mf._opt_gpu_omega - else: - with mol.with_range_coulomb(omega): - vhfopt = _VHFOpt(mol, getattr(mf.opt, '_intor', 'int2e'), - getattr(mf.opt, 'prescreen', 'CVHFnrs8_prescreen'), - getattr(mf.opt, '_qcondname', 'CVHFsetnr_direct_scf'), - getattr(mf.opt, '_dmcondname', 'CVHFsetnr_direct_scf_dm')) - vhfopt.build(mf.direct_scf_tol) - mf._opt_gpu_omega = vhfopt - vj, vk = get_jk(mol, dm, hermi, vhfopt, with_j, with_k, omega, verbose=log) - log.timer('vj and vk on gpu', *cput0) + vhfopt = mf._opt_gpu.get(omega) + if vhfopt is None: + with mol.with_range_coulomb(omega): + vhfopt = mf._opt_gpu[omega] = jk._VHFOpt(mol, mf.direct_scf_tol).build() + + vj, vk = get_jk(mol, dm, hermi, vhfopt, with_j, with_k, omega) return vj, vk def make_rdm1(mf, mo_coeff=None, mo_occ=None, **kwargs): @@ -598,8 +366,6 @@ class SCF(pyscf_lib.StreamObject): # methods def __init__(self, mol): if not mol._built: - sys.stderr.write('Warning: %s must be initialized before calling SCF.\n' - 'Initialize %s in %s\n' % (mol, mol, self)) mol.build() self.mol = mol self.verbose = mol.verbose @@ -618,7 +384,7 @@ def __init__(self, mol): self.converged = False self.scf_summary = {} - self._opt = {None: None} + self._opt_gpu = {None: None} self._eri = None # Note: self._eri requires large amount of memory def check_sanity(self): @@ -656,6 +422,8 @@ def check_sanity(self): check_convergence = None _eigh = staticmethod(eigh) eig = hf.SCF.eig + do_disp = hf.SCF.do_disp + get_dispersion = hf.SCF.get_dispersion scf = hf.SCF.scf as_scanner = hf.SCF.as_scanner @@ -684,8 +452,7 @@ def check_sanity(self): def reset(self, mol=None): if mol is not None: self.mol = mol - self._opt_gpu = None - self._opt_gpu_omega = None + self._opt_gpu = {None: None} self.scf_summary = {} return self @@ -758,306 +525,3 @@ def to_cpu(self): mf = hf.RHF(self.mol) utils.to_cpu(self, out=mf) return mf - -class _VHFOpt: - from gpu4pyscf.lib.utils import to_cpu, to_gpu, device - - def __init__(self, mol, intor, prescreen='CVHFnoscreen', - qcondname='CVHFsetnr_direct_scf', dmcondname=None): - self.mol, self.coeff = basis_seg_contraction(mol) - self.coeff = cupy.asarray(self.coeff) - # Note mol._bas will be sorted in .build() method. VHFOpt should be - # initialized after mol._bas updated. - self._intor = intor - self._prescreen = prescreen - self._qcondname = qcondname - self._dmcondname = dmcondname - - def build(self, cutoff=1e-13, group_size=None, diag_block_with_triu=False): - mol = self.mol - cput0 = logger.init_timer(mol) - # Sort basis according to angular momentum and contraction patterns so - # as to group the basis functions to blocks in GPU kernel. - l_ctrs = mol._bas[:,[gto.ANG_OF, gto.NPRIM_OF]] - uniq_l_ctr, _, inv_idx, l_ctr_counts = np.unique( - l_ctrs, return_index=True, return_inverse=True, return_counts=True, axis=0) - - # Limit the number of AOs in each group - if group_size is not None: - uniq_l_ctr, l_ctr_counts = _split_l_ctr_groups( - uniq_l_ctr, l_ctr_counts, group_size) - - if mol.verbose >= logger.DEBUG: - logger.debug1(mol, 'Number of shells for each [l, nctr] group') - for l_ctr, n in zip(uniq_l_ctr, l_ctr_counts): - logger.debug(mol, ' %s : %s', l_ctr, n) - - sorted_idx = np.argsort(inv_idx.ravel(), kind='stable').astype(np.int32) - # Sort contraction coefficients before updating self.mol - ao_loc = mol.ao_loc_nr(cart=True) - nao = ao_loc[-1] - # Some addressing problems in GPU kernel code - assert nao < 32768 - ao_idx = np.array_split(np.arange(nao), ao_loc[1:-1]) - ao_idx = np.hstack([ao_idx[i] for i in sorted_idx]) - self.coeff = self.coeff[ao_idx] - # Sort basis inplace - mol._bas = mol._bas[sorted_idx] - - # Initialize vhfopt after reordering mol._bas - _vhf.VHFOpt.__init__(self, mol, self._intor, self._prescreen, - self._qcondname, self._dmcondname) - self.direct_scf_tol = cutoff - - lmax = uniq_l_ctr[:,0].max() - nbas_by_l = [l_ctr_counts[uniq_l_ctr[:,0]==l].sum() for l in range(lmax+1)] - l_slices = np.append(0, np.cumsum(nbas_by_l)) - if lmax >= LMAX_ON_GPU: - self.g_shls = l_slices[LMAX_ON_GPU:LMAX_ON_GPU+2].tolist() - else: - self.g_shls = [] - if lmax > LMAX_ON_GPU: - self.h_shls = l_slices[LMAX_ON_GPU+1:].tolist() - else: - self.h_shls = [] - - # TODO: is it more accurate to filter with overlap_cond (or exp_cond)? - q_cond = self.get_q_cond() - cput1 = logger.timer(mol, 'Initialize q_cond', *cput0) - log_qs = [] - pair2bra = [] - pair2ket = [] - bins = [] - bins_floor = [] - l_ctr_offsets = np.append(0, np.cumsum(l_ctr_counts)) - for i, (p0, p1) in enumerate(zip(l_ctr_offsets[:-1], l_ctr_offsets[1:])): - if uniq_l_ctr[i,0] > LMAX_ON_GPU: - # no integrals with h functions should be evaluated on GPU - continue - - for q0, q1 in zip(l_ctr_offsets[:i], l_ctr_offsets[1:i+1]): - q_sub = q_cond[p0:p1,q0:q1] - idx = np.argwhere(q_sub > cutoff) - q_sub = q_sub[idx[:,0], idx[:,1]] - log_q = np.log(q_sub) - log_q[log_q > 0] = 0 - nbins = (len(log_q) + BINSIZE)//BINSIZE - s_index, bin_floor = _make_s_index(log_q, nbins=nbins, cutoff=cutoff) - - ishs = idx[:,0] - jshs = idx[:,1] - idx = np.lexsort((ishs, jshs, s_index), axis=-1) - ishs = ishs[idx] - jshs = jshs[idx] - s_index = s_index[idx] - - ishs += p0 - jshs += q0 - pair2bra.append(ishs) - pair2ket.append(jshs) - bins.append(_make_bins(s_index, nbins=nbins)) - bins_floor.append(bin_floor) - log_qs.append(cupy.asarray(log_q[idx])) - - q_sub = q_cond[p0:p1,p0:p1] - idx = np.argwhere(q_sub > cutoff) - if not diag_block_with_triu: - # Drop the shell pairs in the upper triangle for diagonal blocks - mask = idx[:,0] >= idx[:,1] - idx = idx[mask,:] - - q_sub = q_sub[idx[:,0], idx[:,1]] - log_q = np.log(q_sub) - log_q[log_q > 0] = 0 - nbins = (len(log_q) + BINSIZE)//BINSIZE - s_index, bin_floor = _make_s_index(log_q, nbins=nbins, cutoff=cutoff) - ishs = idx[:,0] - jshs = idx[:,1] - idx = np.lexsort((ishs, jshs, s_index), axis=-1) - ishs = ishs[idx] - jshs = jshs[idx] - s_index = s_index[idx] - - ishs += p0 - jshs += p0 - pair2bra.append(ishs) - pair2ket.append(jshs) - bins.append(_make_bins(s_index, nbins=nbins)) - bins_floor.append(bin_floor) - log_qs.append(cupy.asarray(log_q[idx])) - - # TODO - self.pair2bra = pair2bra - self.pair2ket = pair2ket - self.uniq_l_ctr = uniq_l_ctr - self.l_ctr_offsets = l_ctr_offsets - self.bas_pair2shls = np.hstack( - pair2bra + pair2ket).astype(np.int32).reshape(2,-1) - - self.bas_pairs_locs = np.append( - 0, np.cumsum([x.size for x in pair2bra])).astype(np.int32) - self.bins = bins - self.bins_floor = bins_floor - self.log_qs = log_qs - ao_loc = mol.ao_loc_nr(cart=True) - ncptype = len(log_qs) - self.bpcache = ctypes.POINTER(BasisProdCache)() - if diag_block_with_triu: - scale_shellpair_diag = 1. - else: - scale_shellpair_diag = 0.5 - libgvhf.GINTinit_basis_prod( - ctypes.byref(self.bpcache), ctypes.c_double(scale_shellpair_diag), - ao_loc.ctypes.data_as(ctypes.c_void_p), - self.bas_pair2shls.ctypes.data_as(ctypes.c_void_p), - self.bas_pairs_locs.ctypes.data_as(ctypes.c_void_p), ctypes.c_int(ncptype), - mol._atm.ctypes.data_as(ctypes.c_void_p), ctypes.c_int(mol.natm), - mol._bas.ctypes.data_as(ctypes.c_void_p), ctypes.c_int(mol.nbas), - mol._env.ctypes.data_as(ctypes.c_void_p)) - logger.timer(mol, 'Initialize GPU cache', *cput1) - return self - - init_cvhf_direct = _vhf.VHFOpt.init_cvhf_direct - get_q_cond = _vhf.VHFOpt.get_q_cond - set_dm = _vhf.VHFOpt.set_dm - - def clear(self): - _vhf.VHFOpt.__del__(self) - libgvhf.GINTdel_basis_prod(ctypes.byref(self.bpcache)) - return self - - def __del__(self): - try: - self.clear() - except AttributeError: - pass - -class BasisProdCache(ctypes.Structure): - pass - -def basis_seg_contraction(mol, allow_replica=False): - '''transform generally contracted basis to segment contracted basis - Kwargs: - allow_replica: - transform the generally contracted basis to replicated - segment-contracted basis - ''' - bas_templates = {} - _bas = [] - _env = mol._env.copy() - contr_coeff = [] - aoslices = mol.aoslice_by_atom() - for ia, (ib0, ib1) in enumerate(aoslices[:,:2]): - key = tuple(mol._bas[ib0:ib1,gto.PTR_EXP]) - if key in bas_templates: - bas_of_ia, coeff = bas_templates[key] - bas_of_ia = bas_of_ia.copy() - bas_of_ia[:,gto.ATOM_OF] = ia - else: - # Generate the template for decontracted basis - coeff = [] - bas_of_ia = [] - for shell in mol._bas[ib0:ib1]: - l = shell[gto.ANG_OF] - nf = (l + 1) * (l + 2) // 2 - nctr = shell[gto.NCTR_OF] - if nctr == 1: - bas_of_ia.append(shell) - coeff.append(np.eye(nf)) - continue - # Only basis with nctr > 1 needs to be decontracted - nprim = shell[gto.NPRIM_OF] - pcoeff = shell[gto.PTR_COEFF] - if allow_replica: - coeff.extend([np.eye(nf)] * nctr) - bs = np.repeat(shell[np.newaxis], nctr, axis=0) - bs[:,gto.NCTR_OF] = 1 - bs[:,gto.PTR_COEFF] = np.arange(pcoeff, pcoeff+nprim*nctr, nprim) - bas_of_ia.append(bs) - else: - pexp = shell[gto.PTR_EXP] - exps = _env[pexp:pexp+nprim] - norm = gto.gto_norm(l, exps) - # remove normalization from contraction coefficients - c = _env[pcoeff:pcoeff+nprim*nctr].reshape(nctr,nprim) - c = np.einsum('ip,p,ef->iepf', c, 1/norm, np.eye(nf)) - coeff.append(c.reshape(nf*nctr, nf*nprim).T) - - _env[pcoeff:pcoeff+nprim] = norm - bs = np.repeat(shell[np.newaxis], nprim, axis=0) - bs[:,gto.NPRIM_OF] = 1 - bs[:,gto.NCTR_OF] = 1 - bs[:,gto.PTR_EXP] = np.arange(pexp, pexp+nprim) - bs[:,gto.PTR_COEFF] = np.arange(pcoeff, pcoeff+nprim) - bas_of_ia.append(bs) - - bas_of_ia = np.vstack(bas_of_ia) - bas_templates[key] = (bas_of_ia, coeff) - - _bas.append(bas_of_ia) - contr_coeff.extend(coeff) - - pmol = copy.copy(mol) - pmol.cart = True - pmol._bas = np.asarray(np.vstack(_bas), dtype=np.int32) - pmol._env = _env - contr_coeff = scipy.linalg.block_diag(*contr_coeff) - - if not mol.cart: - contr_coeff = contr_coeff.dot(mol.cart2sph_coeff()) - return pmol, contr_coeff - -def _make_s_index_offsets(log_q, nbins=10, cutoff=1e-12): - '''Divides the shell pairs to "nbins" collections down to "cutoff"''' - scale = nbins / np.log(min(cutoff, .1)) - s_index = np.floor(scale * log_q).astype(np.int32) - bins = np.bincount(s_index) - if bins.size < nbins: - bins = np.append(bins, np.zeros(nbins-bins.size, dtype=np.int32)) - else: - bins = bins[:nbins] - assert bins.max() < 65536 * 8 - return np.append(0, np.cumsum(bins)).astype(np.int32) - -def _make_s_index(log_q, nbins=10, cutoff=1e-12): - '''Divides the shell pairs to "nbins" collections down to "cutoff"''' - scale = nbins / np.log(min(cutoff, .1)) - s_index = np.floor(scale * log_q).astype(np.int32) - bins_floor = np.arange(nbins) / scale - return s_index, bins_floor - -def _make_bins(s_index, nbins=10): - bins = np.bincount(s_index) - if bins.size < nbins: - bins = np.append(bins, np.zeros(nbins-bins.size, dtype=np.int32)) - else: - bins = bins[:nbins] - assert bins.max() < 65536 * 8 - return np.append(0, np.cumsum(bins)).astype(np.int32) - -def _split_l_ctr_groups(uniq_l_ctr, l_ctr_counts, group_size): - '''Splits l_ctr patterns into small groups with group_size the maximum - number of AOs in each group - ''' - l = uniq_l_ctr[:,0] - nf = l * (l + 1) // 2 - _l_ctrs = [] - _l_ctr_counts = [] - for l_ctr, counts in zip(uniq_l_ctr, l_ctr_counts): - l = l_ctr[0] - nf = (l + 1) * (l + 2) // 2 - max_shells = max(group_size // nf, 2) - if l > LMAX_ON_GPU or counts <= max_shells: - _l_ctrs.append(l_ctr) - _l_ctr_counts.append(counts) - continue - - nsubs, rests = counts.__divmod__(max_shells) - _l_ctrs.extend([l_ctr] * nsubs) - _l_ctr_counts.extend([max_shells] * nsubs) - if rests > 0: - _l_ctrs.append(l_ctr) - _l_ctr_counts.append(rests) - uniq_l_ctr = np.vstack(_l_ctrs) - l_ctr_counts = np.hstack(_l_ctr_counts) - return uniq_l_ctr, l_ctr_counts diff --git a/gpu4pyscf/scf/int2c2e.py b/gpu4pyscf/scf/int2c2e.py index 10b6fc59..8ec1564d 100644 --- a/gpu4pyscf/scf/int2c2e.py +++ b/gpu4pyscf/scf/int2c2e.py @@ -16,12 +16,10 @@ import ctypes import cupy import numpy as np -from gpu4pyscf.scf.hf import _make_s_index_offsets +from gpu4pyscf.scf.int4c2e import _make_s_index_offsets, libgint from gpu4pyscf.lib.cupy_helper import load_library, take_last2d from gpu4pyscf.df.int3c2e import VHFOpt, make_fake_mol -libgint = load_library('libgint') - def get_int2c2e_sorted(mol, intopt=None, direct_scf_tol=1e-13, aosym=None, omega=None, stream=None): ''' Generated int2c2e consistent with pyscf diff --git a/gpu4pyscf/scf/int4c2e.py b/gpu4pyscf/scf/int4c2e.py index 8e4049a1..3c75827a 100644 --- a/gpu4pyscf/scf/int4c2e.py +++ b/gpu4pyscf/scf/int4c2e.py @@ -17,13 +17,18 @@ import ctypes import copy import numpy as np +import scipy.linalg import cupy +from pyscf import gto from pyscf.scf import _vhf -from gpu4pyscf.scf.hf import BasisProdCache, _make_s_index_offsets, _VHFOpt from gpu4pyscf.lib.cupy_helper import block_c2s_diag, cart2sph, block_diag, contract, load_library, c2s_l +from gpu4pyscf.lib import logger +LMAX_ON_GPU = 4 +FREE_CUPY_CACHE = True +BINSIZE = 128 # TODO bug for 256 +libgvhf = load_library('libgvhf') libgint = load_library('libgint') -libcupy_helper = load_library('libcupy_helper') _einsum = cupy.einsum """ @@ -109,7 +114,6 @@ def get_int3c2e_ip(mol, auxmol=None, ip_type=1, auxbasis='weigend+etb', direct_s ip_type == 1: int3c2e_ip1 ip_type == 2: int3c2e_ip2 ''' - from gpu4pyscf.scf.hf import _VHFOpt fn = getattr(libgint, 'GINTfill_int3c2e_' + ip_type) if omega is None: omega = 0.0 if stream is None: stream = cupy.cuda.get_current_stream() @@ -439,4 +443,305 @@ def loop_int4c2e_general(intopt, ip_type='', direct_scf_tol=1e-13, omega=None, s if cp_ij_id == cp_kl_id: int4c *= 0.5 yield i0,i1,j0,j1,k0,k1,l0,l1,int4c - \ No newline at end of file + +class _VHFOpt: + from gpu4pyscf.lib.utils import to_cpu, to_gpu, device + + def __init__(self, mol, intor, prescreen='CVHFnoscreen', + qcondname='CVHFsetnr_direct_scf', dmcondname=None): + self.mol, self.coeff = basis_seg_contraction(mol) + self.coeff = cupy.asarray(self.coeff) + # Note mol._bas will be sorted in .build() method. VHFOpt should be + # initialized after mol._bas updated. + self._intor = intor + self._prescreen = prescreen + self._qcondname = qcondname + self._dmcondname = dmcondname + + def build(self, cutoff=1e-13, group_size=None, diag_block_with_triu=False): + mol = self.mol + cput0 = logger.init_timer(mol) + # Sort basis according to angular momentum and contraction patterns so + # as to group the basis functions to blocks in GPU kernel. + l_ctrs = mol._bas[:,[gto.ANG_OF, gto.NPRIM_OF]] + uniq_l_ctr, _, inv_idx, l_ctr_counts = np.unique( + l_ctrs, return_index=True, return_inverse=True, return_counts=True, axis=0) + + # Limit the number of AOs in each group + if group_size is not None: + uniq_l_ctr, l_ctr_counts = _split_l_ctr_groups( + uniq_l_ctr, l_ctr_counts, group_size) + + if mol.verbose >= logger.DEBUG1: + logger.debug1(mol, 'Number of shells for each [l, nprim] group') + for l_ctr, n in zip(uniq_l_ctr, l_ctr_counts): + logger.debug1(mol, ' %s : %s', l_ctr, n) + + sorted_idx = np.argsort(inv_idx.ravel(), kind='stable').astype(np.int32) + # Sort contraction coefficients before updating self.mol + ao_loc = mol.ao_loc_nr(cart=True) + nao = ao_loc[-1] + # Some addressing problems in GPU kernel code + assert nao < 32768 + ao_idx = np.array_split(np.arange(nao), ao_loc[1:-1]) + ao_idx = np.hstack([ao_idx[i] for i in sorted_idx]) + self.coeff = self.coeff[ao_idx] + # Sort basis inplace + mol._bas = mol._bas[sorted_idx] + + # Initialize vhfopt after reordering mol._bas + _vhf.VHFOpt.__init__(self, mol, self._intor, self._prescreen, + self._qcondname, self._dmcondname) + self.direct_scf_tol = cutoff + + lmax = uniq_l_ctr[:,0].max() + nbas_by_l = [l_ctr_counts[uniq_l_ctr[:,0]==l].sum() for l in range(lmax+1)] + l_slices = np.append(0, np.cumsum(nbas_by_l)) + if lmax >= LMAX_ON_GPU: + self.g_shls = l_slices[LMAX_ON_GPU:LMAX_ON_GPU+2].tolist() + else: + self.g_shls = [] + if lmax > LMAX_ON_GPU: + self.h_shls = l_slices[LMAX_ON_GPU+1:].tolist() + else: + self.h_shls = [] + + # TODO: is it more accurate to filter with overlap_cond (or exp_cond)? + q_cond = self.get_q_cond() + cput1 = logger.timer(mol, 'Initialize q_cond', *cput0) + log_qs = [] + pair2bra = [] + pair2ket = [] + bins = [] + bins_floor = [] + l_ctr_offsets = np.append(0, np.cumsum(l_ctr_counts)) + for i, (p0, p1) in enumerate(zip(l_ctr_offsets[:-1], l_ctr_offsets[1:])): + if uniq_l_ctr[i,0] > LMAX_ON_GPU: + # no integrals with h functions should be evaluated on GPU + continue + + for q0, q1 in zip(l_ctr_offsets[:i], l_ctr_offsets[1:i+1]): + q_sub = q_cond[p0:p1,q0:q1] + idx = np.argwhere(q_sub > cutoff) + q_sub = q_sub[idx[:,0], idx[:,1]] + log_q = np.log(q_sub) + log_q[log_q > 0] = 0 + nbins = (len(log_q) + BINSIZE)//BINSIZE + s_index, bin_floor = _make_s_index(log_q, nbins=nbins, cutoff=cutoff) + + ishs = idx[:,0] + jshs = idx[:,1] + idx = np.lexsort((ishs, jshs, s_index), axis=-1) + ishs = ishs[idx] + jshs = jshs[idx] + s_index = s_index[idx] + + ishs += p0 + jshs += q0 + pair2bra.append(ishs) + pair2ket.append(jshs) + bins.append(_make_bins(s_index, nbins=nbins)) + bins_floor.append(bin_floor) + log_qs.append(cupy.asarray(log_q[idx])) + + q_sub = q_cond[p0:p1,p0:p1] + idx = np.argwhere(q_sub > cutoff) + if not diag_block_with_triu: + # Drop the shell pairs in the upper triangle for diagonal blocks + mask = idx[:,0] >= idx[:,1] + idx = idx[mask,:] + + q_sub = q_sub[idx[:,0], idx[:,1]] + log_q = np.log(q_sub) + log_q[log_q > 0] = 0 + nbins = (len(log_q) + BINSIZE)//BINSIZE + s_index, bin_floor = _make_s_index(log_q, nbins=nbins, cutoff=cutoff) + ishs = idx[:,0] + jshs = idx[:,1] + idx = np.lexsort((ishs, jshs, s_index), axis=-1) + ishs = ishs[idx] + jshs = jshs[idx] + s_index = s_index[idx] + + ishs += p0 + jshs += p0 + pair2bra.append(ishs) + pair2ket.append(jshs) + bins.append(_make_bins(s_index, nbins=nbins)) + bins_floor.append(bin_floor) + log_qs.append(cupy.asarray(log_q[idx])) + + # TODO + self.pair2bra = pair2bra + self.pair2ket = pair2ket + self.uniq_l_ctr = uniq_l_ctr + self.l_ctr_offsets = l_ctr_offsets + self.bas_pair2shls = np.hstack( + pair2bra + pair2ket).astype(np.int32).reshape(2,-1) + + self.bas_pairs_locs = np.append( + 0, np.cumsum([x.size for x in pair2bra])).astype(np.int32) + self.bins = bins + self.bins_floor = bins_floor + self.log_qs = log_qs + ao_loc = mol.ao_loc_nr(cart=True) + ncptype = len(log_qs) + self.bpcache = ctypes.POINTER(BasisProdCache)() + if diag_block_with_triu: + scale_shellpair_diag = 1. + else: + scale_shellpair_diag = 0.5 + libgvhf.GINTinit_basis_prod( + ctypes.byref(self.bpcache), ctypes.c_double(scale_shellpair_diag), + ao_loc.ctypes.data_as(ctypes.c_void_p), + self.bas_pair2shls.ctypes.data_as(ctypes.c_void_p), + self.bas_pairs_locs.ctypes.data_as(ctypes.c_void_p), ctypes.c_int(ncptype), + mol._atm.ctypes.data_as(ctypes.c_void_p), ctypes.c_int(mol.natm), + mol._bas.ctypes.data_as(ctypes.c_void_p), ctypes.c_int(mol.nbas), + mol._env.ctypes.data_as(ctypes.c_void_p)) + logger.timer(mol, 'Initialize GPU cache', *cput1) + return self + + init_cvhf_direct = _vhf.VHFOpt.init_cvhf_direct + get_q_cond = _vhf.VHFOpt.get_q_cond + set_dm = _vhf.VHFOpt.set_dm + + def clear(self): + _vhf.VHFOpt.__del__(self) + libgvhf.GINTdel_basis_prod(ctypes.byref(self.bpcache)) + return self + + def __del__(self): + try: + self.clear() + except AttributeError: + pass + +class BasisProdCache(ctypes.Structure): + pass + +def basis_seg_contraction(mol, allow_replica=False): + '''transform generally contracted basis to segment contracted basis + Kwargs: + allow_replica: + transform the generally contracted basis to replicated + segment-contracted basis + ''' + bas_templates = {} + _bas = [] + _env = mol._env.copy() + contr_coeff = [] + aoslices = mol.aoslice_by_atom() + for ia, (ib0, ib1) in enumerate(aoslices[:,:2]): + key = tuple(mol._bas[ib0:ib1,gto.PTR_EXP]) + if key in bas_templates: + bas_of_ia, coeff = bas_templates[key] + bas_of_ia = bas_of_ia.copy() + bas_of_ia[:,gto.ATOM_OF] = ia + else: + # Generate the template for decontracted basis + coeff = [] + bas_of_ia = [] + for shell in mol._bas[ib0:ib1]: + l = shell[gto.ANG_OF] + nf = (l + 1) * (l + 2) // 2 + nctr = shell[gto.NCTR_OF] + if nctr == 1: + bas_of_ia.append(shell) + coeff.append(np.eye(nf)) + continue + # Only basis with nctr > 1 needs to be decontracted + nprim = shell[gto.NPRIM_OF] + pcoeff = shell[gto.PTR_COEFF] + if allow_replica: + coeff.extend([np.eye(nf)] * nctr) + bs = np.repeat(shell[np.newaxis], nctr, axis=0) + bs[:,gto.NCTR_OF] = 1 + bs[:,gto.PTR_COEFF] = np.arange(pcoeff, pcoeff+nprim*nctr, nprim) + bas_of_ia.append(bs) + else: + pexp = shell[gto.PTR_EXP] + exps = _env[pexp:pexp+nprim] + norm = gto.gto_norm(l, exps) + # remove normalization from contraction coefficients + c = _env[pcoeff:pcoeff+nprim*nctr].reshape(nctr,nprim) + c = np.einsum('ip,p,ef->iepf', c, 1/norm, np.eye(nf)) + coeff.append(c.reshape(nf*nctr, nf*nprim).T) + + _env[pcoeff:pcoeff+nprim] = norm + bs = np.repeat(shell[np.newaxis], nprim, axis=0) + bs[:,gto.NPRIM_OF] = 1 + bs[:,gto.NCTR_OF] = 1 + bs[:,gto.PTR_EXP] = np.arange(pexp, pexp+nprim) + bs[:,gto.PTR_COEFF] = np.arange(pcoeff, pcoeff+nprim) + bas_of_ia.append(bs) + + bas_of_ia = np.vstack(bas_of_ia) + bas_templates[key] = (bas_of_ia, coeff) + + _bas.append(bas_of_ia) + contr_coeff.extend(coeff) + + pmol = copy.copy(mol) + pmol.cart = True + pmol._bas = np.asarray(np.vstack(_bas), dtype=np.int32) + pmol._env = _env + contr_coeff = scipy.linalg.block_diag(*contr_coeff) + + if not mol.cart: + contr_coeff = contr_coeff.dot(mol.cart2sph_coeff()) + return pmol, contr_coeff + +def _make_s_index_offsets(log_q, nbins=10, cutoff=1e-12): + '''Divides the shell pairs to "nbins" collections down to "cutoff"''' + scale = nbins / np.log(min(cutoff, .1)) + s_index = np.floor(scale * log_q).astype(np.int32) + bins = np.bincount(s_index) + if bins.size < nbins: + bins = np.append(bins, np.zeros(nbins-bins.size, dtype=np.int32)) + else: + bins = bins[:nbins] + assert bins.max() < 65536 * 8 + return np.append(0, np.cumsum(bins)).astype(np.int32) + +def _make_s_index(log_q, nbins=10, cutoff=1e-12): + '''Divides the shell pairs to "nbins" collections down to "cutoff"''' + scale = nbins / np.log(min(cutoff, .1)) + s_index = np.floor(scale * log_q).astype(np.int32) + bins_floor = np.arange(nbins) / scale + return s_index, bins_floor + +def _make_bins(s_index, nbins=10): + bins = np.bincount(s_index) + if bins.size < nbins: + bins = np.append(bins, np.zeros(nbins-bins.size, dtype=np.int32)) + else: + bins = bins[:nbins] + assert bins.max() < 65536 * 8 + return np.append(0, np.cumsum(bins)).astype(np.int32) + +def _split_l_ctr_groups(uniq_l_ctr, l_ctr_counts, group_size): + '''Splits l_ctr patterns into small groups with group_size the maximum + number of AOs in each group + ''' + l = uniq_l_ctr[:,0] + _l_ctrs = [] + _l_ctr_counts = [] + for l_ctr, counts in zip(uniq_l_ctr, l_ctr_counts): + l = l_ctr[0] + nf = (l + 1) * (l + 2) // 2 + max_shells = max(group_size // nf, 2) + if l > LMAX_ON_GPU or counts <= max_shells: + _l_ctrs.append(l_ctr) + _l_ctr_counts.append(counts) + continue + + nsubs, rests = counts.__divmod__(max_shells) + _l_ctrs.extend([l_ctr] * nsubs) + _l_ctr_counts.extend([max_shells] * nsubs) + if rests > 0: + _l_ctrs.append(l_ctr) + _l_ctr_counts.append(rests) + uniq_l_ctr = np.vstack(_l_ctrs) + l_ctr_counts = np.hstack(_l_ctr_counts) + return uniq_l_ctr, l_ctr_counts diff --git a/gpu4pyscf/scf/jk.py b/gpu4pyscf/scf/jk.py new file mode 100644 index 00000000..2f599212 --- /dev/null +++ b/gpu4pyscf/scf/jk.py @@ -0,0 +1,742 @@ +import ctypes +import math +import numpy as np +import cupy as cp +import scipy.linalg +from pyscf.gto import (ANG_OF, ATOM_OF, NPRIM_OF, NCTR_OF, PTR_COORD, PTR_COEFF, + PTR_EXP, gto_norm) +from pyscf import lib +from pyscf.scf import _vhf +from pyscf import __config__ +from gpu4pyscf.lib.cupy_helper import load_library, condense, sandwich_dot, transpose_sum +from gpu4pyscf.__config__ import props as gpu_specs +from gpu4pyscf.lib import logger + +__all__ = [ + 'get_jk', 'get_j', +] + +PTR_BAS_COORD = 7 +LMAX = 4 +TILE = 2 +QUEUE_DEPTH = 262144 +UNROLL_ORDER = 4 +UNROLL_LMAX = 3 +UNROLL_NFMAX = 60 +GOUT_WIDTH = 42 +SHM_SIZE = getattr(__config__, 'GPU_SHM_SIZE', + int(gpu_specs['sharedMemPerBlockOptin']//9)*8) +THREADS = 256 + +# TODO: test different size for L2 cache efficiency +NAO_IN_GROUP = 1500 + +libvhf_rys = load_library('libgvhf_rys') +libvhf_rys.RYS_build_jk.restype = ctypes.c_int +libvhf_rys.cuda_version.restype = ctypes.c_int +CUDA_VERSION = libvhf_rys.cuda_version() + +def get_jk(mol, dm, hermi=1, vhfopt=None, with_j=True, with_k=True, verbose=None): + '''Compute J, K matrices + ''' + log = logger.new_logger(mol, verbose) + cput0 = log.init_timer() + if hermi != 1: + raise NotImplementedError('JK-builder only supports hermitian density matrix') + + if vhfopt is None: + vhfopt = _VHFOpt(mol).build() + + mol = vhfopt.mol + nao, nao_orig = vhfopt.coeff.shape + + dm = cp.asarray(dm, order='C') + dms = dm.reshape(-1,nao_orig,nao_orig) + n_dm = dms.shape[0] + #:dms = cp.einsum('pi,nij,qj->npq', vhfopt.coeff, dms, vhfopt.coeff) + dms = sandwich_dot(dms, vhfopt.coeff.T) + dms = cp.asarray(dms, order='C') + + vj = vk = None + vj_ptr = vk_ptr = lib.c_null_ptr() + + assert with_j or with_k + if with_k: + vk = cp.zeros(dms.shape) + vk_ptr = ctypes.cast(vk.data.ptr, ctypes.c_void_p) + if with_j: + vj = cp.zeros(dms.shape) + vj_ptr = ctypes.cast(vj.data.ptr, ctypes.c_void_p) + + init_constant(mol) + ao_loc = mol.ao_loc + dm_cond = cp.log(condense('absmax', dms, ao_loc) + 1e-300).astype(np.float32) + log_max_dm = dm_cond.max() + log_cutoff = math.log(vhfopt.direct_scf_tol) + + uniq_l_ctr = vhfopt.uniq_l_ctr + uniq_l = uniq_l_ctr[:,0] + l_ctr_bas_loc = vhfopt.l_ctr_offsets + l_symb = [lib.param.ANGULAR[i] for i in uniq_l] + n_groups = np.count_nonzero(uniq_l <= LMAX) + tile_mappings = _make_tril_tile_mappings(l_ctr_bas_loc, vhfopt.tile_q_cond, + log_cutoff-log_max_dm) + workers = gpu_specs['multiProcessorCount'] + pool = cp.empty((workers, QUEUE_DEPTH*4), dtype=np.uint16) + info = cp.empty(2, dtype=np.uint32) + t1 = log.timer_debug1('q_cond and dm_cond', *cput0) + + timing_collection = {} + kern_counts = 0 + kern = libvhf_rys.RYS_build_jk + + for i in range(n_groups): + for j in range(i+1): + ij_shls = (l_ctr_bas_loc[i], l_ctr_bas_loc[i+1], + l_ctr_bas_loc[j], l_ctr_bas_loc[j+1]) + tile_ij_mapping = tile_mappings[i,j] + for k in range(i+1): + for l in range(k+1): + llll = f'({l_symb[i]}{l_symb[j]}|{l_symb[k]}{l_symb[l]})' + kl_shls = (l_ctr_bas_loc[k], l_ctr_bas_loc[k+1], + l_ctr_bas_loc[l], l_ctr_bas_loc[l+1]) + tile_kl_mapping = tile_mappings[k,l] + scheme = quartets_scheme(mol, uniq_l_ctr[[i, j, k, l]]) + err = kern( + vj_ptr, vk_ptr, ctypes.cast(dms.data.ptr, ctypes.c_void_p), + ctypes.c_int(n_dm), ctypes.c_int(nao), + vhfopt.rys_envs, (ctypes.c_int*2)(*scheme), + (ctypes.c_int*8)(*ij_shls, *kl_shls), + ctypes.c_int(tile_ij_mapping.size), + ctypes.c_int(tile_kl_mapping.size), + ctypes.cast(tile_ij_mapping.data.ptr, ctypes.c_void_p), + ctypes.cast(tile_kl_mapping.data.ptr, ctypes.c_void_p), + ctypes.cast(vhfopt.tile_q_cond.data.ptr, ctypes.c_void_p), + ctypes.cast(vhfopt.q_cond.data.ptr, ctypes.c_void_p), + ctypes.cast(dm_cond.data.ptr, ctypes.c_void_p), + ctypes.c_float(log_cutoff), + ctypes.cast(pool.data.ptr, ctypes.c_void_p), + ctypes.cast(info.data.ptr, ctypes.c_void_p), + ctypes.c_int(workers), + mol._atm.ctypes, ctypes.c_int(mol.natm), + mol._bas.ctypes, ctypes.c_int(mol.nbas), mol._env.ctypes) + if err != 0: + raise RuntimeError(f'RYS_build_jk kernel for {llll} failed') + if log.verbose >= logger.DEBUG1: + t1, t1p = log.timer_debug1(f'processing {llll}, tasks = {info[1]}', *t1), t1 + if llll not in timing_collection: + timing_collection[llll] = 0 + timing_collection[llll] += t1[1] - t1p[1] + kern_counts += 1 + + if log.verbose >= logger.DEBUG1: + log.debug1('kernel launches %d', kern_counts) + for llll, t in timing_collection.items(): + log.debug1('%s wall time %.2f', llll, t) + + if with_k: + #:vk = cp.einsum('pi,npq,qj->nij', vhfopt.coeff, vk, vhfopt.coeff) + vk = sandwich_dot(vk, vhfopt.coeff) + vk = transpose_sum(vk) + vk = vk.reshape(dm.shape) + if with_j: + #:vj = cp.einsum('pi,npq,qj->nij', vhfopt.coeff, vj, vhfopt.coeff) + vj = sandwich_dot(vj, vhfopt.coeff) + vj = transpose_sum(vj) + vj *= 2. + vj = vj.reshape(dm.shape) + + h_shls = vhfopt.h_shls + if h_shls: + cput1 = log.timer_debug1('get_jk pass 1 on gpu', *cput0) + log.debug3('Integrals for %s functions on CPU', l_symb[LMAX+1]) + scripts = [] + if with_j: + scripts.append('ji->s2kl') + if with_k: + if hermi == 1: + scripts.append('jk->s2il') + else: + scripts.append('jk->s1il') + shls_excludes = [0, h_shls[0]] * 4 + vs_h = _vhf.direct_mapdm('int2e_cart', 's8', scripts, + dms.get(), 1, mol._atm, mol._bas, mol._env, + shls_excludes=shls_excludes) + if with_j and with_k: + vj1 = vs_h[0].reshape(n_dm,nao,nao) + vk1 = vs_h[1].reshape(n_dm,nao,nao) + elif with_j: + vj1 = vs_h[0].reshape(n_dm,nao,nao) + else: + vk1 = vs_h[0].reshape(n_dm,nao,nao) + coeff = vhfopt.coeff + idx, idy = np.tril_indices(nao, -1) + if with_j: + vj1[:,idy,idx] = vj1[:,idx,idy] + for i, v in enumerate(vj1): + vj[i] += coeff.T.dot(cp.asarray(v)).dot(coeff) + if with_k: + if hermi: + vk1[:,idy,idx] = vk1[:,idx,idy] + for i, v in enumerate(vk1): + vk[i] += coeff.T.dot(cp.asarray(v)).dot(coeff) + log.timer_debug1('get_jk pass 2 for h functions on cpu', *cput1) + + log.timer('vj and vk', *cput0) + return vj, vk + +def get_j(mol, dm, hermi=1, vhfopt=None, verbose=None): + '''Compute J matrix + ''' + log = logger.new_logger(mol, verbose) + cput0 = log.init_timer() + if hermi != 1: + raise NotImplementedError('JK-builder only supports hermitian density matrix') + + if vhfopt is None: + vhfopt = _VHFOpt(mol).build() + + mol = vhfopt.mol + nao, nao_orig = vhfopt.coeff.shape + + dm = cp.asarray(dm, order='C') + dms = dm.reshape(-1,nao_orig,nao_orig) + n_dm = dms.shape[0] + assert n_dm == 1 + #:dms = cp.einsum('pi,nij,qj->npq', vhfopt.coeff, dms, vhfopt.coeff) + dms = sandwich_dot(dms, vhfopt.coeff.T) + dms = cp.asarray(dms, order='C') + + ao_loc = mol.ao_loc + dm_cond = cp.log(condense('absmax', dms, ao_loc) + 1e-300).astype(np.float32) + log_max_dm = dm_cond.max() + log_cutoff = math.log(vhfopt.direct_scf_tol) + + dms = dms.get() + pair_loc = _make_j_engine_pair_locs(mol) + dm_xyz = np.empty(pair_loc[-1]) + libvhf_rys.transform_cart_to_xyz( + dm_xyz.ctypes, dms.ctypes, ao_loc.ctypes, pair_loc.ctypes, + mol._bas.ctypes, ctypes.c_int(mol.nbas), mol._env.ctypes) + dm_xyz = cp.asarray(dm_xyz) + vj_xyz = cp.zeros_like(dm_xyz) + + pair_loc_on_gpu = cp.asarray(pair_loc) + rys_envs = RysIntEnvVars( + mol.natm, mol.nbas, + vhfopt.rys_envs.atm, vhfopt.rys_envs.bas, vhfopt.rys_envs.env, + pair_loc_on_gpu.data.ptr, + ) + + libvhf_rys.RYS_init_rysj_constant(ctypes.c_int(SHM_SIZE)) + + uniq_l_ctr = vhfopt.uniq_l_ctr + uniq_l = uniq_l_ctr[:,0] + l_ctr_bas_loc = vhfopt.l_ctr_offsets + l_symb = [lib.param.ANGULAR[i] for i in uniq_l] + n_groups = np.count_nonzero(uniq_l <= LMAX) + ntiles = mol.nbas // TILE + tile_mappings = {} + workers = gpu_specs['multiProcessorCount'] + pool = cp.empty((workers, QUEUE_DEPTH*4), dtype=np.uint16) + info = cp.empty(2, dtype=np.uint32) + + for i in range(n_groups): + for j in range(i+1): + ish0, ish1 = l_ctr_bas_loc[i], l_ctr_bas_loc[i+1] + jsh0, jsh1 = l_ctr_bas_loc[j], l_ctr_bas_loc[j+1] + ij_shls = (ish0, ish1, jsh0, jsh1) + i0 = ish0 // TILE + i1 = ish1 // TILE + j0 = jsh0 // TILE + j1 = jsh1 // TILE + sub_tile_q = vhfopt.tile_q_cond[i0:i1,j0:j1] + mask = sub_tile_q > log_cutoff - log_max_dm + if i == j: + mask = cp.tril(mask) + t_ij = (cp.arange(i0, i1, dtype=np.int32)[:,None] * ntiles + + cp.arange(j0, j1, dtype=np.int32)) + idx = cp.argsort(sub_tile_q[mask])[::-1] + tile_mappings[i,j] = t_ij[mask][idx] + t1 = t2 = log.timer_debug1('q_cond and dm_cond', *cput0) + + timing_collection = {} + kern_counts = 0 + kern = libvhf_rys.RYS_build_j + + for i in range(n_groups): + for j in range(i+1): + ij_shls = (l_ctr_bas_loc[i], l_ctr_bas_loc[i+1], + l_ctr_bas_loc[j], l_ctr_bas_loc[j+1]) + tile_ij_mapping = tile_mappings[i,j] + for k in range(i+1): + for l in range(k+1): + llll = f'({l_symb[i]}{l_symb[j]}|{l_symb[k]}{l_symb[l]})' + kl_shls = (l_ctr_bas_loc[k], l_ctr_bas_loc[k+1], + l_ctr_bas_loc[l], l_ctr_bas_loc[l+1]) + tile_kl_mapping = tile_mappings[k,l] + scheme = _j_engine_quartets_scheme(mol, uniq_l_ctr[[i, j, k, l]]) + err = kern( + ctypes.cast(vj_xyz.data.ptr, ctypes.c_void_p), + ctypes.cast(dm_xyz.data.ptr, ctypes.c_void_p), + ctypes.c_int(n_dm), ctypes.c_int(nao), + rys_envs, (ctypes.c_int*3)(*scheme), + (ctypes.c_int*8)(*ij_shls, *kl_shls), + ctypes.c_int(tile_ij_mapping.size), + ctypes.c_int(tile_kl_mapping.size), + ctypes.cast(tile_ij_mapping.data.ptr, ctypes.c_void_p), + ctypes.cast(tile_kl_mapping.data.ptr, ctypes.c_void_p), + ctypes.cast(vhfopt.tile_q_cond.data.ptr, ctypes.c_void_p), + ctypes.cast(vhfopt.q_cond.data.ptr, ctypes.c_void_p), + ctypes.cast(dm_cond.data.ptr, ctypes.c_void_p), + ctypes.c_float(log_cutoff), + ctypes.cast(pool.data.ptr, ctypes.c_void_p), + ctypes.cast(info.data.ptr, ctypes.c_void_p), + ctypes.c_int(workers), + mol._atm.ctypes, ctypes.c_int(mol.natm), + mol._bas.ctypes, ctypes.c_int(mol.nbas), mol._env.ctypes) + if err != 0: + raise RuntimeError(f'RYS_build_jk kernel for {llll} failed') + if log.verbose >= logger.DEBUG1: + t1, t1p = log.timer_debug1(f'processing {llll}, tasks = {info[1]}', *t1), t1 + if llll not in timing_collection: + timing_collection[llll] = 0 + timing_collection[llll] += t1[1] - t1p[1] + kern_counts += 1 + + if log.verbose >= logger.DEBUG1: + log.debug1('kernel launches %d', kern_counts) + for llll, t in timing_collection.items(): + log.debug1('%s wall time %.2f', llll, t) + cp.cuda.Stream.null.synchronize() + log.timer_debug1('cuda kernel', *t2) + + vj_xyz = vj_xyz.get() + vj = np.empty_like(dms) + libvhf_rys.transform_xyz_to_cart( + vj.ctypes, vj_xyz.ctypes, ao_loc.ctypes, pair_loc.ctypes, + mol._bas.ctypes, ctypes.c_int(mol.nbas), mol._env.ctypes) + #:vj = cp.einsum('pi,npq,qj->nij', vhfopt.coeff, cp.asarray(vj), vhfopt.coeff) + vj = sandwich_dot(vj, vhfopt.coeff) + vj = transpose_sum(vj) + vj *= 2. + vj = vj.reshape(dm.shape) + + h_shls = vhfopt.h_shls + if h_shls: + cput1 = log.timer_debug1('get_j pass 1 on gpu', *cput0) + log.debug3('Integrals for %s functions on CPU', l_symb[LMAX+1]) + scripts = ['ji->s2kl'] + shls_excludes = [0, h_shls[0]] * 4 + vs_h = _vhf.direct_mapdm('int2e_cart', 's8', scripts, + dms.get(), 1, mol._atm, mol._bas, mol._env, + shls_excludes=shls_excludes) + vj1 = vs_h[0].reshape(n_dm,nao,nao) + coeff = vhfopt.coeff + idx, idy = np.tril_indices(nao, -1) + vj1[:,idy,idx] = vj1[:,idx,idy] + for i, v in enumerate(vj1): + vj[i] += coeff.T.dot(cp.asarray(v)).dot(coeff) + log.timer_debug1('get_j pass 2 for h functions on cpu', *cput1) + + log.timer('vj', *cput0) + return vj + +class _VHFOpt: + def __init__(self, mol, cutoff=1e-13): + self.mol, self.coeff = basis_seg_contraction(mol) + self.direct_scf_tol = cutoff + self.uniq_l_ctr = None + self.l_ctr_offsets = None + self.q_cond = None + self.tile_q_cond = None + self.h_shls = None + self.tile = TILE + + def build(self, group_size=None, verbose=None): + mol = self.mol + log = logger.new_logger(mol, verbose) + cput0 = log.init_timer() + # Sort basis according to angular momentum and contraction patterns so + # as to group the basis functions to blocks in GPU kernel. + l_ctrs = mol._bas[:,[ANG_OF, NPRIM_OF]] + # Ensure the more contracted Gaussians being accessed first + l_ctrs_descend = l_ctrs.copy() + l_ctrs_descend[:,1] = -l_ctrs[:,1] + uniq_l_ctr, where, inv_idx, l_ctr_counts = np.unique( + l_ctrs_descend, return_index=True, return_inverse=True, return_counts=True, axis=0) + uniq_l_ctr[:,1] = -uniq_l_ctr[:,1] + + nao_orig = self.coeff.shape[1] + ao_loc = mol.ao_loc + coeff = np.split(self.coeff, ao_loc[1:-1], axis=0) + + l_ctr_counts_orig = l_ctr_counts.copy() + pad_inv_idx = [] + pad_bas = [] + env_ptr = mol._env.size + tile = self.tile + # for each pattern, padding basis to the end of mol._bas, ensure alignment to TILE + for n, (l_ctr, m, counts) in enumerate(zip(uniq_l_ctr, where, l_ctr_counts)): + if counts % tile == 0: continue + n_alined = (counts+tile-1) & (0x100000-tile) + padding = n_alined - counts + l_ctr_counts[n] = n_alined + + bas = mol._bas[m].copy() + bas[PTR_COEFF] = env_ptr + pad_bas.extend([bas] * padding) + pad_inv_idx.extend([n] * padding) + + l = l_ctr[0] + nf = (l + 1) * (l + 2) // 2 + coeff.extend([np.zeros((nf, nao_orig))] * padding) + + inv_idx = np.hstack([inv_idx.ravel(), pad_inv_idx]) + sorted_idx = np.argsort(inv_idx, kind='stable').astype(np.int32) + self.coeff = cp.asarray(np.vstack([coeff[i] for i in sorted_idx])) + assert self.coeff.shape[0] < 32768 + + max_nprims = uniq_l_ctr[:,1].max() + mol._env = np.append(mol._env, np.zeros(max_nprims)) + if pad_bas: + mol._bas = np.vstack([mol._bas, pad_bas])[sorted_idx] + else: + mol._bas = mol._bas[sorted_idx] + assert mol._bas.dtype == np.int32 + + ## Limit the number of AOs in each group + if group_size is not None: + uniq_l_ctr, l_ctr_counts = _split_l_ctr_groups( + uniq_l_ctr, l_ctr_counts, group_size, tile) + self.uniq_l_ctr = uniq_l_ctr + self.l_ctr_offsets = np.append(0, np.cumsum(l_ctr_counts)) + + if mol.verbose >= logger.DEBUG1: + log.debug1('Number of shells for each [l, nprim] group') + for l_ctr, n, n8 in zip(uniq_l_ctr, l_ctr_counts_orig, l_ctr_counts): + log.debug1(' %s : %s -> %s', l_ctr, n, n8) + + # PTR_BAS_COORD is required by nr_contract_jk.c + mol._bas[:,PTR_BAS_COORD] = mol._atm[mol._bas[:,ATOM_OF],PTR_COORD] + + # very high angular momentum basis are processed on CPU + lmax = uniq_l_ctr[:,0].max() + nbas_by_l = [l_ctr_counts[uniq_l_ctr[:,0]==l].sum() for l in range(lmax+1)] + l_slices = np.append(0, np.cumsum(nbas_by_l)) + if lmax > LMAX: + self.h_shls = l_slices[LMAX+1:].tolist() + else: + self.h_shls = [] + + nbas = mol.nbas + buf_size = nbas**2 + if tile > 1: + ntiles = nbas // tile + buf_size += ntiles**2 + if mol.omega < 0: + buf_size += nbas**2 + buf = cp.empty(buf_size, dtype=np.float32) + + ao_loc = mol.ao_loc + q_cond = np.empty((nbas,nbas)) + intor = mol._add_suffix('int2e') + _vhf.libcvhf.CVHFnr_int2e_q_cond( + getattr(_vhf.libcvhf, intor), lib.c_null_ptr(), + q_cond.ctypes, ao_loc.ctypes, + mol._atm.ctypes, ctypes.c_int(mol.natm), + mol._bas.ctypes, ctypes.c_int(mol.nbas), mol._env.ctypes) + self.q_cond = buf[:nbas**2].reshape(nbas, nbas) + self.q_cond.set(np.log(q_cond + 1e-300).astype(np.float32)) + offset = nbas**2 + if tile > 1: + self.tile_q_cond = buf[offset:offset+ntiles**2].reshape(ntiles, ntiles) + self.tile_q_cond[:] = self.q_cond.reshape(ntiles,tile,ntiles,tile).max(axis=(1,3)) + offset += ntiles**2 + else: + self.tile_q_cond = self.q_cond + + if mol.omega < 0: + # CVHFnr_sr_int2e_q_cond in pyscf has bugs in upper bound estimator. + # Use the local version of s_estimator instead + s_estimator = np.empty((nbas,nbas), dtype=np.float32) + libvhf_rys.sr_eri_s_estimator( + s_estimator.ctypes, ctypes.c_float(mol.omega), + mol._atm.ctypes, ctypes.c_int(mol.natm), + mol._bas.ctypes, ctypes.c_int(mol.nbas), mol._env.ctypes) + self.s_estimator = buf[offset:offset+nbas**2].reshape(nbas, nbas) + self.s_estimator.set(s_estimator) + log.timer('Initialize q_cond', *cput0) + + _atm = cp.array(mol._atm) + _bas = cp.array(mol._bas) + _env = cp.array(_scale_sp_ctr_coeff(mol)) + ao_loc = cp.array(ao_loc) + self._mol_gpu = (_atm, _bas, _env, ao_loc) + self.rys_envs = RysIntEnvVars( + mol.natm, mol.nbas, + _atm.data.ptr, _bas.data.ptr, _env.data.ptr, ao_loc.data.ptr, + ) + return self + +def basis_seg_contraction(mol, allow_replica=1): + '''transform generally contracted basis to segment contracted basis + Kwargs: + allow_replica: + when angular momentum lower than (or equal to) this value, transform + the generally contracted basis to replicated segment-contracted basis. + By default, high angular momentum functions (d, f shells) are fully + uncontracted. + ''' + bas_templates = {} + _bas = [] + _env = mol._env.copy() + contr_coeff = [] + aoslices = mol.aoslice_by_atom() + for ia, (ib0, ib1) in enumerate(aoslices[:,:2]): + key = tuple(mol._bas[ib0:ib1,PTR_COEFF]) + if key in bas_templates: + bas_of_ia, coeff = bas_templates[key] + bas_of_ia = bas_of_ia.copy() + bas_of_ia[:,ATOM_OF] = ia + else: + # Generate the template for decontracted basis + coeff = [] + bas_of_ia = [] + for shell in mol._bas[ib0:ib1]: + l = shell[ANG_OF] + nf = (l + 1) * (l + 2) // 2 + nctr = shell[NCTR_OF] + if nctr == 1: + bas_of_ia.append(shell) + coeff.append(np.eye(nf)) + continue + # Only basis with nctr > 1 needs to be decontracted + nprim = shell[NPRIM_OF] + pcoeff = shell[PTR_COEFF] + if l <= allow_replica: + coeff.extend([np.eye(nf)] * nctr) + bs = np.repeat(shell[np.newaxis], nctr, axis=0) + bs[:,NCTR_OF] = 1 + bs[:,PTR_COEFF] = np.arange(pcoeff, pcoeff+nprim*nctr, nprim) + bas_of_ia.append(bs) + else: # To avoid recomputation, decontract to primitive functions + pexp = shell[PTR_EXP] + exps = _env[pexp:pexp+nprim] + norm = gto_norm(l, exps) + # remove normalization from contraction coefficients + c = _env[pcoeff:pcoeff+nprim*nctr].reshape(nctr,nprim) + c = np.einsum('ip,p,ef->iepf', c, 1/norm, np.eye(nf)) + coeff.append(c.reshape(nf*nctr, nf*nprim).T) + + _env[pcoeff:pcoeff+nprim] = norm + bs = np.repeat(shell[np.newaxis], nprim, axis=0) + bs[:,NPRIM_OF] = 1 + bs[:,NCTR_OF] = 1 + bs[:,PTR_EXP] = np.arange(pexp, pexp+nprim) + bs[:,PTR_COEFF] = np.arange(pcoeff, pcoeff+nprim) + bas_of_ia.append(bs) + + if len(bas_of_ia) > 0: + bas_of_ia = np.vstack(bas_of_ia) + bas_templates[key] = (bas_of_ia, coeff) + else: + continue + + _bas.append(bas_of_ia) + contr_coeff.extend(coeff) + + pmol = mol.copy() + pmol.cart = True + pmol._bas = np.asarray(np.vstack(_bas), dtype=np.int32) + pmol._env = _env + contr_coeff = scipy.linalg.block_diag(*contr_coeff) + + if not mol.cart: + contr_coeff = contr_coeff.dot(mol.cart2sph_coeff()) + return pmol, contr_coeff + +def _split_l_ctr_groups(uniq_l_ctr, l_ctr_counts, group_size=NAO_IN_GROUP, + align=TILE): + '''Splits l_ctr patterns into small groups with group_size the maximum + number of AOs in each group + ''' + l = uniq_l_ctr[:,0] + nf = l * (l + 1) // 2 + _l_ctrs = [] + _l_ctr_counts = [] + for l_ctr, counts in zip(uniq_l_ctr, l_ctr_counts): + l = l_ctr[0] + nf = (l + 1) * (l + 2) // 2 + max_shells = max(group_size//nf-align+1, align, 2) + max_shells = (max_shells + align - 1) & (0x100000-align) + if counts <= max_shells: + _l_ctrs.append(l_ctr) + _l_ctr_counts.append(counts) + continue + + nsubs, remaining = counts.__divmod__(max_shells) + _l_ctrs.extend([l_ctr] * nsubs) + _l_ctr_counts.extend([max_shells] * nsubs) + if remaining > 0: + _l_ctrs.append(l_ctr) + _l_ctr_counts.append(remaining) + uniq_l_ctr = np.vstack(_l_ctrs) + l_ctr_counts = np.hstack(_l_ctr_counts) + return uniq_l_ctr, l_ctr_counts + +class RysIntEnvVars(ctypes.Structure): + _fields_ = [ + ('natm', ctypes.c_uint16), + ('nbas', ctypes.c_uint16), + ('atm', ctypes.c_void_p), + ('bas', ctypes.c_void_p), + ('env', ctypes.c_void_p), + ('ao_loc', ctypes.c_void_p), + ] + +def _scale_sp_ctr_coeff(mol): + # Match normalization factors of s, p functions in libcint + _env = mol._env.copy() + ls = mol._bas[:,ANG_OF] + ptr, idx = np.unique(mol._bas[:,PTR_COEFF], return_index=True) + ptr = ptr[ls[idx] < 2] + idx = idx[ls[idx] < 2] + fac = ((ls[idx]*2+1) / (4*np.pi)) ** .5 + nprim = mol._bas[idx,NPRIM_OF] + nctr = mol._bas[idx,NCTR_OF] + for p, n, f in zip(ptr, nprim*nctr, fac): + _env[p:p+n] *= f + return _env + +def iter_cart_xyz(n): + return [(x, y, n-x-y) + for x in reversed(range(n+1)) + for y in reversed(range(n+1-x))] + +def g_pair_idx(ij_inc=None): + dat = [] + xyz = [np.array(iter_cart_xyz(li)) for li in range(LMAX+1)] + for li in range(LMAX+1): + for lj in range(LMAX+1): + li1 = li + 1 + idx = (xyz[lj][:,None] * li1 + xyz[li]).transpose(2,0,1) + dat.append(idx.ravel()) + g_idx = np.hstack(dat).astype(np.int32) + offsets = np.cumsum([0] + [x.size for x in dat]).astype(np.int32) + return g_idx, offsets + +def init_constant(mol): + g_idx, offsets = g_pair_idx() + libvhf_rys.RYS_init_constant( + g_idx.ctypes, offsets.ctypes, mol._env.ctypes, ctypes.c_int(mol._env.size), + ctypes.c_int(SHM_SIZE)) + +def _make_tril_tile_mappings(l_ctr_bas_loc, tile_q_cond, cutoff, tile=TILE): + n_groups = len(l_ctr_bas_loc) - 1 + ntiles = tile_q_cond.shape[0] + tile_mappings = {} + for i in range(n_groups): + for j in range(i+1): + ish0, ish1 = l_ctr_bas_loc[i], l_ctr_bas_loc[i+1] + jsh0, jsh1 = l_ctr_bas_loc[j], l_ctr_bas_loc[j+1] + i0 = ish0 // tile + i1 = ish1 // tile + j0 = jsh0 // tile + j1 = jsh1 // tile + sub_tile_q = tile_q_cond[i0:i1,j0:j1] + mask = sub_tile_q > cutoff + if i == j: + mask = cp.tril(mask) + t_ij = (cp.arange(i0, i1, dtype=np.int32)[:,None] * ntiles + + cp.arange(j0, j1, dtype=np.int32)) + idx = cp.argsort(sub_tile_q[mask])[::-1] + tile_mappings[i,j] = t_ij[mask][idx] + return tile_mappings + +def _make_j_engine_pair_locs(mol): + ls = mol._bas[:,ANG_OF] + ll = (ls[:,None]+ls).ravel() + pair_loc = np.append(0, np.cumsum((ll+1)*(ll+2)*(ll+3)//6)) + return np.asarray(pair_loc, dtype=np.int32) + +def quartets_scheme(mol, l_ctr_pattern, shm_size=SHM_SIZE): + ls = l_ctr_pattern[:,0] + li, lj, lk, ll = ls + order = li + lj + lk + ll + nfi = (li + 1) * (li + 2) // 2 + nfj = (lj + 1) * (lj + 2) // 2 + nfk = (lk + 1) * (lk + 2) // 2 + nfl = (ll + 1) * (ll + 2) // 2 + gout_size = nfi * nfj * nfk * nfl + if (gout_size <= UNROLL_NFMAX or order <= UNROLL_ORDER) and all(ls <= UNROLL_LMAX): + if (CUDA_VERSION >= 12040 and + order <= 3 and (li,lj,lk,ll) != (1,1,1,0) and (li,lj,lk,ll) != (1,0,1,1)): + return 512, 1 + return 256, 1 + + g_size = (li+1)*(lj+1)*(lk+1)*(ll+1) + nps = l_ctr_pattern[:,1] + ij_prims = nps[0] * nps[1] + nroots = order // 2 + 1 + + if mol.omega >= 0: + unit = nroots*2 + g_size*3 + ij_prims*4 + else: # SR + unit = nroots*4 + g_size*3 + ij_prims*4 + counts = shm_size // (unit*8) + n = min(THREADS, _nearest_power2(counts)) + gout_stride = THREADS // n + while gout_stride < 16 and gout_size / (gout_stride*GOUT_WIDTH) > 1: + n //= 2 + gout_stride *= 2 + return n, gout_stride + +def _j_engine_quartets_scheme(mol, l_ctr_pattern, shm_size=SHM_SIZE): + ls = l_ctr_pattern[:,0] + li, lj, lk, ll = ls + order = li + lj + lk + ll + lij = li + lj + lkl = lk + ll + nmax = max(lij, lkl) + nps = l_ctr_pattern[:,1] + ij_prims = nps[0] * nps[1] + g_size = (lij+1)*(lkl+1) + nf3_ij = (lij+1)*(lij+2)*(lij+3)//6 + nf3_kl = (lkl+1)*(lkl+2)*(lkl+3)//6 + nroots = order // 2 + 1 + lmax = 4 # not angular momentum of orbital basis. see rys_contract_j kernel + max_order = 6 + if order <= max_order and lij <= lmax and lkl <= lmax: + if CUDA_VERSION >= 12040 and order <= 2: + return 512, 1, False + return 256, 1, False + + unit = nroots*2 + g_size*3 + ij_prims*4 + dm_cache_size = nf3_ij + nf3_kl*2 + (lij+1)*(lkl+1)*(nmax+2) + gout_size = nf3_ij * nf3_kl + if dm_cache_size < gout_size: + unit += dm_cache_size + shm_size -= nf3_ij * TILE*TILE * 8 + with_gout = False + else: + unit += gout_size + with_gout = True + + if mol.omega < 0: + unit += nroots*2 + counts = shm_size // (unit*8) + n = min(THREADS, _nearest_power2(counts)) + gout_stride = THREADS // n + if CUDA_VERSION >= 12040: + gout_stride *= 2 + return n, gout_stride, with_gout + +def _nearest_power2(n): + '''nearest 2**x that is smaller than n''' + n = int(n) + t = 0 + while n > 1: + n >>= 1 + t += 1 + return 2**t diff --git a/gpu4pyscf/scf/tests/test_scf_jk.py b/gpu4pyscf/scf/tests/test_scf_jk.py new file mode 100644 index 00000000..95908309 --- /dev/null +++ b/gpu4pyscf/scf/tests/test_scf_jk.py @@ -0,0 +1,75 @@ +# Copyright 2023 The GPU4PySCF Authors. All Rights Reserved. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +import unittest +import numpy as np +import pyscf +from pyscf import lib +from gpu4pyscf.scf import jk +from pyscf.scf.hf import get_jk + +def test_jk(): + mol = pyscf.M( + atom = ''' + O 0.000 -0. 0.1174 + H -0.757 4. -0.4696 + H 0.757 4. -0.4696 + C 1. 1. 0. + H 4. 0. 3. + H 0. 1. .6 + ''', + basis='def2-tzvp', + unit='B',) + + np.random.seed(9) + nao = mol.nao + dm = np.random.rand(nao, nao) + dm = dm.dot(dm.T) + + vj, vk = jk.get_jk(mol, dm) + vj1 = vj.get() + vk1 = vk.get() + ref = get_jk(mol, dm) + assert abs(vj1 - ref[0]).max() < 1e-9 + assert abs(vk1 - ref[1]).max() < 1e-9 + assert abs(lib.fp(vj1) - -2327.4715195591784) < 1e-10 + assert abs(lib.fp(vk1) - -4069.3170008260583) < 1e-10 + + vj = jk.get_j(mol, dm).get() + assert abs(vj - ref[0]).max() < 1e-9 + assert abs(lib.fp(vj) - -2327.4715195591784) < 5e-10 + + mol.omega = 0.2 + vj, vk = jk.get_jk(mol, dm) + vj2 = vj.get() + vk2 = vk.get() + ref = get_jk(mol, dm) + assert abs(vj2 - ref[0]).max() < 1e-9 + assert abs(vk2 - ref[1]).max() < 1e-9 + assert abs(lib.fp(vj2) - 1163.932604635460) < 1e-10 + assert abs(lib.fp(vk2) - -1269.969109438691) < 1e-10 + + mol.omega = -0.2 + vj, vk = jk.get_jk(mol, dm) + vj3 = vj.get() + vk3 = vk.get() + ref = get_jk(mol, dm) + assert abs(vj3 - ref[0]).max() < 1e-8 + assert abs(vk3 - ref[1]).max() < 1e-9 + assert abs(lib.fp(vj3) - -3491.404124194866) < 1e-10 + assert abs(lib.fp(vk3) - -2799.347891387202) < 1e-10 + + assert abs(vj2+vj3 - vj1).max() < 1e-9 + assert abs(vk2+vk3 - vk1).max() < 1e-9 diff --git a/gpu4pyscf/solvent/grad/pcm.py b/gpu4pyscf/solvent/grad/pcm.py index 508daa31..1fce56f8 100644 --- a/gpu4pyscf/solvent/grad/pcm.py +++ b/gpu4pyscf/solvent/grad/pcm.py @@ -26,14 +26,13 @@ from pyscf import gto from pyscf.grad import rhf as rhf_grad -from gpu4pyscf.solvent.pcm import PI, switch_h +from gpu4pyscf.solvent.pcm import PI, switch_h, libsolvent from gpu4pyscf.df import int3c2e from gpu4pyscf.lib.cupy_helper import contract, load_library from gpu4pyscf.lib import logger from pyscf import lib as pyscf_lib libdft = lib.load_library('libdft') -libsolvent = load_library('libsolvent') def grad_switch_h(x): ''' first derivative of h(x)''' @@ -421,4 +420,4 @@ def kernel(self, *args, dm=None, atmlst=None, **kwargs): def _finalize(self): # disable _finalize. It is called in grad_method.kernel method # where self.de was not yet initialized. - pass \ No newline at end of file + pass diff --git a/gpu4pyscf/solvent/pcm.py b/gpu4pyscf/solvent/pcm.py index 0e7fdd97..c3345470 100644 --- a/gpu4pyscf/solvent/pcm.py +++ b/gpu4pyscf/solvent/pcm.py @@ -32,7 +32,10 @@ from gpu4pyscf.lib.cupy_helper import dist_matrix, load_library libdft = lib.load_library('libdft') -libsolvent = load_library('libsolvent') +try: + libsolvent = load_library('libsolvent') +except OSError: + libsolvent = None @lib.with_doc(_attach_solvent._for_scf.__doc__) def pcm_for_scf(mf, solvent_obj=None, dm=None): diff --git a/gpu4pyscf/solvent/smd.py b/gpu4pyscf/solvent/smd.py index 61704635..1d599065 100644 --- a/gpu4pyscf/solvent/smd.py +++ b/gpu4pyscf/solvent/smd.py @@ -253,7 +253,11 @@ def smd_radii(alpha): import ctypes from gpu4pyscf.lib.cupy_helper import load_library -libsolvent = load_library('libsolvent') +try: + libsolvent = load_library('libsolvent') +except OSError: + libsolvent = None + def get_cds_legacy(smdobj): mol = smdobj.mol natm = mol.natm @@ -431,4 +435,4 @@ def Hessian(self, hess_method): def reset(self, mol=None): super().reset(mol) self.e_cds = None - return self \ No newline at end of file + return self diff --git a/gpu4pyscf/solvent/tests/test_pcm.py b/gpu4pyscf/solvent/tests/test_pcm.py index db2383f8..6824d77a 100644 --- a/gpu4pyscf/solvent/tests/test_pcm.py +++ b/gpu4pyscf/solvent/tests/test_pcm.py @@ -22,6 +22,12 @@ from gpu4pyscf import scf, dft from gpu4pyscf.solvent import pcm from packaging import version +try: + # Some PCM methods are registered when importing the CPU version. + # However, pyscf-2.7 does note automatically import this module. + from pyscf.solvent import pcm as pcm_on_cpu +except ImportError: + pass pyscf_25 = version.parse(pyscf.__version__) <= version.parse('2.5.0') @@ -55,6 +61,7 @@ def _energy_with_solvent(mf, method): e_tot = mf.kernel() return e_tot +@unittest.skipIf(pcm.libsolvent is None, "solvent extension not compiled") class KnownValues(unittest.TestCase): def test_D_S(self): cm = pcm.PCM(mol) diff --git a/gpu4pyscf/solvent/tests/test_pcm_grad.py b/gpu4pyscf/solvent/tests/test_pcm_grad.py index aa599053..f575e7f6 100644 --- a/gpu4pyscf/solvent/tests/test_pcm_grad.py +++ b/gpu4pyscf/solvent/tests/test_pcm_grad.py @@ -64,6 +64,7 @@ def _grad_with_solvent(method, unrestricted=False): grad = g.kernel() return grad +@unittest.skipIf(pcm.libsolvent is None, "solvent extension not compiled") class KnownValues(unittest.TestCase): def test_dA_dF(self): @@ -241,4 +242,4 @@ def test_to_gpu(self): if __name__ == "__main__": print("Full Tests for Gradient of PCMs") - unittest.main() \ No newline at end of file + unittest.main() diff --git a/gpu4pyscf/solvent/tests/test_pcm_hessian.py b/gpu4pyscf/solvent/tests/test_pcm_hessian.py index ee8aeb41..967d25f6 100644 --- a/gpu4pyscf/solvent/tests/test_pcm_hessian.py +++ b/gpu4pyscf/solvent/tests/test_pcm_hessian.py @@ -18,6 +18,7 @@ import pyscf import pytest from pyscf import gto +from gpu4pyscf.solvent import pcm from gpu4pyscf import scf, dft from packaging import version @@ -85,6 +86,7 @@ def _check_hessian(mf, h, ix=0, iy=0): print(f'Norm of H({ix},{iy}) diff, {np.linalg.norm(h[ix,:,iy,:] - h_fd)}') assert(np.linalg.norm(h[ix,:,iy,:] - h_fd) < tol) +@unittest.skipIf(pcm.libsolvent is None, "solvent extension not compiled") class KnownValues(unittest.TestCase): def test_hess_cpcm(self): print('testing C-PCM Hessian with DF-RKS') @@ -157,4 +159,4 @@ def test_to_cpu(self): assert np.linalg.norm(hess_cpu - hess_gpu) < 1e-5 if __name__ == "__main__": print("Full Tests for Hessian of PCMs") - unittest.main() \ No newline at end of file + unittest.main() diff --git a/gpu4pyscf/solvent/tests/test_smd.py b/gpu4pyscf/solvent/tests/test_smd.py index 3cfdf08f..af808765 100644 --- a/gpu4pyscf/solvent/tests/test_smd.py +++ b/gpu4pyscf/solvent/tests/test_smd.py @@ -108,6 +108,7 @@ def _check_smd(atom, e_ref, solvent='water'): mol.stdout.close() assert numpy.abs(e_cds - e_ref) < 1e-3 +@unittest.skipIf(smd.libsolvent is None, "solvent extension not compiled") class KnownValues(unittest.TestCase): def test_cds_solvent(self): smdobj = smd.SMD(mol) @@ -325,4 +326,4 @@ def test_to_cpu(self): assert abs(e_cpu - e_gpu) < 1e-8 if __name__ == "__main__": print("Full Tests for SMDs") - unittest.main() \ No newline at end of file + unittest.main() diff --git a/gpu4pyscf/solvent/tests/test_smd_grad.py b/gpu4pyscf/solvent/tests/test_smd_grad.py index 9ee40636..a1b9a168 100644 --- a/gpu4pyscf/solvent/tests/test_smd_grad.py +++ b/gpu4pyscf/solvent/tests/test_smd_grad.py @@ -80,6 +80,7 @@ def _check_grad(atom, solvent='water'): mol.stdout.close() assert numpy.linalg.norm(fd_cds - grad_cds) < 1e-8 +@unittest.skipIf(smd.libsolvent is None, "solvent extension not compiled") class KnownValues(unittest.TestCase): def test_grad_water(self): mf = dft.rks.RKS(mol, xc='b3lyp').SMD() @@ -282,4 +283,4 @@ def test_to_cpu(self): if __name__ == "__main__": print("Full Tests for Gradient of SMD") - unittest.main() \ No newline at end of file + unittest.main() diff --git a/gpu4pyscf/solvent/tests/test_smd_hessian.py b/gpu4pyscf/solvent/tests/test_smd_hessian.py index 2a53e3e7..9721dfe7 100644 --- a/gpu4pyscf/solvent/tests/test_smd_hessian.py +++ b/gpu4pyscf/solvent/tests/test_smd_hessian.py @@ -72,6 +72,7 @@ def _check_hess(atom, solvent='water'): mol.stdout.close() assert(numpy.linalg.norm(hess_cds[0,:,0,:] - h_fd) < 1e-3) +@unittest.skipIf(smd.libsolvent is None, "solvent extension not compiled") class KnownValues(unittest.TestCase): def test_h2o(self): h2o = gto.Mole() @@ -259,4 +260,4 @@ def test_to_cpu(self): if __name__ == "__main__": print("Full Tests for Hessian of SMD") - unittest.main() \ No newline at end of file + unittest.main()