From 139e2e36193b797a490379ca7b3c7da1cd996fcf Mon Sep 17 00:00:00 2001 From: Anton Kozhevnikov Date: Fri, 4 Nov 2022 09:07:21 +0100 Subject: [PATCH] New wave-functions implementation (#747) * WIP: external order of G-vectors * WIP: external order of G-vectors * experiment with external G-vector order * Initialize G-vectors with a predefined set * external G-vector order needs testing * fixes for external G-vector order * external G-vector order needs testing * WIP: new wave functions impl. * need to test H|psi> again * need to work on a standalone test first * remove G+k parameters * try QE order * remove 2nd template parameter of apply_preconditioner() * small fixes * small fixes * small fixes * WIP: create row- and col- G+k vector sets * pass gkvec_row_ and gkvec_col_ to Matching_coefficients * do not pass igk__ index to beta-projectors class * remove debug out * WIP: new wave functions impl. * remove commented code * introduce base class for wave-functions * Fix/beta projectors for exact diag (#742) * WIP: create row- and col- G+k vector sets * pass gkvec_row_ and gkvec_col_ to Matching_coefficients * do not pass igk__ index to beta-projectors class * remove debug out * fix typo * draft of the new wave-functions class * draft of the new wave-functions class * try default move constructor * small fix * do not use c++17 features * need to remove in another PR first * need to remove 'using namespace' in another PR first * fixes * fiex * weird namespace error * fixes * use costa to swap fv eigen vectors * move new WFs to wf:: space * move new WFs to wf:: space * move to a separate function * remove commented code * adopt split_in_block() in the new apply_fv_h_o * introduce Wave_functions_mt and more strong types * wip: generate fv wave-functions using new wf:: impl. * wip: transform new wave-functions * wip * wip * wip * wip * wip * wip * wip * add test25 for NiO lda+u * Temporary commit to test inner product on GPUs TODO for testing: * inner product * tranformation * orthogonalisation * CG solver * application of local Hamiltonian * davidson solver other TODO: * restore commented tests * restore GPU branch * cleanup * fix vebosity level * fix * cleanup * fix in the assert check * remove matrix_distribution_t enum; it is no longer needed * cleanup * cleanup * update test * update test ortho * fix in wf::orthogonalize() * ready to test hloc * ready to test hloc * ready to test hloc * fixes * remove template from device_memory_guard * ready to test Davidson solver on GPUs * use wf::inner() for inner product * enable initialize_subspace() on GPU * fix for dmatrix::copy_to * add inline * move new impl. of Davidson to GPU * add ifdef guards * restoring GPU code * compute muffin-tin checksum on GPU * restoring iterative lapw solver on GPU * restoring lapw code on GPU * include utils/rte.hpp * fix axpby for zero alpha or beta * GPU and GPU parallel tests pass * restore custom swap of wave functions * all tests pass * working on the basic documentation * temporary commit * use global memory pool * fix * remove unused file * make sure memory pool cannot be duplicated in compilation units * restore and cleanup tests * fix eigensolvers mem.pools * fix * update nlcglib interface - add Wave_function_base::pw_coeffs(spin_index) - api changes transferred to nlcg code * strong_type::operator T() - make std::vector<>::operator[spin_index] etc work without get * nlcglib: fix assert statement * restore and cleanup tests * restore and cleanup tests * try magma ci/cd workflow * add short cut for checking if T is real, add missing includes * simplify template for wf::inner - types in wf::inner used in beta_projectors_base.hpp can be automatically deduced * clean memory pools * restore fp32/fp64 innner() and transform() functions * remove unused files * remove unused header * minor fixes * fix for magma ci/cd * one more fix * cleanup * cleanup * restore function Co-authored-by: Simon Pintarelli --- .github/workflows/build.yml | 20 + CMakeLists.txt | 2 +- apps/nlcg/sirius.nlcg.cpp | 2 +- apps/tests/CMakeLists.txt | 11 +- apps/tests/test_alloc.cpp | 43 +- apps/tests/test_blacs.cpp | 13 +- apps/tests/test_davidson.cpp | 179 +- apps/tests/test_eigen.cpp | 4 +- apps/tests/test_examples.cpp | 255 +- apps/tests/test_fft_v1.cpp | 59 - apps/tests/test_gemr2d.cpp | 128 - apps/tests/test_hloc.cpp | 141 +- apps/tests/test_lapw_xc.cpp | 17 +- apps/tests/test_move_atom.cpp | 36 - apps/tests/test_mpi_omp.cpp | 320 - apps/tests/test_pppw_xc.cpp | 119 +- apps/tests/test_rank2.cpp | 79 - apps/tests/test_sym.cpp | 128 +- apps/tests/test_wf_fft.cpp | 90 + apps/tests/test_wf_inner.cpp | 173 +- apps/tests/test_wf_inner_v2.cpp | 80 - apps/tests/test_wf_inner_v3.cpp | 131 - apps/tests/test_wf_inner_v4.cpp | 131 - apps/tests/test_wf_ortho.cpp | 195 +- apps/tests/test_wf_ortho_1stage.cpp | 127 - apps/tests/test_wf_ortho_2.cpp | 78 - apps/tests/test_wf_ortho_3.cpp | 103 - apps/tests/test_wf_ortho_4.cpp | 106 - apps/tests/test_wf_ortho_5.cpp | 219 - apps/tests/test_wf_ortho_6.cpp | 160 - apps/tests/test_wf_trans.cpp | 140 +- apps/unit_tests/CMakeLists.txt | 4 +- apps/unit_tests/multi_cg/test_multi_cg.cpp | 18 +- .../multi_cg/test_multi_cg_complex.cpp | 18 +- .../multi_cg/test_multi_cg_multiprecision.cpp | 22 +- apps/unit_tests/test_fft_correctness_1.cpp | 8 +- apps/unit_tests/test_fft_correctness_2.cpp | 2 +- apps/unit_tests/test_wf_ortho.cpp | 94 - apps/unit_tests/test_wf_ortho_1.cpp | 87 + apps/unit_tests/unit_tests.x | 2 +- ci/dockerfiles/Dockerfile | 2 +- doc/doxygen.cfg | 2 +- src/CMakeLists.txt | 8 +- src/SDDK/dmatrix.hpp | 83 +- src/SDDK/fft.hpp | 5 +- src/SDDK/fft3d_grid.hpp | 6 + src/SDDK/gvec.cpp | 43 +- src/SDDK/gvec.hpp | 48 +- src/SDDK/matrix_storage.cpp | 347 - src/SDDK/matrix_storage.hpp | 247 - src/SDDK/memory.cpp | 17 + src/SDDK/memory.hpp | 26 +- src/SDDK/type_definition.hpp | 27 +- src/SDDK/wave_functions.cpp | 659 - src/SDDK/wave_functions.hpp | 2066 +- src/SDDK/wf_inner.cpp | 201 - src/SDDK/wf_inner.hpp | 115 - src/SDDK/wf_ortho.cpp | 353 - src/SDDK/wf_ortho.hpp | 85 - src/SDDK/wf_trans.hpp | 194 - src/api/sirius_api.cpp | 58 +- src/band/band.cpp | 556 +- src/band/band.hpp | 372 +- src/band/davidson.hpp | 540 +- src/band/diag_full_potential.cpp | 394 +- src/band/diag_pseudo_potential.cpp | 208 +- src/band/residuals.cpp | 402 - src/band/residuals.hpp | 441 +- src/band/solve.cpp | 26 +- src/beta_projectors/beta_projectors.hpp | 26 +- src/beta_projectors/beta_projectors_base.cpp | 187 +- src/beta_projectors/beta_projectors_base.hpp | 176 +- src/context/config.hpp | 12 - src/context/input_schema.json | 7 - src/context/simulation_context.cpp | 140 +- src/context/simulation_context.hpp | 76 +- src/context/simulation_parameters.cpp | 1 - src/context/simulation_parameters.hpp | 38 +- src/density/augmentation_operator.cpp | 14 +- src/density/density.cpp | 857 +- src/density/density.hpp | 108 +- src/density/occupation_matrix.cpp | 66 +- src/density/occupation_matrix.hpp | 1 - src/dft/dft_ground_state.cpp | 8 +- src/function3d/field4d.hpp | 5 +- src/function3d/periodic_function.hpp | 4 +- src/function3d/smooth_periodic_function.hpp | 69 +- src/geometry/force.cpp | 44 +- src/geometry/force.hpp | 4 +- src/geometry/non_local_functor.cpp | 182 - src/geometry/non_local_functor.hpp | 153 +- src/geometry/stress.cpp | 68 +- src/geometry/stress.hpp | 2 +- src/geometry/wavefunction_strain_deriv.hpp | 8 +- src/gpu/acc_common.hpp | 201 + src/gpu/add_pw_ekin.cu | 98 - src/gpu/augmentation_operator.cu | 2 +- src/gpu/checksum.cu | 2 +- src/gpu/create_beta_gk.cu | 2 +- src/gpu/cuda_common.hpp | 55 - src/gpu/cuda_uspp_kernels.cu | 97 +- src/gpu/density_rg.cu | 2 +- src/gpu/fft_kernels.cu | 2 +- src/gpu/generate_dm_pw.cu | 2 +- src/gpu/generate_phase_factors.cu | 2 +- src/gpu/local_operator.cu | 251 + src/gpu/mul_by_veff.cu | 199 +- src/gpu/mul_veff_with_phase_factors.cu | 2 +- src/gpu/residuals_aux.cu | 178 +- src/gpu/scale_matrix.cu | 2 +- src/gpu/spherical_harmonics.cu | 2 +- src/gpu/spline.cu | 2 +- src/gpu/sum_q_pw_dm_pw.cu | 2 +- src/hamiltonian/hamiltonian.cpp | 34 +- src/hamiltonian/hamiltonian.hpp | 119 +- src/hamiltonian/hamiltonian_k.cpp | 876 +- src/hamiltonian/local_operator.cpp | 797 +- src/hamiltonian/local_operator.hpp | 198 +- src/hamiltonian/non_local_operator.cpp | 180 - src/hamiltonian/non_local_operator.hpp | 378 +- .../hubbard_occupancies_derivatives.cpp | 220 +- src/k_point/generate_fv_states.cpp | 139 +- .../generate_spinor_wave_functions.cpp | 35 +- src/k_point/k_point.cpp | 437 +- src/k_point/k_point.hpp | 119 +- src/k_point/k_point_set.cpp | 2 +- src/k_point/test_fv_states.cpp | 98 - src/lapw/generate_alm_block.hpp | 6 +- src/linalg/blacs_grid.hpp | 6 +- src/linalg/eigenproblem.hpp | 207 +- src/linalg/eigensolver.cpp | 4 +- src/linalg/eigensolver.hpp | 17 +- src/linalg/inverse_sqrt.hpp | 3 +- src/mpi/communicator.hpp | 66 +- src/multi_cg/multi_cg.hpp | 148 +- src/nlcglib/adaptor.cpp | 206 +- src/nlcglib/adaptor.hpp | 20 +- src/nlcglib/apply_hamiltonian.hpp | 32 +- src/potential/generate_d_operator_matrix.cpp | 14 +- src/potential/generate_pw_coeffs.cpp | 8 +- src/potential/poisson.cpp | 6 +- src/potential/potential.cpp | 6 +- src/potential/xc.cpp | 14 +- src/sirius.hpp | 4 + src/testing.hpp | 105 +- src/unit_cell/atom.hpp | 4 +- src/unit_cell/atom_symmetry_class.cpp | 4 +- src/unit_cell/unit_cell.hpp | 2 +- src/utils/env.hpp | 67 +- src/utils/utils.hpp | 5 +- verification/test16/sirius.json | 3 +- verification/test25/Ni.json | 41249 ++++++++++++++++ verification/test25/O.json | 23455 +++++++++ verification/test25/output_ref.json | 332 + verification/test25/sirius.json | 85 + 155 files changed, 73158 insertions(+), 10986 deletions(-) delete mode 100644 apps/tests/test_fft_v1.cpp delete mode 100644 apps/tests/test_gemr2d.cpp delete mode 100644 apps/tests/test_move_atom.cpp delete mode 100644 apps/tests/test_mpi_omp.cpp delete mode 100644 apps/tests/test_rank2.cpp create mode 100644 apps/tests/test_wf_fft.cpp delete mode 100644 apps/tests/test_wf_inner_v2.cpp delete mode 100644 apps/tests/test_wf_inner_v3.cpp delete mode 100644 apps/tests/test_wf_inner_v4.cpp delete mode 100644 apps/tests/test_wf_ortho_1stage.cpp delete mode 100644 apps/tests/test_wf_ortho_2.cpp delete mode 100644 apps/tests/test_wf_ortho_3.cpp delete mode 100644 apps/tests/test_wf_ortho_4.cpp delete mode 100644 apps/tests/test_wf_ortho_5.cpp delete mode 100644 apps/tests/test_wf_ortho_6.cpp delete mode 100644 apps/unit_tests/test_wf_ortho.cpp create mode 100644 apps/unit_tests/test_wf_ortho_1.cpp delete mode 100644 src/SDDK/matrix_storage.cpp delete mode 100644 src/SDDK/matrix_storage.hpp create mode 100644 src/SDDK/memory.cpp delete mode 100644 src/SDDK/wave_functions.cpp delete mode 100644 src/SDDK/wf_inner.cpp delete mode 100644 src/SDDK/wf_inner.hpp delete mode 100644 src/SDDK/wf_ortho.cpp delete mode 100644 src/SDDK/wf_ortho.hpp delete mode 100644 src/SDDK/wf_trans.hpp delete mode 100644 src/band/residuals.cpp delete mode 100644 src/geometry/non_local_functor.cpp create mode 100644 src/gpu/acc_common.hpp delete mode 100644 src/gpu/add_pw_ekin.cu delete mode 100644 src/gpu/cuda_common.hpp create mode 100644 src/gpu/local_operator.cu delete mode 100644 src/k_point/test_fv_states.cpp create mode 100644 verification/test25/Ni.json create mode 100644 verification/test25/O.json create mode 100644 verification/test25/output_ref.json create mode 100644 verification/test25/sirius.json diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 853f87bfd..1779fc992 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -96,6 +96,26 @@ jobs: cd ${GITHUB_WORKSPACE}/build spack --color always -e gcc-build-env build-env $SPEC_GCC -- make + build_magma: + runs-on: ubuntu-latest + container: electronicstructure/sirius + env: + SPEC_GCC: sirius@develop %gcc +tests +apps +vdwxc +scalapack +fortran +magma +cuda cuda_arch=60 build_type=RelWithDebInfo ^openblas ^mpich ^magma +cuda cuda_arch=60 + steps: + - uses: actions/checkout@v2 + - name: Show the spec + run: spack --color always -e gcc-build-env spec -I $SPEC_GCC + - name: Configure SIRIUS + run: | + cd ${GITHUB_WORKSPACE} + mkdir build + cd build + spack --color always -e gcc-build-env build-env $SPEC_GCC -- cmake .. -DUSE_SCALAPACK=1 -DUSE_MAGMA=1 -DUSE_CUDA=1 -DUSE_VDWXC=1 -DBUILD_TESTING=1 -DCREATE_FORTRAN_BINDINGS=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo + - name: Build SIRIUS + run: | + cd ${GITHUB_WORKSPACE}/build + spack --color always -e gcc-build-env build-env $SPEC_GCC -- make + build_cuda_fp32: runs-on: ubuntu-latest container: electronicstructure/sirius diff --git a/CMakeLists.txt b/CMakeLists.txt index 05bd3757e..276b90a8e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.18) -project(SIRIUS VERSION 7.3.2) +project(SIRIUS VERSION 7.4.0) # user variables set(CREATE_PYTHON_MODULE OFF CACHE BOOL "create sirius Python module") diff --git a/apps/nlcg/sirius.nlcg.cpp b/apps/nlcg/sirius.nlcg.cpp index 01b972999..e466dc099 100644 --- a/apps/nlcg/sirius.nlcg.cpp +++ b/apps/nlcg/sirius.nlcg.cpp @@ -93,7 +93,7 @@ double ground_state(Simulation_context& ctx, throw std::runtime_error("invalid smearing type given"); } - if (is_device_memory(ctx.preferred_memory_t())) { + if (is_device_memory(ctx.processing_unit_memory_t())) { switch (pu) { case sddk::device_t::GPU: { std::cout << "nlcg executing on gpu-gpu" << "\n"; diff --git a/apps/tests/CMakeLists.txt b/apps/tests/CMakeLists.txt index daab859f3..98af9c57e 100644 --- a/apps/tests/CMakeLists.txt +++ b/apps/tests/CMakeLists.txt @@ -1,9 +1,10 @@ -set(_tests "test_hdf5;test_allgather;\ +set(_tests "test_alloc;test_hdf5;test_allgather;\ read_atom;test_mdarray;test_xc;test_hloc;\ -test_mpi_grid;test_enu;test_eigen;test_gemm;test_gemm2;test_wf_inner_v3;test_wf_inner;test_memop;\ -test_mem_pool;test_mem_alloc;test_examples;test_wf_inner_v4;test_bcast_v2;test_p2p_cyclic;\ -test_wf_ortho_6;test_mixer;test_davidson;test_lapw_xc;test_phase;test_bessel;test_fp;test_pppw_xc;\ -test_exc_vxc;test_atomic_orbital_index;test_sym;test_blacs;test_reduce;test_comm_split;test_wf_trans") +test_mpi_grid;test_enu;test_eigen;test_gemm;test_gemm2;test_wf_inner;test_memop;\ +test_mem_pool;test_mem_alloc;test_examples;test_bcast_v2;test_p2p_cyclic;\ +test_wf_ortho;test_mixer;test_davidson;test_lapw_xc;test_phase;test_bessel;test_fp;test_pppw_xc;\ +test_exc_vxc;test_atomic_orbital_index;test_sym;test_blacs;test_reduce;test_comm_split;test_wf_trans;\ +test_wf_fft") foreach(_test ${_tests}) add_executable(${_test} ${_test}.cpp) diff --git a/apps/tests/test_alloc.cpp b/apps/tests/test_alloc.cpp index 023710b3f..e20d3ecda 100644 --- a/apps/tests/test_alloc.cpp +++ b/apps/tests/test_alloc.cpp @@ -1,32 +1,27 @@ -#include +#include using namespace sirius; -template +template void test_alloc(int size__) { - runtime::Timer t("alloc"); - if (pu == CPU) { - mdarray a(1024 * 1024 * size__); - #ifdef SIRIUS_GPU - if (pin) { - a.pin_memory(); - } - #endif + auto t0 = utils::time_now(); + if (pu == sddk::device_t::CPU) { + sddk::mdarray a(1024 * 1024 * size__, pin ? sddk::memory_t::host_pinned : sddk::memory_t::host); if (touch) { a.zero(); } } - #ifdef SIRIUS_GPU - if (pu == GPU) { - mdarray a(nullptr, 1024 * 1024 * size__); - a.allocate_on_device(); +#if defined(SIRIUS_GPU) + if (pu == sddk::device_t::GPU) { + sddk::mdarray a(nullptr, 1024 * 1024 * size__); + a.allocate(sddk::memory_t::device); if (touch) { - a.zero_on_device(); + a.zero(sddk::memory_t::device); } } #endif - double tval = t.stop(); + double tval = utils::time_interval(t0); printf("time: %f microseconds\n", tval * 1e6); printf("effective speed: %f GB/sec.\n", size__ / 1024.0 / tval); } @@ -44,18 +39,18 @@ int main(int argn, char** argv) sirius::initialize(1); printf("--- allocate on host, don't pin, don't touch\n"); - test_alloc<0, 0, CPU>(1024); + test_alloc<0, 0, sddk::device_t::CPU>(1024); printf("--- allocate on host, don't pin, touch\n"); - test_alloc<1, 0, CPU>(1024); + test_alloc<1, 0, sddk::device_t::CPU>(1024); printf("--- allocate on host, pin, don't touch\n"); - test_alloc<0, 1, CPU>(1024); + test_alloc<0, 1, sddk::device_t::CPU>(1024); printf("--- allocate on host, pin, touch\n"); - test_alloc<1, 1, CPU>(1024); - #ifdef SIRIUS_GPU + test_alloc<1, 1, sddk::device_t::CPU>(1024); +#if defined(SIRIUS_GPU) printf("--- allocate on device, don't touch\n"); - test_alloc<0, 0, GPU>(512); + test_alloc<0, 0, sddk::device_t::GPU>(512); printf("--- allocate on device, touch\n"); - test_alloc<1, 0, GPU>(512); - #endif + test_alloc<1, 0, sddk::device_t::GPU>(512); +#endif sirius::finalize(); } diff --git a/apps/tests/test_blacs.cpp b/apps/tests/test_blacs.cpp index 5dcc9f950..c2ada1762 100644 --- a/apps/tests/test_blacs.cpp +++ b/apps/tests/test_blacs.cpp @@ -1,21 +1,18 @@ #include -using namespace sirius; -using namespace sddk; - int main(int argn, char** argv) { sirius::initialize(true); #if defined(SIRIUS_SCALAPACK) - std::cout << Communicator::self().size() << " " << Communicator::self().rank() << std::endl; - std::cout << Communicator::world().size() << " " << Communicator::world().rank() << std::endl; + std::cout << sddk::Communicator::self().size() << " " << sddk::Communicator::self().rank() << std::endl; + std::cout << sddk::Communicator::world().size() << " " << sddk::Communicator::world().rank() << std::endl; - auto blacs_handler = linalg_base::create_blacs_handler(Communicator::self().mpi_comm()); - blacs_handler = linalg_base::create_blacs_handler(Communicator::world().mpi_comm()); + auto blacs_handler = sddk::linalg_base::create_blacs_handler(sddk::Communicator::self().mpi_comm()); + blacs_handler = sddk::linalg_base::create_blacs_handler(sddk::Communicator::world().mpi_comm()); + std::cout << blacs_handler << std::endl; sirius::finalize(true); #endif - return 0; } diff --git a/apps/tests/test_davidson.cpp b/apps/tests/test_davidson.cpp index edf623372..6371a2b20 100644 --- a/apps/tests/test_davidson.cpp +++ b/apps/tests/test_davidson.cpp @@ -1,43 +1,44 @@ #include +#include #include "band/davidson.hpp" using namespace sirius; -using namespace sddk; template -void init_wf(K_point* kp__, Wave_functions& phi__, int num_bands__, int num_mag_dims__) +void init_wf(K_point* kp__, wf::Wave_functions& phi__, int num_bands__, int num_mag_dims__) { std::vector tmp(0xFFFF); for (int i = 0; i < 0xFFFF; i++) { tmp[i] = utils::random(); } - phi__.pw_coeffs(0).prime().zero(); + phi__.zero(sddk::memory_t::host, wf::spin_index(0), wf::band_range(0, num_bands__)); //#pragma omp parallel for schedule(static) for (int i = 0; i < num_bands__; i++) { for (int igk_loc = 0; igk_loc < kp__->num_gkvec_loc(); igk_loc++) { /* global index of G+k vector */ - int igk = kp__->idxgk(igk_loc); + int igk = kp__->gkvec().offset() + igk_loc; if (igk == 0) { - phi__.pw_coeffs(0).prime(igk_loc, i) = 1.0; + phi__.pw_coeffs(igk_loc, wf::spin_index(0), wf::band_index(i)) = 1.0; } if (igk == i + 1) { - phi__.pw_coeffs(0).prime(igk_loc, i) = 0.5; + phi__.pw_coeffs(igk_loc, wf::spin_index(0), wf::band_index(i)) = 0.5; } if (igk == i + 2) { - phi__.pw_coeffs(0).prime(igk_loc, i) = 0.25; + phi__.pw_coeffs(igk_loc, wf::spin_index(0), wf::band_index(i)) = 0.25; } if (igk == i + 3) { - phi__.pw_coeffs(0).prime(igk_loc, i) = 0.125; + phi__.pw_coeffs(igk_loc, wf::spin_index(0), wf::band_index(i)) = 0.125; } - phi__.pw_coeffs(0).prime(igk_loc, i) += tmp[(igk + i) & 0xFFFF] * 1e-5; + phi__.pw_coeffs(igk_loc, wf::spin_index(0), wf::band_index(i)) += tmp[(igk + i) & 0xFFFF] * 1e-5; } } if (num_mag_dims__ == 3) { /* make pure spinor up- and dn- wave functions */ - phi__.copy_from(device_t::CPU, num_bands__, phi__, 0, 0, 1, num_bands__); + wf::copy(sddk::memory_t::host, phi__, wf::spin_index(0), wf::band_range(0, num_bands__), phi__, wf::spin_index(1), + wf::band_range(num_bands__, 2 * num_bands__)); } } @@ -55,47 +56,24 @@ diagonalize(Simulation_context& ctx__, std::array vk__, Potential& po Hamiltonian0 H0(pot__, true); auto Hk = H0(kp); - Band(ctx__).initialize_subspace>(Hk, ctx__.unit_cell().num_ps_atomic_wf().first); + sirius::initialize_subspace(Hk, ctx__.unit_cell().num_ps_atomic_wf().first); for (int i = 0; i < ctx__.num_bands(); i++) { kp.band_energy(i, 0, 0); } init_wf(&kp, kp.spinor_wave_functions(), ctx__.num_bands(), 0); - ///* - // * debug kinetic energy Hamiltonian (single MPI rank only) - // */ - - //const int bs = ctx__.cyclic_block_size(); const int num_bands = ctx__.num_bands(); - //auto& gv = kp.gkvec(); - //auto& phi = kp.spinor_wave_functions(); - //sddk::dmatrix> hmlt(num_bands, num_bands, ctx__.blacs_grid(), bs, bs); - //hmlt.zero(); - - //for (int i = 0; i < num_bands; i++) { - // for (int j = 0; j < num_bands; j++) { - // for (int ig = 0; ig < gv.num_gvec(); ig++) { - // auto gvc = gv.template gkvec_cart(ig); - // T ekin = 0.5 * dot(gvc, gvc); - // hmlt(i, j) += std::conj(phi.pw_coeffs(0).prime(ig, i)) * ekin * phi.pw_coeffs(0).prime(ig, j); - // } - // } - //} - //auto max_diff = check_hermitian(hmlt, num_bands); - //std::cout << "Simple kinetic Hamiltonian: error in hermiticity: " << std::setw(24) << std::scientific << max_diff << std::endl; - //hmlt.serialize("hmlt", num_bands); - // bool locking{true}; - auto result = davidson, std::complex, davidson_evp_t::hamiltonian>(Hk, num_bands, ctx__.num_mag_dims(), kp.spinor_wave_functions(), - [&](int i, int ispn){return eval_tol__;}, res_tol__, 60, locking, - subspace_size__, estimate_eval__, extra_ortho__, std::cout, 2); + auto result = davidson(Hk, wf::num_bands(num_bands), + wf::num_mag_dims(ctx__.num_mag_dims()), kp.spinor_wave_functions(), [&](int i, int ispn){return eval_tol__;}, res_tol__, + 60, locking, subspace_size__, estimate_eval__, extra_ortho__, std::cout, 2); - if (Communicator::world().rank() == 0 && only_kin__) { + if (sddk::Communicator::world().rank() == 0 && only_kin__) { std::vector ekin(kp.num_gkvec()); for (int i = 0; i < kp.num_gkvec(); i++) { - ekin[i] = 0.5 * kp.gkvec().template gkvec_cart(i).length2(); + ekin[i] = 0.5 * kp.gkvec().template gkvec_cart(i).length2(); } std::sort(ekin.begin(), ekin.end()); @@ -107,7 +85,7 @@ diagonalize(Simulation_context& ctx__, std::array vk__, Potential& po printf("maximum eigen-value difference: %20.16e\n", max_diff); } - if (Communicator::world().rank() == 0 && !only_kin__) { + if (sddk::Communicator::world().rank() == 0 && !only_kin__) { std::cout << "Converged eigen-values" << std::endl; for (int i = 0; i < ctx__.num_bands(); i++) { printf("e[%i] = %20.16f\n", i, result.eval(i, 0)); @@ -140,111 +118,40 @@ void test_davidson(cmd_args const& args__) PROFILE_START("test_davidson|setup") /* create simulation context */ - Simulation_context ctx( - "{" - " \"parameters\" : {" - " \"electronic_structure_method\" : \"pseudopotential\"" - " }," - " \"control\" : {" - " \"verification\" : 0," - " \"print_checksum\" : false" - " }" - "}"); - - /* add a new atom type to the unit cell */ - auto& atype = ctx.unit_cell().add_atom_type("Cu"); - /* set pseudo charge */ - atype.zn(11); - /* set radial grid */ - atype.set_radial_grid(radial_grid_t::lin_exp, 1000, 0.0, 100.0, 6); - /* cutoff at ~1 a.u. */ - int icut = atype.radial_grid().index_of(1.0); - double rcut = atype.radial_grid(icut); - /* create beta radial function */ - std::vector beta(icut + 1); - std::vector beta1(icut + 1); - for (int l = 0; l <= 2; l++) { - for (int i = 0; i <= icut; i++) { - double x = atype.radial_grid(i); - beta[i] = utils::confined_polynomial(x, rcut, l, l + 1, 0); - beta1[i] = utils::confined_polynomial(x, rcut, l, l + 2, 0); - } - /* add radial function for l */ - atype.add_beta_radial_function(l, beta); - atype.add_beta_radial_function(l, beta1); - } - - std::vector ps_wf(atype.radial_grid().num_points()); - for (int l = 0; l <= 2; l++) { - for (int i = 0; i < atype.radial_grid().num_points(); i++) { - double x = atype.radial_grid(i); - ps_wf[i] = std::exp(-x) * std::pow(x, l); - } - /* add radial function for l */ - atype.add_ps_atomic_wf(3, sirius::experimental::angular_momentum(l), ps_wf); - } - - /* set local part of potential */ - std::vector vloc(atype.radial_grid().num_points(), 0); - if (add_vloc) { - for (int i = 0; i < atype.radial_grid().num_points(); i++) { - double x = atype.radial_grid(i); - vloc[i] = -atype.zn() / (std::exp(-x * (x + 1)) + x); - } - } - atype.local_potential(vloc); - /* set Dion matrix */ - int nbf = atype.num_beta_radial_functions(); - matrix dion(nbf, nbf); - dion.zero(); - if (add_dion) { - for (int i = 0; i < nbf; i++) { - dion(i, i) = -10.0; - } - } - atype.d_mtrx_ion(dion); - /* set atomic density */ - std::vector arho(atype.radial_grid().num_points()); - for (int i = 0; i < atype.radial_grid().num_points(); i++) { - double x = atype.radial_grid(i); - arho[i] = 2 * atype.zn() * std::exp(-x * x) * x; + auto json_conf = R"({ + "parameters" : { + "electronic_structure_method" : "pseudopotential" + } + })"_json; + json_conf["control"]["processing_unit"] = args__.value("device", "CPU"); + json_conf["control"]["mpi_grid_dims"] = mpi_grid; + json_conf["control"]["std_evp_solver_name"] = solver; + json_conf["control"]["gen_evp_solver_name"] = solver; + json_conf["parameters"]["pw_cutoff"] = pw_cutoff; + json_conf["parameters"]["gk_cutoff"] = gk_cutoff; + json_conf["parameters"]["gamma_point"] = false; + if (num_bands >= 0) { + json_conf["parameters"]["num_bands"] = num_bands; } - atype.ps_total_charge_density(arho); - /* lattice constant */ - double a{5}; - /* set lattice vectors */ - ctx.unit_cell().set_lattice_vectors({{a * N, 0, 0}, - {0, a * N, 0}, - {0, 0, a * N}}); - /* add atoms */ + std::vector> coord; double p = 1.0 / N; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { for (int k = 0; k < N; k++) { - ctx.unit_cell().add_atom("Cu", {i * p, j * p, k * p}); + coord.push_back(geometry3d::vector3d(i * p, j * p, k * p)); } } } - /* initialize the context */ - ctx.verbosity(4); - ctx.pw_cutoff(pw_cutoff); - ctx.gk_cutoff(gk_cutoff); - ctx.processing_unit(args__.value("device", "CPU")); - ctx.mpi_grid_dims(mpi_grid); - ctx.gen_evp_solver_name(solver); - ctx.std_evp_solver_name(solver); - if (num_bands >= 0) { - ctx.num_bands(num_bands); - } + double a{5}; + auto sctx_ptr = sirius::create_simulation_context(json_conf, {{a * N, 0, 0}, {0, a * N, 0}, {0, 0, a * N}}, + N * N * N, coord, add_vloc, add_dion); + auto& ctx = *sctx_ptr; PROFILE_STOP("test_davidson|setup") - //ctx.cfg().iterative_solver().type("exact"); - - /* initialize simulation context */ - ctx.initialize(); + ////ctx.cfg().iterative_solver().type("exact"); std::cout << "number of atomic orbitals: " << ctx.unit_cell().num_ps_atomic_wf().first << "\n"; @@ -264,16 +171,16 @@ void test_davidson(cmd_args const& args__) } if (precision_wf == "fp32" && precision_hs == "fp32") { #if defined(USE_FP32) - diagonalize(ctx, vk, pot, res_tol, eval_tol, only_kin, subspace_size, estimate_eval, extra_ortho); + diagonalize>(ctx, vk, pot, res_tol, eval_tol, only_kin, subspace_size, estimate_eval, extra_ortho); #endif } if (precision_wf == "fp32" && precision_hs == "fp64") { #if defined(USE_FP32) - diagonalize(ctx, vk, pot, res_tol, eval_tol, only_kin, subspace_size, estimate_eval, extra_ortho); + diagonalize>(ctx, vk, pot, res_tol, eval_tol, only_kin, subspace_size, estimate_eval, extra_ortho); #endif } if (precision_wf == "fp64" && precision_hs == "fp64") { - diagonalize(ctx, vk, pot, res_tol, eval_tol, only_kin, subspace_size, estimate_eval, extra_ortho); + diagonalize>(ctx, vk, pot, res_tol, eval_tol, only_kin, subspace_size, estimate_eval, extra_ortho); } } } @@ -305,7 +212,7 @@ int main(int argn, char** argv) sirius::initialize(1); test_davidson(args); - int rank = Communicator::world().rank(); + int rank = sddk::Communicator::world().rank(); sirius::finalize(); if (rank == 0) { const auto timing_result = ::utils::global_rtgraph_timer.process(); diff --git a/apps/tests/test_eigen.cpp b/apps/tests/test_eigen.cpp index 159a03f2b..d7f1b9c11 100644 --- a/apps/tests/test_eigen.cpp +++ b/apps/tests/test_eigen.cpp @@ -136,7 +136,7 @@ void test_diag2(sddk::BLACS_grid const& blacs_grid__, std::string name__, std::string fname__) { - auto solver = Eigensolver_factory(name__, nullptr); + auto solver = Eigensolver_factory(name__); sddk::matrix full_mtrx; int n; @@ -190,7 +190,7 @@ void call_test(std::vector mpi_grid__, int repeat__, int type__) { - auto solver = Eigensolver_factory(name__, nullptr); + auto solver = Eigensolver_factory(name__); sddk::BLACS_grid blacs_grid(sddk::Communicator::world(), mpi_grid__[0], mpi_grid__[1]); if (fname__.length() == 0) { Measurement m; diff --git a/apps/tests/test_examples.cpp b/apps/tests/test_examples.cpp index bbda2eb40..a1805c45f 100644 --- a/apps/tests/test_examples.cpp +++ b/apps/tests/test_examples.cpp @@ -1,14 +1,17 @@ #include #include -#include "SDDK/wf_ortho.hpp" +#include "SDDK/wave_functions.hpp" using namespace sirius; using namespace sddk; void test1() { -/* reciprocal lattice vectors in - inverse atomic units */ +if (Communicator::world().rank() == 0) { + std::cout << "test1" << std::endl; +} +/* reciprocal lattice vectors in + inverse atomic units */ matrix3d M = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}; @@ -35,90 +38,109 @@ for (int j = 0; j < gvec.count(); j++) { } } - } void test2() { +if (Communicator::world().rank() == 0) { + std::cout << "test2" << std::endl; +} +/* reciprocal lattice vectors in + inverse atomic units */ +matrix3d M = {{1, 0, 0}, + {0, 1, 0}, + {0, 0, 1}}; +/* G-vector cutoff radius in + inverse atomic units */ +double Gmax = 10; +/* create a list of G-vectors; + last boolean parameter switches + off the reduction of G-vectors by + inversion symmetry */ +Gvec gvec(M, Gmax, Communicator::world(), false); +/* FFT-friendly distribution */ +Gvec_fft gvp(gvec, Communicator::world(), + Communicator::self()); +/* dimensions of the FFT box */ +FFT3D_grid dims({40, 40, 40}); + +/* this is how our code splits the z-dimension + * of the FFT buffer */ +auto spl_z = split_fft_z(dims[2], + Communicator::world()); + +/* create SpFFT grid object */ +spfft_grid_type spfft_grid(dims[0], dims[1], + dims[2], gvp.zcol_count_fft(), spl_z.local_size(), + SPFFT_PU_HOST, -1, Communicator::world().mpi_comm(), + SPFFT_EXCH_DEFAULT); + +auto const& gv = gvp.gvec_array(); +/* create SpFFT transformation object */ +spfft_transform_type spfft( + spfft_grid.create_transform(SPFFT_PU_HOST, + SPFFT_TRANS_C2C, + dims[0], dims[1], dims[2], spl_z.local_size(), + gvp.gvec_count_fft(), + SPFFT_INDEX_TRIPLETS, gv.at(memory_t::host))); + +/* create data buffer with local number of G-vectors + and fill with random numbers */ +mdarray f(gvp.gvec_count_fft()); +f = [](int64_t){ + return utils::random(); +}; +/* transform to real space */ +spfft.backward(reinterpret_cast( + &f[0]), SPFFT_PU_HOST); +/* get real space data pointer */ +auto ptr = reinterpret_cast*>( + spfft.space_domain_data(SPFFT_PU_HOST)); +/* now the fft buffer contains the real space values */ +for (int j0 = 0; j0 < dims[0]; j0++) { + for (int j1 = 0; j1 < dims[1]; j1++) { + for (int jz = 0; jz < spfft.local_z_length(); jz++) { + auto j2 = spfft.local_z_offset() + jz; + int idx = dims.index_by_coord(j0, j1, j2); + /* get the value at (j0, j1, j2) point of the grid */ + ptr[idx] += 0.0; + } + } +} -///* reciprocal lattice vectors in -// inverse atomic units */ -//matrix3d M = {{1, 0, 0}, -// {0, 1, 0}, -// {0, 0, 1}}; -///* G-vector cutoff radius in -// inverse atomic units */ -//double Gmax = 10; -///* create a list of G-vectors; -// last boolean parameter switches -// off the reduction of G-vectors by -// inversion symmetry */ -//Gvec gvec(M, Gmax, Communicator::world(), false); -///* dimensions of the FFT box */ -//std::array dims = {20, 20, 20}; -///* create parallel FFT driver with CPU backend */ -//FFT3D fft(dims, Communicator::world(), device_t::CPU); -///* create G-vector partition; second communicator -// is used in remappting data for FFT */ -//Gvec_partition gvp(gvec, fft.comm(), Communicator::self()); -///* create data buffer with local number of G-vectors -// and fill with random numbers */ -//mdarray f(gvp.gvec_count_fft()); -//f = [](int64_t){ -// return utils::random(); -//}; -///* prepare FFT driver for a given G-vector partition */ -//fft.prepare(gvp); -///* transform to real-space domain */ -//fft.transform<1>(f.at(memory_t::host)); -///* now the fft buffer contains the real space values */ -//for (int j0 = 0; j0 < fft.size(0); j0++) { -// for (int j1 = 0; j1 < fft.size(1); j1++) { -// for (int j2 = 0; j2 < fft.local_size_z(); j2++) { -// int idx = fft.index_by_coord(j0, j1, j2); -// /* get the value at (j0, j1, j2) point of the grid */ -// auto val = fft.buffer(idx); -// } -// } -//} -////for (int i = 0; i < fft.local_size(); i++) { -//// /* get the value */ -//// auto val = fft.buffer(i); -////} -///* dismiss the FFT driver */ -//fft.dismiss(); } void test3() { +if (Communicator::world().rank() == 0) { + std::cout << "test3" << std::endl; +} spla::Context spla_ctx(SPLA_PU_HOST); /* reciprocal lattice vectors in - inverse atomic units */ + inverse atomic units */ matrix3d M = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}; /* G-vector cutoff radius in - inverse atomic units */ + inverse atomic units */ double Gmax = 10; /* create a list of G-vectors; last boolean parameter switches off the reduction of G-vectors by inversion symmetry */ -Gvec gvec(M, Gmax, Communicator::world(), false); -/* create G-vector partition; second communicator - is used in remappting data for FFT */ -Gvec_partition gvp(gvec, Communicator::world(), Communicator::self()); +auto gvec = std::make_shared(M, Gmax, Communicator::world(), false); /* number of wave-functions */ int N = 100; /* create scalar wave-functions for N bands */ -Wave_functions wf(gvp, N, memory_t::host); -/* spin index for scalar wave-functions */ -int ispn = 0; +wf::Wave_functions wf(gvec, wf::num_mag_dims(0), wf::num_bands(N), memory_t::host); /* fill with random numbers */ -wf.pw_coeffs(ispn).prime() = [](int64_t, int64_t){ - return utils::random(); -}; +for (int i = 0; i < N; i++) { + for (int j = 0; j < gvec->count(); j++) { + wf.pw_coeffs(j, wf::spin_index(0), wf::band_index(i)) = + utils::random(); + } +} /* create a 2x2 BLACS grid */ BLACS_grid grid(Communicator::world(), 2, 2); /* cyclic block size */ @@ -126,11 +148,12 @@ int bs = 16; /* create a distributed overlap matrix */ dmatrix o(N, N, grid, bs, bs); /* create temporary wave-functions */ -Wave_functions tmp(gvp, N, memory_t::host); +wf::Wave_functions tmp(gvec, wf::num_mag_dims(0), wf::num_bands(N), memory_t::host); /* orthogonalize wave-functions */ -orthogonalize(spla_ctx, memory_t::host, linalg_t::blas, spin_range(ispn), 0, 0, {&wf}, 0, N, o, tmp); +wf::orthogonalize(spla_ctx, memory_t::host, wf::spin_range(0), wf::band_range(0, 0), + wf::band_range(0, N), wf, wf, {&wf}, o, tmp, false); /* compute overlap */ -inner(spla_ctx, spin_range(ispn), wf, 0, N, wf, 0, N, o, 0, 0); +wf::inner(spla_ctx, memory_t::host, wf::spin_range(0), wf, wf::band_range(0, N), wf, wf::band_range(0, N), o, 0, 0); /* get the diagonal of the matrix */ auto d = o.get_diag(N); /* check diagonal */ @@ -141,106 +164,6 @@ for (int i = 0; i < N; i++) { } } -void test4() -{ -///* dimensions of the FFT box */ -//std::array dims = {20, 20, 20}; -///* reciprocal lattice vectors in -// inverse atomic units */ -//matrix3d M = {{1, 0, 0}, -// {0, 1, 0}, -// {0, 0, 1}}; -///* G-vector cutoff radius in -// inverse atomic units */ -//double Gmax = 10; -///* create a list of G-vectors; -// last boolean parameter switches -// off the reduction of G-vectors by -// inversion symmetry */ -//Gvec gvec(M, Gmax, Communicator::world(), false); -///* create sequential FFT driver with CPU backend */ -//FFT3D fft(dims, Communicator::self(), device_t::CPU); -///* potential on a real-space grid */ -//std::vector v(fft.local_size(), 1); -///* create G-vector partition; second communicator -// is used in remappting wave-functions */ -//Gvec_partition gvp(gvec, fft.comm(), Communicator::world()); -///* prepare FFT driver */ -//fft.prepare(gvp); -///* number of wave-functions */ -//int N = 100; -///* create scalar wave-functions for N bands */ -//Wave_functions wf(gvp, N, memory_t::host); -///* spin index for scalar wave-functions */ -//int ispn = 0; -///* fill with random numbers */ -//wf.pw_coeffs(ispn).prime() = [](int64_t, int64_t){ -// return utils::random(); -//}; -///* resulting |v*wf> */ -//Wave_functions vwf(gvp, N, memory_t::host); -///* remap wave-functions */ -//wf.pw_coeffs(ispn).remap_forward(N, 0, nullptr); -///* prepare the target wave-functions */ -//vwf.pw_coeffs(ispn).set_num_extra(N, 0, nullptr); -///* loop over local number of bands */ -//for (int i = 0; i < wf.pw_coeffs(ispn).spl_num_col().local_size(); i++) { -// /* transform to real-space */ -// fft.transform<1>(wf.pw_coeffs(ispn).extra().at(memory_t::host, 0, i)); -// /* multiply by potential */ -// for (int j = 0; j < fft.local_size(); j++) { -// fft.buffer(j) *= v[j]; -// } -// /* transform to reciprocal space */ -// fft.transform<-1>(vwf.pw_coeffs(ispn).extra().at(memory_t::host, 0, i)); -//} -///* remap to default "slab" storage */ -//vwf.pw_coeffs(ispn).remap_backward(N, 0); -///* dismiss the FFT driver */ -//fft.dismiss(); - -} - -void test5() -{ -/* create simulation context */ -Simulation_context ctx("{\"parameters\" : " - "{\"electronic_structure_method\":" - "\"pseudopotential\"}}", - Communicator::world()); -/* lattice constant */ -double a{5}; -/* set lattice vectors */ -ctx.unit_cell().set_lattice_vectors({{a,0,0}, - {0,a,0}, - {0,0,a}}); -/* add atom type */ -ctx.unit_cell().add_atom_type("H"); -/* get created atom type */ -auto& atype = ctx.unit_cell().atom_type(0); -/* set charge */ -atype.zn(1); -/* set radial grid */ -atype.set_radial_grid(radial_grid_t::lin_exp, - 1000, 0, 2, 6); -/* create beta radial function */ -std::vector beta(atype.num_mt_points()); -for (int i = 0; i < atype.num_mt_points(); i++) { - double x = atype.radial_grid(i); - beta[i] = std::exp(-x) * (4 - x * x); -} -/* add radial function for l=0 */ -atype.add_beta_radial_function(0, beta); -/* add atom */ -ctx.unit_cell().add_atom("H", {0, 0, 0}); -/* initialize the context */ -ctx.initialize(); -/* get FFT driver */ -//auto& fft = ctx.spfft(); -/* get G-vectors */ -//auto& gvec = ctx.gvec(); -} - int main(int argn, char** argv) { cmd_args args; @@ -256,7 +179,5 @@ int main(int argn, char** argv) test1(); test2(); test3(); - test4(); - test5(); sirius::finalize(); } diff --git a/apps/tests/test_fft_v1.cpp b/apps/tests/test_fft_v1.cpp deleted file mode 100644 index 526fb9951..000000000 --- a/apps/tests/test_fft_v1.cpp +++ /dev/null @@ -1,59 +0,0 @@ -#include - -using namespace sirius; - -void test_fft(vector3d dims, double cutoff, std::vector mpi_grid) -{ - FFT3D fft(dims, mpi_comm_self(), GPU); - - //Gvec gvec({0, 0, 0}, {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}, cutoff, fft.grid(), 1, mpi_comm_self(), false); - - //printf("num_gvec: %i\n", gvec.num_gvec()); - //printf("num_z_col: %i\n", gvec.num_zcol()); - - //MPI_grid mpi_fft_grid({1, 1}, mpi_comm_self()); - // - //mdarray v(gvec.num_gvec()); - //v.zero(); - //v[0] = 1; - //v.allocate_on_device(); - //v.copy_to_device(); - // - //fft.prepare(gvec.partition()); - //for (int i = 0; i < 100; i++) { - // fft.transform<1>(gvec.partition(), v.at()); - // fft.transform<-1>(gvec.partition(), v.at()); - //} - //for (int i = 0; i < 100; i++) { - // fft.transform<1>(gvec.partition(), v.at()); - // fft.transform<-1>(gvec.partition(), v.at()); - //} - //v.copy_to_host(); - //std::cout << v[0] << std::endl; - //fft.dismiss(); -} - -int main(int argn, char **argv) -{ - cmd_args args; - args.register_key("--dims=", "{vector3d} FFT dimensions"); - args.register_key("--cutoff=", "{double} cutoff radius in G-space"); - args.register_key("--mpi_grid=", "{vector2d} MPI grid"); - - args.parse_args(argn, argv); - if (args.exist("help")) { - printf("Usage: %s [options]\n", argv[0]); - args.print_help(); - return 0; - } - - vector3d dims = args.value< vector3d >("dims"); - double cutoff = args.value("cutoff", 1); - std::vector mpi_grid = args.value< std::vector >("mpi_grid", {1, 1}); - - sirius::initialize(1); - - test_fft(dims, cutoff, mpi_grid); - - sirius::finalize(); -} diff --git a/apps/tests/test_gemr2d.cpp b/apps/tests/test_gemr2d.cpp deleted file mode 100644 index fe00f1f62..000000000 --- a/apps/tests/test_gemr2d.cpp +++ /dev/null @@ -1,128 +0,0 @@ -#include - -using namespace sirius; - -void test_gemr2d(int M, int N, int repeat) -{ - Communicator comm(MPI_COMM_WORLD); - - BLACS_grid grid_col(comm, 1, comm.size()); - BLACS_grid grid_row(comm, comm.size(), 1); - - int gcontext = grid_row.context(); - - dmatrix A(M, N, grid_row, splindex_base::block_size(M, comm.size()), 1); - int n = 0; - for (int i = 0; i < N; i++) - { - //for (int j = 0; j < M; j++) A.set(j, i, type_wrapper::random()); - for (int j = 0; j < M; j++) A.set(j, i, double_complex(n++, 0)); - } - auto h = A.panel().hash(); - - dmatrix B(M, N, grid_col, 1, 1); - B.zero(); - //redist::gemr2d(A, B); - //dmatrix Anew(M, N, grid_row, splindex_base::block_size(M, comm.size()), 1); - //redist::gemr2d(B, Anew); - //for (int rank = 0; rank < comm.size(); rank++) - //{ - // if (rank == comm.rank()) - // { - // printf("rank: %i\n", rank); - // for (int i = 0; i < A.num_cols_local(); i++) - // { - // for (int j = 0; j < A.num_rows_local(); j++) - // { - // double d = std::abs(A(j, i) - Anew(j, i)); - // if (d > 1e-12) - // { - // printf("diff(%4i, %4i): exp %12.6f, actual %12.6f\n", j, i, std::abs(A(j, i)), std::abs(Anew(j, i))); - // } - // } - // } - // } - // comm.barrier(); - //} - - ////for (int rank = 0; rank < comm.size(); rank++) - ////{ - //// if (rank == comm.rank()) - //// { - //// printf("rank: %i\n", rank); - //// for (int i = 0; i < B.num_cols_local(); i++) - //// { - //// for (int j = 0; j < B.num_rows_local(); j++) printf("B(%i, %i)=%f\n", j, i, B(j, i).real()); - //// } - //// } - //// comm.barrier(); - ////} - redist::gemr2d(M, N - 1, A, 0, 1, B, 0, 0); - redist::gemr2d(M, N - 1, B, 0, 0, A, 0, 1); - if (A.panel().hash() != h) - { - TERMINATE("wrong hash"); - } - - - - - for (int i = 0; i < repeat; i++) - { - double t1 = -Utils::current_time(); - - redist::gemr2d(M, N, A, 0, 0, B, 0, 0); - redist::gemr2d(M, N, B, 0, 0, A, 0, 0); - t1 += Utils::current_time(); - if (comm.rank() == 0) std::cout << "custom swap time: " << t1 << " sec." << std::endl; - } - if (A.panel().hash() != h) - { - TERMINATE("wrong hash"); - } - if (comm.rank() == 0) printf("Done.\n"); - - double t0 = -Utils::current_time(); - for (int i = 0; i < repeat; i++) - { - linalg::gemr2d(M, N, A, 0, 0, B, 0, 0, gcontext); - linalg::gemr2d(M, N, B, 0, 0, A, 0, 0, gcontext); - } - t0 += Utils::current_time(); - - if (comm.rank() == 0) - { - printf("average time %.4f sec, swap speed: %.4f GB/sec\n", t0 / repeat, - sizeof(double_complex) * 2 * repeat * M * N / double(1 << 30) / t0); - } - - if (A.panel().hash() != h) - { - TERMINATE("wrong hash"); - } -} - -int main(int argn, char** argv) -{ - cmd_args args; - args.register_key("--M=", "{int} number of rows"); - args.register_key("--N=", "{int} number of columns"); - args.register_key("--repeat=", "{int} number of repeats"); - - args.parse_args(argn, argv); - if (args.exist("help")) - { - printf("Usage: %s [options]\n", argv[0]); - args.print_help(); - exit(0); - } - int M = args.value("M", 10000); - int N = args.value("N", 100); - int repeat = args.value("repeat", 10); - - Platform::initialize(1); - - test_gemr2d(M, N, repeat); - - Platform::finalize(); -} diff --git a/apps/tests/test_hloc.cpp b/apps/tests/test_hloc.cpp index 492ee0c6b..681b7ced3 100644 --- a/apps/tests/test_hloc.cpp +++ b/apps/tests/test_hloc.cpp @@ -1,90 +1,74 @@ #include -#include -#include - -using namespace sirius; +#include template -void test_hloc(std::vector mpi_grid_dims__, double cutoff__, int num_bands__, int reduce_gvec__, - int use_gpu__, int gpu_ptr__) +void test_hloc(sirius::Simulation_context& ctx__, int num_bands__, int use_gpu__) { - sddk::device_t pu = static_cast(use_gpu__); - - matrix3d M = {{10, 0, 0}, {0, 10, 0}, {0, 0, 10}}; - - for (int i = 0; i < 3; i++) { - printf(" a%1i : %18.10f %18.10f %18.10f \n", i + 1, M(0, i), M(1, i), M(2, i)); - } - - Simulation_context params; - if (use_gpu__) { - params.processing_unit("GPU"); - } else { - params.processing_unit("CPU"); - } - - params.unit_cell().set_lattice_vectors(M); - params.mpi_grid_dims(mpi_grid_dims__); - params.pw_cutoff(cutoff__ + 1); - params.gk_cutoff(cutoff__ / 2); - params.electronic_structure_method("pseudopotential"); - params.use_symmetry(false); - params.initialize(); - - auto& gvec = params.gvec(); - auto& gvecp = params.gvec_partition(); - auto& fft = params.spfft(); + auto gvec = ctx__.gvec_coarse_sptr(); + auto gvec_fft = ctx__.gvec_coarse_fft_sptr(); + auto& fft = ctx__.spfft_coarse(); if (sddk::Communicator::world().rank() == 0) { - printf("total number of G-vectors: %i\n", gvec.num_gvec()); - printf("local number of G-vectors: %i\n", gvec.gvec_count(0)); - printf("FFT grid size: %i %i %i\n", fft.dim_x(), fft.dim_y(), fft.dim_z()); - printf("number of FFT threads: %i\n", omp_get_max_threads()); - printf("number of FFT groups: %i\n", params.comm_ortho_fft().size()); - //printf("MPI grid: %i %i\n", mpi_grid.communicator(1 << 0).size(), mpi_grid.communicator(1 << 1).size()); - printf("number of z-columns: %i\n", gvec.num_zcol()); + printf("total number of G-vectors : %i\n", gvec->num_gvec()); + printf("local number of G-vectors : %i\n", gvec->count()); + printf("FFT grid size : %i %i %i\n", fft.dim_x(), fft.dim_y(), fft.dim_z()); + printf("number of FFT threads : %i\n", omp_get_max_threads()); + printf("number of FFT groups : %i\n", gvec_fft->comm_ortho_fft().size()); + printf("FTT comm size : %i\n", gvec_fft->comm_fft().size()); + printf("number of z-columns : %i\n", gvec->num_zcol()); + printf("fft_mode : %s\n", ctx__.cfg().control().fft_mode().c_str()); } - Local_operator hloc(params, fft, gvecp); + sirius::Local_operator hloc(ctx__, fft, gvec_fft); - sddk::Wave_functions phi(gvecp, 4 * num_bands__, sddk::memory_t::host); + wf::Wave_functions phi(gvec, wf::num_mag_dims(0), wf::num_bands(4 * num_bands__), sddk::memory_t::host); for (int i = 0; i < 4 * num_bands__; i++) { - for (int j = 0; j < phi.pw_coeffs(0).num_rows_loc(); j++) { - phi.pw_coeffs(0).prime(j, i) = utils::random>(); + for (int j = 0; j < phi.ld(); j++) { + phi.pw_coeffs(j, wf::spin_index(0), wf::band_index(i)) = utils::random>(); } - phi.pw_coeffs(0).prime(0, i) = 1.0; + phi.pw_coeffs(0, wf::spin_index(0), wf::band_index(i)) = 1.0; } - sddk::Wave_functions hphi(gvecp, 4 * num_bands__, sddk::memory_t::host); + wf::Wave_functions hphi(gvec, wf::num_mag_dims(0), wf::num_bands(4 * num_bands__), sddk::memory_t::host); - if (pu == sddk::device_t::GPU) { - phi.pw_coeffs(0).allocate(sddk::memory_t::device); - phi.pw_coeffs(0).copy_to(sddk::memory_t::device, 0, 4 * num_bands__); - hphi.pw_coeffs(0).allocate(sddk::memory_t::device); - } - hloc.prepare_k(gvecp); - for (int i = 0; i < 4; i++) { - hloc.apply_h(fft, gvecp, sddk::spin_range(0), phi, hphi, i * num_bands__, num_bands__); + { + auto mem_phi = (use_gpu__) ? sddk::memory_t::device : sddk::memory_t::host; + auto copy_policy_phi = wf::copy_to::device; + + auto mem_hphi = (use_gpu__) ? sddk::memory_t::device : sddk::memory_t::host; + auto copy_policy_hphi = wf::copy_to::host; + + auto mg1 = phi.memory_guard(mem_phi, copy_policy_phi); + auto mg2 = hphi.memory_guard(mem_hphi, copy_policy_hphi); + + hloc.prepare_k(*gvec_fft); + for (int i = 0; i < 4; i++) { + hloc.apply_h(fft, gvec_fft, wf::spin_range(0), phi, hphi, + wf::band_range(i * num_bands__, (i + 1) * num_bands__)); + } } - //hloc.dismiss(); double diff{0}; for (int i = 0; i < 4 * num_bands__; i++) { - for (int j = 0; j < phi.pw_coeffs(0).num_rows_loc(); j++) { - int ig = gvec.offset() + j; - auto gc = gvec.gvec_cart(ig); - diff += std::pow(std::abs(static_cast(2.71828 + 0.5 * dot(gc, gc)) * phi.pw_coeffs(0).prime(j, i) - hphi.pw_coeffs(0).prime(j, i)), 2); + for (int j = 0; j < phi.ld(); j++) { + int ig = gvec->offset() + j; + auto gc = gvec->gvec_cart(ig); + diff += std::pow(std::abs(static_cast(2.71828 + 0.5 * dot(gc, gc)) * phi.pw_coeffs(j, wf::spin_index(0), + wf::band_index(i)) - hphi.pw_coeffs(j, wf::spin_index(0), wf::band_index(i))), 2); } } if (diff != diff) { TERMINATE("NaN"); } sddk::Communicator::world().allreduce(&diff, 1); - diff = std::sqrt(diff / 4 / num_bands__ / gvec.num_gvec()); + diff = std::sqrt(diff / 4 / num_bands__ / gvec->num_gvec()); if (sddk::Communicator::world().rank() == 0) { printf("RMS: %18.16f\n", diff); } if (diff > 1e-12) { - TERMINATE("RMS is too large"); + RTE_THROW("RMS is too large"); + } + if (sddk::Communicator::world().rank() == 0) { + std::cout << "number of hamiltonian applications : " << ctx__.num_loc_op_applied() << std::endl; } } @@ -112,33 +96,44 @@ int main(int argn, char** argv) auto reduce_gvec = args.value("reduce_gvec", 0); auto num_bands = args.value("num_bands", 10); auto use_gpu = args.value("use_gpu", 0); - auto gpu_ptr = args.value("gpu_ptr", 0); auto repeat = args.value("repeat", 3); auto t_file = args.value("t_file", std::string("")); auto fp32 = args.exist("fp32"); sirius::initialize(1); - for (int i = 0; i < repeat; i++) { - if (fp32) { + int my_rank = sddk::Communicator::world().rank(); + + { + auto json_conf = R"({ + "parameters" : { + "electronic_structure_method" : "pseudopotential", + "use_symmetry" : false + } + })"_json; + json_conf["control"]["processing_unit"] = use_gpu ? "GPU" : "CPU"; + json_conf["control"]["mpi_grid_dims"] = mpi_grid_dims; + json_conf["parameters"]["pw_cutoff"] = cutoff + 1; + json_conf["parameters"]["gk_cutoff"] = cutoff / 2.0; + json_conf["parameters"]["gamma_point"] = reduce_gvec; + + auto ctx = sirius::create_simulation_context(json_conf, {{10, 0, 0}, {0, 10, 0}, {0, 0, 10}}, 0, + std::vector>(), false, false); + for (int i = 0; i < repeat; i++) { + if (fp32) { #if defined(USE_FP32) - test_hloc(mpi_grid_dims, cutoff, num_bands, reduce_gvec, use_gpu, gpu_ptr); + test_hloc(*ctx, num_bands, use_gpu); #else - RTE_THROW("Not compiled with FP32 support"); + RTE_THROW("Not compiled with FP32 support"); #endif - } else { - test_hloc(mpi_grid_dims, cutoff, num_bands, reduce_gvec, use_gpu, gpu_ptr); + } else { + test_hloc(*ctx, num_bands, use_gpu); + } } } - int my_rank = sddk::Communicator::world().rank(); - sirius::finalize(1); if (my_rank == 0) { const auto timing_result = ::utils::global_rtgraph_timer.process(); std::cout << timing_result.print(); - //if (!t_file.empty()) { - // std::ofstream json_file(t_file); - // json_file << std::setw(2) << utils::timer::serialize() << std::endl; - //} } } diff --git a/apps/tests/test_lapw_xc.cpp b/apps/tests/test_lapw_xc.cpp index 1028d94ec..961027e6a 100644 --- a/apps/tests/test_lapw_xc.cpp +++ b/apps/tests/test_lapw_xc.cpp @@ -9,15 +9,14 @@ void test_lapw_xc(cmd_args const& args__) auto N = args__.value("N", 1); /* create simulation context */ - Simulation_context ctx( - "{" - " \"parameters\" : {" - " \"electronic_structure_method\" : \"full_potential_lapwlo\"" - " }," - " \"control\" : {" - " \"verification\" : 0" - " }" - "}"); + auto json_conf = R"({ + "parameters" : { + "electronic_structure_method" : "full_potential_lapwlo", + "use_symmetry" : false + } + })"_json; + + Simulation_context ctx(json_conf); int lmax{8}; ctx.lmax_apw(lmax); diff --git a/apps/tests/test_move_atom.cpp b/apps/tests/test_move_atom.cpp deleted file mode 100644 index 4c88db321..000000000 --- a/apps/tests/test_move_atom.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include - -using namespace sirius; - -void test1() -{ - Simulation_context ctx(mpi_comm_world()); - ctx.set_esm_type("full_potential_lapwlo"); - - ctx.unit_cell().add_atom_type("A", ""); - ctx.unit_cell().add_atom_type("B", ""); - - ctx.unit_cell().atom_type(0).zn(10); - ctx.unit_cell().atom_type(1).zn(20); - - ctx.initialize(); - -} - -int main(int argn, char** argv) -{ - cmd_args args; - - args.parse_args(argn, argv); - if (args.exist("help")) { - printf("Usage: %s [options]\n", argv[0]); - args.print_help(); - return 0; - } - - sirius::initialize(); - - test1(); - - sirius::finalize(); -} diff --git a/apps/tests/test_mpi_omp.cpp b/apps/tests/test_mpi_omp.cpp deleted file mode 100644 index fe71cdc0c..000000000 --- a/apps/tests/test_mpi_omp.cpp +++ /dev/null @@ -1,320 +0,0 @@ -#include -#include -#ifdef __PAPI -#include -#endif -#include "kiss_fft.h" - -using namespace sirius; - -#define NOW std::chrono::high_resolution_clock::now() - -#ifdef __PAPI -unsigned long int static thread_id(void) -{ - return omp_get_thread_num(); -} -#endif - -void kernel_fractal(int size, double_complex* in, double_complex* out) -{ - for (int i = 0; i < size; i++) - { - out[i] = double_complex(0, 0); - for (int j = 0; j < 100; j++) - { - out[i] = std::pow(out[i], 2) + in[i]; - } - } -} - -void kernel_v2(int size, double_complex* in, double_complex* out) -{ - for (int i = 0; i < size; i++) - { - out[i] = double_complex(0, 0); - } - for (int i = 0; i < size; i++) - { - for (int j = 0; j < size; j++) - { - out[(i + j) % size] = out[i] + in[(i + j) % size]; - } - } -} - -void kernel_fft(int size, double_complex* buf) -{ - int depth = int(log2(size) + 1e-10); - if (size != std::pow(2, depth)) - { - printf("wrong FFT size"); - exit(0); - } - - for (int i = 0; i < size / 2; i++) - { - int j = 0; - for (int k = 0; k < depth; k++) - { - if (i & (1 << (depth - k - 1))) j += (1 << k); - } - if (i != j) std::swap(buf[i], buf[j]); - } - - int nb = size / 2; - for (int s = 0; s < depth; s++) - { - int bs = 1 << (s + 1); - for (int ib = 0; ib < nb; ib++) - { - for (int k = 0; k < (1 << s); k++) - { - double_complex w = std::exp(-double_complex(0, twopi * k / size)); - auto z1 = buf[ib * bs + k]; - auto z2 = buf[ib * bs + k + (1<>= 1; - } -} - -void kernel_zgemm(int size, double_complex* in, double_complex* out) -{ - linalg::gemm(0, 0, size, size, size, double_complex(1, 0), in, size, in, size, double_complex(0, 0), out, size); -} - -void kernel_memcpy(int size, double_complex* in, double_complex* out) -{ - memcpy(out, in, size * sizeof(double_complex)); -} - - -template -void test_fft_1d(int size, int num_tasks, int repeat) -{ - int num_threads = omp_get_max_threads(); - - std::vector in_buf(num_threads); - std::vector out_buf(num_threads); - - int N = (kernel_id == 5) ? size * size : size; - - for (int i = 0; i < num_threads; i++) - { - in_buf[i] = (double_complex*)fftw_malloc(N * sizeof(double_complex)); - out_buf[i] = (double_complex*)fftw_malloc(N * sizeof(double_complex)); - } - - kiss_fft_cfg cfg; - if (kernel_id == 1) cfg = kiss_fft_alloc(size, false, 0, 0); - - std::vector plan(num_threads); - fftw_plan_with_nthreads(1); - if (kernel_id == 0) - { - for (int i = 0; i < num_threads; i++) - { - plan[i] = fftw_plan_dft_1d(size, (fftw_complex*)in_buf[i], (fftw_complex*)in_buf[i], - FFTW_BACKWARD, FFTW_ESTIMATE); - } - } - - int M = (kernel_id == 0 || kernel_id == 1 || kernel_id == 2) ? num_tasks : num_threads; - - mdarray A(N, M); - for (int i = 0; i < M; i++) - { - for (int j = 0; j < N; j++) A(j, i) = type_wrapper::random(); - } - - mdarray times(num_threads, repeat); - times.zero(); - mdarray counts(num_threads, repeat); - counts.zero(); - - #ifdef __PAPI - mdarray values(2, num_threads); - values.zero(); - mdarray tmp_values(2, num_threads); - - int Events[2] = {PAPI_TOT_CYC, PAPI_TOT_INS}; - int num_hwcntrs = 0; - - int retval; - /* Initialize the library */ - retval = PAPI_library_init(PAPI_VER_CURRENT); - if (retval != PAPI_VER_CURRENT && retval > 0) - { - TERMINATE("PAPI library version mismatch!\n"); - } - - if (PAPI_thread_init(thread_id) != PAPI_OK) - { - TERMINATE("PAPI_thread_init error"); - } - - /* Initialize the PAPI library and get the number of counters available */ - if ((num_hwcntrs = PAPI_num_counters()) <= PAPI_OK) - { - TERMINATE("PAPI error"); - } - printf("number of available counters: %i\n", num_hwcntrs); - - if (num_hwcntrs > 2) num_hwcntrs = 2; - - #pragma omp parallel num_threads(num_fft_workers) - { - /* Start counting events */ - if (PAPI_start_counters(Events, num_hwcntrs) != PAPI_OK) - { - TERMINATE("PAPI error"); - } - } - #endif - - auto t0 = NOW; - for (int i = 0; i < repeat; i++) - { - #pragma omp parallel - { - int tid = omp_get_thread_num(); - - #pragma omp for schedule(static) - for (int j = 0; j < num_tasks; j++) - { - if (kernel_id == 0 || kernel_id == 1 || kernel_id == 2) - { - memcpy(in_buf[tid], &A(0, j), N * sizeof(double_complex)); - } - else - { - memcpy(in_buf[tid], &A(0, tid), N * sizeof(double_complex)); - } - auto tt = NOW; - #ifdef __PAPI - PAPI_read_counters(&tmp_values(0, tid), num_hwcntrs); - #endif - if (kernel_id == 0) fftw_execute(plan[tid]); - if (kernel_id == 1) kiss_fft(cfg, (kiss_fft_cpx*)in_buf[tid], (kiss_fft_cpx*)out_buf[tid]); - if (kernel_id == 2) kernel_fft(size, in_buf[tid]); - if (kernel_id == 3) kernel_memcpy(size, in_buf[tid], out_buf[tid]); - if (kernel_id == 4) kernel_fractal(size, in_buf[tid], out_buf[tid]); - if (kernel_id == 5) kernel_zgemm(size, in_buf[tid], out_buf[tid]); - #ifdef __PAPI - PAPI_accum_counters(&values(0, tid), num_hwcntrs); - #endif - times(tid, i) += std::chrono::duration_cast< std::chrono::duration >(NOW - tt).count(); - counts(tid, i)++; - } - } - } - double tot_time = std::chrono::duration_cast< std::chrono::duration >(NOW - t0).count(); - - #ifdef __PAPI - #pragma omp parallel num_threads(num_fft_workers) - { - int tid = omp_get_thread_num(); - /* Stop counting events */ - if (PAPI_stop_counters(&tmp_values(0, tid), num_hwcntrs) != PAPI_OK) - { - TERMINATE("PAPI error"); - } - } - #endif - - double avg_thread_perf = 0; - runtime::pstdout pout(mpi_comm_world()); - pout.printf("\n"); - pout.printf("rank: %2i\n", mpi_comm_world().rank()); - pout.printf("---------\n"); - for (int tid = 0; tid < num_threads; tid++) - { - std::vector x(repeat); - double avg = 0; - double tot_time_thread = 0; - for (int i = 0; i < repeat; i++) - { - x[i] = (counts(tid, i) == 0) ? 0 : counts(tid, i) / times(tid, i); - avg += x[i]; - tot_time_thread += times(tid, i); - } - avg /= repeat; - avg_thread_perf += avg; - double variance = 0; - for (int i = 0; i < repeat; i++) variance += std::pow(x[i] - avg, 2); - variance /= repeat; - double sigma = std::sqrt(variance); - pout.printf(" tid : %i\n", tid); - pout.printf(" average performance : %.4f\n", avg); - pout.printf(" sigma : %.4f\n", sigma); - pout.printf(" coefficient of variation : %.2f%%\n", 100 * (sigma / avg)); - pout.printf(" kernel time : %.2f%%\n", 100 * tot_time_thread / tot_time); - #ifdef __PAPI - pout.printf(" total cycles : %lld\n", values(0, tid)); - pout.printf(" instructions completed : %lld\n", values(1, tid)); - pout.printf(" completed instructions / cycle : %f\n", double(values(1, tid)) / values(0, tid)); - #endif - pout.printf(" -------\n"); - } - double perf = repeat * num_tasks / tot_time; - pout.printf("---------\n"); - pout.printf("average thread performance: %.4f kernels/sec./thread\n", avg_thread_perf / num_threads); - pout.printf("MPI rank effective performance: %.4f kernels/sec./rank\n", perf); - pout.printf("---------\n"); - pout.flush(); - - mpi_comm_world().allreduce(&perf, 1); - mpi_comm_world().allreduce(&avg_thread_perf, 1); - if (mpi_comm_world().rank() == 0) - { - printf("\n"); - printf("Average MPI rank performance: %.4f kernels/sec.\n", avg_thread_perf / mpi_comm_world().size()); - printf("Aggregate effective performance: %.4f kernels/sec.\n", perf); - printf("\n"); - } - - for (int i = 0; i < num_threads; i++) - { - fftw_free(in_buf[i]); - fftw_free(out_buf[i]); - if (kernel_id == 0) fftw_destroy_plan(plan[i]); - } -} - -int main(int argn, char** argv) -{ - cmd_args args; - args.register_key("--size=", "{int} kernel size (length of FFT buffer or matrix size of a zgemm kernel("); - args.register_key("--num_tasks=", "{int} number of kernels inside one measurment"); - args.register_key("--repeat=", "{int} number of measurements"); - args.register_key("--kernel=", "{int} 0: fftw, 1: kiss_fft, 2: custom_fft, 3: memcpy, 4: fractal progression, 5: zgemm"); - - args.parse_args(argn, argv); - if (argn == 1) - { - printf("Usage: %s [options]\n", argv[0]); - args.print_help(); - exit(0); - } - - int size = args.value("size", 128); - int num_tasks = args.value("num_tasks", 64); - int repeat = args.value("repeat", 100); - int kernel_id = args.value("kernel", 0); - - sirius::initialize(1); - - if (kernel_id == 0) test_fft_1d<0>(size, num_tasks, repeat); - if (kernel_id == 1) test_fft_1d<1>(size, num_tasks, repeat); - if (kernel_id == 2) test_fft_1d<2>(size, num_tasks, repeat); - if (kernel_id == 3) test_fft_1d<3>(size, num_tasks, repeat); - if (kernel_id == 4) test_fft_1d<4>(size, num_tasks, repeat); - if (kernel_id == 5) test_fft_1d<5>(size, num_tasks, repeat); - - sirius::finalize(); -} diff --git a/apps/tests/test_pppw_xc.cpp b/apps/tests/test_pppw_xc.cpp index d21d29546..fffa5903a 100644 --- a/apps/tests/test_pppw_xc.cpp +++ b/apps/tests/test_pppw_xc.cpp @@ -1,4 +1,5 @@ #include +#include using namespace sirius; using namespace sddk; @@ -18,108 +19,34 @@ void test_davidson(cmd_args const& args__) PROFILE_START("test_davidson|setup") - /* create simulation context */ - Simulation_context ctx( - "{" - " \"parameters\" : {" - " \"electronic_structure_method\" : \"pseudopotential\"" - " }," - " \"control\" : {" - " \"verification\" : 0" - " }" - "}"); + auto json_conf = R"({ + "parameters" : { + "electronic_structure_method" : "pseudopotential", + "use_symmetry" : true + } + })"_json; + json_conf["parameters"]["xc_functionals"] = {xc_name}; + json_conf["parameters"]["pw_cutoff"] = pw_cutoff; + json_conf["parameters"]["gk_cutoff"] = gk_cutoff; + json_conf["parameters"]["num_mag_dims"] = num_mag_dims; + json_conf["control"]["mpi_grid_dims"] = mpi_grid; - /* add a new atom type to the unit cell */ - auto& atype = ctx.unit_cell().add_atom_type("Cu"); - /* set pseudo charge */ - atype.zn(11); - /* set radial grid */ - atype.set_radial_grid(radial_grid_t::lin_exp, 1000, 0.0, 100.0, 6); - /* cutoff at ~1 a.u. */ - int icut = atype.radial_grid().index_of(1.0); - double rcut = atype.radial_grid(icut); - /* create beta radial function */ - std::vector beta(icut + 1); - std::vector beta1(icut + 1); - for (int l = 0; l <= 2; l++) { - for (int i = 0; i <= icut; i++) { - double x = atype.radial_grid(i); - beta[i] = utils::confined_polynomial(x, rcut, l, l + 1, 0); - beta1[i] = utils::confined_polynomial(x, rcut, l, l + 2, 0); - } - /* add radial function for l */ - atype.add_beta_radial_function(l, beta); - atype.add_beta_radial_function(l, beta1); - } - - std::vector ps_wf(atype.radial_grid().num_points()); - for (int l = 0; l <= 2; l++) { - for (int i = 0; i < atype.radial_grid().num_points(); i++) { - double x = atype.radial_grid(i); - ps_wf[i] = std::exp(-x) * std::pow(x, l); - } - /* add radial function for l */ - atype.add_ps_atomic_wf(3, sirius::experimental::angular_momentum(l), ps_wf); - } - - /* set local part of potential */ - std::vector vloc(atype.radial_grid().num_points(), 0); - if (add_vloc) { - for (int i = 0; i < atype.radial_grid().num_points(); i++) { - double x = atype.radial_grid(i); - vloc[i] = -atype.zn() / (std::exp(-x * (x + 1)) + x); - } - } - atype.local_potential(vloc); - /* set Dion matrix */ - int nbf = atype.num_beta_radial_functions(); - matrix dion(nbf, nbf); - dion.zero(); - if (add_dion) { - for (int i = 0; i < nbf; i++) { - dion(i, i) = -10.0; - } - } - atype.d_mtrx_ion(dion); - /* set atomic density */ - std::vector arho(atype.radial_grid().num_points()); - for (int i = 0; i < atype.radial_grid().num_points(); i++) { - double x = atype.radial_grid(i); - arho[i] = 2 * atype.zn() * std::exp(-x * x) * x; - } - atype.ps_total_charge_density(arho); - - /* lattice constant */ - double a{5}; - /* set lattice vectors */ - ctx.unit_cell().set_lattice_vectors({{a * N, 0, 0}, - {0, a * N, 0}, - {0, 0, a * N}}); - /* add atoms */ double p = 1.0 / N; + std::vector> coord; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { for (int k = 0; k < N; k++) { - ctx.unit_cell().add_atom("Cu", {i * p, j * p, k * p}, {0, 0, 1}); + coord.push_back(geometry3d::vector3d(i * p, j * p, k * p)); } } } - /* initialize the context */ - ctx.verbosity(2); - ctx.pw_cutoff(pw_cutoff); - ctx.gk_cutoff(gk_cutoff); - ctx.processing_unit(args__.value("device", "CPU")); - ctx.mpi_grid_dims(mpi_grid); - ctx.gen_evp_solver_name(solver); - ctx.std_evp_solver_name(solver); - ctx.set_num_mag_dims(num_mag_dims); - ctx.add_xc_functional(xc_name); + auto sctx_ptr = sirius::create_simulation_context(json_conf, {{5.0 * N, 0, 0}, {0, 5.0 * N, 0}, {0, 0, 5.0 * N}}, + N * N * N, coord, add_vloc, add_dion); - PROFILE_STOP("test_davidson|setup") + auto& ctx = *sctx_ptr; - /* initialize simulation context */ - ctx.initialize(); + PROFILE_STOP("test_davidson|setup") Density rho(ctx); rho.initial_density(); @@ -148,10 +75,10 @@ int main(int argn, char** argv) sirius::initialize(1); test_davidson(args); - //int rank = Communicator::world().rank(); + int rank = Communicator::world().rank(); sirius::finalize(); - //if (rank == 0) { - // const auto timing_result = ::utils::global_rtgraph_timer.process(); - // std::cout<< timing_result.print(); - //} + if (rank == 0) { + const auto timing_result = ::utils::global_rtgraph_timer.process(); + std::cout<< timing_result.print(); + } } diff --git a/apps/tests/test_rank2.cpp b/apps/tests/test_rank2.cpp deleted file mode 100644 index 9995c7c99..000000000 --- a/apps/tests/test_rank2.cpp +++ /dev/null @@ -1,79 +0,0 @@ -#include - -using namespace sirius; - -void f1(int num_gvec, int lmmax, int num_atoms) -{ - mdarray alm(num_gvec, lmmax, num_atoms); - mdarray o(num_gvec, num_gvec); - alm.randomize(); - o.zero(); - - Timer t("rank2_update"); - - for (int ia = 0; ia < num_atoms; ia++) - { - for (int lm = 0; lm < lmmax; lm++) - { - #pragma omp parallel for schedule(static) - for (int ig2 = 0; ig2 < num_gvec; ig2++) - { - for (int ig1 = 0; ig1 < num_gvec; ig1++) - { - o(ig1, ig2) += conj(alm(ig1, lm, ia)) * alm(ig2, lm, ia); - } - } - } - } - double tval = t.stop(); - printf("\n"); - printf("execution time (sec) : %12.6f\n", tval); - printf("performance (GFlops) : %12.6f\n", 8e-9 * num_gvec * num_gvec * lmmax * num_atoms / tval); -} - -void f2(int num_gvec, int lmmax, int num_atoms) -{ - mdarray alm(num_gvec, lmmax, num_atoms); - mdarray o(num_gvec, num_gvec); - alm.randomize(); - o.zero(); - - Timer t("zgemm"); - - blas::gemm(0, 2, num_gvec, num_gvec, lmmax * num_atoms, alm.ptr(), alm.ld(), alm.ptr(), alm.ld(), o.ptr(), o.ld()); - - double tval = t.stop(); - printf("\n"); - printf("execution time (sec) : %12.6f\n", tval); - printf("performance (GFlops) : %12.6f\n", 8e-9 * num_gvec * num_gvec * lmmax * num_atoms / tval); -} - -int main(int argn, char** argv) -{ - cmd_args args; - args.register_key("--NG=", "{int} number of G-vectors"); - args.register_key("--NL=", "{int} number of lm components"); - args.register_key("--NA=", "{int} number of atoms"); - - args.parse_args(argn, argv); - if (argn == 1) - { - printf("Usage: %s [options]\n", argv[0]); - args.print_help(); - exit(0); - } - - Platform::initialize(1); - - int num_gvec = args.value("NG"); - int lmmax = args.value("NL"); - int num_atoms = args.value("NA"); - - f1(num_gvec, lmmax, num_atoms); - - f2(num_gvec, lmmax, num_atoms); - - Timer::print(); - - Platform::finalize(); -} diff --git a/apps/tests/test_sym.cpp b/apps/tests/test_sym.cpp index 1a65ea466..653b4d12c 100644 --- a/apps/tests/test_sym.cpp +++ b/apps/tests/test_sym.cpp @@ -1,65 +1,37 @@ #include +#include #include "symmetry/crystal_symmetry.hpp" using namespace sirius; -using namespace sddk; void test_sym(cmd_args const& args__) { auto pw_cutoff = args__.value("pw_cutoff", 10); auto gk_cutoff = args__.value("gk_cutoff", 3); - /* create simulation context */ - Simulation_context ctx( - "{" - " \"parameters\" : {" - " \"electronic_structure_method\" : \"pseudopotential\"" - " }," - " \"control\" : {" - " \"verification\" : 0" - " }" - "}"); - - /* add a new atom type to the unit cell */ - auto& atype = ctx.unit_cell().add_atom_type("Cu"); - /* set pseudo charge */ - atype.zn(11); - /* set radial grid */ - atype.set_radial_grid(radial_grid_t::lin_exp, 1000, 0.0, 100.0, 6); - - std::vector ps_wf(atype.radial_grid().num_points()); - for (int l = 2; l <= 2; l++) { - for (int i = 0; i < atype.radial_grid().num_points(); i++) { - double x = atype.radial_grid(i); - ps_wf[i] = std::exp(-x) * std::pow(x, l); - } - /* add radial function for l */ - atype.add_ps_atomic_wf(3, sirius::experimental::angular_momentum(l), ps_wf); - } + auto json_conf = R"({ + "parameters" : { + "electronic_structure_method" : "pseudopotential" + } + })"_json; + + json_conf["parameters"]["pw_cutoff"] = pw_cutoff; + json_conf["parameters"]["gk_cutoff"] = gk_cutoff; + json_conf["parameters"]["num_bands"] = 1; + //ctx.so_correction(true); - /* lattice constant */ - double a{6}; - /* set lattice vectors */ - ctx.unit_cell().set_lattice_vectors({{a, 0, 0}, - {0, a, 0}, - {0, 0, a}}); + std::vector> coord; + coord.push_back(geometry3d::vector3d({1.0/2, 1.0/2, 0})); + coord.push_back(geometry3d::vector3d({1.0/3, 1.0/3, 0})); //ctx.unit_cell().add_atom("Cu", {0.113500, 0.613500, 0.886500}); //ctx.unit_cell().add_atom("Cu", {0.613500, 0.886500, 0.113500}); //ctx.unit_cell().add_atom("Cu", {0.886500, 0.113500, 0.613500}); //ctx.unit_cell().add_atom("Cu", {0.386500, 0.386500, 0.386500}); - // - ctx.unit_cell().add_atom("Cu", {1.0/2, 1.0/2, 0}); - ctx.unit_cell().add_atom("Cu", {1.0/3, 1.0/3, 0}); - - /* initialize the context */ - ctx.verbosity(2); - ctx.pw_cutoff(pw_cutoff); - ctx.gk_cutoff(gk_cutoff); - ctx.num_bands(1); - //ctx.so_correction(true); - /* initialize simulation context */ - ctx.initialize(); + /* create simulation context */ + auto ctx_ptr = sirius::create_simulation_context(json_conf, {{6.0, 0, 0}, {0, 6.0, 0}, {0, 0, 6.0}}, 2, + coord, false, false); + Simulation_context& ctx = *ctx_ptr; vector3d k_grid(4, 4, 1); vector3d k_shift(0, 0, 0); @@ -67,13 +39,9 @@ void test_sym(cmd_args const& args__) K_point_set kset_sym(ctx, k_grid, k_shift, true); K_point_set kset_nosym(ctx, k_grid, k_shift, false); - int n{0}; std::vector atoms; - std::vector offset; for (int i = 0; i < ctx.unit_cell().num_atoms(); i++) { atoms.push_back(i); - offset.push_back(n); - n += 5; } auto idxb = [&](int iat) @@ -81,21 +49,24 @@ void test_sym(cmd_args const& args__) return &ctx.unit_cell().atom_type(iat).indexb_wfs(); }; + auto nawf = ctx.unit_cell().num_ps_atomic_wf(); + int na = ctx.unit_cell().num_atoms(); - int nwf = 5 * na; - std::vector> phi_sym; + std::vector> phi_sym; for (int ik = 0; ik < kset_sym.num_kpoints(); ik++) { - phi_sym.emplace_back(kset_sym.get(ik)->gkvec_partition(), nwf, memory_t::host); - kset_sym.get(ik)->generate_atomic_wave_functions(atoms, idxb, ctx.ps_atomic_wf_ri(), phi_sym.back()); + auto kp = kset_sym.get(ik); + phi_sym.emplace_back(kp->gkvec_sptr(), wf::num_mag_dims(0), wf::num_bands(nawf.first), sddk::memory_t::host); + kp->generate_atomic_wave_functions(atoms, idxb, ctx.ps_atomic_wf_ri(), phi_sym.back()); } - std::vector> phi_nosym; + std::vector> phi_nosym; for (int ik = 0; ik < kset_nosym.num_kpoints(); ik++) { - phi_nosym.emplace_back(kset_nosym.get(ik)->gkvec_partition(), nwf, memory_t::host); - kset_nosym.get(ik)->generate_atomic_wave_functions(atoms, idxb, ctx.ps_atomic_wf_ri(), phi_nosym.back()); + auto kp = kset_nosym.get(ik); + phi_nosym.emplace_back(kp->gkvec_sptr(), wf::num_mag_dims(0), wf::num_bands(nawf.first), sddk::memory_t::host); + kp->generate_atomic_wave_functions(atoms, idxb, ctx.ps_atomic_wf_ri(), phi_nosym.back()); } auto& sym = ctx.unit_cell().symmetry(); @@ -118,12 +89,16 @@ void test_sym(cmd_args const& args__) int ik1 = kset_nosym.find_kpoint(vk1); for (int ia = 0; ia < na; ia++) { + auto& type = ctx.unit_cell().atom(ia).type(); + /* idex of the block of d-orbitals for atom ia */ + int ib = type.indexb_wfs().offset(2) + nawf.second[ia]; for (int m1 = 0; m1 < 5; m1++) { for (int m2 = 0; m2 < 5; m2++) { for (int ig = 0; ig < kset_nosym.get(ik1)->num_gkvec(); ig++) { - double w = 1.0 / (1.0 + kset_nosym.get(ik1)->gkvec().gkvec_cart(ig).length()); - dm(m1, m2, ia) += std::conj(phi_nosym[ik1].pw_coeffs(0).prime(ig, m1 + offset[ia])) * - phi_nosym[ik1].pw_coeffs(0).prime(ig, m2 + offset[ia]) * w; + double w = 1.0 / (1.0 + kset_nosym.get(ik1)->gkvec().gkvec_cart(ig).length()); + auto z1 = phi_nosym[ik1].pw_coeffs(ig, wf::spin_index(0), wf::band_index(m1 + ib)); + auto z2 = phi_nosym[ik1].pw_coeffs(ig, wf::spin_index(0), wf::band_index(m2 + ib)); + dm(m1, m2, ia) += std::conj(z1) * z2 * w; } } } @@ -131,30 +106,35 @@ void test_sym(cmd_args const& args__) /* now rotate the coefficients from the initial k-point */ /* we know , we need to find */ - Wave_functions phi1(kset_sym.get(ik)->gkvec_partition(), nwf, memory_t::host); + wf::Wave_functions phi1(kset_sym.get(ik)->gkvec_sptr(), wf::num_mag_dims(0), + wf::num_bands(nawf.first), sddk::memory_t::host); for (int ia = 0; ia < na; ia++) { int ja = sym[isym].spg_op.sym_atom[ia]; - int i_a = ia; - int j_a = ja; - double phase = twopi * dot(kset_sym.get(ik)->vk(), ctx.unit_cell().atom(i_a).position()); + double phase = twopi * dot(kset_sym.get(ik)->vk(), ctx.unit_cell().atom(ia).position()); auto dephase_k = std::exp(double_complex(0.0, phase)); - phase = twopi * dot(kset_sym.get(ik)->vk(), ctx.unit_cell().atom(j_a).position()); + phase = twopi * dot(kset_sym.get(ik)->vk(), ctx.unit_cell().atom(ja).position()); auto phase_k = std::exp(double_complex(0.0, phase)); - std::cout << "ia : " << i_a << " -> " << j_a << std::endl; + std::cout << "ia : " << ia << " -> " << ja << std::endl; + + auto& type_i = ctx.unit_cell().atom(ia).type(); + auto& type_j = ctx.unit_cell().atom(ja).type(); + /* idex of the block of d-orbitals for atom ia and ja*/ + int ib = type_i.indexb_wfs().offset(2) + nawf.second[ia]; + int jb = type_j.indexb_wfs().offset(2) + nawf.second[ja]; for (int ig = 0; ig < kset_sym.get(ik)->num_gkvec(); ig++) { sddk::mdarray v1(5); v1.zero(); for (int m = 0; m < 5; m++) { for (int mp = 0; mp < 5; mp++) { - v1[m] += rotm[2](m, mp) * phi_sym[ik].pw_coeffs(0).prime(ig, offset[i_a] + mp); + v1[m] += rotm[2](m, mp) * phi_sym[ik].pw_coeffs(ig, wf::spin_index(0), wf::band_index(ib + mp)); } } for (int mp = 0; mp < 5; mp++) { - phi1.pw_coeffs(0).prime(ig, offset[j_a] + mp) = v1[mp] * dephase_k * std::conj(phase_k); + phi1.pw_coeffs(ig, wf::spin_index(0), wf::band_index(jb + mp)) = v1[mp] * dephase_k * std::conj(phase_k); } } } @@ -163,12 +143,16 @@ void test_sym(cmd_args const& args__) dm1.zero(); for (int ia = 0; ia < na; ia++) { + auto& type = ctx.unit_cell().atom(ia).type(); + /* idex of the block of d-orbitals for atom ia */ + int ib = type.indexb_wfs().offset(2) + nawf.second[ia]; for (int m1 = 0; m1 < 5; m1++) { for (int m2 = 0; m2 < 5; m2++) { for (int ig = 0; ig < kset_sym.get(ik)->num_gkvec(); ig++) { - double w = 1.0 / (1.0 + kset_sym.get(ik)->gkvec().gkvec_cart(ig).length()); - dm1(m1, m2, ia) += std::conj(phi1.pw_coeffs(0).prime(ig, m1 + offset[ia])) * - phi1.pw_coeffs(0).prime(ig, m2 + offset[ia]) * w; + double w = 1.0 / (1.0 + kset_sym.get(ik)->gkvec().gkvec_cart(ig).length()); + auto z1 = phi1.pw_coeffs(ig, wf::spin_index(0), wf::band_index(m1 + ib)); + auto z2 = phi1.pw_coeffs(ig, wf::spin_index(0), wf::band_index(m2 + ib)); + dm1(m1, m2, ia) += std::conj(z1) * z2 * w; } } } @@ -231,7 +215,7 @@ int main(int argn, char** argv) sirius::initialize(1); test_sym(args); - int rank = Communicator::world().rank(); + int rank = sddk::Communicator::world().rank(); sirius::finalize(); if (rank == 0) { const auto timing_result = ::utils::global_rtgraph_timer.process(); diff --git a/apps/tests/test_wf_fft.cpp b/apps/tests/test_wf_fft.cpp new file mode 100644 index 000000000..9a5b6acbb --- /dev/null +++ b/apps/tests/test_wf_fft.cpp @@ -0,0 +1,90 @@ +#include +#include "SDDK/wave_functions.hpp" +#include "mpi/mpi_grid.hpp" + +using namespace sirius; + +void test_wf_fft() +{ + //sddk::MPI_grid mpi_grid({2, 3}, sddk::Communicator::world()); + sddk::MPI_grid mpi_grid({1, 1}, sddk::Communicator::world()); + + /* creation of simple G+k vector set */ + auto gkvec = sddk::gkvec_factory(8.0, mpi_grid.communicator()); + std::cout << "num_gvec=" << gkvec->num_gvec() << std::endl; + /* creation of G+k set for FFTt */ + auto gkvec_fft = std::make_shared(*gkvec, mpi_grid.communicator(1 << 0), mpi_grid.communicator(1 << 1)); + + /* get the FFT box boundaries */ + auto fft_grid = sddk::get_min_fft_grid(8.0, gkvec->lattice_vectors()); + + std::vector num_mt_coeffs({10, 20, 30, 10, 20}); + + wf::Wave_functions wf(gkvec, num_mt_coeffs, wf::num_mag_dims(1), wf::num_bands(10), sddk::memory_t::host); + wf::Wave_functions wf_ref(gkvec, num_mt_coeffs, wf::num_mag_dims(1), wf::num_bands(10), sddk::memory_t::host); + + for (int ispn = 0; ispn < 2; ispn++) { + for (int i = 0; i < 10; i++) { + for (int ig = 0; ig < gkvec->count(); ig++) { + wf.pw_coeffs(ig, wf::spin_index(ispn), wf::band_index(i)) = + wf_ref.pw_coeffs(ig, wf::spin_index(ispn), wf::band_index(i)) = + utils::random>(); + } + } + } + auto mg = wf.memory_guard(sddk::memory_t::device, wf::copy_to::device); + + auto pu = sddk::device_t::CPU; + + auto spfft_pu = pu == sddk::device_t::CPU ? SPFFT_PU_HOST : SPFFT_PU_GPU; + auto spl_z = split_fft_z(fft_grid[2], gkvec_fft->comm_fft()); + + /* create spfft buffer for coarse transform */ + auto spfft_grid = std::unique_ptr(new spfft::Grid( + fft_grid[0], fft_grid[1], fft_grid[2], gkvec_fft->zcol_count_fft(), + spl_z.local_size(), spfft_pu, -1, gkvec_fft->comm_fft().mpi_comm(), SPFFT_EXCH_DEFAULT)); + + const auto fft_type = gkvec->reduced() ? SPFFT_TRANS_R2C : SPFFT_TRANS_C2C; + + /* create actual transform object */ + auto spfft_transform = std::make_unique(spfft_grid->create_transform( + spfft_pu, fft_type, fft_grid[0], fft_grid[1], fft_grid[2], + spl_z.local_size(), gkvec_fft->gvec_count_fft(), SPFFT_INDEX_TRIPLETS, + gkvec_fft->gvec_array().at(sddk::memory_t::host))); + + std::array, 2> wf1; + for (int ispn = 0; ispn < 2; ispn++) { + wf1[ispn] = wf::Wave_functions_fft(gkvec_fft, wf, wf::spin_index(ispn), wf::band_range(0,10), + wf::shuffle_to::fft_layout); + } + + for (int ispn = 0; ispn < 2; ispn++) { + + wf::Wave_functions_fft wf_fft(gkvec_fft, wf, wf::spin_index(ispn), wf::band_range(0,10), + wf::shuffle_to::fft_layout | wf::shuffle_to::wf_layout); + + for (int i = 0; i < wf_fft.num_wf_local(); i++) { + spfft_transform->backward(wf_fft.pw_coeffs_spfft(sddk::memory_t::host, wf::band_index(i)), spfft_pu); + spfft_transform->forward(spfft_pu, wf_fft.pw_coeffs_spfft(sddk::memory_t::host, wf::band_index(i)), SPFFT_FULL_SCALING); + } + } + + for (int ispn = 0; ispn < 2; ispn++) { + for (int i = 0; i < 10; i++) { + for (int ig = 0; ig < gkvec->count(); ig++) { + if (std::abs(wf.pw_coeffs(ig, wf::spin_index(ispn), wf::band_index(i)) - + wf_ref.pw_coeffs(ig, wf::spin_index(ispn), wf::band_index(i))) > 1e-10) { + std::cout << "Error!" << std::endl; + } + } + } + } +} + + +int main(int argn, char** argv) +{ + sirius::initialize(1); + test_wf_fft(); + sirius::finalize(); +} diff --git a/apps/tests/test_wf_inner.cpp b/apps/tests/test_wf_inner.cpp index c631e95ee..7bda51a30 100644 --- a/apps/tests/test_wf_inner.cpp +++ b/apps/tests/test_wf_inner.cpp @@ -1,75 +1,142 @@ #include -#include "utils/cmd_args.hpp" -#include "SDDK/dmatrix.hpp" -#include -using namespace sddk; +using namespace sirius; -void test(int M, int N, int BS, std::vector mpi_grid) +void test_wf_inner(std::vector mpi_grid_dims__, double cutoff__, int num_bands__, int bs__, + sddk::memory_t mem__) { - std::vector counts({85, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 17, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 29, 64, 28, 0, 0}); + spla::Context spla_ctx(sddk::is_host_memory(mem__) ? SPLA_PU_HOST : SPLA_PU_GPU); - BLACS_grid blacs_grid(Communicator::world(), mpi_grid[0], mpi_grid[1]); + std::unique_ptr blacs_grid; + if (mpi_grid_dims__[0] * mpi_grid_dims__[1] == 1) { + blacs_grid = std::unique_ptr(new sddk::BLACS_grid(sddk::Communicator::self(), 1, 1)); + } else { + blacs_grid = std::unique_ptr(new sddk::BLACS_grid(sddk::Communicator::world(), mpi_grid_dims__[0], mpi_grid_dims__[1])); + } - int rank = Communicator::world().rank(); + /* create G-vectors */ + auto gvec = gkvec_factory(cutoff__, sddk::Communicator::world()); - bool local_has_mt = counts[rank] != 0; - bool global_has_mt = false; - // Not all ranks may have mt, but all must call spla if at least one does - MPI_Allreduce(&local_has_mt, &global_has_mt, 1, MPI_C_BOOL, MPI_LOR, Communicator::world().mpi_comm()); + if (sddk::Communicator::world().rank() == 0) { + printf("number of bands : %i\n", num_bands__); + printf("total number of G-vectors: %i\n", gvec->num_gvec()); + printf("local number of G-vectors: %i\n", gvec->count()); + } - int nr{0}; - nr = std::accumulate(counts.begin(), counts.end(), nr); + wf::Wave_functions phi1(gvec, wf::num_mag_dims(3), wf::num_bands(num_bands__), sddk::memory_t::host); + wf::Wave_functions phi2(gvec, wf::num_mag_dims(3), wf::num_bands(num_bands__), sddk::memory_t::host); + + auto sr = wf::spin_range(0, 2); + + for (auto s = sr.begin(); s != sr.end(); s++) { + for (int i = 0; i < num_bands__; i++) { + for (int igloc = 0; igloc < gvec->count(); igloc++) { + int ig = igloc + gvec->offset(); + phi1.pw_coeffs(igloc, s, wf::band_index(i)) = + static_cast(i + 1) / (ig + 1); + phi2.pw_coeffs(igloc, s, wf::band_index(i)) = + static_cast(ig + 1) / (i + 1) / gvec->num_gvec(); + } + } + } - dmatrix> result(M, N, blacs_grid, BS, BS); + auto mg1 = phi1.memory_guard(mem__, wf::copy_to::device); + auto mg2 = phi2.memory_guard(mem__, wf::copy_to::device); - dmatrix, matrix_distribution_t::slab> A(nr, M, counts, Communicator::world()); - A.allocate(memory_t::device); - dmatrix, matrix_distribution_t::slab> B(nr, N, counts, Communicator::world()); - B.allocate(memory_t::device); + sddk::dmatrix> ovlp(num_bands__, num_bands__, *blacs_grid, bs__, bs__); - std::complex* result_ptr = result.size_local() ? result.at(memory_t::host, 0, 0) : nullptr; - std::shared_ptr<::spla::Context> spla_ctx{new ::spla::Context{SPLA_PU_GPU}}; - spla_ctx->set_tile_size_gpu(1688); // limit GPU memory usage to around 500MB + /* warmup call */ + wf::inner(spla_ctx, mem__, sr, phi1, wf::band_range(0, num_bands__), phi2, wf::band_range(0, num_bands__), ovlp, 0, 0); + sddk::Communicator::world().barrier(); - std::cout << "rank" << Communicator::world().rank() << " in" << std::endl; - if (local_has_mt) { - spla::pgemm_ssb( - M, N, counts[rank], SPLA_OP_CONJ_TRANSPOSE, 1.0, - A.at(memory_t::device, 0, 0), A.ld(), B.at(memory_t::device, 0, 0), B.ld(), - 1.0, result_ptr, result.ld(), 0, 0, result.spla_distribution(), *spla_ctx); - } else { - spla::pgemm_ssb( - M, N, 0, SPLA_OP_CONJ_TRANSPOSE, 1.0, - nullptr, 0, nullptr, 0, - 1.0, result_ptr, result.ld(), 0, 0, result.spla_distribution(), *spla_ctx); + double t = -utils::wtime(); + wf::inner(spla_ctx, mem__, sr, phi1, wf::band_range(0, num_bands__), phi2, wf::band_range(0, num_bands__), ovlp, 0, 0); + sddk::Communicator::world().barrier(); + t += utils::wtime(); + + double perf = sr.size() * 8e-9 * num_bands__ * num_bands__ * gvec->num_gvec() / t; + if (sddk::Communicator::world().rank() == 0) { + printf("execution time (sec) : %12.6f\n", t); + printf("performance (GFlops) : %12.6f\n", perf); + } + + double max_diff{0}; + for (int j = 0; j < ovlp.num_cols_local(); j++) { + auto jcol = ovlp.icol(j); + for (int i = 0; i < ovlp.num_rows_local(); i++) { + auto irow = ovlp.irow(i); + /* 2 is accumulated from two spins */ + double_complex z = ovlp(i, j) - 2 * static_cast(irow + 1) / (jcol + 1); + max_diff = std::max(max_diff, std::abs(z)); + } + } + sddk::Communicator::world().reduce(&max_diff, 1, 0); + if (sddk::Communicator::world().rank() == 0) { + printf("maximum difference: %18.12f\n", max_diff); + if (max_diff > 1e-10) { + printf("\x1b[31m" "Fail\n" "\x1b[0m" "\n"); + } else { + printf("\x1b[32m" "OK\n" "\x1b[0m" "\n"); + } } - std::cout << "rank" << Communicator::world().rank() << " out" << std::endl; - Communicator::world().barrier(); + + + //for (auto s = sr.begin(); s != sr.end(); s++) { + // for (int i = 0; i < num_bands__; i++) { + // for (int igloc = 0; igloc < gvec->count(); igloc++) { + // phi1.pw_coeffs(sddk::memory_t::host, igloc, s, wf::band_index(i)) = utils::random>(); + // } + // } + //} + //orthogonalize(spla_ctx, sddk::memory_t::host, sr, wf::band_range(0, 0), + // wf::band_range(0, num_bands__), phi1, phi1, ovlp, {&phi1}, phi2, true); + //wf::inner(spla_ctx, sddk::memory_t::host, sr, phi1, wf::band_range(0, num_bands__), phi1, wf::band_range(0, num_bands__), ovlp, 0, 0); + //max_diff = sddk::check_identity(ovlp, num_bands__); + //if (sddk::Communicator::world().rank() == 0) { + // printf("checking identity\n"); + // printf("maximum difference: %18.12f\n", max_diff); + // if (max_diff > 1e-10) { + // printf("\x1b[31m" "Fail\n" "\x1b[0m" "\n"); + // } else { + // printf("\x1b[32m" "OK\n" "\x1b[0m" "\n"); + // } + //} } -int main(int argn, char **argv) +int main(int argn, char** argv) { - cmd_args args(argn, argv, { - {"M=", "{int} M"}, - {"N=", "{int} N"}, - {"BS=", "{int} BS"}, - {"mpi_grid=", "{vector} 2D MPI grid"}, - {"repeat=", "{int} repeat test number of times"}}); + cmd_args args; + args.register_key("--mpi_grid_dims=", "{int int} dimensions of MPI grid"); + args.register_key("--cutoff=", "{double} wave-functions cutoff"); + args.register_key("--bs=", "{int} block size"); + args.register_key("--num_bands=", "{int} number of bands"); + args.register_key("--memory_t=", "{string} type of the memory"); + + args.parse_args(argn, argv); + if (args.exist("help")) { + printf("Usage: %s [options]\n", argv[0]); + args.print_help(); + return 0; + } + auto mpi_grid_dims = args.value("mpi_grid_dims", std::vector({1, 1})); + auto cutoff = args.value("cutoff", 8.0); + auto bs = args.value("bs", 32); + auto num_bands = args.value("num_bands", 100); + std::string memory_t_str = args.value("memory_t", "host"); + sirius::initialize(1); - int M = args.value("M", 1000); - int N = args.value("N", 1000); - int BS = args.value("BS", 256); - int repeat = args.value("repeat", 2); - auto mpi_grid = args.value("mpi_grid", std::vector({1, 1})); + test_wf_inner(mpi_grid_dims, cutoff, num_bands, bs, sddk::get_memory_t(memory_t_str)); - sirius::initialize(true); + sddk::Communicator::world().barrier(); + int my_rank = sddk::Communicator::world().rank(); - for (int i = 0; i < repeat; i++) { - test(M, N, BS, mpi_grid); - } + sirius::finalize(1); - sirius::finalize(); + if (my_rank == 0) { + const auto timing_result = ::utils::global_rtgraph_timer.process(); + std::cout << timing_result.print(); + //std::ofstream ofs("timers.json", std::ofstream::out | std::ofstream::trunc); + //ofs << timing_result.json(); + } } diff --git a/apps/tests/test_wf_inner_v2.cpp b/apps/tests/test_wf_inner_v2.cpp deleted file mode 100644 index 6937d0450..000000000 --- a/apps/tests/test_wf_inner_v2.cpp +++ /dev/null @@ -1,80 +0,0 @@ -#include - -using namespace sirius; - -void test_wf_inner(std::vector mpi_grid_dims__, - double cutoff__, - int num_bands__, - int use_gpu__, - int bs__) -{ - device_t pu = static_cast(use_gpu__); - - BLACS_grid blacs_grid(mpi_comm_world(), mpi_grid_dims__[0], mpi_grid_dims__[1]); - - matrix3d M = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}; - - /* create G-vectors */ - Gvec gvec(M, cutoff__, mpi_comm_world(), mpi_comm_world(), false); - - if (mpi_comm_world().rank() == 0) { - printf("total number of G-vectors: %i\n", gvec.num_gvec()); - printf("local number of G-vectors: %i\n", gvec.count()); - // printf("FFT grid size: %i %i %i\n", fft_box.size(0), fft_box.size(1), fft_box.size(2)); - } - - wave_functions phi(pu, gvec, num_bands__); - - phi.pw_coeffs().prime() = [](int64_t i0, int64_t i1){return type_wrapper::random();}; - - dmatrix ovlp(num_bands__, num_bands__, blacs_grid, bs__, bs__); - - inner(phi, 0, num_bands__, phi, 0, num_bands__, 0.0, ovlp, 0, 0); - mpi_comm_world().barrier(); - - - - sddk::timer t1("inner"); - inner(phi, 0, num_bands__, phi, 0, num_bands__, 0.0, ovlp, 0, 0); - mpi_comm_world().barrier(); - t1.stop(); - - //for (int j = 0; j < ovlp.num_cols_local(); j++) { - // for (int i = 0; i < ovlp.num_rows_local(); i++) { - // double_complex z = (ovlp.irow(i) == ovlp.icol(j)) ? ovlp(i, j) - 1.0 : ovlp(i, j); - // if (std::abs(z) > 1e-12) { - // TERMINATE("wrong overlap"); - // } - // } - //} -} - -int main(int argn, char** argv) -{ - cmd_args args; - args.register_key("--mpi_grid_dims=", "{int int} dimensions of MPI grid"); - args.register_key("--cutoff=", "{double} wave-functions cutoff"); - args.register_key("--bs=", "{int} block size"); - args.register_key("--num_bands=", "{int} number of bands"); - args.register_key("--use_gpu=", "{int} 0: CPU only, 1: hybrid CPU+GPU"); - - args.parse_args(argn, argv); - if (args.exist("help")) { - printf("Usage: %s [options]\n", argv[0]); - args.print_help(); - return 0; - } - auto mpi_grid_dims = args.value>("mpi_grid_dims", {1, 1}); - auto cutoff = args.value("cutoff", 8.0); - auto use_gpu = args.value("use_gpu", 0); - auto bs = args.value("bs", 32); - auto num_bands = args.value("num_bands", 100); - - sirius::initialize(1); - - test_wf_inner(mpi_grid_dims, cutoff, num_bands, use_gpu, bs); - - mpi_comm_world().barrier(); - sddk::timer::print(); - sirius::finalize(); -} diff --git a/apps/tests/test_wf_inner_v3.cpp b/apps/tests/test_wf_inner_v3.cpp deleted file mode 100644 index 3e67fb990..000000000 --- a/apps/tests/test_wf_inner_v3.cpp +++ /dev/null @@ -1,131 +0,0 @@ -#include - -using namespace sirius; -using namespace sddk; - -void test_wf_inner(std::vector mpi_grid_dims__, - double cutoff__, - int num_bands__, - int bs__, - sddk::linalg_t la__, - sddk::memory_t mem__) -{ - spla::Context spla_ctx( - la__ == sddk::linalg_t::blas || la__ == sddk::linalg_t::lapack || la__ == sddk::linalg_t::scalapack ? SPLA_PU_HOST : SPLA_PU_GPU); - - std::unique_ptr blacs_grid; - if (mpi_grid_dims__[0] * mpi_grid_dims__[1] == 1) { - blacs_grid = std::unique_ptr(new sddk::BLACS_grid(sddk::Communicator::self(), mpi_grid_dims__[0], mpi_grid_dims__[1])); - } else { - blacs_grid = std::unique_ptr(new sddk::BLACS_grid(sddk::Communicator::world(), mpi_grid_dims__[0], mpi_grid_dims__[1])); - } - - matrix3d M = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}; - - /* create G-vectors */ - sddk::Gvec gvec(M, cutoff__, Communicator::world(), false); - - sddk::Gvec_partition gvp(gvec, Communicator::world(), Communicator::self()); - - if (Communicator::world().rank() == 0) { - printf("number of bands : %i\n", num_bands__); - printf("total number of G-vectors: %i\n", gvec.num_gvec()); - printf("local number of G-vectors: %i\n", gvec.count()); - } - - int nsp{1}; - Wave_functions phi(gvp, num_bands__, memory_t::host, nsp); - - for (int is = 0; is < nsp; is++) { - phi.zero(device_t::CPU, is, 0, num_bands__); - for (int i = 0; i < num_bands__; i++) { - for (int igloc = 0; igloc < gvec.count(); igloc++) { - if (igloc + gvec.offset() == i) { - phi.pw_coeffs(is).prime(igloc, i) = 1.0; - } - } - } - } - - dmatrix ovlp(num_bands__, num_bands__, *blacs_grid, bs__, bs__); - - if (is_device_memory(mem__)) { - for (int ispn = 0; ispn < nsp; ispn++) { - phi.allocate(spin_range(ispn), memory_t::device); - phi.copy_to(spin_range(ispn), memory_t::device, 0, num_bands__); - } - ovlp.allocate(memory_t::device); - } - - /* warmup call */ - inner(spla_ctx, spin_range(0), phi, 0, num_bands__, phi, 0, num_bands__, ovlp, 0, 0); - Communicator::world().barrier(); - - double t = -utils::wtime(); - inner(spla_ctx, spin_range(0), phi, 0, num_bands__, phi, 0, num_bands__, ovlp, 0, 0); - Communicator::world().barrier(); - t += utils::wtime(); - - double perf = 8e-9 * num_bands__ * num_bands__ * gvec.num_gvec() / t; - if (Communicator::world().rank() == 0) { - printf("execution time (sec) : %12.6f\n", t); - printf("performance (GFlops) : %12.6f\n", perf); - } - - double max_diff{0}; - for (int j = 0; j < ovlp.num_cols_local(); j++) { - for (int i = 0; i < ovlp.num_rows_local(); i++) { - double_complex z = (ovlp.irow(i) == ovlp.icol(j)) ? ovlp(i, j) - 1.0 : ovlp(i, j); - max_diff = std::max(max_diff, std::abs(z)); - } - } - Communicator::world().reduce(&max_diff, 1, 0); - if (Communicator::world().rank() == 0) { - printf("maximum difference: %18.12f\n", max_diff); - if (max_diff > 1e-12) { - printf("\x1b[31m" "Fail\n" "\x1b[0m" "\n"); - } else { - printf("\x1b[32m" "OK\n" "\x1b[0m" "\n"); - } - } -} - -int main(int argn, char** argv) -{ - cmd_args args; - args.register_key("--mpi_grid_dims=", "{int int} dimensions of MPI grid"); - args.register_key("--cutoff=", "{double} wave-functions cutoff"); - args.register_key("--bs=", "{int} block size"); - args.register_key("--num_bands=", "{int} number of bands"); - args.register_key("--linalg_t=", "{string} type of the linear algebra driver"); - args.register_key("--memory_t=", "{string} type of the memory"); - - args.parse_args(argn, argv); - if (args.exist("help")) { - printf("Usage: %s [options]\n", argv[0]); - args.print_help(); - return 0; - } - auto mpi_grid_dims = args.value("mpi_grid_dims", std::vector({1, 1})); - auto cutoff = args.value("cutoff", 8.0); - auto bs = args.value("bs", 32); - auto num_bands = args.value("num_bands", 100); - std::string linalg_t_str = args.value("linalg_t", "blas"); - std::string memory_t_str = args.value("memory_t", "host"); - - sirius::initialize(1); - - test_wf_inner(mpi_grid_dims, cutoff, num_bands, bs, get_linalg_t(linalg_t_str), get_memory_t(memory_t_str)); - - Communicator::world().barrier(); - int my_rank = Communicator::world().rank(); - - sirius::finalize(1); - - if (my_rank == 0) { - const auto timing_result = ::utils::global_rtgraph_timer.process(); - std::cout << timing_result.print(); - //std::ofstream ofs("timers.json", std::ofstream::out | std::ofstream::trunc); - //ofs << timing_result.json(); - } -} diff --git a/apps/tests/test_wf_inner_v4.cpp b/apps/tests/test_wf_inner_v4.cpp deleted file mode 100644 index ee4f06c0e..000000000 --- a/apps/tests/test_wf_inner_v4.cpp +++ /dev/null @@ -1,131 +0,0 @@ -#include - -using namespace sirius; -using namespace sddk; - -void test_wf_inner(std::vector mpi_grid_dims__, - double cutoff__, - int num_bands__, - int bs__, - linalg_t la__, - memory_t mem_bra__, - memory_t mem_ket__, - memory_t mem_o__) -{ - spla::Context spla_ctx( - la__ == linalg_t::blas || la__ == linalg_t::lapack || la__ == linalg_t::scalapack ? SPLA_PU_HOST : SPLA_PU_GPU); - - std::unique_ptr blacs_grid; - if (mpi_grid_dims__[0] * mpi_grid_dims__[1] == 1) { - blacs_grid = std::unique_ptr(new BLACS_grid(Communicator::self(), mpi_grid_dims__[0], mpi_grid_dims__[1])); - } else { - blacs_grid = std::unique_ptr(new BLACS_grid(Communicator::world(), mpi_grid_dims__[0], mpi_grid_dims__[1])); - } - - matrix3d M = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}; - - /* create G-vectors */ - Gvec gvec(M, cutoff__, Communicator::world(), false); - - Gvec_partition gvp(gvec, Communicator::world(), Communicator::self()); - - if (Communicator::world().rank() == 0) { - printf("number of bands : %i\n", num_bands__); - printf("total number of G-vectors: %i\n", gvec.num_gvec()); - printf("local number of G-vectors: %i\n", gvec.count()); - } - - int nsp{1}; - Wave_functions phi(gvp, 2 * num_bands__, mem_bra__, nsp); - - for (int is = 0; is < nsp; is++) { - for (int i = 0; i < 2 * num_bands__; i++) { - for (int igloc = 0; igloc < gvec.count(); igloc++) { - phi.pw_coeffs(is).prime(igloc, i) = utils::random(); - } - } - } - - if (is_device_memory(mem_bra__)) { - for (int ispn = 0; ispn < nsp; ispn++) { - phi.allocate(spin_range(ispn), mem_bra__); - phi.copy_to(spin_range(ispn), mem_bra__, 0, 2 * num_bands__); - } - } - - Wave_functions phi1(gvp, 2 * num_bands__, mem_ket__, nsp); - if (is_device_memory(mem_ket__)) { - for (int ispn = 0; ispn < nsp; ispn++) { - phi1.allocate(spin_range(ispn), mem_ket__); - } - } - for (int ispn = 0; ispn < nsp; ispn++) { - phi1.copy_from(phi, 2 * num_bands__, ispn, 0, ispn, 0); - } - - dmatrix ovlp(2 * num_bands__, 2 * num_bands__, *blacs_grid, bs__, bs__); - - if (is_device_memory(mem_o__)) { - ovlp.allocate(mem_o__); - } - ovlp.zero(); - - inner(spla_ctx, spin_range(0), phi, 0, num_bands__, phi1, 0, num_bands__, ovlp, 0, 0); - inner(spla_ctx, spin_range(0), phi, 0, num_bands__, phi1, num_bands__, num_bands__, ovlp, 0, num_bands__); - inner(spla_ctx, spin_range(0), phi, num_bands__, num_bands__, phi1, 0, num_bands__, ovlp, num_bands__, 0); - inner(spla_ctx, spin_range(0), phi, num_bands__, num_bands__, phi1, num_bands__, num_bands__, ovlp, num_bands__, num_bands__); - - //ovlp.serialize("ovlp", 2 * num_bands__); - - auto max_diff = check_hermitian(ovlp, 2 * num_bands__); - if (Communicator::world().rank() == 0) { - printf("maximum difference: %18.12f\n", max_diff); - if (max_diff > 1e-12) { - printf("\x1b[31m" "Fail\n" "\x1b[0m" "\n"); - } else { - printf("\x1b[32m" "OK\n" "\x1b[0m" "\n"); - } - } -} - -int main(int argn, char** argv) -{ - cmd_args args; - args.register_key("--mpi_grid_dims=", "{int int} dimensions of MPI grid"); - args.register_key("--cutoff=", "{double} wave-functions cutoff"); - args.register_key("--bs=", "{int} block size"); - args.register_key("--num_bands=", "{int} number of bands"); - args.register_key("--linalg_t=", "{string} type of the linear algebra driver"); - args.register_key("--mem_bra=", "{string} memory type of the states"); - args.register_key("--mem_o=", "{string} memory type of the resulting overlap matrix"); - - args.parse_args(argn, argv); - if (args.exist("help")) { - printf("Usage: %s [options]\n", argv[0]); - args.print_help(); - return 0; - } - auto mpi_grid_dims = args.value("mpi_grid_dims", std::vector({1, 1})); - auto cutoff = args.value("cutoff", 8.0); - auto bs = args.value("bs", 32); - auto num_bands = args.value("num_bands", 100); - auto la = get_linalg_t(args.value("linalg_t", "blas")); - auto mem_bra = get_memory_t(args.value("mem_bra", "host")); - auto mem_ket = get_memory_t(args.value("mem_ket", "host")); - auto mem_o = get_memory_t(args.value("mem_o", "host")); - - sirius::initialize(1); - - test_wf_inner(mpi_grid_dims, cutoff, num_bands, bs, la, mem_bra, mem_ket, mem_o); - - Communicator::world().barrier(); - int rank = Communicator::world().rank(); - - sirius::finalize(1); - - if (rank == 0) { - const auto timing_result = ::utils::global_rtgraph_timer.process(); - std::cout << timing_result.print(); - } -} diff --git a/apps/tests/test_wf_ortho.cpp b/apps/tests/test_wf_ortho.cpp index 1c6d8d42f..38b5a9343 100644 --- a/apps/tests/test_wf_ortho.cpp +++ b/apps/tests/test_wf_ortho.cpp @@ -1,97 +1,97 @@ -#include -#include +#include using namespace sirius; +using namespace sddk; -void test_wf_ortho(std::vector mpi_grid_dims__, - double cutoff__, - int num_bands__, - int use_gpu__, - int bs__) +template +void test_wf_ortho(BLACS_grid const& blacs_grid__, double cutoff__, int num_bands__, int bs__, int num_mag_dims__, + memory_t mem__) { - device_t pu = static_cast(use_gpu__); - spla::Context spla_ctx(use_gpu__ ? SPLA_PU_GPU : SPLA_PU_HOST); + spla::Context spla_ctx(is_host_memory(mem__) ? SPLA_PU_HOST : SPLA_PU_GPU); - BLACS_grid blacs_grid(mpi_comm_world(), mpi_grid_dims__[0], mpi_grid_dims__[1]); - - matrix3d M = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}; - - /* create FFT box */ - //FFT3D_grid fft_box(find_translations(2.01 * cutoff__, M)); /* create G-vectors */ - Gvec gvec(M, cutoff__, mpi_comm_world(), mpi_comm_world(), false); + auto gvec = gkvec_factory(cutoff__, sddk::Communicator::world()); - if (mpi_comm_world().rank() == 0) { - printf("total number of G-vectors: %i\n", gvec.num_gvec()); - printf("local number of G-vectors: %i\n", gvec.gvec_count(0)); - //printf("FFT grid size: %i %i %i\n", fft_box.size(0), fft_box.size(1), fft_box.size(2)); + if (sddk::Communicator::world().rank() == 0) { + printf("number of bands : %i\n", num_bands__); + printf("num_mag_dims : %i\n", num_mag_dims__); + printf("total number of G-vectors: %i\n", gvec->num_gvec()); + printf("local number of G-vectors: %i\n", gvec->count()); } - wave_functions phi(pu, gvec, 2 * num_bands__); - wave_functions hphi(pu, gvec, 2 * num_bands__); - wave_functions ophi(pu, gvec, 2 * num_bands__); - wave_functions tmp(pu, gvec, 2 * num_bands__); - tmp.pw_coeffs().prime().zero(); - - for (int i = 0; i < 2 * num_bands__; i++) { - for (int j = 0; j < phi.pw_coeffs().num_rows_loc(); j++) { - phi.pw_coeffs().prime(j, i) = type_wrapper::random(); - hphi.pw_coeffs().prime(j, i) = phi.pw_coeffs().prime(j, i) * double(i + 1); - ophi.pw_coeffs().prime(j, i) = phi.pw_coeffs().prime(j, i); - } + int num_atoms = 31; + std::vector num_mt_coeffs(num_atoms); + for (auto& n: num_mt_coeffs) { + n = 123; } - dmatrix ovlp(2 * num_bands__, 2 * num_bands__, blacs_grid, bs__, bs__); - #ifdef SIRIUS_GPU - if (pu == GPU) { - phi.allocate_on_device(); - phi.copy_to_device(0, 2 * num_bands__); + wf::Wave_functions phi(gvec, num_mt_coeffs, wf::num_mag_dims(num_mag_dims__), wf::num_bands(2 * num_bands__), + sddk::memory_t::host); - hphi.allocate_on_device(); - hphi.copy_to_device(0, 2 * num_bands__); - - ophi.allocate_on_device(); - ophi.copy_to_device(0, 2 * num_bands__); + wf::Wave_functions tmp(gvec, num_mt_coeffs, wf::num_mag_dims(num_mag_dims__), wf::num_bands(2 * num_bands__), + sddk::memory_t::host); - tmp.allocate_on_device(); + auto sr = num_mag_dims__ == 3 ? wf::spin_range(0, 2) : wf::spin_range(0, 1); - if (mpi_comm_world().size() == 1) { - ovlp.allocate(memory_t::device); + for (auto s = sr.begin(); s != sr.end(); s++) { + for (int i = 0; i < 2 * num_bands__; i++) { + for (int igloc = 0; igloc < gvec->count(); igloc++) { + phi.pw_coeffs(igloc, s, wf::band_index(i)) = utils::random>(); + } + for (int ialoc = 0; ialoc < phi.spl_num_atoms().local_size(); ialoc++) { + int ia = phi.spl_num_atoms()[ialoc]; + for (int xi = 0; xi < num_mt_coeffs[ia]; xi++) { + phi.mt_coeffs(xi, wf::atom_index(ialoc), s, wf::band_index(i)) = utils::random>(); + } + } } } - #endif - - mpi_comm_world().barrier(); - sddk::timer t1("ortho"); - orthogonalize(spla_ctx, 0, num_bands__, phi, hphi, ophi, ovlp, tmp); - orthogonalize(spla_ctx, num_bands__, num_bands__, phi, hphi, ophi, ovlp, tmp); - mpi_comm_world().barrier(); - double tval = t1.stop(); - - int k = gvec.num_gvec(); - - // one inner product - long double flop1 = 8.0 * num_bands__ * num_bands__ * k; - // one Cholesky + one inversion, inversion cost is half-Cholesky - long double flop2 = 1.5 * (8.0 / 3) * num_bands__ * num_bands__ * num_bands__; - // three transformations - long double flop3 = 3.0 * 8.0 * num_bands__ * k * num_bands__; - - long double num_gflop = 1e-9 * (flop1 + flop3 + 2.0 * (flop1 + flop2 + flop3)); - - if (mpi_comm_world().rank() == 0) { - printf("total performance : %18.6Lf GFlop/s\n", num_gflop / tval); - printf("average MPI rank performance : %18.6Lf GFlop/s\n", num_gflop / tval / mpi_comm_world().size()); - } - inner(phi, 0, 2 * num_bands__, ophi, 0, 2 * num_bands__, ovlp, 0, 0); + auto mg1 = phi.memory_guard(mem__, wf::copy_to::device); + auto mg2 = tmp.memory_guard(mem__, wf::copy_to::none); + + dmatrix ovlp(2 * num_bands__, 2 * num_bands__, blacs_grid__, bs__, bs__); - for (int j = 0; j < ovlp.num_cols_local(); j++) { - for (int i = 0; i < ovlp.num_rows_local(); i++) { - double_complex z = (ovlp.irow(i) == ovlp.icol(j)) ? ovlp(i, j) - 1.0 : ovlp(i, j); - if (std::abs(z) > 1e-12) { - TERMINATE("wrong overlap"); + orthogonalize(spla_ctx, mem__, sr, wf::band_range(0, 0), wf::band_range(0, num_bands__), phi, phi, + {&phi}, ovlp, tmp, true); + + orthogonalize(spla_ctx, mem__, sr, wf::band_range(0, num_bands__), wf::band_range(num_bands__, 2 * num_bands__), + phi, phi, {&phi}, ovlp, tmp, true); + + wf::inner(spla_ctx, mem__, sr, phi, wf::band_range(0, 2 * num_bands__), phi, wf::band_range(0, 2 * num_bands__), + ovlp, 0, 0); + + auto max_diff = check_identity(ovlp, 2 * num_bands__); + if (Communicator::world().rank() == 0) { + printf("maximum difference: %18.12e\n", max_diff); + if (max_diff > 1e-12) { + printf("\x1b[31m" "Fail\n" "\x1b[0m" "\n"); + } else { + printf("\x1b[32m" "OK\n" "\x1b[0m" "\n"); + } + } +} + +template +void call_test(std::vector mpi_grid_dims__, double cutoff__, int num_bands__, int bs__, + int num_mag_dims__, memory_t mem__, int repeat__) +{ + std::unique_ptr blacs_grid; + if (mpi_grid_dims__[0] * mpi_grid_dims__[1] == 1) { + blacs_grid = std::unique_ptr(new BLACS_grid(Communicator::self(), 1, 1)); + } else { + blacs_grid = std::unique_ptr(new BLACS_grid(Communicator::world(), mpi_grid_dims__[0], mpi_grid_dims__[1])); + } + for (int i = 0; i < repeat__; i++) { + if (Communicator::world().rank() == 0) { + std::cout << "calling test_wf_ortho>()" << std::endl; + } + test_wf_ortho>(*blacs_grid, cutoff__, num_bands__, bs__, num_mag_dims__, mem__); + if (!std::is_same::value) { + if (Communicator::world().rank() == 0) { + std::cout << "calling test_wf_ortho>()" << std::endl; } + test_wf_ortho>(*blacs_grid, cutoff__, num_bands__, bs__, num_mag_dims__,mem__); } } } @@ -101,10 +101,11 @@ int main(int argn, char** argv) cmd_args args; args.register_key("--mpi_grid_dims=", "{int int} dimensions of MPI grid"); args.register_key("--cutoff=", "{double} wave-functions cutoff"); - args.register_key("--num_bands=", "{int} number of bands"); args.register_key("--bs=", "{int} block size"); - args.register_key("--use_gpu=", "{int} 0: CPU only, 1: hybrid CPU+GPU"); - args.register_key("--repeat=", "{int} number of repeats"); + args.register_key("--num_bands=", "{int} number of bands"); + args.register_key("--num_mag_dims=", "{int} number of magnetic dimensions"); + args.register_key("--memory_t=", "{string} type of memory"); + args.register_key("--fp32", "use FP32 arithmetics"); args.parse_args(argn, argv); if (args.exist("help")) { @@ -112,22 +113,32 @@ int main(int argn, char** argv) args.print_help(); return 0; } - auto mpi_grid_dims = args.value< std::vector >("mpi_grid_dims", {1, 1}); - auto cutoff = args.value("cutoff", 2.0); - auto num_bands = args.value("num_bands", 10); - auto use_gpu = args.value("use_gpu", 0); - auto repeat = args.value("repeat", 1); - auto bs = args.value("bs", 16); + auto mpi_grid_dims = args.value("mpi_grid_dims", std::vector({1, 1})); + auto cutoff = args.value("cutoff", 8.0); + auto bs = args.value("bs", 32); + auto num_bands = args.value("num_bands", 100); + auto num_mag_dims = args.value("num_mag_dims", 0); + auto mem = get_memory_t(args.value("memory_t", "host")); sirius::initialize(1); - if (mpi_comm_world().rank() == 0) { - printf("Running on %i x %i MPI grid\n", mpi_grid_dims[0], mpi_grid_dims[1]); + if (args.exist("fp32")) { +#if defined(USE_FP32) + call_test(mpi_grid_dims, cutoff, num_bands, bs, num_mag_dims, mem, 1); +#else + RTE_THROW("Not compiled with FP32 support"); +#endif + } else { + call_test(mpi_grid_dims, cutoff, num_bands, bs, num_mag_dims, mem, 1); } - for (int i = 0; i < repeat; i++) { - test_wf_ortho(mpi_grid_dims, cutoff, num_bands, use_gpu, bs); + + int my_rank = Communicator::world().rank(); + + sirius::finalize(1); + + if (my_rank == 0) { + const auto timing_result = ::utils::global_rtgraph_timer.process(); + std::cout << timing_result.print(); + //std::ofstream ofs("timers.json", std::ofstream::out | std::ofstream::trunc); + //ofs << timing_result.json(); } - mpi_comm_world().barrier(); - sddk::timer::print(); - //sddk::timer::print_all(); - sirius::finalize(); } diff --git a/apps/tests/test_wf_ortho_1stage.cpp b/apps/tests/test_wf_ortho_1stage.cpp deleted file mode 100644 index d933d1db4..000000000 --- a/apps/tests/test_wf_ortho_1stage.cpp +++ /dev/null @@ -1,127 +0,0 @@ -#include - -using namespace sirius; - -void test_wf_ortho(std::vector mpi_grid_dims__, - double cutoff__, - int num_bands__, - int use_gpu__, - int bs__) -{ - device_t pu = static_cast(use_gpu__); - - BLACS_grid blacs_grid(mpi_comm_world(), mpi_grid_dims__[0], mpi_grid_dims__[1]); - - matrix3d M = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}; - - /* create G-vectors */ - Gvec gvec(M, cutoff__, mpi_comm_world(), mpi_comm_world(), false); - - if (mpi_comm_world().rank() == 0) { - printf("total number of G-vectors: %i\n", gvec.num_gvec()); - printf("local number of G-vectors: %i\n", gvec.gvec_count(0)); - } - - wave_functions phi(pu, gvec, num_bands__); - wave_functions hphi(pu, gvec, num_bands__); - wave_functions ophi(pu, gvec, num_bands__); - wave_functions tmp(pu, gvec, num_bands__); - tmp.pw_coeffs().prime().zero(); - - for (int i = 0; i < num_bands__; i++) { - for (int j = 0; j < phi.pw_coeffs().num_rows_loc(); j++) { - phi.pw_coeffs().prime(j, i) = type_wrapper::random(); - hphi.pw_coeffs().prime(j, i) = phi.pw_coeffs().prime(j, i) * double(i + 1); - ophi.pw_coeffs().prime(j, i) = phi.pw_coeffs().prime(j, i); - } - } - dmatrix ovlp(num_bands__, num_bands__, blacs_grid, bs__, bs__); - - #ifdef SIRIUS_GPU - if (pu == GPU) { - phi.allocate_on_device(); - phi.copy_to_device(0, num_bands__); - - hphi.allocate_on_device(); - hphi.copy_to_device(0, num_bands__); - - ophi.allocate_on_device(); - ophi.copy_to_device(0, num_bands__); - - tmp.allocate_on_device(); - - if (mpi_comm_world().size() == 1) { - ovlp.allocate(memory_t::device); - } - } - #endif - - mpi_comm_world().barrier(); - sddk::timer t1("ortho"); - orthogonalize(0, num_bands__, phi, hphi, ophi, ovlp, tmp); - mpi_comm_world().barrier(); - double tval = t1.stop(); - - int k = gvec.num_gvec(); - - // one inner product - long double flop1 = 8.0 * num_bands__ * num_bands__ * k; - // one Cholesky + one inversion, inversion cost is half-Cholesky - long double flop2 = 1.5 * (8.0 / 3) * num_bands__ * num_bands__ * num_bands__; - // three transformations - long double flop3 = 3.0 * 8.0 * num_bands__ * k * num_bands__; - - long double num_gflop = 1e-9 * (flop1 + flop2 + flop3); - - if (mpi_comm_world().rank() == 0) { - printf("total performance : %18.6Lf GFlop/s\n", num_gflop / tval); - printf("average MPI rank performance : %18.6Lf GFlop/s\n", num_gflop / tval / mpi_comm_world().size()); - } - - inner(phi, 0, num_bands__, ophi, 0, num_bands__, ovlp, 0, 0); - - for (int j = 0; j < ovlp.num_cols_local(); j++) { - for (int i = 0; i < ovlp.num_rows_local(); i++) { - double_complex z = (ovlp.irow(i) == ovlp.icol(j)) ? ovlp(i, j) - 1.0 : ovlp(i, j); - if (std::abs(z) > 1e-12) { - TERMINATE("wrong overlap"); - } - } - } -} - -int main(int argn, char** argv) -{ - cmd_args args; - args.register_key("--mpi_grid_dims=", "{int int} dimensions of MPI grid"); - args.register_key("--cutoff=", "{double} wave-functions cutoff"); - args.register_key("--num_bands=", "{int} number of bands"); - args.register_key("--bs=", "{int} block size"); - args.register_key("--use_gpu=", "{int} 0: CPU only, 1: hybrid CPU+GPU"); - args.register_key("--repeat=", "{int} number of repeats"); - - args.parse_args(argn, argv); - if (args.exist("help")) { - printf("Usage: %s [options]\n", argv[0]); - args.print_help(); - return 0; - } - auto mpi_grid_dims = args.value< std::vector >("mpi_grid_dims", {1, 1}); - auto cutoff = args.value("cutoff", 2.0); - auto num_bands = args.value("num_bands", 10); - auto use_gpu = args.value("use_gpu", 0); - auto repeat = args.value("repeat", 1); - auto bs = args.value("bs", 16); - - sirius::initialize(1); - if (mpi_comm_world().rank() == 0) { - printf("Running on %i x %i MPI grid\n", mpi_grid_dims[0], mpi_grid_dims[1]); - } - for (int i = 0; i < repeat; i++) { - test_wf_ortho(mpi_grid_dims, cutoff, num_bands, use_gpu, bs); - } - mpi_comm_world().barrier(); - sddk::timer::print(); - //sddk::timer::print_all(); - sirius::finalize(); -} diff --git a/apps/tests/test_wf_ortho_2.cpp b/apps/tests/test_wf_ortho_2.cpp deleted file mode 100644 index 71add58b8..000000000 --- a/apps/tests/test_wf_ortho_2.cpp +++ /dev/null @@ -1,78 +0,0 @@ -#include - -using namespace sirius; - -void test_wf_ortho(std::vector mpi_grid_dims__, - double cutoff__, - int num_bands__, - int use_gpu__, - int bs__) -{ - device_t pu = static_cast(use_gpu__); - - BLACS_grid blacs_grid(mpi_comm_world(), mpi_grid_dims__[0], mpi_grid_dims__[1]); - - matrix3d M = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}; - - /* create G-vectors */ - Gvec gvec(M, cutoff__, mpi_comm_world(), mpi_comm_world(), false); - - int num_atoms = 10; - auto nmt = [](int i) { - return 20; - }; - - wave_functions phi(pu, gvec, num_atoms, nmt, 2 * num_bands__); - wave_functions hphi(pu, gvec, num_atoms, nmt, 2 * num_bands__); - wave_functions tmp(pu, gvec, num_atoms, nmt, 2 * num_bands__); - - phi.pw_coeffs().prime() = [](int64_t i0, int64_t i1){return type_wrapper::random();}; - phi.mt_coeffs().prime() = [](int64_t i0, int64_t i1){return type_wrapper::random();}; - hphi.pw_coeffs().prime() = [](int64_t i0, int64_t i1){return type_wrapper::random();}; - hphi.mt_coeffs().prime() = [](int64_t i0, int64_t i1){return type_wrapper::random();}; - - dmatrix ovlp(2 * num_bands__, 2 * num_bands__, blacs_grid, bs__, bs__); - - orthogonalize(0, num_bands__, phi, hphi, ovlp, tmp); - orthogonalize(num_bands__, num_bands__, phi, hphi, ovlp, tmp); - - inner(phi, 0, 2 * num_bands__, phi, 0, 2 * num_bands__, 0.0, ovlp, 0, 0); - - for (int j = 0; j < ovlp.num_cols_local(); j++) { - for (int i = 0; i < ovlp.num_rows_local(); i++) { - double_complex z = (ovlp.irow(i) == ovlp.icol(j)) ? ovlp(i, j) - 1.0 : ovlp(i, j); - if (std::abs(z) > 1e-12) { - TERMINATE("wrong overlap"); - } - } - } -} - -int main(int argn, char** argv) -{ - cmd_args args; - args.register_key("--mpi_grid_dims=", "{int int} dimensions of MPI grid"); - args.register_key("--cutoff=", "{double} wave-functions cutoff"); - //args.register_key("--bs=", "{int} block size"); - args.register_key("--use_gpu=", "{int} 0: CPU only, 1: hybrid CPU+GPU"); - - args.parse_args(argn, argv); - if (args.exist("help")) { - printf("Usage: %s [options]\n", argv[0]); - args.print_help(); - return 0; - } - auto mpi_grid_dims = args.value< std::vector >("mpi_grid_dims", {1, 1}); - auto cutoff = args.value("cutoff", 8.0); - auto use_gpu = args.value("use_gpu", 0); - //auto bs = args.value("bs", 16); - - sirius::initialize(1); - for (int bs = 1; bs < 16; bs++) { - for (int i = 1; i < 30; i++) { - test_wf_ortho(mpi_grid_dims, cutoff, i, use_gpu, bs); - } - } - mpi_comm_world().barrier(); - sirius::finalize(); -} diff --git a/apps/tests/test_wf_ortho_3.cpp b/apps/tests/test_wf_ortho_3.cpp deleted file mode 100644 index 8a8325650..000000000 --- a/apps/tests/test_wf_ortho_3.cpp +++ /dev/null @@ -1,103 +0,0 @@ -#include - -using namespace sirius; - -void test_wf_ortho(BLACS_grid const& blacs_grid__, - double cutoff__, - int num_bands__, - int use_gpu__, - int bs__) -{ - device_t pu = static_cast(use_gpu__); - - - matrix3d M = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}; - - /* create G-vectors */ - Gvec gvec(M, cutoff__, mpi_comm_world(), mpi_comm_world(), false); - - if (mpi_comm_world().rank() == 0) { - printf("number of G-vectors: %i\n", gvec.num_gvec()); - } - - //int num_atoms = 10; - //auto nmt = [](int i) { - // return 20; - //}; - - wave_functions phi(pu, gvec, 2 * num_bands__); - wave_functions tmp(pu, gvec, 2 * num_bands__); - - phi.pw_coeffs().prime() = [](int64_t i0, int64_t i1){return type_wrapper::random();}; - //phi.mt_coeffs().prime() = [](int64_t i0, int64_t i1){return type_wrapper::random();}; - //hphi.mt_coeffs().prime() = [](int64_t i0, int64_t i1){return type_wrapper::random();}; - - dmatrix ovlp(2 * num_bands__, 2 * num_bands__, blacs_grid__, bs__, bs__); - -#ifdef SIRIUS_GPU - if (pu == GPU) { - phi.pw_coeffs().allocate_on_device(); - tmp.pw_coeffs().allocate_on_device(); - phi.pw_coeffs().copy_to_device(0, 2 * num_bands__); - ovlp.allocate(memory_t::device); - } -#endif - - orthogonalize(0, num_bands__, phi, ovlp, tmp); - orthogonalize(num_bands__, num_bands__, phi, ovlp, tmp); - - inner(phi, 0, 2 * num_bands__, phi, 0, 2 * num_bands__, 0.0, ovlp, 0, 0); - - for (int j = 0; j < ovlp.num_cols_local(); j++) { - for (int i = 0; i < ovlp.num_rows_local(); i++) { - double_complex z = (ovlp.irow(i) == ovlp.icol(j)) ? ovlp(i, j) - 1.0 : ovlp(i, j); - if (std::abs(z) > 1e-12) { - TERMINATE("wrong overlap"); - } - } - } -} - -void call_test(std::vector mpi_grid__, - double cutoff__, - int num_bands__, - int use_gpu__, - int bs__, - int repeat__) -{ - BLACS_grid blacs_grid(mpi_comm_world(), mpi_grid__[0], mpi_grid__[1]); - for (int i = 0; i < repeat__; i++) { - test_wf_ortho(blacs_grid, cutoff__, num_bands__, use_gpu__, bs__); - } - -} - -int main(int argn, char** argv) -{ - cmd_args args; - args.register_key("--mpi_grid_dims=", "{int int} dimensions of MPI grid"); - args.register_key("--cutoff=", "{double} wave-functions cutoff"); - args.register_key("--bs=", "{int} block size"); - args.register_key("--num_bands=", "{int} block size"); - args.register_key("--use_gpu=", "{int} 0: CPU only, 1: hybrid CPU+GPU"); - args.register_key("--repeat=", "{int} number of repeats"); - - args.parse_args(argn, argv); - if (args.exist("help")) { - printf("Usage: %s [options]\n", argv[0]); - args.print_help(); - return 0; - } - auto mpi_grid_dims = args.value>("mpi_grid_dims", {1, 1}); - auto cutoff = args.value("cutoff", 8.0); - auto use_gpu = args.value("use_gpu", 0); - auto bs = args.value("bs", 32); - auto num_bands = args.value("num_bands", 100); - auto repeat = args.value("repeat", 10); - - sirius::initialize(1); - call_test(mpi_grid_dims, cutoff, num_bands, use_gpu, bs, repeat); - mpi_comm_world().barrier(); - sddk::timer::print(); - sirius::finalize(); -} diff --git a/apps/tests/test_wf_ortho_4.cpp b/apps/tests/test_wf_ortho_4.cpp deleted file mode 100644 index ca1fdc939..000000000 --- a/apps/tests/test_wf_ortho_4.cpp +++ /dev/null @@ -1,106 +0,0 @@ -#include - -using namespace sirius; - -void test_wf_ortho(BLACS_grid const& blacs_grid__, - double cutoff__, - int num_bands__, - int use_gpu__, - int bs__) -{ - device_t pu = static_cast(use_gpu__); - - - matrix3d M = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}; - - /* create G-vectors */ - Gvec gvec(M, cutoff__, mpi_comm_world(), mpi_comm_world(), false); - - if (mpi_comm_world().rank() == 0) { - printf("number of G-vectors: %i\n", gvec.num_gvec()); - } - - //int num_atoms = 10; - //auto nmt = [](int i) { - // return 20; - //}; - - Wave_functions phi(pu, gvec, 2 * num_bands__, 2); - wave_functions tmp(pu, gvec, 2 * num_bands__); - - phi.component(0).pw_coeffs().prime() = [](int64_t i0, int64_t i1){return type_wrapper::random();}; - phi.component(1).pw_coeffs().prime() = [](int64_t i0, int64_t i1){return type_wrapper::random();}; - //phi.mt_coeffs().prime() = [](int64_t i0, int64_t i1){return type_wrapper::random();}; - //hphi.mt_coeffs().prime() = [](int64_t i0, int64_t i1){return type_wrapper::random();}; - - dmatrix ovlp(2 * num_bands__, 2 * num_bands__, blacs_grid__, bs__, bs__); - -#ifdef SIRIUS_GPU - if (pu == GPU) { - for (int is = 0; is < 2; is++) { - phi.component(is).pw_coeffs().allocate_on_device(); - phi.component(is).pw_coeffs().copy_to_device(0, 2 * num_bands__); - } - tmp.pw_coeffs().allocate_on_device(); - ovlp.allocate(memory_t::device); - } -#endif - - orthogonalize(pu, 2, 0, num_bands__, phi, ovlp, tmp); - orthogonalize(pu, 2, num_bands__, num_bands__, phi, ovlp, tmp); - - inner(2, phi, 0, 2 * num_bands__, phi, 0, 2 * num_bands__, ovlp, 0, 0); - - for (int j = 0; j < ovlp.num_cols_local(); j++) { - for (int i = 0; i < ovlp.num_rows_local(); i++) { - double_complex z = (ovlp.irow(i) == ovlp.icol(j)) ? ovlp(i, j) - 1.0 : ovlp(i, j); - if (std::abs(z) > 1e-12) { - TERMINATE("wrong overlap"); - } - } - } -} - -void call_test(std::vector mpi_grid__, - double cutoff__, - int num_bands__, - int use_gpu__, - int bs__, - int repeat__) -{ - BLACS_grid blacs_grid(mpi_comm_world(), mpi_grid__[0], mpi_grid__[1]); - for (int i = 0; i < repeat__; i++) { - test_wf_ortho(blacs_grid, cutoff__, num_bands__, use_gpu__, bs__); - } - -} - -int main(int argn, char** argv) -{ - cmd_args args; - args.register_key("--mpi_grid_dims=", "{int int} dimensions of MPI grid"); - args.register_key("--cutoff=", "{double} wave-functions cutoff"); - args.register_key("--bs=", "{int} block size"); - args.register_key("--num_bands=", "{int} block size"); - args.register_key("--use_gpu=", "{int} 0: CPU only, 1: hybrid CPU+GPU"); - args.register_key("--repeat=", "{int} number of repeats"); - - args.parse_args(argn, argv); - if (args.exist("help")) { - printf("Usage: %s [options]\n", argv[0]); - args.print_help(); - return 0; - } - auto mpi_grid_dims = args.value>("mpi_grid_dims", {1, 1}); - auto cutoff = args.value("cutoff", 8.0); - auto use_gpu = args.value("use_gpu", 0); - auto bs = args.value("bs", 32); - auto num_bands = args.value("num_bands", 100); - auto repeat = args.value("repeat", 10); - - sirius::initialize(1); - call_test(mpi_grid_dims, cutoff, num_bands, use_gpu, bs, repeat); - mpi_comm_world().barrier(); - sddk::timer::print(); - sirius::finalize(); -} diff --git a/apps/tests/test_wf_ortho_5.cpp b/apps/tests/test_wf_ortho_5.cpp deleted file mode 100644 index 838d9cb96..000000000 --- a/apps/tests/test_wf_ortho_5.cpp +++ /dev/null @@ -1,219 +0,0 @@ -#include - -using namespace sirius; - -void test_wf_ortho(std::vector mpi_grid_dims__, - double cutoff__, - int num_bands__, - int use_gpu__, - int bs__) -{ - device_t pu = static_cast(use_gpu__); - - BLACS_grid blacs_grid(mpi_comm_self(), 1, 1); - - matrix3d M = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}; - - /* create FFT box */ - //FFT3D_grid fft_box(find_translations(2.01 * cutoff__, M)); - /* create G-vectors */ - Gvec gvec(M, cutoff__, mpi_comm_world(), mpi_comm_world(), false); - - if (mpi_comm_world().rank() == 0) { - printf("use_gpu: %i\n", use_gpu__); - printf("total number of G-vectors: %i\n", gvec.num_gvec()); - printf("local number of G-vectors: %i\n", gvec.gvec_count(0)); - //printf("FFT grid size: %i %i %i\n", fft_box.size(0), fft_box.size(1), fft_box.size(2)); - } - - wave_functions phi(pu, gvec, 2 * num_bands__); - wave_functions hphi(pu, gvec, 2 * num_bands__); - wave_functions ophi(pu, gvec, 2 * num_bands__); - wave_functions tmp(pu, gvec, 2 * num_bands__); - tmp.pw_coeffs().prime().zero(); - - phi.pw_coeffs().prime().zero(); - hphi.pw_coeffs().prime().zero(); - ophi.pw_coeffs().prime().zero(); - - for (int i = 0; i < 2 * num_bands__; i++) { - for (int igloc = 0; igloc < gvec.count(); igloc++) { - if (igloc + gvec.offset() == i) { - phi.pw_coeffs().prime(igloc, i) = 1.0; - hphi.pw_coeffs().prime(igloc, i) = 1.0; - ophi.pw_coeffs().prime(igloc, i) = 1.0; - } - } - - //for (int j = 0; j < phi.pw_coeffs().num_rows_loc(); j++) { - // phi.pw_coeffs().prime(j, i) = type_wrapper::random(); - // hphi.pw_coeffs().prime(j, i) = phi.pw_coeffs().prime(j, i) * double(i + 1); - // ophi.pw_coeffs().prime(j, i) = phi.pw_coeffs().prime(j, i); - //} - } - dmatrix ovlp(2 * num_bands__, 2 * num_bands__, blacs_grid, bs__, bs__); - - printf("checking phi #0\n"); - for (int i = 0; i < 2 * num_bands__; i++) { - for (int igloc = 0; igloc < gvec.count(); igloc++) { - if (igloc + gvec.offset() == i) { - if (std::abs(phi.pw_coeffs().prime(igloc, i) - 1.0) > 1e-10) { - std::cout << "wrong phi, error: " << phi.pw_coeffs().prime(igloc, i) - 1.0 << std::endl; - } - if (std::abs(ophi.pw_coeffs().prime(igloc, i) - 1.0) > 1e-10) { - std::cout << "wrong ophi, error: " << ophi.pw_coeffs().prime(igloc, i) - 1.0 << std::endl; - } - } else { - if (std::abs(phi.pw_coeffs().prime(igloc, i)) > 1e-10) { - std::cout << "wrong phi, error: " << phi.pw_coeffs().prime(igloc, i) << std::endl; - } - if (std::abs(ophi.pw_coeffs().prime(igloc, i)) > 1e-10) { - std::cout << "wrong ophi, error: " << ophi.pw_coeffs().prime(igloc, i) << std::endl; - } - } - } - } - - #ifdef SIRIUS_GPU - if (pu == GPU) { - phi.allocate_on_device(); - phi.copy_to_device(0, 2 * num_bands__); - - hphi.allocate_on_device(); - hphi.copy_to_device(0, 2 * num_bands__); - - ophi.allocate_on_device(); - ophi.copy_to_device(0, 2 * num_bands__); - - tmp.allocate_on_device(); - - if (blacs_grid.comm().size() == 1) { - ovlp.allocate(memory_t::device); - } - } - #endif - - inner(phi, 0, 2 * num_bands__, ophi, 0, 2 * num_bands__, ovlp, 0, 0); - ovlp.serialize("ovlp before", 2 * num_bands__); - - inner(phi, 0, 2 * num_bands__, ophi, 0, 2 * num_bands__, ovlp, 0, 0); - ovlp.serialize("ovlp before, #2", 2 * num_bands__); - - mpi_comm_world().barrier(); - sddk::timer t1("ortho"); - orthogonalize(0, num_bands__, phi, hphi, ophi, ovlp, tmp); - - - printf("checking phi #1\n"); - for (int i = 0; i < 2 * num_bands__; i++) { - for (int igloc = 0; igloc < gvec.count(); igloc++) { - if (igloc + gvec.offset() == i) { - if (std::abs(phi.pw_coeffs().prime(igloc, i) - 1.0) > 1e-10) { - std::cout << "wrong phi, error: " << phi.pw_coeffs().prime(igloc, i) - 1.0 << std::endl; - } - if (std::abs(ophi.pw_coeffs().prime(igloc, i) - 1.0) > 1e-10) { - std::cout << "wrong ophi, error: " << ophi.pw_coeffs().prime(igloc, i) - 1.0 << std::endl; - } - } else { - if (std::abs(phi.pw_coeffs().prime(igloc, i)) > 1e-10) { - std::cout << "wrong phi, error: " << phi.pw_coeffs().prime(igloc, i) << std::endl; - } - if (std::abs(ophi.pw_coeffs().prime(igloc, i)) > 1e-10) { - std::cout << "wrong ophi, error: " << ophi.pw_coeffs().prime(igloc, i) << std::endl; - } - } - } - } - - orthogonalize(num_bands__, num_bands__, phi, hphi, ophi, ovlp, tmp); - mpi_comm_world().barrier(); - double tval = t1.stop(); - - printf("checking phi #2\n"); - for (int i = 0; i < 2 * num_bands__; i++) { - for (int igloc = 0; igloc < gvec.count(); igloc++) { - if (igloc + gvec.offset() == i) { - if (std::abs(phi.pw_coeffs().prime(igloc, i) - 1.0) > 1e-10) { - std::cout << "wrong phi, error: " << phi.pw_coeffs().prime(igloc, i) - 1.0 << std::endl; - } - if (std::abs(ophi.pw_coeffs().prime(igloc, i) - 1.0) > 1e-10) { - std::cout << "wrong ophi, error: " << ophi.pw_coeffs().prime(igloc, i) - 1.0 << std::endl; - } - } else { - if (std::abs(phi.pw_coeffs().prime(igloc, i)) > 1e-10) { - std::cout << "wrong phi, error: " << phi.pw_coeffs().prime(igloc, i) << std::endl; - } - if (std::abs(ophi.pw_coeffs().prime(igloc, i)) > 1e-10) { - std::cout << "wrong ophi, error: " << ophi.pw_coeffs().prime(igloc, i) << std::endl; - } - } - } - } - - int k = gvec.num_gvec(); - - // one inner product - long double flop1 = 8.0 * num_bands__ * num_bands__ * k; - // one Cholesky + one inversion, inversion cost is half-Cholesky - long double flop2 = 1.5 * (8.0 / 3) * num_bands__ * num_bands__ * num_bands__; - // three transformations - long double flop3 = 3.0 * 8.0 * num_bands__ * k * num_bands__; - - long double num_gflop = 1e-9 * (flop1 + flop3 + 2.0 * (flop1 + flop2 + flop3)); - - if (mpi_comm_world().rank() == 0) { - printf("total performance : %18.6Lf GFlop/s\n", num_gflop / tval); - printf("average MPI rank performance : %18.6Lf GFlop/s\n", num_gflop / tval / mpi_comm_world().size()); - } - - inner(phi, 0, 2 * num_bands__, ophi, 0, 2 * num_bands__, ovlp, 0, 0); - - ovlp.serialize("ovlp after", 2 * num_bands__); - - for (int j = 0; j < ovlp.num_cols_local(); j++) { - for (int i = 0; i < ovlp.num_rows_local(); i++) { - double_complex z = (ovlp.irow(i) == ovlp.icol(j)) ? ovlp(i, j) - 1.0 : ovlp(i, j); - if (std::abs(z) > 1e-12) { - std::stringstream s; - s << "overlap matrix is wrong, error: " << z; - TERMINATE(s); - } - } - } -} - -int main(int argn, char** argv) -{ - cmd_args args; - args.register_key("--mpi_grid_dims=", "{int int} dimensions of MPI grid"); - args.register_key("--cutoff=", "{double} wave-functions cutoff"); - args.register_key("--num_bands=", "{int} number of bands"); - args.register_key("--bs=", "{int} block size"); - args.register_key("--use_gpu=", "{int} 0: CPU only, 1: hybrid CPU+GPU"); - args.register_key("--repeat=", "{int} number of repeats"); - - args.parse_args(argn, argv); - if (args.exist("help")) { - printf("Usage: %s [options]\n", argv[0]); - args.print_help(); - return 0; - } - auto mpi_grid_dims = args.value< std::vector >("mpi_grid_dims", {1, 1}); - auto cutoff = args.value("cutoff", 2.0); - auto num_bands = args.value("num_bands", 10); - auto use_gpu = args.value("use_gpu", 0); - auto repeat = args.value("repeat", 1); - auto bs = args.value("bs", 16); - - sirius::initialize(1); - if (mpi_comm_world().rank() == 0) { - printf("Running on %i x %i MPI grid\n", mpi_grid_dims[0], mpi_grid_dims[1]); - } - for (int i = 0; i < repeat; i++) { - test_wf_ortho(mpi_grid_dims, cutoff, num_bands, use_gpu, bs); - } - mpi_comm_world().barrier(); - sddk::timer::print(); - //sddk::timer::print_all(); - sirius::finalize(); -} diff --git a/apps/tests/test_wf_ortho_6.cpp b/apps/tests/test_wf_ortho_6.cpp deleted file mode 100644 index c7af558ae..000000000 --- a/apps/tests/test_wf_ortho_6.cpp +++ /dev/null @@ -1,160 +0,0 @@ -#include -#include "SDDK/wf_ortho.hpp" - -using namespace sirius; -using namespace sddk; - -template -void test_wf_ortho(BLACS_grid const& blacs_grid__, - double cutoff__, - int num_bands__, - int bs__, - int num_mag_dims__, - memory_t mem__, - linalg_t la__) -{ - spla::Context spla_ctx( - la__ == linalg_t::blas || la__ == linalg_t::lapack || la__ == linalg_t::scalapack ? SPLA_PU_HOST : SPLA_PU_GPU); - - int nsp = (num_mag_dims__ == 0) ? 1 : 2; - int num_spin_steps = (num_mag_dims__ == 3) ? 1 : nsp; - - matrix3d M = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}; - Gvec gvec(M, cutoff__, Communicator::world(), false); - Gvec_partition gvp(gvec, Communicator::world(), Communicator::self()); - if (Communicator::world().rank() == 0) { - printf("number of bands : %i\n", num_bands__); - printf("number of spins : %i\n", nsp); - printf("full spinors : %i\n", num_mag_dims__ == 3); - printf("total number of G-vectors: %i\n", gvec.num_gvec()); - printf("local number of G-vectors: %i\n", gvec.count()); - } - - int num_atoms = 31; - auto nmt = [](int i) { - return 123; - }; - - Wave_functions phi(gvp, num_atoms, nmt, 2 * num_bands__, mem__, nsp); - Wave_functions tmp(gvp, num_atoms, nmt, 2 * num_bands__, mem__, nsp); - - for (int is = 0; is < nsp; is++) { - phi.pw_coeffs(is).prime() = [](int64_t i0, int64_t i1){return utils::random>();}; - phi.mt_coeffs(is).prime() = [](int64_t i0, int64_t i1){return utils::random>();}; - } - - dmatrix ovlp(2 * num_bands__, 2 * num_bands__, blacs_grid__, bs__, bs__); - - if (is_device_memory(mem__)) { - ovlp.allocate(mem__); - for (int ispn = 0; ispn < nsp; ispn++) { - phi.allocate(spin_range(ispn), mem__); - phi.copy_to(spin_range(ispn), mem__, 0, 2 * num_bands__); - tmp.allocate(spin_range(ispn), mem__); - } - } - - for (int iss = 0; iss < num_spin_steps; iss++) { - orthogonalize, F>(spla_ctx, mem__, la__, spin_range(num_mag_dims__ == 3 ? 2 : iss), 0, 0, - {&phi}, 0, num_bands__, ovlp, tmp); - - inner(spla_ctx, spin_range(num_mag_dims__ == 3 ? 2 : iss), phi, 0, num_bands__, phi, 0, num_bands__, ovlp, 0, 0); - auto max_diff = check_identity(ovlp, num_bands__); - if (Communicator::world().rank() == 0) { - printf("maximum difference (first num_bands) : %18.12e\n", max_diff); - } - - orthogonalize, F>(spla_ctx, mem__, la__, spin_range(num_mag_dims__ == 3 ? 2 : iss), 0, 0, - {&phi}, num_bands__, num_bands__, ovlp, tmp); - } - - for (int iss = 0; iss < num_spin_steps; iss++) { - inner(spla_ctx, spin_range(num_mag_dims__ == 3 ? 2 : iss), phi, 0, 2 * num_bands__, phi, 0, 2 * num_bands__, ovlp, 0, 0); - auto max_diff = check_identity(ovlp, 2 * num_bands__); - if (Communicator::world().rank() == 0) { - printf("maximum difference: %18.12e\n", max_diff); - if (max_diff > 1e-12) { - printf("\x1b[31m" "Fail\n" "\x1b[0m" "\n"); - } else { - printf("\x1b[32m" "OK\n" "\x1b[0m" "\n"); - } - } - } -} - -template -void call_test(std::vector mpi_grid_dims__, - double cutoff__, - int num_bands__, - int bs__, - int num_mag_dims__, - memory_t mem__, - linalg_t la__, - int repeat__) -{ - std::unique_ptr blacs_grid; - if (mpi_grid_dims__[0] * mpi_grid_dims__[1] == 1) { - blacs_grid = std::unique_ptr(new BLACS_grid(Communicator::self(), mpi_grid_dims__[0], mpi_grid_dims__[1])); - } else { - blacs_grid = std::unique_ptr(new BLACS_grid(Communicator::world(), mpi_grid_dims__[0], mpi_grid_dims__[1])); - } - for (int i = 0; i < repeat__; i++) { - if (Communicator::world().rank() == 0) { - std::cout << "calling test_wf_ortho>()" << std::endl; - } - test_wf_ortho>(*blacs_grid, cutoff__, num_bands__, bs__, num_mag_dims__, mem__, la__); - if (Communicator::world().rank() == 0) { - std::cout << "calling test_wf_ortho>()" << std::endl; - } - test_wf_ortho>(*blacs_grid, cutoff__, num_bands__, bs__, num_mag_dims__, mem__, la__); - } -} - -int main(int argn, char** argv) -{ - cmd_args args; - args.register_key("--mpi_grid_dims=", "{int int} dimensions of MPI grid"); - args.register_key("--cutoff=", "{double} wave-functions cutoff"); - args.register_key("--bs=", "{int} block size"); - args.register_key("--num_bands=", "{int} number of bands"); - args.register_key("--num_mag_dims=", "{int} number of magnetic dimensions"); - args.register_key("--linalg_t=", "{string} type of the linear algebra driver"); - args.register_key("--memory_t=", "{string} type of memory"); - args.register_key("--fp32", "use FP32 arithmetics"); - - args.parse_args(argn, argv); - if (args.exist("help")) { - printf("Usage: %s [options]\n", argv[0]); - args.print_help(); - return 0; - } - auto mpi_grid_dims = args.value("mpi_grid_dims", std::vector({1, 1})); - auto cutoff = args.value("cutoff", 8.0); - auto bs = args.value("bs", 32); - auto num_bands = args.value("num_bands", 100); - auto num_mag_dims = args.value("num_mag_dims", 0); - auto la = get_linalg_t(args.value("linalg_t", "blas")); - auto mem = get_memory_t(args.value("memory_t", "host")); - - sirius::initialize(1); - if (args.exist("fp32")) { -#if defined(USE_FP32) - call_test(mpi_grid_dims, cutoff, num_bands, bs, num_mag_dims, mem, la, 1); -#else - RTE_THROW("Not compiled with FP32 support"); -#endif - } else { - call_test(mpi_grid_dims, cutoff, num_bands, bs, num_mag_dims, mem, la, 1); - } - - int my_rank = Communicator::world().rank(); - - sirius::finalize(1); - - if (my_rank == 0) { - const auto timing_result = ::utils::global_rtgraph_timer.process(); - std::cout << timing_result.print(); - //std::ofstream ofs("timers.json", std::ofstream::out | std::ofstream::trunc); - //ofs << timing_result.json(); - } -} diff --git a/apps/tests/test_wf_trans.cpp b/apps/tests/test_wf_trans.cpp index 0ba55e913..c6714a52b 100644 --- a/apps/tests/test_wf_trans.cpp +++ b/apps/tests/test_wf_trans.cpp @@ -1,70 +1,116 @@ #include -#include "SDDK/wf_trans.hpp" using namespace sirius; -using namespace sddk; template -void test_wf_trans(BLACS_grid const& blacs_grid__, - double cutoff__, - int num_bands__, - int bs__, - int num_mag_dims__, - memory_t mem__, - linalg_t la__) +void test_wf_trans(sddk::BLACS_grid const& blacs_grid__, double cutoff__, int num_bands__, int bs__, int num_mag_dims__, + sddk::memory_t mem__) { - spla::Context spla_ctx( - la__ == linalg_t::blas || la__ == linalg_t::lapack || la__ == linalg_t::scalapack ? SPLA_PU_HOST : SPLA_PU_GPU); + spla::Context spla_ctx(is_host_memory(mem__) ? SPLA_PU_HOST : SPLA_PU_GPU); - int nsp = (num_mag_dims__ == 0) ? 1 : 2; + /* create G-vectors */ + auto gvec = gkvec_factory(cutoff__, sddk::Communicator::world()); - matrix3d M = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}; - Gvec gvec(M, cutoff__, Communicator::world(), false); - Gvec_partition gvp(gvec, Communicator::world(), Communicator::self()); - if (Communicator::world().rank() == 0) { + if (sddk::Communicator::world().rank() == 0) { printf("number of bands : %i\n", num_bands__); - printf("number of spins : %i\n", nsp); - printf("full spinors : %i\n", num_mag_dims__ == 3); - printf("total number of G-vectors: %i\n", gvec.num_gvec()); - printf("local number of G-vectors: %i\n", gvec.count()); + printf("num_mag_dims : %i\n", num_mag_dims__); + printf("total number of G-vectors: %i\n", gvec->num_gvec()); + printf("local number of G-vectors: %i\n", gvec->count()); } int num_atoms = 31; - auto nmt = [](int i) { - return 123; - }; + std::vector num_mt_coeffs(num_atoms); + for (auto& n: num_mt_coeffs) { + n = 123; + } - Wave_functions phi(gvp, num_atoms, nmt, 2 * num_bands__, mem__, nsp); - Wave_functions tmp(gvp, num_atoms, nmt, 2 * num_bands__, mem__, nsp); + wf::Wave_functions phi(gvec, num_mt_coeffs, wf::num_mag_dims(num_mag_dims__), wf::num_bands(num_bands__), + sddk::memory_t::host); + + wf::Wave_functions psi(gvec, num_mt_coeffs, wf::num_mag_dims(num_mag_dims__), wf::num_bands(num_bands__), + sddk::memory_t::host); + + auto sr = num_mag_dims__ == 3 ? wf::spin_range(0, 2) : wf::spin_range(0); + + for (auto s = sr.begin(); s != sr.end(); s++) { + for (int i = 0; i < num_bands__; i++) { + for (int igloc = 0; igloc < gvec->count(); igloc++) { + phi.pw_coeffs(igloc, s, wf::band_index(i)) = utils::random>(); + } + for (int ialoc = 0; ialoc < phi.spl_num_atoms().local_size(); ialoc++) { + int ia = phi.spl_num_atoms()[ialoc]; + for (int xi = 0; xi < num_mt_coeffs[ia]; xi++) { + phi.mt_coeffs(xi, wf::atom_index(ialoc), s, wf::band_index(i)) = utils::random>(); + } + } + } + } - for (int is = 0; is < nsp; is++) { - phi.pw_coeffs(is).prime() = [](int64_t i0, int64_t i1){return utils::random>();}; - phi.mt_coeffs(is).prime() = [](int64_t i0, int64_t i1){return utils::random>();}; + sddk::dmatrix tmtrx(num_bands__, num_bands__, blacs_grid__, bs__, bs__); + tmtrx.zero(); + for (int i = 0; i < num_bands__; i++) { + tmtrx.set(i, num_bands__ - i - 1, 1.0); } - dmatrix tmtrx(2 * num_bands__, 2 * num_bands__, blacs_grid__, bs__, bs__); + { + auto mg1 = phi.memory_guard(mem__, wf::copy_to::device); + auto mg2 = psi.memory_guard(mem__, wf::copy_to::host); + + /* warmup call */ + for (auto s = sr.begin(); s != sr.end(); s++) { + wf::transform(spla_ctx, mem__, tmtrx, 0, 0, 1.0, phi, s, wf::band_range(0, num_bands__), 0.0, psi, s, + wf::band_range(0, num_bands__)); + } + sddk::Communicator::world().barrier(); + + double t = -utils::wtime(); + for (auto s = sr.begin(); s != sr.end(); s++) { + wf::transform(spla_ctx, mem__, tmtrx, 0, 0, 1.0, phi, s, wf::band_range(0, num_bands__), 0.0, psi, s, + wf::band_range(0, num_bands__)); + } + sddk::Communicator::world().barrier(); + t += utils::wtime(); + + double perf = 8e-9 * num_bands__ * num_bands__ * gvec->num_gvec() * sr.size() / t; + if (sddk::Communicator::world().rank() == 0) { + printf("execution time (sec) : %12.6f\n", t); + printf("performance (GFlops) : %12.6f\n", perf); + } + } - sddk::transform, F>(spla_ctx, 0, phi, 0, num_bands__, tmtrx, 0, 0, tmp, 0, num_bands__); + double diff{0}; + for (auto s = sr.begin(); s != sr.end(); s++) { + for (int i = 0; i < num_bands__; i++) { + for (int igloc = 0; igloc < gvec->count(); igloc++) { + diff += std::abs( + phi.pw_coeffs(igloc, s, wf::band_index(i)) - + psi.pw_coeffs(igloc, s, wf::band_index(num_bands__ - i - 1))); + } + for (int ialoc = 0; ialoc < phi.spl_num_atoms().local_size(); ialoc++) { + int ia = phi.spl_num_atoms()[ialoc]; + for (int xi = 0; xi < num_mt_coeffs[ia]; xi++) { + diff += std::abs( + phi.mt_coeffs(xi, wf::atom_index(ialoc), s, wf::band_index(i)) - + psi.mt_coeffs(xi, wf::atom_index(ialoc), s, wf::band_index(num_bands__ - i - 1))); + } + } + } + } + std::cout << "diff = " << diff << std::endl; } template -void call_test(std::vector mpi_grid_dims__, - double cutoff__, - int num_bands__, - int bs__, - int num_mag_dims__, - memory_t mem__, - linalg_t la__, - int repeat__) +void call_test(std::vector mpi_grid_dims__, double cutoff__, int num_bands__, int bs__, int num_mag_dims__, + sddk::memory_t mem__, int repeat__) { - std::unique_ptr blacs_grid; + std::unique_ptr blacs_grid; if (mpi_grid_dims__[0] * mpi_grid_dims__[1] == 1) { - blacs_grid = std::unique_ptr(new BLACS_grid(Communicator::self(), mpi_grid_dims__[0], mpi_grid_dims__[1])); + blacs_grid = std::make_unique(sddk::Communicator::self(), 1, 1); } else { - blacs_grid = std::unique_ptr(new BLACS_grid(Communicator::world(), mpi_grid_dims__[0], mpi_grid_dims__[1])); + blacs_grid = std::make_unique(sddk::Communicator::world(), mpi_grid_dims__[0], mpi_grid_dims__[1]); } for (int i = 0; i < repeat__; i++) { - test_wf_trans(*blacs_grid, cutoff__, num_bands__, bs__, num_mag_dims__, mem__, la__); + test_wf_trans>(*blacs_grid, cutoff__, num_bands__, bs__, num_mag_dims__, mem__); } } @@ -76,7 +122,6 @@ int main(int argn, char** argv) args.register_key("--bs=", "{int} block size"); args.register_key("--num_bands=", "{int} number of bands"); args.register_key("--num_mag_dims=", "{int} number of magnetic dimensions"); - args.register_key("--linalg_t=", "{string} type of the linear algebra driver"); args.register_key("--memory_t=", "{string} type of memory"); args.register_key("--fp32", "use FP32 arithmetics"); @@ -91,21 +136,20 @@ int main(int argn, char** argv) auto bs = args.value("bs", 32); auto num_bands = args.value("num_bands", 100); auto num_mag_dims = args.value("num_mag_dims", 0); - auto la = get_linalg_t(args.value("linalg_t", "blas")); - auto mem = get_memory_t(args.value("memory_t", "host")); + auto mem = sddk::get_memory_t(args.value("memory_t", "host")); sirius::initialize(1); if (args.exist("fp32")) { #if defined(USE_FP32) - call_test(mpi_grid_dims, cutoff, num_bands, bs, num_mag_dims, mem, la, 1); + call_test(mpi_grid_dims, cutoff, num_bands, bs, num_mag_dims, mem, 1); #else RTE_THROW("Not compiled with FP32 support"); #endif } else { - call_test(mpi_grid_dims, cutoff, num_bands, bs, num_mag_dims, mem, la, 1); + call_test(mpi_grid_dims, cutoff, num_bands, bs, num_mag_dims, mem, 1); } - int my_rank = Communicator::world().rank(); + int my_rank = sddk::Communicator::world().rank(); sirius::finalize(1); diff --git a/apps/unit_tests/CMakeLists.txt b/apps/unit_tests/CMakeLists.txt index 4648fe73f..88e84b9bf 100644 --- a/apps/unit_tests/CMakeLists.txt +++ b/apps/unit_tests/CMakeLists.txt @@ -1,7 +1,7 @@ # FILE(GLOB _tests RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "*.cpp") set(unit_tests "test_init;test_nan;test_ylm;test_rlm;test_sinx_cosx;test_gvec;test_fft_correctness_1;\ test_fft_correctness_2;test_fft_real_1;test_fft_real_2;test_fft_real_3;test_rlm_deriv;\ -test_spline;test_rot_ylm;test_linalg;test_wf_ortho;test_serialize;test_mempool;test_sim_ctx;test_roundoff;\ +test_spline;test_rot_ylm;test_linalg;test_wf_ortho_1;test_serialize;test_mempool;test_sim_ctx;test_roundoff;\ test_sht_lapl;test_sht;test_spheric_function;test_splindex;test_gaunt_coeff_1;test_gaunt_coeff_2;\ test_init_ctx;test_cmd_args;test_geom3d") @@ -15,4 +15,4 @@ endforeach() file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/unit_tests.x" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}") install(FILES "unit_tests.x" DESTINATION "${CMAKE_INSTALL_PREFIX}/bin") -add_subdirectory(multi_cg) \ No newline at end of file +add_subdirectory(multi_cg) diff --git a/apps/unit_tests/multi_cg/test_multi_cg.cpp b/apps/unit_tests/multi_cg/test_multi_cg.cpp index 4ae535f4c..0de66a8a7 100644 --- a/apps/unit_tests/multi_cg/test_multi_cg.cpp +++ b/apps/unit_tests/multi_cg/test_multi_cg.cpp @@ -20,7 +20,7 @@ struct BlockVector { vec.leftCols(num) += X.vec.leftCols(num) * D; } - void block_axpy_scatter(std::vector alphas, BlockVector const &X, std::vector ids, size_t num) { + void block_axpy_scatter(std::vector alphas, BlockVector const &X, std::vector ids, size_t num) { for (size_t i = 0; i < num; ++i) { vec.col(ids[i]) += alphas[i] * X.vec.col(i); } @@ -42,16 +42,16 @@ struct BlockVector { vec.leftCols(num) = X.vec.leftCols(num); } - void fill(double val) { - vec.fill(val); + void zero() { + vec.fill(0); } auto cols() { return vec.cols(); } - void repack(std::vector const &ids) { - for (size_t i = 0; i < ids.size(); ++i) { + void repack(std::vector const &ids) { + for (int i = 0; i < static_cast(ids.size()); ++i) { auto j = ids[i]; if (j != i) { vec.col(i) = vec.col(j); @@ -73,8 +73,8 @@ struct PosDefMatrixShifted { v.vec.leftCols(num) = alpha * A * u.vec.leftCols(num) + alpha * u.vec.leftCols(num) * shifts.head(num).asDiagonal() + beta * v.vec.leftCols(num); } - void repack(std::vector const &ids) { - for (size_t i = 0; i < ids.size(); ++i) { + void repack(std::vector const &ids) { + for (int i = 0; i < static_cast(ids.size()); ++i) { auto j = ids[i]; if (j != i) { shifts[i] = shifts[j]; @@ -87,7 +87,7 @@ struct IdentityPreconditioner { void apply(BlockVector &C, BlockVector const &B) { C = B; } - void repack(std::vector const &ids) { + void repack(std::vector const &ids) { // nothing to do; } }; @@ -152,4 +152,4 @@ int main() { std::copy(resnorms[i].begin(), resnorms[i].end(), std::ostream_iterator(std::cout << std::setprecision(16) << std::scientific, " ")); std::cout << '\n'; } -} \ No newline at end of file +} diff --git a/apps/unit_tests/multi_cg/test_multi_cg_complex.cpp b/apps/unit_tests/multi_cg/test_multi_cg_complex.cpp index 807b03be6..2eaa39c83 100644 --- a/apps/unit_tests/multi_cg/test_multi_cg_complex.cpp +++ b/apps/unit_tests/multi_cg/test_multi_cg_complex.cpp @@ -18,7 +18,7 @@ struct BlockVector { vec.leftCols(num) += X.vec.leftCols(num) * D; } - void block_axpy_scatter(std::vector> alphas, BlockVector const &X, std::vector ids, size_t num) { + void block_axpy_scatter(std::vector> alphas, BlockVector const &X, std::vector ids, size_t num) { for (size_t i = 0; i < num; ++i) { vec.col(ids[i]) += alphas[i] * X.vec.col(i); } @@ -40,16 +40,16 @@ struct BlockVector { vec.leftCols(num) = X.vec.leftCols(num); } - void fill(std::complex val) { - vec.fill(val); + void zero() { + vec.fill(0); } auto cols() { return vec.cols(); } - void repack(std::vector const &ids) { - for (size_t i = 0; i < ids.size(); ++i) { + void repack(std::vector const &ids) { + for (int i = 0; i < static_cast(ids.size()); ++i) { auto j = ids[i]; if (j != i) { vec.col(i) = vec.col(j); @@ -71,8 +71,8 @@ struct PosDefMatrixShifted { v.vec.leftCols(num) = alpha * A * u.vec.leftCols(num) + alpha * u.vec.leftCols(num) * shifts.head(num).asDiagonal() + beta * v.vec.leftCols(num); } - void repack(std::vector const &ids) { - for (size_t i = 0; i < ids.size(); ++i) { + void repack(std::vector const &ids) { + for (int i = 0; i < static_cast(ids.size()); ++i) { auto j = ids[i]; if (j != i) { shifts[i] = shifts[j]; @@ -85,7 +85,7 @@ struct IdentityPreconditioner { void apply(BlockVector &C, BlockVector const &B) { C = B; } - void repack(std::vector const &ids) { + void repack(std::vector const &ids) { // nothing to do; } }; @@ -136,4 +136,4 @@ int main() { return 2; } } -} \ No newline at end of file +} diff --git a/apps/unit_tests/multi_cg/test_multi_cg_multiprecision.cpp b/apps/unit_tests/multi_cg/test_multi_cg_multiprecision.cpp index cad8b9683..3a479c925 100644 --- a/apps/unit_tests/multi_cg/test_multi_cg_multiprecision.cpp +++ b/apps/unit_tests/multi_cg/test_multi_cg_multiprecision.cpp @@ -30,7 +30,7 @@ struct BlockVector { vec.leftCols(num) += X.vec.leftCols(num) * D; } - void block_axpy_scatter(std::vector alphas, BlockVector const &X, std::vector ids, size_t num) { + void block_axpy_scatter(std::vector alphas, BlockVector const &X, std::vector ids, size_t num) { for (size_t i = 0; i < num; ++i) { vec.col(ids[i]) += alphas[i] * X.vec.col(i); } @@ -52,16 +52,16 @@ struct BlockVector { vec.leftCols(num) = X.vec.leftCols(num); } - void fill(T val) { - vec.fill(val); + void zero() { + vec.fill(0); } auto cols() { return vec.cols(); } - void repack(std::vector const &ids) { - for (size_t i = 0; i < ids.size(); ++i) { + void repack(std::vector const &ids) { + for (int i = 0; i < static_cast(ids.size()); ++i) { auto j = ids[i]; if (j != i) { vec.col(i) = vec.col(j); @@ -98,8 +98,8 @@ struct PosDefMatrixShifted { + beta * v.vec.leftCols(num); } - void repack(std::vector const &ids) { - for (size_t i = 0; i < ids.size(); ++i) { + void repack(std::vector const &ids) { + for (int i = 0; i < static_cast(ids.size()); ++i) { auto j = ids[i]; if (j != i) @@ -113,7 +113,7 @@ struct IdentityPreconditioner { void apply(BlockVector &C, BlockVector const &B) { C = B; } - void repack(std::vector const &ids) { + void repack(std::vector const &ids) { // nothing to do; } }; @@ -165,7 +165,7 @@ int main(int argc, char ** argv) { R_hi = B_hi; A_hi.multiply(-1.0, X_hi, 1.0, R_hi, n); - E_lo.fill(0); + E_lo.zero(); R_lo = R_hi; auto iter_resnorms = sirius::cg::multi_cg( A_lo, P, @@ -188,7 +188,7 @@ int main(int argc, char ** argv) { std::cout << '\n'; // Compare to a f64-only run. - X_hi.fill(0); + X_hi.zero(); R_hi = B_hi; auto resnorms_64 = sirius::cg::multi_cg( A_hi, P, @@ -199,4 +199,4 @@ int main(int argc, char ** argv) { for (auto r : resnorms_64[0]) std::cout << r << '\n'; std::cout << '\n'; -} \ No newline at end of file +} diff --git a/apps/unit_tests/test_fft_correctness_1.cpp b/apps/unit_tests/test_fft_correctness_1.cpp index f274d2a53..3dbaf3e5a 100644 --- a/apps/unit_tests/test_fft_correctness_1.cpp +++ b/apps/unit_tests/test_fft_correctness_1.cpp @@ -25,7 +25,7 @@ int test_fft(cmd_args& args, device_t pu__) Gvec gvec(M, cutoff, Communicator::world(), false); - Gvec_partition gvp(gvec, Communicator::world(), Communicator::self()); + Gvec_fft gvp(gvec, Communicator::world(), Communicator::self()); auto spfft_pu = (pu__ == device_t::CPU) ? SPFFT_PU_HOST : SPFFT_PU_GPU; @@ -107,9 +107,9 @@ template int run_test(cmd_args& args) { int result = test_fft(args, device_t::CPU); -#ifdef SIRIUS_GPU - result += test_fft(args, device_t::GPU); -#endif + if (acc::num_devices()) { + result += test_fft(args, device_t::GPU); + } return result; } diff --git a/apps/unit_tests/test_fft_correctness_2.cpp b/apps/unit_tests/test_fft_correctness_2.cpp index 57205fd96..efd047753 100644 --- a/apps/unit_tests/test_fft_correctness_2.cpp +++ b/apps/unit_tests/test_fft_correctness_2.cpp @@ -23,7 +23,7 @@ int test_fft_complex(cmd_args& args, device_t fft_pu__) Gvec gvec(M, cutoff, Communicator::world(), false); - Gvec_partition gvp(gvec, Communicator::world(), Communicator::self()); + Gvec_fft gvp(gvec, Communicator::world(), Communicator::self()); spfft_grid_type spfft_grid(fft_grid[0], fft_grid[1], fft_grid[2], gvp.zcol_count_fft(), spl_z.local_size(), SPFFT_PU_HOST, -1, Communicator::world().mpi_comm(), SPFFT_EXCH_DEFAULT); diff --git a/apps/unit_tests/test_wf_ortho.cpp b/apps/unit_tests/test_wf_ortho.cpp deleted file mode 100644 index 3e1aaa32b..000000000 --- a/apps/unit_tests/test_wf_ortho.cpp +++ /dev/null @@ -1,94 +0,0 @@ -#include "spla/context.hpp" -#include -#include -#include "SDDK/wf_ortho.hpp" - -using namespace sirius; -using namespace sddk; - -void test_wf_ortho(std::vector mpi_grid_dims__, - double cutoff__, - int num_bands__, - int use_gpu__, - int bs__) -{ - device_t pu = static_cast(use_gpu__); - spla::Context spla_ctx(pu == device_t::GPU ? SPLA_PU_GPU : SPLA_PU_HOST); - - BLACS_grid blacs_grid(Communicator::world(), mpi_grid_dims__[0], mpi_grid_dims__[1]); - - matrix3d M = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}; - - /* create G-vectors */ - Gvec gvec(M, cutoff__, Communicator::world(), false); - Gvec_partition gvecp(gvec, Communicator::world(), Communicator::self()); - - int num_atoms = 10; - auto nmt = [](int i) { - return 20; - }; - - Wave_functions phi(gvecp, num_atoms, nmt, 2 * num_bands__, memory_t::host); - Wave_functions hphi(gvecp, num_atoms, nmt, 2 * num_bands__, memory_t::host); - Wave_functions tmp(gvecp, num_atoms, nmt, num_bands__, memory_t::host); - - phi.pw_coeffs(0).prime() = [](int64_t i0, int64_t i1){return utils::random();}; - phi.mt_coeffs(0).prime() = [](int64_t i0, int64_t i1){return utils::random();}; - hphi.pw_coeffs(0).prime() = [](int64_t i0, int64_t i1){return utils::random();}; - hphi.mt_coeffs(0).prime() = [](int64_t i0, int64_t i1){return utils::random();}; - - dmatrix ovlp(2 * num_bands__, 2 * num_bands__, blacs_grid, bs__, bs__); - - linalg_t la{linalg_t::blas}; - memory_t mem{memory_t::host}; - if (pu == device_t::GPU) { - la = linalg_t::gpublas; - mem = memory_t::device; - } - - orthogonalize(spla_ctx, mem, la, spin_range(0), phi, hphi, 0, num_bands__, ovlp, tmp); - orthogonalize(spla_ctx, mem, la, spin_range(0), phi, hphi, num_bands__, num_bands__, ovlp, tmp); - - inner(spla_ctx, spin_range(0), phi, 0, 2 * num_bands__, phi, 0, 2 * num_bands__, ovlp, 0, 0); - - for (int j = 0; j < ovlp.num_cols_local(); j++) { - for (int i = 0; i < ovlp.num_rows_local(); i++) { - double_complex z = (ovlp.irow(i) == ovlp.icol(j)) ? ovlp(i, j) - 1.0 : ovlp(i, j); - if (std::abs(z) > 1e-12) { - printf("test_wf_ortho: wrong overlap"); - exit(1); - } - } - } -} - -int main(int argn, char** argv) -{ - cmd_args args; - args.register_key("--mpi_grid_dims=", "{int int} dimensions of MPI grid"); - args.register_key("--cutoff=", "{double} wave-functions cutoff"); - //args.register_key("--bs=", "{int} block size"); - args.register_key("--use_gpu=", "{int} 0: CPU only, 1: hybrid CPU+GPU"); - - args.parse_args(argn, argv); - if (args.exist("help")) { - printf("Usage: %s [options]\n", argv[0]); - args.print_help(); - return 0; - } - auto mpi_grid_dims = args.value("mpi_grid_dims", std::vector({1, 1})); - auto cutoff = args.value("cutoff", 8.0); - auto use_gpu = args.value("use_gpu", 0); - //auto bs = args.value("bs", 16); - - sirius::initialize(1); - for (int bs = 1; bs < 16; bs++) { - for (int i = 30; i < 60; i++) { - test_wf_ortho(mpi_grid_dims, cutoff, i, use_gpu, bs); - } - } - Communicator::world().barrier(); - sirius::finalize(); - - return 0; -} diff --git a/apps/unit_tests/test_wf_ortho_1.cpp b/apps/unit_tests/test_wf_ortho_1.cpp new file mode 100644 index 000000000..297514027 --- /dev/null +++ b/apps/unit_tests/test_wf_ortho_1.cpp @@ -0,0 +1,87 @@ +#include +#include +#include +#include +#include "SDDK/wave_functions.hpp" + +using namespace sirius; + +int test_wf_ortho(std::vector mpi_grid_dims__, double cutoff__, int num_bands__, int use_gpu__, int bs__) +{ + auto pu = use_gpu__ ? sddk::device_t::GPU : sddk::device_t::CPU; + spla::Context spla_ctx(pu == sddk::device_t::GPU ? SPLA_PU_GPU : SPLA_PU_HOST); + + sddk::BLACS_grid blacs_grid(sddk::Communicator::world(), mpi_grid_dims__[0], mpi_grid_dims__[1]); + + geometry3d::matrix3d M = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}; + + /* create G-vectors */ + auto gvec = std::make_shared(M, cutoff__, sddk::Communicator::world(), false); + + int num_atoms = 100; + std::vector nmt; + for (int ia = 0; ia < num_atoms; ia++) { + nmt.push_back(ia); + } + wf::Wave_functions phi(gvec, nmt, wf::num_mag_dims(0), wf::num_bands(2 * num_bands__), sddk::memory_t::host); + wf::Wave_functions tmp(gvec, nmt, wf::num_mag_dims(0), wf::num_bands(2 * num_bands__), sddk::memory_t::host); + + sirius::randomize(phi); + + sddk::dmatrix ovlp(2 * num_bands__, 2 * num_bands__, blacs_grid, bs__, bs__); + + sddk::memory_t mem{sddk::memory_t::host}; + if (pu == sddk::device_t::GPU) { + mem = sddk::memory_t::device; + } + + wf::orthogonalize(spla_ctx, mem, wf::spin_range(0), wf::band_range(0, 0), wf::band_range(0, num_bands__), phi, phi, + {&phi}, ovlp, tmp, true); + + wf::orthogonalize(spla_ctx, mem, wf::spin_range(0), wf::band_range(0, num_bands__), + wf::band_range(num_bands__, 2 * num_bands__), phi, phi, {&phi}, ovlp, tmp, true); + + wf::inner(spla_ctx, mem, wf::spin_range(0), phi, wf::band_range(0, 2 * num_bands__), + phi, wf::band_range(0, 2 * num_bands__), ovlp, 0, 0); + + auto diff = sddk::check_identity(ovlp, 2 * num_bands__); + if (diff > 1e-12) { + printf("test_wf_ortho: wrong overlap"); + return 1; + } + return 0; +} + +int run_test(cmd_args const& args) +{ + auto mpi_grid_dims = args.value("mpi_grid_dims", std::vector({1, 1})); + auto cutoff = args.value("cutoff", 8.0); + auto use_gpu = args.value("use_gpu", 0); + + auto result{0}; + for (int bs = 1; bs < 16; bs++) { + for (int i = 30; i < 60; i++) { + result += test_wf_ortho(mpi_grid_dims, cutoff, i, use_gpu, bs); + } + } + return result; +} + +int main(int argn, char** argv) +{ + cmd_args args; + args.register_key("--mpi_grid_dims=", "{int int} dimensions of MPI grid"); + args.register_key("--cutoff=", "{double} wave-functions cutoff"); + args.register_key("--use_gpu=", "{int} 0: CPU only, 1: hybrid CPU+GPU"); + + args.parse_args(argn, argv); + if (args.exist("help")) { + printf("Usage: %s [options]\n", argv[0]); + args.print_help(); + return 0; + } + sirius::initialize(1); + int result = sirius::call_test(argv[0], run_test, args); + sirius::finalize(); + return result; +} diff --git a/apps/unit_tests/unit_tests.x b/apps/unit_tests/unit_tests.x index 3ac5543c5..d426733c2 100755 --- a/apps/unit_tests/unit_tests.x +++ b/apps/unit_tests/unit_tests.x @@ -2,7 +2,7 @@ tests='test_init test_nan test_ylm test_rlm test_rlm_deriv test_sinx_cosx test_gvec test_fft_correctness_1 test_fft_correctness_2 test_fft_real_1 test_fft_real_2 test_fft_real_3 test_spline -test_rot_ylm test_linalg test_wf_ortho test_serialize test_mempool test_roundoff +test_rot_ylm test_linalg test_wf_ortho_1 test_serialize test_mempool test_roundoff test_sht_lapl test_sht test_spheric_function test_splindex test_gaunt_coeff_1 test_gaunt_coeff_2 test_init_ctx test_cmd_args test_geom3d' diff --git a/ci/dockerfiles/Dockerfile b/ci/dockerfiles/Dockerfile index 58d200ce1..c54164274 100644 --- a/ci/dockerfiles/Dockerfile +++ b/ci/dockerfiles/Dockerfile @@ -39,7 +39,7 @@ RUN yq -i '.compilers[0].compiler.paths.f77 = "/usr/bin/gfortran"' /root/.spack/ # create GCC build env. RUN /spack/bin/spack env create --with-view /sirius-install gcc-build-env -ENV SPEC_GCC="sirius@develop %gcc build_type=Release +scalapack +vdwxc +fortran +tests +nlcglib +elpa +cuda cuda_arch=60 ^openblas ^mpich@3.3.2 ^nlcglib +cuda +wrapper cuda_arch=60 ^kokkos +wrapper cuda_arch=60 ^spfft+single_precision target=x86_64" +ENV SPEC_GCC="sirius@develop %gcc build_type=Release +scalapack +vdwxc +fortran +tests +nlcglib +elpa +magma +cuda cuda_arch=60 ^openblas ^mpich@3.3.2 ^nlcglib +cuda +wrapper cuda_arch=60 ^kokkos +wrapper cuda_arch=60 ^spfft+single_precision ^magma+cuda cuda_arch=60 target=x86_64" RUN /spack/bin/spack -e gcc-build-env spec $SPEC_GCC diff --git a/doc/doxygen.cfg b/doc/doxygen.cfg index 10c58a186..dac31d41e 100644 --- a/doc/doxygen.cfg +++ b/doc/doxygen.cfg @@ -39,7 +39,7 @@ PROJECT_NAME = "SIRIUS" # control system is used. -PROJECT_NUMBER = "7.3.1" +PROJECT_NUMBER = "7.4.0" # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8f9ba61da..e8716047e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -20,7 +20,6 @@ set(_SOURSES "band/solve.cpp" "band/diag_pseudo_potential.cpp" "band/diag_full_potential.cpp" - "band/residuals.cpp" "density/density.cpp" "density/augmentation_operator.cpp" "density/occupation_matrix.cpp" @@ -46,12 +45,10 @@ set(_SOURSES "symmetry/crystal_symmetry.cpp" "geometry/force.cpp" "geometry/stress.cpp" - "geometry/non_local_functor.cpp" "k_point/generate_fv_states.cpp" "k_point/generate_spinor_wave_functions.cpp" "k_point/k_point.cpp" "k_point/k_point_set.cpp" - "k_point/test_fv_states.cpp" "function3d/field4d.cpp" "radial/radial_integrals.cpp" "specfunc/sbessel.cpp" @@ -59,13 +56,10 @@ set(_SOURSES "utils/utils.cpp" "utils/rt_graph.cpp" "utils/profiler.cpp" - "SDDK/wf_inner.cpp" - "SDDK/wf_ortho.cpp" - "SDDK/wave_functions.cpp" "mpi/communicator.cpp" "SDDK/dmatrix.cpp" "SDDK/gvec.cpp" - "SDDK/matrix_storage.cpp" + "SDDK/memory.cpp" "gpu/acc.cpp" "gpu/acc_blas.cpp" "gpu/cusolver.cpp" diff --git a/src/SDDK/dmatrix.hpp b/src/SDDK/dmatrix.hpp index c4d13672a..aece93267 100644 --- a/src/SDDK/dmatrix.hpp +++ b/src/SDDK/dmatrix.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2013-2017 Anton Kozhevnikov, Thomas Schulthess +// Copyright (c) 2013-2022 Anton Kozhevnikov, Thomas Schulthess // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are permitted provided that @@ -48,7 +48,7 @@ std::ostream& operator<<(std::ostream& out, std::complex z) /// Distributed matrix. template -class dmatrix : public matrix +class dmatrix: public matrix { private: /// Global number of matrix rows. @@ -216,6 +216,39 @@ class dmatrix : public matrix // } //} + using matrix::copy_to; + + void copy_to(sddk::memory_t mem__, int ir0__, int ic0__, int nr__, int nc__) + { + int m0, m1, n0, n1; + if (blacs_grid_ != nullptr) { + splindex spl_r0(ir0__, blacs_grid().num_ranks_row(), blacs_grid().rank_row(), bs_row_); + splindex spl_r1(ir0__ + nr__, blacs_grid().num_ranks_row(), blacs_grid().rank_row(), bs_row_); + + splindex spl_c0(ic0__, blacs_grid().num_ranks_col(), blacs_grid().rank_col(), bs_col_); + splindex spl_c1(ic0__ + nc__, blacs_grid().num_ranks_col(), blacs_grid().rank_col(), bs_col_); + + m0 = spl_r0.local_size(); + m1 = spl_r1.local_size(); + n0 = spl_c0.local_size(); + n1 = spl_c1.local_size(); + } else { + m0 = ir0__; + m1 = ir0__ + nr__; + n0 = ic0__; + n1 = ic0__ + nc__; + } + + if (is_host_memory(mem__)) { + acc::copyout(this->at(sddk::memory_t::host, m0, n0), this->ld(), + this->at(sddk::memory_t::device, m0, n0), this->ld(), m1 - m0, n1 - n0); + } + if (is_device_memory(mem__)) { + acc::copyin(this->at(sddk::memory_t::device, m0, n0), this->ld(), + this->at(sddk::memory_t::host, m0, n0), this->ld(), m1 - m0, n1 - n0); + } + } + void set(int ir0__, int jc0__, int mr__, int nc__, T* ptr__, int ld__); void set(const int irow_glob, const int icol_glob, T val); @@ -396,52 +429,6 @@ class dmatrix : public matrix }; -/// Distributed matrix. -template -class dmatrix : public matrix -{ - private: - int num_rows_; - int num_cols_; - splindex spl_row_; - Communicator comm_; - costa::grid_layout grid_layout_; - public: - dmatrix(int num_rows__, int num_cols__, std::vector counts__, Communicator const& comm__) - : matrix(counts__[comm__.rank()], num_cols__) - , num_rows_(num_rows__) - , num_cols_(num_cols__) - , comm_(comm__) - { - spl_row_ = splindex(num_rows__, comm_.size(), comm_.rank(), counts__); - - std::vector rowsplit(comm_.size() + 1); - rowsplit[0] = 0; - for (int i = 0; i < comm_.size(); i++) { - rowsplit[i + 1] = rowsplit[i] + spl_row_.local_size(i); - } - std::vector colsplit({0, num_cols_}); - std::vector owners(comm_.size()); - for (int i = 0; i < comm_.size(); i++) { - owners[i] = i; - } - costa::block_t localblock; - localblock.data = this->at(memory_t::host); - localblock.ld = this->ld(); - localblock.row = comm_.rank(); - localblock.col = 0; - - grid_layout_ = costa::custom_layout(comm_.size(), 1, rowsplit.data(), colsplit.data(), - owners.data(), 1, &localblock, 'C'); - } - - costa::grid_layout& grid_layout() - { - return grid_layout_; - } - -}; - } // namespace sddk #endif // __DMATRIX_HPP__ diff --git a/src/SDDK/fft.hpp b/src/SDDK/fft.hpp index 6659160fc..f59bb62db 100644 --- a/src/SDDK/fft.hpp +++ b/src/SDDK/fft.hpp @@ -223,13 +223,12 @@ inline size_t spfft_grid_size_local(T const& spfft__) return spfft__.local_slice_size(); } - -inline sddk::splindex split_fft_z(int size_z__, sddk::Communicator const& comm_fft__) +inline auto split_fft_z(int size_z__, sddk::Communicator const& comm_fft__) { return sddk::splindex(size_z__, comm_fft__.size(), comm_fft__.rank()); } -#endif // __FFT3D_H__ +#endif // __FFT_HPP__ /** \page ft_pw Fourier transform and plane wave normalization * diff --git a/src/SDDK/fft3d_grid.hpp b/src/SDDK/fft3d_grid.hpp index e106586ee..237c384e8 100644 --- a/src/SDDK/fft3d_grid.hpp +++ b/src/SDDK/fft3d_grid.hpp @@ -24,6 +24,7 @@ #include #include +#include "geometry3d.hpp" #ifndef __FFT3D_GRID_HPP__ #define __FFT3D_GRID_HPP__ @@ -154,6 +155,11 @@ class FFT3D_grid : public std::array } }; +inline FFT3D_grid get_min_fft_grid(double cutoff__, geometry3d::matrix3d M__) +{ + return FFT3D_grid(find_translations(cutoff__, M__) + geometry3d::vector3d({2, 2, 2})); +} + } // namespace sddk #endif // __FFT3D_GRID_HPP__ diff --git a/src/SDDK/gvec.cpp b/src/SDDK/gvec.cpp index b26f3289f..a1f18ffe4 100644 --- a/src/SDDK/gvec.cpp +++ b/src/SDDK/gvec.cpp @@ -35,8 +35,8 @@ vector3d sddk::Gvec::gvec_by_full_index(uint32_t idx__) const uint32_t j = idx__ & 0xFFF; /* index of z-column: last 20 bits */ uint32_t i = idx__ >> 12; - assert(i < (uint32_t)z_columns_.size()); - assert(j < (uint32_t)z_columns_[i].z.size()); + RTE_ASSERT(i < (uint32_t)z_columns_.size()); + RTE_ASSERT(j < (uint32_t)z_columns_[i].z.size()); int x = z_columns_[i].x; int y = z_columns_[i].y; int z = z_columns_[i].z[j]; @@ -539,7 +539,7 @@ int Gvec::index_by_gvec(vector3d const& G__) const int offs = (z0 >= 0) ? z0 : z0 + col_size; /* full index */ int ig = ig0 + offs; - assert(ig >= 0 && ig < num_gvec()); + RTE_ASSERT(ig >= 0 && ig < num_gvec()); return ig; } @@ -561,27 +561,28 @@ Gvec send_recv(Communicator const& comm__, Gvec const& gv_src__, int source__, i return gv; } -void Gvec_partition::build_fft_distr() +void Gvec_fft::build_fft_distr() { /* calculate distribution of G-vectors and z-columns for the FFT communicator */ - gvec_distr_fft_ = block_data_descriptor(fft_comm().size()); - zcol_distr_fft_ = block_data_descriptor(fft_comm().size()); + gvec_distr_fft_ = block_data_descriptor(comm_fft().size()); - for (int rank = 0; rank < fft_comm().size(); rank++) { + for (int rank = 0; rank < comm_fft().size(); rank++) { for (int i = 0; i < comm_ortho_fft().size(); i++) { /* fine-grained rank */ int r = rank_map_(rank, i); gvec_distr_fft_.counts[rank] += gvec().gvec_count(r); - zcol_distr_fft_.counts[rank] += gvec().zcol_count(r); } } - /* get offsets of z-columns */ - zcol_distr_fft_.calc_offsets(); + for (int i = 0; i < comm_ortho_fft().size(); i++) { + /* fine-grained rank */ + int r = rank_map_(comm_fft().rank(), i); + num_zcol_local_ += gvec().zcol_count(r); + } /* get offsets of G-vectors */ gvec_distr_fft_.calc_offsets(); } -void Gvec_partition::pile_gvec() +void Gvec_fft::pile_gvec() { /* build a table of {offset, count} values for G-vectors in the swapped distribution; * we are preparing to swap plane-wave coefficients from a default slab distribution to a FFT-friendly @@ -598,21 +599,21 @@ void Gvec_partition::pile_gvec() * between columns of the 2D MPI grid */ gvec_fft_slab_ = block_data_descriptor(comm_ortho_fft_.size()); for (int i = 0; i < comm_ortho_fft_.size(); i++) { - gvec_fft_slab_.counts[i] = gvec().gvec_count(rank_map_(fft_comm_.rank(), i)); + gvec_fft_slab_.counts[i] = gvec().gvec_count(rank_map_(comm_fft_.rank(), i)); } gvec_fft_slab_.calc_offsets(); - RTE_ASSERT(gvec_fft_slab_.offsets.back() + gvec_fft_slab_.counts.back() == gvec_distr_fft_.counts[fft_comm().rank()]); + RTE_ASSERT(gvec_fft_slab_.offsets.back() + gvec_fft_slab_.counts.back() == gvec_distr_fft_.counts[comm_fft().rank()]); gvec_array_ = mdarray(3, this->gvec_count_fft()); gkvec_cart_array_ = mdarray(3, this->gvec_count_fft()); for (int i = 0; i < comm_ortho_fft_.size(); i++) { - for (int j = 0; j < fft_comm_.size(); j++) { + for (int j = 0; j < comm_fft_.size(); j++) { int r = rank_map_(j, i); /* get array of G-vectors of rank r */ auto gv = this->gvec_.gvec_local(r); - if (j == fft_comm_.rank()) { + if (j == comm_fft_.rank()) { for (int ig = 0; ig < gvec_fft_slab_.counts[i]; ig++) { for (int x : {0, 1, 2}) { gvec_array_(x, gvec_fft_slab_.offsets[i] + ig) = gv(x, ig); @@ -624,23 +625,23 @@ void Gvec_partition::pile_gvec() update_gkvec_cart(); } -Gvec_partition::Gvec_partition(Gvec const& gvec__, Communicator const& fft_comm__, Communicator const& comm_ortho_fft__) +Gvec_fft::Gvec_fft(Gvec const& gvec__, Communicator const& comm_fft__, Communicator const& comm_ortho_fft__) : gvec_(gvec__) - , fft_comm_(fft_comm__) + , comm_fft_(comm_fft__) , comm_ortho_fft_(comm_ortho_fft__) { - if (fft_comm_.size() * comm_ortho_fft_.size() != gvec_.comm().size()) { + if (comm_fft_.size() * comm_ortho_fft_.size() != gvec_.comm().size()) { std::stringstream s; s << "wrong size of communicators" << std::endl - << " fft_comm_.size() = " << fft_comm_.size() << std::endl + << " comm_fft_.size() = " << comm_fft_.size() << std::endl << " comm_ortho_fft_.size() = " << comm_ortho_fft_.size() << std::endl << " gvec_.comm().size() = " << gvec_.comm().size(); RTE_THROW(s); } - rank_map_ = mdarray(fft_comm_.size(), comm_ortho_fft_.size()); + rank_map_ = mdarray(comm_fft_.size(), comm_ortho_fft_.size()); rank_map_.zero(); /* get a global rank */ - rank_map_(fft_comm_.rank(), comm_ortho_fft_.rank()) = gvec_.comm().rank(); + rank_map_(comm_fft_.rank(), comm_ortho_fft_.rank()) = gvec_.comm().rank(); gvec_.comm().allreduce(&rank_map_(0, 0), gvec_.comm().size()); build_fft_distr(); diff --git a/src/SDDK/gvec.hpp b/src/SDDK/gvec.hpp index f65f6bec5..5f959bc53 100644 --- a/src/SDDK/gvec.hpp +++ b/src/SDDK/gvec.hpp @@ -41,11 +41,6 @@ using namespace geometry3d; namespace sddk { -inline FFT3D_grid get_min_fft_grid(double cutoff__, matrix3d M__) -{ - return FFT3D_grid(find_translations(cutoff__, M__) + vector3d({2, 2, 2})); -} - /// Descriptor of the z-column (x,y fixed, z varying) of the G-vectors. /** Sphere of G-vectors within a given plane-wave cutoff is represented as a set of z-columns with different lengths. */ struct z_column_descriptor @@ -708,14 +703,14 @@ class Gvec /** FFT driver works with a small communicator. G-vectors are distributed over the entire communicator which is larger than the FFT communicator. In order to transform the functions, G-vectors must be redistributed to the FFT-friendly "fat" slabs based on the FFT communicator size. */ -class Gvec_partition +class Gvec_fft { private: - /// Pointer to the G-vector instance. + /// Reference to the G-vector instance. Gvec const& gvec_; /// Communicator for the FFT. - Communicator const& fft_comm_; + Communicator const& comm_fft_; /// Communicator which is orthogonal to FFT communicator. Communicator const& comm_ortho_fft_; @@ -723,8 +718,8 @@ class Gvec_partition /// Distribution of G-vectors for FFT. block_data_descriptor gvec_distr_fft_; - /// Distribution of z-columns for FFT. - block_data_descriptor zcol_distr_fft_; + /// Local number of z-columns. + int num_zcol_local_{0}; /// Distribution of G-vectors inside FFT-friendly "fat" slab. block_data_descriptor gvec_fft_slab_; @@ -745,12 +740,12 @@ class Gvec_partition void pile_gvec(); public: - Gvec_partition(Gvec const& gvec__, Communicator const& fft_comm__, Communicator const& comm_ortho_fft__); + Gvec_fft(Gvec const& gvec__, Communicator const& fft_comm__, Communicator const& comm_ortho_fft__); /// Return FFT communicator - inline Communicator const& fft_comm() const + inline Communicator const& comm_fft() const { - return fft_comm_; + return comm_fft_; } inline Communicator const& comm_ortho_fft() const @@ -766,16 +761,16 @@ class Gvec_partition /// Local number of G-vectors for FFT-friendly distribution. inline int gvec_count_fft() const { - return gvec_count_fft(fft_comm().rank()); + return gvec_count_fft(comm_fft().rank()); } /// Return local number of z-columns. inline int zcol_count_fft() const { - return zcol_distr_fft_.counts[fft_comm().rank()]; + return num_zcol_local_; } - inline block_data_descriptor const& gvec_fft_slab() const + inline auto const& gvec_fft_slab() const { return gvec_fft_slab_; } @@ -785,12 +780,12 @@ class Gvec_partition return gvec_; } - inline vector3d gkvec_cart(int igloc__) const + inline auto gkvec_cart(int igloc__) const { return vector3d(&gkvec_cart_array_(0, igloc__)); } - inline mdarray const& gvec_array() const + inline auto const& gvec_array() const { return gvec_array_; } @@ -821,7 +816,7 @@ class Gvec_partition { for (int i = 0; i < comm_ortho_fft_.size(); i++) { /* offset in global index */ - int offset = this->gvec_.gvec_offset(rank_map_(fft_comm_.rank(), i)); + int offset = this->gvec_.gvec_offset(rank_map_(comm_fft_.rank(), i)); for (int ig = 0; ig < gvec_fft_slab_.counts[i]; ig++) { f_pw_fft__[gvec_fft_slab_.offsets[i] + ig] = f_pw_global__[offset + ig]; } @@ -969,6 +964,21 @@ class Gvec_shells } }; +/// This is only for debug purpose. +inline std::shared_ptr +gkvec_factory(double gk_cutoff__, sddk::Communicator const& comm__) +{ + auto M = matrix3d({{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}); + return std::make_shared(vector3d({0, 0, 0}), M, gk_cutoff__, comm__, false); +} + +inline std::shared_ptr +gkvec_factory(vector3d vk__, matrix3d reciprocal_lattice_vectors__, double gk_cutoff__, + Communicator const& comm__ = sddk::Communicator::self(), bool gamma__ = false) +{ + return std::make_shared(vk__, reciprocal_lattice_vectors__, gk_cutoff__, comm__, gamma__); +} + } // namespace sddk #endif //__GVEC_HPP__ diff --git a/src/SDDK/matrix_storage.cpp b/src/SDDK/matrix_storage.cpp deleted file mode 100644 index 43c7f47bb..000000000 --- a/src/SDDK/matrix_storage.cpp +++ /dev/null @@ -1,347 +0,0 @@ -// Copyright (c) 2013-2017 Anton Kozhevnikov, Thomas Schulthess -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, are permitted provided that -// the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the -// following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions -// and the following disclaimer in the documentation and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -/** \file matrix_storage.cpp - * - * \brief Definitions. - * - */ -#include "matrix_storage.hpp" -#include "utils/profiler.hpp" -#include "utils/rte.hpp" - -namespace sddk { - -template -void matrix_storage::set_num_extra(int n__, int idx0__, memory_pool* mp__) -{ - auto& comm_col = gvp_->comm_ortho_fft(); - - /* this is how n columns of the matrix will be distributed between columns of the MPI grid */ - spl_num_col_ = splindex(n__, comm_col.size(), comm_col.rank()); - - T* ptr{nullptr}; - T* ptr_d{nullptr}; - int ncol{0}; - - /* trivial case */ - if (!is_remapped()) { - assert(num_rows_loc_ == gvp_->gvec_count_fft()); - ncol = n__; - ptr = prime_.at(memory_t::host, 0, idx0__); - if (prime_.on_device()) { - ptr_d = prime_.at(memory_t::device, 0, idx0__); - } - } else { - /* maximum local number of matrix columns */ - ncol = splindex_base::block_size(n__, comm_col.size()); - /* upper limit for the size of swapped extra matrix */ - size_t sz = gvp_->gvec_count_fft() * ncol; - /* reallocate buffers if necessary */ - if (extra_buf_.size() < sz) { - if (mp__) { - send_recv_buf_ = mdarray(sz, *mp__, "matrix_storage.send_recv_buf_"); - extra_buf_ = mdarray(sz, *mp__, "matrix_storage.extra_buf_"); - } else { - send_recv_buf_ = mdarray(sz, memory_t::host, "matrix_storage.send_recv_buf_"); - extra_buf_ = mdarray(sz, memory_t::host, "matrix_storage.extra_buf_"); - } - } - ptr = extra_buf_.at(memory_t::host); - } - /* create the extra storage */ - extra_ = mdarray(ptr, ptr_d, gvp_->gvec_count_fft(), ncol, "matrix_storage.extra_"); -} - -template -void matrix_storage::remap_from(const dmatrix& mtrx__, int irow0__) -{ - PROFILE("sddk::matrix_storage::remap_from"); - - auto& comm = mtrx__.blacs_grid().comm(); - - /* cache cartesian ranks */ - mdarray cart_rank(mtrx__.blacs_grid().num_ranks_row(), mtrx__.blacs_grid().num_ranks_col()); - for (int i = 0; i < mtrx__.blacs_grid().num_ranks_col(); i++) { - for (int j = 0; j < mtrx__.blacs_grid().num_ranks_row(); j++) { - cart_rank(j, i) = mtrx__.blacs_grid().cart_rank(j, i); - } - } - - if (send_recv_buf_.size() < prime_.size()) { - send_recv_buf_ = mdarray(prime_.size(), memory_t::host, "matrix_storage::send_recv_buf_"); - } - - block_data_descriptor rd(comm.size()); - rd.counts[comm.rank()] = num_rows_loc(); - comm.allgather(rd.counts.data(), 1, comm.rank()); - rd.calc_offsets(); - - block_data_descriptor sd(comm.size()); - - /* global index of column */ - int j0 = 0; - /* actual number of columns in the submatrix */ - int ncol = num_cols_; - - splindex spl_col_begin(j0, mtrx__.num_ranks_col(), mtrx__.rank_col(), mtrx__.bs_col()); - splindex spl_col_end(j0 + ncol, mtrx__.num_ranks_col(), mtrx__.rank_col(), - mtrx__.bs_col()); - - int local_size_col = spl_col_end.local_size() - spl_col_begin.local_size(); - - for (int rank_row = 0; rank_row < comm.size(); rank_row++) { - if (!rd.counts[rank_row]) { - continue; - } - /* global index of column */ - int i0 = rd.offsets[rank_row]; - /* actual number of rows in the submatrix */ - int nrow = rd.counts[rank_row]; - - assert(nrow != 0); - - splindex spl_row_begin(irow0__ + i0, mtrx__.num_ranks_row(), mtrx__.rank_row(), - mtrx__.bs_row()); - splindex spl_row_end(irow0__ + i0 + nrow, mtrx__.num_ranks_row(), mtrx__.rank_row(), - mtrx__.bs_row()); - - int local_size_row = spl_row_end.local_size() - spl_row_begin.local_size(); - - mdarray buf(local_size_row * local_size_col); - - /* fetch elements of sub-matrix matrix */ - if (local_size_row) { - for (int j = 0; j < local_size_col; j++) { - std::memcpy(&buf[local_size_row * j], - &mtrx__(spl_row_begin.local_size(), spl_col_begin.local_size() + j), - local_size_row * sizeof(T)); - } - } - - sd.counts[comm.rank()] = local_size_row * local_size_col; - comm.allgather(sd.counts.data(), 1, comm.rank()); - sd.calc_offsets(); - - /* collect buffers submatrix */ - T* send_buf = (buf.size() == 0) ? nullptr : &buf[0]; - T* recv_buf = (send_recv_buf_.size() == 0) ? nullptr : &send_recv_buf_[0]; - comm.gather(send_buf, recv_buf, sd.counts.data(), sd.offsets.data(), rank_row); - - if (comm.rank() == rank_row) { - /* unpack data */ - std::vector counts(comm.size(), 0); - for (int jcol = 0; jcol < ncol; jcol++) { - auto pos_jcol = mtrx__.spl_col().location(j0 + jcol); - for (int irow = 0; irow < nrow; irow++) { - auto pos_irow = mtrx__.spl_row().location(irow0__ + i0 + irow); - int rank = cart_rank(pos_irow.rank, pos_jcol.rank); - - prime_(irow, jcol) = send_recv_buf_[sd.offsets[rank] + counts[rank]]; - counts[rank]++; - } - } - for (int rank = 0; rank < comm.size(); rank++) { - assert(sd.counts[rank] == counts[rank]); - } - } - } -} - -template -void matrix_storage::remap_backward(int n__, int idx0__) -{ - PROFILE("sddk::matrix_storage::remap_backward"); - - /* trivial case when extra storage mirrors the prime storage */ - if (!is_remapped()) { - return; - } - - auto& comm_col = gvp_->comm_ortho_fft(); - - auto& row_distr = gvp_->gvec_fft_slab(); - - assert(n__ == spl_num_col_.global_index_size()); - - /* local number of columns */ - int n_loc = spl_num_col_.local_size(); - - /* reorder sending blocks */ - #pragma omp parallel for - for (int i = 0; i < n_loc; i++) { - for (int j = 0; j < comm_col.size(); j++) { - int offset = row_distr.offsets[j]; - int count = row_distr.counts[j]; - if (count) { - std::memcpy(&send_recv_buf_[offset * n_loc + count * i], &extra_(offset, i), count * sizeof(T)); - } - } - } - - /* send and receive dimensions */ - block_data_descriptor sd(comm_col.size()), rd(comm_col.size()); - for (int j = 0; j < comm_col.size(); j++) { - sd.counts[j] = spl_num_col_.local_size(comm_col.rank()) * row_distr.counts[j]; - rd.counts[j] = spl_num_col_.local_size(j) * row_distr.counts[comm_col.rank()]; - } - sd.calc_offsets(); - rd.calc_offsets(); - - T* recv_buf = (num_rows_loc_ == 0) ? nullptr : prime_.at(memory_t::host, 0, idx0__); - - { - PROFILE("sddk::matrix_storage::remap_backward|mpi"); - comm_col.alltoall(send_recv_buf_.at(memory_t::host), sd.counts.data(), sd.offsets.data(), recv_buf, - rd.counts.data(), rd.offsets.data()); - } - - /* move data back to device */ - if (prime_.on_device()) { - prime_.copy_to(memory_t::device, idx0__ * num_rows_loc(), n__ * num_rows_loc()); - } -} - -template -void matrix_storage::remap_forward(int n__, int idx0__, memory_pool* mp__) -{ - PROFILE("sddk::matrix_storage::remap_forward"); - - set_num_extra(n__, idx0__, mp__); - - /* trivial case when extra storage mirrors the prime storage */ - if (!is_remapped()) { - return; - } - - auto& row_distr = gvp_->gvec_fft_slab(); - - auto& comm_col = gvp_->comm_ortho_fft(); - - /* local number of columns */ - int n_loc = spl_num_col_.local_size(); - - /* send and receive dimensions */ - block_data_descriptor sd(comm_col.size()), rd(comm_col.size()); - for (int j = 0; j < comm_col.size(); j++) { - sd.counts[j] = spl_num_col_.local_size(j) * row_distr.counts[comm_col.rank()]; - rd.counts[j] = spl_num_col_.local_size(comm_col.rank()) * row_distr.counts[j]; - } - sd.calc_offsets(); - rd.calc_offsets(); - - T* send_buf = (num_rows_loc_ == 0) ? nullptr : prime_.at(memory_t::host, 0, idx0__); - - { - PROFILE("sddk::matrix_storage::remap_forward|mpi"); - comm_col.alltoall(send_buf, sd.counts.data(), sd.offsets.data(), send_recv_buf_.at(memory_t::host), - rd.counts.data(), rd.offsets.data()); - } - - /* reorder received blocks */ - #pragma omp parallel for - for (int i = 0; i < n_loc; i++) { - for (int j = 0; j < comm_col.size(); j++) { - int offset = row_distr.offsets[j]; - int count = row_distr.counts[j]; - if (count) { - std::memcpy(&extra_(offset, i), &send_recv_buf_[offset * n_loc + count * i], count * sizeof(T)); - } - } - } -} - -template -void matrix_storage::scale(memory_t mem__, int i0__, int n__, double beta__) -{ - if (is_host_memory(mem__)) { - for (int i = 0; i < n__; i++) { - for (int j = 0; j < num_rows_loc(); j++) { - prime(j, i0__ + i) *= beta__; - } - } - } else { -#if defined(SIRIUS_GPU) - scale_matrix_elements_gpu((acc_complex_double_t*)prime().at(mem__, 0, i0__), prime().ld(), num_rows_loc(), n__, - beta__); -#endif - } -} - -template // complex in general -complex_type matrix_storage::checksum(device_t pu__, int i0__, int n__) const -{ - T cs(0, 0); - - switch (pu__) { - case device_t::CPU: { - for (int i = 0; i < n__; i++) { - for (int j = 0; j < num_rows_loc(); j++) { - cs += prime(j, i0__ + i); - } - } - break; - } - case device_t::GPU: { - mdarray cs1(n__, memory_t::host, "checksum"); - cs1.allocate(memory_t::device).zero(memory_t::device); -#if defined(SIRIUS_GPU) - if (std::is_same>::value) { - add_checksum_gpu_double( - reinterpret_cast const*>(prime().at(memory_t::device, 0, i0__)), - num_rows_loc(), n__, reinterpret_cast*>(cs1.at(memory_t::device))); - } else if (std::is_same>::value) { - add_checksum_gpu_float( - reinterpret_cast const*>(prime().at(memory_t::device, 0, i0__)), - num_rows_loc(), n__, reinterpret_cast*>(cs1.at(memory_t::device))); - } else { - std::stringstream s; - s << "Precision type not yet implemented"; - RTE_THROW(s); - } - cs1.copy_to(memory_t::host); - cs = cs1.checksum(); -#endif - break; - } - } - return cs; -} - -template <> // real for special case -double_complex matrix_storage::checksum(device_t, int, int) const -{ - RTE_THROW("checksum is not implemented for double."); - return 0; -} - -template <> // real for special case -std::complex matrix_storage::checksum(device_t, int, int) const -{ - RTE_THROW("checksum is not implemented for float."); - return 0; -} - -// instantiate required types -template class matrix_storage; -template class matrix_storage; -template class matrix_storage; -template class matrix_storage, matrix_storage_t::slab>; - -} // namespace sddk diff --git a/src/SDDK/matrix_storage.hpp b/src/SDDK/matrix_storage.hpp deleted file mode 100644 index a9fb153c4..000000000 --- a/src/SDDK/matrix_storage.hpp +++ /dev/null @@ -1,247 +0,0 @@ -// Copyright (c) 2013-2017 Anton Kozhevnikov, Thomas Schulthess -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, are permitted provided that -// the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the -// following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions -// and the following disclaimer in the documentation and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -/** \file matrix_storage.hpp - * - * \brief Contains definition and implementation of sddk::matrix_storage class. - */ - -#ifndef __MATRIX_STORAGE_HPP__ -#define __MATRIX_STORAGE_HPP__ - -#include "gvec.hpp" -#include "dmatrix.hpp" - -#ifdef SIRIUS_GPU -extern "C" void add_checksum_gpu_double(std::complex const* wf__, - int num_rows_loc__, - int nwf__, - std::complex* result__); - -extern "C" void add_checksum_gpu_float(std::complex const* wf__, - int num_rows_loc__, - int nwf__, - std::complex* result__); -#endif - -namespace sddk { - -enum class matrix_storage_t -{ - slab, - block_cyclic -}; - -/// Class declaration. -template -class matrix_storage; - -/// Specialization of matrix storage class for slab data distribution. -/** \tparam T data type */ -template -class matrix_storage -{ - private: - - /// G-vector partitioning. - Gvec_partition const* gvp_{nullptr}; - - /// Local number of rows. - int num_rows_loc_{0}; - - /// Total number of columns. - int num_cols_; - - /// Primary storage of matrix. - mdarray prime_; - - /// Auxiliary matrix storage. - /** This distribution is used by the FFT driver */ - mdarray extra_; - - /// Raw buffer for the extra storage. - mdarray extra_buf_; - - /// Raw send-receive buffer. - mdarray send_recv_buf_; - - /// Column distribution in auxiliary matrix. - splindex spl_num_col_; - - public: - /// Constructor. - matrix_storage(Gvec_partition const& gvp__, int num_cols__) - : gvp_(&gvp__) - , num_rows_loc_(gvp__.gvec().count()) - , num_cols_(num_cols__) - { - /* primary storage of PW wave functions: slabs */ - prime_ = mdarray(num_rows_loc_, num_cols_, memory_t::host, "matrix_storage.prime_"); - } - - /// Constructor. - /** Memory for prime storage is allocated from the memory pool */ - matrix_storage(memory_pool& mp__, Gvec_partition const& gvp__, int num_cols__) - : gvp_(&gvp__) - , num_rows_loc_(gvp__.gvec().count()) - , num_cols_(num_cols__) - { - /* primary storage of PW wave functions: slabs */ - prime_ = mdarray(num_rows_loc_, num_cols_, mp__, "matrix_storage.prime_"); - } - - /// Constructor. - matrix_storage(int num_rows_loc__, int num_cols__) - : num_rows_loc_(num_rows_loc__) - , num_cols_(num_cols__) - { - /* primary storage of PW wave functions: slabs */ - prime_ = mdarray(num_rows_loc_, num_cols_, memory_t::host, "matrix_storage.prime_"); - } - - /// Constructor. - matrix_storage(memory_pool& mp__, int num_rows_loc__, int num_cols__) - : num_rows_loc_(num_rows_loc__) - , num_cols_(num_cols__) - { - /* primary storage of PW wave functions: slabs */ - prime_ = mdarray(num_rows_loc_, num_cols_, mp__, "matrix_storage.prime_"); - } - - /// Check if data needs to be remapped. - /** Data is not remapped when communicator that is orthogonal to FFT communicator is trivial. - * In this case the FFT communicator coincides with the entire communicator used to distribute wave functions - * and the data is ready for FFT transformations. */ - inline bool is_remapped() const - { - return (gvp_->comm_ortho_fft().size() > 1); - } - - /// Set the dimensions of the extra matrix storage. - /** \param [in] n Number of matrix columns to distribute. - * \param [in] idx0 Starting column of the matrix. - * \param [in] mp Memory pool that can be used for fast reallocation. - * - * \image html matrix_storage.png "Redistribution of wave-functions between MPI ranks" - * - * The extra storage is always created in the CPU memory. If the data distribution doesn't - * change (no swapping between comm_col ranks is performed) – then the extra storage will mirror - * the prime storage (both on CPU and GPU) irrespective of the target processing unit. If - * data remapping is necessary extra storage is allocated only in the host memory because MPI is done using the - * host pointers. - */ - void set_num_extra(int n__, int idx0__, memory_pool* mp__); - - /// Remap data from prime to extra storage. - /** \param [in] n Number of matrix columns to distribute. - * \param [in] idx0 Starting column of the matrix. - * - * Prime storage is expected on the CPU (for the MPI a2a communication). */ - void remap_forward(int n__, int idx0__, memory_pool* mp__); - - /// Remap data from extra to prime storage. - /** \param [in] n Number of matrix columns to collect. - * \param [in] idx0 Starting column of the matrix. - * - * Extra storage is expected on the CPU (for the MPI a2a communication). If the prime storage is allocated on GPU - * remapped data will be copied to GPU. */ - void remap_backward(int n__, int idx0__); - - void remap_from(dmatrix const& mtrx__, int irow0__); - - inline T& prime(int irow__, int jcol__) - { - return prime_(irow__, jcol__); - } - - inline T const& prime(int irow__, int jcol__) const - { - return prime_(irow__, jcol__); - } - - mdarray& prime() - { - return prime_; - } - - mdarray const& prime() const - { - return prime_; - } - - mdarray& extra() - { - return extra_; - } - - mdarray const& extra() const - { - return extra_; - } - - /// Local number of rows in prime matrix. - inline int num_rows_loc() const - { - return num_rows_loc_; - } - - inline splindex const& spl_num_col() const - { - return spl_num_col_; - } - - /// Allocate prime storage. - void allocate(memory_pool& mp__) - { - prime_.allocate(mp__); - } - - /// Allocate prime storage. - void allocate(memory_t mem__) - { - prime_.allocate(mem__); - } - - /// Deallocate storage. - void deallocate(memory_t mem__) - { - prime_.deallocate(mem__); - } - - void scale(memory_t mem__, int i0__, int n__, double beta__); - - inline void zero(memory_t mem__, int i0__, int n__) - { - prime_.zero(mem__, i0__ * num_rows_loc(), n__ * num_rows_loc()); - } - - /// Copy prime storage to device memory. - void copy_to(memory_t mem__, int i0__, int n__) - { - if (num_rows_loc()) { - prime_.copy_to(mem__, i0__ * num_rows_loc(), n__ * num_rows_loc()); - } - } - - complex_type checksum(device_t pu__, int i0__, int n__) const; -}; - -} // namespace sddk - -#endif // __MATRIX_STORAGE_HPP__ diff --git a/src/SDDK/memory.cpp b/src/SDDK/memory.cpp new file mode 100644 index 000000000..14d49a991 --- /dev/null +++ b/src/SDDK/memory.cpp @@ -0,0 +1,17 @@ +#include "memory.hpp" + +namespace sddk { + +/// Return a memory pool. +/** A memory pool is created when this function called for the first time. */ +sddk::memory_pool& +get_memory_pool(sddk::memory_t M__) +{ + static std::map memory_pool_; + if (memory_pool_.count(M__) == 0) { + memory_pool_.emplace(M__, sddk::memory_pool(M__)); + } + return memory_pool_.at(M__); +} + +} // namespace sddk diff --git a/src/SDDK/memory.hpp b/src/SDDK/memory.hpp index 6e126d143..5694d69e3 100644 --- a/src/SDDK/memory.hpp +++ b/src/SDDK/memory.hpp @@ -228,7 +228,7 @@ template inline void copy(memory_t from_mem__, T const* from_ptr__, memory_t to_mem__, T* to_ptr__, size_t n__) { if (is_host_memory(to_mem__) && is_host_memory(from_mem__)) { - std::memcpy(to_ptr__, from_ptr__, n__ * sizeof(T)); + std::copy(from_ptr__, from_ptr__ + n__, to_ptr__); return; } #if defined(SIRIUS_GPU) @@ -602,6 +602,12 @@ class memory_pool map_ptr_.clear(); } + /// Clear memory pool and release all memory. + void clear() + { + memory_blocks_.clear(); + } + void print() { std::cout << "--- memory pool status ---\n"; @@ -661,12 +667,9 @@ void memory_pool_deleter::memory_pool_deleter_impl::free(void* ptr__) mp_->free(ptr__); } -//#ifdef SIRIUS_GPU -//extern "C" void add_checksum_gpu(cuDoubleComplex* wf__, -// int num_rows_loc__, -// int nwf__, -// cuDoubleComplex* result__); -//#endif +/// Return a memory pool. +/** A memory pool is created when this function called for the first time. */ +sddk::memory_pool& get_memory_pool(sddk::memory_t M__); #ifdef NDEBUG #define mdarray_assert(condition__) @@ -1499,7 +1502,7 @@ class mdarray /// Zero the entire array. inline void zero(memory_t mem__ = memory_t::host) { - zero(mem__, 0, size()); + this->zero(mem__, 0, size()); } /// Copy n elements starting from idx0 from one memory type to another. @@ -1554,6 +1557,11 @@ class mdarray #endif } + auto label() const + { + return label_; + } + mdarray& operator=(std::function f__) { for (size_t i = 0; i < this->size(); i++) { @@ -1617,7 +1625,7 @@ inline void copy(mdarray const& src__, mdarray& dest__) } } std::cout << "=== WARNING at line " << __LINE__ << " of file " << __FILE__ << " ===" << std::endl; - std::cout << " Copying matrix element with different type, possible lost of data precision" << std::endl; + std::cout << " Copying matrix element with different type, possible loss of data precision" << std::endl; std::copy(&src__.at(memory_t::host)[0], &src__.at(memory_t::host)[0] + src__.size(), &dest__.at(memory_t::host)[0]); } diff --git a/src/SDDK/type_definition.hpp b/src/SDDK/type_definition.hpp index a13bfe197..15d264354 100644 --- a/src/SDDK/type_definition.hpp +++ b/src/SDDK/type_definition.hpp @@ -6,6 +6,9 @@ #ifndef __TYPE_DEFINITION_HPP__ #define __TYPE_DEFINITION_HPP__ +#include +#include + using double_complex = std::complex; // define type traits that return real type @@ -20,27 +23,7 @@ struct Real> {using type = T;}; template using real_type = typename Real::type; -// define type traits that return a complex type -// general case for real type -template -struct Complex {using type = std::complex;}; - -// special case for complex type -template -struct Complex> {using type = std::complex;}; - -template -using complex_type = typename Complex::type; - -namespace sddk { -enum class matrix_distribution_t -{ - slab, - block_cyclic -}; - -template -class dmatrix; -} +template +constexpr bool is_real_v = std::is_same>::value; #endif // __TYPE_DEFINITION_HPP__ diff --git a/src/SDDK/wave_functions.cpp b/src/SDDK/wave_functions.cpp deleted file mode 100644 index 494ec6898..000000000 --- a/src/SDDK/wave_functions.cpp +++ /dev/null @@ -1,659 +0,0 @@ -// Copyright (c) 2013-2018 Anton Kozhevnikov, Thomas Schulthess -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, are permitted provided that -// the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the -// following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions -// and the following disclaimer in the documentation and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -/** \file wave_functions.cpp - * - * \brief Definitions. - * - */ -#include "wave_functions.hpp" - -namespace sddk { - -#if defined(SIRIUS_GPU) -void add_square_sum_gpu(std::complex const* wf__, int num_rows_loc__, int nwf__, int reduced__, int mpi_rank__, double* result__) -{ - add_square_sum_gpu_double(wf__, num_rows_loc__, nwf__, reduced__, mpi_rank__, result__); -} - -void add_square_sum_gpu(std::complex const* wf__, int num_rows_loc__, int nwf__, int reduced__, int mpi_rank__, float* result__) -{ - add_square_sum_gpu_float(wf__, num_rows_loc__, nwf__, reduced__, mpi_rank__, result__); -} - -void scale_matrix_columns_gpu(int nrow__, int ncol__, std::complex* mtrx__, double* a__) -{ - scale_matrix_columns_gpu_double(nrow__, ncol__, mtrx__, a__); -} - -void scale_matrix_columns_gpu(int nrow__, int ncol__, std::complex* mtrx__, float* a__) -{ - scale_matrix_columns_gpu_float(nrow__, ncol__, mtrx__, a__); -} -#endif - -template -Wave_functions::Wave_functions(const Gvec_partition& gkvecp__, int num_wf__, memory_t preferred_memory_t__, - int num_sc__) - : comm_(gkvecp__.gvec().comm()) - , gkvecp_(gkvecp__) - , num_wf_(num_wf__) - , num_sc_(num_sc__) - , preferred_memory_t_(preferred_memory_t__) -{ - if (!(num_sc__ == 1 || num_sc__ == 2)) { - TERMINATE("wrong number of spin components"); - } - - for (int ispn = 0; ispn < num_sc_; ispn++) { - pw_coeffs_[ispn] = std::unique_ptr, matrix_storage_t::slab>>( - new matrix_storage, matrix_storage_t::slab>(gkvecp_, num_wf_)); - } -} - -template -Wave_functions::Wave_functions(memory_pool& mp__, const Gvec_partition& gkvecp__, int num_wf__, - memory_t preferred_memory_t__, int num_sc__) - : comm_(gkvecp__.gvec().comm()) - , gkvecp_(gkvecp__) - , num_wf_(num_wf__) - , num_sc_(num_sc__) - , preferred_memory_t_(preferred_memory_t__) -{ - if (!(num_sc__ == 1 || num_sc__ == 2)) { - TERMINATE("wrong number of spin components"); - } - if (!is_host_memory(mp__.memory_type())) { - TERMINATE("this is not a host memory pool"); - } - - for (int ispn = 0; ispn < num_sc_; ispn++) { - pw_coeffs_[ispn] = std::unique_ptr, matrix_storage_t::slab>>( - new matrix_storage, matrix_storage_t::slab>(mp__, gkvecp_, num_wf_)); - } -} - -template -Wave_functions::Wave_functions(const Gvec_partition& gkvecp__, int num_atoms__, std::function mt_size__, - int num_wf__, memory_t preferred_memory_t__, int num_sc__) - : comm_(gkvecp__.gvec().comm()) - , gkvecp_(gkvecp__) - , num_wf_(num_wf__) - , num_sc_(num_sc__) - , has_mt_(true) - , preferred_memory_t_(preferred_memory_t__) -{ - if (!(num_sc__ == 1 || num_sc__ == 2)) { - TERMINATE("wrong number of spin components"); - } - - for (int ispn = 0; ispn < num_sc_; ispn++) { - pw_coeffs_[ispn] = std::unique_ptr, matrix_storage_t::slab>>( - new matrix_storage, matrix_storage_t::slab>(gkvecp_, num_wf_)); - } - - spl_num_atoms_ = splindex(num_atoms__, comm_.size(), comm_.rank()); - mt_coeffs_distr_ = block_data_descriptor(comm_.size()); - - for (int ia = 0; ia < num_atoms__; ia++) { - int rank = spl_num_atoms_.local_rank(ia); - if (rank == comm_.rank()) { - offset_mt_coeffs_.push_back(mt_coeffs_distr_.counts[rank]); - } - mt_coeffs_distr_.counts[rank] += mt_size__(ia); - } - mt_coeffs_distr_.calc_offsets(); - - num_mt_coeffs_ = mt_coeffs_distr_.offsets.back() + mt_coeffs_distr_.counts.back(); - - for (int ispn = 0; ispn < num_sc_; ispn++) { - mt_coeffs_[ispn] = std::unique_ptr, matrix_storage_t::slab>>( - new matrix_storage, matrix_storage_t::slab>(mt_coeffs_distr_.counts[comm_.rank()], num_wf_)); - } -} - -template -Wave_functions::Wave_functions(memory_pool &mp__, const Gvec_partition& gkvecp__, int num_atoms__, std::function mt_size__, - int num_wf__, memory_t preferred_memory_t__, int num_sc__) - : comm_(gkvecp__.gvec().comm()) - , gkvecp_(gkvecp__) - , num_wf_(num_wf__) - , num_sc_(num_sc__) - , has_mt_(true) - , preferred_memory_t_(preferred_memory_t__) -{ - if (!(num_sc__ == 1 || num_sc__ == 2)) { - TERMINATE("wrong number of spin components"); - } - - for (int ispn = 0; ispn < num_sc_; ispn++) { - pw_coeffs_[ispn] = std::unique_ptr, matrix_storage_t::slab>>( - new matrix_storage, matrix_storage_t::slab>(mp__, gkvecp_, num_wf_)); - } - - /* TODO: remove reduntant code */ - spl_num_atoms_ = splindex(num_atoms__, comm_.size(), comm_.rank()); - mt_coeffs_distr_ = block_data_descriptor(comm_.size()); - - for (int ia = 0; ia < num_atoms__; ia++) { - int rank = spl_num_atoms_.local_rank(ia); - if (rank == comm_.rank()) { - offset_mt_coeffs_.push_back(mt_coeffs_distr_.counts[rank]); - } - mt_coeffs_distr_.counts[rank] += mt_size__(ia); - } - mt_coeffs_distr_.calc_offsets(); - - num_mt_coeffs_ = mt_coeffs_distr_.offsets.back() + mt_coeffs_distr_.counts.back(); - - for (int ispn = 0; ispn < num_sc_; ispn++) { - mt_coeffs_[ispn] = std::unique_ptr, matrix_storage_t::slab>>( - new matrix_storage, matrix_storage_t::slab>(mp__, mt_coeffs_distr_.counts[comm_.rank()], num_wf_)); - } -} - -template -void Wave_functions::copy_from(device_t pu__, int n__, const Wave_functions& src__, int ispn__, int i0__, - int jspn__, int j0__) -{ - assert(ispn__ == 0 || ispn__ == 1); - assert(jspn__ == 0 || jspn__ == 1); - - int ngv = pw_coeffs(jspn__).num_rows_loc(); - bool has_mt = this->has_mt() && src__.has_mt(); - int nmt = has_mt ? mt_coeffs(jspn__).num_rows_loc() : 0; - - switch (pu__) { - case device_t::CPU: { - /* copy PW part */ - std::copy(src__.pw_coeffs(ispn__).prime().at(memory_t::host, 0, i0__), - src__.pw_coeffs(ispn__).prime().at(memory_t::host, 0, i0__) + ngv * n__, - pw_coeffs(jspn__).prime().at(memory_t::host, 0, j0__)); - /* copy MT part */ - if (has_mt) { - std::copy(src__.mt_coeffs(ispn__).prime().at(memory_t::host, 0, i0__), - src__.mt_coeffs(ispn__).prime().at(memory_t::host, 0, i0__) + nmt * n__, - mt_coeffs(jspn__).prime().at(memory_t::host, 0, j0__)); - } - break; - } - case device_t::GPU: { - /* copy PW part */ - acc::copy(pw_coeffs(jspn__).prime().at(memory_t::device, 0, j0__), - src__.pw_coeffs(ispn__).prime().at(memory_t::device, 0, i0__), ngv * n__); - /* copy MT part */ - if (has_mt) { - acc::copy(mt_coeffs(jspn__).prime().at(memory_t::device, 0, j0__), - src__.mt_coeffs(ispn__).prime().at(memory_t::device, 0, i0__), nmt * n__); - } - break; - } - } -} - -template -void Wave_functions::copy_from(const Wave_functions& src__, int n__, int ispn__, int i0__, int jspn__, int j0__) -{ - assert(ispn__ == 0 || ispn__ == 1); - assert(jspn__ == 0 || jspn__ == 1); - - bool has_mt = this->has_mt() && src__.has_mt(); - - int ngv = pw_coeffs(jspn__).num_rows_loc(); - int nmt = has_mt ? mt_coeffs(jspn__).num_rows_loc() : 0; - - copy(src__.preferred_memory_t(), src__.pw_coeffs(ispn__).prime().at(src__.preferred_memory_t(), 0, i0__), - preferred_memory_t(), pw_coeffs(jspn__).prime().at(preferred_memory_t(), 0, j0__), ngv * n__); - if (has_mt) { - copy(src__.preferred_memory_t(), src__.mt_coeffs(ispn__).prime().at(src__.preferred_memory_t(), 0, i0__), - preferred_memory_t(), mt_coeffs(jspn__).prime().at(preferred_memory_t(), 0, j0__), nmt * n__); - } -} - -template -std::complex Wave_functions::checksum_pw(device_t pu__, int ispn__, int i0__, int n__) const -{ - std::complex cs(0, 0); - if (n__ == 0) { - return cs; - } - for (int s = s0(ispn__); s <= s1(ispn__); s++) { - cs += pw_coeffs(s).checksum(pu__, i0__, n__); - } - comm_.allreduce(&cs, 1); - return cs; -} - -template -std::complex Wave_functions::checksum_mt(device_t pu__, int ispn__, int i0__, int n__) const -{ - std::complex cs(0, 0); - if (!this->has_mt_ || n__ == 0) { - return cs; - } - for (int s = s0(ispn__); s <= s1(ispn__); s++) { - if (mt_coeffs_distr_.counts[comm_.rank()]) { - cs += mt_coeffs(s).checksum(pu__, i0__, n__); - } - } - comm_.allreduce(&cs, 1); - return cs; -} - -template -void Wave_functions::zero_pw(device_t pu__, int ispn__, int i0__, int n__) // TODO: pass memory_t -{ - for (int s = s0(ispn__); s <= s1(ispn__); s++) { - switch (pu__) { - case device_t::CPU: { - pw_coeffs(s).zero(memory_t::host, i0__, n__); - break; - } - case device_t::GPU: { - pw_coeffs(s).zero(memory_t::device, i0__, n__); - break; - } - } - } -} - -template -void Wave_functions::zero_mt(device_t pu__, int ispn__, int i0__, int n__) // TODO: pass memory_t -{ - if (!has_mt()) { - return; - } - for (int s = s0(ispn__); s <= s1(ispn__); s++) { - switch (pu__) { - case device_t::CPU: { - mt_coeffs(s).zero(memory_t::host, i0__, n__); - break; - } - case device_t::GPU: { - mt_coeffs(s).zero(memory_t::device, i0__, n__); - break; - } - } - } -} - -template -void Wave_functions::scale(memory_t mem__, int ispn__, int i0__, int n__, T beta__) -{ - for (int s = s0(ispn__); s <= s1(ispn__); s++) { - pw_coeffs(s).scale(mem__, i0__, n__, beta__); - if (has_mt()) { - mt_coeffs(s).scale(mem__, i0__, n__, beta__); - } - } -} - -template -mdarray Wave_functions::l2norm(device_t pu__, spin_range spins__, int n__) const -{ - assert(n__ != 0); - - auto norm = sumsqr(pu__, spins__, n__); - for (int i = 0; i < n__; i++) { - norm[i] = std::sqrt(norm[i]); - } - - return norm; -} - -template -void Wave_functions::normalize(device_t pu__, spin_range spins__, int n__) -{ - auto norm = this->l2norm(pu__, spins__, n__); - for (int i = 0; i < n__; i++) { - norm[i] = 1.0 / norm[i]; - } - if (pu__ == device_t::GPU) { - norm.copy_to(memory_t::device); - } - for (int ispn : spins__) { - switch (pu__) { - case device_t::CPU: { - #pragma omp parallel for schedule(static) - for (int i = 0; i < n__; i++) { - for (int ig = 0; ig < this->pw_coeffs(ispn).num_rows_loc(); ig++) { - this->pw_coeffs(ispn).prime(ig, i) *= norm[i]; - } - if (this->has_mt()) { - for (int j = 0; j < this->mt_coeffs(ispn).num_rows_loc(); j++) { - this->mt_coeffs(ispn).prime(j, i) *= norm[i]; - } - } - } - break; - } - case device_t::GPU: { -#if defined(SIRIUS_GPU) - scale_matrix_columns_gpu( - this->pw_coeffs(ispn).num_rows_loc(), n__, - this->pw_coeffs(ispn).prime().at(memory_t::device), - norm.at(memory_t::device)); - - if (this->has_mt()) { - scale_matrix_columns_gpu( - this->mt_coeffs(ispn).num_rows_loc(), n__, - this->mt_coeffs(ispn).prime().at(memory_t::device), - norm.at(memory_t::device)); - } -#endif - } break; - } - } -} - -template -void Wave_functions::allocate(spin_range spins__, memory_t mem__) -{ - for (int s : spins__) { - pw_coeffs(s).allocate(mem__); - if (has_mt()) { - mt_coeffs(s).allocate(mem__); - } - } -} - -template -void Wave_functions::allocate(spin_range spins__, memory_pool& mp__) -{ - for (int s : spins__) { - pw_coeffs(s).allocate(mp__); - if (has_mt()) { - mt_coeffs(s).allocate(mp__); - } - } -} - -template -void Wave_functions::deallocate(spin_range spins__, memory_t mem__) -{ - for (int s : spins__) { - pw_coeffs(s).deallocate(mem__); - if (has_mt()) { - mt_coeffs(s).deallocate(mem__); - } - } -} - -template -void Wave_functions::copy_to(spin_range spins__, memory_t mem__, int i0__, int n__) -{ - for (int s : spins__) { - pw_coeffs(s).copy_to(mem__, i0__, n__); - if (has_mt()) { - mt_coeffs(s).copy_to(mem__, i0__, n__); - } - } -} - -template -mdarray, 1> Wave_functions::dot(device_t pu__, spin_range spins__, Wave_functions const &phi, int n__) const -{ - mdarray, 1> s(n__, memory_t::host, "dot"); - s.zero(); - - for (int is : spins__) { - switch (pu__) { - case device_t::CPU: { - #pragma omp parallel for - for (int i = 0; i < n__; i++) { - for (int ig = 0; ig < pw_coeffs(is).num_rows_loc(); ig++) { - auto x = pw_coeffs(is).prime(ig, i); - auto y = phi.pw_coeffs(is).prime(ig, i); - s[i] += std::conj(x) * y; - } - // todo, do something here. - // if (gkvecp_.gvec().reduced()) { - // if (comm_.rank() == 0) { - // s[i] = 2 * s[i] - std::pow(pw_coeffs(is).prime(0, i).real(), 2); - // } else { - // s[i] *= 2; - // } - // } - if (has_mt()) { - for (int j = 0; j < mt_coeffs(is).num_rows_loc(); j++) { - auto x = mt_coeffs(is).prime(j, i); - auto y = phi.mt_coeffs(is).prime(j, i); - s[i] += std::conj(x) * y; - } - } - } - break; - } - case device_t::GPU: { - throw "not implemented yet"; - } - } - } - - if (pu__ == device_t::GPU) { - s.copy_to(memory_t::host); - } - - comm_.allreduce(s.at(memory_t::host), n__); - - return s; -} - -template -template -void Wave_functions::axpby(device_t pu__, spin_range spins__, Ta alpha, Wave_functions const &phi, Ta beta, int n__) -{ - for (int is : spins__) { - switch (pu__) { - case device_t::CPU: { - #pragma omp parallel for - for (int i = 0; i < n__; i++) { - for (int ig = 0; ig < pw_coeffs(is).num_rows_loc(); ig++) { - auto x = phi.pw_coeffs(is).prime(ig, i); - auto y = pw_coeffs(is).prime(ig, i); - pw_coeffs(is).prime(ig, i) = alpha * x + beta * y; - } - if (has_mt()) { - for (int j = 0; j < mt_coeffs(is).num_rows_loc(); j++) { - auto x = phi.mt_coeffs(is).prime(j, i); - auto y = mt_coeffs(is).prime(j, i); - mt_coeffs(is).prime(j, i) = alpha * x + beta * y; - } - } - } - break; - } - case device_t::GPU: { - throw "not implemented yet"; - } - } - } -} - -template -template -void Wave_functions::xpby(device_t pu__, spin_range spins__, Wave_functions const &phi, std::vector const &betas, int n__) -{ - for (int is : spins__) { - switch (pu__) { - case device_t::CPU: { - #pragma omp parallel for - for (int i = 0; i < n__; i++) { - auto beta = betas[i]; - - for (int ig = 0; ig < pw_coeffs(is).num_rows_loc(); ig++) { - auto x = phi.pw_coeffs(is).prime(ig, i); - auto y = pw_coeffs(is).prime(ig, i); - pw_coeffs(is).prime(ig, i) = x + beta * y; - } - if (has_mt()) { - for (int j = 0; j < mt_coeffs(is).num_rows_loc(); j++) { - auto x = phi.mt_coeffs(is).prime(j, i); - auto y = mt_coeffs(is).prime(j, i); - mt_coeffs(is).prime(j, i) = x + beta * y; - } - } - } - break; - } - case device_t::GPU: { - throw "not implemented yet"; - } - } - } -} - -template -template -void Wave_functions::axpy(device_t pu__, spin_range spins__, std::vector const &alphas, Wave_functions const &phi, int n__) -{ - for (int is : spins__) { - switch (pu__) { - case device_t::CPU: { - #pragma omp parallel for - for (int i = 0; i < n__; i++) { - auto alpha = alphas[i]; - - for (int ig = 0; ig < pw_coeffs(is).num_rows_loc(); ig++) { - pw_coeffs(is).prime(ig, i) += alpha * phi.pw_coeffs(is).prime(ig, i); - } - if (has_mt()) { - for (int j = 0; j < mt_coeffs(is).num_rows_loc(); j++) { - mt_coeffs(is).prime(j, i) += alpha * phi.mt_coeffs(is).prime(j, i); - } - } - } - break; - } - case device_t::GPU: { - throw "not implemented yet"; - } - } - } -} - -template -template -void Wave_functions::axpy_scatter(device_t pu__, spin_range spins__, std::vector const &alphas, Wave_functions const &phi, std::vector const &ids, int n__) -{ - for (int is : spins__) { - switch (pu__) { - case device_t::CPU: { - #pragma omp parallel for - for (int i = 0; i < n__; i++) { - auto ii = ids[i]; - auto alpha = alphas[i]; - - for (int ig = 0; ig < pw_coeffs(is).num_rows_loc(); ig++) { - pw_coeffs(is).prime(ig, ii) += alpha * phi.pw_coeffs(is).prime(ig, i); - } - if (has_mt()) { - for (int j = 0; j < mt_coeffs(is).num_rows_loc(); j++) { - mt_coeffs(is).prime(j, ii) += alpha * phi.mt_coeffs(is).prime(j, i); - } - } - } - break; - } - case device_t::GPU: { - throw "not implemented yet"; - } - } - } -} - -template -mdarray Wave_functions::sumsqr(device_t pu__, spin_range spins__, int n__) const -{ - mdarray s(n__, memory_t::host, "sumsqr"); - s.zero(); - if (pu__ == device_t::GPU) { - s.allocate(memory_t::device).zero(memory_t::device); - } - - for (int is : spins__) { - switch (pu__) { - case device_t::CPU: { - #pragma omp parallel for - for (int i = 0; i < n__; i++) { - for (int ig = 0; ig < pw_coeffs(is).num_rows_loc(); ig++) { - s[i] += (std::pow(pw_coeffs(is).prime(ig, i).real(), 2) + - std::pow(pw_coeffs(is).prime(ig, i).imag(), 2)); - } - if (gkvecp_.gvec().reduced()) { - if (comm_.rank() == 0) { - s[i] = 2 * s[i] - std::pow(pw_coeffs(is).prime(0, i).real(), 2); - } else { - s[i] *= 2; - } - } - if (has_mt()) { - for (int j = 0; j < mt_coeffs(is).num_rows_loc(); j++) { - s[i] += (std::pow(mt_coeffs(is).prime(j, i).real(), 2) + - std::pow(mt_coeffs(is).prime(j, i).imag(), 2)); - } - } - } - break; - } - case device_t::GPU: { -#if defined(SIRIUS_GPU) - add_square_sum_gpu( - pw_coeffs(is).prime().at(memory_t::device), - pw_coeffs(is).num_rows_loc(), n__, gkvecp_.gvec().reduced(), comm_.rank(), - s.at(memory_t::device)); - if (has_mt()) { - add_square_sum_gpu( - mt_coeffs(is).prime().at(memory_t::device), - mt_coeffs(is).num_rows_loc(), n__, 0, comm_.rank(), - s.at(memory_t::device)); - } -#endif - break; - } - } - } - if (pu__ == device_t::GPU) { - s.copy_to(memory_t::host); - } - comm_.allreduce(s.at(memory_t::host), n__); - return s; -} - -// instantiate for required types -template class Wave_functions; -#ifdef USE_FP32 -template class Wave_functions; -#endif - -template void Wave_functions::axpby(device_t pu__, spin_range spins__, double alpha, Wave_functions const &phi, double beta, int n__); -template void Wave_functions::axpby(device_t pu__, spin_range spins__, double_complex alpha, Wave_functions const &phi, double_complex beta, int n__); - -template void Wave_functions::xpby(device_t pu__, spin_range spins__, Wave_functions const &phi, std::vector const &betas, int n__); -template void Wave_functions::xpby(device_t pu__, spin_range spins__, Wave_functions const &phi, std::vector const &betas, int n__); - -template void Wave_functions::axpy(device_t pu__, spin_range spins__, std::vector const &alphas, Wave_functions const &phi, int n__); -template void Wave_functions::axpy(device_t pu__, spin_range spins__, std::vector const &alphas, Wave_functions const &phi, int n__); - -template void Wave_functions::axpy_scatter(device_t pu__, spin_range spins__, std::vector const &alphas, Wave_functions const &phi, std::vector const &ids, int n__); -template void Wave_functions::axpy_scatter(device_t pu__, spin_range spins__, std::vector const &alphas, Wave_functions const &phi, std::vector const &ids, int n__); - -} // namespace sddk - - diff --git a/src/SDDK/wave_functions.hpp b/src/SDDK/wave_functions.hpp index c62b2a9f6..c8bcbae0b 100644 --- a/src/SDDK/wave_functions.hpp +++ b/src/SDDK/wave_functions.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2013-2018 Anton Kozhevnikov, Thomas Schulthess +// Copyright (c) 2013-2022 Anton Kozhevnikov, Thomas Schulthess // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are permitted provided that @@ -27,482 +27,1922 @@ #include #include +#include +#include #include "linalg/linalg.hpp" #include "SDDK/hdf5_tree.hpp" #include "SDDK/gvec.hpp" #include "utils/env.hpp" #include "utils/rte.hpp" -#include "matrix_storage.hpp" #include "type_definition.hpp" -#ifdef SIRIUS_GPU -extern "C" void add_square_sum_gpu_double(double_complex const* wf__, int num_rows_loc__, int nwf__, int reduced__, - int mpi_rank__, double* result__); -extern "C" void add_square_sum_gpu_float(std::complex const* wf__, int num_rows_loc__, int nwf__, int reduced__, - int mpi_rank__, float* result__); +#if defined(SIRIUS_GPU) +extern "C" { -extern "C" void scale_matrix_columns_gpu_double(int nrow__, int ncol__, std::complex* mtrx__, double* a__); +void +add_square_sum_gpu_double(std::complex const* wf__, int num_rows_loc__, int nwf__, int reduced__, + int mpi_rank__, double* result__); -extern "C" void scale_matrix_columns_gpu_float(int nrow__, int ncol__, std::complex* mtrx__, float* a__); +void +add_square_sum_gpu_float(std::complex const* wf__, int num_rows_loc__, int nwf__, int reduced__, + int mpi_rank__, float* result__); + +void +scale_matrix_columns_gpu_double(int nrow__, int ncol__, std::complex* mtrx__, double* a__); + +void +scale_matrix_columns_gpu_float(int nrow__, int ncol__, std::complex* mtrx__, float* a__); + +void +add_checksum_gpu_double(void const* wf__, int ld__, int num_rows_loc__, int nwf__, void* result__); + +void +add_checksum_gpu_float(void const* wf__, int ld__, int num_rows_loc__, int nwf__, void* result__); + + +void +inner_diag_local_gpu_double_complex_double(void const* wf1__, int ld1__, void const* wf2__, int ld2__, int ngv_loc__, + int nwf__, void* result__); + +void +inner_diag_local_gpu_double_double(void const* wf1__, int ld1__, void const* wf2__, int ld2__, int ngv_loc__, + int nwf__, int reduced__, void* result__); + +void +axpby_gpu_double_complex_double(int nwf__, void const* alpha__, void const* x__, int ld1__, + void const* beta__, void* y__, int ld2__, int ngv_loc__); + +void +axpby_gpu_double_double(int nwf__, void const* alpha__, void const* x__, int ld1__, + void const* beta__, void* y__, int ld2__, int ngv_loc__); + +} +#endif + +/// Add checksum for the arrays on GPUs. +template +auto checksum_gpu(std::complex const* wf__, int ld__, int num_rows_loc__, int nwf__) +{ + std::complex cs{0}; +#if defined(SIRIUS_GPU) + sddk::mdarray, 1> cs1(nwf__, sddk::memory_t::host, "checksum"); + cs1.allocate(sddk::memory_t::device).zero(sddk::memory_t::device); + + if (std::is_same::value) { + add_checksum_gpu_float(wf__, ld__, num_rows_loc__, nwf__, cs1.at(sddk::memory_t::device)); + } else if (std::is_same::value) { + add_checksum_gpu_double(wf__, ld__, num_rows_loc__, nwf__, cs1.at(sddk::memory_t::device)); + } else { + std::stringstream s; + s << "Precision type not yet implemented"; + RTE_THROW(s); + } + cs1.copy_to(sddk::memory_t::host); + cs = cs1.checksum(); #endif + return cs; +} -const int sddk_inner_default_block_size = 1024; -const int sddk_trans_default_block_size = 2048; +/// Namespace for the wave-functions. +namespace wf { -namespace sddk { +template +class strong_type +{ + private: + T val_; + public: + explicit strong_type(T const& val__) + : val_{val__} + { + } -// C++ wrappers for gpu kernels -void add_square_sum_gpu(std::complex const* wf__, int num_rows_loc__, int nwf__, int reduced__, int mpi_rank__, double* result__); -void add_square_sum_gpu(std::complex const* wf__, int num_rows_loc__, int nwf__, int reduced__, int mpi_rank__, float* result__); -void scale_matrix_columns_gpu(int nrow__, int ncol__, std::complex* mtrx__, double* a__); -void scale_matrix_columns_gpu(int nrow__, int ncol__, std::complex* mtrx__, float* a__); + explicit strong_type(T&& val__) + : val_{std::move(val__)} + { + } + + T const& get() const + { + return val_; + } -/// Helper class to wrap spin index range. -/** Depending on the collinear or non-collinear case, the spin index range of the wave-functions is either - * [0, 0] or [1, 1] (trivial cases of single spin channel) or [0, 1] (spinor wave-functions). */ -class spin_range : public std::vector + operator T() const + { + return val_; + } + bool operator!=(strong_type const& rhs__) + { + return this->val_ != rhs__.val_; + } + + bool operator==(strong_type const& rhs__) + { + return this->val_ == rhs__.val_; + } + + strong_type& operator++(int) + { + this->val_++; + return *this; + } +}; + +using spin_index = strong_type; +using atom_index = strong_type; +using band_index = strong_type; + +using num_bands = strong_type; +using num_spins = strong_type; +using num_mag_dims = strong_type; + +/// Describe a range of bands. +class band_range { private: - int idx_; + int begin_; + int end_; public: - explicit spin_range(int idx__) - : idx_(idx__) + band_range(int begin__, int end__) + : begin_{begin__} + , end_{end__} { - if (!(idx_ == 0 || idx_ == 1 || idx_ == 2)) { - throw std::runtime_error("wrong spin index"); - } - if (idx_ == 2) { - this->reserve(2); - this->push_back(0); - this->push_back(1); + RTE_ASSERT(begin_ >= 0); + RTE_ASSERT(end_ >= 0); + RTE_ASSERT(begin_ <= end_); + } + band_range(int size__) + : begin_{0} + , end_{size__} + { + RTE_ASSERT(size__ >= 0); + } + inline auto begin() const + { + return begin_; + } + inline auto end() const + { + return end_; + } + inline auto size() const + { + return end_ - begin_; + } +}; + +/// Describe a range of spins. +/** Only 3 combinations of spin range are allowed: + - [0, 1) + - [1, 2) + - [0, 2) +*/ +class spin_range +{ + private: + int begin_; + int end_; + int spinor_index_; + public: + spin_range(int begin__, int end__) + : begin_{begin__} + , end_{end__} + { + RTE_ASSERT(begin_ >= 0); + RTE_ASSERT(end_ >= 0); + RTE_ASSERT(begin_ <= end_); + RTE_ASSERT(end_ <= 2); + /* if size of the spin range is 2, this is a full-spinor case */ + if (this->size() == 2) { + spinor_index_ = 0; } else { - this->reserve(1); - this->push_back(idx_); + spinor_index_ = begin_; } } - inline int operator()() const + spin_range(int ispn__) + : begin_{ispn__} + , end_{ispn__ + 1} + , spinor_index_{ispn__} + { + RTE_ASSERT(begin_ >= 0); + RTE_ASSERT(end_ >= 0); + RTE_ASSERT(begin_ <= end_); + RTE_ASSERT(end_ <= 2); + } + inline auto begin() const + { + return spin_index(begin_); + } + inline auto end() const { - return idx_; + return spin_index(end_); } + inline int size() const + { + return end_ - begin_; + } + inline int spinor_index() const + { + return spinor_index_; + } +}; + +enum class copy_to : unsigned int +{ + none = 0b0000, + device = 0b0001, + host = 0b0010 }; +inline copy_to operator|(copy_to a__, copy_to b__) +{ + return static_cast(static_cast(a__) | static_cast(b__)); +} -//TODO introduce band range to desctibe a set of bands in the interval [N1, N2] +/// Helper class to allocate and copy wave-functions to/from device. +class device_memory_guard +{ + private: + void* obj_{nullptr}; + sddk::memory_t mem_{sddk::memory_t::host}; + copy_to copy_to_{wf::copy_to::none}; + std::function handler_; -/// Wave-functions representation. -/** Wave-functions consist of two parts: plane-wave part and mufin-tin part. Both are the matrix_storage objects - * with the slab distribution. Wave-functions have one or two spin components. In case of collinear magnetism - * each component represents a pure (up- or dn-) spinor state and they are independent. In non-collinear case - * the two components represent a full spinor state. - * - * In case of collinear magnetism we can work with auxiliary scalar wave-functions and update up- or dn- components - * of pure spinor wave-functions independently. We can also apply uu or dd block of Hamiltonian. In this case it is - * reasonable to implement the following convention: for scalar wave-function (num_sc = 1) it's value is returned - * for any spin index (ispn = 0 or ispn = 1). - * - * Example below shows how the wave-functions are used: - - \code{.cpp} - // alias for wave-functions - auto& psi = kp__->spinor_wave_functions(); - // create hpsi - Wave_functions hpsi(kp__->gkvec_partition(), ctx_.num_bands(), num_sc); - // create hpsi - Wave_functions spsi(kp__->gkvec_partition(), ctx_.num_bands(), num_sc); - - // if preferred memory is on GPU - if (is_device_memory(ctx_.preferred_memory_t())) { - // alias for memory pool - auto& mpd = ctx_.mem_pool(memory_t::device); - for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { - // allocate GPU memory - psi.pw_coeffs(ispn).allocate(mpd); - // copy to GPU - psi.pw_coeffs(ispn).copy_to(memory_t::device, 0, ctx_.num_bands()); - } - // set the preferred memory type - psi.preferred_memory_t(ctx_.preferred_memory_t()); - // allocate hpsi and spsi on GPU - for (int i = 0; i < num_sc; i++) { - hpsi.pw_coeffs(i).allocate(mpd); - spsi.pw_coeffs(i).allocate(mpd); - } - // set preferred memory for hpsi - hpsi.preferred_memory_t(ctx_.preferred_memory_t()); - // set preferred memory for spsi - spsi.preferred_memory_t(ctx_.preferred_memory_t()); - } - // prepare beta projectors - kp__->beta_projectors().prepare(); - for (int ispin_step = 0; ispin_step < ctx_.num_spin_dims(); ispin_step++) { - if (nc_mag) { - // apply Hamiltonian and S operators to both components of wave-functions - H__.apply_h_s(kp__, 2, 0, ctx_.num_bands(), psi, &hpsi, &spsi); - } else { - // apply Hamiltonian and S operators to a single components of wave-functions - H__.apply_h_s(kp__, ispin_step, 0, ctx_.num_bands(), psi, &hpsi, &spsi); - } + device_memory_guard(device_memory_guard const&) = delete; + device_memory_guard& operator=(device_memory_guard const&) = delete; + public: + device_memory_guard() + { + } - for (int ispn = 0; ispn < num_sc; ispn++) { - // copy to host if needed - if (is_device_memory(ctx_.preferred_memory_t())) { - hpsi.copy_to(ispn, memory_t::host, 0, ctx_.num_bands()); - spsi.copy_to(ispn, memory_t::host, 0, ctx_.num_bands()); + template + device_memory_guard(T const& obj__, sddk::memory_t mem__, copy_to copy_to__) + : obj_{const_cast(&obj__)} + , mem_{mem__} + , copy_to_{copy_to__} + { + if (is_device_memory(mem_)) { + auto obj = static_cast(obj_); + obj->allocate(mem_); + if (static_cast(copy_to_) & static_cast(copy_to::device)) { + obj->copy_to(mem_); } } - // do something with hpsi and spsi + handler_ = [](void* p__, sddk::memory_t mem__, wf::copy_to copy_to__) + { + if (p__) { + auto obj = static_cast(p__); + if (is_device_memory(mem__)) { + if (static_cast(copy_to__) & static_cast(copy_to::host)) { + obj->copy_to(sddk::memory_t::host); + } + obj->deallocate(mem__); + } + } + }; + } + device_memory_guard(device_memory_guard&& src__) + { + this->obj_ = src__.obj_; + src__.obj_ = nullptr; + this->handler_ = src__.handler_; + this->mem_ = src__.mem_; + this->copy_to_ = src__.copy_to_; } - // free beta-projectors - kp__->beta_projectors().dismiss(); - if (is_device_memory(ctx_.preferred_memory_t())) { - for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { - // deallocate wave-functions on GPU - psi.pw_coeffs(ispn).deallocate(memory_t::device); + device_memory_guard& operator=(device_memory_guard&& src__) + { + if (this != &src__) { + this->obj_ = src__.obj_; + src__.obj_ = nullptr; + this->handler_ = src__.handler_; + this->mem_ = src__.mem_; + this->copy_to_ = src__.copy_to_; } - // set preferred memory to CPU - psi.preferred_memory_t(memory_t::host); + return *this; } - \endcode - */ -template // template type is using real type that determine the precision, wavefunction is always complex -class Wave_functions + + ~device_memory_guard() + { + handler_(obj_, mem_, copy_to_); + } +}; + +/* forward declaration */ +template +class Wave_functions_fft; + +/// Base class for the wave-functions. +/** Wave-functions are represented by a set of plane-wave and muffin-tin coefficients stored consecutively in a 2D array. + * The leading dimensions of this array is a sum of the number of plane-waves and the number of muffin-tin coefficients. + \verbatim + + band index + +-----------+ + | | + | | + ig | PW part | + | | + | | + +-----------+ + | | + xi | MT part | + | | + +-----------+ + + + \endverbatim + */ +template +class Wave_functions_base { - private: - /// Communicator used to distribute G+k vectors and atoms. - Communicator const& comm_; + protected: + /// Local number of plane-wave coefficients. + int num_pw_{0}; + /// Local number of muffin-tin coefficients. + int num_mt_{0}; + /// Number of magnetic dimensions (0, 1, or 3). + /** This helps to distinguish between non-magnetic, collinear and full spinor wave-functions. */ + num_mag_dims num_md_{0}; + /// Total number of wave-functions. + num_bands num_wf_{0}; + /// Number of spin components (1 or 2). + num_spins num_sc_{0}; + /// Friend class declaration. + /** Wave_functions_fft needs access to data to alias the pointers and avoid copy in trivial cases. */ + friend class Wave_functions_fft; + /// Data storage for the wave-functions. + /** Wave-functions are stored as two independent arrays for spin-up and spin-dn. The planewave and muffin-tin + coefficients are stored consecutively. */ + std::array, 2>, 2> data_; - /// G+k vectors of the wave-function. - Gvec_partition const& gkvecp_; + public: + /// Constructor. + Wave_functions_base() + { + } + /// Constructor. + Wave_functions_base(int num_pw__, int num_mt__, num_mag_dims num_md__, num_bands num_wf__, + sddk::memory_t default_mem__) + : num_pw_{num_pw__} + , num_mt_{num_mt__} + , num_md_{num_md__} + , num_wf_{num_wf__} + { + if (!(num_md_.get() == 0 || num_md_.get() == 1 || num_md_.get() == 3)) { + RTE_THROW("wrong number of magnetic dimensions"); + } - splindex spl_num_atoms_; + if (num_md_.get() == 0) { + num_sc_ = num_spins(1); + } else { + num_sc_ = num_spins(2); + } + for (int is = 0; is < num_sc_.get(); is++) { + data_[is] = sddk::mdarray, 2>(num_pw_ + num_mt_, num_wf_.get(), default_mem__, + "Wave_functions_base::data_"); + } + } - /// Distribution of muffin-tin coefficients between ranks. - block_data_descriptor mt_coeffs_distr_; + /// Return an instance of the memory guard. + /** When the instance is created, it allocates the GPU memory and optionally copies data to the GPU. When the + instance is destroyed, the data is optionally copied to host and GPU memory is deallocated. */ + auto memory_guard(sddk::memory_t mem__, wf::copy_to copy_to__ = copy_to::none) const + { + return device_memory_guard(*this, mem__, copy_to__); + } - std::vector offset_mt_coeffs_; + /// Return number of spin components. + inline auto num_sc() const + { + return num_sc_; + } - /// Total number of muffin-tin coefficients. - int num_mt_coeffs_{0}; + /// Return number of magnetic dimensions. + inline auto num_md() const + { + return num_md_; + } - /// Total number of wave-functions. - int num_wf_{0}; + /// Return number of wave-functions. + inline auto num_wf() const + { + return num_wf_; + } - /// Number of spin components (1 or 2). - int num_sc_{1}; + /// Return leading dimensions of the wave-functions coefficients array. + inline auto ld() const + { + return num_pw_ + num_mt_; + } - /// Plane-wave part of wave-functions. - std::array, matrix_storage_t::slab>>, 2> pw_coeffs_{ - {nullptr, nullptr}}; + /// Return the actual spin index of the wave-functions. + /** Return 0 if the wave-functions are non-magnetic, otherwise return the input spin index. */ + inline auto actual_spin_index(spin_index s__) const + { + if (num_sc_.get() == 2) { + return s__; + } else { + return spin_index(0); + } + } - /// Muffin-tin part of wave-functions. - std::array, matrix_storage_t::slab>>, 2> mt_coeffs_{ - {nullptr, nullptr}}; + /// Zero a spin component of the wave-functions in a band range. + inline void + zero(sddk::memory_t mem__, spin_index s__, band_range br__) + { + if (this->ld()) { + if (is_host_memory(mem__)) { + for (int ib = br__.begin(); ib < br__.end(); ib++) { + auto ptr = data_[s__.get()].at(mem__, 0, ib); + std::fill(ptr, ptr + this->ld(), 0); + } + } + if (is_device_memory(mem__)) { + acc::zero(data_[s__.get()].at(mem__, 0, br__.begin()), this->ld(), this->ld(), br__.size()); + } + } + } - bool has_mt_{false}; + /// Zero all wave-functions. + inline void + zero(sddk::memory_t mem__) + { + if (this->ld()) { + for (int is = 0; is < num_sc_.get(); is++) { + data_[is].zero(mem__); + } + } + } - /// Preferred memory type for this wave functions. - memory_t preferred_memory_t_{memory_t::host}; + /// Return const pointer to the wave-function coefficient at a given index, spin and band + inline std::complex const* + at(sddk::memory_t mem__, int i__, spin_index s__, band_index b__) const + { + return data_[s__.get()].at(mem__, i__, b__.get()); + } - /// Lower boundary for the spin component index by spin index. - inline int s0(int ispn__) const + /// Return pointer to the wave-function coefficient at a given index, spin and band + inline auto + at(sddk::memory_t mem__, int i__, spin_index s__, band_index b__) { - assert(ispn__ == 0 || ispn__ == 1 || ispn__ == 2); + return data_[s__.get()].at(mem__, i__, b__.get()); + } - if (ispn__ == 2) { - return 0; - } else { - return ispn__; + /// Allocate wave-functions. + /** This function is primarily called by a memory_guard to allocate GPU memory. */ + inline void + allocate(sddk::memory_t mem__) + { + for (int s = 0; s < num_sc_.get(); s++) { + data_[s].allocate(mem__); } } - /// Upper boundary for the spin component index by spin index. - inline int s1(int ispn__) const + /// Deallocate wave-functions. + /** This function is primarily called by a memory_guard to deallocate GPU memory. */ + inline void + deallocate(sddk::memory_t mem__) { - assert(ispn__ == 0 || ispn__ == 1 || ispn__ == 2); + for (int s = 0; s < num_sc_.get(); s++) { + data_[s].deallocate(mem__); + } + } - if (ispn__ == 2) { - return (num_sc_ == 1) ? 0 : 1; - } else { - return ispn__; + /// Copy date to host or device. + inline void + copy_to(sddk::memory_t mem__) + { + for (int s = 0; s < num_sc_.get(); s++) { + data_[s].copy_to(mem__); } } +}; - /// Spin-component index by spin index. - inline int isc(int ispn__) const +/// Wave-functions for the muffin-tin part of LAPW. +template +class Wave_functions_mt : public Wave_functions_base +{ + protected: + /// Communicator that is used to split atoms between MPI ranks. + sddk::Communicator const& comm_; + /// Total number of atoms. + int num_atoms_{0}; + /// Distribution of atoms between MPI ranks. + sddk::splindex spl_num_atoms_; + /// Local size of muffin-tin coefficients for each rank. + /** Each rank stores local fraction of atoms. Each atom has a set of MT coefficients. */ + sddk::block_data_descriptor mt_coeffs_distr_; + /// Local offset in the block of MT coefficients for current rank. + /** The size of the vector is equal to the local number of atoms for the current rank. */ + std::vector offset_in_local_mt_coeffs_; + /// Numbef of muffin-tin coefficients for each atom. + std::vector num_mt_coeffs_; + + /// Calculate the local number of muffin-tin coefficients. + /** Compute the local fraction of atoms and then sum the muffin-tin coefficients for this fraction. */ + static int get_local_num_mt_coeffs(std::vector num_mt_coeffs__, sddk::Communicator const& comm__) + { + int num_atoms = static_cast(num_mt_coeffs__.size()); + sddk::splindex spl_atoms(num_atoms, comm__.size(), comm__.rank()); + auto it_begin = num_mt_coeffs__.begin() + spl_atoms.global_offset(); + auto it_end = it_begin + spl_atoms.local_size(); + return std::accumulate(it_begin, it_end, 0); + } + + /// Construct without muffin-tin part. + Wave_functions_mt(sddk::Communicator const& comm__, num_mag_dims num_md__, num_bands num_wf__, + sddk::memory_t default_mem__, int num_pw__) + : Wave_functions_base(num_pw__, 0, num_md__, num_wf__, default_mem__) + , comm_{comm__} + , spl_num_atoms_{sddk::splindex(num_atoms_, comm_.size(), comm_.rank())} { - assert(ispn__ == 0 || ispn__ == 1); - return (num_sc_ == 1) ? 0 : ispn__; } public: - /// Constructor for PW wave-functions. - /** Memory to store plane-wave coefficients is allocated from the heap. */ - Wave_functions(Gvec_partition const& gkvecp__, int num_wf__, memory_t preferred_memory_t__, int num_sc__ = 1); + /// Constructor. + Wave_functions_mt() + { + } - /// Constructor for PW wave-functions. - /** Memory to store plane-wave coefficients is allocated from the memory pool. */ - Wave_functions(memory_pool& mp__, Gvec_partition const& gkvecp__, int num_wf__, memory_t preferred_memory_t__, - int num_sc__ = 1); + /// Constructor. + Wave_functions_mt(sddk::Communicator const& comm__, std::vector num_mt_coeffs__, num_mag_dims num_md__, + num_bands num_wf__, sddk::memory_t default_mem__, int num_pw__ = 0) + : Wave_functions_base(num_pw__, get_local_num_mt_coeffs(num_mt_coeffs__, comm__), num_md__, num_wf__, + default_mem__) + , comm_{comm__} + , num_atoms_{static_cast(num_mt_coeffs__.size())} + , spl_num_atoms_{sddk::splindex(num_atoms_, comm_.size(), comm_.rank())} + , num_mt_coeffs_{num_mt_coeffs__} + { + mt_coeffs_distr_ = sddk::block_data_descriptor(comm_.size()); - /// Constructor for LAPW wave-functions. - Wave_functions(Gvec_partition const& gkvecp__, int num_atoms__, std::function mt_size__, int num_wf__, - memory_t preferred_memory_t__, int num_sc__ = 1); + for (int ia = 0; ia < num_atoms_; ia++) { + int rank = spl_num_atoms_.local_rank(ia); + if (rank == comm_.rank()) { + offset_in_local_mt_coeffs_.push_back(mt_coeffs_distr_.counts[rank]); + } + /* increment local number of MT coeffs. for a given rank */ + mt_coeffs_distr_.counts[rank] += num_mt_coeffs__[ia]; + } + mt_coeffs_distr_.calc_offsets(); + } - /// Constructor for LAPW wave-functions. - /** Memory to store wave-function coefficients is allocated from the memory pool. */ - Wave_functions(memory_pool& mp__, Gvec_partition const& gkvecp__, int num_atoms__, - std::function mt_size__, int num_wf__, - memory_t preferred_memory_t__, int num_sc__ = 1); + /// Return reference to the coefficient by atomic orbital index, atom, spin and band indices. + inline auto& + mt_coeffs(int xi__, atom_index ia__, spin_index ispn__, band_index i__) + { + return this->data_[ispn__.get()](this->num_pw_ + xi__ + offset_in_local_mt_coeffs_[ia__.get()], i__.get()); + } - /// Communicator of the G+k vector distribution. - Communicator const& comm() const + /// Return const reference to the coefficient by atomic orbital index, atom, spin and band indices. + inline auto const& + mt_coeffs(int xi__, atom_index ia__, spin_index ispn__, band_index i__) const { - return comm_; + return this->data_[ispn__.get()](this->num_pw_ + xi__ + offset_in_local_mt_coeffs_[ia__.get()], i__.get()); } - /// G+k vectors of the wave-functions. - Gvec const& gkvec() const + using Wave_functions_base::at; + + /// Return const pointer to the coefficient by atomic orbital index, atom, spin and band indices. + inline std::complex const* + at(sddk::memory_t mem__, int xi__, atom_index ia__, spin_index s__, band_index b__) const { - return gkvecp_.gvec(); + return this->data_[s__.get()].at(mem__, this->num_pw_ + xi__ + offset_in_local_mt_coeffs_[ia__.get()], b__.get()); } - Gvec_partition const& gkvec_partition() const + /// Return pointer to the coefficient by atomic orbital index, atom, spin and band indices. + inline auto + at(sddk::memory_t mem__, int xi__, atom_index ia__, spin_index s__, band_index b__) { - return gkvecp_; + return this->data_[s__.get()].at(mem__, this->num_pw_ + xi__ + offset_in_local_mt_coeffs_[ia__.get()], b__.get()); } - inline int num_mt_coeffs() const + /// Return a split index for the number of atoms. + inline auto const& + spl_num_atoms() const { - return num_mt_coeffs_; + return spl_num_atoms_; } - inline matrix_storage, matrix_storage_t::slab>& pw_coeffs(int ispn__) + /// Copy muffin-tin coefficients to host or GPU memory. + /** This functionality is required for the application of LAPW overlap operator to the wave-functions, which + * is always done on the CPU. */ + inline void + copy_mt_to(sddk::memory_t mem__, spin_index s__, band_range br__) { - return *pw_coeffs_[isc(ispn__)]; + if (this->ld() && this->num_mt_) { + auto ptr = this->data_[s__.get()].at(sddk::memory_t::host, this->num_pw_, br__.begin()); + auto ptr_gpu = this->data_[s__.get()].at(sddk::memory_t::device, this->num_pw_, br__.begin()); + if (is_device_memory(mem__)) { + acc::copyin(ptr_gpu, this->ld(), ptr, this->ld(), this->num_mt_, br__.size()); + } + if (is_host_memory(mem__)) { + acc::copyout(ptr, this->ld(), ptr_gpu, this->ld(), this->num_mt_, br__.size()); + } + } } - inline matrix_storage, matrix_storage_t::slab> const& pw_coeffs(int ispn__) const + /// Return COSTA layout for the muffin-tin part for a given spin index and band range. + auto + grid_layout_mt(spin_index ispn__, band_range b__) { - return *pw_coeffs_[isc(ispn__)]; + std::vector rowsplit(comm_.size() + 1); + rowsplit[0] = 0; + for (int i = 0; i < comm_.size(); i++) { + rowsplit[i + 1] = rowsplit[i] + mt_coeffs_distr_.counts[i]; + } + std::vector colsplit({0, b__.size()}); + std::vector owners(comm_.size()); + for (int i = 0; i < comm_.size(); i++) { + owners[i] = i; + } + costa::block_t localblock; + localblock.data = this->num_mt_ ? + this->data_[ispn__.get()].at(sddk::memory_t::host, this->num_pw_, b__.begin()) : nullptr; + localblock.ld = this->ld(); + localblock.row = comm_.rank(); + localblock.col = 0; + + return costa::custom_layout>(comm_.size(), 1, rowsplit.data(), colsplit.data(), + owners.data(), 1, &localblock, 'C'); } - inline matrix_storage, matrix_storage_t::slab>& mt_coeffs(int ispn__) + /// Compute checksum of the muffin-tin coefficients. + inline auto + checksum_mt(sddk::memory_t mem__, spin_index s__, band_range br__) const { - return *mt_coeffs_[isc(ispn__)]; + std::complex cs{0}; + if (this->num_mt_ && br__.size()) { + if (is_host_memory(mem__)) { + for (int ib = br__.begin(); ib < br__.end(); ib++) { + auto ptr = this->data_[s__.get()].at(mem__, this->num_pw_, ib); + cs = std::accumulate(ptr, ptr + this->num_mt_, cs); + } + } + if (is_device_memory(mem__)) { + auto ptr = this->data_[s__.get()].at(mem__, this->num_pw_, br__.begin()); + cs = checksum_gpu(ptr, this->ld(), this->num_mt_, br__.size()); + } + } + comm_.allreduce(&cs, 1); + return cs; } - inline matrix_storage, matrix_storage_t::slab> const& mt_coeffs(int ispn__) const + /// Return vector of muffin-tin coefficients for all atoms. + auto + num_mt_coeffs() const { - return *mt_coeffs_[isc(ispn__)]; + return num_mt_coeffs_; } - inline bool has_mt() const + /// Return const reference to the communicator. + auto const& + comm() const { - return has_mt_ && (mt_coeffs_distr_.counts[comm_.rank()] > 0); + return comm_; } +}; - inline int num_wf() const +/// Wave-functions representation. +/** Wave-functions consist of two parts: plane-wave part and mufin-tin part. Wave-functions have one or two spin + * components. In case of collinear magnetism each component represents a pure (up- or dn-) spinor state and they + * are independent. In non-collinear case the two components represent a full spinor state. + * + * \tparam T Precision type of the wave-functions (double or float). + */ +template +class Wave_functions : public Wave_functions_mt +{ + private: + /// Pointer to G+k- vectors object. + std::shared_ptr gkvec_; + public: + /// Constructor for pure plane-wave functions. + Wave_functions(std::shared_ptr gkvec__, num_mag_dims num_md__, num_bands num_wf__, sddk::memory_t default_mem__) + : Wave_functions_mt(gkvec__->comm(), num_md__, num_wf__, default_mem__, gkvec__->count()) + , gkvec_{gkvec__} { - return num_wf_; } - inline int num_sc() const + /// Constructor for wave-functions with plane-wave and muffin-tin parts (LAPW case). + Wave_functions(std::shared_ptr gkvec__, std::vector num_mt_coeffs__, num_mag_dims num_md__, + num_bands num_wf__, sddk::memory_t default_mem__) + : Wave_functions_mt(gkvec__->comm(), num_mt_coeffs__, num_md__, num_wf__, default_mem__, gkvec__->count()) + , gkvec_{gkvec__} { - return num_sc_; } - inline splindex const& spl_num_atoms() const + /// Return reference to the plane-wave coefficient for a given plane-wave, spin and band indices. + inline auto& + pw_coeffs(int ig__, spin_index ispn__, band_index i__) { - return spl_num_atoms_; + return this->data_[ispn__.get()](ig__, i__.get()); + } + + inline auto& pw_coeffs(spin_index ispn__) + { + return this->data_[ispn__.get()]; } - inline int offset_mt_coeffs(int ialoc__) const + inline const auto& pw_coeffs(spin_index ispn__) const { - return offset_mt_coeffs_[ialoc__]; + return this->data_[ispn__.get()]; } - inline memory_t preferred_memory_t() const + /// Return COSTA layout for the plane-wave part for a given spin index and band range. + auto + grid_layout_pw(spin_index ispn__, band_range b__) const { - return preferred_memory_t_; + PROFILE("sirius::wf::Wave_functions_fft::grid_layout_pw"); + + std::vector rowsplit(this->comm_.size() + 1); + rowsplit[0] = 0; + for (int i = 0; i < this->comm_.size(); i++) { + rowsplit[i + 1] = rowsplit[i] + gkvec_->gvec_count(i); + } + std::vector colsplit({0, b__.size()}); + std::vector owners(this->comm_.size()); + for (int i = 0; i < this->comm_.size(); i++) { + owners[i] = i; + } + costa::block_t localblock; + localblock.data = const_cast*>(this->data_[ispn__.get()].at(sddk::memory_t::host, 0, b__.begin())); + localblock.ld = this->ld(); + localblock.row = this->comm_.rank(); + localblock.col = 0; + + return costa::custom_layout>(this->comm_.size(), 1, rowsplit.data(), colsplit.data(), + owners.data(), 1, &localblock, 'C'); } - inline auto checksum(device_t pu__, int ispn__, int i0__, int n__) const + auto const& gkvec() const { - return checksum_pw(pu__, ispn__, i0__, n__) + checksum_mt(pu__, ispn__, i0__, n__); + RTE_ASSERT(gkvec_ != nullptr); + return *gkvec_; } - inline void zero(device_t pu__, int ispn__, int i0__, int n__) // TODO: pass memory_t + inline auto checksum_pw(sddk::memory_t mem__, spin_index s__, band_range b__) const { - this->zero_pw(pu__, ispn__, i0__, n__); - this->zero_mt(pu__, ispn__, i0__, n__); + std::complex cs{0}; + if (b__.size()) { + if (is_host_memory(mem__)) { + for (int ib = b__.begin(); ib < b__.end(); ib++) { + auto ptr = this->data_[s__.get()].at(mem__, 0, ib); + cs = std::accumulate(ptr, ptr + this->num_pw_, cs); + } + } + if (is_device_memory(mem__)) { + auto ptr = this->data_[s__.get()].at(mem__, 0, b__.begin()); + cs = checksum_gpu(ptr, this->ld(), this->num_pw_, b__.size()); + } + this->comm_.allreduce(&cs, 1); + } + return cs; } - inline void zero(device_t pu__) + inline auto checksum(sddk::memory_t mem__, spin_index s__, band_range b__) const { - for (int is = 0; is < this->num_sc(); is++) { - this->zero(pu__, is, 0, this->num_wf()); + return this->checksum_pw(mem__, s__, b__) + this->checksum_mt(mem__, s__, b__); + } + + inline auto checksum(sddk::memory_t mem__, band_range b__) const + { + std::complex cs{0}; + for (int is = 0; is < this->num_sc().get(); is++) { + cs += this->checksum(mem__, wf::spin_index(is), b__); + } + return cs; + } +}; + +struct shuffle_to +{ + /// Do nothing. + static const unsigned int none = 0b0000; + /// Shuffle to FFT distribution. + static const unsigned int fft_layout = 0b0001; + /// Shuffle to back to default slab distribution. + static const unsigned int wf_layout = 0b0010; +}; + +/// Wave-fucntions in the FFT-friendly distribution. +/** To reduce the FFT MPI communication volume, it is often beneficial to redistribute wave-functions from + * a default slab layout to a FFT-friendly layout. Often this is a full swap from G-vector to band distribution. + * In general this is a redistribution of data from [N x 1] to [M x K] MPI grids. + \verbatim + band index band index band index + ┌──────────────┐ ┌───────┬──────┐ ┌───┬───┬───┬──┐ + │ │ │ │ │ │ │ │ │ │ + │ │ │ │ │ │ │ │ │ │ + ├──────────────┤ │ │ │ │ │ │ │ │ + │ │ │ │ │ │ │ │ │ │ + │ │ partial │ │ │ full │ │ │ │ │ + │ │ swap │ │ │ swap │ │ │ │ │ + G+k index ├──────────────┤ -> ├───────┼──────┤ -> ├───┼───┼───┼──┤ + (distributed) │ │ │ │ │ │ │ │ │ │ + │ │ │ │ │ │ │ │ │ │ + │ │ │ │ │ │ │ │ │ │ + ├──────────────┤ │ │ │ │ │ │ │ │ + │ │ │ │ │ │ │ │ │ │ + │ │ │ │ │ │ │ │ │ │ + └──────────────┘ └───────┴──────┘ └───┴───┴───┴──┘ + + \endverbatim + + Wave-functions in FFT distribution are scalar with only one spin component. + + * \tparam T Precision type of the wave-functions (double or float). + */ +template +class Wave_functions_fft : public Wave_functions_base +{ + private: + /// Pointer to FFT-friendly G+k vector deistribution. + std::shared_ptr gkvec_fft_; + /// Split number of wave-functions between column communicator. + sddk::splindex spl_num_wf_; + /// Pointer to the original wave-functions. + Wave_functions* wf_{nullptr}; + /// Spin-index of the wave-function component + spin_index s_{0}; + /// Range of bands in the input wave-functions to be swapped. + band_range br_{0}; + /// Direction of the reshuffling: to FFT layout or back to WF layout or both. + unsigned int shuffle_flag_{0}; + /// True if the FFT wave-functions are also available on the device. + bool on_device_{false}; + + /// Return COSTA grd layout description. + auto grid_layout(int n__) + { + PROFILE("sirius::wf::Wave_functions_fft::grid_layout"); + + auto& comm_row = gkvec_fft_->comm_fft(); + auto& comm_col = gkvec_fft_->comm_ortho_fft(); + + std::vector rowsplit(comm_row.size() + 1); + rowsplit[0] = 0; + for (int i = 0; i < comm_row.size(); i++) { + rowsplit[i + 1] = rowsplit[i] + gkvec_fft_->gvec_count_fft(i); + } + + std::vector colsplit(comm_col.size() + 1); + colsplit[0] = 0; + for (int i = 0; i < comm_col.size(); i++) { + colsplit[i + 1] = colsplit[i] + spl_num_wf_.local_size(i); } + + std::vector owners(gkvec_fft_->gvec().comm().size()); + for (int i = 0; i < gkvec_fft_->gvec().comm().size(); i++) { + owners[i] = i; + } + costa::block_t localblock; + localblock.data = this->data_[0].at(sddk::memory_t::host); + localblock.ld = this->ld(); + localblock.row = gkvec_fft_->comm_fft().rank(); + localblock.col = comm_col.rank(); + + return costa::custom_layout>(comm_row.size(), comm_col.size(), rowsplit.data(), + colsplit.data(), owners.data(), 1, &localblock, 'C'); } - // compute a dot, i.e. diag(this' * phi). - mdarray, 1> dot(device_t pu__, spin_range spins__, Wave_functions const &phi, int n__) const; + /// Shuffle wave-function to the FFT distribution. + void shuffle_to_fft_layout(spin_index ispn__, band_range b__) + { + PROFILE("shuffle_to_fft_layout"); + + auto sp = wf_->actual_spin_index(ispn__); + auto t0 = utils::time_now(); + if (false) { + auto layout_in = wf_->grid_layout_pw(sp, b__); + auto layout_out = this->grid_layout(b__.size()); + + costa::transform(layout_in, layout_out, 'N', sddk::linalg_const>::one(), + sddk::linalg_const>::zero(), wf_->gkvec().comm().mpi_comm()); + } else { + /* + * old implementation (to be removed when performance of COSTA is understood) + */ + auto& comm_col = gkvec_fft_->comm_ortho_fft(); + + auto ncol = sddk::splindex_base::block_size(b__.size(), comm_col.size()); + size_t sz = gkvec_fft_->gvec_count_fft() * ncol; + sddk::mdarray, 1> send_recv_buf(sz, sddk::get_memory_pool(sddk::memory_t::host), "send_recv_buf"); + + auto& row_distr = gkvec_fft_->gvec_fft_slab(); + + /* local number of columns */ + int n_loc = spl_num_wf_.local_size(); + + /* send and receive dimensions */ + sddk::block_data_descriptor sd(comm_col.size()), rd(comm_col.size()); + for (int j = 0; j < comm_col.size(); j++) { + sd.counts[j] = spl_num_wf_.local_size(j) * row_distr.counts[comm_col.rank()]; + rd.counts[j] = spl_num_wf_.local_size(comm_col.rank()) * row_distr.counts[j]; + } + sd.calc_offsets(); + rd.calc_offsets(); + + auto send_buf = (this->num_pw_ == 0) ? nullptr : wf_->data_[sp.get()].at(sddk::memory_t::host, 0, b__.begin()); + + { + comm_col.alltoall(send_buf, sd.counts.data(), sd.offsets.data(), send_recv_buf.at(sddk::memory_t::host), + rd.counts.data(), rd.offsets.data()); + } - // compute this[:, i] = alpha * phi[:, i] + beta * this[:, i] - template - void axpby(device_t pu__, spin_range spins__, Ta alpha, Wave_functions const &phi, Ta beta, int n__); + /* reorder received blocks */ + #pragma omp parallel for + for (int i = 0; i < n_loc; i++) { + for (int j = 0; j < comm_col.size(); j++) { + int offset = row_distr.offsets[j]; + int count = row_distr.counts[j]; + if (count) { + auto from = &send_recv_buf[offset * n_loc + count * i]; + std::copy(from, from + count, this->data_[0].at(sddk::memory_t::host, offset, i)); + } + } + } + } - // compute this[:, i] = phi[:, i] + beta[i] * this[:, i], kinda like an axpy - template - void xpby(device_t pu__, spin_range spins__, Wave_functions const &phi, std::vector const &betas, int n__); + if (env::print_performance() && wf_->gkvec().comm().rank() == 0) { + auto t = utils::time_interval(t0); + std::cout << "[transform_to_fft_layout] throughput: " + << 2 * sizeof(T) * wf_->gkvec().num_gvec() * b__.size() / std::pow(2.0, 30) / t << " Gb/sec" << std::endl; + } + } - // compute this[:, i] = alpha[i] * phi[:, i] + this[:, i] - template - void axpy(device_t pu__, spin_range spins__, std::vector const &alphas, Wave_functions const &phi, int n__); + /// Shuffle wave-function to the original slab layout. + void shuffle_to_wf_layout(spin_index ispn__, band_range b__) + { + PROFILE("shuffle_to_wf_layout"); - // compute this[:, ids[i]] = alpha[i] * phi[:, i] + this[:, i] - template - void axpy_scatter(device_t pu__, spin_range spins__, std::vector const &alphas, Wave_functions const &phi, std::vector const &ids, int n__); + auto sp = wf_->actual_spin_index(ispn__); + auto pp = env::print_performance(); - /// Compute the sum of squares of expansion coefficients. - /** The result is always returned in the host memory */ - mdarray sumsqr(device_t pu__, spin_range spins__, int n__) const; + auto t0 = utils::time_now(); + if (false) { + auto layout_in = this->grid_layout(b__.size()); + auto layout_out = wf_->grid_layout_pw(sp, b__); + costa::transform(layout_in, layout_out, 'N', sddk::linalg_const>::one(), + sddk::linalg_const>::zero(), wf_->gkvec().comm().mpi_comm()); + } else { + + auto& comm_col = gkvec_fft_->comm_ortho_fft(); - /// Copy values from another wave-function. - /** \param [in] pu Type of processging unit which copies data. - * \param [in] n Number of wave-functions to copy. - * \param [in] src Input wave-function. - * \param [in] ispn Spin component on source wave-functions. - * \param [in] i0 Starting index of wave-functions in src. - * \param [in] jspn Spin component on destination wave-functions. - * \param [in] j0 Starting index of wave-functions in destination. */ - void copy_from(device_t pu__, int n__, Wave_functions const& src__, int ispn__, int i0__, int jspn__, int j0__); + auto ncol = sddk::splindex_base::block_size(b__.size(), comm_col.size()); + size_t sz = gkvec_fft_->gvec_count_fft() * ncol; + sddk::mdarray, 1> send_recv_buf(sz, sddk::get_memory_pool(sddk::memory_t::host), "send_recv_buf"); - template - void copy_from(device_t pu__, int n__, Wave_functions const& src__, int ispn__, int i0__, int jspn__, int j0__) { - assert(ispn__ == 0 || ispn__ == 1); - assert(jspn__ == 0 || jspn__ == 1); - std::cout << "=== WARNING at line " << __LINE__ << " of file " << __FILE__ << " ===" << std::endl; - std::cout << " Copying Wavefunction with different type, possible lost of data precision" << std::endl; + auto& row_distr = gkvec_fft_->gvec_fft_slab(); - int ngv = pw_coeffs(jspn__).num_rows_loc(); - int nmt = has_mt() ? mt_coeffs(jspn__).num_rows_loc() : 0; + /* local number of columns */ + int n_loc = spl_num_wf_.local_size(); - switch (pu__) { - case device_t::CPU: { - /* copy PW part */ - std::copy(src__.pw_coeffs(ispn__).prime().at(memory_t::host, 0, i0__), - src__.pw_coeffs(ispn__).prime().at(memory_t::host, 0, i0__) + ngv * n__, - pw_coeffs(jspn__).prime().at(memory_t::host, 0, j0__)); - /* copy MT part */ - if (has_mt()) { - std::copy(src__.mt_coeffs(ispn__).prime().at(memory_t::host, 0, i0__), - src__.mt_coeffs(ispn__).prime().at(memory_t::host, 0, i0__) + nmt * n__, - mt_coeffs(jspn__).prime().at(memory_t::host, 0, j0__)); + /* reorder sending blocks */ + #pragma omp parallel for + for (int i = 0; i < n_loc; i++) { + for (int j = 0; j < comm_col.size(); j++) { + int offset = row_distr.offsets[j]; + int count = row_distr.counts[j]; + if (count) { + auto from = this->data_[0].at(sddk::memory_t::host, offset, i); + std::copy(from, from + count, &send_recv_buf[offset * n_loc + count * i]); + } } - break; } - case device_t::GPU: { - throw std::runtime_error("Copy mixed precision type not supported in device memory"); - break; + /* send and receive dimensions */ + sddk::block_data_descriptor sd(comm_col.size()), rd(comm_col.size()); + for (int j = 0; j < comm_col.size(); j++) { + sd.counts[j] = spl_num_wf_.local_size(comm_col.rank()) * row_distr.counts[j]; + rd.counts[j] = spl_num_wf_.local_size(j) * row_distr.counts[comm_col.rank()]; } + sd.calc_offsets(); + rd.calc_offsets(); + auto* recv_buf = (this->num_pw_ == 0) ? nullptr : wf_->data_[sp.get()].at(sddk::memory_t::host, 0, b__.begin()); + + comm_col.alltoall(send_recv_buf.at(sddk::memory_t::host), sd.counts.data(), sd.offsets.data(), recv_buf, + rd.counts.data(), rd.offsets.data()); + } + if (pp && wf_->gkvec().comm().rank() == 0) { + auto t = utils::time_interval(t0); + std::cout << "[transform_from_fft_layout] throughput: " + << 2 * sizeof(T) * wf_->gkvec().num_gvec() * b__.size() / std::pow(2.0, 30) / t << " Gb/sec" << std::endl; } } - /// Copy from and to preferred memory. - void copy_from(Wave_functions const& src__, int n__, int ispn__, int i0__, int jspn__, int j0__); + public: + /// Constructor. + Wave_functions_fft() + { + } - template - void copy_from(Wave_functions const& src__, int n__, int ispn__, int i0__, int jspn__, int j0__) { - assert(ispn__ == 0 || ispn__ == 1); - assert(jspn__ == 0 || jspn__ == 1); - std::cout << "=== WARNING at line " << __LINE__ << " of file " << __FILE__ << " ===" << std::endl; - std::cout << " Copying Wavefunction with different type, possible lost of data precision" << std::endl; + /// Constructor. + Wave_functions_fft(std::shared_ptr gkvec_fft__, Wave_functions& wf__, spin_index s__, + band_range br__, unsigned int shuffle_flag___) + : gkvec_fft_{gkvec_fft__} + , wf_{&wf__} + , s_{s__} + , br_{br__} + , shuffle_flag_{shuffle_flag___} + { + auto& comm_col = gkvec_fft_->comm_ortho_fft(); + spl_num_wf_ = sddk::splindex(br__.size(), comm_col.size(), comm_col.rank()); + this->num_mt_ = 0; + this->num_md_ = wf::num_mag_dims(0); + this->num_sc_ = wf::num_spins(1); + this->num_wf_ = wf::num_bands(spl_num_wf_.local_size()); + + auto sp = wf_->actual_spin_index(s__); + + /* special case when wave-functions are not redistributed */ + if (comm_col.size() == 1) { + auto i = wf::band_index(br__.begin()); + auto ptr = wf__.at(sddk::memory_t::host, 0, sp, i); + auto ptr_gpu = wf__.data_[sp.get()].on_device() ? wf__.at(sddk::memory_t::device, 0, sp, i) : nullptr; + if (ptr_gpu) { + on_device_ = true; + } + /* make alias to the fraction of the wave-functions */ + this->data_[0] = sddk::mdarray, 2>(ptr, ptr_gpu, wf__.ld(), this->num_wf_.get()); + this->num_pw_ = wf_->num_pw_; + } else { + /* do wave-functions swap */ + this->data_[0] = sddk::mdarray, 2>(gkvec_fft__->gvec_count_fft(), this->num_wf_.get(), + sddk::get_memory_pool(sddk::memory_t::host), "Wave_functions_fft.data"); + this->num_pw_ = gkvec_fft__->gvec_count_fft(); + + if (shuffle_flag_ & shuffle_to::fft_layout) { + if (wf__.data_[sp.get()].on_device()) { + /* copy block of wave-functions to host memory before calling COSTA */ + auto ptr = wf__.at(sddk::memory_t::host, 0, sp, wf::band_index(br__.begin())); + auto ptr_gpu = wf__.at(sddk::memory_t::device, 0, sp, wf::band_index(br__.begin())); + acc::copyout(ptr, wf__.ld(), ptr_gpu, wf__.ld(), wf__.num_pw_, br__.size()); + } + shuffle_to_fft_layout(s__, br__); + } + } + } - int ngv = pw_coeffs(jspn__).num_rows_loc(); - int nmt = has_mt() ? mt_coeffs(jspn__).num_rows_loc() : 0; + /// Move assignment operator. + Wave_functions_fft& operator=(Wave_functions_fft&& src__) + { + if (this != &src__) { + gkvec_fft_ = src__.gkvec_fft_; + spl_num_wf_ = src__.spl_num_wf_; + wf_ = src__.wf_; + src__.wf_ = nullptr; + s_ = src__.s_; + br_ = src__.br_; + shuffle_flag_ = src__.shuffle_flag_; + on_device_ = src__.on_device_; + this->num_pw_ = src__.num_pw_; + this->num_mt_ = src__.num_mt_; + this->num_md_ = src__.num_md_; + this->num_wf_ = src__.num_wf_; + this->num_sc_ = src__.num_sc_; + for (int is = 0; is < this->num_sc_.get(); is++) { + this->data_[is] = std::move(src__.data_[is]); + } + } + return *this; + } - copy(src__.preferred_memory_t(), src__.pw_coeffs(ispn__).prime().at(src__.preferred_memory_t(), 0, i0__), - preferred_memory_t(), pw_coeffs(jspn__).prime().at(preferred_memory_t(), 0, j0__), ngv * n__); - if (has_mt()) { - copy(src__.preferred_memory_t(), src__.mt_coeffs(ispn__).prime().at(src__.preferred_memory_t(), 0, i0__), - preferred_memory_t(), mt_coeffs(jspn__).prime().at(preferred_memory_t(), 0, j0__), nmt * n__); + /// Destructor. + ~Wave_functions_fft() + { + if (wf_) { + auto& comm_col = gkvec_fft_->comm_ortho_fft(); + if ((comm_col.size() != 1) && (shuffle_flag_ & shuffle_to::wf_layout)) { + shuffle_to_wf_layout(s_, br_); + auto sp = wf_->actual_spin_index(s_); + if (wf_->data_[sp.get()].on_device()) { + /* copy block of wave-functions to device memory after calling COSTA */ + auto ptr = wf_->at(sddk::memory_t::host, 0, sp, wf::band_index(br_.begin())); + auto ptr_gpu = wf_->at(sddk::memory_t::device, 0, sp, wf::band_index(br_.begin())); + acc::copyin(ptr_gpu, wf_->ld(), ptr, wf_->ld(), wf_->num_pw_, br_.size()); + } + } } } - /// Compute the checksum of the spin-components. - /** Checksum of the n wave-function spin components is computed starting from i0. - * Only plane-wave coefficients are considered. */ - std::complex checksum_pw(device_t pu__, int ispn__, int i0__, int n__) const; + /// Return local number of wave-functions. + /** Wave-function band index is distributed over the columns of MPI grid. Each group of FFT communiators + * is working on its local set of wave-functions. */ + int num_wf_local() const + { + return spl_num_wf_.local_size(); + } + + /// Return the split index for the number of wave-functions. + auto spl_num_wf() const + { + return spl_num_wf_; + } + + /// Return reference to the plane-wave coefficient. + inline std::complex& pw_coeffs(int ig__, band_index b__) + { + return this->data_[0](ig__, b__.get()); + } + + /// Return pointer to the beginning of wave-functions casted to real type as required by the SpFFT library. + inline T* pw_coeffs_spfft(sddk::memory_t mem__, band_index b__) + { + return reinterpret_cast(this->data_[0].at(mem__, 0, b__.get())); + } + + /// Return true if data is avaliable on the device memory. + inline auto on_device() const + { + return on_device_; + } - /// Checksum of muffin-tin coefficients. - std::complex checksum_mt(device_t pu__, int ispn__, int i0__, int n__) const; + /// Return const pointer to the data for a given plane-wave and band indices. + inline std::complex const* + at(sddk::memory_t mem__, int i__, band_index b__) const + { + return this->data_[0].at(mem__, i__, b__.get()); + } - void zero_pw(device_t pu__, int ispn__, int i0__, int n__); + /// Return pointer to the data for a given plane-wave and band indices. + inline auto + at(sddk::memory_t mem__, int i__, band_index b__) + { + return this->data_[0].at(mem__, i__, b__.get()); + } +}; - void zero_mt(device_t pu__, int ispn__, int i0__, int n__); +/// For real-type F (double or float). +template +static inline std::enable_if_t::value, F> +inner_diag_local_aux(std::complex z1__, std::complex z2__) +{ + return z1__.real() * z2__.real() + z1__.imag() * z2__.imag(); +} - void scale(memory_t mem__, int ispn__, int i0__, int n__, T beta__); +/// For complex-type F (complex or complex). +template +static inline std::enable_if_t::value, F> +inner_diag_local_aux(std::complex z1__, std::complex z2__) +{ + return std::conj(z1__) * z2__; +} - sddk::mdarray l2norm(device_t pu__, spin_range spins__, int n__) const; +template +static auto +inner_diag_local(sddk::memory_t mem__, wf::Wave_functions const& lhs__, wf::Wave_functions_base const& rhs__, + wf::spin_range spins__, wf::num_bands num_wf__) +{ + RTE_ASSERT(lhs__.ld() == rhs__.ld()); + if (spins__.size() == 2) { + if (lhs__.num_md() != wf::num_mag_dims(3)) { + RTE_THROW("Wave-functions are not spinors"); + } + if (rhs__.num_md() != wf::num_mag_dims(3)) { + RTE_THROW("Wave-functions are not spinors"); + } + } - /// Normalize the functions. - void normalize(device_t pu__, spin_range spins__, int n__); + std::vector result(num_wf__.get(), 0); + + if (is_host_memory(mem__)) { + for (auto s = spins__.begin(); s != spins__.end(); s++) { + auto s1 = lhs__.actual_spin_index(s); + auto s2 = rhs__.actual_spin_index(s); + for (int i = 0; i < num_wf__.get(); i++) { + auto ptr1 = lhs__.at(mem__, 0, s1, wf::band_index(i)); + auto ptr2 = rhs__.at(mem__, 0, s2, wf::band_index(i)); + for (int j = 0; j < lhs__.ld(); j++) { + result[i] += inner_diag_local_aux(ptr1[j], ptr2[j]); + } + /* gamma-point case */ + if (std::is_same>::value) { + if (lhs__.comm().rank() == 0) { + result[i] = F(2.0) * result[i] - F(std::real(std::conj(ptr1[0]) * ptr2[0])); + } else { + result[i] *= F(2.0); + } + } + } + } + } else { +#if defined(SIRIUS_GPU) + int reduced{0}; + /* gamma-point case */ + if (std::is_same>::value) { + reduced = lhs__.comm().rank() + 1; + } + sddk::mdarray result_gpu(num_wf__.get()); + result_gpu.allocate(mem__).zero(mem__); + + for (auto s = spins__.begin(); s != spins__.end(); s++) { + auto s1 = lhs__.actual_spin_index(s); + auto s2 = rhs__.actual_spin_index(s); + auto ptr1 = lhs__.at(mem__, 0, s1, wf::band_index(0)); + auto ptr2 = rhs__.at(mem__, 0, s2, wf::band_index(0)); + if (std::is_same::value) { + + if (std::is_same::value) { + inner_diag_local_gpu_double_double(ptr1, lhs__.ld(), ptr2, rhs__.ld(), lhs__.ld(), num_wf__.get(), + reduced, result_gpu.at(mem__)); + } + if (std::is_same>::value) { + inner_diag_local_gpu_double_complex_double(ptr1, lhs__.ld(), ptr2, rhs__.ld(), lhs__.ld(), num_wf__.get(), + result_gpu.at(mem__)); + } + } + } + result_gpu.copy_to(sddk::memory_t::host); + for (int i = 0; i < num_wf__.get(); i++) { + result[i] = result_gpu[i]; + } +#endif + } + return result; +} - void allocate(spin_range spins__, memory_t mem__); +template +auto +inner_diag(sddk::memory_t mem__, wf::Wave_functions const& lhs__, wf::Wave_functions_base const& rhs__, + wf::spin_range spins__, wf::num_bands num_wf__) +{ + PROFILE("wf::inner_diag"); + auto result = inner_diag_local(mem__, lhs__, rhs__, spins__, num_wf__); + lhs__.comm().allreduce(result); + return result; +} + +/// For real-type F (double or float). +template +static inline std::enable_if_t::value, std::complex> +axpby_aux(F a__, std::complex x__, F b__, std::complex y__) +{ + return std::complex(a__ * x__.real() + b__ * y__.real(), a__ * x__.imag() + b__ * y__.imag()); +} - void allocate(spin_range spins__, memory_pool& mp__); +/// For complex-type F (double or float). +template +static inline std::enable_if_t::value, std::complex> +axpby_aux(F a__, std::complex x__, F b__, std::complex y__) +{ + auto z1 = F(x__.real(), x__.imag()); + auto z2 = F(y__.real(), y__.imag()); + auto z3 = a__ * z1 + b__ * z2; + return std::complex(z3.real(), z3.imag()); +} + +/// Perform y <- a * x + b * y type of operation. +template +void axpby(sddk::memory_t mem__, wf::spin_range spins__, wf::band_range br__, F const* alpha__, + wf::Wave_functions const* x__, F const* beta__, wf::Wave_functions* y__) +{ + if (x__) { + RTE_ASSERT(x__->ld() == y__->ld()); + } + if (is_host_memory(mem__)) { + for (auto s = spins__.begin(); s != spins__.end(); s++) { + auto spy = y__->actual_spin_index(s); + auto spx = x__ ? x__->actual_spin_index(s) : spy; + #pragma omp parallel for + for (int i = 0; i < br__.size(); i++) { + auto ptr_y = y__->at(sddk::memory_t::host, 0, spy, wf::band_index(br__.begin() + i)); + if (x__) { + auto ptr_x = x__->at(sddk::memory_t::host, 0, spx, wf::band_index(br__.begin() + i)); + if (beta__[i] == F(0)) { + for (int j = 0; j < y__->ld(); j++) { + ptr_y[j] = axpby_aux(alpha__[i], ptr_x[j], 0.0, 0.0); + } + } else if (alpha__[i] == F(0)) { + for (int j = 0; j < y__->ld(); j++) { + ptr_y[j] = axpby_aux(0.0, 0.0, beta__[i], ptr_y[j]); + } + } else { + for (int j = 0; j < y__->ld(); j++) { + ptr_y[j] = axpby_aux(alpha__[i], ptr_x[j], beta__[i], ptr_y[j]); + } + } + } else { + for (int j = 0; j < y__->ld(); j++) { + ptr_y[j] = axpby_aux(0.0, 0.0, beta__[i], ptr_y[j]); + } + } + } + } + } else { +#if defined(SIRIUS_GPU) + for (auto s = spins__.begin(); s != spins__.end(); s++) { + auto spy = y__->actual_spin_index(s); + auto spx = x__ ? x__->actual_spin_index(s) : spy; + auto ptr_y = y__->at(mem__, 0, spy, wf::band_index(br__.begin())); + auto ptr_x = x__ ? x__->at(mem__, 0, spx, wf::band_index(br__.begin())) : nullptr; + + sddk::mdarray alpha; + if (x__) { + alpha = sddk::mdarray(const_cast(alpha__), br__.size()); + alpha.allocate(mem__).copy_to(mem__); + } + sddk::mdarray beta(const_cast(beta__), br__.size()); + beta.allocate(mem__).copy_to(mem__); - void deallocate(spin_range spins__, memory_t mem__); + auto ldx = x__ ? x__->ld() : 0; + auto ptr_alpha = x__ ? alpha.at(mem__) : nullptr; - void copy_to(spin_range spins__, memory_t mem__, int i0__, int n__); + if (std::is_same::value) { - template - void print_checksum(device_t pu__, std::string label__, int N__, int n__, OUT&& out__) const - { - for (int ispn = 0; ispn < num_sc(); ispn++) { - auto cs1 = this->checksum_pw(pu__, ispn, N__, n__); - auto cs2 = this->checksum_mt(pu__, ispn, N__, n__); - if (this->comm().rank() == 0) { - out__ << "checksum (" << label__ << "_pw_" << ispn << ") : " << cs1 << std::endl; - if (this->has_mt_) { - out__ << "checksum (" << label__ << "_mt_" << ispn << ") : " << cs2 << std::endl; + if (std::is_same::value) { + axpby_gpu_double_double(br__.size(), ptr_alpha, ptr_x, ldx, + beta.at(mem__), ptr_y, y__->ld(), y__->ld()); + } + if (std::is_same>::value) { + axpby_gpu_double_complex_double(br__.size(), ptr_alpha, ptr_x, ldx, + beta.at(mem__), ptr_y, y__->ld(), y__->ld()); } - out__ << "checksum (" << label__ << "_" << ispn << ") : " << cs1 + cs2 << std::endl; + } + if (std::is_same::value) { + RTE_THROW("[wf::axpby] implement GPU kernel for float"); } } +#endif } +} - /// Prepare wave-functions on the device. - void prepare(spin_range spins__, bool with_copy__, memory_pool* mp__ = nullptr) - { - /* if operations on wave-functions are done on GPUs */ - if (is_device_memory(preferred_memory_t_)) { - if (mp__) { - if (!is_device_memory(mp__->memory_type())) { - RTE_THROW("not a device memory pool"); +template +void axpy_scatter(sddk::memory_t mem__, wf::spin_range spins__, std::vector const &alphas__, + Wave_functions const* x__, std::vector const& idx__, Wave_functions* y__, int n__) +{ + if (is_host_memory(mem__)) { + for (auto s = spins__.begin(); s != spins__.end(); s++) { + auto spy = y__->actual_spin_index(s); + auto spx = x__ ? x__->actual_spin_index(s) : spy; + #pragma omp parallel for + for (int i = 0; i < n__; i++) { + auto ii = idx__[i]; + auto alpha = alphas__[i]; + + auto ptr_y = y__->at(sddk::memory_t::host, 0, spy, wf::band_index(ii)); + auto ptr_x = x__->at(sddk::memory_t::host, 0, spx, wf::band_index(i)); + for (int j = 0; j < y__->ld(); j++) { + ptr_y[j] += alpha * ptr_x[j]; } - this->allocate(spins__, *mp__); + } + } + } else { + RTE_THROW("implement wf::axpy_scatter() on GPUs"); + } +} + +/// Copy wave-functions. +template +void copy(sddk::memory_t mem__, Wave_functions const& in__, wf::spin_index s_in__, wf::band_range br_in__, + Wave_functions& out__, wf::spin_index s_out__, wf::band_range br_out__) +{ + RTE_ASSERT(br_in__.size() == br_out__.size()); + if (in__.ld() != out__.ld()) { + std::stringstream s; + s << "Leading dimensions of wave-functions do not match" << std::endl + << " in__.ld() = " << in__.ld() << std::endl + << " out__.ld() = " << out__.ld() << std::endl; + RTE_THROW(s); + } + + auto in_ptr = in__.at(mem__, 0, s_in__, wf::band_index(br_in__.begin())); + auto out_ptr = out__.at(mem__, 0, s_out__, wf::band_index(br_out__.begin())); + + if (is_host_memory(mem__)) { + std::copy(in_ptr, in_ptr + in__.ld() * br_in__.size(), out_ptr); + } else { + if (!std::is_same::value) { + RTE_THROW("copy of different types on GPU is not implemented"); + } + acc::copy(reinterpret_cast*>(out_ptr), in_ptr, in__.ld() * br_in__.size()); + } +} + +/// Apply linear transformation to the wave-functions. +/** + * \tparam T Precision type of the wave-functions (float or double). + * \tparam F Type of the subspace and transformation matrix (float or double for Gamma-point calculation, + * complex or complex otherwise). + * \param [in] spla_ctx Context of the SPLA library. + * \param [in] mem Location of the input wave-functions (host or device). + * \param [in] M The whole transformation matrix. + * \param [in] irow0 Location of the 1st row of the transfoormation sub-matrix. + * \param [in] jcol0 Location of the 1st column of the transfoormation sub-matrix. + */ +template +inline std::enable_if_t>::value, void> +transform(::spla::Context& spla_ctx__, sddk::memory_t mem__, sddk::dmatrix const& M__, int irow0__, int jcol0__, + real_type alpha__, Wave_functions const& wf_in__, spin_index s_in__, band_range br_in__, + real_type beta__, Wave_functions& wf_out__, spin_index s_out__, band_range br_out__) +{ + PROFILE("wf::transform"); + + RTE_ASSERT(wf_in__.ld() == wf_out__.ld()); + + /* spla manages the resources through the context which can be updated during the call; + * that's why the const must be removed here */ + auto& spla_mat_dist = const_cast&>(M__).spla_distribution(); + + /* for Gamma point case (transformation matrix is real) we treat complex wave-function coefficients as + * a doubled list of real values */ + int ld = wf_in__.ld(); + if (std::is_same>::value) { + ld *= 2; + } + + F const* mtrx_ptr = M__.size_local() ? M__.at(sddk::memory_t::host, 0, 0) : nullptr; + + F const* in_ptr = reinterpret_cast(wf_in__.at(mem__, 0, s_in__, band_index(br_in__.begin()))); + + F* out_ptr = reinterpret_cast(wf_out__.at(mem__, 0, s_out__, band_index(br_out__.begin()))); + + spla::pgemm_sbs(ld, br_out__.size(), br_in__.size(), alpha__, in_ptr, ld, mtrx_ptr, M__.ld(), irow0__, jcol0__, + spla_mat_dist, beta__, out_ptr, ld, spla_ctx__); +} + +template +inline std::enable_if_t>::value, void> +transform(::spla::Context& spla_ctx__, sddk::memory_t mem__, sddk::dmatrix const& M__, int irow0__, int jcol0__, + real_type alpha__, Wave_functions const& wf_in__, spin_index s_in__, band_range br_in__, + real_type beta__, Wave_functions& wf_out__, spin_index s_out__, band_range br_out__) +{ + if (is_device_memory(mem__)) { + RTE_THROW("wf::transform(): mixed FP32/FP64 precision is implemented only for CPU"); + } + RTE_ASSERT(wf_in__.ld() == wf_out__.ld()); + for (int j = 0; j < br_out__.size(); j++) { + for (int k = 0; k < wf_in__.ld(); k++) { + auto wf_out_ptr = wf_out__.at(sddk::memory_t::host, k, s_out__, wf::band_index(j + br_out__.begin())); + std::complex> z(0, 0);; + for (int i = 0; i < br_in__.size(); i++) { + auto wf_in_ptr = wf_in__.at(sddk::memory_t::host, k, s_in__, wf::band_index(i + br_in__.begin())); + + z += static_cast>>(*wf_in_ptr) * M__(irow0__ + i, jcol0__ + j); + } + if (beta__ == 0) { + *wf_out_ptr = alpha__ * z; } else { - this->allocate(spins__, preferred_memory_t_); + *wf_out_ptr = alpha__ * z + static_cast>>(*wf_out_ptr) * beta__; } - if (with_copy__) { - this->copy_to(spins__, preferred_memory_t_, 0, this->num_wf()); + } + } +} + +/// Scale G=0 component of the wave-functions. +/** This is needed for the Gamma-point calculation to exclude the double-counting of G=0 term. + */ +template +inline void +scale_gamma_wf(sddk::memory_t mem__, wf::Wave_functions const& wf__, wf::spin_range spins__, + wf::band_range br__, T* scale__) +{ + RTE_ASSERT(spins__.size() == 1); + + auto& wf = const_cast&>(wf__); + RTE_ASSERT(wf.num_sc() == wf::num_spins(1)); // TODO: might be too strong check + + /* rank 0 stores the G=0 component */ + if (wf.comm().rank() != 0) { + return; + } + + auto ld = wf.ld() * 2; + + auto sp = wf.actual_spin_index(spins__.begin()); + + auto ptr = wf.at(mem__, 0, sp, wf::band_index(br__.begin())); + auto m = br__.size(); + + if (is_device_memory(mem__)) { +#if defined(SIRIUS_GPU) + if (std::is_same::value) { + accblas::dscal(m, reinterpret_cast(scale__), reinterpret_cast(ptr), ld); + } else if (std::is_same::value) { + accblas::sscal(m, reinterpret_cast(scale__), reinterpret_cast(ptr), ld); + } +#else + RTE_THROW("not compiled with GPU support!"); +#endif + } else { + if (std::is_same::value) { + FORTRAN(dscal)(&m, reinterpret_cast(scale__), reinterpret_cast(ptr), &ld); + } else if (std::is_same::value) { + FORTRAN(sscal)(&m, reinterpret_cast(scale__), reinterpret_cast(ptr), &ld); + } + } +} + +/// Compute inner product between the two sets of wave-functions. +/** + * \tparam T Precision type of the wave-functions (float or double). + * \tparam F Type of the subspace (float or double for Gamma-point calculation, + * complex or complex otherwise). + * + * \param [in] spla_ctx Context of the SPLA library. + * \param [in] mem Location of the input wave-functions (host or device). + * \param [in] spins Spin range of the wave-functions. + * \param [in] wf_i Left hand side of product. + * \param [in] br_i Band range of the product. + * \param [in] br_j Band range of the |wf_j> wave-functions. + * \param [out] result Resulting inner product matrix. + * \param [in] irow0 Starting row of the output sub-block. + * \param [in] jcol0 Starting column of the output sub-block. + * \return None + * + * Depending on the spin range this functions computes the inner product between individaul spin components + * or between full spinor wave functions: + * \f[ + * M_{irow0+i,jcol0+j} = \sum_{\sigma=s0}^{s1} \langle \phi_{i0 + i}^{\sigma} | \phi_{j0 + j}^{\sigma} \rangle + * \f] + * where i0 and j0 and the dimensions of the resulting inner product matrix are determined by the band ranges for + * bra- and ket- states. + * + * The location of the wave-functions data is determined by the mem parameter. The result is always returned in the + * CPU memory. If resulting matrix is allocated on the GPU memory, the result is copied to GPU as well. + */ +template +inline std::enable_if_t>::value, void> +inner(::spla::Context& spla_ctx__, sddk::memory_t mem__, spin_range spins__, W const& wf_i__, band_range br_i__, + Wave_functions const& wf_j__, band_range br_j__, sddk::dmatrix& result__, int irow0__, int jcol0__) +{ + PROFILE("wf::inner"); + + RTE_ASSERT(wf_i__.ld() == wf_j__.ld()); + RTE_ASSERT((wf_i__.gkvec().reduced() == std::is_same>::value)); + RTE_ASSERT((wf_j__.gkvec().reduced() == std::is_same>::value)); + + if (spins__.size() == 2) { + if (wf_i__.num_md() != wf::num_mag_dims(3)) { + RTE_THROW("input wave-functions are not 2-component spinors"); + } + if (wf_j__.num_md() != wf::num_mag_dims(3)) { + RTE_THROW("input wave-functions are not 2-component spinors"); + } + } + + auto spla_mat_dist = wf_i__.comm().size() > result__.comm().size() + ? spla::MatrixDistribution::create_mirror(wf_i__.comm().mpi_comm()) + : result__.spla_distribution(); + + auto ld = wf_i__.ld(); + + F alpha = 1.0; + /* inner product matrix is real */ + if (std::is_same>::value) { + alpha = 2.0; + ld *= 2; + } + + T scale_half(0.5); + T scale_two(2.0); + + /* for Gamma case, contribution of G = 0 vector must not be counted double -> multiply by 0.5 */ + if (is_real_v) { + scale_gamma_wf(mem__, wf_j__, spins__, br_j__, &scale_half); + } + + F beta = 0.0; + + F* result_ptr = result__.size_local() ? result__.at(sddk::memory_t::host, 0, 0) : nullptr; + + for (auto s = spins__.begin(); s != spins__.end(); s++) { + auto s_i = wf_i__.actual_spin_index(s); + auto s_j = wf_j__.actual_spin_index(s); + auto wf_i_ptr = wf_i__.at(mem__, 0, s_i, wf::band_index(br_i__.begin())); + auto wf_j_ptr = wf_j__.at(mem__, 0, s_j, wf::band_index(br_j__.begin())); + + spla::pgemm_ssb(br_i__.size(), br_j__.size(), ld, SPLA_OP_CONJ_TRANSPOSE, + alpha, + reinterpret_cast(wf_i_ptr), ld, + reinterpret_cast(wf_j_ptr), ld, + beta, + result_ptr, result__.ld(), irow0__, jcol0__, spla_mat_dist, spla_ctx__); + beta = 1.0; + } + + /* for Gamma case, G = 0 vector is rescaled back */ + if (is_real_v) { + scale_gamma_wf(mem__, wf_j__, spins__, br_j__, &scale_two); + } + + /* make sure result is updated on device as well */ + if (result__.on_device()) { + result__.copy_to(sddk::memory_t::device, irow0__, jcol0__, br_i__.size(), br_j__.size()); + } +} + +template +inline std::enable_if_t>::value, void> +inner(::spla::Context& spla_ctx__, sddk::memory_t mem__, spin_range spins__, Wave_functions const& wf_i__, + band_range br_i__, Wave_functions const& wf_j__, band_range br_j__, sddk::dmatrix& result__, + int irow0__, int jcol0__) +{ + if (is_device_memory(mem__)) { + RTE_THROW("wf::inner(): mixed FP32/FP64 precision is implemented only for CPU"); + } + RTE_ASSERT(wf_i__.ld() == wf_j__.ld()); + RTE_ASSERT((wf_i__.gkvec().reduced() == std::is_same>::value)); + RTE_ASSERT((wf_j__.gkvec().reduced() == std::is_same>::value)); + for (int i = 0; i < br_i__.size(); i++) { + for (int j = 0; j < br_j__.size(); j++) { + result__(irow0__ + i, jcol0__ + j) = 0.0; + } + } + for (auto s = spins__.begin(); s != spins__.end(); s++) { + auto s_i = wf_i__.actual_spin_index(s); + auto s_j = wf_j__.actual_spin_index(s); + int nk = wf_i__.ld(); + + for (int i = 0; i < br_i__.size(); i++) { + for (int j = 0; j < br_j__.size(); j++) { + auto wf_i_ptr = wf_i__.at(sddk::memory_t::host, 0, s_i, wf::band_index(br_i__.begin() + i)); + auto wf_j_ptr = wf_j__.at(sddk::memory_t::host, 0, s_j, wf::band_index(br_j__.begin() + j)); + F z = 0.0; + + for (int k = 0; k < nk; k++) { + z += inner_diag_local_aux(wf_i_ptr[k], wf_j_ptr[k]); + } + result__(irow0__ + i, jcol0__ + j) += z; } } } +} + +/// Orthogonalize n new wave-functions to the N old wave-functions +/** Orthogonalize sets of wave-fuctionsfuctions. +\tparam T Precision of the wave-functions (float or double). +\tparam F Type of the inner-product matrix (float, double or complex). +\param [in] spla_ctx SPLA library context. +\param [in] mem Location of the wave-functions data. +\param [in] spins Spin index range. +\param [in] br_old Band range of the functions that are alredy orthogonal and that will be peojected out. +\param [in] br_new Band range of the functions that needed to be orthogonalized. +\param [in] wf_i The states used to compute overlap matrix O_{ij}. +\param [out wfs List of wave-functions sets (typically phi, hphi and sphi). +\param [out] o Work matrix to compute overlap +\param [out] tmp Temporary wave-functions to store intermediate results. +\param [in] project_out Project out old subspace (if this was not done before). +\return Number of linearly independent wave-functions found. +*/ +template +int +orthogonalize(::spla::Context& spla_ctx__, sddk::memory_t mem__, spin_range spins__, band_range br_old__, + band_range br_new__, Wave_functions const& wf_i__, Wave_functions const& wf_j__, + std::vector*> wfs__, sddk::dmatrix& o__, Wave_functions& tmp__, bool project_out__) +{ + PROFILE("wf::orthogonalize"); - void dismiss(spin_range spins__, bool with_copy__) - { - if (is_device_memory(preferred_memory_t_)) { - if (with_copy__) { - this->copy_to(spins__, memory_t::host, 0, this->num_wf()); + /* number of new states */ + int n = br_new__.size(); + +// //const char* sddk_pp_raw = std::getenv("SDDK_PRINT_PERFORMANCE"); +// //int sddk_pp = (sddk_pp_raw == NULL) ? 0 : std::atoi(sddk_pp_raw); +// +// auto& comm = wfs__[0]->comm(); +// +// int K{0}; +// +// if (sddk_pp) { +// K = wfs__[0]->gkvec().num_gvec() + wfs__[0]->num_mt_coeffs(); +// if (std::is_same>::value) { +// K *= 2; +// } +// } +// +// //auto sddk_debug_ptr = utils::get_env("SDDK_DEBUG"); +// //int sddk_debug = (sddk_debug_ptr) ? (*sddk_debug_ptr) : 0; +// +// /* prefactor for the matrix multiplication in complex or double arithmetic (in Giga-operations) */ +// double ngop{8e-9}; // default value for complex type +// if (std::is_same>::value) { // change it if it is real type +// ngop = 2e-9; +// } +// +// if (sddk_pp) { +// comm.barrier(); +// } +// // double time = -omp_get_wtime(); +// +// double gflops{0}; +// + /* project out the old subspace: + * |\tilda phi_new> = |phi_new> - |phi_old> + * H|\tilda phi_new> = H|phi_new> - H|phi_old> + * S|\tilda phi_new> = S|phi_new> - S|phi_old> */ + if (br_old__.size() > 0 && project_out__) { + inner(spla_ctx__, mem__, spins__, wf_i__, br_old__, wf_j__, br_new__, o__, 0, 0); + for (auto s = spins__.begin(); s != spins__.end(); s++) { + for (auto wf: wfs__) { + auto sp = wf->actual_spin_index(s); + transform(spla_ctx__, mem__, o__, 0, 0, -1.0, *wf, sp, br_old__, 1.0, *wf, sp, br_new__); } - this->deallocate(spins__, preferred_memory_t_); } + //if (sddk_pp) { + // /* inner and transform have the same number of flops */ + // gflops += static_cast(1 + wfs__.size()) * ngop * N__ * n__ * K; + //} } -}; +// if (sddk_debug >= 2) { +// if (o__.comm().rank() == 0) { +// RTE_OUT(std::cout) << "check QR decomposition, matrix size : " << n__ << std::endl; +// } +// inner(spla_ctx__, spins__, *wfs__[idx_bra__], N__, n__, *wfs__[idx_ket__], N__, n__, o__, 0, 0); +// +// linalg(linalg_t::scalapack).geqrf(n__, n__, o__, 0, 0); +// auto diag = o__.get_diag(n__); +// if (o__.comm().rank() == 0) { +// for (int i = 0; i < n__; i++) { +// if (std::abs(diag[i]) < std::numeric_limits>::epsilon() * 10) { +// RTE_OUT(std::cout) << "small norm: " << i << " " << diag[i] << std::endl; +// } +// } +// } +// +// if (o__.comm().rank() == 0) { +// RTE_OUT(std::cout) << "check eigen-values, matrix size : " << n__ << std::endl; +// } +// inner(spla_ctx__, spins__, *wfs__[idx_bra__], N__, n__, *wfs__[idx_ket__], N__, n__, o__, 0, 0); +// +// // if (sddk_debug >= 3) { +// // save_to_hdf5("nxn_overlap.h5", o__, n__); +// //} +// +// std::vector> eo(n__); +// dmatrix evec(o__.num_rows(), o__.num_cols(), o__.blacs_grid(), o__.bs_row(), o__.bs_col()); +// +// auto solver = (o__.comm().size() == 1) ? Eigensolver_factory("lapack", nullptr) : +// Eigensolver_factory("scalapack", nullptr); +// solver->solve(n__, o__, eo.data(), evec); +// +// if (o__.comm().rank() == 0) { +// for (int i = 0; i < n__; i++) { +// if (eo[i] < 1e-6) { +// RTE_OUT(std::cout) << "small eigen-value " << i << " " << eo[i] << std::endl; +// } +// } +// } +// } +// + /* orthogonalize new n x n block */ + inner(spla_ctx__, mem__, spins__, wf_i__, br_new__, wf_j__, br_new__, o__, 0, 0); + + /* At this point overlap matrix is computed for the new block and stored on the CPU. We + * now have this choices + * - mem: CPU + * - o is not distributed + * - potrf is computed on CPU with lapack + * - trtri is computed on CPU with lapack + * - trmm is computed on CPU with blas + * - o is distributed + * - potrf is computed on CPU with scalapack + * - trtri is computed on CPU with scalapack + * - trmm is computed on CPU with wf::transform + * + * - mem: GPU + * - o is not distributed + * - potrf is computed on CPU with lapack; later with cuSolver + * - trtri is computed on CPU with lapack; later with cuSolver + * - trmm is computed on GPU with cublas + * + * - o is distributed + * - potrf is computed on CPU with scalapack + * - trtri is computed on CPU with scalapack + * - trmm is computed on GPU with wf::transform + */ + // TODO: test magma and cuSolver + sddk::linalg_t la = sddk::linalg_t::lapack; + sddk::linalg_t la1 = sddk::linalg_t::blas; + sddk::memory_t mem = sddk::memory_t::host; + if (o__.comm().size() > 1) { + la = sddk::linalg_t::scalapack; + } + if (mem__ == sddk::memory_t::device) { + la1 = sddk::linalg_t::gpublas; + } + + /* compute the transformation matrix (inverse of the Cholesky factor) */ + PROFILE_START("wf::orthogonalize|tmtrx"); + auto o_ptr = (o__.size_local() == 0) ? nullptr : o__.at(mem); + if (la == sddk::linalg_t::scalapack) { + o__.make_real_diag(n); + } + /* Cholesky factorization */ + if (int info = sddk::linalg(la).potrf(n, o_ptr, o__.ld(), o__.descriptor())) { + std::stringstream s; + s << "error in Cholesky factorization, info = " << info << std::endl + << "number of existing states: " << br_old__.size() << std::endl + << "number of new states: " << br_new__.size(); + RTE_THROW(s); + } + /* inversion of triangular matrix */ + if (sddk::linalg(la).trtri(n, o_ptr, o__.ld(), o__.descriptor())) { + RTE_THROW("error in inversion"); + } + //if (is_device_memory(mem)) { + // acc::copyin(o__.at(memory_t::device), o__.ld(), o__.at(memory_t::host), o__.ld(), n, n); + //} + PROFILE_STOP("wf::orthogonalize|tmtrx"); + + /* single MPI rank and precision types of wave-functions and transformation matrices match */ + if (o__.comm().size() == 1 && std::is_same>::value) { + PROFILE_START("wf::orthogonalize|trans"); + int sid{0}; + for (auto s = spins__.begin(); s != spins__.end(); s++) { + /* multiplication by triangular matrix */ + for (auto& wf : wfs__) { + auto sp = wf->actual_spin_index(s); + auto ptr = reinterpret_cast(wf->at(mem__, 0, sp, wf::band_index(br_new__.begin()))); + int ld = wf->ld(); + /* Gamma-point case */ + if (std::is_same>::value) { + ld *= 2; + } + + sddk::linalg(la1).trmm('R', 'U', 'N', ld, n, &sddk::linalg_const::one(), + o__.at(mem), o__.ld(), ptr, ld, stream_id(sid++)); + } + } + if (la1 == sddk::linalg_t::gpublas || la1 == sddk::linalg_t::cublasxt || la1 == sddk::linalg_t::magma) { + /* sync stream only if processing unit is GPU */ + for (int i = 0; i < sid; i++) { + acc::sync_stream(stream_id(i)); + } + } + PROFILE_STOP("wf::orthogonalize|trans"); + } else { + /* o is upper triangular matrix */ + for (int i = 0; i < n; i++) { + for (int j = i + 1; j < n; j++) { + o__.set(j, i, 0); + } + } + + /* phi is transformed into phi, so we can't use it as the output buffer; + * use tmp instead and then overwrite phi */ + for (auto s = spins__.begin(); s != spins__.end(); s++) { + for (auto wf: wfs__) { + auto sp = wf->actual_spin_index(s); + auto sp1 = tmp__.actual_spin_index(s); + auto br1 = wf::band_range(0, br_new__.size()); + transform(spla_ctx__, mem__, o__, 0, 0, 1.0, *wf, sp, br_new__, 0.0, tmp__, sp1, br1); + copy(mem__, tmp__, sp1, br1, *wf, sp, br_new__); + } + } + } -} // namespace sddk +//== // +//== // if (sddk_debug >= 1) { +//== // //auto cs = o__.checksum(n__, n__); +//== // //if (o__.comm().rank() == 0) { +//== // // //utils::print_checksum("n x n overlap", cs); +//== // //} +//== // if (o__.comm().rank() == 0) { +//== // RTE_OUT(std::cout) << "check diagonal" << std::endl; +//== // } +//== // auto diag = o__.get_diag(n__); +//== // for (int i = 0; i < n__; i++) { +//== // if (std::real(diag[i]) <= 0 || std::imag(diag[i]) > 1e-12) { +//== // RTE_OUT(std::cout) << "wrong diagonal: " << i << " " << diag[i] << std::endl; +//== // } +//== // } +//== // if (o__.comm().rank() == 0) { +//== // RTE_OUT(std::cout) << "check hermitian" << std::endl; +//== // } +//== // auto d = check_hermitian(o__, n__); +//== // if (o__.comm().rank() == 0) { +//== // if (d > 1e-12) { +//== // std::stringstream s; +//== // s << "matrix is not hermitian, max diff = " << d; +//== // WARNING(s); +//== // } else { +//== // RTE_OUT(std::cout) << "OK! n x n overlap matrix is hermitian" << std::endl; +//== // } +//== // } +//== // +//== // } +//== // +//== // if (sddk_pp) { +//== // gflops += ngop * n__ * n__ * K; +//== // } +//== // +//== +//== // if (sddk_debug >= 1) { +//== // inner(spla_ctx__, spins__, *wfs__[idx_bra__], N__, n__, *wfs__[idx_ket__], N__, n__, o__, 0, 0); +//== // auto err = check_identity(o__, n__); +//== // if (o__.comm().rank() == 0) { +//== // RTE_OUT(std::cout) << "orthogonalization error : " << err << std::endl; +//== // } +//== // } +//== // +//== // // TODO: remove this? +//== // (void) gflops; +//== // + return 0; +} + +} // namespace wf #endif diff --git a/src/SDDK/wf_inner.cpp b/src/SDDK/wf_inner.cpp deleted file mode 100644 index 288ad7036..000000000 --- a/src/SDDK/wf_inner.cpp +++ /dev/null @@ -1,201 +0,0 @@ -// Copyright (c) 2013-2017 Anton Kozhevnikov, Thomas Schulthess -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, are permitted provided that -// the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the -// following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions -// and the following disclaimer in the documentation and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -/** \file wf_inner.cpp - * - * \brief Definitions. - * - */ -#include "wf_inner.hpp" -#include "utils/profiler.hpp" -#include "SDDK/omp.hpp" -#include -#include -#include "type_definition.hpp" - -#if defined(SIRIUS_GPU) -#include "gpu/acc_blas.hpp" -#include "gpu/acc.hpp" -#endif - -namespace sddk { - -namespace { - -// If scalar type, g-vector 0 contribution must be scaled before / after inner product to aboid counting twice -template -void scale_gamma_wf(spin_range spins, int m, int i0, real_type alpha, Wave_functions>& bra) { - for (auto s : spins) { - const int incx = bra.pw_coeffs(s).prime().ld() * 2; // complex matrix is read as scalar - if (bra.preferred_memory_t() == memory_t::device) { -#if defined(SIRIUS_GPU) - if (std::is_same::value) { - accblas::dscal(m, reinterpret_cast(&alpha), - reinterpret_cast(bra.pw_coeffs(s).prime().at(bra.preferred_memory_t(), 0, i0)), - incx); - } else if (std::is_same::value) { - accblas::sscal(m, reinterpret_cast(&alpha), - reinterpret_cast(bra.pw_coeffs(s).prime().at(bra.preferred_memory_t(), 0, i0)), - incx); - } -#else - throw std::runtime_error("not compiled with GPU support!"); -#endif - } else { - if (std::is_same::value) { - FORTRAN(dscal) - (&m, reinterpret_cast(&alpha), - reinterpret_cast(bra.pw_coeffs(s).prime().at(bra.preferred_memory_t(), 0, i0)), &incx); - } else if (std::is_same::value) { - FORTRAN(sscal) - (&m, reinterpret_cast(&alpha), - reinterpret_cast(bra.pw_coeffs(s).prime().at(bra.preferred_memory_t(), 0, i0)), &incx); - } - } - } -} - -// If complex type, no scaling required -#if defined(USE_FP32) -template <> -void scale_gamma_wf>(spin_range spins, int m, int i0, float alpha, Wave_functions& bra) {} -#endif - -template <> -void scale_gamma_wf>(spin_range spins, int m, int i0, double alpha, Wave_functions& bra) {} - - -// general real type -template -void -inner_mt(::spla::Context& spla_ctx__, ::spla::MatrixDistribution& spla_mat_dist__, spin_range ispn__, - Wave_functions>& bra__, int i0__, int m__, Wave_functions>& ket__, - int j0__, int n__, dmatrix& result__, int irow0__, int jcol0__) -{ -} - -// special for complex type -template -void -inner_mt(::spla::Context& spla_ctx__, ::spla::MatrixDistribution& spla_mat_dist__, spin_range ispn__, - Wave_functions& bra__, int i0__, int m__, Wave_functions& ket__, - int j0__, int n__, dmatrix>& result__, int irow0__, int jcol0__) -{ - bool local_has_mt = bra__.has_mt(); - bool global_has_mt = false; - - // Not all ranks may have mt, but all must call spla if at least one does - MPI_Allreduce(&local_has_mt, &global_has_mt, 1, MPI_C_BOOL, MPI_LOR, bra__.comm().mpi_comm()); - if (global_has_mt) { - std::complex* result_ptr = result__.size_local() ? result__.at(memory_t::host, 0, 0) : nullptr; - auto spins = spin_range(ispn__); - for (auto s : spins) { - PROFILE("sddk::wf_inner|mt"); - if (local_has_mt) { - spla::pgemm_ssb( - m__, n__, bra__.mt_coeffs(s).num_rows_loc(), SPLA_OP_CONJ_TRANSPOSE, 1.0, - bra__.mt_coeffs(s).prime().at(bra__.preferred_memory_t(), 0, i0__), bra__.mt_coeffs(s).prime().ld(), - ket__.mt_coeffs(s).prime().at(ket__.preferred_memory_t(), 0, j0__), ket__.mt_coeffs(s).prime().ld(), - 1.0, result_ptr, result__.ld(), irow0__, jcol0__, spla_mat_dist__, spla_ctx__); - } else { - spla::pgemm_ssb(m__, n__, 0, SPLA_OP_CONJ_TRANSPOSE, 1.0, nullptr, 0, nullptr, 0, 1.0, - result__.at(memory_t::host, 0, 0), result__.ld(), irow0__, jcol0__, spla_mat_dist__, - spla_ctx__); - } - } - } -} - -} // namespace - -template -void -inner(::spla::Context& spla_ctx__, ::sddk::spin_range spins__, Wave_functions>& bra__, int i0__, int m__, - Wave_functions>& ket__, int j0__, int n__, dmatrix& result__, int irow0__, int jcol0__) -{ - PROFILE("sddk::wf_inner"); - - spla::MatrixDistribution spla_mat_dist = bra__.comm().size() > result__.comm().size() - ? spla::MatrixDistribution::create_mirror(bra__.comm().mpi_comm()) - : result__.spla_distribution(); - - using precision_type = real_type; - precision_type alpha = 1.0; - int size_factor = 1; - if (std::is_same::value) { - alpha = 2.0; - size_factor = 2; - } - - // For gamma case, contribution of g = 0 vector must not be counted double -> multiply by 0.5 - if (bra__.comm().rank() == 0) { - PROFILE("sddk::wf_inner|scale"); - scale_gamma_wf(spins__, m__, i0__, 0.5, bra__); - } - - precision_type beta = 0.0; - - T* result_ptr = reinterpret_cast(result__.size_local() ? result__.at(memory_t::host, 0, 0) : nullptr); - - for (auto s : spins__) { - PROFILE("sddk::wf_inner|pw"); - spla::pgemm_ssb(m__, n__, size_factor * bra__.pw_coeffs(s).num_rows_loc(), SPLA_OP_CONJ_TRANSPOSE, alpha, - reinterpret_cast(bra__.pw_coeffs(s).prime().at(bra__.preferred_memory_t(), 0, i0__)), - size_factor * bra__.pw_coeffs(s).prime().ld(), - reinterpret_cast(ket__.pw_coeffs(s).prime().at(ket__.preferred_memory_t(), 0, j0__)), - size_factor * ket__.pw_coeffs(s).prime().ld(), beta, result_ptr, result__.ld(), irow0__, - jcol0__, spla_mat_dist, spla_ctx__); - beta = 1.0; - } - - // For gamma case, g = 0 vector is rescaled back - if (bra__.comm().rank() == 0) { - PROFILE("sddk::wf_inner|scale_back"); - scale_gamma_wf(spins__, m__, i0__, 2.0, bra__); - } - - // add mt contribution - inner_mt(spla_ctx__, spla_mat_dist, spins__, bra__, i0__, m__, ket__, j0__, n__, result__, irow0__, jcol0__); - - // make sure result is updated on device as well - if (result__.on_device()) { - result__.copy_to(memory_t::device); - } -} - -// instantiate for required types -template void inner(::spla::Context& ctx, ::sddk::spin_range ispn__, Wave_functions& bra__, - int i0__, int m__, Wave_functions& ket__, int j0__, int n__, dmatrix& result__, - int irow0__, int jcol0__); - -template void inner(::spla::Context& ctx, ::sddk::spin_range ispn__, Wave_functions& bra__, int i0__, int m__, - Wave_functions& ket__, int j0__, int n__, dmatrix& result__, - int irow0__, int jcol0__); - -#if defined(USE_FP32) -template void inner(::spla::Context& ctx, ::sddk::spin_range ispn__, Wave_functions& bra__, - int i0__, int m__, Wave_functions& ket__, int j0__, int n__, dmatrix& result__, - int irow0__, int jcol0__); - -template void inner>(::spla::Context& ctx, ::sddk::spin_range ispn__, Wave_functions& bra__, int i0__, int m__, - Wave_functions& ket__, int j0__, int n__, dmatrix>& result__, - int irow0__, int jcol0__); -#endif - -} // namespace sddk diff --git a/src/SDDK/wf_inner.hpp b/src/SDDK/wf_inner.hpp deleted file mode 100644 index 15dfe21d5..000000000 --- a/src/SDDK/wf_inner.hpp +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright (c) 2013-2017 Anton Kozhevnikov, Thomas Schulthess -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, are permitted provided that -// the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the -// following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions -// and the following disclaimer in the documentation and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -/** \file wf_inner.hpp - * - * \brief Contains implementation of inner product for wave-functions. - */ -#ifndef __WF_INNER_HPP__ -#define __WF_INNER_HPP__ -#include "wave_functions.hpp" -#include - -namespace sddk { - -/// Inner product between wave-functions. -/** This function computes the inner product using a moving window scheme plus allreduce. - * The input wave-functions data must be previously allocated on the GPU. - * The result is always returned in the CPU pointer. - * - * The following \f$ m \times n \f$ sub-matrix is computed: - * \f[ - * S_{irow0+i,jcol0+j} = \langle \phi_{i0 + i} | \tilde \phi_{j0 + j} \rangle - * \f] - * - * \param [in] spla_ctx Spla context - * \param [in] ispn Index of spin (0, 1, or 2; 2 means the contribution from two spinor components). - * \param [in] bra "bra" wave-functions \f$ \phi \f$. - * \param [in] i0 Index of the first "bra" wave-function. - * \param [in] m Number of "bra" wave-functions. - * \param [in] ket "ket" wave-functions \f$ \tilde \phi \f$. - * \param [in] j0 Index of the first "ket" wave-function. - * \param [in] n Number of "ket" wave-functions. - * \param [out] result Resulting inner product matrix \f$ S \f$. - * \param [in] irow0 First row (in the global matrix) of the inner product sub-matrix. - * \param [in] jcol0 First column (in the global matix) of the inner product sub-matrix. - */ -template -void -inner(::spla::Context& spla_ctx__, spin_range ispn__, Wave_functions>& bra__, int i0__, int m__, - Wave_functions>& ket__, int j0__, int n__, dmatrix& result__, int irow0__, int jcol0__); - -inline void -inner(::spla::Context& spla_ctx__, spin_range ispn__, Wave_functions& bra__, int i0__, int m__, - Wave_functions& ket__, int j0__, int n__, dmatrix>& result__, int irow0__, int jcol0__) -{ - for (int i = 0; i < m__; i++) { - for (int j = 0; j < n__; j++) { - result__(irow0__ + i, jcol0__ + j) = std::complex(0, 0); - } - } - - for (int s: ispn__) { - int nk = ket__.pw_coeffs(s).num_rows_loc(); - for (int i = 0; i < m__; i++) { - for (int j = 0; j < n__; j++) { - std::complex z(0, 0); - for (int k = 0; k < nk; k++) { - assert(bra__.pw_coeffs(s).prime(k, i0__ + i) == bra__.pw_coeffs(s).prime(k, i0__ + i)); - assert(ket__.pw_coeffs(s).prime(k, j0__ + j) == ket__.pw_coeffs(s).prime(k, j0__ + j)); - z += std::conj(bra__.pw_coeffs(s).prime(k, i0__ + i)) * ket__.pw_coeffs(s).prime(k, j0__ + j); - } - assert(z == z); - result__(irow0__ + i, jcol0__ + j) += z; - assert(result__(irow0__ + i, jcol0__ + j) == result__(irow0__ + i, jcol0__ + j)); - } - } - } -} - -inline void -inner(::spla::Context& spla_ctx__, spin_range ispn__, Wave_functions& bra__, int i0__, int m__, - Wave_functions& ket__, int j0__, int n__, dmatrix& result__, int irow0__, int jcol0__) -{ - for (int i = 0; i < m__; i++) { - for (int j = 0; j < n__; j++) { - result__(irow0__ + i, jcol0__ + j) = 0.0; - } - } - - for (int s: ispn__) { - int nk = ket__.pw_coeffs(s).num_rows_loc(); - for (int i = 0; i < m__; i++) { - for (int j = 0; j < n__; j++) { - double z{0}; - z = std::real(std::conj(bra__.pw_coeffs(s).prime(0, i0__ + i)) * ket__.pw_coeffs(s).prime(0, j0__ + j)); - - for (int k = 1; k < nk; k++) { - auto a = bra__.pw_coeffs(s).prime(k, i0__ + i); - auto b = ket__.pw_coeffs(s).prime(k, j0__ + j); - z += 2 * (std::real(a) * std::real(b) + std::imag(a) * std::imag(b)); - } - result__(irow0__ + i, jcol0__ + j) += z; - } - } - } -} - -} -#endif diff --git a/src/SDDK/wf_ortho.cpp b/src/SDDK/wf_ortho.cpp deleted file mode 100644 index ecdce7e9e..000000000 --- a/src/SDDK/wf_ortho.cpp +++ /dev/null @@ -1,353 +0,0 @@ -// Copyright (c) 2013-2017 Anton Kozhevnikov, Thomas Schulthess -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, are permitted provided that -// the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the -// following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions -// and the following disclaimer in the documentation and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -/** \file wf_ortho.cpp - * - * \brief Definitions. - * - */ - -#include "wf_ortho.hpp" -#include "wf_inner.hpp" -#include "wf_trans.hpp" -#include "utils/profiler.hpp" -#include "utils/rte.hpp" -#include "linalg/eigensolver.hpp" -#include "type_definition.hpp" - -namespace sddk { - -template -int -orthogonalize(::spla::Context& spla_ctx__, memory_t mem__, linalg_t la__, spin_range spins__, - int idx_bra__, int idx_ket__, std::vector>*> wfs__, int N__, - int n__, dmatrix& o__, Wave_functions>& tmp__, bool project_out__) -{ - PROFILE("sddk::orthogonalize"); - - const char* sddk_pp_raw = std::getenv("SDDK_PRINT_PERFORMANCE"); - int sddk_pp = (sddk_pp_raw == NULL) ? 0 : std::atoi(sddk_pp_raw); - - auto& comm = wfs__[0]->comm(); - - int K{0}; - - if (sddk_pp) { - K = wfs__[0]->gkvec().num_gvec() + wfs__[0]->num_mt_coeffs(); - if (std::is_same>::value) { - K *= 2; - } - } - - auto sddk_debug_ptr = utils::get_env("SDDK_DEBUG"); - int sddk_debug = (sddk_debug_ptr) ? (*sddk_debug_ptr) : 0; - - /* prefactor for the matrix multiplication in complex or double arithmetic (in Giga-operations) */ - double ngop{8e-9}; // default value for complex type - if (std::is_same>::value) { // change it if it is real type - ngop = 2e-9; - } - - if (sddk_pp) { - comm.barrier(); - } - // double time = -omp_get_wtime(); - - double gflops{0}; - - /* project out the old subspace: - * |\tilda phi_new> = |phi_new> - |phi_old> - * H|\tilda phi_new> = H|phi_new> - H|phi_old> - * S|\tilda phi_new> = S|phi_new> - S|phi_old> */ - if (N__ > 0 && project_out__) { - inner(spla_ctx__, spins__, *wfs__[idx_bra__], 0, N__, *wfs__[idx_ket__], N__, n__, o__, 0, 0); - transform(spla_ctx__, spins__(), -1.0, wfs__, 0, N__, o__, 0, 0, 1.0, wfs__, N__, n__); - - if (sddk_pp) { - /* inner and transform have the same number of flops */ - gflops += static_cast(1 + wfs__.size()) * ngop * N__ * n__ * K; - } - } - - if (sddk_debug >= 2) { - if (o__.comm().rank() == 0) { - RTE_OUT(std::cout) << "check QR decomposition, matrix size : " << n__ << std::endl; - } - inner(spla_ctx__, spins__, *wfs__[idx_bra__], N__, n__, *wfs__[idx_ket__], N__, n__, o__, 0, 0); - - linalg(linalg_t::scalapack).geqrf(n__, n__, o__, 0, 0); - auto diag = o__.get_diag(n__); - if (o__.comm().rank() == 0) { - for (int i = 0; i < n__; i++) { - if (std::abs(diag[i]) < std::numeric_limits>::epsilon() * 10) { - RTE_OUT(std::cout) << "small norm: " << i << " " << diag[i] << std::endl; - } - } - } - - if (o__.comm().rank() == 0) { - RTE_OUT(std::cout) << "check eigen-values, matrix size : " << n__ << std::endl; - } - inner(spla_ctx__, spins__, *wfs__[idx_bra__], N__, n__, *wfs__[idx_ket__], N__, n__, o__, 0, 0); - - // if (sddk_debug >= 3) { - // save_to_hdf5("nxn_overlap.h5", o__, n__); - //} - - std::vector> eo(n__); - dmatrix evec(o__.num_rows(), o__.num_cols(), o__.blacs_grid(), o__.bs_row(), o__.bs_col()); - - auto solver = (o__.comm().size() == 1) ? Eigensolver_factory("lapack", nullptr) : - Eigensolver_factory("scalapack", nullptr); - solver->solve(n__, o__, eo.data(), evec); - - if (o__.comm().rank() == 0) { - for (int i = 0; i < n__; i++) { - if (eo[i] < 1e-6) { - RTE_OUT(std::cout) << "small eigen-value " << i << " " << eo[i] << std::endl; - } - } - } - } - - /* orthogonalize new n__ x n__ block */ - inner(spla_ctx__, spins__, *wfs__[idx_bra__], N__, n__, *wfs__[idx_ket__], N__, n__, o__, 0, 0); - - if (sddk_debug >= 1) { - //auto cs = o__.checksum(n__, n__); - //if (o__.comm().rank() == 0) { - // //utils::print_checksum("n x n overlap", cs); - //} - if (o__.comm().rank() == 0) { - RTE_OUT(std::cout) << "check diagonal" << std::endl; - } - auto diag = o__.get_diag(n__); - for (int i = 0; i < n__; i++) { - if (std::real(diag[i]) <= 0 || std::imag(diag[i]) > 1e-12) { - RTE_OUT(std::cout) << "wrong diagonal: " << i << " " << diag[i] << std::endl; - } - } - if (o__.comm().rank() == 0) { - RTE_OUT(std::cout) << "check hermitian" << std::endl; - } - auto d = check_hermitian(o__, n__); - if (o__.comm().rank() == 0) { - if (d > 1e-12) { - std::stringstream s; - s << "matrix is not hermitian, max diff = " << d; - WARNING(s); - } else { - RTE_OUT(std::cout) << "OK! n x n overlap matrix is hermitian" << std::endl; - } - } - - } - - if (sddk_pp) { - gflops += ngop * n__ * n__ * K; - } - - /* single MPI rank */ - if (o__.comm().size() == 1 && std::is_same, real_type>::value) { - bool use_magma{false}; - - // MAGMA performance for Cholesky and inversion is not good enough; use lapack for the moment - //#if defined(SIRIUS_GPU) && defined(SIRIUS_MAGMA) - // if (pu__ == GPU) { - // use_magma = true; - // } - //#endif - - PROFILE_START("sddk::orthogonalize|tmtrx"); - if (use_magma) { - /* Cholesky factorization */ - if (int info = linalg(linalg_t::magma).potrf(n__, o__.at(memory_t::device), o__.ld())) { - std::stringstream s; - s << "error in GPU factorization, info = " << info; - RTE_THROW(s); - } - /* inversion of triangular matrix */ - if (linalg(linalg_t::magma).trtri(n__, o__.at(memory_t::device), o__.ld())) { - RTE_THROW("error in inversion"); - } - } else { /* CPU version */ - /* Cholesky factorization */ - if (int info = linalg(linalg_t::lapack).potrf(n__, &o__(0, 0), o__.ld())) { - std::stringstream s; - s << "error in factorization, info = " << info << std::endl - << "number of existing states: " << N__ << std::endl - << "number of new states: " << n__ << std::endl - << "number of wave_functions: " << wfs__.size() << std::endl - << "idx_bra: " << idx_bra__ << " " - << "idx_ket:" << idx_ket__; - RTE_THROW(s); - } - /* inversion of triangular matrix */ - if (linalg(linalg_t::lapack).trtri(n__, &o__(0, 0), o__.ld())) { - RTE_THROW("error in inversion"); - } - if (is_device_memory(mem__)) { - acc::copyin(o__.at(memory_t::device), o__.ld(), o__.at(memory_t::host), o__.ld(), n__, n__); - } - } - PROFILE_STOP("sddk::orthogonalize|tmtrx"); - - PROFILE_START("sddk::orthogonalize|transform"); - int sid{0}; - for (int s : spins__) { - /* multiplication by triangular matrix */ - for (auto& e : wfs__) { - /* wave functions are complex, transformation matrix is complex */ - if (!std::is_scalar::value) { - linalg(la__).trmm('R', 'U', 'N', e->pw_coeffs(s).num_rows_loc(), n__, &linalg_const::one(), - reinterpret_cast(o__.at(mem__)), o__.ld(), - reinterpret_cast(e->pw_coeffs(s).prime().at(e->preferred_memory_t(), 0, N__)), - e->pw_coeffs(s).prime().ld(), stream_id(sid++)); - - if (e->has_mt()) { - linalg(la__).trmm( - 'R', 'U', 'N', e->mt_coeffs(s).num_rows_loc(), n__, &linalg_const::one(), - reinterpret_cast(o__.at(mem__)), o__.ld(), - reinterpret_cast(e->mt_coeffs(s).prime().at(e->preferred_memory_t(), 0, N__)), - e->mt_coeffs(s).prime().ld(), stream_id(sid++)); - } - } - /* wave functions are real (psi(G) = psi^{*}(-G)), transformation matrix is real */ - if (std::is_scalar::value) { - linalg(la__).trmm('R', 'U', 'N', 2 * e->pw_coeffs(s).num_rows_loc(), n__, &linalg_const::one(), - reinterpret_cast(o__.at(mem__)), o__.ld(), - reinterpret_cast(e->pw_coeffs(s).prime().at(e->preferred_memory_t(), 0, N__)), - 2 * e->pw_coeffs(s).prime().ld(), stream_id(sid++)); - - if (e->has_mt()) { - linalg(la__).trmm( - 'R', 'U', 'N', 2 * e->mt_coeffs(s).num_rows_loc(), n__, &linalg_const::one(), - reinterpret_cast(o__.at(mem__)), o__.ld(), - reinterpret_cast(e->mt_coeffs(s).prime().at(e->preferred_memory_t(), 0, N__)), - 2 * e->mt_coeffs(s).prime().ld(), stream_id(sid++)); - } - } - } - } - if (la__ == linalg_t::gpublas || la__ == linalg_t::cublasxt || la__ == linalg_t::magma) { - // sync stream only if processing unit is gpu - for (int i = 0; i < sid; i++) { - acc::sync_stream(stream_id(i)); - } - } - PROFILE_STOP("sddk::orthogonalize|transform"); - } else { /* parallel transformation */ - PROFILE_START("sddk::orthogonalize|potrf"); - sddk::mdarray diag; - o__.make_real_diag(n__); - if (sddk_debug >= 1) { - diag = o__.get_diag(n__); - } - auto o_ptr = (o__.size_local() == 0) ? nullptr : o__.at(memory_t::host); - if (sddk_debug >= 2 && n__ <= 20) { - auto s1 = o__.serialize("wf_ortho:o_nn", n__, n__); - if (o__.comm().rank() == 0) { - std::cout << s1.str() << std::endl; - } - } - if (int info = linalg(linalg_t::scalapack).potrf(n__, o_ptr, o__.ld(), o__.descriptor())) { - std::stringstream s; - s << "error in Cholesky factorization, info = " << info << ", matrix size = " << n__; - if (sddk_debug >= 1) { - s << std::endl << " diag = " << diag[info - 1]; - } - RTE_THROW(s); - } - PROFILE_STOP("sddk::orthogonalize|potrf"); - - PROFILE_START("sddk::orthogonalize|trtri"); - if (linalg(linalg_t::scalapack).trtri(n__, o_ptr, o__.ld(), o__.descriptor())) { - RTE_THROW("error in inversion"); - } - PROFILE_STOP("sddk::orthogonalize|trtri"); - - /* o is upper triangular matrix */ - for (int i = 0; i < n__; i++) { - for (int j = i + 1; j < n__; j++) { - o__.set(j, i, 0); - } - } - - if (tmp__.num_wf() < n__) { - RTE_THROW("not enough workspace"); - } - - /* phi is transformed into phi, so we can't use it as the output buffer; use tmp instead and then overwrite phi - */ - for (auto& e : wfs__) { - transform(spla_ctx__, spins__(), *e, N__, n__, o__, 0, 0, tmp__, 0, n__); - for (int s : spins__) { - e->copy_from(tmp__, n__, s, 0, s, N__); - } - } - } - if (sddk_debug >= 1) { - inner(spla_ctx__, spins__, *wfs__[idx_bra__], N__, n__, *wfs__[idx_ket__], N__, n__, o__, 0, 0); - auto err = check_identity(o__, n__); - if (o__.comm().rank() == 0) { - RTE_OUT(std::cout) << "orthogonalization error : " << err << std::endl; - } - } - - // TODO: remove this? - (void) gflops; - - return 0; -} - -// instantiate for required types -template int -orthogonalize(::spla::Context& spla_ctx__, memory_t mem__, linalg_t la__, spin_range spins__, - int idx_bra__, int idx_ket__, std::vector*> wfs__, int N__, - int n__, dmatrix& o__, Wave_functions& tmp__, bool project_out__); - -template int -orthogonalize, std::complex>(::spla::Context& spla_ctx__, memory_t mem__, linalg_t la__, spin_range spins__, - int idx_bra__, int idx_ket__, std::vector*> wfs__, int N__, - int n__, dmatrix>& o__, Wave_functions& tmp__, bool project_out__); - - -#if defined(USE_FP32) -template int -orthogonalize(::spla::Context& spla_ctx__, memory_t mem__, linalg_t la__, spin_range spins__, - int idx_bra__, int idx_ket__, std::vector*> wfs__, int N__, - int n__, dmatrix& o__, Wave_functions& tmp__, bool project_out__); - -template int -orthogonalize(::spla::Context& spla_ctx__, memory_t mem__, linalg_t la__, spin_range spins__, - int idx_bra__, int idx_ket__, std::vector*> wfs__, int N__, - int n__, dmatrix& o__, Wave_functions& tmp__, bool project_out__); - -template int -orthogonalize, std::complex>(::spla::Context& spla_ctx__, memory_t mem__, linalg_t la__, spin_range spins__, - int idx_bra__, int idx_ket__, std::vector*> wfs__, int N__, - int n__, dmatrix>& o__, Wave_functions& tmp__, bool project_out__); - -template int -orthogonalize, std::complex>(::spla::Context& spla_ctx__, memory_t mem__, linalg_t la__, spin_range spins__, - int idx_bra__, int idx_ket__, std::vector*> wfs__, int N__, - int n__, dmatrix>& o__, Wave_functions& tmp__, bool project_out__); -#endif - -} // namespace sddk diff --git a/src/SDDK/wf_ortho.hpp b/src/SDDK/wf_ortho.hpp deleted file mode 100644 index 25b5d945c..000000000 --- a/src/SDDK/wf_ortho.hpp +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright (c) 2013-2018 Anton Kozhevnikov, Thomas Schulthess -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, are permitted provided that -// the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the -// following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions -// and the following disclaimer in the documentation and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -/** \file wf_ortho.hpp - * - * \brief Wave-function orthonormalization. - */ -#ifndef __WF_ORTHO_HPP__ -#define __WF_ORTHO_HPP__ - -#include "wave_functions.hpp" -#include - -namespace sddk { - -/// Orthogonalize n new wave-functions to the N old wave-functions -/** Orthogonalize sets of wave-fuctionsfuctions. -\tparam T Type of the wave-functions in real space (one of float, double, complex, complex). -\param [in] spla_ctx SPLA library context. -\param [in] mem Type of memory where data resides. -\param [in] la Type of linear algebra backend. -\param [in] spins Spin index range. -\param [in] idx_bra Index of the wave-functions in the input vector.to compute the projection matrix. -\param [in,out] wfs List of wave-functions sets (typically phi, hphi and sphi). -\param [in] N Number of old wave-functions defining the existing subspace. -\param [out] o Work matrix to compute overlap -\param [out] tmp Temporary wave-functions to store intermediate results. -\param [in] project_out Project out old subspace (if this was not done before). -\return Number of linearly independent wave-functions found. -*/ -template -int -orthogonalize(::spla::Context& spla_ctx__, memory_t mem__, linalg_t la__, spin_range spins__, - int idx_bra__, int idx_ket__, std::vector>*> wfs__, int N__, - int n__, dmatrix& o__, Wave_functions>& tmp__, bool project_out__ = true); - -template -int -orthogonalize(::spla::Context& spla_ctx__, memory_t mem__, linalg_t la__, spin_range spins__, - Wave_functions>& phi__, Wave_functions>& hphi__, int N__, int n__, - dmatrix& o__, Wave_functions>& tmp__, bool project_out__ = true) -{ - static_assert(std::is_same::value || std::is_same::value || - std::is_same::value || std::is_same>::value, - "wrong type"); - - return orthogonalize(spla_ctx__, mem__, la__, spins__, 0, 0, {&phi__, &hphi__}, N__, n__, o__, tmp__, - project_out__); -} - -template -int -orthogonalize(::spla::Context& spla_ctx__, memory_t mem__, linalg_t la__, spin_range spins__, - Wave_functions>& phi__, Wave_functions>& hphi__, - Wave_functions>& ophi__, int N__, int n__, dmatrix& o__, - Wave_functions>& tmp__, bool project_out__ = true) -{ - static_assert(std::is_same::value || std::is_same::value || - std::is_same::value || std::is_same>::value, - "wrong type"); - - return orthogonalize(spla_ctx__, mem__, la__, spins__, 0, 2, {&phi__, &hphi__, &ophi__}, N__, n__, o__, tmp__, - project_out__); -} - -} - -#endif diff --git a/src/SDDK/wf_trans.hpp b/src/SDDK/wf_trans.hpp deleted file mode 100644 index 9927d5ebd..000000000 --- a/src/SDDK/wf_trans.hpp +++ /dev/null @@ -1,194 +0,0 @@ -// Copyright (c) 2013-2018 Anton Kozhevnikov, Thomas Schulthess -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, are permitted provided that -// the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the -// following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions -// and the following disclaimer in the documentation and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -/** \file wf_trans.hpp - * - * \brief Wave-function linear transformation. - */ -#ifndef __WF_TRANS_HPP__ -#define __WF_TRANS_HPP__ - -#include -#include -#include -#include "wave_functions.hpp" -#include "type_definition.hpp" -#include "utils/profiler.hpp" -#include "SDDK/omp.hpp" -#if defined(SIRIUS_GPU) -#include "gpu/acc.hpp" -#endif - -namespace sddk { - -namespace { - -template ::value>> -inline std::enable_if_t, real_type>::value, void> -transform_mt(::spla::Context& spla_ctx__, int ispn__, real_type alpha__, - std::vector*> wf_in__, int i0__, int m__, dmatrix& mtrx__, int irow0__, int jcol0__, - real_type beta__, std::vector*> wf_out__, int j0__, int n__) -{ - if (wf_in__[0]->has_mt()) { - TERMINATE("not implemented"); - } -} - -// implemented only for complex type -template ::value>> -inline std::enable_if_t, real_type>::value, void> -transform_mt(::spla::Context& spla_ctx__, int ispn__, real_type alpha__, std::vector>*> wf_in__, - int i0__, int m__, dmatrix& mtrx__, int irow0__, int jcol0__, F beta__, - std::vector>*> wf_out__, int j0__, int n__) -{ - spla::MatrixDistribution spla_mat_dist = mtrx__.spla_distribution(); - int nwf = static_cast(wf_in__.size()); - const F* mtrx_ptr = mtrx__.size_local() ? mtrx__.at(memory_t::host, 0, 0) : nullptr; - auto spins = spin_range(ispn__); - for (int iv = 0; iv < nwf; iv++) { - bool local_has_mt = wf_in__[iv]->has_mt(); - bool global_has_mt = false; - MPI_Allreduce(&local_has_mt, &global_has_mt, 1, MPI_C_BOOL, MPI_LOR, wf_in__[iv]->comm().mpi_comm()); - if (global_has_mt) { - for (auto s : spins) { - PROFILE("sddk::wf_trans|mt"); - /* input wave-functions may be scalar (this is the case of transformation of first-variational states - into spinor wave-functions or transforamtion of scalar auxiliary wave-functions into spin-dependent - wave-fucntions; in this case we set spin index of input wave-function to 0 */ - int in_s = (wf_in__[iv]->num_sc() == 1) ? 0 : s; - - if (local_has_mt) { - spla::pgemm_sbs(wf_in__[iv]->mt_coeffs(in_s).num_rows_loc(), n__, m__, alpha__, - reinterpret_cast(wf_in__[iv]->mt_coeffs(in_s).prime().at(wf_in__[iv]->preferred_memory_t(), 0, i0__)), - wf_in__[iv]->mt_coeffs(in_s).prime().ld(), mtrx_ptr, mtrx__.ld(), irow0__, jcol0__, - spla_mat_dist, beta__, - reinterpret_cast(wf_out__[iv]->mt_coeffs(s).prime().at(wf_out__[iv]->preferred_memory_t(), 0, j0__)), - wf_out__[iv]->mt_coeffs(s).prime().ld(), spla_ctx__); - } else { - spla::pgemm_sbs(0, n__, m__, alpha__, nullptr, 0, mtrx_ptr, mtrx__.ld(), - irow0__, jcol0__, spla_mat_dist, beta__, nullptr, 0, spla_ctx__); - } - } - } - } -} -} // namespace - -/// Linear transformation of the wave-functions. -/** The transformation matrix is expected in the CPU memory. The following operation is performed: - * \f[ - * \psi^{out}_{j} = \alpha \sum_{i} \psi^{in}_{i} Z_{ij} + \beta \psi^{out}_{j} - * \f] - */ -template -inline std::enable_if_t, real_type>::value, void> -transform(::spla::Context& spla_ctx__, int ispn__, real_type alpha__, - std::vector>*> wf_in__, int i0__, int m__, dmatrix& mtrx__, int irow0__, int jcol0__, - real_type beta__, std::vector>*> wf_out__, int j0__, int n__) -{ - PROFILE("sddk::wf_trans"); - int nwf = static_cast(wf_in__.size()); - - spla::MatrixDistribution spla_mat_dist = mtrx__.spla_distribution(); - - int size_factor = std::is_same>::value ? 2 : 1; - - auto spins = spin_range(ispn__); - - const F* mtrx_ptr = reinterpret_cast(mtrx__.size_local() ? mtrx__.at(memory_t::host, 0, 0) : nullptr); - - for (int iv = 0; iv < nwf; iv++) { - for (auto s : spins) { - PROFILE("sddk::wf_trans|pw"); - /* input wave-functions may be scalar (this is the case of transformation of first-variational states - into spinor wave-functions or transforamtion of scalar auxiliary wave-functions into spin-dependent - wave-fucntions; in this case we set spin index of input wave-function to 0 */ - int in_s = (wf_in__[iv]->num_sc() == 1) ? 0 : s; - - spla::pgemm_sbs(size_factor * wf_in__[iv]->pw_coeffs(in_s).num_rows_loc(), n__, m__, alpha__, - reinterpret_cast( - wf_in__[iv]->pw_coeffs(in_s).prime().at(wf_in__[iv]->preferred_memory_t(), 0, i0__)), - size_factor * wf_in__[iv]->pw_coeffs(in_s).prime().ld(), mtrx_ptr, mtrx__.ld(), irow0__, - jcol0__, spla_mat_dist, beta__, - reinterpret_cast( - wf_out__[iv]->pw_coeffs(s).prime().at(wf_out__[iv]->preferred_memory_t(), 0, j0__)), - size_factor * wf_out__[iv]->pw_coeffs(s).prime().ld(), spla_ctx__); - } - } - - transform_mt(spla_ctx__, ispn__, alpha__, wf_in__, i0__, m__, mtrx__, irow0__, jcol0__, beta__, wf_out__, j0__, - n__); -} - -template -inline std::enable_if_t, real_type>::value, void> -transform(::spla::Context& spla_ctx__, int ispn__, real_type alpha__, std::vector>*> wf_in__, - int i0__, int m__, dmatrix& mtrx__, int irow0__, int jcol0__, - real_type beta__, std::vector>*> wf_out__, int j0__, int n__) -{ - spin_range spins(ispn__); - - for (int idx = 0; idx < static_cast(wf_in__.size()); idx++) { - for (auto s : spins) { - for (int j = 0; j < n__; j++) { - for (int k = 0; k < wf_in__[idx]->pw_coeffs(s).num_rows_loc(); k++) { - complex_type z(0, 0);; - for (int i = 0; i < m__; i++) { - assert(wf_in__[idx]->pw_coeffs(s).prime(k, i + i0__) == - wf_in__[idx]->pw_coeffs(s).prime(k, i + i0__)); - z += static_cast>(wf_in__[idx]->pw_coeffs(s).prime(k, i + i0__)) * - mtrx__(irow0__ + i, jcol0__ + j); - } - assert(z == z); - if (beta__ == 0) { - wf_out__[idx]->pw_coeffs(s).prime(k, j + j0__) = alpha__ * z; - } else { - wf_out__[idx]->pw_coeffs(s).prime(k, j + j0__) = alpha__ * z + - static_cast>(wf_out__[idx]->pw_coeffs(s).prime(k, j + j0__)) * beta__; - } - assert(wf_out__[idx]->pw_coeffs(s).prime(k, j + j0__) == - wf_out__[idx]->pw_coeffs(s).prime(k, j + j0__)); - } - } - } - } - -} - -template -inline void -transform(::spla::Context& spla_ctx__, int ispn__, std::vector>*> wf_in__, - int i0__, int m__, dmatrix& mtrx__, int irow0__, int jcol0__, - std::vector>*> wf_out__, int j0__, int n__) -{ - transform(spla_ctx__ , ispn__, static_cast>(1.0), wf_in__, i0__, m__, mtrx__, irow0__, jcol0__, - static_cast>(0.0), wf_out__, j0__, n__); -} - -template -inline void -transform(::spla::Context& spla_ctx__, int ispn__, Wave_functions>& wf_in__, - int i0__, int m__, dmatrix& mtrx__, int irow0__, int jcol0__, - Wave_functions>& wf_out__, int j0__, int n__) -{ - transform(spla_ctx__, ispn__, {&wf_in__}, i0__, m__, mtrx__, irow0__, jcol0__, {&wf_out__}, j0__, n__); -} - -} -#endif diff --git a/src/api/sirius_api.cpp b/src/api/sirius_api.cpp index c1e9ba9da..bda5a6861 100644 --- a/src/api/sirius_api.cpp +++ b/src/api/sirius_api.cpp @@ -34,7 +34,6 @@ #endif #include "symmetry/crystal_symmetry.hpp" #include "band/davidson.hpp" -#include "SDDK/wf_inner.hpp" #include "multi_cg/multi_cg.hpp" struct sirius_context_handler_t @@ -1890,7 +1889,7 @@ sirius_find_ground_state_robust(void* const* gs_handler__, void* const* ks_handl } sirius::Energy energy(kset, density, potential); - if (is_device_memory(ctx.preferred_memory_t())) { + if (is_device_memory(ctx.processing_unit_memory_t())) { if (pu.empty() || pu.compare("gpu") == 0) { nlcglib::nlcg_mvp2_device(energy, smearing, temp, tol, kappa, tau, maxiter, restart); } else if (pu.compare("cpu") == 0) { @@ -3258,6 +3257,8 @@ sirius_get_wave_functions(void* const* ks_handler__, double const* vkl__, int co { PROFILE("sirius_api::sirius_get_wave_functions"); + // TODO: refactor this part; use QE order of G-vectors + auto gvec_mapping = [&](sddk::Gvec const& gkvec) { std::vector igm(*num_gvec_loc__); @@ -3377,9 +3378,9 @@ sirius_get_wave_functions(void* const* ks_handler__, double const* vkl__, int co /* send wave-functions */ if (ks.comm().rank() == src_rank) { auto kp = ks.get(jk); - int count = kp->gkvec().count(); - req = ks.comm().isend(&kp->spinor_wave_functions().pw_coeffs(s).prime(0, 0), - count * sim_ctx.num_bands(), dest_rank, tag); + int count = kp->spinor_wave_functions().ld(); + req = ks.comm().isend(kp->spinor_wave_functions().at(sddk::memory_t::host, 0, + wf::spin_index(0), wf::band_index(0)), count * sim_ctx.num_bands(), dest_rank, tag); } /* receive wave-functions */ if (ks.comm().rank() == dest_rank) { @@ -5540,7 +5541,7 @@ sirius_nlcg(void* const* handler__, void* const* ks_handler__, int* error_code__ } sirius::Energy energy(kset, density, potential); - if (is_device_memory(ctx.preferred_memory_t())) { + if (is_device_memory(ctx.processing_unit_memory_t())) { if (pu.empty() || pu.compare("gpu") == 0) { nlcglib::nlcg_mvp2_device(energy, smearing, temp, tol, kappa, tau, maxiter, restart); } else if (pu.compare("cpu") == 0) { @@ -5659,7 +5660,7 @@ sirius_nlcg_params(void* const* handler__, void* const* ks_handler__, double con nlcglib::nlcg_info info; sirius::Energy energy(kset, density, potential); - if (is_device_memory(ctx.preferred_memory_t())) { + if (is_device_memory(ctx.processing_unit_memory_t())) { if (pu.empty() || pu.compare("gpu") == 0) { info = nlcglib::nlcg_mvp2_device(energy, smearing_t, temp, tol, kappa, tau, maxiter, restart); } else if (pu.compare("cpu") == 0) { @@ -5837,7 +5838,7 @@ void sirius_linear_solver(void* const* handler__, double const* vkq__, int const PROFILE("sirius_api::sirius_linear_solver"); call_sirius( [&]() { - assert(*num_spin_comp__ == 1); + RTE_ASSERT(*num_spin_comp__ == 1); vector3d vkq(vkq__); @@ -5848,13 +5849,13 @@ void sirius_linear_solver(void* const* handler__, double const* vkq__, int const std::shared_ptr gvkq_in; if (use_qe_gvec_order) { - gvkq_in = std::make_shared(vkq, sctx.unit_cell().reciprocal_lattice_vectors(), *num_gvec_kq_loc__, - gvec_kq_loc__, sctx.comm_band(), false); + gvkq_in = std::make_shared(vkq, sctx.unit_cell().reciprocal_lattice_vectors(), + *num_gvec_kq_loc__, gvec_kq_loc__, sctx.comm_band(), false); } else { - gvkq_in = std::make_shared(vkq, sctx.unit_cell().reciprocal_lattice_vectors(), sctx.gk_cutoff(), sctx.comm_k(), false); + gvkq_in = std::make_shared(vkq, sctx.unit_cell().reciprocal_lattice_vectors(), + sctx.gk_cutoff(), sctx.comm_k(), false); } - int num_gvec_kq_loc = *num_gvec_kq_loc__; int num_gvec_kq = num_gvec_kq_loc; sctx.comm_k().allreduce(&num_gvec_kq, 1); @@ -5922,10 +5923,10 @@ void sirius_linear_solver(void* const* handler__, double const* vkq__, int const sddk::mdarray, 3> dpsi(dpsi__, *ld__, *num_spin_comp__, sctx.num_bands()); sddk::mdarray, 3> dvpsi(dvpsi__, *ld__, *num_spin_comp__, sctx.num_bands()); - auto dpsi_wf = sirius::wave_function_factory(sctx, kp, sctx.num_bands(), *num_spin_comp__, false); - auto psi_wf = sirius::wave_function_factory(sctx, kp, sctx.num_bands(), *num_spin_comp__, false); - auto dvpsi_wf = sirius::wave_function_factory(sctx, kp, sctx.num_bands(), *num_spin_comp__, false); - auto tmp_wf = sirius::wave_function_factory(sctx, kp, sctx.num_bands(), *num_spin_comp__, false); + auto dpsi_wf = sirius::wave_function_factory(sctx, kp, wf::num_bands(sctx.num_bands()), wf::num_mag_dims(0), false); + auto psi_wf = sirius::wave_function_factory(sctx, kp, wf::num_bands(sctx.num_bands()), wf::num_mag_dims(0), false); + auto dvpsi_wf = sirius::wave_function_factory(sctx, kp, wf::num_bands(sctx.num_bands()), wf::num_mag_dims(0), false); + auto tmp_wf = sirius::wave_function_factory(sctx, kp, wf::num_bands(sctx.num_bands()), wf::num_mag_dims(0), false); std::vector> tmp_psi(num_gvec_kq); std::vector> tmp_dpsi(num_gvec_kq); @@ -5935,9 +5936,9 @@ void sirius_linear_solver(void* const* handler__, double const* vkq__, int const for (int i = 0; i < sctx.num_bands(); i++) { if (use_qe_gvec_order) { for (int ig = 0; ig < kp.gkvec().count(); ig++) { - psi_wf->pw_coeffs(ispn).prime(ig, i) = psi(ig, ispn, i); - dpsi_wf->pw_coeffs(ispn).prime(ig, i) = dpsi(ig, ispn, i); - dvpsi_wf->pw_coeffs(ispn).prime(ig, i) = dvpsi(ig, ispn, i) / 2.0; + psi_wf->pw_coeffs(ig, wf::spin_index(ispn), wf::band_index(i)) = psi(ig, ispn, i); + dpsi_wf->pw_coeffs(ig, wf::spin_index(ispn), wf::band_index(i)) = dpsi(ig, ispn, i); + dvpsi_wf->pw_coeffs(ig, wf::spin_index(ispn), wf::band_index(i)) = dvpsi(ig, ispn, i) / 2.0; } } else { /* gather the full wave-function in the order of QE */ @@ -5952,11 +5953,11 @@ void sirius_linear_solver(void* const* handler__, double const* vkq__, int const /* copy local part */ for (int ig = 0; ig < gvkq.count(); ig++) { - psi_wf->pw_coeffs(ispn).prime(ig, i) = tmp_psi[igmap[ig + gvkq.offset()]]; - dpsi_wf->pw_coeffs(ispn).prime(ig, i) = tmp_dpsi[igmap[ig + gvkq.offset()]]; + psi_wf->pw_coeffs(ig, wf::spin_index(ispn), wf::band_index(i)) = tmp_psi[igmap[ig + gvkq.offset()]]; + dpsi_wf->pw_coeffs(ig, wf::spin_index(ispn), wf::band_index(i)) = tmp_dpsi[igmap[ig + gvkq.offset()]]; // divide by two to account for hartree / rydberg, this is // dv * psi and dv should be 2x smaller in sirius. - dvpsi_wf->pw_coeffs(ispn).prime(ig, i) = tmp_dvpsi[igmap[ig + gvkq.offset()]] / 2.0; + dvpsi_wf->pw_coeffs(ig, wf::spin_index(ispn), wf::band_index(i)) = tmp_dvpsi[igmap[ig + gvkq.offset()]] / 2.0; } } } @@ -5976,11 +5977,11 @@ void sirius_linear_solver(void* const* handler__, double const* vkq__, int const //} // setup auxiliary state vectors for CG. - auto U = sirius::wave_function_factory(sctx, kp, sctx.num_bands(), *num_spin_comp__, false); - auto C = sirius::wave_function_factory(sctx, kp, sctx.num_bands(), *num_spin_comp__, false); + auto U = sirius::wave_function_factory(sctx, kp, wf::num_bands(sctx.num_bands()), wf::num_mag_dims(0), false); + auto C = sirius::wave_function_factory(sctx, kp, wf::num_bands(sctx.num_bands()), wf::num_mag_dims(0), false); - auto Hphi_wf = sirius::wave_function_factory(sctx, kp, sctx.num_bands(), *num_spin_comp__, false); - auto Sphi_wf = sirius::wave_function_factory(sctx, kp, sctx.num_bands(), *num_spin_comp__, false); + auto Hphi_wf = sirius::wave_function_factory(sctx, kp, wf::num_bands(sctx.num_bands()), wf::num_mag_dims(0), false); + auto Sphi_wf = sirius::wave_function_factory(sctx, kp, wf::num_bands(sctx.num_bands()), wf::num_mag_dims(0), false); sirius::lr::Linear_response_operator linear_operator( const_cast(sctx), @@ -6027,11 +6028,11 @@ void sirius_linear_solver(void* const* handler__, double const* vkq__, int const for (int i = 0; i < sctx.num_bands(); i++) { if (use_qe_gvec_order) { for (int ig = 0; ig < kp.gkvec().count(); ig++) { - dpsi(ig, ispn, i) = dpsi_wf->pw_coeffs(ispn).prime(ig, i); + dpsi(ig, ispn, i) = dpsi_wf->pw_coeffs(ig, wf::spin_index(ispn), wf::band_index(i)); } } else { for (int ig = 0; ig < gvkq.count(); ++ig) { - tmp_dpsi[igmap[ig + gvkq.offset()]] = dpsi_wf->pw_coeffs(ispn).prime(ig, i); + tmp_dpsi[igmap[ig + gvkq.offset()]] = dpsi_wf->pw_coeffs(ig, wf::spin_index(ispn), wf::band_index(i)); } gvkq.comm().allgather(tmp_dpsi.data(), gkq_in_distr.counts.data(), gkq_in_distr.offsets.data()); for (int ig = 0; ig < num_gvec_kq_loc; ig++) { @@ -6042,7 +6043,6 @@ void sirius_linear_solver(void* const* handler__, double const* vkq__, int const } }, error_code__); - } /* diff --git a/src/band/band.cpp b/src/band/band.cpp index e77f7c11b..f94edf333 100644 --- a/src/band/band.cpp +++ b/src/band/band.cpp @@ -25,8 +25,6 @@ #include "band.hpp" #include "context/simulation_context.hpp" #include "k_point/k_point_set.hpp" -#include "SDDK/wf_trans.hpp" -#include "SDDK/wf_inner.hpp" #include "utils/profiler.hpp" namespace sirius { @@ -42,91 +40,6 @@ Band::Band(Simulation_context& ctx__) } } -template -void -Band::set_subspace_mtrx(int N__, int n__, int num_locked, sddk::Wave_functions>& phi__, - sddk::Wave_functions>& op_phi__, sddk::dmatrix& mtrx__, - sddk::dmatrix* mtrx_old__) const -{ - PROFILE("sirius::Band::set_subspace_mtrx"); - - assert(n__ != 0); - if (mtrx_old__ && mtrx_old__->size()) { - assert(&mtrx__.blacs_grid() == &mtrx_old__->blacs_grid()); - } - - /* copy old N - num_locked x N - num_locked distributed matrix */ - if (N__ > 0) { - sddk::splindex spl_row(N__ - num_locked, mtrx__.blacs_grid().num_ranks_row(), - mtrx__.blacs_grid().rank_row(), mtrx__.bs_row()); - sddk::splindex spl_col(N__ - num_locked, mtrx__.blacs_grid().num_ranks_col(), - mtrx__.blacs_grid().rank_col(), mtrx__.bs_col()); - if (mtrx_old__) { - if (spl_row.local_size()) { - #pragma omp parallel for schedule(static) - for (int i = 0; i < spl_col.local_size(); i++) { - std::copy(&(*mtrx_old__)(0, i), &(*mtrx_old__)(0, i) + spl_row.local_size(), &mtrx__(0, i)); - } - } - } - - if (ctx_.print_checksum()) { - auto cs = mtrx__.checksum(N__ - num_locked, N__ - num_locked); - if (ctx_.comm_band().rank() == 0) { - utils::print_checksum("subspace_mtrx_old", cs, RTE_OUT(ctx_.out())); - } - } - } - - /* <{phi,phi_new}|Op|phi_new> */ - inner(ctx_.spla_context(), sddk::spin_range((ctx_.num_mag_dims() == 3) ? 2 : 0), phi__, num_locked, - N__ + n__ - num_locked, op_phi__, N__, n__, mtrx__, 0, N__ - num_locked); - - /* restore lower part */ - if (N__ > 0) { - if (mtrx__.blacs_grid().comm().size() == 1) { - #pragma omp parallel for - for (int i = 0; i < N__ - num_locked; i++) { - for (int j = N__ - num_locked; j < N__ + n__ - num_locked; j++) { - mtrx__(j, i) = utils::conj(mtrx__(i, j)); - } - } - } else { - sddk::linalg(sddk::linalg_t::scalapack) - .tranc(n__, N__ - num_locked, mtrx__, 0, N__ - num_locked, mtrx__, N__ - num_locked, 0); - } - } - - if (ctx_.print_checksum()) { - sddk::splindex spl_row(N__ + n__ - num_locked, mtrx__.blacs_grid().num_ranks_row(), - mtrx__.blacs_grid().rank_row(), mtrx__.bs_row()); - sddk::splindex spl_col(N__ + n__ - num_locked, mtrx__.blacs_grid().num_ranks_col(), - mtrx__.blacs_grid().rank_col(), mtrx__.bs_col()); - auto cs = mtrx__.checksum(N__ + n__ - num_locked, N__ + n__ - num_locked); - if (ctx_.comm_band().rank() == 0) { - utils::print_checksum("subspace_mtrx", cs, RTE_OUT(ctx_.out())); - } - } - - /* remove any numerical noise */ - mtrx__.make_real_diag(N__ + n__ - num_locked); - - /* save new matrix */ - if (mtrx_old__) { - sddk::splindex spl_row(N__ + n__ - num_locked, mtrx__.blacs_grid().num_ranks_row(), - mtrx__.blacs_grid().rank_row(), mtrx__.bs_row()); - sddk::splindex spl_col(N__ + n__ - num_locked, mtrx__.blacs_grid().num_ranks_col(), - mtrx__.blacs_grid().rank_col(), mtrx__.bs_col()); - - if (spl_row.local_size()) { - #pragma omp parallel for schedule(static) - for (int i = 0; i < spl_col.local_size(); i++) { - std::copy(&mtrx__(0, i), &mtrx__(0, i) + spl_row.local_size(), &(*mtrx_old__)(0, i)); - } - } - } -} - template void Band::initialize_subspace(K_point_set& kset__, Hamiltonian0& H0__) const @@ -145,9 +58,9 @@ Band::initialize_subspace(K_point_set& kset__, Hamiltonian0& H0__) const auto kp = kset__.get(ik); auto Hk = H0__(*kp); if (ctx_.gamma_point() && (ctx_.so_correction() == false)) { - initialize_subspace(Hk, N); + ::sirius::initialize_subspace(Hk, N); } else { - initialize_subspace>(Hk, N); + ::sirius::initialize_subspace>(Hk, N); } } @@ -162,429 +75,66 @@ Band::initialize_subspace(K_point_set& kset__, Hamiltonian0& H0__) const } } -template -void -Band::initialize_subspace(Hamiltonian_k>& Hk__, int num_ao__) const -{ - PROFILE("sirius::Band::initialize_subspace|kp"); - - if (ctx_.cfg().control().verification() >= 2) { - auto eval = diag_S_davidson(Hk__); - if (eval[0] <= 0) { - std::stringstream s; - s << "S-operator matrix is not positive definite\n" - << " lowest eigen-value: " << eval[0]; - WARNING(s); - } else { - ctx_.message(1, __function_name__, "S-matrix is OK! Minimum eigen-value: %18.12f\n", eval[0]); - } - } - - /* number of non-zero spin components */ - const int num_sc = (ctx_.num_mag_dims() == 3) ? 2 : 1; - - /* short notation for number of target wave-functions */ - int num_bands = ctx_.num_bands(); - - /* number of basis functions */ - int num_phi = std::max(num_ao__, num_bands / num_sc); - - int num_phi_tot = num_phi * num_sc; - - auto& mp = ctx_.mem_pool(ctx_.host_memory_t()); - - ctx_.print_memory_usage(__FILE__, __LINE__); - - /* initial basis functions */ - sddk::Wave_functions> phi(mp, Hk__.kp().gkvec_partition(), num_phi_tot, ctx_.preferred_memory_t(), num_sc); - for (int ispn = 0; ispn < num_sc; ispn++) { - phi.pw_coeffs(ispn).prime().zero(); - } - - /* generate the initial atomic wavefunctions */ - std::vector atoms(ctx_.unit_cell().num_atoms()); - std::iota(atoms.begin(), atoms.end(), 0); - Hk__.kp().generate_atomic_wave_functions(atoms, [&](int iat){return &ctx_.unit_cell().atom_type(iat).indexb_wfs();}, - ctx_.ps_atomic_wf_ri(), phi); - - /* generate some random noise */ - std::vector tmp(4096); - for (int i = 0; i < 4096; i++) { - tmp[i] = 1e-5 * utils::random(); - } - PROFILE_START("sirius::Band::initialize_subspace|kp|wf"); - /* fill remaining wave-functions with pseudo-random guess */ - assert(Hk__.kp().num_gkvec() > num_phi + 10); - #pragma omp parallel - { - for (int i = 0; i < num_phi - num_ao__; i++) { - #pragma omp for schedule(static) nowait - for (int igk_loc = 0; igk_loc < Hk__.kp().num_gkvec_loc(); igk_loc++) { - /* global index of G+k vector */ - int igk = Hk__.kp().idxgk(igk_loc); - if (igk == i + 1) { - phi.pw_coeffs(0).prime(igk_loc, num_ao__ + i) = 1.0; - } - if (igk == i + 2) { - phi.pw_coeffs(0).prime(igk_loc, num_ao__ + i) = 0.5; - } - if (igk == i + 3) { - phi.pw_coeffs(0).prime(igk_loc, num_ao__ + i) = 0.25; - } - } - } - /* add random noise */ - for (int i = 0; i < num_phi; i++) { - #pragma omp for schedule(static) nowait - for (int igk_loc = Hk__.kp().gkvec().skip_g0(); igk_loc < Hk__.kp().num_gkvec_loc(); igk_loc++) { - /* global index of G+k vector */ - int igk = Hk__.kp().idxgk(igk_loc); - phi.pw_coeffs(0).prime(igk_loc, i) += tmp[igk & 0xFFF]; - } - } - } - - if (ctx_.num_mag_dims() == 3) { - /* make pure spinor up- and dn- wave functions */ - phi.copy_from(sddk::device_t::CPU, num_phi, phi, 0, 0, 1, num_phi); - } - PROFILE_STOP("sirius::Band::initialize_subspace|kp|wf"); - - /* allocate wave-functions */ - sddk::Wave_functions> hphi(mp, Hk__.kp().gkvec_partition(), num_phi_tot, ctx_.preferred_memory_t(), num_sc); - sddk::Wave_functions> ophi(mp, Hk__.kp().gkvec_partition(), num_phi_tot, ctx_.preferred_memory_t(), num_sc); - /* temporary wave-functions required as a storage during orthogonalization */ - sddk::Wave_functions> wf_tmp(mp, Hk__.kp().gkvec_partition(), num_phi_tot, ctx_.preferred_memory_t(), num_sc); - - int bs = ctx_.cyclic_block_size(); - - auto& gen_solver = ctx_.gen_evp_solver(); - - sddk::dmatrix hmlt(num_phi_tot, num_phi_tot, ctx_.blacs_grid(), bs, bs, mp); - sddk::dmatrix ovlp(num_phi_tot, num_phi_tot, ctx_.blacs_grid(), bs, bs, mp); - sddk::dmatrix evec(num_phi_tot, num_phi_tot, ctx_.blacs_grid(), bs, bs, mp); - - std::vector> eval(num_bands); - - ctx_.print_memory_usage(__FILE__, __LINE__); - - if (is_device_memory(ctx_.preferred_memory_t())) { - auto& mpd = ctx_.mem_pool(sddk::memory_t::device); - - for (int ispn = 0; ispn < num_sc; ispn++) { - phi.pw_coeffs(ispn).allocate(mpd); - phi.pw_coeffs(ispn).copy_to(sddk::memory_t::device, 0, num_phi_tot); - } - - for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { - Hk__.kp().spinor_wave_functions().pw_coeffs(ispn).allocate(mpd); - } - - for (int ispn = 0; ispn < num_sc; ispn++) { - hphi.pw_coeffs(ispn).allocate(mpd); - ophi.pw_coeffs(ispn).allocate(mpd); - wf_tmp.pw_coeffs(ispn).allocate(mpd); - } - evec.allocate(mpd); - hmlt.allocate(mpd); - ovlp.allocate(mpd); - } - - ctx_.print_memory_usage(__FILE__, __LINE__); - - if (ctx_.print_checksum()) { - for (int ispn = 0; ispn < num_sc; ispn++) { - auto cs = phi.checksum_pw(get_device_t(ctx_.preferred_memory_t()), ispn, 0, num_phi_tot); - if (Hk__.kp().comm().rank() == 0) { - std::stringstream s; - s << "initial_phi" << ispn; - utils::print_checksum(s.str(), cs); - } - } - } - - for (int ispn_step = 0; ispn_step < ctx_.num_spinors(); ispn_step++) { - /* apply Hamiltonian and overlap operators to the new basis functions */ - Hk__.template apply_h_s(sddk::spin_range((ctx_.num_mag_dims() == 3) ? 2 : ispn_step), 0, num_phi_tot, phi, &hphi, &ophi); - - /* do some checks */ - if (ctx_.cfg().control().verification() >= 1) { - - set_subspace_mtrx(0, num_phi_tot, 0, phi, ophi, ovlp); - if (ctx_.cfg().control().verification() >= 2 && ctx_.verbosity() >= 2) { - auto s = ovlp.serialize("overlap", num_phi_tot, num_phi_tot); - if (Hk__.kp().comm().rank() == 0) { - ctx_.out() << s.str() << std::endl; - } - } - - double max_diff = check_hermitian(ovlp, num_phi_tot); - if (max_diff > 1e-12) { - std::stringstream s; - s << "overlap matrix is not hermitian, max_err = " << max_diff; - WARNING(s); - } - std::vector> eo(num_phi_tot); - auto& std_solver = ctx_.std_evp_solver(); - if (std_solver.solve(num_phi_tot, num_phi_tot, ovlp, eo.data(), evec)) { - std::stringstream s; - s << "error in diagonalization"; - WARNING(s); - } - Hk__.kp().message(1, __function_name__, "minimum eigen-value of the overlap matrix: %18.12f\n", eo[0]); - if (eo[0] < 0) { - WARNING("overlap matrix is not positively defined"); - } - } - - /* setup eigen-value problem */ - set_subspace_mtrx(0, num_phi_tot, 0, phi, hphi, hmlt); - set_subspace_mtrx(0, num_phi_tot, 0, phi, ophi, ovlp); - - if (ctx_.cfg().control().verification() >= 2 && ctx_.verbosity() >= 2) { - auto s1 = hmlt.serialize("hmlt", num_phi_tot, num_phi_tot); - auto s2 = hmlt.serialize("ovlp", num_phi_tot, num_phi_tot); - if (Hk__.kp().comm().rank() == 0) { - ctx_.out() << s1.str() << std::endl << s2.str() << std::endl; - } - } - - /* solve generalized eigen-value problem with the size N and get lowest num_bands eigen-vectors */ - if (gen_solver.solve(num_phi_tot, num_bands, hmlt, ovlp, eval.data(), evec)) { - RTE_THROW("error in diagonalization"); - } - - if (ctx_.print_checksum()) { - auto cs = evec.checksum(num_phi_tot, num_bands); - real_type cs1{0}; - for (int i = 0; i < num_bands; i++) { - cs1 += eval[i]; - } - if (Hk__.kp().comm().rank() == 0) { - utils::print_checksum("evec", cs); - utils::print_checksum("eval", cs1); - } - } - for (int i = 0; i < num_bands; i++) { - Hk__.kp().message(3, __function_name__, "eval[%i]=%20.16f\n", i, eval[i]); - } - - /* compute wave-functions */ - /* \Psi_{i} = \sum_{mu} \phi_{mu} * Z_{mu, i} */ - transform(ctx_.spla_context(), (ctx_.num_mag_dims() == 3) ? 2 : ispn_step, {&phi}, 0, num_phi_tot, evec, 0, - 0, {&Hk__.kp().spinor_wave_functions()}, 0, num_bands); - - for (int j = 0; j < num_bands; j++) { - Hk__.kp().band_energy(j, ispn_step, eval[j]); - } - } - - if (ctx_.print_checksum()) { - for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { - auto cs = Hk__.kp().spinor_wave_functions().checksum_pw(get_device_t(ctx_.preferred_memory_t()), ispn, 0, num_bands); - std::stringstream s; - s << "initial_spinor_wave_functions_" << ispn; - if (Hk__.kp().comm().rank() == 0) { - utils::print_checksum(s.str(), cs); - } - } - } - - if (is_device_memory(ctx_.preferred_memory_t())) { - for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { - Hk__.kp().spinor_wave_functions().pw_coeffs(ispn).copy_to(sddk::memory_t::host, 0, num_bands); - Hk__.kp().spinor_wave_functions().pw_coeffs(ispn).deallocate(sddk::memory_t::device); - } - } - - if (ctx_.print_checksum()) { - for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { - auto cs = Hk__.kp().spinor_wave_functions().checksum_pw(sddk::device_t::CPU, ispn, 0, num_bands); - std::stringstream s; - s << "initial_spinor_wave_functions_" << ispn; - if (Hk__.kp().comm().rank() == 0) { - utils::print_checksum(s.str(), cs); - } - } - } - - /* check residuals */ - if (ctx_.cfg().control().verification() >= 2) { - check_residuals(Hk__); - check_wave_functions(Hk__); - } - - ctx_.print_memory_usage(__FILE__, __LINE__); -} - -template -void Band::check_residuals(Hamiltonian_k>& Hk__) const -{ - auto& kp = Hk__.kp(); - kp.message(1, __function_name__, "%s", "checking residuals\n"); - - const bool nc_mag = (ctx_.num_mag_dims() == 3); - const int num_sc = nc_mag ? 2 : 1; - - auto& psi = kp.spinor_wave_functions(); - sddk::Wave_functions> hpsi(kp.gkvec_partition(), ctx_.num_bands(), ctx_.preferred_memory_t(), num_sc); - sddk::Wave_functions> spsi(kp.gkvec_partition(), ctx_.num_bands(), ctx_.preferred_memory_t(), num_sc); - sddk::Wave_functions> res(kp.gkvec_partition(), ctx_.num_bands(), ctx_.preferred_memory_t(), num_sc); - - if (is_device_memory(ctx_.preferred_memory_t())) { - auto& mpd = ctx_.mem_pool(sddk::memory_t::device); - for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { - psi.pw_coeffs(ispn).allocate(mpd); - psi.pw_coeffs(ispn).copy_to(sddk::memory_t::device, 0, ctx_.num_bands()); - } - for (int i = 0; i < num_sc; i++) { - res.pw_coeffs(i).allocate(mpd); - hpsi.pw_coeffs(i).allocate(mpd); - spsi.pw_coeffs(i).allocate(mpd); - } - } - /* compute residuals */ - for (int ispin_step = 0; ispin_step < ctx_.num_spinors(); ispin_step++) { - /* apply Hamiltonian and S operators to the wave-functions */ - Hk__.template apply_h_s(sddk::spin_range(nc_mag ? 2 : ispin_step), 0, ctx_.num_bands(), psi, &hpsi, &spsi); - - for (int ispn = 0; ispn < num_sc; ispn++) { - if (is_device_memory(ctx_.preferred_memory_t())) { - hpsi.copy_to(sddk::spin_range(ispn), sddk::memory_t::host, 0, ctx_.num_bands()); - spsi.copy_to(sddk::spin_range(ispn), sddk::memory_t::host, 0, ctx_.num_bands()); - } - #pragma omp parallel for schedule(static) - for (int j = 0; j < ctx_.num_bands(); j++) { - for (int ig = 0; ig < kp.num_gkvec_loc(); ig++) { - res.pw_coeffs(ispn).prime(ig, j) = hpsi.pw_coeffs(ispn).prime(ig, j) - - spsi.pw_coeffs(ispn).prime(ig, j) * - static_cast>(kp.band_energy(j, ispin_step)); - } - } - } - /* get the norm */ - auto l2norm = res.l2norm(sddk::device_t::CPU, nc_mag ? sddk::spin_range(2) : sddk::spin_range(0), ctx_.num_bands()); - - for (int j = 0; j < ctx_.num_bands(); j++) { - Hk__.kp().message(1, __function_name__, "band: %3i, residual l2norm: %18.12f\n", j, l2norm[j]); - } - } - if (is_device_memory(ctx_.preferred_memory_t())) { - for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { - psi.pw_coeffs(ispn).deallocate(sddk::memory_t::device); - } - } -} - -/// Check wave-functions for orthonormalization. -template -void Band::check_wave_functions(Hamiltonian_k>& Hk__) const -{ - auto& kp = Hk__.kp(); - kp.message(1, __function_name__, "%s", "checking wave-functions\n"); - - if (!ctx_.full_potential()) { - - sddk::dmatrix ovlp(ctx_.num_bands(), ctx_.num_bands(), ctx_.blacs_grid(), ctx_.cyclic_block_size(), ctx_.cyclic_block_size()); - - const bool nc_mag = (ctx_.num_mag_dims() == 3); - const int num_sc = nc_mag ? 2 : 1; - - auto& psi = kp.spinor_wave_functions(); - sddk::Wave_functions> spsi(kp.gkvec_partition(), ctx_.num_bands(), ctx_.preferred_memory_t(), num_sc); - - if (is_device_memory(ctx_.preferred_memory_t())) { - auto& mpd = ctx_.mem_pool(sddk::memory_t::device); - for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { - psi.pw_coeffs(ispn).allocate(mpd); - psi.pw_coeffs(ispn).copy_to(sddk::memory_t::device, 0, ctx_.num_bands()); - } - for (int i = 0; i < num_sc; i++) { - spsi.pw_coeffs(i).allocate(mpd); - } - ovlp.allocate(sddk::memory_t::device); - } - - /* compute residuals */ - for (int ispin_step = 0; ispin_step < ctx_.num_spinors(); ispin_step++) { - auto sr = sddk::spin_range(nc_mag ? 2 : ispin_step); - /* apply Hamiltonian and S operators to the wave-functions */ - Hk__.template apply_h_s(sr, 0, ctx_.num_bands(), psi, nullptr, &spsi); - inner(ctx_.spla_context(), sr, psi, 0, ctx_.num_bands(), spsi, 0, ctx_.num_bands(), ovlp, 0, 0); - - double diff = check_identity(ovlp, ctx_.num_bands()); - - if (diff > 1e-12) { - kp.message(1, __function_name__, "overlap matrix is not identity, maximum error : %20.12f\n", diff); - } else { - kp.message(1, __function_name__, "%s", "OK! Wave functions are orthonormal.\n"); - } - } - if (is_device_memory(ctx_.preferred_memory_t())) { - for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { - psi.pw_coeffs(ispn).deallocate(sddk::memory_t::device); - } - } - } -} - -template -void -Band::set_subspace_mtrx(int N__, int n__, int num_locked, sddk::Wave_functions& phi__, - sddk::Wave_functions& op_phi__, sddk::dmatrix& mtrx__, sddk::dmatrix* mtrx_old__) const; -template -void -Band::set_subspace_mtrx(int N__, int n__, int num_locked, - sddk::Wave_functions& phi__, sddk::Wave_functions& op_phi__, - sddk::dmatrix& mtrx__, sddk::dmatrix* mtrx_old__) const; +///// Check wave-functions for orthonormalization. +//template +//void Band::check_wave_functions(Hamiltonian_k>& Hk__) const +//{ +// auto& kp = Hk__.kp(); +// kp.message(1, __function_name__, "%s", "checking wave-functions\n"); +// +// if (!ctx_.full_potential()) { +// +// sddk::dmatrix ovlp(ctx_.num_bands(), ctx_.num_bands(), ctx_.blacs_grid(), ctx_.cyclic_block_size(), ctx_.cyclic_block_size()); +// +// const bool nc_mag = (ctx_.num_mag_dims() == 3); +// const int num_sc = nc_mag ? 2 : 1; +// +// auto& psi = kp.spinor_wave_functions(); +// sddk::Wave_functions> spsi(kp.gkvec_partition(), ctx_.num_bands(), ctx_.preferred_memory_t(), num_sc); +// +// if (is_device_memory(ctx_.preferred_memory_t())) { +// auto& mpd = ctx_.mem_pool(sddk::memory_t::device); +// for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { +// psi.pw_coeffs(ispn).allocate(mpd); +// psi.pw_coeffs(ispn).copy_to(sddk::memory_t::device, 0, ctx_.num_bands()); +// } +// for (int i = 0; i < num_sc; i++) { +// spsi.pw_coeffs(i).allocate(mpd); +// } +// ovlp.allocate(sddk::memory_t::device); +// } +// +// /* compute residuals */ +// for (int ispin_step = 0; ispin_step < ctx_.num_spinors(); ispin_step++) { +// auto sr = sddk::spin_range(nc_mag ? 2 : ispin_step); +// /* apply Hamiltonian and S operators to the wave-functions */ +// Hk__.template apply_h_s(sr, 0, ctx_.num_bands(), psi, nullptr, &spsi); +// inner(ctx_.spla_context(), sr, psi, 0, ctx_.num_bands(), spsi, 0, ctx_.num_bands(), ovlp, 0, 0); +// +// double diff = check_identity(ovlp, ctx_.num_bands()); +// +// if (diff > 1e-12) { +// kp.message(1, __function_name__, "overlap matrix is not identity, maximum error : %20.12f\n", diff); +// } else { +// kp.message(1, __function_name__, "%s", "OK! Wave functions are orthonormal.\n"); +// } +// } +// if (is_device_memory(ctx_.preferred_memory_t())) { +// for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { +// psi.pw_coeffs(ispn).deallocate(sddk::memory_t::device); +// } +// } +// } +//} template void Band::initialize_subspace(K_point_set& kset__, Hamiltonian0& H0__) const; - -template -void -Band::initialize_subspace(Hamiltonian_k& Hk__, int num_ao__) const; - -template -void -Band::initialize_subspace>(Hamiltonian_k& Hk__, int num_ao__) const; - #if defined(USE_FP32) -template -void -Band::set_subspace_mtrx(int N__, int n__, int num_locked, sddk::Wave_functions& phi__, - sddk::Wave_functions& op_phi__, sddk::dmatrix& mtrx__, sddk::dmatrix* mtrx_old__) const; - -template -void -Band::set_subspace_mtrx(int N__, int n__, int num_locked, sddk::Wave_functions& phi__, - sddk::Wave_functions& op_phi__, sddk::dmatrix& mtrx__, sddk::dmatrix* mtrx_old__) const; - -template -void -Band::set_subspace_mtrx, std::complex>(int N__, int n__, int num_locked, - sddk::Wave_functions& phi__, sddk::Wave_functions& op_phi__, - sddk::dmatrix>& mtrx__, sddk::dmatrix>* mtrx_old__) const; - -template -void -Band::set_subspace_mtrx, std::complex>(int N__, int n__, int num_locked, - sddk::Wave_functions& phi__, sddk::Wave_functions& op_phi__, - sddk::dmatrix>& mtrx__, sddk::dmatrix>* mtrx_old__) const; - template void Band::initialize_subspace(K_point_set& kset__, Hamiltonian0& H0__) const; - -template -void -Band::initialize_subspace(Hamiltonian_k& Hk__, int num_ao__) const; - -template -void -Band::initialize_subspace>(Hamiltonian_k& Hk__, int num_ao__) const; #endif } diff --git a/src/band/band.hpp b/src/band/band.hpp index 18e87d19f..3ea33becf 100644 --- a/src/band/band.hpp +++ b/src/band/band.hpp @@ -28,15 +28,10 @@ #include "SDDK/memory.hpp" #include "SDDK/type_definition.hpp" #include "hamiltonian/hamiltonian.hpp" - -namespace sddk { -/* forward declaration */ -class BLACS_grid; -} +#include "k_point/k_point_set.hpp" +#include "SDDK/wave_functions.hpp" namespace sirius { -/* forward declaration */ -class K_point_set; /// Setup and solve the eigen value problem. class Band // TODO: Band class is lightweight and in principle can be converted to a namespace @@ -66,8 +61,8 @@ class Band // TODO: Band class is lightweight and in principle can be converted void get_singular_components(Hamiltonian_k& Hk__, double itsol_tol__) const; /// Exact (not iterative) diagonalization of the Hamiltonian. - template - void diag_pseudo_potential_exact(int ispn__, Hamiltonian_k>& Hk__) const; + template + void diag_pseudo_potential_exact(int ispn__, Hamiltonian_k& Hk__) const; /// Diagonalize S operator to check for the negative eigen-values. template @@ -81,13 +76,98 @@ class Band // TODO: Band class is lightweight and in principle can be converted * for the subspace spanned by the wave-functions \f$ \phi_i \f$. The matrix is always returned * in the CPU pointer because most of the standard math libraries start from the CPU. */ template - void set_subspace_mtrx(int N__, int n__, int num_locked, sddk::Wave_functions>& phi__, - sddk::Wave_functions>& op_phi__, sddk::dmatrix& mtrx__, - sddk::dmatrix* mtrx_old__ = nullptr) const; + void set_subspace_mtrx(int N__, int n__, int num_locked__, wf::Wave_functions& phi__, + wf::Wave_functions& op_phi__, sddk::dmatrix& mtrx__, + sddk::dmatrix* mtrx_old__ = nullptr) const + { + PROFILE("sirius::Band::set_subspace_mtrx"); + + RTE_ASSERT(n__ != 0); + if (mtrx_old__ && mtrx_old__->size()) { + RTE_ASSERT(&mtrx__.blacs_grid() == &mtrx_old__->blacs_grid()); + } + + /* copy old N - num_locked x N - num_locked distributed matrix */ + if (N__ > 0) { + sddk::splindex spl_row(N__ - num_locked__, + mtrx__.blacs_grid().num_ranks_row(), mtrx__.blacs_grid().rank_row(), mtrx__.bs_row()); + sddk::splindex spl_col(N__ - num_locked__, + mtrx__.blacs_grid().num_ranks_col(), mtrx__.blacs_grid().rank_col(), mtrx__.bs_col()); + + if (mtrx_old__) { + if (spl_row.local_size()) { + #pragma omp parallel for schedule(static) + for (int i = 0; i < spl_col.local_size(); i++) { + std::copy(&(*mtrx_old__)(0, i), &(*mtrx_old__)(0, i) + spl_row.local_size(), &mtrx__(0, i)); + } + } + } + + if (ctx_.print_checksum()) { + auto cs = mtrx__.checksum(N__ - num_locked__, N__ - num_locked__); + if (ctx_.comm_band().rank() == 0) { + utils::print_checksum("subspace_mtrx_old", cs, RTE_OUT(ctx_.out())); + } + } + } + + /* [--- num_locked -- | ------ N - num_locked ---- | ---- n ----] */ + /* [ ------------------- N ------------------------| ---- n ----] */ + + auto mem = ctx_.processing_unit() == sddk::device_t::CPU ? sddk::memory_t::host : sddk::memory_t::device; + /* <{phi,phi_new}|Op|phi_new> */ + inner(ctx_.spla_context(), mem, ctx_.num_mag_dims() == 3 ? wf::spin_range(0, 2) : wf::spin_range(0), phi__, + wf::band_range(num_locked__, N__ + n__), op_phi__, wf::band_range(N__, N__ + n__), + mtrx__, 0, N__ - num_locked__); + + /* restore lower part */ + if (N__ > 0) { + if (mtrx__.blacs_grid().comm().size() == 1) { + #pragma omp parallel for + for (int i = 0; i < N__ - num_locked__; i++) { + for (int j = N__ - num_locked__; j < N__ + n__ - num_locked__; j++) { + mtrx__(j, i) = utils::conj(mtrx__(i, j)); + } + } + } else { + sddk::linalg(sddk::linalg_t::scalapack) + .tranc(n__, N__ - num_locked__, mtrx__, 0, N__ - num_locked__, mtrx__, N__ - num_locked__, 0); + } + } + + if (ctx_.print_checksum()) { + sddk::splindex spl_row(N__ + n__ - num_locked__, + mtrx__.blacs_grid().num_ranks_row(), mtrx__.blacs_grid().rank_row(), mtrx__.bs_row()); + sddk::splindex spl_col(N__ + n__ - num_locked__, + mtrx__.blacs_grid().num_ranks_col(), mtrx__.blacs_grid().rank_col(), mtrx__.bs_col()); + auto cs = mtrx__.checksum(N__ + n__ - num_locked__, N__ + n__ - num_locked__); + if (ctx_.comm_band().rank() == 0) { + utils::print_checksum("subspace_mtrx", cs, RTE_OUT(ctx_.out())); + } + } + + /* remove any numerical noise */ + mtrx__.make_real_diag(N__ + n__ - num_locked__); + + /* save new matrix */ + if (mtrx_old__) { + sddk::splindex spl_row(N__ + n__ - num_locked__, + mtrx__.blacs_grid().num_ranks_row(), mtrx__.blacs_grid().rank_row(), mtrx__.bs_row()); + sddk::splindex spl_col(N__ + n__ - num_locked__, + mtrx__.blacs_grid().num_ranks_col(), mtrx__.blacs_grid().rank_col(), mtrx__.bs_col()); + + if (spl_row.local_size()) { + #pragma omp parallel for schedule(static) + for (int i = 0; i < spl_col.local_size(); i++) { + std::copy(&mtrx__(0, i), &mtrx__(0, i) + spl_row.local_size(), &(*mtrx_old__)(0, i)); + } + } + } + } /// Solve the band eigen-problem for pseudopotential case. template - int solve_pseudo_potential(Hamiltonian_k>& Hk__, double itsol_tol__, double empy_tol__) const; + int solve_pseudo_potential(Hamiltonian_k& Hk__, double itsol_tol__, double empy_tol__) const; /// Solve the band eigen-problem for full-potential case. template @@ -108,14 +188,268 @@ class Band // TODO: Band class is lightweight and in principle can be converted /// Initialize the subspace for the entire k-point set. template void initialize_subspace(K_point_set& kset__, Hamiltonian0& H0__) const; - - /// Initialize the wave-functions subspace at a given k-point. - /** If the number of atomic orbitals is smaller than the number of bands, the rest of the initial wave-functions - * are created from the random numbers. */ - template - void initialize_subspace(Hamiltonian_k>& Hk__, int num_ao__) const; }; +/// Initialize the wave-functions subspace at a given k-point. +/** If the number of atomic orbitals is smaller than the number of bands, the rest of the initial wave-functions + * are created from the random numbers. */ +template +inline void initialize_subspace(Hamiltonian_k& Hk__, int num_ao__) +{ + PROFILE("sirius::Band::initialize_subspace|kp"); + + //if (ctx_.cfg().control().verification() >= 2) { + // auto eval = diag_S_davidson(Hk__); + // if (eval[0] <= 0) { + // std::stringstream s; + // s << "S-operator matrix is not positive definite\n" + // << " lowest eigen-value: " << eval[0]; + // WARNING(s); + // } else { + // ctx_.message(1, __function_name__, "S-matrix is OK! Minimum eigen-value: %18.12f\n", eval[0]); + // } + //} + // + auto& ctx = Hk__.H0().ctx(); + + auto pcs = env::print_checksum(); + + /* number of non-zero spin components */ + const int num_sc = (ctx.num_mag_dims() == 3) ? 2 : 1; + + /* short notation for number of target wave-functions */ + int num_bands = ctx.num_bands(); + + /* number of basis functions */ + int num_phi = std::max(num_ao__, num_bands / num_sc); + + int num_phi_tot = num_phi * num_sc; + + auto& mp = get_memory_pool(ctx.host_memory_t()); + + ctx.print_memory_usage(__FILE__, __LINE__); + + /* initial basis functions */ + wf::Wave_functions phi(Hk__.kp().gkvec_sptr(), wf::num_mag_dims(ctx.num_mag_dims() == 3 ? 3 : 0), + wf::num_bands(num_phi_tot), sddk::memory_t::host); + + for (int ispn = 0; ispn < num_sc; ispn++) { + phi.zero(sddk::memory_t::host, wf::spin_index(ispn), wf::band_range(0, num_phi_tot)); + } + + /* generate the initial atomic wavefunctions */ + std::vector atoms(ctx.unit_cell().num_atoms()); + std::iota(atoms.begin(), atoms.end(), 0); + Hk__.kp().generate_atomic_wave_functions(atoms, [&](int iat){return &ctx.unit_cell().atom_type(iat).indexb_wfs();}, + ctx.ps_atomic_wf_ri(), phi); + + /* generate some random noise */ + std::vector tmp(4096); + utils::rnd(true); + for (int i = 0; i < 4096; i++) { + tmp[i] = 1e-5 * utils::random(); + } + PROFILE_START("sirius::Band::initialize_subspace|kp|wf"); + /* fill remaining wave-functions with pseudo-random guess */ + RTE_ASSERT(Hk__.kp().num_gkvec() > num_phi + 10); + #pragma omp parallel + { + for (int i = 0; i < num_phi - num_ao__; i++) { + #pragma omp for schedule(static) nowait + for (int igk_loc = 0; igk_loc < Hk__.kp().num_gkvec_loc(); igk_loc++) { + /* global index of G+k vector */ + int igk = Hk__.kp().gkvec().offset() + igk_loc; //Hk__.kp().idxgk(igk_loc); + if (igk == i + 1) { + phi.pw_coeffs(igk_loc, wf::spin_index(0), wf::band_index(num_ao__ + i)) = 1.0; + } + if (igk == i + 2) { + phi.pw_coeffs(igk_loc, wf::spin_index(0), wf::band_index(num_ao__ + i)) = 0.5; + } + if (igk == i + 3) { + phi.pw_coeffs(igk_loc, wf::spin_index(0), wf::band_index(num_ao__ + i)) = 0.25; + } + } + } + /* add random noise */ + for (int i = 0; i < num_phi; i++) { + #pragma omp for schedule(static) nowait + for (int igk_loc = Hk__.kp().gkvec().skip_g0(); igk_loc < Hk__.kp().num_gkvec_loc(); igk_loc++) { + /* global index of G+k vector */ + int igk = Hk__.kp().gkvec().offset() + igk_loc; + phi.pw_coeffs(igk_loc, wf::spin_index(0), wf::band_index(i)) += tmp[igk & 0xFFF]; + } + } + } + + if (ctx.num_mag_dims() == 3) { + /* make pure spinor up- and dn- wave functions */ + wf::copy(sddk::memory_t::host, phi, wf::spin_index(0), wf::band_range(0, num_phi), phi, wf::spin_index(1), + wf::band_range(num_phi, num_phi_tot)); + } + PROFILE_STOP("sirius::Band::initialize_subspace|kp|wf"); + + /* allocate wave-functions */ + wf::Wave_functions hphi(Hk__.kp().gkvec_sptr(), wf::num_mag_dims(ctx.num_mag_dims() == 3 ? 3 : 0), + wf::num_bands(num_phi_tot), sddk::memory_t::host); + wf::Wave_functions ophi(Hk__.kp().gkvec_sptr(), wf::num_mag_dims(ctx.num_mag_dims() == 3 ? 3 : 0), + wf::num_bands(num_phi_tot), sddk::memory_t::host); + /* temporary wave-functions required as a storage during orthogonalization */ + wf::Wave_functions wf_tmp(Hk__.kp().gkvec_sptr(), wf::num_mag_dims(ctx.num_mag_dims() == 3 ? 3 : 0), + wf::num_bands(num_phi_tot), sddk::memory_t::host); + + int bs = ctx.cyclic_block_size(); + + auto& gen_solver = ctx.gen_evp_solver(); + + sddk::dmatrix hmlt(num_phi_tot, num_phi_tot, ctx.blacs_grid(), bs, bs, mp); + sddk::dmatrix ovlp(num_phi_tot, num_phi_tot, ctx.blacs_grid(), bs, bs, mp); + sddk::dmatrix evec(num_phi_tot, num_phi_tot, ctx.blacs_grid(), bs, bs, mp); + + std::vector> eval(num_bands); + + ctx.print_memory_usage(__FILE__, __LINE__); + + auto mem = ctx.processing_unit() == sddk::device_t::CPU ? sddk::memory_t::host : sddk::memory_t::device; + + std::vector mg; + mg.emplace_back(Hk__.kp().spinor_wave_functions().memory_guard(mem, wf::copy_to::host)); + mg.emplace_back(phi.memory_guard(mem, wf::copy_to::device)); + mg.emplace_back(hphi.memory_guard(mem)); + mg.emplace_back(ophi.memory_guard(mem)); + mg.emplace_back(wf_tmp.memory_guard(mem)); + + if (is_device_memory(mem)) { + auto& mpd = get_memory_pool(mem); + evec.allocate(mpd); + hmlt.allocate(mpd); + ovlp.allocate(mpd); + } + + ctx.print_memory_usage(__FILE__, __LINE__); + + if (pcs) { + for (int ispn = 0; ispn < num_sc; ispn++) { + auto cs = phi.checksum(mem, wf::spin_index(ispn), wf::band_range(0, num_phi_tot)); + if (Hk__.kp().comm().rank() == 0) { + std::stringstream s; + s << "initial_phi" << ispn; + utils::print_checksum(s.str(), cs, RTE_OUT(std::cout)); + } + } + } + + for (int ispn_step = 0; ispn_step < ctx.num_spinors(); ispn_step++) { + /* apply Hamiltonian and overlap operators to the new basis functions */ + Hk__.template apply_h_s(ctx.num_mag_dims() == 3 ? wf::spin_range(0, 2) : wf::spin_range(ispn_step), + wf::band_range(0, num_phi_tot), phi, &hphi, &ophi); + + /* do some checks */ + // if (ctx_.cfg().control().verification() >= 1) { + + // set_subspace_mtrx(0, num_phi_tot, 0, phi, ophi, ovlp); + // if (ctx_.cfg().control().verification() >= 2 && ctx_.verbosity() >= 2) { + // auto s = ovlp.serialize("overlap", num_phi_tot, num_phi_tot); + // if (Hk__.kp().comm().rank() == 0) { + // ctx_.out() << s.str() << std::endl; + // } + // } + + // double max_diff = check_hermitian(ovlp, num_phi_tot); + // if (max_diff > 1e-12) { + // std::stringstream s; + // s << "overlap matrix is not hermitian, max_err = " << max_diff; + // WARNING(s); + // } + // std::vector> eo(num_phi_tot); + // auto& std_solver = ctx_.std_evp_solver(); + // if (std_solver.solve(num_phi_tot, num_phi_tot, ovlp, eo.data(), evec)) { + // std::stringstream s; + // s << "error in diagonalization"; + // WARNING(s); + // } + // Hk__.kp().message(1, __function_name__, "minimum eigen-value of the overlap matrix: %18.12f\n", eo[0]); + // if (eo[0] < 0) { + // WARNING("overlap matrix is not positively defined"); + // } + // } + + /* setup eigen-value problem */ + Band(ctx).set_subspace_mtrx(0, num_phi_tot, 0, phi, hphi, hmlt); + Band(ctx).set_subspace_mtrx(0, num_phi_tot, 0, phi, ophi, ovlp); + + if (pcs) { + auto cs1 = hmlt.checksum(num_phi_tot, num_phi_tot); + auto cs2 = ovlp.checksum(num_phi_tot, num_phi_tot); + if (Hk__.kp().comm().rank() == 0) { + utils::print_checksum("hmlt", cs1, RTE_OUT(std::cout)); + utils::print_checksum("ovlp", cs2, RTE_OUT(std::cout)); + } + } + + // if (ctx_.cfg().control().verification() >= 2 && ctx_.verbosity() >= 2) { + // auto s1 = hmlt.serialize("hmlt", num_phi_tot, num_phi_tot); + // auto s2 = hmlt.serialize("ovlp", num_phi_tot, num_phi_tot); + // if (Hk__.kp().comm().rank() == 0) { + // ctx_.out() << s1.str() << std::endl << s2.str() << std::endl; + // } + // } + + /* solve generalized eigen-value problem with the size N and get lowest num_bands eigen-vectors */ + if (gen_solver.solve(num_phi_tot, num_bands, hmlt, ovlp, eval.data(), evec)) { + RTE_THROW("error in diagonalization"); + } + + // if (ctx_.print_checksum()) { + // auto cs = evec.checksum(num_phi_tot, num_bands); + // real_type cs1{0}; + // for (int i = 0; i < num_bands; i++) { + // cs1 += eval[i]; + // } + // if (Hk__.kp().comm().rank() == 0) { + // utils::print_checksum("evec", cs); + // utils::print_checksum("eval", cs1); + // } + // } + for (int i = 0; i < num_bands; i++) { + Hk__.kp().message(3, __function_name__, "eval[%i]=%20.16f\n", i, eval[i]); + } + + /* compute wave-functions */ + /* \Psi_{i} = \sum_{mu} \phi_{mu} * Z_{mu, i} */ + for (int ispn = 0; ispn < num_sc; ispn++) { + wf::transform(ctx.spla_context(), mem, evec, 0, 0, 1.0, phi, + wf::spin_index(num_sc == 2 ? ispn : 0), wf::band_range(0, num_phi_tot), 0.0, + Hk__.kp().spinor_wave_functions(), wf::spin_index(num_sc == 2 ? ispn : ispn_step), + wf::band_range(0, num_bands)); + } + + for (int j = 0; j < num_bands; j++) { + Hk__.kp().band_energy(j, ispn_step, eval[j]); + } + } + + if (pcs) { + for (int ispn = 0; ispn < ctx.num_spins(); ispn++) { + auto cs = Hk__.kp().spinor_wave_functions().checksum(mem, wf::spin_index(ispn), + wf::band_range(0, num_bands)); + std::stringstream s; + s << "initial_spinor_wave_functions_" << ispn; + if (Hk__.kp().comm().rank() == 0) { + utils::print_checksum(s.str(), cs, RTE_OUT(std::cout)); + } + } + } + + ///* check residuals */ + //if (ctx_.cfg().control().verification() >= 2) { + // check_residuals(Hk__); + // check_wave_functions(Hk__); + //} + + //ctx_.print_memory_usage(__FILE__, __LINE__); +} + + } #endif // __BAND_HPP__ diff --git a/src/band/davidson.hpp b/src/band/davidson.hpp index ba86b3586..3d2f4be3e 100644 --- a/src/band/davidson.hpp +++ b/src/band/davidson.hpp @@ -29,9 +29,6 @@ #include "band/band.hpp" #include "hamiltonian/hamiltonian.hpp" #include "utils/profiler.hpp" -#include "SDDK/wf_ortho.hpp" -#include "SDDK/wf_inner.hpp" -#include "SDDK/wf_trans.hpp" #include "residuals.hpp" namespace sirius { @@ -49,15 +46,19 @@ enum class davidson_evp_t { template inline void -project_out_subspace(::spla::Context& spla_ctx__, sddk::spin_range spins__, sddk::Wave_functions>& phi__, - sddk::Wave_functions>& sphi__, int N__, int n__, sddk::dmatrix& o__) +project_out_subspace(::spla::Context& spla_ctx__, sddk::memory_t mem__, wf::spin_range spins__, wf::Wave_functions& phi__, + wf::Wave_functions& sphi__, int N__, int n__, sddk::dmatrix& o__) { PROFILE("sirius::project_out_subspace"); /* project out the old subspace: * |\tilda phi_new> = |phi_new> - |phi_old> */ - sddk::inner(spla_ctx__, spins__, sphi__, 0, N__, phi__, N__, n__, o__, 0, 0); - sddk::transform(spla_ctx__, spins__(), -1.0, {&phi__}, 0, N__, o__, 0, 0, 1.0, {&phi__}, N__, n__); + wf::inner(spla_ctx__, mem__, spins__, sphi__, wf::band_range(0, N__), phi__, wf::band_range(N__, N__ + n__), o__, 0, 0); + for (auto s = spins__.begin(); s != spins__.end(); s++) { + auto sp = phi__.actual_spin_index(s); + wf::transform(spla_ctx__, mem__, o__, 0, 0, -1.0, phi__, sp, wf::band_range(0, N__), 1.0, + phi__, sp, wf::band_range(N__, N__ + n__)); + } //auto norms = phi__.l2norm(device_t::CPU, spins__, N__ + n__); @@ -72,65 +73,44 @@ project_out_subspace(::spla::Context& spla_ctx__, sddk::spin_range spins__, sddk //} } -template -inline int -remove_linearly_dependent(::spla::Context& spla_ctx__, sddk::spin_range spins__, sddk::Wave_functions>& phi__, - int N__, int n__, sddk::dmatrix& o__) - -{ - PROFILE("sirius::remove_linearly_dependent"); - - /* compute */ - inner(spla_ctx__, spins__, phi__, N__, n__, phi__, N__, n__, o__, 0, 0); - - auto la = (o__.comm().size() == 1) ? sddk::linalg_t::lapack : sddk::linalg_t::scalapack; - sddk::linalg(la).geqrf(n__, n__, o__, 0, 0); - auto diag = o__.get_diag(n__); - - auto eps = std::numeric_limits>::epsilon(); - - int n{0}; - for (int i = 0; i < n__; i++) { - if (std::abs(diag[i]) >= eps * 10) { - /* shift linearly independent basis functions to the beginning of phi */ - if (n != i) { - for (int ispn: spins__) { - phi__.copy_from(phi__, 1, ispn, N__ + i, ispn, N__ + n); - } - } - n++; - } - } - return n; -} - -template -inline std::unique_ptr>> -wave_function_factory(Simulation_context const& ctx__, K_point const& kp__, int num_wf__, int num_sc__, - bool mt_part__) -{ - using wf_t = sddk::Wave_functions>; - std::unique_ptr wf{nullptr}; - if (mt_part__) { - wf = std::unique_ptr(new wf_t(ctx__.mem_pool(ctx__.host_memory_t()), kp__.gkvec_partition(), - ctx__.unit_cell().num_atoms(), [&](int ia) { return ctx__.unit_cell().atom(ia).mt_lo_basis_size(); }, - num_wf__, ctx__.aux_preferred_memory_t(), num_sc__)); - } else { - wf = std::unique_ptr(new wf_t(ctx__.mem_pool(ctx__.host_memory_t()), kp__.gkvec_partition(), - num_wf__, ctx__.aux_preferred_memory_t(), num_sc__)); - } - if (is_device_memory(ctx__.preferred_memory_t())) { - auto& mpd = ctx__.mem_pool(ctx__.preferred_memory_t()); - wf->allocate(sddk::spin_range(num_sc__ == 1 ? 0 : 2), mpd); - } +//template +//inline int +//remove_linearly_dependent(::spla::Context& spla_ctx__, sddk::spin_range spins__, sddk::Wave_functions>& phi__, +// int N__, int n__, sddk::dmatrix& o__) +// +//{ +// PROFILE("sirius::remove_linearly_dependent"); +// +// /* compute */ +// inner(spla_ctx__, spins__, phi__, N__, n__, phi__, N__, n__, o__, 0, 0); +// +// auto la = (o__.comm().size() == 1) ? sddk::linalg_t::lapack : sddk::linalg_t::scalapack; +// sddk::linalg(la).geqrf(n__, n__, o__, 0, 0); +// auto diag = o__.get_diag(n__); +// +// auto eps = std::numeric_limits>::epsilon(); +// +// int n{0}; +// for (int i = 0; i < n__; i++) { +// if (std::abs(diag[i]) >= eps * 10) { +// /* shift linearly independent basis functions to the beginning of phi */ +// if (n != i) { +// for (int ispn: spins__) { +// phi__.copy_from(phi__, 1, ispn, N__ + i, ispn, N__ + n); +// } +// } +// n++; +// } +// } +// return n; +//} - return wf; -} /// Solve the eigen-problem using Davidson iterative method. /** -\tparam T Type of the wave-functions in real space (one of float, double, complex, complex). -\tparam F Type of the subspace matrices. +\tparam T Precision type of wave-functions (float or double). +\tparam F Type of the subspace matrices (fload or duble for Gamma case, + complex or complex for general k-point case. \tparam what What to solve: H|psi> = e*S|psi> or S|psi> = o|psi> \param [in] Hk Hamiltonian for a given k-point. \param [in] num_bands Number of eigen-states (bands) to compute. @@ -150,23 +130,27 @@ wave_function_factory(Simulation_context const& ctx__, K_point const& kp__, i \return List of eigen-values. */ template -inline davidson_result_t -davidson(Hamiltonian_k>& Hk__, int num_bands__, int num_mag_dims__, sddk::Wave_functions>& psi__, - std::function tolerance__, double res_tol__, - int num_steps__, bool locking__, int subspace_size__, bool estimate_eval__, bool extra_ortho__, - std::ostream& out__, int verbosity__, sddk::Wave_functions>* phi_extra__ = nullptr) +inline auto +davidson(Hamiltonian_k& Hk__, wf::num_bands num_bands__, wf::num_mag_dims num_mag_dims__, + wf::Wave_functions& psi__, std::function tolerance__, double res_tol__, + int num_steps__, bool locking__, int subspace_size__, bool estimate_eval__, bool extra_ortho__, + std::ostream& out__, int verbosity__, wf::Wave_functions* phi_extra__ = nullptr) { PROFILE("sirius::davidson"); auto& ctx = Hk__.H0().ctx(); ctx.print_memory_usage(__FILE__, __LINE__); + auto pcs = env::print_checksum(); + auto& kp = Hk__.kp(); auto& itso = ctx.cfg().iterative_solver(); /* true if this is a non-collinear case */ - const bool nc_mag = (num_mag_dims__ == 3); + const bool nc_mag = (num_mag_dims__.get() == 3); + + auto num_md = wf::num_mag_dims(nc_mag ? 3 : 0); /* number of spin components, treated simultaneously * 1 - in case of non-magnetic or collinear calculation @@ -175,17 +159,17 @@ davidson(Hamiltonian_k>& Hk__, int num_bands__, int num_mag_dims__, const int num_sc = nc_mag ? 2 : 1; /* number of spinor components stored under the same band index */ - const int num_spinors = (num_mag_dims__ == 1) ? 2 : 1; + const int num_spinors = (num_mag_dims__.get() == 1) ? 2 : 1; /* number of spins */ - const int num_spins = (num_mag_dims__ == 0) ? 1 : 2; + const int num_spins = (num_mag_dims__.get() == 0) ? 1 : 2; /* maximum subspace size */ - int num_phi = subspace_size__ * num_bands__; + int num_phi = subspace_size__ * num_bands__.get(); int num_extra_phi{0}; int nlo{0}; if (phi_extra__) { - num_extra_phi = phi_extra__->num_wf(); + num_extra_phi = phi_extra__->num_wf().get(); num_phi += num_extra_phi; /* total number of local orbitals (needed for LAPW) */ nlo = ctx.unit_cell().mt_lo_basis_size(); @@ -198,61 +182,83 @@ davidson(Hamiltonian_k>& Hk__, int num_bands__, int num_mag_dims__, } /* alias for memory pool */ - auto& mp = ctx.mem_pool(ctx.host_memory_t()); + auto& mp = get_memory_pool(ctx.host_memory_t()); + + sddk::memory_t mem = ctx.processing_unit_memory_t(); /* allocate wave-functions */ - using wf_t = sddk::Wave_functions>; + using wf_t = wf::Wave_functions; bool mt_part{false}; - if (ctx.full_potential() && what == davidson_evp_t::hamiltonian) { + //if (ctx.full_potential() && what == davidson_evp_t::hamiltonian) { + if (ctx.full_potential()) { mt_part = true; } + std::vector mg; + + mg.emplace_back(psi__.memory_guard(mem, wf::copy_to::device | wf::copy_to::host)); + /* auxiliary wave-functions */ - auto phi = wave_function_factory(ctx, kp, num_phi, num_sc, mt_part); + auto phi = wave_function_factory(ctx, kp, wf::num_bands(num_phi), num_md, mt_part); + mg.emplace_back(phi->memory_guard(mem)); /* Hamiltonian, applied to auxiliary wave-functions */ std::unique_ptr hphi{nullptr}; if (what == davidson_evp_t::hamiltonian) { - hphi = wave_function_factory(ctx, kp, num_phi, num_sc, mt_part); + hphi = wave_function_factory(ctx, kp, wf::num_bands(num_phi), num_md, mt_part); + mg.emplace_back(hphi->memory_guard(mem)); } /* S operator, applied to auxiliary wave-functions */ - auto sphi = wave_function_factory(ctx, kp, num_phi, num_sc, mt_part); + auto sphi = wave_function_factory(ctx, kp, wf::num_bands(num_phi), num_md, mt_part); + mg.emplace_back(sphi->memory_guard(mem)); /* Hamiltonain, applied to new Psi wave-functions */ std::unique_ptr hpsi{nullptr}; if (what == davidson_evp_t::hamiltonian) { - hpsi = wave_function_factory(ctx, kp, num_bands__, num_sc, mt_part); + hpsi = wave_function_factory(ctx, kp, num_bands__, num_md, mt_part); + mg.emplace_back(hpsi->memory_guard(mem)); } /* S operator, applied to new Psi wave-functions */ - auto spsi = wave_function_factory(ctx, kp, num_bands__, num_sc, mt_part); + auto spsi = wave_function_factory(ctx, kp, num_bands__, num_md, mt_part); + mg.emplace_back(spsi->memory_guard(mem)); /* residuals */ /* res is also used as a temporary array in orthogonalize() and the first time num_extra_phi + num_bands * states will be orthogonalized */ - auto res = wave_function_factory(ctx, kp, num_bands__ + num_extra_phi, num_sc, mt_part); + auto res = wave_function_factory(ctx, kp, wf::num_bands(num_bands__.get() + num_extra_phi), num_md, mt_part); + mg.emplace_back(res->memory_guard(mem)); std::unique_ptr hphi_extra{nullptr}; std::unique_ptr sphi_extra{nullptr}; if (phi_extra__) { - hphi_extra = wave_function_factory(ctx, kp, num_extra_phi, num_sc, mt_part); - sphi_extra = wave_function_factory(ctx, kp, num_extra_phi, num_sc, mt_part); + hphi_extra = wave_function_factory(ctx, kp, wf::num_bands(num_extra_phi), num_md, mt_part); + sphi_extra = wave_function_factory(ctx, kp, wf::num_bands(num_extra_phi), num_md, mt_part); + mg.emplace_back(phi_extra__->memory_guard(mem, wf::copy_to::device)); + mg.emplace_back(hphi_extra->memory_guard(mem)); + mg.emplace_back(sphi_extra->memory_guard(mem)); + if (pcs) { + auto cs = phi_extra__->checksum(mem, wf::band_range(0, num_extra_phi)); + if (kp.comm().rank() == 0) { + utils::print_checksum("phi_extra", cs, RTE_OUT(std::cout)); + } + } } - const int bs = ctx.cyclic_block_size(); + int const bs = ctx.cyclic_block_size(); sddk::dmatrix H(num_phi, num_phi, ctx.blacs_grid(), bs, bs, mp); sddk::dmatrix H_old(num_phi, num_phi, ctx.blacs_grid(), bs, bs, mp); sddk::dmatrix evec(num_phi, num_phi, ctx.blacs_grid(), bs, bs, mp); - if (is_device_memory(ctx.preferred_memory_t())) { - auto& mpd = ctx.mem_pool(ctx.preferred_memory_t()); - psi__.prepare(sddk::spin_range(psi__.num_sc() == 2 ? 2 : 0), true, &mpd); + int const num_ortho_steps = extra_ortho__ ? 2 : 1; + if (is_device_memory(mem)) { + auto& mpd = get_memory_pool(mem); if (ctx.blacs_grid().comm().size() == 1) { evec.allocate(mpd); H.allocate(mpd); @@ -265,8 +271,8 @@ davidson(Hamiltonian_k>& Hk__, int num_bands__, int num_mag_dims__, auto h_o_diag = (ctx.full_potential()) ? Hk__.template get_h_o_diag_lapw<3>() : Hk__.template get_h_o_diag_pw(); - sddk::mdarray, 2>* h_diag{nullptr};; - sddk::mdarray, 2>* o_diag{nullptr}; + sddk::mdarray* h_diag{nullptr};; + sddk::mdarray* o_diag{nullptr}; switch (what) { case davidson_evp_t::hamiltonian: { @@ -277,41 +283,34 @@ davidson(Hamiltonian_k>& Hk__, int num_bands__, int num_mag_dims__, case davidson_evp_t::overlap: { h_diag = &h_o_diag.second; o_diag = &h_o_diag.first; - for (int ispn = 0; ispn < static_cast(o_diag->size(1)); ispn++) { - for (int j = 0; j < static_cast(o_diag->size(0)); j++) { - (*o_diag)(j, ispn) = 1.0; - } - } - if (ctx.processing_unit() == sddk::device_t::GPU) { - o_diag->copy_to(sddk::memory_t::device); + *o_diag = [](){ return 1.0;}; + if (is_device_memory(mem)) { + o_diag->copy_to(mem); } break; } } - if (ctx.print_checksum()) { + /* checksum info */ + if (pcs) { auto cs1 = h_o_diag.first.checksum(); auto cs2 = h_o_diag.second.checksum(); kp.comm().allreduce(&cs1, 1); kp.comm().allreduce(&cs2, 1); - if (kp.comm().rank() == 0) { - utils::print_checksum("h_diag", cs1, RTE_OUT(std::cout)); - utils::print_checksum("o_diag", cs2, RTE_OUT(std::cout)); - } + utils::print_checksum("h_diag", cs1, RTE_OUT(out__)); + utils::print_checksum("o_diag", cs2, RTE_OUT(out__)); + + auto cs = psi__.checksum(mem, wf::band_range(0, num_bands__.get())); + utils::print_checksum("input spinor_wave_functions", cs, RTE_OUT(out__)); } auto& std_solver = ctx.std_evp_solver(); - if (ctx.print_checksum()) { - psi__.print_checksum(get_device_t(psi__.preferred_memory_t()), "input spinor_wave_functions", 0, - num_bands__, RTE_OUT(std::cout)); - } - - davidson_result_t result{0, sddk::mdarray(num_bands__, num_spinors)}; + davidson_result_t result{0, sddk::mdarray(num_bands__.get(), num_spinors)}; if (verbosity__ >= 1) { RTE_OUT(out__) << "starting Davidson iterative solver" << std::endl - << " number of bands : " << num_bands__ << std::endl + << " number of bands : " << num_bands__.get() << std::endl << " subspace size : " << num_phi << std::endl << " locking : " << locking__ << std::endl << " number of spins : " << num_spins << std::endl @@ -324,16 +323,17 @@ davidson(Hamiltonian_k>& Hk__, int num_bands__, int num_mag_dims__, if (verbosity__ >= 1) { RTE_OUT(out__) << "ispin_step " << ispin_step << " out of " << num_spinors << std::endl; } + auto sr = nc_mag ? wf::spin_range(0, 2) : wf::spin_range(ispin_step); ctx.print_memory_usage(__FILE__, __LINE__); /* converged vectors */ int num_locked{0}; - sddk::mdarray, 1> eval(num_bands__); - sddk::mdarray, 1> eval_old(num_bands__); + sddk::mdarray, 1> eval(num_bands__.get()); + sddk::mdarray, 1> eval_old(num_bands__.get()); - /* check if band energy is converged */ + /* lambda function thatcheck if band energy is converged */ auto is_converged = [&](int j__, int ispn__) -> bool { return std::abs(eval[j__] - eval_old[j__]) <= tolerance__(j__ + num_locked, ispn__); }; @@ -346,27 +346,31 @@ davidson(Hamiltonian_k>& Hk__, int num_bands__, int num_mag_dims__, /* trial basis functions */ for (int ispn = 0; ispn < num_sc; ispn++) { - phi->copy_from(psi__, num_bands__, nc_mag ? ispn : ispin_step, 0, ispn, 0); + wf::copy(mem, psi__, wf::spin_index(nc_mag ? ispn : ispin_step), + wf::band_range(0, num_bands__.get()), *phi, wf::spin_index(ispn), + wf::band_range(0, num_bands__.get())); } /* extra basis functions for LAPW go after phi */ if (phi_extra__) { - if (num_mag_dims__ != 0) { + if (num_mag_dims__.get() != 0) { RTE_THROW("not supported"); } - phi->copy_from(*phi_extra__, num_extra_phi, 0, 0, 0, num_bands__); + wf::copy(mem, *phi_extra__, wf::spin_index(0), wf::band_range(0, num_extra_phi), + *phi, wf::spin_index(0), wf::band_range(num_bands__.get(), num_bands__.get() + num_extra_phi)); } - if (ctx.print_checksum()) { + if (pcs) { if (phi_extra__) { - phi_extra__->print_checksum(get_device_t(phi_extra__->preferred_memory_t()), "extra phi", 0, - num_extra_phi, RTE_OUT(std::cout)); + auto cs = phi_extra__->checksum(mem, wf::band_range(0, num_extra_phi)); + utils::print_checksum("extra phi", cs, RTE_OUT(out__)); } - phi->print_checksum(get_device_t(phi->preferred_memory_t()), "input phi", 0, num_bands__, RTE_OUT(std::cout)); + auto cs = phi->checksum(mem, wf::band_range(0, num_bands__.get())); + utils::print_checksum("input phi", cs, RTE_OUT(out__)); } /* current subspace size */ - int N = num_bands__ + num_extra_phi; + int N = num_bands__.get() + num_extra_phi; /* first phase: setup and diagonalise reduced Hamiltonian and get eigen-values; * this is done before the main itertive loop */ @@ -381,74 +385,78 @@ davidson(Hamiltonian_k>& Hk__, int num_bands__, int num_mag_dims__, if (ctx.full_potential()) { /* we save time by not applying APW part to pure local orbital basis */ /* aplpy full LAPW Hamiltonian to first N - nlo states */ - Hk__.apply_fv_h_o(false, false, 0, N - nlo, *phi, hphi.get(), sphi.get()); + Hk__.apply_fv_h_o(false, false, wf::band_range(0, N - nlo), *phi, hphi.get(), sphi.get()); /* aplpy local orbital part to remaining states */ - Hk__.apply_fv_h_o(false, true, N - nlo, nlo, *phi, hphi.get(), sphi.get()); + Hk__.apply_fv_h_o(false, true, wf::band_range(N - nlo, N), *phi, hphi.get(), sphi.get()); /* phi_extra is constant, so the hphi_extra and sphi_extra */ if (phi_extra__) { - hphi_extra->copy_from(*hphi, num_extra_phi, 0, num_bands__, 0, 0); - sphi_extra->copy_from(*sphi, num_extra_phi, 0, num_bands__, 0, 0); + auto s = wf::spin_index(0); + wf::copy(mem, *hphi, s, wf::band_range(num_bands__.get(), num_bands__.get() + num_extra_phi), + *hphi_extra, s, wf::band_range(0, num_extra_phi)); + wf::copy(mem, *sphi, s, wf::band_range(num_bands__.get(), num_bands__.get() + num_extra_phi), + *sphi_extra, s, wf::band_range(0, num_extra_phi)); } } else { - Hk__.template apply_h_s(sddk::spin_range(nc_mag ? 2 : ispin_step), 0, num_bands__, - *phi, hphi.get(), sphi.get()); + Hk__.template apply_h_s(sr, wf::band_range(0, num_bands__.get()), *phi, hphi.get(), sphi.get()); } break; } case davidson_evp_t::overlap: { if (ctx.full_potential()) { - Hk__.apply_fv_h_o(true, false, 0, num_bands__, *phi, nullptr, sphi.get()); + Hk__.apply_fv_h_o(true, false, wf::band_range(0, num_bands__.get()), *phi, nullptr, sphi.get()); } else { - Hk__.template apply_h_s(sddk::spin_range(nc_mag ? 2 : ispin_step), 0, num_bands__, - *phi, nullptr, sphi.get()); + Hk__.template apply_h_s(sr, wf::band_range(0, num_bands__.get()), *phi, nullptr, sphi.get()); } break; } } - - /* DEBUG */ - if (ctx.cfg().control().verification() >= 1) { - /* setup eigen-value problem */ - if (what != davidson_evp_t::overlap) { - Band(ctx).set_subspace_mtrx(0, N, 0, *phi, *hphi, H); - auto max_diff = check_hermitian(H, N); - if (max_diff > (std::is_same, double>::value ? 1e-12 : 1e-6)) { - std::stringstream s; - s << "H matrix is not Hermitian, max_err = " << max_diff << std::endl - << " happened before entering the iterative loop" << std::endl; - WARNING(s); - if (N <= 20) { - auto s1 = H.serialize("davidson:H_first", N, N); - if (Hk__.kp().comm().rank() == 0) { - RTE_OUT(out__) << s1.str() << std::endl; - } - } - } - } - - Band(ctx).set_subspace_mtrx(0, N, 0, *phi, *sphi, H); - auto max_diff = check_hermitian(H, N); - if (max_diff > (std::is_same, double>::value ? 1e-12 : 1e-6)) { - std::stringstream s; - s << "O matrix is not Hermitian, max_err = " << max_diff << std::endl - << " happened before entering the iterative loop" << std::endl; - WARNING(s); - if (N <= 20) { - auto s1 = H.serialize("davidson:O_first", N, N); - if (Hk__.kp().comm().rank() == 0) { - RTE_OUT(out__) << s1.str() << std::endl; - } - } - } - } - /* END DEBUG */ - - if (ctx.print_checksum()) { - phi->print_checksum(get_device_t(phi->preferred_memory_t()), "phi", 0, N, RTE_OUT(std::cout)); +// +// /* DEBUG */ +// if (ctx.cfg().control().verification() >= 1) { +// /* setup eigen-value problem */ +// if (what != davidson_evp_t::overlap) { +// Band(ctx).set_subspace_mtrx(0, N, 0, *phi, *hphi, H); +// auto max_diff = check_hermitian(H, N); +// if (max_diff > (std::is_same, double>::value ? 1e-12 : 1e-6)) { +// std::stringstream s; +// s << "H matrix is not Hermitian, max_err = " << max_diff << std::endl +// << " happened before entering the iterative loop" << std::endl; +// WARNING(s); +// if (N <= 20) { +// auto s1 = H.serialize("davidson:H_first", N, N); +// if (Hk__.kp().comm().rank() == 0) { +// RTE_OUT(out__) << s1.str() << std::endl; +// } +// } +// } +// } +// +// Band(ctx).set_subspace_mtrx(0, N, 0, *phi, *sphi, H); +// auto max_diff = check_hermitian(H, N); +// if (max_diff > (std::is_same, double>::value ? 1e-12 : 1e-6)) { +// std::stringstream s; +// s << "O matrix is not Hermitian, max_err = " << max_diff << std::endl +// << " happened before entering the iterative loop" << std::endl; +// WARNING(s); +// if (N <= 20) { +// auto s1 = H.serialize("davidson:O_first", N, N); +// if (Hk__.kp().comm().rank() == 0) { +// RTE_OUT(out__) << s1.str() << std::endl; +// } +// } +// } +// } +// /* END DEBUG */ +// + if (pcs) { + auto cs = phi->checksum(mem, wf::band_range(0, N)); + utils::print_checksum("phi", cs, RTE_OUT(out__)); if (hphi) { - hphi->print_checksum(get_device_t(hphi->preferred_memory_t()), "hphi", 0, N, RTE_OUT(std::cout)); + cs = hphi->checksum(mem, wf::band_range(0, N)); + utils::print_checksum("hphi", cs, RTE_OUT(out__)); } - sphi->print_checksum(get_device_t(sphi->preferred_memory_t()), "sphi", 0, N, RTE_OUT(std::cout)); + cs = sphi->checksum(mem, wf::band_range(0, N)); + utils::print_checksum("sphi", cs, RTE_OUT(out__)); } if (verbosity__ >= 1) { @@ -458,24 +466,30 @@ davidson(Hamiltonian_k>& Hk__, int num_bands__, int num_mag_dims__, /* orthogonalize subspace basis functions and setup eigen-value problem */ switch (what) { case davidson_evp_t::hamiltonian: { - sddk::orthogonalize(ctx.spla_context(), ctx.preferred_memory_t(), ctx.blas_linalg_t(), - sddk::spin_range(nc_mag ? 2 : 0), *phi, *hphi, *sphi, 0, N, H, *res); - if (ctx.print_checksum()) { - phi->print_checksum(get_device_t(phi->preferred_memory_t()), "phi", 0, N, RTE_OUT(std::cout)); + wf::orthogonalize(ctx.spla_context(), mem, + nc_mag ? wf::spin_range(0, 2) : wf::spin_range(0), wf::band_range(0, 0), wf::band_range(0, N), *phi, *sphi, + {phi.get(), hphi.get(), sphi.get()}, H, *res, false); + /* checksum info */ + if (pcs) { + auto cs = phi->checksum(mem, wf::band_range(0, N)); + utils::print_checksum("phi", cs, RTE_OUT(out__)); if (hphi) { - hphi->print_checksum(get_device_t(hphi->preferred_memory_t()), "hphi", 0, N, RTE_OUT(std::cout)); + cs = hphi->checksum(mem, wf::band_range(0, N)); + utils::print_checksum("hphi", cs, RTE_OUT(out__)); } - sphi->print_checksum(get_device_t(sphi->preferred_memory_t()), "sphi", 0, N, RTE_OUT(std::cout)); + cs = sphi->checksum(mem, wf::band_range(0, N)); + utils::print_checksum("sphi", cs, RTE_OUT(out__)); } /* setup eigen-value problem */ - Band(ctx).set_subspace_mtrx(0, N, 0, *phi, *hphi, H, &H_old); + Band(ctx).set_subspace_mtrx(0, N, 0, *phi, *hphi, H, &H_old); break; } case davidson_evp_t::overlap: { - sddk::orthogonalize(ctx.spla_context(), ctx.preferred_memory_t(), ctx.blas_linalg_t(), - sddk::spin_range(nc_mag ? 2 : 0), *phi, *sphi, 0, num_bands__, H, *res); + wf::orthogonalize(ctx.spla_context(), mem, + wf::spin_range(nc_mag ? 2 : 0), wf::band_range(0, 0), wf::band_range(0, N), *phi, *phi, + {phi.get(), sphi.get()}, H, *res, false); /* setup eigen-value problem */ - Band(ctx).set_subspace_mtrx(0, num_bands__, 0, *phi, *sphi, H, &H_old); + Band(ctx).set_subspace_mtrx(0, N, 0, *phi, *sphi, H, &H_old); break; } } @@ -487,7 +501,7 @@ davidson(Hamiltonian_k>& Hk__, int num_bands__, int num_mag_dims__, /* DEBUG */ if (ctx.cfg().control().verification() >= 1) { auto max_diff = check_hermitian(H, N); - if (max_diff > (std::is_same, double>::value ? 1e-12 : 1e-6)) { + if (max_diff > (std::is_same, double>::value ? 1e-12 : 1e-6)) { std::stringstream s; s << "H matrix is not Hermitian, max_err = " << max_diff << std::endl << " happened before entering the iterative loop" << std::endl; @@ -503,14 +517,14 @@ davidson(Hamiltonian_k>& Hk__, int num_bands__, int num_mag_dims__, /* Seems like a smaller block size is not always improving time to solution much, so keep it num_bands. */ - int block_size = num_bands__; + int block_size = num_bands__.get(); if (verbosity__ >= 1) { RTE_OUT(out__) << "diagonalize " << N << " x " << N << " Hamiltonian" << std::endl; } /* solve eigen-value problem with the size N and get lowest num_bands eigen-vectors */ - if (std_solver.solve(N, num_bands__, H, &eval[0], evec)) { + if (std_solver.solve(N, num_bands__.get(), H, &eval[0], evec)) { std::stringstream s; s << "error in diagonalziation"; RTE_THROW(s); @@ -518,7 +532,7 @@ davidson(Hamiltonian_k>& Hk__, int num_bands__, int num_mag_dims__, ctx.evp_work_count(1); - for (int i = 0; i < num_bands__; i++) { + for (int i = 0; i < num_bands__.get(); i++) { kp.message(4, __function_name__, "eval[%i]=%20.16f\n", i, eval[i]); } @@ -528,8 +542,8 @@ davidson(Hamiltonian_k>& Hk__, int num_bands__, int num_mag_dims__, /* tolerance for the norm of L2-norms of the residuals, used for * relative convergence criterion. We can only compute this after * we have the first residual norms available */ - real_type relative_frobenius_tolerance{0}; - real_type current_frobenius_norm{0}; + F relative_frobenius_tolerance{0}; + F current_frobenius_norm{0}; /* second phase: start iterative diagonalization */ for (int iter_step = 0; iter_step < num_steps__; iter_step++) { @@ -541,30 +555,26 @@ davidson(Hamiltonian_k>& Hk__, int num_bands__, int num_mag_dims__, bool last_iteration = iter_step == (num_steps__ - 1); - int num_ritz = num_bands__ - num_locked; + int num_ritz = num_bands__.get() - num_locked; /* don't compute residuals on last iteration */ if (!last_iteration) { if (verbosity__ >= 1) { - RTE_OUT(out__) << "compute " << num_bands__ - num_locked + RTE_OUT(out__) << "compute " << num_bands__.get() - num_locked << " residuals from phi(" << num_locked << ":" << N - 1 << ")" << std::endl; } residual_result result; /* get new preconditionined residuals, and also hpsi and spsi as a by-product */ switch (what) { case davidson_evp_t::hamiltonian: { - result = residuals(ctx, ctx.preferred_memory_t(), ctx.blas_linalg_t(), - sddk::spin_range(nc_mag ? 2 : ispin_step), N, num_ritz, num_locked, - eval, evec, *hphi, *sphi, *hpsi, *spsi, *res, *h_diag, *o_diag, - estimate_eval__, res_tol__, is_converged); + result = residuals(ctx, mem, sr, N, num_ritz, num_locked, eval, evec, *hphi, *sphi, + *hpsi, *spsi, *res, *h_diag, *o_diag, estimate_eval__, res_tol__, is_converged); break; } case davidson_evp_t::overlap: { - result = residuals(ctx, ctx.preferred_memory_t(), ctx.blas_linalg_t(), - sddk::spin_range(nc_mag ? 2 : ispin_step), N, num_ritz, num_locked, - eval, evec, *sphi, *phi, *spsi, psi__, *res, *h_diag, *o_diag, - estimate_eval__, res_tol__, is_converged); + result = residuals(ctx, mem, sr, N, num_ritz, num_locked, eval, evec, *sphi, *phi, *spsi, + psi__, *res, *h_diag, *o_diag, estimate_eval__, res_tol__, is_converged); break; } } @@ -574,23 +584,28 @@ davidson(Hamiltonian_k>& Hk__, int num_bands__, int num_mag_dims__, /* set the relative tolerance convergence criterion */ if (iter_step == 0) { - relative_frobenius_tolerance = current_frobenius_norm * itso.relative_tolerance(); + relative_frobenius_tolerance = std::abs(current_frobenius_norm) * itso.relative_tolerance(); } if (verbosity__ >= 1) { RTE_OUT(out__) << "number of unconverged residuals : " << num_unconverged << std::endl; RTE_OUT(out__) << "current_frobenius_norm : " << current_frobenius_norm << std::endl; } - if (ctx.cfg().control().print_checksum()) { - res->print_checksum(get_device_t(res->preferred_memory_t()), "res", 0, num_unconverged, - RTE_OUT(std::cout)); + /* checksum info */ + if (pcs) { + auto cs_pw = res->checksum_pw(mem, wf::spin_index(0), wf::band_range(0, num_unconverged)); + auto cs_mt = res->checksum_mt(mem, wf::spin_index(0), wf::band_range(0, num_unconverged)); + auto cs = res->checksum(mem, wf::band_range(0, num_unconverged)); + utils::print_checksum("res_pw", cs_pw, RTE_OUT(out__)); + utils::print_checksum("res_mt", cs_mt, RTE_OUT(out__)); + utils::print_checksum("res", cs, RTE_OUT(out__)); } } /* verify convergence criteria */ int num_converged = num_ritz - num_unconverged; - bool converged_by_relative_tol = (iter_step > 0) && (current_frobenius_norm < relative_frobenius_tolerance); - bool converged_by_absolute_tol = (num_locked + num_converged + itso.min_num_res()) >= num_bands__; + bool converged_by_relative_tol = (iter_step > 0) && (std::abs(current_frobenius_norm) < std::abs(relative_frobenius_tolerance)); + bool converged_by_absolute_tol = (num_locked + num_converged + itso.min_num_res()) >= num_bands__.get(); bool converged = converged_by_relative_tol || converged_by_absolute_tol; @@ -611,11 +626,14 @@ davidson(Hamiltonian_k>& Hk__, int num_bands__, int num_mag_dims__, PROFILE("sirius::davidson|update_phi"); /* recompute wave-functions */ /* \Psi_{i} = \sum_{mu} \phi_{mu} * Z_{mu, i} */ - transform(ctx.spla_context(), nc_mag ? 2 : ispin_step, {phi.get()}, num_locked, N - num_locked, evec, - 0, 0, {&psi__}, num_locked, num_ritz); + for (auto s = sr.begin(); s != sr.end(); s++) { + auto sp = phi->actual_spin_index(s); + wf::transform(ctx.spla_context(), mem, evec, 0, 0, 1.0, *phi, sp, wf::band_range(num_locked, N), + 0.0, psi__, s, wf::band_range(num_locked, num_locked + num_ritz)); + } /* update eigen-values */ - for (int j = num_locked; j < num_bands__; j++) { + for (int j = num_locked; j < num_bands__.get(); j++) { result.eval(j, ispin_step) = eval[j - num_locked]; } @@ -634,37 +652,40 @@ davidson(Hamiltonian_k>& Hk__, int num_bands__, int num_mag_dims__, } else { /* otherwise, set Psi as a new trial basis */ kp.message(3, __function_name__, "%s", "subspace size limit reached\n"); - // TODO: consider keeping more than num_bands when nearly all Ritz vectors have converged. - int keep = num_bands__; - /* need to compute all hpsi and spsi states (not only unconverged - that was done * by the residuals() function before) */ if (estimate_eval__) { - switch (what) { - case davidson_evp_t::hamiltonian: { - transform(ctx.spla_context(), nc_mag ? 2 : ispin_step, 1.0, - std::vector>*>({hphi.get(), sphi.get()}), - num_locked, N - num_locked, evec, 0, 0, 0.0, {hpsi.get(), spsi.get()}, - 0, num_ritz); - break; - } - case davidson_evp_t::overlap: { - transform(ctx.spla_context(), nc_mag ? 2 : ispin_step, 1.0, - std::vector>*>({sphi.get()}), num_locked, - N - num_locked, evec, 0, 0, 0.0, {spsi.get()}, 0, num_ritz); - break; + for (auto s = sr.begin(); s != sr.end(); s++) { + auto sp = sphi->actual_spin_index(s); + switch (what) { + case davidson_evp_t::hamiltonian: { + wf::transform(ctx.spla_context(), mem, evec, 0, 0, 1.0, *hphi, sp, + wf::band_range(num_locked, N), 0.0, *hpsi, sp, + wf::band_range(0, num_ritz)); + } + /* attention! there is no break statement here for a reason: + * we want to coontinue and compute the update to spsi */ + case davidson_evp_t::overlap: { + wf::transform(ctx.spla_context(), mem, evec, 0, 0, 1.0, *sphi, sp, + wf::band_range(num_locked, N), 0.0, *spsi, sp, + wf::band_range(0, num_ritz)); + } } } } + // TODO: consider keeping more than num_bands when nearly all Ritz vectors have converged. + // TODO: remove + int keep = num_bands__.get(); + /* update basis functions, hphi and sphi */ - for (int ispn = 0; ispn < num_sc; ispn++) { - phi->copy_from(psi__, keep - num_locked, nc_mag ? ispn : ispin_step, num_locked, - nc_mag ? ispn : 0, num_locked); + for (auto s = sr.begin(); s != sr.end(); s++) { + auto sp = phi->actual_spin_index(s); + wf::copy(mem, psi__, s, wf::band_range(num_locked, keep), *phi, sp, wf::band_range(num_locked, keep)); + wf::copy(mem, *spsi, sp, wf::band_range(0, num_ritz), *sphi, sp, wf::band_range(num_locked, keep)); if (what == davidson_evp_t::hamiltonian) { - hphi->copy_from(*hpsi, keep - num_locked, ispn, 0, ispn, num_locked); + wf::copy(mem, *hpsi, sp, wf::band_range(0, num_ritz), *hphi, sp, wf::band_range(num_locked, keep)); } - sphi->copy_from(*spsi, keep - num_locked, ispn, 0, ispn, num_locked); } /* remove locked Ritz values so indexing starts at unconverged eigenpairs */ @@ -691,11 +712,13 @@ davidson(Hamiltonian_k>& Hk__, int num_bands__, int num_mag_dims__, } /* expand variational subspace with new basis vectors obtatined from residuals */ - for (int ispn = 0; ispn < num_sc; ispn++) { - phi->copy_from(*res, expand_with, ispn, 0, ispn, N); + for (auto s = sr.begin(); s != sr.end(); s++) { + auto sp = phi->actual_spin_index(s); + wf::copy(mem, *res, sp, wf::band_range(0, expand_with), *phi, sp, wf::band_range(N, N + expand_with)); } if (should_restart && phi_extra__) { - phi->copy_from(*phi_extra__, num_extra_phi, 0, 0, 0, N + expand_with); + wf::copy(mem, *phi_extra__, wf::spin_index(0), wf::band_range(0, num_extra_phi), *phi, + wf::spin_index(0), wf::band_range(N + expand_with, N + expand_with + num_extra_phi)); expand_with += num_extra_phi; } if (verbosity__ >= 1) { @@ -717,41 +740,40 @@ davidson(Hamiltonian_k>& Hk__, int num_bands__, int num_mag_dims__, if (ctx.full_potential()) { if (should_restart && phi_extra__) { /* apply Hamiltonian to expand_with - num_extra_phi states; copy the rest */ - Hk__.apply_fv_h_o(false, false, N, expand_with - num_extra_phi, *phi, hphi.get(), sphi.get()); - hphi->copy_from(*hphi_extra, num_extra_phi, 0, 0, 0, N + expand_with - num_extra_phi); - sphi->copy_from(*sphi_extra, num_extra_phi, 0, 0, 0, N + expand_with - num_extra_phi); + Hk__.apply_fv_h_o(false, false, wf::band_range(N, N + expand_with - num_extra_phi), + *phi, hphi.get(), sphi.get()); + wf::copy(mem, *hphi_extra, wf::spin_index(0), wf::band_range(0, num_extra_phi), *hphi, + wf::spin_index(0), wf::band_range(N + expand_with - num_extra_phi, N + expand_with)); + wf::copy(mem, *sphi_extra, wf::spin_index(0), wf::band_range(0, num_extra_phi), *sphi, + wf::spin_index(0), wf::band_range(N + expand_with - num_extra_phi, N + expand_with)); } else { - Hk__.apply_fv_h_o(false, false, N, expand_with, *phi, hphi.get(), sphi.get()); + Hk__.apply_fv_h_o(false, false, wf::band_range(N, N + expand_with), *phi, hphi.get(), sphi.get()); } - sddk::orthogonalize(ctx.spla_context(), ctx.preferred_memory_t(), ctx.blas_linalg_t(), - sddk::spin_range(nc_mag ? 2 : 0), *phi, *hphi, *sphi, N, expand_with, H, *res, true); + wf::orthogonalize(ctx.spla_context(), mem, sr, wf::band_range(0, N), wf::band_range(N, N + expand_with), + *phi, *sphi, {phi.get(), hphi.get(), sphi.get()}, H, *res, true); } else { /* for pseudopotential case we first project out the old subspace; this takes little less * operations and gives a slighly more stable procedure, especially for fp32 */ - project_out_subspace(ctx.spla_context(), sddk::spin_range(nc_mag ? 2 : 0), *phi, *sphi, N, expand_with, H); - Hk__.template apply_h_s(sddk::spin_range(nc_mag ? 2 : ispin_step), N, expand_with, *phi, hphi.get(), sphi.get()); - sddk::orthogonalize(ctx.spla_context(), ctx.preferred_memory_t(), ctx.blas_linalg_t(), - sddk::spin_range(nc_mag ? 2 : 0), *phi, *hphi, *sphi, N, expand_with, H, *res, false); - if (extra_ortho__) { - sddk::orthogonalize(ctx.spla_context(), ctx.preferred_memory_t(), ctx.blas_linalg_t(), - sddk::spin_range(nc_mag ? 2 : 0), *phi, *hphi, *sphi, N, expand_with, H, *res, false); + project_out_subspace(ctx.spla_context(), mem, sr, *phi, *sphi, N, expand_with, H); + Hk__.template apply_h_s(sr, wf::band_range(N, N + expand_with), *phi, hphi.get(), sphi.get()); + for (int j = 0; j < num_ortho_steps; j++) { + wf::orthogonalize(ctx.spla_context(), mem, sr, wf::band_range(0, N), wf::band_range(N, N + expand_with), + *phi, *sphi, {phi.get(), hphi.get(), sphi.get()}, H, *res, false); } } Band(ctx).set_subspace_mtrx(N, expand_with, num_locked, *phi, *hphi, H, &H_old); break; } case davidson_evp_t::overlap: { - project_out_subspace(ctx.spla_context(), sddk::spin_range(nc_mag ? 2 : 0), *phi, *phi, N, expand_with, H); + project_out_subspace(ctx.spla_context(), mem, sr, *phi, *phi, N, expand_with, H); if (ctx.full_potential()) { - Hk__.apply_fv_h_o(true, false, N, expand_with, *phi, nullptr, sphi.get()); + Hk__.apply_fv_h_o(true, false, wf::band_range(N, N + expand_with), *phi, nullptr, sphi.get()); } else { - Hk__.template apply_h_s(sddk::spin_range(nc_mag ? 2 : ispin_step), N, expand_with, *phi, nullptr, sphi.get()); + Hk__.template apply_h_s(sr, wf::band_range(N, N + expand_with), *phi, nullptr, sphi.get()); } - sddk::orthogonalize(ctx.spla_context(), ctx.preferred_memory_t(), ctx.blas_linalg_t(), - sddk::spin_range(nc_mag ? 2 : 0), *phi, *sphi, N, expand_with, H, *res, false); - if (extra_ortho__) { - sddk::orthogonalize(ctx.spla_context(), ctx.preferred_memory_t(), ctx.blas_linalg_t(), - sddk::spin_range(nc_mag ? 2 : 0), *phi, *sphi, N, expand_with, H, *res, false); + for (int j = 0; j < num_ortho_steps; j++) { + wf::orthogonalize(ctx.spla_context(), mem, sr, wf::band_range(0, N), wf::band_range(N, N + expand_with), + *phi, *phi, {phi.get(), sphi.get()}, H, *res, false); } Band(ctx).set_subspace_mtrx(N, expand_with, num_locked, *phi, *sphi, H, &H_old); break; @@ -762,7 +784,7 @@ davidson(Hamiltonian_k>& Hk__, int num_bands__, int num_mag_dims__, if (ctx.cfg().control().verification() >= 1) { auto max_diff = check_hermitian(H, N + expand_with - num_locked); - if (max_diff > (std::is_same, double>::value ? 1e-12 : 1e-6)) { + if (max_diff > (std::is_same::value ? 1e-12 : 1e-6)) { std::stringstream s; kp.message(1, __function_name__, "H matrix of size %i is not Hermitian, maximum error: %18.12e\n", N + expand_with - num_locked, max_diff); @@ -775,19 +797,19 @@ davidson(Hamiltonian_k>& Hk__, int num_bands__, int num_mag_dims__, /* copy the Ritz values */ eval >> eval_old; - kp.message(3, __function_name__, "Computing %d pre-Ritz pairs\n", num_bands__ - num_locked); + kp.message(3, __function_name__, "Computing %d pre-Ritz pairs\n", num_bands__.get() - num_locked); /* solve standard eigen-value problem with the size N */ - if (std_solver.solve(N - num_locked, num_bands__ - num_locked, H, &eval[0], evec)) { + if (std_solver.solve(N - num_locked, num_bands__.get() - num_locked, H, &eval[0], evec)) { std::stringstream s; s << "error in diagonalziation"; RTE_THROW(s); } - ctx.evp_work_count(std::pow(static_cast(N - num_locked) / num_bands__, 3)); + ctx.evp_work_count(std::pow(static_cast(N - num_locked) / num_bands__.get(), 3)); kp.message(3, __function_name__, "step: %i, current subspace size: %i, maximum subspace size: %i\n", iter_step, N, num_phi); - for (int i = 0; i < num_bands__ - num_locked; i++) { + for (int i = 0; i < num_bands__.get() - num_locked; i++) { kp.message(4, __function_name__, "eval[%i]=%20.16f, diff=%20.16f\n", i, eval[i], std::abs(eval[i] - eval_old[i])); } @@ -798,14 +820,12 @@ davidson(Hamiltonian_k>& Hk__, int num_bands__, int num_mag_dims__, } /* loop over ispin_step */ PROFILE_STOP("sirius::davidson|iter"); - if (is_device_memory(ctx.preferred_memory_t())) { - psi__.dismiss(sddk::spin_range(psi__.num_sc() == 2 ? 2 : 0), true); - } - + mg.clear(); ctx.print_memory_usage(__FILE__, __LINE__); return result; } -} + +} // namespace #endif diff --git a/src/band/diag_full_potential.cpp b/src/band/diag_full_potential.cpp index d2126a2ff..98669cea4 100644 --- a/src/band/diag_full_potential.cpp +++ b/src/band/diag_full_potential.cpp @@ -24,9 +24,6 @@ #include "band.hpp" #include "residuals.hpp" -#include "wf_inner.hpp" -#include "wf_ortho.hpp" -#include "wf_trans.hpp" #include "context/simulation_context.hpp" #include "k_point/k_point.hpp" #include "utils/profiler.hpp" @@ -49,14 +46,14 @@ Band::diag_full_potential_first_variation_exact(Hamiltonian_k& Hk__) con /* block size of scalapack 2d block-cyclic distribution */ int bs = ctx_.cyclic_block_size(); - sddk::dmatrix h(ngklo, ngklo, ctx_.blacs_grid(), bs, bs, ctx_.mem_pool(solver.host_memory_t())); - sddk::dmatrix o(ngklo, ngklo, ctx_.blacs_grid(), bs, bs, ctx_.mem_pool(solver.host_memory_t())); + sddk::dmatrix h(ngklo, ngklo, ctx_.blacs_grid(), bs, bs, get_memory_pool(solver.host_memory_t())); + sddk::dmatrix o(ngklo, ngklo, ctx_.blacs_grid(), bs, bs, get_memory_pool(solver.host_memory_t())); /* setup Hamiltonian and overlap */ Hk__.set_fv_h_o(h, o); if (ctx_.gen_evp_solver().type() == ev_solver_t::cusolver) { - auto& mpd = ctx_.mem_pool(sddk::memory_t::device); + auto& mpd = get_memory_pool(sddk::memory_t::device); h.allocate(mpd); o.allocate(mpd); kp.fv_eigen_vectors().allocate(mpd); @@ -117,148 +114,116 @@ Band::diag_full_potential_first_variation_exact(Hamiltonian_k& Hk__) con } /* remap to slab */ - kp.fv_eigen_vectors_slab().pw_coeffs(0).remap_from(kp.fv_eigen_vectors(), 0); - kp.fv_eigen_vectors_slab().mt_coeffs(0).remap_from(kp.fv_eigen_vectors(), kp.num_gkvec()); + { + auto layout_in = kp.fv_eigen_vectors().grid_layout(0, 0, kp.gkvec().num_gvec(), ctx_.num_fv_states()); + auto layout_out = kp.fv_eigen_vectors_slab().grid_layout_pw(wf::spin_index(0), wf::band_range(0, ctx_.num_fv_states())); + costa::transform(layout_in, layout_out, 'N', sddk::linalg_const>::one(), + sddk::linalg_const>::zero(), kp.comm().mpi_comm()); + } + { + auto layout_in = kp.fv_eigen_vectors().grid_layout(kp.gkvec().num_gvec(), 0, + ctx_.unit_cell().mt_lo_basis_size(), ctx_.num_fv_states()); + auto layout_out = kp.fv_eigen_vectors_slab().grid_layout_mt(wf::spin_index(0), wf::band_range(0, ctx_.num_fv_states())); + costa::transform(layout_in, layout_out, 'N', sddk::linalg_const>::one(), + sddk::linalg_const>::zero(), kp.comm().mpi_comm()); + } /* renormalize wave-functions */ if (ctx_.valence_relativity() == relativity_t::iora) { - sddk::Wave_functions ofv(kp.gkvec_partition(), unit_cell_.num_atoms(), - [this](int ia) { return unit_cell_.atom(ia).mt_lo_basis_size(); }, ctx_.num_fv_states(), - ctx_.preferred_memory_t(), 1); - if (ctx_.processing_unit() == sddk::device_t::GPU) { - kp.fv_eigen_vectors_slab().allocate(sddk::spin_range(0), sddk::memory_t::device); - kp.fv_eigen_vectors_slab().copy_to(sddk::spin_range(0), sddk::memory_t::device, 0, ctx_.num_fv_states()); - ofv.allocate(sddk::spin_range(0), sddk::memory_t::device); - } - - Hk__.apply_fv_h_o(false, false, 0, ctx_.num_fv_states(), kp.fv_eigen_vectors_slab(), nullptr, &ofv); - if (ctx_.processing_unit() == sddk::device_t::GPU) { - kp.fv_eigen_vectors_slab().deallocate(sddk::spin_range(0), sddk::memory_t::device); + std::vector num_mt_coeffs(unit_cell_.num_atoms()); + for (int ia = 0; ia < unit_cell_.num_atoms(); ia++) { + num_mt_coeffs[ia] = unit_cell_.atom(ia).mt_lo_basis_size(); } + wf::Wave_functions ofv_new(kp.gkvec_sptr(), num_mt_coeffs, wf::num_mag_dims(0), + wf::num_bands(ctx_.num_fv_states()), sddk::memory_t::host); - //if (true) { - // Wave_functions phi(kp.gkvec_partition(), unit_cell_.num_atoms(), - // [this](int ia) { return unit_cell_.atom(ia).mt_lo_basis_size(); }, ctx_.num_fv_states(), - // ctx_.preferred_memory_t(), 1); - // Wave_functions ofv(kp.gkvec_partition(), unit_cell_.num_atoms(), - // [this](int ia) { return unit_cell_.atom(ia).mt_lo_basis_size(); }, ctx_.num_fv_states(), - // ctx_.preferred_memory_t(), 1); - // phi.allocate(spin_range(0), memory_t::device); - // ofv.allocate(spin_range(0), memory_t::device); - - // for (int i = 0; i < kp.num_gkvec(); i++) { - // phi.zero(device_t::CPU, 0, 0, ctx_.num_fv_states()); - // for (int j = 0; j < ctx_.num_fv_states(); j++) { - // phi.pw_coeffs(0).prime(i, j) = 1.0; - // } - // phi.copy_to(spin_range(0), memory_t::device, 0, ctx_.num_fv_states()); - // Hk__.apply_fv_h_o(false, false, 0, ctx_.num_fv_states(), phi, nullptr, &ofv); - // } - - // for (int i = 0; i < unit_cell_.mt_lo_basis_size(); i++) { - // phi.zero(device_t::CPU, 0, 0, ctx_.num_fv_states()); - // for (int j = 0; j < ctx_.num_fv_states(); j++) { - // phi.mt_coeffs(0).prime(i, j) = 1.0; - // } - // phi.copy_to(spin_range(0), memory_t::device, 0, ctx_.num_fv_states()); - // Hk__.apply_fv_h_o(false, false, 0, ctx_.num_fv_states(), phi, nullptr, &ofv); - // } - //} - - std::vector norm(ctx_.num_fv_states(), 0); - #pragma omp parallel for schedule(static) - for (int i = 0; i < ctx_.num_fv_states(); i++) { - for (int j = 0; j < ofv.pw_coeffs(0).num_rows_loc(); j++) { - norm[i] += std::real(std::conj(kp.fv_eigen_vectors_slab().pw_coeffs(0).prime(j, i)) * ofv.pw_coeffs(0).prime(j, i)); - } - for (int j = 0; j < ofv.mt_coeffs(0).num_rows_loc(); j++) { - norm[i] += std::real(std::conj(kp.fv_eigen_vectors_slab().mt_coeffs(0).prime(j, i)) * ofv.mt_coeffs(0).prime(j, i)); - } - } - kp.comm().allreduce(norm); - if (ctx_.verbosity() >= 2) { - for (int i = 0; i < ctx_.num_fv_states(); i++) { - kp.message(2, __function_name__, "norm(%i)=%18.12f\n", i, norm[i]); - } - } - #pragma omp parallel for schedule(static) - for (int i = 0; i < ctx_.num_fv_states(); i++) { - norm[i] = 1 / std::sqrt(norm[i]); - for (int j = 0; j < ofv.pw_coeffs(0).num_rows_loc(); j++) { - kp.fv_eigen_vectors_slab().pw_coeffs(0).prime(j, i) *= norm[i]; - } - for (int j = 0; j < ofv.mt_coeffs(0).num_rows_loc(); j++) { - kp.fv_eigen_vectors_slab().mt_coeffs(0).prime(j, i) *= norm[i]; - } - } - } + { + auto mem = ctx_.processing_unit() == sddk::device_t::CPU ? sddk::memory_t::host : sddk::memory_t::device; + auto mg1 = kp.fv_eigen_vectors_slab().memory_guard(mem, wf::copy_to::device); + auto mg2 = ofv_new.memory_guard(mem, wf::copy_to::host); - if (ctx_.cfg().control().verification() >= 2) { - kp.message(1, __function_name__, "%s", "checking application of H and O\n"); - /* check application of H and O */ - sddk::Wave_functions hphi(kp.gkvec_partition(), unit_cell_.num_atoms(), - [this](int ia) { return unit_cell_.atom(ia).mt_lo_basis_size(); }, ctx_.num_fv_states(), - ctx_.preferred_memory_t()); - sddk::Wave_functions ophi(kp.gkvec_partition(), unit_cell_.num_atoms(), - [this](int ia) { return unit_cell_.atom(ia).mt_lo_basis_size(); }, ctx_.num_fv_states(), - ctx_.preferred_memory_t()); - - if (ctx_.processing_unit() == sddk::device_t::GPU) { - kp.fv_eigen_vectors_slab().allocate(sddk::spin_range(0), sddk::memory_t::device); - kp.fv_eigen_vectors_slab().copy_to(sddk::spin_range(0), sddk::memory_t::device, 0, ctx_.num_fv_states()); - hphi.allocate(sddk::spin_range(0), sddk::memory_t::device); - ophi.allocate(sddk::spin_range(0), sddk::memory_t::device); + Hk__.apply_fv_h_o(false, false, wf::band_range(0, ctx_.num_fv_states()), kp.fv_eigen_vectors_slab(), + nullptr, &ofv_new); } - Hk__.apply_fv_h_o(false, false, 0, ctx_.num_fv_states(), kp.fv_eigen_vectors_slab(), &hphi, &ophi); - - sddk::dmatrix hmlt(ctx_.num_fv_states(), ctx_.num_fv_states(), ctx_.blacs_grid(), - ctx_.cyclic_block_size(), ctx_.cyclic_block_size()); - sddk::dmatrix ovlp(ctx_.num_fv_states(), ctx_.num_fv_states(), ctx_.blacs_grid(), - ctx_.cyclic_block_size(), ctx_.cyclic_block_size()); - - inner(ctx_.spla_context(), sddk::spin_range(0), kp.fv_eigen_vectors_slab(), 0, ctx_.num_fv_states(), - hphi, 0, ctx_.num_fv_states(), hmlt, 0, 0); - inner(ctx_.spla_context(), sddk::spin_range(0), kp.fv_eigen_vectors_slab(), 0, ctx_.num_fv_states(), - ophi, 0, ctx_.num_fv_states(), ovlp, 0, 0); - - double max_diff{0}; - for (int i = 0; i < hmlt.num_cols_local(); i++) { - int icol = hmlt.icol(i); - for (int j = 0; j < hmlt.num_rows_local(); j++) { - int jrow = hmlt.irow(j); - if (icol == jrow) { - max_diff = std::max(max_diff, std::abs(hmlt(j, i) - eval[icol])); - } else { - max_diff = std::max(max_diff, std::abs(hmlt(j, i))); - } - } - } - if (max_diff > 1e-9) { - std::stringstream s; - s << "application of Hamiltonian failed, maximum error: " << max_diff; - WARNING(s); - } + auto norm1 = wf::inner_diag>(sddk::memory_t::host, kp.fv_eigen_vectors_slab(), + ofv_new, wf::spin_range(0), wf::num_bands(ctx_.num_fv_states())); - max_diff = 0; - for (int i = 0; i < ovlp.num_cols_local(); i++) { - int icol = ovlp.icol(i); - for (int j = 0; j < ovlp.num_rows_local(); j++) { - int jrow = ovlp.irow(j); - if (icol == jrow) { - max_diff = std::max(max_diff, std::abs(ovlp(j, i) - 1.0)); - } else { - max_diff = std::max(max_diff, std::abs(ovlp(j, i))); - } - } - } - if (max_diff > 1e-9) { - std::stringstream s; - s << "application of overlap failed, maximum error: " << max_diff; - WARNING(s); + std::vector norm; + for (auto e : norm1) { + norm.push_back(1 / std::sqrt(std::real(e))); } + + wf::axpby(sddk::memory_t::host, wf::spin_range(0), wf::band_range(0, ctx_.num_fv_states()), + nullptr, nullptr, norm.data(), &kp.fv_eigen_vectors_slab()); } + + //if (ctx_.cfg().control().verification() >= 2) { + // kp.message(1, __function_name__, "%s", "checking application of H and O\n"); + // /* check application of H and O */ + // sddk::Wave_functions hphi(kp.gkvec_partition(), unit_cell_.num_atoms(), + // [this](int ia) { return unit_cell_.atom(ia).mt_lo_basis_size(); }, ctx_.num_fv_states(), + // ctx_.preferred_memory_t()); + // sddk::Wave_functions ophi(kp.gkvec_partition(), unit_cell_.num_atoms(), + // [this](int ia) { return unit_cell_.atom(ia).mt_lo_basis_size(); }, ctx_.num_fv_states(), + // ctx_.preferred_memory_t()); + + // if (ctx_.processing_unit() == sddk::device_t::GPU) { + // kp.fv_eigen_vectors_slab().allocate(sddk::spin_range(0), sddk::memory_t::device); + // kp.fv_eigen_vectors_slab().copy_to(sddk::spin_range(0), sddk::memory_t::device, 0, ctx_.num_fv_states()); + // hphi.allocate(sddk::spin_range(0), sddk::memory_t::device); + // ophi.allocate(sddk::spin_range(0), sddk::memory_t::device); + // } + + // Hk__.apply_fv_h_o(false, false, 0, ctx_.num_fv_states(), kp.fv_eigen_vectors_slab(), &hphi, &ophi); + + // sddk::dmatrix hmlt(ctx_.num_fv_states(), ctx_.num_fv_states(), ctx_.blacs_grid(), + // ctx_.cyclic_block_size(), ctx_.cyclic_block_size()); + // sddk::dmatrix ovlp(ctx_.num_fv_states(), ctx_.num_fv_states(), ctx_.blacs_grid(), + // ctx_.cyclic_block_size(), ctx_.cyclic_block_size()); + + // inner(ctx_.spla_context(), sddk::spin_range(0), kp.fv_eigen_vectors_slab(), 0, ctx_.num_fv_states(), + // hphi, 0, ctx_.num_fv_states(), hmlt, 0, 0); + // inner(ctx_.spla_context(), sddk::spin_range(0), kp.fv_eigen_vectors_slab(), 0, ctx_.num_fv_states(), + // ophi, 0, ctx_.num_fv_states(), ovlp, 0, 0); + + // double max_diff{0}; + // for (int i = 0; i < hmlt.num_cols_local(); i++) { + // int icol = hmlt.icol(i); + // for (int j = 0; j < hmlt.num_rows_local(); j++) { + // int jrow = hmlt.irow(j); + // if (icol == jrow) { + // max_diff = std::max(max_diff, std::abs(hmlt(j, i) - eval[icol])); + // } else { + // max_diff = std::max(max_diff, std::abs(hmlt(j, i))); + // } + // } + // } + // if (max_diff > 1e-9) { + // std::stringstream s; + // s << "application of Hamiltonian failed, maximum error: " << max_diff; + // WARNING(s); + // } + + // max_diff = 0; + // for (int i = 0; i < ovlp.num_cols_local(); i++) { + // int icol = ovlp.icol(i); + // for (int j = 0; j < ovlp.num_rows_local(); j++) { + // int jrow = ovlp.irow(j); + // if (icol == jrow) { + // max_diff = std::max(max_diff, std::abs(ovlp(j, i) - 1.0)); + // } else { + // max_diff = std::max(max_diff, std::abs(ovlp(j, i))); + // } + // } + // } + // if (max_diff > 1e-9) { + // std::stringstream s; + // s << "application of overlap failed, maximum error: " << max_diff; + // WARNING(s); + // } + //} } void Band::get_singular_components(Hamiltonian_k& Hk__, double itsol_tol__) const @@ -267,9 +232,7 @@ void Band::get_singular_components(Hamiltonian_k& Hk__, double itsol_tol auto& kp = Hk__.kp(); - auto& psi = kp.singular_components(); - - int ncomp = psi.num_wf(); + int ncomp = kp.singular_components().num_wf().get(); ctx_.message(3, __function_name__, "number of singular components: %i\n", ncomp); @@ -278,7 +241,8 @@ void Band::get_singular_components(Hamiltonian_k& Hk__, double itsol_tol std::stringstream s; std::ostream* out = (kp.comm().rank() == 0) ? &std::cout : &s; - auto result = davidson(Hk__, ncomp, 0, psi, + auto result = davidson(Hk__, wf::num_bands(ncomp), wf::num_mag_dims(0), + kp.singular_components(), [&](int i, int ispn){ return itsol_tol__; }, itso.residual_tolerance(), itso.num_steps(), itso.locking(), itso.subspace_size(), itso.converge_by_energy(), itso.extra_ortho(), *out, ctx_.verbosity() - 2); @@ -296,52 +260,54 @@ void Band::diag_full_potential_first_variation_davidson(Hamiltonian_k& H auto& itso = ctx_.cfg().iterative_solver(); - get_singular_components(Hk__, itsol_tol__); + /* number of singular components */ + int ncomp = kp.singular_components().num_wf().get(); + + if (ncomp) { + /* compute eigen-vectors of O^{APW-APW} */ + get_singular_components(Hk__, itsol_tol__); + } /* total number of local orbitals */ int nlo = ctx_.unit_cell().mt_lo_basis_size(); - /* number of singular components */ - int ncomp = kp.singular_components().num_wf(); - - auto phi_extra = wave_function_factory(ctx_, kp, nlo + ncomp, 1, true); - phi_extra->pw_coeffs(0).zero(sddk::memory_t::host, 0, nlo + ncomp); - phi_extra->mt_coeffs(0).zero(sddk::memory_t::host, 0, nlo + ncomp); + auto phi_extra_new = wave_function_factory(ctx_, kp, wf::num_bands(nlo + ncomp), wf::num_mag_dims(0), true); + phi_extra_new->zero(sddk::memory_t::host, wf::spin_index(0), wf::band_range(0, nlo + ncomp)); - /* copy [0, ncomp) from kp.singular_components() to [0, ncomp) in phi_extra */ - phi_extra->copy_from(sddk::device_t::CPU, ncomp, kp.singular_components(), 0, 0, 0, 0); + if (ncomp) { + /* copy [0, ncomp) from kp.singular_components() to [0, ncomp) in phi_extra */ + wf::copy(sddk::memory_t::host, kp.singular_components(), wf::spin_index(0), wf::band_range(0, ncomp), + *phi_extra_new, wf::spin_index(0), wf::band_range(0, ncomp)); + } /* add pure local orbitals to the basis staring from ncomp index */ if (nlo) { - for (int ialoc = 0; ialoc < phi_extra->spl_num_atoms().local_size(); ialoc++) { - int ia = phi_extra->spl_num_atoms()[ialoc]; + for (int ialoc = 0; ialoc < phi_extra_new->spl_num_atoms().local_size(); ialoc++) { + int ia = phi_extra_new->spl_num_atoms()[ialoc]; for (int xi = 0; xi < unit_cell_.atom(ia).mt_lo_basis_size(); xi++) { - phi_extra->mt_coeffs(0).prime(phi_extra->offset_mt_coeffs(ialoc) + xi, - unit_cell_.atom(ia).offset_lo() + xi + ncomp) = 1.0; + phi_extra_new->mt_coeffs(xi, wf::atom_index(ialoc), wf::spin_index(0), + wf::band_index(unit_cell_.atom(ia).offset_lo() + xi + ncomp)) = 1.0; } } } - if (is_device_memory(ctx_.preferred_memory_t())) { - phi_extra->copy_to(sddk::spin_range(0), sddk::memory_t::device, 0, nlo + ncomp); - } - if (ctx_.cfg().control().print_checksum()) { - phi_extra->print_checksum(get_device_t(phi_extra->preferred_memory_t()), "extra phi", 0, nlo + ncomp, - RTE_OUT(std::cout)); + if (env::print_checksum()) { + auto cs = phi_extra_new->checksum(sddk::memory_t::host, wf::band_range(0, nlo + ncomp)); + if (kp.comm().rank() == 0) { + utils::print_checksum("phi_extra", cs, RTE_OUT(std::cout)); + } } - /* short notation for target wave-functions */ - auto& psi = kp.fv_eigen_vectors_slab(); - auto tolerance = [&](int j__, int ispn__) -> double { return itsol_tol__; }; std::stringstream s; std::ostream* out = (kp.comm().rank() == 0) ? &std::cout : &s; - auto result = davidson, std::complex, davidson_evp_t::hamiltonian>(Hk__, - ctx_.num_fv_states(), 0, psi, tolerance, itso.residual_tolerance(), itso.num_steps(), itso.locking(), - itso.subspace_size(), itso.converge_by_energy(), itso.extra_ortho(), *out, ctx_.verbosity() - 2, - phi_extra.get()); + auto result = davidson, davidson_evp_t::hamiltonian>(Hk__, + wf::num_bands(ctx_.num_fv_states()), wf::num_mag_dims(0), kp.fv_eigen_vectors_slab(), tolerance, + itso.residual_tolerance(), itso.num_steps(), itso.locking(), itso.subspace_size(), + itso.converge_by_energy(), itso.extra_ortho(), *out, ctx_.verbosity() - 2, + phi_extra_new.get()); kp.set_fv_eigen_values(&result.eval[0]); } @@ -357,22 +323,39 @@ void Band::diag_full_potential_second_variation(Hamiltonian_k& Hk__) con return; } + auto pcs = env::print_checksum(); + + int nfv = ctx_.num_fv_states(); + int bs = ctx_.cyclic_block_size(); + sddk::mdarray band_energies(ctx_.num_bands(), ctx_.num_spinors()); + std::vector num_mt_coeffs(ctx_.unit_cell().num_atoms()); + for (int ia = 0; ia < ctx_.unit_cell().num_atoms(); ia++) { + num_mt_coeffs[ia] = ctx_.unit_cell().atom(ia).mt_basis_size(); + } + /* product of the second-variational Hamiltonian and a first-variational wave-function */ - std::vector> hpsi; + std::vector> hpsi; for (int i = 0; i < ctx_.num_mag_comp(); i++) { - hpsi.push_back(sddk::Wave_functions(kp.gkvec_partition(), unit_cell_.num_atoms(), - [this](int ia) { return unit_cell_.atom(ia).mt_basis_size(); }, - ctx_.num_fv_states(), ctx_.preferred_memory_t())); + hpsi.push_back(wf::Wave_functions(kp.gkvec_sptr(), num_mt_coeffs, + wf::num_mag_dims(0), wf::num_bands(nfv), ctx_.host_memory_t())); + } + + if (pcs) { + auto cs1 = kp.fv_states().checksum_pw(sddk::memory_t::host, wf::spin_index(0), wf::band_range(0, nfv)); + auto cs2 = kp.fv_states().checksum_mt(sddk::memory_t::host, wf::spin_index(0), wf::band_range(0, nfv)); + if (kp.comm().rank() == 0) { + utils::print_checksum("psi_pw", cs1, RTE_OUT(std::cout)); + utils::print_checksum("psi_mt", cs2, RTE_OUT(std::cout)); + } } /* compute product of magnetic field and wave-function */ if (ctx_.num_spins() == 2) { Hk__.apply_b(kp.fv_states(), hpsi); } else { - hpsi[0].pw_coeffs(0).prime().zero(); - hpsi[0].mt_coeffs(0).prime().zero(); + hpsi[0].zero(sddk::memory_t::host, wf::spin_index(0), wf::band_range(0, nfv)); } ctx_.print_memory_usage(__FILE__, __LINE__); @@ -392,49 +375,46 @@ void Band::diag_full_potential_second_variation(Hamiltonian_k& Hk__) con Hk__.H0().apply_so_correction(kp.fv_states(), hpsi); } - int nfv = ctx_.num_fv_states(); - int bs = ctx_.cyclic_block_size(); - - if (ctx_.processing_unit() == sddk::device_t::GPU) { - kp.fv_states().allocate(sddk::spin_range(0), ctx_.mem_pool(sddk::memory_t::device)); - kp.fv_states().copy_to(sddk::spin_range(0), sddk::memory_t::device, 0, nfv); - for (int i = 0; i < ctx_.num_mag_comp(); i++) { - hpsi[i].allocate(sddk::spin_range(0), ctx_.mem_pool(sddk::memory_t::device)); - hpsi[i].copy_to(sddk::spin_range(0), sddk::memory_t::device, 0, nfv); - } + std::vector mg; + mg.emplace_back(kp.fv_states().memory_guard(ctx_.processing_unit_memory_t(), wf::copy_to::device)); + for (int i = 0; i < ctx_.num_mag_comp(); i++) { + mg.emplace_back(hpsi[i].memory_guard(ctx_.processing_unit_memory_t(), wf::copy_to::device)); } ctx_.print_memory_usage(__FILE__, __LINE__); - //#ifdef __PRINT_OBJECT_CHECKSUM - //auto z1 = kp->fv_states().checksum(0, nfv); - //DUMP("checksum(fv_states): %18.10f %18.10f", std::real(z1), std::imag(z1)); - //for (int i = 0; i < ctx_.num_mag_comp(); i++) { - // z1 = hpsi[i].checksum(0, nfv); - // DUMP("checksum(hpsi[i]): %18.10f %18.10f", std::real(z1), std::imag(z1)); - //} - //#endif - auto& std_solver = ctx_.std_evp_solver(); + wf::band_range br(0, nfv); + wf::spin_range sr(0, 1); + + auto mem = ctx_.processing_unit_memory_t(); + if (ctx_.num_mag_dims() != 3) { sddk::dmatrix h(nfv, nfv, ctx_.blacs_grid(), bs, bs); if (ctx_.blacs_grid().comm().size() == 1 && ctx_.processing_unit() == sddk::device_t::GPU) { - h.allocate(ctx_.mem_pool(sddk::memory_t::device)); + h.allocate(get_memory_pool(sddk::memory_t::device)); } /* perform one or two consecutive diagonalizations */ for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { - + if (pcs) { + auto cs1 = hpsi[ispn].checksum_pw(mem, wf::spin_index(0), wf::band_range(0, nfv)); + auto cs2 = hpsi[ispn].checksum_mt(mem, wf::spin_index(0), wf::band_range(0, nfv)); + if (kp.comm().rank() == 0) { + std::stringstream s1; + s1 << "hpsi_pw_" << ispn; + utils::print_checksum(s1.str(), cs1, RTE_OUT(std::cout)); + std::stringstream s2; + s2 << "hpsi_mt_" << ispn; + utils::print_checksum(s2.str(), cs2, RTE_OUT(std::cout)); + } + } /* compute */ - inner(ctx_.spla_context(), sddk::spin_range(0), kp.fv_states(), 0, nfv, hpsi[ispn], 0, nfv, h, 0, 0); + wf::inner(ctx_.spla_context(), mem, sr, kp.fv_states(), br, hpsi[ispn], br, h, 0, 0); for (int i = 0; i < nfv; i++) { h.add(i, i, kp.fv_eigen_value(i)); } - //#ifdef __PRINT_OBJECT_CHECKSUM - //auto z1 = h.checksum(); - //DUMP("checksum(h): %18.10f %18.10f", std::real(z1), std::imag(z1)); - //#endif PROFILE("sirius::Band::diag_sv|stdevp"); std_solver.solve(nfv, nfv, h, &band_energies(0, ispn), kp.sv_eigen_vectors(ispn)); } @@ -442,14 +422,14 @@ void Band::diag_full_potential_second_variation(Hamiltonian_k& Hk__) con int nb = ctx_.num_bands(); sddk::dmatrix h(nb, nb, ctx_.blacs_grid(), bs, bs); if (ctx_.blacs_grid().comm().size() == 1 && ctx_.processing_unit() == sddk::device_t::GPU) { - h.allocate(ctx_.mem_pool(sddk::memory_t::device)); + h.allocate(get_memory_pool(sddk::memory_t::device)); } /* compute for up-up block */ - inner(ctx_.spla_context(), sddk::spin_range(0), kp.fv_states(), 0, nfv, hpsi[0], 0, nfv, h, 0, 0); + wf::inner(ctx_.spla_context(), mem, sr, kp.fv_states(), br, hpsi[0], br, h, 0, 0); /* compute for dn-dn block */ - inner(ctx_.spla_context(), sddk::spin_range(0), kp.fv_states(), 0, nfv, hpsi[1], 0, nfv, h, nfv, nfv); + wf::inner(ctx_.spla_context(), mem, sr, kp.fv_states(), br, hpsi[1], br, h, nfv, nfv); /* compute for up-dn block */ - inner(ctx_.spla_context(), sddk::spin_range(0), kp.fv_states(), 0, nfv, hpsi[2], 0, nfv, h, 0, nfv); + wf::inner(ctx_.spla_context(), mem, sr, kp.fv_states(), br, hpsi[2], br, h, 0, nfv); if (kp.comm().size() == 1) { for (int i = 0; i < nfv; i++) { @@ -465,20 +445,10 @@ void Band::diag_full_potential_second_variation(Hamiltonian_k& Hk__) con h.add(i, i, kp.fv_eigen_value(i)); h.add(i + nfv, i + nfv, kp.fv_eigen_value(i)); } - //#ifdef __PRINT_OBJECT_CHECKSUM - //auto z1 = h.checksum(); - //DUMP("checksum(h): %18.10f %18.10f", std::real(z1), std::imag(z1)); - //#endif PROFILE("sirius::Band::diag_sv|stdevp"); std_solver.solve(nb, nb, h, &band_energies(0, 0), kp.sv_eigen_vectors(0)); } - if (ctx_.processing_unit() == sddk::device_t::GPU) { - kp.fv_states().deallocate(sddk::spin_range(0), sddk::memory_t::device); - for (int i = 0; i < ctx_.num_mag_comp(); i++) { - hpsi[i].deallocate(sddk::spin_range(0), sddk::memory_t::device); - } - } for (int ispn = 0; ispn < ctx_.num_spinors(); ispn++) { for (int j = 0; j < ctx_.num_bands(); j++) { kp.band_energy(j, ispn, band_energies(j, ispn)); diff --git a/src/band/diag_pseudo_potential.cpp b/src/band/diag_pseudo_potential.cpp index 3fe2a6ff6..6336ea2c2 100644 --- a/src/band/diag_pseudo_potential.cpp +++ b/src/band/diag_pseudo_potential.cpp @@ -41,9 +41,9 @@ extern "C" void compute_chebyshev_polynomial_gpu(int num_gkvec, namespace sirius { -template +template void -Band::diag_pseudo_potential_exact(int ispn__, Hamiltonian_k>& Hk__) const +Band::diag_pseudo_potential_exact(int ispn__, Hamiltonian_k& Hk__) const { PROFILE("sirius::Band::diag_pseudo_potential_exact"); @@ -54,10 +54,10 @@ Band::diag_pseudo_potential_exact(int ispn__, Hamiltonian_k>& Hk__) } const int bs = ctx_.cyclic_block_size(); - sddk::dmatrix hmlt(kp.num_gkvec(), kp.num_gkvec(), ctx_.blacs_grid(), bs, bs); - sddk::dmatrix ovlp(kp.num_gkvec(), kp.num_gkvec(), ctx_.blacs_grid(), bs, bs); - sddk::dmatrix evec(kp.num_gkvec(), kp.num_gkvec(), ctx_.blacs_grid(), bs, bs); - std::vector> eval(kp.num_gkvec()); + sddk::dmatrix hmlt(kp.num_gkvec(), kp.num_gkvec(), ctx_.blacs_grid(), bs, bs); + sddk::dmatrix ovlp(kp.num_gkvec(), kp.num_gkvec(), ctx_.blacs_grid(), bs, bs); + sddk::dmatrix evec(kp.num_gkvec(), kp.num_gkvec(), ctx_.blacs_grid(), bs, bs); + std::vector> eval(kp.num_gkvec()); hmlt.zero(); ovlp.zero(); @@ -109,49 +109,49 @@ Band::diag_pseudo_potential_exact(int ispn__, Hamiltonian_k>& Hk__) auto& Dop = Hk__.H0().D(); auto& Qop = Hk__.H0().Q(); - sddk::mdarray dop(ctx_.unit_cell().max_mt_basis_size(), ctx_.unit_cell().max_mt_basis_size()); - sddk::mdarray qop(ctx_.unit_cell().max_mt_basis_size(), ctx_.unit_cell().max_mt_basis_size()); + sddk::mdarray dop(ctx_.unit_cell().max_mt_basis_size(), ctx_.unit_cell().max_mt_basis_size()); + sddk::mdarray qop(ctx_.unit_cell().max_mt_basis_size(), ctx_.unit_cell().max_mt_basis_size()); - sddk::mdarray btmp(kp.num_gkvec_row(), ctx_.unit_cell().max_mt_basis_size()); + sddk::mdarray btmp(kp.num_gkvec_row(), ctx_.unit_cell().max_mt_basis_size()); kp.beta_projectors_row().prepare(); kp.beta_projectors_col().prepare(); for (int ichunk = 0; ichunk < kp.beta_projectors_row().num_chunks(); ichunk++) { /* generate beta-projectors for a block of atoms */ - kp.beta_projectors_row().generate(ichunk); - kp.beta_projectors_col().generate(ichunk); + kp.beta_projectors_row().generate(sddk::memory_t::host, ichunk); + kp.beta_projectors_col().generate(sddk::memory_t::host, ichunk); auto& beta_row = kp.beta_projectors_row().pw_coeffs_a(); auto& beta_col = kp.beta_projectors_col().pw_coeffs_a(); for (int i = 0; i < kp.beta_projectors_row().chunk(ichunk).num_atoms_; i++) { /* number of beta functions for a given atom */ - int nbf = kp.beta_projectors_row().chunk(ichunk).desc_(static_cast(beta_desc_idx::nbf), i); - int offs = kp.beta_projectors_row().chunk(ichunk).desc_(static_cast(beta_desc_idx::offset), i); - int ia = kp.beta_projectors_row().chunk(ichunk).desc_(static_cast(beta_desc_idx::ia), i); + int nbf = kp.beta_projectors_row().chunk(ichunk).desc_(beta_desc_idx::nbf, i); + int offs = kp.beta_projectors_row().chunk(ichunk).desc_(beta_desc_idx::offset, i); + int ia = kp.beta_projectors_row().chunk(ichunk).desc_(beta_desc_idx::ia, i); for (int xi1 = 0; xi1 < nbf; xi1++) { for (int xi2 = 0; xi2 < nbf; xi2++) { - dop(xi1, xi2) = Dop.template value(xi1, xi2, ispn__, ia); - qop(xi1, xi2) = Qop.template value(xi1, xi2, ispn__, ia); + dop(xi1, xi2) = Dop.template value(xi1, xi2, ispn__, ia); + qop(xi1, xi2) = Qop.template value(xi1, xi2, ispn__, ia); } } /* compute D */ sddk::linalg(sddk::linalg_t::blas).gemm('N', 'N', kp.num_gkvec_row(), nbf, nbf, - &sddk::linalg_const::one(), &beta_row(0, offs), beta_row.ld(), &dop(0, 0), dop.ld(), - &sddk::linalg_const::zero(), &btmp(0, 0), btmp.ld()); + &sddk::linalg_const::one(), &beta_row(0, offs), beta_row.ld(), &dop(0, 0), dop.ld(), + &sddk::linalg_const::zero(), &btmp(0, 0), btmp.ld()); /* compute ( D ) */ sddk::linalg(sddk::linalg_t::blas).gemm('N', 'C', kp.num_gkvec_row(), kp.num_gkvec_col(), nbf, - &sddk::linalg_const::one(), &btmp(0, 0), btmp.ld(), &beta_col(0, offs), beta_col.ld(), - &sddk::linalg_const::one(), &hmlt(0, 0), hmlt.ld()); + &sddk::linalg_const::one(), &btmp(0, 0), btmp.ld(), &beta_col(0, offs), beta_col.ld(), + &sddk::linalg_const::one(), &hmlt(0, 0), hmlt.ld()); /* update the overlap matrix */ if (ctx_.unit_cell().atom(ia).type().augment()) { sddk::linalg(sddk::linalg_t::blas).gemm('N', 'N', kp.num_gkvec_row(), nbf, nbf, - &sddk::linalg_const::one(), &beta_row(0, offs), beta_row.ld(), &qop(0, 0), qop.ld(), - &sddk::linalg_const::zero(), &btmp(0, 0), btmp.ld()); + &sddk::linalg_const::one(), &beta_row(0, offs), beta_row.ld(), &qop(0, 0), qop.ld(), + &sddk::linalg_const::zero(), &btmp(0, 0), btmp.ld()); sddk::linalg(sddk::linalg_t::blas).gemm('N', 'C', kp.num_gkvec_row(), kp.num_gkvec_col(), nbf, - &sddk::linalg_const::one(), &btmp(0, 0), btmp.ld(), &beta_col(0, offs), beta_col.ld(), - &sddk::linalg_const::one(), &ovlp(0, 0), ovlp.ld()); + &sddk::linalg_const::one(), &btmp(0, 0), btmp.ld(), &beta_col(0, offs), beta_col.ld(), + &sddk::linalg_const::one(), &ovlp(0, 0), ovlp.ld()); } } // i (atoms in chunk) } @@ -175,14 +175,14 @@ Band::diag_pseudo_potential_exact(int ispn__, Hamiltonian_k>& Hk__) if (ctx_.cfg().control().verification() >= 2) { ctx_.message(1, __function_name__, "%s", "checking eigen-values of S-matrix\n"); - sddk::dmatrix ovlp1(kp.num_gkvec(), kp.num_gkvec(), ctx_.blacs_grid(), bs, bs); - sddk::dmatrix evec(kp.num_gkvec(), kp.num_gkvec(), ctx_.blacs_grid(), bs, bs); + sddk::dmatrix ovlp1(kp.num_gkvec(), kp.num_gkvec(), ctx_.blacs_grid(), bs, bs); + sddk::dmatrix evec(kp.num_gkvec(), kp.num_gkvec(), ctx_.blacs_grid(), bs, bs); ovlp >> ovlp1; - std::vector> eo(kp.num_gkvec()); + std::vector> eo(kp.num_gkvec()); - auto solver = Eigensolver_factory("scalapack", nullptr); + auto solver = Eigensolver_factory("scalapack"); solver->solve(kp.num_gkvec(), ovlp1, eo.data(), evec); for (int i = 0; i < kp.num_gkvec(); i++) { @@ -195,14 +195,18 @@ Band::diag_pseudo_potential_exact(int ispn__, Hamiltonian_k>& Hk__) if (gen_solver.solve(kp.num_gkvec(), ctx_.num_bands(), hmlt, ovlp, eval.data(), evec)) { std::stringstream s; s << "error in full diagonalization"; - TERMINATE(s); + RTE_THROW(s); } for (int j = 0; j < ctx_.num_bands(); j++) { kp.band_energy(j, ispn__, eval[j]); } - kp.spinor_wave_functions().pw_coeffs(ispn__).remap_from(evec, 0); + auto layout_in = evec.grid_layout(0, 0, kp.num_gkvec(), ctx_.num_bands()); + auto layout_out = kp.spinor_wave_functions().grid_layout_pw(wf::spin_index(ispn__), wf::band_range(0, ctx_.num_bands())); + + costa::transform(layout_in, layout_out, 'N', sddk::linalg_const>::one(), + sddk::linalg_const>::zero(), kp.gkvec().comm().mpi_comm()); } template @@ -211,71 +215,73 @@ Band::diag_S_davidson(Hamiltonian_k>& Hk__) const { PROFILE("sirius::Band::diag_S_davidson"); - auto& kp = Hk__.kp(); - - auto& itso = ctx_.cfg().iterative_solver(); - - /* for overlap matrix we do non-magnetic or non-collinear diagonalization */ - const int num_mag_dims = (ctx_.num_mag_dims() == 3) ? 3 : 0; - - /* number of spin components, treated simultaneously - * 1 - in case of non-magnetic - * 2 - in case of non-collinear calculation - */ - const int num_sc = (num_mag_dims == 3) ? 2 : 1; + RTE_THROW("implement this"); +// auto& kp = Hk__.kp(); +// +// auto& itso = ctx_.cfg().iterative_solver(); +// +// /* for overlap matrix we do non-magnetic or non-collinear diagonalization */ +// const int num_mag_dims = (ctx_.num_mag_dims() == 3) ? 3 : 0; +// +// /* number of spin components, treated simultaneously +// * 1 - in case of non-magnetic +// * 2 - in case of non-collinear calculation +// */ +// const int num_sc = (num_mag_dims == 3) ? 2 : 1; +// /* number of eigen-vectors to find */ const int nevec{1}; - - /* alias for memory pool */ - auto& mp = ctx_.mem_pool(ctx_.host_memory_t()); - - /* eigen-vectors */ - sddk::Wave_functions> psi(mp, kp.gkvec_partition(), nevec, ctx_.aux_preferred_memory_t(), num_sc); - for (int i = 0; i < nevec; i++) { - for (int ispn = 0; ispn < num_sc; ispn++) { - for (int igk_loc = 0; igk_loc < kp.num_gkvec_loc(); igk_loc++) { - /* global index of G+k vector */ - int igk = kp.idxgk(igk_loc); - if (igk == i + 1) { - psi.pw_coeffs(ispn).prime(igk_loc, i) = 1.0; - } - if (igk == i + 2) { - psi.pw_coeffs(ispn).prime(igk_loc, i) = 0.5; - } - if (igk == i + 3) { - psi.pw_coeffs(ispn).prime(igk_loc, i) = 0.25; - } - if (igk == i + 4) { - psi.pw_coeffs(ispn).prime(igk_loc, i) = 0.125; - } - } - } - } - std::vector tmp(4096); - for (int i = 0; i < 4096; i++) { - tmp[i] = utils::random(); - } - #pragma omp parallel for schedule(static) - for (int i = 0; i < nevec; i++) { - for (int ispn = 0; ispn < num_sc; ispn++) { - for (int igk_loc = kp.gkvec().skip_g0(); igk_loc < kp.num_gkvec_loc(); igk_loc++) { - /* global index of G+k vector */ - int igk = kp.idxgk(igk_loc); - psi.pw_coeffs(ispn).prime(igk_loc, i) += tmp[igk & 0xFFF] * 1e-5; - } - } - } - - auto result = davidson(Hk__, nevec, num_mag_dims, psi, - [](int i, int ispn){ return 1e-10; }, itso.residual_tolerance(), itso.num_steps(), itso.locking(), - 10, itso.converge_by_energy(), itso.extra_ortho(), std::cout, 0); - +// +// /* alias for memory pool */ +// auto& mp = ctx_.mem_pool(ctx_.host_memory_t()); +// +// /* eigen-vectors */ +// sddk::Wave_functions> psi(mp, kp.gkvec_partition(), nevec, ctx_.aux_preferred_memory_t(), num_sc); +// for (int i = 0; i < nevec; i++) { +// for (int ispn = 0; ispn < num_sc; ispn++) { +// for (int igk_loc = 0; igk_loc < kp.num_gkvec_loc(); igk_loc++) { +// /* global index of G+k vector */ +// int igk = kp.idxgk(igk_loc); +// if (igk == i + 1) { +// psi.pw_coeffs(ispn).prime(igk_loc, i) = 1.0; +// } +// if (igk == i + 2) { +// psi.pw_coeffs(ispn).prime(igk_loc, i) = 0.5; +// } +// if (igk == i + 3) { +// psi.pw_coeffs(ispn).prime(igk_loc, i) = 0.25; +// } +// if (igk == i + 4) { +// psi.pw_coeffs(ispn).prime(igk_loc, i) = 0.125; +// } +// } +// } +// } +// std::vector tmp(4096); +// for (int i = 0; i < 4096; i++) { +// tmp[i] = utils::random(); +// } +// #pragma omp parallel for schedule(static) +// for (int i = 0; i < nevec; i++) { +// for (int ispn = 0; ispn < num_sc; ispn++) { +// for (int igk_loc = kp.gkvec().skip_g0(); igk_loc < kp.num_gkvec_loc(); igk_loc++) { +// /* global index of G+k vector */ +// int igk = kp.idxgk(igk_loc); +// psi.pw_coeffs(ispn).prime(igk_loc, i) += tmp[igk & 0xFFF] * 1e-5; +// } +// } +// } +// +// auto result = davidson(Hk__, nevec, num_mag_dims, psi, +// [](int i, int ispn){ return 1e-10; }, itso.residual_tolerance(), itso.num_steps(), itso.locking(), +// 10, itso.converge_by_energy(), itso.extra_ortho(), std::cout, 0); +// sddk::mdarray, 1> eval(nevec); - for (int i = 0; i < nevec; i++) { - eval(i) = result.eval(i, 0); - } - +// for (int i = 0; i < nevec; i++) { +// eval(i) = result.eval(i, 0); +// } +// return eval; } @@ -289,11 +295,11 @@ Band::diag_S_davidson>(Hamiltonian_k& Hk__) const; template void -Band::diag_pseudo_potential_exact>(int ispn__, Hamiltonian_k& Hk__) const; +Band::diag_pseudo_potential_exact>(int ispn__, Hamiltonian_k& Hk__) const; template<> void -Band::diag_pseudo_potential_exact(int ispn__, Hamiltonian_k& Hk__) const +Band::diag_pseudo_potential_exact(int ispn__, Hamiltonian_k& Hk__) const { RTE_THROW("not implemented"); } @@ -309,11 +315,23 @@ Band::diag_S_davidson>(Hamiltonian_k& Hk__) const; template void -Band::diag_pseudo_potential_exact>(int ispn__, Hamiltonian_k& Hk__) const; +Band::diag_pseudo_potential_exact>(int ispn__, Hamiltonian_k& Hk__) const; template<> void -Band::diag_pseudo_potential_exact(int ispn__, Hamiltonian_k& Hk__) const +Band::diag_pseudo_potential_exact(int ispn__, Hamiltonian_k& Hk__) const +{ + RTE_THROW("not implemented"); +} +template<> +void +Band::diag_pseudo_potential_exact(int ispn__, Hamiltonian_k& Hk__) const +{ + RTE_THROW("not implemented"); +} +template<> +void +Band::diag_pseudo_potential_exact>(int ispn__, Hamiltonian_k& Hk__) const { RTE_THROW("not implemented"); } diff --git a/src/band/residuals.cpp b/src/band/residuals.cpp deleted file mode 100644 index b76a931b9..000000000 --- a/src/band/residuals.cpp +++ /dev/null @@ -1,402 +0,0 @@ -// Copyright (c) 2013-2019 Anton Kozhevnikov, Thomas Schulthess -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, are permitted provided that -// the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the -// following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions -// and the following disclaimer in the documentation and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -/** \file residuals.cpp - * - * \brief Compute residuals from the eigen-vectors and basis functions. - */ - -#include "residuals.hpp" -#include "wave_functions.hpp" -#include "wf_inner.hpp" -#include "wf_ortho.hpp" -#include "wf_trans.hpp" - -#include - -namespace sirius { - -#if defined(SIRIUS_GPU) -void compute_residuals_gpu(double_complex* hpsi__, double_complex* opsi__, double_complex* res__, - int num_gvec_loc__, int num_bands__, double* eval__) -{ - compute_residuals_gpu_double(hpsi__, opsi__, res__, num_gvec_loc__, num_bands__, eval__); -} - -void compute_residuals_gpu(std::complex* hpsi__, std::complex* opsi__, std::complex* res__, - int num_gvec_loc__, int num_bands__, float* eval__) -{ - compute_residuals_gpu_float(hpsi__, opsi__, res__, num_gvec_loc__, num_bands__, eval__); -} - -void apply_preconditioner_gpu(double_complex* res__, int num_rows_loc__, int num_bands__, - double* eval__, const double* h_diag__, const double* o_diag__) -{ - apply_preconditioner_gpu_double(res__, num_rows_loc__, num_bands__, eval__, h_diag__, o_diag__); -} - -void apply_preconditioner_gpu(std::complex* res__, int num_rows_loc__, int num_bands__, - float* eval__, const float* h_diag__, const float* o_diag__) -{ - apply_preconditioner_gpu_float(res__, num_rows_loc__, num_bands__, eval__, h_diag__, o_diag__); -} - -void make_real_g0_gpu(double_complex* res__, int ld__, int n__) -{ - make_real_g0_gpu_double(res__, ld__, n__); -} - -void make_real_g0_gpu(std::complex* res__, int ld__, int n__) -{ - make_real_g0_gpu_float(res__, ld__, n__); -} -#endif - -template ::value>> -static void -compute_residuals(sddk::memory_t mem_type__, sddk::spin_range spins__, int num_bands__, sddk::mdarray& eval__, - sddk::Wave_functions& hpsi__, sddk::Wave_functions& opsi__, sddk::Wave_functions& res__) -{ - for (int ispn: spins__) { - if (is_host_memory(mem_type__)) { - /* compute residuals r_{i} = H\Psi_{i} - E_{i}O\Psi_{i} */ - #pragma omp parallel for - for (int i = 0; i < num_bands__; i++) { - for (int ig = 0; ig < res__.pw_coeffs(ispn).num_rows_loc(); ig++) { - res__.pw_coeffs(ispn).prime(ig, i) = hpsi__.pw_coeffs(ispn).prime(ig, i) - - eval__[i] * opsi__.pw_coeffs(ispn).prime(ig, i); - } - if (res__.has_mt()) { - for (int j = 0; j < res__.mt_coeffs(ispn).num_rows_loc(); j++) { - res__.mt_coeffs(ispn).prime(j, i) = hpsi__.mt_coeffs(ispn).prime(j, i) - - eval__[i] * opsi__.mt_coeffs(ispn).prime(j, i); - } - } - } - } else { -#if defined(SIRIUS_GPU) - compute_residuals_gpu(hpsi__.pw_coeffs(ispn).prime().at(sddk::memory_t::device), - opsi__.pw_coeffs(ispn).prime().at(sddk::memory_t::device), - res__.pw_coeffs(ispn).prime().at(sddk::memory_t::device), - res__.pw_coeffs(ispn).num_rows_loc(), - num_bands__, - eval__.at(sddk::memory_t::device)); - if (res__.has_mt()) { - compute_residuals_gpu(hpsi__.mt_coeffs(ispn).prime().at(sddk::memory_t::device), - opsi__.mt_coeffs(ispn).prime().at(sddk::memory_t::device), - res__.mt_coeffs(ispn).prime().at(sddk::memory_t::device), - res__.mt_coeffs(ispn).num_rows_loc(), - num_bands__, - eval__.at(sddk::memory_t::device)); - } -#endif - } - } -} - -/// Apply preconditioner to the residuals. -template -void -apply_preconditioner(sddk::memory_t mem_type__, sddk::spin_range spins__, int num_bands__, sddk::Wave_functions& res__, - sddk::mdarray const& h_diag__, sddk::mdarray const& o_diag__, - sddk::mdarray& eval__) -{ - for (int ispn: spins__) { - if (is_host_memory(mem_type__)) { - #pragma omp parallel for schedule(static) - for (int i = 0; i < num_bands__; i++) { - for (int ig = 0; ig < res__.pw_coeffs(ispn).num_rows_loc(); ig++) { - T p = h_diag__(ig, ispn) - o_diag__(ig, ispn) * eval__[i]; - p = 0.5 * (1 + p + std::sqrt(1 + (p - 1) * (p - 1))); - res__.pw_coeffs(ispn).prime(ig, i) /= p; - } - if (res__.has_mt()) { - for (int j = 0; j < res__.mt_coeffs(ispn).num_rows_loc(); j++) { - T p = h_diag__(res__.pw_coeffs(ispn).num_rows_loc() + j, ispn) - - o_diag__(res__.pw_coeffs(ispn).num_rows_loc() + j, ispn) * eval__[i]; - p = 0.5 * (1 + p + std::sqrt(1 + (p - 1) * (p - 1))); - res__.mt_coeffs(ispn).prime(j, i) /= p; - } - } - } - } else { -#if defined(SIRIUS_GPU) - apply_preconditioner_gpu(res__.pw_coeffs(ispn).prime().at(sddk::memory_t::device), - res__.pw_coeffs(ispn).num_rows_loc(), - num_bands__, - eval__.at(sddk::memory_t::device), - h_diag__.at(sddk::memory_t::device, 0, ispn), - o_diag__.at(sddk::memory_t::device, 0, ispn)); - if (res__.has_mt()) { - apply_preconditioner_gpu(res__.mt_coeffs(ispn).prime().at(sddk::memory_t::device), - res__.mt_coeffs(ispn).num_rows_loc(), - num_bands__, - eval__.at(sddk::memory_t::device), - h_diag__.at(sddk::memory_t::device, res__.pw_coeffs(ispn).num_rows_loc(), ispn), - o_diag__.at(sddk::memory_t::device, res__.pw_coeffs(ispn).num_rows_loc(), ispn)); - } -#endif - } - } -} - -template -static int -normalized_preconditioned_residuals(sddk::memory_t mem_type__, sddk::spin_range spins__, int num_bands__, - sddk::mdarray,1>& eval__, sddk::Wave_functions>& hpsi__, - sddk::Wave_functions>& opsi__, sddk::Wave_functions>& res__, - sddk::mdarray, 2> const& h_diag__, sddk::mdarray, 2> const& o_diag__, - real_type norm_tolerance__, sddk::mdarray, 1>& residual_norms__) -{ - PROFILE("sirius::normalized_preconditioned_residuals"); - - assert(num_bands__ != 0); - - auto pu = get_device_t(mem_type__); - - /* compute "raw" residuals */ - compute_residuals>(mem_type__, spins__, num_bands__, eval__, hpsi__, opsi__, res__); - - /* compute norm of the "raw" residuals */ - residual_norms__ = res__.l2norm(pu, spins__, num_bands__); - - /* apply preconditioner */ - apply_preconditioner>(mem_type__, spins__, num_bands__, res__, h_diag__, o_diag__, eval__); - - /* this not strictly necessary as the wave-function orthoronormalization can take care of this; - however, normalization of residuals is harmless and gives a better numerical stability */ - res__.normalize(pu, spins__, num_bands__); - - int num_unconverged{0}; - - for (int i = 0; i < num_bands__; i++) { - /* take the residual if it's norm is above the threshold */ - if (residual_norms__[i] > norm_tolerance__) { - /* shift unconverged residuals to the beginning of array */ - /* note: we can just keep them where they were */ - if (num_unconverged != i) { - for (int ispn: spins__) { - res__.copy_from(res__, 1, ispn, i, ispn, num_unconverged); - } - } - num_unconverged++; - } - } - - /* prevent numerical noise */ - /* this only happens for real wave-functions (Gamma-point case), non-magnetic or collinear magnetic */ - if (std::is_same>::value && res__.comm().rank() == 0 && num_unconverged != 0 && spins__() != 2) { - if (is_device_memory(res__.preferred_memory_t())) { -#if defined(SIRIUS_GPU) - make_real_g0_gpu(res__.pw_coeffs(spins__()).prime().at(sddk::memory_t::device), - res__.pw_coeffs(spins__()).prime().ld(), num_unconverged); -#endif - } else { - for (int i = 0; i < num_unconverged; i++) { - res__.pw_coeffs(spins__()).prime(0, i) = res__.pw_coeffs(spins__()).prime(0, i).real(); - } - } - } - - return num_unconverged; -} - -/// Compute residuals from eigen-vectors. -template -residual_result -residuals(Simulation_context& ctx__, sddk::memory_t mem_type__, sddk::linalg_t la_type__, sddk::spin_range ispn__, - int N__, int num_bands__, int num_locked, sddk::mdarray, 1>& eval__, sddk::dmatrix& evec__, - sddk::Wave_functions>& hphi__, sddk::Wave_functions>& ophi__, - sddk::Wave_functions>& hpsi__, sddk::Wave_functions>& opsi__, - sddk::Wave_functions>& res__, sddk::mdarray, 2> const& h_diag__, - sddk::mdarray, 2> const& o_diag__, bool estimate_eval__, real_type norm_tolerance__, - std::function is_converged__) -{ - PROFILE("sirius::residuals"); - - assert(N__ != 0); - - sddk::mdarray, 1> res_norm; - sddk::dmatrix evec_tmp; - - sddk::mdarray, 1> eval(num_bands__); - eval = [&](size_t j) -> real_type { return eval__[j]; }; - - sddk::dmatrix* evec_ptr{nullptr}; - - /* total number of residuals to be computed */ - int num_residuals{0}; - - /* number of lockable eigenvectors */ - int num_consecutive_converged{0}; - - /* number of residuals that do not meet any convergence criterion */ - int num_unconverged{0}; - - int ispn = (ispn__() == 2) ? 0 : ispn__(); - - // When estimate_eval is set we only compute true residuals of unconverged eigenpairs - // where convergence is determined just on the change in the eigenvalues. - if (estimate_eval__) { - // Locking is only based on the is_converged__ criterion, not on the actual - // residual norms. We could lock more by considering the residual norm criterion - // later, but since we're reordering eigenvectors too, this becomes messy. - while (num_consecutive_converged < num_bands__ && is_converged__(num_consecutive_converged, ispn)) { - ++num_consecutive_converged; - } - - // Collect indices of unconverged eigenpairs. - std::vector ev_idx; - for (int j = 0; j < num_bands__; j++) { - if (!is_converged__(j, ispn)) { - ev_idx.push_back(j); - } - } - - // If everything is converged, return early. - if (ev_idx.empty()) { - return residual_result{num_bands__, 0, 0}; - } - - // Otherwise copy / reorder the unconverged eigenpairs - num_residuals = static_cast(ev_idx.size()); - - evec_tmp = sddk::dmatrix(N__, num_residuals, evec__.blacs_grid(), evec__.bs_row(), evec__.bs_col()); - evec_ptr = &evec_tmp; - - int num_rows_local = evec_tmp.num_rows_local(); - for (int j = 0; j < num_residuals; j++) { - eval[j] = eval[ev_idx[j]]; - if (evec__.blacs_grid().comm().size() == 1) { - /* do a local copy */ - std::copy(&evec__(0, ev_idx[j]), &evec__(0, ev_idx[j]) + num_rows_local, &evec_tmp(0, j)); - } else { - auto pos_src = evec__.spl_col().location(ev_idx[j]); - auto pos_dest = evec_tmp.spl_col().location(j); - /* do MPI send / receive */ - if (pos_src.rank == evec__.blacs_grid().comm_col().rank() && num_rows_local) { - evec__.blacs_grid().comm_col().isend(&evec__(0, pos_src.local_index), num_rows_local, pos_dest.rank, ev_idx[j]); - } - if (pos_dest.rank == evec__.blacs_grid().comm_col().rank() && num_rows_local) { - evec__.blacs_grid().comm_col().recv(&evec_tmp(0, pos_dest.local_index), num_rows_local, pos_src.rank, ev_idx[j]); - } - } - } - if (is_device_memory(mem_type__) && evec_tmp.blacs_grid().comm().size() == 1) { - evec_tmp.allocate(sddk::memory_t::device); - } - } else { - evec_ptr = &evec__; - num_residuals = num_bands__; - } - if (is_device_memory(mem_type__)) { - eval.allocate(sddk::memory_t::device).copy_to(sddk::memory_t::device); - } - - /* compute H\Psi_{i} = \sum_{mu} H\phi_{mu} * Z_{mu, i} and O\Psi_{i} = \sum_{mu} O\phi_{mu} * Z_{mu, i} */ - sddk::transform(ctx__.spla_context(), ispn__(), {&hphi__, &ophi__}, num_locked, N__ - num_locked, - *evec_ptr, 0, 0, {&hpsi__, &opsi__}, 0, num_residuals); - - num_unconverged = normalized_preconditioned_residuals(mem_type__, ispn__, num_residuals, eval, hpsi__, opsi__, - res__, h_diag__, o_diag__, norm_tolerance__, res_norm); - - // In case we're not using the delta in eigenvalues as a convergence criterion, - // we lock eigenpairs using residual norms. - if (!estimate_eval__) { - while (num_consecutive_converged < num_residuals && res_norm[num_consecutive_converged] <= norm_tolerance__) { - ++num_consecutive_converged; - } - } - - auto frobenius_norm = 0.0; - for (int i = 0; i < num_residuals; i++) { - frobenius_norm += res_norm[i] * res_norm[i]; - } - frobenius_norm = std::sqrt(frobenius_norm); - return { - num_consecutive_converged, - num_unconverged, - frobenius_norm - }; -} - -template residual_result -residuals(Simulation_context& ctx__, sddk::memory_t mem_type__, sddk::linalg_t la_type__, - sddk::spin_range ispn__, int N__, - int num_bands__, int num_locked, sddk::mdarray& eval__, sddk::dmatrix& evec__, - sddk::Wave_functions& hphi__, sddk::Wave_functions& ophi__, sddk::Wave_functions& hpsi__, - sddk::Wave_functions& opsi__, sddk::Wave_functions& res__, sddk::mdarray const& h_diag__, - sddk::mdarray const& o_diag__, bool estimate_eval__, double norm_tolerance__, - std::function is_converged__); - -template residual_result -residuals(Simulation_context& ctx__, sddk::memory_t mem_type__, sddk::linalg_t la_type__, - sddk::spin_range ispn__, - int N__, int num_bands__, int num_locked, sddk::mdarray& eval__, - sddk::dmatrix& evec__, sddk::Wave_functions& hphi__, - sddk::Wave_functions& ophi__, sddk::Wave_functions& hpsi__, sddk::Wave_functions& opsi__, - sddk::Wave_functions& res__, sddk::mdarray const& h_diag__, - sddk::mdarray const& o_diag__, bool estimate_eval__, double norm_tolerance__, - std::function is_converged__); - -template void -apply_preconditioner(sddk::memory_t mem_type__, sddk::spin_range spins__, int num_bands__, sddk::Wave_functions& res__, - sddk::mdarray const& h_diag__, sddk::mdarray const& o_diag__, - sddk::mdarray& eval__); - -#if defined(USE_FP32) -template residual_result -residuals(Simulation_context& ctx__, sddk::memory_t mem_type__, sddk::linalg_t la_type__, - sddk::spin_range ispn__, int N__, - int num_bands__, int num_locked, sddk::mdarray& eval__, sddk::dmatrix& evec__, - sddk::Wave_functions& hphi__, sddk::Wave_functions& ophi__, sddk::Wave_functions& hpsi__, - sddk::Wave_functions& opsi__, sddk::Wave_functions& res__, sddk::mdarray const& h_diag__, - sddk::mdarray const& o_diag__, bool estimate_eval__, float norm_tolerance__, - std::function is_converged__); - -template residual_result -residuals(Simulation_context& ctx__, sddk::memory_t mem_type__, sddk::linalg_t la_type__, - sddk::spin_range ispn__, int N__, - int num_bands__, int num_locked, sddk::mdarray& eval__, sddk::dmatrix& evec__, - sddk::Wave_functions& hphi__, sddk::Wave_functions& ophi__, sddk::Wave_functions& hpsi__, - sddk::Wave_functions& opsi__, sddk::Wave_functions& res__, sddk::mdarray const& h_diag__, - sddk::mdarray const& o_diag__, bool estimate_eval__, float norm_tolerance__, - std::function is_converged__); - -template residual_result -residuals, std::complex>(Simulation_context& ctx__, sddk::memory_t mem_type__, sddk::linalg_t la_type__, - sddk::spin_range ispn__, - int N__, int num_bands__, int num_locked, sddk::mdarray& eval__, - sddk::dmatrix>& evec__, sddk::Wave_functions& hphi__, - sddk::Wave_functions& ophi__, sddk::Wave_functions& hpsi__, sddk::Wave_functions& opsi__, - sddk::Wave_functions& res__, sddk::mdarray const& h_diag__, - sddk::mdarray const& o_diag__, bool estimate_eval__, float norm_tolerance__, - std::function is_converged__); - -template residual_result -residuals, std::complex>(Simulation_context& ctx__, sddk::memory_t mem_type__, sddk::linalg_t la_type__, - sddk::spin_range ispn__, - int N__, int num_bands__, int num_locked, sddk::mdarray& eval__, - sddk::dmatrix>& evec__, sddk::Wave_functions& hphi__, - sddk::Wave_functions& ophi__, sddk::Wave_functions& hpsi__, sddk::Wave_functions& opsi__, - sddk::Wave_functions& res__, sddk::mdarray const& h_diag__, - sddk::mdarray const& o_diag__, bool estimate_eval__, float norm_tolerance__, - std::function is_converged__); -#endif -} // namespace diff --git a/src/band/residuals.hpp b/src/band/residuals.hpp index fdee03ca8..58860dcf9 100644 --- a/src/band/residuals.hpp +++ b/src/band/residuals.hpp @@ -30,69 +30,95 @@ #include "linalg/linalg.hpp" #include "context/simulation_context.hpp" #include "SDDK/type_definition.hpp" +#include "SDDK/wave_functions.hpp" -namespace sddk { -template -class Wave_functions; -class spin_range; -}; +//namespace sddk { +//template +//class Wave_functions; +//class spin_range; +//}; -struct residual_result { +struct residual_result +{ int num_consecutive_smallest_converged; int unconverged_residuals; double frobenius_norm; }; +template +struct normalized_preconditioned_residuals_result +{ + int num_unconverged; + std::vector norm; +}; + #if defined(SIRIUS_GPU) -extern "C" void residuals_aux_gpu(int num_gvec_loc__, - int num_res_local__, - int* res_idx__, - double* eval__, - double_complex const* hpsi__, - double_complex const* opsi__, - double const* h_diag__, - double const* o_diag__, - double_complex* res__, - double* res_norm__, - double* p_norm__, - int gkvec_reduced__, - int mpi_rank__); - -extern "C" void compute_residuals_gpu_double(double_complex* hpsi__, - double_complex* opsi__, - double_complex* res__, - int num_gvec_loc__, - int num_bands__, - double* eval__); - -extern "C" void compute_residuals_gpu_float(std::complex* hpsi__, - std::complex* opsi__, - std::complex* res__, - int num_gvec_loc__, - int num_bands__, - float* eval__); - -extern "C" void apply_preconditioner_gpu_double(double_complex* res__, - int num_rows_loc__, - int num_bands__, - double* eval__, - const double* h_diag__, - const double* o_diag__); - -extern "C" void apply_preconditioner_gpu_float(std::complex* res__, - int num_rows_loc__, - int num_bands__, - float* eval__, - const float* h_diag__, - const float* o_diag__); - -extern "C" void make_real_g0_gpu_double(double_complex* res__, - int ld__, - int n__); - -extern "C" void make_real_g0_gpu_float(std::complex* res__, - int ld__, - int n__); +//extern "C" void residuals_aux_gpu(int num_gvec_loc__, +// int num_res_local__, +// int* res_idx__, +// double* eval__, +// double_complex const* hpsi__, +// double_complex const* opsi__, +// double const* h_diag__, +// double const* o_diag__, +// double_complex* res__, +// double* res_norm__, +// double* p_norm__, +// int gkvec_reduced__, +// int mpi_rank__); +// +extern "C" { + +void compute_residuals_gpu_double(double_complex const* hpsi__, double_complex const* opsi__, double_complex* res__, + int num_gvec_loc__, int num_bands__, double const* eval__); + +void compute_residuals_gpu_float(std::complex const* hpsi__, std::complex const* opsi__, + std::complex* res__, int num_gvec_loc__, int num_bands__, float const* eval__); + +void apply_preconditioner_gpu_double(double_complex* res__, int num_rows_loc__, int num_bands__, double const* eval__, + const double* h_diag__, const double* o_diag__); + +void apply_preconditioner_gpu_float(std::complex* res__, int num_rows_loc__, int num_bands__, float const* eval__, + const float* h_diag__, const float* o_diag__); + +void make_real_g0_gpu_double(double_complex* res__, int ld__, int n__); + +void make_real_g0_gpu_float(std::complex* res__, int ld__, int n__); +} + +inline void compute_residuals_gpu(double_complex const* hpsi__, double_complex const* opsi__, double_complex* res__, + int num_gvec_loc__, int num_bands__, double const* eval__) +{ + compute_residuals_gpu_double(hpsi__, opsi__, res__, num_gvec_loc__, num_bands__, eval__); +} + +inline void compute_residuals_gpu(std::complex const* hpsi__, std::complex const* opsi__, std::complex* res__, + int num_gvec_loc__, int num_bands__, float const* eval__) +{ + compute_residuals_gpu_float(hpsi__, opsi__, res__, num_gvec_loc__, num_bands__, eval__); +} + +inline void apply_preconditioner_gpu(std::complex* res__, int num_rows_loc__, int num_bands__, + double const* eval__, double const* h_diag__, double const* o_diag__) +{ + apply_preconditioner_gpu_double(res__, num_rows_loc__, num_bands__, eval__, h_diag__, o_diag__); +} + +inline void apply_preconditioner_gpu(std::complex* res__, int num_rows_loc__, int num_bands__, + float const* eval__, const float* h_diag__, const float* o_diag__) +{ + apply_preconditioner_gpu_float(res__, num_rows_loc__, num_bands__, eval__, h_diag__, o_diag__); +} + +inline void make_real_g0_gpu(double_complex* res__, int ld__, int n__) +{ + make_real_g0_gpu_double(res__, ld__, n__); +} + +inline void make_real_g0_gpu(std::complex* res__, int ld__, int n__) +{ + make_real_g0_gpu_float(res__, ld__, n__); +} #endif namespace sirius { @@ -103,21 +129,302 @@ namespace sirius { R_{i} = \hat H \psi_{i} - \epsilon_{i} \hat S \psi_{i} \f] */ -template -residual_result -residuals(Simulation_context& ctx__, sddk::memory_t mem_type__, sddk::linalg_t la_type__, sddk::spin_range ispn__, - int N__, int num_bands__, int num_locked, sddk::mdarray, 1>& eval__, - sddk::dmatrix& evec__, sddk::Wave_functions>& hphi__, sddk::Wave_functions>& ophi__, - sddk::Wave_functions>& hpsi__, sddk::Wave_functions>& opsi__, - sddk::Wave_functions>& res__, sddk::mdarray, 2> const& h_diag__, - sddk::mdarray, 2> const& o_diag__, bool estimate_eval__, real_type norm_tolerance__, - std::function is_converged__); +//template +//residual_result +//residuals(Simulation_context& ctx__, sddk::memory_t mem_type__, sddk::spin_range ispn__, +// int N__, int num_bands__, int num_locked, sddk::mdarray, 1>& eval__, +// sddk::dmatrix& evec__, sddk::Wave_functions>& hphi__, sddk::Wave_functions>& ophi__, +// sddk::Wave_functions>& hpsi__, sddk::Wave_functions>& opsi__, +// sddk::Wave_functions>& res__, sddk::mdarray, 2> const& h_diag__, +// sddk::mdarray, 2> const& o_diag__, bool estimate_eval__, real_type norm_tolerance__, +// std::function is_converged__); +// +//template +//void +//apply_preconditioner(sddk::memory_t mem_type__, sddk::spin_range spins__, int num_bands__, sddk::Wave_functions& res__, +// sddk::mdarray const& h_diag__, sddk::mdarray const& o_diag__, +// sddk::mdarray& eval__); +// +/// Compute band residuals. +/** + * + * \tparam T Precision type of the wave-functions (float or double). + * + * + */ +template +static void +compute_residuals(sddk::memory_t mem__, wf::spin_range spins__, wf::num_bands num_bands__, + sddk::mdarray const& eval__, wf::Wave_functions const& hpsi__, wf::Wave_functions const& opsi__, + wf::Wave_functions& res__) +{ + RTE_ASSERT(hpsi__.ld() == opsi__.ld()); + RTE_ASSERT(hpsi__.ld() == res__.ld()); + RTE_ASSERT(hpsi__.num_md() == opsi__.num_md()); + RTE_ASSERT(hpsi__.num_md() == res__.num_md()); + + for (auto s = spins__.begin(); s != spins__.end(); s++) { + auto sp = hpsi__.actual_spin_index(s); + if (is_host_memory(mem__)) { + /* compute residuals r_{i} = H\Psi_{i} - E_{i}O\Psi_{i} */ + #pragma omp parallel for + for (int i = 0; i < num_bands__.get(); i++) { + auto hpsi_ptr = hpsi__.at(mem__, 0, sp, wf::band_index(i)); + auto opsi_ptr = opsi__.at(mem__, 0, sp, wf::band_index(i)); + auto res_ptr = res__.at(mem__, 0, sp, wf::band_index(i)); + + for (int j = 0; j < hpsi__.ld(); j++) { + res_ptr[j] = hpsi_ptr[j] - eval__[i] * opsi_ptr[j]; + } + } + } else { +#if defined(SIRIUS_GPU) + auto hpsi_ptr = hpsi__.at(mem__, 0, sp, wf::band_index(0)); + auto opsi_ptr = opsi__.at(mem__, 0, sp, wf::band_index(0)); + auto res_ptr = res__.at(mem__, 0, sp, wf::band_index(0)); + compute_residuals_gpu(hpsi_ptr, opsi_ptr, res_ptr, res__.ld(), num_bands__.get(), eval__.at(mem__)); +#endif + } + } +} + + +/// Apply preconditioner to the residuals. template void -apply_preconditioner(sddk::memory_t mem_type__, sddk::spin_range spins__, int num_bands__, sddk::Wave_functions& res__, - sddk::mdarray const& h_diag__, sddk::mdarray const& o_diag__, - sddk::mdarray& eval__); +apply_preconditioner(sddk::memory_t mem__, wf::spin_range spins__, wf::num_bands num_bands__, + wf::Wave_functions& res__, sddk::mdarray const& h_diag__, sddk::mdarray const& o_diag__, + sddk::mdarray const& eval__) +{ + for (auto s = spins__.begin(); s != spins__.end(); s++) { + auto sp = res__.actual_spin_index(s); + if (is_host_memory(mem__)) { + #pragma omp parallel for schedule(static) + for (int i = 0; i < num_bands__.get(); i++) { + auto res_ptr = res__.at(mem__, 0, sp, wf::band_index(i)); + for (int j = 0; j < res__.ld(); j++) { + T p = h_diag__(j, s.get()) - o_diag__(j, s.get()) * eval__[i]; + p = 0.5 * (1 + p + std::sqrt(1 + (p - 1) * (p - 1))); + res_ptr[j] /= p; + } + } + } else { +#if defined(SIRIUS_GPU) + apply_preconditioner_gpu(res__.at(mem__, 0, sp, wf::band_index(0)), res__.ld(), num_bands__.get(), + eval__.at(mem__), h_diag__.at(mem__, 0, s.get()), o_diag__.at(mem__, 0, s.get())); +#endif + } + } +} + +template +static auto +normalized_preconditioned_residuals(sddk::memory_t mem__, wf::spin_range spins__, wf::num_bands num_bands__, + sddk::mdarray const& eval__, wf::Wave_functions const& hpsi__, + wf::Wave_functions const& opsi__, wf::Wave_functions& res__, + sddk::mdarray const& h_diag__, sddk::mdarray const& o_diag__, + T norm_tolerance__, bool gamma__) +{ + PROFILE("sirius::normalized_preconditioned_residuals"); + + RTE_ASSERT(num_bands__.get() != 0); + + normalized_preconditioned_residuals_result> result; + result.norm = std::vector>(num_bands__.get()); + + /* compute "raw" residuals */ + compute_residuals(mem__, spins__, num_bands__, eval__, hpsi__, opsi__, res__); + + /* compute norm of the "raw" residuals; if norm is small, residuals are close to convergence */ + auto res_norm = wf::inner_diag(mem__, res__, res__, spins__, num_bands__); + for (int i = 0; i < num_bands__.get(); i++) { + result.norm[i] = std::sqrt(std::real(res_norm[i])); + } + + /* apply preconditioner */ + apply_preconditioner(mem__, spins__, num_bands__, res__, h_diag__, o_diag__, eval__); + + /* this not strictly necessary as the wave-function orthoronormalization can take care of this; + however, normalization of residuals is harmless and gives a better numerical stability */ + res_norm = wf::inner_diag(mem__, res__, res__, spins__, num_bands__); + std::vector> norm1; + for (auto e : res_norm) { + norm1.push_back(1.0 / std::sqrt(std::real(e))); + } + wf::axpby>(mem__, spins__, wf::band_range(0, num_bands__.get()), + nullptr, nullptr, norm1.data(), &res__); + + int n{0}; + for (int i = 0; i < num_bands__.get(); i++) { + /* take the residual if it's norm is above the threshold */ + if (result.norm[i] > norm_tolerance__) { + /* shift unconverged residuals to the beginning of array */ + /* note: we can just keep them where they were */ + if (n != i) { + for (auto s = spins__.begin(); s != spins__.end(); s++) { + auto sp = res__.actual_spin_index(s); + wf::copy(mem__, res__, sp, wf::band_range(i, i + 1), res__, sp, wf::band_range(n, n + 1)); + } + } + n++; + } + } + result.num_unconverged = n; + + /* prevent numerical noise */ + /* this only happens for real wave-functions (Gamma-point case), non-magnetic or collinear magnetic */ + if (gamma__ && res__.comm().rank() == 0 && n != 0) { + RTE_ASSERT(spins__.begin().get() + 1 == spins__.end().get()); + if (is_device_memory(mem__)) { +#if defined(SIRIUS_GPU) + make_real_g0_gpu(res__.at(mem__, 0, spins__.begin(), wf::band_index(0)), res__.ld(), n); +#endif + } else { + for (int i = 0; i < n; i++) { + res__.pw_coeffs(0, spins__.begin(), wf::band_index(i)) = + res__.pw_coeffs(0, spins__.begin(), wf::band_index(i)).real(); + } + } + } + + return result; +} + +/// Compute residuals from eigen-vectors. +/** + * + * \tparam T Precision type of the wave-functions (float or double). + * \tparam F Type of the subspace (float or double for Gamma-point calculation, + * complex or complex otherwise. + * + * + */ +template +residual_result +residuals(Simulation_context& ctx__, sddk::memory_t mem__, wf::spin_range sr__, + int N__, int num_bands__, int num_locked__, sddk::mdarray, 1>& eval__, sddk::dmatrix& evec__, + wf::Wave_functions& hphi__, wf::Wave_functions& ophi__, + wf::Wave_functions& hpsi__, wf::Wave_functions& opsi__, + wf::Wave_functions& res__, sddk::mdarray const& h_diag__, + sddk::mdarray const& o_diag__, bool estimate_eval__, T norm_tolerance__, + std::function is_converged__) +{ + PROFILE("sirius::residuals"); + + RTE_ASSERT(N__ != 0); + RTE_ASSERT(hphi__.num_sc() == hpsi__.num_sc()); + RTE_ASSERT(ophi__.num_sc() == opsi__.num_sc()); + + sddk::dmatrix evec_tmp; + + sddk::mdarray eval(num_bands__); + eval = [&](size_t j) -> T { return eval__[j]; }; + + sddk::dmatrix* evec_ptr{nullptr}; + + /* total number of residuals to be computed */ + int num_residuals{0}; + + /* number of lockable eigenvectors */ + int num_consecutive_converged{0}; + + /* when estimate_eval is set we only compute true residuals of unconverged eigenpairs + where convergence is determined just on the change in the eigenvalues. */ + if (estimate_eval__) { + /* Locking is only based on the "is_converged" criterion, not on the actual + residual norms. We could lock more by considering the residual norm criterion + later, but since we're reordering eigenvectors too, this becomes messy. */ + while (num_consecutive_converged < num_bands__ && is_converged__(num_consecutive_converged, sr__.spinor_index())) { + ++num_consecutive_converged; + } + + /* collect indices of unconverged eigenpairs */ + std::vector ev_idx; + for (int j = 0; j < num_bands__; j++) { + if (!is_converged__(j, sr__.spinor_index())) { + ev_idx.push_back(j); + } + } + + /* if everything is converged, return early */ + if (ev_idx.empty()) { + return residual_result{num_bands__, 0, 0}; + } + + // Otherwise copy / reorder the unconverged eigenpairs + num_residuals = static_cast(ev_idx.size()); + + evec_tmp = sddk::dmatrix(N__, num_residuals, evec__.blacs_grid(), evec__.bs_row(), evec__.bs_col()); + evec_ptr = &evec_tmp; + + int num_rows_local = evec_tmp.num_rows_local(); + for (int j = 0; j < num_residuals; j++) { + eval[j] = eval[ev_idx[j]]; + if (evec__.blacs_grid().comm().size() == 1) { + /* do a local copy */ + std::copy(&evec__(0, ev_idx[j]), &evec__(0, ev_idx[j]) + num_rows_local, &evec_tmp(0, j)); + } else { + auto pos_src = evec__.spl_col().location(ev_idx[j]); + auto pos_dest = evec_tmp.spl_col().location(j); + /* do MPI send / receive */ + if (pos_src.rank == evec__.blacs_grid().comm_col().rank() && num_rows_local) { + evec__.blacs_grid().comm_col().isend(&evec__(0, pos_src.local_index), num_rows_local, pos_dest.rank, ev_idx[j]); + } + if (pos_dest.rank == evec__.blacs_grid().comm_col().rank() && num_rows_local) { + evec__.blacs_grid().comm_col().recv(&evec_tmp(0, pos_dest.local_index), num_rows_local, pos_src.rank, ev_idx[j]); + } + } + } + if (is_device_memory(mem__) && evec_tmp.blacs_grid().comm().size() == 1) { + evec_tmp.allocate(sddk::memory_t::device); + } + } else { + evec_ptr = &evec__; + num_residuals = num_bands__; + } + if (is_device_memory(mem__)) { + eval.allocate(sddk::memory_t::device).copy_to(sddk::memory_t::device); + } + + for (auto s = sr__.begin(); s != sr__.end(); s++) { + auto sp = hphi__.actual_spin_index(s); + + /* compute H\Psi_{i} = \sum_{mu} H\phi_{mu} * Z_{mu, i} */ + wf::transform(ctx__.spla_context(), mem__, *evec_ptr, 0, 0, 1.0, hphi__, sp, wf::band_range(num_locked__, N__), + 0.0, hpsi__, sp, wf::band_range(0, num_residuals)); + + sp = ophi__.actual_spin_index(s); + /* compute O\Psi_{i} = \sum_{mu} O\phi_{mu} * Z_{mu, i} */ + wf::transform(ctx__.spla_context(), mem__, *evec_ptr, 0, 0, 1.0, ophi__, sp, wf::band_range(num_locked__, N__), + 0.0, opsi__, sp, wf::band_range(0, num_residuals)); + } + + auto result = normalized_preconditioned_residuals(mem__, sr__, wf::num_bands(num_residuals), eval, hpsi__, + opsi__, res__, h_diag__, o_diag__, norm_tolerance__, std::is_same>::value); + + // In case we're not using the delta in eigenvalues as a convergence criterion, + // we lock eigenpairs using residual norms. + if (!estimate_eval__) { + while (num_consecutive_converged < num_residuals && + result.norm[num_consecutive_converged] <= norm_tolerance__) { + num_consecutive_converged++; + } + } + + auto frobenius_norm = 0.0; + for (int i = 0; i < num_residuals; i++) { + frobenius_norm += result.norm[i] * result.norm[i]; + } + frobenius_norm = std::sqrt(frobenius_norm); + return { + num_consecutive_converged, + result.num_unconverged, + frobenius_norm + }; +} + + } #endif diff --git a/src/band/solve.cpp b/src/band/solve.cpp index 270437207..8f31ca0f3 100644 --- a/src/band/solve.cpp +++ b/src/band/solve.cpp @@ -23,7 +23,6 @@ */ #include "band.hpp" #include "davidson.hpp" -#include "potential/potential.hpp" namespace sirius { @@ -68,7 +67,7 @@ Band::solve_full_potential(Hamiltonian_k& Hk__, double itsol_tol__ template int -Band::solve_pseudo_potential(Hamiltonian_k>& Hk__, double itsol_tol__, double empy_tol__) const +Band::solve_pseudo_potential(Hamiltonian_k& Hk__, double itsol_tol__, double empy_tol__) const { ctx_.print_memory_usage(__FILE__, __LINE__); @@ -78,7 +77,7 @@ Band::solve_pseudo_potential(Hamiltonian_k>& Hk__, double itsol_tol if (itso.type() == "exact") { if (ctx_.num_mag_dims() != 3) { for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { - diag_pseudo_potential_exact(ispn, Hk__); + diag_pseudo_potential_exact(ispn, Hk__); } } else { STOP(); @@ -99,11 +98,10 @@ Band::solve_pseudo_potential(Hamiltonian_k>& Hk__, double itsol_tol return tol; }; - auto result = davidson(Hk__, ctx_.num_bands(), ctx_.num_mag_dims(), - kp.spinor_wave_functions(), tolerance, itso.residual_tolerance(), itso.num_steps(), - itso.locking(), itso.subspace_size(), itso.converge_by_energy(), itso.extra_ortho(), - std::cout, 0); - + auto result = davidson(Hk__, wf::num_bands(ctx_.num_bands()), + wf::num_mag_dims(ctx_.num_mag_dims()), kp.spinor_wave_functions(), tolerance, + itso.residual_tolerance(), itso.num_steps(), itso.locking(), itso.subspace_size(), + itso.converge_by_energy(), itso.extra_ortho(), std::cout, 0); niter = result.niter; for (int ispn = 0; ispn < ctx_.num_spinors(); ispn++) { for (int j = 0; j < ctx_.num_bands(); j++) { @@ -114,11 +112,11 @@ Band::solve_pseudo_potential(Hamiltonian_k>& Hk__, double itsol_tol RTE_THROW("unknown iterative solver type"); } - /* check residuals */ - if (ctx_.cfg().control().verification() >= 2) { - check_residuals(Hk__); - check_wave_functions(Hk__); - } + ///* check residuals */ + //if (ctx_.cfg().control().verification() >= 2) { + // check_residuals(Hk__); + // check_wave_functions(Hk__); + //} ctx_.print_memory_usage(__FILE__, __LINE__); @@ -154,7 +152,7 @@ Band::solve(K_point_set& kset__, Hamiltonian0& H0__, double itsol_tol__) cons if (ctx_.gamma_point() && (ctx_.so_correction() == false)) { num_dav_iter += solve_pseudo_potential(Hk, itsol_tol__, empy_tol); } else { - num_dav_iter += solve_pseudo_potential, std::complex>(Hk, itsol_tol__, empy_tol); + num_dav_iter += solve_pseudo_potential>(Hk, itsol_tol__, empy_tol); } } } diff --git a/src/beta_projectors/beta_projectors.hpp b/src/beta_projectors/beta_projectors.hpp index 9b174f4e0..55425b86f 100644 --- a/src/beta_projectors/beta_projectors.hpp +++ b/src/beta_projectors/beta_projectors.hpp @@ -112,7 +112,7 @@ class Beta_projectors : public Beta_projectors_base /* wrap the the pointer in the big array beta_pw_all_atoms */ this->pw_coeffs_a_ = sddk::matrix>(&beta_pw_all_atoms_(0, this->chunk(ichunk).offset_), this->num_gkvec_loc(), this->chunk(ichunk).num_beta_); - Beta_projectors_base::generate(ichunk, 0); + Beta_projectors_base::generate(sddk::memory_t::host, ichunk, 0); } break; } @@ -129,7 +129,9 @@ class Beta_projectors : public Beta_projectors_base Beta_projectors_base::prepare(); break; } - case sddk::device_t::CPU: break; + case sddk::device_t::CPU: { + break; + } } prepared_ = true; } @@ -144,23 +146,21 @@ class Beta_projectors : public Beta_projectors_base Beta_projectors_base::dismiss(); break; } - case sddk::device_t::CPU: break; + case sddk::device_t::CPU: { + break; + } } prepared_ = false; } - void generate(int chunk__) + void generate(sddk::memory_t mem__, int chunk__) { - switch (this->ctx_.processing_unit()) { - case sddk::device_t::CPU: { - this->pw_coeffs_a_ = sddk::matrix>(&beta_pw_all_atoms_(0, this->chunk(chunk__).offset_), + if (is_host_memory(mem__)) { + this->pw_coeffs_a_ = sddk::matrix>(&beta_pw_all_atoms_(0, this->chunk(chunk__).offset_), this->num_gkvec_loc(), this->chunk(chunk__).num_beta_); - break; - } - case sddk::device_t::GPU: { - Beta_projectors_base::generate(chunk__, 0); - break; - } + } + if (is_device_memory(mem__)) { + Beta_projectors_base::generate(mem__, chunk__, 0); } } diff --git a/src/beta_projectors/beta_projectors_base.cpp b/src/beta_projectors/beta_projectors_base.cpp index 85d38c51c..589bc87b6 100644 --- a/src/beta_projectors/beta_projectors_base.cpp +++ b/src/beta_projectors/beta_projectors_base.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2013-2017 Anton Kozhevnikov, Thomas Schulthess +// Copyright (c) 2013-2022 Anton Kozhevnikov, Thomas Schulthess // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are permitted provided that @@ -69,13 +69,13 @@ void Beta_projectors_base::split_in_chunks() beta_chunks_[ib].atom_pos_(x, i) = pos[x]; } /* number of beta functions for atom */ - beta_chunks_[ib].desc_(static_cast(beta_desc_idx::nbf), i) = type.mt_basis_size(); + beta_chunks_[ib].desc_(beta_desc_idx::nbf, i) = type.mt_basis_size(); /* offset in beta_gk*/ - beta_chunks_[ib].desc_(static_cast(beta_desc_idx::offset), i) = num_beta; + beta_chunks_[ib].desc_(beta_desc_idx::offset, i) = num_beta; /* offset in beta_gk_t */ - beta_chunks_[ib].desc_(static_cast(beta_desc_idx::offset_t), i) = type.offset_lo(); + beta_chunks_[ib].desc_(beta_desc_idx::offset_t, i) = type.offset_lo(); /* global index of atom */ - beta_chunks_[ib].desc_(static_cast(beta_desc_idx::ia), i) = ia; + beta_chunks_[ib].desc_(beta_desc_idx::ia, i) = ia; num_beta += type.mt_basis_size(); } @@ -131,140 +131,60 @@ Beta_projectors_base::Beta_projectors_base(Simulation_context& ctx__, sddk::G } } -template template -sddk::matrix -Beta_projectors_base::inner(int chunk__, sddk::Wave_functions& phi__, int ispn__, int idx0__, int n__) -{ - PROFILE("sirius::Beta_projectors_base::inner"); - - assert(num_gkvec_loc() == phi__.pw_coeffs(ispn__).num_rows_loc()); - - int nbeta = chunk(chunk__).num_beta_; - - sddk::matrix beta_phi(nbeta, n__, ctx_.mem_pool(ctx_.host_memory_t())); - - /* location of the beta-projectors is always on the memory of the processing unit being used */ - F* pw_coeffs_a_ptr{nullptr}; - switch (ctx_.processing_unit()) { - case sddk::device_t::CPU: { - pw_coeffs_a_ptr = reinterpret_cast(pw_coeffs_a().at(sddk::memory_t::host)); - break; - } - case sddk::device_t::GPU: { - beta_phi.allocate(ctx_.mem_pool(sddk::memory_t::device)); - pw_coeffs_a_ptr = reinterpret_cast(pw_coeffs_a().at(sddk::memory_t::device)); - break; - } - } - - local_inner_aux(pw_coeffs_a_ptr, nbeta, phi__, ispn__, idx0__, n__, beta_phi); - - /* copy to host in MPI sequential or parallel case */ - if (is_device_memory(ctx_.preferred_memory_t())) { - beta_phi.copy_to(sddk::memory_t::host); - } - - /* in parallel case do a reduction */ - if (gkvec_.comm().size() > 1) { - PROFILE("sirius::Beta_projectors_base::inner|comm"); - /* MPI reduction on the host */ - gkvec_.comm().allreduce(beta_phi.at(sddk::memory_t::host), static_cast(beta_phi.size())); - } - - switch (ctx_.processing_unit()) { - case sddk::device_t::GPU: { - /* copy back to device */ - if (gkvec_.comm().size() > 1 || is_host_memory(ctx_.preferred_memory_t())) { - beta_phi.copy_to(sddk::memory_t::device); - } - break; - } - case sddk::device_t::CPU: break; - } - - return beta_phi; -} - #if defined(SIRIUS_GPU) -void create_beta_gk_gpu(int num_atoms, - int num_gkvec, - int const* beta_desc, - std::complex const* beta_gk_t, - double const* gkvec, - double const* atom_pos, - std::complex* beta_gk) +void +create_beta_gk_gpu(int num_atoms, int num_gkvec, int const* beta_desc, + std::complex const* beta_gk_t, double const* gkvec, double const* atom_pos, + std::complex* beta_gk) { create_beta_gk_gpu_float(num_atoms, num_gkvec, beta_desc, beta_gk_t, gkvec, atom_pos, beta_gk); } -void create_beta_gk_gpu(int num_atoms, - int num_gkvec, - int const* beta_desc, - double_complex const* beta_gk_t, - double const* gkvec, - double const* atom_pos, - double_complex* beta_gk) +void +create_beta_gk_gpu(int num_atoms, int num_gkvec, int const* beta_desc, std::complex const* beta_gk_t, + double const* gkvec, double const* atom_pos, std::complex* beta_gk) { create_beta_gk_gpu_double(num_atoms, num_gkvec, beta_desc, beta_gk_t, gkvec, atom_pos, beta_gk); } #endif template -void Beta_projectors_base::generate(int ichunk__, int j__) +void Beta_projectors_base::generate(sddk::memory_t mem__, int ichunk__, int j__) { PROFILE("sirius::Beta_projectors_base::generate"); - switch (ctx_.processing_unit()) { - case sddk::device_t::CPU: { - #pragma omp parallel for - for (int i = 0; i < chunk(ichunk__).num_atoms_; i++) { - int ia = chunk(ichunk__).desc_(static_cast(beta_desc_idx::ia), i); + if (is_host_memory(mem__)) { + #pragma omp parallel for + for (int i = 0; i < chunk(ichunk__).num_atoms_; i++) { + int ia = chunk(ichunk__).desc_(beta_desc_idx::ia, i); - double phase = twopi * dot(gkvec_.vk(), ctx_.unit_cell().atom(ia).position()); - auto phase_k = std::exp(std::complex(0.0, phase)); + double phase = twopi * dot(gkvec_.vk(), ctx_.unit_cell().atom(ia).position()); + auto phase_k = std::exp(std::complex(0.0, phase)); - std::vector> phase_gk(num_gkvec_loc()); + std::vector> phase_gk(num_gkvec_loc()); + for (int igk_loc = 0; igk_loc < num_gkvec_loc(); igk_loc++) { + auto G = gkvec_.gvec(igk_loc); + /* total phase e^{-i(G+k)r_{\alpha}} */ + phase_gk[igk_loc] = std::conj(static_cast>(ctx_.gvec_phase_factor(G, ia)) * phase_k); + } + int nbeta = chunk(ichunk__).desc_(beta_desc_idx::nbf, i); + int offset_a = chunk(ichunk__).desc_(beta_desc_idx::offset, i); + int offset_t = chunk(ichunk__).desc_(beta_desc_idx::offset_t, i); + for (int xi = 0; xi < nbeta; xi++) { for (int igk_loc = 0; igk_loc < num_gkvec_loc(); igk_loc++) { - auto G = gkvec_.gvec(igk_loc); - /* total phase e^{-i(G+k)r_{\alpha}} */ - phase_gk[igk_loc] = std::conj(static_cast>(ctx_.gvec_phase_factor(G, ia)) * phase_k); - } - int nbeta = chunk(ichunk__).desc_(static_cast(beta_desc_idx::nbf), i); - int offset_a = chunk(ichunk__).desc_(static_cast(beta_desc_idx::offset), i); - int offset_t = chunk(ichunk__).desc_(static_cast(beta_desc_idx::offset_t), i); - for (int xi = 0; xi < nbeta; xi++) { - for (int igk_loc = 0; igk_loc < num_gkvec_loc(); igk_loc++) { - pw_coeffs_a_(igk_loc, offset_a + xi) = pw_coeffs_t_(igk_loc, offset_t + xi, j__) * - static_cast>(phase_gk[igk_loc]); - } + pw_coeffs_a_(igk_loc, offset_a + xi) = pw_coeffs_t_(igk_loc, offset_t + xi, j__) * + static_cast>(phase_gk[igk_loc]); } } - break; } - case sddk::device_t::GPU: { + } + if (is_device_memory(mem__)) { #if defined(SIRIUS_GPU) - auto& desc = chunk(ichunk__).desc_; - create_beta_gk_gpu(chunk(ichunk__).num_atoms_, - num_gkvec_loc(), - desc.at(sddk::memory_t::device), - pw_coeffs_t_.at(sddk::memory_t::device, 0, 0, j__), - gkvec_coord_.at(sddk::memory_t::device), - chunk(ichunk__).atom_pos_.at(sddk::memory_t::device), - pw_coeffs_a().at(sddk::memory_t::device)); + auto& desc = chunk(ichunk__).desc_; + create_beta_gk_gpu(chunk(ichunk__).num_atoms_, num_gkvec_loc(), desc.at(mem__), + pw_coeffs_t_.at(mem__, 0, 0, j__), gkvec_coord_.at(mem__), + chunk(ichunk__).atom_pos_.at(mem__), pw_coeffs_a().at(mem__)); #endif - /* wave-functions are on CPU but the beta-projectors are on GPU */ - if (gkvec_.comm().rank() == 0 && is_host_memory(ctx_.preferred_memory_t())) { - /* make beta-projectors for G=0 on the CPU */ - #pragma omp parallel for schedule(static) - for (int i = 0; i < chunk(ichunk__).num_atoms_; i++) { - for (int xi = 0; xi < chunk(ichunk__).desc_(static_cast(beta_desc_idx::nbf), i); xi++) { - pw_coeffs_a_g0_(chunk(ichunk__).desc_(static_cast(beta_desc_idx::offset), i) + xi) = - pw_coeffs_t_(0, chunk(ichunk__).desc_(static_cast(beta_desc_idx::offset_t), i) + xi, j__); - } - } - } - break; - } } } @@ -279,24 +199,19 @@ void Beta_projectors_base::prepare() switch (ctx_.processing_unit()) { case sddk::device_t::CPU: { - pw_coeffs_a_ = sddk::matrix>(num_gkvec_loc(), max_num_beta(), ctx_.mem_pool(ctx_.host_memory_t()), + pw_coeffs_a_ = sddk::matrix>(num_gkvec_loc(), max_num_beta(), get_memory_pool(ctx_.host_memory_t()), "pw_coeffs_a_"); - pw_coeffs_a_g0_ = sddk::mdarray, 1>(max_num_beta(), ctx_.mem_pool(sddk::memory_t::host), - "pw_coeffs_a_g0_"); break; } case sddk::device_t::GPU: { - pw_coeffs_a_ = sddk::matrix>(num_gkvec_loc(), max_num_beta(), ctx_.mem_pool(sddk::memory_t::device), + pw_coeffs_a_ = sddk::matrix>(num_gkvec_loc(), max_num_beta(), get_memory_pool(sddk::memory_t::device), "pw_coeffs_a_"); - pw_coeffs_a_g0_ = sddk::mdarray, 1>(max_num_beta(), ctx_.mem_pool(sddk::memory_t::host), - "pw_coeffs_a_g0_"); - pw_coeffs_a_g0_.allocate(ctx_.mem_pool(sddk::memory_t::device)); break; } } if (ctx_.processing_unit() == sddk::device_t::GPU && reallocate_pw_coeffs_t_on_gpu_) { - pw_coeffs_t_.allocate(ctx_.mem_pool(sddk::memory_t::device)).copy_to(sddk::memory_t::device); + pw_coeffs_t_.allocate(get_memory_pool(sddk::memory_t::device)).copy_to(sddk::memory_t::device); } } @@ -309,31 +224,11 @@ void Beta_projectors_base::dismiss() pw_coeffs_t_.deallocate(sddk::memory_t::device); } pw_coeffs_a_.deallocate(sddk::memory_t::device); - pw_coeffs_a_g0_.deallocate(sddk::memory_t::device); } - template class Beta_projectors_base; - -template -sddk::matrix -Beta_projectors_base::inner(int chunk__, sddk::Wave_functions& phi__, int ispn__, int idx0__, int n__); - -template -sddk::matrix -Beta_projectors_base::inner(int chunk__, sddk::Wave_functions& phi__, int ispn__, int idx0__, int n__); - #ifdef USE_FP32 template class Beta_projectors_base; - - -template -sddk::matrix -Beta_projectors_base::inner(int chunk__, sddk::Wave_functions& phi__, int ispn__, int idx0__, int n__); - -template -sddk::matrix> -Beta_projectors_base::inner>(int chunk__, sddk::Wave_functions& phi__, int ispn__, int idx0__, int n__); - #endif + } // namespace diff --git a/src/beta_projectors/beta_projectors_base.hpp b/src/beta_projectors/beta_projectors_base.hpp index 762c722fb..310626e8a 100644 --- a/src/beta_projectors/beta_projectors_base.hpp +++ b/src/beta_projectors/beta_projectors_base.hpp @@ -31,34 +31,30 @@ namespace sirius { #if defined(SIRIUS_GPU) -extern "C" void create_beta_gk_gpu_float(int num_atoms, - int num_gkvec, - int const* beta_desc, - std::complex const* beta_gk_t, - double const* gkvec, - double const* atom_pos, - std::complex* beta_gk); - -extern "C" void create_beta_gk_gpu_double(int num_atoms, - int num_gkvec, - int const* beta_desc, - double_complex const* beta_gk_t, - double const* gkvec, - double const* atom_pos, - double_complex* beta_gk); +extern "C" { + +void +create_beta_gk_gpu_float(int num_atoms, int num_gkvec, int const* beta_desc, std::complex const* beta_gk_t, + double const* gkvec, double const* atom_pos, std::complex* beta_gk); + +void +create_beta_gk_gpu_double(int num_atoms, int num_gkvec, int const* beta_desc, double_complex const* beta_gk_t, + double const* gkvec, double const* atom_pos, double_complex* beta_gk); + +} #endif /// Named index of a descriptor of beta-projectors. The same order is used by the GPU kernel. -enum class beta_desc_idx : int +struct beta_desc_idx { /// Number of beta-projector functions for this atom. - nbf = 0, + static const int nbf = 0; /// Offset of beta-projectors in this chunk. - offset = 1, + static const int offset = 1; /// Offset of beta-projectors in the array for atom types. - offset_t = 2, + static const int offset_t = 2; /// Global index of atom. - ia = 3 + static const int ia = 3; }; struct beta_chunk_t @@ -76,6 +72,8 @@ struct beta_chunk_t }; /// Base class for beta-projectors, gradient of beta-projectors and strain derivatives of beta-projectors. +/** \tparam T Precision of beta-projectors (float or double). + */ template class Beta_projectors_base { @@ -100,7 +98,7 @@ class Beta_projectors_base /// Set of beta PW coefficients for a chunk of atoms. sddk::matrix> pw_coeffs_a_; - sddk::mdarray, 1> pw_coeffs_a_g0_; + //sddk::mdarray, 1> pw_coeffs_a_g0_; std::vector beta_chunks_; @@ -112,106 +110,70 @@ class Beta_projectors_base /// Split beta-projectors into chunks. void split_in_chunks(); - template, F>::value, bool> = true> - void local_inner_aux(F* beta_pw_coeffs_a_ptr__, int nbeta__, sddk::Wave_functions& phi__, - int ispn__, int idx0__, int n__, sddk::matrix& beta_phi__) const - { - auto pp = utils::get_env("SIRIUS_PRINT_PERFORMANCE"); - if (pp && gkvec_.comm().rank() == 0) { - PROFILE_START("sirius::Beta_projectors_base::local_inner_aux"); - } - - const auto t1 = std::chrono::high_resolution_clock::now(); - sddk::linalg(ctx_.blas_linalg_t()) - .gemm('C', 'N', nbeta__, n__, num_gkvec_loc(), &sddk::linalg_const::one(), beta_pw_coeffs_a_ptr__, - num_gkvec_loc(), phi__.pw_coeffs(ispn__).prime().at(phi__.preferred_memory_t(), 0, idx0__), - phi__.pw_coeffs(ispn__).prime().ld(), &sddk::linalg_const::zero(), - beta_phi__.at(ctx_.preferred_memory_t()), beta_phi__.ld()); - - if (pp && gkvec_.comm().rank() == 0) { -#ifdef SIRIUS_GPU - if (ctx_.blas_linalg_t() == sddk::linalg_t::gpublas) { - acc::sync_stream(stream_id(-1)); - } -#endif - std::chrono::duration t = std::chrono::high_resolution_clock::now() - t1; - PROFILE_STOP("sirius::Beta_projectors_base::local_inner_aux"); - std::printf( - "Beta_projectors_base::local_inner performance: %12.6f GFlops [m,n,k=%i %i %i, time=%f (sec)]\n", - 8e-9 * nbeta__ * n__ * num_gkvec_loc() / t.count(), nbeta__, n__, num_gkvec_loc(), t.count()); - } - } + public: + Beta_projectors_base(Simulation_context& ctx__, sddk::Gvec const& gkvec__, int N__); - template::value, bool> = true> - void local_inner_aux(F* beta_pw_coeffs_a_ptr__, int nbeta__, sddk::Wave_functions& phi__, - int ispn__, int idx0__, int n__, sddk::matrix& beta_phi__) const + /// Calculate inner product between beta-projectors and wave-functions. + /** The following is matrix computed: + * + * \tparam F Type of the resulting inner product matrix (float, double, complex or complex). + */ + template + std::enable_if_t>::value, sddk::dmatrix> + inner(sddk::memory_t mem__, int chunk__, wf::Wave_functions const& phi__, wf::spin_index ispn__, wf::band_range br__) const { - sddk::linalg(ctx_.blas_linalg_t()) - .gemm('C', 'N', nbeta__, n__, 2 * num_gkvec_loc(), &sddk::linalg_const::two(), beta_pw_coeffs_a_ptr__, - 2 * num_gkvec_loc(), - reinterpret_cast(phi__.pw_coeffs(ispn__).prime().at(phi__.preferred_memory_t(), 0, idx0__)), - 2 * phi__.pw_coeffs(ispn__).prime().ld(), &sddk::linalg_const::zero(), - beta_phi__.at(ctx_.preferred_memory_t()), beta_phi__.ld()); - - /* rank 0 has to do some extra work for Gamma-point case */ - if (gkvec_.comm().rank() == 0) { - int incx{2 * num_gkvec_loc()}; - sddk::linalg_t la{sddk::linalg_t::none}; - /* both wave-functions and beta-projectors are on GPU */ - if (is_device_memory(ctx_.preferred_memory_t())) { - la = sddk::linalg_t::gpublas; - } else { /* wave-functions are on CPU but the beta-projectors are in the memory of main device */ - la = sddk::linalg_t::blas; - switch (ctx_.processing_unit()) { - case sddk::device_t::GPU: { - beta_pw_coeffs_a_ptr__ = - reinterpret_cast(const_cast*>(&pw_coeffs_a_g0_(0))); - incx = 2; - break; - } - case sddk::device_t::CPU: - break; - } - } - sddk::linalg(la).ger( - nbeta__, n__, &sddk::linalg_const::m_one(), beta_pw_coeffs_a_ptr__, incx, - reinterpret_cast(phi__.pw_coeffs(ispn__).prime().at(phi__.preferred_memory_t(), 0, idx0__)), - 2 * phi__.pw_coeffs(ispn__).prime().ld(), beta_phi__.at(ctx_.preferred_memory_t()), beta_phi__.ld()); + int nbeta = chunk(chunk__).num_beta_; + + sddk::dmatrix result(nbeta, br__.size(), get_memory_pool(ctx_.host_memory_t()), ""); + if (ctx_.processing_unit() == sddk::device_t::GPU) { + result.allocate(get_memory_pool(sddk::memory_t::device)); } - } - public: - Beta_projectors_base(Simulation_context& ctx__, sddk::Gvec const& gkvec__, int N__); + wf::inner(ctx_.spla_context(), mem__, wf::spin_range(ispn__.get()), *this, + wf::band_range(0, nbeta), phi__, br__, result, 0, 0); - /// Calculate inner product between beta-projectors and wave-functions. - /** The following is computed: */ - template >::value>> - sddk::matrix inner(int chunk__, sddk::Wave_functions& phi__, int ispn__, int idx0__, int n__); + return result; + } /// Generate beta-projectors for a chunk of atoms. /** Beta-projectors are always generated and stored in the memory of a processing unit. * - * \param [in] ichunk Index of a chunk of atoms for which beta-projectors are generated. + * \param [in] mem Location of the beta-projectors (host or device memory). + * \param [in] ichunk Index of a chunk of atoms for which beta-projectors are generated. * \param [in] j index of the component (up to 9 components are used for the strain derivative) */ - void generate(int ichunk__, int j__); + void generate(sddk::memory_t mem__, int ichunk__, int j__); void prepare(); void dismiss(); - inline int num_gkvec_loc() const + inline auto num_gkvec_loc() const { - //return static_cast(igk_.size()); return gkvec_.count(); } - inline int num_comp() const + inline auto ld() const + { + return this->num_gkvec_loc(); + } + + inline auto const& gkvec() const + { + return gkvec_; + } + + inline auto num_md() const + { + return wf::num_mag_dims(0); + } + + inline auto num_comp() const { return N_; } - inline Unit_cell const& unit_cell() const + inline auto const& unit_cell() const { return ctx_.unit_cell(); } @@ -232,6 +194,11 @@ class Beta_projectors_base return pw_coeffs_a_; } + auto const& pw_coeffs_a() const + { + return pw_coeffs_a_; + } + inline int num_beta_t() const { return num_beta_t_; @@ -251,6 +218,21 @@ class Beta_projectors_base { return max_num_beta_; } + + inline auto const& comm() const + { + return gkvec_.comm(); + } + + inline auto actual_spin_index(wf::spin_index s__) const + { + return wf::spin_index(0); + } + + inline std::complex const* at(sddk::memory_t mem__, int i__, wf::spin_index s__, wf::band_index b__) const + { + return pw_coeffs_a_.at(mem__, i__, b__.get()); + } }; } // namespace diff --git a/src/context/config.hpp b/src/context/config.hpp index f36b59802..b7cce17af 100644 --- a/src/context/config.hpp +++ b/src/context/config.hpp @@ -907,18 +907,6 @@ class config_t } dict_["/control/use_second_variation"_json_pointer] = use_second_variation__; } - /// Control the usage of the GPU memory. - inline auto memory_usage() const - { - return dict_.at("/control/memory_usage"_json_pointer).get(); - } - inline void memory_usage(std::string memory_usage__) - { - if (dict_.contains("locked")) { - throw std::runtime_error(locked_msg); - } - dict_["/control/memory_usage"_json_pointer] = memory_usage__; - } /// Number of atoms in a chunk of beta-projectors. inline auto beta_chunk_size() const { diff --git a/src/context/input_schema.json b/src/context/input_schema.json index ce1df885c..c37742ee0 100644 --- a/src/context/input_schema.json +++ b/src/context/input_schema.json @@ -427,13 +427,6 @@ "default" : true, "title" : "True if second-variational diagonalization is used in LAPW method." }, - "memory_usage" : { - "type" : "string", - "default" : "high", - "enum" : ["high", "medium", "low"], - "title" : "Control the usage of the GPU memory.", - "$comment" : "subject to removal" - }, "beta_chunk_size" : { "type" : "integer", "default" : 256, diff --git a/src/context/simulation_context.cpp b/src/context/simulation_context.cpp index b877cad5c..c5d8489fd 100644 --- a/src/context/simulation_context.cpp +++ b/src/context/simulation_context.cpp @@ -205,15 +205,15 @@ Simulation_context::sum_fg_fl_yg(int lmax__, double_complex const* fpw__, sddk:: switch (processing_unit()) { case sddk::device_t::CPU: { - auto& mp = this->mem_pool(sddk::memory_t::host); + auto& mp = get_memory_pool(sddk::memory_t::host); phase_factors = sddk::matrix(ngv_loc, na_max, mp); zm = sddk::matrix(lmmax, ngv_loc, mp); tmp = sddk::matrix(lmmax, na_max, mp); break; } case sddk::device_t::GPU: { - auto& mp = this->mem_pool(sddk::memory_t::host); - auto& mpd = this->mem_pool(sddk::memory_t::device); + auto& mp = get_memory_pool(sddk::memory_t::host); + auto& mpd = get_memory_pool(sddk::memory_t::device); phase_factors = sddk::matrix(nullptr, ngv_loc, na_max); phase_factors.allocate(mpd); zm = sddk::matrix(lmmax, ngv_loc, mp); @@ -331,7 +331,7 @@ Simulation_context::initialize() RTE_THROW("Simulation parameters are already initialized."); } - auto verb_lvl = utils::get_env("SIRIUS_VERBOSITY"); + auto verb_lvl = env::get_value_ptr("SIRIUS_VERBOSITY"); if (verb_lvl) { this->verbosity(*verb_lvl); } @@ -363,9 +363,9 @@ Simulation_context::initialize() /* initialize MPI communicators */ init_comm(); - auto print_mpi_layout = utils::get_env("SIRIUS_PRINT_MPI_LAYOUT"); + auto print_mpi_layout = env::print_mpi_layout(); - if (verbosity() >= 3 || (print_mpi_layout && *print_mpi_layout)) { + if (verbosity() >= 3 || print_mpi_layout) { sddk::pstdout pout(comm()); if (comm().rank() == 0) { pout.printf("MPI rank placement\n"); @@ -387,58 +387,6 @@ Simulation_context::initialize() } } - switch (processing_unit()) { - case sddk::device_t::CPU: { - preferred_memory_t_ = sddk::memory_t::host; - break; - } - case sddk::device_t::GPU: { - if (cfg().control().memory_usage() == "high") { - preferred_memory_t_ = sddk::memory_t::device; - } - if (cfg().control().memory_usage() == "low" || cfg().control().memory_usage() == "medium") { - preferred_memory_t_ = sddk::memory_t::host_pinned; - } - break; - } - } - - switch (processing_unit()) { - case sddk::device_t::CPU: { - aux_preferred_memory_t_ = sddk::memory_t::host; - break; - } - case sddk::device_t::GPU: { - if (cfg().control().memory_usage() == "high" || cfg().control().memory_usage() == "medium") { - aux_preferred_memory_t_ = sddk::memory_t::device; - } - if (cfg().control().memory_usage() == "low") { - aux_preferred_memory_t_ = sddk::memory_t::host_pinned; - } - break; - } - } - - switch (processing_unit()) { - case sddk::device_t::CPU: { - blas_linalg_t_ = sddk::linalg_t::blas; - break; - } - case sddk::device_t::GPU: { - if (cfg().control().memory_usage() == "high") { - blas_linalg_t_ = sddk::linalg_t::gpublas; - } - if (cfg().control().memory_usage() == "low" || cfg().control().memory_usage() == "medium") { -#if defined(SIRIUS_ROCM) - blas_linalg_t_ = sddk::linalg_t::gpublas; -#else - blas_linalg_t_ = sddk::linalg_t::cublasxt; -#endif - } - break; - } - } - if (processing_unit() == sddk::device_t::GPU) { spla_ctx_.reset(new spla::Context{SPLA_PU_GPU}); spla_ctx_->set_tile_size_gpu(1688); // limit GPU memory usage to around 500MB @@ -624,17 +572,17 @@ Simulation_context::initialize() } } - auto pstr = utils::get_env("SIRIUS_EV_SOLVER"); - if (pstr) { - evsn[0] = *pstr; - evsn[1] = *pstr; + auto ev_str = env::get_ev_solver(); + if (ev_str.size()) { + evsn[0] = ev_str; + evsn[1] = ev_str; } std_evp_solver_name(evsn[0]); gen_evp_solver_name(evsn[1]); - std_evp_solver_ = Eigensolver_factory(std_evp_solver_name(), &mem_pool(sddk::memory_t::device)); - gen_evp_solver_ = Eigensolver_factory(gen_evp_solver_name(), &mem_pool(sddk::memory_t::device)); + std_evp_solver_ = Eigensolver_factory(std_evp_solver_name()); + gen_evp_solver_ = Eigensolver_factory(gen_evp_solver_name()); auto& std_solver = std_evp_solver(); auto& gen_solver = gen_evp_solver(); @@ -692,8 +640,8 @@ Simulation_context::initialize() print_info(); } - auto pcs = utils::get_env("SIRIUS_PRINT_CHECKSUM"); - if (pcs && *pcs) { + auto pcs = env::print_checksum(); + if (pcs) { this->cfg().control().print_checksum(true); } @@ -1048,34 +996,34 @@ Simulation_context::update() /* create list of coarse G-vectors */ gvec_coarse_ = std::make_unique(rlv, 2 * gk_cutoff(), comm(), cfg().control().reduce_gvec()); /* create FFT friendly partiton */ - gvec_coarse_partition_ = std::make_unique(*gvec_coarse_, comm_fft_coarse(), + gvec_coarse_fft_ = std::make_shared(*gvec_coarse_, comm_fft_coarse(), comm_ortho_fft_coarse()); auto spl_z = split_fft_z(fft_coarse_grid_[2], comm_fft_coarse()); /* create spfft buffer for coarse transform */ spfft_grid_coarse_ = std::unique_ptr(new spfft::Grid( - fft_coarse_grid_[0], fft_coarse_grid_[1], fft_coarse_grid_[2], gvec_coarse_partition_->zcol_count_fft(), + fft_coarse_grid_[0], fft_coarse_grid_[1], fft_coarse_grid_[2], gvec_coarse_fft_->zcol_count_fft(), spl_z.local_size(), spfft_pu, -1, comm_fft_coarse().mpi_comm(), SPFFT_EXCH_DEFAULT)); #ifdef USE_FP32 spfft_grid_coarse_float_ = std::unique_ptr(new spfft::GridFloat( - fft_coarse_grid_[0], fft_coarse_grid_[1], fft_coarse_grid_[2], gvec_coarse_partition_->zcol_count_fft(), + fft_coarse_grid_[0], fft_coarse_grid_[1], fft_coarse_grid_[2], gvec_coarse_fft_->zcol_count_fft(), spl_z.local_size(), spfft_pu, -1, comm_fft_coarse().mpi_comm(), SPFFT_EXCH_DEFAULT)); #endif /* create spfft transformations */ const auto fft_type_coarse = gvec_coarse().reduced() ? SPFFT_TRANS_R2C : SPFFT_TRANS_C2C; - auto const& gv = gvec_coarse_partition_->gvec_array(); + auto const& gv = gvec_coarse_fft_->gvec_array(); /* create actual transform object */ spfft_transform_coarse_.reset(new spfft::Transform(spfft_grid_coarse_->create_transform( spfft_pu, fft_type_coarse, fft_coarse_grid_[0], fft_coarse_grid_[1], fft_coarse_grid_[2], - spl_z.local_size(), gvec_coarse_partition_->gvec_count_fft(), SPFFT_INDEX_TRIPLETS, + spl_z.local_size(), gvec_coarse_fft_->gvec_count_fft(), SPFFT_INDEX_TRIPLETS, gv.at(sddk::memory_t::host)))); #ifdef USE_FP32 spfft_transform_coarse_float_.reset(new spfft::TransformFloat(spfft_grid_coarse_float_->create_transform( spfft_pu, fft_type_coarse, fft_coarse_grid_[0], fft_coarse_grid_[1], fft_coarse_grid_[2], - spl_z.local_size(), gvec_coarse_partition_->gvec_count_fft(), SPFFT_INDEX_TRIPLETS, + spl_z.local_size(), gvec_coarse_fft_->gvec_count_fft(), SPFFT_INDEX_TRIPLETS, gv.at(sddk::memory_t::host)))); #endif } else { @@ -1084,32 +1032,32 @@ Simulation_context::update() /* create a list of G-vectors for dense FFT grid; G-vectors are divided between all available MPI ranks.*/ if (!gvec_) { - gvec_ = std::make_unique(pw_cutoff(), *gvec_coarse_); - gvec_partition_ = std::make_unique(*gvec_, comm_fft(), comm_ortho_fft()); + gvec_ = std::make_shared(pw_cutoff(), *gvec_coarse_); + gvec_fft_ = std::make_shared(*gvec_, comm_fft(), comm_ortho_fft()); auto spl_z = split_fft_z(fft_grid_[2], comm_fft()); /* create spfft buffer for fine-grained transform */ spfft_grid_ = std::unique_ptr( new spfft::Grid(fft_grid_[0], fft_grid_[1], fft_grid_[2], - gvec_partition_->zcol_count_fft(), spl_z.local_size(), spfft_pu, -1, + gvec_fft_->zcol_count_fft(), spl_z.local_size(), spfft_pu, -1, comm_fft().mpi_comm(), SPFFT_EXCH_DEFAULT)); #if defined(USE_FP32) spfft_grid_float_ = std::unique_ptr( - new spfft::GridFloat(fft_grid_[0], fft_grid_[1], fft_grid_[2], gvec_partition_->zcol_count_fft(), + new spfft::GridFloat(fft_grid_[0], fft_grid_[1], fft_grid_[2], gvec_fft_->zcol_count_fft(), spl_z.local_size(), spfft_pu, -1, comm_fft().mpi_comm(), SPFFT_EXCH_DEFAULT)); #endif const auto fft_type = gvec().reduced() ? SPFFT_TRANS_R2C : SPFFT_TRANS_C2C; - auto const& gv = gvec_partition_->gvec_array(); + auto const& gv = gvec_fft_->gvec_array(); spfft_transform_.reset(new spfft::Transform(spfft_grid_->create_transform( spfft_pu, fft_type, fft_grid_[0], fft_grid_[1], fft_grid_[2], - spl_z.local_size(), gvec_partition_->gvec_count_fft(), SPFFT_INDEX_TRIPLETS, gv.at(sddk::memory_t::host)))); + spl_z.local_size(), gvec_fft_->gvec_count_fft(), SPFFT_INDEX_TRIPLETS, gv.at(sddk::memory_t::host)))); #if defined(USE_FP32) spfft_transform_float_.reset(new spfft::TransformFloat(spfft_grid_float_->create_transform( spfft_pu, fft_type, fft_grid_[0], fft_grid_[1], fft_grid_[2], spl_z.local_size(), - gvec_partition_->gvec_count_fft(), SPFFT_INDEX_TRIPLETS, gv.at(sddk::memory_t::host)))); + gvec_fft_->gvec_count_fft(), SPFFT_INDEX_TRIPLETS, gv.at(sddk::memory_t::host)))); #endif /* copy G-vectors to GPU; this is done once because Miller indices of G-vectors @@ -1174,7 +1122,9 @@ Simulation_context::update() } } - init_atoms_to_grid_idx(cfg().control().rmt_max()); + if (unit_cell().num_atoms()) { + init_atoms_to_grid_idx(cfg().control().rmt_max()); + } std::pair limits(0, 0); for (int x : {0, 1, 2}) { @@ -1328,12 +1278,12 @@ Simulation_context::update() sddk::memory_pool* mpd{nullptr}; switch (this->processing_unit()) { case sddk::device_t::CPU: { - mp = &mem_pool(sddk::memory_t::host); + mp = &get_memory_pool(sddk::memory_t::host); break; } case sddk::device_t::GPU: { - mp = &mem_pool(sddk::memory_t::host_pinned); - mpd = &mem_pool(sddk::memory_t::device); + mp = &get_memory_pool(sddk::memory_t::host_pinned); + mpd = &get_memory_pool(sddk::memory_t::device); break; } } @@ -1352,17 +1302,17 @@ Simulation_context::update() init_step_function(); } - auto save_config = utils::get_env("SIRIUS_SAVE_CONFIG"); - if (save_config && this->comm().rank() == 0) { + auto save_config = env::save_config(); + if (save_config.size() && this->comm().rank() == 0) { std::string name; - if (*save_config == "all") { + if (save_config == "all") { static int count{0}; std::stringstream s; s << "sirius" << std::setfill('0') << std::setw(6) << count << ".json"; name = s.str(); count++; } else { - name = *save_config; + name = save_config; } std::ofstream fi(name, std::ofstream::out | std::ofstream::trunc); auto conf_dict = this->serialize(); @@ -1442,18 +1392,18 @@ Simulation_context::generate_phase_factors(int iat__, sddk::mdarray("SIRIUS_PRINT_MEMORY_USAGE"); - if (comm().rank() == 0 && ((cfg().control().print_memory_usage() && verbosity() >= 1) || (pmu && *pmu))) { + auto pmu = env::print_memory_usage(); + if (comm().rank() == 0 && ((cfg().control().print_memory_usage() && verbosity() >= 1) || pmu)) { sirius::print_memory_usage(file__, line__); std::vector labels = {"host"}; - std::vector mp = {&this->mem_pool(sddk::memory_t::host)}; + std::vector mp = {&get_memory_pool(sddk::memory_t::host)}; int np{1}; if (processing_unit() == sddk::device_t::GPU) { labels.push_back("host pinned"); labels.push_back("device"); - mp.push_back(&this->mem_pool(sddk::memory_t::host_pinned)); - mp.push_back(&this->mem_pool(sddk::memory_t::device)); + mp.push_back(&get_memory_pool(sddk::memory_t::host_pinned)); + mp.push_back(&get_memory_pool(sddk::memory_t::device)); np = 3; } std::printf("memory pools\n"); @@ -1560,8 +1510,8 @@ Simulation_context::init_step_function() } theta_pw_[0] += 1.0; - std::vector ftmp(gvec_partition().gvec_count_fft()); - this->gvec_partition().scatter_pw_global(&theta_pw_[0], &ftmp[0]); + std::vector ftmp(gvec_fft().gvec_count_fft()); + this->gvec_fft().scatter_pw_global(&theta_pw_[0], &ftmp[0]); spfft().backward(reinterpret_cast(ftmp.data()), SPFFT_PU_HOST); double* theta_ptr = spfft().local_slice_size() == 0 ? nullptr : &theta_[0]; spfft_output(spfft(), theta_ptr); @@ -1569,7 +1519,7 @@ Simulation_context::init_step_function() std::stringstream s; s << "fft_grid = " << fft_grid_[0] << " " << fft_grid_[1] << " " << fft_grid_[2] << std::endl << "spfft().local_slice_size() = " << spfft().local_slice_size() << std::endl - << "gvec_partition().gvec_count_fft() = " << gvec_partition().gvec_count_fft(); + << "gvec_fft().gvec_count_fft() = " << gvec_fft().gvec_count_fft(); RTE_THROW(s); } diff --git a/src/context/simulation_context.hpp b/src/context/simulation_context.hpp index 578082cf5..9820187df 100644 --- a/src/context/simulation_context.hpp +++ b/src/context/simulation_context.hpp @@ -33,6 +33,7 @@ #include "mpi/mpi_grid.hpp" #include "radial/radial_integrals.hpp" #include "utils/utils.hpp" +#include "utils/env.hpp" #include "density/augmentation_operator.hpp" #include "gpu/acc.hpp" #include "symmetry/rotation.hpp" @@ -116,16 +117,16 @@ class Simulation_context : public Simulation_parameters #endif /// G-vectors within the Gmax cutoff. - std::unique_ptr gvec_; + std::shared_ptr gvec_; - std::unique_ptr gvec_partition_; + std::shared_ptr gvec_fft_; /// G-vectors within the 2 * |Gmax^{WF}| cutoff. - std::unique_ptr gvec_coarse_; + std::shared_ptr gvec_coarse_; - std::unique_ptr gvec_coarse_partition_; + std::shared_ptr gvec_coarse_fft_; - std::unique_ptr remap_gvec_; + std::shared_ptr remap_gvec_; /// Creation time of the parameters. timeval start_time_; @@ -232,15 +233,6 @@ class Simulation_context : public Simulation_parameters /// Type of host memory (pagable or page-locked) for the arrays that participate in host-to-device memory copy. sddk::memory_t host_memory_t_{sddk::memory_t::none}; - /// Type of preferred memory for wave-functions and related arrays. - sddk::memory_t preferred_memory_t_{sddk::memory_t::none}; - - /// Type of preferred memory for auxiliary wave-functions of the iterative solver. - sddk::memory_t aux_preferred_memory_t_{sddk::memory_t::none}; - - /// Type of BLAS linear algebra library. - sddk::linalg_t blas_linalg_t_{sddk::linalg_t::none}; - /// Callback function to compute band occupancies. std::function band_occ_callback_{nullptr}; @@ -344,6 +336,15 @@ class Simulation_context : public Simulation_parameters unit_cell_->import(cfg().unit_cell()); } + explicit Simulation_context(nlohmann::json const& dict__) + : comm_(sddk::Communicator::world()) + { + unit_cell_ = std::make_unique(*this, comm_); + start(); + import(dict__); + unit_cell_->import(cfg().unit_cell()); + } + // /// Create a simulation context with world communicator and load parameters from JSON string or JSON file. Simulation_context(std::string const& str__, sddk::Communicator const& comm__) : comm_(comm__) @@ -405,19 +406,34 @@ class Simulation_context : public Simulation_parameters return *unit_cell_; } + /// Return const reference to unit cell object. auto const& unit_cell() const { return *unit_cell_; } + /// Return const reference to Gvec object. auto const& gvec() const { return *gvec_; } - auto const& gvec_partition() const + /// Return shared pointer to Gvec object. + auto gvec_sptr() const + { + return gvec_; + } + + /// Return const reference to Gvec_fft object. + auto const& gvec_fft() const { - return *gvec_partition_; + return *gvec_fft_; + } + + /// Return shared pointer to Gvec_fft object. + auto gvec_fft_sptr() const + { + return gvec_fft_; } auto const& gvec_coarse() const @@ -425,9 +441,14 @@ class Simulation_context : public Simulation_parameters return *gvec_coarse_; } - auto const& gvec_coarse_partition() const + auto const& gvec_coarse_sptr() const + { + return gvec_coarse_; + } + + auto const& gvec_coarse_fft_sptr() const { - return *gvec_coarse_partition_; + return gvec_coarse_fft_; } auto const& remap_gvec() const @@ -724,27 +745,16 @@ class Simulation_context : public Simulation_parameters } /// Type of the host memory for arrays used in linear algebra operations. + /** For CPU execution this is normal host memory, for GPU execution this is pinned memory. */ inline auto host_memory_t() const { return host_memory_t_; } - /// Type of preferred memory for the storage of hpsi, spsi, residuals and and related arrays. - inline auto preferred_memory_t() const - { - return preferred_memory_t_; - } - - /// Type of preferred memory for the storage of auxiliary wave-functions. - inline auto aux_preferred_memory_t() const - { - return aux_preferred_memory_t_; - } - - /// Linear algebra driver for the BLAS operations. - auto blas_linalg_t() const + /// Return the memory type for processing unit. + inline auto processing_unit_memory_t() const { - return blas_linalg_t_; + return (this->processing_unit() == sddk::device_t::CPU) ? sddk::memory_t::host : sddk::memory_t::device; } /// Split local set of G-vectors into chunks. diff --git a/src/context/simulation_parameters.cpp b/src/context/simulation_parameters.cpp index 40507d97a..151234d78 100644 --- a/src/context/simulation_parameters.cpp +++ b/src/context/simulation_parameters.cpp @@ -174,7 +174,6 @@ Simulation_parameters::import(cmd_args const& args__) cfg_.control().gen_evp_solver_name( args__.value("control.gen_evp_solver_name", cfg_.control().gen_evp_solver_name())); cfg_.control().fft_mode(args__.value("control.fft_mode", cfg_.control().fft_mode())); - cfg_.control().memory_usage(args__.value("control.memory_usage", cfg_.control().memory_usage())); cfg_.control().verbosity(args__.value("control.verbosity", cfg_.control().verbosity())); cfg_.control().verification(args__.value("control.verification", cfg_.control().verification())); diff --git a/src/context/simulation_parameters.hpp b/src/context/simulation_parameters.hpp index 62011758d..64f6fc7db 100644 --- a/src/context/simulation_parameters.hpp +++ b/src/context/simulation_parameters.hpp @@ -89,9 +89,6 @@ class Simulation_parameters /// Type of occupation numbers smearing. smearing::smearing_t smearing_{smearing::smearing_t::gaussian}; - /// Storage for various memory pools. - mutable std::map memory_pool_; - /* copy constructor is forbidden */ Simulation_parameters(Simulation_parameters const&) = delete; @@ -160,7 +157,7 @@ class Simulation_parameters void electronic_structure_method(std::string name__); - electronic_structure_method_t electronic_structure_method() const + auto electronic_structure_method() const { return electronic_structure_method_; } @@ -175,7 +172,7 @@ class Simulation_parameters void smearing(std::string name__); - smearing::smearing_t smearing() const + auto smearing() const { return smearing_; } @@ -418,11 +415,6 @@ class Simulation_parameters return cfg().control().cyclic_block_size(); } - //inline void full_potential(const bool value) - //{ - // electronic_structure_method_ = electronic_structure_method_t::full_potential_lapwlo; - //} - bool full_potential() const { return (electronic_structure_method_ == electronic_structure_method_t::full_potential_lapwlo); @@ -515,32 +507,6 @@ class Simulation_parameters cfg_.settings().sht_coverage(sht_coverage__); return cfg_.settings().sht_coverage(); } - - /// Return a reference to a memory pool. - /** A memory pool is created when this function called for the first time. */ - sddk::memory_pool& mem_pool(sddk::memory_t M__) const - { - if (memory_pool_.count(M__) == 0) { - memory_pool_.emplace(M__, sddk::memory_pool(M__)); - } - return memory_pool_.at(M__); - } - - /// Get a default memory pool for a given device. - sddk::memory_pool& mem_pool(sddk::device_t dev__) - { - switch (dev__) { - case sddk::device_t::CPU: { - return mem_pool(sddk::memory_t::host); - break; - } - case sddk::device_t::GPU: { - return mem_pool(sddk::memory_t::device); - break; - } - } - return mem_pool(sddk::memory_t::host); // make compiler happy - } }; }; // namespace sirius diff --git a/src/density/augmentation_operator.cpp b/src/density/augmentation_operator.cpp index b0aa7249d..6eae292da 100644 --- a/src/density/augmentation_operator.cpp +++ b/src/density/augmentation_operator.cpp @@ -260,8 +260,8 @@ Augmentation_operator_gvec_deriv::Augmentation_operator_gvec_deriv(Simulation_pa break; } case sddk::device_t::GPU: { - rlm_g_.allocate(param__.mem_pool(sddk::memory_t::device)).copy_to(sddk::memory_t::device); - rlm_dg_.allocate(param__.mem_pool(sddk::memory_t::device)).copy_to(sddk::memory_t::device); + rlm_g_.allocate(get_memory_pool(sddk::memory_t::device)).copy_to(sddk::memory_t::device); + rlm_dg_.allocate(get_memory_pool(sddk::memory_t::device)).copy_to(sddk::memory_t::device); } } } @@ -276,7 +276,7 @@ void Augmentation_operator_gvec_deriv::prepare(Atom_type const& atom_type__, /* number of beta- radial functions */ int nbrf = atom_type__.mt_radial_basis_size(); - auto& mp = atom_type__.parameters().mem_pool(sddk::memory_t::host); + auto& mp = get_memory_pool(sddk::memory_t::host); ri_values_ = sddk::mdarray(2 * lmax_beta + 1, nbrf * (nbrf + 1) / 2, gvec_.num_gvec_shells_local(), mp); ri_dg_values_ = sddk::mdarray(2 * lmax_beta + 1, nbrf * (nbrf + 1) / 2, gvec_.num_gvec_shells_local(), @@ -321,8 +321,8 @@ void Augmentation_operator_gvec_deriv::prepare(Atom_type const& atom_type__, int gvec_count = gvec_.count(); - gvec_shell_ = sddk::mdarray(gvec_count, atom_type__.parameters().mem_pool(sddk::memory_t::host)); - gvec_cart_ = sddk::mdarray(3, gvec_count, atom_type__.parameters().mem_pool(sddk::memory_t::host)); + gvec_shell_ = sddk::mdarray(gvec_count, get_memory_pool(sddk::memory_t::host)); + gvec_cart_ = sddk::mdarray(3, gvec_count, get_memory_pool(sddk::memory_t::host)); for (int igloc = 0; igloc < gvec_count; igloc++) { auto gvc = gvec_.gvec_cart(igloc); gvec_shell_(igloc) = gvec_.gvec_shell_idx_local(igloc); @@ -347,7 +347,7 @@ void Augmentation_operator_gvec_deriv::prepare(Atom_type const& atom_type__, break; } case sddk::device_t::GPU: { - auto& mpd = atom_type__.parameters().mem_pool(sddk::memory_t::device); + auto& mpd = get_memory_pool(sddk::memory_t::device); ri_values_.allocate(mpd).copy_to(sddk::memory_t::device); ri_dg_values_.allocate(mpd).copy_to(sddk::memory_t::device); idx_.allocate(mpd).copy_to(sddk::memory_t::device); @@ -412,7 +412,7 @@ void Augmentation_operator_gvec_deriv::generate_pw_coeffs(Atom_type const& atom_ break; } case sddk::device_t::GPU: { - auto& mpd = atom_type__.parameters().mem_pool(sddk::memory_t::device); + auto& mpd = get_memory_pool(sddk::memory_t::device); auto gc = gaunt_coefs_->get_full_set_L3(); gc.allocate(mpd).copy_to(sddk::memory_t::device); diff --git a/src/density/density.cpp b/src/density/density.cpp index 73894efe7..08d594c08 100644 --- a/src/density/density.cpp +++ b/src/density/density.cpp @@ -28,7 +28,6 @@ #include "mixer/mixer_functions.hpp" #include "mixer/mixer_factory.hpp" #include "utils/profiler.hpp" -#include "SDDK/wf_inner.hpp" #include "SDDK/serialize_mdarray.hpp" namespace sirius { @@ -87,12 +86,12 @@ Density::Density(Simulation_context& ctx__) /* allocate charge density and magnetization on a coarse grid */ for (int i = 0; i < ctx_.num_mag_dims() + 1; i++) { - rho_mag_coarse_[i] = std::unique_ptr(new spf(ctx_.spfft_coarse(), ctx_.gvec_coarse_partition())); + rho_mag_coarse_[i] = std::unique_ptr(new spf(ctx_.spfft_coarse(), ctx_.gvec_coarse_fft_sptr())); } /* core density of the pseudopotential method */ if (!ctx_.full_potential()) { - rho_pseudo_core_ = std::unique_ptr(new spf(ctx_.spfft(), ctx_.gvec_partition())); + rho_pseudo_core_ = std::unique_ptr(new spf(ctx_.spfft(), ctx_.gvec_fft_sptr())); } l_by_lm_ = utils::l_by_lm(ctx_.lmax_rho()); @@ -129,7 +128,7 @@ Density::update() double Density::core_leakage() const { - double sum = 0.0; + double sum{0}; for (int ic = 0; ic < unit_cell_.num_atom_symmetry_classes(); ic++) { sum += core_leakage(ic) * unit_cell_.atom_symmetry_class(ic).num_atoms(); } @@ -579,9 +578,117 @@ Density::generate_paw_loc_density() } } +/// Compute non-magnetic or up- or dn- contribution of the wave-functions to the charge density. +template +static void +add_k_point_contribution_rg_collinear(spfft_transform_type& fft__, int ispn__, T w__, T const* inp_wf__, int nr__, + bool gamma__, sddk::mdarray& density_rg__) +{ + /* transform to real space */ + fft__.backward(inp_wf__, fft__.processing_unit()); + + /* location of the real-space wave-functions psi(r) */ + auto data_ptr = fft__.space_domain_data(fft__.processing_unit()); + + switch (fft__.processing_unit()) { + case SPFFT_PU_HOST: { + if (gamma__) { + #pragma omp parallel for + for (int ir = 0; ir < nr__; ir++) { + density_rg__(ir, ispn__) += w__ * std::pow(data_ptr[ir], 2); + } + } else { + auto data = reinterpret_cast*>(data_ptr); + #pragma omp parallel for + for (int ir = 0; ir < nr__; ir++) { + auto z = data[ir]; + density_rg__(ir, ispn__) += w__ * (std::pow(z.real(), 2) + std::pow(z.imag(), 2)); + } + } + break; + } + case SPFFT_PU_GPU: { +#if defined(SIRIUS_GPU) + if (gamma__) { + update_density_rg_1_real_gpu(nr__, data_ptr, w__, density_rg__.at(sddk::memory_t::device, 0, ispn__)); + } else { + auto data = reinterpret_cast*>(data_ptr); + update_density_rg_1_complex_gpu(nr__, data, w__, density_rg__.at(sddk::memory_t::device, 0, ispn__)); + } +#endif + break; + } + } +} + +/// Compute contribution to density and megnetisation from the 2-component spinor wave-functions. +template +static +void add_k_point_contribution_rg_noncollinear(spfft_transform_type& fft__, T w__, T const* inp_wf_up__, + T const* inp_wf_dn__, int nr__, sddk::mdarray, 1>& psi_r_up__, sddk::mdarray& density_rg__) +{ + /* location of the real-space wave-functions psi(r) */ + auto data_ptr = fft__.space_domain_data(fft__.processing_unit()); + + /* transform up- component to real space */ + fft__.backward(inp_wf_up__, fft__.processing_unit()); + + /* this is a non-collinear case, so the wave-functions and FFT buffer are complex */ + switch (fft__.processing_unit()) { + case SPFFT_PU_HOST: { + auto inp = reinterpret_cast*>(data_ptr); + std::copy(inp, inp + nr__, psi_r_up__.at(sddk::memory_t::host)); + break; + } + case SPFFT_PU_GPU: { + acc::copy(psi_r_up__.at(sddk::memory_t::device), reinterpret_cast*>(data_ptr), nr__); + break; + } + } + + /* transform to real space */ + fft__.backward(inp_wf_dn__, fft__.processing_unit()); + + /* alias for dn- component of wave-functions */ + auto psi_r_dn = reinterpret_cast*>(data_ptr); + auto& psi_r_up = psi_r_up__; + + switch (fft__.processing_unit()) { + case SPFFT_PU_HOST: { + #pragma omp parallel for + for (int ir = 0; ir < nr__; ir++) { + auto r0 = (std::pow(psi_r_up[ir].real(), 2) + std::pow(psi_r_up[ir].imag(), 2)) * w__; + auto r1 = (std::pow(psi_r_dn[ir].real(), 2) + std::pow(psi_r_dn[ir].imag(), 2)) * w__; + + auto z2 = psi_r_up[ir] * std::conj(psi_r_dn[ir]) * std::complex(w__, 0); + + density_rg__(ir, 0) += r0; + density_rg__(ir, 1) += r1; + density_rg__(ir, 2) += 2.0 * std::real(z2); + density_rg__(ir, 3) -= 2.0 * std::imag(z2); + } + break; + } + case SPFFT_PU_GPU: { +#ifdef SIRIUS_GPU + /* add up-up contribution */ + update_density_rg_1_complex_gpu(nr__, psi_r_up.at(sddk::memory_t::device), w__, + density_rg__.at(sddk::memory_t::device, 0, 0)); + /* add dn-dn contribution */ + update_density_rg_1_complex_gpu(nr__, psi_r_dn, w__, density_rg__.at(sddk::memory_t::device, 0, 1)); + /* add off-diagonal contribution */ + update_density_rg_2_gpu(nr__, psi_r_up.at(sddk::memory_t::device), psi_r_dn, w__, + density_rg__.at(sddk::memory_t::device, 0, 2), + density_rg__.at(sddk::memory_t::device, 0, 3)); +#endif + break; + } + } +} + template void -Density::add_k_point_contribution_rg(K_point* kp__) +Density::add_k_point_contribution_rg(K_point* kp__, std::array, 2>& wf_fft__) { PROFILE("sirius::Density::add_k_point_contribution_rg"); @@ -593,139 +700,53 @@ Density::add_k_point_contribution_rg(K_point* kp__) int nr = fft.local_slice_size(); /* get preallocated memory */ - sddk::mdarray density_rg(nr, ctx_.num_mag_dims() + 1, ctx_.mem_pool(sddk::memory_t::host), "density_rg"); + sddk::mdarray density_rg(nr, ctx_.num_mag_dims() + 1, get_memory_pool(sddk::memory_t::host), "density_rg"); density_rg.zero(); if (fft.processing_unit() == SPFFT_PU_GPU) { - density_rg.allocate(ctx_.mem_pool(sddk::memory_t::device)).zero(sddk::memory_t::device); + density_rg.allocate(get_memory_pool(sddk::memory_t::device)).zero(sddk::memory_t::device); } - /* location of the real-space wave-functions psi(r) */ - auto data_ptr = kp__->spfft_transform().space_domain_data(kp__->spfft_transform().processing_unit()); - /* non-magnetic or collinear case */ if (ctx_.num_mag_dims() != 3) { /* loop over pure spinor components */ for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { - /* trivial case */ - if (!kp__->spinor_wave_functions().pw_coeffs(ispn).spl_num_col().global_index_size()) { - continue; - } - int ncols = kp__->spinor_wave_functions().pw_coeffs(ispn).spl_num_col().local_size(); - for (int i = 0; i < ncols; i++) { - /* global index of the band */ - int j = kp__->spinor_wave_functions().pw_coeffs(ispn).spl_num_col()[i]; - double w = kp__->band_occupancy(j, ispn) * kp__->weight() / omega; - - auto inp_wf = kp__->spinor_wave_functions().pw_coeffs(ispn).extra().at(sddk::memory_t::host, 0, i); - - /* transform to real space */ - kp__->spfft_transform().backward(reinterpret_cast(inp_wf), - kp__->spfft_transform().processing_unit()); - - switch (kp__->spfft_transform().processing_unit()) { - case SPFFT_PU_HOST: { - if (ctx_.gamma_point()) { - #pragma omp parallel for schedule(static) - for (int ir = 0; ir < nr; ir++) { - density_rg(ir, ispn) += w * std::pow(data_ptr[ir], 2); - } - } else { - auto data = reinterpret_cast*>(data_ptr); - #pragma omp parallel for schedule(static) - for (int ir = 0; ir < nr; ir++) { - auto z = data[ir]; - density_rg(ir, ispn) += w * (std::pow(z.real(), 2) + std::pow(z.imag(), 2)); - } - } - break; - } - case SPFFT_PU_GPU: { -#if defined(SIRIUS_GPU) - if (ctx_.gamma_point()) { - update_density_rg_1_real_gpu(nr, data_ptr, w, density_rg.at(sddk::memory_t::device, 0, ispn)); - } else { - auto data = reinterpret_cast*>(data_ptr); - update_density_rg_1_complex_gpu(nr, data, w, density_rg.at(sddk::memory_t::device, 0, ispn)); - } -#endif - break; - } - } + /* where fft-transformed wave-functions are stored */ + auto wf_mem = wf_fft__[ispn].on_device() ? sddk::memory_t::device : sddk::memory_t::host; + /* local number of bands for a fft-distribution */ + int nbnd = wf_fft__[ispn].num_wf_local(); + for (int i = 0; i < nbnd; i++) { + int j = wf_fft__[ispn].spl_num_wf()[i]; + T w = kp__->band_occupancy(j, ispn) * kp__->weight() / omega; + + auto inp_wf = wf_fft__[ispn].pw_coeffs_spfft(wf_mem, wf::band_index(i)); + + add_k_point_contribution_rg_collinear(kp__->spfft_transform(), ispn, w, inp_wf, nr, ctx_.gamma_point(), density_rg); } - } + } // ispn } else { /* non-collinear case */ - assert(kp__->spinor_wave_functions().pw_coeffs(0).spl_num_col().local_size() == - kp__->spinor_wave_functions().pw_coeffs(1).spl_num_col().local_size()); - /* allocate on CPU or GPU */ - sddk::mdarray, 1> psi_r_up(nr, ctx_.mem_pool(sddk::memory_t::host)); + sddk::mdarray, 1> psi_r_up(nr, get_memory_pool(sddk::memory_t::host)); if (fft.processing_unit() == SPFFT_PU_GPU) { - psi_r_up.allocate(ctx_.mem_pool(sddk::memory_t::device)); - } - for (int i = 0; i < kp__->spinor_wave_functions().pw_coeffs(0).spl_num_col().local_size(); i++) { - int j = kp__->spinor_wave_functions().pw_coeffs(0).spl_num_col()[i]; - T w = kp__->band_occupancy(j, 0) * kp__->weight() / omega; - - /* transform up- component of spinor function to real space; in case of GPU wave-function stays in GPU - * memory */ - auto inp_wf_up = kp__->spinor_wave_functions().pw_coeffs(0).extra().at(sddk::memory_t::host, 0, i); - /* transform to real space */ - kp__->spfft_transform().backward(reinterpret_cast(inp_wf_up), - kp__->spfft_transform().processing_unit()); - - /* this is a non-collinear case, so the wave-functions and FFT buffer are complex and - we can copy memory */ - switch (kp__->spfft_transform().processing_unit()) { - case SPFFT_PU_HOST: { - auto inp = reinterpret_cast*>(data_ptr); - std::copy(inp, inp + nr, psi_r_up.at(sddk::memory_t::host)); - break; - } - case SPFFT_PU_GPU: { - acc::copy(psi_r_up.at(sddk::memory_t::device), reinterpret_cast*>(data_ptr), nr); - break; - } - } + psi_r_up.allocate(get_memory_pool(sddk::memory_t::device)); + } - /* transform dn- component of spinor wave function */ - auto inp_wf_dn = kp__->spinor_wave_functions().pw_coeffs(1).extra().at(sddk::memory_t::host, 0, i); - kp__->spfft_transform().backward(reinterpret_cast(inp_wf_dn), - kp__->spfft_transform().processing_unit()); + RTE_ASSERT(wf_fft__[0].num_wf_local() == wf_fft__[1].num_wf_local()); - auto psi_r_dn = reinterpret_cast*>(data_ptr); + int nbnd = wf_fft__[0].num_wf_local(); + for (int i = 0; i < nbnd; i++) { + int j = wf_fft__[0].spl_num_wf()[i]; + T w = kp__->band_occupancy(j, 0) * kp__->weight() / omega; - switch (fft.processing_unit()) { - case SPFFT_PU_HOST: { - #pragma omp parallel for schedule(static) - for (int ir = 0; ir < nr; ir++) { - auto r0 = (std::pow(psi_r_up[ir].real(), 2) + std::pow(psi_r_up[ir].imag(), 2)) * w; - auto r1 = (std::pow(psi_r_dn[ir].real(), 2) + std::pow(psi_r_dn[ir].imag(), 2)) * w; + auto wf_mem_up = wf_fft__[0].on_device() ? sddk::memory_t::device : sddk::memory_t::host; + auto wf_mem_dn = wf_fft__[1].on_device() ? sddk::memory_t::device : sddk::memory_t::host; - auto z2 = psi_r_up[ir] * std::conj(psi_r_dn[ir]) * w; + /* up- and dn- components */ + auto inp_wf_up = wf_fft__[0].pw_coeffs_spfft(wf_mem_up, wf::band_index(i)); + auto inp_wf_dn = wf_fft__[1].pw_coeffs_spfft(wf_mem_dn, wf::band_index(i)); - density_rg(ir, 0) += r0; - density_rg(ir, 1) += r1; - density_rg(ir, 2) += 2.0 * std::real(z2); - density_rg(ir, 3) -= 2.0 * std::imag(z2); - } - break; - } - case SPFFT_PU_GPU: { -#ifdef SIRIUS_GPU - /* add up-up contribution */ - update_density_rg_1_complex_gpu(nr, psi_r_up.at(sddk::memory_t::device), w, - density_rg.at(sddk::memory_t::device, 0, 0)); - /* add dn-dn contribution */ - update_density_rg_1_complex_gpu(nr, psi_r_dn, w, density_rg.at(sddk::memory_t::device, 0, 1)); - /* add off-diagonal contribution */ - update_density_rg_2_gpu(nr, psi_r_up.at(sddk::memory_t::device), psi_r_dn, w, - density_rg.at(sddk::memory_t::device, 0, 2), - density_rg.at(sddk::memory_t::device, 0, 3)); -#endif - break; - } - } + add_k_point_contribution_rg_noncollinear(kp__->spfft_transform(), w, inp_wf_up, inp_wf_dn, nr, psi_r_up, + density_rg); } } @@ -736,23 +757,23 @@ Density::add_k_point_contribution_rg(K_point* kp__) /* switch from real density matrix to density and magnetization */ switch (ctx_.num_mag_dims()) { case 3: { - #pragma omp parallel for schedule(static) - for (int ir = 0; ir < fft.local_slice_size(); ir++) { + #pragma omp parallel for + for (int ir = 0; ir < nr; ir++) { rho_mag_coarse_[2]->f_rg(ir) += density_rg(ir, 2); // Mx rho_mag_coarse_[3]->f_rg(ir) += density_rg(ir, 3); // My } } case 1: { - #pragma omp parallel for schedule(static) - for (int ir = 0; ir < fft.local_slice_size(); ir++) { + #pragma omp parallel for + for (int ir = 0; ir < nr; ir++) { rho_mag_coarse_[0]->f_rg(ir) += (density_rg(ir, 0) + density_rg(ir, 1)); // rho rho_mag_coarse_[1]->f_rg(ir) += (density_rg(ir, 0) - density_rg(ir, 1)); // Mz } break; } case 0: { - #pragma omp parallel for schedule(static) - for (int ir = 0; ir < fft.local_slice_size(); ir++) { + #pragma omp parallel for + for (int ir = 0; ir < nr; ir++) { rho_mag_coarse_[0]->f_rg(ir) += density_rg(ir, 0); // rho } } @@ -760,314 +781,263 @@ Density::add_k_point_contribution_rg(K_point* kp__) } template -void -Density::add_k_point_contribution_dm(K_point>* kp__, sddk::mdarray& density_matrix__) +static void +add_k_point_contribution_dm_fplapw(Simulation_context const& ctx__, K_point const& kp__, + sddk::mdarray, 4>& density_matrix__) { - PROFILE("sirius::Density::add_k_point_contribution_dm"); + PROFILE("sirius::add_k_point_contribution_dm_fplapw"); - if (ctx_.full_potential()) { - /* non-magnetic or spin-collinear case */ - if (ctx_.num_mag_dims() != 3) { - for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { - int nbnd = kp__->num_occupied_bands(ispn); - if (nbnd) { - sddk::mdarray wf1(unit_cell_.max_mt_basis_size(), nbnd); - sddk::mdarray wf2(unit_cell_.max_mt_basis_size(), nbnd); - - for (int ialoc = 0; ialoc < kp__->spinor_wave_functions().spl_num_atoms().local_size(); ialoc++) { - int ia = kp__->spinor_wave_functions().spl_num_atoms()[ialoc]; - int mt_basis_size = unit_cell_.atom(ia).type().mt_basis_size(); - int offset_wf = kp__->spinor_wave_functions().offset_mt_coeffs(ialoc); - if (mt_basis_size != 0) { - for (int i = 0; i < nbnd; i++) { - for (int xi = 0; xi < mt_basis_size; xi++) { - auto c = kp__->spinor_wave_functions().mt_coeffs(ispn).prime(offset_wf + xi, i); - wf1(xi, i) = std::conj(c); - wf2(xi, i) = - static_cast(c) * kp__->band_occupancy(i, ispn) * kp__->weight(); - } - } - /* add |psi_j> n_j ::one(), &wf1(0, 0), wf1.ld(), &wf2(0, 0), wf2.ld(), - &sddk::linalg_const::one(), - density_matrix__.at(sddk::memory_t::host, 0, 0, ispn, ia), density_matrix__.ld()); - } - } - } - } - } else { - int nbnd = kp__->num_occupied_bands(); - if (nbnd) { - sddk::mdarray wf1(unit_cell_.max_mt_basis_size(), nbnd, ctx_.num_spins()); - sddk::mdarray wf2(unit_cell_.max_mt_basis_size(), nbnd, ctx_.num_spins()); - - for (int ialoc = 0; ialoc < kp__->spinor_wave_functions().spl_num_atoms().local_size(); ialoc++) { - int ia = kp__->spinor_wave_functions().spl_num_atoms()[ialoc]; - int mt_basis_size = unit_cell_.atom(ia).type().mt_basis_size(); - int offset_wf = kp__->spinor_wave_functions().offset_mt_coeffs(ialoc); - - if (mt_basis_size != 0) { - for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { - for (int i = 0; i < nbnd; i++) { - - for (int xi = 0; xi < mt_basis_size; xi++) { - auto c = kp__->spinor_wave_functions().mt_coeffs(ispn).prime(offset_wf + xi, i); - wf1(xi, i, ispn) = std::conj(c); - wf2(xi, i, ispn) = - static_cast(c) * kp__->band_occupancy(i, 0) * kp__->weight(); - } - } - } - /* compute diagonal terms */ - for (int ispn = 0; ispn < 2; ispn++) { - sddk::linalg(sddk::linalg_t::blas) - .gemm('N', 'T', mt_basis_size, mt_basis_size, nbnd, - &sddk::linalg_const::one(), &wf1(0, 0, ispn), wf1.ld(), - &wf2(0, 0, ispn), wf2.ld(), &sddk::linalg_const::one(), - density_matrix__.at(sddk::memory_t::host, 0, 0, ispn, ia), density_matrix__.ld()); - } - /* offdiagonal term */ - sddk::linalg(sddk::linalg_t::blas) - .gemm('N', 'T', mt_basis_size, mt_basis_size, nbnd, &sddk::linalg_const::one(), - &wf1(0, 0, 1), wf1.ld(), &wf2(0, 0, 0), wf2.ld(), - &sddk::linalg_const::one(), - density_matrix__.at(sddk::memory_t::host, 0, 0, 2, ia), density_matrix__.ld()); - } + auto& uc = ctx__.unit_cell(); + + sddk::mdarray, 3> wf1(uc.max_mt_basis_size(), ctx__.num_bands(), ctx__.num_spins()); + sddk::mdarray, 3> wf2(uc.max_mt_basis_size(), ctx__.num_bands(), ctx__.num_spins()); + + auto one = sddk::linalg_const>::one(); + + /* add |psi_j> n_j >(z) * kp__.band_occupancy(j, ispn) * kp__.weight(); } } } - } else { /* pseudopotential */ - if (!ctx_.unit_cell().mt_lo_basis_size()) { - return; - } - - kp__->beta_projectors().prepare(); - - if (ctx_.num_mag_dims() != 3) { - for (int chunk = 0; chunk < kp__->beta_projectors().num_chunks(); chunk++) { - kp__->beta_projectors().generate(chunk); - - for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { - /* total number of occupied bands for this spin */ - int nbnd = kp__->num_occupied_bands(ispn); - /* compute */ - auto beta_psi = - kp__->beta_projectors().template inner(chunk, kp__->spinor_wave_functions(), ispn, 0, nbnd); - - /* number of beta projectors */ - int nbeta = kp__->beta_projectors().chunk(chunk).num_beta_; - - /* use communicator of the k-point to split band index */ - sddk::splindex spl_nbnd(nbnd, kp__->comm().size(), kp__->comm().rank()); - - int nbnd_loc = spl_nbnd.local_size(); - if (nbnd_loc) { // TODO: this part can also be moved to GPU - #pragma omp parallel - { - /* auxiliary arrays */ - sddk::mdarray bp1(nbeta, nbnd_loc); - sddk::mdarray bp2(nbeta, nbnd_loc); - #pragma omp for - for (int ia = 0; ia < kp__->beta_projectors().chunk(chunk).num_atoms_; ia++) { - int nbf = kp__->beta_projectors().chunk(chunk).desc_( - static_cast(beta_desc_idx::nbf), ia); - if (!nbf) { - continue; - } - int offs = kp__->beta_projectors().chunk(chunk).desc_( - static_cast(beta_desc_idx::offset), ia); - int ja = - kp__->beta_projectors().chunk(chunk).desc_(static_cast(beta_desc_idx::ia), ia); - - for (int i = 0; i < nbnd_loc; i++) { - int j = spl_nbnd[i]; - - for (int xi = 0; xi < nbf; xi++) { - bp1(xi, i) = beta_psi(offs + xi, j); - bp2(xi, i) = - std::conj(bp1(xi, i)) * kp__->weight() * kp__->band_occupancy(j, ispn); - } - } - - sddk::linalg(sddk::linalg_t::blas) - .gemm('N', 'T', nbf, nbf, nbnd_loc, &sddk::linalg_const::one(), - &bp1(0, 0), bp1.ld(), &bp2(0, 0), bp2.ld(), - &sddk::linalg_const::one(), &density_matrix__(0, 0, ispn, ja), - density_matrix__.ld()); - } - } + + /* compute diagonal terms */ + for (int ispn = 0; ispn < ctx__.num_spins(); ispn++) { + sddk::linalg(sddk::linalg_t::blas).gemm('N', 'T', mt_basis_size, mt_basis_size, + kp__.num_occupied_bands(ispn), &one, &wf1(0, 0, ispn), wf1.ld(), &wf2(0, 0, ispn), wf2.ld(), &one, + density_matrix__.at(sddk::memory_t::host, 0, 0, ispn, ia), density_matrix__.ld()); + } + /* offdiagonal term */ + if (ctx__.num_mag_dims() == 3) { + sddk::linalg(sddk::linalg_t::blas).gemm('N', 'T', mt_basis_size, mt_basis_size, kp__.num_occupied_bands(), + &one, &wf1(0, 0, 0), wf1.ld(), &wf2(0, 0, 1), wf2.ld(), &one, + density_matrix__.at(sddk::memory_t::host, 0, 0, 2, ia), density_matrix__.ld()); + } + } +} + +template +static void +add_k_point_contribution_dm_pwpp_collinear(Simulation_context const& ctx__, K_point& kp__, int ichunk__, + sddk::mdarray& density_matrix__) +{ + /* number of beta projectors */ + int nbeta = kp__.beta_projectors().chunk(ichunk__).num_beta_; + + for (int ispn = 0; ispn < ctx__.num_spins(); ispn++) { + /* total number of occupied bands for this spin */ + int nbnd = kp__.num_occupied_bands(ispn); + /* compute */ + auto beta_psi = kp__.beta_projectors().template inner(ctx__.processing_unit_memory_t(), ichunk__, + kp__.spinor_wave_functions(), wf::spin_index(ispn), wf::band_range(0, nbnd)); + + /* use communicator of the k-point to split band index */ + sddk::splindex spl_nbnd(nbnd, kp__.comm().size(), kp__.comm().rank()); + + int nbnd_loc = spl_nbnd.local_size(); + if (nbnd_loc) { // TODO: this part can also be moved to GPU + #pragma omp parallel + { + /* auxiliary arrays */ + sddk::mdarray bp1(nbeta, nbnd_loc); + sddk::mdarray bp2(nbeta, nbnd_loc); + #pragma omp for + for (int ia = 0; ia < kp__.beta_projectors().chunk(ichunk__).num_atoms_; ia++) { + int nbf = kp__.beta_projectors().chunk(ichunk__).desc_(beta_desc_idx::nbf, ia); + if (!nbf) { + continue; + } + int offs = kp__.beta_projectors().chunk(ichunk__).desc_(beta_desc_idx::offset, ia); + int ja = kp__.beta_projectors().chunk(ichunk__).desc_(beta_desc_idx::ia, ia); + + for (int i = 0; i < nbnd_loc; i++) { + /* global index of band */ + int j = spl_nbnd[i]; + + for (int xi = 0; xi < nbf; xi++) { + bp1(xi, i) = beta_psi(offs + xi, j); + bp2(xi, i) = std::conj(bp1(xi, i)) * kp__.weight() * kp__.band_occupancy(j, ispn); } } + + sddk::linalg(sddk::linalg_t::blas) + .gemm('N', 'T', nbf, nbf, nbnd_loc, &sddk::linalg_const::one(), + &bp1(0, 0), bp1.ld(), &bp2(0, 0), bp2.ld(), + &sddk::linalg_const::one(), &density_matrix__(0, 0, ispn, ja), + density_matrix__.ld()); } - } else { - for (int chunk = 0; chunk < kp__->beta_projectors().num_chunks(); chunk++) { - kp__->beta_projectors().generate(chunk); + } + } + } // ispn +} - /* number of beta projectors */ - int nbeta = kp__->beta_projectors().chunk(chunk).num_beta_; +template +static void +add_k_point_contribution_dm_pwpp_noncollinear(Simulation_context const& ctx__, K_point& kp__, int ichunk__, + sddk::mdarray& density_matrix__) +{ + /* number of beta projectors */ + int nbeta = kp__.beta_projectors().chunk(ichunk__).num_beta_; - /* total number of occupied bands */ - int nbnd = kp__->num_occupied_bands(); + /* total number of occupied bands */ + int nbnd = kp__.num_occupied_bands(); - sddk::splindex spl_nbnd(nbnd, kp__->comm().size(), kp__->comm().rank()); - int nbnd_loc = spl_nbnd.local_size(); + sddk::splindex spl_nbnd(nbnd, kp__.comm().size(), kp__.comm().rank()); + int nbnd_loc = spl_nbnd.local_size(); - /* auxiliary arrays */ - sddk::mdarray bp1(nbeta, nbnd_loc, ctx_.num_spins()); - sddk::mdarray bp2(nbeta, nbnd_loc, ctx_.num_spins()); + /* auxiliary arrays */ + sddk::mdarray bp1(nbeta, nbnd_loc, ctx__.num_spins()); + sddk::mdarray bp2(nbeta, nbnd_loc, ctx__.num_spins()); - for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { - /* compute */ - auto beta_psi = - kp__->beta_projectors().template inner(chunk, kp__->spinor_wave_functions(), ispn, 0, nbnd); - #pragma omp parallel for schedule(static) - for (int i = 0; i < nbnd_loc; i++) { - int j = spl_nbnd[i]; + auto& uc = ctx__.unit_cell(); + + for (int ispn = 0; ispn < ctx__.num_spins(); ispn++) { + /* compute */ + auto beta_psi = kp__.beta_projectors().template inner(ctx__.processing_unit_memory_t(), ichunk__, + kp__.spinor_wave_functions(), wf::spin_index(ispn), wf::band_range(0, nbnd)); + #pragma omp parallel for schedule(static) + for (int i = 0; i < nbnd_loc; i++) { + int j = spl_nbnd[i]; - for (int m = 0; m < nbeta; m++) { - bp1(m, i, ispn) = beta_psi(m, j); - bp2(m, i, ispn) = static_cast(std::conj(beta_psi(m, j))) * kp__->weight() * - kp__->band_occupancy(j, 0); + for (int m = 0; m < nbeta; m++) { + bp1(m, i, ispn) = beta_psi(m, j); + bp2(m, i, ispn) = std::conj(beta_psi(m, j)); + bp2(m, i, ispn) *= kp__.weight() * kp__.band_occupancy(j, 0); + } + } + } + for (int ia = 0; ia < kp__.beta_projectors().chunk(ichunk__).num_atoms_; ia++) { + int nbf = kp__.beta_projectors().chunk(ichunk__).desc_(beta_desc_idx::nbf, ia); + if (!nbf) { + continue; + } + int offs = kp__.beta_projectors().chunk(ichunk__).desc_(beta_desc_idx::offset, ia); + int ja = kp__.beta_projectors().chunk(ichunk__).desc_(beta_desc_idx::ia, ia); + if (uc.atom(ja).type().spin_orbit_coupling()) { + sddk::mdarray bp3(nbf, nbnd_loc, 2); + bp3.zero(); + /* We already have the but we need to rotate + * them when the spin orbit interaction is included in the + * pseudo potential. + * + * We rotate \f[\langle\beta|\psi\rangle\f] accordingly by multiplying it with + * the \f[f^{\sigma\sigma^{'}}_{\xi,\xi^'}\f] + */ + + for (int xi1 = 0; xi1 < nbf; xi1++) { + for (int i = 0; i < nbnd_loc; i++) { + for (int xi1p = 0; xi1p < nbf; xi1p++) { + if (uc.atom(ja).type().compare_index_beta_functions(xi1, xi1p)) { + bp3(xi1, i, 0) += + bp1(offs + xi1p, i, 0) * + uc.atom(ja).type().f_coefficients(xi1, xi1p, 0, 0) + + bp1(offs + xi1p, i, 1) * + uc.atom(ja).type().f_coefficients(xi1, xi1p, 0, 1); + bp3(xi1, i, 1) += + bp1(offs + xi1p, i, 0) * + uc.atom(ja).type().f_coefficients(xi1, xi1p, 1, 0) + + bp1(offs + xi1p, i, 1) * + uc.atom(ja).type().f_coefficients(xi1, xi1p, 1, 1); } } } - for (int ia = 0; ia < kp__->beta_projectors().chunk(chunk).num_atoms_; ia++) { - int nbf = kp__->beta_projectors().chunk(chunk).desc_(static_cast(beta_desc_idx::nbf), ia); - if (!nbf) { - continue; - } - int offs = kp__->beta_projectors().chunk(chunk).desc_(static_cast(beta_desc_idx::offset), ia); - int ja = kp__->beta_projectors().chunk(chunk).desc_(static_cast(beta_desc_idx::ia), ia); - if (ctx_.unit_cell().atom(ja).type().spin_orbit_coupling()) { - sddk::mdarray bp3(nbf, nbnd_loc, 2); - bp3.zero(); - /* We already have the but we need to rotate - * them when the spin orbit interaction is included in the - * pseudo potential. - * - * We rotate \f[\langle\beta|\psi\rangle\f] accordingly by multiplying it with - * the \f[f^{\sigma\sigma^{'}}_{\xi,\xi^'}\f] - */ - - for (int xi1 = 0; xi1 < nbf; xi1++) { - for (int i = 0; i < nbnd_loc; i++) { - for (int xi1p = 0; xi1p < nbf; xi1p++) { - if (ctx_.unit_cell().atom(ja).type().compare_index_beta_functions(xi1, xi1p)) { - bp3(xi1, i, 0) += - bp1(offs + xi1p, i, 0) * - ctx_.unit_cell().atom(ja).type().f_coefficients(xi1, xi1p, 0, 0) + - bp1(offs + xi1p, i, 1) * - ctx_.unit_cell().atom(ja).type().f_coefficients(xi1, xi1p, 0, 1); - bp3(xi1, i, 1) += - bp1(offs + xi1p, i, 0) * - ctx_.unit_cell().atom(ja).type().f_coefficients(xi1, xi1p, 1, 0) + - bp1(offs + xi1p, i, 1) * - ctx_.unit_cell().atom(ja).type().f_coefficients(xi1, xi1p, 1, 1); - } - } - } - } - - for (int xi1 = 0; xi1 < nbf; xi1++) { - for (int i = 0; i < nbnd_loc; i++) { - bp1(offs + xi1, i, 0) = bp3(xi1, i, 0); - bp1(offs + xi1, i, 1) = bp3(xi1, i, 1); - } - } + } - bp3.zero(); - - for (int xi1 = 0; xi1 < nbf; xi1++) { - for (int i = 0; i < nbnd_loc; i++) { - for (int xi1p = 0; xi1p < nbf; xi1p++) { - if (ctx_.unit_cell().atom(ja).type().compare_index_beta_functions(xi1, xi1p)) { - bp3(xi1, i, 0) += - bp2(offs + xi1p, i, 0) * - ctx_.unit_cell().atom(ja).type().f_coefficients(xi1p, xi1, 0, 0) + - bp2(offs + xi1p, i, 1) * - ctx_.unit_cell().atom(ja).type().f_coefficients(xi1p, xi1, 1, 0); - bp3(xi1, i, 1) += - bp2(offs + xi1p, i, 0) * - ctx_.unit_cell().atom(ja).type().f_coefficients(xi1p, xi1, 0, 1) + - bp2(offs + xi1p, i, 1) * - ctx_.unit_cell().atom(ja).type().f_coefficients(xi1p, xi1, 1, 1); - } - } - } - } + for (int xi1 = 0; xi1 < nbf; xi1++) { + for (int i = 0; i < nbnd_loc; i++) { + bp1(offs + xi1, i, 0) = bp3(xi1, i, 0); + bp1(offs + xi1, i, 1) = bp3(xi1, i, 1); + } + } - for (int xi1 = 0; xi1 < nbf; xi1++) { - for (int i = 0; i < nbnd_loc; i++) { - bp2(offs + xi1, i, 0) = bp3(xi1, i, 0); - bp2(offs + xi1, i, 1) = bp3(xi1, i, 1); - } + bp3.zero(); + + for (int xi1 = 0; xi1 < nbf; xi1++) { + for (int i = 0; i < nbnd_loc; i++) { + for (int xi1p = 0; xi1p < nbf; xi1p++) { + if (uc.atom(ja).type().compare_index_beta_functions(xi1, xi1p)) { + bp3(xi1, i, 0) += + bp2(offs + xi1p, i, 0) * + uc.atom(ja).type().f_coefficients(xi1p, xi1, 0, 0) + + bp2(offs + xi1p, i, 1) * + uc.atom(ja).type().f_coefficients(xi1p, xi1, 1, 0); + bp3(xi1, i, 1) += + bp2(offs + xi1p, i, 0) * + uc.atom(ja).type().f_coefficients(xi1p, xi1, 0, 1) + + bp2(offs + xi1p, i, 1) * + uc.atom(ja).type().f_coefficients(xi1p, xi1, 1, 1); } } } + } - if (nbnd_loc) { - #pragma omp parallel for - for (int ia = 0; ia < kp__->beta_projectors().chunk(chunk).num_atoms_; ia++) { - int nbf = kp__->beta_projectors().chunk(chunk).desc_(static_cast(beta_desc_idx::nbf), ia); - int offs = - kp__->beta_projectors().chunk(chunk).desc_(static_cast(beta_desc_idx::offset), ia); - int ja = kp__->beta_projectors().chunk(chunk).desc_(static_cast(beta_desc_idx::ia), ia); - /* compute diagonal spin blocks */ - for (int ispn = 0; ispn < 2; ispn++) { - sddk::linalg(sddk::linalg_t::blas) - .gemm('N', 'T', nbf, nbf, nbnd_loc, &sddk::linalg_const::one(), - &bp1(offs, 0, ispn), bp1.ld(), &bp2(offs, 0, ispn), bp2.ld(), - &sddk::linalg_const::one(), &density_matrix__(0, 0, ispn, ja), - density_matrix__.ld()); - } - /* off-diagonal spin block */ - sddk::linalg(sddk::linalg_t::blas) - .gemm('N', 'T', nbf, nbf, nbnd_loc, &sddk::linalg_const::one(), &bp1(offs, 0, 0), - bp1.ld(), &bp2(offs, 0, 1), bp2.ld(), &sddk::linalg_const::one(), - &density_matrix__(0, 0, 2, ja), density_matrix__.ld()); - } + for (int xi1 = 0; xi1 < nbf; xi1++) { + for (int i = 0; i < nbnd_loc; i++) { + bp2(offs + xi1, i, 0) = bp3(xi1, i, 0); + bp2(offs + xi1, i, 1) = bp3(xi1, i, 1); } } } - kp__->beta_projectors().dismiss(); } -} -template <> -void -Density::add_k_point_contribution_dm_real(K_point* kp__, - sddk::mdarray& density_matrix__) -{ - add_k_point_contribution_dm(kp__, density_matrix__); + if (nbnd_loc) { + #pragma omp parallel for + for (int ia = 0; ia < kp__.beta_projectors().chunk(ichunk__).num_atoms_; ia++) { + int nbf = kp__.beta_projectors().chunk(ichunk__).desc_(beta_desc_idx::nbf, ia); + int offs = kp__.beta_projectors().chunk(ichunk__).desc_(beta_desc_idx::offset, ia); + int ja = kp__.beta_projectors().chunk(ichunk__).desc_(beta_desc_idx::ia, ia); + /* compute diagonal spin blocks */ + for (int ispn = 0; ispn < 2; ispn++) { + sddk::linalg(sddk::linalg_t::blas) + .gemm('N', 'T', nbf, nbf, nbnd_loc, &sddk::linalg_const::one(), + &bp1(offs, 0, ispn), bp1.ld(), &bp2(offs, 0, ispn), bp2.ld(), + &sddk::linalg_const::one(), &density_matrix__(0, 0, ispn, ja), + density_matrix__.ld()); + } + /* off-diagonal spin block */ + sddk::linalg(sddk::linalg_t::blas) + .gemm('N', 'T', nbf, nbf, nbnd_loc, &sddk::linalg_const::one(), &bp1(offs, 0, 0), + bp1.ld(), &bp2(offs, 0, 1), bp2.ld(), &sddk::linalg_const::one(), + &density_matrix__(0, 0, 2, ja), density_matrix__.ld()); + } + } } -template <> -void -Density::add_k_point_contribution_dm_complex(K_point* kp__, - sddk::mdarray& density_matrix__) +template +static void +add_k_point_contribution_dm_pwpp(Simulation_context const& ctx__, K_point& kp__, + sddk::mdarray& density_matrix__) { - add_k_point_contribution_dm(kp__, density_matrix__); -} + PROFILE("sirius::add_k_point_contribution_dm_pwpp"); -#if defined(USE_FP32) -template <> -void -Density::add_k_point_contribution_dm_real(K_point* kp__, - sddk::mdarray& density_matrix__) -{ - add_k_point_contribution_dm(kp__, density_matrix__); -} + if (!ctx__.unit_cell().mt_lo_basis_size()) { + return; + } -template <> -void -Density::add_k_point_contribution_dm_complex(K_point* kp__, - sddk::mdarray& density_matrix__) -{ - add_k_point_contribution_dm>(kp__, density_matrix__); + kp__.beta_projectors().prepare(); + + for (int ichunk = 0; ichunk < kp__.beta_projectors().num_chunks(); ichunk++) { + kp__.beta_projectors().generate(ctx__.processing_unit_memory_t(), ichunk); + + if (ctx__.num_mag_dims() != 3) { + add_k_point_contribution_dm_pwpp_collinear(ctx__, kp__, ichunk, density_matrix__); + } else { + add_k_point_contribution_dm_pwpp_noncollinear(ctx__, kp__, ichunk, density_matrix__); + } + } + + kp__.beta_projectors().dismiss(); } -#endif void Density::normalize() @@ -1286,49 +1256,36 @@ Density::generate_valence(K_point_set const& ks__) rho_mag_coarse_[i]->zero(); } + auto mem = ctx_.processing_unit() == sddk::device_t::CPU ? sddk::memory_t::host : sddk::memory_t::device; + /* start the main loop over k-points */ for (int ikloc = 0; ikloc < ks__.spl_num_kpoints().local_size(); ikloc++) { int ik = ks__.spl_num_kpoints(ikloc); auto kp = ks__.get(ik); + std::array, 2> wf_fft; + + std::vector mg; + + mg.emplace_back(kp->spinor_wave_functions().memory_guard(mem, wf::copy_to::device)); + if (ctx_.hubbard_correction()) { + mg.emplace_back(kp->hubbard_wave_functions_S().memory_guard(mem, wf::copy_to::device)); + } + for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { int nbnd = kp->num_occupied_bands(ispn); /* swap wave functions for the FFT transformation */ - kp->spinor_wave_functions().pw_coeffs(ispn).remap_forward(nbnd, 0, &ctx_.mem_pool(sddk::memory_t::host)); - } - - /* - * GPU memory allocation - */ - if (is_device_memory(ctx_.preferred_memory_t())) { - for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { - int nbnd = kp->num_occupied_bands(ispn); - /* allocate GPU memory */ - kp->spinor_wave_functions().pw_coeffs(ispn).prime().allocate(ctx_.mem_pool(sddk::memory_t::device)); - /* copy to GPU */ - kp->spinor_wave_functions().pw_coeffs(ispn).copy_to(sddk::memory_t::device, 0, nbnd); - } - } - if (!ctx_.full_potential() && ctx_.hubbard_correction() && - is_device_memory(kp->hubbard_wave_functions_S().preferred_memory_t())) { - int nwfu = kp->hubbard_wave_functions_S().num_wf(); - for (int ispn = 0; ispn < kp->hubbard_wave_functions_S().num_sc(); ispn++) { - /* allocate GPU memory */ - kp->hubbard_wave_functions_S().pw_coeffs(ispn).prime().allocate(ctx_.mem_pool(sddk::memory_t::device)); - /* copy to GPU */ - kp->hubbard_wave_functions_S().pw_coeffs(ispn).copy_to(sddk::memory_t::device, 0, nwfu); - } - } - - if (ctx_.electronic_structure_method() == electronic_structure_method_t::full_potential_lapwlo) { - add_k_point_contribution_dm_complex(kp, density_matrix_); + wf_fft[ispn] = wf::Wave_functions_fft(kp->gkvec_fft_sptr(), kp->spinor_wave_functions(), + wf::spin_index(ispn), wf::band_range(0, nbnd), wf::shuffle_to::fft_layout); } - if (ctx_.electronic_structure_method() == electronic_structure_method_t::pseudopotential) { + if (ctx_.full_potential()) { + add_k_point_contribution_dm_fplapw(ctx_, *kp, density_matrix_); + } else { if (ctx_.gamma_point() && (ctx_.so_correction() == false)) { - add_k_point_contribution_dm_real(kp, density_matrix_); + add_k_point_contribution_dm_pwpp(ctx_, *kp, density_matrix_); } else { - add_k_point_contribution_dm_complex(kp, density_matrix_); + add_k_point_contribution_dm_pwpp>(ctx_, *kp, density_matrix_); } if (occupation_matrix_) { occupation_matrix_->add_k_point_contribution(*kp); @@ -1336,23 +1293,7 @@ Density::generate_valence(K_point_set const& ks__) } /* add contribution from regular space grid */ - add_k_point_contribution_rg(kp); - - /* - * GPU memory deallocation - */ - if (is_device_memory(ctx_.preferred_memory_t())) { - for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { - /* deallocate GPU memory */ - kp->spinor_wave_functions().pw_coeffs(ispn).deallocate(sddk::memory_t::device); - } - } - if (!ctx_.full_potential() && ctx_.hubbard_correction() && - is_device_memory(kp->hubbard_wave_functions_S().preferred_memory_t())) { - for (int ispn = 0; ispn < kp->hubbard_wave_functions_S().num_sc(); ispn++) { - kp->hubbard_wave_functions_S().pw_coeffs(ispn).deallocate(sddk::memory_t::device); - } - } + add_k_point_contribution_rg(kp, wf_fft); } if (density_matrix_.size()) { @@ -1366,7 +1307,7 @@ Density::generate_valence(K_point_set const& ks__) occupation_matrix_->reduce(); } - auto& comm = ctx_.gvec_coarse_partition().comm_ortho_fft(); + auto& comm = ctx_.gvec_coarse_fft_sptr()->comm_ortho_fft(); for (int j = 0; j < ctx_.num_mag_dims() + 1; j++) { auto ptr = (ctx_.spfft_coarse().local_slice_size() == 0) ? nullptr : &rho_mag_coarse_[j]->f_rg(0); /* reduce arrays; assume that each rank did its own fraction of the density */ @@ -1427,14 +1368,14 @@ Density::generate_rho_aug() auto spl_ngv_loc = ctx_.split_gvec_local(); sddk::mdarray rho_aug(ctx_.gvec().count(), ctx_.num_mag_dims() + 1, - ctx_.mem_pool(sddk::memory_t::host)); + get_memory_pool(sddk::memory_t::host)); switch (ctx_.processing_unit()) { case sddk::device_t::CPU: { rho_aug.zero(sddk::memory_t::host); break; } case sddk::device_t::GPU: { - rho_aug.allocate(ctx_.mem_pool(sddk::memory_t::device)).zero(sddk::memory_t::device); + rho_aug.allocate(get_memory_pool(sddk::memory_t::device)).zero(sddk::memory_t::device); break; } } @@ -1443,7 +1384,7 @@ Density::generate_rho_aug() // overlap transfer of Q(G) for two consequtive blocks within one atom type if (ctx_.unit_cell().atom_type(0).augment()) { - ctx_.augmentation_op(0).prepare(stream_id(0), &ctx_.mem_pool(sddk::memory_t::device)); + ctx_.augmentation_op(0).prepare(stream_id(0), &get_memory_pool(sddk::memory_t::device)); } for (int iat = 0; iat < unit_cell_.num_atom_types(); iat++) { @@ -1452,7 +1393,7 @@ Density::generate_rho_aug() if (ctx_.processing_unit() == sddk::device_t::GPU) { acc::sync_stream(stream_id(0)); if (iat + 1 != unit_cell_.num_atom_types() && ctx_.unit_cell().atom_type(iat + 1).augment()) { - ctx_.augmentation_op(iat + 1).prepare(stream_id(0), &ctx_.mem_pool(sddk::memory_t::device)); + ctx_.augmentation_op(iat + 1).prepare(stream_id(0), &get_memory_pool(sddk::memory_t::device)); } } @@ -1473,9 +1414,9 @@ Density::generate_rho_aug() } /* treat auxiliary array as double with x2 size */ sddk::mdarray dm_pw(nbf * (nbf + 1) / 2, spl_ngv_loc.local_size() * 2, - ctx_.mem_pool(sddk::memory_t::host)); + get_memory_pool(sddk::memory_t::host)); sddk::mdarray phase_factors(atom_type.num_atoms(), spl_ngv_loc.local_size() * 2, - ctx_.mem_pool(sddk::memory_t::host)); + get_memory_pool(sddk::memory_t::host)); ctx_.print_memory_usage(__FILE__, __LINE__); @@ -1484,9 +1425,9 @@ Density::generate_rho_aug() break; } case sddk::device_t::GPU: { - phase_factors.allocate(ctx_.mem_pool(sddk::memory_t::device)); - dm_pw.allocate(ctx_.mem_pool(sddk::memory_t::device)); - dm.allocate(ctx_.mem_pool(sddk::memory_t::device)).copy_to(sddk::memory_t::device); + phase_factors.allocate(get_memory_pool(sddk::memory_t::device)); + dm_pw.allocate(get_memory_pool(sddk::memory_t::device)); + dm.allocate(get_memory_pool(sddk::memory_t::device)).copy_to(sddk::memory_t::device); break; } } diff --git a/src/density/density.hpp b/src/density/density.hpp index dae093b3f..988463006 100644 --- a/src/density/density.hpp +++ b/src/density/density.hpp @@ -34,65 +34,46 @@ #include "occupation_matrix.hpp" #if defined(SIRIUS_GPU) -extern "C" void update_density_rg_1_real_gpu_float(int size__, - float const* psi_rg__, - float wt__, - float* density_rg__); - -extern "C" void update_density_rg_1_real_gpu_double(int size__, - double const* psi_rg__, - double wt__, - double* density_rg__); - -extern "C" void update_density_rg_1_complex_gpu_float(int size__, - std::complex const* psi_rg__, - float wt__, - float* density_rg__); - -extern "C" void update_density_rg_1_complex_gpu_double(int size__, - double_complex const* psi_rg__, - double wt__, - double* density_rg__); - -extern "C" void update_density_rg_2_gpu_float(int size__, - std::complex const* psi_rg_up__, - std::complex const* psi_rg_dn__, - float wt__, - float* density_x_rg__, - float* density_y_rg__); - -extern "C" void update_density_rg_2_gpu_double(int size__, - double_complex const* psi_rg_up__, - double_complex const* psi_rg_dn__, - double wt__, - double* density_x_rg__, - double* density_y_rg__); - -extern "C" void generate_dm_pw_gpu(int num_atoms__, - int num_gvec_loc__, - int num_beta__, - double const* atom_pos__, - int const* gvx__, - int const* gvy__, - int const* gvz__, - double* phase_factors__, - double const* dm__, - double* dm_pw__, - int stream_id__); - -extern "C" void sum_q_pw_dm_pw_gpu(int num_gvec_loc__, - int nbf__, - double const* q_pw__, - double const* dm_pw__, - double const* sym_weight__, - double_complex* rho_pw__, - int stream_id__); +extern "C" { + +void +update_density_rg_1_real_gpu_float(int size__, float const* psi_rg__, float wt__, float* density_rg__); + +void +update_density_rg_1_real_gpu_double(int size__, double const* psi_rg__, double wt__, double* density_rg__); + +void +update_density_rg_1_complex_gpu_float(int size__, std::complex const* psi_rg__, float wt__, + float* density_rg__); + +void +update_density_rg_1_complex_gpu_double(int size__, double_complex const* psi_rg__, double wt__, double* density_rg__); + +void +update_density_rg_2_gpu_float(int size__, std::complex const* psi_rg_up__, std::complex const* psi_rg_dn__, + float wt__, float* density_x_rg__, float* density_y_rg__); + +void +update_density_rg_2_gpu_double(int size__, double_complex const* psi_rg_up__, double_complex const* psi_rg_dn__, + double wt__, double* density_x_rg__, double* density_y_rg__); + +void +generate_dm_pw_gpu(int num_atoms__, int num_gvec_loc__, int num_beta__, double const* atom_pos__, + int const* gvx__, int const* gvy__, int const* gvz__, double* phase_factors__, + double const* dm__, double* dm_pw__, int stream_id__); + +void +sum_q_pw_dm_pw_gpu(int num_gvec_loc__, int nbf__, double const* q_pw__, double const* dm_pw__, + double const* sym_weight__, double_complex* rho_pw__, int stream_id__); + +} #endif namespace sirius { /// Use Kuebler's trick to get rho_up and rho_dn from density and magnetisation. -inline std::pair get_rho_up_dn(int num_mag_dims__, double rho__, vector3d mag__) +inline std::pair +get_rho_up_dn(int num_mag_dims__, double rho__, vector3d mag__) { if (rho__ < 0.0) { return std::make_pair(0, 0); @@ -276,19 +257,16 @@ class Density : public Field4D \f] Here \f$ \hat N = \sum_{j{\bf k}} | \Psi_{j{\bf k}} \rangle n_{j{\bf k}} \langle \Psi_{j{\bf k}} | \f$ is the occupancy operator written in spectral representation. - */ - template - void add_k_point_contribution_dm(K_point>* kp__, sddk::mdarray& density_matrix__); - template - void add_k_point_contribution_dm_real(K_point* kp__, sddk::mdarray& density_matrix__); - - template - void add_k_point_contribution_dm_complex(K_point* kp__, sddk::mdarray& density_matrix__); + \tparam T Precision type of wave-functions. + \tparam F Type of the wave-functions inner product (used in pp-pw). + */ + template + void add_k_point_contribution_dm(K_point& kp__, sddk::mdarray& density_matrix__); /// Add k-point contribution to the density and magnetization defined on the regular FFT grid. template - void add_k_point_contribution_rg(K_point* kp__); + void add_k_point_contribution_rg(K_point* kp__, std::array, 2>& wf_fft__); /// Generate valence density in the muffin-tins void generate_valence_mt(); @@ -902,9 +880,9 @@ get_rho_up_dn(Density const& density__, double add_delta_rho_xc__ = 0.0, double int num_points = ctx.spfft().local_slice_size(); auto rho_up = std::unique_ptr>(new - Smooth_periodic_function(ctx.spfft(), ctx.gvec_partition())); + Smooth_periodic_function(ctx.spfft(), ctx.gvec_fft_sptr())); auto rho_dn = std::unique_ptr>(new - Smooth_periodic_function(ctx.spfft(), ctx.gvec_partition())); + Smooth_periodic_function(ctx.spfft(), ctx.gvec_fft_sptr())); /* compute "up" and "dn" components and also check for negative values of density */ double rhomin{0}; diff --git a/src/density/occupation_matrix.cpp b/src/density/occupation_matrix.cpp index e903230c9..e9c2909b9 100644 --- a/src/density/occupation_matrix.cpp +++ b/src/density/occupation_matrix.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2013-2020 Mathieu Taillefumier, Anton Kozhevnikov, Thomas Schulthess +// Copyright (c) 2013-2022 Mathieu Taillefumier, Anton Kozhevnikov, Thomas Schulthess // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are permitted provided that @@ -64,47 +64,40 @@ Occupation_matrix::add_k_point_contribution(K_point& kp__) return; } + PROFILE_START("sirius::Occupation_matrix::add_k_point_contribution"); + sddk::memory_t mem_host{sddk::memory_t::host}; sddk::memory_t mem{sddk::memory_t::host}; sddk::linalg_t la{sddk::linalg_t::blas}; - /* find the appropriate linear algebra provider */ if (ctx_.processing_unit() == sddk::device_t::GPU) { mem = sddk::memory_t::device; mem_host = sddk::memory_t::host_pinned; - if (is_device_memory(ctx_.preferred_memory_t())) { - la = sddk::linalg_t::gpublas; - } else { - la = sddk::linalg_t::spla; - } + la = sddk::linalg_t::gpublas; } - int nwfu = kp__.hubbard_wave_functions_S().num_wf(); + /* a pair of "total number, offests" for the Hubbard orbitals idexing */ + auto r = ctx_.unit_cell().num_hubbard_wf(); + + int nwfu = r.first; - sddk::matrix> occ_mtrx(nwfu, nwfu, ctx_.mem_pool(sddk::memory_t::host), "occ_mtrx"); + sddk::matrix> occ_mtrx(nwfu, nwfu, get_memory_pool(sddk::memory_t::host), "occ_mtrx"); if (is_device_memory(mem)) { - occ_mtrx.allocate(ctx_.mem_pool(mem)); + occ_mtrx.allocate(get_memory_pool(mem)); } - /* a pair of "total number, offests" for the Hubbard orbitals idexing */ - auto r = ctx_.unit_cell().num_hubbard_wf(); - // TODO collnear and non-collinear cases have a lot of similar code; there should be a way to combine it /* full non collinear magnetism */ if (ctx_.num_mag_dims() == 3) { - sddk::dmatrix> dm(kp__.num_occupied_bands(), nwfu, ctx_.mem_pool(mem_host), "dm"); + sddk::dmatrix> dm(kp__.num_occupied_bands(), nwfu, get_memory_pool(mem_host), "dm"); if (is_device_memory(mem)) { - dm.allocate(ctx_.mem_pool(mem)); + dm.allocate(get_memory_pool(mem)); } - sddk::inner(ctx_.spla_context(), sddk::spin_range(2), kp__.spinor_wave_functions(), 0, kp__.num_occupied_bands(), - kp__.hubbard_wave_functions_S(), 0, nwfu, dm, 0, 0); + wf::inner(ctx_.spla_context(), mem, wf::spin_range(0, 2), kp__.spinor_wave_functions(), + wf::band_range(0, kp__.num_occupied_bands()), kp__.hubbard_wave_functions_S(), + wf::band_range(0, nwfu), dm, 0, 0); - // TODO: check if inner() already moved data to CPU - - // if (is_device_memory(mem)) { - // dm.copy_to(memory_t::host); - //} - sddk::dmatrix> dm1(kp__.num_occupied_bands(), nwfu, ctx_.mem_pool(mem_host), "dm1"); + sddk::dmatrix> dm1(kp__.num_occupied_bands(), nwfu, get_memory_pool(mem_host), "dm1"); #pragma omp parallel for for (int m = 0; m < nwfu; m++) { for (int j = 0; j < kp__.num_occupied_bands(); j++) { @@ -112,7 +105,7 @@ Occupation_matrix::add_k_point_contribution(K_point& kp__) } } if (is_device_memory(mem)) { - dm1.allocate(ctx_.mem_pool(mem)).copy_to(mem); + dm1.allocate(get_memory_pool(mem)).copy_to(mem); } /* now compute O_{ij}^{sigma,sigma'} = \sum_{nk} f_{nk} */ @@ -156,18 +149,16 @@ Occupation_matrix::add_k_point_contribution(K_point& kp__) have two. The inner product takes care of this case internally. */ for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { - PROFILE_START("sirius::Occupation_matrix::add_k_point_contribution|1"); - sddk::dmatrix> dm(kp__.num_occupied_bands(ispn), nwfu, ctx_.mem_pool(mem_host), "dm"); + sddk::dmatrix> dm(kp__.num_occupied_bands(ispn), nwfu, get_memory_pool(mem_host), "dm"); if (is_device_memory(mem)) { - dm.allocate(ctx_.mem_pool(mem)); + dm.allocate(get_memory_pool(mem)); } /* compute where |phi> are the Hubbard WFs */ - sddk::inner(ctx_.spla_context(), sddk::spin_range(ispn), kp__.spinor_wave_functions(), 0, - kp__.num_occupied_bands(ispn), kp__.hubbard_wave_functions_S(), 0, nwfu, dm, 0, 0); - PROFILE_STOP("sirius::Occupation_matrix::add_k_point_contribution|1"); + wf::inner(ctx_.spla_context(), mem, wf::spin_range(ispn), kp__.spinor_wave_functions(), + wf::band_range(0, kp__.num_occupied_bands(ispn)), kp__.hubbard_wave_functions_S(), + wf::band_range(0, nwfu), dm, 0, 0); - PROFILE_START("sirius::Occupation_matrix::add_k_point_contribution|2"); - sddk::dmatrix> dm1(kp__.num_occupied_bands(ispn), nwfu, ctx_.mem_pool(mem_host), "dm1"); + sddk::dmatrix> dm1(kp__.num_occupied_bands(ispn), nwfu, get_memory_pool(mem_host), "dm1"); #pragma omp parallel for for (int m = 0; m < nwfu; m++) { for (int j = 0; j < kp__.num_occupied_bands(ispn); j++) { @@ -175,15 +166,13 @@ Occupation_matrix::add_k_point_contribution(K_point& kp__) } } if (is_device_memory(mem)) { - dm1.allocate(ctx_.mem_pool(mem)).copy_to(mem); + dm1.allocate(get_memory_pool(mem)).copy_to(mem); } - PROFILE_STOP("sirius::Occupation_matrix::add_k_point_contribution|2"); /* now compute O_{ij}^{sigma,sigma'} = \sum_{nk} f_{nk} */ /* We need to apply a factor 1/2 when we compute the occupancies for the LDA+U. It is because the * calculations of E and U consider occupancies <= 1. Sirius for the LDA+U has a factor 2 in the * band occupancies. We need to compensate for it because it is taken into account in the * calculation of the hubbard potential */ - PROFILE_START("sirius::Occupation_matrix::add_k_point_contribution|3"); auto alpha = std::complex(kp__.weight() / ctx_.max_occupancy(), 0.0); sddk::linalg(la).gemm('C', 'N', nwfu, nwfu, kp__.num_occupied_bands(ispn), &alpha, dm.at(mem), dm.ld(), dm1.at(mem), dm1.ld(), &sddk::linalg_const>::zero(), occ_mtrx.at(mem), @@ -191,10 +180,8 @@ Occupation_matrix::add_k_point_contribution(K_point& kp__) if (is_device_memory(mem)) { occ_mtrx.copy_to(sddk::memory_t::host); } - PROFILE_STOP("sirius::Occupation_matrix::add_k_point_contribution|3"); - PROFILE_START("sirius::Occupation_matrix::add_k_point_contribution|4"); - #pragma omp parallel for schedule(static) + #pragma omp parallel for for (int at_lvl = 0; at_lvl < static_cast(local_.size()); at_lvl++) { const int ia = atomic_orbitals_[at_lvl].first; auto const& atom = ctx_.unit_cell().atom(ia); @@ -212,9 +199,7 @@ Occupation_matrix::add_k_point_contribution(K_point& kp__) } } } - PROFILE_STOP("sirius::Occupation_matrix::add_k_point_contribution|4"); - PROFILE_START("sirius::Occupation_matrix::add_k_point_contribution|nonloc"); for (auto& e : this->occ_mtrx_T_) { /* e^{-i k T} */ auto z1 = std::exp(double_complex(0, -twopi * dot(e.first, kp__.vk()))); @@ -224,7 +209,6 @@ Occupation_matrix::add_k_point_contribution(K_point& kp__) } } } - PROFILE_STOP("sirius::Occupation_matrix::add_k_point_contribution|nonloc"); } // ispn } } diff --git a/src/density/occupation_matrix.hpp b/src/density/occupation_matrix.hpp index c88df0c54..37420c58f 100644 --- a/src/density/occupation_matrix.hpp +++ b/src/density/occupation_matrix.hpp @@ -23,7 +23,6 @@ */ #include "SDDK/memory.hpp" -#include "SDDK/wf_inner.hpp" #include "k_point/k_point.hpp" #include "hubbard/hubbard_matrix.hpp" diff --git a/src/dft/dft_ground_state.cpp b/src/dft/dft_ground_state.cpp index 012bf8e6a..9250e5101 100644 --- a/src/dft/dft_ground_state.cpp +++ b/src/dft/dft_ground_state.cpp @@ -83,7 +83,7 @@ DFT_ground_state::energy_kin_sum_pw() const for (int ispin = 0; ispin < ctx_.num_spins(); ispin++) { for (int i = 0; i < kp->num_occupied_bands(ispin); i++) { double f = kp->band_occupancy(i, ispin); - auto z = kp->spinor_wave_functions().pw_coeffs(ispin).prime(igloc, i); + auto z = kp->spinor_wave_functions().pw_coeffs(igloc, wf::spin_index(ispin), wf::band_index(i)); d += f * (std::pow(z.real(), 2) + std::pow(z.imag(), 2)); } } @@ -275,8 +275,10 @@ DFT_ground_state::find(double density_tol__, double energy_tol__, double iter_so for (int ikloc = 0; ikloc < kset_.spl_num_kpoints().local_size(); ikloc++) { int ik = kset_.spl_num_kpoints(ikloc); for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { - kset_.get(ik)->spinor_wave_functions().copy_from(sddk::device_t::CPU, ctx_.num_bands(), - kset_.get(ik)->spinor_wave_functions(), ispn, 0, ispn, 0); + wf::copy(sddk::memory_t::host, kset_.get(ik)->spinor_wave_functions(), + wf::spin_index(ispn), wf::band_range(0, ctx_.num_bands()), + kset_.get(ik)->spinor_wave_functions(), wf::spin_index(ispn), + wf::band_range(0, ctx_.num_bands())); } } for (int ik = 0; ik < kset_.num_kpoints(); ik++) { diff --git a/src/function3d/field4d.hpp b/src/function3d/field4d.hpp index 8de68969c..0ae7a069b 100644 --- a/src/function3d/field4d.hpp +++ b/src/function3d/field4d.hpp @@ -30,14 +30,11 @@ #include #include #include "SDDK/memory.hpp" +#include "function3d/periodic_function.hpp" #include "typedefs.hpp" namespace sirius { -/* forward declarations */ -class Simulation_context; -template class Periodic_function; - /// Four-component function consisting of scalar and vector parts. /** This class is used to represents density/magnetisation and potential/magentic filed of the system. */ class Field4D diff --git a/src/function3d/periodic_function.hpp b/src/function3d/periodic_function.hpp index b0951d4fb..11fc7a2a3 100644 --- a/src/function3d/periodic_function.hpp +++ b/src/function3d/periodic_function.hpp @@ -87,7 +87,7 @@ class Periodic_function : public Smooth_periodic_function public: /// Constructor Periodic_function(Simulation_context& ctx__, int angular_domain_size__) - : Smooth_periodic_function(ctx__.spfft>(), ctx__.gvec_partition()) + : Smooth_periodic_function(ctx__.spfft>(), ctx__.gvec_fft_sptr()) , ctx_(ctx__) , unit_cell_(ctx__.unit_cell()) , comm_(ctx__.comm()) @@ -296,7 +296,7 @@ class Periodic_function : public Smooth_periodic_function void hdf5_read(sddk::HDF5_tree h5f__, sddk::mdarray& gvec__) { - std::vector> v(gvec_.num_gvec()); + std::vector> v(gvec_.num_gvec()); h5f__.read("f_pw", reinterpret_cast(v.data()), static_cast(v.size() * 2)); std::map, int> local_gvec_mapping; diff --git a/src/function3d/smooth_periodic_function.hpp b/src/function3d/smooth_periodic_function.hpp index 4403e482c..7f0935977 100644 --- a/src/function3d/smooth_periodic_function.hpp +++ b/src/function3d/smooth_periodic_function.hpp @@ -52,16 +52,16 @@ class Smooth_periodic_function spfft_transform_type* spfft_{nullptr}; /// Distribution of G-vectors. - sddk::Gvec_partition const* gvecp_{nullptr}; + std::shared_ptr gvecp_{nullptr}; /// Function on the regular real-space grid. sddk::mdarray f_rg_; /// Local set of plane-wave expansion coefficients. - sddk::mdarray, 1> f_pw_local_; + sddk::mdarray, 1> f_pw_local_; /// Storage of the PW coefficients for the FFT transformation. - sddk::mdarray, 1> f_pw_fft_; + sddk::mdarray, 1> f_pw_fft_; /// Gather plane-wave coefficients for the subsequent FFT call. inline void gather_f_pw_fft() @@ -79,9 +79,9 @@ class Smooth_periodic_function } /// Constructor. - Smooth_periodic_function(spfft_transform_type& spfft__, sddk::Gvec_partition const& gvecp__, sddk::memory_pool* mp__ = nullptr) + Smooth_periodic_function(spfft_transform_type& spfft__, std::shared_ptr gvecp__, sddk::memory_pool* mp__ = nullptr) : spfft_(&spfft__) - , gvecp_(&gvecp__) + , gvecp_(gvecp__) { if (mp__) { f_rg_ = sddk::mdarray(spfft_->local_slice_size(), *mp__, "Smooth_periodic_function.f_rg_"); @@ -92,25 +92,25 @@ class Smooth_periodic_function f_rg_.zero(); if (mp__) { - f_pw_local_ = sddk::mdarray, 1>(gvecp_->gvec().count(), *mp__, + f_pw_local_ = sddk::mdarray, 1>(gvecp_->gvec().count(), *mp__, "Smooth_periodic_function.f_pw_local_"); } else { - f_pw_local_ = sddk::mdarray, 1>(gvecp_->gvec().count(), sddk::memory_t::host, + f_pw_local_ = sddk::mdarray, 1>(gvecp_->gvec().count(), sddk::memory_t::host, "Smooth_periodic_function.f_pw_local_"); } f_pw_local_.zero(); if (gvecp_->comm_ortho_fft().size() != 1) { if (mp__) { - f_pw_fft_ = sddk::mdarray, 1>(gvecp_->gvec_count_fft(), *mp__, + f_pw_fft_ = sddk::mdarray, 1>(gvecp_->gvec_count_fft(), *mp__, "Smooth_periodic_function.f_pw_fft_"); } else { - f_pw_fft_ = sddk::mdarray, 1>(gvecp_->gvec_count_fft(), sddk::memory_t::host, + f_pw_fft_ = sddk::mdarray, 1>(gvecp_->gvec_count_fft(), sddk::memory_t::host, "Smooth_periodic_function.f_pw_fft_"); } f_pw_fft_.zero(); } else { /* alias to f_pw_local array */ - f_pw_fft_ = sddk::mdarray, 1>(&f_pw_local_[0], gvecp_->gvec().count()); + f_pw_fft_ = sddk::mdarray, 1>(&f_pw_local_[0], gvecp_->gvec().count()); } } Smooth_periodic_function(Smooth_periodic_function&& src__) = default; @@ -142,35 +142,35 @@ class Smooth_periodic_function return f_rg_; } - inline complex_type& f_pw_local(int ig__) + inline std::complex& f_pw_local(int ig__) { return f_pw_local_(ig__); } - inline complex_type const& f_pw_local(int ig__) const + inline std::complex const& f_pw_local(int ig__) const { return f_pw_local_(ig__); } - inline sddk::mdarray, 1>& f_pw_local() + inline sddk::mdarray, 1>& f_pw_local() { return f_pw_local_; } - inline const sddk::mdarray, 1>& f_pw_local() const + inline const sddk::mdarray, 1>& f_pw_local() const { return f_pw_local_; } - inline complex_type& f_pw_fft(int ig__) + inline std::complex& f_pw_fft(int ig__) { return f_pw_fft_(ig__); } /// Return plane-wave coefficient for G=0 component. - inline complex_type f_0() const + inline std::complex f_0() const { - complex_type z; + std::complex z; if (gvecp_->gvec().comm().rank() == 0) { z = f_pw_local_(0); } @@ -196,9 +196,9 @@ class Smooth_periodic_function return gvecp_->gvec(); } - sddk::Gvec_partition const& gvec_partition() const + auto gvec_fft() const { - return *gvecp_; + return gvecp_; } void fft_transform(int direction__) @@ -231,7 +231,7 @@ class Smooth_periodic_function int count = gvecp_->gvec_fft_slab().counts[gvecp_->comm_ortho_fft().rank()]; int offset = gvecp_->gvec_fft_slab().offsets[gvecp_->comm_ortho_fft().rank()]; std::memcpy(f_pw_local_.at(sddk::memory_t::host), f_pw_fft_.at(sddk::memory_t::host, offset), - count * sizeof(complex_type)); + count * sizeof(std::complex)); } break; } @@ -241,17 +241,17 @@ class Smooth_periodic_function } } - inline std::vector> gather_f_pw() + inline std::vector> gather_f_pw() { PROFILE("sirius::Smooth_periodic_function::gather_f_pw"); - std::vector> fpw(gvecp_->gvec().num_gvec()); + std::vector> fpw(gvecp_->gvec().num_gvec()); gvec().comm().allgather(&f_pw_local_[0], fpw.data(), gvec().count(), gvec().offset()); return fpw; } - inline void scatter_f_pw(std::vector> const& f_pw__) + inline void scatter_f_pw(std::vector> const& f_pw__) { std::copy(&f_pw__[gvecp_->gvec().offset()], &f_pw__[gvecp_->gvec().offset()] + gvecp_->gvec().count(), &f_pw_local_(0)); @@ -272,9 +272,9 @@ class Smooth_periodic_function return cs; } - inline complex_type checksum_pw() const + inline auto checksum_pw() const { - complex_type cs = this->f_pw_local_.checksum(); + auto cs = this->f_pw_local_.checksum(); this->gvecp_->gvec().comm().allreduce(&cs, 1); return cs; } @@ -317,7 +317,7 @@ class Smooth_periodic_vector_function : public std::array* spfft_{nullptr}; /// Distribution of G-vectors. - sddk::Gvec_partition const* gvecp_{nullptr}; + std::shared_ptr gvecp_{nullptr}; Smooth_periodic_vector_function(Smooth_periodic_vector_function const& src__) = delete; Smooth_periodic_vector_function& operator=(Smooth_periodic_vector_function const& src__) = delete; @@ -328,9 +328,9 @@ class Smooth_periodic_vector_function : public std::array& spfft__, sddk::Gvec_partition const& gvecp__) + Smooth_periodic_vector_function(spfft_transform_type& spfft__, std::shared_ptr gvecp__) : spfft_(&spfft__) - , gvecp_(&gvecp__) + , gvecp_(gvecp__) { for (int x : {0, 1, 2}) { (*this)[x] = Smooth_periodic_function(spfft__, gvecp__); @@ -345,11 +345,10 @@ class Smooth_periodic_vector_function : public std::array gradient(Smooth_periodic_function& { PROFILE("sirius::gradient"); - Smooth_periodic_vector_function g(f__.spfft(), f__.gvec_partition()); + Smooth_periodic_vector_function g(f__.spfft(), f__.gvec_fft()); #pragma omp parallel for schedule(static) for (int igloc = 0; igloc < f__.gvec().count(); igloc++) { @@ -381,7 +380,7 @@ inline Smooth_periodic_function divergence(Smooth_periodic_vector_function PROFILE("sirius::divergence"); /* resulting scalar function */ - Smooth_periodic_function f(g__.spfft(), g__.gvec_partition()); + Smooth_periodic_function f(g__.spfft(), g__.gvec_fft()); f.zero(); for (int x : {0, 1, 2}) { for (int igloc = 0; igloc < f.gvec().count(); igloc++) { @@ -399,7 +398,7 @@ inline Smooth_periodic_function laplacian(Smooth_periodic_function& f__) { PROFILE("sirius::laplacian"); - Smooth_periodic_function g(f__.spfft(), f__.gvec_partition()); + Smooth_periodic_function g(f__.spfft(), f__.gvec_fft()); #pragma omp parallel for schedule(static) for (int igloc = 0; igloc < f__.gvec().count(); igloc++) { @@ -417,7 +416,7 @@ dot(Smooth_periodic_vector_function& vf__, Smooth_periodic_vector_function { PROFILE("sirius::dot"); - Smooth_periodic_function result(vf__.spfft(), vf__.gvec_partition()); + Smooth_periodic_function result(vf__.spfft(), vf__.gvec_fft()); #pragma omp parallel for schedule(static) for (int ir = 0; ir < vf__.spfft().local_slice_size(); ir++) { diff --git a/src/geometry/force.cpp b/src/geometry/force.cpp index dec47e1af..7be47f2e5 100644 --- a/src/geometry/force.cpp +++ b/src/geometry/force.cpp @@ -97,9 +97,9 @@ void Force::calc_forces_nonloc_aux() auto* kp = kset_.get(spl_num_kp[ikploc]); if (ctx_.gamma_point()) { - add_k_point_contribution(*kp, forces_nonloc_); + add_k_point_contribution(*kp, forces_nonloc_); } else { - add_k_point_contribution>(*kp, forces_nonloc_); + add_k_point_contribution>(*kp, forces_nonloc_); } } @@ -122,42 +122,29 @@ sddk::mdarray const& Force::calc_forces_nonloc() return forces_nonloc_; } -template +template void -Force::add_k_point_contribution(K_point>& kp__, sddk::mdarray& forces__) const +Force::add_k_point_contribution(K_point& kp__, sddk::mdarray& forces__) const { /* if there are no beta projectors then get out there */ if (ctx_.unit_cell().mt_lo_basis_size() == 0) { return; } - Beta_projectors_gradient> bp_grad(ctx_, kp__.gkvec(), kp__.beta_projectors()); - if (is_device_memory(ctx_.preferred_memory_t())) { - int nbnd = ctx_.num_bands(); - for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { - /* allocate GPU memory */ - kp__.spinor_wave_functions().pw_coeffs(ispn).allocate(ctx_.mem_pool(sddk::memory_t::device)); - kp__.spinor_wave_functions().pw_coeffs(ispn).copy_to(sddk::memory_t::device, 0, nbnd); - } - } - - Non_local_functor nlf(ctx_, bp_grad); + Beta_projectors_gradient bp_grad(ctx_, kp__.gkvec(), kp__.beta_projectors()); + auto mem = ctx_.processing_unit_memory_t(); + auto mg = kp__.spinor_wave_functions().memory_guard(mem, wf::copy_to::device); - sddk::mdarray, 2> f(3, ctx_.unit_cell().num_atoms()); + sddk::mdarray, 2> f(3, ctx_.unit_cell().num_atoms()); f.zero(); - nlf.add_k_point_contribution(kp__, f); + add_k_point_contribution_nonlocal(ctx_, bp_grad, kp__, f); + for (int ia = 0; ia < ctx_.unit_cell().num_atoms(); ia++) { for (int x : {0, 1, 2}) { forces__(x, ia) += f(x, ia); } } - if (is_device_memory(ctx_.preferred_memory_t())) { - for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { - /* deallocate GPU memory */ - kp__.spinor_wave_functions().pw_coeffs(ispn).deallocate(sddk::memory_t::device); - } - } } void @@ -354,8 +341,13 @@ Force::calc_forces_hubbard() int ik = kset_.spl_num_kpoints(ikloc); auto kp = kset_.get(ik); kp->beta_projectors().prepare(); + auto mg1 = kp->spinor_wave_functions().memory_guard(ctx_.processing_unit_memory_t(), wf::copy_to::device); + auto mg2 = kp->hubbard_wave_functions_S().memory_guard(ctx_.processing_unit_memory_t(), wf::copy_to::device); + auto mg3 = kp->atomic_wave_functions().memory_guard(ctx_.processing_unit_memory_t(), wf::copy_to::device); + auto mg4 = kp->atomic_wave_functions_S().memory_guard(ctx_.processing_unit_memory_t(), wf::copy_to::device); + if (ctx_.num_mag_dims() == 3) { - TERMINATE("Hubbard forces are only implemented for the simple hubbard correction."); + RTE_THROW("Hubbard forces are only implemented for the simple hubbard correction."); } hubbard_force_add_k_contribution_collinear(*kp, q_op, forces_hubbard_); kp->beta_projectors().dismiss(); @@ -467,12 +459,12 @@ Force::calc_forces_us() sddk::memory_pool* mp{nullptr}; switch (ctx_.processing_unit()) { case sddk::device_t::CPU: { - mp = &ctx_.mem_pool(sddk::memory_t::host); + mp = &get_memory_pool(sddk::memory_t::host); la = sddk::linalg_t::blas; break; } case sddk::device_t::GPU: { - mp = &ctx_.mem_pool(sddk::memory_t::host_pinned); + mp = &get_memory_pool(sddk::memory_t::host_pinned); la = sddk::linalg_t::spla; break; } diff --git a/src/geometry/force.hpp b/src/geometry/force.hpp index e42e0c106..032342c19 100644 --- a/src/geometry/force.hpp +++ b/src/geometry/force.hpp @@ -74,8 +74,8 @@ class Force sddk::mdarray forces_total_; - template - void add_k_point_contribution(K_point>& kp__, sddk::mdarray& forces__) const; + template + void add_k_point_contribution(K_point& kp__, sddk::mdarray& forces__) const; void symmetrize(sddk::mdarray& forces__) const; diff --git a/src/geometry/non_local_functor.cpp b/src/geometry/non_local_functor.cpp deleted file mode 100644 index 091c9ebbd..000000000 --- a/src/geometry/non_local_functor.cpp +++ /dev/null @@ -1,182 +0,0 @@ -// Copyright (c) 2013-2018 Anton Kozhevnikov, Ilia Sivkov, Mathieu Taillefumier, Thomas Schulthess -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, are permitted provided that -// the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the -// following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions -// and the following disclaimer in the documentation and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -/** \file non_local_functor.cpp - * - * \brief Common operation for forces and stress tensor. - */ - -#include "k_point/k_point.hpp" -#include "geometry/non_local_functor.hpp" - -namespace sirius { - -template -void Non_local_functor::add_k_point_contribution(K_point>& kpoint__, sddk::mdarray, 2>& collect_res__) -{ - PROFILE("sirius::Non_local_functor::add_k_point"); - - auto& unit_cell = ctx_.unit_cell(); - - if (ctx_.unit_cell().mt_lo_basis_size() == 0) { - return; - } - - auto& bp = kpoint__.beta_projectors(); - - double main_two_factor{-2}; - - for (int icnk = 0; icnk < bp_base_.num_chunks(); icnk++) { - - bp.prepare(); - /* generate chunk for inner product of beta */ - bp.generate(icnk); - - /* store for spin up and down */ - sddk::matrix beta_phi_chunks[2]; - - for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { - int nbnd = kpoint__.num_occupied_bands(ispn); - beta_phi_chunks[ispn] = bp.template inner(icnk, kpoint__.spinor_wave_functions(), ispn, 0, nbnd); - } - bp.dismiss(); - - bp_base_.prepare(); - for (int x = 0; x < bp_base_.num_comp(); x++) { - /* generate chunk for inner product of beta gradient */ - bp_base_.generate(icnk, x); - - for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { - int spin_factor = (ispn == 0 ? 1 : -1); - - int nbnd = kpoint__.num_occupied_bands(ispn); - - /* inner product of beta gradient and WF */ - auto bp_base_phi_chunk = bp_base_.template inner(icnk, kpoint__.spinor_wave_functions(), ispn, 0, - nbnd); - - sddk::splindex spl_nbnd(nbnd, kpoint__.comm().size(), kpoint__.comm().rank()); - - int nbnd_loc = spl_nbnd.local_size(); - - #pragma omp parallel for - for (int ia_chunk = 0; ia_chunk < bp_base_.chunk(icnk).num_atoms_; ia_chunk++) { - int ia = bp_base_.chunk(icnk).desc_(static_cast(beta_desc_idx::ia), ia_chunk); - int offs = bp_base_.chunk(icnk).desc_(static_cast(beta_desc_idx::offset), ia_chunk); - int nbf = bp_base_.chunk(icnk).desc_(static_cast(beta_desc_idx::nbf), ia_chunk); - int iat = unit_cell.atom(ia).type_id(); - - if (unit_cell.atom(ia).type().spin_orbit_coupling()) { - TERMINATE("stress and forces with SO coupling are not upported"); - } - - /* helper lambda to calculate for sum loop over bands for different beta_phi and dij combinations*/ - auto for_bnd = [&](int ibf, int jbf, double_complex dij, double_complex qij, - sddk::matrix& beta_phi_chunk) { - /* gather everything = - 2 Re[ occ(k,n) weight(k) beta_phi*(i,n) [Dij - E(n)Qij] beta_base_phi(j,n) ]*/ - for (int ibnd_loc = 0; ibnd_loc < nbnd_loc; ibnd_loc++) { - int ibnd = spl_nbnd[ibnd_loc]; - - auto scalar_part = static_cast>( - main_two_factor * kpoint__.band_occupancy(ibnd, ispn) * kpoint__.weight() * - (dij - kpoint__.band_energy(ibnd, ispn) * qij)) * - std::conj(beta_phi_chunk(offs + jbf, ibnd)) * - bp_base_phi_chunk(offs + ibf, ibnd); - - /* get real part and add to the result array*/ - collect_res__(x, ia) += scalar_part.real(); - } - }; - - for (int ibf = 0; ibf < nbf; ibf++) { - int lm2 = unit_cell.atom(ia).type().indexb(ibf).lm; - int idxrf2 = unit_cell.atom(ia).type().indexb(ibf).idxrf; - for (int jbf = 0; jbf < nbf; jbf++) { - int lm1 = unit_cell.atom(ia).type().indexb(jbf).lm; - int idxrf1 = unit_cell.atom(ia).type().indexb(jbf).idxrf; - - /* Qij exists only in the case of ultrasoft/PAW */ - double qij{0}; - if (unit_cell.atom(ia).type().augment()) { - qij = ctx_.augmentation_op(iat).q_mtrx(ibf, jbf); - } - double_complex dij{0}; - - /* get non-magnetic or collinear spin parts of dij*/ - switch (ctx_.num_spins()) { - case 1: { - dij = unit_cell.atom(ia).d_mtrx(ibf, jbf, 0); - if (lm1 == lm2) { - dij += unit_cell.atom(ia).type().d_mtrx_ion()(idxrf1, idxrf2); - } - break; - } - - case 2: { - /* Dij(00) = dij + dij_Z ; Dij(11) = dij - dij_Z*/ - dij = (unit_cell.atom(ia).d_mtrx(ibf, jbf, 0) + - spin_factor * unit_cell.atom(ia).d_mtrx(ibf, jbf, 1)); - if (lm1 == lm2) { - dij += unit_cell.atom(ia).type().d_mtrx_ion()(idxrf1, idxrf2); - } - break; - } - - default: { - TERMINATE("Error in non_local_functor, D_aug_mtrx. "); - break; - } - } - - /* add non-magnetic or diagonal spin components (or collinear part) */ - for_bnd(ibf, jbf, dij, double_complex(qij, 0.0), beta_phi_chunks[ispn]); - - /* for non-collinear case*/ - if (ctx_.num_mag_dims() == 3) { - /* Dij(10) = dij_X + i dij_Y ; Dij(01) = dij_X - i dij_Y */ - dij = double_complex(unit_cell.atom(ia).d_mtrx(ibf, jbf, 2), - spin_factor * unit_cell.atom(ia).d_mtrx(ibf, jbf, 3)); - /* add non-diagonal spin components*/ - for_bnd(ibf, jbf, dij, double_complex(0.0, 0.0), beta_phi_chunks[ispn + spin_factor]); - } - } // jbf - } // ibf - } // ia_chunk - } // ispn - } // x - } - - bp_base_.dismiss(); -} - -template void -Non_local_functor::add_k_point_contribution(K_point& kpoint__, sddk::mdarray &collect_res__); - -template void -Non_local_functor>::add_k_point_contribution(K_point& kpoint__, sddk::mdarray &collect_res__); - -#if defined(USE_FP32) -template void -Non_local_functor::add_k_point_contribution(K_point& kpoint__, sddk::mdarray &collect_res__); - -template void -Non_local_functor>::add_k_point_contribution(K_point& kpoint__, sddk::mdarray &collect_res__); -#endif - -} diff --git a/src/geometry/non_local_functor.hpp b/src/geometry/non_local_functor.hpp index 60e5e449e..5c951a673 100644 --- a/src/geometry/non_local_functor.hpp +++ b/src/geometry/non_local_functor.hpp @@ -32,24 +32,147 @@ namespace sirius { -/** \tparam T One of float, double, complex or complex */ -template -class Non_local_functor +/** \tparam T Precision type of the wave-functions */ +template +void add_k_point_contribution_nonlocal(Simulation_context& ctx__, Beta_projectors_base& bp_base__, + K_point& kp__, sddk::mdarray, 2>& collect_res__) { - private: - Simulation_context& ctx_; - Beta_projectors_base>& bp_base_; - public: - - Non_local_functor(Simulation_context& ctx__, Beta_projectors_base>& bp_base__) - : ctx_(ctx__) - , bp_base_(bp_base__) - { + PROFILE("sirius::add_k_point_contribution_nonlocal"); + + auto& uc = ctx__.unit_cell(); + + if (uc.mt_lo_basis_size() == 0) { + return; + } + + auto& bp = kp__.beta_projectors(); + + double main_two_factor{-2}; + + for (int icnk = 0; icnk < bp_base__.num_chunks(); icnk++) { + + bp.prepare(); + /* generate chunk for inner product of beta */ + bp.generate(ctx__.processing_unit_memory_t(), icnk); + + /* store for spin up and down */ + sddk::matrix beta_phi_chunks[2]; + + for (int ispn = 0; ispn < ctx__.num_spins(); ispn++) { + int nbnd = kp__.num_occupied_bands(ispn); + beta_phi_chunks[ispn] = bp.template inner(ctx__.processing_unit_memory_t(), icnk, + kp__.spinor_wave_functions(), wf::spin_index(ispn), wf::band_range(0, nbnd)); + } + bp.dismiss(); + + bp_base__.prepare(); + for (int x = 0; x < bp_base__.num_comp(); x++) { + /* generate chunk for inner product of beta gradient */ + bp_base__.generate(ctx__.processing_unit_memory_t(), icnk, x); + + for (int ispn = 0; ispn < ctx__.num_spins(); ispn++) { + int spin_factor = (ispn == 0 ? 1 : -1); + + int nbnd = kp__.num_occupied_bands(ispn); + + /* inner product of beta gradient and WF */ + auto bp_base_phi_chunk = bp_base__.template inner(ctx__.processing_unit_memory_t(), icnk, + kp__.spinor_wave_functions(), wf::spin_index(ispn), wf::band_range(0, nbnd)); + + sddk::splindex spl_nbnd(nbnd, kp__.comm().size(), kp__.comm().rank()); + + int nbnd_loc = spl_nbnd.local_size(); + + #pragma omp parallel for + for (int ia_chunk = 0; ia_chunk < bp_base__.chunk(icnk).num_atoms_; ia_chunk++) { + int ia = bp_base__.chunk(icnk).desc_(beta_desc_idx::ia, ia_chunk); + int offs = bp_base__.chunk(icnk).desc_(beta_desc_idx::offset, ia_chunk); + int nbf = bp_base__.chunk(icnk).desc_(beta_desc_idx::nbf, ia_chunk); + int iat = uc.atom(ia).type_id(); + + if (uc.atom(ia).type().spin_orbit_coupling()) { + RTE_THROW("stress and forces with SO coupling are not upported"); + } + + /* helper lambda to calculate for sum loop over bands for different beta_phi and dij combinations*/ + auto for_bnd = [&](int ibf, int jbf, std::complex> dij, real_type qij, + sddk::matrix& beta_phi_chunk) { + /* gather everything = - 2 Re[ occ(k,n) weight(k) beta_phi*(i,n) [Dij - E(n)Qij] beta_base_phi(j,n) ]*/ + for (int ibnd_loc = 0; ibnd_loc < nbnd_loc; ibnd_loc++) { + int ibnd = spl_nbnd[ibnd_loc]; + + auto d1 = main_two_factor * kp__.band_occupancy(ibnd, ispn) * kp__.weight(); + auto z2 = dij - static_cast>(kp__.band_energy(ibnd, ispn) * qij); + auto z1 = z2 * std::conj(beta_phi_chunk(offs + jbf, ibnd)) * bp_base_phi_chunk(offs + ibf, ibnd); + + auto scalar_part = static_cast>(d1) * z1; + + /* get real part and add to the result array*/ + collect_res__(x, ia) += scalar_part.real(); + } + }; + + for (int ibf = 0; ibf < nbf; ibf++) { + int lm2 = uc.atom(ia).type().indexb(ibf).lm; + int idxrf2 = uc.atom(ia).type().indexb(ibf).idxrf; + for (int jbf = 0; jbf < nbf; jbf++) { + int lm1 = uc.atom(ia).type().indexb(jbf).lm; + int idxrf1 = uc.atom(ia).type().indexb(jbf).idxrf; + + /* Qij exists only in the case of ultrasoft/PAW */ + real_type qij{0}; + if (uc.atom(ia).type().augment()) { + qij = ctx__.augmentation_op(iat).q_mtrx(ibf, jbf); + } + std::complex> dij{0}; + + /* get non-magnetic or collinear spin parts of dij*/ + switch (ctx__.num_spins()) { + case 1: { + dij = uc.atom(ia).d_mtrx(ibf, jbf, 0); + if (lm1 == lm2) { + dij += uc.atom(ia).type().d_mtrx_ion()(idxrf1, idxrf2); + } + break; + } + + case 2: { + /* Dij(00) = dij + dij_Z ; Dij(11) = dij - dij_Z*/ + dij = (uc.atom(ia).d_mtrx(ibf, jbf, 0) + + spin_factor * uc.atom(ia).d_mtrx(ibf, jbf, 1)); + if (lm1 == lm2) { + dij += uc.atom(ia).type().d_mtrx_ion()(idxrf1, idxrf2); + } + break; + } + + default: { + RTE_THROW("Error in non_local_functor, D_aug_mtrx. "); + break; + } + } + + /* add non-magnetic or diagonal spin components (or collinear part) */ + for_bnd(ibf, jbf, dij, qij, beta_phi_chunks[ispn]); + + /* for non-collinear case*/ + if (ctx__.num_mag_dims() == 3) { + /* Dij(10) = dij_X + i dij_Y ; Dij(01) = dij_X - i dij_Y */ + dij = std::complex>(uc.atom(ia).d_mtrx(ibf, jbf, 2), + spin_factor * uc.atom(ia).d_mtrx(ibf, jbf, 3)); + /* add non-diagonal spin components*/ + for_bnd(ibf, jbf, dij, 0.0, beta_phi_chunks[ispn + spin_factor]); + } + } // jbf + } // ibf + } // ia_chunk + } // ispn + } // x } - /// Collect summation result in an array - void add_k_point_contribution(K_point>& kpoint__, sddk::mdarray, 2>& collect_res__); -}; + bp_base__.dismiss(); +} + } #endif /* __NON_LOCAL_FUNCTOR_HPP__ */ diff --git a/src/geometry/stress.cpp b/src/geometry/stress.cpp index 1568edd5f..a9e41843b 100644 --- a/src/geometry/stress.cpp +++ b/src/geometry/stress.cpp @@ -34,13 +34,13 @@ namespace sirius { using namespace geometry3d; -template +template void Stress::calc_stress_nonloc_aux() { PROFILE("sirius::Stress|nonloc"); - sddk::mdarray, 2> collect_result(9, ctx_.unit_cell().num_atoms()); + sddk::mdarray, 2> collect_result(9, ctx_.unit_cell().num_atoms()); collect_result.zero(); stress_nonloc_.zero(); @@ -54,27 +54,12 @@ Stress::calc_stress_nonloc_aux() for (int ikloc = 0; ikloc < kset_.spl_num_kpoints().local_size(); ikloc++) { int ik = kset_.spl_num_kpoints(ikloc); - auto kp = kset_.get>(ik); - if (is_device_memory(ctx_.preferred_memory_t())) { - int nbnd = ctx_.num_bands(); - for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { - /* allocate GPU memory */ - kp->spinor_wave_functions().pw_coeffs(ispn).allocate(ctx_.mem_pool(sddk::memory_t::device)); - kp->spinor_wave_functions().pw_coeffs(ispn).copy_to(sddk::memory_t::device, 0, nbnd); - } - } - Beta_projectors_strain_deriv> bp_strain_deriv(ctx_, kp->gkvec()); - - Non_local_functor nlf(ctx_, bp_strain_deriv); - - nlf.add_k_point_contribution(*kp, collect_result); + auto kp = kset_.get(ik); + auto mem = ctx_.processing_unit() == sddk::device_t::CPU ? sddk::memory_t::host : sddk::memory_t::device; + auto mg = kp->spinor_wave_functions().memory_guard(mem, wf::copy_to::device); + Beta_projectors_strain_deriv bp_strain_deriv(ctx_, kp->gkvec()); - if (is_device_memory(ctx_.preferred_memory_t())) { - for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { - /* deallocate GPU memory */ - kp->spinor_wave_functions().pw_coeffs(ispn).deallocate(sddk::memory_t::device); - } - } + add_k_point_contribution_nonlocal(ctx_, bp_strain_deriv, *kp, collect_result); } #pragma omp parallel @@ -101,10 +86,6 @@ Stress::calc_stress_nonloc_aux() symmetrize(stress_nonloc_); } -template void Stress::calc_stress_nonloc_aux(); - -template void Stress::calc_stress_nonloc_aux(); - matrix3d Stress::calc_stress_total() { @@ -146,16 +127,27 @@ Stress::calc_stress_hubbard() Q_operator q_op(ctx_); + auto nhwf = ctx_.unit_cell().num_hubbard_wf().first; + + sddk::mdarray dn(nhwf, nhwf, 2, 9); + if (is_device_memory(ctx_.processing_unit_memory_t())) { + dn.allocate(ctx_.processing_unit_memory_t()); + } for (int ikloc = 0; ikloc < kset_.spl_num_kpoints().local_size(); ikloc++) { int ik = kset_.spl_num_kpoints(ikloc); auto kp = kset_.get(ik); - sddk::mdarray dn(kp->hubbard_wave_functions_S().num_wf(), - kp->hubbard_wave_functions_S().num_wf(), 2, 9); dn.zero(); + if (is_device_memory(ctx_.processing_unit_memory_t())) { + dn.zero(ctx_.processing_unit_memory_t()); + } kp->beta_projectors().prepare(); + auto mg1 = kp->spinor_wave_functions().memory_guard(ctx_.processing_unit_memory_t(), wf::copy_to::device); + auto mg2 = kp->hubbard_wave_functions_S().memory_guard(ctx_.processing_unit_memory_t(), wf::copy_to::device); + auto mg3 = kp->atomic_wave_functions().memory_guard(ctx_.processing_unit_memory_t(), wf::copy_to::device); + auto mg4 = kp->atomic_wave_functions_S().memory_guard(ctx_.processing_unit_memory_t(), wf::copy_to::device); if (ctx_.num_mag_dims() == 3) { - TERMINATE("Hubbard stress correction is only implemented for the simple hubbard correction."); + RTE_THROW("Hubbard stress correction is only implemented for the simple hubbard correction."); } /* compute the derivative of the occupancies numbers */ @@ -312,7 +304,7 @@ Stress::calc_stress_xc() derivative of sigm (which is grad(rho) * grad(rho)) */ if (ctx_.num_spins() == 1) { - Smooth_periodic_function rhovc(ctx_.spfft(), ctx_.gvec_partition()); + Smooth_periodic_function rhovc(ctx_.spfft(), ctx_.gvec_fft_sptr()); rhovc.zero(); rhovc.add(density_.rho()); rhovc.add(density_.rho_pseudo_core()); @@ -404,13 +396,13 @@ Stress::calc_stress_us() sddk::memory_pool* mp{nullptr}; switch (ctx_.processing_unit()) { case sddk::device_t::CPU: { - mp = &ctx_.mem_pool(sddk::memory_t::host); + mp = &get_memory_pool(sddk::memory_t::host); la = sddk::linalg_t::blas; qmem = sddk::memory_t::host; break; } case sddk::device_t::GPU: { - mp = &ctx_.mem_pool(sddk::memory_t::host_pinned); + mp = &get_memory_pool(sddk::memory_t::host_pinned); la = sddk::linalg_t::spla; qmem = sddk::memory_t::device; break; @@ -431,7 +423,7 @@ Stress::calc_stress_us() auto dm = density_.density_matrix_aux(density_.density_matrix(), iat); sddk::mdarray phase_factors(atom_type.num_atoms(), ctx_.gvec().count(), - ctx_.mem_pool(sddk::memory_t::host)); + get_memory_pool(sddk::memory_t::host)); PROFILE_START("sirius::Stress|us|phase_fac"); #pragma omp parallel for schedule(static) @@ -694,7 +686,7 @@ Stress::calc_stress_kin_aux() auto Gk = kp->gkvec().template gkvec_cart(igloc); double f = kp->band_occupancy(i, ispin); - auto z = kp->spinor_wave_functions().pw_coeffs(ispin).prime(igloc, i); + auto z = kp->spinor_wave_functions().pw_coeffs(igloc, wf::spin_index(ispin), wf::band_index(i)); double d = fact * f * (std::pow(z.real(), 2) + std::pow(z.imag(), 2)); for (int mu : {0, 1, 2}) { for (int nu : {0, 1, 2}) { @@ -808,18 +800,18 @@ Stress::calc_stress_nonloc() if (ctx_.cfg().parameters().precision_wf() == "fp32") { #if defined(USE_FP32) if (ctx_.gamma_point()) { - calc_stress_nonloc_aux(); + calc_stress_nonloc_aux(); } else { - calc_stress_nonloc_aux>(); + calc_stress_nonloc_aux>(); } #else RTE_THROW("Not compiled with FP32 support"); #endif } else { if (ctx_.gamma_point()) { - calc_stress_nonloc_aux(); + calc_stress_nonloc_aux(); } else { - calc_stress_nonloc_aux>(); + calc_stress_nonloc_aux>(); } } diff --git a/src/geometry/stress.hpp b/src/geometry/stress.hpp index e40ed54e1..006593a38 100644 --- a/src/geometry/stress.hpp +++ b/src/geometry/stress.hpp @@ -215,7 +215,7 @@ class Stress * * \tparam T One of float, double, complex or complex types for generic or Gamma point case. */ - template + template void calc_stress_nonloc_aux(); void symmetrize(matrix3d& mtrx__) const; diff --git a/src/geometry/wavefunction_strain_deriv.hpp b/src/geometry/wavefunction_strain_deriv.hpp index f32eb8894..c8fcdf673 100644 --- a/src/geometry/wavefunction_strain_deriv.hpp +++ b/src/geometry/wavefunction_strain_deriv.hpp @@ -6,7 +6,7 @@ namespace sirius { void -wavefunctions_strain_deriv(Simulation_context const& ctx__, K_point& kp__, sddk::Wave_functions& dphi__, +wavefunctions_strain_deriv(Simulation_context const& ctx__, K_point& kp__, wf::Wave_functions& dphi__, sddk::mdarray const& rlm_g__, sddk::mdarray const& rlm_dg__, int nu__, int mu__) { @@ -53,9 +53,9 @@ wavefunctions_strain_deriv(Simulation_context const& ctx__, K_point& kp_ if (l == 0) { auto d1 = ri_values[atom_type.id()][idxrf] * p * y00; - dphi__.pw_coeffs(0).prime(igkloc, offset_in_wf) = -z * d1 * phase_factor; + dphi__.pw_coeffs(igkloc, wf::spin_index(0), wf::band_index(offset_in_wf)) = -z * d1 * phase_factor; } else { - dphi__.pw_coeffs(0).prime(igkloc, offset_in_wf) = 0.0; + dphi__.pw_coeffs(igkloc, wf::spin_index(0), wf::band_index(offset_in_wf)) = 0.0; } } else { auto d1 = ri_values[atom_type.id()][idxrf] * @@ -63,7 +63,7 @@ wavefunctions_strain_deriv(Simulation_context const& ctx__, K_point& kp_ auto d2 = ridjl_values[atom_type.id()][idxrf] * rlm_g__(lm, igkloc) * gvc[mu__] * gvc[nu__] / gvs[0]; - dphi__.pw_coeffs(0).prime(igkloc, offset_in_wf) = -z * (d1 + d2) * std::conj(phase_factor); + dphi__.pw_coeffs(igkloc, wf::spin_index(0), wf::band_index(offset_in_wf)) = -z * (d1 + d2) * std::conj(phase_factor); } } // xi } diff --git a/src/gpu/acc_common.hpp b/src/gpu/acc_common.hpp new file mode 100644 index 000000000..07a6dc342 --- /dev/null +++ b/src/gpu/acc_common.hpp @@ -0,0 +1,201 @@ +// Copyright (c) 2013-2022 Anton Kozhevnikov, Thomas Schulthess +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that +// the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the +// following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions +// and the following disclaimer in the documentation and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/** \file acc_common.hpp + * + * \brief Common device functions used by GPU kernels. + */ + +#ifndef __ACC_COMMON_HPP__ +#define __ACC_COMMON_HPP__ + +#include +#include "acc.hpp" +#include "acc_runtime.hpp" + +const double twopi = 6.2831853071795864769; + +inline __device__ size_t array2D_offset(int i0, int i1, int ld0) +{ + return i0 + i1 * ld0; +} + +inline __device__ size_t array3D_offset(int i0, int i1, int i2, int ld0, int ld1) +{ + return i0 + ld0 * (i1 + i2 * ld1); +} + +inline __device__ size_t array4D_offset(int i0, int i1, int i2, int i3, int ld0, int ld1, int ld2) +{ + return i0 + ld0 * (i1 + ld1 * (i2 + i3 * ld2)); +} + +inline __host__ __device__ int num_blocks(int length, int block_size) +{ + return (length / block_size) + ((length % block_size) ? 1 : 0); +} + +inline __device__ auto add_accNumbers(double x, double y) +{ + return x + y; +} + +inline __device__ auto add_accNumbers(float x, float y) +{ + return x + y; +} + +inline __device__ auto add_accNumbers(gpu_complex_type x, gpu_complex_type y) +{ + return accCadd(x, y); +} + +inline __device__ auto add_accNumbers(gpu_complex_type x, gpu_complex_type y) +{ + return accCaddf(x, y); +} + +inline __device__ auto sub_accNumbers(double x, double y) +{ + return x - y; +} + +inline __device__ auto sub_accNumbers(float x, float y) +{ + return x - y; +} + +inline __device__ auto sub_accNumbers(gpu_complex_type x, gpu_complex_type y) +{ + return accCsub(x, y); +} + +inline __device__ auto sub_accNumbers(gpu_complex_type x, gpu_complex_type y) +{ + return accCsubf(x, y); +} + +inline __device__ auto make_accComplex(float x, float y) +{ + return make_accFloatComplex(x, y); +} + +inline __device__ auto make_accComplex(double x, double y) +{ + return make_accDoubleComplex(x, y); +} + +inline __device__ auto mul_accNumbers(gpu_complex_type x, gpu_complex_type y) +{ + return accCmul(x, y); +} + +inline __device__ auto mul_accNumbers(double x, gpu_complex_type y) +{ + return make_accComplex(x * y.x, x * y.y); +} + +inline __device__ auto mul_accNumbers(gpu_complex_type x, gpu_complex_type y) +{ + return accCmulf(x, y); +} + +inline __device__ auto mul_accNumbers(float x, gpu_complex_type y) +{ + return make_accComplex(x * y.x, x * y.y); +} + +template +inline __device__ auto accZero(); + +template <> +inline __device__ auto accZero() +{ + return 0; +} + +template <> +inline __device__ auto accZero() +{ + return 0; +} + +template <> +inline __device__ auto accZero>() +{ + return make_accComplex(double{0}, double{0}); +} + +template <> +inline __device__ auto accZero>() +{ + return make_accComplex(float{0}, float{0}); +} + +inline bool __device__ is_zero(gpu_complex_type x) +{ + return (x.x == 0.0) && (x.y == 0); +} + +inline bool __device__ is_zero(gpu_complex_type x) +{ + return (x.x == 0.0) && (x.y == 0); +} + +inline bool __device__ is_zero(float x) +{ + return x == 0.0; +} + +inline bool __device__ is_zero(double x) +{ + return x == 0.0; +} + +template +struct Real; + +template<> +struct Real +{ + using type = float; +}; + +template<> +struct Real +{ + using type = double; +}; + +template<> +struct Real> +{ + using type = float; +}; + +template<> +struct Real> +{ + using type = double; +}; + +template +using real_type = typename Real::type; + +#endif diff --git a/src/gpu/add_pw_ekin.cu b/src/gpu/add_pw_ekin.cu deleted file mode 100644 index e8beee090..000000000 --- a/src/gpu/add_pw_ekin.cu +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright (c) 2013-2018 Anton Kozhevnikov, Thomas Schulthess -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, are permitted provided that -// the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the -// following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions -// and the following disclaimer in the documentation and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -/** \file add_pw_ekin.cu - * - * \brief CUDA kernel for the hphi update. - */ - -#include "gpu/cuda_common.hpp" -#include "gpu/acc_runtime.hpp" - -template -__global__ void add_pw_ekin_gpu_kernel(int num_gvec__, - T alpha__, - T const* pw_ekin__, - gpu_complex_type const* phi__, - gpu_complex_type const* vphi__, - gpu_complex_type* hphi__); - -template <> -__global__ void add_pw_ekin_gpu_kernel(int num_gvec__, - float alpha__, - float const* pw_ekin__, - acc_complex_float_t const* phi__, - acc_complex_float_t const* vphi__, - acc_complex_float_t* hphi__) -{ - int ig = blockIdx.x * blockDim.x + threadIdx.x; - if (ig < num_gvec__) { - acc_complex_float_t z1 = accCaddf(vphi__[ig], make_accFloatComplex(alpha__ * pw_ekin__[ig] * phi__[ig].x, - alpha__ * pw_ekin__[ig] * phi__[ig].y)); - hphi__[ig] = accCaddf(hphi__[ig], z1); - } -} - -template <> -__global__ void add_pw_ekin_gpu_kernel(int num_gvec__, - double alpha__, - double const* pw_ekin__, - acc_complex_double_t const* phi__, - acc_complex_double_t const* vphi__, - acc_complex_double_t* hphi__) -{ - int ig = blockIdx.x * blockDim.x + threadIdx.x; - if (ig < num_gvec__) { - acc_complex_double_t z1 = accCadd(vphi__[ig], make_accDoubleComplex(alpha__ * pw_ekin__[ig] * phi__[ig].x, - alpha__ * pw_ekin__[ig] * phi__[ig].y)); - hphi__[ig] = accCadd(hphi__[ig], z1); - } -} - -/// Update the hphi wave functions. -/** The following operation is performed: - * hphi[ig] += (alpha * pw_ekin[ig] * phi[ig] + vphi[ig]) - */ -extern "C" void add_pw_ekin_gpu_float(int num_gvec__, - float alpha__, - float const* pw_ekin__, - acc_complex_float_t const* phi__, - acc_complex_float_t const* vphi__, - acc_complex_float_t* hphi__) -{ - dim3 grid_t(64); - dim3 grid_b(num_blocks(num_gvec__, grid_t.x)); - - accLaunchKernel((add_pw_ekin_gpu_kernel), dim3(grid_b), dim3(grid_t), 0, 0, num_gvec__, alpha__, pw_ekin__, - phi__, vphi__, hphi__); -} - -extern "C" void add_pw_ekin_gpu_double(int num_gvec__, - double alpha__, - double const* pw_ekin__, - acc_complex_double_t const* phi__, - acc_complex_double_t const* vphi__, - acc_complex_double_t* hphi__) -{ - dim3 grid_t(64); - dim3 grid_b(num_blocks(num_gvec__, grid_t.x)); - - accLaunchKernel((add_pw_ekin_gpu_kernel), dim3(grid_b), dim3(grid_t), 0, 0, num_gvec__, alpha__, pw_ekin__, - phi__, vphi__, hphi__); -} diff --git a/src/gpu/augmentation_operator.cu b/src/gpu/augmentation_operator.cu index a6722a41d..c851a1c35 100644 --- a/src/gpu/augmentation_operator.cu +++ b/src/gpu/augmentation_operator.cu @@ -22,7 +22,7 @@ * \brief CUDA kernels to generate augmentation operator and its derivative. */ -#include "gpu/cuda_common.hpp" +#include "gpu/acc_common.hpp" #include "gpu/acc_runtime.hpp" __global__ void aug_op_pw_coeffs_gpu_kernel(int ngvec__, int const* gvec_shell__, int const* idx__, int idxmax__, diff --git a/src/gpu/checksum.cu b/src/gpu/checksum.cu index 20fbafac2..93ec2431e 100644 --- a/src/gpu/checksum.cu +++ b/src/gpu/checksum.cu @@ -22,7 +22,7 @@ * \brief CUDA kernel for the calculation of checksum. */ -#include "cuda_common.hpp" +#include "acc_common.hpp" #include "acc_runtime.hpp" __global__ void double_complex_checksum_gpu_kernel diff --git a/src/gpu/create_beta_gk.cu b/src/gpu/create_beta_gk.cu index e82fb2179..4cba77bca 100644 --- a/src/gpu/create_beta_gk.cu +++ b/src/gpu/create_beta_gk.cu @@ -22,7 +22,7 @@ * \brief CUDA kernel for the generation of beta(G+k) projectors. */ -#include "gpu/cuda_common.hpp" +#include "gpu/acc_common.hpp" #include "gpu/acc_runtime.hpp" #ifdef SIRIUS_CUDA diff --git a/src/gpu/cuda_common.hpp b/src/gpu/cuda_common.hpp deleted file mode 100644 index e06627833..000000000 --- a/src/gpu/cuda_common.hpp +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) 2013-2017 Anton Kozhevnikov, Thomas Schulthess -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, are permitted provided that -// the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the -// following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions -// and the following disclaimer in the documentation and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -/** \file cuda_common.hpp - * - * \brief Common functions used by CUDA kernels. - */ - -#ifndef __CUDA_COMMON_HPP__ -#define __CUDA_COMMON_HPP__ - -#include -#include "acc.hpp" -#include "acc_runtime.hpp" - -const double twopi = 6.2831853071795864769; - -inline __device__ size_t array2D_offset(int i0, int i1, int ld0) -{ - return i0 + i1 * ld0; -} - -inline __device__ size_t array3D_offset(int i0, int i1, int i2, int ld0, int ld1) -{ - return i0 + ld0 * (i1 + i2 * ld1); -} - -inline __device__ size_t array4D_offset(int i0, int i1, int i2, int i3, int ld0, int ld1, int ld2) -{ - return i0 + ld0 * (i1 + ld1 * (i2 + i3 * ld2)); -} - -inline __host__ __device__ int num_blocks(int length, int block_size) -{ - return (length / block_size) + ((length % block_size) ? 1 : 0); -} - - -#endif diff --git a/src/gpu/cuda_uspp_kernels.cu b/src/gpu/cuda_uspp_kernels.cu index 867491de1..5690605e9 100644 --- a/src/gpu/cuda_uspp_kernels.cu +++ b/src/gpu/cuda_uspp_kernels.cu @@ -22,8 +22,9 @@ * \brief CUDA kernel for the PW-PW method. */ -#include "gpu/cuda_common.hpp" +#include "gpu/acc_common.hpp" #include "gpu/acc_runtime.hpp" +#include "gpu/acc.hpp" extern acc_stream_t* streams; @@ -305,31 +306,24 @@ extern "C" void compute_inner_product_gpu(int num_gkvec_row, } template -__global__ void add_checksum_gpu_kernel(gpu_complex_type const* wf__, int num_rows_loc__, gpu_complex_type* result__); - -template <> -__global__ void add_checksum_gpu_kernel -( - acc_complex_double_t const* wf__, - int num_rows_loc__, - acc_complex_double_t* result__ -) +__global__ void add_checksum_gpu_kernel(gpu_complex_type const* ptr__, int ld__, int n__, + gpu_complex_type* result__) { - int N = num_blocks(num_rows_loc__, blockDim.x); + int N = num_blocks(n__, blockDim.x); - ACC_DYNAMIC_SHARED( char, sdata_ptr) - double* sdata_x = (double*)&sdata_ptr[0]; - double* sdata_y = (double*)&sdata_ptr[blockDim.x * sizeof(double)]; + ACC_DYNAMIC_SHARED(char, sdata_ptr) + T* sdata_x = (T*)&sdata_ptr[0]; + T* sdata_y = (T*)&sdata_ptr[blockDim.x * sizeof(T)]; sdata_x[threadIdx.x] = 0.0; sdata_y[threadIdx.x] = 0.0; - for (int n = 0; n < N; n++) { - int j = n * blockDim.x + threadIdx.x; - if (j < num_rows_loc__) { - int k = array2D_offset(j, blockIdx.x, num_rows_loc__); - sdata_x[threadIdx.x] += wf__[k].x; - sdata_y[threadIdx.x] += wf__[k].y; + for (int i = 0; i < N; i++) { + int j = i * blockDim.x + threadIdx.x; + if (j < n__) { + int k = array2D_offset(j, blockIdx.x, ld__); + sdata_x[threadIdx.x] += ptr__[k].x; + sdata_y[threadIdx.x] += ptr__[k].y; } } __syncthreads(); @@ -342,68 +336,27 @@ __global__ void add_checksum_gpu_kernel __syncthreads(); } - result__[blockIdx.x] = accCadd(result__[blockIdx.x], make_accDoubleComplex(sdata_x[0], sdata_y[0])); + result__[blockIdx.x] = add_accNumbers(result__[blockIdx.x], make_accComplex(sdata_x[0], sdata_y[0])); } -template <> -__global__ void add_checksum_gpu_kernel -( - acc_complex_float_t const* wf__, - int num_rows_loc__, - acc_complex_float_t* result__ -) -{ - int N = num_blocks(num_rows_loc__, blockDim.x); - - ACC_DYNAMIC_SHARED( char, sdata_ptr) - float* sdata_x = (float*)&sdata_ptr[0]; - float* sdata_y = (float*)&sdata_ptr[blockDim.x * sizeof(float)]; +extern "C" { - sdata_x[threadIdx.x] = 0.0; - sdata_y[threadIdx.x] = 0.0; - - for (int n = 0; n < N; n++) { - int j = n * blockDim.x + threadIdx.x; - if (j < num_rows_loc__) { - int k = array2D_offset(j, blockIdx.x, num_rows_loc__); - sdata_x[threadIdx.x] += wf__[k].x; - sdata_y[threadIdx.x] += wf__[k].y; - } - } - __syncthreads(); - - for (int s = 1; s < blockDim.x; s *= 2) { - if (threadIdx.x % (2 * s) == 0) { - sdata_x[threadIdx.x] = sdata_x[threadIdx.x] + sdata_x[threadIdx.x + s]; - sdata_y[threadIdx.x] = sdata_y[threadIdx.x] + sdata_y[threadIdx.x + s]; - } - __syncthreads(); - } - - result__[blockIdx.x] = accCaddf(result__[blockIdx.x], make_accFloatComplex(sdata_x[0], sdata_y[0])); -} - -extern "C" void add_checksum_gpu_double(acc_complex_double_t* wf__, - int num_rows_loc__, - int nwf__, - acc_complex_double_t* result__) +void add_checksum_gpu_double(acc_complex_double_t* ptr__, int ld__, int nrow__, int ncol__, acc_complex_double_t* result__) { dim3 grid_t(64); - dim3 grid_b(nwf__); + dim3 grid_b(ncol__); - accLaunchKernel((add_checksum_gpu_kernel), dim3(grid_b), dim3(grid_t), 2 * grid_t.x * sizeof(double), 0, wf__, - num_rows_loc__, result__); + accLaunchKernel((add_checksum_gpu_kernel), dim3(grid_b), dim3(grid_t), 2 * grid_t.x * sizeof(double), 0, + ptr__, ld__, nrow__, result__); } -extern "C" void add_checksum_gpu_float(acc_complex_float_t* wf__, - int num_rows_loc__, - int nwf__, - acc_complex_float_t* result__) +void add_checksum_gpu_float(acc_complex_float_t* ptr__, int ld__, int nrow__, int ncol__, acc_complex_float_t* result__) { dim3 grid_t(64); - dim3 grid_b(nwf__); + dim3 grid_b(ncol__); - accLaunchKernel((add_checksum_gpu_kernel), dim3(grid_b), dim3(grid_t), 2 * grid_t.x * sizeof(float), 0, wf__, - num_rows_loc__, result__); + accLaunchKernel((add_checksum_gpu_kernel), dim3(grid_b), dim3(grid_t), 2 * grid_t.x * sizeof(float), 0, + ptr__, ld__, nrow__, result__); } +} diff --git a/src/gpu/density_rg.cu b/src/gpu/density_rg.cu index f46b5ee69..8c05da11b 100644 --- a/src/gpu/density_rg.cu +++ b/src/gpu/density_rg.cu @@ -22,7 +22,7 @@ * \brief CUDA kernel to update density on the regular FFT grid. */ -#include "gpu/cuda_common.hpp" +#include "gpu/acc_common.hpp" #include "gpu/acc_runtime.hpp" template diff --git a/src/gpu/fft_kernels.cu b/src/gpu/fft_kernels.cu index 63ac503d4..0bb3b9cf1 100644 --- a/src/gpu/fft_kernels.cu +++ b/src/gpu/fft_kernels.cu @@ -23,7 +23,7 @@ */ #include -#include "cuda_common.hpp" +#include "acc_common.hpp" #include "acc_runtime.hpp" //NOTE: HIP will call the corresponding CUDA function if compiled with CUDA support diff --git a/src/gpu/generate_dm_pw.cu b/src/gpu/generate_dm_pw.cu index e11eadbc9..43d924912 100644 --- a/src/gpu/generate_dm_pw.cu +++ b/src/gpu/generate_dm_pw.cu @@ -22,7 +22,7 @@ * \brief CUDA kernel to generate a product of phase-factors and density matrix. */ -#include "gpu/cuda_common.hpp" +#include "gpu/acc_common.hpp" #include "gpu/acc_runtime.hpp" #include "gpu/acc_blas.hpp" diff --git a/src/gpu/generate_phase_factors.cu b/src/gpu/generate_phase_factors.cu index b8a265d9e..dbad496e9 100644 --- a/src/gpu/generate_phase_factors.cu +++ b/src/gpu/generate_phase_factors.cu @@ -22,7 +22,7 @@ * \brief CUDA kernel to generate plane-wave atomic phase factors. */ -#include "gpu/cuda_common.hpp" +#include "gpu/acc_common.hpp" #include "gpu/acc_runtime.hpp" __global__ void generate_phase_factors_gpu_kernel diff --git a/src/gpu/local_operator.cu b/src/gpu/local_operator.cu new file mode 100644 index 000000000..b653f7f27 --- /dev/null +++ b/src/gpu/local_operator.cu @@ -0,0 +1,251 @@ +// Copyright (c) 2013-2022 Anton Kozhevnikov, Thomas Schulthess +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that +// the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the +// following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions +// and the following disclaimer in the documentation and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/** \file local_operator.cu + * + * \brief GPU kernels and API for application of the local operator. + */ + +#include "gpu/acc_common.hpp" +#include "gpu/acc_runtime.hpp" + +template +__global__ void +add_to_hphi_pw_gpu_kernel(int num_gvec__, gpu_complex_type const* vphi__, gpu_complex_type* hphi__) +{ + int ig = blockIdx.x * blockDim.x + threadIdx.x; + if (ig < num_gvec__) { + hphi__[ig] = add_accNumbers(hphi__[ig], vphi__[ig]); + } +} + +template +__global__ void +add_to_hphi_pw_gpu_kernel(int num_gvec__, T const* pw_ekin__, gpu_complex_type const* phi__, + gpu_complex_type const* vphi__, gpu_complex_type* hphi__) +{ + int ig = blockIdx.x * blockDim.x + threadIdx.x; + if (ig < num_gvec__) { + auto z1 = add_accNumbers(vphi__[ig], mul_accNumbers(pw_ekin__[ig], phi__[ig])); + hphi__[ig] = add_accNumbers(hphi__[ig], z1); + } +} + +template +__global__ void +add_to_hphi_lapw_gpu_kernel(int num_gvec__, gpu_complex_type* const p__, T const* gkvec_cart__, + gpu_complex_type* hphi__) +{ + int ig = blockIdx.x * blockDim.x + threadIdx.x; + if (ig < num_gvec__) { + /* hphi[ig] = hphi[ig] + 1/2 p_{x,y,z}[ig] * G_{x,y,z}[ig] */ + hphi__[ig] = add_accNumbers(hphi__[ig], mul_accNumbers(0.5 * gkvec_cart__[ig], p__[ig])); + } +} + +template +__global__ void +grad_phi_lapw_gpu_kernel(int num_gvec__, gpu_complex_type* const phi__, T const* gkvec_cart__, + gpu_complex_type* p__) +{ + int ig = blockIdx.x * blockDim.x + threadIdx.x; + if (ig < num_gvec__) { + p__[ig] = mul_accNumbers(gkvec_cart__[ig], phi__[ig]); + } +} + +template +__global__ void +mul_by_veff_real_real_gpu_kernel(int nr__, T const* in__,T const* veff__, T* out__) +{ + int i = blockDim.x * blockIdx.x + threadIdx.x; + if (i < nr__) { + out__[i] = in__[i] * veff__[i]; + } +} + +template +__global__ void +mul_by_veff_complex_real_gpu_kernel(int nr__, gpu_complex_type const* in__, T const* veff__, + gpu_complex_type* out__) +{ + int i = blockDim.x * blockIdx.x + threadIdx.x; + if (i < nr__) { + out__[i] = mul_accNumbers(veff__[i], in__[i]); + } +} + +template +__global__ void +mul_by_veff_complex_complex_gpu_kernel(int nr__, gpu_complex_type const* in__, T pref__, T const* vx__, + T const* vy__, gpu_complex_type* out__) +{ + int i = blockDim.x * blockIdx.x + threadIdx.x; + if (i < nr__) { + out__[i] = mul_accNumbers(in__[i], make_accComplex(vx__[i], pref__ * vy__[i])); + } +} + +/// Update the hphi wave functions. +/** The following operation is performed: + * hphi[ig] += (alpha * pw_ekin[ig] * phi[ig] + vphi[ig]) + */ +extern "C" { + +void +add_to_hphi_pw_gpu_float(int num_gvec__, int add_ekin__, float const* pw_ekin__, gpu_complex_type const* phi__, + gpu_complex_type const* vphi__, gpu_complex_type* hphi__) +{ + dim3 grid_t(64); + dim3 grid_b(num_blocks(num_gvec__, grid_t.x)); + + if (add_ekin__) { + accLaunchKernel((add_to_hphi_pw_gpu_kernel), dim3(grid_b), dim3(grid_t), 0, 0, + num_gvec__, pw_ekin__, phi__, vphi__, hphi__); + } else { + accLaunchKernel((add_to_hphi_pw_gpu_kernel), dim3(grid_b), dim3(grid_t), 0, 0, + num_gvec__, vphi__, hphi__); + } +} + +void +add_to_hphi_pw_gpu_double(int num_gvec__, int add_ekin__, double const* pw_ekin__, gpu_complex_type const* phi__, + gpu_complex_type const* vphi__, gpu_complex_type* hphi__) +{ + dim3 grid_t(64); + dim3 grid_b(num_blocks(num_gvec__, grid_t.x)); + + if (add_ekin__) { + accLaunchKernel((add_to_hphi_pw_gpu_kernel), dim3(grid_b), dim3(grid_t), 0, 0, + num_gvec__, pw_ekin__, phi__, vphi__, hphi__); + } else { + accLaunchKernel((add_to_hphi_pw_gpu_kernel), dim3(grid_b), dim3(grid_t), 0, 0, + num_gvec__, vphi__, hphi__); + } +} + +void +add_to_hphi_lapw_gpu_float(int num_gvec__, gpu_complex_type* const p__, float const* gkvec_cart__, + gpu_complex_type* hphi__) +{ + dim3 grid_t(64); + dim3 grid_b(num_blocks(num_gvec__, grid_t.x)); + + accLaunchKernel((add_to_hphi_lapw_gpu_kernel), dim3(grid_b), dim3(grid_t), 0, 0, + num_gvec__, p__, gkvec_cart__, hphi__); +} + +void +grad_phi_lapw_gpu_float(int num_gvec__, gpu_complex_type* const p__, float const* gkvec_cart__, + gpu_complex_type* hphi__) +{ + dim3 grid_t(64); + dim3 grid_b(num_blocks(num_gvec__, grid_t.x)); + + accLaunchKernel((grad_phi_lapw_gpu_kernel), dim3(grid_b), dim3(grid_t), 0, 0, + num_gvec__, p__, gkvec_cart__, hphi__); +} + +void +add_to_hphi_lapw_gpu_double(int num_gvec__, gpu_complex_type* const p__, double const* gkvec_cart__, + gpu_complex_type* hphi__) +{ + dim3 grid_t(64); + dim3 grid_b(num_blocks(num_gvec__, grid_t.x)); + + accLaunchKernel((add_to_hphi_lapw_gpu_kernel), dim3(grid_b), dim3(grid_t), 0, 0, + num_gvec__, p__, gkvec_cart__, hphi__); +} + +void +grad_phi_lapw_gpu_double(int num_gvec__, gpu_complex_type* const p__, double const* gkvec_cart__, + gpu_complex_type* hphi__) +{ + dim3 grid_t(64); + dim3 grid_b(num_blocks(num_gvec__, grid_t.x)); + + accLaunchKernel((grad_phi_lapw_gpu_kernel), dim3(grid_b), dim3(grid_t), 0, 0, + num_gvec__, p__, gkvec_cart__, hphi__); +} + +void +mul_by_veff_real_real_gpu_float(int nr__, float const* in__, float const* veff__, float* out__) +{ + dim3 grid_t(64); + dim3 grid_b(num_blocks(nr__, grid_t.x)); + + accLaunchKernel((mul_by_veff_real_real_gpu_kernel), dim3(grid_b), dim3(grid_t), 0, 0, + nr__, in__, veff__, out__); +} + +void +mul_by_veff_real_real_gpu_double(int nr__, double const* in__, double const* veff__, double* out__) +{ + dim3 grid_t(64); + dim3 grid_b(num_blocks(nr__, grid_t.x)); + + accLaunchKernel((mul_by_veff_real_real_gpu_kernel), dim3(grid_b), dim3(grid_t), 0, 0, + nr__, in__, veff__, out__); +} + +void +mul_by_veff_complex_real_gpu_float(int nr__, gpu_complex_type const* in__, float const* veff__, + gpu_complex_type* out__) +{ + dim3 grid_t(64); + dim3 grid_b(num_blocks(nr__, grid_t.x)); + + accLaunchKernel((mul_by_veff_complex_real_gpu_kernel), dim3(grid_b), dim3(grid_t), 0, 0, + nr__, in__, veff__, out__); +} + +void +mul_by_veff_complex_real_gpu_double(int nr__, gpu_complex_type const* in__, double const* veff__, + gpu_complex_type* out__) +{ + dim3 grid_t(64); + dim3 grid_b(num_blocks(nr__, grid_t.x)); + + accLaunchKernel((mul_by_veff_complex_real_gpu_kernel), dim3(grid_b), dim3(grid_t), 0, 0, + nr__, in__, veff__, out__); +} + +void +mul_by_veff_complex_complex_gpu_float(int nr__, gpu_complex_type const* in__, float pref__, + float const* vx__, float const* vy__, gpu_complex_type* out__) +{ + dim3 grid_t(64); + dim3 grid_b(num_blocks(nr__, grid_t.x)); + + accLaunchKernel((mul_by_veff_complex_complex_gpu_kernel), dim3(grid_b), dim3(grid_t), 0, 0, + nr__, in__, pref__, vx__, vy__, out__); +} + +void +mul_by_veff_complex_complex_gpu_double(int nr__, gpu_complex_type const* in__, double pref__, + double const* vx__, double const* vy__, gpu_complex_type* out__) +{ + dim3 grid_t(64); + dim3 grid_b(num_blocks(nr__, grid_t.x)); + + accLaunchKernel((mul_by_veff_complex_complex_gpu_kernel), dim3(grid_b), dim3(grid_t), 0, 0, + nr__, in__, pref__, vx__, vy__, out__); +} + +} diff --git a/src/gpu/mul_by_veff.cu b/src/gpu/mul_by_veff.cu index 149cfb9e1..288dc5d01 100644 --- a/src/gpu/mul_by_veff.cu +++ b/src/gpu/mul_by_veff.cu @@ -22,104 +22,107 @@ * \brief CUDA kernels to multiply wave-functions by effective potential. */ -#include "gpu/cuda_common.hpp" -#include "gpu/acc_runtime.hpp" - -template -__global__ void mul_by_veff_real_real_gpu_kernel(int nr__, T* buf__, T const* veff__) -{ - int i = blockDim.x * blockIdx.x + threadIdx.x; - if (i < nr__) { - buf__[i] *= veff__[i]; - } -} - -extern "C" void mul_by_veff_real_real_gpu_float(int nr__, float* buf__, float const* veff__) -{ - dim3 grid_t(64); - dim3 grid_b(num_blocks(nr__, grid_t.x)); - - accLaunchKernel((mul_by_veff_real_real_gpu_kernel), dim3(grid_b), dim3(grid_t), 0, 0, nr__, buf__, veff__); -} - -extern "C" void mul_by_veff_real_real_gpu_double(int nr__, double* buf__, double const* veff__) -{ - dim3 grid_t(64); - dim3 grid_b(num_blocks(nr__, grid_t.x)); - - accLaunchKernel((mul_by_veff_real_real_gpu_kernel), dim3(grid_b), dim3(grid_t), 0, 0, nr__, buf__, veff__); -} - -template -__global__ void mul_by_veff_complex_real_gpu_kernel(int nr__, gpu_complex_type* buf__, T const* veff__) -{ - int i = blockDim.x * blockIdx.x + threadIdx.x; - if (i < nr__) { - buf__[i].x *= veff__[i]; - buf__[i].y *= veff__[i]; - } -} - -extern "C" void mul_by_veff_complex_real_gpu_float(int nr__, acc_complex_float_t* buf__, float const* veff__) -{ - dim3 grid_t(64); - dim3 grid_b(num_blocks(nr__, grid_t.x)); - - accLaunchKernel((mul_by_veff_complex_real_gpu_kernel), dim3(grid_b), dim3(grid_t), 0, 0, nr__, buf__, veff__); -} - -extern "C" void mul_by_veff_complex_real_gpu_double(int nr__, acc_complex_double_t* buf__, double const* veff__) -{ - dim3 grid_t(64); - dim3 grid_b(num_blocks(nr__, grid_t.x)); - - accLaunchKernel((mul_by_veff_complex_real_gpu_kernel), dim3(grid_b), dim3(grid_t), 0, 0, nr__, buf__, veff__); -} - -template -__global__ void mul_by_veff_complex_complex_gpu_kernel(int nr__, gpu_complex_type* buf__, T pref__, - T const* vx__, T const* vy__); - -template <> -__global__ void mul_by_veff_complex_complex_gpu_kernel(int nr__, acc_complex_float_t* buf__, float pref__, - float const* vx__, float const* vy__) -{ - int i = blockDim.x * blockIdx.x + threadIdx.x; - if (i < nr__) { - acc_complex_float_t z = buf__[i]; - acc_complex_float_t v = make_accFloatComplex(vx__[i], pref__ * vy__[i]); - buf__[i] = accCmulf(z, v); - } -} - -template <> -__global__ void mul_by_veff_complex_complex_gpu_kernel(int nr__, acc_complex_double_t* buf__, double pref__, - double const* vx__, double const* vy__) -{ - int i = blockDim.x * blockIdx.x + threadIdx.x; - if (i < nr__) { - acc_complex_double_t z = buf__[i]; - acc_complex_double_t v = make_accDoubleComplex(vx__[i], pref__ * vy__[i]); - buf__[i] = accCmul(z, v); - } -} - -extern "C" void mul_by_veff_complex_complex_gpu_float(int nr__, acc_complex_float_t* buf__, float pref__, - float const* vx__, float const* vy__) -{ - dim3 grid_t(64); - dim3 grid_b(num_blocks(nr__, grid_t.x)); +//#include "gpu/acc_common.hpp" +//#include "gpu/acc_runtime.hpp" +// +//template +//__global__ void +//mul_by_veff_real_real_gpu_kernel(int nr__, T const* in__,T const* veff__, T* out__) +//{ +// int i = blockDim.x * blockIdx.x + threadIdx.x; +// if (i < nr__) { +// out__[i] = in__[i] * veff__[i]; +// } +//} +// +//template +//__global__ void +//mul_by_veff_complex_real_gpu_kernel(int nr__, gpu_complex_type const* in__, T const* veff__, +// gpu_complex_type* out__) +//{ +// int i = blockDim.x * blockIdx.x + threadIdx.x; +// if (i < nr__) { +// out__[i] = mul_accNumbers(veff__[i], in__[i]); +// } +//} +// +//template +//__global__ void +//mul_by_veff_complex_complex_gpu_kernel(int nr__, gpu_complex_type const* in__, T pref__, T const* vx__, +// T const* vy__, gpu_complex_type* out__) +//{ +// int i = blockDim.x * blockIdx.x + threadIdx.x; +// if (i < nr__) { +// out__[i] = mul_accNumbers(in__[i], make_accComplex(vx__[i], pref__ * vy__[i])); +// } +//} +// +//extern "C" { +// +//void +//mul_by_veff_real_real_gpu_float(int nr__, float const* in__, float const* veff__, float* out__) +//{ +// dim3 grid_t(64); +// dim3 grid_b(num_blocks(nr__, grid_t.x)); +// +// accLaunchKernel((mul_by_veff_real_real_gpu_kernel), dim3(grid_b), dim3(grid_t), 0, 0, +// nr__, in__, veff__, out__); +//} +// +//void +//mul_by_veff_real_real_gpu_double(int nr__, double const* in__, double const* veff__, double* out__) +//{ +// dim3 grid_t(64); +// dim3 grid_b(num_blocks(nr__, grid_t.x)); +// +// accLaunchKernel((mul_by_veff_real_real_gpu_kernel), dim3(grid_b), dim3(grid_t), 0, 0, +// nr__, in__, veff__, out__); +//} +// +//void +//mul_by_veff_complex_real_gpu_float(int nr__, gpu_complex_type const* in__, float const* veff__, +// gpu_complex_type* out__) +//{ +// dim3 grid_t(64); +// dim3 grid_b(num_blocks(nr__, grid_t.x)); +// +// accLaunchKernel((mul_by_veff_complex_real_gpu_kernel), dim3(grid_b), dim3(grid_t), 0, 0, +// nr__, in__, veff__, out__); +//} +// +//void +//mul_by_veff_complex_real_gpu_double(int nr__, gpu_complex_type const* in__, double const* veff__, +// gpu_complex_type* out__) +//{ +// dim3 grid_t(64); +// dim3 grid_b(num_blocks(nr__, grid_t.x)); +// +// accLaunchKernel((mul_by_veff_complex_real_gpu_kernel), dim3(grid_b), dim3(grid_t), 0, 0, +// nr__, in__, veff__, out__); +//} +// +//void +//mul_by_veff_complex_complex_gpu_float(int nr__, gpu_complex_type const* in__, float pref__, +// float const* vx__, float const* vy__, gpu_complex_type* out__) +//{ +// dim3 grid_t(64); +// dim3 grid_b(num_blocks(nr__, grid_t.x)); +// +// accLaunchKernel((mul_by_veff_complex_complex_gpu_kernel), dim3(grid_b), dim3(grid_t), 0, 0, +// nr__, in__, pref__, vx__, vy__, out__); +//} +// +//void +//mul_by_veff_complex_complex_gpu_double(int nr__, gpu_complex_type const* in__, double pref__, +// double const* vx__, double const* vy__, gpu_complex_type* out__) +//{ +// dim3 grid_t(64); +// dim3 grid_b(num_blocks(nr__, grid_t.x)); +// +// accLaunchKernel((mul_by_veff_complex_complex_gpu_kernel), dim3(grid_b), dim3(grid_t), 0, 0, +// nr__, in__, pref__, vx__, vy__, out__); +//} - accLaunchKernel((mul_by_veff_complex_complex_gpu_kernel), dim3(grid_b), dim3(grid_t), 0, 0, nr__, buf__, - pref__, vx__, vy__); -} +//} -extern "C" void mul_by_veff_complex_complex_gpu_double(int nr__, acc_complex_double_t* buf__, double pref__, - double const* vx__, double const* vy__) -{ - dim3 grid_t(64); - dim3 grid_b(num_blocks(nr__, grid_t.x)); - accLaunchKernel((mul_by_veff_complex_complex_gpu_kernel), dim3(grid_b), dim3(grid_t), 0, 0, nr__, buf__, - pref__, vx__, vy__); -} diff --git a/src/gpu/mul_veff_with_phase_factors.cu b/src/gpu/mul_veff_with_phase_factors.cu index f7630f738..a2cf553ca 100644 --- a/src/gpu/mul_veff_with_phase_factors.cu +++ b/src/gpu/mul_veff_with_phase_factors.cu @@ -22,7 +22,7 @@ * \brief CUDA kernel to multiply effective potential by the phase factors. */ -#include "gpu/cuda_common.hpp" +#include "gpu/acc_common.hpp" #include "gpu/acc_runtime.hpp" __global__ void mul_veff_with_phase_factors_gpu_kernel(int num_gvec_loc__, diff --git a/src/gpu/residuals_aux.cu b/src/gpu/residuals_aux.cu index 5492a3e3d..844bd38e1 100644 --- a/src/gpu/residuals_aux.cu +++ b/src/gpu/residuals_aux.cu @@ -22,7 +22,7 @@ * \brief CUDA kernel to compute wave-function residuals on GPUs. */ -#include "gpu/cuda_common.hpp" +#include "gpu/acc_common.hpp" #include "gpu/acc_runtime.hpp" template @@ -304,6 +304,117 @@ extern "C" void add_square_sum_gpu_float(acc_complex_float_t* wf__, num_rows_loc__, wf__, reduced__, mpi_rank__, result__); } +template +static inline __device__ std::enable_if_t::value, F> +inner_diag_local_aux(gpu_complex_type z1__, gpu_complex_type z2__) +{ + return z1__.x * z2__.x + z1__.y * z2__.y; +} + +/// For complex-type F (complex or complex). +template +static inline __device__ std::enable_if_t::value, F> +inner_diag_local_aux(gpu_complex_type z1__, gpu_complex_type z2__) +{ + return mul_accNumbers(make_accComplex(z1__.x, -z1__.y), z2__); +} + + +template +__global__ void inner_diag_local_gpu_kernel(gpu_complex_type const* wf1__, int ld1__, + gpu_complex_type const* wf2__, int ld2__, int ngv_loc__, int reduced__, F* result__) +{ + int N = num_blocks(ngv_loc__, blockDim.x); + + ACC_DYNAMIC_SHARED(char, sdata_ptr) + F* sdata = (F*)&sdata_ptr[0]; + + sdata[threadIdx.x] = accZero(); + + for (int i = 0; i < N; i++) { + int j = i * blockDim.x + threadIdx.x; + if (j < ngv_loc__) { + int k1 = array2D_offset(j, blockIdx.x, ld1__); + int k2 = array2D_offset(j, blockIdx.x, ld2__); + sdata[threadIdx.x] = add_accNumbers(sdata[threadIdx.x], inner_diag_local_aux(wf1__[k1], wf2__[k2])); + } + } + __syncthreads(); + + for (int s = 1; s < blockDim.x; s *= 2) { + if (threadIdx.x % (2 * s) == 0) { + sdata[threadIdx.x] = add_accNumbers(sdata[threadIdx.x], sdata[threadIdx.x + s]); + } + __syncthreads(); + } + + if (threadIdx.x == 0) { + if (!reduced__) { + result__[blockIdx.x] = add_accNumbers(result__[blockIdx.x], sdata[0]); + } else { + /* compute 2*sdata[0] */ + sdata[0] = add_accNumbers(sdata[0], sdata[0]); + if (reduced__ == 1) { + /* for gamma-point case F can only be double or float */ + real_type x = wf1__[array2D_offset(0, blockIdx.x, ld1__)].x * wf2__[array2D_offset(0, blockIdx.x, ld2__)].x; + /* trick the compiler here */ + F* a = (F*)((void*)&x); + result__[blockIdx.x] = sub_accNumbers(sdata[0], *a); + } else { /* reduced > 1 -> all other G-vectors */ + result__[blockIdx.x] = sdata[0]; + } + } + } +} + + +extern "C" { + +void inner_diag_local_gpu_double_complex_double(gpu_complex_type* wf1__, int ld1__, + gpu_complex_type* wf2__, int ld2__, int ngv_loc__, int nwf__, + gpu_complex_type* result__) +{ + dim3 grid_t(64); + dim3 grid_b(nwf__); + + accLaunchKernel((inner_diag_local_gpu_kernel>), dim3(grid_b), dim3(grid_t), + grid_t.x * sizeof(gpu_complex_type), 0, + wf1__, ld1__, wf2__, ld2__, ngv_loc__, 0, result__); + +} + +void inner_diag_local_gpu_double_double(gpu_complex_type* wf1__, int ld1__, + gpu_complex_type* wf2__, int ld2__, int ngv_loc__, int nwf__, int reduced__, + double* result__) +{ + dim3 grid_t(64); + dim3 grid_b(nwf__); + + accLaunchKernel((inner_diag_local_gpu_kernel), dim3(grid_b), dim3(grid_t), + grid_t.x * sizeof(double), 0, + wf1__, ld1__, wf2__, ld2__, ngv_loc__, reduced__, result__); + +} + +} + + + + + + +/* +inner_diag_local_gpu_float_float +inner_diag_local_gpu_float_double +inner_diag_local_gpu_float_complex_float +inner_diag_local_gpu_float_complex_double +inner_diag_local_gpu_double_double +inner_diag_local_gpu_double_complex_double +*/ + + + + template __global__ void apply_preconditioner_gpu_kernel(int const num_rows_loc__, T const* eval__, @@ -418,18 +529,83 @@ extern "C" void make_real_g0_gpu_float(acc_complex_float_t* res__, +template +__global__ void axpby_gpu_kernel(F const* beta__, gpu_complex_type* y__, int ld2__, int ngv_loc__) +{ + /* index of the wave-function coefficient */ + int j = blockIdx.x * blockDim.x + threadIdx.x; + /* idex of the band */ + int ibnd = blockIdx.y; + if (j < ngv_loc__) { + int k2 = array2D_offset(j, ibnd, ld2__); + y__[k2] = mul_accNumbers(beta__[ibnd], y__[k2]); + } +} +template +__global__ void axpby_gpu_kernel(F const* alpha__, gpu_complex_type const* x__, int ld1__, + F const* beta__, gpu_complex_type* y__, int ld2__, int ngv_loc__) +{ + /* index of the wave-function coefficient */ + int j = blockIdx.x * blockDim.x + threadIdx.x; + /* idex of the band */ + int ibnd = blockIdx.y; + auto alpha = alpha__[ibnd]; + auto beta = beta__[ibnd]; + if (j < ngv_loc__) { + int k1 = array2D_offset(j, ibnd, ld1__); + int k2 = array2D_offset(j, ibnd, ld2__); + if (is_zero(beta)) { + y__[k2] = mul_accNumbers(alpha, x__[k1]); + } else if (is_zero(alpha)) { + y__[k2] = mul_accNumbers(beta, y__[k2]); + } else { + y__[k2] = add_accNumbers(mul_accNumbers(alpha, x__[k1]), mul_accNumbers(beta, y__[k2])); + } + } +} +extern "C" { +void axpby_gpu_double_complex_double(int nwf__, gpu_complex_type const* alpha__, gpu_complex_type const* x__, int ld1__, + gpu_complex_type const* beta__, gpu_complex_type* y__, int ld2__, int ngv_loc__) +{ + dim3 grid_t(64); + dim3 grid_b(num_blocks(ngv_loc__, grid_t.x), nwf__); + + if (x__) { + accLaunchKernel((axpby_gpu_kernel>), dim3(grid_b), dim3(grid_t), 0, 0, + alpha__, x__, ld1__, beta__, y__, ld2__, ngv_loc__); + } else { + accLaunchKernel((axpby_gpu_kernel>), dim3(grid_b), dim3(grid_t), 0, 0, + beta__, y__, ld2__, ngv_loc__); + } +} +void axpby_gpu_double_double(int nwf__, double const* alpha__, gpu_complex_type const* x__, int ld1__, + double const* beta__, gpu_complex_type* y__, int ld2__, int ngv_loc__) +{ + dim3 grid_t(64); + dim3 grid_b(num_blocks(ngv_loc__, grid_t.x), nwf__); + + if (x__) { + accLaunchKernel((axpby_gpu_kernel), dim3(grid_b), dim3(grid_t), 0, 0, + alpha__, x__, ld1__, beta__, y__, ld2__, ngv_loc__); + } else { + accLaunchKernel((axpby_gpu_kernel), dim3(grid_b), dim3(grid_t), 0, 0, + beta__, y__, ld2__, ngv_loc__); + } +} +} + diff --git a/src/gpu/scale_matrix.cu b/src/gpu/scale_matrix.cu index 3ee3021fc..4eb4fde4c 100644 --- a/src/gpu/scale_matrix.cu +++ b/src/gpu/scale_matrix.cu @@ -21,7 +21,7 @@ * * \brief Contains implementation of CUDA kernels to scale matrix elements (rows or columns). */ -#include "cuda_common.hpp" +#include "acc_common.hpp" #include "acc_runtime.hpp" template diff --git a/src/gpu/spherical_harmonics.cu b/src/gpu/spherical_harmonics.cu index 31e9b5311..08d022ee7 100644 --- a/src/gpu/spherical_harmonics.cu +++ b/src/gpu/spherical_harmonics.cu @@ -23,7 +23,7 @@ */ #include -#include "gpu/cuda_common.hpp" +#include "gpu/acc_common.hpp" #include "gpu/acc_runtime.hpp" inline __device__ int lmidx(int l, int m) diff --git a/src/gpu/spline.cu b/src/gpu/spline.cu index bd7e82e0a..b26ae8c7d 100644 --- a/src/gpu/spline.cu +++ b/src/gpu/spline.cu @@ -22,7 +22,7 @@ * \brief CUDA kernels to perform operations on splines. */ -#include "gpu/cuda_common.hpp" +#include "gpu/acc_common.hpp" #include "gpu/acc_runtime.hpp" __global__ void spline_inner_product_gpu_kernel_v3(int num_points__, diff --git a/src/gpu/sum_q_pw_dm_pw.cu b/src/gpu/sum_q_pw_dm_pw.cu index ad6a0bd6e..5fb521d73 100644 --- a/src/gpu/sum_q_pw_dm_pw.cu +++ b/src/gpu/sum_q_pw_dm_pw.cu @@ -22,7 +22,7 @@ * \brief CUDA kernel to perform a summation over xi,xi' indices for the charge density augmentation. */ -#include "gpu/cuda_common.hpp" +#include "gpu/acc_common.hpp" #include "gpu/acc_runtime.hpp" #ifdef SIRIUS_CUDA diff --git a/src/hamiltonian/hamiltonian.cpp b/src/hamiltonian/hamiltonian.cpp index bca7e9481..925300244 100644 --- a/src/hamiltonian/hamiltonian.cpp +++ b/src/hamiltonian/hamiltonian.cpp @@ -40,7 +40,7 @@ Hamiltonian0::Hamiltonian0(Potential& potential__, bool precompute_lapw__) PROFILE("sirius::Hamiltonian0"); local_op_ = std::unique_ptr>( - new Local_operator(ctx_, ctx_.spfft_coarse(), ctx_.gvec_coarse_partition(), &potential__)); + new Local_operator(ctx_, ctx_.spfft_coarse(), ctx_.gvec_coarse_fft_sptr(), &potential__)); if (!ctx_.full_potential()) { d_op_ = std::unique_ptr>(new D_operator(ctx_)); @@ -153,14 +153,14 @@ Hamiltonian0::add_o1mt_to_apw(Atom const& atom__, int num_gkvec__, sddk::mdar template void -Hamiltonian0::apply_bmt(sddk::Wave_functions& psi__, std::vector>& bpsi__) const +Hamiltonian0::apply_bmt(wf::Wave_functions& psi__, std::vector>& bpsi__) const { sddk::mdarray, 3> zm(unit_cell_.max_mt_basis_size(), unit_cell_.max_mt_basis_size(), ctx_.num_mag_dims()); for (int ialoc = 0; ialoc < psi__.spl_num_atoms().local_size(); ialoc++) { int ia = psi__.spl_num_atoms()[ialoc]; auto& atom = unit_cell_.atom(ia); - int offset = psi__.offset_mt_coeffs(ialoc); + //int offset = psi__.offset_mt_coeffs(ialoc); int mt_basis_size = atom.type().mt_basis_size(); zm.zero(); @@ -183,9 +183,9 @@ Hamiltonian0::apply_bmt(sddk::Wave_functions& psi__, std::vector */ sddk::linalg(sddk::linalg_t::blas).hemm( 'L', 'U', mt_basis_size, ctx_.num_fv_states(), &sddk::linalg_const>::one(), - zm.at(sddk::memory_t::host), zm.ld(), psi__.mt_coeffs(0).prime().at(sddk::memory_t::host, offset, 0), - psi__.mt_coeffs(0).prime().ld(), &sddk::linalg_const>::zero(), - bpsi__[0].mt_coeffs(0).prime().at(sddk::memory_t::host, offset, 0), bpsi__[0].mt_coeffs(0).prime().ld()); + zm.at(sddk::memory_t::host), zm.ld(), &psi__.mt_coeffs(0, wf::atom_index(ialoc), wf::spin_index(0), wf::band_index(0)), + psi__.ld(), &sddk::linalg_const>::zero(), + &bpsi__[0].mt_coeffs(0, wf::atom_index(ialoc), wf::spin_index(0), wf::band_index(0)), bpsi__[0].ld()); /* compute bwf = (B_x - iB_y)|wf_j> */ if (bpsi__.size() == 3) { @@ -204,23 +204,25 @@ Hamiltonian0::apply_bmt(sddk::Wave_functions& psi__, std::vector>::one(), - zm.at(sddk::memory_t::host), zm.ld(), psi__.mt_coeffs(0).prime().at(sddk::memory_t::host, offset, 0), - psi__.mt_coeffs(0).prime().ld(), &sddk::linalg_const>::zero(), - bpsi__[2].mt_coeffs(0).prime().at(sddk::memory_t::host, offset, 0), bpsi__[2].mt_coeffs(0).prime().ld()); + zm.at(sddk::memory_t::host), zm.ld(), &psi__.mt_coeffs(0, wf::atom_index(ialoc), wf::spin_index(0), wf::band_index(0)), + psi__.ld(), &sddk::linalg_const>::zero(), + &bpsi__[2].mt_coeffs(0, wf::atom_index(ialoc), wf::spin_index(0), wf::band_index(0)), bpsi__[2].ld()); } } } template void -Hamiltonian0::apply_so_correction(sddk::Wave_functions& psi__, std::vector>& hpsi__) const +Hamiltonian0::apply_so_correction(wf::Wave_functions& psi__, std::vector>& hpsi__) const { PROFILE("sirius::Hamiltonian0::apply_so_correction"); + wf::spin_index s(0); + for (int ialoc = 0; ialoc < psi__.spl_num_atoms().local_size(); ialoc++) { int ia = psi__.spl_num_atoms()[ialoc]; auto& atom = unit_cell_.atom(ia); - int offset = psi__.offset_mt_coeffs(ialoc); + wf::atom_index a(ialoc); for (int l = 0; l <= atom.type().lmax_apw(); l++) { /* number of radial functions for this l */ @@ -237,15 +239,15 @@ Hamiltonian0::apply_so_correction(sddk::Wave_functions& psi__, std::vector // int idx4 = (m - l != 0) ? atom.type().indexb_by_l_m_order(l, m + 1, order2) : 0; for (int ist = 0; ist < ctx_.num_fv_states(); ist++) { - std::complex z1 = psi__.mt_coeffs(0).prime(offset + idx2, ist) * T(m) * sori; + wf::band_index b(ist); + auto z1 = psi__.mt_coeffs(idx2, a, s, b) * T(m) * sori; /* u-u part */ - hpsi__[0].mt_coeffs(0).prime(offset + idx1, ist) += z1; + hpsi__[0].mt_coeffs(idx1, a, s, b) += z1; /* d-d part */ - hpsi__[1].mt_coeffs(0).prime(offset + idx1, ist) -= z1; + hpsi__[1].mt_coeffs(idx1, a, s, b) -= z1; /* apply L_{-} operator; u-d part */ if (m + l) { - hpsi__[2].mt_coeffs(0).prime(offset + idx1, ist) += - psi__.mt_coeffs(0).prime(offset + idx3, ist) * sori * + hpsi__[2].mt_coeffs(idx1, a, s, b) += psi__.mt_coeffs(idx3, a, s, b) * sori * std::sqrt(T(l * (l + 1) - m * (m - 1))); } /* for the d-u part */ diff --git a/src/hamiltonian/hamiltonian.hpp b/src/hamiltonian/hamiltonian.hpp index 18f4f4918..9a090a256 100644 --- a/src/hamiltonian/hamiltonian.hpp +++ b/src/hamiltonian/hamiltonian.hpp @@ -29,14 +29,26 @@ #include #include "SDDK/memory.hpp" #include "SDDK/type_definition.hpp" +#include "SDDK/dmatrix.hpp" #include "typedefs.hpp" - -namespace sddk { -/* forward declaration */ -template -class Wave_functions; -class spin_range; -} +#include "SDDK/wave_functions.hpp" +#include "fft.hpp" +#include "local_operator.hpp" +#include "non_local_operator.hpp" + +//namespace sddk { +///* forward declaration */ +//template +//class Wave_functions; +//class spin_range; +//} +// +//namespace wf { +//template +//class Wave_functions; +//class band_range; +//class spin_range; +//} namespace sirius { /* forward declaration */ @@ -71,6 +83,8 @@ template class Hamiltonian_k; /// Represent the k-point independent part of Hamiltonian. +/** \tparam T Precision of the wave-functions (float or double). + */ template // type is real type precision class Hamiltonian0 { @@ -160,7 +174,7 @@ class Hamiltonian0 sddk::mdarray, 2>& alm__) const; // TODO: documentation /// Apply muffin-tin part of magnetic filed to the wave-functions. - void apply_bmt(sddk::Wave_functions& psi__, std::vector>& bpsi__) const; + void apply_bmt(wf::Wave_functions& psi__, std::vector>& bpsi__) const; /// Apply SO correction to the first-variational LAPW wave-functions. /** Raising and lowering operators: @@ -168,7 +182,7 @@ class Hamiltonian0 * L_{\pm} Y_{\ell m}= (L_x \pm i L_y) Y_{\ell m} = \sqrt{\ell(\ell+1) - m(m \pm 1)} Y_{\ell m \pm 1} * \f] */ - void apply_so_correction(sddk::Wave_functions& psi__, std::vector>& hpsi__) const; + void apply_so_correction(wf::Wave_functions& psi__, std::vector>& hpsi__) const; }; template @@ -199,12 +213,12 @@ class Hamiltonian_k return H0_; } - K_point& kp() + auto& kp() { return kp_; } - K_point const& kp() const + auto const& kp() const { return kp_; } @@ -215,7 +229,7 @@ class Hamiltonian_k template std::pair, sddk::mdarray> get_h_o_diag_lapw() const; - U_operator& U() + auto& U() { return *u_op_; } @@ -351,9 +365,11 @@ class Hamiltonian_k * \param [out] hphi Result of Hamiltonian, applied to wave-functions. * \param [out] ophi Result of overlap operator, applied to wave-functions. */ - void apply_fv_h_o(bool apw_only__, bool phi_is_lo__, int N__, int n__, sddk::Wave_functions& phi__, - sddk::Wave_functions* hphi__, sddk::Wave_functions* ophi__); + //void apply_fv_h_o(bool apw_only__, bool phi_is_lo__, int N__, int n__, sddk::Wave_functions& phi__, + // sddk::Wave_functions* hphi__, sddk::Wave_functions* ophi__); + void apply_fv_h_o(bool apw_only__, bool phi_is_lo__, wf::band_range b__, wf::Wave_functions& phi__, + wf::Wave_functions* hphi__, wf::Wave_functions* ophi__); /// Setup the Hamiltonian and overlap matrices in APW+lo basis /** The Hamiltonian matrix has the following expression: * \f[ @@ -445,12 +461,79 @@ class Hamiltonian_k * In non-collinear case (spins in [0,1]) the Hamiltonian and S operator are applied to both components of spinor * wave-functions. Otherwise they are applied to a single component. */ - template >::value>> - void apply_h_s(sddk::spin_range spins__, int N__, int n__, sddk::Wave_functions& phi__, - sddk::Wave_functions* hphi__, sddk::Wave_functions* sphi__); + //template >::value>> + //void apply_h_s(sddk::spin_range spins__, int N__, int n__, sddk::Wave_functions& phi__, + // sddk::Wave_functions* hphi__, sddk::Wave_functions* sphi__); + + /** \tparam F Type of the subspace matrix. + */ + template + std::enable_if_t>::value, void> + apply_h_s(wf::spin_range spins__, wf::band_range br__, wf::Wave_functions const& phi__, + wf::Wave_functions* hphi__, wf::Wave_functions* sphi__) + { + PROFILE("sirius::Hamiltonian_k::apply_h_s"); + + auto pcs = env::print_checksum(); + + if (hphi__ != nullptr) { + /* apply local part of Hamiltonian */ + H0().local_op().apply_h(reinterpret_cast&>(kp().spfft_transform()), + kp().gkvec_fft_sptr(), spins__, phi__, *hphi__, br__); + } + + auto mem = H0().ctx().processing_unit_memory_t(); + + if (pcs) { + auto cs = phi__.checksum(mem, br__); + utils::print_checksum("phi", cs, RTE_OUT(H0().ctx().out())); + if (hphi__) { + auto cs = hphi__->checksum(mem, br__); + utils::print_checksum("hloc_phi", cs, RTE_OUT(H0().ctx().out())); + } + } + + /* set initial sphi */ + if (sphi__ != nullptr) { + for (auto s = spins__.begin(); s!= spins__.end(); s++) { + auto sp = phi__.actual_spin_index(s); + wf::copy(mem, phi__, sp, br__, *sphi__, sp, br__); + } + } + + /* return if there are no beta-projectors */ + if (H0().ctx().unit_cell().mt_lo_basis_size()) { + apply_non_local_D_Q(mem, spins__, br__, kp().beta_projectors(), phi__, &H0().D(), hphi__, &H0().Q(), sphi__); + } + + /* apply the hubbard potential if relevant */ + if (H0().ctx().hubbard_correction() && !H0().ctx().gamma_point() && hphi__) { + /* apply the hubbard potential */ + apply_U_operator(H0().ctx(), spins__, br__, kp().hubbard_wave_functions_S(), phi__, this->U(), *hphi__); + } + + if (pcs) { + if (hphi__) { + auto cs = hphi__->checksum(mem, br__); + utils::print_checksum("hphi", cs, RTE_OUT(H0().ctx().out())); + } + if (sphi__) { + auto cs = sphi__->checksum(mem, br__); + utils::print_checksum("hsphi", cs, RTE_OUT(H0().ctx().out())); + } + } + } + + template + std::enable_if_t>::value, void> + apply_h_s(wf::spin_range spins__, wf::band_range br__, wf::Wave_functions const& phi__, + wf::Wave_functions* hphi__, wf::Wave_functions* sphi__) + { + RTE_THROW("implementat this"); + } /// Apply magnetic field to first-variational LAPW wave-functions. - void apply_b(sddk::Wave_functions& psi__, std::vector>& bpsi__); + void apply_b(wf::Wave_functions& psi__, std::vector>& bpsi__); }; template diff --git a/src/hamiltonian/hamiltonian_k.cpp b/src/hamiltonian/hamiltonian_k.cpp index ec23b343c..c431cad6f 100644 --- a/src/hamiltonian/hamiltonian_k.cpp +++ b/src/hamiltonian/hamiltonian_k.cpp @@ -37,22 +37,23 @@ namespace sirius { template -Hamiltonian_k::Hamiltonian_k(Hamiltonian0& H0__, - K_point& kp__) // TODO: move kinetic part from local_op to here +Hamiltonian_k::Hamiltonian_k(Hamiltonian0& H0__, K_point& kp__) : H0_(H0__) , kp_(kp__) { PROFILE("sirius::Hamiltonian_k"); - H0_.local_op().prepare_k(kp_.gkvec_partition()); + H0_.local_op().prepare_k(kp_.gkvec_fft()); if (!H0_.ctx().full_potential()) { if (H0_.ctx().cfg().iterative_solver().type() != "exact") { kp_.beta_projectors().prepare(); } - u_op_ = std::shared_ptr>( - new U_operator(H0__.ctx(), H0__.potential().hubbard_potential(), kp__.vk())); - } - if (!H0_.ctx().full_potential() && H0_.ctx().hubbard_correction()) { - kp_.hubbard_wave_functions_S().prepare(sddk::spin_range(0), true, &H0_.ctx().mem_pool(sddk::memory_t::device)); + if (H0_.ctx().hubbard_correction()) { + u_op_ = std::make_shared>(H0__.ctx(), H0__.potential().hubbard_potential(), kp__.vk()); + if (H0_.ctx().processing_unit() == sddk::device_t::GPU) { + const_cast&>(kp_.hubbard_wave_functions_S()).allocate(H0_.ctx().processing_unit_memory_t()); + const_cast&>(kp_.hubbard_wave_functions_S()).copy_to(H0_.ctx().processing_unit_memory_t()); + } + } } } @@ -63,9 +64,11 @@ Hamiltonian_k::~Hamiltonian_k() if (H0_.ctx().cfg().iterative_solver().type() != "exact") { kp_.beta_projectors().dismiss(); } - } - if (!H0_.ctx().full_potential() && H0_.ctx().hubbard_correction()) { - kp_.hubbard_wave_functions_S().dismiss(sddk::spin_range(0), false); + if (H0_.ctx().hubbard_correction()) { + if (H0_.ctx().processing_unit() == sddk::device_t::GPU) { + const_cast&>(kp_.hubbard_wave_functions_S()).deallocate(H0_.ctx().processing_unit_memory_t()); + } + } } } @@ -343,9 +346,9 @@ Hamiltonian_k::set_fv_h_o(sddk::dmatrix>& h__, sddk::dmatrix< } } - sddk::mdarray, 3> alm_row(kp.num_gkvec_row(), max_mt_aw, nb, H0_.ctx().mem_pool(mt)); - sddk::mdarray, 3> alm_col(kp.num_gkvec_col(), max_mt_aw, nb, H0_.ctx().mem_pool(mt)); - sddk::mdarray, 3> halm_col(kp.num_gkvec_col(), max_mt_aw, nb, H0_.ctx().mem_pool(mt)); + sddk::mdarray, 3> alm_row(kp.num_gkvec_row(), max_mt_aw, nb, get_memory_pool(mt)); + sddk::mdarray, 3> alm_col(kp.num_gkvec_col(), max_mt_aw, nb, get_memory_pool(mt)); + sddk::mdarray, 3> halm_col(kp.num_gkvec_col(), max_mt_aw, nb, get_memory_pool(mt)); H0_.ctx().print_memory_usage(__FILE__, __LINE__); @@ -353,9 +356,9 @@ Hamiltonian_k::set_fv_h_o(sddk::dmatrix>& h__, sddk::dmatrix< o__.zero(); switch (pu) { case sddk::device_t::GPU: { - alm_row.allocate(H0_.ctx().mem_pool(sddk::memory_t::device)); - alm_col.allocate(H0_.ctx().mem_pool(sddk::memory_t::device)); - halm_col.allocate(H0_.ctx().mem_pool(sddk::memory_t::device)); + alm_row.allocate(get_memory_pool(sddk::memory_t::device)); + alm_col.allocate(get_memory_pool(sddk::memory_t::device)); + halm_col.allocate(get_memory_pool(sddk::memory_t::device)); // h__.zero(memory_t::device); // o__.zero(memory_t::device); break; @@ -503,10 +506,10 @@ Hamiltonian_k::set_fv_h_o(sddk::dmatrix>& h__, sddk::dmatrix< // } PROFILE_STOP("sirius::Hamiltonian_k::set_fv_h_o|zgemm"); std::chrono::duration tval = std::chrono::high_resolution_clock::now() - t1; - auto pp = utils::get_env("SIRIUS_PRINT_PERFORMANCE"); + auto pp = env::print_performance(); - if (kp.comm().rank() == 0 && (H0_.ctx().cfg().control().print_performance() || (pp && *pp))) { - kp.message((pp && *pp) ? 0 : 1, __function_name__, "effective zgemm performance: %12.6f GFlops\n", + if (kp.comm().rank() == 0 && (H0_.ctx().cfg().control().print_performance() || pp)) { + kp.message((pp) ? 0 : 1, __function_name__, "effective zgemm performance: %12.6f GFlops\n", 2 * 8e-9 * kp.num_gkvec() * kp.num_gkvec() * uc.mt_aw_basis_size() / tval.count()); } @@ -776,67 +779,10 @@ Hamiltonian_k::set_fv_h_o_it(sddk::dmatrix>& h__, sddk::dmatr //== } //== } -template -template -void -Hamiltonian_k::apply_h_s(sddk::spin_range spins__, int N__, int n__, sddk::Wave_functions& phi__, - sddk::Wave_functions* hphi__, sddk::Wave_functions* sphi__) -{ - PROFILE("sirius::Hamiltonian_k::apply_h_s"); - - double t1 = -omp_get_wtime(); - - if (hphi__ != nullptr) { - /* apply local part of Hamiltonian */ - H0().local_op().apply_h(reinterpret_cast&>(kp().spfft_transform()), - kp().gkvec_partition(), spins__, phi__, *hphi__, N__, n__); - } - - t1 += omp_get_wtime(); - - if (H0().ctx().cfg().control().print_performance()) { - kp().message(1, __function_name__, "hloc performance: %12.6f bands/sec", n__ / t1); - } - - if (H0().ctx().print_checksum()) { - phi__.print_checksum(get_device_t(phi__.preferred_memory_t()), "phi", N__, n__, RTE_OUT(H0().ctx().out())); - if (hphi__) { - hphi__->print_checksum(get_device_t(hphi__->preferred_memory_t()), "hloc_phi", N__, n__, RTE_OUT(H0().ctx().out())); - } - } - - /* set initial sphi */ - if (sphi__ != nullptr) { - for (int ispn : spins__) { - sphi__->copy_from(phi__, n__, ispn, N__, ispn, N__); - } - } - - /* return if there are no beta-projectors */ - if (H0().ctx().unit_cell().mt_lo_basis_size()) { - apply_non_local_d_q(spins__, N__, n__, kp().beta_projectors(), phi__, &H0().D(), hphi__, &H0().Q(), sphi__); - } - - /* apply the hubbard potential if relevant */ - if (H0().ctx().hubbard_correction() && !H0().ctx().gamma_point() && hphi__) { - /* apply the hubbard potential */ - apply_U_operator(H0().ctx(), spins__, N__, n__, kp().hubbard_wave_functions_S(), phi__, this->U(), *hphi__); - } - - if (H0().ctx().print_checksum()) { - if (hphi__) { - hphi__->print_checksum(get_device_t(hphi__->preferred_memory_t()), "hphi", N__, n__, RTE_OUT(H0().ctx().out())); - } - if (sphi__) { - sphi__->print_checksum(get_device_t(sphi__->preferred_memory_t()), "sphi", N__, n__, RTE_OUT(H0().ctx().out())); - } - } -} - template void -Hamiltonian_k::apply_fv_h_o(bool apw_only__, bool phi_is_lo__, int N__, int n__, sddk::Wave_functions& phi__, - sddk::Wave_functions* hphi__, sddk::Wave_functions* ophi__) +Hamiltonian_k::apply_fv_h_o(bool apw_only__, bool phi_is_lo__, wf::band_range b__, wf::Wave_functions& phi__, + wf::Wave_functions* hphi__, wf::Wave_functions* ophi__) { PROFILE("sirius::Hamiltonian_k::apply_fv_h_o"); @@ -845,20 +791,17 @@ Hamiltonian_k::apply_fv_h_o(bool apw_only__, bool phi_is_lo__, int N__, int n return; } - auto& ctx = H0_.ctx(); + using Tc = std::complex; + + auto& ctx = this->H0_.ctx(); auto pu = ctx.processing_unit(); auto la = (pu == sddk::device_t::CPU) ? sddk::linalg_t::blas : sddk::linalg_t::gpublas; auto mem = (pu == sddk::device_t::CPU) ? sddk::memory_t::host : sddk::memory_t::device; - if (ctx.cfg().control().print_checksum()) { - phi__.print_checksum(pu, "phi", N__, n__, RTE_OUT(std::cout)); - } - - auto pp_raw = utils::get_env("SIRIUS_PRINT_PERFORMANCE"); - - int pp = (pp_raw == nullptr) ? 0 : *pp_raw; + auto pp = env::print_performance(); + auto pcs = env::print_checksum(); /* prefactor for the matrix multiplication in complex or double arithmetic (in Giga-operations) */ double ngop{8e-9}; // default value for complex type @@ -868,74 +811,309 @@ Hamiltonian_k::apply_fv_h_o(bool apw_only__, bool phi_is_lo__, int N__, int n double gflops{0}; double time{0}; - if (!apw_only__) { - if (hphi__ != nullptr) { - /* zero the local-orbital part */ - hphi__->mt_coeffs(0).zero(mem, N__, n__); - } - if (ophi__ != nullptr) { - /* zero the local-orbital part */ - ophi__->mt_coeffs(0).zero(sddk::memory_t::host, N__, n__); - ophi__->mt_coeffs(0).zero(mem, N__, n__); + if (hphi__ != nullptr) { + hphi__->zero(mem, wf::spin_index(0), b__); + } + if (ophi__ != nullptr) { + ophi__->zero(mem, wf::spin_index(0), b__); + /* in case of GPU muffin-tin part of ophi is computed on the CPU */ + if (is_device_memory(mem)) { + ophi__->zero(sddk::memory_t::host, wf::spin_index(0), b__); } } - if (pu == sddk::device_t::GPU && !apw_only__) { - phi__.mt_coeffs(0).copy_to(sddk::memory_t::host, N__, n__); + auto& comm = kp().comm(); + + //if (!apw_only__) { + // if (hphi__ != nullptr) { + // /* zero the local-orbital part */ + // hphi__->mt_coeffs(0).zero(mem, N__, n__); + // } + // if (ophi__ != nullptr) { + // /* zero the local-orbital part */ + // ophi__->mt_coeffs(0).zero(sddk::memory_t::host, N__, n__); + // ophi__->mt_coeffs(0).zero(mem, N__, n__); + // } + //} + + /* ophi is computed on the CPU to avoid complicated GPU implementation */ + if (is_device_memory(mem)) { + phi__.copy_mt_to(sddk::memory_t::host, wf::spin_index(0), b__); + } + + if (pcs) { + auto cs = phi__.checksum(mem, wf::spin_index(0), b__); + if (comm.rank() == 0) { + utils::print_checksum("phi", cs, RTE_OUT(std::cout)); + } } if (!phi_is_lo__) { /* interstitial part */ - H0_.local_op().apply_h_o(reinterpret_cast&>(kp().spfft_transform()), - kp().gkvec_partition(), N__, n__, phi__, hphi__, ophi__); + H0_.local_op().apply_fplapw(reinterpret_cast&>(kp().spfft_transform()), + kp().gkvec_fft_sptr(), b__, phi__, hphi__, ophi__, nullptr, nullptr); - if (ctx.cfg().control().print_checksum()) { + if (pcs) { if (hphi__) { - hphi__->print_checksum(pu, "hloc_phi", N__, n__, RTE_OUT(std::cout)); + auto cs = hphi__->checksum(mem, wf::spin_index(0), b__); + if (comm.rank() == 0) { + utils::print_checksum("hloc_phi", cs, RTE_OUT(std::cout)); + } } if (ophi__) { - ophi__->print_checksum(pu, "oloc_phi", N__, n__, RTE_OUT(std::cout)); + auto cs = ophi__->checksum(mem, wf::spin_index(0), b__); + if (comm.rank() == 0) { + utils::print_checksum("oloc_phi", cs, RTE_OUT(std::cout)); + } } } } else { - /* zero the APW part */ - if (hphi__ != nullptr) { - hphi__->pw_coeffs(0).zero(mem, N__, n__); - } - if (ophi__ != nullptr) { - ophi__->pw_coeffs(0).zero(mem, N__, n__); - } + ///* zero the APW part */ + //if (hphi__ != nullptr) { + // hphi__->pw_coeffs(0).zero(mem, N__, n__); + //} + //if (ophi__ != nullptr) { + // ophi__->pw_coeffs(0).zero(mem, N__, n__); + //} } /* short name for local number of G+k vectors */ int ngv = kp().num_gkvec_loc(); - auto& comm = kp().comm(); - - PROFILE_START("sirius::Hamiltonian_k::apply_fv_h_o|mt"); + auto& spl_atoms = phi__.spl_num_atoms(); /* block size of scalapack distribution */ int bs = ctx.cyclic_block_size(); + auto& one = sddk::linalg_const::one(); + auto& zero = sddk::linalg_const::zero(); + + /* apply APW-lo part of Hamiltonian to lo- part of wave-functions */ + auto apply_hmt_apw_lo = [this, &ctx, &phi__, la, mem, &b__, &spl_atoms](wf::Wave_functions_mt& h_apw_lo__) + { + #pragma omp parallel for + for (int ialoc = 0; ialoc < spl_atoms.local_size(); ialoc++) { + int tid = omp_get_thread_num(); + int ia = spl_atoms[ialoc]; + auto& atom = ctx.unit_cell().atom(ia); + auto& type = atom.type(); + int naw = type.mt_aw_basis_size(); + int nlo = type.mt_lo_basis_size(); + + auto aidx = wf::atom_index(ialoc); + + auto& hmt = this->H0_.hmt(ia); + + sddk::linalg(la).gemm('N', 'N', naw, b__.size(), nlo, + &sddk::linalg_const::one(), + hmt.at(mem, 0, naw), hmt.ld(), + phi__.at(mem, 0, aidx, wf::spin_index(0), wf::band_index(b__.begin())), phi__.ld(), + &sddk::linalg_const::zero(), + h_apw_lo__.at(mem, 0, aidx, wf::spin_index(0), wf::band_index(0)), h_apw_lo__.ld(), + stream_id(tid)); + } + if (is_device_memory(mem)) { + h_apw_lo__.copy_to(sddk::memory_t::host); + } + }; + + /* apply APW-lo part of overlap matrix to lo- part of wave-functions */ + auto apply_omt_apw_lo = [this, &ctx, &phi__, &b__, &spl_atoms](wf::Wave_functions_mt& o_apw_lo__) + { + o_apw_lo__.zero(sddk::memory_t::host, wf::spin_index(0), wf::band_range(0, b__.size())); + + #pragma omp parallel for + for (int ialoc = 0; ialoc < spl_atoms.local_size(); ialoc++) { + int ia = spl_atoms[ialoc]; + auto& atom = ctx.unit_cell().atom(ia); + auto& type = atom.type(); + int naw = type.mt_aw_basis_size(); + int nlo = type.mt_lo_basis_size(); + + auto aidx = wf::atom_index(ialoc); + + for (int j = 0; j < b__.size(); j++) { + for (int ilo = 0; ilo < nlo; ilo++) { + int xi_lo = naw + ilo; + /* local orbital indices */ + int l_lo = type.indexb(xi_lo).l; + int lm_lo = type.indexb(xi_lo).lm; + int order_lo = type.indexb(xi_lo).order; + for (int order_aw = 0; order_aw < (int)type.aw_descriptor(l_lo).size(); order_aw++) { + int xi = type.indexb_by_lm_order(lm_lo, order_aw); + o_apw_lo__.mt_coeffs(xi, aidx, wf::spin_index(0), wf::band_index(j)) += + phi__.mt_coeffs(ilo, aidx, wf::spin_index(0), wf::band_index(b__.begin() + j)) * + static_cast(atom.symmetry_class().o_radial_integral(l_lo, order_aw, order_lo)); + } + } + } + } + }; + + auto appy_hmt_lo_lo = [this, &ctx, &phi__, la, mem, &b__, &spl_atoms](wf::Wave_functions& hphi__) + { + /* lo-lo contribution */ + #pragma omp parallel for + for (int ialoc = 0; ialoc < spl_atoms.local_size(); ialoc++) { + int tid = omp_get_thread_num(); + int ia = spl_atoms[ialoc]; + auto& atom = ctx.unit_cell().atom(ia); + auto& type = atom.type(); + int naw = type.mt_aw_basis_size(); + int nlo = type.mt_lo_basis_size(); + + auto aidx = wf::atom_index(ialoc); + + auto& hmt = H0_.hmt(ia); + + sddk::linalg(la).gemm('N', 'N', nlo, b__.size(), nlo, &sddk::linalg_const::one(), + hmt.at(mem, naw, naw), hmt.ld(), + phi__.at(mem, 0, aidx, wf::spin_index(0), wf::band_index(b__.begin())), phi__.ld(), + &sddk::linalg_const::one(), + hphi__.at(mem, 0, aidx, wf::spin_index(0), wf::band_index(b__.begin())), hphi__.ld(), + stream_id(tid)); + } + }; + + auto appy_omt_lo_lo = [this, &ctx, &phi__, &b__, &spl_atoms](wf::Wave_functions& ophi__) + { + /* lo-lo contribution */ + #pragma omp parallel for + for (int ialoc = 0; ialoc < spl_atoms.local_size(); ialoc++) { + int ia = spl_atoms[ialoc]; + auto& atom = ctx.unit_cell().atom(ia); + auto& type = atom.type(); + + auto aidx = wf::atom_index(ialoc); + + for (int ilo = 0; ilo < type.mt_lo_basis_size(); ilo++) { + int xi_lo = type.mt_aw_basis_size() + ilo; + /* local orbital indices */ + int l_lo = type.indexb(xi_lo).l; + int lm_lo = type.indexb(xi_lo).lm; + int order_lo = type.indexb(xi_lo).order; + + /* lo-lo contribution */ + for (int jlo = 0; jlo < type.mt_lo_basis_size(); jlo++) { + int xi_lo1 = type.mt_aw_basis_size() + jlo; + int lm1 = type.indexb(xi_lo1).lm; + int order1 = type.indexb(xi_lo1).order; + if (lm_lo == lm1) { + for (int i = 0; i < b__.size(); i++) { + ophi__.mt_coeffs(ilo, aidx, wf::spin_index(0), wf::band_index(b__.begin() + i)) += + phi__.mt_coeffs(jlo, aidx, wf::spin_index(0), wf::band_index(b__.begin() + i)) * + static_cast(atom.symmetry_class().o_radial_integral(l_lo, order_lo, order1)); + } + } + } + } + } + }; + + auto appy_hmt_apw_apw = [this, &ctx, la, mem, &b__](int atom_begin__, wf::Wave_functions_mt const& alm_phi__, + wf::Wave_functions_mt& halm_phi__) + { + #pragma omp parallel for + for (int ialoc = 0; ialoc < alm_phi__.spl_num_atoms().local_size(); ialoc++) { + int tid = omp_get_thread_num(); + int ia = atom_begin__ + alm_phi__.spl_num_atoms()[ialoc]; + auto& atom = ctx.unit_cell().atom(ia); + auto& type = atom.type(); + int naw = type.mt_aw_basis_size(); + + auto aidx = wf::atom_index(ialoc); + + auto& hmt = H0_.hmt(ia); + + // TODO: use in-place trmm + sddk::linalg(la).gemm('N', 'N', naw, b__.size(), naw, + &sddk::linalg_const::one(), hmt.at(mem), hmt.ld(), + alm_phi__.at(mem, 0, aidx, wf::spin_index(0), wf::band_index(0)), alm_phi__.ld(), + &sddk::linalg_const::zero(), + halm_phi__.at(mem, 0, aidx, wf::spin_index(0), wf::band_index(0)), halm_phi__.ld(), + stream_id(tid)); + } + }; + + auto apply_hmt_lo_apw = [this, &ctx, la, mem, &b__, &spl_atoms](wf::Wave_functions_mt const& alm_phi__, wf::Wave_functions& hphi__) + { + #pragma omp parallel for + for (int ialoc = 0; ialoc < spl_atoms.local_size(); ialoc++) { + int tid = omp_get_thread_num(); + int ia = spl_atoms[ialoc]; + auto& atom = ctx.unit_cell().atom(ia); + auto& type = atom.type(); + int naw = type.mt_aw_basis_size(); + int nlo = type.mt_lo_basis_size(); + + auto aidx = wf::atom_index(ialoc); + + auto& hmt = H0_.hmt(ia); + + // TODO: add stream_id + + sddk::linalg(la).gemm('N', 'N', nlo, b__.size(), naw, &sddk::linalg_const::one(), + hmt.at(mem, naw, 0), hmt.ld(), + alm_phi__.at(mem, 0, aidx, wf::spin_index(0), wf::band_index(0)), alm_phi__.ld(), + &sddk::linalg_const::one(), + hphi__.at(mem, 0, aidx, wf::spin_index(0), wf::band_index(b__.begin())), + hphi__.ld(), stream_id(tid)); + } + }; + + auto apply_omt_lo_apw = [this, &ctx, mem, &b__, &spl_atoms](wf::Wave_functions_mt const& alm_phi__, wf::Wave_functions& ophi__) + { + #pragma omp parallel for + for (int ialoc = 0; ialoc < spl_atoms.local_size(); ialoc++) { + int ia = spl_atoms[ialoc]; + auto& atom = ctx.unit_cell().atom(ia); + auto& type = atom.type(); + int naw = type.mt_aw_basis_size(); + int nlo = type.mt_lo_basis_size(); + + auto aidx = wf::atom_index(ialoc); + + for (int ilo = 0; ilo < nlo; ilo++) { + int xi_lo = naw + ilo; + /* local orbital indices */ + int l_lo = type.indexb(xi_lo).l; + int lm_lo = type.indexb(xi_lo).lm; + int order_lo = type.indexb(xi_lo).order; + for (int i = 0; i < b__.size(); i++) { + /* lo-APW contribution to ophi */ + for (int order_aw = 0; order_aw < (int)type.aw_descriptor(l_lo).size(); order_aw++) { + ophi__.mt_coeffs(ilo, aidx, wf::spin_index(0), wf::band_index(b__.begin() + i)) += + static_cast(atom.symmetry_class().o_radial_integral(l_lo, order_lo, order_aw)) * + alm_phi__.mt_coeffs(type.indexb_by_lm_order(lm_lo, order_aw), aidx, wf::spin_index(0), + wf::band_index(i)); + } + } + } + } + }; + + + PROFILE_START("sirius::Hamiltonian_k::apply_fv_h_o|mt"); + /* * Application of LAPW Hamiltonian splits into four parts: - * n n - * n +----------------+ +---+ +------+ +---+ - * +----------------+------+ +---+ | | | | | | | | - * | | | | | | | | | | | x |lo | - * | | | | | | | | | | | | | - * | | | | | | | | | | | +---+ - * | | | | | | APW-APW | x |APW| + |APW-lo| - * | APW-APW |APW-lo| |APW| | | | | | | - * | | | | | | | | | | | - * | | | x | | | | | | | | - * | | | | | +----------------+ +---+ +------+ + * n n + * n +----------------+ +---+ +------+ +---+ + * +----------------+------+ +---+ | | | | | | | | + * | | | | | | | | | | | x |lo | + * | | | | | | | | | | | | | + * | | | | | | | | | | | +---+ + * | | | | | | APW-APW | x |APW| + |APW-lo| + * | APW-APW |APW-lo| |APW| | | | | | | + * | | | | | | | | | | | + * | | | x | | | | | | | | + * | | | | | +----------------+ +---+ +------+ * +----------------+------+ +---+ = - * | | | | | +----------------+ +---+ +------+ +---+ - * | lo-APW |lo-lo | |lo | | | | | | | | | - * | | | | | | lo-APW | x | | + |lo-lo | x |lo | - * +----------------+------+ +---+ | | | | | | | | - * +----------------+ | | +------+ +---+ + * | | | | | +----------------+ +---+ +------+ +---+ + * | lo-APW |lo-lo | |lo | | | | | | | | | + * | | | | | | lo-APW | x | | + |lo-lo | x |lo | + * +----------------+------+ +---+ | | | | | | | | + * +----------------+ | | +------+ +---+ * |APW| * | | * | | @@ -959,101 +1137,41 @@ Hamiltonian_k::apply_fv_h_o(bool apw_only__, bool phi_is_lo__, int N__, int n * | | * +------+ */ - sddk::dmatrix> h_apw_lo_phi_lo; - sddk::dmatrix> o_apw_lo_phi_lo; + sddk::dmatrix h_apw_lo_phi_lo; + sddk::dmatrix o_apw_lo_phi_lo; - std::vector mt_aw_counts(comm.size(), 0); - std::vector mt_lo_counts(comm.size(), 0); - std::vector mt_aw_offsets; - std::vector mt_lo_offsets; + std::vector num_mt_apw_coeffs(ctx.unit_cell().num_atoms()); + for (int ia = 0; ia < ctx.unit_cell().num_atoms(); ia++) { + num_mt_apw_coeffs[ia] = ctx.unit_cell().atom(ia).mt_aw_basis_size(); + } + wf::Wave_functions_mt tmp(comm, num_mt_apw_coeffs, wf::num_mag_dims(0), wf::num_bands(b__.size()), sddk::memory_t::host); + auto mg = tmp.memory_guard(mem); if (!apw_only__ && ctx.unit_cell().mt_lo_basis_size()) { PROFILE("sirius::Hamiltonian_k::apply_fv_h_o|apw-lo-prep"); - mt_aw_offsets = std::vector(phi__.spl_num_atoms().local_size(), 0); - mt_lo_offsets = std::vector(phi__.spl_num_atoms().local_size(), 0); - - for (int ia = 0; ia < ctx.unit_cell().num_atoms(); ia++) { - auto& type = ctx.unit_cell().atom(ia).type(); - auto loc = phi__.spl_num_atoms().location(ia); - if (loc.rank == phi__.comm().rank()) { - mt_aw_offsets[loc.local_index] = mt_aw_counts[loc.rank]; - mt_lo_offsets[loc.local_index] = mt_lo_counts[loc.rank]; - } - mt_aw_counts[loc.rank] += type.mt_aw_basis_size(); - mt_lo_counts[loc.rank] += type.mt_lo_basis_size(); - } - - sddk::dmatrix, sddk::matrix_distribution_t::slab> - apw_lo_phi_lo_slab(ctx.unit_cell().mt_aw_basis_size(), n__, mt_aw_counts, comm); - if (pu == sddk::device_t::GPU) { - apw_lo_phi_lo_slab.allocate(ctx.mem_pool(sddk::memory_t::device)); - } - if (hphi__) { - h_apw_lo_phi_lo = sddk::dmatrix>(ctx.unit_cell().mt_aw_basis_size(), n__, - ctx.blacs_grid(), bs, bs); - #pragma omp parallel for - for (int ialoc = 0; ialoc < phi__.spl_num_atoms().local_size(); ialoc++) { - int tid = omp_get_thread_num(); - int ia = phi__.spl_num_atoms()[ialoc]; - auto& atom = ctx.unit_cell().atom(ia); - auto& type = atom.type(); - int naw = type.mt_aw_basis_size(); - int nlo = type.mt_lo_basis_size(); - - auto& hmt = H0_.hmt(ia); + apply_hmt_apw_lo(tmp); - sddk:: linalg(la).gemm('N', 'N', naw, n__, nlo, &sddk::linalg_const>::one(), - hmt.at(mem, 0, naw), hmt.ld(), phi__.mt_coeffs(0).prime().at(mem, mt_lo_offsets[ialoc], N__), - phi__.mt_coeffs(0).prime().ld(), &sddk::linalg_const>::zero(), - apw_lo_phi_lo_slab.at(mem, mt_aw_offsets[ialoc], 0), apw_lo_phi_lo_slab.ld(), - stream_id(tid)); - } - - if (pu == sddk::device_t::GPU) { - apw_lo_phi_lo_slab.copy_to(sddk::memory_t::host); - } + h_apw_lo_phi_lo = sddk::dmatrix(ctx.unit_cell().mt_aw_basis_size(), b__.size(), + ctx.blacs_grid(), bs, bs); - costa::transform(apw_lo_phi_lo_slab.grid_layout(), h_apw_lo_phi_lo.grid_layout(), 'N', - sddk::linalg_const>::one(), sddk::linalg_const>::zero(), - comm.mpi_comm()); + auto layout_in = tmp.grid_layout_mt(wf::spin_index(0), wf::band_range(0, b__.size())); + costa::transform(layout_in, h_apw_lo_phi_lo.grid_layout(), 'N', one, zero, comm.mpi_comm()); } if (ophi__) { - o_apw_lo_phi_lo = sddk::dmatrix>(ctx.unit_cell().mt_aw_basis_size(), n__, - ctx.blacs_grid(), bs, bs); - apw_lo_phi_lo_slab.zero(); - - #pragma omp parallel for - for (int ialoc = 0; ialoc < phi__.spl_num_atoms().local_size(); ialoc++) { - int ia = phi__.spl_num_atoms()[ialoc]; - auto& atom = ctx.unit_cell().atom(ia); - auto& type = atom.type(); - int naw = type.mt_aw_basis_size(); - int nlo = type.mt_lo_basis_size(); - - for (int j = 0; j < n__; j++) { - for (int ilo = 0; ilo < nlo; ilo++) { - int xi_lo = naw + ilo; - /* local orbital indices */ - int l_lo = type.indexb(xi_lo).l; - int lm_lo = type.indexb(xi_lo).lm; - int order_lo = type.indexb(xi_lo).order; - for (int order_aw = 0; order_aw < (int)type.aw_descriptor(l_lo).size(); order_aw++) { - apw_lo_phi_lo_slab(mt_aw_offsets[ialoc] + type.indexb_by_lm_order(lm_lo, order_aw), j) += - phi__.mt_coeffs(0).prime(mt_lo_offsets[ialoc] + ilo, N__ + j) * - static_cast(atom.symmetry_class().o_radial_integral(l_lo, order_aw, order_lo)); - } - } - } - } + apply_omt_apw_lo(tmp); + o_apw_lo_phi_lo = sddk::dmatrix(ctx.unit_cell().mt_aw_basis_size(), b__.size(), + ctx.blacs_grid(), bs, bs); - costa::transform(apw_lo_phi_lo_slab.grid_layout(), o_apw_lo_phi_lo.grid_layout(), 'N', - sddk::linalg_const>::one(), sddk::linalg_const>::zero(), - comm.mpi_comm()); + auto layout_in = tmp.grid_layout_mt(wf::spin_index(0), wf::band_range(0, b__.size())); + costa::transform(layout_in, o_apw_lo_phi_lo.grid_layout(), 'N', one, zero, comm.mpi_comm()); } } + // here: h_apw_lo_phi_lo is on host + // o_apw_lo_phi_lo is on host + /* lo-lo contribution (lo-lo Hamiltonian and overlap are block-diagonal in atom index and the whole application is * local to MPI rank) * @@ -1066,57 +1184,16 @@ Hamiltonian_k::apply_fv_h_o(bool apw_only__, bool phi_is_lo__, int N__, int n */ if (!apw_only__ && ctx.unit_cell().mt_lo_basis_size()) { PROFILE("sirius::Hamiltonian_k::apply_fv_h_o|lo-lo"); - /* lo-lo contribution */ - #pragma omp parallel for - for (int ialoc = 0; ialoc < phi__.spl_num_atoms().local_size(); ialoc++) { - int tid = omp_get_thread_num(); - int ia = phi__.spl_num_atoms()[ialoc]; - auto& atom = ctx.unit_cell().atom(ia); - auto& type = atom.type(); - int naw = type.mt_aw_basis_size(); - int nlo = type.mt_lo_basis_size(); - - int offset_mt_coeffs = phi__.offset_mt_coeffs(ialoc); - - if (hphi__ != nullptr) { - auto& hmt = H0_.hmt(ia); - sddk::linalg(la).gemm('N', 'N', nlo, n__, nlo, &sddk::linalg_const>::one(), - hmt.at(mem, naw, naw), hmt.ld(), - phi__.mt_coeffs(0).prime().at(mem, offset_mt_coeffs, N__), - phi__.mt_coeffs(0).prime().ld(), - &sddk::linalg_const>::one(), - hphi__->mt_coeffs(0).prime().at(mem, offset_mt_coeffs, N__), - hphi__->mt_coeffs(0).prime().ld(), stream_id(tid)); - } - - if (ophi__ != nullptr) { - for (int ilo = 0; ilo < type.mt_lo_basis_size(); ilo++) { - int xi_lo = type.mt_aw_basis_size() + ilo; - /* local orbital indices */ - int l_lo = type.indexb(xi_lo).l; - int lm_lo = type.indexb(xi_lo).lm; - int order_lo = type.indexb(xi_lo).order; - - /* lo-lo contribution */ - for (int jlo = 0; jlo < type.mt_lo_basis_size(); jlo++) { - int xi_lo1 = type.mt_aw_basis_size() + jlo; - int lm1 = type.indexb(xi_lo1).lm; - int order1 = type.indexb(xi_lo1).order; - if (lm_lo == lm1) { - for (int i = 0; i < n__; i++) { - ophi__->mt_coeffs(0).prime(offset_mt_coeffs + ilo, N__ + i) += - phi__.mt_coeffs(0).prime(offset_mt_coeffs + jlo, N__ + i) * - static_cast(atom.symmetry_class().o_radial_integral(l_lo, order_lo, order1)); - } - } - } - } - } + if (hphi__) { + appy_hmt_lo_lo(*hphi__); + } + if (ophi__) { + appy_omt_lo_lo(*ophi__); } } - /* for a block of Alm */ - sddk::dmatrix> alm_phi(ctx.unit_cell().mt_aw_basis_size(), n__, ctx.blacs_grid(), bs, bs); + /* for all Alm matching coefficients */ + sddk::dmatrix alm_phi(ctx.unit_cell().mt_aw_basis_size(), b__.size(), ctx.blacs_grid(), bs, bs); /* compute APW-APW contribution * n @@ -1131,7 +1208,7 @@ Hamiltonian_k::apply_fv_h_o(bool apw_only__, bool phi_is_lo__, int N__, int n * | | | | * +----------------+ +---+ * - * we are going to split the Alm coefficients into blocks of atoms + * we are going to split the Alm coefficients into blocks of atoms and work on them consecutively */ int offset_aw_global{0}; int atom_begin{0}; @@ -1142,108 +1219,78 @@ Hamiltonian_k::apply_fv_h_o(bool apw_only__, bool phi_is_lo__, int N__, int n /* actual number of AW radial functions in a block of atoms */ int num_mt_aw{0}; - /* actual number of local orbitals in a block of atoms */ - int num_mt_lo{0}; std::vector offsets_aw(na); - std::vector offsets_lo(na); - std::vector counts_aw(comm.size(), 0); for (int i = 0; i < na; i++) { - int ia = atom_begin + i; - auto& atom = ctx.unit_cell().atom(ia); - auto& type = atom.type(); + int ia = atom_begin + i; + auto& type = ctx.unit_cell().atom(ia).type(); offsets_aw[i] = num_mt_aw; - offsets_lo[i] = num_mt_lo; num_mt_aw += type.mt_aw_basis_size(); - num_mt_lo += type.mt_lo_basis_size(); - - counts_aw[spl_atoms.location(i).rank] += type.mt_aw_basis_size(); } /* generate complex conjugated Alm coefficients for a block of atoms */ - //auto alm = generate_alm(atom_begin, na, std::max(num_mt_aw, num_mt_lo), offsets_aw); - auto alm = generate_alm_block(ctx, atom_begin, na, kp().alm_coeffs_loc()); - + auto alm = generate_alm_block(ctx, atom_begin, na, kp().alm_coeffs_loc()); + /* if there is APW part */ if (!phi_is_lo__) { auto t0 = utils::time_now(); PROFILE("sirius::Hamiltonian_k::apply_fv_h_o|apw-apw"); - /* compute B(lm, n) = < Alm | C > */ - spla::pgemm_ssb(num_mt_aw, n__, ngv, SPLA_OP_CONJ_TRANSPOSE, 1.0, + /* compute alm_phi(lm, n) = < Alm | C > */ + spla::pgemm_ssb(num_mt_aw, b__.size(), ngv, SPLA_OP_CONJ_TRANSPOSE, 1.0, alm.at(mem), alm.ld(), - phi__.pw_coeffs(0).prime().at(mem, 0, N__), phi__.pw_coeffs(0).prime().ld(), - 0.0, alm_phi.at(sddk::memory_t::host), alm_phi.ld(), offset_aw_global, 0, alm_phi.spla_distribution(), + phi__.at(mem, 0, wf::spin_index(0), wf::band_index(b__.begin())), phi__.ld(), 0.0, + alm_phi.at(sddk::memory_t::host), alm_phi.ld(), offset_aw_global, 0, alm_phi.spla_distribution(), ctx.spla_context()); - gflops += ngop * num_mt_aw * n__ * ngv; + gflops += ngop * num_mt_aw * b__.size() * ngv; if (ophi__) { - /* APW-APW contribution to ophi */ - spla::pgemm_sbs(ngv, n__, num_mt_aw, sddk::linalg_const>::one(), - alm.at(mem), alm.ld(), alm_phi.at(sddk::memory_t::host), alm_phi.ld(), offset_aw_global, 0, - alm_phi.spla_distribution(), sddk::linalg_const>::one(), - ophi__->pw_coeffs(0).prime().at(mem, 0, N__), ophi__->pw_coeffs(0).prime().ld(), + /* add APW-APW contribution to ophi */ + spla::pgemm_sbs(ngv, b__.size(), num_mt_aw, one, + alm.at(mem), alm.ld(), alm_phi.at(sddk::memory_t::host), alm_phi.ld(), + offset_aw_global, 0, alm_phi.spla_distribution(), one, + ophi__->at(mem, 0, wf::spin_index(0), wf::band_index(b__.begin())), ophi__->ld(), ctx.spla_context()); - gflops += ngop * ngv * n__ * num_mt_aw; + gflops += ngop * ngv * b__.size() * num_mt_aw; } if (hphi__) { - sddk::dmatrix, sddk::matrix_distribution_t::slab> alm_phi_slab(num_mt_aw, n__, counts_aw, comm); - sddk::dmatrix, sddk::matrix_distribution_t::slab> halm_phi_slab(num_mt_aw, n__, counts_aw, comm); - sddk::dmatrix> halm_phi(num_mt_aw, n__, ctx.blacs_grid(), bs, bs); - if (pu == sddk::device_t::GPU) { - alm_phi_slab.allocate(ctx.mem_pool(sddk::memory_t::device)); - halm_phi_slab.allocate(ctx.mem_pool(sddk::memory_t::device)); + std::vector num_mt_apw_coeffs_in_block(na); + for (int i = 0; i < na; i++) { + num_mt_apw_coeffs_in_block[i] = ctx.unit_cell().atom(atom_begin + i).mt_aw_basis_size(); } - auto layout = alm_phi.grid_layout(offset_aw_global, 0, num_mt_aw, n__); + wf::Wave_functions_mt alm_phi_slab(comm, num_mt_apw_coeffs_in_block, wf::num_mag_dims(0), + wf::num_bands(b__.size()), sddk::memory_t::host); + wf::Wave_functions_mt halm_phi_slab(comm, num_mt_apw_coeffs_in_block, wf::num_mag_dims(0), + wf::num_bands(b__.size()), sddk::memory_t::host); - costa::transform(layout, alm_phi_slab.grid_layout(), 'N', sddk::linalg_const>::one(), - sddk::linalg_const>::zero(), comm.mpi_comm()); - - if (pu == sddk::device_t::GPU) { - alm_phi_slab.copy_to(sddk::memory_t::device); - } - /* apply muffin-tin Hamiltonian */ - /* each rank works on the local fraction of atoms in the current block */ - std::vector offset_aw(spl_atoms.local_size(), 0); - for (int ialoc = 1; ialoc < spl_atoms.local_size(); ialoc++) { - int ia = atom_begin + spl_atoms[ialoc - 1]; - auto& atom = ctx.unit_cell().atom(ia); - auto& type = atom.type(); - offset_aw[ialoc] = offset_aw[ialoc - 1] + type.mt_aw_basis_size(); - } - #pragma omp parallel for - for (int ialoc = 0; ialoc < spl_atoms.local_size(); ialoc++) { - int tid = omp_get_thread_num(); - int ia = atom_begin + spl_atoms[ialoc]; - auto& atom = ctx.unit_cell().atom(ia); - auto& type = atom.type(); - - auto& hmt = H0_.hmt(ia); - - // TODO: use in-place trmm - sddk::linalg(la).gemm('N', 'N', type.mt_aw_basis_size(), n__, type.mt_aw_basis_size(), - &sddk::linalg_const>::one(), hmt.at(mem), hmt.ld(), - alm_phi_slab.at(mem, offset_aw[ialoc], 0), alm_phi_slab.ld(), - &sddk::linalg_const>::zero(), halm_phi_slab.at(mem, offset_aw[ialoc], 0), - halm_phi_slab.ld(), stream_id(tid)); + sddk::dmatrix halm_phi(num_mt_aw, b__.size(), ctx.blacs_grid(), bs, bs); + { + auto layout_in = alm_phi.grid_layout(offset_aw_global, 0, num_mt_aw, b__.size()); + auto layout_out = alm_phi_slab.grid_layout_mt(wf::spin_index(0), wf::band_range(0, b__.size())); + costa::transform(layout_in, layout_out, 'N', one, zero, comm.mpi_comm()); } - if (pu == sddk::device_t::GPU) { - halm_phi_slab.copy_to(sddk::memory_t::host); + + { + auto mg1 = alm_phi_slab.memory_guard(mem, wf::copy_to::device); + auto mg2 = halm_phi_slab.memory_guard(mem, wf::copy_to::host); + appy_hmt_apw_apw(atom_begin, alm_phi_slab, halm_phi_slab); } - costa::transform(halm_phi_slab.grid_layout(), halm_phi.grid_layout(), 'N', - sddk::linalg_const>::one(), sddk::linalg_const>::zero(), - comm.mpi_comm()); + { + auto layout_in = halm_phi_slab.grid_layout_mt(wf::spin_index(0), wf::band_range(0, b__.size())); + auto layout_out = halm_phi.grid_layout(); + costa::transform(layout_in, layout_out, 'N', one, zero, comm.mpi_comm()); + } /* APW-APW contribution to hphi */ - spla::pgemm_sbs(ngv, n__, num_mt_aw, sddk::linalg_const>::one(), + spla::pgemm_sbs(ngv, b__.size(), num_mt_aw, one, alm.at(mem), alm.ld(), halm_phi.at(sddk::memory_t::host), halm_phi.ld(), 0, 0, - halm_phi.spla_distribution(), sddk::linalg_const>::one(), - hphi__->pw_coeffs(0).prime().at(mem, 0, N__), hphi__->pw_coeffs(0).prime().ld(), + halm_phi.spla_distribution(), one, + hphi__->at(mem, 0, wf::spin_index(0), wf::band_index(b__.begin())), hphi__->ld(), ctx.spla_context()); - gflops += ngop * ngv * n__ * num_mt_aw; + gflops += ngop * ngv * b__.size() * num_mt_aw; } time += utils::time_interval(t0); } @@ -1253,27 +1300,42 @@ Hamiltonian_k::apply_fv_h_o(bool apw_only__, bool phi_is_lo__, int N__, int n auto t0 = utils::time_now(); if (hphi__) { /* APW-lo contribution to hphi */ - spla::pgemm_sbs(ngv, n__, num_mt_aw, sddk::linalg_const>::one(), + spla::pgemm_sbs(ngv, b__.size(), num_mt_aw, one, alm.at(mem), alm.ld(), h_apw_lo_phi_lo.at(sddk::memory_t::host), h_apw_lo_phi_lo.ld(), - offset_aw_global, 0, h_apw_lo_phi_lo.spla_distribution(), - sddk::linalg_const>::one(), hphi__->pw_coeffs(0).prime().at(mem, 0, N__), - hphi__->pw_coeffs(0).prime().ld(), ctx.spla_context()); - gflops += ngop * ngv * n__ * num_mt_aw; + offset_aw_global, 0, h_apw_lo_phi_lo.spla_distribution(), one, + hphi__->at(mem, 0, wf::spin_index(0), wf::band_index(b__.begin())), hphi__->ld(), + ctx.spla_context()); + gflops += ngop * ngv * b__.size() * num_mt_aw; } if (ophi__) { /* APW-lo contribution to ophi */ - spla::pgemm_sbs(ngv, n__, num_mt_aw, sddk::linalg_const>::one(), + spla::pgemm_sbs(ngv, b__.size(), num_mt_aw, one, alm.at(mem), alm.ld(), o_apw_lo_phi_lo.at(sddk::memory_t::host), o_apw_lo_phi_lo.ld(), - offset_aw_global, 0, o_apw_lo_phi_lo.spla_distribution(), sddk::linalg_const>::one(), - ophi__->pw_coeffs(0).prime().at(mem, 0, N__), ophi__->pw_coeffs(0).prime().ld(), + offset_aw_global, 0, o_apw_lo_phi_lo.spla_distribution(), one, + ophi__->at(mem, 0, wf::spin_index(0), wf::band_index(b__.begin())), ophi__->ld(), ctx.spla_context()); - gflops += ngop * ngv * n__ * num_mt_aw; + gflops += ngop * ngv * b__.size() * num_mt_aw; } time += utils::time_interval(t0); } offset_aw_global += num_mt_aw; atom_begin += na; - } + + if (pcs) { + if (hphi__) { + auto cs = hphi__->checksum_pw(mem, wf::spin_index(0), b__); + if (comm.rank() == 0) { + utils::print_checksum("hphi_apw", cs, RTE_OUT(std::cout)); + } + } + if (ophi__) { + auto cs = ophi__->checksum_pw(mem, wf::spin_index(0), b__); + if (comm.rank() == 0) { + utils::print_checksum("ophi_apw", cs, RTE_OUT(std::cout)); + } + } + } + } // blocks of atoms /* compute lo-APW contribution * @@ -1292,114 +1354,88 @@ Hamiltonian_k::apply_fv_h_o(bool apw_only__, bool phi_is_lo__, int N__, int n */ if (!apw_only__ && !phi_is_lo__ && ctx.unit_cell().mt_lo_basis_size()) { PROFILE("sirius::Hamiltonian_k::apply_fv_h_o|lo-apw"); - - sddk::dmatrix, sddk::matrix_distribution_t::slab> - alm_phi_slab(ctx.unit_cell().mt_aw_basis_size(), n__, mt_aw_counts, comm); - - costa::transform(alm_phi.grid_layout(), alm_phi_slab.grid_layout(), 'N', - sddk::linalg_const>::one(), sddk::linalg_const>::zero(), comm.mpi_comm()); - if (pu == sddk::device_t::GPU) { - alm_phi_slab.allocate(ctx.mem_pool(sddk::memory_t::device)).copy_to(sddk::memory_t::device); + { + auto layout_in = alm_phi.grid_layout(); + auto layout_out = tmp.grid_layout_mt(wf::spin_index(0), wf::band_range(0, b__.size())); + costa::transform(layout_in, layout_out, 'N', one, zero, comm.mpi_comm()); } - #pragma omp parallel for - for (int ialoc = 0; ialoc < phi__.spl_num_atoms().local_size(); ialoc++) { - int ia = phi__.spl_num_atoms()[ialoc]; - auto& atom = ctx.unit_cell().atom(ia); - auto& type = atom.type(); - int naw = type.mt_aw_basis_size(); - int nlo = type.mt_lo_basis_size(); + if (ophi__) { + apply_omt_lo_apw(tmp, *ophi__); + } - if (ophi__ != nullptr) { - for (int ilo = 0; ilo < nlo; ilo++) { - int xi_lo = naw + ilo; - /* local orbital indices */ - int l_lo = type.indexb(xi_lo).l; - int lm_lo = type.indexb(xi_lo).lm; - int order_lo = type.indexb(xi_lo).order; - for (int i = 0; i < n__; i++) { - /* lo-APW contribution to ophi */ - for (int order_aw = 0; order_aw < (int)type.aw_descriptor(l_lo).size(); order_aw++) { - ophi__->mt_coeffs(0).prime(mt_lo_offsets[ialoc] + ilo, N__ + i) += - static_cast(atom.symmetry_class().o_radial_integral(l_lo, order_lo, order_aw)) * - alm_phi_slab(mt_aw_offsets[ialoc] + type.indexb_by_lm_order(lm_lo, order_aw), i); - } - } - } - } - if (hphi__ != nullptr) { - auto& hmt = H0_.hmt(ia); - sddk::linalg(la).gemm('N', 'N', nlo, n__, naw, &sddk::linalg_const>::one(), - hmt.at(mem, naw, 0), hmt.ld(), alm_phi_slab.at(mem, mt_aw_offsets[ialoc], 0), alm_phi_slab.ld(), - &sddk::linalg_const>::one(), - hphi__->mt_coeffs(0).prime().at(mem, mt_lo_offsets[ialoc], N__), - hphi__->mt_coeffs(0).prime().ld()); + if (hphi__) { + if (is_device_memory(mem)) { + tmp.copy_to(mem); } + apply_hmt_lo_apw(tmp, *hphi__); } } PROFILE_STOP("sirius::Hamiltonian_k::apply_fv_h_o|mt"); - if (pu == sddk::device_t::GPU && !apw_only__) { - if (ophi__ != nullptr) { - ophi__->mt_coeffs(0).copy_to(sddk::memory_t::device, N__, n__); - } - } - if (pu == sddk::device_t::GPU) { - if (ophi__ != nullptr) { - ophi__->pw_coeffs(0).copy_to(sddk::memory_t::host, N__, n__); - } + if (is_device_memory(mem) && ophi__) { + ophi__->copy_mt_to(mem, wf::spin_index(0), b__); } - if (pp && kp().comm().rank() == 0) { + + if (pp && comm.rank() == 0) { RTE_OUT(std::cout) << "effective local zgemm performance : " << gflops / time << " GFlop/s" << std::endl; } - if (ctx.cfg().control().print_checksum()) { + + if (pcs) { if (hphi__) { - hphi__->print_checksum(pu, "hphi", N__, n__, RTE_OUT(std::cout)); + auto cs = hphi__->checksum(mem, wf::spin_index(0), b__); + if (comm.rank() == 0) { + utils::print_checksum("hphi", cs, RTE_OUT(std::cout)); + } } if (ophi__) { - ophi__->print_checksum(pu, "ophi", N__, n__, RTE_OUT(std::cout)); + auto cs = ophi__->checksum(mem, wf::spin_index(0), b__); + if (comm.rank() == 0) { + utils::print_checksum("ophi", cs, RTE_OUT(std::cout)); + } } } } template void -Hamiltonian_k::apply_b(sddk::Wave_functions& psi__, std::vector>& bpsi__) +Hamiltonian_k::apply_b(wf::Wave_functions& psi__, std::vector>& bpsi__) { PROFILE("sirius::Hamiltonian_k::apply_b"); - assert(bpsi__.size() == 2 || bpsi__.size() == 3); + RTE_ASSERT(bpsi__.size() == 2 || bpsi__.size() == 3); + + int nfv = H0().ctx().num_fv_states(); - H0().local_op().apply_b(reinterpret_cast&>(kp().spfft_transform()), 0, - H0().ctx().num_fv_states(), psi__, bpsi__); + auto bxypsi = bpsi__.size() == 2 ? nullptr : &bpsi__[2]; + H0().local_op().apply_fplapw(reinterpret_cast&>(kp().spfft_transform()), + this->kp().gkvec_fft_sptr(), wf::band_range(0, nfv), psi__, nullptr, nullptr, &bpsi__[0], bxypsi); H0().apply_bmt(psi__, bpsi__); + std::vector alpha(nfv, -1.0); + std::vector beta(nfv, 0.0); + /* copy Bz|\psi> to -Bz|\psi> */ - #pragma omp parallel for schedule(static) - for (int i = 0; i < H0().ctx().num_fv_states(); i++) { - for (int j = 0; j < psi__.pw_coeffs(0).num_rows_loc(); j++) { - bpsi__[1].pw_coeffs(0).prime(j, i) = -bpsi__[0].pw_coeffs(0).prime(j, i); - } - for (int j = 0; j < psi__.mt_coeffs(0).num_rows_loc(); j++) { - bpsi__[1].mt_coeffs(0).prime(j, i) = -bpsi__[0].mt_coeffs(0).prime(j, i); + wf::axpby(sddk::memory_t::host, wf::spin_range(0), wf::band_range(0, nfv), + alpha.data(), &bpsi__[0], beta.data(), &bpsi__[1]); + + auto pcs = env::print_checksum(); + if (pcs) { + auto cs1 = bpsi__[0].checksum_pw(sddk::memory_t::host, wf::spin_index(0), wf::band_range(0, nfv)); + auto cs2 = bpsi__[0].checksum_mt(sddk::memory_t::host, wf::spin_index(0), wf::band_range(0, nfv)); + auto cs3 = bpsi__[1].checksum_pw(sddk::memory_t::host, wf::spin_index(0), wf::band_range(0, nfv)); + auto cs4 = bpsi__[1].checksum_mt(sddk::memory_t::host, wf::spin_index(0), wf::band_range(0, nfv)); + if (this->kp().gkvec().comm().rank() == 0) { + utils::print_checksum("hpsi[0]_pw", cs1, RTE_OUT(std::cout)); + utils::print_checksum("hpsi[0]_mt", cs2, RTE_OUT(std::cout)); + utils::print_checksum("hpsi[1]_pw", cs3, RTE_OUT(std::cout)); + utils::print_checksum("hpsi[1]_mt", cs4, RTE_OUT(std::cout)); } } } template class Hamiltonian_k; -template void -Hamiltonian_k::apply_h_s(sddk::spin_range spins__, int N__, int n__, - sddk::Wave_functions& phi__, - sddk::Wave_functions* hphi__, - sddk::Wave_functions* sphi__); - -template void -Hamiltonian_k::apply_h_s(sddk::spin_range spins__, int N__, int n__, - sddk::Wave_functions& phi__, - sddk::Wave_functions* hphi__, - sddk::Wave_functions* sphi__); - template std::pair, sddk::mdarray> Hamiltonian_k::get_h_o_diag_pw() const; @@ -1430,16 +1466,6 @@ Hamiltonian_k::get_h_o_diag_lapw<3>() const; #ifdef USE_FP32 template class Hamiltonian_k; -template void -Hamiltonian_k::apply_h_s(sddk::spin_range spins__, int N__, int n__, sddk::Wave_functions& phi__, - sddk::Wave_functions* hphi__, sddk::Wave_functions* sphi__); - -template void -Hamiltonian_k::apply_h_s>(sddk::spin_range spins__, int N__, int n__, - sddk::Wave_functions& phi__, - sddk::Wave_functions* hphi__, - sddk::Wave_functions* sphi__); - template std::pair, sddk::mdarray> Hamiltonian_k::get_h_o_diag_pw() const; diff --git a/src/hamiltonian/local_operator.cpp b/src/hamiltonian/local_operator.cpp index 01f28eaf5..522fdb8a1 100644 --- a/src/hamiltonian/local_operator.cpp +++ b/src/hamiltonian/local_operator.cpp @@ -27,13 +27,11 @@ #include "function3d/smooth_periodic_function.hpp" #include "utils/profiler.hpp" -using namespace sddk; - namespace sirius { template Local_operator::Local_operator(Simulation_context const& ctx__, spfft_transform_type& fft_coarse__, - Gvec_partition const& gvec_coarse_p__, Potential* potential__) + std::shared_ptr gvec_coarse_p__, Potential* potential__) : ctx_(ctx__) , fft_coarse_(fft_coarse__) , gvec_coarse_p_(gvec_coarse_p__) @@ -44,7 +42,7 @@ Local_operator::Local_operator(Simulation_context const& ctx__, spfft_transfo /* allocate functions */ for (int j = 0; j < ctx_.num_mag_dims() + 1; j++) { veff_vec_[j] = std::unique_ptr>( - new Smooth_periodic_function(fft_coarse__, gvec_coarse_p__, &ctx_.mem_pool(sddk::memory_t::host))); + new Smooth_periodic_function(fft_coarse__, gvec_coarse_p__, &get_memory_pool(sddk::memory_t::host))); #pragma omp parallel for schedule(static) for (int ir = 0; ir < fft_coarse__.local_slice_size(); ir++) { veff_vec_[j]->f_rg(ir) = 2.71828; @@ -52,23 +50,23 @@ Local_operator::Local_operator(Simulation_context const& ctx__, spfft_transfo } /* map Theta(r) to the coarse mesh */ if (ctx_.full_potential()) { - auto& gvec_dense_p = ctx_.gvec_partition(); - veff_vec_[4] = std::unique_ptr>( - new Smooth_periodic_function(fft_coarse__, gvec_coarse_p__, &ctx_.mem_pool(sddk::memory_t::host))); + auto& gvec_dense_p = ctx_.gvec_fft(); + veff_vec_[v_local_index_t::theta] = std::unique_ptr>( + new Smooth_periodic_function(fft_coarse__, gvec_coarse_p__, &get_memory_pool(sddk::memory_t::host))); /* map unit-step function */ #pragma omp parallel for schedule(static) - for (int igloc = 0; igloc < gvec_coarse_p_.gvec().count(); igloc++) { + for (int igloc = 0; igloc < gvec_coarse_p_->gvec().count(); igloc++) { /* map from fine to coarse set of G-vectors */ - veff_vec_[4]->f_pw_local(igloc) = + veff_vec_[v_local_index_t::theta]->f_pw_local(igloc) = ctx_.theta_pw(gvec_dense_p.gvec().gvec_base_mapping(igloc) + gvec_dense_p.gvec().offset()); } - veff_vec_[4]->fft_transform(1); + veff_vec_[v_local_index_t::theta]->fft_transform(1); if (fft_coarse_.processing_unit() == SPFFT_PU_GPU) { - veff_vec_[4]->f_rg().allocate(ctx_.mem_pool(sddk::memory_t::device)).copy_to(sddk::memory_t::device); + veff_vec_[v_local_index_t::theta]->f_rg().allocate(get_memory_pool(sddk::memory_t::device)).copy_to(sddk::memory_t::device); } if (ctx_.print_checksum()) { - auto cs1 = veff_vec_[4]->checksum_pw(); - auto cs2 = veff_vec_[4]->checksum_rg(); + auto cs1 = veff_vec_[v_local_index_t::theta]->checksum_pw(); + auto cs2 = veff_vec_[v_local_index_t::theta]->checksum_rg(); if (ctx_.comm().rank() == 0) { utils::print_checksum("theta_pw", cs1); utils::print_checksum("theta_rg", cs2); @@ -82,10 +80,10 @@ Local_operator::Local_operator(Simulation_context const& ctx__, spfft_transfo if (ctx_.full_potential()) { auto& fft_dense = ctx_.spfft(); - auto& gvec_dense_p = ctx_.gvec_partition(); + auto& gvec_dense_p = ctx_.gvec_fft(); - Smooth_periodic_function ftmp(const_cast(ctx_).spfft(), gvec_dense_p, - &ctx_.mem_pool(sddk::memory_t::host)); + Smooth_periodic_function ftmp(const_cast(ctx_).spfft(), ctx_.gvec_fft_sptr(), + &get_memory_pool(sddk::memory_t::host)); for (int j = 0; j < ctx_.num_mag_dims() + 1; j++) { /* multiply potential by step function theta(r) */ @@ -99,7 +97,7 @@ Local_operator::Local_operator(Simulation_context const& ctx__, spfft_transfo } /* loop over local set of coarse G-vectors */ #pragma omp parallel for schedule(static) - for (int igloc = 0; igloc < gvec_coarse_p_.gvec().count(); igloc++) { + for (int igloc = 0; igloc < gvec_coarse_p_->gvec().count(); igloc++) { /* map from fine to coarse set of G-vectors */ veff_vec_[j]->f_pw_local(igloc) = ftmp.f_pw_local(gvec_dense_p.gvec().gvec_base_mapping(igloc)); } @@ -107,17 +105,17 @@ Local_operator::Local_operator(Simulation_context const& ctx__, spfft_transfo veff_vec_[j]->fft_transform(1); } if (ctx_.valence_relativity() == relativity_t::zora) { - veff_vec_[5] = std::unique_ptr>( - new Smooth_periodic_function(fft_coarse__, gvec_coarse_p__, &ctx_.mem_pool(sddk::memory_t::host))); + veff_vec_[v_local_index_t::rm_inv] = std::unique_ptr>( + new Smooth_periodic_function(fft_coarse__, gvec_coarse_p__, &get_memory_pool(sddk::memory_t::host))); /* loop over local set of coarse G-vectors */ #pragma omp parallel for schedule(static) - for (int igloc = 0; igloc < gvec_coarse_p_.gvec().count(); igloc++) { + for (int igloc = 0; igloc < gvec_coarse_p_->gvec().count(); igloc++) { /* map from fine to coarse set of G-vectors */ - veff_vec_[5]->f_pw_local(igloc) = + veff_vec_[v_local_index_t::rm_inv]->f_pw_local(igloc) = potential__->rm_inv_pw(gvec_dense_p.gvec().offset() + gvec_dense_p.gvec().gvec_base_mapping(igloc)); } /* transform to real space */ - veff_vec_[5]->fft_transform(1); + veff_vec_[v_local_index_t::rm_inv]->fft_transform(1); } } else { @@ -125,7 +123,7 @@ Local_operator::Local_operator(Simulation_context const& ctx__, spfft_transfo for (int j = 0; j < ctx_.num_mag_dims() + 1; j++) { /* loop over local set of coarse G-vectors */ #pragma omp parallel for schedule(static) - for (int igloc = 0; igloc < gvec_coarse_p_.gvec().count(); igloc++) { + for (int igloc = 0; igloc < gvec_coarse_p_->gvec().count(); igloc++) { /* map from fine to coarse set of G-vectors */ veff_vec_[j]->f_pw_local(igloc) = potential__->component(j).f_pw_local(potential__->component(j).gvec().gvec_base_mapping(igloc)); @@ -138,10 +136,10 @@ Local_operator::Local_operator(Simulation_context const& ctx__, spfft_transfo if (ctx_.num_mag_dims()) { #pragma omp parallel for schedule(static) for (int ir = 0; ir < fft_coarse_.local_slice_size(); ir++) { - T v0 = veff_vec_[0]->f_rg(ir); - T v1 = veff_vec_[1]->f_rg(ir); - veff_vec_[0]->f_rg(ir) = v0 + v1; // v + Bz - veff_vec_[1]->f_rg(ir) = v0 - v1; // v - Bz + T v0 = veff_vec_[v_local_index_t::v0]->f_rg(ir); + T v1 = veff_vec_[v_local_index_t::v1]->f_rg(ir); + veff_vec_[v_local_index_t::v0]->f_rg(ir) = v0 + v1; // v + Bz + veff_vec_[v_local_index_t::v1]->f_rg(ir) = v0 - v1; // v - Bz } } @@ -165,84 +163,62 @@ Local_operator::Local_operator(Simulation_context const& ctx__, spfft_transfo } } - buf_rg_ = mdarray, 1>(fft_coarse_.local_slice_size(), ctx_.mem_pool(sddk::memory_t::host), + buf_rg_ = sddk::mdarray, 1>(fft_coarse_.local_slice_size(), get_memory_pool(sddk::memory_t::host), "Local_operator::buf_rg_"); /* move functions to GPU */ if (fft_coarse_.processing_unit() == SPFFT_PU_GPU) { for (int j = 0; j < 6; j++) { if (veff_vec_[j]) { - veff_vec_[j]->f_rg().allocate(ctx_.mem_pool(sddk::memory_t::device)).copy_to(sddk::memory_t::device); + veff_vec_[j]->f_rg().allocate(get_memory_pool(sddk::memory_t::device)).copy_to(sddk::memory_t::device); } } - buf_rg_.allocate(ctx_.mem_pool(sddk::memory_t::device)); + buf_rg_.allocate(get_memory_pool(sddk::memory_t::device)); } } template -void Local_operator::prepare_k(Gvec_partition const& gkvec_p__) +void Local_operator::prepare_k(sddk::Gvec_fft const& gkvec_p__) { PROFILE("sirius::Local_operator::prepare_k"); int ngv_fft = gkvec_p__.gvec_count_fft(); /* cache kinteic energy of plane-waves */ - if (static_cast(pw_ekin_.size()) < ngv_fft) { - pw_ekin_ = mdarray(ngv_fft, ctx_.mem_pool(sddk::memory_t::host), "Local_operator::pw_ekin"); - } + //if (static_cast(pw_ekin_.size()) < ngv_fft) { + pw_ekin_ = sddk::mdarray(ngv_fft, get_memory_pool(sddk::memory_t::host), "Local_operator::pw_ekin"); + //} + //if (static_cast(gkvec_cart_.size()) < ngv_fft) { + gkvec_cart_ = sddk::mdarray(ngv_fft, 3, get_memory_pool(sddk::memory_t::host), "Local_operator::gkvec_cart"); + //} + //if (static_cast(vphi_.size()) < ngv_fft) { + vphi_ = sddk::mdarray, 1>(ngv_fft, get_memory_pool(sddk::memory_t::host), "Local_operator::vphi"); + //} + #pragma omp parallel for schedule(static) for (int ig_loc = 0; ig_loc < ngv_fft; ig_loc++) { /* get G+k in Cartesian coordinates */ auto gv = gkvec_p__.gkvec_cart(ig_loc); pw_ekin_[ig_loc] = 0.5 * dot(gv, gv); - } - - if (static_cast(vphi_.size(0)) < ngv_fft) { - vphi_ = mdarray, 1>(ngv_fft, ctx_.mem_pool(sddk::memory_t::host), "Local_operator::vphi"); + for (int x : {0, 1, 2}) { + gkvec_cart_(ig_loc, x) = gv[x]; + } } if (fft_coarse_.processing_unit() == SPFFT_PU_GPU) { - pw_ekin_.allocate(ctx_.mem_pool(sddk::memory_t::device)).copy_to(sddk::memory_t::device); - vphi_.allocate(ctx_.mem_pool(sddk::memory_t::device)); + pw_ekin_.allocate(get_memory_pool(sddk::memory_t::device)).copy_to(sddk::memory_t::device); + vphi_.allocate(get_memory_pool(sddk::memory_t::device)); + gkvec_cart_.allocate(get_memory_pool(sddk::memory_t::device)).copy_to(sddk::memory_t::device); } } -#ifdef SIRIUS_GPU -void mul_by_veff_real_real_gpu(int nr__, float* buf__, float* veff__) -{ - mul_by_veff_real_real_gpu_float(nr__, buf__, veff__); -} - -void mul_by_veff_real_real_gpu(int nr__, double* buf__, double* veff__) -{ - mul_by_veff_real_real_gpu_double(nr__, buf__, veff__); -} - -void mul_by_veff_complex_real_gpu(int nr__, std::complex* buf__, float* veff__) -{ - mul_by_veff_complex_real_gpu_float(nr__, buf__, veff__); -} - -void mul_by_veff_complex_real_gpu(int nr__, double_complex* buf__, double* veff__) -{ - mul_by_veff_complex_real_gpu_double(nr__, buf__, veff__); -} - -void mul_by_veff_complex_complex_gpu(int nr__, std::complex* buf__, float pref__, float* vx__, float* vy__) -{ - mul_by_veff_complex_complex_gpu_float(nr__, buf__, pref__, vx__, vy__); -} - -void mul_by_veff_complex_complex_gpu(int nr__, double_complex* buf__, double pref__, double* vx__, double* vy__) +/// Multiply FFT buffer by the effective potential. +template +static inline void +mul_by_veff(spfft_transform_type& spfftk__, T const* in__, + std::array>, 6> const& veff_vec__, int idx_veff__, T* out__) { - mul_by_veff_complex_complex_gpu_double(nr__, buf__, pref__, vx__, vy__); -} -#endif + PROFILE("sirius::mul_by_veff"); -template ::value>> -static inline void mul_by_veff(spfft_transform_type& spfftk__, T* buff__, - std::array>, 6>& veff_vec__, - int idx_veff__) -{ int nr = spfftk__.local_slice_size(); switch (spfftk__.processing_unit()) { @@ -250,288 +226,189 @@ static inline void mul_by_veff(spfft_transform_type& spfftk__, T* buff__, if (idx_veff__ <= 1 || idx_veff__ >= 4) { /* up-up or dn-dn block or Theta(r) */ switch (spfftk__.type()) { case SPFFT_TRANS_R2C: { - #pragma omp parallel for schedule(static) + #pragma omp parallel for for (int ir = 0; ir < nr; ir++) { /* multiply by V+Bz or V-Bz (in PP-PW case) or by V(r), B_z(r) or Theta(r) (in LAPW case) */ - buff__[ir] *= veff_vec__[idx_veff__]->f_rg(ir); + out__[ir] = in__[ir] * veff_vec__[idx_veff__]->f_rg(ir); } break; } case SPFFT_TRANS_C2C: { - auto wf = reinterpret_cast*>(buff__); - #pragma omp parallel for schedule(static) + auto in = reinterpret_cast const*>(in__); + auto out = reinterpret_cast*>(out__); + #pragma omp parallel for for (int ir = 0; ir < nr; ir++) { /* multiply by V+Bz or V-Bz (in PP-PW case) or by V(r), B_z(r) or Theta(r) (in LAPW case) */ - wf[ir] *= veff_vec__[idx_veff__]->f_rg(ir); + out[ir] = in[ir] * veff_vec__[idx_veff__]->f_rg(ir); } break; } } - } else { - T pref = (idx_veff__ == 2) ? -1 : 1; - auto wf = reinterpret_cast*>(buff__); + } else { /* special case for idx_veff = 2 or idx_veff__ = 3 */ + T pref = (idx_veff__ == 2) ? -1 : 1; + auto in = reinterpret_cast const*>(in__); + auto out = reinterpret_cast*>(out__); #pragma omp parallel for schedule(static) for (int ir = 0; ir < nr; ir++) { /* multiply by Bx +/- i*By */ - wf[ir] *= std::complex(veff_vec__[2]->f_rg(ir), pref * veff_vec__[3]->f_rg(ir)); + out[ir] = in[ir] * std::complex(veff_vec__[2]->f_rg(ir), pref * veff_vec__[3]->f_rg(ir)); } } break; } case SPFFT_PU_GPU: { -#if defined(SIRIUS_GPU) if (idx_veff__ <= 1 || idx_veff__ >= 4) { /* up-up or dn-dn block or Theta(r) */ switch (spfftk__.type()) { case SPFFT_TRANS_R2C: { /* multiply by V+Bz or V-Bz (in PP-PW case) or by V(r), B_z(r) or Theta(r) (in LAPW case) */ - mul_by_veff_real_real_gpu(nr, buff__, veff_vec__[idx_veff__]->f_rg().at(sddk::memory_t::device)); + mul_by_veff_real_real_gpu(nr, in__, veff_vec__[idx_veff__]->f_rg().at(sddk::memory_t::device), out__); break; } case SPFFT_TRANS_C2C: { - auto wf = reinterpret_cast*>(buff__); + auto in = reinterpret_cast const*>(in__); + auto out = reinterpret_cast*>(out__); /* multiply by V+Bz or V-Bz (in PP-PW case) or by V(r), B_z(r) or Theta(r) (in LAPW case) */ - mul_by_veff_complex_real_gpu(nr, wf, veff_vec__[idx_veff__]->f_rg().at(sddk::memory_t::device)); + mul_by_veff_complex_real_gpu(nr, in, veff_vec__[idx_veff__]->f_rg().at(sddk::memory_t::device), out); break; } } } else { /* multiply by Bx +/- i*By */ - T pref = (idx_veff__ == 2) ? -1 : 1; - auto wf = reinterpret_cast*>(buff__); - mul_by_veff_complex_complex_gpu(nr, wf, pref, veff_vec__[2]->f_rg().at(sddk::memory_t::device), - veff_vec__[3]->f_rg().at(sddk::memory_t::device)); + T pref = (idx_veff__ == 2) ? -1 : 1; + auto in = reinterpret_cast const*>(in__); + auto out = reinterpret_cast*>(out__); + + mul_by_veff_complex_complex_gpu(nr, in, pref, veff_vec__[2]->f_rg().at(sddk::memory_t::device), + veff_vec__[3]->f_rg().at(sddk::memory_t::device), out); } break; -#endif } break; } } -#ifdef SIRIUS_GPU -void add_pw_ekin_gpu(int num_gvec__, - float alpha__, - float const* pw_ekin__, - std::complex const* phi__, - std::complex const* vphi__, - std::complex* hphi__) -{ - add_pw_ekin_gpu_float(num_gvec__, alpha__, pw_ekin__, phi__, vphi__, hphi__); -} - -void add_pw_ekin_gpu(int num_gvec__, - double alpha__, - double const* pw_ekin__, - double_complex const* phi__, - double_complex const* vphi__, - double_complex* hphi__) -{ - add_pw_ekin_gpu_double(num_gvec__, alpha__, pw_ekin__, phi__, vphi__, hphi__); -} -#endif - template -void Local_operator::apply_h(spfft_transform_type& spfftk__, Gvec_partition const& gkvec_p__, spin_range spins__, - Wave_functions& phi__, Wave_functions& hphi__, int idx0__, int n__) +void +Local_operator::apply_h(spfft_transform_type& spfftk__, std::shared_ptr gkvec_fft__, + wf::spin_range spins__, wf::Wave_functions const& phi__, wf::Wave_functions& hphi__, wf::band_range br__) { PROFILE("sirius::Local_operator::apply_h"); if ((spfftk__.dim_x() != fft_coarse_.dim_x()) || (spfftk__.dim_y() != fft_coarse_.dim_y()) || (spfftk__.dim_z() != fft_coarse_.dim_z())) { - TERMINATE("wrong FFT dimensions"); + RTE_THROW("wrong FFT dimensions"); } /* increment the counter by the number of wave-functions */ - ctx_.num_loc_op_applied(n__); - - /* this memory pool will be used to allocate extra storage in the host memory */ - auto& mp = const_cast(ctx_).mem_pool(ctx_.host_memory_t()); - /* this memory pool will be used to allocate extra storage in the device memory */ -#if defined(SIRIUS_GPU) - memory_pool* mpd = &const_cast(ctx_).mem_pool(sddk::memory_t::device); -#else - memory_pool* mpd{nullptr}; -#endif - /* alias array for all wave functions in FFT-friendly storage */ - std::array, 2>, 2> phi; - /* alias array for all hphi in FFT-friendly storage */ - std::array, 2>, 2> hphi; - - /* alias for wave-functions that are currently computed */ - std::array, 1>, 2> phi1; - std::array, 1>, 2> hphi1; + ctx_.num_loc_op_applied(br__.size()); /* local number of G-vectors for the FFT transformation */ - int ngv_fft = gkvec_p__.gvec_count_fft(); + int ngv_fft = gkvec_fft__->gvec_count_fft(); if (ngv_fft != spfftk__.num_local_elements()) { TERMINATE("wrong number of G-vectors"); } - memory_t mem_phi{memory_t::none}; - memory_t mem_hphi{memory_t::none}; + std::array, 2> phi_fft; + std::array, 2> hphi_fft; + for (auto s = spins__.begin(); s != spins__.end(); s++) { + phi_fft[s.get()] = wf::Wave_functions_fft(gkvec_fft__, const_cast&>(phi__), s, + br__, wf::shuffle_to::fft_layout); - /* remap wave-functions to FFT friendly distribution */ - for (int ispn : spins__) { - /* if we store wave-functions in the device memory and if the wave functions are remapped - we need to copy the wave functions to host memory */ - if (is_device_memory(phi__.preferred_memory_t()) && phi__.pw_coeffs(ispn).is_remapped()) { - phi__.pw_coeffs(ispn).copy_to(sddk::memory_t::host, idx0__, n__); - } - /* set FFT friendly distribution */ - phi__.pw_coeffs(ispn).remap_forward(n__, idx0__, &mp); - /* memory location of phi in extra storage */ - mem_phi = (phi__.pw_coeffs(ispn).is_remapped()) ? memory_t::host : phi__.preferred_memory_t(); - /* set FFT friednly distribution */ - hphi__.pw_coeffs(ispn).set_num_extra(n__, idx0__, &mp); - /* memory location of hphi in extra storage */ - mem_hphi = (hphi__.pw_coeffs(ispn).is_remapped()) ? memory_t::host : hphi__.preferred_memory_t(); - - /* local number of wave-functions in extra-storage distribution */ - int num_wf_loc = phi__.pw_coeffs(ispn).spl_num_col().local_size(); - - /* set alias for phi extra storage */ - std::complex* ptr_d{nullptr}; - if (phi__.pw_coeffs(ispn).extra().on_device()) { - ptr_d = phi__.pw_coeffs(ispn).extra().at(sddk::memory_t::device); - } - phi[ispn] = - mdarray, 2>(phi__.pw_coeffs(ispn).extra().at(sddk::memory_t::host), ptr_d, ngv_fft, num_wf_loc); - - /* set alias for hphi extra storage */ - ptr_d = nullptr; - if (hphi__.pw_coeffs(ispn).extra().on_device()) { - ptr_d = hphi__.pw_coeffs(ispn).extra().at(sddk::memory_t::device); - } - hphi[ispn] = - mdarray, 2>(hphi__.pw_coeffs(ispn).extra().at(sddk::memory_t::host), ptr_d, ngv_fft, num_wf_loc); + hphi_fft[s.get()] = wf::Wave_functions_fft(gkvec_fft__, hphi__, s, br__, wf::shuffle_to::wf_layout); + auto hphi_mem = hphi_fft[s.get()].on_device() ? sddk::memory_t::device : sddk::memory_t::host; + hphi_fft[s.get()].zero(hphi_mem, wf::spin_index(0), wf::band_range(0, hphi_fft[s.get()].num_wf_local())); } + auto spl_num_wf = phi_fft[spins__.begin().get()].spl_num_wf(); + /* assume the location of data on the current processing unit */ - auto spfft_mem = spfftk__.processing_unit(); + auto spfft_pu = spfftk__.processing_unit(); + auto spfft_mem = spfft_memory_t.at(spfft_pu); /* number of real-space points in the local part of FFT buffer */ int nr = spfftk__.local_slice_size(); /* pointer to FFT buffer */ - auto spfft_buf = spfftk__.space_domain_data(spfft_mem); - - auto prepare_phi_hphi = [&](int i) { - for (int ispn : spins__) { - switch (spfft_mem) { - case SPFFT_PU_HOST: { /* FFT is done on CPU */ - if (is_host_memory(mem_phi)) { /* wave-functions are also on host memory */ - phi1[ispn] = mdarray, 1>(phi[ispn].at(sddk::memory_t::host, 0, i), ngv_fft); - } else { /* wave-functions are on the device memory */ - phi1[ispn] = mdarray, 1>(ngv_fft, mp); - /* copy wave-functions to host memory */ - acc::copyout(phi1[ispn].at(sddk::memory_t::host), phi[ispn].at(sddk::memory_t::device, 0, i), ngv_fft); - } - if (is_host_memory(mem_hphi)) { - hphi1[ispn] = mdarray, 1>(hphi[ispn].at(sddk::memory_t::host, 0, i), ngv_fft); - } else { - hphi1[ispn] = mdarray, 1>(ngv_fft, mp); - } - hphi1[ispn].zero(sddk::memory_t::host); - break; - } - case SPFFT_PU_GPU: { /* FFT is done on GPU */ - if (is_host_memory(mem_phi)) { - phi1[ispn] = mdarray, 1>(ngv_fft, *mpd); - /* copy wave-functions to device */ - acc::copyin(phi1[ispn].at(sddk::memory_t::device), phi[ispn].at(sddk::memory_t::host, 0, i), ngv_fft); - } else { - phi1[ispn] = - mdarray, 1>(nullptr, phi[ispn].at(sddk::memory_t::device, 0, i), ngv_fft); - } - if (is_host_memory(mem_hphi)) { - /* small buffers in the device memory */ - hphi1[ispn] = mdarray, 1>(ngv_fft, *mpd); - } else { - hphi1[ispn] = - mdarray, 1>(nullptr, hphi[ispn].at(sddk::memory_t::device, 0, i), ngv_fft); - } - hphi1[ispn].zero(sddk::memory_t::device); - break; - } - } - } - }; - - auto store_hphi = [&](int i) { - for (int ispn : spins__) { - switch (spfft_mem) { - case SPFFT_PU_HOST: { /* FFT is done on CPU */ - if (is_device_memory(mem_hphi)) { - /* copy to device */ - acc::copyin(hphi[ispn].at(sddk::memory_t::device, 0, i), hphi1[ispn].at(sddk::memory_t::host), ngv_fft); - } - break; - } - case SPFFT_PU_GPU: { /* FFT is done on GPU */ - if (is_host_memory(mem_hphi)) { - /* copy back to host */ - acc::copyout(hphi[ispn].at(sddk::memory_t::host, 0, i), hphi1[ispn].at(sddk::memory_t::device), ngv_fft); - } - break; - } - } - } - }; + auto spfft_buf = spfftk__.space_domain_data(spfft_pu); /* transform wave-function to real space; the result of the transformation is stored in the FFT buffer */ - auto phi_to_r = [&](int ispn) { - spfftk__.backward(reinterpret_cast(phi1[ispn].at(spfft_memory_t.at(spfft_mem))), spfft_mem); + auto phi_to_r = [&](wf::spin_index ispn, wf::band_index i) { + PROFILE("phi_to_r"); + auto phi_mem = phi_fft[ispn.get()].on_device() ? sddk::memory_t::device : sddk::memory_t::host; + spfftk__.backward(phi_fft[ispn.get()].pw_coeffs_spfft(phi_mem, i), spfft_pu); }; /* transform function to PW domain */ auto vphi_to_G = [&]() { - spfftk__.forward(spfft_mem, reinterpret_cast(vphi_.at(spfft_memory_t.at(spfft_mem))), SPFFT_FULL_SCALING); + PROFILE("vphi_to_G"); + spfftk__.forward(spfft_pu, reinterpret_cast(vphi_.at(spfft_mem)), SPFFT_FULL_SCALING); }; /* store the resulting hphi spin block (ispn_block) is used as a bit mask: - first bit: spin component which is updated - second bit: add or not kinetic energy term */ - auto add_to_hphi = [&](int ispn_block) { + auto add_to_hphi = [&](int ispn_block, wf::band_index i) { + PROFILE("add_to_hphi"); /* index of spin component */ int ispn = ispn_block & 1; /* add kinetic energy if this is a diagonal block */ int ekin = (ispn_block & 2) ? 0 : 1; - switch (spfft_mem) { - case SPFFT_PU_HOST: { + auto hphi_mem = hphi_fft[ispn].on_device() ? sddk::memory_t::device : sddk::memory_t::host; + + switch (hphi_mem) { + case sddk::memory_t::host: { + if (spfft_pu == SPFFT_PU_GPU) { + vphi_.copy_to(sddk::memory_t::host); + } /* CPU case */ if (ekin) { - #pragma omp parallel for schedule(static) - for (int ig = 0; ig < gkvec_p__.gvec_count_fft(); ig++) { - hphi1[ispn][ig] += (phi1[ispn][ig] * pw_ekin_[ig] + vphi_[ig]); + #pragma omp parallel for + for (int ig = 0; ig < ngv_fft; ig++) { + hphi_fft[ispn].pw_coeffs(ig, i) += phi_fft[ispn].pw_coeffs(ig, i) * pw_ekin_[ig] + vphi_[ig]; } } else { - #pragma omp parallel for schedule(static) - for (int ig = 0; ig < gkvec_p__.gvec_count_fft(); ig++) { - hphi1[ispn][ig] += vphi_[ig]; + #pragma omp parallel for + for (int ig = 0; ig < ngv_fft; ig++) { + hphi_fft[ispn].pw_coeffs(ig, wf::band_index(i)) += vphi_[ig]; } } break; } - case SPFFT_PU_GPU: { -#if defined(SIRIUS_GPU) - T alpha = static_cast(ekin); - add_pw_ekin_gpu(gkvec_p__.gvec_count_fft(), alpha, pw_ekin_.at(sddk::memory_t::device), - phi1[ispn].at(sddk::memory_t::device), vphi_.at(sddk::memory_t::device), - hphi1[ispn].at(sddk::memory_t::device)); -#endif + case sddk::memory_t::device: { + add_to_hphi_pw_gpu(ngv_fft, ekin, pw_ekin_.at(sddk::memory_t::device), + phi_fft[ispn].at(sddk::memory_t::device, 0, wf::band_index(i)), + vphi_.at(sddk::memory_t::device), + hphi_fft[ispn].at(sddk::memory_t::device, 0, wf::band_index(i))); + break; + } + default: { break; } } }; - /* local number of wave-functions in extra-storage distribution */ - int num_wf_loc = phi__.pw_coeffs(0).spl_num_col().local_size(); + auto copy_phi = [&]() + { + switch (spfft_pu) { + /* this is a non-collinear case, so the wave-functions and FFT buffer are complex and + we can copy memory */ + case SPFFT_PU_HOST: { + auto inp = reinterpret_cast*>(spfft_buf); + std::copy(inp, inp + nr, buf_rg_.at(sddk::memory_t::host)); + break; + } + case SPFFT_PU_GPU: { + acc::copy(buf_rg_.at(sddk::memory_t::device), reinterpret_cast*>(spfft_buf), nr); + break; + } + } + }; - /* if we don't have G-vector reductions, first = 0 and we start a normal loop */ - for (int i = 0; i < num_wf_loc; i++) { + PROFILE_START("sirius::Local_operator::apply_h|bands"); + for (int i = 0; i < spl_num_wf.local_size(); i++) { /* non-collinear case */ /* 2x2 Hamiltonian in applied to spinor wave-functions @@ -554,229 +431,208 @@ void Local_operator::apply_h(spfft_transform_type& spfftk__, Gvec_partitio .---.---. | 3 | 1 | .---.---. - */ - if (spins__() == 2) { - prepare_phi_hphi(i); + */ + if (spins__.size() == 2) { /* phi_u(G) -> phi_u(r) */ - phi_to_r(0); + phi_to_r(wf::spin_index(0), wf::band_index(i)); /* save phi_u(r) in temporary buf_rg array */ - switch (spfft_mem) { - /* this is a non-collinear case, so the wave-functions and FFT buffer are complex and - we can copy memory */ - case SPFFT_PU_HOST: { - auto inp = reinterpret_cast*>(spfft_buf); - std::copy(inp, inp + nr, buf_rg_.at(sddk::memory_t::host)); - break; - } - case SPFFT_PU_GPU: { - acc::copy(buf_rg_.at(sddk::memory_t::device), reinterpret_cast*>(spfft_buf), nr); - break; - } - } + copy_phi(); /* multiply phi_u(r) by effective potential */ - mul_by_veff(spfftk__, spfft_buf, veff_vec_, 0); + mul_by_veff(spfftk__, spfft_buf, veff_vec_, v_local_index_t::v0, spfft_buf); /* V_{uu}(r)phi_{u}(r) -> [V*phi]_{u}(G) */ vphi_to_G(); /* add kinetic energy */ - add_to_hphi(0); + add_to_hphi(0, wf::band_index(i)); /* multiply phi_{u} by V_{du} and copy to FFT buffer */ - switch (spfft_mem) { - case SPFFT_PU_HOST: { - mul_by_veff(spfftk__, reinterpret_cast(buf_rg_.at(sddk::memory_t::host)), veff_vec_, 3); - std::copy(buf_rg_.at(sddk::memory_t::host), buf_rg_.at(sddk::memory_t::host) + nr, - reinterpret_cast*>(spfft_buf)); - break; - } - case SPFFT_PU_GPU: { - mul_by_veff(spfftk__, reinterpret_cast(buf_rg_.at(sddk::memory_t::device)), veff_vec_, 3); - acc::copy(reinterpret_cast*>(spfft_buf), buf_rg_.at(sddk::memory_t::device), nr); - break; - } - } + mul_by_veff(spfftk__, reinterpret_cast(buf_rg_.at(spfft_mem)), veff_vec_, 3, spfft_buf); /* V_{du}(r)phi_{u}(r) -> [V*phi]_{d}(G) */ vphi_to_G(); /* add to hphi_{d} */ - add_to_hphi(3); + add_to_hphi(3, wf::band_index(i)); /* for the second spin component */ /* phi_d(G) -> phi_d(r) */ - phi_to_r(1); + phi_to_r(wf::spin_index(1), wf::band_index(i)); /* save phi_d(r) */ - switch (spfft_mem) { - case SPFFT_PU_HOST: { - auto inp = reinterpret_cast*>(spfft_buf); - std::copy(inp, inp + nr, buf_rg_.at(sddk::memory_t::host)); - break; - } - case SPFFT_PU_GPU: { - acc::copy(buf_rg_.at(sddk::memory_t::device), reinterpret_cast*>(spfft_buf), nr); - break; - } - } + copy_phi(); /* multiply phi_d(r) by effective potential */ - mul_by_veff(spfftk__, spfft_buf, veff_vec_, 1); - /* V_{dd}(r)phi_{d}(r) -> [V*phi]_{d}(G) */ + mul_by_veff(spfftk__, spfft_buf, veff_vec_, v_local_index_t::v1, spfft_buf); + /* V_{dd}(r)phi_{d}(r) -> [V*phi]_{d}(G) */ vphi_to_G(); /* add kinetic energy */ - add_to_hphi(1); + add_to_hphi(1, wf::band_index(i)); /* multiply phi_{d} by V_{ud} and copy to FFT buffer */ - switch (spfft_mem) { - case SPFFT_PU_HOST: { - mul_by_veff(spfftk__, reinterpret_cast(buf_rg_.at(sddk::memory_t::host)), veff_vec_, 2); - std::copy(buf_rg_.at(sddk::memory_t::host), buf_rg_.at(sddk::memory_t::host) + nr, - reinterpret_cast*>(spfft_buf)); - break; - } - case SPFFT_PU_GPU: { - mul_by_veff(spfftk__, reinterpret_cast(buf_rg_.at(sddk::memory_t::device)), veff_vec_, 2); - acc::copy(reinterpret_cast*>(spfft_buf), buf_rg_.at(sddk::memory_t::device), nr); - break; - } - } + mul_by_veff(spfftk__, reinterpret_cast(buf_rg_.at(spfft_mem)), veff_vec_, 2, spfft_buf); /* V_{ud}(r)phi_{d}(r) -> [V*phi]_{u}(G) */ vphi_to_G(); /* add to hphi_{u} */ - add_to_hphi(2); - /* copy to main hphi array */ - store_hphi(i); + add_to_hphi(2, wf::band_index(i)); } else { /* spin-collinear or non-magnetic case */ - prepare_phi_hphi(i); /* phi(G) -> phi(r) */ - phi_to_r(spins__()); + phi_to_r(spins__.begin(), wf::band_index(i)); /* multiply by effective potential */ - mul_by_veff(spfftk__, spfft_buf, veff_vec_, spins__()); + mul_by_veff(spfftk__, spfft_buf, veff_vec_, spins__.begin().get(), spfft_buf); /* V(r)phi(r) -> [V*phi](G) */ vphi_to_G(); /* add kinetic energy */ - add_to_hphi(spins__()); - store_hphi(i); + add_to_hphi(spins__.begin().get(), wf::band_index(i)); } } - - /* remap hphi backward */ - for (int ispn : spins__) { - hphi__.pw_coeffs(ispn).remap_backward(n__, idx0__); - if (is_device_memory(hphi__.preferred_memory_t()) && hphi__.pw_coeffs(ispn).is_remapped()) { - hphi__.pw_coeffs(ispn).copy_to(sddk::memory_t::device, idx0__, n__); - } - } - /* at this point hphi in prime storage is both on CPU and GPU memory; however if the memory pool - was used for the device memory allocation, device storage is destroyed */ + PROFILE_STOP("sirius::Local_operator::apply_h|bands"); } +// This is full-potential case. Only C2C FFT transformation is considered here. +// TODO: document the data location on input/output template -void Local_operator::apply_h_o(spfft_transform_type& spfftk__, Gvec_partition const& gkvec_p__, int N__, int n__, - Wave_functions& phi__, Wave_functions* hphi__, Wave_functions* ophi__) +void Local_operator::apply_fplapw(spfft_transform_type& spfftk__, std::shared_ptr gkvec_fft__, + wf::band_range b__, wf::Wave_functions& phi__, wf::Wave_functions* hphi__, wf::Wave_functions* ophi__, + wf::Wave_functions* bzphi__, wf::Wave_functions* bxyphi__) { PROFILE("sirius::Local_operator::apply_h_o"); - ctx_.num_loc_op_applied(n__); + ctx_.num_loc_op_applied(b__.size()); - sddk::mdarray, 1> buf_pw(gkvec_p__.gvec_count_fft(), ctx_.mem_pool(sddk::memory_t::host)); + /* assume the location of data on the current processing unit */ + auto spfft_pu = spfftk__.processing_unit(); - if (ctx_.processing_unit() == device_t::GPU) { - phi__.pw_coeffs(0).copy_to(sddk::memory_t::host, N__, n__); - } - // if (ctx_->control().print_checksum_) { - // auto cs = phi__.checksum_pw(N__, n__, ctx_->processing_unit()); - // if (phi__.comm().rank() == 0) { - // DUMP("checksum(phi_pw): %18.10f %18.10f", cs.real(), cs.imag()); - // } - //} + auto spfft_mem = spfft_memory_t.at(spfft_pu); - auto& mp = const_cast(ctx_).mem_pool(sddk::memory_t::host); + auto s0 = wf::spin_index(0); - phi__.pw_coeffs(0).remap_forward(n__, N__, &mp); + wf::Wave_functions_fft phi_fft(gkvec_fft__, phi__, s0, b__, wf::shuffle_to::fft_layout); - if (hphi__ != nullptr) { - hphi__->pw_coeffs(0).set_num_extra(n__, N__, &mp); + std::map*, wf::Wave_functions_fft> map_wf_fft; + if (hphi__) { + map_wf_fft[hphi__] = wf::Wave_functions_fft(gkvec_fft__, *hphi__, s0, b__, wf::shuffle_to::wf_layout); + } + if (ophi__) { + map_wf_fft[ophi__] = wf::Wave_functions_fft(gkvec_fft__, *ophi__, s0, b__, wf::shuffle_to::wf_layout); } + if (bzphi__) { + map_wf_fft[bzphi__] = wf::Wave_functions_fft(gkvec_fft__, *bzphi__, s0, b__, wf::shuffle_to::wf_layout); + } + if (bxyphi__) { + map_wf_fft[bxyphi__] = wf::Wave_functions_fft(gkvec_fft__, *bxyphi__, s0, b__, wf::shuffle_to::wf_layout); + } + + auto pcs = env::print_checksum(); - if (ophi__ != nullptr) { - ophi__->pw_coeffs(0).set_num_extra(n__, N__, &mp); + if (pcs) { + auto cs = phi__.checksum_pw(spfft_mem, wf::spin_index(0), b__); + if (phi__.gkvec().comm().rank() == 0) { + utils::print_checksum("theta_pw", cs, RTE_OUT(std::cout)); + } } - /* assume the location of data on the current processing unit */ - auto spfft_mem = spfftk__.processing_unit(); + //auto& mp = const_cast(ctx_).mem_pool(sddk::memory_t::host); + + auto spl_num_wf = phi_fft.spl_num_wf(); /* number of real-space points in the local part of FFT buffer */ int nr = spfftk__.local_slice_size(); - /* pointer to FFT buffer */ - auto spfft_buf = spfftk__.space_domain_data(spfft_mem); + /* pointer to memory where SpFFT stores real-space data */ + auto spfft_buf = spfftk__.space_domain_data(spfft_pu); + + sddk::mdarray, 1> buf_pw(gkvec_fft__->gvec_count_fft(), get_memory_pool(ctx_.host_memory_t())); + if (ctx_.processing_unit() == sddk::device_t::GPU) { + buf_pw.allocate(get_memory_pool(sddk::memory_t::device)); + } - for (int j = 0; j < phi__.pw_coeffs(0).spl_num_col().local_size(); j++) { + auto phi_mem = phi_fft.on_device() ? sddk::memory_t::device : sddk::memory_t::host; + + auto phi_r = buf_rg_.at(spfft_mem); + + for (int j = 0; j < spl_num_wf.local_size(); j++) { /* phi(G) -> phi(r) */ - spfftk__.backward(reinterpret_cast(phi__.pw_coeffs(0).extra().at(sddk::memory_t::host, 0, j)), spfft_mem); - if (ophi__ != nullptr) { - /* save phi(r) */ - if (hphi__ != nullptr) { - switch (spfft_mem) { - case SPFFT_PU_HOST: { - auto inp = reinterpret_cast*>(spfft_buf); - std::copy(inp, inp + nr, buf_rg_.at(sddk::memory_t::host)); - break; - } - case SPFFT_PU_GPU: { - acc::copy(buf_rg_.at(sddk::memory_t::device), reinterpret_cast*>(spfft_buf), nr); - break; - } - } + spfftk__.backward(phi_fft.pw_coeffs_spfft(phi_mem, wf::band_index(j)), spfft_pu); + + /* we are going to apply various terms of the Hamiltonian to the wave-function; save wave-function on the + * real space grid first */ + + /* save phi(r); real-space data is complex */ + auto inp = reinterpret_cast*>(spfft_buf); + switch (spfft_pu) { + case SPFFT_PU_HOST: { + std::copy(inp, inp + nr, phi_r); + break; } + case SPFFT_PU_GPU: { + acc::copy(phi_r, inp, nr); + break; + } + } + if (ophi__) { /* multiply phi(r) by step function */ - mul_by_veff(spfftk__, spfft_buf, veff_vec_, 4); + mul_by_veff(spfftk__, reinterpret_cast(phi_r), veff_vec_, v_local_index_t::theta, spfft_buf); + + auto mem = map_wf_fft[ophi__].on_device() ? sddk::memory_t::device : sddk::memory_t::host; /* phi(r) * Theta(r) -> ophi(G) */ - spfftk__.forward(spfft_mem, reinterpret_cast(ophi__->pw_coeffs(0).extra().at(sddk::memory_t::host, 0, j)), - SPFFT_FULL_SCALING); - /* load phi(r) back */ - if (hphi__ != nullptr) { - switch (spfft_mem) { - case SPFFT_PU_HOST: { - std::copy(buf_rg_.at(sddk::memory_t::host), buf_rg_.at(sddk::memory_t::host) + nr, - reinterpret_cast*>(spfft_buf)); - break; - } - case SPFFT_PU_GPU: { - acc::copy(reinterpret_cast*>(spfft_buf), buf_rg_.at(sddk::memory_t::device), nr); - break; - } - } - } + spfftk__.forward(spfft_pu, map_wf_fft[ophi__].pw_coeffs_spfft(mem, wf::band_index(j)), + SPFFT_FULL_SCALING); } - if (hphi__ != nullptr) { - /* multiply by effective potential, which itself was multiplied by the step function */ - mul_by_veff(spfftk__, spfft_buf, veff_vec_, 0); - /* phi(r) * Theta(r) * V(r) -> hphi(G) */ - spfftk__.forward(spfft_mem, reinterpret_cast(hphi__->pw_coeffs(0).extra().at(sddk::memory_t::host, 0, j)), - SPFFT_FULL_SCALING); + + if (bzphi__) { + mul_by_veff(spfftk__, reinterpret_cast(phi_r), veff_vec_, v_local_index_t::v1, spfft_buf); + + auto mem = map_wf_fft[bzphi__].on_device() ? sddk::memory_t::device : sddk::memory_t::host; + + /* phi(r) * Bz(r) -> bzphi(G) */ + spfftk__.forward(spfft_pu, map_wf_fft[bzphi__].pw_coeffs_spfft(mem, wf::band_index(j)), + SPFFT_FULL_SCALING); + } + + if (bxyphi__) { + mul_by_veff(spfftk__, reinterpret_cast(phi_r), veff_vec_, 2, spfft_buf); + + auto mem = map_wf_fft[bxyphi__].on_device() ? sddk::memory_t::device : sddk::memory_t::host; + + /* phi(r) * (Bx(r) - iBy(r)) -> bxyphi(G) */ + spfftk__.forward(spfft_pu, map_wf_fft[bxyphi__].pw_coeffs_spfft(mem, wf::band_index(j)), + SPFFT_FULL_SCALING); } - if (hphi__ != nullptr) { + if (hphi__) { + mul_by_veff(spfftk__, reinterpret_cast(phi_r), veff_vec_, v_local_index_t::v0, spfft_buf); + + auto mem = map_wf_fft[hphi__].on_device() ? sddk::memory_t::device : sddk::memory_t::host; + + /* phi(r) * Theta(r) * V(r) -> hphi(G) */ + spfftk__.forward(spfft_pu, map_wf_fft[hphi__].pw_coeffs_spfft(mem, wf::band_index(j)), + SPFFT_FULL_SCALING); + /* add kinetic energy */ for (int x : {0, 1, 2}) { - #pragma omp parallel for schedule(static) - for (int igloc = 0; igloc < gkvec_p__.gvec_count_fft(); igloc++) { - auto gvc = gkvec_p__.gkvec_cart(igloc); - /* \hat P phi = phi(G+k) * (G+k), \hat P is momentum operator */ - buf_pw[igloc] = phi__.pw_coeffs(0).extra()(igloc, j) * static_cast(gvc[x]); + if (is_host_memory(mem)) { + #pragma omp parallel for + for (int igloc = 0; igloc < gkvec_fft__->gvec_count_fft(); igloc++) { + auto gvc = gkvec_fft__->gkvec_cart(igloc); + /* \hat P phi = phi(G+k) * (G+k), \hat P is momentum operator */ + buf_pw[igloc] = phi_fft.pw_coeffs(igloc, wf::band_index(j)) * static_cast(gvc[x]); + } + } else { + grad_phi_lapw_gpu(gkvec_fft__->gvec_count_fft(), + phi_fft.at(mem, 0, wf::band_index(j)), + gkvec_cart_.at(mem, 0, x), buf_pw.at(mem)); } + /* transform Cartesian component of wave-function gradient to real space */ - spfftk__.backward(reinterpret_cast(&buf_pw[0]), spfft_mem); + spfftk__.backward(reinterpret_cast(buf_pw.at(mem)), spfft_pu); /* multiply by real-space function */ switch (ctx_.valence_relativity()) { case relativity_t::iora: case relativity_t::zora: { /* multiply be inverse relative mass */ - mul_by_veff(spfftk__, spfft_buf, veff_vec_, 5); + mul_by_veff(spfftk__, spfft_buf, veff_vec_, v_local_index_t::rm_inv, spfft_buf); break; } case relativity_t::none: { /* multiply be step function */ - mul_by_veff(spfftk__, spfft_buf, veff_vec_, 4); + mul_by_veff(spfftk__, spfft_buf, veff_vec_, v_local_index_t::theta, spfft_buf); break; } default: { @@ -784,115 +640,22 @@ void Local_operator::apply_h_o(spfft_transform_type& spfftk__, Gvec_partit } } /* transform back to PW domain */ - spfftk__.forward(spfft_mem, reinterpret_cast(&buf_pw[0]), SPFFT_FULL_SCALING); - #pragma omp parallel for schedule(static) - for (int igloc = 0; igloc < gkvec_p__.gvec_count_fft(); igloc++) { - auto gvc = gkvec_p__.gkvec_cart(igloc); - hphi__->pw_coeffs(0).extra()(igloc, j) += static_cast(0.5) * buf_pw[igloc] * static_cast(gvc[x]); - } - } - } - } - - if (hphi__ != nullptr) { - hphi__->pw_coeffs(0).remap_backward(n__, N__); - } - if (ophi__ != nullptr) { - ophi__->pw_coeffs(0).remap_backward(n__, N__); - } - - if (ctx_.processing_unit() == device_t::GPU) { - if (hphi__ != nullptr) { - hphi__->pw_coeffs(0).copy_to(sddk::memory_t::device, N__, n__); - } - if (ophi__ != nullptr) { - ophi__->pw_coeffs(0).copy_to(sddk::memory_t::device, N__, n__); - } - } -} - -template -void Local_operator::apply_b(spfft_transform_type& spfftk__, int N__, int n__, Wave_functions& phi__, std::vector>& bphi__) -{ - PROFILE("sirius::Local_operator::apply_b"); - - // TODO: bphi[1] is not used here (it will compied from bphi[0] with a negative sign later; - // so it's remapping here is useless - - /* components of H|psi> to which H is applied */ - std::vector iv(1, 0); - if (bphi__.size() == 3) { - iv.push_back(2); - } - - auto& mp = const_cast(ctx_).mem_pool(sddk::memory_t::host); - - /* assume the location of data on the current processing unit */ - auto spfft_mem = spfftk__.processing_unit(); - - /* number of real-space points in the local part of FFT buffer */ - int nr = spfftk__.local_slice_size(); - - /* pointer to FFT buffer */ - auto spfft_buf = spfftk__.space_domain_data(spfft_mem); - - phi__.pw_coeffs(0).remap_forward(n__, N__, &mp); - for (int i : iv) { - bphi__[i].pw_coeffs(0).set_num_extra(n__, N__, &mp); - } - - for (int j = 0; j < phi__.pw_coeffs(0).spl_num_col().local_size(); j++) { - /* phi(G) -> phi(r) */ - spfftk__.backward(reinterpret_cast(phi__.pw_coeffs(0).extra().at(sddk::memory_t::host, 0, j)), spfft_mem); - - /* save phi(r) */ - if (bphi__.size() == 3) { - switch (spfft_mem) { - case SPFFT_PU_HOST: { - auto inp = reinterpret_cast*>(spfft_buf); - std::copy(inp, inp + nr, buf_rg_.at(sddk::memory_t::host)); - break; - } - case SPFFT_PU_GPU: { - acc::copy(buf_rg_.at(sddk::memory_t::device), reinterpret_cast*>(spfft_buf), nr); - break; - } - } - } - /* multiply by Bz */ - mul_by_veff(spfftk__, spfft_buf, veff_vec_, 1); - - /* phi(r) * Bz(r) -> bphi[0](G) */ - spfftk__.forward(spfft_mem, - reinterpret_cast(bphi__[0].pw_coeffs(0).extra().at(sddk::memory_t::host, 0, j)), - SPFFT_FULL_SCALING); - - /* non-collinear case */ - if (bphi__.size() == 3) { - /* multiply by Bx-iBy and copy to FFT buffer */ - switch (spfft_mem) { - case SPFFT_PU_HOST: { - mul_by_veff(spfftk__, reinterpret_cast(buf_rg_.at(sddk::memory_t::host)), veff_vec_, 2); - std::copy(buf_rg_.at(sddk::memory_t::host), buf_rg_.at(sddk::memory_t::host) + nr, - reinterpret_cast*>(spfft_buf)); - break; - } - case SPFFT_PU_GPU: { - mul_by_veff(spfftk__, reinterpret_cast(buf_rg_.at(sddk::memory_t::device)), veff_vec_, 2); - acc::copy(reinterpret_cast*>(spfft_buf), buf_rg_.at(sddk::memory_t::device), nr); - break; + spfftk__.forward(spfft_pu, reinterpret_cast(buf_pw.at(mem)), SPFFT_FULL_SCALING); + if (is_host_memory(mem)) { + #pragma omp parallel for + for (int igloc = 0; igloc < gkvec_fft__->gvec_count_fft(); igloc++) { + auto gvc = gkvec_fft__->gkvec_cart(igloc); + map_wf_fft[hphi__].pw_coeffs(igloc, wf::band_index(j)) += buf_pw[igloc] * + static_cast(0.5 * gvc[x]); + } + } else { + add_to_hphi_lapw_gpu(gkvec_fft__->gvec_count_fft(), buf_pw.at(sddk::memory_t::device), + gkvec_cart_.at(sddk::memory_t::device, 0, x), + map_wf_fft[hphi__].at(sddk::memory_t::device, 0, wf::band_index(j))); } - } - /* phi(r) * (Bx(r)-iBy(r)) -> bphi[2](G) */ - spfftk__.forward(spfft_mem, - reinterpret_cast(bphi__[2].pw_coeffs(0).extra().at(sddk::memory_t::host, 0, j)), - SPFFT_FULL_SCALING); + } // x } } - - for (int i : iv) { - bphi__[i].pw_coeffs(0).remap_backward(n__, N__); - } } // instantiate for supported precision diff --git a/src/hamiltonian/local_operator.hpp b/src/hamiltonian/local_operator.hpp index 096ae3d25..adce42035 100644 --- a/src/hamiltonian/local_operator.hpp +++ b/src/hamiltonian/local_operator.hpp @@ -28,6 +28,7 @@ #include "SDDK/memory.hpp" #include "SDDK/fft.hpp" #include "typedefs.hpp" +#include "utils/rte.hpp" /* forward declarations */ namespace sirius { @@ -38,9 +39,12 @@ class Smooth_periodic_function; } namespace sddk { class FFT3D; -class Gvec_partition; +class Gvec_fft; +} +namespace wf { template class Wave_functions; +class band_range; class spin_range; } namespace spfft { @@ -48,32 +52,148 @@ class Transform; } #ifdef SIRIUS_GPU -extern "C" void mul_by_veff_real_real_gpu_float(int nr__, float* buf__, float* veff__); +extern "C" { + +void +add_to_hphi_pw_gpu_float(int num_gvec__, int add_ekin__, void const* pw_ekin__, void const* phi__, + void const* vphi__, void* hphi__); + +void +add_to_hphi_pw_gpu_double(int num_gvec__, int add_ekin__, void const* pw_ekin__, void const* phi__, + void const* vphi__, void* hphi__); + +void +add_to_hphi_lapw_gpu_float(int num_gvec__, void const* p__, void const* gkvec_cart__, void* hphi__); + +void +add_to_hphi_lapw_gpu_double(int num_gvec__, void const* p__, void const* gkvec_cart__, void* hphi__); + +void +grad_phi_lapw_gpu_float(int num_gvec__, void const* p__, void const* gkvec_cart__, void* hphi__); + +void +grad_phi_lapw_gpu_double(int num_gvec__, void const* p__, void const* gkvec_cart__, void* hphi__); + +void +mul_by_veff_real_real_gpu_float(int nr__, void const* in__, void const* veff__, void* out__); -extern "C" void mul_by_veff_real_real_gpu_double(int nr__, double* buf__, double* veff__); +void +mul_by_veff_real_real_gpu_double(int nr__, void const* in__, void const* veff__, void* out__); -extern "C" void mul_by_veff_complex_real_gpu_float(int nr__, std::complex* buf__, float* veff__); +void +mul_by_veff_complex_real_gpu_float(int nr__, void const* in__, void const* veff__, void* out__); -extern "C" void mul_by_veff_complex_real_gpu_double(int nr__, double_complex* buf__, double* veff__); +void +mul_by_veff_complex_real_gpu_double(int nr__, void const* in__, void const* veff__, void* out__); -extern "C" void mul_by_veff_complex_complex_gpu_float(int nr__, std::complex* buf__, float pref__, float* vx__, float* vy__); +void +mul_by_veff_complex_complex_gpu_float(int nr__, void const* in__, float pref__, + void const* vx__, void const* vy__, void* out__); + +void +mul_by_veff_complex_complex_gpu_double(int nr__, void const* in__, double pref__, + void const* vx__, void const* vy__, void* out__); + +} // extern C +#endif + +template +inline void +mul_by_veff_real_real_gpu(int nr__, T const* in__, T const* veff__, T* out__) +{ +#ifdef SIRIUS_GPU + if (std::is_same::value) { + mul_by_veff_real_real_gpu_float(nr__, in__, veff__, out__); + } + if (std::is_same::value) { + mul_by_veff_real_real_gpu_double(nr__, in__, veff__, out__); + } +#else + RTE_THROW("not compiled with GPU support"); +#endif +} + +template +inline void +mul_by_veff_complex_real_gpu(int nr__, std::complex const* in__, T const* veff__, std::complex* out__) +{ +#ifdef SIRIUS_GPU + if (std::is_same::value) { + mul_by_veff_complex_real_gpu_float(nr__, in__, veff__, out__); + } + if (std::is_same::value) { + mul_by_veff_complex_real_gpu_double(nr__, in__, veff__, out__); + } +#else + RTE_THROW("not compiled with GPU support"); +#endif +} + +template +inline void +mul_by_veff_complex_complex_gpu(int nr__, std::complex const* in__, T pref__, T const* vx__, T const* vy__, + std::complex* out__) +{ +#ifdef SIRIUS_GPU + if (std::is_same::value) { + mul_by_veff_complex_complex_gpu_float(nr__, in__, pref__, vx__, vy__, out__); + } + if (std::is_same::value) { + mul_by_veff_complex_complex_gpu_double(nr__, in__, pref__, vx__, vy__, out__); + } +#else + RTE_THROW("not compiled with GPU support"); +#endif +} -extern "C" void mul_by_veff_complex_complex_gpu_double(int nr__, double_complex* buf__, double pref__, double* vx__, double* vy__); +template +inline void +add_to_hphi_pw_gpu(int num_gvec__, int add_ekin__, T const* pw_ekin__, std::complex const* phi__, + std::complex const* vphi__, std::complex* hphi__) +{ +#ifdef SIRIUS_GPU + if (std::is_same::value) { + add_to_hphi_pw_gpu_float(num_gvec__, add_ekin__, pw_ekin__, phi__, vphi__, hphi__); + } + if (std::is_same::value) { + add_to_hphi_pw_gpu_double(num_gvec__, add_ekin__, pw_ekin__, phi__, vphi__, hphi__); + } +#else + RTE_THROW("not compiled with GPU support"); +#endif +} -extern "C" void add_pw_ekin_gpu_float(int num_gvec__, - float alpha__, - float const* pw_ekin__, - std::complex const* phi__, - std::complex const* vphi__, - std::complex* hphi__); +template +inline void +add_to_hphi_lapw_gpu(int num_gvec__, std::complex const* p__, T const* gkvec_cart__, std::complex* hphi__) +{ +#ifdef SIRIUS_GPU + if (std::is_same::value) { + add_to_hphi_lapw_gpu_float(num_gvec__, p__, gkvec_cart__, hphi__); + } + if (std::is_same::value) { + add_to_hphi_lapw_gpu_double(num_gvec__, p__, gkvec_cart__, hphi__); + } +#else + RTE_THROW("not compiled with GPU support"); +#endif +} -extern "C" void add_pw_ekin_gpu_double(int num_gvec__, - double alpha__, - double const* pw_ekin__, - double_complex const* phi__, - double_complex const* vphi__, - double_complex* hphi__); +template +inline void +grad_phi_lapw_gpu(int num_gvec__, std::complex const* p__, T const* gkvec_cart__, std::complex* hphi__) +{ +#ifdef SIRIUS_GPU + if (std::is_same::value) { + grad_phi_lapw_gpu_float(num_gvec__, p__, gkvec_cart__, hphi__); + } + if (std::is_same::value) { + grad_phi_lapw_gpu_double(num_gvec__, p__, gkvec_cart__, hphi__); + } +#else + RTE_THROW("not compiled with GPU support"); #endif +} namespace sirius { @@ -95,11 +215,24 @@ class Local_operator spfft_transform_type& fft_coarse_; /// Distribution of the G-vectors for the FFT transformation. - sddk::Gvec_partition const& gvec_coarse_p_; + std::shared_ptr gvec_coarse_p_; /// Kinetic energy of G+k plane-waves. sddk::mdarray pw_ekin_; + sddk::mdarray gkvec_cart_; + + // Names for indices. + struct v_local_index_t + { + static const int v0 = 0; + static const int v1 = 1; + static const int vx = 2; + static const int vy = 3; + static const int theta = 4; + static const int rm_inv = 5; + }; + /// Effective potential components and unit step function on a coarse FFT grid. /** The following elements are stored in the array: - V(r) + B_z(r) (in PP-PW case) or V(r) (in FP-LAPW case) @@ -134,14 +267,12 @@ class Local_operator * \param [in] potential Effective potential and magnetic fields \f$ V_{eff}({\bf r}) \f$ and * \f$ {\bf B}_{eff}({\bf r}) \f$ on the fine FFT grid. */ - Local_operator(Simulation_context const& ctx__, - spfft_transform_type& fft_coarse__, - sddk::Gvec_partition const& gvec_coarse_p__, - Potential* potential__ = nullptr); + Local_operator(Simulation_context const& ctx__, spfft_transform_type& fft_coarse__, + std::shared_ptr gvec_coarse_fft__, Potential* potential__ = nullptr); /// Prepare the k-point dependent arrays. /** \param [in] gkvec_p FFT-friendly G+k vector partitioning. */ - void prepare_k(sddk::Gvec_partition const& gkvec_p__); + void prepare_k(sddk::Gvec_fft const& gkvec_p__); /// Apply local part of Hamiltonian to pseudopotential wave-functions. /** \param [in] spfftk SpFFT transform object for G+k vectors. @@ -159,8 +290,9 @@ class Local_operator * * Local Hamiltonian includes kinetic term and local part of potential. */ - void apply_h(spfft_transform_type& spfftk__, sddk::Gvec_partition const& gkvec_p__, sddk::spin_range spins__, - sddk::Wave_functions& phi__, sddk::Wave_functions& hphi__, int idx0__, int n__); + void apply_h(spfft_transform_type& spfftk__, std::shared_ptr gkvec_fft__, + wf::spin_range spins__, wf::Wave_functions const& phi__, wf::Wave_functions& hphi__, + wf::band_range br__); /// Apply local part of LAPW Hamiltonian and overlap operators. /** \param [in] spfftk SpFFT transform object for G+k vectors. @@ -173,8 +305,9 @@ class Local_operator * * Only plane-wave part of output wave-functions is changed. */ - void apply_h_o(spfft_transform_type& spfftik__, sddk::Gvec_partition const& gkvec_p__, int N__, int n__, - sddk::Wave_functions& phi__, sddk::Wave_functions* hphi__, sddk::Wave_functions* ophi__); + void apply_fplapw(spfft_transform_type& spfftik__, std::shared_ptr gkvec_fft__, + wf::band_range b__, wf::Wave_functions& phi__, wf::Wave_functions* hphi__, + wf::Wave_functions* ophi__, wf::Wave_functions* bzphi__, wf::Wave_functions* bxyphi__); /// Apply magnetic field to the full-potential wave-functions. /** In case of collinear magnetism only Bz is applied to phi and stored in the first component of @@ -182,13 +315,12 @@ class Local_operator * component of bphi. The second component of bphi is used to store -Bz|phi>. * * \param [in] spfftk SpFFT transform object for G+k vectors. - * \param [in] N Starting index of wave-functions. - * \param [in] n Number of wave-functions to which H and O are applied. * \param [in] phi Input wave-functions. * \param [out] bphi Output vector of magentic field components, applied to the wave-functions. + * \param [in] br Range of bands to which B is applied. */ - void apply_b(spfft_transform_type& spfftk__, int N__, int n__, sddk::Wave_functions& phi__, - std::vector>& bphi__); // TODO: align argument order with apply_h() + //void apply_b(spfft_transform_type& spfftk__, wf::Wave_functions const& phi__, + // std::vector>& bphi__, wf::band_range br__); inline T v0(int ispn__) const { diff --git a/src/hamiltonian/non_local_operator.cpp b/src/hamiltonian/non_local_operator.cpp index 8056522e4..46d9cfb90 100644 --- a/src/hamiltonian/non_local_operator.cpp +++ b/src/hamiltonian/non_local_operator.cpp @@ -22,8 +22,6 @@ * \brief Contains implementation of sirius::Non_local_operator class. */ -#include "SDDK/wf_inner.hpp" -#include "SDDK/wf_trans.hpp" #include "non_local_operator.hpp" #include "hubbard/hubbard_matrix.hpp" @@ -336,195 +334,17 @@ Q_operator::initialize() } } -template -void -apply_non_local_d_q(sddk::spin_range spins__, int N__, int n__, Beta_projectors>& beta__, - sddk::Wave_functions>& phi__, D_operator>* d_op__, - sddk::Wave_functions>* hphi__, Q_operator>* q_op__, - sddk::Wave_functions>* sphi__) -{ - - for (int i = 0; i < beta__.num_chunks(); i++) { - /* generate beta-projectors for a block of atoms */ - beta__.generate(i); - - for (int ispn : spins__) { - auto beta_phi = beta__.template inner(i, phi__, ispn, N__, n__); - - if (hphi__ && d_op__) { - /* apply diagonal spin blocks */ - d_op__->apply(i, ispn, *hphi__, N__, n__, beta__, beta_phi); - if (!d_op__->is_diag() && hphi__->num_sc() == 2) { - /* apply non-diagonal spin blocks */ - /* xor 3 operator will map 0 to 3 and 1 to 2 */ - d_op__->apply(i, ispn ^ 3, *hphi__, N__, n__, beta__, beta_phi); - } - } - - if (sphi__ && q_op__) { - /* apply Q operator (diagonal in spin) */ - q_op__->apply(i, ispn, *sphi__, N__, n__, beta__, beta_phi); - if (!q_op__->is_diag() && sphi__->num_sc() == 2) { - q_op__->apply(i, ispn ^ 3, *sphi__, N__, n__, beta__, beta_phi); - } - } - } - } -} - -/// Compute |sphi> = (1 + Q)|phi> -template -void -apply_S_operator(sddk::device_t pu__, sddk::spin_range spins__, int N__, int n__, Beta_projectors>& beta__, - sddk::Wave_functions>& phi__, Q_operator>* q_op__, - sddk::Wave_functions>& sphi__) -{ - for (auto s : spins__) { - sphi__.copy_from(pu__, n__, phi__, s, N__, s, N__); - } - - if (q_op__) { - apply_non_local_d_q(spins__, N__, n__, beta__, phi__, nullptr, nullptr, q_op__, &sphi__); - } -} - -template -void -apply_U_operator(Simulation_context& ctx__, sddk::spin_range spins__, int N__, int n__, sddk::Wave_functions& hub_wf__, - sddk::Wave_functions& phi__, U_operator& um__, sddk::Wave_functions& hphi__) -{ - if (!ctx__.hubbard_correction()) { - return; - } - - sddk::dmatrix> dm(hub_wf__.num_wf(), n__); - if (ctx__.processing_unit() == sddk::device_t::GPU) { - dm.allocate(sddk::memory_t::device); - } - - auto la = sddk::linalg_t::none; - auto mt = sddk::memory_t::none; - switch (ctx__.processing_unit()) { - case sddk::device_t::CPU: { - la = sddk::linalg_t::blas; - mt = sddk::memory_t::host; - break; - } - case sddk::device_t::GPU: { - la = sddk::linalg_t::gpublas; - mt = sddk::memory_t::device; - break; - } - default: - break; - } - /* First calculate the local part of the projections - dm(i, n) = */ - sddk::inner(ctx__.spla_context(), spins__, hub_wf__, 0, hub_wf__.num_wf(), phi__, N__, n__, dm, 0, 0); - - sddk::dmatrix> Up(hub_wf__.num_wf(), n__); - if (ctx__.processing_unit() == sddk::device_t::GPU) { - Up.allocate(sddk::memory_t::device); - } - - if (ctx__.num_mag_dims() == 3) { - Up.zero(); - #pragma omp parallel for schedule(static) - for (int at_lvl = 0; at_lvl < (int)um__.atomic_orbitals().size(); at_lvl++) { - const int ia = um__.atomic_orbitals(at_lvl).first; - auto const& atom = ctx__.unit_cell().atom(ia); - if (atom.type().lo_descriptor_hub(um__.atomic_orbitals(at_lvl).second).use_for_calculation()) { - const int lmax_at = 2 * atom.type().lo_descriptor_hub(um__.atomic_orbitals(at_lvl).second).l() + 1; - // we apply the hubbard correction. For now I have no papers - // giving me the formula for the SO case so I rely on QE for it - // but I do not like it at all - for (int s1 = 0; s1 < ctx__.num_spins(); s1++) { - for (int s2 = 0; s2 < ctx__.num_spins(); s2++) { - // TODO: replace this with matrix matrix multiplication - for (int nbd = 0; nbd < n__; nbd++) { - for (int m1 = 0; m1 < lmax_at; m1++) { - for (int m2 = 0; m2 < lmax_at; m2++) { - const int ind = (s1 == s2) * s1 + (1 + 2 * s2 + s1) * (s1 != s2); - Up(um__.nhwf() * s1 + um__.offset(at_lvl) + m1, nbd) += - um__(um__.offset(at_lvl) + m2, um__.offset(at_lvl) + m1, ind) * - dm(um__.nhwf() * s2 + um__.offset(at_lvl) + m2, nbd); - } - } - } - } - } - } - } - if (ctx__.processing_unit() == sddk::device_t::GPU) { - Up.copy_to(sddk::memory_t::device); - } - } else { - sddk::linalg(la).gemm('N', 'N', um__.nhwf(), n__, um__.nhwf(), &sddk::linalg_const>::one(), - um__.at(mt, 0, 0, spins__()), um__.nhwf(), dm.at(mt, 0, 0), dm.ld(), - &sddk::linalg_const>::zero(), Up.at(mt, 0, 0), Up.ld()); - if (ctx__.processing_unit() == sddk::device_t::GPU) { - Up.copy_to(sddk::memory_t::host); - } - } - transform, std::complex>(ctx__.spla_context(), spins__(), 1.0, {&hub_wf__}, 0, hub_wf__.num_wf(), - Up, 0, 0, 1.0, {&hphi__}, N__, n__); -} - template class Non_local_operator; template class D_operator; template class Q_operator; -template void apply_non_local_d_q(sddk::spin_range spins__, int N__, int n__, Beta_projectors& beta__, - sddk::Wave_functions& phi__, D_operator* d_op__, - sddk::Wave_functions* hphi__, Q_operator* q_op__, - sddk::Wave_functions* sphi__); - -template void apply_non_local_d_q(sddk::spin_range spins__, int N__, int n__, Beta_projectors& beta__, - sddk::Wave_functions& phi__, D_operator* d_op__, - sddk::Wave_functions* hphi__, Q_operator* q_op__, - sddk::Wave_functions* sphi__); - -template void apply_S_operator(sddk::device_t pu__, sddk::spin_range spins__, int N__, int n__, - Beta_projectors& beta__, sddk::Wave_functions& phi__, - Q_operator* q_op__, sddk::Wave_functions& sphi__); - -template void apply_S_operator(sddk::device_t pu__, sddk::spin_range spins__, int N__, int n__, - Beta_projectors& beta__, sddk::Wave_functions& phi__, - Q_operator* q_op__, sddk::Wave_functions& sphi__); - -template void apply_U_operator(Simulation_context& ctx__, sddk::spin_range spins__, int N__, int n__, - sddk::Wave_functions& hub_wf__, sddk::Wave_functions& phi__, - U_operator& um__, sddk::Wave_functions& hphi__); - #if defined(USE_FP32) template class Non_local_operator; template class D_operator; template class Q_operator; - -template void apply_non_local_d_q(sddk::spin_range spins__, int N__, int n__, Beta_projectors& beta__, - sddk::Wave_functions& phi__, D_operator* d_op__, - sddk::Wave_functions* hphi__, Q_operator* q_op__, - sddk::Wave_functions* sphi__); - -template void apply_non_local_d_q>(sddk::spin_range spins__, int N__, int n__, - Beta_projectors& beta__, sddk::Wave_functions& phi__, - D_operator* d_op__, sddk::Wave_functions* hphi__, - Q_operator* q_op__, sddk::Wave_functions* sphi__); - -template void apply_S_operator(sddk::device_t pu__, sddk::spin_range spins__, int N__, int n__, - Beta_projectors& beta__, sddk::Wave_functions& phi__, - Q_operator* q_op__, sddk::Wave_functions& sphi__); - -template void apply_S_operator>(sddk::device_t pu__, sddk::spin_range spins__, int N__, int n__, - Beta_projectors& beta__, sddk::Wave_functions& phi__, - Q_operator* q_op__, sddk::Wave_functions& sphi__); - -template void apply_U_operator(Simulation_context& ctx__, sddk::spin_range spins__, int N__, int n__, - sddk::Wave_functions& hub_wf__, sddk::Wave_functions& phi__, - U_operator& um__, sddk::Wave_functions& hphi__); #endif } // namespace sirius diff --git a/src/hamiltonian/non_local_operator.hpp b/src/hamiltonian/non_local_operator.hpp index 24548aa15..150ed6397 100644 --- a/src/hamiltonian/non_local_operator.hpp +++ b/src/hamiltonian/non_local_operator.hpp @@ -33,12 +33,6 @@ #include "context/simulation_context.hpp" #include "hubbard/hubbard_matrix.hpp" -namespace sddk { -template -class Wave_functions; -class spin_range; -}; // namespace sddk - namespace sirius { /* forward declaration */ template @@ -77,9 +71,12 @@ class Non_local_operator Non_local_operator(Simulation_context const& ctx__); /// Apply chunk of beta-projectors to all wave functions. - template ::value, bool> = true> - void apply(int chunk__, int ispn_block__, sddk::Wave_functions& op_phi__, int idx0__, int n__, - Beta_projectors_base& beta__, sddk::matrix& beta_phi__) + /** \tparam F Type of the subspace matrix + */ + template + void + apply(sddk::memory_t mem__, int chunk__, int ispn_block__, wf::Wave_functions& op_phi__, wf::band_range br__, + Beta_projectors_base const& beta__, sddk::matrix const& beta_phi__) const { PROFILE("sirius::Non_local_operator::apply"); @@ -87,108 +84,24 @@ class Non_local_operator return; } - auto& beta_gk = beta__.pw_coeffs_a(); - int num_gkvec_loc = beta__.num_gkvec_loc(); - int nbeta = beta__.chunk(chunk__).num_beta_; + auto const& beta_gk = beta__.pw_coeffs_a(); + int num_gkvec_loc = beta__.num_gkvec_loc(); + int nbeta = beta__.chunk(chunk__).num_beta_; /* setup linear algebra parameters */ - sddk::memory_t mem{sddk::memory_t::none}; - sddk::linalg_t la{sddk::linalg_t::none}; - switch (pu_) { - case sddk::device_t::CPU: { - mem = sddk::memory_t::host; - la = sddk::linalg_t::blas; - break; - } - case sddk::device_t::GPU: { - mem = sddk::memory_t::device; - la = sddk::linalg_t::gpublas; - break; - } + sddk::linalg_t la{sddk::linalg_t::blas}; + sddk::device_t pu{sddk::device_t::CPU}; + if (is_device_memory(mem__)) { + la = sddk::linalg_t::gpublas; + pu = sddk::device_t::GPU; } - auto work = sddk::mdarray(nbeta * n__, ctx_.mem_pool(mem)); - - /* compute O * for atoms in a chunk */ - #pragma omp parallel for - for (int i = 0; i < beta__.chunk(chunk__).num_atoms_; i++) { - /* number of beta functions for a given atom */ - int nbf = beta__.chunk(chunk__).desc_(static_cast(beta_desc_idx::nbf), i); - int offs = beta__.chunk(chunk__).desc_(static_cast(beta_desc_idx::offset), i); - int ia = beta__.chunk(chunk__).desc_(static_cast(beta_desc_idx::ia), i); - - if (nbf == 0) { - continue; - } - sddk::linalg(la).gemm('N', 'N', nbf, n__, nbf, &sddk::linalg_const::one(), - op_.at(mem, 0, packed_mtrx_offset_(ia), ispn_block__), nbf, beta_phi__.at(mem, offs, 0), - beta_phi__.ld(), &sddk::linalg_const::zero(), work.at(mem, offs), nbeta, - stream_id(omp_get_thread_num())); - } - switch (pu_) { - case sddk::device_t::GPU: { - /* wait for previous zgemms */ - #pragma omp parallel - acc::sync_stream(stream_id(omp_get_thread_num())); - break; - } - case sddk::device_t::CPU: { - break; - } + int size_factor = 1; + if (std::is_same>::value) { + size_factor = 2; } - int jspn = ispn_block__ & 1; - - /* compute * O * and add to op_phi */ - sddk::linalg(ctx_.blas_linalg_t()) - .gemm('N', 'N', 2 * num_gkvec_loc, n__, nbeta, &sddk::linalg_const::one(), - reinterpret_cast(beta_gk.at(mem)), 2 * num_gkvec_loc, work.at(mem), nbeta, - &sddk::linalg_const::one(), - reinterpret_cast(op_phi__.pw_coeffs(jspn).prime().at(op_phi__.preferred_memory_t(), 0, idx0__)), - 2 * op_phi__.pw_coeffs(jspn).prime().ld()); - - switch (pu_) { - case sddk::device_t::GPU: { - acc::sync_stream(stream_id(-1)); - break; - } - case sddk::device_t::CPU: { - break; - } - } - } - - template , F>::value, bool> = true> - void apply(int chunk__, int ispn_block__, sddk::Wave_functions& op_phi__, int idx0__, int n__, - Beta_projectors_base& beta__, sddk::matrix& beta_phi__) - { - PROFILE("sirius::Non_local_operator::apply"); - - if (is_null_) { - return; - } - - auto& beta_gk = beta__.pw_coeffs_a(); - int num_gkvec_loc = beta__.num_gkvec_loc(); - int nbeta = beta__.chunk(chunk__).num_beta_; - - /* setup linear algebra parameters */ - sddk::memory_t mem{sddk::memory_t::none}; - sddk::linalg_t la{sddk::linalg_t::none}; - switch (pu_) { - case sddk::device_t::CPU: { - mem = sddk::memory_t::host; - la = sddk::linalg_t::blas; - break; - } - case sddk::device_t::GPU: { - mem = sddk::memory_t::device; - la = sddk::linalg_t::gpublas; - break; - } - } - - auto work = sddk::mdarray, 1>(nbeta * n__, ctx_.mem_pool(mem)); + auto work = sddk::mdarray(nbeta, br__.size(), get_memory_pool(mem__)); /* compute O * for atoms in a chunk */ #pragma omp parallel @@ -198,20 +111,21 @@ class Non_local_operator #pragma omp for for (int i = 0; i < beta__.chunk(chunk__).num_atoms_; i++) { /* number of beta functions for a given atom */ - int nbf = beta__.chunk(chunk__).desc_(static_cast(beta_desc_idx::nbf), i); - int offs = beta__.chunk(chunk__).desc_(static_cast(beta_desc_idx::offset), i); - int ia = beta__.chunk(chunk__).desc_(static_cast(beta_desc_idx::ia), i); + int nbf = beta__.chunk(chunk__).desc_(beta_desc_idx::nbf, i); + int offs = beta__.chunk(chunk__).desc_(beta_desc_idx::offset, i); + int ia = beta__.chunk(chunk__).desc_(beta_desc_idx::ia, i); if (nbf) { sddk::linalg(la).gemm( - 'N', 'N', nbf, n__, nbf, &sddk::linalg_const>::one(), - reinterpret_cast*>(op_.at(mem, 0, packed_mtrx_offset_(ia), ispn_block__)), nbf, - beta_phi__.at(mem, offs, 0), beta_phi__.ld(), &sddk::linalg_const>::zero(), - work.at(mem, offs), nbeta, stream_id(omp_get_thread_num())); + 'N', 'N', nbf, br__.size(), nbf, &sddk::linalg_const::one(), + reinterpret_cast(op_.at(mem__, 0, packed_mtrx_offset_(ia), ispn_block__)), nbf, + reinterpret_cast(beta_phi__.at(mem__, offs, 0)), beta_phi__.ld(), + &sddk::linalg_const::zero(), + reinterpret_cast(work.at(mem__, offs, 0)), nbeta, stream_id(omp_get_thread_num())); } } } - switch (pu_) { + switch (pu) { // TODO: check if this is needed. Null stream later should sync the streams. case sddk::device_t::GPU: { /* wait for previous zgemms */ #pragma omp parallel @@ -223,16 +137,17 @@ class Non_local_operator } } - int jspn = ispn_block__ & 1; + auto sp = op_phi__.actual_spin_index(wf::spin_index(ispn_block__ & 1)); /* compute * O * and add to op_phi */ - sddk::linalg(ctx_.blas_linalg_t()) - .gemm('N', 'N', num_gkvec_loc, n__, nbeta, &sddk::linalg_const>::one(), beta_gk.at(mem), - num_gkvec_loc, work.at(mem), nbeta, &sddk::linalg_const>::one(), - op_phi__.pw_coeffs(jspn).prime().at(op_phi__.preferred_memory_t(), 0, idx0__), - op_phi__.pw_coeffs(jspn).prime().ld()); - - switch (pu_) { + sddk::linalg(la) + .gemm('N', 'N', num_gkvec_loc * size_factor, br__.size(), nbeta, &sddk::linalg_const::one(), + reinterpret_cast(beta_gk.at(mem__)), num_gkvec_loc * size_factor, + work.at(mem__), nbeta, &sddk::linalg_const::one(), + reinterpret_cast(op_phi__.at(mem__, 0, sp, wf::band_index(br__.begin()))), + op_phi__.ld() * size_factor); + + switch (pu) { case sddk::device_t::GPU: { acc::sync_stream(stream_id(-1)); break; @@ -244,9 +159,10 @@ class Non_local_operator } /// Apply beta projectors from one atom in a chunk of beta projectors to all wave-functions. - template , F>::value, bool> = true> - void apply(int chunk__, int ia__, int ispn_block__, sddk::Wave_functions& op_phi__, int idx0__, int n__, - Beta_projectors_base& beta__, sddk::matrix& beta_phi__) + template + std::enable_if_t, F>::value, void> + apply(sddk::memory_t mem__, int chunk__, wf::atom_index ia__, int ispn_block__, wf::Wave_functions& op_phi__, + wf::band_range br__, Beta_projectors_base& beta__, sddk::matrix& beta_phi__) { if (is_null_) { return; @@ -255,46 +171,37 @@ class Non_local_operator auto& beta_gk = beta__.pw_coeffs_a(); int num_gkvec_loc = beta__.num_gkvec_loc(); - int nbf = beta__.chunk(chunk__).desc_(static_cast(beta_desc_idx::nbf), ia__); - int offs = beta__.chunk(chunk__).desc_(static_cast(beta_desc_idx::offset), ia__); - int ia = beta__.chunk(chunk__).desc_(static_cast(beta_desc_idx::ia), ia__); + int nbf = beta__.chunk(chunk__).desc_(beta_desc_idx::nbf, ia__.get()); + int offs = beta__.chunk(chunk__).desc_(beta_desc_idx::offset, ia__.get()); + int ia = beta__.chunk(chunk__).desc_(beta_desc_idx::ia, ia__.get()); if (nbf == 0) { return; } - /* setup linear algebra parameters */ - sddk::memory_t mem{sddk::memory_t::none}; - sddk::linalg_t la{sddk::linalg_t::none}; - - switch (pu_) { - case sddk::device_t::CPU: { - mem = sddk::memory_t::host; - la = sddk::linalg_t::blas; - break; - } - case sddk::device_t::GPU: { - mem = sddk::memory_t::device; - la = sddk::linalg_t::gpublas; - break; - } + sddk::linalg_t la{sddk::linalg_t::blas}; + sddk::device_t pu{sddk::device_t::CPU}; + if (is_device_memory(mem__)) { + la = sddk::linalg_t::gpublas; + pu = sddk::device_t::GPU; } - auto work = sddk::mdarray, 1>(nbf * n__, ctx_.mem_pool(mem)); + auto work = sddk::mdarray, 1>(nbf * br__.size(), get_memory_pool(mem__)); - sddk::linalg(la).gemm('N', 'N', nbf, n__, nbf, &sddk::linalg_const>::one(), - reinterpret_cast*>(op_.at(mem, 0, packed_mtrx_offset_(ia), ispn_block__)), nbf, - beta_phi__.at(mem, offs, 0), beta_phi__.ld(), &sddk::linalg_const>::zero(), - work.at(mem), nbf); + sddk::linalg(la).gemm('N', 'N', nbf, br__.size(), nbf, &sddk::linalg_const>::one(), + reinterpret_cast*>(op_.at(mem__, 0, packed_mtrx_offset_(ia), ispn_block__)), nbf, + beta_phi__.at(mem__, offs, 0), beta_phi__.ld(), &sddk::linalg_const>::zero(), + work.at(mem__), nbf); int jspn = ispn_block__ & 1; - sddk::linalg(ctx_.blas_linalg_t()) - .gemm('N', 'N', num_gkvec_loc, n__, nbf, &sddk::linalg_const>::one(), beta_gk.at(mem, 0, offs), - num_gkvec_loc, work.at(mem), nbf, &sddk::linalg_const>::one(), - op_phi__.pw_coeffs(jspn).prime().at(op_phi__.preferred_memory_t(), 0, idx0__), - op_phi__.pw_coeffs(jspn).prime().ld()); - switch (pu_) { + sddk::linalg(la) + .gemm('N', 'N', num_gkvec_loc, br__.size(), nbf, &sddk::linalg_const>::one(), + beta_gk.at(mem__, 0, offs), num_gkvec_loc, work.at(mem__), nbf, &sddk::linalg_const>::one(), + op_phi__.at(mem__, 0, wf::spin_index(jspn), wf::band_index(br__.begin())), + op_phi__.ld()); + + switch (pu) { case sddk::device_t::CPU: { break; } @@ -433,7 +340,7 @@ class U_operator utils::print_checksum("um" + std::to_string(is), um_[is].checksum(r.first, r.first), RTE_OUT(ctx_.out())); } if (ctx_.processing_unit() == sddk::device_t::GPU) { - um_[is].allocate(ctx_.mem_pool(sddk::memory_t::device)).copy_to(sddk::memory_t::device); + um_[is].allocate(get_memory_pool(sddk::memory_t::device)).copy_to(sddk::memory_t::device); } } } @@ -536,38 +443,159 @@ class U_operator * \param [in] q_op Pointer to Q-operator. * \param [out] sphi Resulting |beta>Q */ -template -void apply_non_local_d_q(sddk::spin_range spins__, int N__, int n__, Beta_projectors>& beta__, - sddk::Wave_functions>& phi__, D_operator>* d_op__, - sddk::Wave_functions>* hphi__, Q_operator>* q_op__, - sddk::Wave_functions>* sphi__); +//template +//void apply_non_local_d_q(sddk::spin_range spins__, int N__, int n__, Beta_projectors>& beta__, +// sddk::Wave_functions>& phi__, D_operator>* d_op__, +// sddk::Wave_functions>* hphi__, Q_operator>* q_op__, +// sddk::Wave_functions>* sphi__); + +/** \tparam T Precision of the wave-functions. + * \tparam F Type of the subspace. + **/ +template +void +apply_non_local_D_Q(sddk::memory_t mem__, wf::spin_range spins__, wf::band_range br__, Beta_projectors& beta__, + wf::Wave_functions const& phi__, D_operator const* d_op__, wf::Wave_functions* hphi__, + Q_operator const* q_op__, wf::Wave_functions* sphi__) +{ + for (int i = 0; i < beta__.num_chunks(); i++) { + /* generate beta-projectors for a block of atoms */ + beta__.generate(mem__, i); + + for (auto s = spins__.begin(); s != spins__.end(); s++) { + auto sp = phi__.actual_spin_index(s); + auto beta_phi = beta__.template inner(mem__, i, phi__, sp, br__); + + if (hphi__ && d_op__) { + /* apply diagonal spin blocks */ + d_op__->apply(mem__, i, s.get(), *hphi__, br__, beta__, beta_phi); + if (!d_op__->is_diag() && hphi__->num_md() == wf::num_mag_dims(3)) { + /* apply non-diagonal spin blocks */ + /* xor 3 operator will map 0 to 3 and 1 to 2 */ + d_op__->apply(mem__, i, s.get() ^ 3, *hphi__, br__, beta__, beta_phi); + } + } -template -void apply_S_operator(sddk::device_t pu__, sddk::spin_range spins__, int N__, int n__, - Beta_projectors>& beta__, sddk::Wave_functions>& phi__, - Q_operator>* q_op__, sddk::Wave_functions>& sphi__); + if (sphi__ && q_op__) { + /* apply Q operator (diagonal in spin) */ + q_op__->apply(mem__, i, s.get(), *sphi__, br__, beta__, beta_phi); + if (!q_op__->is_diag() && sphi__->num_md() == wf::num_mag_dims(3)) { + q_op__->apply(mem__, i, s.get() ^ 3, *sphi__, br__, beta__, beta_phi); + } + } + } + } +} + +/// Compute |sphi> = (1 + Q)|phi> +template +void apply_S_operator(sddk::memory_t mem__, wf::spin_range spins__, wf::band_range br__, + Beta_projectors& beta__, wf::Wave_functions const& phi__, + Q_operator const* q_op__, wf::Wave_functions& sphi__) +{ + for (auto s = spins__.begin(); s != spins__.end(); s++) { + wf::copy(mem__, phi__, s, br__, sphi__, s, br__); + } + + if (q_op__) { + apply_non_local_D_Q(mem__, spins__, br__, beta__, phi__, nullptr, nullptr, q_op__, &sphi__); + } +} +/** Apply Hubbard U correction + * \tparam T Precision type of wave-functions (flat or double). + * \param [in] hub_wf Hubbard atomic wave-functions. + * \param [in] phi Set of wave-functions to which Hubbard correction is applied. + * \param [out] hphi Output wave-functions to which the result is added. + */ template -void apply_U_operator(Simulation_context& ctx__, sddk::spin_range spins__, int N__, int n__, - sddk::Wave_functions& hub_wf__, sddk::Wave_functions& phi__, U_operator& um__, sddk::Wave_functions& hphi__); +void +apply_U_operator(Simulation_context& ctx__, wf::spin_range spins__, wf::band_range br__, + wf::Wave_functions const& hub_wf__, wf::Wave_functions const& phi__, U_operator& um__, + wf::Wave_functions& hphi__) +{ + if (!ctx__.hubbard_correction()) { + return; + } + + sddk::dmatrix> dm(hub_wf__.num_wf().get(), br__.size()); + + auto mt = ctx__.processing_unit_memory_t(); + auto la = sddk::linalg_t::blas; + if (is_device_memory(mt)) { + la = sddk::linalg_t::gpublas; + dm.allocate(mt); + } + + /* First calculate the local part of the projections + dm(i, n) = */ + wf::inner(ctx__.spla_context(), mt, spins__, hub_wf__, wf::band_range(0, hub_wf__.num_wf().get()), phi__, br__, dm, 0, 0); + + sddk::dmatrix> Up(hub_wf__.num_wf().get(), br__.size()); + if (is_device_memory(mt)) { + Up.allocate(mt); + } + + if (ctx__.num_mag_dims() == 3) { + Up.zero(); + #pragma omp parallel for schedule(static) + for (int at_lvl = 0; at_lvl < (int)um__.atomic_orbitals().size(); at_lvl++) { + const int ia = um__.atomic_orbitals(at_lvl).first; + auto const& atom = ctx__.unit_cell().atom(ia); + if (atom.type().lo_descriptor_hub(um__.atomic_orbitals(at_lvl).second).use_for_calculation()) { + const int lmax_at = 2 * atom.type().lo_descriptor_hub(um__.atomic_orbitals(at_lvl).second).l() + 1; + // we apply the hubbard correction. For now I have no papers + // giving me the formula for the SO case so I rely on QE for it + // but I do not like it at all + for (int s1 = 0; s1 < ctx__.num_spins(); s1++) { + for (int s2 = 0; s2 < ctx__.num_spins(); s2++) { + // TODO: replace this with matrix matrix multiplication + for (int nbd = 0; nbd < br__.size(); nbd++) { + for (int m1 = 0; m1 < lmax_at; m1++) { + for (int m2 = 0; m2 < lmax_at; m2++) { + const int ind = (s1 == s2) * s1 + (1 + 2 * s2 + s1) * (s1 != s2); + Up(um__.nhwf() * s1 + um__.offset(at_lvl) + m1, nbd) += + um__(um__.offset(at_lvl) + m2, um__.offset(at_lvl) + m1, ind) * + dm(um__.nhwf() * s2 + um__.offset(at_lvl) + m2, nbd); + } + } + } + } + } + } + } + } else { + sddk::linalg(la).gemm('N', 'N', um__.nhwf(), br__.size(), um__.nhwf(), + &sddk::linalg_const>::one(), um__.at(mt, 0, 0, spins__.begin().get()), um__.nhwf(), + dm.at(mt, 0, 0), dm.ld(), &sddk::linalg_const>::zero(), Up.at(mt, 0, 0), Up.ld()); + if (is_device_memory(mt)) { + Up.copy_to(sddk::memory_t::host); + } + } + for (auto s = spins__.begin(); s != spins__.end(); s++) { + auto sp = hub_wf__.actual_spin_index(s); + wf::transform(ctx__.spla_context(), mt, Up, 0, 0, 1.0, hub_wf__, sp, wf::band_range(0, hub_wf__.num_wf().get()), + 1.0, hphi__, sp, br__); + } +} /// Apply strain derivative of S-operator to all scalar functions. inline void -apply_S_operator_strain_deriv(sddk::device_t pu__, int comp__, Beta_projectors& bp__, - Beta_projectors_strain_deriv& bp_strain_deriv__, sddk::Wave_functions& phi__, - Q_operator& q_op__, sddk::Wave_functions& ds_phi__) +apply_S_operator_strain_deriv(sddk::memory_t mem__, int comp__, Beta_projectors& bp__, + Beta_projectors_strain_deriv& bp_strain_deriv__, wf::Wave_functions& phi__, + Q_operator& q_op__, wf::Wave_functions& ds_phi__) { RTE_ASSERT(ds_phi__.num_wf() == phi__.num_wf()); - //ds_phi__.zero(pu__); for (int ichunk = 0; ichunk < bp__.num_chunks(); ichunk++) { /* generate beta-projectors for a block of atoms */ - bp__.generate(ichunk); + bp__.generate(mem__, ichunk); /* generate derived beta-projectors for a block of atoms */ - bp_strain_deriv__.generate(ichunk, comp__); - auto dbeta_phi = bp_strain_deriv__.inner(ichunk, phi__, 0, 0, phi__.num_wf()); - auto beta_phi = bp__.inner(ichunk, phi__, 0, 0, phi__.num_wf()); - q_op__.apply(ichunk, 0, ds_phi__, 0, ds_phi__.num_wf(), bp__, dbeta_phi); - q_op__.apply(ichunk, 0, ds_phi__, 0, ds_phi__.num_wf(), bp_strain_deriv__, beta_phi); + bp_strain_deriv__.generate(mem__, ichunk, comp__); + auto dbeta_phi = bp_strain_deriv__.inner(mem__, ichunk, phi__, wf::spin_index(0), + wf::band_range(0, phi__.num_wf().get())); + auto beta_phi = bp__.inner(mem__, ichunk, phi__, wf::spin_index(0), wf::band_range(0, phi__.num_wf().get())); + q_op__.apply(mem__, ichunk, 0, ds_phi__, wf::band_range(0, ds_phi__.num_wf().get()), bp__, dbeta_phi); + q_op__.apply(mem__, ichunk, 0, ds_phi__, wf::band_range(0, ds_phi__.num_wf().get()), bp_strain_deriv__, beta_phi); } } diff --git a/src/hubbard/hubbard_occupancies_derivatives.cpp b/src/hubbard/hubbard_occupancies_derivatives.cpp index f40a2998e..1694949e0 100644 --- a/src/hubbard/hubbard_occupancies_derivatives.cpp +++ b/src/hubbard/hubbard_occupancies_derivatives.cpp @@ -32,8 +32,6 @@ */ #include "hubbard.hpp" -#include "SDDK/wf_inner.hpp" -#include "SDDK/wf_trans.hpp" #include "symmetry/crystal_symmetry.hpp" #include "linalg/inverse_sqrt.hpp" #include "geometry/wavefunction_strain_deriv.hpp" @@ -152,21 +150,20 @@ Hubbard::compute_occupancies_derivatives(K_point& kp__, Q_operator& kp__, Q_operator>> evec_O; std::vector eval_O; if (ctx_.cfg().hubbard().full_orthogonalization()) { - ovlp = sddk::dmatrix>(phi_atomic.num_wf(), phi_atomic.num_wf()); - sddk::inner(ctx_.spla_context(), sddk::spin_range(0), phi_atomic, 0, phi_atomic.num_wf(), - phi_atomic_S, 0, phi_atomic_S.num_wf(), ovlp, 0, 0); + ovlp = sddk::dmatrix>(nawf, nawf); + wf::inner(ctx_.spla_context(), mt, wf::spin_range(0), phi_atomic, wf::band_range(0, nawf), + phi_atomic_S, wf::band_range(0, nawf), ovlp, 0, 0); /* a tuple of O^{-1/2}, U, \lambda */ - auto result = inverse_sqrt(ovlp, phi_atomic.num_wf()); + auto result = inverse_sqrt(ovlp, nawf); inv_sqrt_O = std::move(std::get<0>(result)); evec_O = std::move(std::get<1>(result)); eval_O = std::get<2>(result); @@ -190,18 +187,17 @@ Hubbard::compute_occupancies_derivatives(K_point& kp__, Q_operator, 2> psi_s_phi_hub; for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { - psi_s_phi_hub[ispn] = sddk::dmatrix(kp__.num_occupied_bands(ispn), phi_hub_S.num_wf()); - if (ctx_.processing_unit() == sddk::device_t::GPU) { - psi_s_phi_hub[ispn].allocate(ctx_.mem_pool(sddk::memory_t::device)); - } - inner(ctx_.spla_context(), sddk::spin_range(ispn), kp__.spinor_wave_functions(), 0, kp__.num_occupied_bands(ispn), - phi_hub_S, 0, phi_hub_S.num_wf(), psi_s_phi_hub[ispn], 0, 0); + psi_s_phi_hub[ispn] = sddk::dmatrix(kp__.num_occupied_bands(ispn), nhwf); + wf::inner(ctx_.spla_context(), mt, wf::spin_range(ispn), kp__.spinor_wave_functions(), + wf::band_range(0, kp__.num_occupied_bands(ispn)), kp__.hubbard_wave_functions_S(), + wf::band_range(0, nhwf), psi_s_phi_hub[ispn], 0, 0); } /* temporary storage */ - sddk::Wave_functions phi_atomic_tmp(kp__.gkvec_partition(), phi_atomic.num_wf(), ctx_.preferred_memory_t(), 1); - - sddk::Wave_functions s_phi_atomic_tmp(kp__.gkvec_partition(), phi_atomic.num_wf(), ctx_.preferred_memory_t(), 1); + auto phi_atomic_tmp = wave_function_factory(ctx_, kp__, phi_atomic.num_wf(), wf::num_mag_dims(0), false); + auto s_phi_atomic_tmp = wave_function_factory(ctx_, kp__, phi_atomic_S.num_wf(), wf::num_mag_dims(0), false); + auto mg1 = phi_atomic_tmp->memory_guard(mt); + auto mg2 = s_phi_atomic_tmp->memory_guard(mt); /* compute < d phi_atomic / d r_{j} | S | psi_{ik} > and < d phi_atomic / d r_{j} | S | phi_atomic > */ std::array, 2>, 3> grad_phi_atomic_s_psi; @@ -209,38 +205,37 @@ Hubbard::compute_occupancies_derivatives(K_point& kp__, Q_operator = |d phi_atomic / d r_{alpha} > for all atoms */ - for (int i = 0; i < phi_atomic.num_wf(); i++) { + for (int i = 0; i < nawf; i++) { for (int igloc = 0; igloc < kp__.num_gkvec_loc(); igloc++) { /* G+k vector in Cartesian coordinates */ auto gk = kp__.gkvec().template gkvec_cart(igloc); /* gradient of phi_atomic */ - phi_atomic_tmp.pw_coeffs(0).prime(igloc, i) = std::complex(0.0, -gk[x]) * - phi_atomic.pw_coeffs(0).prime(igloc, i); + phi_atomic_tmp->pw_coeffs(igloc, wf::spin_index(0), wf::band_index(i)) = std::complex(0.0, -gk[x]) * + phi_atomic.pw_coeffs(igloc, wf::spin_index(0), wf::band_index(i)); } } - if (ctx_.processing_unit() == sddk::device_t::GPU) { - phi_atomic_tmp.prepare(sddk::spin_range(0), true, &ctx_.mem_pool(sddk::memory_t::device)); - s_phi_atomic_tmp.prepare(sddk::spin_range(0), false, &ctx_.mem_pool(sddk::memory_t::device)); + if (is_device_memory(mt)) { + phi_atomic_tmp->copy_to(mt); } /* apply S to |d phi_atomic / d r_{alpha} > */ - apply_S_operator>(ctx_.processing_unit(), sddk::spin_range(0), 0, phi_atomic_tmp.num_wf(), - kp__.beta_projectors(), phi_atomic_tmp, &q_op__, s_phi_atomic_tmp); + apply_S_operator>(mt, wf::spin_range(0), + wf::band_range(0, nawf), kp__.beta_projectors(), *phi_atomic_tmp, &q_op__, *s_phi_atomic_tmp); /* compute < d phi_atomic / d r_{alpha} | S | phi_atomic > * used to compute derivative of the inverse square root of the overlap matrix */ if (ctx_.cfg().hubbard().full_orthogonalization()) { - grad_phi_atomic_s_phi_atomic[x] = sddk::dmatrix(s_phi_atomic_tmp.num_wf(), phi_atomic.num_wf()); - inner(ctx_.spla_context(), sddk::spin_range(0), s_phi_atomic_tmp, 0, s_phi_atomic_tmp.num_wf(), - phi_atomic, 0, phi_atomic.num_wf(), grad_phi_atomic_s_phi_atomic[x], 0, 0); + grad_phi_atomic_s_phi_atomic[x] = sddk::dmatrix(nawf, nawf); + wf::inner(ctx_.spla_context(), mt, wf::spin_range(0), *s_phi_atomic_tmp, + wf::band_range(0, nawf), phi_atomic, wf::band_range(0, nawf), grad_phi_atomic_s_phi_atomic[x], 0, 0); } for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { /* allocate space */ - grad_phi_atomic_s_psi[x][ispn] = - sddk::dmatrix(s_phi_atomic_tmp.num_wf(), kp__.num_occupied_bands(ispn)); + grad_phi_atomic_s_psi[x][ispn] = sddk::dmatrix(nawf, kp__.num_occupied_bands(ispn)); /* compute < d phi_atomic / d r_{j} | S | psi_{ik} > for all atoms */ - inner(ctx_.spla_context(), sddk::spin_range(ispn), s_phi_atomic_tmp, 0, s_phi_atomic_tmp.num_wf(), - kp__.spinor_wave_functions(), 0, kp__.num_occupied_bands(ispn), grad_phi_atomic_s_psi[x][ispn], 0, 0); + wf::inner(ctx_.spla_context(), mt, wf::spin_range(ispn), *s_phi_atomic_tmp, + wf::band_range(0, nawf), kp__.spinor_wave_functions(), + wf::band_range(0, kp__.num_occupied_bands(ispn)), grad_phi_atomic_s_psi[x][ispn], 0, 0); } } @@ -248,10 +243,11 @@ Hubbard::compute_occupancies_derivatives(K_point& kp__, Q_operator, 2> phi_atomic_s_psi; if (ctx_.cfg().hubbard().full_orthogonalization()) { for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { - phi_atomic_s_psi[ispn] = sddk::dmatrix(phi_atomic_S.num_wf(), kp__.num_occupied_bands(ispn)); + phi_atomic_s_psi[ispn] = sddk::dmatrix(nawf, kp__.num_occupied_bands(ispn)); /* compute < phi_atomic | S | psi_{ik} > for all atoms */ - inner(ctx_.spla_context(), sddk::spin_range(ispn), phi_atomic_S, 0, phi_atomic_S.num_wf(), - kp__.spinor_wave_functions(), 0, kp__.num_occupied_bands(ispn), phi_atomic_s_psi[ispn], 0, 0); + wf::inner(ctx_.spla_context(), mt, wf::spin_range(ispn), phi_atomic_S, + wf::band_range(0, nawf), kp__.spinor_wave_functions(), + wf::band_range(0, kp__.num_occupied_bands(ispn)), phi_atomic_s_psi[ispn], 0, 0); } } @@ -261,30 +257,33 @@ Hubbard::compute_occupancies_derivatives(K_point& kp__, Q_operator for this chunk */ - auto beta_phi_atomic = kp__.beta_projectors().inner(ichunk, phi_atomic, 0, 0, phi_atomic.num_wf()); + auto beta_phi_atomic = kp__.beta_projectors().inner(mt, ichunk, phi_atomic, wf::spin_index(0), + wf::band_range(0, nawf)); for (int x = 0; x < 3; x++) { - bp_grad.generate(ichunk, x); + bp_grad.generate(mt, ichunk, x); /* for this chunk */ - auto grad_beta_phi_atomic = bp_grad.inner(ichunk, phi_atomic, 0, 0, phi_atomic.num_wf()); + auto grad_beta_phi_atomic = bp_grad.inner(mt, ichunk, phi_atomic, wf::spin_index(0), + wf::band_range(0, nawf)); for (int i = 0; i < kp__.beta_projectors().chunk(ichunk).num_atoms_; i++) { /* this is a displacement atom */ - int ja = kp__.beta_projectors().chunk(ichunk).desc_(static_cast(beta_desc_idx::ia), i); + int ja = kp__.beta_projectors().chunk(ichunk).desc_(beta_desc_idx::ia, i); /* build |phi_atomic_tmp> = | d S / d r_{j} | phi_atomic > */ /* it consists of two contributions: * | beta > Q < d beta / dr | phi_atomic > and * | d beta / dr > Q < beta | phi_atomic > */ - phi_atomic_tmp.zero(ctx_.processing_unit()); + phi_atomic_tmp->zero(mt, wf::spin_index(0), wf::band_range(0, nawf)); if (ctx_.unit_cell().atom(ja).type().augment()) { - q_op__.apply(ichunk, i, 0, phi_atomic_tmp, 0, phi_atomic_tmp.num_wf(), bp_grad, beta_phi_atomic); - q_op__.apply(ichunk, i, 0, phi_atomic_tmp, 0, phi_atomic_tmp.num_wf(), kp__.beta_projectors(), - grad_beta_phi_atomic); + q_op__.apply(mt, ichunk, wf::atom_index(i), 0, *phi_atomic_tmp, wf::band_range(0, nawf), + bp_grad, beta_phi_atomic); + q_op__.apply(mt, ichunk, wf::atom_index(i), 0, *phi_atomic_tmp, wf::band_range(0, nawf), + kp__.beta_projectors(), grad_beta_phi_atomic); } /* compute O' = d O / d r_{alpha} */ @@ -293,14 +292,14 @@ Hubbard::compute_occupancies_derivatives(K_point& kp__, Q_operator */ - sddk::inner(ctx_.spla_context(), sddk::spin_range(0), phi_atomic, 0, phi_atomic.num_wf(), - phi_atomic_tmp, 0, phi_atomic_tmp.num_wf(), ovlp, 0, 0); + wf::inner(ctx_.spla_context(), mt, wf::spin_range(0), phi_atomic, + wf::band_range(0, nawf), *phi_atomic_tmp, wf::band_range(0, nawf), ovlp, 0, 0); /* add and */ /* |phi' > = d|phi> / d r_{alpha} which is non-zero for a current displacement atom only */ auto& type = ctx_.unit_cell().atom(ja).type(); for (int xi = 0; xi < type.indexb_wfs().size(); xi++) { int i = num_ps_atomic_wf.second[ja] + xi; - for (int j = 0; j < phi_atomic.num_wf(); j++) { + for (int j = 0; j < nawf; j++) { ovlp(i, j) += grad_phi_atomic_s_phi_atomic[x](i, j); ovlp(j, i) += std::conj(grad_phi_atomic_s_phi_atomic[x](i, j)); } @@ -310,9 +309,10 @@ Hubbard::compute_occupancies_derivatives(K_point& kp__, Q_operator */ - sddk::dmatrix phi_atomic_ds_psi(phi_atomic_tmp.num_wf(), kp__.num_occupied_bands(ispn)); - inner(ctx_.spla_context(), sddk::spin_range(ispn), phi_atomic_tmp, 0, phi_atomic_tmp.num_wf(), - kp__.spinor_wave_functions(), 0, kp__.num_occupied_bands(ispn), phi_atomic_ds_psi, 0, 0); + sddk::dmatrix phi_atomic_ds_psi(nawf, kp__.num_occupied_bands(ispn)); + wf::inner(ctx_.spla_context(), mt, wf::spin_range(ispn), *phi_atomic_tmp, + wf::band_range(0, nawf), kp__.spinor_wave_functions(), + wf::band_range(0, kp__.num_occupied_bands(ispn)), phi_atomic_ds_psi, 0, 0); /* add which is diagonal (in atom index) */ for (int ibnd = 0; ibnd < kp__.num_occupied_bands(ispn); ibnd++) { @@ -337,7 +337,8 @@ Hubbard::compute_occupancies_derivatives(K_point& kp__, Q_operator& kp__, Q_operator& kp__, Q_operator& q_op__, sddk::mdarray, 4>& dn__) { @@ -410,39 +405,30 @@ Hubbard::compute_occupancies_stress_derivatives(K_point& kp__, Q_operato auto& phi_atomic_S = kp__.atomic_wave_functions_S(); auto& phi_hub_S = kp__.hubbard_wave_functions_S(); - /* total number of atomic wave-functions */ - int nawf = phi_atomic.num_wf(); - auto num_ps_atomic_wf = ctx_.unit_cell().num_ps_atomic_wf(); auto num_hubbard_wf = ctx_.unit_cell().num_hubbard_wf(); - sddk::Wave_functions dphi_atomic(kp__.gkvec_partition(), nawf, ctx_.preferred_memory_t(), 1); - sddk::Wave_functions s_dphi_atomic(kp__.gkvec_partition(), nawf, ctx_.preferred_memory_t(), 1); - sddk::Wave_functions ds_phi_atomic(kp__.gkvec_partition(), nawf, ctx_.preferred_memory_t(), 1); + /* number of atomic wave-functions */ + int nawf = num_ps_atomic_wf.first; + /* number of Hubbard wave-functions */ + int nhwf = num_hubbard_wf.first; - if (ctx_.processing_unit() == sddk::device_t::GPU) { - dn__.allocate(sddk::memory_t::device); - dn__.copy_to(sddk::memory_t::device); - phi_atomic.prepare(sddk::spin_range(0), true, &ctx_.mem_pool(sddk::memory_t::device)); - phi_atomic_S.prepare(sddk::spin_range(0), true, &ctx_.mem_pool(sddk::memory_t::device)); - phi_hub_S.prepare(sddk::spin_range(0), true, &ctx_.mem_pool(sddk::memory_t::device)); - for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { - kp__.spinor_wave_functions().prepare(sddk::spin_range(ispn), true, &ctx_.mem_pool(sddk::memory_t::device)); - } - s_dphi_atomic.prepare(sddk::spin_range(0), false, &ctx_.mem_pool(sddk::memory_t::device)); - ds_phi_atomic.prepare(sddk::spin_range(0), false, &ctx_.mem_pool(sddk::memory_t::device)); - } + RTE_ASSERT(nawf == phi_atomic.num_wf().get()); + RTE_ASSERT(nawf == phi_atomic_S.num_wf().get()); + RTE_ASSERT(nhwf == phi_hub_S.num_wf().get()); + + auto dphi_atomic = wave_function_factory(ctx_, kp__, phi_atomic.num_wf(), wf::num_mag_dims(0), false); + auto s_dphi_atomic = wave_function_factory(ctx_, kp__, phi_atomic.num_wf(), wf::num_mag_dims(0), false); + auto ds_phi_atomic = wave_function_factory(ctx_, kp__, phi_atomic.num_wf(), wf::num_mag_dims(0), false); /* compute < psi_{ik} | S | phi_hub > */ /* this is used in the final expression for the occupation matrix derivative */ std::array, 2> psi_s_phi_hub; for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { - psi_s_phi_hub[ispn] = sddk::dmatrix(kp__.num_occupied_bands(ispn), phi_hub_S.num_wf()); - if (ctx_.processing_unit() == sddk::device_t::GPU) { - psi_s_phi_hub[ispn].allocate(ctx_.mem_pool(sddk::memory_t::device)); - } - inner(ctx_.spla_context(), sddk::spin_range(ispn), kp__.spinor_wave_functions(), 0, kp__.num_occupied_bands(ispn), - phi_hub_S, 0, phi_hub_S.num_wf(), psi_s_phi_hub[ispn], 0, 0); + psi_s_phi_hub[ispn] = sddk::dmatrix(kp__.num_occupied_bands(ispn), nhwf); + wf::inner(ctx_.spla_context(), mt, wf::spin_range(ispn), kp__.spinor_wave_functions(), + wf::band_range(0, kp__.num_occupied_bands(ispn)), phi_hub_S, wf::band_range(0, nhwf), + psi_s_phi_hub[ispn], 0, 0); } /* compute overlap matrix */ @@ -452,7 +438,8 @@ Hubbard::compute_occupancies_stress_derivatives(K_point& kp__, Q_operato std::vector eval_O; if (ctx_.cfg().hubbard().full_orthogonalization()) { ovlp = sddk::dmatrix>(nawf, nawf); - sddk::inner(ctx_.spla_context(), sddk::spin_range(0), phi_atomic, 0, nawf, phi_atomic_S, 0, nawf, ovlp, 0, 0); + wf::inner(ctx_.spla_context(), mt, wf::spin_range(0), phi_atomic, wf::band_range(0, nawf), + phi_atomic_S, wf::band_range(0, nawf), ovlp, 0, 0); /* a tuple of O^{-1/2}, U, \lambda */ auto result = inverse_sqrt(ovlp, nawf); @@ -467,36 +454,41 @@ Hubbard::compute_occupancies_stress_derivatives(K_point& kp__, Q_operato for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { phi_atomic_s_psi[ispn] = sddk::dmatrix(nawf, kp__.num_occupied_bands(ispn)); /* compute < phi_atomic | S | psi_{ik} > for all atoms */ - inner(ctx_.spla_context(), sddk::spin_range(ispn), phi_atomic_S, 0, nawf, kp__.spinor_wave_functions(), - 0, kp__.num_occupied_bands(ispn), phi_atomic_s_psi[ispn], 0, 0); + wf::inner(ctx_.spla_context(), mt, wf::spin_range(ispn), phi_atomic_S, + wf::band_range(0, nawf), kp__.spinor_wave_functions(), + wf::band_range(0, kp__.num_occupied_bands(ispn)), phi_atomic_s_psi[ispn], 0, 0); } } + auto mg1 = dphi_atomic->memory_guard(mt); + auto mg2 = s_dphi_atomic->memory_guard(mt); + auto mg3 = ds_phi_atomic->memory_guard(mt); for (int nu = 0; nu < 3; nu++) { for (int mu = 0; mu < 3; mu++) { /* compute |d phi_atomic / d epsilon_{mu, nu} > */ - wavefunctions_strain_deriv(ctx_, kp__, dphi_atomic, rlm_g, rlm_dg, nu, mu); - if (ctx_.processing_unit() == sddk::device_t::GPU) { - dphi_atomic.prepare(sddk::spin_range(0), true, &ctx_.mem_pool(sddk::memory_t::device)); + wavefunctions_strain_deriv(ctx_, kp__, *dphi_atomic, rlm_g, rlm_dg, nu, mu); + + if (is_device_memory(mt)) { + dphi_atomic->copy_to(mt); } + /* compute S |d phi_atomic / d epsilon_{mu, nu} > */ - sirius::apply_S_operator(ctx_.processing_unit(), sddk::spin_range(0), 0, - nawf, kp__.beta_projectors(), dphi_atomic, &q_op__, s_dphi_atomic); + sirius::apply_S_operator(mt, wf::spin_range(0), + wf::band_range(0, nawf), kp__.beta_projectors(), *dphi_atomic, &q_op__, *s_dphi_atomic); - if (ctx_.processing_unit() == sddk::device_t::GPU) { - ds_phi_atomic.prepare(sddk::spin_range(0), false, &ctx_.mem_pool(sddk::memory_t::device)); - } - ds_phi_atomic.zero(ctx_.processing_unit()); - sirius::apply_S_operator_strain_deriv(ctx_.processing_unit(), 3 * nu + mu, kp__.beta_projectors(), - bp_strain_deriv, phi_atomic, q_op__, ds_phi_atomic); + ds_phi_atomic->zero(mt, wf::spin_index(0), wf::band_range(0, nawf)); + sirius::apply_S_operator_strain_deriv(mt, 3 * nu + mu, kp__.beta_projectors(), + bp_strain_deriv, phi_atomic, q_op__, *ds_phi_atomic); if (ctx_.cfg().hubbard().full_orthogonalization()) { /* compute */ - sddk::inner(ctx_.spla_context(), sddk::spin_range(0), phi_atomic, 0, nawf, ds_phi_atomic, 0, nawf, ovlp, 0, 0); + wf::inner(ctx_.spla_context(), mt, wf::spin_range(0), phi_atomic, + wf::band_range(0, nawf), *ds_phi_atomic, wf::band_range(0, nawf), ovlp, 0, 0); /* compute */ sddk::dmatrix> tmp(nawf, nawf); - sddk::inner(ctx_.spla_context(), sddk::spin_range(0), s_dphi_atomic, 0, nawf, phi_atomic, 0, nawf, tmp, 0, 0); + wf::inner(ctx_.spla_context(), mt, wf::spin_range(0), *s_dphi_atomic, + wf::band_range(0, nawf), phi_atomic, wf::band_range(0, nawf), tmp, 0, 0); for (int i = 0; i < nawf; i++) { for (int j = 0; j < nawf; j++) { @@ -508,12 +500,14 @@ Hubbard::compute_occupancies_stress_derivatives(K_point& kp__, Q_operato for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { sddk::dmatrix dphi_atomic_s_psi(nawf, kp__.num_occupied_bands(ispn)); - sddk::inner(ctx_.spla_context(), sddk::spin_range(ispn), s_dphi_atomic, 0, nawf, - kp__.spinor_wave_functions(), 0, kp__.num_occupied_bands(ispn), dphi_atomic_s_psi, 0, 0); + wf::inner(ctx_.spla_context(), mt, wf::spin_range(ispn), *s_dphi_atomic, + wf::band_range(0, nawf), kp__.spinor_wave_functions(), + wf::band_range(0, kp__.num_occupied_bands(ispn)), dphi_atomic_s_psi, 0, 0); sddk::dmatrix phi_atomic_ds_psi(nawf, kp__.num_occupied_bands(ispn)); - sddk::inner(ctx_.spla_context(), sddk::spin_range(ispn), ds_phi_atomic, 0, nawf, - kp__.spinor_wave_functions(), 0, kp__.num_occupied_bands(ispn), phi_atomic_ds_psi, 0, 0); + wf::inner(ctx_.spla_context(), mt, wf::spin_range(ispn), *ds_phi_atomic, + wf::band_range(0, nawf), kp__.spinor_wave_functions(), + wf::band_range(0, kp__.num_occupied_bands(ispn)), phi_atomic_ds_psi, 0, 0); for (int ibnd = 0; ibnd < kp__.num_occupied_bands(ispn); ibnd++) { for (int j = 0; j < nawf; j++) { @@ -535,7 +529,8 @@ Hubbard::compute_occupancies_stress_derivatives(K_point& kp__, Q_operato } if (ctx_.processing_unit() == sddk::device_t::GPU) { - phi_hub_s_psi_deriv.allocate(ctx_.mem_pool(sddk::memory_t::device)).copy_to(sddk::memory_t::device); + psi_s_phi_hub[ispn].allocate(get_memory_pool(sddk::memory_t::device)).copy_to(sddk::memory_t::device); + phi_hub_s_psi_deriv.allocate(get_memory_pool(sddk::memory_t::device)).copy_to(sddk::memory_t::device); } /* update the density matrix derivative */ @@ -548,13 +543,6 @@ Hubbard::compute_occupancies_stress_derivatives(K_point& kp__, Q_operato if (ctx_.processing_unit() == sddk::device_t::GPU) { dn__.copy_to(sddk::memory_t::host); - dn__.deallocate(sddk::memory_t::device); - phi_atomic.dismiss(sddk::spin_range(0), false); - phi_atomic_S.dismiss(sddk::spin_range(0), false); - phi_hub_S.dismiss(sddk::spin_range(0), false); - for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { - kp__.spinor_wave_functions().dismiss(sddk::spin_range(ispn), false); - } } } diff --git a/src/k_point/generate_fv_states.cpp b/src/k_point/generate_fv_states.cpp index caa76c213..410ccbdb5 100644 --- a/src/k_point/generate_fv_states.cpp +++ b/src/k_point/generate_fv_states.cpp @@ -36,96 +36,75 @@ void K_point::generate_fv_states() return; } - sddk::mdarray, 2> alm(num_gkvec_loc(), unit_cell_.max_mt_aw_basis_size(), sddk::memory_t::host); - sddk::mdarray, 2> tmp(unit_cell_.max_mt_aw_basis_size(), ctx_.num_fv_states()); - - if (ctx_.processing_unit() == sddk::device_t::GPU) { - fv_eigen_vectors_slab().pw_coeffs(0).allocate(sddk::memory_t::device); - fv_eigen_vectors_slab().pw_coeffs(0).copy_to(sddk::memory_t::device, 0, ctx_.num_fv_states()); - alm.allocate(sddk::memory_t::device); - tmp.allocate(sddk::memory_t::device); - } - - for (int ia = 0; ia < unit_cell_.num_atoms(); ia++) { - auto location = fv_eigen_vectors_slab().spl_num_atoms().location(ia); - /* number of alm coefficients for atom */ - int mt_aw_size = unit_cell_.atom(ia).mt_aw_basis_size(); - int mt_lo_size = unit_cell_.atom(ia).mt_lo_basis_size(); - /* generate matching coefficients for all G-vectors */ - alm_coeffs_loc_->generate(unit_cell_.atom(ia), alm); - - std::complex* tmp_ptr_gpu{nullptr}; - - auto la = sddk::linalg_t::none; - auto mt = sddk::memory_t::none; - switch (ctx_.processing_unit()) { - case sddk::device_t::CPU: { - la = sddk::linalg_t::blas; - mt = sddk::memory_t::host; - break; - } - case sddk::device_t::GPU: { - alm.copy_to(sddk::memory_t::device, 0, mt_aw_size * num_gkvec_loc()); - la = sddk::linalg_t::gpublas; - mt = sddk::memory_t::device; - tmp_ptr_gpu = tmp.at(sddk::memory_t::device); - break; - } + auto const& uc = ctx_.unit_cell(); + + auto bs = ctx_.cyclic_block_size(); + sddk::dmatrix> alm_fv(uc.mt_aw_basis_size(), ctx_.num_fv_states(), + ctx_.blacs_grid(), bs, bs); + + int atom_begin{0}; + int mt_aw_offset{0}; + + /* loop over blocks of atoms */ + for (auto na : utils::split_in_blocks(uc.num_atoms(), 64)) { + /* actual number of AW radial functions in a block of atoms */ + int num_mt_aw{0}; + for (int i = 0; i < na; i++) { + int ia = atom_begin + i; + auto& type = uc.atom(ia).type(); + num_mt_aw += type.mt_aw_basis_size(); } - sddk::mdarray, 2> tmp1(tmp.at(sddk::memory_t::host), tmp_ptr_gpu, mt_aw_size, ctx_.num_fv_states()); - - /* compute F(lm, i) = A(lm, G)^{T} * evec(G, i) for a single atom */ - sddk::linalg(la).gemm('T', 'N', mt_aw_size, ctx_.num_fv_states(), num_gkvec_loc(), - &sddk::linalg_const>::one(), alm.at(mt), alm.ld(), - fv_eigen_vectors_slab().pw_coeffs(0).prime().at(mt), - fv_eigen_vectors_slab().pw_coeffs(0).prime().ld(), - &sddk::linalg_const>::zero(), tmp1.at(mt), tmp1.ld()); + /* generate complex conjugated Alm coefficients for a block of atoms */ + auto alm = generate_alm_block(ctx_, atom_begin, na, this->alm_coeffs_loc()); - switch (ctx_.processing_unit()) { - case sddk::device_t::CPU: { - break; - } - case sddk::device_t::GPU: { - tmp1.copy_to(sddk::memory_t::host); - break; - } - } + /* compute F(lm, i) = A(lm, G)^{T} * evec(G, i) for the block of atoms */ + spla::pgemm_ssb(num_mt_aw, ctx_.num_fv_states(), this->gkvec().count(), SPLA_OP_TRANSPOSE, 1.0, + alm.at(sddk::memory_t::host), alm.ld(), + &fv_eigen_vectors_slab().pw_coeffs(0, wf::spin_index(0), wf::band_index(0)), + fv_eigen_vectors_slab().ld(), + 0.0, alm_fv.at(sddk::memory_t::host), alm_fv.ld(), mt_aw_offset, 0, alm_fv.spla_distribution(), + ctx_.spla_context()); - comm_.reduce(tmp1.at(sddk::memory_t::host), static_cast(tmp1.size()), location.rank); -// TODO: remove __PRINT_OBJECT_CHECKSUM -#ifdef __PRINT_OBJECT_CHECKSUM - auto z1 = tmp1.checksum(); - DUMP("checksum(tmp1): %18.10f %18.10f", std::real(z1), std::imag(z1)); -#endif + atom_begin += na; + mt_aw_offset += num_mt_aw; + } - if (location.rank == comm_.rank()) { - int offset1 = fv_states().offset_mt_coeffs(location.local_index); - int offset2 = fv_eigen_vectors_slab().offset_mt_coeffs(location.local_index); - for (int i = 0; i < ctx_.num_fv_states(); i++) { - /* aw block */ - std::memcpy(fv_states().mt_coeffs(0).prime().at(sddk::memory_t::host, offset1, i), - tmp1.at(sddk::memory_t::host, 0, i), mt_aw_size * sizeof(std::complex)); - /* lo block */ - if (mt_lo_size) { - std::memcpy(fv_states().mt_coeffs(0).prime().at(sddk::memory_t::host, offset1 + mt_aw_size, i), - fv_eigen_vectors_slab().mt_coeffs(0).prime().at(sddk::memory_t::host, offset2, i), - mt_lo_size * sizeof(std::complex)); - } - } - } + std::vector num_mt_apw_coeffs(uc.num_atoms()); + for (int ia = 0; ia < uc.num_atoms(); ia++) { + num_mt_apw_coeffs[ia] = uc.atom(ia).mt_aw_basis_size(); } + wf::Wave_functions_mt alm_fv_slab(this->comm(), num_mt_apw_coeffs, wf::num_mag_dims(0), + wf::num_bands(ctx_.num_fv_states()), sddk::memory_t::host); + + auto& one = sddk::linalg_const>::one(); + auto& zero = sddk::linalg_const>::zero(); + + auto layout_in = alm_fv.grid_layout(0, 0, uc.mt_aw_basis_size(), ctx_.num_fv_states()); + auto layout_out = alm_fv_slab.grid_layout_mt(wf::spin_index(0), wf::band_range(0, ctx_.num_fv_states())); + costa::transform(layout_in, layout_out, 'N', one, zero, this->comm().mpi_comm()); #pragma omp parallel for for (int i = 0; i < ctx_.num_fv_states(); i++) { /* G+k block */ - std::memcpy(fv_states().pw_coeffs(0).prime().at(sddk::memory_t::host, 0, i), - fv_eigen_vectors_slab().pw_coeffs(0).prime().at(sddk::memory_t::host, 0, i), - num_gkvec_loc() * sizeof(std::complex)); - } - - if (ctx_.processing_unit() == sddk::device_t::GPU) { - fv_eigen_vectors_slab().pw_coeffs(0).deallocate(sddk::memory_t::device); + auto in_ptr = &fv_eigen_vectors_slab().pw_coeffs(0, wf::spin_index(0), wf::band_index(i)); + auto out_ptr = &fv_states_->pw_coeffs(0, wf::spin_index(0), wf::band_index(i)); + std::copy(in_ptr, in_ptr + gkvec().count(), out_ptr); + + for (int ialoc = 0; ialoc < alm_fv_slab.spl_num_atoms().local_size(); ialoc++) { + int ia = alm_fv_slab.spl_num_atoms()[ialoc]; + int num_mt_aw = uc.atom(ia).type().mt_aw_basis_size(); + /* aw part of the muffin-tin coefficients */ + for (int xi = 0; xi < num_mt_aw; xi++) { + fv_states_->mt_coeffs(xi, wf::atom_index(ialoc), wf::spin_index(0), wf::band_index(i)) = + alm_fv_slab.mt_coeffs(xi, wf::atom_index(ialoc), wf::spin_index(0), wf::band_index(i)); + } + /* lo part of muffin-tin coefficients */ + for (int xi = 0; xi < uc.atom(ia).type().mt_lo_basis_size(); xi++) { + fv_states_->mt_coeffs(num_mt_aw + xi, wf::atom_index(ialoc), wf::spin_index(0), wf::band_index(i)) = + fv_eigen_vectors_slab().mt_coeffs(xi, wf::atom_index(ialoc), wf::spin_index(0), wf::band_index(i)); + } + } } } diff --git a/src/k_point/generate_spinor_wave_functions.cpp b/src/k_point/generate_spinor_wave_functions.cpp index 1fc41fb6e..edf269e05 100644 --- a/src/k_point/generate_spinor_wave_functions.cpp +++ b/src/k_point/generate_spinor_wave_functions.cpp @@ -23,7 +23,6 @@ */ #include "k_point/k_point.hpp" -#include "wf_trans.hpp" namespace sirius { @@ -37,25 +36,26 @@ void K_point::generate_spinor_wave_functions() if (!ctx_.need_sv()) { /* copy eigen-states and exit */ - spinor_wave_functions().copy_from(sddk::device_t::CPU, ctx_.num_fv_states(), fv_states(), 0, 0, 0, 0); + wf::copy(sddk::memory_t::host, *fv_states_, wf::spin_index(0), wf::band_range(0, ctx_.num_fv_states()), + *spinor_wave_functions_ , wf::spin_index(0), wf::band_range(0, ctx_.num_fv_states())); return; } int nbnd = (ctx_.num_mag_dims() == 3) ? ctx_.num_bands() : nfv; if (ctx_.processing_unit() == sddk::device_t::GPU) { - fv_states().allocate(sddk::spin_range(0), ctx_.mem_pool(sddk::memory_t::device)); - fv_states().copy_to(sddk::spin_range(0), sddk::memory_t::device, 0, nfv); - sv_eigen_vectors_[0].allocate(ctx_.mem_pool(sddk::memory_t::device)).copy_to(sddk::memory_t::device); + //fv_states().allocate(sddk::spin_range(0), get_memory_pool(sddk::memory_t::device)); + ////fv_states().copy_to(sddk::spin_range(0), sddk::memory_t::device, 0, nfv); + sv_eigen_vectors_[0].allocate(get_memory_pool(sddk::memory_t::device)).copy_to(sddk::memory_t::device); if (ctx_.num_mag_dims() == 1) { - sv_eigen_vectors_[1].allocate(ctx_.mem_pool(sddk::memory_t::device)).copy_to(sddk::memory_t::device); - } - if (is_device_memory(ctx_.preferred_memory_t())) { - for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { - spinor_wave_functions().allocate(sddk::spin_range(ispn), ctx_.mem_pool(sddk::memory_t::device)); - spinor_wave_functions().copy_to(sddk::spin_range(ispn), sddk::memory_t::device, 0, nbnd); - } + sv_eigen_vectors_[1].allocate(get_memory_pool(sddk::memory_t::device)).copy_to(sddk::memory_t::device); } + //if (is_device_memory(ctx_.preferred_memory_t())) { + // for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { + // spinor_wave_functions().allocate(sddk::spin_range(ispn), get_memory_pool(sddk::memory_t::device)); + // spinor_wave_functions().copy_to(sddk::spin_range(ispn), sddk::memory_t::device, 0, nbnd); + // } + //} } for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { @@ -71,22 +71,19 @@ void K_point::generate_spinor_wave_functions() o = 0; } /* multiply consecutively up and dn blocks */ - sddk::transform, complex_type>(ctx_.spla_context(), ispn, fv_states(), 0, nfv, sv_eigen_vectors_[s], o, 0, - spinor_wave_functions(), 0, nbnd); + wf::transform(ctx_.spla_context(), sddk::memory_t::host, sv_eigen_vectors_[s], o, 0, 1.0, *fv_states_, + wf::spin_index(0), wf::band_range(0, nfv), 0.0, *spinor_wave_functions_, wf::spin_index(ispn), + wf::band_range(0, nbnd)); } if (ctx_.processing_unit() == sddk::device_t::GPU) { - fv_states().deallocate(sddk::spin_range(0), sddk::memory_t::device); - for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { - spinor_wave_functions().copy_to(sddk::spin_range(ispn), sddk::memory_t::host, 0, nbnd); - } sv_eigen_vectors_[0].deallocate(sddk::memory_t::device); if (ctx_.num_mag_dims() == 3) { sv_eigen_vectors_[1].deallocate(sddk::memory_t::device); } } } else { - throw std::runtime_error("not implemented"); + RTE_THROW("not implemented"); } } diff --git a/src/k_point/k_point.cpp b/src/k_point/k_point.cpp index 1bc0d2bd3..f4aae721a 100644 --- a/src/k_point/k_point.cpp +++ b/src/k_point/k_point.cpp @@ -25,8 +25,6 @@ #include "k_point/k_point.hpp" #include "hamiltonian/non_local_operator.hpp" #include "linalg/inverse_sqrt.hpp" -#include "SDDK/wf_inner.hpp" -#include "SDDK/wf_trans.hpp" namespace sirius { @@ -89,26 +87,30 @@ K_point::initialize() sv_eigen_vectors_[is] = sddk::dmatrix>(nst, nst, ctx_.blacs_grid(), bs, bs, mem_type_evp); } } + + std::vector num_mt_coeffs(unit_cell_.num_atoms()); + for (int ia = 0; ia < unit_cell_.num_atoms(); ia++) { + num_mt_coeffs[ia] = unit_cell_.atom(ia).mt_lo_basis_size(); + } + /* allocate fv eien vectors */ - fv_eigen_vectors_slab_ = std::make_unique>( - gkvec_partition(), unit_cell_.num_atoms(), - [this](int ia) { return unit_cell_.atom(ia).mt_lo_basis_size(); }, ctx_.num_fv_states(), - ctx_.preferred_memory_t()); - - fv_eigen_vectors_slab_->pw_coeffs(0).prime().zero(); - fv_eigen_vectors_slab_->mt_coeffs(0).prime().zero(); - /* starting guess for wave-functions */ + fv_eigen_vectors_slab_ = std::make_unique>( + gkvec_, num_mt_coeffs, wf::num_mag_dims(0), wf::num_bands(ctx_.num_fv_states()), + ctx_.host_memory_t()); + + fv_eigen_vectors_slab_->zero(sddk::memory_t::host, wf::spin_index(0), + wf::band_range(0, ctx_.num_fv_states())); for (int i = 0; i < ctx_.num_fv_states(); i++) { for (int igloc = 0; igloc < gkvec().gvec_count(comm().rank()); igloc++) { int ig = igloc + gkvec().gvec_offset(comm().rank()); if (ig == i) { - fv_eigen_vectors_slab_->pw_coeffs(0).prime(igloc, i) = 1.0; + fv_eigen_vectors_slab_->pw_coeffs(igloc, wf::spin_index(0), wf::band_index(i)) = 1.0; } if (ig == i + 1) { - fv_eigen_vectors_slab_->pw_coeffs(0).prime(igloc, i) = 0.5; + fv_eigen_vectors_slab_->pw_coeffs(igloc, wf::spin_index(0), wf::band_index(i)) = 0.5; } if (ig == i + 2) { - fv_eigen_vectors_slab_->pw_coeffs(0).prime(igloc, i) = 0.125; + fv_eigen_vectors_slab_->pw_coeffs(igloc, wf::spin_index(0), wf::band_index(i)) = 0.125; } } } @@ -127,56 +129,55 @@ K_point::initialize() ncomp = ctx_.num_fv_states() / 2; } - singular_components_ = std::make_unique>( - gkvec_partition(), ncomp, ctx_.preferred_memory_t()); + singular_components_ = std::make_unique>( + gkvec_, num_mt_coeffs, wf::num_mag_dims(0), wf::num_bands(ncomp), ctx_.host_memory_t()); - singular_components_->pw_coeffs(0).prime().zero(); + singular_components_->zero(sddk::memory_t::host, wf::spin_index(0), wf::band_range(0, ncomp)); /* starting guess for wave-functions */ for (int i = 0; i < ncomp; i++) { for (int igloc = 0; igloc < gkvec().count(); igloc++) { int ig = igloc + gkvec().offset(); if (ig == i) { - singular_components_->pw_coeffs(0).prime(igloc, i) = 1.0; + singular_components_->pw_coeffs(igloc, wf::spin_index(0), wf::band_index(i)) = 1.0; } if (ig == i + 1) { - singular_components_->pw_coeffs(0).prime(igloc, i) = 0.5; + singular_components_->pw_coeffs(igloc, wf::spin_index(0), wf::band_index(i)) = 0.5; } if (ig == i + 2) { - singular_components_->pw_coeffs(0).prime(igloc, i) = 0.125; + singular_components_->pw_coeffs(igloc, wf::spin_index(0), wf::band_index(i)) = 0.125; } } } - if (ctx_.cfg().control().print_checksum()) { - singular_components_->print_checksum(sddk::device_t::CPU, "singular_components", 0, ncomp, RTE_OUT(std::cout)); - } } - fv_states_ = std::make_unique>( - gkvec_partition(), unit_cell_.num_atoms(), - [this](int ia) { return unit_cell_.atom(ia).mt_basis_size(); }, ctx_.num_fv_states(), - ctx_.preferred_memory_t()); + for (int ia = 0; ia < unit_cell_.num_atoms(); ia++) { + num_mt_coeffs[ia] = unit_cell_.atom(ia).mt_basis_size(); + } + fv_states_ = std::make_unique>(gkvec_, num_mt_coeffs, wf::num_mag_dims(0), + wf::num_bands(ctx_.num_fv_states()), ctx_.host_memory_t()); - spinor_wave_functions_ = std::make_shared>( - gkvec_partition(), unit_cell_.num_atoms(), - [this](int ia) { return unit_cell_.atom(ia).mt_basis_size(); }, nst, ctx_.preferred_memory_t(), - ctx_.num_spins()); + spinor_wave_functions_ = std::make_unique>(gkvec_, num_mt_coeffs, + wf::num_mag_dims(ctx_.num_mag_dims()), wf::num_bands(nst), ctx_.host_memory_t()); } else { - throw std::runtime_error("not implemented"); + RTE_THROW("not implemented"); } } else { - spinor_wave_functions_ = - std::make_shared>(gkvec_partition(), nst, ctx_.preferred_memory_t(), ctx_.num_spins()); + spinor_wave_functions_ = std::make_unique>(gkvec_, wf::num_mag_dims(ctx_.num_mag_dims()), + wf::num_bands(nst), ctx_.host_memory_t()); + if (ctx_.hubbard_correction()) { /* allocate Hubbard wave-functions */ - int nwfh = unit_cell_.num_hubbard_wf().first;// * ctx_.num_spinor_comp(); - int nwf = unit_cell_.num_ps_atomic_wf().first;// * ctx_.num_spinor_comp(); - auto mt = ctx_.preferred_memory_t(); - int ns = 1; //ctx_.num_spins(); - - hubbard_wave_functions_ = std::make_unique>(gkvec_partition(), nwfh, mt, ns); - hubbard_wave_functions_S_ = std::make_unique>(gkvec_partition(), nwfh, mt, ns); - atomic_wave_functions_ = std::make_unique>(gkvec_partition(), nwf, mt, ns); - atomic_wave_functions_S_ = std::make_unique>(gkvec_partition(), nwf, mt, ns); + int nwfh = unit_cell_.num_hubbard_wf().first; + int nwf = unit_cell_.num_ps_atomic_wf().first; + + hubbard_wave_functions_ = std::make_unique>(gkvec_, wf::num_mag_dims(0), + wf::num_bands(nwfh), ctx_.host_memory_t()); + hubbard_wave_functions_S_ = std::make_unique>(gkvec_, wf::num_mag_dims(0), + wf::num_bands(nwfh), ctx_.host_memory_t()); + atomic_wave_functions_ = std::make_unique>(gkvec_, wf::num_mag_dims(0), + wf::num_bands(nwf), ctx_.host_memory_t()); + atomic_wave_functions_S_ = std::make_unique>(gkvec_, wf::num_mag_dims(0), + wf::num_bands(nwf), ctx_.host_memory_t()); } } @@ -189,8 +190,8 @@ K_point::generate_hubbard_orbitals() { PROFILE("sirius::K_point::generate_hubbard_orbitals"); - auto& phi = atomic_wave_functions(); - auto& sphi = atomic_wave_functions_S(); + //auto& phi = atomic_wave_functions(); + //auto& sphi = atomic_wave_functions_S(); if (ctx_.so_correction()) { RTE_THROW("Hubbard+SO is not implemented"); } @@ -198,8 +199,8 @@ K_point::generate_hubbard_orbitals() RTE_THROW("Hubbard+Gamma point is not implemented"); } - phi.zero(sddk::device_t::CPU); - sphi.zero(sddk::device_t::CPU); + //phi.zero(sddk::device_t::CPU); + //sphi.zero(sddk::device_t::CPU); auto num_ps_atomic_wf = unit_cell_.num_ps_atomic_wf(); int nwf = num_ps_atomic_wf.first; @@ -207,67 +208,88 @@ K_point::generate_hubbard_orbitals() /* generate the initial atomic wavefunctions (full set composed of all atoms wfs) */ std::vector atoms(ctx_.unit_cell().num_atoms()); std::iota(atoms.begin(), atoms.end(), 0); + this->generate_atomic_wave_functions(atoms, [&](int iat){ return &ctx_.unit_cell().atom_type(iat).indexb_wfs(); }, - ctx_.ps_atomic_wf_ri(), phi); + ctx_.ps_atomic_wf_ri(), *atomic_wave_functions_); - if (ctx_.cfg().control().print_checksum()) { - atomic_wave_functions_->print_checksum(sddk::device_t::CPU, "atomic_wave_functions", 0, nwf, RTE_OUT(std::cout)); + auto pcs = env::print_checksum(); + if (pcs) { + auto cs = atomic_wave_functions_->checksum(sddk::memory_t::host, wf::spin_index(0), wf::band_range(0, nwf)); + if (this->comm().rank() == 0) { + utils::print_checksum("atomic_wave_functions", cs, RTE_OUT(std::cout)); + } } /* check if we have a norm conserving pseudo potential only */ auto q_op = (unit_cell_.augment()) ? std::make_unique>(ctx_) : nullptr; - phi.prepare(sddk::spin_range(0), true); - sphi.prepare(sddk::spin_range(0), false); + auto mem = ctx_.processing_unit_memory_t(); - /* compute S|phi> */ - beta_projectors().prepare(); + std::unique_ptr> wf_tmp; + std::unique_ptr> swf_tmp; - sirius::apply_S_operator>(ctx_.processing_unit(), sddk::spin_range(0), 0, nwf, beta_projectors(), - phi, q_op.get(), sphi); + { + auto mg1 = atomic_wave_functions_->memory_guard(mem, wf::copy_to::device | wf::copy_to::host); + auto mg2 = atomic_wave_functions_S_->memory_guard(mem, wf::copy_to::host); - std::unique_ptr> wf_tmp; - std::unique_ptr> swf_tmp; - if (ctx_.cfg().hubbard().full_orthogonalization()) { - wf_tmp = std::make_unique>(gkvec_partition(), nwf, sddk::memory_t::host, 1); - swf_tmp = std::make_unique>(gkvec_partition(), nwf, sddk::memory_t::host, 1); + /* compute S|phi> */ + beta_projectors().prepare(); - wf_tmp->copy_from(sddk::device_t::CPU, nwf, phi, 0, 0, 0, 0); - if (is_device_memory(sphi.preferred_memory_t())) { - sphi.copy_to(sddk::spin_range(0), sddk::memory_t::host, 0, nwf); - } - swf_tmp->copy_from(sddk::device_t::CPU, nwf, sphi, 0, 0, 0, 0); + sirius::apply_S_operator>(mem, wf::spin_range(0), wf::band_range(0, nwf), beta_projectors(), + *atomic_wave_functions_, q_op.get(), *atomic_wave_functions_S_); + + if (ctx_.cfg().hubbard().full_orthogonalization()) { + /* save phi and sphi */ + + wf_tmp = std::make_unique>(gkvec_, wf::num_mag_dims(0), wf::num_bands(nwf), + ctx_.host_memory_t()); + swf_tmp = std::make_unique>(gkvec_, wf::num_mag_dims(0), wf::num_bands(nwf), + ctx_.host_memory_t()); + + auto mg3 = wf_tmp->memory_guard(mem, wf::copy_to::host); + auto mg4 = swf_tmp->memory_guard(mem, wf::copy_to::host); - int BS = ctx_.cyclic_block_size(); - sddk::dmatrix> ovlp(nwf, nwf, ctx_.blacs_grid(), BS, BS); - sddk::inner(ctx_.spla_context(), sddk::spin_range(0), phi, 0, nwf, sphi, 0, nwf, ovlp, 0, 0); - auto B = std::get<0>(inverse_sqrt(ovlp, nwf)); + wf::copy(mem, *atomic_wave_functions_, wf::spin_index(0), wf::band_range(0, nwf), + *wf_tmp, wf::spin_index(0), wf::band_range(0, nwf)); + wf::copy(mem, *atomic_wave_functions_S_, wf::spin_index(0), wf::band_range(0, nwf), + *swf_tmp, wf::spin_index(0), wf::band_range(0, nwf)); - sddk::transform>(ctx_.spla_context(), 0, {&phi}, 0, nwf, *B, 0, 0, {&sphi}, 0, nwf); - phi.copy_from(sphi, nwf, 0, 0, 0, 0); + int BS = ctx_.cyclic_block_size(); + sddk::dmatrix> ovlp(nwf, nwf, ctx_.blacs_grid(), BS, BS); - sirius::apply_S_operator>(ctx_.processing_unit(), sddk::spin_range(0), 0, nwf, beta_projectors(), - phi, q_op.get(), sphi); + wf::inner(ctx_.spla_context(), mem, wf::spin_range(0), *atomic_wave_functions_, + wf::band_range(0, nwf), *atomic_wave_functions_S_, wf::band_range(0, nwf), ovlp, 0, 0); + auto B = std::get<0>(inverse_sqrt(ovlp, nwf)); - if (ctx_.cfg().control().verification() >= 1) { - sddk::inner(ctx_.spla_context(), sddk::spin_range(0), phi, 0, nwf, sphi, 0, nwf, ovlp, 0, 0); + /* use sphi as temporary */ + wf::transform(ctx_.spla_context(), mem, *B, 0, 0, 1.0, *atomic_wave_functions_, + wf::spin_index(0), wf::band_range(0, nwf), 0.0, *atomic_wave_functions_S_, wf::spin_index(0), + wf::band_range(0, nwf)); - auto diff = check_identity(ovlp, nwf); - RTE_OUT(std::cout) << "orthogonalization error " << diff << std::endl; + wf::copy(mem, *atomic_wave_functions_S_, wf::spin_index(0), wf::band_range(0, nwf), + *atomic_wave_functions_, wf::spin_index(0), wf::band_range(0, nwf)); + + apply_S_operator>(mem, wf::spin_range(0), wf::band_range(0, nwf), beta_projectors(), + *atomic_wave_functions_, q_op.get(), *atomic_wave_functions_S_); + + //if (ctx_.cfg().control().verification() >= 1) { + // sddk::inner(ctx_.spla_context(), sddk::spin_range(0), phi, 0, nwf, sphi, 0, nwf, ovlp, 0, 0); + + // auto diff = check_identity(ovlp, nwf); + // RTE_OUT(std::cout) << "orthogonalization error " << diff << std::endl; + //} } - } - beta_projectors().dismiss(); - phi.dismiss(sddk::spin_range(0), true); - sphi.dismiss(sddk::spin_range(0), true); + beta_projectors().dismiss(); + } - if (ctx_.cfg().control().print_checksum()) { - sphi.print_checksum(sddk::device_t::CPU, "atomic_wave_functions_S", 0, nwf, RTE_OUT(std::cout)); + if (pcs) { + auto cs = atomic_wave_functions_S_->checksum(sddk::memory_t::host, wf::spin_index(0), wf::band_range(0, nwf)); + if (this->comm().rank() == 0) { + utils::print_checksum("atomic_wave_functions_S", cs, RTE_OUT(std::cout)); + } } - auto& phi_hub = hubbard_wave_functions(); - auto& sphi_hub = hubbard_wave_functions_S(); - auto num_hubbard_wf = unit_cell_.num_hubbard_wf(); for (int ia = 0; ia < ctx_.unit_cell().num_atoms(); ia++) { @@ -286,41 +308,34 @@ K_point::generate_hubbard_orbitals() int offset_in_wf = num_ps_atomic_wf.second[ia] + type.indexb_wfs().offset(idxr_wf); int offset_in_hwf = num_hubbard_wf.second[ia] + type.indexb_hub().offset(idxrf); - phi_hub.copy_from(sddk::device_t::CPU, mmax, phi, 0, offset_in_wf, 0, offset_in_hwf); - sphi_hub.copy_from(sddk::device_t::CPU, mmax, sphi, 0, offset_in_wf, 0, offset_in_hwf); + wf::copy(sddk::memory_t::host, *atomic_wave_functions_, wf::spin_index(0), + wf::band_range(offset_in_wf, offset_in_wf + mmax), *hubbard_wave_functions_, + wf::spin_index(0), wf::band_range(offset_in_hwf, offset_in_hwf + mmax)); + + wf::copy(sddk::memory_t::host, *atomic_wave_functions_S_, wf::spin_index(0), + wf::band_range(offset_in_wf, offset_in_wf + mmax), *hubbard_wave_functions_S_, + wf::spin_index(0), wf::band_range(offset_in_hwf, offset_in_hwf + mmax)); } } } /* restore phi and sphi */ if (ctx_.cfg().hubbard().full_orthogonalization()) { - phi.copy_from(sddk::device_t::CPU, nwf, *wf_tmp, 0, 0, 0, 0); - sphi.copy_from(sddk::device_t::CPU, nwf, *swf_tmp, 0, 0, 0, 0); - } - //if (ctx_.num_spins() == 2) { - // /* copy up component to dn component in collinear case - // * +-------------------------------+ - // * | phi1_{lm}, phi2_{lm}, ... | - // * +-------------------------------+ - // * | phi1_{lm}, phi2_{lm}, ... | - // * +-------------------------------+ - // * - // * or with offset in non-collinear case - // * - // * +-------------------------------+---------------------------------+ - // * | phi1_{lm}, phi2_{lm}, ... | 0 | - // * +-------------------------------+---------------------------------+ - // * | 0 | phi1_{lm}, phi2_{lm}, ... | - // * +-------------------------------+---------------------------------+ - // */ - // phi.copy_from(device_t::CPU, r.first, phi, 0, 0, 1, (ctx_.num_mag_dims() == 3) ? r.first : 0); - //} + wf::copy(sddk::memory_t::host, *wf_tmp, wf::spin_index(0), wf::band_range(0, nwf), + *atomic_wave_functions_, wf::spin_index(0), wf::band_range(0, nwf)); + wf::copy(sddk::memory_t::host, *swf_tmp, wf::spin_index(0), wf::band_range(0, nwf), + *atomic_wave_functions_S_, wf::spin_index(0), wf::band_range(0, nwf)); + } - if (ctx_.cfg().control().print_checksum()) { - hubbard_wave_functions_->print_checksum(sddk::device_t::CPU, "hubbard_phi", 0, - hubbard_wave_functions_->num_wf(), RTE_OUT(std::cout)); - hubbard_wave_functions_S_->print_checksum(sddk::device_t::CPU, "hubbard_phi_S", 0, - hubbard_wave_functions_S_->num_wf(), RTE_OUT(std::cout)); + if (pcs) { + auto cs1 = hubbard_wave_functions_->checksum(sddk::memory_t::host, wf::spin_index(0), + wf::band_range(0, num_hubbard_wf.first)); + auto cs2 = hubbard_wave_functions_S_->checksum(sddk::memory_t::host, wf::spin_index(0), + wf::band_range(0, num_hubbard_wf.first)); + if (comm().rank() == 0) { + utils::print_checksum("hubbard_wave_functions", cs1, RTE_OUT(std::cout)); + utils::print_checksum("hubbard_wave_functions_S", cs2, RTE_OUT(std::cout)); + } } } @@ -348,7 +363,7 @@ K_point::generate_gkvec(double gk_cutoff__) TERMINATE(s); } - gkvec_partition_ = std::make_unique( + gkvec_partition_ = std::make_shared( this->gkvec(), ctx_.comm_fft_coarse(), ctx_.comm_band_ortho_fft_coarse()); const auto fft_type = gkvec_->reduced() ? SPFFT_TRANS_R2C : SPFFT_TRANS_C2C; @@ -711,145 +726,6 @@ K_point::get_fv_eigen_vectors(sddk::mdarray, 2>& fv_evec__) c //== } //== } -template -void -K_point::test_spinor_wave_functions(int use_fft) -{ - STOP(); - - //== if (num_ranks() > 1) error_local(__FILE__, __LINE__, "test of spinor wave functions on multiple ranks is - //not implemented"); - //== - //== std::vector v1[2]; - //== std::vector v2; - //== - //== if (use_fft == 0 || use_fft == 1) v2.resize(fft_->size()); - //== - //== if (use_fft == 0) - //== { - //== for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) v1[ispn].resize(num_gkvec()); - //== } - //== - //== if (use_fft == 1) - //== { - //== for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) v1[ispn].resize(fft_->size()); - //== } - //== - //== double maxerr = 0; - //== - //== for (int j1 = 0; j1 < ctx_.num_bands(); j1++) - //== { - //== if (use_fft == 0) - //== { - //== for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) - //== { - //== fft_->input(num_gkvec(), gkvec_.index_map(), - //== &spinor_wave_functions_(unit_cell_.mt_basis_size(), ispn, j1)); - //== fft_->transform(1); - //== fft_->output(&v2[0]); - //== - //== for (int ir = 0; ir < fft_->size(); ir++) v2[ir] *= ctx_.step_function()->theta_r(ir); - //== - //== fft_->input(&v2[0]); - //== fft_->transform(-1); - //== fft_->output(num_gkvec(), gkvec_.index_map(), &v1[ispn][0]); - //== } - //== } - //== - //== if (use_fft == 1) - //== { - //== for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) - //== { - //== fft_->input(num_gkvec(), gkvec_.index_map(), - //== &spinor_wave_functions_(unit_cell_.mt_basis_size(), ispn, j1)); - //== fft_->transform(1); - //== fft_->output(&v1[ispn][0]); - //== } - //== } - //== - //== for (int j2 = 0; j2 < ctx_.num_bands(); j2++) - //== { - //== double_complex zsum(0, 0); - //== for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) - //== { - //== for (int ia = 0; ia < unit_cell_.num_atoms(); ia++) - //== { - //== int offset_wf = unit_cell_.atom(ia)->offset_wf(); - //== Atom_type* type = unit_cell_.atom(ia)->type(); - //== Atom_symmetry_class* symmetry_class = unit_cell_.atom(ia)->symmetry_class(); - //== - //== for (int l = 0; l <= ctx_.lmax_apw(); l++) - //== { - //== int ordmax = type->indexr().num_rf(l); - //== for (int io1 = 0; io1 < ordmax; io1++) - //== { - //== for (int io2 = 0; io2 < ordmax; io2++) - //== { - //== for (int m = -l; m <= l; m++) - //== { - //== zsum += conj(spinor_wave_functions_(offset_wf + - //type->indexb_by_l_m_order(l, m, io1), ispn, j1)) * - //== spinor_wave_functions_(offset_wf + type->indexb_by_l_m_order(l, m, - //io2), ispn, j2) * - //== symmetry_class->o_radial_integral(l, io1, io2); - //== } - //== } - //== } - //== } - //== } - //== } - //== - //== if (use_fft == 0) - //== { - //== for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) - //== { - //== for (int ig = 0; ig < num_gkvec(); ig++) - //== zsum += conj(v1[ispn][ig]) * spinor_wave_functions_(unit_cell_.mt_basis_size() + ig, - //ispn, j2); - //== } - //== } - //== - //== if (use_fft == 1) - //== { - //== for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) - //== { - //== fft_->input(num_gkvec(), gkvec_.index_map(), - //&spinor_wave_functions_(unit_cell_.mt_basis_size(), ispn, j2)); - //== fft_->transform(1); - //== fft_->output(&v2[0]); - //== - //== for (int ir = 0; ir < fft_->size(); ir++) - //== zsum += std::conj(v1[ispn][ir]) * v2[ir] * ctx_.step_function()->theta_r(ir) / - //double(fft_->size()); - //== } - //== } - //== - //== if (use_fft == 2) - //== { - //== STOP(); - //== //for (int ig1 = 0; ig1 < num_gkvec(); ig1++) - //== //{ - //== // for (int ig2 = 0; ig2 < num_gkvec(); ig2++) - //== // { - //== // int ig3 = ctx_.gvec().index_g12(ig1, ig2); - //== // for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) - //== // { - //== // zsum += std::conj(spinor_wave_functions_(unit_cell_.mt_basis_size() + ig1, ispn, - //j1)) * - //== // spinor_wave_functions_(unit_cell_.mt_basis_size() + ig2, ispn, j2) * - //== // ctx_.step_function()->theta_pw(ig3); - //== // } - //== // } - //== //} - //== } - //== - //== zsum = (j1 == j2) ? zsum - double_complex(1.0, 0.0) : zsum; - //== maxerr = std::max(maxerr, std::abs(zsum)); - //== } - //== } - //== std :: cout << "maximum error = " << maxerr << std::endl; -} - /** The following HDF5 data structure is created: \verbatim /K_point_set/ik/vk @@ -901,28 +777,30 @@ K_point::save(std::string const& name__, int id__) const } /* wait for rank 0 */ comm().barrier(); - int gkvec_count = gkvec().count(); - int gkvec_offset = gkvec().offset(); - std::vector> wf_tmp(num_gkvec()); + //int gkvec_count = gkvec().count(); + //int gkvec_offset = gkvec().offset(); + //std::vector> wf_tmp(num_gkvec()); - std::unique_ptr fout; + //std::unique_ptr fout; /* rank 0 opens a file */ - if (comm().rank() == 0) { - fout = std::make_unique(name__, sddk::hdf5_access_t::read_write); - } + //if (comm().rank() == 0) { + // fout = std::make_unique(name__, sddk::hdf5_access_t::read_write); + //} - /* store wave-functions */ - for (int i = 0; i < ctx_.num_bands(); i++) { - for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { - /* gather full column of PW coefficients on rank 0 */ - comm().gather(&spinor_wave_functions_->pw_coeffs(ispn).prime(0, i), wf_tmp.data(), gkvec_offset, - gkvec_count, 0); - if (comm().rank() == 0) { - (*fout)["K_point_set"][id__]["bands"][i]["spinor_wave_function"][ispn].write("pw", wf_tmp); - } - } - comm().barrier(); - } + RTE_THROW("re-implement"); + + ///* store wave-functions */ + //for (int i = 0; i < ctx_.num_bands(); i++) { + // for (int ispn = 0; ispn < ctx_.num_spins(); ispn++) { + // /* gather full column of PW coefficients on rank 0 */ + // comm().gather(&spinor_wave_functions_->pw_coeffs(ispn).prime(0, i), wf_tmp.data(), gkvec_offset, + // gkvec_count, 0); + // if (comm().rank() == 0) { + // (*fout)["K_point_set"][id__]["bands"][i]["spinor_wave_function"][ispn].write("pw", wf_tmp); + // } + // } + // comm().barrier(); + //} } template @@ -1002,7 +880,7 @@ template void K_point::generate_atomic_wave_functions(std::vector atoms__, std::function indexb__, - Radial_integrals_atomic_wf const& ri__, sddk::Wave_functions& wf__) + Radial_integrals_atomic_wf const& ri__, wf::Wave_functions& wf__) { PROFILE("sirius::K_point::generate_atomic_wave_functions"); @@ -1029,7 +907,7 @@ K_point::generate_atomic_wave_functions(std::vector atoms__, int iat = unit_cell_.atom(ia).type_id(); if (wf_t[iat].size() == 0) { wf_t[iat] = sddk::mdarray, 2>(this->num_gkvec_loc(), indexb__(iat)->size(), - ctx_.mem_pool(sddk::memory_t::host)); + get_memory_pool(sddk::memory_t::host)); } } @@ -1076,9 +954,9 @@ K_point::generate_atomic_wave_functions(std::vector atoms__, /* quickly compute phase factors without calling exp() function */ std::vector> phase_gk(num_gkvec_loc()); - #pragma omp parallel for schedule(static) + #pragma omp parallel for for (int igk_loc = 0; igk_loc < num_gkvec_loc(); igk_loc++) { - auto G = gkvec().template gvec(igk_loc); + auto G = gkvec().template gvec(igk_loc); /* total phase e^{-i(G+k)r_{\alpha}} */ phase_gk[igk_loc] = std::conj(static_cast>(ctx_.gvec_phase_factor(G, ia)) * phase_k); } @@ -1086,9 +964,10 @@ K_point::generate_atomic_wave_functions(std::vector atoms__, int iat = unit_cell_.atom(ia).type_id(); #pragma omp parallel for (int xi = 0; xi < static_cast(indexb__(iat)->size()); xi++) { - #pragma omp for schedule(static) nowait + #pragma omp for nowait for (int igk_loc = 0; igk_loc < num_gkvec_loc(); igk_loc++) { - wf__.pw_coeffs(0).prime(igk_loc, offset[ia] + xi) = wf_t[iat](igk_loc, xi) * phase_gk[igk_loc]; + wf__.pw_coeffs(igk_loc, wf::spin_index(0), wf::band_index(offset[ia] + xi)) = + wf_t[iat](igk_loc, xi) * phase_gk[igk_loc]; } } } diff --git a/src/k_point/k_point.hpp b/src/k_point/k_point.hpp index f9e62cc7c..10090e540 100644 --- a/src/k_point/k_point.hpp +++ b/src/k_point/k_point.hpp @@ -27,7 +27,7 @@ #include "lapw/matching_coefficients.hpp" #include "beta_projectors/beta_projectors.hpp" -#include "wave_functions.hpp" +#include "unit_cell/radial_functions_index.hpp" #include "SDDK/fft.hpp" namespace sirius { @@ -66,7 +66,7 @@ class K_point std::shared_ptr gkvec_col_; /// G-vector distribution for the FFT transformation. - std::unique_ptr gkvec_partition_; + std::shared_ptr gkvec_partition_; std::unique_ptr> spfft_transform_; @@ -77,37 +77,37 @@ class K_point sddk::dmatrix> fv_eigen_vectors_; /// First-variational eigen vectors, distributed in slabs. - std::unique_ptr> fv_eigen_vectors_slab_; + std::unique_ptr> fv_eigen_vectors_slab_; /// Lowest eigen-vectors of the LAPW overlap matrix with small aigen-values. - std::unique_ptr> singular_components_; + std::unique_ptr> singular_components_; /// Second-variational eigen vectors. /** Second-variational eigen-vectors are stored as one or two \f$ N_{fv} \times N_{fv} \f$ matrices in * case of non-magnetic or collinear magnetic case or as a single \f$ 2 N_{fv} \times 2 N_{fv} \f$ * matrix in case of general non-collinear magnetism. */ - sddk::dmatrix> sv_eigen_vectors_[2]; + std::array>, 2> sv_eigen_vectors_; /// Full-diagonalization eigen vectors. sddk::mdarray, 2> fd_eigen_vectors_; /// First-variational states. - std::unique_ptr> fv_states_{nullptr}; + std::unique_ptr> fv_states_{nullptr}; /// Two-component (spinor) wave functions describing the bands. - std::shared_ptr> spinor_wave_functions_{nullptr}; + std::unique_ptr> spinor_wave_functions_{nullptr}; /// Pseudopotential atmoic wave-functions (not orthogonalized). - std::unique_ptr> atomic_wave_functions_{nullptr}; + std::unique_ptr> atomic_wave_functions_{nullptr}; /// Pseudopotential atmoic wave-functions (not orthogonalized) with S-operator applied. - std::unique_ptr> atomic_wave_functions_S_{nullptr}; + std::unique_ptr> atomic_wave_functions_S_{nullptr}; /// Hubbard wave functions. - std::unique_ptr> hubbard_wave_functions_{nullptr}; + std::unique_ptr> hubbard_wave_functions_{nullptr}; /// Hubbard wave functions with S-operator applied. - std::unique_ptr> hubbard_wave_functions_S_{nullptr}; + std::unique_ptr> hubbard_wave_functions_S_{nullptr}; /// Band occupation numbers. sddk::mdarray band_occupancies_; @@ -196,14 +196,11 @@ class K_point /// Communicator between(!!) columns. sddk::Communicator const& comm_col_; - std::array ispn_map_; + std::array ispn_map_{0, -1}; /// Generate G+k and local orbital basis sets. void generate_gklo_basis(); - /// Test orthonormalization of first-variational states. - void test_fv_states(); - /// Find G+k vectors within the cutoff. void generate_gkvec(double gk_cutoff__); @@ -224,8 +221,6 @@ class K_point sddk::memory_t::host, "band_energies"); band_energies_.zero(); - ispn_map_[0] = 0; - ispn_map_[1] = -1; if (ctx_.num_mag_dims() == 1) { ispn_map_[1] = 1; } else if (ctx_.num_mag_dims() == 3) { @@ -344,10 +339,8 @@ class K_point sufficient storage space. */ void generate_atomic_wave_functions(std::vector atoms__, - std::function indexb__, - Radial_integrals_atomic_wf const& ri__, - sddk::Wave_functions& wf__); - + std::function indexb__, + Radial_integrals_atomic_wf const& ri__, wf::Wave_functions& wf__); void generate_hubbard_orbitals(); /// Save data to HDF5 file. @@ -362,9 +355,6 @@ class K_point /// Collect distributed first-variational vectors into a global array. void get_fv_eigen_vectors(sddk::mdarray, 2>& fv_evec__) const; - /// Test orthonormalization of spinor wave-functions - void test_spinor_wave_functions(int use_fft); - /// Collect distributed second-variational vectors into a global array. void get_sv_eigen_vectors(sddk::mdarray, 2>& sv_evec__) const { @@ -401,6 +391,12 @@ class K_point return *gkvec_; } + /// Return shared pointer to gkvec object. + inline auto gkvec_sptr() const + { + return gkvec_; + } + /// Total number of G+k vectors within the cutoff distance inline int num_gkvec() const { @@ -473,19 +469,20 @@ class K_point return *fv_states_; } - inline auto& spinor_wave_functions() + inline auto const& spinor_wave_functions() const { RTE_ASSERT(spinor_wave_functions_ != nullptr); return *spinor_wave_functions_; } - inline auto spinor_wave_functions_ptr() + inline auto& spinor_wave_functions() { - return spinor_wave_functions_; + RTE_ASSERT(spinor_wave_functions_ != nullptr); + return const_cast&>(static_cast(*this).spinor_wave_functions());; } - /// return the initial atomic orbitals used to compute the hubbard wave functions. the S operator is applied on - /// these functions + /// Return the initial atomic orbitals used to compute the hubbard wave functions. The S operator is applied on + /// these functions. inline auto const& atomic_wave_functions_S() const { /* the S operator is applied on these functions */ @@ -495,47 +492,30 @@ class K_point inline auto& atomic_wave_functions_S() { - return const_cast&>(static_cast(*this).atomic_wave_functions_S()); + return const_cast&>(static_cast(*this).atomic_wave_functions_S()); } + /// Return the initial atomic orbitals used to compute the hubbard wave functions. inline auto const& atomic_wave_functions() const { RTE_ASSERT(atomic_wave_functions_ != nullptr); return *atomic_wave_functions_; } - /// return the initial atomic orbitals used to compute the hubbard wave functions. + /// Return the initial atomic orbitals used to compute the hubbard wave functions. inline auto& atomic_wave_functions() { - return const_cast&>(static_cast(*this).atomic_wave_functions()); + return const_cast&>(static_cast(*this).atomic_wave_functions()); } - /// return the actual hubbard wave functions used in the calculations. The S operator is applied when uspp are used. + /// Return the actual hubbard wave functions used in the calculations. + /** The S operator is applied on these functions. */ inline auto const& hubbard_wave_functions_S() const { RTE_ASSERT(hubbard_wave_functions_S_ != nullptr); return *hubbard_wave_functions_S_; } - /// return the actual hubbard wave functions used in the calculations. The S operator is applied when uspp are used. - inline auto& hubbard_wave_functions_S() - { - return const_cast&>(static_cast(*this).hubbard_wave_functions_S()); - } - - /// return the actual hubbard wave functions used in the calculations. - inline auto const& hubbard_wave_functions() const - { - RTE_ASSERT(hubbard_wave_functions_ != nullptr); - return *hubbard_wave_functions_; - } - - /// return the actual hubbard wave functions used in the calculations. - inline auto& hubbard_wave_functions() - { - return const_cast&>(static_cast(*this).hubbard_wave_functions()); - } - inline auto& singular_components() { return *singular_components_; @@ -554,12 +534,6 @@ class K_point return num_gkvec() + unit_cell_.mt_lo_basis_size(); } - /// Return global index of G+k vector. // TODO: consider removal - inline int idxgk(int igkloc__) const - { - return gkvec_->offset() + igkloc__; - } - /// Local number of G+k vectors for each MPI rank in the row of the 2D MPI grid. inline int num_gkvec_row() const { @@ -618,7 +592,7 @@ class K_point return igk_loc_; } - inline int igk_row(int idx__) const + inline int igk_row(int idx__) const // TODO: get all from gkvec_row_ { return igk_row_[idx__]; } @@ -809,12 +783,37 @@ class K_point return *spfft_transform_; } - inline auto const& gkvec_partition() const + inline auto const& gkvec_fft() const { return *gkvec_partition_; } + + inline auto gkvec_fft_sptr() const + { + return gkvec_partition_; + } }; +template +inline auto +wave_function_factory(Simulation_context const& ctx__, K_point const& kp__, wf::num_bands num_wf__, + wf::num_mag_dims num_md__, bool mt_part__) +{ + using wf_t = wf::Wave_functions; + std::unique_ptr wf{nullptr}; + if (mt_part__) { + std::vector num_mt_coeffs(ctx__.unit_cell().num_atoms()); + for (int ia = 0; ia < ctx__.unit_cell().num_atoms(); ia++) { + num_mt_coeffs[ia] = ctx__.unit_cell().atom(ia).mt_lo_basis_size(); + } + wf = std::make_unique(kp__.gkvec_sptr(), num_mt_coeffs, num_md__, num_wf__, ctx__.host_memory_t()); + } else { + wf = std::make_unique(kp__.gkvec_sptr(), num_md__, num_wf__, ctx__.host_memory_t()); + } + + return wf; +} + } // namespace sirius /** \page basis Basis functions for Kohn-Sham wave-functions expansion diff --git a/src/k_point/k_point_set.cpp b/src/k_point/k_point_set.cpp index 792206e23..464f00f1c 100644 --- a/src/k_point/k_point_set.cpp +++ b/src/k_point/k_point_set.cpp @@ -32,7 +32,7 @@ void K_point_set::sync_band() PROFILE("sirius::K_point_set::sync_band"); sddk::mdarray data(ctx_.num_bands(), ctx_.num_spinors(), num_kpoints(), - ctx_.mem_pool(sddk::memory_t::host), "K_point_set::sync_band.data"); + get_memory_pool(sddk::memory_t::host), "K_point_set::sync_band.data"); int nb = ctx_.num_bands() * ctx_.num_spinors(); #pragma omp parallel diff --git a/src/k_point/test_fv_states.cpp b/src/k_point/test_fv_states.cpp deleted file mode 100644 index 42565e373..000000000 --- a/src/k_point/test_fv_states.cpp +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright (c) 2013-2016 Anton Kozhevnikov, Thomas Schulthess -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, are permitted provided that -// the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the -// following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions -// and the following disclaimer in the documentation and/or other materials provided with the distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -/** \file test_fv_states.hpp - * - * \brief Test orthonormalisation of first-variational states. - */ - -#include "k_point.hpp" - -namespace sirius { - -template -void -K_point::test_fv_states() -{ - PROFILE("sirius::K_point::test_fv_states"); - - STOP(); - - // Wave_functions o_fv(wf_size(), ctx_.num_fv_states(), ctx_.cyclic_block_size(), ctx_.blacs_grid(), - // ctx_.blacs_grid_slice()); o_fv.set_num_swapped(ctx_.num_fv_states()); - - // for (int i = 0; i < o_fv.spl_num_col().local_size(); i++) - //{ - // std::memset(o_fv[i], 0, wf_size() * sizeof(double_complex)); - // for (int ia = 0; ia < unit_cell_.num_atoms(); ia++) - // { - // int offset_wf = unit_cell_.atom(ia).offset_wf(); - // auto& type = unit_cell_.atom(ia).type(); - // auto& symmetry_class = unit_cell_.atom(ia).symmetry_class(); - - // for (int l = 0; l <= ctx_.lmax_apw(); l++) - // { - // int ordmax = type.indexr().num_rf(l); - // for (int io1 = 0; io1 < ordmax; io1++) - // { - // for (int io2 = 0; io2 < ordmax; io2++) - // { - // for (int m = -l; m <= l; m++) - // { - // o_fv[i][offset_wf + type.indexb_by_l_m_order(l, m, io2)] += - // fv_states()[i][offset_wf + type.indexb_by_l_m_order(l, m, io1)] * - // symmetry_class.o_radial_integral(l, io1, io2); - // } - // } - // } - // } - // } - // ctx_.fft().transform<1>(gkvec().partition(), &fv_states()[i][unit_cell_.mt_basis_size()]); - // for (int ir = 0; ir < ctx_.fft().local_size(); ir++) ctx_.fft().buffer(ir) *= - // ctx_.step_function().theta_r(ir); ctx_.fft().transform<-1>(gkvec().partition(), - // &o_fv[i][unit_cell_.mt_basis_size()]); - //} - // o_fv.swap_backward(0, ctx_.num_fv_states()); - - // dmatrix ovlp(ctx_.num_fv_states(), ctx_.num_fv_states(), ctx_.blacs_grid(), - // ctx_.cyclic_block_size(), ctx_.cyclic_block_size()); - // - // linalg::gemm(2, 0, ctx_.num_fv_states(), ctx_.num_fv_states(), wf_size(), double_complex(1, 0), - // fv_states().prime(), o_fv.prime(), double_complex(0, 0), ovlp); - // - // double max_err = 0; - // for (int i = 0; i < ovlp.num_cols_local(); i++) - //{ - // for (int j = 0; j < ovlp.num_rows_local(); j++) - // { - // if (ovlp.icol(i) == ovlp.irow(j)) ovlp(j, i) -= 1; - // max_err = std::max(max_err, std::abs(ovlp(j, i))); - // } - //} - - // comm().allreduce(&max_err, 1); - - // if (comm().rank() == 0) - //{ - // printf("k-point: %f %f %f, maximum error of fv_states overlap : %18.10e\n", - // vk_[0], vk_[1], vk_[2], max_err); - //} -} - -} // namespace sirius diff --git a/src/lapw/generate_alm_block.hpp b/src/lapw/generate_alm_block.hpp index 33a2c635b..cf6b26ebb 100644 --- a/src/lapw/generate_alm_block.hpp +++ b/src/lapw/generate_alm_block.hpp @@ -24,13 +24,13 @@ auto generate_alm_block(Simulation_context const& ctx__, int atom_begin__, int n switch (ctx__.processing_unit()) { case sddk::device_t::CPU: { result = sddk::mdarray, 2>(alm__.gkvec().count(), num_mt_aw, - ctx__.mem_pool(sddk::memory_t::host), "alm_block"); + get_memory_pool(sddk::memory_t::host), "alm_block"); break; } case sddk::device_t::GPU: { result = sddk::mdarray, 2>(alm__.gkvec().count(), num_mt_aw, - ctx__.mem_pool(sddk::memory_t::host_pinned), "alm_block"); - result.allocate(ctx__.mem_pool(sddk::memory_t::device)); + get_memory_pool(sddk::memory_t::host_pinned), "alm_block"); + result.allocate(get_memory_pool(sddk::memory_t::device)); break; } } diff --git a/src/linalg/blacs_grid.hpp b/src/linalg/blacs_grid.hpp index b1b709d60..3970f9481 100644 --- a/src/linalg/blacs_grid.hpp +++ b/src/linalg/blacs_grid.hpp @@ -57,7 +57,7 @@ class BLACS_grid BLACS_grid(Communicator const& comm__, int num_ranks_row__, int num_ranks_col__) : comm_(comm__) { - mpi_grid_ = std::unique_ptr(new MPI_grid({num_ranks_row__, num_ranks_col__}, comm_)); + mpi_grid_ = std::make_unique(std::vector({num_ranks_row__, num_ranks_col__}), comm_); rank_map_.resize(num_ranks_row__ * num_ranks_col__); #ifdef SIRIUS_SCALAPACK @@ -152,12 +152,12 @@ class BLACS_grid return mpi_grid_->communicator().cart_rank({irow__, icol__}); } - MPI_grid const& mpi_grid() const + auto const& mpi_grid() const { return *mpi_grid_; } - std::vector const& rank_map() const + auto const& rank_map() const { return rank_map_; } diff --git a/src/linalg/eigenproblem.hpp b/src/linalg/eigenproblem.hpp index 6804f6ddf..550ab0202 100644 --- a/src/linalg/eigenproblem.hpp +++ b/src/linalg/eigenproblem.hpp @@ -46,7 +46,7 @@ class Eigensolver_lapack : public Eigensolver { public: Eigensolver_lapack() - : Eigensolver(ev_solver_t::lapack, nullptr, false, sddk::memory_t::host, sddk::memory_t::host) + : Eigensolver(ev_solver_t::lapack, false, sddk::memory_t::host, sddk::memory_t::host) { } @@ -88,9 +88,11 @@ class Eigensolver_lapack : public Eigensolver lwork = 2 * matrix_size__ + matrix_size__ * matrix_size__; } - auto work = mp_h_.get_unique_ptr(lwork); - auto iwork = mp_h_.get_unique_ptr(liwork); - auto rwork = mp_h_.get_unique_ptr>(lrwork); // only required in complex + auto& mph = get_memory_pool(sddk::memory_t::host); + + auto work = mph.get_unique_ptr(lwork); + auto iwork = mph.get_unique_ptr(liwork); + auto rwork = mph.get_unique_ptr>(lrwork); // only required in complex if (std::is_same::value) { FORTRAN(dsyevd) @@ -154,9 +156,11 @@ class Eigensolver_lapack : public Eigensolver ftn_int m{-1}; ftn_int info; - auto w = mp_h_.get_unique_ptr>(matrix_size__); - auto isuppz = mp_h_.get_unique_ptr(2 * matrix_size__); // for real matrix - auto ifail = mp_h_.get_unique_ptr(matrix_size__); // for complex matrix + auto& mph = get_memory_pool(sddk::memory_t::host); + + auto w = mph.get_unique_ptr>(matrix_size__); + auto isuppz = mph.get_unique_ptr(2 * matrix_size__); // for real matrix + auto ifail = mph.get_unique_ptr(matrix_size__); // for complex matrix ftn_int lda = A__.ld(); ftn_int ldz = Z__.ld(); @@ -189,9 +193,9 @@ class Eigensolver_lapack : public Eigensolver lwork = (nb + 1) * matrix_size__; } - auto work = mp_h_.get_unique_ptr(lwork); - auto iwork = mp_h_.get_unique_ptr(liwork); - auto rwork = mp_h_.get_unique_ptr>(lrwork); // only required in complex + auto work = mph.get_unique_ptr(lwork); + auto iwork = mph.get_unique_ptr(liwork); + auto rwork = mph.get_unique_ptr>(lrwork); // only required in complex if (std::is_same::value) { FORTRAN(dsyevr) @@ -292,9 +296,10 @@ class Eigensolver_lapack : public Eigensolver ftn_int ione{1}; ftn_int m{0}; - auto w = mp_h_.get_unique_ptr>(matrix_size__); + auto& mph = get_memory_pool(sddk::memory_t::host); - auto ifail = mp_h_.get_unique_ptr(matrix_size__); + auto w = mph.get_unique_ptr>(matrix_size__); + auto ifail = mph.get_unique_ptr(matrix_size__); int nb, lwork, liwork; int lrwork = 0; // only required in complex @@ -318,9 +323,9 @@ class Eigensolver_lapack : public Eigensolver liwork = 5 * matrix_size__; } - auto work = mp_h_.get_unique_ptr(lwork); - auto iwork = mp_h_.get_unique_ptr(liwork); - auto rwork = mp_h_.get_unique_ptr>(lrwork); // only required in complex + auto work = mph.get_unique_ptr(lwork); + auto iwork = mph.get_unique_ptr(liwork); + auto rwork = mph.get_unique_ptr>(lrwork); // only required in complex if (std::is_same::value) { FORTRAN(dsygvx) @@ -438,7 +443,7 @@ class Eigensolver_elpa : public Eigensolver //} public: Eigensolver_elpa(int stage__) - : Eigensolver(ev_solver_t::elpa, nullptr, true, sddk::memory_t::host, sddk::memory_t::host) + : Eigensolver(ev_solver_t::elpa, true, sddk::memory_t::host, sddk::memory_t::host) , stage_(stage__) { if (!(stage_ == 1 || stage_ == 2)) { @@ -493,7 +498,9 @@ class Eigensolver_elpa : public Eigensolver elpa_setup(handle); PROFILE_STOP("Eigensolver_elpa|solve_gen|setup"); - auto w = mp_h_.get_unique_ptr(matrix_size__); + auto& mph = get_memory_pool(sddk::memory_t::host); + + auto w = mph.get_unique_ptr(matrix_size__); elpa_generalized_eigenvectors_d(handle, A__.at(sddk::memory_t::host), B__.at(sddk::memory_t::host), w.get(), Z__.at(sddk::memory_t::host), 0, &error); @@ -576,7 +583,9 @@ class Eigensolver_elpa : public Eigensolver elpa_setup(handle); PROFILE_STOP("Eigensolver_elpa|solve_gen|setup"); - auto w = mp_h_.get_unique_ptr(matrix_size__); + auto& mph = get_memory_pool(sddk::memory_t::host); + + auto w = mph.get_unique_ptr(matrix_size__); using CT = double _Complex; elpa_generalized_eigenvectors_dc(handle, (CT*)A__.at(sddk::memory_t::host), (CT*)B__.at(sddk::memory_t::host), @@ -671,7 +680,8 @@ class Eigensolver_elpa : public Eigensolver elpa_setup(handle); PROFILE_STOP("Eigensolver_elpa|solve_std|setup"); - auto w = mp_h_.get_unique_ptr(matrix_size__); + auto& mph = get_memory_pool(sddk::memory_t::host); + auto w = mph.get_unique_ptr(matrix_size__); elpa_eigenvectors_all_host_arrays_d(handle, A__.at(sddk::memory_t::host), w.get(), Z__.at(sddk::memory_t::host), &error); @@ -735,7 +745,8 @@ class Eigensolver_elpa : public Eigensolver elpa_setup(handle); PROFILE_STOP("Eigensolver_elpa|solve_std|setup"); - auto w = mp_h_.get_unique_ptr(matrix_size__); + auto& mph = get_memory_pool(sddk::memory_t::host); + auto w = mph.get_unique_ptr(matrix_size__); using CT = double _Complex; auto A_ptr = A__.size_local() ? (CT*)A__.at(sddk::memory_t::host) : nullptr; @@ -774,7 +785,7 @@ class Eigensolver_elpa : public Eigensolver { public: Eigensolver_elpa(int stage__) - : Eigensolver(ev_solver_t::elpa, nullptr, true, sddk::memory_t::host, sddk::memory_t::host) + : Eigensolver(ev_solver_t::elpa, true, sddk::memory_t::host, sddk::memory_t::host) { } }; @@ -789,7 +800,7 @@ class Eigensolver_scalapack : public Eigensolver public: Eigensolver_scalapack() - : Eigensolver(ev_solver_t::scalapack, nullptr, true, sddk::memory_t::host, sddk::memory_t::host) + : Eigensolver(ev_solver_t::scalapack, true, sddk::memory_t::host, sddk::memory_t::host) { } @@ -834,9 +845,10 @@ class Eigensolver_scalapack : public Eigensolver lrwork = static_cast(rwork1) + 1; liwork = iwork1; - auto work = mp_h_.get_unique_ptr(lwork); - auto rwork = mp_h_.get_unique_ptr>(lrwork); - auto iwork = mp_h_.get_unique_ptr(liwork); + auto& mph = get_memory_pool(sddk::memory_t::host); + auto work = mph.get_unique_ptr(lwork); + auto rwork = mph.get_unique_ptr>(lrwork); + auto iwork = mph.get_unique_ptr(liwork); if (std::is_same>::value) { FORTRAN(pzheevd) @@ -894,8 +906,9 @@ class Eigensolver_scalapack : public Eigensolver lwork = static_cast(work1[0]) + 1; liwork = iwork1[0]; - auto work = mp_h_.get_unique_ptr(lwork); - auto iwork = mp_h_.get_unique_ptr(liwork); + auto& mph = get_memory_pool(sddk::memory_t::host); + auto work = mph.get_unique_ptr(lwork); + auto iwork = mph.get_unique_ptr(liwork); if (std::is_same::value) { FORTRAN(pdsyevd) @@ -944,10 +957,12 @@ class Eigensolver_scalapack : public Eigensolver T d1; ftn_int info{-1}; - auto ifail = mp_h_.get_unique_ptr(matrix_size__); - auto iclustr = mp_h_.get_unique_ptr(2 * A__.blacs_grid().comm().size()); - auto gap = mp_h_.get_unique_ptr(A__.blacs_grid().comm().size()); - auto w = mp_h_.get_unique_ptr(matrix_size__); + auto& mph = get_memory_pool(sddk::memory_t::host); + + auto ifail = mph.get_unique_ptr(matrix_size__); + auto iclustr = mph.get_unique_ptr(2 * A__.blacs_grid().comm().size()); + auto gap = mph.get_unique_ptr(A__.blacs_grid().comm().size()); + auto w = mph.get_unique_ptr(matrix_size__); /* work size query */ T work3[3]; @@ -974,8 +989,8 @@ class Eigensolver_scalapack : public Eigensolver lwork = static_cast(work3[0]) + 4 * (1 << 20); liwork = iwork1; - auto work = mp_h_.get_unique_ptr(lwork); - auto iwork = mp_h_.get_unique_ptr(liwork); + auto work = mph.get_unique_ptr(lwork); + auto iwork = mph.get_unique_ptr(liwork); if (std::is_same::value) { FORTRAN(pdsyevx) @@ -1064,10 +1079,12 @@ class Eigensolver_scalapack : public Eigensolver real_type d1; ftn_int info{-1}; - auto ifail = mp_h_.get_unique_ptr(matrix_size__); - auto iclustr = mp_h_.get_unique_ptr(2 * A__.blacs_grid().comm().size()); - auto gap = mp_h_.get_unique_ptr>(A__.blacs_grid().comm().size()); - auto w = mp_h_.get_unique_ptr>(matrix_size__); + auto& mph = get_memory_pool(sddk::memory_t::host); + + auto ifail = mph.get_unique_ptr(matrix_size__); + auto iclustr = mph.get_unique_ptr(2 * A__.blacs_grid().comm().size()); + auto gap = mph.get_unique_ptr>(A__.blacs_grid().comm().size()); + auto w = mph.get_unique_ptr>(matrix_size__); /* work size query */ T work3[3]; @@ -1099,9 +1116,9 @@ class Eigensolver_scalapack : public Eigensolver lrwork = static_cast(rwork3[0]) + (1 << 16); liwork = iwork1; - auto work = mp_h_.get_unique_ptr(lwork); - auto rwork = mp_h_.get_unique_ptr>(lrwork); - auto iwork = mp_h_.get_unique_ptr(liwork); + auto work = mph.get_unique_ptr(lwork); + auto rwork = mph.get_unique_ptr>(lrwork); + auto iwork = mph.get_unique_ptr(liwork); if (std::is_same>::value) { FORTRAN(pzheevx) @@ -1189,10 +1206,11 @@ class Eigensolver_scalapack : public Eigensolver sddk::linalg_base::descinit(descz, matrix_size__, matrix_size__, Z__.bs_row(), Z__.bs_col(), 0, 0, Z__.blacs_grid().context(), Z__.ld()); - auto ifail = mp_h_.get_unique_ptr(matrix_size__); - auto iclustr = mp_h_.get_unique_ptr(2 * A__.blacs_grid().comm().size()); - auto gap = mp_h_.get_unique_ptr(A__.blacs_grid().comm().size()); - auto w = mp_h_.get_unique_ptr(matrix_size__); + auto& mph = get_memory_pool(sddk::memory_t::host); + auto ifail = mph.get_unique_ptr(matrix_size__); + auto iclustr = mph.get_unique_ptr(2 * A__.blacs_grid().comm().size()); + auto gap = mph.get_unique_ptr(A__.blacs_grid().comm().size()); + auto w = mph.get_unique_ptr(matrix_size__); ftn_int ione{1}; @@ -1223,8 +1241,8 @@ class Eigensolver_scalapack : public Eigensolver lwork = static_cast(work1[0]) + 4 * (1 << 20); - auto work = mp_h_.get_unique_ptr(lwork); - auto iwork = mp_h_.get_unique_ptr(liwork); + auto work = mph.get_unique_ptr(lwork); + auto iwork = mph.get_unique_ptr(liwork); if (std::is_same::value) { FORTRAN(pdsygvx) @@ -1312,10 +1330,12 @@ class Eigensolver_scalapack : public Eigensolver sddk::linalg_base::descinit(descz, matrix_size__, matrix_size__, Z__.bs_row(), Z__.bs_col(), 0, 0, Z__.blacs_grid().context(), Z__.ld()); - auto ifail = mp_h_.get_unique_ptr(matrix_size__); - auto iclustr = mp_h_.get_unique_ptr(2 * A__.blacs_grid().comm().size()); - auto gap = mp_h_.get_unique_ptr>(A__.blacs_grid().comm().size()); - auto w = mp_h_.get_unique_ptr>(matrix_size__); + auto& mph = get_memory_pool(sddk::memory_t::host); + + auto ifail = mph.get_unique_ptr(matrix_size__); + auto iclustr = mph.get_unique_ptr(2 * A__.blacs_grid().comm().size()); + auto gap = mph.get_unique_ptr>(A__.blacs_grid().comm().size()); + auto w = mph.get_unique_ptr>(matrix_size__); ftn_int ione{1}; @@ -1361,9 +1381,9 @@ class Eigensolver_scalapack : public Eigensolver lrwork = 2 * static_cast(rwork3[0]) + 4096; liwork = 2 * iwork1 + 4096; - auto work = mp_h_.get_unique_ptr(lwork); - auto rwork = mp_h_.get_unique_ptr>(lrwork); - auto iwork = mp_h_.get_unique_ptr(liwork); + auto work = mph.get_unique_ptr(lwork); + auto rwork = mph.get_unique_ptr>(lrwork); + auto iwork = mph.get_unique_ptr(liwork); if (std::is_same>::value) { FORTRAN(pzhegvx) @@ -1445,7 +1465,7 @@ class Eigensolver_scalapack : public Eigensolver { public: Eigensolver_scalapack() - : Eigensolver(ev_solver_t::scalapack, nullptr, true, sddk::memory_t::host, sddk::memory_t::host) + : Eigensolver(ev_solver_t::scalapack, true, sddk::memory_t::host, sddk::memory_t::host) { } }; @@ -1457,7 +1477,7 @@ class Eigensolver_magma: public Eigensolver public: Eigensolver_magma() - : Eigensolver(ev_solver_t::magma, nullptr, false, sddk::memory_t::host_pinned, sddk::memory_t::host) + : Eigensolver(ev_solver_t::magma, false, sddk::memory_t::host_pinned, sddk::memory_t::host) { } @@ -1471,7 +1491,9 @@ class Eigensolver_magma: public Eigensolver int lda = A__.ld(); int ldb = B__.ld(); - auto w = mp_h_.get_unique_ptr(matrix_size__); + auto& mph = get_memory_pool(sddk::memory_t::host); + auto& mphp = get_memory_pool(sddk::memory_t::host_pinned); + auto w = mph.get_unique_ptr(matrix_size__); int m; int info; @@ -1480,8 +1502,8 @@ class Eigensolver_magma: public Eigensolver int liwork; magma_dsyevdx_getworksize(matrix_size__, magma_get_parallel_numthreads(), 1, &lwork, &liwork); - auto h_work = mp_hp_.get_unique_ptr(lwork); - auto iwork = mp_h_.get_unique_ptr(liwork); + auto h_work = mphp.get_unique_ptr(lwork); + auto iwork = mph.get_unique_ptr(liwork); magma_dsygvdx_2stage(1, MagmaVec, MagmaRangeI, MagmaLower, matrix_size__, A__.at(sddk::memory_t::host), lda, B__.at(sddk::memory_t::host), ldb, 0.0, 0.0, 1, nev__, &m, w.get(), h_work.get(), lwork, @@ -1518,7 +1540,9 @@ class Eigensolver_magma: public Eigensolver int lda = A__.ld(); int ldb = B__.ld(); - auto w = mp_h_.get_unique_ptr(matrix_size__); + auto& mph = get_memory_pool(sddk::memory_t::host); + auto& mphp = get_memory_pool(sddk::memory_t::host_pinned); + auto w = mph.get_unique_ptr(matrix_size__); int m; int info; @@ -1528,9 +1552,9 @@ class Eigensolver_magma: public Eigensolver int liwork; magma_zheevdx_getworksize(matrix_size__, magma_get_parallel_numthreads(), 1, &lwork, &lrwork, &liwork); - auto h_work = mp_hp_.get_unique_ptr(lwork); - auto rwork = mp_hp_.get_unique_ptr(lrwork); - auto iwork = mp_h_.get_unique_ptr(liwork); + auto h_work = mphp.get_unique_ptr(lwork); + auto rwork = mphp.get_unique_ptr(lrwork); + auto iwork = mph.get_unique_ptr(liwork); magma_zhegvdx_2stage(1, MagmaVec, MagmaRangeI, MagmaLower, matrix_size__, reinterpret_cast(A__.at(sddk::memory_t::host)), lda, @@ -1568,16 +1592,19 @@ class Eigensolver_magma: public Eigensolver return Eigensolver_lapack().solve(matrix_size__, nev__, A__, eval__, Z__); } + auto& mph = get_memory_pool(sddk::memory_t::host); + auto& mphp = get_memory_pool(sddk::memory_t::host_pinned); + int nt = omp_get_max_threads(); int lda = A__.ld(); - auto w = mp_h_.get_unique_ptr(matrix_size__); + auto w = mph.get_unique_ptr(matrix_size__); int lwork; int liwork; magma_dsyevdx_getworksize(matrix_size__, magma_get_parallel_numthreads(), 1, &lwork, &liwork); - auto h_work = mp_hp_.get_unique_ptr(lwork); - auto iwork = mp_h_.get_unique_ptr(liwork); + auto h_work = mphp.get_unique_ptr(lwork); + auto iwork = mph.get_unique_ptr(liwork); int info; int m; @@ -1612,7 +1639,9 @@ class Eigensolver_magma: public Eigensolver int nt = omp_get_max_threads(); int lda = A__.ld(); - auto w = mp_h_.get_unique_ptr(matrix_size__); + auto& mph = get_memory_pool(sddk::memory_t::host); + auto& mphp = get_memory_pool(sddk::memory_t::host_pinned); + auto w = mph.get_unique_ptr(matrix_size__); int info, m; @@ -1621,9 +1650,9 @@ class Eigensolver_magma: public Eigensolver int liwork; magma_zheevdx_getworksize(matrix_size__, magma_get_parallel_numthreads(), 1, &lwork, &lrwork, &liwork); - auto h_work = mp_hp_.get_unique_ptr(lwork); - auto rwork = mp_hp_.get_unique_ptr(lrwork); - auto iwork = mp_h_.get_unique_ptr(liwork); + auto h_work = mphp.get_unique_ptr(lwork); + auto rwork = mphp.get_unique_ptr(lrwork); + auto iwork = mph.get_unique_ptr(liwork); magma_zheevdx_2stage(MagmaVec, MagmaRangeI, MagmaLower, matrix_size__, reinterpret_cast(A__.at(sddk::memory_t::host)), lda, 0.0, 0.0, 1, @@ -1656,7 +1685,7 @@ class Eigensolver_magma_gpu: public Eigensolver public: Eigensolver_magma_gpu() - : Eigensolver(ev_solver_t::magma, nullptr, false, sddk::memory_t::host_pinned, sddk::memory_t::device) + : Eigensolver(ev_solver_t::magma, false, sddk::memory_t::host_pinned, sddk::memory_t::device) { } @@ -1804,7 +1833,9 @@ class Eigensolver_magma_gpu: public Eigensolver int nt = omp_get_max_threads(); int lda = A__.ld(); - auto w = mp_h_.get_unique_ptr(matrix_size__); + auto& mph = get_memory_pool(sddk::memory_t::host); + auto& mphp = get_memory_pool(sddk::memory_t::host_pinned); + auto w = mph.get_unique_ptr(matrix_size__); int info, m; @@ -1814,11 +1845,11 @@ class Eigensolver_magma_gpu: public Eigensolver magma_zheevdx_getworksize(matrix_size__, magma_get_parallel_numthreads(), 1, &lwork, &lrwork, &liwork); int llda = matrix_size__ + 32; - auto z_work = mp_hp_.get_unique_ptr(llda * matrix_size__); + auto z_work = mphp.get_unique_ptr(llda * matrix_size__); - auto h_work = mp_hp_.get_unique_ptr(lwork); - auto rwork = mp_hp_.get_unique_ptr(lrwork); - auto iwork = mp_h_.get_unique_ptr(liwork); + auto h_work = mphp.get_unique_ptr(lwork); + auto rwork = mphp.get_unique_ptr(lrwork); + auto iwork = mph.get_unique_ptr(liwork); magma_zheevdx_gpu(MagmaVec, MagmaRangeI, MagmaLower, matrix_size__, reinterpret_cast(A__.at(sddk::memory_t::device)), lda, 0.0, 0.0, 1, @@ -1854,7 +1885,7 @@ class Eigensolver_magma: public Eigensolver { public: Eigensolver_magma() - : Eigensolver(ev_solver_t::magma, nullptr, false, sddk::memory_t::host_pinned, sddk::memory_t::host) + : Eigensolver(ev_solver_t::magma, false, sddk::memory_t::host_pinned, sddk::memory_t::host) { } }; @@ -1863,7 +1894,7 @@ class Eigensolver_magma_gpu: public Eigensolver { public: Eigensolver_magma_gpu() - : Eigensolver(ev_solver_t::magma, nullptr, false, sddk::memory_t::host_pinned, sddk::memory_t::device) + : Eigensolver(ev_solver_t::magma, false, sddk::memory_t::host_pinned, sddk::memory_t::device) { } }; @@ -1873,8 +1904,8 @@ class Eigensolver_magma_gpu: public Eigensolver class Eigensolver_cuda: public Eigensolver { public: - Eigensolver_cuda(sddk::memory_pool* mpd__) - : Eigensolver(ev_solver_t::cusolver, mpd__, false, sddk::memory_t::host_pinned, sddk::memory_t::device) + Eigensolver_cuda() + : Eigensolver(ev_solver_t::cusolver, false, sddk::memory_t::host_pinned, sddk::memory_t::device) { } @@ -1885,7 +1916,8 @@ class Eigensolver_cuda: public Eigensolver cublasFillMode_t uplo = CUBLAS_FILL_MODE_LOWER; cusolverEigRange_t range = CUSOLVER_EIG_RANGE_I; - auto w = mp_d_->get_unique_ptr>(matrix_size__); + auto& mpd = get_memory_pool(sddk::memory_t::device); + auto w = mpd.get_unique_ptr>(matrix_size__); acc::copyin(A__.at(sddk::memory_t::device), A__.ld(), A__.at(sddk::memory_t::host), A__.ld(), matrix_size__, matrix_size__); int lwork; @@ -1911,10 +1943,10 @@ class Eigensolver_cuda: public Eigensolver A__.ld(), vl, vu, 1, nev__, &h_meig, reinterpret_cast(w.get()), &lwork)); } - auto work = mp_d_->get_unique_ptr(lwork); + auto work = mpd.get_unique_ptr(lwork); int info; - auto dinfo = mp_d_->get_unique_ptr(1); + auto dinfo = mpd.get_unique_ptr(1); if (std::is_same::value) { CALL_CUSOLVER(cusolverDnDsyevdx, (cusolver::cusolver_handle(), jobz, range, uplo, matrix_size__, reinterpret_cast(A__.at(sddk::memory_t::device)), A__.ld(), vl, vu, 1, nev__, &h_meig, @@ -1976,7 +2008,8 @@ class Eigensolver_cuda: public Eigensolver cublasFillMode_t uplo = CUBLAS_FILL_MODE_LOWER; cusolverEigRange_t range = CUSOLVER_EIG_RANGE_I; - auto w = mp_d_->get_unique_ptr>(matrix_size__); + auto& mpd = get_memory_pool(sddk::memory_t::device); + auto w = mpd.get_unique_ptr>(matrix_size__); acc::copyin(A__.at(sddk::memory_t::device), A__.ld(), A__.at(sddk::memory_t::host), A__.ld(), matrix_size__, matrix_size__); acc::copyin(B__.at(sddk::memory_t::device), B__.ld(), B__.at(sddk::memory_t::host), B__.ld(), matrix_size__, matrix_size__); @@ -2007,10 +2040,10 @@ class Eigensolver_cuda: public Eigensolver vl, vu, 1, nev__, &h_meig, reinterpret_cast(w.get()), &lwork)); } - auto work = mp_d_->get_unique_ptr(lwork); + auto work = mpd.get_unique_ptr(lwork); int info; - auto dinfo = mp_d_->get_unique_ptr(1); + auto dinfo = mpd.get_unique_ptr(1); if (std::is_same::value) { CALL_CUSOLVER(cusolverDnDsygvdx, (cusolver::cusolver_handle(), itype, jobz, range, uplo, matrix_size__, reinterpret_cast(A__.at(sddk::memory_t::device)), A__.ld(), @@ -2099,8 +2132,8 @@ class Eigensolver_cuda: public Eigensolver class Eigensolver_cuda: public Eigensolver { public: - Eigensolver_cuda(sddk::memory_pool* mpd__) - : Eigensolver(ev_solver_t::cusolver, mpd__, false, sddk::memory_t::host_pinned, sddk::memory_t::device) + Eigensolver_cuda() + : Eigensolver(ev_solver_t::cusolver, false, sddk::memory_t::host_pinned, sddk::memory_t::device) { } }; diff --git a/src/linalg/eigensolver.cpp b/src/linalg/eigensolver.cpp index caca715f5..03c640710 100644 --- a/src/linalg/eigensolver.cpp +++ b/src/linalg/eigensolver.cpp @@ -26,7 +26,7 @@ #include "eigenproblem.hpp" std::unique_ptr -Eigensolver_factory(std::string name__, sddk::memory_pool* mpd__) +Eigensolver_factory(std::string name__) { std::transform(name__.begin(), name__.end(), name__.begin(), ::tolower); @@ -57,7 +57,7 @@ Eigensolver_factory(std::string name__, sddk::memory_pool* mpd__) break; } case ev_solver_t::cusolver: { - ptr = new Eigensolver_cuda(mpd__); + ptr = new Eigensolver_cuda(); break; } default: { diff --git a/src/linalg/eigensolver.hpp b/src/linalg/eigensolver.hpp index 075593b53..b75ac65fd 100644 --- a/src/linalg/eigensolver.hpp +++ b/src/linalg/eigensolver.hpp @@ -83,12 +83,6 @@ class Eigensolver ev_solver_t ev_solver_type_; /// Common error message. const std::string error_msg_not_implemented = "solver is not implemented"; - /// Memory pool for CPU work buffers. - sddk::memory_pool mp_h_; - /// Memory pool for CPU work buffers using pinned memory. - sddk::memory_pool mp_hp_; - /// Memory pool for GPU work buffers. - std::shared_ptr mp_d_{nullptr}; /// True if solver is MPI parallel. bool is_parallel_{false}; /// Type of host memory needed for the solver. @@ -101,20 +95,13 @@ class Eigensolver public: /// Constructor. - Eigensolver(ev_solver_t type__, sddk::memory_pool* mpd__, bool is_parallel__, sddk::memory_t host_memory_t__, + Eigensolver(ev_solver_t type__, bool is_parallel__, sddk::memory_t host_memory_t__, sddk::memory_t data_memory_t__) : ev_solver_type_(type__) - , mp_h_(sddk::memory_pool(sddk::memory_t::host)) - , mp_hp_(sddk::memory_pool(sddk::memory_t::host_pinned)) , is_parallel_(is_parallel__) , host_memory_t_(host_memory_t__) , data_memory_t_(data_memory_t__) { - if (mpd__) { - mp_d_ = std::shared_ptr(mpd__, [](sddk::memory_pool*){}); - } else { - mp_d_ = std::shared_ptr(new sddk::memory_pool(sddk::memory_t::device)); - } } /// Destructor. @@ -270,6 +257,6 @@ class Eigensolver }; std::unique_ptr -Eigensolver_factory(std::string name__, sddk::memory_pool* mpd__); +Eigensolver_factory(std::string name__); #endif diff --git a/src/linalg/inverse_sqrt.hpp b/src/linalg/inverse_sqrt.hpp index c2389322c..674858cd6 100644 --- a/src/linalg/inverse_sqrt.hpp +++ b/src/linalg/inverse_sqrt.hpp @@ -14,8 +14,7 @@ template inline auto inverse_sqrt(sddk::dmatrix& A__, int N__) { - auto solver = (A__.comm().size() == 1) ? Eigensolver_factory("lapack", nullptr) : - Eigensolver_factory("scalapack", nullptr); + auto solver = (A__.comm().size() == 1) ? Eigensolver_factory("lapack") : Eigensolver_factory("scalapack"); std::unique_ptr> Z; std::unique_ptr> B; diff --git a/src/mpi/communicator.hpp b/src/mpi/communicator.hpp index ed0f12ba8..5e1332385 100644 --- a/src/mpi/communicator.hpp +++ b/src/mpi/communicator.hpp @@ -276,6 +276,17 @@ class Communicator MPI_Comm mpi_comm_raw_{MPI_COMM_NULL}; /// Smart pointer to allocated MPI communicator. std::shared_ptr mpi_comm_; + /// Store communicator's rank. + int rank_{-1}; + /// Store communicator's size. + int size_{-1}; + + void init() + { + assert(mpi_comm_raw_ != MPI_COMM_NULL); + CALL_MPI(MPI_Comm_rank, (mpi_comm_raw_, &rank_)); + CALL_MPI(MPI_Comm_size, (mpi_comm_raw_, &size_)); + } public: /// Default constructor. @@ -287,6 +298,15 @@ class Communicator explicit Communicator(MPI_Comm mpi_comm__) : mpi_comm_raw_(mpi_comm__) { + init(); + } + + /// Constructor for new communicator. + explicit Communicator(std::shared_ptr comm__) + : mpi_comm_raw_(*comm__) + , mpi_comm_(comm__) + { + init(); } /// MPI initialization. @@ -340,38 +360,30 @@ class Communicator inline Communicator cart_create(int ndims__, int const* dims__, int const* periods__) const { - Communicator new_comm; - new_comm.mpi_comm_ = std::shared_ptr(new MPI_Comm, mpi_comm_deleter()); - CALL_MPI(MPI_Cart_create, (mpi_comm(), ndims__, dims__, periods__, 0, new_comm.mpi_comm_.get())); - new_comm.mpi_comm_raw_ = *new_comm.mpi_comm_; - return new_comm; + auto comm_sptr = std::shared_ptr(new MPI_Comm, mpi_comm_deleter()); + CALL_MPI(MPI_Cart_create, (this->mpi_comm(), ndims__, dims__, periods__, 0, comm_sptr.get())); + return Communicator(comm_sptr); } inline Communicator cart_sub(int const* remain_dims__) const { - Communicator new_comm; - new_comm.mpi_comm_ = std::shared_ptr(new MPI_Comm, mpi_comm_deleter()); - CALL_MPI(MPI_Cart_sub, (mpi_comm(), remain_dims__, new_comm.mpi_comm_.get())); - new_comm.mpi_comm_raw_ = *new_comm.mpi_comm_; - return new_comm; + auto comm_sptr = std::shared_ptr(new MPI_Comm, mpi_comm_deleter()); + CALL_MPI(MPI_Cart_sub, (this->mpi_comm(), remain_dims__, comm_sptr.get())); + return Communicator(comm_sptr); } inline Communicator split(int color__) const { - Communicator new_comm; - new_comm.mpi_comm_ = std::shared_ptr(new MPI_Comm, mpi_comm_deleter()); - CALL_MPI(MPI_Comm_split, (mpi_comm(), color__, rank(), new_comm.mpi_comm_.get())); - new_comm.mpi_comm_raw_ = *new_comm.mpi_comm_; - return new_comm; + auto comm_sptr = std::shared_ptr(new MPI_Comm, mpi_comm_deleter()); + CALL_MPI(MPI_Comm_split, (this->mpi_comm(), color__, rank(), comm_sptr.get())); + return Communicator(comm_sptr); } inline Communicator duplicate() const { - Communicator new_comm; - new_comm.mpi_comm_ = std::shared_ptr(new MPI_Comm, mpi_comm_deleter()); - CALL_MPI(MPI_Comm_dup, (mpi_comm(), new_comm.mpi_comm_.get())); - new_comm.mpi_comm_raw_ = *new_comm.mpi_comm_; - return new_comm; + auto comm_sptr = std::shared_ptr(new MPI_Comm, mpi_comm_deleter()); + CALL_MPI(MPI_Comm_dup, (this->mpi_comm(), comm_sptr.get())); + return Communicator(comm_sptr); } /// Mapping between Fortran and SIRIUS MPI communicators. @@ -387,7 +399,7 @@ class Communicator } /// Return raw MPI communicator handler. - MPI_Comm mpi_comm() const + inline MPI_Comm mpi_comm() const // TODO: rename to mpi_comm_native or native() { return mpi_comm_raw_; } @@ -411,21 +423,13 @@ class Communicator /// Rank of MPI process inside communicator. inline int rank() const { - assert(mpi_comm() != MPI_COMM_NULL); - - int r; - CALL_MPI(MPI_Comm_rank, (mpi_comm(), &r)); - return r; + return rank_; } /// Size of the communicator (number of ranks). inline int size() const { - assert(mpi_comm() != MPI_COMM_NULL); - - int s; - CALL_MPI(MPI_Comm_size, (mpi_comm(), &s)); - return s; + return size_; } /// Rank of MPI process inside communicator with associated Cartesian partitioning. diff --git a/src/multi_cg/multi_cg.hpp b/src/multi_cg/multi_cg.hpp index a8713d91c..a31782b38 100644 --- a/src/multi_cg/multi_cg.hpp +++ b/src/multi_cg/multi_cg.hpp @@ -32,8 +32,6 @@ #include #include #include "SDDK/wave_functions.hpp" -#include "SDDK/wf_inner.hpp" -#include "SDDK/wf_trans.hpp" #include "band/residuals.hpp" #include "hamiltonian/hamiltonian.hpp" #include "hamiltonian/non_local_operator.hpp" @@ -43,7 +41,7 @@ namespace sirius { namespace cg { template -void repack(std::vector &data, std::vector const&ids) { +void repack(std::vector &data, std::vector const&ids) { for (size_t i = 0; i < ids.size(); ++i) { data[i] = data[ids[i]]; } @@ -56,7 +54,7 @@ std::vector> multi_cg( ) { auto n = X.cols(); - U.fill(0); + U.zero(); // Use R for residual, we modify the right-hand side B in-place. auto &R = B; @@ -73,7 +71,7 @@ std::vector> multi_cg( // When vectors converge we move them to the front, but we can't really do // that with X, so we have to keep track of where is what. - auto ids = std::vector(n); + auto ids = std::vector(n); std::iota(ids.begin(), ids.end(), 0); size_t num_unconverged = n; @@ -99,7 +97,7 @@ std::vector> multi_cg( residual_history[ids[i]].push_back(std::sqrt(std::abs(rhos[i]))); } - auto not_converged = std::vector{}; + auto not_converged = std::vector{}; for (size_t i = 0; i < num_unconverged; ++i) { if (std::abs(rhos[i]) > tol * tol) { not_converged.push_back(i); @@ -166,51 +164,58 @@ std::vector> multi_cg( namespace lr { struct Wave_functions_wrap { - sddk::Wave_functions *x; + wf::Wave_functions *x; - typedef double_complex value_type; + typedef std::complex value_type; - void fill(double_complex val) { - x->pw_coeffs(0).prime() = [=](){ - return val; - }; + void zero() + { + x->zero(sddk::memory_t::host); } - int cols() const { - return x->num_wf(); + int cols() const + { + return x->num_wf().get(); } - void block_dot(Wave_functions_wrap const &y, std::vector &rhos, size_t num_unconverged) { - auto result = x->dot(sddk::device_t::CPU, sddk::spin_range(0), *y.x, static_cast(num_unconverged)); - for (int i = 0; i < static_cast(num_unconverged); ++i) - rhos[i] = result(i); + void block_dot(Wave_functions_wrap const& y__, std::vector& rhos__, size_t N__) + { + rhos__ = wf::inner_diag(sddk::memory_t::host, *x, *y__.x, wf::spin_range(0), + wf::num_bands(N__)); } - void repack(std::vector const &ids) { - size_t j = 0; - for (auto i : ids) { + void repack(std::vector const& ids__) + { + int j{0}; + for (auto i : ids__) { if (j != i) { - x->copy_from(*x, 1, 0, i, 0, j); + wf::copy(sddk::memory_t::host, *x, wf::spin_index(0), wf::band_range(i, i + 1), + *x, wf::spin_index(0), wf::band_range(j, j + 1)); } - ++j; } } - void copy(Wave_functions_wrap const &y, size_t num) { - x->copy_from(*y.x, static_cast(num), 0, 0, 0, 0); + void copy(Wave_functions_wrap const &y__, size_t N__) + { + wf::copy(sddk::memory_t::host, *y__.x, wf::spin_index(0), wf::band_range(0, N__), + *x, wf::spin_index(0), wf::band_range(0, N__)); } - void block_xpby(Wave_functions_wrap const &y, std::vector const &alphas, size_t num) { - x->xpby(sddk::device_t::CPU, sddk::spin_range(0), *y.x, alphas, static_cast(num)); + void block_xpby(Wave_functions_wrap const &y__, std::vector const &alphas, int N__) { + std::vector ones(N__, 1.0); + wf::axpby(sddk::memory_t::host, wf::spin_range(0), wf::band_range(0, N__), ones.data(), y__.x, alphas.data(), x); } - void block_axpy_scatter(std::vector const &alphas, Wave_functions_wrap const &y, std::vector const &ids, size_t num) { - x->axpy_scatter(sddk::device_t::CPU, sddk::spin_range(0), alphas, *y.x, ids, static_cast(num)); + void block_axpy_scatter(std::vector> const& alphas__, Wave_functions_wrap const &y__, + std::vector const &idx__, int n__) + { + wf::axpy_scatter>(sddk::memory_t::host, wf::spin_range(0), alphas__, y__.x, idx__, x, n__); } - void block_axpy(std::vector const &alphas, Wave_functions_wrap const &y, size_t num) { - x->axpy(sddk::device_t::CPU, sddk::spin_range(0), alphas, *y.x, static_cast(num)); + void block_axpy(std::vector> const &alphas__, Wave_functions_wrap const &y__, int N__) { + std::vector ones(N__, 1.0); + wf::axpby(sddk::memory_t::host, wf::spin_range(0), wf::band_range(0, N__), alphas__.data(), y__.x, ones.data(), x); } }; @@ -221,7 +226,7 @@ struct Identity_preconditioner { x.copy(y, num_active); } - void repack(std::vector const &ids) { + void repack(std::vector const &ids) { num_active = ids.size(); } }; @@ -237,15 +242,15 @@ struct Smoothed_diagonal_preconditioner { x.copy(y, num_active); sirius::apply_preconditioner( sddk::memory_t::host, - sddk::spin_range(0), - static_cast(num_active), + wf::spin_range(0), + wf::num_bands(num_active), *x.x, H_diag, S_diag, eigvals); } - void repack(std::vector const &ids) { + void repack(std::vector const &ids) { num_active = ids.size(); for (size_t i = 0; i < ids.size(); ++i) { eigvals[i] = eigvals[ids[i]]; @@ -258,10 +263,10 @@ struct Linear_response_operator { sirius::Simulation_context &ctx; sirius::Hamiltonian_k &Hk; std::vector min_eigenvals; - sddk::Wave_functions * Hphi; - sddk::Wave_functions * Sphi; - sddk::Wave_functions * evq; - sddk::Wave_functions * tmp; + wf::Wave_functions * Hphi; + wf::Wave_functions * Sphi; + wf::Wave_functions * evq; + wf::Wave_functions * tmp; double alpha_pv; sddk::dmatrix overlap; @@ -270,10 +275,10 @@ struct Linear_response_operator { sirius::Simulation_context &ctx, sirius::Hamiltonian_k & Hk, std::vector const &eigvals, - sddk::Wave_functions * Hphi, - sddk::Wave_functions * Sphi, - sddk::Wave_functions * evq, - sddk::Wave_functions * tmp, + wf::Wave_functions * Hphi, + wf::Wave_functions * Sphi, + wf::Wave_functions * evq, + wf::Wave_functions * tmp, double alpha_pv) : ctx(ctx), Hk(Hk), min_eigenvals(eigvals), Hphi(Hphi), Sphi(Sphi), evq(evq), tmp(tmp), alpha_pv(alpha_pv), overlap(ctx.num_bands(), ctx.num_bands()) @@ -290,7 +295,7 @@ struct Linear_response_operator { } } - void repack(std::vector const &ids) { + void repack(std::vector const &ids) { for (size_t i = 0; i < ids.size(); ++i) { min_eigenvals[i] = min_eigenvals[ids[i]]; } @@ -301,55 +306,52 @@ struct Linear_response_operator { void multiply(double alpha, Wave_functions_wrap x, double beta, Wave_functions_wrap y, int num_active) { // Hphi = H * x, Sphi = S * x Hk.apply_h_s( - sddk::spin_range(0), - 0, - num_active, + wf::spin_range(0), + wf::band_range(0, num_active), *x.x, Hphi, Sphi ); + std::vector ones(num_active, 1.0); + // effectively tmp := (H - e * S) * x, as an axpy, modifying Hphi. - Hphi->axpy(sddk::device_t::CPU, sddk::spin_range(0), min_eigenvals, *Sphi, num_active); - tmp->copy_from(*Hphi, num_active, 0, 0, 0, 0); + wf::axpby(sddk::memory_t::host, wf::spin_range(0), wf::band_range(0, num_active), + min_eigenvals.data(), Sphi, ones.data(), Hphi); + wf::copy(sddk::memory_t::host, *Hphi, wf::spin_index(0), wf::band_range(0, num_active), *tmp, + wf::spin_index(0), wf::band_range(0, num_active)); // Projector, add alpha_pv * (S * (evq * (evq' * (S * x)))) // overlap := evq' * (S * x) - sddk::inner( - ctx.spla_context(), - sddk::spin_range(0), - *evq, 0, ctx.num_bands(), - *Sphi, 0, num_active, - overlap, 0, 0); + wf::inner(ctx.spla_context(), sddk::memory_t::host, wf::spin_range(0), *evq, wf::band_range(0, ctx.num_bands()), + *Sphi, wf::band_range(0, num_active), overlap, 0, 0); // Hphi := evq * overlap - sddk::transform( + wf::transform( ctx.spla_context(), - 0, 1.0, - {evq}, 0, ctx.num_bands(), + sddk::memory_t::host, overlap, 0, 0, - 0.0, {Hphi}, 0, num_active); + 1.0, *evq, wf::spin_index(0), wf::band_range(0, ctx.num_bands()), + 0.0, *Hphi, wf::spin_index(0), wf::band_range(0, num_active)); // Sphi := S * Hphi = S * (evq * (evq' * (S * x))) - sirius::apply_S_operator( - ctx.processing_unit(), - sddk::spin_range(0), - 0, - num_active, + sirius::apply_S_operator>( + sddk::memory_t::host, + wf::spin_range(0), wf::band_range(0, num_active), Hk.kp().beta_projectors(), - *Hphi, - &Hk.H0().Q(), - *Sphi); + *Hphi, &Hk.H0().Q(), *Sphi); // tmp := alpha_pv * Sphi + tmp = (H - e * S) * x + alpha_pv * (S * (evq * (evq' * (S * x)))) - { - // okay, the block-scalar api is a bit awkward... - std::vector alpha_pvs(num_active, alpha_pv); - tmp->axpy(sddk::device_t::CPU, sddk::spin_range(0), alpha_pvs, *Sphi, num_active); - } + std::vector alpha_pvs(num_active, alpha_pv); + wf::axpby(sddk::memory_t::host, wf::spin_range(0), wf::band_range(0, num_active), + alpha_pvs.data(), Sphi, ones.data(), tmp); // y[:, i] <- alpha * tmp + beta * y[:, i] - y.x->axpby(sddk::device_t::CPU, sddk::spin_range(0), alpha, *tmp, beta, num_active); + std::vector alphas(num_active, alpha); + std::vector betas(num_active, beta); + wf::axpby(sddk::memory_t::host, wf::spin_range(0), wf::band_range(0, num_active), + alphas.data(), tmp, betas.data(), y.x); + //y.x->axpby(sddk::device_t::CPU, sddk::spin_range(0), alpha, *tmp, beta, num_active); } }; diff --git a/src/nlcglib/adaptor.cpp b/src/nlcglib/adaptor.cpp index 82dfe6227..fe8a11a1e 100644 --- a/src/nlcglib/adaptor.cpp +++ b/src/nlcglib/adaptor.cpp @@ -1,3 +1,5 @@ +#include "memory.hpp" +#include "wave_functions.hpp" #ifdef SIRIUS_NLCGLIB #include @@ -6,65 +8,67 @@ #include "hamiltonian/local_operator.hpp" #include "hamiltonian/hamiltonian.hpp" #include "dft/energy.hpp" -#include "SDDK/wf_inner.hpp" using namespace nlcglib; namespace sirius { -std::shared_ptr make_vector(const std::vector>>& wfct, - const Simulation_context& ctx, - const K_point_set& kset, - nlcglib::memory_type memory = nlcglib::memory_type::none) +template +std::shared_ptr +make_vector(const std::vector& wfct, const Simulation_context& ctx, const K_point_set& kset, nlcglib::memory_type memory = nlcglib::memory_type::none) { - std::map memtype = {{sddk::memory_t::device, nlcglib::memory_type::device}, - {sddk::memory_t::host, nlcglib::memory_type::host}, - {sddk::memory_t::host_pinned, nlcglib::memory_type::host}}; - std::map memtype_lookup = {{nlcglib::memory_type::none, sddk::memory_t::none}, - {nlcglib::memory_type::device, sddk::memory_t::device}, - {nlcglib::memory_type::host, sddk::memory_t::host}, - {nlcglib::memory_type::host, sddk::memory_t::host_pinned}}; + std::map memtype = { + {sddk::memory_t::device, nlcglib::memory_type::device}, + {sddk::memory_t::host, nlcglib::memory_type::host}, + {sddk::memory_t::host_pinned, nlcglib::memory_type::host}}; + std::map memtype_lookup = { + {nlcglib::memory_type::none, sddk::memory_t::none}, + {nlcglib::memory_type::device, sddk::memory_t::device}, + {nlcglib::memory_type::host, sddk::memory_t::host}, + {nlcglib::memory_type::host, sddk::memory_t::host_pinned}}; sddk::memory_t target_memory = memtype_lookup.at(memory); if (target_memory == sddk::memory_t::none) { - target_memory = ctx.preferred_memory_t(); + target_memory = ctx.processing_unit_memory_t(); } std::vector data; std::vector> kpoint_indices; // sddk::memory_t preferred_memory = ctx.preferred_memory_t(); - int num_spins = ctx.num_spins(); - int nb = ctx.num_bands(); + int num_spins = ctx.num_spins(); + int nb = ctx.num_bands(); for (auto i = 0u; i < wfct.size(); ++i) { auto gidk = kset.spl_num_kpoints(i); // global k-point index for (int ispn = 0; ispn < num_spins; ++ispn) { - auto& array = wfct[i]->pw_coeffs(ispn).prime(); - int lda = array.size(0); - MPI_Comm comm = wfct[i]->comm().mpi_comm(); + auto& array = wfct[i]->pw_coeffs(wf::spin_index(ispn)); + int lda = array.size(0); + MPI_Comm comm = wfct[i]->comm().mpi_comm(); // check that wfct has been allocated if (is_device_memory(target_memory)) { // make sure that array is on device - if (! array.on_device()) { + if (!array.on_device()) { throw std::runtime_error("Error: expected device storage, but got nullptr"); } } kpoint_indices.emplace_back(std::make_pair(gidk, ispn)); - data.emplace_back(std::array{1, lda}, /* stride */ - std::array{lda, nb}, /* size */ - array.at(target_memory), /* pointer */ - memtype.at(target_memory), - comm /* mpi communicator */); + data.emplace_back(std::array{1, lda}, /* stride */ + std::array{lda, nb}, /* size */ + array.at(target_memory), /* pointer */ + memtype.at(target_memory), comm /* mpi communicator */); } } return std::make_shared(std::move(data), std::move(kpoint_indices), kset.comm().mpi_comm()); -} // namespace sirius +} + + Matrix::buffer_t Matrix::get(int i) { return data[i]; } -const Matrix::buffer_t Matrix::get(int i) const +const Matrix::buffer_t +Matrix::get(int i) const { return data[i]; } @@ -82,50 +86,37 @@ Energy::Energy(K_point_set& kset, Density& density, Potential& potential) sphis.resize(nk); cphis.resize(nk); for (int i = 0; i < nk; ++i) { - auto global_kpoint_index = kset.spl_num_kpoints(i); - auto& kp = *kset.get(global_kpoint_index); - int num_wf = ctx.num_bands(); - sddk::memory_t preferred_memory_t = ctx.preferred_memory_t(); - int num_spins = ctx.num_spins(); + auto global_kpoint_index = kset.spl_num_kpoints(i); + auto& kp = *kset.get(global_kpoint_index); + sddk::memory_t preferred_memory_t = ctx.processing_unit_memory_t(); + auto num_mag_dims = wf::num_mag_dims(ctx.num_mag_dims()); + auto num_bands = wf::num_bands(ctx.num_bands()); // make a new wf for Hamiltonian apply... - hphis[i] = std::make_shared>(kp.gkvec_partition(), num_wf, preferred_memory_t, num_spins); - hphis[i]->allocate(sddk::spin_range(num_spins), ctx.preferred_memory_t()); - sphis[i] = std::make_shared>(kp.gkvec_partition(), num_wf, preferred_memory_t, num_spins); - sphis[i]->allocate(sddk::spin_range(num_spins), ctx.preferred_memory_t()); - cphis[i] = kp.spinor_wave_functions_ptr(); + hphis[i] = std::make_shared>(kp.gkvec_sptr(), num_mag_dims, num_bands, preferred_memory_t); + hphis[i]->allocate(preferred_memory_t); + sphis[i] = std::make_shared>(kp.gkvec_sptr(), num_mag_dims, num_bands, preferred_memory_t); + sphis[i]->allocate(preferred_memory_t); + cphis[i] = &kp.spinor_wave_functions(); // allocate on device - if (is_device_memory(ctx.preferred_memory_t())) { + if (is_device_memory(preferred_memory_t)) { const int num_sc = (ctx.num_mag_dims() == 3) ? 2 : 1; - auto& mpd = ctx.mem_pool(sddk::memory_t::device); + auto& mpd = sddk::get_memory_pool(sddk::memory_t::device); for (int ispn = 0; ispn < num_sc; ispn++) { - hphis[i]->pw_coeffs(ispn).allocate(mpd); - sphis[i]->pw_coeffs(ispn).allocate(mpd); + hphis[i]->pw_coeffs(wf::spin_index(ispn)).allocate(mpd); + sphis[i]->pw_coeffs(wf::spin_index(ispn)).allocate(mpd); } } } // need to allocate wavefunctions on GPU } -void Energy::compute() +void +Energy::compute() { - auto& ctx = kset.ctx(); + auto& ctx = kset.ctx(); int num_spins = ctx.num_spins(); int num_bands = ctx.num_bands(); - int nk = kset.spl_num_kpoints().local_size(); - - // // // transfer from device to host (only if data on GPU is present) - // if(is_device_memory(ctx.preferred_memory_t())) { - // for (int ik = 0; ik < nk; ++ik) { - // for (int ispn = 0; ispn < num_spins; ++ispn) { - // int num_wf = cphis[ik]->num_wf(); - // if (cphis[ik]->pw_coeffs(ispn).prime().on_device()) { - // // std::cout << "copying wfc from DEVICE -> HOST" << "\n"; - // cphis[ik]->pw_coeffs(ispn).copy_to(memory_t::host, 0, num_wf); - // } - - // } - // } - // } + int nk = kset.spl_num_kpoints().local_size(); density.generate(kset, ctx.use_symmetry(), true /* add core */, true /* transform to rg */); @@ -133,34 +124,38 @@ void Energy::compute() /* compute H@X and new band energies */ auto H0 = Hamiltonian0(potential, true); + + auto proc_mem_t = ctx.processing_unit_memory_t(); + // apply Hamiltonian for (int i = 0; i < nk; ++i) { auto& kp = *kset.get(kset.spl_num_kpoints(i)); std::vector band_energies(num_bands); - if (is_device_memory(ctx.preferred_memory_t())) { - auto& mpd = ctx.mem_pool(sddk::memory_t::device); + auto mem_guard = cphis[i]->memory_guard(proc_mem_t); + // TODO change + if (is_device_memory(ctx.processing_unit_memory_t())) { + auto& mpd = get_memory_pool(sddk::memory_t::device); for (int ispn = 0; ispn < num_spins; ispn++) { - cphis[i]->pw_coeffs(ispn).allocate(mpd); + cphis[i]->pw_coeffs(wf::spin_index(ispn)).allocate(mpd); // copy to device int num_wf = cphis[i]->num_wf(); - cphis[i]->pw_coeffs(ispn).copy_to(sddk::memory_t::device, 0, num_wf); + cphis[i]->pw_coeffs(wf::spin_index(ispn)).copy_to(sddk::memory_t::device, 0, num_wf); } } - assert(cphis[i] == kp.spinor_wave_functions_ptr()); + assert(cphis[i] == &kp.spinor_wave_functions()); apply_hamiltonian(H0, kp, *hphis[i], kp.spinor_wave_functions(), sphis[i]); - // compute band energies + // compute band energies aka diag() for (int ispn = 0; ispn < num_spins; ++ispn) { for (int jj = 0; jj < num_bands; ++jj) { sddk::dmatrix> dmat(1, 1, sddk::memory_t::host); dmat.allocate(sddk::memory_t::device); - sddk::inner(ctx.spla_context(), sddk::spin_range(ispn), - /* bra */ kp.spinor_wave_functions(), jj, 1, - /* ket */ *hphis[i], jj, 1, - /* out */ dmat, 0, 0); - // deal with memory... - // assert(std::abs(dmat(0, 0).imag()) < 1e-10); + wf::band_range bandr{jj, jj + 1}; + wf::inner(ctx.spla_context(), proc_mem_t, wf::spin_range(ispn), + /* bra */ kp.spinor_wave_functions(), bandr, + /* ket */ *hphis[i], bandr, + /*result*/ dmat, 0, 0); kp.band_energy(jj, ispn, dmat(0, 0).real()); } } @@ -172,43 +167,48 @@ void Energy::compute() this->etot = total_energy(ctx, kset, density, potential, eewald); } - -int Energy::occupancy() +int +Energy::occupancy() { return kset.ctx().max_occupancy(); } -int Energy::nelectrons() +int +Energy::nelectrons() { return kset.unit_cell().num_electrons(); } -std::shared_ptr Energy::get_hphi() +std::shared_ptr +Energy::get_hphi() { return make_vector(this->hphis, this->kset.ctx(), this->kset); } -std::shared_ptr Energy::get_sphi() +std::shared_ptr +Energy::get_sphi() { return make_vector(this->sphis, this->kset.ctx(), this->kset); } -std::shared_ptr Energy::get_C(nlcglib::memory_type memory = nlcglib::memory_type::none) +std::shared_ptr +Energy::get_C(nlcglib::memory_type memory = nlcglib::memory_type::none) { return make_vector(this->cphis, this->kset.ctx(), this->kset, memory); } -std::shared_ptr Energy::get_fn() +std::shared_ptr +Energy::get_fn() { auto nk = kset.spl_num_kpoints().local_size(); const int ns = kset.ctx().num_spins(); - int nbands = kset.ctx().num_bands(); + int nbands = kset.ctx().num_bands(); std::vector> fn; std::vector> kindices; for (int ik = 0; ik < nk; ++ik) { // global k-point index auto gidk = kset.spl_num_kpoints(ik); - auto& kp = *kset.get(gidk); + auto& kp = *kset.get(gidk); for (int ispn = 0; ispn < ns; ++ispn) { std::vector fn_local(nbands); for (int i = 0; i < nbands; ++i) { @@ -221,21 +221,22 @@ std::shared_ptr Energy::get_fn() return std::make_shared(fn, kindices, kset.comm().mpi_comm()); } -void Energy::set_fn(const std::vector>& keys, const std::vector>& fn) +void +Energy::set_fn(const std::vector>& keys, const std::vector>& fn) { - const int nbands = kset.ctx().num_bands(); - #ifndef NDEBUG - const int ns = kset.ctx().num_spins(); - auto nk = kset.spl_num_kpoints().local_size(); + const int nbands = kset.ctx().num_bands(); +#ifndef NDEBUG + const int ns = kset.ctx().num_spins(); + auto nk = kset.spl_num_kpoints().local_size(); const double max_occ = ns == 1 ? 2.0 : 1.0; - #endif +#endif - assert(static_cast(fn.size()) == nk*ns); + assert(static_cast(fn.size()) == nk * ns); for (size_t iloc = 0; iloc < fn.size(); ++iloc) { // global k-point index - int gidk= keys[iloc].first; - int ispn = keys[iloc].second; - auto& kp = *kset.get(gidk); + int gidk = keys[iloc].first; + int ispn = keys[iloc].second; + auto& kp = *kset.get(gidk); const auto& fn_loc = fn[iloc]; assert(static_cast(fn_loc.size()) == nbands); for (int i = 0; i < nbands; ++i) { @@ -246,7 +247,8 @@ void Energy::set_fn(const std::vector>& keys, const std::vec kset.sync_band(); } -std::shared_ptr Energy::get_ek() +std::shared_ptr +Energy::get_ek() { auto nk = kset.spl_num_kpoints().local_size(); const int ns = kset.ctx().num_spins(); @@ -269,7 +271,8 @@ std::shared_ptr Energy::get_ek() return std::make_shared(ek, kindices, kset.comm().mpi_comm()); } -std::shared_ptr Energy::get_gkvec_ekin() +std::shared_ptr +Energy::get_gkvec_ekin() { auto nk = kset.spl_num_kpoints().local_size(); const int ns = kset.ctx().num_spins(); @@ -281,7 +284,7 @@ std::shared_ptr Energy::get_gkvec_ekin() auto& kp = *kset.get(gidk); for (int ispn = 0; ispn < ns; ++ispn) { int gkvec_count = kp.gkvec().count(); - auto& gkvec = kp.gkvec(); + auto& gkvec = kp.gkvec(); std::vector gkvec_local(gkvec_count); for (int i = 0; i < gkvec_count; ++i) { gkvec_local[i] = gkvec.gkvec_cart(i).length(); @@ -293,9 +296,10 @@ std::shared_ptr Energy::get_gkvec_ekin() return std::make_shared(gkvec_cart, kindices, kset.comm().mpi_comm()); } -std::shared_ptr Energy::get_kpoint_weights() +std::shared_ptr +Energy::get_kpoint_weights() { - auto nk = kset.spl_num_kpoints().local_size(); + auto nk = kset.spl_num_kpoints().local_size(); const int ns = kset.ctx().num_spins(); std::vector weights; std::vector> kindices; @@ -313,19 +317,19 @@ std::shared_ptr Energy::get_kpoint_weights() return std::make_shared(weights, kindices, kset.comm().mpi_comm()); } -double Energy::get_total_energy() +double +Energy::get_total_energy() { return etot; } -void Energy::print_info() const +void +Energy::print_info() const { - auto& ctx = kset.ctx(); + auto& ctx = kset.ctx(); auto& unit_cell = kset.unit_cell(); auto result_mag = density.get_magnetisation(); - // auto total_mag = std::get<0>(result_mag); - // auto it_mag = std::get<1>(result_mag); auto mt_mag = std::get<2>(result_mag); if (ctx.num_mag_dims()) { @@ -346,13 +350,15 @@ void Energy::print_info() const } } -Array1d::buffer_t Array1d::get(int i) +Array1d::buffer_t +Array1d::get(int i) { // call 1d constructor return buffer_t(data[i].size(), data[i].data(), nlcglib::memory_type::host); } -const Array1d::buffer_t Array1d::get(int i) const +const Array1d::buffer_t +Array1d::get(int i) const { // call 1d constructor return buffer_t(data[i].size(), const_cast(data[i].data()), nlcglib::memory_type::host); diff --git a/src/nlcglib/adaptor.hpp b/src/nlcglib/adaptor.hpp index 3da766013..c9abdbf1b 100644 --- a/src/nlcglib/adaptor.hpp +++ b/src/nlcglib/adaptor.hpp @@ -58,12 +58,12 @@ class Matrix : public nlcglib::MatrixBaseZ MPI_Comm mpi_comm; }; - /// TODO: Array1d owns data... class Array1d : public nlcglib::VectorBaseZ { public: - Array1d(const std::vector>& data, const std::vector& indices, MPI_Comm mpi_comm = MPI_COMM_SELF) + Array1d(const std::vector>& data, const std::vector& indices, + MPI_Comm mpi_comm = MPI_COMM_SELF) : data(data) , indices(indices) , mpi_comm(mpi_comm) @@ -111,16 +111,14 @@ class Array1d : public nlcglib::VectorBaseZ class Scalar : public nlcglib::ScalarBaseZ { public: - Scalar(const std::vector& data__, const std::vector& indices__, - MPI_Comm mpi_comm = MPI_COMM_SELF) + Scalar(const std::vector& data__, const std::vector& indices__, MPI_Comm mpi_comm = MPI_COMM_SELF) : data(data__) , indices(indices__) , mpi_comm(mpi_comm) { } - Scalar(std::vector&& data__, std::vector&& indices__, - MPI_Comm mpi_comm = MPI_COMM_SELF) + Scalar(std::vector&& data__, std::vector&& indices__, MPI_Comm mpi_comm = MPI_COMM_SELF) : data{std::forward(data__)} , indices{std::forward(indices__)} , mpi_comm(mpi_comm) @@ -187,12 +185,16 @@ class Energy : public nlcglib::EnergyBase K_point_set& kset; Density& density; Potential& potential; - std::vector>> hphis; - std::vector>> sphis; - std::vector>> cphis; + /// H*psi + std::vector>> hphis; + /// S*spi + std::vector>> sphis; + /// original wfct + std::vector*> cphis; double etot{std::nan("1")}; }; + } // namespace sirius #endif /* NLCGLIB_ADAPTOR_H */ diff --git a/src/nlcglib/apply_hamiltonian.hpp b/src/nlcglib/apply_hamiltonian.hpp index 9335f277b..38719c953 100644 --- a/src/nlcglib/apply_hamiltonian.hpp +++ b/src/nlcglib/apply_hamiltonian.hpp @@ -10,8 +10,9 @@ namespace sirius { -void apply_hamiltonian(Hamiltonian0& H0, K_point& kp, sddk::Wave_functions& wf_out, - sddk::Wave_functions& wf, std::shared_ptr>& swf) +inline void +apply_hamiltonian(Hamiltonian0& H0, K_point& kp, wf::Wave_functions& wf_out, + wf::Wave_functions& wf, std::shared_ptr>& swf) { ///////////////////////////////////////////////////////////// // // TODO: Hubbard needs manual call to copy to device // // @@ -24,37 +25,16 @@ void apply_hamiltonian(Hamiltonian0& H0, K_point& kp, sddk::Wave } auto H = H0(kp); auto& ctx = H0.ctx(); -// #ifdef SIRIUS_GPU -// if (is_device_memory(ctx.preferred_memory_t())) { -// auto& mpd = ctx.mem_pool(memory_t::device); -// for (int ispn = 0; ispn < num_sc; ++ispn) { -// wf_out.pw_coeffs(ispn).allocate(mpd); -// wf.pw_coeffs(ispn).allocate(mpd); -// wf.pw_coeffs(ispn).copy_to(memory_t::device, 0, num_wf); -// } -// } -// #endif /* apply H to all wave functions */ int N = 0; int n = num_wf; for (int ispn_step = 0; ispn_step < ctx.num_spinors(); ispn_step++) { // sping_range: 2 for non-collinear magnetism, otherwise ispn_step - auto spin_range = sddk::spin_range((ctx.num_mag_dims() == 3) ? 2 : ispn_step); - H.apply_h_s>(spin_range, N, n, wf, &wf_out, swf.get()); + auto spin_range = wf::spin_range((ctx.num_mag_dims() == 3) ? 2 : ispn_step); + H.apply_h_s>(spin_range, wf::band_range(N, n), wf, &wf_out, swf.get()); } -// #ifdef SIRIUS_GPU -// if (is_device_memory(ctx.preferred_memory_t())) { -// for (int ispn = 0; ispn < num_sc; ++ispn) { -// wf_out.pw_coeffs(ispn).copy_to(memory_t::host, 0, n); -// if (swf) { -// swf->pw_coeffs(ispn).copy_to(memory_t::host, 0, n); -// } -// } -// } -// #endif // SIRIUS_GPU } - -} // sirius +} // namespace sirius #endif /* APPLY_HAMILTONIAN_H */ diff --git a/src/potential/generate_d_operator_matrix.cpp b/src/potential/generate_d_operator_matrix.cpp index 092267231..891cb8a26 100644 --- a/src/potential/generate_d_operator_matrix.cpp +++ b/src/potential/generate_d_operator_matrix.cpp @@ -46,7 +46,7 @@ void Potential::generate_D_operator_matrix() auto spl_ngv_loc = ctx_.split_gvec_local(); if (ctx_.unit_cell().atom_type(0).augment()) { - ctx_.augmentation_op(0).prepare(stream_id(0), &ctx_.mem_pool(sddk::memory_t::device)); + ctx_.augmentation_op(0).prepare(stream_id(0), &get_memory_pool(sddk::memory_t::device)); } for (int iat = 0; iat < unit_cell_.num_atom_types(); iat++) { auto& atom_type = unit_cell_.atom_type(iat); @@ -56,7 +56,7 @@ void Potential::generate_D_operator_matrix() if (ctx_.processing_unit() == sddk::device_t::GPU) { acc::sync_stream(stream_id(0)); if (iat + 1 != unit_cell_.num_atom_types() && ctx_.unit_cell().atom_type(iat + 1).augment()) { - ctx_.augmentation_op(iat + 1).prepare(stream_id(0), &ctx_.mem_pool(sddk::memory_t::device)); + ctx_.augmentation_op(iat + 1).prepare(stream_id(0), &get_memory_pool(sddk::memory_t::device)); } } @@ -76,15 +76,15 @@ void Potential::generate_D_operator_matrix() } continue; } - sddk::matrix d_tmp(nbf * (nbf + 1) / 2, atom_type.num_atoms(), ctx_.mem_pool(sddk::memory_t::host)); + sddk::matrix d_tmp(nbf * (nbf + 1) / 2, atom_type.num_atoms(), get_memory_pool(sddk::memory_t::host)); if (ctx_.processing_unit() == sddk::device_t::GPU) { - d_tmp.allocate(ctx_.mem_pool(sddk::memory_t::device)); + d_tmp.allocate(get_memory_pool(sddk::memory_t::device)); } ctx_.print_memory_usage(__FILE__, __LINE__); for (int iv = 0; iv < ctx_.num_mag_dims() + 1; iv++) { - sddk::matrix veff_a(2 * spl_ngv_loc.local_size(), atom_type.num_atoms(), ctx_.mem_pool(sddk::memory_t::host)); + sddk::matrix veff_a(2 * spl_ngv_loc.local_size(), atom_type.num_atoms(), get_memory_pool(sddk::memory_t::host)); auto la = sddk::linalg_t::blas; auto mem = sddk::memory_t::host; @@ -94,7 +94,7 @@ void Potential::generate_D_operator_matrix() la = sddk::linalg_t::gpublas; mem = sddk::memory_t::device; d_tmp.zero(sddk::memory_t::device); - veff_a.allocate(ctx_.mem_pool(sddk::memory_t::device)); + veff_a.allocate(get_memory_pool(sddk::memory_t::device)); } /* split a large loop over G-vectors into blocks */ @@ -123,7 +123,7 @@ void Potential::generate_D_operator_matrix() acc::sync_stream(stream_id(1)); /* copy plane wave coefficients of effective potential to GPU */ sddk::mdarray veff(&component(iv).f_pw_local(g_begin), spl_ngv_loc.local_size(ib)); - veff.allocate(ctx_.mem_pool(sddk::memory_t::device)).copy_to(sddk::memory_t::device); + veff.allocate(get_memory_pool(sddk::memory_t::device)).copy_to(sddk::memory_t::device); #if defined(SIRIUS_GPU) mul_veff_with_phase_factors_gpu(atom_type.num_atoms(), spl_ngv_loc.local_size(ib), veff.at(sddk::memory_t::device), diff --git a/src/potential/generate_pw_coeffs.cpp b/src/potential/generate_pw_coeffs.cpp index 444d89c1f..0107ef45c 100644 --- a/src/potential/generate_pw_coeffs.cpp +++ b/src/potential/generate_pw_coeffs.cpp @@ -32,7 +32,7 @@ void Potential::generate_pw_coefs() double sq_alpha_half = 0.5 * std::pow(speed_of_light, -2); - int gv_count = ctx_.gvec_partition().gvec_count_fft(); + int gv_count = ctx_.gvec_fft().gvec_count_fft(); auto& fft = ctx_.spfft(); @@ -47,7 +47,7 @@ void Potential::generate_pw_coefs() return ctx_.theta(ir) / std::pow(M, 2); }); fft.forward(SPFFT_PU_HOST, reinterpret_cast(&fpw_fft[0]), SPFFT_FULL_SCALING); - ctx_.gvec_partition().gather_pw_global(&fpw_fft[0], &rm2_inv_pw_[0]); + ctx_.gvec_fft().gather_pw_global(&fpw_fft[0], &rm2_inv_pw_[0]); } case relativity_t::zora: { spfft_input(fft, [&](int ir) @@ -56,7 +56,7 @@ void Potential::generate_pw_coefs() return ctx_.theta(ir) / M; }); fft.forward(SPFFT_PU_HOST, reinterpret_cast(&fpw_fft[0]), SPFFT_FULL_SCALING); - ctx_.gvec_partition().gather_pw_global(&fpw_fft[0], &rm_inv_pw_[0]); + ctx_.gvec_fft().gather_pw_global(&fpw_fft[0], &rm_inv_pw_[0]); } default: { spfft_input(fft, [&](int ir) @@ -64,7 +64,7 @@ void Potential::generate_pw_coefs() return effective_potential().f_rg(ir) * ctx_.theta(ir); }); fft.forward(SPFFT_PU_HOST, reinterpret_cast(&fpw_fft[0]), SPFFT_FULL_SCALING); - ctx_.gvec_partition().gather_pw_global(&fpw_fft[0], &veff_pw_[0]); + ctx_.gvec_fft().gather_pw_global(&fpw_fft[0], &veff_pw_[0]); } } diff --git a/src/potential/poisson.cpp b/src/potential/poisson.cpp index aaddb8b6c..61d0e7993 100644 --- a/src/potential/poisson.cpp +++ b/src/potential/poisson.cpp @@ -71,15 +71,15 @@ void Potential::poisson_add_pseudo_pw(sddk::mdarray& qmt__, switch (ctx_.processing_unit()) { case sddk::device_t::CPU: { - auto& mp = ctx_.mem_pool(sddk::memory_t::host); + auto& mp = get_memory_pool(sddk::memory_t::host); pf = sddk::mdarray(ngv, na, mp); qa = sddk::mdarray(lmmax, na, mp); qapf = sddk::mdarray(lmmax, ngv, mp); break; } case sddk::device_t::GPU: { - auto& mp = ctx_.mem_pool(sddk::memory_t::host); - auto& mpd = ctx_.mem_pool(sddk::memory_t::device); + auto& mp = get_memory_pool(sddk::memory_t::host); + auto& mpd = get_memory_pool(sddk::memory_t::device); /* allocate on GPU */ pf = sddk::mdarray(nullptr, ngv, na); pf.allocate(mpd); diff --git a/src/potential/potential.cpp b/src/potential/potential.cpp index bb0732cea..46c97b3c8 100644 --- a/src/potential/potential.cpp +++ b/src/potential/potential.cpp @@ -85,13 +85,13 @@ Potential::Potential(Simulation_context& ctx__) if (this->is_gradient_correction()) { int nsigma = (ctx_.num_spins() == 1) ? 1 : 3; for (int i = 0; i < nsigma ; i++) { - vsigma_[i] = std::unique_ptr(new spf(ctx_.spfft(), ctx_.gvec_partition())); + vsigma_[i] = std::unique_ptr(new spf(ctx_.spfft(), ctx_.gvec_fft_sptr())); } } if (!ctx_.full_potential()) { - local_potential_ = std::unique_ptr(new spf(ctx_.spfft(), ctx_.gvec_partition())); - dveff_ = std::unique_ptr(new spf(ctx_.spfft(), ctx_.gvec_partition())); + local_potential_ = std::unique_ptr(new spf(ctx_.spfft(), ctx_.gvec_fft_sptr())); + dveff_ = std::unique_ptr(new spf(ctx_.spfft(), ctx_.gvec_fft_sptr())); dveff_->zero(); } diff --git a/src/potential/xc.cpp b/src/potential/xc.cpp index 9a33fde88..72b183b4e 100644 --- a/src/potential/xc.cpp +++ b/src/potential/xc.cpp @@ -39,7 +39,7 @@ void Potential::xc_rg_nonmagnetic(Density const& density__) bool const use_2nd_deriv{false}; - auto& gvp = ctx_.gvec_partition(); + auto gvp = ctx_.gvec_fft_sptr(); bool is_gga = is_gradient_correction(); @@ -128,7 +128,7 @@ void Potential::xc_rg_nonmagnetic(Density const& density__) Smooth_periodic_function vsigma; if (is_gga) { - vsigma = Smooth_periodic_function(ctx_.spfft(), ctx_.gvec_partition()); + vsigma = Smooth_periodic_function(ctx_.spfft(), ctx_.gvec_fft_sptr()); vsigma_[0]->zero(); } @@ -322,9 +322,9 @@ void Potential::xc_rg_magnetic(Density const& density__) Smooth_periodic_function vsigma_dd; if (is_gga) { - vsigma_uu = Smooth_periodic_function(ctx_.spfft(), ctx_.gvec_partition()); - vsigma_ud = Smooth_periodic_function(ctx_.spfft(), ctx_.gvec_partition()); - vsigma_dd = Smooth_periodic_function(ctx_.spfft(), ctx_.gvec_partition()); + vsigma_uu = Smooth_periodic_function(ctx_.spfft(), ctx_.gvec_fft_sptr()); + vsigma_ud = Smooth_periodic_function(ctx_.spfft(), ctx_.gvec_fft_sptr()); + vsigma_dd = Smooth_periodic_function(ctx_.spfft(), ctx_.gvec_fft_sptr()); for (int i = 0; i < 3; i++) { vsigma_[i]->zero(); } @@ -391,8 +391,8 @@ void Potential::xc_rg_magnetic(Density const& density__) vsigma_[2]->f_rg(ir) += vsigma_dd.f_rg(ir); } - Smooth_periodic_vector_function up_gradrho_vsigma(ctx_.spfft(), ctx_.gvec_partition()); - Smooth_periodic_vector_function dn_gradrho_vsigma(ctx_.spfft(), ctx_.gvec_partition()); + Smooth_periodic_vector_function up_gradrho_vsigma(ctx_.spfft(), ctx_.gvec_fft_sptr()); + Smooth_periodic_vector_function dn_gradrho_vsigma(ctx_.spfft(), ctx_.gvec_fft_sptr()); for (int x: {0, 1, 2}) { for(int ir = 0; ir < num_points; ir++) { up_gradrho_vsigma[x].f_rg(ir) = 2 * grad_rho_up[x].f_rg(ir) * vsigma_uu.f_rg(ir) + grad_rho_dn[x].f_rg(ir) * vsigma_ud.f_rg(ir); diff --git a/src/sirius.hpp b/src/sirius.hpp index 2f4cd1fe7..80913cb0b 100644 --- a/src/sirius.hpp +++ b/src/sirius.hpp @@ -173,7 +173,11 @@ inline void finalize(bool call_mpi_fin__ = true, bool reset_device__ = true, boo // must be called before device is reset splablas::reset_handle(); + sddk::get_memory_pool(sddk::memory_t::host).clear(); + if (acc::num_devices()) { + sddk::get_memory_pool(sddk::memory_t::host_pinned).clear(); + sddk::get_memory_pool(sddk::memory_t::device).clear(); #if defined(SIRIUS_GPU) accblas::destroy_stream_handles(); #endif diff --git a/src/testing.hpp b/src/testing.hpp index 4b7895ce9..7f4887598 100644 --- a/src/testing.hpp +++ b/src/testing.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2013-2020 Anton Kozhevnikov, Thomas Schulthess +// Copyright (c) 2013-2022 Anton Kozhevnikov, Thomas Schulthess // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are permitted provided that @@ -30,9 +30,12 @@ #include #include #include "SDDK/dmatrix.hpp" +#include "SDDK/geometry3d.hpp" +#include "SDDK/wave_functions.hpp" #include "utils/profiler.hpp" #include "linalg/linalg.hpp" #include "utils/cmd_args.hpp" +#include "context/simulation_context.hpp" namespace sirius { @@ -104,7 +107,8 @@ class Measurement: public std::vector }; template -sddk::dmatrix random_symmetric(int N__, int bs__, sddk::BLACS_grid const& blacs_grid__) +inline auto +random_symmetric(int N__, int bs__, sddk::BLACS_grid const& blacs_grid__) { PROFILE("random_symmetric"); @@ -140,7 +144,8 @@ sddk::dmatrix random_symmetric(int N__, int bs__, sddk::BLACS_grid const& bla } template -sddk::dmatrix random_positive_definite(int N__, int bs__, sddk::BLACS_grid const& blacs_grid__) +inline auto +random_positive_definite(int N__, int bs__, sddk::BLACS_grid const& blacs_grid__) { PROFILE("random_positive_definite"); @@ -168,6 +173,100 @@ sddk::dmatrix random_positive_definite(int N__, int bs__, sddk::BLACS_grid co return B; } +inline auto +create_simulation_context(nlohmann::json const& conf__, geometry3d::matrix3d L__, int num_atoms__, +std::vector> coord__, bool add_vloc__, bool add_dion__) +{ + auto ctx = std::make_unique(conf__); + + ctx->unit_cell().set_lattice_vectors(L__); + if (num_atoms__) { + auto& atype = ctx->unit_cell().add_atom_type("Cu"); + + if (ctx->cfg().parameters().electronic_structure_method() == "full_potential_lapwlo") { + + } else { + /* set pseudo charge */ + atype.zn(11); + /* set radial grid */ + atype.set_radial_grid(radial_grid_t::lin_exp, 1000, 0.0, 100.0, 6); + /* cutoff at ~1 a.u. */ + int icut = atype.radial_grid().index_of(1.0); + double rcut = atype.radial_grid(icut); + /* create beta radial function */ + std::vector beta(icut + 1); + std::vector beta1(icut + 1); + for (int l = 0; l <= 2; l++) { + for (int i = 0; i <= icut; i++) { + double x = atype.radial_grid(i); + beta[i] = utils::confined_polynomial(x, rcut, l, l + 1, 0); + beta1[i] = utils::confined_polynomial(x, rcut, l, l + 2, 0); + } + /* add radial function for l */ + atype.add_beta_radial_function(l, beta); + atype.add_beta_radial_function(l, beta1); + } + + std::vector ps_wf(atype.radial_grid().num_points()); + for (int l = 0; l <= 2; l++) { + for (int i = 0; i < atype.radial_grid().num_points(); i++) { + double x = atype.radial_grid(i); + ps_wf[i] = std::exp(-x) * std::pow(x, l); + } + /* add radial function for l */ + atype.add_ps_atomic_wf(3, sirius::experimental::angular_momentum(l), ps_wf); + } + + /* set local part of potential */ + std::vector vloc(atype.radial_grid().num_points(), 0); + if (add_vloc__) { + for (int i = 0; i < atype.radial_grid().num_points(); i++) { + double x = atype.radial_grid(i); + vloc[i] = -atype.zn() / (std::exp(-x * (x + 1)) + x); + } + } + atype.local_potential(vloc); + /* set Dion matrix */ + int nbf = atype.num_beta_radial_functions(); + sddk::matrix dion(nbf, nbf); + dion.zero(); + if (add_dion__) { + for (int i = 0; i < nbf; i++) { + dion(i, i) = -10.0; + } + } + atype.d_mtrx_ion(dion); + /* set atomic density */ + std::vector arho(atype.radial_grid().num_points()); + for (int i = 0; i < atype.radial_grid().num_points(); i++) { + double x = atype.radial_grid(i); + arho[i] = 2 * atype.zn() * std::exp(-x * x) * x; + } + atype.ps_total_charge_density(arho); + } + + for (auto v: coord__) { + ctx->unit_cell().add_atom("Cu", v, {0, 0, 1}); + } + } + ctx->initialize(); + return ctx; +} + +template +inline void +randomize(wf::Wave_functions& wf__) +{ + for (int i = 0; i < wf__.num_wf().get(); i++) { + for (int s = 0; s < wf__.num_sc().get(); s++) { + auto ptr = wf__.at(sddk::memory_t::host, 0, wf::spin_index(s), wf::band_index(i)); + for (int j = 0; j < wf__.ld(); j++) { + ptr[j] = utils::random(); + } + } + } +} + } #endif diff --git a/src/unit_cell/atom.hpp b/src/unit_cell/atom.hpp index 7e665492e..19fc0af67 100644 --- a/src/unit_cell/atom.hpp +++ b/src/unit_cell/atom.hpp @@ -30,10 +30,10 @@ #include "function3d/spheric_function.hpp" #include "utils/profiler.hpp" -namespace sirius { - using namespace geometry3d; +namespace sirius { + /// Data and methods specific to the actual atom in the unit cell. class Atom { diff --git a/src/unit_cell/atom_symmetry_class.cpp b/src/unit_cell/atom_symmetry_class.cpp index 4d36d2283..694da50af 100644 --- a/src/unit_cell/atom_symmetry_class.cpp +++ b/src/unit_cell/atom_symmetry_class.cpp @@ -376,10 +376,10 @@ Atom_symmetry_class::check_lo_linear_independence(double tol__) sddk::mdarray ovlp(num_lo_descriptors(), num_lo_descriptors()); loprod >> ovlp; - auto stdevp = Eigensolver_factory("lapack", nullptr); + auto stdevp = Eigensolver_factory("lapack"); std::vector loprod_eval(num_lo_descriptors()); - sddk::dmatrix loprod_evec(num_lo_descriptors(), num_lo_descriptors()); + sddk::dmatrix loprod_evec(num_lo_descriptors(), num_lo_descriptors()); stdevp->solve(num_lo_descriptors(), loprod, &loprod_eval[0], loprod_evec); diff --git a/src/unit_cell/unit_cell.hpp b/src/unit_cell/unit_cell.hpp index 70a72570b..58c797756 100644 --- a/src/unit_cell/unit_cell.hpp +++ b/src/unit_cell/unit_cell.hpp @@ -193,7 +193,7 @@ class Unit_cell void add_atom(const std::string label, vector3d position, vector3d vector_field); /// Add new atom without vector field to the list of atom types. - void add_atom(const std::string label, std::vector position) + void add_atom(const std::string label, vector3d position) { add_atom(label, position, {0, 0, 0}); } diff --git a/src/utils/env.hpp b/src/utils/env.hpp index 862349383..b8612589c 100644 --- a/src/utils/env.hpp +++ b/src/utils/env.hpp @@ -31,11 +31,11 @@ #include #include -namespace utils { +namespace env { /// Check for environment variable and return a pointer to a stored value if found or a null-pointer if not. template -inline T const* get_env(std::string const& name__) +inline T const* get_value_ptr(std::string const& name__) { static std::map map_name; if (map_name.count(name__) == 0) { @@ -51,6 +51,67 @@ inline T const* get_env(std::string const& name__) return map_name[name__]; } -} // namespace utils +inline bool +print_performance() +{ + auto val = get_value_ptr("SIRIUS_PRINT_PERFORMANCE"); + return val && *val; +} + +inline bool +print_checksum() +{ + auto val = get_value_ptr("SIRIUS_PRINT_CHECKSUM"); + return val && *val; +} + +inline bool +print_mpi_layout() +{ + auto val = get_value_ptr("SIRIUS_PRINT_MPI_LAYOUT"); + return val && *val; +} + +inline bool +print_memory_usage() +{ + auto val = get_value_ptr("SIRIUS_PRINT_MEMORY_USAGE"); + return val && *val; +} + +inline std::string +save_config() +{ + auto val = get_value_ptr("SIRIUS_SAVE_CONFIG"); + if (val) { + return *val; + } else { + return ""; + } +} + +inline std::string +get_ev_solver() +{ + auto val = get_value_ptr("SIRIUS_EV_SOLVER"); + if (val) { + return *val; + } else { + return ""; + } +} + +inline int +get_verbosity() +{ + auto verb_lvl = env::get_value_ptr("SIRIUS_VERBOSITY"); + if (verb_lvl) { + return *verb_lvl; + } else { + return 0; + } +} + +} // namespace env #endif diff --git a/src/utils/utils.hpp b/src/utils/utils.hpp index a50ea18e1..86cd67134 100644 --- a/src/utils/utils.hpp +++ b/src/utils/utils.hpp @@ -373,9 +373,12 @@ inline T zero_if_not_complex(std::complex x__) }; /// Simple random number generator. -inline uint32_t rnd() +inline uint32_t rnd(bool reset = false) { static uint32_t a = 123456; + if (reset) { + a = 123456; + } a = (a ^ 61) ^ (a >> 16); a = a + (a << 3); a = a ^ (a >> 4); diff --git a/verification/test16/sirius.json b/verification/test16/sirius.json index f9fa214ed..07974d370 100644 --- a/verification/test16/sirius.json +++ b/verification/test16/sirius.json @@ -6,7 +6,8 @@ "!std_evp_solver_name" : "lapack", "!gen_evp_solver_name" : "lapack", "verbosity" : 2, - "print_forces" : false + "print_forces" : false, + "!print_checksum" : true }, "parameters" : { diff --git a/verification/test25/Ni.json b/verification/test25/Ni.json new file mode 100644 index 000000000..b115cfec3 --- /dev/null +++ b/verification/test25/Ni.json @@ -0,0 +1,41249 @@ +{ + "pseudo_potential": { + "header": { + "element": "Ni", + "pseudo_type": "US", + "core_correction": true, + "z_valence": 18.0, + "l_max": 2, + "mesh_size": 865, + "number_of_wfc": 5, + "number_of_proj": 6, + "original_upf_file": "ni_pbe_v1.4.uspp.F.UPF" + }, + "radial_grid": [ + 0.0, + 1.51324318143e-06, + 3.05235314314e-06, + 4.61777204164e-06, + 6.20994959149e-06, + 7.8293431945e-06, + 9.4764180711e-06, + 1.1151647394e-05, + 1.28555124243e-05, + 1.45885026493e-05, + 1.63511159236e-05, + 1.81438586119e-05, + 1.99672457344e-05, + 2.18218011151e-05, + 2.37080575318e-05, + 2.56265568695e-05, + 2.75778502758e-05, + 2.95624983197e-05, + 3.15810711521e-05, + 3.36341486699e-05, + 3.57223206825e-05, + 3.78461870815e-05, + 4.00063580124e-05, + 4.22034540506e-05, + 4.44381063794e-05, + 4.67109569709e-05, + 4.90226587713e-05, + 5.13738758877e-05, + 5.37652837794e-05, + 5.61975694515e-05, + 5.86714316526e-05, + 6.11875810755e-05, + 6.37467405612e-05, + 6.63496453067e-05, + 6.89970430761e-05, + 7.16896944157e-05, + 7.44283728721e-05, + 7.72138652145e-05, + 8.00469716611e-05, + 8.29285061084e-05, + 8.58592963656e-05, + 8.8840184392e-05, + 9.18720265391e-05, + 9.49556937963e-05, + 9.80920720417e-05, + 0.000101282062296, + 0.000104526580982, + 0.000107826560186, + 0.00011118294793, + 0.000114596708438, + 0.000118068822417, + 0.00012160028734, + 0.000125192117726, + 0.00012884534544, + 0.000132561019984, + 0.000136340208798, + 0.00014018399757, + 0.000144093490547, + 0.000148069810851, + 0.000152114100801, + 0.000156227522243, + 0.000160411256884, + 0.000164666506629, + 0.000168994493931, + 0.000173396462135, + 0.000177873675842, + 0.000182427421269, + 0.000187059006619, + 0.000191769762457, + 0.000196561042091, + 0.000201434221963, + 0.000206390702045, + 0.000211431906236, + 0.000216559282778, + 0.000221774304665, + 0.000227078470073, + 0.000232473302787, + 0.000237960352637, + 0.000243541195946, + 0.000249217435982, + 0.000254990703421, + 0.000260862656809, + 0.000266834983045, + 0.000272909397863, + 0.000279087646325, + 0.000285371503321, + 0.000291762774084, + 0.0002982632947, + 0.000304874932644, + 0.000311599587312, + 0.000318439190565, + 0.000325395707292, + 0.000332471135962, + 0.000339667509212, + 0.000346986894419, + 0.000354431394301, + 0.000362003147518, + 0.00036970432929, + 0.000377537152016, + 0.000385503865916, + 0.00039360675967, + 0.000401848161086, + 0.000410230437756, + 0.000418755997748, + 0.000427427290289, + 0.000436246806475, + 0.000445217079981, + 0.000454340687793, + 0.000463620250949, + 0.000473058435285, + 0.000482657952211, + 0.000492421559482, + 0.000502352061992, + 0.000512452312584, + 0.000522725212864, + 0.000533173714037, + 0.000543800817755, + 0.00055460957698, + 0.00056560309686, + 0.000576784535618, + 0.000588157105468, + 0.000599724073527, + 0.000611488762763, + 0.000623454552941, + 0.000635624881604, + 0.00064800324505, + 0.000660593199343, + 0.000673398361334, + 0.000686422409699, + 0.000699669085994, + 0.000713142195733, + 0.000726845609479, + 0.000740783263959, + 0.000754959163191, + 0.000769377379636, + 0.000784042055368, + 0.000798957403267, + 0.000814127708221, + 0.000829557328367, + 0.000845250696335, + 0.000861212320527, + 0.000877446786408, + 0.000893958757827, + 0.000910752978352, + 0.00092783427264, + 0.000945207547814, + 0.00096287779488, + 0.00098085009016, + 0.000999129596745, + 0.00101772156598, + 0.00103663133899, + 0.00105586434817, + 0.00107542611881, + 0.00109532227061, + 0.00111555851936, + 0.00113614067854, + 0.00115707466101, + 0.0011783664807, + 0.00120002225432, + 0.00122204820317, + 0.00124445065488, + 0.00126723604523, + 0.00129041092004, + 0.00131398193698, + 0.00133795586756, + 0.00136233959903, + 0.00138714013636, + 0.00141236460426, + 0.00143802024924, + 0.00146411444166, + 0.00149065467788, + 0.0015176485824, + 0.00154510391005, + 0.00157302854821, + 0.00160143051908, + 0.00163031798201, + 0.0016596992358, + 0.00168958272111, + 0.00171997702291, + 0.00175089087287, + 0.00178233315196, + 0.00181431289293, + 0.00184683928293, + 0.00187992166618, + 0.0019135695466, + 0.00194779259058, + 0.00198260062973, + 0.00201800366373, + 0.00205401186319, + 0.00209063557257, + 0.00212788531314, + 0.00216577178605, + 0.00220430587533, + 0.00224349865109, + 0.00228336137266, + 0.00232390549181, + 0.0023651426561, + 0.00240708471217, + 0.00244974370914, + 0.00249313190213, + 0.00253726175573, + 0.00258214594759, + 0.00262779737207, + 0.00267422914394, + 0.00272145460214, + 0.00276948731365, + 0.00281834107733, + 0.00286802992791, + 0.00291856814005, + 0.00296997023239, + 0.00302225097176, + 0.00307542537741, + 0.00312950872531, + 0.00318451655257, + 0.00324046466186, + 0.003297369126, + 0.00335524629254, + 0.00341411278846, + 0.00347398552498, + 0.00353488170237, + 0.00359681881493, + 0.00365981465598, + 0.00372388732302, + 0.00378905522288, + 0.00385533707704, + 0.00392275192699, + 0.00399131913972, + 0.00406105841326, + 0.00413198978234, + 0.00420413362419, + 0.00427751066433, + 0.00435214198257, + 0.00442804901904, + 0.00450525358035, + 0.0045837778459, + 0.00466364437417, + 0.00474487610928, + 0.00482749638754, + 0.00491152894415, + 0.00499699792003, + 0.00508392786878, + 0.00517234376368, + 0.00526227100491, + 0.00535373542682, + 0.00544676330538, + 0.00554138136569, + 0.00563761678969, + 0.00573549722395, + 0.00583505078764, + 0.00593630608056, + 0.0060392921914, + 0.00614403870608, + 0.00625057571623, + 0.0063589338279, + 0.00646914417025, + 0.0065812384046, + 0.00669524873344, + 0.00681120790974, + 0.00692914924633, + 0.00704910662546, + 0.00717111450857, + 0.00729520794617, + 0.0074214225879, + 0.00754979469279, + 0.00768036113965, + 0.00781315943769, + 0.00794822773731, + 0.00808560484101, + 0.00822533021457, + 0.00836744399838, + 0.008511987019, + 0.00865900080082, + 0.00880852757808, + 0.00896061030691, + 0.00911529267773, + 0.00927261912782, + 0.00943263485399, + 0.00959538582569, + 0.00976091879811, + 0.00992928132568, + 0.0101005217757, + 0.0102746893422, + 0.0104518340602, + 0.0106320068199, + 0.0108152593815, + 0.0110016443899, + 0.0111912153899, + 0.0113840268415, + 0.0115801341359, + 0.0117795936107, + 0.0119824625669, + 0.0121887992848, + 0.0123986630409, + 0.012612114125, + 0.0128292138575, + 0.013050024607, + 0.013274609808, + 0.0135030339796, + 0.0137353627437, + 0.0139716628437, + 0.0142120021642, + 0.0144564497499, + 0.0147050758259, + 0.0149579518177, + 0.0152151503717, + 0.015476745376, + 0.0157428119819, + 0.016013426625, + 0.0162886670478, + 0.0165686123214, + 0.0168533428689, + 0.0171429404876, + 0.0174374883735, + 0.0177370711445, + 0.0180417748648, + 0.0183516870699, + 0.0186668967917, + 0.0189874945838, + 0.0193135725477, + 0.0196452243593, + 0.0199825452957, + 0.0203256322628, + 0.0206745838228, + 0.0210295002227, + 0.0213904834231, + 0.0217576371276, + 0.0221310668122, + 0.0225108797561, + 0.0228971850723, + 0.0232900937386, + 0.0236897186303, + 0.0240961745518, + 0.02450957827, + 0.0249300485478, + 0.0253577061782, + 0.0257926740189, + 0.0262350770278, + 0.0266850422988, + 0.027142699098, + 0.0276081789016, + 0.0280816154327, + 0.0285631447007, + 0.0290529050394, + 0.0295510371476, + 0.030057684129, + 0.0305729915334, + 0.0310971073988, + 0.0316301822934, + 0.0321723693594, + 0.0327238243566, + 0.0332847057073, + 0.033855174542, + 0.0344353947452, + 0.0350255330031, + 0.0356257588508, + 0.0362362447218, + 0.0368571659967, + 0.0374887010542, + 0.0381310313222, + 0.0387843413296, + 0.0394488187599, + 0.0401246545045, + 0.0408120427179, + 0.0415111808735, + 0.0422222698201, + 0.0429455138399, + 0.0436811207069, + 0.0444293017466, + 0.045190271897, + 0.0459642497701, + 0.0467514577147, + 0.0475521218806, + 0.0483664722829, + 0.0491947428689, + 0.0500371715846, + 0.0508940004434, + 0.0517654755958, + 0.0526518473997, + 0.0535533704926, + 0.0544703038645, + 0.0554029109327, + 0.0563514596173, + 0.0573162224177, + 0.0582974764919, + 0.0592955037349, + 0.0603105908608, + 0.0613430294845, + 0.0623931162056, + 0.0634611526936, + 0.0645474457748, + 0.0656523075203, + 0.0667760553352, + 0.0679190120508, + 0.0690815060163, + 0.0702638711937, + 0.0714664472538, + 0.0726895796732, + 0.0739336198344, + 0.0751989251258, + 0.0764858590454, + 0.0777947913043, + 0.0791260979333, + 0.0804801613912, + 0.0818573706742, + 0.0832581214278, + 0.0846828160606, + 0.0861318638599, + 0.0876056811089, + 0.089104691207, + 0.0906293247906, + 0.0921800198576, + 0.0937572218926, + 0.0953613839951, + 0.0969929670101, + 0.0986524396596, + 0.100340278678, + 0.102056968949, + 0.103803003644, + 0.105578884366, + 0.10738512129, + 0.109222233313, + 0.111090748203, + 0.112991202747, + 0.114924142909, + 0.116890123986, + 0.118889710765, + 0.12092347769, + 0.122992009021, + 0.12509589901, + 0.127235752061, + 0.129412182913, + 0.131625816814, + 0.133877289697, + 0.136167248367, + 0.138496350684, + 0.140865265754, + 0.143274674122, + 0.145725267963, + 0.148217751286, + 0.150752840133, + 0.153331262786, + 0.155953759975, + 0.158621085094, + 0.161334004413, + 0.164093297301, + 0.166899756451, + 0.169754188103, + 0.172657412281, + 0.175610263024, + 0.17861358863, + 0.181668251895, + 0.184775130365, + 0.187935116588, + 0.191149118364, + 0.194418059015, + 0.197742877645, + 0.201124529409, + 0.20456398579, + 0.208062234878, + 0.211620281652, + 0.21523914827, + 0.218919874362, + 0.22266351733, + 0.22647115265, + 0.230343874181, + 0.234282794482, + 0.238289045129, + 0.242363777039, + 0.246508160805, + 0.250723387027, + 0.255010666658, + 0.259371231352, + 0.263806333813, + 0.268317248161, + 0.272905270294, + 0.277571718263, + 0.282317932647, + 0.287145276942, + 0.29205513795, + 0.297048926181, + 0.302128076251, + 0.307294047304, + 0.312548323422, + 0.317892414057, + 0.323327854464, + 0.328856206138, + 0.334479057269, + 0.340198023193, + 0.346014746858, + 0.351930899296, + 0.357948180103, + 0.364068317927, + 0.370293070967, + 0.376624227472, + 0.383063606262, + 0.389613057246, + 0.396274461953, + 0.403049734077, + 0.409940820023, + 0.416949699466, + 0.42407838592, + 0.431328927321, + 0.438703406609, + 0.446203942327, + 0.453832689236, + 0.461591838927, + 0.469483620453, + 0.47751030097, + 0.485674186388, + 0.493977622034, + 0.502422993324, + 0.51101272645, + 0.519749289076, + 0.528635191046, + 0.53767298511, + 0.54686526765, + 0.556214679431, + 0.565723906358, + 0.575395680249, + 0.585232779616, + 0.595238030468, + 0.605414307119, + 0.615764533018, + 0.626291681584, + 0.636998777063, + 0.647888895396, + 0.658965165103, + 0.670230768183, + 0.681688941025, + 0.693342975341, + 0.705196219109, + 0.717252077536, + 0.729514014038, + 0.741985551232, + 0.754670271948, + 0.767571820262, + 0.780693902539, + 0.794040288499, + 0.807614812301, + 0.821421373642, + 0.835463938881, + 0.849746542174, + 0.864273286638, + 0.879048345525, + 0.894075963423, + 0.909360457476, + 0.924906218624, + 0.940717712863, + 0.956799482529, + 0.973156147604, + 0.989792407041, + 1.00671304011, + 1.0239229078, + 1.04142695415, + 1.05923020774, + 1.07733778311, + 1.09575488221, + 1.11448679591, + 1.13353890554, + 1.15291668439, + 1.17262569933, + 1.19267161237, + 1.21306018232, + 1.23379726641, + 1.25488882202, + 1.27634090834, + 1.29815968813, + 1.32035142951, + 1.34292250774, + 1.36587940705, + 1.38922872252, + 1.41297716195, + 1.43713154781, + 1.46169881918, + 1.48668603377, + 1.51210036992, + 1.53794912868, + 1.56423973589, + 1.59097974435, + 1.61817683593, + 1.64583882383, + 1.67397365481, + 1.70258941147, + 1.73169431454, + 1.76129672532, + 1.79140514799, + 1.82202823213, + 1.85317477515, + 1.88485372486, + 1.917074182, + 1.94984540289, + 1.98317680207, + 2.01707795499, + 2.05155860082, + 2.08662864516, + 2.12229816296, + 2.15857740139, + 2.19547678277, + 2.23300690758, + 2.27117855749, + 2.31000269849, + 2.34949048399, + 2.38965325808, + 2.43050255874, + 2.47205012118, + 2.51430788122, + 2.55728797869, + 2.60100276094, + 2.64546478639, + 2.69068682811, + 2.73668187752, + 2.78346314811, + 2.83104407923, + 2.87943833996, + 2.92865983304, + 2.97872269885, + 3.02964131949, + 3.08143032288, + 3.13410458701, + 3.18767924417, + 3.24216968532, + 3.29759156452, + 3.35396080339, + 3.41129359574, + 3.46960641215, + 3.52891600478, + 3.58923941212, + 3.65059396392, + 3.71299728616, + 3.7764673061, + 3.84102225746, + 3.90668068561, + 3.97346145295, + 4.04138374432, + 4.11046707246, + 4.18073128368, + 4.25219656354, + 4.32488344261, + 4.39881280244, + 4.4740058815, + 4.5504842813, + 4.62826997262, + 4.70738530176, + 4.78785299705, + 4.86969617529, + 4.95293834843, + 5.03760343035, + 5.12371574369, + 5.21130002684, + 5.30038144109, + 5.39098557778, + 5.48313846574, + 5.57686657872, + 5.67219684297, + 5.76915664505, + 5.86777383963, + 5.96807675751, + 6.0700942138, + 6.17385551612, + 6.27939047309, + 6.38672940287, + 6.49590314185, + 6.60694305353, + 6.71988103754, + 6.83474953876, + 6.9515815567, + 7.07041065493, + 7.19127097076, + 7.31419722502, + 7.43922473203, + 7.56638940978, + 7.69572779023, + 7.82727702978, + 7.96107492, + 8.09715989841, + 8.23557105961, + 8.37634816645, + 8.51953166145, + 8.66516267847, + 8.81328305449, + 8.96393534161, + 9.11716281933, + 9.27300950693, + 9.43152017616, + 9.59274036405, + 9.75671638606, + 9.92349534932, + 10.0931251662, + 10.2656545681, + 10.4411331192, + 10.6196112314, + 10.8011401777, + 10.9857721081, + 11.1735600637, + 11.3645579922, + 11.5588207638, + 11.7564041864, + 11.9573650218, + 12.1617610022, + 12.3696508467, + 12.5810942779, + 12.7961520394, + 13.0148859133, + 13.2373587375, + 13.4636344241, + 13.6937779778, + 13.9278555144, + 14.1659342797, + 14.4080826693, + 14.6543702477, + 14.9048677685, + 15.1596471948, + 15.4187817198, + 15.6823457879, + 15.9504151159, + 16.2230667149, + 16.5003789125, + 16.7824313751, + 17.0693051309, + 17.3610825932, + 17.657847584, + 17.9596853582, + 18.2666826278, + 18.5789275874, + 18.8965099387, + 19.2195209172, + 19.5480533174, + 19.8822015206, + 20.222061521, + 20.5677309538, + 20.919309123, + 21.2768970305, + 21.6405974041, + 22.0105147281, + 22.3867552724, + 22.7694271238, + 23.1586402164, + 23.5545063636, + 23.9571392902, + 24.3666546647, + 24.783170133, + 25.2068053519, + 25.6376820237, + 26.0759239308, + 26.5216569718, + 26.975009197, + 27.4361108457, + 27.9050943837, + 28.3820945407, + 28.8672483497, + 29.3606951859, + 29.8625768072, + 30.3730373943, + 30.8922235928, + 31.4202845547, + 31.9573719819, + 32.503640169, + 33.0592460484, + 33.6243492349, + 34.1991120717, + 34.7836996771, + 35.3782799917, + 35.983023827, + 36.5981049142, + 37.2236999541, + 37.8599886682, + 38.5071538498, + 39.165381417, + 39.8348604658, + 40.5157833247, + 41.2083456095, + 41.91274628, + 42.6291876969, + 43.3578756799, + 44.0990195671, + 44.8528322746, + 45.6195303584, + 46.3993340759, + 47.1924674496, + 47.9991583315, + 48.8196384681, + 49.6541435676, + 50.5029133671, + 51.3661917019, + 52.2442265749, + 53.1372702287, + 54.0455792174, + 54.9694144806, + 55.9090414183, + 56.8647299672, + 57.836754678, + 58.8253947948, + 59.8309343345, + 60.8536621693, + 61.8938721092, + 62.9518629862, + 64.0279387407, + 65.1224085084, + 66.2355867094, + 67.3677931382, + 68.5193530557, + 69.6905972829, + 70.8818622956, + 72.0934903211, + 73.3258294367, + 74.5792336696, + 75.8540630987, + 77.1506839576, + 78.4694687406, + 79.8107963089, + 81.175052, + 82.5626277382, + 83.9739221471, + 85.4093406643, + 86.8692956578, + 88.3542065443, + 89.8644999101, + 91.4006096332, + 92.9629770082, + 94.552050873, + 96.1682877378, + 97.8121519161, + 99.4841156584, + 101.184659287, + 102.914271337, + 104.67344869, + 106.462696725, + 108.282529458, + 110.133469691, + 112.016049165, + 113.930808708, + 115.878298393, + 117.859077695, + 119.873715656, + 121.922791041, + 124.00689251, + 126.126618785, + 128.282578823, + 130.475391988, + 132.705688234, + 134.974108282, + 137.281303804, + 139.627937614, + 142.014683855, + 144.442228191, + 146.911268009, + 149.422512618, + 151.976683448, + 154.574514264, + 157.216751372, + 159.904153837, + 162.637493695, + 165.417556184, + 168.245139961, + 171.121057337, + 174.046134507, + 177.021211788, + 180.047143864, + 183.124800025, + 186.255064423, + 189.438836323, + 192.677030359, + 195.970576804, + 199.320421829, + 202.727527779 + ], + "core_charge_density": [ + 0.0, + 2.23273071843, + 2.23273071831, + 2.2327307181, + 2.23273071779, + 2.23273071739, + 2.23273071688, + 2.23273071628, + 2.23273071553, + 2.23273071469, + 2.23273071372, + 2.23273071263, + 2.23273071141, + 2.23273071004, + 2.23273070851, + 2.23273070683, + 2.23273070499, + 2.23273070297, + 2.23273070078, + 2.23273069841, + 2.23273069584, + 2.23273069306, + 2.23273069008, + 2.23273068688, + 2.23273068344, + 2.23273067977, + 2.23273067584, + 2.23273067166, + 2.23273066719, + 2.23273066244, + 2.2327306574, + 2.23273065205, + 2.23273064638, + 2.23273064037, + 2.23273063403, + 2.2327306273, + 2.23273062019, + 2.23273061271, + 2.23273060479, + 2.23273059647, + 2.23273058769, + 2.23273057846, + 2.23273056873, + 2.23273055851, + 2.23273054778, + 2.23273053649, + 2.23273052464, + 2.23273051223, + 2.23273049917, + 2.23273048549, + 2.23273047118, + 2.23273045613, + 2.23273044042, + 2.23273042396, + 2.23273040671, + 2.23273038869, + 2.23273036985, + 2.23273035013, + 2.23273032951, + 2.23273030796, + 2.23273028546, + 2.23273026196, + 2.23273023744, + 2.23273021181, + 2.23273018507, + 2.23273015717, + 2.23273012807, + 2.2327300977, + 2.23273006602, + 2.23273003303, + 2.23272999864, + 2.23272996275, + 2.2327299254, + 2.23272988644, + 2.2327298459, + 2.23272980368, + 2.23272975968, + 2.23272971388, + 2.23272966621, + 2.2327296166, + 2.23272956495, + 2.23272951121, + 2.2327294553, + 2.23272939713, + 2.23272933663, + 2.23272927371, + 2.23272920826, + 2.23272914022, + 2.23272906948, + 2.23272899592, + 2.23272891948, + 2.23272884001, + 2.23272875744, + 2.23272867163, + 2.23272858246, + 2.23272848982, + 2.23272839359, + 2.23272829362, + 2.23272818978, + 2.23272808193, + 2.23272796994, + 2.23272785362, + 2.23272773286, + 2.23272760747, + 2.2327274773, + 2.23272734216, + 2.23272720189, + 2.23272705629, + 2.23272690516, + 2.23272674832, + 2.23272658556, + 2.23272641666, + 2.23272624141, + 2.23272605956, + 2.2327258709, + 2.23272567517, + 2.23272547213, + 2.2327252615, + 2.23272504301, + 2.23272481641, + 2.23272458136, + 2.23272433761, + 2.2327240848, + 2.23272382265, + 2.23272355078, + 2.2327232689, + 2.23272297662, + 2.23272267357, + 2.23272235936, + 2.23272203363, + 2.23272169592, + 2.23272134585, + 2.23272098296, + 2.23272060678, + 2.23272021687, + 2.23271981272, + 2.23271939385, + 2.23271895971, + 2.23271850978, + 2.23271804348, + 2.23271756027, + 2.23271705951, + 2.2327165406, + 2.2327160029, + 2.23271544573, + 2.23271486843, + 2.23271427028, + 2.23271365053, + 2.23271300844, + 2.23271234323, + 2.23271165403, + 2.23271094007, + 2.2327102004, + 2.2327094342, + 2.23270864048, + 2.23270781829, + 2.23270696662, + 2.23270608442, + 2.23270517068, + 2.23270422425, + 2.23270324397, + 2.23270222869, + 2.23270117712, + 2.23270008807, + 2.23269896017, + 2.23269779206, + 2.23269658235, + 2.23269532958, + 2.23269403222, + 2.23269268875, + 2.23269129754, + 2.23268985691, + 2.23268836512, + 2.23268682039, + 2.2326852209, + 2.23268356469, + 2.23268184981, + 2.23268007422, + 2.23267823575, + 2.23267633225, + 2.23267436141, + 2.23267232091, + 2.23267020833, + 2.23266802112, + 2.2326657567, + 2.23266341235, + 2.23266098532, + 2.23265847273, + 2.23265587155, + 2.23265317872, + 2.23265039108, + 2.23264750525, + 2.23264451788, + 2.23264142541, + 2.23263822417, + 2.2326349104, + 2.23263148016, + 2.23262792938, + 2.23262425391, + 2.23262044939, + 2.23261651133, + 2.2326124351, + 2.23260821586, + 2.23260384866, + 2.2325993284, + 2.23259464968, + 2.23258980703, + 2.23258479478, + 2.232579607, + 2.23257423761, + 2.23256868031, + 2.23256292855, + 2.2325569756, + 2.23255081445, + 2.2325444379, + 2.23253783846, + 2.23253100839, + 2.23252393971, + 2.23251662411, + 2.23250905304, + 2.23250121763, + 2.23249310873, + 2.23248471684, + 2.23247603215, + 2.23246704451, + 2.23245774342, + 2.232448118, + 2.23243815702, + 2.23242784886, + 2.23241718146, + 2.2324061424, + 2.23239471879, + 2.23238289731, + 2.23237066419, + 2.23235800515, + 2.23234490546, + 2.23233134985, + 2.23231732253, + 2.23230280718, + 2.2322877869, + 2.23227224421, + 2.23225616103, + 2.23223951865, + 2.23222229773, + 2.23220447824, + 2.23218603948, + 2.23216696001, + 2.23214721769, + 2.23212678957, + 2.23210565194, + 2.23208378025, + 2.23206114915, + 2.23203773234, + 2.2320135027, + 2.23198843208, + 2.23196249147, + 2.23193565074, + 2.2319078788, + 2.23187914348, + 2.23184941152, + 2.23181864842, + 2.23178681859, + 2.23175388518, + 2.23171981007, + 2.23168455382, + 2.23164807566, + 2.23161033336, + 2.2315712833, + 2.23153088032, + 2.23148907771, + 2.23144582717, + 2.2314010787, + 2.23135478062, + 2.23130687947, + 2.23125731992, + 2.23120604475, + 2.23115299478, + 2.23109810879, + 2.23104132346, + 2.23098257329, + 2.23092179051, + 2.23085890508, + 2.23079384448, + 2.23072653374, + 2.2306568953, + 2.23058484894, + 2.2305103117, + 2.23043319779, + 2.23035341838, + 2.23027088173, + 2.23018549283, + 2.23009715348, + 2.23000576211, + 2.22991121366, + 2.22981339945, + 2.22971220706, + 2.22960752033, + 2.22949921898, + 2.22938717867, + 2.22927127086, + 2.22915136251, + 2.22902731613, + 2.22889898946, + 2.22876623539, + 2.22862890179, + 2.22848683135, + 2.22833986134, + 2.22818782356, + 2.22803054399, + 2.22786784274, + 2.22769953368, + 2.22752542449, + 2.22734531617, + 2.227159003, + 2.22696627228, + 2.22676690404, + 2.22656067083, + 2.22634733746, + 2.22612666084, + 2.22589838954, + 2.2256622636, + 2.22541801431, + 2.22516536376, + 2.22490402475, + 2.2246337003, + 2.22435408335, + 2.22406485652, + 2.22376569172, + 2.22345624973, + 2.22313617996, + 2.22280511997, + 2.22246269513, + 2.22210851821, + 2.22174218898, + 2.22136329376, + 2.22097140502, + 2.22056608085, + 2.2201468646, + 2.21971328437, + 2.2192648524, + 2.2188010648, + 2.21832140074, + 2.21782532219, + 2.21731227314, + 2.21678167916, + 2.21623294678, + 2.21566546285, + 2.21507859398, + 2.21447168586, + 2.21384406261, + 2.2131950261, + 2.21252385526, + 2.2118298054, + 2.21111210739, + 2.21036996703, + 2.20960256412, + 2.20880905185, + 2.20798855583, + 2.20714017333, + 2.20626297242, + 2.20535599104, + 2.20441823621, + 2.20344868297, + 2.20244627355, + 2.20140991632, + 2.20033848485, + 2.19923081689, + 2.19808571333, + 2.19690193712, + 2.19567821223, + 2.19441322251, + 2.19310561057, + 2.19175397667, + 2.19035687748, + 2.18891282494, + 2.18742028503, + 2.18587767649, + 2.18428336965, + 2.18263568505, + 2.18093289222, + 2.1791732083, + 2.17735479674, + 2.17547576594, + 2.17353416784, + 2.17152799657, + 2.16945518704, + 2.16731361347, + 2.16510108806, + 2.16281535945, + 2.16045411129, + 2.1580149608, + 2.15549545734, + 2.15289308081, + 2.15020524036, + 2.14742927274, + 2.14456244092, + 2.14160193265, + 2.13854485894, + 2.13538825264, + 2.13212906697, + 2.12876417416, + 2.12529036402, + 2.12170434255, + 2.11800273062, + 2.1141820626, + 2.11023878513, + 2.10616925581, + 2.10196974208, + 2.09763641993, + 2.0931653729, + 2.08855259095, + 2.08379396951, + 2.07888530854, + 2.07382231159, + 2.06860058511, + 2.06321563767, + 2.05766287935, + 2.05193762125, + 2.04603507492, + 2.03995035222, + 2.03367846488, + 2.02721432451, + 2.02055274263, + 2.01368843074, + 2.00661600063, + 1.99932996487, + 1.9918247373, + 1.98409463391, + 1.97613387364, + 1.96793657977, + 1.95949678106, + 1.95080841341, + 1.94186532182, + 1.9326612624, + 1.92318990492, + 1.9134448355, + 1.90341955976, + 1.89310750653, + 1.88250203174, + 1.87159642305, + 1.86038390494, + 1.84885764459, + 1.83701075822, + 1.82483631863, + 1.81232736334, + 1.79947690387, + 1.78627793635, + 1.77272345314, + 1.75880645626, + 1.74451997213, + 1.72985706847, + 1.71481087304, + 1.69937459475, + 1.68354154741, + 1.66730517605, + 1.65065908654, + 1.63359707855, + 1.61611318209, + 1.59820169818, + 1.57985724376, + 1.56107480124, + 1.54184977294, + 1.52217804067, + 1.50205603074, + 1.48148078451, + 1.46045003446, + 1.43896228604, + 1.41701690506, + 1.39461421005, + 1.37175556978, + 1.34844350473, + 1.32468179191, + 1.30047557201, + 1.27583145712, + 1.25075763757, + 1.22526398575, + 1.19936215444, + 1.17306566676, + 1.14638999483, + 1.11935262345, + 1.09197309524, + 1.06427303307, + 1.03627613625, + 1.00800814607, + 0.979496777537, + 0.950771614192, + 0.921863963737, + 0.892806673931, + 0.863633909331, + 0.834380891966, + 0.805083611619, + 0.775778514391, + 0.746502181879, + 0.717291017297, + 0.688180958652, + 0.65920724352, + 0.63040425299, + 0.601805465138, + 0.573443549105, + 0.545350629061, + 0.517558742178, + 0.49010050478, + 0.463009985241, + 0.436323759489, + 0.410082094644, + 0.384330168133, + 0.359119183755, + 0.334507195766, + 0.310559400986, + 0.287347615295, + 0.264948626678, + 0.243441129081, + 0.22290101293, + 0.20339494758, + 0.184972470798, + 0.167657231813, + 0.151438637242, + 0.136265911534, + 0.12204742729, + 0.10865888195, + 0.0959640683932, + 0.083850800291, + 0.0722805729107, + 0.0613413182402, + 0.0512740975492, + 0.0424102102307, + 0.034914118447, + 0.028646527485, + 0.0234232794755, + 0.0190856820957, + 0.015496410739, + 0.0125370939993, + 0.0101060991351, + 0.00811651123104, + 0.00649429980085, + 0.00517666377786, + 0.00411054590972, + 0.00325130587268, + 0.00256154162298, + 0.00201004765331, + 0.00157089918974, + 0.00122265113911, + 0.000947641118823, + 0.000731386103268, + 0.000562062857594, + 0.000430062797363, + 0.000327612611811, + 0.000248452594066, + 0.000187565332016, + 0.000140948062569, + 0.000105422669799, + 7.84779352335e-05, + 5.81392620596e-05, + 4.28616615056e-05, + 3.14423202616e-05, + 2.29495525051e-05, + 1.6665380702e-05, + 1.20393860817e-05, + 8.65182221763e-06, + 6.18429752791e-06, + 4.3966048807e-06, + 3.10851395847e-06, + 2.18554563055e-06, + 1.52792222908e-06, + 1.06203505545e-06, + 7.33894898403e-07, + 5.04134858799e-07, + 3.44220789136e-07, + 2.3359516834e-07, + 1.57537916952e-07, + 1.05574274194e-07, + 7.02974108867e-08, + 4.65033660351e-08, + 3.05596266511e-08, + 1.99473028274e-08, + 1.29314076236e-08, + 8.32501457103e-09, + 5.32173152691e-09, + 3.37753547067e-09, + 2.12801735251e-09, + 1.33084359831e-09, + 8.26043315029e-10, + 5.08802108554e-10, + 3.10964336842e-10, + 1.88552437787e-10, + 1.13411434083e-10, + 6.76591949186e-11, + 4.00297791182e-11, + 2.34836682299e-11, + 1.36588435505e-11, + 7.87526034084e-12, + 4.50044540354e-12, + 2.54871389768e-12, + 1.43019720355e-12, + 7.95084037689e-13, + 4.37828685975e-13, + 2.38781127249e-13, + 1.28952466678e-13, + 6.89479149665e-14, + 3.64922865261e-14, + 1.91158994674e-14, + 9.90891273266e-15, + 5.08179726701e-15, + 2.57804057721e-15, + 1.29348911936e-15, + 6.41733128553e-16, + 3.14761266821e-16, + 1.5260128596e-16, + 7.31136654659e-17, + 3.46110038392e-17, + 1.61850988168e-17, + 7.47499595689e-18, + 3.40885923321e-18, + 1.53467506222e-18, + 6.81934692736e-19, + 2.99024772269e-19, + 1.29367285884e-19, + 5.52167015886e-20, + 2.32569229723e-20, + 9.66041588704e-21, + 3.95833071216e-21, + 1.60962391865e-21, + 6.5349525133e-22, + 2.48519656402e-22, + 9.47166284427e-23, + 3.5526916025e-23, + 1.31111156343e-23, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "local_potential": [ + -31.1613435986, + -31.1613435986, + -31.16134359855, + -31.16134359825, + -31.16134359795, + -31.16134359755, + -31.16134359705, + -31.16134359655, + -31.16134359565, + -31.1613435948, + -31.16134359395, + -31.1613435928, + -31.1613435917, + -31.1613435902, + -31.16134358875, + -31.1613435869, + -31.1613435852, + -31.1613435831, + -31.16134358095, + -31.16134357855, + -31.161343576, + -31.16134357325, + -31.1613435703, + -31.1613435671, + -31.1613435636, + -31.16134355995, + -31.161343556, + -31.1613435518, + -31.16134354735, + -31.16134354255, + -31.1613435375, + -31.16134353215, + -31.16134352645, + -31.1613435205, + -31.16134351415, + -31.16134350745, + -31.1613435003, + -31.1613434928, + -31.16134348485, + -31.16134347655, + -31.1613434678, + -31.1613434585, + -31.1613434488, + -31.1613434386, + -31.16134342785, + -31.16134341655, + -31.1613434046, + -31.16134339235, + -31.16134337915, + -31.16134336545, + -31.1613433512, + -31.161343336, + -31.1613433204, + -31.16134330395, + -31.16134328655, + -31.1613432685, + -31.1613432498, + -31.1613432301, + -31.16134320935, + -31.1613431877, + -31.1613431652, + -31.1613431417, + -31.16134311735, + -31.16134309145, + -31.16134306475, + -31.1613430369, + -31.16134300785, + -31.1613429773, + -31.1613429455, + -31.16134291255, + -31.16134287825, + -31.16134284235, + -31.16134280485, + -31.16134276575, + -31.1613427254, + -31.1613426831, + -31.16134263895, + -31.1613425931, + -31.16134254545, + -31.16134249575, + -31.16134244405, + -31.16134239025, + -31.16134233435, + -31.161342276, + -31.1613422155, + -31.16134215265, + -31.16134208705, + -31.16134201895, + -31.1613419482, + -31.16134187455, + -31.1613417981, + -31.16134171845, + -31.16134163595, + -31.16134154985, + -31.1613414606, + -31.161341368, + -31.16134127175, + -31.16134117155, + -31.1613410677, + -31.1613409597, + -31.1613408476, + -31.1613407312, + -31.16134061035, + -31.16134048485, + -31.1613403545, + -31.1613402193, + -31.16134007885, + -31.1613399332, + -31.1613397818, + -31.1613396249, + -31.16133946205, + -31.1613392929, + -31.1613391175, + -31.1613389355, + -31.1613387466, + -31.1613385507, + -31.16133834755, + -31.16133813675, + -31.16133791795, + -31.1613376912, + -31.16133745595, + -31.16133721195, + -31.1613369589, + -31.16133669655, + -31.16133642445, + -31.1613361422, + -31.1613358497, + -31.16133554645, + -31.16133523185, + -31.1613349059, + -31.16133456785, + -31.16133421745, + -31.16133385425, + -31.1613334777, + -31.1613330874, + -31.16133268295, + -31.16133226365, + -31.1613318291, + -31.1613313788, + -31.16133091205, + -31.1613304284, + -31.1613299272, + -31.16132940775, + -31.1613288696, + -31.1613283119, + -31.16132773405, + -31.1613271354, + -31.16132651505, + -31.16132587235, + -31.16132520665, + -31.1613245167, + -31.1613238022, + -31.1613230617, + -31.1613222949, + -31.16132150045, + -31.16132067755, + -31.161319825, + -31.16131894185, + -31.16131802735, + -31.16131708005, + -31.1613160988, + -31.1613150827, + -31.16131403, + -31.16131294, + -31.16131181115, + -31.1613106419, + -31.161309431, + -31.1613081771, + -31.16130687845, + -31.1613055337, + -31.1613041413, + -31.16130269935, + -31.1613012061, + -31.16129965985, + -31.1612980589, + -31.16129640115, + -31.16129468455, + -31.1612929075, + -31.16129106705, + -31.16128916195, + -31.16128718915, + -31.16128514675, + -31.16128303225, + -31.1612808429, + -31.1612785762, + -31.1612762296, + -31.1612738002, + -31.16127128545, + -31.16126868155, + -31.16126598615, + -31.16126319595, + -31.16126030715, + -31.161257317, + -31.16125422165, + -31.16125101725, + -31.16124770015, + -31.16124426655, + -31.16124071235, + -31.16123703335, + -31.161233225, + -31.1612292831, + -31.16122520285, + -31.16122097935, + -31.1612166079, + -31.16121208315, + -31.1612073997, + -31.16120255225, + -31.16119753485, + -31.1611923419, + -31.161186967, + -31.1611814042, + -31.16117564645, + -31.16116968755, + -31.1611635199, + -31.1611571368, + -31.16115053055, + -31.16114369335, + -31.1611366173, + -31.16112929405, + -31.16112171495, + -31.1611138713, + -31.1611057537, + -31.16109735295, + -31.16108865875, + -31.1610796615, + -31.16107035025, + -31.1610607143, + -31.1610507423, + -31.1610404229, + -31.1610297435, + -31.16101869215, + -31.16100725555, + -31.1609954207, + -31.16098317345, + -31.16097049995, + -31.16095738505, + -31.16094381365, + -31.1609297697, + -31.16091523715, + -31.16090019885, + -31.1608846375, + -31.16086853465, + -31.16085187195, + -31.16083462955, + -31.1608167879, + -31.1607983257, + -31.16077922205, + -31.16075945425, + -31.1607389997, + -31.16071783405, + -31.16069593355, + -31.1606732718, + -31.16064982345, + -31.1606255603, + -31.1606004551, + -31.1605744777, + -31.160547599, + -31.1605197868, + -31.16049100975, + -31.1604612336, + -31.16043042465, + -31.1603985462, + -31.16036556235, + -31.16033143365, + -31.1602961218, + -31.1602595847, + -31.16022178105, + -31.16018266595, + -31.1601421952, + -31.1601003208, + -31.1600569953, + -31.16001216745, + -31.15996578645, + -31.15991779735, + -31.15986814605, + -31.15981677335, + -31.1597636216, + -31.1597086274, + -31.159651729, + -31.1595928587, + -31.15953195015, + -31.15946893115, + -31.15940373055, + -31.1593362711, + -31.15926647675, + -31.1591942646, + -31.1591195534, + -31.15904225465, + -31.1589622809, + -31.1588795377, + -31.15879393165, + -31.1587053613, + -31.158613727, + -31.15851892, + -31.15842083365, + -31.1583193515, + -31.1582143597, + -31.1581057335, + -31.1579933506, + -31.1578770781, + -31.15775678495, + -31.1576323287, + -31.1575035695, + -31.15737035455, + -31.157232534, + -31.15708994475, + -31.1569424262, + -31.15678980395, + -31.15663190615, + -31.15646854585, + -31.1562995392, + -31.1561246865, + -31.15594379065, + -31.1557566375, + -31.15556301705, + -31.15536269975, + -31.15515546045, + -31.15494105365, + -31.15471923895, + -31.15448975315, + -31.1542523386, + -31.15400671415, + -31.15375260395, + -31.15348970695, + -31.1532177279, + -31.1529363446, + -31.15264524145, + -31.15234407355, + -31.15203250235, + -31.1517101596, + -31.1513766827, + -31.1510316771, + -31.15067475515, + -31.15030549465, + -31.1499234808, + -31.14952826125, + -31.1491193921, + -31.14869638945, + -31.14825877845, + -31.14780604075, + -31.14733766835, + -31.14685310625, + -31.1463518107, + -31.1458331881, + -31.14529665635, + -31.14474158, + -31.1441673357, + -31.143573244, + -31.1429586372, + -31.1423227881, + -31.1416649827, + -31.14098444175, + -31.14028040145, + -31.1395520279, + -31.1387985034, + -31.1380189354, + -31.1372124484, + -31.1363780877, + -31.13551491575, + -31.13462191065, + -31.13369806915, + -31.13274229715, + -31.13175352105, + -31.13073056965, + -31.12967229355, + -31.1285774394, + -31.12744477685, + -31.1262729641, + -31.12506068445, + -31.12380650135, + -31.1225090057, + -31.1211666594, + -31.11977795415, + -31.1183412438, + -31.1168549135, + -31.1153172013, + -31.1137263784, + -31.11208055855, + -31.11037789145, + -31.10861635785, + -31.10679397675, + -31.10490858655, + -31.10295806695, + -31.1009401037, + -31.0988524269, + -31.096692559, + -31.0944580701, + -31.09214630795, + -31.0897546712, + -31.08728032045, + -31.0847204706, + -31.08207208205, + -31.07933217325, + -31.0764974897, + -31.07356483985, + -31.070530739, + -31.0673917705, + -31.06414420365, + -31.06078438065, + -31.05730830715, + -31.05371206705, + -31.04999138415, + -31.04614206585, + -31.04215953355, + -31.0380392991, + -31.03377646025, + -31.029366212, + -31.0248033059, + -31.02008259795, + -31.0151984687, + -31.01014541135, + -31.0049174095, + -30.99950856805, + -30.9939124455, + -30.98812273125, + -30.98213252915, + -30.9759350838, + -30.96952301235, + -30.96288908345, + -30.95602539375, + -30.9489242033, + -30.94157705065, + -30.93397565225, + -30.92611095085, + -30.9179740803, + -30.9095553465, + -30.90084526105, + -30.89183344815, + -30.88250975445, + -30.87286307565, + -30.86288254855, + -30.8525562892, + -30.841872676, + -30.8308189933, + -30.8193828091, + -30.80755051945, + -30.79530882675, + -30.78264317875, + -30.76953935495, + -30.7559817906, + -30.74195528075, + -30.72744318075, + -30.71242923585, + -30.6968956499, + -30.6808250496, + -30.66419841155, + -30.64699717125, + -30.6292009983, + -30.61079006025, + -30.5917426365, + -30.57203754515, + -30.551651587, + -30.53056214675, + -30.5087444549, + -30.4861743738, + -30.4628254678, + -30.4386719854, + -30.41368572515, + -30.3878392266, + -30.3611024203, + -30.33344603935, + -30.30483804145, + -30.27524725285, + -30.24463955235, + -30.212981758, + -30.18023756305, + -30.14637167485, + -30.11134549335, + -30.07512151255, + -30.0376587336, + -29.99891733375, + -29.95885380905, + -29.91742591745, + -29.87458754625, + -29.8302939303, + -29.7844962451, + -29.73714709895, + -29.68819485465, + -29.6375893907, + -29.58527616085, + -29.531202215, + -29.47531001175, + -29.4175436852, + -29.3578426344, + -29.2961480175, + -29.23239615435, + -29.16652522015, + -29.09846851235, + -29.0281613131, + -28.9555340832, + -28.8805194578, + -28.80304544915, + -28.72304252905, + -28.6404369424, + -28.55515781945, + -28.46713071385, + -28.37628466675, + -28.2825460868, + -28.18584564475, + -28.0861125847, + -27.98328124635, + -27.87728581895, + -27.76806614975, + -27.65556281775, + -27.53972170005, + -27.4204890923, + -27.29781437155, + -27.17164487635, + -27.04192614195, + -26.9085966716, + -26.77158597195, + -26.6308105392, + -26.48617159445, + -26.33755577035, + -26.18483708545, + -26.0278887962, + -25.8665972924, + -25.700894227, + -25.5307906604, + -25.35643306275, + -25.1781454095, + -24.99645918785, + -24.8120375785, + -24.6254317999, + -24.43598407655, + -24.2411860427, + -24.0397645266, + -23.8334416928, + -23.6235521349, + -23.4100784837, + -23.1930325271, + -22.9725066165, + -22.7485795947, + -22.52134136325, + -22.29087336165, + -22.0572658603, + -21.8205987, + -21.5809588447, + -21.3384229774, + -21.0930763511, + -20.84499995135, + -20.59429262215, + -20.341065616, + -20.08546857545, + -19.8276889844, + -19.567970517, + -19.30659021345, + -19.0438146022, + -18.77968372515, + -18.51366538025, + -18.24539413275, + -17.97557538275, + -17.7049477631, + -17.433731396, + -17.1621398989, + -16.89041793505, + -16.61881729195, + -16.3475972718, + -16.0770269453, + -15.80738389075, + -15.53895758185, + -15.2720475097, + -15.0069676621, + -14.7440442581, + -14.48362117265, + -14.22605750555, + -13.97173382645, + -13.72104980085, + -13.4744311815, + -13.2323277615, + -12.99522114745, + -12.76362338525, + -12.53808556755, + -12.3191973625, + -12.10759580635, + -11.90414241615, + -11.70405861455, + -11.50733616735, + -11.31392183785, + -11.12375954745, + -10.9367938869, + -10.75297116455, + -10.57223850245, + -10.39454393445, + -10.2198363686, + -10.04806557625, + -9.8791821703, + -9.7131375993, + -9.549884125, + -9.3893748173, + -9.23156353205, + -9.07640490665, + -8.923854338, + -8.7738679789, + -8.6264027161, + -8.4814161672, + -8.33886665905, + -8.1987132248, + -8.0609155831, + -7.92543413495, + -7.79222994375, + -7.66126473025, + -7.53250085795, + -7.40590132715, + -7.2814297503, + -7.15905035895, + -7.03872798155, + -6.92042803845, + -6.8041165283, + -6.6897600219, + -6.5773256492, + -6.4667810931, + -6.3580945778, + -6.25123486205, + -6.1461712286, + -6.0428734774, + -5.9413119156, + -5.84145735095, + -5.74328108195, + -5.6467548913, + -5.5518510367, + -5.45854224385, + -5.366801698, + -5.27660303655, + -5.1879203411, + -5.1007281303, + -5.01500135175, + -4.930715375195, + -4.84784598495, + -4.76636937303, + -4.686262131805, + -4.607501247555, + -4.530064093345, + -4.45392842272, + -4.37907236308, + -4.305474409385, + -4.233113417885, + -4.16196860009, + -4.092019516725, + -4.023246071845, + -3.955628507105, + -3.889147396055, + -3.8237836386, + -3.75951845545, + -3.69633338286, + -3.634210267275, + -3.573131260115, + -3.51307881269, + -3.454035671195, + -3.395984871715, + -3.33890973542, + -3.282793863765, + -3.227621133755, + -3.17337569338, + -3.120041957035, + -3.067604601055, + -3.01604855932, + -2.96535901894, + -2.91552141597, + -2.86652143129, + -2.818344986435, + -2.770978239575, + -2.72440758155, + -2.678619631945, + -2.633601235255, + -2.589339457105, + -2.545821580535, + -2.503035102325, + -2.46096772944, + -2.419607375485, + -2.378942157205, + -2.3389603911, + -2.299650590065, + -2.26100146007, + -2.22300189694, + -2.18564098314, + -2.14890798465, + -2.11279234794, + -2.07728369669, + -2.042371829155, + -2.008046715045, + -1.97429849265, + -1.941117466045, + -1.908494102245, + -1.876419028535, + -1.844883029715, + -1.813877045505, + -1.78339216788, + -1.75341963857, + -1.72395084654, + -1.694977325415, + -1.66649075121, + -1.63848293978, + -1.610945844585, + -1.583871554345, + -1.55725229069, + -1.531080406035, + -1.505348381345, + -1.480048823925, + -1.455174465345, + -1.430718159365, + -1.406672879845, + -1.38303171871, + -1.35978788403, + -1.336934698015, + -1.31446559512, + -1.29237412012, + -1.27065392634, + -1.24929877372, + -1.22830252711, + -1.207659154475, + -1.18736272515, + -1.167407408155, + -1.14778747051, + -1.12849727559, + -1.10953128151, + -1.090884039535, + -1.07255019246, + -1.054524473405, + -1.036801703265, + -1.01937679076, + -1.002244729915, + -0.98540059887, + -0.96883955847, + -0.952556850915, + -0.93654779836, + -0.920807801585, + -0.90533233865, + -0.890116963665, + -0.87515730542, + -0.860449066185, + -0.845988020445, + -0.831770013735, + -0.81779096138, + -0.804046847385, + -0.79053372323, + -0.777247706765, + -0.76418498109, + -0.75134179344, + -0.738714454145, + -0.726299335535, + -0.7140928709, + -0.702091553495, + -0.690291935495, + -0.67869062703, + -0.6672842952, + -0.656069663125, + -0.64504350899, + -0.63420266514, + -0.62354401715, + -0.613064502935, + -0.602761111885, + -0.592630883975, + -0.58267090894, + -0.572878325425, + -0.56325032015, + -0.553784127145, + -0.5444770269, + -0.535326345625, + -0.52632945447, + -0.51748376875, + -0.50878674724, + -0.50023589142, + -0.491828744745, + -0.48356289198, + -0.4754359584665, + -0.467445609463, + -0.4595895494635, + -0.4518655215435, + -0.444271306709, + -0.436804723261, + -0.4294636261665, + -0.422245906443, + -0.4151494905535, + -0.4081723398095, + -0.401312449787, + -0.3945678497475, + -0.387936602076, + -0.381416801722, + -0.3750065756505, + -0.368704082308, + -0.36250751109, + -0.3564150818225, + -0.350425044248, + -0.3445356775295, + -0.3387452897475, + -0.333052217418, + -0.3274548250165, + -0.321951504504, + -0.316540674868, + -0.3112207816675, + -0.305990296585, + -0.3008477169915, + -0.295791565509, + -0.2908203895895, + -0.2859327610995, + -0.281127275905, + -0.2764025534725, + -0.2717572364685, + -0.2671899903725, + -0.262699503093, + -0.25828448459, + -0.2539436665045, + -0.2496758017935, + -0.245479664373, + -0.2413540487655, + -0.2372977697525, + -0.233309662036, + -0.229388579901, + -0.2255333968895, + -0.221743005474, + -0.2180163167415, + -0.21435226008, + -0.210749782869, + -0.207207850181, + -0.203725444481, + -0.2003015653345, + -0.196935229122, + -0.193625468754, + -0.190371333396, + -0.187171888191, + -0.184026213997, + -0.180933407116, + -0.1778925790415, + -0.1749028561945, + -0.171963379685, + -0.1690733050515, + -0.1662318020285, + -0.1634380543035, + -0.160691259281, + -0.1579906278565, + -0.1553353841885, + -0.1527247654745, + -0.1501580217275, + -0.14763441557, + -0.145153222016, + -0.142713728263, + -0.140315233488, + -0.137957048649, + -0.135638496281, + -0.133358910306, + -0.1311176358415, + -0.1289140290085, + -0.1267474567515, + -0.124617296655, + -0.1225229367625, + -0.120463775402, + -0.118439221015, + -0.1164486919835, + -0.1144916164655, + -0.112567432228, + -0.1106755864905, + -0.1088155357585, + -0.1069867456745, + -0.105188690861, + -0.1034208547695, + -0.101682729534, + -0.0999738158225, + -0.0982936226965, + -0.096641667467, + -0.0950174755575, + -0.0934205803695, + -0.0918505231425, + -0.0903068528295, + -0.0887891259625 + ], + "beta_projectors": [ + { + "label": "", + "angular_momentum": 0, + "radial_function": [ + 0.0, + 2.49467305571e-06, + 5.06257163104e-06, + 7.59618973952e-06, + 1.02543106838e-05, + 1.2949760483e-05, + 1.56100543163e-05, + 1.8396295974e-05, + 2.12138951588e-05, + 2.41055977666e-05, + 2.695980684e-05, + 2.9927279394e-05, + 3.29460991143e-05, + 3.60318269966e-05, + 3.90934135692e-05, + 4.22605370329e-05, + 4.55587817717e-05, + 4.86924773929e-05, + 5.2157959461e-05, + 5.54640139667e-05, + 5.89444467469e-05, + 6.24416055852e-05, + 6.5962718251e-05, + 6.96429766652e-05, + 7.33183127757e-05, + 7.70486580705e-05, + 8.08503207414e-05, + 8.47575039473e-05, + 8.86854314846e-05, + 9.2707307345e-05, + 9.67591339654e-05, + 0.000100939686763, + 0.00010513895743, + 0.000109453835525, + 0.00011379202453, + 0.000118242313251, + 0.000122761937773, + 0.000127356455363, + 0.000132046613158, + 0.000136767721077, + 0.000141583815982, + 0.000146555869794, + 0.000151519086062, + 0.000156583338214, + 0.000161820146484, + 0.000167010678523, + 0.000172415625792, + 0.00017781162619, + 0.000183385494797, + 0.000188976656073, + 0.000194739017378, + 0.000200535473355, + 0.000206460178748, + 0.000212496999512, + 0.000218602739925, + 0.000224876219155, + 0.000231162603895, + 0.000237650908676, + 0.000244169245783, + 0.000250868380818, + 0.000257642545348, + 0.00026452943675, + 0.000271546682847, + 0.000278712949759, + 0.000285925295009, + 0.000293336104721, + 0.000300832693103, + 0.000308495653819, + 0.000316230710736, + 0.000324143739358, + 0.000332195511963, + 0.000340332060364, + 0.0003486754165, + 0.000357111416569, + 0.000365733065076, + 0.000374440742513, + 0.000383362148503, + 0.000392421228974, + 0.00040159460479, + 0.000410989306704, + 0.000420467734389, + 0.000430161638114, + 0.000440037498435, + 0.000450013941378, + 0.000460250802904, + 0.00047055119348, + 0.000481134016294, + 0.000491831414037, + 0.000502738666335, + 0.000513839431983, + 0.00052509606679, + 0.000536574833761, + 0.000548247412684, + 0.00056011151222, + 0.000572185959387, + 0.000584431107424, + 0.000596953500604, + 0.000609628519274, + 0.000622568692607, + 0.00063567317353, + 0.000649048905031, + 0.000662640465438, + 0.000676466473517, + 0.000690511164993, + 0.000704823464043, + 0.000719348440691, + 0.000734149713598, + 0.000749197930385, + 0.000764492216507, + 0.000780059884967, + 0.00079587783534, + 0.000811991811156, + 0.000828359735008, + 0.000845012833232, + 0.000861946513273, + 0.000879186129755, + 0.000896700592844, + 0.000914536428477, + 0.000932642313632, + 0.000951096884343, + 0.000969846898642, + 0.000988913571371, + 0.00100832203804, + 0.00102802612791, + 0.00104813209235, + 0.00106852623712, + 0.00108927314648, + 0.0011104074077, + 0.00113187749151, + 0.00115371202926, + 0.00117593589909, + 0.00119853228134, + 0.00122149697272, + 0.00124490226121, + 0.00126865346483, + 0.00129285002021, + 0.00131742737452, + 0.00134245907985, + 0.00136789037787, + 0.00139376816092, + 0.00142009155724, + 0.00144686281034, + 0.00147408107045, + 0.00150178366969, + 0.00152994168602, + 0.00155859487508, + 0.00158773201573, + 0.00161736216729, + 0.00164750735386, + 0.0016781617003, + 0.00170934986851, + 0.00174105420784, + 0.00177330811787, + 0.00180613643577, + 0.00183947874654, + 0.00187343790916, + 0.00190794550136, + 0.00194306024232, + 0.00197876182304, + 0.00201509170444, + 0.00205202467145, + 0.00208960394399, + 0.00212780495687, + 0.0021666868454, + 0.00220621070332, + 0.00224642464544, + 0.00228731241937, + 0.00232890834292, + 0.00237121934883, + 0.00241424305128, + 0.00245800871515, + 0.00250251723155, + 0.00254779294597, + 0.00259384020354, + 0.00264067226543, + 0.0026883112422, + 0.00273675743444, + 0.00278603292499, + 0.00283615358613, + 0.00288713551108, + 0.00293897673225, + 0.00299171411519, + 0.00304534629963, + 0.00309990178758, + 0.00315539041684, + 0.00321181624733, + 0.00326922589001, + 0.00332759553308, + 0.00338697726386, + 0.00344737258716, + 0.00350879451892, + 0.00357126721602, + 0.00363481835329, + 0.00369944796168, + 0.0037651769284, + 0.00383203790785, + 0.00390004188738, + 0.00396920397183, + 0.00403955084531, + 0.00411110078916, + 0.00418387625349, + 0.00425788654937, + 0.00433317473907, + 0.00440974212433, + 0.00448762027542, + 0.00456682940437, + 0.00464739628763, + 0.00472933542332, + 0.0048126786766, + 0.00489744731806, + 0.0049836667399, + 0.0050713486102, + 0.00516055194274, + 0.00525125562898, + 0.00534352822035, + 0.00543737175577, + 0.00553282017225, + 0.00562990185595, + 0.0057286390541, + 0.00582907185587, + 0.00593121833417, + 0.00603510878991, + 0.00614077866286, + 0.00624825751755, + 0.00635757042283, + 0.00646875579522, + 0.00658183807763, + 0.00669685892788, + 0.00681384454424, + 0.0069328310087, + 0.00705385250084, + 0.00717694238942, + 0.00730214026739, + 0.00742947705578, + 0.0075589930423, + 0.00769072082554, + 0.00782470757579, + 0.00796098119235, + 0.00809958677859, + 0.00824056343635, + 0.00838395166195, + 0.00852979308743, + 0.00867812929538, + 0.00882900028632, + 0.00898245573323, + 0.00913853499869, + 0.0092972816102, + 0.00945875112786, + 0.00962297530256, + 0.00979001415114, + 0.00995990939855, + 0.0101327117513, + 0.0103084701187, + 0.0104872366358, + 0.0106690628402, + 0.0108539985785, + 0.0110421023278, + 0.0112334218868, + 0.0114280176277, + 0.0116259445776, + 0.0118272579214, + 0.0120320178928, + 0.0122402797497, + 0.0124521134246, + 0.0126675681732, + 0.0128867115523, + 0.0131096106386, + 0.0133363232694, + 0.0135669188203, + 0.0138014626679, + 0.0140400239872, + 0.0142826696842, + 0.0145294728368, + 0.0147805021399, + 0.0150358328374, + 0.0152955358768, + 0.0155596901934, + 0.0158283688024, + 0.0161016516853, + 0.0163796180321, + 0.0166623489267, + 0.0169499240547, + 0.017242429612, + 0.0175399489438, + 0.0178425708508, + 0.0181503767529, + 0.0184634683626, + 0.0187819234359, + 0.0191058428476, + 0.0194353191537, + 0.0197704465441, + 0.020111325445, + 0.0204580527639, + 0.0208107321605, + 0.0211694648914, + 0.0215343547283, + 0.0219055120139, + 0.0222830417804, + 0.0226670559456, + 0.0230576663721, + 0.0234549892512, + 0.0238591384234, + 0.0242702348469, + 0.0246883963747, + 0.0251137512106, + 0.0255464164522, + 0.0259865282055, + 0.026434208854, + 0.0268895947957, + 0.0273528185485, + 0.027824017188, + 0.0283033308726, + 0.0287908993118, + 0.0292868695705, + 0.0297913868536, + 0.0303046016141, + 0.0308266659637, + 0.0313577359942, + 0.0318979683142, + 0.0324475258725, + 0.0330065709252, + 0.0335752732977, + 0.034153798695, + 0.0347423263164, + 0.035341026438, + 0.0359500849757, + 0.0365696817868, + 0.0372000041089, + 0.0378412428435, + 0.0384935922515, + 0.0391572493636, + 0.0398324155249, + 0.0405192972079, + 0.0412181018043, + 0.0419290445784, + 0.0426523414774, + 0.0433882152635, + 0.0441368912542, + 0.0448986003624, + 0.0456735770388, + 0.0464620615958, + 0.0472642976397, + 0.0480805359567, + 0.0489110284984, + 0.0497560362697, + 0.0506158245106, + 0.0514906611468, + 0.0523808232171, + 0.0532865915848, + 0.0542082534043, + 0.0551461007308, + 0.0561004338365, + 0.0570715565513, + 0.0580597820897, + 0.0590654273195, + 0.0600888185692, + 0.0611302871381, + 0.062190171379, + 0.063268820294, + 0.0643665851574, + 0.0654838290171, + 0.0666209222688, + 0.0677782416565, + 0.0689561741946, + 0.0701551147494, + 0.0713754678295, + 0.0726176464849, + 0.0738820723554, + 0.0751691792449, + 0.0764794093469, + 0.0778132144577, + 0.0791710591196, + 0.0805534174123, + 0.0819607747699, + 0.0833936289163, + 0.0848524890864, + 0.0863378774709, + 0.0878503286003, + 0.0893903897351, + 0.0909586234585, + 0.0925556046589, + 0.0941819236562, + 0.0958381854583, + 0.09752501104, + 0.099243036928, + 0.10099291633, + 0.102775319453, + 0.104590934768, + 0.106440468142, + 0.108324645104, + 0.110244210069, + 0.112199928571, + 0.114192585892, + 0.116222989877, + 0.118291970469, + 0.120400380785, + 0.122549097087, + 0.124739022459, + 0.126971083376, + 0.12924623407, + 0.131565456475, + 0.133929760213, + 0.136340184944, + 0.138797800004, + 0.141303708119, + 0.14385904264, + 0.146464971493, + 0.149122698253, + 0.15183346206, + 0.154598539557, + 0.157419246856, + 0.160296939263, + 0.16323301454, + 0.166228913067, + 0.169286119829, + 0.172406165655, + 0.175590629015, + 0.178841138059, + 0.182159370782, + 0.18554705874, + 0.189005986874, + 0.192537997032, + 0.196144988037, + 0.199828918925, + 0.203591810325, + 0.207435745931, + 0.211362875219, + 0.215375414546, + 0.219475650398, + 0.223665939593, + 0.227948713019, + 0.232326476582, + 0.236801813035, + 0.241377385543, + 0.246055937198, + 0.250840295029, + 0.25573337102, + 0.260738163385, + 0.265857759964, + 0.271095337527, + 0.27645416584, + 0.281937607116, + 0.287549118119, + 0.293292251482, + 0.299170656445, + 0.305188078624, + 0.311348362511, + 0.317655449433, + 0.324113379024, + 0.330726287697, + 0.337498408466, + 0.344434069146, + 0.351537690488, + 0.358813784412, + 0.366266950424, + 0.373901871955, + 0.381723312689, + 0.389736110965, + 0.397945173475, + 0.406355469342, + 0.414972020921, + 0.423799895993, + 0.432844196565, + 0.442110047919, + 0.451602585162, + 0.461326939469, + 0.471288221354, + 0.48149150319, + 0.49194179954, + 0.502644045449, + 0.513603072474, + 0.524823583389, + 0.536310122313, + 0.548067046078, + 0.560098487446, + 0.572408322247, + 0.58500012668, + 0.597877137503, + 0.611042203929, + 0.624497741212, + 0.638245674854, + 0.65228738803, + 0.666623658134, + 0.681254596456, + 0.696179577637, + 0.711397171242, + 0.726905063532, + 0.742699981178, + 0.758777605365, + 0.775132487775, + 0.791757957601, + 0.808646029872, + 0.825787306477, + 0.843170877731, + 0.860784218623, + 0.878613084663, + 0.896641405767, + 0.914851178058, + 0.933222357627, + 0.951732751534, + 0.970357913806, + 0.989071039936, + 1.00784286827, + 1.02664158267, + 1.04543272381, + 1.0641791048, + 1.08284073799, + 1.10137476894, + 1.11973542473, + 1.13787397244, + 1.15573869479, + 1.17327487965, + 1.19042482883, + 1.2071278848, + 1.22332047749, + 1.23893619348, + 1.25390586523, + 1.26815768511, + 1.28161733993, + 1.29420817023, + 1.30585134974, + 1.31646608745, + 1.32596984826, + 1.33427859292, + 1.34130703259, + 1.34696889884, + 1.35117722403, + 1.3538446328, + 1.35488364133, + 1.35420696614, + 1.35172784228, + 1.34736035666, + 1.34101980231, + 1.33262306597, + 1.3220890658, + 1.30933926241, + 1.29429827524, + 1.27689464428, + 1.25706178902, + 1.23473922583, + 1.20987411842, + 1.18242324505, + 1.15235547671, + 1.11965486496, + 1.08432443731, + 1.04639078842, + 1.00590953048, + 0.962971623817, + 0.917710539675, + 0.870310105921, + 0.821012743174, + 0.770127605416, + 0.718037888005, + 0.665206249936, + 0.6121769182, + 0.559572606899, + 0.508083921038, + 0.458448476456, + 0.411416647833, + 0.367700817588, + 0.32790549332, + 0.292437087827, + 0.261395116186, + 0.234451957505, + 0.210737472979, + 0.188759588143, + 0.166415196561, + 0.14118133265, + 0.110630383909, + 0.0734900782982, + 0.0316086284299, + -0.00687194738443, + -0.0204095357645, + -0.00754310698922, + 0.000212345986171, + 0.000121764764126, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "cutoff_radius": 0.0, + "ultrasoft_cutoff_radius": 0.0 + }, + { + "label": "", + "angular_momentum": 0, + "radial_function": [ + 0.0, + -9.71601500806e-06, + -1.95972234928e-05, + -2.96498122619e-05, + -3.98708467917e-05, + -5.02698818379e-05, + -6.08445063084e-05, + -7.16039404187e-05, + -8.25414040434e-05, + -9.3665267873e-05, + -0.000104988897304, + -0.000116494858398, + -0.000128205281401, + -0.000140108871643, + -0.00015222530911, + -0.000164527950045, + -0.000177079634166, + -0.000189803977389, + -0.0002027784668, + -0.000215955662754, + -0.000229357160913, + -0.000243002287302, + -0.000256867863543, + -0.000270980655216, + -0.000285328829981, + -0.000299914155372, + -0.000314757756742, + -0.000329860640398, + -0.000345221086791, + -0.00036082591746, + -0.000376717435966, + -0.000392863679541, + -0.000409303686576, + -0.000426020088068, + -0.000443004958774, + -0.00046031092898, + -0.000477877536532, + -0.000495780789495, + -0.000513956738988, + -0.000532472887725, + -0.000551278667255, + -0.000570415381774, + -0.000589903552121, + -0.000609672387354, + -0.000629842730474, + -0.000650296107443, + -0.000671142744428, + -0.000692340489442, + -0.000713876375988, + -0.000735797544303, + -0.000758102213332, + -0.000780755910987, + -0.000803844661087, + -0.000827278074377, + -0.000851150921196, + -0.000875414934658, + -0.000900090398566, + -0.000925197254162, + -0.00095071486367, + -0.000976702327064, + -0.00100310511861, + -0.00102996963174, + -0.00105727633485, + -0.0010850929093, + -0.00111333183776, + -0.00114209557557, + -0.00117131977501, + -0.00120107475134, + -0.00123131499806, + -0.00126208520282, + -0.00129335752062, + -0.00132520477924, + -0.00135755022851, + -0.00139049187191, + -0.00142396814116, + -0.00145802401682, + -0.00149266047158, + -0.00152790519962, + -0.00156371753417, + -0.00160018934459, + -0.00163723674502, + -0.00167494956025, + -0.00171329645044, + -0.00175229797387, + -0.00179196820807, + -0.00183231093224, + -0.00187335705164, + -0.00191508151641, + -0.00195754940019, + -0.00200072121527, + -0.00204463251466, + -0.00208930295074, + -0.00213473661576, + -0.0021809359355, + -0.00222793966569, + -0.00227573038818, + -0.00232435470108, + -0.00237379700214, + -0.00242409892731, + -0.00247523945556, + -0.00252727843141, + -0.00258018429351, + -0.00263401317796, + -0.00268875366036, + -0.00274442703072, + -0.00280105698037, + -0.00285865558732, + -0.00291722808832, + -0.00297681294756, + -0.00303742559658, + -0.00309904883351, + -0.00316174384216, + -0.00322550772711, + -0.00329035635207, + -0.00335631372764, + -0.00342340747466, + -0.00349163746227, + -0.00356104270545, + -0.00363162630387, + -0.00370341821374, + -0.00377644665684, + -0.00385070748212, + -0.0039262518364, + -0.00400307765944, + -0.00408122244384, + -0.00416070647519, + -0.00424152959579, + -0.00432376299151, + -0.00440738553144, + -0.0044924276647, + -0.0045789518972, + -0.00466692924196, + -0.00475641626513, + -0.0048474482665, + -0.00494001421426, + -0.00503417653015, + -0.00512994333117, + -0.00522735226993, + -0.00532641638675, + -0.00542718266625, + -0.00552966737535, + -0.0056339079648, + -0.00573992311755, + -0.00584775577313, + -0.00595743445404, + -0.00606897763365, + -0.00618243867303, + -0.00629783069468, + -0.0064152006227, + -0.00653457368913, + -0.0066559907118, + -0.00677947686037, + -0.00690507834918, + -0.00703283114011, + -0.00716275436453, + -0.0072949131453, + -0.007429319774, + -0.00756603175698, + -0.00770507501997, + -0.0078464961408, + -0.00799033736011, + -0.00813663418035, + -0.00828543391575, + -0.0084367739262, + -0.00859070411926, + -0.00874726418126, + -0.00890649861162, + -0.0090684565604, + -0.00923318584119, + -0.00940072101104, + -0.00957113229737, + -0.00974444683079, + -0.00992072944125, + -0.0101000209578, + -0.0102823806609, + -0.0104678528505, + -0.0106565002711, + -0.0108483686771, + -0.0110435187076, + -0.0112420049507, + -0.0114438776101, + -0.0116492068388, + -0.0118580480836, + -0.0120704479592, + -0.01228648977, + -0.0125062161165, + -0.0127297050486, + -0.012957005655, + -0.0131881975035, + -0.0134233383061, + -0.01366249923, + -0.0139057450709, + -0.014153153307, + -0.014404786334, + -0.0146607181257, + -0.0149210288552, + -0.0151857878164, + -0.0154550681298, + -0.0157289539931, + -0.0160075209855, + -0.0162908458347, + -0.0165790182049, + -0.016872107887, + -0.0171702145091, + -0.0174734098121, + -0.0177817907807, + -0.0180954411709, + -0.018414448961, + -0.0187389136193, + -0.0190689188177, + -0.0194045662137, + -0.0197459470454, + -0.0200931675985, + -0.0204463132221, + -0.020805500809, + -0.021170823639, + -0.0215423898701, + -0.021920307025, + -0.0223046769992, + -0.0226956223245, + -0.0230932428003, + -0.0234976606879, + -0.0239089863134, + -0.0243273440078, + -0.0247528474293, + -0.0251856209635, + -0.0256257920348, + -0.026073481549, + -0.0265288216978, + -0.0269919415504, + -0.0274629724901, + -0.0279420542537, + -0.0284293178529, + -0.0289249093456, + -0.0294289654468, + -0.0299416326717, + -0.0304630612897, + -0.0309933947826, + -0.0315327885803, + -0.0320813980256, + -0.0326393771887, + -0.0332068893246, + -0.0337840944659, + -0.0343711594505, + -0.0349682524314, + -0.0355755415902, + -0.0361932071471, + -0.0368214188651, + -0.0374603604254, + -0.0381102143647, + -0.0387711669146, + -0.0394434059865, + -0.040127124995, + -0.0408225184104, + -0.0415297880309, + -0.0422491317315, + -0.0429807604105, + -0.043724877928, + -0.0444817011644, + -0.0452514455691, + -0.046034329285, + -0.0468305778671, + -0.0476404171838, + -0.0484640825531, + -0.0493018040693, + -0.0501538228863, + -0.051020384706, + -0.0519017328141, + -0.0527981215874, + -0.0537098054045, + -0.0546370448901, + -0.0555801048867, + -0.0565392529744, + -0.0575147634254, + -0.0585069141419, + -0.0595159865305, + -0.060542271137, + -0.0615860559937, + -0.0626476411095, + -0.0637273267159, + -0.0648254222073, + -0.065942236715, + -0.0670780894346, + -0.0682333039478, + -0.0694082052652, + -0.0706031303381, + -0.0718184166656, + -0.0730544074996, + -0.0743114558404, + -0.0755899168209, + -0.0768901517123, + -0.0782125299461, + -0.0795574243343, + -0.0809252172203, + -0.0823162931246, + -0.083731045121, + -0.0851698745637, + -0.086633185646, + -0.0881213915103, + -0.0896349109306, + -0.0911741717267, + -0.0927396049112, + -0.0943316522483, + -0.0959507602803, + -0.0975973843257, + -0.0992719854092, + -0.100975033098, + -0.102707005083, + -0.104468385386, + -0.106259666698, + -0.108081348698, + -0.1099339406, + -0.111817958083, + -0.113733925606, + -0.115682376407, + -0.117663852465, + -0.119678901656, + -0.121728084412, + -0.123811966743, + -0.125931125057, + -0.128086144143, + -0.130277619102, + -0.132506151057, + -0.134772354729, + -0.137076850261, + -0.139420270034, + -0.141803254857, + -0.144226454908, + -0.146690530641, + -0.149196153161, + -0.151744001631, + -0.154334766851, + -0.156969149832, + -0.159647859862, + -0.162371620153, + -0.165141160129, + -0.167957223225, + -0.170820561373, + -0.173731937779, + -0.176692126717, + -0.179701912699, + -0.182762091258, + -0.185873469146, + -0.189036862829, + -0.192253102124, + -0.195523024654, + -0.198847482344, + -0.20222733538, + -0.205663457072, + -0.209156730545, + -0.212708050248, + -0.21631832195, + -0.219988462039, + -0.223719398512, + -0.227512068604, + -0.231367422989, + -0.235286420429, + -0.239270031777, + -0.243319238791, + -0.247435031869, + -0.251618413143, + -0.255870394698, + -0.260191997811, + -0.264584253502, + -0.269048203195, + -0.273584895943, + -0.278195391404, + -0.282880755694, + -0.287642065303, + -0.292480403591, + -0.297396860529, + -0.30239253514, + -0.307468530521, + -0.312625958353, + -0.317865933376, + -0.323189576906, + -0.328598013928, + -0.334092372796, + -0.339673784596, + -0.345343383418, + -0.351102302902, + -0.356951678647, + -0.362892643994, + -0.368926332393, + -0.375053872259, + -0.381276390394, + -0.387595006467, + -0.394010834765, + -0.400524981152, + -0.407138542414, + -0.413852603834, + -0.420668238771, + -0.427586505228, + -0.434608445774, + -0.441735084127, + -0.448967423776, + -0.456306445261, + -0.463753104749, + -0.471308330225, + -0.478973019955, + -0.486748039147, + -0.494634217267, + -0.502632344679, + -0.510743169677, + -0.518967394878, + -0.52730567403, + -0.535758606754, + -0.544326736998, + -0.553010546437, + -0.561810451053, + -0.57072679722, + -0.579759854983, + -0.588909814401, + -0.598176779897, + -0.60756076377, + -0.617061681173, + -0.626679343357, + -0.636413451436, + -0.646263588741, + -0.656229215174, + -0.66630965768, + -0.676504104184, + -0.686811594133, + -0.697231010539, + -0.707761070513, + -0.718400316502, + -0.729147105545, + -0.739999599815, + -0.750955755874, + -0.76201331285, + -0.773169781821, + -0.784422432837, + -0.795768282914, + -0.807204083163, + -0.818726304149, + -0.830331123466, + -0.842014409451, + -0.853771707037, + -0.865598222388, + -0.877488804933, + -0.889437932945, + -0.901439694374, + -0.913487769482, + -0.925575412993, + -0.937695434098, + -0.949840177596, + -0.962001503777, + -0.974170767259, + -0.986338796686, + -0.998495872478, + -1.0106317052, + -1.02273541283, + -1.03479549795, + -1.0467998247, + -1.05873559497, + -1.07058932464, + -1.08234681996, + -1.09399315289, + -1.10551263726, + -1.1168888048, + -1.12810438067, + -1.13914126025, + -1.14998048538, + -1.16060222168, + -1.17098573619, + -1.18110937597, + -1.19095054766, + -1.20048569802, + -1.20969029595, + -1.21853881622, + -1.22700472478, + -1.23506046632, + -1.24267745389, + -1.24982606182, + -1.25647562066, + -1.26259441629, + -1.26814969237, + -1.27310765643, + -1.27743349134, + -1.28109137082, + -1.28404448057, + -1.28625504562, + -1.28768436318, + -1.2882928432, + -1.28804005557, + -1.2868847859, + -1.28478509913, + -1.28169841301, + -1.2775815804, + -1.27239098298, + -1.26608263467, + -1.25861229778, + -1.24993561045, + -1.24000822766, + -1.22878597485, + -1.21622501647, + -1.20228203835, + -1.18691444551, + -1.17008057584, + -1.15173992918, + -1.13185341388, + -1.11038360901, + -1.08729504497, + -1.06255450023, + -1.03613131663, + -1.00799773102, + -0.978129225687, + -0.946504894471, + -0.913107827611, + -0.877925511643, + -0.840950246792, + -0.802179578949, + -0.761616747351, + -0.719271145934, + -0.675158797908, + -0.629302843379, + -0.58173403692, + -0.532491256913, + -0.481622022204, + -0.429183018013, + -0.37524062681, + -0.319871465176, + -0.263162922927, + -0.205213704702, + -0.146134369325, + -0.0860478674375, + -0.025090070625, + 0.0365897088222, + 0.0988282158612, + 0.161447772933, + 0.224255834222, + 0.287044583507, + 0.349590593809, + 0.411654567253, + 0.472981181688, + 0.533299077198, + 0.592321021642, + 0.64974430733, + 0.705251436874, + 0.758511173281, + 0.809180036481, + 0.85690434607, + 0.901322917316, + 0.942070531162, + 0.978782300121, + 1.01109905426, + 1.03867385469, + 1.06117971838, + 1.0783185847, + 1.08983148068, + 1.09550972364, + 1.09520684423, + 1.08885069441, + 1.07645493091, + 1.05812871856, + 1.03408309091, + 1.00463195286, + 0.970185245864, + 0.931231410607, + 0.888306092419, + 0.84194428637, + 0.792614151961, + 0.74063312147, + 0.686071518798, + 0.628657001749, + 0.567706627822, + 0.502135044284, + 0.430621244176, + 0.352068707067, + 0.26657019699, + 0.177228169268, + 0.0931407851482, + 0.036185586416, + 0.0123538443286, + -0.000303089462417, + -0.000159850529141, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "cutoff_radius": 0.0, + "ultrasoft_cutoff_radius": 0.0 + }, + { + "label": "", + "angular_momentum": 1, + "radial_function": [ + 0.0, + 8.86766953279e-12, + -5.26841608192e-09, + -4.6910539151e-09, + -4.66465642254e-09, + -4.55692771828e-09, + -4.42811303192e-09, + -4.27165274584e-09, + -4.08678591404e-09, + -3.87202685911e-09, + -3.62463515143e-09, + -3.34479731406e-09, + -3.03066211193e-09, + -2.68049302308e-09, + -2.29087691778e-09, + -1.86292966137e-09, + -1.39461289133e-09, + -8.78461014972e-10, + -3.23285270918e-10, + 2.84958408746e-10, + 9.38383206127e-10, + 1.64634870012e-09, + 2.40826003778e-09, + 3.22429546206e-09, + 4.10001334127e-09, + 5.03797122568e-09, + 6.04002051788e-09, + 7.10685028318e-09, + 8.24566069133e-09, + 9.4541394936e-09, + 1.0743592627e-08, + 1.2104534315e-08, + 1.35517582103e-08, + 1.50863319096e-08, + 1.67060912835e-08, + 1.8419859018e-08, + 2.02313141432e-08, + 2.21430285775e-08, + 2.41562993505e-08, + 2.62848250915e-08, + 2.85231635046e-08, + 3.08762601903e-08, + 3.33590292277e-08, + 3.59650728807e-08, + 3.87025802444e-08, + 4.15826870799e-08, + 4.46016992671e-08, + 4.77778626848e-08, + 5.10964419743e-08, + 5.45921393014e-08, + 5.82424158594e-08, + 6.2074147055e-08, + 6.60858006186e-08, + 7.02834774498e-08, + 7.46803901925e-08, + 7.92771002398e-08, + 8.40894042879e-08, + 8.91149339201e-08, + 9.43740747546e-08, + 9.98682342588e-08, + 1.0560519246e-07, + 1.11602868044e-07, + 1.17860193445e-07, + 1.24391548152e-07, + 1.31218278444e-07, + 1.38332535073e-07, + 1.45754851746e-07, + 1.53495947467e-07, + 1.6157941374e-07, + 1.69993754324e-07, + 1.7876811042e-07, + 1.87921855812e-07, + 1.97443709815e-07, + 2.07382198643e-07, + 2.17720765337e-07, + 2.28498811593e-07, + 2.39712102537e-07, + 2.51397378646e-07, + 2.63551158422e-07, + 2.76210157073e-07, + 2.89387663626e-07, + 3.03090426972e-07, + 3.17349172997e-07, + 3.32189037675e-07, + 3.47614536821e-07, + 3.63675446362e-07, + 3.8035938984e-07, + 3.97713106241e-07, + 4.15767244979e-07, + 4.34515773781e-07, + 4.54024611144e-07, + 4.74284832231e-07, + 4.95350686143e-07, + 5.17235301805e-07, + 5.39980465349e-07, + 5.63611780788e-07, + 5.88152393653e-07, + 6.13656839154e-07, + 6.40136107416e-07, + 6.6764891369e-07, + 6.96215720575e-07, + 7.25877498077e-07, + 7.56679248984e-07, + 7.88666351114e-07, + 8.21861559866e-07, + 8.5634048934e-07, + 8.92109458265e-07, + 9.29250615208e-07, + 9.67795899856e-07, + 1.00780455463e-06, + 1.04931964316e-06, + 1.09238928524e-06, + 1.13710169966e-06, + 1.18347915482e-06, + 1.23159702767e-06, + 1.28152642077e-06, + 1.33331006247e-06, + 1.38703635164e-06, + 1.44276548827e-06, + 1.50056117738e-06, + 1.56051622876e-06, + 1.62268818354e-06, + 1.68716696801e-06, + 1.75404709577e-06, + 1.82336784856e-06, + 1.89527921815e-06, + 1.96982747771e-06, + 2.04712304637e-06, + 2.12726569733e-06, + 2.21034773426e-06, + 2.29649188974e-06, + 2.38577261578e-06, + 2.47834348976e-06, + 2.5742852266e-06, + 2.67373730279e-06, + 2.77682173309e-06, + 2.8836664131e-06, + 2.99439208332e-06, + 3.10916199207e-06, + 3.22809252902e-06, + 3.35134489049e-06, + 3.47907294168e-06, + 3.61143033755e-06, + 3.74857083857e-06, + 3.89069357938e-06, + 4.03793417092e-06, + 4.19050648674e-06, + 4.34858206991e-06, + 4.51235902539e-06, + 4.68203581182e-06, + 4.85782167449e-06, + 5.03993288365e-06, + 5.22859765052e-06, + 5.42402052214e-06, + 5.62648175389e-06, + 5.83618998535e-06, + 6.05342112878e-06, + 6.27843813219e-06, + 6.51149952714e-06, + 6.75290888176e-06, + 7.00294248866e-06, + 7.26190525671e-06, + 7.53013755662e-06, + 7.8078996991e-06, + 8.09560579419e-06, + 8.39354263861e-06, + 8.70211096754e-06, + 9.0216388609e-06, + 9.35256147816e-06, + 9.69522812651e-06, + 1.00500925633e-05, + 1.04175522496e-05, + 1.07980559494e-05, + 1.11920694105e-05, + 1.16000519395e-05, + 1.20224863413e-05, + 1.24599109577e-05, + 1.29128141967e-05, + 1.3381753178e-05, + 1.3867268985e-05, + 1.43699801209e-05, + 1.4890447876e-05, + 1.54293119468e-05, + 1.59871982379e-05, + 1.65647865662e-05, + 1.71627702629e-05, + 1.77818311167e-05, + 1.84227294045e-05, + 1.9086218086e-05, + 1.97730818684e-05, + 2.04841483569e-05, + 2.12202394986e-05, + 2.19822377304e-05, + 2.27710453708e-05, + 2.35876102725e-05, + 2.44328723865e-05, + 2.53078473059e-05, + 2.6213555684e-05, + 2.71510882107e-05, + 2.81215377004e-05, + 2.91260444946e-05, + 3.01658192055e-05, + 3.12420333694e-05, + 3.23560275588e-05, + 3.35090584243e-05, + 3.47025020842e-05, + 3.5937776972e-05, + 3.72163069668e-05, + 3.85396169161e-05, + 3.99092626369e-05, + 4.13268421419e-05, + 4.27940312995e-05, + 4.43125360346e-05, + 4.58841653174e-05, + 4.75107374819e-05, + 4.91941766674e-05, + 5.09364497661e-05, + 5.27396026995e-05, + 5.46057388009e-05, + 5.65370588739e-05, + 5.85358016859e-05, + 6.06043475995e-05, + 6.27450655722e-05, + 6.49604946628e-05, + 6.72532188368e-05, + 6.96258996666e-05, + 7.20813533026e-05, + 7.46223988657e-05, + 7.72520343646e-05, + 7.99733248123e-05, + 8.27894399984e-05, + 8.57036846823e-05, + 8.87194184748e-05, + 9.18402191095e-05, + 9.50696715948e-05, + 9.84115698935e-05, + 0.000101869809588, + 0.000105448397674, + 0.000109151529661, + 0.000112983510245, + 0.000116948785356, + 0.000121051996895, + 0.000125297899194, + 0.000129691450696, + 0.00013423775486, + 0.00013894208698, + 0.000143809949273, + 0.000148846953096, + 0.000154059011079, + 0.000159452136363, + 0.000165032608686, + 0.000170806927099, + 0.000176781770467, + 0.000182964093278, + 0.000189361073164, + 0.000195980133744, + 0.000202828959104, + 0.000209915482853, + 0.000217247955071, + 0.000224834849647, + 0.000232684990504, + 0.00024080746048, + 0.000249211701123, + 0.00025790742921, + 0.00026690473844, + 0.000276214054359, + 0.000285846150799, + 0.000295812200434, + 0.000306123739508, + 0.000316792719511, + 0.000327831477129, + 0.000339252814325, + 0.000351069925921, + 0.000363296516152, + 0.000375946714153, + 0.000389035158533, + 0.000402577018029, + 0.000416587918733, + 0.00043108409745, + 0.000446082297412, + 0.000461599867284, + 0.000477654757066, + 0.000494265509109, + 0.000511451344465, + 0.000529232085114, + 0.000547628350837, + 0.000566661295965, + 0.000586352989699, + 0.00060672615317, + 0.000627804301615, + 0.000649611794478, + 0.000672173795841, + 0.000695516378636, + 0.000719666464151, + 0.000744651940102, + 0.00077050163587, + 0.00079724538294, + 0.000824914048786, + 0.000853539540817, + 0.000883154882988, + 0.000913794242801, + 0.000945492937856, + 0.000978287539633, + 0.0010122158526, + 0.00104731697906, + 0.00108363142287, + 0.00112120095641, + 0.0011600689764, + 0.00120028019924, + 0.00124188097703, + 0.00128491924663, + 0.0013294445547, + 0.00137550821834, + 0.00142316324663, + 0.00147246452512, + 0.00152346884504, + 0.00157623486588, + 0.00163082335455, + 0.00168729713821, + 0.00174572118002, + 0.00180616271805, + 0.00186869125944, + 0.00193337877233, + 0.00200029959104, + 0.00206953072991, + 0.00214115172927, + 0.00221524497237, + 0.00229189559656, + 0.00237119169559, + 0.00245322439002, + 0.00253808792674, + 0.00262587978386, + 0.00271670080264, + 0.00281065525377, + 0.00290785105189, + 0.00300839972447, + 0.00311241670765, + 0.00322002136072, + 0.00333133713274, + 0.00344649173204, + 0.00356561721402, + 0.0036888501984, + 0.00381633193871, + 0.0039482085803, + 0.00408463126975, + 0.00422575623344, + 0.00437174523317, + 0.00452276539018, + 0.00467898963044, + 0.00484059680533, + 0.00500777183637, + 0.00518070599469, + 0.00535959711121, + 0.00554464973511, + 0.00573607541961, + 0.00593409294584, + 0.0061389285897, + 0.00635081628714, + 0.00656999799995, + 0.00679672394409, + 0.0070312528301, + 0.00727385221984, + 0.00752479874849, + 0.00778437851955, + 0.00805288731875, + 0.00833063101147, + 0.00861792587639, + 0.00891509892719, + 0.00922248825822, + 0.00954044346752, + 0.00986932600585, + 0.0102095095616, + 0.0105613804861, + 0.0109253382496, + 0.0113017957608, + 0.0116911799543, + 0.0120939321659, + 0.0125105086274, + 0.0129413809739, + 0.0133870367238, + 0.01384797981, + 0.0143247311789, + 0.0148178291961, + 0.0153278304176, + 0.0158553099666, + 0.0164008623755, + 0.0169651019772, + 0.0175486637094, + 0.0181522037507, + 0.018776400118, + 0.0194219535224, + 0.0200895879348, + 0.0207800514497, + 0.0214941169956, + 0.0222325831679, + 0.0229962749308, + 0.0237860446853, + 0.0246027728099, + 0.0254473688562, + 0.0263207722216, + 0.0272239532302, + 0.0281579139965, + 0.0291236894833, + 0.0301223484584, + 0.0311549945058, + 0.032222767227, + 0.0333268431198, + 0.0344684368831, + 0.0356488024445, + 0.036869234158, + 0.038131068054, + 0.0394356829653, + 0.0407845018939, + 0.0421789931643, + 0.0436206718636, + 0.0451111010701, + 0.0466518932725, + 0.0482447117258, + 0.0498912718765, + 0.0515933428479, + 0.0533527487771, + 0.0551713704404, + 0.0570511466669, + 0.0589940759555, + 0.0610022178582, + 0.0630776947692, + 0.0652226933562, + 0.0674394661644, + 0.0697303332629, + 0.0720976838858, + 0.0745439780169, + 0.0770717479461, + 0.0796836000758, + 0.0823822163403, + 0.0851703559633, + 0.088050856993, + 0.0910266378161, + 0.0941006988912, + 0.0972761240663, + 0.100556082188, + 0.103943828468, + 0.107442705943, + 0.111056146665, + 0.114787673145, + 0.118640899195, + 0.122619531423, + 0.126727369737, + 0.13096830851, + 0.135346337111, + 0.139865540509, + 0.144530099585, + 0.149344291404, + 0.154312489091, + 0.159439161635, + 0.164728873344, + 0.170186283046, + 0.175816143046, + 0.181623297531, + 0.187612680939, + 0.193789315661, + 0.200158309327, + 0.206724851777, + 0.21349421136, + 0.220471730604, + 0.227662821679, + 0.235072960478, + 0.242707680729, + 0.250572566831, + 0.258673246022, + 0.267015379639, + 0.275604653386, + 0.284446766475, + 0.293547419806, + 0.302912302573, + 0.31254707826, + 0.322457368032, + 0.332648734256, + 0.343126660525, + 0.353896531878, + 0.364963611367, + 0.376333016315, + 0.388009690885, + 0.399998378078, + 0.412303587611, + 0.424929563133, + 0.437880244867, + 0.451159231406, + 0.464769736624, + 0.478714545325, + 0.492995963863, + 0.507615768983, + 0.5225751516, + 0.537874658217, + 0.553514127136, + 0.569492621954, + 0.585808360018, + 0.602458636896, + 0.619439747039, + 0.636746899062, + 0.654374127989, + 0.672314201529, + 0.690558523777, + 0.709097032872, + 0.727918096405, + 0.747008401237, + 0.766352841478, + 0.785934401692, + 0.805734039099, + 0.825730562109, + 0.845900509102, + 0.866218025261, + 0.886654741386, + 0.907179652969, + 0.927759003442, + 0.94835617134, + 0.968931563232, + 0.989442515824, + 1.0098432062, + 1.0300845762, + 1.05011426919, + 1.06987658532, + 1.08931245457, + 1.10835943293, + 1.12695172125, + 1.14502021212, + 1.16249256378, + 1.17929330579, + 1.1953439748, + 1.21056328376, + 1.22486732173, + 1.23816978566, + 1.25038223923, + 1.26141439724, + 1.27117442889, + 1.27956927348, + 1.28650496122, + 1.29188692741, + 1.29562031165, + 1.29761022783, + 1.29776199654, + 1.29598132746, + 1.2921744477, + 1.28624817288, + 1.27810993045, + 1.26766775274, + 1.25483027812, + 1.23950681554, + 1.22160755995, + 1.2010440746, + 1.17773019921, + 1.15158358186, + 1.12252808111, + 1.09049732236, + 1.05543972817, + 1.01732534901, + 0.976154797835, + 0.931970508628, + 0.884870371134, + 0.835023512766, + 0.782687554937, + 0.728226037827, + 0.672123833639, + 0.614997253509, + 0.557594209251, + 0.500778347904, + 0.445489790297, + 0.392674526687, + 0.343175622666, + 0.297583875872, + 0.25605626755, + 0.218132088816, + 0.182616309671, + 0.147669394159, + 0.111357610586, + 0.0731304313996, + 0.0372383026991, + 0.00588915966765, + -0.000781661695892, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "cutoff_radius": 0.0, + "ultrasoft_cutoff_radius": 0.0 + }, + { + "label": "", + "angular_momentum": 1, + "radial_function": [ + 0.0, + 2.35411804572e-12, + 4.58318942913e-08, + 4.11353976059e-08, + 4.13354720353e-08, + 4.09684684353e-08, + 4.05623148916e-08, + 4.00677765701e-08, + 3.94846255069e-08, + 3.88089777128e-08, + 3.80235449313e-08, + 3.71398559648e-08, + 3.61487389184e-08, + 3.50454937772e-08, + 3.3809059848e-08, + 3.24588110204e-08, + 3.09874008936e-08, + 2.93403010317e-08, + 2.76042580589e-08, + 2.56699120467e-08, + 2.36155986841e-08, + 2.13745763727e-08, + 1.89612480091e-08, + 1.63916719547e-08, + 1.36261767198e-08, + 1.06600914569e-08, + 7.49065495887e-09, + 4.12811368393e-09, + 5.23158331888e-10, + -3.28403547263e-09, + -7.37588358288e-09, + -1.16589658862e-08, + -1.62315636954e-08, + -2.10904230591e-08, + -2.62008055233e-08, + -3.16145570836e-08, + -3.73383690392e-08, + -4.33812571628e-08, + -4.97261032047e-08, + -5.6470801675e-08, + -6.3541200125e-08, + -7.09555027165e-08, + -7.88204216381e-08, + -8.70501077575e-08, + -9.56835387939e-08, + -1.04797443862e-07, + -1.14319683007e-07, + -1.24383011362e-07, + -1.34828395671e-07, + -1.45910617155e-07, + -1.57418851219e-07, + -1.6952961569e-07, + -1.82212632482e-07, + -1.95459871212e-07, + -2.09364257444e-07, + -2.23873552066e-07, + -2.3909376655e-07, + -2.54951157485e-07, + -2.71581531369e-07, + -2.8893788159e-07, + -3.07054533198e-07, + -3.26018369782e-07, + -3.45776327845e-07, + -3.66395791412e-07, + -3.87995667057e-07, + -4.10462063203e-07, + -4.33899824635e-07, + -4.58346775338e-07, + -4.83921465804e-07, + -5.10484410951e-07, + -5.38193011852e-07, + -5.67151041597e-07, + -5.97182512606e-07, + -6.28627800696e-07, + -6.6125999389e-07, + -6.95340562315e-07, + -7.30736989932e-07, + -7.6768237327e-07, + -8.06047219612e-07, + -8.46056977972e-07, + -8.877150354e-07, + -9.30989463886e-07, + -9.76019969873e-07, + -1.02292965446e-06, + -1.0716256603e-06, + -1.12243013704e-06, + -1.17509459652e-06, + -1.22991987513e-06, + -1.28699891185e-06, + -1.34618238129e-06, + -1.40786528739e-06, + -1.471844628e-06, + -1.53840498756e-06, + -1.6075407074e-06, + -1.67940964346e-06, + -1.75408850521e-06, + -1.83158702524e-06, + -1.91219183693e-06, + -1.99581599833e-06, + -2.0827750333e-06, + -2.17302257401e-06, + -2.26671488078e-06, + -2.36403478466e-06, + -2.46511425903e-06, + -2.56995963415e-06, + -2.67894070658e-06, + -2.79189807613e-06, + -2.90925120845e-06, + -3.03103420763e-06, + -3.15745172329e-06, + -3.28861791925e-06, + -3.42464326508e-06, + -3.56595270776e-06, + -3.71246864523e-06, + -3.86446793423e-06, + -4.02224970624e-06, + -4.18582158546e-06, + -4.35557307481e-06, + -4.53166245272e-06, + -4.71422383005e-06, + -4.90367034563e-06, + -5.10008755472e-06, + -5.30378418382e-06, + -5.51515227926e-06, + -5.73406461878e-06, + -5.96132093696e-06, + -6.19682724194e-06, + -6.44103176742e-06, + -6.69423213242e-06, + -6.95671120258e-06, + -7.22891722689e-06, + -7.51093013791e-06, + -7.80345006251e-06, + -8.10652483867e-06, + -8.42073467972e-06, + -8.74642113098e-06, + -9.0839995275e-06, + -9.43379164575e-06, + -9.79641981663e-06, + -1.01721579916e-05, + -1.0561546695e-05, + -1.09651015875e-05, + -1.13832722882e-05, + -1.18165094817e-05, + -1.22655803158e-05, + -1.27307266696e-05, + -1.32127658465e-05, + -1.37121941319e-05, + -1.42296263025e-05, + -1.47656928899e-05, + -1.53210628062e-05, + -1.58964131015e-05, + -1.64925071014e-05, + -1.71098518495e-05, + -1.77495561196e-05, + -1.84120672947e-05, + -1.90983855053e-05, + -1.98093123197e-05, + -2.05456094862e-05, + -2.13083217364e-05, + -2.20982699982e-05, + -2.29163873403e-05, + -2.376392287e-05, + -2.46413471865e-05, + -2.55503827499e-05, + -2.64916380778e-05, + -2.74665524978e-05, + -2.84760000843e-05, + -2.95215384165e-05, + -3.06040939918e-05, + -3.17252720218e-05, + -3.28861969152e-05, + -3.40883155817e-05, + -3.53331597983e-05, + -3.66221051825e-05, + -3.79566611939e-05, + -3.93386920613e-05, + -4.07695444003e-05, + -4.22510966158e-05, + -4.37849276939e-05, + -4.53732112858e-05, + -4.70175239449e-05, + -4.8719982493e-05, + -5.04824802038e-05, + -5.23072496865e-05, + -5.41965196632e-05, + -5.61522750147e-05, + -5.8177084205e-05, + -6.02732316225e-05, + -6.2443231916e-05, + -6.46897321752e-05, + -6.7015245753e-05, + -6.94225861658e-05, + -7.1914635817e-05, + -7.44944401532e-05, + -7.71648376538e-05, + -7.9929128593e-05, + -8.27904713432e-05, + -8.57523992648e-05, + -8.88183064978e-05, + -9.19917737559e-05, + -9.52767517653e-05, + -9.86766604566e-05, + -0.000102196112442, + -0.000105838777817, + -0.000109609130132, + -0.000113511669223, + -0.000117550795654, + -0.000121731404063, + -0.000126058412964, + -0.000130536812279, + -0.000135171982567, + -0.00013996915421, + -0.000144934258088, + -0.000150072847813, + -0.000155391113973, + -0.000160895227245, + -0.000166591659037, + -0.000172487021895, + -0.000178588333316, + -0.000184902549107, + -0.000191437396463, + -0.000198200088524, + -0.000205198843652, + -0.000212441757003, + -0.000219937167007, + -0.000227694161378, + -0.00023572141258, + -0.000244028524184, + -0.000252625156769, + -0.000261521281388, + -0.000270727427929, + -0.000280253993817, + -0.000290112579384, + -0.000300314242985, + -0.000310871111586, + -0.000321795455506, + -0.000333099852337, + -0.000344797675268, + -0.000356902436282, + -0.000369428145281, + -0.000382389553565, + -0.000395801566668, + -0.000409679941784, + -0.000424040732008, + -0.000438900547806, + -0.00045427690592, + -0.000470187268584, + -0.00048665061365, + -0.00050368568188, + -0.000521312370235, + -0.000539551267158, + -0.000558423319742, + -0.000577950556917, + -0.00059815562775, + -0.00061906195476, + -0.000640693784058, + -0.000663076113472, + -0.000686235078926, + -0.000710197302613, + -0.000734990700142, + -0.000760643886102, + -0.000787186730019, + -0.000814649767823, + -0.000843064925244, + -0.000872465097324, + -0.000902884164722, + -0.000934357501154, + -0.000966921404618, + -0.00100061363056, + -0.00103547302437, + -0.00107154002739, + -0.00110885612398, + -0.00114746469049, + -0.00118741011992, + -0.00122873861752, + -0.00127149809417, + -0.0013157376442, + -0.00136150856401, + -0.00140886355789, + -0.00145785730127, + -0.00150854641266, + -0.00156098923259, + -0.00161524640593, + -0.0016713802153, + -0.00172945594434, + -0.00178953972439, + -0.00185170145428, + -0.00191601258504, + -0.00198254704431, + -0.00205138163689, + -0.00212259545139, + -0.00219627071036, + -0.00227249197878, + -0.00235134706915, + -0.00243292666511, + -0.00251732458103, + -0.00260463796315, + -0.00269496708015, + -0.00278841575133, + -0.00288509144224, + -0.00298510508381, + -0.00308857163914, + -0.00319560988707, + -0.00330634256535, + -0.00342089711425, + -0.00353940423886, + -0.00366200070168, + -0.00378882648444, + -0.00392002713085, + -0.00405575308164, + -0.00419615957408, + -0.00434140772224, + -0.00449166345868, + -0.00464709887876, + -0.00480789202478, + -0.0049742263838, + -0.0051462923421, + -0.00532428658156, + -0.00550841226294, + -0.00569887980213, + -0.00589590640027, + -0.00609971724561, + -0.00631054427662, + -0.00652862838332, + -0.00675421753482, + -0.006987569146, + -0.00722894861811, + -0.00747863069017, + -0.00773689935123, + -0.00800404817977, + -0.00828038070267, + -0.00856621075505, + -0.00886186257913, + -0.00916767182554, + -0.00948398481584, + -0.00981116009179, + -0.0101495680833, + -0.0104995915736, + -0.0108616264755, + -0.0112360816774, + -0.0116233801702, + -0.0120239587067, + -0.0124382690278, + -0.0128667780637, + -0.0133099674399, + -0.0137683364849, + -0.0142423996369, + -0.0147326892511, + -0.0152397553776, + -0.0157641660289, + -0.0163065082616, + -0.0168673887078, + -0.017447433807, + -0.0180472907722, + -0.0186676282033, + -0.0193091369257, + -0.019972530018, + -0.0206585442562, + -0.0213679406338, + -0.0221015047527, + -0.022860048088, + -0.0236444083319, + -0.0244554506747, + -0.0252940681202, + -0.026161182494, + -0.0270577457505, + -0.0279847402106, + -0.0289431796864, + -0.0299341105964, + -0.0309586128423, + -0.0320178004885, + -0.0331128230958, + -0.0342448668615, + -0.0354151548154, + -0.0366249489407, + -0.0378755506274, + -0.0391683017796, + -0.0405045861706, + -0.0418858303361, + -0.0433135046945, + -0.0447891252765, + -0.0463142537286, + -0.047890500005, + -0.0495195218676, + -0.0512030281178, + -0.0529427777376, + -0.0547405825418, + -0.0565983081309, + -0.0585178744595, + -0.0605012583009, + -0.0625504931543, + -0.0646676715512, + -0.066854945677, + -0.0691145290577, + -0.0714486968814, + -0.0738597889049, + -0.0763502082894, + -0.0789224250939, + -0.0815789755944, + -0.0843224644347, + -0.0871555650953, + -0.0900810212632, + -0.0931016475511, + -0.096220329887, + -0.0994400277748, + -0.102763772982, + -0.106194671863, + -0.109735904849, + -0.113390727167, + -0.117162469311, + -0.121054536722, + -0.125070410204, + -0.12921364523, + -0.133487872151, + -0.137896795158, + -0.142444191641, + -0.147133911103, + -0.151969873947, + -0.156956070057, + -0.162096556305, + -0.16739545507, + -0.17285695123, + -0.178485289719, + -0.184284770982, + -0.190259748972, + -0.196414625538, + -0.20275384593, + -0.209281893649, + -0.216003284758, + -0.222922561122, + -0.23004428271, + -0.237373020991, + -0.244913348926, + -0.252669832521, + -0.260647020149, + -0.268849430835, + -0.277281543517, + -0.285947782331, + -0.294852503311, + -0.303999978588, + -0.313394380334, + -0.323039762045, + -0.332940040862, + -0.343098974646, + -0.353520143391, + -0.364206922011, + -0.375162458026, + -0.386389643386, + -0.397891086468, + -0.409669081291, + -0.421725576093, + -0.434062138321, + -0.446679919174, + -0.459579615026, + -0.472761427254, + -0.486225020073, + -0.499969474827, + -0.513993244382, + -0.528294103197, + -0.542869095543, + -0.5577144823, + -0.572825684613, + -0.588197224641, + -0.603822667175, + -0.619694553676, + -0.635804339838, + -0.652142327551, + -0.668697596012, + -0.685457931468, + -0.7024097551, + -0.71953804911, + -0.736826283198, + -0.754256337375, + -0.771808430137, + -0.789461036802, + -0.807190821765, + -0.824972556128, + -0.842779052663, + -0.860581087933, + -0.878347340969, + -0.896044321989, + -0.913636319395, + -0.931085337324, + -0.948351054425, + -0.965390774256, + -0.982159399561, + -0.998609400483, + -1.0146908081, + -1.03035120565, + -1.045535746, + -1.06018717155, + -1.07424586086, + -1.08764988186, + -1.10033507325, + -1.11223513911, + -1.12328176587, + -1.13340476578, + -1.14253223595, + -1.15059075191, + -1.15750557466, + -1.16320089641, + -1.16760009907, + -1.1706260523, + -1.17220142458, + -1.17224903181, + -1.17069219819, + -1.16745515157, + -1.16246342743, + -1.1556443024, + -1.14692723168, + -1.13624430823, + -1.12353071882, + -1.10872521088, + -1.0917705527, + -1.07261398329, + -1.05120765707, + -1.02750905749, + -1.00148140052, + -0.973093995922, + -0.942322588674, + -0.909149656138, + -0.873564680332, + -0.835564379211, + -0.795152921611, + -0.752342116131, + -0.707151606388, + -0.659609075269, + -0.609750498538, + -0.557620464805, + -0.50327261534, + -0.446770232941, + -0.388187045699, + -0.327608291502, + -0.265132106848, + -0.200871304141, + -0.134955584325, + -0.0675342466085, + 0.00122058872793, + 0.0711102218012, + 0.141905124761, + 0.213340269752, + 0.285110192066, + 0.356864006863, + 0.428200721392, + 0.498665283813, + 0.56774596985, + 0.634873834169, + 0.699425130624, + 0.760727728313, + 0.818072685096, + 0.87073217655, + 0.917984959214, + 0.959150334015, + 0.993631189939, + 1.02096599559, + 1.0408885206, + 1.05339249788, + 1.05879626079, + 1.05779957541, + 1.0515213521, + 1.04150281308, + 1.02965621386, + 1.0181350108, + 1.00909845161, + 1.0043438293, + 1.0047860272, + 1.00978122325, + 1.01632686416, + 1.01823401301, + 1.00547674498, + 0.964099190491, + 0.87733827086, + 0.729033343324, + 0.511127030934, + 0.234810300012, + 0.0353418517519, + -0.00121173333631, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "cutoff_radius": 0.0, + "ultrasoft_cutoff_radius": 0.0 + }, + { + "label": "", + "angular_momentum": 2, + "radial_function": [ + 0.0, + 1.02128941043e-17, + -7.88969465834e-12, + -7.26823772401e-12, + -7.48723218493e-12, + -7.62555703417e-12, + -7.77377067672e-12, + -7.92279740796e-12, + -8.07333773043e-12, + -8.2251443415e-12, + -8.3779500347e-12, + -8.53160777998e-12, + -8.68579631187e-12, + -8.84031323118e-12, + -8.9947573249e-12, + -9.14885129126e-12, + -9.30236361539e-12, + -9.45451198534e-12, + -9.60550237747e-12, + -9.75414419006e-12, + -9.90061854531e-12, + -1.00438898584e-11, + -1.01835241191e-11, + -1.03190979277e-11, + -1.04496736219e-11, + -1.05746536286e-11, + -1.06932955271e-11, + -1.08042993136e-11, + -1.09076952124e-11, + -1.10018278436e-11, + -1.1085329056e-11, + -1.1158122985e-11, + -1.12182886856e-11, + -1.12642774223e-11, + -1.12956860777e-11, + -1.13101961019e-11, + -1.13066011288e-11, + -1.1283382398e-11, + -1.12380322252e-11, + -1.11695287851e-11, + -1.10757296599e-11, + -1.09536067001e-11, + -1.08019325253e-11, + -1.06168745248e-11, + -1.03984229863e-11, + -1.01400238596e-11, + -9.84242574787e-12, + -9.49900749344e-12, + -9.11030129955e-12, + -8.66812146951e-12, + -8.17304638607e-12, + -7.61855472809e-12, + -6.99982981595e-12, + -6.31528396567e-12, + -5.55646163336e-12, + -4.72110363268e-12, + -3.79986285387e-12, + -2.79420359625e-12, + -1.68884916048e-12, + -4.83722102137e-13, + 8.30169743337e-13, + 2.26082711473e-12, + 3.81415421576e-12, + 5.50018891641e-12, + 7.32942488916e-12, + 9.30560398525e-12, + 1.14434809415e-11, + 1.37498723395e-11, + 1.62426905378e-11, + 1.89232219645e-11, + 2.18129691915e-11, + 2.4920155894e-11, + 2.82599293746e-11, + 3.18483355355e-11, + 3.56994424113e-11, + 3.98291132802e-11, + 4.42560407282e-11, + 4.89951437324e-11, + 5.40758889572e-11, + 5.95070050609e-11, + 6.53192274804e-11, + 7.15236966089e-11, + 7.81637393774e-11, + 8.52461506937e-11, + 9.28106210556e-11, + 1.00879143052e-10, + 1.09487080707e-10, + 1.18662173316e-10, + 1.28444007502e-10, + 1.3885872561e-10, + 1.49956802598e-10, + 1.61770561766e-10, + 1.74338071335e-10, + 1.87717978649e-10, + 2.01952225916e-10, + 2.17074613564e-10, + 2.33161537012e-10, + 2.50257109799e-10, + 2.68424271334e-10, + 2.87708401743e-10, + 3.08209312884e-10, + 3.29961503223e-10, + 3.53055406032e-10, + 3.77570813673e-10, + 4.03572601832e-10, + 4.31172517748e-10, + 4.604200745e-10, + 4.91470576277e-10, + 5.24361728633e-10, + 5.59246372905e-10, + 5.96222657522e-10, + 6.35380275392e-10, + 6.76901597186e-10, + 7.20869923055e-10, + 7.67440981235e-10, + 8.16772000934e-10, + 8.69001753119e-10, + 9.24287563164e-10, + 9.82847420939e-10, + 1.04478753958e-09, + 1.11037281249e-09, + 1.17974731244e-09, + 1.25317562758e-09, + 1.33085224856e-09, + 1.41298514491e-09, + 1.49990143052e-09, + 1.59179533677e-09, + 1.68897031689e-09, + 1.79172472104e-09, + 1.90035156881e-09, + 2.01519219022e-09, + 2.13657506072e-09, + 2.26486264891e-09, + 2.40044997164e-09, + 2.54372049164e-09, + 2.69511840306e-09, + 2.85504681933e-09, + 3.02404425837e-09, + 3.20252818507e-09, + 3.39108965851e-09, + 3.59021825375e-09, + 3.80054750285e-09, + 4.02265704988e-09, + 4.25717291749e-09, + 4.50482822376e-09, + 4.76627790813e-09, + 5.04232723048e-09, + 5.3337175346e-09, + 5.64132484673e-09, + 5.96601613123e-09, + 6.30871207106e-09, + 6.67039029219e-09, + 7.05208567334e-09, + 7.45489493351e-09, + 7.8799438418e-09, + 8.32839406761e-09, + 8.80163041172e-09, + 9.30085988351e-09, + 9.82754906589e-09, + 1.0383220009e-08, + 1.09693291492e-08, + 1.15876054619e-08, + 1.22397697152e-08, + 1.29275661532e-08, + 1.36530474336e-08, + 1.44181145807e-08, + 1.522497782e-08, + 1.60758352821e-08, + 1.6973104068e-08, + 1.79191449545e-08, + 1.89167556525e-08, + 1.99685842178e-08, + 2.10775083217e-08, + 2.22467585037e-08, + 2.34792495594e-08, + 2.47787552276e-08, + 2.61485432797e-08, + 2.75925434838e-08, + 2.91146382457e-08, + 3.07190220731e-08, + 3.24101251994e-08, + 3.41925080803e-08, + 3.60711385256e-08, + 3.80509752733e-08, + 4.01376047976e-08, + 4.23366256236e-08, + 4.46540246836e-08, + 4.70961301988e-08, + 4.96695285313e-08, + 5.2381247693e-08, + 5.52386512477e-08, + 5.82494611217e-08, + 6.14218695766e-08, + 6.47643310928e-08, + 6.82860994491e-08, + 7.19965531217e-08, + 7.5905599933e-08, + 8.00241406384e-08, + 8.43627921106e-08, + 8.89337598525e-08, + 9.37488773784e-08, + 9.88214078318e-08, + 1.0416485822e-07, + 1.09793569175e-07, + 1.1572282248e-07, + 1.21968224789e-07, + 1.28546746072e-07, + 1.35476010825e-07, + 1.42774483952e-07, + 1.5046159653e-07, + 1.58558181641e-07, + 1.6708575749e-07, + 1.7606687811e-07, + 1.85525915341e-07, + 1.95487800511e-07, + 2.05979308756e-07, + 2.17028175105e-07, + 2.28664013756e-07, + 2.40917868467e-07, + 2.53821962667e-07, + 2.67411185905e-07, + 2.81721249485e-07, + 2.96790223113e-07, + 3.12658340856e-07, + 3.29367544441e-07, + 3.46962165136e-07, + 3.65489064312e-07, + 3.84997113248e-07, + 4.05538201589e-07, + 4.27166613447e-07, + 4.49939694271e-07, + 4.7391778558e-07, + 4.99163958212e-07, + 5.25745618393e-07, + 5.5373240622e-07, + 5.83198726396e-07, + 6.14222134782e-07, + 6.46884719529e-07, + 6.8127254158e-07, + 7.17476720001e-07, + 7.55592108313e-07, + 7.95719861835e-07, + 8.37965286604e-07, + 8.82440031641e-07, + 9.29261108689e-07, + 9.78551722601e-07, + 1.03044189685e-06, + 1.08506797634e-06, + 1.14257374777e-06, + 1.20311036917e-06, + 1.2668371913e-06, + 1.33392167531e-06, + 1.40454005417e-06, + 1.4788779181e-06, + 1.55713025528e-06, + 1.63950316913e-06, + 1.72621196305e-06, + 1.81748518541e-06, + 1.91356127049e-06, + 2.01469331674e-06, + 2.12114561426e-06, + 2.23319759458e-06, + 2.35114320615e-06, + 2.47529110413e-06, + 2.60596653074e-06, + 2.74351211693e-06, + 2.88828779074e-06, + 3.0406725926e-06, + 3.20106497318e-06, + 3.36988589387e-06, + 3.54757554963e-06, + 3.73459955714e-06, + 3.93144697287e-06, + 4.13863219116e-06, + 4.35669704384e-06, + 4.58621132967e-06, + 4.82777516699e-06, + 5.08201916172e-06, + 5.34960764056e-06, + 5.63123907705e-06, + 5.92765008966e-06, + 6.23961281608e-06, + 6.56794258437e-06, + 6.91349601895e-06, + 7.27717462986e-06, + 7.65992762907e-06, + 8.06275260446e-06, + 8.48670044528e-06, + 8.93287742273e-06, + 9.4024450401e-06, + 9.89662933657e-06, + 1.04167160616e-05, + 1.09640624386e-05, + 1.15400935007e-05, + 1.21463093712e-05, + 1.27842906574e-05, + 1.34556971619e-05, + 1.41622781295e-05, + 1.490587213e-05, + 1.56884159681e-05, + 1.65119452883e-05, + 1.73786040223e-05, + 1.82906467015e-05, + 1.92504456537e-05, + 2.02604984459e-05, + 2.13234315928e-05, + 2.24420092879e-05, + 2.36191392295e-05, + 2.48578836289e-05, + 2.61614593438e-05, + 2.75332583855e-05, + 2.89768421263e-05, + 3.04959637822e-05, + 3.20945681359e-05, + 3.37768099121e-05, + 3.55470572492e-05, + 3.74099070516e-05, + 3.93701977149e-05, + 4.1433017315e-05, + 4.36037219291e-05, + 4.58879452109e-05, + 4.82916149791e-05, + 5.08209699077e-05, + 5.34825708769e-05, + 5.6283324433e-05, + 5.92304927287e-05, + 6.23317226142e-05, + 6.5595053745e-05, + 6.90289482863e-05, + 7.26423080881e-05, + 7.64444998322e-05, + 8.04453777252e-05, + 8.4655309639e-05, + 8.90852029034e-05, + 9.37465352589e-05, + 9.86513804167e-05, + 0.000103812440806, + 0.000109243081517, + 0.0001149573649, + 0.000120970081366, + 0.000127296795796, + 0.000133953882751, + 0.000140958563402, + 0.000148328965527, + 0.000156084152707, + 0.000164244179641, + 0.000172830152203, + 0.000181864264171, + 0.000191369874276, + 0.000201371546755, + 0.000211895126815, + 0.000222967806881, + 0.000234618185494, + 0.000246876357065, + 0.000259773968168, + 0.000273344321125, + 0.0002876224406, + 0.000302645172918, + 0.000318451280713, + 0.00033508153253, + 0.000352578817329, + 0.000370988252146, + 0.00039035728947, + 0.000410735846493, + 0.000432176431776, + 0.000454734267173, + 0.000478467451867, + 0.000503437081362, + 0.00052970742764, + 0.00055734608276, + 0.000586424148168, + 0.000617016400358, + 0.00064920148371, + 0.000683062120694, + 0.000718685302324, + 0.000756162523184, + 0.000795590008519, + 0.000837068947466, + 0.000880705764999, + 0.000926612378558, + 0.000974906475852, + 0.0010257118271, + 0.00107915857496, + 0.00113538357942, + 0.00119453074383, + 0.0012567513964, + 0.00132220463824, + 0.00139105777221, + 0.00146348669569, + 0.00153967635376, + 0.00161982118753, + 0.00170412562929, + 0.00179280458915, + 0.00188608401341, + 0.00198420142322, + 0.00208740650063, + 0.00219596172021, + 0.00231014296341, + 0.00243024024013, + 0.00255655834628, + 0.00268941765435, + 0.00282915486808, + 0.00297612383919, + 0.00313069646183, + 0.00329326351509, + 0.00346423566127, + 0.00364404441073, + 0.00383314315518, + 0.00403200826811, + 0.00424114023452, + 0.00446106484604, + 0.00469233445866, + 0.00493552928226, + 0.00519125877487, + 0.00546016305844, + 0.00574291443097, + 0.00604021892868, + 0.00635281798157, + 0.00668149012219, + 0.00702705279148, + 0.00739036421082, + 0.00777232535265, + 0.00817388200122, + 0.00859602687444, + 0.00903980189276, + 0.0095063004983, + 0.00999667010673, + 0.0105121146516, + 0.0110538972386, + 0.0116233429255, + 0.0122218416052, + 0.0128508510129, + 0.0135118998691, + 0.0142065911213, + 0.0149366053823, + 0.0157037044136, + 0.0165097348284, + 0.0173566318905, + 0.0182464234868, + 0.0191812342386, + 0.0201632897459, + 0.0211949210416, + 0.0222785691392, + 0.0234167897881, + 0.0246122583717, + 0.0258677749592, + 0.0271862695927, + 0.0285708075318, + 0.0300245950534, + 0.0315509849139, + 0.0331534824179, + 0.0348357513685, + 0.0366016202934, + 0.0384550887834, + 0.0404003339493, + 0.0424417170982, + 0.044583790443, + 0.0468313039267, + 0.0491892122569, + 0.0516626818801, + 0.0542570981119, + 0.0569780722774, + 0.0598314489088, + 0.0628233128175, + 0.0659599963847, + 0.069248086387, + 0.0726944311595, + 0.0763061471868, + 0.0800906258203, + 0.0840555394856, + 0.0882088477342, + 0.0925588028426, + 0.0971139549175, + 0.101883156502, + 0.106875566567, + 0.112100653606, + 0.117568198195, + 0.123288294158, + 0.12927134903, + 0.13552808299, + 0.142069526592, + 0.148907016664, + 0.156052190779, + 0.163516979375, + 0.171313596072, + 0.1794545251, + 0.187952506572, + 0.196820518227, + 0.206071754418, + 0.215719601029, + 0.225777606902, + 0.236259450486, + 0.247178902369, + 0.258549781939, + 0.270385909294, + 0.282701050531, + 0.295508856672, + 0.308822795958, + 0.322656077766, + 0.337021569549, + 0.351931703936, + 0.367398377744, + 0.383432840224, + 0.400045571867, + 0.41724615146, + 0.435043112592, + 0.453443787407, + 0.472454138881, + 0.492078579556, + 0.512319778162, + 0.533178452109, + 0.554653147907, + 0.5767400074, + 0.599432522037, + 0.622721274645, + 0.646593669329, + 0.671033651762, + 0.696021419349, + 0.721533125014, + 0.747540574564, + 0.774010922027, + 0.800906363912, + 0.82818383698, + 0.855794721717, + 0.883684556573, + 0.911792764831, + 0.940052400656, + 0.968389914864, + 0.996724947064, + 1.02497014368, + 1.05303100641, + 1.08080576879, + 1.10818530139, + 1.13505304024, + 1.16128493199, + 1.18674938647, + 1.21130722087, + 1.23481158028, + 1.25710781007, + 1.27803325826, + 1.29741697801, + 1.31507930653, + 1.33083129398, + 1.34447397088, + 1.3557974509, + 1.36457989686, + 1.37058640761, + 1.3735679386, + 1.37326043197, + 1.36938442104, + 1.36164547543, + 1.34973597887, + 1.33333886033, + 1.31213403435, + 1.2858084119, + 1.25407039402, + 1.21666970814, + 1.17342320366, + 1.12424672532, + 1.06919227969, + 1.00848829825, + 0.942578736973, + 0.872153974892, + 0.798163033673, + 0.721792927605, + 0.644397867203, + 0.567360622966, + 0.491874340595, + 0.418652438162, + 0.34761873151, + 0.277720167402, + 0.207171309821, + 0.134760960508, + 0.0631870151208, + 0.00806410488881, + -0.000833156478808, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "cutoff_radius": 0.0, + "ultrasoft_cutoff_radius": 0.0 + }, + { + "label": "", + "angular_momentum": 2, + "radial_function": [ + 0.0, + -8.40132472904e-17, + -5.16852484413e-11, + -4.76152453946e-11, + -4.90520875565e-11, + -4.99620396554e-11, + -5.09388327178e-11, + -5.19235515409e-11, + -5.29213891395e-11, + -5.39313204826e-11, + -5.49523569156e-11, + -5.59841985191e-11, + -5.70257103359e-11, + -5.80762726142e-11, + -5.91343100839e-11, + -6.01992083816e-11, + -6.12701183461e-11, + -6.23437616236e-11, + -6.34220551603e-11, + -6.44994175957e-11, + -6.55777778525e-11, + -6.66525011944e-11, + -6.77223275419e-11, + -6.87863573319e-11, + -6.98404652838e-11, + -7.0882711439e-11, + -7.19104212697e-11, + -7.29193485294e-11, + -7.3908747773e-11, + -7.4873726962e-11, + -7.58077671462e-11, + -7.67122941695e-11, + -7.7579326563e-11, + -7.84029958268e-11, + -7.91822515208e-11, + -7.99088433203e-11, + -8.0577682814e-11, + -8.11832912047e-11, + -8.1717672797e-11, + -8.21739931758e-11, + -8.2547208655e-11, + -8.28264977803e-11, + -8.30034201091e-11, + -8.30674452447e-11, + -8.30183392267e-11, + -8.28289944184e-11, + -8.25052212491e-11, + -8.20185921734e-11, + -8.13772539398e-11, + -8.05428020525e-11, + -7.95242871734e-11, + -7.82936045971e-11, + -7.68315069484e-11, + -7.51378220674e-11, + -7.31729520508e-11, + -7.09359029672e-11, + -6.83854408037e-11, + -6.55317130367e-11, + -6.23136072608e-11, + -5.87333398787e-11, + -5.47565113201e-11, + -5.03510719232e-11, + -4.54991920236e-11, + -4.01590080254e-11, + -3.42901725049e-11, + -2.78816634637e-11, + -2.08781578171e-11, + -1.32521695628e-11, + -4.93336658176e-12, + 4.07906277065e-12, + 1.38624446363e-11, + 2.44639160706e-11, + 3.59144590791e-11, + 4.83071032823e-11, + 6.16630369947e-11, + 7.6071595138e-11, + 9.15733968862e-11, + 1.08256985322e-10, + 1.26203807016e-10, + 1.45469005377e-10, + 1.6616270995e-10, + 1.88321308003e-10, + 2.12108170591e-10, + 2.37565945185e-10, + 2.64817646139e-10, + 2.93983371967e-10, + 3.2515670038e-10, + 3.58466745955e-10, + 3.94070857352e-10, + 4.32035325792e-10, + 4.72595432119e-10, + 5.15835575562e-10, + 5.61923179233e-10, + 6.11066551639e-10, + 6.63440667911e-10, + 7.19166488992e-10, + 7.78519675452e-10, + 8.41694310592e-10, + 9.08901382882e-10, + 9.80352201958e-10, + 1.05637765766e-09, + 1.13713913764e-09, + 1.22298340578e-09, + 1.31419240802e-09, + 1.41103037757e-09, + 1.5139193265e-09, + 1.62303346295e-09, + 1.73897584281e-09, + 1.86189791432e-09, + 1.99236412199e-09, + 2.1307546237e-09, + 2.27739615384e-09, + 2.43301554047e-09, + 2.59790283715e-09, + 2.77265221485e-09, + 2.95786878088e-09, + 3.15407397373e-09, + 3.36187350112e-09, + 3.58209743914e-09, + 3.81512409048e-09, + 4.06200618638e-09, + 4.32325340073e-09, + 4.59988515404e-09, + 4.89266123427e-09, + 5.20230951464e-09, + 5.53016125355e-09, + 5.87688631197e-09, + 6.2436803309e-09, + 6.63164775776e-09, + 7.04192865837e-09, + 7.47581925966e-09, + 7.93453130224e-09, + 8.41951805491e-09, + 8.93218387001e-09, + 9.47407806087e-09, + 1.00468477237e-08, + 1.06520396547e-08, + 1.12916742492e-08, + 1.19673862708e-08, + 1.26813925288e-08, + 1.34355638383e-08, + 1.42323103127e-08, + 1.50738431716e-08, + 1.59625239155e-08, + 1.69011965422e-08, + 1.78922693185e-08, + 1.89388756338e-08, + 2.00438310978e-08, + 2.12104335126e-08, + 2.24420084999e-08, + 2.37420354157e-08, + 2.51142876108e-08, + 2.65626629663e-08, + 2.80912798181e-08, + 2.97045846639e-08, + 3.14068188761e-08, + 3.32033789173e-08, + 3.50988023394e-08, + 3.70986704802e-08, + 3.92087854154e-08, + 4.14347303124e-08, + 4.37829942617e-08, + 4.62602689601e-08, + 4.88729765479e-08, + 5.16291744615e-08, + 5.45359285583e-08, + 5.76017484501e-08, + 6.08349166314e-08, + 6.42446975451e-08, + 6.78400321469e-08, + 7.16316769947e-08, + 7.56295455923e-08, + 7.98447172614e-08, + 8.42894167363e-08, + 8.89748204505e-08, + 9.39151456695e-08, + 9.91230802507e-08, + 1.04613308489e-07, + 1.10400827182e-07, + 1.16501383369e-07, + 1.22932094054e-07, + 1.29710149441e-07, + 1.36854515111e-07, + 1.44384000589e-07, + 1.52319948257e-07, + 1.60683746675e-07, + 1.69497921006e-07, + 1.78786885818e-07, + 1.88575449692e-07, + 1.98890516288e-07, + 2.09760093131e-07, + 2.21213551976e-07, + 2.33281982778e-07, + 2.45997755569e-07, + 2.59396043975e-07, + 2.73512437147e-07, + 2.88384780811e-07, + 3.04054458081e-07, + 3.20562029919e-07, + 3.37953765589e-07, + 3.56274903281e-07, + 3.75575930463e-07, + 3.95907852682e-07, + 4.17325980373e-07, + 4.39887817553e-07, + 4.63653223555e-07, + 4.88686532231e-07, + 5.15054914917e-07, + 5.42828687194e-07, + 5.72081834454e-07, + 6.02893552451e-07, + 6.35345970898e-07, + 6.69524514966e-07, + 7.05522523474e-07, + 7.43434413056e-07, + 7.83362392236e-07, + 8.2541191976e-07, + 8.69695777748e-07, + 9.16331984682e-07, + 9.65443488202e-07, + 1.01716265237e-06, + 1.07162599618e-06, + 1.12897778135e-06, + 1.18937167607e-06, + 1.25296702598e-06, + 1.31993251799e-06, + 1.3904470074e-06, + 1.46469580607e-06, + 1.542876911e-06, + 1.62519671662e-06, + 1.71187365025e-06, + 1.80313723175e-06, + 1.89922740738e-06, + 2.00040102017e-06, + 2.10692289699e-06, + 2.21907633048e-06, + 2.33715635822e-06, + 2.46147540158e-06, + 2.59236125271e-06, + 2.73016024554e-06, + 2.87523364418e-06, + 3.02796636035e-06, + 3.18875902618e-06, + 3.35803676996e-06, + 3.53624451762e-06, + 3.72385133837e-06, + 3.92135209762e-06, + 4.1292649582e-06, + 4.34813808195e-06, + 4.57854585758e-06, + 4.8210947431e-06, + 5.07642221205e-06, + 5.34519845155e-06, + 5.62812954697e-06, + 5.92595779038e-06, + 6.23946679562e-06, + 6.56947594334e-06, + 6.91685462417e-06, + 7.28251000656e-06, + 7.66740461738e-06, + 8.07254410859e-06, + 8.49899118955e-06, + 8.94786434337e-06, + 9.42033696707e-06, + 9.91764661246e-06, + 1.04410964382e-05, + 1.09920546673e-05, + 1.15719637072e-05, + 1.21823385518e-05, + 1.282477961e-05, + 1.35009613006e-05, + 1.42126542143e-05, + 1.49617169369e-05, + 1.57501065763e-05, + 1.65798821491e-05, + 1.74532101614e-05, + 1.83723725261e-05, + 1.93397655529e-05, + 2.035791527e-05, + 2.14294757548e-05, + 2.2557247308e-05, + 2.37441642098e-05, + 2.49933248955e-05, + 2.6307984758e-05, + 2.76915685248e-05, + 2.91476848267e-05, + 3.06801202684e-05, + 3.22928703977e-05, + 3.39901360465e-05, + 3.57763292302e-05, + 3.76561063683e-05, + 3.96343506154e-05, + 4.17162158039e-05, + 4.39071129478e-05, + 4.62127373233e-05, + 4.86390893483e-05, + 5.11924700396e-05, + 5.38795180715e-05, + 5.67072116594e-05, + 5.96829000869e-05, + 6.28143070137e-05, + 6.61095665105e-05, + 6.95772304609e-05, + 7.32262972846e-05, + 7.70662376854e-05, + 8.11070130209e-05, + 8.53590992538e-05, + 8.98335238718e-05, + 9.45418893475e-05, + 9.94963880046e-05, + 0.000104709871685, + 0.000110195831354, + 0.000115968484852, + 0.000122042768807, + 0.000128434415265, + 0.000135159960741, + 0.000142236802926, + 0.000149683249849, + 0.000157518552422, + 0.000165762967999, + 0.000174437801387, + 0.000183565462217, + 0.000193169533421, + 0.000203274803067, + 0.000213907367444, + 0.00022509464792, + 0.000236865522324, + 0.000249250333519, + 0.000262281014622, + 0.000275991145364, + 0.000290416048682, + 0.000305592873157, + 0.00032156068981, + 0.000338360589546, + 0.000356035795184, + 0.00037463175565, + 0.000394196269541, + 0.000414779607779, + 0.000436434640407, + 0.000459216953604, + 0.000483185012021, + 0.00050840030074, + 0.00053492744506, + 0.000562834442922, + 0.000592192764951, + 0.000623077551236, + 0.000655567849021, + 0.000689746719837, + 0.00072570153727, + 0.000763524132182, + 0.000803311054506, + 0.000845163826522, + 0.000889189144306, + 0.000935499206309, + 0.000984211909309, + 0.00103545122822, + 0.00108934744479, + 0.0011460375078, + 0.00120566536256, + 0.00126838227978, + 0.00133434724667, + 0.00140372735895, + 0.00147669819141, + 0.00155344425153, + 0.00163415943001, + 0.00171904740871, + 0.00180832225631, + 0.00190220881652, + 0.0020009433416, + 0.00210477398481, + 0.00221396145233, + 0.00232877955765, + 0.00244951589187, + 0.0025764725284, + 0.00270996665917, + 0.00285033139441, + 0.00299791652098, + 0.0031530892617, + 0.00331623519824, + 0.00348775910416, + 0.00366808584103, + 0.0038576614098, + 0.00405695384699, + 0.00426645437253, + 0.00448667839208, + 0.00471816675807, + 0.00496148681311, + 0.00521723376738, + 0.00548603191482, + 0.00576853601379, + 0.00606543267874, + 0.0063774418628, + 0.00670531833223, + 0.00704985332297, + 0.00741187613633, + 0.00779225583079, + 0.00819190307753, + 0.00861177186961, + 0.00905286161859, + 0.00951621892612, + 0.0100029398065, + 0.010514171724, + 0.0110511157583, + 0.0116150290268, + 0.0122072267803, + 0.012829085068, + 0.0134820430762, + 0.014167605726, + 0.0148873463235, + 0.0156429092544, + 0.0164360127591, + 0.0172684518073, + 0.0181421009303, + 0.0190589172909, + 0.0200209436307, + 0.0210303114015, + 0.0220892438511, + 0.0232000592334, + 0.0243651739848, + 0.0255871059704, + 0.0268684776999, + 0.0282120195892, + 0.0296205732417, + 0.0310970945777, + 0.0326446570823, + 0.0342664549353, + 0.0359658060164, + 0.037746154907, + 0.0396110756805, + 0.0415642746698, + 0.0436095929271, + 0.0457510085597, + 0.0479926388287, + 0.0503387418824, + 0.0527937183985, + 0.0553621125332, + 0.0580486127439, + 0.0608580520286, + 0.0637954076634, + 0.0668658003988, + 0.0700744928949, + 0.0734268876862, + 0.0769285240543, + 0.080585074317, + 0.0844023389003, + 0.0883862406898, + 0.0925428179797, + 0.0968782159853, + 0.101398678002, + 0.106110533533, + 0.111020186332, + 0.11613409983, + 0.121458781086, + 0.127000762736, + 0.132766582654, + 0.138762761825, + 0.144995779348, + 0.151472045032, + 0.158197869698, + 0.165179432144, + 0.172422743467, + 0.179933608195, + 0.187717582367, + 0.195779927726, + 0.20412556364, + 0.212759013714, + 0.221684350753, + 0.230905136424, + 0.24042435835, + 0.250244362854, + 0.260366784498, + 0.270792471974, + 0.281521410576, + 0.292552641462, + 0.303884178722, + 0.315512922338, + 0.327434571678, + 0.339643534287, + 0.352132836964, + 0.364894034132, + 0.377917119285, + 0.39119043586, + 0.404700593975, + 0.418432388455, + 0.43236872602, + 0.446490556447, + 0.460776817129, + 0.475204385096, + 0.489748046582, + 0.504380479099, + 0.51907225558, + 0.533791866536, + 0.548505770073, + 0.563178464781, + 0.577772596913, + 0.592249097418, + 0.606567355334, + 0.620685431605, + 0.634560309193, + 0.648148191228, + 0.661404836751, + 0.674285946349, + 0.686747585936, + 0.698746657075, + 0.710241400647, + 0.721191938406, + 0.731560834999, + 0.741313680592, + 0.750419671009, + 0.75885217937, + 0.766589288679, + 0.773614272538, + 0.77991598412, + 0.785489129958, + 0.790334384937, + 0.794458305044, + 0.797872996754, + 0.800595480771, + 0.80264670688, + 0.804050150275, + 0.804829943192, + 0.805008475541, + 0.804603422841, + 0.803624152633, + 0.802067490966, + 0.799912832771, + 0.797116631698, + 0.793606314865, + 0.789273744393, + 0.783968377904, + 0.777490377945, + 0.769583978738, + 0.759931538044, + 0.748148791206, + 0.73378195012, + 0.716307412966, + 0.695134954801, + 0.669615395377, + 0.639053792826, + 0.602729271117, + 0.559922524423, + 0.509951929586, + 0.45221889604, + 0.386262656153, + 0.311823989249, + 0.228916442344, + 0.137902306712, + 0.0395689907471, + -0.0648005993923, + -0.173372404911, + -0.283731654345, + -0.392893449821, + -0.49737002822, + -0.593312926723, + -0.676748521464, + -0.743923090645, + -0.791767261285, + -0.818477681975, + -0.82419374728, + -0.811716930141, + -0.787177445461, + -0.760496341088, + -0.745421640284, + -0.758840568789, + -0.819000434198, + -0.942238036474, + -1.13787640266, + -1.40119517771, + -1.7049806498, + -1.99138194673, + -2.16808008345, + -2.11674275979, + -1.72902522258, + -0.99216192826, + -0.207810438452, + 0.0138265224889, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "cutoff_radius": 0.0, + "ultrasoft_cutoff_radius": 0.0 + } + ], + "D_ion": [ + -0.6543286056, + -0.444068777788, + 0, + 0, + 0, + 0, + -0.444068777788, + 1.995408696705, + 0, + 0, + 0, + 0, + 0, + 0, + 7.6905269712, + -12.9131547713, + 0, + 0, + 0, + 0, + -12.9131547713, + 20.24232683725, + 0, + 0, + 0, + 0, + 0, + 0, + 32.95356296395, + 34.12291930065, + 0, + 0, + 0, + 0, + 34.12291930065, + 35.2452438727 + ], + "augmentation": [ + { + "radial_function": [ + -0.0, + -1.4858293576376243e-11, + -6.045344293440569e-11, + -1.3836188292139818e-10, + -2.5022323425337745e-10, + -3.9774263308491715e-10, + -5.826931434774506e-10, + -8.069182556746861e-10, + -1.0723344732153025e-09, + -1.3809339918673492e-09, + -1.7347874738304878e-09, + -2.1360469202967426e-09, + -2.586948645922488e-09, + -3.0898163588714182e-09, + -3.647064349802432e-09, + -4.261200794025856e-09, + -4.934831170399947e-09, + -5.67066180146279e-09, + -6.4715035184421495e-09, + -7.340275456140498e-09, + -8.280008981795847e-09, + -9.293851762893627e-09, + -1.0385071978191854e-08, + -1.1557062678026188e-08, + -1.2813346297991852e-08, + -1.415757933168234e-08, + -1.559355716892198e-08, + -1.7125219103538832e-08, + -1.8756653518325165e-08, + -2.0492103251965397e-08, + -2.2335971155409433e-08, + -2.429282584352728e-08, + -2.6367407648971033e-08, + -2.8564634785637005e-08, + -3.088960972858816e-08, + -3.334762581851307e-08, + -3.594417409759362e-08, + -3.86849503858272e-08, + -4.1575862606099716e-08, + -4.462303836536906e-08, + -4.783283280302597e-08, + -5.121183671349256e-08, + -5.4766884954307684e-08, + -5.850506514833173e-08, + -6.243372669198571e-08, + -6.656049007765497e-08, + -7.089325654417707e-08, + -7.544021806184382e-08, + -8.020986767562783e-08, + -8.521101019575231e-08, + -9.045277327637839e-08, + -9.59446188783672e-08, + -1.0169635512048429e-07, + -1.077181485687071e-07, + -1.1402053693298683e-07, + -1.206144422151704e-07, + -1.2751118432314332e-07, + -1.3472249515336805e-07, + -1.4226053316435246e-07, + -1.5013789845976913e-07, + -1.583676484029396e-07, + -1.6696331377335533e-07, + -1.7593891548120445e-07, + -1.8530898188010966e-07, + -1.9508856665815606e-07, + -2.052932673831697e-07, + -2.1593924467247812e-07, + -2.270432420391702e-07, + -2.386226064293604e-07, + -2.5069530947147544e-07, + -2.632799694745203e-07, + -2.763958741888238e-07, + -2.9006300434381563e-07, + -3.0430205803789265e-07, + -3.1913447593923736e-07, + -3.3458246740256757e-07, + -3.506690374660868e-07, + -3.6741801479183857e-07, + -3.8485408059184335e-07, + -4.0300279854968625e-07, + -4.218906457932986e-07, + -4.4154504491561805e-07, + -4.6199439715137753e-07, + -4.832681166771811e-07, + -5.053966661127812e-07, + -5.284115932509756e-07, + -5.523455690877517e-07, + -5.772324271226397e-07, + -6.0310720408896e-07, + -6.300061820495313e-07, + -6.579669319644214e-07, + -6.870283588118928e-07, + -7.172307481909425e-07, + -7.486158146529269e-07, + -7.812267516005216e-07, + -8.151082830012082e-07, + -8.503067168508914e-07, + -8.868700005235687e-07, + -9.248477779966188e-07, + -9.642914491205335e-07, + -1.005254230876895e-06, + -1.0477912208514372e-06, + -1.0919594627898123e-06, + -1.1378180145543425e-06, + -1.1854280183285924e-06, + -1.2348527733377937e-06, + -1.286157811024175e-06, + -1.3394109728831081e-06, + -1.3946824909787173e-06, + -1.452045071203547e-06, + -1.5115739795273301e-06, + -1.5733471311244527e-06, + -1.6374451826485524e-06, + -1.7039516277214905e-06, + -1.7729528956665822e-06, + -1.844538453714182e-06, + -1.9188009127330605e-06, + -1.995836136627603e-06, + -2.0757433555113925e-06, + -2.1586252827844334e-06, + -2.2445882363522113e-06, + -2.3337422638955754e-06, + -2.426201272631254e-06, + -2.5220831634247044e-06, + -2.6215099696938795e-06, + -2.724608000954548e-06, + -2.8315079914734827e-06, + -2.9423452540082546e-06, + -3.0572598388628824e-06, + -3.1763966984397718e-06, + -3.2999058575297343e-06, + -3.427942589445511e-06, + -3.560667598298314e-06, + -3.6982472075138193e-06, + -3.8408535549228515e-06, + -3.988664794584651e-06, + -4.1418653056218805e-06, + -4.3006459081609736e-06, + -4.465204086930633e-06, + -4.635744222403127e-06, + -4.812477830073306e-06, + -4.99562380790475e-06, + -5.1854086924187275e-06, + -5.382066923539444e-06, + -5.585841118736318e-06, + -5.79698235644978e-06, + -6.015750469509298e-06, + -6.24241434859706e-06, + -6.477252256140821e-06, + -6.720552151143059e-06, + -6.972612025447838e-06, + -7.233740250799095e-06, + -7.504255939363006e-06, + -7.784489314832612e-06, + -8.074782098272436e-06, + -8.375487905778559e-06, + -8.686972660759957e-06, + -9.009615020047723e-06, + -9.343806814572737e-06, + -9.689953506361261e-06, + -1.0048474659761904e-05, + -1.0419804429703786e-05, + -1.0804392067470995e-05, + -1.120270244209139e-05, + -1.1615216582207455e-05, + -1.204243223458792e-05, + -1.2484864442705976e-05, + -1.2943046145408085e-05, + -1.3417528796365644e-05, + -1.390888300407477e-05, + -1.4417699195150231e-05, + -1.4944588299651281e-05, + -1.549018246030717e-05, + -1.6055135766068226e-05, + -1.6640125011209067e-05, + -1.7245850481084272e-05, + -1.7873036763543578e-05, + -1.8522433589809852e-05, + -1.9194816704394556e-05, + -1.9890988762763052e-05, + -2.061178026372484e-05, + -2.1358050510307303e-05, + -2.2130688605963893e-05, + -2.2930614485324958e-05, + -2.3758779978441096e-05, + -2.4616169914012045e-05, + -2.5503803259018677e-05, + -2.642273429897969e-05, + -2.7374053857933232e-05, + -2.8358890560754e-05, + -2.9378412138712774e-05, + -3.0433826781684404e-05, + -3.1526384533584414e-05, + -3.265737874004593e-05, + -3.382814754278372e-05, + -3.5040075426148424e-05, + -3.629459481923768e-05, + -3.759318774971465e-05, + -3.893738755616388e-05, + -4.032878066143395e-05, + -4.1769008403611844e-05, + -4.325976893195443e-05, + -4.4802819168102636e-05, + -4.639997683443413e-05, + -4.805312255213876e-05, + -4.9764202013157504e-05, + -5.1535228223506385e-05, + -5.3368283826784634e-05, + -5.526552350781706e-05, + -5.722917647606251e-05, + -5.9261549037877425e-05, + -6.136502725535596e-05, + -6.354207969651814e-05, + -6.579526028198237e-05, + -6.812721122649885e-05, + -7.054066608553646e-05, + -7.303845290297995e-05, + -7.562349746876821e-05, + -7.829882668988343e-05, + -8.10675720735827e-05, + -8.393297333425435e-05, + -8.689838212081683e-05, + -8.996726587613606e-05, + -9.314321182440914e-05, + -9.642993109940062e-05, + -9.983126301200349e-05, + -0.00010335117946624215, + -0.0001069937895246607, + -0.00011076334413166286, + -0.00011466424100131123, + -0.00011870102966698633, + -0.0001228784167102296, + -0.00012720127116497493, + -0.0001316746301085319, + -0.0001363037044468964, + -0.0001410938848908438, + -0.0001460507481463641, + -0.0001511800633099358, + -0.00015648779848502294, + -0.00016198012762609005, + -0.0001676634376178196, + -0.00017354433559142073, + -0.0001796296564977594, + -0.00018592647093465346, + -0.00019244209324554385, + -0.00019918408989028714, + -0.000206160288106939, + -0.0002133787848657209, + -0.00022084795613211284, + -0.00022857646644039602, + -0.00023657327880074599, + -0.00024484766493959944, + -0.0002534092158887731, + -0.00026226785294226776, + -0.0002714338389725452, + -0.00028091779014934455, + -0.0002907306880411454, + -0.0003008838921404551, + -0.00031138915280731137, + -0.0003222586246541169, + -0.0003335048803892329, + -0.0003451409251252974, + -0.0003571802111737645, + -0.000369636653343614, + -0.0003825246447539738, + -0.0003958590731871563, + -0.00040965533799399134, + -0.00042392936756409236, + -0.00043869763739480224, + -0.00045397718876598634, + -0.0004697856480487356, + -0.00048614124665422926, + -0.000503062841672134, + -0.0005205699371828574, + -0.0005386827063036106, + -0.0005574220139705554, + -0.0005768094404716304, + -0.0005968673057950625, + -0.0006176186947650718, + -0.0006390874830399717, + -0.0006612983639666478, + -0.0006842768763306828, + -0.0007080494330533448, + -0.0007326433508024674, + -0.0007580868806401578, + -0.0007844092396376557, + -0.0008116406435727194, + -0.000839812340687352, + -0.0008689566466265861, + -0.0008991069803719355, + -0.0009302979015888853, + -0.0009625651489952215, + -0.0009959456800991869, + -0.0010304777122286156, + -0.0010662007648889252, + -0.0011031557035055478, + -0.0011413847845580156, + -0.001180931702301236, + -0.001221841636865461, + -0.001264161303943518, + -0.001307939006206514, + -0.0013532246861732969, + -0.0014000699809750584, + -0.0014485282787591286, + -0.0014986547769251053, + -0.0015505065422080195, + -0.0016041425727409194, + -0.0016596238619310461, + -0.001717013464585106, + -0.0017763765648535898, + -0.001837780546584417, + -0.0019012950655352967, + -0.0019669921242496005, + -0.002034946148881392, + -0.0021052340685664803, + -0.0021779353972795814, + -0.0022531323181244176, + -0.002330909770134969, + -0.002411355537818459, + -0.0024945603433652688, + -0.002580617941585913, + -0.002669625217765813, + -0.0027616822882736204, + -0.0028568926042680013, + -0.0029553630583914413, + -0.0030572040945939342, + -0.003162529820983807, + -0.0032714581261576664, + -0.0033841107986317116, + -0.0035006136495917884, + -0.003621096639413374, + -0.00374569400718624, + -0.0038745444041544644, + -0.004007791030628364, + -0.0041455817765670595, + -0.004288069365849628, + -0.0044354115044126455, + -0.004587771032104205, + -0.004745316078316215, + -0.004908220221879036, + -0.005076662654286365, + -0.00525082834755172, + -0.005430908225347873, + -0.005617099338788077, + -0.005809605045702174, + -0.006008635194119003, + -0.006214406309805298, + -0.006427141787439302, + -0.006647072086118537, + -0.006874434928366337, + -0.007109475503159644, + -0.007352446672706025, + -0.007603609182566693, + -0.007863231875772222, + -0.00813159190976608, + -0.008408974977233169, + -0.00869567552926269, + -0.008991997002018528, + -0.009298252045699274, + -0.009614762755774964, + -0.009941860906737873, + -0.010279888187025533, + -0.010629196435805227, + -0.010990147880586863, + -0.011363115375243524, + -0.011748482638352719, + -0.01214664449073682, + -0.01255800709206031, + -0.012982988175836142, + -0.013422017281673634, + -0.013875535984404512, + -0.014343998119294042, + -0.014827870001635598, + -0.015327630641158267, + -0.01584377194837617, + -0.01637679893319947, + -0.016927229893801195, + -0.017495596594051192, + -0.018082444428795176, + -0.018688332574568884, + -0.019313834124732497, + -0.019959536206318372, + -0.020626040076682728, + -0.021313961198974166, + -0.02202392929146869, + -0.022756588351369154, + -0.023512596647439942, + -0.024292626680314244, + -0.02509736510665753, + -0.025927512624066333, + -0.026783783812593547, + -0.027666906929036512, + -0.028577623651225847, + -0.02951668876511374, + -0.030484869792787056, + -0.03148294655469201, + -0.032511710660530456, + -0.03357196492481254, + -0.034664522698262513, + -0.035790207111760494, + -0.03694985022257188, + -0.03814429205833917, + -0.03937437954986497, + -0.040640965343864036, + -0.04194490648819579, + -0.043287062979813405, + -0.04466829616556682, + -0.04608946698534716, + -0.047551434048146726, + -0.049055051527094745, + -0.05060116686451719, + -0.0521906182714527, + -0.053824232010595, + -0.055502819448189536, + -0.057227173858769624, + -0.05899806697058077, + -0.060816245233376885, + -0.06268242579199201, + -0.06459729215276752, + -0.06656148951536571, + -0.06857561976553388, + -0.07064023609841606, + -0.07275583725251512, + -0.07492286134626391, + -0.07714167928330379, + -0.07941258770846447, + -0.0817358015031449, + -0.08411144577786331, + -0.08653954736841289, + -0.08902002577573322, + -0.09155268357225635, + -0.09413719621610811, + -0.09677310126423476, + -0.09945978697417565, + -0.10219648025692595, + -0.10498223397593102, + -0.10781591356758334, + -0.11069618296258128, + -0.11362148981194567, + -0.1165900499851359, + -0.11959983134708663, + -0.1226485368009064, + -0.12573358660333306, + -0.12885209994251473, + -0.13200087580434297, + -0.13517637313156688, + -0.13837469029285315, + -0.14159154390913448, + -0.1448222470524361, + -0.14806168688591304, + -0.15130430178332616, + -0.15454405801767773, + -0.1577744260878845, + -0.16098835677970946, + -0.16417825709681597, + -0.16733596616213225, + -0.17045273125926358, + -0.1735191841828799, + -0.17652531808514998, + -0.17946046503653693, + -0.18231327454809973, + -0.18507169332137896, + -0.18772294652915766, + -0.1902535209546395, + -0.1926491503573813, + -0.1948948034651188, + -0.19697467502194516, + -0.19887218037086515, + -0.20056995408359338, + -0.20204985318203397, + -0.20329296555196216, + -0.20427962417431964, + -0.2049894278472302, + -0.2054012691123954, + -0.20549337012816707, + -0.20524332727430375, + -0.20462816529939282, + -0.20362440184909528, + -0.20220812323394094, + -0.20035507230590932, + -0.19804074932329885, + -0.1952405266617813, + -0.19192977823403035, + -0.18808402441820257, + -0.18367909326797946, + -0.17869129869955883, + -0.1730976362464639, + -0.16687599688847157, + -0.16000539928543062, + -0.15246624059898808, + -0.14424056587416254, + -0.1353123557180433, + -0.1256678317357858, + -0.11529577889517752, + -0.10418788359065097, + -0.09233908585929967, + -0.07974794370856936, + -0.06641700706388208, + -0.052353198363992805, + -0.03756819624056734, + -0.022078818167105833, + -0.0059073973437931, + 0.010917851497837344, + 0.02836248339572701, + 0.04638549819121727, + 0.06493904651144707, + 0.0839681746258481, + 0.10341061660350119, + 0.12319664275667912, + 0.14324897382816681, + 0.16348277076076412, + 0.18380571021110662, + 0.20411815613834486, + 0.22431343790054964, + 0.24427824524889377, + 0.2638931503660263, + 0.28303326684896263, + 0.30156905492182084, + 0.31936728151835747, + 0.3362921428916194, + 0.35220655621095975, + 0.36697362492611235, + 0.38045828059596426, + 0.3925291009688178, + 0.40306030031895884, + 0.41193388283752813, + 0.41904194295701275, + 0.42428908722740805, + 0.42759494020345024, + 0.42889668115651686, + 0.42815153879784373, + 0.4253391474872634, + 0.42046364105131256, + 0.4135553309386121, + 0.40467178722732783, + 0.3938981196982509, + 0.38134625090894697, + 0.36715299727394113, + 0.351476845837844, + 0.3344934563514536, + 0.31639015498861184, + 0.2973600373582459, + 0.2775967645452231, + 0.2572916693575953, + 0.23663524316738763, + 0.21582510805905247, + 0.19508150777322672, + 0.17466787902474457, + 0.15490586056244665, + 0.13615710195997105, + 0.118715978522, + 0.102668691913, + 0.0880249998742, + 0.0747736331699, + 0.0628857238188, + 0.0523167980064, + 0.0430089926885, + 0.0348934329545, + 0.0278927035478, + 0.0219233355738, + 0.0168982090399, + 0.0127287745975, + 0.00932697037265, + 0.00660673237536, + 0.00448498005174, + 0.0028820178517, + 0.00172132086459, + 0.000928808414236, + 0.000431843364623, + 0.00015848670615, + 3.78908355089e-05, + 3.31490940368e-06, + 4.49619100196e-08, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 0, + "j": 0, + "angular_momentum": 0 + }, + { + "radial_function": [ + 0.0, + 8.727593537861618e-12, + 3.550966839980719e-11, + 8.127220457661327e-11, + 1.4697829672142249e-10, + 2.336295225123829e-10, + 3.4226735970887676e-10, + 4.739746536098338e-10, + 6.29877136694014e-10, + 8.111450021952747e-10, + 1.0189945336370393e-09, + 1.2546897921413841e-09, + 1.5195443635995748e-09, + 1.814923167853735e-09, + 2.142244331871456e-09, + 2.502981129394128e-09, + 2.898663989157107e-09, + 3.330882574322088e-09, + 3.80128793526128e-09, + 4.311594738628672e-09, + 4.863583575127062e-09, + 5.459103348893224e-09, + 6.100073751004811e-09, + 6.788487820672412e-09, + 7.526414596523291e-09, + 8.316001861313096e-09, + 9.159478983846613e-09, + 1.0059159860484367e-08, + 1.101744596072699e-08, + 1.2036829479684964e-08, + 1.3119896601826204e-08, + 1.4269330879429346e-08, + 1.548791672981106e-08, + 1.6778543055669792e-08, + 1.8144206992575472e-08, + 1.9588017788349028e-08, + 2.1113200818368402e-08, + 2.272310174211434e-08, + 2.4421190805829054e-08, + 2.6211067295610866e-08, + 2.8096464147445127e-08, + 3.008125271831871e-08, + 3.2169447725025536e-08, + 3.436521235573382e-08, + 3.6672863561313626e-08, + 3.9096877531200334e-08, + 4.164189536197014e-08, + 4.4312728922404414e-08, + 4.711436692896999e-08, + 5.005198122532398e-08, + 5.3130933289793e-08, + 5.635678096845242e-08, + 5.973528543637077e-08, + 6.32724184161894e-08, + 6.697436963603471e-08, + 7.08475545524348e-08, + 7.489862234708716e-08, + 7.913446419875468e-08, + 8.356222184352596e-08, + 8.818929643443678e-08, + 9.302335771320632e-08, + 9.807235350035735e-08, + 1.0334451951309939e-07, + 1.0884838953459139e-07, + 1.1459280592288184e-07, + 1.2058693050414478e-07, + 1.2684025583272544e-07, + 1.3336261684854976e-07, + 1.4016420294041746e-07, + 1.4725557042752403e-07, + 1.546476554809198e-07, + 1.623517874928347e-07, + 1.7037970290241702e-07, + 1.787435595219724e-07, + 1.8745595133954103e-07, + 1.965299238594738e-07, + 2.0597898996002104e-07, + 2.1581714630505694e-07, + 2.2605889033483236e-07, + 2.367192378414341e-07, + 2.478137411616924e-07, + 2.5935850798558943e-07, + 2.713702208437515e-07, + 2.8386615725473483e-07, + 2.9686421057786843e-07, + 3.103829115877586e-07, + 3.244414508125284e-07, + 3.390597016181446e-07, + 3.5425824413262946e-07, + 3.700583899723091e-07, + 3.864822078326995e-07, + 4.035525499916991e-07, + 4.212930796830268e-07, + 4.397282994852788e-07, + 4.5888358063158986e-07, + 4.787851933850967e-07, + 4.994603384423737e-07, + 5.209371794446788e-07, + 5.432448765908785e-07, + 5.664136214512126e-07, + 5.904746729488887e-07, + 6.154603946427428e-07, + 6.414042932332075e-07, + 6.683410584785353e-07, + 6.963066044313079e-07, + 7.25338112152665e-07, + 7.554740738684481e-07, + 7.86754338688206e-07, + 8.19220159898007e-07, + 8.52914243864997e-07, + 8.878808006976312e-07, + 9.24165596596722e-07, + 9.61816008054976e-07, + 1.0008810779445047e-06, + 1.0414115735098584e-06, + 1.0834600464005532e-06, + 1.1270808947744722e-06, + 1.1723304275543821e-06, + 1.2192669309024971e-06, + 1.2679507369878287e-06, + 1.3184442951862242e-06, + 1.3708122456596158e-06, + 1.4251214955728118e-06, + 1.4814412978665752e-06, + 1.539843332844593e-06, + 1.6004017924865898e-06, + 1.663193467761466e-06, + 1.7282978389279594e-06, + 1.795797168957466e-06, + 1.8657766001849776e-06, + 1.9383242543301453e-06, + 2.0135313359503592e-06, + 2.0914922395017553e-06, + 2.172304660064757e-06, + 2.25606970793104e-06, + 2.342892027144631e-06, + 2.432879918161068e-06, + 2.5261454646795767e-06, + 2.622804664972928e-06, + 2.7229775676471654e-06, + 2.8267884121806332e-06, + 2.9343657742594872e-06, + 3.0458427161890887e-06, + 3.1613569424478363e-06, + 3.281050960701023e-06, + 3.4050722482667103e-06, + 3.533573424449826e-06, + 3.666712428775795e-06, + 3.8046527053488967e-06, + 3.947563393633132e-06, + 4.095619525950035e-06, + 4.249002231313708e-06, + 4.407898947172836e-06, + 4.572503637366854e-06, + 4.7430170187382975e-06, + 4.919646794683412e-06, + 5.102607897288928e-06, + 5.292122737588869e-06, + 5.4884214643761874e-06, + 5.6917422325967135e-06, + 5.902331480099557e-06, + 6.120444214388404e-06, + 6.3463443096583845e-06, + 6.580304813001117e-06, + 6.822608262636904e-06, + 7.073547015917507e-06, + 7.333423589111463e-06, + 7.602551008985791e-06, + 7.881253176590325e-06, + 8.1698652431065e-06, + 8.468733999373128e-06, + 8.778218278347445e-06, + 9.098689371597948e-06, + 9.430531460078909e-06, + 9.774142059906358e-06, + 1.0129932483781459e-05, + 1.0498328317477431e-05, + 1.087976991362336e-05, + 1.1274712902534464e-05, + 1.1683628719331845e-05, + 1.2107005151447885e-05, + 1.2545346902850566e-05, + 1.2999176179009843e-05, + 1.3469033292140147e-05, + 1.3955477286101232e-05, + 1.4459086584182762e-05, + 1.4980459658254715e-05, + 1.552021572176206e-05, + 1.6078995446033932e-05, + 1.6657461701439328e-05, + 1.7256300323920615e-05, + 1.7876220908903806e-05, + 1.8517957630575365e-05, + 1.9182270091816873e-05, + 1.986994420153386e-05, + 2.0581793082609166e-05, + 2.13186580124561e-05, + 2.2081409393907972e-05, + 2.2870947760453224e-05, + 2.368820481725217e-05, + 2.4534144515961825e-05, + 2.5409764167668475e-05, + 2.6316095594115855e-05, + 2.7254206318315555e-05, + 2.822520079605369e-05, + 2.9230221690721922e-05, + 3.027045119001286e-05, + 3.1347112369643365e-05, + 3.2461470604071486e-05, + 3.361483502398563e-05, + 3.4808560025898684e-05, + 3.604404683250262e-05, + 3.732274510657988e-05, + 3.864615462148123e-05, + 4.001582698720915e-05, + 4.143336743808538e-05, + 4.2900436679678284e-05, + 4.441875280016726e-05, + 4.599009324813765e-05, + 4.761629687614402e-05, + 4.929926605671685e-05, + 5.1040968868989234e-05, + 5.28434413626722e-05, + 5.470878989698386e-05, + 5.663919356208731e-05, + 5.8636906682123185e-05, + 6.070426140517591e-05, + 6.284367038070872e-05, + 6.50576295294803e-05, + 6.734872090974387e-05, + 6.971961567818029e-05, + 7.21730771557163e-05, + 7.471196399597347e-05, + 7.733923346299438e-05, + 8.005794482266688e-05, + 8.287126284573288e-05, + 8.578246143618581e-05, + 8.879492737943917e-05, + 9.19121642198514e-05, + 9.513779627126322e-05, + 9.847557276501673e-05, + 0.00010192937213651898, + 0.00010550320646188812, + 0.00010920122604306752, + 0.0001130277241514596, + 0.00011698714193045534, + 0.00012108407346787586, + 0.00012532327103895622, + 0.00012970965052974649, + 0.0001342482970416275, + 0.00013894447069042086, + 0.0001438036125998399, + 0.00014883135109827205, + 0.00015403350812990594, + 0.00015941610587526784, + 0.0001649853736063388, + 0.00017074775476443922, + 0.0001767099142849253, + 0.00018287874616525521, + 0.00018926138128984215, + 0.00019586519552175683, + 0.00020269781806460326, + 0.00020976714010699523, + 0.00021708132375996696, + 0.00022464881129281543, + 0.00023247833468269892, + 0.00024057892548471453, + 0.0002489599250296015, + 0.0002576309949685953, + 0.00026660212816932835, + 0.0002758836599789213, + 0.0002854862798575782, + 0.0002954210434112919, + 0.00030569938481404834, + 0.00031633312965428755, + 0.0003273345082064938, + 0.0003387161691359795, + 0.0003504911936744949, + 0.0003626731102493583, + 0.00037527590960964856, + 0.00038831406044526485, + 0.0004018025255212081, + 0.00041575677835639614, + 0.00043019282042685447, + 0.0004451271989645871, + 0.0004605770253103058, + 0.00047655999388675864, + 0.0004930944017785783, + 0.0005101991689883808, + 0.0005278938592585082, + 0.0005461987017032604, + 0.0005651346130194684, + 0.0005847232204787455, + 0.0006049868856535641, + 0.0006259487288976934, + 0.0006476326546118108, + 0.000670063377296585, + 0.0006932664485058951, + 0.0007172682845756348, + 0.0007420961952481119, + 0.0007677784132723582, + 0.0007943441248164596, + 0.0008218235009479646, + 0.0008502477300291034, + 0.0008796490511368142, + 0.000910060788512647, + 0.000941517387116392, + 0.000974054449182122, + 0.00100770877202772, + 0.001042518386861035, + 0.0010785225989238647, + 0.0011157620286455698, + 0.0011542786542725475, + 0.001194115855548615, + 0.001235318458789782, + 0.0012779327833113002, + 0.0013220066891683883, + 0.0013675896262485441, + 0.0014147326848420957, + 0.001463488647638043, + 0.0015139120431707064, + 0.0015660592008185756, + 0.0016199883072479813, + 0.0016757594644918245, + 0.00173343474958533, + 0.0017930782758289426, + 0.0018547562556036708, + 0.0019185370649880706, + 0.0019844913099390155, + 0.002052691894145859, + 0.0021232140888031406, + 0.0021961356038335674, + 0.002271536661072728, + 0.0023495000691327794, + 0.002430111300036684, + 0.002513458567607054, + 0.0025996329076853567, + 0.002688728260063565, + 0.0027808415521321976, + 0.0028760727844932576, + 0.0029745251179562754, + 0.0030763049626389106, + 0.003181522068341702, + 0.003290289616946268, + 0.0034027243161187212, + 0.0035189464946828054, + 0.00363908019952043, + 0.0037632532936949245, + 0.003891597556143007, + 0.00402424878238111, + 0.004161346886460009, + 0.004303036003932962, + 0.004449464595521173, + 0.00460078555176725, + 0.00475715629790506, + 0.004918738899463786, + 0.005085700167597319, + 0.005258211764710468, + 0.005436450309552788, + 0.005620597481645127, + 0.005810840125040806, + 0.006007370350495466, + 0.006210385636291943, + 0.006420088926954203, + 0.006636688729430078, + 0.006860399206504823, + 0.007091440266594293, + 0.007330037649622424, + 0.007576423008380229, + 0.007830833984447536, + 0.008093514278209887, + 0.008364713712236928, + 0.008644688286745358, + 0.008933700227085058, + 0.009232018021256463, + 0.009539916447293876, + 0.009857676588981094, + 0.010185585838527324, + 0.010523937885364659, + 0.010873032689227883, + 0.01123317643645506, + 0.011604681477442804, + 0.011987866243620476, + 0.012383055142804198, + 0.012790578429479461, + 0.013210772049714959, + 0.013643977456794165, + 0.014090541396178597, + 0.014550815656850654, + 0.015025156786440267, + 0.01551392576692873, + 0.01601748764781712, + 0.01653621113422368, + 0.01707046812479085, + 0.01762063319726741, + 0.01818708303681467, + 0.01877019580270003, + 0.019370350429843697, + 0.019987925858905364, + 0.020623300191643604, + 0.021276849764288716, + 0.021948948134840707, + 0.022639964977617985, + 0.023350264878400848, + 0.024080206024190802, + 0.02483013878025162, + 0.025600404146971175, + 0.0263913320886471, + 0.027203239726828615, + 0.028036429388259523, + 0.02889118650017367, + 0.02976777732194673, + 0.03066644650456558, + 0.031587414467401626, + 0.0325308745808255, + 0.03349699014532808, + 0.03448589115438353, + 0.035497670829219966, + 0.03653238191562962, + 0.0375900327250601, + 0.03867058291472271, + 0.0397739389874133, + 0.04089994949755799, + 0.04204839995636132, + 0.04321900741521161, + 0.044411414715217784, + 0.0456251843943863, + 0.046859792227929374, + 0.04811462040301989, + 0.049388950295027004, + 0.0506819548556721, + 0.05199269058177036, + 0.053320089059706935, + 0.05466294808049198, + 0.05601992230723504, + 0.057389513494303226, + 0.05877006024849691, + 0.060159727325944545, + 0.06155649447162493, + 0.06295814479223694, + 0.0643622526740914, + 0.06576617124991173, + 0.06716701943031814, + 0.06856166851020648, + 0.06994672837997129, + 0.07131853336445385, + 0.07267312772230054, + 0.07400625085537461, + 0.07531332226842835, + 0.076589426347118, + 0.07782929701514164, + 0.07902730235846876, + 0.08017742930285525, + 0.08127326844973652, + 0.08230799919775734, + 0.0832743752738831, + 0.0841647108331322, + 0.08497086729576016, + 0.08568424110925481, + 0.08629575264576511, + 0.08679583646800042, + 0.08717443321784335, + 0.08742098340840666, + 0.08752442342494421, + 0.08747318406828784, + 0.087255192001258, + 0.08685787448800864, + 0.08626816784605391, + 0.0854725300587361, + 0.08445695802908253, + 0.0832070099805353, + 0.08170783354280552, + 0.07994420008837337, + 0.07790054590262956, + 0.0755610208056208, + 0.0729095448486383, + 0.06992987373469665, + 0.06660567360679652, + 0.06292060586412299, + 0.05885842264323573, + 0.05440307360512354, + 0.049538824605466165, + 0.04425038883597128, + 0.03852307090941645, + 0.0323429243341216, + 0.02569692271223409, + 0.018573144866538667, + 0.010960974005219414, + 0.0028513108242518522, + -0.0057631997109982794, + -0.014887928395350884, + -0.024526009363337636, + -0.0346780762455426, + -0.04534198822257693, + -0.05651254770162202, + -0.06818121164887732, + -0.08033579909460639, + -0.09296019775359617, + -0.10603407315334261, + -0.11953258420786192, + -0.1334261096680365, + -0.14767999042348184, + -0.16225429312818263, + -0.17710360121526253, + -0.19217683984113929, + -0.20741714174416884, + -0.22276176152391755, + -0.23814204615895523, + -0.25348346991035137, + -0.2687057419764702, + -0.28372299536782947, + -0.298444065482016, + -0.3127728667002896, + -0.326608875066785, + -0.3398477246852382, + -0.3523819248438405, + -0.3641017041900566, + -0.3748959872748967, + -0.3846535077015204, + -0.3932640607357383, + -0.40061989663272846, + -0.4066172539247236, + -0.41115802949620467, + -0.4141515791465557, + -0.41551663836524827, + -0.41518334779815275, + -0.41309536100950345, + -0.4092120030914089, + -0.4035104368964204, + -0.3959877785949965, + -0.3866630854833573, + -0.3755791163667507, + -0.3628037389959604, + -0.34843083157945726, + -0.3325804996705742, + -0.3153984116305053, + -0.2970540546592615, + -0.2777377425596566, + -0.25765628443391814, + -0.23702737308212668, + -0.21607299739630406, + -0.19501254366060294, + -0.17405672486238702, + -0.15340401404880244, + -0.13324170309482639, + -0.11375371115791473, + -0.09513611947986347, + -0.07761777941074975, + -0.06147483599964585, + -0.04701047139290891, + -0.0344423069744, + -0.0237580560072, + -0.0148618794634, + -0.00763536457691, + -0.00194321863816, + 0.00236269239018, + 0.00543923315585, + 0.00744795740481, + 0.00855129167375, + 0.00890909843145, + 0.0086757333017, + 0.00799769317138, + 0.00701183091028, + 0.00584405788721, + 0.00460824094138, + 0.00340492334742, + 0.00231926072124, + 0.00141762649441, + 0.000742417402903, + 0.000305409709094, + 8.14874537067e-05, + 7.9242777436e-06, + 1.33270030001e-07, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 0, + "j": 1, + "angular_momentum": 0 + }, + { + "radial_function": [ + 0.0, + 1.2803643429314888e-16, + 1.0507798304657154e-15, + 3.638353258601806e-15, + 8.848539997838759e-15, + 1.7733047823468143e-14, + 3.144416238659713e-14, + 5.1241812200183527e-14, + 7.850106900021188e-14, + 1.1472010855526727e-13, + 1.615286584241792e-13, + 2.2069696058370017e-13, + 2.941452784254286e-13, + 3.8395397926245177e-13, + 4.923742251345368e-13, + 6.218393066301474e-13, + 7.749766562214589e-13, + 9.546205797705771e-13, + 1.1638257467737323e-12, + 1.4058814824133228e-12, + 1.6843269066106126e-12, + 2.0029669679282203e-12, + 2.365889422531845e-12, + 2.777482811682702e-12, + 3.2424554934823282e-12, + 3.765855788050569e-12, + 4.353093298829558e-12, + 5.009961475114574e-12, + 5.742661485787674e-12, + 6.557827476804343e-12, + 7.462553289982393e-12, + 8.464420724045787e-12, + 9.571529423635474e-12, + 1.0792528486800244e-11, + 1.2136649885985002e-11, + 1.3613743803210094e-11, + 1.5234315984740678e-11, + 1.700956722735617e-11, + 1.8951435113843618e-11, + 2.107263812082155e-11, + 2.3386722230943997e-11, + 2.5908110185736016e-11, + 2.8652153525338176e-11, + 3.1635187567215247e-11, + 3.48745894863267e-11, + 3.8388839664715986e-11, + 4.219758649192807e-11, + 4.6321714800697335e-11, + 5.0783418147424394e-11, + 5.560627512613423e-11, + 6.081532996218748e-11, + 6.64371776034725e-11, + 7.250005354381056e-11, + 7.903392867347463e-11, + 8.607060938297762e-11, + 9.36438432355923e-11, + 1.0178943051173967e-10, + 1.1054534192804632e-10, + 1.1995184287231456e-10, + 1.3005162450943863e-10, + 1.4088994213583086e-10, + 1.5251476116500627e-10, + 1.6497691115233582e-10, + 1.783302483221491e-10, + 1.926318269996272e-10, + 2.0794208050696216e-10, + 2.2432501195977072e-10, + 2.418483955406006e-10, + 2.605839888013005e-10, + 2.8060775658296505e-10, + 3.020001071987805e-10, + 3.248461415195693e-10, + 3.4923591563316346e-10, + 3.752647178915826e-10, + 4.0303336099357733e-10, + 4.326484900479631e-10, + 4.6422290735187356e-10, + 4.978759148383742e-10, + 5.337336751615142e-10, + 5.719295923689992e-10, + 6.126047132542287e-10, + 6.559081504089919e-10, + 7.019975282923782e-10, + 7.510394533900208e-10, + 8.032100098344913e-10, + 8.58695281815201e-10, + 9.176919042789567e-10, + 9.80407643248023e-10, + 1.047062007619535e-09, + 1.1178868938443907e-09, + 1.1931272653823745e-09, + 1.2730418688740583e-09, + 1.35790398864421e-09, + 1.4480022421153475e-09, + 1.543641417694336e-09, + 1.6451433579338536e-09, + 1.7528478900158024e-09, + 1.8671138062933722e-09, + 1.988319897321066e-09, + 2.1168660404855353e-09, + 2.2531743467887684e-09, + 2.3976903693854966e-09, + 2.5508843764599423e-09, + 2.7132526926851185e-09, + 2.885319112097831e-09, + 3.0676363868372607e-09, + 3.260787795244648e-09, + 3.4653887939696273e-09, + 3.6820887582706374e-09, + 3.91157281505988e-09, + 4.1545637742009495e-09, + 4.41182416241479e-09, + 4.684158365894833e-09, + 4.972414887232816e-09, + 5.277488722350489e-09, + 5.600323864279079e-09, + 5.941915940213822e-09, + 6.303314988968402e-09, + 6.6856283861752015e-09, + 7.0900239250163715e-09, + 7.51773306121295e-09, + 7.97005432980187e-09, + 8.448356944251496e-09, + 8.954084586074427e-09, + 9.488759396471917e-09, + 1.0053986179024186e-08, + 1.0651456826182626e-08, + 1.1282954980324888e-08, + 1.1950360942021507e-08, + 1.265565683852918e-08, + 1.3400932066542768e-08, + 1.4188389023119463e-08, + 1.5020349140548224e-08, + 1.589925924047149e-08, + 1.6827698224818767e-08, + 1.7808384120871863e-08, + 1.8844181499421423e-08, + 1.9938109284654443e-08, + 2.109334897848471e-08, + 2.2313253318554808e-08, + 2.3601355395044366e-08, + 2.4961378248664672e-08, + 2.6397244976550608e-08, + 2.791308937140777e-08, + 2.9513267123771985e-08, + 3.120236761442431e-08, + 3.298522633101732e-08, + 3.486693793947081e-08, + 3.6852870044787824e-08, + 3.894867767875433e-08, + 4.116031855390975e-08, + 4.349406911488142e-08, + 4.595654144928363e-08, + 4.855470107352342e-08, + 5.1295885673689194e-08, + 5.418782482037128e-08, + 5.7238660730668624e-08, + 6.045697012025713e-08, + 6.385178720500691e-08, + 6.743262792534194e-08, + 7.120951543062319e-08, + 7.519300691290008e-08, + 7.939422186059233e-08, + 8.382487177928844e-08, + 8.849729150386393e-08, + 9.342447213555111e-08, + 9.86200957204197e-08, + 1.0409857175353782e-07, + 1.0987507560472075e-07, + 1.1596558895491208e-07, + 1.2238694237345177e-07, + 1.2915686012335758e-07, + 1.3629400732487707e-07, + 1.4381803959593978e-07, + 1.5174965530443604e-07, + 1.6011065057263093e-07, + 1.689239771515534e-07, + 1.7821380335569196e-07, + 1.8800557819943761e-07, + 1.9832609886889549e-07, + 2.092035817918254e-07, + 2.2066773738502812e-07, + 2.3274984875839163e-07, + 2.454828545542152e-07, + 2.5890143610214713e-07, + 2.730421091843879e-07, + 2.8794332059011864e-07, + 3.0364554975818787e-07, + 3.2019141573656297e-07, + 3.3762578975733815e-07, + 3.5599591371178286e-07, + 3.7535152486923533e-07, + 3.9574498707528096e-07, + 4.1723142890584216e-07, + 4.3986888900618294e-07, + 4.6371846906170416e-07, + 4.888444948330117e-07, + 5.153146855636512e-07, + 5.432003322967988e-07, + 5.72576485579652e-07, + 6.035221529330019e-07, + 6.361205067069255e-07, + 6.70459102827362e-07, + 7.066301109943815e-07, + 7.447305569365988e-07, + 7.848625773932477e-07, + 8.271336883728241e-07, + 8.716570675295791e-07, + 9.185518513336576e-07, + 9.679434477297788e-07, + 1.0199638652503925e-06, + 1.0747520593126406e-06, + 1.132454296640394e-06, + 1.1932245388129095e-06, + 1.2572248458086363e-06, + 1.324625800776003e-06, + 1.3956069569356828e-06, + 1.4703573079166709e-06, + 1.5490757827452606e-06, + 1.6319717666286849e-06, + 1.7192656491015582e-06, + 1.8111894007484483e-06, + 1.9079871802184607e-06, + 2.0099159728499513e-06, + 2.1172462628215908e-06, + 2.230262740381562e-06, + 2.349265046127313e-06, + 2.4745685541344153e-06, + 2.6065051960779094e-06, + 2.745424328531356e-06, + 2.891693645407154e-06, + 3.045700138312102e-06, + 3.2078511069679644e-06, + 3.378575222502971e-06, + 3.558323646427622e-06, + 3.7475712078075805e-06, + 3.946817642332706e-06, + 4.156588895859815e-06, + 4.377438496159249e-06, + 4.60994899638176e-06, + 4.854733493990773e-06, + 5.112437228832919e-06, + 5.3837392649782205e-06, + 5.669354260210441e-06, + 5.97003432811821e-06, + 6.2865709972355105e-06, + 6.619797272736768e-06, + 6.9705898056360565e-06, + 7.339871175431646e-06, + 7.728612291667097e-06, + 8.137834921231863e-06, + 8.568614347389075e-06, + 9.022082167601119e-06, + 9.499429237777783e-06, + 1.000190876948019e-05, + 1.0530839589719067e-05, + 1.1087609570008238e-05, + 1.167367923505103e-05, + 1.2290585559318553e-05, + 1.2939945961814212e-05, + 1.3623462509522429e-05, + 1.4342926339855826e-05, + 1.5100222313856258e-05, + 1.5897333912286107e-05, + 1.6736348386814216e-05, + 1.7619462180179672e-05, + 1.8548986628960415e-05, + 1.9527353963260437e-05, + 2.0557123619782708e-05, + 2.1640988883754677e-05, + 2.278178387737746e-05, + 2.39824909117747e-05, + 2.5246248223404896e-05, + 2.6576358112134288e-05, + 2.7976295504653378e-05, + 2.944971696376778e-05, + 3.100047016595095e-05, + 3.2632603874716584e-05, + 3.435037843120937e-05, + 3.615827679287669e-05, + 3.8061016145948985e-05, + 4.0063560122453565e-05, + 4.217113165515384e-05, + 4.4389226497971764e-05, + 4.672362745473311e-05, + 4.9180419343808017e-05, + 5.17660047444636e-05, + 5.448712056030048e-05, + 5.7350855450579424e-05, + 6.036466815254694e-05, + 6.353640677916392e-05, + 6.687432909948976e-05, + 7.038712388416631e-05, + 7.408393335920945e-05, + 7.79743768251638e-05, + 8.206857550345072e-05, + 8.637717866943574e-05, + 9.091139115610822e-05, + 9.568300227044299e-05, + 0.0001007044162138912, + 0.00010598868409647344, + 0.00011154953758789457, + 0.00011740142433796293, + 0.0001235595452201049, + 0.00013003989350956853, + 0.0001368592960913799, + 0.00014403545681328445, + 0.00015158700206463266, + 0.0001595335287475021, + 0.00016789565469631012, + 0.00017669507174636952, + 0.00018595460150081362, + 0.0001956982540426597, + 0.00020595128962967268, + 0.00021674028360424156, + 0.00022809319466583642, + 0.0002400394366604206, + 0.00025260995406867166, + 0.00026583730140940616, + 0.00027975572673631546, + 0.0002944012594361459, + 0.00030981180256958843, + 0.0003260272299470807, + 0.0003430894882298034, + 0.00036104270428120096, + 0.00037993329805042396, + 0.0003998101012377283, + 0.0004207244821090526, + 0.000442730476688596, + 0.00046588492668142844, + 0.000490247624546269, + 0.0005158814659144064, + 0.0005428526098994053, + 0.0005712306475946961, + 0.0006010887792021846, + 0.0006325040002200453, + 0.0006655572971751331, + 0.0007003338533372867, + 0.0007369232649207594, + 0.0007754197684048064, + 0.0008159224793037849, + 0.000858535643264631, + 0.0009033688997768098, + 0.000950537559456173, + 0.0010001628952922962, + 0.001052372448734421, + 0.0011073003513210028, + 0.0011650876625167114, + 0.0012258827247581534, + 0.0012898415363441532, + 0.0013571281432120568, + 0.001427915050477177, + 0.0015023836546141944, + 0.0015807246975167624, + 0.001663138743195706, + 0.0017498366785886508, + 0.0018410402392284699, + 0.0019369825614082635, + 0.0020379087618121673, + 0.0021440765460117297, + 0.0022557568473956413, + 0.002373234497646992, + 0.0024968089306353944, + 0.0026267949210991414, + 0.002763523359773239, + 0.002907342066835087, + 0.0030586166452584184, + 0.0032177313761151257, + 0.003385090157791136, + 0.00356111749098045, + 0.0037462595117391914, + 0.003940985074842734, + 0.004145786889427975, + 0.004361182709910645, + 0.004587716583929052, + 0.004825960160533584, + 0.005076514061015246, + 0.0053400093150220524, + 0.005617108865210968, + 0.005908509143083743, + 0.006214941719463372, + 0.006537175032448995, + 0.006876016196224698, + 0.0072323128947828705, + 0.007606955362808782, + 0.008000878458991556, + 0.008415063834050971, + 0.008850542198277772, + 0.009308395692239523, + 0.009789760364896755, + 0.010295828763055707, + 0.010827852636445253, + 0.011387145763650535, + 0.011975086901731729, + 0.012593122865800598, + 0.013242771742207247, + 0.013925626239901892, + 0.014643357185852156, + 0.015397717167538565, + 0.01619054432946286, + 0.017023766326227256, + 0.017899404438905833, + 0.01881957785869471, + 0.019786508142105107, + 0.020802523843233146, + 0.021870065327253652, + 0.022991689769415916, + 0.024170076343523698, + 0.025408031605026127, + 0.02670849507033066, + 0.02807454499824008, + 0.029509404374002318, + 0.03101644710037964, + 0.03259920439729379, + 0.03426137140995096, + 0.03600681402899977, + 0.03783957592041507, + 0.03976388576397912, + 0.04178416470283772, + 0.04390503399115115, + 0.046131322850163636, + 0.048468076515457925, + 0.05092056446730604, + 0.05349428884908143, + 0.05619499304836421, + 0.05902867043088839, + 0.06200157322501413, + 0.06512022151382496, + 0.06839141235043025, + 0.07182222892402013, + 0.07542004980892623, + 0.07919255821791454, + 0.08314775124079064, + 0.08729394904573982, + 0.09163980397465106, + 0.09619430950467646, + 0.1009668090119201, + 0.10596700426859623, + 0.1112049636370068, + 0.11669112985161331, + 0.12243632733409417, + 0.12845176893817756, + 0.13474906204226045, + 0.14134021385544163, + 0.14823763585443855, + 0.15545414720396092, + 0.1630029770101173, + 0.17089776529695164, + 0.1791525624909037, + 0.18778182728578088, + 0.19680042264738623, + 0.20622360980100402, + 0.21606703994258378, + 0.2263467434248573, + 0.23707911623027236, + 0.24828090336181238, + 0.2599691789146329, + 0.27216132251291564, + 0.2848749917570011, + 0.2981280903271076, + 0.31193873138478106, + 0.3263251958558369, + 0.3413058851897413, + 0.35689926813463024, + 0.37312382108473097, + 0.38999796152301014, + 0.4075399740234807, + 0.425767928321455, + 0.4446995889354898, + 0.4643523157247867, + 0.48474295490734737, + 0.5058877199151304, + 0.5278020615105096, + 0.5505005266774821, + 0.5739966056315389, + 0.5983025664943811, + 0.6234292770583555, + 0.6493860132400622, + 0.6761802537272538, + 0.7038174605275151, + 0.7323008450446634, + 0.7616311196522776, + 0.7918062344958723, + 0.8228210997828688, + 0.8546672936757519, + 0.8873327562259462, + 0.920801470072984, + 0.9550531286730463, + 0.9900627933471594, + 1.0258005405969912, + 1.062231101560581, + 1.099313495868075, + 1.1370006626150508, + 1.1752390915653688, + 1.2139684584128407, + 1.2531212681995338, + 1.2926225118215788, + 1.3323893410707701, + 1.372330768203694, + 1.4123473968108988, + 1.452331191290813, + 1.49216529286993, + 1.5317238905571458, + 1.5708721560891648, + 1.6094662521982233, + 1.647353423711601, + 1.6843721813273835, + 1.7203525876626498, + 1.7551166549636672, + 1.7884788633698452, + 1.8202468078597156, + 1.8502219810606884, + 1.8782006978467982, + 1.9039751662932984, + 1.927334708044908, + 1.9480671295546503, + 1.9659602443514685, + 1.9808035452243757, + 1.9923900246262902, + 2.000518141583672, + 2.0049939343442076, + 2.0056332799269745, + 2.0022643048565993, + 1.9947299554142455, + 1.982890740403625, + 1.9666276638480904, + 1.945845367849603, + 1.9204755049534068, + 1.8904803518638775, + 1.8558566583464597, + 1.8166396921094659, + 1.7729073870812202, + 1.724784424134675, + 1.6724459667647495, + 1.6161206403471529, + 1.5560921909743257, + 1.4926991093253263, + 1.4263313960129103, + 1.3574236433176547, + 1.2864438118904185, + 1.2138776220401417, + 1.1402095135051913, + 1.0659027958335547, + 0.9913839489768266, + 0.9170387746596058, + 0.8432303045465253, + 0.7703477347710734, + 0.6988872743811416, + 0.6295400304003687, + 0.563200907551997, + 0.500694628498, + 0.442327777276, + 0.38819172734, + 0.33832337262, + 0.292710453541, + 0.251294284524, + 0.213973195734, + 0.180606633221, + 0.151019855772, + 0.125009144669, + 0.102347407264, + 0.0827900498554, + 0.0660809429406, + 0.0519583128213, + 0.040160341465, + 0.0304302902388, + 0.0225209325501, + 0.0161981470463, + 0.0112435302159, + 0.00745598369852, + 0.00465225393068, + 0.00266644453417, + 0.00134837820832, + 0.000560008790185, + 0.000165526831962, + 2.39615413969e-05, + 3.01352687167e-07, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 0, + "j": 2, + "angular_momentum": 1 + }, + { + "radial_function": [ + -0.0, + -1.9259189910414174e-16, + -1.580578873556397e-15, + -5.472796610979055e-15, + -1.3309938939413e-14, + -2.6673980543219488e-14, + -4.729818495046862e-14, + -7.707773165700261e-14, + -1.1808099814005858e-13, + -1.7256153447654357e-13, + -2.429707704266622e-13, + -3.3197149698300523e-13, + -4.4245216675769065e-13, + -5.775420600489368e-13, + -7.406273659078896e-13, + -9.353682304288004e-13, + -1.1657168271599443e-12, + -1.435936507784803e-12, + -1.7506220940938804e-12, + -2.1147213760326834e-12, + -2.533557883804704e-12, + -3.0128550060038753e-12, + -3.5587615293013502e-12, + -4.177878680118174e-12, + -4.8772887521001435e-12, + -5.664585408414391e-12, + -6.547905753169957e-12, + -7.535964269886838e-12, + -8.638088732270992e-12, + -9.864258196425012e-12, + -1.1225143191143795e-11, + -1.27321482280638e-11, + -1.4397456760593725e-11, + -1.6234078727775856e-11, + -1.825590082600287e-11, + -2.0477739660053067e-11, + -2.2915397931834275e-11, + -2.558572383547197e-11, + -2.8506673835670764e-11, + -3.169737901452575e-11, + -3.5178215185412255e-11, + -3.8970876978902634e-11, + -4.309845612074008e-11, + -4.7585524130590314e-11, + -5.2458219685999285e-11, + -5.774434090419712e-11, + -6.347344281462361e-11, + -6.967694029961234e-11, + -7.638821681839015e-11, + -8.36427391982226e-11, + -9.147817886314598e-11, + -9.99345398277912e-11, + -1.0905429380938265e-10, + -1.1888252290150029e-10, + -1.2946707014978715e-10, + -1.4085869850411967e-10, + -1.5311125860321752e-10, + -1.6628186584716385e-10, + -1.80431087271134e-10, + -1.9562313875437154e-10, + -2.1192609313234184e-10, + -2.2941209978764085e-10, + -2.481576163333865e-10, + -2.6824365308580707e-10, + -2.8975603093137656e-10, + -3.1278565343005627e-10, + -3.3742879381045736e-10, + -3.6378739772459797e-10, + -3.919694025922282e-10, + -4.2208907442026e-10, + -4.542673630679958e-10, + -4.886322769205393e-10, + -5.253192779798968e-10, + -5.644716985981496e-10, + -6.062411808267523e-10, + -6.50788139804063e-10, + -6.98282252285377e-10, + -7.489029717511295e-10, + -8.02840071549444e-10, + -8.602942175022883e-10, + -9.214775716174312e-10, + -9.86614428442423e-10, + -1.055941886039459e-09, + -1.1297105531967977e-09, + -1.2081852949387216e-09, + -1.29164601833214e-09, + -1.3803885008478495e-09, + -1.474725263272302e-09, + -1.5749864899734552e-09, + -1.6815209986237713e-09, + -1.7946972622334396e-09, + -1.9149044864127816e-09, + -2.0425537442927115e-09, + -2.178079172982015e-09, + -2.321939233912347e-09, + -2.4746180412854517e-09, + -2.6366267617017747e-09, + -2.8085050890870342e-09, + -2.9908227985708832e-09, + -3.1841813839999927e-09, + -3.389215782923564e-09, + -3.6065961944691867e-09, + -3.837029993997536e-09, + -4.081263750918552e-09, + -4.340085353930665e-09, + -4.614326250373575e-09, + -4.904863804955473e-09, + -5.212623784842573e-09, + -5.538582977409567e-09, + -5.883771947495859e-09, + -6.249277942452795e-09, + -6.6362479515336635e-09, + -7.045891928803291e-09, + -7.47948618799299e-09, + -7.938376977867503e-09, + -8.423984248395449e-09, + -8.93780561739114e-09, + -9.481420548344927e-09, + -1.0056494750491663e-08, + -1.0664784812827416e-08, + -1.130814308520192e-08, + -1.1988522817812925e-08, + -1.270798357497275e-08, + -1.3468696935419216e-08, + -1.4272952496520865e-08, + -1.5123164195935577e-08, + -1.602187696991006e-08, + -1.6971773764406718e-08, + -1.7975682918083874e-08, + -1.903658593670651e-08, + -2.0157625680094367e-08, + -2.1342114982535845e-08, + -2.2593545730393312e-08, + -2.3915598419924546e-08, + -2.5312152221733007e-08, + -2.6787295577899278e-08, + -2.8345337360312385e-08, + -2.9990818618238425e-08, + -3.172852494928967e-08, + -3.3563499522717364e-08, + -3.550105679283538e-08, + -3.754679693623854e-08, + -3.970662105299389e-08, + -4.198674716994742e-08, + -4.4393727091057176e-08, + -4.693446413543035e-08, + -4.9616231814290257e-08, + -5.2446693492838396e-08, + -5.543392308913238e-08, + -5.858642686633159e-08, + -6.19131663775556e-08, + -6.5423582610125e-08, + -6.912762142274547e-08, + -7.303576029871192e-08, + -7.715903653573215e-08, + -8.150907690072184e-08, + -8.609812885975826e-08, + -9.093909344768424e-08, + -9.604555986684208e-08, + -1.0143184192503283e-07, + -1.0711301636877716e-07, + -1.1310496324626856e-07, + -1.1942440840615542e-07, + -1.2608896820312795e-07, + -1.3311719659713261e-07, + -1.405286346968007e-07, + -1.4834386292226548e-07, + -1.565845559141234e-07, + -1.652735403327984e-07, + -1.7443485568224742e-07, + -1.8409381835393013e-07, + -1.9427708902209522e-07, + -2.0501274358630951e-07, + -2.1633034783966749e-07, + -2.2826103606563212e-07, + -2.408375937745501e-07, + -2.5409454475709233e-07, + -2.6806824274090546e-07, + -2.827969678632225e-07, + -2.9832102816041556e-07, + -3.14682866469726e-07, + -3.319271728624666e-07, + -3.501010030286814e-07, + -3.692539028819233e-07, + -3.894380396553996e-07, + -4.107083399326827e-07, + -4.331226348821635e-07, + -4.567418131450307e-07, + -4.816299817204796e-07, + -5.078546352975682e-07, + -5.354868344616209e-07, + -5.646013932923019e-07, + -5.952770767074819e-07, + -6.275968082698082e-07, + -6.616478888004128e-07, + -6.97522226471911e-07, + -7.353165790311986e-07, + -7.751328086158796e-07, + -8.17078149970978e-07, + -8.612654927860006e-07, + -9.078136787201085e-07, + -9.568478140493525e-07, + -1.0084995986951773e-06, + -1.0629076724776867e-06, + -1.1202179795028148e-06, + -1.180584151693417e-06, + -1.2441679122898512e-06, + -1.3111395005854137e-06, + -1.3816781189130484e-06, + -1.455972402928482e-06, + -1.534220916642613e-06, + -1.6166326733000756e-06, + -1.7034276835196882e-06, + -1.7948375322031458e-06, + -1.8911059855182228e-06, + -1.992489629809214e-06, + -2.099258543794948e-06, + -2.2116970060131158e-06, + -2.3301042393444216e-06, + -2.454795194333717e-06, + -2.5861013736666394e-06, + -2.7243716996264893e-06, + -2.8699734271120645e-06, + -3.0232931041987574e-06, + -3.1847375831248974e-06, + -3.3547350840370823e-06, + -3.5337363144609095e-06, + -3.7222156472019863e-06, + -3.920672359900684e-06, + -4.129631939527022e-06, + -4.349647454768613e-06, + -4.581301000483484e-06, + -4.825205217450686e-06, + -5.082004891638461e-06, + -5.352378637220874e-06, + -5.637040667121615e-06, + -5.9367426566479234e-06, + -6.252275704090607e-06, + -6.584472393899626e-06, + -6.934208967723243e-06, + -7.302407608942504e-06, + -7.690038846224109e-06, + -8.098124083056212e-06, + -8.527738259102248e-06, + -8.980012650817189e-06, + -9.456137818015405e-06, + -9.957366704668407e-06, + -1.0485017901374671e-05, + -1.1040479078435186e-05, + -1.1625210597761055e-05, + -1.2240749313872587e-05, + -1.2888712572992361e-05, + -1.3570802420863635e-05, + -1.4288810030758269e-05, + -1.5044620361496416e-05, + -1.5840217059970354e-05, + -1.6677687618185806e-05, + -1.7559228800423922e-05, + -1.848715235293986e-05, + -1.946389101167459e-05, + -2.0492004823762425e-05, + -2.1574187798339434e-05, + -2.2713274904324823e-05, + -2.3912249433419822e-05, + -2.51742507466695e-05, + -2.650258242545745e-05, + -2.7900720847416555e-05, + -2.937232420877083e-05, + -3.0921242017861044e-05, + -3.255152508310081e-05, + -3.426743602192351e-05, + -3.6073460316233466e-05, + -3.797431794587088e-05, + -3.99749756259322e-05, + -4.2080659683541724e-05, + -4.429686960492529e-05, + -4.662939228642813e-05, + -4.908431703089201e-05, + -5.166805132154022e-05, + -5.438733741974959e-05, + -5.724926982536261e-05, + -6.02613136457037e-05, + -6.343132392347184e-05, + -6.67675659649011e-05, + -7.02787367325618e-05, + -7.397398734420419e-05, + -7.786294674648407e-05, + -8.195574661669018e-05, + -8.626304756880316e-05, + -9.079606669854579e-05, + -9.5566606594272e-05, + -0.00010058708582448672, + -0.0001058705710258765, + -0.0001114308106567014, + -0.00011728227050121738, + -0.00012344017101796425, + -0.00012992052662127605, + -0.00013674018702200256, + -0.00014391688069051025, + -0.0001514692605792781, + -0.0001594169522394139, + -0.00016778060439612987, + -0.000176581942181842, + -0.00018584382310748166, + -0.00019559029593951434, + -0.00020584666262526703, + -0.00021663954343946804, + -0.00022799694547331718, + -0.00023994833471570787, + -0.0002525247118106792, + -0.000265758691792004, + -0.00027968458786862757, + -0.00029433849963140927, + -0.00030975840573707527, + -0.0003259842614178141, + -0.0003430581010375777, + -0.00036102414592630586, + -0.0003799289177645366, + -0.00039982135784271625, + -0.0004207529524618444, + -0.0004427778647871319, + -0.00046595307351605784, + -0.0004903385186483014, + -0.000515997254792376, + -0.0005429956123459668, + -0.0005714033669711113, + -0.0006012939177380343, + -0.0006327444744874618, + -0.0006658362547529043, + -0.0007006546907694502, + -0.0007372896471977664, + -0.0007758356498546323, + -0.0008163921262653638, + -0.0008590636584808886, + -0.0009039602488215001, + -0.0009511975991864018, + -0.0010008974046538616, + -0.0010531876620239076, + -0.001108202994057202, + -0.001166084990353832, + -0.001226982565361572, + -0.0012910523348257604, + -0.0013584590111009732, + -0.0014293758187608212, + -0.0015039849310815737, + -0.0015824779287044507, + -0.0016650562815246624, + -0.0017519318547923757, + -0.0018433274409168966, + -0.0019394773179147436, + -0.0020406278360507544, + -0.0021470380339727807, + -0.0022589802856415476, + -0.0023767409798927746, + -0.0025006212337514997, + -0.002630937641687396, + -0.0027680230619072277, + -0.0029122274421164314, + -0.003063918686174474, + -0.0032234835637128074, + -0.0033913286650337116, + -0.003567881402923159, + -0.0037535910641392145, + -0.0039489299125937734, + -0.004154394346663005, + -0.0043705061133817134, + -0.004597813581849187, + -0.004836893078843488, + -0.005088350289524601, + -0.0053528217259472665, + -0.005630976266724793, + -0.00592351677111944, + -0.006231181770434454, + -0.006554747241088137, + -0.0068950284618799545, + -0.00725288196015343, + -0.007629207550308319, + -0.008024950468486032, + -0.008441103608138545, + -0.008878709860276286, + -0.009338864563388933, + -0.009822718067086577, + -0.010331478414297952, + -0.010866414147871045, + -0.011428857244676493, + -0.01202020618482297, + -0.012641929159100637, + -0.013295567421507642, + -0.013982738791964882, + -0.014705141315182366, + -0.015464557081128335, + -0.016262856213057262, + -0.017102001030430854, + -0.017984050390415465, + -0.01891116421676077, + -0.019885608220882575, + -0.020909758821287663, + -0.021986108269393415, + -0.023117269985445593, + -0.02430598411403667, + -0.025555123302091257, + -0.02686769870834908, + -0.02824686624919095, + -0.02969593308597913, + -0.03121836436088902, + -0.03281779018602613, + -0.03449801289070566, + -0.03626301453120959, + -0.03811696466892047, + -0.04006422841732765, + -0.042109374764680865, + -0.04425718517080084, + -0.046512662442255825, + -0.0488810398856641, + -0.05136779073621998, + -0.05397863786379667, + -0.05671956374999306, + -0.05959682073102669, + -0.06261694150652228, + -0.06578674989087233, + -0.06911337181841651, + -0.07260424657219428, + -0.07626713821940687, + -0.08011014725589519, + -0.08414172241628784, + -0.08837067262931543, + -0.09280617910864992, + -0.09745780750867718, + -0.10233552016148278, + -0.1074496882795847, + -0.112811104164705, + -0.11843099329684248, + -0.12432102626676607, + -0.13049333050909065, + -0.13696050172387247, + -0.14373561493529213, + -0.15083223508139718, + -0.15826442702170693, + -0.16604676489664974, + -0.17419434066522904, + -0.18272277172669119, + -0.19164820746015018, + -0.20098733454737536, + -0.2107573808660188, + -0.22097611781736642, + -0.23166186085637797, + -0.24283346798753785, + -0.2545103360502497, + -0.26671239446198025, + -0.2794600962179269, + -0.29277440577897834, + -0.3066767836050898, + -0.32118916694126315, + -0.33633394648054993, + -0.352133938619855, + -0.36861235276025556, + -0.38579275330104607, + -0.4036990158643627, + -0.42235527723359234, + -0.4417858784955149, + -0.4620153008740315, + -0.48306809366548203, + -0.5049687937093071, + -0.5277418357544332, + -0.5514114531168995, + -0.5760015679850221, + -0.6015356706550982, + -0.628036687057922, + -0.655526833914977, + -0.6840274607340905, + -0.7135588780779901, + -0.7441401713419925, + -0.7757889993686312, + -0.8085213773788532, + -0.8423514434792418, + -0.8772912083240769, + -0.9133502873645335, + -0.9505356153992696, + -0.9888511430356248, + -1.0282975149978366, + -1.0688717301355242, + -1.1105667835125732, + -1.1533712906538456, + -1.1972690948165163, + -1.2422388579841257, + -1.2882536367760211, + -1.3352804449047746, + -1.3832798039027911, + -1.4322052846107682, + -1.4820030421666732, + -1.5326113478499774, + -1.5839601216920673, + -1.6359704704083649, + -1.688554235755127, + -1.7416135593958388, + -1.7950404707108654, + -1.848716505097862, + -1.9025123609702983, + -1.9562876043434347, + -2.0098904308823418, + -2.0631574959122574, + -2.1159138236385724, + -2.1679728072939812, + -2.219136312672608, + -2.2691948976991965, + -2.3179281607227713, + -2.365105230437143, + -2.410485409746203, + -2.453818985328532, + -2.4948482136699788, + -2.5333084929559457, + -2.5689297285415744, + -2.601437897579562, + -2.6305568160339163, + -2.6560101086523593, + -2.6775233795926274, + -2.694826578726137, + -2.707656555866136, + -2.715759793027465, + -2.718895303195756, + -2.716837683403243, + -2.7093803102624054, + -2.696338667694761, + -2.6775537992574443, + -2.6528958808441017, + -2.6222679128575956, + -2.5856095327695248, + -2.542900947192773, + -2.494166974180955, + -2.439481167345657, + -2.3789699589338333, + -2.3128167035896605, + -2.2412654234320653, + -2.1646239449916704, + -2.083265980522553, + -1.9976315495936992, + -1.9082249840301007, + -1.8156096522936387, + -1.7203985487513773, + -1.623240122919887, + -1.5247993141540492, + -1.4257348735902597, + -1.3266758452108998, + -1.228202575591839, + -1.1308405366264231, + -1.0350775641754382, + -0.9414143581679174, + -0.8504489931874047, + -0.7629684201124759, + -0.6799542162214066, + -0.602283484216, + -0.53024801636, + -0.463892613069, + -0.403192476475, + -0.348060757458, + -0.29835330088, + -0.253874176015, + -0.214381879831, + -0.179596089379, + -0.149204828576, + -0.122871924022, + -0.100244630402, + -0.0809613591913, + -0.0646594708097, + -0.0509831913133, + -0.0395917281176, + -0.0301677304001, + -0.0224260688086, + -0.0161226346147, + -0.0110619523777, + -0.00710085918348, + -0.00414237822592, + -0.00210876326044, + -0.000879373201952, + -0.000260893149342, + -3.78954526426e-05, + -4.675146267e-07, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 0, + "j": 3, + "angular_momentum": 1 + }, + { + "radial_function": [ + 0.0, + 8.37420262272489e-22, + 1.386269519555046e-20, + 7.261703660101623e-20, + 2.374984947863838e-19, + 6.000810109310858e-19, + 1.2879096905004088e-18, + 2.4698164428901842e-18, + 4.3618038501352695e-18, + 7.233549139147497e-18, + 1.1415584464772518e-17, + 1.7307214380734076e-17, + 2.5385236418094145e-17, + 3.621353612995508e-17, + 5.0453633816572925e-17, + 6.88762664800672e-17, + 9.237409535825148e-17, + 1.2197563675291947e-16, + 1.5886052175377936e-16, + 2.0437619902987907e-16, + 2.6005620401597246e-16, + 3.2764012775045023e-16, + 4.090954292331395e-16, + 5.066412467594533e-16, + 6.227743759169894e-16, + 7.602975953163117e-16, + 9.223505355448832e-16, + 1.1124433020015977e-15, + 1.3344930792011866e-15, + 1.5928639616830542e-15, + 1.8924102761643026e-15, + 2.2385236800305085e-15, + 2.637184343592931e-15, + 3.095016547527098e-15, + 3.6193490525043645e-15, + 4.218280625886929e-15, + 4.9007511397922555e-15, + 5.676618687240038e-15, + 6.5567431973182275e-15, + 7.553077066865431e-15, + 8.678763366908318e-15, + 9.948242223534135e-15, + 1.1377366019961266e-14, + 1.2983524114936463e-14, + 1.4785777826709144e-14, + 1.680500648708901e-14, + 1.906406543359195e-14, + 2.158795686965914e-14, + 2.4404014602465006e-14, + 2.754210372451554e-14, + 3.103483641495409e-14, + 3.4917805099691604e-14, + 3.922983430433665e-14, + 4.4013252667923286e-14, + 4.931418663680812e-14, + 5.518287752535494e-14, + 6.167402373739565e-14, + 6.884715006305681e-14, + 7.676700612496317e-14, + 8.55039961996914e-14, + 9.513464280975025e-14, + 1.0574208664668236e-13, + 1.1741662557929e-13, + 1.3025629573717654e-13, + 1.4436749780146116e-13, + 1.5986567199517495e-13, + 1.7687602537789548e-13, + 1.9553431542855389e-13, + 2.159876941412257e-13, + 2.3839561717670285e-13, + 2.6293082297594174e-13, + 2.897803870596169e-13, + 3.191468571152645e-13, + 3.512494750143424e-13, + 3.8632549210292806e-13, + 4.2463158489332795e-13, + 4.664453784865929e-13, + 5.120670858145698e-13, + 5.618212713434048e-13, + 6.160587484183399e-13, + 6.751586202236078e-13, + 7.395304748772183e-13, + 8.096167462968484e-13, + 8.858952528707093e-13, + 9.688819271913744e-13, + 1.0591337509080019e-12, + 1.1572519099397236e-12, + 1.2638851859845074e-12, + 1.3797336021871638e-12, + 1.5055523411916464e-12, + 1.6421559558284217e-12, + 1.7904228940907183e-12, + 1.9513003608287153e-12, + 2.1258095418364644e-12, + 2.315051215721016e-12, + 2.520211782959267e-12, + 2.7425697419563204e-12, + 2.9835026452031415e-12, + 3.2444945701090384e-12, + 3.5271441427412246e-12, + 3.8331731539235076e-12, + 4.164435811980342e-12, + 4.522928676926667e-12, + 4.9108013275681345e-12, + 5.330367812947781e-12, + 5.7841189466795415e-12, + 6.274735504118929e-12, + 6.805102388966627e-12, + 7.378323838974327e-12, + 7.997739745720145e-12, + 8.666943170755274e-12, + 9.389799142475567e-12, + 1.0170464828179905e-11, + 1.1013411180400492e-11, + 1.192344616303285e-11, + 1.290573967281358e-11, + 1.3965850277757026e-11, + 1.5109753903905184e-11, + 1.6343874610685544e-11, + 1.7675117605357697e-11, + 1.9110904659593547e-11, + 2.0659212097415733e-11, + 2.2328611544531302e-11, + 2.412831363280307e-11, + 2.606821487753154e-11, + 2.8158947949827324e-11, + 3.041193559384471e-11, + 3.2839448446961685e-11, + 3.54546670441094e-11, + 3.827174830646009e-11, + 4.130589683745628e-11, + 4.457344136878761e-11, + 4.809191672786598e-11, + 5.188015171953196e-11, + 5.595836334872566e-11, + 6.034825783643685e-11, + 6.507313891657829e-11, + 7.015802393016542e-11, + 7.562976828410689e-11, + 8.15171988608172e-11, + 8.785125702923331e-11, + 9.466515193497737e-11, + 1.0199452481071508e-10, + 1.0987762508690993e-10, + 1.1835549915465383e-10, + 1.2747219267016565e-10, + 1.3727496738298554e-10, + 1.4781453351193513e-10, + 1.5914529877835015e-10, + 1.7132563529085538e-10, + 1.8441816556140282e-10, + 1.9849006896104236e-10, + 2.1361341019220554e-10, + 2.2986549116590665e-10, + 2.47329228158396e-10, + 2.6609355585359913e-10, + 2.8625386032186487e-10, + 3.0791244291705847e-10, + 3.3117901730356963e-10, + 3.5617124205793206e-10, + 3.830152911895236e-10, + 4.118464654324693e-10, + 4.4280984720949927e-10, + 4.760610021690424e-10, + 5.117667309507899e-10, + 5.501058743773328e-10, + 5.912701760950046e-10, + 6.354652066909512e-10, + 6.829113536513233e-10, + 7.338448817342667e-10, + 7.885190689563224e-10, + 8.472054233483253e-10, + 9.101949863177516e-10, + 9.77799728714619e-10, + 1.0503540462165818e-09, + 1.128216361106554e-09, + 1.2117708377352412e-09, + 1.301429220090478e-09, + 1.397632799955013e-09, + 1.5008545245575484e-09, + 1.6116012544620822e-09, + 1.7304161812497002e-09, + 1.8578814171647738e-09, + 1.994620768621389e-09, + 2.141302706184817e-09, + 2.298643545660708e-09, + 2.467410854554207e-09, + 2.6484271003683307e-09, + 2.842573557421808e-09, + 3.0507944906918075e-09, + 3.274101636155312e-09, + 3.5135789990171786e-09, + 3.770387991171011e-09, + 4.045772933561016e-09, + 4.341066947554122e-09, + 4.657698263673801e-09, + 4.997196977645119e-09, + 5.361202283834395e-09, + 5.751470221085323e-09, + 6.1698819673577495e-09, + 6.6184527203201645e-09, + 7.099341206791915e-09, + 7.61485986490048e-09, + 8.167485746298525e-09, + 8.759872189329523e-09, + 9.394861318192174e-09, + 1.0075497424551616e-08, + 1.0805041296149305e-08, + 1.1586985558280383e-08, + 1.2425071098246145e-08, + 1.3323304651749816e-08, + 1.428597763100455e-08, + 1.5317686282797948e-08, + 1.642335327126419e-08, + 1.7608250783447082e-08, + 1.8878025268386876e-08, + 2.0238723921113252e-08, + 2.1696823037188947e-08, + 2.3259258369604398e-08, + 2.4933457626219173e-08, + 2.672737526291133e-08, + 2.8649529729850946e-08, + 3.070904334827017e-08, + 3.2915684997512586e-08, + 3.527991581586021e-08, + 3.781293812315359e-08, + 4.052674779512795e-08, + 4.343419032946543e-08, + 4.654902086603525e-08, + 4.988596844087799e-08, + 5.3460804765010295e-08, + 5.729041785648365e-08, + 6.139289085884642e-08, + 6.578758641563842e-08, + 7.049523699344738e-08, + 7.55380415618048e-08, + 8.093976909447226e-08, + 8.672586935491024e-08, + 9.292359148790553e-08, + 9.95621109654723e-08, + 1.0667266547484399e-07, + 1.1428870036971622e-07, + 1.2244602437184372e-07, + 1.311829762295642e-07, + 1.4054060311490182e-07, + 1.505628515729405e-07, + 1.6129677191964493e-07, + 1.7279273702110753e-07, + 1.8510467647582198e-07, + 1.9829032726798728e-07, + 2.1241150207013735e-07, + 2.2753437641652312e-07, + 2.437297960798245e-07, + 2.6107360608495116e-07, + 2.7964700284055883e-07, + 2.995369110727898e-07, + 3.2083638723721817e-07, + 3.4364505132657983e-07, + 3.6806954902745095e-07, + 3.9422404637611334e-07, + 4.222307592033399e-07, + 4.5222051978864933e-07, + 4.843333833502538e-07, + 5.187192771728075e-07, + 5.555386953472598e-07, + 5.949634423503441e-07, + 6.37177428875906e-07, + 6.823775235664714e-07, + 7.307744646137257e-07, + 7.825938353909205e-07, + 8.380771086358806e-07, + 8.974827639426807e-07, + 9.61087483804787e-07, + 1.029187433581397e-06, + 1.1020996314116898e-06, + 1.180163414306747e-06, + 1.2637420071183554e-06, + 1.3532242017692777e-06, + 1.449026154240864e-06, + 1.5515933077875387e-06, + 1.6614024510752796e-06, + 1.7789639207479504e-06, + 1.904823958661259e-06, + 2.0395672342914842e-06, + 2.183819544384008e-06, + 2.338250701702879e-06, + 2.5035776265879696e-06, + 2.6805676552013146e-06, + 2.8700420801825193e-06, + 3.0728799385401895e-06, + 3.290022066615435e-06, + 3.522475437925541e-06, + 3.77131780578823e-06, + 4.037702671257795e-06, + 4.322864599096418e-06, + 4.62812490622413e-06, + 4.95489774838918e-06, + 5.304696634216737e-06, + 5.679141394335576e-06, + 6.079965638746381e-06, + 6.509024737530485e-06, + 6.9683043583414735e-06, + 7.459929603409091e-06, + 7.98617478488442e-06, + 8.54947388450664e-06, + 9.152431744964571e-06, + 9.7978360449601e-06, + 1.0488670110005712e-05, + 1.1228126621902132e-05, + 1.2019622283470763e-05, + 1.2866813512019227e-05, + 1.377361322504044e-05, + 1.4744208804619011e-05, + 1.5783081311638816e-05, + 1.6895026044481916e-05, + 1.8085174534226658e-05, + 1.9359018074447743e-05, + 2.072243289243603e-05, + 2.218170707887982e-05, + 2.3743569395926275e-05, + 2.5415220093961665e-05, + 2.7204363879083724e-05, + 2.9119245176047792e-05, + 3.1168685851611754e-05, + 3.336212556546561e-05, + 3.570966493262464e-05, + 3.822211168823773e-05, + 4.091103007200104e-05, + 4.3788793644744414e-05, + 4.686864177808739e-05, + 5.0164740081926355e-05, + 5.36922450199509e-05, + 5.74673730256967e-05, + 6.150747441645975e-05, + 6.583111244025619e-05, + 7.045814780895432e-05, + 7.54098291001779e-05, + 8.070888942614436e-05, + 8.637964980126409e-05, + 9.244812968602043e-05, + 9.894216516535684e-05, + 0.00010589153533408097, + 0.0001133280974001883, + 0.00012128593115798488, + 0.00012980149342657182, + 0.0001389137831660047, + 0.00014866451799722135, + 0.00015909832288657274, + 0.00017026293186141368, + 0.00018220940360796862, + 0.00019499235192718906, + 0.00020867019205169802, + 0.00022330540388513563, + 0.00023896481335780153, + 0.0002557198930680241, + 0.00027364708359051327, + 0.00029282813676532294, + 0.0003133504825425267, + 0.0003353076209095388, + 0.00035879954060735573, + 0.0003839331664800481, + 0.00041082283730684927, + 0.00043959081624356635, + 0.0004703678360114314, + 0.0005032936811587037, + 0.0005385178099071487, + 0.0005762000181716417, + 0.0006165111485997089, + 0.0006596338476244319, + 0.000705763373667847, + 0.0007551084599188299, + 0.0008078922352963173, + 0.000864353207341084, + 0.0009247463112683651, + 0.0009893440293090314, + 0.001058437585111107, + 0.0011323382180094819, + 0.0012113785423103081, + 0.0012959139972036748, + 0.0013863243930506085, + 0.0014830155603563805, + 0.0015864211078982986, + 0.0016970042969980483, + 0.0018152600395410954, + 0.0019417170271587949, + 0.0020769400003994546, + 0.0022215321661879454, + 0.0023761377731743847, + 0.002541444854694254, + 0.002718188149787891, + 0.002907152213163266, + 0.0031091747256866004, + 0.0033251500179565284, + 0.003556032819242476, + 0.003802842246031066, + 0.004066666044134709, + 0.004348665099368045, + 0.004650078233101652, + 0.004972227298621515, + 0.0053165225966528935, + 0.0056844686274294945, + 0.006077670199321192, + 0.006497838913797229, + 0.006946800047524778, + 0.007426499853945334, + 0.007939013307050137, + 0.008486552311134812, + 0.00907147440119903, + 0.009696291960283154, + 0.010363681979366093, + 0.011076496388647716, + 0.011837772987405425, + 0.012650747002657439, + 0.013518863306497136, + 0.014445789322061506, + 0.015435428651100012, + 0.0164919354539062, + 0.0176197296138404, + 0.01882351272169201, + 0.020108284906825428, + 0.021479362556417213, + 0.022942396948438536, + 0.024503393829390124, + 0.02616873397646973, + 0.02794519476496389, + 0.029839972770697415, + 0.03186070744233319, + 0.03401550585044421, + 0.036312968558319725, + 0.03876221659790377, + 0.04137291960438862, + 0.04415532508352664, + 0.04712028882339597, + 0.05027930645735529, + 0.05364454614615414, + 0.057228882372070286, + 0.061045930804740675, + 0.06511008418668245, + 0.069436549204249, + 0.07404138424281552, + 0.07894153795694248, + 0.08415488853526203, + 0.08970028354386572, + 0.09559758017161778, + 0.10186768572858462, + 0.10853259817377606, + 0.11561544642275655, + 0.1231405302005038, + 0.13113335908202364, + 0.13962069041659642, + 0.14863056569335192, + 0.15819234495297535, + 0.16833673871469232, + 0.1790958368555079, + 0.19050313390074455, + 0.20259354995254433, + 0.21540344656842167, + 0.22897063677029092, + 0.24333438826515433, + 0.2585354188998422, + 0.2746158833058454, + 0.29161934956107943, + 0.3095907646404673, + 0.32857640729267595, + 0.34862382692926097, + 0.3697817670008226, + 0.39210007118849977, + 0.4156295707188584, + 0.44042195101048065, + 0.4665295956600743, + 0.49400540589106295, + 0.5229025933327943, + 0.5532744439998121, + 0.5851740514157033, + 0.6186540165539292, + 0.6537661125159592, + 0.6905609116832723, + 0.7290873733269018, + 0.7693923895383684, + 0.8115202876794191, + 0.855512287482772, + 0.9014059115364578, + 0.9492343476284458, + 0.9990257623723255, + 1.0508025654812796, + 1.1045806247505077, + 1.1603684324982955, + 1.2181662245306533, + 1.277965053838568, + 1.3397458218166425, + 1.4034782708417801, + 1.4691199430770885, + 1.5366151115453648, + 1.6058936906119936, + 1.6768701347200072, + 1.7494423351527737, + 1.8234905265752432, + 1.8988762165631266, + 1.9754411528684777, + 2.0530063452184537, + 2.131371160114835, + 2.210312509075997, + 2.2895841525106446, + 2.368916143788153, + 2.4480144399205446, + 2.5265607072112197, + 2.604212352857376, + 2.680602815374226, + 2.755342149144856, + 2.8280179407522024, + 2.8981965970500516, + 2.965425047283428, + 3.0292329035326198, + 3.0891351254997677, + 3.144635236601595, + 3.1952291379363946, + 3.2404095649276554, + 3.2796712264344494, + 3.3125166578361496, + 3.338462805911339, + 3.3570483430916607, + 3.367841679715558, + 3.3704496037776104, + 3.3645264263089545, + 3.3497834461320215, + 3.3259984701259278, + 3.293025036403797, + 3.250800892735366, + 3.1993551902638004, + 3.138813777524524, + 3.0694019436044027, + 2.9914439906981998, + 2.905359151940571, + 2.8116536511890757, + 2.710909167019687, + 2.6037686402346103, + 2.4909212456495697, + 2.3730893631637087, + 2.2510213518704894, + 2.125494513067704, + 1.9973322646474558, + 1.8674374300784662, + 1.736838649706663, + 1.6067382552715486, + 1.478537168566114, + 1.3537972312567066, + 1.2340905656666636, + 1.1206964038163965, + 1.0141765147812578, + 0.9140685732884343, + 0.819401773006, + 0.730066805761, + 0.646295578189, + 0.568263099972, + 0.49607751644, + 0.429778606905, + 0.369337513375, + 0.314657987536, + 0.265579474597, + 0.221882332091, + 0.183295396199, + 0.149506000314, + 0.120172290266, + 0.0949374068017, + 0.0734446258253, + 0.0553520787763, + 0.0403450391723, + 0.0281432788383, + 0.0185006175717, + 0.0111940184394, + 0.00600063399077, + 0.00266385095044, + 0.000854216719889, + 0.000139634647994, + 2.44672893821e-06, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 0, + "j": 4, + "angular_momentum": 2 + }, + { + "radial_function": [ + 0.0, + 8.3728749750441825e-22, + 1.3860497401207196e-20, + 7.260552388213709e-20, + 2.3746084172942652e-19, + 5.999858739719296e-19, + 1.2877055050484967e-18, + 2.4694248777096926e-18, + 4.361112328895971e-18, + 7.232402330833747e-18, + 1.1413774635727618e-17, + 1.7304470491465753e-17, + 2.538121183751586e-17, + 3.6207794828424605e-17, + 5.0445634886847945e-17, + 6.886534682205158e-17, + 9.235945034908188e-17, + 1.2195629870844972e-16, + 1.5883533597077798e-16, + 2.04343797180154e-16, + 2.6001497464408504e-16, + 3.2758818360555246e-16, + 4.0903057114266084e-16, + 5.065609237277154e-16, + 6.22675641105242e-16, + 7.601770575319766e-16, + 9.222043058367967e-16, + 1.112266934924647e-15, + 1.3342815082776502e-15, + 1.5926114285490915e-15, + 1.8921102528480847e-15, + 2.2381687837632752e-15, + 2.6367662435055254e-15, + 3.0945258625319782e-15, + 3.6187752396065e-15, + 4.2176118581059505e-15, + 4.899974172812567e-15, + 5.675718713834752e-15, + 6.555703688516545e-15, + 7.551879598751037e-15, + 8.677387431847846e-15, + 9.946665024539717e-15, + 1.1375562246788568e-14, + 1.2981465700409463e-14, + 1.4783433681644092e-14, + 1.6802342212062434e-14, + 1.906104300565999e-14, + 2.1584534301988004e-14, + 2.4400145574672303e-14, + 2.75377371813532e-14, + 3.1029916130777144e-14, + 3.491226920596054e-14, + 3.9223614777189767e-14, + 4.4006274772622426e-14, + 4.930636832562055e-14, + 5.51741287851664e-14, + 6.166424588306559e-14, + 6.883623497222265e-14, + 7.67548354096723e-14, + 8.5490440309886e-14, + 9.511956006325072e-14, + 1.0572532217990886e-13, + 1.173980102125252e-13, + 1.3023564474769798e-13, + 1.443446095973759e-13, + 1.598403266822348e-13, + 1.76847983210999e-13, + 1.9550331513901152e-13, + 2.159534511301922e-13, + 2.3835782156446215e-13, + 2.6288913749595145e-13, + 2.89734444785391e-13, + 3.190962590072835e-13, + 3.51193787273209e-13, + 3.862642433139762e-13, + 4.245642629467684e-13, + 4.663714272561097e-13, + 5.119859015760051e-13, + 5.617321989137961e-13, + 6.159610769941166e-13, + 6.75051578895178e-13, + 7.394132277955006e-13, + 8.094883874654639e-13, + 8.857548005356401e-13, + 9.687283177977876e-13, + 1.0589658325917165e-12, + 1.1570684355183715e-12, + 1.263684805410922e-12, + 1.3795148544246863e-12, + 1.5053136454681588e-12, + 1.6418956022226991e-12, + 1.7901390334012544e-12, + 1.9509909936716278e-12, + 2.1254725069150062e-12, + 2.314684177205192e-12, + 2.5198122169093945e-12, + 2.7421349217196418e-12, + 2.9830296257073487e-12, + 3.243980170971073e-12, + 3.5265849301036726e-12, + 3.832565420924629e-12, + 4.163775557756766e-12, + 4.5222115840406605e-12, + 4.910022737743206e-12, + 5.329522700988198e-12, + 5.783201892440074e-12, + 6.273740662381601e-12, + 6.804023457070715e-12, + 7.377154022034757e-12, + 7.99647171925757e-12, + 8.665569040548043e-12, + 9.388310401430428e-12, + 1.0168852310003254e-11, + 1.1011665009836293e-11, + 1.1921555702416594e-11, + 1.2903693464673308e-11, + 1.3963635983173136e-11, + 1.5107358236319882e-11, + 1.6341283264830564e-11, + 1.7672315180945004e-11, + 1.910787457938785e-11, + 2.065593651928078e-11, + 2.2325071267011734e-11, + 2.4124487993772906e-11, + 2.606408164540575e-11, + 2.815448320679768e-11, + 3.0407113610561354e-11, + 3.2834241548041074e-11, + 3.54490454638044e-11, + 3.826568003378043e-11, + 4.1299347449976224e-11, + 4.456637385432337e-11, + 4.808429129314623e-11, + 5.187192558492256e-11, + 5.5949490528001735e-11, + 6.033868890052367e-11, + 6.506282074010479e-11, + 7.014689941959213e-11, + 7.561777608609999e-11, + 8.150427304944704e-11, + 8.783732677047253e-11, + 9.465014112686583e-11, + 1.0197835169744102e-10, + 1.098602018449329e-10, + 1.1833673144885905e-10, + 1.2745197917789845e-10, + 1.3725319928365813e-10, + 1.4779109393973468e-10, + 1.591200622354014e-10, + 1.7129846701799999e-10, + 1.8438892086355497e-10, + 1.984585924838708e-10, + 2.1357953514664255e-10, + 2.2982903849676181e-10, + 2.4729000565305506e-10, + 2.6605135718653326e-10, + 2.862084640303456e-10, + 3.078636113031634e-10, + 3.3112649525720475e-10, + 3.5611475579521345e-10, + 3.8295454690048244e-10, + 4.1178114783159256e-10, + 4.427396179821542e-10, + 4.759854983063702e-10, + 5.116855629650723e-10, + 5.500186243893219e-10, + 5.911763957840689e-10, + 6.353644150982416e-10, + 6.82803034825472e-10, + 7.337284822083954e-10, + 7.883939950443121e-10, + 8.470710382474687e-10, + 9.100506070039819e-10, + 9.776446226155296e-10, + 1.0501874276463957e-09, + 1.128037387446069e-09, + 1.2115786053386086e-09, + 1.3012227598993258e-09, + 1.3974110727990628e-09, + 1.5006164161194512e-09, + 1.611345569882477e-09, + 1.730141639346959e-09, + 1.857586644241955e-09, + 1.994304291831003e-09, + 2.1409629464199835e-09, + 2.2982788099389436e-09, + 2.4670193278577703e-09, + 2.64800683690242e-09, + 2.8421224712492203e-09, + 3.050310345699681e-09, + 3.2735820353064454e-09, + 3.5130213728349763e-09, + 3.769789585403643e-09, + 4.04513079596627e-09, + 4.340377913742516e-09, + 4.656958941942921e-09, + 4.996403732733384e-09, + 5.3603512195174605e-09, + 5.750557161532814e-09, + 6.168902437161995e-09, + 6.617401923102643e-09, + 7.098214002286164e-09, + 7.61365074440308e-09, + 8.166188806372077e-09, + 8.758481103633281e-09, + 9.393369307307016e-09, + 1.0073897223656846e-08, + 1.0803325120398261e-08, + 1.158514506571104e-08, + 1.2423097350051515e-08, + 1.3321188069719945e-08, + 1.4283707951938934e-08, + 1.531525250967264e-08, + 1.6420743620922405e-08, + 1.7605452630565915e-08, + 1.8875025085454593e-08, + 2.0235507214133233e-08, + 2.1693374276805657e-08, + 2.3255560917324925e-08, + 2.492949365538114e-08, + 2.6723125674022164e-08, + 2.8644974059897496e-08, + 3.0704159673568034e-08, + 3.29104498296348e-08, + 3.5274303990150806e-08, + 3.780692267929701e-08, + 4.052029984920661e-08, + 4.342727893689789e-08, + 4.6541612874742905e-08, + 4.987802833398145e-08, + 5.345229449230771e-08, + 5.728129665390728e-08, + 6.138311505503796e-08, + 6.577710922472032e-08, + 7.048400829300119e-08, + 7.552600765499742e-08, + 8.09268724551923e-08, + 8.671204835469667e-08, + 9.290878010336188e-08, + 9.954623846476481e-08, + 1.0665565608178084e-07, + 1.1427047290379733e-07, + 1.2242649186255143e-07, + 1.3116204550304215e-07, + 1.4051817435103204e-07, + 1.5053881783068735e-07, + 1.6127101862837595e-07, + 1.7276514143543686e-07, + 1.8507510709134117e-07, + 1.9825864319505862e-07, + 2.1237755236271397e-07, + 2.2749799935274265e-07, + 2.436908183908816e-07, + 2.610318421284973e-07, + 2.796022537146077e-07, + 2.994889636658005e-07, + 3.207850132097221e-07, + 3.4359000601936364e-07, + 3.6801057029094954e-07, + 3.941608533152629e-07, + 4.221630508317215e-07, + 4.5214797358529176e-07, + 4.842556537119738e-07, + 5.186359937544349e-07, + 5.554494612815242e-07, + 5.948678323385841e-07, + 6.370749871401034e-07, + 6.822677616524015e-07, + 7.306568590342445e-07, + 7.824678250975856e-07, + 8.379420923062138e-07, + 8.973380970694227e-07, + 9.609324755724557e-07, + 1.0290213435143597e-06, + 1.101921665776742e-06, + 1.1799727222519068e-06, + 1.2635376765281972e-06, + 1.3530052548155898e-06, + 1.4487915426058306e-06, + 1.5513419075348572e-06, + 1.6611330571427583e-06, + 1.778675241033078e-06, + 1.9045146076690072e-06, + 2.0392357263112834e-06, + 2.1834642861601724e-06, + 2.3378699845600667e-06, + 2.503169617970186e-06, + 2.680130389579753e-06, + 2.8695734492839434e-06, + 3.0723776808439776e-06, + 3.289483756062899e-06, + 3.5218984717811085e-06, + 3.770699391586978e-06, + 4.0370398127686515e-06, + 4.322154081224782e-06, + 4.627363278771437e-06, + 4.95408130858043e-06, + 5.303821407899543e-06, + 5.6782031157468405e-06, + 6.078959728734072e-06, + 6.507946280108622e-06, + 6.967148075446964e-06, + 7.458689827717658e-06, + 7.984845430531616e-06, + 8.548048415546972e-06, + 9.150903141387953e-06, + 9.79619676606971e-06, + 1.0486912054945393e-05, + 1.1226241087102913e-05, + 1.2017599916767778e-05, + 1.2864644263168208e-05, + 1.3771286292341273e-05, + 1.4741712577327456e-05, + 1.5780403307821958e-05, + 1.689215284394235e-05, + 1.8082091706088362e-05, + 1.935571009896187e-05, + 2.071888307652671e-05, + 2.2177897464907855e-05, + 2.3739480663103657e-05, + 2.5410831451800166e-05, + 2.719965295220656e-05, + 2.911418787963491e-05, + 3.116325625668396e-05, + 3.33562957531431e-05, + 3.5703404836418085e-05, + 3.821538892334704e-05, + 4.090380975050327e-05, + 4.378103817545392e-05, + 4.686031064976081e-05, + 5.0155789628363235e-05, + 5.368262816541307e-05, + 5.7457039008922126e-05, + 6.149636849139092e-05, + 6.581917555143065e-05, + 7.044531623931629e-05, + 7.539603408886215e-05, + 8.069405675355853e-05, + 8.636369933854679e-05, + 9.24309749056778e-05, + 9.892371260958815e-05, + 0.00010587168403696741, + 0.00011330673825957019, + 0.00012126294625244892, + 0.00012977675527254523, + 0.00013888715390947506, + 0.0001486358485340789, + 0.00015906745190500472, + 0.0001702296847991451, + 0.00018217359151646048, + 0.00019495377023414254, + 0.0002086286192123797, + 0.0002232605999121283, + 0.00023891651821776982, + 0.0002556678249329865, + 0.00027359093692988555, + 0.0002927675802636716, + 0.00031328515682648345, + 0.00033523713606572, + 0.0003587234734713449, + 0.00038385105767452916, + 0.00041073418800483994, + 0.0004394950846302989, + 0.0004702644334158325, + 0.0005031819678225385, + 0.0005383970903567145, + 0.0005760695361534209, + 0.0006163700815375275, + 0.0006594813005514359, + 0.0007055983725819515, + 0.0007549299445051369, + 0.0008076990509543393, + 0.0008641440964483766, + 0.0009245199036052523, + 0.0009890988315615782, + 0.001058171969361083, + 0.0011320504091108657, + 0.001211066604041742, + 0.0012955758170750409, + 0.0013859576656295909, + 0.0014826177689672283, + 0.0015859895045300272, + 0.0016965358802427737, + 0.0018147515303648754, + 0.0019411648422873638, + 0.0020763402230788764, + 0.0022208805140559082, + 0.0023754295629507577, + 0.0025406749633698237, + 0.00271735097195733, + 0.002906241614112269, + 0.0031081839898031553, + 0.003324071791992219, + 0.003554859049901359, + 0.003801564111309911, + 0.004065273877779512, + 0.0043471483077466766, + 0.004648425203720514, + 0.004970425299435312, + 0.005314557665228988, + 0.005682325448932556, + 0.006075331972177511, + 0.006495287201781363, + 0.006944014616882464, + 0.007423458494024561, + 0.007935691632755896, + 0.008482923545350787, + 0.009067509135129674, + 0.00969195788946028, + 0.010358943612834232, + 0.011071314728588359, + 0.011832105176181686, + 0.01264454593395285, + 0.013512077196884156, + 0.01443836123896376, + 0.015427295992701923, + 0.016483029376114185, + 0.0176099743989052, + 0.01881282508255544, + 0.020096573220661797, + 0.021466526020176166, + 0.022928324648480197, + 0.024487963716513014, + 0.026151811736756025, + 0.027926632575921595, + 0.02981960793113398, + 0.03183836086324261, + 0.033990980392952716, + 0.03628604720333973, + 0.038732660430679355, + 0.04134046559543351, + 0.0441196836456979, + 0.047081141122880525, + 0.05023630145419797, + 0.053597297337650944, + 0.057176964209798606, + 0.060988874753250724, + 0.06504737438888825, + 0.06936761771527221, + 0.07396560579054574, + 0.07885822418372808, + 0.08406328167102983, + 0.0895995494564826, + 0.09548680073553122, + 0.10174585044755143, + 0.10839859498794399, + 0.11546805162441724, + 0.12297839737637692, + 0.13095500699320056, + 0.1394244897199254, + 0.14841472440043224, + 0.15795489251468056, + 0.1680755086106176, + 0.17880844755874933, + 0.19018696807881777, + 0.2022457317556727, + 0.2150208168461574, + 0.22854972604702636, + 0.24287138729454122, + 0.258026146607458, + 0.2740557519187295, + 0.29100332671234724, + 0.30891333222703976, + 0.32783151685469286, + 0.34780485131096467, + 0.36888144804507045, + 0.3911104632111016, + 0.4145419795045733, + 0.43922686807047695, + 0.465216627491941, + 0.49256319798638953, + 0.5213187486860982, + 0.551535435885996, + 0.5832651302216361, + 0.6165591104758961, + 0.6514677219671167, + 0.6880399972972231, + 0.7263232374940203, + 0.7663625514739766, + 0.8082003520961302, + 0.851875807027215, + 0.897424243250345, + 0.9448765038129111, + 0.9942582563658727, + 1.0455892530139317, + 1.09888254170601, + 1.1541436301031829, + 1.211369603198016, + 1.2705481971188397, + 1.3316568321528024, + 1.3946616090875017, + 1.4595162740129735, + 1.5261611579172254, + 1.5945220985153825, + 1.6645093534563427, + 1.7360165149906321, + 1.8089194381482385, + 1.8830751959245149, + 1.9583210764967254, + 2.034473639514184, + 2.11132785014829, + 2.1886563115263984, + 2.266208617886455, + 2.3437108531177784, + 2.4208652611684793, + 2.4973501167124876, + 2.572819827068999, + 2.646905298250963, + 2.7192146004695243, + 2.789333970819362, + 2.8568291932509515, + 2.9212473984018508, + 2.982119327977101, + 3.0389621102889843, + 3.091282594699653, + 3.1385812924969803, + 3.1803569700675967, + 3.2161119352262717, + 3.24535804905413, + 3.267623481387518, + 3.2824602068762783, + 3.2894522080128525, + 3.2882243100643302, + 3.278451518265767, + 3.259868659005373, + 3.232280043912302, + 3.1955687809528905, + 3.1497052550805145, + 3.09475420254192, + 3.0308797233164193, + 2.9583475388210845, + 2.877523838118548, + 2.7888702051330614, + 2.6929344262295545, + 2.5903374848349805, + 2.4817577862764173, + 2.3679146136520997, + 2.2495539159040776, + 2.127440577768268, + 2.0023619461259283, + 1.8751469799633975, + 1.746703069730537, + 1.618067227238428, + 1.4904588995526116, + 1.3653077451186975, + 1.244213234747616, + 1.1287812452144297, + 1.0202947726540215, + 0.9192531745820461, + 0.8250416174337256, + 0.736499543076, + 0.65341828058, + 0.575968252571, + 0.504263496378, + 0.438352011766, + 0.378215242931, + 0.323768709654, + 0.27486402673, + 0.231292571983, + 0.192791049744, + 0.159049151417, + 0.129719421456, + 0.104429288108, + 0.0827949871183, + 0.0644368186185, + 0.0489947677287, + 0.0361430863763, + 0.0256018572039, + 0.0171430345064, + 0.0105877580768, + 0.0057910567178, + 0.0026088037152, + 0.000839692852793, + 0.00013727587804, + 2.40502366189e-06, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 0, + "j": 5, + "angular_momentum": 2 + }, + { + "radial_function": [ + -0.0, + -1.0603874516563056e-12, + -4.314363015346424e-12, + -9.874431647167703e-12, + -1.785760766700328e-11, + -2.8385581011689254e-11, + -4.1584889404311445e-11, + -5.7587096647205636e-11, + -7.652897725490862e-11, + -9.855270764004196e-11, + -1.238060640980607e-10, + -1.5244262781142974e-10, + -1.846219971267663e-10, + -2.2051000736612292e-10, + -2.602789584131873e-10, + -3.0410785037580106e-10, + -3.5218262757970173e-10, + -4.0469643121427904e-10, + -4.6184986089028773e-10, + -5.238512454661383e-10, + -5.909169234353974e-10, + -6.632715332305484e-10, + -7.411483137471756e-10, + -8.247894155215044e-10, + -9.144462228536637e-10, + -1.0103796872820061e-09, + -1.1128606728678516e-09, + -1.2221703135794116e-09, + -1.338600383320623e-09, + -1.4624536789459865e-09, + -1.5940444167950482e-09, + -1.7336986431629774e-09, + -1.881754659201491e-09, + -2.0385634607776843e-09, + -2.204489193780307e-09, + -2.3799096254497987e-09, + -2.565216632222502e-09, + -2.7608167047345347e-09, + -2.967131470577351e-09, + -3.1845982353301717e-09, + -3.413670542658998e-09, + -3.6548187539860134e-09, + -3.908530648532113e-09, + -4.175312044348536e-09, + -4.455687441187839e-09, + -4.750200685794335e-09, + -5.059415660607297e-09, + -5.383916996335656e-09, + -5.72431081009623e-09, + -6.081225468338786e-09, + -6.455312377467667e-09, + -6.847246801871357e-09, + -7.257728709671488e-09, + -7.687483649735215e-09, + -8.137263657763504e-09, + -8.607848194574175e-09, + -9.100045117654413e-09, + -9.614691686137604e-09, + -1.015265560081249e-08, + -1.0714836080500401e-08, + -1.1302164976349876e-08, + -1.1915607924810043e-08, + -1.2556165540421926e-08, + -1.322487465129677e-08, + -1.3922809575859146e-08, + -1.4651083446275539e-08, + -1.541084957644341e-08, + -1.6203302878252557e-08, + -1.7029681327153375e-08, + -1.789126747853147e-08, + -1.8789390037525435e-08, + -1.9725425483250616e-08, + -2.0700799748466678e-08, + -2.1716989960044723e-08, + -2.27755262372975e-08, + -2.3877993555663578e-08, + -2.5026033673194753e-08, + -2.6221347124356168e-08, + -2.746569528416246e-08, + -2.876090250333879e-08, + -3.0108858318483584e-08, + -3.1511519736995116e-08, + -3.2970913604485897e-08, + -3.448913905233941e-08, + -3.6068370030968095e-08, + -3.771085793072743e-08, + -3.941893429559615e-08, + -4.1195013627476515e-08, + -4.304159629250884e-08, + -4.4961271524799385e-08, + -4.69567205351654e-08, + -4.903071973068621e-08, + -5.118614403994731e-08, + -5.342597036163715e-08, + -5.57532811249494e-08, + -5.817126797942841e-08, + -6.068323560965822e-08, + -6.329260568449102e-08, + -6.600292094006641e-08, + -6.881784940866437e-08, + -7.174118878937678e-08, + -7.477687097678017e-08, + -7.792896673815666e-08, + -8.120169056197099e-08, + -8.459940566666616e-08, + -8.812662918889879e-08, + -9.178803754685662e-08, + -9.558847199334534e-08, + -9.953294435996575e-08, + -1.0362664299698233e-07, + -1.0787493892636e-07, + -1.1228339220007917e-07, + -1.1685775848287442e-07, + -1.2160399586418295e-07, + -1.2652827190142137e-07, + -1.3163697091085545e-07, + -1.3693670150985966e-07, + -1.4243430442054432e-07, + -1.481368605426213e-07, + -1.5405169930457243e-07, + -1.601864073100977e-07, + -1.665488372733262e-07, + -1.7314711727415408e-07, + -1.7998966032381368e-07, + -1.8708517427194623e-07, + -1.944426720444908e-07, + -2.0207148224563507e-07, + -2.0998126012227923e-07, + -2.1818199890733582e-07, + -2.2668404155470537e-07, + -2.354980928831407e-07, + -2.4463523213648095e-07, + -2.5410692598158175e-07, + -2.639250419507737e-07, + -2.741018623527192e-07, + -2.8465009866287743e-07, + -2.9558290641343695e-07, + -3.0691390058933074e-07, + -3.186571715697115e-07, + -3.308273016065793e-07, + -3.4343938188293834e-07, + -3.5650903015248937e-07, + -3.7005240899471627e-07, + -3.840862446933599e-07, + -3.986278467767631e-07, + -4.1369512821900785e-07, + -4.293066263522964e-07, + -4.454815244942569e-07, + -4.622396743174014e-07, + -4.796016189967753e-07, + -4.975886171714175e-07, + -5.162226676733375e-07, + -5.355265352145494e-07, + -5.555237768263135e-07, + -5.762387693470709e-07, + -5.976967377501494e-07, + -6.199237845112179e-07, + -6.42946919958614e-07, + -6.667940936591089e-07, + -6.914942269636559e-07, + -7.170772465639018e-07, + -7.43574119258918e-07, + -7.710168879663881e-07, + -7.994387088421526e-07, + -8.288738898550246e-07, + -8.593579305423299e-07, + -8.909275631901421e-07, + -9.236207954394088e-07, + -9.574769543668084e-07, + -9.925367320230034e-07, + -1.0288422326235868e-06, + -1.0664370213019863e-06, + -1.105366174556862e-06, + -1.14567633242362e-06, + -1.1874157524567109e-06, + -1.2306343656003443e-06, + -1.275383833875813e-06, + -1.3217176101557642e-06, + -1.369690999993983e-06, + -1.4193612254176459e-06, + -1.4707874911784427e-06, + -1.5240310530159238e-06, + -1.5791552884204147e-06, + -1.6362257698374815e-06, + -1.695310340237362e-06, + -1.75647919143951e-06, + -1.8198049450061124e-06, + -1.8853627360037457e-06, + -1.9532302995668074e-06, + -2.0234880604466533e-06, + -2.096219225608655e-06, + -2.1715098801175103e-06, + -2.249449086063994e-06, + -2.3301289851729793e-06, + -2.413644904693317e-06, + -2.500095466958669e-06, + -2.589582702855697e-06, + -2.682212168921023e-06, + -2.7780930685498887e-06, + -2.8773383774866346e-06, + -2.980064973352775e-06, + -3.0863937697299556e-06, + -3.1964498548153677e-06, + -3.3103626347759833e-06, + -3.4282659819794907e-06, + -3.5502983883903566e-06, + -3.6766031239468758e-06, + -3.807328400538872e-06, + -3.942627541574004e-06, + -4.0826591570973985e-06, + -4.227587325103091e-06, + -4.377581778864404e-06, + -4.532818100612436e-06, + -4.693477921917049e-06, + -4.859749130641836e-06, + -5.031826085186282e-06, + -5.209909835719356e-06, + -5.394208353018576e-06, + -5.584936765140991e-06, + -5.782317601829129e-06, + -5.986581047444332e-06, + -6.197965202187217e-06, + -6.416716352401472e-06, + -6.643089249648655e-06, + -6.877347399447486e-06, + -7.1197633595418095e-06, + -7.370619048318357e-06, + -7.630206063410726e-06, + -7.898826011067177e-06, + -8.176790846710731e-06, + -8.464423226468583e-06, + -8.762056870864982e-06, + -9.070036940363843e-06, + -9.388720423524475e-06, + -9.718476538260659e-06, + -1.0059687145897472e-05, + -1.0412747179647585e-05, + -1.077806508676918e-05, + -1.1156063285507729e-05, + -1.1547178637200359e-05, + -1.1951862934015575e-05, + -1.2370583402383317e-05, + -1.2803823223435005e-05, + -1.3252082070173121e-05, + -1.3715876662498117e-05, + -1.4195741340041172e-05, + -1.4692228654034218e-05, + -1.5205909978182312e-05, + -1.573737613961613e-05, + -1.6287238069881776e-05, + -1.685612747746485e-05, + -1.7444697541672096e-05, + -1.8053623628803845e-05, + -1.8683604031784003e-05, + -1.9335360732471208e-05, + -2.000964018950805e-05, + -2.0707214150073085e-05, + -2.142888048822786e-05, + -2.2175464069207423e-05, + -2.294781764102778e-05, + -2.3746822754359297e-05, + -2.457339071078095e-05, + -2.5428463540611512e-05, + -2.6313015011238777e-05, + -2.7228051666259284e-05, + -2.817461389690535e-05, + -2.9153777046168448e-05, + -3.0166652546051843e-05, + -3.121438908985072e-05, + -3.2298173839436154e-05, + -3.341923366896473e-05, + -3.4578836444848456e-05, + -3.5778292344834615e-05, + -3.701895521438629e-05, + -3.830222396386766e-05, + -3.962954400589606e-05, + -4.100240873304123e-05, + -4.242236103956217e-05, + -4.389099488418466e-05, + -4.5409956898198433e-05, + -4.698094803732664e-05, + -4.8605725278949094e-05, + -5.028610336701868e-05, + -5.2023956600968e-05, + -5.382122067582982e-05, + -5.567989456707459e-05, + -5.7602042466638857e-05, + -5.958979576677739e-05, + -6.164535509833574e-05, + -6.377099240823622e-05, + -6.596905310355914e-05, + -6.824195823212798e-05, + -7.059220672169181e-05, + -7.302237766944192e-05, + -7.553513268164805e-05, + -7.813321826424261e-05, + -8.081946826156373e-05, + -8.359680635346744e-05, + -8.646824859237576e-05, + -8.94369059908872e-05, + -9.250598716552419e-05, + -9.567880101271944e-05, + -9.895875944305926e-05, + -0.00010234938015053492, + -0.00010585428942468816, + -0.00010947722500062212, + -0.0001132220389496549, + -0.00011709270059210918, + -0.00012109329945524452, + -0.000125228048238389, + -0.00012950128581797413, + -0.0001339174802450404, + -0.00013848123178156137, + -0.00014319727591549853, + -0.00014807048638504662, + -0.00015310587819600597, + -0.0001583086106159206, + -0.00016368399013688318, + -0.0001692374734084716, + -0.00017497467012012703, + -0.0001809013458205763, + -0.0001870234246697404, + -0.0001933469920928794, + -0.0001998782973404848, + -0.00020662375592458057, + -0.00021358995191811012, + -0.00022078364008566113, + -0.00022821174785001306, + -0.00023588137704038588, + -0.00024379980540711814, + -0.00025197448790114106, + -0.0002604130576316985, + -0.0002691233265273801, + -0.000278113285630879, + -0.00028739110499887777, + -0.00029696513316329013, + -0.00030684389611774793, + -0.00031703609576787234, + -0.00032755060779469973, + -0.0003383964789049436, + -0.00034958292334324786, + -0.0003611193186863496, + -0.00037301520075794047, + -0.00038528025767819616, + -0.00039792432289043837, + -0.00041095736712511036, + -0.00042438948919811404, + -0.000438230905516799, + -0.00045249193823346966, + -0.0004671830018788364, + -0.00048231458838890673, + -0.0004978972503787626, + -0.0005139415825000194, + -0.0005304582007768713, + -0.0005474577196897149, + -0.0005649507269069756, + -0.0005829477553886165, + -0.0006014592527459336, + -0.0006204955475781386, + -0.0006400668125695676, + -0.0006601830241319257, + -0.000680853918263088, + -0.0007020889424038479, + -0.0007238972029501865, + -0.0007462874080989566, + -0.0007692678057053938, + -0.0007928461157480631, + -0.0008170294570343731, + -0.0008418242677258786, + -0.000867236219208075, + -0.0008932701228511418, + -0.0009199298291547158, + -0.0009472181186893697, + -0.0009751365843383735, + -0.0010036855041228923, + -0.0010328637040408009, + -0.0010626684101807762, + -0.0010930950893548736, + -0.0011241372775044128, + -0.0011557863949993954, + -0.0011880315479817977, + -0.0012208593147657386, + -0.0012542535163013434, + -0.0012881949697006237, + -0.001322661223569461, + -0.0013576262741100238, + -0.0013930602605867087, + -0.0014289291389069415, + -0.0014651943318700527, + -0.0015018123546016767, + -0.0015387344135730865, + -0.0015759059775418307, + -0.0016132663187144037, + -0.0016507480221612072, + -0.0016882764616551647, + -0.0017257692398106228, + -0.0017631355903631643, + -0.0018002757403893918, + -0.0018370802299906715, + -0.0018734291870654348, + -0.0019091915544466908, + -0.001944224266777305, + -0.001978371374234859, + -0.0020114631101266754, + -0.0020433148993055103, + -0.0020737263041806188, + -0.0021024799049949, + -0.002129340110921473, + -0.002154051898449363, + -0.0021763394733415077, + -0.002195904852452043, + -0.0022124263614866886, + -0.002225557044793028, + -0.002234922983141868, + -0.002240121515411043, + -0.0022407193600715134, + -0.0022362506323120404, + -0.0022262147526798197, + -0.002210074243108242, + -0.0021872524063446595, + -0.002157130884748272, + -0.0021190470947125744, + -0.0020722915331989134, + -0.0020161049527939808, + -0.001949675402447416, + -0.0018721351312442566, + -0.001782557352651075, + -0.0016799528682431965, + -0.001563266548857324, + -0.0014313736744566304, + -0.001283076131359128, + -0.0011170984700565514, + -0.0009320838260153733, + -0.0007265897068039082, + -0.0004990836522698235, + -0.0002479387741625431, + 2.857081510914953e-05, + 0.00033227467258844037, + 0.0006651107816288809, + 0.0010291303769231783, + 0.0014265028196255762, + 0.0018595204987813011, + 0.002330603733522415, + 0.0028423056433404693, + 0.0033973169536730663, + 0.0039984706952683035, + 0.004648746750644846, + 0.005351276199529413, + 0.006109345401007719, + 0.00692639975168418, + 0.007806047042886187, + 0.008752060340727218, + 0.009768380296114909, + 0.010859116784404862, + 0.01202854977268884, + 0.013281129285083477, + 0.014621474340305, + 0.01605437071801577, + 0.01758476739533226, + 0.0192177714838273, + 0.020958641485558566, + 0.02281277866801887, + 0.02478571634710656, + 0.026883106847868904, + 0.02911070590255178, + 0.031474354228917284, + 0.03397995601146768, + 0.03663345400226468, + 0.039440800943919996, + 0.04240792699230715, + 0.045540702827973394, + 0.04884489811597893, + 0.05232613497466587, + 0.05598983612483598, + 0.059841167363820426, + 0.06388497404353756, + 0.06812571121937092, + 0.07256736717682384, + 0.0772133800442466, + 0.0820665472574119, + 0.08712892765779008, + 0.09240173610429105, + 0.09788523048336259, + 0.10357859115224281, + 0.10947979289256415, + 0.11558546958812507, + 0.1218907719856026, + 0.12838921900927291, + 0.13507254331831578, + 0.1419305319599939, + 0.14895086320242704, + 0.15611894087106598, + 0.16341772778337899, + 0.17082758015095706, + 0.17832608517155815, + 0.18588790431520288, + 0.19348462521317478, + 0.20108462541417746, + 0.20865295164182246, + 0.21615121860934858, + 0.2235375318230087, + 0.2307664391981001, + 0.23778891665998192, + 0.24455239327577272, + 0.25100082173734684, + 0.2570748002435, + 0.2627117520375096, + 0.26784616890581636, + 0.27240992493189886, + 0.27633266665228073, + 0.27954228546998733, + 0.2819654777376743, + 0.28352839729356205, + 0.28415740442507637, + 0.2837799142155577, + 0.28232534599670955, + 0.2797261741739466, + 0.27591907899440593, + 0.27084619388616443, + 0.2644564437921033, + 0.25670696641036994, + 0.24756460543263994, + 0.23700746161406866, + 0.22502648379789522, + 0.21162707762054178, + 0.1968307044623096, + 0.1806764369643939, + 0.16322242989165828, + 0.14454725598538257, + 0.12475104543389207, + 0.1039563546643435, + 0.08230867534896891, + 0.05997647859640649, + 0.037150673656240425, + 0.014043347789058113, + -0.009114351224316648, + -0.032075319340538526, + -0.054580683624753996, + -0.0763650990928882, + -0.09716305919206193, + -0.1167159340147598, + -0.13477918197479352, + -0.1511288406846671, + -0.1655660364005874, + -0.17791798291139113, + -0.1880340418795959, + -0.19577642453010993, + -0.2010080256811339, + -0.2035864685002098, + -0.20338676139766257, + -0.200395676912, + -0.194822964543, + -0.186957871324, + -0.177114167283, + -0.16562099874, + -0.152815775072, + -0.13903739476, + -0.124620151898, + -0.109888635873, + -0.0951538525811, + -0.0807106846416, + -0.066836509357, + -0.0537905463021, + -0.0418129141728, + -0.0311220257411, + -0.0219081791411, + -0.0143211654965, + -0.00844957658103, + -0.00429138586231, + -0.00171867938441, + -0.000448045942491, + -4.27154026454e-05, + -4.25075614434e-07, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 1, + "j": 1, + "angular_momentum": 0 + }, + { + "radial_function": [ + -0.0, + -1.6865093547687745e-16, + -1.3840982245797157e-15, + -4.792477110370821e-15, + -1.1655389783451813e-14, + -2.335815676659763e-14, + -4.14185808161729e-14, + -6.749625299575837e-14, + -1.0340243223045315e-13, + -1.5111053136860543e-13, + -2.1276724465661266e-13, + -2.9070435340589123e-13, + -3.874512487086767e-13, + -5.057482122212101e-13, + -6.48560498204089e-13, + -8.190932625510572e-13, + -1.0208073868793598e-12, + -1.2574362486026518e-12, + -1.53300349042142e-12, + -1.8518418459629985e-12, + -2.218613081099597e-12, + -2.638329113971707e-12, + -3.116374379853286e-12, + -3.6585295112918654e-12, + -4.270996406920737e-12, + -4.960424766896752e-12, + -5.733940177543358e-12, + -6.599173830950382e-12, + -7.564293971703542e-12, + -8.638039166307557e-12, + -9.829753497451487e-12, + -1.114942378974798e-11, + -1.2607718979847196e-11, + -1.4216031750150084e-11, + -1.5986522551278784e-11, + -1.7932166145938877e-11, + -2.00668008128743e-11, + -2.2405180358587316e-11, + -2.4963029091758842e-11, + -2.7757099922526283e-11, + -3.080523576055596e-11, + -3.412643439138168e-11, + -3.774091702368754e-11, + -4.167020070782349e-11, + -4.5937174839597184e-11, + -5.056618197057634e-11, + -5.5583103163856135e-11, + -6.101544813824033e-11, + -6.68924504768159e-11, + -7.324516814846847e-11, + -8.010658966673023e-11, + -8.751174617275284e-11, + -9.549782975159709e-11, + -1.0410431837028477e-10, + -1.1337310773550711e-10, + -1.233486504865195e-10, + -1.3407810312251686e-10, + -1.4561148106334096e-10, + -1.5800182229300924e-10, + -1.7130536005371746e-10, + -1.855817050876469e-10, + -2.0089403793060364e-10, + -2.1730931179492397e-10, + -2.348984666517521e-10, + -2.53736655042788e-10, + -2.739034803584508e-10, + -2.954832481567467e-10, + -3.185652312826544e-10, + -3.432439495148268e-10, + -3.6961946451506346e-10, + -3.977976909305806e-10, + -4.278907244918272e-10, + -4.600171879898609e-10, + -4.943025962054628e-10, + -5.308797406429581e-10, + -5.698890953140645e-10, + -6.114792445387684e-10, + -6.558073340204224e-10, + -7.030395464702232e-10, + -7.53351603032657e-10, + -8.069292919499596e-10, + -8.639690258108508e-10, + -9.246784291163943e-10, + -9.89276957577821e-10, + -1.0579965509519629e-09, + -1.1310823211640152e-09, + -1.2087932776949389e-09, + -1.2914030919812469e-09, + -1.3792009032822312e-09, + -1.4724921678562521e-09, + -1.5715995539444969e-09, + -1.6768638851183033e-09, + -1.7886451341169745e-09, + -1.907323470572666e-09, + -2.033300364681012e-09, + -2.166999750508045e-09, + -2.308869251629829e-09, + -2.4593814727096013e-09, + -2.619035360212304e-09, + -2.788357636356759e-09, + -2.9679043096663683e-09, + -3.158262266862726e-09, + -3.3600509495072536e-09, + -3.5739241209800243e-09, + -3.800571727527574e-09, + -4.040721859238467e-09, + -4.295142815553504e-09, + -4.564645281429714e-09, + -4.850084619673758e-09, + -5.152363285438624e-09, + -5.472433370138899e-09, + -5.811299280521832e-09, + -6.170020560930224e-09, + -6.5497148661354044e-09, + -6.9515610922419515e-09, + -7.376802674676262e-09, + -7.826751061724922e-09, + -8.302789373007681e-09, + -8.806376252560972e-09, + -9.339049926786303e-09, + -9.902432478758947e-09, + -1.0498234348815117e-08, + -1.1128259075314818e-08, + -1.179440828632692e-08, + -1.2498686957429382e-08, + -1.3243208947497998e-08, + -1.403020282928578e-08, + -1.4862018028967038e-08, + -1.574113129130683e-08, + -1.6670153487598972e-08, + -1.7651836784855378e-08, + -1.868908219457322e-08, + -1.978494752185589e-08, + -2.0942655735049696e-08, + -2.2165603779025453e-08, + -2.3457371854918085e-08, + -2.482173319129728e-08, + -2.6262664331320862e-08, + -2.7784355965786447e-08, + -2.9391224337408617e-08, + -3.108792324942809e-08, + -3.2879356708031334e-08, + -3.4770692233763255e-08, + -3.676737487533323e-08, + -3.887514196514127e-08, + -4.110003865214434e-08, + -4.344843425691954e-08, + -4.592703948917393e-08, + -4.85429245733414e-08, + -5.1303538331611585e-08, + -5.421672827626926e-08, + -5.7290761752298274e-08, + -6.053434821217802e-08, + -6.395666264307829e-08, + -6.756737025205785e-08, + -7.137665243409134e-08, + -7.539523411941159e-08, + -7.963441255663874e-08, + -8.410608761004891e-08, + -8.882279366738825e-08, + -9.379773320733347e-08, + -9.904481214427896e-08, + -1.0457867704338801e-07, + -1.1041475426805624e-07, + -1.165692912233788e-07, + -1.2305939973991487e-07, + -1.2990310175113933e-07, + -1.3711937737557305e-07, + -1.4472821552990988e-07, + -1.5275066719041904e-07, + -1.6120890147418094e-07, + -1.701262646549067e-07, + -1.795273422849006e-07, + -1.8943802457940822e-07, + -1.9988557524105778e-07, + -2.1089870390918925e-07, + -2.2250764238926981e-07, + -2.347442249130756e-07, + -2.476419726159213e-07, + -2.6123618240691547e-07, + -2.7556402057831946e-07, + -2.906646212584532e-07, + -3.065791900758922e-07, + -3.2335111327019325e-07, + -3.4102607248664247e-07, + -3.596521656430965e-07, + -3.7928003410459016e-07, + -3.999629965595413e-07, + -4.2175718989848136e-07, + -4.4472171748881383e-07, + -4.6891880522025085e-07, + -4.944139657737064e-07, + -5.212761714236855e-07, + -5.495780360018842e-07, + -5.793960063235429e-07, + -6.108105636650664e-07, + -6.439064358624551e-07, + -6.787728204366288e-07, + -7.155036194519016e-07, + -7.541976867380491e-07, + -7.949590879730178e-07, + -8.37897374443984e-07, + -8.831278711514411e-07, + -9.307719799947789e-07, + -9.809574988353087e-07, + -1.0338189573209783e-06, + -1.089497970195518e-06, + -1.1481436091998377e-06, + -1.2099127944554842e-06, + -1.2749707062451111e-06, + -1.3434912184618757e-06, + -1.4156573546879953e-06, + -1.4916617681418186e-06, + -1.571707246812119e-06, + -1.6560072449230695e-06, + -1.7447864423518265e-06, + -1.8382813331894639e-06, + -1.9367408451599332e-06, + -2.04042699150203e-06, + -2.1496155568174116e-06, + -2.264596818949271e-06, + -2.385676308488787e-06, + -2.5131756081684045e-06, + -2.6474331938769e-06, + -2.788805319818938e-06, + -2.937666949861657e-06, + -3.0944127376647357e-06, + -3.2594580579612614e-06, + -3.4332400918107413e-06, + -3.6162189687005526e-06, + -3.808878968079991e-06, + -4.011729783978306e-06, + -4.225307855535739e-06, + -4.450177767140588e-06, + -4.68693372187489e-06, + -4.936201091575131e-06, + -5.198638048376538e-06, + -5.474937281132084e-06, + -5.765827801615008e-06, + -6.072076845131858e-06, + -6.394491870473769e-06, + -6.733922664038195e-06, + -7.091263554215119e-06, + -7.46745574114243e-06, + -7.863489748343836e-06, + -8.28040800210095e-06, + -8.719307545802123e-06, + -9.181342895777921e-06, + -9.667729046438522e-06, + -1.0179744631908251e-05, + -1.0718735253132058e-05, + -1.1286116978327254e-05, + -1.1883380026079276e-05, + -1.2512092641108616e-05, + -1.3173905171297163e-05, + -1.3870554358650521e-05, + -1.4603867852949615e-05, + -1.537576896173817e-05, + -1.6188281647500398e-05, + -1.7043535785561713e-05, + -1.794377269651129e-05, + -1.8891350966700695e-05, + -1.988875257226812e-05, + -2.093858932263684e-05, + -2.204360963952233e-05, + -2.320670568969057e-05, + -2.4430920889368316e-05, + -2.5719457799106677e-05, + -2.707568643073084e-05, + -2.850315298668633e-05, + -3.0005589054989826e-05, + -3.158692128207129e-05, + -3.325128155103975e-05, + -3.500301768793716e-05, + -3.6846704727079406e-05, + -3.878715676242349e-05, + -4.082943941433644e-05, + -4.2978882947940674e-05, + -4.524109607108884e-05, + -4.762198045247265e-05, + -5.012774599359571e-05, + -5.2764926894907275e-05, + -5.554039855989122e-05, + -5.846139537320533e-05, + -6.15355294090733e-05, + -6.477081010600642e-05, + -6.817566496793795e-05, + -7.175896133807428e-05, + -7.55300293120684e-05, + -7.949868582061952e-05, + -8.367525999229111e-05, + -8.807061980570931e-05, + -9.269620013928654e-05, + -9.756403227490649e-05, + -0.00010268677493020261, + -0.00010807774690030303, + -0.00011375096138683357, + -0.00011972116212399999, + -0.0001260038613564439, + -0.00013261537978852142, + -0.00013957288862198264, + -0.00014689445373831976, + -0.00015459908219897308, + -0.00016270677113314802, + -0.00017123855915900812, + -0.00018021658046213856, + -0.00018966412168161414, + -0.0001996056817087605, + -0.00021006703461590713, + -0.0002210752957874142, + -0.00023265899151493535, + -0.00024484813211988246, + -0.00025767428892565846, + -0.0002711706751267472, + -0.0002853722308576338, + -0.0003003157126528558, + -0.00031603978749818466, + -0.000332585131708822, + -0.00034999453491564353, + -0.00036831300938978755, + -0.0003875879049750367, + -0.0004078690299406409, + -0.0004292087780022265, + -0.00045166226188703194, + -0.0004752874537337165, + -0.0005001453326902021, + -0.0005263000400311346, + -0.000553819042270083, + -0.0005827733025587441, + -0.0006132374608267773, + -0.0006452900232046209, + -0.0006790135609757731, + -0.000714494919762769, + -0.0007518254393242579, + -0.0007911011845315464, + -0.0008324231880719483, + -0.0008758977055002108, + -0.0009216364831943722, + -0.0009697570398601537, + -0.0010203829623928885, + -0.00107364421650727, + -0.0011296774732630945, + -0.0011886264518332728, + -0.0012506422797472513, + -0.0013158838710882078, + -0.0013845183237578662, + -0.0014567213366957572, + -0.0015326776478821456, + -0.001612581494393511, + -0.0016966370952949136, + -0.0017850591586821985, + -0.0018780734139659569, + -0.0019759171704860955, + -0.002078839904009629, + -0.002187103872032719, + -0.002300984759737125, + -0.0024207723574906515, + -0.002546771271942646, + -0.0026793016718786398, + -0.0028187000705541267, + -0.0029653201464375813, + -0.003119533603685871, + -0.0032817310746518845, + -0.0034523230660645447, + -0.003631740950875461, + -0.003820438008034082, + -0.004018890512067155, + -0.004227598874909037, + -0.004447088842312752, + -0.004677912747016186, + -0.004920650821362014, + -0.005175912571993415, + -0.0054443382188776425, + -0.005726600202200665, + -0.0060234047590198, + -0.0063354935734500125, + -0.0066636455030383325, + -0.0070086783842743415, + -0.007371450920924021, + -0.007752864658040356, + -0.0081538660455098, + -0.008575448594126043, + -0.009018655127824831, + -0.00948458013654224, + -0.009974372231713593, + -0.0104892367103, + -0.01103043822925223, + -0.011599303595510571, + -0.012197224675041158, + -0.012825661425076969, + -0.013486145053199908, + -0.014180281307247156, + -0.014909753901122392, + -0.01567632807830966, + -0.016481854319224266, + -0.01732827219494592, + -0.018217614370887668, + -0.019152010765470153, + -0.020133692864934726, + -0.021164998200294858, + -0.0222483749864801, + -0.023386386928880603, + -0.024581718198654238, + -0.025837178578215082, + -0.027155708779641366, + -0.02854038593658419, + -0.029994429270048573, + -0.031521205927627895, + -0.03312423699681763, + -0.03480720368800998, + -0.0365739536878297, + -0.03842850767592356, + -0.04037506600281672, + -0.04241801552214615, + -0.0445619365677989, + -0.046811610070498624, + -0.049172024800074904, + -0.05164838472039374, + -0.05424611644772545, + -0.056970876782546934, + -0.05982856031381932, + -0.0628253070583278, + -0.06596751010843184, + -0.06926182327717391, + -0.072715168689618, + -0.07633474428801532, + -0.08012803122668502, + -0.08410280107930813, + -0.08826712285461771, + -0.09262936970271016, + -0.09719822532616786, + -0.10198268996714782, + -0.1069920859163535, + -0.1122360624833331, + -0.11772460030735427, + -0.12346801493842527, + -0.12947695957026126, + -0.13576242679970515, + -0.14233574932569895, + -0.14920859940852024, + -0.15639298697599016, + -0.16390125620141352, + -0.17174608040328232, + -0.17994045505017334, + -0.18849768871802927, + -0.19743139176525262, + -0.20675546248724727, + -0.21648407056204777, + -0.22663163746870835, + -0.23721281366963573, + -0.24824245220963972, + -0.2597355784901542, + -0.2717073558542929, + -0.2841730466357169, + -0.2971479684026147, + -0.31064744491446356, + -0.3246867514775481, + -0.33928105429850797, + -0.35444534339894884, + -0.37019435866887007, + -0.3865425086452425, + -0.40350378155102806, + -0.4210916481635206, + -0.4393189560380599, + -0.45819781466040477, + -0.4777394710906819, + -0.49795417562795274, + -0.5188510371139587, + -0.5404378675078558, + -0.5627210152971294, + -0.5857051875252178, + -0.6093932601040487, + -0.6337860762008046, + -0.6588822326582986, + -0.6846778542962663, + -0.711166356252023, + -0.7383381944758267, + -0.7661806047876295, + -0.7946773309043592, + -0.8238083421829777, + -0.853549541858104, + -0.8838724670461549, + -0.9147439816732297, + -0.94612596417954, + -0.9779749918479673, + -1.0102420240917098, + -1.0428720874786461, + -1.0758039654688258, + -1.1089698965223345, + -1.1422952845414158, + -1.1756984261740526, + -1.2090902600184328, + -1.242374143328468, + -1.275445662305395, + -1.3081924828054605, + -1.340494248607462, + -1.3722225351585453, + -1.403240867156424, + -1.4334048087457836, + -1.462562135648616, + -1.490553098805547, + -1.5172107893569176, + -1.5423616148031092, + -1.5658258962250249, + -1.5874185960596738, + -1.606950185345595, + -1.6242276586714934, + -1.6390557038184106, + -1.6512380316576403, + -1.6605788700225648, + -1.6668846230331242, + -1.6699656947386479, + -1.669638472925139, + -1.6657274655962317, + -1.6580675789897508, + -1.6465065221792528, + -1.6309073193934671, + -1.6111509074043835, + -1.5871387918050608, + -1.5587957330117252, + -1.526072430491735, + -1.4889481724443316, + -1.4474334177943176, + -1.4015722782868736, + -1.3514448701088173, + -1.2971695067909712, + -1.2389047069458161, + -1.1768509905421614, + -1.1112524339000185, + -1.042397943680709, + -0.9706221910110489, + -0.8963061145774954, + -0.8198768532644563, + -0.7418069025143414, + -0.6626122050605985, + -0.5828487928491364, + -0.5031075084225912, + -0.4240062798819637, + -0.3461794523771711, + -0.2702638617954956, + -0.19688176819975176, + -0.12662155828959828, + -0.06001837343865551, + 0.0024614645133992025, + 0.06042639207795885, + 0.11354858288749242, + 0.16152939126790436, + 0.2040413767482343, + 0.24066690341824187, + 0.2708998547411499, + 0.294365912763, + 0.311163331586, + 0.321606992189, + 0.32609285699, + 0.325086700971, + 0.319113738818, + 0.308746762839, + 0.294593052708, + 0.277280448537, + 0.257443114611, + 0.235707632712, + 0.212680227717, + 0.188935947606, + 0.165010697277, + 0.141396794073, + 0.118542482137, + 0.0968551043492, + 0.0767068004805, + 0.0584401307576, + 0.0423695408527, + 0.0287728124027, + 0.0178658552027, + 0.00975525555435, + 0.00436970660617, + 0.00139201006807, + 0.000217020223109, + 2.93743721332e-06, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 1, + "j": 2, + "angular_momentum": 1 + }, + { + "radial_function": [ + 0.0, + 2.427446762469133e-16, + 1.9921767671723633e-15, + 6.897965322768608e-15, + 1.677597465729432e-14, + 3.3620140830605266e-14, + 5.961508581124726e-14, + 9.714951200531417e-14, + 1.4883042221434438e-13, + 2.1749821255871403e-13, + 3.062426886073287e-13, + 4.184200576509458e-13, + 5.576709530467573e-13, + 7.279395496735492e-13, + 9.334938326618607e-13, + 1.1789470852216254e-12, + 1.469280664760476e-12, + 1.809868140584913e-12, + 2.2065008700949818e-12, + 2.6654150951287412e-12, + 3.193320644137679e-12, + 3.797431330910373e-12, + 4.485497145036603e-12, + 5.265838335488615e-12, + 6.147381492962374e-12, + 7.139697743179817e-12, + 8.25304317001159e-12, + 9.498401591845133e-12, + 1.0887529823865655e-11, + 1.2433005563798046e-11, + 1.4148278048135589e-11, + 1.604772163233375e-11, + 1.8146692457470793e-11, + 2.046158837497899e-11, + 2.300991230959011e-11, + 2.581033925140043e-11, + 2.888278707669182e-11, + 3.224849141005847e-11, + 3.593008475084262e-11, + 3.995168009727694e-11, + 4.43389593186872e-11, + 4.911926653407386e-11, + 5.432170677440049e-11, + 5.99772502168708e-11, + 6.611884229927347e-11, + 7.278152003282459e-11, + 8.000253485744242e-11, + 8.78214823891382e-11, + 9.628043945674923e-11, + 1.0542410878575674e-10, + 1.1529997179609515e-10, + 1.2595844992674242e-10, + 1.3745307493212153e-10, + 1.498406687094137e-10, + 1.6318153308555335e-10, + 1.7753965016198909e-10, + 1.9298289379192783e-10, + 2.0958325276414144e-10, + 2.2741706634030014e-10, + 2.465652728189398e-10, + 2.67113671841886e-10, + 2.8915320116859865e-10, + 3.127802286919824e-10, + 3.380968605738069e-10, + 3.6521126626272514e-10, + 3.942380214555967e-10, + 4.252984698287099e-10, + 4.585211046325224e-10, + 4.940419711960295e-10, + 5.320050914568893e-10, + 5.725629117407821e-10, + 6.158767750029903e-10, + 6.621174188045967e-10, + 7.114655005665124e-10, + 7.641121513290424e-10, + 8.202595598094183e-10, + 8.801215881491277e-10, + 9.439244211605644e-10, + 1.0119072509083688e-09, + 1.0843229984269096e-09, + 1.161439074643733e-09, + 1.243538182445252e-09, + 1.3309191623788202e-09, + 1.4238978840276147e-09, + 1.5228081856572462e-09, + 1.62800286465252e-09, + 1.7398547215903566e-09, + 1.8587576604644477e-09, + 1.98512784859529e-09, + 2.119404938876297e-09, + 2.2620533579520184e-09, + 2.4135636640075435e-09, + 2.5744539772304205e-09, + 2.7452714878339165e-09, + 2.9265940446046917e-09, + 3.1190318292868427e-09, + 3.3232291206833258e-09, + 3.539866153663273e-09, + 3.769661077680865e-09, + 4.013372020707394e-09, + 4.271799263413925e-09, + 4.545787530433289e-09, + 4.8362284036024976e-09, + 5.144062865230212e-09, + 5.4702839767605665e-09, + 5.8159397012660326e-09, + 6.182135876400164e-09, + 6.57003934661766e-09, + 6.980881262600562e-09, + 7.415960556517766e-09, + 7.876647603560536e-09, + 8.364388078011813e-09, + 8.880707015415774e-09, + 9.427213091467428e-09, + 1.00056031284195e-08, + 1.0617666841978097e-08, + 1.126529184087235e-08, + 1.1950468892605874e-08, + 1.267529746931687e-08, + 1.3441991588506237e-08, + 1.4252885965179373e-08, + 1.5110442489677102e-08, + 1.6017257051198433e-08, + 1.6976066722482884e-08, + 1.798975732751995e-08, + 1.9061371409375408e-08, + 2.019411662231811e-08, + 2.1391374568648458e-08, + 2.2656710104208587e-08, + 2.3993881137248932e-08, + 2.5406848947253957e-08, + 2.689978905010466e-08, + 2.84771026394814e-08, + 3.0143428633526525e-08, + 3.190365636005713e-08, + 3.37629389131635e-08, + 3.572670721713742e-08, + 3.780068483306823e-08, + 3.9990903551164646e-08, + 4.2303719805256607e-08, + 4.4745831957127846e-08, + 4.732429849310825e-08, + 5.004655718356505e-08, + 5.292044525336676e-08, + 5.595422061992344e-08, + 5.915658425007207e-08, + 6.253670370037018e-08, + 6.610423789873001e-08, + 6.986936323308427e-08, + 7.384280101810661e-08, + 7.803584641465673e-08, + 8.246039886089538e-08, + 8.712899413299021e-08, + 9.205483806449479e-08, + 9.725184207640035e-08, + 1.0273466055359054e-07, + 1.0851873020657471e-07, + 1.1462031149977949e-07, + 1.210565322591732e-07, + 1.2784543359798096e-07, + 1.3500601823116254e-07, + 1.4255830134803076e-07, + 1.5052336417677763e-07, + 1.5892341033035635e-07, + 1.6778182516918145e-07, + 1.7712323824439546e-07, + 1.8697358904247927e-07, + 1.9736019619095769e-07, + 2.0831183030700837e-07, + 2.198587906577752e-07, + 2.3203298587931112e-07, + 2.448680189193086e-07, + 2.5839927645054504e-07, + 2.7266402297992314e-07, + 2.8770149990887996e-07, + 3.035530298111408e-07, + 3.202621261511912e-07, + 3.3787460880427566e-07, + 3.5643872564603157e-07, + 3.760052804650439e-07, + 3.9662776769643205e-07, + 4.183625141267841e-07, + 4.4126882809973947e-07, + 4.654091565607869e-07, + 4.908492502831016e-07, + 5.176583378329671e-07, + 5.459093086139815e-07, + 5.756789055568802e-07, + 6.070479278880985e-07, + 6.401014445434279e-07, + 6.749290187659989e-07, + 7.116249445402548e-07, + 7.502884953081515e-07, + 7.910241858710345e-07, + 8.339420479111938e-07, + 8.79157919980117e-07, + 9.267937527731798e-07, + 9.769779302752117e-07, + 1.0298456077934425e-06, + 1.085539067785186e-06, + 1.144208094195642e-06, + 1.206010366482706e-06, + 1.2711118742854207e-06, + 1.3396873537989005e-06, + 1.4119207470012953e-06, + 1.48800568500544e-06, + 1.5681459965753703e-06, + 1.6525562434021232e-06, + 1.7414622834194698e-06, + 1.835101863476371e-06, + 1.9337252431967607e-06, + 2.037595851408608e-06, + 2.1469909769259707e-06, + 2.2622024955819307e-06, + 2.3835376351580737e-06, + 2.511319780544815e-06, + 2.6458893208462462e-06, + 2.7876045408972728e-06, + 2.9368425595029066e-06, + 3.0940003165628418e-06, + 3.259495612052666e-06, + 3.4337681991602294e-06, + 3.617280934828305e-06, + 3.8105209902004282e-06, + 4.014001124600471e-06, + 4.228261025985447e-06, + 4.4538687216082274e-06, + 4.691422062297017e-06, + 4.941550284411889e-06, + 5.204915653617719e-06, + 5.4822151941923185e-06, + 5.774182509124631e-06, + 6.081589695074076e-06, + 6.405249357505729e-06, + 6.746016731329611e-06, + 7.104791911802161e-06, + 7.482522202696228e-06, + 7.880204586619394e-06, + 8.298888324544656e-06, + 8.739677691211947e-06, + 9.203734853491508e-06, + 9.692282898662642e-06, + 1.0206609021377317e-05, + 1.0748067876654012e-05, + 1.1318085108274531e-05, + 1.191816106100391e-05, + 1.2549874687055241e-05, + 1.3214887656166674e-05, + 1.3914948680536193e-05, + 1.4651898064967277e-05, + 1.5427672495139535e-05, + 1.6244310075332695e-05, + 1.7103955628983747e-05, + 1.8008866276504985e-05, + 1.896141730271915e-05, + 1.9964108332152098e-05, + 2.1019569824775804e-05, + 2.2130569911837263e-05, + 2.3300021587389032e-05, + 2.4530990274992196e-05, + 2.582670178944403e-05, + 2.7190550713030617e-05, + 2.862610920853128e-05, + 3.0137136291919302e-05, + 3.1727587587826177e-05, + 3.3401625594013476e-05, + 3.516363048060338e-05, + 3.70182114511145e-05, + 3.8970218696422565e-05, + 4.1024755970861884e-05, + 4.318719382385173e-05, + 4.546318351910439e-05, + 4.785867168101975e-05, + 5.0379915700718695e-05, + 5.3033499946449926e-05, + 5.58263528171139e-05, + 5.8765764681153044e-05, + 6.185940675283931e-05, + 6.511535094629877e-05, + 6.854209076552985e-05, + 7.214856327891878e-05, + 7.594417223620203e-05, + 7.993881239085688e-05, + 8.414289507981297e-05, + 8.856737514131502e-05, + 9.322377922279302e-05, + 9.812423556514284e-05, + 0.00010328150532998194, + 0.00010870901556565568, + 0.00011442089385522822, + 0.00012043200480581353, + 0.00012675798839232187, + 0.00013341530031114732, + 0.00014042125442489064, + 0.00014779406740538745, + 0.00015555290569128108, + 0.00016371793487193043, + 0.00017231037165552624, + 0.00018135253849993252, + 0.0001908679210782354, + 0.0002008812287471187, + 0.00021141845809878894, + 0.00022250695984542133, + 0.0002341755091362128, + 0.00024645437951648894, + 0.00025937542070681254, + 0.00027297214041805724, + 0.0002872797903532576, + 0.0003023354567084989, + 0.00031817815527636464, + 0.0003348489315283943, + 0.00035239096576656644, + 0.00037084968380737414, + 0.00039027287326554635, + 0.00041071080587265946, + 0.0004322163661051045, + 0.0004548451864083069, + 0.00047865578935567374, + 0.0005037097371456111, + 0.0005300717887668506, + 0.0005578100652185574, + 0.0005869962232337475, + 0.0006177056378608645, + 0.0006500175944432968, + 0.0006840154904127094, + 0.0007197870474172602, + 0.0007574245342453419, + 0.0007970250012262318, + 0.0008386905265256976, + 0.0008825284749865784, + 0.0009286517702917809, + 0.000977179180801128, + 0.0010282356200718773, + 0.0010819524626021284, + 0.0011384678756107696, + 0.0011979271676369901, + 0.00126048315484835, + 0.0013262965458525585, + 0.0013955363459338705, + 0.001468380281871776, + 0.0015450152479253745, + 0.001625637774599141, + 0.0017104545206800942, + 0.0017996827903116839, + 0.0018935510757829438, + 0.001992299627624907, + 0.002096181053278708, + 0.0022054609455159006, + 0.0023204185424229528, + 0.002441347420063558, + 0.0025685562196915805, + 0.0027023694110680486, + 0.0028431280934296276, + 0.0029911908363215284, + 0.003146934561597304, + 0.0033107554692227317, + 0.003483070008136827, + 0.0036643158950916714, + 0.003854953183114103, + 0.004055465382029323, + 0.004266360633785638, + 0.004488172944443209, + 0.004721463476091051, + 0.00496682190100372, + 0.0052248678208543274, + 0.005496252254180808, + 0.005781659194742273, + 0.006081807244217606, + 0.006397451322525097, + 0.00672938445881174, + 0.007078439666908048, + 0.007445491908926532, + 0.007831460150142123, + 0.008237309510140482, + 0.008664053512829195, + 0.009112756440612355, + 0.009584535796405705, + 0.010080564877579483, + 0.010602075466966074, + 0.011150360644856378, + 0.011726777727339365, + 0.012332751335075418, + 0.012969776597499141, + 0.013639422498619307, + 0.014343335367047442, + 0.015083242518426021, + 0.015860956052686226, + 0.016678376813121457, + 0.017537498511937255, + 0.01844041202786631, + 0.019389309880639628, + 0.02038649088756651, + 0.02143436500901322, + 0.022535458384811257, + 0.02369241856981033, + 0.024908019971585184, + 0.026185169494700823, + 0.02752691239805987, + 0.028936438366140734, + 0.03041708780185641, + 0.03197235834015381, + 0.03360591158879635, + 0.03532158009716627, + 0.03712337455391529, + 0.03901549121608885, + 0.04100231956914967, + 0.043088450216913196, + 0.04527868299915403, + 0.04757803533601242, + 0.04999175079098403, + 0.052525307851385816, + 0.05518442891420578, + 0.05797508947153209, + 0.06090352748340422, + 0.0639762529217487, + 0.06720005747461308, + 0.07058202438778295, + 0.07412953842170153, + 0.07785029590680537, + 0.08175231485035854, + 0.08584394508919592, + 0.09013387843027253, + 0.09463115873603313, + 0.0993451919336129, + 0.1042857558691615, + 0.10946300995504211, + 0.1148875045691244, + 0.12057019008891018, + 0.12652242554763768, + 0.13275598673641395, + 0.13928307376465818, + 0.14611631788619578, + 0.15326878750478956, + 0.1607539932631115, + 0.16858589203271698, + 0.1767788896939712, + 0.18534784252617556, + 0.19430805701730858, + 0.2036752879573422, + 0.21346573454690393, + 0.22369603434675725, + 0.23438325480488065, + 0.24554488213359513, + 0.25719880721410904, + 0.2693633082964058, + 0.2820570301459168, + 0.29529895928312805, + 0.309108395033436, + 0.32350491592019276, + 0.33850834108994654, + 0.35413868626308, + 0.3704161138539709, + 0.38736087673185576, + 0.40499325511988454, + 0.4233334862425488, + 0.44240168603170443, + 0.46221776244262336, + 0.4828013198121112, + 0.5041715536437208, + 0.5263471352307546, + 0.5493460855453508, + 0.5731856377564354, + 0.5978820877940888, + 0.6234506323261204, + 0.6499051935887545, + 0.6772582305095606, + 0.7055205355257788, + 0.7347010166406334, + 0.7648064642939912, + 0.7958413025481612, + 0.8278073244096018, + 0.8607034109715026, + 0.8945252342548877, + 0.9292649438874814, + 0.9649108376318508, + 1.001447016236479, + 1.0388530230561313, + 1.0771034693257484, + 1.1161676460129295, + 1.1560091236769465, + 1.1965853418506405, + 1.2378471901814123, + 1.2797385834567758, + 1.3221960336373138, + 1.365148222059843, + 1.408515575686062, + 1.452209851918607, + 1.4961337368233707, + 1.5401804625597226, + 1.5842334502737143, + 1.6281659855022423, + 1.6718409338518514, + 1.7151105054860394, + 1.7578160776149772, + 1.7997880851665375, + 1.8408459902248704, + 1.8807983418118073, + 1.9194429381158062, + 1.9565671037586438, + 1.9919480953004918, + 2.025353648401023, + 2.056542680229597, + 2.085266160558298, + 2.11126816479579, + 2.134287121470967, + 2.1540572656469292, + 2.1703103085088884, + 2.1827773314064074, + 2.1911909103601555, + 2.1952874741909403, + 2.1948098960162614, + 2.1895103138876584, + 2.179153171787317, + 2.1635184671230943, + 2.142405185264068, + 2.1156348957318287, + 2.083055478331772, + 2.04454494122125, + 2.000015286581588, + 1.9494163736612398, + 1.8927397234822005, + 1.8300222050851507, + 1.7613495394979584, + 1.686859555426857, + 1.6067451292331696, + 1.5212567415724958, + 1.4307045829336191, + 1.335460139633939, + 1.235957189028628, + 1.1326921255891018, + 1.0262235261656119, + 0.9171708397961118, + 0.8062120531340023, + 0.6940801353318763, + 0.5815580073819145, + 0.4694717170162493, + 0.3586814452032514, + 0.25006994937567106, + 0.14452810405418887, + 0.0429373917950053, + -0.05385039324711903, + -0.14503524893903624, + -0.229890795040668, + -0.30778226802627817, + -0.37817547356865877, + -0.44063034798787076, + -0.49477372938934017, + -0.5402522878309732, + -0.5766847400074246, + -0.6036743900447012, + -0.621021961548, + -0.629033764687, + -0.628259038639, + -0.61935507292, + -0.60307118532, + -0.580233124743, + -0.551725667205, + -0.5184738722, + -0.481423621756, + -0.441522209184, + -0.39969988697, + -0.356853335895, + -0.313832037366, + -0.271428290355, + -0.230371313506, + -0.191325067291, + -0.154888623603, + -0.121596444737, + -0.0919149398887, + -0.0662305486847, + -0.0448258722017, + -0.0278444859598, + -0.0152577632535, + -0.00686168316857, + -0.00219400012838, + -0.000343219972835, + -4.55710176407e-06, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 1, + "j": 3, + "angular_momentum": 1 + }, + { + "radial_function": [ + -0.0, + -8.192328048953439e-22, + -1.3561619153580603e-20, + -7.103990822480274e-20, + -2.3234039920615464e-19, + -5.870481906001769e-19, + -1.2599383078024337e-18, + -2.4161758953685834e-18, + -4.267072297297451e-18, + -7.076447773163087e-18, + -1.1167655836650331e-17, + -1.693132877140705e-17, + -2.483390881216954e-17, + -3.542703480008648e-17, + -4.9357859849438457e-17, + -6.738038176037961e-17, + -9.036787456497398e-17, + -1.193265167996351e-16, + -1.554103198116672e-16, + -1.9993746779211417e-16, + -2.5440819018388496e-16, + -3.2052429682764926e-16, + -4.002105165892113e-16, + -4.956377915485653e-16, + -6.092486907948487e-16, + -7.437851209663244e-16, + -9.023185247786432e-16, + -1.0882827736236713e-15, + -1.3055099768852717e-15, + -1.5582694477826434e-15, + -1.8513100846334026e-15, + -2.1899064464381774e-15, + -2.5799088235385014e-15, + -3.0277976275651296e-15, + -3.5407424499346172e-15, + -4.126666165405831e-15, + -4.794314486004259e-15, + -5.553331402325296e-15, + -6.414340982707817e-15, + -7.389036036536073e-15, + -8.490274187784443e-15, + -9.732181945460973e-15, + -1.113026740366591e-14, + -1.2701542251296694e-14, + -1.446465382437718e-14, + -1.6440027988044676e-14, + -1.8650023697347913e-14, + -2.1119100146643033e-14, + -2.3873997495177914e-14, + -2.694393221191013e-14, + -3.036080818993632e-14, + -3.415944484273816e-14, + -3.8377823487248196e-14, + -4.305735344985088e-14, + -4.824315938169138e-14, + -5.398439143327974e-14, + -6.033456004341615e-14, + -6.735189721544438e-14, + -7.509974630980028e-14, + -8.364698253038526e-14, + -9.306846644801943e-14, + -1.0344553306595663e-13, + -1.148665191216504e-13, + -1.2742733155001982e-13, + -1.412320601720533e-13, + -1.563936380254052e-13, + -1.7303455286325643e-13, + -1.9128761371884765e-13, + -2.1129677666873768e-13, + -2.332180342389225e-13, + -2.572203732533538e-13, + -2.8348680623562467e-13, + -3.1221548184364696e-13, + -3.4362088034624667e-13, + -3.779351003476172e-13, + -4.1540924373211097e-13, + -4.563149060001634e-13, + -5.009457799083047e-13, + -5.496193808674823e-13, + -6.026789030801597e-13, + -6.604952161733769e-13, + -7.234690126190879e-13, + -7.920331173252593e-13, + -8.666549711702435e-13, + -9.47839301450458e-13, + -1.0361309929915367e-12, + -1.1321181748346656e-12, + -1.2364355380863343e-12, + -1.3497679024071873e-12, + -1.4728540489693007e-12, + -1.6064908396928195e-12, + -1.7515376439454702e-12, + -1.9089210946468733e-12, + -2.0796401988947994e-12, + -2.2647718279514153e-12, + -2.4654766153563627e-12, + -2.6830052923329304e-12, + -2.9187054928662425e-12, + -3.1740290622780274e-12, + -3.4505399066998547e-12, + -3.749922422039996e-12, + -4.073990545768284e-12, + -4.424697475346349e-12, + -4.80414610365004e-12, + -5.214600221702924e-12, + -5.6584965459897785e-12, + -6.138457628998313e-12, + -6.6573057181384124e-12, + -7.2180776311950275e-12, + -7.824040721653793e-12, + -8.478710014413421e-12, + -9.185866594406438e-12, + -9.949577340538372e-12, + -1.0774216101878433e-11, + -1.1664486419337366e-11, + -1.2625445905870815e-11, + -1.3662532404177961e-11, + -1.4781592050396613e-11, + -1.5988909381042308e-11, + -1.729123963040367e-11, + -1.8695843377897465e-11, + -2.0210523710932286e-11, + -2.1843666089190215e-11, + -2.3604281099860585e-11, + -2.5502050316770793e-11, + -2.7547375480865853e-11, + -2.975143124638208e-11, + -3.212622174519444e-11, + -3.46846412444323e-11, + -3.744053919105169e-11, + -4.0408789959331386e-11, + -4.3605367636456997e-11, + -4.704742620967326e-11, + -5.075338553920643e-11, + -5.474302353442062e-11, + -5.903757497569774e-11, + -6.365983745909199e-11, + -6.863428496892556e-11, + -7.398718963330612e-11, + -7.97467522360439e-11, + -8.59432421214174e-11, + -9.260914715480764e-11, + -9.977933446415224e-11, + -1.0749122272547156e-10, + -1.1578496682564527e-10, + -1.2470365577270673e-10, + -1.3429352481434874e-10, + -1.4460418276646426e-10, + -1.5568885563712568e-10, + -1.6760464771432743e-10, + -1.8041282136941162e-10, + -1.9417909685621917e-10, + -2.0897397364849253e-10, + -2.2487307467376903e-10, + -2.419575152775756e-10, + -2.6031429848936025e-10, + -2.800367385961304e-10, + -3.0122491496277645e-10, + -3.2398615826259536e-10, + -3.4843557150960007e-10, + -3.7469658818614043e-10, + -4.0290157025599083e-10, + -4.3319244890062996e-10, + -4.657214108169502e-10, + -5.006516336522132e-10, + -5.381580737043675e-10, + -5.784283098234501e-10, + -6.216634474535751e-10, + -6.68079087085567e-10, + -7.179063615945162e-10, + -7.713930475479061e-10, + -8.288047555283417e-10, + -8.904262051809923e-10, + -9.565625909503385e-10, + -1.0275410449780954e-09, + -1.103712204081915e-09, + -1.1854518879487563e-09, + -1.2731628967817737e-09, + -1.3672769366980225e-09, + -1.4682566815882235e-09, + -1.5765979819501013e-09, + -1.6928322300417348e-09, + -1.8175288932623177e-09, + -1.9512982273975453e-09, + -2.094794182070199e-09, + -2.248717512710525e-09, + -2.4138191129985105e-09, + -2.5909035838893615e-09, + -2.780833055539702e-09, + -2.9845312802375763e-09, + -3.202988015386568e-09, + -3.4372637174670185e-09, + -3.688494567856266e-09, + -3.957897855617916e-09, + -4.246777740845082e-09, + -4.556531426292437e-09, + -4.888655766595261e-09, + -5.244754344504439e-09, + -5.626545048378016e-09, + -6.035868186543514e-09, + -6.4746951748738484e-09, + -6.94513783953969e-09, + -7.449458377849244e-09, + -7.990080023489972e-09, + -8.569598465953823e-09, + -9.190794077998223e-09, + -9.856645006362319e-09, + -1.0570341188885585e-08, + -1.1335299362463832e-08, + -1.2155179130424233e-08, + -1.30339001665685e-08, + -1.3975660633916599e-08, + -1.498495690447382e-08, + -1.6066604672709418e-08, + -1.72257615586939e-08, + -1.8467951309216625e-08, + -1.9799089705839787e-08, + -2.122551230279662e-08, + -2.275400412366296e-08, + -2.4391831451986743e-08, + -2.614677586765617e-08, + -2.8027170682991836e-08, + -3.0041939952069886e-08, + -3.220064022913972e-08, + -3.451350527519869e-08, + -3.6991493916203714e-08, + -3.964634127782904e-08, + -4.249061363153617e-08, + -4.553776710870261e-08, + -4.8802210556267127e-08, + -5.229937281861662e-08, + -5.604577476698135e-08, + -6.005910640221629e-08, + -6.435830939252897e-08, + -6.896366543011315e-08, + -7.38968908060488e-08, + -7.918123765787526e-08, + -8.484160234251643e-08, + -9.09046414451311e-08, + -9.739889596002276e-08, + -1.0435492421857778e-07, + -1.118054441718085e-07, + -1.1978548569957997e-07, + -1.2833255363763463e-07, + -1.3748680228696554e-07, + -1.4729122220141856e-07, + -1.5779184013008413e-07, + -1.6903793302702353e-07, + -1.810822571275548e-07, + -1.9398129313569867e-07, + -2.077955086752573e-07, + -2.2258963919916945e-07, + -2.3843298866049584e-07, + -2.5539975134733896e-07, + -2.735693563298219e-07, + -2.9302683616666277e-07, + -3.138632215105023e-07, + -3.3617596348744285e-07, + -3.6006938576102243e-07, + -3.856551683835824e-07, + -4.130528656743923e-07, + -4.423904604917995e-07, + -4.738049574678043e-07, + -5.074430179454411e-07, + -5.434616395277073e-07, + -5.820288833944052e-07, + -6.233246527238124e-07, + -6.675415257870334e-07, + -7.148856475960616e-07, + -7.655776841765428e-07, + -8.198538438840069e-07, + -8.779669704163169e-07, + -9.401877126490971e-07, + -1.006805776546785e-06, + -1.078131265040502e-06, + -1.1544961119642391e-06, + -1.2362556165997991e-06, + -1.3237900860510608e-06, + -1.4175065927766265e-06, + -1.5178408555619854e-06, + -1.6252592524344973e-06, + -1.7402609748131887e-06, + -1.863380332904688e-06, + -1.9951892226175756e-06, + -2.136299765790702e-06, + -2.2873671353309377e-06, + -2.449092578660092e-06, + -2.622226653041086e-06, + -2.8075726881506597e-06, + -3.005990490391325e-06, + -3.2184003083339646e-06, + -3.4457870747409196e-06, + -3.689204946577468e-06, + -3.949782163078552e-06, + -4.228726244080064e-06, + -4.527329552504477e-06, + -4.846975246158456e-06, + -5.189143647339033e-06, + -5.5554190573158e-06, + -5.947497048098176e-06, + -6.367192265786399e-06, + -6.816446778180654e-06, + -7.297339008403173e-06, + -7.812093292467763e-06, + -8.363090105721581e-06, + -8.95287700444051e-06, + -9.58418033338595e-06, + -1.0259917750148346e-05, + -1.098321162777034e-05, + -1.175740339090172e-05, + -1.258606885726305e-05, + -1.3473034646424335e-05, + -1.4422395740364768e-05, + -1.543853426522266e-05, + -1.652613958671091e-05, + -1.7690229809033394e-05, + -1.8936174773081966e-05, + -2.02697206581983e-05, + -2.169701630176368e-05, + -2.3224641353669175e-05, + -2.48596363928848e-05, + -2.6609535144696106e-05, + -2.8482398939890938e-05, + -3.048685357684556e-05, + -3.263212874962999e-05, + -3.4928100221535737e-05, + -3.7385334930297766e-05, + -4.0015139236891055e-05, + -4.28296105252008e-05, + -4.5841692387506884e-05, + -4.906523365398947e-05, + -5.25150515101386e-05, + -5.6206999006799414e-05, + -6.0158037252637e-05, + -6.438631261572018e-05, + -6.891123927834989e-05, + -7.37535875179446e-05, + -7.893557810186827e-05, + -8.448098321684093e-05, + -9.041523439807257e-05, + -9.676553790419377e-05, + -0.00010356099809558733, + -0.00011083274931323411, + -0.00011861409689276844, + -0.00012694066789306337, + -0.0001358505722324953, + -0.00014538457493913642, + -0.00015558628025468427, + -0.0001665023284347557, + -0.00017818260607276403, + -0.00019068047089577318, + -0.00020405299200686769, + -0.00021836120660481868, + -0.0002336703943406905, + -0.00025005037044626663, + -0.00026757579897534973, + -0.00028632652743182976, + -0.0003063879443129087, + -0.00032785136104751045, + -0.0003508144199838294, + -0.00037538153021338393, + -0.00040166433302212396, + -0.0004297821990283944, + -0.0004598627590765865, + -0.0004920424711359593, + -0.0005264672256341435, + -0.0005632929917263899, + -0.000602686507251189, + -0.0006448260152626881, + -0.0006899020501669201, + -0.0007381182767649238, + -0.0007896923856837102, + -0.0008448570488001529, + -0.0009038609387349825, + -0.0009669698163854739, + -0.0010344676910876425, + -0.001106658058026141, + -0.0011838652178322358, + -0.0012664356837569482, + -0.0013547396819252235, + -0.0014491727507180455, + -0.0015501574454689865, + -0.0016581451551570623, + -0.0017736180383599405, + -0.0018970910855314964, + -0.0020291143160257705, + -0.0021702751177534885, + -0.002321200738603851, + -0.0024825609388568095, + -0.0026550708144903027, + -0.0028394938016802983, + -0.003036644873439825, + -0.003247393940251571, + -0.0034726694662366923, + -0.003713462314270205, + -0.00397082983311727, + -0.0042459002006320305, + -0.004539877038267406, + -0.0048540443117009256, + -0.0051897715346726275, + -0.005548519292089692, + -0.005931845100922875, + -0.006341409627081965, + -0.006778983277336965, + -0.007246453186724956, + -0.007745830622107504, + -0.00827925882341662, + -0.00884902130481495, + -0.009457550639386296, + -0.01010743775010879, + -0.010801441732743333, + -0.011542500234419066, + -0.01233374041437455, + -0.013178490512638901, + -0.014080292052186026, + -0.015042912702635162, + -0.016070359831004147, + -0.017166894765985714, + -0.018337047804642577, + -0.019585633981782497, + -0.020917769635621888, + -0.022338889787450123, + -0.023854766357472666, + -0.025471527246615392, + -0.027195676294828185, + -0.029034114134233954, + -0.030994159959199134, + -0.03308357420718112, + -0.0353105821798272, + -0.03768389857268193, + -0.04021275294832321, + -0.042906916109028824, + -0.04577672735979245, + -0.04883312264564837, + -0.05208766350756846, + -0.055552566822966276, + -0.059240735262157194, + -0.06316578837810842, + -0.06734209426097114, + -0.07178480162098193, + -0.07650987219074551, + -0.08153411328493695, + -0.08687521035536486, + -0.09255175931689068, + -0.0985832984419088, + -0.10499033954398161, + -0.11179439814148762, + -0.11901802230093485, + -0.1266848197357857, + -0.13481948278198835, + -0.14344781073254478, + -0.15259672905226196, + -0.16229430485717866, + -0.17256975800583346, + -0.18345346716377717, + -0.19497696997393096, + -0.20717295654067183, + -0.22007525530344071, + -0.23371881027536906, + -0.2481396485613975, + -0.26337483700287706, + -0.2794624266697159, + -0.29644138386724966, + -0.31435150619752694, + -0.33323332216854185, + -0.35312797274402385, + -0.37407707309642496, + -0.3961225528183259, + -0.4193064727692007, + -0.4436708165675313, + -0.4692572548729376, + -0.4961068803977025, + -0.5242599116300682, + -0.5537553633705454, + -0.5846306819888474, + -0.616921343609191, + -0.6506604133429845, + -0.6858780640103078, + -0.7226010527894547, + -0.7608521546631113, + -0.8006495516092027, + -0.8420061771862246, + -0.8849290161029184, + -0.9294183594069755, + -0.9754670160834598, + -1.023059482701421, + -1.0721710736002075, + -1.122767014639916, + -1.1748015048185145, + -1.2282167508390263, + -1.282941980908646, + -1.3388924452233257, + -1.3959684118848938, + -1.4540541682056607, + -1.5130170390557847, + -1.572706434927478, + -1.6329529442575539, + -1.693567485934605, + -1.7543405393382108, + -1.8150414710528184, + -1.8754179788474286, + -1.9351956751843777, + -1.9940778340163263, + -2.0517453266336494, + -2.1078567739745493, + -2.162048944663611, + -2.2139374305634436, + -2.263117633824743, + -2.3091661023364414, + -2.3516422536940134, + -2.390090531405463, + -2.4240430411107012, + -2.453022718780505, + -2.4765470871388726, + -2.4941326602694684, + -2.5053000587972503, + -2.5095798983103164, + -2.506519509909201, + -2.495690542371266, + -2.476697477602745, + -2.4491870618879608, + -2.4128586115467616, + -2.3674750892401857, + -2.3128747632045323, + -2.2489831534750935, + -2.1758248367608877, + -2.0935345279073663, + -2.0023666897076167, + -1.9027027606081353, + -1.795054958259668, + -1.680065556132997, + -1.5585005941680186, + -1.4312372416162782, + -1.299244558339613, + -1.1635582755955167, + -1.0252514907858865, + -0.8854048323331729, + -0.7450815698030128, + -0.6053149888563184, + -0.46711648200878314, + -0.33151217335657734, + -0.19961196661303385, + -0.07270574225928514, + 0.04763488468568311, + 0.15949502239231997, + 0.26066988139529396, + 0.34892903611778286, + 0.42256891881648073, + 0.4812010520441849, + 0.5263370625421611, + 0.560461863913, + 0.58452388102, + 0.598861888867, + 0.603933545649, + 0.600319171529, + 0.588708300151, + 0.569881526975, + 0.544688028377, + 0.514019791509, + 0.478784436103, + 0.439879448628, + 0.39817170063, + 0.354486819167, + 0.309613292556, + 0.264325134225, + 0.219424305738, + 0.175798449862, + 0.134480748634, + 0.0966859828511, + 0.0637823351391, + 0.0371462998375, + 0.0178509751559, + 0.00618012584199, + 0.00108955868994, + 2.05759469655e-05, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 1, + "j": 4, + "angular_momentum": 2 + }, + { + "radial_function": [ + -0.0, + -8.091657516150684e-22, + -1.339496867062424e-20, + -7.016694203387068e-20, + -2.2948530946327475e-19, + -5.798343127148478e-19, + -1.2444556928450224e-18, + -2.386484980479686e-18, + -4.214636843129508e-18, + -6.989489613775258e-18, + -1.1030423311581244e-17, + -1.672326997781591e-17, + -2.4528740022482696e-17, + -3.499169353274705e-17, + -4.8751331152125865e-17, + -6.655238526067856e-17, + -8.925739875733492e-17, + -1.178601858627824e-16, + -1.5350057698112553e-16, + -1.9748055794000593e-16, + -2.512819227755692e-16, + -3.16585568822827e-16, + -3.9529257312560815e-16, + -4.895472003774797e-16, + -6.017620044220156e-16, + -7.346451982747864e-16, + -8.912304815602511e-16, + -1.0749095289134126e-15, + -1.2894673592566586e-15, + -1.5391208228155088e-15, + -1.828560461584075e-15, + -2.1629960187147564e-15, + -2.5482058938881936e-15, + -2.9905908648965012e-15, + -3.49723242040579e-15, + -4.075956075782935e-15, + -4.735400072313865e-15, + -5.485089891454375e-15, + -6.335519048823206e-15, + -7.298236667974312e-15, + -8.385942373351967e-15, + -9.612589081875607e-15, + -1.0993494318095513e-14, + -1.2545460724594301e-14, + -1.428690649160491e-14, + -1.623800648320721e-14, + -1.8420844898821667e-14, + -2.085958036860732e-14, + -2.3580624458218437e-14, + -2.6612834613147797e-14, + -2.9987722678898125e-14, + -3.373968019429068e-14, + -3.7906221746878e-14, + -4.2528247808928305e-14, + -4.7650328522089435e-14, + -5.3321010060443597e-14, + -5.959314530541271e-14, + -6.65242506825047e-14, + -7.417689116393523e-14, + -8.26190955878962e-14, + -9.192480460893078e-14, + -1.0217435375361479e-13, + -1.1345499424262681e-13, + -1.2586145446850846e-13, + -1.394965451553035e-13, + -1.5447181157474556e-13, + -1.7090823630193313e-13, + -1.8893699636000717e-13, + -2.0870027883609605e-13, + -2.3035215935805043e-13, + -2.540595481725297e-13, + -2.8000320887240316e-13, + -3.08378855185953e-13, + -3.393983317629634e-13, + -3.732908850873767e-13, + -4.103045314033144e-13, + -4.5070752873713965e-13, + -4.94789960831279e-13, + -5.428654413401368e-13, + -5.952729471582113e-13, + -6.523787905177002e-13, + -7.145787400204399e-13, + -7.823003018477864e-13, + -8.560051727762763e-13, + -9.36191877809724e-13, + -1.023398606008951e-12, + -1.1182062592476137e-12, + -1.2212417292908112e-12, + -1.3331814204574076e-12, + -1.4547550354762912e-12, + -1.5867496441040703e-12, + -1.730014055427402e-12, + -1.885463515522238e-12, + -2.0540847552785e-12, + -2.236941412922984e-12, + -2.435179859653854e-12, + -2.6500354571945654e-12, + -2.8828392792482585e-12, + -3.135025330261525e-12, + -3.4081382984398367e-12, + -3.703841881135495e-12, + -4.023927725400101e-12, + -4.370325026990334e-12, + -4.745110837555173e-12, + -5.150521129705103e-12, + -5.588962676528467e-12, + -6.063025803482498e-12, + -6.57549807700773e-12, + -7.129378997184389e-12, + -7.72789576686859e-12, + -8.37452021683299e-12, + -9.072986968419412e-12, + -9.827312924977925e-12, + -1.0641818187834266e-11, + -1.1521148498752681e-11, + -1.2470299320543392e-11, + -1.3494641673322525e-11, + -1.4599949853346545e-11, + -1.5792431169982177e-11, + -1.7078757846215024e-11, + -1.8466101240240253e-11, + -1.9962168551649826e-11, + -2.1575242195841173e-11, + -2.331422203385221e-11, + -2.5188670667950823e-11, + -2.7208862017758386e-11, + -2.938583341824994e-11, + -3.173144148900794e-11, + -3.4258422046443703e-11, + -3.6980454349065696e-11, + -3.9912229987878956e-11, + -4.306952675296119e-11, + -4.6469287835229084e-11, + -5.012970674287502e-11, + -5.407031834480827e-11, + -5.83120964781524e-11, + -6.287755859098745e-11, + -6.779087791929562e-11, + -7.307800374627105e-11, + -7.876679031042378e-11, + -8.488713499110606e-11, + -9.147112642633249e-11, + -9.855320327893699e-11, + -1.0617032440493882e-10, + -1.1436215124705734e-10, + -1.2317124331294742e-10, + -1.326432676870442e-10, + -1.428272235655281e-10, + -1.537756828864759e-10, + -1.65545048209164e-10, + -1.7819582907905947e-10, + -1.9179293814281004e-10, + -2.0640600853680244e-10, + -2.2210973389083714e-10, + -2.38984232758193e-10, + -2.571154390242058e-10, + -2.765955202746787e-10, + -2.975233260392742e-10, + -3.2000486804681276e-10, + -3.441538348546743e-10, + -3.700921431176407e-10, + -3.97950528252045e-10, + -4.27869177298078e-10, + -4.5999840678360876e-10, + -4.9449938912139e-10, + -5.315449306293222e-10, + -5.713203050611221e-10, + -6.140241465384948e-10, + -6.598694061023759e-10, + -7.090843763025414e-10, + -7.619137888487261e-10, + -8.186199903052949e-10, + -8.794842014693946e-10, + -9.448078663238756e-10, + -1.0149140969573127e-09, + -1.090149221285685e-09, + -1.170884440621917e-09, + -1.25751760523089e-09, + -1.350475116065224e-09, + -1.4502139612860156e-09, + -1.5572238979508558e-09, + -1.672029788100684e-09, + -1.7951941010065255e-09, + -1.9273195930702963e-09, + -2.069052177568576e-09, + -2.2210839983779828e-09, + -2.3841567214627904e-09, + -2.5590650600380386e-09, + -2.7466605495251105e-09, + -2.9478555901803206e-09, + -3.1636277762126942e-09, + -3.395024532056722e-09, + -3.6431680764253254e-09, + -3.909260738944418e-09, + -4.194590652664064e-09, + -4.500537849840169e-09, + -4.828580789924722e-09, + -5.180303348831813e-09, + -5.557402303299094e-09, + -5.96169534552111e-09, + -6.395129663950556e-09, + -6.85979113171447e-09, + -7.357914145028776e-09, + -7.89189215735639e-09, + -8.464288958478397e-09, + -9.077850751668519e-09, + -9.735519083511525e-09, + -1.0440444688736267e-08, + -1.119600231370627e-08, + -1.200580658630623e-08, + -1.287372900852382e-08, + -1.3803916148799754e-08, + -1.4800809119407578e-08, + -1.586916443041163e-08, + -1.7014076314970707e-08, + -1.8241000632976913e-08, + -1.955578046064616e-08, + -2.096467348745669e-08, + -2.2474381347779425e-08, + -2.4092081020722166e-08, + -2.5825458448101924e-08, + -2.7682744522637e-08, + -2.967275361773187e-08, + -3.180492483255577e-08, + -3.40893661490289e-08, + -3.653690170169365e-08, + -3.915912238261365e-08, + -4.196844001317909e-08, + -4.4978145336406855e-08, + -4.820247009982913e-08, + -5.16566535101933e-08, + -5.53570133772877e-08, + -5.9321022268761654e-08, + -6.356738903305216e-08, + -6.811614606965252e-08, + -7.298874274116984e-08, + -7.820814537598652e-08, + -8.37989443086352e-08, + -8.97874684621765e-08, + -9.6201908002117e-08, + -1.0307244562975952e-07, + -1.1043139711508511e-07, + -1.1831336173297311e-07, + -1.267553832853669e-07, + -1.35797122464525e-07, + -1.4548104134343983e-07, + -1.5585260085919403e-07, + -1.6696047219056375e-07, + -1.788567630167912e-07, + -1.9159725968926436e-07, + -2.0524168645438387e-07, + -2.1985398290754998e-07, + -2.3550260096556898e-07, + -2.522608227425132e-07, + -2.7020710075931813e-07, + -2.8942542211436086e-07, + -3.1000569823397805e-07, + -3.320441820552773e-07, + -3.556439145279242e-07, + -3.8091520251194863e-07, + -4.079761302833347e-07, + -4.369531069854795e-07, + -4.679814525632623e-07, + -5.012060248863184e-07, + -5.36781890934391e-07, + -5.748750451622072e-07, + -6.156631783396353e-07, + -6.593365003909663e-07, + -7.060986210664745e-07, + -7.561674924670177e-07, + -8.097764177859141e-07, + -8.671751308634265e-07, + -9.286309516173323e-07, + -9.944300225373738e-07, + -1.0648786320620485e-06, + -1.1403046308540053e-06, + -1.2210589474435754e-06, + -1.3075172103718116e-06, + -1.4000814840715306e-06, + -1.4991821266651476e-06, + -1.6052797780775052e-06, + -1.7188674876407994e-06, + -1.8404729910791412e-06, + -1.9706611470179463e-06, + -2.110036544667824e-06, + -2.259246294134873e-06, + -2.4189830125913317e-06, + -2.5899880197086168e-06, + -2.7730547575297703e-06, + -2.9690324490943825e-06, + -3.1788300149673436e-06, + -3.4034202629295042e-06, + -3.6438443719729404e-06, + -3.901216690418729e-06, + -4.176729870091032e-06, + -4.471660360140786e-06, + -4.787374285364316e-06, + -5.125333737159709e-06, + -5.4871035038518755e-06, + -5.87435827239276e-06, + -6.288890335309002e-06, + -6.732617835164747e-06, + -7.207593587775266e-06, + -7.71601452163331e-06, + -8.260231777913653e-06, + -8.842761516760452e-06, + -9.466296480032033e-06, + -1.0133718360694083e-05, + -1.0848111039587529e-05, + -1.1612774744132412e-05, + -1.2431241199849107e-05, + -1.3307289835926823e-05, + -1.4244965128250777e-05, + -1.5248595148426503e-05, + -1.6322811410119996e-05, + -1.7472570101423096e-05, + -1.870317479782227e-05, + -2.0020300758746434e-05, + -2.1430020920522523e-05, + -2.2938833701319955e-05, + -2.4553692743701924e-05, + -2.6282038731608768e-05, + -2.8131833421274832e-05, + -3.0111596044999785e-05, + -3.223044224883489e-05, + -3.449812574132124e-05, + -3.692508283719514e-05, + -3.9522480105261914e-05, + -4.230226532510693e-05, + -4.527722198460544e-05, + -4.846102757316257e-05, + -5.1868315911457515e-05, + -5.551474381855341e-05, + -5.9417062402457425e-05, + -6.35931932966634e-05, + -6.806231018240397e-05, + -7.284492596465576e-05, + -7.796298598480945e-05, + -8.343996768524546e-05, + -8.930098718498579e-05, + -9.557291320673259e-05, + -0.00010228448890573339, + -0.00010946646209113285, + -0.00011715172446632443, + -0.00012537546046008092, + -0.00013417530633262772, + -0.00014359152025370938, + -0.00015366716408279655, + -0.00016444829768306834, + -0.0001759841865855235, + -0.00018832752393918104, + -0.00020153466770907305, + -0.00021566589413919205, + -0.00023078566862472902, + -0.00024696293511337403, + -0.00026427142535895553, + -0.00028278998928423687, + -0.00030260294796088835, + -0.0003238004706667273, + -0.0003464789776519216, + -0.0003707415703774043, + -0.00039669849099168623, + -0.00042446761307791676, + -0.00045417496571170234, + -0.0004859552930483097, + -0.0005199526518353405, + -0.0005563210493172792, + -0.0005952251242443768, + -0.0006368408738359515, + -0.0006813564296825959, + -0.0007289728858438716, + -0.0007799051825731377, + -0.0008343830492230714, + -0.0008926520103509465, + -0.0009549744589346681, + -0.0010216308012241555, + -0.0010929206777787008, + -0.0011691642655580023, + -0.0012507036663744978, + -0.001337904387130556, + -0.0014311569177969195, + -0.0015308784132249576, + -0.0016375144853726514, + -0.0017515411130971307, + -0.001873466676466798, + -0.002003834123884641, + -0.0021432232797824746, + -0.002292253301873701, + -0.002451585297040233, + -0.0026219251055962433, + -0.002804026264055756, + -0.0029986931571667546, + -0.003206784370866513, + -0.0034292162574992456, + -0.00366696672647536, + -0.003921079273212968, + -0.004192667260150015, + -0.004482918464798712, + -0.0047930999093670126, + -0.005124562988723943, + -0.005478748912446202, + -0.0058571944791103005, + -0.006261538200647411, + -0.00669352679543146, + -0.007155022070110266, + -0.0076480082103933525, + -0.008174599501851943, + -0.008737048502443416, + -0.009337754689820659, + -0.009979273605606945, + -0.01066432652163083, + -0.011395810651255419, + -0.012176809931542864, + -0.01301060640128944, + -0.013900692199674713, + -0.014850782212727518, + -0.01586482739222455, + -0.0169470287725306, + -0.0181018522132191, + -0.019334043886718798, + -0.020648646543328455, + -0.022051016570166865, + -0.023546841864940975, + -0.02514216055281552, + -0.026843380555564317, + -0.028657300029766727, + -0.030591128694356727, + -0.032652510039840175, + -0.03484954444647846, + -0.03719081317826091, + -0.03968540328486797, + -0.04234293336595678, + -0.04517358018612496, + -0.04818810612189109, + -0.051397887382605006, + -0.054814942968384114, + -0.05845196429364386, + -0.062322345390627094, + -0.0664402136209299, + -0.07082046075565748, + -0.07547877431146313, + -0.08043166897702639, + -0.08569651796394173, + -0.09129158405389902, + -0.09723605013537552, + -0.10355004894644823, + -0.11025469171041112, + -0.11737209535888238, + -0.12492540791438801, + -0.13293883164837977, + -0.1414376434930742, + -0.1504482122229822, + -0.15999801178658973, + -0.1701156301311232, + -0.18083077287654975, + -0.19217426096888582, + -0.20417802151630432, + -0.21687507088077626, + -0.23029948899864663, + -0.2444863838429822, + -0.259471844873726, + -0.27529288419756076, + -0.29198736410636433, + -0.3095939095379771, + -0.3281518039581616, + -0.3477008670642934, + -0.3682813125849334, + -0.3899335844440321, + -0.4126981694840298, + -0.4366153847813418, + -0.46172513772399004, + -0.48806665682446704, + -0.5156781912892019, + -0.5445966774897736, + -0.5748573702995708, + -0.6064934375640392, + -0.639535515897264, + -0.6740112263270778, + -0.7099446483241204, + -0.7473557511882463, + -0.786259781863135, + -0.8266666089585779, + -0.8685800227256508, + -0.9119969917783259, + -0.9569068775363894, + -1.0032906082243203, + -1.0511198151266934, + -1.100355934356231, + -1.1509492786737843, + -1.2028380846982418, + -1.255947542050078, + -1.3101888121506766, + -1.3654580456945713, + -1.4216354090212595, + -1.4785841312958892, + -1.5361495854259353, + -1.5941584174749135, + -1.652417740693334, + -1.7107144116758382, + -1.7688144078951678, + -1.8264623272642877, + -1.8833810319889956, + -1.9392714604140957, + -1.9938126324930463, + -2.0466618761069237, + -2.0974553032671666, + -2.145808567698991, + -2.191317937498642, + -2.233561719479077, + -2.2721020750798835, + -2.3064872714078466, + -2.3362544151588716, + -2.3609327215453675, + -2.380047374841866, + -2.3931240411130794, + -2.3996940963587945, + -2.3993006337347516, + -2.39150530980216, + -2.3758960801787703, + -2.3520958566601315, + -2.319772087730669, + -2.2786472188864297, + -2.228509924377378, + -2.1692269146387284, + -2.100755010976601, + -2.023153041138394, + -1.936592949216838, + -1.8413693402550633, + -1.7379065111830228, + -1.6267618833202337, + -1.5086246898795546, + -1.3843088409662643, + -1.2547391608151721, + -1.1209307486277422, + -0.9839621346255262, + -0.8449442409720732, + -0.7049889013459056, + -0.5651827046471648, + -0.426573857783362, + -0.2901809374790636, + -0.1570317159860118, + -0.028236090591185852, + 0.09491251338809978, + 0.21083006903653662, + 0.31757743621365364, + 0.4129170105973251, + 0.49459132992766924, + 0.5609045329601149, + 0.6115503919793837, + 0.6482231077510336, + 0.67363096968, + 0.688844464728, + 0.694281876083, + 0.690479080264, + 0.678092933004, + 0.657886780186, + 0.630711479597, + 0.597482399657, + 0.559153502781, + 0.516690415471, + 0.471045293881, + 0.423137180126, + 0.373842187959, + 0.323997847254, + 0.274424829646, + 0.225966217212, + 0.179538986856, + 0.136183461386, + 0.0970848742152, + 0.0635280463031, + 0.0367384287756, + 0.017572465536, + 0.00607637241616, + 0.00107115338482, + 2.02252233778e-05, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 1, + "j": 5, + "angular_momentum": 2 + }, + { + "radial_function": [ + 0.0, + 4.6582366154520593e-11, + 1.8952811773747045e-10, + 4.337795494811973e-10, + 7.844770507308476e-10, + 1.2469664089060698e-09, + 1.8268063728592128e-09, + 2.529776485248969e-09, + 3.36188519342946e-09, + 4.329378248211349e-09, + 5.438747401299088e-09, + 6.6967394110939545e-09, + 8.110365368001208e-09, + 9.686910350715145e-09, + 1.1433943424059849e-08, + 1.3359327991626642e-08, + 1.547123251440681e-08, + 1.7778141609512462e-08, + 2.0288867540405473e-08, + 2.3012562114301536e-08, + 2.5958728999605455e-08, + 2.913723647897581e-08, + 3.255833065138184e-08, + 3.6232649102172166e-08, + 4.0171235054000185e-08, + 4.438555201641352e-08, + 4.8887498954288864e-08, + 5.3689425987798525e-08, + 5.880415064788419e-08, + 6.424497470222355e-08, + 7.002570157513453e-08, + 7.616065437971369e-08, + 8.266469458392304e-08, + 8.955324133380346e-08, + 9.684229145532224e-08, + 1.0454844016017524e-07, + 1.1268890247708984e-07, + 1.2128153543698826e-07, + 1.3034486103802214e-07, + 1.3989809001355304e-07, + 1.4996114643777458e-07, + 1.6055469319111307e-07, + 1.7170015832067442e-07, + 1.8341976232280274e-07, + 1.9573654638510638e-07, + 2.0867440161344144e-07, + 2.2225809928749515e-07, + 2.365133221651267e-07, + 2.5146669690980406e-07, + 2.67145827607024e-07, + 2.8357933049754727e-07, + 3.007968699147793e-07, + 3.188291954399888e-07, + 3.3770818043106024e-07, + 3.574668618286943e-07, + 3.78139481377082e-07, + 3.997615283062731e-07, + 4.223697834830578e-07, + 4.460023651010146e-07, + 4.706987759684208e-07, + 4.964999524621018e-07, + 5.234483151806847e-07, + 5.515878213473225e-07, + 5.809640190879431e-07, + 6.11624103522573e-07, + 6.436169749078857e-07, + 6.769932987376534e-07, + 7.118055679641887e-07, + 7.481081673862556e-07, + 7.859574402693544e-07, + 8.254117573142504e-07, + 8.665315880160774e-07, + 9.093795744596542e-07, + 9.540206077863257e-07, + 1.0005219072033848e-06, + 1.0489531018651942e-06, + 1.0993863155140071e-06, + 1.1518962540786497e-06, + 1.206560296363938e-06, + 1.2634585878611537e-06, + 1.3226741378543623e-06, + 1.3842929198121867e-06, + 1.448403975404441e-06, + 1.5150995220406731e-06, + 1.584475064174914e-06, + 1.6566295084626088e-06, + 1.7316652829943243e-06, + 1.809688460512072e-06, + 1.8908088861089187e-06, + 1.975140309209899e-06, + 2.0628005201684145e-06, + 2.153911491732568e-06, + 2.2485995251570008e-06, + 2.346995401736182e-06, + 2.4492345392520815e-06, + 2.555457154111257e-06, + 2.665808428969507e-06, + 2.78043868627027e-06, + 2.899503567664125e-06, + 3.023164219838729e-06, + 3.151587486583071e-06, + 3.2849461077972767e-06, + 3.4234189250330195e-06, + 3.567191094562453e-06, + 3.7164543074955675e-06, + 3.871407017786367e-06, + 4.032254677936898e-06, + 4.1992099830447715e-06, + 4.372493123252777e-06, + 4.552332044803192e-06, + 4.738962720465177e-06, + 4.932629428989249e-06, + 5.133585044430577e-06, + 5.342091335552037e-06, + 5.558419275400933e-06, + 5.782849361774621e-06, + 6.01567194874282e-06, + 6.257187589665778e-06, + 6.5077073920551775e-06, + 6.7675533846769704e-06, + 7.0370588976431845e-06, + 7.316568955207612e-06, + 7.606440682644581e-06, + 7.907043726777477e-06, + 8.218760691532439e-06, + 8.541987588049264e-06, + 8.877134300811887e-06, + 9.224625069732189e-06, + 9.584898988906317e-06, + 9.958410522609659e-06, + 1.0345630039289061e-05, + 1.0747044363883292e-05, + 1.1163157349411461e-05, + 1.1594490468132248e-05, + 1.2041583423325703e-05, + 1.2504994782193343e-05, + 1.2985302630752464e-05, + 1.3483105251019053e-05, + 1.3999021822213203e-05, + 1.4533693145626441e-05, + 1.5087782395017085e-05, + 1.566197589262693e-05, + 1.6256983912311825e-05, + 1.6873541510143122e-05, + 1.751240938417653e-05, + 1.8174374763347724e-05, + 1.886025232771787e-05, + 1.9570885160238378e-05, + 2.030714573123898e-05, + 2.1069936917230974e-05, + 2.186019305559963e-05, + 2.267888103316174e-05, + 2.352700141696982e-05, + 2.4405589618330486e-05, + 2.5315717103074825e-05, + 2.6258492638914734e-05, + 2.723506358868497e-05, + 2.824661724698674e-05, + 2.929438222255811e-05, + 3.037962987186015e-05, + 3.150367577734065e-05, + 3.266788127915817e-05, + 3.387365506189152e-05, + 3.512245479027684e-05, + 3.641578880923862e-05, + 3.77552178961773e-05, + 3.914235707625991e-05, + 4.057887750079574e-05, + 4.2066508390874124e-05, + 4.360703904553601e-05, + 4.5202320923096446e-05, + 4.685426979166934e-05, + 4.8564867954759264e-05, + 5.03361665532654e-05, + 5.2170287947753806e-05, + 5.4069428184458586e-05, + 5.6035859541911396e-05, + 5.807193317013563e-05, + 6.0180081821086124e-05, + 6.236282266631187e-05, + 6.462276022372585e-05, + 6.696258937393087e-05, + 6.938509848759843e-05, + 7.189317266143801e-05, + 7.448979705948437e-05, + 7.717806037694781e-05, + 7.996115841855394e-05, + 8.284239780463455e-05, + 8.582519980217574e-05, + 8.89131042890369e-05, + 9.210977385421572e-05, + 9.54189980448715e-05, + 9.884469774941957e-05, + 0.00010239092974499077, + 0.00010606189139188446, + 0.00010986192549231401, + 0.00011379552532404718, + 0.00011786733983692123, + 0.00012208217903370193, + 0.0001264450195430239, + 0.0001309610103739532, + 0.00013563547887520807, + 0.00014047393690012685, + 0.00014548208718327988, + 0.00015066582993690712, + 0.00015603126968025187, + 0.00016158472229411175, + 0.0001673327223282962, + 0.00017328203056193956, + 0.00017943964181562865, + 0.00018581279304396675, + 0.00019240897170155744, + 0.0001992359243975109, + 0.0002063016658547262, + 0.0002136144881690179, + 0.00022118297040021976, + 0.0002290159884830826, + 0.00023712272548585144, + 0.0002455126822274268, + 0.00025419568824985406, + 0.0002631819131820767, + 0.00027248187848554194, + 0.00028210646961792334, + 0.00029206694860254244, + 0.00030237496704422037, + 0.000313042579587098, + 0.00032408225784338256, + 0.00033550690479635937, + 0.0003473298697049505, + 0.0003595649635306667, + 0.000372226474879276, + 0.00038532918651202366, + 0.0003988883924150439, + 0.00041291991546317915, + 0.00042744012570258887, + 0.00044246595924168924, + 0.0004580149378250323, + 0.0004741051890610724, + 0.0004907554673560259, + 0.0005079851755744405, + 0.0005258143874515064, + 0.000544263870764032, + 0.0005633551113230418, + 0.0005831103377808038, + 0.000603552547307498, + 0.0006247055321411724, + 0.0006465939070715824, + 0.0006692431378631481, + 0.000692679570671791, + 0.0007169304624615126, + 0.0007420240124950313, + 0.0007679893948995704, + 0.0007948567923584672, + 0.0008226574309902554, + 0.000851423616391858, + 0.0008811887709836175, + 0.0009119874725964783, + 0.0009438554944335047, + 0.0009768298463912865, + 0.0010109488178171578, + 0.0010462520217605336, + 0.0010827804407409726, + 0.0011205764741045589, + 0.0011596839870293856, + 0.0012001483612154584, + 0.0012420165473472885, + 0.0012853371193719046, + 0.0013301603306377632, + 0.0013765381720067292, + 0.0014245244319682875, + 0.0014741747588512117, + 0.0015255467251599445, + 0.0015786998941988873, + 0.00163369588894409, + 0.0016905984633599502, + 0.001749473576178096, + 0.0018103894671949374, + 0.001873416736303569, + 0.001938628425182733, + 0.0020061001018922054, + 0.002075909948369734, + 0.0021481388509678686, + 0.00222287049420774, + 0.0023001914576632663, + 0.0023801913163806077, + 0.0024629627446334616, + 0.002548601623397952, + 0.002637207151499825, + 0.002728881960837715, + 0.002823732235121893, + 0.0029218678334751768, + 0.003023402417688665, + 0.0031284535842615886, + 0.0032371430010110784, + 0.003349596548407104, + 0.0034659444658461233, + 0.0035863215029274097, + 0.003710867076391945, + 0.0038397254321147316, + 0.0039730458128576715, + 0.0041109826322821685, + 0.004253695654413887, + 0.004401350180012163, + 0.0045541172391039934, + 0.0047121737903620675, + 0.004875702927449043, + 0.005044894092826681, + 0.005219943298593616, + 0.005401053355818251, + 0.005588434111109499, + 0.005782302692394047, + 0.005982883762276027, + 0.006190409781641196, + 0.006405121281380364, + 0.006627267144255561, + 0.006857104896868992, + 0.007094901011725857, + 0.007340931219807994, + 0.0075954808345694525, + 0.007858845087312341, + 0.00813132947434102, + 0.008413250116721054, + 0.00870493413236077, + 0.009006720021762104, + 0.009318958067360236, + 0.00964201074719577, + 0.009976253162904493, + 0.010322073483791232, + 0.010679873406145507, + 0.011050068628868107, + 0.011433089347249247, + 0.011829380762901806, + 0.012239403613207706, + 0.012663634719365822, + 0.01310256755420408, + 0.013556712830380494, + 0.014026599110146684, + 0.014512773436844985, + 0.015015801989028516, + 0.015536270759490675, + 0.016074786257020326, + 0.016631976235884558, + 0.017208490449634392, + 0.01780500143454366, + 0.018422205320045643, + 0.01906082266954566, + 0.01972159935231067, + 0.02040530744634032, + 0.021112746175809487, + 0.021844742881836104, + 0.02260215402978657, + 0.02338586625388387, + 0.024196797439567458, + 0.025035897847558667, + 0.025904151277868152, + 0.02680257627928941, + 0.027732227401638797, + 0.028694196496963937, + 0.02968961406836994, + 0.030719650669180067, + 0.03178551835615613, + 0.03288847219556266, + 0.03402981182767445, + 0.035210883089948165, + 0.03643307970130207, + 0.037697845011296915, + 0.03900667381489398, + 0.0403611142369541, + 0.04176276968929757, + 0.04321330090175003, + 0.044714428031586255, + 0.046267932854743, + 0.047875661039541335, + 0.049539524511134025, + 0.05126150390438352, + 0.05304365111392439, + 0.05488809194293928, + 0.056797028853726186, + 0.058772743826926516, + 0.06081760133121737, + 0.06293405141056721, + 0.06512463289111652, + 0.06739197671309921, + 0.06973880939711559, + 0.07216795664136183, + 0.07468234706610465, + 0.07728501610134537, + 0.07997911002973919, + 0.08276789018874013, + 0.08565473733932434, + 0.08864315620628235, + 0.09173678019700646, + 0.09493937631076059, + 0.0982548502361066, + 0.1016872516540739, + 0.10524077974908197, + 0.10891978893506088, + 0.11272879481116493, + 0.11667248034593017, + 0.1207557023099238, + 0.12498349795372708, + 0.12936109195037845, + 0.1338939036072023, + 0.13858755435419287, + 0.14344787552292634, + 0.14848091642361289, + 0.15369295272946287, + 0.15909049517712456, + 0.16468029859818234, + 0.17046937128171116, + 0.17646498468892344, + 0.18267468351784913, + 0.18910629613543017, + 0.19576794538335227, + 0.20266805975932264, + 0.2098153849931674, + 0.21721899601468866, + 0.22488830931846027, + 0.2328330957476702, + 0.24106349366069665, + 0.24959002254011586, + 0.2584235969978837, + 0.26757554117276205, + 0.2770576035680535, + 0.2868819722670667, + 0.29706129052914054, + 0.307608672799162, + 0.3185377210227107, + 0.3298625413742402, + 0.3415977611996985, + 0.3537585463488882, + 0.36636061869096337, + 0.3794202738248413, + 0.3929543989858906, + 0.40698049100407696, + 0.4215166743133758, + 0.43658171889921904, + 0.4521950580668089, + 0.46837680602115583, + 0.48514777503011963, + 0.5025294921199098, + 0.5205442151100793, + 0.5392149478686943, + 0.5585654545190026, + 0.5786202724924892, + 0.5994047241363062, + 0.6209449265857626, + 0.6432677997351615, + 0.6664010718437771, + 0.6903732825722165, + 0.7152137829279297, + 0.7409527318403192, + 0.7676210888032295, + 0.795250602058816, + 0.8238737919597836, + 0.8535239286582, + 0.884235003627401, + 0.9160416943064489, + 0.9489793210501926, + 0.9830837955671203, + 1.0183915600047044, + 1.0549395156832595, + 1.0927649404968167, + 1.1319053938428485, + 1.1723986079711695, + 1.2142823645361778, + 1.257594354970102, + 1.3023720233812504, + 1.3486523905914916, + 1.3964718576535908, + 1.4458659875058477, + 1.4968692630218319, + 1.5495148197980404, + 1.603834152198828, + 1.6598567907307646, + 1.7176099492667691, + 1.7771181403084664, + 1.838402756851518, + 1.9014816191514619, + 1.9663684851330274, + 2.03307252295313, + 2.101597744999921, + 2.171942402018828, + 2.244098337264433, + 2.318050300213849, + 2.393775220111334, + 2.471241440266767, + 2.55040791411691, + 2.631223365281558, + 2.7136254142227876, + 2.7975396751206834, + 2.8828788275104253, + 2.969541668332255, + 3.057412151024282, + 3.146358420029779, + 3.236231849824784, + 3.3268660996343526, + 3.4180761963790167, + 3.5096576598721274, + 3.601385686367886, + 3.6930144081360465, + 3.7842762486376356, + 3.8748813944363842, + 3.9645174071674347, + 4.052849000302792, + 4.139518006806127, + 4.2241435656533595, + 4.306322555928773, + 4.385630308225513, + 4.461621623613824, + 4.533832130522586, + 4.601780009644588, + 4.664968116042344, + 4.72288652634946, + 4.7750155370036405, + 4.820829136709888, + 4.859798973350588, + 4.891398831299238, + 4.915109630529174, + 4.930424953201157, + 4.9368570968314565, + 4.933943645160382, + 4.921254538391982, + 4.898399612788188, + 4.865036565098651, + 4.820879278971365, + 4.76570642708765, + 4.699370232814339, + 4.621805237051888, + 4.533036867864435, + 4.433189551488902, + 4.322494032626535, + 4.20129349152108, + 4.070047959702456, + 3.9293364549751173, + 3.7798561965675517, + 3.6224182502318167, + 3.4579390295662336, + 3.2874272987680326, + 3.1119667499648207, + 2.9326949383346004, + 2.7507804100627724, + 2.567401252732344, + 2.3837298980696393, + 2.2009303787441725, + 2.020174389209147, + 1.8426794019978185, + 1.6697619278027052, + 1.502874902014373, + 1.3435481533613294, + 1.19306817758, + 1.05205576174, + 0.920851846424, + 0.799672281983, + 0.688613151613, + 0.587652592272, + 0.496654637128, + 0.415375158357, + 0.343469965263, + 0.280505043435, + 0.225968809669, + 0.179286161183, + 0.13983390617, + 0.106957034483, + 0.0799850607167, + 0.0582475690335, + 0.0410879501627, + 0.0278743996337, + 0.0180074169362, + 0.0109235544276, + 0.00609590469053, + 0.00303292965591, + 0.00127847623904, + 0.000416902377637, + 8.71852405961e-05, + 7.07663906734e-06, + 1.54113777376e-08, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 2, + "j": 2, + "angular_momentum": 0 + }, + { + "radial_function": [ + 0.0, + 1.3095267574576169e-21, + 2.16779687653968e-20, + 1.1355582944490596e-19, + 3.7139134051375615e-19, + 9.383844359394247e-19, + 2.0139854227118528e-18, + 3.862207381034189e-18, + 6.820827140055562e-18, + 1.131155594851198e-17, + 1.7851267735150632e-17, + 2.7064380156240256e-17, + 3.969649151283846e-17, + 5.662938512594629e-17, + 7.889752191420491e-17, + 1.0770615182525263e-16, + 1.4445118540597895e-16, + 1.9074097831529262e-16, + 2.484201939146341e-16, + 3.1959592247392687e-16, + 4.066662498478614e-16, + 5.12351484004279e-16, + 6.397282643805768e-16, + 7.92266797165213e-16, + 9.738714787256204e-16, + 1.1889251903357888e-15, + 1.4423375699019207e-15, + 1.739597590104464e-15, + 2.0868307988521935e-15, + 2.4908616053806697e-15, + 2.959281025828923e-15, + 3.5005203341130966e-15, + 4.123931098842637e-15, + 4.8398721245334155e-15, + 5.6598038553993e-15, + 6.596390843568353e-15, + 7.663612929599944e-15, + 8.876885833856231e-15, + 1.0253191910798693e-14, + 1.1811221875452807e-14, + 1.3571528374993808e-14, + 1.5556692343210968e-14, + 1.779150314923436e-14, + 2.0303153627540437e-14, + 2.3121451160886415e-14, + 2.6279046074230597e-14, + 2.981167869699249e-14, + 3.375844654792871e-14, + 3.816209322126795e-14, + 4.306932064139109e-14, + 4.853112652491243e-14, + 5.4603168987846865e-14, + 6.134616038388451e-14, + 6.882629266937336e-14, + 7.711569667094701e-14, + 8.629293789326817e-14, + 9.644355167226181e-14, + 1.076606206678008e-13, + 1.2004539793910697e-13, + 1.337079790836051e-13, + 1.4876802718487422e-13, + 1.6535555457386015e-13, + 1.8361176570995557e-13, + 2.036899658578994e-13, + 2.2575654045797758e-13, + 2.4999201065098024e-13, + 2.765921705945879e-13, + 3.0576931280111533e-13, + 3.377535481032161e-13, + 3.7279422735140603e-13, + 4.1116147251537464e-13, + 4.531478253585425e-13, + 4.990700224452548e-13, + 5.492709060857577e-13, + 6.04121481139031e-13, + 6.640231288188457e-13, + 7.294099889654169e-13, + 8.007515234313557e-13, + 8.785552740958259e-13, + 9.633698298619993e-13, + 1.055788018234482e-12, + 1.1564503379271665e-12, + 1.2660486506977942e-12, + 1.3853301512273496e-12, + 1.5151016357766302e-12, + 1.6562340915993607e-12, + 1.8096676309479294e-12, + 1.9764167945892306e-12, + 2.1575762527651525e-12, + 2.3543269320975364e-12, + 2.5679426001049994e-12, + 2.7997969411930703e-12, + 3.051371159191355e-12, + 3.3242621465870256e-12, + 3.620191260157753e-12, + 3.941013748987335e-12, + 4.2887288814857255e-12, + 4.665490823170556e-12, + 5.073620319278061e-12, + 5.515617241989628e-12, + 5.994174063967585e-12, + 6.512190327453424e-12, + 7.072788178985686e-12, + 7.679329050215975e-12, + 8.335431565256855e-12, + 9.044990766104978e-12, + 9.812198749887512e-12, + 1.064156682207186e-11, + 1.1537949274584936e-11, + 1.250656890607322e-11, + 1.3553044413003792e-11, + 1.4683419783515603e-11, + 1.5904195841736874e-11, + 1.722236409751433e-11, + 1.8645443066574696e-11, + 2.0181517241808217e-11, + 2.1839278905845265e-11, + 2.3628072990332946e-11, + 2.555794520129954e-11, + 2.763969364592296e-11, + 2.9884924215666856e-11, + 3.2306109990411374e-11, + 3.4916654960751645e-11, + 3.7730962371431154e-11, + 4.076450802629876e-11, + 4.403391890238257e-11, + 4.755705746366271e-11, + 5.135311207812735e-11, + 5.5442693977846664e-11, + 5.984794123152064e-11, + 6.459263023456919e-11, + 6.970229525251972e-11, + 7.52043565987097e-11, + 8.112825806044483e-11, + 8.750561424092308e-11, + 9.437036852423754e-11, + 1.0175896242601731e-10, + 1.0971051713720793e-10, + 1.1826702814812076e-10, + 1.274735738694468e-10, + 1.3737853926759108e-10, + 1.4803385557415572e-10, + 1.5949525722839696e-10, + 1.7182255727270586e-10, + 1.8507994253293724e-10, + 1.9933628997469944e-10, + 2.146655057712618e-10, + 2.3114688868448437e-10, + 2.488655194937747e-10, + 2.6791267834062684e-10, + 2.8838629198992275e-10, + 3.1039141305413314e-10, + 3.340407336461275e-10, + 3.594551356317305e-10, + 3.8676428041335095e-10, + 4.161072407566125e-10, + 4.476331778665132e-10, + 4.815020668125552e-10, + 5.178854737612101e-10, + 5.569673888386515e-10, + 5.98945118289946e-10, + 6.440302403947478e-10, + 6.924496296755873e-10, + 7.444465539356673e-10, + 8.002818498420899e-10, + 8.602351820548092e-10, + 9.246063921925362e-10, + 9.937169439329003e-10, + 1.067911471072536e-09, + 1.1475594356992395e-09, + 1.2330569046055902e-09, + 1.3248284520069428e-09, + 1.423329197691401e-09, + 1.5290469901361939e-09, + 1.6425047449357614e-09, + 1.7642629496025633e-09, + 1.894922346144173e-09, + 2.0351268045865097e-09, + 2.185566400706488e-09, + 2.3469807118991006e-09, + 2.52016234798165e-09, + 2.7059607318755483e-09, + 2.9052861491997503e-09, + 3.119114085378085e-09, + 3.348489869987053e-09, + 3.594533651226156e-09, + 3.858445722813463e-09, + 4.141512229060564e-09, + 4.445111274210807e-09, + 4.770719464978939e-09, + 5.119918916744491e-09, + 5.494404756844762e-09, + 5.8959931583476964e-09, + 6.326629944443614e-09, + 6.788399801157025e-09, + 7.2835361427134366e-09, + 7.814431676395242e-09, + 8.38364971392986e-09, + 8.993936284144899e-09, + 9.648233103820955e-09, + 1.0349691464837556e-08, + 1.1101687104691487e-08, + 1.1907836128982603e-08, + 1.2772012059902961e-08, + 1.369836409030751e-08, + 1.4691336629451806e-08, + 1.5755690228668147e-08, + 1.689652398792409e-08, + 1.8119299546266567e-08, + 1.9429866765783575e-08, + 2.0834491232570863e-08, + 2.233988369944377e-08, + 2.3953231608387106e-08, + 2.568223284091193e-08, + 2.7535131849698077e-08, + 2.952075834468284e-08, + 3.1648568707771515e-08, + 3.39286903326484e-08, + 3.637196909579291e-08, + 3.8990020174806656e-08, + 4.179528245668703e-08, + 4.480107678220943e-08, + 4.8021668303786743e-08, + 5.147233323794434e-08, + 5.51694303306341e-08, + 5.9130477360675216e-08, + 6.337423304086682e-08, + 6.792078469207715e-08, + 7.279164210075303e-08, + 7.800983799701037e-08, + 8.360003560848137e-08, + 8.958864380351121e-08, + 9.600394034467232e-08, + 1.0287620383060985e-07, + 1.1023785494004263e-07, + 1.1812360761637059e-07, + 1.265706309193382e-07, + 1.3561872226745255e-07, + 1.4531049288740585e-07, + 1.5569156632762636e-07, + 1.6681079095516653e-07, + 1.7872046740728036e-07, + 1.9147659207215746e-07, + 2.051391177037316e-07, + 2.197722323928863e-07, + 2.3544465816748094e-07, + 2.522299706226124e-07, + 2.702069410400739e-07, + 2.894599025945587e-07, + 3.100791423167208e-07, + 3.321613206556731e-07, + 3.5580992055095526e-07, + 3.811357280978132e-07, + 4.0825734704786254e-07, + 4.373017494604931e-07, + 4.6840486513920214e-07, + 5.017122124737044e-07, + 5.373795736864762e-07, + 5.755737175380346e-07, + 6.164731728534335e-07, + 6.602690564505996e-07, + 7.071659592556938e-07, + 7.573828947123141e-07, + 8.111543138664057e-07, + 8.687311917780106e-07, + 9.303821903069878e-07, + 9.963949026086163e-07, + 1.0670771850443643e-06, + 1.1427585827139266e-06, + 1.2237918551185527e-06, + 1.3105546090218636e-06, + 1.403451045948704e-06, + 1.5029138325206013e-06, + 1.6094061020280161e-06, + 1.7234235966607004e-06, + 1.8454969601381264e-06, + 1.9761941912160705e-06, + 2.1161232696172142e-06, + 2.265934966107659e-06, + 2.4263258499638426e-06, + 2.598041507430261e-06, + 2.781879986029935e-06, + 2.978695480740423e-06, + 3.189402278466252e-06, + 3.414978979674897e-06, + 3.6564730157446865e-06, + 3.9150054834587804e-06, + 4.191776318353041e-06, + 4.488069831500339e-06, + 4.8052606329175526e-06, + 5.144819972614578e-06, + 5.5083225240059456e-06, + 5.8974536439327065e-06, + 6.314017141401178e-06, + 6.759943590573191e-06, + 7.2372992262322485e-06, + 7.748295461980555e-06, + 8.295299076763822e-06, + 8.880843113040603e-06, + 9.507638538457297e-06, + 1.017858672591639e-05, + 1.0896792804335172e-05, + 1.1665579946915386e-05, + 1.2488504657644578e-05, + 1.3369373127933541e-05, + 1.431225873747216e-05, + 1.5321520780632954e-05, + 1.6401824499790745e-05, + 1.7558162523994005e-05, + 1.8795877801460343e-05, + 2.0120688140802357e-05, + 2.1538712460287042e-05, + 2.3056498880357917e-05, + 2.4681054770598087e-05, + 2.6419878899212732e-05, + 2.8280995828915128e-05, + 3.0272992712632045e-05, + 3.240505865607342e-05, + 3.468702683019957e-05, + 3.7129419521119175e-05, + 3.974349632124615e-05, + 4.2541305683739184e-05, + 4.5535740066639444e-05, + 4.8740594924623614e-05, + 5.217063180982563e-05, + 5.584164586928633e-05, + 5.977053803765196e-05, + 6.397539226477524e-05, + 6.847555811064593e-05, + 7.329173908438076e-05, + 7.844608714132428e-05, + 8.396230372954024e-05, + 8.986574787441491e-05, + 9.618355176635377e-05, + 0.00010294474437576136, + 0.00011018038364755581, + 0.00011792369787356181, + 0.00012621023686547155, + 0.00013507803360370815, + 0.00014456777710898818, + 0.00015472299725321503, + 0.0001655902624050581, + 0.0001772193907092392, + 0.00018966367601901642, + 0.00020298012941329628, + 0.00021722973741239194, + 0.00023247773802800354, + 0.0002487939158373437, + 0.0002662529174365126, + 0.00028493458860441286, + 0.00030492433470320806, + 0.0003263135058841611, + 0.0003491998087587597, + 0.00037368774640238943, + 0.0003998890885195838, + 0.0004279233739311729, + 0.00045791844743791997, + 0.0004900110335241788, + 0.0005243473492898188, + 0.0005610837592791668, + 0.0006003874750916645, + 0.0006424373026668481, + 0.00068742444057008, + 0.0007355533326233728, + 0.0007870425785184433, + 0.0008421259063413869, + 0.0009010532110574988, + 0.0009640916634092322, + 0.0010315268939096885, + 0.0011036642568389118, + 0.001180830179599001, + 0.001263373603076468, + 0.0013516675188674388, + 0.001446110609986358, + 0.001547129001515545, + 0.0016551781286604432, + 0.001770744729732123, + 0.0018943489721084848, + 0.0020265467199564774, + 0.0021679319527051753, + 0.0023191393441450757, + 0.0024808470122737367, + 0.002653779450824627, + 0.002838710654374434, + 0.003036467448632595, + 0.0032479330397235705, + 0.0034740507954496287, + 0.003715828273557397, + 0.003974341512223058, + 0.004250739599106968, + 0.004546249536011679, + 0.0048621814172745345, + 0.00519993394154645, + 0.0055610002761803, + 0.005946974296524448, + 0.006359557221966377, + 0.006800564672218382, + 0.00727193416937904, + 0.007775733110711775, + 0.008314167240885788, + 0.008889589650899598, + 0.009504510335028565, + 0.010161606336773168, + 0.010863732516389956, + 0.011613932975005922, + 0.012415453170915865, + 0.01327175276532619, + 0.014186519236202013, + 0.015163682301426833, + 0.016207429191450278, + 0.017322220816613988, + 0.018512808871803486, + 0.019784253925846932, + 0.021141944542521753, + 0.022591617480201637, + 0.02413937902189274, + 0.02579172748398259, + 0.027555576954341212, + 0.029438282315163933, + 0.0314476655929861, + 0.0335920437007961, + 0.03588025761272663, + 0.03832170302021475, + 0.040926362532128766, + 0.043704839451865325, + 0.04666839317861327, + 0.04982897628779333, + 0.053199273302154446, + 0.05679274122457232, + 0.06062365180737925, + 0.06470713564281687, + 0.06905922803501018, + 0.07369691667287881, + 0.07863819111568637, + 0.08390209404240126, + 0.08950877425511831, + 0.09547954137498507, + 0.10183692215096003, + 0.10860471832964451, + 0.11580806592986272, + 0.12347349581581686, + 0.13162899538303954, + 0.14030407117786103, + 0.14952981217688915, + 0.1593389534966352, + 0.16976594018630345, + 0.1808469907168584, + 0.19262015980287137, + 0.20512540000162344, + 0.21840462161761942, + 0.23250175022465452, + 0.24746278119141976, + 0.2633358303845053, + 0.28017118017238335, + 0.29802131988850245, + 0.3169409795479656, + 0.33698715574576393, + 0.35821912845827464, + 0.38069846731404455, + 0.4044890258073293, + 0.42965692182328435, + 0.4562705026405562, + 0.48440029248979477, + 0.5141189205344971, + 0.5455010270587654, + 0.5786231454695364, + 0.613563557489121, + 0.6504021188788996, + 0.6892200528750501, + 0.730099708198787, + 0.7731242786786705, + 0.8183774811175584, + 0.8659431880319522, + 0.9159050120012812, + 0.9683458379298219, + 1.023347299902431, + 1.0809891990167233, + 1.14134885894956, + 1.2045004158152361, + 1.2705140393815908, + 1.3394550825935656, + 1.4113831572793991, + 1.486351133498141, + 1.5644040614512003, + 1.6455780147817882, + 1.7298988551580532, + 1.817380919105166, + 1.9080256285350568, + 2.0018200282098686, + 2.0987352542823707, + 2.1987249397066706, + 2.3017235639333933, + 2.4076447561722896, + 2.516379563252795, + 2.62779469582512, + 2.7417307681607714, + 2.8580005499775227, + 2.9763872510832323, + 3.0966428621426507, + 3.2184865781939296, + 3.341603334282786, + 3.4656424858074626, + 3.590216669039595, + 3.714900881140244, + 3.8392318220054644, + 3.962707543406634, + 4.084787455069778, + 4.204892740282865, + 4.322407237364669, + 4.436678846854749, + 4.547021527624938, + 4.652717948423885, + 4.753022863950098, + 4.847167286685241, + 4.934363526524641, + 5.013811168924919, + 5.0847040588906065, + 5.146238349824588, + 5.197621663213091, + 5.238083384176807, + 5.266886087573436, + 5.283338046494606, + 5.286806717698134, + 5.276733023815179, + 5.252646158994229, + 5.214178532677227, + 5.161080338333327, + 5.093233096800182, + 5.010661390010474, + 4.913541890303247, + 4.802208733260142, + 4.677154317892607, + 4.539024798074754, + 4.388609910645496, + 4.226827424423002, + 4.054703429147589, + 3.873350907015945, + 3.6839504466007034, + 3.4877383283418646, + 3.286008066857445, + 3.080131072002009, + 2.871599272133325, + 2.662085916200339, + 2.4535089410276614, + 2.2480637281257865, + 2.048171058874043, + 1.8562706407213265, + 1.6744041388744397, + 1.5036261207752075, + 1.3435624462027471, + 1.19306817758, + 1.05205576174, + 0.920851846424, + 0.799672281983, + 0.688613151613, + 0.587652592272, + 0.496654637128, + 0.415375158357, + 0.343469965263, + 0.280505043435, + 0.225968809669, + 0.179286161183, + 0.13983390617, + 0.106957034483, + 0.0799850607167, + 0.0582475690335, + 0.0410879501627, + 0.0278743996337, + 0.0180074169362, + 0.0109235544276, + 0.00609590469053, + 0.00303292965591, + 0.00127847623904, + 0.000416902377637, + 8.71852405961e-05, + 7.07663906734e-06, + 1.54113777376e-08, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 2, + "j": 2, + "angular_momentum": 2 + }, + { + "radial_function": [ + -0.0, + -7.018470154591932e-11, + -2.8555815163307065e-10, + -6.535668049778404e-10, + -1.1819555814015728e-09, + -1.8787788698058087e-09, + -2.7524119237280963e-09, + -3.811562662217688e-09, + -5.065283890344568e-09, + -6.522985953439154e-09, + -8.194449841340993e-09, + -1.0089840757255619e-08, + -1.221972216800146e-08, + -1.4595070352934067e-08, + -1.722728946748496e-08, + -2.01282271412651e-08, + -2.3310190627605478e-08, + -2.6785963525768343e-08, + -3.056882309303514e-08, + -3.467255817027638e-08, + -3.911148774037336e-08, + -4.3900480142993214e-08, + -4.9054972965850616e-08, + -5.459099364111265e-08, + -6.052518076629988e-08, + -6.687480617651333e-08, + -7.365779779839446e-08, + -8.089276330493199e-08, + -8.859901460723892e-08, + -9.679659320587851e-08, + -1.0550629643706246e-07, + -1.1474970464128826e-07, + -1.2454920928713268e-07, + -1.349280420851221e-07, + -1.459103051240859e-07, + -1.5752100206814156e-07, + -1.697860704467751e-07, + -1.8273241508074524e-07, + -1.9638794268300107e-07, + -2.1078159766937979e-07, + -2.259433992313584e-07, + -2.4190447970421383e-07, + -2.586971242837271e-07, + -2.7635481213221136e-07, + -2.9491225893014506e-07, + -3.14405460911818e-07, + -3.3487174045074095e-07, + -3.5634979322519417e-07, + -3.788797370759153e-07, + -4.0250316250453014e-07, + -4.2726318500532904e-07, + -4.5320449921129716e-07, + -4.803734348750297e-07, + -5.088180149191145e-07, + -5.385880154112129e-07, + -5.697350276702873e-07, + -6.023125225751277e-07, + -6.36375917085444e-07, + -6.719826430819803e-07, + -7.091922186140818e-07, + -7.480663216572863e-07, + -7.886688664313604e-07, + -8.310660823542109e-07, + -8.753265958215966e-07, + -9.215215147185442e-07, + -9.697245160212876e-07, + -1.0200119363491155e-06, + -1.0724628657118537e-06, + -1.1271592445214984e-06, + -1.184185963967298e-06, + -1.243630969928856e-06, + -1.3055853704910425e-06, + -1.3701435471294598e-06, + -1.4374032699210131e-06, + -1.5074658165852969e-06, + -1.5804360958526745e-06, + -1.656422774990305e-06, + -1.735538411784666e-06, + -1.817899591180785e-06, + -1.9036270666238548e-06, + -1.9928459063665646e-06, + -2.085685644726514e-06, + -2.1822804388050555e-06, + -2.2827692305124693e-06, + -2.3872959142675216e-06, + -2.4960095105009555e-06, + -2.609064345301294e-06, + -2.7266202360610783e-06, + -2.8488426838778837e-06, + -2.9759030724057947e-06, + -3.1079788736608103e-06, + -3.245253861163583e-06, + -3.387918330081298e-06, + -3.5361693255378144e-06, + -3.6902108783280653e-06, + -3.850254249204413e-06, + -4.016518181430845e-06, + -4.189229162247113e-06, + -4.3686216931936036e-06, + -4.554938570094484e-06, + -4.748431172433732e-06, + -4.949359763195648e-06, + -5.1579937985446474e-06, + -5.374612248847831e-06, + -5.599503930316988e-06, + -5.8329678485362e-06, + -6.075313553587296e-06, + -6.3268615077459215e-06, + -6.587943465836462e-06, + -6.8589028685510715e-06, + -7.140095249890491e-06, + -7.431888658205282e-06, + -7.734664092105699e-06, + -8.048815951557985e-06, + -8.374752504308494e-06, + -8.712896368713301e-06, + -9.063685013225967e-06, + -9.427571273205163e-06, + -9.805023885564706e-06, + -1.0196528041867427e-05, + -1.0602585960988328e-05, + -1.102371748091746e-05, + -1.1460460671780437e-05, + -1.1913372469423656e-05, + -1.2383029331636403e-05, + -1.2870027916304766e-05, + -1.3374985783700477e-05, + -1.3898542122804906e-05, + -1.4441358502751543e-05, + -1.5004119650239934e-05, + -1.5587534254063866e-05, + -1.619233579725244e-05, + -1.6819283418239618e-05, + -1.7469162801518518e-05, + -1.814278709936492e-05, + -1.884099788537666e-05, + -1.9564666141148587e-05, + -2.0314693276526233e-05, + -2.109201218605065e-05, + -2.1897588341050683e-05, + -2.2732420920194226e-05, + -2.359754397863869e-05, + -2.449402765802931e-05, + -2.5422979437882613e-05, + -2.638554543091133e-05, + -2.7382911722228523e-05, + -2.8416305755780747e-05, + -2.9486997768264608e-05, + -3.059630227234056e-05, + -3.1745579591541985e-05, + -3.293623744925037e-05, + -3.41697326086868e-05, + -3.5447572576547225e-05, + -3.6771317356671945e-05, + -3.814258127339254e-05, + -3.956303485074524e-05, + -4.103440676080841e-05, + -4.255848583742056e-05, + -4.4137123158781473e-05, + -4.577223420720554e-05, + -4.746580109617559e-05, + -4.9219874877928754e-05, + -5.103657793387143e-05, + -5.2918106438845196e-05, + -5.486673292224441e-05, + -5.688480890784723e-05, + -5.897476764855047e-05, + -6.113912695612992e-05, + -6.338049212930506e-05, + -6.570155897900862e-05, + -6.810511696384266e-05, + -7.059405242976975e-05, + -7.31713519628731e-05, + -7.584010585721055e-05, + -7.860351170356921e-05, + -8.146487810433298e-05, + -8.442762850978736e-05, + -8.749530519384409e-05, + -9.067157336719366e-05, + -9.396022542182212e-05, + -9.736518533986076e-05, + -0.00010089051323730723, + -0.00010454041007500307, + -0.00010831922253315236, + -0.00011223144804444682, + -0.00011628174001177364, + -0.00012047491319833749, + -0.00012481594931017053, + -0.0001293100027668152, + -0.00013396240667254823, + -0.00013877867899246953, + -0.00014376452894958907, + -0.00014892586362680053, + -0.0001542687948163623, + -0.00015979964609070358, + -0.0001655249601206083, + -0.00017145150625674015, + -0.0001775862883563873, + -0.00018393655288776, + -0.00019050979732348537, + -0.00019731377880752708, + -0.00020435652313022053, + -0.00021164633401304976, + -0.0002191918027120299, + -0.00022700181795200523, + -0.00023508557621153457, + -0.0002434525923467724, + -0.0002521127105960403, + -0.00026107611596498805, + -0.00027035334599074737, + -0.00027995530292817416, + -0.0002898932663475767, + -0.00030017890616665057, + -0.0003108242961410746, + -0.00032184192780629914, + -0.00033324472491889884, + -0.000345046058379092, + -0.0003572597616763932, + -0.00036990014687477926, + -0.0003829820211324092, + -0.00039652070380998564, + -0.00041053204415351523, + -0.00042503243960604215, + -0.0004400388547295757, + -0.0004555688407985029, + -0.0004716405560576874, + -0.00048827278668879553, + -0.0005054849684897905, + -0.0005232972093085987, + -0.0005417303122622551, + -0.0005608057997298434, + -0.0005805459382017346, + -0.0006009737639678753, + -0.0006221131096995528, + -0.0006439886319612284, + -0.0006666258396365197, + -0.0006900511233805727, + -0.0007142917860548741, + -0.0007393760742229623, + -0.0007653332107378949, + -0.0007921934284589634, + -0.0008199880051078496, + -0.0008487492993588247, + -0.0008785107881518782, + -0.000909307105311677, + -0.0009411740814775328, + -0.0009741487854353386, + -0.0010082695668590124, + -0.0010435761005435592, + -0.0010801094321381923, + -0.0011179120254910272, + -0.0011570278116065425, + -0.0011975022392916312, + -0.0012393823275826115, + -0.001282716719917415, + -0.0013275557402598348, + -0.001373951451085272, + -0.0014219577134264123, + -0.0014716302489563187, + -0.0015230267042225262, + -0.0015762067171191244, + -0.0016312319856299543, + -0.0016881663389498134, + -0.0017470758110741799, + -0.001808028716909534, + -0.0018710957310360608, + -0.0019363499691858151, + -0.0020038670725034875, + -0.0020737252947572787, + -0.002146005592542237, + -0.0022207917186178308, + -0.002298170318418997, + -0.002378231029984602, + -0.0024610665872401905, + -0.0025467729269305415, + -0.0026354492992254784, + -0.002727198382081551, + -0.0028221263996817325, + -0.002920343244833833, + -0.0030219626057001563, + -0.0031271020968477187, + -0.0032358833948239268, + -0.003348432378520527, + -0.0034648792741915494, + -0.003585358805730567, + -0.0037100103499023477, + -0.0038389780971018863, + -0.003972411217564333, + -0.004110464033628161, + -0.004253296197201356, + -0.004401072874452121, + -0.004553964935899006, + -0.004712149153593681, + -0.004875808405065785, + -0.005045131884255225, + -0.005220315319744289, + -0.00540156120037631, + -0.005589079009243952, + -0.00578308546511889, + -0.005983804772375736, + -0.006191468880148947, + -0.006406317749493311, + -0.006628599630720214, + -0.006858571349779929, + -0.007096498604696226, + -0.007342656272219381, + -0.007597328725429183, + -0.007860810161610884, + -0.008133404942589762, + -0.008415427945608485, + -0.008707204927685558, + -0.009009072900983722, + -0.009321380523166405, + -0.009644488499513146, + -0.009978769999806769, + -0.010324611089897184, + -0.010682411177891114, + -0.011052583475555358, + -0.011435555476261905, + -0.011831769449366543, + -0.012241682951571227, + -0.012665769356461349, + -0.013104518401737793, + -0.013558436756110041, + -0.014028048605665564, + -0.014513896260766082, + -0.015016540783375557, + -0.015536562637398872, + -0.016074562360681204, + -0.016631161260187387, + -0.01720700213303354, + -0.017802750010267845, + -0.0184190929283409, + -0.019056742726778948, + -0.019716435873684053, + -0.02039893431986794, + -0.021105026383241948, + -0.021835527663569047, + -0.022591281988753317, + -0.023373162395929802, + -0.02418207214388964, + -0.025018945764158435, + -0.025884750145402976, + -0.026780485658918565, + -0.027707187320998444, + -0.028665925997003305, + -0.029657809647909695, + -0.030683984618902378, + -0.03174563697508849, + -0.032843993882130294, + -0.0339803250362628, + -0.03515594414446555, + -0.03637221045505813, + -0.03763053034421963, + -0.038932358955326214, + -0.040279201898930785, + -0.041672617008752674, + -0.043114216162447615, + -0.044605667164536185, + -0.046148695694928715, + -0.04774508732795035, + -0.04939668961932231, + -0.0511054142687183, + -0.052873239357404955, + -0.05470221166375207, + -0.056594449061359436, + -0.05855214299981947, + -0.060577561073289994, + -0.0626730496799689, + -0.06484103677340436, + -0.0670840347109624, + -0.06940464320313233, + -0.07180555236333314, + -0.07428954586895795, + -0.07685950422859321, + -0.07951840816674825, + -0.08226934212652569, + -0.08511549789286324, + -0.08806017834450795, + -0.09110680133519261, + -0.09425890371224308, + -0.09752014547318626, + -0.100894314065777, + -0.10438532884248691, + -0.10799724566141611, + -0.11173426165469787, + -0.11560072015500082, + -0.11960111579451446, + -0.12374009977854618, + -0.1280224853406577, + -0.13245325338252822, + -0.1370375583043587, + -0.14178073403886357, + -0.14668830028041208, + -0.15176596893010527, + -0.15701965075418592, + -0.16245546226093172, + -0.16807973281111993, + -0.1738990119538334, + -0.1799200770103441, + -0.1861499408941651, + -0.19259586018788072, + -0.19926534347599453, + -0.20616615993595597, + -0.2133063481991151, + -0.2206942254835407, + -0.22833839700249553, + -0.23624776565129466, + -0.24443154198393013, + -0.25289925446838457, + -0.2616607600399022, + -0.270726254937165, + -0.28010628583427766, + -0.28981176126477426, + -0.2998539633266622, + -0.31024455968277204, + -0.32099561583748537, + -0.3321196076824961, + -0.3436294343283342, + -0.355538431153204, + -0.36786038313951824, + -0.38060953841446776, + -0.3938006219722779, + -0.4074488496303676, + -0.4215699421116552, + -0.4361801392397909, + -0.4512962142769709, + -0.46693548823187014, + -0.4831158442742871, + -0.4998557419549043, + -0.5171742314641355, + -0.5350909676182392, + -0.5536262235744484, + -0.572800904262015, + -0.5926365593095676, + -0.6131553954562532, + -0.6343802882752402, + -0.6563347930352744, + -0.6790431546803047, + -0.7025303166005068, + -0.7268219281223405, + -0.7519443504484496, + -0.7779246608855453, + -0.8047906549945374, + -0.8325708465305206, + -0.8612944647852011, + -0.890991448955791, + -0.921692439340601, + -0.9534287647597482, + -0.9862324259650854, + -1.0201360743773673, + -1.0551729858313388, + -1.0913770286332662, + -1.1287826252994622, + -1.1674247075780468, + -1.207338663707693, + -1.2485602773706208, + -1.2911256575189147, + -1.335071158129536, + -1.3804332869633102, + -1.4272486023938689, + -1.4755535971836624, + -1.5253845681322298, + -1.5767774703402162, + -1.6297677548980527, + -1.684390188696288, + -1.7406786548675448, + -1.7986659325157441, + -1.8583834543025353, + -1.9198610401419771, + -1.9831266057011727, + -2.048205843924477, + -2.1151218779503465, + -2.1838948840531662, + -2.2545416827127034, + -2.327075296527241, + -2.4015044733068707, + -2.477833173201341, + -2.5560600184234983, + -2.6361777047307706, + -2.7181723735804555, + -2.8020229448732232, + -2.8877004095108996, + -2.9751670825233885, + -3.0643758171089535, + -3.1552691808704036, + -3.2477785963523003, + -3.3418234481229194, + -3.4373101601462004, + -3.5341312476606555, + -3.632164349002312, + -3.7312712439268876, + -3.8312968662986013, + -3.932068320164658, + -4.033393910253025, + -4.135062198766465, + -4.236841102695424, + -4.338477047394033, + -4.439694193790965, + -4.540193758875124, + -4.639653450756915, + -4.737727041587326, + -4.83404410318404, + -4.928209932405614, + -5.0198056946029554, + -5.108388814653313, + -5.19349364673388, + -5.274632454351269, + -5.351296732730879, + -5.422958905665293, + -5.489074428374501, + -5.549084326976674, + -5.602418203453636, + -5.648497732870317, + -5.686740676769983, + -5.716565433092764, + -5.73739613908275, + -5.748668338660655, + -5.749835220423255, + -5.740374426121129, + -5.7197954222508764, + -5.687647418880165, + -5.643527809521906, + -5.5870910931156255, + -5.518058222690529, + -5.436226303941368, + -5.341478538594199, + -5.233794270007276, + -5.1132589393902235, + -4.980073697514871, + -4.834564337337242, + -4.677189116022309, + -4.508544923141234, + -4.329371131396723, + -4.140550350698433, + -3.943105220567773, + -3.7381903584987968, + -3.5270786897992705, + -3.311141697306863, + -3.0918237444876997, + -2.8706116499957353, + -2.6490022138413303, + -2.4284724183447337, + -2.210459353588173, + -1.9963589169992344, + -1.7875525607322726, + -1.5854668568457344, + -1.3916558412573963, + -1.2078609235716837, + -1.0359300751047429, + -0.877356313477, + -0.732667267965, + -0.601979405747, + -0.485228873645, + -0.382183730377, + -0.29245198827, + -0.215492872008, + -0.150631258657, + -0.0970751337751, + -0.0539357198448, + -0.0202497300767, + 0.00499705753797, + 0.0228459355573, + 0.0343423962624, + 0.04051561756, + 0.042361675631, + 0.0408314455711, + 0.0368234887434, + 0.0311808865943, + 0.0246892884498, + 0.0180711510811, + 0.0119691371116, + 0.00691061525351, + 0.00324781299159, + 0.00107815181905, + 0.000174100507783, + 2.42757690437e-06, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 2, + "j": 3, + "angular_momentum": 0 + }, + { + "radial_function": [ + -0.0, + -1.6687798972225095e-21, + -2.762506247563569e-20, + -1.4470852490069707e-19, + -4.732781514542114e-19, + -1.1958190801630649e-18, + -2.566498444990107e-18, + -4.921758184460078e-18, + -8.692040195991107e-18, + -1.4414747209433888e-17, + -2.2748551387610362e-17, + -3.448917196740546e-17, + -5.0586753303590817e-17, + -7.216498551639074e-17, + -1.0054212161230903e-16, + -1.3725405757191924e-16, + -1.840796554497839e-16, + -2.4306850420997882e-16, + -3.1657132873534434e-16, + -4.072732745278563e-16, + -5.182303138624621e-16, + -6.529090389432139e-16, + -8.152301287570953e-16, + -1.0096157994134192e-15, + -1.2410415721274067e-15, + -1.515092719680948e-15, + -1.8380257809236733e-15, + -2.2168355631046433e-15, + -2.6593280855660796e-15, + -3.1741999532941413e-15, + -3.77112468769099e-15, + -4.460846582691968e-15, + -5.255282698860299e-15, + -6.167633655890649e-15, + -7.21250393496097e-15, + -8.406032457888128e-15, + -9.7660342687008e-15, + -1.1312154207822905e-14, + -1.306603353725992e-14, + -1.5051490548037416e-14, + -1.7294716262328968e-14, + -1.982448642529353e-14, + -2.2672391075467383e-14, + -2.5873083078936973e-14, + -2.946454712037095e-14, + -3.3488390754101394e-14, + -3.7990159244982156e-14, + -4.301967605226352e-14, + -4.8631410968208364e-14, + -5.4884878036136286e-14, + -6.184506559121951e-14, + -6.958290089329653e-14, + -7.817575200999992e-14, + -8.770796987556975e-14, + -9.827147355309922e-14, + -1.0996638206124282e-13, + -1.2290169634038036e-13, + -1.3719603517355927e-13, + -1.529784291952273e-13, + -1.7038917742339276e-13, + -1.895807710884293e-13, + -2.1071888986118304e-13, + -2.339834759684563e-13, + -2.595698921546084e-13, + -2.8769016973032394e-13, + -3.1857435366828663e-13, + -3.5247195192878635e-13, + -3.8965349695429383e-13, + -4.3041222775204767e-13, + -4.750659016173724e-13, + -5.23958745274408e-13, + -5.774635558449011e-13, + -6.359839628074846e-13, + -6.999568631876458e-13, + -7.698550426199119e-13, + -8.461899964852193e-13, + -9.295149657303994e-13, + -1.0204282034885065e-12, + -1.1195764897212695e-12, + -1.2276589121769093e-12, + -1.3454309335387532e-12, + -1.4737087657280874e-12, + -1.613374074549458e-12, + -1.765379038659075e-12, + -1.9307517892763217e-12, + -2.1106022586475234e-12, + -2.30612846763718e-12, + -2.5186232841999738e-12, + -2.7494816883315745e-12, + -3.000208579816667e-12, + -3.2724271691291523e-12, + -3.567887994635444e-12, + -3.888478610796627e-12, + -4.236233998533258e-12, + -4.613347748347978e-12, + -5.0221840748041244e-12, + -5.4652907217721826e-12, + -5.945412824400055e-12, + -6.4655077967079556e-12, + -7.028761320995747e-12, + -7.638604517681244e-12, + -8.298732383821431e-12, + -9.013123589593166e-12, + -9.786061735290094e-12, + -1.0622158171335584e-11, + -1.1526376497968776e-11, + -1.250405886407044e-11, + -1.3560954197838197e-11, + -1.4703248508145357e-11, + -1.5937597405975612e-11, + -1.727116100994098e-11, + -1.8711641403980025e-11, + -2.0267322835476187e-11, + -2.1947114851249372e-11, + -2.3760598581712494e-11, + -2.571807640345275e-11, + -2.783062522257964e-11, + -3.011015364059758e-11, + -3.256946328237707e-11, + -3.522231458609671e-11, + -3.8083497380065686e-11, + -4.1168906583650886e-11, + -4.4495623411007165e-11, + -4.808200246369326e-11, + -5.1947765145943335e-11, + -5.6114099845545097e-11, + -6.060376937805768e-11, + -6.544122620867173e-11, + -7.065273601208214e-11, + -7.626651016861787e-11, + -8.231284784025701e-11, + -8.882428830925918e-11, + -9.583577431982726e-11, + -1.0338482720542062e-10, + -1.1151173465209807e-10, + -1.202597519992445e-10, + -1.2967531804943966e-10, + -1.3980828641649675e-10, + -1.5071217354217235e-10, + -1.6244442454972705e-10, + -1.7506669823078943e-10, + -1.8864517251610197e-10, + -2.0325087190688144e-10, + -2.1896001842154756e-10, + -2.358544077550116e-10, + -2.540218124232707e-10, + -2.7355641385025e-10, + -2.945592654376203e-10, + -3.1713878882857007e-10, + -3.4141130574542336e-10, + -3.6750160795128105e-10, + -3.955435679431468e-10, + -4.2568079351868397e-10, + -4.580673289833557e-10, + -4.928684067334446e-10, + -5.302612524159886e-10, + -5.704359477518246e-10, + -6.135963549714676e-10, + -6.59961107270936e-10, + -7.097646701592245e-10, + -7.63258478369373e-10, + -8.207121540167254e-10, + -8.824148117848681e-10, + -9.486764569208014e-10, + -1.0198294833233302e-09, + -1.0962302780967263e-09, + -1.1782609405867788e-09, + -1.2663311239241071e-09, + -1.3608800077729057e-09, + -1.4623784113993423e-09, + -1.5713310574191665e-09, + -1.6882789964993516e-09, + -1.813802204645388e-09, + -1.948522365224246e-09, + -2.0931058489063737e-09, + -2.248266905622128e-09, + -2.4147710830645675e-09, + -2.5934388885213682e-09, + -2.7851497109376748e-09, + -2.9908460209549642e-09, + -3.2115378703381656e-09, + -3.448307709830037e-09, + -3.702315549688522e-09, + -3.9748044866124984e-09, + -4.267106622194064e-09, + -4.580649402056697e-09, + -4.9169624041002126e-09, + -5.277684608671855e-09, + -5.6645721839029295e-09, + -6.079506823087644e-09, + -6.524504672910485e-09, + -7.0017258951430294e-09, + -7.513484904347663e-09, + -8.062261332738363e-09, + -8.650711770242187e-09, + -9.281682336258658e-09, + -9.958222142798851e-09, + -1.068359770895257e-08, + -1.14613083964334e-08, + -1.2295102938749802e-08, + -1.3188997138034622e-08, + -1.4147292815013783e-08, + -1.5174598099526334e-08, + -1.62758491559415e-08, + -1.7456333444880882e-08, + -1.872171463094647e-08, + -2.007805924894038e-08, + -2.153186525721134e-08, + -2.3090092609386836e-08, + -2.476019598419703e-08, + -2.655015983075266e-08, + -2.8468535888235408e-08, + -3.052448335584754e-08, + -3.272781190183443e-08, + -3.508902770703314e-08, + -3.761938276360783e-08, + -4.033092765092626e-08, + -4.323656803895256e-08, + -4.6350125181798005e-08, + -4.968640067681523e-08, + -5.3261245798429606e-08, + -5.709163572039311e-08, + -6.119574897991484e-08, + -6.559305254192353e-08, + -7.030439286897663e-08, + -7.535209341133113e-08, + -8.076005897534585e-08, + -8.655388744846622e-08, + -9.27609894038208e-08, + -9.941071614150283e-08, + -1.0653449674656616e-07, + -1.1416598481820535e-07, + -1.2234121553398663e-07, + -1.3109877378568918e-07, + -1.404799741689479e-07, + -1.5052905364026905e-07, + -1.612933777671266e-07, + -1.728236614933375e-07, + -1.8517420545985217e-07, + -1.9840314897317732e-07, + -2.1257274079276518e-07, + -2.277496289751379e-07, + -2.440051711439223e-07, + -2.6141576659376016e-07, + -2.800632117856692e-07, + -3.0003508085526566e-07, + -3.214251329196287e-07, + -3.4433374804190966e-07, + -3.688683938893867e-07, + -3.951441252131185e-07, + -4.2328411849712604e-07, + -4.534202442109657e-07, + -4.856936793210394e-07, + -5.202555629175997e-07, + -5.572676979077828e-07, + -5.969033021312727e-07, + -6.393478122381774e-07, + -6.847997441501207e-07, + -7.334716139964446e-07, + -7.855909238100829e-07, + -8.414012165456438e-07, + -9.011632052428547e-07, + -9.651559815683504e-07, + -1.0336783093192394e-06, + -1.1070500088149584e-06, + -1.1856134386084972e-06, + -1.2697350813160123e-06, + -1.359807240834466e-06, + -1.456249858855057e-06, + -1.5595124589674039e-06, + -1.6700762273581026e-06, + -1.7884562395841788e-06, + -1.9152038438678415e-06, + -2.0509092116156885e-06, + -2.196204067166638e-06, + -2.351764609181276e-06, + -2.518314637020658e-06, + -2.6966288968281555e-06, + -2.887536662249496e-06, + -3.091925566666167e-06, + -3.310745704270601e-06, + -3.5450140189188776e-06, + -3.7958190011628416e-06, + -4.0643257143960016e-06, + -4.3517811741515826e-06, + -4.659520104184583e-06, + -4.988971096646442e-06, + -5.341663204009134e-06, + -5.719232994058199e-06, + -6.123432097494116e-06, + -6.55613528766253e-06, + -7.019349123906324e-06, + -7.51522120217211e-06, + -8.046050053774179e-06, + -8.614295737586239e-06, + -9.222591174357525e-06, + -9.873754274435938e-06, + -1.0570800916986632e-05, + -1.1316958835886971e-05, + -1.2115682478365125e-05, + -1.2970668906303751e-05, + -1.3885874806827272e-05, + -1.4865534697295183e-05, + -1.5914180402048365e-05, + -1.703666189250318e-05, + -1.8238169584959906e-05, + -1.9524258199722946e-05, + -2.0900872285175463e-05, + -2.2374373532195e-05, + -2.3951569991595116e-05, + -2.563974734095632e-05, + -2.7446702327320566e-05, + -2.938077855799541e-05, + -3.145090478105889e-05, + -3.366663584416807e-05, + -3.6038196514919236e-05, + -3.85765283581433e-05, + -4.129333988287429e-05, + -4.42011601920896e-05, + -4.7313396374038524e-05, + -5.064439489472509e-05, + -5.4209507274276704e-05, + -5.802516033550783e-05, + -6.210893135310566e-05, + -6.647962843634654e-05, + -7.115737651148902e-05, + -7.61637092840557e-05, + -8.152166761346657e-05, + -8.725590472324153e-05, + -9.33927987264015e-05, + -9.996057299320647e-05, + -0.00010698942485930427, + -0.0001145116632964685, + -0.00012256185613779332, + -0.00013117698752458827, + -0.00014039662627789772, + -0.0001502631059562153, + -0.00016082171739189408, + -0.00017212091456572968, + -0.00018421253477013527, + -0.00019715203397276926, + -0.0002109987385200585, + -0.0002258161141971638, + -0.00024167205394167712, + -0.0002586391853959478, + -0.000276795199715374, + -0.00029622320307723013, + -0.0003170120924035923, + -0.00033925695702210416, + -0.0003630595079576728, + -0.00038852853679592023, + -0.00041578040611341333, + -0.00044493957358530104, + -0.0004761391521447082, + -0.0005095215085190018, + -0.0005452389028895724, + -0.0005834541722864166, + -0.000624341460849134, + -0.000668086999989239, + -0.0007148899418452187, + -0.0007649632496959232, + -0.000818534649006907, + -0.0008758476433358608, + -0.0009371625993448092, + -0.001002757905538331, + -0.0010729312097178118, + -0.0011480007402917614, + -0.0012283067170955602, + -0.001314212857664112, + -0.0014061079851849874, + -0.0015044077449286868, + -0.001609556436322247, + -0.0017220289680931606, + -0.0018423329448815653, + -0.0019710108935067673, + -0.0021086426383531798, + -0.002255847835408213, + -0.0024132886751543495, + -0.00258167276544273, + -0.0027617562057334444, + -0.0029543468652084926, + -0.003160307877567216, + -0.0033805613663455557, + -0.0036160924158114755, + -0.003867953302106982, + -0.004137268002105893, + -0.004425236996395687, + -0.0047331423853696365, + -0.005062353337643531, + -0.0054143318914403535, + -0.005790639130436836, + -0.006192941756941554, + -0.006623019087186836, + -0.007082770492945019, + -0.007574223317563004, + -0.008099541293902966, + -0.008661033493739307, + -0.009261163840722536, + -0.009902561218223587, + -0.01058803020816791, + -0.011320562494974755, + -0.012103348973906122, + -0.01293979260260192, + -0.013833522036551336, + -0.014788406092252068, + -0.01580856908248618, + -0.01689840707016518, + -0.018062605088867346, + -0.01930615538132454, + -0.02063437670567489, + -0.02205293476554133, + -0.023567863816608515, + -0.02518558950827736, + -0.026912953018079982, + -0.028757236536553488, + -0.030726190166050035, + -0.03282806029235726, + -0.035071619490682666, + -0.0374661980333021, + -0.04002171704936586, + -0.04274872341561514, + -0.0456584264252788, + -0.04876273629269463, + -0.05207430456803591, + -0.055606566498506343, + -0.05937378538986097, + -0.06339109903142989, + -0.06767456819182086, + -0.07224122726746826, + -0.0771091370431096, + -0.08229743966191212, + -0.08782641574419603, + -0.09371754366769754, + -0.0999935610113909, + -0.10667852808679672, + -0.1137978935290503, + -0.12137856185279278, + -0.1294489628534414, + -0.1380391227681985, + -0.14718073697663842, + -0.15690724408251225, + -0.16725390111534025, + -0.17825785959644777, + -0.18995824209226533, + -0.2023962189306302, + -0.2156150846046658, + -0.2296603333355247, + -0.24457973329204324, + -0.2604233987189235, + -0.27724385932802376, + -0.29509612603036095, + -0.3140377521767057, + -0.3341288892025372, + -0.35543233550617076, + -0.37801357742913344, + -0.4019408207442662, + -0.4272850112229079, + -0.45411984258846827, + -0.48252174996415775, + -0.512569886803419, + -0.5443460831576232, + -0.5779347828778276, + -0.6134229572369833, + -0.6508999921919576, + -0.6904575464035142, + -0.7321893769124711, + -0.7761911290834492, + -0.8225600873909829, + -0.8713948834308457, + -0.9227951571513614, + -0.9768611675358135, + -1.0336933484770736, + -1.0933918056038818, + -1.1560557499846014, + -1.2217828641222985, + -1.290668596170409, + -1.362805377970259, + -1.438281763036016, + -1.5171814804231243, + -1.5995824011234578, + -1.685555413563696, + -1.7751632060281988, + -1.8684589534062463, + -1.965484907598403, + -2.06627089091098, + -2.1708326932319006, + -2.279170375247819, + -2.3912664807103416, + -2.5070841631317866, + -2.6265652335752026, + -2.7496281384117407, + -2.8761658780895853, + -3.0060438804322827, + -3.1390978443038255, + -3.275131572970806, + -3.4139148185043577, + -3.555181162583256, + -3.6986259620769384, + -3.843904390958053, + -3.9906296142274758, + -4.138371132933793, + -4.286653343333267, + -4.434954356760071, + -4.582705131469454, + -4.729288971400913, + -4.874041450664767, + -5.016250827691804, + -5.155159016719477, + -5.289963189063626, + -5.41981808124799, + -5.543839091596269, + -5.661106251505995, + -5.770669161489279, + -5.871552985426852, + -5.962765598186082, + -6.043305980714925, + -6.112173952588329, + -6.168381321203697, + -6.21096450884079, + -6.238998689389446, + -6.251613422953806, + -6.248009714344179, + -6.227478337139809, + -6.189419154434983, + -6.133361028382897, + -6.058981743096057, + -5.96612717346164, + -5.854828726403235, + -5.725317880589869, + -5.578036486700759, + -5.413641409947368, + -5.233002161696114, + -5.037190457390847, + -4.827461242785471, + -4.605225736702641, + -4.372018505844904, + -4.12946250333528, + -3.879238216749813, + -3.623065203103839, + -3.3627056053860036, + -3.099998544215383, + -2.8369298074272304, + -2.5757308045430722, + -2.318982130115727, + -2.0696694800330686, + -1.831106703017111, + -1.6066167006179926, + -1.3988826133632934, + -1.2090309881480577, + -1.0359518382943307, + -0.877356313477, + -0.732667267965, + -0.601979405747, + -0.485228873645, + -0.382183730377, + -0.29245198827, + -0.215492872008, + -0.150631258657, + -0.0970751337751, + -0.0539357198448, + -0.0202497300767, + 0.00499705753797, + 0.0228459355573, + 0.0343423962624, + 0.04051561756, + 0.042361675631, + 0.0408314455711, + 0.0368234887434, + 0.0311808865943, + 0.0246892884498, + 0.0180711510811, + 0.0119691371116, + 0.00691061525351, + 0.00324781299159, + 0.00107815181905, + 0.000174100507783, + 2.42757690437e-06, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 2, + "j": 3, + "angular_momentum": 2 + }, + { + "radial_function": [ + 0.0, + 4.992578612291793e-16, + 4.0973500525496925e-15, + 1.4187184111283926e-14, + 3.45034847200641e-14, + 6.914722030526925e-14, + 1.2261154684044636e-13, + 1.9980935664377232e-13, + 3.0610252485210796e-13, + 4.473329513408454e-13, + 6.298555014208306e-13, + 8.605729541896498e-13, + 1.1469730735647801e-12, + 1.4971679234259684e-12, + 1.919935554721685e-12, + 2.4247641999180876e-12, + 3.021899117101544e-12, + 3.722392234476271e-12, + 4.538154753440798e-12, + 5.48201287818742e-12, + 6.567766848046805e-12, + 7.810253459157937e-12, + 9.225412271247129e-12, + 1.0830355708019684e-11, + 1.2643443268441984e-11, + 1.4684360079680203e-11, + 1.697420003615635e-11, + 1.9535553778572174e-11, + 2.239260178576097e-11, + 2.5571212862265275e-11, + 2.9099048324031634e-11, + 3.300567219788431e-11, + 3.7322667768998766e-11, + 4.208376082931612e-11, + 4.732494999740353e-11, + 5.3084644502399775e-11, + 5.940380984264242e-11, + 6.632612175613193e-11, + 7.389812896148835e-11, + 8.216942514943476e-11, + 9.119283073971467e-11, + 1.0102458493473327e-10, + 1.1172454864030874e-10, + 1.2335641884644853e-10, + 1.3598795510178434e-10, + 1.496912187365868e-10, + 1.645428255417382e-10, + 1.8062421262286495e-10, + 1.9802192024661441e-10, + 2.1682788941485184e-10, + 2.3713977612707546e-10, + 2.590612831800437e-10, + 2.8270251041991574e-10, + 3.0818032459682267e-10, + 3.356187497037284e-10, + 3.6514937902967403e-10, + 3.9691181010943974e-10, + 4.310541037503459e-10, + 4.6773326846682e-10, + 5.071157717071222e-10, + 5.493780793444835e-10, + 5.947072249247292e-10, + 6.433014102613585e-10, + 6.953706391841826e-10, + 7.51137386010771e-10, + 8.10837300922292e-10, + 8.747199539438204e-10, + 9.430496197783883e-10, + 1.0161061056463308e-09, + 1.0941856244255088e-09, + 1.1776017156087479e-09, + 1.2666862165732904e-09, + 1.3617902867792163e-09, + 1.4632854880708053e-09, + 1.5715649236058946e-09, + 1.6870444390997652e-09, + 1.810163889246172e-09, + 1.9413884730372104e-09, + 2.0812101417568715e-09, + 2.2301490833533785e-09, + 2.3887552874473713e-09, + 2.557610194958321e-09, + 2.73732843747895e-09, + 2.928559670586029e-09, + 3.13199050643281e-09, + 3.3483465508028223e-09, + 3.5783945504784817e-09, + 3.8229446560983794e-09, + 4.082852807770992e-09, + 4.3590232488965794e-09, + 4.6524111755933516e-09, + 4.96402552929473e-09, + 5.2949319388140865e-09, + 5.64625582193192e-09, + 6.019185652599726e-09, + 6.41497640468583e-09, + 6.834953180245381e-09, + 7.280515032985869e-09, + 7.753138996400831e-09, + 8.254384328709769e-09, + 8.785896984553605e-09, + 9.349414327490505e-09, + 9.946770093372365e-09, + 1.0579899621147597e-08, + 1.1250845362137592e-08, + 1.1961762685130668e-08, + 1.2714925990931362e-08, + 1.3512735154479713e-08, + 1.4357722310868587e-08, + 1.5252559003002844e-08, + 1.6200063712378333e-08, + 1.7203209789964776e-08, + 1.8265133810981843e-08, + 1.938914437541037e-08, + 2.057873137644624e-08, + 2.1837575763575575e-08, + 2.3169559825333363e-08, + 2.457877801952758e-08, + 2.6069548379572814e-08, + 2.7646424527289585e-08, + 2.931420832619978e-08, + 3.107796320467915e-08, + 3.294302819010747e-08, + 3.491503268582952e-08, + 3.699991203590329e-08, + 3.920392391278467e-08, + 4.153366557768824e-08, + 4.3996092055584805e-08, + 4.659853527415645e-08, + 4.934872421745938e-08, + 5.2254806149009564e-08, + 5.5325368958544205e-08, + 5.856946469396313e-08, + 6.199663433813672e-08, + 6.561693389905048e-08, + 6.944096188082172e-08, + 7.347988820951701e-08, + 7.774548468645254e-08, + 8.225015705753802e-08, + 8.700697877364203e-08, + 9.202972653998644e-08, + 9.733291774183633e-08, + 1.0293184985063962e-07, + 1.0884264190949345e-07, + 1.1508227821435942e-07, + 1.216686542964764e-07, + 1.2862062533876388e-07, + 1.3595805714537079e-07, + 1.4370187979948286e-07, + 1.5187414415546924e-07, + 1.6049808131894823e-07, + 1.6959816523601405e-07, + 1.7920017863416144e-07, + 1.8933128237472918e-07, + 2.0002008852949357e-07, + 2.112967372549059e-07, + 2.2319297774961365e-07, + 2.3574225346244593e-07, + 2.489797917828194e-07, + 2.629426984989658e-07, + 2.7767005716934546e-07, + 2.9320303375562755e-07, + 3.095849867923731e-07, + 3.268615832774105e-07, + 3.450809207672031e-07, + 3.642936558083414e-07, + 3.8455313915926505e-07, + 4.059155581307979e-07, + 4.284400864194587e-07, + 4.5218904178075245e-07, + 4.772280520503287e-07, + 5.036262298527332e-07, + 5.314563565056481e-07, + 5.60795075582179e-07, + 5.917230966572964e-07, + 6.243254097855128e-07, + 6.586915111692776e-07, + 6.949156407602214e-07, + 7.330970323447528e-07, + 7.733401766350059e-07, + 8.157550983897005e-07, + 8.604576478741547e-07, + 9.075698077481663e-07, + 9.572200160782033e-07, + 1.009543506177052e-06, + 1.064682664419811e-06, + 1.1227874067340027e-06, + 1.1840155749297664e-06, + 1.2485333537610961e-06, + 1.3165157098831226e-06, + 1.388146853814684e-06, + 1.4636207262466743e-06, + 1.5431415096141628e-06, + 1.6269241667906845e-06, + 1.715195007797568e-06, + 1.808192286270674e-06, + 1.9061668273708258e-06, + 2.009382688340297e-06, + 2.1181178537963803e-06, + 2.2326649676286394e-06, + 2.3533321029715796e-06, + 2.480443572673787e-06, + 2.6143407822315433e-06, + 2.7553831273734494e-06, + 2.9039489386527673e-06, + 3.0604364756656318e-06, + 3.2252649730352096e-06, + 3.398875741441881e-06, + 3.5817333263342302e-06, + 3.774326727030049e-06, + 3.977170679973436e-06, + 4.190807008991371e-06, + 4.4158060462195664e-06, + 4.652768127602393e-06, + 4.902325166352906e-06, + 5.1651423091756305e-06, + 5.441919678778271e-06, + 5.733394207749791e-06, + 6.040341568557575e-06, + 6.363578204114833e-06, + 6.7039634650319116e-06, + 7.0624018582814895e-06, + 7.439845413967228e-06, + 7.8372961753343e-06, + 8.255808819492274e-06, + 8.696493414899685e-06, + 9.16051832329963e-06, + 9.649113253117642e-06, + 1.0163572472677494e-05, + 1.070525819175356e-05, + 1.1275604119113846e-05, + 1.1876119206867628e-05, + 1.2508391589997402e-05, + 1.3174092732013204e-05, + 1.3874981787696097e-05, + 1.4612910192725121e-05, + 1.538982649460758e-05, + 1.620778143495882e-05, + 1.7068933297671635e-05, + 1.79755535366818e-05, + 1.8930032697927262e-05, + 1.9934886649816575e-05, + 2.0992763140258717e-05, + 2.210644869537853e-05, + 2.327887587921329e-05, + 2.451313093172851e-05, + 2.5812461806609557e-05, + 2.7180286628118647e-05, + 2.8620202590172425e-05, + 3.0135995318961624e-05, + 3.173164872570441e-05, + 3.3411355372865984e-05, + 3.517952738139963e-05, + 3.7040807908722586e-05, + 3.900008322288312e-05, + 4.1062495410481594e-05, + 4.323345574429615e-05, + 4.551865875105403e-05, + 4.792409701152634e-05, + 5.045607673305779e-05, + 5.31212341354348e-05, + 5.5926552690276005e-05, + 5.887938125974517e-05, + 6.198745318186979e-05, + 6.52589063500087e-05, + 6.870230434055613e-05, + 7.232665864196421e-05, + 7.614145204084092e-05, + 8.015666322927098e-05, + 8.438279269360178e-05, + 8.883088995352486e-05, + 9.351258221756719e-05, + 9.844010453664847e-05, + 0.0001036263315226649, + 0.00010908481072434351, + 0.00011482979774030859, + 0.0001208762931565325, + 0.00012724008141549247, + 0.00013393777170032776, + 0.0001409868409541786, + 0.00014840567913485602, + 0.0001562136368244564, + 0.00016443107532392186, + 0.00017307941933977842, + 0.00018218121242985285, + 0.00019176017531521568, + 0.00020184126723671604, + 0.00021245075049371742, + 0.00022361625836280199, + 0.00023536686648618164, + 0.0002477331680585192, + 0.0002607473528400078, + 0.0002744432903166962, + 0.00028885661717601736, + 0.000304024829319431, + 0.0003199873786526504, + 0.00033678577488489435, + 0.0003544636926635427, + 0.00037306708420745154, + 0.00039264429779463226, + 0.0004132462024522192, + 0.00043492631901702637, + 0.0004577409580813489, + 0.00048174936503256154, + 0.0005070138726203085, + 0.0005336000614205273, + 0.0005615769286440442, + 0.0005910170656037392, + 0.0006219968444867983, + 0.0006545966146494251, + 0.0006889009092133737, + 0.0007249986621546935, + 0.0007629834368442096, + 0.0008029536661838463, + 0.0008450129052410889, + 0.0008892700969536501, + 0.0009358398515026297, + 0.0009848427400592937, + 0.0010364056037448816, + 0.0010906618784932438, + 0.001147751936622736, + 0.0012078234460525241, + 0.0012710317479067198, + 0.00133754025363156, + 0.0014075208624971058, + 0.0014811544005728402, + 0.0015586310821436658, + 0.0016401509949888272, + 0.001725924610406023, + 0.0018161733193423884, + 0.0019111299962585211, + 0.002011039591476966, + 0.00211615975412452, + 0.0022267614868115983, + 0.002343129833759849, + 0.002465564604029371, + 0.0025943811317185807, + 0.0027299110748203645, + 0.002872503254681199, + 0.0030225245385020485, + 0.0031803607661420453, + 0.003346417724617255, + 0.00352112217137427, + 0.003704922910051196, + 0.003898291920207148, + 0.004101725544390143, + 0.004315745735246763, + 0.004540901365212786, + 0.004777769602634402, + 0.005026957356741284, + 0.005289102795468218, + 0.0055648769394761495, + 0.00585498533572441, + 0.006160169815331841, + 0.006481210338603934, + 0.006818926932870787, + 0.007174181725946701, + 0.007547881081481417, + 0.007940977839859623, + 0.0083544736699716, + 0.008789421537821022, + 0.009246928296156693, + 0.00972815740223511, + 0.010234331768889292, + 0.010766736755156483, + 0.011326723303541335, + 0.011915711229877357, + 0.012535192673478008, + 0.01318673571496047, + 0.013871988168704413, + 0.014592681558508416, + 0.015350635284827953, + 0.016147760990932427, + 0.01698606713920916, + 0.017867663803985665, + 0.018794767692916773, + 0.019769707405726138, + 0.020794928940041167, + 0.02187300145634186, + 0.023006623311658602, + 0.02419862837474223, + 0.025451992632958893, + 0.02676984110318782, + 0.028155455061591082, + 0.02961227959999114, + 0.031143931528246713, + 0.032754207630351626, + 0.034447093291637663, + 0.03622677150989849, + 0.038097632305440714, + 0.04006428254370537, + 0.04213155618537183, + 0.0443045249823825, + 0.046588509628826734, + 0.048989091388837044, + 0.05151212421328517, + 0.05416374736041572, + 0.05695039854045141, + 0.05987882759287743, + 0.0629561107200578, + 0.06618966528357914, + 0.06958726518559752, + 0.07315705684654047, + 0.07690757579127146, + 0.08084776386039608, + 0.08498698705763663, + 0.08933505404430318, + 0.09390223529031552, + 0.09869928289520297, + 0.10373745107839107, + 0.10902851735418868, + 0.11458480438535198, + 0.12041920252368554, + 0.12654519303446282, + 0.1329768719943803, + 0.13972897486616873, + 0.14681690172954184, + 0.1542567431519305, + 0.16206530669554153, + 0.17026014399662084, + 0.17885957844195596, + 0.18788273336012645, + 0.1973495606793794, + 0.2072808700532983, + 0.21769835833717077, + 0.2286246393567642, + 0.24008327393900816, + 0.2520988000163501, + 0.26469676284074456, + 0.27790374500266146, + 0.29174739635260916, + 0.3062564634936157, + 0.32146081874248356, + 0.3373914884420462, + 0.35408068032784823, + 0.3715618098091605, + 0.38986952488331694, + 0.4090397293840007, + 0.4291096043859609, + 0.4501176273114116, + 0.4721035884885754, + 0.4951086047281592, + 0.5191751295648684, + 0.5443469596111503, + 0.5706692366694879, + 0.5981884450027513, + 0.6269524031530151, + 0.6570102498563696, + 0.6884124232031824, + 0.7212106325324305, + 0.7554578221221714, + 0.7912081260648438, + 0.8285168133348019, + 0.8674402221052862, + 0.9080356826127723, + 0.9503614271946916, + 0.9944764866421055, + 1.0404405717287877, + 1.0883139386503298, + 1.1381572371354136, + 1.1900313399982856, + 1.2439971527154348, + 1.3001154016856014, + 1.3584463996608147, + 1.4190497869445606, + 1.4819842468724436, + 1.5473071939247005, + 1.6150744330410962, + 1.6853397886784782, + 1.758154701847701, + 1.8335677939662987, + 1.9116243958879198, + 1.992366040733851, + 2.075829919569668, + 2.1620482984385405, + 2.2510478961076714, + 2.342849221539145, + 2.437465870841473, + 2.534903783213679, + 2.635160456245428, + 2.7382241207377853, + 2.8440728765536223, + 2.9526737902325775, + 3.063981957094484, + 3.1779395300951667, + 3.2944747189069035, + 3.413500763743516, + 3.5349148885855217, + 3.658597240300436, + 3.7844098206326398, + 3.9121954194227215, + 4.041776558615769, + 4.172954458005504, + 4.305508034766933, + 4.439192950995478, + 4.5737407240037715, + 4.708857916558433, + 4.844225425498749, + 4.979497888477342, + 5.114303230617314, + 5.248242374036265, + 5.380889134673943, + 5.511790331696594, + 5.640466136341625, + 5.766410687361511, + 5.889093000277928, + 6.007958198295685, + 6.122429091540463, + 6.231908130351814, + 6.335779756577494, + 6.433413174247506, + 6.524165557864582, + 6.607385712343612, + 6.682418193901246, + 6.74860789555888, + 6.805305094373161, + 6.851870950881189, + 6.887683443412827, + 6.9121437124113445, + 6.924682781990761, + 6.924768618411093, + 6.9119134778866345, + 6.885681489638151, + 6.845696414185893, + 6.79164951149451, + 6.723307448298703, + 6.6405201677505, + 6.543228635988843, + 6.4314723671579275, + 6.30539660756455, + 6.165259027892349, + 6.0114357248743024, + 5.844426267384947, + 5.664857433826549, + 5.4734851788654035, + 5.271194246142391, + 5.058994727919184, + 4.8380147969292615, + 4.60948885878337, + 4.374740580245458, + 4.135160755554862, + 3.892180917030998, + 3.647245099324788, + 3.401784260081261, + 3.157200304748219, + 2.9148686286018104, + 2.676167529679926, + 2.4425354179066834, + 2.21553390741284, + 1.9968406772148908, + 1.78799103678, + 1.58997748151, + 1.40352043425, + 1.22920533545, + 1.06747447369, + 0.918618118929, + 0.782768364881, + 0.659896497268, + 0.549814741211, + 0.452183136922, + 0.366522015977, + 0.292230147481, + 0.228607916021, + 0.174884112576, + 0.130243883785, + 0.0938545280965, + 0.0648851221637, + 0.0425160758196, + 0.0259358719665, + 0.0143252580412, + 0.00683423638538, + 0.00256447897522, + 0.000577628287057, + -4.61111624871e-05, + -8.5252330595e-05, + -2.1717690642e-05, + -4.04347218775e-07, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 2, + "j": 4, + "angular_momentum": 1 + }, + { + "radial_function": [ + 0.0, + 4.195789657602644e-27, + 1.4010188222127382e-25, + 1.110280032634701e-24, + 4.883266811847047e-24, + 1.5555956934376996e-23, + 4.0410213106949534e-23, + 9.11937813592344e-23, + 1.856594422908853e-22, + 3.494006207970404e-22, + 6.180264567541877e-22, + 1.0397246581355722e-21, + 1.6782663734030781e-21, + 2.6165138943679318e-21, + 3.960499301968337e-21, + 5.8441502738968266e-21, + 8.434748264170073e-21, + 1.1939214237736161e-20, + 1.6611328190513147e-20, + 2.2760000930415338e-20, + 3.075873014405945e-20, + 4.105638777616064e-20, + 5.418950233265478e-20, + 7.07962180799257e-20, + 9.163213336953938e-20, + 1.1758824272996783e-19, + 1.4971123212678531e-19, + 1.892264040610388e-19, + 2.3756353938271748e-19, + 2.963860358938182e-19, + 3.676237005527741e-19, + 4.535096124867321e-19, + 5.566215186079471e-19, + 6.799282727600379e-19, + 8.268418833858705e-19, + 1.0012757943333725e-18, + 1.2077100889150359e-18, + 1.4512643796388632e-18, + 1.737779225422691e-18, + 2.0739070053473347e-18, + 2.467213274425833e-18, + 2.926289732127673e-18, + 3.460880050944233e-18, + 4.082019939624259e-18, + 4.8021929564028996e-18, + 5.635503741024104e-18, + 6.59787050452697e-18, + 7.70723880012237e-18, + 8.983818806421814e-18, + 1.0450348569960409e-17, + 1.2132385912235718e-17, + 1.4058631965864423e-17, + 1.6261289599996288e-17, + 1.8776460336603124e-17, + 2.1644583687258665e-17, + 2.491092325553648e-17, + 2.8626104370624634e-17, + 3.284670847950706e-17, + 3.76359300477227e-17, + 4.306430228156694e-17, + 4.9210498605141674e-17, + 5.616221749511416e-17, + 6.401715901848157e-17, + 7.288410225227322e-17, + 8.288409360160496e-17, + 9.41517570912138e-17, + 1.0683673867669386e-16, + 1.2110529786305424e-16, + 1.3714206116269052e-16, + 1.551519533271447e-16, + 1.753623238411184e-16, + 1.9802528781142135e-16, + 2.2342030220695537e-16, + 2.518570005214007e-16, + 2.8367831091953036e-16, + 3.1926388559359976e-16, + 3.590338714146865e-16, + 4.034530550185596e-16, + 4.530354185839586e-16, + 5.08349145907005e-16, + 5.700221222447532e-16, + 6.387479753249749e-16, + 7.152927097592206e-16, + 8.005019915537361e-16, + 8.95309145114933e-16, + 1.0007439308405664e-15, + 1.1179421779773429e-15, + 1.2481563539440669e-15, + 1.3927671598492795e-15, + 1.5532962492215188e-15, + 1.7314201768831114e-15, + 1.9289856948509887e-15, + 2.1480265220043667e-15, + 2.3907817282294974e-15, + 2.6597158839944935e-15, + 2.957541143310665e-15, + 3.2872414413061875e-15, + 3.652099006053514e-15, + 4.055723401496718e-15, + 4.5020833401798115e-15, + 4.99554152424944e-15, + 5.5408928002422074e-15, + 6.143405935305309e-15, + 6.808869356512737e-15, + 7.543641220357278e-15, + 8.35470421905125e-15, + 9.249725563000605e-15, + 1.0237122623364761e-14, + 1.1326134760169549e-14, + 1.2526901910190599e-14, + 1.3850550565416132e-14, + 1.5309287823447188e-14, + 1.6916504261541438e-14, + 1.868688645092683e-14, + 2.063654000135706e-14, + 2.278312411254246e-14, + 2.5145998693969433e-14, + 2.7746385213899015e-14, + 3.060754254349007e-14, + 3.3754959177980555e-14, + 3.721656334744688e-14, + 4.102295265472114e-14, + 4.520764504824737e-14, + 4.9807353078719465e-14, + 5.486228359079557e-14, + 6.041646516963396e-14, + 6.651810590288614e-14, + 7.321998422740436e-14, + 8.057987589379258e-14, + 8.866102035498153e-14, + 9.753263018942075e-14, + 1.0727044748767392e-13, + 1.1795735150088506e-13, + 1.2968402222404612e-13, + 1.4254966502879876e-13, + 1.5666280190987356e-13, + 1.7214213542309368e-13, + 1.8911749192388856e-13, + 2.0773085136027108e-13, + 2.281374714599914e-13, + 2.505071149362412e-13, + 2.75025389051789e-13, + 3.018952077777677e-13, + 3.31338387660567e-13, + 3.635973895724269e-13, + 3.9893721953692525e-13, + 4.376475031210336e-13, + 4.800447490886816e-13, + 5.264748194729736e-13, + 5.773156247968774e-13, + 6.329800648671421e-13, + 6.939192371397641e-13, + 7.606259373872129e-13, + 8.336384783324588e-13, + 9.13544855911701e-13, + 1.0009872937328817e-12, + 1.0966672005145671e-12, + 1.2013505774581704e-12, + 1.31587391622489e-12, + 1.4411506322386066e-12, + 1.5781780807042276e-12, + 1.7280452086602724e-12, + 1.8919409004567627e-12, + 2.0711630780928235e-12, + 2.2671286262624774e-12, + 2.481384214427763e-12, + 2.7156180979080213e-12, + 2.9716729858500228e-12, + 3.2515600721027647e-12, + 3.55747433302612e-12, + 3.891811207371996e-12, + 4.257184781274956e-12, + 4.6564476142749986e-12, + 5.092712353562852e-12, + 5.569375297365402e-12, + 6.0901420827663e-12, + 6.659055687050024e-12, + 7.28052695266431e-12, + 7.959367861201348e-12, + 8.700827800544559e-12, + 9.510633099787004e-12, + 1.03950301172343e-11, + 1.1360832206169072e-11, + 1.241547090404382e-11, + 1.3567051720452117e-11, + 1.4824414941465875e-11, + 1.619720189444184e-11, + 1.7695927166426305e-11, + 1.933205730577918e-11, + 2.1118096589103686e-11, + 2.3067680484800427e-11, + 2.5195677505644135e-11, + 2.7518300190908e-11, + 3.005322604953831e-11, + 3.2819729340149736e-11, + 3.5838824664270314e-11, + 3.913342343342862e-11, + 4.272850434613373e-11, + 4.665129913862975e-11, + 5.0931494976584904e-11, + 5.560145495793239e-11, + 6.069645835949426e-11, + 6.625496238514234e-11, + 7.231888733350404e-11, + 7.89339272762658e-11, + 8.614988853109758e-11, + 9.402105838864844e-11, + 1.0260660681849765e-10, + 1.1197102408585782e-10, + 1.2218459746563364e-10, + 1.333239305711938e-10, + 1.454725090716359e-10, + 1.5872131694093706e-10, + 1.7316950775604521e-10, + 1.8892513591972737e-10, + 2.0610595319241313e-10, + 2.2484027630263455e-10, + 2.452679320034076e-10, + 2.6754128647410495e-10, + 2.918263665389022e-10, + 3.183040809399318e-10, + 3.4717155051233725e-10, + 3.7864355702408554e-10, + 4.129541211618679e-10, + 4.5035822124239707e-10, + 4.911336651091564e-10, + 5.355831288940739e-10, + 5.840363774428349e-10, + 6.368526826070524e-10, + 6.944234570274595e-10, + 7.571751224565883e-10, + 8.255722336509805e-10, + 9.001208804155715e-10, + 9.813723926138223e-10, + 1.0699273751125256e-09, + 1.1664401018002767e-09, + 1.2716233009236311e-09, + 1.3862533662009023e-09, + 1.5111760317343525e-09, + 1.6473125519215085e-09, + 1.7956664312463456e-09, + 1.9573307526449606e-09, + 2.133496157927829e-09, + 2.3254595378866288e-09, + 2.534633495363714e-09, + 2.762556649682638e-09, + 3.010904857466113e-09, + 3.281503430941498e-09, + 3.576340442551516e-09, + 3.897581211974582e-09, + 4.247584081022919e-09, + 4.628917590295284e-09, + 5.044379182160735e-09, + 5.497015565917529e-09, + 5.990144891621973e-09, + 6.5273808946676994e-09, + 7.112659184248373e-09, + 7.750265867463809e-09, + 8.444868715181413e-09, + 9.201551095647026e-09, + 1.0025848921596542e-08, + 1.0923790877526985e-08, + 1.190194221843984e-08, + 1.2967452456972773e-08, + 1.4128107283164383e-08, + 1.5392385092970002e-08, + 1.676951853369752e-08, + 1.8269561510529855e-08, + 1.99034621397656e-08, + 2.1683142174704888e-08, + 2.3621583478785755e-08, + 2.573292216880235e-08, + 2.803255111149063e-08, + 3.0537231508862284e-08, + 3.3265214382613374e-08, + 3.6236372831965065e-08, + 3.947234601764421e-08, + 4.299669591742159e-08, + 4.683507797557171e-08, + 5.1015426885291984e-08, + 5.5568158838536336e-08, + 6.052639170349636e-08, + 6.592618472247075e-08, + 7.180679944463815e-08, + 7.821098379505238e-08, + 8.518528130426153e-08, + 9.278036774611565e-08, + 1.0105141759570198e-07, + 1.1005850297248612e-07, + 1.1986702787540756e-07, + 1.3054820095356976e-07, + 1.4217955008456507e-07, + 1.548454825606932e-07, + 1.6863789488048664e-07, + 1.8365683653178793e-07, + 2.0001123254724316e-07, + 2.1781967001375764e-07, + 2.3721125426380808e-07, + 2.583265407926749e-07, + 2.813185496693286e-07, + 3.0635386979329923e-07, + 3.336138607605742e-07, + 3.632959611885709e-07, + 3.95615112733033e-07, + 4.3080531010299477e-07, + 4.691212881839827e-07, + 5.108403584443092e-07, + 5.562644076426616e-07, + 6.057220734749782e-07, + 6.595711123893715e-07, + 7.182009769971874e-07, + 7.820356210306826e-07, + 8.515365526525802e-07, + 9.272061572739772e-07, + 1.009591314201626e-06, + 1.0992873329420258e-06, + 1.1969422372298442e-06, + 1.3032614274542837e-06, + 1.4190127550843697e-06, + 1.5450320452546009e-06, + 1.6822291070094848e-06, + 1.8315942744001118e-06, + 1.9942055248507193e-06, + 2.1712362261339684e-06, + 2.3639635670569026e-06, + 2.5737777322332063e-06, + 2.8021918861277004e-06, + 3.0508530384642795e-06, + 3.321553867664955e-06, + 3.6162455869283064e-06, + 3.937051945736466e-06, + 4.286284464577865e-06, + 4.666459013578209e-06, + 5.080313851930942e-06, + 5.530829256943817e-06, + 6.021248882321612e-06, + 6.555102998103692e-06, + 7.136233776910377e-06, + 7.76882280621655e-06, + 8.457421023959952e-06, + 9.206981286243705e-06, + 1.0022893803505936e-05, + 1.0911024690743868e-05, + 1.1877757911119164e-05, + 1.2930040904901578e-05, + 1.4075434230201334e-05, + 1.5322165566416358e-05, + 1.6679188459977673e-05, + 1.815624623200603e-05, + 1.9763941494602234e-05, + 2.1513811770062193e-05, + 2.3418411745416904e-05, + 2.5491402739554085e-05, + 2.774765001897355e-05, + 3.0203328638789385e-05, + 3.287603856338463e-05, + 3.57849298634111e-05, + 3.895083888042934e-05, + 4.2396436305085274e-05, + 4.6146388207985243e-05, + 5.0227531156663404e-05, + 5.4669062631278786e-05, + 5.9502748081238964e-05, + 6.476314606013624e-05, + 7.048785300752966e-05, + 7.67177693873033e-05, + 8.349738902416823e-05, + 9.087511365362972e-05, + 9.890359486736341e-05, + 0.00010764010581349576, + 0.00011714694522869162, + 0.0001274918765936055, + 0.00013874860542194628, + 0.00015099729799920118, + 0.00016432514509555127, + 0.0001788269745532188, + 0.00019460591692686168, + 0.0002117741287157929, + 0.00023045357814210758, + 0.0002507768988007731, + 0.0002728883170024774, + 0.00029694465906810786, + 0.00032311644538615957, + 0.00035158907866077513, + 0.00038256413424514295, + 0.00041626076134376245, + 0.00045291720434402694, + 0.0004927924545020552, + 0.00053616804294611, + 0.0005833499869051657, + 0.0006346709020057962, + 0.0006904922945527242, + 0.0007512070489350509, + 0.0008172421262621224, + 0.0008890614919961379, + 0.0009671692914879946, + 0.0010521132939236314, + 0.0011444886269866726, + 0.0012449418259515678, + 0.0013541752232949335, + 0.0014729517063860255, + 0.001602099873536174, + 0.0017425196206772291, + 0.0018951881934641808, + 0.0020611667424792505, + 0.002241607421898506, + 0.0024377610750754486, + 0.002650985553737251, + 0.00288275472122202, + 0.003134668193316089, + 0.0034084618750294215, + 0.0037060193549149304, + 0.004029384223801163, + 0.004380773389098666, + 0.004762591460552942, + 0.005177446289527771, + 0.005628165748352437, + 0.00611781584247985, + 0.006649720255523793, + 0.007227481429979996, + 0.0078550032994069, + 0.008536515788116884, + 0.009276601204017566, + 0.010080222662240566, + 0.010952754676649959, + 0.011900016068869384, + 0.012928305356078085, + 0.014044438774200186, + 0.015255791121761664, + 0.016570339588101012, + 0.017996710775922575, + 0.01954423109714108, + 0.02122298075043332, + 0.02304385149738831, + 0.025018608442777143, + 0.02715995604836293, + 0.029481608600741047, + 0.031998365355500345, + 0.034726190599714525, + 0.03768229884181621, + 0.040885245363592365, + 0.04435502234249622, + 0.04811316075825101, + 0.05218283825905517, + 0.05658899317959337, + 0.06135844484851606, + 0.06652002029565332, + 0.07210468746816864, + 0.07814569495958826, + 0.08467871827085013, + 0.09174201249109787, + 0.09937657128420296, + 0.10762629191886632, + 0.11653814599775665, + 0.1261623554969386, + 0.1365525734613796, + 0.1477660686804984, + 0.1598639134574691, + 0.1729111733810093, + 0.18697709782009705, + 0.20213530965074353, + 0.21846399243422643, + 0.23604607302149141, + 0.25496939721640355, + 0.2753268958431382, + 0.297216738194658, + 0.3207424694058754, + 0.34601312796328637, + 0.3731433391303571, + 0.40225337949553286, + 0.43346920759347923, + 0.46692245487587397, + 0.5027503708835516, + 0.5410957161310566, + 0.5821065954565314, + 0.6259362244288614, + 0.6727426207392266, + 0.7226882123649304, + 0.7759393537197372, + 0.8326657410227082, + 0.8930397176586538, + 0.9572354607670721, + 1.02542803966293, + 1.097792337742804, + 1.1745018292926164, + 1.2557272034578086, + 1.3416348285852318, + 1.4323850505831948, + 1.528130320667732, + 1.6290131487770994, + 1.7351638805500318, + 1.8466982973063186, + 1.9637150401578851, + 2.086292860746583, + 2.214487703269589, + 2.3483296229509194, + 2.4878195479820255, + 2.6329258924265235, + 2.783581027541075, + 2.939677619214009, + 3.1010648381017134, + 3.267544447864297, + 3.438866774778166, + 3.614726560997807, + 3.7947587019877433, + 3.9785338680026103, + 4.165554012414651, + 4.355247774311042, + 4.546965793665024, + 4.739975975287559, + 4.933458765230143, + 5.126502543480914, + 5.318099291605361, + 5.5071407669232295, + 5.692415507049392, + 5.872607100248484, + 6.04629428831124, + 6.21195361126232, + 6.367965450901968, + 6.5126244646955564, + 6.6441555011177185, + 6.76073611830767, + 6.8605267497083275, + 6.9417093200892, + 7.002534657096663, + 7.041378306803171, + 7.056803298230653, + 7.047626986140625, + 7.012987357887137, + 6.952402222912749, + 6.865812736562585, + 6.75360113095232, + 6.6165719270224805, + 6.455887102893456, + 6.272949717427197, + 6.0692384534100094, + 5.846108409966908, + 5.6045915526121055, + 5.345252396578245, + 5.068176999309913, + 4.77318822608313, + 4.460373697561227, + 4.1309640394183385, + 3.7884816626685387, + 3.439870032004375, + 3.0960097281597454, + 2.77070408369123, + 2.4771268916940534, + 2.221509344724558, + 1.9969298603291776, + 1.78799103678, + 1.58997748151, + 1.40352043425, + 1.22920533545, + 1.06747447369, + 0.918618118929, + 0.782768364881, + 0.659896497268, + 0.549814741211, + 0.452183136922, + 0.366522015977, + 0.292230147481, + 0.228607916021, + 0.174884112576, + 0.130243883785, + 0.0938545280965, + 0.0648851221637, + 0.0425160758196, + 0.0259358719665, + 0.0143252580412, + 0.00683423638538, + 0.00256447897522, + 0.000577628287057, + -4.61111624871e-05, + -8.5252330595e-05, + -2.1717690642e-05, + -4.04347218775e-07, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 2, + "j": 4, + "angular_momentum": 3 + }, + { + "radial_function": [ + 0.0, + 5.026946152142888e-16, + 4.125555084882962e-15, + 1.428484478984565e-14, + 3.474099723152395e-14, + 6.962321077630565e-14, + 1.23455571048925e-13, + 2.0118478936820952e-13, + 3.082096505457443e-13, + 4.5041226848966893e-13, + 6.341912536561912e-13, + 8.664969019755846e-13, + 1.154868521071984e-12, + 1.5074740160402166e-12, + 1.9331518635146194e-12, + 2.4414556103401986e-12, + 3.042701040136783e-12, + 3.748016159535409e-12, + 4.569394163359524e-12, + 5.519749547851229e-12, + 6.612977549377837e-12, + 7.864017096483207e-12, + 9.288917472415384e-12, + 1.0904908898069337e-11, + 1.2730477254118256e-11, + 1.478544317468815e-11, + 1.7091045758719205e-11, + 1.9670031154611863e-11, + 2.254674629289597e-11, + 2.5747238051768307e-11, + 2.9299358159971266e-11, + 3.323287415484744e-11, + 3.7579586732091704e-11, + 4.237345384257128e-11, + 4.765072190926947e-11, + 5.345006455969487e-11, + 5.981272928717891e-11, + 6.678269248122648e-11, + 7.440682328873208e-11, + 8.273505678940053e-11, + 9.18205770038235e-11, + 1.0172001026915913e-10, + 1.1249362955672716e-10, + 1.2420557032851594e-10, + 1.3692405857059659e-10, + 1.5072165166287406e-10, + 1.656754927974217e-10, + 1.8186757966955278e-10, + 1.9938504826423644e-10, + 2.1832047247869967e-10, + 2.387721805481224e-10, + 2.6084458912926443e-10, + 2.846485559636262e-10, + 3.1030175227797547e-10, + 3.379290558101696e-10, + 3.676629656988349e-10, + 3.996440404270731e-10, + 4.340213600090445e-10, + 4.709530137592133e-10, + 5.106066150381778e-10, + 5.531598444574747e-10, + 5.988010230456964e-10, + 6.477297169778515e-10, + 7.00157375686493e-10, + 7.563080049346755e-10, + 8.164188770473369e-10, + 8.807412800128828e-10, + 9.495413077197334e-10, + 1.023100693494192e-09, + 1.1017176892510186e-09, + 1.1857079927903724e-09, + 1.2754057257530875e-09, + 1.3711644648692525e-09, + 1.473358329695918e-09, + 1.5823831293863593e-09, + 1.6986575722028078e-09, + 1.8226245406549728e-09, + 1.954752436011652e-09, + 2.0955365959862845e-09, + 2.245500789327021e-09, + 2.4051987915976953e-09, + 2.5752160461594857e-09, + 2.7561714155183492e-09, + 2.948719027255423e-09, + 3.1535502199224633e-09, + 3.371395594117678e-09, + 3.6030271746357035e-09, + 3.849260688901208e-09, + 4.1109579690038734e-09, + 4.389029482824067e-09, + 4.684437001696152e-09, + 4.998196412228408e-09, + 5.3313806786192014e-09, + 5.68512296559364e-09, + 6.060619928096876e-09, + 6.459135178744538e-09, + 6.8820029410674024e-09, + 7.33063189929517e-09, + 7.806509254217132e-09, + 8.31120499734137e-09, + 8.846376413370214e-09, + 9.413772825133528e-09, + 1.0015240591129416e-08, + 1.0652728372331936e-08, + 1.1328292679389163e-08, + 1.2044103717674823e-08, + 1.2802451543925188e-08, + 1.3605752552700545e-08, + 1.4456556309111698e-08, + 1.5357552745677333e-08, + 1.6311579744938162e-08, + 1.7321631124928697e-08, + 1.8390865051459633e-08, + 1.9522612899203302e-08, + 2.0720388583942265e-08, + 2.1987898392843527e-08, + 2.332905133799278e-08, + 2.4747970061162044e-08, + 2.6249002318651773e-08, + 2.7836733076772466e-08, + 2.9515997252230434e-08, + 3.129189312698073e-08, + 3.3169796478970734e-08, + 3.515537546080683e-08, + 3.7254606271629614e-08, + 3.9473789657589e-08, + 4.181956829100115e-08, + 4.429894507043626e-08, + 4.691930239139767e-08, + 4.968842243869151e-08, + 5.261450855557837e-08, + 5.570620774433339e-08, + 5.897263436014192e-08, + 6.242339505842788e-08, + 6.60686150645562e-08, + 6.991896583390925e-08, + 7.398569417677441e-08, + 7.828065292122511e-08, + 8.281633320316512e-08, + 8.760589845902953e-08, + 9.266322021982439e-08, + 9.800291579437176e-08, + 1.0364038794663036e-07, + 1.0959186666664956e-07, + 1.1587445315237882e-07, + 1.2250616610850714e-07, + 1.2950599049603823e-07, + 1.3689392885257613e-07, + 1.4469105531936345e-07, + 1.529195725221568e-07, + 1.6160287146057695e-07, + 1.7076559452800703e-07, + 1.804337019062452e-07, + 1.9063454139514306e-07, + 2.013969219920104e-07, + 2.1275119129478618e-07, + 2.2472931701657788e-07, + 2.3736497277990028e-07, + 2.5069362842416335e-07, + 2.647526451137727e-07, + 2.795813753932063e-07, + 2.952212685398404e-07, + 3.1171598149155553e-07, + 3.291114955343723e-07, + 3.474562392377476e-07, + 3.668012177695639e-07, + 3.8720014904803475e-07, + 4.0870960706137115e-07, + 4.313891727317375e-07, + 4.5530159267308617e-07, + 4.805129463542503e-07, + 5.070928220093487e-07, + 5.351145018068894e-07, + 5.646551567433067e-07, + 5.957960517906499e-07, + 6.286227618492639e-07, + 6.632253989680925e-07, + 6.996988515798392e-07, + 7.381430363062669e-07, + 7.786631628582105e-07, + 8.213700130619025e-07, + 8.663802343229628e-07, + 9.138166486242472e-07, + 9.63808577758771e-07, + 1.0164921855056715e-06, + 1.07201083790599e-06, + 1.1305154823408182e-06, + 1.1921650465857782e-06, + 1.257126858738893e-06, + 1.3255770891948509e-06, + 1.397701215782493e-06, + 1.473694513415213e-06, + 1.5537625691785398e-06, + 1.638121824726046e-06, + 1.7270001468825482e-06, + 1.820637428208922e-06, + 1.9192862192263476e-06, + 2.02321239351058e-06, + 2.1326958477615807e-06, + 2.2480312387279e-06, + 2.3695287584675874e-06, + 2.497514950383254e-06, + 2.63233356801276e-06, + 2.7743464787769864e-06, + 2.9239346150575296e-06, + 3.081498975240352e-06, + 3.2474616768800763e-06, + 3.422267065287416e-06, + 3.606382880192521e-06, + 3.8003014832119012e-06, + 4.00454114991076e-06, + 4.2196474293234635e-06, + 4.446194574627013e-06, + 4.684787048898917e-06, + 4.9360611093685545e-06, + 5.200686474997443e-06, + 5.4793680809385505e-06, + 5.772847924986669e-06, + 6.08190701080494e-06, + 6.4073673924089e-06, + 6.750094326063351e-06, + 7.110998534354104e-06, + 7.491038589169708e-06, + 7.891223418766348e-06, + 8.31261494643722e-06, + 8.756330866876635e-06, + 9.223547567980419e-06, + 9.71550320514128e-06, + 1.0233500936451457e-05, + 1.0778912327388936e-05, + 1.1353180932692981e-05, + 1.1957826066316253e-05, + 1.2594446767889641e-05, + 1.3264725976711816e-05, + 1.3970434924304264e-05, + 1.4713437755392082e-05, + 1.5495696391827687e-05, + 1.6319275649571098e-05, + 1.7186348623364732e-05, + 1.8099202352901488e-05, + 1.9060243785181584e-05, + 2.0072006047469593e-05, + 2.113715504902536e-05, + 2.2258496426833637e-05, + 2.3438982854757767e-05, + 2.468172173357072e-05, + 2.5989983283463957e-05, + 2.7367209058451856e-05, + 2.8817020905981656e-05, + 3.0343230393211644e-05, + 3.1949848726726705e-05, + 3.364109718917827e-05, + 3.542141812058644e-05, + 3.729548647421496e-05, + 3.9268221972642806e-05, + 4.134480190184453e-05, + 4.35306745693996e-05, + 4.583157346753917e-05, + 4.8253532173418865e-05, + 5.080290002699255e-05, + 5.348635862765864e-05, + 5.63109391901252e-05, + 5.928404080559309e-05, + 6.241344965584861e-05, + 6.570735922811752e-05, + 6.91743915851196e-05, + 7.282361974374886e-05, + 7.66645912184961e-05, + 8.070735279417603e-05, + 8.496247658858734e-05, + 8.944108747437891e-05, + 9.415489192665643e-05, + 9.911620837851201e-05, + 0.00010433799915185645, + 0.00010983390405639049, + 0.00011561827573715756, + 0.00012170621685839985, + 0.00012811361923171998, + 0.0001348572049723552, + 0.000141954569804505, + 0.0001494242286164779, + 0.00015728566338601478, + 0.00016555937360659793, + 0.0001742669293226222, + 0.00018343102694127377, + 0.00019307554792899102, + 0.00020322562057197946, + 0.00021390768493920466, + 0.00022514956124684588, + 0.0002369805217144156, + 0.0002494313662433307, + 0.0002625345019457986, + 0.0002763240268470087, + 0.00029083581792952086, + 0.0003061076237430546, + 0.00032217916182153953, + 0.00033909222114018097, + 0.000356890769940851, + 0.00037562106908985664, + 0.00039533179132586715, + 0.0004160741467479201, + 0.00043790201471253907, + 0.0004608720826576819, + 0.00048504399206299935, + 0.0005104804919826263, + 0.0005372476005216766, + 0.0005654147747066064, + 0.0005950550890648851, + 0.0006262454235641488, + 0.0006590666611288725, + 0.0006936038955183331, + 0.0007299466497565901, + 0.0007681891060794719, + 0.0008084303475425156, + 0.0008507746121970373, + 0.0008953315604089283, + 0.0009422165559210518, + 0.000991550961367545, + 0.0010434624490833827, + 0.0010980853279017743, + 0.001155560886749219, + 0.0012160377559774522, + 0.0012796722871782887, + 0.001346628952611516, + 0.0014170807651203063, + 0.001491209719627733, + 0.0015692072571839833, + 0.0016512747529926525, + 0.001737624029300275, + 0.0018284778945155255, + 0.001924070710190394, + 0.002024648986614589, + 0.0021304720091410044, + 0.002241812496386991, + 0.0023589572920273555, + 0.002482208091834204, + 0.0026118822078412393, + 0.0027483133713187714, + 0.002891852576509691, + 0.003042868967571265, + 0.0032017507699810153, + 0.003368906269809489, + 0.0035447648419336245, + 0.003729778030913673, + 0.00392442068600897, + 0.004129192153707932, + 0.004344617530475008, + 0.004571248978250632, + 0.004809667106557368, + 0.005060482423625813, + 0.0053243368605375, + 0.005601905371729702, + 0.005893897615205453, + 0.006201059717184458, + 0.006524176124054816, + 0.006864071547268179, + 0.007221613003964952, + 0.007597711959594122, + 0.007993326576157901, + 0.008409464071384017, + 0.008847183194770868, + 0.009307596824655023, + 0.009791874693383657, + 0.010301246245724515, + 0.010837003636723599, + 0.011400504876042413, + 0.011993177124678392, + 0.012616520151702624, + 0.013272109958329871, + 0.013961602576202195, + 0.01468673804836739, + 0.015449344601241326, + 0.016251343014778007, + 0.01709475120197152, + 0.017981689003912754, + 0.01891438321231735, + 0.019895172828146974, + 0.020926514565882015, + 0.022010988615278525, + 0.023151304670019916, + 0.02435030823575627, + 0.02561098722751262, + 0.026936478868456497, + 0.028330076904590294, + 0.02979523914272609, + 0.03133559533078646, + 0.03295495538770287, + 0.03465731799985276, + 0.03644687959634087, + 0.03832804371758197, + 0.04030543079021925, + 0.04238388832263028, + 0.044568501538755995, + 0.046864604458369624, + 0.04927779144511583, + 0.05181392923315131, + 0.05447916944650147, + 0.057279961630079396, + 0.06022306679982929, + 0.06331557153437385, + 0.06656490261308576, + 0.06997884222134158, + 0.07356554373260653, + 0.07733354807761582, + 0.08129180071536168, + 0.085449669214649, + 0.08981696145491194, + 0.09440394445321293, + 0.09922136382813437, + 0.10428046389687728, + 0.10959300841782271, + 0.11517130196893707, + 0.12102821196678004, + 0.1271771913188657, + 0.1336323016947306, + 0.14040823741419975, + 0.14752034992746788, + 0.15498467286502862, + 0.1628179476482334, + 0.17103764958998588, + 0.17966201450408817, + 0.1887100657334118, + 0.1982016415410817, + 0.20815742285775113, + 0.2185989612589116, + 0.22954870710459307, + 0.24103003780103746, + 0.25306728598521916, + 0.26568576765710156, + 0.2789118099425813, + 0.29277277857222295, + 0.3072971047303198, + 0.3225143111578821, + 0.33845503737668226, + 0.35515106372169936, + 0.3726353340251549, + 0.3909419766534535, + 0.41010632357922167, + 0.43016492729163924, + 0.4511555750702394, + 0.4731173003517893, + 0.49609039073447675, + 0.5201163922442182, + 0.5452381092875825, + 0.5714995999141711, + 0.5989461657643298, + 0.6276243360688596, + 0.6575818452238623, + 0.6888676030668864, + 0.7215316573189907, + 0.7556251472326914, + 0.7912002478120211, + 0.8283101035922626, + 0.8670087510183437, + 0.9073510287022105, + 0.9493924741737036, + 0.9931892062556874, + 1.0387977919192248, + 1.0862750963524441, + 1.1356781150107909, + 1.1870637864296103, + 1.240488784403151, + 1.296009288218474, + 1.3536807294732218, + 1.4135575141253238, + 1.4756927183560484, + 1.5401377566791468, + 1.6069420209647756, + 1.6761524890359236, + 1.7478133012177663, + 1.8219653038358703, + 1.8986455582174575, + 1.9778868140409336, + 2.0597169463219496, + 2.1441583548384986, + 2.2312273256672093, + 2.320933354207484, + 2.413278429847102, + 2.508256282234443, + 2.605851590009943, + 2.706039152714039, + 2.808783027961392, + 2.9140356352838075, + 3.021736830048717, + 3.1318129504841576, + 3.244175842090509, + 3.358721864808699, + 3.4753308885251437, + 3.5938652843483894, + 3.7141689196308194, + 3.836066166118029, + 3.959360931831557, + 4.083835728685299, + 4.209250788953056, + 4.335343245814594, + 4.461826393751103, + 4.588389046886729, + 4.714695014558694, + 4.840382714599882, + 4.965064946693043, + 5.088328849146723, + 5.209736063699016, + 5.328823133559978, + 5.44510216114089, + 5.55806175189084, + 5.667168270350541, + 5.771867434660762, + 5.871586274142089, + 5.965735473074628, + 6.05371212143533, + 6.134902890163698, + 6.208687644695893, + 6.274443505611889, + 6.331549359737552, + 6.379390818604584, + 6.417365613837305, + 6.444889411447694, + 6.461402018359348, + 6.466373945954823, + 6.459313286566834, + 6.439772850210005, + 6.407357500594224, + 6.361731621847057, + 6.302626640550141, + 6.229848521426407, + 6.143285149273036, + 6.04291350352112, + 5.928806524097656, + 5.801139556254039, + 5.660196244975362, + 5.506373724047416, + 5.340186906603195, + 5.162271630636243, + 4.973386342269626, + 4.774411912513543, + 4.566349087195702, + 4.350312980819492, + 4.12752397300332, + 3.899294402074435, + 3.667010647657682, + 3.432110652421101, + 3.1960577696835424, + 2.960313139960788, + 2.726310615987209, + 2.495440352728914, + 2.2690488149668053, + 2.048462321753067, + 1.835034520143507, + 1.6301978609915315, + 1.4354512534788149, + 1.25212371032, + 1.08101844292, + 0.922661533676, + 0.777427387203, + 0.645532710313, + 0.527030717719, + 0.421808591716, + 0.329588955775, + 0.249936081131, + 0.182267364119, + 0.125870272768, + 0.0799244278222, + 0.0435277575971, + 0.0157247674106, + -0.00446595076521, + -0.0180286451231, + -0.0259356820669, + -0.0291444642443, + -0.0286070049596, + -0.0252889255546, + -0.0201877775172, + -0.0143319039928, + -0.00873264221704, + -0.00426155751172, + -0.00144477444926, + -0.000236602186547, + -3.35654042743e-06, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 2, + "j": 5, + "angular_momentum": 1 + }, + { + "radial_function": [ + 0.0, + 3.984175760880863e-27, + 1.3303586899034052e-25, + 1.0542832588853146e-24, + 4.636980128504204e-24, + 1.477139504431821e-23, + 3.837213127718336e-23, + 8.659443939877553e-23, + 1.7629574171234507e-22, + 3.31778663331909e-22, + 5.868564035693503e-22, + 9.87286332014003e-22, + 1.5936233107260454e-21, + 2.4845504867345164e-21, + 3.760752232049009e-21, + 5.549401606029679e-21, + 8.00934325265265e-21, + 1.1337062115223544e-20, + 1.5773538841222226e-20, + 2.161210437754186e-20, + 2.9207419122172865e-20, + 3.8985716244061053e-20, + 5.145646453048324e-20, + 6.722562355657489e-20, + 8.701068320700845e-20, + 1.1165770086155251e-19, + 1.4216057306747555e-19, + 1.7968280441470998e-19, + 2.2558206501341867e-19, + 2.814378594968655e-19, + 3.4908266535692357e-19, + 4.3063693677697303e-19, + 5.285484124678456e-19, + 6.45636212664112e-19, + 7.851402617772233e-19, + 9.507766298193967e-19, + 1.1467994479081412e-18, + 1.3780701218167779e-18, + 1.6501346429262542e-18, + 1.969309878776958e-18, + 2.3427798169780424e-18, + 2.7787028361845383e-18, + 3.2863311885218376e-18, + 3.876143998757202e-18, + 4.5599952191167604e-18, + 5.351278124382193e-18, + 6.265108093489525e-18, + 7.31852559891028e-18, + 8.530721522543655e-18, + 9.923287121650515e-18, + 1.1520491213613618e-17, + 1.3349587394606891e-17, + 1.5441154387888622e-17, + 1.7829472941689397e-17, + 2.0552943008121224e-17, + 2.3654545329089296e-17, + 2.718235195445298e-17, + 3.1190090656145545e-17, + 3.573776869826305e-17, + 4.0892361957598566e-17, + 4.6728575978343225e-17, + 5.332968618036524e-17, + 6.078846514547032e-17, + 6.920820569763788e-17, + 7.870384928847128e-17, + 8.940323020441831e-17, + 1.0144844703443422e-16, + 1.149973740155487e-16, + 1.3022532605550595e-16, + 1.4732689256320485e-16, + 1.6651795669337653e-16, + 1.8803791817322923e-16, + 2.1215213961024167e-16, + 2.39154638189159e-16, + 2.69371046555172e-16, + 3.0316186921134956e-16, + 3.409260629978746e-16, + 3.831049731212734e-16, + 4.301866591628608e-16, + 4.827106486727161e-16, + 5.41273159629645e-16, + 6.065328367737587e-16, + 6.792170514141457e-16, + 7.601288185468398e-16, + 8.501543905328106e-16, + 9.502715919929712e-16, + 1.0615589668344176e-15, + 1.1852058145117432e-15, + 1.3225232007269251e-15, + 1.4749560346928183e-15, + 1.644096314498126e-15, + 1.8316976515623526e-15, + 2.0396911945284663e-15, + 2.2702030862067997e-15, + 2.5255735969099004e-15, + 2.808378093663922e-15, + 3.1214500173822864e-15, + 3.4679060575741595e-15, + 3.851173730497329e-15, + 4.275021587417694e-15, + 4.743592298412715e-15, + 5.2614388828294255e-15, + 5.833564378529488e-15, + 6.4654652743518906e-15, + 7.163179054359897e-15, + 7.93333623999675e-15, + 8.783217347355468e-15, + 9.720815219069146e-15, + 1.0754903229787217e-14, + 1.189510991049458e-14, + 1.3152000590667754e-14, + 1.4537166705262e-14, + 1.606332348032344e-14, + 1.774441677266596e-14, + 1.959573990869951e-14, + 2.1634061449786964e-14, + 2.387776489210556e-14, + 2.6347001403259267e-14, + 2.906385679773999e-14, + 3.2052534063473375e-14, + 3.533955287568598e-14, + 3.895396765308224e-14, + 4.2927605872937665e-14, + 4.7295328495661476e-14, + 5.209531454162324e-14, + 5.73693720229931e-14, + 6.316327766208596e-14, + 6.952714802580039e-14, + 7.651584495630579e-14, + 8.418941843741245e-14, + 9.261359032511809e-14, + 1.0186028267296932e-13, + 1.1200819473391461e-13, + 1.231434330759e-13, + 1.3536019966798132e-13, + 1.4876154322043187e-13, + 1.634601795502331e-13, + 1.795793872475756e-13, + 1.9725398553147039e-13, + 2.1663140173879217e-13, + 2.378728366361593e-13, + 2.611545364234774e-13, + 2.866691811491073e-13, + 3.146274000896066e-13, + 3.4525942565556765e-13, + 3.78816898349453e-13, + 4.1557483653621804e-13, + 4.558337859300934e-13, + 4.999221650893556e-13, + 5.481988247042726e-13, + 6.010558400728675e-13, + 6.589215576533419e-13, + 7.222639191761102e-13, + 7.915940876860796e-13, + 8.674704036810912e-13, + 9.50502700371963e-13, + 1.041357011094375e-12, + 1.140760703961855e-12, + 1.2495080823800047e-12, + 1.3684664938877045e-12, + 1.4985829923247155e-12, + 1.6408916039553703e-12, + 1.7965212520449143e-12, + 1.966704398224495e-12, + 2.152786466970498e-12, + 2.3562361218699844e-12, + 2.5786564715260052e-12, + 2.8217972885360506e-12, + 3.0875683327245516e-12, + 3.378053877411963e-12, + 3.6955285480521145e-12, + 4.042474590069498e-12, + 4.4216006949639815e-12, + 4.835862524449863e-12, + 5.2884850854310785e-12, + 5.782987122266726e-12, + 6.323207705878607e-12, + 6.9133352191997205e-12, + 7.557938952996137e-12, + 8.262003543895766e-12, + 9.030966515380384e-12, + 9.870759192664327e-12, + 1.0787851299762007e-11, + 1.1789299566977635e-11, + 1.2882800705236591e-11, + 1.4076749143785507e-11, + 1.5380299952966163e-11, + 1.680343742032163e-11, + 1.8357049782944878e-11, + 2.005301066879899e-11, + 2.1904267846487775e-11, + 2.392493994095459e-11, + 2.6130421818286642e-11, + 2.8537499429191336e-11, + 3.11644749427465e-11, + 3.403130309760825e-11, + 3.7159739777779223e-11, + 4.057350389169206e-11, + 4.4298453754747796e-11, + 4.8362779273517444e-11, + 5.279721132767598e-11, + 5.763524989995958e-11, + 6.291341262325026e-11, + 6.867150556606365e-11, + 7.495291824203273e-11, + 8.18049450122196e-11, + 8.927913521566664e-11, + 9.743167461564514e-11, + 1.0632380094553788e-10, + 1.1602225658024734e-10, + 1.2659978167309476e-10, + 1.3813565134166556e-10, + 1.5071626083702893e-10, + 1.6443576298557575e-10, + 1.793967625333896e-10, + 1.9571107250584404e-10, + 2.1350053806104787e-10, + 2.3289793388336056e-10, + 2.5404794166856106e-10, + 2.7710821479496565e-10, + 3.0225053800315373e-10, + 3.2966209048530855e-10, + 3.595468216546621e-10, + 3.9212694954777253e-10, + 4.2764459285496995e-10, + 4.663635484106324e-10, + 5.085712271328793e-10, + 5.545807624650585e-10, + 6.047333067050876e-10, + 6.594005319579827e-10, + 7.189873537993929e-10, + 7.839348976195951e-10, + 8.547237290917091e-10, + 9.318773723263127e-10, + 1.0159661413213035e-09, + 1.1076113123764619e-09, + 1.2074896680906433e-09, + 1.3163384456636729e-09, + 1.4349607256062843e-09, + 1.5642312999810275e-09, + 1.705103062791511e-09, + 1.8586139687589046e-09, + 2.0258946112706495e-09, + 2.208176474223153e-09, + 2.406800917845433e-09, + 2.623228963452736e-09, + 2.859051948372973e-09, + 3.1160031280561666e-09, + 3.3959703097055867e-09, + 3.701009608688443e-09, + 4.033360427875646e-09, + 4.395461768044712e-09, + 4.789969987640049e-09, + 5.219778140884193e-09, + 5.688037033347387e-09, + 6.198178148882449e-09, + 6.7539386123272435e-09, + 7.35938837006466e-09, + 8.01895978415827e-09, + 8.737479854661524e-09, + 9.520205303459272e-09, + 1.037286077285355e-08, + 1.1301680415516586e-08, + 1.2313453176746222e-08, + 1.3415572095909519e-08, + 1.461608798422659e-08, + 1.5923767866481594e-08, + 1.7348158608430382e-08, + 1.8899656191048447e-08, + 2.0589581131026894e-08, + 2.243026059314761e-08, + 2.443511778596369e-08, + 2.6618769289617404e-08, + 2.8997131014096197e-08, + 3.1587533557395005e-08, + 3.440884779385496e-08, + 3.7481621597349796e-08, + 4.082822869202606e-08, + 4.447303069637133e-08, + 4.844255353717546e-08, + 5.276567950055706e-08, + 5.7473856306665337e-08, + 6.260132472049328e-08, + 6.818536632687589e-08, + 7.42665732751319e-08, + 8.088914191568724e-08, + 8.810119246293066e-08, + 9.595511697464099e-08, + 1.0450795817870502e-07, + 1.1382182181237428e-07, + 1.2396432555417594e-07, + 1.3500908765556699e-07, + 1.470362588810101e-07, + 1.6013310155236915e-07, + 1.7439461986275675e-07, + 1.8992424599969548e-07, + 2.0683458699794316e-07, + 2.2524823776114187e-07, + 2.452986659916943e-07, + 2.6713117545546143e-07, + 2.9090395456301495e-07, + 3.1678921763920186e-07, + 3.449744472849902e-07, + 3.7566374659909375e-07, + 4.090793110460765e-07, + 4.454630305211519e-07, + 4.850782331729318e-07, + 5.282115833462452e-07, + 5.75175147545307e-07, + 6.2630864287855e-07, + 6.819818845349257e-07, + 7.425974493376059e-07, + 8.08593575131909e-07, + 8.804473160978969e-07, + 9.586779770831362e-07, + 1.043850851481703e-06, + 1.1365812893127795e-06, + 1.2375391246269935e-06, + 1.3474534941485949e-06, + 1.4671180814930866e-06, + 1.5973968244689594e-06, + 1.7392301264807465e-06, + 1.8936416161130604e-06, + 2.0617455036482314e-06, + 2.244754586843999e-06, + 2.443988963305782e-06, + 2.6608855113562933e-06, + 2.8970082078627854e-06, + 3.1540593558284546e-06, + 3.4338918020954e-06, + 3.7385222332755012e-06, + 4.070145642772429e-06, + 4.431151074013411e-06, + 4.824138750896494e-06, + 5.251938717784217e-06, + 5.717631121634495e-06, + 6.224568281014161e-06, + 6.776398698360442e-06, + 7.377093186162293e-06, + 8.030973294437425e-06, + 8.742742237757781e-06, + 9.517518546299494e-06, + 1.0360872674145909e-05, + 1.1278866830113486e-05, + 1.2278098308367135e-05, + 1.3365746628849275e-05, + 1.4549624820792925e-05, + 1.5838235209805568e-05, + 1.724083010702757e-05, + 1.876747782461679e-05, + 2.0429134486987668e-05, + 2.2237722143427912e-05, + 2.4206213730318503e-05, + 2.634872548702248e-05, + 2.868061746803356e-05, + 3.1218602867856776e-05, + 3.398086691526026e-05, + 3.698719618338288e-05, + 4.025911921404614e-05, + 4.3820059443197107e-05, + 4.769550150390928e-05, + 5.191317205863497e-05, + 5.650323643545304e-05, + 6.149851243346884e-05, + 6.693470278708529e-05, + 7.285064791297134e-05, + 7.928860068877521e-05, + 8.629452517765975e-05, + 9.39184213709954e-05, + 0.00010221467819018933, + 0.00011124245719511887, + 0.00012106610965051955, + 0.00013175562980939772, + 0.00014338714756297454, + 0.00015604346380470278, + 0.00016981463221273365, + 0.00018479859141961745, + 0.00020110185188010454, + 0.00021884024214235723, + 0.0002381397195811849, + 0.00025913725112179897, + 0.0002819817698986644, + 0.00030683521431868827, + 0.00033387365658340884, + 0.00036328852816840996, + 0.0003952879506022559, + 0.0004300981803402091, + 0.0004679651774439218, + 0.00050915630847954, + 0.0005539621949432983, + 0.000602698719412155, + 0.0006557092026350915, + 0.0007133667659455011, + 0.0007760768942883688, + 0.0008442802167351044, + 0.0009184555224405277, + 0.000999123031516205, + 0.0010868479420016912, + 0.0011822442754519389, + 0.0012859790459121417, + 0.0013987767784491, + 0.0015214244059886816, + 0.0016547765750970808, + 0.0017997613937392597, + 0.0019573866567822048, + 0.002128746587555852, + 0.002315029136718115, + 0.002517523882743565, + 0.0027376305818941943, + 0.0029768684184966012, + 0.0032368860108800725, + 0.003519472231423099, + 0.003826567904142748, + 0.0041602784473219485, + 0.0045228875331284795, + 0.00491687184205795, + 0.005344916994235649, + 0.005809934745485497, + 0.006315081542995118, + 0.006863778537967054, + 0.007459733164920738, + 0.008106962397519348, + 0.00880981779984203, + 0.009573012503346225, + 0.010401650239165776, + 0.011301256567211431, + 0.01227781245445799, + 0.013337790350282106, + 0.01448819293377669, + 0.015736594687295956, + 0.017091186494262663, + 0.018560823429565183, + 0.020155075938597482, + 0.021884284608745745, + 0.023759618725986184, + 0.02579313883156327, + 0.027997863484789182, + 0.030387840439204488, + 0.03297822245748209, + 0.03578534795849686, + 0.038826826713621455, + 0.042121630783247675, + 0.04569019088905296, + 0.0495544983797214, + 0.053738212962637345, + 0.058266776320889, + 0.0631675317073475, + 0.06846984960483093, + 0.07420525943945713, + 0.08040758734655341, + 0.08711309986129633, + 0.09436065340192233, + 0.10219184926975308, + 0.11065119380880709, + 0.11978626332223039, + 0.12964787308688308, + 0.1402902497824765, + 0.15177120644750414, + 0.16415231887473744, + 0.1774991021751159, + 0.19188118603274876, + 0.2073724868929668, + 0.22405137508708922, + 0.2420008345668036, + 0.2613086126420624, + 0.28206735676065275, + 0.304374734950419, + 0.3283335362246267, + 0.3540517468355521, + 0.3816425977142324, + 0.41122457818810815, + 0.4429214104273133, + 0.476861978668265, + 0.5131802069428661, + 0.552014878328917, + 0.5935093885940672, + 0.6378114264894853, + 0.6850725728360539, + 0.7354478100271579, + 0.7890949336199033, + 0.8461738572908334, + 0.9068458029174391, + 0.9712723670031903, + 1.039614455721853, + 1.1120310807072604, + 1.1886780085979156, + 1.2697062583359084, + 1.3552604407358804, + 1.445476936575595, + 1.5404819104376466, + 1.6403891591717186, + 1.7452977954171027, + 1.855289768325456, + 1.9704272250067183, + 2.090749718330194, + 2.2162712672226825, + 2.3469772773587154, + 2.482821330529521, + 2.623721850824836, + 2.7695586558117835, + 2.9201693995824414, + 3.0753459130978404, + 3.2348304448576504, + 3.3983118035149187, + 3.5654214019239476, + 3.7357292010431413, + 3.908739554465855, + 4.08388695849068, + 4.26053172293765, + 4.437955595236007, + 4.615357397204854, + 4.791848773552302, + 4.966450205450727, + 5.138087515049228, + 5.305589178698527, + 5.467684878146588, + 5.623005850092554, + 5.77008773727594, + 5.9073767921365485, + 6.033240418923237, + 6.145983139958301, + 6.243869102698699, + 6.3251521657710335, + 6.3881143611530185, + 6.43111306970755, + 6.452636507868826, + 6.45136605559255, + 6.42624253437049, + 6.376531793638736, + 6.301882988962461, + 6.2023709612692155, + 6.078512542811822, + 5.931246018166809, + 5.761864181086653, + 5.57189547917723, + 5.36293575325548, + 5.136446019825731, + 4.893549928924388, + 4.6348868238767125, + 4.360598957682291, + 4.070546393032674, + 3.764836520943115, + 3.4447060703271233, + 3.1136754310352517, + 2.7786836635310213, + 2.4506072170538413, + 2.143240038957253, + 1.8697219665613107, + 1.6361913177310197, + 1.4355413039778862, + 1.25212371032, + 1.08101844292, + 0.922661533676, + 0.777427387203, + 0.645532710313, + 0.527030717719, + 0.421808591716, + 0.329588955775, + 0.249936081131, + 0.182267364119, + 0.125870272768, + 0.0799244278222, + 0.0435277575971, + 0.0157247674106, + -0.00446595076521, + -0.0180286451231, + -0.0259356820669, + -0.0291444642443, + -0.0286070049596, + -0.0252889255546, + -0.0201877775172, + -0.0143319039928, + -0.00873264221704, + -0.00426155751172, + -0.00144477444926, + -0.000236602186547, + -3.35654042743e-06, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 2, + "j": 5, + "angular_momentum": 3 + }, + { + "radial_function": [ + 0.0, + 1.0596682778440698e-10, + 4.311436938483154e-10, + 9.867734640288706e-10, + 1.784549635122513e-09, + 2.8366329489926678e-09, + 4.155668597896496e-09, + 5.7548040417746885e-09, + 7.647707459115115e-09, + 9.848586852674861e-09, + 1.237220983463809e-08, + 1.523392411325194e-08, + 1.8449678706278157e-08, + 2.203604590736128e-08, + 2.601024402937586e-08, + 3.039016095487378e-08, + 3.519437851910622e-08, + 4.044219775767906e-08, + 4.615366504482006e-08, + 5.234959915789746e-08, + 5.9051619297435096e-08, + 6.628217409810743e-08, + 7.406457166111197e-08, + 8.242301065118554e-08, + 9.138261248748424e-08, + 1.0096945466883479e-07, + 1.1121060527926712e-07, + 1.2213415870268635e-07, + 1.3376927260122456e-07, + 1.4614620619136144e-07, + 1.5929635987114663e-07, + 1.732523162401445e-07, + 1.88047882561498e-07, + 2.0371813471883624e-07, + 2.202994627169531e-07, + 2.3782961778385431e-07, + 2.563477611231877e-07, + 2.75894514381569e-07, + 2.9651201188997205e-07, + 3.182439547316756e-07, + 3.411356667156901e-07, + 3.652341523060246e-07, + 3.90588156587018e-07, + 4.1724822732630587e-07, + 4.4526677922039695e-07, + 4.7469816038084727e-07, + 5.055987211603058e-07, + 5.380268853642901e-07, + 5.720432240177944e-07, + 6.077105316091299e-07, + 6.450939051017924e-07, + 6.842608256855322e-07, + 7.252812432977756e-07, + 7.682276642695753e-07, + 8.131752418775109e-07, + 8.602018701132463e-07, + 9.093882807781613e-07, + 9.608181439185672e-07, + 1.0145781717622283e-06, + 1.0707582262897082e-06, + 1.129451430595403e-06, + 1.1907542841143864e-06, + 1.2547667818289525e-06, + 1.3215925377416094e-06, + 1.3913389124724528e-06, + 1.4641171455226697e-06, + 1.5400424919918736e-06, + 1.6192343641202658e-06, + 1.7018164777590712e-06, + 1.7879170039191688e-06, + 1.8776687256614942e-06, + 1.9712092004255017e-06, + 2.068680927899502e-06, + 2.170231523968165e-06, + 2.2760139004438443e-06, + 2.386186451330417e-06, + 2.500913245364845e-06, + 2.6203642252872273e-06, + 2.7447154141416035e-06, + 2.8741491286764897e-06, + 3.0088542002427092e-06, + 3.1490262031649174e-06, + 3.2948676913588584e-06, + 3.4465884429601707e-06, + 3.6044057135204476e-06, + 3.7685444979661194e-06, + 3.939237801831059e-06, + 4.116726921548684e-06, + 4.301261734942487e-06, + 4.4931010014554945e-06, + 4.692512672878819e-06, + 4.899774215158159e-06, + 5.115172940767608e-06, + 5.339006353415957e-06, + 5.571582503931942e-06, + 5.813220359091456e-06, + 6.064250182927539e-06, + 6.325013931492595e-06, + 6.595865660998531e-06, + 6.877171950538918e-06, + 7.169312338992505e-06, + 7.4726797777259516e-06, + 7.787681098151816e-06, + 8.11473749641182e-06, + 8.454285034093212e-06, + 8.806775156889892e-06, + 9.172675230773821e-06, + 9.552469097145408e-06, + 9.946657647096009e-06, + 1.0355759415243446e-05, + 1.0780311194888331e-05, + 1.1220868673704047e-05, + 1.1678007091875045e-05, + 1.2152321923163304e-05, + 1.2644429579116304e-05, + 1.3154968138043585e-05, + 1.3684598099143291e-05, + 1.4234003162777723e-05, + 1.4803891037686738e-05, + 1.5394994276047e-05, + 1.600807113807621e-05, + 1.6643906485533703e-05, + 1.7303312707254547e-05, + 1.7987130675731255e-05, + 1.8696230737871665e-05, + 1.943151373886823e-05, + 2.0193912082505057e-05, + 2.0984390827751795e-05, + 2.1803948823279895e-05, + 2.265361988118902e-05, + 2.3534473991668694e-05, + 2.444761857934799e-05, + 2.5394199803470343e-05, + 2.6375403902582106e-05, + 2.7392458586126946e-05, + 2.8446634474073227e-05, + 2.9539246586566473e-05, + 3.0671655884275946e-05, + 3.184527086337912e-05, + 3.306154920436304e-05, + 3.432199947888704e-05, + 3.562818291491827e-05, + 3.6981715223534536e-05, + 3.8384268488205576e-05, + 3.983757312041147e-05, + 4.1343419881504295e-05, + 4.290366197586953e-05, + 4.452021721577136e-05, + 4.619507026061931e-05, + 4.7930274934276636e-05, + 4.9727956623989164e-05, + 5.159031475632905e-05, + 5.3519625369218406e-05, + 5.551824375948341e-05, + 5.758860723559632e-05, + 5.9733237954751795e-05, + 6.195474586429376e-05, + 6.425583174183921e-05, + 6.663929033938635e-05, + 6.910801364389049e-05, + 7.166499423943226e-05, + 7.431332879095385e-05, + 7.70562216530299e-05, + 7.989698859011633e-05, + 8.283906064300193e-05, + 8.58859881140758e-05, + 8.904144469585267e-05, + 9.230923174293846e-05, + 9.569328269238364e-05, + 9.919766763076212e-05, + 0.00010282659802757337, + 0.00010658443162597874, + 0.00011047567750420712, + 0.00011450500131068389, + 0.00011867723068164645, + 0.00012299736084911295, + 0.0001274705604321404, + 0.0001321021774385185, + 0.00013689774547388754, + 0.00014186299014911993, + 0.00014700383573573763, + 0.00015232641202487775, + 0.00015783706143869633, + 0.00016354234638859465, + 0.00016944905687280986, + 0.0001755642183525837, + 0.00018189509988852782, + 0.00018844922256733485, + 0.00019523436821246217, + 0.00020225858839745248, + 0.0002095302137684095, + 0.00021705786369997498, + 0.00022485045626047134, + 0.0002329172185505461, + 0.00024126769737577413, + 0.0002499117702925386, + 0.00025885965705127614, + 0.0002681219314097111, + 0.0002777095333648768, + 0.0002876337818214863, + 0.00029790638767281986, + 0.00030853946734648224, + 0.00031954555681746417, + 0.00033093762610186345, + 0.0003427290942498269, + 0.000354933844867384, + 0.0003675662421496422, + 0.00038064114748826084, + 0.0003941739366530161, + 0.00040818051754501255, + 0.0004226773485865621, + 0.0004376814577316839, + 0.0004532104621314827, + 0.00046928258849127585, + 0.00048591669410814355, + 0.000503132288661875, + 0.0005209495567314766, + 0.0005393893811005376, + 0.000558473366876113, + 0.0005782238664135685, + 0.0005986640051289617, + 0.0006198177081773794, + 0.0006417097280795309, + 0.0006643656732681525, + 0.000687812037646652, + 0.0007120762311496222, + 0.0007371866113708384, + 0.0007631725162660781, + 0.000790064297992527, + 0.0008178933579318991, + 0.0008466921828794738, + 0.000876494382523442, + 0.000907334728188346, + 0.0009392491929245931, + 0.0009722749929990829, + 0.0010064506307626978, + 0.00104181593906388, + 0.0010784121271416893, + 0.0011162818281165322, + 0.001155469148124859, + 0.0011960197171541275, + 0.0012379807415930967, + 0.0012814010586399188, + 0.001326331192550887, + 0.001372823412854579, + 0.0014209317945388026, + 0.0014707122803471937, + 0.0015222227451963646, + 0.0015755230628370373, + 0.0016306751747713424, + 0.0016877431615940303, + 0.001746793316758759, + 0.0018078942228832331, + 0.0018711168307319007, + 0.0019365345408214106, + 0.002004223287960294, + 0.0020742616285852585, + 0.002146730831192686, + 0.002221714969830309, + 0.002299301020819438, + 0.0023795789628378544, + 0.00246264188041213, + 0.0025485860709793637, + 0.0026375111556535304, + 0.002729520193773495, + 0.002824719801429979, + 0.0029232202740649073, + 0.003025135713242602, + 0.0031305841578436223, + 0.003239687719743032, + 0.003352572724184734, + 0.0034693698549086707, + 0.003590214304396344, + 0.0037152459291366403, + 0.0038446094103548423, + 0.003978454420237065, + 0.004116935793771246, + 0.004260213706687239, + 0.004408453859311897, + 0.004561827666897189, + 0.0047205124564005975, + 0.004884691670022192, + 0.005054555075889765, + 0.005230298985683768, + 0.005412126480109643, + 0.005600247641750896, + 0.005794879796160849, + 0.005996247761070218, + 0.006204584104611759, + 0.006420129411270434, + 0.006643132558600757, + 0.006873851001947479, + 0.00711255106971447, + 0.0073595082686719725, + 0.007615007599630417, + 0.007879343883939724, + 0.00815282210093125, + 0.00843575773777153, + 0.008728477150311595, + 0.00903131793650407, + 0.009344629323484968, + 0.009668772566446299, + 0.010004121362556696, + 0.01035106227820382, + 0.010709995191053645, + 0.011081333747152483, + 0.011465505834148805, + 0.011862954069585324, + 0.012274136307528048, + 0.012699526160610014, + 0.013139613541887184, + 0.013594905222742145, + 0.014065925412796155, + 0.014553216356916783, + 0.015057338953819917, + 0.015578873396074073, + 0.016118419831378603, + 0.016676599045946743, + 0.017254053171937254, + 0.01785144641870771, + 0.01846946582865164, + 0.01910882205934275, + 0.019770250191185234, + 0.020454510563451555, + 0.021162389638340648, + 0.021894700894545555, + 0.022652285750086106, + 0.023436014518185614, + 0.024246787394041146, + 0.02508553547465382, + 0.025953221815614092, + 0.02685084252002457, + 0.027779427866854216, + 0.028740043476322304, + 0.029733791514586855, + 0.03076181193876878, + 0.03182528378455903, + 0.032925426496358004, + 0.03406350130149328, + 0.03524081263318955, + 0.03645870959681625, + 0.03771858749015858, + 0.03902188936940172, + 0.04037010767218751, + 0.04176478589108846, + 0.043207520304396556, + 0.04469996176501697, + 0.046243817546406864, + 0.04784085325276601, + 0.04949289478970107, + 0.05120183040158866, + 0.05296961277626612, + 0.05479826121689264, + 0.05668986388865118, + 0.05864658013497946, + 0.06067064287440837, + 0.0627643610703152, + 0.06493012228599429, + 0.06717039532027387, + 0.06948773292795951, + 0.07188477463152604, + 0.07436424961922873, + 0.07692897974000357, + 0.07958188259327188, + 0.0823259747166135, + 0.08516437487713215, + 0.08810030746515686, + 0.09113710599656757, + 0.09427821672681055, + 0.0975272023763288, + 0.10088774597360771, + 0.10436365481945316, + 0.10795886456998109, + 0.11167744345225468, + 0.11552359660270067, + 0.11950167054285014, + 0.123616157790459, + 0.12787170160720152, + 0.1322731008922252, + 0.13682531521916552, + 0.14153347002562722, + 0.1464028619524812, + 0.15143896433736231, + 0.1566474328749089, + 0.16203411142756213, + 0.16760503801393, + 0.17336645095599001, + 0.17932479520160094, + 0.18548672882020673, + 0.19185912967645535, + 0.198449102280554, + 0.2052639848177522, + 0.21231135636972204, + 0.21959904430827623, + 0.22713513188492065, + 0.23492796600453333, + 0.2429861651825701, + 0.2513186276994657, + 0.25993453993083754, + 0.26884338487751025, + 0.2780549508675264, + 0.28757934044993555, + 0.2974269794679413, + 0.3076086263027624, + 0.31813538129313557, + 0.3290186963202523, + 0.34027038455006264, + 0.3519026303226572, + 0.36392799919051727, + 0.37635944807369565, + 0.3892103355439522, + 0.402494432198716, + 0.4162259311261369, + 0.430419458437255, + 0.4450900838301358, + 0.4602533311870895, + 0.47592518915681564, + 0.4921221216897061, + 0.5088610785289032, + 0.5261595055351094, + 0.5440353549246914, + 0.5625070952758519, + 0.5815937212468524, + 0.6013147630576469, + 0.6216902955541439, + 0.6427409468115614, + 0.6644879062946469, + 0.6869529323013678, + 0.7101583588621526, + 0.7341271016369264, + 0.7588826631224002, + 0.7844491366991307, + 0.8108512094999967, + 0.8381141640605392, + 0.8662638784190358, + 0.8953268246318778, + 0.9253300654458844, + 0.9563012488691673, + 0.9882686006036078, + 1.0212609138725466, + 1.0553075365418063, + 1.090438355159722, + 1.126683775699039, + 1.1640747005052063, + 1.202642501289899, + 1.2424189876605645, + 1.2834363707044498, + 1.3257272213999687, + 1.3693244230839645, + 1.4142611177228894, + 1.4605706451630203, + 1.508286475022611, + 1.5574421303899302, + 1.6080711026010708, + 1.660206756707806, + 1.7138822263885762, + 1.7691302977655767, + 1.825983281238493, + 1.8844728703093578, + 1.9446299864322096, + 2.0064846089410664, + 2.0700655888938093, + 2.135400445771777, + 2.2025151457753296, + 2.2714338605848976, + 2.3421787053537146, + 2.4147694545034666, + 2.4892232341344527, + 2.5655541897997103, + 2.643773128038464, + 2.7238871306944934, + 2.805899140486676, + 2.8898075165574806, + 2.975605559116101, + 3.063281001689057, + 3.152815470328091, + 3.244183908714383, + 3.337353968807697, + 3.432285366391743, + 3.528929201673071, + 3.6272272448552676, + 3.7271111878837417, + 3.828501862788525, + 3.931308428950786, + 4.035427531177196, + 4.140742431641473, + 4.247122119760896, + 4.354420404284228, + 4.462474993650746, + 4.571106571247336, + 4.680117873611691, + 4.789292780908947, + 4.898395430483798, + 5.007169365566851, + 5.115336733409747, + 5.2225975479921924, + 5.328629034929548, + 5.433085077734437, + 5.5355957861965, + 5.635767209862696, + 5.7331812211093185, + 5.827395594066599, + 5.91794430693409, + 6.0043380970143865, + 6.086065298574113, + 6.162592994241706, + 6.233368511542368, + 6.297821295727089, + 6.355365189700099, + 6.405401150815848, + 6.447320432689099, + 6.480508258056105, + 6.504348005915721, + 6.5182259329659615, + 6.521536445546622, + 6.513687934053161, + 6.494109177243879, + 6.462256318855409, + 6.417620413715581, + 6.359735534894841, + 6.288187427061143, + 6.202622684004954, + 6.10275841900058, + 5.988392384841319, + 5.8594134834829985, + 5.715812581945375, + 5.5576935176464834, + 5.385284129575285, + 5.198947087391442, + 4.999190204051454, + 4.786675806236438, + 4.562228597790091, + 4.32684128811565, + 4.081677078607793, + 3.828067925753372, + 3.567507366599352, + 3.3016366593509803, + 3.032223145223422, + 2.7611301986517134, + 2.4902790506180734, + 2.221604309222742, + 1.9570072994690604, + 1.698314410455169, + 1.447251176743933, + 1.2054458777461399, + 0.9744768087152359, + 0.755970556991209, + 0.551736083442328, + 0.363865767170558, + 0.19462295366947557, + 0.0457480104269, + -0.0824641968201, + -0.190340974016, + -0.278473965116, + -0.347695391084, + -0.399059306311, + -0.433817704363, + -0.45339177167, + -0.459338892977, + -0.453316384992, + -0.437043369488, + -0.412262639769, + -0.38070480042, + -0.344057188824, + -0.303940091657, + -0.261892146029, + -0.21936561857, + -0.17772982414, + -0.138277685068, + -0.102225666107, + -0.0706925689315, + -0.0446382902034, + -0.0247443184651, + -0.0112279770341, + -0.00361521892277, + -0.000568383838987, + -7.56931439415e-06, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 3, + "j": 3, + "angular_momentum": 0 + }, + { + "radial_function": [ + 0.0, + 2.0939094640100397e-21, + 3.4662677719106223e-20, + 1.8157370562531286e-19, + 5.9384799762010635e-19, + 1.5004596432068077e-18, + 3.220326055109165e-18, + 6.175599345960396e-18, + 1.0906378521116822e-17, + 1.8086972195986037e-17, + 2.8543852380175295e-17, + 4.327545154721414e-17, + 6.347396781716561e-17, + 9.054935667951454e-17, + 1.2615570232483807e-16, + 1.7222017749401726e-16, + 2.3097481775751043e-16, + 3.049913545548893e-16, + 3.9721937104286346e-16, + 5.110280662303152e-16, + 6.502519357718059e-16, + 8.192407026182046e-16, + 1.0229138572568364e-15, + 1.2668201962489521e-15, + 1.5572027783516125e-15, + 1.901069750980884e-15, + 2.306271535822534e-15, + 2.7815849003240747e-15, + 3.336804484138855e-15, + 3.982842393463599e-15, + 4.7318365249821645e-15, + 5.597268332271557e-15, + 6.5940908033735965e-15, + 7.738867478211576e-15, + 9.049923398533843e-15, + 1.0547508952725355e-14, + 1.2253977651429605e-14, + 1.4193978950955065e-14, + 1.6394667327013477e-14, + 1.8885928892754937e-14, + 2.1700626956935492e-14, + 2.4874868021674335e-14, + 2.8448289836985e-14, + 3.246437325019981e-14, + 3.6970779723734554e-14, + 4.2019716532803605e-14, + 4.766833181346948e-14, + 5.397914178638773e-14, + 6.102049268046838e-14, + 6.886706002241447e-14, + 7.760038823243406e-14, + 8.730947362444866e-14, + 9.8091394146308e-14, + 1.1005198953063438e-13, + 1.233065956553764e-13, + 1.3798083733133918e-13, + 1.5421148400243249e-13, + 1.7214737314592818e-13, + 1.9195040655864496e-13, + 2.1379662509469542e-13, + 2.37877367844012e-13, + 2.644005221542361e-13, + 2.935918713821552e-13, + 3.256965478514465e-13, + 3.609805988477141e-13, + 3.99732674383582e-13, + 4.4226584574678014e-13, + 4.889195647927646e-13, + 5.400617745457064e-13, + 5.960911824667881e-13, + 6.574397086571448e-13, + 7.245751220582589e-13, + 7.980038786559156e-13, + 8.782741770461653e-13, + 9.659792472253105e-13, + 1.06176089042515e-12, + 1.1663132883216022e-12, + 1.2803871018417448e-12, + 1.4047938811777557e-12, + 1.5404108099612823e-12, + 1.6881858085370285e-12, + 1.849143022639525e-12, + 2.024388726568602e-12, + 2.215117670953394e-12, + 2.4226199082554915e-12, + 2.6482881311558546e-12, + 2.8936255619389097e-12, + 3.1602544327164344e-12, + 3.4499251011580137e-12, + 3.764525847298762e-12, + 4.10609340205988e-12, + 4.476824261625832e-12, + 4.879086843760375e-12, + 5.315434550259402e-12, + 5.788619799025108e-12, + 6.301609099287831e-12, + 6.857599244522793e-12, + 7.460034705820322e-12, + 8.11262631216313e-12, + 8.819371313207608e-12, + 9.584574923216134e-12, + 1.0412873456874807e-11, + 1.130925916901684e-11, + 1.2279106926935051e-11, + 1.3328202843895543e-11, + 1.44627750202285e-11, + 1.5689526541897494e-11, + 1.70156709030651e-11, + 1.8448970026857713e-11, + 1.9997775071780036e-11, + 2.167107022956825e-11, + 2.3478519725402207e-11, + 2.5430518256671357e-11, + 2.753824511804957e-11, + 2.9813722276743124e-11, + 3.22698766868312e-11, + 3.492060714677858e-11, + 3.7780856028562024e-11, + 4.086668622920697e-11, + 4.419536372100041e-11, + 4.778544610806145e-11, + 5.1656877612402804e-11, + 5.583109096465673e-11, + 6.033111668390353e-11, + 6.51817002908774e-11, + 7.040942801034354e-11, + 7.604286158717918e-11, + 8.211268286148134e-11, + 8.865184880582758e-11, + 9.569575777533988e-11, + 1.0328242777814496e-10, + 1.1145268762289233e-10, + 1.2025038187236389e-10, + 1.2972259058517303e-10, + 1.399198649125672e-10, + 1.5089647968131153e-10, + 1.6271070418196952e-10, + 1.7542509245375617e-10, + 1.891067944844645e-10, + 2.0382788979124008e-10, + 2.1966574500893274e-10, + 2.367033971806658e-10, + 2.550299646035579e-10, + 2.7474108718042757e-10, + 2.9593939840703696e-10, + 3.187350312192293e-10, + 3.432461601554409e-10, + 3.695995823951906e-10, + 3.9793134044778023e-10, + 4.2838738947737877e-10, + 4.611243124643272e-10, + 4.963100864743847e-10, + 5.341249039785257e-10, + 5.747620526948753e-10, + 6.184288586399021e-10, + 6.653476964053737e-10, + 7.157570717882258e-10, + 7.699127817292702e-10, + 8.280891570905709e-10, + 8.905803943842521e-10, + 9.57701982314874e-10, + 1.0297922302668621e-09, + 1.1072139059900685e-09, + 1.190355989737857e-09, + 1.2796355539973085e-09, + 1.3754997768068619e-09, + 1.4784280987208738e-09, + 1.5889345334902993e-09, + 1.7075701433735144e-09, + 1.8349256905133355e-09, + 1.971634477378885e-09, + 2.1183753891646177e-09, + 2.275876152741254e-09, + 2.4449168274038444e-09, + 2.626333543958749e-09, + 2.821022509835721e-09, + 3.029944298458958e-09, + 3.254128443935275e-09, + 3.4946783622668768e-09, + 3.752776621354304e-09, + 4.029690586656478e-09, + 4.326778466396976e-09, + 4.645495786751255e-09, + 4.987402326759139e-09, + 5.354169544504455e-09, + 5.747588531149397e-09, + 6.169578528484589e-09, + 6.622196051174682e-09, + 7.107644655406452e-09, + 7.62828540021012e-09, + 8.186648050145832e-09, + 8.785443072833578e-09, + 9.427574484700064e-09, + 1.0116153609122745e-08, + 1.085451380725338e-08, + 1.1646226252410336e-08, + 1.2495116822924888e-08, + 1.3405284188660996e-08, + 1.4381119178726395e-08, + 1.5427325521403936e-08, + 1.6548942049194386e-08, + 1.7751366476226496e-08, + 1.9040380857713727e-08, + 2.042217884983632e-08, + 2.1903394897289183e-08, + 2.3491135486140718e-08, + 2.5193012603142492e-08, + 2.701717956289231e-08, + 2.8972369367545593e-08, + 3.106793577436839e-08, + 3.3313897268579636e-08, + 3.572098414093221e-08, + 3.8300688890672984e-08, + 4.106532019079168e-08, + 4.4028060660798634e-08, + 4.7203028723900626e-08, + 5.0605344827065885e-08, + 5.425120233813053e-08, + 5.8157943449488445e-08, + 6.234414043389731e-08, + 6.68296826403518e-08, + 7.163586962361186e-08, + 7.678551085087048e-08, + 8.230303243507084e-08, + 8.821459140367765e-08, + 9.454819802300098e-08, + 1.013338467529441e-07, + 1.0860365643224206e-07, + 1.1639202035044092e-07, + 1.2473576690558258e-07, + 1.3367433157536052e-07, + 1.4324994102291474e-07, + 1.535078101702199e-07, + 1.6449635316322955e-07, + 1.7626740921019168e-07, + 1.8887648431391998e-07, + 2.0238301005950484e-07, + 2.1685062061453782e-07, + 2.3234744924690012e-07, + 2.4894644573050994e-07, + 2.6672571610868325e-07, + 2.8576888636811875e-07, + 3.061654917413868e-07, + 3.280113934044666e-07, + 3.514092245235851e-07, + 3.764688676857005e-07, + 4.033079659531966e-07, + 4.3205246987534827e-07, + 4.628372230106771e-07, + 4.958065886303143e-07, + 5.311151205482212e-07, + 5.689282811319266e-07, + 6.094232098253167e-07, + 6.527895457679577e-07, + 6.992303082125677e-07, + 7.489628389519773e-07, + 8.022198109455316e-07, + 8.592503079389045e-07, + 9.20320979960192e-07, + 9.85717280067817e-07, + 1.055744788074487e-06, + 1.1307306272984005e-06, + 1.2110249809070729e-06, + 1.2970027148587683e-06, + 1.3890651148769527e-06, + 1.4876417455261657e-06, + 1.5931924399192845e-06, + 1.7062094291765446e-06, + 1.8272196215572267e-06, + 1.9567870416706315e-06, + 2.0955154410619627e-06, + 2.2440510920669815e-06, + 2.403085778041011e-06, + 2.573359993389822e-06, + 2.7556663684622556e-06, + 2.950853334876644e-06, + 3.1598290480264077e-06, + 3.3835655852232873e-06, + 3.6231034382143574e-06, + 3.879556321242718e-06, + 4.154116316390115e-06, + 4.448059379955926e-06, + 4.762751235466173e-06, + 5.099653679573602e-06, + 5.460331331004045e-06, + 5.846458852193403e-06, + 6.259828677872137e-06, + 6.702359285290217e-06, + 7.17610404537013e-06, + 7.683260691840972e-06, + 8.226181457928975e-06, + 8.807383920106137e-06, + 9.429562603629073e-06, + 1.0095601401173638e-05, + 1.0808586861348919e-05, + 1.1571822408171091e-05, + 1.2388843555820369e-05, + 1.3263434191540921e-05, + 1.4199643995893087e-05, + 1.52018070832233e-05, + 1.6274561950049818e-05, + 1.7422872814914358e-05, + 1.8652052456462893e-05, + 1.9967786646758204e-05, + 2.137616029469885e-05, + 2.2883685417891397e-05, + 2.4497331072898466e-05, + 2.622455537383562e-05, + 2.807333975656413e-05, + 3.005222562978215e-05, + 3.21703535965638e-05, + 3.443750540493021e-05, + 3.686414884345582e-05, + 3.94614857594374e-05, + 4.2241503436125217e-05, + 4.5217029558781655e-05, + 4.84017910145418e-05, + 5.181047679280631e-05, + 5.545880527842201e-05, + 5.936359623705768e-05, + 6.354284781818924e-05, + 6.801581893014804e-05, + 7.280311734865056e-05, + 7.792679397052958e-05, + 8.341044362997094e-05, + 8.927931293621955e-05, + 9.556041560931964e-05, + 0.00010228265585595926, + 0.00010947696031583263, + 0.00011717641917964616, + 0.00012541643713943283, + 0.0001342348947952941, + 0.00014367232129831032, + 0.00015377207897123598, + 0.00016458056074305935, + 0.00017614740127815497, + 0.00018852570275420958, + 0.00020177227628176046, + 0.00021594790004206117, + 0.00023111759533390674, + 0.00024735092167148406, + 0.00026472229236062047, + 0.00028331131182638504, + 0.00030320313631694324, + 0.00032448885946727984, + 0.0003472659244976856, + 0.0003716385648557192, + 0.0003977182751965156, + 0.00042562431485955807, + 0.0004554842459610885, + 0.0004874345085316014, + 0.0005216210351952558, + 0.0005581999080324245, + 0.0005973380605967135, + 0.0006392140279952233, + 0.0006840187484687363, + 0.0007319564197377397, + 0.000783245414031836, + 0.0008381192555975864, + 0.000896827664925739, + 0.0009596376742812525, + 0.001026834819129226, + 0.00109872441073989, + 0.0011756328952808376, + 0.0012579093051685922, + 0.0013459268089142367, + 0.0014400843658833246, + 0.001540808493031229, + 0.0016485551510356717, + 0.0017638117576009155, + 0.0018870993364178375, + 0.0020189748107232184, + 0.0021600334507237023, + 0.002310911485362334, + 0.0024722888886337586, + 0.002644892352251716, + 0.002829498456549662, + 0.0030269370523271994, + 0.003238094867506133, + 0.003463919352773509, + 0.0037054227817834877, + 0.003963686621858853, + 0.004239866192413165, + 0.004535195629818279, + 0.004850993176946667, + 0.005188666819109448, + 0.005549720286760685, + 0.005935759448548873, + 0.0063484991185581855, + 0.0067897703033466955, + 0.0072615279154255264, + 0.0077658589815149375, + 0.008304991376274523, + 0.00888130311144815, + 0.009497332215188156, + 0.010155787235514576, + 0.010859558404396386, + 0.011611729502091701, + 0.012415590460318975, + 0.013274650748769672, + 0.0141926535868937, + 0.015173591029304108, + 0.016221719972388155, + 0.017341579132077838, + 0.018538007046375836, + 0.019816161156950382, + 0.021181538026504906, + 0.022639994750562303, + 0.02419777162605591, + 0.025861516137121496, + 0.027638308326094343, + 0.02953568761323884, + 0.03156168113588027, + 0.03372483367620239, + 0.036034239246684516, + 0.03849957440904746, + 0.04113113339643667, + 0.04393986511151633, + 0.046937412079888066, + 0.05013615141671216, + 0.053549237899241, + 0.057190649197963205, + 0.061075233331271635, + 0.06521875842891571, + 0.06963796484113646, + 0.0743506196514232, + 0.07937557366154453, + 0.08473282084642533, + 0.09044356036913112, + 0.09653026109104655, + 0.10301672868440453, + 0.10992817525430255, + 0.11729129146833182, + 0.12513432117655177, + 0.13348713840507853, + 0.14238132666498649, + 0.15185026043204777, + 0.1619291886198931, + 0.17265531990886343, + 0.18406790962207403, + 0.19620834791449782, + 0.2091202489090225, + 0.22284954041769917, + 0.23744455373076057, + 0.2529561130182434, + 0.2694376236963835, + 0.28694515904029433, + 0.3055375443533079, + 0.32527643769141334, + 0.34622640626473267, + 0.36845499728773795, + 0.3920328021572052, + 0.4170335124926328, + 0.44353396648525834, + 0.4716141840464367, + 0.5013573886639912, + 0.5328500140765993, + 0.5661816935429048, + 0.6014452292296989, + 0.6387365390916719, + 0.6781545784457413, + 0.7198012331208914, + 0.763781180926707, + 0.8102017178533573, + 0.8591725452929742, + 0.9108055143046523, + 0.9652143225978134, + 1.0225141598743293, + 1.0828212969465834, + 1.14625261358804, + 1.2129250603889556, + 1.2829550493141475, + 1.3564577677192722, + 1.4335464108304317, + 1.5143313271130512, + 1.5989190716522903, + 1.6874113623348874, + 1.7799039343495933, + 1.8764852883853884, + 1.9772353288825675, + 2.0822238887324267, + 2.1915091384815457, + 2.3051358777341147, + 2.4231337089783187, + 2.545515094238542, + 2.6722732969419116, + 2.8033802133859784, + 2.938784099334317, + 3.0784072003888574, + 3.2221432965957475, + 3.369855174675014, + 3.521372044151387, + 3.6764869169108008, + 3.8349539727621273, + 3.9964859380269337, + 4.160751506833261, + 4.327372839813979, + 4.495923178701676, + 4.665924619259382, + 4.836846090031021, + 5.008101588531466, + 5.179048731264691, + 5.348987678193097, + 5.5171604978596545, + 5.682751043774724, + 5.84488541734848, + 6.002633098842137, + 6.155008832512591, + 6.3009753581723675, + 6.439447087443068, + 6.569294829153272, + 6.6893516747961765, + 6.798420160769779, + 6.895280829404077, + 6.978702314049996, + 7.047453073283428, + 7.1003148944916, + 7.136098273380151, + 7.153659751426961, + 7.151921252335868, + 7.1298913964004225, + 7.0866886820837935, + 7.021566301040153, + 6.933938190509298, + 6.823405721500231, + 6.689784172657601, + 6.533127853964538, + 6.353752437588207, + 6.152252754947838, + 5.929514077196739, + 5.686714782630091, + 5.425318424249275, + 5.147053666207954, + 4.853881496098878, + 4.5479506745185985, + 4.231544645401778, + 3.907026080566351, + 3.5767886364958215, + 3.2432287731440193, + 2.9087524938966642, + 2.5758307563257854, + 2.2471103736765516, + 1.9255710625941034, + 1.6146905312902688, + 1.3185369047368456, + 1.0416569410726344, + 0.7885914255491868, + 0.5628828088766757, + 0.3656707690618533, + 0.1946558097464598, + 0.0457480104269, + -0.0824641968201, + -0.190340974016, + -0.278473965116, + -0.347695391084, + -0.399059306311, + -0.433817704363, + -0.45339177167, + -0.459338892977, + -0.453316384992, + -0.437043369488, + -0.412262639769, + -0.38070480042, + -0.344057188824, + -0.303940091657, + -0.261892146029, + -0.21936561857, + -0.17772982414, + -0.138277685068, + -0.102225666107, + -0.0706925689315, + -0.0446382902034, + -0.0247443184651, + -0.0112279770341, + -0.00361521892277, + -0.000568383838987, + -7.56931439415e-06, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 3, + "j": 3, + "angular_momentum": 2 + }, + { + "radial_function": [ + -0.0, + -6.589315411866184e-16, + -5.4077730058247534e-15, + -1.8724558624811816e-14, + -4.553846043933145e-14, + -9.126202706432508e-14, + -1.6182542489255352e-13, + -2.6371279760517884e-13, + -4.0400086631333826e-13, + -5.903998993686544e-13, + -8.312971882215822e-13, + -1.1358031730262343e-12, + -1.51380036980751e-12, + -1.9759952594530388e-12, + -2.533973307275568e-12, + -3.2002572918212432e-12, + -3.9883691307490226e-12, + -4.9128954027332495e-12, + -5.9895567741637304e-12, + -7.23528155229968e-12, + -8.668283597459482e-12, + -1.0308144840498817e-11, + -1.2175902663976882e-11, + -1.4294142422198266e-11, + -1.6687095386898506e-11, + -1.9380742423143545e-11, + -2.240292371808778e-11, + -2.5783454897628103e-11, + -2.9554249891080717e-11, + -3.374945091725554e-11, + -3.840556599103083e-11, + -4.356161436704542e-11, + -4.9259280361620614e-11, + -5.5543076018731e-11, + -6.24605131090252e-11, + -7.006228498010992e-11, + -7.840245880001169e-11, + -8.753867877078362e-11, + -9.753238091760036e-11, + -1.0844902008690144e-10, + -1.2035830983316845e-10, + -1.33334475895544e-10, + -1.4745652401710078e-10, + -1.6280852288930238e-10, + -1.7947990305794008e-10, + -1.9756577265492422e-10, + -2.1716725088954275e-10, + -2.383918202484069e-10, + -2.6135369848235537e-10, + -2.8617423135141256e-10, + -3.129823073952209e-10, + -3.4191479584946876e-10, + -3.731170089163482e-10, + -4.067431899067291e-10, + -4.42957028417944e-10, + -4.819322041706908e-10, + -5.238529610651244e-10, + -5.689147130144839e-10, + -6.173246833124367e-10, + -6.693025793613015e-10, + -7.250813047042535e-10, + -7.849077103307856e-10, + -8.490433873552237e-10, + -9.177655034520251e-10, + -9.913676851189926e-10, + -1.0701609486477078e-09, + -1.1544746820449716e-09, + -1.244657680873902e-09, + -1.3410792408543452e-09, + -1.4441303102523622e-09, + -1.5542247053799092e-09, + -1.6718003924973933e-09, + -1.7973208395730205e-09, + -1.9312764420880113e-09, + -2.0741860262203017e-09, + -2.2265984342722944e-09, + -2.389094196120802e-09, + -2.56228729160114e-09, + -2.746827008807517e-09, + -2.9433999031997563e-09, + -3.1527318631349377e-09, + -3.375590287079966e-09, + -3.612786379275477e-09, + -3.865177569378945e-09, + -4.133670063141815e-09, + -4.4192215309569325e-09, + -4.722843942001792e-09, + -5.045606550806183e-09, + -5.3886390458363246e-09, + -5.75313486729087e-09, + -6.140354703870248e-09, + -6.551630178506205e-09, + -6.988367731361649e-09, + -7.452052713371497e-09, + -7.944253698367893e-09, + -8.466627028209133e-09, + -9.020921601447397e-09, + -9.608983919619558e-09, + -1.0232763403663213e-08, + -1.0894317996478055e-08, + -1.1595820064763763e-08, + -1.2339562618671147e-08, + -1.312796586257065e-08, + -1.3963584098775486e-08, + -1.4849112998799942e-08, + -1.5787397265043483e-08, + -1.678143870090027e-08, + -1.783440471320198e-08, + -1.89496372685441e-08, + -2.013066232691428e-08, + -2.1381199780969677e-08, + -2.2705173923379312e-08, + -2.4106724473628786e-08, + -2.5590218193114972e-08, + -2.7160261117840286e-08, + -2.882171144391778e-08, + -3.0579693098964164e-08, + -3.2439610036048206e-08, + -3.4407161287999216e-08, + -3.6488356822140366e-08, + -3.8689534240360496e-08, + -4.101737636327568e-08, + -4.347892975277847e-08, + -4.608162421496229e-08, + -4.883329334278163e-08, + -5.174219614483828e-08, + -5.4817039825941095e-08, + -5.806700377481926e-08, + -6.150176482408333e-08, + -6.513152384941504e-08, + -6.896703378019944e-08, + -7.301962909320336e-08, + -7.730125687047374e-08, + -8.182450950023148e-08, + -8.660265911112808e-08, + -9.164969382899923e-08, + -9.698035595368757e-08, + -1.0261018215186089e-07, + -1.0855554578270929e-07, + -1.14833701455478e-07, + -1.214628319481868e-07, + -1.284620976027117e-07, + -1.358516883336924e-07, + -1.4365287838176384e-07, + -1.518880839647671e-07, + -1.605809239661118e-07, + -1.697562838355504e-07, + -1.7944038285962696e-07, + -1.8966084498012182e-07, + -2.004467733532918e-07, + -2.1182882885260118e-07, + -2.2383931267495703e-07, + -2.3651225337055318e-07, + -2.498834983752718e-07, + -2.639908104582555e-07, + -2.788739691816469e-07, + -2.94574877749483e-07, + -3.1113767546638905e-07, + -3.286088561122083e-07, + -3.470373926092398e-07, + -3.6647486817393345e-07, + -3.8697561441283625e-07, + -4.085968567259137e-07, + -4.3139886726007154e-07, + -4.554451260520574e-07, + -4.808024905338084e-07, + -5.075413739995666e-07, + -5.357359334684281e-07, + -5.654642674358753e-07, + -5.968086239725264e-07, + -6.298556198404103e-07, + -6.646964710751286e-07, + -7.014272357042161e-07, + -7.401490692121805e-07, + -7.809684934465657e-07, + -8.239976796870673e-07, + -8.693547464841116e-07, + -9.171640732463536e-07, + -9.675566303049478e-07, + -1.0206703261421926e-06, + -1.0766503731367457e-06, + -1.1356496722335204e-06, + -1.1978292179751318e-06, + -1.2633585248140285e-06, + -1.3324160756332875e-06, + -1.4051897939923553e-06, + -1.481877541018609e-06, + -1.5626876384835389e-06, + -1.6478394192393978e-06, + -1.7375638065538474e-06, + -1.8321039238064992e-06, + -1.9317157363165074e-06, + -2.0366687265126736e-06, + -2.1472466048987338e-06, + -2.263748057992135e-06, + -2.3864875355358057e-06, + -2.5157960792083705e-06, + -2.652022194419577e-06, + -2.7955327679505566e-06, + -2.9467140339023155e-06, + -3.105972589894726e-06, + -3.273736466711128e-06, + -3.450456253985776e-06, + -3.636606284819697e-06, + -3.832685882435138e-06, + -4.039220672323815e-06, + -4.256763962713169e-06, + -4.4858981976793855e-06, + -4.727236486384287e-06, + -4.981424212011336e-06, + -5.2491407253708646e-06, + -5.531101126926805e-06, + -5.828058142087921e-06, + -6.14080409491653e-06, + -6.470172984723128e-06, + -6.817042671884831e-06, + -7.182337177540862e-06, + -7.56702910386554e-06, + -7.972142181190704e-06, + -8.398753947851318e-06, + -8.847998570822153e-06, + -9.321069813387197e-06, + -9.81922415866958e-06, + -1.034378409580244e-05, + -1.0896141578599083e-05, + -1.1477761664704766e-05, + -1.2090186345376986e-05, + -1.2735038575146072e-05, + -1.3414026512381866e-05, + -1.4128947982007439e-05, + -1.488169517045944e-05, + -1.5674259567164935e-05, + -1.650873716359153e-05, + -1.7387333924304e-05, + -1.8312371544498117e-05, + -1.928629350693489e-05, + -2.031167145730257e-05, + -2.1391211911261426e-05, + -2.2527763312356654e-05, + -2.3724323458884526e-05, + -2.4984047318972074e-05, + -2.6310255252758295e-05, + -2.7706441665495645e-05, + -2.917628411152578e-05, + -3.0723652874588366e-05, + -3.235262104733715e-05, + -3.406747513837305e-05, + -3.587272623224249e-05, + -3.777312173295064e-05, + -3.977365771911783e-05, + -4.187959194586215e-05, + -4.409645752418843e-05, + -4.643007731423597e-05, + -4.888657907158397e-05, + -5.1472411380194264e-05, + -5.4194360421546676e-05, + -5.7059567614195674e-05, + -6.007554817709844e-05, + -6.325021065915788e-05, + -6.659187748789146e-05, + -7.010930659118028e-05, + -7.38117141451001e-05, + -7.770879850824562e-05, + -8.181076540491293e-05, + -8.612835441984575e-05, + -9.06728668758831e-05, + -9.545619516451588e-05, + -0.00010049085360288513, + -0.00010579001090182399, + -0.0001113675243243851, + -0.00011723797562562551, + -0.0001234167088608281, + -0.00012991987016984573, + -0.00013676444962584995, + -0.00014396832527012842, + -0.00015155030943832704, + -0.00015953019749307074, + -0.00016792881910447283, + -0.0001767680921883271, + -0.00018607107966044214, + -0.00019586204913912833, + -0.00020616653575352176, + -0.000217011408229121, + -0.00022842493839184756, + -0.00024043687431053506, + -0.0002530785172191407, + -0.0002663828024538018, + -0.0002803843845860558, + -0.0002951197270128988, + -0.00031062719612177166, + -0.0003269471604638865, + -0.0003441220949722382, + -0.0003621966906474647, + -0.0003812179699327214, + -0.0004012354080699013, + -0.0004223010607539675, + -0.00044446969839020815, + -0.0004677989473844445, + -0.0004923494386808997, + -0.0005181849640163333, + -0.0005453726403487136, + -0.0005739830826815652, + -0.0006040905859621299, + -0.0006357733163274206, + -0.000669113512269394, + -0.0007041976962051702, + -0.0007411168970416898, + -0.0007799668841475824, + -0.0008208484135836796, + -0.0008638674868771359, + -0.0009091356233655673, + -0.0009567701463602221, + -0.0010068944843919401, + -0.0010596384877274204, + -0.0011151387613435918, + -0.0011735390151118297, + -0.0012349904319781068, + -0.0012996520550658313, + -0.001367691194804985, + -0.0014392838569933992, + -0.0015146151928495052, + -0.001593879972285323, + -0.0016772830813749947, + -0.0017650400454974383, + -0.0018573775792963384, + -0.0019545341648876083, + -0.0020567606595816904, + -0.0021643209349890263, + -0.0022774925486634297, + -0.0023965674500698326, + -0.002521852723010885, + -0.0026536713654917864, + -0.002792363109793301, + -0.002938285284247025, + -0.0030918137189550575, + -0.0032533436976158957, + -0.00342329095790933, + -0.003602092742641594, + -0.0037902089041972724, + -0.003988123065491816, + -0.004196343839062464, + -0.004415406108744951, + -0.0046458723753299005, + -0.00488833417106353, + -0.005143413544910434, + -0.005411764622984825, + -0.005694075247673728, + -0.0059910686987553596, + -0.0063035055015404065, + -0.006632185325175213, + -0.006977948976319305, + -0.007341680492552312, + -0.00772430933986097, + -0.008126812720378592, + -0.008550217994088598, + -0.008995605221846786, + -0.00946410983333116, + -0.009956925428081794, + -0.01047530671433707, + -0.011020572592559938, + -0.011594109391384723, + -0.012197374261356773, + -0.012831898735674852, + -0.013499292464584775, + -0.014201247131478212, + -0.014939540559819707, + -0.015716041018538802, + -0.01653271173578306, + -0.017391615630500023, + -0.018294920270738195, + -0.019244903069641894, + -0.02024395672985161, + -0.021294594945612533, + -0.022399458376990148, + -0.02356132090415517, + -0.02478309617714299, + -0.02606784447215854, + -0.02741877986670522, + -0.028839277748774546, + -0.030332882672138007, + -0.031903316573795186, + -0.033554487366316235, + -0.03529049792041895, + -0.037115655456463115, + -0.03903448135406945, + -0.04105172140434048, + -0.043172356513702305, + -0.04540161388100844, + -0.04774497866342852, + -0.05020820614941396, + -0.05279733445511335, + -0.055518697762149204, + -0.05837894011916297, + -0.061385029816875575, + -0.0645442743636367, + -0.06786433607461016, + -0.07135324829195759, + -0.07501943225961392, + -0.07887171466111675, + -0.08291934584837024, + -0.08717201876625713, + -0.0916398885986178, + -0.09633359314644013, + -0.10126427394977022, + -0.10644359817051355, + -0.11188378124534859, + -0.11759761031770559, + -0.12359846845525455, + -0.12990035966409944, + -0.13651793469182064, + -0.14346651763212945, + -0.15076213331502983, + -0.1584215354849237, + -0.16646223575309743, + -0.17490253330105374, + -0.18376154532800137, + -0.1930592382042479, + -0.20281645929634473, + -0.21305496944609625, + -0.22379747600503125, + -0.23506766644184296, + -0.2468902423982114, + -0.25929095411240866, + -0.27229663519343605, + -0.28593523757221284, + -0.3002358665321114, + -0.31522881575605877, + -0.3309456021195046, + -0.3474190002504561, + -0.3646830764305828, + -0.38277322193576285, + -0.4017261853515401, + -0.4215801036973174, + -0.44237453217074785, + -0.4641504720883967, + -0.48695039680131613, + -0.5108182751782413, + -0.5357995922234418, + -0.5619413665531987, + -0.5892921640916172, + -0.6179021076122938, + -0.6478228815099895, + -0.6791077312908316, + -0.7118114570080726, + -0.7459904001283008, + -0.7817024229909794, + -0.8190068800121431, + -0.8579645799866065, + -0.8986377383266803, + -0.9410899185161691, + -0.9853859615068367, + -1.0315919022098166, + -1.0797748717436089, + -1.1300029841693309, + -1.1823452067594336, + -1.2368712119846832, + -1.2936512100782815, + -1.352755760683267, + -1.4142555619363446, + -1.4782212153918635, + -1.5447229652140462, + -1.6138304098449663, + -1.685612184474977, + -1.7601356124471905, + -1.8374663238946962, + -1.917667839837472, + -2.0008011197907822, + -2.086924071260474, + -2.1760910195069862, + -2.268352135626105, + -2.3637528218141974, + -2.4623330521449645, + -2.5641266675923378, + -2.669160624638449, + -2.7774541962194985, + -2.889018124921913, + -3.003853728006605, + -3.1219519548845858, + -3.243292397477754, + -3.3678422550909537, + -3.4955552553077314, + -3.6263705342374273, + -3.7602114786295253, + -3.896984534995343, + -4.036577990466023, + -4.178860731778362, + -4.3236809902332904, + -4.4708650808108, + -4.620216146044863, + -4.7715129160077145, + -4.924508497595877, + -5.0789292079078585, + -5.23447346830592, + -5.3908107771967995, + -5.547580782233813, + -5.704392473332993, + -5.860823520792594, + -6.016419784247794, + -6.1706950196339205, + -6.3231308135722815, + -6.473176775700157, + -6.62025102086262, + -6.763740973639898, + -6.903004528958652, + -7.037371602208236, + -7.166146101570007, + -7.2886083550027765, + -7.404018021888522, + -7.511617516987375, + -7.61063597084701, + -7.700293746241364, + -7.779807524760243, + -7.8483959708451065, + -7.905285972870452, + -7.949719451906026, + -7.980960718629525, + -7.998304348103999, + -8.001083529974695, + -7.9886788392787516, + -7.9605273600425495, + -7.9161320807162046, + -7.85507146755238, + -7.777009109393199, + -7.681703315482269, + -7.569016536442365, + -7.438924467939087, + -7.291524685759187, + -7.127044649581896, + -6.945848899233794, + -6.748445249478668, + -6.53548976602414, + -6.3077902727903865, + -6.066308097697716, + -5.812157709992361, + -5.546603838506484, + -5.27105559551826, + -4.987057080975225, + -4.696273934638856, + -4.400475386723162, + -4.101511595999077, + -3.8012865448882973, + -3.501727581545477, + -3.204753933522895, + -2.912248154092812, + -2.626036246863928, + -2.347883386603205, + -2.079510930998043, + -1.82263310758173, + -1.578991215402976, + -1.3503161941206063, + -1.13806233926, + -0.943041124896, + -0.765706300473, + -0.606289883747, + -0.464800166314, + -0.341022473577, + -0.234526107712, + -0.144677952308, + -0.0706626966228, + -0.0115088485482, + 0.0338813156142, + 0.0667009552444, + 0.0882112950765, + 0.0997228873316, + 0.102590660495, + 0.0982263968749, + 0.0881280612589, + 0.0739179936831, + 0.0573704872918, + 0.0403950885768, + 0.0249283784569, + 0.0126842855752, + 0.00474133100319, + 0.00104546344821, + 0.000152337319766, + 3.43467769288e-05, + 6.27298999204e-07, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 3, + "j": 4, + "angular_momentum": 1 + }, + { + "radial_function": [ + -0.0, + -4.958533297379413e-27, + -1.6557070413697606e-25, + -1.3121154682440616e-24, + -5.770985455072087e-24, + -1.838384111847122e-23, + -4.775629943284671e-23, + -1.07771704085922e-22, + -2.194100757434754e-22, + -4.1291741334615855e-22, + -7.303761662496528e-22, + -1.228733982934033e-21, + -1.9833548327298597e-21, + -3.0921643664901533e-21, + -4.680470010672862e-21, + -6.906545869443662e-21, + -9.968083135052673e-21, + -1.41096184927117e-20, + -1.9631066061762348e-20, + -2.6897492886109925e-20, + -3.635029399910225e-20, + -4.851994081758966e-20, + -6.404049621870374e-20, + -8.366611135210372e-20, + -1.0828974317994403e-19, + -1.389643582231415e-19, + -1.7692691725358817e-19, + -2.236254678972064e-19, + -2.8074970781127236e-19, + -3.502654203319227e-19, + -4.3445322790341775e-19, + -5.359521563387257e-19, + -6.578085556566533e-19, + -8.035309813013679e-19, + -9.77151703444731e-19, + -1.1832955825354038e-18, + -1.4272571266651618e-18, + -1.7150866317684707e-18, + -2.0536863994984502e-18, + -2.450918130725687e-18, + -2.9157227065564923e-18, + -3.4582536931641146e-18, + -4.090026044460636e-18, + -4.824081627129223e-18, + -5.675173358807682e-18, + -6.659969931590704e-18, + -7.797283294123937e-18, + -9.108321283432345e-18, + -1.0616968043361284e-17, + -1.2350095121396375e-17, + -1.4337906440860625e-17, + -1.6614320652019268e-17, + -1.9217394714885755e-17, + -2.2189792970076876e-17, + -2.5579306341689592e-17, + -2.943942680721812e-17, + -3.3829982766437866e-17, + -3.881784148687529e-17, + -4.447768542115688e-17, + -5.089286985670401e-17, + -5.815637009158934e-17, + -6.637182712152279e-17, + -7.56547017003374e-17, + -8.613354762152651e-17, + -9.795141605810834e-17, + -1.1126740404927125e-16, + -1.262583613698773e-16, + -1.4312077148597254e-16, + -1.6207282377015552e-16, + -1.8335669580785324e-16, + -2.0724106646216194e-16, + -2.340238823080241e-16, + -2.6403540220140593e-16, + -2.9764154724929484e-16, + -3.352475857972113e-16, + -3.7730218620101853e-16, + -4.243018729369685e-16, + -4.767959252139388e-16, + -5.353917609369843e-16, + -6.007608528254045e-16, + -6.736452280611986e-16, + -7.548646074812214e-16, + -8.453242460461466e-16, + -9.460235415872048e-16, + -1.0580654855703554e-15, + -1.1826670363472008e-15, + -1.3211705031494152e-15, + -1.475056036786809e-15, + -1.6459553330896286e-15, + -1.835666663749941e-15, + -2.0461713609317544e-15, + -2.2796518937813893e-15, + -2.538511686617698e-15, + -2.825396845091757e-15, + -3.143219968710479e-15, + -3.4951862482130275e-15, + -3.884822061970512e-15, + -4.316006307342802e-15, + -4.793004723258634e-15, + -5.3205074861130526e-15, + -5.90367038444293e-15, + -6.548159909793122e-15, + -7.260202627348792e-15, + -8.046639230106214e-15, + -8.914983710393068e-15, + -9.873488129292147e-15, + -1.093121350320425e-14, + -1.209810737943217e-14, + -1.3385088721776692e-14, + -1.4804140784747854e-14, + -1.636841272187379e-14, + -1.8092330733328028e-14, + -1.999171964123243e-14, + -2.2083935857714917e-14, + -2.4388012797480203e-14, + -2.6924819889067363e-14, + -2.971723643927781e-14, + -3.2790341722581885e-14, + -3.617162279158364e-14, + -3.98912016416957e-14, + -4.398208351750281e-14, + -4.8480428296085875e-14, + -5.3425847083720725e-14, + -5.886172632907075e-14, + -6.48355819952476e-14, + -7.139944653218728e-14, + -7.861029167547002e-14, + -8.653049034425943e-14, + -9.522832122287654e-14, + -1.0477851993321354e-13, + -1.152628810649434e-13, + -1.267709157065175e-13, + -1.3940056955683047e-13, + -1.5325900713996465e-13, + -1.6846346816754593e-13, + -1.8514220262430187e-13, + -2.034354917596438e-13, + -2.234967627956478e-13, + -2.4549380592407e-13, + -2.6961010285727733e-13, + -2.9604627712527676e-13, + -3.250216771566043e-13, + -3.5677610424011903e-13, + -3.9157169850145093e-13, + -4.29694997283078e-13, + -4.714591815172309e-13, + -5.172065272177159e-13, + -5.673110806387537e-13, + -6.22181577376945e-13, + -6.822646275510472e-13, + -7.480481911973016e-13, + -8.200653698776682e-13, + -8.988985437268504e-13, + -9.851838842687493e-13, + -1.0796162780564498e-12, + -1.1829546972595529e-12, + -1.2960280583068876e-12, + -1.419741612255186e-12, + -1.5550839149487025e-12, + -1.7031344298208164e-12, + -1.8650718193419825e-12, + -2.0421829881255693e-12, + -2.2358729455156915e-12, + -2.447675560259531e-12, + -2.679265289810273e-12, + -2.932469969726611e-12, + -3.2092847600623058e-12, + -3.5118873525832798e-12, + -3.842654552292143e-12, + -4.20418035620067e-12, + -4.5992956654198215e-12, + -5.031089775971014e-12, + -5.502933808950589e-12, + -6.0185062539953965e-12, + -6.5818208162202315e-12, + -7.1972567737888215e-12, + -7.869592069580893e-12, + -8.60403938524319e-12, + -9.406285464000185e-12, + -1.028253397075462e-11, + -1.1239552214004332e-11, + -1.2284722066755075e-11, + -1.3426095470129302e-11, + -1.4672454928176297e-11, + -1.6033379437468268e-11, + -1.7519316344983372e-11, + -1.9141659659111997e-11, + -2.0912835396561243e-11, + -2.2846394591058388e-11, + -2.4957114651756964e-11, + -2.7261109817431693e-11, + -2.977595152473145e-11, + -3.2520799565635645e-11, + -3.551654501677526e-11, + -3.878596597559579e-11, + -4.2353897257296276e-11, + -4.624741530594262e-11, + -5.0496039662328746e-11, + -5.513195248222961e-11, + -6.019023772074246e-11, + -6.570914172020624e-11, + -7.173035713112698e-11, + -7.829933224340802e-11, + -8.546560799456904e-11, + -9.328318512614169e-11, + -1.018109241874815e-10, + -1.1111298129355263e-10, + -1.2125928285693108e-10, + -1.3232604275879922e-10, + -1.4439632572483423e-10, + -1.5756066106277477e-10, + -1.719177112214898e-10, + -1.8757500006817935e-10, + -2.0464970622192768e-10, + -2.2326952720581387e-10, + -2.4357362078063316e-10, + -2.6571363027870263e-10, + -2.898548014626371e-10, + -3.161771990629357e-10, + -3.4487703182365775e-10, + -3.761680957919595e-10, + -4.102833463070548e-10, + -4.4747661022628367e-10, + -4.880244507750684e-10, + -5.322281987051189e-10, + -5.804161644861163e-10, + -6.329460476972111e-10, + -6.902075611073805e-10, + -7.526252885935447e-10, + -8.206617977245979e-10, + -8.948210295227637e-10, + -9.756519902554994e-10, + -1.0637527719460465e-09, + -1.1597749309272273e-09, + -1.2644282563103061e-09, + -1.378485962805286e-09, + -1.502790345998585e-09, + -1.6382589408127853e-09, + -1.785891228081349e-09, + -1.9467759379292794e-09, + -2.1220990029997656e-09, + -2.313152219074114e-09, + -2.521342676290124e-09, + -2.748203029063682e-09, + -2.995402679495719e-09, + -3.264759955097832e-09, + -3.5582553695029595e-09, + -3.878046062005368e-09, + -4.226481520895016e-09, + -4.606120704162788e-09, + -5.019750682219349e-09, + -5.4704069372077744e-09, + -5.961395466135066e-09, + -6.496316848363884e-09, + -7.079092450593091e-09, + -7.713992960874904e-09, + -8.405669456278705e-09, + -9.159187230825024e-09, + -9.980062627274707e-09, + -1.0874303139855356e-08, + -1.1848451078356675e-08, + -1.290963110873498e-08, + -1.4065602014504088e-08, + -1.5324813053448192e-08, + -1.6696465316489935e-08, + -1.8190578533215597e-08, + -1.9818063806438132e-08, + -2.1590802800721614e-08, + -2.3521733958795118e-08, + -2.562494636740682e-08, + -2.791578195169815e-08, + -3.041094673417342e-08, + -3.312863196578718e-08, + -3.6088645998239435e-08, + -3.931255785514283e-08, + -4.2823853535399815e-08, + -4.664810617472628e-08, + -5.081316130082591e-08, + -5.5349338508659005e-08, + -6.028965102013983e-08, + -6.567004470536496e-08, + -7.152965829112755e-08, + -7.791110663907489e-08, + -8.486078911978951e-08, + -9.242922532984603e-08, + -1.0067142054436692e-07, + -1.096472635613444e-07, + -1.194219597882672e-07, + -1.3006650272076632e-07, + -1.416581871304349e-07, + -1.5428116779531582e-07, + -1.680270676401361e-07, + -1.8299563977763773e-07, + -1.9929548817538133e-07, + -2.170448521319504e-07, + -2.3637246021287917e-07, + -2.5741845977019494e-07, + -2.8033542881517934e-07, + -3.052894773876609e-07, + -3.324614464204307e-07, + -3.620482127883213e-07, + -3.9426410971694363e-07, + -4.2934247301076693e-07, + -4.6753732401273334e-07, + -5.091252014761048e-07, + -5.544071554795653e-07, + -6.037109177749743e-07, + -6.573932639539873e-07, + -7.158425847341951e-07, + -7.794816843637843e-07, + -8.487708267431173e-07, + -9.242110504792182e-07, + -1.0063477774632053e-06, + -1.09577473997609e-06, + -1.193138255068548e-06, + -1.2991418767409461e-06, + -1.4145514590976893e-06, + -1.5402006667302893e-06, + -1.676996972043697e-06, + -1.8259281822670052e-06, + -1.9880695428340733e-06, + -2.1645914681867606e-06, + -2.3567679548653645e-06, + -2.565985737567222e-06, + -2.7937542533030123e-06, + -3.0417164850138376e-06, + -3.311660761698507e-06, + -3.6055336002626102e-06, + -3.9254536797112325e-06, + -4.273727047693374e-06, + -4.6528636690765084e-06, + -5.065595432138934e-06, + -5.514895743221864e-06, + -6.004000848012033e-06, + -6.536433031722566e-06, + -7.116025863211319e-06, + -7.746951663205823e-06, + -8.433751391268533e-06, + -9.181367163944961e-06, + -9.995177637330221e-06, + -1.0881036500830512e-05, + -1.1845314361537689e-05, + -1.2894944309533025e-05, + -1.403747149432002e-05, + -1.5281107057523093e-05, + -1.6634786807765673e-05, + -1.8108235052580823e-05, + -1.9712034036089092e-05, + -2.1457699478503837e-05, + -2.3357762745580194e-05, + -2.542586023236274e-05, + -2.7676830590647954e-05, + -3.012682048261527e-05, + -3.2793399612595655e-05, + -3.5695685836913645e-05, + -3.8854481243711965e-05, + -4.229242014468284e-05, + -4.603413003247802e-05, + -5.010640662214702e-05, + -5.453840420523179e-05, + -5.9361842656571775e-05, + -6.461123252759223e-05, + -7.032411981304063e-05, + -7.654135209071537e-05, + -8.330736788881413e-05, + -9.06705113025048e-05, + -9.868337403723649e-05, + -0.00010740316726178584, + -0.00011689212585108168, + -0.00012721794780884307, + -0.00013845427191716385, + -0.0001506811969140462, + -0.0001639858457585394, + -0.00017846297890476178, + -0.0001942156607527099, + -0.00021135598388805307, + -0.00023000585605237735, + -0.00025029785521130837, + -0.00027237615857909745, + -0.000296397551898223, + -0.00032253252585765256, + -0.0003509664670515632, + -0.0003819009515336382, + -0.00041555514975103694, + -0.00045216735219456616, + -0.0004919966261525382, + -0.0005353246145200035, + -0.0005824574887555038, + -0.0006337280689507728, + -0.0006894981250953298, + -0.0007501608747242835, + -0.0008161436934053815, + -0.0008879110559717123, + -0.00096596772754378, + -0.0010508622253508405, + -0.0011431905737082654, + -0.0012436003763998576, + -0.0013527952328397557, + -0.0014715395260528645, + -0.0016006636133175708, + -0.0017410694520547324, + -0.001893736696759163, + -0.00205972930512011, + -0.0022402026944590707, + -0.002436411493016282, + -0.002649717933784613, + -0.002881600942240005, + -0.0031336659731410676, + -0.0034076556559732326, + -0.0037054613123014618, + -0.0040291354139303905, + -0.004380905054615629, + -0.004763186514270819, + -0.005178600999661264, + -0.005629991651114704, + -0.006120441912084589, + -0.006653295363616874, + -0.0072321771330636124, + -0.007861016994978683, + -0.00854407428529126, + -0.00928596476509933, + -0.010091689570646663, + -0.010966666397260625, + -0.011916763079069574, + -0.012948333725506325, + -0.014068257590241476, + -0.015283980861689896, + -0.016603561558497945, + -0.0180357177469823, + -0.019589879271608525, + -0.021276243243924502, + -0.02310583349818441, + -0.025090564256182085, + -0.027243308253191875, + -0.029577969562735736, + -0.03210956138530307, + -0.0348542890546199, + -0.03782963851608012, + -0.04105447055399051, + -0.04454912100386704, + -0.048335507214732495, + -0.05243724099310485, + -0.056879748265065276, + -0.06169039564466879, + -0.06689862411420329, + -0.07253608995424625, + -0.07863681302562538, + -0.08523733250024516, + -0.09237687000896544, + -0.1000975001878394, + -0.10844432844329016, + -0.11746567574875519, + -0.12721327010363517, + -0.13774244418072826, + -0.1491123386280738, + -0.16138611016871612, + -0.1746311436066075, + -0.1889192665881756, + -0.204326965715864, + -0.22093560237574436, + -0.23883162637917285, + -0.2581067851631405, + -0.2788583259913118, + -0.3011891881798417, + -0.3252081820185066, + -0.3510301506086835, + -0.3787761103145065, + -0.40857336511901043, + -0.44055558965506275, + -0.474862874995985, + -0.5116417309813543, + -0.551045038054721, + -0.5932319410904222, + -0.6383676772912408, + -0.6866233293586385, + -0.7381754949689667, + -0.7932058628374031, + -0.8519006855298193, + -0.9144501385635544, + -0.9810475554295167, + -1.0518885277162127, + -1.127169860166762, + -1.207088369882287, + -1.2918395202649966, + -1.3816158801849203, + -1.4766054000365985, + -1.5769894976753485, + -1.6829409479670419, + -1.7946215719475966, + -1.9121797229147868, + -2.0357475689216367, + -2.165438173196195, + -2.301342376217769, + -2.44352548497471, + -2.592023777593943, + -2.74684083218444, + -2.9079436908775573, + -3.0752588704461057, + -3.248668230543169, + -3.428004710431037, + -3.6130479431340947, + -3.803519753765551, + -3.999079545341568, + -4.199319573114853, + -4.403760105265573, + -4.611844465936705, + -4.822933959051772, + -5.036302676220137, + -5.251132204816548, + -5.466506274254454, + -5.681405412892613, + -5.894701738985722, + -6.105154079332915, + -6.311403703227223, + -6.511971078658342, + -6.705254202746435, + -6.889529229027155, + -7.062954300380148, + -7.223577689197829, + -7.369351522485471, + -7.4981525000935925, + -7.607811055174917, + -7.696150304115728, + -7.76103581948454, + -7.800436660009365, + -7.812497127487263, + -7.7956173278102625, + -7.748538758940863, + -7.670428864524686, + -7.5609559145214105, + -7.420342998079406, + -7.249387847689176, + -7.049434435692589, + -6.822283870324938, + -6.5700374128730346, + -6.294874910236543, + -5.998788847025369, + -5.683317981790152, + -5.349353666333714, + -4.997121524322622, + -4.6264607507869036, + -4.237514720130145, + -3.8318825457230123, + -3.414127070818616, + -2.9932585756577734, + -2.58341455001619, + -2.2025306568473497, + -1.8676788095826107, + -1.586777675773107, + -1.3504326794351245, + -1.13806233926, + -0.943041124896, + -0.765706300473, + -0.606289883747, + -0.464800166314, + -0.341022473577, + -0.234526107712, + -0.144677952308, + -0.0706626966228, + -0.0115088485482, + 0.0338813156142, + 0.0667009552444, + 0.0882112950765, + 0.0997228873316, + 0.102590660495, + 0.0982263968749, + 0.0881280612589, + 0.0739179936831, + 0.0573704872918, + 0.0403950885768, + 0.0249283784569, + 0.0126842855752, + 0.00474133100319, + 0.00104546344821, + 0.000152337319766, + 3.43467769288e-05, + 6.27298999204e-07, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 3, + "j": 4, + "angular_momentum": 3 + }, + { + "radial_function": [ + -0.0, + -6.632361235898367e-16, + -5.4431002030541346e-15, + -1.8846879989743628e-14, + -4.583594817970107e-14, + -9.185821178227443e-14, + -1.6288257701058933e-13, + -2.6543554631672213e-13, + -4.066400706951488e-13, + -5.942567871353728e-13, + -8.367277784935476e-13, + -1.143223000420468e-12, + -1.5236895281535143e-12, + -1.9889037844819943e-12, + -2.5505269187338745e-12, + -3.2211635166265637e-12, + -4.014423830033985e-12, + -4.94498972692165e-12, + -6.028684571587908e-12, + -7.282547258315763e-12, + -8.724910632536546e-12, + -1.0375484547366675e-11, + -1.2255443815605282e-11, + -1.4387521334177943e-11, + -1.6796106669667873e-11, + -1.950735041149447e-11, + -2.254927461749159e-11, + -2.595188968911165e-11, + -2.974731803873487e-11, + -3.396992492489759e-11, + -3.8656456857149516e-11, + -4.3846187989878766e-11, + -4.9581074949098535e-11, + -5.590592056105744e-11, + -6.286854697486924e-11, + -7.051997870076021e-11, + -7.891463610938928e-11, + -8.811053997297638e-11, + -9.816952765753784e-11, + -1.0915748160392645e-10, + -1.2114457078170235e-10, + -1.3420550582162232e-10, + -1.4841980858447438e-10, + -1.6387209695391052e-10, + -1.8065238569502576e-10, + -1.9885640424870771e-10, + -2.1858593240146908e-10, + -2.399491547861826e-10, + -2.630610352990355e-10, + -2.8804371241014065e-10, + -3.150269166435047e-10, + -3.4414841135419537e-10, + -3.7555445801863223e-10, + -4.094003075656018e-10, + -4.458507189194961e-10, + -4.850805063898849e-10, + -5.272751174776862e-10, + -5.726312426664574e-10, + -6.213574589664678e-10, + -6.736749090506416e-10, + -7.298180179381733e-10, + -7.900352492079529e-10, + -8.54589902855314e-10, + -9.237609571914054e-10, + -9.978439568698487e-10, + -1.0771519499387958e-09, + -1.1620164761768272e-09, + -1.2527886097007356e-09, + -1.3498400587034035e-09, + -1.4535643253713208e-09, + -1.5643779293245632e-09, + -1.6827216978934134e-09, + -1.809062126708114e-09, + -1.943892814818178e-09, + -2.0877359776956596e-09, + -2.241144043019715e-09, + -2.4047013330452932e-09, + -2.579025838499987e-09, + -2.7647710890237344e-09, + -2.9626281250733614e-09, + -3.173327576947239e-09, + -3.397641856220402e-09, + -3.636387466404762e-09, + -3.890427438398396e-09, + -4.160673897824794e-09, + -4.448090771143013e-09, + -4.75369663830472e-09, + -5.078567738831283e-09, + -5.423841140965695e-09, + -5.790718081141662e-09, + -6.180467483595127e-09, + -6.594429670170306e-09, + -7.034020268684598e-09, + -7.50073433320979e-09, + -7.996150684365425e-09, + -8.521936484137875e-09, + -9.079852055829014e-09, + -9.67175596331074e-09, + -1.0299610362169218e-08, + -1.096548663886347e-08, + -1.1671571351115399e-08, + -1.2420172488188931e-08, + -1.3213726064449353e-08, + -1.4054803068182697e-08, + -1.494611678035096e-08, + -1.5890530486323294e-08, + -1.689106559870027e-08, + -1.79509102152954e-08, + -1.9073428133964645e-08, + -2.0262168347855537e-08, + -2.1520875049608037e-08, + -2.2853498167069347e-08, + -2.4264204462125314e-08, + -2.575738922166407e-08, + -2.7337688570173114e-08, + -2.900999243941087e-08, + -3.0779458228445905e-08, + -3.265152519097075e-08, + -3.4631929587941764e-08, + -3.672672064587155e-08, + -3.8942277365980746e-08, + -4.128532622321371e-08, + -4.376295980977015e-08, + -4.6382656465414934e-08, + -4.915230095431375e-08, + -5.208020623508806e-08, + -5.517513639016557e-08, + -5.8446330770167346e-08, + -6.19035294188514e-08, + -6.55569998460305e-08, + -6.941756522114989e-08, + -7.349663405959551e-08, + -7.78062314834372e-08, + -8.23590321358959e-08, + -8.716839484049273e-08, + -9.224839909459564e-08, + -9.761388349557281e-08, + -1.032804861961053e-07, + -1.092646875063055e-07, + -1.1558385474224377e-07, + -1.2225628945107884e-07, + -1.2930127712871904e-07, + -1.3673913956837522e-07, + -1.445912899713552e-07, + -1.5288029097475844e-07, + -1.6162991573615023e-07, + -1.7086521225162055e-07, + -1.8061257106551557e-07, + -1.9089979655132763e-07, + -2.0175618195780066e-07, + -2.132125884242691e-07, + -2.2530152812628803e-07, + -2.3805725187374697e-07, + -2.5151584124093145e-07, + -2.6571530564383714e-07, + -2.8069568446236583e-07, + -2.9649915458685004e-07, + -3.131701436109902e-07, + -3.3075544897933657e-07, + -3.493043634684459e-07, + -3.6886880719481256e-07, + -3.895034666123658e-07, + -4.1126594086502657e-07, + -4.3421689573872945e-07, + -4.5842022585626144e-07, + -4.83943225289105e-07, + -5.108567671895214e-07, + -5.392354928793611e-07, + -5.691580108923713e-07, + -6.007071064312189e-07, + -6.339699619139074e-07, + -6.69038389060868e-07, + -7.060090731974069e-07, + -7.449838303859653e-07, + -7.86069878087058e-07, + -8.293801200756281e-07, + -8.750334462231693e-07, + -9.231550481314592e-07, + -9.73876751350493e-07, + -1.0273373648726903e-06, + -1.0836830492643875e-06, + -1.143067703845368e-06, + -1.2056533743626618e-06, + -1.2716106820837297e-06, + -1.341119275243037e-06, + -1.4143683043681853e-06, + -1.4915569224124437e-06, + -1.572894811242506e-06, + -1.6586027356649591e-06, + -1.748913126538982e-06, + -1.8440706944487105e-06, + -1.9443330757159004e-06, + -2.0499715119722307e-06, + -2.1612715657598665e-06, + -2.2785338733462178e-06, + -2.402074937067346e-06, + -2.532227959439938e-06, + -2.6693437206388723e-06, + -2.8137915021179527e-06, + -2.96596005885318e-06, + -3.126258642163412e-06, + -3.2951180763242713e-06, + -3.4729918915893684e-06, + -3.660357516523104e-06, + -3.8577175327753985e-06, + -4.065600995775949e-06, + -4.2845648241904815e-06, + -4.515195262495838e-06, + -4.758109420173467e-06, + -5.013956891119721e-06, + -5.283421458275211e-06, + -5.567222887249786e-06, + -5.866118813817392e-06, + -6.1809067304671785e-06, + -6.512426076508032e-06, + -6.861560438105486e-06, + -7.229239862934154e-06, + -7.61644329618948e-06, + -8.02420114427112e-06, + -8.453597972049549e-06, + -8.905775341835877e-06, + -9.381934800336557e-06, + -9.88334102247777e-06, + -1.0411325118923383e-05, + -1.0967288117208302e-05, + -1.1552704624520848e-05, + -1.2169126682346191e-05, + -1.2818187822281948e-05, + -1.3501607334122624e-05, + -1.42211947575258e-05, + -1.4978854607424288e-05, + -1.577659134754566e-05, + -1.661651462316651e-05, + -1.7500844767627e-05, + -1.8431918597168943e-05, + -1.941219550710275e-05, + -2.0444263888452474e-05, + -2.1530847878417926e-05, + -2.267481446396165e-05, + -2.3879180956720843e-05, + -2.5147122858626953e-05, + -2.6481982137240536e-05, + -2.7887275934771823e-05, + -2.936670573086667e-05, + -3.092416698477842e-05, + -3.256375927994402e-05, + -3.4289796999453186e-05, + -3.610682055801926e-05, + -3.801960822119386e-05, + -4.0033188540130205e-05, + -4.215285343719918e-05, + -4.438417197343088e-05, + -4.6733004834361706e-05, + -4.920551957373198e-05, + -5.180820664882158e-05, + -5.4547896297290556e-05, + -5.743177628996348e-05, + -6.0467410613242005e-05, + -6.366275912385004e-05, + -6.70261982291516e-05, + -7.05665426473287e-05, + -7.429306830074765e-05, + -7.821553640329676e-05, + -8.23442188044442e-05, + -8.668992465310469e-05, + -9.126402845308998e-05, + -9.607849958057695e-05, + -0.00010114593333757261, + -0.00010647958362649325, + -0.00011209339732577903, + -0.00011800205045786445, + -0.00012422098623720638, + -0.00013076645510670676, + -0.0001376555568513325, + -0.00014490628491130986, + -0.00015253757300091102, + -0.00016056934414844414, + -0.00016902256229980325, + -0.00017791928659600196, + -0.00018728272848409226, + -0.00019713731179423882, + -0.00020750873594155232, + -0.0002184240424250555, + -0.0002299116847658845, + -0.0002420016021059236, + -0.00025472529660893373, + -0.0002681159149006639, + -0.0002822083337302618, + -0.00029703925011516277, + -0.0003126472760880974, + -0.00032907303848222054, + -0.00034635928379068986, + -0.0003645509885263345, + -0.00038369547530371916, + -0.00040384253493750734, + -0.0004250445548756005, + -0.00044735665427345333, + -0.00047083682614197306, + -0.0004955460867846485, + -0.0005215486329950615, + -0.0005489120074754835, + -0.0005777072726985495, + -0.0006080091938939019, + -0.0006398964314349679, + -0.0006734517432000457, + -0.0007087621973959525, + -0.0007459193964365468, + -0.0007850197122906024, + -0.0008261645341549152, + -0.0008694605287383032, + -0.0009150199141882881, + -0.0009629607479097291, + -0.0010134072295458372, + -0.0010664900193086994, + -0.0011223465728530096, + -0.001181121493447698, + -0.0012429669022345378, + -0.0013080428275041938, + -0.0013765176140979837, + -0.0014485683538443383, + -0.0015243813380932162, + -0.001604152533581964, + -0.0016880880826107623, + -0.0017764048290119835, + -0.0018693308710599345, + -0.0019671061427558737, + -0.0020699830247589606, + -0.0021782269868381972, + -0.0022921172630017807, + -0.002411947561095568, + -0.002538026809011987, + -0.0026706799384877485, + -0.0028102487092699275, + -0.0029570925751453707, + -0.0031115895940803866, + -0.003274137384636026, + -0.0034451541311161502, + -0.0036250796396513404, + -0.0038143764477681385, + -0.004013530990643235, + -0.004223054825675269, + -0.004443485919832581, + -0.004675390001161283, + -0.00491936197932871, + -0.005176027437110347, + -0.005446044197230483, + -0.005730103968076414, + -0.0060289340715820325, + -0.006343299258309439, + -0.00667400361285406, + -0.007021892554782029, + -0.007387854939442901, + -0.007772825262992715, + -0.008177785977791752, + -0.008603769921861227, + -0.009051862869744246, + -0.009523206208342653, + -0.010018999745877808, + -0.010540504658640173, + -0.011089046582387425, + -0.01166601885608568, + -0.012272885923308921, + -0.012911186900464475, + -0.013582539318427041, + -0.014288643045568254, + -0.015031284401234446, + -0.01581234046721892, + -0.01663378360703584, + -0.017497686202359464, + -0.018406225615397225, + -0.01936168938804691, + -0.020366480688407015, + -0.02142312401377452, + -0.022534271164370453, + -0.023702707495539137, + -0.0249313584636299, + -0.0262232964763863, + -0.02758174805985582, + -0.029010101356779113, + -0.03051191396817304, + -0.0320909211538231, + -0.033751044404029526, + -0.0354964003975286, + -0.03733131036382781, + -0.039260309858620425, + -0.04128815897624725, + -0.043419853007577065, + -0.045660633564308765, + -0.048016000184482655, + -0.050491722436704, + -0.05309385253857829, + -0.05582873850632394, + -0.058703037856959336, + -0.06172373187164452, + -0.06489814044596799, + -0.0682339375389667, + -0.07173916723678406, + -0.07542226045300653, + -0.0792920522723779, + -0.08335779996395443, + -0.08762920166652986, + -0.09211641576969158, + -0.09683008099894025, + -0.10178133721377988, + -0.1069818469331577, + -0.11244381759442101, + -0.11818002455144609, + -0.12420383481481137, + -0.1305292315413777, + -0.13717083926120768, + -0.14414394985013468, + -0.1514645492269674, + -0.1591493447725604, + -0.16721579345152454, + -0.1756821306069281, + -0.18456739941479453, + -0.19389148095304992, + -0.20367512484319183, + -0.21393998043870793, + -0.22470862845297299, + -0.2360046130349561, + -0.24785247415795356, + -0.26027778023001696, + -0.27330716089748663, + -0.2869683398557132, + -0.3012901675562246, + -0.31630265373370064, + -0.33203699946700865, + -0.34852562877996146, + -0.36580221933874146, + -0.3839017323269131, + -0.4028604410144109, + -0.422715957834579, + -0.44350725975975025, + -0.46527471152931194, + -0.48806008648572075, + -0.5119065845868221, + -0.5368588471361381, + -0.5629629679284157, + -0.5902665001436884, + -0.6188184585876227, + -0.6486693166328178, + -0.6798709973189757, + -0.7124768578081075, + -0.7465416666474727, + -0.7821215729710977, + -0.8192740667585225, + -0.8580579294719588, + -0.898533173878699, + -0.9407609723051019, + -0.9848035720200836, + -1.0307241968705572, + -1.0785869338045697, + -1.1284566029892693, + -1.1803986105469615, + -1.2344787820806389, + -1.290763175834786, + -1.3493178739922547, + -1.4102087504631804, + -1.473501213580312, + -1.5392599221485292, + -1.607548473088872, + -1.678429059048238, + -1.7519620941677416, + -1.8282058063848343, + -1.9072157945924506, + -1.989044548827793, + -2.073740932007582, + -2.1613496217600128, + -2.2519105106071344, + -2.345458063592476, + -2.442020631955802, + -2.541619721901384, + -2.6442692181454777, + -2.7499745614070954, + -2.858731880199134, + -2.970527077012158, + -3.0853348700720282, + -3.2031177917415063, + -3.3238251458768273, + -3.447391926425282, + -3.5737377014020666, + -3.702765465694605, + -3.8343604687849977, + -3.968389023187352, + -4.104697301113985, + -4.243110128393656, + -4.383429785107273, + -4.525434824843409, + -4.668878925301861, + -4.813489784845607, + -4.958968081228064, + -5.104986510530205, + -5.251188925795697, + -5.397189597435523, + -5.542572618172808, + -5.68689147803925, + -5.829668836265904, + -5.970396518207868, + -6.108535767421105, + -6.243517783874568, + -6.374744580340506, + -6.501590189222741, + -6.623402252845293, + -6.7395040294254205, + -6.849196845714219, + -6.951763026284339, + -7.046469326373594, + -7.132570892036674, + -7.209315767011041, + -7.275949960246425, + -7.331723081615307, + -7.375894545522924, + -7.407740333368325, + -7.426560295750898, + -7.431685964107705, + -7.4224888294579445, + -7.398389032751561, + -7.358864397729179, + -7.303459723097409, + -7.2317962365287745, + -7.1435810990898, + -7.038616835013944, + -6.916810549205167, + -6.7781827827929035, + -6.622875846460035, + -6.451161461054039, + -6.263447525180679, + -6.060283819065491, + -5.8423664412558445, + -5.610540759137861, + -5.365802632698574, + -5.10929764348417, + -4.842318026452128, + -4.566296963553865, + -4.282799861939738, + -3.9935122202077116, + -3.700223706271403, + -3.404808169732324, + -3.109199542775112, + -2.815364015969987, + -2.5252695850714897, + -2.2408551038261693, + -1.9640023203525265, + -1.6965157837963938, + -1.4401163118693696, + -1.1964523643019003, + -0.9671270104258113, + -0.7537201321076954, + -0.5577448841670521, + -0.380402131218, + -0.222258756351, + -0.0835113111103, + 0.0358884454011, + 0.136232712278, + 0.218052899336, + 0.282107958818, + 0.32936540878, + 0.360975268622, + 0.378238012831, + 0.3825688029, + 0.375461600528, + 0.358458102932, + 0.333127386149, + 0.301062153529, + 0.263895650629, + 0.223338770815, + 0.181228369703, + 0.13956514935, + 0.100502923544, + 0.0662352907861, + 0.0387199140786, + 0.0192079768788, + 0.00764847681764, + 0.0022948256846, + 0.000374189072685, + 5.20729302235e-06, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 3, + "j": 5, + "angular_momentum": 1 + }, + { + "radial_function": [ + -0.0, + -4.658158495211422e-27, + -1.5554086980549964e-25, + -1.2326309915741583e-24, + -5.42139445499276e-24, + -1.7270196758788892e-23, + -4.4863349414437755e-23, + -1.0124317995365308e-22, + -2.0611879500813743e-22, + -3.8790397108469267e-22, + -6.861319143175142e-22, + -1.1543005356100668e-21, + -1.8632084548212067e-21, + -2.904849246477255e-21, + -4.396939545333392e-21, + -6.4881656299131526e-21, + -9.36424308412527e-21, + -1.3254895209067087e-20, + -1.8441868121816147e-20, + -2.5268114072570062e-20, + -3.4148289553722186e-20, + -4.558073143000819e-20, + -6.016109273041649e-20, + -7.85978401272861e-20, + -1.0172983761732886e-19, + -1.3054626580116558e-19, + -1.6620915364647678e-19, + -2.100788298929977e-19, + -2.637426347935956e-19, + -3.2904726974155537e-19, + -4.0813520311985305e-19, + -5.034855955543465e-19, + -6.179602572563107e-19, + -7.548552046832065e-19, + -9.179584437705824e-19, + -1.111614673183055e-18, + -1.3407976737497137e-18, + -1.6111912305188355e-18, + -1.929279522010086e-18, + -2.302448008099979e-18, + -2.739095955023711e-18, + -3.2487618528377713e-18, + -3.8422631100783605e-18, + -4.531851551726196e-18, + -5.331386402787319e-18, + -6.256526610188581e-18, + -7.32494454460984e-18, + -8.556563328546319e-18, + -9.973820267744352e-18, + -1.1601959102601231e-17, + -1.3469354082861736e-17, + -1.5607869156907515e-17, + -1.8053255895040392e-17, + -2.084559414526976e-17, + -2.4029779784256704e-17, + -2.7656064387367837e-17, + -3.178065210859836e-17, + -3.646635957375942e-17, + -4.1783345170582394e-17, + -4.780991474427148e-17, + -5.4633411395960766e-17, + -6.235119782475822e-17, + -7.107174047831089e-17, + -8.091580570232674e-17, + -9.201777900925874e-17, + -1.0452711976174055e-16, + -1.1860996464446786e-16, + -1.3445089467641893e-16, + -1.522548818969191e-16, + -1.7224943341586484e-16, + -1.9468695224377127e-16, + -2.1984733614271593e-16, + -2.4804083776360446e-16, + -2.7961121168388577e-16, + -3.1493917616831345e-16, + -3.5444622043460888e-16, + -3.9859879082420516e-16, + -4.47912892669576e-16, + -5.02959148111589e-16, + -5.643683538348702e-16, + -6.328375869848401e-16, + -7.091369118865962e-16, + -7.94116745559122e-16, + -8.887159449670494e-16, + -9.939706852826847e-16, + -1.111024204752986e-15, + -1.2411374990819132e-15, + -1.3857010554752507e-15, + -1.5462477259648643e-15, + -1.724466847721739e-15, + -1.922219729072331e-15, + -2.141556630982098e-15, + -2.384735384712562e-15, + -2.654241801868159e-15, + -2.952812044420651e-15, + -3.283457141176064e-15, + -3.649489851880763e-15, + -4.054554100608261e-15, + -4.502657219169006e-15, + -4.998205265548721e-15, + -5.5460417043320046e-15, + -6.151489766084254e-15, + -6.820398827242978e-15, + -7.55919518983139e-15, + -8.374937668526197e-15, + -9.275378436522812e-15, + -1.026902961797991e-14, + -1.136523616428215e-14, + -1.2574255597494006e-14, + -1.3907345258500045e-14, + -1.5376857760154677e-14, + -1.6996345401884095e-14, + -1.8780674380283395e-14, + -2.074614970232607e-14, + -2.2910651789231518e-14, + -2.5293785855247645e-14, + -2.7917045239838884e-14, + -3.080398998198756e-14, + -3.3980442042059583e-14, + -3.747469870545469e-14, + -4.131776584723901e-14, + -4.554361287579859e-14, + -5.018945136250972e-14, + -5.5296039521028664e-14, + -6.090801492456508e-14, + -6.707425803651689e-14, + -7.38482893972805e-14, + -8.128870354166259e-14, + -8.945964301426818e-14, + -9.843131615338326e-14, + -1.0828056265182657e-13, + -1.1909147125650434e-13, + -1.309560543788208e-13, + -1.4397498480382604e-13, + -1.5825840017647064e-13, + -1.7392678144222827e-13, + -1.9111191198979178e-13, + -2.0995792483308782e-13, + -2.306224458859385e-13, + -2.5327784203301183e-13, + -2.78112583571829e-13, + -3.053327313949549e-13, + -3.3516356027661096e-13, + -3.678513306018547e-13, + -4.0366522205565905e-13, + -4.4289944391673893e-13, + -4.858755380447671e-13, + -5.329448919854868e-13, + -5.844914812415641e-13, + -6.409348615030067e-13, + -7.027334335126959e-13, + -7.70388004989547e-13, + -8.444456770647548e-13, + -9.255040837244314e-13, + -1.0142160171892546e-12, + -1.111294473166676e-12, + -1.2175181545935104e-12, + -1.3337374748940638e-12, + -1.4608811059071409e-12, + -1.599963120131418e-12, + -1.7520907799009673e-12, + -1.9184730326854212e-12, + -2.1004297762303137e-12, + -2.299401961742039e-12, + -2.516962612663178e-12, + -2.754828839326872e-12, + -3.0148749405142196e-12, + -3.299146689462033e-12, + -3.609876910926586e-12, + -3.949502464796522e-12, + -4.32068276408185e-12, + -4.726319963874639e-12, + -5.169580972182779e-12, + -5.653921446047545e-12, + -6.183111951595722e-12, + -6.761266482638878e-12, + -7.392873547745612e-12, + -8.082830059034234e-12, + -8.836478272925433e-12, + -9.659646053906926e-12, + -1.0558690766177716e-11, + -1.1540547109926607e-11, + -1.2612779262701596e-11, + -1.3783637709629707e-11, + -1.5062121179201123e-11, + -1.645804414822393e-11, + -1.798211040899314e-11, + -1.9645993246146427e-11, + -2.1462422811192722e-11, + -2.3445281340946242e-11, + -2.5609706920757446e-11, + -2.7972206561242073e-11, + -3.055077941064065e-11, + -3.336505102594394e-11, + -3.643641967506647e-11, + -3.978821575410146e-11, + -4.344587549712938e-11, + -4.743713023982597e-11, + -5.1792212640034553e-11, + -5.6544081373126734e-11, + -6.172866593439139e-11, + -6.738513336100322e-11, + -7.355617882503478e-11, + -8.028834222689131e-11, + -8.763235311066072e-11, + -9.564350643711125e-11, + -1.0438207194482641e-10, + -1.1391374012465506e-10, + -1.243101080623693e-10, + -1.356492086873114e-10, + -1.480160873320157e-10, + -1.6150342979247474e-10, + -1.7621224648906433e-10, + -1.922526177429861e-10, + -2.09744505581385e-10, + -2.288186380487557e-10, + -2.4961747243008077e-10, + -2.722962444547709e-10, + -2.9702411114132926e-10, + -3.2398539557719e-10, + -3.5338094277976193e-10, + -3.8542959646090223e-10, + -4.2036980753361614e-10, + -4.584613859974435e-10, + -4.999874090579764e-10, + -5.452562993137726e-10, + -5.946040881977408e-10, + -6.483968811026695e-10, + -7.070335421798805e-10, + -7.70948618377527e-10, + -8.406155238663589e-10, + -9.165500082007391e-10, + -9.993139332864267e-10, + -1.0895193867034555e-09, + -1.1878331613253605e-09, + -1.294981633585226e-09, + -1.411756076186323e-09, + -1.5390184435152604e-09, + -1.6777076719688416e-09, + -1.8288465409363302e-09, + -1.9935491442644088e-09, + -2.173029026266438e-09, + -2.368608041652725e-09, + -2.5817260033614336e-09, + -2.813951188542619e-09, + -3.0669917786326097e-09, + -3.34270831681453e-09, + -3.6431272729039446e-09, + -3.970455814266952e-09, + -4.327097889467946e-09, + -4.715671741740253e-09, + -5.139028978708394e-09, + -5.600275336669853e-09, + -6.102793290253911e-09, + -6.650266670100063e-09, + -7.246707468502163e-09, + -7.896485025235609e-09, + -8.60435780646513e-09, + -9.375508005565014e-09, + -1.0215579216757602e-08, + -1.113071745441137e-08, + -1.2127615814052154e-08, + -1.3213563098513469e-08, + -1.4396496761077752e-08, + -1.5685060547802154e-08, + -1.708866725660988e-08, + -1.861756706631309e-08, + -2.02829219287e-08, + -2.2096886562855454e-08, + -2.407269663562336e-08, + -2.622476476616465e-08, + -2.8568785046108646e-08, + -3.112184683391614e-08, + -3.390255863991208e-08, + -3.693118300165663e-08, + -4.0229783320415025e-08, + -4.3822383716477754e-08, + -4.7735143064016645e-08, + -5.199654445159552e-08, + -5.663760144399471e-08, + -6.169208262695043e-08, + -6.719675605606122e-08, + -7.319165537823497e-08, + -7.972036952925946e-08, + -8.683035811848466e-08, + -9.457329474826937e-08, + -1.0300544076362163e-07, + -1.1218805210997217e-07, + -1.221878222580847e-07, + -1.3307736431241303e-07, + -1.4493573590429173e-07, + -1.5784901050290682e-07, + -1.7191089936346892e-07, + -1.8722342855093487e-07, + -2.0389767590936025e-07, + -2.2205457328512823e-07, + -2.41825779757208e-07, + -2.633546322342214e-07, + -2.867971801291987e-07, + -3.1232331162641006e-07, + -3.401179797037946e-07, + -3.7038253653059467e-07, + -4.0333618606673587e-07, + -4.392175651156282e-07, + -4.782864642738113e-07, + -5.208257011136813e-07, + -5.671431591177734e-07, + -6.175740068196017e-07, + -6.724831134046178e-07, + -7.322676776810291e-07, + -7.973600897722621e-07, + -8.682310454631953e-07, + -9.453929363021141e-07, + -1.0294035389507273e-06, + -1.120870030788434e-06, + -1.2204533604500585e-06, + -1.3288730044639223e-06, + -1.446912144051161e-06, + -1.575423299398065e-06, + -1.7153344615568054e-06, + -1.867655765835856e-06, + -2.033486754644441e-06, + -2.2140242813368915e-06, + -2.4105711120674065e-06, + -2.6245452868454543e-06, + -2.8574903068387493e-06, + -3.1110862203134405e-06, + -3.3871616872698427e-06, + -3.687707107915545e-06, + -4.014888908936614e-06, + -4.371065090613473e-06, + -4.7588021433806955e-06, + -5.180893456761977e-06, + -5.6403793504981605e-06, + -6.140568870931333e-06, + -6.685063507708128e-06, + -7.27778300008138e-06, + -7.922993415680522e-06, + -8.625337701354442e-06, + -9.389868925227553e-06, + -1.022208644183457e-05, + -1.1127975242868448e-05, + -1.2114048766318579e-05, + -1.3187395474250118e-05, + -1.4355729523513275e-05, + -1.5627445891985645e-05, + -1.7011680350144498e-05, + -1.8518374699604275e-05, + -2.0158347744723024e-05, + -2.194337249350628e-05, + -2.3886260136881553e-05, + -2.6000951397761166e-05, + -2.830261589115154e-05, + -3.080776020188757e-05, + -3.353434543165092e-05, + -3.650191505335361e-05, + -3.973173395797634e-05, + -4.324693968404929e-05, + -4.7072706880656954e-05, + -5.1236426158478164e-05, + -5.5767898588083706e-05, + -6.06995471927933e-05, + -6.60666469273493e-05, + -7.190757473946963e-05, + -7.82640814570851e-05, + -8.518158740098111e-05, + -9.27095037690997e-05, + -0.00010090158203185334, + -0.00010981629376299396, + -0.00011951724352792955, + -0.0001300736176929993, + -0.0001415606722578074, + -0.00015406026305580668, + -0.00016766142200816148, + -0.0001824609833477274, + -0.00019856426414750916, + -0.00021608580379742383, + -0.00023515016747352048, + -0.00025589281910538147, + -0.0002784610697609317, + -0.00030301510791772723, + -0.00032972911857676675, + -0.0003587924987888267, + -0.00039041117784838425, + -0.00042480905092936674, + -0.00046222953592453466, + -0.0005029372637805446, + -0.0005472199136923741, + -0.0005953902053414013, + -0.0006477880614105435, + -0.0007047829546494053, + -0.0007667764549534985, + -0.0008342049932842354, + -0.0009075428603248675, + -0.0009873054596146395, + -0.0010740528361685758, + -0.0011683935033676273, + -0.0012709885929004818, + -0.0013825563541011781, + -0.0015038770316607919, + -0.0016357981523250507, + -0.0017792402542059294, + -0.0019352030945411422, + -0.0021047723745341237, + -0.0022891270231007875, + -0.0024895470843208116, + -0.002707422256815551, + -0.0029442611368603933, + -0.0032017012211680317, + -0.003481519728735108, + -0.003785645306427302, + -0.0041161706865765, + -0.00447536637067302, + -0.00486569541795731, + -0.005289829422896746, + -0.005750665772368575, + -0.006251346278237179, + -0.006795277287826321, + -0.007386151382813719, + -0.008027970779990078, + -0.008725072561586646, + -0.009482155863007897, + -0.010304311156255094, + -0.011197051780417336, + -0.012166347869723811, + -0.013218662843265411, + -0.014360992633016349, + -0.015600907821209225, + -0.016946598889436094, + -0.018406924757276143, + -0.019991464839006486, + -0.021710574811681912, + -0.02357544631969566, + -0.02559817084930124, + -0.027791807992740628, + -0.03017045834679027, + -0.03274934127903164, + -0.03554487779533997, + -0.03857477876191593, + -0.04185813869621465, + -0.045415535366967845, + -0.04926913541095593, + -0.053442806177139555, + -0.05796223396189394, + -0.0628550488134214, + -0.06815095601784889, + -0.0738818743434823, + -0.08008208111220985, + -0.08678836404311081, + -0.09404017982235138, + -0.10187981919879598, + -0.1103525783931314, + -0.1195069364331381, + -0.12939473792450107, + -0.14007138070452024, + -0.15159600751735142, + -0.164031700809834, + -0.1774456794970458, + -0.19190949630146983, + -0.2074992340417533, + -0.22429569899244683, + -0.2423846090936191, + -0.261856774495859, + -0.2828082675243771, + -0.30534057880442517, + -0.32956075585924094, + -0.35558151998956605, + -0.38352135685541877, + -0.41350457568310706, + -0.44566133137140723, + -0.4801276034756764, + -0.5170451252970528, + -0.5565612558359633, + -0.5988287870024419, + -0.644005677659736, + -0.6922547059340701, + -0.7437430305400345, + -0.7986416517855285, + -0.8571247623777144, + -0.9193689782843036, + -0.98555243954057, + -1.0558537715717737, + -1.1304508971082918, + -1.2095196901596497, + -1.2932324635256516, + -1.381756282556869, + -1.4752510992555425, + -1.5738677016603706, + -1.6777454757367936, + -1.7870099784066893, + -1.9017703225302982, + -2.0221163767419044, + -2.1481157852554214, + -2.2798108145661433, + -2.4172150365555023, + -2.5603098581686248, + -2.7090409098121935, + -2.86331430489937, + -3.022992782467691, + -3.187891744338794, + -3.357775196078408, + -3.532351598453406, + -3.7112696322564522, + -3.894113876515373, + -4.08040039637397, + -4.269572234483569, + -4.4609948013929035, + -4.653951164608514, + -4.847637247953328, + -5.041156973960228, + -5.233517415653767, + -5.423624074237969, + -5.6102764687688795, + -5.792164317207897, + -5.967864707128074, + -6.135840799149183, + -6.2944427766164495, + -6.441911941450016, + -6.576389049126028, + -6.695928152327312, + -6.798517353708343, + -6.882107909497962, + -6.944653023656178, + -6.98415735791946, + -6.99873768165683, + -6.9866941182233715, + -6.946590046825694, + -6.8773368577907155, + -6.778277466511047, + -6.64925990451578, + -6.490689721056742, + -6.303547856609676, + -6.089359873203308, + -5.850104027018766, + -5.588050997429794, + -5.305538621560335, + -5.004701989989571, + -4.687203153153331, + -4.354033984906635, + -4.005495492548704, + -3.641476560800027, + -3.262146506423198, + -2.8691114422045194, + -2.4669294676869167, + -2.0646020310348154, + -1.6762577158122784, + -1.319817145899483, + -1.0123077168902406, + -0.7615314645629545, + -0.5578622574856016, + -0.380402131218, + -0.222258756351, + -0.0835113111103, + 0.0358884454011, + 0.136232712278, + 0.218052899336, + 0.282107958818, + 0.32936540878, + 0.360975268622, + 0.378238012831, + 0.3825688029, + 0.375461600528, + 0.358458102932, + 0.333127386149, + 0.301062153529, + 0.263895650629, + 0.223338770815, + 0.181228369703, + 0.13956514935, + 0.100502923544, + 0.0662352907861, + 0.0387199140786, + 0.0192079768788, + 0.00764847681764, + 0.0022948256846, + 0.000374189072685, + 5.20729302235e-06, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 3, + "j": 5, + "angular_momentum": 3 + }, + { + "radial_function": [ + 0.0, + 1.7283032687661229e-10, + 7.031889799457387e-10, + 1.6094129068707055e-09, + 2.9105740277169697e-09, + 4.626506332312641e-09, + 6.777833941878196e-09, + 9.386000168758487e-09, + 1.247329760950391e-08, + 1.606289930601547e-08, + 2.0178891014839127e-08, + 2.484630462055992e-08, + 3.009115273462119e-08, + 3.5940464522138953e-08, + 4.242232279595685e-08, + 4.956590242706874e-08, + 5.7401510112957325e-08, + 6.596062555613634e-08, + 7.527594409526626e-08, + 8.538142084697142e-08, + 9.631231640605679e-08, + 1.0810524416199684e-07, + 1.2079821928127468e-07, + 1.3443070942613822e-07, + 1.490436872574298e-07, + 1.6467968478755772e-07, + 1.8138284965848668e-07, + 1.9919900339181494e-07, + 2.1817570169989222e-07, + 2.3836229691357722e-07, + 2.5981000261361973e-07, + 2.82571960533549e-07, + 3.0670330981463473e-07, + 3.32261258698913e-07, + 3.593051587400755e-07, + 3.8789658162616456e-07, + 4.180993986940137e-07, + 4.4997986324065396e-07, + 4.836066957281876e-07, + 5.190511719677439e-07, + 5.5638721441124e-07, + 5.956914866330799e-07, + 6.370434911326411e-07, + 6.805256705579635e-07, + 7.262235124892386e-07, + 7.742256578766692e-07, + 8.246240132946191e-07, + 8.775138670868408e-07, + 9.329940096785904e-07, + 9.911668579290586e-07, + 1.052138583998404e-06, + 1.1160192486823686e-06, + 1.182922939265286e-06, + 1.2529679124691349e-06, + 1.326276742142136e-06, + 1.402976472195288e-06, + 1.4831987749620258e-06, + 1.5670801150063089e-06, + 1.6547619186412638e-06, + 1.7463907493761476e-06, + 1.8421184895442154e-06, + 1.9421025282356398e-06, + 2.0465059557212324e-06, + 2.155497764834653e-06, + 2.269253059081386e-06, + 2.3879532683580795e-06, + 2.5117863719359714e-06, + 2.640947129313497e-06, + 2.7756373191068025e-06, + 2.9160659862226638e-06, + 3.0624496977437105e-06, + 3.2150128076829945e-06, + 3.373987730777207e-06, + 3.539615226191612e-06, + 3.7121446906582345e-06, + 3.8918344622684125e-06, + 4.0789521345041435e-06, + 4.27377488124342e-06, + 4.476589793232523e-06, + 4.687694226137779e-06, + 4.907396160825198e-06, + 5.136014575829474e-06, + 5.3738798332715456e-06, + 5.621334077842737e-06, + 5.878731649761839e-06, + 6.146439512024063e-06, + 6.4248376927751535e-06, + 6.714319742461234e-06, + 7.015293207611956e-06, + 7.328180120507497e-06, + 7.653417505969226e-06, + 7.991457906218103e-06, + 8.342769922967958e-06, + 8.707838779632657e-06, + 9.087166901765638e-06, + 9.481274518607337e-06, + 9.890700284991501e-06, + 1.0316001925191559e-05, + 1.07577568985858e-05, + 1.1216563089105224e-05, + 1.1693039517810558e-05, + 1.2187827081237084e-05, + 1.2701589313967712e-05, + 1.3235013179136577e-05, + 1.3788809885081839e-05, + 1.4363715731265499e-05, + 1.4960492982751634e-05, + 1.5579930775638287e-05, + 1.622284605366028e-05, + 1.6890084536714477e-05, + 1.7582521724158117e-05, + 1.8301063931596328e-05, + 1.904664936428157e-05, + 1.9820249227907443e-05, + 2.0622868877144885e-05, + 2.1455549004574322e-05, + 2.2319366870635834e-05, + 2.3215437576226495e-05, + 2.4144915379231512e-05, + 2.5108995056469887e-05, + 2.6108913313825828e-05, + 2.7145950243507885e-05, + 2.8221430833552153e-05, + 2.9336726527961793e-05, + 3.0493256842584843e-05, + 3.169249103499403e-05, + 3.2935949833793346e-05, + 3.4225207227105056e-05, + 3.5561892312904705e-05, + 3.694769121330395e-05, + 3.838434905559484e-05, + 3.9873672021282917e-05, + 4.1417529466594517e-05, + 4.3017856115581115e-05, + 4.467665432972192e-05, + 4.639599645586253e-05, + 4.817802725573884e-05, + 5.002496641817641e-05, + 5.1939111160397725e-05, + 5.39228389170974e-05, + 5.597861012420794e-05, + 5.8108971097700036e-05, + 6.031655701295359e-05, + 6.260409498602173e-05, + 6.497440726308065e-05, + 6.743041451791131e-05, + 6.997513926566014e-05, + 7.261170939350336e-05, + 7.534336181267994e-05, + 7.817344623779654e-05, + 8.11054290992407e-05, + 8.414289758118942e-05, + 8.728956381630709e-05, + 9.054926920361546e-05, + 9.392598889790579e-05, + 9.742383643667981e-05, + 0.00010104706853726378, + 0.0001048000900548742, + 0.00010868745911025654, + 0.00011271389240725579, + 0.00011688427071605522, + 0.00012120364455466231, + 0.00012567724007429243, + 0.0001303104651265386, + 0.00013510891556895967, + 0.00014007838176441717, + 0.00014522485531402303, + 0.00015055453602399172, + 0.000156073839114464, + 0.0001617894026675875, + 0.00016770809534681394, + 0.00017383702437274835, + 0.0001801835437772959, + 0.00018675526294108214, + 0.00019356005542843564, + 0.0002006060681327573, + 0.00020790173072075184, + 0.00021545576541978805, + 0.00022327719714347258, + 0.00023137536394048883, + 0.00023975992784787078, + 0.00024844088607614773, + 0.00025742858260608835, + 0.0002667337201878772, + 0.0002763673727305518, + 0.0002863409981456439, + 0.00029666645161503753, + 0.00030735599933220427, + 0.0003184223327064079, + 0.00032987858306030845, + 0.0003417383368315816, + 0.0003540156513182457, + 0.0003667250709279933, + 0.0003798816440364349, + 0.0003935009403897478, + 0.0004075990691158368, + 0.00042219269738327255, + 0.0004372990696633332, + 0.00045293602767471726, + 0.00046912203103954375, + 0.0004858761786117413, + 0.0005032182305631855, + 0.0005211686312315205, + 0.0005397485327514156, + 0.000558979819499493, + 0.0005788851334012803, + 0.0005994879000715544, + 0.0006208123558906511, + 0.000642883576016384, + 0.0006657275033275363, + 0.0006893709784049185, + 0.0007138417705237639, + 0.0007391686097132686, + 0.0007653812199433466, + 0.0007925103534200588, + 0.0008205878261086519, + 0.0008496465544387294, + 0.0008797205932947057, + 0.0009108451753316618, + 0.0009430567516041832, + 0.0009763930336411202, + 0.0010108930369309536, + 0.001046597125951875, + 0.0010835470607000587, + 0.001121786044866727, + 0.0011613587756469509, + 0.001202311495287033, + 0.0012446920443822745, + 0.0012885499170256734, + 0.0013339363178842157, + 0.0013809042211735344, + 0.0014295084317335698, + 0.0014798056481622475, + 0.0015318545281406157, + 0.0015857157560389258, + 0.0016414521127638179, + 0.00169912854812228, + 0.0017588122555934134, + 0.0018205727497004021, + 0.0018844819460578034, + 0.00195061424418556, + 0.002019046613113864, + 0.002089858680010736, + 0.0021631328218038627, + 0.002238954259999589, + 0.0023174111587105453, + 0.0023985947261144914, + 0.002482599319361472, + 0.0025695225531298773, + 0.002659465411850517, + 0.0027525323658714558, + 0.0028488314915646254, + 0.0029484745955588613, + 0.003051577343324516, + 0.003158259392019274, + 0.003268644528101911, + 0.003382860809488398, + 0.0035010407127359405, + 0.0036233212851964733, + 0.0037498443024159096, + 0.003880756430989764, + 0.004016209396952917, + 0.0041563601599626104, + 0.004301371093493162, + 0.004451410171165967, + 0.004606651159534214, + 0.004767273817472321, + 0.004933464102329656, + 0.005105414383254804, + 0.005283323661788131, + 0.005467397800064666, + 0.005657849756716456, + 0.005854899831066794, + 0.006058775915452534, + 0.006269713756392629, + 0.006487957224650925, + 0.006713758594386075, + 0.006947378832170261, + 0.007189087895571178, + 0.007439165042201289, + 0.007697899149194427, + 0.007965589043599286, + 0.008242543844320972, + 0.00852908331526339, + 0.008825538231144084, + 0.009132250755212089, + 0.009449574830258182, + 0.009777876582707354, + 0.010117534741252113, + 0.010468941067909665, + 0.010832500806449607, + 0.011208633143673206, + 0.011597771687679146, + 0.012000364962269727, + 0.012416876918016462, + 0.012847787460716251, + 0.01329359299741082, + 0.01375480700234483, + 0.014231960600533042, + 0.014725603171477265, + 0.015236302974796966, + 0.015764647794693623, + 0.016311245608530693, + 0.01687672527668619, + 0.017461737256083524, + 0.018066954337735273, + 0.01869307241001961, + 0.01934081124594039, + 0.020010915319654234, + 0.020704154647458037, + 0.021421325660356857, + 0.022163252102027367, + 0.022930785961837015, + 0.023724808434855547, + 0.02454623091612914, + 0.025395996028838335, + 0.026275078686060667, + 0.02718448718741738, + 0.028125264353691063, + 0.02909848869895924, + 0.030105275641393935, + 0.03114677875543753, + 0.03222419106394508, + 0.0333387463748761, + 0.034491720661817965, + 0.035684433490639364, + 0.03691824949173945, + 0.03819457988390237, + 0.039514884046098805, + 0.04088067114059745, + 0.042293501793551194, + 0.04375498982502354, + 0.04526680404013034, + 0.04683067007716896, + 0.048448372316207564, + 0.05012175584956714, + 0.05185272851759002, + 0.05364326300933133, + 0.05549539903038939, + 0.0574112455451604, + 0.05939298308426536, + 0.06144286613427087, + 0.06356322559578916, + 0.06575647132802451, + 0.06802509476849193, + 0.07037167163865488, + 0.07279886473626009, + 0.07530942681210467, + 0.07790620354237995, + 0.08059213658983132, + 0.08337026676320095, + 0.08624373727527508, + 0.08921579709853336, + 0.09228980443007334, + 0.09546923025632705, + 0.09875766203466968, + 0.10215880747845499, + 0.10567649846460338, + 0.10931469505489329, + 0.11307748963674608, + 0.11696911119268986, + 0.1209939296893384, + 0.12515646060131402, + 0.12946136956555476, + 0.1339134771692225, + 0.13851776387896553, + 0.1432793751075287, + 0.14820362642599408, + 0.1532960089245788, + 0.1585621947193763, + 0.16400804261278676, + 0.16963960391104768, + 0.17546312839217834, + 0.18148507044415318, + 0.18771209535438202, + 0.1941510857709459, + 0.2008091483291294, + 0.20769362044168424, + 0.21481207726414192, + 0.22217233882735696, + 0.22978247734767934, + 0.23765082470605864, + 0.24578598009850533, + 0.2541968178732351, + 0.2628924955231287, + 0.27188246187161735, + 0.2811764654159189, + 0.2907845628480766, + 0.30071712774388976, + 0.310984859420518, + 0.32159879195365787, + 0.33257030335057597, + 0.34391112489158315, + 0.35563335060008033, + 0.3677494468702067, + 0.3802722622240065, + 0.393215037187496, + 0.40659141429746126, + 0.4204154481940322, + 0.4347016158265394, + 0.4494648267164333, + 0.46472043329701535, + 0.48048424129753586, + 0.49677252014483925, + 0.5136020133769944, + 0.5309899490386288, + 0.548954050030686, + 0.5675125443833555, + 0.5866841754397962, + 0.606488211884069, + 0.6269444576165313, + 0.6480732613980698, + 0.66989552624875, + 0.6924327185460596, + 0.715706876750179, + 0.7397406197413547, + 0.7645571546763119, + 0.790180284297076, + 0.8166344136802987, + 0.843944556218707, + 0.8721363389458647, + 0.9012360069609374, + 0.9312704268530416, + 0.9622670891950859, + 0.9942541098130788, + 1.0272602297558886, + 1.0613148139886708, + 1.096447848379657, + 1.1326899352519422, + 1.1700722867899398, + 1.2086267167997495, + 1.248385630103919, + 1.2893820095649753, + 1.3316494007042272, + 1.3752218934355458, + 1.4201341009057504, + 1.4664211350951266, + 1.5141185788440827, + 1.5632624543255282, + 1.6138891873338046, + 1.6660355673388827, + 1.7197387028516078, + 1.7750359719059086, + 1.8319649670586082, + 1.8905634348412401, + 1.950869209090486, + 2.0129201376553243, + 2.076754002393234, + 2.1424084315743848, + 2.2099208046341863, + 2.2793281483861314, + 2.3506670245824113, + 2.423973408001411, + 2.499282554455687, + 2.5766288586622554, + 2.656045700691176, + 2.7375652808236857, + 2.821218442181534, + 2.907034480350281, + 2.9950409393718584, + 3.08526339357544, + 3.177725214466346, + 3.2724473221123604, + 3.3694479202460603, + 3.4687422145608338, + 3.570342113596403, + 3.6742559113980673, + 3.780487951546629, + 3.8890382721242136, + 3.999902230732345, + 4.113070109625436, + 4.228526700262788, + 4.346250866978993, + 4.46621509003006, + 4.588384987414002, + 4.712718816011796, + 4.839166951961611, + 4.9676713510834425, + 5.098164989637481, + 5.230571286658144, + 5.364803508578439, + 5.500764158355908, + 5.638344349952515, + 5.7774231712487465, + 5.917867037430251, + 6.059529037979939, + 6.20224828118332, + 6.345849239669871, + 6.490141102159437, + 6.634917136494057, + 6.779954070000593, + 6.92501149390356, + 7.069831299345668, + 7.214137153055665, + 7.357634022318295, + 7.500007758677207, + 7.640924751660347, + 7.78003166435474, + 7.9169552632858355, + 8.051302356495292, + 8.182659854246701, + 8.310594967747823, + 8.434655561693525, + 8.554370677710004, + 8.669251245928747, + 8.7787910020748, + 8.88246762835836, + 8.979744135913789, + 9.070070506534812, + 9.15288561099085, + 9.227619420398632, + 9.293695526153073, + 9.350533982405345, + 9.397554483443221, + 9.434179886228451, + 9.45984008579536, + 9.473976248638568, + 9.47604540582482, + 9.465525404176658, + 9.441920209894782, + 9.404765554579393, + 9.353634908677655, + 9.28814576161809, + 9.207966181272726, + 9.112821617102266, + 9.002501901371959, + 8.876868389976318, + 8.735861168097578, + 8.579506225079957, + 8.407922476122163, + 8.221328475466184, + 8.02004862511343, + 7.804518636065063, + 7.575289947074934, + 7.333032753226791, + 7.0785372522495935, + 6.812712693930667, + 6.536583837112702, + 6.251284509977919, + 5.958048168554262, + 5.658195697812039, + 5.35312123818817, + 5.044277558446547, + 4.7331633815533465, + 4.421315901265063, + 4.110312023531505, + 3.801780622172868, + 3.497423386748168, + 3.199030151843956, + 2.908449765766711, + 2.62743372049, + 2.35742854251, + 2.09971361062, + 1.85545285079, + 1.62566892896, + 1.41121627898, + 1.21275616821, + 1.03073597428, + 0.86537520506, + 0.716660848443, + 0.584354233083, + 0.46801066832, + 0.367011348678, + 0.280604630123, + 0.207950599509, + 0.14815971857, + 0.100313699052, + 0.0634565321457, + 0.0365475307037, + 0.0183795402928, + 0.0074866053258, + 0.00209683555323, + 0.000218766154685, + -4.8914818932e-05, + -2.53935779264e-06, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 4, + "j": 4, + "angular_momentum": 0 + }, + { + "radial_function": [ + 0.0, + 2.5666899211008047e-21, + 4.248910808673408e-20, + 2.225709411882614e-19, + 7.279319838656096e-19, + 1.8392460177915656e-18, + 3.947438306461341e-18, + 7.569978010501308e-18, + 1.3368912222898929e-17, + 2.2170800619194118e-17, + 3.498872299776059e-17, + 5.3046546298161024e-17, + 7.780565314098673e-17, + 1.109943506034066e-16, + 1.546401958915602e-16, + 2.1110549498773094e-16, + 2.8312625119324837e-16, + 3.738548630642488e-16, + 4.869068954075497e-16, + 6.264122732729021e-16, + 7.970712769397866e-16, + 1.0042157463297988e-15, + 1.2538759358004308e-15, + 1.552853495793773e-15, + 1.9088010952973942e-15, + 2.3303092401015737e-15, + 2.827000886025839e-15, + 3.4096344927790806e-15, + 4.090216216013507e-15, + 4.882121988908933e-15, + 5.800230304407252e-15, + 6.861066571907774e-15, + 8.082959990691183e-15, + 9.48621395585766e-15, + 1.1093291091018355e-14, + 1.2929014087366772e-14, + 1.5020783618976266e-14, + 1.739881470349769e-14, + 2.00963929823258e-14, + 2.3150152506361733e-14, + 2.6600376738370876e-14, + 3.049132460995329e-14, + 3.4871583615452743e-14, + 3.979445207337086e-14, + 4.531835285173612e-14, + 5.1507281023236217e-14, + 5.843128811054581e-14, + 6.61670057722498e-14, + 7.479821202352398e-14, + 8.441644325947651e-14, + 9.512165568533147e-14, + 1.0702293995134412e-13, + 1.2023929308107632e-13, + 1.3490045219244107e-13, + 1.5114779466838384e-13, + 1.6913530994667898e-13, + 1.8903064842741066e-13, + 2.1101625336634678e-13, + 2.3529058211104335e-13, + 2.6206942350197175e-13, + 2.9158731878018234e-13, + 3.24099093849718e-13, + 3.598815113357859e-13, + 3.9923505160361164e-13, + 4.4248583233711024e-13, + 4.899876773818957e-13, + 5.421243459005847e-13, + 5.993119340511361e-13, + 6.620014621372585e-13, + 7.306816611545414e-13, + 8.058819737694714e-13, + 8.881757857435834e-13, + 9.78183904971264e-13, + 1.0765783069574277e-12, + 1.1840861661785389e-12, + 1.3014941951720529e-12, + 1.4296533138206758e-12, + 1.5694836736230698e-12, + 1.7219800634384418e-12, + 1.8882177248411895e-12, + 2.069358607655294e-12, + 2.266658097911567e-12, + 2.4814722538927176e-12, + 2.715265587150006e-12, + 2.9696194291271515e-12, + 3.2462409264713684e-12, + 3.5469727117505333e-12, + 3.873803298415116e-12, + 4.22887825475692e-12, + 4.614512212724691e-12, + 5.033201773665101e-12, + 5.487639377357992e-12, + 5.980728203090844e-12, + 6.515598181465638e-12, + 7.095623194756717e-12, + 7.724439555947476e-12, + 8.405965857825036e-12, + 9.144424293577484e-12, + 9.944363554867525e-12, + 1.0810683424564351e-11, + 1.1748661185053973e-11, + 1.276397997786533e-11, + 1.386275925192515e-11, + 1.5051587458180528e-11, + 1.633755714824042e-11, + 1.7728302656462268e-11, + 1.9232040549231205e-11, + 2.085761304554761e-11, + 2.2614534622459253e-11, + 2.4513042035112647e-11, + 2.6564148003677855e-11, + 2.8779698825690666e-11, + 3.117243620333715e-11, + 3.3756063589376426e-11, + 3.654531737514381e-11, + 3.9556043274788715e-11, + 4.2805278278485165e-11, + 4.631133857721526e-11, + 5.009391388912864e-11, + 5.417416864870097e-11, + 5.857485055842334e-11, + 6.332040702169553e-11, + 6.843711003938585e-11, + 7.395319016387772e-11, + 7.989898017776923e-11, + 8.630706917851337e-11, + 9.321246783454481e-11, + 1.00652785603924e-10, + 1.0866842077738483e-10, + 1.1730276426592535e-10, + 1.266024181228829e-10, + 1.3661742985058106e-10, + 1.4740154363035034e-10, + 1.5901246967964693e-10, + 1.715121730442064e-10, + 1.8496718321157547e-10, + 1.9944892604064854e-10, + 2.150340795899224e-10, + 2.318049555832553e-10, + 2.4984990830986604e-10, + 2.692637729526044e-10, + 2.9014833542177154e-10, + 3.1261283596580273e-10, + 3.367745089501271e-10, + 3.627591614145989e-10, + 3.9070179313609923e-10, + 4.207472612062182e-10, + 4.530509922627912e-10, + 4.877797457759229e-10, + 5.251124320489328e-10, + 5.652409888565645e-10, + 6.083713207309116e-10, + 6.547243057278912e-10, + 7.045368739297177e-10, + 7.580631634288226e-10, + 8.155757587166319e-10, + 8.773670177620405e-10, + 9.43750493854534e-10, + 1.015062458990396e-09, + 1.0916635362950084e-09, + 1.1739404486670244e-09, + 1.262307892386168e-09, + 1.3572105445754594e-09, + 1.4591252134102817e-09, + 1.5685631422775805e-09, + 1.68607247768584e-09, + 1.812240913256731e-09, + 1.9476985221412416e-09, + 2.0931207912386884e-09, + 2.249231871236918e-09, + 2.416808058407433e-09, + 2.596681523958847e-09, + 2.7897443088389133e-09, + 2.9969526026727447e-09, + 3.219331327114152e-09, + 3.457979045289871e-09, + 3.7140732196878043e-09, + 3.988875844302392e-09, + 4.283739477033332e-09, + 4.600113699630877e-09, + 4.939552038121278e-09, + 5.303719372995822e-09, + 5.694399876470505e-09, + 6.113505513277054e-09, + 6.563085143649662e-09, + 7.04533427335664e-09, + 7.562605494490595e-09, + 8.117419667495664e-09, + 8.712477895556658e-09, + 9.350674348069222e-09, + 1.0035109992878095e-08, + 1.076910730283784e-08, + 1.155622600212194e-08, + 1.2400279930953204e-08, + 1.3305355102650546e-08, + 1.4275829039889159e-08, + 1.5316391481969703e-08, + 1.6432066555301783e-08, + 1.7628236514382826e-08, + 1.8910667164857132e-08, + 2.0285535082523337e-08, + 2.1759456759766616e-08, + 2.3339519813863076e-08, + 2.503331640226791e-08, + 2.6848979000861794e-08, + 2.8795218713884583e-08, + 3.08813662885696e-08, + 3.3117416032330386e-08, + 3.551407283438803e-08, + 3.8082802506719336e-08, + 4.0835885686363684e-08, + 4.378647554358091e-08, + 4.6948659566329107e-08, + 5.033752571147557e-08, + 5.396923322336618e-08, + 5.7861088459150825e-08, + 6.203162606225209e-08, + 6.650069586907899e-08, + 7.12895559529544e-08, + 7.64209722288278e-08, + 8.191932509434337e-08, + 8.78107235897457e-08, + 9.412312762027096e-08, + 1.0088647879205972e-07, + 1.0813284048531571e-07, + 1.1589654780228066e-07, + 1.2421436809474068e-07, + 1.3312567280666894e-07, + 1.4267262143648214e-07, + 1.5290035847575525e-07, + 1.6385722421654784e-07, + 1.7559498043399434e-07, + 1.8816905196526707e-07, + 2.0163878531783065e-07, + 2.160677255100966e-07, + 2.3152391239585585e-07, + 2.4808019789634716e-07, + 2.6581458555842567e-07, + 2.8481059403870046e-07, + 3.051576461936235e-07, + 3.2695148557720196e-07, + 3.5029462225020367e-07, + 3.7529681000684255e-07, + 4.020755571846048e-07, + 4.307566734530023e-07, + 4.6147485507523346e-07, + 4.943743113895605e-07, + 5.296094353700072e-07, + 5.673455213976127e-07, + 6.077595335157041e-07, + 6.510409277806994e-07, + 6.97392532452153e-07, + 7.470314901064379e-07, + 8.001902660685862e-07, + 8.57117727700459e-07, + 9.180802997083321e-07, + 9.833632006068382e-07, + 1.0532717662167282e-06, + 1.128132866182978e-06, + 1.2082964201038167e-06, + 1.2941370202888076e-06, + 1.3860556685650816e-06, + 1.4844816351812213e-06, + 1.5898744483974017e-06, + 1.7027260238781772e-06, + 1.8235629437804764e-06, + 1.9529488959953908e-06, + 2.0914872847263314e-06, + 2.239824024567752e-06, + 2.398650530844343e-06, + 2.5687069200607456e-06, + 2.750785435045538e-06, + 2.9457341108590755e-06, + 3.1544606979298902e-06, + 3.3779368608858666e-06, + 3.617202672174864e-06, + 3.873371421008429e-06, + 4.147634760262938e-06, + 4.4412682143136676e-06, + 4.755637073761666e-06, + 5.092202703710893e-06, + 5.452529294725846e-06, + 5.838291087855579e-06, + 6.2512801059296025e-06, + 6.693414428106234e-06, + 7.166747044029363e-06, + 7.673475329605794e-06, + 8.215951186951849e-06, + 8.796691896692517e-06, + 9.418391728059817e-06, + 1.0083934367590088e-05, + 1.0796406214874476e-05, + 1.1559110612490258e-05, + 1.2375583073044277e-05, + 1.324960757297896e-05, + 1.4185233988063692e-05, + 1.5186796749474336e-05, + 1.6258934809834354e-05, + 1.7406613004122102e-05, + 1.8635144907096336e-05, + 1.995021729482411e-05, + 2.135791631281871e-05, + 2.2864755481761175e-05, + 2.4477705659824268e-05, + 2.620422710253804e-05, + 2.805230376540573e-05, + 3.00304800086834e-05, + 3.214789986381424e-05, + 3.441434905446094e-05, + 3.6840299945552695e-05, + 3.9436959645574966e-05, + 4.2216321456748654e-05, + 4.519121993816247e-05, + 4.837538979978262e-05, + 5.178352891759135e-05, + 5.543136575188509e-05, + 5.9335731469448394e-05, + 6.351463709703332e-05, + 6.798735606491495e-05, + 7.277451250811427e-05, + 7.789817572482207e-05, + 8.338196122722201e-05, + 8.925113882852355e-05, + 9.553274827176088e-05, + 0.00010225572291284981, + 0.00010945102202156493, + 0.00011715177228578542, + 0.00012539341918478788, + 0.00013421388888320312, + 0.00014365376138409538, + 0.00015375645575277933, + 0.0001645684281783618, + 0.0001761393838309917, + 0.00018852250342627698, + 0.0002017746855243858, + 0.0002159568056463589, + 0.0002311339933805135, + 0.00024737592869954417, + 0.00026475715881212644, + 0.00028335743701290555, + 0.0003032620849356441, + 0.00032456237996461666, + 0.00034735596937053863, + 0.0003717473131694597, + 0.00039784815753046596, + 0.0004257780409159346, + 0.0004556648351803559, + 0.0004876453239602782, + 0.000521865821011722, + 0.0005584828311047476, + 0.0005976637564665318, + 0.0006395876518482962, + 0.0006844460314699455, + 0.0007324437315027353, + 0.000783799831675369, + 0.0008387486402383147, + 0.0008975407463139033, + 0.0009604441444613654, + 0.0010277454361384095, + 0.0010997511132907806, + 0.001176788929724539, + 0.0012592093659312981, + 0.0013473871938870278, + 0.0014417231483801203, + 0.0015426457119983364, + 0.0016506130214770736, + 0.0017661149033449028, + 0.0018896750475950663, + 0.002021853328561238, + 0.002163248282616548, + 0.0023144997531943778, + 0.002476291714202428, + 0.0026493552833075267, + 0.0028344719380679903, + 0.0030324769475700334, + 0.0032442630341991876, + 0.003470784280288458, + 0.003713060295423188, + 0.0039721806616145406, + 0.004249309673959672, + 0.004545691396141545, + 0.00486265505060017, + 0.0052016207648067775, + 0.005564105696949669, + 0.005951730563767516, + 0.006366226597589501, + 0.006809442958026831, + 0.007283354627747279, + 0.007790070822137092, + 0.008331843944877446, + 0.008911079122797724, + 0.009530344355513726, + 0.01019238131833349, + 0.010900116856067682, + 0.011656675211395712, + 0.012465391030546774, + 0.01332982319227329, + 0.014253769510084759, + 0.01524128235653531, + 0.016296685265799093, + 0.017424590567760596, + 0.01862991811490443, + 0.01991791516255094, + 0.021294177466103462, + 0.022764671663683112, + 0.02433575901366567, + 0.02601422055985584, + 0.027807283799719282, + 0.029722650936043184, + 0.03176852879030925, + 0.033953660465824084, + 0.03628735884359035, + 0.03877954200316924, + 0.04144077065958675, + 0.044282287707557114, + 0.04731605997341313, + 0.050554822268270266, + 0.05401212384032673, + 0.05770237733332312, + 0.06164091033257295, + 0.06584401962383013, + 0.07032902824207458, + 0.07511434540347978, + 0.08021952944015792, + 0.08566535379908741, + 0.09147387619401914, + 0.09766851101399589, + 0.10427410500626937, + 0.11131701636755394, + 0.11882519718831497, + 0.12682827940918545, + 0.13535766420438133, + 0.14444661482175966, + 0.15413035289304883, + 0.1644461581080641, + 0.17543347122210529, + 0.18713400026289104, + 0.19959182976645085, + 0.21285353292453396, + 0.22696828631948918, + 0.2419879870190192, + 0.2579673716452579, + 0.27496413704323813, + 0.2930390619869629, + 0.3122561294444205, + 0.3326826486909202, + 0.3543893764793653, + 0.37745063651921, + 0.4019444361369358, + 0.42795257915206225, + 0.4555607735768625, + 0.48485873288998715, + 0.5159402692162829, + 0.5489033766444974, + 0.5838503029804049, + 0.6208876075195271, + 0.6601262026845031, + 0.7016813769685757, + 0.7456727963233154, + 0.7922244809503387, + 0.8414647542565135, + 0.8935261603410267, + 0.9485453462208192, + 1.0066629045975641, + 1.0680231728242369, + 1.1327739834017798, + 1.201066360906432, + 1.2730541602080896, + 1.3488936405610092, + 1.4287429695661598, + 1.5127616513937718, + 1.6011098729181747, + 1.693947761470993, + 1.7914345482050018, + 1.8937276302933832, + 2.0009815260189767, + 2.1133467163260775, + 2.2309683672493574, + 2.3539849273622013, + 2.482526595505191, + 2.616713653960278, + 2.756654664174687, + 2.9024445214631296, + 3.054162368098085, + 3.2118693641258353, + 3.375606317436127, + 3.545391176770658, + 3.7212163923399553, + 3.903046152188407, + 4.090813504147569, + 4.284417376287357, + 4.483719511697783, + 4.688541336733176, + 4.898660784796561, + 5.113809102419891, + 5.333667666617213, + 5.557864847749006, + 5.785972955704671, + 6.017505310912253, + 6.251913486836137, + 6.488584774573984, + 6.726839925028025, + 6.9659312283741235, + 7.20504099686189, + 7.443280521989683, + 7.679689582823617, + 7.9132365906564, + 8.142819462182555, + 8.36726732305137, + 8.585343154335986, + 8.795747506411285, + 8.997123418411531, + 9.188062695545842, + 9.36711371146964, + 9.532790916544169, + 9.683586242879427, + 9.817982602374258, + 9.93446966734986, + 10.031562102576371, + 10.107820373327048, + 10.161874179694282, + 10.192448452355976, + 10.198391680743125, + 10.178706121098868, + 10.132579144033636, + 10.059414627892389, + 9.958862895378024, + 9.830847250632004, + 9.67558474843043, + 9.49359849025797, + 9.285718603747446, + 9.053069269680249, + 8.7970399005538, + 8.519240054950712, + 8.221440091693761, + 7.905503055091981, + 7.573317787052687, + 7.226748392788639, + 6.867619991754028, + 6.497763362687037, + 6.119138706891735, + 5.734047075319278, + 5.345411749115516, + 4.957065960124985, + 4.573916302856535, + 4.2017727081072325, + 3.84658217621615, + 3.5128670520023637, + 3.2015527517877382, + 2.908486590540969, + 2.62743372049, + 2.35742854251, + 2.09971361062, + 1.85545285079, + 1.62566892896, + 1.41121627898, + 1.21275616821, + 1.03073597428, + 0.86537520506, + 0.716660848443, + 0.584354233083, + 0.46801066832, + 0.367011348678, + 0.280604630123, + 0.207950599509, + 0.14815971857, + 0.100313699052, + 0.0634565321457, + 0.0365475307037, + 0.0183795402928, + 0.0074866053258, + 0.00209683555323, + 0.000218766154685, + -4.8914818932e-05, + -2.53935779264e-06, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 4, + "j": 4, + "angular_momentum": 2 + }, + { + "radial_function": [ + 0.0, + 7.148332607594497e-33, + 4.8146094726500695e-31, + 5.772279308193122e-30, + 3.4141362350075964e-29, + 1.3712112914940729e-28, + 4.311393585930473e-28, + 1.1449501320350932e-27, + 2.6871304639424447e-27, + 5.7387421229091946e-27, + 1.1377236436852714e-26, + 2.1238816661946962e-26, + 3.7727790794686517e-26, + 6.428297363750649e-26, + 1.0571296007313242e-25, + 1.6861412547713162e-25, + 2.6188755188752363e-25, + 3.9737377310311007e-25, + 5.906273266423839e-25, + 8.618566508504111e-25, + 1.2370589329120078e-24, + 1.749384168756426e-24, + 2.440768017103397e-24, + 3.363879108011691e-24, + 4.584433398927933e-24, + 6.183936074698741e-24, + 8.262920489371632e-24, + 1.094476388563843e-23, + 1.4380171274621542e-23, + 1.875243208207465e-23, + 2.4283569186441116e-23, + 3.124151700484999e-23, + 3.994848459396504e-23, + 5.079068160993093e-23, + 6.422960973629689e-23, + 8.081515021703835e-23, + 1.0120070981428583e-22, + 1.2616072333718874e-22, + 1.566108513441108e-22, + 1.936312572831027e-22, + 2.384933999133516e-22, + 2.9269083494435045e-22, + 3.5797458541224694e-22, + 4.363937141328537e-22, + 5.303418148095372e-22, + 6.426102319580203e-22, + 7.764489253347826e-22, + 9.356360129369818e-22, + 1.1245571605405168e-21, + 1.3482961344648071e-21, + 1.612738004490174e-21, + 1.924686671636229e-21, + 2.2919986078095778e-21, + 2.7237349356524117e-21, + 3.230334240112424e-21, + 3.8238088076068386e-21, + 4.517967324444145e-21, + 5.328667442472398e-21, + 6.2741020446956496e-21, + 7.375123517932627e-21, + 8.655610871735291e-21, + 1.0142885136652553e-20, + 1.1868179141549704e-20, + 1.386716852065671e-20, + 1.618057162483556e-20, + 1.8854826964762907e-20, + 2.194285783799083e-20, + 2.5504934977471924e-20, + 2.9609649359130174e-20, + 3.433500876819455e-20, + 3.976967336371313e-20, + 4.6014347298525033e-20, + 5.3183345488165374e-20, + 6.140635693146806e-20, + 7.08304284736854e-20, + 8.162219581925019e-20, + 9.397039169825395e-20, + 1.0808866468411785e-19, + 1.2421874610882647e-19, + 1.4263400690562438e-19, + 1.6364345116688645e-19, + 1.8759619863516055e-19, + 2.14886514588543e-19, + 2.4595945226063793e-19, + 2.8131718066492247e-19, + 3.215260791277253e-19, + 3.6722468936872366e-19, + 4.1913262633346676e-19, + 4.780605610788734e-19, + 5.449214017028096e-19, + 6.207428132050556e-19, + 7.066812334374382e-19, + 8.040375599660243e-19, + 9.142747037310388e-19, + 1.0390372266629232e-18, + 1.1801733066577602e-18, + 1.339759300180485e-18, + 1.5201272044411352e-18, + 1.723895354998793e-18, + 1.9540027338754146e-18, + 2.2137473048940355e-18, + 2.50682884203665e-18, + 2.8373967674166187e-18, + 3.210103577160678e-18, + 3.630164495887186e-18, + 4.103424076254929e-18, + 4.636430538612609e-18, + 5.236518738102995e-18, + 5.911902745221507e-18, + 6.6717791373967324e-18, + 7.526442225458702e-18, + 8.487412572225337e-18, + 9.567580318226779e-18, + 1.0781364997624654e-17, + 1.2144893715507205e-17, + 1.3676199771437087e-17, + 1.5395444045101752e-17, + 1.7325161721084056e-17, + 1.9490537217826792e-17, + 2.191971050681326e-17, + 2.4644118367844947e-17, + 2.7698874512561446e-17, + 3.11231929637401e-17, + 3.496085954888152e-17, + 3.9260756928406335e-17, + 4.4077449160237737e-17, + 4.9471832495693506e-17, + 5.551185982623554e-17, + 6.227334703572559e-17, + 6.984087042794856e-17, + 7.830876542135494e-17, + 8.778223782505622e-17, + 9.83786002772462e-17, + 1.1022864780679826e-16, + 1.2347818804282093e-16, + 1.3828974330176413e-16, + 1.5484444369767062e-16, + 1.7334413251741168e-16, + 1.9401370750032634e-16, + 2.171037241965126e-16, + 2.4289329054933787e-16, + 2.7169328499244634e-16, + 3.038499339707695e-16, + 3.397487886977209e-16, + 3.7981914541558566e-16, + 4.2453895819851383e-16, + 4.744402988688487e-16, + 5.301154244717456e-16, + 5.922235194538108e-16, + 6.614981871056862e-16, + 7.38755773032357e-16, + 8.24904612127332e-16, + 9.209553016130053e-16, + 1.0280321121439436e-15, + 1.1473856636460832e-15, + 1.2804070039142613e-15, + 1.4286432452409811e-15, + 1.5938149299454945e-15, + 1.7778353149502242e-15, + 1.982831787018492e-15, + 2.211169641237914e-15, + 2.465478483436022e-15, + 2.7486815446220544e-15, + 3.0640282250705184e-15, + 3.415130225356502e-15, + 3.8060016540926865e-15, + 4.241103550172098e-15, + 4.72539330255147e-15, + 5.264379503782891e-15, + 5.864182830782674e-15, + 6.53160361447049e-15, + 7.274196827352564e-15, + 8.1003553011282e-15, + 9.019402073076169e-15, + 1.0041692858941901e-14, + 1.1178729758651252e-14, + 1.2443287417374512e-14, + 1.3849553006314996e-14, + 1.5413281528542142e-14, + 1.715196811520539e-14, + 1.908503917850455e-14, + 2.1234064458482946e-14, + 2.362299225426633e-14, + 2.6278410360622287e-14, + 2.9229835500745985e-14, + 3.251003437104377e-14, + 3.61553797247406e-14, + 4.020624531678496e-14, + 4.470744392762469e-14, + 4.970871315431986e-14, + 5.526525415858086e-14, + 6.143832913740817e-14, + 6.829592386758196e-14, + 7.591348243533691e-14, + 8.437472194623743e-14, + 9.377253591978659e-14, + 1.0420999600946399e-13, + 1.1580146267241476e-13, + 1.2867381664522934e-13, + 1.4296782433864338e-13, + 1.5883965161967536e-13, + 1.764625421178582e-13, + 1.960286778718536e-13, + 2.177512420706443e-13, + 2.418667057869529e-13, + 2.686373629934258e-13, + 2.98354140674672e-13, + 3.31339713916547e-13, + 3.679519589543279e-13, + 4.0858778069549067e-13, + 4.536873553619037e-13, + 5.037388330662188e-13, + 5.592835501070734e-13, + 6.209218061687463e-13, + 6.893192673869514e-13, + 7.652140631398241e-13, + 8.494246513470221e-13, + 9.428585354938217e-13, + 1.0465219254360399e-12, + 1.161530443774006e-12, + 1.289120991040242e-12, + 1.4306648945865402e-12, + 1.5876824801387327e-12, + 1.7618592192497087e-12, + 1.9550636232200487e-12, + 2.169367071711531e-12, + 2.4070657851344235e-12, + 2.6707051719289317e-12, + 2.963106807239944e-12, + 3.2873983270483425e-12, + 3.6470465516311456e-12, + 4.045894187661661e-12, + 4.488200494127262e-12, + 4.978686340005021e-12, + 5.52258412749044e-12, + 6.125693104213807e-12, + 6.7944406474248125e-12, + 7.535950161934428e-12, + 8.358116305790032e-12, + 9.269688333354995e-12, + 1.0280362430626625e-11, + 1.1400884010625526e-11, + 1.2643161044046954e-11, + 1.4020389612006993e-11, + 1.5547192999147706e-11, + 1.723977578374343e-11, + 1.911609454223963e-11, + 2.1196046955461007e-11, + 2.3501681299901363e-11, + 2.6057428516387767e-11, + 2.8890359290791005e-11, + 3.203046883599956e-11, + 3.551099235829072e-11, + 3.936875451415437e-11, + 4.364455650741238e-11, + 4.8383604891062406e-11, + 5.3635986547037394e-11, + 5.945719482645016e-11, + 6.590871234558262e-11, + 7.30586565379432e-11, + 8.098249471657756e-11, + 8.976383611871896e-11, + 9.949530921776781e-11, + 1.1027953347664069e-10, + 1.222301956952378e-10, + 1.3547324221005993e-10, + 1.5014819940162004e-10, + 1.664096363019234e-10, + 1.8442878459965882e-10, + 2.0439533295633735e-10, + 2.265194143871595e-10, + 2.5103380744622557e-10, + 2.781963742455603e-10, + 3.0829276071579296e-10, + 3.416393873614619e-10, + 3.78586761711018e-10, + 4.1952314702302075e-10, + 4.648786256304736e-10, + 5.15129599234766e-10, + 5.708037732269576e-10, + 6.324856769924789e-10, + 7.008227778367538e-10, + 7.765322524133112e-10, + 8.604084861349414e-10, + 9.533313791133271e-10, + 1.0562755449793202e-09, + 1.1703204988425891e-09, + 1.296661940500612e-09, + 1.4366242510100608e-09, + 1.591674331977783e-09, + 1.7634369337629511e-09, + 1.9537116304635775e-09, + 2.164491620272623e-09, + 2.3979845468137138e-09, + 2.656635558635917e-09, + 2.9431528475113822e-09, + 3.260535931667068e-09, + 3.612106980273693e-09, + 4.001545503996832e-09, + 4.432926774667182e-09, + 4.910764376064818e-09, + 5.440057326500542e-09, + 6.026342268843685e-09, + 6.675751269386648e-09, + 7.395075830061546e-09, + 8.1918377815154e-09, + 9.074367798078781e-09, + 1.0051892350508652e-08, + 1.1134630010111833e-08, + 1.233389810118699e-08, + 1.3662230824481116e-08, + 1.5133510072795085e-08, + 1.6763110319818016e-08, + 1.8568059078208058e-08, + 2.056721461357727e-08, + 2.2781462768233084e-08, + 2.5233934946890192e-08, + 2.7950249540515664e-08, + 3.095877931541911e-08, + 3.4290947556870666e-08, + 3.79815560605182e-08, + 4.206914840396101e-08, + 4.659641228501444e-08, + 5.161062514376522e-08, + 5.716414771955007e-08, + 6.331497070685707e-08, + 7.012732021619891e-08, + 7.767232839574987e-08, + 8.602877620296195e-08, + 9.528391610374376e-08, + 1.0553438334066556e-07, + 1.1688720524444698e-07, + 1.294609192210189e-07, + 1.4338681108303116e-07, + 1.588102867065554e-07, + 1.7589239137905777e-07, + 1.9481149277521728e-07, + 2.1576514517921875e-07, + 2.389721544959675e-07, + 2.6467486577443097e-07, + 2.931416970990503e-07, + 3.2466994662982064e-07, + 3.5958890203716933e-07, + 3.982632852069499e-07, + 4.4109706819262567e-07, + 4.88537700632889e-07, + 5.410807930509907e-07, + 5.992753051723164e-07, + 6.637292940087891e-07, + 7.351162819872552e-07, + 8.141823122968981e-07, + 9.017537657011455e-07, + 9.987460210314862e-07, + 1.1061730508928576e-06, + 1.2251580533522983e-06, + 1.3569452322114722e-06, + 1.5029128495710577e-06, + 1.664587689061854e-06, + 1.8436610820347575e-06, + 2.0420066660903157e-06, + 2.2617000639775194e-06, + 2.5050406903329565e-06, + 2.774575917602501e-06, + 3.0731278565491604e-06, + 3.4038230349036125e-06, + 3.770125288928618e-06, + 4.175872216051954e-06, + 4.625315575516877e-06, + 5.123166065791765e-06, + 5.674642953588087e-06, + 6.28552908201134e-06, + 6.962231842547466e-06, + 7.71185075802786e-06, + 8.542252397506123e-06, + 9.462153417737624e-06, + 1.048121261770617e-05, + 1.1610132985870773e-05, + 1.2860774827039535e-05, + 1.424628117668708e-05, + 1.5781216839072502e-05, + 1.7481722534787634e-05, + 1.9365685801757876e-05, + 2.1452930475196476e-05, + 2.3765426775168872e-05, + 2.6327524239660617e-05, + 2.916621000402641e-05, + 3.23113951801985e-05, + 3.579623240575038e-05, + 3.9657467959272274e-05, + 4.3935832212627484e-05, + 4.867647259824674e-05, + 5.392943372698578e-05, + 5.9750189806239806e-05, + 6.620023504372924e-05, + 7.334773837551562e-05, + 8.126826951889774e-05, + 9.004560411953475e-05, + 9.977261662306475e-05, + 0.00011055227040064462, + 0.00012249871574320374, + 0.00013573850742751038, + 0.0001504119548835395, + 0.00016667461936118567, + 0.00018469897404963144, + 0.00020467624484506929, + 0.00022681845134313983, + 0.00025136066973655707, + 0.0002785635416159666, + 0.00030871605526760685, + 0.0003421386288181012, + 0.00037918652780566115, + 0.0004202536530818615, + 0.0004657767388504415, + 0.0005162400047782068, + 0.0005721803106756706, + 0.0006341928674455085, + 0.0007029375634110642, + 0.0007791459713024466, + 0.0008636291080811868, + 0.0009572860265739543, + 0.0010611133269329794, + 0.0011762156837248486, + 0.0013038174944285342, + 0.0014452757664416064, + 0.0016020943697959565, + 0.0017759397960268575, + 0.0019686585779157165, + 0.0021822965372330387, + 0.0024191200473462297, + 0.002681639509208457, + 0.0029726352651545987, + 0.0032951861874823576, + 0.003652701204390866, + 0.004048954049296939, + 0.0044881215402946175, + 0.0049748257263387665, + 0.005514180261399991, + 0.006111841396276563, + 0.006774064012281362, + 0.0075077631449594765, + 0.008320581485069053, + 0.009220963372382214, + 0.010218235835184077, + 0.01132269725537867, + 0.012545714281146031, + 0.013899827632916585, + 0.015398867478330148, + 0.01705807908891784, + 0.018894259496842754, + 0.02092590590725036, + 0.02317337661241798, + 0.025659065177867736, + 0.028407588643498856, + 0.031445990465936234, + 0.034803958915674005, + 0.038514061542606504, + 0.042611996288565185, + 0.04713685971045468, + 0.05213143264024909, + 0.057642483451280174, + 0.06372108890726877, + 0.07042297231442299, + 0.07780885842061816, + 0.08594484414941626, + 0.0949027838766468, + 0.10476068749535866, + 0.11560312896910659, + 0.1275216625152397, + 0.14061524290110372, + 0.15499064554752773, + 0.17076288143466523, + 0.18805560085107445, + 0.20700147913258782, + 0.22774257664871403, + 0.2504306641523768, + 0.27522750375648375, + 0.3023050746856109, + 0.33184573214673746, + 0.364042286675722, + 0.39909799076043967, + 0.4372264188480576, + 0.47865122689970496, + 0.5236057772831313, + 0.5723326157761489, + 0.6250827880052392, + 0.6821149843036746, + 0.7436945042196405, + 0.8100920343189543, + 0.8815822367862527, + 0.958442150185207, + 1.040949408585531, + 1.1293802904697217, + 1.224007614373638, + 1.3250985034523657, + 1.4329120466192407, + 1.5476968870843215, + 1.6696887717925937, + 1.7991080943949296, + 1.9361574596123305, + 2.081019287749857, + 2.233853461922105, + 2.3947949969829576, + 2.563951675969274, + 2.741401557718308, + 2.9271902054596914, + 3.121327421822778, + 3.323783203817554, + 3.5344825517747243, + 3.7532986870343077, + 3.9800441610656057, + 4.214459285089829, + 4.456197289858529, + 4.7048056583408835, + 4.959703184122231, + 5.220152521224118, + 5.48522833454224, + 5.75378166413191, + 6.024401798365141, + 6.295377824604686, + 6.564663076426582, + 6.829846881844605, + 7.0881392443309235, + 7.33637520910324, + 7.5710464497046885, + 7.7883677438333425, + 7.984385087751404, + 8.155129755928014, + 8.296818147450928, + 8.406090338392621, + 8.480270652940185, + 8.517621475561752, + 8.517547881944601, + 8.480697497230167, + 8.408890832411064, + 8.304817575555777, + 8.171451196864076, + 8.011176402128372, + 7.824699775291044, + 7.60992792676962, + 7.361144132201262, + 7.068968616902764, + 6.721691227663825, + 6.308512825266234, + 5.8248625552268996, + 5.27907345536694, + 4.698146859618587, + 4.128250724725177, + 3.623959549324555, + 3.2220854681934576, + 2.9087846976468863, + 2.62743372049, + 2.35742854251, + 2.09971361062, + 1.85545285079, + 1.62566892896, + 1.41121627898, + 1.21275616821, + 1.03073597428, + 0.86537520506, + 0.716660848443, + 0.584354233083, + 0.46801066832, + 0.367011348678, + 0.280604630123, + 0.207950599509, + 0.14815971857, + 0.100313699052, + 0.0634565321457, + 0.0365475307037, + 0.0183795402928, + 0.0074866053258, + 0.00209683555323, + 0.000218766154685, + -4.8914818932e-05, + -2.53935779264e-06, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 4, + "j": 4, + "angular_momentum": 4 + }, + { + "radial_function": [ + 0.0, + 1.8670664701983887e-10, + 7.596471003608444e-10, + 1.7386305571374396e-09, + 3.1442601968249455e-09, + 4.997962454229867e-09, + 7.322017334149085e-09, + 1.0139589804267446e-08, + 1.347476230437055e-08, + 1.73525684093746e-08, + 2.1799027689477154e-08, + 2.6841181806265573e-08, + 3.25071318894265e-08, + 3.882607724004425e-08, + 4.5828355402884494e-08, + 5.354548366073451e-08, + 6.201020199568441e-08, + 7.125651757383479e-08, + 8.131975079920257e-08, + 9.223658299961986e-08, + 1.0404510579615381e-07, + 1.1678487221856607e-07, + 1.304969496203709e-07, + 1.4522397446972402e-07, + 1.6101020906762486e-07, + 1.779016002648055e-07, + 1.9594584025819438e-07, + 2.151924295178024e-07, + 2.356927419401259e-07, + 2.575000922881313e-07, + 2.806698060117882e-07, + 3.0525929152248364e-07, + 3.3132811500835236e-07, + 3.589380778834192e-07, + 3.881532969567583e-07, + 4.190402874231556e-07, + 4.516680487616301e-07, + 4.861081536554832e-07, + 5.224348400381273e-07, + 5.607251063571775e-07, + 6.010588101958685e-07, + 6.435187703405229e-07, + 6.881908724354233e-07, + 7.351641783335681e-07, + 7.845310392930347e-07, + 8.363872131211136e-07, + 8.908319854411308e-07, + 9.479682951627573e-07, + 1.0079028644537466e-06, + 1.0707463330763816e-06, + 1.1366133976009818e-06, + 1.2056229554456894e-06, + 1.2778982537974095e-06, + 1.3535670440379449e-06, + 1.4327617412901995e-06, + 1.5156195896336562e-06, + 1.6022828331783891e-06, + 1.6928988930249341e-06, + 1.787620550393202e-06, + 1.8866061361556725e-06, + 1.990019727047736e-06, + 2.098031348689299e-06, + 2.21081718561831e-06, + 2.3285597988414473e-06, + 2.45144835065164e-06, + 2.5796788376669485e-06, + 2.7134543317167495e-06, + 2.8529852292288735e-06, + 2.9984895092999824e-06, + 3.150193000713309e-06, + 3.3083296583681704e-06, + 3.4731418492909066e-06, + 3.6448806484101356e-06, + 3.823806145039482e-06, + 4.01018775955092e-06, + 4.2043045715578435e-06, + 4.406445659158972e-06, + 4.616910450037261e-06, + 4.8360090849464054e-06, + 5.064062793706439e-06, + 5.301404284408925e-06, + 5.548378145790113e-06, + 5.805341264132352e-06, + 6.072663254281119e-06, + 6.35072690575676e-06, + 6.63992864430553e-06, + 6.94067900979004e-06, + 7.253403150041701e-06, + 7.578541332681809e-06, + 7.916549474101678e-06, + 8.267899686941155e-06, + 8.633080847085357e-06, + 9.01259917927996e-06, + 9.406978864475087e-06, + 9.81676266686532e-06, + 1.0242512583732115e-05, + 1.0684810517279525e-05, + 1.1144258970171334e-05, + 1.1621481764638573e-05, + 1.2117124787278993e-05, + 1.2631856758842421e-05, + 1.3166370031852594e-05, + 1.372138141440219e-05, + 1.4297633024120561e-05, + 1.4895893170389886e-05, + 1.5516957268177776e-05, + 1.6161648782720852e-05, + 1.6830820207646823e-05, + 1.7525354076769748e-05, + 1.824616401037024e-05, + 1.899419579904026e-05, + 1.9770428523705245e-05, + 2.0575875715197225e-05, + 2.141158655422398e-05, + 2.2278647112110302e-05, + 2.31781816351778e-05, + 2.4111353873435282e-05, + 2.507936845533964e-05, + 2.6083472310016995e-05, + 2.7124956138543845e-05, + 2.8205155937281617e-05, + 2.9325454572121814e-05, + 3.0487283409168744e-05, + 3.1692124000122766e-05, + 3.2941509827875794e-05, + 3.4237028110443184e-05, + 3.558032166909205e-05, + 3.697309086040023e-05, + 3.841709557512687e-05, + 3.9914157306163664e-05, + 4.146616128860552e-05, + 4.307505871326681e-05, + 4.4742869017408116e-05, + 4.6471682253886384e-05, + 4.826366154294254e-05, + 5.012104560861215e-05, + 5.20461514032685e-05, + 5.404137682147609e-05, + 5.610920351010278e-05, + 5.825219977324321e-05, + 6.047302357943127e-05, + 6.277442567151323e-05, + 6.515925278516191e-05, + 6.763045097745959e-05, + 7.019106907234805e-05, + 7.284426222277862e-05, + 7.559329559847086e-05, + 7.844154819995521e-05, + 8.139251680372153e-05, + 8.444982004485109e-05, + 8.761720264343605e-05, + 9.089853976667004e-05, + 9.429784156019914e-05, + 9.781925781252551e-05, + 0.00010146708280471481, + 0.00010524576030866428, + 0.00010915988876919492, + 0.00011321422666000517, + 0.00011741369802279916, + 0.00012176339821158164, + 0.00012626859981590703, + 0.00013093475879827595, + 0.0001357675208517826, + 0.00014077272795412455, + 0.00014595642517915302, + 0.00015132486771770562, + 0.00015688452815078337, + 0.0001626421039753865, + 0.0001686045253917233, + 0.00017477896334885636, + 0.0001811728378833105, + 0.0001877938267347982, + 0.0001946498742625514, + 0.0002017492006676328, + 0.00020910031153666028, + 0.00021671200772079512, + 0.0002245933955375411, + 0.00023275389734317311, + 0.00024120326247047992, + 0.00024995157851567037, + 0.00025900928306212516, + 0.0002683871757625997, + 0.00027809643086600366, + 0.0002881486101788486, + 0.00029855567644820983, + 0.000309330007235275, + 0.00032048440924707655, + 0.00033203213317951045, + 0.0003439868890603911, + 0.0003563628621254063, + 0.0003691747292384345, + 0.00038243767589909473, + 0.000396167413794627, + 0.0004103801990094285, + 0.0004250928508225433, + 0.00044032277116235315, + 0.0004560879647608724, + 0.0004724070599593751, + 0.0004892993302512952, + 0.0005067847165933, + 0.0005248838504425006, + 0.0005436180776119909, + 0.0005630094829489556, + 0.0005830809158588189, + 0.0006038560167080813, + 0.0006253592441580557, + 0.0006476159033985489, + 0.0006706521753922707, + 0.0006944951471295597, + 0.0007191728428890378, + 0.0007447142566186621, + 0.0007711493854088098, + 0.0007985092641176459, + 0.0008268260012136328, + 0.0008561328158151038, + 0.0008864640760553509, + 0.0009178553387240457, + 0.0009503433902963766, + 0.000983966289393189, + 0.001018763410658658, + 0.0010547754901990367, + 0.0010920446725442752, + 0.001130614559277305, + 0.0011705302592806585, + 0.0012118384407630448, + 0.0012545873850473529, + 0.0012988270422354302, + 0.0013446090887622754, + 0.0013919869869481703, + 0.0014410160466314453, + 0.001491753488850189, + 0.0015442585117916828, + 0.0015985923589629711, + 0.0016548183897265904, + 0.0017130021522979524, + 0.0017732114591611939, + 0.0018355164652010857, + 0.0018999897484331164, + 0.0019667063935393733, + 0.0020357440782911448, + 0.002107183162956754, + 0.0021811067827204253, + 0.002257600943362399, + 0.002336754620169246, + 0.0024186598602932803, + 0.0025034118885731045, + 0.002591109217055411, + 0.0026818537582361007, + 0.0027757509422370245, + 0.0028729098379385366, + 0.002973443278362042, + 0.003077467990303135, + 0.0031851047284142467, + 0.0032964784139794794, + 0.0034117182782833627, + 0.003530958011120286, + 0.0036543359142002262, + 0.0037819950599745555, + 0.003914083455817957, + 0.004050754213864074, + 0.004192165726721485, + 0.00433848184915301, + 0.004489872085997225, + 0.004646511786567007, + 0.004808582345657456, + 0.004976271411506918, + 0.005149773100871768, + 0.00532928822138588, + 0.005515024501642013, + 0.005707196829099047, + 0.005906027496182704, + 0.006111746454674124, + 0.006324591579024155, + 0.006544808938414209, + 0.006772653078337052, + 0.007008387311746858, + 0.007252284019984192, + 0.007504624964317349, + 0.007765701607766901, + 0.008035815448186654, + 0.008315278362554298, + 0.008604412962996768, + 0.008903552965228018, + 0.009213043569019728, + 0.009533241852289995, + 0.009864517177973807, + 0.010207251615170712, + 0.010561840374337045, + 0.010928692258092005, + 0.011308230125344555, + 0.011700891374077071, + 0.012107128437897324, + 0.012527409300817, + 0.01296221802933425, + 0.013412055322371863, + 0.013877439079850772, + 0.014358904990075248, + 0.014857007138483772, + 0.015372318635237947, + 0.01590543226438041, + 0.016456961156453245, + 0.01702753948123585, + 0.017617823166291072, + 0.018228490638232314, + 0.018860243589291916, + 0.019513807769533004, + 0.020189933806541445, + 0.02088939805068738, + 0.021613003451638215, + 0.02236158046090765, + 0.023135987968102383, + 0.023937114264159377, + 0.024765878041974193, + 0.02562322942568077, + 0.026510151036398096, + 0.027427659093997123, + 0.028376804554546584, + 0.029358674284776197, + 0.03037439227684458, + 0.031425120902871265, + 0.032512062210422556, + 0.033636459261821045, + 0.034799597515696994, + 0.03600280625566555, + 0.03724746006528602, + 0.03853498035171177, + 0.03986683691737531, + 0.04124454958611279, + 0.04266968987968901, + 0.04414388274825802, + 0.04566880836131122, + 0.04724620395033151, + 0.048877865715638825, + 0.05056565079284662, + 0.052311479282544586, + 0.05411733634461094, + 0.055985274360665464, + 0.0579174151641077, + 0.059915952339958736, + 0.06198315360218251, + 0.06412136323830465, + 0.06633300463959221, + 0.06862058290155437, + 0.07098668751401618, + 0.0734339951283431, + 0.07596527241313612, + 0.07858337899894158, + 0.08129127050921924, + 0.08409200168925426, + 0.0869887296253626, + 0.08998471706421936, + 0.0930833358322471, + 0.09628807035354987, + 0.09960252127851502, + 0.10303040921236134, + 0.10657557856154326, + 0.1102420014829277, + 0.11403378195576232, + 0.11795515996625164, + 0.12201051581029987, + 0.12620437452358854, + 0.13054141042833461, + 0.13502645181252762, + 0.13966448573584536, + 0.14446066296477159, + 0.1494203030442666, + 0.15454889950059966, + 0.15985212518312944, + 0.1653358377469657, + 0.17100608527240632, + 0.17686911202811284, + 0.1829313643802301, + 0.18919949683869258, + 0.19568037826038712, + 0.2023810981870378, + 0.20930897333794288, + 0.216471554248615, + 0.22387663205151503, + 0.231532245408803, + 0.23944668758629173, + 0.24762851367724376, + 0.2560865479639482, + 0.26482989141682095, + 0.2738679293444482, + 0.28321033915762694, + 0.2928670982849315, + 0.30284849219740007, + 0.31316512256046936, + 0.3238279154984245, + 0.33484812996787927, + 0.3462373662259428, + 0.35800757438424613, + 0.3701710630572095, + 0.3827405080563633, + 0.39572896115615636, + 0.40914985889508565, + 0.4230170313944072, + 0.4373447112003885, + 0.4521475420948517, + 0.46744058789602666, + 0.48323934118164913, + 0.49955973194722103, + 0.5164181361560104, + 0.5338313841430121, + 0.5518167688573767, + 0.5703920539009136, + 0.589575481323039, + 0.6093857791278352, + 0.6298421684685467, + 0.6509643704464962, + 0.6727726125054593, + 0.6952876343246712, + 0.7185306931816774, + 0.7425235687126153, + 0.7672885669782233, + 0.7928485238047678, + 0.8192268072854367, + 0.8464473193555517, + 0.8745344964126582, + 0.9035133087435004, + 0.9334092588590518, + 0.9642483784619487, + 0.9960572239226018, + 1.028862870320431, + 1.0626929037209043, + 1.097575411591613, + 1.1335389713643171, + 1.1706126366708989, + 1.2088259215234658, + 1.2482087816726413, + 1.288791593655549, + 1.3306051307601967, + 1.3736805358880966, + 1.4180492912680793, + 1.463743184506634, + 1.5107942709587372, + 1.5592348320505165, + 1.6090973292021344, + 1.6604143533728424, + 1.713218569575308, + 1.767542656316077, + 1.8234192395030508, + 1.8808808206384775, + 1.9399596987010148, + 2.0006878856836017, + 2.0630970152339176, + 2.1272182439295615, + 2.1930821451589693, + 2.260718594769743, + 2.3301566485086456, + 2.4014244104362525, + 2.4745488923145094, + 2.5495558632525466, + 2.6264696891375605, + 2.705313161956936, + 2.78610731788555, + 2.8688712441778548, + 2.9536218744474185, + 3.0403737718035764, + 3.129138899500154, + 3.2199263788761416, + 3.3127422341489163, + 3.407589123877549, + 3.5044660587283882, + 3.603368105474275, + 3.704286077115423, + 3.8072062088422585, + 3.912109820015989, + 4.018972962352478, + 4.127766054098531, + 4.238453500970974, + 4.350993303923644, + 4.465336654248004, + 4.581427517098885, + 4.699202203743553, + 4.818588933990704, + 4.939507389678456, + 5.061868261006427, + 5.185572787011155, + 5.31051229242397, + 5.436567722661902, + 5.563609180122042, + 5.691495463659704, + 5.82007361520695, + 5.949178476468109, + 6.078632259603032, + 6.208244136442826, + 6.337809850334216, + 6.467111356095757, + 6.595916493331062, + 6.72397869903903, + 6.8510367658490585, + 6.976814652701589, + 7.10102135493287, + 7.223350841798678, + 7.343482068895985, + 7.461079074124617, + 7.575791165798803, + 7.687253211530147, + 7.795086037130731, + 7.898896944591939, + 7.998280358303128, + 8.092818608302691, + 8.182082859617076, + 8.265634196069918, + 8.343024866303505, + 8.413799699665002, + 8.477497698464871, + 8.533653812469524, + 8.581800900610325, + 8.621471883947564, + 8.652202093103392, + 8.67353181252031, + 8.68500902336344, + 8.686192346535897, + 8.676654187320935, + 8.655984083758606, + 8.623792261920684, + 8.579713403010475, + 8.523410629569703, + 8.454579720801371, + 8.372953570175616, + 8.278306901048376, + 8.170461257915004, + 8.049290290156017, + 7.914725341079867, + 7.766761344877077, + 7.6054630157396055, + 7.4309712838061515, + 7.243509888260582, + 7.043391976753252, + 6.831026479143071, + 6.606923923594275, + 6.371701247558636, + 6.126085034993782, + 5.870912504222718, + 5.60712951015833, + 5.33578485836802, + 5.05802042689138, + 4.775057041794, + 4.488176853947928, + 4.198704206583366, + 3.9079886886328024, + 3.6173960987815343, + 3.328314897075321, + 3.042186199548335, + 2.7605619909515546, + 2.485184235625646, + 2.2180482983958454, + 1.9613523402038457, + 1.71712482491, + 1.48672169208, + 1.27117129349, + 1.0713435814, + 0.88792953252, + 0.721420665047, + 0.57209300973, + 0.439997520301, + 0.324958813041, + 0.226583589276, + 0.144278999999, + 0.0772794468127, + 0.0246779033607, + -0.0145450026759, + -0.0415035221895, + -0.0574117091789, + -0.0636198077841, + -0.0616842243708, + -0.0534579484989, + -0.0411628166491, + -0.0273696471342, + -0.0147771613964, + -0.0056769734361, + -0.00109937762061, + -2.26132808651e-05, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 4, + "j": 5, + "angular_momentum": 0 + }, + { + "radial_function": [ + 0.0, + 2.4670179627714356e-21, + 4.083913370693283e-20, + 2.1392787082997626e-19, + 6.99664289443582e-19, + 1.7678228003046045e-18, + 3.794147913571225e-18, + 7.276013972722609e-18, + 1.2849758876283839e-17, + 2.1309844608161037e-17, + 3.3630010161775825e-17, + 5.098659620023415e-17, + 7.47842356500125e-17, + 1.0668412044908301e-16, + 1.486350719203786e-16, + 2.0290766090429024e-16, + 2.72131643817507e-16, + 3.5933700250499165e-16, + 4.679988989834153e-16, + 6.020868814232812e-16, + 7.661187046891467e-16, + 9.652191580084316e-16, + 1.2051843236010394e-15, + 1.4925517242404684e-15, + 1.8346768537452373e-15, + 2.239816623833154e-15, + 2.7172203032437786e-15, + 3.277228569720332e-15, + 3.931381345323058e-15, + 4.69253513723394e-15, + 5.574990663674527e-15, + 6.594631604814949e-15, + 7.769075384350893e-15, + 9.117836958088219e-15, + 1.0662506661281906e-14, + 1.2426943248547631e-14, + 1.4437483346880345e-14, + 1.672316863778491e-14, + 1.9315992185345093e-14, + 2.225116543476429e-14, + 2.556740752593427e-14, + 2.930725868867359e-14, + 3.3517419624982275e-14, + 3.8249118926143234e-14, + 4.3558510731942265e-14, + 4.9507105002060927e-14, + 5.616223295676171e-14, + 6.359755042657665e-14, + 7.189358208500569e-14, + 8.113830970522644e-14, + 9.14278079050356e-14, + 1.0286693103042824e-13, + 1.155700551076711e-13, + 1.296618791885527e-13, + 1.4527829056483883e-13, + 1.6256729882066584e-13, + 1.8169004400791585e-13, + 2.028218845849022e-13, + 2.2615357122834895e-13, + 2.5189251307602713e-13, + 2.802641434564684e-13, + 3.115133926492018e-13, + 3.459062757887318e-13, + 3.8373160472128227e-13, + 4.253028330406778e-13, + 4.709600445921961e-13, + 5.210720960633237e-13, + 5.760389253979778e-13, + 6.362940384803761e-13, + 7.023071874715156e-13, + 7.745872552514875e-13, + 8.536853613580678e-13, + 9.401982059234062e-13, + 1.034771669703951e-12, + 1.1381046888920386e-12, + 1.2509534257059106e-12, + 1.3741357563521225e-12, + 1.5085361001892452e-12, + 1.6551106155516968e-12, + 1.8148927892772906e-12, + 1.9889994493210537e-12, + 2.1786372314463515e-12, + 2.3851095342732886e-12, + 2.6098239981358634e-12, + 2.85430054680553e-12, + 3.120180033488124e-12, + 3.4092335359989293e-12, + 3.723372348057954e-12, + 4.064658719331284e-12, + 4.435317397909364e-12, + 4.837748034880408e-12, + 5.2745385147905154e-12, + 5.748479278065892e-12, + 6.262578711034454e-12, + 6.8200796783434935e-12, + 7.424477284401298e-12, + 8.079537951673347e-12, + 8.789319913338292e-12, + 9.55819522216226e-12, + 1.0390873388222755e-11, + 1.1292426761706775e-11, + 1.2268317791249243e-11, + 1.3324428289792594e-11, + 1.4467090859580867e-11, + 1.5703122627817555e-11, + 1.703986146544562e-11, + 1.8485204865661784e-11, + 2.004765167835435e-11, + 2.1736346905708527e-11, + 2.3561129779831043e-11, + 2.5532585364852538e-11, + 2.7662099932011413e-11, + 2.996192038600126e-11, + 3.2445218034484e-11, + 3.5126157011650836e-11, + 3.80199676962323e-11, + 4.114302548222081e-11, + 4.451293528927181e-11, + 4.814862222608809e-11, + 5.207042885009968e-11, + 5.6300219503765006e-11, + 6.086149222602442e-11, + 6.577949879875013e-11, + 7.108137349895259e-11, + 7.679627119800153e-11, + 8.295551546269263e-11, + 8.959275739397685e-11, + 9.674414596366562e-11, + 1.0444851067752738e-10, + 1.1274755744918345e-10, + 1.2168607863630204e-10, + 1.3131217824839886e-10, + 1.4167751342082333e-10, + 1.5283755331190969e-10, + 1.6485185668043894e-10, + 1.777843694759173e-10, + 1.9170374387825738e-10, + 2.0668368030811313e-10, + 2.228032940791313e-10, + 2.401475084190819e-10, + 2.5880747577646434e-10, + 2.788810294091982e-10, + 3.004731674385107e-10, + 3.2369657166646934e-10, + 3.4867216366618545e-10, + 3.755297007654029e-10, + 4.0440841481649693e-10, + 4.354576967697655e-10, + 4.688378303185901e-10, + 5.047207781347483e-10, + 5.432910244639039e-10, + 5.847464779359866e-10, + 6.292994392356111e-10, + 6.771776377227382e-10, + 7.286253425259033e-10, + 7.839045528402264e-10, + 8.432962734709828e-10, + 9.071018814617651e-10, + 9.75644590322447e-10, + 1.0492710190589655e-09, + 1.1283528729116533e-09, + 1.2132887442043945e-09, + 1.3045060418501359e-09, + 1.4024630580598422e-09, + 1.507651183023108e-09, + 1.6205972769804783e-09, + 1.7418662115395018e-09, + 1.8720635920980066e-09, + 2.011838674233453e-09, + 2.161887487532273e-09, + 2.32295618217416e-09, + 2.4958446134609795e-09, + 2.6814101814858043e-09, + 2.8805719439039315e-09, + 3.0943150212953887e-09, + 3.3236953159567422e-09, + 3.5698445656053433e-09, + 3.833975756806663e-09, + 4.117388923111375e-09, + 4.42147735413546e-09, + 4.747734247237948e-09, + 5.097759829942467e-09, + 5.473268988960842e-09, + 5.8760994408634545e-09, + 6.3082204815591854e-09, + 6.771742357692392e-09, + 7.268926301972858e-09, + 7.802195280956875e-09, + 8.374145504418808e-09, + 8.9875587508295e-09, + 9.645415566310578e-09, + 1.035090940007312e-08, + 1.1107461739225647e-08, + 1.1918738318569035e-08, + 1.2788666476403483e-08, + 1.3721453739869806e-08, + 1.4721607728055543e-08, + 1.5793957461490193e-08, + 1.6943676181144112e-08, + 1.817630578418223e-08, + 1.949778298591834e-08, + 2.091446733434011e-08, + 2.243317120643053e-08, + 2.4061191925761454e-08, + 2.5806346151275966e-08, + 2.767700669943533e-08, + 2.9682141966024244e-08, + 3.1831358137781804e-08, + 3.4134944387905153e-08, + 3.660392126196015e-08, + 3.925009248683623e-08, + 4.208610043774177e-08, + 4.5125485523203643e-08, + 4.838274976720435e-08, + 5.187342487740568e-08, + 5.561414512567373e-08, + 5.962272536903255e-08, + 6.391824458119027e-08, + 6.852113528291547e-08, + 7.345327927838263e-08, + 7.873811015458451e-08, + 8.440072300755269e-08, + 9.046799191791671e-08, + 9.696869570543414e-08, + 1.0393365256198735e-07, + 1.113958641758515e-07, + 1.1939067002457429e-07, + 1.279559125434972e-07, + 1.3713211394314596e-07, + 1.4696266549904888e-07, + 1.574940301714788e-07, + 1.687759595226668e-07, + 1.8086172591292724e-07, + 1.9380837106460157e-07, + 2.0767697215019116e-07, + 2.2253292660744033e-07, + 2.384462570499119e-07, + 2.55491937636411e-07, + 2.737502434369706e-07, + 2.9330712441010833e-07, + 3.142546057230308e-07, + 3.366912162446813e-07, + 3.607224472357933e-07, + 3.8646124331746566e-07, + 4.1402852802095556e-07, + 4.4355376631576454e-07, + 4.7517556675609444e-07, + 5.09042325994159e-07, + 5.453129186699115e-07, + 5.841574358234481e-07, + 6.257579753012512e-07, + 6.703094877545024e-07, + 7.180206821551282e-07, + 7.691149950533151e-07, + 8.238316279382925e-07, + 8.824266576648037e-07, + 9.451742248825513e-07, + 1.0123678061176316e-06, + 1.084321575259803e-06, + 1.161371860789973e-06, + 1.2438787054932476e-06, + 1.3322275357882238e-06, + 1.4268309484091134e-06, + 1.5281306226954176e-06, + 1.6365993672511142e-06, + 1.7527433104813156e-06, + 1.877104245058348e-06, + 2.0102621370650164e-06, + 2.152837811506281e-06, + 2.305495826453056e-06, + 2.4689475491295996e-06, + 2.6439544479610906e-06, + 2.831331616026007e-06, + 3.031951541737653e-06, + 3.2467481445027805e-06, + 3.4767210937092824e-06, + 3.7229404307777748e-06, + 3.986551516030968e-06, + 4.268780322462399e-06, + 4.570939101354416e-06, + 4.894432445365646e-06, + 5.240763777084603e-06, + 5.611542293214032e-06, + 6.008490395337985e-06, + 6.433451642813018e-06, + 6.888399262724216e-06, + 7.3754452572828886e-06, + 7.896850149558114e-06, + 8.45503341384958e-06, + 9.052584634378395e-06, + 9.692275450728754e-06, + 1.0377072336606724e-05, + 1.1110150276429996e-05, + 1.1894907400228147e-05, + 1.273498064379063e-05, + 1.363426250606601e-05, + 1.459691897964076e-05, + 1.562740874018852e-05, + 1.6730503676484358e-05, + 1.791131085867415e-05, + 1.917529604818945e-05, + 2.052830884781719e-05, + 2.197660961779198e-05, + 2.3526898272286413e-05, + 2.518634509174134e-05, + 2.6962623690579448e-05, + 2.8863946293495462e-05, + 3.089910147358795e-05, + 3.307749453774728e-05, + 3.5409190725942194e-05, + 3.790496144084226e-05, + 4.057633369481578e-05, + 4.343564302901837e-05, + 4.6496090113974784e-05, + 4.9771801310566676e-05, + 5.3277893462431676e-05, + 5.703054320873054e-05, + 6.104706113190687e-05, + 6.534597108517734e-05, + 6.994709505295868e-05, + 7.487164392812714e-05, + 8.014231462427262e-05, + 8.57833939493734e-05, + 9.182086972664883e-05, + 9.828254965499558e-05, + 0.0001051981884505772, + 0.00011259962383195877, + 0.00012052092198845933, + 0.00012899853315775892, + 0.00013807145802223461, + 0.0001477814257037827, + 0.0001581730840939556, + 0.00016929420343977572, + 0.0001811958940608318, + 0.00019393283918476046, + 0.00020756354394103847, + 0.00022215060163979002, + 0.00023776097850812487, + 0.00025446631815563575, + 0.0002723432671752379, + 0.0002914738232286374, + 0.00031194570730231025, + 0.00033385276163831046, + 0.0003572953752594433, + 0.0003823809388423406, + 0.0004092243310358043, + 0.000437948438362258, + 0.0004686847109423634, + 0.0005015737565938579, + 0.0005367659758106079, + 0.0005744222404944563, + 0.0006147146193928914, + 0.0006578271533668478, + 0.0007039566840032609, + 0.0007533137390146384, + 0.0008061234784916256, + 0.0008626267058749396, + 0.0009230809482829466, + 0.0009877616106888066, + 0.001056963208968942, + 0.0011310006872507308, + 0.0012102108250014907, + 0.001294953740117264, + 0.0013856144943027028, + 0.001482604807583961, + 0.0015863648893458626, + 0.0016973653935078096, + 0.001816109506213395, + 0.0019431351748392534, + 0.002079017487550543, + 0.0022243712134738225, + 0.0023798535141066994, + 0.0025461668369714907, + 0.002724062003958497, + 0.0029143415064938815, + 0.003117863021561513, + 0.003335543162711159, + 0.0035683614811793515, + 0.003817364733621106, + 0.004083671433336375, + 0.004368476703537061, + 0.004673057451654879, + 0.004998777885221322, + 0.005347095391647817, + 0.0057195668036759024, + 0.006117855076413274, + 0.006543736400310325, + 0.006999107778252553, + 0.007485995095290519, + 0.008006561711652229, + 0.008563117610951151, + 0.009158129137549176, + 0.00979422935987451, + 0.010474229095662204, + 0.011201128640842365, + 0.011978130242920135, + 0.012808651362757313, + 0.013696338772470309, + 0.01464508353599824, + 0.015659036926007976, + 0.016742627327874352, + 0.01790057818917099, + 0.01913792707234947, + 0.020460045871227628, + 0.02187266225637353, + 0.023381882415499454, + 0.024994215158001844, + 0.02671659745528198, + 0.028556421493148625, + 0.030521563310501088, + 0.032620413107758504, + 0.034861907303519436, + 0.037255562426704344, + 0.0398115109301363, + 0.042540539011565744, + 0.04545412653672226, + 0.04856448915218774, + 0.05188462267987032, + 0.05542834989337797, + 0.05921036975172987, + 0.06324630920766755, + 0.06755277766123231, + 0.07214742414446662, + 0.07704899734798867, + 0.08227740854388735, + 0.08785379748521868, + 0.09380060137610982, + 0.10014162692349125, + 0.10690212559236506, + 0.11410887200416968, + 0.12179024562286277, + 0.1299763156380886, + 0.13869892906408637, + 0.14799180205654228, + 0.15789061433362525, + 0.1684331066586457, + 0.17965918124180993, + 0.1916110048817513, + 0.20433311471700977, + 0.21787252625779313, + 0.23227884345916422, + 0.24760437044338016, + 0.2639042244872841, + 0.2812364497092633, + 0.2996621309676981, + 0.31924550725787476, + 0.3400540838142923, + 0.36215874216382776, + 0.3856338470090012, + 0.41055734897200014, + 0.4370108818186864, + 0.46507985291456805, + 0.4948535252607071, + 0.5264250893576533, + 0.5598917232048635, + 0.5953546380560909, + 0.632919107797596, + 0.6726944794259241, + 0.7147941618082562, + 0.7593355897345831, + 0.8064401600765614, + 0.856233136491421, + 0.9088435189529335, + 0.9644038740049169, + 1.0230501214943173, + 1.0849212732291953, + 1.1501591185991067, + 1.2189078521618713, + 1.291313637940917, + 1.3675241046309938, + 1.4476877662941399, + 1.53195336244004, + 1.620469111456101, + 1.7133818716489293, + 1.810836203454973, + 1.9129733272030198, + 2.0199299703907756, + 2.131837099285343, + 2.2488185294501357, + 2.370989410924628, + 2.4984545837595515, + 2.6313068015275345, + 2.769624819869352, + 2.9134713500581917, + 3.0628908775920043, + 3.2179073480073748, + 3.378521724262739, + 3.5447094210866483, + 3.716417625090853, + 3.8935625111749173, + 4.07602636876941, + 4.263654654339654, + 4.4562529897924446, + 4.65358412930368, + 4.855364921573752, + 5.0612632966761755, + 5.270895311661347, + 5.48382229245617, + 5.699548113087353, + 5.917516658079438, + 6.1371095175638475, + 6.357643969173293, + 6.578371304779919, + 6.798475566072156, + 7.017072757761759, + 7.233210612794066, + 7.445868992159394, + 7.653961009007087, + 7.856334976629688, + 8.051777290983434, + 8.239016371054808, + 8.416727794994216, + 8.583540785331076, + 8.738046213017894, + 8.878806305451826, + 9.004366255662816, + 9.113267936937183, + 9.20406592224295, + 9.275345987897653, + 9.325746236641315, + 9.353980898955337, + 9.358866752250792, + 9.33935192581998, + 9.294546624776975, + 9.223755002442836, + 9.12650703683675, + 9.00258883299755, + 8.852069304456379, + 8.675320733060197, + 8.473030345082822, + 8.246199890391347, + 7.9961304275081515, + 7.7243902998258775, + 7.432765860189952, + 7.123197076814694, + 6.797703872600378, + 6.45831386274614, + 6.10700765101249, + 5.745703013590893, + 5.376302226254679, + 5.0008243497833895, + 4.621631964175811, + 4.24173398076018, + 3.86509730743553, + 3.4968286108006574, + 3.143003343648873, + 2.8098609029133232, + 2.5021502415953605, + 2.220815276955843, + 1.9613918441503302, + 1.71712482491, + 1.48672169208, + 1.27117129349, + 1.0713435814, + 0.88792953252, + 0.721420665047, + 0.57209300973, + 0.439997520301, + 0.324958813041, + 0.226583589276, + 0.144278999999, + 0.0772794468127, + 0.0246779033607, + -0.0145450026759, + -0.0415035221895, + -0.0574117091789, + -0.0636198077841, + -0.0616842243708, + -0.0534579484989, + -0.0411628166491, + -0.0273696471342, + -0.0147771613964, + -0.0056769734361, + -0.00109937762061, + -2.26132808651e-05, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 4, + "j": 5, + "angular_momentum": 2 + }, + { + "radial_function": [ + 0.0, + 6.40437059298406e-33, + 4.313529464302866e-31, + 5.171529905743998e-30, + 3.058810341485036e-29, + 1.2285026109513793e-28, + 3.862685721826448e-28, + 1.025789559495494e-27, + 2.407467624895366e-27, + 5.141483100422954e-27, + 1.0193151673139846e-26, + 1.9028388906593613e-26, + 3.380127467974292e-26, + 5.759272948409982e-26, + 9.471089416549288e-26, + 1.510656269854958e-25, + 2.346316307518075e-25, + 3.560171368843857e-25, + 5.291578459575092e-25, + 7.721590051106228e-25, + 1.1083121468701732e-24, + 1.5673171846593292e-24, + 2.1867453277271143e-24, + 3.01378372376108e-24, + 4.107308948570881e-24, + 5.540343543143288e-24, + 7.402957862915795e-24, + 9.805688676622876e-24, + 1.2883556386771308e-23, + 1.6800774590951708e-23, + 2.1756259159425908e-23, + 2.7990059262605185e-23, + 3.5790850083097293e-23, + 4.550464654744913e-23, + 5.75449195999718e-23, + 7.240432165224026e-23, + 9.066825622699773e-23, + 1.1303055891334329e-22, + 1.4031159299542158e-22, + 1.7347910402723918e-22, + 2.136722238360402e-22, + 2.6222906648458763e-22, + 3.2071841747990614e-22, + 3.9097608365325373e-22, + 4.751465457117739e-22, + 5.757306393063714e-22, + 6.956400850025572e-22, + 8.382597936017241e-22, + 1.0075189932235522e-21, + 1.2079723578039752e-21, + 1.444892469183036e-21, + 1.7243751131960654e-21, + 2.0534591003864456e-21, + 2.440262518165811e-21, + 2.8941375570451102e-21, + 3.425846326236864e-21, + 4.047760374772462e-21, + 4.774086971419675e-21, + 5.621125577250225e-21, + 6.607558369673666e-21, + 7.754779153514814e-21, + 9.087265526772801e-21, + 1.0632999765946482e-20, + 1.2423944568617117e-20, + 1.4496580529057954e-20, + 1.689251307664166e-20, + 1.9659157524482953e-20, + 2.2850511937983884e-20, + 2.6528028697647814e-20, + 3.0761596940492423e-20, + 3.5630649533441854e-20, + 4.12254098607442e-20, + 4.76482955317425e-20, + 5.501549818427805e-20, + 6.345876078811635e-20, + 7.312737646557921e-20, + 8.419043562120072e-20, + 9.68393513916466e-20, + 1.1129069696505066e-19, + 1.2778939224623765e-19, + 1.4661228178613241e-19, + 1.6807215075878737e-19, + 1.9252223136286982e-19, + 2.203612580084177e-19, + 2.5203913657479328e-19, + 2.8806330058234756e-19, + 3.2900583566268522e-19, + 3.7551146299923383e-19, + 4.2830648324732753e-19, + 4.882087938124593e-19, + 5.561391057112446e-19, + 6.331335008167698e-19, + 7.203574861166369e-19, + 8.191217204826941e-19, + 9.308996085102477e-19, + 1.0573469794979557e-18, + 1.2003240937088367e-18, + 1.361920246432903e-18, + 1.544481270752269e-18, + 1.7506402750545287e-18, + 1.9833519886396878e-18, + 2.245931132738683e-18, + 2.5420952797741895e-18, + 2.8760127189732542e-18, + 3.2523559023395326e-18, + 3.676361112893076e-18, + 4.153895067465833e-18, + 4.691529249056413e-18, + 5.296622852127024e-18, + 5.977415324181941e-18, + 6.743129600120976e-18, + 7.604087245346175e-18, + 8.571836864967699e-18, + 9.659297287003951e-18, + 1.0880917196016196e-17, + 1.2252853085073851e-17, + 1.3793167600881544e-17, + 1.5522050590886408e-17, + 1.7462065419261013e-17, + 1.96384234062041e-17, + 2.2079289567408264e-17, + 2.4816123176608606e-17, + 2.788405708212462e-17, + 3.1322320130261345e-17, + 3.5174707551785196e-17, + 3.9490104688626076e-17, + 4.4323070058969245e-17, + 4.9734484408110954e-17, + 5.579227314064227e-17, + 6.257221034940062e-17, + 7.015881357243691e-17, + 7.864633941455224e-17, + 8.813989130522285e-17, + 9.875665190073571e-17, + 1.1062725403961686e-16, + 1.2389730568782446e-16, + 1.3872908602677867e-16, + 1.553034317153877e-16, + 1.7382183450529117e-16, + 1.9450877365956886e-16, + 2.1761430928725662e-16, + 2.43416965523447e-16, + 2.7222693572733246e-16, + 3.043896453670656e-16, + 3.4028971225153066e-16, + 3.8035534804485783e-16, + 4.2506324995518906e-16, + 4.749440367521028e-16, + 5.305882892705371e-16, + 5.926532622016592e-16, + 6.618703413212144e-16, + 7.390533281115802e-16, + 8.251076436661941e-16, + 9.2104055221763e-16, + 1.0279725177795255e-15, + 1.147149817560887e-15, + 1.2799585512665723e-15, + 1.4279401993708811e-15, + 1.5928089007229468e-15, + 1.77647063907555e-15, + 1.9810445469171216e-15, + 2.208886560164354e-15, + 2.4626156818281265e-15, + 2.7451431392149127e-15, + 3.059704754789418e-15, + 3.4098968798883626e-15, + 3.799716283528704e-15, + 4.233604429077516e-15, + 4.7164966191902775e-15, + 5.253876540744703e-15, + 5.851836802550147e-15, + 6.517146119035358e-15, + 7.257323867485185e-15, + 8.0807228240544e-15, + 8.99662097245293e-15, + 1.0015323376500218e-14, + 1.1148275211852965e-14, + 1.2408187179300254e-14, + 1.380917464829918e-14, + 1.536691202278965e-14, + 1.7098804001446687e-14, + 1.9024175557458126e-14, + 2.1164482690087832e-14, + 2.3543546206577925e-14, + 2.6187811034876683e-14, + 2.912663385874073e-14, + 3.239260214544914e-14, + 3.602188799084643e-14, + 4.0054640560420975e-14, + 4.453542132702134e-14, + 4.951368675479412e-14, + 5.50443235950734e-14, + 6.118824248459777e-14, + 6.801303621743149e-14, + 7.559370967451526e-14, + 8.401348920965749e-14, + 9.33647201295385e-14, + 1.0374986178649931e-13, + 1.1528259090690258e-13, + 1.2808902490352615e-13, + 1.4230907813509964e-13, + 1.5809796557067802e-13, + 1.7562786982144059e-13, + 1.950897892387999e-13, + 2.1669558669816795e-13, + 2.4068026083168004e-13, + 2.673044637333095e-13, + 2.968572919089102e-13, + 3.2965938002147475e-13, + 3.6606633014832884e-13, + 4.0647251296655493e-13, + 4.513152810191484e-13, + 5.010796386672729e-13, + 5.563034181732064e-13, + 6.175830165338215e-13, + 6.855797538643712e-13, + 7.61026920336084e-13, + 8.447375862277902e-13, + 9.376132575714527e-13, + 1.0406534685916601e-12, + 1.1549664124040533e-12, + 1.2817807218680525e-12, + 1.42245852510727e-12, + 1.5785099129901139e-12, + 1.7516089713987334e-12, + 1.9436115469344086e-12, + 2.156574933394389e-12, + 2.392779686102967e-12, + 2.654753793919468e-12, + 2.94529946344389e-12, + 3.267522796650765e-12, + 3.6248666749359648e-12, + 4.021147194698931e-12, + 4.460594037899652e-12, + 4.9478952021177565e-12, + 5.488246559120338e-12, + 6.087406764301155e-12, + 6.751758092049778e-12, + 7.488373836792835e-12, + 8.30509298727736e-12, + 9.210602957977904e-12, + 1.0214531244843487e-11, + 1.1327546968800707e-11, + 1.2561473370471055e-11, + 1.3929412437334103e-11, + 1.5445882968568843e-11, + 1.7126973526888428e-11, + 1.8990511878848128e-11, + 2.105625270090167e-11, + 2.3346085515663674e-11, + 2.5884265040037986e-11, + 2.869766635497953e-11, + 3.1816067570047827e-11, + 3.527246294529596e-11, + 3.9103409741129074e-11, + 4.3349412438299446e-11, + 4.8055348336533537e-11, + 5.327093899677611e-11, + 5.90512724515103e-11, + 6.54573816498678e-11, + 7.255688519024209e-11, + 8.042469703651574e-11, + 8.914381264256108e-11, + 9.880617970647536e-11, + 1.0951366265318493e-10, + 1.2137911093467195e-10, + 1.3452754231047096e-10, + 1.4909745346908904e-10, + 1.6524227170025395e-10, + 1.8313196277598315e-10, + 2.0295481184818345e-10, + 2.2491939595048603e-10, + 2.4925676874451805e-10, + 2.7622288028274405e-10, + 3.0610125711029575e-10, + 3.3920597067002353e-10, + 3.758849249882311e-10, + 4.1652349804329227e-10, + 4.615485747420437e-10, + 5.114330137015668e-10, + 5.667005944074172e-10, + 6.279314964127461e-10, + 6.957683678407073e-10, + 7.709230463689694e-10, + 8.541840031056056e-10, + 9.464245867654232e-10, + 1.0486121544377793e-09, + 1.161818184070212e-09, + 1.2872294745545158e-09, + 1.4261605493852854e-09, + 1.5800673949546215e-09, + 1.7505626750247404e-09, + 1.939432581491479e-09, + 2.1486554968210156e-09, + 2.380422662885636e-09, + 2.637161071968492e-09, + 2.9215588185668456e-09, + 3.2365931777017332e-09, + 3.585561700991642e-09, + 3.972116656056523e-09, + 4.400303169746717e-09, + 4.874601470401277e-09, + 5.39997367364305e-09, + 5.981915597261473e-09, + 6.62651414736333e-09, + 7.340510874491105e-09, + 8.131372364380969e-09, + 9.007368195198236e-09, + 9.977657280770956e-09, + 1.105238349414298e-08, + 1.2242781578606524e-08, + 1.3561294441752852e-08, + 1.5021703071601543e-08, + 1.663927041708533e-08, + 1.8430900746257443e-08, + 2.0415316145704645e-08, + 2.261325200273804e-08, + 2.5047673513001725e-08, + 2.7744015481460828e-08, + 3.073044792017104e-08, + 3.403817021922343e-08, + 3.7701736971786055e-08, + 4.175941885231307e-08, + 4.625360233370999e-08, + 5.1231232419195664e-08, + 5.674430302534873e-08, + 6.285040013989137e-08, + 6.961330346154077e-08, + 7.710365279861614e-08, + 8.539968621157097e-08, + 9.458805766106172e-08, + 1.0476474267205691e-07, + 1.1603604156527647e-07, + 1.2851969073958595e-07, + 1.4234609366854713e-07, + 1.5765968452028095e-07, + 1.7462043872237372e-07, + 1.9340554630682543e-07, + 2.1421126560085555e-07, + 2.3725497679145267e-07, + 2.6277745681163005e-07, + 2.910453996275894e-07, + 3.2235420822699227e-07, + 3.570310878743776e-07, + 3.9543847299452607e-07, + 4.3797782386295415e-07, + 4.850938330647883e-07, + 5.372790859362188e-07, + 5.950792242584137e-07, + 6.590986674580294e-07, + 7.300069517846114e-07, + 8.085457543105617e-07, + 8.95536675788364e-07, + 9.918898647966686e-07, + 1.098613573947479e-06, + 1.2168247495951108e-06, + 1.347760766517584e-06, + 1.4927924322737204e-06, + 1.6534383985108605e-06, + 1.8313811319272872e-06, + 2.028484614437192e-06, + 2.2468139596574993e-06, + 2.4886571544003258e-06, + 2.7565491556120845e-06, + 3.053298598653021e-06, + 3.382017401039322e-06, + 3.7461535759764995e-06, + 4.149527605111252e-06, + 4.596372757760122e-06, + 5.0913797856237575e-06, + 5.639746469694871e-06, + 6.247232547869748e-06, + 6.92022060836815e-06, + 7.66578360092871e-06, + 8.491759684670194e-06, + 9.406835214689891e-06, + 1.0420636754092393e-05, + 1.1543833095470367e-05, + 1.2788248385616783e-05, + 1.4166987564028389e-05, + 1.5694575461351808e-05, + 1.7387111047923906e-05, + 1.9262438487540964e-05, + 2.134033683632774e-05, + 2.364273041709143e-05, + 2.6193922138707493e-05, + 2.902085226023262e-05, + 3.215338538774861e-05, + 3.562462878943734e-05, + 3.947128545538184e-05, + 4.373404570033545e-05, + 4.845802152493738e-05, + 5.369322842000109e-05, + 5.949511978796603e-05, + 6.592517975172524e-05, + 7.305158072641085e-05, + 8.094991283231019e-05, + 8.970399301415909e-05, + 9.940676255521906e-05, + 0.00011016128266716049, + 0.00012208183883416108, + 0.00013529516580367936, + 0.00014994180637104433, + 0.0001661776185307384, + 0.00018417544716479935, + 0.00020412697816455218, + 0.00022624479481302213, + 0.00025076465838339815, + 0.00027794803729245615, + 0.00030808491168228785, + 0.000341496883269944, + 0.0003785406233642139, + 0.00041961169553653594, + 0.00046514879323328784, + 0.0005156384368174423, + 0.0005716201793138212, + 0.0006336923751222444, + 0.0007025185716426557, + 0.0007788345901155, + 0.000863456368250812, + 0.0009572886455436716, + 0.0010613345793734684, + 0.00117670638918399, + 0.001304637136470285, + 0.0014464937576477387, + 0.0016037914790868217, + 0.0017782097567629871, + 0.0019716098944664133, + 0.002186054512668284, + 0.0024238290509966767, + 0.0026874655110605138, + 0.0029797686580751424, + 0.0033038449232854687, + 0.0036631342708048475, + 0.004061445311674524, + 0.0045029939753664676, + 0.0049924460717113124, + 0.005534964102408367, + 0.006136258712972327, + 0.006802645198034125, + 0.00754110550868022, + 0.008359356236473842, + 0.009265923082859118, + 0.010270222347264116, + 0.011382650005348115, + 0.012614678970262505, + 0.013978965156543963, + 0.015489462999302437, + 0.017161551085486244, + 0.019012168586549506, + 0.02105996317158609, + 0.023325451099596058, + 0.02583119016206505, + 0.028601966128206587, + 0.03166499332951651, + 0.035050129924056955, + 0.03879010834292496, + 0.04292078130930335, + 0.0474813836868078, + 0.05251481026097669, + 0.05806790937037414, + 0.06419179205708732, + 0.07094215613949255, + 0.07837962426834626, + 0.08657009466173775, + 0.09558510277209696, + 0.10550219161734656, + 0.11640528797385431, + 0.1283850810007673, + 0.14153939911694227, + 0.1559735802837825, + 0.1718008299455616, + 0.18914256003186486, + 0.20812870158590854, + 0.2288979825120956, + 0.25159816113445843, + 0.27638620522069685, + 0.30342840538160815, + 0.33290041085339284, + 0.3649871751758095, + 0.3998827986747579, + 0.4377902547589531, + 0.47892098677290834, + 0.5234943631486997, + 0.571736979236899, + 0.6238817958850883, + 0.6801671070956744, + 0.7408353315536852, + 0.8061316266388394, + 0.8763023273995345, + 0.9515932177739009, + 1.032247646508952, + 1.1185045057206493, + 1.210596095253534, + 1.3087459013892395, + 1.4131663217081205, + 1.5240563706011063, + 1.6415993992376356, + 1.7659608593274059, + 1.8972861313055094, + 2.035698422032231, + 2.181296714388451, + 2.3341537191519937, + 2.4943137387743803, + 2.66179030061508, + 2.8365633549351728, + 3.018575763267783, + 3.207728725698311, + 3.403875718705163, + 3.6068144450793462, + 3.8162762450553926, + 4.0319123982531515, + 4.253276777095797, + 4.4798044175282925, + 4.710785777163671, + 4.945336781233952, + 5.182365241631213, + 5.420534890835978, + 5.658229113869021, + 5.893517473275684, + 6.124129264074731, + 6.347439517899975, + 6.560473954514654, + 6.759940131383319, + 6.9422921680310425, + 7.103835530973476, + 7.240876003804016, + 7.3499126538326784, + 7.427867922271589, + 7.472338690828165, + 7.4818405079057815, + 7.456003991134976, + 7.395669720567275, + 7.302819113616774, + 7.180279016235779, + 7.031154076762219, + 6.857981725851247, + 6.6616778122158955, + 6.4404510117264655, + 6.189005728898274, + 5.898501998636468, + 5.557840749116671, + 5.156791890150083, + 4.691125781191609, + 4.169053827568848, + 3.6167848565375067, + 3.0789903247575863, + 2.6083917458503243, + 2.240467221164266, + 1.9616793813330855, + 1.71712482491, + 1.48672169208, + 1.27117129349, + 1.0713435814, + 0.88792953252, + 0.721420665047, + 0.57209300973, + 0.439997520301, + 0.324958813041, + 0.226583589276, + 0.144278999999, + 0.0772794468127, + 0.0246779033607, + -0.0145450026759, + -0.0415035221895, + -0.0574117091789, + -0.0636198077841, + -0.0616842243708, + -0.0534579484989, + -0.0411628166491, + -0.0273696471342, + -0.0147771613964, + -0.0056769734361, + -0.00109937762061, + -2.26132808651e-05, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 4, + "j": 5, + "angular_momentum": 4 + }, + { + "radial_function": [ + 0.0, + 2.000754773783858e-10, + 8.140404140348397e-10, + 1.8631224128968467e-09, + 3.3693999110779427e-09, + 5.355833548890557e-09, + 7.846298655136052e-09, + 1.086561888783851e-08, + 1.443960107122545e-08, + 1.8595071269142643e-08, + 2.3359912141307437e-08, + 2.876310162401837e-08, + 3.483475298316082e-08, + 4.1606156288789556e-08, + 4.910982135672024e-08, + 5.73795222140012e-08, + 6.645034313636372e-08, + 7.635872631818071e-08, + 8.714252122398328e-08, + 9.884103568882568e-08, + 1.1149508882271682e-07, + 1.251470657861129e-07, + 1.3984097449386555e-07, + 1.5562250432931563e-07, + 1.7253908692370216e-07, + 1.9063995907736953e-07, + 2.0997622790945324e-07, + 2.3060093829053257e-07, + 2.5256914266122516e-07, + 2.7593797330108943e-07, + 3.007667171485282e-07, + 3.271168932502808e-07, + 3.550523329337652e-07, + 3.846392628018222e-07, + 4.1594639064223716e-07, + 4.4904499436079084e-07, + 4.840090140303815e-07, + 5.209151471780236e-07, + 5.59842947421439e-07, + 6.008749265543491e-07, + 6.440966602294837e-07, + 6.89596897334388e-07, + 7.374676732114997e-07, + 7.878044268387462e-07, + 8.407061221311008e-07, + 8.962753734725827e-07, + 9.546185756661373e-07, + 1.0158460383879822e-06, + 1.0800721254656988e-06, + 1.1474153988335475e-06, + 1.2179987677140593e-06, + 1.2919496429714722e-06, + 1.3694000966958262e-06, + 1.4504870276864327e-06, + 1.5353523324220215e-06, + 1.6241430821060918e-06, + 1.7170117059902783e-06, + 1.8141161810050177e-06, + 1.9156202280009623e-06, + 2.0216935148532443e-06, + 2.1325118667209677e-06, + 2.248257483605672e-06, + 2.369119165423772e-06, + 2.4952925451344034e-06, + 2.626980329654407e-06, + 2.764392549583346e-06, + 2.907746817337684e-06, + 3.0572685943946095e-06, + 3.213191467840814e-06, + 3.3757574365092795e-06, + 3.5452172072017224e-06, + 3.7218305011785013e-06, + 3.905866371111969e-06, + 4.09760352951396e-06, + 4.2973306880835326e-06, + 4.505346909388549e-06, + 4.721961970400034e-06, + 4.947496738730359e-06, + 5.1822835621459715e-06, + 5.426666671484859e-06, + 5.681002597729403e-06, + 5.945660603190019e-06, + 6.221023128257254e-06, + 6.50748625328018e-06, + 6.805460176620239e-06, + 7.115369709249834e-06, + 7.437654786860199e-06, + 7.772770999074107e-06, + 8.121190137913752e-06, + 8.483400764656219e-06, + 8.85990879651177e-06, + 9.25123811421782e-06, + 9.657931189584486e-06, + 1.0080549736324449e-05, + 1.0519675381989083e-05, + 1.097591036433961e-05, + 1.144987825128616e-05, + 1.1942224686225151e-05, + 1.2453618158634648e-05, + 1.298475080220102e-05, + 1.3536339219720426e-05, + 1.4109125337829655e-05, + 1.4703877289784048e-05, + 1.532139033056832e-05, + 1.5962487782278152e-05, + 1.6628022013381858e-05, + 1.7318875451041608e-05, + 1.8035961629267253e-05, + 1.878022627315391e-05, + 1.9552648420073452e-05, + 2.035424158111981e-05, + 2.1186054941321627e-05, + 2.2049174602237316e-05, + 2.2944724867838173e-05, + 2.3873869574082384e-05, + 2.4837813465251674e-05, + 2.5837803617770602e-05, + 2.6875130913394467e-05, + 2.7951131563255082e-05, + 2.9067188684478433e-05, + 3.022473393258229e-05, + 3.142524918842864e-05, + 3.267026830565392e-05, + 3.3961378916715376e-05, + 3.530022430345996e-05, + 3.6688505330205406e-05, + 3.812798244561317e-05, + 3.9620477753067986e-05, + 4.116787715265188e-05, + 4.277213255714317e-05, + 4.443526418529736e-05, + 4.615936293383065e-05, + 4.79465928321404e-05, + 4.9799193581062234e-05, + 5.171948318017946e-05, + 5.370986064581225e-05, + 5.577280882344722e-05, + 5.7910897295869415e-05, + 6.0126785394442455e-05, + 6.242322531198526e-05, + 6.480306532525887e-05, + 6.726925312746067e-05, + 6.982483927713485e-05, + 7.247298076502865e-05, + 7.521694470617896e-05, + 7.806011215705023e-05, + 8.100598206726975e-05, + 8.405817536668324e-05, + 8.722043919289831e-05, + 9.049665126614873e-05, + 9.389082441823497e-05, + 9.740711126684285e-05, + 0.00010104980907123433, + 0.00010482336473050874, + 0.00010873237998042796, + 0.00011278161674942873, + 0.00011697600271161163, + 0.00012132063702602906, + 0.0001258207962722515, + 0.00013048194060577797, + 0.00013530972010520074, + 0.00014030998134883588, + 0.0001454887742273595, + 0.00015085235896684972, + 0.00015640721342779097, + 0.00016216004062832712, + 0.00016811777653790593, + 0.00017428759814165152, + 0.00018067693178480025, + 0.00018729346179405408, + 0.0001941451394128438, + 0.00020124019203352368, + 0.0002085871327516645, + 0.0002161947702482018, + 0.00022407221901597454, + 0.00023222890994549462, + 0.00024067460125660046, + 0.00024941938982723323, + 0.00025847372291363656, + 0.0002678484102446711, + 0.00027755463658419763, + 0.0002876039746775205, + 0.0002980083986741761, + 0.00030878029801644766, + 0.00031993249177950225, + 0.000331478243537166, + 0.0003434312767186068, + 0.0003558057905128263, + 0.00036861647630889537, + 0.00038187853470714677, + 0.00039560769311359914, + 0.0004098202239635446, + 0.00042453296352831967, + 0.0004397633314266856, + 0.00045552935076612267, + 0.00047184966898822705, + 0.0004887435794636438, + 0.0005062310437847932, + 0.0005243327148484743, + 0.0005430699607614448, + 0.0005624648895239131, + 0.0005825403745897299, + 0.0006033200813077939, + 0.0006248284942698177, + 0.0006470909455994151, + 0.0006701336442384388, + 0.0006939837061973812, + 0.0007186691858885237, + 0.0007442191085413777, + 0.0007706635036956803, + 0.0007980334398945885, + 0.0008263610605476422, + 0.0008556796210280307, + 0.000886023527073629, + 0.0009174283744702546, + 0.0009499309901547477, + 0.0009835694746851383, + 0.0010183832461972038, + 0.0010544130858937638, + 0.0010917011850522193, + 0.0011302911937041053, + 0.0011702282709456567, + 0.0012115591370344821, + 0.0012543321272183538, + 0.001298597247470294, + 0.0013444062321100333, + 0.0013918126034353612, + 0.0014408717333768257, + 0.0014916409072919768, + 0.0015441793899876749, + 0.0015985484939363957, + 0.0016548116499208476, + 0.0017130344800568751, + 0.0017732848733488247, + 0.001835633063880653, + 0.0019001517115963353, + 0.0019669159859883106, + 0.0020360036525674708, + 0.002107495162336978, + 0.0021814737443564512, + 0.002258025501501842, + 0.002337239509448442, + 0.0024192079191448944, + 0.002504026062744681, + 0.0025917925632293532, + 0.002682609447736138, + 0.0027765822648468793, + 0.0028738202058573308, + 0.0029744362302582352, + 0.003078547195449412, + 0.003186273991001682, + 0.0032977416774668186, + 0.0034130796299481885, + 0.0035324216866916224, + 0.0036559063025906583, + 0.003783676708191466, + 0.003915881073934924, + 0.004052672680196467, + 0.004194210093054419, + 0.004340657346104955, + 0.00449218412856568, + 0.004648965979755892, + 0.004811184490251371, + 0.004979027509964366, + 0.005152689363289452, + 0.005332371071682433, + 0.005518280583843235, + 0.00571063301368452, + 0.005909650886553231, + 0.006115564393814812, + 0.006328611656192438, + 0.006549038995960654, + 0.006777101218675011, + 0.007013061904243753, + 0.007257193708168096, + 0.007509778673001665, + 0.007771108550247043, + 0.008041485133588353, + 0.008321220603100178, + 0.00861063788147256, + 0.008910071002198818, + 0.009219865490285346, + 0.009540378756205808, + 0.009871980502689288, + 0.010215053146036455, + 0.0105699922510633, + 0.010937206981270021, + 0.011317120563980512, + 0.011710170772128416, + 0.012116810420227152, + 0.012537507880234484, + 0.012972747612067518, + 0.013423030713537426, + 0.013888875488707878, + 0.01437081803525984, + 0.014869412851689424, + 0.015385233464518134, + 0.015918873078241927, + 0.01647094524530003, + 0.017042084558978075, + 0.017632947371259405, + 0.01824421253203215, + 0.01887658215573247, + 0.01953078241210131, + 0.02020756434380299, + 0.02090770471125475, + 0.02163200686661641, + 0.02238130165487373, + 0.023156448348081015, + 0.023958335607153297, + 0.024787882479391538, + 0.02564603942452985, + 0.02653378938041859, + 0.027452148858951378, + 0.0284021690805767, + 0.02938493714688148, + 0.030401577250844743, + 0.03145325192615669, + 0.03254116333908264, + 0.03366655462224874, + 0.03483071125157611, + 0.036034962469387005, + 0.03728068275193453, + 0.038569293326528774, + 0.03990226373729433, + 0.041281113462071944, + 0.04270741357969235, + 0.044182788494404865, + 0.045708917713054735, + 0.047287537678708885, + 0.04892044366765358, + 0.05060949174026218, + 0.05235660075899702, + 0.05416375446852798, + 0.05603300364171854, + 0.0579664682928533, + 0.05996633996172875, + 0.06203488406786597, + 0.06417444233706283, + 0.06638743530833649, + 0.06867636491017594, + 0.07104381712546537, + 0.07349246472855932, + 0.07602507011489962, + 0.07864448820964405, + 0.08135366946717464, + 0.08415566296180073, + 0.08705361956642389, + 0.09005079523136722, + 0.09315055435485767, + 0.09635637325533511, + 0.0996718437451514, + 0.1031006768036456, + 0.1066467063621452, + 0.11031389318897362, + 0.11410632889314665, + 0.11802824003011012, + 0.12208399233038976, + 0.12627809503967866, + 0.13061520537568722, + 0.13510013311090227, + 0.13973784526915373, + 0.14453347095213404, + 0.14949230628886484, + 0.15461981950995696, + 0.15992165615361034, + 0.16540364439662358, + 0.17107180051770107, + 0.17693233449402526, + 0.18299165572553036, + 0.1892563788930751, + 0.19573332995153964, + 0.20242955224707507, + 0.20935231277801805, + 0.21650910857421798, + 0.22390767321458208, + 0.23155598347146142, + 0.23946226607588775, + 0.24763500461220878, + 0.256082946528398, + 0.26481511026895327, + 0.27384079251504667, + 0.28316957552905186, + 0.2928113346149961, + 0.30277624565258004, + 0.3130747927416895, + 0.32371777590885603, + 0.3347163188915059, + 0.3460818769805716, + 0.3578262449138217, + 0.3699615648004542, + 0.3825003340631524, + 0.3954554134018673, + 0.40884003472306424, + 0.4226678090563319, + 0.4369527344143321, + 0.45170920357140776, + 0.4669520117610761, + 0.4826963642271502, + 0.4989578836451287, + 0.5157526173342921, + 0.5330970442667202, + 0.5510080818191507, + 0.5695030922192124, + 0.5885998886608607, + 0.6083167410348332, + 0.6286723812224646, + 0.6496860078957861, + 0.6713772907872528, + 0.6937663743300951, + 0.7168738806484087, + 0.7407209117824689, + 0.7653290511064462, + 0.7907203638490123, + 0.8169173966064894, + 0.8439431758022472, + 0.8718212049570938, + 0.9005754606645112, + 0.9302303872251673, + 0.9608108896739889, + 0.9923423252910337, + 1.0248504932891678, + 1.058361622532112, + 1.0929023573260725, + 1.1284997409214053, + 1.165181196606348, + 1.2029745063837578, + 1.2419077867184103, + 1.2820094616233624, + 1.3233082322657512, + 1.3658330436148909, + 1.4096130473074953, + 1.4546775606994884, + 1.5010560220440554, + 1.548777941248001, + 1.5978728461827867, + 1.6483702241600222, + 1.7002994582028113, + 1.753689758136882, + 1.8085700858258733, + 1.8649690745153555, + 1.922914941821837, + 1.9824353961973997, + 2.043557536276638, + 2.1063077431038733, + 2.1707115647072683, + 2.236793592585266, + 2.304577330133251, + 2.374085052214236, + 2.445337655979146, + 2.5183545021894793, + 2.5931532471481047, + 2.6697496646275125, + 2.7481574574522285, + 2.828388059001393, + 2.9104504236600914, + 2.994350806461903, + 3.080092531720847, + 3.1676757503634163, + 3.257097185888401, + 3.348349869037519, + 3.441422861070143, + 3.5363009658285183, + 3.6329644306294204, + 3.7313886363562143, + 3.8315437771197427, + 3.9333945297318658, + 4.036899713732304, + 4.142011942759981, + 4.248677267715403, + 4.356834813174647, + 4.466416407864914, + 4.577346210494708, + 4.689540332845051, + 4.802906461299679, + 4.9173434791608885, + 5.0327410915755, + 5.148979455802713, + 5.2659288191179465, + 5.383449167567894, + 5.501389888342863, + 5.619589449876595, + 5.737875102563368, + 5.8560626049091224, + 5.973955978937181, + 6.091347299525888, + 6.208016522852614, + 6.323731358609854, + 6.438247191793285, + 6.551307059479553, + 6.662641688443611, + 6.771969599575515, + 6.878997285212756, + 6.9834194653089, + 7.08491942890954, + 7.183169466489592, + 7.277831399230018, + 7.368557210725673, + 7.4549897860269185, + 7.53676376275328, + 7.613506498113848, + 7.6848391549477055, + 7.750377908757818, + 7.809735276984369, + 7.862521570286837, + 7.908346464185126, + 7.94682068834436, + 7.977557829052006, + 8.000176239147391, + 8.014301048366358, + 8.019566265976062, + 8.015616966872853, + 8.00211155207784, + 7.97872407506376, + 7.945146626669649, + 7.9010917738919995, + 7.84629505147354, + 7.780517510546604, + 7.703548335302864, + 7.615207547120036, + 7.51534882517494, + 7.403862483536842, + 7.280678655335719, + 7.145770744723498, + 6.99915921386474, + 6.840915773899751, + 6.671168041271915, + 6.49010470058375, + 6.297981177259439, + 6.095125762219856, + 5.881946042632125, + 5.658935372842522, + 5.426678968940538, + 5.185859034062386, + 4.937258134704903, + 4.681759881434258, + 4.4203458701833975, + 4.15408788822062, + 3.88413469034268, + 3.61169334184265, + 3.338006360461881, + 3.064327807238838, + 2.791904110613792, + 2.521968536654014, + 2.2557610504152708, + 1.994585966647014, + 1.7399143558647188, + 1.493519180661861, + 1.2575849837231359, + 1.03463674423896, + 0.826959872322, + 0.635814004376, + 0.461976859908, + 0.3060264881, + 0.168325864635, + 0.0490088111742, + -0.0520272923129, + -0.135120212038, + -0.200831714605, + -0.249926400773, + -0.28334214026, + -0.302156257374, + -0.307554722095, + -0.300814771007, + -0.283313610796, + -0.256575376853, + -0.222362887767, + -0.182806552136, + -0.140536960749, + -0.0987481189302, + -0.0610696555973, + -0.0310871257921, + -0.0113744301495, + -0.00211433670391, + -4.20021332852e-05, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 5, + "j": 5, + "angular_momentum": 0 + }, + { + "radial_function": [ + 0.0, + 2.3669999938680212e-21, + 3.918343145148964e-20, + 2.0525479610751402e-19, + 6.71298463898855e-19, + 1.6961516375691365e-18, + 3.640325374050197e-18, + 6.981029440643242e-18, + 1.2328803292104886e-17, + 2.0445899793773902e-17, + 3.226658056276429e-17, + 4.891949499855731e-17, + 7.175232932731088e-17, + 1.0235892735801984e-16, + 1.4260910119929116e-16, + 1.9468136809166036e-16, + 2.6109886873179057e-16, + 3.447687432846363e-16, + 4.490252635693294e-16, + 5.776770441298108e-16, + 7.350586807798998e-16, + 9.26087193277678e-16, + 1.1563236787783802e-15, + 1.4320406154694028e-15, + 1.7602952903585186e-15, + 2.1490098630213852e-15, + 2.607058617865298e-15, + 3.1443630003404084e-15, + 3.771995080388087e-15, + 4.502290136008495e-15, + 5.348969104961641e-15, + 6.327271710429622e-15, + 7.454101129598822e-15, + 8.748181141918907e-15, + 1.0230226766145377e-14, + 1.1923129474016575e-14, + 1.3852158151616607e-14, + 1.6045177071075666e-14, + 1.8532882231992957e-14, + 2.1349057535307894e-14, + 2.4530852367502217e-14, + 2.8119082290151238e-14, + 3.215855466292429e-14, + 3.6698421164841483e-14, + 4.179255933157122e-14, + 4.749998538273603e-14, + 5.388530079267497e-14, + 6.101917523330056e-14, + 6.897886874248375e-14, + 7.784879613162623e-14, + 8.772113695619353e-14, + 9.869649455162012e-14, + 1.1088460790511806e-13, + 1.2440512051274052e-13, + 1.3938841051626134e-13, + 1.5597648688716004e-13, + 1.7432395672848985e-13, + 1.945990691062869e-13, + 2.1698484127279217e-13, + 2.416802735730002e-13, + 2.6890165980487365e-13, + 2.988840002708415e-13, + 3.31882525304873e-13, + 3.68174337727016e-13, + 4.0806018307771315e-13, + 4.51866357503602e-13, + 4.999467634832137e-13, + 5.526851246533115e-13, + 6.104973716774556e-13, + 6.738342119971805e-13, + 7.431838973330513e-13, + 8.190752037020732e-13, + 9.020806397842653e-13, + 9.928199009999115e-13, + 1.0919635872282586e-12, + 1.2002372043131664e-12, + 1.3184254700742108e-12, + 1.4473769476860623e-12, + 1.5880090308528358e-12, + 1.7413133067245717e-12, + 1.9083613247471967e-12, + 2.0903108011805344e-12, + 2.2884122921745726e-12, + 2.5040163694181674e-12, + 2.7385813358343787e-12, + 2.99368152105065e-12, + 3.2710161997280767e-12, + 3.5724191777887095e-12, + 3.899869097033189e-12, + 4.255500509662809e-12, + 4.6416157799455636e-12, + 5.060697874231473e-12, + 5.515424102713795e-12, + 6.008680885506836e-12, + 6.543579614804689e-12, + 7.123473696236657e-12, + 7.751976853689173e-12, + 8.432982791146334e-12, + 9.170686309278003e-12, + 9.969605984840494e-12, + 1.0834608524402375e-11, + 1.1770934917572186e-11, + 1.2784228516358044e-11, + 1.3880565186125819e-11, + 1.50664856735417e-11, + 1.6349030356965857e-11, + 1.7735776548748884e-11, + 1.9234878537666493e-11, + 2.085511056841525e-11, + 2.2605912970067396e-11, + 2.4497441666113347e-11, + 2.654062130452077e-11, + 2.8747202274810003e-11, + 3.1129821892213714e-11, + 3.370207004719892e-11, + 3.647855964695211e-11, + 3.9475002192565895e-11, + 4.2708288863204937e-11, + 4.6196577503799284e-11, + 4.995938594160459e-11, + 5.40176920924815e-11, + 5.839404133521347e-11, + 6.311266169100989e-11, + 6.819958735581428e-11, + 7.36827912006779e-11, + 7.959232686848103e-11, + 8.59604811729876e-11, + 9.282193752972079e-11, + 1.0021395121348935e-10, + 1.0817653729111705e-10, + 1.1675267214229683e-10, + 1.2598850953695931e-10, + 1.3593361231935679e-10, + 1.466412008089361e-10, + 1.5816841912417695e-10, + 1.7057662070787975e-10, + 1.8393167443224514e-10, + 1.9830429274332102e-10, + 2.137703834483225e-10, + 2.3041142680277182e-10, + 2.483148797363501e-10, + 2.6757460913312314e-10, + 2.8829135626074266e-10, + 3.105732345538873e-10, + 3.3453626315924533e-10, + 3.6030493875650215e-10, + 3.880128484310671e-10, + 4.1780332649310745e-10, + 4.4983015837894973e-10, + 4.8425833501049e-10, + 5.212648612297885e-10, + 5.610396220072816e-10, + 6.03786310880431e-10, + 6.497234245471847e-10, + 6.990853289126789e-10, + 7.521234011295441e-10, + 8.091072534276725e-10, + 8.703260443357521e-10, + 9.360898835456258e-10, + 1.0067313373294983e-09, + 1.082607041136705e-09, + 1.1640994274316529e-09, + 1.2516185769720052e-09, + 1.3456042017276673e-09, + 1.4465277697722048e-09, + 1.5548947811848245e-09, + 1.6712472063344163e-09, + 1.7961660979281547e-09, + 1.93027438916217e-09, + 2.0742398909019174e-09, + 2.2287785025862705e-09, + 2.3946576514291693e-09, + 2.572699976417146e-09, + 2.7637872743363397e-09, + 2.968864726528322e-09, + 3.1889454263676923e-09, + 3.4251152280735554e-09, + 3.678537940659604e-09, + 3.950460890996391e-09, + 4.242220881155453e-09, + 4.555250570406458e-09, + 4.891085308872392e-09, + 5.251370457247131e-09, + 5.6378692261992546e-09, + 6.052471071118121e-09, + 6.497200683561878e-09, + 6.9742276197197855e-09, + 7.485876612439837e-09, + 8.034638613968636e-09, + 8.623182621709468e-09, + 9.254368342041618e-09, + 9.93125975265455e-09, + 1.0657139623732317e-08, + 1.1435525070539631e-08, + 1.2270184205555073e-08, + 1.3165153970287057e-08, + 1.4124759231425678e-08, + 1.515363322636124e-08, + 1.625673945700308e-08, + 1.743939513480112e-08, + 1.8707296281978087e-08, + 2.0066544610218653e-08, + 2.152367630080134e-08, + 2.3085692819993455e-08, + 2.4760093913546826e-08, + 2.6554912935894363e-08, + 2.8478754673597916e-08, + 3.054083584550405e-08, + 3.275102846578607e-08, + 3.5119906268032e-08, + 3.765879441358228e-08, + 4.037982270958437e-08, + 4.329598258618659e-08, + 4.642118810068551e-08, + 4.9770341245858785e-08, + 5.335940187546995e-08, + 5.720546256176664e-08, + 6.132682874010593e-08, + 6.574310451323933e-08, + 7.047528450586662e-08, + 7.55458522080201e-08, + 8.097888525221387e-08, + 8.680016812569908e-08, + 9.303731282597785e-08, + 9.971988803476071e-08, + 1.068795573983192e-07, + 1.1455022756410505e-07, + 1.2276820665199166e-07, + 1.315723739020068e-07, + 1.410043612887141e-07, + 1.5110874792496264e-07, + 1.6193326818331044e-07, + 1.7352903447675684e-07, + 1.8595077574352724e-07, + 1.9925709274537762e-07, + 2.1351073133339793e-07, + 2.2877887499434747e-07, + 2.4513345798557945e-07, + 2.626515005338944e-07, + 2.814154676475393e-07, + 3.0151365320278214e-07, + 3.230405910607343e-07, + 3.4609749515647174e-07, + 3.707927305575344e-07, + 3.972423177010889e-07, + 4.2557047210958736e-07, + 4.559101821178971e-07, + 4.884038272488857e-07, + 5.232038401249228e-07, + 5.604734149339161e-07, + 6.003872657802112e-07, + 6.431324383726005e-07, + 6.889091788158196e-07, + 7.379318635578974e-07, + 7.904299946781688e-07, + 8.46649265277014e-07, + 9.068526997042598e-07, + 9.713218740460297e-07, + 1.0403582223903815e-06, + 1.1142844349490644e-06, + 1.1934459545069837e-06, + 1.2782125780406514e-06, + 1.3689801709282168e-06, + 1.4661725016707469e-06, + 1.5702432055310748e-06, + 1.6816778862122342e-06, + 1.8009963652193903e-06, + 1.928755089216721e-06, + 2.0655497065958572e-06, + 2.2120178250217043e-06, + 2.3688419627266404e-06, + 2.5367527070006036e-06, + 2.7165320946945424e-06, + 2.909017229918984e-06, + 3.115104155964976e-06, + 3.3357519990540245e-06, + 3.571987402850378e-06, + 3.824909274605972e-06, + 4.09569386412265e-06, + 4.385600199468109e-06, + 4.695975904024889e-06, + 5.028263421731725e-06, + 5.384006679456201e-06, + 5.764858216193016e-06, + 6.172586813184991e-06, + 6.6090856584874796e-06, + 7.0763810847120296e-06, + 7.576641919179262e-06, + 8.112189490906129e-06, + 8.685508336328174e-06, + 9.299257659814581e-06, + 9.95628359364798e-06, + 1.0659632319359845e-05, + 1.1412564108441093e-05, + 1.2218568346642277e-05, + 1.3081379610937911e-05, + 1.4004994871897893e-05, + 1.4993691903862638e-05, + 1.6052048981194993e-05, + 1.7184965954323544e-05, + 1.8397686804759474e-05, + 1.969582377358438e-05, + 2.1085383184153463e-05, + 2.257279306873018e-05, + 2.4164932728978375e-05, + 2.5869164364170314e-05, + 2.7693366914062715e-05, + 2.964597226345853e-05, + 3.173600398631433e-05, + 3.397311878923875e-05, + 3.6367650861998275e-05, + 3.8930659314436774e-05, + 4.167397894414078e-05, + 4.46102745357016e-05, + 4.7753098959110487e-05, + 5.11169553272288e-05, + 5.471736348949073e-05, + 5.857093116361439e-05, + 6.26954300359791e-05, + 6.710987716944129e-05, + 7.183462208679343e-05, + 7.689143993093549e-05, + 8.230363111074087e-05, + 8.809612789850788e-05, + 9.429560845125004e-05, + 0.00010093061877522607, + 0.0001080317031730688, + 0.00011563154378699156, + 0.0001237651098384434, + 0.00013246981724460643, + 0.00014178569935952625, + 0.00015175558954644663, + 0.00016242531646396336, + 0.00017384391290562828, + 0.0001860638391395604, + 0.00019914122174524265, + 0.00021313610902788392, + 0.00022811274413460874, + 0.000244139857091756, + 0.0002612909771115796, + 0.00027964476646196666, + 0.0002992853775156215, + 0.0003203028344208626, + 0.00034279344123441655, + 0.0003668602181972002, + 0.00039261336816380076, + 0.0004201707752350308, + 0.0004496585377408164, + 0.0004812115380188451, + 0.0005149740513909444, + 0.0005511003970906089, + 0.0005897556339719986, + 0.0006311163039947552, + 0.0006753712268530973, + 0.0007227223490478705, + 0.0007733856512981757, + 0.0008275921179972624, + 0.0008855887731554723, + 0.0009476397871358943, + 0.0010140276589941483, + 0.0010850544796226623, + 0.0011610432809126428, + 0.0012423394769293208, + 0.0013293124031266152, + 0.0014223569601544918, + 0.0015218953693382057, + 0.001628379047121447, + 0.0017422906064935623, + 0.0018641459938325208, + 0.001994496769998277, + 0.0021339325453182873, + 0.002283083578631148, + 0.0024426235509240088, + 0.0026132725254766555, + 0.0027958001061242914, + 0.0029910288070651037, + 0.00319983764773397, + 0.0034231659872132254, + 0.00366201761396304, + 0.003917465107019108, + 0.004190654486394291, + 0.004482810170850854, + 0.00479524026267201, + 0.0051293421807777784, + 0.005486608662986682, + 0.0058686341621928435, + 0.006277121659720665, + 0.006713889922773243, + 0.007180881233210803, + 0.007680169616918523, + 0.008213969604224972, + 0.008784645553778534, + 0.0093947215749955, + 0.010046892083375464, + 0.01074403302847917, + 0.011489213833494468, + 0.0122857100882293, + 0.013137017040989442, + 0.014046863933652093, + 0.015019229231031142, + 0.01605835679278052, + 0.017168773043418482, + 0.01835530519527907, + 0.019623100581963888, + 0.02097764716408872, + 0.022424795270037212, + 0.023970780637256453, + 0.025622248821942754, + 0.02738628104934865, + 0.029270421574824942, + 0.03128270663448537, + 0.033431695059481334, + 0.035726500636145186, + 0.0381768262928649, + 0.040793000194436435, + 0.043586013832677586, + 0.04656756219537749, + 0.049750086099252, + 0.05314681678049479, + 0.05677182281241222, + 0.06064005945941975, + 0.0647674205316841, + 0.06917079281889521, + 0.07386811320510776, + 0.07887842851219012, + 0.08422195814369868, + 0.08992015961361295, + 0.09599579696426326, + 0.10247301218340026, + 0.1093773995549302, + 0.11673608307355553, + 0.12457779682731288, + 0.132932968355806, + 0.14183380497515524, + 0.1513143829485104, + 0.1614107394479872, + 0.17216096715684262, + 0.18360531132406802, + 0.19578626912944566, + 0.2087486910240931, + 0.22253988379670445, + 0.2372097149668721, + 0.25281071811262745, + 0.2693981985634847, + 0.28703033896199104, + 0.30576830397891996, + 0.32567634338797086, + 0.3468218927398236, + 0.3692756705219555, + 0.39311177083232846, + 0.41840775019812637, + 0.4452447072942601, + 0.4737073539263725, + 0.5038840755439713, + 0.5358669796023022, + 0.5697519294311262, + 0.6056385615004645, + 0.6436302835968856, + 0.6838342511398768, + 0.7263613186988005, + 0.7713259635824982, + 0.8188461780118852, + 0.8690433262350812, + 0.9220419625750041, + 0.9779696062676629, + 1.0369564686535755, + 1.0991351278990538, + 1.1646401463973024, + 1.2336076257587176, + 1.3061746937889878, + 1.3824789182323922, + 1.4626576414185966, + 1.5468472300394511, + 1.6351822345884852, + 1.7277944523553377, + 1.8248118886868652, + 1.9263576108674008, + 2.032548489823275, + 2.143493824713725, + 2.259293846599003, + 2.3800380974231907, + 2.5058036824446575, + 2.6366533938018852, + 2.772633705764596, + 2.9137726423464234, + 3.0600775201305828, + 3.2115325713104697, + 3.368096453056929, + 3.529699652661035, + 3.696241799653378, + 3.867588899071116, + 4.043570502870055, + 4.223976839619946, + 4.408555925426149, + 4.59701068332059, + 4.78899610046102, + 4.98411645720983, + 5.181922665353595, + 5.381909755997402, + 5.5835145621642175, + 5.786113644550174, + 5.989021513099553, + 6.191489200782055, + 6.392703251516552, + 6.5917851887634, + 6.787791536737011, + 6.979714474202337, + 7.166483208027175, + 7.346966163685586, + 7.5199741013957, + 7.6842642798667455, + 7.838545805124047, + 7.98148631849814, + 8.111720195742123, + 8.22785844633175, + 8.328500515942254, + 8.41224820386372, + 8.477721903868327, + 8.523579357959298, + 8.548537068055035, + 8.55139443250568, + 8.531060551130617, + 8.48658346355103, + 8.41718134017373, + 8.32227482616422, + 8.20151934526913, + 8.054835712341989, + 7.88243690799254, + 7.684848387228646, + 7.462918909346709, + 7.217818712861983, + 6.951022083534122, + 6.664272187159142, + 6.359527699243879, + 6.038893489863982, + 5.704541564491885, + 5.358633571556449, + 5.003262034132441, + 4.640432982120268, + 4.272115828216631, + 3.900383836267137, + 3.52765558362527, + 3.157018410826836, + 2.792563155259653, + 2.439583602327203, + 2.10440462408776, + 1.7935402120182422, + 1.5119498784974255, + 1.2605870520366083, + 1.0346787731319689, + 0.826959872322, + 0.635814004376, + 0.461976859908, + 0.3060264881, + 0.168325864635, + 0.0490088111742, + -0.0520272923129, + -0.135120212038, + -0.200831714605, + -0.249926400773, + -0.28334214026, + -0.302156257374, + -0.307554722095, + -0.300814771007, + -0.283313610796, + -0.256575376853, + -0.222362887767, + -0.182806552136, + -0.140536960749, + -0.0987481189302, + -0.0610696555973, + -0.0310871257921, + -0.0113744301495, + -0.00211433670391, + -4.20021332852e-05, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 5, + "j": 5, + "angular_momentum": 2 + }, + { + "radial_function": [ + 0.0, + 5.665443292434099e-33, + 3.8158404819943223e-31, + 4.574846035410101e-30, + 2.705889092603679e-29, + 1.0867597020288192e-28, + 3.417014458713642e-28, + 9.074353983017676e-28, + 2.129697385737264e-27, + 4.5482659891291466e-27, + 9.017080125263214e-27, + 1.6832920075828105e-26, + 2.990133100458348e-26, + 5.0947761118338516e-26, + 8.378328401581345e-26, + 1.3363588680400967e-25, + 2.07560162270814e-25, + 3.149403789826185e-25, + 4.681043559419846e-25, + 6.83068382290793e-25, + 9.80436646236897e-25, + 1.3864823269035466e-24, + 1.9344417201933584e-24, + 2.6660575869934225e-24, + 3.633413406540838e-24, + 4.9011064816955106e-24, + 6.548814976937835e-24, + 8.674322084105068e-24, + 1.1397069741641661e-23, + 1.4862324813382285e-23, + 1.92460525365581e-23, + 2.476060554642603e-23, + 3.1661352089812045e-23, + 4.025438437883714e-23, + 5.090546766342076e-23, + 6.405041281506747e-23, + 8.020708032454543e-23, + 9.998925201077539e-23, + 1.2412263880165596e-22, + 1.534633291377741e-22, + 1.8901902342813803e-22, + 2.319734460297735e-22, + 2.837143782009124e-22, + 3.4586581398390424e-22, + 4.203248069452313e-22, + 5.093036498702984e-22, + 6.153781131447282e-22, + 7.415425613774917e-22, + 8.912728739432583e-22, + 1.068598212991626e-21, + 1.2781828173932817e-21, + 1.5254191499210681e-21, + 1.8165338932232354e-21, + 2.158708481408042e-21, + 2.560216062650484e-21, + 3.030577029447826e-21, + 3.580735519283235e-21, + 4.2232595866993574e-21, + 4.972568084439364e-21, + 5.84518766724751e-21, + 6.860043753674245e-21, + 8.038789751903551e-21, + 9.406179383957348e-21, + 1.0990487537810932e-20, + 1.2823985729873556e-20, + 1.494347901575664e-20, + 1.7390911999039446e-20, + 2.0214052527413964e-20, + 2.3467262695908472e-20, + 2.7212367935711986e-20, + 3.1519636266675194e-20, + 3.6468881232317154e-20, + 4.215070364996616e-20, + 4.8667889138902466e-20, + 5.613698036129091e-20, + 6.469004522202536e-20, + 7.447666472810922e-20, + 8.566616705616681e-20, + 9.845013750639665e-20, + 1.1304523749546814e-19, + 1.2969636967020175e-19, + 1.4868023052767815e-19, + 1.7030929687547208e-19, + 1.9493629775925791e-19, + 2.2295922961114654e-19, + 2.54826979056834e-19, + 2.91045625376419e-19, + 3.3218550282906384e-19, + 3.78889112638776e-19, + 4.3187998449624525e-19, + 4.9197259923774315e-19, + 5.600834972573454e-19, + 6.372437112093337e-19, + 7.246126782510529e-19, + 8.234938039363529e-19, + 9.353518706702195e-19, + 1.061832504927386e-18, + 1.204783942543372e-18, + 1.3662813582615218e-18, + 1.5486540568096326e-18, + 1.7545158557757293e-18, + 1.9867990294518293e-18, + 2.2487922230760847e-18, + 2.544182795804603e-18, + 2.8771041001930986e-18, + 3.252188266034572e-18, + 3.674625118659178e-18, + 4.150227934974338e-18, + 4.685506818705597e-18, + 5.287750564722525e-18, + 5.965117982432644e-18, + 6.726739753925419e-18, + 7.582832027605495e-18, + 8.544823081233627e-18, + 9.625494537392812e-18, + 1.0839138783763429e-17, + 1.2201734433650892e-17, + 1.3731141869199889e-17, + 1.5447321138030438e-17, + 1.7372574728401573e-17, + 1.9531818033217565e-17, + 2.1952880619328707e-17, + 2.4666841779503984e-17, + 2.7708404217723312e-17, + 3.111631016371228e-17, + 3.4933804673475255e-17, + 3.920915142194475e-17, + 4.3996206868173234e-17, + 4.9355059335360804e-17, + 5.535274027329449e-17, + 6.20640157809218e-17, + 6.957226735610035e-17, + 7.797047184384952e-17, + 8.736229164783017e-17, + 9.786328750936927e-17, + 1.0960226750951399e-16, + 1.2272278746815052e-16, + 1.3738481957562596e-16, + 1.53766607992545e-16, + 1.7206673216242463e-16, + 1.9250640093684604e-16, + 2.1533200310512773e-16, + 2.40817942789012e-16, + 2.6926979125597747e-16, + 3.0102779023552856e-16, + 3.3647074560525125e-16, + 3.760203546973551e-16, + 4.201460151321293e-16, + 4.693701683955506e-16, + 5.242742372545194e-16, + 5.85505222605302e-16, + 6.537830322559053e-16, + 7.299086229296291e-16, + 8.147730442544949e-16, + 9.093674851351562e-16, + 1.0147944318991425e-15, + 1.1322800612814625e-15, + 1.2631880036727e-15, + 1.4090346273348428e-15, + 1.5715060113031821e-15, + 1.7524767913131996e-15, + 1.954031085364347e-15, + 2.17848572725503e-15, + 2.4284160598212193e-15, + 2.706684571071814e-15, + 3.0164726821251138e-15, + 3.361316033937216e-15, + 3.745143655662095e-15, + 4.172321439626744e-15, + 4.647700393304669e-15, + 5.176670192680612e-15, + 5.765218614851709e-15, + 6.419997493498811e-15, + 7.148395909560661e-15, + 7.958621407881098e-15, + 8.859790116677991e-15, + 9.862026738779605e-15, + 1.0976575496002636e-14, + 1.2215923219758332e-14, + 1.3593935907800314e-14, + 1.5126010226369108e-14, + 1.6829241572277263e-14, + 1.872261051044525e-14, + 2.082718958489509e-14, + 2.3166372715234378e-14, + 2.5766129648150208e-14, + 2.8655288179974883e-14, + 3.1865847179974896e-14, + 3.543332375717237e-14, + 3.939713828673864e-14, + 4.3801041409192365e-14, + 4.869358757224555e-14, + 5.4128660149271814e-14, + 6.016605377082205e-14, + 6.687212004750979e-14, + 7.432048358348308e-14, + 8.259283592171901e-14, + 9.177981584194141e-14, + 1.0198198540864166e-13, + 1.1331091216252769e-13, + 1.2589036892328524e-13, + 1.398576639937446e-13, + 1.5536511588687964e-13, + 1.7258168823311764e-13, + 1.9169480222441916e-13, + 2.1291234584828487e-13, + 2.3646490116434e-13, + 2.626082133082081e-13, + 2.9162592736481603e-13, + 3.2383262205455877e-13, + 3.5957717244870004e-13, + 3.9924647723576855e-13, + 4.4326959000010484e-13, + 4.921222982549323e-13, + 5.463321985508466e-13, + 6.064843214479676e-13, + 6.732273656284436e-13, + 7.472806071114334e-13, + 8.294415565392417e-13, + 9.205944452181098e-13, + 1.0217196296786117e-12, + 1.1339040137485594e-12, + 1.258352598294643e-12, + 1.3964012800950405e-12, + 1.5495310350499162e-12, + 1.7193836349331273e-12, + 1.9077790634212926e-12, + 2.116734814607978e-12, + 2.3484872773295525e-12, + 2.605515430480731e-12, + 2.89056709812933e-12, + 3.2066880413341255e-12, + 3.557254192003984e-12, + 3.946007368037513e-12, + 4.377094845335798e-12, + 4.8551132016348834e-12, + 5.385156894312422e-12, + 5.972872080947711e-12, + 6.624516248645167e-12, + 7.347024278145016e-12, + 8.148081636265367e-12, + 9.036205463954647e-12, + 1.0020834412352083e-11, + 1.1112428167772977e-11, + 1.2322577710744187e-11, + 1.3664127463935143e-11, + 1.5151310611319577e-11, + 1.6799899005545728e-11, + 1.862736923604579e-11, + 2.0653086596046506e-11, + 2.289850887883764e-11, + 2.5387412135504218e-11, + 2.814614075939864e-11, + 3.120388451870495e-11, + 3.4592985431081245e-11, + 3.8349277703137395e-11, + 4.2512464281685176e-11, + 4.712653396765635e-11, + 5.2240223450200743e-11, + 5.790752909834653e-11, + 6.418827386619816e-11, + 7.114873523704636e-11, + 7.886234077652428e-11, + 8.741043857012146e-11, + 9.688315059668807e-11, + 1.0738031796629048e-10, + 1.1901254790079314e-10, + 1.31902373395855e-10, + 1.4618553769721732e-10, + 1.6201241700586906e-10, + 1.7954959628685348e-10, + 1.9898161463201682e-10, + 2.2051289844373985e-10, + 2.4436990259384585e-10, + 2.708034819693004e-10, + 3.000915181549048e-10, + 3.325418286705618e-10, + 3.6849538921236923e-10, + 4.0832990246541925e-10, + 4.524637508386528e-10, + 5.013603743440726e-10, + 5.555331193519176e-10, + 6.15550608909567e-10, + 6.820426905504001e-10, + 7.557070239204752e-10, + 8.373163767491391e-10, + 9.277267055539861e-10, + 1.0278861052927092e-09, + 1.1388447217042687e-09, + 1.2617657290121953e-09, + 1.3979374890275057e-09, + 1.5487870169712252e-09, + 1.7158948957813775e-09, + 1.901011794194832e-09, + 2.106076761027029e-09, + 2.3332374867125236e-09, + 2.5848727434187025e-09, + 2.8636172390306975e-09, + 3.1723891429427008e-09, + 3.5144205719826785e-09, + 3.893291355742793e-09, + 4.312966431346105e-09, + 4.777837261357431e-09, + 5.292767704923584e-09, + 5.863144822405445e-09, + 6.494935143854729e-09, + 7.194746990155307e-09, + 7.969899495185538e-09, + 8.828499055065246e-09, + 9.779523996877093e-09, + 1.083291835925769e-08, + 1.1999695755638882e-08, + 1.3292054418127431e-08, + 1.4723504611583962e-08, + 1.6309009759131587e-08, + 1.806514275347567e-08, + 2.0010259086366158e-08, + 2.2164688606873034e-08, + 2.4550947919007973e-08, + 2.7193975638112807e-08, + 3.012139296763353e-08, + 3.3363792328097186e-08, + 3.69550570524662e-08, + 4.093271550520508e-08, + 4.533833332855412e-08, + 5.021794792847444e-08, + 5.562254974517153e-08, + 6.16086153713466e-08, + 6.823869808703795e-08, + 7.558208200903046e-08, + 8.371550674238863e-08, + 9.27239700872032e-08, + 1.0270161727794774e-07, + 1.1375272606160527e-07, + 1.2599279796886107e-07, + 1.3954976724014928e-07, + 1.545653401240061e-07, + 1.7119647861076635e-07, + 1.8961704420368985e-07, + 2.100196190744138e-07, + 2.326175236583919e-07, + 2.5764705208571193e-07, + 2.8536994882069556e-07, + 3.160761527885237e-07, + 3.5008683775683886e-07, + 3.8775778113858647e-07, + 4.294830967510968e-07, + 4.7569937085503354e-07, + 5.268902452996588e-07, + 5.835914960442712e-07, + 6.463966608643807e-07, + 7.15963275735931e-07, + 7.930197858018539e-07, + 8.783732043125817e-07, + 9.729176003770103e-07, + 1.0776435058756021e-06, + 1.193648340846592e-06, + 1.3221479684635555e-06, + 1.4644895019568743e-06, + 1.622165499611662e-06, + 1.7968296990243992e-06, + 1.9903144575134054e-06, + 2.2046500848503207e-06, + 2.4420862739467723e-06, + 2.7051158578994228e-06, + 2.996501147056765e-06, + 3.319303126819705e-06, + 3.6769138283129817e-06, + 4.073092217957568e-06, + 4.512003989393679e-06, + 4.998265683956657e-06, + 5.536993612365334e-06, + 6.133858101066158e-06, + 6.79514364665158e-06, + 7.5278156218994075e-06, + 8.339594251638233e-06, + 9.239036652708987e-06, + 1.0235627819772067e-05, + 1.1339881537379673e-05, + 1.2563452303819705e-05, + 1.3919259474225397e-05, + 1.5421624960133615e-05, + 1.708642597125415e-05, + 1.89312644516321e-05, + 2.097565503427922e-05, + 2.3241233553821634e-05, + 2.5751988364627742e-05, + 2.8534516971934677e-05, + 3.1618310752277874e-05, + 3.503607084758401e-05, + 3.8824058653381176e-05, + 4.302248469889862e-05, + 4.7675940141190904e-05, + 5.2833875538866986e-05, + 5.8551132110401546e-05, + 6.488853123094102e-05, + 7.191352855833709e-05, + 7.970093989274038e-05, + 8.833374662162558e-05, + 9.790398950244759e-05, + 0.00010851376044203667, + 0.00012027630303410447, + 0.00013331723375758936, + 0.0001477758970353897, + 0.00016380686880643897, + 0.00018158162483570596, + 0.00020129039174568466, + 0.000223144200692276, + 0.0002473771657804924, + 0.0002742490116285423, + 0.0003040478771936133, + 0.0003370934257681944, + 0.0003737402943304431, + 0.00041438191890542464, + 0.00045945477643453503, + 0.0005094430880243006, + 0.0005648840330135163, + 0.0006263735284940241, + 0.0006945726347377733, + 0.0007702146527356956, + 0.0008541129876584518, + 0.0009471698586668864, + 0.0010503859439233182, + 0.0011648710591984656, + 0.001291855977068271, + 0.0014327055048729256, + 0.001588932951670671, + 0.0017622161250066945, + 0.0019544150148906496, + 0.0021675913324400264, + 0.00240403009231786, + 0.0026662634389739955, + 0.002957096938199332, + 0.0032796385753074576, + 0.0036373307188926843, + 0.004033985334146072, + 0.004473822750571543, + 0.004961514312867469, + 0.005502229272617426, + 0.006101686298631605, + 0.006766210016256411, + 0.007502793009578209, + 0.008319163751261795, + 0.009223860946980997, + 0.010226314815649257, + 0.011336935845706093, + 0.012567211591340688, + 0.013929812101586942, + 0.015438704577892506, + 0.017109277883683174, + 0.018958477518316655, + 0.021004951683106034, + 0.023269209039275148, + 0.02577378873696638, + 0.028543443275714887, + 0.031605334664377316, + 0.034989244307651005, + 0.03872779693731362, + 0.0428566987763711, + 0.047414989975507686, + 0.05244531117958108, + 0.05799418384477704, + 0.06411230366967967, + 0.07085484617627669, + 0.07828178312608912, + 0.08645820803400535, + 0.0954546685462149, + 0.10534750293826615, + 0.11621917739207384, + 0.12815862000268066, + 0.14126154682930317, + 0.15563077445606455, + 0.17137651272842297, + 0.18861663053854774, + 0.20747688653406773, + 0.228091115873626, + 0.2506013631939112, + 0.27515795126733084, + 0.30191947401179575, + 0.33105270208055976, + 0.3627323887440813, + 0.3971409639216797, + 0.4344681040573375, + 0.47491016655131574, + 0.51866947818174, + 0.5659534686645682, + 0.6169736427786171, + 0.6719443869832862, + 0.7310816102416404, + 0.7946012226278677, + 0.8627174600620916, + 0.9356410686377589, + 1.0135773674447712, + 1.0967242139810267, + 1.185269901565547, + 1.2793910214930397, + 1.3792503253780644, + 1.4849946226186737, + 1.5967527437441673, + 1.7146335921000053, + 1.838724291443616, + 1.969088415179554, + 2.105764252163272, + 2.2487630246352706, + 2.3980669235993157, + 2.5536267668301087, + 2.7153590172364552, + 2.8831418247388227, + 3.0568096802825058, + 3.2361462024782486, + 3.4208745262249556, + 3.610644743033699, + 3.8050178717966867, + 4.003445938980744, + 4.205247942853029, + 4.40958179324228, + 4.615412783949779, + 4.821479785915067, + 5.026261157990181, + 5.227943345169259, + 5.424396232126193, + 5.6131604567430955, + 5.7914529251505185, + 5.9561974920207685, + 6.104087887998922, + 6.231689114313475, + 6.335581245847812, + 6.412545424472275, + 6.459785380588629, + 6.475168882692048, + 6.4574622704902, + 6.406518543864962, + 6.323367249349089, + 6.210145920199497, + 6.069813087033252, + 5.905598650736421, + 5.720186731748717, + 5.51469672729354, + 5.2876344241017295, + 5.034121494938748, + 4.745855054718329, + 4.4123450356699205, + 4.023927777451924, + 3.576709726888326, + 3.0787705717239384, + 2.5555095290542282, + 2.050077438724366, + 1.613316059125245, + 1.279350320439092, + 1.0349506369160517, + 0.826959872322, + 0.635814004376, + 0.461976859908, + 0.3060264881, + 0.168325864635, + 0.0490088111742, + -0.0520272923129, + -0.135120212038, + -0.200831714605, + -0.249926400773, + -0.28334214026, + -0.302156257374, + -0.307554722095, + -0.300814771007, + -0.283313610796, + -0.256575376853, + -0.222362887767, + -0.182806552136, + -0.140536960749, + -0.0987481189302, + -0.0610696555973, + -0.0310871257921, + -0.0113744301495, + -0.00211433670391, + -4.20021332852e-05, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 5, + "j": 5, + "angular_momentum": 4 + } + ], + "atomic_wave_functions": [ + { + "label": "3S", + "angular_momentum": 0, + "occupation": 2.0, + "radial_function": [ + 0.0, + 4.37561810495e-06, + 8.82603129465e-06, + 1.33525180866e-05, + 1.79563788528e-05, + 2.26389361932e-05, + 2.74015353158e-05, + 3.2245544423e-05, + 3.71723551049e-05, + 4.21833827386e-05, + 4.72800668952e-05, + 5.24638717532e-05, + 5.77362865194e-05, + 6.30988258562e-05, + 6.85530303172e-05, + 7.41004667895e-05, + 7.97427289441e-05, + 8.54814376933e-05, + 9.13182416569e-05, + 9.72548176353e-05, + 0.000103292871092, + 0.000109434136641, + 0.000115680378551, + 0.000122033391244, + 0.000128494999818, + 0.000135067060568, + 0.000141751461518, + 0.000148550122968, + 0.000155464998041, + 0.000162498073245, + 0.000169651369046, + 0.000176926940448, + 0.00018432687758, + 0.0001918533063, + 0.000199508388805, + 0.00020729432425, + 0.000215213349383, + 0.000223267739186, + 0.000231459807529, + 0.000239791907831, + 0.000248266433744, + 0.000256885819833, + 0.00026565254228, + 0.000274569119592, + 0.000283638113328, + 0.000292862128833, + 0.000302243815986, + 0.000311785869962, + 0.000321491032006, + 0.000331362090222, + 0.000341401880371, + 0.000351613286687, + 0.000361999242708, + 0.000372562732115, + 0.000383306789591, + 0.000394234501692, + 0.000405349007736, + 0.000416653500701, + 0.000428151228145, + 0.000439845493139, + 0.000451739655214, + 0.000463837131329, + 0.00047614139685, + 0.000488655986548, + 0.000501384495618, + 0.000514330580709, + 0.000527497960973, + 0.000540890419139, + 0.000554511802593, + 0.000568366024488, + 0.000582457064867, + 0.000596788971803, + 0.00061136586257, + 0.000626191924815, + 0.000641271417771, + 0.000656608673473, + 0.000672208098008, + 0.000688074172778, + 0.000704211455787, + 0.00072062458295, + 0.00073731826943, + 0.000754297310985, + 0.000771566585349, + 0.000789131053637, + 0.000806995761762, + 0.000825165841894, + 0.000843646513925, + 0.000862443086975, + 0.000881560960916, + 0.000901005627921, + 0.000920782674043, + 0.000940897780822, + 0.000961356726913, + 0.000982165389747, + 0.00100332974722, + 0.00102485587942, + 0.00104674997035, + 0.00106901830972, + 0.00109166729477, + 0.00111470343207, + 0.00113813333942, + 0.00116196374774, + 0.00118620150299, + 0.00121085356818, + 0.0012359270253, + 0.00126142907744, + 0.00128736705078, + 0.00131374839674, + 0.00134058069411, + 0.00136787165123, + 0.00139562910819, + 0.00142386103911, + 0.0014525755544, + 0.0014817809031, + 0.00151148547526, + 0.00154169780434, + 0.00157242656967, + 0.00160368059894, + 0.0016354688707, + 0.00166780051703, + 0.00170068482604, + 0.00173413124466, + 0.00176814938126, + 0.00180274900847, + 0.00183794006593, + 0.00187373266323, + 0.00191013708271, + 0.00194716378251, + 0.00198482339949, + 0.00202312675237, + 0.00206208484475, + 0.00210170886835, + 0.00214201020615, + 0.00218300043574, + 0.00222469133256, + 0.00226709487337, + 0.00231022323961, + 0.00235408882095, + 0.00239870421883, + 0.00244408225007, + 0.0024902359506, + 0.00253717857912, + 0.00258492362099, + 0.00263348479205, + 0.00268287604259, + 0.00273311156134, + 0.00278420577953, + 0.00283617337509, + 0.00288902927681, + 0.00294278866865, + 0.00299746699408, + 0.00305307996056, + 0.00310964354401, + 0.00316717399342, + 0.00322568783549, + 0.00328520187941, + 0.00334573322167, + 0.00340729925097, + 0.00346991765319, + 0.00353360641653, + 0.00359838383662, + 0.00366426852178, + 0.0037312793984, + 0.00379943571632, + 0.00386875705441, + 0.00393926332616, + 0.0040109747854, + 0.00408391203213, + 0.00415809601841, + 0.00423354805441, + 0.00431028981449, + 0.00438834334346, + 0.00446773106287, + 0.00454847577748, + 0.00463060068179, + 0.0047141293667, + 0.00479908582629, + 0.00488549446469, + 0.00497338010311, + 0.00506276798693, + 0.00515368379299, + 0.00524615363692, + 0.00534020408065, + 0.00543586214005, + 0.00553315529266, + 0.00563211148558, + 0.0057327591435, + 0.00583512717683, + 0.00593924499005, + 0.00604514249008, + 0.00615285009491, + 0.00626239874231, + 0.0063738198987, + 0.00648714556819, + 0.00660240830175, + 0.00671964120656, + 0.00683887795548, + 0.00696015279674, + 0.00708350056375, + 0.00720895668509, + 0.00733655719466, + 0.00746633874202, + 0.00759833860291, + 0.00773259468993, + 0.0078691455634, + 0.00800803044243, + 0.00814928921613, + 0.0082929624551, + 0.00843909142301, + 0.00858771808845, + 0.00873888513694, + 0.00889263598317, + 0.00904901478345, + 0.00920806644833, + 0.00936983665552, + 0.0095343718629, + 0.00970171932187, + 0.00987192709091, + 0.0100450440493, + 0.010221119911, + 0.0104002052392, + 0.0105823514605, + 0.0107676108797, + 0.0109560366949, + 0.0111476830124, + 0.0113426048626, + 0.0115408582155, + 0.0117424999967, + 0.0119475881037, + 0.0121561814225, + 0.0123683398445, + 0.0125841242834, + 0.0128035966928, + 0.0130268200838, + 0.013253858543, + 0.013484777251, + 0.0137196425007, + 0.0139585217165, + 0.0142014834732, + 0.0144485975161, + 0.0146999347804, + 0.0149555674117, + 0.0152155687863, + 0.0154800135326, + 0.015748977552, + 0.0160225380405, + 0.0163007735108, + 0.0165837638149, + 0.0168715901663, + 0.0171643351635, + 0.0174620828135, + 0.0177649185556, + 0.0180729292854, + 0.0183862033802, + 0.0187048307233, + 0.0190289027302, + 0.019358512374, + 0.0196937542124, + 0.0200347244138, + 0.020381520785, + 0.0207342427991, + 0.0210929916231, + 0.021457870147, + 0.0218289830128, + 0.0222064366439, + 0.0225903392755, + 0.0229808009849, + 0.0233779337228, + 0.0237818513447, + 0.0241926696431, + 0.0246105063801, + 0.0250354813205, + 0.0254677162657, + 0.0259073350877, + 0.0263544637641, + 0.0268092304134, + 0.0272717653308, + 0.027742201025, + 0.0282206722552, + 0.0287073160685, + 0.0292022718389, + 0.0297056813055, + 0.0302176886124, + 0.0307384403489, + 0.0312680855903, + 0.0318067759391, + 0.0323546655677, + 0.0329119112603, + 0.0334786724572, + 0.0340551112986, + 0.0346413926692, + 0.035237684244, + 0.0358441565344, + 0.0364609829354, + 0.0370883397726, + 0.0377264063515, + 0.0383753650056, + 0.0390354011473, + 0.0397067033177, + 0.0403894632383, + 0.0410838758633, + 0.0417901394322, + 0.042508455524, + 0.0432390291109, + 0.0439820686144, + 0.044737785961, + 0.0455063966392, + 0.0462881197572, + 0.0470831781014, + 0.0478917981959, + 0.0487142103626, + 0.0495506487823, + 0.0504013515567, + 0.0512665607708, + 0.0521465225568, + 0.0530414871583, + 0.053951708996, + 0.0548774467333, + 0.0558189633436, + 0.0567765261782, + 0.0577504070348, + 0.0587408822274, + 0.0597482326564, + 0.06077274388, + 0.0618147061864, + 0.0628744146666, + 0.0639521692885, + 0.0650482749712, + 0.0661630416607, + 0.067296784406, + 0.0684498234363, + 0.0696224842387, + 0.0708150976372, + 0.0720279998717, + 0.0732615326782, + 0.0745160433699, + 0.0757918849186, + 0.0770894160368, + 0.0784090012611, + 0.079751011035, + 0.0811158217937, + 0.0825038160483, + 0.0839153824712, + 0.0853509159821, + 0.0868108178333, + 0.0882954956973, + 0.0898053637529, + 0.0913408427728, + 0.0929023602108, + 0.0944903502896, + 0.0961052540887, + 0.0977475196318, + 0.0994176019748, + 0.101115963294, + 0.102843072971, + 0.104599407686, + 0.106385451497, + 0.10820169593, + 0.110048640068, + 0.111926790628, + 0.113836662055, + 0.115778776595, + 0.117753664386, + 0.119761863536, + 0.121803920199, + 0.12388038866, + 0.125991831404, + 0.128138819196, + 0.130321931151, + 0.132541754803, + 0.134798886174, + 0.137093929839, + 0.139427498986, + 0.141800215473, + 0.144212709888, + 0.146665621594, + 0.149159598778, + 0.151695298495, + 0.154273386701, + 0.156894538289, + 0.159559437114, + 0.162268776013, + 0.165023256819, + 0.167823590371, + 0.170670496508, + 0.173564704066, + 0.176506950861, + 0.17949798366, + 0.182538558149, + 0.18562943889, + 0.188771399259, + 0.191965221383, + 0.19521169606, + 0.198511622666, + 0.201865809048, + 0.205275071403, + 0.208740234143, + 0.212262129741, + 0.215841598561, + 0.21947948867, + 0.22317665563, + 0.226933962267, + 0.230752278426, + 0.23463248069, + 0.238575452091, + 0.242582081779, + 0.246653264677, + 0.250789901098, + 0.254992896339, + 0.259263160239, + 0.263601606705, + 0.2680091532, + 0.272486720198, + 0.277035230599, + 0.281655609101, + 0.286348781527, + 0.291115674111, + 0.295957212734, + 0.30087432211, + 0.305867924913, + 0.310938940863, + 0.316088285737, + 0.321316870326, + 0.326625599334, + 0.332015370196, + 0.337487071837, + 0.343041583349, + 0.348679772597, + 0.354402494735, + 0.360210590649, + 0.366104885295, + 0.372086185959, + 0.378155280411, + 0.384312934955, + 0.390559892382, + 0.396896869802, + 0.403324556367, + 0.409843610864, + 0.416454659194, + 0.423158291711, + 0.42995506042, + 0.436845476049, + 0.443830004949, + 0.450909065864, + 0.45808302652, + 0.465352200061, + 0.472716841306, + 0.480177142832, + 0.487733230861, + 0.495385160971, + 0.503132913592, + 0.510976389311, + 0.518915403953, + 0.526949683455, + 0.535078858505, + 0.54330245896, + 0.551619908017, + 0.560030516145, + 0.56853347477, + 0.577127849698, + 0.585812574282, + 0.594586442326, + 0.603448100708, + 0.612396041741, + 0.621428595251, + 0.630543920372, + 0.639739997061, + 0.649014617332, + 0.658365376201, + 0.667789662355, + 0.677284648531, + 0.68684728163, + 0.696474272552, + 0.706162085768, + 0.715906928636, + 0.725704740478, + 0.735551181419, + 0.745441621016, + 0.755371126684, + 0.765334451956, + 0.775326024586, + 0.785339934533, + 0.795369921854, + 0.805409364546, + 0.815451266373, + 0.82548824473, + 0.835512518585, + 0.845515896565, + 0.855489765244, + 0.865425077696, + 0.875312342392, + 0.88514161253, + 0.894902475865, + 0.904584045156, + 0.914174949326, + 0.92366332544, + 0.933036811633, + 0.942282541107, + 0.951387137337, + 0.960336710639, + 0.969116856244, + 0.977712654051, + 0.986108670228, + 0.994288960844, + 1.00223707772, + 1.00993607672, + 1.01736852861, + 1.02451653285, + 1.03136173432, + 1.03788534345, + 1.04406815977, + 1.04989059921, + 1.05533272536, + 1.06037428494, + 1.06499474768, + 1.06917335076, + 1.07288914818, + 1.07612106505, + 1.07884795723, + 1.08104867618, + 1.08270213945, + 1.08378740674, + 1.0842837617, + 1.08417079949, + 1.0834285202, + 1.08203742796, + 1.07997863593, + 1.07723397678, + 1.0737861188, + 1.06961868729, + 1.06471639099, + 1.05906515345, + 1.05265224873, + 1.04546644136, + 1.03749812986, + 1.02873949355, + 1.01918464201, + 1.00882976654, + 0.99767329305, + 0.985716035549, + 0.97296134924, + 0.959415282283, + 0.945086724836, + 0.929987553855, + 0.914132771688, + 0.897540636093, + 0.880232778682, + 0.862234308095, + 0.843573893354, + 0.824283821846, + 0.804400025261, + 0.783962065679, + 0.763013072842, + 0.741599622728, + 0.719771547078, + 0.697581663776, + 0.675085419554, + 0.652340439795, + 0.629405986176, + 0.606342332097, + 0.583210079348, + 0.560069457665, + 0.536979671834, + 0.51399838763, + 0.491181474454, + 0.468583141491, + 0.446256600806, + 0.42425533906, + 0.402634935039, + 0.38145505003, + 0.360780624634, + 0.34068025329, + 0.321217887776, + 0.302433195401, + 0.284337084745, + 0.266934357821, + 0.250227298034, + 0.234215848852, + 0.218897655292, + 0.20426821009, + 0.190320979615, + 0.177047530922, + 0.164437661902, + 0.152479534458, + 0.141159809218, + 0.130463781633, + 0.120375518099, + 0.110877991915, + 0.101953217841, + 0.0935823850498, + 0.0857459873919, + 0.0784239507381, + 0.0715957564792, + 0.0652405609535, + 0.0593373100228, + 0.053864848589, + 0.0488020244144, + 0.0441277860716, + 0.0398212745236, + 0.0358619082134, + 0.032229461296, + 0.0289041349627, + 0.0258666216267, + 0.0230981620001, + 0.0205805949709, + 0.0182964004023, + 0.0162287348976, + 0.0143614607487, + 0.0126791682376, + 0.0111671916012, + 0.00981161893575, + 0.0085992964281, + 0.00751782727467, + 0.00655556572784, + 0.0057016066861, + 0.0049457712938, + 0.00427858899078, + 0.0036912764775, + 0.00317571403175, + 0.00272441961945, + 0.00233052120935, + 0.00198772769425, + 0.0016902987872, + 0.00143301424529, + 0.00121114273968, + 0.00102041066954, + 0.000856971185141, + 0.000717373661944, + 0.000598533836792, + 0.000497704793212, + 0.000412448954303, + 0.000340611217692, + 0.000280293340969, + 0.000229829663128, + 0.000187764224159, + 0.000152829324136, + 0.000123925542806, + 0.000100103222776, + 8.05454025846e-05, + 6.45521714861e-05, + 5.15264048167e-05, + 4.09608281075e-05, + 3.24263491024e-05, + 2.5561589874e-05, + 2.00635459634e-05, + 1.56792959807e-05, + 1.21986831211e-05, + 9.44788952787e-06, + 7.28382512781e-06, + 5.58925435829e-06, + 4.26858688737e-06, + 3.24426184625e-06, + 2.45365907161e-06, + 1.84647524402e-06, + 1.38250745894e-06, + 1.02979155709e-06, + 7.63047353524e-07, + 5.62387648572e-07, + 4.122524978e-07, + 3.0053460063e-07, + 2.17865790933e-07, + 1.57038444152e-07, + 1.12539133616e-07, + 8.01750636705e-08, + 5.67766784451e-08, + 3.99623993624e-08, + 2.79536949379e-08, + 1.94306504597e-08, + 1.34199035314e-08, + 9.20826692259e-09, + 6.27659640149e-09, + 4.24950207336e-09, + 2.8573704937e-09, + 1.90788368963e-09, + 1.26481094758e-09, + 8.32328849365e-10, + 5.43511725152e-10, + 3.51943674685e-10, + 2.25647886692e-10, + 1.42720538504e-10, + 8.82047006255e-11, + 5.18519463831e-11, + 2.65016813607e-11, + 6.86395494358e-12, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "label": "3P", + "angular_momentum": 1, + "occupation": 6.0, + "radial_function": [ + 0.0, + 5.69104713951e-12, + 2.31549734658e-11, + 5.29955875556e-11, + 9.58408995409e-11, + 1.52344013384e-10, + 2.23184050909e-10, + 3.09067108693e-10, + 4.10727248978e-10, + 5.28927525788e-10, + 6.64461047482e-10, + 8.18152077017e-10, + 9.90857171249e-10, + 1.18346636062e-09, + 1.39690437066e-09, + 1.63213188674e-09, + 1.89014686365e-09, + 2.17198588145e-09, + 2.47872554934e-09, + 2.81148395913e-09, + 3.17142219013e-09, + 3.55974586713e-09, + 3.97770677343e-09, + 4.42660452083e-09, + 4.90778827851e-09, + 5.42265856287e-09, + 5.97266909052e-09, + 6.55932869652e-09, + 7.18420332021e-09, + 7.84891806101e-09, + 8.55515930654e-09, + 9.3046769356e-09, + 1.00992865987e-08, + 1.09408720789e-08, + 1.18313877353e-08, + 1.27728610326e-08, + 1.37673951597e-08, + 1.481717174e-08, + 1.5924453637e-08, + 1.70915878579e-08, + 1.83210085602e-08, + 1.96152401623e-08, + 2.09769005642e-08, + 2.2408704481e-08, + 2.39134668927e-08, + 2.54941066151e-08, + 2.71536499962e-08, + 2.88952347415e-08, + 3.07221138732e-08, + 3.26376598283e-08, + 3.46453687002e-08, + 3.67488646277e-08, + 3.89519043388e-08, + 4.12583818526e-08, + 4.36723333452e-08, + 4.6197942187e-08, + 4.88395441543e-08, + 5.16016328242e-08, + 5.44888651572e-08, + 5.75060672751e-08, + 6.06582404405e-08, + 6.39505672449e-08, + 6.73884180126e-08, + 7.09773574281e-08, + 7.47231513949e-08, + 7.86317741334e-08, + 8.27094155255e-08, + 8.69624887167e-08, + 9.13976379814e-08, + 9.60217468639e-08, + 1.00841946602e-07, + 1.05865624843e-07, + 1.11100434668e-07, + 1.16554303924e-07, + 1.22235444882e-07, + 1.2815236424e-07, + 1.3431387346e-07, + 1.40729099475e-07, + 1.47407495768e-07, + 1.54358853827e-07, + 1.61593315015e-07, + 1.69121382834e-07, + 1.7695393563e-07, + 1.8510223973e-07, + 1.93577963047e-07, + 2.02393189143e-07, + 2.11560431793e-07, + 2.21092650049e-07, + 2.31003263828e-07, + 2.41306170047e-07, + 2.52015759308e-07, + 2.63146933171e-07, + 2.74715122024e-07, + 2.86736303575e-07, + 2.99227021981e-07, + 3.12204407647e-07, + 3.25686197711e-07, + 3.39690757235e-07, + 3.54237101138e-07, + 3.69344916887e-07, + 3.85034587972e-07, + 4.01327218204e-07, + 4.18244656845e-07, + 4.35809524619e-07, + 4.54045240618e-07, + 4.72976050148e-07, + 4.92627053532e-07, + 5.13024235919e-07, + 5.3419449812e-07, + 5.56165688524e-07, + 5.78966636102e-07, + 6.02627184575e-07, + 6.27178227748e-07, + 6.52651746085e-07, + 6.79080844534e-07, + 7.06499791679e-07, + 7.34944060237e-07, + 7.64450368961e-07, + 7.95056725997e-07, + 8.26802473737e-07, + 8.59728335234e-07, + 8.93876462214e-07, + 9.29290484756e-07, + 9.66015562694e-07, + 1.0040984388e-06, + 1.04358749378e-06, + 1.08453280325e-06, + 1.12698619656e-06, + 1.17100131781e-06, + 1.2166336888e-06, + 1.26394077434e-06, + 1.31298204967e-06, + 1.36381907031e-06, + 1.41651554429e-06, + 1.47113740684e-06, + 1.52775289778e-06, + 1.58643264143e-06, + 1.64724972944e-06, + 1.71027980634e-06, + 1.7756011582e-06, + 1.8432948042e-06, + 1.9134445915e-06, + 1.98613729332e-06, + 2.06146271039e-06, + 2.13951377601e-06, + 2.22038666464e-06, + 2.30418090425e-06, + 2.39099949267e-06, + 2.4809490178e-06, + 2.57413978209e-06, + 2.6706859313e-06, + 2.77070558765e-06, + 2.87432098768e-06, + 2.98165862478e-06, + 3.09284939669e-06, + 3.20802875809e-06, + 3.32733687847e-06, + 3.45091880543e-06, + 3.57892463369e-06, + 3.71150967982e-06, + 3.84883466314e-06, + 3.9910658928e-06, + 4.1383754613e-06, + 4.29094144478e-06, + 4.44894811015e-06, + 4.61258612941e-06, + 4.78205280137e-06, + 4.95755228106e-06, + 5.13929581698e-06, + 5.32750199663e-06, + 5.52239700052e-06, + 5.72421486486e-06, + 5.93319775343e-06, + 6.14959623879e-06, + 6.37366959321e-06, + 6.60568608963e-06, + 6.84592331305e-06, + 7.09466848265e-06, + 7.352218785e-06, + 7.61888171889e-06, + 7.8949754519e-06, + 8.18082918944e-06, + 8.47678355643e-06, + 8.78319099218e-06, + 9.10041615896e-06, + 9.42883636459e-06, + 9.76884199966e-06, + 1.01208369899e-05, + 1.0485239264e-05, + 1.08624812378e-05, + 1.1253010315e-05, + 1.16572894054e-05, + 1.20757974606e-05, + 1.25090300286e-05, + 1.29574998275e-05, + 1.34217373388e-05, + 1.39022914211e-05, + 1.43997299455e-05, + 1.49146404524e-05, + 1.5447630831e-05, + 1.59993300228e-05, + 1.65703887486e-05, + 1.71614802612e-05, + 1.77733011238e-05, + 1.84065720149e-05, + 1.90620385622e-05, + 1.97404722036e-05, + 2.04426710794e-05, + 2.11694609542e-05, + 2.19216961712e-05, + 2.27002606392e-05, + 2.35060688539e-05, + 2.43400669541e-05, + 2.52032338145e-05, + 2.60965821761e-05, + 2.70211598159e-05, + 2.79780507565e-05, + 2.89683765177e-05, + 2.99932974113e-05, + 3.10540138806e-05, + 3.21517678855e-05, + 3.32878443364e-05, + 3.44635725765e-05, + 3.56803279163e-05, + 3.69395332197e-05, + 3.82426605464e-05, + 3.95912328492e-05, + 4.09868257314e-05, + 4.24310692636e-05, + 4.39256498639e-05, + 4.54723122427e-05, + 4.70728614143e-05, + 4.87291647784e-05, + 5.04431542724e-05, + 5.22168285995e-05, + 5.40522555316e-05, + 5.59515742934e-05, + 5.79169980276e-05, + 5.99508163453e-05, + 6.20553979644e-05, + 6.42331934391e-05, + 6.64867379831e-05, + 6.88186543904e-05, + 7.12316560565e-05, + 7.37285501038e-05, + 7.6312240615e-05, + 7.89857319773e-05, + 8.17521323427e-05, + 8.46146572061e-05, + 8.75766331084e-05, + 9.0641501466e-05, + 9.38128225323e-05, + 9.70942794964e-05, + 0.000100489682722, + 0.000104002974133, + 0.000107638231749, + 0.00011139967438, + 0.000115291666479, + 0.000119318723164, + 0.000123485515409, + 0.000127796875423, + 0.000132257802204, + 0.000136873467288, + 0.0001416492207, + 0.0001465905971, + 0.000151703322153, + 0.000156993319104, + 0.000162466715597, + 0.000168129850708, + 0.000173989282238, + 0.000180051794246, + 0.000186324404844, + 0.000192814374264, + 0.000199529213194, + 0.00020647669141, + 0.000213664846696, + 0.000221101994079, + 0.000228796735375, + 0.000236757969065, + 0.000244994900515, + 0.000253517052535, + 0.000262334276316, + 0.000271456762734, + 0.000280895054038, + 0.000290660055954, + 0.000300763050187, + 0.000311215707367, + 0.000322030100428, + 0.000333218718454, + 0.000344794480998, + 0.000356770752887, + 0.000369161359546, + 0.000381980602833, + 0.00039524327743, + 0.000408964687788, + 0.000423160665654, + 0.000437847588203, + 0.000453042396783, + 0.000468762616311, + 0.000485026375326, + 0.000501852426728, + 0.000519260169238, + 0.000537269669573, + 0.000555901685399, + 0.000575177689055, + 0.000595119892092, + 0.000615751270657, + 0.00063709559173, + 0.000659177440269, + 0.00068202224728, + 0.000705656318838, + 0.000730106866103, + 0.00075540203636, + 0.000781570945115, + 0.000808643709284, + 0.000836651481514, + 0.000865626485669, + 0.00089560205353, + 0.000926612662732, + 0.000958693976002, + 0.000991882881724, + 0.00102621753588, + 0.00106173740542, + 0.00109848331308, + 0.00113649748379, + 0.00117582359254, + 0.00121650681396, + 0.00125859387354, + 0.0013021331006, + 0.00134717448303, + 0.00139376972387, + 0.00144197229983, + 0.00149183752176, + 0.00154342259717, + 0.00159678669486, + 0.00165199101165, + 0.00170909884151, + 0.0017681756468, + 0.00182928913211, + 0.00189250932041, + 0.00195790863184, + 0.00202556196508, + 0.0020955467815, + 0.00216794319205, + 0.00224283404705, + 0.00232030502907, + 0.0024004447487, + 0.00248334484371, + 0.00256910008135, + 0.00265780846408, + 0.00274957133881, + 0.00284449350971, + 0.00294268335477, + 0.00304425294616, + 0.00314931817454, + 0.00325799887749, + 0.00337041897205, + 0.00348670659169, + 0.00360699422764, + 0.00373141887491, + 0.00386012218292, + 0.00399325061115, + 0.00413095558968, + 0.004273393685, + 0.00442072677105, + 0.00457312220582, + 0.00473075301353, + 0.00489379807266, + 0.00506244230988, + 0.00523687690017, + 0.00541729947326, + 0.00560391432648, + 0.00579693264438, + 0.00599657272511, + 0.00620306021389, + 0.00641662834365, + 0.00663751818316, + 0.00686597889273, + 0.00710226798766, + 0.00734665160983, + 0.00759940480737, + 0.00786081182277, + 0.0081311663897, + 0.0084107720385, + 0.00869994241079, + 0.00899900158333, + 0.00930828440122, + 0.00962813682088, + 0.00995891626274, + 0.0103009919741, + 0.0106547454023, + 0.011020570578, + 0.0113988745095, + 0.011790077588, + 0.0121946140031, + 0.0126129321706, + 0.0130454951707, + 0.0134927811984, + 0.0139552840253, + 0.0144335134731, + 0.0149279958994, + 0.0154392746954, + 0.0159679107955, + 0.0165144831997, + 0.0170795895077, + 0.0176638464657, + 0.0182678905257, + 0.0188923784165, + 0.0195379877274, + 0.0202054175047, + 0.0208953888585, + 0.0216086455837, + 0.022345954791, + 0.0231081075501, + 0.023895919544, + 0.024710231734, + 0.0255519110355, + 0.0264218510032, + 0.0273209725262, + 0.0282502245312, + 0.0292105846945, + 0.030203060161, + 0.0312286882691, + 0.0322885372815, + 0.03338370712, + 0.0345153301033, + 0.0356845716865, + 0.0368926312006, + 0.0381407425903, + 0.039430175149, + 0.040762234248, + 0.0421382620579, + 0.0435596382608, + 0.0450277807494, + 0.0465441463114, + 0.0481102312943, + 0.0497275722503, + 0.0513977465544, + 0.0531223729939, + 0.0549031123249, + 0.0567416677901, + 0.058639785595, + 0.0605992553345, + 0.0626219103679, + 0.064709628132, + 0.0668643303899, + 0.0690879834054, + 0.0713825980371, + 0.0737502297441, + 0.0761929784941, + 0.0787129885653, + 0.0813124482325, + 0.0839935893264, + 0.0867586866555, + 0.0896100572789, + 0.0925500596174, + 0.0955810923891, + 0.0987055933568, + 0.101926037871, + 0.105244937192, + 0.108664836579, + 0.112188313122, + 0.115817973301, + 0.119556450258, + 0.123406400751, + 0.127370501774, + 0.131451446827, + 0.135651941801, + 0.139974700455, + 0.144422439467, + 0.148997873031, + 0.153703706958, + 0.158542632273, + 0.163517318262, + 0.168630404949, + 0.17388449496, + 0.179282144755, + 0.184825855185, + 0.19051806134, + 0.196361121663, + 0.202357306286, + 0.208508784555, + 0.214817611714, + 0.22128571471, + 0.22791487709, + 0.234706722943, + 0.241662699881, + 0.248784061, + 0.256071845824, + 0.263526860175, + 0.271149654978, + 0.278940503961, + 0.28689938025, + 0.295025931843, + 0.303319455965, + 0.311778872317, + 0.32040269521, + 0.329189004638, + 0.338135416292, + 0.347239050578, + 0.356496500692, + 0.365903799814, + 0.375456387516, + 0.385149075483, + 0.394976012666, + 0.404930650003, + 0.415005704884, + 0.425193125516, + 0.435484055432, + 0.44586879834, + 0.456336783598, + 0.466876532587, + 0.477475626307, + 0.488120674534, + 0.498797286922, + 0.509490046439, + 0.520182485589, + 0.530857065877, + 0.541495160998, + 0.552077044284, + 0.562581880933, + 0.572987725585, + 0.583271525826, + 0.593409132197, + 0.603375315309, + 0.613143790658, + 0.622687251723, + 0.631977411928, + 0.640985056032, + 0.649680101459, + 0.658031670097, + 0.666008170997, + 0.67357739443, + 0.680706617649, + 0.68736272272, + 0.69351232672, + 0.699121924564, + 0.704158044736, + 0.708587418173, + 0.712377160588, + 0.715494968556, + 0.717909329769, + 0.719589747972, + 0.720506983193, + 0.720633308051, + 0.719942781015, + 0.718411537619, + 0.716018100623, + 0.71274370998, + 0.708572673166, + 0.703492735696, + 0.697495470603, + 0.690576683917, + 0.682736830755, + 0.673981433305, + 0.66432148762, + 0.653773840702, + 0.642361512914, + 0.630113933585, + 0.617067050305, + 0.603263266058, + 0.588751154503, + 0.573584905087, + 0.55782345963, + 0.541529325187, + 0.524767089817, + 0.507601734089, + 0.490096926338, + 0.472313614345, + 0.454309370918, + 0.436139087202, + 0.417857670455, + 0.399525263582, + 0.381214923575, + 0.363021254744, + 0.345065472565, + 0.327486584998, + 0.310398773694, + 0.293838630788, + 0.277813927727, + 0.262330071802, + 0.247390933199, + 0.232998757058, + 0.21915421812, + 0.205856478828, + 0.193103251494, + 0.180890863356, + 0.169214325018, + 0.158067401201, + 0.14744268419, + 0.137331669013, + 0.12772483063, + 0.118611702262, + 0.109980955034, + 0.101820478153, + 0.0941174596834, + 0.0868584672166, + 0.0800295283991, + 0.0736162106626, + 0.067603700056, + 0.0619768785501, + 0.0567203996641, + 0.0518187618316, + 0.0472563793206, + 0.0430176501889, + 0.0390870210896, + 0.0354490484886, + 0.0320884561416, + 0.0289901884963, + 0.0261394599261, + 0.0235217995773, + 0.0211230918138, + 0.0189296121582, + 0.0169280587965, + 0.015105579652, + 0.0134497951673, + 0.0119488168882, + 0.0105912620428, + 0.00936626426975, + 0.00826348072257, + 0.00727309574182, + 0.00638582133427, + 0.0055928946703, + 0.00488607283979, + 0.00425762508431, + 0.00370032274163, + 0.00320742712135, + 0.00277267554211, + 0.00239026574796, + 0.00205483892834, + 0.00176146155608, + 0.00150560626047, + 0.00128313194292, + 0.00109026334109, + 0.000923570236695, + 0.000779946496126, + 0.000656589120298, + 0.000550977469881, + 0.000460852817354, + 0.000384198363725, + 0.000319219841502, + 0.00026432680996, + 0.000218114731852, + 0.000179347904577, + 0.000146943302424, + 0.000119955371041, + 9.75618003559e-05, + 7.90502884152e-05, + 6.3806295908e-05, + 5.13017798018e-05, + 4.10848844775e-05, + 3.27705601819e-05, + 2.60320714172e-05, + 2.05933521108e-05, + 1.62221599541e-05, + 1.27239791149e-05, + 9.93661850842e-06, + 7.72545184931e-06, + 5.97924568967e-06, + 4.60652243972e-06, + 3.53240685586e-06, + 2.69590653344e-06, + 2.04757944317e-06, + 1.54754438814e-06, + 1.16379332928e-06, + 8.70767738767e-07, + 6.48164409563e-07, + 4.79939406072e-07, + 3.53482025261e-07, + 2.58933701896e-07, + 1.88629698302e-07, + 1.36644140597e-07, + 9.84214808432e-08, + 7.04797674087e-08, + 5.01731897982e-08, + 3.55032311928e-08, + 2.49694181126e-08, + 1.74521120425e-08, + 1.21210551551e-08, + 8.36447486049e-09, + 5.73448910442e-09, + 3.90534486536e-09, + 2.64168996027e-09, + 1.77463335655e-09, + 1.1838079669e-09, + 7.84025766965e-10, + 5.15420352073e-10, + 3.36217855321e-10, + 2.17473316947e-10, + 1.39264683576e-10, + 8.79579439849e-11, + 5.42505849541e-11, + 3.17714870628e-11, + 1.6067228993e-11, + 3.83973173904e-12, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "label": "3D", + "angular_momentum": 2, + "occupation": 8.0, + "radial_function": [ + 0.0, + 7.09348146638e-18, + 5.82153610725e-17, + 2.01572244418e-16, + 4.90227292724e-16, + 9.82447277274e-16, + 1.74207119033e-15, + 2.83890165988e-15, + 4.34912048495e-15, + 6.35572968116e-15, + 8.94901950349e-15, + 1.22270649945e-14, + 1.62962526916e-14, + 2.12718392181e-14, + 2.72785435767e-14, + 3.44511750658e-14, + 4.2935298844e-14, + 5.28879412798e-14, + 6.44783373413e-14, + 7.78887224039e-14, + 9.33151709856e-14, + 1.10968485056e-13, + 1.31075134711e-13, + 1.53878254158e-13, + 1.79638696113e-13, + 2.08636147894e-13, + 2.41170312652e-13, + 2.77562159392e-13, + 3.18155245621e-13, + 3.63317116673e-13, + 4.13440785974e-13, + 4.6894630077e-13, + 5.3028239804e-13, + 5.97928255612e-13, + 6.72395343758e-13, + 7.54229382833e-13, + 8.44012412805e-13, + 9.4236498088e-13, + 1.04994845372e-12, + 1.16746746112e-12, + 1.29567247843e-12, + 1.43536255523e-12, + 1.58738819848e-12, + 1.75265441843e-12, + 1.93212394641e-12, + 2.12682063366e-12, + 2.33783304147e-12, + 2.56631823274e-12, + 2.81350577614e-12, + 3.08070197453e-12, + 3.36929432972e-12, + 3.68075625659e-12, + 4.01665206002e-12, + 4.37864218912e-12, + 4.76848878361e-12, + 5.18806152841e-12, + 5.63934383307e-12, + 6.12443935376e-12, + 6.64557887623e-12, + 7.20512757953e-12, + 7.80559270083e-12, + 8.44963162336e-12, + 9.14006041002e-12, + 9.87986280697e-12, + 1.06721997426e-11, + 1.15204193482e-11, + 1.24280675293e-11, + 1.33988991165e-11, + 1.44368896274e-11, + 1.55462476723e-11, + 1.67314280392e-11, + 1.79971454933e-11, + 1.93483893299e-11, + 2.07904387222e-11, + 2.23288789045e-11, + 2.39696182385e-11, + 2.57189062069e-11, + 2.75833523867e-11, + 2.95699464532e-11, + 3.16860792704e-11, + 3.39395651257e-11, + 3.63386651705e-11, + 3.88921121309e-11, + 4.16091363567e-11, + 4.44994932795e-11, + 4.75734923564e-11, + 5.0842027577e-11, + 5.43166096194e-11, + 5.800939974e-11, + 6.19332454933e-11, + 6.61017183758e-11, + 7.05291534988e-11, + 7.52306913974e-11, + 8.02223220894e-11, + 8.55209315038e-11, + 9.11443504054e-11, + 9.71114059479e-11, + 1.03441975995e-10, + 1.10157046358e-10, + 1.17278771103e-10, + 1.24830536092e-10, + 1.32837025927e-10, + 1.41324294488e-10, + 1.50319839233e-10, + 1.59852679494e-10, + 1.69953438939e-10, + 1.80654432463e-10, + 1.91989757712e-10, + 2.03995391495e-10, + 2.16709291353e-10, + 2.30171502544e-10, + 2.44424270733e-10, + 2.595121607e-10, + 2.75482181373e-10, + 2.9238391752e-10, + 3.10269668469e-10, + 3.29194594199e-10, + 3.49216869224e-10, + 3.70397844653e-10, + 3.92802218881e-10, + 4.1649821735e-10, + 4.41557781871e-10, + 4.68056770005e-10, + 4.96075165036e-10, + 5.25697297099e-10, + 5.57012076041e-10, + 5.9011323665e-10, + 6.25099596889e-10, + 6.62075329833e-10, + 7.01150250022e-10, + 7.42440114997e-10, + 7.86066942821e-10, + 8.32159346412e-10, + 8.80852885599e-10, + 9.32290437815e-10, + 9.86622588413e-10, + 1.04400804165e-09, + 1.10461405339e-09, + 1.16861688676e-09, + 1.23620229182e-09, + 1.30756601068e-09, + 1.38291430925e-09, + 1.46246453714e-09, + 1.54644571713e-09, + 1.63509916576e-09, + 1.72867914675e-09, + 1.82745355887e-09, + 1.93170466014e-09, + 2.04172983028e-09, + 2.15784237338e-09, + 2.28037236288e-09, + 2.40966753122e-09, + 2.54609420629e-09, + 2.69003829738e-09, + 2.84190633303e-09, + 3.00212655359e-09, + 3.1711500614e-09, + 3.34945203158e-09, + 3.53753298652e-09, + 3.73592013765e-09, + 3.94516879771e-09, + 4.16586386754e-09, + 4.39862140102e-09, + 4.64409025248e-09, + 4.90295381078e-09, + 5.17593182462e-09, + 5.46378232393e-09, + 5.76730364233e-09, + 6.08733654594e-09, + 6.42476647422e-09, + 6.78052589854e-09, + 7.15559680489e-09, + 7.55101330696e-09, + 7.96786439673e-09, + 8.40729683946e-09, + 8.87051822097e-09, + 9.3588001549e-09, + 9.87348165854e-09, + 1.0415972706e-08, + 1.0987757968e-08, + 1.15904007479e-08, + 1.22255471248e-08, + 1.28949303138e-08, + 1.36003752553e-08, + 1.43438034452e-08, + 1.51272380188e-08, + 1.59528091013e-08, + 1.68227594389e-08, + 1.7739450326e-08, + 1.87053678426e-08, + 1.97231294196e-08, + 2.0795490748e-08, + 2.19253530508e-08, + 2.31157707361e-08, + 2.43699594514e-08, + 2.56913045608e-08, + 2.70833700658e-08, + 2.85499079948e-08, + 3.00948682836e-08, + 3.17224091753e-08, + 3.34369081634e-08, + 3.52429735107e-08, + 3.71454563694e-08, + 3.91494635383e-08, + 4.12603708871e-08, + 4.34838374849e-08, + 4.5825820468e-08, + 4.82925906873e-08, + 5.0890749175e-08, + 5.36272444733e-08, + 5.65093908713e-08, + 5.95448875969e-08, + 6.27418390128e-08, + 6.61087758711e-08, + 6.965467768e-08, + 7.33889962415e-08, + 7.73216804218e-08, + 8.14632022175e-08, + 8.58245841872e-08, + 9.04174283178e-08, + 9.52539464023e-08, + 1.00346992007e-07, + 1.05710094112e-07, + 1.1135749251e-07, + 1.17304175063e-07, + 1.23565916898e-07, + 1.30159321665e-07, + 1.37101864946e-07, + 1.44411939934e-07, + 1.52108905509e-07, + 1.60213136819e-07, + 1.68746078516e-07, + 1.77730300765e-07, + 1.87189558196e-07, + 1.97148851924e-07, + 2.07634494826e-07, + 2.1867418022e-07, + 2.30297054143e-07, + 2.42533791401e-07, + 2.55416675604e-07, + 2.68979683373e-07, + 2.83258572961e-07, + 2.98290977501e-07, + 3.14116503123e-07, + 3.30776832212e-07, + 3.4831583205e-07, + 3.66779669146e-07, + 3.86216929531e-07, + 4.06678745351e-07, + 4.28218928066e-07, + 4.50894108611e-07, + 4.74763884887e-07, + 4.99890976948e-07, + 5.26341390303e-07, + 5.54184587748e-07, + 5.83493670176e-07, + 6.14345566828e-07, + 6.46821235485e-07, + 6.81005873122e-07, + 7.16989137553e-07, + 7.54865380666e-07, + 7.94733893829e-07, + 8.36699166115e-07, + 8.80871156021e-07, + 9.27365577359e-07, + 9.76304200095e-07, + 1.02781516688e-06, + 1.08203332612e-06, + 1.13910058244e-06, + 1.19916626541e-06, + 1.26238751757e-06, + 1.3289297027e-06, + 1.39896683537e-06, + 1.47268203293e-06, + 1.55026799111e-06, + 1.63192748446e-06, + 1.71787389279e-06, + 1.80833175528e-06, + 1.90353735332e-06, + 2.0037393239e-06, + 2.1091993049e-06, + 2.22019261417e-06, + 2.3370089639e-06, + 2.4599532124e-06, + 2.58934615501e-06, + 2.72552535628e-06, + 2.86884602562e-06, + 3.01968193854e-06, + 3.17842640601e-06, + 3.34549329436e-06, + 3.52131809833e-06, + 3.70635907013e-06, + 3.90109840738e-06, + 4.10604350293e-06, + 4.32172825992e-06, + 4.54871447534e-06, + 4.78759329579e-06, + 5.03898674907e-06, + 5.30354935558e-06, + 5.58196982384e-06, + 5.8749728342e-06, + 6.18332091566e-06, + 6.5078164204e-06, + 6.84930360125e-06, + 7.20867079735e-06, + 7.58685273371e-06, + 7.98483294057e-06, + 8.40364629877e-06, + 8.84438171768e-06, + 9.30818495262e-06, + 9.79626156897e-06, + 1.03098800607e-05, + 1.0850375131e-05, + 1.14191511442e-05, + 1.2017685757e-05, + 1.26475337384e-05, + 1.33103309893e-05, + 1.40077987706e-05, + 1.47417481512e-05, + 1.55140846882e-05, + 1.63268133493e-05, + 1.71820436926e-05, + 1.80819953146e-05, + 1.90290035823e-05, + 2.00255256628e-05, + 2.10741468666e-05, + 2.21775873204e-05, + 2.33387089868e-05, + 2.45605230488e-05, + 2.58461976775e-05, + 2.71990662039e-05, + 2.86226357144e-05, + 3.0120596093e-05, + 3.16968295331e-05, + 3.33554205421e-05, + 3.51006664664e-05, + 3.69370885611e-05, + 3.88694436351e-05, + 4.09027362992e-05, + 4.30422318498e-05, + 4.52934698198e-05, + 4.76622782326e-05, + 5.01547885935e-05, + 5.27774516588e-05, + 5.553705402e-05, + 5.84407355479e-05, + 6.14960077385e-05, + 6.47107730084e-05, + 6.80933449883e-05, + 7.16524698654e-05, + 7.53973488289e-05, + 7.9337661676e-05, + 8.34835916357e-05, + 8.78458514759e-05, + 9.24357109569e-05, + 9.72650257015e-05, + 0.000102346267554, + 0.000107692556504, + 0.000113317694257, + 0.000119236199529, + 0.000125463345165, + 0.00013201519716, + 0.000138908655696, + 0.000146161498277, + 0.000153792425091, + 0.000161821106692, + 0.000170268234136, + 0.000179155571687, + 0.000188506012219, + 0.00019834363546, + 0.00020869376922, + 0.000219583053746, + 0.000231039509371, + 0.00024309260761, + 0.000255773345899, + 0.00026911432613, + 0.000283149837201, + 0.000297915941759, + 0.00031345056736, + 0.000329793602266, + 0.000346986996094, + 0.000365074865586, + 0.000384103605723, + 0.000404122006473, + 0.000425181375441, + 0.000447335666707, + 0.000470641616173, + 0.000495158883719, + 0.000520950202516, + 0.000548081535843, + 0.000576622241773, + 0.000606645246104, + 0.000638227223951, + 0.000671448790407, + 0.000706394700704, + 0.000743154060356, + 0.000781820545729, + 0.000822492635567, + 0.000865273853974, + 0.00091027302541, + 0.000957604542256, + 0.00100738864556, + 0.00105975171953, + 0.00111482660054, + 0.00117275290111, + 0.0012336773498, + 0.00129775414755, + 0.00136514534135, + 0.00143602121593, + 0.00151056070434, + 0.00158895181832, + 0.00167139209919, + 0.00175808909032, + 0.00184926083205, + 0.00194513638011, + 0.00204595634842, + 0.00215197347749, + 0.0022634532294, + 0.00238067441047, + 0.00250392982291, + 0.00263352694641, + 0.00276978865116, + 0.00291305394333, + 0.00306367874447, + 0.00322203670607, + 0.00338852006065, + 0.00356354051079, + 0.00374753015747, + 0.00394094246921, + 0.00414425329347, + 0.00435796191173, + 0.00458259213978, + 0.00481869347473, + 0.00506684229033, + 0.00532764308187, + 0.00560172976247, + 0.00588976701199, + 0.00619245168023, + 0.00651051424563, + 0.00684472033111, + 0.00719587227813, + 0.00756481078046, + 0.00795241657862, + 0.00835961221627, + 0.00878736385936, + 0.00923668317888, + 0.00970862929797, + 0.0102043108037, + 0.0107248878239, + 0.011271574169, + 0.0118456395385, + 0.0124484117918, + 0.0130812792819, + 0.0137456932516, + 0.014443170289, + 0.0151752948417, + 0.015943721785, + 0.0167501790431, + 0.0175964702562, + 0.0184844774918, + 0.0194161639918, + 0.0203935769509, + 0.0214188503172, + 0.0224942076078, + 0.0236219647285, + 0.0248045327866, + 0.0260444208854, + 0.0273442388847, + 0.0287067001132, + 0.0301346240141, + 0.0316309387059, + 0.033198683435, + 0.0348410108985, + 0.0365611894103, + 0.0383626048806, + 0.0402487625799, + 0.0422232886516, + 0.0442899313357, + 0.0464525618643, + 0.0487151749838, + 0.0510818890564, + 0.0535569456899, + 0.0561447088404, + 0.0588496633277, + 0.0616764127017, + 0.0646296763901, + 0.067714286056, + 0.0709351810898, + 0.0742974031528, + 0.0778060896887, + 0.0814664663131, + 0.0852838379879, + 0.0892635788837, + 0.0934111208293, + 0.097731940246, + 0.102231543461, + 0.106915450291, + 0.111789175796, + 0.116858210082, + 0.122127996064, + 0.127603905072, + 0.133291210213, + 0.139195057392, + 0.145320433904, + 0.151672134541, + 0.158254725137, + 0.165072503507, + 0.172129457777, + 0.179429222069, + 0.186975029579, + 0.194769663097, + 0.202815403027, + 0.21111397304, + 0.219666483477, + 0.228473372706, + 0.237534346636, + 0.24684831665, + 0.256413336255, + 0.266226536767, + 0.276284062409, + 0.28658100521, + 0.297111340103, + 0.30786786066, + 0.318842115876, + 0.330024348416, + 0.341403434689, + 0.352966827093, + 0.36470049868, + 0.376588890417, + 0.38861486112, + 0.400759640006, + 0.413002781695, + 0.425322123357, + 0.437693743607, + 0.450091922659, + 0.462489103239, + 0.474855851855, + 0.4871608202, + 0.499370706863, + 0.511450220149, + 0.523362043693, + 0.535066807803, + 0.546523071116, + 0.557687319209, + 0.56851398934, + 0.578955533411, + 0.588962534484, + 0.598483895556, + 0.60746712244, + 0.615858725112, + 0.623604762992, + 0.630651558518, + 0.636946598834, + 0.642439636073, + 0.647083981077, + 0.650837961846, + 0.653666485394, + 0.65554259936, + 0.656448898814, + 0.656378567565, + 0.65533578939, + 0.653335225916, + 0.650400255202, + 0.646559728288, + 0.641843170397, + 0.636274677354, + 0.629866284335, + 0.622612342002, + 0.614487392151, + 0.605451019295, + 0.595463710419, + 0.584516889886, + 0.572676047542, + 0.560124586113, + 0.547171125277, + 0.534134847458, + 0.521127338402, + 0.508160317918, + 0.49524236312, + 0.482382389293, + 0.469589136303, + 0.456871168885, + 0.444236875554, + 0.431694467871, + 0.419251978165, + 0.406917257333, + 0.394697970984, + 0.382601595456, + 0.37063541215, + 0.358806501637, + 0.347121736175, + 0.335587772055, + 0.324211040601, + 0.312997739192, + 0.301953821353, + 0.291084987209, + 0.280396673522, + 0.26989404454, + 0.259581982992, + 0.249465082342, + 0.23954763971, + 0.22983365041, + 0.220326803506, + 0.21103047915, + 0.201947747056, + 0.193081366653, + 0.184433788217, + 0.176007155301, + 0.167803307737, + 0.159823785362, + 0.152069831747, + 0.144542397999, + 0.137242146002, + 0.130169451165, + 0.1233244042, + 0.116706812091, + 0.110316197967, + 0.104151800191, + 0.0982125705716, + 0.0924971721455, + 0.0870039766198, + 0.0817310619864, + 0.076676210514, + 0.0718369076271, + 0.067210341899, + 0.062793406595, + 0.058582702937, + 0.0545745453988, + 0.0507649691003, + 0.047149739455, + 0.0437243640241, + 0.0404841065804, + 0.0374240032282, + 0.0345388804631, + 0.0318233749328, + 0.0292719547011, + 0.0268789417278, + 0.0246385353183, + 0.0225448362415, + 0.0205918712532, + 0.0187736177375, + 0.0170840282111, + 0.0155170544329, + 0.0140666708956, + 0.012726897479, + 0.0114918210838, + 0.0103556160734, + 0.00931256338538, + 0.00835706819225, + 0.00748367601789, + 0.00668708723759, + 0.00596216991349, + 0.00530397093698, + 0.00470772547148, + 0.00416886470637, + 0.00368302195144, + 0.00324603711609, + 0.00285395963246, + 0.00250304989359, + 0.00218977928911, + 0.00191082892962, + 0.00166308715878, + 0.00144364595755, + 0.00124979634962, + 0.00107902291917, + 0.000928997553771, + 0.000797572524432, + 0.000682773013684, + 0.000582789199416, + 0.000495967998586, + 0.000420804569959, + 0.000355933669446, + 0.000300120945248, + 0.000252254253121, + 0.000211335064757, + 0.00017647003466, + 0.000146862783108, + 0.000121805945141, + 0.000100673528386, + 8.29136091713e-05, + 6.8041402978e-05, + 5.56327229153e-05, + 4.53178413907e-05, + 3.67757628415e-05, + 2.97289096427e-05, + 2.39382183629e-05, + 1.91986391688e-05, + 1.53350274048e-05, + 1.21984131812e-05, + 9.66263219197e-06, + 7.62129892335e-06, + 5.98510187253e-06, + 4.67939935036e-06, + 3.64209383465e-06, + 2.82176263941e-06, + 2.17602281488e-06, + 1.67010864876e-06, + 1.27564084996e-06, + 9.69567415196e-07, + 7.33257261159e-07, + 5.51728906508e-07, + 4.12997770319e-07, + 3.07526981048e-07, + 2.27767931092e-07, + 1.67778140102e-07, + 1.22905282612e-07, + 8.95274742022e-08, + 6.48410812847e-08, + 4.66884122625e-08, + 3.34186556895e-08, + 2.37763502156e-08, + 1.6812500615e-08, + 1.18141951341e-08, + 8.24923474571e-09, + 5.72285899602e-09, + 3.94415135662e-09, + 2.70013540546e-09, + 1.83593820163e-09, + 1.23970553299e-09, + 8.31211670792e-10, + 5.53320290317e-10, + 3.65629319161e-10, + 2.39775825947e-10, + 1.55992900522e-10, + 1.00603191079e-10, + 6.42072177457e-11, + 4.03821453466e-11, + 2.47511828095e-11, + 1.43174367836e-11, + 6.98053342035e-12, + 1.17056196562e-12, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "label": "4S", + "angular_momentum": 0, + "occupation": 0.0, + "radial_function": [ + 0.0, + 1.44533719549e-06, + 2.91538041315e-06, + 4.41055196791e-06, + 5.93128139358e-06, + 7.47800556623e-06, + 9.05116882973e-06, + 1.06512231234e-05, + 1.22786281117e-05, + 1.39338513166e-05, + 1.56173682517e-05, + 1.73296625585e-05, + 1.90712261461e-05, + 2.08425593318e-05, + 2.26441709854e-05, + 2.44765786747e-05, + 2.6340308815e-05, + 2.82358968197e-05, + 3.01638872543e-05, + 3.21248339931e-05, + 3.4119300378e-05, + 3.61478593802e-05, + 3.82110937653e-05, + 4.03095962605e-05, + 4.24439697246e-05, + 4.46148273215e-05, + 4.68227926964e-05, + 4.90685001546e-05, + 5.13525948441e-05, + 5.36757329409e-05, + 5.6038581837e-05, + 5.84418203329e-05, + 6.08861388321e-05, + 6.33722395395e-05, + 6.59008366633e-05, + 6.847265662e-05, + 7.1088438243e-05, + 7.37489329954e-05, + 7.6454905185e-05, + 7.92071321848e-05, + 8.20064046555e-05, + 8.48535267732e-05, + 8.77493164601e-05, + 9.06946056199e-05, + 9.36902403761e-05, + 9.67370813157e-05, + 9.98360037362e-05, + 0.000102987897897, + 0.000106193669275, + 0.000109454238825, + 0.000112770543244, + 0.000116143535241, + 0.00011957418381, + 0.000123063474509, + 0.000126612409741, + 0.000130222009045, + 0.000133893309387, + 0.000137627365459, + 0.000141425249981, + 0.000145288054009, + 0.000149216887251, + 0.00015321287838, + 0.000157277175366, + 0.0001614109458, + 0.00016561537723, + 0.000169891677507, + 0.000174241075124, + 0.000178664819576, + 0.000183164181716, + 0.000187740454119, + 0.000192394951456, + 0.00019712901087, + 0.000201943992359, + 0.000206841279171, + 0.000211822278194, + 0.000216888420369, + 0.000222041161095, + 0.000227281980648, + 0.000232612384608, + 0.00023803390429, + 0.000243548097185, + 0.000249156547405, + 0.000254860866143, + 0.000260662692131, + 0.000266563692111, + 0.000272565561318, + 0.000278670023962, + 0.000284878833727, + 0.000291193774273, + 0.000297616659749, + 0.000304149335312, + 0.000310793677662, + 0.000317551595575, + 0.000324425030457, + 0.000331415956896, + 0.000338526383234, + 0.000345758352143, + 0.000353113941209, + 0.000360595263531, + 0.000368204468329, + 0.000375943741559, + 0.000383815306542, + 0.000391821424603, + 0.00039996439572, + 0.000408246559185, + 0.000416670294275, + 0.000425238020938, + 0.000433952200485, + 0.000442815336299, + 0.000451829974554, + 0.000460998704943, + 0.000470324161429, + 0.000479809022995, + 0.000489456014415, + 0.000499267907039, + 0.000509247519587, + 0.000519397718959, + 0.000529721421059, + 0.000540221591632, + 0.000550901247116, + 0.000561763455508, + 0.000572811337246, + 0.000584048066105, + 0.000595476870108, + 0.000607101032453, + 0.000618923892459, + 0.000630948846521, + 0.000643179349087, + 0.00065561891365, + 0.000668271113759, + 0.000681139584043, + 0.000694228021256, + 0.000707540185337, + 0.000721079900493, + 0.000734851056294, + 0.000748857608794, + 0.000763103581662, + 0.000777593067341, + 0.000792330228224, + 0.000807319297846, + 0.000822564582102, + 0.000838070460485, + 0.00085384138734, + 0.000869881893145, + 0.000886196585813, + 0.000902790152012, + 0.000919667358516, + 0.000936833053568, + 0.000954292168276, + 0.000972049718027, + 0.00099011080393, + 0.00100848061428, + 0.00102716442603, + 0.00104616760635, + 0.00106549561411, + 0.00108515400151, + 0.00110514841561, + 0.0011254846, + 0.00114616839644, + 0.0011672057465, + 0.00118860269332, + 0.00121036538331, + 0.00123250006792, + 0.00125501310545, + 0.00127791096284, + 0.00130120021758, + 0.00132488755954, + 0.00134897979293, + 0.00137348383824, + 0.00139840673422, + 0.00142375563992, + 0.00144953783671, + 0.0014757607304, + 0.00150243185337, + 0.00152955886669, + 0.00155714956236, + 0.00158521186553, + 0.00161375383678, + 0.0016427836744, + 0.00167230971681, + 0.00170234044487, + 0.00173288448438, + 0.00176395060852, + 0.00179554774037, + 0.00182768495548, + 0.00186037148445, + 0.00189361671563, + 0.00192743019773, + 0.00196182164262, + 0.00199680092812, + 0.00203237810078, + 0.00206856337879, + 0.00210536715493, + 0.00214279999951, + 0.00218087266343, + 0.00221959608123, + 0.00225898137426, + 0.00229903985384, + 0.00233978302451, + 0.00238122258731, + 0.00242337044319, + 0.00246623869632, + 0.00250983965766, + 0.0025541858484, + 0.00259929000361, + 0.00264516507585, + 0.00269182423888, + 0.00273928089145, + 0.0027875486611, + 0.00283664140812, + 0.00288657322944, + 0.00293735846273, + 0.00298901169045, + 0.00304154774406, + 0.00309498170823, + 0.00314932892516, + 0.00320460499901, + 0.00326082580027, + 0.00331800747039, + 0.00337616642633, + 0.00343531936527, + 0.00349548326937, + 0.00355667541064, + 0.00361891335586, + 0.00368221497157, + 0.0037465984292, + 0.00381208221025, + 0.00387868511154, + 0.0039464262506, + 0.0040153250711, + 0.00408540134839, + 0.00415667519513, + 0.00422916706704, + 0.00430289776873, + 0.00437788845956, + 0.00445416065976, + 0.00453173625645, + 0.00461063750994, + 0.00469088706003, + 0.00477250793244, + 0.00485552354534, + 0.00493995771604, + 0.00502583466771, + 0.00511317903627, + 0.00520201587737, + 0.00529237067351, + 0.00538426934123, + 0.00547773823848, + 0.00557280417205, + 0.0056694944052, + 0.00576783666531, + 0.00586785915175, + 0.00596959054387, + 0.00607306000902, + 0.00617829721087, + 0.00628533231769, + 0.00639419601092, + 0.00650491949373, + 0.00661753449989, + 0.00673207330263, + 0.0068485687237, + 0.00696705414263, + 0.00708756350605, + 0.00721013133725, + 0.00733479274578, + 0.00746158343733, + 0.00759053972369, + 0.00772169853288, + 0.00785509741944, + 0.00799077457496, + 0.00812876883861, + 0.00826911970803, + 0.00841186735024, + 0.00855705261281, + 0.00870471703518, + 0.00885490286011, + 0.00900765304542, + 0.0091630112758, + 0.00932102197485, + 0.00948173031731, + 0.00964518224148, + 0.0098114244618, + 0.00998050448166, + 0.0101524706064, + 0.0103273719564, + 0.0105052584806, + 0.0106861809699, + 0.0108701910713, + 0.0110573413014, + 0.0112476850609, + 0.0114412766489, + 0.0116381712775, + 0.0118384250869, + 0.0120420951597, + 0.0122492395371, + 0.0124599172336, + 0.0126741882531, + 0.0128921136044, + 0.0131137553178, + 0.0133391764612, + 0.0135684411563, + 0.0138016145961, + 0.0140387630612, + 0.0142799539376, + 0.0145252557335, + 0.0147747380974, + 0.0150284718362, + 0.0152865289326, + 0.0155489825639, + 0.0158159071206, + 0.0160873782248, + 0.0163634727497, + 0.0166442688381, + 0.0169298459226, + 0.0172202847445, + 0.0175156673743, + 0.0178160772311, + 0.0181215991033, + 0.0184323191691, + 0.0187483250164, + 0.0190697056648, + 0.0193965515855, + 0.0197289547232, + 0.0200670085172, + 0.0204108079231, + 0.0207604494342, + 0.0211160311035, + 0.021477652566, + 0.0218454150603, + 0.0222194214511, + 0.0225997762516, + 0.0229865856458, + 0.0233799575113, + 0.0237800014416, + 0.024186828769, + 0.0246005525871, + 0.0250212877738, + 0.0254491510139, + 0.0258842608218, + 0.0263267375643, + 0.0267767034829, + 0.027234282717, + 0.0276996013257, + 0.0281727873104, + 0.0286539706371, + 0.029143283258, + 0.0296408591335, + 0.0301468342534, + 0.0306613466584, + 0.0311845364606, + 0.0317165458644, + 0.0322575191857, + 0.0328076028724, + 0.0333669455227, + 0.033935697904, + 0.0345140129702, + 0.0351020458796, + 0.0356999540104, + 0.0363078969768, + 0.0369260366435, + 0.0375545371393, + 0.0381935648698, + 0.038843288529, + 0.0395038791094, + 0.040175509911, + 0.040858356549, + 0.04155259696, + 0.0422584114057, + 0.0429759824766, + 0.043705495092, + 0.0444471364992, + 0.0452010962702, + 0.0459675662962, + 0.0467467407792, + 0.047538816222, + 0.0483439914146, + 0.0491624674177, + 0.049994447544, + 0.0508401373347, + 0.051699744534, + 0.0525734790589, + 0.0534615529652, + 0.0543641804096, + 0.055281577607, + 0.0562139627831, + 0.0571615561226, + 0.0581245797109, + 0.0591032574713, + 0.0600978150956, + 0.061108479969, + 0.0621354810873, + 0.0631790489685, + 0.0642394155557, + 0.0653168141127, + 0.0664114791117, + 0.067523646111, + 0.0686535516251, + 0.0698014329839, + 0.0709675281815, + 0.0721520757153, + 0.0733553144127, + 0.0745774832456, + 0.0758188211331, + 0.0770795667303, + 0.0783599582026, + 0.0796602329862, + 0.0809806275318, + 0.082321377033, + 0.0836827151366, + 0.0850648736351, + 0.0864680821398, + 0.0878925677345, + 0.0893385546071, + 0.0908062636599, + 0.0922959120959, + 0.0938077129814, + 0.0953418747818, + 0.0968986008722, + 0.0984780890174, + 0.100080530825, + 0.101706111163, + 0.103355007553, + 0.105027389518, + 0.106723417904, + 0.108443244159, + 0.110187009575, + 0.111954844487, + 0.113746867433, + 0.115563184261, + 0.117403887198, + 0.119269053867, + 0.121158746248, + 0.123073009592, + 0.125011871273, + 0.12697533959, + 0.128963402497, + 0.13097602628, + 0.133013154161, + 0.135074704835, + 0.137160570936, + 0.139270617431, + 0.141404679927, + 0.143562562913, + 0.145744037899, + 0.147948841485, + 0.150176673335, + 0.152427194048, + 0.154700022947, + 0.15699473576, + 0.159310862198, + 0.161647883426, + 0.164005229428, + 0.166382276253, + 0.168778343148, + 0.171192689571, + 0.173624512075, + 0.17607294107, + 0.178537037461, + 0.181015789138, + 0.183508107347, + 0.18601282291, + 0.188528682316, + 0.19105434366, + 0.193588372444, + 0.196129237228, + 0.198675305141, + 0.201224837236, + 0.203775983707, + 0.206326778952, + 0.208875136492, + 0.211418843755, + 0.213955556704, + 0.216482794346, + 0.21899793309, + 0.221498200994, + 0.223980671886, + 0.226442259372, + 0.228879710745, + 0.231289600804, + 0.233668325597, + 0.236012096096, + 0.238316931835, + 0.240578654514, + 0.242792881605, + 0.244955019971, + 0.247060259534, + 0.249103567018, + 0.251079679804, + 0.252983099915, + 0.254808088203, + 0.25654865875, + 0.258198573544, + 0.259751337481, + 0.261200193748, + 0.26253811964, + 0.263757822887, + 0.264851738548, + 0.265812026556, + 0.266630569985, + 0.267298974131, + 0.267808566489, + 0.268150397727, + 0.26831524375, + 0.268293608966, + 0.26807573086, + 0.267651585983, + 0.267010897499, + 0.266143144372, + 0.26503757237, + 0.263683206962, + 0.262068868291, + 0.260183188309, + 0.258014630245, + 0.255551510517, + 0.252782023225, + 0.249694267359, + 0.246276276837, + 0.242516053497, + 0.238401603156, + 0.23392097483, + 0.229062303208, + 0.22381385447, + 0.218164075488, + 0.212101646482, + 0.205615537147, + 0.198695066257, + 0.191329964745, + 0.183510442221, + 0.175227256865, + 0.166471788622, + 0.157236115586, + 0.147513093444, + 0.137296437829, + 0.126580809385, + 0.115361901346, + 0.103636529394, + 0.0914027235042, + 0.0786598215092, + 0.0654085640015, + 0.0516511901996, + 0.0373915343013, + 0.0226351217752, + 0.00738926492232, + -0.00833684311128, + -0.0245320368851, + -0.0411830910448, + -0.0582746381161, + -0.0757890936851, + -0.0937065914082, + -0.112004930837, + -0.130659541655, + -0.149643468556, + -0.168927381628, + -0.188479617609, + -0.208266257658, + -0.228251247148, + -0.248396562146, + -0.268662425443, + -0.289007571722, + -0.309389556437, + -0.329765095499, + -0.350090412923, + -0.370321560802, + -0.390414661346, + -0.410326005897, + -0.430011935264, + -0.449428427283, + -0.468530345743, + -0.48727038403, + -0.505597907549, + -0.523458226181, + -0.540793414546, + -0.557546804048, + -0.573673773502, + -0.589144601606, + -0.603932757294, + -0.618013068322, + -0.631361788609, + -0.643956602484, + -0.655776708517, + -0.666802879049, + -0.67701751586, + -0.686404702222, + -0.694950253533, + -0.702641763454, + -0.709468647702, + -0.715422182357, + -0.720495538785, + -0.724683812053, + -0.727984044945, + -0.730395244556, + -0.731918393689, + -0.732556454218, + -0.732314364818, + -0.731199030569, + -0.729219307026, + -0.726385976655, + -0.722711720454, + -0.718211083039, + -0.712900434143, + -0.706797925099, + -0.699923443231, + -0.69229856284, + -0.683946495435, + -0.674892037797, + -0.665161520049, + -0.654782751946, + -0.643784968923, + -0.632198775638, + -0.620056087824, + -0.607390069774, + -0.594235067647, + -0.580626535704, + -0.566600955372, + -0.552195744371, + -0.537449155911, + -0.522400165777, + -0.507088347796, + -0.491553736448, + -0.475836677911, + -0.459977669396, + -0.444017188924, + -0.427995516457, + -0.411952549214, + -0.395927612895, + -0.379959271999, + -0.364085141364, + -0.348341702128, + -0.332764124231, + -0.317386098332, + -0.302239678951, + -0.287355141145, + -0.272760852023, + -0.258483158728, + -0.244546293613, + -0.230972297535, + -0.217780961447, + -0.204989786554, + -0.192613962734, + -0.180666364941, + -0.169157566896, + -0.158095871367, + -0.147487356017, + -0.137335933843, + -0.12764342695, + -0.118409652485, + -0.109632519357, + -0.101308134426, + -0.0934309167585, + -0.0859937185642, + -0.078987951435, + -0.0724037165191, + -0.0662299372971, + -0.0604544936798, + -0.0550643561914, + -0.0500457190742, + -0.0453841312178, + -0.0410646239002, + -0.0370718344103, + -0.0333901247149, + -0.0300036944264, + -0.0268966874287, + -0.0240532916125, + -0.0214578312783, + -0.0190948518601, + -0.0169491967241, + -0.0150060758904, + -0.0132511266197, + -0.011670465894, + -0.0102507349024, + -0.00897913572042, + -0.00784346044136, + -0.00683211307892, + -0.00593412461789, + -0.00513916163456, + -0.00443752894857, + -0.00382016679777, + -0.00327864305415, + -0.00280514103093, + -0.00239244328095, + -0.00203391215858, + -0.00172346749894, + -0.00145556196598, + -0.0012251545676, + -0.00102768280622, + -0.000859033903389, + -0.000715515505149, + -0.000593826239383, + -0.000491026459328, + -0.000404509469058, + -0.000331973487905, + -0.000271394572158, + -0.000221000674566, + -0.000179246985707, + -0.000144792666716, + -0.000116479050518, + -9.33093589922e-05, + -7.44299565534e-05, + -5.91131367518e-05, + -4.67414176308e-05, + -3.6793303863e-05, + -2.88304589896e-05, + -2.24862193413e-05, + -1.74553722574e-05, + -1.3485114841e-05, + -1.03671054709e-05, + -7.93051837921e-06, + -6.03601153319e-06, + -4.57051956532e-06, + -3.44278630376e-06, + -2.57955531144e-06, + -1.92234149874e-06, + -1.42471210739e-06, + -1.05001096551e-06, + -7.69465706438e-07, + -5.60623469961e-07, + -4.06066334836e-07, + -2.92363258445e-07, + -2.09220550391e-07, + -1.4879779922e-07, + -1.05160684137e-07, + -7.38462311433e-08, + -5.15197560819e-08, + -3.57060194089e-08, + -2.45800067248e-08, + -1.68052597251e-08, + -1.14098431156e-08, + -7.69187462261e-09, + -5.14809922646e-09, + -3.42028731978e-09, + -2.2553111636e-09, + -1.47563487063e-09, + -9.57668177241e-10, + -6.16008986661e-10, + -3.9205682805e-10, + -2.45838817775e-10, + -1.50168222621e-10, + -8.64668711885e-11, + -4.17363676685e-11, + -6.26475485926e-12, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "label": "4P", + "angular_momentum": 1, + "occupation": 0.0, + "radial_function": [ + 0.0, + 7.26542190339e-13, + 2.95605794972e-12, + 6.7656319198e-12, + 1.22354384209e-11, + 1.94488553536e-11, + 2.84925821645e-11, + 3.9456762007e-11, + 5.24351082448e-11, + 6.75250354503e-11, + 8.48277950539e-11, + 1.04448615809e-10, + 1.26496849238e-10, + 1.51086120238e-10, + 1.78334483022e-10, + 2.08364582583e-10, + 2.41303821874e-10, + 2.77284534913e-10, + 3.16444165996e-10, + 3.58925455261e-10, + 4.048766308e-10, + 4.54451607562e-10, + 5.07810193284e-10, + 5.65118301676e-10, + 6.26548173147e-10, + 6.92278603301e-10, + 7.62495179494e-10, + 8.37390525727e-10, + 9.17164556167e-10, + 1.00202473759e-09, + 1.09218636108e-09, + 1.18787282326e-09, + 1.28931591744e-09, + 1.39675613498e-09, + 1.51044297729e-09, + 1.63063527873e-09, + 1.75760154094e-09, + 1.89162027877e-09, + 2.03298037855e-09, + 2.18198146875e-09, + 2.33893430374e-09, + 2.50416116102e-09, + 2.6779962523e-09, + 2.86078614911e-09, + 3.05289022317e-09, + 3.25468110234e-09, + 3.46654514246e-09, + 3.68888291569e-09, + 3.92210971602e-09, + 4.16665608242e-09, + 4.42296834028e-09, + 4.69150916184e-09, + 4.97275814619e-09, + 5.26721241953e-09, + 5.57538725645e-09, + 5.8978167229e-09, + 6.23505434161e-09, + 6.58767378077e-09, + 6.95626956679e-09, + 7.34145782186e-09, + 7.74387702737e-09, + 8.16418881384e-09, + 8.60307877855e-09, + 9.06125733158e-09, + 9.53946057143e-09, + 1.00384511912e-08, + 1.0559019416e-08, + 1.11019839741e-08, + 1.16681931001e-08, + 1.2258525575e-08, + 1.28738918015e-08, + 1.35152349163e-08, + 1.41835319424e-08, + 1.48797949807e-08, + 1.56050724429e-08, + 1.63604503279e-08, + 1.71470535426e-08, + 1.79660472679e-08, + 1.88186383731e-08, + 1.97060768793e-08, + 2.0629657473e-08, + 2.15907210737e-08, + 2.25906564544e-08, + 2.36309019199e-08, + 2.47129470421e-08, + 2.58383344571e-08, + 2.70086617234e-08, + 2.82255832452e-08, + 2.94908122629e-08, + 3.0806122912e-08, + 3.21733523542e-08, + 3.3594402982e-08, + 3.50712447e-08, + 3.6605917286e-08, + 3.82005328327e-08, + 3.98572782756e-08, + 4.1578418008e-08, + 4.33662965864e-08, + 4.52233415306e-08, + 4.71520662204e-08, + 4.91550728927e-08, + 5.1235055743e-08, + 5.33948041343e-08, + 5.56372059172e-08, + 5.79652508649e-08, + 6.03820342283e-08, + 6.28907604129e-08, + 6.54947467845e-08, + 6.8197427606e-08, + 7.10023581109e-08, + 7.39132187184e-08, + 7.69338193935e-08, + 8.00681041597e-08, + 8.33201557665e-08, + 8.669420052e-08, + 9.01946132797e-08, + 9.38259226294e-08, + 9.75928162263e-08, + 1.01500146336e-07, + 1.05552935559e-07, + 1.09756382756e-07, + 1.14115869177e-07, + 1.18636964803e-07, + 1.2332543491e-07, + 1.28187246857e-07, + 1.33228577108e-07, + 1.38455818504e-07, + 1.43875587774e-07, + 1.49494733323e-07, + 1.55320343274e-07, + 1.61359753795e-07, + 1.67620557716e-07, + 1.74110613443e-07, + 1.80838054175e-07, + 1.87811297446e-07, + 1.95039054999e-07, + 2.02530342992e-07, + 2.10294492567e-07, + 2.1834116078e-07, + 2.26680341908e-07, + 2.35322379149e-07, + 2.44277976728e-07, + 2.53558212419e-07, + 2.63174550501e-07, + 2.73138855159e-07, + 2.83463404359e-07, + 2.94160904185e-07, + 3.0524450369e-07, + 3.16727810247e-07, + 3.2862490544e-07, + 3.40950361497e-07, + 3.53719258293e-07, + 3.66947200946e-07, + 3.80650338016e-07, + 3.94845380331e-07, + 4.09549620469e-07, + 4.24780952913e-07, + 4.40557894894e-07, + 4.5689960797e-07, + 4.73825920331e-07, + 4.91357349895e-07, + 5.09515128186e-07, + 5.28321225041e-07, + 5.47798374182e-07, + 5.67970099652e-07, + 5.88860743179e-07, + 6.10495492483e-07, + 6.32900410553e-07, + 6.56102465944e-07, + 6.80129564118e-07, + 7.05010579863e-07, + 7.30775390841e-07, + 7.57454912283e-07, + 7.85081132894e-07, + 8.13687151988e-07, + 8.43307217912e-07, + 8.73976767792e-07, + 9.05732468659e-07, + 9.38612259985e-07, + 9.72655397695e-07, + 1.0079024997e-06, + 1.04439559298e-06, + 1.08217816235e-06, + 1.12129520082e-06, + 1.1617932618e-06, + 1.20372051299e-06, + 1.24712679225e-06, + 1.29206366531e-06, + 1.33858448548e-06, + 1.38674445552e-06, + 1.43660069146e-06, + 1.48821228885e-06, + 1.54164039107e-06, + 1.59694826019e-06, + 1.65420135014e-06, + 1.71346738248e-06, + 1.77481642474e-06, + 1.83832097152e-06, + 1.90405602832e-06, + 1.97209919832e-06, + 2.0425307721e-06, + 2.11543382053e-06, + 2.19089429077e-06, + 2.26900110568e-06, + 2.34984626658e-06, + 2.43352495961e-06, + 2.52013566573e-06, + 2.6097802745e-06, + 2.70256420186e-06, + 2.79859651185e-06, + 2.89799004267e-06, + 3.00086153696e-06, + 3.10733177667e-06, + 3.2175257225e-06, + 3.33157265824e-06, + 3.44960634001e-06, + 3.57176515067e-06, + 3.69819225957e-06, + 3.82903578783e-06, + 3.96444897923e-06, + 4.10459037708e-06, + 4.24962400718e-06, + 4.39971956703e-06, + 4.55505262164e-06, + 4.71580480601e-06, + 4.88216403467e-06, + 5.05432471838e-06, + 5.23248798835e-06, + 5.41686192812e-06, + 5.60766181354e-06, + 5.8051103609e-06, + 6.00943798372e-06, + 6.22088305829e-06, + 6.43969219845e-06, + 6.66612053977e-06, + 6.90043203357e-06, + 7.14289975106e-06, + 7.39380619793e-06, + 7.6534436398e-06, + 7.92211443889e-06, + 8.20013140229e-06, + 8.4878181422e-06, + 8.78550944857e-06, + 9.09355167466e-06, + 9.41230313575e-06, + 9.74213452168e-06, + 1.00834293236e-05, + 1.04365842752e-05, + 1.08020098096e-05, + 1.11801305314e-05, + 1.15713857055e-05, + 1.19762297622e-05, + 1.23951328202e-05, + 1.28285812275e-05, + 1.32770781205e-05, + 1.37411440027e-05, + 1.42213173434e-05, + 1.4718155197e-05, + 1.5232233843e-05, + 1.57641494485e-05, + 1.63145187541e-05, + 1.68839797818e-05, + 1.7473192569e-05, + 1.80828399264e-05, + 1.87136282225e-05, + 1.93662881954e-05, + 2.00415757916e-05, + 2.07402730348e-05, + 2.14631889231e-05, + 2.22111603585e-05, + 2.29850531075e-05, + 2.37857627944e-05, + 2.461421593e-05, + 2.54713709739e-05, + 2.63582194347e-05, + 2.72757870072e-05, + 2.82251347486e-05, + 2.9207360296e-05, + 3.02235991239e-05, + 3.12750258469e-05, + 3.23628555652e-05, + 3.34883452577e-05, + 3.46527952216e-05, + 3.58575505626e-05, + 3.7104002735e-05, + 3.8393591135e-05, + 3.97278047493e-05, + 4.11081838584e-05, + 4.25363218002e-05, + 4.40138667922e-05, + 4.55425238175e-05, + 4.71240565741e-05, + 4.87602894914e-05, + 5.04531098159e-05, + 5.22044697674e-05, + 5.40163887694e-05, + 5.58909557557e-05, + 5.7830331555e-05, + 5.98367513582e-05, + 6.1912527268e-05, + 6.40600509373e-05, + 6.62817962961e-05, + 6.85803223721e-05, + 7.0958276207e-05, + 7.34183958718e-05, + 7.59635135853e-05, + 7.85965589384e-05, + 8.13205622271e-05, + 8.41386579003e-05, + 8.70540881234e-05, + 9.00702064629e-05, + 9.31904816967e-05, + 9.64185017527e-05, + 9.97579777812e-05, + 0.000103212748365, + 0.000106786783872, + 0.000110484190953, + 0.000114309217198, + 0.00011826625594, + 0.000122359851225, + 0.000126594702957, + 0.000130975672201, + 0.000135507786677, + 0.000140196246435, + 0.000145046429715, + 0.000150063899016, + 0.000155254407354, + 0.000160623904739, + 0.000166178544865, + 0.000171924692026, + 0.000177868928258, + 0.000184018060727, + 0.000190379129352, + 0.00019695941469, + 0.000203766446082, + 0.000210808010064, + 0.000218092159059, + 0.00022562722036, + 0.000233421805406, + 0.000241484819358, + 0.000249825471004, + 0.000258453282974, + 0.0002673781023, + 0.000276610111321, + 0.000286159838932, + 0.000296038172221, + 0.00030625636846, + 0.000316826067507, + 0.000327759304591, + 0.000339068523526, + 0.000350766590336, + 0.000362866807328, + 0.000375382927613, + 0.000388329170087, + 0.000401720234895, + 0.000415571319384, + 0.000429898134556, + 0.00044471692205, + 0.000460044471649, + 0.00047589813934, + 0.000492295865936, + 0.000509256196276, + 0.000526798299023, + 0.000544941987069, + 0.000563707738564, + 0.000583116718593, + 0.000603190801507, + 0.000623952593933, + 0.000645425458467, + 0.00066763353809, + 0.000690601781293, + 0.000714355967955, + 0.00073892273598, + 0.000764329608699, + 0.000790605023079, + 0.00081777835873, + 0.000845879967742, + 0.000874941205365, + 0.000904994461546, + 0.000936073193336, + 0.000968211958191, + 0.00100144644817, + 0.00103581352506, + 0.00107135125642, + 0.00110809895257, + 0.00114609720455, + 0.00118538792302, + 0.00122601437815, + 0.00126802124049, + 0.00131145462282, + 0.001356362123, + 0.00140279286783, + 0.00145079755789, + 0.00150042851334, + 0.00155173972083, + 0.00160478688121, + 0.00165962745841, + 0.00171632072913, + 0.00177492783357, + 0.00183551182701, + 0.00189813773235, + 0.00196287259345, + 0.00202978552939, + 0.00209894778943, + 0.00217043280873, + 0.00224431626482, + 0.0023206761346, + 0.00239959275196, + 0.00248114886585, + 0.00256542969874, + 0.00265252300531, + 0.00274251913147, + 0.00283551107324, + 0.00293159453567, + 0.0030308679915, + 0.00313343273946, + 0.00323939296189, + 0.00334885578169, + 0.00346193131828, + 0.0035787327422, + 0.00369937632842, + 0.00382398150768, + 0.00395267091588, + 0.004085570441, + 0.00422280926723, + 0.00436451991593, + 0.00451083828295, + 0.0046619036719, + 0.00481785882279, + 0.00497884993551, + 0.00514502668766, + 0.00531654224587, + 0.00549355327014, + 0.00567621991028, + 0.00586470579374, + 0.00605917800395, + 0.00625980704813, + 0.00646676681369, + 0.00668023451202, + 0.00690039060861, + 0.00712741873807, + 0.00736150560287, + 0.00760284085425, + 0.0078516169537, + 0.00810802901349, + 0.00837227461422, + 0.00864455359768, + 0.00892506783284, + 0.00921402095282, + 0.00951161806038, + 0.00981806539953, + 0.0101335699906, + 0.0104583392254, + 0.0107925804207, + 0.0111365003247, + 0.011490304575, + 0.0118541971033, + 0.012228379483, + 0.0126130502157, + 0.0130084039521, + 0.0134146306424, + 0.0138319146115, + 0.014260433553, + 0.0147003574377, + 0.0151518473291, + 0.0156150541006, + 0.0160901170476, + 0.0165771623874, + 0.0170763016396, + 0.0175876298797, + 0.0181112238567, + 0.0186471399677, + 0.0191954120801, + 0.0197560491911, + 0.0203290329171, + 0.0209143148012, + 0.0215118134294, + 0.0221214113441, + 0.0227429517456, + 0.0233762349683, + 0.0240210147216, + 0.0246769940832, + 0.0253438212332, + 0.0260210849174, + 0.0267083096277, + 0.0274049504871, + 0.0281103878297, + 0.0288239214622, + 0.0295447645986, + 0.0302720374549, + 0.0310047604984, + 0.0317418473397, + 0.0324820972628, + 0.0332241873871, + 0.0339666644571, + 0.0347079362592, + 0.0354462626658, + 0.0361797463107, + 0.0369063229027, + 0.0376237511879, + 0.0383296025759, + 0.0390212504493, + 0.0396958591799, + 0.0403503728847, + 0.0409815039554, + 0.0415857214072, + 0.0421592390974, + 0.0426980038736, + 0.0431976837183, + 0.0436536559704, + 0.0440609957081, + 0.0444144643931, + 0.0447084988848, + 0.0449372009445, + 0.0450943273616, + 0.0451732808456, + 0.0451671018389, + 0.0450684614174, + 0.0448696554569, + 0.0445626002533, + 0.0441388297945, + 0.0435894948915, + 0.0429053643809, + 0.0420768286185, + 0.0410939054861, + 0.0399462491369, + 0.0386231617006, + 0.0371136081699, + 0.0354062346836, + 0.033489390413, + 0.0313511532511, + 0.0289793594935, + 0.0263616376899, + 0.0234854468364, + 0.0203381190717, + 0.0169069070402, + 0.0131790360854, + 0.00914176145492, + 0.0047824307172, + 8.85516303369e-05, + -0.00495213424691, + -0.0103515718445, + -0.0161213063314, + -0.0222723897948, + -0.0288152802162, + -0.0357597320186, + -0.0431146773883, + -0.0508880975439, + -0.0590868831793, + -0.0677166834707, + -0.0767817433861, + -0.0862847296045, + -0.0962265462452, + -0.106606142871, + -0.117420318959, + -0.128663531273, + -0.140327713338, + -0.152402119442, + -0.164873209159, + -0.177724591839, + -0.190937053415, + -0.204488689144, + -0.218355164314, + -0.232510118591, + -0.246925716201, + -0.261573320744, + -0.276424237293, + -0.291450413289, + -0.306624923838, + -0.3219219915, + -0.33731622114, + -0.352780700858, + -0.368283697528, + -0.383783982054, + -0.399225568868, + -0.414534190109, + -0.429621216451, + -0.44441020336, + -0.458864580184, + -0.47296204973, + -0.486680976075, + -0.499999986601, + -0.512898080931, + -0.525354675072, + -0.537349645822, + -0.548863377144, + -0.559876806231, + -0.57037147096, + -0.580329556351, + -0.589733941746, + -0.598568246288, + -0.606816874475, + -0.614465059456, + -0.621498905954, + -0.627905430681, + -0.633672602301, + -0.638789379091, + -0.643245746582, + -0.647032753602, + -0.650142549238, + -0.652568419362, + -0.654304825325, + -0.655347443594, + -0.655693208785, + -0.655340358783, + -0.654288484038, + -0.652538579331, + -0.650093099493, + -0.646956016804, + -0.643132880716, + -0.638630877005, + -0.633458886134, + -0.627627537367, + -0.621149257784, + -0.614038312428, + -0.606310834484, + -0.59798484186, + -0.589080239254, + -0.579618802731, + -0.569624146498, + -0.559121669919, + -0.548138485355, + -0.536703326062, + -0.52484643569, + -0.512599439718, + -0.499995201191, + -0.487067661963, + -0.473851672308, + -0.460382810641, + -0.446697196387, + -0.432831297926, + -0.41882173854, + -0.404705102222, + -0.390517741927, + -0.376295591895, + -0.362073986191, + -0.347887484761, + -0.333769708654, + -0.319753185397, + -0.305869205705, + -0.292147692174, + -0.278617080747, + -0.265304215314, + -0.252234255874, + -0.23943060038, + -0.226914820406, + -0.214706610534, + -0.202823751369, + -0.191282085888, + -0.180095508839, + -0.169275968735, + -0.158833481998, + -0.148776158666, + -0.139110239065, + -0.129840140774, + -0.120968515165, + -0.112496312741, + -0.104422856499, + -0.0967459224533, + -0.0894618264908, + -0.0825655166684, + -0.0760506700698, + -0.0699097933308, + -0.0641343259436, + -0.0587147454575, + -0.0536406737112, + -0.0489009832524, + -0.0444839031288, + -0.0403771232703, + -0.0365678967218, + -0.0330431390331, + -0.0297895241638, + -0.0267935763167, + -0.0240417571734, + -0.0215205480714, + -0.0192165267248, + -0.0171164381617, + -0.0152072596379, + -0.0134762594392, + -0.0119110488278, + -0.0104996281786, + -0.00923042653352, + -0.00809233482652, + -0.00707473294371, + -0.00616751081235, + -0.00536108376333, + -0.00464640245691, + -0.00401495770097, + -0.00345878052444, + -0.00297043789545, + -0.0025430244942, + -0.00217015096448, + -0.0018459290753, + -0.00156495422537, + -0.00132228571852, + -0.00111342522836, + -0.000934293855155, + -0.000781208158489, + -0.000650855526085, + -0.000540269212437, + -0.000446803352007, + -0.000368108220759, + -0.000302105987782, + -0.000246967166089, + -0.000201087939183, + -0.000163068508041, + -0.00013169257242, + -0.000105908031189, + -8.48089591791e-05, + -6.76188930184e-05, + -5.36754359255e-05, + -4.24161715109e-05, + -3.33658594144e-05, + -2.61248710875e-05, + -2.0358812157e-05, + -1.57892684769e-05, + -1.21856060466e-05, + -9.35775022736e-06, + -7.14986717185e-06, + -5.43486921775e-06, + -4.10966641551e-06, + -3.09108884776e-06, + -2.31240700467e-06, + -1.72038118982e-06, + -1.27277541325e-06, + -9.36276046871e-07, + -6.8476056373e-07, + -4.97866821627e-07, + -3.59818454257e-07, + -2.58466892898e-07, + -1.84515274858e-07, + -1.30893938937e-07, + -9.22613199154e-08, + -6.46078068507e-08, + -4.4943512206e-08, + -3.10539104886e-08, + -2.13099563978e-08, + -1.45216008375e-08, + -9.82561157373e-09, + -6.6003003743e-09, + -4.40118873478e-09, + -2.9128390682e-09, + -1.91306638988e-09, + -1.24655474841e-09, + -8.05558787157e-10, + -5.15897473842e-10, + -3.26865302494e-10, + -2.0401456323e-10, + -1.24016196139e-10, + -7.0998921795e-11, + -3.39060572405e-11, + -4.50183429482e-12, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + } + ], + "total_charge_density": [ + 0.0, + 1.59079271249e-10, + 6.472405191e-10, + 1.48136173213e-09, + 2.67899739411e-09, + 4.25840342536e-09, + 6.23856301177e-09, + 8.63921335243e-09, + 1.14808733581e-08, + 1.47848723337e-08, + 1.85733796797e-08, + 2.28694356469e-08, + 2.76969831831e-08, + 3.30809009081e-08, + 3.90470372581e-08, + 4.56222458389e-08, + 5.28344220311e-08, + 6.07125408907e-08, + 6.92866963903e-08, + 7.85881420475e-08, + 8.86493329901e-08, + 9.95039695059e-08, + 1.11187042131e-07, + 1.23734878332e-07, + 1.37185190827e-07, + 1.51577127624e-07, + 1.66951323812e-07, + 1.83349955179e-07, + 2.00816793729e-07, + 2.19397265137e-07, + 2.39138508241e-07, + 2.60089436623e-07, + 2.82300802349e-07, + 3.05825261966e-07, + 3.307174448e-07, + 3.57034023671e-07, + 3.84833788082e-07, + 4.14177719979e-07, + 4.45129072178e-07, + 4.77753449534e-07, + 5.12118892965e-07, + 5.48295966423e-07, + 5.86357846909e-07, + 6.26380417651e-07, + 6.68442364539e-07, + 7.12625275948e-07, + 7.59013746048e-07, + 8.07695481738e-07, + 8.5876141332e-07, + 9.12305809048e-07, + 9.68426393683e-07, + 1.0272244712e-06, + 1.08880505176e-06, + 1.1532769832e-06, + 1.22075308699e-06, + 1.29135029906e-06, + 1.36518981549e-06, + 1.44239724329e-06, + 1.52310275648e-06, + 1.60744125755e-06, + 1.69555254466e-06, + 1.78758148455e-06, + 1.88367819162e-06, + 1.98399821311e-06, + 2.08870272088e-06, + 2.19795870977e-06, + 2.31193920294e-06, + 2.43082346435e-06, + 2.5547972186e-06, + 2.68405287853e-06, + 2.81878978065e-06, + 2.95921442883e-06, + 3.10554074645e-06, + 3.25799033733e-06, + 3.41679275578e-06, + 3.582185786e-06, + 3.75441573121e-06, + 3.93373771292e-06, + 4.12041598048e-06, + 4.3147242315e-06, + 4.5169459434e-06, + 4.72737471644e-06, + 4.94631462874e-06, + 5.17408060359e-06, + 5.41099878956e-06, + 5.65740695383e-06, + 5.91365488916e-06, + 6.180104835e-06, + 6.45713191328e-06, + 6.74512457927e-06, + 7.04448508815e-06, + 7.35562997778e-06, + 7.67899056817e-06, + 8.01501347842e-06, + 8.36416116149e-06, + 8.72691245755e-06, + 9.10376316661e-06, + 9.49522664097e-06, + 9.90183439817e-06, + 1.03241367554e-05, + 1.07627034856e-05, + 1.12181244967e-05, + 1.16910105341e-05, + 1.21819939079e-05, + 1.26917292446e-05, + 1.32208942659e-05, + 1.37701905936e-05, + 1.43403445829e-05, + 1.49321081846e-05, + 1.55462598369e-05, + 1.61836053881e-05, + 1.68449790518e-05, + 1.75312443946e-05, + 1.82432953583e-05, + 1.89820573175e-05, + 1.97484881738e-05, + 2.05435794881e-05, + 2.13683576515e-05, + 2.22238850979e-05, + 2.31112615573e-05, + 2.40316253534e-05, + 2.49861547457e-05, + 2.59760693184e-05, + 2.70026314173e-05, + 2.80671476359e-05, + 2.91709703539e-05, + 3.03154993281e-05, + 3.15021833392e-05, + 3.27325218946e-05, + 3.4008066991e-05, + 3.53304249377e-05, + 3.67012582429e-05, + 3.81222875652e-05, + 3.95952937331e-05, + 4.11221198339e-05, + 4.27046733748e-05, + 4.43449285195e-05, + 4.60449284012e-05, + 4.78067875162e-05, + 4.96326942005e-05, + 5.15249131914e-05, + 5.3485788278e-05, + 5.55177450437e-05, + 5.76232937031e-05, + 5.98050320372e-05, + 6.20656484301e-05, + 6.44079250104e-05, + 6.68347409021e-05, + 6.93490755866e-05, + 7.19540123823e-05, + 7.46527420432e-05, + 7.74485664832e-05, + 8.03449026279e-05, + 8.33452864006e-05, + 8.64533768454e-05, + 8.96729603933e-05, + 9.30079552751e-05, + 9.64624160878e-05, + 0.000100040538518, + 0.000103746664227, + 0.000107585285912, + 0.000111561052531, + 0.000115678774714, + 0.000119943430367, + 0.000124360170458, + 0.000128934325012, + 0.000133671409307, + 0.000138577130291, + 0.000143657393214, + 0.000148918308492, + 0.000154366198808, + 0.00016000760646, + 0.00016584930096, + 0.000171898286895, + 0.000178161812065, + 0.000184647375896, + 0.000191362738145, + 0.00019831592791, + 0.000205515252945, + 0.000212969309301, + 0.000220686991299, + 0.000228677501847, + 0.000236950363112, + 0.000245515427565, + 0.000254382889402, + 0.000263563296364, + 0.00027306756196, + 0.000282906978123, + 0.000293093228286, + 0.000303638400925, + 0.000314555003563, + 0.000325855977258, + 0.000337554711591, + 0.000349665060176, + 0.000362201356696, + 0.000375178431503, + 0.000388611628789, + 0.000402516824343, + 0.000416910443928, + 0.000431809482293, + 0.000447231522839, + 0.000463194757961, + 0.000479718010099, + 0.000496820753514, + 0.000514523136813, + 0.000532846006251, + 0.000551810929845, + 0.000571440222317, + 0.00059175697089, + 0.00061278506199, + 0.000634549208859, + 0.000657074980122, + 0.00068038882935, + 0.000704518125632, + 0.000729491185207, + 0.000755337304195, + 0.000782086792446, + 0.00080977100857, + 0.000838422396167, + 0.000868074521315, + 0.000898762111348, + 0.000930521094979, + 0.000963388643798, + 0.000997403215219, + 0.00103260459689, + 0.00106903395267, + 0.00110673387015, + 0.00114574840982, + 0.00118612315602, + 0.00122790526951, + 0.00127114354198, + 0.00131588845233, + 0.00136219222504, + 0.00141010889041, + 0.00145969434695, + 0.00151100642594, + 0.00156410495818, + 0.00161905184308, + 0.00167591112011, + 0.00173474904274, + 0.00179563415491, + 0.00185863737019, + 0.00192383205361, + 0.00199129410637, + 0.00206110205345, + 0.00213333713426, + 0.00220808339644, + 0.00228542779286, + 0.00236546028199, + 0.00244827393178, + 0.00253396502705, + 0.0026226331807, + 0.00271438144865, + 0.00280931644884, + 0.00290754848431, + 0.00300919167055, + 0.00311436406723, + 0.00322318781452, + 0.00333578927411, + 0.00345229917509, + 0.00357285276494, + 0.00369758996565, + 0.00382665553532, + 0.00396019923535, + 0.00409837600334, + 0.0042413461321, + 0.00438927545473, + 0.00454233553621, + 0.00470070387155, + 0.00486456409087, + 0.00503410617153, + 0.00520952665765, + 0.00539102888718, + 0.00557882322692, + 0.00577312731564, + 0.00597416631561, + 0.00618217317289, + 0.00639738888662, + 0.00662006278768, + 0.006850452827, + 0.00708882587384, + 0.00733545802452, + 0.00759063492175, + 0.00785465208511, + 0.00812781525303, + 0.0084104407366, + 0.00870285578568, + 0.00900539896779, + 0.00931842056007, + 0.00964228295498, + 0.00997736108001, + 0.0103240428321, + 0.0106827295271, + 0.0110538363648, + 0.0114377929104, + 0.0118350435926, + 0.0122460482188, + 0.012671282509, + 0.0131112386471, + 0.0135664258529, + 0.014037370973, + 0.0145246190923, + 0.0150287341678, + 0.0155502996836, + 0.0160899193293, + 0.0166482177016, + 0.0172258410313, + 0.0178234579348, + 0.0184417601928, + 0.0190814635553, + 0.0197433085759, + 0.0204280614746, + 0.0211365150308, + 0.0218694895084, + 0.0226278336127, + 0.0234124254813, + 0.0242241737096, + 0.0250640184124, + 0.0259329323235, + 0.0268319219329, + 0.0277620286653, + 0.0287243300993, + 0.0297199412303, + 0.0307500157773, + 0.0318157475368, + 0.0329183717839, + 0.0340591667233, + 0.0352394549921, + 0.0364606052151, + 0.037724033616, + 0.0390312056859, + 0.0403836379108, + 0.0417828995605, + 0.0432306145421, + 0.0447284633189, + 0.0462781848977, + 0.0478815788881, + 0.0495405076346, + 0.0512568984255, + 0.053032745781, + 0.0548701138236, + 0.0567711387336, + 0.058738031293, + 0.0607730795213, + 0.0628786514062, + 0.0650571977334, + 0.0673112550181, + 0.0696434485435, + 0.0720564955093, + 0.0745532082944, + 0.0771364978389, + 0.0798093771482, + 0.0825749649269, + 0.0854364893434, + 0.0883972919343, + 0.0914608316502, + 0.0946306890516, + 0.0979105706581, + 0.101304313458, + 0.104815889587, + 0.108449411172, + 0.112209135365, + 0.116099469557, + 0.120124976786, + 0.124290381346, + 0.128600574611, + 0.133060621068, + 0.137675764579, + 0.142451434884, + 0.147393254334, + 0.152507044892, + 0.157798835392, + 0.163274869063, + 0.168941611357, + 0.174805758054, + 0.180874243684, + 0.18715425027, + 0.193653216399, + 0.20037884664, + 0.207339121324, + 0.214542306695, + 0.221996965449, + 0.22971196768, + 0.237696502244, + 0.245960088559, + 0.254512588859, + 0.263364220923, + 0.272525571286, + 0.282007608972, + 0.291821699743, + 0.301979620908, + 0.312493576702, + 0.323376214251, + 0.334640640167, + 0.34630043777, + 0.358369684984, + 0.370862972917, + 0.383795425161, + 0.397182717832, + 0.411041100376, + 0.425387417185, + 0.440239130022, + 0.455614341316, + 0.471531818338, + 0.488011018288, + 0.505072114338, + 0.522736022648, + 0.541024430392, + 0.559959824825, + 0.579565523429, + 0.599865705157, + 0.620885442817, + 0.642650736622, + 0.66518854894, + 0.688526840266, + 0.712694606454, + 0.737721917223, + 0.763639955973, + 0.79048106093, + 0.818278767623, + 0.847067852741, + 0.876884379348, + 0.90776574348, + 0.939750722128, + 0.972879522588, + 1.00719383318, + 1.0427368753, + 1.07955345681, + 1.11769002665, + 1.15719473071, + 1.19811746889, + 1.2405099531, + 1.28442576641, + 1.3299204229, + 1.37705142834, + 1.42587834138, + 1.47646283511, + 1.52886875878, + 1.58316219943, + 1.63941154315, + 1.6976875356, + 1.75806334154, + 1.8206146028, + 1.88541949438, + 1.95255877805, + 2.0221158529, + 2.0941768023, + 2.16883043632, + 2.24616832908, + 2.3262848499, + 2.40927718752, + 2.49524536609, + 2.58429225191, + 2.67652354955, + 2.77204778598, + 2.87097628112, + 2.97342310318, + 3.07950500691, + 3.18934135282, + 3.30305400523, + 3.42076720675, + 3.5426074268, + 3.6687031815, + 3.79918482193, + 3.93418428787, + 4.07383482359, + 4.21827065245, + 4.3676266064, + 4.52203770673, + 4.68163869199, + 4.84656348871, + 5.01694462083, + 5.19291255298, + 5.37459496323, + 5.56211594037, + 5.75559510107, + 5.95514662202, + 6.16087818227, + 6.37288981118, + 6.59127263747, + 6.81610753514, + 7.04746366245, + 7.28539689059, + 7.52994811919, + 7.78114147686, + 8.03898240544, + 8.30345562806, + 8.57452300221, + 8.8521212606, + 9.13615964415, + 9.42651743365, + 9.72304138853, + 10.0255431039, + 10.3337962995, + 10.6475340578, + 10.9664460309, + 11.2901756403, + 11.6183172972, + 11.9504136744, + 12.2859530673, + 12.624366883, + 12.9650273037, + 13.3072451738, + 13.6502681667, + 13.9932792888, + 14.3353957857, + 14.6756685188, + 15.0130818828, + 15.34655434, + 15.6749396478, + 15.997028858, + 16.3115531664, + 16.6171876915, + 16.9125562561, + 17.1962372436, + 17.4667705951, + 17.7226660023, + 17.9624123449, + 18.1844884053, + 18.3873748797, + 18.5695676854, + 18.7295925425, + 18.8660207823, + 18.9774863061, + 19.0627035792, + 19.1204865069, + 19.1497679876, + 19.1496198803, + 19.1192730529, + 19.0581370989, + 18.965819212, + 18.8421416038, + 18.6871567329, + 18.5011594931, + 18.2846954065, + 18.0385637908, + 17.7638148724, + 17.4617399368, + 17.1338539181, + 16.7818704209, + 16.4076701182, + 16.0132648694, + 15.600761733, + 15.1723331413, + 14.7302013102, + 14.2766452157, + 13.8140346554, + 13.3448832802, + 12.8718824854, + 12.3978159061, + 11.9251543404, + 11.4555305304, + 10.9902803705, + 10.5306353446, + 10.077728757, + 9.6325941682, + 9.19616480487, + 8.76927380962, + 8.3526552986, + 7.94694620129, + 7.55268873598, + 7.17033358609, + 6.80024353863, + 6.44269771873, + 6.0978961079, + 5.76596452242, + 5.44695967934, + 5.14087454251, + 4.8476435284, + 4.56714776819, + 4.29922000148, + 4.04364936076, + 3.80018577459, + 3.56854453738, + 3.34841126394, + 3.13944851636, + 2.94130350034, + 2.75361396023, + 2.57599935807, + 2.40807677913, + 2.24945834483, + 2.09975554914, + 1.9585813482, + 1.8255524666, + 1.70029139763, + 1.58242812363, + 1.47160155495, + 1.36746071642, + 1.26966568577, + 1.17788831422, + 1.09181273803, + 1.01113571092, + 0.935566768913, + 0.864828255902, + 0.798655222665, + 0.736795225005, + 0.679008033381, + 0.625065276454, + 0.574750029403, + 0.527856365654, + 0.484188880723, + 0.443562202832, + 0.405800496583, + 0.370736970507, + 0.338213392426, + 0.308079620117, + 0.280193149152, + 0.254418682715, + 0.230627723777, + 0.208698192398, + 0.188514067563, + 0.169965054929, + 0.152946279341, + 0.137358002574, + 0.123105364855, + 0.110098149976, + 0.0982505723562, + 0.0874810853183, + 0.0777122087184, + 0.0688703747126, + 0.0608857895416, + 0.0536923096813, + 0.0472273300409, + 0.0414316822527, + 0.0362495406729, + 0.0316283340601, + 0.0275186607038, + 0.0238742051509, + 0.020651654689, + 0.0178106141471, + 0.0153135177324, + 0.0131255370313, + 0.01121448453, + 0.00955071238911, + 0.00810700644188, + 0.00685847569391, + 0.00578243779623, + 0.0048583011804, + 0.00406744466827, + 0.00339309548815, + 0.00282020667615, + 0.00233533487157, + 0.00192651949271, + 0.00158316423957, + 0.0012959217949, + 0.00105658250746, + 0.000857967734673, + 0.000693828409654, + 0.000558749278345, + 0.0004480591354, + 0.000357747272197, + 0.000284386242745, + 0.0002250609536, + 0.000177303995239, + 0.000139037054908, + 0.0001085181858, + 8.42946544775e-05, + 6.51610474348e-05, + 5.01222881118e-05, + 3.83611965576e-05, + 2.92102143583e-05, + 2.21269162092e-05, + 1.66729354198e-05, + 1.24959424806e-05, + 9.31433239082e-06, + 6.90429661967e-06, + 5.08897829139e-06, + 3.72943351958e-06, + 2.71714692604e-06, + 1.96787456934e-06, + 1.41661219012e-06, + 1.01351039122e-06, + 7.20580756991e-07, + 5.0905772709e-07, + 3.57300114011e-07, + 2.49133408062e-07, + 1.72549430929e-07, + 1.18693515354e-07, + 8.10812804466e-08, + 5.49973365136e-08, + 3.70370626457e-08, + 2.47600004972e-08, + 1.64296550463e-08, + 1.08196545498e-08, + 7.07046499483e-09, + 4.58430667481e-09, + 2.94870215174e-09, + 1.88130464129e-09, + 1.19041034714e-09, + 7.46931733411e-10, + 4.64673607067e-10, + 2.86571573169e-10, + 1.751742371e-10, + 1.06118786579e-10, + 6.36987590921e-11, + 3.78806046738e-11, + 2.23141045719e-11, + 1.30180774313e-11, + 7.5204882468e-12, + 4.30132995482e-12, + 2.43523844108e-12, + 1.36453735085e-12, + 7.56582799453e-13, + 4.15025869183e-13, + 2.25196048321e-13, + 1.20845675437e-13, + 6.41213530688e-14, + 3.36349286612e-14, + 1.74384637972e-14, + 8.93445293829e-15, + 4.52251891681e-15, + 2.26128155554e-15, + 1.11660172251e-15, + 5.44399024846e-16, + 2.62008936939e-16, + 1.24450647102e-16, + 5.83258532762e-17, + 2.69653543123e-17, + 1.229495923e-17, + 5.52730307573e-18, + 2.44930690116e-18, + 1.0694784585e-18, + 4.59939602163e-19, + 1.94670292167e-19, + 8.09680214587e-20, + 3.29805365284e-20, + 1.30457421106e-20, + 4.90096870738e-21, + 1.63991207001e-21, + 3.89822798812e-22, + 1.09617232019e-23, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + } +} \ No newline at end of file diff --git a/verification/test25/O.json b/verification/test25/O.json new file mode 100644 index 000000000..ddf74f0b9 --- /dev/null +++ b/verification/test25/O.json @@ -0,0 +1,23455 @@ +{ + "pseudo_potential": { + "header": { + "element": "O", + "pseudo_type": "US", + "core_correction": true, + "z_valence": 6.0, + "l_max": 2, + "mesh_size": 737, + "number_of_wfc": 2, + "number_of_proj": 5, + "original_upf_file": "o_pbe_v1.2.uspp.F.UPF" + }, + "radial_grid": [ + 0.0, + 5.29635113499e-06, + 1.0683236001e-05, + 1.61622021457e-05, + 2.17348235702e-05, + 2.74027011807e-05, + 3.31674632488e-05, + 3.90307658791e-05, + 4.49942934849e-05, + 5.10597592724e-05, + 5.72289057325e-05, + 6.35035051415e-05, + 6.98853600706e-05, + 7.6376303903e-05, + 8.29782013614e-05, + 8.96929490432e-05, + 9.65224759654e-05, + 0.000103468744119, + 0.000110533749032, + 0.000117719520345, + 0.000125028122389, + 0.000132461654785, + 0.000140022253043, + 0.000147712089177, + 0.000155533372328, + 0.000163488349398, + 0.0001715793057, + 0.000179808565607, + 0.000188178493228, + 0.00019669149308, + 0.000205350010784, + 0.000214156533764, + 0.000223113591964, + 0.000232223758573, + 0.000241489650766, + 0.000250913930455, + 0.000260499305052, + 0.000270248528251, + 0.000280164400814, + 0.000290249771379, + 0.00030050753728, + 0.000310940645372, + 0.000321552092887, + 0.000332344928287, + 0.000343322252146, + 0.000354487218036, + 0.000365843033437, + 0.000377392960653, + 0.000389140317755, + 0.000401088479533, + 0.000413240878461, + 0.000425601005689, + 0.000438172412041, + 0.000450958709041, + 0.000463963569943, + 0.000477190730792, + 0.000490643991496, + 0.000504327216916, + 0.000518244337978, + 0.000532399352802, + 0.00054679632785, + 0.000561439399093, + 0.000576332773203, + 0.000591480728758, + 0.000606887617473, + 0.000622557865448, + 0.000638495974442, + 0.000654706523167, + 0.000671194168598, + 0.000687963647318, + 0.000705019776872, + 0.000722367457158, + 0.000740011671827, + 0.000757957489721, + 0.000776210066327, + 0.000794774645257, + 0.000813656559754, + 0.000832861234228, + 0.00085239418581, + 0.000872261025938, + 0.000892467461973, + 0.00091301929883, + 0.000933922440657, + 0.00095518289252, + 0.000976806762136, + 0.000998800261625, + 0.00102116970929, + 0.00104392153145, + 0.00106706226425, + 0.00109059855559, + 0.00111453716698, + 0.00113888497552, + 0.00116364897587, + 0.00118883628224, + 0.00121445413047, + 0.00124050988005, + 0.00126701101631, + 0.00129396515252, + 0.00132138003206, + 0.0013492635307, + 0.00137762365885, + 0.0014064685638, + 0.00143580653215, + 0.00146564599212, + 0.00149599551601, + 0.00152686382266, + 0.00155825977993, + 0.00159019240728, + 0.00162267087832, + 0.0016557045235, + 0.00168930283274, + 0.00172347545819, + 0.00175823221697, + 0.00179358309404, + 0.00182953824502, + 0.00186610799913, + 0.00190330286214, + 0.00194113351943, + 0.00197961083901, + 0.00201874587466, + 0.00205854986914, + 0.00209903425735, + 0.00214021066967, + 0.0021820909353, + 0.00222468708561, + 0.00226801135767, + 0.0023120761977, + 0.00235689426467, + 0.00240247843395, + 0.00244884180098, + 0.00249599768506, + 0.00254395963318, + 0.00259274142386, + 0.00264235707117, + 0.00269282082872, + 0.00274414719379, + 0.00279635091143, + 0.00284944697877, + 0.00290345064928, + 0.00295837743717, + 0.00301424312185, + 0.00307106375243, + 0.00312885565239, + 0.00318763542423, + 0.00324741995424, + 0.00330822641735, + 0.00337007228208, + 0.00343297531556, + 0.00349695358861, + 0.00356202548094, + 0.00362820968646, + 0.00369552521861, + 0.00376399141583, + 0.00383362794714, + 0.00390445481777, + 0.00397649237491, + 0.00404976131354, + 0.00412428268243, + 0.00420007789012, + 0.0042771687111, + 0.00435557729208, + 0.00443532615832, + 0.00451643822013, + 0.00459893677943, + 0.00468284553647, + 0.00476818859661, + 0.00485499047726, + 0.00494327611491, + 0.00503307087233, + 0.0051244005458, + 0.00521729137258, + 0.00531177003841, + 0.00540786368517, + 0.00550559991872, + 0.00560500681678, + 0.00570611293702, + 0.00580894732528, + 0.0059135395239, + 0.00601991958018, + 0.00612811805506, + 0.00623816603186, + 0.00635009512524, + 0.00646393749026, + 0.00657972583163, + 0.0066974934131, + 0.00681727406702, + 0.00693910220405, + 0.00706301282306, + 0.00718904152117, + 0.00731722450399, + 0.007447598596, + 0.00758020125116, + 0.00771507056366, + 0.00785224527882, + 0.0079917648043, + 0.00813366922135, + 0.00827799929636, + 0.00842479649258, + 0.00857410298199, + 0.00872596165747, + 0.00888041614507, + 0.00903751081658, + 0.00919729080225, + 0.00935980200378, + 0.00952509110751, + 0.00969320559778, + 0.00986419377064, + 0.0100381047477, + 0.0102149884902, + 0.0103948958134, + 0.0105778784012, + 0.0107639888209, + 0.0109532805386, + 0.011145807934, + 0.0113416263165, + 0.011540791941, + 0.0117433620239, + 0.0119493947596, + 0.0121589493374, + 0.0123720859583, + 0.0125888658522, + 0.0128093512959, + 0.0130336056306, + 0.0132616932801, + 0.0134936797696, + 0.0137296317445, + 0.013969616989, + 0.0142137044464, + 0.0144619642382, + 0.0147144676847, + 0.0149712873252, + 0.015232496939, + 0.0154981715666, + 0.0157683875312, + 0.0160432224606, + 0.0163227553096, + 0.0166070663825, + 0.0168962373564, + 0.0171903513045, + 0.0174894927201, + 0.0177937475407, + 0.0181032031729, + 0.0184179485172, + 0.0187380739939, + 0.0190636715688, + 0.0193948347799, + 0.0197316587639, + 0.0200742402838, + 0.0204226777567, + 0.020777071282, + 0.0211375226699, + 0.0215041354713, + 0.0218770150068, + 0.0222562683976, + 0.0226420045959, + 0.0230343344161, + 0.023433370567, + 0.0238392276841, + 0.0242520223621, + 0.0246718731891, + 0.02509890078, + 0.0255332278116, + 0.0259749790577, + 0.0264242814248, + 0.0268812639888, + 0.0273460580319, + 0.0278187970806, + 0.0282996169435, + 0.028788655751, + 0.0292860539943, + 0.0297919545665, + 0.0303065028029, + 0.0308298465233, + 0.0313621360742, + 0.0319035243721, + 0.0324541669474, + 0.033014221989, + 0.0335838503899, + 0.0341632157934, + 0.0347524846399, + 0.0353518262149, + 0.0359614126977, + 0.0365814192106, + 0.0372120238697, + 0.0378534078352, + 0.0385057553646, + 0.0391692538645, + 0.0398440939453, + 0.0405304694755, + 0.0412285776375, + 0.0419386189841, + 0.0426607974967, + 0.0433953206431, + 0.0441423994375, + 0.0449022485013, + 0.0456750861243, + 0.046461134328, + 0.0472606189287, + 0.0480737696029, + 0.0489008199529, + 0.0497420075745, + 0.0505975741245, + 0.0514677653907, + 0.052352831362, + 0.053253026301, + 0.0541686088161, + 0.0550998419365, + 0.0560469931874, + 0.0570103346672, + 0.057990143125, + 0.0589867000411, + 0.0600002917068, + 0.0610312093074, + 0.0620797490057, + 0.0631462120267, + 0.0642309047447, + 0.065334138771, + 0.0664562310432, + 0.0675975039168, + 0.0687582852574, + 0.069938908535, + 0.0711397129198, + 0.0723610433798, + 0.0736032507795, + 0.074866691981, + 0.0761517299466, + 0.0774587338427, + 0.0787880791465, + 0.0801401477529, + 0.0815153280852, + 0.082914015206, + 0.0843366109312, + 0.0857835239449, + 0.0872551699172, + 0.0887519716236, + 0.0902743590662, + 0.0918227695974, + 0.0933976480457, + 0.0949994468432, + 0.0966286261556, + 0.0982856540146, + 0.0999710064523, + 0.101685167638, + 0.103428630017, + 0.105201894451, + 0.107005470367, + 0.108839875896, + 0.110705638027, + 0.112603292758, + 0.114533385248, + 0.116496469976, + 0.118493110897, + 0.120523881608, + 0.122589365511, + 0.124690155978, + 0.126826856526, + 0.129000080988, + 0.13121045369, + 0.133458609628, + 0.135745194654, + 0.13807086566, + 0.140436290766, + 0.142842149513, + 0.145289133057, + 0.14777794437, + 0.15030929844, + 0.152883922474, + 0.155502556113, + 0.158165951639, + 0.160874874195, + 0.163630102002, + 0.166432426582, + 0.16928265299, + 0.172181600041, + 0.175130100546, + 0.178129001552, + 0.181179164585, + 0.184281465899, + 0.187436796724, + 0.190646063526, + 0.193910188265, + 0.19723010866, + 0.200606778462, + 0.204041167722, + 0.207534263072, + 0.211087068013, + 0.214700603196, + 0.218375906719, + 0.222114034428, + 0.225916060212, + 0.229783076321, + 0.233716193673, + 0.237716542178, + 0.241785271057, + 0.245923549178, + 0.250132565388, + 0.254413528856, + 0.25876766942, + 0.26319623794, + 0.267700506659, + 0.272281769565, + 0.276941342767, + 0.281680564869, + 0.28650079736, + 0.291403424997, + 0.296389856212, + 0.30146152351, + 0.306619883881, + 0.311866419224, + 0.317202636767, + 0.322630069502, + 0.328150276624, + 0.333764843983, + 0.339475384535, + 0.345283538809, + 0.351190975373, + 0.357199391322, + 0.363310512755, + 0.369526095281, + 0.375847924515, + 0.382277816597, + 0.388817618711, + 0.395469209615, + 0.402234500182, + 0.40911543395, + 0.416113987677, + 0.423232171914, + 0.430472031575, + 0.437835646533, + 0.445325132213, + 0.452942640197, + 0.460690358849, + 0.468570513939, + 0.476585369283, + 0.484737227393, + 0.493028430141, + 0.501461359428, + 0.510038437872, + 0.518762129502, + 0.527634940466, + 0.53665941975, + 0.545838159912, + 0.555173797828, + 0.564669015445, + 0.574326540555, + 0.584149147579, + 0.594139658362, + 0.604300942983, + 0.614635920584, + 0.625147560203, + 0.635838881632, + 0.646712956279, + 0.657772908056, + 0.669021914274, + 0.680463206553, + 0.692100071757, + 0.70393585293, + 0.715973950265, + 0.728217822073, + 0.740670985782, + 0.753337018944, + 0.766219560267, + 0.779322310655, + 0.792649034274, + 0.806203559634, + 0.819989780688, + 0.834011657951, + 0.848273219637, + 0.862778562816, + 0.877531854593, + 0.892537333304, + 0.90779930973, + 0.923322168344, + 0.939110368562, + 0.955168446029, + 0.971501013919, + 0.988112764263, + 1.0050084693, + 1.02219298283, + 1.03967124163, + 1.05744826688, + 1.07552916556, + 1.09391913198, + 1.1126234492, + 1.13164749062, + 1.15099672148, + 1.17067670044, + 1.19069308118, + 1.211051614, + 1.23175814753, + 1.25281863036, + 1.27423911275, + 1.29602574838, + 1.31818479615, + 1.34072262192, + 1.36364570036, + 1.38696061684, + 1.41067406927, + 1.43479287008, + 1.45932394813, + 1.48427435072, + 1.50965124562, + 1.53546192313, + 1.56171379815, + 1.58841441233, + 1.61557143624, + 1.64319267158, + 1.67128605339, + 1.69985965236, + 1.72892167712, + 1.75848047663, + 1.78854454257, + 1.81912251176, + 1.85022316866, + 1.88185544788, + 1.91402843677, + 1.94675137801, + 1.98003367225, + 2.01388488087, + 2.04831472865, + 2.08333310664, + 2.11895007492, + 2.15517586556, + 2.19202088554, + 2.22949571972, + 2.26761113389, + 2.30637807786, + 2.34580768864, + 2.38591129359, + 2.42670041369, + 2.46818676688, + 2.51038227138, + 2.55329904913, + 2.59694942931, + 2.64134595182, + 2.68650137092, + 2.73242865889, + 2.77914100975, + 2.82665184305, + 2.87497480775, + 2.92412378608, + 2.97411289761, + 3.02495650323, + 3.07666920934, + 3.12926587198, + 3.18276160117, + 3.23717176519, + 3.29251199502, + 3.34879818885, + 3.40604651661, + 3.46427342464, + 3.5234956404, + 3.58373017729, + 3.64499433952, + 3.7073057271, + 3.77068224089, + 3.83514208773, + 3.9007037857, + 3.96738616939, + 4.03520839537, + 4.10418994764, + 4.17435064329, + 4.24571063811, + 4.31829043244, + 4.39211087707, + 4.46719317918, + 4.54355890845, + 4.62123000329, + 4.7002287771, + 4.78057792469, + 4.86230052882, + 4.94542006682, + 5.02996041732, + 5.11594586712, + 5.20340111819, + 5.29235129472, + 5.38282195038, + 5.47483907563, + 5.56842910522, + 5.66361892575, + 5.76043588341, + 5.85890779185, + 5.95906294013, + 6.06093010089, + 6.1645385386, + 6.26991801796, + 6.37709881244, + 6.48611171303, + 6.59698803701, + 6.70975963701, + 6.82445891012, + 6.94111880723, + 7.05977284247, + 7.18045510285, + 7.30320025805, + 7.42804357036, + 7.55502090487, + 7.6841687397, + 7.81552417653, + 7.94912495123, + 8.08500944471, + 8.22321669397, + 8.36378640327, + 8.50675895557, + 8.65217542412, + 8.80007758426, + 8.9505079254, + 9.10350966329, + 9.25912675235, + 9.41740389837, + 9.57838657131, + 9.74212101837, + 9.90865427729, + 10.0780341899, + 10.2503094156, + 10.425529446, + 10.6037446182, + 10.7850061301, + 10.9693660545, + 11.1568773546, + 11.3475938986, + 11.5415704758, + 11.7388628119, + 11.9395275851, + 12.1436224425, + 12.3512060167, + 12.5623379424, + 12.7770788737, + 12.9954905016, + 13.2176355714, + 13.4435779011, + 13.6733823996, + 13.9071150853, + 14.1448431051, + 14.3866347536, + 14.6325594929, + 14.8826879724, + 15.1370920491, + 15.3958448085, + 15.6590205852, + 15.9266949846, + 16.1989449042, + 16.4758485562, + 16.7574854897, + 17.0439366135, + 17.3352842195, + 17.6316120062, + 17.9330051029, + 18.239550094, + 18.5513350438, + 18.8684495222, + 19.1909846301, + 19.5190330255, + 19.8526889504, + 20.1920482577, + 20.5372084387, + 20.8882686513, + 21.2453297483, + 21.6084943064, + 21.9778666558, + 22.3535529101, + 22.7356609965, + 23.1243006874, + 23.5195836314, + 23.9216233857, + 24.3305354485, + 24.7464372923, + 25.1694483977, + 25.5996902876, + 26.0372865621, + 26.4823629342, + 26.9350472658, + 27.3954696042, + 27.86376222, + 28.3400596445, + 28.8244987087, + 29.3172185826, + 29.8183608151, + 30.3280693747, + 30.8464906907, + 31.3737736956, + 31.9100698676, + 32.4555332743, + 33.0103206165, + 33.5745912742, + 34.1485073512, + 34.7322337226, + 35.3259380817, + 35.9297909882, + 36.5439659174, + 37.1686393098, + 37.8039906221, + 38.4502023784, + 39.1074602228, + 39.7759529727, + 40.4558726733, + 41.1474146522, + 41.8507775762, + 42.5661635077, + 43.2937779633, + 44.0338299725, + 44.786532138, + 45.5521006966, + 46.3307555812, + 47.1227204844, + 47.9282229223, + 48.7474943003, + 49.580769979, + 50.4282893426, + 51.2902958668, + 52.1670371896, + 53.0587651817, + 53.9657360193, + 54.8882102576, + 55.8264529055, + 56.7807335021, + 57.7513261938, + 58.7385098129, + 59.7425679582, + 60.7637890763, + 61.8024665441, + 62.8588987537, + 63.9333891975, + 65.0262465558, + 66.1377847856, + 67.26832321, + 68.4181866111, + 69.5877053222, + 70.7772153235, + 71.9870583381, + 73.2175819307, + 74.4691396067, + 75.7420909145, + 77.0368015483, + 78.3536434535, + 79.6929949333, + 81.0552407574 + ], + "core_charge_density": [ + 0.0, + 0.44738585255, + 0.447385852292, + 0.447385851858, + 0.447385851225, + 0.447385850396, + 0.447385849354, + 0.44738584809, + 0.447385846598, + 0.447385844856, + 0.447385842865, + 0.447385840607, + 0.447385838066, + 0.447385835235, + 0.447385832097, + 0.447385828639, + 0.447385824846, + 0.447385820702, + 0.447385816195, + 0.447385811298, + 0.447385806009, + 0.447385800302, + 0.447385794158, + 0.447385787559, + 0.447385780482, + 0.447385772914, + 0.447385764826, + 0.447385756203, + 0.447385747017, + 0.447385737245, + 0.447385726863, + 0.447385715844, + 0.447385704162, + 0.44738569179, + 0.447385678699, + 0.447385664857, + 0.447385650237, + 0.447385634802, + 0.447385618524, + 0.447385601368, + 0.447385583291, + 0.447385564265, + 0.447385544246, + 0.447385523198, + 0.447385501076, + 0.44738547784, + 0.44738545344, + 0.447385427837, + 0.447385400981, + 0.447385372819, + 0.447385343303, + 0.447385312378, + 0.447385279993, + 0.447385246085, + 0.447385210596, + 0.447385173467, + 0.44738513463, + 0.447385094025, + 0.447385051581, + 0.447385007223, + 0.447384960883, + 0.447384912481, + 0.44738486194, + 0.447384809178, + 0.447384754112, + 0.447384696649, + 0.447384636704, + 0.447384574179, + 0.447384508977, + 0.447384440997, + 0.447384370133, + 0.447384296279, + 0.447384219321, + 0.447384139144, + 0.447384055624, + 0.447383968638, + 0.447383878058, + 0.447383783745, + 0.447383685565, + 0.447383583373, + 0.447383477017, + 0.447383366346, + 0.447383251198, + 0.447383131409, + 0.447383006806, + 0.447382877212, + 0.447382742446, + 0.447382602309, + 0.447382456616, + 0.447382305148, + 0.447382147703, + 0.447381984064, + 0.447381813997, + 0.447381637275, + 0.447381453643, + 0.447381262866, + 0.447381064671, + 0.447380858783, + 0.447380644937, + 0.44738042284, + 0.44738019218, + 0.447379952665, + 0.447379703958, + 0.447379445735, + 0.447379177658, + 0.447378899356, + 0.447378610464, + 0.447378310605, + 0.447377999381, + 0.447377676382, + 0.447377341189, + 0.447376993354, + 0.447376632435, + 0.447376257951, + 0.447375869418, + 0.447375466332, + 0.447375048179, + 0.447374614409, + 0.447374164468, + 0.447373697783, + 0.447373213743, + 0.447372711737, + 0.447372191125, + 0.447371651235, + 0.447371091392, + 0.447370510875, + 0.447369908949, + 0.447369284854, + 0.447368637801, + 0.447367966977, + 0.447367271535, + 0.447366550597, + 0.447365803264, + 0.447365028597, + 0.44736422563, + 0.447363393353, + 0.447362530735, + 0.447361636698, + 0.447360710131, + 0.447359749883, + 0.447358754762, + 0.44735772354, + 0.44735665494, + 0.44735554764, + 0.447354400273, + 0.447353211429, + 0.447351979647, + 0.447350703408, + 0.447349381148, + 0.447348011248, + 0.447346592027, + 0.447345121751, + 0.447343598623, + 0.447342020785, + 0.447340386313, + 0.447338693214, + 0.447336939435, + 0.447335122838, + 0.447333241219, + 0.447331292296, + 0.447329273712, + 0.447327183017, + 0.447325017684, + 0.4473227751, + 0.447320452553, + 0.447318047245, + 0.447315556275, + 0.447312976648, + 0.447310305253, + 0.447307538886, + 0.44730467422, + 0.447301707819, + 0.447298636125, + 0.447295455458, + 0.447292162008, + 0.447288751836, + 0.447285220866, + 0.447281564878, + 0.447277779506, + 0.447273860236, + 0.447269802395, + 0.44726560115, + 0.447261251496, + 0.44725674826, + 0.447252086087, + 0.447247259436, + 0.447242262577, + 0.447237089579, + 0.447231734307, + 0.44722619041, + 0.447220451327, + 0.447214510257, + 0.447208360173, + 0.447201993803, + 0.44719540362, + 0.44718858184, + 0.44718152041, + 0.447174210996, + 0.447166644978, + 0.447158813438, + 0.447150707151, + 0.447142316568, + 0.447133631816, + 0.44712464268, + 0.447115338588, + 0.447105708609, + 0.447095741431, + 0.447085425348, + 0.447074748259, + 0.447063697641, + 0.447052260537, + 0.44704042355, + 0.447028172801, + 0.447015493959, + 0.447002372186, + 0.446988792129, + 0.446974737911, + 0.446960193115, + 0.446945140742, + 0.446929563216, + 0.446913442365, + 0.446896759372, + 0.446879494785, + 0.446861628488, + 0.446843139663, + 0.446824006765, + 0.446804207539, + 0.446783718938, + 0.446762517133, + 0.446740577472, + 0.446717874464, + 0.446694381741, + 0.446670072017, + 0.446644917081, + 0.446618887753, + 0.446591953851, + 0.446564084156, + 0.446535246378, + 0.446505407129, + 0.44647453186, + 0.446442584858, + 0.446409529168, + 0.446375326585, + 0.446339937596, + 0.446303321327, + 0.44626543551, + 0.446226236438, + 0.446185678906, + 0.446143716165, + 0.446100299869, + 0.446055380033, + 0.446008904954, + 0.445960821179, + 0.445911073421, + 0.445859604517, + 0.445806355364, + 0.445751264843, + 0.44569426975, + 0.445635304754, + 0.445574302282, + 0.445511192489, + 0.445445903147, + 0.445378359587, + 0.44530848461, + 0.445236198406, + 0.445161418467, + 0.445084059489, + 0.4450040333, + 0.444921248743, + 0.444835611598, + 0.444747024463, + 0.444655386665, + 0.444560594144, + 0.444462539346, + 0.444361111111, + 0.444256194547, + 0.444147670924, + 0.444035417535, + 0.443919307575, + 0.443799210011, + 0.443674989443, + 0.443546505962, + 0.443413615013, + 0.443276167236, + 0.443134008332, + 0.442986978881, + 0.442834914207, + 0.442677644193, + 0.44251499312, + 0.442346779492, + 0.442172815857, + 0.441992908609, + 0.441806857826, + 0.441614457047, + 0.441415493092, + 0.441209745844, + 0.440996988051, + 0.440776985104, + 0.44054949482, + 0.44031426721, + 0.440071044252, + 0.439819559662, + 0.439559538634, + 0.439290697622, + 0.439012744045, + 0.438725376068, + 0.438428282318, + 0.438121141625, + 0.437803622732, + 0.437475384036, + 0.437136073289, + 0.436785327312, + 0.436422771708, + 0.436048020544, + 0.435660676072, + 0.435260328398, + 0.434846555186, + 0.434418921333, + 0.433976978655, + 0.433520265559, + 0.43304830672, + 0.432560612751, + 0.432056679877, + 0.4315359896, + 0.430998008371, + 0.430442187248, + 0.429867961576, + 0.429274750641, + 0.428661957359, + 0.428028967931, + 0.427375151531, + 0.426699859983, + 0.426002427451, + 0.425282170128, + 0.424538385941, + 0.423770354261, + 0.422977335628, + 0.422158571475, + 0.421313283887, + 0.420440675356, + 0.419539928566, + 0.418610206189, + 0.417650650706, + 0.416660384254, + 0.415638508504, + 0.414584104518, + 0.413496232741, + 0.412373932918, + 0.411216224097, + 0.410022104687, + 0.408790552507, + 0.407520524948, + 0.406210959111, + 0.404860772049, + 0.403468861065, + 0.402034104028, + 0.400555359794, + 0.399031468678, + 0.397461253015, + 0.395843517769, + 0.394177051242, + 0.39246062588, + 0.390692999149, + 0.38887291452, + 0.386999102558, + 0.385070282092, + 0.383085161571, + 0.381042440421, + 0.378940810646, + 0.376778958466, + 0.374555566156, + 0.372269313999, + 0.36991888237, + 0.367502954005, + 0.365020216423, + 0.362469364511, + 0.359849103266, + 0.357158150753, + 0.354395241235, + 0.351559128473, + 0.348648589274, + 0.345662427214, + 0.342599476584, + 0.339458606584, + 0.336238725733, + 0.332938786513, + 0.329557790302, + 0.326094792545, + 0.322548908198, + 0.318919317508, + 0.315205272024, + 0.311406101, + 0.307521218077, + 0.303550128368, + 0.299492435872, + 0.29534785132, + 0.29111620042, + 0.286797432565, + 0.282391629997, + 0.277899017486, + 0.273319972545, + 0.268655036208, + 0.263904924412, + 0.259070540002, + 0.254152985427, + 0.249153576095, + 0.24407385448, + 0.238915604945, + 0.233680869307, + 0.228371963159, + 0.22299149288, + 0.217542373331, + 0.212027846125, + 0.206451498379, + 0.200817281785, + 0.195129531779, + 0.189392986536, + 0.183612805446, + 0.177794586601, + 0.171944382787, + 0.166068715285, + 0.160174584718, + 0.154269478015, + 0.148361370414, + 0.142458721302, + 0.136570462505, + 0.130705977549, + 0.124875070259, + 0.119087921029, + 0.11335502906, + 0.107687138964, + 0.102095150291, + 0.0965900089538, + 0.0911825800101, + 0.0858835021501, + 0.0807030253097, + 0.0756508343658, + 0.0707358637781, + 0.0659661104435, + 0.0613484549199, + 0.0568885045101, + 0.052590475422, + 0.0484571350722, + 0.0444898292151, + 0.0406886212967, + 0.0370525722203, + 0.0335801859919, + 0.030270038152, + 0.0271215860603, + 0.0241361280924, + 0.0213178256376, + 0.0186746176804, + 0.0162187290612, + 0.0139662814298, + 0.0119352345456, + 0.0101404796849, + 0.00858413142954, + 0.00724716447007, + 0.00610187496656, + 0.00512345598552, + 0.00428990865445, + 0.00358178024503, + 0.00298191956024, + 0.00247524931975, + 0.00204855514616, + 0.00169029066135, + 0.00139039813265, + 0.00114014404023, + 0.000931968890088, + 0.000759350552879, + 0.000616680382383, + 0.000499151345457, + 0.00040265738774, + 0.000323703256068, + 0.000259324007181, + 0.00020701344441, + 0.000164660745334, + 0.000130494567388, + 0.000103033948956, + 8.10453557456e-05, + 6.35052587223e-05, + 4.95676670821e-05, + 3.85360790751e-05, + 2.98393527252e-05, + 2.30110381673e-05, + 1.76717520784e-05, + 1.35142127462e-05, + 1.02905907556e-05, + 7.80186526421e-06, + 5.88890873876e-06, + 4.42505400208e-06, + 3.30992610721e-06, + 2.46434807127e-06, + 1.82615368742e-06, + 1.34676263041e-06, + 9.88392860042e-07, + 7.21803052642e-07, + 5.24473517211e-07, + 3.79147936427e-07, + 2.72670426618e-07, + 1.95062989497e-07, + 1.3879756676e-07, + 9.82247540803e-08, + 6.91279183892e-08, + 4.83771264382e-08, + 3.36620567684e-08, + 2.32870482354e-08, + 1.60147422464e-08, + 1.09474997333e-08, + 7.43800426838e-09, + 5.02227662801e-09, + 3.36979129284e-09, + 2.24656069747e-09, + 1.48798938389e-09, + 9.79040928336e-10, + 6.39842384356e-10, + 4.15304816075e-10, + 2.67689943833e-10, + 1.71323107135e-10, + 1.08858950427e-10, + 6.86624378036e-11, + 4.29852497955e-11, + 2.67052522469e-11, + 1.64616234746e-11, + 1.00659084491e-11, + 6.10403036252e-12, + 3.66942998234e-12, + 2.18553914416e-12, + 1.28862834716e-12, + 7.5112509552e-13, + 4.31837333431e-13, + 2.43913834649e-13, + 1.34398482169e-13, + 7.12983893959e-14, + 3.54805968229e-14, + 1.56472536519e-14, + 5.26170209809e-15, + 7.10758391931e-16, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "local_potential": [ + -11.51882940585, + -11.51882940585, + -11.5188294033, + -11.51882940165, + -11.5188294002, + -11.518829398, + -11.51882939525, + -11.51882939185, + -11.51882938795, + -11.5188293834, + -11.51882937805, + -11.5188293721, + -11.51882936535, + -11.5188293579, + -11.51882934955, + -11.5188293404, + -11.51882933035, + -11.5188293194, + -11.5188293075, + -11.5188292945, + -11.51882928055, + -11.51882926545, + -11.51882924925, + -11.51882923175, + -11.518829213, + -11.518829193, + -11.51882917155, + -11.5188291488, + -11.5188291245, + -11.51882909865, + -11.51882907115, + -11.518829042, + -11.5188290111, + -11.5188289784, + -11.51882894375, + -11.5188289071, + -11.51882886845, + -11.5188288276, + -11.51882878455, + -11.51882873915, + -11.5188286913, + -11.518828641, + -11.518828588, + -11.51882853235, + -11.51882847385, + -11.51882841235, + -11.5188283478, + -11.51882828005, + -11.518828209, + -11.5188281345, + -11.5188280564, + -11.5188279746, + -11.518827889, + -11.5188277992, + -11.5188277053, + -11.5188276071, + -11.51882750435, + -11.51882739695, + -11.5188272846, + -11.5188271673, + -11.51882704465, + -11.51882691665, + -11.51882678295, + -11.51882664335, + -11.51882649765, + -11.51882634565, + -11.5188261871, + -11.51882602165, + -11.51882584915, + -11.51882566925, + -11.5188254818, + -11.5188252864, + -11.5188250828, + -11.5188248707, + -11.51882464975, + -11.5188244196, + -11.51882418, + -11.5188239305, + -11.51882367075, + -11.51882340035, + -11.51882311895, + -11.51882282615, + -11.51882252155, + -11.51882220465, + -11.518821875, + -11.51882153215, + -11.5188211756, + -11.51882080485, + -11.51882041945, + -11.51882001865, + -11.5188196021, + -11.5188191692, + -11.51881871925, + -11.51881825175, + -11.5188177659, + -11.5188172612, + -11.5188167369, + -11.5188161921, + -11.51881562635, + -11.51881503885, + -11.51881442855, + -11.51881379485, + -11.5188131369, + -11.51881245375, + -11.5188117445, + -11.51881100825, + -11.51881024395, + -11.5188094506, + -11.51880862725, + -11.5188077727, + -11.5188068859, + -11.5188059656, + -11.5188050108, + -11.51880402005, + -11.51880299215, + -11.5188019257, + -11.5188008194, + -11.5187996718, + -11.5187984814, + -11.5187972467, + -11.5187959661, + -11.51879463795, + -11.5187932606, + -11.5187918322, + -11.5187903511, + -11.5187888152, + -11.5187872227, + -11.51878557155, + -11.5187838596, + -11.51878208485, + -11.51878024495, + -11.5187783375, + -11.5187763603, + -11.51877431075, + -11.51877218635, + -11.51876998435, + -11.51876770215, + -11.51876533675, + -11.5187628853, + -11.5187603447, + -11.51875771185, + -11.5187549835, + -11.5187521563, + -11.5187492266, + -11.51874619095, + -11.5187430455, + -11.5187397865, + -11.51873640985, + -11.5187329114, + -11.5187292869, + -11.51872553195, + -11.5187216418, + -11.5187176119, + -11.51871343715, + -11.5187091126, + -11.5187046329, + -11.51869999265, + -11.51869518615, + -11.5186902076, + -11.5186850509, + -11.51867970995, + -11.51867417805, + -11.51866844875, + -11.518662515, + -11.5186563696, + -11.5186500053, + -11.5186434141, + -11.51863658845, + -11.51862951985, + -11.5186222, + -11.5186146199, + -11.51860677055, + -11.5185986426, + -11.51859022625, + -11.5185815114, + -11.5185724875, + -11.518563144, + -11.5185534696, + -11.51854345275, + -11.5185330814, + -11.51852234335, + -11.51851122575, + -11.51849971525, + -11.5184877982, + -11.5184754605, + -11.5184626873, + -11.5184494636, + -11.5184357735, + -11.518421601, + -11.51840692905, + -11.5183917404, + -11.5183760169, + -11.5183597401, + -11.5183428906, + -11.51832544855, + -11.5183073932, + -11.5182887034, + -11.51826935675, + -11.5182493308, + -11.51822860155, + -11.51820714485, + -11.51818493505, + -11.51816194635, + -11.5181381513, + -11.51811352225, + -11.5180880298, + -11.51806164435, + -11.5180343344, + -11.51800606835, + -11.5179768126, + -11.51794653305, + -11.51791519385, + -11.51788275845, + -11.51784918855, + -11.5178144452, + -11.51777848705, + -11.5177412725, + -11.51770275755, + -11.5176628974, + -11.517621645, + -11.51757895255, + -11.5175347695, + -11.5174890447, + -11.5174417243, + -11.5173927534, + -11.5173420741, + -11.51728962795, + -11.51723535295, + -11.51717918645, + -11.51712106215, + -11.517060913, + -11.516998668, + -11.51693425535, + -11.5168675992, + -11.5167986226, + -11.51672724425, + -11.516653382, + -11.5165769489, + -11.5164978568, + -11.51641601265, + -11.51633132225, + -11.51624368595, + -11.5161530029, + -11.5160591666, + -11.51596206895, + -11.515861596, + -11.5157576321, + -11.51565005525, + -11.5155387417, + -11.51542356085, + -11.5153043804, + -11.5151810605, + -11.5150534595, + -11.51492142785, + -11.51478481375, + -11.51464345735, + -11.51449719625, + -11.5143458591, + -11.51418927235, + -11.5140272526, + -11.51385961405, + -11.5136861605, + -11.513506693, + -11.5133210017, + -11.51312887375, + -11.5129300845, + -11.5127244061, + -11.5125115982, + -11.512291417, + -11.51206360535, + -11.51182790235, + -11.5115840327, + -11.5113317174, + -11.51107066175, + -11.51080056715, + -11.5105211184, + -11.51023199585, + -11.50993286225, + -11.50962337565, + -11.5093031751, + -11.5089718947, + -11.50862914825, + -11.5082745443, + -11.5079076695, + -11.5075281051, + -11.50713540875, + -11.50672913245, + -11.506308803, + -11.5058739408, + -11.50542403975, + -11.5049585868, + -11.5044770403, + -11.5039788513, + -11.5034634404, + -11.5029302203, + -11.5023785711, + -11.50180786455, + -11.5012174372, + -11.5006066171, + -11.49997469465, + -11.49932095065, + -11.4986446262, + -11.4979449519, + -11.49722111585, + -11.4964722952, + -11.4956976212, + -11.4948962136, + -11.4940671432, + -11.4932094686, + -11.49232219575, + -11.49140431745, + -11.49045477085, + -11.48947247855, + -11.48845630345, + -11.4874050935, + -11.48631763255, + -11.4851926884, + -11.48402896035, + -11.48282513065, + -11.48157980825, + -11.480291584, + -11.4789589703, + -11.47758046025, + -11.4761544631, + -11.47467936755, + -11.4731534726, + -11.47157505545, + -11.4699422973, + -11.4682533562, + -11.46650628755, + -11.46469912225, + -11.46282978115, + -11.46089615935, + -11.45889603415, + -11.45682715555, + -11.45468714765, + -11.4524736054, + -11.4501839894, + -11.4478157292, + -11.44536611065, + -11.44283238685, + -11.44021165725, + -11.4375009866, + -11.43469727535, + -11.4317973875, + -11.4287980111, + -11.4256957956, + -11.42248720315, + -11.41916865445, + -11.4157363702, + -11.4121865273, + -11.40851508935, + -11.4047179736, + -11.4007908689, + -11.39672941635, + -11.3925290125, + -11.3881850035, + -11.3836924747, + -11.3790464587, + -11.3742417096, + -11.36927292595, + -11.36413450925, + -11.3588208031, + -11.35332583405, + -11.34764356805, + -11.34176763295, + -11.335691594, + -11.3294086555, + -11.3229119569, + -11.316194253, + -11.30924823165, + -11.30206617105, + -11.29464028035, + -11.2869623325, + -11.27902403, + -11.2708166111, + -11.2623312424, + -11.25355859685, + -11.24448927505, + -11.2351133533, + -11.2254208354, + -11.21540116875, + -11.2050437288, + -11.19433730135, + -11.18327060215, + -11.17183172225, + -11.16000868575, + -11.14778885675, + -11.1351595364, + -11.12210732955, + -11.10861878445, + -11.09467971595, + -11.0802758906, + -11.06539230485, + -11.05001391745, + -11.0341248803, + -11.0177093218, + -11.00075052745, + -10.9832317767, + -10.96513547165, + -10.9464440301, + -10.92713895995, + -10.90720181095, + -10.88661319325, + -10.8653537899, + -10.8434033179, + -10.8207416031, + -10.79734748275, + -10.7731999432, + -10.74827696285, + -10.72255671385, + -10.6960163435, + -10.66863323875, + -10.64038374585, + -10.6112444954, + -10.5811910595, + -10.5501993327, + -10.5182441271, + -10.4853006032, + -10.45134280305, + -10.4163451236, + -10.3802807901, + -10.3431233622, + -10.30484515225, + -10.26541875495, + -10.22481541995, + -10.18300659575, + -10.13996227365, + -10.09565254165, + -10.05004592595, + -10.00311095895, + -9.95481456055, + -9.9051236347, + -9.8540035552, + -9.80141982535, + -9.74733676065, + -9.69171927415, + -9.63453189005, + -9.5757407569, + -9.51531317715, + -9.4532199978, + -9.3894358854, + -9.3239422553, + -9.2567284794, + -9.18779534705, + -9.1171570149, + -9.04484426695, + -8.97090576185, + -8.89540834485, + -8.81843312515, + -8.74006581365, + -8.6603774054, + -8.5793900352, + -8.49702743715, + -8.41298576935, + -8.3265800027, + -8.23738190215, + -8.14599097335, + -8.05319042105, + -7.9591431133, + -7.8638328021, + -7.7673162458, + -7.6696443638, + -7.57086644525, + -7.47102536265, + -7.37015700695, + -7.26828396355, + -7.1654135657, + -7.061528962, + -6.95658246255, + -6.85046794845, + -6.74322505425, + -6.63516671485, + -6.52655263225, + -6.4175057193, + -6.30817062565, + -6.19870742205, + -6.089292992, + -5.98011924075, + -5.87139724295, + -5.76335616135, + -5.6562476274, + -5.55034516435, + -5.4459489055, + -5.34338563515, + -5.24301389665, + -5.14522475365, + -5.05044732775, + -4.95915033205, + -4.871847899635, + -4.78919792574, + -4.70869071673, + -4.62953481071, + -4.55171016869, + -4.47519531341, + -4.399966670825, + -4.326002939235, + -4.25328281926, + -4.18178539068, + -4.111490085965, + -4.042376683925, + -3.974425304095, + -3.907616400715, + -3.84193075729, + -3.777349480795, + -3.713853996275, + -3.651426041555, + -3.590047661875, + -3.52970120464, + -3.4703693145, + -3.41203492816, + -3.354681269515, + -3.298291844865, + -3.242850438035, + -3.1883411058, + -3.134748173215, + -3.08205622915, + -3.030250121775, + -2.979314954245, + -2.929236080365, + -2.879999100375, + -2.83158985682, + -2.78399443042, + -2.737199136115, + -2.691190519015, + -2.64595535067, + -2.60148062514, + -2.55775355523, + -2.51476156891, + -2.472492305665, + -2.43093361283, + -2.390073542225, + -2.34990034667, + -2.31040247651, + -2.271568576495, + -2.233387482265, + -2.195848217365, + -2.15893998993, + -2.122652189675, + -2.08697438476, + -2.051896318895, + -2.01740790826, + -1.983499238745, + -1.950160562965, + -1.91738229756, + -1.88515502036, + -1.853469467705, + -1.82231653179, + -1.79168725802, + -1.76157284241, + -1.73196462911, + -1.702854107835, + -1.67423291147, + -1.6460928136, + -1.618425726195, + -1.591223697235, + -1.56447890842, + -1.538183672955, + -1.512330433295, + -1.48691175894, + -1.46192034438, + -1.437349006905, + -1.41319068459, + -1.389438434255, + -1.366085429405, + -1.343124958375, + -1.320550422335, + -1.29835533335, + -1.27653331263, + -1.255078088605, + -1.233983495145, + -1.21324346979, + -1.192852052035, + -1.172803381565, + -1.153091696615, + -1.133711332305, + -1.114656718985, + -1.09592238066, + -1.077502933415, + -1.05939308386, + -1.041587627595, + -1.02408144775, + -1.006869513465, + -0.989946878495, + -0.973308679745, + -0.956950135895, + -0.940866546, + -0.925053288175, + -0.909505818235, + -0.894219668405, + -0.879190446015, + -0.864413832255, + -0.849885580945, + -0.83560151726, + -0.821557536585, + -0.807749603335, + -0.79417374972, + -0.780826074715, + -0.76770274284, + -0.754799983115, + -0.742114087945, + -0.729641412085, + -0.71737837155, + -0.70532144263, + -0.69346716084, + -0.68181211994, + -0.67035297095, + -0.6590864212, + -0.648009233365, + -0.637118224545, + -0.62641026535, + -0.615882278985, + -0.605531240405, + -0.595354175385, + -0.585348159725, + -0.575510318365, + -0.56583782459, + -0.55632789918, + -0.546977809665, + -0.53778486948, + -0.528746437245, + -0.51985991604, + -0.51112275237, + -0.50253243592, + -0.4940864984655, + -0.4857825132815, + -0.477618094439, + -0.4695908961165, + -0.4616986119155, + -0.4539389742205, + -0.4463097535185, + -0.438808757786, + -0.4314338318405, + -0.4241828567215, + -0.417053749095, + -0.410044460647, + -0.4031529774815, + -0.3963773195695, + -0.389715540156, + -0.3831657252095, + -0.376725992866, + -0.370394492912, + -0.364169406212, + -0.358048944222, + -0.352031348456, + -0.3461148899855, + -0.3402978689465, + -0.33457861404, + -0.3289554820695, + -0.3234268574545, + -0.317991151763, + -0.3126468032595, + -0.3073922766645, + -0.30222606192, + -0.29714667494, + -0.29215265638, + -0.2872425714245, + -0.282415009373, + -0.2776685832395, + -0.2730019293485, + -0.2684137069455, + -0.263902597814, + -0.259467305892, + -0.255106556903, + -0.2508190979875, + -0.2466036973455, + -0.242459143881, + -0.2383842468535, + -0.234377835536, + -0.230438758881, + -0.226565885186, + -0.2227581017695, + -0.2190143146545, + -0.215333448248, + -0.2117144450385, + -0.208156265288, + -0.204657886733, + -0.2012183042925, + -0.1978365297795, + -0.1945115916155, + -0.191242534552, + -0.1880284193955, + -0.1848683227385, + -0.1817613366955, + -0.178706568637, + -0.1757031409395, + -0.1727501907285, + -0.1698468696325, + -0.1669923435395, + -0.1641857923565, + -0.161426409775, + -0.1587134030365, + -0.156045992709, + -0.1534234124595, + -0.150844908835, + -0.148309741047, + -0.1458171807565, + -0.1433665118665, + -0.140957030316, + -0.1385880438775, + -0.136258871957, + -0.1339688454, + -0.1317173062985, + -0.129503607803, + -0.127327113934, + -0.125187199403, + -0.123083249429, + -0.1210146595655, + -0.1189808355235, + -0.1169811930035, + -0.1150151575255, + -0.1130821642655, + -0.111181657892, + -0.109313092408, + -0.107475930992, + -0.105669645845, + -0.1038937180395, + -0.1021476373695, + -0.1004309022035, + -0.098743019341, + -0.0970835038715, + -0.095451879033, + -0.0938476760785, + -0.092270434137, + -0.0907197000845, + -0.089195028413, + -0.087695981101, + -0.0862221274895, + -0.084773044158, + -0.0833483148015, + -0.081947530112, + -0.0805702876615, + -0.079216191784, + -0.077884853465, + -0.076575890227, + -0.075288926022, + -0.0740235911205 + ], + "beta_projectors": [ + { + "label": "", + "angular_momentum": 0, + "radial_function": [ + 0.0, + 1.65383594196e-05, + 3.33571559743e-05, + 5.04693354757e-05, + 6.78723387577e-05, + 8.5565168648e-05, + 0.000103567508771, + 0.000121883780403, + 0.000140499066278, + 0.000159435056994, + 0.000178713275017, + 0.00019829540949, + 0.000218224592009, + 0.000238496773275, + 0.000259119417574, + 0.000280064954299, + 0.00030141530716, + 0.000323086303189, + 0.000345168111001, + 0.000367594150396, + 0.000390415843565, + 0.000413637029426, + 0.000437230413628, + 0.000461266812284, + 0.000485663735511, + 0.000510531279137, + 0.000535766806863, + 0.000561498700462, + 0.000587606727147, + 0.000614203298019, + 0.000641235516037, + 0.000668742693618, + 0.000696705155218, + 0.000725161282612, + 0.000754083333457, + 0.000783523131236, + 0.000813461943488, + 0.000843881647265, + 0.000874872883726, + 0.000906342371037, + 0.00093839108892, + 0.000970953834976, + 0.00100411884664, + 0.0010377913548, + 0.00107208597662, + 0.00110695409127, + 0.00114239033797, + 0.00117849432397, + 0.00121514325881, + 0.00125247213388, + 0.00129042285868, + 0.00132900617553, + 0.00136827250815, + 0.00140819001437, + 0.0014488202446, + 0.00149010070827, + 0.00153212788747, + 0.00157485099225, + 0.00161831061947, + 0.00166252402611, + 0.001707439477, + 0.00175320557675, + 0.00179970723554, + 0.00184699577062, + 0.00189512369631, + 0.00194404296231, + 0.00199382007654, + 0.00204443628969, + 0.00209593162639, + 0.00214828583086, + 0.00220154296938, + 0.00225573001889, + 0.00231081682665, + 0.00236686599746, + 0.00242385039946, + 0.00248182599306, + 0.0025407952186, + 0.00260075851152, + 0.00266174592507, + 0.00272380620678, + 0.00278687897247, + 0.00285107821056, + 0.00291634286109, + 0.00298272219997, + 0.00305026104859, + 0.00311893798706, + 0.00318878792269, + 0.00325983283174, + 0.00333209681774, + 0.0034055928213, + 0.00348034371338, + 0.00355637365114, + 0.00363370931998, + 0.00371235223502, + 0.00379236311586, + 0.00387371063572, + 0.00395647680393, + 0.00404063436815, + 0.00412625522883, + 0.00421332232243, + 0.00430187627559, + 0.00439195441236, + 0.00448356695761, + 0.00457675149656, + 0.00467151035192, + 0.00476790950463, + 0.00486595230475, + 0.00496566354983, + 0.00506708227378, + 0.00517023695395, + 0.00527515845221, + 0.00538185635971, + 0.00549040305657, + 0.00560078575412, + 0.00571305508801, + 0.00582726738775, + 0.00594340007328, + 0.00606154663049, + 0.00618168293309, + 0.00630389568676, + 0.0064281958087, + 0.00655460578155, + 0.00668318909049, + 0.00681397048815, + 0.00694698288673, + 0.00708226069549, + 0.0072198756584, + 0.00735981661163, + 0.00750216299446, + 0.00764694137907, + 0.00779419035327, + 0.00794396190563, + 0.00809629059177, + 0.00825121976851, + 0.00840880423563, + 0.00856907415024, + 0.00873209315082, + 0.00889788869372, + 0.00906652967688, + 0.00923803542264, + 0.00941249673924, + 0.00958991438844, + 0.00977039011544, + 0.00995392967974, + 0.0101406181801, + 0.0103304919099, + 0.0105236161367, + 0.0107200396964, + 0.010919816716, + 0.0111230139811, + 0.0113296804364, + 0.0115398836559, + 0.0117536770442, + 0.011971123688, + 0.0121922869371, + 0.0124172349109, + 0.0126460233834, + 0.0128787263677, + 0.0131153983697, + 0.0133561305978, + 0.0136009598824, + 0.0138499903761, + 0.0141032623046, + 0.0143608755815, + 0.0146228886939, + 0.0148893713881, + 0.0151604249604, + 0.0154360954663, + 0.0157164882674, + 0.0160016702065, + 0.016291726128, + 0.0165867393001, + 0.016886797236, + 0.0171919788341, + 0.0175023845503, + 0.017818084495, + 0.0181391937808, + 0.0184657788685, + 0.0187979514555, + 0.0191358031025, + 0.0194794269496, + 0.0198289222451, + 0.0201843918919, + 0.0205459387603, + 0.0209136616085, + 0.0212876726544, + 0.0216680749659, + 0.0220549748462, + 0.0224484955017, + 0.0228487287056, + 0.0232558167941, + 0.0236698507687, + 0.0240909665041, + 0.0245192754381, + 0.0249549099579, + 0.0253979829887, + 0.0258486287989, + 0.0263069827794, + 0.0267731626306, + 0.0272473090411, + 0.027729562922, + 0.0282200561826, + 0.0287189282357, + 0.0292263289661, + 0.029742401768, + 0.0302672867511, + 0.0308011499338, + 0.0313441254763, + 0.0318963888043, + 0.0324580821347, + 0.0330293790552, + 0.0336104322505, + 0.0342014169674, + 0.0348024979379, + 0.0354138514938, + 0.0360356481487, + 0.0366680700721, + 0.037311296973, + 0.0379655145986, + 0.0386309066643, + 0.0393076702298, + 0.0399959938001, + 0.0406960760351, + 0.0414081214827, + 0.0421323266592, + 0.0428689067497, + 0.0436180694904, + 0.0443800278672, + 0.0451550016234, + 0.0459432158032, + 0.0467448901698, + 0.0475602615708, + 0.0483895532221, + 0.0492330173892, + 0.0500908796695, + 0.0509633979523, + 0.0518508136881, + 0.0527533872333, + 0.0536713714739, + 0.0546050350353, + 0.0555546384976, + 0.056520457483, + 0.0575027684915, + 0.0585018504496, + 0.0595179898185, + 0.0605514774896, + 0.0616026101287, + 0.0626716835365, + 0.0637590094679, + 0.0648648931251, + 0.0659896541594, + 0.0671336121531, + 0.0682970916598, + 0.0694804301528, + 0.0706839605626, + 0.0719080276653, + 0.0731529809826, + 0.0744191764125, + 0.0757069737123, + 0.0770167382179, + 0.078348847475, + 0.0797036785855, + 0.0810816157634, + 0.0824830533986, + 0.0839083924016, + 0.0853580322453, + 0.0868323912856, + 0.0883318852443, + 0.0898569423941, + 0.0914079934064, + 0.0929854818152, + 0.0945898525169, + 0.0962215639293, + 0.0978810755056, + 0.0995688604855, + 0.101285395888, + 0.103031167728, + 0.104806671051, + 0.10661240776, + 0.108448887551, + 0.11031663274, + 0.11221616638, + 0.114148027751, + 0.116112762309, + 0.118110921249, + 0.120143070966, + 0.122209780055, + 0.124311633282, + 0.126449219647, + 0.128623140811, + 0.13083400592, + 0.133082435587, + 0.135369060906, + 0.137694519645, + 0.140059465645, + 0.142464556836, + 0.144910466505, + 0.147397875789, + 0.149927478463, + 0.152499978025, + 0.155116089431, + 0.157776539179, + 0.160482065473, + 0.163233416897, + 0.166031354132, + 0.168876650929, + 0.171770090362, + 0.174712470938, + 0.17770460026, + 0.180747299854, + 0.183841403888, + 0.186987758782, + 0.190187221811, + 0.193440668121, + 0.196748979259, + 0.20011305485, + 0.203533805597, + 0.207012156114, + 0.210549044144, + 0.214145419872, + 0.21780225024, + 0.221520510819, + 0.225301196855, + 0.229145312292, + 0.23305387716, + 0.237027925446, + 0.241068505825, + 0.245176677698, + 0.249353518455, + 0.253600116924, + 0.257917576903, + 0.262307015385, + 0.266769564747, + 0.271306368486, + 0.275918587601, + 0.280607393167, + 0.285373971962, + 0.290219523536, + 0.295145260889, + 0.300152409243, + 0.305242207664, + 0.310415907324, + 0.315674771438, + 0.321020075742, + 0.326453107053, + 0.331975163206, + 0.337587553494, + 0.343291596936, + 0.349088621867, + 0.354979966892, + 0.360966977946, + 0.367051008921, + 0.373233421052, + 0.379515581064, + 0.385898862113, + 0.392384639122, + 0.398974293092, + 0.405669204078, + 0.412470754612, + 0.419380325994, + 0.426399296809, + 0.433529041786, + 0.440770930878, + 0.448126325338, + 0.455596577586, + 0.463183028439, + 0.47088700384, + 0.47870981435, + 0.486652750204, + 0.494717080236, + 0.502904047228, + 0.511214866433, + 0.519650719858, + 0.528212754627, + 0.536902076271, + 0.545719747762, + 0.554666781228, + 0.563744135798, + 0.57295271083, + 0.582293339862, + 0.591766786345, + 0.601373734839, + 0.611114786162, + 0.620990447943, + 0.631001129365, + 0.641147129677, + 0.651428632156, + 0.661845692908, + 0.672398231429, + 0.683086019422, + 0.693908670579, + 0.704865627068, + 0.715956147967, + 0.727179295176, + 0.73853391945, + 0.750018644452, + 0.76163185266, + 0.773371666013, + 0.785235929966, + 0.797222194716, + 0.809327693596, + 0.821549325275, + 0.833883628955, + 0.846326763838, + 0.858874483941, + 0.871522113121, + 0.884264519419, + 0.897096087019, + 0.910010688376, + 0.923001654014, + 0.936061741957, + 0.949183106275, + 0.962357262777, + 0.975575056785, + 0.988826625843, + 1.00210136566, + 1.01538789139, + 1.02867400101, + 1.04194663551, + 1.05519184063, + 1.06839472637, + 1.08153942648, + 1.09460905839, + 1.10758568211, + 1.12045025869, + 1.1331826109, + 1.14576138111, + 1.158163992, + 1.17036660708, + 1.18234409093, + 1.19406997132, + 1.20551640205, + 1.21665412498, + 1.22745243579, + 1.23787914646, + 1.24790055169, + 1.25748139348, + 1.26658482538, + 1.27517237655, + 1.28320391408, + 1.29063760166, + 1.29742985634, + 1.30353529888, + 1.30890669883, + 1.31349491064, + 1.31724880097, + 1.32011516304, + 1.32203861882, + 1.32296150349, + 1.3228237345, + 1.3215626603, + 1.31911288982, + 1.31540610276, + 1.31037084159, + 1.30393228853, + 1.29601203446, + 1.28652784823, + 1.27539345957, + 1.26251837592, + 1.24780775775, + 1.23116238813, + 1.21247877924, + 1.19164947498, + 1.16856361908, + 1.14310787746, + 1.11516782178, + 1.08462990165, + 1.0513841552, + 1.01532783208, + 0.9763701219, + 0.934438202919, + 0.889484834248, + 0.84149771669, + 0.79051082569, + 0.736617873498, + 0.679987963031, + 0.62088334789, + 0.559678969534, + 0.496883090955, + 0.433157821561, + 0.369337593617, + 0.306442612223, + 0.245682878688, + 0.188446437069, + 0.136262869809, + 0.0907295441017, + 0.053383387969, + 0.0254951569665, + 0.00775121013864, + -0.000186380857421, + 3.04041004642e-05, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "cutoff_radius": 0.0, + "ultrasoft_cutoff_radius": 0.0 + }, + { + "label": "", + "angular_momentum": 0, + "radial_function": [ + 0.0, + 3.64720425172e-05, + 7.35643484946e-05, + 0.000111298380443, + 0.000149656851489, + 0.000188705708578, + 0.000228390169445, + 0.000268764663296, + 0.000309828460648, + 0.000351618407983, + 0.000394061309136, + 0.000437289955224, + 0.000481239021736, + 0.000525926316362, + 0.000571372117973, + 0.000617660752105, + 0.000664634341406, + 0.000712511448, + 0.000761112762184, + 0.000810621936314, + 0.000860958649997, + 0.000912118344258, + 0.000964224335993, + 0.00101710923299, + 0.00107104341419, + 0.0011257464846, + 0.00118154452422, + 0.00123811372645, + 0.00129582799222, + 0.0013544117396, + 0.00141405420445, + 0.00147466709112, + 0.00153637327868, + 0.00159908397039, + 0.00166291846438, + 0.00172778545621, + 0.00179377825694, + 0.00186096558267, + 0.00192918534247, + 0.00199868677749, + 0.002069285295, + 0.00214116342198, + 0.00221416020029, + 0.00228856646328, + 0.00236409660764, + 0.00244098967808, + 0.00251924062443, + 0.00259867155075, + 0.00267966060762, + 0.0027618793618, + 0.00284556312624, + 0.00293070246802, + 0.00301725039867, + 0.00310531412184, + 0.00319481662594, + 0.00328596742962, + 0.0033785517418, + 0.00347279381541, + 0.0035686206474, + 0.00366606548016, + 0.00376531154148, + 0.00386603582045, + 0.0039686047411, + 0.00407294922418, + 0.00417899834779, + 0.00428693667287, + 0.0043966697173, + 0.0045083056281, + 0.00462180829623, + 0.00473731670402, + 0.00485477931871, + 0.00497418390614, + 0.00509571558006, + 0.00521925576432, + 0.00534498263796, + 0.00547280053642, + 0.00560280995007, + 0.00573505934554, + 0.00586958980209, + 0.00600632818152, + 0.00614553813423, + 0.00628699666762, + 0.00643095989824, + 0.00657737979998, + 0.00672624741712, + 0.00687769213336, + 0.00703173801152, + 0.00718840651987, + 0.00734774518708, + 0.00750981277898, + 0.00767465445767, + 0.0078423161199, + 0.00801282035647, + 0.00818628158795, + 0.00836264007436, + 0.00854210458552, + 0.00872455221253, + 0.00891018779768, + 0.00909892504101, + 0.00929093942522, + 0.00948623541586, + 0.00968484280848, + 0.00988685858783, + 0.0100923161117, + 0.0103013277287, + 0.0105138614404, + 0.0107300371127, + 0.0109499255886, + 0.0111735712209, + 0.0114010244784, + 0.011632364763, + 0.0118676955712, + 0.0121069879689, + 0.0123504209261, + 0.0125980126965, + 0.0128497787327, + 0.013105924443, + 0.0133663763259, + 0.0136313591513, + 0.0139008109009, + 0.0141748668612, + 0.0144536521873, + 0.0147371664051, + 0.0150255270397, + 0.0153188239568, + 0.0156171609425, + 0.0159205260557, + 0.016229150122, + 0.0165430092389, + 0.0168622378849, + 0.0171869327782, + 0.0175171593045, + 0.0178530457173, + 0.018194669463, + 0.0185421187896, + 0.0188955301661, + 0.0192549492831, + 0.0196205429133, + 0.0199923506487, + 0.0203705619201, + 0.0207551687044, + 0.0211464212136, + 0.0215442906669, + 0.0219490097696, + 0.0223606217096, + 0.0227792771988, + 0.0232050767645, + 0.0236381542056, + 0.0240786436701, + 0.024526645446, + 0.0249823127284, + 0.0254457528928, + 0.0259171250362, + 0.0263965447586, + 0.0268841637355, + 0.0273800984195, + 0.0278845209223, + 0.0283975483596, + 0.028919365152, + 0.0294500571863, + 0.0299898613085, + 0.0305388452031, + 0.0310972490854, + 0.0316651539064, + 0.032242775855, + 0.0328302841712, + 0.0334277873203, + 0.0340355375759, + 0.0346536447203, + 0.0352823149582, + 0.0359217241363, + 0.0365720572447, + 0.0372334915213, + 0.037906232343, + 0.0385904436423, + 0.0392863687312, + 0.0399941423609, + 0.0407140352404, + 0.0414462065199, + 0.0421908756731, + 0.042948264028, + 0.0437185902513, + 0.0445020646594, + 0.0452989093615, + 0.0461093681945, + 0.046933651749, + 0.0477720101483, + 0.0486246879123, + 0.0494918973455, + 0.0503739444461, + 0.0512710030641, + 0.0521834062246, + 0.05311135818, + 0.0540551586736, + 0.0550150469178, + 0.0559913295596, + 0.0569842662538, + 0.057994124133, + 0.0590212282765, + 0.0600658516044, + 0.0611282793953, + 0.0622088328619, + 0.0633078197769, + 0.0644255379135, + 0.065562310455, + 0.0667184801282, + 0.0678943373851, + 0.0690902638764, + 0.0703065491693, + 0.0715435804682, + 0.0728016763535, + 0.0740812236062, + 0.0753825606858, + 0.0767060713052, + 0.0780521182399, + 0.0794210960268, + 0.0808133820348, + 0.0822293733432, + 0.0836694681808, + 0.085134082831, + 0.0866236136811, + 0.0881384969517, + 0.0896791544665, + 0.0912460118394, + 0.0928395292191, + 0.0944601357366, + 0.0961082948801, + 0.0977844753676, + 0.099489143025, + 0.101222769012, + 0.102985854159, + 0.104778875271, + 0.106602358312, + 0.108456776201, + 0.11034268874, + 0.112260589203, + 0.114211034179, + 0.116194549962, + 0.118211703177, + 0.120263037812, + 0.122349140927, + 0.124470579946, + 0.126627941627, + 0.128821827598, + 0.131052841542, + 0.133321596335, + 0.135628716738, + 0.137974843733, + 0.140360608387, + 0.142786678466, + 0.145253706447, + 0.147762370341, + 0.15031335936, + 0.15290735435, + 0.155545070574, + 0.158227220118, + 0.160954527447, + 0.163727725037, + 0.166547563571, + 0.169414805149, + 0.172330205539, + 0.175294550826, + 0.178308635297, + 0.181373254497, + 0.184489215111, + 0.18765735836, + 0.190878499719, + 0.194153497696, + 0.197483202592, + 0.200868490732, + 0.20431023356, + 0.207809331195, + 0.211366677828, + 0.214983196982, + 0.218659807095, + 0.222397448967, + 0.226197071503, + 0.230059632255, + 0.233986103613, + 0.237977470798, + 0.242034717842, + 0.246158861419, + 0.250350908655, + 0.254611884097, + 0.258942831125, + 0.263344788585, + 0.267818820858, + 0.272365987809, + 0.276987370014, + 0.281684050949, + 0.286457127769, + 0.291307703104, + 0.296236886547, + 0.301245804337, + 0.306335575411, + 0.311507342542, + 0.316762242031, + 0.322101424001, + 0.327526039486, + 0.333037246979, + 0.338636209209, + 0.344324090713, + 0.350102058177, + 0.355971283266, + 0.36193293739, + 0.367988188852, + 0.374138210371, + 0.380384166443, + 0.386727223839, + 0.393168541926, + 0.399709273734, + 0.406350565533, + 0.413093560358, + 0.419939376929, + 0.426889140013, + 0.433943947051, + 0.441104885454, + 0.448373023334, + 0.455749409667, + 0.463235074382, + 0.470831014306, + 0.478538212768, + 0.486357608129, + 0.494290118936, + 0.502336624235, + 0.510497961767, + 0.518774928492, + 0.527168282859, + 0.535678723672, + 0.544306905059, + 0.553053419901, + 0.561918803138, + 0.570903519395, + 0.580007970242, + 0.589232471446, + 0.598577267719, + 0.608042511883, + 0.617628265393, + 0.627334491559, + 0.637161050497, + 0.647107688124, + 0.657174032874, + 0.667359587304, + 0.677663718648, + 0.68808565356, + 0.6986244669, + 0.709279074002, + 0.720048220098, + 0.730930473522, + 0.741924209653, + 0.753027606373, + 0.7642386296, + 0.775555020707, + 0.786974286733, + 0.7984936831, + 0.810110209196, + 0.821820580598, + 0.833621229731, + 0.845508278075, + 0.857477526741, + 0.869524439866, + 0.881644126191, + 0.893831319126, + 0.906080363679, + 0.918385192549, + 0.930739307077, + 0.943135760334, + 0.955567129429, + 0.968025499914, + 0.980502438013, + 0.992988971822, + 1.00547556095, + 1.01795207879, + 1.03040777971, + 1.04283128067, + 1.05521052451, + 1.06753276211, + 1.07978451649, + 1.09195155756, + 1.10401887389, + 1.1159706374, + 1.12779017962, + 1.13945995505, + 1.15096151604, + 1.16227547343, + 1.17338147551, + 1.18425816686, + 1.19488316325, + 1.20523301819, + 1.21528319446, + 1.22500803052, + 1.2343807161, + 1.24337326058, + 1.25195646798, + 1.26009991121, + 1.26777191047, + 1.27493950766, + 1.28156845395, + 1.28762318968, + 1.29306683152, + 1.2978611695, + 1.30196665432, + 1.30534240619, + 1.30794621455, + 1.30973455273, + 1.31066259717, + 1.31068425095, + 1.30975218045, + 1.30781785649, + 1.30483160894, + 1.30074268992, + 1.29549934804, + 1.28904892064, + 1.28133793069, + 1.27231221062, + 1.26191703045, + 1.25009725397, + 1.23679750609, + 1.2219623667, + 1.20553658103, + 1.1874652974, + 1.16769432891, + 1.14617043958, + 1.12284166094, + 1.09765763889, + 1.07057000716, + 1.04153280063, + 1.0105028974, + 0.977440498217, + 0.942309645779, + 0.905078779432, + 0.865721329689, + 0.824216357539, + 0.780549227281, + 0.734712330958, + 0.686705845627, + 0.636538536624, + 0.58422860176, + 0.529804552419, + 0.473306131932, + 0.414785271365, + 0.354307070819, + 0.291950811009, + 0.227810981306, + 0.161998323682, + 0.0946408777008, + 0.0258850230061, + -0.0441035005009, + -0.115138598818, + -0.1870128838, + -0.259496795658, + -0.332337814392, + -0.405259784043, + -0.477962375008, + -0.550120714615, + -0.621385222234, + -0.691381684489, + -0.759711610467, + -0.825952915185, + -0.889660976654, + -0.950370122739, + -1.00759559923, + -1.0608360847, + -1.10957681044, + -1.1532933533, + -1.19145617001, + -1.22353594272, + -1.24900980753, + -1.26736854324, + -1.27812479381, + -1.28082241161, + -1.27504700881, + -1.26043782668, + -1.23670105226, + -1.203624761, + -1.16109572339, + -1.10911843246, + -1.04783685733, + -0.977559689064, + -0.898790193193, + -0.812262327991, + -0.718985542332, + -0.620301777497, + -0.517959743802, + -0.414213753143, + -0.311957467518, + -0.214907043401, + -0.12785583817, + -0.0570139661092, + -0.0106221494909, + 0.000105158633537, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "cutoff_radius": 0.0, + "ultrasoft_cutoff_radius": 0.0 + }, + { + "label": "", + "angular_momentum": 1, + "radial_function": [ + 0.0, + -1.37019537771e-10, + 8.16670411536e-09, + 6.80938274611e-09, + 6.16041917668e-09, + 5.18680028739e-09, + 3.97649835772e-09, + 2.50914657995e-09, + 7.7005869799e-10, + -1.25022340705e-09, + -3.56446332786e-09, + -6.19471315908e-09, + -9.14371213054e-09, + -1.2439007943e-08, + -1.60821976502e-08, + -2.01080383808e-08, + -2.45204541338e-08, + -2.93276362149e-08, + -3.45814754023e-08, + -4.02624333019e-08, + -4.64210941228e-08, + -5.30496487303e-08, + -6.02025186888e-08, + -6.78691421283e-08, + -7.60927634081e-08, + -8.49011760993e-08, + -9.43067922701e-08, + -1.04314165028e-07, + -1.15010070143e-07, + -1.2636911293e-07, + -1.38441013545e-07, + -1.51249653233e-07, + -1.64841091563e-07, + -1.79213280937e-07, + -1.94443385965e-07, + -2.10536647805e-07, + -2.2752020006e-07, + -2.45491985146e-07, + -2.64402746745e-07, + -2.84340506592e-07, + -3.05375873856e-07, + -3.27485662599e-07, + -3.50771432153e-07, + -3.7523742766e-07, + -4.00960692089e-07, + -4.27973653088e-07, + -4.56341276816e-07, + -4.86105147355e-07, + -5.17360943587e-07, + -5.50075077375e-07, + -5.84377669595e-07, + -6.2035725414e-07, + -6.58035127204e-07, + -6.97430258641e-07, + -7.38693258209e-07, + -7.81874497601e-07, + -8.27014286246e-07, + -8.74228670077e-07, + -9.23578237934e-07, + -9.75163019169e-07, + -1.0290609646e-06, + -1.08528683175e-06, + -1.1440832428e-06, + -1.20540932371e-06, + -1.26946985025e-06, + -1.33626147089e-06, + -1.40595333638e-06, + -1.47863480786e-06, + -1.55450057467e-06, + -1.6335078808e-06, + -1.71583878386e-06, + -1.80182675047e-06, + -1.89123953141e-06, + -1.98445806044e-06, + -2.08161066327e-06, + -2.18265654796e-06, + -2.28804295807e-06, + -2.39769434598e-06, + -2.51191606704e-06, + -2.63059972219e-06, + -2.7543141502e-06, + -2.88303964904e-06, + -3.01683815199e-06, + -3.15622898628e-06, + -3.3009701611e-06, + -3.45174495475e-06, + -3.60842239354e-06, + -3.77131277079e-06, + -3.94078735155e-06, + -4.11687468788e-06, + -4.29985533403e-06, + -4.49023569497e-06, + -4.68787787065e-06, + -4.89344222938e-06, + -5.10687421838e-06, + -5.3287239417e-06, + -5.55916932015e-06, + -5.7985910337e-06, + -6.04717932141e-06, + -6.30538132153e-06, + -6.57368542899e-06, + -6.85204378771e-06, + -7.14133041826e-06, + -7.44145682728e-06, + -7.753306209e-06, + -8.07671564382e-06, + -8.41276340906e-06, + -8.76131347526e-06, + -9.1232570031e-06, + -9.49872455246e-06, + -9.88852968121e-06, + -1.02929470288e-05, + -1.07125879645e-05, + -1.11480527319e-05, + -1.15997993616e-05, + -1.20683877374e-05, + -1.25546256933e-05, + -1.30590753859e-05, + -1.35820719527e-05, + -1.41248566961e-05, + -1.46875841741e-05, + -1.52712708472e-05, + -1.58766988541e-05, + -1.6504347927e-05, + -1.71553341503e-05, + -1.78302893849e-05, + -1.85302326176e-05, + -1.92558852771e-05, + -2.0008300687e-05, + -2.07880606829e-05, + -2.1596976789e-05, + -2.24351180431e-05, + -2.33040539936e-05, + -2.42048804975e-05, + -2.51384820397e-05, + -2.6106230328e-05, + -2.71093468522e-05, + -2.81486827504e-05, + -2.92263330303e-05, + -3.03426908675e-05, + -3.14999391008e-05, + -3.26988876641e-05, + -3.3941540385e-05, + -3.52289855152e-05, + -3.656326237e-05, + -3.79455723325e-05, + -3.93778881301e-05, + -4.08619025565e-05, + -4.23995002914e-05, + -4.39923604005e-05, + -4.56425975504e-05, + -4.73524960686e-05, + -4.91233271937e-05, + -5.09582408609e-05, + -5.28588587067e-05, + -5.48276831657e-05, + -5.68670616601e-05, + -5.8979379218e-05, + -6.11675829404e-05, + -6.34337420712e-05, + -6.57812369058e-05, + -6.82123864021e-05, + -7.0730564057e-05, + -7.33382011031e-05, + -7.60391919339e-05, + -7.88363814846e-05, + -8.17331206945e-05, + -8.47330431804e-05, + -8.78396721986e-05, + -9.10567642459e-05, + -9.43881803712e-05, + -9.78381151427e-05, + -0.000101410360553, + -0.000105109125942, + -0.000108939786607, + -0.000112905466921, + -0.000117012228674, + -0.000121264029447, + -0.000125666715652, + -0.000130224781341, + -0.000134944549607, + -0.000139830597404, + -0.000144889862155, + -0.000150127358287, + -0.000155550090907, + -0.000161164117115, + -0.000166976037498, + -0.000172993244151, + -0.000179222227813, + -0.000185670838883, + -0.000192346696536, + -0.000199257476048, + -0.000206411454068, + -0.000213817441676, + -0.000221483573668, + -0.000229419444643, + -0.000237634268491, + -0.000246137738057, + -0.000254939746353, + -0.000264051178771, + -0.00027348202299, + -0.000283244388643, + -0.000293348664636, + -0.000303807824381, + -0.000314633417896, + -0.000325838498931, + -0.000337436512562, + -0.000349440359695, + -0.00036186522169, + -0.000374724699687, + -0.000388034378871, + -0.00040181013406, + -0.000416067767031, + -0.00043082372334, + -0.000446096525009, + -0.000461902466157, + -0.00047826146401, + -0.000495192015788, + -0.000512713984688, + -0.000530848075687, + -0.000549615793836, + -0.00056903825962, + -0.000589139066992, + -0.000609941557465, + -0.000631469729974, + -0.000653749073904, + -0.000676805578032, + -0.000700666264388, + -0.000725358666812, + -0.000750912148382, + -0.000777356560555, + -0.000804721834063, + -0.000833041449316, + -0.000862347079611, + -0.000892673919119, + -0.000924056721332, + -0.000956532306016, + -0.000990138745685, + -0.00102491499335, + -0.00106090168261, + -0.00109814046826, + -0.0011366755675, + -0.00117655074785, + -0.00121781345037, + -0.00126051122969, + -0.00130469385642, + -0.00135041284938, + -0.00139772149905, + -0.00144667481499, + -0.00149732958238, + -0.00154974512992, + -0.00160398207568, + -0.0016601037535, + -0.00171817526, + -0.00177826441367, + -0.0018404407327, + -0.00190477668742, + -0.00197134711056, + -0.00204022935773, + -0.0021115034957, + -0.00218525219644, + -0.00226156155832, + -0.00234051975409, + -0.00242221875772, + -0.00250675380578, + -0.00259422234207, + -0.00268472682869, + -0.00277837159877, + -0.00287526600504, + -0.00297552224005, + -0.00307925719646, + -0.00318659028959, + -0.00329764759441, + -0.00341255664758, + -0.00353145216034, + -0.00365447094424, + -0.00378175708446, + -0.00391345697385, + -0.0040497249831, + -0.00419071801417, + -0.00433660060291, + -0.00448754190683, + -0.00464371673958, + -0.00480530734418, + -0.00497250015269, + -0.00514549037147, + -0.0053244781397, + -0.00550967159403, + -0.00570128582501, + -0.0058995429226, + -0.00610467392487, + -0.00631691612052, + -0.00653651679994, + -0.00676373044402, + -0.00699882160344, + -0.00724206281618, + -0.00749373698494, + -0.00775413674039, + -0.00802356400737, + -0.00830233277923, + -0.00859076691093, + -0.00888920071207, + -0.00919798276652, + -0.00951747105383, + -0.00984803756744, + -0.0101900666057, + -0.0105439564411, + -0.0109101186875, + -0.0112889792427, + -0.0116809799386, + -0.0120865763205, + -0.0125062413413, + -0.0129404636471, + -0.0133897490716, + -0.0138546214248, + -0.0143356227014, + -0.0148333132319, + -0.0153482743139, + -0.0158811058752, + -0.0164324304839, + -0.017002891198, + -0.0175931545108, + -0.0182039097242, + -0.0188358702423, + -0.0194897754691, + -0.0201663892441, + -0.020866503317, + -0.0215909369584, + -0.022340538044, + -0.0231161842282, + -0.0239187847115, + -0.0247492792103, + -0.0256086420503, + -0.0264978813469, + -0.0274180395801, + -0.028370198162, + -0.0293554744834, + -0.030375026517, + -0.0314300530025, + -0.0325217940731, + -0.0336515350432, + -0.0348206051728, + -0.0360303818648, + -0.0372822901705, + -0.0385778062844, + -0.0399184578241, + -0.0413058274494, + -0.042741552392, + -0.0442273290319, + -0.0457649129749, + -0.0473561223695, + -0.0490028392929, + -0.0507070124986, + -0.0524706601945, + -0.0542958708836, + -0.0561848080342, + -0.0581397106193, + -0.0601628980056, + -0.0622567694178, + -0.0644238115971, + -0.0666665963136, + -0.0689877874852, + -0.0713901434483, + -0.0738765174053, + -0.076449865714, + -0.0791132462662, + -0.0818698256085, + -0.0847228806964, + -0.0876758030396, + -0.0907321028638, + -0.0938954121254, + -0.0971694899136, + -0.100558224282, + -0.104065639412, + -0.107695897075, + -0.111453301572, + -0.115342306692, + -0.119367515301, + -0.123533688866, + -0.127845748245, + -0.13230878098, + -0.136928043287, + -0.141708967304, + -0.146657163544, + -0.151778427128, + -0.157078740941, + -0.162564280851, + -0.168241420538, + -0.174116733834, + -0.180197001787, + -0.186489212785, + -0.19300057047, + -0.199738492631, + -0.206710618015, + -0.213924806331, + -0.221389141619, + -0.229111933489, + -0.237101718487, + -0.245367258682, + -0.253917544641, + -0.262761789426, + -0.271909429849, + -0.281370121307, + -0.291153732181, + -0.301270339192, + -0.311730217403, + -0.322543832049, + -0.333721825117, + -0.345275002207, + -0.357214314861, + -0.369550842323, + -0.382295766193, + -0.395460347062, + -0.409055892635, + -0.423093722477, + -0.437585131096, + -0.452541340028, + -0.467973450308, + -0.483892382047, + -0.500308813282, + -0.51723310356, + -0.534675215895, + -0.552644622138, + -0.57115020238, + -0.590200129458, + -0.609801739582, + -0.629961391418, + -0.650684303798, + -0.671974378924, + -0.693834004684, + -0.716263832905, + -0.739262536423, + -0.762826536531, + -0.786949702979, + -0.811623022025, + -0.836834229322, + -0.862567404566, + -0.888802529222, + -0.915514996143, + -0.942675077912, + -0.970247344165, + -0.998190030085, + -1.02645435217, + -1.05498377335, + -1.08371321469, + -1.11256822046, + -1.14146407445, + -1.17030488153, + -1.19898261867, + -1.22737616993, + -1.25535036719, + -1.28275505553, + -1.30942421499, + -1.3351751798, + -1.35980799313, + -1.38310496105, + -1.40483046387, + -1.42473110597, + -1.44253628705, + -1.45795929249, + -1.47069900881, + -1.48044237273, + -1.48686766835, + -1.48964877708, + -1.48846047149, + -1.48298481883, + -1.47291871087, + -1.45798247299, + -1.43792941503, + -1.41255605945, + -1.3817126276, + -1.34531317176, + -1.303344513, + -1.25587290233, + -1.20304706981, + -1.14509613708, + -1.082320792, + -1.01507627974, + -0.943746400278, + -0.868709013899, + -0.790296105728, + -0.708755810389, + -0.624230986527, + -0.536780316457, + -0.446485544614, + -0.35371524203, + -0.25965530933, + -0.167276882365, + -0.0829845586966, + -0.0194464591496, + 0.000219612504687, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "cutoff_radius": 0.0, + "ultrasoft_cutoff_radius": 0.0 + }, + { + "label": "", + "angular_momentum": 1, + "radial_function": [ + 0.0, + -2.18963903986e-10, + -3.57318565319e-08, + -3.20647501789e-08, + -3.21812342283e-08, + -3.18453460977e-08, + -3.14703283629e-08, + -3.10094149429e-08, + -3.0465107747e-08, + -2.98316076102e-08, + -2.91098536783e-08, + -2.82840350782e-08, + -2.73640868524e-08, + -2.63275732685e-08, + -2.51937954808e-08, + -2.39283787203e-08, + -2.25402472519e-08, + -2.10546457549e-08, + -1.9389774356e-08, + -1.76246293225e-08, + -1.56840094154e-08, + -1.36248953792e-08, + -1.13708339231e-08, + -8.98157299042e-09, + -6.40804608985e-09, + -3.6368796142e-09, + -6.86942682869e-10, + 2.41602172261e-09, + 5.78645336178e-09, + 9.3377615913e-09, + 1.31212463033e-08, + 1.71228499465e-08, + 2.13946834871e-08, + 2.58766739067e-08, + 3.06528835912e-08, + 3.56984722205e-08, + 4.09883941662e-08, + 4.66585481896e-08, + 5.25575111499e-08, + 5.87772155435e-08, + 6.54015476096e-08, + 7.22967817559e-08, + 7.96108732304e-08, + 8.72652387391e-08, + 9.53035843004e-08, + 1.03777994672e-07, + 1.12644998667e-07, + 1.21960569025e-07, + 1.31795441451e-07, + 1.41989648316e-07, + 1.52713173317e-07, + 1.64011062758e-07, + 1.75847135135e-07, + 1.88128741577e-07, + 2.01058535116e-07, + 2.14596400346e-07, + 2.28707499347e-07, + 2.43494891717e-07, + 2.58939338288e-07, + 2.75117952814e-07, + 2.92019888043e-07, + 3.09548183674e-07, + 3.28003931054e-07, + 3.47184513869e-07, + 3.67293265257e-07, + 3.8817461924e-07, + 4.09996452664e-07, + 4.32716216525e-07, + 4.5656701509e-07, + 4.81251452757e-07, + 5.06944180497e-07, + 5.34050409787e-07, + 5.61942154389e-07, + 5.911235768e-07, + 6.21625841347e-07, + 6.53111305622e-07, + 6.86237431503e-07, + 7.20541147664e-07, + 7.56431536765e-07, + 7.93378633392e-07, + 8.32201752819e-07, + 8.72603016168e-07, + 9.1436034887e-07, + 9.58173823298e-07, + 1.00331057494e-06, + 1.05065661478e-06, + 1.09971107997e-06, + 1.15064595345e-06, + 1.20382087088e-06, + 1.25895265541e-06, + 1.31610842741e-06, + 1.37592989594e-06, + 1.43767145091e-06, + 1.50217909806e-06, + 1.56890541999e-06, + 1.63843780429e-06, + 1.71059463355e-06, + 1.78565271353e-06, + 1.86341836284e-06, + 1.9442262561e-06, + 2.02845622739e-06, + 2.11541211941e-06, + 2.20619755847e-06, + 2.30004647553e-06, + 2.39792374107e-06, + 2.49895902599e-06, + 2.60444357908e-06, + 2.71344768903e-06, + 2.82695664945e-06, + 2.94442106311e-06, + 3.06662954835e-06, + 3.19327318604e-06, + 3.32471259327e-06, + 3.46118901316e-06, + 3.60267250008e-06, + 3.74935351514e-06, + 3.90170532928e-06, + 4.05989479003e-06, + 4.22347260764e-06, + 4.39377923612e-06, + 4.56993421667e-06, + 4.7527863402e-06, + 4.94261254888e-06, + 5.13911594172e-06, + 5.34311687802e-06, + 5.55455064066e-06, + 5.77394917199e-06, + 6.00132503818e-06, + 6.23717353725e-06, + 6.48114678562e-06, + 6.73510184973e-06, + 6.99753121468e-06, + 7.26984128647e-06, + 7.55223538117e-06, + 7.84476330824e-06, + 8.14808298955e-06, + 8.46265922739e-06, + 8.7880653072e-06, + 9.12629798409e-06, + 9.47592926914e-06, + 9.83894106729e-06, + 1.02146011654e-05, + 1.06043612666e-05, + 1.1007804724e-05, + 1.14264000396e-05, + 1.18597086738e-05, + 1.23088639086e-05, + 1.27742408002e-05, + 1.3256548413e-05, + 1.37560209094e-05, + 1.42735170221e-05, + 1.48102261419e-05, + 1.53652883864e-05, + 1.59411279645e-05, + 1.65374363528e-05, + 1.71551999719e-05, + 1.77951508153e-05, + 1.84578091194e-05, + 1.914478384e-05, + 1.98557942673e-05, + 2.0592841558e-05, + 2.1355929087e-05, + 2.21467549335e-05, + 2.29650602898e-05, + 2.38134123311e-05, + 2.46918851892e-05, + 2.56016410945e-05, + 2.65439544651e-05, + 2.75198950022e-05, + 2.8530622204e-05, + 2.95773565491e-05, + 3.06617855284e-05, + 3.17845346306e-05, + 3.29467775464e-05, + 3.41518087837e-05, + 3.53982499901e-05, + 3.66901184655e-05, + 3.8027193064e-05, + 3.94125224983e-05, + 4.08463667091e-05, + 4.2332097643e-05, + 4.3869562049e-05, + 4.54627341153e-05, + 4.71115271947e-05, + 4.88195883555e-05, + 5.05880715537e-05, + 5.24190478859e-05, + 5.43156532647e-05, + 5.62789269109e-05, + 5.83121590069e-05, + 6.04176621001e-05, + 6.2597688146e-05, + 6.48548201899e-05, + 6.71926791336e-05, + 6.96127429653e-05, + 7.21190047718e-05, + 7.47141420076e-05, + 7.7401322994e-05, + 8.01835079168e-05, + 8.30649401053e-05, + 8.60477965133e-05, + 8.91374765586e-05, + 9.2335595989e-05, + 9.56481397301e-05, + 9.90776479839e-05, + 0.000102628842956, + 0.000106306611021, + 0.000110113955762, + 0.000114057571747, + 0.000118140387269, + 0.00012236828453, + 0.000126746905006, + 0.000131280834152, + 0.000135975202788, + 0.000140837978852, + 0.000145872101554, + 0.000151086393647, + 0.000156485983505, + 0.000162077591867, + 0.000167868490325, + 0.00017386630663, + 0.000180076977905, + 0.000186509662773, + 0.000193172274898, + 0.000200072293413, + 0.00020721904402, + 0.000214621333076, + 0.000222288581719, + 0.000230229784364, + 0.000238455919426, + 0.000246977404927, + 0.000255803260465, + 0.000264947499953, + 0.000274419283008, + 0.000284232476588, + 0.000294398522679, + 0.000304930857583, + 0.000315843362317, + 0.000327149792796, + 0.000338864868929, + 0.000351003338972, + 0.000363582532423, + 0.000376616831105, + 0.000390125127248, + 0.000404124358967, + 0.000418633024267, + 0.000433670716898, + 0.000449257273162, + 0.000465413770093, + 0.000482161389924, + 0.000499523504643, + 0.000517522944323, + 0.000536184579883, + 0.00055553373502, + 0.000575597408374, + 0.000596402630073, + 0.000617978652332, + 0.000640355547076, + 0.000663564663896, + 0.000687638726081, + 0.000712611431879, + 0.000738519208856, + 0.000765398156668, + 0.000793287440132, + 0.000822228119394, + 0.000852261021941, + 0.000883431587658, + 0.000915784644162, + 0.000949369219074, + 0.000984234977493, + 0.00102043522388, + 0.00105802297882, + 0.0010970582896, + 0.0011375985098, + 0.00117970893744, + 0.00122345289169, + 0.00126890156436, + 0.00131612432072, + 0.00136519933209, + 0.00141620316088, + 0.00146922009226, + 0.00152433647568, + 0.00158164237878, + 0.00164123486548, + 0.00170321161952, + 0.00176767964503, + 0.00183474732934, + 0.00190453100745, + 0.00197715180715, + 0.00205273624985, + 0.00213141950112, + 0.00221334021461, + 0.00229864746682, + 0.00238749524991, + 0.00248004776641, + 0.00257647546836, + 0.00267695932203, + 0.00278168945279, + 0.00289086436392, + 0.00300469589775, + 0.00312340509933, + 0.0032472232454, + 0.00337639886919, + 0.00351118867072, + 0.00365186605497, + 0.00379871808598, + 0.00395204816581, + 0.00411217567773, + 0.00427943696139, + 0.00445418895826, + 0.0046368051476, + 0.00482768235139, + 0.00502723802978, + 0.00523591292969, + 0.00545417312946, + 0.00568251047698, + 0.00592144335101, + 0.00617152193109, + 0.00643332411769, + 0.00670746388762, + 0.00699458726643, + 0.00729537903416, + 0.00761056188871, + 0.00794089953248, + 0.00828720159287, + 0.00865032066476, + 0.00903116110591, + 0.00943067809829, + 0.00984988171472, + 0.010289840258, + 0.0107516846439, + 0.0112366085062, + 0.0117458771558, + 0.0122808279612, + 0.0128428733416, + 0.0134335113572, + 0.0140543225525, + 0.0147069806404, + 0.0153932557745, + 0.0161150180872, + 0.0168742479647, + 0.0176730366594, + 0.0185135973806, + 0.0193982680023, + 0.0203295211937, + 0.0213099685434, + 0.0223423721875, + 0.0234296472532, + 0.0245748756052, + 0.0257813105995, + 0.0270523879462, + 0.0283917338941, + 0.0298031753143, + 0.0312907507526, + 0.0328587175386, + 0.034511566536, + 0.0362540292405, + 0.0380910929984, + 0.0400280063218, + 0.0420702998899, + 0.0442237877289, + 0.0464945874584, + 0.0488891307263, + 0.0514141700067, + 0.0540768006592, + 0.0568844630049, + 0.059844961807, + 0.0629664738649, + 0.0662575604231, + 0.0697271786407, + 0.0733846900114, + 0.077239872191, + 0.0813029230932, + 0.0855844734655, + 0.090095587105, + 0.0948477658461, + 0.0998529559077, + 0.10512353833, + 0.110672334685, + 0.116512593901, + 0.122657986847, + 0.129122587793, + 0.135920860499, + 0.143067630764, + 0.150578059715, + 0.158467606546, + 0.166751986071, + 0.17544712011, + 0.184569074248, + 0.194133995334, + 0.204158025141, + 0.214657218588, + 0.225647432284, + 0.23714421588, + 0.249162676509, + 0.261717334524, + 0.274821959836, + 0.288489390795, + 0.302731330839, + 0.317558133255, + 0.332978550051, + 0.348999472949, + 0.365625640843, + 0.382859324216, + 0.400699988002, + 0.419143922244, + 0.43818385183, + 0.457808514707, + 0.478002218055, + 0.498744365435, + 0.520008963857, + 0.541764101124, + 0.563971413924, + 0.586585530685, + 0.609553504806, + 0.632814247282, + 0.6562979491, + 0.679925524579, + 0.703608060549, + 0.727246308533, + 0.750730205846, + 0.773938469812, + 0.796738255216, + 0.81898491809, + 0.840521892434, + 0.861180711265, + 0.880781204435, + 0.899131889998, + 0.916030607165, + 0.931265417495, + 0.944615809519, + 0.955854254972, + 0.964748144241, + 0.971062149559, + 0.974561050315, + 0.975013054735, + 0.972193648524, + 0.965890001655, + 0.955905932003, + 0.942067444414, + 0.924228816353, + 0.902279200405, + 0.876149676053, + 0.845820660321, + 0.811329536206, + 0.772778330116, + 0.730341192726, + 0.684271407505, + 0.634907556342, + 0.582678412069, + 0.528106052284, + 0.471806590997, + 0.414487853153, + 0.356943242296, + 0.300040960556, + 0.244707721682, + 0.191906046296, + 0.14260427467, + 0.0977384975579, + 0.0581657776392, + 0.0246083054257, + -0.00241146653586, + -0.0226440779558, + -0.0361932914503, + -0.0436008446735, + -0.0459319355905, + -0.0448560033428, + -0.0427153530258, + -0.0425718026811, + -0.0482188425003, + -0.0641438593018, + -0.0954219769054, + -0.147520304761, + -0.225989337503, + -0.336017702248, + -0.481828482952, + -0.665901657641, + -0.888020148104, + -1.14415984601, + -1.42528162728, + -1.71614206715, + -1.99432841463, + -2.22985439668, + -2.38584313005, + -2.42109389167, + -2.2957108196, + -1.98150044405, + -1.47960368107, + -0.848601636701, + -0.249970051033, + 0.0042461387208, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "cutoff_radius": 0.0, + "ultrasoft_cutoff_radius": 0.0 + }, + { + "label": "", + "angular_momentum": 2, + "radial_function": [ + 0.0, + 7.36092833525e-15, + 1.09661924708e-10, + 1.01044472315e-10, + 1.04126664428e-10, + 1.06114898769e-10, + 1.08276448755e-10, + 1.10494116098e-10, + 1.12788398478e-10, + 1.15166051712e-10, + 1.17636585139e-10, + 1.20210251233e-10, + 1.22897043697e-10, + 1.25709000336e-10, + 1.28658378121e-10, + 1.31759213113e-10, + 1.35024653259e-10, + 1.38471927879e-10, + 1.4211627051e-10, + 1.4597661445e-10, + 1.5007148398e-10, + 1.54422703994e-10, + 1.59051096471e-10, + 1.63981626141e-10, + 1.69238482464e-10, + 1.74850343423e-10, + 1.8084535853e-10, + 1.87254877532e-10, + 1.94113082662e-10, + 2.01454724362e-10, + 2.09316909573e-10, + 2.17743265184e-10, + 2.26773884751e-10, + 2.36456168701e-10, + 2.4684155316e-10, + 2.57978394318e-10, + 2.69925667633e-10, + 2.82743946663e-10, + 2.9649242821e-10, + 3.11244403513e-10, + 3.2706642967e-10, + 3.44041187367e-10, + 3.62242465501e-10, + 3.81760922602e-10, + 4.02699070918e-10, + 4.25126505005e-10, + 4.49183773787e-10, + 4.74953309533e-10, + 5.02563421463e-10, + 5.32142944299e-10, + 5.63808942346e-10, + 5.97725622476e-10, + 6.34016854391e-10, + 6.72865429831e-10, + 7.14413266145e-10, + 7.58860272564e-10, + 8.06386440969e-10, + 8.57190099112e-10, + 9.1149425732e-10, + 9.69503948048e-10, + 1.03147690023e-09, + 1.09765822132e-09, + 1.16832036986e-09, + 1.24373057453e-09, + 1.32421732898e-09, + 1.41006661241e-09, + 1.50164631969e-09, + 1.59929004917e-09, + 1.70339250783e-09, + 1.81433161141e-09, + 1.93254892182e-09, + 2.05849380513e-09, + 2.19262291217e-09, + 2.33545935122e-09, + 2.4874978541e-09, + 2.64934878558e-09, + 2.82154471939e-09, + 3.00478769553e-09, + 3.19966854565e-09, + 3.40691694627e-09, + 3.62729764352e-09, + 3.86153117249e-09, + 4.11053119509e-09, + 4.37510908281e-09, + 4.65618500896e-09, + 4.95478856057e-09, + 5.27188821276e-09, + 5.60864180481e-09, + 5.96615122686e-09, + 6.34563384257e-09, + 6.74842100978e-09, + 7.17581026724e-09, + 7.62927408501e-09, + 8.11033915041e-09, + 8.62055870794e-09, + 9.16162787295e-09, + 9.73539533712e-09, + 1.03436498378e-08, + 1.0988442407e-08, + 1.16718360052e-08, + 1.23960666582e-08, + 1.31634784073e-08, + 1.39764833025e-08, + 1.48377304766e-08, + 1.57499763128e-08, + 1.67160662972e-08, + 1.77391218547e-08, + 1.88223174458e-08, + 1.99690743505e-08, + 2.11829845176e-08, + 2.24678192253e-08, + 2.38276402786e-08, + 2.52665607523e-08, + 2.67891174636e-08, + 2.83999386877e-08, + 3.01039613639e-08, + 3.19065332453e-08, + 3.38129589516e-08, + 3.5829181603e-08, + 3.7961230267e-08, + 4.02156545114e-08, + 4.25991660468e-08, + 4.51189665191e-08, + 4.77826085773e-08, + 5.0598144861e-08, + 5.35737816566e-08, + 5.67186501523e-08, + 6.004179162e-08, + 6.35533447329e-08, + 6.72634318164e-08, + 7.11831530746e-08, + 7.53239884733e-08, + 7.96980050538e-08, + 8.43182980878e-08, + 8.91979700502e-08, + 9.43514910449e-08, + 9.97937599868e-08, + 1.05540710707e-07, + 1.11608755528e-07, + 1.18015657031e-07, + 1.2477983576e-07, + 1.31920620394e-07, + 1.39458673933e-07, + 1.47415829893e-07, + 1.55814309809e-07, + 1.64678647554e-07, + 1.7403381062e-07, + 1.83906627218e-07, + 1.94325042569e-07, + 2.05318631274e-07, + 2.16918602287e-07, + 2.29157771588e-07, + 2.42070369166e-07, + 2.55693542728e-07, + 2.70064768951e-07, + 2.85224964179e-07, + 3.01216410831e-07, + 3.18084195103e-07, + 3.35875230831e-07, + 3.54639136329e-07, + 3.74428767501e-07, + 3.95298522497e-07, + 4.17306876697e-07, + 4.40515209831e-07, + 4.64987043241e-07, + 4.90791185742e-07, + 5.17997948805e-07, + 5.46683642175e-07, + 5.76926258926e-07, + 6.08809974234e-07, + 6.42422409809e-07, + 6.77855353481e-07, + 7.15206616318e-07, + 7.54578868166e-07, + 7.96079073052e-07, + 8.39821518573e-07, + 8.8592521262e-07, + 9.3451632196e-07, + 9.85727191491e-07, + 1.03969696208e-06, + 1.09657296858e-06, + 1.15650921101e-06, + 1.21966847434e-06, + 1.28622260941e-06, + 1.3563504906e-06, + 1.43024297198e-06, + 1.50809934596e-06, + 1.59012957393e-06, + 1.67655507141e-06, + 1.76760850132e-06, + 1.86353509792e-06, + 1.96459191297e-06, + 2.07105203903e-06, + 2.18319891589e-06, + 2.30133461648e-06, + 2.42577462771e-06, + 2.55685223242e-06, + 2.69491736293e-06, + 2.84033817486e-06, + 2.99350359426e-06, + 3.15482005742e-06, + 3.32471776095e-06, + 3.50364883299e-06, + 3.69208694929e-06, + 3.89053342074e-06, + 4.09951368209e-06, + 4.3195807005e-06, + 4.55131735367e-06, + 4.79533552642e-06, + 5.05227924944e-06, + 5.32282607371e-06, + 5.6076887844e-06, + 5.90761751211e-06, + 6.22339965724e-06, + 6.55586493571e-06, + 6.90588575835e-06, + 7.27437867263e-06, + 7.66230861706e-06, + 8.07068978042e-06, + 8.50058841517e-06, + 8.953126286e-06, + 9.42948234054e-06, + 9.93089722708e-06, + 1.04586724507e-05, + 1.10141805251e-05, + 1.15988604065e-05, + 1.22142276258e-05, + 1.28618730769e-05, + 1.35434706885e-05, + 1.42607785846e-05, + 1.50156452062e-05, + 1.58100123172e-05, + 1.66459228616e-05, + 1.75255192389e-05, + 1.84510572116e-05, + 1.94249030069e-05, + 2.0449545513e-05, + 2.15275977169e-05, + 2.26618041857e-05, + 2.38550494153e-05, + 2.51103608379e-05, + 2.64309199089e-05, + 2.78200648784e-05, + 2.9281304929e-05, + 3.08183197621e-05, + 3.24349776673e-05, + 3.41353311632e-05, + 3.59236484904e-05, + 3.78043905575e-05, + 3.97822530537e-05, + 4.18621572486e-05, + 4.40492672463e-05, + 4.63490027376e-05, + 4.87670423424e-05, + 5.13093496067e-05, + 5.3982173491e-05, + 5.67920655058e-05, + 5.97458976569e-05, + 6.28508699479e-05, + 6.61145285299e-05, + 6.95447831323e-05, + 7.31499171266e-05, + 7.69386106413e-05, + 8.09199526294e-05, + 8.51034599395e-05, + 8.94990948078e-05, + 9.4117293525e-05, + 9.89689590977e-05, + 0.000104065516692, + 0.000109418905568, + 0.000115041616101, + 0.000120946703396, + 0.000127147813273, + 0.000133659204202, + 0.000140495766701, + 0.000147673056149, + 0.000155207302529, + 0.000163115449765, + 0.000171415168526, + 0.000180124884659, + 0.000189263807931, + 0.000198851949623, + 0.000208910153273, + 0.000219460113214, + 0.000230524405352, + 0.000242126499528, + 0.000254290807664, + 0.000267042659256, + 0.000280408374517, + 0.000294415246281, + 0.000309091576525, + 0.000324466681559, + 0.000340570908363, + 0.000357435650261, + 0.00037509334441, + 0.00039357748091, + 0.00041292260168, + 0.00043316429305, + 0.000454339174359, + 0.000476484882396, + 0.000499640043851, + 0.000523844240725, + 0.000549137983268, + 0.000575562634138, + 0.000603160369531, + 0.000631974080062, + 0.000662047324102, + 0.000693424152527, + 0.000726149065146, + 0.000760266822036, + 0.000795822287582, + 0.000832860269171, + 0.000871425273022, + 0.00091156129936, + 0.000953311544542, + 0.000996718118852, + 0.00104182168965, + 0.00108866110338, + 0.00113727296409, + 0.00118769113637, + 0.0012399462371, + 0.00129406501839, + 0.00135006971859, + 0.00140797733961, + 0.00146779881172, + 0.00152953815349, + 0.00159319138399, + 0.0016587455534, + 0.00172617744961, + 0.00179545231117, + 0.00186652237597, + 0.00193932527053, + 0.00201378225272, + 0.00208979631691, + 0.00216725004223, + 0.00224600333592, + 0.00232589085458, + 0.00240671930634, + 0.00248826438998, + 0.0025702675456, + 0.00265243234256, + 0.00273442060297, + 0.00281584813775, + 0.00289628012949, + 0.00297522608956, + 0.00305213447025, + 0.00312638658934, + 0.00319729039111, + 0.00326407333605, + 0.00332587490738, + 0.0033817384631, + 0.00343060235101, + 0.00347129042177, + 0.00350250167723, + 0.00352279917678, + 0.00353059805425, + 0.00352415257713, + 0.00350154230123, + 0.00346065710097, + 0.0033991811299, + 0.00331457562838, + 0.00320406044802, + 0.00306459428801, + 0.00289285359664, + 0.00268520991344, + 0.00243770588739, + 0.00214602943664, + 0.00180548656447, + 0.00141097221998, + 0.000956939491479, + 0.000437366956172, + -0.000154275895424, + -0.000825065089604, + -0.00158266061777, + -0.00243534684638, + -0.00339207486548, + -0.00446250685468, + -0.00565706235488, + -0.00698696637859, + -0.00846429939991, + -0.0101020488464, + -0.0119141622579, + -0.0139156016086, + -0.0161223987643, + -0.0185517115082, + -0.0212218802263, + -0.0241524840483, + -0.0273643967713, + -0.0308798412437, + -0.0347224419304, + -0.0389172745085, + -0.0434909118443, + -0.0484714648889, + -0.0538886175839, + -0.0597736541533, + -0.0661594771585, + -0.0730806147917, + -0.0805732149564, + -0.0886750245437, + -0.0974253506912, + -0.106865002096, + -0.117036206806, + -0.127982503644, + -0.139748603661, + -0.152380217566, + -0.165923845959, + -0.180426526603, + -0.195935535813, + -0.212498037948, + -0.230160678693, + -0.248969116798, + -0.268967489179, + -0.290197804349, + -0.312699258701, + -0.336507471632, + -0.361653634297, + -0.388163568677, + -0.416056694012, + -0.445344898176, + -0.476031314169, + -0.50810900213, + -0.541559540785, + -0.576351533779, + -0.612439040042, + -0.649759940495, + -0.688234258642, + -0.72776245551, + -0.768223727931, + -0.809474342685, + -0.8513460482, + -0.893644612405, + -0.936148544471, + -0.978608067162, + -1.02074441676, + -1.0622495576, + -1.10278640835, + -1.14198968818, + -1.17946749908, + -1.21480377027, + -1.24756169528, + -1.27728829669, + -1.30352025151, + -1.32579110456, + -1.34363998289, + -1.35662190221, + -1.36431972298, + -1.36635776482, + -1.36241702752, + -1.35225188168, + -1.33570798998, + -1.31274109085, + -1.28343612145, + -1.24802597293, + -1.20690895896, + -1.16066383745, + -1.11006096232, + -1.05606785911, + -0.999847234613, + -0.942745154861, + -0.886266894109, + -0.832037796465, + -0.781746457229, + -0.737067679872, + -0.699563081571, + -0.670558000981, + -0.65099462633, + -0.641263152628, + -0.641015441391, + -0.648969267611, + -0.662715945759, + -0.678550057631, + -0.691347204452, + -0.694524083395, + -0.680124400303, + -0.639083461909, + -0.561732382152, + -0.438607457811, + -0.261627750513, + -0.0256886531832, + 0.269317346839, + 0.616112008118, + 0.997457085066, + 1.38377902462, + 1.73169687893, + 1.98464908648, + 2.07755449652, + 1.94853449975, + 1.56234656911, + 0.952235707794, + 0.292627330908, + -0.00421249048137, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "cutoff_radius": 0.0, + "ultrasoft_cutoff_radius": 0.0 + } + ], + "D_ion": [ + 0.3095561261815, + -0.4665184671565, + 0, + 0, + 0, + -0.4665184671565, + -0.776300898955, + 0, + 0, + 0, + 0, + 0, + 5.65765187905, + -7.5557394498, + 0, + 0, + 0, + -7.5557394498, + 9.7791181628, + 0, + 0, + 0, + 0, + 0, + 17.58229520215 + ], + "augmentation": [ + { + "radial_function": [ + -0.0, + -3.10813206842731e-10, + -1.2645953156206298e-09, + -2.894322976059238e-09, + -5.234294590055404e-09, + -8.320179042377378e-09, + -1.2189066165820302e-08, + -1.6879519001054406e-08, + -2.24316279141523e-08, + -2.888706663718835e-08, + -3.628915029820346e-08, + -4.468289551112478e-08, + -5.4115082597741163e-08, + -6.463432001422107e-08, + -7.62911110630376e-08, + -8.913792296598464e-08, + -1.0322925838343955e-07, + -1.1862172946502368e-07, + -1.3537413451764522e-07, + -1.5354753739141565e-07, + -1.7320534965210437e-07, + -1.9441341568643638e-07, + -2.172401007850556e-07, + -2.4175638234930084e-07, + -2.6803594430870223e-07, + -2.9615527486862957e-07, + -3.261937677228512e-07, + -3.582338267891642e-07, + -3.9236097469300873e-07, + -4.2866396501202243e-07, + -4.6723489852094137e-07, + -5.081693434903255e-07, + -5.515664602428017e-07, + -5.975291300698651e-07, + -6.461640886974874e-07, + -6.975820644288131e-07, + -7.518979211336421e-07, + -8.09230806292786e-07, + -8.69704304186459e-07, + -9.334465945075325e-07, + -1.000590616531604e-06, + -1.0712742389849178e-06, + -1.1456404359792107e-06, + -1.2238374689958357e-06, + -1.3060190753460533e-06, + -1.3923446631548295e-06, + -1.4829795132387849e-06, + -1.5780949879781538e-06, + -1.6778687475901305e-06, + -1.782484973915557e-06, + -1.8921346020031387e-06, + -2.00701555988605e-06, + -2.1273330166454076e-06, + -2.2532996392476357e-06, + -2.385135858228418e-06, + -2.523070142790085e-06, + -2.6673392854408336e-06, + -2.8181886965696077e-06, + -2.9758727093429892e-06, + -3.1406548952253246e-06, + -3.31280839050735e-06, + -3.492616234220368e-06, + -3.680371717901961e-06, + -3.876378747471918e-06, + -4.080952217794435e-06, + -4.294418400247646e-06, + -4.51711534386572e-06, + -4.749393290440793e-06, + -4.991615104000105e-06, + -5.244156715427624e-06, + -5.507407582368878e-06, + -5.781771165361039e-06, + -6.067665420314197e-06, + -6.3655233083584564e-06, + -6.675793323303676e-06, + -6.998940037471617e-06, + -7.335444666531417e-06, + -7.685805654063747e-06, + -8.050539276311875e-06, + -8.430180268060738e-06, + -8.82528247033976e-06, + -9.23641950039925e-06, + -9.664185445372818e-06, + -1.0109195579597256e-05, + -1.0572087107248884e-05, + -1.1053519930569282e-05, + -1.1554177444730084e-05, + -1.2074767360819337e-05, + -1.261602255617488e-05, + -1.3178701956278126e-05, + -1.3763591444768368e-05, + -1.4371504807252398e-05, + -1.5003284706852424e-05, + -1.5659803693237612e-05, + -1.6341965248122698e-05, + -1.705070486452612e-05, + -1.7786991167098702e-05, + -1.85518270678962e-05, + -1.9346250963083113e-05, + -2.017133797326496e-05, + -2.102820122490592e-05, + -2.1917993174627226e-05, + -2.2841906984039854e-05, + -2.380117793729279e-05, + -2.4797084911175767e-05, + -2.5830951894883837e-05, + -2.6904149561676004e-05, + -2.8018096896930345e-05, + -2.9174262880057934e-05, + -3.0374168228063286e-05, + -3.16193871957373e-05, + -3.291154944124992e-05, + -3.425234195386201e-05, + -3.5643511051559324e-05, + -3.70868644440344e-05, + -3.858427336985361e-05, + -4.01376748059969e-05, + -4.1749073756358324e-05, + -4.3420545615577425e-05, + -4.5154238617505565e-05, + -4.695237636921127e-05, + -4.881726046793081e-05, + -5.075127321419452e-05, + -5.2756880416292375e-05, + -5.4836634289404035e-05, + -5.6993176460914634e-05, + -5.922924107281976e-05, + -6.154765799581478e-05, + -6.395135615400335e-05, + -6.644336696229532e-05, + -6.902682788562209e-05, + -7.170498611990405e-05, + -7.448120239704511e-05, + -7.735895492779771e-05, + -8.03418434752981e-05, + -8.343359357347158e-05, + -8.663806088510878e-05, + -8.995923571889495e-05, + -9.340124769490617e-05, + -9.696837057529701e-05, + -0.00010066502726085125, + -0.00010449579495756064, + -0.00010846541052776163, + -0.00011257877601928042, + -0.00011684096438801857, + -0.00012125722541786553, + -0.00012583299184609892, + -0.0001305738856990663, + -0.0001354857248443849, + -0.00014057452977152594, + -0.00014584653060794364, + -0.00015130817437150997, + -0.0001569661324767027, + -0.00016282730850094887, + -0.00016889884621485644, + -0.00017518813789104933, + -0.00018170283289761232, + -0.00018845084659382234, + -0.0001954403695212884, + -0.0002026798769202542, + -0.00021017813857226425, + -0.0002179442289771138, + -0.00022598753788592854, + -0.0002343177811917294, + -0.00024294501219941994, + -0.0002518796332778647, + -0.0002611324079171397, + -0.00027071447319735166, + -0.00028063735269150114, + -0.0002909129698015979, + -0.00030155366156589227, + -0.0003125721929295606, + -0.00032398177150893637, + -0.0003357960628686289, + -0.00034802920631189636, + -0.0003606958312219155, + -0.00037381107396296405, + -0.00038739059535756825, + -0.0004014505987612, + -0.00041600784876657523, + -0.00043107969053742353, + -0.0004466840698141782, + -0.00046283955359773454, + -0.00047956535154634774, + -0.0004968813381024969, + -0.000514808075378343, + -0.0005333668368221044, + -0.0005525796316974178, + -0.000572469230395107, + -0.0005930591906143375, + -0.0006143738844325435, + -0.0006364385263082188, + -0.0006592792020329153, + -0.0006829228986650165, + -0.0007073975355055546, + -0.0007327319961038697, + -0.0007589561613723584, + -0.0007861009438244197, + -0.0008141983229683898, + -0.0008432813819236598, + -0.0008733843452615369, + -0.0009045426181492264, + -0.0009367928268107618, + -0.0009701728603717511, + -0.0010047219141194517, + -0.0010404805342176136, + -0.00107749066396182, + -0.001115795691581243, + -0.0011554404996534265, + -0.0011964715162071575, + -0.0012389367675487628, + -0.001282885932845927, + -0.0013283704006447259, + -0.0013754433270848723, + -0.0014241596963257828, + -0.0014745763828691578, + -0.0015267522159561247, + -0.0015807480461829415, + -0.0016366268143845125, + -0.0016944536227241425, + -0.0017542958081895388, + -0.0018162230186873527, + -0.0018803072914566439, + -0.0019466231342058751, + -0.002015247609039487, + -0.0020862604190872943, + -0.00215974399785111, + -0.0022357836019357945, + -0.0023144674063815098, + -0.0023958866035122942, + -0.002480135504814509, + -0.0025673116463204304, + -0.0026575158974124677, + -0.0027508525731825637, + -0.0028474295504884173, + -0.002947358387855427, + -0.003050754449197645, + -0.0031577370317242134, + -0.0032684294978663365, + -0.0033829594116010866, + -0.0035014586790765296, + -0.0036240636939332623, + -0.0037509154871074955, + -0.0038821598817226203, + -0.004017947652694128, + -0.0041584346916720295, + -0.004303782176971637, + -0.004454156749183012, + -0.004609730692238318, + -0.004770682120169155, + -0.004937195169660478, + -0.005109460199072065, + -0.005287673993032854, + -0.005472039974067535, + -0.005662768420306622, + -0.005860076690051376, + -0.006064189453485479, + -0.006275338931265225, + -0.0064937651401922964, + -0.00671971614693984, + -0.006953448328705181, + -0.0071952266422867575, + -0.007445324900870764, + -0.0077040260590211665, + -0.007971622506293135, + -0.008248416369200741, + -0.00853471982224322, + -0.008830855407398702, + -0.00913715636353237, + -0.00945396696431982, + -0.009781642866590145, + -0.010120551467443702, + -0.010471072272091046, + -0.010833597271236475, + -0.011208531328939259, + -0.011596292580779597, + -0.01199731284253488, + -0.012412038029717572, + -0.012840928587821689, + -0.01328445993337668, + -0.013743122906355975, + -0.014217424233668941, + -0.014707887003637295, + -0.015215051152369303, + -0.015739473960403177, + -0.016281730562350858, + -0.016842414466057665, + -0.01742213808473991, + -0.018021533279319435, + -0.01864125191242213, + -0.019281966413230423, + -0.01994437035391187, + -0.020629179035507834, + -0.021337130085354705, + -0.022068984064490683, + -0.022825525084262097, + -0.023607561433335353, + -0.024415926212395883, + -0.02525147797841853, + -0.026115101395802063, + -0.0270077078955786, + -0.027930236339510327, + -0.028883653690996308, + -0.029868955689259815, + -0.030887167528311135, + -0.031939344536149286, + -0.03302657285663332, + -0.03414997012952201, + -0.03531068616909788, + -0.03650990363758592, + -0.037748838714660095, + -0.039028741756422757, + -0.04035089794629278, + -0.04171662793198146, + -0.043127288446618166, + -0.04458427291263701, + -0.04608901202285885, + -0.047642974296544675, + -0.04924766660764879, + -0.05090463467886655, + -0.05261546353912711, + -0.054381777938984764, + -0.05620524271924609, + -0.0580875631263109, + -0.06003048507026619, + -0.06203579531811324, + -0.06410532161500368, + -0.06624093272858574, + -0.06844453840459692, + -0.07071808923113651, + -0.07306357639699558, + -0.07548303133927603, + -0.07797852526659008, + -0.08055216855044245, + -0.0832061099711969, + -0.08594253580675873, + -0.08876366875230048, + -0.09167176665664947, + -0.09466912106004756, + -0.09775805551933672, + -0.10094092370414226, + -0.10422010724608306, + -0.10759801332357984, + -0.11107707196230394, + -0.11465973303020252, + -0.11834846291991825, + -0.12214574085839974, + -0.1260540548718179, + -0.13007589734445943, + -0.13421376015359301, + -0.13847012936631167, + -0.14284747944909543, + -0.14734826698901024, + -0.15197492386826567, + -0.15672984987121655, + -0.16161540470967, + -0.1666338994017306, + -0.171787586992103, + -0.17707865256485716, + -0.18250920253357786, + -0.18808125314653248, + -0.1937967181833188, + -0.19965739580783415, + -0.20566495453001088, + -0.21182091825297442, + -0.21812665034841006, + -0.22458333673252365, + -0.23119196792910052, + -0.23795332003463462, + -0.24486793460469508, + -0.25193609739008266, + -0.25915781591683684, + -0.26653279589276674, + -0.2740604163829976, + -0.2817397037736698, + -0.2895693044996717, + -0.2975474565286954, + -0.30567195961163546, + -0.3139401442915318, + -0.32234883972509565, + -0.33089434031089615, + -0.33957237119057243, + -0.34837805268197375, + -0.3573058636816872, + -0.3663496041722383, + -0.37550235692474937, + -0.384756448488113, + -0.39410340967386664, + -0.40353393567943746, + -0.41303784602564, + -0.4226040446114711, + -0.4322204800613457, + -0.441874106729753, + -0.4515508466395976, + -0.46123555277699707, + -0.4709119741015692, + -0.4805627227613514, + -0.4901692439936494, + -0.49971178926189563, + -0.5091693932267208, + -0.518519855180595, + -0.5277397256688852, + -0.5368042990107912, + -0.5456876125548529, + -0.5543624534732609, + -0.56280037405071, + -0.570971716349837, + -0.5788456472812589, + -0.5863902050929444, + -0.5935723583058269, + -0.6003580781975295, + -0.6067124258991895, + -0.6125996551963381, + -0.6179833320795056, + -0.6228264720912084, + -0.6270916964233231, + -0.6307414076773881, + -0.6337379860503299, + -0.6360440066276284, + -0.6376224782465567, + -0.6384371042324238, + -0.6384525650416026, + -0.6376348225801365, + -0.6359514456347126, + -0.6333719554841881, + -0.6298681903478076, + -0.6254146868578033, + -0.6199890762536622, + -0.6135724924231647, + -0.6061499883650635, + -0.5977109570123402, + -0.5882495517164364, + -0.5777651010848713, + -0.5662625121919643, + -0.5537526555942935, + -0.5402527250075557, + -0.5257865640290591, + -0.5103849518601506, + -0.4940858397596111, + -0.4769345298194529, + -0.4589837877560682, + -0.4402938816996049, + -0.42093253952312987, + -0.4009748180616929, + -0.38050287859408183, + -0.35960566431689434, + -0.3383784770234525, + -0.31692245182655915, + -0.29534393041003365, + -0.27375373482943993, + -0.2522663449337002, + -0.23099898305038202, + -0.21007060899552799, + -0.18960082670422174, + -0.16970870012132844, + -0.150511470272341, + -0.1321231574025658, + -0.11465302151598518, + -0.09820384239121008, + -0.08286996703262518, + -0.06873506142647459, + -0.05586949852801919, + -0.044327323183594634, + -0.03414276862082716, + -0.025326376189153465, + -0.01786091675284113, + -0.011697567795853675, + -0.006753221651078724, + -0.0029104684903582013, + -2.282770167956069e-05, + 0.00207064584805261, + 0.00351560494182, + 0.00441283898452, + 0.00484909403264, + 0.00491020611255, + 0.00468005276806, + 0.00423893286248, + 0.00366185532357, + 0.00301676623573, + 0.00236276597159, + 0.00174840458927, + 0.00121018745585, + 0.000771479420345, + 0.0004420533675, + 0.000218579971928, + 8.63712468653e-05, + 2.26307282275e-05, + 1.25250554252e-06, + -1.26581069081e-06, + -1.59167758968e-07, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 0, + "j": 0, + "angular_momentum": 0 + }, + { + "radial_function": [ + -0.0, + -2.8258368323147895e-10, + -1.149738795535119e-09, + -2.6314468913991583e-09, + -4.7588912295952425e-09, + -7.564501077908094e-09, + -1.1081997594787163e-08, + -1.534644134268634e-08, + -2.0394281490357184e-08, + -2.6263406763549183e-08, + -3.2993198204389004e-08, + -4.062458380361674e-08, + -4.9200095071231214e-08, + -5.876392561144712e-08, + -6.936199177548375e-08, + -8.104199546099521e-08, + -9.385348913556263e-08, + -1.0784794316166585e-07, + -1.2307881550130849e-07, + -1.396016238916607e-07, + -1.5747402055414716e-07, + -1.767558695699959e-07, + -1.9750932696299966e-07, + -2.1979892362236241e-07, + -2.436916511446439e-07, + -2.6925705070338633e-07, + -2.9656730506894206e-07, + -3.2569733383137827e-07, + -3.567248920309436e-07, + -3.897306722078764e-07, + -4.247984100892127e-07, + -4.6201499396121685e-07, + -5.014705779126241e-07, + -5.432586990423767e-07, + -5.874763988030029e-07, + -6.342243485962672e-07, + -6.836069797753752e-07, + -7.357326182429205e-07, + -7.907136237256324e-07, + -8.486665339812459e-07, + -9.097122140574612e-07, + -9.7397601073121e-07, + -1.0415879124637885e-06, + -1.1126827148558003e-06, + -1.1874001919900312e-06, + -1.2658852737052846e-06, + -1.3482882291381647e-06, + -1.4347648566235802e-06, + -1.5254766803243547e-06, + -1.6205911536917131e-06, + -1.720281870015025e-06, + -1.8247287804197896e-06, + -1.9341184193997617e-06, + -2.048644138325997e-06, + -2.1685063469989043e-06, + -2.293912763758664e-06, + -2.4250786742707403e-06, + -2.562227199344532e-06, + -2.705589572136426e-06, + -2.8554054250110994e-06, + -3.0119230864113306e-06, + -3.17539988807913e-06, + -3.3461024830518226e-06, + -3.5243071746682673e-06, + -3.710300257108928e-06, + -3.904378367761695e-06, + -4.106848851927309e-06, + -4.318030140216519e-06, + -4.538252139016529e-06, + -4.7678566347261975e-06, + -5.007197711886047e-06, + -5.2566421860595525e-06, + -5.516570051580206e-06, + -5.787374945086772e-06, + -6.0694646250711524e-06, + -6.363261468129562e-06, + -6.669202982490605e-06, + -6.987742339479712e-06, + -7.319348923336477e-06, + -7.664508900240502e-06, + -8.02372580717826e-06, + -8.39752116105991e-06, + -8.786435089370118e-06, + -9.191026982326974e-06, + -9.611876168057181e-06, + -1.0049582611035621e-05, + -1.0504767634743605e-05, + -1.0978074669893526e-05, + -1.1470170027515723e-05, + -1.1981743700738135e-05, + -1.2513510192131171e-05, + -1.306620937177723e-05, + -1.3640607364194372e-05, + -1.4237497465701048e-05, + -1.4857701094934116e-05, + -1.5502068774058488e-05, + -1.6171481147315147e-05, + -1.6866850031791948e-05, + -1.758911950540589e-05, + -1.8339267034549016e-05, + -1.9118304639085665e-05, + -1.992728009633314e-05, + -2.076727819098406e-05, + -2.163942200386167e-05, + -2.2544874248452995e-05, + -2.348483865258984e-05, + -2.4460561387306832e-05, + -2.5473332546969638e-05, + -2.652448767836601e-05, + -2.7615409365839596e-05, + -2.8747528867907683e-05, + -2.9922327813333325e-05, + -3.114133995366906e-05, + -3.2406152979365816e-05, + -3.371841039528799e-05, + -3.507981346366879e-05, + -3.649212321285728e-05, + -3.795716251784674e-05, + -3.947681824928297e-05, + -4.105304349941147e-05, + -4.2687859885784355e-05, + -4.438335993036845e-05, + -4.6141709526082294e-05, + -4.796515048636429e-05, + -4.9856003180794195e-05, + -5.181666926724179e-05, + -5.384963451227151e-05, + -5.595747171307134e-05, + -5.8142843719936466e-05, + -6.04085065611887e-05, + -6.2757312678829e-05, + -6.519221427486275e-05, + -6.771626677036418e-05, + -7.033263238986434e-05, + -7.304458386451517e-05, + -7.585550826693693e-05, + -7.87689109730211e-05, + -8.178841976821634e-05, + -8.491778908876246e-05, + -8.816090441307462e-05, + -9.152178680388628e-05, + -9.500459760493422e-05, + -9.861364330539328e-05, + -0.0001023533805661024, + -0.00010622842142160939, + -0.00011024353866156374, + -0.00011440367139887302, + -0.0001187139308289774, + -0.0001231796061859071, + -0.0001278061709059068, + -0.00013259928900513214, + -0.00013756482167210315, + -0.0001427088340907731, + -0.0001480376025000256, + -0.00015355762149298722, + -0.00015927561156952664, + -0.000165198526947394, + -0.00017133356364806151, + -0.0001776881678510046, + -0.00018427004454346405, + -0.00019108716646677165, + -0.00019814778336642788, + -0.00020546043156578192, + -0.0002130339438645333, + -0.00022087745978198646, + -0.00022900043614746868, + -0.00023741265805888142, + -0.0002461242502151832, + -0.0002551456886432188, + -0.00026448781281815777, + -0.0002741618382119436, + -0.00028417936926276676, + -0.0002945524127928965, + -0.00030529339189242925, + -0.0003164151602692617, + -0.00032793101709948123, + -0.00033985472238634015, + -0.00035220051284237436, + -0.0003649831183142545, + -0.0003782177787794717, + -0.0003919202619146984, + -0.00040610688127437367, + -0.00042079451508505566, + -0.0004360006256873753, + -0.00045174327964083843, + -0.00046804116851744055, + -0.00048491363040433497, + -0.000502380672144637, + -0.0005204629923339561, + -0.000539182005106195, + -0.0005585598647261658, + -0.0005786194910290158, + -0.0005993845957212339, + -0.0006208797095727459, + -0.000643130210554786, + -0.0006661623529123344, + -0.0006900032972430546, + -0.0007146811415954176, + -0.0007402249536156906, + -0.000766664803803823, + -0.0007940317998803931, + -0.0008223581223357024, + -0.0008516770611734077, + -0.0008820230539092878, + -0.0009134317248535789, + -0.00094593992571252, + -0.000979585777586796, + -0.0010144087143720173, + -0.0010504495276215035, + -0.00108775041293933, + -0.001126355017935442, + -0.0011663084917735043, + -0.0012076575364708398, + -0.0012504504597364479, + -0.001294737229812689, + -0.001340569532034465, + -0.00138800082726729, + -0.001437086412354654, + -0.0014878834826189112, + -0.001540451196359141, + -0.0015948507415272015, + -0.0016511454047560962, + -0.0017094006424857881, + -0.0017696841545534973, + -0.0018320659603077247, + -0.001896618477166271, + -0.001963416601630422, + -0.0020325377933608163, + -0.0021040621616019673, + -0.002178072554786169, + -0.002254654652873394, + -0.002333897062857901, + -0.0024158914173633473, + -0.0025007324764472483, + -0.002588518232741915, + -0.0026793500200655664, + -0.0027733326254774766, + -0.00287057440510837, + -0.0029711874036140312, + -0.003075287477591957, + -0.0031829944228718684, + -0.003294432106036644, + -0.0034097285999756767, + -0.003529016324019388, + -0.003652432188310862, + -0.003780117742978534, + -0.003912219331789083, + -0.004048888250904124, + -0.00419028091253598, + -0.004336559013709152, + -0.004487889710219699, + -0.004644445796397369, + -0.004806405889852083, + -0.004973954622525382, + -0.005147282837178543, + -0.005326587790011867, + -0.005512073359673534, + -0.0057039502624067605, + -0.00590243627351289, + -0.0061077564560039835, + -0.006320143395412082, + -0.006539837442106364, + -0.006767086960458498, + -0.007002148585293798, + -0.007245287485998073, + -0.007496777638022913, + -0.007756902102415941, + -0.00802595331282456, + -0.008304233371272495, + -0.008592054351421376, + -0.008889738611030255, + -0.00919761911209959, + -0.0095160397504483, + -0.009845355693633389, + -0.010185933728037127, + -0.010538152614940295, + -0.010902403455742121, + -0.01127909006661838, + -0.011668629362448875, + -0.012071451750072591, + -0.01248800153133361, + -0.01291873731563556, + -0.013364132441876135, + -0.013824675410550252, + -0.014300870324498994, + -0.014793237340738006, + -0.015302313130151178, + -0.01582865134814046, + -0.016372823113649862, + -0.01693541749783548, + -0.017517042021581716, + -0.01811832316245081, + -0.018739906869071638, + -0.01938245908477149, + -0.020046666278963482, + -0.020733235985488038, + -0.02144289734890913, + -0.02217640167619792, + -0.02293452299540739, + -0.023718058618768127, + -0.024527829711182985, + -0.025364681861100576, + -0.026229485655375556, + -0.027123137254768823, + -0.02804655897128959, + -0.02900069984310065, + -0.02998653620901801, + -0.03100507227833737, + -0.032057340696169216, + -0.033144403100638126, + -0.03426735067289792, + -0.035427304673731785, + -0.03662541696869766, + -0.03786287053627951, + -0.03914087995701015, + -0.040460691882012255, + -0.041823585475602464, + -0.04323087282961441, + -0.04468389934658085, + -0.04618404408560486, + -0.04773272006840365, + -0.04933137454009179, + -0.05098148918004925, + -0.0526845802565144, + -0.054442198720836076, + -0.05625593023398324, + -0.058127395118335076, + -0.06005824822976007, + -0.06205017873866877, + -0.06410490981710264, + -0.06622419821799537, + -0.06840983374162152, + -0.07066363857613941, + -0.07298746650480929, + -0.07538320196683415, + -0.07785275896031014, + -0.0803980797759164, + -0.08302113354750339, + -0.08572391460489324, + -0.08850844061539064, + -0.09137675049823969, + -0.09433090209485133, + -0.09737296957809198, + -0.10050504058163379, + -0.10372921302935553, + -0.10704759165726664, + -0.11046228417271012, + -0.11397539707508535, + -0.1175890310818424, + -0.1213052761425268, + -0.1251262060272585, + -0.12905387244439448, + -0.13309029868544023, + -0.13723747274398965, + -0.1414973398891198, + -0.1458717946797998, + -0.15036267236162534, + -0.15497173963457156, + -0.1597006847475528, + -0.164551106906127, + -0.16952450493762522, + -0.1746222651930028, + -0.17984564865460526, + -0.18519577720835181, + -0.19067361906084093, + -0.19627997325216717, + -0.20201545324216968, + -0.2078804695609038, + -0.21387521145125835, + -0.2199996275249889, + -0.22625340537378652, + -0.2326359501361182, + -0.23914636201142317, + -0.24578341267894965, + -0.25254552064759744, + -0.2594307255262557, + -0.2664366612202504, + -0.27356052807684905, + -0.2807990639890551, + -0.2881485145232832, + -0.295604602086184, + -0.3031624942117916, + -0.3108167710462035, + -0.31856139209140155, + -0.3263896623582183, + -0.33429419804293947, + -0.34226689184633513, + -0.3502988781600654, + -0.35838049829189217, + -0.36650126593474663, + -0.3746498331984494, + -0.38281395741825996, + -0.39098046912228734, + -0.3991352414694439, + -0.40726316159988085, + -0.4153481042916288, + -0.4233729084331279, + -0.4313193568204329, + -0.439168159851547, + -0.44689894373603856, + -0.4544902438695745, + -0.46191950410488414, + -0.4691630826474575, + -0.4761962654064552, + -0.48299328760930765, + -0.4895273646105436, + -0.4957707327659883, + -0.5016947013558422, + -0.5072697165224856, + -0.5124654381899836, + -0.5172508309752986, + -0.5215942700543816, + -0.525463662940643, + -0.5288265880691695, + -0.531650451039217, + -0.533902659253122, + -0.5355508155966341, + -0.5365629316337237, + -0.5369076606385355, + -0.5365545505458156, + -0.535474316665545, + -0.533639133701517, + -0.5310229462799111, + -0.5276017968061881, + -0.5233541690402925, + -0.5182613453086549, + -0.5123077747416971, + -0.5054814493902571, + -0.4977742844452569, + -0.48918249821211446, + -0.47970698682462426, + -0.4693536880453457, + -0.45813392791749197, + -0.44606474340695984, + -0.43316917367808205, + -0.4194765122040685, + -0.4050225116270858, + -0.3898495330983476, + -0.37400663192114053, + -0.35754957157022116, + -0.3405407587360122, + -0.3230490928916334, + -0.30514972508510163, + -0.28692372219445605, + -0.2684576347073001, + -0.24984296828620944, + -0.2311755617261962, + -0.21255487636312137, + -0.19408320435842225, + -0.17586480533618704, + -0.15800498211165395, + -0.14060910654082204, + -0.12378160503293563, + -0.10762490971012784, + -0.09223837468350347, + -0.07771714701549429, + -0.06415096820447994, + -0.051622864198007365, + -0.04020766084717603, + -0.029970238703797593, + -0.02096341989858805, + -0.013225366559649301, + -0.006776375535931321, + -0.0016149948031472154, + 0.0022865109653125034, + 0.0049871152667845696, + 0.006581812535081505, + 0.007205029677916021, + 0.007030493408541561, + 0.006263864056414468, + 0.005122140005364618, + 0.00379118114616, + 0.00238459898996, + 0.000988061692417, + -0.000321025012724, + -0.00147533142568, + -0.00242005491162, + -0.00311533225663, + -0.00353846555533, + -0.00368573756637, + -0.00357351160051, + -0.00323820912018, + -0.00273467305856, + -0.00213236309009, + -0.00150886759686, + -0.000940426131965, + -0.000489707916017, + -0.000192207767088, + -4.46902554885e-05, + -2.68995630643e-06, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 0, + "j": 1, + "angular_momentum": 0 + }, + { + "radial_function": [ + -0.0, + -1.1302851548636158e-15, + -9.276116206883956e-15, + -3.2118800380323715e-14, + -7.81134951807439e-14, + -1.5654450850365843e-13, + -2.7758403359385173e-13, + -4.523545175942224e-13, + -6.929948734824256e-13, + -1.0127307568656975e-12, + -1.4259491413290186e-12, + -1.9482774390624165e-12, + -2.5966674271317315e-12, + -3.3894842539894528e-12, + -4.346600816380244e-12, + -5.489497812265576e-12, + -6.841369792691929e-12, + -8.427237553131858e-12, + -1.0274067223298452e-11, + -1.2410896435417873e-11, + -1.4868967967777032e-11, + -1.7681871290865873e-11, + -2.0885692454358998e-11, + -2.451917278893838e-11, + -2.8623876915107167e-11, + -3.3244370581666093e-11, + -3.842840888748756e-11, + -4.4227135456575806e-11, + -5.0695293195344796e-11, + -5.7891447257444626e-11, + -6.587822091551835e-11, + -7.472254504171436e-11, + -8.449592196517092e-11, + -9.527470449494295e-11, + -1.0714039095675417e-10, + -1.201799371233648e-10, + -1.3448608597375332e-10, + -1.5015771627646592e-10, + -1.6730021101293708e-10, + -1.8602584676125372e-10, + -2.0645420518013906e-10, + -2.28712607791553e-10, + -2.529365753945809e-10, + -2.7927031339234446e-10, + -3.0786722452133993e-10, + -3.388904504269285e-10, + -3.725134437125754e-10, + -4.089205720801549e-10, + -4.483077563752066e-10, + -4.90883144335323e-10, + -5.368678219950396e-10, + -5.864965648516106e-10, + -6.400186308789694e-10, + -6.976985977518871e-10, + -7.598172465821339e-10, + -8.266724948106331e-10, + -8.985803808355722e-10, + -9.758761032101903e-10, + -1.0589151173905844e-09, + -1.1480742931236743e-09, + -1.243753135766108e-09, + -1.346375074990043e-09, + -1.4563888245607659e-09, + -1.574269816939853e-09, + -1.7005217168433318e-09, + -1.835678017946232e-09, + -1.980303727287816e-09, + -2.1349971420550006e-09, + -2.3003917236709063e-09, + -2.4771580746097924e-09, + -2.6660060232051946e-09, + -2.8676868225434327e-09, + -3.0829954692652247e-09, + -3.312773149040898e-09, + -3.55790981526227e-09, + -3.819346908207155e-09, + -4.098080222208242e-09, + -4.395162928819777e-09, + -4.711708764153284e-09, + -5.0488953893741115e-09, + -5.407967933607796e-09, + -5.790242728737185e-09, + -6.197111246938045e-09, + -6.630044251009902e-09, + -7.090596169657417e-09, + -7.580409709170568e-09, + -8.101220714268414e-09, + -8.654863291999506e-09, + -9.243275210886824e-09, + -9.86850359348219e-09, + -1.053271091307324e-08, + -1.1238181315885699e-08, + -1.198732728259082e-08, + -1.2782696647819879e-08, + -1.3626979998962506e-08, + -1.452301846959609e-08, + -1.5473811956136478e-08, + -1.6482527771431204e-08, + -1.7552509763740334e-08, + -1.8687287927754693e-08, + -1.9890588528417438e-08, + -2.1166344764983334e-08, + -2.2518708012830207e-08, + -2.395205966010265e-08, + -2.547102358270278e-08, + -2.7080479284729866e-08, + -2.87855757402345e-08, + -3.059174597774326e-08, + -3.250472243980779e-08, + -3.453055316822254e-08, + -3.667561884691648e-08, + -3.894665075922798e-08, + -4.135074969858717e-08, + -4.3895405892968626e-08, + -4.6588519984289366e-08, + -4.943842513033957e-08, + -5.245391028066295e-08, + -5.564424469625453e-08, + -5.901920376645432e-08, + -6.258909620459004e-08, + -6.636479269162192e-08, + -7.035775603250015e-08, + -7.458007292676688e-08, + -7.904448742175354e-08, + -8.376443613694469e-08, + -8.875408537163015e-08, + -9.402837016644306e-08, + -9.96030354472766e-08, + -1.0549467935046721e-07, + -1.1172079883973663e-07, + -1.1829983774854042e-07, + -1.252512373653794e-07, + -1.3259548969059285e-07, + -1.4035419353045602e-07, + -1.485501135468911e-07, + -1.5720724244413957e-07, + -1.6635086642957678e-07, + -1.7600763416155467e-07, + -1.8620562932291024e-07, + -1.9697444704383944e-07, + -2.0834527436253033e-07, + -2.203509749308132e-07, + -2.3302617821523734e-07, + -2.464073733899288e-07, + -2.6053300819667996e-07, + -2.7544359302499525e-07, + -2.911818104912542e-07, + -3.077926307985212e-07, + -3.2532343317686457e-07, + -3.4382413373914554e-07, + -3.6334732008776807e-07, + -3.839483929998878e-07, + -4.0568571559673217e-07, + -4.286207703825426e-07, + -4.528183245461342e-07, + -4.783466039804316e-07, + -5.052774764636836e-07, + -5.336866445161106e-07, + -5.636538483681326e-07, + -5.952630796520893e-07, + -6.286028063396153e-07, + -6.637662094991611e-07, + -7.008514325398005e-07, + -7.399618435478093e-07, + -7.812063114468993e-07, + -8.246994966587374e-07, + -8.705621570711147e-07, + -9.189214700805998e-07, + -9.699113715941696e-07, + -1.0236729127991763e-06, + -1.0803546357509076e-06, + -1.1401129686411505e-06, + -1.2031126418520181e-06, + -1.2695271258999762e-06, + -1.3395390923213594e-06, + -1.4133408988123404e-06, + -1.49113509984059e-06, + -1.5731349840434357e-06, + -1.659565139824638e-06, + -1.750662050698569e-06, + -1.8466747218069619e-06, + -1.9478653393694162e-06, + -2.054509964686423e-06, + -2.1668992645793128e-06, + -2.2853392801258692e-06, + -2.4101522357201392e-06, + -2.541677390542277e-06, + -2.6802719346956208e-06, + -2.8263119322894473e-06, + -2.980193313984894e-06, + -3.1423329215165824e-06, + -3.3131696070120866e-06, + -3.493165389859839e-06, + -3.6828066741318445e-06, + -3.882605529943912e-06, + -4.093101041715723e-06, + -4.314860727183229e-06, + -4.548482030674051e-06, + -4.794593894476789e-06, + -5.053858412619861e-06, + -5.326972571027994e-06, + -5.6146700788944455e-06, + -5.9177232957645485e-06, + -6.236945259534103e-06, + -6.573191820494927e-06, + -6.927363886879222e-06, + -7.300409788086168e-06, + -7.693327761287274e-06, + -8.107168567984856e-06, + -8.543038247526366e-06, + -9.00210101450988e-06, + -9.485582307324616e-06, + -9.994771997002721e-06, + -1.0531027761411759e-05, + -1.109577863849858e-05, + -1.169052876360741e-05, + -1.2316861301699054e-05, + -1.2976442585532006e-05, + -1.3671026470307952e-05, + -1.440245891436534e-05, + -1.5172682799218195e-05, + -1.5983743002935933e-05, + -1.683779173534642e-05, + -1.7737094152886872e-05, + -1.8684034267489148e-05, + -1.9681121162412795e-05, + -2.0730995529813526e-05, + -2.1836436555036514e-05, + -2.300036915297759e-05, + -2.422587158672918e-05, + -2.5516183479679774e-05, + -2.6874714247095723e-05, + -2.830505196606993e-05, + -2.9810972706951302e-05, + -3.139645035066484e-05, + -3.3065666917707795e-05, + -3.4823023432924914e-05, + -3.6673151357995825e-05, + -3.862092461610092e-05, + -4.0671472243761156e-05, + -4.283019169831297e-05, + -4.5102762859693326e-05, + -4.7495162755960685e-05, + -5.001368105874801e-05, + -5.266493637860167e-05, + -5.545589341076276e-05, + -5.839388096546632e-05, + -6.148661093918421e-05, + -6.474219826780328e-05, + -6.816918191379215e-05, + -7.177654693939224e-05, + -7.55737477328959e-05, + -7.95707324240038e-05, + -8.377796857808884e-05, + -8.820647020990667e-05, + -9.28678261979739e-05, + -9.7774230174513e-05, + -0.00010293851195603262, + -0.00010837417059373986, + -0.0001140954091465471, + -0.00012011717123186662, + -0.00012645517947850328, + -0.00013312597595572918, + -0.0001401469646872652, + -0.00014753645636301577, + -0.00015531371534810797, + -0.00016349900912069606, + -0.0001721136602399058, + -0.0001811801010091943, + -0.00019072193092559692, + -0.0002007639771077383, + -0.00021133235779827422, + -0.00022245454915112038, + -0.0002341594554277434, + -0.00024647748279911253, + -0.00025944061692479434, + -0.0002730825045013616, + -0.0002874385389872781, + -0.0003025459507046636, + -0.0003184439015367358, + -0.00033517358446726633, + -0.00035277832819173235, + -0.00037130370704690845, + -0.00039079765655689, + -0.0004113105948114116, + -0.0004328955500725795, + -0.0004556082947821428, + -0.000479507486426509, + -0.0005046548154888916, + -0.0005311151609025662, + -0.0005589567533466863, + -0.0005882513468094473, + -0.0006190743987400765, + -0.0006515052593135813, + -0.0006856273701987266, + -0.0007215284732712921, + -0.0007593008298328828, + -0.0007990414507372357, + -0.0008408523380694296, + -0.0008848407388322431, + -0.000931119411313126, + -0.0009798069046154513, + -0.0010310278521287336, + -0.0010849132794661896, + -0.0011416009276956373, + -0.0012012355924016754, + -0.001263969479534176, + -0.0013299625786577795, + -0.0013993830545305456, + -0.001472407657742103, + -0.0015492221554875383, + -0.001630021783125654, + -0.001715011717766153, + -0.00180440757467994, + -0.0018984359276110214, + -0.001997334854169154, + -0.002101354507264901, + -0.0022107577138233293, + -0.0023258206020482846, + -0.002446833258317294, + -0.002574100415134612, + -0.002707942171417353, + -0.0028486947465224265, + -0.0029967112693544194, + -0.003152362604167013, + -0.003316038214471887, + -0.0034881470665777473, + -0.0036691185745525547, + -0.003859403587912028, + -0.004059475424199479, + -0.004269830947697406, + -0.0044909916964365765, + -0.004723505058986205, + -0.004967945503159222, + -0.005224915858305425, + -0.00549504865310435, + -0.005779007510890777, + -0.006077488604382106, + -0.006391222171666938, + -0.006720974095540842, + -0.007067547548118184, + -0.007431784702562509, + -0.007814568513910223, + -0.008216824570757758, + -0.008639523019505683, + -0.00908368056458391, + -0.00955036254182911, + -0.01004068507265394, + -0.010555817296140068, + -0.011096983681159273, + -0.011665466421296594, + -0.012262607910730656, + -0.01288981330544662, + -0.013548553166473295, + -0.014240366186508509, + -0.014966862002357011, + -0.01572972408805656, + -0.016530712730713708, + -0.01737166808534896, + -0.01825451330978411, + -0.019181257772716162, + -0.020154000333396798, + -0.021174932688928408, + -0.02224634278214428, + -0.0233706182661492, + -0.024550250014473397, + -0.025787835669439024, + -0.027086083222849652, + -0.028447814607577455, + -0.029875969296306575, + -0.03137360788394363, + -0.03294391564017828, + -0.03459020601391466, + -0.0363159240588063, + -0.03812464976161755, + -0.040020101241684224, + -0.04200613778809117, + -0.04408676269979127, + -0.046266125882999574, + -0.04854852616870147, + -0.050938413289932954, + -0.0534403894679707, + -0.05605921054545302, + -0.058799786586397465, + -0.0616671818789346, + -0.06466661425100283, + -0.0678034535921064, + -0.07108321949511885, + -0.0745115778932818, + -0.07809433655549416, + -0.08183743932651608, + -0.08574695892755071, + -0.08982908817496933, + -0.09409012941191597, + -0.09853648197370676, + -0.10317462744656825, + -0.10801111249652234, + -0.11305252900230983, + -0.1183054912139877, + -0.12377660963680621, + -0.1294724613058146, + -0.1353995561168445, + -0.1415642988201028, + -0.14797294630037086, + -0.15463155969189782, + -0.1615459509237532, + -0.16872162318610348, + -0.17616370486377275, + -0.18387687643711267, + -0.19186528981924972, + -0.20013247964652547, + -0.20868126600209408, + -0.21751364809877044, + -0.22663068844201065, + -0.2360323870881034, + -0.24571754562552953, + -0.255683620660659, + -0.26592656661511394, + -0.2764406679109598, + -0.287218360676582, + -0.2982500444554139, + -0.30952388458440105, + -0.3210256062988505, + -0.33273828199473593, + -0.3446421135337907, + -0.3567142120005818, + -0.3689283779500476, + -0.38125488579845784, + -0.3936602768413029, + -0.40610716609165454, + -0.41855406907258935, + -0.4309552555841739, + -0.44326063832864504, + -0.45541570522527214, + -0.467361505018041, + -0.4790346964678702, + -0.4903676718584102, + -0.5012887657204569, + -0.5117225593541013, + -0.5215902909062117, + -0.5308103791765628, + -0.5392990668833144, + -0.5469711856072291, + -0.5537410399186146, + -0.5595234021426901, + -0.5642346017089183, + -0.5677936841530504, + -0.5701236047171852, + -0.5711524105228291, + -0.5708143541773161, + -0.5690508715332941, + -0.5658113487738511, + -0.5610536013722737, + -0.5547439928644723, + -0.5468571387392404, + -0.537375174936471, + -0.5262866270495078, + -0.513585001066609, + -0.4992673346074083, + -0.4833331015357242, + -0.46578404984339666, + -0.44662575912839736, + -0.4258718979307381, + -0.4035522792649838, + -0.37972574150017574, + -0.3544984281373798, + -0.32804688817107, + -0.3006430655112818, + -0.2726739068023028, + -0.2446407885759151, + -0.21711142621647644, + -0.19057980487, + -0.165301736297, + -0.141444775729, + -0.119164133197, + -0.098603411689, + -0.0798920540749, + -0.0631413921111, + -0.0484389450382, + -0.0358407685939, + -0.0253619659592, + -0.0169659703472, + -0.0105539354576, + -0.00595650384824, + -0.00293127819801, + -0.00117023451472, + -0.000321563017152, + -2.90012105657e-05, + 1.3098865427e-05, + 1.84740134192e-06, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 0, + "j": 2, + "angular_momentum": 1 + }, + { + "radial_function": [ + 0.0, + 2.0087595114667607e-15, + 1.648565105722433e-14, + 5.708200755031312e-14, + 1.388244600616966e-13, + 2.7821321797905573e-13, + 4.933264536300975e-13, + 8.039311445715731e-13, + 1.2316007464000873e-12, + 1.7998400896845676e-12, + 2.5342179163462316e-12, + 3.4625074939700728e-12, + 4.6148357707703635e-12, + 6.023841559226432e-12, + 7.72484326405474e-12, + 9.75601669767638e-12, + 1.2158583557084805e-11, + 1.4977011167306074e-11, + 1.8259224129471083e-11, + 2.2056828548812326e-11, + 2.642534954781246e-11, + 3.1424482823940774e-11, + 3.711836103083033e-11, + 4.3575835825295693e-11, + 5.087077645484469e-11, + 5.908238581458025e-11, + 6.829553495741694e-11, + 7.860111707059993e-11, + 9.009642203626849e-11, + 1.0288553268740556e-10, + 1.1707974400212028e-10, + 1.3279800648355047e-10, + 1.501673950906644e-10, + 1.6932360512123495e-10, + 1.904114765547361e-10, + 2.1358554841872914e-10, + 2.390106448407763e-10, + 2.668624945548272e-10, + 2.973283856673682e-10, + 3.306078576746372e-10, + 3.6691343275651927e-10, + 4.064713884769119e-10, + 4.495225742589869e-10, + 4.963232739132423e-10, + 5.471461168653168e-10, + 6.022810406493489e-10, + 6.620363075594417e-10, + 7.267395783335241e-10, + 7.967390460932368e-10, + 8.724046337355594e-10, + 9.541292582476993e-10, + 1.0423301656851319e-09, + 1.1374503405223332e-09, + 1.2399599935739448e-09, + 1.3503581325771153e-09, + 1.4691742201338976e-09, + 1.5969699235987702e-09, + 1.7343409619473411e-09, + 1.8819190549228473e-09, + 2.040373979952204e-09, + 2.2104157426799216e-09, + 2.392796867261713e-09, + 2.5883148129666397e-09, + 2.7978145237587895e-09, + 3.0221911181972706e-09, + 3.262392727103363e-09, + 3.5194234870885793e-09, + 3.79434669825639e-09, + 4.088288154833617e-09, + 4.402439658365986e-09, + 4.738062722837847e-09, + 5.09649248254286e-09, + 5.4791418130535796e-09, + 5.887505677313328e-09, + 6.3231657084784115e-09, + 6.787795042405661e-09, + 7.2831634131703695e-09, + 7.811142525820178e-09, + 8.373711720886388e-09, + 8.972963946632448e-09, + 9.61111205547639e-09, + 1.0290495441436194e-08, + 1.1013587037876009e-08, + 1.1783000693425352e-08, + 1.2601498947672995e-08, + 1.3472001226980463e-08, + 1.4397592483099817e-08, + 1.538153229928545e-08, + 1.6427264485558984e-08, + 1.753842719540883e-08, + 1.8718863583015636e-08, + 1.9972633038932342e-08, + 2.1304023028760174e-08, + 2.2717561568055596e-08, + 2.4218030371279437e-08, + 2.5810478702061e-08, + 2.7500237975585223e-08, + 2.929293713748566e-08, + 3.119451886979291e-08, + 3.3211256671297236e-08, + 3.534977284922715e-08, + 3.7617057470996184e-08, + 4.002048834268474e-08, + 4.2567852044606575e-08, + 4.526736610128974e-08, + 4.8127702334031185e-08, + 5.1158011459760075e-08, + 5.436794900987771e-08, + 5.7767702626389205e-08, + 6.136802082532311e-08, + 6.51802432843104e-08, + 6.921633275509644e-08, + 7.34889086703295e-08, + 7.801128255189109e-08, + 8.279749529393133e-08, + 8.786235644071203e-08, + 9.322148555062054e-08, + 9.889135577050646e-08, + 1.0488933971518715e-07, + 1.1123375779703919e-07, + 1.1794392912872947e-07, + 1.250402251140665e-07, + 1.325441259073882e-07, + 1.4047827986293088e-07, + 1.488665661315568e-07, + 1.5773416060406975e-07, + 1.6710760532654707e-07, + 1.7701488161600534e-07, + 1.874854870520991e-07, + 1.9855051654117063e-07, + 2.1024274769011734e-07, + 2.2259673069893976e-07, + 2.3564888300031207e-07, + 2.4943758894080434e-07, + 2.640033047139427e-07, + 2.7938866886731505e-07, + 2.9563861862743265e-07, + 3.1280051242058854e-07, + 3.309242588359956e-07, + 3.5006245242864436e-07, + 3.7027051669656904e-07, + 3.9160685460072166e-07, + 4.1413300707232954e-07, + 4.379138198565338e-07, + 4.630176191816593e-07, + 4.895163967030623e-07, + 5.17486004217465e-07, + 5.470063586478791e-07, + 5.781616578317784e-07, + 6.110406077075343e-07, + 6.457366614950461e-07, + 6.823482714522633e-07, + 7.209791539281669e-07, + 7.61738568396942e-07, + 8.047416111713484e-07, + 8.501095246040818e-07, + 8.979700225651633e-07, + 9.484576331078447e-07, + 1.0017140590975474e-06, + 1.0578885578906595e-06, + 1.1171383409904532e-06, + 1.1796289947003328e-06, + 1.245534922957409e-06, + 1.3150398134233176e-06, + 1.3883371281301846e-06, + 1.4656306198831394e-06, + 1.5471348758530064e-06, + 1.6330758897206831e-06, + 1.723691663943676e-06, + 1.8192328435816282e-06, + 1.9199633835438613e-06, + 2.0261612507915273e-06, + 2.138119163454831e-06, + 2.2561453688267953e-06, + 2.3805644620995215e-06, + 2.511718248173706e-06, + 2.649966648701838e-06, + 2.795688656698612e-06, + 2.949283341224801e-06, + 3.1111709048933647e-06, + 3.2817937967265705e-06, + 3.4616178834897106e-06, + 3.6511336823734904e-06, + 3.85085765836882e-06, + 4.061333589631683e-06, + 4.28313400443699e-06, + 4.516861693421613e-06, + 4.763151301120732e-06, + 5.022671000838746e-06, + 5.296124257320073e-06, + 5.584251681675648e-06, + 5.887832983570211e-06, + 6.207689025547498e-06, + 6.54468398482396e-06, + 6.899727628549319e-06, + 7.27377770778407e-06, + 7.667842477024654e-06, + 8.082983345498148e-06, + 8.520317667015944e-06, + 8.98102167603556e-06, + 9.466333576960427e-06, + 9.977556795251428e-06, + 1.051606339831335e-05, + 1.1083297695374915e-05, + 1.168078002545218e-05, + 1.2310110743049707e-05, + 1.2972974412551207e-05, + 1.3671144221383073e-05, + 1.4406486623590367e-05, + 1.518096622622234e-05, + 1.599665093080038e-05, + 1.6855717342685155e-05, + 1.7760456464588244e-05, + 1.8713279683099954e-05, + 1.9716725072524308e-05, + 2.077346402486891e-05, + 2.188630822514335e-05, + 2.3058216991527633e-05, + 2.4292304998972032e-05, + 2.5591850403148046e-05, + 2.6960303388258776e-05, + 2.8401295163446942e-05, + 2.991864742273178e-05, + 3.151638229999188e-05, + 3.319873284438875e-05, + 3.4970154038993596e-05, + 3.683533438869416e-05, + 3.879920812156449e-05, + 4.0866968012958004e-05, + 4.304407888575361e-05, + 4.533629180632141e-05, + 4.77496590221495e-05, + 5.0290549674354035e-05, + 5.296566632577899e-05, + 5.578206234766197e-05, + 5.874716021025162e-05, + 6.186877071973497e-05, + 6.515511325770127e-05, + 6.861483706606058e-05, + 7.225704363898844e-05, + 7.609131027181008e-05, + 8.012771483481957e-05, + 8.437686182353972e-05, + 8.884990976664544e-05, + 9.355860004385168e-05, + 9.851528720257615e-05, + 0.00010373297083283005, + 0.00010922532909938618, + 0.00011500675400275932, + 0.00012109238846006441, + 0.00012749816529666444, + 0.00013424084826606843, + 0.00014133807516021978, + 0.00014880840316775366, + 0.00015667135655010773, + 0.00016494747677741944, + 0.00017365837525470896, + 0.00018282678875117093, + 0.00019247663767024055, + 0.00020263308733967195, + 0.00021332261241612663, + 0.00022457306462116358, + 0.0002364137439360133, + 0.00024887547344364737, + 0.000261990678013564, + 0.0002757934670006743, + 0.000290319721185836, + 0.0003056071841316683, + 0.0003216955582401191, + 0.0003386266056649013, + 0.0003564442544129677, + 0.00037519470979597707, + 0.0003949265715954217, + 0.0004156909571514928, + 0.0004375416307131527, + 0.00046053513934130806, + 0.0004847309556925885, + 0.0005101916280366211, + 0.0005369829378464158, + 0.000565174065332688, + 0.00059483776334025, + 0.0006260505399933961, + 0.0006588928505056664, + 0.0006934492986582576, + 0.0007298088483036157, + 0.0007680650455679777, + 0.0008083162520270267, + 0.0008506658896314269, + 0.0008952226977522153, + 0.0009421010030399568, + 0.0009914210026595223, + 0.0010433090616061875, + 0.001097898024621613, + 0.0011553275435824072, + 0.0012157444209926545, + 0.0012793029702979123, + 0.0013461653939417495, + 0.0014165021797993315, + 0.0014904925170468283, + 0.0015683247321796694, + 0.0016501967462727158, + 0.0017363165542309271, + 0.0018269027272846592, + 0.0019221849395377828, + 0.0020224045198922683, + 0.002127815030151509, + 0.002238682870829286, + 0.00235528791557543, + 0.0024779241756682415, + 0.0026069004956576916, + 0.002742541281836693, + 0.0028851872644430916, + 0.0030351962955267433, + 0.0031929441835979433, + 0.003358825566651173, + 0.003533254825309189, + 0.0037166670374199928, + 0.003909518975892964, + 0.004112290151589565, + 0.004325483902709724, + 0.004549628532688521, + 0.004785278498306511, + 0.005033015649905509, + 0.005293450525433501, + 0.005567223700468993, + 0.005855007195968017, + 0.006157505945607012, + 0.006475459325003617, + 0.0068096427441645705, + 0.0071608693059477275, + 0.007529991531617559, + 0.007917903156109846, + 0.008325540994327458, + 0.00875388688082787, + 0.009203969684342731, + 0.00967686739887135, + 0.010173709313174135, + 0.010695678260069206, + 0.011244012946772288, + 0.01182001036776097, + 0.012425028301201818, + 0.013060487889650634, + 0.013727876305776987, + 0.014428749503305333, + 0.015164735053016154, + 0.015937535066433774, + 0.016748929198698755, + 0.017600777740091837, + 0.018495024787106303, + 0.01943370149234377, + 0.020418929393356575, + 0.021452923812225393, + 0.022537997328114536, + 0.02367656331137369, + 0.02487113951549833, + 0.026124351724689878, + 0.02743893744131841, + 0.02881774960953547, + 0.030263760360980982, + 0.031780064776248326, + 0.033369884641750176, + 0.03503657219027215, + 0.03678361380889685, + 0.038614633692321855, + 0.040533397424478625, + 0.04254381545874688, + 0.0446499464729081, + 0.04685600057713086, + 0.04916634232649456, + 0.05158549351937915, + 0.054118135729218725, + 0.05676911253393175, + 0.05954343139913912, + 0.062446265150261526, + 0.0654829529898828, + 0.06865900099436342, + 0.07198008202147134, + 0.07545203495918731, + 0.07908086322861371, + 0.08287273246938963, + 0.086833967298927, + 0.09097104705464379, + 0.09529060041221742, + 0.09979939874600093, + 0.10450434812743636, + 0.10941247981903139, + 0.11453093909832625, + 0.11986697228609118, + 0.12542791179568355, + 0.13122115900861311, + 0.13725416482791444, + 0.1435344076551116, + 0.15006936861615125, + 0.1568665037722018, + 0.16393321310718625, + 0.1712768060009659, + 0.17890446294201182, + 0.1868231931839038, + 0.19503978805160802, + 0.2035607695914893, + 0.21239233423038428, + 0.22154029113624513, + 0.2310099949093775, + 0.2408062722920028, + 0.2509333424998149, + 0.26139473088724124, + 0.27219317553339173, + 0.2833305264591546, + 0.2948076371533981, + 0.30662424807939637, + 0.3187788619429325, + 0.3312686104858987, + 0.34408911267345377, + 0.35723432416806244, + 0.37069637814989603, + 0.38446541758430325, + 0.3985294192732056, + 0.41287401007114816, + 0.42748227602403216, + 0.44233456524956904, + 0.4574082858348769, + 0.4726777002304155, + 0.48811371808603304, + 0.5036836898914837, + 0.5193512042807856, + 0.5350758924190696, + 0.5508132435551064, + 0.5665144364328603, + 0.582126192110881, + 0.597590654400418, + 0.6128453050571826, + 0.6278229216805657, + 0.6424515870385359, + 0.6566547593824482, + 0.6703514139294193, + 0.6834562661994054, + 0.6958800881105892, + 0.7075301276622439, + 0.7183106424104747, + 0.7281235557952028, + 0.7368692434250309, + 0.744447453585306, + 0.7507583622937464, + 0.7557037580584567, + 0.7591883449640917, + 0.7611211447089523, + 0.7614169688292384, + 0.7599979216989952, + 0.7567948833845582, + 0.7517489097640192, + 0.7448124765679087, + 0.7359504858014432, + 0.725140949598889, + 0.7123752710454143, + 0.6976580577128917, + 0.6810064363962843, + 0.6624488923465277, + 0.6420237387472664, + 0.6197774376419187, + 0.5957631443529147, + 0.5700400313765351, + 0.5426741516245952, + 0.5137417941296103, + 0.48333640657907945, + 0.45158009850532743, + 0.41864030907148064, + 0.38475111720755223, + 0.35023639988097494, + 0.31552784247197957, + 0.28116350082259844, + 0.24774043173212534, + 0.215778419049, + 0.185559204532, + 0.157273274735, + 0.131092182473, + 0.10716854111, + 0.0856325523164, + 0.0665870286926, + 0.0501005872755, + 0.0361989033559, + 0.0248543004513, + 0.0159745650769, + 0.00939272900122, + 0.00486063824907, + 0.00205027779045, + 0.000567714281942, + -1.5544649662e-05, + -0.000111253126618, + -4.73551999814e-05, + -3.99973547151e-06, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 0, + "j": 3, + "angular_momentum": 1 + }, + { + "radial_function": [ + -0.0, + -2.4272453376289025e-21, + -4.0180735729166e-20, + -2.1047898058166627e-19, + -6.883844798616073e-19, + -1.7393224063667914e-18, + -3.732979603804525e-18, + -7.158711854199038e-18, + -1.2642598142933951e-17, + -2.0966292280866597e-17, + -3.308783479347003e-17, + -5.0164601532083405e-17, + -7.357858007350014e-17, + -1.0496418072727655e-16, + -1.4623880597837256e-16, + -1.9963642049859384e-16, + -2.6774438362979036e-16, + -3.535438275299178e-16, + -4.60453887104785e-16, + -5.923801126457761e-16, + -7.537674224954811e-16, + -9.496579822791039e-16, + -1.1857544274037083e-15, + -1.468488879510452e-15, + -1.8050982429300708e-15, + -2.2037063059964184e-15, + -2.67341321386513e-15, + -3.2243929229803893e-15, + -3.867999297857546e-15, + -4.616881559307183e-15, + -5.4851098525310276e-15, + -6.4883117601539884e-15, + -7.643820652452122e-15, + -8.970836834222371e-15, + -1.0490602524149568e-14, + -1.2226591781114476e-14, + -1.4204716578913344e-14, + -1.6453550325019014e-14, + -1.9004570214177028e-14, + -2.1892419921460205e-14, + -2.5155194249253948e-14, + -2.8834747465253494e-14, + -3.297702721275025e-14, + -3.763243599824666e-14, + -4.285622243694227e-14, + -4.870890458135767e-14, + -5.525672785343491e-14, + -6.257216027379423e-14, + -7.073442790659366e-14, + -7.983009363734323e-14, + -8.995368264698493e-14, + -1.0120835820994553e-13, + -1.1370665168871554e-13, + -1.2757125092444945e-13, + -1.429358514957557e-13, + -1.599460757043822e-13, + -1.7876046446183396e-13, + -1.995515476647893e-13, + -2.225069990645515e-13, + -2.4783088207071894e-13, + -2.7574499341810867e-13, + -3.0649031213887257e-13, + -3.4032856184869125e-13, + -3.7754389491222885e-13, + -4.1844470774086767e-13, + -4.633655971134581e-13, + -5.126694681869196e-13, + -5.667498056144213e-13, + -6.260331200294094e-13, + -6.90981583141498e-13, + -7.620958655100729e-13, + -8.399181922932795e-13, + -9.250356331776826e-13, + -1.0180836441238246e-12, + -1.1197498796368371e-12, + -1.2307782957834238e-12, + -1.3519735656189822e-12, + -1.4842058303038651e-12, + -1.628415810783269e-12, + -1.785620306893467e-12, + -1.956918112630094e-12, + -2.1434963782845135e-12, + -2.3466374528095888e-12, + -2.567726241551773e-12, + -2.80825811781034e-12, + -3.0698474288218277e-12, + -3.3542366400673648e-12, + -3.663306165260898e-12, + -3.999084931464114e-12, + -4.363761735343958e-12, + -4.7596974459215025e-12, + -5.1894381189018055e-12, + -5.655729087424344e-12, + -6.161530101115116e-12, + -6.710031591626538e-12, + -7.304672144001032e-12, + -7.949157266963084e-12, + -8.647479551293138e-12, + -9.403940320973936e-12, + -1.0223172887494544e-11, + -1.1110167520450718e-11, + -1.20702982593982e-11, + -1.3109351707636195e-11, + -1.4233557941980341e-11, + -1.544962370134291e-11, + -1.676476801459888e-11, + -1.818676044515825e-11, + -1.9723962145668345e-11, + -2.1385369920716082e-11, + -2.3180663523676287e-11, + -2.5120256411851972e-11, + -2.721535022008955e-11, + -2.9477993213546307e-11, + -3.1921143016448246e-11, + -3.455873391418203e-11, + -3.740574907012914e-11, + -4.0478298004451574e-11, + -4.379369972231321e-11, + -4.7370571886316433e-11, + -5.1228926482052854e-11, + -5.539027244125215e-11, + -5.987772571043122e-11, + -6.471612732465195e-11, + -6.993217004394973e-11, + -7.55545341671678e-11, + -8.161403320492429e-11, + -8.81437700859487e-11, + -9.517930468336372e-11, + -1.027588334606957e-10, + -1.109233821010757e-10, + -1.1971701206724984e-10, + -1.2918704207808836e-10, + -1.3938428556238485e-10, + -1.5036330526888242e-10, + -1.6218268621834465e-10, + -1.7490532834625983e-10, + -1.8859876020458543e-10, + -2.033354752882539e-10, + -2.1919329253765932e-10, + -2.3625574279387243e-10, + -2.54612483039794e-10, + -2.7435974040270926e-10, + -2.9560078808750196e-10, + -3.184464554541057e-10, + -3.4301567472181946e-10, + -3.6943606689933585e-10, + -3.9784456974592184e-10, + -4.283881107466444e-10, + -4.612243283011322e-10, + -4.965223445885948e-10, + -5.344635937877881e-10, + -5.752427095400187e-10, + -6.190684759359505e-10, + -6.661648465332494e-10, + -7.167720362027082e-10, + -7.711476910245993e-10, + -8.295681417548557e-10, + -8.923297468719136e-10, + -9.597503314126081e-10, + -1.0321707285777127e-09, + -1.1099564313184241e-09, + -1.1934993616733098e-09, + -1.2832197663200743e-09, + -1.3795682471841265e-09, + -1.4830279367903375e-09, + -1.594116828504496e-09, + -1.7133902727623721e-09, + -1.8414436509624235e-09, + -1.9789152397218e-09, + -2.1264892787700104e-09, + -2.284899257221043e-09, + -2.4549314333554568e-09, + -2.637428604639894e-09, + -2.833294145747731e-09, + -3.043496333266221e-09, + -3.2690729776943372e-09, + -3.511136384314349e-09, + -3.7708786661295816e-09, + -4.0495774337802794e-09, + -4.348601889316025e-09, + -4.6694193519367135e-09, + -5.013602246636133e-09, + -5.3828355880954224e-09, + -5.7789249950492604e-09, + -6.203805272410006e-09, + -6.659549601304571e-09, + -7.148379379831794e-09, + -7.67267476058524e-09, + -8.23498593386608e-09, + -8.838045209396294e-09, + -9.484779952534162e-09, + -1.0178326435622209e-08, + -1.0922044668495565e-08, + -1.1719534277092347e-08, + -1.2574651504891334e-08, + -1.3491527414638937e-08, + -1.4474587376347625e-08, + -1.552857193130038e-08, + -1.6658559128620827e-08, + -1.786998843905001e-08, + -1.9168686355292397e-08, + -2.0560893798994834e-08, + -2.2053295460068156e-08, + -2.3653051205094582e-08, + -2.536782969949763e-08, + -2.720584439845972e-08, + -2.9175892074740567e-08, + -3.128739405915495e-08, + -3.355044038466636e-08, + -3.59758370389614e-08, + -3.857515654236102e-08, + -4.136079208261492e-08, + -4.4346015463290627e-08, + -4.7545039113483055e-08, + -5.0973082472954745e-08, + -5.4646443033898196e-08, + -5.858257237202797e-08, + -6.280015752165693e-08, + -6.731920806736218e-08, + -7.216114934082388e-08, + -7.734892215890809e-08, + -8.290708957063754e-08, + -8.886195107060065e-08, + -9.524166482781049e-08, + -1.0207637848890829e-07, + -1.0939836913682228e-07, + -1.1724219303321527e-07, + -1.2564484588774848e-07, + -1.3464593429291347e-07, + -1.442878591906875e-07, + -1.5461601214197326e-07, + -1.6567898533196694e-07, + -1.7752879624347324e-07, + -1.9022112801922342e-07, + -2.0381558660578297e-07, + -2.183759758482967e-07, + -2.339705917593558e-07, + -2.5067253732664036e-07, + -2.685600592377521e-07, + -2.877169080769999e-07, + -3.082327235802973e-07, + -3.3020344672353807e-07, + -3.5373176043517976e-07, + -3.78927560992203e-07, + -4.0590846211849905e-07, + -4.3480033412920704e-07, + -4.6573788043275e-07, + -4.988652540693916e-07, + -5.343367169592461e-07, + -5.723173448040852e-07, + -6.129837807576634e-07, + -6.565250413307559e-07, + -7.031433778404881e-07, + -7.530551975254775e-07, + -8.064920481103279e-07, + -8.637016702983035e-07, + -9.249491228584774e-07, + -9.90517985115381e-07, + -1.060711642094333e-06, + -1.1358546581837548e-06, + -1.2162942448851007e-06, + -1.3024018294454633e-06, + -1.3945747308831985e-06, + -1.4932379507454601e-06, + -1.5988460864116152e-06, + -1.7118853750012056e-06, + -1.832875876850536e-06, + -1.962373807574778e-06, + -2.1009740291837913e-06, + -2.249312710161657e-06, + -2.4080701665320937e-06, + -2.5779738950692365e-06, + -2.759801812231996e-06, + -2.954385711753267e-06, + -3.16261495567956e-06, + -3.385440414034927e-06, + -3.6238786694297068e-06, + -3.879016504056393e-06, + -4.152015687305697e-06, + -4.444118083500133e-06, + -4.756651100753903e-06, + -5.091033502736501e-06, + -5.448781606522906e-06, + -5.831515891868765e-06, + -6.240968046896529e-06, + -6.678988479977514e-06, + -7.1475543245496734e-06, + -7.648777970676228e-06, + -8.184916154086466e-06, + -8.75837963870311e-06, + -9.371743528809587e-06, + -1.002775825046488e-05, + -1.0729361241228479e-05, + -1.147968939350741e-05, + -1.228209229580399e-05, + -1.3140146319115926e-05, + -1.4057669600503574e-05, + -1.5038737974117874e-05, + -1.6087701907827685e-05, + -1.7209204501093323e-05, + -1.8408200607206594e-05, + -1.968997714037339e-05, + -2.106017463762947e-05, + -2.252481014136791e-05, + -2.409030147809996e-05, + -2.576349300334707e-05, + -2.7551682895755763e-05, + -2.946265207605132e-05, + -3.1504694836702066e-05, + -3.368665126398211e-05, + -3.601794154536574e-05, + -3.850860224342668e-05, + -4.1169324635610215e-05, + -4.4011495205899916e-05, + -4.704723838232831e-05, + -5.028946161660264e-05, + -5.375190289334483e-05, + -5.7449180762428245e-05, + -6.13968469857049e-05, + -6.561144187810468e-05, + -7.011055242858364e-05, + -7.491287327374817e-05, + -8.003827059215569e-05, + -8.55078489734532e-05, + -9.134402131272409e-05, + -9.757058175710559e-05, + -0.00010421278171626455, + -0.00011129740893619513, + -0.000118852869590634, + -0.00012690927334707813, + -0.00013549852129292423, + -0.00014465439660252507, + -0.00015441265775165063, + -0.00016481113405797198, + -0.0001758898232453976, + -0.00018769099066876522, + -0.00020025926976000136, + -0.00021364176315803957, + -0.00022788814387961543, + -0.0002430507557797947, + -0.0002591847124104174, + -0.0002763479932291248, + -0.00029460153594679017, + -0.00031400932359911703, + -0.00033463846470735203, + -0.00035655926473497835, + -0.00037984528646749796, + -0.00040457339714718507, + -0.0004308237993393179, + -0.00045868004236110745, + -0.00048822901071388146, + -0.0005195608852430784, + -0.000552769072536322, + -0.0005879500970767496, + -0.0006252034502454678, + -0.0006646313895941102, + -0.0007063386805863689, + -0.0007504322724822611, + -0.0007970208987285217, + -0.0008462145913686927, + -0.000898124097327504, + -0.0009528601833617858, + -0.0010105328148520547, + -0.0010712501918016314, + -0.0011351176237896256, + -0.0012022362232539379, + -0.0012727013945333977, + -0.0013466010938366214, + -0.0014240138318598078, + -0.0015050063889994465, + -0.0015896312089649454, + -0.0016779234339014066, + -0.0017698975403398173, + -0.001865543530807727, + -0.0019648226325889025, + -0.00206766245003921, + -0.002173951512189501, + -0.002283533152437215, + -0.002396198651447304, + -0.0025116795695098062, + -0.002629639187862081, + -0.002749662973334195, + -0.0028712479743294673, + -0.002993791049537877, + -0.003116575825862502, + -0.003238758275297364, + -0.0033593507947041056, + -0.003477204668715762, + -0.0035909907904471882, + -0.003699178511556961, + -0.0038000124923892086, + -0.003891487420662653, + -0.003971320470811578, + -0.004036921379064058, + -0.004085360017953362, + -0.004113331364405768, + -0.004117117772251726, + -0.004092548480978183, + -0.004034956320504794, + -0.00393913160691268, + -0.003799273268076842, + -0.0036089372915266518, + -0.0033609826524782617, + -0.0030475149567347087, + -0.002659828126880279, + -0.0021883445650936577, + -0.0016225543550154632, + -0.0009509542057981201, + -0.00016098700680072076, + 0.0007610169500165162, + 0.0018298958190173297, + 0.003061707625509005, + 0.004473775520080913, + 0.006084724837012057, + 0.007914509643868254, + 0.009984426151607686, + 0.01231711004609649, + 0.01493651446084587, + 0.017867865020051853, + 0.02113758805538363, + 0.0247732078676723, + 0.028803208675783953, + 0.03325685678401757, + 0.03816397847818702, + 0.043554689283561834, + 0.049459070519711185, + 0.055906789628319714, + 0.06292666151868136, + 0.07054614933235442, + 0.07879080445895918, + 0.08768364756771427, + 0.09724449476663778, + 0.10748923579585543, + 0.11842907451988625, + 0.1300697457404902, + 0.14241072654624437, + 0.15544446486067115, + 0.16915565243892738, + 0.18352057388795595, + 0.19850656709777514, + 0.21407163313552946, + 0.23016423457782573, + 0.24672331956882707, + 0.26367860364637746, + 0.28095113149784007, + 0.29845412498119617, + 0.3160941009335437, + 0.3337722113847377, + 0.35138571917796463, + 0.36882947375029523, + 0.3859971963821894, + 0.4027823244991851, + 0.4190781066611687, + 0.4347765928164491, + 0.44976614259884257, + 0.46392709771433743, + 0.4771253595396882, + 0.4892038138671978, + 0.49997189067024694, + 0.5091940798851697, + 0.5165789794861736, + 0.5217714420268512, + 0.5243515696831814, + 0.5238455419152598, + 0.5197542133061311, + 0.5116054398989764, + 0.4990339948353551, + 0.4818866697330903, + 0.4603363099111023, + 0.4349615464019258, + 0.4067000233760745, + 0.376507358168, + 0.344841707395, + 0.312004285054, + 0.278348024937, + 0.244293206535, + 0.210333633648, + 0.177037060307, + 0.14503666268, + 0.115010139088, + 0.0876434604568, + 0.063577607615, + 0.0433393437092, + 0.0272614153235, + 0.015403814878, + 0.00749534213065, + 0.00292218319882, + 0.000793703166935, + 0.000107533433123, + 2.08981905276e-06, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 0, + "j": 4, + "angular_momentum": 2 + }, + { + "radial_function": [ + -0.0, + -2.4512631216026097e-10, + -9.973372406512516e-10, + -2.282640188903509e-09, + -4.128084974794032e-09, + -6.561802262627772e-09, + -9.613043363013455e-09, + -1.3312221448140224e-08, + -1.7690954232129718e-08, + -2.2782108168036106e-08, + -2.86198442137767e-08, + -3.523966522266388e-08, + -4.2678465015401024e-08, + -5.097457919070935e-08, + -6.016783773836012e-08, + -7.02996195143003e-08, + -8.141290864503024e-08, + -9.355235292838804e-08, + -1.0676432429855211e-07, + -1.210969814345156e-07, + -1.3660033456618397e-07, + -1.5332631259348028e-07, + -1.713288325538068e-07, + -1.9066387155312284e-07, + -2.113895412291773e-07, + -2.3356616484108702e-07, + -2.5725635709153746e-07, + -2.825251067274739e-07, + -3.0943986209666104e-07, + -3.380706196703283e-07, + -3.684900157207071e-07, + -4.0077342119563817e-07, + -4.3499903995088705e-07, + -4.7124801042143274e-07, + -5.096045108801903e-07, + -5.501558683853352e-07, + -5.929926715500609e-07, + -6.382088872988769e-07, + -6.859019816807614e-07, + -7.36173044960646e-07, + -7.891269210932893e-07, + -8.448723416907671e-07, + -9.035220647746538e-07, + -9.65193018298962e-07, + -1.0300064487805154e-06, + -1.0980880750740832e-06, + -1.1695682475845727e-06, + -1.244582112995047e-06, + -1.3232697848318215e-06, + -1.4057765199549454e-06, + -1.4922529011981708e-06, + -1.5828550264698276e-06, + -1.6777447043890916e-06, + -1.7770896568417456e-06, + -1.8810637285127436e-06, + -1.989847103842625e-06, + -2.1036265315090277e-06, + -2.222595556743876e-06, + -2.346954761790939e-06, + -2.4769120147413035e-06, + -2.6126827270505777e-06, + -2.754490120035198e-06, + -2.9025655007152945e-06, + -3.0571485472081282e-06, + -3.2184876041263745e-06, + -3.3868399882344563e-06, + -3.562472304808647e-06, + -3.7456607750063863e-06, + -3.936691574572309e-06, + -4.13586118448771e-06, + -4.343476753672796e-06, + -4.559856474484606e-06, + -4.7853299711099586e-06, + -5.020238701653505e-06, + -5.264936374115562e-06, + -5.519789376858837e-06, + -5.785177224061588e-06, + -6.061493016729214e-06, + -6.349143919625619e-06, + -6.648551654866464e-06, + -6.960153012722966e-06, + -7.284400379990928e-06, + -7.62176228703885e-06, + -7.972723973512519e-06, + -8.337787974004371e-06, + -8.717474723902798e-06, + -9.11232318624907e-06, + -9.522891500771019e-06, + -9.949757654482483e-06, + -1.0393520177171289e-05, + -1.0854798859062737e-05, + -1.1334235495134029e-05, + -1.1832494654456975e-05, + -1.2350264475945512e-05, + -1.2888257492860597e-05, + -1.3447211483937066e-05, + -1.4027890356898067e-05, + -1.4631085059919368e-05, + -1.5257614525370938e-05, + -1.590832664796276e-05, + -1.658409929528892e-05, + -1.728584135218567e-05, + -1.8014493804939038e-05, + -1.8771030859175638e-05, + -1.9556461099195447e-05, + -2.0371828686465204e-05, + -2.121821459903225e-05, + -2.2096737915409312e-05, + -2.3008557140928445e-05, + -2.3954871582705292e-05, + -2.4936922769258882e-05, + -2.5955995921700687e-05, + -2.7013421473905127e-05, + -2.8110576647814487e-05, + -2.924888708027026e-05, + -3.0429828508339557e-05, + -3.165492851170633e-05, + -3.292576831732231e-05, + -3.42439846634538e-05, + -3.56112717304612e-05, + -3.702938313902289e-05, + -3.8500134013757076e-05, + -4.002540312267402e-05, + -4.160713508864372e-05, + -4.3247342675499346e-05, + -4.4948109157861566e-05, + -4.671159076750795e-05, + -4.854001922779605e-05, + -5.0435704375298384e-05, + -5.240103687027981e-05, + -5.4438491003213866e-05, + -5.655062759728442e-05, + -5.8740097008664e-05, + -6.100964223548366e-05, + -6.336210212981355e-05, + -6.580041472384871e-05, + -6.832762066619774e-05, + -7.094686678347625e-05, + -7.366140975893281e-05, + -7.647461994129155e-05, + -7.938998528433813e-05, + -8.241111542052777e-05, + -8.554174588007029e-05, + -8.878574245032083e-05, + -9.214710568764125e-05, + -9.562997558479061e-05, + -9.923863640027491e-05, + -0.00010297752165342843, + -0.00010685121929013839, + -0.00011086447702856242, + -0.0001150222078904779, + -0.00011932949591885281, + -0.00012379160209538892, + -0.000128413970463075, + -0.00013320223445668263, + -0.00013816222345279676, + -0.00014329996954410605, + -0.00014862171455187723, + -0.0001541339172711765, + -0.00015984326097228497, + -0.0001657566611592391, + -0.00017188127359172366, + -0.00017822450258752465, + -0.00018479400960659122, + -0.00019159772213398372, + -0.00019864384286378718, + -0.00020594085920216823, + -0.00021349755309459033, + -0.00022132301119488247, + -0.00022942663537550557, + -0.0002378181536088415, + -0.000246507631213426, + -0.00025550548248881767, + -0.00026482248275431255, + -0.0002744697807917509, + -0.0002844589117220504, + -0.0002948018103225273, + -0.0003055108247976058, + -0.0003165987310198818, + -0.0003280787472667518, + -0.0003399645494524353, + -0.00035227028688879713, + -0.00036501059857973697, + -0.0003782006300767212, + -0.00039185605090863803, + -0.0004059930726084546, + -0.00042062846735417965, + -0.0004357795872493096, + -0.0004514643842579588, + -0.00046770143082370684, + -0.0004845099411873193, + -0.0005019097934379658, + -0.0005199215523106698, + -0.000538566492755511, + -0.0005578666243259265, + -0.0005778447163763002, + -0.000598524324131135, + -0.0006199298156367132, + -0.0006420863996208698, + -0.0006650201543128358, + -0.0006887580572249011, + -0.0007133280159574162, + -0.0007387589000377374, + -0.0007650805738455188, + -0.0007923239306488468, + -0.0008205209277819508, + -0.0008497046230316885, + -0.0008799092122370491, + -0.0009111700681537385, + -0.0009435237806425507, + -0.0009770081982088642, + -0.0010116624709195878, + -0.001047527094835499, + -0.001084643957773024, + -0.0011230563867989792, + -0.0011628091972096957, + -0.0012039487431341413, + -0.0012465229698737405, + -0.0012905814680168213, + -0.0013361755292781781, + -0.001383358204220434, + -0.0014321843620076925, + -0.0014827107519698598, + -0.0015349960672953783, + -0.001589101010903085, + -0.0016450883634233702, + -0.0017030230532984409, + -0.00176297222952606, + -0.0018250053364275054, + -0.0018891941911593272, + -0.0019556130635833774, + -0.002024338758867635, + -0.0020954507027488773, + -0.0021690310295608157, + -0.0022451646731366805, + -0.002323939460700836, + -0.0024054462097253125, + -0.0024897788280369144, + -0.002577034417041419, + -0.0026673133783577676, + -0.002760719523783018, + -0.002857360188895223, + -0.0029573463501203568, + -0.0030607927457368097, + -0.003167818000516631, + -0.0032785447544898595, + -0.0033930997955508627, + -0.0035116141964444303, + -0.0036342234559507865, + -0.0037610676444452262, + -0.003892291553908616, + -0.004028044852909241, + -0.004168482245842069, + -0.004313763637566025, + -0.004464054302681474, + -0.004619525060044939, + -0.004780352452739494, + -0.0049467189332770565, + -0.005118813054180213, + -0.005296829664694232, + -0.005480970112726476, + -0.005671442453177003, + -0.005868461662080116, + -0.006072249856927387, + -0.00628303652348337, + -0.006501058748860893, + -0.006726561461388234, + -0.006959797676778648, + -0.007201028751716167, + -0.007450524643728343, + -0.007708564178816532, + -0.007975435325516941, + -0.008251435476892036, + -0.008536871739490005, + -0.008832061229969079, + -0.00913733137920985, + -0.009453020244034126, + -0.009779476826760593, + -0.010117061402427366, + -0.010466145853706654, + -0.010827114013885907, + -0.011200362017642008, + -0.011586298659466523, + -0.011985345760392637, + -0.012397938541669212, + -0.01282452600745345, + -0.013265571333697688, + -0.0137215522658658, + -0.014192961523197257, + -0.014680307210572641, + -0.015184113237236585, + -0.01570491974283199, + -0.016243283528960387, + -0.016799778497768893, + -0.01737499609620955, + -0.017969545765206867, + -0.018584055394525553, + -0.019219171781035823, + -0.019875561091680524, + -0.020553909328828966, + -0.02125492279876875, + -0.02197932858061931, + -0.02272787499695171, + -0.023501332083102493, + -0.024300492056100857, + -0.02512616977937633, + -0.025979203224868214, + -0.02686045392869805, + -0.02777080744040836, + -0.028711173762450942, + -0.02968248778057479, + -0.030685709679539947, + -0.031721825345658775, + -0.032791846751167565, + -0.033896812318452256, + -0.03503778726255458, + -0.03621586390708555, + -0.03743216197126321, + -0.03868782882533154, + -0.039984039708741675, + -0.0413219979086199, + -0.04270293489350999, + -0.0441281103980348, + -0.04559881245263155, + -0.047116357354480616, + -0.04868208957284749, + -0.050297381582408124, + -0.05196363361982197, + -0.053682273353340436, + -0.05545475546245022, + -0.05728256111510171, + -0.059167197337716484, + -0.06111019626615183, + -0.06311311427067692, + -0.06517753094313809, + -0.06730504793579942, + -0.06949728764145299, + -0.07175589170224442, + -0.07408251933391936, + -0.07647884545320298, + -0.07894655859406355, + -0.08148735859738877, + -0.08410295405900044, + -0.08679505951895776, + -0.08956539237423686, + -0.09241566950759911, + -0.09534760358448031, + -0.09836289903804336, + -0.10146324769340083, + -0.10465032401559611, + -0.10792577996904684, + -0.11129123944907397, + -0.11474829228335257, + -0.11829848775722816, + -0.12194332764580147, + -0.1256842587410102, + -0.12952266482334535, + -0.1334598580685604, + -0.13749706985175217, + -0.14163544093750471, + -0.14587601100909553, + -0.15021970751996017, + -0.1546673338422646, + -0.15921955667868312, + -0.16387689272261216, + -0.16863969452720043, + -0.17350813556701683, + -0.17848219448778327, + -0.18356163848685594, + -0.18874600584709986, + -0.19403458757996625, + -0.19942640818460344, + -0.20492020552294438, + -0.21051440978283079, + -0.21620712156078237, + -0.22199608906608956, + -0.22787868446295606, + -0.2338518793835329, + -0.23991221963486917, + -0.2460557991719182, + -0.25227823336851385, + -0.25857463167566236, + -0.2649395697553863, + -0.2713670611679998, + -0.27785052876703825, + -0.2843827759292347, + -0.2909559577538986, + -0.2975615524572301, + -0.3041903331461348, + -0.3108323401879254, + -0.3174768544894852, + -0.32411237191767917, + -0.3307265792345786, + -0.337306331867817, + -0.34383763394681033, + -0.3503056210008641, + -0.3566945458134911, + -0.3629877679306342, + -0.36916774737580577, + -0.37521604316532137, + -0.3811133172453684, + -0.38683934453989405, + -0.39237302979791233, + -0.39769243200939625, + -0.4027747971418209, + -0.40759660004084086, + -0.41213359628961427, + -0.41636088489992557, + -0.42025298268465033, + -0.42378391114990477, + -0.4269272967585325, + -0.42965648536002193, + -0.43194467154856336, + -0.4337650436307162, + -0.4350909448096077, + -0.4358960510618, + -0.4361545660514798, + -0.4358414332400413, + -0.4349325651508222, + -0.4334050894955363, + -0.43123761158589013, + -0.42841049212939647, + -0.42490613913752273, + -0.42070931226118985, + -0.41580743741531634, + -0.41019092906139476, + -0.40385351697050836, + -0.39679257374901844, + -0.3890094387783241, + -0.3805097336650609, + -0.37130366365730694, + -0.3614062988943225, + -0.3508378288435663, + -0.33962378274846283, + -0.32779520854133365, + -0.31538880239513734, + -0.3024469810014292, + -0.2890178887272036, + -0.27515533218863225, + -0.2609186353839349, + -0.24637240950913789, + -0.23158623289907745, + -0.21663423826482492, + -0.20159460651405273, + -0.1865489688989618, + -0.1715817220902719, + -0.15677926379683077, + -0.14222915965909944, + -0.1280192551051552, + -0.11423674837724625, + -0.100967242501733, + -0.0882937942567517, + -0.07629597634101021, + -0.06504896447442834, + -0.05462265309912116, + -0.045080791079376396, + -0.03648011172093455, + -0.028869409221717313, + -0.02228848702590797, + -0.016766874027022777, + -0.012322176139307393, + -0.008957910253866526, + -0.006660666941898701, + -0.00539648642824659, + -0.005106439004000848, + -0.005701621038705686, + -0.0070581778785433705, + -0.009013642891543525, + -0.011366978975624362, + -0.013886426921674676, + -0.016331890278374978, + -0.0185017346525, + -0.020278440898, + -0.0215821042781, + -0.0223497716708, + -0.0225385991577, + -0.0221296269019, + -0.0211313622, + -0.0195828170185, + -0.0175555125244, + -0.0151537740227, + -0.012512480721, + -0.00979126208074, + -0.00716411215142, + -0.00480353639076, + -0.00285898684529, + -0.00143066195284, + -0.000542435218316, + -0.000122334932086, + -7.04565145983e-06, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 1, + "j": 1, + "angular_momentum": 0 + }, + { + "radial_function": [ + -0.0, + -1.6296196355732783e-15, + -1.3374095061549355e-14, + -4.6308161706495165e-14, + -1.126222748247852e-13, + -2.2570233991101293e-13, + -4.002143953967985e-13, + -6.521945341659946e-13, + -9.991443663693445e-13, + -1.460132342848061e-12, + -2.0559012761010037e-12, + -2.808982414517211e-12, + -3.7438164452590095e-12, + -4.8868818217004696e-12, + -6.266830833756835e-12, + -7.914633861744282e-12, + -9.863732279351764e-12, + -1.2150200496688606e-11, + -1.4812917661002427e-11, + -1.789374956291598e-11, + -2.1437741320299533e-11, + -2.549332145587239e-11, + -3.011251800037844e-11, + -3.535118730473335e-11, + -4.126925627070619e-11, + -4.793097875370233e-11, + -5.540520693585631e-11, + -6.376567849121975e-11, + -7.309132044981179e-11, + -8.346657066210594e-11, + -9.49817178722914e-11, + -1.0773326141216767e-10, + -1.2182429162325146e-10, + -1.3736489214387355e-10, + -1.5447256528442265e-10, + -1.7327268175917293e-10, + -1.9389895612301568e-10, + -2.1649394934814224e-10, + -2.412096000052083e-10, + -2.6820778566441257e-10, + -2.9766091615975305e-10, + -3.297525604442373e-10, + -3.6467810895741213e-10, + -4.026454733531323e-10, + -4.438758257348995e-10, + -4.886043794802324e-10, + -5.370812140006283e-10, + -5.89572145768845e-10, + -6.463596482286322e-10, + -7.077438231793915e-10, + -7.740434264519807e-10, + -8.45596950909596e-10, + -9.227637697830252e-10, + -1.005925343745618e-09, + -1.095486495046514e-09, + -1.1918767525139928e-09, + -1.2955517711484914e-09, + -1.406994830390674e-09, + -1.5267184153613083e-09, + -1.6552658855279943e-09, + -1.7932132355430423e-09, + -1.9411709532348785e-09, + -2.099785980065545e-09, + -2.2697437794659275e-09, + -2.4517705190020735e-09, + -2.6466353724152004e-09, + -2.855152948101184e-09, + -3.078185850772933e-09, + -3.316647383408602e-09, + -3.5715043973012534e-09, + -3.843780297802848e-09, + -4.134558214545339e-09, + -4.444984344533137e-09, + -4.776271477860313e-09, + -5.129702715485236e-09, + -5.506635389522972e-09, + -5.908505196913343e-09, + -6.3368305579880895e-09, + -6.793217211716751e-09, + -7.279363060593854e-09, + -7.79706327850063e-09, + -8.348215695208805e-09, + -8.934826473164317e-09, + -9.559016091048327e-09, + -1.0223025651638239e-08, + -1.0929223530471853e-08, + -1.1680112383715617e-08, + -1.2478336535264454e-08, + -1.3326689760641722e-08, + -1.4228123493885282e-08, + -1.5185755472904486e-08, + -1.6202878854074875e-08, + -1.7282971815976283e-08, + -1.8429707679232613e-08, + -1.9646965573123654e-08, + -2.0938841671089496e-08, + -2.2309661036340956e-08, + -2.3763990097351012e-08, + -2.5306649794230098e-08, + -2.694272943439847e-08, + -2.8677601287485483e-08, + -3.051693595899841e-08, + -3.2466718596835765e-08, + -3.453326595525757e-08, + -3.672324437903609e-08, + -3.904368874684554e-08, + -4.150202242558374e-08, + -4.4106078295376174e-08, + -4.686412089174467e-08, + -4.978486973793505e-08, + -5.287752391352344e-08, + -5.615178794103539e-08, + -5.961789904681231e-08, + -6.328665588312246e-08, + -6.71694487708453e-08, + -7.127829156013676e-08, + -7.562585518316393e-08, + -8.022550299959692e-08, + -8.50913280117666e-08, + -9.02381920670142e-08, + -9.568176714702008e-08, + -1.0143857883734364e-07, + -1.075260521234882e-07, + -1.1396255961195983e-07, + -1.2076747230393327e-07, + -1.2796121308308633e-07, + -1.3556531301928676e-07, + -1.4360247067327796e-07, + -1.5209661454481584e-07, + -1.610729688234301e-07, + -1.705581226343546e-07, + -1.8058010294895975e-07, + -1.911684513448108e-07, + -2.0235430485424136e-07, + -2.1417048107181512e-07, + -2.2665156778191393e-07, + -2.398340173039948e-07, + -2.5375624586218023e-07, + -2.684587381787827e-07, + -2.839841576139655e-07, + -3.0037746212282274e-07, + -3.1768602632832005e-07, + -3.3595977007071975e-07, + -3.552512937161459e-07, + -3.7561602062093866e-07, + -3.971123471156405e-07, + -4.198018004105215e-07, + -4.4374920482791675e-07, + -4.690228567930234e-07, + -4.956947090653426e-07, + -5.238405646936553e-07, + -5.53540281165816e-07, + -5.848779853372578e-07, + -6.179422996929634e-07, + -6.528265805083654e-07, + -6.896291685644393e-07, + -7.284536530553393e-07, + -7.694091494277972e-07, + -8.126105917794911e-07, + -8.581790406968392e-07, + -9.062420072831243e-07, + -9.569337942031425e-07, + -1.0103958547024805e-06, + -1.0667771704733566e-06, + -1.1262346494180424e-06, + -1.1889335442824659e-06, + -1.2550478933207693e-06, + -1.3247609840929156e-06, + -1.3982658416667118e-06, + -1.4757657423870023e-06, + -1.5574747547202199e-06, + -1.643618308414194e-06, + -1.7344337935598678e-06, + -1.8301711911420824e-06, + -1.9310937365887364e-06, + -2.037478618204278e-06, + -2.1496177122348878e-06, + -2.2678183564526754e-06, + -2.392404164285796e-06, + -2.523715881717573e-06, + -2.662112288998663e-06, + -2.8079711496997592e-06, + -2.9616902094259516e-06, + -3.1236882468957134e-06, + -3.2944061800492433e-06, + -3.4743082300943463e-06, + -3.6638831464791583e-06, + -3.863645496026504e-06, + -4.074137019493552e-06, + -4.295928059163176e-06, + -4.5296190610642096e-06, + -4.775842155861907e-06, + -5.035262822354301e-06, + -5.308581637876334e-06, + -5.5965361204530486e-06, + -5.899902666934259e-06, + -6.21949859262269e-06, + -6.556184277411214e-06, + -6.910865423902408e-06, + -7.284495433677863e-06, + -7.678077907379075e-06, + -8.092669275510451e-06, + -8.529381566375668e-06, + -8.989385318572766e-06, + -9.473912645364083e-06, + -9.984260458690122e-06, + -1.0521793861642943e-05, + -1.1087949717504588e-05, + -1.1684240404711556e-05, + -1.2312257767713548e-05, + -1.2973677273586232e-05, + -1.3670262384690643e-05, + -1.44038691604426e-05, + -1.517645109526681e-05, + -1.5990064212302377e-05, + -1.684687241989223e-05, + -1.774915314623317e-05, + -1.869930326787954e-05, + -1.96998453469676e-05, + -2.075343419068015e-05, + -2.1862863751795062e-05, + -2.30310743901384e-05, + -2.42611605067913e-05, + -2.5556378576322784e-05, + -2.692015559733201e-05, + -2.835609797942209e-05, + -2.9868000887385074e-05, + -3.1459858078021965e-05, + -3.3135872236677566e-05, + -3.490046585633562e-05, + -3.67582926746282e-05, + -3.8714249705446915e-05, + -4.077348989148346e-05, + -4.294143541003998e-05, + -4.522379166623029e-05, + -4.7626562009581276e-05, + -5.015606320752125e-05, + -5.281894172040483e-05, + -5.562219081185649e-05, + -5.857316854324171e-05, + -6.167961669152873e-05, + -6.494968064435086e-05, + -6.839193031260205e-05, + -7.201538212484948e-05, + -7.582952214427916e-05, + -7.984433037831863e-05, + -8.407030632713732e-05, + -8.851849584912347e-05, + -9.320051939895721e-05, + -9.812860170951164e-05, + -0.00010331560298846249, + -0.00010877505172173772, + -0.00011452117913087528, + -0.0001205689554083458, + -0.0001269341277835716, + -0.00013363326053036743, + -0.00014068377701688913, + -0.00014810400388446185, + -0.00015591321746132996, + -0.0001641316925505267, + -0.00017278075366196146, + -0.00018188282885729846, + -0.00019146150630314698, + -0.0002015415936768741, + -0.0002121491805742053, + -0.00022331170404753196, + -0.00023505801744841328, + -0.00024741846270321066, + -0.00026042494624102145, + -0.0002741110186841256, + -0.000288511958556348, + -0.00030366486012337523, + -0.0003196087256415181, + -0.00033638456216569394, + -0.0003540354831686894, + -0.00037260681518508793, + -0.0003921462097200362, + -0.00041270376068135357, + -0.0004343321275804238, + -0.00045708666476996254, + -0.00048102555702216786, + -0.0005062099617225522, + -0.0005327041579744704, + -0.0005605757029775153, + -0.0005898955959199278, + -0.0006207384498768502, + -0.0006531826718794398, + -0.0006873106517202266, + -0.0007232089597267316, + -0.0007609685539907262, + -0.0008006849974277496, + -0.0008424586851505331, + -0.0008863950824818741, + -0.0009326049742096428, + -0.0009812047254835069, + -0.0010323165548129125, + -0.0010860688197793492, + -0.0011425963158342915, + -0.0012020405888833695, + -0.001264550262066223, + -0.001330281377432821, + -0.0013993977529249265, + -0.0014720713554608256, + -0.0015484826905453298, + -0.0016288212092213231, + -0.0017132857327397633, + -0.0018020848958834042, + -0.0018954376093609122, + -0.001993573542093474, + -0.0020967336238938246, + -0.0022051705694812675, + -0.0023191494241226723, + -0.002438948131978215, + -0.0025648581275368194, + -0.0026971849508658444, + -0.0028362488874737655, + -0.002982385633205794, + -0.0031359469849010185, + -0.0032973015575045905, + -0.003466835527968105, + -0.003644953406660952, + -0.0038320788366949573, + -0.00402865542163656, + -0.004235147581863343, + -0.004452041440069935, + -0.0046798457360077185, + -0.004919092770541873, + -0.00517033937932017, + -0.005434167935489259, + -0.005711187381901546, + -0.006002034291766796, + -0.00630737395776743, + -0.0066279015084754105, + -0.006964343051556516, + -0.007317456842339453, + -0.007688034476369717, + -0.008076902104424476, + -0.00848492166790919, + -0.008912992152191724, + -0.009362050855364335, + -0.009833074669306899, + -0.010327081369381704, + -0.010845130908817315, + -0.01138832671307992, + -0.011957816968918537, + -0.012554795904556222, + -0.013180505048508612, + -0.01383623446800847, + -0.014523323973215763, + -0.015243164279443548, + -0.015997198119790758, + -0.016786921293682516, + -0.01761388364431927, + -0.018479689947025747, + -0.019386000695882248, + -0.020334532776490295, + -0.02132706000191954, + -0.0223654134973603, + -0.023451481910559173, + -0.0245872114302965, + -0.025774605583952937, + -0.027015724791088606, + -0.028312685645817442, + -0.02966765989589683, + -0.031082873089446707, + -0.03256060285023508, + -0.03410317674625078, + -0.0357129697172248, + -0.03739240100663002, + -0.039143930565130436, + -0.0409700548673289, + -0.04287330209571871, + -0.04485622663952948, + -0.04692140284108221, + -0.049071417937756205, + -0.05130886413185806, + -0.053636329719734234, + -0.056056389211106075, + -0.05857159235860376, + -0.06118445202966798, + -0.06389743082886812, + -0.06671292639338743, + -0.06963325527573239, + -0.07266063531268384, + -0.07579716640344278, + -0.07904480959807059, + -0.08240536438732053, + -0.085880444117272, + -0.08947144942053954, + -0.09317953955631891, + -0.09700560159009501, + -0.10095021728519445, + -0.10501362764073663, + -0.10919569496569018, + -0.1134958624277608, + -0.11791311097922424, + -0.12244591360673211, + -0.1270921868401179, + -0.13184923947693297, + -0.13671371849456682, + -0.14168155212983657, + -0.14674789014836245, + -0.15190704131914634, + -0.15715240817492532, + -0.16247641912727254, + -0.16787045810214135, + -0.17332479183574293, + -0.1788284950820568, + -0.18436937401377296, + -0.18993388815030526, + -0.19550707126034375, + -0.20107245174181104, + -0.20661197310335136, + -0.21210591526297257, + -0.21753281754228146, + -0.22286940435133817, + -0.22809051476909073, + -0.2331690373683759, + -0.2380758519234386, + -0.2427797798208584, + -0.24724754534283075, + -0.2514437502670887, + -0.255330864617019, + -0.2588692367875584, + -0.262017126715482, + -0.2647307662487328, + -0.2669644514017373, + -0.2686706717282474, + -0.2698002826457098, + -0.27030272711862596, + -0.2701263137075951, + -0.26921855852357673, + -0.26752659908847615, + -0.264997688431327, + -0.2615797778691482, + -0.25722219675204494, + -0.25187643689055333, + -0.24549704827591315, + -0.2380426509340298, + -0.22947706509550267, + -0.2197705581515051, + -0.2089012018502325, + -0.19685632666553549, + -0.18363405200541916, + -0.16924486070686476, + -0.15371317405685309, + -0.13707886930136254, + -0.11939866550882845, + -0.10074728623985733, + -0.08121828968677593, + -0.06092444012729316, + -0.03999748114029861, + -0.018587163931418557, + 0.003140612071637071, + 0.02500666911481246, + 0.046822510693960234, + 0.06839537453513954, + 0.08953426631879047, + 0.11005669467017137, + 0.1297956042202498, + 0.14860572134346606, + 0.1663681976720237, + 0.18299209206441697, + 0.1984109429313462, + 0.21257258193491205, + 0.2254206591525034, + 0.236867476399568, + 0.24676028679030854, + 0.2548482054280562, + 0.26076582369278295, + 0.26406487175720844, + 0.264347906973, + 0.261446324398, + 0.255305241872, + 0.245919990666, + 0.233347876217, + 0.217725210548, + 0.199287411774, + 0.178390992271, + 0.155534986929, + 0.131377664594, + 0.106742210087, + 0.0826026910137, + 0.0600394835327, + 0.0401524842698, + 0.023922741685, + 0.0120219763024, + 0.00459039288685, + 0.00104538950242, + 6.17228158831e-05, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 1, + "j": 2, + "angular_momentum": 1 + }, + { + "radial_function": [ + 0.0, + 2.4044204900007313e-15, + 1.973279377560519e-14, + 6.832532600432401e-14, + 1.6616841090913305e-13, + 3.330122679614757e-13, + 5.904958873641205e-13, + 9.622797046531434e-13, + 1.4741864512044172e-12, + 2.1543506517694657e-12, + 3.033377266170634e-12, + 4.1445100000049216e-12, + 5.523809838218265e-12, + 7.210344385687586e-12, + 9.246388632043582e-12, + 1.1677637790875156e-11, + 1.4553432900257765e-11, + 1.7926999908997537e-11, + 2.1855703012275687e-11, + 2.6401313045016008e-11, + 3.163029177710446e-11, + 3.761409301947559e-11, + 4.442948147332097e-11, + 5.2158870330738214e-11, + 6.089067867374408e-11, + 7.071970978350205e-11, + 8.174755153748001e-11, + 9.408300010704113e-11, + 1.0784250829335689e-10, + 1.2315065983186885e-10, + 1.4014067115305168e-10, + 1.5895492209242297e-10, + 1.797455171839776e-10, + 2.026748792143042e-10, + 2.2791637684209036e-10, + 2.556549881545305e-10, + 2.860880021500166e-10, + 3.1942576026444937e-10, + 3.5589244010201284e-10, + 3.9572688375390014e-10, + 4.391834731295454e-10, + 4.865330548496055e-10, + 5.380639175355739e-10, + 5.940828242225363e-10, + 6.549161030633499e-10, + 7.209107993953354e-10, + 7.924358926317173e-10, + 8.698835814181571e-10, + 9.536706409128795e-10, + 1.044239856015456e-09, + 1.1420615346994414e-09, + 1.2476351059252725e-09, + 1.3614908065734987e-09, + 1.484191462422763e-09, + 1.6163343680688653e-09, + 1.7585532714091454e-09, + 1.911520468180167e-09, + 2.075949012576509e-09, + 2.2525950502902994e-09, + 2.4422602805446937e-09, + 2.6457945541212847e-09, + 2.8640986147326844e-09, + 3.0981269915787283e-09, + 3.3488910510708824e-09, + 3.6174622165087655e-09, + 3.904975364624341e-09, + 4.21263240868129e-09, + 4.541706078079124e-09, + 4.893543904942101e-09, + 5.2695724292245206e-09, + 5.671301633535307e-09, + 6.100329620640442e-09, + 6.558347546028599e-09, + 7.047144819930608e-09, + 7.568614592710237e-09, + 8.12475953906e-09, + 8.717697957022338e-09, + 9.34967019883843e-09, + 1.002304545100494e-08, + 1.074032888266436e-08, + 1.1504169182001525e-08, + 1.2317366500812107e-08, + 1.3182880830316038e-08, + 1.4103840829606032e-08, + 1.5083553132585178e-08, + 1.612551215774322e-08, + 1.7233410447921327e-08, + 1.8411149569614936e-08, + 1.966285159773634e-08, + 2.099287122447319e-08, + 2.2405808515090195e-08, + 2.3906522356068822e-08, + 2.5500144624955255e-08, + 2.7192095121692158e-08, + 2.8988097306687028e-08, + 3.089419487825529e-08, + 3.291676925024645e-08, + 3.5062557959030716e-08, + 3.733867406034392e-08, + 3.975262657266794e-08, + 4.2312342011306724e-08, + 4.502618707150153e-08, + 4.7902992540370816e-08, + 5.095207847398932e-08, + 5.418328073215248e-08, + 5.760697892845539e-08, + 6.123412587195739e-08, + 6.507627858859157e-08, + 6.914563099090218e-08, + 7.345504830381008e-08, + 7.801810331445419e-08, + 8.284911456670494e-08, + 8.79631865833214e-08, + 9.337625224411326e-08, + 9.910511740764575e-08, + 1.0516750792020854e-07, + 1.1158211912136423e-07, + 1.1836866799463651e-07, + 1.255479480768166e-07, + 1.3314188729929142e-07, + 1.4117360890862778e-07, + 1.4966749560397407e-07, + 1.5864925710715918e-07, + 1.6814600131077901e-07, + 1.7818630919255898e-07, + 1.8880031373437147e-07, + 2.0001978299594204e-07, + 2.118782076164215e-07, + 2.2441089295400857e-07, + 2.3765505609848175e-07, + 2.5164992804073287e-07, + 2.6643686124915134e-07, + 2.8205944292600507e-07, + 2.9856361429629406e-07, + 3.159977961804599e-07, + 3.344130212364026e-07, + 3.5386307316227637e-07, + 3.744046333125439e-07, + 3.960974350217945e-07, + 4.190044261117364e-07, + 4.431919399816336e-07, + 4.6872987572253855e-07, + 4.956918877874148e-07, + 5.241555856342105e-07, + 5.542027439271341e-07, + 5.859195238329809e-07, + 6.193967060055257e-07, + 6.547299358559621e-07, + 6.920199817462866e-07, + 7.3137300681709e-07, + 7.72900855162266e-07, + 8.167213530460227e-07, + 8.629586260237327e-07, + 9.117434327851702e-07, + 9.632135165544928e-07, + 1.0175139750138115e-06, + 1.0747976496922516e-06, + 1.1352255359112416e-06, + 1.1989672142114905e-06, + 1.2662013045607853e-06, + 1.3371159444506017e-06, + 1.411909292100594e-06, + 1.4907900561846959e-06, + 1.573978053365394e-06, + 1.6617047951870084e-06, + 1.7542141057630879e-06, + 1.8517627719707056e-06, + 1.9546212277778527e-06, + 2.0630742745799074e-06, + 2.1774218392608936e-06, + 2.297979772204957e-06, + 2.4250806870876232e-06, + 2.559074844788054e-06, + 2.700331083764278e-06, + 2.8492377991185187e-06, + 3.0062039731354906e-06, + 3.171660259872079e-06, + 3.346060126583319e-06, + 3.5298810549755913e-06, + 3.7236258055674233e-06, + 3.927823748174139e-06, + 4.143032262245938e-06, + 4.369838210484547e-06, + 4.60885948972701e-06, + 4.860746663028813e-06, + 5.1261846772377625e-06, + 5.405894670469845e-06, + 5.700635874260452e-06, + 6.0112076152071295e-06, + 6.3384514214256606e-06, + 6.683253239127867e-06, + 7.046545765284782e-06, + 7.42931090218318e-06, + 7.832582340223737e-06, + 8.257448276105124e-06, + 8.705054272640132e-06, + 9.176606268337853e-06, + 9.673373744153836e-06, + 1.0196693055485428e-05, + 1.0747970938513826e-05, + 1.1328688199248701e-05, + 1.1940403595473642e-05, + 1.2584757921054388e-05, + 1.3263478303568208e-05, + 1.3978382726051805e-05, + 1.473138478433375e-05, + 1.5524498692961894e-05, + 1.6359844551688546e-05, + 1.7239653886329294e-05, + 1.8166275478707298e-05, + 1.9142181500235557e-05, + 2.016997396432834e-05, + 2.1252391516921973e-05, + 2.2392316575549275e-05, + 2.359278284584416e-05, + 2.4856983225859776e-05, + 2.618827812089546e-05, + 2.7590204191995677e-05, + 2.9066483560065636e-05, + 3.06210334855614e-05, + 3.2257976551568336e-05, + 3.3981651379524584e-05, + 3.5796623895085294e-05, + 3.7707699181430014e-05, + 3.971993394995601e-05, + 4.18386496551127e-05, + 4.406944628405494e-05, + 4.641821687340165e-05, + 4.889116276356685e-05, + 5.1494809653904046e-05, + 5.4236024481343236e-05, + 5.7122033176679434e-05, + 6.016043933738865e-05, + 6.335924386472087e-05, + 6.672686561545064e-05, + 7.027216312145425e-05, + 7.400445742656465e-05, + 7.793355610662946e-05, + 8.20697785226656e-05, + 8.642398237918199e-05, + 9.100759164566042e-05, + 9.583262592065394e-05, + 0.00010091173129808263, + 0.00010625821283065204, + 0.00011188606865055186, + 0.00011781002585102119, + 0.00012404557819704532, + 0.00013060902578052505, + 0.00013751751670209762, + 0.000144789090884838, + 0.00015244272612455846, + 0.00016049838651279553, + 0.00016897707330209053, + 0.0001779008783967878, + 0.0001872930405473412, + 0.00019717800441171332, + 0.0002075814826332434, + 0.00021853052106266956, + 0.0002300535672810335, + 0.00024218054262914872, + 0.0002549429178473667, + 0.000268373792574721, + 0.00028250797884875356, + 0.00029738208881936127, + 0.00031303462689719064, + 0.0003295060865272782, + 0.00034683905184443553, + 0.00036507830440118407, + 0.00038427093529223627, + 0.0004044664628388004, + 0.00042571695621028237, + 0.0004480771651524196, + 0.00047160465623067075, + 0.00049635995581224, + 0.0005224067001596565, + 0.0005498117929518408, + 0.0005786455705882119, + 0.0006089819756585424, + 0.0006408987389420826, + 0.0006744775703330372, + 0.0007098043591418507, + 0.0007469693841802711, + 0.0007860675340673983, + 0.0008271985382946692, + 0.0008704672094063451, + 0.0009159836970236725, + 0.0009638637539587984, + 0.0010142290152555695, + 0.0010672072905026358, + 0.0011229328701413477, + 0.0011815468463248356, + 0.0012431974490458395, + 0.001308040398017852, + 0.0013762392712034753, + 0.0014479658905845435, + 0.001523400725857435, + 0.0016027333169639393, + 0.0016861627160119203, + 0.0017738979496262819, + 0.0018661585023416669, + 0.0019631748220788766, + 0.002065188848316475, + 0.0021724545641445218, + 0.002285238572832956, + 0.002403820700129861, + 0.0025284946228571518, + 0.0026595685251962625, + 0.002797365783291916, + 0.0029422256794014666, + 0.003094504146342883, + 0.0032545745436504633, + 0.003422828465883785, + 0.0035996765847011985, + 0.0037855495252862646, + 0.003980898778218465, + 0.004186197647990597, + 0.004401942238817795, + 0.004628652478840566, + 0.004866873183774421, + 0.005117175160528676, + 0.005380156351894419, + 0.005656443022930811, + 0.005946690989787509, + 0.0062515868913825415, + 0.00657184950472411, + 0.006908231104046688, + 0.007261518863933299, + 0.007632536306910549, + 0.00802214479473812, + 0.008431245064105466, + 0.008860778805253225, + 0.00931173028361296, + 0.009785128002818486, + 0.010282046408402742, + 0.010803607630156817, + 0.011350983261194275, + 0.011925396171556317, + 0.01252812235337668, + 0.013160492794090704, + 0.013823895374080335, + 0.014519776784240126, + 0.015249644458151052, + 0.01601506851314997, + 0.01681768369346545, + 0.017659191307689878, + 0.018541361155500338, + 0.01946603342525899, + 0.020435120564070562, + 0.0214506091000097, + 0.022514561405172863, + 0.02362911738844944, + 0.024796496096723835, + 0.026018997214306363, + 0.027299002434116027, + 0.028638976682105032, + 0.030041469177108135, + 0.031509114292321866, + 0.03304463219714632, + 0.034650829245628796, + 0.03633059808540265, + 0.03808691744442833, + 0.03992285156152384, + 0.041841549220538975, + 0.043846242340825944, + 0.045940244081077275, + 0.048126946398832506, + 0.0504098170135427, + 0.052792395722469146, + 0.05527828998889676, + 0.05787116975386972, + 0.060574761385483386, + 0.06339284069761897, + 0.06632922496083163, + 0.06938776380581285, + 0.07257232894282345, + 0.07588680259714943, + 0.07933506455931116, + 0.08292097774833826, + 0.08664837217026967, + 0.09052102717229636, + 0.09454265185746541, + 0.09871686354694337, + 0.10304716416432734, + 0.10753691439463649, + 0.11218930550664541, + 0.11700732869547889, + 0.12199374178831417, + 0.12715103320489107, + 0.13248138301869522, + 0.13798662096665396, + 0.14366818131391534, + 0.14952705439495348, + 0.15556373474680982, + 0.16177816568596362, + 0.1681696802557104, + 0.174736938419464, + 0.1814778604454086, + 0.18838955641377486, + 0.1954682518143259, + 0.20270920922860386, + 0.21010664610827334, + 0.2176536487292681, + 0.22534208239672343, + 0.23316249807850076, + 0.24110403563378313, + 0.249154323953351, + 0.2572993782954884, + 0.26552349527296243, + 0.2738091459967547, + 0.28213686796302506, + 0.2904851564416695, + 0.2988303562071977, + 0.30714655463054213, + 0.31540547727985246, + 0.323576387409799, + 0.3316259908748645, + 0.33951834829073213, + 0.34721479644800785, + 0.3546738813700224, + 0.36185130562080525, + 0.36869989291780064, + 0.3751695734246244, + 0.3812073935723752, + 0.3867575547131671, + 0.3917614854174312, + 0.3961579527735249, + 0.3998832186391114, + 0.4028712473746625, + 0.4050539722360614, + 0.40636162817959876, + 0.40672315943683307, + 0.4060667107129479, + 0.4043202112555185, + 0.4014120612641092, + 0.39727193006727163, + 0.39183167509980465, + 0.38502638985071796, + 0.37679558744733943, + 0.36708452426728644, + 0.3558456646710014, + 0.34304028344417603, + 0.32864019655278404, + 0.3126296031210719, + 0.295007011885781, + 0.27578721351259183, + 0.2550032460732523, + 0.23270828455905027, + 0.20897736684153934, + 0.18390884853702588, + 0.15762545884375057, + 0.13027481005592695, + 0.10202919789182172, + 0.07308452112160961, + 0.043658152442694, + 0.013985614010031233, + -0.0156840414241623, + -0.04509415978050243, + -0.07398761277278217, + -0.10211482531905676, + -0.1292421568490944, + -0.15515977500868783, + -0.1796877904807851, + -0.20267903168996235, + -0.2240165043368175, + -0.24360344668394135, + -0.2613442104579627, + -0.2771153929043477, + -0.2907294050909459, + -0.30189807187534956, + -0.31021360657330843, + -0.3151809656649065, + -0.316360426786, + -0.313560521973, + -0.306718859855, + -0.295836571459, + -0.280992884214, + -0.262365612209, + -0.24025508954, + -0.215110061504, + -0.187552550848, + -0.158396674143, + -0.128653862729, + -0.0995141417038, + -0.0722906747456, + -0.0483138544627, + -0.0287641398406, + -0.0144434949518, + -0.00551041303276, + -0.001253817273, + -7.39229413267e-05, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 1, + "j": 3, + "angular_momentum": 1 + }, + { + "radial_function": [ + 0.0, + 8.071599659214228e-21, + 1.336176478580422e-19, + 6.999300981938173e-19, + 2.2891645291290026e-18, + 5.783969965414484e-18, + 1.2413708822893084e-17, + 2.3805692475211415e-17, + 4.204189377157523e-17, + 6.972163651299982e-17, + 1.1003080363016621e-16, + 1.6681815084912525e-16, + 2.4467936121918924e-16, + 3.4904952826308163e-16, + 4.86304812068786e-16, + 6.638740735170492e-16, + 8.903613575801787e-16, + 1.1756801674196206e-15, + 1.5312005472672024e-15, + 1.9699100745366796e-15, + 2.5065899494085196e-15, + 3.1580074672858454e-15, + 3.9431262598277346e-15, + 4.883335803273773e-15, + 6.002701810377229e-15, + 7.328239251305134e-15, + 8.890209887839978e-15, + 1.072244634985927e-14, + 1.2862704951084761e-14, + 1.5353049602235025e-14, + 1.824026937692794e-14, + 2.15763324740099e-14, + 2.54188795434413e-14, + 2.9831759566288335e-14, + 3.488561173346431e-14, + 4.065849702920141e-14, + 4.723658351463252e-14, + 5.4714889619981573e-14, + 6.319809007031693e-14, + 7.28013894483532e-14, + 8.365146876307807e-14, + 9.588751080070388e-14, + 1.0966231051395405e-13, + 1.2514347711725137e-13, + 1.4251473513899525e-13, + 1.6197733216337757e-13, + 1.837515616428803e-13, + 2.0807840973902371e-13, + 2.352213358963735e-13, + 2.654681975162523e-13, + 2.991333299145124e-13, + 3.365597936269452e-13, + 3.7812180194011405e-13, + 4.2422734261260377e-13, + 4.753210086584229e-13, + 5.318870543496859e-13, + 5.944526936442899e-13, + 6.635916596204522e-13, + 7.399280448878835e-13, + 8.241404443917348e-13, + 9.169664236510783e-13, + 1.0192073371792693e-12, + 1.1317335237188627e-12, + 1.2554899067736361e-12, + 1.391502031207594e-12, + 1.5408825688014672e-12, + 1.7048383282380355e-12, + 1.8846778074845995e-12, + 2.081819329336022e-12, + 2.297799804166378e-12, + 2.5342841666634985e-12, + 2.793075537416933e-12, + 3.076126163247999e-12, + 3.3855491949256434e-12, + 3.723631364483017e-12, + 4.0928466293781344e-12, + 4.49587085553863e-12, + 4.935597616701812e-12, + 5.41515519276675e-12, + 5.937924856486675e-12, + 6.5075605440582454e-12, + 7.128010011716224e-12, + 7.803537589271831e-12, + 8.538748647437374e-12, + 9.338615906832917e-12, + 1.0208507723677634e-11, + 1.1154218498140781e-11, + 1.2182001362833911e-11, + 1.329860331586823e-11, + 1.4511302984749054e-11, + 1.5827951205160042e-11, + 1.725701463108204e-11, + 1.8807622591859055e-11, + 2.0489617435239252e-11, + 2.231360861638489e-11, + 2.4291030796667717e-11, + 2.643420626185261e-11, + 2.8756411956131345e-11, + 3.127195148013457e-11, + 3.399623241998617e-11, + 3.694584938361869e-11, + 4.0138673159866663e-11, + 4.359394646813037e-11, + 4.7332386744393405e-11, + 5.1376296505008584e-11, + 5.574968182188621e-11, + 6.047837949905363e-11, + 6.559019359377072e-11, + 7.111504194016685e-11, + 7.708511342739217e-11, + 8.353503677761943e-11, + 9.05020616890668e-11, + 9.802625321085007e-11, + 1.0615070033671721e-10, + 1.1492173980639288e-10, + 1.243891962497856e-10, + 1.3460663982859346e-10, + 1.4563166266376727e-10, + 1.575261753615383e-10, + 1.7035672513067857e-10, + 1.8419483703547367e-10, + 1.9911738000675304e-10, + 2.152069594717571e-10, + 2.3255233845680215e-10, + 2.512488892068076e-10, + 2.713990775885064e-10, + 2.931129825192268e-10, + 3.1650885303668634e-10, + 3.417137056691266e-10, + 3.68863964976847e-10, + 3.9810615041601735e-10, + 4.2959761280220853e-10, + 4.635073239007875e-10, + 5.000167230641555e-10, + 5.39320624858635e-10, + 5.816281921650418e-10, + 6.271639793028076e-10, + 6.76169050383604e-10, + 7.289021780521175e-10, + 7.856411285215018e-10, + 8.466840389987075e-10, + 9.123508940678229e-10, + 9.829851082438892e-10, + 1.0589552220569085e-09, + 1.1406567199202963e-09, + 1.2285139784243767e-09, + 1.3229823543823078e-09, + 1.424550422545745e-09, + 1.5337423736276063e-09, + 1.6511205841443848e-09, + 1.7772883703083818e-09, + 1.9128929388962617e-09, + 2.0586285493258e-09, + 2.2152399019247453e-09, + 2.383525768341705e-09, + 2.56434288145883e-09, + 2.7586101031560033e-09, + 2.967312889909276e-09, + 3.191508076862588e-09, + 3.4323290035789867e-09, + 3.6909910054440352e-09, + 3.9687972965494696e-09, + 4.267145272194901e-09, + 4.587533260400033e-09, + 4.9315677546266704e-09, + 5.300971161438669e-09, + 5.697590099990215e-09, + 6.123404292153834e-09, + 6.580536085501688e-09, + 7.071260653262918e-09, + 7.59801692025401e-09, + 8.163419265076282e-09, + 8.770270054178831e-09, + 9.421573066828479e-09, + 1.0120547873089823e-08, + 1.0870645233295794e-08, + 1.1675563590740115e-08, + 1.2539266734670673e-08, + 1.3466002716375768e-08, + 1.4460324107689288e-08, + 1.5527109695336965e-08, + 1.6671587713923535e-08, + 1.7899360725053002e-08, + 1.9216432259628264e-08, + 2.062923534722559e-08, + 2.21446630659722e-08, + 2.3770101255165737e-08, + 2.55134635436277e-08, + 2.7383228856345086e-08, + 2.938848157486087e-08, + 3.153895453747122e-08, + 3.3845075080659014e-08, + 3.631801433447268e-08, + 3.8969740000876256e-08, + 4.181307286330454e-08, + 4.486174728473095e-08, + 4.8130475979857386e-08, + 5.163501935948076e-08, + 5.539225976774927e-08, + 5.942028095985342e-08, + 6.373845318335385e-08, + 6.836752426188129e-08, + 7.332971709866528e-08, + 7.864883405397573e-08, + 8.435036867687627e-08, + 9.046162530589349e-08, + 9.701184709690946e-08, + 1.0403235306178705e-07, + 1.1155668475167325e-07, + 1.1962076326506398e-07, + 1.282630573004674e-07, + 1.375247630222158e-07, + 1.4744999659150542e-07, + 1.5808600018470954e-07, + 1.6948336254155356e-07, + 1.8169625497609968e-07, + 1.9478268395455832e-07, + 2.088047614166782e-07, + 2.2382899407688967e-07, + 2.3992659299421755e-07, + 2.571738048575454e-07, + 2.756522665374371e-07, + 2.954493844217866e-07, + 3.166587403562178e-07, + 3.393805260425507e-07, + 3.637220078220002e-07, + 3.8979802392621077e-07, + 4.177315166599019e-07, + 4.4765410163156827e-07, + 4.797066769042482e-07, + 5.140400746207472e-07, + 5.508157581959646e-07, + 5.90206568164222e-07, + 6.323975200643923e-07, + 6.775866579822102e-07, + 7.259859676226498e-07, + 7.778223529634503e-07, + 8.33338681009185e-07, + 8.927948992092771e-07, + 9.56469230687629e-07, + 1.024659452533792e-06, + 1.0976842630322138e-06, + 1.1758847437546342e-06, + 1.2596259233301968e-06, + 1.3492984495714643e-06, + 1.4453203777096813e-06, + 1.548139082383408e-06, + 1.6582333022407072e-06, + 1.7761153259911743e-06, + 1.9023333296414446e-06, + 2.037473875208934e-06, + 2.1821645823710196e-06, + 2.337076983980371e-06, + 2.5029295790687537e-06, + 2.6804910958313438e-06, + 2.870583979386284e-06, + 3.074088119718727e-06, + 3.291944835680474e-06, + 3.5251611323856462e-06, + 3.7748142513528e-06, + 4.042056531766659e-06, + 4.328120605288543e-06, + 4.634324945885379e-06, + 4.962079798885795e-06, + 5.312893515034904e-06, + 5.6883793161162396e-06, + 6.090262521699898e-06, + 6.520388266733301e-06, + 6.980729744492624e-06, + 7.473397007538654e-06, + 8.00064636631541e-06, + 8.564890422142496e-06, + 9.16870877936276e-06, + 9.81485947923474e-06, + 1.0506291204327168e-05, + 1.124615630340487e-05, + 1.2037824690579644e-05, + 1.2884898676201081e-05, + 1.3791228789566072e-05, + 1.4760930657702852e-05, + 1.579840300948555e-05, + 1.690834687687246e-05, + 1.8095786069716906e-05, + 1.936608900775057e-05, + 2.072499199217301e-05, + 2.2178624015221816e-05, + 2.3733533196015577e-05, + 2.5396714954449426e-05, + 2.7175642024810492e-05, + 2.9078296428324746e-05, + 3.111320352444348e-05, + 3.328946827227383e-05, + 3.5616813831921524e-05, + 3.810562265646362e-05, + 4.0766980222108996e-05, + 4.361272155429959e-05, + 4.6655480723710445e-05, + 4.9908743480890524e-05, + 5.33869032249035e-05, + 5.710532049377955e-05, + 6.108038619023412e-05, + 6.532958874836665e-05, + 6.987158547982308e-05, + 7.472627832538579e-05, + 7.991489427230334e-05, + 8.546007068071872e-05, + 9.138594580867161e-05, + 9.771825480316663e-05, + 0.00010448443146207627, + 0.00011171371606162264, + 0.00011943726958593858, + 0.00012768829466148986, + 0.00013650216356553583, + 0.0001459165536407093, + 0.00015597159048233602, + 0.00016670999928242202, + 0.00017817726469633032, + 0.00019042179963092297, + 0.0002034951233606583, + 0.0002174520493579918, + 0.0002323508832626419, + 0.0002482536313955078, + 0.0002652262202337076, + 0.0002833387272481399, + 0.0003026656235278279, + 0.0003232860285789195, + 0.0003452839776818747, + 0.0003687487022041632, + 0.00039377492317815296, + 0.0004204631585339139, + 0.00044892004422153795, + 0.0004792586695354812, + 0.0005115989268144402, + 0.0005460678757206557, + 0.00058280012217526, + 0.0006219382119835846, + 0.000663633039117962, + 0.0007080442685074768, + 0.0007553407730745133, + 0.0008057010846716431, + 0.0008593138584166117, + 0.0009163783497612034, + 0.0009771049034856256, + 0.0010417154535975446, + 0.0011104440329024361, + 0.001183537291079448, + 0.001261255018839045, + 0.0013438706771847274, + 0.001431671928816555, + 0.0015249611692078242, + 0.001624056054693123, + 0.0017292900237668909, + 0.0018410128084941435, + 0.0019595909312090714, + 0.0020854081820614275, + 0.0022188660727511075, + 0.0023603842599690143, + 0.002510400932870773, + 0.0026693731573829062, + 0.0028377771705225584, + 0.0030161086159290204, + 0.003204882712275829, + 0.003404634345289333, + 0.0036159180730186307, + 0.0038393080341405294, + 0.0040753977472551255, + 0.004324799789443932, + 0.004588145342367814, + 0.004866083590801932, + 0.005159280961899818, + 0.0054684201894534675, + 0.005794199189518344, + 0.006137329733077462, + 0.006498535899257268, + 0.006878552295842016, + 0.007278122031946859, + 0.007697994428513224, + 0.00813892245346474, + 0.008601659867857228, + 0.009086958073312567, + 0.009595562648652016, + 0.010128209568586849, + 0.010685621098321496, + 0.011268501357850083, + 0.011877531557287293, + 0.01251336490369353, + 0.013176621181127553, + 0.013867881015276534, + 0.014587679831107965, + 0.015336501514866638, + 0.016114771801902485, + 0.01692285140171679, + 0.01776102888467024, + 0.018629513344777623, + 0.019528426860070277, + 0.020457796758969176, + 0.02141754770161042, + 0.022407493569809138, + 0.02342732914612139, + 0.024476621541941603, + 0.025554801305357436, + 0.026661153109240516, + 0.027794805869332206, + 0.028954722095577947, + 0.030139686203787344, + 0.03134829144766615, + 0.03257892502101695, + 0.03382975078219988, + 0.035098688918389506, + 0.03638339171706391, + 0.03768121445570397, + 0.03898918023077036, + 0.04030393735319584, + 0.041621707720602565, + 0.04293822436420092, + 0.0442486561398372, + 0.04554751733038096, + 0.0468285597250174, + 0.0480846446081087, + 0.04930759198607867, + 0.05048800439934467, + 0.0516150627818173, + 0.052676292130146844, + 0.05365729524872633, + 0.05454145361238542, + 0.055309595498612724, + 0.05593963305712052, + 0.05640617197398915, + 0.0566800999437636, + 0.05672816334120363, + 0.05651254537419958, + 0.05599046363322939, + 0.055113810364280924, + 0.0538288649555278, + 0.05207611495823792, + 0.049790229287500966, + 0.04690023478339843, + 0.04332995460664767, + 0.03899877338559958, + 0.03382279874036693, + 0.027716490671950495, + 0.020594827861786593, + 0.012376071414775595, + 0.0029851698712587654, + -0.007642178038918787, + -0.019554827008586836, + -0.032780935796270026, + -0.0473223204928774, + -0.06314866100805251, + -0.08019192671788687, + -0.0983415209498547, + -0.11744079017403306, + -0.1372856915776822, + -0.15762654332756199, + -0.17817386710268396, + -0.1986093313572865, + -0.2186026604759943, + -0.23783501783916125, + -0.256028712556584, + -0.2729820248303243, + -0.2886064032113545, + -0.3029612047950369, + -0.31627856356872525, + -0.328968106930626, + -0.34158866632373697, + -0.3547730217381125, + -0.3690942762335035, + -0.384872532787995, + -0.40194465432581666, + -0.4194687104995676, + -0.4359253875133703, + -0.449626866936, + -0.459575967113, + -0.465039284888, + -0.465248534095, + -0.459428091247, + -0.44685238811, + -0.426929121109, + -0.399310086277, + -0.364026989895, + -0.321642502743, + -0.273396145565, + -0.221310655824, + -0.168207823406, + -0.117567306744, + -0.0731546685827, + -0.0383617167696, + -0.015270477423, + -0.003621755926, + -0.000222441146558, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 1, + "j": 4, + "angular_momentum": 2 + }, + { + "radial_function": [ + 0.0, + 6.741751400143345e-10, + 2.7429938799747856e-09, + 6.277984834638273e-09, + 1.1353543591553e-08, + 1.804703841157125e-08, + 2.6438919691546243e-08, + 3.661283331987489e-08, + 4.865573806151129e-08, + 6.265802711429644e-08, + 7.871365398040245e-08, + 9.692026280600889e-08, + 1.1737932334560738e-07, + 1.4019627070816734e-07, + 1.6548065006056963e-07, + 1.9334626645247696e-07, + 2.2391133994735485e-07, + 2.5729866624434924e-07, + 2.9363578297753317e-07, + 3.3305514191050334e-07, + 3.756942871752721e-07, + 4.2169603987281e-07, + 4.7120868913246987e-07, + 5.243861899473084e-07, + 5.813883679738222e-07, + 6.423811315551673e-07, + 7.075366912601761e-07, + 7.77033787064338e-07, + 8.510579236606123e-07, + 9.298016139281916e-07, + 1.0134646310785208e-06, + 1.1022542695945911e-06, + 1.196385615405348e-06, + 1.296081825518744e-06, + 1.4015744175217792e-06, + 1.51310356922581e-06, + 1.6309184288252319e-06, + 1.755277436020935e-06, + 1.8864486543019481e-06, + 2.0247101149944488e-06, + 2.170350173364388e-06, + 2.3236678770796784e-06, + 2.484973347832557e-06, + 2.654588176083858e-06, + 2.832845829855229e-06, + 3.0200920776720047e-06, + 3.2166854264607604e-06, + 3.4229975746182053e-06, + 3.639413881135101e-06, + 3.86633385101813e-06, + 4.104171637626197e-06, + 4.353356562777737e-06, + 4.614333654834039e-06, + 4.887564205815083e-06, + 5.173526347705655e-06, + 5.472715649181399e-06, + 5.785645733033423e-06, + 6.112848915145818e-06, + 6.454876865864258e-06, + 6.812301294409206e-06, + 7.185714657169521e-06, + 7.5757308906945376e-06, + 7.982986170395507e-06, + 8.408139695517701e-06, + 8.851874501632918e-06, + 9.314898301348994e-06, + 9.797944354462584e-06, + 1.0301772368395536e-05, + 1.0827169429816038e-05, + 1.137495096911352e-05, + 1.1945961758028506e-05, + 1.2541076942481106e-05, + 1.316120311087173e-05, + 1.380727940005518e-05, + 1.4480278639523969e-05, + 1.5181208535449263e-05, + 1.5911112895948487e-05, + 1.667107289915347e-05, + 1.746220840507355e-05, + 1.8285679313295664e-05, + 1.9142686968031137e-05, + 2.0034475611485547e-05, + 2.09623338886162e-05, + 2.1927596403215986e-05, + 2.293164532892304e-05, + 2.3975912075749084e-05, + 2.5061879014404318e-05, + 2.619108126163552e-05, + 2.736510852489852e-05, + 2.8585607015505387e-05, + 2.9854281422786248e-05, + 3.1172896961576335e-05, + 3.254328148856778e-05, + 3.3967327691313654e-05, + 3.544699535635726e-05, + 3.69843137106157e-05, + 3.8581383851877884e-05, + 4.0240381256214405e-05, + 4.196355837420416e-05, + 4.3753247321830766e-05, + 4.561186266053507e-05, + 4.7541904270320954e-05, + 4.954596033251871e-05, + 5.162671040524981e-05, + 5.378692861293783e-05, + 5.6029486943595053e-05, + 5.83573586587305e-05, + 6.077362182564991e-05, + 6.328146296664796e-05, + 6.588418084198968e-05, + 6.858519035581063e-05, + 7.13880266039583e-05, + 7.429634905666547e-05, + 7.731394589298659e-05, + 8.044473847708289e-05, + 8.369278599553236e-05, + 8.706229025174105e-05, + 9.055760063175476e-05, + 9.418321923360649e-05, + 9.794380618039095e-05, + 0.00010184418511903799, + 0.00010588934889917, + 0.00011008446546075343, + 0.00011443488392006725, + 0.00011894614086121439, + 0.0001236239668581825, + 0.00012847429320773818, + 0.0001335032589048306, + 0.00013871721785821262, + 0.00014412274635078884, + 0.00014972665076451246, + 0.00015553597556971133, + 0.00016155801158380142, + 0.0001678003045294433, + 0.00017427066387654946, + 0.00018097717199897428, + 0.00018792819363464098, + 0.00019513238569096475, + 0.0002025987073728633, + 0.0002103364306696708, + 0.00021835515120245536, + 0.000226664799440818, + 0.0002352756523207394, + 0.0002441983452493196, + 0.0002534438845299383, + 0.000263023660216328, + 0.00027294945941332274, + 0.00028323348003475064, + 0.00029388834503206955, + 0.00030492711711956375, + 0.0003163633140117192, + 0.0003282109241745134, + 0.0003404844231285655, + 0.00035319879031813476, + 0.00036636952655417446, + 0.00038001267206347697, + 0.00039414482515706884, + 0.0004087831615563287, + 0.00042394545436205824, + 0.0004396500947311986, + 0.0004559161132639654, + 0.00047276320211875865, + 0.000490211737902426, + 0.0005082828053390203, + 0.0005269982217648621, + 0.0005463805624559174, + 0.0005664531868378199, + 0.0005872402655926718, + 0.0006087668087116658, + 0.0006310586944921174, + 0.0006541426995613704, + 0.0006780465299113026, + 0.0007027988530090904, + 0.000728429331026583, + 0.0007549686551895215, + 0.0007824485813287107, + 0.0008109019666532054, + 0.0008403628077808521, + 0.000870866280073579, + 0.0009024487783475741, + 0.0009351479589587062, + 0.0009690027833559792, + 0.001004053563117093, + 0.0010403420065429891, + 0.001077911266848736, + 0.0011168059920137671, + 0.001157072376340876, + 0.0011987582137945813, + 0.0012419129531621113, + 0.0012865877551184253, + 0.001332835551238613, + 0.001380711105054692, + 0.0014302710751937276, + 0.0014815740806695006, + 0.0015346807684601571, + 0.0015896538833471596, + 0.0016465583401894057, + 0.0017054612986651732, + 0.0017664322405552368, + 0.0018295430497131488, + 0.0018948680947307366, + 0.0019624843144715994, + 0.0020324713065054713, + 0.0021049114185916536, + 0.002179889843283184, + 0.0022574947157408664, + 0.002337817214946973, + 0.0024209516683355303, + 0.0025069956599880314, + 0.002596050142562146, + 0.0026882195530350604, + 0.002783611932340742, + 0.0028823390492881476, + 0.0029845165282563597, + 0.003090263981785768, + 0.0031997051473900617, + 0.00331296802898291, + 0.0034301850432398614, + 0.003551493171010933, + 0.0036770341136592947, + 0.003806954454770022, + 0.003941405827656786, + 0.004080545088070636, + 0.004224534493001192, + 0.004373541885726479, + 0.004527740886936741, + 0.004687311091978058, + 0.004852438275680227, + 0.005023314603084933, + 0.005200138848079306, + 0.005383116618897694, + 0.005572460591544299, + 0.005768390750975081, + 0.005971134640354686, + 0.006180927618721077, + 0.006398013127408254, + 0.006622642965197748, + 0.006855077573025719, + 0.007095586327920312, + 0.007344447847021863, + 0.00760195030151617, + 0.007868391741379514, + 0.00814408043051158, + 0.008429335193621271, + 0.008724485774099554, + 0.009029873204288314, + 0.009345850187442871, + 0.009672781492948842, + 0.010011044364377934, + 0.010361028940956153, + 0.010723138692749715, + 0.011097790871106652, + 0.01148541697249271, + 0.011886463218985382, + 0.012301391053459084, + 0.012730677651241952, + 0.01317481644898974, + 0.013634317690310904, + 0.014109708988712541, + 0.014601535910114162, + 0.015110362572621341, + 0.015636772266972142, + 0.016181368096265716, + 0.01674477363622296, + 0.01732763361708187, + 0.01793061462674193, + 0.01855440583690574, + 0.019199719751159423, + 0.01986729297838865, + 0.02055788702874332, + 0.021272289136580448, + 0.022011313107098113, + 0.022775800191222585, + 0.023566619986523915, + 0.024384671366558454, + 0.025230883438649366, + 0.026106216530968594, + 0.02701166321012963, + 0.02794824932943043, + 0.028917035108466566, + 0.029919116245848833, + 0.030955625065008686, + 0.03202773169348897, + 0.033136645278371665, + 0.03428361523498187, + 0.03546993253558596, + 0.036696931031260614, + 0.03796598881535383, + 0.03927852962336103, + 0.040636024273391545, + 0.04203999214648376, + 0.04349200270944947, + 0.04499367707678276, + 0.04654668961742249, + 0.04815276960431039, + 0.04981370290643721, + 0.05153133372753399, + 0.05330756638705162, + 0.05514436714927874, + 0.057043766096478384, + 0.05900785905064675, + 0.06103880953895389, + 0.0631388508092957, + 0.06531028789053352, + 0.06755549970320462, + 0.0698769412133577, + 0.07227714563768702, + 0.07475872669303502, + 0.07732438089436214, + 0.0799768898961939, + 0.08271912288399542, + 0.08555403900465886, + 0.0884846898455352, + 0.09151422195342196, + 0.09464587939375785, + 0.09788300635177531, + 0.1012290497683789, + 0.10468756201122174, + 0.1082622035805655, + 0.11195674584174832, + 0.1157750737854504, + 0.11972118881019417, + 0.1237992115238599, + 0.12801338455723396, + 0.1323680753887421, + 0.13686777917177237, + 0.14151712155752488, + 0.14632086151178916, + 0.15128389410888485, + 0.15641125330738168, + 0.16170811468561958, + 0.16717979813773154, + 0.17283177051126974, + 0.17866964818231465, + 0.18469919955050065, + 0.19092634744084586, + 0.19735717140029713, + 0.2039979098713321, + 0.2108549622234394, + 0.21793489062692276, + 0.22524442174838877, + 0.23279044824427159, + 0.24058003003049236, + 0.24862039530104327, + 0.2569189412661378, + 0.2654832346132249, + 0.2743210115716026, + 0.2834401776662633, + 0.2928488070396911, + 0.30255514132047984, + 0.3125675880274179, + 0.3228947184149344, + 0.33354526477850416, + 0.34452811710375775, + 0.35585231902984693, + 0.3675270631135028, + 0.37956168525863, + 0.3919656582997502, + 0.4047485846379047, + 0.41792018790682606, + 0.43149030353071355, + 0.44546886812492975, + 0.4598659076596422, + 0.47469152427165473, + 0.48995588166389303, + 0.5056691889429208, + 0.5218416828105382, + 0.5384836080543325, + 0.5556051960942034, + 0.573216641592461, + 0.5913280768969776, + 0.6099495442387775, + 0.6290909655642607, + 0.6487621097621169, + 0.6689725572243057, + 0.6897316615504937, + 0.7110485082252195, + 0.7329318701197358, + 0.7553901595957518, + 0.7784313771246506, + 0.8020630561421178, + 0.8262922040167006, + 0.8511252389537881, + 0.8765679225513371, + 0.9026252879500246, + 0.9293015633483529, + 0.9566000905925022, + 0.9845232388320934, + 1.0130723129795238, + 1.0422474567302458, + 1.0720475502113647, + 1.1024701018594036, + 1.1335111346192268, + 1.1651650661937976, + 1.197424583439237, + 1.230280510696538, + 1.2637216721653892, + 1.2977347482953705, + 1.3323041262863902, + 1.3674117448437366, + 1.403036933323741, + 1.439156245630851, + 1.4757432890784739, + 1.5127685487772224, + 1.5501992078937725, + 1.5879989646477615, + 1.62612784654105, + 1.6645420228758352, + 1.7031936165675103, + 1.7420305163142533, + 1.7809961906180145, + 1.8200295051124735, + 1.859064545000039, + 1.8980304444502785, + 1.9368512252603958, + 1.9754456470828936, + 2.0137270720529687, + 2.0516033465438284, + 2.0889767035342097, + 2.1257436888492554, + 2.1617951152848747, + 2.197016048572479, + 2.23128582964602, + 2.2644781378906904, + 2.296461100321191, + 2.327097451893842, + 2.3562447524700127, + 2.3837556659988746, + 2.409478307866894, + 2.433256666227314, + 2.454931103362686, + 2.4743389430553404, + 2.491315149749575, + 2.505693105199874, + 2.5173054879019516, + 2.525985260182431, + 2.5315667672199313, + 2.533886951564476, + 2.532786685789056, + 2.5281122248608905, + 2.5197167785512358, + 2.507462202751823, + 2.4912208069140127, + 2.470877272974444, + 2.446330679000811, + 2.417496618484122, + 2.384309403580416, + 2.3467243376542757, + 2.3047200391441365, + 2.2583007950444998, + 2.2074989177445494, + 2.1523770738943266, + 2.0930305474873374, + 2.029589391830159, + 1.9622204154278606, + 1.8911289349434073, + 1.8165602138880188, + 1.738800487261812, + 1.6581774508299254, + 1.5750600675173791, + 1.4898575146465065, + 1.4030170650192713, + 1.31502066726132, + 1.2263799730550484, + 1.1376295649995634, + 1.049318190121423, + 0.961997936122832, + 0.8762115555585451, + 0.7924786321169808, + 0.7112821216254583, + 0.6330581801640733, + 0.558196597156, + 0.487041593577, + 0.419922968996, + 0.35715022932, + 0.299014042252, + 0.245784253134, + 0.197704733729, + 0.154983718351, + 0.117778412676, + 0.0861731570195, + 0.06015142921, + 0.0395636713985, + 0.0240954173141, + 0.0132434395572, + 0.00631116960482, + 0.00243730050723, + 0.000670858539131, + 9.79139086286e-05, + 2.77607866759e-06, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 2, + "j": 2, + "angular_momentum": 0 + }, + { + "radial_function": [ + 0.0, + 1.08711925632079e-19, + 1.799622431625485e-18, + 9.4269726100366e-18, + 3.08314950357613e-17, + 7.790110293684398e-17, + 1.6719340124247554e-16, + 3.2062575032432317e-16, + 5.662390958316738e-16, + 9.390422989602976e-16, + 1.4819442636124414e-15, + 2.2467817635698526e-15, + 3.2954515272119723e-15, + 4.701155842870509e-15, + 6.549771709683838e-15, + 8.941354378706054e-15, + 1.1991787014470875e-14, + 1.5834589160675203e-14, + 2.0622897720724995e-14, + 2.6531635274528695e-14, + 3.3759881735415676e-14, + 4.253346665959759e-14, + 5.310780087160377e-14, + 6.577096759117778e-14, + 8.084709483107998e-14, + 9.87000325732446e-14, + 1.197373601025643e-13, + 1.4441475082570253e-13, + 1.7324072416527716e-13, + 2.0678181629013118e-13, + 2.4566820409860004e-13, + 2.9059981940825395e-13, + 3.423529933152136e-13, + 4.017876736953284e-13, + 4.698552622418212e-13, + 5.476071209539034e-13, + 6.362038018887083e-13, + 7.369250582062188e-13, + 8.511806987991692e-13, + 9.805223538982454e-13, + 1.1266562239629855e-12, + 1.2914568896603339e-12, + 1.4769822671912784e-12, + 1.68548979876924e-12, + 1.919453975914593e-12, + 2.1815852997118393e-12, + 2.4748507909131606e-12, + 2.802496170535987e-12, + 3.1680698416694893e-12, + 3.5754488121138385e-12, + 4.028866708492623e-12, + 4.532944044321061e-12, + 5.0927209154794555e-12, + 5.713692311185013e-12, + 6.401846240768409e-12, + 7.1637048938745634e-12, + 8.006369065830957e-12, + 8.937566098462555e-12, + 9.965701605326714e-12, + 1.1099915269822998e-11, + 1.2350141026529182e-11, + 1.3727171959088004e-11, + 1.5242730273363614e-11, + 1.6909542729504037e-11, + 1.8741421947354977e-11, + 2.0753354028234847e-11, + 2.296159297084374e-11, + 2.5383762392712963e-11, + 2.8038965106251467e-11, + 3.094790114268851e-11, + 3.413299485393504e-11, + 3.761853177756178e-11, + 4.143080599074774e-11, + 4.559827874310293e-11, + 5.015174920637505e-11, + 5.512453824678356e-11, + 6.0552686190338e-11, + 6.647516562384905e-11, + 7.29341103458104e-11, + 7.997506167038911e-11, + 8.764723337166313e-11, + 9.600379664350523e-11, + 1.0510218656945402e-10, + 1.1500443167645518e-10, + 1.2577750829524763e-10, + 1.3749372154591357e-10, + 1.5023111491491924e-10, + 1.640739105449817e-10, + 1.7911298245263402e-10, + 1.9544636518265998e-10, + 2.1317980037872172e-10, + 2.3242732418582543e-10, + 2.533118983891147e-10, + 2.7596608850890694e-10, + 3.005327923543404e-10, + 3.2716602258955236e-10, + 3.5603174748306895e-10, + 3.873087938341842e-10, + 4.211898167660787e-10, + 4.5788234133058263e-10, + 4.976098809929051e-10, + 5.406131385940878e-10, + 5.87151296093168e-10, + 6.375033990947788e-10, + 6.919698434561195e-10, + 7.508739711626519e-10, + 8.145637834208609e-10, + 8.834137796334268e-10, + 9.578269311215254e-10, + 1.0382367997257118e-09, + 1.1251098113275499e-09, + 1.2189476959485543e-09, + 1.3202901061055196e-09, + 1.4297174267213355e-09, + 1.5478537899134884e-09, + 1.6753703099565748e-09, + 1.8129885539755265e-09, + 1.9614842657307988e-09, + 2.121691360184165e-09, + 2.294506208958582e-09, + 2.4808922375044256e-09, + 2.6818848558342924e-09, + 2.898596747901299e-09, + 3.1322235446053196e-09, + 3.3840499079736924e-09, + 3.655456057064927e-09, + 3.9479247658100586e-09, + 4.263048868039741e-09, + 4.60253930553876e-09, + 4.968233757823967e-09, + 5.3621058961135326e-09, + 5.786275305663269e-09, + 6.243018124012704e-09, + 6.734778447978677e-09, + 7.264180562546109e-09, + 7.834042052100447e-09, + 8.447387855338362e-09, + 9.107465334036422e-09, + 9.817760425213362e-09, + 1.0582014956329631e-08, + 1.1404245205703716e-08, + 1.2288761796704236e-08, + 1.3240191022965655e-08, + 1.4263497703870074e-08, + 1.5364009681599333e-08, + 1.654744407627886e-08, + 1.7819935425001606e-08, + 1.9188065838483007e-08, + 2.0658897318815677e-08, + 2.2240006393601402e-08, + 2.3939521231430713e-08, + 2.5766161413082337e-08, + 2.7729280550427423e-08, + 2.9838911955186026e-08, + 3.2105817572729686e-08, + 3.4541540415154615e-08, + 3.715846074122778e-08, + 3.996985625285343e-08, + 4.2989966586601423e-08, + 4.623406241347912e-08, + 4.9718519470517735e-08, + 5.346089787281134e-08, + 5.748002708583867e-08, + 6.17960969548902e-08, + 6.643075522633114e-08, + 7.140721201613566e-08, + 7.675035172384845e-08, + 8.248685291614228e-08, + 8.864531675012079e-08, + 9.525640453240022e-08, + 1.0235298507585167e-07, + 1.0997029253356072e-07, + 1.1814609546124568e-07, + 1.2692087790601098e-07, + 1.3633803336083355e-07, + 1.4644407251040364e-07, + 1.572888457380791e-07, + 1.6892578143613333e-07, + 1.8141214123886336e-07, + 1.9480929338661912e-07, + 2.0918300548451263e-07, + 2.2460375804648132e-07, + 2.411470802792281e-07, + 2.588939096899871e-07, + 2.779309771951168e-07, + 2.983512195358239e-07, + 3.202542209269816e-07, + 3.437466860109489e-07, + 3.68942946318307e-07, + 3.959655026126289e-07, + 4.2494560564062377e-07, + 4.5602387801771433e-07, + 4.893509801328624e-07, + 5.250883231782693e-07, + 5.634088326705867e-07, + 6.044977659549371e-07, + 6.485535875670814e-07, + 6.957889064997374e-07, + 7.464314797276503e-07, + 8.007252867112466e-07, + 8.589316798136835e-07, + 9.21330616049458e-07, + 9.882219758399269e-07, + 1.0599269749502143e-06, + 1.1367896761426593e-06, + 1.2191786075496603e-06, + 1.307488495365246e-06, + 1.4021421188025658e-06, + 1.503592295953418e-06, + 1.6123240098179265e-06, + 1.7288566843194653e-06, + 1.8537466207889268e-06, + 1.9875896065422354e-06, + 2.1310237067849393e-06, + 2.2847322540682423e-06, + 2.44944704806076e-06, + 2.625951780727441e-06, + 2.8150857030106153e-06, + 3.017747549934558e-06, + 3.2348997417951394e-06, + 3.4675728812519722e-06, + 3.716870567585777e-06, + 3.983974548963183e-06, + 4.270150237689005e-06, + 4.576752613909299e-06, + 4.905232544268833e-06, + 5.25714354419343e-06, + 5.634149017667092e-06, + 6.0380300037555925e-06, + 6.470693469401111e-06, + 6.934181183810717e-06, + 7.430679217119789e-06, + 7.962528106051461e-06, + 8.53223373338848e-06, + 9.14247897139498e-06, + 9.79613614288912e-06, + 1.0496280356228949e-05, + 1.1246203776970462e-05, + 1.204943089974165e-05, + 1.2909734891978405e-05, + 1.3831155082783152e-05, + 1.4818015678890189e-05, + 1.5874945790663385e-05, + 1.7006900863387183e-05, + 1.8219185607619118e-05, + 1.9517478537289723e-05, + 2.0907858223188267e-05, + 2.2396831386385717e-05, + 2.3991362956349286e-05, + 2.5698908231215255e-05, + 2.75274472859172e-05, + 2.9485521790302978e-05, + 3.158227439303359e-05, + 3.3827490864344356e-05, + 3.623164517641633e-05, + 3.880594773232977e-05, + 4.1562396964071016e-05, + 4.451383452761516e-05, + 4.767400434443638e-05, + 5.105761576761821e-05, + 5.468041113925092e-05, + 5.855923806269946e-05, + 6.271212670248118e-05, + 6.715837246398043e-05, + 7.191862442905329e-05, + 7.701497993728016e-05, + 8.247108574639886e-05, + 8.83122462111241e-05, + 9.456553898865057e-05, + 0.0001012599387580163, + 0.00010842644954026427, + 0.00011609824617240515, + 0.0001243108256028549, + 0.00013310216865296116, + 0.0001425129129801894, + 0.00015258653800317377, + 0.00016336956260899543, + 0.00017491175652302498, + 0.0001872663662676993, + 0.00020049035670517058, + 0.00021464466923980794, + 0.00022979449780536455, + 0.0002460095838407985, + 0.0002633645315736618, + 0.0002819391449331522, + 0.0003018187876537406, + 0.0003230947680158091, + 0.00034586475001640806, + 0.00037023319265335294, + 0.0003963118192770248, + 0.00042422011900690286, + 0.00045408588240663774, + 0.00048604577363076237, + 0.0005202459415894802, + 0.0005568426726854906, + 0.0005960030878724743, + 0.0006379058870691538, + 0.0006827421439588136, + 0.0007307161546449101, + 0.0007820463436116105, + 0.0008369662308816459, + 0.0008957254642563173, + 0.000958590921083907, + 0.0010258478839499244, + 0.0010978012952892978, + 0.0011747770958307863, + 0.0012571236525817137, + 0.0013452132819313713, + 0.0014394438741601198, + 0.001540240625712363, + 0.0016480578864033672, + 0.0017633811285131045, + 0.00188672904592289, + 0.0020186557912374352, + 0.0021597533596488913, + 0.0023106541289066593, + 0.0024720335649039446, + 0.002644613103286122, + 0.002829163218071528, + 0.0030265066885110797, + 0.003237522076518444, + 0.0034631474273574404, + 0.003704384207098961, + 0.003962301490880985, + 0.004238040417130508, + 0.004532818923260809, + 0.004847936779240449, + 0.005184780936657039, + 0.005544831210760359, + 0.005929666315325886, + 0.006340970269264707, + 0.0067805391964402386, + 0.007250288539681986, + 0.007752260712076389, + 0.008288633208555093, + 0.00886172720209379, + 0.00947401664993068, + 0.01012813793570201, + 0.010826900074151324, + 0.011573295506333512, + 0.01237051151364425, + 0.013221942279484896, + 0.01413120162828746, + 0.015102136471696434, + 0.016138840991938803, + 0.017245671597064388, + 0.01842726266752683, + 0.019688543139327427, + 0.0210347539431002, + 0.022471466330083654, + 0.024004601117416303, + 0.02564044887213407, + 0.027385691068563887, + 0.029247422231645327, + 0.031233173088972884, + 0.03335093475546633, + 0.035609183950074695, + 0.0380169092604135, + 0.040583638450576213, + 0.0433194668164485, + 0.04623508656332879, + 0.04934181718949439, + 0.05265163684461908, + 0.05617721461331652, + 0.05993194367397079, + 0.0639299752484394, + 0.06818625325680129, + 0.07271654958297967, + 0.07753749978756701, + 0.08266663914655004, + 0.08812243880657208, + 0.09392434185950051, + 0.10009279909891068, + 0.10664930414785437, + 0.11361642766366066, + 0.12101785024449341, + 0.12887839362071746, + 0.13722404967150578, + 0.14608200672390204, + 0.15548067258259754, + 0.16544969360013292, + 0.17601996908604664, + 0.18722366025823975, + 0.19909419280953994, + 0.21166625217424512, + 0.22497577041579297, + 0.23905990352174647, + 0.2539569979268612, + 0.2697065448587212, + 0.2863491209876751, + 0.30392631392105973, + 0.32248063070931215, + 0.3420553876866612, + 0.36269457964586266, + 0.3844427264523614, + 0.40734469490799735, + 0.4314454937723525, + 0.45679003968097714, + 0.483422891703853, + 0.5113879522759852, + 0.5407281321939335, + 0.5714849775507794, + 0.6036982564039266, + 0.6374055033414349, + 0.672641520060042, + 0.709437830726099, + 0.7478220908200006, + 0.7878174490185678, + 0.8294418620714363, + 0.8727073631900022, + 0.9176192855419664, + 0.9641754431509169, + 1.0123652727337844, + 1.0621689410356943, + 1.1135564238455962, + 1.1664865640914819, + 1.220906118399202, + 1.27674880275488, + 1.3339343504061936, + 1.3923675963241127, + 1.4519376051013995, + 1.512516860498379, + 1.5739605368644416, + 1.6361058740347347, + 1.6987716784006905, + 1.7617579734648434, + 1.8248458233288385, + 1.887797351422389, + 1.950355975393519, + 2.0122468755352796, + 2.073177710118704, + 2.1328395849859483, + 2.190908276934903, + 2.2470457014522816, + 2.3009016042367305, + 2.3521154436898395, + 2.4003184181363117, + 2.445135578058859, + 2.4861879505835356, + 2.5230945929191937, + 2.5554744848845368, + 2.5829481708651123, + 2.6051390714731504, + 2.6216744086442314, + 2.6321857290828676, + 2.636309074221552, + 2.6336849348574267, + 2.6239582489401236, + 2.606778853767797, + 2.5818029883009426, + 2.548696651556215, + 2.5071418460903465, + 2.456846947381536, + 2.397562602420026, + 2.3291046162519318, + 2.2513851527359803, + 2.1644531473195245, + 2.0685439676557205, + 1.9641369029783402, + 1.852016844299256, + 1.7333333923762806, + 1.609646545246066, + 1.482943231453862, + 1.355603839375381, + 1.2302938682086981, + 1.1097554981445843, + 0.9964819903321523, + 0.8922825842204298, + 0.79780064895813, + 0.7121555178886277, + 0.6330741314852929, + 0.558196597156, + 0.487041593577, + 0.419922968996, + 0.35715022932, + 0.299014042252, + 0.245784253134, + 0.197704733729, + 0.154983718351, + 0.117778412676, + 0.0861731570195, + 0.06015142921, + 0.0395636713985, + 0.0240954173141, + 0.0132434395572, + 0.00631116960482, + 0.00243730050723, + 0.000670858539131, + 9.79139086286e-05, + 2.77607866759e-06, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 2, + "j": 2, + "angular_momentum": 2 + }, + { + "radial_function": [ + -0.0, + -6.811162968239021e-10, + -2.771235132920732e-09, + -6.342621565753884e-09, + -1.1470437143329894e-08, + -1.8232846692986492e-08, + -2.6711128911100092e-08, + -3.698979088571974e-08, + -4.915668669015926e-08, + -6.330314019085337e-08, + -7.952407221475688e-08, + -9.791813223098095e-08, + -1.1858783470467294e-07, + -1.4163970028199168e-07, + -1.6718440198339103e-07, + -1.953369165710706e-07, + -2.262166812772104e-07, + -2.599477560795956e-07, + -2.9665899171306574e-07, + -3.364842036370133e-07, + -3.795623521094107e-07, + -4.260377286879881e-07, + -4.7606014925679477e-07, + -5.297851538984249e-07, + -5.873742138023639e-07, + -6.489949454711937e-07, + -7.148213325199794e-07, + -7.850339551963062e-07, + -8.598202281138518e-07, + -9.393746462279106e-07, + -1.0238990395775143e-06, + -1.1136028369113695e-06, + -1.2087033386439964e-06, + -1.3094259993679033e-06, + -1.4160047203343447e-06, + -1.5286821521838067e-06, + -1.6477100082981209e-06, + -1.7733493892302497e-06, + -1.9058711184071498e-06, + -2.045556089721171e-06, + -2.1926956272991747e-06, + -2.347591857758491e-06, + -2.5105580957585433e-06, + -2.6819192428095075e-06, + -2.8620122002735625e-06, + -3.0511862966625042e-06, + -3.249803730044028e-06, + -3.4582400257755692e-06, + -3.6768845104584954e-06, + -3.906140802358057e-06, + -4.1464273189119606e-06, + -4.398177802192921e-06, + -4.661841862532348e-06, + -4.937885541372528e-06, + -5.226791893506685e-06, + -5.529061589949267e-06, + -5.845213541717926e-06, + -6.175785545390338e-06, + -6.521334951282719e-06, + -6.882439354910209e-06, + -7.259697312573615e-06, + -7.653729081898942e-06, + -8.065177388351058e-06, + -8.494708218288555e-06, + -8.943011639822412e-06, + -9.410802652182278e-06, + -9.89882206482922e-06, + -1.040783740716394e-05, + -1.0938643869740953e-05, + -1.1492065278674824e-05, + -1.2068955103542879e-05, + -1.2670197500848985e-05, + -1.3296708393324971e-05, + -1.3949436587293353e-05, + -1.4629364928632873e-05, + -1.533751149901216e-05, + -1.607493085377466e-05, + -1.684271530306495e-05, + -1.764199623720111e-05, + -1.84739454983562e-05, + -1.9339776800074086e-05, + -2.0240747195606158e-05, + -2.1178158598164935e-05, + -2.2153359353032743e-05, + -2.316774586516203e-05, + -2.4222764282866256e-05, + -2.531991223990271e-05, + -2.6460740659197044e-05, + -2.7646855616513505e-05, + -2.887992027330525e-05, + -3.016165687120788e-05, + -3.149384880061371e-05, + -3.287834273882018e-05, + -3.4317050861579146e-05, + -3.5811953134586644e-05, + -3.736509967898167e-05, + -3.89786132268777e-05, + -4.065469165459854e-05, + -4.239561060564615e-05, + -4.4203726209313865e-05, + -4.608147788937435e-05, + -4.803139126677999e-05, + -5.005608117315082e-05, + -5.2158254757919395e-05, + -5.4340714710697056e-05, + -5.660636259252688e-05, + -5.895820228091887e-05, + -6.13993435385387e-05, + -6.39330056999936e-05, + -6.656252149378666e-05, + -6.92913409884572e-05, + -7.212303568212562e-05, + -7.506130272826043e-05, + -7.810996931477303e-05, + -8.127299718642399e-05, + -8.455448732991459e-05, + -8.795868481769978e-05, + -9.148998382496929e-05, + -9.515293281185093e-05, + -9.895223989123643e-05, + -0.00010289277838422118, + -0.00010697959255748606, + -0.00011121790357162715, + -0.00011561311562984852, + -0.00012017082233431898, + -0.0001248968132754568, + -0.00012979708083422402, + -0.00013487782722943273, + -0.0001401454718077481, + -0.00014560665858094502, + -0.00015126826403044383, + -0.00015713740517900584, + -0.00016322144793459782, + -0.00016952801573679095, + -0.00017606499848994288, + -0.00018284056181431214, + -0.00018986315660374453, + -0.00019714152893222204, + -0.00020468473028633288, + -0.00021250212816035388, + -0.00022060341701546035, + -0.0002289986296122371, + -0.000237698148748383, + -0.0002467127193873085, + -0.00025605346121150183, + -0.000265731881609243, + -0.0002757598891126146, + -0.0002861498072973857, + -0.00029691438915850984, + -0.00030806683198732345, + -0.0003196207927662234, + -0.0003315904040825816, + -0.0003439902906002332, + -0.0003568355861026741, + -0.00037014195111626115, + -0.00038392559114578377, + -0.00039820327553570284, + -0.00041299235699593167, + -0.00042831079177723665, + -0.0004441771605616223, + -0.0004606106900705053, + -0.00047763127540821637, + -0.0004952595031889025, + -0.0005135166754500074, + -0.0005324248344006381, + -0.0005520067880108953, + -0.0005722861364930198, + -0.0005932872996886409, + -0.0006150355454116826, + -0.0006375570187455035, + -0.000660878772377597, + -0.0006850287979554147, + -0.0007100360585296552, + -0.0007359305221278186, + -0.0007627431964592781, + -0.0007905061648348391, + -0.0008192526233210594, + -0.0008490169191650501, + -0.0008798345905376504, + -0.0009117424076658496, + -0.0009447784153548335, + -0.0009789819769934122, + -0.001014393820057065, + -0.0010510560831862932, + -0.0010890123648780348, + -0.0011283077738538253, + -0.0011689889811546395, + -0.0012111042740337763, + -0.0012547036116915093, + -0.001299838682933781, + -0.0013465629657987597, + -0.0013949317892493062, + -0.0014450023969686922, + -0.0014968340133325669, + -0.0015504879116910125, + -0.0016060274849357952, + -0.0016635183185285023, + -0.0017230282660226153, + -0.0017846275271536645, + -0.0018483887286450103, + -0.0019143870077374516, + -0.001982700098617267, + -0.0020534084217759788, + -0.002126595176451617, + -0.0022023464362239775, + -0.002280751247853984, + -0.0023619017335590104, + -0.0024458931967413318, + -0.002532824231320182, + -0.0026227968348368153, + -0.0027159165254151425, + -0.002812292462658199, + -0.0029120375728715325, + -0.0030152686781044742, + -0.003122106630140065, + -0.003232676448751598, + -0.003347107464623868, + -0.0034655334672631572, + -0.0035880928580127864, + -0.0037149288080485445, + -0.00384618942180278, + -0.0039820279062496335, + -0.004122602745449694, + -0.0042680778812538, + -0.004418622900324135, + -0.004574413227296428, + -0.00473563032412987, + -0.004902461897124655, + -0.005075102109906173, + -0.005253751804401966, + -0.005438618728764048, + -0.0056299177733005, + -0.005827871214253536, + -0.0060327089657435705, + -0.006244668840215925, + -0.006463996817744736, + -0.0066909473241650455, + -0.006925783518869121, + -0.007168777591938918, + -0.007420211071476896, + -0.007680375140964375, + -0.00794957096755625, + -0.008228110040884739, + -0.0085163145237522, + -0.008814517613940226, + -0.00912306391855971, + -0.009442309840233337, + -0.009772623976688606, + -0.010114387533342949, + -0.010467994749461767, + -0.010833853338199322, + -0.011212384942077923, + -0.011604025602026453, + -0.012009226243277684, + -0.012428453176138861, + -0.012862188613436512, + -0.0133109312053909, + -0.01377519659145157, + -0.0142555179696721, + -0.014752446685896842, + -0.015266552840430523, + -0.015798425915642005, + -0.016348675423100163, + -0.016917931571508144, + -0.01750684595655352, + -0.018116092272288394, + -0.01874636704580982, + -0.019398390394175166, + -0.02007290680698906, + -0.020770685951850658, + -0.02149252350714179, + -0.02223924201883995, + -0.02301169178597124, + -0.023810751772461336, + -0.02463733054781402, + -0.025492367256635246, + -0.02637683261788181, + -0.027291729955064244, + -0.02823809625755213, + -0.029217003273717856, + -0.030229558637679295, + -0.03127690702963411, + -0.03236023137019617, + -0.03348075405142394, + -0.03463973820166018, + -0.035838488990982235, + -0.0370783549703796, + -0.038360729453179754, + -0.039687051933503886, + -0.04105880954598412, + -0.04247753856600648, + -0.0439448259532021, + -0.045462310934700156, + -0.047031686634007225, + -0.048654701743449116, + -0.05033316223987998, + -0.05206893314787612, + -0.053863940346028004, + -0.05572017242225955, + -0.05763968257402853, + -0.05962459055807761, + -0.06167708468476085, + -0.06379942386346059, + -0.06599393969363045, + -0.06826303860732638, + -0.07060920405581751, + -0.0730349987485535, + -0.0755430669374987, + -0.07813613675098872, + -0.08081702257207844, + -0.08358862746790965, + -0.08645394565917643, + -0.08941606503922422, + -0.09247816973410436, + -0.09564354270383413, + -0.09891556838662553, + -0.1022977353787592, + -0.10579363915056218, + -0.10940698479804366, + -0.11314158982189071, + -0.11700138693498091, + -0.12099042689273398, + -0.12511288134298018, + -0.129373045688204, + -0.13377534195920873, + -0.1383243216913945, + -0.1430246687963746, + -0.14788120242714972, + -0.15289887981970762, + -0.1580827991154957, + -0.1634382021422971, + -0.16897047715393312, + -0.174685161509354, + -0.18058794428657782, + -0.18668466881328816, + -0.19298133510034665, + -0.1994841021654472, + -0.20619929022843433, + -0.21313338275818935, + -0.22029302835456663, + -0.22768504244361665, + -0.23531640876118587, + -0.24319428060162465, + -0.25132598180283144, + -0.25971900743654375, + -0.26838102420564725, + -0.2773198704261399, + -0.2865435556784153, + -0.29606026000304864, + -0.30587833261731157, + -0.31600629013827286, + -0.3264528142143518, + -0.33722674858087437, + -0.3483370954184305, + -0.3597930109802566, + -0.3716038004705323, + -0.3837789120320201, + -0.39632792982589604, + -0.4092605660953369, + -0.4225866521839757, + -0.4363161283618818, + -0.45045903240206764, + -0.46502548681814193, + -0.48002568463775047, + -0.4954698736404464, + -0.5113683388975924, + -0.5277313835173569, + -0.544569307525984, + -0.5618923846253351, + -0.5797108368190388, + -0.5980348066574056, + -0.616874327003615, + -0.6362392881806109, + -0.6561394022351058, + -0.6765841642349845, + -0.6975828103832754, + -0.7191442727503194, + -0.7412771304469985, + -0.7639895569845618, + -0.7872892637027484, + -0.8111834389502885, + -0.8356786828605379, + -0.8607809375056057, + -0.8864954121044532, + -0.9128265031877922, + -0.939777709447245, + -0.9673515409338279, + -0.9955494225543806, + -1.0243715915579032, + -1.0538169887238749, + -1.0838831432781448, + -1.1145660510922433, + -1.1458600462197825, + -1.177757665460964, + -1.2102495060182499, + -1.2433240760059423, + -1.2769676378999884, + -1.3111640448915882, + -1.3458945702362684, + -1.3811377297566498, + -1.4168690976632021, + -1.453061116101338, + -1.489682898705754, + -1.5267000288204855, + -1.5640743528515875, + -1.6017637697777996, + -1.6397220175100429, + -1.6778984573967581, + -1.7162378581707032, + -1.7546801807458077, + -1.7931603657661424, + -1.831608125840172, + -1.8699477448148745, + -1.9080978865803686, + -1.945971416431639, + -1.983475238120733, + -2.0205101503598146, + -2.0569707265527093, + -2.092745222393424, + -2.1277155158854435, + -2.1617570851957435, + -2.19473902984479, + -2.2265241413578685, + -2.2569690298453673, + -2.2859243133639477, + -2.3132348772706894, + -2.338740211171993, + -2.3622748311946196, + -2.383668795689109, + -2.40274832235676, + -2.4193365149456416, + -2.4332542074571037, + -2.4443209334322034, + -2.4523560274857643, + -2.457179865481826, + -2.4586152488082362, + -2.4564889369747807, + -2.4506333312434405, + -2.4408883101341874, + -2.4271032154515075, + -2.4091389848921914, + -2.3868704243111147, + -2.360188609344066, + -2.3290034022990476, + -2.293246065937917, + -2.2528719511694906, + -2.2078632305609243, + -2.158231644022347, + -2.1040212170233423, + -2.045310905335636, + -1.9822171131240218, + -1.9148960238090538, + -1.8435456745367504, + -1.7684076960446726, + -1.6897686291359992, + -1.6079607171071961, + -1.52336206022316, + -1.4363960026746156, + -1.3475296059972766, + -1.2572710447020545, + -1.1661657434312354, + -1.0747910626477704, + -0.9837493398702432, + -0.893659116976873, + -0.8051444524788692, + -0.7188223632431846, + -0.635288715640857, + -0.5551033728009118, + -0.47877622677136167, + -0.4067570895678711, + -0.3394345650890034, + -0.277154591121, + -0.220233175526, + -0.168962239059, + -0.123584167092, + -0.0842844194963, + -0.0511786393109, + -0.0242949930522, + -0.0035513482153, + 0.0112721479822, + 0.0205629495815, + 0.0249039736911, + 0.0250918416819, + 0.0221341915236, + 0.0172112197693, + 0.0115849439829, + 0.00644329823669, + 0.00268120056343, + 0.000657486928775, + 4.13999082392e-05, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 2, + "j": 3, + "angular_momentum": 0 + }, + { + "radial_function": [ + -0.0, + -1.104940400863216e-19, + -1.8291236397562514e-18, + -9.581508959244475e-18, + -3.133691569081576e-17, + -7.917813560433575e-17, + -1.699342024154932e-16, + -3.2588176773728207e-16, + -5.755214523711445e-16, + -9.54436017673293e-16, + -1.5062377730639401e-15, + -2.2836132523566248e-15, + -3.349473856722682e-15, + -4.778221879231098e-15, + -6.657142100163817e-15, + -9.087929975638217e-15, + -1.2188368342028854e-14, + -1.6094165527774968e-14, + -2.0960968808074855e-14, + -2.696656826681726e-14, + -3.4313307331976214e-14, + -4.323071758068714e-14, + -5.3978396783381376e-14, + -6.684915070336376e-14, + -8.217242077813949e-14, + -1.0031802157529223e-13, + -1.2170021381822285e-13, + -1.4678214075712032e-13, + -1.7608065796057593e-13, + -2.101715888092012e-13, + -2.496954406723449e-13, + -2.9536361932715693e-13, + -3.479651822381963e-13, + -4.083741743743067e-13, + -4.775575937178904e-13, + -5.565840371993156e-13, + -6.466330817509291e-13, + -7.490054594616076e-13, + -8.651340901449501e-13, + -9.96596039816136e-13, + -1.145125478573197e-12, + -1.3126277169600302e-12, + -1.5011944064528031e-12, + -1.7131199953455394e-12, + -1.9509195393002003e-12, + -2.2173479724150013e-12, + -2.5154209535451143e-12, + -2.84843741050109e-12, + -3.22000391498261e-12, + -3.634061030160183e-12, + -4.094911784014464e-12, + -4.607252433579325e-12, + -5.1762056963812696e-12, + -5.807356640251613e-12, + -6.5067914351011875e-12, + -7.281139187844269e-12, + -8.137617096013784e-12, + -9.08407917444943e-12, + -1.0129068828440974e-11, + -1.1281875566510065e-11, + -1.2552596168268939e-11, + -1.3952200646144333e-11, + -1.5492603365565628e-11, + -1.7186739713541802e-11, + -1.904864873686597e-11, + -2.1093562200219012e-11, + -2.333800054977618e-11, + -2.5799876302106077e-11, + -2.8498605416417963e-11, + -3.145522725318157e-11, + -3.469253375946864e-11, + -3.823520857744522e-11, + -4.210997681376583e-11, + -4.6345766272720536e-11, + -5.09738810048798e-11, + -5.602818809182694e-11, + -6.154531865323894e-11, + -6.756488413611505e-11, + -7.412970901859247e-11, + -8.128608115130855e-11, + -8.908402104454399e-11, + -9.757757149908922e-11, + -1.0682510909966653e-10, + -1.1688967917058659e-10, + -1.27839355944649e-10, + -1.397476297936113e-10, + -1.5269382351877887e-10, + -1.6676353985781784e-10, + -1.8204914245896374e-10, + -1.986502728729182e-10, + -2.166744060823897e-10, + -2.362374475327078e-10, + -2.574643746155975e-10, + -2.8048992587879933e-10, + -3.0545934152129853e-10, + -3.3252915878632273e-10, + -3.61868066491138e-10, + -3.9365782275286553e-10, + -4.2809424067692076e-10, + -4.6538824703401197e-10, + -5.057670190770709e-10, + -5.494752051875976e-10, + -5.967762357566773e-10, + -6.479537304047921e-10, + -7.033130089538871e-10, + -7.631827134588392e-10, + -8.279165493768976e-10, + -8.978951546824285e-10, + -9.735281059369102e-10, + -1.055256071611641e-09, + -1.143553122869833e-09, + -1.2389292136556414e-09, + -1.3419328419605326e-09, + -1.453153905783969e-09, + -1.5732267673288403e-09, + -1.7028335409785628e-09, + -1.842707620867371e-09, + -1.993637465689441e-09, + -2.1564706587252482e-09, + -2.332118263528049e-09, + -2.521559496423711e-09, + -2.7258467380441314e-09, + -2.9461109093798705e-09, + -3.183567237745637e-09, + -3.439521440656261e-09, + -3.7153763586619964e-09, + -4.012639067852551e-09, + -4.332928507855169e-09, + -4.67798366175532e-09, + -5.049672327269585e-09, + -5.450000522334007e-09, + -5.88112257000689e-09, + -6.345351911007082e-09, + -6.8451726975905344e-09, + -7.383252222784836e-09, + -7.962454246415666e-09, + -8.58585328026567e-09, + -9.256749903694241e-09, + -9.978687180391787e-09, + -1.0755468257215608e-08, + -1.1591175228631746e-08, + -1.249018935677085e-08, + -1.3457212745937225e-08, + -1.449729157243715e-08, + -1.5615840982851674e-08, + -1.681867177918155e-08, + -1.8112019018710216e-08, + -1.9502572664523352e-08, + -2.0997510432500343e-08, + -2.260453299259438e-08, + -2.4331901692069306e-08, + -2.6188478977916385e-08, + -2.8183771713574985e-08, + -3.0327977595409013e-08, + -3.2632034887650786e-08, + -3.510767571386475e-08, + -3.7767483156580104e-08, + -4.0624952439146044e-08, + -4.369455647290181e-08, + -4.699181608795988e-08, + -5.0533375276459024e-08, + -5.433708180261888e-08, + -5.8422073565629774e-08, + -6.280887111867944e-08, + -6.751947678594472e-08, + -7.25774808404178e-08, + -7.800817524885404e-08, + -8.383867551656314e-08, + -9.009805121149602e-08, + -9.681746577338366e-08, + -1.0403032628060589e-07, + -1.1177244386542744e-07, + -1.2008220554109251e-07, + -1.2900075825165944e-07, + -1.3857220599765455e-07, + -1.4884382097824824e-07, + -1.598662697355121e-07, + -1.7169385535990976e-07, + -1.8438477689481977e-07, + -1.9800140716781803e-07, + -2.1261059033304715e-07, + -2.2828396053797463e-07, + -2.4509828319272425e-07, + -2.63135820451688e-07, + -2.8248472261168596e-07, + -3.0323944726233517e-07, + -3.2550120814588405e-07, + -3.4937845583207543e-07, + -3.749873924457065e-07, + -4.0245252286258945e-07, + -4.3190724493616476e-07, + -4.634944815291147e-07, + -4.973673572805452e-07, + -5.336899232647021e-07, + -5.726379329624111e-07, + -6.143996730930655e-07, + -6.591768532452517e-07, + -7.071855584174719e-07, + -7.586572688939969e-07, + -8.138399522519812e-07, + -8.729992325143835e-07, + -9.364196419543587e-07, + -1.004405961318074e-06, + -1.0772846547400354e-06, + -1.155405405991433e-06, + -1.2391427631771984e-06, + -1.3288978996034906e-06, + -1.4251004988906846e-06, + -1.5282107731068528e-06, + -1.6387216233388425e-06, + -1.757160952673652e-06, + -1.8840941422424317e-06, + -2.020126702137531e-06, + -2.1659071086161307e-06, + -2.322129842043023e-06, + -2.4895386385406343e-06, + -2.6689299706790206e-06, + -2.8611567735579474e-06, + -3.067132433472351e-06, + -3.287835057104084e-06, + -3.524312041373044e-06, + -3.7776849655488382e-06, + -4.049154826795713e-06, + -4.340007644527836e-06, + -4.6516204594418525e-06, + -4.985467754149701e-06, + -5.343128324535231e-06, + -5.7262926362409805e-06, + -6.136770695995841e-06, + -6.576500477932955e-06, + -7.047556940774527e-06, + -7.5521616792360985e-06, + -8.092693253040567e-06, + -8.6716982410914e-06, + -9.291903071726284e-06, + -9.956226683590111e-06, + -1.066779407426533e-05, + -1.1429950800395485e-05, + -1.2246278493830108e-05, + -1.3120611466547781e-05, + -1.4057054478748824e-05, + -1.5060001753367714e-05, + -1.6134157321204022e-05, + -1.7284556793398886e-05, + -1.851659065645681e-05, + -1.9836029200163152e-05, + -2.124904918767089e-05, + -2.2762262394206142e-05, + -2.4382746141033312e-05, + -2.6118075964224138e-05, + -2.7976360566121923e-05, + -2.9966279214075797e-05, + -3.2097121744555193e-05, + -3.437883136862434e-05, + -3.6822050460164524e-05, + -3.943816954094986e-05, + -4.223937968630461e-05, + -4.5238728582706085e-05, + -4.8450180490335384e-05, + -5.1888680392820645e-05, + -5.557022260469799e-05, + -5.951192416488109e-05, + -6.373210333334949e-05, + -6.825036354832895e-05, + -7.30876832253753e-05, + -7.826651179361995e-05, + -8.381087240882823e-05, + -8.974647178858927e-05, + -9.610081768505522e-05, + -0.00010290334448906402, + -0.00011018554756072077, + -0.00011798112684688103, + -0.0001263261404623378, + -0.00013525916888790183, + -0.00014482149053078727, + -0.00015505726941752678, + -0.00016601375585052012, + -0.00017774150091999063, + -0.00019029458580959875, + -0.00020373086690330118, + -0.0002181122377830241, + -0.0002335049092559297, + -0.0002499797086300572, + -0.00026761239957339284, + -0.00028648402389410885, + -0.00030668126682175143, + -0.00032829684725218275, + -0.0003514299347705567, + -0.0003761865951541563, + -0.00040268026633149146, + -0.00043103226681640315, + -0.00046137233883474134, + -0.0004938392283795682, + -0.0005285813047681407, + -0.0005657572222800875, + -0.0006055366266533312, + -0.000648100909501302, + -0.0006936440137089117, + -0.0007423732933102642, + -0.0007945104313265233, + -0.0008502924194902399, + -0.0009099726037717962, + -0.0009738218001906479, + -0.0010421294853367588, + -0.001115205066639903, + -0.001193379237328853, + -0.0012770054218279997, + -0.001366461317201816, + -0.0014621505369714668, + -0.0015645043636936856, + -0.001673983617509287, + -0.0017910806476407236, + -0.0019163214550306684, + -0.002050267954087613, + -0.0021935203823205563, + -0.0023467198672498207, + -0.0025105511601178233, + -0.0026857455468174665, + -0.0028730839470348895, + -0.0030734002128258438, + -0.0032875846389484697, + -0.00351658769761521, + -0.0037614240111421044, + -0.004023176576478345, + -0.004303001256713897, + -0.0046021315549931606, + -0.004921883687126203, + -0.005263661970398026, + -0.0056289645458965625, + -0.0060193894540282065, + -0.006436641081913812, + -0.006882537003877928, + -0.0073590152357100695, + -0.007868141925435055, + -0.008412119503200472, + -0.008993295314126645, + -0.009614170758994456, + -0.01027741096805268, + -0.010985855033899388, + -0.011742526830567881, + -0.01255064644624716, + -0.013413642257426302, + -0.014335163673042097, + -0.01531909457713193, + -0.016369567498568594, + -0.017490978540988286, + -0.01868800309041594, + -0.019965612343976223, + -0.021329090676662235, + -0.022784053874610192, + -0.024336468264567472, + -0.02599267075572646, + -0.0277593898252922, + -0.02964376745637088, + -0.031653382046792, + -0.03379627230820568, + -0.03608096214957219, + -0.038516486555398535, + -0.04111241844768054, + -0.043878896529172526, + -0.046826654075177034, + -0.049967048649384345, + -0.0533120927037436, + -0.05687448500282579, + -0.0606676428122941, + -0.06470573475537972, + -0.06900371423902209, + -0.07357735334202511, + -0.07844327698648158, + -0.08361899725555602, + -0.0891229476308033, + -0.09497451693342336, + -0.10119408271223136, + -0.10780304374614057, + -0.11482385134434772, + -0.1222800390445325, + -0.1301962502662185, + -0.13859826343231982, + -0.14751301398691288, + -0.1569686127271064, + -0.16699435972630386, + -0.17762075311389758, + -0.18887949187963346, + -0.20080347173910096, + -0.2134267731080149, + -0.22678464006799579, + -0.24091344907089693, + -0.2558506661635355, + -0.2716347912879484, + -0.2883052881002508, + -0.3059024978109105, + -0.32446753517806354, + -0.3440421649437207, + -0.3646686566826158, + -0.38638961614404177, + -0.409247790877387, + -0.4332858480371228, + -0.45854612210271295, + -0.4850703302633019, + -0.5128992532177179, + -0.5420723791168226, + -0.572627508570078, + -0.6046003185802755, + -0.6380238836626659, + -0.6729281523792945, + -0.7093393782033415, + -0.7472795035935792, + -0.7867654970461168, + -0.8278086433337508, + -0.870413787752694, + -0.914578536317385, + -0.9602924146080447, + -1.0075359892667368, + -1.0562799572330623, + -1.106484209500675, + -1.1580968774732625, + -1.2110533720584629, + -1.2652754269936601, + -1.3206701604701343, + -1.37712917042545, + -1.4345276815147199, + -1.4927237632286303, + -1.5515576407476295, + -1.6108511216111425, + -1.6704071624990915, + -1.730009601155827, + -1.7894230787361398, + -1.8483931768443296, + -1.9066467922367925, + -1.9638927687450163, + -2.019822802038123, + -2.074112626898804, + -2.1264234889253943, + -2.1764038935794345, + -2.2236916143494234, + -2.2679159294147144, + -2.3087000425790727, + -2.345663630419144, + -2.3784254440771857, + -2.4066058828850996, + -2.4298294494906587, + -2.4477269950725162, + -2.4599376714674843, + -2.4661105282874436, + -2.465905731434402, + -2.458995439142732, + -2.445064457260831, + -2.423810910436532, + -2.3949473122805047, + -2.358202594654846, + -2.31332585811046, + -2.2600928195805667, + -2.198316135994651, + -2.127860936487869, + -2.048666944689836, + -1.9607784373347674, + -1.864382860719847, + -1.7598580781687423, + -1.647826794841358, + -1.5292145349452921, + -1.4053044941385142, + -1.2777786077647568, + -1.1487294257139746, + -1.020622434064198, + -0.8961846179307029, + -0.7781948876089376, + -0.6691601603781343, + -0.5708854670816668, + -0.48400088191914253, + -0.4076141997770904, + -0.3394508828627495, + -0.277154591121, + -0.220233175526, + -0.168962239059, + -0.123584167092, + -0.0842844194963, + -0.0511786393109, + -0.0242949930522, + -0.0035513482153, + 0.0112721479822, + 0.0205629495815, + 0.0249039736911, + 0.0250918416819, + 0.0221341915236, + 0.0172112197693, + 0.0115849439829, + 0.00644329823669, + 0.00268120056343, + 0.000657486928775, + 4.13999082392e-05, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 2, + "j": 3, + "angular_momentum": 2 + }, + { + "radial_function": [ + -0.0, + -7.171455756276877e-15, + -5.885528681591581e-14, + -2.0378800423308574e-13, + -4.956160597936391e-13, + -9.932467152854515e-13, + -1.761220705286616e-12, + -2.8701079544351762e-12, + -4.396927680314224e-12, + -6.4255942871438236e-12, + -9.047390533035446e-12, + -1.2361469536241891e-11, + -1.647538727236998e-11, + -2.1505667304824833e-11, + -2.7578399589467668e-11, + -3.4829875292622596e-11, + -4.340725967133379e-11, + -5.346930517647463e-11, + -6.518710705650732e-11, + -7.87449038728328e-11, + -9.434092544447017e-11, + -1.1218829093333691e-10, + -1.3251595985072202e-10, + -1.5556973899241563e-10, + -1.816133484251081e-10, + -2.10929549840325e-10, + -2.4382134078862517e-10, + -2.806132184105472e-10, + -3.216525166547781e-10, + -3.673108209511693e-10, + -4.1798546477607185e-10, + -4.741011125629614e-10, + -5.361114338325732e-10, + -6.045008735452692e-10, + -6.797865240585027e-10, + -7.625201042715197e-10, + -8.532900518909932e-10, + -9.52723735132968e-10, + -1.0614897903062439e-09, + -1.1803005923864333e-09, + -1.3099148658124195e-09, + -1.4511404431088763e-09, + -1.6048371797904709e-09, + -1.7719200336801844e-09, + -1.9533623180918246e-09, + -2.1501991380369856e-09, + -2.3635310197833473e-09, + -2.594527744025984e-09, + -2.844432394180582e-09, + -3.1145656312077798e-09, + -3.4063302073625798e-09, + -3.721215732220851e-09, + -4.060803704226676e-09, + -4.42677282274719e-09, + -4.8209045952396765e-09, + -5.24508925630675e-09, + -5.70133201500923e-09, + -6.19175964841643e-09, + -6.7186274603038274e-09, + -7.284326624604796e-09, + -7.891391934496158e-09, + -8.542509979045164e-09, + -9.240527770798731e-09, + -9.988461848131929e-09, + -1.0789507878556844e-08, + -1.164705078958596e-08, + -1.2564675456046722e-08, + -1.3546177973525929e-08, + -1.4595577549205098e-08, + -1.5717129044484442e-08, + -1.6915336202813338e-08, + -1.8194965601381766e-08, + -1.9561061363618038e-08, + -2.1018960675419564e-08, + -2.2574310146632527e-08, + -2.4233083063819452e-08, + -2.600159758210358e-08, + -2.7886535906808636e-08, + -2.989496451674039e-08, + -3.203435548616343e-08, + -3.43126089641581e-08, + -3.673807687151478e-08, + -3.931958788399476e-08, + -4.206647376576862e-08, + -4.498859713015802e-08, + -4.809638070032168e-08, + -5.1400838150878564e-08, + -5.491360661862181e-08, + -5.864698095965661e-08, + -6.261394986822058e-08, + -6.682823392535407e-08, + -7.130432571284165e-08, + -7.605753208005221e-08, + -8.110401868234352e-08, + -8.64608569260363e-08, + -9.214607341734061e-08, + -9.817870209664289e-08, + -1.0457883914522136e-07, + -1.113677008448794e-07, + -1.1856768455959496e-07, + -1.2620243297095542e-07, + -1.342969017414557e-07, + -1.4287743084369782e-07, + -1.5197181966387688e-07, + -1.6160940615566413e-07, + -1.7182115021646213e-07, + -1.8263972151361375e-07, + -1.9409959202361732e-07, + -2.0623713348901793e-07, + -2.1909072011433068e-07, + -2.327008367040913e-07, + -2.471101926028768e-07, + -2.623638416849322e-07, + -2.7850930877643344e-07, + -2.9559672277167353e-07, + -3.1367895687204987e-07, + -3.328117762741298e-07, + -3.53053993750149e-07, + -3.744676334596764e-07, + -3.971181035099498e-07, + -4.210743777043515e-07, + -4.4640918688967396e-07, + -4.731992205464624e-07, + -5.015253390561985e-07, + -5.31472797207389e-07, + -5.631314796520652e-07, + -5.96596148760733e-07, + -6.319667056911722e-07, + -6.693484652986454e-07, + -7.088524455887255e-07, + -7.505956725608785e-07, + -7.94701501188857e-07, + -8.412999533535323e-07, + -8.905280737804951e-07, + -9.425303047333109e-07, + -9.97458880613307e-07, + -1.0554742433365602e-06, + -1.1167454798391114e-06, + -1.1814507825903782e-06, + -1.2497779345344493e-06, + -1.3219248196550012e-06, + -1.3980999604792653e-06, + -1.4785230841103328e-06, + -1.5634257180341403e-06, + -1.6530518174493778e-06, + -1.7476584257244324e-06, + -1.847516369753252e-06, + -1.952910991997109e-06, + -2.064142921115636e-06, + -2.181528883313257e-06, + -2.3054025565305865e-06, + -2.4361154695597363e-06, + -2.5740379486584485e-06, + -2.7195601141102538e-06, + -2.8730929292254875e-06, + -3.035069304673764e-06, + -3.205945260964708e-06, + -3.38620115233835e-06, + -3.5763429548343187e-06, + -3.7769036224243597e-06, + -3.988444514523425e-06, + -4.211556898526814e-06, + -4.446863531602539e-06, + -4.695020325589847e-06, + -4.9567180996443515e-06, + -5.2326844249263035e-06, + -5.523685566458301e-06, + -5.830528527021953e-06, + -6.1540631987098405e-06, + -6.495184627272849e-06, + -6.854835395925488e-06, + -7.234008134093088e-06, + -7.633748158113432e-06, + -8.055156250910302e-06, + -8.499391587316495e-06, + -8.967674813384968e-06, + -9.461291287420062e-06, + -9.981594491080507e-06, + -1.0530009619524384e-05, + -1.1108037360434119e-05, + -1.1717257870976293e-05, + -1.2359334963884244e-05, + -1.3036020512948807e-05, + -1.3749159089889442e-05, + -1.4500692844416588e-05, + -1.5292666640374815e-05, + -1.612723346122177e-05, + -1.7006660099186943e-05, + -1.793333314259105e-05, + -1.890976527732587e-05, + -1.9938601918465033e-05, + -2.102262818994365e-05, + -2.2164776269793122e-05, + -2.3368133120043635e-05, + -2.463594862279804e-05, + -2.5971644141316914e-05, + -2.7378821530606863e-05, + -2.8861272619839376e-05, + -3.0422989190964235e-05, + -3.206817348096212e-05, + -3.38012492329814e-05, + -3.562687332713045e-05, + -3.754994801953e-05, + -3.957563382272899e-05, + -4.170936306014361e-05, + -4.395685412921355e-05, + -4.632412651262217e-05, + -4.8817516573847504e-05, + -5.14436941788922e-05, + -5.4209680188770477e-05, + -5.712286486691481e-05, + -6.019102724763756e-05, + -6.342235552405933e-05, + -6.682546848761784e-05, + -7.040943810637907e-05, + -7.41838132742595e-05, + -7.815864480012113e-05, + -8.234451170720861e-05, + -8.675254890988083e-05, + -9.139447632878291e-05, + -9.628262952920375e-05, + -0.00010142999197182751, + -0.00010685022893013349, + -0.00011255772318802541, + -0.0001185676126094949, + -0.00012489582966281857, + -0.00013155914299373177, + -0.0001385752012068234, + -0.00014596257888976465, + -0.00015374082507291437, + -0.00016193051419601873, + -0.00017055329974811318, + -0.00017963197070146967, + -0.00018919051088736567, + -0.00019925416146977337, + -0.00020984948668190204, + -0.00022100444297996295, + -0.00023274845181834824, + -0.0002451124762031579, + -0.000258129101247985, + -0.00027183261891455574, + -0.0002862591171858258, + -0.0003014465738606104, + -0.00031743495526548825, + -0.00033426632007683526, + -0.0003519849285768721, + -0.0003706373575632504, + -0.00039027262127387197, + -0.00041094229859096843, + -0.0004327006668590269, + -0.0004556048426514026, + -0.00047971492991627295, + -0.0005050941757357394, + -0.0005318091342741727, + -0.0005599298391794673, + -0.0005895299849597228, + -0.000620687117818344, + -0.0006534828363687805, + -0.000688003002740545, + -0.000724337964738589, + -0.0007625827894168591, + -0.0008028375088667058, + -0.000845207378702844, + -0.000889803149950624, + -0.0009367413550657452, + -0.0009861446087343453, + -0.0010381419243054796, + -0.001092869046518372, + -0.0011504688015943729, + -0.0012110914652901242, + -0.0012748951501608955, + -0.0013420462126675597, + -0.001412719681491561, + -0.0014870997078777815, + -0.0015653800392873504, + -0.0016477645174857545, + -0.0017344676023261548, + -0.0018257149225864738, + -0.001921743855179517, + -0.0020228041341762448, + -0.0021291584912616394, + -0.0022410833291414403, + -0.002358869429531444, + -0.002482822697692363, + -0.002613264944956975, + -0.00275053471184876, + -0.002894988132973904, + -0.003046999846688753, + -0.0032069639511042667, + -0.0033752950091715376, + -0.003552429105140791, + -0.003738824955226559, + -0.003934965074665539, + -0.004141357004653581, + -0.004358534601812186, + -0.004587059393176784, + -0.004827522000466643, + -0.0050805436364046936, + -0.005346777677422752, + -0.005626911315889697, + -0.005921667296416078, + -0.006231805739602073, + -0.0065581260584725454, + -0.006901468971299704, + -0.0072627186164370226, + -0.007642804772982333, + -0.00804270519377706, + -0.008463448055114096, + -0.0089061145295608, + -0.009371841487081978, + -0.009861824331895148, + -0.010377319979808763, + -0.010919649984642645, + -0.011490203819509654, + -0.012090442320605707, + -0.01272190130185762, + -0.013386195347453219, + -0.014085021791098114, + -0.014820164891144048, + -0.015593500209585038, + -0.01640699920521825, + -0.017262734050379407, + -0.018162882681603168, + -0.019109734094224923, + -0.02010569389278665, + -0.021153290107949536, + -0.022255179291427132, + -0.02341415290230712, + -0.02463314399512225, + -0.02591523422568706, + -0.027263661184939194, + -0.0286818260771013, + -0.030173301754266694, + -0.03174184112384548, + -0.03339138594252292, + -0.03512607601209229, + -0.036950258793487095, + -0.03886849945447928, + -0.04088559136664178, + -0.04300656706883299, + -0.04523670971365899, + -0.04758156501302497, + -0.050046953699950214, + -0.05263898452272132, + -0.05536406778717648, + -0.058228929474292805, + -0.0612406259201408, + -0.06440655911296946, + -0.06773449259465049, + -0.07123256798593235, + -0.07490932215948976, + -0.07877370505506735, + -0.08283509817137182, + -0.08710333371980225, + -0.09158871445539563, + -0.096302034207354, + -0.10125459908262573, + -0.10645824936229961, + -0.11192538207342835, + -0.11766897424953768, + -0.1237026068416913, + -0.13004048927601958, + -0.1366974846377509, + -0.14368913544163672, + -0.1510316899685502, + -0.15874212910115224, + -0.1668381936147729, + -0.1753384118891032, + -0.18426212790409852, + -0.19362952949852444, + -0.20346167673975848, + -0.21378053031808456, + -0.22460897984707318, + -0.23597087186905472, + -0.247891037446356, + -0.2603953191304831, + -0.273510597090534, + -0.2872648141733967, + -0.3016869995972645, + -0.31680729103768857, + -0.33265695471435724, + -0.3492684031524507, + -0.3666752102231445, + -0.38491212295335864, + -0.4040150697071801, + -0.42402116418070107, + -0.4449687045486625, + -0.46689716725425573, + -0.48984719469164123, + -0.5138605759699102, + -0.5389802201292113, + -0.5652501207322927, + -0.5927153110717666, + -0.6214218088504071, + -0.6514165494135217, + -0.6827473062526273, + -0.7154625976760258, + -0.7496115783212133, + -0.7852439141779657, + -0.822409639727793, + -0.8611589956684178, + -0.901542245796594, + -0.9436094713301686, + -0.9874103411892122, + -1.0329938563622585, + -1.0804080669354228, + -1.1296997597684704, + -1.1809141153040443, + -1.2340943317893283, + -1.289281215066156, + -1.3465127324758313, + -1.4058235291929453, + -1.4672444055869163, + -1.53080175406666, + -1.5965169543161888, + -1.6644057255987792, + -1.734477435407735, + -1.8067343632751103, + -1.8811709195662596, + -1.9577728183600591, + -2.0365162045423384, + -2.117366734761689, + -2.2002786124697256, + -2.285193577292971, + -2.372039849088055, + -2.4607310271099934, + -2.5511649450188294, + -2.643222482081366, + -2.7367663316145427, + -2.831639727059255, + -2.927665126774186, + -3.0246428588174044, + -3.1223497271009992, + -3.220537581610706, + -3.3189318564214605, + -3.417230081416574, + -3.515100376510499, + -3.6121799418368985, + -3.708073563174812, + -3.8023521605073576, + -3.8945514186382235, + -3.9841705534308907, + -4.070671285761179, + -4.153477118526175, + -4.231973040656104, + -4.3055058157309425, + -4.37338505222493, + -4.434885296415356, + -4.489249436077745, + -4.535693750306566, + -4.573414983861432, + -4.601599855504467, + -4.619437419627325, + -4.626134674357978, + -4.620935729647104, + -4.603144691915885, + -4.572152160092926, + -4.527464829671863, + -4.46873713484795, + -4.395803096880402, + -4.308705579723156, + -4.207719006034613, + -4.09336034939565, + -3.9663820973100377, + -3.8277402732252535, + -3.678531221597499, + -3.5198938939257696, + -3.352881775752078, + -3.178323463463345, + -2.996718062232637, + -2.808258432115716, + -2.61315498897, + -2.41209842403, + -2.20611983361, + -1.99643468001, + -1.78450087853, + -1.57208217134, + -1.36131077632, + -1.15473835359, + -0.955359445659, + -0.766586483121, + -0.592150931508, + -0.435903102682, + -0.301486087293, + -0.191871491089, + -0.108771684687, + -0.0519928019622, + -0.0188740214689, + -0.00408382787425, + -0.000228916712713, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 2, + "j": 4, + "angular_momentum": 1 + }, + { + "radial_function": [ + -0.0, + -1.0389640068131251e-24, + -3.4692113946854965e-23, + -2.7492822212820075e-22, + -1.2091975203397551e-21, + -3.851975586905492e-21, + -1.0006401722814562e-20, + -2.2581459987007606e-20, + -4.5973104761450665e-20, + -8.651879555050065e-20, + -1.530360892930664e-19, + -2.5745725559493227e-19, + -4.155733450497501e-19, + -6.479027686709979e-19, + -9.807012546431735e-19, + -1.4471320555587087e-18, + -2.088617506112962e-18, + -2.9563955002622306e-18, + -4.113307193039939e-18, + -5.6358452640915506e-18, + -7.616495433317239e-18, + -1.0166407638918791e-17, + -1.341843738808882e-17, + -1.7530602341366088e-17, + -2.2690004207054442e-17, + -2.911727157203725e-17, + -3.707158542667012e-17, + -4.6856355885317765e-17, + -5.882562610865275e-17, + -7.33912876134492e-17, + -9.10312003005653e-17, + -1.1229832048661713e-16, + -1.3783095131275444e-16, + -1.6836424202317038e-16, + -2.0474307603972273e-16, + -2.479365024766015e-16, + -2.9905388199491464e-16, + -3.5936293581158064e-16, + -4.3030990622948355e-16, + -5.135420588643576e-16, + -6.10932780407799e-16, + -7.246095518805503e-16, + -8.569851064314989e-16, + -1.010792111776537e-15, + -1.1891217527728973e-15, + -1.3954666271537823e-15, + -1.6337684099358256e-15, + -1.908470787462825e-15, + -2.2245782132967596e-15, + -2.5877210929038636e-15, + -3.0042280652934904e-15, + -3.481206117050263e-15, + -4.026629336403418e-15, + -4.6494371968030345e-15, + -5.3596433459234586e-15, + -6.16845597487818e-15, + -7.088410946449055e-15, + -8.133518978466356e-15, + -9.319428305977971e-15, + -1.0663604384882533e-14, + -1.2185528353119571e-14, + -1.3906916133037136e-14, + -1.585196024300954e-14, + -1.8047596585473376e-14, + -2.0523798701689672e-14, + -2.3313902222245668e-14, + -2.645496250898586e-14, + -2.9988148771185245e-14, + -3.3959178254951165e-14, + -3.8418794456833697e-14, + -4.3423293681935353e-14, + -4.903510469446723e-14, + -5.5323426648489317e-14, + -6.236493099953496e-14, + -7.024453362642913e-14, + -7.90562439964745e-14, + -8.890409885499953e-14, + -9.990318863389033e-14, + -1.1218078554279291e-13, + -1.2587758317028102e-13, + -1.4114905834589404e-13, + -1.581669670187234e-13, + -1.7712098705559686e-13, + -1.9822052201979368e-13, + -2.216966813855028e-13, + -2.478044540365328e-13, + -2.7682509351260223e-13, + -3.0906873522913365e-13, + -3.4487726765271415e-13, + -3.8462748178464994e-13, + -4.2873452508388453e-13, + -4.77655689014345e-13, + -5.318945615939935e-13, + -5.920055794959203e-13, + -6.585990176118934e-13, + -7.323464569795025e-13, + -8.139867767484979e-13, + -9.043327188036868e-13, + -1.0042780792795131e-12, + -1.1148055860423194e-12, + -1.2369955259964018e-12, + -1.3720351924274056e-12, + -1.5212292300629792e-12, + -1.6860109603706795e-12, + -1.867954779907496e-12, + -2.068789731125724e-12, + -2.2904143549462765e-12, + -2.534912945010484e-12, + -2.804573333093948e-12, + -3.101906349295323e-12, + -3.4296671108963975e-12, + -3.790878311162204e-12, + -4.188855692085433e-12, + -4.627235904922349e-12, + -5.110006977448914e-12, + -5.641541630919567e-12, + -6.226633708661906e-12, + -6.87053800503657e-12, + -7.579013806022898e-12, + -8.358372486073573e-12, + -9.215529534295303e-12, + -1.0158061414909369e-11, + -1.1194267711480251e-11, + -1.2333239036820958e-11, + -1.3584931237770524e-11, + -1.496024647750342e-11, + -1.64711218186515e-11, + -1.8130626001470768e-11, + -1.99530651649699e-11, + -2.1954098328154756e-11, + -2.415086352828947e-11, + -2.656211558751477e-11, + -2.9208376568185976e-11, + -3.211210008458757e-11, + -3.529785072483773e-11, + -3.879249997067307e-11, + -4.2625440108331615e-11, + -4.68288177862858e-11, + -5.1437788990812514e-11, + -5.649079740258175e-11, + -6.20298782556627e-11, + -6.810099001508656e-11, + -7.475437641498985e-11, + -8.204496159554305e-11, + -9.003278135818821e-11, + -9.878345381322784e-11, + -1.0836869299628996e-10, + -1.1886686934578083e-10, + -1.3036362128567672e-10, + -1.4295252255338027e-10, + -1.5673581032102708e-10, + -1.718251795942933e-10, + -1.883426499087385e-10, + -2.0642151085904178e-10, + -2.2620735357289728e-10, + -2.4785919591311614e-10, + -2.7155070986444735e-10, + -2.9747156036255955e-10, + -3.258288655620515e-10, + -3.568487895743802e-10, + -3.9077827959155425e-10, + -4.2788696039877003e-10, + -4.684692005110912e-10, + -5.128463653508821e-10, + -5.613692743637417e-10, + -6.144208803851635e-10, + -6.724191913209042e-10, + -7.358204559077834e-10, + -8.051226373690952e-10, + -8.808692007539096e-10, + -9.636532423262439e-10, + -1.0541219915838681e-09, + -1.1529817194925455e-09, + -1.2610030894626072e-09, + -1.3790269906816758e-09, + -1.5079708972907515e-09, + -1.6488358005278866e-09, + -1.8027137652225455e-09, + -1.9707961666678087e-09, + -2.1543826690414894e-09, + -2.354891011619851e-09, + -2.573867675458227e-09, + -2.8129995092426245e-09, + -3.0741264004211285e-09, + -3.359255085157058e-09, + -3.6705741991594416e-09, + -4.010470680449061e-09, + -4.381547645191344e-09, + -4.786643868295935e-09, + -5.228855012551785e-09, + -5.711556762529403e-09, + -6.238430033930194e-09, + -6.813488443659742e-09, + -7.441108242720286e-09, + -8.126060932803582e-09, + -8.873548805193347e-09, + -9.68924366428689e-09, + -1.0579329019642506e-08, + -1.1550546056149964e-08, + -1.261024372064658e-08, + -1.3766433291220826e-08, + -1.5027847830688475e-08, + -1.640400695908994e-08, + -1.7905287420763533e-08, + -1.954299996243759e-08, + -2.1329473084880094e-08, + -2.327814428299565e-08, + -2.5403659440010386e-08, + -2.7721981103367082e-08, + -3.0250506435381716e-08, + -3.30081956999584e-08, + -3.6015712222664835e-08, + -3.92955748546275e-08, + -4.2872324033043826e-08, + -4.6772702682009206e-08, + -5.102585324803685e-08, + -5.5663532314195004e-08, + -6.072034436461202e-08, + -6.62339964033492e-08, + -7.224557527050344e-08, + -7.879984968658385e-08, + -8.594559923973732e-08, + -9.373597267268574e-08, + -1.0222887811072322e-07, + -1.1148740807261424e-07, + -1.2158030233564752e-07, + -1.3258245200587548e-07, + -1.445754485427986e-07, + -1.576481816031497e-07, + -1.7189749016826603e-07, + -1.8742887159616623e-07, + -2.043572538075731e-07, + -2.22807836182249e-07, + -2.429170052721418e-07, + -2.6483333198180683e-07, + -2.887186574594501e-07, + -3.147492755408553e-07, + -3.4311722037765614e-07, + -3.7403166851463433e-07, + -4.0772046563799495e-07, + -4.4443178899485983e-07, + -4.844359575991726e-07, + -5.280274032240007e-07, + -5.75526816595932e-07, + -6.272834841536318e-07, + -6.836778324390217e-07, + -7.451241983387798e-07, + -8.120738454108645e-07, + -8.850182479588929e-07, + -9.64492666606053e-07, + -1.0510800411628488e-06, + -1.1454152291689078e-06, + -1.2481896201638988e-06, + -1.3601561596637924e-06, + -1.4821348184930293e-06, + -1.6150185472306272e-06, + -1.7597797588150163e-06, + -1.917477385754879e-06, + -2.0892645627669282e-06, + -2.276396990797147e-06, + -2.480242041660937e-06, + -2.702288669864452e-06, + -2.9441582022328315e-06, + -3.2076160831860923e-06, + -3.4945846603800457e-06, + -3.8071571021849456e-06, + -4.147612547557624e-06, + -4.518432596259915e-06, + -4.922319259323485e-06, + -5.36221449671327e-06, + -5.8413214845654215e-06, + -6.363127762121363e-06, + -6.931430426760172e-06, + -7.550363555807092e-06, + -8.224428052677638e-06, + -8.958524130583881e-06, + -9.75798666636014e-06, + -1.0628623677756682e-05, + -1.1576758198823392e-05, + -1.2609273852538281e-05, + -1.3733664447213715e-05, + -1.4958087950078555e-05, + -1.629142522264682e-05, + -1.7743343939038124e-05, + -1.9324368138313172e-05, + -2.1045953913987144e-05, + -2.292057176950059e-05, + -2.496179623607546e-05, + -2.7184403381850383e-05, + -2.9604476910048318e-05, + -3.2239523597315706e-05, + -3.510859889500033e-05, + -3.8232443576087464e-05, + -4.163363240541847e-05, + -4.533673588103216e-05, + -4.93684961881558e-05, + -5.375801861760911e-05, + -5.853697978873456e-05, + -6.373985415881018e-05, + -6.94041604039761e-05, + -7.557072941798604e-05, + -8.228399579843091e-05, + -8.959231488696299e-05, + -9.754830757129914e-05, + -0.00010620923528546449, + -0.00011563740780767405, + -0.0001259006267379415, + -0.00013707266772766582, + -0.000149233804842026, + -0.00016247138068705037, + -0.0001768804262995565, + -0.0001925643350555138, + -0.0002096355953199352, + -0.0002282165868717886, + -0.0002484404466116193, + -0.0002704520095429062, + -0.000294408831470165, + -0.0003204823004517399, + -0.0003488588446412923, + -0.00037974124473769073, + -0.00041335006002747707, + -0.00044992517770967423, + -0.0004897274960254409, + -0.0005330407525608343, + -0.0005801735101016031, + -0.0006314613133759786, + -0.0006872690311386575, + -0.0007479933993142014, + -0.0008140657820318714, + -0.0008859551690359776, + -0.0009641714291285196, + -0.001049268841205611, + -0.001141849925926888, + -0.0012425696031399427, + -0.0013521397019981023, + -0.0014713338529280067, + -0.0016009927929517124, + -0.001742030118262512, + -0.0018954385205781489, + -0.0020622965467256473, + -0.0022437759238714714, + -0.002441149495996539, + -0.0026557998207335652, + -0.0028892284792602346, + -0.003143066155806878, + -0.003419083548588016, + -0.0037192031746072465, + -0.004045512141790887, + -0.004400275960611034, + -0.004785953475455219, + -0.005205213002189827, + -0.005660949760952301, + -0.0061563047037603335, + -0.006694684837329994, + -0.007279785151384584, + -0.007915612270872426, + -0.008606509951380858, + -0.009357186550146567, + -0.010172744607739847, + -0.011058712687474789, + -0.012021079619906621, + -0.013066331312200105, + -0.014201490287659876, + -0.015434158124792902, + -0.016772560975708586, + -0.018225598342277646, + -0.01980289529817389, + -0.021514858352712912, + -0.023372735136742095, + -0.025388678115713784, + -0.027575812510828773, + -0.029948308620876513, + -0.03252145872860567, + -0.03531175875015851, + -0.03833699479499666, + -0.04161633477061094, + -0.04517042514495015, + -0.04902149295418865, + -0.053193453094925444, + -0.05771202091962372, + -0.06260483006773353, + -0.06790155542910502, + -0.07363404105380343, + -0.07983643270989269, + -0.08654531473861742, + -0.09379985070458204, + -0.10164192718117857, + -0.11011629993086154, + -0.1192707415022786, + -0.1291561890632539, + -0.1398268911668226, + -0.15134055175064418, + -0.16375846955281903, + -0.17714567069890544, + -0.19157103201529763, + -0.20710739214211807, + -0.22383164724945098, + -0.24182482768641983, + -0.2611721514917643, + -0.2819630502490572, + -0.3042911622651108, + -0.3282542876692578, + -0.3539542994269893, + -0.3814970039662618, + -0.4109919444702429, + -0.44255213979410574, + -0.4762937512760826, + -0.5123356697865211, + -0.5507990151008789, + -0.5918065395828065, + -0.6354819285985072, + -0.681948990289253, + -0.7313307281446148, + -0.7837482905998843, + -0.839319793455977, + -0.8981590123315144, + -0.9603739448589619, + -1.0260652443910518, + -1.0953245307863024, + -1.16823258660977, + -1.244857451875786, + -1.3252524343270224, + -1.4094540574128054, + -1.4974799730193742, + -1.5893268709803154, + -1.6849684220949592, + -1.7843532957194246, + -1.887403295563612, + -1.994011659402166, + -2.104041566693284, + -2.2173248947170574, + -2.3336612558404495, + -2.4528173352884117, + -2.5745265307631082, + -2.698488869640091, + -2.8243711469658304, + -2.951807186896765, + -3.080398082638199, + -3.209712215066591, + -3.339284791718119, + -3.4686165882390583, + -3.5971715202848134, + -3.7243726331336946, + -3.8495960807307745, + -3.972162690737933, + -4.091326795447674, + -4.2062621739372466, + -4.316045223718445, + -4.419635887798688, + -4.515857431246665, + -4.60337691023283, + -4.680689109986685, + -4.7461078278213185, + -4.79776958080462, + -4.833656003920668, + -4.8516421634248506, + -4.849578416108252, + -4.8254128264691, + -4.777358868454729, + -4.704108375950676, + -4.6050815338204725, + -4.48069320866337, + -4.332597533549936, + -4.163850763283547, + -3.978908453934472, + -3.7833534376432447, + -3.5832495508807667, + -3.384058885523196, + -3.1891948464925046, + -2.998591590184223, + -2.808290485055089, + -2.61315498897, + -2.41209842403, + -2.20611983361, + -1.99643468001, + -1.78450087853, + -1.57208217134, + -1.36131077632, + -1.15473835359, + -0.955359445659, + -0.766586483121, + -0.592150931508, + -0.435903102682, + -0.301486087293, + -0.191871491089, + -0.108771684687, + -0.0519928019622, + -0.0188740214689, + -0.00408382787425, + -0.000228916712713, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 2, + "j": 4, + "angular_momentum": 3 + }, + { + "radial_function": [ + 0.0, + 6.793381816028356e-10, + 2.764000574916829e-09, + 6.326063583054104e-09, + 1.1440492538175045e-08, + 1.8185248211503273e-08, + 2.6641397114338335e-08, + 3.689322572172867e-08, + 4.902835875647629e-08, + 6.313788167640495e-08, + 7.93164675097918e-08, + 9.766250819325272e-08, + 1.1827825056967545e-07, + 1.412699372046382e-07, + 1.667479521980633e-07, + 1.9482697215653307e-07, + 2.2562612251239644e-07, + 2.5926913937578645e-07, + 2.958845371074913e-07, + 3.3560578183232826e-07, + 3.7857147104310765e-07, + 4.249255196149726e-07, + 4.748173523280911e-07, + 5.284021032181443e-07, + 5.858408219445726e-07, + 6.473006874376325e-07, + 7.129552291188184e-07, + 7.829845558217828e-07, + 8.575755929053582e-07, + 9.369223275870188e-07, + 1.0212260630200616e-06, + 1.110695681231417e-06, + 1.2055479153653158e-06, + 1.3060076314580489e-06, + 1.4123081201552997e-06, + 1.524691398652456e-06, + 1.6434085232288312e-06, + 1.7687199128306508e-06, + 1.9008956838977001e-06, + 2.040215997047486e-06, + 2.1869714159053424e-06, + 2.341463278388791e-06, + 2.504004081252879e-06, + 2.6749178778579643e-06, + 2.8545406900930546e-06, + 3.043220934558217e-06, + 3.2413198638162348e-06, + 3.4492120229318325e-06, + 3.667285722188938e-06, + 3.895943526230746e-06, + 4.135602760243829e-06, + 4.386696034049382e-06, + 4.6496717843082385e-06, + 4.924994835904217e-06, + 5.213146982664781e-06, + 5.514627588658111e-06, + 5.829954210347323e-06, + 6.159663240462756e-06, + 6.504310574436925e-06, + 6.864472300060664e-06, + 7.2407454112026735e-06, + 7.633748546416825e-06, + 8.044122753455822e-06, + 8.47253228025691e-06, + 8.919665393658848e-06, + 9.3862352265522e-06, + 9.872980654698516e-06, + 1.0380667204065274e-05, + 1.091008798958458e-05, + 1.1462064687017476e-05, + 1.2037448538227366e-05, + 1.2637121391921866e-05, + 1.326199678013885e-05, + 1.3913021032694672e-05, + 1.4591174430134563e-05, + 1.5297472396846232e-05, + 1.603296673571626e-05, + 1.679874690591517e-05, + 1.7595941344813317e-05, + 1.8425718836085268e-05, + 1.9289289925523928e-05, + 2.018790838554842e-05, + 2.1122872731493622e-05, + 2.2095527789619823e-05, + 2.3107266320469466e-05, + 2.4159530698168486e-05, + 2.5253814647967533e-05, + 2.6391665045264564e-05, + 2.7574683774416998e-05, + 2.8804529656554016e-05, + 3.0082920438871725e-05, + 3.1411634857816194e-05, + 3.2792514771659815e-05, + 3.4227467366287547e-05, + 3.571846744071573e-05, + 3.726755976642763e-05, + 3.887686153650739e-05, + 4.054856489227661e-05, + 4.228493953942966e-05, + 4.408833545956554e-05, + 4.5961185711560905e-05, + 4.79060093267111e-05, + 4.9925414314370925e-05, + 5.202210076100931e-05, + 5.4198864044186255e-05, + 5.64585981551337e-05, + 5.880429913482358e-05, + 6.123906863336839e-05, + 6.376611758721277e-05, + 6.638877003114287e-05, + 6.911046703415997e-05, + 7.193477077838661e-05, + 7.48653687738423e-05, + 7.79060782261493e-05, + 8.106085054717937e-05, + 8.433377602796408e-05, + 8.772908866991589e-05, + 9.125117118876932e-05, + 9.490456018331713e-05, + 9.869395148928876e-05, + 0.00010262420572035793, + 0.00010670035399062214, + 0.00011092760384748536, + 0.00011531134540438609, + 0.00011985715768065398, + 0.000124570815173693, + 0.0001294582946436252, + 0.00013452578214231495, + 0.00013977968028446443, + 0.0001452266157653262, + 0.00015087344714500713, + 0.000156727272899244, + 0.00016279543974164975, + 0.00016908555124771522, + 0.00017560547676485861, + 0.0001823633606395904, + 0.00018936763175046457, + 0.00019662701338899754, + 0.00020415053346567352, + 0.00021194753507763366, + 0.0002200276874395612, + 0.00022840099718691393, + 0.00023707782008331404, + 0.0002460688731178341, + 0.00025538524702596816, + 0.00026503841924284643, + 0.00027504026730659705, + 0.00028540308272240704, + 0.0002961395853009876, + 0.00030726293799746723, + 0.0003187867622664503, + 0.00033072515393499743, + 0.00034309269963176894, + 0.0003559044937864306, + 0.000369176156207599, + 0.0003829238502716128, + 0.000397164301735396, + 0.00041191481821218896, + 0.00042719330929527063, + 0.00044301830739486823, + 0.0004594089892910584, + 0.00047638519842015684, + 0.0004939674679425502, + 0.000512177044595147, + 0.000531035913376632, + 0.0005505668230715987, + 0.0005707933126642804, + 0.000591739738656144, + 0.0006134313033367726, + 0.000635894084006636, + 0.0006591550632348598, + 0.0006832421601356124, + 0.0007081842627292923, + 0.0007340112614312132, + 0.0007607540836690499, + 0.0007884447297118123, + 0.0008171163097305828, + 0.0008468030821266593, + 0.0008775404931748907, + 0.000909365218052909, + 0.0009423152032566542, + 0.0009764297104957282, + 0.0010117493620827947, + 0.0010483161878945375, + 0.0010861736739418632, + 0.0011253668126128852, + 0.0011659421546385326, + 0.0012079478628519817, + 0.0012514337677855595, + 0.0012964514251872165, + 0.0013430541755003066, + 0.0013912972054045169, + 0.0014412376114552265, + 0.0014929344658941497, + 0.0015464488847648113, + 0.0016018440983080686, + 0.001659185523812981, + 0.0017185408409560467, + 0.0017799800697028214, + 0.0018435756509191617, + 0.0019094025297003289, + 0.001977538241592208, + 0.0020480630017379042, + 0.0021210597970992254, + 0.0021966144818254237, + 0.002274815875859204, + 0.002355755866971449, + 0.002439529516241913, + 0.0025262351671361044, + 0.0026159745583474317, + 0.0027088529404871477, + 0.002804979196702258, + 0.002904465967611671, + 0.0030074297800530237, + 0.0031139911807682333, + 0.003224274874347691, + 0.0033384098658303944, + 0.0034565296082834287, + 0.0035787721554775597, + 0.003705280319533885, + 0.003836201833989403, + 0.003971689522713192, + 0.004111901474073347, + 0.004257001221252446, + 0.004407157928869609, + 0.004562546585733858, + 0.004723348203775672, + 0.004889750024633269, + 0.0050619457321975266, + 0.005240135673136949, + 0.005424527084358519, + 0.005615334328466187, + 0.0058127791370552635, + 0.006017090862162083, + 0.006228506736205408, + 0.006447272140774024, + 0.006673640884232363, + 0.006907875488978949, + 0.007150247488031338, + 0.007401037731798549, + 0.007660536704871663, + 0.00792904485374021, + 0.008206872925009314, + 0.0084943423154954, + 0.008791785433430987, + 0.009099546072201101, + 0.009417979795906145, + 0.00974745433832689, + 0.010088350014876096, + 0.010441060148117895, + 0.01080599150716611, + 0.01118356476251519, + 0.011574214954431804, + 0.011978391978200546, + 0.012396561084245968, + 0.012829203394929984, + 0.013276816438781059, + 0.013739914701691064, + 0.014219030195659526, + 0.014714713047356111, + 0.015227532104181537, + 0.015758075561273743, + 0.01630695160806482, + 0.01687478909565646, + 0.017462238226133155, + 0.018069971263433446, + 0.018698683267550423, + 0.019349092851004335, + 0.020021942961021617, + 0.020718001684622286, + 0.021438063081091967, + 0.022182948038537834, + 0.02295350515913983, + 0.023750611670868626, + 0.024575174368102526, + 0.025428130581170015, + 0.02631044917570444, + 0.02722313158304726, + 0.028167212861858432, + 0.02914376279167895, + 0.030153887000213632, + 0.031198728124339013, + 0.03227946700525881, + 0.03339732392050383, + 0.03455355984991678, + 0.03574947778241996, + 0.03698642405671425, + 0.03826578974442703, + 0.039589012070519125, + 0.04095757587519109, + 0.04237301511657244, + 0.0438369144169299, + 0.0453509106489354, + 0.046916694567866235, + 0.04853601248769901, + 0.050210668000824916, + 0.05194252374561676, + 0.0537335032174941, + 0.05558559262942578, + 0.05750084281775698, + 0.059481371198044176, + 0.06152936376595821, + 0.06364707714978024, + 0.06583684070906304, + 0.06810105868533034, + 0.07044221239744557, + 0.07286286248993118, + 0.07536565122728549, + 0.07795330483846337, + 0.08062863590651818, + 0.08339454580993536, + 0.08625402720477056, + 0.08921016655711762, + 0.09226614671725072, + 0.09542524953569001, + 0.09869085852294304, + 0.1020664615456013, + 0.10555565355922668, + 0.10916213937755305, + 0.11288973646967888, + 0.11674237778635177, + 0.12072411460960958, + 0.12483911942237719, + 0.1290916887907879, + 0.1334862462581522, + 0.13802734524163593, + 0.1427196719242079, + 0.147568048139878, + 0.15257743423487918, + 0.15775293190895878, + 0.1630997870140227, + 0.16862339231018617, + 0.17432929015939852, + 0.18022317515162362, + 0.18631089664486086, + 0.19259846120465424, + 0.19909203492961977, + 0.20579794564373266, + 0.21272268493439273, + 0.21987291001874298, + 0.22725544541534817, + 0.2348772843950536, + 0.24274559018632605, + 0.2508676969047019, + 0.2592511101734622, + 0.2679035074352618, + 0.2768327378302076, + 0.28604682172241463, + 0.2955539497475392, + 0.30536248135439426, + 0.3154809428230366, + 0.3259180246574262, + 0.33668257836391263, + 0.3477836124897322, + 0.3592302878825356, + 0.37103191214708414, + 0.3831979331513062, + 0.39573793155756537, + 0.4086616122630901, + 0.42197879471224187, + 0.43569940192409423, + 0.44983344816819165, + 0.4643910251880323, + 0.47938228683481116, + 0.494817432026825, + 0.5107066858577319, + 0.527060278741, + 0.5438884235045941, + 0.5612012901574067, + 0.5790089782995544, + 0.59732148690497, + 0.6161486813552064, + 0.6355002575584693, + 0.6553857028629871, + 0.6758142536515706, + 0.6967948493690398, + 0.7183360827504724, + 0.74044614603717, + 0.7631327728877012, + 0.7864031758250698, + 0.8102639788613144, + 0.8347211450970609, + 0.8597798990319601, + 0.8854446432121332, + 0.9117188690657787, + 0.9386050616012095, + 0.9661045975779914, + 0.9942176370437122, + 1.0229430078721646, + 1.0522780829590042, + 1.0822186500441102, + 1.1127587736632913, + 1.1438906492307555, + 1.175604448896377, + 1.2078881591974964, + 1.2407274102332295, + 1.2741052964201205, + 1.3080021887771904, + 1.342395538829619, + 1.3772596743031786, + 1.4125655868080171, + 1.4482807119761305, + 1.4843687024193275, + 1.5207891942810081, + 1.5574975680049272, + 1.5944447045391628, + 1.6315767379156554, + 1.6688348058007234, + 1.706154799675978, + 1.7434671164959776, + 1.7806964142353519, + 1.8177613738621785, + 1.8545744707887704, + 1.8910417590989828, + 1.927062672495307, + 1.9625298461501561, + 1.9973289643954026, + 2.0313386393629034, + 2.0644303266754833, + 2.0964682843886804, + 2.1273095823780244, + 2.1568041696397495, + 2.184795007745423, + 2.211118279194198, + 2.23560367993878, + 2.258074805854063, + 2.2783496434030197, + 2.2962411749784164, + 2.3115581097809645, + 2.324105750998158, + 2.333687010087215, + 2.3401035785986557, + 2.3431572673716774, + 2.342651522123937, + 2.338393123198183, + 2.330194075625028, + 2.317873693612349, + 2.301260881007003, + 2.2801966062041186, + 2.2545365662894374, + 2.2241540309128647, + 2.1889428514230183, + 2.1488206151815117, + 2.1037319186819685, + 2.0536517260137934, + 1.9985887716395836, + 1.938588958114528, + 1.873738690454857, + 1.804168079414602, + 1.73005393614513, + 1.6516224701504878, + 1.5691515920328871, + 1.4829727112108835, + 1.3934719077730964, + 1.3010903458573972, + 1.2063237841171153, + 1.1097210272561415, + 1.0118811506558494, + 0.9134493203956511, + 0.8151110233290164, + 0.7175845218134314, + 0.6216113598790617, + 0.5279447843439026, + 0.43733602288653056, + 0.3505185123609046, + 0.2681904417103187, + 0.19099644008933228, + 0.11951001797031285, + 0.054219633346267844, + -0.004476727727628979, + -0.056260401355736255, + -0.100849222531, + -0.137968601281, + -0.167380186141, + -0.188933284224, + -0.202584012742, + -0.208422592654, + -0.206707461998, + -0.197905311896, + -0.182734118624, + -0.162203242403, + -0.137640605516, + -0.11069198109, + -0.0832721961891, + -0.0574441818448, + -0.0352026928912, + -0.0181514275041, + -0.00709626064258, + -0.00165150764395, + -9.94675489485e-05, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 3, + "j": 3, + "angular_momentum": 0 + }, + { + "radial_function": [ + 0.0, + 1.110938010914221e-19, + 1.8390521121652995e-18, + 9.633517333439782e-18, + 3.1507012282984785e-17, + 7.960791404851295e-17, + 1.708566042302814e-16, + 3.276506519521022e-16, + 5.786453791755845e-16, + 9.596166902057673e-16, + 1.514413621709598e-15, + 2.296008689525001e-15, + 3.3676547772863648e-15, + 4.80415803290986e-15, + 6.693277017444312e-15, + 9.137259188648117e-15, + 1.2254526706497767e-14, + 1.6181524522187982e-14, + 2.107474476176394e-14, + 2.711294255050233e-14, + 3.449955963255746e-14, + 4.346537347759867e-14, + 5.427139094677792e-14, + 6.72120071457697e-14, + 8.261845171128589e-14, + 1.008625465535505e-13, + 1.2236080099005376e-13, + 1.475788721967123e-13, + 1.7703642121508688e-13, + 2.1131239697222922e-13, + 2.5105078348411853e-13, + 2.969668480057912e-13, + 3.4985393096682096e-13, + 4.1059082160593026e-13, + 4.801497667157995e-13, + 5.596051635061632e-13, + 6.501429915765162e-13, + 7.530710432994805e-13, + 8.698300162715644e-13, + 1.0020055366980835e-12, + 1.1513411876068855e-12, + 1.3197526213973788e-12, + 1.5093428428313256e-12, + 1.7224187542365569e-12, + 1.961509062727666e-12, + 2.2293836558719068e-12, + 2.529074561157122e-12, + 2.86389861255254e-12, + 3.2374819577410716e-12, + 3.653786548705883e-12, + 4.117138769611854e-12, + 4.632260368024257e-12, + 5.204301866714002e-12, + 5.838878648263313e-12, + 6.54210991716643e-12, + 7.320660761812385e-12, + 8.18178755317005e-12, + 9.133386935937537e-12, + 1.0184048687021745e-11, + 1.1343112736122294e-11, + 1.262073066556991e-11, + 1.4027932030045999e-11, + 1.5576695862760696e-11, + 1.7280027760129895e-11, + 1.9152042968475613e-11, + 2.1208055925464354e-11, + 2.3464676744522173e-11, + 2.5939915164836225e-11, + 2.8653292528026314e-11, + 3.162596238778271e-11, + 3.488084039629339e-11, + 3.844274416766829e-11, + 4.233854386011399e-11, + 4.65973242840657e-11, + 5.125055939264188e-11, + 5.633230008000563e-11, + 6.187937627924375e-11, + 6.793161442531185e-11, + 7.453207142162779e-11, + 8.172728633990668e-11, + 8.9567551168568e-11, + 9.810720201523921e-11, + 1.0740493229042707e-10, + 1.1752412948071045e-10, + 1.2853323727196227e-10, + 1.4050614488094757e-10, + 1.5352260560468966e-10, + 1.6766868675539897e-10, + 1.8303725324434373e-10, + 1.9972848737878547e-10, + 2.1785044740559779e-10, + 2.3751966778106697e-10, + 2.588618041349666e-10, + 2.820123262193346e-10, + 3.071172624210148e-10, + 3.343339994697056e-10, + 3.6383214160352296e-10, + 3.957944332733035e-10, + 4.3041775017808754e-10, + 4.679141636849562e-10, + 5.085120838125168e-10, + 5.524574864983503e-10, + 6.000152315903877e-10, + 6.514704776994149e-10, + 7.071302013663373e-10, + 7.673248278909326e-10, + 8.324099819444364e-10, + 9.027683668209965e-10, + 9.788117813867482e-10, + 1.0609832850797481e-09, + 1.1497595212227122e-09, + 1.245653210560272e-09, + 1.3492158269554212e-09, + 1.4610404688353224e-09, + 1.5817649400002083e-09, + 1.7120750554264519e-09, + 1.8527081879609182e-09, + 2.004457073647749e-09, + 2.168173893763243e-09, + 2.344774654112373e-09, + 2.5352438828545824e-09, + 2.740639669199314e-09, + 2.9620990685947514e-09, + 3.2008438999407324e-09, + 3.4581869629748746e-09, + 3.735538707048638e-09, + 4.034414382168693e-09, + 4.356441708322625e-09, + 4.7033690997143234e-09, + 5.077074483451222e-09, + 5.4795747560798e-09, + 5.913035923110875e-09, + 6.379783970116653e-09, + 6.882316519392352e-09, + 7.4233153264936505e-09, + 8.005659678415517e-09, + 8.632440756089364e-09, + 9.306977032911757e-09, + 1.0032830780359511e-08, + 1.0813825762074822e-08, + 1.1654066200395052e-08, + 1.2557957105820394e-08, + 1.353022606879118e-08, + 1.457594661518428e-08, + 1.570056323926302e-08, + 1.6909918233146025e-08, + 1.8210280441328838e-08, + 1.9608376076928545e-08, + 2.1111421746250788e-08, + 2.2727159840344838e-08, + 2.4463896462115993e-08, + 2.633054206717068e-08, + 2.8336655014566664e-08, + 3.049248823402324e-08, + 3.280903922947687e-08, + 3.529810365831228e-08, + 3.7972332739267186e-08, + 4.084529476453409e-08, + 4.393154100066744e-08, + 4.724667629829996e-08, + 5.080743474128485e-08, + 5.463176069149135e-08, + 5.8738895617352086e-08, + 6.314947111161887e-08, + 6.788560854251597e-08, + 7.29710258036305e-08, + 7.843115167152919e-08, + 8.429324830666341e-08, + 9.058654248010258e-08, + 9.734236613507795e-08, + 1.0459430695959475e-07, + 1.1237836966442219e-07, + 1.2073314873400925e-07, + 1.2970001346551517e-07, + 1.3932330615355655e-07, + 1.4965055436636435e-07, + 1.6073269830412695e-07, + 1.7262433430427855e-07, + 1.8538397563754497e-07, + 1.990743318289624e-07, + 2.1376260779496944e-07, + 2.2952082421732846e-07, + 2.464261606398413e-07, + 2.6456132290603685e-07, + 2.840149366510495e-07, + 3.048819686929853e-07, + 3.2726417829129034e-07, + 3.512706003887073e-07, + 3.7701806308618723e-07, + 4.0463174177907344e-07, + 4.3424575253016614e-07, + 4.660037874684627e-07, + 5.000597951593736e-07, + 5.365787091187542e-07, + 5.757372279096858e-07, + 6.1772465038816e-07, + 6.627437700561136e-07, + 7.110118326544564e-07, + 7.627615614438848e-07, + 8.182422549942646e-07, + 8.77720962522793e-07, + 9.414837423147905e-07, + 1.0098370090234816e-06, + 1.083108976154809e-06, + 1.1616512004115134e-06, + 1.245840235048219e-06, + 1.3360793999983024e-06, + 1.4328006768882887e-06, + 1.5364667377589017e-06, + 1.6475731169570922e-06, + 1.7666505362215964e-06, + 1.894267393667406e-06, + 2.031032428538383e-06, + 2.1775975731977154e-06, + 2.3346610068806937e-06, + 2.502970424241152e-06, + 2.683326534099597e-06, + 2.876586804825069e-06, + 3.0836694736256036e-06, + 3.3055578377768143e-06, + 3.5433048480190072e-06, + 3.7980380258279367e-06, + 4.07096472583228e-06, + 4.3633777688763295e-06, + 4.676661471717238e-06, + 5.0122981004060445e-06, + 5.371874776612025e-06, + 5.757090871458908e-06, + 6.169765916718085e-06, + 6.611848073695857e-06, + 7.085423195853129e-06, + 7.5927245287084365e-06, + 8.136143090609526e-06, + 8.718238782135852e-06, + 9.341752275279641e-06, + 1.0009617737185206e-05, + 1.0724976445833407e-05, + 1.149119136168511e-05, + 1.2311862720087109e-05, + 1.3190844717508944e-05, + 1.4132263366313912e-05, + 1.5140535601664103e-05, + 1.622038972510272e-05, + 1.7376887281940213e-05, + 1.8615446468023024e-05, + 1.9941867176680437e-05, + 2.136235779554734e-05, + 2.2883563880210304e-05, + 2.4512598831797668e-05, + 2.6257076718585453e-05, + 2.8125147390058294e-05, + 3.0125534048610792e-05, + 3.2267573437547265e-05, + 3.456125884207592e-05, + 3.701728608528908e-05, + 3.964710273397349e-05, + 4.2462960738723516e-05, + 4.547797274046049e-05, + 4.870617229715919e-05, + 5.2162578313921375e-05, + 5.586326394769041e-05, + 5.982543031589838e-05, + 6.406748532711954e-05, + 6.860912799198925e-05, + 7.347143859681519e-05, + 7.867697513612e-05, + 8.424987644486009e-05, + 9.021597247663321e-05, + 9.660290224450291e-05, + 0.00010344023991921664, + 0.00011075962968117843, + 0.00011859492988753425, + 0.00012698236723246762, + 0.0001359607015548331, + 0.00014557140203968333, + 0.00015585883558489737, + 0.00016687046816498202, + 0.00017865708008474158, + 0.0001912729960618302, + 0.0002047763311464538, + 0.00021922925356840186, + 0.00023469826565051657, + 0.0002512545040075209, + 0.0002689740603653363, + 0.00028793832433799744, + 0.00030823434974172604, + 0.0003299552459072917, + 0.0003532005958040328, + 0.0003780769026748342, + 0.00040469806715609497, + 0.00043318589689796865, + 0.0004636706508985048, + 0.0004962916207822043, + 0.0005311977515906721, + 0.0005685483046572988, + 0.0006085135653338428, + 0.0006512755986227738, + 0.0006970290557605281, + 0.0007459820352415443, + 0.000798357001745102, + 0.0008543917668734306, + 0.0009143405355950153, + 0.0009784750228523584, + 0.001047085644731222, + 0.0011204827891982065, + 0.0011989981713117536, + 0.0012829862786144152, + 0.0013728259122695776, + 0.0014689218302151533, + 0.0015717064986644077, + 0.0016816419590955699, + 0.0017992218176326354, + 0.0019249733649262246, + 0.002059459834403904, + 0.002203282807565223, + 0.0023570847755889973, + 0.0025215518666411216, + 0.002697416749150383, + 0.0028854617218809432, + 0.0030865220018314273, + 0.0033014892220740956, + 0.003531315151961907, + 0.0037770156529206515, + 0.004039674883517351, + 0.004320449768579743, + 0.0046205747474339035, + 0.004941366817151053, + 0.005284230887860485, + 0.0056506654669539035, + 0.0060422686913056455, + 0.006460744725592312, + 0.0069079105472552495, + 0.007385703138039412, + 0.007896187104024772, + 0.008441562745848319, + 0.009024174601957534, + 0.009646520488662673, + 0.010311261061045515, + 0.011021229919329838, + 0.011779444286358071, + 0.012589116281967096, + 0.013453664820250653, + 0.014376728156306523, + 0.01536217710879288, + 0.01641412898447857, + 0.01753696223527942, + 0.01873533186239097, + 0.02001418560777231, + 0.02137878094648299, + 0.022834702904545215, + 0.024387882727888822, + 0.0260446174140307, + 0.027811590132933488, + 0.029695891540249, + 0.031705041995706826, + 0.03384701469961046, + 0.036130259734624, + 0.03856372901567058, + 0.041156902128727614, + 0.04391981304726826, + 0.046863077683953314, + 0.04999792224271964, + 0.053336212320031176, + 0.05689048268366721, + 0.060673967655619956, + 0.06470063198901276, + 0.06898520212565022, + 0.07354319771037171, + 0.07839096316629988, + 0.08354569917553807, + 0.08902549381893758, + 0.09484935313839582, + 0.10103723084224926, + 0.10761005679823607, + 0.11458976397234143, + 0.12199931338782506, + 0.129862716634284, + 0.13820505541118996, + 0.14705249750437546, + 0.1564323085823389, + 0.1663728590582151, + 0.1769036252497939, + 0.1880551839726667, + 0.19985919956992476, + 0.21234840239209882, + 0.22555655757695434, + 0.23951842284435115, + 0.2542696940559408, + 0.2698469370657763, + 0.2862875042786132, + 0.3036294343934283, + 0.3219113334460497, + 0.341172235424637, + 0.3614514404209503, + 0.38278832839537535, + 0.4052221463561599, + 0.42879176686604753, + 0.45353541564315514, + 0.4794903660507333, + 0.5066925982872038, + 0.5351764210840946, + 0.5649740539326001, + 0.5961151678292493, + 0.6286263829449827, + 0.6625307216328417, + 0.697847015896823, + 0.7345892684579899, + 0.7727659674706603, + 0.812379355432605, + 0.8534246534950235, + 0.895889243542505, + 0.9397518112411282, + 0.984981454599608, + 1.0315367637571473, + 1.0793648794622681, + 1.1284005390921716, + 1.1785651211877854, + 1.229765700945276, + 1.2818941317383907, + 1.334826169183894, + 1.3884206569748212, + 1.4425187953036915, + 1.4969435149229733, + 1.5514989815133924, + 1.6059702563885832, + 1.6601231404473868, + 1.7137042286796558, + 1.766441201716713, + 1.8180433797559457, + 1.868202561008069, + 1.916594163034813, + 1.9628786795932318, + 2.0067034580536354, + 2.0477047935898627, + 2.0855103253340266, + 2.1197417073440414, + 2.1500175135815387, + 2.1759563220403177, + 2.1971799092546807, + 2.213316474417256, + 2.2240038036870304, + 2.228892282482523, + 2.227647669402942, + 2.219953563386298, + 2.2055135296218187, + 2.1840529037660246, + 2.1553203722998413, + 2.1190895327813757, + 2.075160773248569, + 2.0233639743381153, + 1.963562725061483, + 1.8956609417680361, + 1.8196129667015208, + 1.735438362670645, + 1.6432426594792875, + 1.543245171005368, + 1.435814588999782, + 1.3215122433278708, + 1.2011415523933404, + 1.0758001152459447, + 0.9469279918834098, + 0.8163419389330445, + 0.6862408773348109, + 0.5591632198229056, + 0.4378731428126584, + 0.3251529264005497, + 0.22348659991255518, + 0.13464406532329226, + 0.05922752940095515, + -0.0036555997311689768, + -0.0562438883462959, + -0.100849222531, + -0.137968601281, + -0.167380186141, + -0.188933284224, + -0.202584012742, + -0.208422592654, + -0.206707461998, + -0.197905311896, + -0.182734118624, + -0.162203242403, + -0.137640605516, + -0.11069198109, + -0.0832721961891, + -0.0574441818448, + -0.0352026928912, + -0.0181514275041, + -0.00709626064258, + -0.00165150764395, + -9.94675489485e-05, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 3, + "j": 3, + "angular_momentum": 2 + }, + { + "radial_function": [ + 0.0, + 7.461920183115387e-15, + 6.123909391658703e-14, + 2.1204200005789978e-13, + 5.156899248140361e-13, + 1.0334760422216264e-12, + 1.8325551708452867e-12, + 2.9863555187305567e-12, + 4.5750158016601e-12, + 6.685849196819023e-12, + 9.413835674680962e-12, + 1.286214433795263e-11, + 1.7142687486453608e-11, + 2.2376708220767327e-11, + 2.86954035002104e-11, + 3.624058467279653e-11, + 4.516537760908313e-11, + 5.563496468801288e-11, + 6.78273710048067e-11, + 8.19342973094981e-11, + 9.816200229582431e-11, + 1.1673223706156e-10, + 1.378832346335086e-10, + 1.618707576864257e-10, + 1.8896920770496342e-10, + 2.19472799039221e-10, + 2.5369680150890475e-10, + 2.9197885531906277e-10, + 3.3468036243949307e-10, + 3.8218795857615324e-10, + 4.349150703517738e-10, + 4.933035623290063e-10, + 5.578254789477466e-10, + 6.28984886581983e-10, + 7.073198213170573e-10, + 7.934043482555709e-10, + 8.87850738525972e-10, + 9.913117705649856e-10, + 1.1044831623800725e-09, + 1.228106142189094e-09, + 1.3629701649618208e-09, + 1.5099157827749202e-09, + 1.6698376777785261e-09, + 1.84368786623621e-09, + 2.0324790834712014e-09, + 2.23728835925012e-09, + 2.4592607943493947e-09, + 2.6996135489816797e-09, + 2.9596400550572945e-09, + 3.2407144641520514e-09, + 3.544296344077376e-09, + 3.871935637945593e-09, + 4.225277899510502e-09, + 4.606069820376945e-09, + 5.016165064275664e-09, + 5.45753042585874e-09, + 5.932252331048305e-09, + 6.4425436976464324e-09, + 6.990751175882151e-09, + 7.579362789296382e-09, + 8.21101599769028e-09, + 8.888506204952753e-09, + 9.614795736094979e-09, + 1.0393023308273631e-08, + 1.1226514023065178e-08, + 1.2118789907662571e-08, + 1.3073581035061442e-08, + 1.4094837254116542e-08, + 1.5186740561995798e-08, + 1.6353718154822897e-08, + 1.7600456191279824e-08, + 1.893191430938955e-08, + 2.03533409349206e-08, + 2.187028942607903e-08, + 2.3488635097685285e-08, + 2.521459317273967e-08, + 2.705473771110111e-08, + 2.9016021568052038e-08, + 3.110579743669605e-08, + 3.333184003355244e-08, + 3.57023694884099e-08, + 3.8226076001033015e-08, + 4.0912145836339e-08, + 4.3770288724440016e-08, + 4.68107667458014e-08, + 5.004442477709845e-08, + 5.348272258204609e-08, + 5.7137768638925076e-08, + 6.102235578527107e-08, + 6.514999879965318e-08, + 6.953497399147124e-08, + 7.419236093967809e-08, + 7.913808647160399e-08, + 8.438897100535585e-08, + 8.996277739626484e-08, + 9.587826238871003e-08, + 1.0215523086207466e-07, + 1.0881459296142983e-07, + 1.1587842430074633e-07, + 1.233700294145824e-07, + 1.3131400859535477e-07, + 1.3973632829732243e-07, + 1.4866439535496373e-07, + 1.5812713512852204e-07, + 1.6815507386401666e-07, + 1.7878042544665926e-07, + 1.9003718278447786e-07, + 2.0196121409585597e-07, + 2.1459036431394923e-07, + 2.2796456194235183e-07, + 2.421259315733378e-07, + 2.571189124430951e-07, + 2.729903832816228e-07, + 2.8978979385583647e-07, + 3.0756930347775586e-07, + 3.263839269240257e-07, + 3.4629168810626716e-07, + 3.6735378195357383e-07, + 3.896347448596106e-07, + 4.132026342327858e-07, + 4.3812921760676775e-07, + 4.6449017173863775e-07, + 4.92365292365065e-07, + 5.218387150678429e-07, + 5.529991478336264e-07, + 5.859401160481977e-07, + 6.207602203914573e-07, + 6.575634084815771e-07, + 6.964592609212991e-07, + 7.375632924760056e-07, + 7.809972692660575e-07, + 8.268895427496907e-07, + 8.753754013451463e-07, + 9.26597440787001e-07, + 9.80705953998019e-07, + 1.0378593416740295e-06, + 1.0982245444877868e-06, + 1.1619774983175846e-06, + 1.2293036134162512e-06, + 1.3003982789977559e-06, + 1.3754673944856018e-06, + 1.4547279287917688e-06, + 1.5384085092798815e-06, + 1.6267500417094707e-06, + 1.7200063629804182e-06, + 1.8184449283467155e-06, + 1.9223475349432314e-06, + 2.032011083484909e-06, + 2.147748380118899e-06, + 2.269888980641946e-06, + 2.398780079298915e-06, + 2.534787444325675e-06, + 2.678296402915626e-06, + 2.829712878156301e-06, + 2.9894644805319823e-06, + 3.1580016570001576e-06, + 3.3357989005727786e-06, + 3.5233560237959855e-06, + 3.7211994990096973e-06, + 3.929883869429109e-06, + 4.149993234497753e-06, + 4.382142813307535e-06, + 4.6269805904863934e-06, + 4.885189048560714e-06, + 5.157486991621112e-06, + 5.4446314647624e-06, + 5.74741977463195e-06, + 6.066691616153464e-06, + 6.403331311270324e-06, + 6.758270165057132e-06, + 7.1324889461322865e-06, + 7.5270204970780204e-06, + 7.942952482164956e-06, + 8.381430279683357e-06, + 8.843660025829658e-06, + 9.330911818825275e-06, + 9.84452309131338e-06, + 1.0385902159724427e-05, + 1.0956531959944581e-05, + 1.1557973979524489e-05, + 1.2191872395850829e-05, + 1.2859958431922678e-05, + 1.3564054940435794e-05, + 1.4306081228633129e-05, + 1.5088058136211941e-05, + 1.5912113379700755e-05, + 1.678048717709933e-05, + 1.7695538167708384e-05, + 1.8659749642218234e-05, + 1.9675736099706024e-05, + 2.0746250148161243e-05, + 2.1874189767206043e-05, + 2.3062605951207668e-05, + 2.4314710752672196e-05, + 2.5633885748297492e-05, + 2.702369094729119e-05, + 2.8487874167441525e-05, + 3.0030380902176576e-05, + 3.1655364703966735e-05, + 3.336719811263137e-05, + 3.517048415482222e-05, + 3.7070068446706496e-05, + 3.9071051929618726e-05, + 4.1178804273132235e-05, + 4.3398977979539576e-05, + 4.573752322584881e-05, + 4.8200703484244645e-05, + 5.079511195875892e-05, + 5.3527688881703686e-05, + 5.640573971626118e-05, + 5.9436954311194024e-05, + 6.262942705569178e-05, + 6.599167809514614e-05, + 6.953267564128349e-05, + 7.326185946742673e-05, + 7.718916562231284e-05, + 8.132505243424123e-05, + 8.568052787889708e-05, + 9.026717838053751e-05, + 9.509719911018787e-05, + 0.00010018342586905344, + 0.00010553936864999827, + 0.00011117924693357468, + 0.00011711802683682137, + 0.00012337146021039122, + 0.00012995612576989182, + 0.000136889472359752, + 0.00014418986451536034, + 0.00015187663035954178, + 0.000159970112033775, + 0.0001684917187388359, + 0.00017746398255777285, + 0.00018691061718702795, + 0.00019685657972954847, + 0.00020732813571239844, + 0.0002183529275005842, + 0.00022996004626781906, + 0.0002421801077368081, + 0.0002550453318524669, + 0.0002685896266211942, + 0.0002828486763063366, + 0.000297860034237642, + 0.0003136632204316113, + 0.0003302998243306622, + 0.0003478136128619807, + 0.00036625064415329205, + 0.00038565938713421325, + 0.0004060908473998057, + 0.0004275986996113403, + 0.0004502394267827318, + 0.0004740724668013973, + 0.000499160366632012, + 0.0005255689444468494, + 0.0005533674602825892, + 0.0005826287954984186, + 0.0006134296415796425, + 0.0006458506987899365, + 0.0006799768851111472, + 0.0007158975560036874, + 0.0007537067356771648, + 0.0007935033602474867, + 0.0008353915336144246, + 0.0008794807965628412, + 0.000925886409820883, + 0.0009747296518370162, + 0.0010261381319513062, + 0.0010802461198488066, + 0.0011371948919857103, + 0.0011971330961031298, + 0.0012602171344508646, + 0.0013266115670225959, + 0.0013964895354636343, + 0.0014700332090730748, + 0.0015474342537558415, + 0.0016288943252612204, + 0.0017146255878816353, + 0.0018048512599256948, + 0.0018998061873824364, + 0.0019997374471531046, + 0.002104904981352848, + 0.0022155822643716828, + 0.002332057004279133, + 0.002454631880275389, + 0.002583625318237038, + 0.002719372305868559, + 0.00286222525017069, + 0.003012554878462298, + 0.0031707511860872206, + 0.0033372244324390635, + 0.0035124061881682475, + 0.0036967504359663073, + 0.003890734727885536, + 0.0040948614014804634, + 0.004309658858411438, + 0.004535682908281551, + 0.004773518180835008, + 0.005023779610445193, + 0.005287113995789908, + 0.005564201639243862, + 0.005855758069273145, + 0.006162535850591843, + 0.006485326485607712, + 0.006824962412639145, + 0.007182319104781626, + 0.007558317275305711, + 0.00795392519359151, + 0.008370161118406265, + 0.008808095853112655, + 0.009268855429515766, + 0.009753623925788268, + 0.010263646426256386, + 0.010800232128041605, + 0.011364757603563418, + 0.011958670224977066, + 0.01258349175856962, + 0.013240822137874047, + 0.013932343422887102, + 0.014659823954677246, + 0.015425122714988256, + 0.016230193899254803, + 0.017077091713849166, + 0.017967975407461968, + 0.018905114547507984, + 0.0198908945521089, + 0.02092782249013641, + 0.02201853316060209, + 0.023165795463534963, + 0.024372519076430163, + 0.025641761447233017, + 0.026976735120724068, + 0.0283808154091693, + 0.02985754842444078, + 0.031410659484442126, + 0.03304406191120117, + 0.034761866235108754, + 0.03656838982158097, + 0.03846816693744259, + 0.04046595927345422, + 0.04256676693956168, + 0.04477583995119389, + 0.04709869022412059, + 0.04954110409504191, + 0.05210915538620948, + 0.05480921903125316, + 0.057647985279112204, + 0.06063247450484317, + 0.06377005261431218, + 0.06706844710031805, + 0.07053576373735441, + 0.07418050393579316, + 0.07801158278100558, + 0.08203834775200712, + 0.08627059815625578, + 0.09071860526557853, + 0.095393133169736, + 0.10030546037139297, + 0.1054674020952659, + 0.11089133333239558, + 0.11659021260170997, + 0.12257760644288422, + 0.12886771460082275, + 0.13547539589742177, + 0.14241619476954862, + 0.1497063684309567, + 0.15736291463632654, + 0.16540359997643256, + 0.1738469886573056, + 0.18271247172568977, + 0.19202029659600567, + 0.2017915968533915, + 0.21204842217131253, + 0.22281376824881022, + 0.23411160663852762, + 0.24596691424939954, + 0.2584057023918324, + 0.2714550451394478, + 0.2851431067684304, + 0.29949916802452126, + 0.31455365089141274, + 0.3303381415920518, + 0.3468854113939241, + 0.3642294348547429, + 0.3824054050690779, + 0.4014497453528677, + 0.42140011691548745, + 0.44229542189615206, + 0.46417580102772804, + 0.4870826253443633, + 0.5110584810896728, + 0.5361471469106888, + 0.5623935626041177, + 0.5898437882042624, + 0.6185449525225079, + 0.64854518983642, + 0.6798935636454146, + 0.7126399760201494, + 0.7468350612421322, + 0.7825300621834487, + 0.8197766878531131, + 0.8586269504525758, + 0.899132980120905, + 0.9413468156402347, + 0.9853201690466817, + 1.0311041623220865, + 1.0787490339111834, + 1.128303813263064, + 1.1798159609591712, + 1.2333309725018415, + 1.2888919436120234, + 1.3465390947524956, + 1.406309253004483, + 1.46823528919618, + 1.5323455085036357, + 1.598662992634238, + 1.6672048922327143, + 1.7379816679883195, + 1.810996279653323, + 1.8862433218321288, + 1.9637081066321789, + 2.0433656927230643, + 2.125179861683331, + 2.209102042333426, + 2.295070184728719, + 2.3830075859594917, + 2.472821670535374, + 2.5644027288150757, + 2.6576226179338227, + 2.7523334300717806, + 2.8483661344749738, + 2.945529199896479, + 3.0436072058517003, + 3.1423594523148024, + 3.2415185786813034, + 3.3407892052208386, + 3.4398466123003577, + 3.538335475741602, + 3.6358686802705633, + 3.7320262380774176, + 3.8263543452818394, + 3.918364617106608, + 4.00753355222022, + 4.093302289015968, + 4.175076731609379, + 4.252228141663417, + 4.324094314163801, + 4.389981480483731, + 4.449167111010146, + 4.500903821013382, + 4.544424615879036, + 4.578949742655881, + 4.603695440347338, + 4.617884894819788, + 4.620761697828766, + 4.611606071293961, + 4.589754033011786, + 4.55461952921583, + 4.5057193206094555, + 4.442700056397278, + 4.365366481090943, + 4.273709071505965, + 4.167928592960767, + 4.048454120484737, + 3.9159500786285246, + 3.7713069963546326, + 3.6156103033755955, + 3.4500822278536583, + 3.275994729011411, + 3.0945580940243875, + 2.9068030107447953, + 2.713497736850356, + 2.5151827580386974, + 2.31247637487, + 2.10648108745, + 1.89866005663, + 1.69067431967, + 1.48441707314, + 1.28203919992, + 1.08595973176, + 0.898849959344, + 0.72357772568, + 0.563097444156, + 0.42027295952, + 0.297626049513, + 0.197015492245, + 0.119272073143, + 0.0638452840596, + 0.0285560561588, + 0.00959020116737, + 0.00189202090221, + 9.49677066949e-05, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 3, + "j": 4, + "angular_momentum": 1 + }, + { + "radial_function": [ + 0.0, + 1.1215108886023229e-24, + 3.7448442182551456e-23, + 2.967715846309455e-22, + 1.3052696497996257e-21, + 4.15801946357675e-21, + 1.0801421810755495e-20, + 2.4375582866235933e-20, + 4.962572062147472e-20, + 9.339281299196959e-20, + 1.651949819017731e-19, + 2.7791252941716207e-19, + 4.485911231395204e-19, + 6.993793852559434e-19, + 1.058619091494251e-18, + 1.5621083526421583e-18, + 2.254560555018158e-18, + 3.191284501481305e-18, + 4.440114148150237e-18, + 6.083619604751775e-18, + 8.221634686272948e-18, + 1.097414031904782e-17, + 1.4484547530096138e-17, + 1.892342866088043e-17, + 2.449275086049767e-17, + 3.1430671904203e-17, + 4.001696500165454e-17, + 5.0579146538958696e-17, + 6.349938879938912e-17, + 7.922230853714495e-17, + 9.826373215004796e-17, + 1.2122054894280404e-16, + 1.4878177594130342e-16, + 1.817409708005361e-16, + 2.2101014384976323e-16, + 2.676353362054615e-16, + 3.228140484300369e-16, + 3.8791472355213856e-16, + 4.644985093704323e-16, + 5.543435485038993e-16, + 6.594720701957653e-16, + 7.821805860677378e-16, + 9.25073523434638e-16, + 1.0911006632942407e-15, + 1.2835987883212736e-15, + 1.5063379867054194e-15, + 1.7635731035365463e-15, + 2.060100880502363e-15, + 2.4013233799829053e-15, + 2.793318348711827e-15, + 3.242917242247584e-15, + 3.757791704125946e-15, + 4.346549371505231e-15, + 5.018839967442486e-15, + 5.785472733257922e-15, + 6.6585463611635225e-15, + 7.651592699614692e-15, + 8.779735630499376e-15, + 1.0059866654910934e-14, + 1.1510838874333873e-14, + 1.3153681219678638e-14, + 1.5011834961439212e-14, + 1.7111414733353677e-14, + 1.9481496516861556e-14, + 2.215443527451953e-14, + 2.516621517820759e-14, + 2.8556835665820846e-14, + 3.237073687007716e-14, + 3.6657268304363443e-14, + 4.1471205070502395e-14, + 4.6873316251973346e-14, + 5.2930990617753434e-14, + 5.971892523667671e-14, + 6.731988315592395e-14, + 7.582552686786346e-14, + 8.533733494130148e-14, + 9.596760989248988e-14, + 1.0784058614156086e-13, + 1.210936477302234e-13, + 1.358786664087764e-13, + 1.523634716974776e-13, + 1.707334656119111e-13, + 1.9119339598051593e-13, + 2.1396930353231675e-13, + 2.393106594379403e-13, + 2.674927114909937e-13, + 2.988190588599868e-13, + 3.336244772436073e-13, + 3.7227801815791667e-13, + 4.1518640864261035e-13, + 4.627977795936382e-13, + 5.156057542258878e-13, + 5.741539305360006e-13, + 6.390407950605252e-13, + 7.10925108851631e-13, + 7.905318098209133e-13, + 8.786584807555825e-13, + 9.761824354867851e-13, + 1.0840684817538552e-12, + 1.203377424533739e-12, + 1.3352753787646612e-12, + 1.4810439672556017e-12, + 1.6420914876326294e-12, + 1.819965137397722e-12, + 2.016364397287834e-12, + 2.233155680235881e-12, + 2.472388363928602e-12, + 2.7363123363982595e-12, + 3.0273971944180586e-12, + 3.3483532497228632e-12, + 3.702154509177163e-12, + 4.09206381376457e-12, + 4.521660335020338e-12, + 4.994869648947487e-12, + 5.515996623736642e-12, + 6.0897613835740385e-12, + 6.72133863127831e-12, + 7.416400641431112e-12, + 8.181164259987601e-12, + 9.022442282387027e-12, + 9.947699612854382e-12, + 1.0965114642014288e-11, + 1.2083646328010119e-11, + 1.33131075013165e-11, + 1.4664244964476175e-11, + 1.6148827015702875e-11, + 1.7779739069138754e-11, + 1.9571088121141995e-11, + 2.1538316869928442e-11, + 2.369832837062717e-11, + 2.6069622193889897e-11, + 2.867244313654574e-11, + 3.1528943628884576e-11, + 3.466336109896777e-11, + 3.8102211647363134e-11, + 4.18745015302096e-11, + 4.601195806242481e-11, + 5.054928172830981e-11, + 5.5524421411190085e-11, + 6.097887486118892e-11, + 6.695801669100944e-11, + 7.351145639980448e-11, + 8.069342916903528e-11, + 8.856322238597505e-11, + 9.718564115417111e-11, + 1.0663151632490386e-10, + 1.1697825891017956e-10, + 1.2831046507843543e-10, + 1.407205763143384e-10, + 1.5430959975082353e-10, + 1.6918789412261647e-10, + 1.8547602726073553e-10, + 2.033057116259987e-10, + 2.2282082493579064e-10, + 2.4417852356050186e-10, + 2.67550457091158e-10, + 2.9312409320613343e-10, + 3.211041628293399e-10, + 3.517142363703886e-10, + 3.8519844295330776e-10, + 4.218233454955848e-10, + 4.6187998567290765e-10, + 5.056861141346689e-10, + 5.53588622610649e-10, + 6.059661961478521e-10, + 6.63232205243156e-10, + 7.258378595271085e-10, + 7.942756464930817e-10, + 8.690830809758845e-10, + 9.508467932156887e-10, + 1.0402069861242145e-09, + 1.1378622947594702e-09, + 1.2445750842597838e-09, + 1.3611772256622168e-09, + 1.4885763923620968e-09, + 1.6277629241509999e-09, + 1.7798173096958337e-09, + 1.9459183429182004e-09, + 2.127352013745433e-09, + 2.3255211992563808e-09, + 2.5419562267196206e-09, + 2.7783263869621355e-09, + 3.036452483014018e-09, + 3.3183205069663343e-09, + 3.6260965460013103e-09, + 3.962143027742073e-09, + 4.329036424785117e-09, + 4.729586549149452e-09, + 5.166857578782033e-09, + 5.644190971283808e-09, + 6.1652304334703025e-09, + 6.733949130972969e-09, + 7.354679337839754e-09, + 8.03214474424312e-09, + 8.771495660676481e-09, + 9.578347376150485e-09, + 1.0458821953476604e-08, + 1.1419593768030614e-08, + 1.2467939124111276e-08, + 1.3611790314006744e-08, + 1.4859794515007549e-08, + 1.622137795763515e-08, + 1.7706815834354768e-08, + 1.9327308461965334e-08, + 2.1095064254977132e-08, + 2.3023390117025608e-08, + 2.5126789913855985e-08, + 2.7421071746170505e-08, + 2.9923464807505955e-08, + 3.2652746682902916e-08, + 3.562938201775796e-08, + 3.88756735682516e-08, + 4.241592674525384e-08, + 4.627662883084836e-08, + 5.048664420944023e-08, + 5.50774270100553e-08, + 6.008325271778581e-08, + 6.554147045023229e-08, + 7.149277773744958e-08, + 7.79815197936899e-08, + 8.505601547224139e-08, + 9.276891229263231e-08, + 1.0117757308290853e-07, + 1.1034449708659419e-07, + 1.2033777860017035e-07, + 1.312316064543183e-07, + 1.4310680795392461e-07, + 1.5605144132141357e-07, + 1.701614408122324e-07, + 1.855413193184141e-07, + 2.0230493346641412e-07, + 2.205763168281965e-07, + 2.4049058726032977e-07, + 2.6219493495750367e-07, + 2.858496983934058e-07, + 3.116295359611281e-07, + 3.397247017709415e-07, + 3.703424349142135e-07, + 4.0370847218472504e-07, + 4.4006869528074407e-07, + 4.796909243500033e-07, + 5.228668709417187e-07, + 5.699142643831832e-07, + 6.211791671246888e-07, + 6.770384956159518e-07, + 7.379027651166934e-07, + 8.042190780818527e-07, + 8.764743779359954e-07, + 9.551989915896391e-07, + 1.0409704863010386e-06, + 1.134417868687477e-06, + 1.2362261564764128e-06, + 1.3471413553892734e-06, + 1.4679758777768228e-06, + 1.599614441425532e-06, + 1.7430204913799739e-06, + 1.8992431911651668e-06, + 2.069425033455539e-06, + 2.2548101249468624e-06, + 2.4567532057180327e-06, + 2.67672946689501e-06, + 2.916345238321299e-06, + 3.177349622307787e-06, + 3.461647157302141e-06, + 3.7713116027176963e-06, + 4.108600943427914e-06, + 4.475973722207477e-06, + 4.8761068163533076e-06, + 5.311914787577217e-06, + 5.7865709418337576e-06, + 6.303530252347342e-06, + 6.866554307412635e-06, + 7.479738464213837e-06, + 8.147541400935265e-06, + 8.874817279740903e-06, + 9.666850750028581e-06, + 1.0529395042135479e-05, + 1.1468713424007676e-05, + 1.2491624316190301e-05, + 1.3605550386841365e-05, + 1.4818571977873044e-05, + 1.6139485242153922e-05, + 1.7577865405206173e-05, + 1.9144135604072518e-05, + 2.0849641788063838e-05, + 2.270673422205606e-05, + 2.4728856160363248e-05, + 2.693064033187841e-05, + 2.9328013911846326e-05, + 3.19383127295196e-05, + 3.4780405518094265e-05, + 3.7874829090088816e-05, + 4.124393538544135e-05, + 4.491205144133984e-05, + 4.890565340783318e-05, + 5.325355583353072e-05, + 5.798711756370641e-05, + 6.314046568741907e-05, + 6.875073912211908e-05, + 7.485835353412544e-05, + 8.150728946587918e-05, + 8.874540567231485e-05, + 9.662477987923006e-05, + 0.00010520207932687309, + 0.00011453896370633069, + 0.00012470252326950425, + 0.00013576575519547252, + 0.00014780808149794758, + 0.00016091591208772127, + 0.0001751832568707271, + 0.00019071239115286845, + 0.00020761457889529743, + 0.0002260108588623257, + 0.00024603289903256896, + 0.0002678239251481803, + 0.0002915397297902535, + 0.000317349768847032, + 0.00034543835287309034, + 0.0003760059414692572, + 0.0004092705494321977, + 0.00044546927423289674, + 0.00048485995512857766, + 0.0005277229750930833, + 0.0005743632176432873, + 0.0006251121917070618, + 0.0006803303386861023, + 0.0007404095370444987, + 0.0008057758210876449, + 0.0008768923317636699, + 0.0009542625190629112, + 0.0010384336168142029, + 0.0011300004126834128, + 0.0012296093377217414, + 0.0013379629019990096, + 0.0014558245047519975, + 0.0015840236497983076, + 0.001723461599419191, + 0.0018751175024092279, + 0.0020400550347235476, + 0.0022194295942053583, + 0.0024144960939486326, + 0.0026266174021544477, + 0.002857273479986814, + 0.0031080712726293657, + 0.003380755412734735, + 0.0036772198009199387, + 0.003999520128451402, + 0.004349887418867987, + 0.00473074266365903, + 0.005144712635547936, + 0.005594646969289085, + 0.006083636602348605, + 0.006615033678821576, + 0.007192473020423324, + 0.007819895278594478, + 0.008501571890037717, + 0.0092421319584495, + 0.01004659119874403, + 0.010920383082362978, + 0.011869392334478427, + 0.012899990933557677, + 0.014019076776348758, + 0.01523411517646519, + 0.01655318336828494, + 0.017985018198158904, + 0.01953906718249113, + 0.021225543121627544, + 0.02305548246574172, + 0.025040807611027265, + 0.02719439332991342, + 0.02953013751184434, + 0.03206303640240702, + 0.03480926451782733, + 0.03778625938343903, + 0.04101281125278986, + 0.04450915792720341, + 0.04829708477135296, + 0.052400029991916376, + 0.0568431951931807, + 0.061653661200407175, + 0.066860509048375, + 0.07249494599308293, + 0.07859043631556346, + 0.08518283656599353, + 0.0923105348399792, + 0.1000145935167771, + 0.10833889472167105, + 0.11733028768897621, + 0.12703873695007142, + 0.13751747005615947, + 0.14882312341731452, + 0.16101588442011391, + 0.17415962786403888, + 0.1883220443058006, + 0.2035747576926732, + 0.219993429159615, + 0.23765784358461292, + 0.2566519750001532, + 0.27706402654074447, + 0.2989864401418398, + 0.3225158706792197, + 0.34775311884252585, + 0.37480301640598823, + 0.40377425725450194, + 0.43477916684995704, + 0.46793340272607215, + 0.5033555778800787, + 0.5411667990085891, + 0.5814901112629068, + 0.6244498410909438, + 0.6701708291825539, + 0.7187775457400931, + 0.7703930811363506, + 0.8251380058213897, + 0.8831290949653906, + 0.9444779147749358, + 1.0092892700068195, + 1.0776595143210494, + 1.1496747290563842, + 1.2254087788783257, + 1.3049212577331024, + 1.3882553425792685, + 1.475435577785128, + 1.566465618241822, + 1.6613259645430096, + 1.759971728664057, + 1.8623304733655963, + 1.9683001716203616, + 2.077747335059867, + 2.190505359390835, + 2.3063731321596372, + 2.4251139411337257, + 2.546454709346203, + 2.6700855659601612, + 2.795659737741579, + 2.922793714795074, + 3.0510676050945023, + 3.1800255462951963, + 3.3091759899878754, + 3.4379916165586564, + 3.565908580576307, + 3.6923247335652114, + 3.816596430853661, + 3.9380335134419377, + 4.055892079417045, + 4.169364739977908, + 4.2775682159366255, + 4.379528396189977, + 4.474163376905273, + 4.560265554138885, + 4.636484572807698, + 4.701313844906916, + 4.753084420963714, + 4.789971168993392, + 4.810017364939866, + 4.811184720234567, + 4.7914362448121715, + 4.748858702704594, + 4.6818291309403195, + 4.5892251641619755, + 4.4706708229564995, + 4.32679709419049, + 4.15947950720106, + 3.9719933870377084, + 3.7690039935699993, + 3.556289740637753, + 3.3400957091622403, + 3.126057723764027, + 2.917771236192178, + 2.7153853129917733, + 2.5152165648516926, + 2.31247637487, + 2.10648108745, + 1.89866005663, + 1.69067431967, + 1.48441707314, + 1.28203919992, + 1.08595973176, + 0.898849959344, + 0.72357772568, + 0.563097444156, + 0.42027295952, + 0.297626049513, + 0.197015492245, + 0.119272073143, + 0.0638452840596, + 0.0285560561588, + 0.00959020116737, + 0.00189202090221, + 9.49677066949e-05, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 3, + "j": 4, + "angular_momentum": 3 + }, + { + "radial_function": [ + 0.0, + 1.5478417886364964e-09, + 6.297652196071756e-09, + 1.441365408504744e-08, + 2.6066652605298614e-08, + 4.143427787040425e-08, + 6.070123627209462e-08, + 8.405957073198773e-08, + 1.1170893020441659e-07, + 1.4385684875599365e-07, + 1.8071903455204097e-07, + 2.2251966910140888e-07, + 2.6949171711873194e-07, + 3.218772473650905e-07, + 3.799277648697688e-07, + 4.439045549099972e-07, + 5.140790391727355e-07, + 5.907331445225307e-07, + 6.741596848036287e-07, + 7.646627561767657e-07, + 8.625581463325642e-07, + 9.68173758310102e-07, + 1.0818500491438441e-06, + 1.2039404840667218e-06, + 1.3348120067021194e-06, + 1.4748455258395078e-06, + 1.6244364194647815e-06, + 1.783995056334899e-06, + 1.953947336216848e-06, + 2.1347352488554063e-06, + 2.3268174528618955e-06, + 2.53066987479019e-06, + 2.7467863294143062e-06, + 2.9756791617206703e-06, + 3.2178799115524465e-06, + 3.473940001544718e-06, + 3.744431449195522e-06, + 4.029947604108932e-06, + 4.331103910854127e-06, + 4.648538698838851e-06, + 4.982913999854315e-06, + 5.3349163939937425e-06, + 5.705257885782466e-06, + 6.094676810431527e-06, + 6.5039387723405675e-06, + 6.933837616085606e-06, + 7.3851964317373425e-06, + 7.858868595007109e-06, + 8.355738844249024e-06, + 8.876724394875674e-06, + 9.422776092602365e-06, + 9.9948796074861e-06, + 1.0594056669229553e-05, + 1.1221366346175157e-05, + 1.187790636835098e-05, + 1.2564814497391086e-05, + 1.3283269943969358e-05, + 1.4034494834707745e-05, + 1.4819755730482584e-05, + 1.5640365197628648e-05, + 1.6497683433959085e-05, + 1.739311995147855e-05, + 1.8328135318109546e-05, + 1.9304242959719695e-05, + 2.0323011025318098e-05, + 2.1386064317019072e-05, + 2.2495086287587305e-05, + 2.365182110749256e-05, + 2.48580758035414e-05, + 2.6115722472916297e-05, + 2.7426700573312095e-05, + 2.879301929386e-05, + 3.021676000746557e-05, + 3.17000788096121e-05, + 3.324520914485773e-05, + 3.485446452480829e-05, + 3.6530241340706796e-05, + 3.8275021774250136e-05, + 4.0091376808913464e-05, + 4.198196934646721e-05, + 4.394955743214984e-05, + 4.599699759073426e-05, + 4.8127248280520114e-05, + 5.0343373465107095e-05, + 5.264854631120913e-05, + 5.504605301386562e-05, + 5.753929675427461e-05, + 6.0131801797627604e-05, + 6.282721772708586e-05, + 6.562932383487697e-05, + 6.854203365337788e-05, + 7.156939965444075e-05, + 7.471561810671322e-05, + 7.798503409964088e-05, + 8.138214674900405e-05, + 8.491161457050038e-05, + 8.857826105777672e-05, + 9.238708043688314e-05, + 9.63432436244702e-05, + 0.00010045210440315441, + 0.00010471920580138011, + 0.00010915028668671103, + 0.00011375128861065697, + 0.00011852836286609076, + 0.0001234878778062417, + 0.00012863642641085132, + 0.0001339808341105959, + 0.0001395281668921861, + 0.0001452857396714931, + 0.00015126112497347116, + 0.00015746216189389033, + 0.00016389696538652622, + 0.000170573935859452, + 0.00017750176911927241, + 0.00018468946664050264, + 0.0001921463462040789, + 0.00019988205289595337, + 0.0002079065704985581, + 0.00021623023325703522, + 0.00022486373806654067, + 0.00023381815708509312, + 0.0002431049507590225, + 0.0002527359813268682, + 0.00026272352677760865, + 0.00027308029527974194, + 0.00028381944013855076, + 0.00029495457523620854, + 0.00030649979102736216, + 0.0003184696710848343, + 0.00033087930920570305, + 0.00034374432712315663, + 0.00035708089282373407, + 0.00037090573948121746, + 0.0003852361850760389, + 0.00040009015266427404, + 0.00041548619136684773, + 0.0004314434980529806, + 0.0004479819398137964, + 0.0004651220771737783, + 0.0004828851881232447, + 0.0005012932929750795, + 0.0005203691800663304, + 0.0005401364323769001, + 0.0005606194550325745, + 0.0005818435037690833, + 0.0006038347143763845, + 0.0006266201331636385, + 0.0006502277484685563, + 0.0006746865232419802, + 0.000700026428766571, + 0.0007262784795450377, + 0.0007534747693614422, + 0.0007816485086022141, + 0.0008108340628684612, + 0.0008410669928978767, + 0.0008723840958691853, + 0.0009048234481187051, + 0.0009384244493566666, + 0.0009732278683486593, + 0.0010092758902099323, + 0.0010466121653180836, + 0.0010852818598830916, + 0.001125331708282951, + 0.001166810067171104, + 0.001209766971464317, + 0.0012542541922236422, + 0.0013003252965427248, + 0.0013480357094745677, + 0.001397442778107888, + 0.0014486058377882922, + 0.001501586280671901, + 0.0015564476265723202, + 0.0016132555962497703, + 0.0016720781872375684, + 0.0017329857522066338, + 0.0017960510800541694, + 0.0018613494797600704, + 0.0019289588670895472, + 0.0019989598542478845, + 0.0020714358426452742, + 0.0021464731187693007, + 0.0022241609533745483, + 0.002304591704017895, + 0.0023878609211119665, + 0.002474067457578179, + 0.002563313582239429, + 0.0026557050970609183, + 0.0027513514583959145, + 0.002850365902330103, + 0.0029528655743053566, + 0.003058971663115981, + 0.0031688095394931575, + 0.0032825088993549993, + 0.0034002039118800555, + 0.0035220333726997083, + 0.0036481408621438466, + 0.003778674908929056, + 0.003913789159353956, + 0.004053642552158911, + 0.004198399499373205, + 0.0043482300731555465, + 0.00450331019901068, + 0.004663821855443083, + 0.004829953280372142, + 0.005001899184456658, + 0.005179860971515346, + 0.005364046966459689, + 0.0055546726507576, + 0.005751960905747551, + 0.005956142264164173, + 0.006167455170037613, + 0.006386146247121921, + 0.00661247057671125, + 0.006846691983658008, + 0.00708908333312597, + 0.007339926836495416, + 0.0075995143672860505, + 0.007868147787792502, + 0.008146139286654213, + 0.00843381172702861, + 0.008731499006336236, + 0.009039546428505848, + 0.009358311087298373, + 0.009688162262689941, + 0.010029481830607756, + 0.010382664685550175, + 0.010748119176123108, + 0.011126267556768524, + 0.011517546451744421, + 0.011922407335858845, + 0.012341317029486867, + 0.012774758210178505, + 0.013223229940377808, + 0.013687248211858884, + 0.014167346507515085, + 0.014664076381169186, + 0.015178008055194163, + 0.01570973103768339, + 0.016259854758261732, + 0.01682900922431319, + 0.017417845697048986, + 0.018027037389271593, + 0.018657280183651034, + 0.019309293374405755, + 0.01998382043039214, + 0.020681629782562178, + 0.021403515633904146, + 0.02215029879513422, + 0.02292282754486977, + 0.023721978515253386, + 0.02454865760336052, + 0.02540380091151198, + 0.02628837571182525, + 0.027203381442010167, + 0.028149850727443273, + 0.029128850433076666, + 0.030141482746338096, + 0.031188886289379218, + 0.032272237261353254, + 0.033392750615181814, + 0.03455168126284362, + 0.03575032531620887, + 0.036990021359443244, + 0.0382721517549703, + 0.03959814398458232, + 0.040969472023841685, + 0.04238765775270388, + 0.04385427239883796, + 0.04537093802017609, + 0.04693932901908398, + 0.04856117369686103, + 0.05023825583965448, + 0.05197241634460315, + 0.05376555487951101, + 0.05561963157973682, + 0.05753666878045014, + 0.05951875278421372, + 0.0615680356645023, + 0.06368673710320173, + 0.06587714626130228, + 0.06814162368413008, + 0.07048260323833143, + 0.0729025940785845, + 0.07540418264691147, + 0.07799003469481688, + 0.08066289733987726, + 0.08342560113763224, + 0.0862810621837637, + 0.0892322842306355, + 0.09228236082307498, + 0.09543447744690782, + 0.09869191369115039, + 0.10205804541063998, + 0.10553634689632134, + 0.10913039304241971, + 0.11284386150329812, + 0.11668053484238111, + 0.12064430265604913, + 0.12473916367778815, + 0.1289692278451196, + 0.13333871833081554, + 0.13785197351810277, + 0.14251344892433498, + 0.14732771905064318, + 0.15229947915938205, + 0.1574335469514112, + 0.16273486414899976, + 0.1682084979559583, + 0.17385964239030283, + 0.17969361946390497, + 0.18571588020800378, + 0.19193200550460765, + 0.19834770672750499, + 0.20496882615606696, + 0.2118013371435675, + 0.21885134402400655, + 0.22612508172080611, + 0.23362891503659614, + 0.24136933760025445, + 0.2493529704294587, + 0.2575865600862723, + 0.26607697638750255, + 0.2748312096355344, + 0.283856367326128, + 0.2931596703017176, + 0.30274844830096037, + 0.3126301348575416, + 0.3228122615117612, + 0.3333024512651204, + 0.3441084112525576, + 0.3552379245496101, + 0.3666988410790127, + 0.37849906753906654, + 0.39064655630662226, + 0.4031492932387669, + 0.4160152843064486, + 0.42925254099522037, + 0.4428690643968375, + 0.4568728279128205, + 0.4712717584992939, + 0.4860737163729842, + 0.5012864730937268, + 0.516917687944429, + 0.5329748825212398, + 0.5494654134456997, + 0.566396443179029, + 0.5837749086801997, + 0.6016074880619336, + 0.6199005649937758, + 0.6386601908093026, + 0.6578920443005273, + 0.6776013890323095, + 0.6977930282389829, + 0.7184712571189473, + 0.739639812526457, + 0.7613018201038116, + 0.7834597386883847, + 0.8061153020835575, + 0.8292694581390081, + 0.8529223052584644, + 0.8770730262705683, + 0.9017198197978377, + 0.9268598292375058, + 0.9524890694485408, + 0.9786023513803069, + 1.0051932047734675, + 1.0322537992352858, + 1.0597748640961104, + 1.087745607205796, + 1.116153633322626, + 1.1449848624279853, + 1.1742234486389678, + 1.2038517004106266, + 1.233850002633232, + 1.2641967416214865, + 1.2948682339004496, + 1.32583865985079, + 1.3570800034410764, + 1.388561999306656, + 1.4202520887787644, + 1.452115386345846, + 1.4841146584212717, + 1.5162103163762992, + 1.5483604258413448, + 1.5805207347604875, + 1.6126447226369984, + 1.6446836735380903, + 1.6765867759630788, + 1.7083012525509182, + 1.7397725228341092, + 1.7709444027673171, + 1.8017593444077458, + 1.8321587198221485, + 1.862083153039115, + 1.89147290434891, + 1.9202683110260492, + 1.948410288894146, + 1.9758408990105714, + 2.0025039837873626, + 2.0283458767674087, + 2.053316190053614, + 2.077368683247687, + 2.1004622172282548, + 2.122561795808276, + 2.143639697488776, + 2.1636766990251655, + 2.18266339129028, + 2.2006015870580615, + 2.2175058188759205, + 2.2334049236028446, + 2.248343708508665, + 2.262384691649036, + 2.275609906937915, + 2.288122761617745, + 2.3000499309310007, + 2.311543271409303, + 2.322781730648101, + 2.3339732273489284, + 2.345356471255131, + 2.3572026878392096, + 2.3698172078282567, + 2.3835408763837553, + 2.3987512314345585, + 2.41586339511027, + 2.435330616605656, + 2.457644399192175, + 2.4833341386527223, + 2.51296619505857, + 2.547142315090589, + 2.5864973175546737, + 2.6316959512208435, + 2.6834288313444072, + 2.7424073593232543, + 2.8093575296654016, + 2.88501252929474, + 2.9701040369056773, + 3.0653521344158516, + 3.17145374929764, + 3.289069555086495, + 3.4188092688641376, + 3.5612152985272894, + 3.716744710118078, + 3.885749506615913, + 4.068455235466097, + 4.264937974439855, + 4.475099784886697, + 4.69864277217137, + 4.935041958259034, + 5.183517256415695, + 5.443004949608051, + 5.712129223672188, + 5.989174502594927, + 6.272059594930351, + 6.558315000587745, + 6.845065168412917, + 7.129018052819104, + 7.406465004934207, + 7.673294854179002, + 7.925026960608324, + 8.156868984235762, + 8.363805974825647, + 8.54072787128173, + 8.682602146862417, + 8.784696381092584, + 8.842850750662855, + 8.853790889771696, + 8.815454323687403, + 8.727274266214936, + 8.590316330308829, + 8.4070867895613, + 8.180711041373725, + 7.91300170338, + 7.60271346297, + 7.24746746727, + 6.84517702649, + 6.39443406085, + 5.89503552878, + 5.34865015823, + 4.75960099578, + 4.13570057317, + 3.48902243992, + 2.83642331716, + 2.19955179465, + 1.60400412314, + 1.07724859243, + 0.644990785456, + 0.325893721788, + 0.125158043191, + 0.0286742788639, + 0.00170209271727, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 4, + "j": 4, + "angular_momentum": 0 + }, + { + "radial_function": [ + 0.0, + 2.4283986000973666e-20, + 4.019982699984806e-19, + 2.1057898746627424e-18, + 6.8871156310122514e-18, + 1.7401488539140392e-17, + 3.734753388195873e-17, + 7.162113524570749e-17, + 1.2648605840215625e-16, + 2.0976255737650031e-16, + 3.310355925927023e-16, + 5.018844265070298e-16, + 7.361355083253864e-16, + 1.0501407170109743e-15, + 1.4630832019571918e-15, + 1.9973132438523e-15, + 2.67871675605818e-15, + 3.5371192598162075e-15, + 4.606728396028639e-15, + 5.926618284467001e-15, + 7.541259305412976e-15, + 9.50109717104942e-15, + 1.1863185455720173e-14, + 1.469187609418797e-14, + 1.8059572710859515e-14, + 2.204755203120017e-14, + 2.674685904470903e-14, + 3.22592820240211e-14, + 3.869841401022628e-14, + 4.619080785934267e-14, + 5.487723253825677e-14, + 6.491403892510152e-14, + 7.647464404137559e-14, + 8.975114331535226e-14, + 1.0495606124085954e-13, + 1.2232425158185358e-13, + 1.4211495914398177e-13, + 1.6461405607648287e-13, + 1.9013646661997813e-13, + 2.1902879535468443e-13, + 2.516721751027456e-13, + 2.8848535186522176e-13, + 3.2992802561711936e-13, + 3.765044670222732e-13, + 4.2876743188600993e-13, + 4.873223966117254e-13, + 5.528321398794749e-13, + 6.26021697499259e-13, + 7.076837196408278e-13, + 7.986842616322665e-13, + 8.999690419808914e-13, + 1.01257020391577e-12, + 1.1376136192014333e-12, + 1.2763267762440423e-12, + 1.430047297240082e-12, + 1.6002321329857892e-12, + 1.7884674871213033e-12, + 1.9964795257249484e-12, + 2.2261459323499923e-12, + 2.47950837294917e-12, + 2.7587859400247142e-12, + 3.0663896504748485e-12, + 3.404938077281902e-12, + 3.777274200754992e-12, + 4.186483571924398e-12, + 4.63591388706771e-12, + 5.1291960801156385e-12, + 5.6702670472013965e-12, + 6.263394126030812e-12, + 6.913201462636901e-12, + 7.624698406289754e-12, + 8.403310085662053e-12, + 9.254910328437204e-12, + 1.0185857100859947e-11, + 1.1203030654481379e-11, + 1.2313874582487606e-11, + 1.3526440002442038e-11, + 1.484943309844199e-11, + 1.6292266271664423e-11, + 1.7865113168180668e-11, + 1.9578967871673446e-11, + 2.1445708568418414e-11, + 2.3478166018476495e-11, + 2.5690197184827696e-11, + 2.8096764405455132e-11, + 3.0714020514795535e-11, + 3.355940035401295e-11, + 3.665171914420342e-11, + 4.0011278217560935e-11, + 4.365997866730782e-11, + 4.762144347055906e-11, + 5.192114873579689e-11, + 5.6586564724181823e-11, + 6.164730736443598e-11, + 6.713530104418324e-11, + 7.308495347220501e-11, + 7.953334354391383e-11, + 8.652042310289918e-11, + 9.408923364695522e-11, + 1.022861390840879e-10, + 1.1116107567166851e-10, + 1.207678203902827e-10, + 1.3116427916126712e-10, + 1.4241279625087888e-10, + 1.5458048649197397e-10, + 1.6773959193087588e-10, + 1.8196786467685827e-10, + 1.973489778920505e-10, + 2.1397296690434455e-10, + 2.319367027091298e-10, + 2.5134440010601544e-10, + 2.723081630776818e-10, + 2.9494857002337947e-10, + 3.1939530182190894e-10, + 3.457878157045062e-10, + 3.7427606835957655e-10, + 4.0502129174992516e-10, + 4.3819682552687964e-10, + 4.739890099995088e-10, + 5.125981441596009e-10, + 5.54239513420023e-10, + 5.991444919595422e-10, + 6.475617252859698e-10, + 6.997583986104074e-10, + 7.560215971990168e-10, + 8.166597655408306e-10, + 8.820042720970624e-10, + 9.524110875236538e-10, + 1.028262584393318e-09, + 1.1099694670831686e-09, + 1.1979728413390946e-09, + 1.2927464334122293e-09, + 1.3947989694179992e-09, + 1.504676726754535e-09, + 1.6229662694904732e-09, + 1.750297381266019e-09, + 1.8873462094548627e-09, + 2.034838636315291e-09, + 2.1935538927203244e-09, + 2.364328432321249e-09, + 2.5480600845722048e-09, + 2.7457125064763167e-09, + 2.958319954863594e-09, + 3.1869924014655998e-09, + 3.4329210157571964e-09, + 3.697384041712753e-09, + 3.981753096707335e-09, + 4.287499922586545e-09, + 4.6162036211155505e-09, + 4.969558408673673e-09, + 5.34938192724584e-09, + 5.7576241508840835e-09, + 6.1963769307715596e-09, + 6.667884224318308e-09, + 7.174553056662202e-09, + 7.718965267233222e-09, + 8.303890097064054e-09, + 8.932297677496102e-09, + 9.607373482960595e-09, + 1.0332533818304828e-08, + 1.1111442413508683e-08, + 1.1948028204297989e-08, + 1.2846504384198887e-08, + 1.3811388817447512e-08, + 1.4847525910723303e-08, + 1.5960110046391128e-08, + 1.7154710689586e-08, + 1.8437299287398263e-08, + 1.981427808881747e-08, + 2.1292511020013986e-08, + 2.2879356764407636e-08, + 2.4582704201089444e-08, + 2.6411010371372332e-08, + 2.837334115387696e-08, + 3.047941483806687e-08, + 3.273964880567653e-08, + 3.5165209539621524e-08, + 3.776806619648062e-08, + 4.0561047996284414e-08, + 4.355790570351213e-08, + 4.6773377486071024e-08, + 5.02232594678799e-08, + 5.3924481305470877e-08, + 5.7895187148539906e-08, + 6.215482236582e-08, + 6.672422644727168e-08, + 7.162573252112625e-08, + 7.68832739578229e-08, + 8.25224985629166e-08, + 8.857089090128254e-08, + 9.505790332837932e-08, + 1.0201509635232815e-07, + 1.0947628898640046e-07, + 1.1747771980273093e-07, + 1.2605821945824912e-07, + 1.3525939549366153e-07, + 1.4512583029444257e-07, + 1.5570529314337963e-07, + 1.6704896736594837e-07, + 1.792116936545013e-07, + 1.9225223070862724e-07, + 2.0623353444087776e-07, + 2.2122305705863174e-07, + 2.3729306744907412e-07, + 2.5452099437993635e-07, + 2.7298979413882966e-07, + 2.9278834437364025e-07, + 3.140118659810274e-07, + 3.3676237505179955e-07, + 3.611491670317385e-07, + 3.8728933538805935e-07, + 4.1530832723164175e-07, + 4.453405386118317e-07, + 4.775299521252563e-07, + 5.120308201645309e-07, + 5.490083968201426e-07, + 5.886397219874641e-07, + 6.311144614745132e-07, + 6.766358071119331e-07, + 7.254214410552843e-07, + 7.777045689787389e-07, + 8.337350272116312e-07, + 8.937804688052719e-07, + 9.581276344809125e-07, + 1.0270837145560791e-06, + 1.1009778082216735e-06, + 1.1801624870751089e-06, + 1.2650154710353207e-06, + 1.355941423782737e-06, + 1.453373877240848e-06, + 1.5577772937397169e-06, + 1.6696492762343224e-06, + 1.789522937044481e-06, + 1.917969436598932e-06, + 2.0556007045181507e-06, + 2.203072356288417e-06, + 2.361086819484017e-06, + 2.5303966851002757e-06, + 2.711808299892845e-06, + 2.906185617619233e-06, + 3.114454327633932e-06, + 3.337606281469658e-06, + 3.5767042384834084e-06, + 3.83288695469281e-06, + 4.107374638876923e-06, + 4.401474803706544e-06, + 4.716588539782612e-06, + 5.054217244678316e-06, + 5.415969839556708e-06, + 5.803570509290211e-06, + 6.2188670044001486e-06, + 6.6638395474468065e-06, + 7.140610385702837e-06, + 7.651454041123243e-06, + 8.198808306158226e-06, + 8.785286042149358e-06, + 9.413687840180156e-06, + 1.0087015607036254e-05, + 1.0808487144965584e-05, + 1.15815518018104e-05, + 1.2409907266904233e-05, + 1.3297517602710614e-05, + 1.4248632601475413e-05, + 1.526780856713961e-05, + 1.635993063037789e-05, + 1.753023671015514e-05, + 1.8784343247868488e-05, + 2.012827284436384e-05, + 2.156848394921616e-05, + 2.3111902750380037e-05, + 2.4765957439215696e-05, + 2.6538615022450826e-05, + 2.8438420883893385e-05, + 3.047454129874031e-05, + 3.265680913022218e-05, + 3.499577295055345e-05, + 3.75027498492854e-05, + 4.0189882214033114e-05, + 4.307019878803322e-05, + 4.615768033463706e-05, + 4.946733026846148e-05, + 5.301525063617499e-05, + 5.6818723861464364e-05, + 6.0896300710097916e-05, + 6.526789494770696e-05, + 6.995488523660921e-05, + 7.498022481059373e-05, + 8.036855956966017e-05, + 8.614635523465007e-05, + 9.234203429188567e-05, + 9.898612349705478e-05, + 0.0001061114127862122, + 0.00011375312648156108, + 0.00012194910779793997, + 0.00013074001770081178, + 0.00014016954926053155, + 0.00015028465876813465, + 0.00016113581493450922, + 0.00017277726766442783, + 0.00018526733796179944, + 0.00019866873070697986, + 0.00021304887213022096, + 0.00022848027403568272, + 0.0002450409269209747, + 0.0002628147243994068, + 0.000281891921435362, + 0.0003023696292375896, + 0.0003243523497754192, + 0.0003479525532254363, + 0.00037329130185794244, + 0.0004004989242777922, + 0.00042971574410247435, + 0.0004610928677072931, + 0.0004947930358837378, + 0.0005309915447582655, + 0.0005698772417991697, + 0.0006116536031339763, + 0.0006565398990207714, + 0.000704772454899507, + 0.0007566060159826233, + 0.0008123152241499596, + 0.00087219621657531, + 0.0009365683563521967, + 0.0010057761062071623, + 0.0010801910574366048, + 0.0011602141271186055, + 0.0012462779377842923, + 0.0013388493950478582, + 0.001438432479729897, + 0.0015455712728270118, + 0.001660853232713501, + 0.0017849127460604808, + 0.001918434975358305, + 0.0020621600281806912, + 0.0022168874751333605, + 0.0023834812457757095, + 0.0025628749342773687, + 0.0027560775490616104, + 0.0029641797434583964, + 0.0031883605675343536, + 0.0034298947844026537, + 0.0036901607977236827, + 0.003970649240922566, + 0.0042729722825058615, + 0.004598873706074084, + 0.004950239829584329, + 0.005329111328463207, + 0.0057376960404941476, + 0.006178382827919915, + 0.006653756581833829, + 0.007166614460996459, + 0.007719983459899653, + 0.008317139413455178, + 0.008961627546309872, + 0.009657284686678565, + 0.010408263274242973, + 0.011219057292849789, + 0.012094530274715558, + 0.0130399455265152, + 0.01406099874257752, + 0.015163853171870183, + 0.01635517752136888, + 0.017642186786502083, + 0.01903268620631201, + 0.02053511855559611, + 0.022158614988023788, + 0.023913049659159864, + 0.025809098371564865, + 0.027858301472173653, + 0.0300731312662406, + 0.03246706419259389, + 0.035054658026612465, + 0.03785163437747823, + 0.040874966730171804, + 0.044142974305693514, + 0.04767542199210449, + 0.0514936265934798, + 0.055620569636677795, + 0.060081016946760595, + 0.06490164520663234, + 0.07011117565432785, + 0.07574051506804111, + 0.08182290414073942, + 0.08839407327212027, + 0.0954924058023426, + 0.10315910861011865, + 0.11143838989894503, + 0.12037764398686043, + 0.13002764275128534, + 0.1404427332653789, + 0.15168104114567013, + 0.16380467883848843, + 0.1768799580909516, + 0.19097760555989765, + 0.20617298047894722, + 0.22254629299281406, + 0.24018282170129704, + 0.2591731286938667, + 0.2796132701928136, + 0.30160500073365926, + 0.3252559685792275, + 0.35067989997923893, + 0.37799676957968037, + 0.4073329543132123, + 0.4388213677580099, + 0.4726015721803238, + 0.5088198650500664, + 0.5476293371602436, + 0.5891898994061038, + 0.6336682752779679, + 0.681237956568435, + 0.7320791198264371, + 0.7863785015628428, + 0.8443292303694399, + 0.9061306147926534, + 0.971987885881658, + 1.0421118941020093, + 1.1167187599713335, + 1.1960294786795336, + 1.2802694778798678, + 1.36966812810875, + 1.4644582034809839, + 1.5648752888403332, + 1.6711571265587153, + 1.7835428920379035, + 1.9022723812691777, + 2.0275850865541116, + 2.1597191261495503, + 2.298909982074043, + 2.4453889839810876, + 2.5993814591813615, + 2.761104446808884, + 2.9307638480462432, + 3.1085508563321977, + 3.2946374796286957, + 3.4891709340420687, + 3.6922666549626517, + 3.9039996423348606, + 4.124393832384192, + 4.3534091763496, + 4.590926112171971, + 4.836727147136946, + 5.090475337575552, + 5.351689568497578, + 5.619716715842021, + 5.893701030236734, + 6.172551431320388, + 6.454907858509319, + 6.739108397524885, + 7.023159593370056, + 7.304713160014113, + 7.581053168239072, + 7.849098676611246, + 8.105427554920277, + 8.346327774451868, + 8.56788246519596, + 8.766094241877745, + 8.93705225995385, + 9.077141662051078, + 9.18328894617746, + 9.253227771831689, + 9.285757455597162, + 9.280951018600634, + 9.240252293141733, + 9.166385360601575, + 9.062990959007983, + 8.933915673929445, + 8.782132301015546, + 8.608400357963621, + 8.410044584307846, + 8.180733317632146, + 7.91300170338, + 7.60271346297, + 7.24746746727, + 6.84517702649, + 6.39443406085, + 5.89503552878, + 5.34865015823, + 4.75960099578, + 4.13570057317, + 3.48902243992, + 2.83642331716, + 2.19955179465, + 1.60400412314, + 1.07724859243, + 0.644990785456, + 0.325893721788, + 0.125158043191, + 0.0286742788639, + 0.00170209271727, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 4, + "j": 4, + "angular_momentum": 2 + }, + { + "radial_function": [ + 0.0, + 7.785694833523783e-30, + 5.2438914312192605e-28, + 6.2869493755019865e-27, + 3.718548694575937e-26, + 1.4934717339296834e-25, + 4.695807642509424e-25, + 1.2470365975681483e-24, + 2.9267213853354183e-24, + 6.2504219853649725e-24, + 1.2391657857533867e-23, + 2.3132520055439045e-23, + 4.1091690448259043e-23, + 7.001459684446618e-23, + 1.151385800685915e-22, + 1.8364816432987387e-22, + 2.852380738411797e-22, + 4.328045733875097e-22, + 6.43289081338622e-22, + 9.38701870495319e-22, + 1.3473581019452496e-21, + 1.905363508375407e-21, + 2.658392837788121e-21, + 3.663810789343046e-21, + 4.993192723739242e-21, + 6.7353110388175156e-21, + 8.99966290516027e-21, + 1.1920626204924358e-20, + 1.5662343209500304e-20, + 2.042444592234213e-20, + 2.6448753385937305e-20, + 3.402708978653534e-20, + 4.351039323783428e-20, + 5.531930893742299e-20, + 6.995648737858602e-20, + 8.802083881044783e-20, + 1.1022402966026897e-19, + 1.374095456598182e-19, + 1.705746904331909e-19, + 2.108959381278286e-19, + 2.597581147557148e-19, + 3.1878794620004644e-19, + 3.898925823993931e-19, + 4.753037873742004e-19, + 5.776285757071939e-19, + 6.999071777719524e-19, + 8.45679331125214e-19, + 1.0190600243102713e-18, + 1.2248259649899303e-18, + 1.468514207169247e-18, + 1.7565345559279093e-18, + 2.0962975745375428e-18, + 2.496360249563502e-18, + 2.9665916303701076e-18, + 3.5183610498185116e-18, + 4.164751861676691e-18, + 4.920803995716126e-18, + 5.8037890436646504e-18, + 6.8335220504650244e-18, + 8.032714701588092e-18, + 9.427375176429263e-18, + 1.104726058616894e-17, + 1.2926388641341709e-17, + 1.510361600526577e-17, + 1.762329170183773e-17, + 2.053599496171158e-17, + 2.3899368032088166e-17, + 2.7779055746896515e-17, + 3.22497650776208e-17, + 3.739645948322703e-17, + 4.331570464622951e-17, + 5.01171841847425e-17, + 5.792540613582758e-17, + 6.688162350639902e-17, + 7.714599494239913e-17, + 8.89000146734231e-17, + 1.0234924434322726e-16, + 1.177263831978998e-16, + 1.3529471739731823e-16, + 1.553519940381886e-16, + 1.782347708302055e-16, + 2.0432329832913433e-16, + 2.3404699835504246e-16, + 2.6789060957762715e-16, + 3.0640107964661587e-16, + 3.501952924050725e-16, + 3.9996872907594737e-16, + 4.565051738568129e-16, + 5.206875869255105e-16, + 5.935102826546974e-16, + 6.760925658839481e-16, + 7.696939978486111e-16, + 8.757314821935899e-16, + 9.957983838640034e-16, + 1.1316859184341941e-15, + 1.285407075638017e-15, + 1.4592233730874788e-15, + 1.6556747674003153e-15, + 1.8776130896433165e-15, + 2.128239413615011e-15, + 2.4111458105599407e-15, + 2.7303619965077874e-15, + 3.0904074384092597e-15, + 3.4963495441297986e-15, + 3.9538686386503986e-15, + 4.469330503851e-15, + 5.049867349059899e-15, + 5.7034681791685776e-15, + 6.43907963262869e-15, + 7.266718488683686e-15, + 8.197597170704974e-15, + 9.244263730942773e-15, + 1.0420757961068136e-14, + 1.1742785466412189e-14, + 1.3227911737941191e-14, + 1.4895778496315708e-14, + 1.6768344827870852e-14, + 1.8870155923692494e-14, + 2.1228642535633894e-14, + 2.3874454627576624e-14, + 2.6841833079831402e-14, + 3.0169023727904025e-14, + 3.3898738521313913e-14, + 3.807866909295294e-14, + 4.276205863042369e-14, + 4.800833861744657e-14, + 5.3883837698681365e-14, + 6.046257078156683e-14, + 6.782711735610317e-14, + 7.606959901535547e-14, + 8.529276729063227e-14, + 9.561121412077978e-14, + 1.0715271864353131e-13, + 1.200597455625636e-13, + 1.3449111194874042e-13, + 1.5062384128820265e-13, + 1.6865522558125256e-13, + 1.8880511872181413e-13, + 2.1131848679407414e-13, + 2.36468243903369e-13, + 2.645584052272959e-13, + 2.9592759248064703e-13, + 3.3095293095472327e-13, + 3.700543814360686e-13, + 4.1369955525408105e-13, + 4.624090659279413e-13, + 5.167624768052707e-13, + 5.774049105792009e-13, + 6.450543938190356e-13, + 7.205100177618283e-13, + 8.04661005486219e-13, + 8.984967853653402e-13, + 1.0031181819130501e-12, + 1.1197498471723435e-12, + 1.2497540692180141e-12, + 1.3946461095177797e-12, + 1.5561112373493819e-12, + 1.7360236481669706e-12, + 1.9364674726361213e-12, + 2.1597601066076897e-12, + 2.4084781167727566e-12, + 2.6854860046964732e-12, + 2.9939681433092064e-12, + 3.337464233549179e-12, + 3.7199086675601995e-12, + 4.145674226269705e-12, + 4.619620586714201e-12, + 5.147148165611074e-12, + 5.734257883892079e-12, + 6.387617499354907e-12, + 7.11463522738694e-12, + 7.923541445408963e-12, + 8.823479365647959e-12, + 9.824605656699036e-12, + 1.0938202099403297e-11, + 1.2176799483744711e-11, + 1.3554315082503455e-11, + 1.5086205183079762e-11, + 1.6789634320494078e-11, + 1.868366303464957e-11, + 2.078945616913974e-11, + 2.3130513953314283e-11, + 2.573292834815014e-11, + 2.862566740984539e-11, + 3.184089072144268e-11, + 3.541429927572617e-11, + 3.938552355871874e-11, + 4.3798553991877195e-11, + 4.870221833948369e-11, + 5.415071119121421e-11, + 6.02041811797878e-11, + 6.69293822136777e-11, + 7.440039567806039e-11, + 8.269943131437783e-11, + 9.191771533492375e-11, + 1.0215647523018482e-10, + 1.1352803178349783e-10, + 1.2615700992314554e-10, + 1.4018168130636912e-10, + 1.5575545294267705e-10, + 1.730485176811582e-10, + 1.922496841375419e-10, + 2.1356840550424798e-10, + 2.372370288204683e-10, + 2.635132885924078e-10, + 2.926830712395421e-10, + 3.2506347974422764e-10, + 3.610062309956284e-10, + 4.0090142187623753e-10, + 4.4518170405088904e-10, + 4.943269117001992e-10, + 5.488691912102629e-10, + 6.093986873073185e-10, + 6.765698454793382e-10, + 7.511083979812641e-10, + 8.338191068941458e-10, + 9.255943462719092e-10, + 1.0274236142791177e-09, + 1.1404040759067882e-09, + 1.265752247454162e-09, + 1.404816946464027e-09, + 1.559093644254298e-09, + 1.7302403718327289e-09, + 1.9200953478534475e-09, + 2.1306965147990187e-09, + 2.36430318914517e-09, + 2.6234200535895565e-09, + 2.9108237464423872e-09, + 3.2295923257225176e-09, + 3.583137921506785e-09, + 3.975242918712939e-09, + 4.4101000532008e-09, + 4.892356843094343e-09, + 5.427164823619363e-09, + 6.0202341043724135e-09, + 6.677893824050738e-09, + 7.407159138544011e-09, + 8.215805449506405e-09, + 9.112450653194536e-09, + 1.0106646277319729e-08, + 1.1208978463682846e-08, + 1.2431179861825492e-08, + 1.3786253608276208e-08, + 1.5288610700755258e-08, + 1.6954222207885614e-08, + 1.8800787921189394e-08, + 2.0847923218081772e-08, + 2.3117366108542602e-08, + 2.5633206639324542e-08, + 2.8422141069686658e-08, + 3.151375349120141e-08, + 3.494082786367913e-08, + 3.8739693730164476e-08, + 4.295060927165048e-08, + 4.7618185709232935e-08, + 5.2791857528840294e-08, + 5.852640347934951e-08, + 6.488252381375354e-08, + 7.192747984351927e-08, + 7.973580255896154e-08, + 8.839007772984946e-08, + 9.798181578748854e-08, + 1.0861241561153186e-07, + 1.2039423237095462e-07, + 1.3345176066703318e-07, + 1.4792294540966204e-07, + 1.6396063424773852e-07, + 1.8173418680054187e-07, + 2.0143125769986328e-07, + 2.2325977212504755e-07, + 2.474501147376892e-07, + 2.742575549493962e-07, + 3.0396493418844734e-07, + 3.368856433801545e-07, + 3.733669220689659e-07, + 4.1379351392452655e-07, + 4.58591717164392e-07, + 5.082338726187338e-07, + 5.632433367345069e-07, + 6.241999919603897e-07, + 6.917463527016467e-07, + 7.665943312362295e-07, + 8.495327349700177e-07, + 9.414355743233508e-07, + 1.0432712687004965e-06, + 1.1561128482737704e-06, + 1.2811492587376199e-06, + 1.419697889194035e-06, + 1.5732184550874277e-06, + 1.7433283833396395e-06, + 1.931819862309814e-06, + 2.140678737289561e-06, + 2.372105451022911e-06, + 2.628538251708529e-06, + 2.9126789140500114e-06, + 3.227521245763879e-06, + 3.576382682427225e-06, + 3.962939304900689e-06, + 4.391264651920835e-06, + 4.865872738976051e-06, + 5.3917657412595935e-06, + 5.974486846010182e-06, + 6.6201788375372696e-06, + 7.335649036394624e-06, + 8.128441285188072e-06, + 9.006915744744716e-06, + 9.98033735292619e-06, + 1.1058973886006109e-05, + 1.2254204669132169e-05, + 1.3578641092790585e-05, + 1.5046260223788557e-05, + 1.6672552931390055e-05, + 1.847468811467973e-05, + 2.0471694780947846e-05, + 2.2684663920372243e-05, + 2.513697233635673e-05, + 2.78545308204119e-05, + 3.086605932647231e-05, + 3.420339208966248e-05, + 3.790181594916053e-05, + 4.2000445498896424e-05, + 4.6542639079612075e-05, + 5.1576460066168805e-05, + 5.715518838559486e-05, + 6.333788774760127e-05, + 7.019003465792103e-05, + 7.778421594763232e-05, + 8.620090229486042e-05, + 9.552930600469985e-05, + 0.00010586833225010195, + 0.00011732763393017667, + 0.00013002878144892485, + 0.0001441065599058488, + 0.0001597104075777051, + 0.00017700601104479738, + 0.00019617707398628445, + 0.00021742727851455513, + 0.00024098245994075423, + 0.0002670930181083364, + 0.0002960365909342831, + 0.00032812101853524513, + 0.0003636876293434622, + 0.00040311488298204305, + 0.0004468224083529426, + 0.0004952754794649068, + 0.0005489899762454854, + 0.0006085378818225437, + 0.0006745533744409173, + 0.0007477395770164259, + 0.0008288760344881605, + 0.0009188269965773502, + 0.00101855059090006, + 0.0011291089811149846, + 0.0012516796132474824, + 0.0013875676645665413, + 0.0015382198212821796, + 0.001705239522536279, + 0.0018904038232675751, + 0.002095682042455916, + 0.002323256380693468, + 0.002575544707015308, + 0.0028552257353732097, + 0.003165266831561774, + 0.003508954713109797, + 0.003889929329911218, + 0.004312221237361424, + 0.004780292802798048, + 0.00529908361695327, + 0.005874060508243234, + 0.0065112725981162824, + 0.007217411863917968, + 0.007999879717072477, + 0.00886686014216924, + 0.009827399976949267, + 0.010891496961120248, + 0.01207019621837527, + 0.01337569587789166, + 0.0148214625839092, + 0.01642235767701988, + 0.018194774877015457, + 0.020156790318658895, + 0.022328325831059738, + 0.02473132637146502, + 0.027389952527999507, + 0.03033078902990256, + 0.03358307018085677, + 0.037178923094367065, + 0.04115362959702183, + 0.04554590756955098, + 0.050398212394061254, + 0.055757059094024244, + 0.06167336551402815, + 0.06820281674985572, + 0.07540625071488695, + 0.08335006447629742, + 0.09210664054744644, + 0.10175479193028368, + 0.11238022413713214, + 0.12407601182307264, + 0.13694308695865737, + 0.15109073464654763, + 0.16663709183952294, + 0.18370964312974297, + 0.20244570677481005, + 0.22299290278203748, + 0.24550959377207857, + 0.2701652877276371, + 0.2971409905181346, + 0.3266294945545212, + 0.3588355883954818, + 0.39397617092551995, + 0.4322802523184536, + 0.4739888230595369, + 0.5193545713840815, + 0.5686414293423395, + 0.6221239276172814, + 0.6800863403668188, + 0.7428216025138329, + 0.8106299851678037, + 0.8838175178551669, + 0.9626941519454703, + 1.0475716655013092, + 1.1387613180261975, + 1.236571272883654, + 1.3413038159589106, + 1.453252411135351, + 1.572698646298484, + 1.6999091361371395, + 1.8351324612117046, + 1.978596232261364, + 2.1305043762859412, + 2.2910347420160257, + 2.4603371145877047, + 2.6385317112807742, + 2.825708195977426, + 3.021925197382118, + 3.2272102397490547, + 3.441559892300481, + 3.6649398095013526, + 3.897284169479219, + 4.138493821169827, + 4.388432228294502, + 4.646918059898194, + 4.9137130419859085, + 5.188503482380156, + 5.47087375177086, + 5.760270008386249, + 6.0559526665495556, + 6.3569366252239154, + 6.661919201958038, + 6.969197183563516, + 7.276576521115423, + 7.5812810589130075, + 7.879870316066759, + 8.168180644673695, + 8.441308771082266, + 8.69366118266458, + 8.91909601196109, + 9.111184359202404, + 9.2636130419698, + 9.37073743874724, + 9.428267644552657, + 9.434029728339668, + 9.388683877687717, + 9.29620406671312, + 9.163840332479626, + 9.001224371188394, + 8.81830694538041, + 8.622059930083928, + 8.412575003504829, + 8.180768881370227, + 7.91300170338, + 7.60271346297, + 7.24746746727, + 6.84517702649, + 6.39443406085, + 5.89503552878, + 5.34865015823, + 4.75960099578, + 4.13570057317, + 3.48902243992, + 2.83642331716, + 2.19955179465, + 1.60400412314, + 1.07724859243, + 0.644990785456, + 0.325893721788, + 0.125158043191, + 0.0286742788639, + 0.00170209271727, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "i": 4, + "j": 4, + "angular_momentum": 4 + } + ], + "atomic_wave_functions": [ + { + "label": "2S", + "angular_momentum": 0, + "occupation": 2.0, + "radial_function": [ + 0.0, + 1.02525064311e-05, + 2.0680265148e-05, + 3.12862718442e-05, + 4.20735734184e-05, + 5.30452688519e-05, + 6.42045100982e-05, + 7.55545029894e-05, + 8.70985081563e-05, + 9.88398419656e-05, + 0.000110781877472, + 0.000122928045389, + 0.000135281835072, + 0.000147846795522, + 0.000160626536405, + 0.000173624729089, + 0.000186845107698, + 0.000200291470187, + 0.00021396767943, + 0.000227877664333, + 0.000242025420957, + 0.000256415013673, + 0.000271050576326, + 0.000285936313423, + 0.000301076501339, + 0.000316475489548, + 0.000332137701873, + 0.000348067637755, + 0.000364269873544, + 0.00038074906382, + 0.000397509942721, + 0.000414557325311, + 0.00043189610896, + 0.00044953127475, + 0.000467467888908, + 0.000485711104258, + 0.000504266161705, + 0.000523138391741, + 0.00054233321597, + 0.000561856148674, + 0.000581712798391, + 0.000601908869526, + 0.000622450163995, + 0.000643342582888, + 0.000664592128161, + 0.000686204904369, + 0.00070818712041, + 0.000730545091315, + 0.000753285240059, + 0.000776414099407, + 0.000799938313792, + 0.000823864641221, + 0.000848199955218, + 0.000872951246799, + 0.000898125626477, + 0.000923730326308, + 0.000949772701969, + 0.000976260234867, + 0.00100320053429, + 0.0010306013396, + 0.00105847052244, + 0.001086816089, + 0.00111564618234, + 0.00114496908469, + 0.00117479321987, + 0.00120512715567, + 0.00123597960635, + 0.00126735943509, + 0.0012992756566, + 0.00133173743967, + 0.00136475410982, + 0.00139833515194, + 0.00143249021308, + 0.00146722910518, + 0.00150256180787, + 0.00153849847138, + 0.00157504941945, + 0.00161222515225, + 0.00165003634946, + 0.00168849387327, + 0.00172760877156, + 0.00176739228104, + 0.00180785583049, + 0.00184901104404, + 0.00189086974449, + 0.00193344395675, + 0.00197674591123, + 0.00202078804741, + 0.0020655830174, + 0.00211114368954, + 0.00215748315215, + 0.00220461471723, + 0.00225255192433, + 0.00230130854442, + 0.00235089858384, + 0.00240133628832, + 0.00245263614711, + 0.00250481289707, + 0.00255788152697, + 0.00261185728176, + 0.00266675566695, + 0.00272259245306, + 0.00277938368018, + 0.00283714566252, + 0.00289589499314, + 0.0029556485487, + 0.00301642349431, + 0.00307823728845, + 0.00314110768798, + 0.00320505275326, + 0.0032700908533, + 0.00333624067109, + 0.00340352120888, + 0.00347195179374, + 0.00354155208299, + 0.00361234206996, + 0.00368434208965, + 0.00375757282459, + 0.00383205531079, + 0.00390781094376, + 0.00398486148467, + 0.00406322906657, + 0.00414293620077, + 0.0042240057833, + 0.00430646110143, + 0.00439032584045, + 0.00447562409037, + 0.00456238035289, + 0.0046506195484, + 0.00474036702319, + 0.00483164855662, + 0.00492449036862, + 0.00501891912716, + 0.0051149619559, + 0.00521264644198, + 0.00531200064397, + 0.00541305309984, + 0.00551583283523, + 0.0056203693717, + 0.00572669273527, + 0.00583483346496, + 0.00594482262163, + 0.0060566917968, + 0.00617047312177, + 0.0062861992768, + 0.00640390350052, + 0.0065236195994, + 0.00664538195749, + 0.00676922554626, + 0.00689518593463, + 0.00702329929913, + 0.00715360243434, + 0.00728613276335, + 0.00742092834855, + 0.00755802790248, + 0.00769747079897, + 0.0078392970844, + 0.00798354748914, + 0.00813026343927, + 0.00827948706839, + 0.00843126122973, + 0.00858562950839, + 0.00874263623382, + 0.00890232649251, + 0.0090647461409, + 0.00922994181851, + 0.00939796096124, + 0.00956885181501, + 0.00974266344949, + 0.00991944577217, + 0.0100992495427, + 0.0102821263871, + 0.0104681288131, + 0.0106573102244, + 0.0108497249367, + 0.0110454281925, + 0.0112444761774, + 0.011446926036, + 0.0116528358881, + 0.0118622648453, + 0.0120752730281, + 0.0122919215828, + 0.012512272699, + 0.0127363896275, + 0.012964336698, + 0.0131961793378, + 0.0134319840903, + 0.0136718186339, + 0.0139157518013, + 0.0141638535991, + 0.0144161952278, + 0.0146728491019, + 0.0149338888708, + 0.0151993894393, + 0.0154694269894, + 0.0157440790013, + 0.0160234242761, + 0.0163075429577, + 0.0165965165558, + 0.0168904279689, + 0.0171893615077, + 0.0174934029193, + 0.0178026394112, + 0.018117159676, + 0.0184370539169, + 0.0187624138727, + 0.0190933328439, + 0.0194299057193, + 0.0197722290025, + 0.0201204008391, + 0.0204745210449, + 0.0208346911332, + 0.0212010143442, + 0.0215735956734, + 0.0219525419017, + 0.022337961625, + 0.0227299652848, + 0.0231286651993, + 0.0235341755948, + 0.0239466126377, + 0.0243660944671, + 0.0247927412277, + 0.0252266751034, + 0.0256680203514, + 0.0261169033371, + 0.0265734525688, + 0.0270377987339, + 0.0275100747349, + 0.0279904157265, + 0.028478959153, + 0.0289758447863, + 0.0294812147647, + 0.0299952136319, + 0.0305179883772, + 0.0310496884756, + 0.0315904659293, + 0.0321404753088, + 0.0326998737962, + 0.0332688212273, + 0.0338474801357, + 0.0344360157973, + 0.0350345962747, + 0.0356433924634, + 0.0362625781378, + 0.0368923299983, + 0.0375328277192, + 0.0381842539965, + 0.0388467945978, + 0.0395206384115, + 0.0402059774975, + 0.0409030071384, + 0.0416119258915, + 0.0423329356413, + 0.0430662416532, + 0.0438120526272, + 0.0445705807531, + 0.045342041766, + 0.0461266550026, + 0.0469246434583, + 0.0477362338449, + 0.0485616566494, + 0.049401146193, + 0.0502549406914, + 0.0511232823156, + 0.052006417253, + 0.0529045957701, + 0.0538180722755, + 0.0547471053832, + 0.0556919579774, + 0.0566528972774, + 0.0576301949037, + 0.0586241269444, + 0.0596349740224, + 0.0606630213634, + 0.0617085588644, + 0.0627718811628, + 0.0638532877067, + 0.0649530828248, + 0.0660715757977, + 0.0672090809295, + 0.0683659176203, + 0.0695424104382, + 0.070738889193, + 0.0719556890099, + 0.0731931504031, + 0.0744516193511, + 0.0757314473706, + 0.0770329915923, + 0.0783566148362, + 0.0797026856872, + 0.081071578571, + 0.0824636738301, + 0.0838793577996, + 0.0853190228836, + 0.0867830676308, + 0.0882718968105, + 0.0897859214885, + 0.0913255591018, + 0.092891233534, + 0.0944833751897, + 0.0961024210684, + 0.0977488148376, + 0.0994230069053, + 0.101125454492, + 0.1028566217, + 0.104616979584, + 0.106407006219, + 0.108227186767, + 0.110078013541, + 0.111959986068, + 0.113873611154, + 0.115819402938, + 0.117797882953, + 0.119809580177, + 0.121855031086, + 0.123934779706, + 0.12604937765, + 0.12819938417, + 0.130385366185, + 0.132607898324, + 0.13486756295, + 0.137164950185, + 0.139500657934, + 0.141875291894, + 0.144289465569, + 0.146743800266, + 0.149238925097, + 0.151775476962, + 0.154354100538, + 0.156975448244, + 0.159640180213, + 0.162348964245, + 0.165102475752, + 0.167901397699, + 0.170746420523, + 0.173638242054, + 0.17657756741, + 0.17956510889, + 0.182601585849, + 0.185687724558, + 0.188824258049, + 0.192011925944, + 0.19525147427, + 0.19854365525, + 0.201889227078, + 0.205288953679, + 0.208743604434, + 0.212253953901, + 0.215820781494, + 0.219444871153, + 0.223127010974, + 0.226867992823, + 0.230668611915, + 0.234529666359, + 0.238451956683, + 0.242436285308, + 0.246483456005, + 0.250594273297, + 0.254769541836, + 0.259010065731, + 0.263316647834, + 0.267690088985, + 0.272131187199, + 0.27664073682, + 0.281219527602, + 0.285868343756, + 0.290587962924, + 0.295379155102, + 0.300242681497, + 0.305179293319, + 0.310189730505, + 0.315274720369, + 0.320434976187, + 0.325671195685, + 0.330984059471, + 0.336374229356, + 0.34184234661, + 0.34738903011, + 0.353014874399, + 0.358720447647, + 0.364506289502, + 0.370372908843, + 0.37632078141, + 0.382350347329, + 0.388462008511, + 0.394656125925, + 0.40093301675, + 0.407292951383, + 0.413736150318, + 0.420262780879, + 0.426872953808, + 0.433566719694, + 0.440344065259, + 0.447204909476, + 0.454149099518, + 0.461176406545, + 0.46828652132, + 0.475479049633, + 0.482753507561, + 0.490109316532, + 0.4975457982, + 0.505062169137, + 0.512657535317, + 0.520330886415, + 0.528081089898, + 0.535906884918, + 0.543806876003, + 0.551779526545, + 0.559823152087, + 0.567935913404, + 0.576115809391, + 0.584360669752, + 0.592668147495, + 0.601035711242, + 0.609460637362, + 0.617940001921, + 0.626470672484, + 0.635049299754, + 0.643672309079, + 0.652335891838, + 0.661035996717, + 0.669768320912, + 0.678528301262, + 0.687311105354, + 0.696111622628, + 0.704924455502, + 0.713743910579, + 0.722563989954, + 0.73137838268, + 0.740180456445, + 0.748963249516, + 0.757719463004, + 0.766441453537, + 0.775121226404, + 0.783750429251, + 0.792320346432, + 0.800821894109, + 0.80924561619, + 0.817581681258, + 0.825819880573, + 0.833949627307, + 0.841959957149, + 0.849839530416, + 0.857576635841, + 0.865159196202, + 0.872574775951, + 0.879810591029, + 0.886853521034, + 0.89369012393, + 0.900306653449, + 0.906689079376, + 0.912823110838, + 0.918694222757, + 0.924287685548, + 0.929588598149, + 0.934581924406, + 0.939252532785, + 0.943585239338, + 0.947564853745, + 0.951176228204, + 0.954404308824, + 0.957234189092, + 0.959651164872, + 0.961640790298, + 0.963188933832, + 0.964281833689, + 0.964906151796, + 0.96504902547, + 0.964698116109, + 0.963841654379, + 0.962468481752, + 0.960568088752, + 0.958130651033, + 0.955147065433, + 0.951608989442, + 0.947508889181, + 0.942840102905, + 0.937596929216, + 0.93177475143, + 0.92537021154, + 0.918381448441, + 0.910808414718, + 0.9026532829, + 0.893920943649, + 0.884619581769, + 0.874761286647, + 0.864362605134, + 0.853444867548, + 0.842033997808, + 0.830159337813, + 0.817850753113, + 0.805133962493, + 0.792031481593, + 0.778565994619, + 0.76476058522, + 0.750638675816, + 0.736223971842, + 0.721540405502, + 0.706612079754, + 0.691463212142, + 0.676118079083, + 0.660600960328, + 0.64493608406, + 0.629147572462, + 0.613259388097, + 0.597295281026, + 0.58127873689, + 0.565232925983, + 0.549180653438, + 0.533144310659, + 0.517145828009, + 0.501206628997, + 0.485347585902, + 0.469588977164, + 0.453950446414, + 0.438450963564, + 0.423108787789, + 0.407941432887, + 0.392965634812, + 0.378197321937, + 0.363651587787, + 0.34934266686, + 0.33528391322, + 0.321487782502, + 0.307965816966, + 0.294728634218, + 0.28178591919, + 0.269146419947, + 0.256817946854, + 0.244807375593, + 0.233120653525, + 0.22176280978, + 0.210737968522, + 0.200049365691, + 0.189699368613, + 0.179689498701, + 0.170020456614, + 0.160692150029, + 0.151703723375, + 0.143053589634, + 0.134739463596, + 0.126758396598, + 0.119106812202, + 0.111780542817, + 0.104774866759, + 0.0980845457722, + 0.0917038625567, + 0.0856266583351, + 0.0798463700851, + 0.0743560674722, + 0.069148489193, + 0.0642160787756, + 0.0595510196159, + 0.055145269311, + 0.0509905931262, + 0.0470785966626, + 0.0434007576053, + 0.0399484566163, + 0.036713007278, + 0.0336856851376, + 0.0308577557699, + 0.0282205018861, + 0.0257652494064, + 0.0234833924972, + 0.0213664174853, + 0.0194059256253, + 0.0175936546278, + 0.0159214989064, + 0.0143815284516, + 0.0129660062838, + 0.011667404402, + 0.0104784181853, + 0.00939197918289, + 0.00840126626492, + 0.00749971509717, + 0.00668102593447, + 0.00593916972809, + 0.00526839256923, + 0.0046632184966, + 0.00411845071863, + 0.00362917130868, + 0.00319073944938, + 0.00279878831024, + 0.00244922065537, + 0.00213820328422, + 0.00186216041687, + 0.00161776613831, + 0.00140193602044, + 0.00121181804087, + 0.0010447829177, + 0.000898413977111, + 0.000770496667528, + 0.000659007829259, + 0.000562104823131, + 0.000478114614794, + 0.000405522904291, + 0.000342963382484, + 0.000289207187778, + 0.000243152628038, + 0.000203815224053, + 0.000170318122367, + 0.000141882916956, + 0.000117820911134, + 9.7524843408e-05, + 8.04610937162e-05, + 6.61623797976e-05, + 5.42209472429e-05, + 4.42822512376e-05, + 3.603912306e-05, + 2.92264100901e-05, + 2.36160744025e-05, + 1.90127319508e-05, + 1.52496118744e-05, + 1.21849135424e-05, + 9.69853756119e-06, + 7.68916605935e-06, + 6.07166709213e-06, + 4.77479791827e-06, + 3.73918214821e-06, + 2.91553629069e-06, + 2.26312198074e-06, + 1.74840108584e-06, + 1.34387185952e-06, + 1.02706604047e-06, + 7.79686451855e-07, + 5.86867212292e-07, + 4.36538777484e-07, + 3.18880709481e-07, + 2.25845237387e-07, + 1.507341733e-07, + 8.78102856793e-08, + 3.19213399334e-08, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + { + "label": "2P", + "angular_momentum": 1, + "occupation": 4.0, + "radial_function": [ + 0.0, + 6.3379705613e-11, + 2.57870891881e-10, + 5.90198017139e-10, + 1.06735506605e-09, + 1.69661548666e-09, + 2.48554248101e-09, + 3.44199966187e-09, + 4.57416208818e-09, + 5.89052769265e-09, + 7.39992911512e-09, + 9.11154595589e-09, + 1.10349174638e-08, + 1.3179955674e-08, + 1.55569590116e-08, + 1.81766263769e-08, + 2.10500717294e-08, + 2.4188839188e-08, + 2.76049186653e-08, + 3.13107620546e-08, + 3.53192999891e-08, + 3.96439591929e-08, + 4.42986804449e-08, + 4.92979371769e-08, + 5.46567547275e-08, + 6.03907302753e-08, + 6.65160534748e-08, + 7.30495278193e-08, + 8.00085927569e-08, + 8.74113465846e-08, + 9.52765701488e-08, + 1.0362375138e-07, + 1.12473110689e-07, + 1.21845627259e-07, + 1.31763066259e-07, + 1.42248007014e-07, + 1.53323872169e-07, + 1.65014957869e-07, + 1.77346465006e-07, + 1.90344531559e-07, + 2.0403626607e-07, + 2.18449782294e-07, + 2.33614235062e-07, + 2.49559857401e-07, + 2.66317998963e-07, + 2.83921165787e-07, + 3.02403061464e-07, + 3.21798629739e-07, + 3.42144098604e-07, + 3.63477025937e-07, + 3.85836346736e-07, + 4.09262422002e-07, + 4.33797089339e-07, + 4.59483715316e-07, + 4.86367249661e-07, + 5.14494281353e-07, + 5.43913096668e-07, + 5.74673739253e-07, + 6.06828072305e-07, + 6.4042984291e-07, + 6.75534748634e-07, + 7.12200506444e-07, + 7.50486924015e-07, + 7.90455973549e-07, + 8.32171868147e-07, + 8.75701140857e-07, + 9.21112726473e-07, + 9.68478046187e-07, + 1.01787109519e-06, + 1.06936853333e-06, + 1.12304977891e-06, + 1.17899710578e-06, + 1.23729574381e-06, + 1.29803398281e-06, + 1.36130328014e-06, + 1.42719837203e-06, + 1.49581738875e-06, + 1.56726197386e-06, + 1.64163740751e-06, + 1.71905273411e-06, + 1.79962089442e-06, + 1.88345886221e-06, + 1.9706877857e-06, + 2.06143313387e-06, + 2.15582484794e-06, + 2.25399749803e-06, + 2.35609044532e-06, + 2.46224800979e-06, + 2.57261964386e-06, + 2.687360112e-06, + 2.8066296766e-06, + 2.9305942903e-06, + 3.05942579498e-06, + 3.19330212771e-06, + 3.33240753375e-06, + 3.47693278705e-06, + 3.62707541836e-06, + 3.78303995121e-06, + 3.94503814615e-06, + 4.11328925347e-06, + 4.28802027455e-06, + 4.46946623249e-06, + 4.65787045195e-06, + 4.85348484876e-06, + 5.05657022958e-06, + 5.26739660195e-06, + 5.48624349507e-06, + 5.71340029169e-06, + 5.94916657157e-06, + 6.19385246673e-06, + 6.44777902915e-06, + 6.71127861108e-06, + 6.98469525863e-06, + 7.2683851189e-06, + 7.56271686134e-06, + 7.86807211357e-06, + 8.18484591239e-06, + 8.51344717035e-06, + 8.85429915854e-06, + 9.20784000605e-06, + 9.57452321672e-06, + 9.95481820382e-06, + 1.03492108432e-05, + 1.07582040457e-05, + 1.1182318349e-05, + 1.16220925306e-05, + 1.20780842414e-05, + 1.25508706616e-05, + 1.30410491791e-05, + 1.35492380913e-05, + 1.40760773314e-05, + 1.46222292198e-05, + 1.51883792415e-05, + 1.577523685e-05, + 1.63835362995e-05, + 1.70140375057e-05, + 1.76675269366e-05, + 1.83448185334e-05, + 1.9046754664e-05, + 1.97742071094e-05, + 2.05280780834e-05, + 2.13093012889e-05, + 2.21188430092e-05, + 2.29577032384e-05, + 2.38269168498e-05, + 2.47275548057e-05, + 2.56607254078e-05, + 2.66275755917e-05, + 2.76292922663e-05, + 2.86671036985e-05, + 2.97422809465e-05, + 3.08561393428e-05, + 3.20100400275e-05, + 3.32053915354e-05, + 3.4443651438e-05, + 3.57263280413e-05, + 3.7054982143e-05, + 3.84312288506e-05, + 3.98567394613e-05, + 4.13332434079e-05, + 4.2862530271e-05, + 4.44464518615e-05, + 4.6086924374e-05, + 4.77859306158e-05, + 4.95455223117e-05, + 5.13678224888e-05, + 5.3255027944e-05, + 5.52094117958e-05, + 5.72333261252e-05, + 5.93292047067e-05, + 6.14995658344e-05, + 6.37470152449e-05, + 6.60742491417e-05, + 6.84840573236e-05, + 7.09793264209e-05, + 7.35630432432e-05, + 7.62382982433e-05, + 7.90082890999e-05, + 8.18763244239e-05, + 8.4845827593e-05, + 8.79203407179e-05, + 9.11035287456e-05, + 9.43991837042e-05, + 9.7811229094e-05, + 0.00010134372443, + 0.000105000869939, + 0.000108787011425, + 0.000112706645293, + 0.000116764423751, + 0.000120965160194, + 0.000125313834769, + 0.000129815600131, + 0.000134475787401, + 0.000139299912327, + 0.000144293681659, + 0.000149462999741, + 0.000154813975328, + 0.000160352928647, + 0.00016608639869, + 0.000172021150765, + 0.000178164184304, + 0.000184522740939, + 0.000191104312861, + 0.000197916651458, + 0.000204967776258, + 0.000212265984174, + 0.000219819859071, + 0.000227638281662, + 0.000235730439736, + 0.00024410583875, + 0.000252774312778, + 0.000261746035832, + 0.000271031533583, + 0.000280641695476, + 0.000290587787261, + 0.000300881463961, + 0.000311534783279, + 0.000322560219466, + 0.000333970677666, + 0.000345779508755, + 0.000358000524684, + 0.000370648014354, + 0.000383736760028, + 0.000397282054314, + 0.000411299717722, + 0.00042580611683, + 0.000440818183062, + 0.000456353432123, + 0.000472429984084, + 0.000489066584166, + 0.000506282624228, + 0.000524098164996, + 0.000542533959042, + 0.00056161147456, + 0.000581352919948, + 0.000601781269227, + 0.000622920288335, + 0.000644794562312, + 0.000667429523413, + 0.000690851480187, + 0.000715087647535, + 0.000740166177803, + 0.000766116192925, + 0.000792967817667, + 0.000820752214001, + 0.00084950161664, + 0.000879249369792, + 0.000910029965157, + 0.000941879081211, + 0.00097483362383, + 0.00100893176828, + 0.00104421300266, + 0.00108071817275, + 0.00111848952848, + 0.00115757077185, + 0.00119800710658, + 0.00123984528938, + 0.00128313368292, + 0.00132792231067, + 0.00137426291353, + 0.00142220900836, + 0.00147181594853, + 0.00152314098645, + 0.00157624333822, + 0.00163118425048, + 0.00168802706944, + 0.00174683731225, + 0.00180768274081, + 0.00187063343792, + 0.00193576188611, + 0.00200314304898, + 0.00207285445536, + 0.00214497628614, + 0.00221959146408, + 0.0022967857466, + 0.00237664782154, + 0.00245926940621, + 0.00254474534962, + 0.00263317373814, + 0.00272465600457, + 0.00281929704086, + 0.00291720531448, + 0.00301849298861, + 0.00312327604626, + 0.00323167441842, + 0.00334381211642, + 0.00345981736852, + 0.00357982276097, + 0.00370396538361, + 0.00383238698019, + 0.00396523410346, + 0.0041026582753, + 0.00424481615193, + 0.00439186969439, + 0.00454398634449, + 0.00470133920621, + 0.00486410723302, + 0.0050324754209, + 0.00520663500757, + 0.00538678367787, + 0.00557312577553, + 0.00576587252158, + 0.00596524223943, + 0.00617146058694, + 0.00638476079552, + 0.00660538391662, + 0.00683357907562, + 0.00706960373343, + 0.00731372395588, + 0.00756621469129, + 0.0078273600561, + 0.0080974536291, + 0.00837679875417, + 0.00866570885191, + 0.00896450774025, + 0.00927352996428, + 0.0095931211355, + 0.00992363828061, + 0.0102654502002, + 0.0106189378371, + 0.0109844946555, + 0.0113625270296, + 0.0117534546433, + 0.0121577109007, + 0.0125757433465, + 0.0130080140986, + 0.0134550002911, + 0.0139171945285, + 0.0143951053516, + 0.0148892577147, + 0.0154001934745, + 0.0159284718903, + 0.0164746701364, + 0.0170393838259, + 0.0176232275465, + 0.0182268354076, + 0.0188508615996, + 0.0194959809647, + 0.0201628895794, + 0.0208523053478, + 0.0215649686071, + 0.0223016427436, + 0.0230631148192, + 0.0238501962096, + 0.0246637232514, + 0.0255045578996, + 0.0263735883941, + 0.0272717299358, + 0.0281999253697, + 0.0291591458763, + 0.0301503916699, + 0.0311746927023, + 0.0322331093719, + 0.033326733237, + 0.0344566877318, + 0.0356241288839, + 0.0368302460326, + 0.038076262546, + 0.0393634365353, + 0.0406930615644, + 0.0420664673541, + 0.0434850204767, + 0.0449501250412, + 0.0464632233648, + 0.0480257966293, + 0.049639365519, + 0.0513054908374, + 0.0530257740994, + 0.0548018580959, + 0.0566354274263, + 0.0585282089961, + 0.0604819724742, + 0.0624985307066, + 0.0645797400806, + 0.0667275008352, + 0.0689437573117, + 0.0712304981396, + 0.0735897563502, + 0.0760236094128, + 0.0785341791858, + 0.0811236317757, + 0.0837941772954, + 0.0865480695154, + 0.0893876053971, + 0.0923151244999, + 0.0953330082531, + 0.0984436790806, + 0.10164959937, + 0.104953270269, + 0.108357230311, + 0.111864053832, + 0.115476349196, + 0.119196756789, + 0.123027946784, + 0.126972616647, + 0.131033488381, + 0.135213305481, + 0.139514829586, + 0.143940836807, + 0.148494113709, + 0.15317745293, + 0.157993648407, + 0.162945490194, + 0.168035758837, + 0.173267219284, + 0.178642614301, + 0.184164657367, + 0.189836025004, + 0.195659348523, + 0.201637205142, + 0.207772108435, + 0.214066498082, + 0.220522728865, + 0.227143058873, + 0.233929636867, + 0.240884488748, + 0.248009503091, + 0.255306415661, + 0.262776792888, + 0.270422014211, + 0.278243253241, + 0.286241457675, + 0.294417327905, + 0.302771294229, + 0.311303492635, + 0.320013739052, + 0.328901502044, + 0.337965873861, + 0.347205539814, + 0.356618745924, + 0.366203264824, + 0.375956359903, + 0.385874747702, + 0.395954558608, + 0.406191295912, + 0.416579793355, + 0.427114171319, + 0.437787791901, + 0.448593213145, + 0.459522142823, + 0.470565392231, + 0.481712830558, + 0.492953340545, + 0.504274776232, + 0.515663923776, + 0.527106466453, + 0.538586955127, + 0.550088785625, + 0.561594184638, + 0.573084205903, + 0.584538738556, + 0.595936529662, + 0.60725522296, + 0.618471415867, + 0.629560736655, + 0.640497943503, + 0.651257046765, + 0.661811455204, + 0.672134146197, + 0.68219785888, + 0.691975307867, + 0.701439413576, + 0.710563543198, + 0.719321754098, + 0.727689028854, + 0.735641488386, + 0.743156566816, + 0.750213129053, + 0.756791509986, + 0.762873453003, + 0.768441926046, + 0.773480796277, + 0.777974350779, + 0.781906661733, + 0.785260811522, + 0.78801801777, + 0.790156731614, + 0.791651825454, + 0.792474038714, + 0.792589909627, + 0.791962481871, + 0.790553125798, + 0.788324834367, + 0.785247309271, + 0.781303987305, + 0.77650078294, + 0.77087560561, + 0.764506445766, + 0.757513709019, + 0.750049066618, + 0.742257738008, + 0.734210754594, + 0.725920655176, + 0.717395838385, + 0.708645026363, + 0.699677164725, + 0.690501407308, + 0.681127100631, + 0.671563768659, + 0.66182109736, + 0.651908919525, + 0.641837199449, + 0.631616017817, + 0.621255556483, + 0.610766083359, + 0.600157937219, + 0.589441512495, + 0.578627243978, + 0.5677255914, + 0.556747023891, + 0.545702004208, + 0.534600972824, + 0.523454331685, + 0.512272427849, + 0.501065536728, + 0.489843845266, + 0.478617434724, + 0.467396263516, + 0.456190149723, + 0.445008753841, + 0.433861561369, + 0.422757865876, + 0.411706752141, + 0.400717080079, + 0.38979746902, + 0.378956283107, + 0.368201617358, + 0.357541285165, + 0.346982806747, + 0.336533399314, + 0.326199968413, + 0.315989101178, + 0.305907060899, + 0.295959783572, + 0.2861528758, + 0.27649161462, + 0.266980948596, + 0.257625500663, + 0.248429572046, + 0.239397147637, + 0.230531902163, + 0.221837207449, + 0.213316140114, + 0.204971489948, + 0.196805768343, + 0.18882121698, + 0.181019816178, + 0.173403293122, + 0.165973129421, + 0.158730568196, + 0.151676620283, + 0.144812069725, + 0.138137478252, + 0.13165318897, + 0.125359329039, + 0.119255811619, + 0.113342336951, + 0.107618392906, + 0.102083254935, + 0.0967359857925, + 0.0915754350242, + 0.0866002385811, + 0.0818088186097, + 0.0771993837308, + 0.0727699298763, + 0.0685182419417, + 0.0644418963071, + 0.0605382644165, + 0.0568045174302, + 0.053237632069, + 0.0498343976183, + 0.0465914241383, + 0.0435051518042, + 0.0405718613596, + 0.0377876855713, + 0.0351486216161, + 0.0326505442649, + 0.0302892197601, + 0.0280603202369, + 0.0259594385682, + 0.0239821034801, + 0.0221237948131, + 0.020379958784, + 0.0187460231286, + 0.0172174119947, + 0.0157895604795, + 0.0144579286991, + 0.0132180153031, + 0.0120653703439, + 0.0109956074321, + 0.0100044151146, + 0.00908756742359, + 0.00824093355694, + 0.00746048666022, + 0.00674231168914, + 0.00608261234303, + 0.00547771706669, + 0.00492408412769, + 0.00441830578294, + 0.00395711155576, + 0.00353737065067, + 0.00315609353883, + 0.00281043275196, + 0.00249768292648, + 0.00221528014356, + 0.00196080061317, + 0.00173195875277, + 0.00152660471269, + 0.00134272140137, + 0.00117842106394, + 0.00103194146788, + 0.000901641748577, + 0.000785997966873, + 0.000683598429275, + 0.000593138819654, + 0.000513417189283, + 0.000443328849654, + 0.000381861209961, + 0.000328088598301, + 0.000281167102733, + 0.000240329465261, + 0.000204880056866, + 0.000174189949846, + 0.000147692173196, + 0.000124877067891, + 0.000105287827975, + 8.85162292963e-05, + 7.41985550641e-05, + 6.20117267659e-05, + 5.16696464045e-05, + 4.29197536147e-05, + 3.55397989773e-05, + 2.93348328067e-05, + 2.41344068306e-05, + 1.97899845251e-05, + 1.61725544064e-05, + 1.31704393079e-05, + 1.06872935849e-05, + 8.64027927251e-06, + 6.95841145692e-06, + 5.58106248744e-06, + 4.45661412721e-06, + 3.54124627394e-06, + 2.79785043487e-06, + 2.19505564667e-06, + 1.70635390904e-06, + 1.30931133581e-06, + 9.84849963134e-07, + 7.16583271004e-07, + 4.9018565938e-07, + 2.92771926384e-07, + 1.12256571816e-07, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + } + ], + "total_charge_density": [ + 0.0, + 3.30029663643e-10, + 1.3427806724e-09, + 3.07326850572e-09, + 5.55791211648e-09, + 8.83458567498e-09, + 1.29426721545e-08, + 1.79231188225e-08, + 2.3818494705e-08, + 3.06730500916e-08, + 3.85327781547e-08, + 4.74454787549e-08, + 5.746082451e-08, + 6.86304292069e-08, + 8.10079186375e-08, + 9.4649003944e-08, + 1.09611557561e-07, + 1.25955691845e-07, + 1.43743840485e-07, + 1.63040842793e-07, + 1.8391403097e-07, + 2.06433320462e-07, + 2.30671303495e-07, + 2.56703345922e-07, + 2.84607687486e-07, + 3.1446554561e-07, + 3.46361222857e-07, + 3.80382218172e-07, + 4.16619342041e-07, + 4.5516683571e-07, + 4.96122494598e-07, + 5.3958779605e-07, + 5.85668031592e-07, + 6.34472443828e-07, + 6.86114368153e-07, + 7.40711379448e-07, + 7.98385443925e-07, + 8.59263076305e-07, + 9.23475502516e-07, + 9.91158828099e-07, + 1.06245421252e-06, + 1.13750804962e-06, + 1.21647215433e-06, + 1.29950395601e-06, + 1.38676669851e-06, + 1.47842964727e-06, + 1.57466830365e-06, + 1.67566462676e-06, + 1.7816072631e-06, + 1.89269178418e-06, + 2.00912093252e-06, + 2.13110487616e-06, + 2.25886147219e-06, + 2.39261653936e-06, + 2.53260414036e-06, + 2.67906687384e-06, + 2.83225617673e-06, + 2.99243263701e-06, + 3.15986631756e-06, + 3.33483709116e-06, + 3.51763498725e-06, + 3.70856055085e-06, + 3.90792521387e-06, + 4.11605167951e-06, + 4.33327431998e-06, + 4.5599395881e-06, + 4.79640644331e-06, + 5.04304679245e-06, + 5.30024594595e-06, + 5.56840308992e-06, + 5.84793177465e-06, + 6.13926042015e-06, + 6.44283283933e-06, + 6.75910877931e-06, + 7.08856448168e-06, + 7.43169326219e-06, + 7.78900611061e-06, + 8.16103231157e-06, + 8.54832008685e-06, + 8.95143726011e-06, + 9.37097194475e-06, + 9.80753325562e-06, + 1.02617520456e-05, + 1.07342816675e-05, + 1.12257987629e-05, + 1.17370040782e-05, + 1.22686233087e-05, + 1.28214079726e-05, + 1.33961363147e-05, + 1.39936142425e-05, + 1.46146762935e-05, + 1.52601866372e-05, + 1.59310401115e-05, + 1.66281632947e-05, + 1.73525156156e-05, + 1.81050905009e-05, + 1.88869165642e-05, + 1.96990588341e-05, + 2.05426200269e-05, + 2.14187418621e-05, + 2.23286064242e-05, + 2.32734375717e-05, + 2.42545023946e-05, + 2.52731127232e-05, + 2.63306266882e-05, + 2.74284503358e-05, + 2.85680392983e-05, + 2.9750900523e-05, + 3.09785940607e-05, + 3.22527349162e-05, + 3.35749949634e-05, + 3.49471049262e-05, + 3.63708564284e-05, + 3.78481041145e-05, + 3.93807678444e-05, + 4.09708349633e-05, + 4.26203626509e-05, + 4.4331480352e-05, + 4.61063922912e-05, + 4.79473800742e-05, + 4.98568053802e-05, + 5.18371127467e-05, + 5.38908324509e-05, + 5.60205834915e-05, + 5.82290766729e-05, + 6.05191177969e-05, + 6.28936109643e-05, + 6.53555619911e-05, + 6.79080819435e-05, + 7.05543907942e-05, + 7.3297821206e-05, + 7.61418224462e-05, + 7.90899644367e-05, + 8.21459419436e-05, + 8.5313578913e-05, + 8.85968329552e-05, + 9.19997999857e-05, + 9.5526719026e-05, + 9.91819771704e-05, + 0.000102970114725, + 0.000106895830524, + 0.000110963987433, + 0.000115179618033, + 0.000119547930519, + 0.000124074314781, + 0.000128764348712, + 0.000133623804728, + 0.000138658656513, + 0.000143875085997, + 0.000149279490578, + 0.000154878490594, + 0.000160678937046, + 0.000166687919602, + 0.000172912774863, + 0.000179361094924, + 0.000186040736231, + 0.000192959828738, + 0.000200126785387, + 0.000207550311913, + 0.000215239416991, + 0.000223203422725, + 0.000231451975514, + 0.000239995057282, + 0.0002488429971, + 0.000258006483212, + 0.000267496575474, + 0.000277324718226, + 0.000287502753604, + 0.000298042935319, + 0.000308957942908, + 0.000320260896479, + 0.000331965371966, + 0.000344085416912, + 0.000356635566795, + 0.000369630861924, + 0.000383086864915, + 0.000397019678771, + 0.000411445965592, + 0.000426382965924, + 0.000441848518788, + 0.000457861082389, + 0.000474439755554, + 0.000491604299904, + 0.000509375162789, + 0.000527773501031, + 0.00054682120547, + 0.000566540926373, + 0.000586956099717, + 0.000608090974379, + 0.00062997064027, + 0.00065262105744, + 0.000676069086194, + 0.000700342518246, + 0.00072547010895, + 0.000751481610652, + 0.000778407807191, + 0.000806280549597, + 0.000835132793024, + 0.000864998634956, + 0.000895913354749, + 0.000927913454526, + 0.000961036701499, + 0.00099532217175, + 0.00103081029553, + 0.00106754290415, + 0.00110556327841, + 0.00114491619887, + 0.00118564799764, + 0.00122780661221, + 0.00127144164092, + 0.00131660440051, + 0.00136334798558, + 0.00141172733018, + 0.00146179927143, + 0.00151362261545, + 0.00156725820556, + 0.00162276899276, + 0.00168022010876, + 0.00173967894148, + 0.0018012152132, + 0.00186490106143, + 0.00193081112252, + 0.00199902261826, + 0.00206961544543, + 0.00214267226851, + 0.00221827861553, + 0.00229652297733, + 0.00237749691026, + 0.00246129514238, + 0.00254801568344, + 0.00263775993862, + 0.00273063282628, + 0.00282674289978, + 0.00292620247351, + 0.00302912775337, + 0.00313563897175, + 0.00324586052722, + 0.00335992112913, + 0.00347795394714, + 0.00360009676613, + 0.00372649214634, + 0.00385728758922, + 0.00399263570904, + 0.00413269441044, + 0.00427762707227, + 0.00442760273778, + 0.00458279631147, + 0.00474338876292, + 0.00490956733757, + 0.00508152577508, + 0.0052594645352, + 0.00544359103159, + 0.00563411987387, + 0.00583127311811, + 0.00603528052619, + 0.00624637983416, + 0.00646481703009, + 0.00669084664173, + 0.00692473203418, + 0.00716674571816, + 0.00741716966903, + 0.00767629565709, + 0.0079444255896, + 0.00822187186474, + 0.00850895773818, + 0.00880601770253, + 0.00911339788028, + 0.00943145643057, + 0.00976056397044, + 0.0101011040109, + 0.0104534734088, + 0.0108180828341, + 0.0111953572544, + 0.0115857364364, + 0.0119896754655, + 0.0124076452831, + 0.0128401332441, + 0.0132876436937, + 0.0137506985652, + 0.0142298379984, + 0.0147256209813, + 0.0152386260136, + 0.0157694517953, + 0.0163187179387, + 0.0168870657071, + 0.0174751587793, + 0.0180836840424, + 0.0187133524126, + 0.0193648996857, + 0.0200390874192, + 0.0207367038449, + 0.021458564816, + 0.022205514788, + 0.0229784278348, + 0.0237782087027, + 0.0246057939025, + 0.0254621528407, + 0.0263482889936, + 0.0272652411229, + 0.0282140845364, + 0.0291959323956, + 0.03021193707, + 0.0312632915425, + 0.0323512308662, + 0.0334770336743, + 0.0346420237467, + 0.0358475716344, + 0.0370950963433, + 0.0383860670816, + 0.039722005071, + 0.0411044854261, + 0.0425351391035, + 0.0440156549233, + 0.045547781666, + 0.0471333302486, + 0.0487741759806, + 0.0504722609061, + 0.0522295962319, + 0.0540482648482, + 0.055930423943, + 0.0578783077147, + 0.0598942301868, + 0.0619805881283, + 0.0641398640839, + 0.0663746295182, + 0.0686875480776, + 0.0710813789757, + 0.0735589805052, + 0.0761233136818, + 0.0787774460251, + 0.0815245554815, + 0.0843679344931, + 0.0873109942196, + 0.0903572689179, + 0.093510420484, + 0.096774243165, + 0.100152668445, + 0.10364977011, + 0.107269769504, + 0.111017040974, + 0.114896117511, + 0.118911696608, + 0.123068646312, + 0.127372011509, + 0.131827020426, + 0.136439091363, + 0.141213839662, + 0.146157084922, + 0.151274858453, + 0.156573410996, + 0.162059220691, + 0.167739001316, + 0.173619710793, + 0.179708559962, + 0.18601302164, + 0.192540839949, + 0.199300039931, + 0.206298937445, + 0.213546149337, + 0.2210506039, + 0.228821551605, + 0.236868576104, + 0.245201605503, + 0.253830923885, + 0.262767183088, + 0.272021414709, + 0.281605042328, + 0.291529893927, + 0.301808214483, + 0.312452678707, + 0.323476403894, + 0.334892962856, + 0.346716396883, + 0.358961228694, + 0.371642475318, + 0.384775660844, + 0.39837682897, + 0.412462555269, + 0.427049959093, + 0.442156715002, + 0.457801063619, + 0.474001821788, + 0.490778391895, + 0.508150770204, + 0.526139554052, + 0.544765947704, + 0.564051766691, + 0.584019440398, + 0.604692012665, + 0.626093140159, + 0.648247088211, + 0.671178723828, + 0.694913505552, + 0.719477469792, + 0.744897213261, + 0.771199871094, + 0.798413090203, + 0.826564997397, + 0.855684161756, + 0.885799550718, + 0.916940479312, + 0.949136551921, + 0.982417595936, + 1.01681358664, + 1.05235456261, + 1.08907053089, + 1.1269913612, + 1.16614666837, + 1.20656568223, + 1.24827710403, + 1.29130894872, + 1.33568837206, + 1.38144148189, + 1.42859313257, + 1.47716670191, + 1.5271838498, + 1.57866425767, + 1.63162534839, + 1.68608198566, + 1.74204615283, + 1.79952661039, + 1.85852853219, + 1.91905312018, + 1.98109719801, + 2.04465278367, + 2.10970664197, + 2.17623981787, + 2.24422715187, + 2.31363677933, + 2.38442961573, + 2.45655883074, + 2.5299693142, + 2.60459713792, + 2.68036901786, + 2.75720178192, + 2.83500184963, + 2.91366473059, + 2.99307454983, + 3.07310360918, + 3.15361199493, + 3.23444724334, + 3.31544407688, + 3.39642422558, + 3.47719634938, + 3.55755607885, + 3.63728619342, + 3.71615695788, + 3.79392663927, + 3.87034222825, + 3.9451403897, + 4.01804866869, + 4.08878697806, + 4.15706939355, + 4.22260628081, + 4.28510677571, + 4.34428163395, + 4.39984645835, + 4.45152530042, + 4.49905461634, + 4.54218753513, + 4.58069836574, + 4.61438722935, + 4.64308464911, + 4.66665585995, + 4.68500451047, + 4.6980753144, + 4.70585506306, + 4.70837122823, + 4.70568715854, + 4.69789259615, + 4.68508790635, + 4.6673614404, + 4.64476879587, + 4.61737146059, + 4.58524551274, + 4.54848218376, + 4.50718738277, + 4.46148113857, + 4.4114969726, + 4.3573811988, + 4.29929216505, + 4.2373994332, + 4.17188291298, + 4.10293194741, + 4.0307443655, + 3.95552549972, + 3.87748718369, + 3.79684672692, + 3.71382588047, + 3.62864978882, + 3.54154593842, + 3.45274315414, + 3.36247095569, + 3.27095720045, + 3.17842862693, + 3.08510940975, + 2.99122027372, + 2.89697764788, + 2.80259286866, + 2.70827143096, + 2.61421229415, + 2.52060724213, + 2.42764030225, + 2.33548722225, + 2.24431500825, + 2.15428152285, + 2.0655351447, + 1.97821448853, + 1.89244818539, + 1.80835472233, + 1.72604233962, + 1.64560898495, + 1.56714232151, + 1.4907197894, + 1.41640871644, + 1.3442664777, + 1.2743406991, + 1.20666950454, + 1.14128180114, + 1.07819760211, + 1.01742838128, + 0.958977458852, + 0.902840411904, + 0.849005509133, + 0.797454163271, + 0.748161400261, + 0.701096338773, + 0.656222678903, + 0.613499193762, + 0.572880222745, + 0.534316160472, + 0.497753940234, + 0.463137506458, + 0.43040827518, + 0.399505577734, + 0.370367086966, + 0.342929222004, + 0.317127531319, + 0.292897051016, + 0.270172638578, + 0.248889279949, + 0.228982370666, + 0.210387969808, + 0.193043027968, + 0.176885588778, + 0.161854965589, + 0.147891893512, + 0.134938658685, + 0.122939205471, + 0.111839223643, + 0.101586216571, + 0.0921295525091, + 0.0834205001995, + 0.0754122507819, + 0.0680599272822, + 0.0613205834863, + 0.055153193389, + 0.0495186327739, + 0.0443796539497, + 0.0397008549046, + 0.0354486436936, + 0.0315911990205, + 0.0280984276104, + 0.0249419190594, + 0.0220948985634, + 0.0195321779857, + 0.0172301055165, + 0.0151665142225, + 0.0133206696403, + 0.0116732166138, + 0.0102061254847, + 0.0089026377866, + 0.00774721154811, + 0.00672546634561, + 0.00582412822764, + 0.00503097466537, + 0.00433477967543, + 0.003725259288, + 0.00319301752878, + 0.00272949309977, + 0.00232690693857, + 0.0019782108416, + 0.00167703732691, + 0.00141765090866, + 0.00119490094026, + 0.00100417617221, + 0.000841361151032, + 0.000702794569609, + 0.000585229657213, + 0.000485796678168, + 0.000401967586027, + 0.000331522859858, + 0.000272520528595, + 0.000223267370457, + 0.000182292256427, + 0.000148321590619, + 0.000120256785872, + 9.71537004359e-05, + 7.82039510553e-05, + 6.27180093019e-05, + 5.01099814472e-05, + 3.98839675785e-05, + 3.16218928255e-05, + 2.49727024148e-05, + 1.96428126058e-05, + 1.53877112347e-05, + 1.2004604413e-05, + 9.32600971287e-06, + 7.21420074703e-06, + 5.55641323072e-06, + 4.26072824796e-06, + 3.25255436767e-06, + 2.47163633878e-06, + 1.86952421071e-06, + 1.40744277317e-06, + 1.05450709683e-06, + 7.8623561294e-07, + 5.83317537213e-07, + 4.30596480094e-07, + 3.16236762123e-07, + 2.31043252964e-07, + 1.67909466095e-07, + 1.2137216756e-07, + 8.72540225904e-08, + 6.2378344711e-08, + 4.43427960953e-08, + 3.13408728032e-08, + 2.2021905858e-08, + 1.53819191734e-08, + 1.06790549738e-08, + 7.36843648748e-09, + 5.05231132778e-09, + 3.44212969347e-09, + 2.32987839275e-09, + 1.56657396379e-09, + 1.04620607332e-09, + 6.93841892358e-10, + 4.56872980697e-10, + 2.98617706254e-10, + 1.93677961719e-10, + 1.24593035051e-10, + 7.94456386142e-11, + 5.0161701132e-11, + 3.1311868499e-11, + 1.92730773374e-11, + 1.1646574754e-11, + 6.8571847566e-12, + 3.87971783366e-12, + 2.0539663552e-12, + 9.61127931103e-13, + 3.4286160653e-13, + 5.0406152107e-14, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + } +} \ No newline at end of file diff --git a/verification/test25/output_ref.json b/verification/test25/output_ref.json new file mode 100644 index 000000000..dd195b37b --- /dev/null +++ b/verification/test25/output_ref.json @@ -0,0 +1,332 @@ +{ + "comm_world_size": 1, + "context": { + "chemical_formula": "Ni2O2", + "config": { + "control": { + "beta_chunk_size": 256, + "cyclic_block_size": 32, + "fft_mode": "serial", + "gen_evp_solver_name": "lapack", + "memory_usage": "high", + "mpi_grid_dims": [ + 1, + 1 + ], + "num_bands_to_print": 10, + "ortho_rf": false, + "print_checksum": false, + "print_forces": true, + "print_hash": false, + "print_memory_usage": false, + "print_neighbors": false, + "print_performance": false, + "print_stress": false, + "print_timers": true, + "processing_unit": "cpu", + "reduce_gvec": true, + "rmt_max": 2.2, + "spglib_tolerance": 0.0001, + "std_evp_solver_name": "lapack", + "use_second_variation": true, + "verbosity": 2, + "verification": 0 + }, + "hubbard": { + "full_orthogonalization": true, + "local": [ + { + "J": 0.0, + "J0": 0.0, + "U": 8.0, + "alpha": 0.0, + "atom_type": "Ni", + "beta": 0.0, + "l": 2, + "n": 3, + "total_initial_occupancy": 8.0 + } + ], + "nonlocal": [], + "normalize": false, + "orthogonalize": false, + "simplified": false + }, + "iterative_solver": { + "converge_by_energy": 1, + "early_restart": 0.5, + "empty_states_tolerance": 1e-05, + "energy_tolerance": 0.01, + "extra_ortho": false, + "init_eval_old": true, + "init_subspace": "lcao", + "locking": true, + "min_num_res": 0, + "num_singular": -1, + "num_steps": 20, + "relative_tolerance": 0, + "residual_tolerance": 1e-06, + "subspace_size": 2, + "type": "davidson" + }, + "locked": true, + "mixer": { + "beta": 0.7, + "beta0": 0.15, + "beta_scaling_factor": 1.0, + "linear_mix_rms_tol": 1000000.0, + "max_history": 8, + "type": "anderson", + "use_hartree": false + }, + "nlcg": { + "T": 300.0, + "kappa": 0.3, + "maxiter": 300, + "restart": 10, + "tau": 0.1, + "tol": 1e-09 + }, + "parameters": { + "auto_rmt": 1, + "aw_cutoff": 0.0, + "core_relativity": "dirac", + "density_tol": 1e-06, + "electronic_structure_method": "pseudopotential", + "energy_tol": 1e-06, + "extra_charge": 0, + "gamma_point": false, + "gk_cutoff": 8.0, + "hubbard_correction": true, + "lmax_apw": -1, + "lmax_pot": 4, + "lmax_rho": 4, + "molecule": false, + "ngridk": [ + 4, + 4, + 4 + ], + "nn_radius": -1, + "num_bands": 34, + "num_dft_iter": 100, + "num_fv_states": -1, + "num_mag_dims": 1, + "precision_gs": "auto", + "precision_hs": "fp64", + "precision_wf": "fp64", + "pw_cutoff": 25.0, + "reduce_aux_bf": 0, + "shiftk": [ + 0, + 0, + 0 + ], + "smearing": "gaussian", + "smearing_width": 0.01, + "so_correction": false, + "use_ibz": true, + "use_scf_correction": true, + "use_symmetry": true, + "valence_relativity": "zora", + "vk": [], + "xc_dens_tre": -1, + "xc_functionals": [ + "XC_GGA_X_PBE", + "XC_GGA_C_PBE" + ] + }, + "settings": { + "always_update_wf": true, + "auto_enu_tol": 0, + "fft_grid_size": [ + 80, + 80, + 80 + ], + "fp32_to_fp64_rms": 0, + "itsol_tol_min": 1e-13, + "itsol_tol_ratio": 0, + "itsol_tol_scale": [ + 0.1, + 0.5 + ], + "min_occupancy": 1e-14, + "mixer_rms_min": 1e-16, + "nprii_aug": 20, + "nprii_beta": 20, + "nprii_rho_core": 20, + "nprii_vloc": 200, + "radial_grid": "exponential, 1.0", + "sht_coverage": 0 + }, + "unit_cell": { + "atom_coordinate_units": "lattice", + "atom_files": { + "Ni": "Ni.json", + "O": "O.json" + }, + "atom_types": [ + "Ni", + "O" + ], + "atoms": { + "Ni": [ + [ + 0.0, + 0.0, + 0.0 + ], + [ + 0.5, + 0.5, + -0.5 + ] + ], + "O": [ + [ + 0.751, + 0.751, + 0.751 + ], + [ + 0.249, + 0.249, + 0.249 + ] + ] + }, + "lattice_vectors": [ + [ + 7.88, + 3.94, + 3.94 + ], + [ + 3.94, + 7.88, + 3.94 + ], + [ + 3.94, + 3.94, + 7.88 + ] + ], + "lattice_vectors_scale": 1.0 + } + }, + "fft_coarse_grid": [ + 54, + 54, + 54 + ], + "mpi_grid": [ + 1, + 1 + ], + "num_atoms": 4, + "omega": 244.65193599999998 + }, + "counters": { + "band_evp_work_count": 6117.245700183189, + "local_operator_num_applied": 44814 + }, + "git_hash": "d7ce09f9ac54bdd09dc9291ee8ce9c01f1d15409", + "ground_state": { + "band_gap": 0.11802673561426846, + "converged": true, + "core_leakage": 0.0, + "efermi": 0.5438705272027462, + "energy": { + "bxc": -0.21859447584759642, + "core_eval_sum": 0.0, + "entropy_sum": -4.200731650660978e-16, + "enuc": 0.0, + "eval_sum": -26.803877648570584, + "ewald": -239.32629513032276, + "exc": -42.97446450188511, + "kin": 115.09052147993134, + "scf_correction": 6.813148274886771e-06, + "total": -375.40350474684914, + "veff": -141.67580465265434, + "vha": 245.08051282721632, + "vloc": -333.0637124041647, + "vxc": -53.69260507567651 + }, + "etot_history": [ + -359.4828282088488, + -371.2850943395904, + -373.7369694681939, + -375.1289643650721, + -375.1758735921571, + -374.9133582906594, + -375.2786549987677, + -375.3894463790578, + -375.39816028542475, + -375.402050325746, + -375.4046990084537, + -375.4034887537392, + -375.4038858399482, + -375.4034927452544, + -375.40351214097376, + -375.40350951600726, + -375.4034849314651, + -375.4035051373547, + -375.4035105730276, + -375.4035038930112, + -375.40350544771877, + -375.40350474684914 + ], + "forces": [ + [ + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0 + ], + [ + -0.003147380200048457, + -0.003147380200048471, + -0.003147380200048471 + ], + [ + 0.0031473802000484847, + 0.003147380200048471, + 0.003147380200048471 + ] + ], + "num_scf_iterations": 21, + "rms_history": [ + 0.2608353227548882, + 0.40858053508916237, + 0.14421172485360406, + 0.041156411707732835, + 0.036559392706819197, + 0.036728104126820066, + 0.022348364211221914, + 0.008346834084517194, + 0.006787574390022183, + 0.003059261310011073, + 0.0017782021845775772, + 0.00036227811437645476, + 0.00015023509806226333, + 4.8187868205314456e-05, + 2.622905749106282e-05, + 2.2417964105640664e-05, + 1.5211917520931938e-05, + 7.513976811385638e-06, + 2.418616766186595e-06, + 1.4374599664458488e-06, + 6.507210784613721e-07, + 1.8600699115531217e-07 + ], + "scf_time": 136.89833212 + }, + "task": 0, + "threads_per_rank": 16 +} \ No newline at end of file diff --git a/verification/test25/sirius.json b/verification/test25/sirius.json new file mode 100644 index 000000000..331cd0477 --- /dev/null +++ b/verification/test25/sirius.json @@ -0,0 +1,85 @@ +{ + "control": { + "gen_evp_solver_name": "lapack", + "print_checksum": false, + "print_forces": true, + "processing_unit": "cpu", + "verbosity": 2 + }, + "hubbard": { + "full_orthogonalization": true, + "local": [ + { + "atom_type": "Ni", + "J": 0.0, + "J0": 0.0, + "U": 8.0, + "alpha": 0.0, + "beta": 0.0, + "l": 2, + "n": 3, + "total_initial_occupancy": 8.0 + } + ], + "simplified": false + }, + "iterative_solver": { + "converge_by_energy": 1, + "early_restart": 0.5, + "empty_states_tolerance": 1e-05, + "energy_tolerance": 0.01, + "min_num_res": 0, + "num_singular": -1, + "num_steps": 20, + "relative_tolerance": 0, + "residual_tolerance": 1e-06, + "subspace_size": 2, + "type": "davidson" + }, + "mixer": { + "beta": 0.7, + "beta0": 0.15, + "beta_scaling_factor": 1.0, + "max_history": 8, + "type": "anderson", + "use_hartree": false + }, + "parameters": { + "density_tol": 1e-06, + "electronic_structure_method": "pseudopotential", + "energy_tol": 1e-06, + "gk_cutoff": 8.0, + "pw_cutoff": 25.0, + "hubbard_correction": true, + "ngridk": [ 4, 4, 4 ], + "num_dft_iter": 100, + "num_mag_dims": 1, + "smearing": "gaussian", + "smearing_width": 0.01, + "xc_functionals": [ + "XC_GGA_X_PBE", + "XC_GGA_C_PBE" + ] + }, + "unit_cell": { + "atom_coordinate_units": "lattice", + "atom_files": { "Ni": "Ni.json", "O": "O.json" }, + "atom_types": [ "Ni", "O" ], + "atoms": { + "Ni": [ + [ 0.0, 0.0, 0.0,0.0,0.0, 2.0 ] + ,[ 0.5, 0.5, -0.5,0.0, 0.0, -2.0 ] + ], + "O": [ + [ 0.751, 0.751, 0.751 ], + [ 0.249, 0.249, 0.249 ] + ] + }, + "lattice_vectors": [ + [ 7.88, 3.94, 3.94 ], + [ 3.94, 7.88, 3.94 ], + [ 3.94, 3.94, 7.88 ] + ], + "lattice_vectors_scale": 1.0 + } +}