diff --git a/docs/advanced/elec_properties/band.md b/docs/advanced/elec_properties/band.md index 2a0f7256a4..c33f5fc829 100644 --- a/docs/advanced/elec_properties/band.md +++ b/docs/advanced/elec_properties/band.md @@ -1,5 +1,7 @@ # Extracting Band Structure +For plane-wave screened hybrid calculations, follow the [hybrid NSCF workflow](hybrid_nscf.md), which additionally requires the frozen SCF orbitals and source q mesh. + In ABACUS, in order to obtain the eigenvalues of Hamiltonian, or generally called band structure, examples can be found in [examples/band](https://github.com/deepmodeling/abacus-develop/tree/develop/examples/12_band). Similar to the [DOS case](https://abacus-rtd.readthedocs.io/en/latest/advanced/elec_properties/dos.html), one first needs to perform a ground-state energy calculation ***with one additional keyword "[out_chg](https://abacus-rtd.readthedocs.io/en/latest/advanced/input_files/input-main.html#out-chg)" in the INPUT file***: diff --git a/docs/advanced/elec_properties/hybrid_nscf.md b/docs/advanced/elec_properties/hybrid_nscf.md new file mode 100644 index 0000000000..1994a14e5d --- /dev/null +++ b/docs/advanced/elec_properties/hybrid_nscf.md @@ -0,0 +1,69 @@ +# PW screened hybrid NSCF + +Hybrid NSCF reads the charge density, binary `wfk*_pw.dat` wavefunctions and +weighted occupations in `eig_occ.txt` from a converged SCF calculation. It keeps +that source fixed while solving a new K-point list or additional target bands. +No new file format is required. + +## SCF + +Use a complete, uniformly weighted source mesh and: + +```text +calculation scf +suffix hybrid +basis_type pw +dft_functional HSE +smearing_method fixed +symmetry -1 +kpar 1 +bndpar 1 +exxace false +exx_gamma_extra false +out_chg 1 +out_wfc_pw 2 +out_freq_ion 0 +cal_force 0 +cal_stress 0 +``` + +## NSCF + +Keep the same structure, pseudopotentials and cutoffs. In a separate output +directory, retain the shared settings above, replace `KPT` with the target +points, and change: + +```text +calculation nscf +read_file_dir ../scf/OUT.hybrid +init_wfc random +nbands 20 +out_band 1 +out_wfc_pw 0 +out_chg 0 +``` + +Supports CPU/CUDA and `nspin 1/2`; use one MPI rank for CUDA. ACE, SOC, +unscreened exchange, forces and stress are unsupported in this workflow. +Set `symmetry -1`: input `0` is accepted but PW EXX resets it to `-1` at runtime. + +HSE defaults to `exx_singularity_correction limits`, as in LCAO. Set `gygi` to +retain the historical PW correction, which can produce jumps at source K points. +Use matching SCF/NSCF settings for consistent bands. Do not use Methfessel-Paxton +smearing (`mp`/`mp2`/`mp3`) for the source: it can write occupations outside +`[0, k-point weight]`, which hybrid NSCF rejects; the non-negative schemes +(`fixed`, `gauss`, `mv`, `fd`) are accepted. Configuration differences +or missing `INPUT.info` produce warnings; missing or incompatible numerical +source data produces an error. + +## Verification + +With MPI and LibXC enabled, substitute your configured executable/build paths: + +```bash +cmake --build build --target MODULE_PW_pw_hybrid_source +OMP_NUM_THREADS=1 ctest --test-dir build -R '^MODULE_PW_pw_hybrid_source$' +# Frozen-source band regressions: tests/01_PW/nscf_hse_same and nscf_hse_path +cd tests/01_PW +OMP_NUM_THREADS=1 bash ../integrate/Autotest.sh -a -r '^nscf_hse' +``` diff --git a/docs/advanced/elec_properties/index.rst b/docs/advanced/elec_properties/index.rst index d75e28e28c..b7efcfe731 100644 --- a/docs/advanced/elec_properties/index.rst +++ b/docs/advanced/elec_properties/index.rst @@ -4,6 +4,7 @@ Electronic Properties and Outputs .. toctree:: band + hybrid_nscf dos Mulliken potential diff --git a/source/Makefile.Objects b/source/Makefile.Objects index 103a72fd9e..191f5e4b78 100644 --- a/source/Makefile.Objects +++ b/source/Makefile.Objects @@ -373,6 +373,8 @@ OBJS_GINT=batch_biggrid.o\ unitcell_info.o\ OBJS_HAMILT=hamilt_pw.o\ + pw_hybrid_nscf.o\ + pw_hybrid_source.o\ td_history_pw.o\ td_pw.o\ hs_matrix_k.o\ diff --git a/source/source_esolver/esolver_ks_pw.cpp b/source/source_esolver/esolver_ks_pw.cpp index 7355d60a8c..b77f95c9b0 100644 --- a/source/source_esolver/esolver_ks_pw.cpp +++ b/source/source_esolver/esolver_ks_pw.cpp @@ -1,4 +1,5 @@ #include "esolver_ks_pw.h" +#include "source_pw/module_pwdft/pw_hybrid_nscf.h" #include "source_estate/elecstate_pw.h" #include "source_estate/module_charge/chg_symm.h" @@ -82,6 +83,8 @@ void ESolver_KS_PW::before_all_runners(BaseCell& basecell, const Inpu ESolver_KS::before_all_runners(ucell, inp); + pw::validate_hybrid_nscf(inp, this->general_exx_info_); + //! setup and allocation for pelec, potentials, etc. elecstate::setup_estate_pw(ucell, this->kv, @@ -193,6 +196,14 @@ void ESolver_KS_PW::before_scf(UnitCell& ucell, const int istep) //! Setup EXX helper for Hamiltonian and psi exx_helper->before_scf(this->p_hamilt, this->stp.template get_psi_t(), *this->inp_, this->general_exx_info_); + if (this->inp_->calculation == "nscf" && this->general_exx_info_.cal_exx) + { + const Input_para& inp = *this->inp_; + const std::string& readin_dir = PARAM.globalv.global_readin_dir; + auto* helper = static_cast*>(this->exx_helper); + pw::prepare_exx_nscf(inp, ucell, this->pw_wfc, *helper->op_exx, readin_dir); + } + ModuleBase::timer::end("ESolver_KS_PW", "before_scf"); } @@ -315,7 +326,7 @@ void ESolver_KS_PW::iter_finish(UnitCell& ucell, const int istep, int // Related to EXX bool cal_exx = general_exx_info_.cal_exx; double hybrid_alpha = general_exx_info_.hybrid_alpha; - if (cal_exx && !exx_helper->get_op_first_iter()) + if (cal_exx && this->inp_->calculation != "nscf" && !exx_helper->get_op_first_iter()) { this->pelec->set_exx(exx_helper->cal_exx_energy(this->stp.template get_psi_t()), cal_exx, hybrid_alpha); } diff --git a/source/source_hamilt/module_xc/exx_info.cpp b/source/source_hamilt/module_xc/exx_info.cpp index 7098c1dd7d..98896c4490 100644 --- a/source/source_hamilt/module_xc/exx_info.cpp +++ b/source/source_hamilt/module_xc/exx_info.cpp @@ -114,7 +114,8 @@ bool init_general_exx_info(General_Exx_Info& info, const Input_para& inp) { info.coulomb_param[Conv_Coulomb_Pot_K::Coulomb_Type::Erfc] = {{ {"alpha", ModuleBase::GlobalFunc::TO_STRING(erfc_alpha[i])}, - {"omega", ModuleBase::GlobalFunc::TO_STRING(inp.exx_erfc_omega[i])} }}; + {"omega", ModuleBase::GlobalFunc::TO_STRING(inp.exx_erfc_omega[i])}, + {"singularity_correction", inp.exx_singularity_correction} }}; } } } diff --git a/source/source_io/module_parameter/read_inp_exx_dftu.cpp b/source/source_io/module_parameter/read_inp_exx_dftu.cpp index b3779c741d..2d60bdc7aa 100644 --- a/source/source_io/module_parameter/read_inp_exx_dftu.cpp +++ b/source/source_io/module_parameter/read_inp_exx_dftu.cpp @@ -466,14 +466,19 @@ void ReadInput::item_exx() { Input_Item item("exx_singularity_correction"); item.annotation = "set the scheme of Coulomb singularity correction"; - item.category = "Exact Exchange (LCAO)"; + item.category = "Exact Exchange (Common)"; item.type = "String"; - item.description = R"(* spencer: see Phys. Rev. B 77, 193110 (2008). -* revised_spencer: see Phys. Rev. Mater. 5, 013807 (2021). Set the scheme of Coulomb singularity correction.)"; + item.description = R"(Scheme for Coulomb singularity / zero-transfer treatment in exact exchange. +* limits: use the finite screened Coulomb-kernel limit, without an auxiliary correction. Default for HSE and cwp22 in both PW and LCAO. PW requires screened exchange and exx_gamma_extra=false; the latter defaults to false for this scheme. +* gygi: retain the historical PW Gygi-Baldereschi auxiliary-function correction. PW only; default for unscreened PW hybrids. For independent-k screened hybrid NSCF this can cause discontinuities at source k points. +* spencer: LCAO spherical truncation, Phys. Rev. B 77, 193110 (2008). +* revised_spencer: LCAO, Phys. Rev. Mater. 5, 013807 (2021). +* massidda / carrier: LCAO auxiliary singularity corrections. +Use the same scheme for consistent SCF and NSCF bands. A source configuration mismatch produces a warning and does not prevent reading the existing SCF files.)"; item.default_value = "default"; item.unit = ""; read_sync_string(input.exx_singularity_correction); - item.reset_value = [](const Input_Item& item, Parameter& para) { + item.reset_value = [this](const Input_Item& item, Parameter& para) { if (para.input.exx_singularity_correction == "default") { std::string& dft_functional = para.input.dft_functional; @@ -490,13 +495,58 @@ void ReadInput::item_exx() || dft_functional_lower == "lrc_wpbeh" || dft_functional_lower == "cam_pbeh") { - para.input.exx_singularity_correction = "spencer"; + if (para.input.basis_type == "pw") + { + para.input.exx_singularity_correction = "gygi"; + } + else + { + para.input.exx_singularity_correction = "spencer"; + } } else if (dft_functional_lower == "hse" || dft_functional_lower == "cwp22") { para.input.exx_singularity_correction = "limits"; } } + if (para.input.basis_type == "pw" && para.input.exx_singularity_correction == "limits") + { + const auto gamma_item = std::find_if(this->input_lists.begin(), this->input_lists.end(), + [](const std::pair& entry) { + return entry.first == "exx_gamma_extra"; + }); + if (gamma_item != this->input_lists.end() && !gamma_item->second.is_read()) + { + para.input.exx_gamma_extra = false; + } + } + }; + item.check_value = [](const Input_Item& item, const Parameter& para) { + const std::string& scheme = para.input.exx_singularity_correction; + if (para.input.basis_type == "pw" && scheme != "default") + { + if (scheme != "limits" && scheme != "gygi") + { + ModuleBase::WARNING_QUIT("ReadInput", "PW exx_singularity_correction must be limits or gygi"); + } + if (scheme == "limits") + { + bool has_fock = false; + for (const auto& alpha : para.input.exx_fock_alpha) + { + has_fock = has_fock || std::stod(alpha) != 0.0; + } + if (has_fock || para.input.exx_gamma_extra) + { + ModuleBase::WARNING_QUIT("ReadInput", + "PW limits requires screened exchange and exx_gamma_extra=false"); + } + } + } + else if (para.input.basis_type != "pw" && scheme == "gygi") + { + ModuleBase::WARNING_QUIT("ReadInput", "exx_singularity_correction gygi is only supported for PW"); + } }; this->add_item(item); } diff --git a/source/source_io/module_parameter/read_inp_other.cpp b/source/source_io/module_parameter/read_inp_other.cpp index 2a99ac6022..68f17c0bdf 100644 --- a/source/source_io/module_parameter/read_inp_other.cpp +++ b/source/source_io/module_parameter/read_inp_other.cpp @@ -886,8 +886,8 @@ When false (default), both the direction and magnitude of the magnetic moment ar item.annotation = "whether to perform gamma extrapolation in exxpw"; item.category = "Exact Exchange (PW)"; item.type = "Boolean"; - item.description = "Whether to use the gamma point extrapolation method to calculate the Fock exchange operator. See https://doi.org/10.1103/PhysRevB.79.205114 for details. Should be set to true most of the time."; - item.default_value = "True"; + item.description = "Whether to use the gamma point extrapolation method to calculate the Fock exchange operator. See https://doi.org/10.1103/PhysRevB.79.205114 for details. Defaults to false for PW exx_singularity_correction=limits (finite screened kernel), and true otherwise. Explicit true is incompatible with the PW limits scheme."; + item.default_value = "False for PW limits; True otherwise"; item.unit = ""; read_sync_bool(input.exx_gamma_extra); this->add_item(item); diff --git a/source/source_io/module_parameter/read_inp_sys.cpp b/source/source_io/module_parameter/read_inp_sys.cpp index e6caad72ae..b2b725ac66 100644 --- a/source/source_io/module_parameter/read_inp_sys.cpp +++ b/source/source_io/module_parameter/read_inp_sys.cpp @@ -151,7 +151,7 @@ void ReadInput::item_system() item.description = R"(Specify the type of calculation. * scf: perform self-consistent electronic structure calculations -* nscf: perform non-self-consistent electronic structure calculations. A charge density file is required +* nscf: perform non-self-consistent electronic structure calculations using a saved charge density. PW screened hybrids also require SCF binary wavefunctions and eig_occ.txt; see [hybrid NSCF](../elec_properties/hybrid_nscf.md). * relax: perform structure relaxation calculations, the relax_nmax parameter depicts the maximal number of ionic iterations * cell-relax: perform cell relaxation calculations * md: perform molecular dynamics simulations diff --git a/source/source_io/test_serial/read_input_item_test.cpp b/source/source_io/test_serial/read_input_item_test.cpp index d2a5c3abaa..096b5c4515 100644 --- a/source/source_io/test_serial/read_input_item_test.cpp +++ b/source/source_io/test_serial/read_input_item_test.cpp @@ -1776,6 +1776,7 @@ TEST_F(InputTest, Item_test2) } { // exx_singluarity_correction auto it = find_label("exx_singularity_correction", readinput.input_lists); + TestParameters::input(param).basis_type = "lcao"; TestParameters::input(param).exx_singularity_correction = "default"; TestParameters::input(param).dft_functional = "HF"; it->second.reset_value(it->second, param); @@ -1790,6 +1791,27 @@ TEST_F(InputTest, Item_test2) TestParameters::input(param).dft_functional = "HSE"; it->second.reset_value(it->second, param); EXPECT_EQ(TestParameters::input(param).exx_singularity_correction, "limits"); + + TestParameters::input(param).basis_type = "pw"; + TestParameters::input(param).dft_functional = "PBE0"; + TestParameters::input(param).exx_singularity_correction = "default"; + it->second.reset_value(it->second, param); + EXPECT_EQ(TestParameters::input(param).exx_singularity_correction, "gygi"); + + TestParameters::input(param).dft_functional = "HSE"; + TestParameters::input(param).exx_singularity_correction = "default"; + TestParameters::input(param).exx_gamma_extra = true; + it->second.reset_value(it->second, param); + EXPECT_EQ(TestParameters::input(param).exx_singularity_correction, "limits"); + EXPECT_FALSE(TestParameters::input(param).exx_gamma_extra); + + auto gamma = find_label("exx_gamma_extra", readinput.input_lists); + gamma->second.str_values = {"true"}; + TestParameters::input(param).exx_gamma_extra = true; + it->second.reset_value(it->second, param); + EXPECT_TRUE(TestParameters::input(param).exx_gamma_extra); + gamma->second.str_values.clear(); + TestParameters::input(param).exx_gamma_extra = false; } { // exx_ccp_rmesh_times auto it = find_label("exx_ccp_rmesh_times", readinput.input_lists); diff --git a/source/source_pw/module_pwdft/CMakeLists.txt b/source/source_pw/module_pwdft/CMakeLists.txt index 404fb05b4f..df29445f84 100644 --- a/source/source_pw/module_pwdft/CMakeLists.txt +++ b/source/source_pw/module_pwdft/CMakeLists.txt @@ -2,6 +2,8 @@ list(APPEND objects hamilt_pw.cpp + pw_hybrid_nscf.cpp + pw_hybrid_source.cpp td_history_pw.cpp td_pw.cpp op_pw_ekin.cpp diff --git a/source/source_pw/module_pwdft/exx_helper.cpp b/source/source_pw/module_pwdft/exx_helper.cpp index b183fc0e07..79d102becd 100644 --- a/source/source_pw/module_pwdft/exx_helper.cpp +++ b/source/source_pw/module_pwdft/exx_helper.cpp @@ -12,7 +12,7 @@ template void Exx_Helper::init(const UnitCell& ucell, const Input_para& inp, const ModuleBase::matrix& wg, const General_Exx_Info& exx_info) { if (inp.calculation != "scf" && inp.calculation != "relax" - && inp.calculation != "cell-relax" && inp.calculation != "md") + && inp.calculation != "cell-relax" && inp.calculation != "md" && inp.calculation != "nscf") { return; } @@ -22,7 +22,7 @@ void Exx_Helper::init(const UnitCell& ucell, const Input_para& inp, c return; } - if (exx_info.separate_loop) + if (exx_info.separate_loop && inp.calculation != "nscf") { XC_Functional::set_xc_first_loop(ucell); this->set_firstiter(); @@ -36,7 +36,7 @@ void Exx_Helper::before_scf(void* p_hamilt, void* psi, const Input_pa { /// Return if not a valid calculation type if (inp.calculation != "scf" && inp.calculation != "relax" - && inp.calculation != "cell-relax" && inp.calculation != "md") + && inp.calculation != "cell-relax" && inp.calculation != "md" && inp.calculation != "nscf") { return; } @@ -60,6 +60,11 @@ bool Exx_Helper::iter_finish(void* p_elec, Charge* p_charge, void* ps UnitCell& ucell, const Input_para& inp, bool& conv_esolver, int iter) { + if (inp.calculation == "nscf") + { + return false; + } + /// Return if EXX is not enabled if (op_exx == nullptr) { diff --git a/source/source_pw/module_pwdft/op_pw_exx.cpp b/source/source_pw/module_pwdft/op_pw_exx.cpp index a6057a1e2c..b580cad1f6 100644 --- a/source/source_pw/module_pwdft/op_pw_exx.cpp +++ b/source/source_pw/module_pwdft/op_pw_exx.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include namespace hamilt @@ -53,6 +54,8 @@ OperatorEXXPW::OperatorEXXPW(const int* isk_in, { ModuleBase::WARNING_QUIT("OperatorEXXPW", "EXX Calculation does not support k-point parallelism when exxace is set to false"); } + source_basis_ = wfcpw_in; + source_points_ = kv_in; gamma_extrapolation = exx_info.gamma_extrapolation; bool is_mp = kv_in->get_is_mp(); #ifdef __MPI @@ -88,8 +91,12 @@ OperatorEXXPW::OperatorEXXPW(const int* isk_in, Real tpiba2 = tpiba * tpiba; // initialize rhopw_dev on the resolved EXX cutoff - rhopw_dev = new ModulePW::PW_Basis(wfcpw->get_device(), rhopw->get_precision()); - rhopw_dev->fft_bundle.setfft(wfcpw->get_device(), rhopw->get_precision()); + // Pair densities have the wavefunction precision, while the ordinary + // charge density may retain double precision in a single-precision run. + const std::string exchange_device = wfcpw->get_device(); + const std::string exchange_precision = wfcpw->get_precision(); + rhopw_dev = new ModulePW::PW_Basis(exchange_device, exchange_precision); + rhopw_dev->fft_bundle.setfft(exchange_device, exchange_precision); #ifdef __MPI rhopw_dev->initmpi(rhopw->poolnproc, rhopw->poolrank, rhopw->pool_world); #endif @@ -115,14 +122,20 @@ OperatorEXXPW::OperatorEXXPW(const int* isk_in, auto param_erfc = this->coulomb_param[Conv_Coulomb_Pot_K::Coulomb_Type::Erfc]; for (auto param: param_erfc) { - erfc_div.push_back(exx_divergence(Conv_Coulomb_Pot_K::Coulomb_Type::Erfc, - std::stod(param["omega"]), - kv, - wfcpw, - rhopw_dev, - tpiba, - gamma_extrapolation, - ucell->omega)); + double correction = 0.0; + if (param.at("singularity_correction") == "gygi") + { + const double omega = std::stod(param.at("omega")); + correction = exx_divergence(Conv_Coulomb_Pot_K::Coulomb_Type::Erfc, + omega, + kv, + wfcpw, + rhopw_dev, + tpiba, + gamma_extrapolation, + ucell->omega); + } + erfc_div.push_back(correction); } } // end of constructor @@ -225,6 +238,58 @@ void OperatorEXXPW::act(const int nbands, } } +template +void OperatorEXXPW::set_source(std::unique_ptr source_basis, + std::unique_ptr source_points, + const psi::Psi& source_psi, + ModuleBase::matrix source_weights) +{ + if (exxace_ || gamma_extrapolation || exx_sg_init) + { + ModuleBase::WARNING_QUIT("OperatorEXXPW", "Independent EXX sources require direct exchange without gamma extrapolation, before FFT initialization"); + } + if (source_basis->nks != source_points->get_nks() || source_psi.get_nk() != source_basis->nks + || source_weights.nr != source_basis->nks || source_weights.nc != source_psi.get_nbands() + || source_psi.get_nbasis() != source_basis->npwk_max + || source_basis->nx != wfcpw->nx || source_basis->ny != wfcpw->ny || source_basis->nz != wfcpw->nz + || source_basis->nrxx != wfcpw->nrxx || source_basis->poolnproc != wfcpw->poolnproc) + { + ModuleBase::WARNING_QUIT("OperatorEXXPW", "Incompatible EXX source dimensions or FFT distribution"); + } + owned_source_basis_ = std::move(source_basis); + owned_source_points_ = std::move(source_points); + owned_source_weights_ = std::move(source_weights); + source_basis_ = owned_source_basis_.get(); + source_points_ = owned_source_points_.get(); + wg = &owned_source_weights_; + psi = source_psi; + // Cache the Gygi-Baldereschi auxiliary correction on the frozen source mesh, rather than + // the independent target path. Limits keeps this correction at zero. + const auto screened = coulomb_param.find(Conv_Coulomb_Pot_K::Coulomb_Type::Erfc); + if (screened != coulomb_param.end()) + { + for (std::size_t i = 0; i < screened->second.size(); ++i) + { + const auto& param = screened->second[i]; + erfc_div[i] = 0.0; + if (param.at("singularity_correction") == "gygi") + { + const double omega = std::stod(param.at("omega")); + erfc_div[i] = exx_divergence(Conv_Coulomb_Pot_K::Coulomb_Type::Erfc, + omega, + source_points_, + source_basis_, + rhopw_dev, + tpiba, + gamma_extrapolation, + ucell->omega); + } + } + } + q_points.clear(); + first_iter = false; +} + template void OperatorEXXPW::act_op(const int nbands, const int nbasis, @@ -245,7 +310,7 @@ void OperatorEXXPW::act_op(const int nbands, auto q_points = get_q_points(this->ik); int nk_fac = nspin_ == 2 ? 2 : 1; - int nk = wfcpw->nks / nk_fac; + int nk = source_basis_->nks / nk_fac; const Real nqs = q_points.size(); maybe_setup_exx_grid(); @@ -254,7 +319,8 @@ void OperatorEXXPW::act_op(const int nbands, for (int iq: q_points) { - get_exx_potential(kv, wfcpw, rhopw_dev, pot, tpiba, gamma_extrapolation, ucell->omega, this->ik, iq % nk, false, this->coulomb_param); + const int iq_nospin = iq % nk; + get_exx_potential(source_points_, wfcpw, rhopw_dev, pot, tpiba, gamma_extrapolation, ucell->omega, this->ik, iq_nospin, false, this->coulomb_param); for (int m_iband = 0; m_iband < psi.get_nbands(); m_iband++) { // occupation of the source state (m, iq), not of the target k-point @@ -264,10 +330,18 @@ void OperatorEXXPW::act_op(const int nbands, continue; } - wfc_to_real_exx(get_pw(m_iband, iq), iq, nbasis); + const T* source_band = get_pw(m_iband, iq); + if (source_basis_ == wfcpw) + { + wfc_to_real_exx(source_band, iq, psi.get_nbasis()); + } + else + { + source_basis_->recip_to_real(ctx, source_band, psi_mq_real, iq); + } // full accumulation weight, hybrid_alpha included - const Real factor = this->hybrid_alpha * wg_mqb_real / kv->wk[iq] / nqs; + const Real factor = this->hybrid_alpha * wg_mqb_real / source_points_->wk[iq] / nqs; apply_fock_all_bands(nbands, nbasis, iq, factor, tmhpsi); } // end of m_iband @@ -390,6 +464,11 @@ void OperatorEXXPW::maybe_setup_exx_grid() const return; } #endif + if (source_basis_ != wfcpw) + { + exx_sg_init = true; + return; + } setup_exx_small_grid(); if (std::is_same::value && !exx_sg_ok) { @@ -402,6 +481,10 @@ void OperatorEXXPW::maybe_setup_exx_grid() const template bool OperatorEXXPW::exx_grid_active() const { + if (source_basis_ != wfcpw) + { + return false; + } #if !defined(__CUDA) if (!std::is_same::value) { @@ -872,7 +955,7 @@ std::vector OperatorEXXPW::get_q_points(const int ik) const // if () // downsampling { - for (int iq = 0; iq < wfcpw->nks; iq++) + for (int iq = 0; iq < source_basis_->nks; iq++) { if (nspin_ ==1 ) { @@ -880,9 +963,7 @@ std::vector OperatorEXXPW::get_q_points(const int ik) const } else if (nspin_ == 2) { - int nk_fac = 2; - int nk = wfcpw->nks / nk_fac; - if (iq / nk == ik / nk) + if (source_points_->isk[iq] == isk[ik]) { q_points_ik.push_back(iq); } @@ -895,7 +976,7 @@ std::vector OperatorEXXPW::get_q_points(const int ik) const } // else // { - // for (int iq = 0; iq < wfcpw->nks; iq++) + // for (int iq = 0; iq < source_basis_->nks; iq++) // { // kv-> // } @@ -932,9 +1013,16 @@ template template OperatorEXXPW::OperatorEXXPW(const OperatorEXXPW *op) { + if (op->owned_source_basis_ || op->owned_source_points_) + { + ModuleBase::WARNING_QUIT("OperatorEXXPW", + "Precision conversion after EXX source installation is unsupported"); + } // copy all the datas this->isk = op->isk; this->wfcpw = op->wfcpw; + this->source_basis_ = op->source_basis_; + this->source_points_ = op->source_points_; this->rhopw = op->rhopw; this->rhopw_dev = op->rhopw_dev; this->psi = op->psi; @@ -1030,7 +1118,8 @@ double OperatorEXXPW::cal_exx_energy_op(psi::Psi *ppsi_) c for (int iq: q_points_ik) { - get_exx_potential(kv, wfcpw, rhopw_dev, pot, tpiba, gamma_extrapolation, ucell->omega, ik, iq % nk, false, this->coulomb_param); + const int iq_nospin = iq % nk; + get_exx_potential(kv, wfcpw, rhopw_dev, pot, tpiba, gamma_extrapolation, ucell->omega, ik, iq_nospin, false, this->coulomb_param); for (int m_iband = 0; m_iband < nb; m_iband++) { const double wg_iqb_real = (*wg)(iq, m_iband); diff --git a/source/source_pw/module_pwdft/op_pw_exx.h b/source/source_pw/module_pwdft/op_pw_exx.h index 6e0131ab83..2715a49716 100644 --- a/source/source_pw/module_pwdft/op_pw_exx.h +++ b/source/source_pw/module_pwdft/op_pw_exx.h @@ -59,6 +59,14 @@ class OperatorEXXPW : public OperatorPW void set_wg(const ModuleBase::matrix *wg_in) { wg = wg_in; } + // The source orbitals remain fixed while target states are diagonalized. + // Takes ownership of the frozen ensemble: the operator keeps observer pointers + // to these objects, so their lifetime must match the operator's own. + void set_source(std::unique_ptr source_basis, + std::unique_ptr source_points, + const psi::Psi& source_psi, + ModuleBase::matrix source_weights); + void construct_ace() const; bool first_iter = true; @@ -71,6 +79,13 @@ class OperatorEXXPW : public OperatorPW private: const int* isk = nullptr; const ModulePW::PW_Basis_K* wfcpw = nullptr; + const ModulePW::PW_Basis_K* source_basis_ = nullptr; + const K_Vectors* source_points_ = nullptr; + // Owned frozen SCF source for hybrid NSCF; null in ordinary SCF, where the + // observer pointers above alias wfcpw/kv instead. + std::unique_ptr owned_source_basis_; + std::unique_ptr owned_source_points_; + ModuleBase::matrix owned_source_weights_; const ModulePW::PW_Basis* rhopw = nullptr; ModulePW::PW_Basis* rhopw_dev = nullptr; // for device const UnitCell *ucell = nullptr; diff --git a/source/source_pw/module_pwdft/op_pw_exx_pot.cpp b/source/source_pw/module_pwdft/op_pw_exx_pot.cpp index 6094868def..6ae2a6d2c3 100644 --- a/source/source_pw/module_pwdft/op_pw_exx_pot.cpp +++ b/source/source_pw/module_pwdft/op_pw_exx_pot.cpp @@ -137,7 +137,7 @@ void get_exx_potential(const K_Vectors* kv, } } - const int nk_fac = PARAM.inp.nspin == 2 ? 2 : 1; + const int nk_fac = kv->get_spin_mult(); const int nk = nks / nk_fac; Real gg = (k_c - q_c + rhopw_dev->gcar[ig]).norm2() * tpiba2; @@ -167,9 +167,8 @@ void get_exx_potential(const K_Vectors* kv, double erfc_omega = std::stod(param["omega"]); double erfc_omega2 = erfc_omega * erfc_omega; double alpha = std::stod(param["alpha"]); - // Like the Fock correction, this global q sum is initialized by - // the operator. Recomputing it here would require idle pools to - // join a collective after their local k-point bounds check. + // Initialized on the SCF mesh, or replaced with the frozen source + // correction by set_source. The shared limits scheme stores zero. const double exx_div = OperatorEXXPW, Device>::erfc_div[i]; const ModuleBase::Vector3 k_c = wfcpw->kvec_c[ik]; const ModuleBase::Vector3 k_d = wfcpw->kvec_d[ik]; @@ -205,7 +204,7 @@ void get_exx_potential(const K_Vectors* kv, } } - const int nk_fac = PARAM.inp.nspin == 2 ? 2 : 1; + const int nk_fac = kv->get_spin_mult(); const int nk = nks / nk_fac; // const int ig_kq = ik * nks * npw + iq * npw + ig; @@ -324,7 +323,7 @@ void get_exx_stress_potential(const K_Vectors* kv, } } - const int nk_fac = PARAM.inp.nspin == 2 ? 2 : 1; + const int nk_fac = kv->get_spin_mult(); const int nk = nks / nk_fac; // const int ig_kq = ik * nks * npw + iq * npw + ig; @@ -391,7 +390,7 @@ void get_exx_stress_potential(const K_Vectors* kv, } } - const int nk_fac = PARAM.inp.nspin == 2 ? 2 : 1; + const int nk_fac = kv->get_spin_mult(); const int nk = nks / nk_fac; // const int ig_kq = ik * nks * npw + iq * npw + ig; @@ -442,7 +441,7 @@ double exx_divergence(Conv_Coulomb_Pot_K::Coulomb_Type coulomb_type, double nqs_half2 = 0.5 * kv->nmp[1]; double nqs_half3 = 0.5 * kv->nmp[2]; - int nk_fac = PARAM.inp.nspin == 2 ? 2 : 1; + const int nk_fac = kv->get_spin_mult(); // here we follow the exx_divergence subroutine in q-e (PW/src/exx_base.f90) double alpha = 10.0 / wfcpw->gk_ecut; diff --git a/source/source_pw/module_pwdft/pw_hybrid_nscf.cpp b/source/source_pw/module_pwdft/pw_hybrid_nscf.cpp new file mode 100644 index 0000000000..3969f78d57 --- /dev/null +++ b/source/source_pw/module_pwdft/pw_hybrid_nscf.cpp @@ -0,0 +1,357 @@ +#include "pw_hybrid_nscf.h" +#include "pw_hybrid_source.h" +#include "source_io/module_wf/read_wfc_pw.h" +#include "source_base/module_out/filename.h" +#include "source_hamilt/module_xc/general_exx_info.h" +#include "source_pw/module_pwdft/op_pw_exx.h" +#include "source_cell/unitcell.h" +#include "source_io/module_parameter/input_parameter.h" +#include "source_base/parallel_device.h" +#include "source_base/timer.h" +#include "source_base/tool_quit.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace pw +{ +namespace +{ +// Check the stored Miller mapping before delegating coefficient loading to the unchanged IO reader. +void validate_source_grid(const std::string& filename, const ModulePW::PW_Basis_K& basis, int iq) +{ + std::ifstream in(filename, std::ios::binary); + const auto header = read_exx_source_header(in); + in.seekg(160); + int record = 0; + in.read(reinterpret_cast(&record), sizeof(record)); + if (record != 12LL * header.npw) + { + throw std::runtime_error("Invalid EXX source Miller record"); + } + const int grid[3] = {basis.nx, basis.ny, basis.nz}; + std::set indices; + for (int ig = 0; ig < header.npw; ++ig) + { + int miller[3] = {}; + ModuleBase::Vector3 direct_g; + for (int axis = 0; axis < 3; ++axis) + { + in.read(reinterpret_cast(&miller[axis]), sizeof(int)); + if (!in || miller[axis] < 0 || miller[axis] >= grid[axis]) + { + throw std::runtime_error("EXX source Miller index is incompatible with FFT grid"); + } + direct_g[axis] = miller[axis] <= grid[axis] / 2 ? miller[axis] : miller[axis] - grid[axis]; + } + const auto gk = direct_g * basis.G + basis.kvec_c[iq]; + const long long index = (static_cast(miller[0]) * basis.ny + miller[1]) * basis.nz + miller[2]; + if (gk.norm2() > basis.gk_ecut * (1.0 + 1e-10) || !indices.insert(index).second) + { + throw std::runtime_error("EXX source Miller mapping is incompatible with FFT basis"); + } + } +} + +bool source_parameter_matches(const std::string& key, std::string source_value, std::string target_value) +{ + if (key == "dft_functional") + { + const auto lowercase = [](unsigned char value) { return std::tolower(value); }; + std::transform(source_value.begin(), source_value.end(), source_value.begin(), lowercase); + std::transform(target_value.begin(), target_value.end(), target_value.begin(), lowercase); + } + if (source_value == target_value) + { + return true; + } + std::istringstream source(source_value); + std::istringstream target(target_value); + double source_number = 0; + double target_number = 0; + if (!(source >> source_number) || !(target >> target_number)) + { + return false; + } + std::string remaining; + if ((source >> remaining) || (target >> remaining)) + { + return false; + } + // INPUT.info may print doubles with the standard six significant digits. + const double scale = std::max(std::abs(source_number), std::abs(target_number)); + return std::isfinite(source_number) && std::isfinite(target_number) + && std::abs(source_number - target_number) <= 5e-6 * scale; +} + +void warn_source_configuration(const Input_para& inp, const std::string& readin_dir) +{ + std::map expected; + expected["dft_functional"] = inp.dft_functional; + expected["exx_singularity_correction"] = inp.exx_singularity_correction; + const std::vector>> terms = { + {"exx_erfc_alpha", inp.exx_erfc_alpha}, + {"exx_erfc_omega", inp.exx_erfc_omega}, + {"exx_fock_alpha", inp.exx_fock_alpha}}; + for (const auto& term : terms) + { + std::ostringstream value; + for (const auto& number : term.second) + { + // Zero-valued Fock coefficients are equivalent to omitting the term. + if (term.first == "exx_fock_alpha" && std::stod(number) == 0.0) + { + continue; + } + value << number << ' '; + } + expected[term.first] = value.str(); + } + std::ostringstream cutoff; + cutoff << inp.ecutexx; + expected["ecutexx"] = cutoff.str(); + expected["exx_gamma_extra"] = inp.exx_gamma_extra ? "1" : "0"; + std::ifstream input(readin_dir + "INPUT.info"); + std::string line; + std::map saved; + while (std::getline(input, line)) + { + line = line.substr(0, line.find('#')); + std::istringstream record(line); + std::string key; + record >> key; + if (expected.count(key)) + { + std::getline(record, saved[key]); + } + } + for (const auto& item : expected) + { + if (!saved.count(item.first)) + { + ModuleBase::WARNING("PW_Hybrid_NSCF", "EXX source configuration is incomplete or unavailable in INPUT.info; " + "continuing with existing wavefunctions and eig_occ.txt. Verify the source SCF settings."); + return; + } + std::istringstream original(saved[item.first]); + std::istringstream current(item.second); + std::string source_value; + std::string target_value; + bool mismatch = false; + while (original >> source_value) + { + // Mirror the target-side normalization for saved zero Fock coefficients. + if (item.first == "exx_fock_alpha" && std::stod(source_value) == 0.0) + { + continue; + } + if (!(current >> target_value)) + { + mismatch = true; + break; + } + if (!source_parameter_matches(item.first, source_value, target_value)) + { + mismatch = true; + } + } + if (current >> target_value) + { + mismatch = true; + } + if (mismatch) + { + const std::string message = "EXX source configuration differs for " + item.first + + "; continuing with the frozen SCF source and current NSCF exchange settings. " + "Use matching settings for consistent SCF/NSCF bands."; + ModuleBase::WARNING("PW_Hybrid_NSCF", message); + } + } +} +} + +void validate_hybrid_nscf(const Input_para& inp, const General_Exx_Info& info) +{ + if (inp.calculation != "nscf" || !info.cal_exx) + { + return; + } + bool has_fock = false; + const auto fock = info.coulomb_param.find(Conv_Coulomb_Pot_K::Coulomb_Type::Fock); + if (fock != info.coulomb_param.end()) + { + // An explicit zero coefficient (`exx_fock_alpha 0`) retains a Fock entry but is + // equivalent to omitting the term; only a nonzero coefficient is unscreened exchange. + for (const auto& term : fock->second) + { + if (std::stod(term.at("alpha")) != 0.0) + { + has_fock = true; + break; + } + } + } + bool compatible_device = inp.device == "cpu"; +#ifdef __CUDA + compatible_device = compatible_device || inp.device == "gpu"; +#endif + const bool compatible_execution = compatible_device && inp.kpar == 1 && inp.bndpar == 1 && inp.nspin != 4; + const bool compatible_exchange = !inp.exxace && !inp.exx_gamma_extra && !has_fock; + const bool compatible_targets = inp.symmetry != "1" && inp.init_wfc != "file" && !inp.cal_force && !inp.cal_stress; + if (!compatible_execution || !compatible_exchange || !compatible_targets) + { + ModuleBase::WARNING_QUIT("PW_Hybrid_NSCF", + "Hybrid NSCF currently requires CPU or CUDA GPU, kpar=bndpar=1, nspin=1/2, symmetry=-1/0, " + "exxace=false, exx_gamma_extra=false, screened exchange, " + "cal_force=cal_stress=false and fresh target wavefunctions"); + } +} + +template +void prepare_exx_nscf(const Input_para& inp, + const UnitCell& ucell, + const ModulePW::PW_Basis_K* pw_wfc, + hamilt::OperatorEXXPW& op_exx, + const std::string& readin_dir) +{ + ModuleBase::timer::start("PW_Hybrid_NSCF", "prepare_exx_nscf"); + std::unique_ptr source_points(new K_Vectors); + ModuleBase::matrix source_weights; + warn_source_configuration(inp, readin_dir); + const int spin_mult = inp.nspin == 2 ? 2 : 1; + const std::vector first_index(1, 0); + const std::string first_filename = ModuleIO::filename_output(readin_dir, "wf", "pw", 0, + first_index, inp.nspin, spin_mult, 2, false, false, -1); + std::vector headers; + try + { + std::ifstream first(first_filename, std::ios::binary); + const auto header = read_exx_source_header(first); + const int nks = header.nks; + if (nks % spin_mult != 0) + { + throw std::runtime_error("Invalid EXX source spin dimensions"); + } + source_points->set_nks(nks); + source_points->set_nkstot(nks); + const int nq = nks / spin_mult; + source_points->set_nkstot_nospin(nq); + source_points->set_spin_mult(spin_mult); + source_points->kvec_d.resize(nks); + source_points->kvec_c.resize(nks); + source_points->wk.resize(nks); + source_points->isk.resize(nks); + source_points->ngk.resize(nks); + source_points->ik2iktot.resize(nks); + for (int iq = 0; iq < nks; ++iq) + { + source_points->ik2iktot[iq] = iq; + } + const ModuleBase::Matrix3 inverse_reciprocal = ucell.G.Inverse(); + for (int iq = 0; iq < nks; ++iq) + { + const std::string filename = ModuleIO::filename_output(readin_dir, "wf", "pw", iq, + source_points->ik2iktot, inp.nspin, nks, 2, false, false, -1); + std::ifstream in(filename, std::ios::binary); + const auto metadata = read_exx_source_header(in); + if (metadata.ecutwfc != inp.ecutwfc) + { + throw std::runtime_error("EXX source wavefunction cutoff differs from the current basis"); + } + headers.push_back(metadata); + auto& q = source_points->kvec_c[iq]; + q.x = metadata.kvec_c[0]; + q.y = metadata.kvec_c[1]; + q.z = metadata.kvec_c[2]; + source_points->kvec_d[iq] = q * inverse_reciprocal; + source_points->wk[iq] = metadata.weight; + source_points->isk[iq] = iq / nq; + } + std::ifstream occupations(readin_dir + "eig_occ.txt"); + read_exx_source_occupations(occupations, headers, inp.nspin, source_weights); + } + catch (const std::exception& error) + { + ModuleBase::WARNING_QUIT("PW_Hybrid_NSCF", error.what()); + } + const int nqs = source_points->get_nks(); + int nq = source_points->get_nkstot_nospin(); + source_points->para_k.kinfo(nq, 1, 0, pw_wfc->poolrank, pw_wfc->poolnproc, inp.nspin); + std::unique_ptr source_basis( + new ModulePW::PW_Basis_K(inp.device, inp.precision)); +#ifdef __MPI + source_basis->initmpi(pw_wfc->poolnproc, pw_wfc->poolrank, pw_wfc->pool_world); +#endif + source_basis->initgrids(ucell.lat0, ucell.latvec, + pw_wfc->nx, pw_wfc->ny, pw_wfc->nz); + source_basis->initparameters(false, inp.ecutwfc, nqs, source_points->kvec_d.data()); + // Preserve the exact stored Cartesian coordinates expected by the existing reader. + for (int iq = 0; iq < nqs; ++iq) + { + source_basis->kvec_c[iq] = source_points->kvec_c[iq]; + } + source_basis->fft_bundle.initfftmode(inp.fft_mode); + source_basis->setuptransform(); + source_basis->collect_local_pw(inp.erf_ecut, inp.erf_height, inp.erf_sigma); + for (int iq = 0; iq < nqs; ++iq) + { + source_points->ngk[iq] = source_basis->npwk[iq]; + } + const int nbands = source_weights.nc; + const int nbasis = source_basis->npwk_max; + std::unique_ptr> source_psi( + new psi::Psi(nqs, nbands, nbasis, source_points->ngk, true)); + for (int iq = 0; iq < nqs; ++iq) + { + const std::string wfc_filename = ModuleIO::filename_output(readin_dir, "wf", "pw", iq, + source_points->ik2iktot, inp.nspin, nqs, 2, false, false, -1); + try + { + validate_source_grid(wfc_filename, *source_basis, iq); + } + catch (const std::exception& error) + { + ModuleBase::WARNING_QUIT("PW_Hybrid_NSCF", error.what()); + } + ModuleBase::ComplexMatrix wfc(nbands, nbasis); + ModuleIO::read_wfc_pw(wfc_filename, source_basis.get(), pw_wfc->poolrank, + pw_wfc->poolnproc, nbands, 1, iq, iq, nqs, wfc); + source_psi->fix_k(iq); + std::vector coefficients(nbands * nbasis); + for (int ib = 0; ib < nbands; ++ib) + { + for (int ig = 0; ig < nbasis; ++ig) + { + coefficients[ib * nbasis + ig] = static_cast(wfc(ib, ig)); + } + } + base_device::memory::synchronize_memory_op()( + source_psi->get_pointer(), coefficients.data(), coefficients.size()); + } + op_exx.set_source(std::move(source_basis), std::move(source_points), + *source_psi, std::move(source_weights)); + ModuleBase::timer::end("PW_Hybrid_NSCF", "prepare_exx_nscf"); +} + + +template void prepare_exx_nscf, base_device::DEVICE_CPU>( + const Input_para&, const UnitCell&, const ModulePW::PW_Basis_K*, + hamilt::OperatorEXXPW, base_device::DEVICE_CPU>&, const std::string&); +template void prepare_exx_nscf, base_device::DEVICE_CPU>( + const Input_para&, const UnitCell&, const ModulePW::PW_Basis_K*, + hamilt::OperatorEXXPW, base_device::DEVICE_CPU>&, const std::string&); +#if defined(__CUDA) || defined(__ROCM) +template void prepare_exx_nscf, base_device::DEVICE_GPU>( + const Input_para&, const UnitCell&, const ModulePW::PW_Basis_K*, + hamilt::OperatorEXXPW, base_device::DEVICE_GPU>&, const std::string&); +template void prepare_exx_nscf, base_device::DEVICE_GPU>( + const Input_para&, const UnitCell&, const ModulePW::PW_Basis_K*, + hamilt::OperatorEXXPW, base_device::DEVICE_GPU>&, const std::string&); +#endif +} // namespace pw diff --git a/source/source_pw/module_pwdft/pw_hybrid_nscf.h b/source/source_pw/module_pwdft/pw_hybrid_nscf.h new file mode 100644 index 0000000000..c1ca6eb71d --- /dev/null +++ b/source/source_pw/module_pwdft/pw_hybrid_nscf.h @@ -0,0 +1,31 @@ +#ifndef PW_HYBRID_NSCF_H +#define PW_HYBRID_NSCF_H + +#include + +struct Input_para; +struct General_Exx_Info; +class UnitCell; +namespace hamilt +{ +template +class OperatorEXXPW; +} +namespace ModulePW +{ +class PW_Basis_K; +} +namespace pw +{ +void validate_hybrid_nscf(const Input_para& inp, const General_Exx_Info& info); + +// Read the frozen SCF ensemble in readin_dir and install it into the EXX operator, +// which takes ownership for its whole remaining lifetime. +template +void prepare_exx_nscf(const Input_para& inp, + const UnitCell& ucell, + const ModulePW::PW_Basis_K* pw_wfc, + hamilt::OperatorEXXPW& op_exx, + const std::string& readin_dir); +} +#endif diff --git a/source/source_pw/module_pwdft/pw_hybrid_source.cpp b/source/source_pw/module_pwdft/pw_hybrid_source.cpp new file mode 100644 index 0000000000..138c87392f --- /dev/null +++ b/source/source_pw/module_pwdft/pw_hybrid_source.cpp @@ -0,0 +1,168 @@ +#include "pw_hybrid_source.h" + +#include "source_base/matrix.h" + +#include +#include +#include +#include +#include +#include + +namespace +{ +template +void read_binary(std::istream& in, T& value) +{ + in.read(reinterpret_cast(&value), sizeof(T)); + if (!in) + { + throw std::runtime_error("Missing or truncated EXX source wavefunction"); + } +} +} + +pw::ExxSourceHeader pw::read_exx_source_header(std::istream& in) +{ + ExxSourceHeader header{}; + int record = 0; + read_binary(in, record); + if (record != 72) + { + throw std::runtime_error("Invalid EXX source wavefunction header"); + } + read_binary(in, header.ik); + read_binary(in, header.nks); + for (double& coordinate : header.kvec_c) + { + read_binary(in, coordinate); + if (!std::isfinite(coordinate)) + { + throw std::runtime_error("Invalid EXX source wavefunction k point"); + } + } + read_binary(in, header.weight); + read_binary(in, header.npw); + read_binary(in, header.nbands); + read_binary(in, header.ecutwfc); + read_binary(in, header.lat0); + read_binary(in, header.tpiba); + read_binary(in, record); + if (record != 72 || header.ik <= 0 || header.nks < header.ik || header.nks > 100000 + || header.nbands <= 0 || header.nbands > 100000 || header.npw <= 0 + || !std::isfinite(header.weight) || header.weight <= 0 + || !std::isfinite(header.ecutwfc) || header.ecutwfc <= 0 + || !std::isfinite(header.lat0) || header.lat0 <= 0 + || !std::isfinite(header.tpiba) || header.tpiba <= 0) + { + throw std::runtime_error("Invalid EXX source wavefunction dimensions or metadata"); + } + // Two 72-byte records, a Miller-index record, and complex band records. + const long long expected_bytes = 160LL + 8 + 12LL * header.npw + + header.nbands * (8LL + 16LL * header.npw); + in.seekg(0, std::ios::end); + if (!in || in.tellg() != expected_bytes) + { + throw std::runtime_error("Truncated or invalid EXX source wavefunction size"); + } + return header; +} + +void pw::read_exx_source_occupations(std::istream& in, + const std::vector& headers, + int nspin, + ModuleBase::matrix& weights) +{ + const int spin_mult = nspin == 2 ? 2 : 1; + const int nks = headers.size(); + if ((nspin != 1 && nspin != 2) || nks == 0 || nks % spin_mult != 0) + { + throw std::runtime_error("Invalid EXX source spin dimensions"); + } + const int nq = nks / spin_mult; + const int nbands = headers.front().nbands; + if (static_cast(nks) * nbands > 100000000) + { + throw std::runtime_error("Invalid EXX source occupation dimensions"); + } + std::string line; + std::getline(in, line); + std::getline(in, line); + std::getline(in, line); + int saved_spin = 0; + if (std::sscanf(line.c_str(), " Spin number %d", &saved_spin) != 1 || saved_spin != nspin) + { + throw std::runtime_error("Missing or incompatible EXX source eig_occ.txt"); + } + weights.create(nks, nbands); + const double expected_weight = nspin == 1 ? 2.0 / nq : 1.0 / nq; + for (int iq = 0; iq < nks; ++iq) + { + const auto& header = headers[iq]; + do + { + if (!std::getline(in, line)) + { + throw std::runtime_error("Truncated EXX source eig_occ.txt"); + } + } while (line.find_first_not_of(" \t\r") == std::string::npos); + int spin = 0; + int index = 0; + int total = 0; + int npw = 0; + double q[3] = {}; + const int fields = std::sscanf(line.c_str(), + " spin=%d k-point=%d/%d Cartesian=%lf %lf %lf (%d plane wave)", + &spin, &index, &total, &q[0], &q[1], &q[2], &npw); + if (fields != 7 || spin != iq / nq + 1 || index != iq % nq + 1 || total != nq + || npw != header.npw || header.ik != iq + 1 || header.nks != nks + || header.nbands != nbands || std::abs(header.weight - expected_weight) > 1e-10) + { + throw std::runtime_error("EXX source requires matching eig_occ.txt and a complete uniform q mesh"); + } + for (int axis = 0; axis < 3; ++axis) + { + if (nspin == 2 && iq >= nq && header.kvec_c[axis] != headers[iq - nq].kvec_c[axis]) + { + throw std::runtime_error("EXX source spin channels must use the same q mesh"); + } + // eig_occ.txt prints Cartesian coordinates with at least eight significant digits. + const double tolerance = 5e-8 * std::max(1.0, std::abs(header.kvec_c[axis])); + if (!std::isfinite(q[axis]) || std::abs(q[axis] - header.kvec_c[axis]) > tolerance) + { + throw std::runtime_error("EXX source eig_occ.txt k point differs from wavefunction"); + } + } + for (int ib = 0; ib < nbands; ++ib) + { + std::getline(in, line); + std::istringstream band(line); + double energy = 0; + band >> index >> energy >> weights(iq, ib); + const bool parsed = static_cast(band); + std::string extra; + const bool trailing = static_cast(band >> extra); + if (!parsed || trailing || index != ib + 1 || !std::isfinite(energy) + || !std::isfinite(weights(iq, ib))) + { + throw std::runtime_error("Invalid EXX source occupation in eig_occ.txt"); + } + if (weights(iq, ib) < 0 || weights(iq, ib) > expected_weight + 1e-10) + { + // Methfessel-Paxton smearing can write occupations below zero or above + // the k-point weight, and the EXX operator silently drops wg < 1e-12; + // only non-negative occupation schemes are supported. + throw std::runtime_error( + "EXX source eig_occ.txt occupation is outside [0, k-point weight]; " + "Methfessel-Paxton smearing (mp/mp2/mp3) can produce such occupations, " + "which hybrid NSCF does not support. Rerun the SCF source with " + "smearing_method fixed, gauss, mv or fd"); + } + } + } + in >> std::ws; + if (!in.eof()) + { + throw std::runtime_error("Unexpected trailing EXX source eig_occ.txt data; use a single SCF snapshot"); + } +} diff --git a/source/source_pw/module_pwdft/pw_hybrid_source.h b/source/source_pw/module_pwdft/pw_hybrid_source.h new file mode 100644 index 0000000000..786730d7de --- /dev/null +++ b/source/source_pw/module_pwdft/pw_hybrid_source.h @@ -0,0 +1,37 @@ +#ifndef PW_HYBRID_SOURCE_H +#define PW_HYBRID_SOURCE_H + +#include +#include + +namespace ModuleBase +{ +class matrix; +} + +namespace pw +{ +// Metadata already present in the existing binary PW wavefunction format. +struct ExxSourceHeader +{ + int ik; + int nks; + int npw; + int nbands; + double kvec_c[3]; + double weight; + double ecutwfc; + double lat0; + double tpiba; +}; + +ExxSourceHeader read_exx_source_header(std::istream& in); + +// Read the existing, k-weighted occupation column without changing its format. +void read_exx_source_occupations(std::istream& in, + const std::vector& headers, + int nspin, + ModuleBase::matrix& weights); + +} +#endif diff --git a/source/source_pw/module_pwdft/test/CMakeLists.txt b/source/source_pw/module_pwdft/test/CMakeLists.txt index a6cad027a3..bcbb411578 100644 --- a/source/source_pw/module_pwdft/test/CMakeLists.txt +++ b/source/source_pw/module_pwdft/test/CMakeLists.txt @@ -93,3 +93,9 @@ AddTest( ../../../source_cell/cal_nelec_nband.cpp ../../../source_cell/read_orb.cpp ) + +AddTest( + TARGET MODULE_PW_pw_hybrid_source + LIBS base device + SOURCES test_pw_hybrid_source.cpp ../pw_hybrid_source.cpp +) diff --git a/source/source_pw/module_pwdft/test/test_pw_hybrid_source.cpp b/source/source_pw/module_pwdft/test/test_pw_hybrid_source.cpp new file mode 100644 index 0000000000..3e92154f82 --- /dev/null +++ b/source/source_pw/module_pwdft/test/test_pw_hybrid_source.cpp @@ -0,0 +1,147 @@ +#include "source_pw/module_pwdft/pw_hybrid_source.h" +#include "source_base/matrix.h" + +#include "gtest/gtest.h" + +#include +#include +#include +#include + +namespace +{ +std::vector source_headers(int nspin) +{ + const int nks = nspin == 2 ? 4 : 2; + std::vector headers(nks); + for (int iq = 0; iq < nks; ++iq) + { + auto& header = headers[iq]; + header.ik = iq + 1; + header.nks = nks; + header.npw = 100; + header.nbands = 3; + header.kvec_c[0] = 0.123456789123456 * (iq % 2); + header.weight = nspin == 1 ? 1.0 : 0.5; + } + return headers; +} + +std::string eig_occ(int nspin) +{ + const auto headers = source_headers(nspin); + std::ostringstream out; + out << "1 # ionic step\n Electronic state energy (eV) and occupations\n Spin number " << nspin << '\n'; + for (int iq = 0; iq < headers.size(); ++iq) + { + const auto& header = headers[iq]; + out << " spin=" << iq / 2 + 1 << " k-point=" << iq % 2 + 1 + << "/2 Cartesian=" << std::setprecision(8) << header.kvec_c[0] + << " 0 0 (100 plane wave)\n"; + out << "1 -1 " << header.weight << "\n2 0 " << header.weight * 0.125 << "\n3 1 0\n\n"; + } + return out.str(); +} +} + +TEST(PWHybridSource, ReadsExistingWeightedOccupationsForBothSpins) +{ + for (int nspin = 1; nspin <= 2; ++nspin) + { + const auto headers = source_headers(nspin); + std::istringstream in(eig_occ(nspin)); + ModuleBase::matrix weights; + pw::read_exx_source_occupations(in, headers, nspin, weights); + EXPECT_EQ(weights.nr, headers.size()); + EXPECT_EQ(weights.nc, 3); + EXPECT_DOUBLE_EQ(weights(1, 1), headers[1].weight * 0.125); + } +} + +TEST(PWHybridSource, RejectsInvalidExistingOccupationFiles) +{ + const auto headers = source_headers(1); + ModuleBase::matrix weights; + const std::string saved = eig_occ(1); + std::istringstream truncated(saved.substr(0, saved.size() - 6)); + EXPECT_THROW(pw::read_exx_source_occupations(truncated, headers, 1, weights), std::runtime_error); + std::istringstream trailing(saved + saved); + EXPECT_THROW(pw::read_exx_source_occupations(trailing, headers, 1, weights), std::runtime_error); + std::istringstream wrong_spin(saved); + EXPECT_THROW(pw::read_exx_source_occupations(wrong_spin, headers, 2, weights), std::runtime_error); + auto changed = headers; + changed[1].kvec_c[0] += 0.1; + std::istringstream wrong_coordinates(saved); + EXPECT_THROW(pw::read_exx_source_occupations(wrong_coordinates, changed, 1, weights), std::runtime_error); + std::string invalid = saved; + invalid.replace(invalid.find("0.125"), 5, "-0.25"); + std::istringstream negative(invalid); + try + { + // A negative occupation is what a Methfessel-Paxton source can produce; the + // diagnostic must name the unsupported smearing rather than report invalid data. + pw::read_exx_source_occupations(negative, headers, 1, weights); + FAIL() << "Expected std::runtime_error"; + } + catch (const std::runtime_error& error) + { + EXPECT_NE(std::string(error.what()).find("Methfessel-Paxton"), std::string::npos); + EXPECT_NE(std::string(error.what()).find("smearing_method fixed"), std::string::npos); + } +} + +TEST(PWHybridSource, RejectsDifferentMeshesInSpinChannels) +{ + auto headers = source_headers(2); + headers[2].kvec_c[0] = 0.2; + std::string saved = eig_occ(2); + const std::string original = "spin=2 k-point=1/2 Cartesian=0"; + const std::size_t location = saved.find(original); + ASSERT_NE(location, std::string::npos); + saved.replace(location, original.size(), "spin=2 k-point=1/2 Cartesian=0.2"); + std::istringstream in(saved); + ModuleBase::matrix weights; + EXPECT_THROW(pw::read_exx_source_occupations(in, headers, 2, weights), std::runtime_error); +} + +TEST(PWHybridSource, ReadsExistingBinaryWavefunctionHeader) +{ + // Native binary record layout from write_wfc_pw; no new wavefunction format. + std::ostringstream out(std::ios::binary); + const int record = 72; + const int ik = 1; + const int nks = 2; + const int npw = 1; + const int nbands = 3; + const double coordinate = 0.123456789123456; + const double weight = 1; + const double cutoff = 10; + const double lattice = 5; + const double tpiba = 1.256637061435917; + out.write(reinterpret_cast(&record), sizeof(record)); + out.write(reinterpret_cast(&ik), sizeof(ik)); + out.write(reinterpret_cast(&nks), sizeof(nks)); + for (int axis = 0; axis < 3; ++axis) + { + out.write(reinterpret_cast(&coordinate), sizeof(coordinate)); + } + out.write(reinterpret_cast(&weight), sizeof(weight)); + out.write(reinterpret_cast(&npw), sizeof(npw)); + out.write(reinterpret_cast(&nbands), sizeof(nbands)); + out.write(reinterpret_cast(&cutoff), sizeof(cutoff)); + out.write(reinterpret_cast(&lattice), sizeof(lattice)); + out.write(reinterpret_cast(&tpiba), sizeof(tpiba)); + out.write(reinterpret_cast(&record), sizeof(record)); + std::string saved = out.str(); + saved.resize(160 + 8 + 12 * npw + nbands * (8 + 16 * npw), '\0'); + std::istringstream in(saved, std::ios::binary); + const auto header = pw::read_exx_source_header(in); + EXPECT_EQ(header.nbands, 3); + EXPECT_DOUBLE_EQ(header.kvec_c[0], coordinate); + EXPECT_DOUBLE_EQ(header.weight, weight); + std::istringstream truncated(saved.substr(0, saved.size() - 1), std::ios::binary); + EXPECT_THROW(pw::read_exx_source_header(truncated), std::runtime_error); + saved[0] = 0; + std::istringstream invalid(saved, std::ios::binary); + EXPECT_THROW(pw::read_exx_source_header(invalid), std::runtime_error); +} diff --git a/tests/01_PW/CASES_CPU.txt b/tests/01_PW/CASES_CPU.txt index b0d6cade3e..b6c569b958 100644 --- a/tests/01_PW/CASES_CPU.txt +++ b/tests/01_PW/CASES_CPU.txt @@ -123,5 +123,7 @@ relax_dftu_spin2 relax_dftu_spin4 scf_deltaspin2 scf_deltaspin4 +nscf_hse_same +nscf_hse_path 221_PW_PCC0D_H3O 222_PW_PCC2D_H3O diff --git a/tests/01_PW/CASES_GPU.txt b/tests/01_PW/CASES_GPU.txt index 2cb811a036..390cc8ac33 100644 --- a/tests/01_PW/CASES_GPU.txt +++ b/tests/01_PW/CASES_GPU.txt @@ -115,3 +115,6 @@ scf_brav_bco_smear_mv #relax_dftu_spin4 scf_deltaspin2 scf_deltaspin4 +# Disabled until the CUDA CI build provides libxc. +#nscf_hse_same +#nscf_hse_path diff --git a/tests/01_PW/nscf_hse_path/INPUT b/tests/01_PW/nscf_hse_path/INPUT new file mode 100644 index 0000000000..907cc77a8b --- /dev/null +++ b/tests/01_PW/nscf_hse_path/INPUT @@ -0,0 +1,32 @@ +INPUT_PARAMETERS +#Parameters (1.General) +suffix autotest +calculation nscf +nbands 3 +symmetry -1 + +#Parameters (2.Iteration) +ecutwfc 10 +scf_thr 1e-9 +scf_nmax 100 +pw_diag_thr 1e-10 +pw_seed 1 + +#Parameters (3.Basis) +basis_type pw + +#Parameters (4.Smearing) +smearing_method fixed + +#Parameters (5.ExactExchange) +dft_functional HSE +exxace false +exx_gamma_extra false + +read_file_dir ../nscf_hse_same/ +pseudo_dir ../../PP_ORB +out_band 1 +out_chg 0 +out_wfc_pw 0 +cal_force 0 +cal_stress 0 diff --git a/tests/01_PW/nscf_hse_path/KPT b/tests/01_PW/nscf_hse_path/KPT new file mode 100644 index 0000000000..56f407f00f --- /dev/null +++ b/tests/01_PW/nscf_hse_path/KPT @@ -0,0 +1,6 @@ +K_POINTS +3 +Direct +0 0 0 1 +0.125 0 0 1 +0.25 0 0 1 diff --git a/tests/01_PW/nscf_hse_path/README b/tests/01_PW/nscf_hse_path/README new file mode 100644 index 0000000000..748334c0a6 --- /dev/null +++ b/tests/01_PW/nscf_hse_path/README @@ -0,0 +1,2 @@ +PW HSE NSCF on the frozen SCF source committed in ../nscf_hse_same, solved on +an independent target k-point list that shares only the Gamma point. diff --git a/tests/01_PW/nscf_hse_path/STRU b/tests/01_PW/nscf_hse_path/STRU new file mode 100644 index 0000000000..c35003c65b --- /dev/null +++ b/tests/01_PW/nscf_hse_path/STRU @@ -0,0 +1,19 @@ +ATOMIC_SPECIES +H 1 H_ONCV_PBE-1.0.upf + +LATTICE_CONSTANT +1.889766 + +LATTICE_VECTORS +0.0 2.708337 2.708337 +2.708337 0.0 2.708337 +2.708337 2.708337 0.0 + +ATOMIC_POSITIONS +Direct + +H +0 +2 +0.125 0.125 0.125 0 0 0 +0.675 0.835 0.875 0 0 0 diff --git a/tests/01_PW/nscf_hse_path/band.txt.ref b/tests/01_PW/nscf_hse_path/band.txt.ref new file mode 100644 index 0000000000..83c5d91b3a --- /dev/null +++ b/tests/01_PW/nscf_hse_path/band.txt.ref @@ -0,0 +1,3 @@ + 1 0.00000000 -11.12775535 0.23225985 5.91375790 + 2 0.03997035 -10.53443745 -0.56043732 5.88781574 + 3 0.07994070 -9.30100379 -2.20473701 5.45370497 diff --git a/tests/01_PW/nscf_hse_path/result.ref b/tests/01_PW/nscf_hse_path/result.ref new file mode 100644 index 0000000000..8f96f93087 --- /dev/null +++ b/tests/01_PW/nscf_hse_path/result.ref @@ -0,0 +1,4 @@ +etotref -34.96110759412895 +etotperatomref -17.4805537971 +CompareBand_pass 0 +totaltimeref 0.09 diff --git a/tests/01_PW/nscf_hse_same/INPUT b/tests/01_PW/nscf_hse_same/INPUT new file mode 100644 index 0000000000..a81d44ca26 --- /dev/null +++ b/tests/01_PW/nscf_hse_same/INPUT @@ -0,0 +1,33 @@ +INPUT_PARAMETERS +#Parameters (1.General) +suffix autotest +calculation nscf +nbands 5 +symmetry -1 + +#Parameters (2.Iteration) +ecutwfc 10 +scf_thr 1e-9 +scf_nmax 100 +pw_diag_thr 1e-10 +pw_seed 1 + +#Parameters (3.Basis) +basis_type pw + +#Parameters (4.Smearing) +smearing_method fixed + +#Parameters (5.ExactExchange) +dft_functional HSE +exx_fock_alpha 0 +exxace false +exx_gamma_extra false + +read_file_dir ./ +pseudo_dir ../../PP_ORB +out_band 1 +out_chg 0 +out_wfc_pw 0 +cal_force 0 +cal_stress 0 diff --git a/tests/01_PW/nscf_hse_same/INPUT.info b/tests/01_PW/nscf_hse_same/INPUT.info new file mode 100644 index 0000000000..f0a54c70cd --- /dev/null +++ b/tests/01_PW/nscf_hse_same/INPUT.info @@ -0,0 +1,8 @@ +# Source SCF parameters used by the hybrid NSCF consistency check. +dft_functional HSE +exx_fock_alpha +exx_erfc_alpha 0.25 +exx_erfc_omega 0.11 +exx_singularity_correction limits +exx_gamma_extra 0 +ecutexx 0 diff --git a/tests/01_PW/nscf_hse_same/KPT b/tests/01_PW/nscf_hse_same/KPT new file mode 100644 index 0000000000..e769af7638 --- /dev/null +++ b/tests/01_PW/nscf_hse_same/KPT @@ -0,0 +1,4 @@ +K_POINTS +0 +Gamma +2 1 1 0 0 0 diff --git a/tests/01_PW/nscf_hse_same/README b/tests/01_PW/nscf_hse_same/README new file mode 100644 index 0000000000..acb09a2104 --- /dev/null +++ b/tests/01_PW/nscf_hse_same/README @@ -0,0 +1,10 @@ +PW HSE NSCF on the frozen SCF source committed in this directory (binary +wavefunctions, eig_occ.txt, chg.cube). Same k mesh with more target +bands; an explicit zero exx_fock_alpha is accepted like an omitted Fock term. + +The charge density is standard SCF output generated with out_chg 1 12. +To regenerate the source, use the same STRU/KPT and INPUT with calculation scf, +nbands 3, out_chg 1 12, and out_wfc_pw 2. +The cube-based band references differ from the former binary-restart references +by at most 1.12e-4 eV: out_chg writes rho, while the binary restart writes rho_save. +INPUT.info retains only the seven source SCF parameters checked by hybrid NSCF. diff --git a/tests/01_PW/nscf_hse_same/STRU b/tests/01_PW/nscf_hse_same/STRU new file mode 100644 index 0000000000..c35003c65b --- /dev/null +++ b/tests/01_PW/nscf_hse_same/STRU @@ -0,0 +1,19 @@ +ATOMIC_SPECIES +H 1 H_ONCV_PBE-1.0.upf + +LATTICE_CONSTANT +1.889766 + +LATTICE_VECTORS +0.0 2.708337 2.708337 +2.708337 0.0 2.708337 +2.708337 2.708337 0.0 + +ATOMIC_POSITIONS +Direct + +H +0 +2 +0.125 0.125 0.125 0 0 0 +0.675 0.835 0.875 0 0 0 diff --git a/tests/01_PW/nscf_hse_same/band.txt.ref b/tests/01_PW/nscf_hse_same/band.txt.ref new file mode 100644 index 0000000000..18e672a68c --- /dev/null +++ b/tests/01_PW/nscf_hse_same/band.txt.ref @@ -0,0 +1,2 @@ + 1 0.00000000 -11.12775535 0.23225985 5.91375790 9.84135070 10.33308037 + 2 0.15988140 -8.19003581 -4.74430941 4.63087285 7.73156801 8.50826860 diff --git a/tests/01_PW/nscf_hse_same/chg.cube b/tests/01_PW/nscf_hse_same/chg.cube new file mode 100644 index 0000000000..7d794c115c --- /dev/null +++ b/tests/01_PW/nscf_hse_same/chg.cube @@ -0,0 +1,683 @@ +Ionic_Step 1 Cubefile created from ABACUS. Inner loop is z, followed by y and x +1 # number of spin directions -0.601951 # Fermi energy, in Ry +2 0.0 0.0 0.0 +15 0.000000 0.341208 0.341208 +15 0.341208 0.000000 0.341208 +15 0.341208 0.341208 0.000000 + 1 1.000000 1.279531 1.279531 1.279531 + 1 1.000000 8.751991 7.933091 7.728366 + 3.747870620906e-03 6.511001055776e-03 1.148480521288e-02 1.679999195507e-02 1.803031963864e-02 1.389220981674e-02 + 8.372443407802e-03 4.874875564120e-03 3.315291499453e-03 2.558087313494e-03 2.063900126690e-03 1.775311578410e-03 + 1.707037967889e-03 1.923085863233e-03 2.506247575810e-03 + 6.488534474249e-03 1.338847455506e-02 2.401162996513e-02 3.145220458474e-02 2.821451876224e-02 1.766315081897e-02 + 8.787449385168e-03 4.516643406212e-03 2.865250760351e-03 2.091879282320e-03 1.671961485142e-03 1.547568377343e-03 + 1.719434751543e-03 2.272439915237e-03 3.481427093402e-03 + 1.143431780925e-02 2.397531952705e-02 3.828227306968e-02 4.184598537508e-02 3.068411620464e-02 1.593898975116e-02 + 7.053704958863e-03 3.569496761836e-03 2.298050247422e-03 1.683248602076e-03 1.413250464233e-03 1.475949407595e-03 + 1.918501690360e-03 2.886580479468e-03 5.230322557302e-03 + 1.671123466972e-02 3.135971215368e-02 4.178296097192e-02 3.734475562212e-02 2.268865469819e-02 1.040585240669e-02 + 4.643734957937e-03 2.617165358632e-03 1.803767529498e-03 1.379156896496e-03 1.286333017420e-03 1.570429013334e-03 + 2.262400896827e-03 3.694774544300e-03 7.489042289991e-03 + 1.793039994294e-02 2.811206710433e-02 3.061511494614e-02 2.267117562896e-02 1.209132965947e-02 5.567225584360e-03 + 2.931098444614e-03 1.946366576505e-03 1.431649057135e-03 1.189080596315e-03 1.298728740684e-03 1.774164222820e-03 + 2.610779424447e-03 4.390752877482e-03 8.918413668184e-03 + 1.387030904174e-02 1.766455961479e-02 1.596882446664e-02 1.044376947818e-02 5.590830408559e-03 3.078303170587e-03 + 2.037057906042e-03 1.499743892826e-03 1.162369788142e-03 1.110411505699e-03 1.413835501328e-03 2.002790221634e-03 + 2.874702274542e-03 4.612866838731e-03 8.330657430575e-03 + 8.476297710107e-03 8.914840519444e-03 7.177123039897e-03 4.731383938276e-03 2.979502078806e-03 2.054841417520e-03 + 1.532383694527e-03 1.162718518441e-03 9.940105506742e-04 1.134104200071e-03 1.588428781547e-03 2.224844260394e-03 + 3.008067654796e-03 4.289885938326e-03 6.369035471582e-03 + 5.072139746731e-03 4.695906916104e-03 3.714474463174e-03 2.716130057462e-03 2.002181826027e-03 1.520152074661e-03 + 1.164594980543e-03 9.517765292966e-04 9.652993079204e-04 1.263432877451e-03 1.798728361079e-03 2.401517330927e-03 + 3.020710241333e-03 3.784777171475e-03 4.626784526016e-03 + 3.567313856358e-03 3.049730262435e-03 2.438413924904e-03 1.903903893065e-03 1.486534794216e-03 1.178524282951e-03 + 9.929848490793e-04 9.630225260725e-04 1.133161729699e-03 1.521386217478e-03 2.043500757750e-03 2.584202560376e-03 + 3.104176227525e-03 3.551283316380e-03 3.757286937064e-03 + 2.825068836421e-03 2.270745898481e-03 1.824773761146e-03 1.482369540760e-03 1.241248789601e-03 1.123947988061e-03 + 1.131039918602e-03 1.259938510099e-03 1.521014464161e-03 1.900341940801e-03 2.387378277951e-03 2.964661367229e-03 + 3.482589405809e-03 3.662411705017e-03 3.378530219647e-03 + 2.282007612333e-03 1.824018502092e-03 1.542375909483e-03 1.376422664908e-03 1.341030263338e-03 1.421749206388e-03 + 1.575384199713e-03 1.781091282343e-03 2.015641591713e-03 2.338689998564e-03 2.884723307620e-03 3.582369975504e-03 + 3.979902602208e-03 3.700546425620e-03 2.972913623725e-03 + 1.892438095245e-03 1.642385346633e-03 1.565093381145e-03 1.632405296645e-03 1.804521477958e-03 1.996004317198e-03 + 2.182267916378e-03 2.332683921019e-03 2.461168341018e-03 2.758898817862e-03 3.379107627948e-03 4.001189500132e-03 + 3.985936301901e-03 3.266337366456e-03 2.430485955810e-03 + 1.739976369083e-03 1.766297577595e-03 1.975688831121e-03 2.311835534413e-03 2.639103101135e-03 2.855114117135e-03 + 2.933374443540e-03 2.882881989958e-03 2.849586748453e-03 3.070533930588e-03 3.526174869718e-03 3.729464739002e-03 + 3.297734311591e-03 2.537462873552e-03 1.966851702382e-03 + 1.932376563413e-03 2.307485549476e-03 2.938248778074e-03 3.752031849322e-03 4.433967770008e-03 4.604491159115e-03 + 4.206063595749e-03 3.600025689764e-03 3.212297330171e-03 3.160001594252e-03 3.186548423485e-03 2.951637052407e-03 + 2.446568162767e-03 1.982467584830e-03 1.805875257866e-03 + 2.517023652253e-03 3.515166472680e-03 5.284443136200e-03 7.562767592637e-03 8.992055930783e-03 8.347484043002e-03 + 6.283432633434e-03 4.424998641378e-03 3.430563840821e-03 2.965135324456e-03 2.601829669672e-03 2.221587313785e-03 + 1.908590455381e-03 1.803275662847e-03 2.000419505460e-03 + 7.974928154209e-03 1.573677709964e-02 2.715891256312e-02 3.484257273611e-02 3.110695231771e-02 1.960300338241e-02 + 9.835357654464e-03 5.041180570325e-03 3.169480239387e-03 2.284360169842e-03 1.777490265280e-03 1.644124908586e-03 + 1.940569216413e-03 2.748908836948e-03 4.352571316468e-03 + 1.567349216559e-02 3.237946632275e-02 5.095331637607e-02 5.523008641423e-02 4.033289189920e-02 2.080432052532e-02 + 8.988559012550e-03 4.353865353164e-03 2.703344346267e-03 1.927370848822e-03 1.591600715751e-03 1.721723973881e-03 + 2.384682930320e-03 3.797648252680e-03 7.141418049431e-03 + 2.699241739909e-02 5.083583605841e-02 6.739616729797e-02 5.973343532978e-02 3.565854385753e-02 1.567985188160e-02 + 6.467387909187e-03 3.355839374985e-03 2.200526618816e-03 1.621034080686e-03 1.501736788588e-03 1.916703974186e-03 + 2.974242951432e-03 5.341229305011e-03 1.171134362877e-02 + 3.453408439176e-02 5.497669941792e-02 5.963794243770e-02 4.317201722828e-02 2.176736119395e-02 9.008333030197e-03 + 4.178253310122e-03 2.566823861030e-03 1.801819360628e-03 1.422773753750e-03 1.533168976482e-03 2.207151547213e-03 + 3.637811400326e-03 7.116674548827e-03 1.627329274108e-02 + 3.073486994140e-02 4.009216738305e-02 3.562627232360e-02 2.181098225233e-02 1.026026353864e-02 4.812479224506e-03 + 2.890871316099e-03 2.059769639786e-03 1.514820584701e-03 1.340233127022e-03 1.671920964496e-03 2.521866475734e-03 + 4.170652704017e-03 8.113285250621e-03 1.707498293950e-02 + 1.936401598745e-02 2.074578963563e-02 1.577360399073e-02 9.100315927306e-03 4.840760690566e-03 3.020484051414e-03 + 2.236551812801e-03 1.669203237207e-03 1.304685611072e-03 1.355867618583e-03 1.869506567721e-03 2.771562904884e-03 + 4.298507414241e-03 7.481963154580e-03 1.321336328028e-02 + 9.801984939414e-03 9.077240365017e-03 6.597570175257e-03 4.252791529944e-03 2.896528760702e-03 2.213523560100e-03 + 1.718496571173e-03 1.311345192430e-03 1.179962216629e-03 1.444074875408e-03 2.053451207425e-03 2.849822313036e-03 + 3.938436679698e-03 5.752719879716e-03 8.186147351839e-03 + 5.124787320123e-03 4.476805256835e-03 3.457448983077e-03 2.601003134805e-03 2.028678854891e-03 1.614276855782e-03 + 1.280489440047e-03 1.105781762795e-03 1.198521385329e-03 1.587773263089e-03 2.153642510446e-03 2.729606036798e-03 + 3.364757101434e-03 4.178375831316e-03 4.948653637692e-03 + 3.286554019460e-03 2.816984909561e-03 2.279880703889e-03 1.822817688666e-03 1.482721907326e-03 1.254422597980e-03 + 1.146425329825e-03 1.188805738540e-03 1.408801326598e-03 1.773485234434e-03 2.173224668918e-03 2.548497042466e-03 + 2.931987851879e-03 3.296926433834e-03 3.469253297150e-03 + 2.395366922113e-03 2.033703224678e-03 1.707827595433e-03 1.468260871610e-03 1.344235178259e-03 1.339611796899e-03 + 1.430920230226e-03 1.585091061835e-03 1.770543553090e-03 1.969552579846e-03 2.197145916181e-03 2.467560249556e-03 + 2.721348263831e-03 2.827143345560e-03 2.700816104500e-03 + 1.856470452777e-03 1.686809430546e-03 1.602945761257e-03 1.617161016756e-03 1.727719839787e-03 1.896697784156e-03 + 2.059831811486e-03 2.142044660241e-03 2.138032854785e-03 2.154334382802e-03 2.285859660029e-03 2.472508142894e-03 + 2.533677611456e-03 2.378702246340e-03 2.105940590802e-03 + 1.676794704256e-03 1.798841734014e-03 2.035165783836e-03 2.338295323867e-03 2.631361029351e-03 2.832253235892e-03 + 2.856318222307e-03 2.683204433248e-03 2.451068343294e-03 2.346015645599e-03 2.387826485671e-03 2.390085317075e-03 + 2.200528148795e-03 1.909231714921e-03 1.706857514265e-03 + 1.953657825958e-03 2.467451741695e-03 3.122401919107e-03 3.815293810401e-03 4.330187008070e-03 4.399434245566e-03 + 3.960252374212e-03 3.300001123186e-03 2.789286102597e-03 2.541730599388e-03 2.390231157810e-03 2.142300523331e-03 + 1.822027366942e-03 1.610649658248e-03 1.648136909465e-03 + 2.777147417860e-03 3.896785644478e-03 5.510780775786e-03 7.336670865776e-03 8.346491043774e-03 7.665804674747e-03 + 5.825162213136e-03 4.125806849685e-03 3.153348834274e-03 2.653097372646e-03 2.247461333310e-03 1.857945261675e-03 + 1.610757236863e-03 1.643592749484e-03 2.037785420868e-03 + 4.383739829035e-03 7.235760469408e-03 1.188738317154e-02 1.654476626927e-02 1.740845420799e-02 1.348300205187e-02 + 8.286892885110e-03 4.901268393081e-03 3.346623891576e-03 2.567477098061e-03 2.015727996043e-03 1.682475207962e-03 + 1.662692135337e-03 2.045324255521e-03 2.884147369637e-03 + 1.642578888110e-02 3.150895205978e-02 4.761756221445e-02 5.092866989002e-02 3.754897986576e-02 2.003588704024e-02 + 9.155312874528e-03 4.689947795750e-03 3.016712204257e-03 2.205922226720e-03 1.879432974944e-03 2.124208041079e-03 + 3.017968468970e-03 4.709280848524e-03 8.238755844842e-03 + 3.136897568361e-02 5.710652302178e-02 7.450137624914e-02 6.590067797377e-02 3.976120337411e-02 1.786779453122e-02 + 7.537713782172e-03 3.948603897902e-03 2.612217449707e-03 1.976886608083e-03 1.916577309397e-03 2.535796290257e-03 + 3.946830294899e-03 6.894973571865e-03 1.433957757598e-02 + 4.725106053967e-02 7.427530697550e-02 8.005964978941e-02 5.784287450057e-02 2.908510765857e-02 1.185242393014e-02 + 5.294321732790e-03 3.138565896548e-03 2.188457304992e-03 1.770896296616e-03 1.994329552351e-03 2.976071802067e-03 + 5.035493598140e-03 9.977700817824e-03 2.263316713043e-02 + 5.032843643761e-02 6.553948370056e-02 5.778787777066e-02 3.468922866155e-02 1.557223927717e-02 6.716885679839e-03 + 3.709366756801e-03 2.532243713068e-03 1.840622062518e-03 1.653384366637e-03 2.151615736614e-03 3.444031249319e-03 + 6.134974994090e-03 1.275246719626e-02 2.773169926711e-02 + 3.692887274569e-02 3.951745887020e-02 2.915586327900e-02 1.565478164753e-02 7.394207209287e-03 4.110776392266e-03 + 2.878709652735e-03 2.096936717544e-03 1.599733253693e-03 1.661316207791e-03 2.392148117199e-03 3.837920898080e-03 + 6.666360817972e-03 1.296622760606e-02 2.451374690657e-02 + 1.965310864096e-02 1.783001089829e-02 1.198942478057e-02 6.802462383383e-03 4.113630651089e-03 3.002163053455e-03 + 2.310999837080e-03 1.703111750911e-03 1.453482581027e-03 1.765680901864e-03 2.614402965865e-03 3.923439895723e-03 + 6.122927211404e-03 1.018799319044e-02 1.586194395368e-02 + 9.026566775241e-03 7.595064256799e-03 5.392454240149e-03 3.730265761311e-03 2.818894275947e-03 2.249698785986e-03 + 1.729676377245e-03 1.376017698704e-03 1.410491243839e-03 1.884920069005e-03 2.661256110670e-03 3.584542835633e-03 + 4.836617255512e-03 6.663573558246e-03 8.521626912710e-03 + 4.689842946441e-03 4.013615248425e-03 3.185697108736e-03 2.501923165778e-03 2.000010318471e-03 1.613147254431e-03 + 1.340385501667e-03 1.278775907373e-03 1.496083856337e-03 1.954440434951e-03 2.500972263014e-03 3.036446857008e-03 + 3.637551220755e-03 4.321726455220e-03 4.801383414592e-03 + 3.059295285332e-03 2.676125410217e-03 2.231899941078e-03 1.829339966617e-03 1.544128895002e-03 1.400974889354e-03 + 1.391188046023e-03 1.499805874030e-03 1.708399709744e-03 1.982945363559e-03 2.280732442835e-03 2.592888880347e-03 + 2.918429718036e-03 3.185067001360e-03 3.255067159243e-03 + 2.256887473200e-03 2.060951165188e-03 1.863048152482e-03 1.719820787711e-03 1.695533033881e-03 1.789867736821e-03 + 1.916297086619e-03 1.980246547116e-03 1.986239346630e-03 2.022782163977e-03 2.150335154109e-03 2.337968604874e-03 + 2.487691345307e-03 2.517139574958e-03 2.422941613047e-03 + 1.922132524491e-03 2.029852736245e-03 2.161140667245e-03 2.324499458729e-03 2.537587256719e-03 2.727618301838e-03 + 2.739329946856e-03 2.526712566314e-03 2.255058034756e-03 2.113533379913e-03 2.116875566271e-03 2.133046877033e-03 + 2.060856860154e-03 1.941811823558e-03 1.880949444138e-03 + 2.161099142766e-03 2.689707151142e-03 3.226683111767e-03 3.720806330067e-03 4.083412308598e-03 4.112009113044e-03 + 3.695345499609e-03 3.050560925171e-03 2.529252504249e-03 2.256328560542e-03 2.089512280625e-03 1.874283992235e-03 + 1.651904262104e-03 1.578074659841e-03 1.752858520768e-03 + 3.079965774877e-03 4.146556750330e-03 5.345699958900e-03 6.489974556363e-03 7.013192031339e-03 6.415187716510e-03 + 5.014068700272e-03 3.672458775314e-03 2.853105385778e-03 2.401074509937e-03 2.013488047301e-03 1.646696006808e-03 + 1.468968869536e-03 1.633192159861e-03 2.198228844295e-03 + 4.797177092948e-03 7.110432093871e-03 1.031998273144e-02 1.320056354849e-02 1.347640687745e-02 1.064302066492e-02 + 6.934932282381e-03 4.399967010481e-03 3.152550070890e-03 2.463785316340e-03 1.923372813736e-03 1.597035843423e-03 + 1.656814535093e-03 2.213749162609e-03 3.261474099435e-03 + 8.309457820490e-03 1.453717633746e-02 2.300535813598e-02 2.830611844835e-02 2.519611924843e-02 1.641423776807e-02 + 8.804157300307e-03 4.877434617985e-03 3.237521511783e-03 2.390712547743e-03 1.875292678420e-03 1.777625832340e-03 + 2.220070578568e-03 3.254762296418e-03 5.008360722176e-03 + 2.738345680885e-02 4.631161817945e-02 5.842137995814e-02 5.163061897283e-02 3.223702741223e-02 1.564842130108e-02 + 7.335172249907e-03 4.149421081630e-03 2.854867902324e-03 2.289506995625e-03 2.387322537279e-03 3.244147218865e-03 + 4.868036576387e-03 7.745599569756e-03 1.409576586368e-02 + 4.603641302187e-02 6.987875040327e-02 7.449823916068e-02 5.441711812985e-02 2.838781717503e-02 1.230031997570e-02 + 5.801460867527e-03 3.503392573969e-03 2.513603590884e-03 2.199682511132e-03 2.656021745739e-03 3.962907720059e-03 + 6.337739796257e-03 1.143772386001e-02 2.356659494774e-02 + 5.781550201535e-02 7.421321159711e-02 6.535652561689e-02 3.967047007057e-02 1.816093069009e-02 7.902928582487e-03 + 4.268556557240e-03 2.857889350923e-03 2.154548188465e-03 2.114144227332e-03 2.914562540407e-03 4.657604043180e-03 + 8.010486099671e-03 1.582038218877e-02 3.283387262457e-02 + 5.086125890026e-02 5.410582493121e-02 3.967921063970e-02 2.101724185625e-02 9.564016962847e-03 4.973909618660e-03 + 3.280636065765e-03 2.356948863474e-03 1.888797690741e-03 2.130105558975e-03 3.229685040267e-03 5.292045619832e-03 + 9.293379527650e-03 1.810283894950e-02 3.401281743679e-02 + 3.158848307222e-02 2.824125377286e-02 1.826067582289e-02 9.620839178220e-03 5.282359839883e-03 3.583890799239e-03 + 2.673307473384e-03 1.975682425462e-03 1.757750020227e-03 2.271754547732e-03 3.535374880450e-03 5.555769335478e-03 + 9.147290053727e-03 1.592539856434e-02 2.539648950458e-02 + 1.526194486052e-02 1.227497638700e-02 7.992547813422e-03 4.997481588960e-03 3.551380212826e-03 2.787101679911e-03 + 2.119911173777e-03 1.663101827411e-03 1.731726638927e-03 2.424986839737e-03 3.594419639172e-03 5.121763426592e-03 + 7.417039072833e-03 1.090863624309e-02 1.445695774192e-02 + 7.159576724435e-03 5.812842806385e-03 4.308232291350e-03 3.244343859291e-03 2.582688151744e-03 2.063451739923e-03 + 1.635061553878e-03 1.488812997476e-03 1.767302580218e-03 2.430171171854e-03 3.269747438548e-03 4.164169576489e-03 + 5.256395151258e-03 6.549246489266e-03 7.441734995746e-03 + 4.095558632213e-03 3.537315320737e-03 2.888316247245e-03 2.320986771581e-03 1.901207934887e-03 1.618762941115e-03 + 1.487683048787e-03 1.557803689722e-03 1.839254743464e-03 2.272794596412e-03 2.755784677942e-03 3.237602031575e-03 + 3.729276300359e-03 4.163137852365e-03 4.335566301880e-03 + 2.874024258065e-03 2.596040722220e-03 2.242412772781e-03 1.934765987050e-03 1.776925013085e-03 1.766705992985e-03 + 1.825188622708e-03 1.883399680780e-03 1.955527534795e-03 2.108328958257e-03 2.362237474566e-03 2.659534491989e-03 + 2.907147646403e-03 3.036195829033e-03 3.024203577039e-03 + 2.352317468813e-03 2.349659466543e-03 2.304424123238e-03 2.306456801899e-03 2.426960710840e-03 2.579440015175e-03 + 2.574131799746e-03 2.362818341361e-03 2.131529741453e-03 2.071880213880e-03 2.182318932421e-03 2.315694245337e-03 + 2.356422250421e-03 2.330916327241e-03 2.325553931800e-03 + 2.471847224048e-03 2.878243596888e-03 3.224752962654e-03 3.548635641875e-03 3.828698035443e-03 3.858498960616e-03 + 3.472773015814e-03 2.852892375459e-03 2.364214401410e-03 2.154901900851e-03 2.086365502508e-03 1.984017397239e-03 + 1.860094604365e-03 1.862813900246e-03 2.084770917222e-03 + 3.353813758340e-03 4.251810089981e-03 5.061183523965e-03 5.715608298056e-03 5.955316729677e-03 5.474737731484e-03 + 4.412050142368e-03 3.333880097342e-03 2.637870485747e-03 2.261144864828e-03 1.958739863887e-03 1.678432668581e-03 + 1.583986249908e-03 1.837888097898e-03 2.475275446652e-03 + 5.013797840822e-03 6.667366201529e-03 8.472341646327e-03 9.816928553220e-03 9.690911400570e-03 7.910628568728e-03 + 5.590324003712e-03 3.864280054422e-03 2.906906166631e-03 2.320573231268e-03 1.851609300777e-03 1.598072278800e-03 + 1.756934261648e-03 2.438769762336e-03 3.584305373088e-03 + 7.908448425922e-03 1.179218998403e-02 1.636781825486e-02 1.880829655314e-02 1.670340647861e-02 1.158214414811e-02 + 6.973129444569e-03 4.347568155150e-03 3.079823429456e-03 2.335893570448e-03 1.887281501872e-03 1.881375796628e-03 + 2.467347520901e-03 3.651925742140e-03 5.369067964064e-03 + 1.422676614676e-02 2.393291237561e-02 3.349026317285e-02 3.490246398717e-02 2.631011513842e-02 1.514397419736e-02 + 7.823595726627e-03 4.495567561292e-03 3.066653185029e-03 2.329858499214e-03 2.096698399523e-03 2.495509247312e-03 + 3.579961343430e-03 5.336582101878e-03 8.337707506697e-03 + 3.541943121229e-02 4.972877175210e-02 5.132287769718e-02 3.808810433407e-02 2.141735981822e-02 1.057040588131e-02 + 5.619435220318e-03 3.553124722429e-03 2.647912956331e-03 2.527963823777e-03 3.249597301361e-03 4.793656710743e-03 + 7.181638482628e-03 1.152757998105e-02 2.051653849665e-02 + 4.922643663307e-02 6.072234680432e-02 5.315519822224e-02 3.335597367351e-02 1.651368715952e-02 7.903936106683e-03 + 4.456842505336e-03 3.000554694813e-03 2.407095435719e-03 2.625602868627e-03 3.763249692977e-03 5.789252641116e-03 + 9.161768095592e-03 1.616281083955e-02 3.013034514196e-02 + 5.053124846571e-02 5.289698710881e-02 3.910116809587e-02 2.142920951492e-02 1.022111277265e-02 5.391260898277e-03 + 3.457093478533e-03 2.500450242599e-03 2.202323110537e-03 2.747876709079e-03 4.235815545822e-03 6.670868564531e-03 + 1.098407141272e-02 1.988317035799e-02 3.513522685599e-02 + 3.737294099814e-02 3.316461410987e-02 2.144916408264e-02 1.127994570081e-02 6.030253324950e-03 3.873599178975e-03 + 2.790401790282e-03 2.143945023616e-03 2.123639212962e-03 2.962506918201e-03 4.656018676218e-03 7.195796157994e-03 + 1.157567193341e-02 1.962367165973e-02 3.054874419297e-02 + 2.091291361903e-02 1.642120246068e-02 1.025680612522e-02 6.035609630841e-03 4.029150167944e-03 3.036254613144e-03 + 2.308701702703e-03 1.914349750034e-03 2.164217370366e-03 3.186058689911e-03 4.806967856367e-03 6.935308322619e-03 + 1.019684941290e-02 1.514397284651e-02 2.004776820073e-02 + 1.024697980913e-02 7.845725451011e-03 5.395681070160e-03 3.841822935707e-03 2.998070509532e-03 2.388362997076e-03 + 1.903835563949e-03 1.780324415323e-03 2.218287046855e-03 3.193095673334e-03 4.439861888946e-03 5.827908170877e-03 + 7.589233050420e-03 9.661317383208e-03 1.096841207277e-02 + 5.447461482951e-03 4.440671970133e-03 3.464018614061e-03 2.757147739863e-03 2.269098678609e-03 1.898646931060e-03 + 1.686650989380e-03 1.761695850405e-03 2.185852636149e-03 2.879495368967e-03 3.661613261736e-03 4.431658232992e-03 + 5.200925857721e-03 5.844282596476e-03 6.002269429604e-03 + 3.524211534090e-03 3.072036869511e-03 2.580329517830e-03 2.188603044826e-03 1.953829199602e-03 1.846066720369e-03 + 1.826185888625e-03 1.896483217245e-03 2.093975676664e-03 2.442818529635e-03 2.897474312379e-03 3.349643798644e-03 + 3.692461461521e-03 3.857708198851e-03 3.805038201511e-03 + 2.737485681499e-03 2.586485186662e-03 2.399780799978e-03 2.300744232006e-03 2.341901016583e-03 2.417607342442e-03 + 2.368067936532e-03 2.192003915132e-03 2.073348621214e-03 2.165745464618e-03 2.434693522892e-03 2.702609417980e-03 + 2.831251246984e-03 2.840154557732e-03 2.808399799934e-03 + 2.686271544203e-03 2.903490422724e-03 3.079004814043e-03 3.294858701304e-03 3.522565954339e-03 3.535481077333e-03 + 3.166775793126e-03 2.605008890896e-03 2.211045449405e-03 2.127235166088e-03 2.214801905437e-03 2.270040944752e-03 + 2.249667935441e-03 2.274525138513e-03 2.437975330404e-03 + 3.438363356649e-03 4.121821286904e-03 4.684441062036e-03 5.115070957760e-03 5.258869679412e-03 4.868225005668e-03 + 3.990926644579e-03 3.063767922832e-03 2.465985213013e-03 2.197420155748e-03 2.049328931241e-03 1.922229745183e-03 + 1.911206585369e-03 2.163137569006e-03 2.717804901391e-03 + 5.010683906663e-03 6.217241225326e-03 7.215498715086e-03 7.757945511570e-03 7.481896749446e-03 6.323434003930e-03 + 4.787759943138e-03 3.512108028104e-03 2.716608073992e-03 2.233822361059e-03 1.904659911478e-03 1.778480719004e-03 + 2.000808680865e-03 2.674676102920e-03 3.752496842843e-03 + 7.459197469690e-03 9.696792861800e-03 1.168601666226e-02 1.232230871061e-02 1.091790580031e-02 8.209983966598e-03 + 5.624678004740e-03 3.889849052427e-03 2.868079056382e-03 2.232951174729e-03 1.910832783129e-03 2.017415271681e-03 + 2.668727243386e-03 3.868818653285e-03 5.493143426663e-03 + 1.187693602562e-02 1.686235326724e-02 2.083882624180e-02 2.064102123301e-02 1.607381526558e-02 1.039473854584e-02 + 6.315143815414e-03 4.082127322257e-03 2.900891417052e-03 2.278156328916e-03 2.179100073491e-03 2.708621140436e-03 + 3.885655557214e-03 5.623272723585e-03 8.098402445032e-03 + 2.082916622502e-02 3.090369217617e-02 3.622435745752e-02 3.164311112896e-02 2.094716591804e-02 1.160634287437e-02 + 6.381324116688e-03 3.967874318379e-03 2.825685667943e-03 2.397206235087e-03 2.679672502490e-03 3.721073301014e-03 + 5.431021343954e-03 8.007937461278e-03 1.265786840200e-02 + 3.735798926696e-02 4.165443031793e-02 3.505299036009e-02 2.290100684537e-02 1.283710390670e-02 7.133897768990e-03 + 4.329443552306e-03 2.963799535934e-03 2.530907830606e-03 2.996375013998e-03 4.385135293846e-03 6.633589689891e-03 + 1.012015406827e-02 1.629695766688e-02 2.634368186148e-02 + 4.090211706574e-02 4.050244488753e-02 2.995931143559e-02 1.758383115563e-02 9.427523387185e-03 5.399695903899e-03 + 3.482232803771e-03 2.574428665484e-03 2.496005663639e-03 3.344576873364e-03 5.132764569118e-03 7.820147668245e-03 + 1.216985284410e-02 1.995797810753e-02 3.135471039874e-02 + 3.422240339402e-02 2.976743743330e-02 1.973528949644e-02 1.106708482729e-02 6.250122246794e-03 3.981414775836e-03 + 2.806492883131e-03 2.284499767385e-03 2.529314476361e-03 3.691491438620e-03 5.693505970176e-03 8.509783167338e-03 + 1.303143790659e-02 2.052254314320e-02 2.957667395411e-02 + 2.235309204113e-02 1.745598354149e-02 1.105315155044e-02 6.568690406378e-03 4.269959548346e-03 3.079863520723e-03 + 2.359352746709e-03 2.141619413377e-03 2.656937371519e-03 3.992542493556e-03 5.932840900788e-03 8.417998864114e-03 + 1.209007958843e-02 1.729531955141e-02 2.200662302502e-02 + 1.246954625674e-02 9.312356238960e-03 6.205847891595e-03 4.242012589860e-03 3.180063726450e-03 2.499460026201e-03 + 2.074172594413e-03 2.102109838773e-03 2.774041848054e-03 4.057776118191e-03 5.657950587876e-03 7.462276160287e-03 + 9.727016064206e-03 1.225614669411e-02 1.365128003580e-02 + 6.863283818143e-03 5.299988137109e-03 3.936451135517e-03 3.051214097009e-03 2.495994808557e-03 2.103625509391e-03 + 1.913399077874e-03 2.082508923866e-03 2.710777760817e-03 3.714509443089e-03 4.850542557256e-03 5.968174131340e-03 + 7.049450159128e-03 7.866128642482e-03 7.886674961383e-03 + 4.206917601816e-03 3.484941579967e-03 2.846213409261e-03 2.405695543036e-03 2.137948221333e-03 1.978512626893e-03 + 1.927169819667e-03 2.058293197880e-03 2.447151450392e-03 3.082212585523e-03 3.825664170862e-03 4.483144115195e-03 + 4.912278048409e-03 5.030193398143e-03 4.783066722111e-03 + 3.027936722133e-03 2.731382544182e-03 2.462388020768e-03 2.319977518301e-03 2.299982633725e-03 2.287479268029e-03 + 2.196451018127e-03 2.103708124821e-03 2.179398447415e-03 2.507748176859e-03 2.982551167373e-03 3.364478400194e-03 + 3.500618814367e-03 3.434565932802e-03 3.267027963810e-03 + 2.736584896833e-03 2.789825509723e-03 2.851775169119e-03 2.992314977182e-03 3.143249063411e-03 3.091064378478e-03 + 2.743376924975e-03 2.317890444489e-03 2.113327676986e-03 2.216438099316e-03 2.470192351515e-03 2.639181730161e-03 + 2.649375917252e-03 2.619877482355e-03 2.658244164766e-03 + 3.272818351508e-03 3.744361114825e-03 4.151330742807e-03 4.478118041629e-03 4.573691813601e-03 4.222700075573e-03 + 3.476570957780e-03 2.718475543696e-03 2.277205617021e-03 2.163524663686e-03 2.188727036758e-03 2.204000736404e-03 + 2.232483077846e-03 2.403506330680e-03 2.780331195852e-03 + 4.706746321282e-03 5.652225418704e-03 6.313281788746e-03 6.561739007074e-03 6.267508546148e-03 5.404089029820e-03 + 4.235177344905e-03 3.191920349698e-03 2.520500203087e-03 2.176388467735e-03 2.030332431382e-03 2.039713873589e-03 + 2.263526575194e-03 2.803249475969e-03 3.672441435114e-03 + 7.092400762600e-03 8.598078436116e-03 9.422286151290e-03 9.267330532083e-03 8.183859060530e-03 6.556461058059e-03 + 4.891800854644e-03 3.557378830869e-03 2.664753573108e-03 2.166116092776e-03 2.015705758879e-03 2.217151572206e-03 + 2.819367906947e-03 3.884536603006e-03 5.382042026569e-03 + 1.087425925399e-02 1.340442163643e-02 1.440530663883e-02 1.325569683385e-02 1.060865005027e-02 7.706910400662e-03 + 5.348360820394e-03 3.699351125792e-03 2.670634154401e-03 2.189654837742e-03 2.238192374717e-03 2.822449334345e-03 + 3.955967450099e-03 5.674240795331e-03 8.035541144770e-03 + 1.731002207085e-02 2.161479674365e-02 2.227081610919e-02 1.865425696906e-02 1.320151339742e-02 8.536209642620e-03 + 5.456633171620e-03 3.612151634595e-03 2.619293206573e-03 2.343286938972e-03 2.766090535805e-03 3.874039473773e-03 + 5.640976595499e-03 8.265617893395e-03 1.220909165399e-02 + 2.715203128932e-02 3.289446565134e-02 3.114642256115e-02 2.312526575738e-02 1.439019523922e-02 8.404395805151e-03 + 5.087911918649e-03 3.343754305540e-03 2.573903149694e-03 2.640485627176e-03 3.542490055896e-03 5.229832075486e-03 + 7.766211013716e-03 1.188108252312e-02 1.862377532798e-02 + 3.522578013597e-02 3.048885476587e-02 2.144439945799e-02 1.337661543091e-02 8.188360084962e-03 5.158794882858e-03 + 3.394496339861e-03 2.591803714373e-03 2.706025557829e-03 3.762283806202e-03 5.840097201637e-03 9.292633552415e-03 + 1.502254651769e-02 2.344124610934e-02 3.198726605356e-02 + 2.960677394974e-02 2.383681038617e-02 1.595642425114e-02 9.815063478712e-03 6.121436982756e-03 4.001704997571e-03 + 2.815388728124e-03 2.433945940949e-03 2.908311242620e-03 4.313065785066e-03 6.691438380412e-03 1.032949949152e-02 + 1.589094733848e-02 2.316083167814e-02 2.917279147293e-02 + 2.071824075646e-02 1.581783231265e-02 1.043950910899e-02 6.626534639227e-03 4.384585595383e-03 3.072544734494e-03 + 2.389099641725e-03 2.367750676083e-03 3.121594485772e-03 4.687378724414e-03 6.977442604908e-03 1.009452497331e-02 + 1.433642567946e-02 1.911498421979e-02 2.204414714517e-02 + 1.297097475530e-02 9.688265096494e-03 6.578060055279e-03 4.475066835549e-03 3.218128749617e-03 2.472541978430e-03 + 2.162272774597e-03 2.395859306752e-03 3.282483107412e-03 4.777615630767e-03 6.683031548023e-03 8.932151291011e-03 + 1.153734206692e-02 1.391686871086e-02 1.468744817122e-02 + 7.885065891837e-03 5.969588415678e-03 4.306191251828e-03 3.194662142218e-03 2.525961601256e-03 2.152435260453e-03 + 2.080736926575e-03 2.418849838355e-03 3.245602807909e-03 4.492114868230e-03 5.937896405859e-03 7.390326833321e-03 + 8.699236976528e-03 9.504617812760e-03 9.272133679399e-03 + 4.933413948899e-03 3.908553749593e-03 3.055690735347e-03 2.503830792542e-03 2.201193053912e-03 2.057815450797e-03 + 2.072560313682e-03 2.332935163746e-03 2.934634357047e-03 3.863421845848e-03 4.912115140199e-03 5.786056547683e-03 + 6.283162952258e-03 6.309475834879e-03 5.827551869882e-03 + 3.356459437541e-03 2.888812545829e-03 2.516322839781e-03 2.321072838784e-03 2.255521828125e-03 2.203922195777e-03 + 2.137487718628e-03 2.180082099714e-03 2.497027883692e-03 3.117784659674e-03 3.827041339314e-03 4.291642106485e-03 + 4.366463109948e-03 4.156406558552e-03 3.799824417913e-03 + 2.760000784537e-03 2.683803011067e-03 2.652342226907e-03 2.711483733196e-03 2.765995116059e-03 2.649967721283e-03 + 2.364777999283e-03 2.138692057741e-03 2.189595703353e-03 2.526120962702e-03 2.923781153045e-03 3.110430716364e-03 + 3.049867937173e-03 2.914618409869e-03 2.825390635457e-03 + 3.011965895416e-03 3.296859198778e-03 3.554917453061e-03 3.760941562183e-03 3.769494913229e-03 3.432127519214e-03 + 2.851080889824e-03 2.346352276144e-03 2.139425033954e-03 2.202307797827e-03 2.342972720134e-03 2.400824198352e-03 + 2.402747919098e-03 2.486210739162e-03 2.712635069171e-03 + 4.167570145519e-03 4.872318721289e-03 5.333055486713e-03 5.452357942058e-03 5.164350763373e-03 4.470427317355e-03 + 3.561773016882e-03 2.759544744436e-03 2.271129861696e-03 2.086320269612e-03 2.084449370679e-03 2.173456711497e-03 + 2.367918680082e-03 2.760821337787e-03 3.395328416749e-03 + 6.498087915507e-03 7.689975369869e-03 8.087894554527e-03 7.675820760069e-03 6.745845592991e-03 5.549867702209e-03 + 4.272482869604e-03 3.150836575881e-03 2.399407184557e-03 2.070868049973e-03 2.088198197908e-03 2.353789420055e-03 + 2.856830158526e-03 3.708814693620e-03 4.990810836910e-03 + 1.062487847077e-02 1.225582236647e-02 1.200679316950e-02 1.036509234961e-02 8.336952608629e-03 6.430057527004e-03 + 4.710804131514e-03 3.299598898351e-03 2.413170721981e-03 2.116999687594e-03 2.315173645517e-03 2.892554077250e-03 + 3.877432198241e-03 5.512068213060e-03 7.946508763885e-03 + 1.732651940194e-02 1.894430271760e-02 1.702806340327e-02 1.328398696068e-02 9.707474952776e-03 6.923442921205e-03 + 4.763673673299e-03 3.199340484393e-03 2.371328020760e-03 2.275761347289e-03 2.793918658500e-03 3.851347795876e-03 + 5.640637070514e-03 8.673079454528e-03 1.305730253139e-02 + 2.614903647666e-02 2.659830832892e-02 2.186237595636e-02 1.551301386926e-02 1.038154759381e-02 6.879652701441e-03 + 4.489788091477e-03 2.993503623330e-03 2.393942760691e-03 2.621258332535e-03 3.592112201263e-03 5.361976185776e-03 + 8.431089534176e-03 1.361002682803e-02 2.054834537837e-02 + 3.369810787055e-02 3.161778667044e-02 2.389069621346e-02 1.568590751610e-02 9.853424033536e-03 6.236801499065e-03 + 3.996807817365e-03 2.785162662593e-03 2.521405038127e-03 3.151933870050e-03 4.684454895102e-03 7.360255826177e-03 + 1.199947751176e-02 1.944353484956e-02 2.829128833955e-02 + 3.154404301618e-02 2.171562619114e-02 1.360299819069e-02 8.700254547422e-03 5.800795003177e-03 3.882768348731e-03 + 2.781484458611e-03 2.557430554816e-03 3.200276736708e-03 4.817161745335e-03 8.010297070036e-03 1.410499372262e-02 + 2.374603884257e-02 3.367778129749e-02 3.717823383378e-02 + 2.088773600196e-02 1.449486245293e-02 9.580505818613e-03 6.446204646065e-03 4.393258441849e-03 3.055614022061e-03 + 2.448377187812e-03 2.599596463187e-03 3.523255076244e-03 5.368053106975e-03 8.629028372387e-03 1.395455515620e-02 + 2.077787557518e-02 2.597090075008e-02 2.593970833773e-02 + 1.304610313557e-02 9.472882276931e-03 6.602799539192e-03 4.569213168420e-03 3.193627917493e-03 2.412211970554e-03 + 2.231986272377e-03 2.651741964900e-03 3.689829540925e-03 5.443312184604e-03 8.111964264628e-03 1.169020915075e-02 + 1.530815343969e-02 1.720766791692e-02 1.621136604811e-02 + 8.383300770826e-03 6.311063368149e-03 4.514069947052e-03 3.203929667863e-03 2.404224005425e-03 2.070840463552e-03 + 2.165400903850e-03 2.680418087487e-03 3.643470976045e-03 5.105411836397e-03 7.023114415932e-03 9.084696988167e-03 + 1.066648158940e-02 1.111203501295e-02 1.021348677597e-02 + 5.538714390650e-03 4.256616137489e-03 3.151715039238e-03 2.418524405339e-03 2.064660653018e-03 2.002597924145e-03 + 2.174519623001e-03 2.596478735163e-03 3.360514321248e-03 4.515609735479e-03 5.864872883384e-03 6.991815298439e-03 + 7.542701113961e-03 7.413435347834e-03 6.685062782634e-03 + 3.736397558038e-03 3.041043386409e-03 2.485524676128e-03 2.187416640206e-03 2.102982651662e-03 2.112303119969e-03 + 2.169441390140e-03 2.376904177456e-03 2.909640763931e-03 3.786141335691e-03 4.700650118827e-03 5.234271481399e-03 + 5.253120032159e-03 4.920000784617e-03 4.394488455742e-03 + 2.847650558714e-03 2.619242279318e-03 2.463260092431e-03 2.432259491219e-03 2.434175519657e-03 2.338253293818e-03 + 2.175980720616e-03 2.156920558194e-03 2.459629644619e-03 3.023433421129e-03 3.521480063926e-03 3.662276637701e-03 + 3.496873382755e-03 3.259981027171e-03 3.057738073662e-03 + 2.814805777585e-03 2.932566388019e-03 3.031518817337e-03 3.103113112234e-03 3.032828130340e-03 2.739874431784e-03 + 2.354080124893e-03 2.122366530360e-03 2.165563419443e-03 2.384629889393e-03 2.553387652098e-03 2.552975940819e-03 + 2.488650299699e-03 2.515621209595e-03 2.655211305235e-03 + 3.608908472216e-03 4.038327091591e-03 4.273540237343e-03 4.266891089447e-03 3.983444042413e-03 3.450258642543e-03 + 2.826424817726e-03 2.326204959119e-03 2.061883855676e-03 2.000883102011e-03 2.042721396232e-03 2.128100700115e-03 + 2.293015537429e-03 2.609927664734e-03 3.083466166260e-03 + 5.548446590848e-03 6.385685282703e-03 6.548785089875e-03 6.105567309424e-03 5.344826421455e-03 4.441088868624e-03 + 3.477887830390e-03 2.621603884326e-03 2.071033784490e-03 1.893121356689e-03 2.011407519898e-03 2.304926311601e-03 + 2.735917173468e-03 3.404414127559e-03 4.399895254358e-03 + 9.753754719035e-03 1.097473792817e-02 1.033106582214e-02 8.631022998193e-03 6.898645134815e-03 5.387535134929e-03 + 3.970733857606e-03 2.776969189509e-03 2.095518494302e-03 1.993809941405e-03 2.318259314101e-03 2.872148179703e-03 + 3.679344115611e-03 5.086788845040e-03 7.323360415773e-03 + 1.790450142094e-02 1.848542142515e-02 1.533726090168e-02 1.125941456162e-02 8.130496919058e-03 5.892704711367e-03 + 4.060332518064e-03 2.715095616102e-03 2.118169757135e-03 2.229788020846e-03 2.821685232503e-03 3.760432649401e-03 + 5.434479710989e-03 8.689882976359e-03 1.360245126401e-02 + 2.963052267632e-02 2.699059100623e-02 1.962295882091e-02 1.287542609060e-02 8.579229262369e-03 5.838764842450e-03 + 3.825052537905e-03 2.571617311411e-03 2.210202524346e-03 2.602845328032e-03 3.566190274656e-03 5.314880002931e-03 + 8.960120224342e-03 1.582473520055e-02 2.456529283382e-02 + 3.934422871274e-02 3.154603164001e-02 2.065852051237e-02 1.270753690680e-02 8.172570144800e-03 5.384688696175e-03 + 3.482973769724e-03 2.497409214126e-03 2.441745311344e-03 3.183507168031e-03 4.768849071633e-03 8.035852126683e-03 + 1.487064024503e-02 2.606573607176e-02 3.698176850558e-02 + 3.995761726083e-02 2.896502633013e-02 1.798662183923e-02 1.102145070565e-02 7.149023091629e-03 4.701438975973e-03 + 3.137135283566e-03 2.513406452481e-03 2.802545594012e-03 3.982792131212e-03 6.443234114465e-03 1.157559450063e-02 + 2.122079529331e-02 3.405395846378e-02 4.261508740426e-02 + 2.612476752741e-02 1.538211298955e-02 9.250542635556e-03 6.104818135930e-03 4.155647771335e-03 2.909695231712e-03 + 2.452651878206e-03 2.766125803426e-03 3.831574778315e-03 6.164252249561e-03 1.147853790220e-02 2.185184977290e-02 + 3.529946448329e-02 4.302235793283e-02 3.835526614151e-02 + 1.475690833251e-02 9.595246852158e-03 6.479586986602e-03 4.477463024479e-03 3.089731375329e-03 2.358915187583e-03 + 2.319078595210e-03 2.883477699025e-03 4.076964763033e-03 6.441807840478e-03 1.109280313633e-02 1.828227710048e-02 + 2.499622537608e-02 2.636050063328e-02 2.155302836640e-02 + 8.870028340925e-03 6.395246238359e-03 4.510365457118e-03 3.099918702114e-03 2.241966797322e-03 1.984590740218e-03 + 2.241520841837e-03 2.894749796309e-03 3.997032464616e-03 5.942626094462e-03 9.094829523676e-03 1.280797292393e-02 + 1.513606934467e-02 1.460572822821e-02 1.192462990383e-02 + 5.860522422628e-03 4.369127189319e-03 3.075003726246e-03 2.195026193350e-03 1.820856385965e-03 1.880588970888e-03 + 2.233563099148e-03 2.791732303928e-03 3.676829675673e-03 5.119052448968e-03 7.011305057753e-03 8.653729000900e-03 + 9.244108191097e-03 8.649336428075e-03 7.362884379327e-03 + 3.973810633074e-03 3.040347964832e-03 2.285313251936e-03 1.884924960609e-03 1.829183449848e-03 1.983549691229e-03 + 2.219838481962e-03 2.573892663528e-03 3.247231486207e-03 4.308349968256e-03 5.422122342397e-03 6.066045450677e-03 + 6.045739452329e-03 5.568194911805e-03 4.853405847528e-03 + 2.885730460669e-03 2.464063415454e-03 2.166136091709e-03 2.076393909159e-03 2.118384219142e-03 2.149128144793e-03 + 2.152428614123e-03 2.305328050381e-03 2.787130750103e-03 3.502669498484e-03 4.060255473621e-03 4.168882649908e-03 + 3.935817389903e-03 3.614964663710e-03 3.282076624383e-03 + 2.627788925179e-03 2.590335269749e-03 2.567800461816e-03 2.575396811840e-03 2.516835384101e-03 2.328770700557e-03 + 2.125919534935e-03 2.108976387706e-03 2.347371971086e-03 2.671066772004e-03 2.815443624739e-03 2.725668241264e-03 + 2.588269048027e-03 2.559152460990e-03 2.609644317753e-03 + 3.115486338831e-03 3.315233983984e-03 3.377234841870e-03 3.295355260034e-03 3.047553117708e-03 2.672154947215e-03 + 2.302070456399e-03 2.069767666175e-03 1.996841047386e-03 1.998500245957e-03 1.996750225094e-03 2.013117255941e-03 + 2.137007758220e-03 2.417131047567e-03 2.787831538779e-03 + 4.469988471123e-03 4.899538464499e-03 4.875948429969e-03 4.492062751751e-03 3.941605210625e-03 3.329905192238e-03 + 2.701277421723e-03 2.149745319074e-03 1.795842311158e-03 1.693367508144e-03 1.810228430255e-03 2.074799990608e-03 + 2.465167069160e-03 3.026566082946e-03 3.751574463821e-03 + 7.796815986635e-03 8.522945082186e-03 7.877884021050e-03 6.543848583068e-03 5.262237246964e-03 4.156303181232e-03 + 3.100971981876e-03 2.217659842001e-03 1.756664191850e-03 1.783588423829e-03 2.159237059297e-03 2.675771851745e-03 + 3.335955847310e-03 4.422614562879e-03 6.085001419538e-03 + 1.578784479054e-02 1.595590983776e-02 1.286546507960e-02 9.216163991279e-03 6.573118136087e-03 4.726886586030e-03 + 3.226873111143e-03 2.191541589964e-03 1.849264076861e-03 2.135515847557e-03 2.768167728242e-03 3.558730110153e-03 + 4.929678865732e-03 7.754380589687e-03 1.210475969996e-02 + 3.046209208360e-02 2.660868314269e-02 1.820095932997e-02 1.125448470478e-02 7.204333976641e-03 4.766376228039e-03 + 3.062172594730e-03 2.129901355406e-03 2.039391425625e-03 2.585943837498e-03 3.490469269122e-03 5.034604570931e-03 + 8.651776674373e-03 1.602692536245e-02 2.552751460497e-02 + 4.654203305816e-02 3.444973664470e-02 2.037169061038e-02 1.143522348431e-02 6.947817050129e-03 4.417417292556e-03 + 2.822701863866e-03 2.153295087777e-03 2.339698910997e-03 3.155053641530e-03 4.666299924681e-03 8.224177695201e-03 + 1.680393111062e-02 3.166544907850e-02 4.551993187271e-02 + 5.173655451699e-02 3.311083030114e-02 1.794608648006e-02 9.958577681727e-03 6.161794209189e-03 3.954417294716e-03 + 2.666033468135e-03 2.314388921206e-03 2.786060821365e-03 4.017218078154e-03 6.798895269588e-03 1.389112036840e-02 + 2.890193394974e-02 4.894324283409e-02 5.989930623533e-02 + 4.170787154172e-02 2.442026540864e-02 1.330694724452e-02 7.951072021559e-03 5.202484555421e-03 3.463561417286e-03 + 2.569991308914e-03 2.554620042858e-03 3.336826670018e-03 5.165724010134e-03 9.598958071565e-03 1.994710993027e-02 + 3.757951830940e-02 5.421591931452e-02 5.596617674227e-02 + 1.853259771931e-02 1.019886281523e-02 6.178914946441e-03 4.080836106473e-03 2.791976692164e-03 2.210722293685e-03 + 2.319581808087e-03 3.003255730225e-03 4.412558784929e-03 7.803590581365e-03 1.585230361210e-02 2.960094615765e-02 + 4.230191460439e-02 4.312104415756e-02 3.176062222008e-02 + 9.829602822261e-03 6.345454895673e-03 4.269671643987e-03 2.879254929759e-03 2.096027223981e-03 1.953321769066e-03 + 2.335817372198e-03 3.099762252046e-03 4.463321830705e-03 7.435701793546e-03 1.317773670056e-02 2.046282100075e-02 + 2.447122898723e-02 2.190532465839e-02 1.550496928546e-02 + 5.951105415409e-03 4.212808954489e-03 2.860297358627e-03 1.978806593757e-03 1.665379544518e-03 1.843885331201e-03 + 2.330203657428e-03 2.993543949637e-03 4.077140477151e-03 6.144441851010e-03 9.250201202231e-03 1.203530703384e-02 + 1.261707553133e-02 1.082986304284e-02 8.208220065452e-03 + 3.922616703106e-03 2.835514724065e-03 1.998294289525e-03 1.590564219784e-03 1.608420793704e-03 1.906043246504e-03 + 2.291754197395e-03 2.750283793736e-03 3.539930383162e-03 4.843301949524e-03 6.308652838685e-03 7.162798125035e-03 + 7.000583586394e-03 6.140395340754e-03 5.053259156814e-03 + 2.730252153426e-03 2.156246612262e-03 1.786893818183e-03 1.708476520454e-03 1.848709824850e-03 2.039891519781e-03 + 2.200128441304e-03 2.470379077968e-03 3.042597608791e-03 3.836279419094e-03 4.451952705113e-03 4.572948985648e-03 + 4.286570904716e-03 3.842518450162e-03 3.326542366922e-03 + 2.315197342019e-03 2.165661235880e-03 2.106562631307e-03 2.147936486460e-03 2.187503723949e-03 2.143231168711e-03 + 2.095378028382e-03 2.218496243400e-03 2.562790900480e-03 2.930374155883e-03 3.052152451648e-03 2.906759942280e-03 + 2.699501172177e-03 2.565246251240e-03 2.461192461720e-03 + 2.595964372684e-03 2.695315864383e-03 2.728609102570e-03 2.676162174905e-03 2.508308928961e-03 2.268554018791e-03 + 2.075390418618e-03 2.018600296787e-03 2.065881178348e-03 2.087932368230e-03 2.017249082073e-03 1.939257137183e-03 + 1.981792787993e-03 2.172073263022e-03 2.413616274227e-03 + 3.488542438294e-03 3.691276544455e-03 3.619662269505e-03 3.337333773670e-03 2.962554900375e-03 2.571381226423e-03 + 2.197271226022e-03 1.879240238441e-03 1.660590649841e-03 1.563420899937e-03 1.597135126370e-03 1.767600571889e-03 + 2.090124119583e-03 2.555014486904e-03 3.067849565093e-03 + 5.557487390595e-03 5.853417813599e-03 5.375507973967e-03 4.543717853798e-03 3.760654255380e-03 3.067045100569e-03 + 2.380018546055e-03 1.791983199370e-03 1.483977252145e-03 1.522617394675e-03 1.829843196264e-03 2.265359513195e-03 + 2.817197967244e-03 3.603674370827e-03 4.628199121562e-03 + 1.113939029151e-02 1.106996778631e-02 8.944184288551e-03 6.524703415806e-03 4.771851309074e-03 3.506617548532e-03 + 2.450446926951e-03 1.740666927832e-03 1.569764384573e-03 1.903310416597e-03 2.488650626782e-03 3.127555876293e-03 + 4.118139584189e-03 6.041348922505e-03 8.872387497899e-03 + 2.410421976137e-02 2.080270395551e-02 1.404878657328e-02 8.599728275431e-03 5.470418433914e-03 3.602550040937e-03 + 2.341629950380e-03 1.737324428569e-03 1.841364800949e-03 2.454761388786e-03 3.241535593731e-03 4.410715170998e-03 + 7.196906614918e-03 1.297868238597e-02 2.041102779952e-02 + 4.370456572565e-02 3.144544928536e-02 1.777499667081e-02 9.450140549552e-03 5.466331350096e-03 3.364126307207e-03 + 2.175083915838e-03 1.820861243020e-03 2.194477194549e-03 3.013308026245e-03 4.283484950862e-03 7.393040874538e-03 + 1.541741708723e-02 2.979413789891e-02 4.319280957915e-02 + 5.738667866000e-02 3.462704617734e-02 1.718008106619e-02 8.629866362433e-03 4.929605015973e-03 3.032748950179e-03 + 2.104054223319e-03 2.032474725592e-03 2.638435899276e-03 3.805837539044e-03 6.504434267630e-03 1.421537063344e-02 + 3.177032628152e-02 5.580216511673e-02 6.837862196958e-02 + 5.250624027643e-02 2.773366359614e-02 1.322104800737e-02 6.996821637519e-03 4.241066830103e-03 2.756274001865e-03 + 2.159366473872e-03 2.365066621014e-03 3.232452244450e-03 5.137968878483e-03 1.047199262587e-02 2.457404122119e-02 + 5.008777563254e-02 7.402128346580e-02 7.486895437815e-02 + 3.463804005455e-02 1.750710494686e-02 9.054440801528e-03 5.426391283427e-03 3.538187210252e-03 2.499956423116e-03 + 2.258491896069e-03 2.728271437841e-03 3.908409888391e-03 6.789931074216e-03 1.466663611065e-02 3.192415290093e-02 + 5.509517489561e-02 6.719525706476e-02 5.669505514833e-02 + 1.080172803582e-02 6.042785473381e-03 3.777718911831e-03 2.520777299795e-03 1.902686073726e-03 1.871775381230e-03 + 2.326629190525e-03 3.182737076481e-03 4.891245621266e-03 9.198114767741e-03 1.840412824865e-02 3.063592420154e-02 + 3.697718530540e-02 3.148920959361e-02 1.994220524868e-02 + 5.869765292977e-03 3.857462999727e-03 2.583466107847e-03 1.842798513157e-03 1.643140914981e-03 1.897235163876e-03 + 2.451140153612e-03 3.222318822602e-03 4.650101308087e-03 7.766441617013e-03 1.289990941184e-02 1.758134082914e-02 + 1.802797554622e-02 1.411083687332e-02 9.274100481569e-03 + 3.650414171308e-03 2.552522884468e-03 1.801829452219e-03 1.495892026097e-03 1.599695716325e-03 1.975346062496e-03 + 2.440407712405e-03 2.985357862342e-03 3.962528864875e-03 5.718768267299e-03 7.834134756451e-03 9.018043082001e-03 + 8.463359033372e-03 6.793762278430e-03 5.054366193145e-03 + 2.444613018517e-03 1.855966076851e-03 1.541353773510e-03 1.540889732905e-03 1.770388043913e-03 2.064565610343e-03 + 2.318357514709e-03 2.653190860248e-03 3.280174662765e-03 4.156174060508e-03 4.867221583819e-03 5.001816838577e-03 + 4.580926528686e-03 3.903121346495e-03 3.165633738404e-03 + 1.941408074716e-03 1.770074337752e-03 1.757755940888e-03 1.884249960774e-03 2.035033386259e-03 2.110161126724e-03 + 2.165894179193e-03 2.360487333404e-03 2.734776045294e-03 3.102586617176e-03 3.221239461982e-03 3.061300865334e-03 + 2.780257620901e-03 2.490870311991e-03 2.205724780591e-03 + 2.063187004190e-03 2.168682032150e-03 2.276231672989e-03 2.323394807771e-03 2.259237742955e-03 2.129275316986e-03 + 2.051663764567e-03 2.096422939965e-03 2.201762379837e-03 2.224841654902e-03 2.108728345854e-03 1.950623275738e-03 + 1.871315277435e-03 1.895436877573e-03 1.972594070188e-03 + 2.680372359512e-03 2.881087782805e-03 2.896243946719e-03 2.730835230804e-03 2.472615692043e-03 2.213272652655e-03 + 1.994339101755e-03 1.816885200905e-03 1.670126972243e-03 1.549581602160e-03 1.482553209579e-03 1.523125301387e-03 + 1.707150220964e-03 2.013029717953e-03 2.364757245206e-03 + 3.864452093552e-03 4.026066650926e-03 3.762539419622e-03 3.293242454778e-03 2.834042952086e-03 2.408732700021e-03 + 1.967808848953e-03 1.567714633376e-03 1.328638552172e-03 1.301460099087e-03 1.461674070210e-03 1.758232300993e-03 + 2.177701399377e-03 2.725080302637e-03 3.345252277984e-03 + 6.756099017632e-03 6.646415365864e-03 5.546870321094e-03 4.307533065955e-03 3.369770637716e-03 2.616103542101e-03 + 1.919800140371e-03 1.428455159996e-03 1.301714267052e-03 1.532585034092e-03 1.966255843766e-03 2.461423291660e-03 + 3.137652094537e-03 4.236634508780e-03 5.685680523167e-03 + 1.443870669056e-02 1.250437884909e-02 8.717002089443e-03 5.650291185289e-03 3.833385316292e-03 2.660475672278e-03 + 1.816501512873e-03 1.422373552816e-03 1.555584500724e-03 2.076439505584e-03 2.693785103508e-03 3.482212385485e-03 + 5.167886205648e-03 8.467490008635e-03 1.253795167936e-02 + 2.963354482529e-02 2.129525980695e-02 1.212474159989e-02 6.581303010476e-03 3.922113425988e-03 2.492446243950e-03 + 1.695439082163e-03 1.530322575288e-03 1.938344986195e-03 2.647112948772e-03 3.566879864917e-03 5.671719441490e-03 + 1.106089737276e-02 2.064685078443e-02 2.948261488031e-02 + 4.646154224574e-02 2.748523273079e-02 1.324323431843e-02 6.456176678104e-03 3.621934133459e-03 2.240803946847e-03 + 1.641459794139e-03 1.731762033486e-03 2.345387370567e-03 3.310429114923e-03 5.402289935270e-03 1.154118283463e-02 + 2.584823135229e-02 4.564797706505e-02 5.589188144372e-02 + 5.066849373552e-02 2.546018585086e-02 1.125099509362e-02 5.497613849333e-03 3.161901844663e-03 2.045737660357e-03 + 1.709980195882e-03 2.036871793688e-03 2.868203488327e-03 4.551781192005e-03 9.505962503725e-03 2.335150579910e-02 + 4.921518586334e-02 7.366744380208e-02 7.408421436212e-02 + 3.833987134072e-02 1.759307817614e-02 8.046025905565e-03 4.362598452110e-03 2.708081638134e-03 1.940900588321e-03 + 1.887944690446e-03 2.438129985382e-03 3.609095135170e-03 6.618517901350e-03 1.563695323127e-02 3.664409236865e-02 + 6.559800922617e-02 8.041138739495e-02 6.633062653367e-02 + 2.164328352783e-02 1.028142526476e-02 5.470207966213e-03 3.373596827148e-03 2.285193687929e-03 1.891022645977e-03 + 2.115754010104e-03 2.866411437191e-03 4.433617738645e-03 8.696650736688e-03 1.989942523628e-02 4.015789855824e-02 + 5.902852581789e-02 5.934450473021e-02 4.129872097478e-02 + 5.467227682267e-03 3.369220511967e-03 2.293152443176e-03 1.751003996711e-03 1.652048605827e-03 1.917272198549e-03 + 2.472568965154e-03 3.323163834828e-03 5.062119049590e-03 9.129993046047e-03 1.617273564946e-02 2.264076038325e-02 + 2.280500666930e-02 1.668141101510e-02 9.772017250737e-03 + 3.289505142682e-03 2.322043133624e-03 1.763104279211e-03 1.599986761149e-03 1.770512621940e-03 2.160355418964e-03 + 2.646012556122e-03 3.266102700891e-03 4.473153809155e-03 6.794409189329e-03 9.710792678083e-03 1.123543358252e-02 + 1.006215059035e-02 7.330066784112e-03 4.872212349791e-03 + 2.214126788081e-03 1.747354038243e-03 1.578672448867e-03 1.708353815350e-03 2.022527099442e-03 2.348961284011e-03 + 2.603602941920e-03 2.938909653556e-03 3.608164955325e-03 4.597088971605e-03 5.423918437627e-03 5.514496658987e-03 + 4.832517685439e-03 3.835489713724e-03 2.920783750617e-03 + 1.726292350941e-03 1.635291328180e-03 1.758232305301e-03 2.041900569727e-03 2.306951568314e-03 2.405824082655e-03 + 2.426717016602e-03 2.578968783537e-03 2.908707226932e-03 3.235914378883e-03 3.341060578200e-03 3.168519247023e-03 + 2.807977900983e-03 2.379646444393e-03 1.993396562094e-03 + 1.736985224519e-03 1.914288239060e-03 2.184285551509e-03 2.418259024779e-03 2.459340784678e-03 2.331243765099e-03 + 2.228699126693e-03 2.266627909902e-03 2.361885738272e-03 2.362355501244e-03 2.227182355849e-03 2.026566001855e-03 + 1.834354594940e-03 1.706244324787e-03 1.672155545380e-03 + 2.141724317895e-03 2.448220558771e-03 2.656371371379e-03 2.657499732873e-03 2.467115324824e-03 2.224700879648e-03 + 2.044275337128e-03 1.924492539749e-03 1.802264931825e-03 1.652031245553e-03 1.510577515651e-03 1.433488739741e-03 + 1.462514673837e-03 1.606833930557e-03 1.843808747912e-03 + 2.873155897893e-03 3.123060352980e-03 3.085960582084e-03 2.827606401373e-03 2.498992804386e-03 2.176414931306e-03 + 1.852529973995e-03 1.542421768118e-03 1.313899519548e-03 1.209661889631e-03 1.229349504205e-03 1.368793632156e-03 + 1.627198403407e-03 1.997154278187e-03 2.444273358504e-03 + 4.186553223894e-03 4.206449893922e-03 3.746375731295e-03 3.161255556982e-03 2.652673013736e-03 2.166986087907e-03 + 1.658188814285e-03 1.258818016471e-03 1.099978123817e-03 1.179937730432e-03 1.427160184491e-03 1.773862325776e-03 + 2.235472507585e-03 2.872946740968e-03 3.627629150481e-03 + 7.419180815867e-03 6.624362240509e-03 5.049228252779e-03 3.711007593454e-03 2.820548546624e-03 2.105503078779e-03 + 1.495385906706e-03 1.166728220117e-03 1.201460563105e-03 1.521885408744e-03 1.959819720475e-03 2.494024783040e-03 + 3.397907607261e-03 4.917851494622e-03 6.647310950986e-03 + 1.495961594641e-02 1.110694770163e-02 6.848814615229e-03 4.204341669061e-03 2.828263706329e-03 1.949260917908e-03 + 1.383758829948e-03 1.241893660661e-03 1.518838638416e-03 2.027949210441e-03 2.644998298627e-03 3.820019017296e-03 + 6.510853888027e-03 1.100066803855e-02 1.497735176873e-02 + 2.652394710860e-02 1.595368311056e-02 8.061019244419e-03 4.282720645316e-03 2.635303938767e-03 1.747429354795e-03 + 1.336180561811e-03 1.422736298588e-03 1.899162525161e-03 2.587038400715e-03 3.889411533530e-03 7.460006002666e-03 + 1.549480812026e-02 2.640064592602e-02 3.189968446492e-02 + 3.445871944439e-02 1.721668807997e-02 7.677621106666e-03 3.882222474917e-03 2.334655290592e-03 1.577899262588e-03 + 1.376468138792e-03 1.675581784810e-03 2.337594023818e-03 3.549925664432e-03 6.965610852628e-03 1.643425551249e-02 + 3.410274878628e-02 5.074037130438e-02 5.075431102068e-02 + 3.104428888284e-02 1.374116716706e-02 6.065775034374e-03 3.238980504123e-03 2.024738203517e-03 1.499551548790e-03 + 1.527510928735e-03 2.026052901369e-03 3.001710376749e-03 5.443752473345e-03 1.287355676415e-02 3.049795512110e-02 + 5.501669054221e-02 6.740180185758e-02 5.499539358664e-02 + 2.002178797300e-02 8.783942687058e-03 4.353687950828e-03 2.604519735868e-03 1.785527826619e-03 1.542032583727e-03 + 1.794016693633e-03 2.494749368976e-03 3.953695469226e-03 8.068611501829e-03 1.932994440272e-02 4.023525184605e-02 + 5.981090881465e-02 5.969593627134e-02 4.038446889137e-02 + 1.046415287058e-02 5.259203988462e-03 3.117253359412e-03 2.099932014167e-03 1.661663124341e-03 1.694201976114e-03 + 2.142105847867e-03 3.003522103005e-03 4.847775257336e-03 9.801553494451e-03 2.092160050510e-02 3.605983587385e-02 + 4.368482796666e-02 3.617866609900e-02 2.144937311087e-02 + 2.897067969921e-03 2.163605956587e-03 1.822115567659e-03 1.795373866309e-03 2.009484024991e-03 2.370946402554e-03 + 2.819497326028e-03 3.431070328592e-03 4.684135997433e-03 7.209443924744e-03 1.047232563013e-02 1.207998811390e-02 + 1.044610976668e-02 7.110670958159e-03 4.390528081435e-03 + 2.115853136729e-03 1.844270265169e-03 1.866665689406e-03 2.184190308252e-03 2.630219703779e-03 2.962176275320e-03 + 3.115242963207e-03 3.328699698662e-03 3.936586896287e-03 4.952287080143e-03 5.812420625681e-03 5.789517466748e-03 + 4.837492159415e-03 3.613710350389e-03 2.676463984084e-03 + 1.771188157118e-03 1.858491056511e-03 2.274404798580e-03 2.939637724211e-03 3.446473133079e-03 3.441563543446e-03 + 3.138928208848e-03 3.000424416838e-03 3.143124188352e-03 3.351289037160e-03 3.388165226627e-03 3.169540516573e-03 + 2.746848570012e-03 2.275465124977e-03 1.926992521927e-03 + 1.796789539133e-03 2.220536090311e-03 2.982772060770e-03 3.774607457603e-03 3.983028458090e-03 3.496854288384e-03 + 2.902839164090e-03 2.619762138117e-03 2.544327171734e-03 2.452272839248e-03 2.289281577632e-03 2.083475071090e-03 + 1.848928086157e-03 1.676195579921e-03 1.648689767224e-03 + 2.103882268208e-03 2.763963240063e-03 3.587979117640e-03 4.072432866326e-03 3.810421002166e-03 3.101115862441e-03 + 2.513424688376e-03 2.204007034376e-03 2.007000975363e-03 1.807461473240e-03 1.625101105513e-03 1.485243283951e-03 + 1.431512037628e-03 1.512524577667e-03 1.720103288905e-03 + 2.592779021453e-03 3.236400940293e-03 3.717747233493e-03 3.697774604708e-03 3.196502434292e-03 2.569988169674e-03 + 2.072858664983e-03 1.716669342623e-03 1.451535404090e-03 1.277806515610e-03 1.202129533186e-03 1.236490119726e-03 + 1.400582144497e-03 1.675521991621e-03 2.058868833428e-03 + 3.226780670427e-03 3.581351258736e-03 3.568864238114e-03 3.215817959651e-03 2.701613459341e-03 2.163542624254e-03 + 1.660909758947e-03 1.264617842827e-03 1.046774991790e-03 1.007877284369e-03 1.115630820924e-03 1.351993377480e-03 + 1.698595858632e-03 2.146252641829e-03 2.683404001954e-03 + 4.310767697510e-03 4.181472975045e-03 3.641905311901e-03 3.029240118116e-03 2.464370774167e-03 1.890295182915e-03 + 1.350177537222e-03 1.005639695487e-03 9.247452662178e-04 1.064536679739e-03 1.358060631105e-03 1.764917986603e-03 + 2.321193460621e-03 3.066696287359e-03 3.855110378292e-03 + 6.821615992615e-03 5.577267937076e-03 4.080143623951e-03 3.020877668816e-03 2.301744991378e-03 1.669206160750e-03 + 1.171992661797e-03 9.629041198270e-04 1.058132758627e-03 1.370510657946e-03 1.813805707514e-03 2.488275979659e-03 + 3.665547730758e-03 5.351428176550e-03 6.758721373841e-03 + 1.160496810231e-02 7.617408035660e-03 4.536694547159e-03 2.946013219865e-03 2.094303328035e-03 1.478029990209e-03 + 1.108086472077e-03 1.081524028554e-03 1.354464217469e-03 1.810929492672e-03 2.561592658545e-03 4.217251580583e-03 + 7.484193424033e-03 1.161558938250e-02 1.362012088352e-02 + 1.678921923097e-02 8.935367443813e-03 4.550481870898e-03 2.728755253284e-03 1.864772144319e-03 1.335433012089e-03 + 1.144731320141e-03 1.312828856097e-03 1.748995619100e-03 2.497394740258e-03 4.314865042008e-03 8.892847296055e-03 + 1.699878667946e-02 2.440926447077e-02 2.425377669342e-02 + 1.789473259968e-02 8.254680666745e-03 4.008898568396e-03 2.408369036571e-03 1.644806605782e-03 1.275620389533e-03 + 1.289437728663e-03 1.640902019640e-03 2.313495375181e-03 3.843640882855e-03 8.204779064405e-03 1.822042843418e-02 + 3.192879356430e-02 3.865675004277e-02 3.143001769198e-02 + 1.373751138620e-02 6.126164119108e-03 3.198932684562e-03 2.045690654970e-03 1.494466546187e-03 1.345623344454e-03 + 1.548105925705e-03 2.086090952907e-03 3.162712435421e-03 6.066659317858e-03 1.391295824666e-02 2.844828965839e-02 + 4.197547604429e-02 4.159842219375e-02 2.787568364778e-02 + 8.221211104854e-03 4.079638271075e-03 2.484965349997e-03 1.776211392724e-03 1.499887952885e-03 1.553477485943e-03 + 1.917559278184e-03 2.638603630886e-03 4.175075862974e-03 8.297432060869e-03 1.768002109569e-02 3.056707101981e-02 + 3.692056382426e-02 3.015139723150e-02 1.740411324709e-02 + 4.599251119014e-03 2.820979789500e-03 2.034261611745e-03 1.690209968183e-03 1.663887525768e-03 1.889476943709e-03 + 2.370415069310e-03 3.165912909499e-03 4.833070911901e-03 8.817998336935e-03 1.589691525477e-02 2.242361790289e-02 + 2.231993953824e-02 1.574225376947e-02 8.690643212578e-03 + 2.079996999711e-03 2.027522657674e-03 2.271715477053e-03 2.825699634941e-03 3.446707574620e-03 3.774752701139e-03 + 3.737288009769e-03 3.671933060654e-03 4.005122230571e-03 4.795254933599e-03 5.488106655395e-03 5.345100122264e-03 + 4.338755190015e-03 3.178260839840e-03 2.417921277215e-03 + 1.998237983150e-03 2.368164809305e-03 3.285210946890e-03 4.643295112375e-03 5.606819493450e-03 5.390483426881e-03 + 4.408907991033e-03 3.639517198689e-03 3.392161204020e-03 3.374676794848e-03 3.275717824173e-03 2.985226376699e-03 + 2.554255894522e-03 2.159169210796e-03 1.961790440846e-03 + 2.245789631267e-03 3.281396360190e-03 5.247543152848e-03 7.414705116477e-03 7.987830968947e-03 6.465410580047e-03 + 4.471285237885e-03 3.286804077704e-03 2.778914552198e-03 2.482198390251e-03 2.238460609745e-03 2.033468038701e-03 + 1.839310409499e-03 1.745007250990e-03 1.846125406814e-03 + 2.838625965740e-03 4.670670814877e-03 7.441247740986e-03 9.394442997124e-03 8.638674473532e-03 6.039233439700e-03 + 3.835399514031e-03 2.736286655866e-03 2.235456320204e-03 1.913070304377e-03 1.692165306639e-03 1.552096480485e-03 + 1.516092174044e-03 1.658291068863e-03 2.009919643109e-03 + 3.530969750019e-03 5.711063712315e-03 8.078781029213e-03 8.679117034854e-03 6.922817677792e-03 4.502995959187e-03 + 2.888375501830e-03 2.102820412714e-03 1.689285265317e-03 1.429834319662e-03 1.296012064028e-03 1.297815207832e-03 + 1.472674319450e-03 1.787172444927e-03 2.334946208476e-03 + 3.971177877052e-03 5.617309242015e-03 6.654601154509e-03 6.140410202278e-03 4.542648573348e-03 3.013964013316e-03 + 2.045311390488e-03 1.500509354240e-03 1.191039936133e-03 1.054598775167e-03 1.082602498720e-03 1.287448587753e-03 + 1.621748120279e-03 2.046138704711e-03 2.734575335607e-03 + 4.094357254322e-03 4.781760192472e-03 4.764813395084e-03 4.014370398288e-03 2.993062284656e-03 2.104829803237e-03 + 1.463519708031e-03 1.059567051915e-03 8.774025830362e-04 8.973172574004e-04 1.110410915919e-03 1.483073379774e-03 + 1.942052808268e-03 2.484242937490e-03 3.205195384704e-03 + 4.350913116998e-03 4.216863390666e-03 3.670280559247e-03 2.970300264477e-03 2.271448421643e-03 1.627520747991e-03 + 1.120731013372e-03 8.383965668717e-04 7.968125661255e-04 9.745214553686e-04 1.342558916499e-03 1.861709280198e-03 + 2.508942588015e-03 3.257367350373e-03 3.965908837695e-03 + 5.355881028047e-03 4.274283618057e-03 3.235195142290e-03 2.492712714880e-03 1.893673400154e-03 1.348423675803e-03 + 9.582021987504e-04 8.173642959285e-04 9.235697407573e-04 1.239567794411e-03 1.759994167750e-03 2.572521582304e-03 + 3.759373436255e-03 5.057866309449e-03 5.750129513843e-03 + 7.022913535841e-03 4.521848412920e-03 2.971193192978e-03 2.173777895340e-03 1.629458440434e-03 1.186626760681e-03 + 9.512039614524e-04 9.765952985783e-04 1.228286093732e-03 1.701635932442e-03 2.594420932553e-03 4.335486629841e-03 + 6.987032945488e-03 9.260539576869e-03 9.255222651137e-03 + 8.064792960943e-03 4.393520229333e-03 2.677866948654e-03 1.926526793910e-03 1.448693235808e-03 1.150149455789e-03 + 1.106833793624e-03 1.301345170398e-03 1.714449172524e-03 2.530789219989e-03 4.454421046526e-03 8.374398659825e-03 + 1.341781637251e-02 1.579345220676e-02 1.309345764341e-02 + 7.284417862917e-03 3.751355813870e-03 2.343562251463e-03 1.719628095670e-03 1.367878379766e-03 1.270907213520e-03 + 1.405821685948e-03 1.756119661116e-03 2.404362482196e-03 3.927123518683e-03 7.703695491298e-03 1.439784489801e-02 + 2.047208135113e-02 2.015459666930e-02 1.379113693291e-02 + 5.256853092007e-03 2.920646002797e-03 2.012634999277e-03 1.596659412171e-03 1.458574695850e-03 1.532383514222e-03 + 1.793925039970e-03 2.288559202475e-03 3.246095336649e-03 5.646471517006e-03 1.099126868350e-02 1.827588011703e-02 + 2.178431542618e-02 1.779050358208e-02 1.046802463803e-02 + 3.451898057855e-03 2.301272117621e-03 1.835094570544e-03 1.678740183589e-03 1.730542630644e-03 1.915577258165e-03 + 2.271058439943e-03 2.851628807803e-03 3.998236299460e-03 6.707214363945e-03 1.158432603488e-02 1.610228307306e-02 + 1.591987487745e-02 1.118517655373e-02 6.235169382183e-03 + 2.474935954005e-03 2.027517568360e-03 1.898146618444e-03 2.008910969392e-03 2.266213886232e-03 2.576701677285e-03 + 2.919940279733e-03 3.365383822248e-03 4.294811874154e-03 6.274070703782e-03 8.919533536512e-03 1.018028837608e-02 + 8.671350272040e-03 5.793044478456e-03 3.576228682692e-03 + 2.268618836602e-03 2.982142759893e-03 4.461885056599e-03 6.537459356656e-03 7.942674916590e-03 7.477629162836e-03 + 5.743308896384e-03 4.241394311177e-03 3.522761098666e-03 3.236299167052e-03 2.982254388023e-03 2.632774575925e-03 + 2.250807203523e-03 1.998580512941e-03 1.997046706867e-03 + 2.966285611839e-03 4.944922257700e-03 8.687781951197e-03 1.282227947469e-02 1.387636519460e-02 1.080750473352e-02 + 6.719971996048e-03 4.188422479893e-03 3.070509795204e-03 2.505312099215e-03 2.131322639275e-03 1.898296833273e-03 + 1.776120804033e-03 1.830924368860e-03 2.153339884472e-03 + 4.446338670275e-03 8.681196515929e-03 1.531233663949e-02 2.005997666539e-02 1.815556322248e-02 1.167190428286e-02 + 6.217182506716e-03 3.578478521029e-03 2.512922156236e-03 1.970484295191e-03 1.667258130283e-03 1.546560098645e-03 + 1.601748815429e-03 1.914613826236e-03 2.632385319242e-03 + 6.536568808969e-03 1.282075205938e-02 2.005260974174e-02 2.197907299739e-02 1.652262039960e-02 9.167006056066e-03 + 4.617491232581e-03 2.731303803510e-03 1.962567583487e-03 1.552614257779e-03 1.361729751671e-03 1.380711143185e-03 + 1.652358223182e-03 2.204113146915e-03 3.416256458650e-03 + 7.983714587715e-03 1.391266982005e-02 1.815915915623e-02 1.650676079435e-02 1.069337079587e-02 5.610093627904e-03 + 3.018604414406e-03 1.965867436594e-03 1.470432930204e-03 1.212126999655e-03 1.178633052979e-03 1.400796572336e-03 + 1.840438994227e-03 2.548703250583e-03 4.187341567259e-03 + 7.609142325993e-03 1.093547396202e-02 1.174367164353e-02 9.188220280864e-03 5.622934351117e-03 3.175588805963e-03 + 1.975027299172e-03 1.399382063742e-03 1.087934574497e-03 9.937231831086e-04 1.155170238481e-03 1.547554809607e-03 + 2.067412691384e-03 2.859390962239e-03 4.536340999066e-03 + 5.992182606686e-03 6.952027556323e-03 6.378426282987e-03 4.713904411249e-03 3.085157359148e-03 2.016540783167e-03 + 1.394997844785e-03 1.024782034364e-03 8.599301054168e-04 9.365495759237e-04 1.270274134631e-03 1.777720482965e-03 + 2.355416090190e-03 3.127674190504e-03 4.386968454330e-03 + 4.641658258076e-03 4.500480026557e-03 3.785903588756e-03 2.876325609686e-03 2.083029297002e-03 1.482932126300e-03 + 1.060202027290e-03 8.245982741500e-04 8.075305113545e-04 1.036600716863e-03 1.499939349561e-03 2.099542473379e-03 + 2.743469083220e-03 3.448482695829e-03 4.177846622998e-03 + 4.142690549862e-03 3.446474424951e-03 2.733066943687e-03 2.129434125586e-03 1.611539918395e-03 1.181994933580e-03 + 9.022418623609e-04 8.179471391097e-04 9.450652477357e-04 1.301362189100e-03 1.878205258062e-03 2.634298947807e-03 + 3.487995764779e-03 4.216589272688e-03 4.481273832221e-03 + 4.044273572412e-03 2.911057482056e-03 2.196073362507e-03 1.727047749188e-03 1.343264607924e-03 1.065430868704e-03 + 9.621311831057e-04 1.038045054216e-03 1.299008049927e-03 1.780311752236e-03 2.580718976064e-03 3.796818096698e-03 + 5.157049226945e-03 5.848825843318e-03 5.312433416968e-03 + 3.751728522322e-03 2.487499603935e-03 1.873883002262e-03 1.513433756092e-03 1.265677079423e-03 1.182899125243e-03 + 1.259577194074e-03 1.476077165736e-03 1.850486685659e-03 2.523771491732e-03 3.850078832382e-03 5.931238981560e-03 + 7.743974059323e-03 7.694124818620e-03 5.817713857052e-03 + 3.124636426664e-03 2.127956394525e-03 1.692326765257e-03 1.469044158731e-03 1.421823391966e-03 1.518739438792e-03 + 1.713647770846e-03 2.018696809745e-03 2.487096037289e-03 3.465823949012e-03 5.491118439748e-03 8.173652555191e-03 + 9.455648065136e-03 7.969117175364e-03 5.189755023325e-03 + 2.449240665060e-03 1.882946953462e-03 1.675631441824e-03 1.673956392669e-03 1.811175299377e-03 1.991421342351e-03 + 2.234220736745e-03 2.557455553087e-03 3.083009389681e-03 4.285750926193e-03 6.488292543136e-03 8.553256426766e-03 + 8.445003211817e-03 6.190558238097e-03 3.810924486135e-03 + 2.052309656922e-03 1.879313490745e-03 1.947739562108e-03 2.198719620734e-03 2.504679330161e-03 2.760083452611e-03 + 2.957586282287e-03 3.136381438875e-03 3.530773905669e-03 4.525106878160e-03 5.958192927969e-03 6.632984936989e-03 + 5.694020767048e-03 3.961337122988e-03 2.655465515461e-03 + 2.014026344200e-03 2.183931751441e-03 2.654003798912e-03 3.413042310553e-03 4.146482145219e-03 4.424599204174e-03 + 4.172228759558e-03 3.776886719031e-03 3.702333308130e-03 4.051536570209e-03 4.406412048518e-03 4.198306829766e-03 + 3.407008591650e-03 2.574144489405e-03 2.110287575508e-03 diff --git a/tests/01_PW/nscf_hse_same/eig_occ.txt b/tests/01_PW/nscf_hse_same/eig_occ.txt new file mode 100644 index 0000000000..cf5895f7dc --- /dev/null +++ b/tests/01_PW/nscf_hse_same/eig_occ.txt @@ -0,0 +1,13 @@ +1 # ionic step + Electronic state energy (eV) and occupations + Spin number 1 + spin=1 k-point=1/2 Cartesian=0.0000000 0.0000000 0.0000000 (137 plane wave) + 1 -11.12768112632454 1.000000000000000 + 2 0.2323374417247880 0.000000000000000 + 3 5.913816152912471 0.000000000000000 + + spin=1 k-point=2/2 Cartesian=-0.09230756733744730 0.09230756733744730 0.09230756733744730 (138 plane wave) + 1 -8.189957518901499 1.000000000000000 + 2 -4.744242172101769 0.000000000000000 + 3 4.630928303470863 0.000000000000000 + diff --git a/tests/01_PW/nscf_hse_same/result.ref b/tests/01_PW/nscf_hse_same/result.ref new file mode 100644 index 0000000000..d98de69975 --- /dev/null +++ b/tests/01_PW/nscf_hse_same/result.ref @@ -0,0 +1,4 @@ +etotref -33.63676769132638 +etotperatomref -16.8183838457 +CompareBand_pass 0 +totaltimeref 0.08 diff --git a/tests/01_PW/nscf_hse_same/wfk1_pw.dat b/tests/01_PW/nscf_hse_same/wfk1_pw.dat new file mode 100644 index 0000000000..da05022468 Binary files /dev/null and b/tests/01_PW/nscf_hse_same/wfk1_pw.dat differ diff --git a/tests/01_PW/nscf_hse_same/wfk2_pw.dat b/tests/01_PW/nscf_hse_same/wfk2_pw.dat new file mode 100644 index 0000000000..64e9328b42 Binary files /dev/null and b/tests/01_PW/nscf_hse_same/wfk2_pw.dat differ