diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 234b2bf..3b16f9b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -26,9 +26,9 @@ env: ninja cmake gcovr + jobs: gcc-build: - runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: @@ -43,6 +43,11 @@ jobs: sanitizer: none buildtype: release + runs-on: ${{ matrix.os }} + + permissions: + contents: read + env: FC: gfortran CC: gcc @@ -52,7 +57,9 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 + with: + persist-credentials: false - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 @@ -62,23 +69,29 @@ jobs: - name: Install GCC ${{ matrix.GCC_V }} (OSX) if: contains(matrix.os, 'macos') run: | - ln -s /usr/local/bin/gfortran-${{ env.GCC_V }} /usr/local/bin/gfortran - ln -s /usr/local/bin/gcc-${{ env.GCC_V }} /usr/local/bin/gcc - ln -s /usr/local/bin/g++-${{ env.GCC_V }} /usr/local/bin/g++ + ln -s /usr/local/bin/gfortran-${GCC_V} /usr/local/bin/gfortran + ln -s /usr/local/bin/gcc-${GCC_V} /usr/local/bin/gcc + ln -s /usr/local/bin/g++-${GCC_V} /usr/local/bin/g++ + env: + GCC_V: ${{ env.GCC_V }} - name: Install GCC (Linux) run: | sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt-get update - sudo apt-get install gcc-${{ env.GCC_V }} g++-${{ env.GCC_V }} gfortran-${{ env.GCC_V }} + sudo apt-get install gcc-${GCC_V} g++-${GCC_V} gfortran-${GCC_V} + env: + GCC_V: ${{ env.GCC_V }} - name: Set GCC Version (Linux) if: contains(matrix.os, 'ubuntu') run: >- sudo update-alternatives - --install /usr/bin/gcc gcc /usr/bin/gcc-${{ env.GCC_V }} 100 - --slave /usr/bin/gfortran gfortran /usr/bin/gfortran-${{ env.GCC_V }} - --slave /usr/bin/gcov gcov /usr/bin/gcov-${{ env.GCC_V }} + --install /usr/bin/gcc gcc /usr/bin/gcc-${GCC_V} 100 + --slave /usr/bin/gfortran gfortran /usr/bin/gfortran-${GCC_V} + --slave /usr/bin/gcov gcov /usr/bin/gcov-${GCC_V} + env: + GCC_V: ${{ env.GCC_V }} - name: Install CBLAS and LAPACKE if: contains(matrix.os, 'ubuntu') @@ -95,7 +108,7 @@ jobs: --libdir=lib --warnlevel=0 -Dsanitizer=${{ matrix.sanitizer }} - -Db_coverage=${{ env.COVERAGE }} + -Db_coverage=${COVERAGE} env: COVERAGE: ${{ contains(matrix.os, 'ubuntu') && 'true' || 'false' }} @@ -107,7 +120,7 @@ jobs: meson test -C ${{ env.M_BUILD_DIR }} --print-errorlogs --no-rebuild --num-processes 2 -t 2 - name: Create coverage report - if: matrix.os == 'ubuntu-latest' && matrix.GCC_V == '11' + if: matrix.os == 'ubuntu-latest' && matrix.GCC_V == '12' run: | ninja -C ${{ env.M_BUILD_DIR }} coverage @@ -117,7 +130,8 @@ jobs: echo "DFTD4_PREFIX=$PWD/_dist" >> $GITHUB_ENV - name: Upload coverage to Codecov - uses: codecov/codecov-action@v3 - if: matrix.os == 'ubuntu-latest' && matrix.GCC_V == '11' + uses: codecov/codecov-action@7f8b4b4bde536c465e797be725718b88c5d95e0e # 5.1.1 + if: matrix.os == 'ubuntu-latest' && matrix.GCC_V == '12' with: files: ./coverage.xml # optional + verbose: true # optional (default = false) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..07a79a4 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,22 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-shebang-scripts-are-executable + - id: check-toml + - id: check-yaml + - id: check-added-large-files + args: ["--maxkb=20000"] + + - repo: https://github.com/pre-commit/mirrors-clang-format + rev: v21.1.7 + hooks: + - id: clang-format + types_or: [c++, c, cuda] + + - repo: https://github.com/woodruffw/zizmor-pre-commit + rev: v1.18.0 + hooks: + - id: zizmor diff --git a/app/main.cpp b/app/main.cpp index b9dd6a3..0d97c6e 100644 --- a/app/main.cpp +++ b/app/main.cpp @@ -96,7 +96,7 @@ void help() { is a valid xmol file (coordinates in Ångström). (Turbomole coordinate file (coordinates in Bohr) not yet supported!) - + Options: @@ -146,7 +146,8 @@ int main(int argc, char **argv) { } else if (args.getflag("-f")) { func = args.getopt("-f"); } else { - printf("WARNING: No functional given (via '--func'). Defaulting to PBE.\n\n" + printf( + "WARNING: No functional given (via '--func'). Defaulting to PBE.\n\n" ); func = "pbe"; } diff --git a/include/dftd_cblas.h b/include/dftd_cblas.h index 75f6fb9..468f9a3 100644 --- a/include/dftd_cblas.h +++ b/include/dftd_cblas.h @@ -1,13 +1,16 @@ /* * This file contains code adapted from the ORCA quantum chemistry program. - * ORCA is developed by the group of Prof. Frank Neese at the Max-Planck-Institut für Kohlenforschung, - * Mülheim an der Ruhr and FAccTs GmbH. ORCA is licensed by the Max-Planck-Institut für Kohlenforschung and FAccTs GmbH. + * ORCA is developed by the group of Prof. Frank Neese at the + * Max-Planck-Institut für Kohlenforschung, Mülheim an der Ruhr and FAccTs GmbH. + * ORCA is licensed by the Max-Planck-Institut für Kohlenforschung and FAccTs + * GmbH. * - * The inclusion of ORCA code in this file has been done with the explicit permission - * of the ORCA developers. + * The inclusion of ORCA code in this file has been done with the explicit + * permission of the ORCA developers. * - * For reuse or licensing of this code, please contact the ORCA team at the Max-Planck-Institut - * für Kohlenforschung (https://orcaforum.kofo.mpg.de/) or FAccTs GmbH (https://www.faccts.de/). + * For reuse or licensing of this code, please contact the ORCA team at the + * Max-Planck-Institut für Kohlenforschung (https://orcaforum.kofo.mpg.de/) or + * FAccTs GmbH (https://www.faccts.de/). */ #pragma once @@ -35,8 +38,8 @@ inline int BLAS_Add_Mat_x_Vec( bool Transpose, double alpha ) { - if (Transpose) { - if (A.cols == C.N && A.rows == V.N) { + if (Transpose) { + if (A.cols == C.N && A.rows == V.N) { cblas_dgemv( CblasRowMajor, CblasTrans, @@ -54,7 +57,7 @@ inline int BLAS_Add_Mat_x_Vec( return EXIT_SUCCESS; }; } else { - if (A.rows == C.N && A.cols == V.N) { + if (A.rows == C.N && A.cols == V.N) { cblas_dgemv( CblasRowMajor, CblasNoTrans, @@ -98,7 +101,7 @@ inline int BLAS_Add_Mat_x_Mat( // check for size 0 matrices if (A.cols == 0 || A.rows == 0 || B.cols == 0 || B.rows == 0 || C.cols == 0 || C.rows == 0) { - exit(EXIT_FAILURE); + exit(EXIT_FAILURE); }; // check for transpositions @@ -221,9 +224,9 @@ inline int BLAS_InvertMatrix(TMatrix &a) { (lapack_int)a.cols, ipiv ); - if (info != 0) { + if (info != 0) { delete[] ipiv; - return EXIT_FAILURE; + return EXIT_FAILURE; } // Inverse of an LU-factored general matrix @@ -240,19 +243,19 @@ inline int BLAS_InvertMatrix(TMatrix &a) { /** * @brief Solve a symmetric linear system A * X = B for X. * - * This routine factorizes a symmetric matrix A using Bunch-Kaufman factorization - * and solves for the right-hand side vector B. The matrix A is overwritten - * by its factorization. The solution overwrites B. + * This routine factorizes a symmetric matrix A using Bunch-Kaufman + * factorization and solves for the right-hand side vector B. The matrix A is + * overwritten by its factorization. The solution overwrites B. * * @param A Symmetric matrix of size (m x m). Overwritten by the factorization. * @param B Right-hand side vector of size m. Overwritten by the solution. * @return int Returns EXIT_SUCCESS (0) on success, EXIT_FAILURE (1) on error. */ inline int BLAS_SolveSymmetric( - TMatrix &A, // symmetric matrix - TVector &B // RHS vector (becomes solution) + TMatrix &A, // symmetric matrix + TVector &B // RHS vector (becomes solution) ) { - const lapack_int m = A.rows; + const lapack_int m = A.rows; const lapack_int nrhs = 1; if (A.cols != m || B.N != m) { @@ -272,7 +275,8 @@ inline int BLAS_SolveSymmetric( } // Solve for all RHS columns - info = LAPACKE_dsytrs(LAPACK_ROW_MAJOR, 'L', m, nrhs, A.p, m, ipiv, B.p, nrhs); + info = + LAPACKE_dsytrs(LAPACK_ROW_MAJOR, 'L', m, nrhs, A.p, m, ipiv, B.p, nrhs); delete[] ipiv; if (info != 0) { diff --git a/include/dftd_eeq.h b/include/dftd_eeq.h index b88dd93..4fba3c1 100644 --- a/include/dftd_eeq.h +++ b/include/dftd_eeq.h @@ -27,245 +27,259 @@ #include "dftd_ncoord.h" namespace multicharge { - using dftd4::TIVector; - using dftd4::TVector; - using dftd4::TMatrix; - using dftd4::TMolecule; - using dftd4::NCoordErf; - using dftd4::NCoordErfEN; - -class ChargeModel -{ -public: - NCoordErf ncoord_erf; // coordination number - // Constructor - ChargeModel(); - // Virtual destructor - virtual ~ChargeModel() {} - - /** - * Get the EEQ charges for a given molecule. - * - * @param mol The molecule object - * @param dist The distance matrix - * @param charge The total charge of the molecule - * @param cutoff The cutoff for the EEQ coordination number - * @param q The EEQ charges - * @param dqdr The derivative of the EEQ charges - * @param lgrad Flag for the gradient - * - * @return 0 if successful, 1 otherwise - */ - int get_charges( - const TMolecule &mol, - const TMatrix &dist, - int charge, - double cutoff, - TVector &q, - TMatrix &dqdr, - bool lgrad - ); - - /** - * Get the EEQ charges for a given molecule for the atoms specified by the - * indices in `realIdx`. - * - * @param mol The molecule object - * @param realIdx The real atom indices (for excluding dummy atoms) - * @param dist The distance matrix - * @param charge The total charge of the molecule - * @param cutoff The cutoff for the EEQ coordination number - * @param q The EEQ charges - * @param dqdr The derivative of the EEQ charges - * @param lgrad Flag for the gradient - * - * @return 0 if successful, 1 otherwise - */ - int get_charges( - const TMolecule &mol, - const TIVector &realIdx, - const TMatrix &dist, - int charge, - double cutoff, - TVector &q, - TMatrix &dqdr, - bool lgrad - ); - - /** - * Solves the Electronegativity Equalization (EEQ) equations for a molecule, - * yielding atomic partial charges and, optionally, their derivatives. - * - * @param mol Molecule object containing atomic information. - * @param realIdx Mapping of real atom indices (excludes dummy atoms). - * @param dist Interatomic distance matrix. - * @param cn Coordination numbers for each atom. - * @param dcndr Derivative of coordination numbers with respect to - * atomic positions. - * @param charge Target total charge of the molecule. - * @param qvec Output vector of atomic charges (size: number of atoms). - * @param dqdr Output matrix of charge derivatives with respect to - * atomic positions. Only filled if `lgrad` is true. - * @param lgrad If true, compute charge gradients (dq/dr) in addition to charges. - * @param lverbose If true, print diagnostic output (charges, EN values, diagonals). - * - * @returns EXIT_SUCCESS (0) on success, or a nonzero error code if matrix - * inversion or setup fails. - */ - int eeq_chrgeq( - const TMolecule &mol, - const TIVector &realIdx, - const TMatrix &dist, - const TVector &cn, - const TMatrix &dcndr, - const int &charge, - TVector &qvec, - TMatrix &dqdr, - bool lgrad = false, - bool lverbose = false - ); - - /** - * Computes the right-hand side vector (Xvec) for the EEQ charge equations. - * Optionally computes its derivatives with respect to atomic positions. - * - * @param mol Molecule object containing atomic information. - * @param realIdx Mapping of real atom indices (excludes dummy atoms). - * @param charge Target total charge of the molecule. - * @param dist Interatomic distance matrix. - * @param cn Coordination numbers for each atom. - * @param dcndr Derivative of the coordination number w.r.t. atom positions - * @param xvec Output vector representing the effective driving term for the - * EEQ system (size: number of atoms). - * @param dxvecdr Output vector of derivatives of xvec w.r.t. atom positions. - * Only filled if `lgrad` is true. - * @param qloc Local charge (EEQ-BC specific). - * @param dqlocdr Derivative of the local charge (EEQ-BC specific). - * @param cmat Capacitance matrix. - * @param dcmatdr Derivative of the capacitance matrix. - * @param lgrad If true, compute derivatives of Xvec. - * - * @returns EXIT_SUCCESS (0) on success, or a nonzero error code if the computation fails. - */ - virtual int get_vrhs( - const TMolecule &mol, - const TIVector &realIdx, - const int &charge, - const TMatrix &dist, - const TVector &cn, - const TMatrix &dcndr, - TVector &xvec, - TMatrix &dxvecdr, - TVector &qloc, - TMatrix &dqlocdr, - TMatrix &cmat, - TMatrix &dcmatdr, - bool lgrad - ) = 0; - - /** - * Computes the Coulomb interaction matrix for the charge model. - * The matrix represents the electrostatic interactions between atoms, - * optionally including model-specific self-terms and normalization factors. - * It forms the left-hand side (A) of the EEQ linear system: A Q = X. - * - * @param mol Molecule object containing atomic information. - * @param realIdx Mapping of real atom indices (excludes dummy atoms). - * @param dist Interatomic distance matrix. - * @param cn Coordination numbers for each atom. - * @param qloc Local charge (EEQ-BC specific) - * @param cmat Capacitance matrix (EEQ-BC specific) - * @param Amat Output Coulomb matrix (size: number of atoms + 1 for charge constraint). - * - * @returns EXIT_SUCCESS (0) on success, or a nonzero error code if the computation fails. - */ - virtual int get_amat_0d( - const TMolecule &mol, - const TIVector &realIdx, - const TMatrix &dist, - const TVector &cn, - const TVector &qloc, - const TMatrix &cmat, - TMatrix &Amat - ) const = 0; - - /** - * Computes the derivatives of the Coulomb interaction matrix with respect to atomic positions. - * These derivatives are used to propagate the effect of the charge distribution on forces - * or gradients in the EEQ linear system. - * - * @param mol Molecule object containing atomic information. - * @param realIdx Mapping of real atom indices (excludes virtual atoms). - * @param dist Interatomic distance matrix. - * @param q Atomic charges computed from the EEQ model. - * @param Amat Output coulomb matrix. - * @param dAmatdr Output derivative matrix with respect to Cartesian coordinates. - * @param atrace Output trace contributions for the derivative. - * @param cn Coordination numbers for each atom. - * @param dcndr Derivative of the coordination number w.r.t. atom positions - * @param qloc Local charge (EEQ-BC specific). - * @param dqlocdr Derivative of the local charge (EEQ-BC specific). - * @param cmat Capacitance matrix. - * @param dcmatdr Derivative of the capacitance matrix. - * - * @returns EXIT_SUCCESS (0) on success, or a nonzero error code if the computation fails. - */ - virtual int get_damat_0d( - const TMolecule &mol, - const TIVector &realIdx, - const TMatrix &dist, - const TVector &q, - const TMatrix &Amat, - TMatrix &dAmatdr, - TMatrix &atrace, - const TVector &cn, - const TMatrix &dcndr, - const TVector &qloc, - const TMatrix &dqlocdr, - const TMatrix &cmat, - const TMatrix &dcmatdr - ) const = 0; - - /** - * This function calculates the coordination number (CN) for each atom in the molecule. - * It also optionally computes the derivatives of CN with respect to Cartesian coordinates - * if `lgrad` is true. The actual computation is forwarded to the `get_ncoord` method - * of the `NCoordErf` object specific to the derived charge model. - * - * @param mol Molecule object containing atomic information. - * @param realIdx Mapping of real atom indices (excluding dummy atoms). - * @param dist Interatomic distance matrix. - * @param cn Output vector of coordination numbers for each atom. - * @param dcndr Output matrix of derivatives of CN with respect to Cartesian coordinates. - * @param lgrad If true, compute derivatives of CN; otherwise, skip derivative calculation. - * - * @returns EXIT_SUCCESS (0) on success, or a nonzero error code if the computation fails. - * - * @throws std::runtime_error if the coordination number computation fails in the derived class. - */ - virtual int get_cn( - const TMolecule &mol, - const TIVector &realIdx, - const TMatrix &dist, - TVector &cn, - TMatrix &dcndr, - bool lgrad - ) = 0; - +using dftd4::NCoordErf; +using dftd4::NCoordErfEN; +using dftd4::TIVector; +using dftd4::TMatrix; +using dftd4::TMolecule; +using dftd4::TVector; + +class ChargeModel { + public: + NCoordErf ncoord_erf; // coordination number + // Constructor + ChargeModel(); + // Virtual destructor + virtual ~ChargeModel() {} + + /** + * Get the EEQ charges for a given molecule. + * + * @param mol The molecule object + * @param dist The distance matrix + * @param charge The total charge of the molecule + * @param cutoff The cutoff for the EEQ coordination number + * @param q The EEQ charges + * @param dqdr The derivative of the EEQ charges + * @param lgrad Flag for the gradient + * + * @return 0 if successful, 1 otherwise + */ + int get_charges( + const TMolecule &mol, + const TMatrix &dist, + int charge, + double cutoff, + TVector &q, + TMatrix &dqdr, + bool lgrad + ); + + /** + * Get the EEQ charges for a given molecule for the atoms specified by the + * indices in `realIdx`. + * + * @param mol The molecule object + * @param realIdx The real atom indices (for excluding dummy atoms) + * @param dist The distance matrix + * @param charge The total charge of the molecule + * @param cutoff The cutoff for the EEQ coordination number + * @param q The EEQ charges + * @param dqdr The derivative of the EEQ charges + * @param lgrad Flag for the gradient + * + * @return 0 if successful, 1 otherwise + */ + int get_charges( + const TMolecule &mol, + const TIVector &realIdx, + const TMatrix &dist, + int charge, + double cutoff, + TVector &q, + TMatrix &dqdr, + bool lgrad + ); + + /** + * Solves the Electronegativity Equalization (EEQ) equations for a molecule, + * yielding atomic partial charges and, optionally, their derivatives. + * + * @param mol Molecule object containing atomic information. + * @param realIdx Mapping of real atom indices (excludes dummy atoms). + * @param dist Interatomic distance matrix. + * @param cn Coordination numbers for each atom. + * @param dcndr Derivative of coordination numbers with respect to + * atomic positions. + * @param charge Target total charge of the molecule. + * @param qvec Output vector of atomic charges (size: number of + * atoms). + * @param dqdr Output matrix of charge derivatives with respect to + * atomic positions. Only filled if `lgrad` is true. + * @param lgrad If true, compute charge gradients (dq/dr) in addition + * to charges. + * @param lverbose If true, print diagnostic output (charges, EN values, + * diagonals). + * + * @returns EXIT_SUCCESS (0) on success, or a nonzero error code if matrix + * inversion or setup fails. + */ + int eeq_chrgeq( + const TMolecule &mol, + const TIVector &realIdx, + const TMatrix &dist, + const TVector &cn, + const TMatrix &dcndr, + const int &charge, + TVector &qvec, + TMatrix &dqdr, + bool lgrad = false, + bool lverbose = false + ); + + /** + * Computes the right-hand side vector (Xvec) for the EEQ charge equations. + * Optionally computes its derivatives with respect to atomic positions. + * + * @param mol Molecule object containing atomic information. + * @param realIdx Mapping of real atom indices (excludes dummy atoms). + * @param charge Target total charge of the molecule. + * @param dist Interatomic distance matrix. + * @param cn Coordination numbers for each atom. + * @param dcndr Derivative of the coordination number w.r.t. atom + * positions + * @param xvec Output vector representing the effective driving term + * for the EEQ system (size: number of atoms). + * @param dxvecdr Output vector of derivatives of xvec w.r.t. atom + * positions. Only filled if `lgrad` is true. + * @param qloc Local charge (EEQ-BC specific). + * @param dqlocdr Derivative of the local charge (EEQ-BC specific). + * @param cmat Capacitance matrix. + * @param dcmatdr Derivative of the capacitance matrix. + * @param lgrad If true, compute derivatives of Xvec. + * + * @returns EXIT_SUCCESS (0) on success, or a nonzero error code if the + * computation fails. + */ + virtual int get_vrhs( + const TMolecule &mol, + const TIVector &realIdx, + const int &charge, + const TMatrix &dist, + const TVector &cn, + const TMatrix &dcndr, + TVector &xvec, + TMatrix &dxvecdr, + TVector &qloc, + TMatrix &dqlocdr, + TMatrix &cmat, + TMatrix &dcmatdr, + bool lgrad + ) = 0; + + /** + * Computes the Coulomb interaction matrix for the charge model. + * The matrix represents the electrostatic interactions between atoms, + * optionally including model-specific self-terms and normalization factors. + * It forms the left-hand side (A) of the EEQ linear system: A Q = X. + * + * @param mol Molecule object containing atomic information. + * @param realIdx Mapping of real atom indices (excludes dummy atoms). + * @param dist Interatomic distance matrix. + * @param cn Coordination numbers for each atom. + * @param qloc Local charge (EEQ-BC specific) + * @param cmat Capacitance matrix (EEQ-BC specific) + * @param Amat Output Coulomb matrix (size: number of atoms + 1 for + * charge constraint). + * + * @returns EXIT_SUCCESS (0) on success, or a nonzero error code if the + * computation fails. + */ + virtual int get_amat_0d( + const TMolecule &mol, + const TIVector &realIdx, + const TMatrix &dist, + const TVector &cn, + const TVector &qloc, + const TMatrix &cmat, + TMatrix &Amat + ) const = 0; + + /** + * Computes the derivatives of the Coulomb interaction matrix with respect + * to atomic positions. These derivatives are used to propagate the effect + * of the charge distribution on forces or gradients in the EEQ linear + * system. + * + * @param mol Molecule object containing atomic information. + * @param realIdx Mapping of real atom indices (excludes virtual atoms). + * @param dist Interatomic distance matrix. + * @param q Atomic charges computed from the EEQ model. + * @param Amat Output coulomb matrix. + * @param dAmatdr Output derivative matrix with respect to Cartesian + * coordinates. + * @param atrace Output trace contributions for the derivative. + * @param cn Coordination numbers for each atom. + * @param dcndr Derivative of the coordination number w.r.t. atom + * positions + * @param qloc Local charge (EEQ-BC specific). + * @param dqlocdr Derivative of the local charge (EEQ-BC specific). + * @param cmat Capacitance matrix. + * @param dcmatdr Derivative of the capacitance matrix. + * + * @returns EXIT_SUCCESS (0) on success, or a nonzero error code if the + * computation fails. + */ + virtual int get_damat_0d( + const TMolecule &mol, + const TIVector &realIdx, + const TMatrix &dist, + const TVector &q, + const TMatrix &Amat, + TMatrix &dAmatdr, + TMatrix &atrace, + const TVector &cn, + const TMatrix &dcndr, + const TVector &qloc, + const TMatrix &dqlocdr, + const TMatrix &cmat, + const TMatrix &dcmatdr + ) const = 0; + + /** + * This function calculates the coordination number (CN) for each atom in + * the molecule. It also optionally computes the derivatives of CN with + * respect to Cartesian coordinates if `lgrad` is true. The actual + * computation is forwarded to the `get_ncoord` method of the `NCoordErf` + * object specific to the derived charge model. + * + * @param mol Molecule object containing atomic information. + * @param realIdx Mapping of real atom indices (excluding dummy atoms). + * @param dist Interatomic distance matrix. + * @param cn Output vector of coordination numbers for each atom. + * @param dcndr Output matrix of derivatives of CN with respect to + * Cartesian coordinates. + * @param lgrad If true, compute derivatives of CN; otherwise, skip + * derivative calculation. + * + * @returns EXIT_SUCCESS (0) on success, or a nonzero error code if the + * computation fails. + * + * @throws std::runtime_error if the coordination number computation fails + * in the derived class. + */ + virtual int get_cn( + const TMolecule &mol, + const TIVector &realIdx, + const TMatrix &dist, + TVector &cn, + TMatrix &dcndr, + bool lgrad + ) = 0; }; // Derived class for EEQ charge model class EEQModel : public ChargeModel { public: - const double* xi; // Element-specific electronegativity - const double* gam; // Element-specific chemical hardnesses - const double* kappa; // Element-specific CN scaling constant - const double* alp; // Element-specific atomic radii - + const double *xi; // Element-specific electronegativity + const double *gam; // Element-specific chemical hardnesses + const double *kappa; // Element-specific CN scaling constant + const double *alp; // Element-specific atomic radii + // Constructs an EEQModel with element-specific parameters and // initializes its coordination number function. EEQModel(); - + // Computes the right-hand side vector (xvec) for the EEQ charge equations. // Optionally computes its derivatives with respect to atomic positions. int get_vrhs( @@ -283,7 +297,7 @@ class EEQModel : public ChargeModel { TMatrix &dcmatdr, bool lgrad ) override; - + // Calculate the Coulomb matrix int get_amat_0d( const TMolecule &mol, @@ -294,7 +308,7 @@ class EEQModel : public ChargeModel { const TMatrix &cmat, TMatrix &Amat ) const override; - + // Calculate the Coulomb matrix derivatives int get_damat_0d( const TMolecule &mol, @@ -332,29 +346,35 @@ class EEQBCModel : public ChargeModel { static constexpr double ncoorderf_f_directed = 1.0; static constexpr double ncoorderfen_f_directed = -1.0; static constexpr double ncoorderf_cn_max = -1.0; + public: const double kcnrad; - const double kbc; // scaling factor in erf() of bond capacitance matrix - const double cutoff; // coordination number distance cutoff + const double kbc; // scaling factor in erf() of bond capacitance matrix + const double cutoff; // coordination number distance cutoff const double cn_exp; const double norm_exp; - const double* chi; // Element-specific electronegativity - const double* eta; // Element-specific chemical hardnesses - const double* rad; // Element-specific charge widths - const double* kcnchi; // Element-specific CN scaling of the electronegativity - const double* kqchi; // Element-specific local q scaling of the electronegativity - const double* kqeta; // Element-specific local q scaling of the chemical hardness - const double* cap; // Element-specific bond capacitance - const double* cov_radii; // Element-specific covalent radii for the CN - const double* avg_cn; // Element-specific averaged coordination number over the fitset - const double* rvdw; // Element-pair-specific van der Waals radii based on distance - TVector qloc; // local charges - TMatrix cmat; // capacitance matrix + const double *chi; // Element-specific electronegativity + const double *eta; // Element-specific chemical hardnesses + const double *rad; // Element-specific charge widths + const double + *kcnchi; // Element-specific CN scaling of the electronegativity + const double + *kqchi; // Element-specific local q scaling of the electronegativity + const double + *kqeta; // Element-specific local q scaling of the chemical hardness + const double *cap; // Element-specific bond capacitance + const double *cov_radii; // Element-specific covalent radii for the CN + const double + *avg_cn; // Element-specific averaged coordination number over the fitset + const double + *rvdw; // Element-pair-specific van der Waals radii based on distance + TVector qloc; // local charges + TMatrix cmat; // capacitance matrix // Constructs an EEQ-BC model with element-specific parameters // and initializes its coordination number function. EEQBCModel(); - + // Computes the right-hand side vector (Xvec) for the EEQ charge equations. // Optionally computes its derivatives with respect to atomic positions. int get_vrhs( @@ -372,7 +392,7 @@ class EEQBCModel : public ChargeModel { TMatrix &dcmatdr, bool lgrad ) override; - + // Calculate the Coulomb matrix int get_amat_0d( const TMolecule &mol, @@ -383,7 +403,7 @@ class EEQBCModel : public ChargeModel { const TMatrix &cmat, TMatrix &Amat ) const override; - + // Calculate the Coulomb matrix derivatives int get_damat_0d( const TMolecule &mol, @@ -415,7 +435,7 @@ class EEQBCModel : public ChargeModel { int get_qloc( const TMolecule &mol, const TIVector &realIdx, - const TMatrix& dist, + const TMatrix &dist, const double q_tot, TVector &qloc, TMatrix &dqlocdr, @@ -423,28 +443,23 @@ class EEQBCModel : public ChargeModel { ); // Get the capacitance for bond between atoms i and j - int get_cpair( - int iat, - int jat, - double &dist_ij, - double &c_ij - ) const; + int get_cpair(int iat, int jat, double &dist_ij, double &c_ij) const; // Get the capacitance for bond between atoms i and j int get_dcpair( - double dist_ij, // distance between atom j to atom i - double rvdw_ijat, // pairwise van der Waals radii for ij atom types - double cap_ij, // product of bond capacitances for atom types of i and j - TVector &vec, // Vector from j to i - TVector &dcdr_ij // Out: Capacitance for bond ij + double dist_ij, // distance between atom j to atom i + double rvdw_ijat, // pairwise van der Waals radii for ij atom types + double cap_ij, // product of bond capacitances for atom types of i and j + TVector &vec, // Vector from j to i + TVector &dcdr_ij // Out: Capacitance for bond ij ) const; // Get the capacitance matrix int get_cmat( - const TMolecule& mol, + const TMolecule &mol, const TIVector &realIdx, - const TMatrix& dist, - TMatrix& cmat + const TMatrix &dist, + TMatrix &cmat ); // Get the capacitance matrix @@ -455,7 +470,8 @@ class EEQBCModel : public ChargeModel { TMatrix &cmat ); - // Get the right-hand side (electronegativity) of the set of linear equations + // Get the right-hand side (electronegativity) of the set of linear + // equations int get_xvec( const TMolecule &mol, const TIVector &realIdx, @@ -482,6 +498,5 @@ class EEQBCModel : public ChargeModel { TMatrix &dqlocdr, TMatrix &dcmatdr ); - }; } // namespace multicharge diff --git a/include/dftd_matrix.h b/include/dftd_matrix.h index 79b0e37..5998f9b 100644 --- a/include/dftd_matrix.h +++ b/include/dftd_matrix.h @@ -1,13 +1,16 @@ /* * This file contains code adapted from the ORCA quantum chemistry program. - * ORCA is developed by the group of Prof. Frank Neese at the Max-Planck-Institut für Kohlenforschung, - * Mülheim an der Ruhr and FAccTs GmbH. ORCA is licensed by the Max-Planck-Institut für Kohlenforschung and FAccTs GmbH. + * ORCA is developed by the group of Prof. Frank Neese at the + * Max-Planck-Institut für Kohlenforschung, Mülheim an der Ruhr and FAccTs GmbH. + * ORCA is licensed by the Max-Planck-Institut für Kohlenforschung and FAccTs + * GmbH. * - * The inclusion of ORCA code in this file has been done with the explicit permission - * of the ORCA developers. + * The inclusion of ORCA code in this file has been done with the explicit + * permission of the ORCA developers. * - * For reuse or licensing of this code, please contact the ORCA team at the Max-Planck-Institut - * für Kohlenforschung (https://orcaforum.kofo.mpg.de/) or FAccTs GmbH (https://www.faccts.de/). + * For reuse or licensing of this code, please contact the ORCA team at the + * Max-Planck-Institut für Kohlenforschung (https://orcaforum.kofo.mpg.de/) or + * FAccTs GmbH (https://www.faccts.de/). */ #pragma once diff --git a/include/dftd_model.h b/include/dftd_model.h index 64bbeb4..613fda5 100644 --- a/include/dftd_model.h +++ b/include/dftd_model.h @@ -94,4 +94,4 @@ extern int get_max_ref(const TMolecule &mol, int &mref); extern bool is_exceptional(double val); -} // namespace dftd4 \ No newline at end of file +} // namespace dftd4 diff --git a/include/dftd_multicharge_param.h b/include/dftd_multicharge_param.h index 33236d6..099b1aa 100644 --- a/include/dftd_multicharge_param.h +++ b/include/dftd_multicharge_param.h @@ -120,1414 +120,939 @@ static const double alp[MAXELEMENT]{ +1.34071499, }; -} // namespace eeq +} // namespace eeq namespace eeqbc { // Maximum value of the atom number implemented in the EEQ_BC model constexpr int MAXELEMENT = 104; -// +// const double kcnrad = 0.14; // bond capacity scaling factor const double kbc = 0.60; -// coordination number distance cutoff +// coordination number distance cutoff const double cutoff = 25.0; -// +// const double cn_exp = 2.0; -// +// const double norm_exp = 0.75; // Element-specific electronegativity for the EEQ_BC charges const double eeqbc_chi[MAXELEMENT]{ - 0.0, // dummy - 1.7500687479, 0.7992983109, 0.8817302909, 1.2122559922, // 1-4 - 1.4042606312, 1.7373300176, 1.9224220861, 2.0295674708, // 5-8 - 2.0914017724, 0.2783743672, 0.7909141712, 0.9333749946, // 9-12 - 1.1280735350, 1.3504642320, 1.7084529806, 1.9657999323, // 13-16 - 1.8796814465, 0.8120477849, 0.6229777212, 0.8955669337, // 17-20 - 0.8887941055, 0.9249293933, 0.8910306356, 0.8730274586, // 21-24 - 1.0692963783, 1.1430792497, 1.2352658732, 1.2511161359, // 25-28 - 1.0995052580, 1.0059572004, 1.0390725738, 1.2885924052, // 29-32 - 1.4638654613, 1.7797597799, 1.6400765990, 0.8859889377, // 33-36 - 0.5142094052, 0.8785352464, 0.9716967887, 0.8109573582, // 37-40 - 0.9361297862, 0.9872048394, 1.1290914832, 1.0416755409, // 41-44 - 1.1579060755, 1.1371382461, 1.1490154759, 1.0811257447, // 45-48 - 1.0201038561, 1.2317318949, 1.2546053590, 1.6136334955, // 49-52 - 1.5949826440, 0.8548714270, 0.5116591821, 0.8221154800, // 53-56 - 0.8992637384, 0.7835477700, 0.6865502434, 0.6063027416, // 57-60 - 0.5428052646, 0.4960578124, 0.4660603851, 0.4528129826, // 61-64 - 0.4563156049, 0.4765682521, 0.5135709241, 0.5673236209, // 65-68 - 0.6378263425, 0.7250790890, 0.8290818603, 0.8697550816, // 69-72 - 1.0442533196, 1.1429836348, 1.1622493128, 1.2650483683, // 73-76 - 1.2650500943, 1.3607929134, 1.3186071563, 1.0545750683, // 77-80 - 0.9074468503, 1.0892548243, 1.1983441731, 1.3955974910, // 81-84 - 1.6266506350, 0.9802627692, 0.4952498716, 0.7903508991, // 85-88 - 0.7482689572, 0.8666000614, 0.8153381406, 0.7700731721, // 89-92 - 0.7308051560, 0.6975340922, 0.6702599807, 0.6489828216, // 93-96 - 0.6337026148, 0.6244193604, 0.6211330583, 0.6238437086, // 97-100 - 0.6325513112, 0.6472558662, 0.6679573735 // 101-103 + 0.0, // dummy + 1.7500687479, 0.7992983109, 0.8817302909, 1.2122559922, // 1-4 + 1.4042606312, 1.7373300176, 1.9224220861, 2.0295674708, // 5-8 + 2.0914017724, 0.2783743672, 0.7909141712, 0.9333749946, // 9-12 + 1.1280735350, 1.3504642320, 1.7084529806, 1.9657999323, // 13-16 + 1.8796814465, 0.8120477849, 0.6229777212, 0.8955669337, // 17-20 + 0.8887941055, 0.9249293933, 0.8910306356, 0.8730274586, // 21-24 + 1.0692963783, 1.1430792497, 1.2352658732, 1.2511161359, // 25-28 + 1.0995052580, 1.0059572004, 1.0390725738, 1.2885924052, // 29-32 + 1.4638654613, 1.7797597799, 1.6400765990, 0.8859889377, // 33-36 + 0.5142094052, 0.8785352464, 0.9716967887, 0.8109573582, // 37-40 + 0.9361297862, 0.9872048394, 1.1290914832, 1.0416755409, // 41-44 + 1.1579060755, 1.1371382461, 1.1490154759, 1.0811257447, // 45-48 + 1.0201038561, 1.2317318949, 1.2546053590, 1.6136334955, // 49-52 + 1.5949826440, 0.8548714270, 0.5116591821, 0.8221154800, // 53-56 + 0.8992637384, 0.7835477700, 0.6865502434, 0.6063027416, // 57-60 + 0.5428052646, 0.4960578124, 0.4660603851, 0.4528129826, // 61-64 + 0.4563156049, 0.4765682521, 0.5135709241, 0.5673236209, // 65-68 + 0.6378263425, 0.7250790890, 0.8290818603, 0.8697550816, // 69-72 + 1.0442533196, 1.1429836348, 1.1622493128, 1.2650483683, // 73-76 + 1.2650500943, 1.3607929134, 1.3186071563, 1.0545750683, // 77-80 + 0.9074468503, 1.0892548243, 1.1983441731, 1.3955974910, // 81-84 + 1.6266506350, 0.9802627692, 0.4952498716, 0.7903508991, // 85-88 + 0.7482689572, 0.8666000614, 0.8153381406, 0.7700731721, // 89-92 + 0.7308051560, 0.6975340922, 0.6702599807, 0.6489828216, // 93-96 + 0.6337026148, 0.6244193604, 0.6211330583, 0.6238437086, // 97-100 + 0.6325513112, 0.6472558662, 0.6679573735 // 101-103 }; // Element-specific chemical hardnesses for the EEQ_BC charges const double eeqbc_eta[MAXELEMENT]{ - 0.0, // dummy - 0.3572813340, 14.1713349136, -0.0335574715, -2.2617753890, // 1-4 - -2.9993990603, -2.8456422314, -2.2316836385, -0.9048085573, // 5-8 - -3.3402942035, 11.6677100883, 0.0461110187 , -0.1623149426, // 9-12 - -0.1976009198, -3.6156182254, -4.8040123811, -5.8989254120, // 13-16 - -1.7918672558, 3.2077831067 , 0.4598658365 , -0.3196730368, // 17-20 - -0.0066012997, -0.0650415781, 0.0116105065 , -0.2020240365, // 21-24 - -0.0451985500, -0.8983846024, -0.5087624261, -0.9360254729, // 25-28 - -0.3137611925, 0.3714666864 , -0.5637510788, -1.5811888792, // 29-32 - -2.5680164043, -3.3791525742, -0.9039263250, 2.6191171553 , // 33-36 - 0.4517188832, -0.4737572247, -0.3291918172, -0.0641706161, // 37-40 - -0.4365721167, -0.1388382729, 0.0445179428 , -0.3077776724, // 41-44 - -0.1421769591, -0.3718332953, -0.9003899901, -0.5034953355, // 45-48 - -0.3154724874, -1.2061278491, -1.0351395610, -2.4727516433, // 49-52 - -0.5377076044, 2.1647776210 , 0.3592585022 , -0.6373016543, // 53-56 - -0.1481956999, -0.4595916155, -0.6048435529, -0.7208619618, // 57-60 - -0.8076468424, -0.8651981945, -0.8935160183, -0.8926003136, // 61-64 - -0.8624510805, -0.8030683191, -0.7144520292, -0.5966022109, // 65-68 - -0.4495188642, -0.2732019891, -0.0676515856, -0.1339322663, // 69-72 - -0.7103642117, -0.1700796179, -0.1362891699, -1.0705189016, // 73-76 - -0.8229572159, -1.3207540081, -2.0554362750, -0.2654477885, // 77-80 - -0.0736143849, -1.1221956034, -0.1821999108, -0.7727065022, // 81-84 - -0.4699768943, 0.6377347433 , 0.4140010159 , -0.2353223377, // 85-88 - -0.1309097826, 0.1881855179 , 0.2007222471 , 0.1912792246 , // 89-92 - 0.1598564505, 0.1064539248 , 0.0310716475 , -0.0662903814, // 93-96 - -0.1856321619, -0.3269536941, -0.4902549779, -0.6755360133, // 97-100 - -0.8827968003, -1.1120373389, -1.3632576292 // 101-103 + 0.0, // dummy + 0.3572813340, 14.1713349136, -0.0335574715, -2.2617753890, // 1-4 + -2.9993990603, -2.8456422314, -2.2316836385, -0.9048085573, // 5-8 + -3.3402942035, 11.6677100883, 0.0461110187, -0.1623149426, // 9-12 + -0.1976009198, -3.6156182254, -4.8040123811, -5.8989254120, // 13-16 + -1.7918672558, 3.2077831067, 0.4598658365, -0.3196730368, // 17-20 + -0.0066012997, -0.0650415781, 0.0116105065, -0.2020240365, // 21-24 + -0.0451985500, -0.8983846024, -0.5087624261, -0.9360254729, // 25-28 + -0.3137611925, 0.3714666864, -0.5637510788, -1.5811888792, // 29-32 + -2.5680164043, -3.3791525742, -0.9039263250, 2.6191171553, // 33-36 + 0.4517188832, -0.4737572247, -0.3291918172, -0.0641706161, // 37-40 + -0.4365721167, -0.1388382729, 0.0445179428, -0.3077776724, // 41-44 + -0.1421769591, -0.3718332953, -0.9003899901, -0.5034953355, // 45-48 + -0.3154724874, -1.2061278491, -1.0351395610, -2.4727516433, // 49-52 + -0.5377076044, 2.1647776210, 0.3592585022, -0.6373016543, // 53-56 + -0.1481956999, -0.4595916155, -0.6048435529, -0.7208619618, // 57-60 + -0.8076468424, -0.8651981945, -0.8935160183, -0.8926003136, // 61-64 + -0.8624510805, -0.8030683191, -0.7144520292, -0.5966022109, // 65-68 + -0.4495188642, -0.2732019891, -0.0676515856, -0.1339322663, // 69-72 + -0.7103642117, -0.1700796179, -0.1362891699, -1.0705189016, // 73-76 + -0.8229572159, -1.3207540081, -2.0554362750, -0.2654477885, // 77-80 + -0.0736143849, -1.1221956034, -0.1821999108, -0.7727065022, // 81-84 + -0.4699768943, 0.6377347433, 0.4140010159, -0.2353223377, // 85-88 + -0.1309097826, 0.1881855179, 0.2007222471, 0.1912792246, // 89-92 + 0.1598564505, 0.1064539248, 0.0310716475, -0.0662903814, // 93-96 + -0.1856321619, -0.3269536941, -0.4902549779, -0.6755360133, // 97-100 + -0.8827968003, -1.1120373389, -1.3632576292 // 101-103 }; // Element-specific charge widths for the EEQ_BC charges const double eeqbc_rad[MAXELEMENT]{ - 0.0, // dummy - 0.4537866920, 0.8971879958, 0.3987756594, 0.2435934990, // 1-4 - 0.2119711703, 0.2064066867, 0.2398313485, 0.3482853216, // 5-8 - 0.1479057386, 1.4433940527, 0.6317031456, 0.7152255265, // 9-12 - 0.6920759433, 0.1952261525, 0.1478738486, 0.1173410276, // 13-16 - 0.2188836429, 0.7265491450, 1.0062576628, 0.6529550574, // 17-20 - 1.0787300626, 1.0194369772, 0.7673907688, 0.8234907812, // 21-24 - 0.7956000862, 0.4194926962, 0.6577871621, 0.4350022430, // 25-28 - 0.5436327263, 1.2387687941, 0.5125789654, 0.3834386963, // 29-32 - 0.2781070074, 0.2053677667, 0.3191301456, 3.4957602962, // 33-36 - 0.8847073217, 0.6739335178, 0.8092111775, 0.8229663676, // 37-40 - 0.7341667740, 0.8802988629, 1.1234870897, 0.5654595735, // 41-44 - 0.7749739189, 0.6091511140, 0.4788100227, 0.6104947355, // 45-48 - 0.6518973596, 0.4348284778, 0.4885595700, 0.2660054523, // 49-52 - 0.4274914591, 2.3114324559, 0.9734795056, 0.6329900422, // 53-56 - 1.0109847900, 0.6287499845, 0.5401093486, 0.4679527826, // 57-60 - 0.4122802864, 0.3730918601, 0.3503875036, 0.3441672169, // 61-64 - 0.3544310001, 0.3811788531, 0.4244107759, 0.4841267686, // 65-68 - 0.5603268311, 0.6530109634, 0.7621791656, 1.0577606985, // 69-72 - 0.6844888492, 0.9102124518, 0.8550543040, 0.4138761210, // 73-76 - 0.5593056202, 0.3751752813, 0.2949155601, 0.6769971683, // 77-80 - 0.7124606732, 0.4519163133, 1.0405678353, 0.6688421527, // 81-84 - 0.4838599292, 0.9792188430, 0.8793273061, 0.8333325045, // 85-88 - 0.8202868436, 1.7807640816, 1.5641357264, 1.3644976007, // 89-92 - 1.1818497047, 1.0161920382, 0.8675246014, 0.7358473941, // 93-96 - 0.6211604164, 0.5234636683, 0.4427571498, 0.3790408609, // 97-100 - 0.3323148016, 0.3025789719, 0.2898333718 // 101-103 + 0.0, // dummy + 0.4537866920, 0.8971879958, 0.3987756594, 0.2435934990, // 1-4 + 0.2119711703, 0.2064066867, 0.2398313485, 0.3482853216, // 5-8 + 0.1479057386, 1.4433940527, 0.6317031456, 0.7152255265, // 9-12 + 0.6920759433, 0.1952261525, 0.1478738486, 0.1173410276, // 13-16 + 0.2188836429, 0.7265491450, 1.0062576628, 0.6529550574, // 17-20 + 1.0787300626, 1.0194369772, 0.7673907688, 0.8234907812, // 21-24 + 0.7956000862, 0.4194926962, 0.6577871621, 0.4350022430, // 25-28 + 0.5436327263, 1.2387687941, 0.5125789654, 0.3834386963, // 29-32 + 0.2781070074, 0.2053677667, 0.3191301456, 3.4957602962, // 33-36 + 0.8847073217, 0.6739335178, 0.8092111775, 0.8229663676, // 37-40 + 0.7341667740, 0.8802988629, 1.1234870897, 0.5654595735, // 41-44 + 0.7749739189, 0.6091511140, 0.4788100227, 0.6104947355, // 45-48 + 0.6518973596, 0.4348284778, 0.4885595700, 0.2660054523, // 49-52 + 0.4274914591, 2.3114324559, 0.9734795056, 0.6329900422, // 53-56 + 1.0109847900, 0.6287499845, 0.5401093486, 0.4679527826, // 57-60 + 0.4122802864, 0.3730918601, 0.3503875036, 0.3441672169, // 61-64 + 0.3544310001, 0.3811788531, 0.4244107759, 0.4841267686, // 65-68 + 0.5603268311, 0.6530109634, 0.7621791656, 1.0577606985, // 69-72 + 0.6844888492, 0.9102124518, 0.8550543040, 0.4138761210, // 73-76 + 0.5593056202, 0.3751752813, 0.2949155601, 0.6769971683, // 77-80 + 0.7124606732, 0.4519163133, 1.0405678353, 0.6688421527, // 81-84 + 0.4838599292, 0.9792188430, 0.8793273061, 0.8333325045, // 85-88 + 0.8202868436, 1.7807640816, 1.5641357264, 1.3644976007, // 89-92 + 1.1818497047, 1.0161920382, 0.8675246014, 0.7358473941, // 93-96 + 0.6211604164, 0.5234636683, 0.4427571498, 0.3790408609, // 97-100 + 0.3323148016, 0.3025789719, 0.2898333718 // 101-103 }; // Element-specific CN scaling of the electronegativity for the EEQ_BC charges const double eeqbc_kcnchi[MAXELEMENT]{ - 0.0, // dummy - 1.3415783494, 2.4226307746, 0.0910702713, -0.2802662922, // 1-4 - -0.0464303067, 0.3049790613, 0.5014914830, 0.7131712513, // 5-8 - 1.5978006993, 4.6934800245, -0.2311835622, -0.5722047540, // 9-12 - -0.1872404228, 0.1355861183, 0.5037598487, 0.8257488249, // 13-16 - 1.5828922925, 5.6324196990, -1.3574661808, -0.7114730764, // 17-20 - -0.8412840531, -0.8100781799, -0.7321477749, -0.5690936866, // 21-24 - -0.7978421025, -0.7081664947, -0.5311094926, -0.5561735098, // 25-28 - 0.1043470768, -0.2459258932, -0.2244771250, 0.0378446029, // 29-32 - 0.2939641775, 0.7336233202, 1.1960377617, 1.5974038323, // 33-36 - -0.5630850954, -1.1059510466, -0.7830773028, -0.9114834757, // 37-40 - -0.4093603622, -0.2717170095, -0.4691579275, -0.2257381361, // 41-44 - -0.1375984198, 0.3330053570, 0.0221109296, -0.0920402467, // 45-48 - -0.3096506887, 0.0088013637, 0.0730363100, 0.4356094483, // 49-52 - 1.0199146044, 1.0092039203, -0.7528024837, -1.1365506475, // 53-56 - -0.9661197708, -1.1514088354, -1.1092964223, -1.0718762355, // 57-60 - -1.0391482749, -1.0111125406, -0.9877690325, -0.9691177507, // 61-64 - -0.9551586951, -0.9458918658, -0.9413172627, -0.9414348859, // 65-68 - -0.9462447354, -0.9557468111, -0.9699411130, -0.9467711075, // 69-72 - -0.5854657957, -0.1956906192, -0.3841246137, -0.2184058724, // 73-76 - -0.2071244723, 0.1769757167, 0.5363613694, 0.0342662426, // 77-80 - -0.5074824777, -0.0048092213, -0.0546120433, 0.0560290491, // 81-84 - 0.8822097689, 0.9546406691, -1.8612818673, -1.2559850201, // 85-88 - -0.8232940275, -0.7432092987, -0.9259469469, -1.0588247895, // 89-92 - -1.1418428264, -1.1750010577, -1.1582994833, -1.0917381033, // 93-96 - -0.9753169176, -0.8090359263, -0.5928951293, -0.3268945267, // 97-100 - -0.0110341184, 0.3546860955, 0.7702661151 // 101-103 + 0.0, // dummy + 1.3415783494, 2.4226307746, 0.0910702713, -0.2802662922, // 1-4 + -0.0464303067, 0.3049790613, 0.5014914830, 0.7131712513, // 5-8 + 1.5978006993, 4.6934800245, -0.2311835622, -0.5722047540, // 9-12 + -0.1872404228, 0.1355861183, 0.5037598487, 0.8257488249, // 13-16 + 1.5828922925, 5.6324196990, -1.3574661808, -0.7114730764, // 17-20 + -0.8412840531, -0.8100781799, -0.7321477749, -0.5690936866, // 21-24 + -0.7978421025, -0.7081664947, -0.5311094926, -0.5561735098, // 25-28 + 0.1043470768, -0.2459258932, -0.2244771250, 0.0378446029, // 29-32 + 0.2939641775, 0.7336233202, 1.1960377617, 1.5974038323, // 33-36 + -0.5630850954, -1.1059510466, -0.7830773028, -0.9114834757, // 37-40 + -0.4093603622, -0.2717170095, -0.4691579275, -0.2257381361, // 41-44 + -0.1375984198, 0.3330053570, 0.0221109296, -0.0920402467, // 45-48 + -0.3096506887, 0.0088013637, 0.0730363100, 0.4356094483, // 49-52 + 1.0199146044, 1.0092039203, -0.7528024837, -1.1365506475, // 53-56 + -0.9661197708, -1.1514088354, -1.1092964223, -1.0718762355, // 57-60 + -1.0391482749, -1.0111125406, -0.9877690325, -0.9691177507, // 61-64 + -0.9551586951, -0.9458918658, -0.9413172627, -0.9414348859, // 65-68 + -0.9462447354, -0.9557468111, -0.9699411130, -0.9467711075, // 69-72 + -0.5854657957, -0.1956906192, -0.3841246137, -0.2184058724, // 73-76 + -0.2071244723, 0.1769757167, 0.5363613694, 0.0342662426, // 77-80 + -0.5074824777, -0.0048092213, -0.0546120433, 0.0560290491, // 81-84 + 0.8822097689, 0.9546406691, -1.8612818673, -1.2559850201, // 85-88 + -0.8232940275, -0.7432092987, -0.9259469469, -1.0588247895, // 89-92 + -1.1418428264, -1.1750010577, -1.1582994833, -1.0917381033, // 93-96 + -0.9753169176, -0.8090359263, -0.5928951293, -0.3268945267, // 97-100 + -0.0110341184, 0.3546860955, 0.7702661151 // 101-103 }; -// Element-specific local q scaling of the electronegativity for the EEQ_BC charges. +// Element-specific local q scaling of the electronegativity for the EEQ_BC +// charges. const double eeqbc_kqchi[MAXELEMENT]{ - 0.0, // dummy - 0.7122604774, -1.7351284097, 3.0089829052, 2.1166762050, // 1-4 - 1.5179774898, 1.2180269092, 1.0873609014, 0.8994075937, // 5-8 - 0.1658248786, -2.5747028940, 3.1762170214, 2.3987338612, // 9-12 - 2.2469063726, 1.5639940746, 1.2412557993, 1.6283237163, // 13-16 - 1.5628790844, -0.9249536928, 3.0733040004, 2.7596745507, // 17-20 - 2.9366708989, 2.7004746183, 2.2295030415, 2.0304690076, // 21-24 - 1.9683561829, 2.2302711526, 1.8504904266, 2.0575510119, // 25-28 - 2.2756603413, 2.2094576537, 2.1544064368, 1.9327504630, // 29-32 - 1.4451438826, 1.4813741556, 2.0308095325, 0.4032186085, // 33-36 - 3.6036894994, 2.6513413398, 2.6634586616, 2.3940154835, // 37-40 - 2.3527262731, 2.0735381213, 1.7234564437, 2.2302635382, // 41-44 - 2.1871313764, 1.8061408427, 1.9051691947, 2.0424482278, // 45-48 - 2.8036578365, 2.0783981020, 2.0481231960, 1.8544101088, // 49-52 - 2.1888387015, 0.5779869189, 3.2064625646, 2.7406551784, // 53-56 - 2.5529621630, 2.5391757608, 2.4348800350, 2.3484586230, // 57-60 - 2.2799115250, 2.2292387408, 2.1964402705, 2.1815161141, // 61-64 - 2.1844662716, 2.2052907430, 2.2439895282, 2.3005626274, // 65-68 - 2.3750100404, 2.4673317674, 2.5775278082, 2.6463737671, // 69-72 - 2.3987259080, 2.0862161326, 1.8045334538, 2.0382923920, // 73-76 - 1.6579982531, 1.8353080915, 1.8450710788, 1.5696036105, // 77-80 - 2.8136219641, 2.3784572290, 1.9914691678, 1.8625351100, // 81-84 - 2.1579257719, 0.6206683275, 3.5103871382, 2.7327597379, // 85-88 - 2.7369312006, 2.6004448612, 2.7011486104, 2.7879694953, // 89-92 - 2.8609075157, 2.9199626718, 2.9651349636, 2.9964243909, // 93-96 - 3.0138309539, 3.0173546524, 3.0069954867, 2.9827534565, // 97-100 - 2.9446285619, 2.8926208030, 2.8267301797 // 101-103 + 0.0, // dummy + 0.7122604774, -1.7351284097, 3.0089829052, 2.1166762050, // 1-4 + 1.5179774898, 1.2180269092, 1.0873609014, 0.8994075937, // 5-8 + 0.1658248786, -2.5747028940, 3.1762170214, 2.3987338612, // 9-12 + 2.2469063726, 1.5639940746, 1.2412557993, 1.6283237163, // 13-16 + 1.5628790844, -0.9249536928, 3.0733040004, 2.7596745507, // 17-20 + 2.9366708989, 2.7004746183, 2.2295030415, 2.0304690076, // 21-24 + 1.9683561829, 2.2302711526, 1.8504904266, 2.0575510119, // 25-28 + 2.2756603413, 2.2094576537, 2.1544064368, 1.9327504630, // 29-32 + 1.4451438826, 1.4813741556, 2.0308095325, 0.4032186085, // 33-36 + 3.6036894994, 2.6513413398, 2.6634586616, 2.3940154835, // 37-40 + 2.3527262731, 2.0735381213, 1.7234564437, 2.2302635382, // 41-44 + 2.1871313764, 1.8061408427, 1.9051691947, 2.0424482278, // 45-48 + 2.8036578365, 2.0783981020, 2.0481231960, 1.8544101088, // 49-52 + 2.1888387015, 0.5779869189, 3.2064625646, 2.7406551784, // 53-56 + 2.5529621630, 2.5391757608, 2.4348800350, 2.3484586230, // 57-60 + 2.2799115250, 2.2292387408, 2.1964402705, 2.1815161141, // 61-64 + 2.1844662716, 2.2052907430, 2.2439895282, 2.3005626274, // 65-68 + 2.3750100404, 2.4673317674, 2.5775278082, 2.6463737671, // 69-72 + 2.3987259080, 2.0862161326, 1.8045334538, 2.0382923920, // 73-76 + 1.6579982531, 1.8353080915, 1.8450710788, 1.5696036105, // 77-80 + 2.8136219641, 2.3784572290, 1.9914691678, 1.8625351100, // 81-84 + 2.1579257719, 0.6206683275, 3.5103871382, 2.7327597379, // 85-88 + 2.7369312006, 2.6004448612, 2.7011486104, 2.7879694953, // 89-92 + 2.8609075157, 2.9199626718, 2.9651349636, 2.9964243909, // 93-96 + 3.0138309539, 3.0173546524, 3.0069954867, 2.9827534565, // 97-100 + 2.9446285619, 2.8926208030, 2.8267301797 // 101-103 }; -// Element-specific local q scaling of the chemical hardness for the EEQ_BC charges +// Element-specific local q scaling of the chemical hardness for the EEQ_BC +// charges const double eeqbc_kqeta[MAXELEMENT]{ - 0.0, // dummy - 1.8222099473, -0.2575679643, 0.4393826724, 1.1102162003, // 1-4 - 1.2310070946, 0.9818102022, 0.1502230497, 0.4134119032, // 5-8 - 2.5030512016, -0.4998596384, 2.1023399046, 1.1266337899, // 9-12 - 1.3785272689, 0.9471745876, 1.6601128471, -0.0156796346, // 13-16 - 0.6525286877, -2.8148211211, 1.8730352397, 0.4148795713, // 17-20 - 1.9811917137, 1.3666346630, 0.4773540249, 0.6660383739, // 21-24 - 0.4949831426, 0.9260098769, 1.4071496248, 0.7430722161, // 25-28 - 1.4792830405, 1.4211880229, 0.6613271421, 1.3109487181, // 29-32 - 0.9539967321, 0.0441858334, 0.8506553360, -0.7778128954, // 33-36 - 2.4456255294, 0.6279760783, 0.8504097502, 0.1275277215, // 37-40 - 1.0244946467, 0.3991961865, 0.3007399180, 0.8892405348, // 41-44 - 1.0358999274, 0.5910349581, 1.3306044793, 1.0116510919, // 45-48 - 1.2017335753, 1.0749481071, 1.5278450966, 0.3830852785, // 49-52 - 0.8039617911, -1.6689377641, 1.3153512507, 0.6850807472, // 53-56 - 0.4068053082, 0.2805275842, 0.2612355874, 0.2457254002, // 57-60 - 0.2339970224, 0.2260504541, 0.2218856952, 0.2215027459, // 61-64 - 0.2249016061, 0.2320822757, 0.2430447548, 0.2577890434, // 65-68 - 0.2763151415, 0.2986230491, 0.3247127662, 0.9329386915, // 69-72 - 1.1124975975, 0.3105056463, 0.2119489274, 0.3490965682, // 73-76 - 0.9303004996, 0.6578893166, 0.7625190003, 0.6067448860, // 77-80 - 1.1098111282, 0.9571986961, 1.4674965889, 0.7713149335, // 81-84 - 0.5513455799, -0.7227615433, 1.2895674764, 0.5960416182, // 85-88 - 0.1671277145, 0.1575313114, 0.2863965715, 0.4002506248, // 89-92 - 0.4990934714, 0.5829251111, 0.6517455441, 0.7055547703, // 93-96 - 0.7443527897, 0.7681396024, 0.7769152082, 0.7706796073, // 97-100 - 0.7494327996, 0.7131747852, 0.6619055639 // 101-103 + 0.0, // dummy + 1.8222099473, -0.2575679643, 0.4393826724, 1.1102162003, // 1-4 + 1.2310070946, 0.9818102022, 0.1502230497, 0.4134119032, // 5-8 + 2.5030512016, -0.4998596384, 2.1023399046, 1.1266337899, // 9-12 + 1.3785272689, 0.9471745876, 1.6601128471, -0.0156796346, // 13-16 + 0.6525286877, -2.8148211211, 1.8730352397, 0.4148795713, // 17-20 + 1.9811917137, 1.3666346630, 0.4773540249, 0.6660383739, // 21-24 + 0.4949831426, 0.9260098769, 1.4071496248, 0.7430722161, // 25-28 + 1.4792830405, 1.4211880229, 0.6613271421, 1.3109487181, // 29-32 + 0.9539967321, 0.0441858334, 0.8506553360, -0.7778128954, // 33-36 + 2.4456255294, 0.6279760783, 0.8504097502, 0.1275277215, // 37-40 + 1.0244946467, 0.3991961865, 0.3007399180, 0.8892405348, // 41-44 + 1.0358999274, 0.5910349581, 1.3306044793, 1.0116510919, // 45-48 + 1.2017335753, 1.0749481071, 1.5278450966, 0.3830852785, // 49-52 + 0.8039617911, -1.6689377641, 1.3153512507, 0.6850807472, // 53-56 + 0.4068053082, 0.2805275842, 0.2612355874, 0.2457254002, // 57-60 + 0.2339970224, 0.2260504541, 0.2218856952, 0.2215027459, // 61-64 + 0.2249016061, 0.2320822757, 0.2430447548, 0.2577890434, // 65-68 + 0.2763151415, 0.2986230491, 0.3247127662, 0.9329386915, // 69-72 + 1.1124975975, 0.3105056463, 0.2119489274, 0.3490965682, // 73-76 + 0.9303004996, 0.6578893166, 0.7625190003, 0.6067448860, // 77-80 + 1.1098111282, 0.9571986961, 1.4674965889, 0.7713149335, // 81-84 + 0.5513455799, -0.7227615433, 1.2895674764, 0.5960416182, // 85-88 + 0.1671277145, 0.1575313114, 0.2863965715, 0.4002506248, // 89-92 + 0.4990934714, 0.5829251111, 0.6517455441, 0.7055547703, // 93-96 + 0.7443527897, 0.7681396024, 0.7769152082, 0.7706796073, // 97-100 + 0.7494327996, 0.7131747852, 0.6619055639 // 101-103 }; // Element-specific bond capacitance for the EEQ_BC charges const double eeqbc_cap[MAXELEMENT]{ - 0.0, // dummy - 3.4358731613, 0.2563012350, 1.7336935111, 1.4252599447, // 1-4 - 1.9821377790, 7.9575330990, 5.2650283958, 5.3394223720, // 5-8 - 4.7702507597, 0.5095753028, 5.7961811482, 2.8738819069, // 9-12 - 1.5730116016, 0.7813507196, 1.0337776163, 1.4123845734, // 13-16 - 3.0340296817, 0.5326667425, 6.4794438076, 4.1572236543, // 17-20 - 2.6197028418, 1.9926557922, 1.4258893003, 3.4184301443, // 21-24 - 3.1337436912, 4.5345735628, 6.3426635435, 4.8622181062, // 25-28 - 3.9658581319, 2.4205042838, 2.0153453160, 1.3655709456, // 29-32 - 1.0879161652, 0.8125045161, 3.4331186365, 1.1410555369, // 33-36 - 5.3302096260, 8.9866820455, 8.0879982654, 1.3505819625, // 37-40 - 1.9761405818, 4.8306789723, 2.6167089975, 4.9413659163, // 41-44 - 5.5889636514, 3.7289038580, 2.2978010245, 2.9915912946, // 45-48 - 3.2084006372, 2.4592286766, 1.0482227697, 1.4124670516, // 49-52 - 2.0699368746, 2.3426022325, 4.9766316345, 4.7445931148, // 53-56 - 7.6556126582, 2.2792827162, 2.2265798615, 2.2270872929, // 57-60 - 2.2808050104, 2.3877330140, 2.5478713036, 2.7612198793, // 61-64 - 3.0277787411, 3.3475478889, 3.7205273228, 4.1467170428, // 65-68 - 4.6261170489, 5.1587273410, 5.7445479192, 1.9450532464, // 69-72 - 1.2082681633, 5.4761913827, 2.8688258387, 3.4269533511, // 73-76 - 1.2827929585, 4.2446334525, 8.5466705292, 2.7030553995, // 77-80 - 1.7482905639, 4.5652515937, 2.0750200204, 2.1042278455, // 81-84 - 2.9249818593, 1.1606670882, 5.1339954989, 5.4015367551, // 85-88 - 1.5278253705, 0.7201439348, 0.8778110607, 1.0152634518, // 89-92 - 1.1325011080, 1.2295240293, 1.3063322158, 1.3629256675, // 93-96 - 1.3993043843, 1.4154683662, 1.4114176133, 1.3871521256, // 97-100 - 1.3426719030, 1.2779769455, 1.1930672532 // 101-103 + 0.0, // dummy + 3.4358731613, 0.2563012350, 1.7336935111, 1.4252599447, // 1-4 + 1.9821377790, 7.9575330990, 5.2650283958, 5.3394223720, // 5-8 + 4.7702507597, 0.5095753028, 5.7961811482, 2.8738819069, // 9-12 + 1.5730116016, 0.7813507196, 1.0337776163, 1.4123845734, // 13-16 + 3.0340296817, 0.5326667425, 6.4794438076, 4.1572236543, // 17-20 + 2.6197028418, 1.9926557922, 1.4258893003, 3.4184301443, // 21-24 + 3.1337436912, 4.5345735628, 6.3426635435, 4.8622181062, // 25-28 + 3.9658581319, 2.4205042838, 2.0153453160, 1.3655709456, // 29-32 + 1.0879161652, 0.8125045161, 3.4331186365, 1.1410555369, // 33-36 + 5.3302096260, 8.9866820455, 8.0879982654, 1.3505819625, // 37-40 + 1.9761405818, 4.8306789723, 2.6167089975, 4.9413659163, // 41-44 + 5.5889636514, 3.7289038580, 2.2978010245, 2.9915912946, // 45-48 + 3.2084006372, 2.4592286766, 1.0482227697, 1.4124670516, // 49-52 + 2.0699368746, 2.3426022325, 4.9766316345, 4.7445931148, // 53-56 + 7.6556126582, 2.2792827162, 2.2265798615, 2.2270872929, // 57-60 + 2.2808050104, 2.3877330140, 2.5478713036, 2.7612198793, // 61-64 + 3.0277787411, 3.3475478889, 3.7205273228, 4.1467170428, // 65-68 + 4.6261170489, 5.1587273410, 5.7445479192, 1.9450532464, // 69-72 + 1.2082681633, 5.4761913827, 2.8688258387, 3.4269533511, // 73-76 + 1.2827929585, 4.2446334525, 8.5466705292, 2.7030553995, // 77-80 + 1.7482905639, 4.5652515937, 2.0750200204, 2.1042278455, // 81-84 + 2.9249818593, 1.1606670882, 5.1339954989, 5.4015367551, // 85-88 + 1.5278253705, 0.7201439348, 0.8778110607, 1.0152634518, // 89-92 + 1.1325011080, 1.2295240293, 1.3063322158, 1.3629256675, // 93-96 + 1.3993043843, 1.4154683662, 1.4114176133, 1.3871521256, // 97-100 + 1.3426719030, 1.2779769455, 1.1930672532 // 101-103 }; // Element-specific covalent radii for the CN for the EEQ_BC charges // Factor 0.5 hardcoded in comparison to original implementation const double eeqbc_cov_radii[MAXELEMENT]{ - 0.0, // dummy - 0.5990003074, 1.1305108862, 1.1893587595, 1.2316082338, // 1-4 - 1.2306947904, 1.3381503982, 1.3827542606, 1.3233199451, // 5-8 - 1.0323557065, 1.1482139446, 1.5236797873, 1.6798563087, // 9-12 - 1.4706775932, 1.6796575041, 1.8562019109, 1.8975248431, // 13-16 - 1.8109206232, 1.1684253775, 1.6339002865, 1.3467319730, // 17-20 - 1.5471406903, 1.5997095467, 1.5932675762, 1.5122623873, // 21-24 - 1.4758202728, 1.3983545702, 1.4312376423, 1.4662935692, // 25-28 - 1.4375228710, 1.6440127278, 1.7064694878, 1.7773769157, // 29-32 - 1.9412022097, 2.0674993426, 1.9744632794, 1.8132038932, // 33-36 - 1.9468460889, 1.7606785970, 1.6208651779, 1.7732255432, // 37-40 - 1.8230287882, 1.7051065664, 1.7234504957, 1.6521804621, // 41-44 - 1.6787469349, 1.7118143723, 1.8170692940, 1.9156608392, // 45-48 - 1.9135812076, 2.0627131546, 1.9947712528, 2.2670709070, // 49-52 - 2.3379000661, 2.1594131119, 1.4157106525, 2.4457005158, // 53-56 - 1.8002266657, 1.4379046009, 1.4983564750, 1.5521011878, // 57-60 - 1.5991387396, 1.6394691301, 1.6730923596, 1.7000084278, // 61-64 - 1.7202173348, 1.7337190806, 1.7405136652, 1.7406010888, // 65-68 - 1.7339813510, 1.7206544522, 1.7006203921, 1.7502013670, // 69-72 - 1.8288123232, 1.6361213746, 1.7423920150, 1.6934786384, // 73-76 - 1.7300246922, 1.7928628816, 1.7569240912, 2.0376449485, // 77-80 - 2.1352901272, 2.1640967453, 2.0308428261, 2.1634570161, // 81-84 - 2.3975051498, 2.0310650653, 2.3522802139, 2.1846657434, // 85-88 - 1.6174778669, 1.0167028208, 1.2775833407, 1.5007903181, // 89-92 - 1.6863237532, 1.8341836461, 1.9443699965, 2.0168828045, // 93-96 - 2.0517220703, 2.0488877937, 2.0083799747, 1.9301986133, // 97-100 - 1.8143437097, 1.6608152636, 1.4696132753 // 101-103 + 0.0, // dummy + 0.5990003074, 1.1305108862, 1.1893587595, 1.2316082338, // 1-4 + 1.2306947904, 1.3381503982, 1.3827542606, 1.3233199451, // 5-8 + 1.0323557065, 1.1482139446, 1.5236797873, 1.6798563087, // 9-12 + 1.4706775932, 1.6796575041, 1.8562019109, 1.8975248431, // 13-16 + 1.8109206232, 1.1684253775, 1.6339002865, 1.3467319730, // 17-20 + 1.5471406903, 1.5997095467, 1.5932675762, 1.5122623873, // 21-24 + 1.4758202728, 1.3983545702, 1.4312376423, 1.4662935692, // 25-28 + 1.4375228710, 1.6440127278, 1.7064694878, 1.7773769157, // 29-32 + 1.9412022097, 2.0674993426, 1.9744632794, 1.8132038932, // 33-36 + 1.9468460889, 1.7606785970, 1.6208651779, 1.7732255432, // 37-40 + 1.8230287882, 1.7051065664, 1.7234504957, 1.6521804621, // 41-44 + 1.6787469349, 1.7118143723, 1.8170692940, 1.9156608392, // 45-48 + 1.9135812076, 2.0627131546, 1.9947712528, 2.2670709070, // 49-52 + 2.3379000661, 2.1594131119, 1.4157106525, 2.4457005158, // 53-56 + 1.8002266657, 1.4379046009, 1.4983564750, 1.5521011878, // 57-60 + 1.5991387396, 1.6394691301, 1.6730923596, 1.7000084278, // 61-64 + 1.7202173348, 1.7337190806, 1.7405136652, 1.7406010888, // 65-68 + 1.7339813510, 1.7206544522, 1.7006203921, 1.7502013670, // 69-72 + 1.8288123232, 1.6361213746, 1.7423920150, 1.6934786384, // 73-76 + 1.7300246922, 1.7928628816, 1.7569240912, 2.0376449485, // 77-80 + 2.1352901272, 2.1640967453, 2.0308428261, 2.1634570161, // 81-84 + 2.3975051498, 2.0310650653, 2.3522802139, 2.1846657434, // 85-88 + 1.6174778669, 1.0167028208, 1.2775833407, 1.5007903181, // 89-92 + 1.6863237532, 1.8341836461, 1.9443699965, 2.0168828045, // 93-96 + 2.0517220703, 2.0488877937, 2.0083799747, 1.9301986133, // 97-100 + 1.8143437097, 1.6608152636, 1.4696132753 // 101-103 }; -// Element-specific averaged coordination number over the fitset for the EEQ_BC charges. +// Element-specific averaged coordination number over the fitset for the EEQ_BC +// charges. const double eeqbc_avg_cn[MAXELEMENT]{ - 0.0, // dummy - 0.3921100000, 0.0810600000, 0.9910100000, 0.7499500000, // 1-4 - 1.1543700000, 1.6691400000, 1.4250300000, 0.8718100000, // 5-8 - 0.6334000000, 0.0876700000, 0.8740600000, 0.8754800000, // 9-12 - 1.2147200000, 1.1335000000, 1.6890600000, 1.0221600000, // 13-16 - 0.5386400000, 0.0827800000, 1.4096300000, 1.1954700000, // 17-20 - 1.5142100000, 1.7892000000, 2.0646100000, 1.6905600000, // 21-24 - 1.6563700000, 1.5128400000, 1.3179000000, 0.9749800000, // 25-28 - 0.5334600000, 0.6585000000, 0.9696500000, 1.0083100000, // 29-32 - 1.0871000000, 0.8222200000, 0.5449300000, 0.1647100000, // 33-36 - 1.2490800000, 1.2198700000, 1.5657400000, 1.8697600000, // 37-40 - 1.8947900000, 1.7085000000, 1.5521300000, 1.4903300000, // 41-44 - 1.3177400000, 0.6991700000, 0.5528200000, 0.6642200000, // 45-48 - 0.9069800000, 1.0976200000, 1.2183000000, 0.7321900000, // 49-52 - 0.5498700000, 0.2467100000, 1.5680600000, 1.1677300000, // 53-56 - 1.6642500000, 1.6032600000, 1.6032600000, 1.6032600000, // 57-60 - 1.6032600000, 1.6032600000, 1.6032600000, 1.6032600000, // 61-64 - 1.6032600000, 1.6032600000, 1.6032600000, 1.6032600000, // 65-68 - 1.6032600000, 1.6032600000, 1.6032600000, 1.8191000000, // 69-72 - 1.8175100000, 1.6802300000, 1.5224100000, 1.4602600000, // 73-76 - 1.1110400000, 0.9102600000, 0.5218000000, 1.4895900000, // 77-80 - 0.8441800000, 0.9426900000, 1.5171900000, 0.7287100000, // 81-84 - 0.5137000000, 0.2678200000, 1.2122500000, 1.5797100000, // 85-88 - 1.7549800000, 1.7549800000, 1.7549800000, 1.7549800000, // 89-92 - 1.7549800000, 1.7549800000, 1.7549800000, 1.7549800000, // 93-96 - 1.7549800000, 1.7549800000, 1.7549800000, 1.7549800000, // 97-100 - 1.7549800000, 1.7549800000, 1.7549800000 // 101-103 + 0.0, // dummy + 0.3921100000, 0.0810600000, 0.9910100000, 0.7499500000, // 1-4 + 1.1543700000, 1.6691400000, 1.4250300000, 0.8718100000, // 5-8 + 0.6334000000, 0.0876700000, 0.8740600000, 0.8754800000, // 9-12 + 1.2147200000, 1.1335000000, 1.6890600000, 1.0221600000, // 13-16 + 0.5386400000, 0.0827800000, 1.4096300000, 1.1954700000, // 17-20 + 1.5142100000, 1.7892000000, 2.0646100000, 1.6905600000, // 21-24 + 1.6563700000, 1.5128400000, 1.3179000000, 0.9749800000, // 25-28 + 0.5334600000, 0.6585000000, 0.9696500000, 1.0083100000, // 29-32 + 1.0871000000, 0.8222200000, 0.5449300000, 0.1647100000, // 33-36 + 1.2490800000, 1.2198700000, 1.5657400000, 1.8697600000, // 37-40 + 1.8947900000, 1.7085000000, 1.5521300000, 1.4903300000, // 41-44 + 1.3177400000, 0.6991700000, 0.5528200000, 0.6642200000, // 45-48 + 0.9069800000, 1.0976200000, 1.2183000000, 0.7321900000, // 49-52 + 0.5498700000, 0.2467100000, 1.5680600000, 1.1677300000, // 53-56 + 1.6642500000, 1.6032600000, 1.6032600000, 1.6032600000, // 57-60 + 1.6032600000, 1.6032600000, 1.6032600000, 1.6032600000, // 61-64 + 1.6032600000, 1.6032600000, 1.6032600000, 1.6032600000, // 65-68 + 1.6032600000, 1.6032600000, 1.6032600000, 1.8191000000, // 69-72 + 1.8175100000, 1.6802300000, 1.5224100000, 1.4602600000, // 73-76 + 1.1110400000, 0.9102600000, 0.5218000000, 1.4895900000, // 77-80 + 0.8441800000, 0.9426900000, 1.5171900000, 0.7287100000, // 81-84 + 0.5137000000, 0.2678200000, 1.2122500000, 1.5797100000, // 85-88 + 1.7549800000, 1.7549800000, 1.7549800000, 1.7549800000, // 89-92 + 1.7549800000, 1.7549800000, 1.7549800000, 1.7549800000, // 93-96 + 1.7549800000, 1.7549800000, 1.7549800000, 1.7549800000, // 97-100 + 1.7549800000, 1.7549800000, 1.7549800000 // 101-103 }; // Pauling electronegativities, used for the covalent coordination number. - double const eeqbc_en[] = { - 0.0, // dummy - 0.55276382, 0.75376884, 0.24623116, 0.39447236, 0.51256281, - 0.64070352, 0.76381910, 0.86432161, 1.00000000, 1.13065327, - 0.23366834, 0.32914573, 0.40452261, 0.47738693, 0.55025126, - 0.64824121, 0.79396985, 0.87939698, 0.20603015, 0.25125628, - 0.34170854, 0.38693467, 0.40954774, 0.41708543, 0.38944724, - 0.45979899, 0.47236181, 0.47989950, 0.47738693, 0.41457286, - 0.45477387, 0.50502513, 0.54773869, 0.64070352, 0.74371859, - 0.75376884, 0.20603015, 0.23869347, 0.30653266, 0.33417085, - 0.40201005, 0.54271357, 0.47738693, 0.55276382, 0.57286432, - 0.55276382, 0.48492462, 0.42462312, 0.44723618, 0.49246231, - 0.51507538, 0.52763819, 0.66834171, 0.65326633, 0.19849246, - 0.22361809, 0.27638191, 0.28140704, 0.28391960, 0.28643216, - 0.28894472, 0.29396985, 0.29648241, 0.30150754, 0.30402010, - 0.30653266, 0.30904523, 0.31155779, 0.31407035, 0.31658291, - 0.31909548, 0.32663317, 0.37688442, 0.59296482, 0.47738693, - 0.55276382, 0.55276382, 0.57286432, 0.63819095, 0.50251256, - 0.40703518, 0.58542714, 0.50753769, 0.50251256, 0.55276382, - 0.55276382, 0.20100503, 0.22613065, 0.25125628, 0.27638191, - 0.27638191, 0.27638191, 0.30150754, 0.30150754, 0.27638191, - 0.32663317, 0.30150754, 0.32663317, 0.32663317, 0.32663317, - 0.32663317, 0.32663317, 0.30150754}; +double const eeqbc_en[] = { + 0.0, // dummy + 0.55276382, 0.75376884, 0.24623116, 0.39447236, 0.51256281, 0.64070352, + 0.76381910, 0.86432161, 1.00000000, 1.13065327, 0.23366834, 0.32914573, + 0.40452261, 0.47738693, 0.55025126, 0.64824121, 0.79396985, 0.87939698, + 0.20603015, 0.25125628, 0.34170854, 0.38693467, 0.40954774, 0.41708543, + 0.38944724, 0.45979899, 0.47236181, 0.47989950, 0.47738693, 0.41457286, + 0.45477387, 0.50502513, 0.54773869, 0.64070352, 0.74371859, 0.75376884, + 0.20603015, 0.23869347, 0.30653266, 0.33417085, 0.40201005, 0.54271357, + 0.47738693, 0.55276382, 0.57286432, 0.55276382, 0.48492462, 0.42462312, + 0.44723618, 0.49246231, 0.51507538, 0.52763819, 0.66834171, 0.65326633, + 0.19849246, 0.22361809, 0.27638191, 0.28140704, 0.28391960, 0.28643216, + 0.28894472, 0.29396985, 0.29648241, 0.30150754, 0.30402010, 0.30653266, + 0.30904523, 0.31155779, 0.31407035, 0.31658291, 0.31909548, 0.32663317, + 0.37688442, 0.59296482, 0.47738693, 0.55276382, 0.55276382, 0.57286432, + 0.63819095, 0.50251256, 0.40703518, 0.58542714, 0.50753769, 0.50251256, + 0.55276382, 0.55276382, 0.20100503, 0.22613065, 0.25125628, 0.27638191, + 0.27638191, 0.27638191, 0.30150754, 0.30150754, 0.27638191, 0.32663317, + 0.30150754, 0.32663317, 0.32663317, 0.32663317, 0.32663317, 0.32663317, + 0.30150754 +}; -// Pairwise van der Waals radii based on the distance +// Pairwise van der Waals radii based on the distance // where the first-order PBE0/def2-QZVP energy falls below a cutoff value -// defined by: -// S. Grimme, J. Antony, S. Ehrlich, H. Krieg, +// defined by: +// S. Grimme, J. Antony, S. Ehrlich, H. Krieg, // J. Chem. Phys. 132, 154104 (2010), DOI: 10.1063/1.3382344 -// extended by: -// L. Trombach, S. Ehlert, S. Grimme, P Schwerdtfeger, J.-M. Mewes, +// extended by: +// L. Trombach, S. Ehlert, S. Grimme, P Schwerdtfeger, J.-M. Mewes, // PCCP, 2019, 21,18048, DOI: 10.1039/c9cp02455g -// L. Wittmann, I. Gordiy, M. Friede, B. Helmich-Paris, S. Grimme, A. Hansen, M. Bursch, -// PCCP, 2024, 26, 21379, DOI: 10.1039/d4cp01514b +// L. Wittmann, I. Gordiy, M. Friede, B. Helmich-Paris, S. Grimme, A. Hansen, +// M. Bursch, PCCP, 2024, 26, 21379, DOI: 10.1039/d4cp01514b const double eeqbc_rvdw[]{ - 2.1823, 1.8547, 1.7347, 2.9086, 2.5732, - 3.4956, 2.3550, 2.5095, 2.9802, 3.0982, - 2.5141, 2.3917, 2.9977, 2.9484, 3.2160, - 2.4492, 2.2527, 3.1933, 3.0214, 2.9531, - 2.9103, 2.3667, 2.1328, 2.8784, 2.7660, - 2.7776, 2.7063, 2.6225, 2.1768, 2.0625, - 2.6395, 2.6648, 2.6482, 2.5697, 2.4846, - 2.4817, 2.0646, 1.9891, 2.5086, 2.6908, - 2.6233, 2.4770, 2.3885, 2.3511, 2.2996, - 1.9892, 1.9251, 2.4190, 2.5473, 2.4994, - 2.4091, 2.3176, 2.2571, 2.1946, 2.1374, - 2.9898, 2.6397, 3.6031, 3.1219, 3.7620, - 3.2485, 2.9357, 2.7093, 2.5781, 2.4839, - 3.7082, 2.5129, 2.7321, 3.1052, 3.2962, - 3.1331, 3.2000, 2.9586, 3.0822, 2.8582, - 2.7120, 3.2570, 3.4839, 2.8766, 2.7427, - 3.2776, 3.2363, 3.5929, 3.2826, 3.0911, - 2.9369, 2.9030, 2.7789, 3.3921, 3.3970, - 4.0106, 2.8884, 2.6605, 3.7513, 3.1613, - 3.3605, 3.3325, 3.0991, 2.9297, 2.8674, - 2.7571, 3.8129, 3.3266, 3.7105, 3.7917, - 2.8304, 2.5538, 3.3932, 3.1193, 3.1866, - 3.1245, 3.0465, 2.8727, 2.7664, 2.6926, - 3.4608, 3.2984, 3.5142, 3.5418, 3.5017, - 2.6190, 2.4797, 3.1331, 3.0540, 3.0651, - 2.9879, 2.9054, 2.8805, 2.7330, 2.6331, - 3.2096, 3.5668, 3.3684, 3.3686, 3.3180, - 3.3107, 2.4757, 2.4019, 2.9789, 3.1468, - 2.9768, 2.8848, 2.7952, 2.7457, 2.6881, - 2.5728, 3.0574, 3.3264, 3.3562, 3.2529, - 3.1916, 3.1523, 3.1046, 2.3725, 2.3289, - 2.8760, 2.9804, 2.9093, 2.8040, 2.7071, - 2.6386, 2.5720, 2.5139, 2.9517, 3.1606, - 3.2085, 3.1692, 3.0982, 3.0352, 2.9730, - 2.9148, 3.2147, 2.8315, 3.8724, 3.4621, - 3.8823, 3.3760, 3.0746, 2.8817, 2.7552, - 2.6605, 3.9740, 3.6192, 3.6569, 3.9586, - 3.6188, 3.3917, 3.2479, 3.1434, 4.2411, - 2.7597, 3.0588, 3.3474, 3.6214, 3.4353, - 3.4729, 3.2487, 3.3200, 3.0914, 2.9403, - 3.4972, 3.7993, 3.6773, 3.8678, 3.5808, - 3.8243, 3.5826, 3.4156, 3.8765, 4.1035, - 2.7361, 2.9765, 3.2475, 3.5004, 3.4185, - 3.4378, 3.2084, 3.2787, 3.0604, 2.9187, - 3.4037, 3.6759, 3.6586, 3.8327, 3.5372, - 3.7665, 3.5310, 3.3700, 3.7788, 3.9804, - 3.8903, 2.6832, 2.9060, 3.2613, 3.4359, - 3.3538, 3.3860, 3.1550, 3.2300, 3.0133, - 2.8736, 3.4024, 3.6142, 3.5979, 3.5295, - 3.4834, 3.7140, 3.4782, 3.3170, 3.7434, - 3.9623, 3.8181, 3.7642, 2.6379, 2.8494, - 3.1840, 3.4225, 3.2771, 3.3401, 3.1072, - 3.1885, 2.9714, 2.8319, 3.3315, 3.5979, - 3.5256, 3.4980, 3.4376, 3.6714, 3.4346, - 3.2723, 3.6859, 3.8985, 3.7918, 3.7372, - 3.7211, 2.9230, 2.6223, 3.4161, 2.8999, - 3.0557, 3.3308, 3.0555, 2.8508, 2.7385, - 2.6640, 3.5263, 3.0277, 3.2990, 3.7721, - 3.5017, 3.2751, 3.1368, 3.0435, 3.7873, - 3.2858, 3.2140, 3.1727, 3.2178, 3.4414, - 2.5490, 2.7623, 3.0991, 3.3252, 3.1836, - 3.2428, 3.0259, 3.1225, 2.9032, 2.7621, - 3.2490, 3.5110, 3.4429, 3.3845, 3.3574, - 3.6045, 3.3658, 3.2013, 3.6110, 3.8241, - 3.7090, 3.6496, 3.6333, 3.0896, 3.5462, - 2.4926, 2.7136, 3.0693, 3.2699, 3.1272, - 3.1893, 2.9658, 3.0972, 2.8778, 2.7358, - 3.2206, 3.4566, 3.3896, 3.3257, 3.2946, - 3.5693, 3.3312, 3.1670, 3.5805, 3.7711, - 3.6536, 3.5927, 3.5775, 3.0411, 3.4885, - 3.4421, 2.4667, 2.6709, 3.0575, 3.2357, - 3.0908, 3.1537, 2.9235, 3.0669, 2.8476, - 2.7054, 3.2064, 3.4519, 3.3593, 3.2921, - 3.2577, 3.2161, 3.2982, 3.1339, 3.5606, - 3.7582, 3.6432, 3.5833, 3.5691, 3.0161, - 3.4812, 3.4339, 3.4327, 2.4515, 2.6338, - 3.0511, 3.2229, 3.0630, 3.1265, 2.8909, - 3.0253, 2.8184, 2.6764, 3.1968, 3.4114, - 3.3492, 3.2691, 3.2320, 3.1786, 3.2680, - 3.1036, 3.5453, 3.7259, 3.6090, 3.5473, - 3.5327, 3.0018, 3.4413, 3.3907, 3.3593, - 3.3462, 2.4413, 2.6006, 3.0540, 3.1987, - 3.0490, 3.1058, 2.8643, 2.9948, 2.7908, - 2.6491, 3.1950, 3.3922, 3.3316, 3.2585, - 3.2136, 3.1516, 3.2364, 3.0752, 3.5368, - 3.7117, 3.5941, 3.5313, 3.5164, 2.9962, - 3.4225, 3.3699, 3.3370, 3.3234, 3.3008, - 2.4318, 2.5729, 3.0416, 3.1639, 3.0196, - 3.0843, 2.8413, 2.7436, 2.7608, 2.6271, - 3.1811, 3.3591, 3.3045, 3.2349, 3.1942, - 3.1291, 3.2111, 3.0534, 3.5189, 3.6809, - 3.5635, 3.5001, 3.4854, 2.9857, 3.3897, - 3.3363, 3.3027, 3.2890, 3.2655, 3.2309, - 2.8502, 2.6934, 3.2467, 3.1921, 3.5663, - 3.2541, 3.0571, 2.9048, 2.8657, 2.7438, - 3.3547, 3.3510, 3.9837, 3.6871, 3.4862, - 3.3389, 3.2413, 3.1708, 3.6096, 3.6280, - 3.6860, 3.5568, 3.4836, 3.2868, 3.3994, - 3.3476, 3.3170, 3.2950, 3.2874, 3.2606, - 3.9579, 2.9226, 2.6838, 3.7867, 3.1732, - 3.3872, 3.3643, 3.1267, 2.9541, 2.8505, - 2.7781, 3.8475, 3.3336, 3.7359, 3.8266, - 3.5733, 3.3959, 3.2775, 3.1915, 3.9878, - 3.8816, 3.5810, 3.5364, 3.5060, 3.8097, - 3.3925, 3.3348, 3.3019, 3.2796, 3.2662, - 3.2464, 3.7136, 3.8619, 2.9140, 2.6271, - 3.4771, 3.1774, 3.2560, 3.1970, 3.1207, - 2.9406, 2.8322, 2.7571, 3.5455, 3.3514, - 3.5837, 3.6177, 3.5816, 3.3902, 3.2604, - 3.1652, 3.7037, 3.6283, 3.5858, 3.5330, - 3.4884, 3.5789, 3.4094, 3.3473, 3.3118, - 3.2876, 3.2707, 3.2521, 3.5570, 3.6496, - 3.6625, 2.7300, 2.5870, 3.2471, 3.1487, - 3.1667, 3.0914, 3.0107, 2.9812, 2.8300, - 2.7284, 3.3259, 3.3182, 3.4707, 3.4748, - 3.4279, 3.4182, 3.2547, 3.1353, 3.5116, - 3.9432, 3.8828, 3.8303, 3.7880, 3.3760, - 3.7218, 3.3408, 3.3059, 3.2698, 3.2446, - 3.2229, 3.4422, 3.5023, 3.5009, 3.5268, - 2.6026, 2.5355, 3.1129, 3.2863, 3.1029, - 3.0108, 2.9227, 2.8694, 2.8109, 2.6929, - 3.1958, 3.4670, 3.4018, 3.3805, 3.3218, - 3.2815, 3.2346, 3.0994, 3.3937, 3.7266, - 3.6697, 3.6164, 3.5730, 3.2522, 3.5051, - 3.4686, 3.4355, 3.4084, 3.3748, 3.3496, - 3.3692, 3.4052, 3.3910, 3.3849, 3.3662, - 2.5087, 2.4814, 3.0239, 3.1312, 3.0535, - 2.9457, 2.8496, 2.7780, 2.7828, 2.6532, - 3.1063, 3.3143, 3.3549, 3.3120, 3.2421, - 3.1787, 3.1176, 3.0613, 3.3082, 3.5755, - 3.5222, 3.4678, 3.4231, 3.1684, 3.3528, - 3.3162, 3.2827, 3.2527, 3.2308, 3.2029, - 3.3173, 3.3343, 3.3092, 3.2795, 3.2452, - 3.2096, 3.2893, 2.8991, 4.0388, 3.6100, - 3.9388, 3.4475, 3.1590, 2.9812, 2.8586, - 2.7683, 4.1428, 3.7911, 3.8225, 4.0372, - 3.7059, 3.4935, 3.3529, 3.2492, 4.4352, - 4.0826, 3.9733, 3.9254, 3.8646, 3.9315, - 3.7837, 3.7465, 3.7211, 3.7012, 3.6893, - 3.6676, 3.7736, 4.0660, 3.7926, 3.6158, - 3.5017, 3.4166, 4.6176, 2.8786, 3.1658, - 3.5823, 3.7689, 3.5762, 3.5789, 3.3552, - 3.4004, 3.1722, 3.0212, 3.7241, 3.9604, - 3.8500, 3.9844, 3.7035, 3.9161, 3.6751, - 3.5075, 4.1151, 4.2877, 4.1579, 4.1247, - 4.0617, 3.4874, 3.9848, 3.9280, 3.9079, - 3.8751, 3.8604, 3.8277, 3.8002, 3.9981, - 3.7544, 4.0371, 3.8225, 3.6718, 4.3092, - 4.4764, 2.8997, 3.0953, 3.4524, 3.6107, - 3.6062, 3.5783, 3.3463, 3.3855, 3.1746, - 3.0381, 3.6019, 3.7938, 3.8697, 3.9781, - 3.6877, 3.8736, 3.6451, 3.4890, 3.9858, - 4.1179, 4.0430, 3.9563, 3.9182, 3.4002, - 3.8310, 3.7716, 3.7543, 3.7203, 3.7053, - 3.6742, 3.8318, 3.7631, 3.7392, 3.9892, - 3.7832, 3.6406, 4.1701, 4.3016, 4.2196, - 2.8535, 3.0167, 3.3978, 3.5363, 3.5393, - 3.5301, 3.2960, 3.3352, 3.1287, 2.9967, - 3.6659, 3.7239, 3.8070, 3.7165, 3.6368, - 3.8162, 3.5885, 3.4336, 3.9829, 4.0529, - 3.9584, 3.9025, 3.8607, 3.3673, 3.7658, - 3.7035, 3.6866, 3.6504, 3.6339, 3.6024, - 3.7708, 3.7283, 3.6896, 3.9315, 3.7250, - 3.5819, 4.1457, 4.2280, 4.1130, 4.0597, - 3.0905, 2.7998, 3.6448, 3.0739, 3.2996, - 3.5262, 3.2559, 3.0518, 2.9394, 2.8658, - 3.7514, 3.2295, 3.5643, 3.7808, 3.6931, - 3.4723, 3.3357, 3.2429, 4.0280, 3.5589, - 3.4636, 3.4994, 3.4309, 3.6177, 3.2946, - 3.2376, 3.2050, 3.1847, 3.1715, 3.1599, - 3.5555, 3.8111, 3.7693, 3.5718, 3.4498, - 3.3662, 4.1608, 3.7417, 3.6536, 3.6154, - 3.8596, 3.0301, 2.7312, 3.5821, 3.0473, - 3.2137, 3.4679, 3.1975, 2.9969, 2.8847, - 2.8110, 3.6931, 3.2076, 3.4943, 3.5956, - 3.6379, 3.4190, 3.2808, 3.1860, 3.9850, - 3.5105, 3.4330, 3.3797, 3.4155, 3.6033, - 3.2737, 3.2145, 3.1807, 3.1596, 3.1461, - 3.1337, 3.4812, 3.6251, 3.7152, 3.5201, - 3.3966, 3.3107, 4.1128, 3.6899, 3.6082, - 3.5604, 3.7834, 3.7543, 2.9189, 2.6777, - 3.4925, 2.9648, 3.1216, 3.2940, 3.0975, - 2.9757, 2.8493, 2.7638, 3.6085, 3.1214, - 3.4006, 3.4793, 3.5147, 3.3806, 3.2356, - 3.1335, 3.9144, 3.4183, 3.3369, 3.2803, - 3.2679, 3.4871, 3.1714, 3.1521, 3.1101, - 3.0843, 3.0670, 3.0539, 3.3890, 3.5086, - 3.5895, 3.4783, 3.3484, 3.2559, 4.0422, - 3.5967, 3.5113, 3.4576, 3.6594, 3.6313, - 3.5690, 2.8578, 2.6334, 3.4673, 2.9245, - 3.0732, 3.2435, 3.0338, 2.9462, 2.8143, - 2.7240, 3.5832, 3.0789, 3.3617, 3.4246, - 3.4505, 3.3443, 3.1964, 3.0913, 3.8921, - 3.3713, 3.2873, 3.2281, 3.2165, 3.4386, - 3.1164, 3.1220, 3.0761, 3.0480, 3.0295, - 3.0155, 3.3495, 3.4543, 3.5260, 3.4413, - 3.3085, 3.2134, 4.0170, 3.5464, 3.4587, - 3.4006, 3.6027, 3.5730, 3.4945, 3.4623, - 2.8240, 2.5960, 3.4635, 2.9032, 3.0431, - 3.2115, 2.9892, 2.9148, 2.7801, 2.6873, - 3.5776, 3.0568, 3.3433, 3.3949, 3.4132, - 3.3116, 3.1616, 3.0548, 3.8859, 3.3719, - 3.2917, 3.2345, 3.2274, 3.4171, 3.1293, - 3.0567, 3.0565, 3.0274, 3.0087, 2.9939, - 3.3293, 3.4249, 3.4902, 3.4091, 3.2744, - 3.1776, 4.0078, 3.5374, 3.4537, 3.3956, - 3.5747, 3.5430, 3.4522, 3.4160, 3.3975, - 2.8004, 2.5621, 3.4617, 2.9154, 3.0203, - 3.1875, 2.9548, 2.8038, 2.7472, 2.6530, - 3.5736, 3.0584, 3.3304, 3.3748, 3.3871, - 3.2028, 3.1296, 3.0214, 3.8796, 3.3337, - 3.2492, 3.1883, 3.1802, 3.4050, 3.0756, - 3.0478, 3.0322, 3.0323, 3.0163, 3.0019, - 3.3145, 3.4050, 3.4656, 3.3021, 3.2433, - 3.1453, 3.9991, 3.5017, 3.4141, 3.3520, - 3.5583, 3.5251, 3.4243, 3.3851, 3.3662, - 3.3525, 2.7846, 2.5324, 3.4652, 2.8759, - 3.0051, 3.1692, 2.9273, 2.7615, 2.7164, - 2.6212, 3.5744, 3.0275, 3.3249, 3.3627, - 3.3686, 3.1669, 3.0584, 2.9915, 3.8773, - 3.3099, 3.2231, 3.1600, 3.1520, 3.4023, - 3.0426, 3.0099, 2.9920, 2.9809, 2.9800, - 2.9646, 3.3068, 3.3930, 3.4486, 3.2682, - 3.1729, 3.1168, 3.9952, 3.4796, 3.3901, - 3.3255, 3.5530, 3.5183, 3.4097, 3.3683, - 3.3492, 3.3360, 3.3308, 2.5424, 2.6601, - 3.2555, 3.2807, 3.1384, 3.1737, 2.9397, - 2.8429, 2.8492, 2.7225, 3.3875, 3.4910, - 3.4520, 3.3608, 3.3036, 3.2345, 3.2999, - 3.1487, 3.7409, 3.8392, 3.7148, 3.6439, - 3.6182, 3.1753, 3.5210, 3.4639, 3.4265, - 3.4075, 3.3828, 3.3474, 3.4071, 3.3754, - 3.3646, 3.3308, 3.4393, 3.2993, 3.8768, - 3.9891, 3.8310, 3.7483, 3.3417, 3.3019, - 3.2250, 3.1832, 3.1578, 3.1564, 3.1224, - 3.4620, 2.9743, 2.8058, 3.4830, 3.3474, - 3.6863, 3.3617, 3.1608, 3.0069, 2.9640, - 2.8427, 3.5885, 3.5219, 4.1314, 3.8120, - 3.6015, 3.4502, 3.3498, 3.2777, 3.8635, - 3.8232, 3.8486, 3.7215, 3.6487, 3.4724, - 3.5627, 3.5087, 3.4757, 3.4517, 3.4423, - 3.4139, 4.1028, 3.8388, 3.6745, 3.5562, - 3.4806, 3.4272, 4.0182, 3.9991, 4.0007, - 3.9282, 3.7238, 3.6498, 3.5605, 3.5211, - 3.5009, 3.4859, 3.4785, 3.5621, 4.2623, - 3.0775, 2.8275, 4.0181, 3.3385, 3.5379, - 3.5036, 3.2589, 3.0804, 3.0094, 2.9003, - 4.0869, 3.5088, 3.9105, 3.9833, 3.7176, - 3.5323, 3.4102, 3.3227, 4.2702, 4.0888, - 3.7560, 3.7687, 3.6681, 3.6405, 3.5569, - 3.4990, 3.4659, 3.4433, 3.4330, 3.4092, - 3.8867, 4.0190, 3.7961, 3.6412, 3.5405, - 3.4681, 4.3538, 4.2136, 3.9381, 3.8912, - 3.9681, 3.7909, 3.6774, 3.6262, 3.5999, - 3.5823, 3.5727, 3.5419, 4.0245, 4.1874, - 3.0893, 2.7917, 3.7262, 3.3518, 3.4241, - 3.5433, 3.2773, 3.0890, 2.9775, 2.9010, - 3.8048, 3.5362, 3.7746, 3.7911, 3.7511, - 3.5495, 3.4149, 3.3177, 4.0129, 3.8370, - 3.7739, 3.7125, 3.7152, 3.7701, 3.5813, - 3.5187, 3.4835, 3.4595, 3.4439, 3.4242, - 3.7476, 3.8239, 3.8346, 3.6627, 3.5479, - 3.4639, 4.1026, 3.9733, 3.9292, 3.8667, - 3.9513, 3.8959, 3.7698, 3.7089, 3.6765, - 3.6548, 3.6409, 3.5398, 3.8759, 3.9804, - 4.0150, 2.9091, 2.7638, 3.5066, 3.3377, - 3.3481, 3.2633, 3.1810, 3.1428, 2.9872, - 2.8837, 3.5929, 3.5183, 3.6729, 3.6596, - 3.6082, 3.5927, 3.4224, 3.2997, 3.8190, - 4.1865, 4.1114, 4.0540, 3.6325, 3.5697, - 3.5561, 3.5259, 3.4901, 3.4552, 3.4315, - 3.4091, 3.6438, 3.6879, 3.6832, 3.7043, - 3.5557, 3.4466, 3.9203, 4.2919, 4.2196, - 4.1542, 3.7573, 3.7039, 3.6546, 3.6151, - 3.5293, 3.4849, 3.4552, 3.5192, 3.7673, - 3.8359, 3.8525, 3.8901, 2.7806, 2.7209, - 3.3812, 3.4958, 3.2913, 3.1888, 3.0990, - 3.0394, 2.9789, 2.8582, 3.4716, 3.6883, - 3.6105, 3.5704, 3.5059, 3.4619, 3.4138, - 3.2742, 3.7080, 3.9773, 3.9010, 3.8409, - 3.7944, 3.4465, 3.7235, 3.6808, 3.6453, - 3.6168, 3.5844, 3.5576, 3.5772, 3.5959, - 3.5768, 3.5678, 3.5486, 3.4228, 3.8107, - 4.0866, 4.0169, 3.9476, 3.6358, 3.5800, - 3.5260, 3.4838, 3.4501, 3.4204, 3.3553, - 3.6487, 3.6973, 3.7398, 3.7405, 3.7459, - 3.7380, 2.6848, 2.6740, 3.2925, 3.3386, - 3.2473, 3.1284, 3.0301, 2.9531, 2.9602, - 2.8272, 3.3830, 3.5358, 3.5672, 3.5049, - 3.4284, 3.3621, 3.3001, 3.2451, 3.6209, - 3.8299, 3.7543, 3.6920, 3.6436, 3.3598, - 3.5701, 3.5266, 3.4904, 3.4590, 3.4364, - 3.4077, 3.5287, 3.5280, 3.4969, 3.4650, - 3.4304, 3.3963, 3.7229, 3.9402, 3.8753, - 3.8035, 3.5499, 3.4913, 3.4319, 3.3873, - 3.3520, 3.3209, 3.2948, 3.5052, 3.6465, - 3.6696, 3.6577, 3.6388, 3.6142, 3.5889, - 3.3968, 3.0122, 4.2241, 3.7887, 4.0049, - 3.5384, 3.2698, 3.1083, 2.9917, 2.9057, - 4.3340, 3.9900, 4.6588, 4.1278, 3.8125, - 3.6189, 3.4851, 3.3859, 4.6531, 4.3134, - 4.2258, 4.1309, 4.0692, 4.0944, 3.9850, - 3.9416, 3.9112, 3.8873, 3.8736, 3.8473, - 4.6027, 4.1538, 3.8994, 3.7419, 3.6356, - 3.5548, 4.8353, 4.5413, 4.3891, 4.3416, - 4.3243, 4.2753, 4.2053, 4.1790, 4.1685, - 4.1585, 4.1536, 4.0579, 4.1980, 4.4564, - 4.2192, 4.0528, 3.9489, 3.8642, 5.0567, - 3.0630, 3.3271, 4.0432, 4.0046, 4.1555, - 3.7426, 3.5130, 3.5174, 3.2884, 3.1378, - 4.1894, 4.2321, 4.1725, 4.1833, 3.8929, - 4.0544, 3.8118, 3.6414, 4.6373, 4.6268, - 4.4750, 4.4134, 4.3458, 3.8582, 4.2583, - 4.1898, 4.1562, 4.1191, 4.1069, 4.0639, - 4.1257, 4.1974, 3.9532, 4.1794, 3.9660, - 3.8130, 4.8160, 4.8272, 4.6294, 4.5840, - 4.0770, 4.0088, 3.9103, 3.8536, 3.8324, - 3.7995, 3.7826, 4.2294, 4.3380, 4.4352, - 4.1933, 4.4580, 4.2554, 4.1072, 5.0454, - 5.1814, 3.0632, 3.2662, 3.6432, 3.8088, - 3.7910, 3.7381, 3.5093, 3.5155, 3.3047, - 3.1681, 3.7871, 3.9924, 4.0637, 4.1382, - 3.8591, 4.0164, 3.7878, 3.6316, 4.1741, - 4.3166, 4.2395, 4.1831, 4.1107, 3.5857, - 4.0270, 3.9676, 3.9463, 3.9150, 3.9021, - 3.8708, 4.0240, 4.1551, 3.9108, 4.1337, - 3.9289, 3.7873, 4.3666, 4.5080, 4.4232, - 4.3155, 3.8461, 3.8007, 3.6991, 3.6447, - 3.6308, 3.5959, 3.5749, 4.0359, 4.3124, - 4.3539, 4.1122, 4.3772, 4.1785, 4.0386, - 4.7004, 4.8604, 4.6261, 2.9455, 3.2470, - 3.6108, 3.8522, 3.6625, 3.6598, 3.4411, - 3.4660, 3.2415, 3.0944, 3.7514, 4.0397, - 3.9231, 4.0561, 3.7860, 3.9845, 3.7454, - 3.5802, 4.1366, 4.3581, 4.2351, 4.2011, - 4.1402, 3.5381, 4.0653, 4.0093, 3.9883, - 3.9570, 3.9429, 3.9112, 3.8728, 4.0682, - 3.8351, 4.1054, 3.8928, 3.7445, 4.3415, - 4.5497, 4.3833, 4.3122, 3.8051, 3.7583, - 3.6622, 3.6108, 3.5971, 3.5628, 3.5408, - 4.0780, 4.0727, 4.2836, 4.0553, 4.3647, - 4.1622, 4.0178, 4.5802, 4.9125, 4.5861, - 4.6201, 2.9244, 3.2241, 3.5848, 3.8293, - 3.6395, 3.6400, 3.4204, 3.4499, 3.2253, - 3.0779, 3.7257, 4.0170, 3.9003, 4.0372, - 3.7653, 3.9672, 3.7283, 3.5630, 4.1092, - 4.3347, 4.2117, 4.1793, 4.1179, 3.5139, - 4.0426, 3.9867, 3.9661, 3.9345, 3.9200, - 3.8883, 3.8498, 4.0496, 3.8145, 4.0881, - 3.8756, 3.7271, 4.3128, 4.5242, 4.3578, - 4.2870, 3.7796, 3.7318, 3.6364, 3.5854, - 3.5726, 3.5378, 3.5155, 4.0527, 4.0478, - 4.2630, 4.0322, 4.3449, 4.1421, 3.9975, - 4.5499, 4.8825, 4.5601, 4.5950, 4.5702, - 2.9046, 3.2044, 3.5621, 3.8078, 3.6185, - 3.6220, 3.4019, 3.4359, 3.2110, 3.0635, - 3.7037, 3.9958, 3.8792, 4.0194, 3.7460, - 3.9517, 3.7128, 3.5474, 4.0872, 4.3138, - 4.1906, 4.1593, 4.0973, 3.4919, 4.0216, - 3.9657, 3.9454, 3.9134, 3.8986, 3.8669, - 3.8289, 4.0323, 3.7954, 4.0725, 3.8598, - 3.7113, 4.2896, 4.5021, 4.3325, 4.2645, - 3.7571, 3.7083, 3.6136, 3.5628, 3.5507, - 3.5155, 3.4929, 4.0297, 4.0234, 4.2442, - 4.0112, 4.3274, 4.1240, 3.9793, 4.5257, - 4.8568, 4.5353, 4.5733, 4.5485, 4.5271, - 2.8878, 3.1890, 3.5412, 3.7908, 3.5974, - 3.6078, 3.3871, 3.4243, 3.1992, 3.0513, - 3.6831, 3.9784, 3.8579, 4.0049, 3.7304, - 3.9392, 3.7002, 3.5347, 4.0657, 4.2955, - 4.1705, 4.1424, 4.0800, 3.4717, 4.0043, - 3.9485, 3.9286, 3.8965, 3.8815, 3.8500, - 3.8073, 4.0180, 3.7796, 4.0598, 3.8470, - 3.6983, 4.2678, 4.4830, 4.3132, 4.2444, - 3.7370, 3.6876, 3.5935, 3.5428, 3.5314, - 3.4958, 3.4730, 4.0117, 4.0043, 4.2287, - 3.9939, 4.3134, 4.1096, 3.9646, 4.5032, - 4.8356, 4.5156, 4.5544, 4.5297, 4.5083, - 4.4896, 2.8709, 3.1737, 3.5199, 3.7734, - 3.5802, 3.5934, 3.3724, 3.4128, 3.1877, - 3.0396, 3.6624, 3.9608, 3.8397, 3.9893, - 3.7145, 3.9266, 3.6877, 3.5222, 4.0448, - 4.2771, 4.1523, 4.1247, 4.0626, 3.4530, - 3.9866, 3.9310, 3.9115, 3.8792, 3.8641, - 3.8326, 3.7892, 4.0025, 3.7636, 4.0471, - 3.8343, 3.6854, 4.2464, 4.4635, 4.2939, - 4.2252, 3.7169, 3.6675, 3.5739, 3.5235, - 3.5126, 3.4768, 3.4537, 3.9932, 3.9854, - 4.2123, 3.9765, 4.2992, 4.0951, 3.9500, - 4.4811, 4.8135, 4.4959, 4.5351, 4.5105, - 4.4891, 4.4705, 4.4515, 2.8568, 3.1608, - 3.5050, 3.7598, 3.5665, 3.5803, 3.3601, - 3.4031, 3.1779, 3.0296, 3.6479, 3.9471, - 3.8262, 3.9773, 3.7015, 3.9162, 3.6771, - 3.5115, 4.0306, 4.2634, 4.1385, 4.1116, - 4.0489, 3.4366, 3.9732, 3.9176, 3.8983, - 3.8659, 3.8507, 3.8191, 3.7757, 3.9907, - 3.7506, 4.0365, 3.8235, 3.6745, 4.2314, - 4.4490, 4.2792, 4.2105, 3.7003, 3.6510, - 3.5578, 3.5075, 3.4971, 3.4609, 3.4377, - 3.9788, 3.9712, 4.1997, 3.9624, 4.2877, - 4.0831, 3.9378, 4.4655, 4.7974, 4.4813, - 4.5209, 4.4964, 4.4750, 4.4565, 4.4375, - 4.4234, 2.6798, 3.0151, 3.2586, 3.5292, - 3.5391, 3.4902, 3.2887, 3.3322, 3.1228, - 2.9888, 3.4012, 3.7145, 3.7830, 3.6665, - 3.5898, 3.8077, 3.5810, 3.4265, 3.7726, - 4.0307, 3.9763, 3.8890, 3.8489, 3.2706, - 3.7595, 3.6984, 3.6772, 3.6428, 3.6243, - 3.5951, 3.7497, 3.6775, 3.6364, 3.9203, - 3.7157, 3.5746, 3.9494, 4.2076, 4.1563, - 4.0508, 3.5329, 3.4780, 3.3731, 3.3126, - 3.2846, 3.2426, 3.2135, 3.7491, 3.9006, - 3.8332, 3.8029, 4.1436, 3.9407, 3.7998, - 4.1663, 4.5309, 4.3481, 4.2911, 4.2671, - 4.2415, 4.2230, 4.2047, 4.1908, 4.1243, - 2.5189, 2.9703, 3.3063, 3.6235, 3.4517, - 3.3989, 3.2107, 3.2434, 3.0094, 2.8580, - 3.4253, 3.8157, 3.7258, 3.6132, 3.5297, - 3.7566, 3.5095, 3.3368, 3.7890, 4.1298, - 4.0190, 3.9573, 3.9237, 3.2677, 3.8480, - 3.8157, 3.7656, 3.7317, 3.7126, 3.6814, - 3.6793, 3.6218, 3.5788, 3.8763, 3.6572, - 3.5022, 3.9737, 4.3255, 4.1828, 4.1158, - 3.5078, 3.4595, 3.3600, 3.3088, 3.2575, - 3.2164, 3.1856, 3.8522, 3.8665, 3.8075, - 3.7772, 4.1391, 3.9296, 3.7772, 4.2134, - 4.7308, 4.3787, 4.3894, 4.3649, 4.3441, - 4.3257, 4.3073, 4.2941, 4.1252, 4.2427, - 3.0481, 2.9584, 3.6919, 3.5990, 3.8881, - 3.4209, 3.1606, 3.1938, 2.9975, 2.8646, - 3.8138, 3.7935, 3.7081, 3.9155, 3.5910, - 3.4808, 3.4886, 3.3397, 4.1336, 4.1122, - 3.9888, 3.9543, 3.8917, 3.5894, 3.8131, - 3.7635, 3.7419, 3.7071, 3.6880, 3.6574, - 3.6546, 3.9375, 3.6579, 3.5870, 3.6361, - 3.5039, 4.3149, 4.2978, 4.1321, 4.1298, - 3.8164, 3.7680, 3.7154, 3.6858, 3.6709, - 3.6666, 3.6517, 3.8174, 3.8608, 4.1805, - 3.9102, 3.8394, 3.8968, 3.7673, 4.5274, - 4.6682, 4.3344, 4.3639, 4.3384, 4.3162, - 4.2972, 4.2779, 4.2636, 4.0253, 4.1168, - 4.1541, 2.8136, 3.0951, 3.4635, 3.6875, - 3.4987, 3.5183, 3.2937, 3.3580, 3.1325, - 2.9832, 3.6078, 3.8757, 3.7616, 3.9222, - 3.6370, 3.8647, 3.6256, 3.4595, 3.9874, - 4.1938, 4.0679, 4.0430, 3.9781, 3.3886, - 3.9008, 3.8463, 3.8288, 3.7950, 3.7790, - 3.7472, 3.7117, 3.9371, 3.6873, 3.9846, - 3.7709, 3.6210, 4.1812, 4.3750, 4.2044, - 4.1340, 3.6459, 3.5929, 3.5036, 3.4577, - 3.4528, 3.4146, 3.3904, 3.9014, 3.9031, - 4.1443, 3.8961, 4.2295, 4.0227, 3.8763, - 4.4086, 4.7097, 4.4064, 4.4488, 4.4243, - 4.4029, 4.3842, 4.3655, 4.3514, 4.1162, - 4.2205, 4.1953, 4.2794, 2.8032, 3.0805, - 3.4519, 3.6700, 3.4827, 3.5050, 3.2799, - 3.3482, 3.1233, 2.9747, 3.5971, 3.8586, - 3.7461, 3.9100, 3.6228, 3.8535, 3.6147, - 3.4490, 3.9764, 4.1773, 4.0511, 4.0270, - 3.9614, 3.3754, 3.8836, 3.8291, 3.8121, - 3.7780, 3.7619, 3.7300, 3.6965, 3.9253, - 3.6734, 3.9733, 3.7597, 3.6099, 4.1683, - 4.3572, 4.1862, 4.1153, 3.6312, 3.5772, - 3.4881, 3.4429, 3.4395, 3.4009, 3.3766, - 3.8827, 3.8868, 4.1316, 3.8807, 4.2164, - 4.0092, 3.8627, 4.3936, 4.6871, 4.3882, - 4.4316, 4.4073, 4.3858, 4.3672, 4.3485, - 4.3344, 4.0984, 4.2036, 4.1791, 4.2622, - 4.2450, 2.7967, 3.0689, 3.4445, 3.6581, - 3.4717, 3.4951, 3.2694, 3.3397, 3.1147, - 2.9661, 3.5898, 3.8468, 3.7358, 3.9014, - 3.6129, 3.8443, 3.6054, 3.4396, 3.9683, - 4.1656, 4.0394, 4.0158, 3.9498, 3.3677, - 3.8718, 3.8164, 3.8005, 3.7662, 3.7500, - 3.7181, 3.6863, 3.9170, 3.6637, 3.9641, - 3.7503, 3.6004, 4.1590, 4.3448, 4.1739, - 4.1029, 3.6224, 3.5677, 3.4785, 3.4314, - 3.4313, 3.3923, 3.3680, 3.8698, 3.8758, - 4.1229, 3.8704, 4.2063, 3.9987, 3.8519, - 4.3832, 4.6728, 4.3759, 4.4195, 4.3952, - 4.3737, 4.3551, 4.3364, 4.3223, 4.0861, - 4.1911, 4.1676, 4.2501, 4.2329, 4.2208, - 2.7897, 3.0636, 3.4344, 3.6480, 3.4626, - 3.4892, 3.2626, 3.3344, 3.1088, 2.9597, - 3.5804, 3.8359, 3.7251, 3.8940, 3.6047, - 3.8375, 3.5990, 3.4329, 3.9597, 4.1542, - 4.0278, 4.0048, 3.9390, 3.3571, 3.8608, - 3.8056, 3.7899, 3.7560, 3.7400, 3.7081, - 3.6758, 3.9095, 3.6552, 3.9572, 3.7436, - 3.5933, 4.1508, 4.3337, 4.1624, 4.0916, - 3.6126, 3.5582, 3.4684, 3.4212, 3.4207, - 3.3829, 3.3586, 3.8604, 3.8658, 4.1156, - 3.8620, 4.1994, 3.9917, 3.8446, 4.3750, - 4.6617, 4.3644, 4.4083, 4.3840, 4.3625, - 4.3439, 4.3253, 4.3112, 4.0745, 4.1807, - 4.1578, 4.2390, 4.2218, 4.2097, 4.1986, - 2.8395, 3.0081, 3.3171, 3.4878, 3.5360, - 3.5145, 3.2809, 3.3307, 3.1260, 2.9940, - 3.4741, 3.6675, 3.7832, 3.6787, 3.6156, - 3.8041, 3.5813, 3.4301, 3.8480, 3.9849, - 3.9314, 3.8405, 3.8029, 3.2962, 3.7104, - 3.6515, 3.6378, 3.6020, 3.5849, 3.5550, - 3.7494, 3.6893, 3.6666, 3.9170, 3.7150, - 3.5760, 4.0268, 4.1596, 4.1107, 3.9995, - 3.5574, 3.5103, 3.4163, 3.3655, 3.3677, - 3.3243, 3.2975, 3.7071, 3.9047, 3.8514, - 3.8422, 3.8022, 3.9323, 3.7932, 4.2343, - 4.4583, 4.3115, 4.2457, 4.2213, 4.1945, - 4.1756, 4.1569, 4.1424, 4.0620, 4.0494, - 3.9953, 4.0694, 4.0516, 4.0396, 4.0280, - 4.0130, 2.9007, 2.9674, 3.8174, 3.5856, - 3.6486, 3.5339, 3.2832, 3.3154, 3.1144, - 2.9866, 3.9618, 3.8430, 3.9980, 3.8134, - 3.6652, 3.7985, 3.5756, 3.4207, 4.4061, - 4.2817, 4.1477, 4.0616, 3.9979, 3.6492, - 3.8833, 3.8027, 3.7660, 3.7183, 3.6954, - 3.6525, 3.9669, 3.8371, 3.7325, 3.9160, - 3.7156, 3.5714, 4.6036, 4.4620, 4.3092, - 4.2122, 3.8478, 3.7572, 3.6597, 3.5969, - 3.5575, 3.5386, 3.5153, 3.7818, 4.1335, - 4.0153, 3.9177, 3.8603, 3.9365, 3.7906, - 4.7936, 4.7410, 4.5461, 4.5662, 4.5340, - 4.5059, 4.4832, 4.4604, 4.4429, 4.2346, - 4.4204, 4.3119, 4.3450, 4.3193, 4.3035, - 4.2933, 4.1582, 4.2450, 2.8559, 2.9050, - 3.8325, 3.5442, 3.5077, 3.4905, 3.2396, - 3.2720, 3.0726, 2.9467, 3.9644, 3.8050, - 3.8981, 3.7762, 3.6216, 3.7531, 3.5297, - 3.3742, 4.3814, 4.2818, 4.1026, 4.0294, - 3.9640, 3.6208, 3.8464, 3.7648, 3.7281, - 3.6790, 3.6542, 3.6117, 3.8650, 3.8010, - 3.6894, 3.8713, 3.6699, 3.5244, 4.5151, - 4.4517, 4.2538, 4.1483, 3.8641, 3.7244, - 3.6243, 3.5589, 3.5172, 3.4973, 3.4715, - 3.7340, 4.0316, 3.9958, 3.8687, 3.8115, - 3.8862, 3.7379, 4.7091, 4.7156, 4.5199, - 4.5542, 4.5230, 4.4959, 4.4750, 4.4529, - 4.4361, 4.1774, 4.3774, 4.2963, 4.3406, - 4.3159, 4.3006, 4.2910, 4.1008, 4.1568, - 4.0980, 2.8110, 2.8520, 3.7480, 3.5105, - 3.4346, 3.3461, 3.1971, 3.2326, 3.0329, - 2.9070, 3.8823, 3.7928, 3.8264, 3.7006, - 3.5797, 3.7141, 3.4894, 3.3326, 4.3048, - 4.2217, 4.0786, 3.9900, 3.9357, 3.6331, - 3.8333, 3.7317, 3.6957, 3.6460, 3.6197, - 3.5779, 3.7909, 3.7257, 3.6476, 3.5729, - 3.6304, 3.4834, 4.4368, 4.3921, 4.2207, - 4.1133, 3.8067, 3.7421, 3.6140, 3.5491, - 3.5077, 3.4887, 3.4623, 3.6956, 3.9568, - 3.8976, 3.8240, 3.7684, 3.8451, 3.6949, - 4.6318, 4.6559, 4.4533, 4.4956, 4.4641, - 4.4366, 4.4155, 4.3936, 4.3764, 4.1302, - 4.3398, 4.2283, 4.2796, 4.2547, 4.2391, - 4.2296, 4.0699, 4.1083, 4.0319, 3.9855, - 2.7676, 2.8078, 3.6725, 3.4804, 3.3775, - 3.2411, 3.1581, 3.1983, 2.9973, 2.8705, - 3.8070, 3.7392, 3.7668, 3.6263, 3.5402, - 3.6807, 3.4545, 3.2962, 4.2283, 4.1698, - 4.0240, 3.9341, 3.8711, 3.5489, 3.7798, - 3.7000, 3.6654, 3.6154, 3.5882, 3.5472, - 3.7289, 3.6510, 3.6078, 3.5355, 3.5963, - 3.4480, 4.3587, 4.3390, 4.1635, 4.0536, - 3.7193, 3.6529, 3.5512, 3.4837, 3.4400, - 3.4191, 3.3891, 3.6622, 3.8934, 3.8235, - 3.7823, 3.7292, 3.8106, 3.6589, 4.5535, - 4.6013, 4.3961, 4.4423, 4.4109, 4.3835, - 4.3625, 4.3407, 4.3237, 4.0863, 4.2835, - 4.1675, 4.2272, 4.2025, 4.1869, 4.1774, - 4.0126, 4.0460, 3.9815, 3.9340, 3.8955, - 2.6912, 2.7604, 3.6037, 3.4194, 3.3094, - 3.1710, 3.0862, 3.1789, 2.9738, 2.8427, - 3.7378, 3.6742, 3.6928, 3.5512, 3.4614, - 3.4087, 3.4201, 3.2607, 4.1527, 4.0977, - 3.9523, 3.8628, 3.8002, 3.4759, 3.7102, - 3.6466, 3.6106, 3.5580, 3.5282, 3.4878, - 3.6547, 3.5763, 3.5289, 3.5086, 3.5593, - 3.4099, 4.2788, 4.2624, 4.0873, 3.9770, - 3.6407, 3.5743, 3.5178, 3.4753, 3.3931, - 3.3694, 3.3339, 3.6002, 3.8164, 3.7478, - 3.7028, 3.6952, 3.7669, 3.6137, 4.4698, - 4.5488, 4.3168, 4.3646, 4.3338, 4.3067, - 4.2860, 4.2645, 4.2478, 4.0067, 4.2349, - 4.0958, 4.1543, 4.1302, 4.1141, 4.1048, - 3.9410, 3.9595, 3.8941, 3.8465, 3.8089, - 3.7490, 2.7895, 2.5849, 3.6484, 3.0162, - 3.1267, 3.2125, 3.0043, 2.9572, 2.8197, - 2.7261, 3.7701, 3.2446, 3.5239, 3.4696, - 3.4261, 3.3508, 3.1968, 3.0848, 4.1496, - 3.6598, 3.5111, 3.4199, 3.3809, 3.5382, - 3.2572, 3.2100, 3.1917, 3.1519, 3.1198, - 3.1005, 3.5071, 3.5086, 3.5073, 3.4509, - 3.3120, 3.2082, 4.2611, 3.8117, 3.6988, - 3.5646, 3.6925, 3.6295, 3.5383, 3.4910, - 3.4625, 3.4233, 3.4007, 3.2329, 3.6723, - 3.6845, 3.6876, 3.6197, 3.4799, 3.3737, - 4.4341, 4.0525, 3.9011, 3.8945, 3.8635, - 3.8368, 3.8153, 3.7936, 3.7758, 3.4944, - 3.4873, 3.9040, 3.7110, 3.6922, 3.6799, - 3.6724, 3.5622, 3.6081, 3.5426, 3.4922, - 3.4498, 3.3984, 3.4456, 2.7522, 2.5524, - 3.5742, 2.9508, 3.0751, 3.0158, 2.9644, - 2.8338, 2.7891, 2.6933, 3.6926, 3.1814, - 3.4528, 3.4186, 3.3836, 3.2213, 3.1626, - 3.0507, 4.0548, 3.5312, 3.4244, 3.3409, - 3.2810, 3.4782, 3.1905, 3.1494, 3.1221, - 3.1128, 3.0853, 3.0384, 3.4366, 3.4562, - 3.4638, 3.3211, 3.2762, 3.1730, 4.1632, - 3.6825, 3.5822, 3.4870, 3.6325, 3.5740, - 3.4733, 3.4247, 3.3969, 3.3764, 3.3525, - 3.1984, 3.5989, 3.6299, 3.6433, 3.4937, - 3.4417, 3.3365, 4.3304, 3.9242, 3.7793, - 3.7623, 3.7327, 3.7071, 3.6860, 3.6650, - 3.6476, 3.3849, 3.3534, 3.8216, 3.5870, - 3.5695, 3.5584, 3.5508, 3.4856, 3.5523, - 3.4934, 3.4464, 3.4055, 3.3551, 3.3888, - 3.3525, 2.7202, 2.5183, 3.4947, 2.8731, - 3.0198, 3.1457, 2.9276, 2.7826, 2.7574, - 2.6606, 3.6090, 3.0581, 3.3747, 3.3677, - 3.3450, 3.1651, 3.1259, 3.0147, 3.9498, - 3.3857, 3.2917, 3.2154, 3.1604, 3.4174, - 3.0735, 3.0342, 3.0096, 3.0136, 2.9855, - 2.9680, 3.3604, 3.4037, 3.4243, 3.2633, - 3.1810, 3.1351, 4.0557, 3.5368, 3.4526, - 3.3699, 3.5707, 3.5184, 3.4085, 3.3595, - 3.3333, 3.3143, 3.3041, 3.1094, 3.5193, - 3.5745, 3.6025, 3.4338, 3.3448, 3.2952, - 4.2158, 3.7802, 3.6431, 3.6129, 3.5853, - 3.5610, 3.5406, 3.5204, 3.5036, 3.2679, - 3.2162, 3.7068, 3.4483, 3.4323, 3.4221, - 3.4138, 3.3652, 3.4576, 3.4053, 3.3618, - 3.3224, 3.2711, 3.3326, 3.2950, 3.2564, - 2.5315, 2.6104, 3.2734, 3.2299, 3.1090, - 2.9942, 2.9159, 2.8324, 2.8350, 2.7216, - 3.3994, 3.4475, 3.4354, 3.3438, 3.2807, - 3.2169, 3.2677, 3.1296, 3.7493, 3.8075, - 3.6846, 3.6104, 3.5577, 3.2052, 3.4803, - 3.4236, 3.3845, 3.3640, 3.3365, 3.3010, - 3.3938, 3.3624, 3.3440, 3.3132, 3.4035, - 3.2754, 3.8701, 3.9523, 3.8018, 3.7149, - 3.3673, 3.3199, 3.2483, 3.2069, 3.1793, - 3.1558, 3.1395, 3.4097, 3.5410, 3.5228, - 3.5116, 3.4921, 3.4781, 3.4690, 4.0420, - 4.1759, 4.0078, 4.0450, 4.0189, 3.9952, - 3.9770, 3.9583, 3.9434, 3.7217, 3.8228, - 3.7826, 3.8640, 3.8446, 3.8314, 3.8225, - 3.6817, 3.7068, 3.6555, 3.6159, 3.5831, - 3.5257, 3.2133, 3.1689, 3.1196, 3.3599, - 2.9852, 2.7881, 3.5284, 3.3493, 3.6958, - 3.3642, 3.1568, 3.0055, 2.9558, 2.8393, - 3.6287, 3.5283, 4.1511, 3.8259, 3.6066, - 3.4527, 3.3480, 3.2713, 3.9037, 3.8361, - 3.8579, 3.7311, 3.6575, 3.5176, 3.5693, - 3.5157, 3.4814, 3.4559, 3.4445, 3.4160, - 4.1231, 3.8543, 3.6816, 3.5602, 3.4798, - 3.4208, 4.0542, 4.0139, 4.0165, 3.9412, - 3.7698, 3.6915, 3.6043, 3.5639, 3.5416, - 3.5247, 3.5153, 3.5654, 4.2862, 4.0437, - 3.8871, 3.7741, 3.6985, 3.6413, 4.2345, - 4.3663, 4.3257, 4.0869, 4.0612, 4.0364, - 4.0170, 3.9978, 3.9834, 3.9137, 3.8825, - 3.8758, 3.9143, 3.8976, 3.8864, 3.8768, - 3.9190, 4.1613, 4.0566, 3.9784, 3.9116, - 3.8326, 3.7122, 3.6378, 3.5576, 3.5457, - 4.3127, 3.1160, 2.8482, 4.0739, 3.3599, - 3.5698, 3.5366, 3.2854, 3.1039, 2.9953, - 2.9192, 4.1432, 3.5320, 3.9478, 4.0231, - 3.7509, 3.5604, 3.4340, 3.3426, 4.3328, - 3.8288, 3.7822, 3.7909, 3.6907, 3.6864, - 3.5793, 3.5221, 3.4883, 3.4649, 3.4514, - 3.4301, 3.9256, 4.0596, 3.8307, 3.6702, - 3.5651, 3.4884, 4.4182, 4.2516, 3.9687, - 3.9186, 3.9485, 3.8370, 3.7255, 3.6744, - 3.6476, 3.6295, 3.6193, 3.5659, 4.0663, - 4.2309, 4.0183, 3.8680, 3.7672, 3.6923, - 4.5240, 4.4834, 4.1570, 4.3204, 4.2993, - 4.2804, 4.2647, 4.2481, 4.2354, 3.8626, - 3.8448, 4.2267, 4.1799, 4.1670, 3.8738, - 3.8643, 3.8796, 4.0575, 4.0354, 3.9365, - 3.8611, 3.7847, 3.7388, 3.6826, 3.6251, - 3.5492, 4.0889, 4.2764, 3.1416, 2.8325, - 3.7735, 3.3787, 3.4632, 3.5923, 3.3214, - 3.1285, 3.0147, 2.9366, 3.8527, 3.5602, - 3.8131, 3.8349, 3.7995, 3.5919, 3.4539, - 3.3540, 4.0654, 3.8603, 3.7972, 3.7358, - 3.7392, 3.8157, 3.6055, 3.5438, 3.5089, - 3.4853, 3.4698, 3.4508, 3.7882, 3.8682, - 3.8837, 3.7055, 3.5870, 3.5000, 4.1573, - 4.0005, 3.9568, 3.8936, 3.9990, 3.9433, - 3.8172, 3.7566, 3.7246, 3.7033, 3.6900, - 3.5697, 3.9183, 4.0262, 4.0659, 3.8969, - 3.7809, 3.6949, 4.2765, 4.2312, 4.1401, - 4.0815, 4.0580, 4.0369, 4.0194, 4.0017, - 3.9874, 3.8312, 3.8120, 3.9454, 3.9210, - 3.9055, 3.8951, 3.8866, 3.8689, 3.9603, - 3.9109, 3.9122, 3.8233, 3.7438, 3.7436, - 3.6981, 3.6555, 3.5452, 3.9327, 4.0658, - 4.1175, 2.9664, 2.8209, 3.5547, 3.3796, - 3.3985, 3.3164, 3.2364, 3.1956, 3.0370, - 2.9313, 3.6425, 3.5565, 3.7209, 3.7108, - 3.6639, 3.6484, 3.4745, 3.3492, 3.8755, - 4.2457, 3.7758, 3.7161, 3.6693, 3.6155, - 3.5941, 3.5643, 3.5292, 3.4950, 3.4720, - 3.4503, 3.6936, 3.7392, 3.7388, 3.7602, - 3.6078, 3.4960, 3.9800, 4.3518, 4.2802, - 3.8580, 3.8056, 3.7527, 3.7019, 3.6615, - 3.5768, 3.5330, 3.5038, 3.5639, 3.8192, - 3.8883, 3.9092, 3.9478, 3.7995, 3.6896, - 4.1165, 4.5232, 4.4357, 4.4226, 4.4031, - 4.3860, 4.3721, 4.3580, 4.3466, 4.2036, - 4.2037, 3.8867, 4.2895, 4.2766, 4.2662, - 4.2598, 3.8408, 3.9169, 3.8681, 3.8250, - 3.7855, 3.7501, 3.6753, 3.5499, 3.4872, - 3.5401, 3.8288, 3.9217, 3.9538, 4.0054, - 2.8388, 2.7890, 3.4329, 3.5593, 3.3488, - 3.2486, 3.1615, 3.1000, 3.0394, 2.9165, - 3.5267, 3.7479, 3.6650, 3.6263, 3.5658, - 3.5224, 3.4762, 3.3342, 3.7738, 4.0333, - 3.9568, 3.8975, 3.8521, 3.4929, 3.7830, - 3.7409, 3.7062, 3.6786, 3.6471, 3.6208, - 3.6337, 3.6519, 3.6363, 3.6278, 3.6110, - 3.4825, 3.8795, 4.1448, 4.0736, 4.0045, - 3.6843, 3.6291, 3.5741, 3.5312, 3.4974, - 3.4472, 3.4034, 3.7131, 3.7557, 3.7966, - 3.8005, 3.8068, 3.8015, 3.6747, 4.0222, - 4.3207, 4.2347, 4.2191, 4.1990, 4.1811, - 4.1666, 4.1521, 4.1401, 3.9970, 3.9943, - 3.9592, 4.0800, 4.0664, 4.0559, 4.0488, - 3.9882, 4.0035, 3.9539, 3.9138, 3.8798, - 3.8355, 3.5359, 3.4954, 3.3962, 3.5339, - 3.7595, 3.8250, 3.8408, 3.8600, 3.8644, - 2.7412, 2.7489, 3.3374, 3.3950, 3.3076, - 3.1910, 3.0961, 3.0175, 3.0280, 2.8929, - 3.4328, 3.5883, 3.6227, 3.5616, 3.4894, - 3.4241, 3.3641, 3.3120, 3.6815, 3.8789, - 3.8031, 3.7413, 3.6939, 3.4010, 3.6225, - 3.5797, 3.5443, 3.5139, 3.4923, 3.4642, - 3.5860, 3.5849, 3.5570, 3.5257, 3.4936, - 3.4628, 3.7874, 3.9916, 3.9249, 3.8530, - 3.5932, 3.5355, 3.4757, 3.4306, 3.3953, - 3.3646, 3.3390, 3.5637, 3.7053, 3.7266, - 3.7177, 3.6996, 3.6775, 3.6558, 3.9331, - 4.1655, 4.0879, 4.0681, 4.0479, 4.0299, - 4.0152, 4.0006, 3.9883, 3.8500, 3.8359, - 3.8249, 3.9269, 3.9133, 3.9025, 3.8948, - 3.8422, 3.8509, 3.7990, 3.7570, 3.7219, - 3.6762, 3.4260, 3.3866, 3.3425, 3.5294, - 3.7022, 3.7497, 3.7542, 3.7494, 3.7370, - 3.7216, 3.3286, 3.5286, 4.5857, 4.2143, - 3.9714, 3.9428, 3.8857, 3.7714, 3.7857, - 3.8286, 4.8714, 4.6571, 4.4857, 4.3571, - 4.4429, 4.3286, 4.2857, 4.2428, 5.3857, - 5.0714, 4.7714, 4.6143, 4.6000, 4.4429, - 4.4000, 4.3571, 4.3000, 4.2857, 4.3143, - 4.4286, 4.4714, 4.4286, 4.5143, 4.4429, - 4.5000, 4.5429, 5.5714, 5.2572, 4.9714, - 4.8572, 4.7571, 4.6428, 4.5143, 4.4857, - 4.4857, 4.4143, 4.5143, 4.6286, 4.7000, - 4.6714, 4.6714, 4.6286, 4.7571, 4.7429, - 5.8571, 5.3857, 5.1857, 4.9714, 5.1286, - 5.1143, 5.1000, 5.0857, 5.0286, 5.0428, - 5.0286, 5.0143, 5.0000, 5.0000, 4.9857, - 5.0571, 4.9571, 4.8286, 4.7429, 4.6286, - 4.5572, 4.5286, 4.4572, 4.4714, 4.4857, - 4.7571, 4.7286, 4.7286, 4.8143, 4.7429, - 4.8429, 4.9000, 5.7428, 3.0429, 3.2429, - 4.3000, 3.9286, 3.6857, 3.6571, 3.6000, - 3.4857, 3.5000, 3.5428, 4.5857, 4.3714, - 4.2000, 4.0714, 4.1572, 4.0429, 4.0000, - 3.9571, 5.1000, 4.7857, 4.4857, 4.3286, - 4.3143, 4.1572, 4.1143, 4.0714, 4.0143, - 4.0000, 4.0286, 4.1429, 4.1857, 4.1429, - 4.2285, 4.1572, 4.2143, 4.2571, 5.2857, - 4.9714, 4.6857, 4.5714, 4.4714, 4.3571, - 4.2285, 4.2000, 4.2000, 4.1286, 4.2285, - 4.3429, 4.4143, 4.3857, 4.3857, 4.3429, - 4.4714, 4.4572, 5.5714, 5.1000, 4.9000, - 4.6857, 4.8429, 4.8286, 4.8143, 4.8000, - 4.7429, 4.7571, 4.7429, 4.7286, 4.7143, - 4.7143, 4.7000, 4.7714, 4.6714, 4.5429, - 4.4572, 4.3429, 4.2714, 4.2428, 4.1715, - 4.1857, 4.2000, 4.4714, 4.4429, 4.4429, - 4.5286, 4.4572, 4.5572, 4.6143, 5.4571, - 5.1714, 2.8428, 3.0429, 4.1000, 3.7286, - 3.4857, 3.4572, 3.4000, 3.2857, 3.3000, - 3.3429, 4.3857, 4.1715, 4.0000, 3.8714, - 3.9571, 3.8428, 3.8000, 3.7572, 4.9000, - 4.5857, 4.2857, 4.1286, 4.1143, 3.9571, - 3.9143, 3.8714, 3.8143, 3.8000, 3.8286, - 3.9428, 3.9857, 3.9428, 4.0286, 3.9571, - 4.0143, 4.0571, 5.0857, 4.7714, 4.4857, - 4.3714, 4.2714, 4.1572, 4.0286, 4.0000, - 4.0000, 3.9286, 4.0286, 4.1429, 4.2143, - 4.1857, 4.1857, 4.1429, 4.2714, 4.2571, - 5.3714, 4.9000, 4.7000, 4.4857, 4.6428, - 4.6286, 4.6143, 4.6000, 4.5429, 4.5572, - 4.5429, 4.5286, 4.5143, 4.5143, 4.5000, - 4.5714, 4.4714, 4.3429, 4.2571, 4.1429, - 4.0714, 4.0429, 3.9714, 3.9857, 4.0000, - 4.2714, 4.2428, 4.2428, 4.3286, 4.2571, - 4.3571, 4.4143, 5.2572, 4.9714, 4.7714, - 2.7143, 2.9143, 3.9714, 3.6000, 3.3572, - 3.3286, 3.2714, 3.1571, 3.1714, 3.2143, - 4.2571, 4.0429, 3.8714, 3.7429, 3.8286, - 3.7143, 3.6714, 3.6286, 4.7714, 4.4572, - 4.1572, 4.0000, 3.9857, 3.8286, 3.7857, - 3.7429, 3.6857, 3.6714, 3.7000, 3.8143, - 3.8571, 3.8143, 3.9000, 3.8286, 3.8857, - 3.9286, 4.9571, 4.6428, 4.3571, 4.2428, - 4.1429, 4.0286, 3.9000, 3.8714, 3.8714, - 3.8000, 3.9000, 4.0143, 4.0857, 4.0571, - 4.0571, 4.0143, 4.1429, 4.1286, 5.2429, - 4.7714, 4.5714, 4.3571, 4.5143, 4.5000, - 4.4857, 4.4714, 4.4143, 4.4286, 4.4143, - 4.4000, 4.3857, 4.3857, 4.3714, 4.4429, - 4.3429, 4.2143, 4.1286, 4.0143, 3.9428, - 3.9143, 3.8428, 3.8571, 3.8714, 4.1429, - 4.1143, 4.1143, 4.2000, 4.1286, 4.2285, - 4.2857, 5.1286, 4.8429, 4.6428, 4.5143, - 2.6286, 2.8286, 3.8857, 3.5143, 3.2714, - 3.2429, 3.1857, 3.0715, 3.0857, 3.1285, - 4.1715, 3.9571, 3.7857, 3.6571, 3.7429, - 3.6286, 3.5857, 3.5428, 4.6857, 4.3714, - 4.0714, 3.9143, 3.9000, 3.7429, 3.7000, - 3.6571, 3.6000, 3.5857, 3.6143, 3.7286, - 3.7714, 3.7286, 3.8143, 3.7429, 3.8000, - 3.8428, 4.8714, 4.5572, 4.2714, 4.1572, - 4.0571, 3.9428, 3.8143, 3.7857, 3.7857, - 3.7143, 3.8143, 3.9286, 4.0000, 3.9714, - 3.9714, 3.9286, 4.0571, 4.0429, 5.1571, - 4.6857, 4.4857, 4.2714, 4.4286, 4.4143, - 4.4000, 4.3857, 4.3286, 4.3429, 4.3286, - 4.3143, 4.3000, 4.3000, 4.2857, 4.3571, - 4.2571, 4.1286, 4.0429, 3.9286, 3.8571, - 3.8286, 3.7572, 3.7714, 3.7857, 4.0571, - 4.0286, 4.0286, 4.1143, 4.0429, 4.1429, - 4.2000, 5.0428, 4.7571, 4.5572, 4.4286, - 4.3429, 2.6429, 2.8428, 3.9000, 3.5286, - 3.2857, 3.2571, 3.2000, 3.0857, 3.1000, - 3.1428, 4.1857, 3.9714, 3.8000, 3.6714, - 3.7572, 3.6429, 3.6000, 3.5571, 4.7000, - 4.3857, 4.0857, 3.9286, 3.9143, 3.7572, - 3.7143, 3.6714, 3.6143, 3.6000, 3.6286, - 3.7429, 3.7857, 3.7429, 3.8286, 3.7572, - 3.8143, 3.8571, 4.8857, 4.5714, 4.2857, - 4.1715, 4.0714, 3.9571, 3.8286, 3.8000, - 3.8000, 3.7286, 3.8286, 3.9428, 4.0143, - 3.9857, 3.9857, 3.9428, 4.0714, 4.0571, - 5.1714, 4.7000, 4.5000, 4.2857, 4.4429, - 4.4286, 4.4143, 4.4000, 4.3429, 4.3571, - 4.3429, 4.3286, 4.3143, 4.3143, 4.3000, - 4.3714, 4.2714, 4.1429, 4.0571, 3.9428, - 3.8714, 3.8428, 3.7714, 3.7857, 3.8000, - 4.0714, 4.0429, 4.0429, 4.1286, 4.0571, - 4.1572, 4.2143, 5.0571, 4.7714, 4.5714, - 4.4429, 4.3571, 4.3714, 2.6572, 2.8571, - 3.9143, 3.5428, 3.3000, 3.2714, 3.2143, - 3.1000, 3.1143, 3.1571, 4.2000, 3.9857, - 3.8143, 3.6857, 3.7714, 3.6571, 3.6143, - 3.5714, 4.7143, 4.4000, 4.1000, 3.9428, - 3.9286, 3.7714, 3.7286, 3.6857, 3.6286, - 3.6143, 3.6429, 3.7572, 3.8000, 3.7572, - 3.8428, 3.7714, 3.8286, 3.8714, 4.9000, - 4.5857, 4.3000, 4.1857, 4.0857, 3.9714, - 3.8428, 3.8143, 3.8143, 3.7429, 3.8428, - 3.9571, 4.0286, 4.0000, 4.0000, 3.9571, - 4.0857, 4.0714, 5.1857, 4.7143, 4.5143, - 4.3000, 4.4572, 4.4429, 4.4286, 4.4143, - 4.3571, 4.3714, 4.3571, 4.3429, 4.3286, - 4.3286, 4.3143, 4.3857, 4.2857, 4.1572, - 4.0714, 3.9571, 3.8857, 3.8571, 3.7857, - 3.8000, 3.8143, 4.0857, 4.0571, 4.0571, - 4.1429, 4.0714, 4.1715, 4.2285, 5.0714, - 4.7857, 4.5857, 4.4572, 4.3714, 4.3857, - 4.4000, 2.6714, 2.8714, 3.9286, 3.5571, - 3.3143, 3.2857, 3.2286, 3.1143, 3.1285, - 3.1714, 4.2143, 4.0000, 3.8286, 3.7000, - 3.7857, 3.6714, 3.6286, 3.5857, 4.7286, - 4.4143, 4.1143, 3.9571, 3.9428, 3.7857, - 3.7429, 3.7000, 3.6429, 3.6286, 3.6571, - 3.7714, 3.8143, 3.7714, 3.8571, 3.7857, - 3.8428, 3.8857, 4.9143, 4.6000, 4.3143, - 4.2000, 4.1000, 3.9857, 3.8571, 3.8286, - 3.8286, 3.7572, 3.8571, 3.9714, 4.0429, - 4.0143, 4.0143, 3.9714, 4.1000, 4.0857, - 5.2000, 4.7286, 4.5286, 4.3143, 4.4714, - 4.4572, 4.4429, 4.4286, 4.3714, 4.3857, - 4.3714, 4.3571, 4.3429, 4.3429, 4.3286, - 4.4000, 4.3000, 4.1715, 4.0857, 3.9714, - 3.9000, 3.8714, 3.8000, 3.8143, 3.8286, - 4.1000, 4.0714, 4.0714, 4.1572, 4.0857, - 4.1857, 4.2428, 5.0857, 4.8000, 4.6000, - 4.4714, 4.3857, 4.4000, 4.4143, 4.4286, - 2.5857, 2.7857, 3.8428, 3.4714, 3.2286, - 3.2000, 3.1428, 3.0286, 3.0429, 3.0857, - 4.1286, 3.9143, 3.7429, 3.6143, 3.7000, - 3.5857, 3.5428, 3.5000, 4.6428, 4.3286, - 4.0286, 3.8714, 3.8571, 3.7000, 3.6571, - 3.6143, 3.5571, 3.5428, 3.5714, 3.6857, - 3.7286, 3.6857, 3.7714, 3.7000, 3.7572, - 3.8000, 4.8286, 4.5143, 4.2285, 4.1143, - 4.0143, 3.9000, 3.7714, 3.7429, 3.7429, - 3.6714, 3.7714, 3.8857, 3.9571, 3.9286, - 3.9286, 3.8857, 4.0143, 4.0000, 5.1143, - 4.6428, 4.4429, 4.2285, 4.3857, 4.3714, - 4.3571, 4.3429, 4.2857, 4.3000, 4.2857, - 4.2714, 4.2571, 4.2571, 4.2428, 4.3143, - 4.2143, 4.0857, 4.0000, 3.8857, 3.8143, - 3.7857, 3.7143, 3.7286, 3.7429, 4.0143, - 3.9857, 3.9857, 4.0714, 4.0000, 4.1000, - 4.1572, 5.0000, 4.7143, 4.5143, 4.3857, - 4.3000, 4.3143, 4.3286, 4.3429, 4.2571, - 2.5857, 2.7857, 3.8428, 3.4714, 3.2286, - 3.2000, 3.1428, 3.0286, 3.0429, 3.0857, - 4.1286, 3.9143, 3.7429, 3.6143, 3.7000, - 3.5857, 3.5428, 3.5000, 4.6428, 4.3286, - 4.0286, 3.8714, 3.8571, 3.7000, 3.6571, - 3.6143, 3.5571, 3.5428, 3.5714, 3.6857, - 3.7286, 3.6857, 3.7714, 3.7000, 3.7572, - 3.8000, 4.8286, 4.5143, 4.2285, 4.1143, - 4.0143, 3.9000, 3.7714, 3.7429, 3.7429, - 3.6714, 3.7714, 3.8857, 3.9571, 3.9286, - 3.9286, 3.8857, 4.0143, 4.0000, 5.1143, - 4.6428, 4.4429, 4.2285, 4.3857, 4.3714, - 4.3571, 4.3429, 4.2857, 4.3000, 4.2857, - 4.2714, 4.2571, 4.2571, 4.2428, 4.3143, - 4.2143, 4.0857, 4.0000, 3.8857, 3.8143, - 3.7857, 3.7143, 3.7286, 3.7429, 4.0143, - 3.9857, 3.9857, 4.0714, 4.0000, 4.1000, - 4.1572, 5.0000, 4.7143, 4.5143, 4.3857, - 4.3000, 4.3143, 4.3286, 4.3429, 4.2571, - 4.2571, 2.6143, 2.8143, 3.8714, 3.5000, - 3.2571, 3.2286, 3.1714, 3.0572, 3.0715, - 3.1143, 4.1572, 3.9428, 3.7714, 3.6429, - 3.7286, 3.6143, 3.5714, 3.5286, 4.6714, - 4.3571, 4.0571, 3.9000, 3.8857, 3.7286, - 3.6857, 3.6429, 3.5857, 3.5714, 3.6000, - 3.7143, 3.7572, 3.7143, 3.8000, 3.7286, - 3.7857, 3.8286, 4.8572, 4.5429, 4.2571, - 4.1429, 4.0429, 3.9286, 3.8000, 3.7714, - 3.7714, 3.7000, 3.8000, 3.9143, 3.9857, - 3.9571, 3.9571, 3.9143, 4.0429, 4.0286, - 5.1429, 4.6714, 4.4714, 4.2571, 4.4143, - 4.4000, 4.3857, 4.3714, 4.3143, 4.3286, - 4.3143, 4.3000, 4.2857, 4.2857, 4.2714, - 4.3429, 4.2428, 4.1143, 4.0286, 3.9143, - 3.8428, 3.8143, 3.7429, 3.7572, 3.7714, - 4.0429, 4.0143, 4.0143, 4.1000, 4.0286, - 4.1286, 4.1857, 5.0286, 4.7429, 4.5429, - 4.4143, 4.3286, 4.3429, 4.3571, 4.3714, - 4.2857, 4.2857, 4.3143, 2.6143, 2.8143, - 3.8714, 3.5000, 3.2571, 3.2286, 3.1714, - 3.0572, 3.0715, 3.1143, 4.1572, 3.9428, - 3.7714, 3.6429, 3.7286, 3.6143, 3.5714, - 3.5286, 4.6714, 4.3571, 4.0571, 3.9000, - 3.8857, 3.7286, 3.6857, 3.6429, 3.5857, - 3.5714, 3.6000, 3.7143, 3.7572, 3.7143, - 3.8000, 3.7286, 3.7857, 3.8286, 4.8572, - 4.5429, 4.2571, 4.1429, 4.0429, 3.9286, - 3.8000, 3.7714, 3.7714, 3.7000, 3.8000, - 3.9143, 3.9857, 3.9571, 3.9571, 3.9143, - 4.0429, 4.0286, 5.1429, 4.6714, 4.4714, - 4.2571, 4.4143, 4.4000, 4.3857, 4.3714, - 4.3143, 4.3286, 4.3143, 4.3000, 4.2857, - 4.2857, 4.2714, 4.3429, 4.2428, 4.1143, - 4.0286, 3.9143, 3.8428, 3.8143, 3.7429, - 3.7572, 3.7714, 4.0429, 4.0143, 4.0143, - 4.1000, 4.0286, 4.1286, 4.1857, 5.0286, - 4.7429, 4.5429, 4.4143, 4.3286, 4.3429, - 4.3571, 4.3714, 4.2857, 4.2857, 4.3143, - 4.3143, 2.5714, 2.7714, 3.8286, 3.4572, - 3.2143, 3.1857, 3.1285, 3.0143, 3.0286, - 3.0715, 4.1143, 3.9000, 3.7286, 3.6000, - 3.6857, 3.5714, 3.5286, 3.4857, 4.6286, - 4.3143, 4.0143, 3.8571, 3.8428, 3.6857, - 3.6429, 3.6000, 3.5428, 3.5286, 3.5571, - 3.6714, 3.7143, 3.6714, 3.7572, 3.6857, - 3.7429, 3.7857, 4.8143, 4.5000, 4.2143, - 4.1000, 4.0000, 3.8857, 3.7572, 3.7286, - 3.7286, 3.6571, 3.7572, 3.8714, 3.9428, - 3.9143, 3.9143, 3.8714, 4.0000, 3.9857, - 5.1000, 4.6286, 4.4286, 4.2143, 4.3714, - 4.3571, 4.3429, 4.3286, 4.2714, 4.2857, - 4.2714, 4.2571, 4.2428, 4.2428, 4.2285, - 4.3000, 4.2000, 4.0714, 3.9857, 3.8714, - 3.8000, 3.7714, 3.7000, 3.7143, 3.7286, - 4.0000, 3.9714, 3.9714, 4.0571, 3.9857, - 4.0857, 4.1429, 4.9857, 4.7000, 4.5000, - 4.3714, 4.2857, 4.3000, 4.3143, 4.3286, - 4.2428, 4.2428, 4.2714, 4.2714, 4.2285, - 2.6000, 2.8000, 3.8571, 3.4857, 3.2429, - 3.2143, 3.1571, 3.0429, 3.0572, 3.1000, - 4.1429, 3.9286, 3.7572, 3.6286, 3.7143, - 3.6000, 3.5571, 3.5143, 4.6571, 4.3429, - 4.0429, 3.8857, 3.8714, 3.7143, 3.6714, - 3.6286, 3.5714, 3.5571, 3.5857, 3.7000, - 3.7429, 3.7000, 3.7857, 3.7143, 3.7714, - 3.8143, 4.8429, 4.5286, 4.2428, 4.1286, - 4.0286, 3.9143, 3.7857, 3.7572, 3.7572, - 3.6857, 3.7857, 3.9000, 3.9714, 3.9428, - 3.9428, 3.9000, 4.0286, 4.0143, 5.1286, - 4.6571, 4.4572, 4.2428, 4.4000, 4.3857, - 4.3714, 4.3571, 4.3000, 4.3143, 4.3000, - 4.2857, 4.2714, 4.2714, 4.2571, 4.3286, - 4.2285, 4.1000, 4.0143, 3.9000, 3.8286, - 3.8000, 3.7286, 3.7429, 3.7572, 4.0286, - 4.0000, 4.0000, 4.0857, 4.0143, 4.1143, - 4.1715, 5.0143, 4.7286, 4.5286, 4.4000, - 4.3143, 4.3286, 4.3429, 4.3571, 4.2714, - 4.2714, 4.3000, 4.3000, 4.2571, 4.2857, - 2.6857, 2.8857, 3.9428, 3.5714, 3.3286, - 3.3000, 3.2429, 3.1285, 3.1428, 3.1857, - 4.2285, 4.0143, 3.8428, 3.7143, 3.8000, - 3.6857, 3.6429, 3.6000, 4.7429, 4.4286, - 4.1286, 3.9714, 3.9571, 3.8000, 3.7572, - 3.7143, 3.6571, 3.6429, 3.6714, 3.7857, - 3.8286, 3.7857, 3.8714, 3.8000, 3.8571, - 3.9000, 4.9285, 4.6143, 4.3286, 4.2143, - 4.1143, 4.0000, 3.8714, 3.8428, 3.8428, - 3.7714, 3.8714, 3.9857, 4.0571, 4.0286, - 4.0286, 3.9857, 4.1143, 4.1000, 5.2143, - 4.7429, 4.5429, 4.3286, 4.4857, 4.4714, - 4.4572, 4.4429, 4.3857, 4.4000, 4.3857, - 4.3714, 4.3571, 4.3571, 4.3429, 4.4143, - 4.3143, 4.1857, 4.1000, 3.9857, 3.9143, - 3.8857, 3.8143, 3.8286, 3.8428, 4.1143, - 4.0857, 4.0857, 4.1715, 4.1000, 4.2000, - 4.2571, 5.1000, 4.8143, 4.6143, 4.4857, - 4.4000, 4.4143, 4.4286, 4.4429, 4.3571, - 4.3571, 4.3857, 4.3857, 4.3429, 4.3714, - 4.4572, 2.7143, 2.9143, 3.9714, 3.6000, - 3.3572, 3.3286, 3.2714, 3.1571, 3.1714, - 3.2143, 4.2571, 4.0429, 3.8714, 3.7429, - 3.8286, 3.7143, 3.6714, 3.6286, 4.7714, - 4.4572, 4.1572, 4.0000, 3.9857, 3.8286, - 3.7857, 3.7429, 3.6857, 3.6714, 3.7000, - 3.8143, 3.8571, 3.8143, 3.9000, 3.8286, - 3.8857, 3.9286, 4.9571, 4.6428, 4.3571, - 4.2428, 4.1429, 4.0286, 3.9000, 3.8714, - 3.8714, 3.8000, 3.9000, 4.0143, 4.0857, - 4.0571, 4.0571, 4.0143, 4.1429, 4.1286, - 5.2429, 4.7714, 4.5714, 4.3571, 4.5143, - 4.5000, 4.4857, 4.4714, 4.4143, 4.4286, - 4.4143, 4.4000, 4.3857, 4.3857, 4.3714, - 4.4429, 4.3429, 4.2143, 4.1286, 4.0143, - 3.9428, 3.9143, 3.8428, 3.8571, 3.8714, - 4.1429, 4.1143, 4.1143, 4.2000, 4.1286, - 4.2285, 4.2857, 5.1286, 4.8429, 4.6428, - 4.5143, 4.4286, 4.4429, 4.4572, 4.4714, - 4.3857, 4.3857, 4.4143, 4.4143, 4.3714, - 4.4000, 4.4857, 4.5143, 2.5286, 2.7286, - 3.7857, 3.4143, 3.1714, 3.1428, 3.0857, - 2.9714, 2.9857, 3.0286, 4.0714, 3.8571, - 3.6857, 3.5571, 3.6429, 3.5286, 3.4857, - 3.4429, 4.5857, 4.2714, 3.9714, 3.8143, - 3.8000, 3.6429, 3.6000, 3.5571, 3.5000, - 3.4857, 3.5143, 3.6286, 3.6714, 3.6286, - 3.7143, 3.6429, 3.7000, 3.7429, 4.7714, - 4.4572, 4.1715, 4.0571, 3.9571, 3.8428, - 3.7143, 3.6857, 3.6857, 3.6143, 3.7143, - 3.8286, 3.9000, 3.8714, 3.8714, 3.8286, - 3.9571, 3.9428, 5.0571, 4.5857, 4.3857, - 4.1715, 4.3286, 4.3143, 4.3000, 4.2857, - 4.2285, 4.2428, 4.2285, 4.2143, 4.2000, - 4.2000, 4.1857, 4.2571, 4.1572, 4.0286, - 3.9428, 3.8286, 3.7572, 3.7286, 3.6571, - 3.6714, 3.6857, 3.9571, 3.9286, 3.9286, - 4.0143, 3.9428, 4.0429, 4.1000, 4.9428, - 4.6571, 4.4572, 4.3286, 4.2428, 4.2571, - 4.2714, 4.2857, 4.2000, 4.2000, 4.2285, - 4.2285, 4.1857, 4.2143, 4.3000, 4.3286, - 4.1429 + 2.1823, 1.8547, 1.7347, 2.9086, 2.5732, 3.4956, 2.3550, 2.5095, 2.9802, + 3.0982, 2.5141, 2.3917, 2.9977, 2.9484, 3.2160, 2.4492, 2.2527, 3.1933, + 3.0214, 2.9531, 2.9103, 2.3667, 2.1328, 2.8784, 2.7660, 2.7776, 2.7063, + 2.6225, 2.1768, 2.0625, 2.6395, 2.6648, 2.6482, 2.5697, 2.4846, 2.4817, + 2.0646, 1.9891, 2.5086, 2.6908, 2.6233, 2.4770, 2.3885, 2.3511, 2.2996, + 1.9892, 1.9251, 2.4190, 2.5473, 2.4994, 2.4091, 2.3176, 2.2571, 2.1946, + 2.1374, 2.9898, 2.6397, 3.6031, 3.1219, 3.7620, 3.2485, 2.9357, 2.7093, + 2.5781, 2.4839, 3.7082, 2.5129, 2.7321, 3.1052, 3.2962, 3.1331, 3.2000, + 2.9586, 3.0822, 2.8582, 2.7120, 3.2570, 3.4839, 2.8766, 2.7427, 3.2776, + 3.2363, 3.5929, 3.2826, 3.0911, 2.9369, 2.9030, 2.7789, 3.3921, 3.3970, + 4.0106, 2.8884, 2.6605, 3.7513, 3.1613, 3.3605, 3.3325, 3.0991, 2.9297, + 2.8674, 2.7571, 3.8129, 3.3266, 3.7105, 3.7917, 2.8304, 2.5538, 3.3932, + 3.1193, 3.1866, 3.1245, 3.0465, 2.8727, 2.7664, 2.6926, 3.4608, 3.2984, + 3.5142, 3.5418, 3.5017, 2.6190, 2.4797, 3.1331, 3.0540, 3.0651, 2.9879, + 2.9054, 2.8805, 2.7330, 2.6331, 3.2096, 3.5668, 3.3684, 3.3686, 3.3180, + 3.3107, 2.4757, 2.4019, 2.9789, 3.1468, 2.9768, 2.8848, 2.7952, 2.7457, + 2.6881, 2.5728, 3.0574, 3.3264, 3.3562, 3.2529, 3.1916, 3.1523, 3.1046, + 2.3725, 2.3289, 2.8760, 2.9804, 2.9093, 2.8040, 2.7071, 2.6386, 2.5720, + 2.5139, 2.9517, 3.1606, 3.2085, 3.1692, 3.0982, 3.0352, 2.9730, 2.9148, + 3.2147, 2.8315, 3.8724, 3.4621, 3.8823, 3.3760, 3.0746, 2.8817, 2.7552, + 2.6605, 3.9740, 3.6192, 3.6569, 3.9586, 3.6188, 3.3917, 3.2479, 3.1434, + 4.2411, 2.7597, 3.0588, 3.3474, 3.6214, 3.4353, 3.4729, 3.2487, 3.3200, + 3.0914, 2.9403, 3.4972, 3.7993, 3.6773, 3.8678, 3.5808, 3.8243, 3.5826, + 3.4156, 3.8765, 4.1035, 2.7361, 2.9765, 3.2475, 3.5004, 3.4185, 3.4378, + 3.2084, 3.2787, 3.0604, 2.9187, 3.4037, 3.6759, 3.6586, 3.8327, 3.5372, + 3.7665, 3.5310, 3.3700, 3.7788, 3.9804, 3.8903, 2.6832, 2.9060, 3.2613, + 3.4359, 3.3538, 3.3860, 3.1550, 3.2300, 3.0133, 2.8736, 3.4024, 3.6142, + 3.5979, 3.5295, 3.4834, 3.7140, 3.4782, 3.3170, 3.7434, 3.9623, 3.8181, + 3.7642, 2.6379, 2.8494, 3.1840, 3.4225, 3.2771, 3.3401, 3.1072, 3.1885, + 2.9714, 2.8319, 3.3315, 3.5979, 3.5256, 3.4980, 3.4376, 3.6714, 3.4346, + 3.2723, 3.6859, 3.8985, 3.7918, 3.7372, 3.7211, 2.9230, 2.6223, 3.4161, + 2.8999, 3.0557, 3.3308, 3.0555, 2.8508, 2.7385, 2.6640, 3.5263, 3.0277, + 3.2990, 3.7721, 3.5017, 3.2751, 3.1368, 3.0435, 3.7873, 3.2858, 3.2140, + 3.1727, 3.2178, 3.4414, 2.5490, 2.7623, 3.0991, 3.3252, 3.1836, 3.2428, + 3.0259, 3.1225, 2.9032, 2.7621, 3.2490, 3.5110, 3.4429, 3.3845, 3.3574, + 3.6045, 3.3658, 3.2013, 3.6110, 3.8241, 3.7090, 3.6496, 3.6333, 3.0896, + 3.5462, 2.4926, 2.7136, 3.0693, 3.2699, 3.1272, 3.1893, 2.9658, 3.0972, + 2.8778, 2.7358, 3.2206, 3.4566, 3.3896, 3.3257, 3.2946, 3.5693, 3.3312, + 3.1670, 3.5805, 3.7711, 3.6536, 3.5927, 3.5775, 3.0411, 3.4885, 3.4421, + 2.4667, 2.6709, 3.0575, 3.2357, 3.0908, 3.1537, 2.9235, 3.0669, 2.8476, + 2.7054, 3.2064, 3.4519, 3.3593, 3.2921, 3.2577, 3.2161, 3.2982, 3.1339, + 3.5606, 3.7582, 3.6432, 3.5833, 3.5691, 3.0161, 3.4812, 3.4339, 3.4327, + 2.4515, 2.6338, 3.0511, 3.2229, 3.0630, 3.1265, 2.8909, 3.0253, 2.8184, + 2.6764, 3.1968, 3.4114, 3.3492, 3.2691, 3.2320, 3.1786, 3.2680, 3.1036, + 3.5453, 3.7259, 3.6090, 3.5473, 3.5327, 3.0018, 3.4413, 3.3907, 3.3593, + 3.3462, 2.4413, 2.6006, 3.0540, 3.1987, 3.0490, 3.1058, 2.8643, 2.9948, + 2.7908, 2.6491, 3.1950, 3.3922, 3.3316, 3.2585, 3.2136, 3.1516, 3.2364, + 3.0752, 3.5368, 3.7117, 3.5941, 3.5313, 3.5164, 2.9962, 3.4225, 3.3699, + 3.3370, 3.3234, 3.3008, 2.4318, 2.5729, 3.0416, 3.1639, 3.0196, 3.0843, + 2.8413, 2.7436, 2.7608, 2.6271, 3.1811, 3.3591, 3.3045, 3.2349, 3.1942, + 3.1291, 3.2111, 3.0534, 3.5189, 3.6809, 3.5635, 3.5001, 3.4854, 2.9857, + 3.3897, 3.3363, 3.3027, 3.2890, 3.2655, 3.2309, 2.8502, 2.6934, 3.2467, + 3.1921, 3.5663, 3.2541, 3.0571, 2.9048, 2.8657, 2.7438, 3.3547, 3.3510, + 3.9837, 3.6871, 3.4862, 3.3389, 3.2413, 3.1708, 3.6096, 3.6280, 3.6860, + 3.5568, 3.4836, 3.2868, 3.3994, 3.3476, 3.3170, 3.2950, 3.2874, 3.2606, + 3.9579, 2.9226, 2.6838, 3.7867, 3.1732, 3.3872, 3.3643, 3.1267, 2.9541, + 2.8505, 2.7781, 3.8475, 3.3336, 3.7359, 3.8266, 3.5733, 3.3959, 3.2775, + 3.1915, 3.9878, 3.8816, 3.5810, 3.5364, 3.5060, 3.8097, 3.3925, 3.3348, + 3.3019, 3.2796, 3.2662, 3.2464, 3.7136, 3.8619, 2.9140, 2.6271, 3.4771, + 3.1774, 3.2560, 3.1970, 3.1207, 2.9406, 2.8322, 2.7571, 3.5455, 3.3514, + 3.5837, 3.6177, 3.5816, 3.3902, 3.2604, 3.1652, 3.7037, 3.6283, 3.5858, + 3.5330, 3.4884, 3.5789, 3.4094, 3.3473, 3.3118, 3.2876, 3.2707, 3.2521, + 3.5570, 3.6496, 3.6625, 2.7300, 2.5870, 3.2471, 3.1487, 3.1667, 3.0914, + 3.0107, 2.9812, 2.8300, 2.7284, 3.3259, 3.3182, 3.4707, 3.4748, 3.4279, + 3.4182, 3.2547, 3.1353, 3.5116, 3.9432, 3.8828, 3.8303, 3.7880, 3.3760, + 3.7218, 3.3408, 3.3059, 3.2698, 3.2446, 3.2229, 3.4422, 3.5023, 3.5009, + 3.5268, 2.6026, 2.5355, 3.1129, 3.2863, 3.1029, 3.0108, 2.9227, 2.8694, + 2.8109, 2.6929, 3.1958, 3.4670, 3.4018, 3.3805, 3.3218, 3.2815, 3.2346, + 3.0994, 3.3937, 3.7266, 3.6697, 3.6164, 3.5730, 3.2522, 3.5051, 3.4686, + 3.4355, 3.4084, 3.3748, 3.3496, 3.3692, 3.4052, 3.3910, 3.3849, 3.3662, + 2.5087, 2.4814, 3.0239, 3.1312, 3.0535, 2.9457, 2.8496, 2.7780, 2.7828, + 2.6532, 3.1063, 3.3143, 3.3549, 3.3120, 3.2421, 3.1787, 3.1176, 3.0613, + 3.3082, 3.5755, 3.5222, 3.4678, 3.4231, 3.1684, 3.3528, 3.3162, 3.2827, + 3.2527, 3.2308, 3.2029, 3.3173, 3.3343, 3.3092, 3.2795, 3.2452, 3.2096, + 3.2893, 2.8991, 4.0388, 3.6100, 3.9388, 3.4475, 3.1590, 2.9812, 2.8586, + 2.7683, 4.1428, 3.7911, 3.8225, 4.0372, 3.7059, 3.4935, 3.3529, 3.2492, + 4.4352, 4.0826, 3.9733, 3.9254, 3.8646, 3.9315, 3.7837, 3.7465, 3.7211, + 3.7012, 3.6893, 3.6676, 3.7736, 4.0660, 3.7926, 3.6158, 3.5017, 3.4166, + 4.6176, 2.8786, 3.1658, 3.5823, 3.7689, 3.5762, 3.5789, 3.3552, 3.4004, + 3.1722, 3.0212, 3.7241, 3.9604, 3.8500, 3.9844, 3.7035, 3.9161, 3.6751, + 3.5075, 4.1151, 4.2877, 4.1579, 4.1247, 4.0617, 3.4874, 3.9848, 3.9280, + 3.9079, 3.8751, 3.8604, 3.8277, 3.8002, 3.9981, 3.7544, 4.0371, 3.8225, + 3.6718, 4.3092, 4.4764, 2.8997, 3.0953, 3.4524, 3.6107, 3.6062, 3.5783, + 3.3463, 3.3855, 3.1746, 3.0381, 3.6019, 3.7938, 3.8697, 3.9781, 3.6877, + 3.8736, 3.6451, 3.4890, 3.9858, 4.1179, 4.0430, 3.9563, 3.9182, 3.4002, + 3.8310, 3.7716, 3.7543, 3.7203, 3.7053, 3.6742, 3.8318, 3.7631, 3.7392, + 3.9892, 3.7832, 3.6406, 4.1701, 4.3016, 4.2196, 2.8535, 3.0167, 3.3978, + 3.5363, 3.5393, 3.5301, 3.2960, 3.3352, 3.1287, 2.9967, 3.6659, 3.7239, + 3.8070, 3.7165, 3.6368, 3.8162, 3.5885, 3.4336, 3.9829, 4.0529, 3.9584, + 3.9025, 3.8607, 3.3673, 3.7658, 3.7035, 3.6866, 3.6504, 3.6339, 3.6024, + 3.7708, 3.7283, 3.6896, 3.9315, 3.7250, 3.5819, 4.1457, 4.2280, 4.1130, + 4.0597, 3.0905, 2.7998, 3.6448, 3.0739, 3.2996, 3.5262, 3.2559, 3.0518, + 2.9394, 2.8658, 3.7514, 3.2295, 3.5643, 3.7808, 3.6931, 3.4723, 3.3357, + 3.2429, 4.0280, 3.5589, 3.4636, 3.4994, 3.4309, 3.6177, 3.2946, 3.2376, + 3.2050, 3.1847, 3.1715, 3.1599, 3.5555, 3.8111, 3.7693, 3.5718, 3.4498, + 3.3662, 4.1608, 3.7417, 3.6536, 3.6154, 3.8596, 3.0301, 2.7312, 3.5821, + 3.0473, 3.2137, 3.4679, 3.1975, 2.9969, 2.8847, 2.8110, 3.6931, 3.2076, + 3.4943, 3.5956, 3.6379, 3.4190, 3.2808, 3.1860, 3.9850, 3.5105, 3.4330, + 3.3797, 3.4155, 3.6033, 3.2737, 3.2145, 3.1807, 3.1596, 3.1461, 3.1337, + 3.4812, 3.6251, 3.7152, 3.5201, 3.3966, 3.3107, 4.1128, 3.6899, 3.6082, + 3.5604, 3.7834, 3.7543, 2.9189, 2.6777, 3.4925, 2.9648, 3.1216, 3.2940, + 3.0975, 2.9757, 2.8493, 2.7638, 3.6085, 3.1214, 3.4006, 3.4793, 3.5147, + 3.3806, 3.2356, 3.1335, 3.9144, 3.4183, 3.3369, 3.2803, 3.2679, 3.4871, + 3.1714, 3.1521, 3.1101, 3.0843, 3.0670, 3.0539, 3.3890, 3.5086, 3.5895, + 3.4783, 3.3484, 3.2559, 4.0422, 3.5967, 3.5113, 3.4576, 3.6594, 3.6313, + 3.5690, 2.8578, 2.6334, 3.4673, 2.9245, 3.0732, 3.2435, 3.0338, 2.9462, + 2.8143, 2.7240, 3.5832, 3.0789, 3.3617, 3.4246, 3.4505, 3.3443, 3.1964, + 3.0913, 3.8921, 3.3713, 3.2873, 3.2281, 3.2165, 3.4386, 3.1164, 3.1220, + 3.0761, 3.0480, 3.0295, 3.0155, 3.3495, 3.4543, 3.5260, 3.4413, 3.3085, + 3.2134, 4.0170, 3.5464, 3.4587, 3.4006, 3.6027, 3.5730, 3.4945, 3.4623, + 2.8240, 2.5960, 3.4635, 2.9032, 3.0431, 3.2115, 2.9892, 2.9148, 2.7801, + 2.6873, 3.5776, 3.0568, 3.3433, 3.3949, 3.4132, 3.3116, 3.1616, 3.0548, + 3.8859, 3.3719, 3.2917, 3.2345, 3.2274, 3.4171, 3.1293, 3.0567, 3.0565, + 3.0274, 3.0087, 2.9939, 3.3293, 3.4249, 3.4902, 3.4091, 3.2744, 3.1776, + 4.0078, 3.5374, 3.4537, 3.3956, 3.5747, 3.5430, 3.4522, 3.4160, 3.3975, + 2.8004, 2.5621, 3.4617, 2.9154, 3.0203, 3.1875, 2.9548, 2.8038, 2.7472, + 2.6530, 3.5736, 3.0584, 3.3304, 3.3748, 3.3871, 3.2028, 3.1296, 3.0214, + 3.8796, 3.3337, 3.2492, 3.1883, 3.1802, 3.4050, 3.0756, 3.0478, 3.0322, + 3.0323, 3.0163, 3.0019, 3.3145, 3.4050, 3.4656, 3.3021, 3.2433, 3.1453, + 3.9991, 3.5017, 3.4141, 3.3520, 3.5583, 3.5251, 3.4243, 3.3851, 3.3662, + 3.3525, 2.7846, 2.5324, 3.4652, 2.8759, 3.0051, 3.1692, 2.9273, 2.7615, + 2.7164, 2.6212, 3.5744, 3.0275, 3.3249, 3.3627, 3.3686, 3.1669, 3.0584, + 2.9915, 3.8773, 3.3099, 3.2231, 3.1600, 3.1520, 3.4023, 3.0426, 3.0099, + 2.9920, 2.9809, 2.9800, 2.9646, 3.3068, 3.3930, 3.4486, 3.2682, 3.1729, + 3.1168, 3.9952, 3.4796, 3.3901, 3.3255, 3.5530, 3.5183, 3.4097, 3.3683, + 3.3492, 3.3360, 3.3308, 2.5424, 2.6601, 3.2555, 3.2807, 3.1384, 3.1737, + 2.9397, 2.8429, 2.8492, 2.7225, 3.3875, 3.4910, 3.4520, 3.3608, 3.3036, + 3.2345, 3.2999, 3.1487, 3.7409, 3.8392, 3.7148, 3.6439, 3.6182, 3.1753, + 3.5210, 3.4639, 3.4265, 3.4075, 3.3828, 3.3474, 3.4071, 3.3754, 3.3646, + 3.3308, 3.4393, 3.2993, 3.8768, 3.9891, 3.8310, 3.7483, 3.3417, 3.3019, + 3.2250, 3.1832, 3.1578, 3.1564, 3.1224, 3.4620, 2.9743, 2.8058, 3.4830, + 3.3474, 3.6863, 3.3617, 3.1608, 3.0069, 2.9640, 2.8427, 3.5885, 3.5219, + 4.1314, 3.8120, 3.6015, 3.4502, 3.3498, 3.2777, 3.8635, 3.8232, 3.8486, + 3.7215, 3.6487, 3.4724, 3.5627, 3.5087, 3.4757, 3.4517, 3.4423, 3.4139, + 4.1028, 3.8388, 3.6745, 3.5562, 3.4806, 3.4272, 4.0182, 3.9991, 4.0007, + 3.9282, 3.7238, 3.6498, 3.5605, 3.5211, 3.5009, 3.4859, 3.4785, 3.5621, + 4.2623, 3.0775, 2.8275, 4.0181, 3.3385, 3.5379, 3.5036, 3.2589, 3.0804, + 3.0094, 2.9003, 4.0869, 3.5088, 3.9105, 3.9833, 3.7176, 3.5323, 3.4102, + 3.3227, 4.2702, 4.0888, 3.7560, 3.7687, 3.6681, 3.6405, 3.5569, 3.4990, + 3.4659, 3.4433, 3.4330, 3.4092, 3.8867, 4.0190, 3.7961, 3.6412, 3.5405, + 3.4681, 4.3538, 4.2136, 3.9381, 3.8912, 3.9681, 3.7909, 3.6774, 3.6262, + 3.5999, 3.5823, 3.5727, 3.5419, 4.0245, 4.1874, 3.0893, 2.7917, 3.7262, + 3.3518, 3.4241, 3.5433, 3.2773, 3.0890, 2.9775, 2.9010, 3.8048, 3.5362, + 3.7746, 3.7911, 3.7511, 3.5495, 3.4149, 3.3177, 4.0129, 3.8370, 3.7739, + 3.7125, 3.7152, 3.7701, 3.5813, 3.5187, 3.4835, 3.4595, 3.4439, 3.4242, + 3.7476, 3.8239, 3.8346, 3.6627, 3.5479, 3.4639, 4.1026, 3.9733, 3.9292, + 3.8667, 3.9513, 3.8959, 3.7698, 3.7089, 3.6765, 3.6548, 3.6409, 3.5398, + 3.8759, 3.9804, 4.0150, 2.9091, 2.7638, 3.5066, 3.3377, 3.3481, 3.2633, + 3.1810, 3.1428, 2.9872, 2.8837, 3.5929, 3.5183, 3.6729, 3.6596, 3.6082, + 3.5927, 3.4224, 3.2997, 3.8190, 4.1865, 4.1114, 4.0540, 3.6325, 3.5697, + 3.5561, 3.5259, 3.4901, 3.4552, 3.4315, 3.4091, 3.6438, 3.6879, 3.6832, + 3.7043, 3.5557, 3.4466, 3.9203, 4.2919, 4.2196, 4.1542, 3.7573, 3.7039, + 3.6546, 3.6151, 3.5293, 3.4849, 3.4552, 3.5192, 3.7673, 3.8359, 3.8525, + 3.8901, 2.7806, 2.7209, 3.3812, 3.4958, 3.2913, 3.1888, 3.0990, 3.0394, + 2.9789, 2.8582, 3.4716, 3.6883, 3.6105, 3.5704, 3.5059, 3.4619, 3.4138, + 3.2742, 3.7080, 3.9773, 3.9010, 3.8409, 3.7944, 3.4465, 3.7235, 3.6808, + 3.6453, 3.6168, 3.5844, 3.5576, 3.5772, 3.5959, 3.5768, 3.5678, 3.5486, + 3.4228, 3.8107, 4.0866, 4.0169, 3.9476, 3.6358, 3.5800, 3.5260, 3.4838, + 3.4501, 3.4204, 3.3553, 3.6487, 3.6973, 3.7398, 3.7405, 3.7459, 3.7380, + 2.6848, 2.6740, 3.2925, 3.3386, 3.2473, 3.1284, 3.0301, 2.9531, 2.9602, + 2.8272, 3.3830, 3.5358, 3.5672, 3.5049, 3.4284, 3.3621, 3.3001, 3.2451, + 3.6209, 3.8299, 3.7543, 3.6920, 3.6436, 3.3598, 3.5701, 3.5266, 3.4904, + 3.4590, 3.4364, 3.4077, 3.5287, 3.5280, 3.4969, 3.4650, 3.4304, 3.3963, + 3.7229, 3.9402, 3.8753, 3.8035, 3.5499, 3.4913, 3.4319, 3.3873, 3.3520, + 3.3209, 3.2948, 3.5052, 3.6465, 3.6696, 3.6577, 3.6388, 3.6142, 3.5889, + 3.3968, 3.0122, 4.2241, 3.7887, 4.0049, 3.5384, 3.2698, 3.1083, 2.9917, + 2.9057, 4.3340, 3.9900, 4.6588, 4.1278, 3.8125, 3.6189, 3.4851, 3.3859, + 4.6531, 4.3134, 4.2258, 4.1309, 4.0692, 4.0944, 3.9850, 3.9416, 3.9112, + 3.8873, 3.8736, 3.8473, 4.6027, 4.1538, 3.8994, 3.7419, 3.6356, 3.5548, + 4.8353, 4.5413, 4.3891, 4.3416, 4.3243, 4.2753, 4.2053, 4.1790, 4.1685, + 4.1585, 4.1536, 4.0579, 4.1980, 4.4564, 4.2192, 4.0528, 3.9489, 3.8642, + 5.0567, 3.0630, 3.3271, 4.0432, 4.0046, 4.1555, 3.7426, 3.5130, 3.5174, + 3.2884, 3.1378, 4.1894, 4.2321, 4.1725, 4.1833, 3.8929, 4.0544, 3.8118, + 3.6414, 4.6373, 4.6268, 4.4750, 4.4134, 4.3458, 3.8582, 4.2583, 4.1898, + 4.1562, 4.1191, 4.1069, 4.0639, 4.1257, 4.1974, 3.9532, 4.1794, 3.9660, + 3.8130, 4.8160, 4.8272, 4.6294, 4.5840, 4.0770, 4.0088, 3.9103, 3.8536, + 3.8324, 3.7995, 3.7826, 4.2294, 4.3380, 4.4352, 4.1933, 4.4580, 4.2554, + 4.1072, 5.0454, 5.1814, 3.0632, 3.2662, 3.6432, 3.8088, 3.7910, 3.7381, + 3.5093, 3.5155, 3.3047, 3.1681, 3.7871, 3.9924, 4.0637, 4.1382, 3.8591, + 4.0164, 3.7878, 3.6316, 4.1741, 4.3166, 4.2395, 4.1831, 4.1107, 3.5857, + 4.0270, 3.9676, 3.9463, 3.9150, 3.9021, 3.8708, 4.0240, 4.1551, 3.9108, + 4.1337, 3.9289, 3.7873, 4.3666, 4.5080, 4.4232, 4.3155, 3.8461, 3.8007, + 3.6991, 3.6447, 3.6308, 3.5959, 3.5749, 4.0359, 4.3124, 4.3539, 4.1122, + 4.3772, 4.1785, 4.0386, 4.7004, 4.8604, 4.6261, 2.9455, 3.2470, 3.6108, + 3.8522, 3.6625, 3.6598, 3.4411, 3.4660, 3.2415, 3.0944, 3.7514, 4.0397, + 3.9231, 4.0561, 3.7860, 3.9845, 3.7454, 3.5802, 4.1366, 4.3581, 4.2351, + 4.2011, 4.1402, 3.5381, 4.0653, 4.0093, 3.9883, 3.9570, 3.9429, 3.9112, + 3.8728, 4.0682, 3.8351, 4.1054, 3.8928, 3.7445, 4.3415, 4.5497, 4.3833, + 4.3122, 3.8051, 3.7583, 3.6622, 3.6108, 3.5971, 3.5628, 3.5408, 4.0780, + 4.0727, 4.2836, 4.0553, 4.3647, 4.1622, 4.0178, 4.5802, 4.9125, 4.5861, + 4.6201, 2.9244, 3.2241, 3.5848, 3.8293, 3.6395, 3.6400, 3.4204, 3.4499, + 3.2253, 3.0779, 3.7257, 4.0170, 3.9003, 4.0372, 3.7653, 3.9672, 3.7283, + 3.5630, 4.1092, 4.3347, 4.2117, 4.1793, 4.1179, 3.5139, 4.0426, 3.9867, + 3.9661, 3.9345, 3.9200, 3.8883, 3.8498, 4.0496, 3.8145, 4.0881, 3.8756, + 3.7271, 4.3128, 4.5242, 4.3578, 4.2870, 3.7796, 3.7318, 3.6364, 3.5854, + 3.5726, 3.5378, 3.5155, 4.0527, 4.0478, 4.2630, 4.0322, 4.3449, 4.1421, + 3.9975, 4.5499, 4.8825, 4.5601, 4.5950, 4.5702, 2.9046, 3.2044, 3.5621, + 3.8078, 3.6185, 3.6220, 3.4019, 3.4359, 3.2110, 3.0635, 3.7037, 3.9958, + 3.8792, 4.0194, 3.7460, 3.9517, 3.7128, 3.5474, 4.0872, 4.3138, 4.1906, + 4.1593, 4.0973, 3.4919, 4.0216, 3.9657, 3.9454, 3.9134, 3.8986, 3.8669, + 3.8289, 4.0323, 3.7954, 4.0725, 3.8598, 3.7113, 4.2896, 4.5021, 4.3325, + 4.2645, 3.7571, 3.7083, 3.6136, 3.5628, 3.5507, 3.5155, 3.4929, 4.0297, + 4.0234, 4.2442, 4.0112, 4.3274, 4.1240, 3.9793, 4.5257, 4.8568, 4.5353, + 4.5733, 4.5485, 4.5271, 2.8878, 3.1890, 3.5412, 3.7908, 3.5974, 3.6078, + 3.3871, 3.4243, 3.1992, 3.0513, 3.6831, 3.9784, 3.8579, 4.0049, 3.7304, + 3.9392, 3.7002, 3.5347, 4.0657, 4.2955, 4.1705, 4.1424, 4.0800, 3.4717, + 4.0043, 3.9485, 3.9286, 3.8965, 3.8815, 3.8500, 3.8073, 4.0180, 3.7796, + 4.0598, 3.8470, 3.6983, 4.2678, 4.4830, 4.3132, 4.2444, 3.7370, 3.6876, + 3.5935, 3.5428, 3.5314, 3.4958, 3.4730, 4.0117, 4.0043, 4.2287, 3.9939, + 4.3134, 4.1096, 3.9646, 4.5032, 4.8356, 4.5156, 4.5544, 4.5297, 4.5083, + 4.4896, 2.8709, 3.1737, 3.5199, 3.7734, 3.5802, 3.5934, 3.3724, 3.4128, + 3.1877, 3.0396, 3.6624, 3.9608, 3.8397, 3.9893, 3.7145, 3.9266, 3.6877, + 3.5222, 4.0448, 4.2771, 4.1523, 4.1247, 4.0626, 3.4530, 3.9866, 3.9310, + 3.9115, 3.8792, 3.8641, 3.8326, 3.7892, 4.0025, 3.7636, 4.0471, 3.8343, + 3.6854, 4.2464, 4.4635, 4.2939, 4.2252, 3.7169, 3.6675, 3.5739, 3.5235, + 3.5126, 3.4768, 3.4537, 3.9932, 3.9854, 4.2123, 3.9765, 4.2992, 4.0951, + 3.9500, 4.4811, 4.8135, 4.4959, 4.5351, 4.5105, 4.4891, 4.4705, 4.4515, + 2.8568, 3.1608, 3.5050, 3.7598, 3.5665, 3.5803, 3.3601, 3.4031, 3.1779, + 3.0296, 3.6479, 3.9471, 3.8262, 3.9773, 3.7015, 3.9162, 3.6771, 3.5115, + 4.0306, 4.2634, 4.1385, 4.1116, 4.0489, 3.4366, 3.9732, 3.9176, 3.8983, + 3.8659, 3.8507, 3.8191, 3.7757, 3.9907, 3.7506, 4.0365, 3.8235, 3.6745, + 4.2314, 4.4490, 4.2792, 4.2105, 3.7003, 3.6510, 3.5578, 3.5075, 3.4971, + 3.4609, 3.4377, 3.9788, 3.9712, 4.1997, 3.9624, 4.2877, 4.0831, 3.9378, + 4.4655, 4.7974, 4.4813, 4.5209, 4.4964, 4.4750, 4.4565, 4.4375, 4.4234, + 2.6798, 3.0151, 3.2586, 3.5292, 3.5391, 3.4902, 3.2887, 3.3322, 3.1228, + 2.9888, 3.4012, 3.7145, 3.7830, 3.6665, 3.5898, 3.8077, 3.5810, 3.4265, + 3.7726, 4.0307, 3.9763, 3.8890, 3.8489, 3.2706, 3.7595, 3.6984, 3.6772, + 3.6428, 3.6243, 3.5951, 3.7497, 3.6775, 3.6364, 3.9203, 3.7157, 3.5746, + 3.9494, 4.2076, 4.1563, 4.0508, 3.5329, 3.4780, 3.3731, 3.3126, 3.2846, + 3.2426, 3.2135, 3.7491, 3.9006, 3.8332, 3.8029, 4.1436, 3.9407, 3.7998, + 4.1663, 4.5309, 4.3481, 4.2911, 4.2671, 4.2415, 4.2230, 4.2047, 4.1908, + 4.1243, 2.5189, 2.9703, 3.3063, 3.6235, 3.4517, 3.3989, 3.2107, 3.2434, + 3.0094, 2.8580, 3.4253, 3.8157, 3.7258, 3.6132, 3.5297, 3.7566, 3.5095, + 3.3368, 3.7890, 4.1298, 4.0190, 3.9573, 3.9237, 3.2677, 3.8480, 3.8157, + 3.7656, 3.7317, 3.7126, 3.6814, 3.6793, 3.6218, 3.5788, 3.8763, 3.6572, + 3.5022, 3.9737, 4.3255, 4.1828, 4.1158, 3.5078, 3.4595, 3.3600, 3.3088, + 3.2575, 3.2164, 3.1856, 3.8522, 3.8665, 3.8075, 3.7772, 4.1391, 3.9296, + 3.7772, 4.2134, 4.7308, 4.3787, 4.3894, 4.3649, 4.3441, 4.3257, 4.3073, + 4.2941, 4.1252, 4.2427, 3.0481, 2.9584, 3.6919, 3.5990, 3.8881, 3.4209, + 3.1606, 3.1938, 2.9975, 2.8646, 3.8138, 3.7935, 3.7081, 3.9155, 3.5910, + 3.4808, 3.4886, 3.3397, 4.1336, 4.1122, 3.9888, 3.9543, 3.8917, 3.5894, + 3.8131, 3.7635, 3.7419, 3.7071, 3.6880, 3.6574, 3.6546, 3.9375, 3.6579, + 3.5870, 3.6361, 3.5039, 4.3149, 4.2978, 4.1321, 4.1298, 3.8164, 3.7680, + 3.7154, 3.6858, 3.6709, 3.6666, 3.6517, 3.8174, 3.8608, 4.1805, 3.9102, + 3.8394, 3.8968, 3.7673, 4.5274, 4.6682, 4.3344, 4.3639, 4.3384, 4.3162, + 4.2972, 4.2779, 4.2636, 4.0253, 4.1168, 4.1541, 2.8136, 3.0951, 3.4635, + 3.6875, 3.4987, 3.5183, 3.2937, 3.3580, 3.1325, 2.9832, 3.6078, 3.8757, + 3.7616, 3.9222, 3.6370, 3.8647, 3.6256, 3.4595, 3.9874, 4.1938, 4.0679, + 4.0430, 3.9781, 3.3886, 3.9008, 3.8463, 3.8288, 3.7950, 3.7790, 3.7472, + 3.7117, 3.9371, 3.6873, 3.9846, 3.7709, 3.6210, 4.1812, 4.3750, 4.2044, + 4.1340, 3.6459, 3.5929, 3.5036, 3.4577, 3.4528, 3.4146, 3.3904, 3.9014, + 3.9031, 4.1443, 3.8961, 4.2295, 4.0227, 3.8763, 4.4086, 4.7097, 4.4064, + 4.4488, 4.4243, 4.4029, 4.3842, 4.3655, 4.3514, 4.1162, 4.2205, 4.1953, + 4.2794, 2.8032, 3.0805, 3.4519, 3.6700, 3.4827, 3.5050, 3.2799, 3.3482, + 3.1233, 2.9747, 3.5971, 3.8586, 3.7461, 3.9100, 3.6228, 3.8535, 3.6147, + 3.4490, 3.9764, 4.1773, 4.0511, 4.0270, 3.9614, 3.3754, 3.8836, 3.8291, + 3.8121, 3.7780, 3.7619, 3.7300, 3.6965, 3.9253, 3.6734, 3.9733, 3.7597, + 3.6099, 4.1683, 4.3572, 4.1862, 4.1153, 3.6312, 3.5772, 3.4881, 3.4429, + 3.4395, 3.4009, 3.3766, 3.8827, 3.8868, 4.1316, 3.8807, 4.2164, 4.0092, + 3.8627, 4.3936, 4.6871, 4.3882, 4.4316, 4.4073, 4.3858, 4.3672, 4.3485, + 4.3344, 4.0984, 4.2036, 4.1791, 4.2622, 4.2450, 2.7967, 3.0689, 3.4445, + 3.6581, 3.4717, 3.4951, 3.2694, 3.3397, 3.1147, 2.9661, 3.5898, 3.8468, + 3.7358, 3.9014, 3.6129, 3.8443, 3.6054, 3.4396, 3.9683, 4.1656, 4.0394, + 4.0158, 3.9498, 3.3677, 3.8718, 3.8164, 3.8005, 3.7662, 3.7500, 3.7181, + 3.6863, 3.9170, 3.6637, 3.9641, 3.7503, 3.6004, 4.1590, 4.3448, 4.1739, + 4.1029, 3.6224, 3.5677, 3.4785, 3.4314, 3.4313, 3.3923, 3.3680, 3.8698, + 3.8758, 4.1229, 3.8704, 4.2063, 3.9987, 3.8519, 4.3832, 4.6728, 4.3759, + 4.4195, 4.3952, 4.3737, 4.3551, 4.3364, 4.3223, 4.0861, 4.1911, 4.1676, + 4.2501, 4.2329, 4.2208, 2.7897, 3.0636, 3.4344, 3.6480, 3.4626, 3.4892, + 3.2626, 3.3344, 3.1088, 2.9597, 3.5804, 3.8359, 3.7251, 3.8940, 3.6047, + 3.8375, 3.5990, 3.4329, 3.9597, 4.1542, 4.0278, 4.0048, 3.9390, 3.3571, + 3.8608, 3.8056, 3.7899, 3.7560, 3.7400, 3.7081, 3.6758, 3.9095, 3.6552, + 3.9572, 3.7436, 3.5933, 4.1508, 4.3337, 4.1624, 4.0916, 3.6126, 3.5582, + 3.4684, 3.4212, 3.4207, 3.3829, 3.3586, 3.8604, 3.8658, 4.1156, 3.8620, + 4.1994, 3.9917, 3.8446, 4.3750, 4.6617, 4.3644, 4.4083, 4.3840, 4.3625, + 4.3439, 4.3253, 4.3112, 4.0745, 4.1807, 4.1578, 4.2390, 4.2218, 4.2097, + 4.1986, 2.8395, 3.0081, 3.3171, 3.4878, 3.5360, 3.5145, 3.2809, 3.3307, + 3.1260, 2.9940, 3.4741, 3.6675, 3.7832, 3.6787, 3.6156, 3.8041, 3.5813, + 3.4301, 3.8480, 3.9849, 3.9314, 3.8405, 3.8029, 3.2962, 3.7104, 3.6515, + 3.6378, 3.6020, 3.5849, 3.5550, 3.7494, 3.6893, 3.6666, 3.9170, 3.7150, + 3.5760, 4.0268, 4.1596, 4.1107, 3.9995, 3.5574, 3.5103, 3.4163, 3.3655, + 3.3677, 3.3243, 3.2975, 3.7071, 3.9047, 3.8514, 3.8422, 3.8022, 3.9323, + 3.7932, 4.2343, 4.4583, 4.3115, 4.2457, 4.2213, 4.1945, 4.1756, 4.1569, + 4.1424, 4.0620, 4.0494, 3.9953, 4.0694, 4.0516, 4.0396, 4.0280, 4.0130, + 2.9007, 2.9674, 3.8174, 3.5856, 3.6486, 3.5339, 3.2832, 3.3154, 3.1144, + 2.9866, 3.9618, 3.8430, 3.9980, 3.8134, 3.6652, 3.7985, 3.5756, 3.4207, + 4.4061, 4.2817, 4.1477, 4.0616, 3.9979, 3.6492, 3.8833, 3.8027, 3.7660, + 3.7183, 3.6954, 3.6525, 3.9669, 3.8371, 3.7325, 3.9160, 3.7156, 3.5714, + 4.6036, 4.4620, 4.3092, 4.2122, 3.8478, 3.7572, 3.6597, 3.5969, 3.5575, + 3.5386, 3.5153, 3.7818, 4.1335, 4.0153, 3.9177, 3.8603, 3.9365, 3.7906, + 4.7936, 4.7410, 4.5461, 4.5662, 4.5340, 4.5059, 4.4832, 4.4604, 4.4429, + 4.2346, 4.4204, 4.3119, 4.3450, 4.3193, 4.3035, 4.2933, 4.1582, 4.2450, + 2.8559, 2.9050, 3.8325, 3.5442, 3.5077, 3.4905, 3.2396, 3.2720, 3.0726, + 2.9467, 3.9644, 3.8050, 3.8981, 3.7762, 3.6216, 3.7531, 3.5297, 3.3742, + 4.3814, 4.2818, 4.1026, 4.0294, 3.9640, 3.6208, 3.8464, 3.7648, 3.7281, + 3.6790, 3.6542, 3.6117, 3.8650, 3.8010, 3.6894, 3.8713, 3.6699, 3.5244, + 4.5151, 4.4517, 4.2538, 4.1483, 3.8641, 3.7244, 3.6243, 3.5589, 3.5172, + 3.4973, 3.4715, 3.7340, 4.0316, 3.9958, 3.8687, 3.8115, 3.8862, 3.7379, + 4.7091, 4.7156, 4.5199, 4.5542, 4.5230, 4.4959, 4.4750, 4.4529, 4.4361, + 4.1774, 4.3774, 4.2963, 4.3406, 4.3159, 4.3006, 4.2910, 4.1008, 4.1568, + 4.0980, 2.8110, 2.8520, 3.7480, 3.5105, 3.4346, 3.3461, 3.1971, 3.2326, + 3.0329, 2.9070, 3.8823, 3.7928, 3.8264, 3.7006, 3.5797, 3.7141, 3.4894, + 3.3326, 4.3048, 4.2217, 4.0786, 3.9900, 3.9357, 3.6331, 3.8333, 3.7317, + 3.6957, 3.6460, 3.6197, 3.5779, 3.7909, 3.7257, 3.6476, 3.5729, 3.6304, + 3.4834, 4.4368, 4.3921, 4.2207, 4.1133, 3.8067, 3.7421, 3.6140, 3.5491, + 3.5077, 3.4887, 3.4623, 3.6956, 3.9568, 3.8976, 3.8240, 3.7684, 3.8451, + 3.6949, 4.6318, 4.6559, 4.4533, 4.4956, 4.4641, 4.4366, 4.4155, 4.3936, + 4.3764, 4.1302, 4.3398, 4.2283, 4.2796, 4.2547, 4.2391, 4.2296, 4.0699, + 4.1083, 4.0319, 3.9855, 2.7676, 2.8078, 3.6725, 3.4804, 3.3775, 3.2411, + 3.1581, 3.1983, 2.9973, 2.8705, 3.8070, 3.7392, 3.7668, 3.6263, 3.5402, + 3.6807, 3.4545, 3.2962, 4.2283, 4.1698, 4.0240, 3.9341, 3.8711, 3.5489, + 3.7798, 3.7000, 3.6654, 3.6154, 3.5882, 3.5472, 3.7289, 3.6510, 3.6078, + 3.5355, 3.5963, 3.4480, 4.3587, 4.3390, 4.1635, 4.0536, 3.7193, 3.6529, + 3.5512, 3.4837, 3.4400, 3.4191, 3.3891, 3.6622, 3.8934, 3.8235, 3.7823, + 3.7292, 3.8106, 3.6589, 4.5535, 4.6013, 4.3961, 4.4423, 4.4109, 4.3835, + 4.3625, 4.3407, 4.3237, 4.0863, 4.2835, 4.1675, 4.2272, 4.2025, 4.1869, + 4.1774, 4.0126, 4.0460, 3.9815, 3.9340, 3.8955, 2.6912, 2.7604, 3.6037, + 3.4194, 3.3094, 3.1710, 3.0862, 3.1789, 2.9738, 2.8427, 3.7378, 3.6742, + 3.6928, 3.5512, 3.4614, 3.4087, 3.4201, 3.2607, 4.1527, 4.0977, 3.9523, + 3.8628, 3.8002, 3.4759, 3.7102, 3.6466, 3.6106, 3.5580, 3.5282, 3.4878, + 3.6547, 3.5763, 3.5289, 3.5086, 3.5593, 3.4099, 4.2788, 4.2624, 4.0873, + 3.9770, 3.6407, 3.5743, 3.5178, 3.4753, 3.3931, 3.3694, 3.3339, 3.6002, + 3.8164, 3.7478, 3.7028, 3.6952, 3.7669, 3.6137, 4.4698, 4.5488, 4.3168, + 4.3646, 4.3338, 4.3067, 4.2860, 4.2645, 4.2478, 4.0067, 4.2349, 4.0958, + 4.1543, 4.1302, 4.1141, 4.1048, 3.9410, 3.9595, 3.8941, 3.8465, 3.8089, + 3.7490, 2.7895, 2.5849, 3.6484, 3.0162, 3.1267, 3.2125, 3.0043, 2.9572, + 2.8197, 2.7261, 3.7701, 3.2446, 3.5239, 3.4696, 3.4261, 3.3508, 3.1968, + 3.0848, 4.1496, 3.6598, 3.5111, 3.4199, 3.3809, 3.5382, 3.2572, 3.2100, + 3.1917, 3.1519, 3.1198, 3.1005, 3.5071, 3.5086, 3.5073, 3.4509, 3.3120, + 3.2082, 4.2611, 3.8117, 3.6988, 3.5646, 3.6925, 3.6295, 3.5383, 3.4910, + 3.4625, 3.4233, 3.4007, 3.2329, 3.6723, 3.6845, 3.6876, 3.6197, 3.4799, + 3.3737, 4.4341, 4.0525, 3.9011, 3.8945, 3.8635, 3.8368, 3.8153, 3.7936, + 3.7758, 3.4944, 3.4873, 3.9040, 3.7110, 3.6922, 3.6799, 3.6724, 3.5622, + 3.6081, 3.5426, 3.4922, 3.4498, 3.3984, 3.4456, 2.7522, 2.5524, 3.5742, + 2.9508, 3.0751, 3.0158, 2.9644, 2.8338, 2.7891, 2.6933, 3.6926, 3.1814, + 3.4528, 3.4186, 3.3836, 3.2213, 3.1626, 3.0507, 4.0548, 3.5312, 3.4244, + 3.3409, 3.2810, 3.4782, 3.1905, 3.1494, 3.1221, 3.1128, 3.0853, 3.0384, + 3.4366, 3.4562, 3.4638, 3.3211, 3.2762, 3.1730, 4.1632, 3.6825, 3.5822, + 3.4870, 3.6325, 3.5740, 3.4733, 3.4247, 3.3969, 3.3764, 3.3525, 3.1984, + 3.5989, 3.6299, 3.6433, 3.4937, 3.4417, 3.3365, 4.3304, 3.9242, 3.7793, + 3.7623, 3.7327, 3.7071, 3.6860, 3.6650, 3.6476, 3.3849, 3.3534, 3.8216, + 3.5870, 3.5695, 3.5584, 3.5508, 3.4856, 3.5523, 3.4934, 3.4464, 3.4055, + 3.3551, 3.3888, 3.3525, 2.7202, 2.5183, 3.4947, 2.8731, 3.0198, 3.1457, + 2.9276, 2.7826, 2.7574, 2.6606, 3.6090, 3.0581, 3.3747, 3.3677, 3.3450, + 3.1651, 3.1259, 3.0147, 3.9498, 3.3857, 3.2917, 3.2154, 3.1604, 3.4174, + 3.0735, 3.0342, 3.0096, 3.0136, 2.9855, 2.9680, 3.3604, 3.4037, 3.4243, + 3.2633, 3.1810, 3.1351, 4.0557, 3.5368, 3.4526, 3.3699, 3.5707, 3.5184, + 3.4085, 3.3595, 3.3333, 3.3143, 3.3041, 3.1094, 3.5193, 3.5745, 3.6025, + 3.4338, 3.3448, 3.2952, 4.2158, 3.7802, 3.6431, 3.6129, 3.5853, 3.5610, + 3.5406, 3.5204, 3.5036, 3.2679, 3.2162, 3.7068, 3.4483, 3.4323, 3.4221, + 3.4138, 3.3652, 3.4576, 3.4053, 3.3618, 3.3224, 3.2711, 3.3326, 3.2950, + 3.2564, 2.5315, 2.6104, 3.2734, 3.2299, 3.1090, 2.9942, 2.9159, 2.8324, + 2.8350, 2.7216, 3.3994, 3.4475, 3.4354, 3.3438, 3.2807, 3.2169, 3.2677, + 3.1296, 3.7493, 3.8075, 3.6846, 3.6104, 3.5577, 3.2052, 3.4803, 3.4236, + 3.3845, 3.3640, 3.3365, 3.3010, 3.3938, 3.3624, 3.3440, 3.3132, 3.4035, + 3.2754, 3.8701, 3.9523, 3.8018, 3.7149, 3.3673, 3.3199, 3.2483, 3.2069, + 3.1793, 3.1558, 3.1395, 3.4097, 3.5410, 3.5228, 3.5116, 3.4921, 3.4781, + 3.4690, 4.0420, 4.1759, 4.0078, 4.0450, 4.0189, 3.9952, 3.9770, 3.9583, + 3.9434, 3.7217, 3.8228, 3.7826, 3.8640, 3.8446, 3.8314, 3.8225, 3.6817, + 3.7068, 3.6555, 3.6159, 3.5831, 3.5257, 3.2133, 3.1689, 3.1196, 3.3599, + 2.9852, 2.7881, 3.5284, 3.3493, 3.6958, 3.3642, 3.1568, 3.0055, 2.9558, + 2.8393, 3.6287, 3.5283, 4.1511, 3.8259, 3.6066, 3.4527, 3.3480, 3.2713, + 3.9037, 3.8361, 3.8579, 3.7311, 3.6575, 3.5176, 3.5693, 3.5157, 3.4814, + 3.4559, 3.4445, 3.4160, 4.1231, 3.8543, 3.6816, 3.5602, 3.4798, 3.4208, + 4.0542, 4.0139, 4.0165, 3.9412, 3.7698, 3.6915, 3.6043, 3.5639, 3.5416, + 3.5247, 3.5153, 3.5654, 4.2862, 4.0437, 3.8871, 3.7741, 3.6985, 3.6413, + 4.2345, 4.3663, 4.3257, 4.0869, 4.0612, 4.0364, 4.0170, 3.9978, 3.9834, + 3.9137, 3.8825, 3.8758, 3.9143, 3.8976, 3.8864, 3.8768, 3.9190, 4.1613, + 4.0566, 3.9784, 3.9116, 3.8326, 3.7122, 3.6378, 3.5576, 3.5457, 4.3127, + 3.1160, 2.8482, 4.0739, 3.3599, 3.5698, 3.5366, 3.2854, 3.1039, 2.9953, + 2.9192, 4.1432, 3.5320, 3.9478, 4.0231, 3.7509, 3.5604, 3.4340, 3.3426, + 4.3328, 3.8288, 3.7822, 3.7909, 3.6907, 3.6864, 3.5793, 3.5221, 3.4883, + 3.4649, 3.4514, 3.4301, 3.9256, 4.0596, 3.8307, 3.6702, 3.5651, 3.4884, + 4.4182, 4.2516, 3.9687, 3.9186, 3.9485, 3.8370, 3.7255, 3.6744, 3.6476, + 3.6295, 3.6193, 3.5659, 4.0663, 4.2309, 4.0183, 3.8680, 3.7672, 3.6923, + 4.5240, 4.4834, 4.1570, 4.3204, 4.2993, 4.2804, 4.2647, 4.2481, 4.2354, + 3.8626, 3.8448, 4.2267, 4.1799, 4.1670, 3.8738, 3.8643, 3.8796, 4.0575, + 4.0354, 3.9365, 3.8611, 3.7847, 3.7388, 3.6826, 3.6251, 3.5492, 4.0889, + 4.2764, 3.1416, 2.8325, 3.7735, 3.3787, 3.4632, 3.5923, 3.3214, 3.1285, + 3.0147, 2.9366, 3.8527, 3.5602, 3.8131, 3.8349, 3.7995, 3.5919, 3.4539, + 3.3540, 4.0654, 3.8603, 3.7972, 3.7358, 3.7392, 3.8157, 3.6055, 3.5438, + 3.5089, 3.4853, 3.4698, 3.4508, 3.7882, 3.8682, 3.8837, 3.7055, 3.5870, + 3.5000, 4.1573, 4.0005, 3.9568, 3.8936, 3.9990, 3.9433, 3.8172, 3.7566, + 3.7246, 3.7033, 3.6900, 3.5697, 3.9183, 4.0262, 4.0659, 3.8969, 3.7809, + 3.6949, 4.2765, 4.2312, 4.1401, 4.0815, 4.0580, 4.0369, 4.0194, 4.0017, + 3.9874, 3.8312, 3.8120, 3.9454, 3.9210, 3.9055, 3.8951, 3.8866, 3.8689, + 3.9603, 3.9109, 3.9122, 3.8233, 3.7438, 3.7436, 3.6981, 3.6555, 3.5452, + 3.9327, 4.0658, 4.1175, 2.9664, 2.8209, 3.5547, 3.3796, 3.3985, 3.3164, + 3.2364, 3.1956, 3.0370, 2.9313, 3.6425, 3.5565, 3.7209, 3.7108, 3.6639, + 3.6484, 3.4745, 3.3492, 3.8755, 4.2457, 3.7758, 3.7161, 3.6693, 3.6155, + 3.5941, 3.5643, 3.5292, 3.4950, 3.4720, 3.4503, 3.6936, 3.7392, 3.7388, + 3.7602, 3.6078, 3.4960, 3.9800, 4.3518, 4.2802, 3.8580, 3.8056, 3.7527, + 3.7019, 3.6615, 3.5768, 3.5330, 3.5038, 3.5639, 3.8192, 3.8883, 3.9092, + 3.9478, 3.7995, 3.6896, 4.1165, 4.5232, 4.4357, 4.4226, 4.4031, 4.3860, + 4.3721, 4.3580, 4.3466, 4.2036, 4.2037, 3.8867, 4.2895, 4.2766, 4.2662, + 4.2598, 3.8408, 3.9169, 3.8681, 3.8250, 3.7855, 3.7501, 3.6753, 3.5499, + 3.4872, 3.5401, 3.8288, 3.9217, 3.9538, 4.0054, 2.8388, 2.7890, 3.4329, + 3.5593, 3.3488, 3.2486, 3.1615, 3.1000, 3.0394, 2.9165, 3.5267, 3.7479, + 3.6650, 3.6263, 3.5658, 3.5224, 3.4762, 3.3342, 3.7738, 4.0333, 3.9568, + 3.8975, 3.8521, 3.4929, 3.7830, 3.7409, 3.7062, 3.6786, 3.6471, 3.6208, + 3.6337, 3.6519, 3.6363, 3.6278, 3.6110, 3.4825, 3.8795, 4.1448, 4.0736, + 4.0045, 3.6843, 3.6291, 3.5741, 3.5312, 3.4974, 3.4472, 3.4034, 3.7131, + 3.7557, 3.7966, 3.8005, 3.8068, 3.8015, 3.6747, 4.0222, 4.3207, 4.2347, + 4.2191, 4.1990, 4.1811, 4.1666, 4.1521, 4.1401, 3.9970, 3.9943, 3.9592, + 4.0800, 4.0664, 4.0559, 4.0488, 3.9882, 4.0035, 3.9539, 3.9138, 3.8798, + 3.8355, 3.5359, 3.4954, 3.3962, 3.5339, 3.7595, 3.8250, 3.8408, 3.8600, + 3.8644, 2.7412, 2.7489, 3.3374, 3.3950, 3.3076, 3.1910, 3.0961, 3.0175, + 3.0280, 2.8929, 3.4328, 3.5883, 3.6227, 3.5616, 3.4894, 3.4241, 3.3641, + 3.3120, 3.6815, 3.8789, 3.8031, 3.7413, 3.6939, 3.4010, 3.6225, 3.5797, + 3.5443, 3.5139, 3.4923, 3.4642, 3.5860, 3.5849, 3.5570, 3.5257, 3.4936, + 3.4628, 3.7874, 3.9916, 3.9249, 3.8530, 3.5932, 3.5355, 3.4757, 3.4306, + 3.3953, 3.3646, 3.3390, 3.5637, 3.7053, 3.7266, 3.7177, 3.6996, 3.6775, + 3.6558, 3.9331, 4.1655, 4.0879, 4.0681, 4.0479, 4.0299, 4.0152, 4.0006, + 3.9883, 3.8500, 3.8359, 3.8249, 3.9269, 3.9133, 3.9025, 3.8948, 3.8422, + 3.8509, 3.7990, 3.7570, 3.7219, 3.6762, 3.4260, 3.3866, 3.3425, 3.5294, + 3.7022, 3.7497, 3.7542, 3.7494, 3.7370, 3.7216, 3.3286, 3.5286, 4.5857, + 4.2143, 3.9714, 3.9428, 3.8857, 3.7714, 3.7857, 3.8286, 4.8714, 4.6571, + 4.4857, 4.3571, 4.4429, 4.3286, 4.2857, 4.2428, 5.3857, 5.0714, 4.7714, + 4.6143, 4.6000, 4.4429, 4.4000, 4.3571, 4.3000, 4.2857, 4.3143, 4.4286, + 4.4714, 4.4286, 4.5143, 4.4429, 4.5000, 4.5429, 5.5714, 5.2572, 4.9714, + 4.8572, 4.7571, 4.6428, 4.5143, 4.4857, 4.4857, 4.4143, 4.5143, 4.6286, + 4.7000, 4.6714, 4.6714, 4.6286, 4.7571, 4.7429, 5.8571, 5.3857, 5.1857, + 4.9714, 5.1286, 5.1143, 5.1000, 5.0857, 5.0286, 5.0428, 5.0286, 5.0143, + 5.0000, 5.0000, 4.9857, 5.0571, 4.9571, 4.8286, 4.7429, 4.6286, 4.5572, + 4.5286, 4.4572, 4.4714, 4.4857, 4.7571, 4.7286, 4.7286, 4.8143, 4.7429, + 4.8429, 4.9000, 5.7428, 3.0429, 3.2429, 4.3000, 3.9286, 3.6857, 3.6571, + 3.6000, 3.4857, 3.5000, 3.5428, 4.5857, 4.3714, 4.2000, 4.0714, 4.1572, + 4.0429, 4.0000, 3.9571, 5.1000, 4.7857, 4.4857, 4.3286, 4.3143, 4.1572, + 4.1143, 4.0714, 4.0143, 4.0000, 4.0286, 4.1429, 4.1857, 4.1429, 4.2285, + 4.1572, 4.2143, 4.2571, 5.2857, 4.9714, 4.6857, 4.5714, 4.4714, 4.3571, + 4.2285, 4.2000, 4.2000, 4.1286, 4.2285, 4.3429, 4.4143, 4.3857, 4.3857, + 4.3429, 4.4714, 4.4572, 5.5714, 5.1000, 4.9000, 4.6857, 4.8429, 4.8286, + 4.8143, 4.8000, 4.7429, 4.7571, 4.7429, 4.7286, 4.7143, 4.7143, 4.7000, + 4.7714, 4.6714, 4.5429, 4.4572, 4.3429, 4.2714, 4.2428, 4.1715, 4.1857, + 4.2000, 4.4714, 4.4429, 4.4429, 4.5286, 4.4572, 4.5572, 4.6143, 5.4571, + 5.1714, 2.8428, 3.0429, 4.1000, 3.7286, 3.4857, 3.4572, 3.4000, 3.2857, + 3.3000, 3.3429, 4.3857, 4.1715, 4.0000, 3.8714, 3.9571, 3.8428, 3.8000, + 3.7572, 4.9000, 4.5857, 4.2857, 4.1286, 4.1143, 3.9571, 3.9143, 3.8714, + 3.8143, 3.8000, 3.8286, 3.9428, 3.9857, 3.9428, 4.0286, 3.9571, 4.0143, + 4.0571, 5.0857, 4.7714, 4.4857, 4.3714, 4.2714, 4.1572, 4.0286, 4.0000, + 4.0000, 3.9286, 4.0286, 4.1429, 4.2143, 4.1857, 4.1857, 4.1429, 4.2714, + 4.2571, 5.3714, 4.9000, 4.7000, 4.4857, 4.6428, 4.6286, 4.6143, 4.6000, + 4.5429, 4.5572, 4.5429, 4.5286, 4.5143, 4.5143, 4.5000, 4.5714, 4.4714, + 4.3429, 4.2571, 4.1429, 4.0714, 4.0429, 3.9714, 3.9857, 4.0000, 4.2714, + 4.2428, 4.2428, 4.3286, 4.2571, 4.3571, 4.4143, 5.2572, 4.9714, 4.7714, + 2.7143, 2.9143, 3.9714, 3.6000, 3.3572, 3.3286, 3.2714, 3.1571, 3.1714, + 3.2143, 4.2571, 4.0429, 3.8714, 3.7429, 3.8286, 3.7143, 3.6714, 3.6286, + 4.7714, 4.4572, 4.1572, 4.0000, 3.9857, 3.8286, 3.7857, 3.7429, 3.6857, + 3.6714, 3.7000, 3.8143, 3.8571, 3.8143, 3.9000, 3.8286, 3.8857, 3.9286, + 4.9571, 4.6428, 4.3571, 4.2428, 4.1429, 4.0286, 3.9000, 3.8714, 3.8714, + 3.8000, 3.9000, 4.0143, 4.0857, 4.0571, 4.0571, 4.0143, 4.1429, 4.1286, + 5.2429, 4.7714, 4.5714, 4.3571, 4.5143, 4.5000, 4.4857, 4.4714, 4.4143, + 4.4286, 4.4143, 4.4000, 4.3857, 4.3857, 4.3714, 4.4429, 4.3429, 4.2143, + 4.1286, 4.0143, 3.9428, 3.9143, 3.8428, 3.8571, 3.8714, 4.1429, 4.1143, + 4.1143, 4.2000, 4.1286, 4.2285, 4.2857, 5.1286, 4.8429, 4.6428, 4.5143, + 2.6286, 2.8286, 3.8857, 3.5143, 3.2714, 3.2429, 3.1857, 3.0715, 3.0857, + 3.1285, 4.1715, 3.9571, 3.7857, 3.6571, 3.7429, 3.6286, 3.5857, 3.5428, + 4.6857, 4.3714, 4.0714, 3.9143, 3.9000, 3.7429, 3.7000, 3.6571, 3.6000, + 3.5857, 3.6143, 3.7286, 3.7714, 3.7286, 3.8143, 3.7429, 3.8000, 3.8428, + 4.8714, 4.5572, 4.2714, 4.1572, 4.0571, 3.9428, 3.8143, 3.7857, 3.7857, + 3.7143, 3.8143, 3.9286, 4.0000, 3.9714, 3.9714, 3.9286, 4.0571, 4.0429, + 5.1571, 4.6857, 4.4857, 4.2714, 4.4286, 4.4143, 4.4000, 4.3857, 4.3286, + 4.3429, 4.3286, 4.3143, 4.3000, 4.3000, 4.2857, 4.3571, 4.2571, 4.1286, + 4.0429, 3.9286, 3.8571, 3.8286, 3.7572, 3.7714, 3.7857, 4.0571, 4.0286, + 4.0286, 4.1143, 4.0429, 4.1429, 4.2000, 5.0428, 4.7571, 4.5572, 4.4286, + 4.3429, 2.6429, 2.8428, 3.9000, 3.5286, 3.2857, 3.2571, 3.2000, 3.0857, + 3.1000, 3.1428, 4.1857, 3.9714, 3.8000, 3.6714, 3.7572, 3.6429, 3.6000, + 3.5571, 4.7000, 4.3857, 4.0857, 3.9286, 3.9143, 3.7572, 3.7143, 3.6714, + 3.6143, 3.6000, 3.6286, 3.7429, 3.7857, 3.7429, 3.8286, 3.7572, 3.8143, + 3.8571, 4.8857, 4.5714, 4.2857, 4.1715, 4.0714, 3.9571, 3.8286, 3.8000, + 3.8000, 3.7286, 3.8286, 3.9428, 4.0143, 3.9857, 3.9857, 3.9428, 4.0714, + 4.0571, 5.1714, 4.7000, 4.5000, 4.2857, 4.4429, 4.4286, 4.4143, 4.4000, + 4.3429, 4.3571, 4.3429, 4.3286, 4.3143, 4.3143, 4.3000, 4.3714, 4.2714, + 4.1429, 4.0571, 3.9428, 3.8714, 3.8428, 3.7714, 3.7857, 3.8000, 4.0714, + 4.0429, 4.0429, 4.1286, 4.0571, 4.1572, 4.2143, 5.0571, 4.7714, 4.5714, + 4.4429, 4.3571, 4.3714, 2.6572, 2.8571, 3.9143, 3.5428, 3.3000, 3.2714, + 3.2143, 3.1000, 3.1143, 3.1571, 4.2000, 3.9857, 3.8143, 3.6857, 3.7714, + 3.6571, 3.6143, 3.5714, 4.7143, 4.4000, 4.1000, 3.9428, 3.9286, 3.7714, + 3.7286, 3.6857, 3.6286, 3.6143, 3.6429, 3.7572, 3.8000, 3.7572, 3.8428, + 3.7714, 3.8286, 3.8714, 4.9000, 4.5857, 4.3000, 4.1857, 4.0857, 3.9714, + 3.8428, 3.8143, 3.8143, 3.7429, 3.8428, 3.9571, 4.0286, 4.0000, 4.0000, + 3.9571, 4.0857, 4.0714, 5.1857, 4.7143, 4.5143, 4.3000, 4.4572, 4.4429, + 4.4286, 4.4143, 4.3571, 4.3714, 4.3571, 4.3429, 4.3286, 4.3286, 4.3143, + 4.3857, 4.2857, 4.1572, 4.0714, 3.9571, 3.8857, 3.8571, 3.7857, 3.8000, + 3.8143, 4.0857, 4.0571, 4.0571, 4.1429, 4.0714, 4.1715, 4.2285, 5.0714, + 4.7857, 4.5857, 4.4572, 4.3714, 4.3857, 4.4000, 2.6714, 2.8714, 3.9286, + 3.5571, 3.3143, 3.2857, 3.2286, 3.1143, 3.1285, 3.1714, 4.2143, 4.0000, + 3.8286, 3.7000, 3.7857, 3.6714, 3.6286, 3.5857, 4.7286, 4.4143, 4.1143, + 3.9571, 3.9428, 3.7857, 3.7429, 3.7000, 3.6429, 3.6286, 3.6571, 3.7714, + 3.8143, 3.7714, 3.8571, 3.7857, 3.8428, 3.8857, 4.9143, 4.6000, 4.3143, + 4.2000, 4.1000, 3.9857, 3.8571, 3.8286, 3.8286, 3.7572, 3.8571, 3.9714, + 4.0429, 4.0143, 4.0143, 3.9714, 4.1000, 4.0857, 5.2000, 4.7286, 4.5286, + 4.3143, 4.4714, 4.4572, 4.4429, 4.4286, 4.3714, 4.3857, 4.3714, 4.3571, + 4.3429, 4.3429, 4.3286, 4.4000, 4.3000, 4.1715, 4.0857, 3.9714, 3.9000, + 3.8714, 3.8000, 3.8143, 3.8286, 4.1000, 4.0714, 4.0714, 4.1572, 4.0857, + 4.1857, 4.2428, 5.0857, 4.8000, 4.6000, 4.4714, 4.3857, 4.4000, 4.4143, + 4.4286, 2.5857, 2.7857, 3.8428, 3.4714, 3.2286, 3.2000, 3.1428, 3.0286, + 3.0429, 3.0857, 4.1286, 3.9143, 3.7429, 3.6143, 3.7000, 3.5857, 3.5428, + 3.5000, 4.6428, 4.3286, 4.0286, 3.8714, 3.8571, 3.7000, 3.6571, 3.6143, + 3.5571, 3.5428, 3.5714, 3.6857, 3.7286, 3.6857, 3.7714, 3.7000, 3.7572, + 3.8000, 4.8286, 4.5143, 4.2285, 4.1143, 4.0143, 3.9000, 3.7714, 3.7429, + 3.7429, 3.6714, 3.7714, 3.8857, 3.9571, 3.9286, 3.9286, 3.8857, 4.0143, + 4.0000, 5.1143, 4.6428, 4.4429, 4.2285, 4.3857, 4.3714, 4.3571, 4.3429, + 4.2857, 4.3000, 4.2857, 4.2714, 4.2571, 4.2571, 4.2428, 4.3143, 4.2143, + 4.0857, 4.0000, 3.8857, 3.8143, 3.7857, 3.7143, 3.7286, 3.7429, 4.0143, + 3.9857, 3.9857, 4.0714, 4.0000, 4.1000, 4.1572, 5.0000, 4.7143, 4.5143, + 4.3857, 4.3000, 4.3143, 4.3286, 4.3429, 4.2571, 2.5857, 2.7857, 3.8428, + 3.4714, 3.2286, 3.2000, 3.1428, 3.0286, 3.0429, 3.0857, 4.1286, 3.9143, + 3.7429, 3.6143, 3.7000, 3.5857, 3.5428, 3.5000, 4.6428, 4.3286, 4.0286, + 3.8714, 3.8571, 3.7000, 3.6571, 3.6143, 3.5571, 3.5428, 3.5714, 3.6857, + 3.7286, 3.6857, 3.7714, 3.7000, 3.7572, 3.8000, 4.8286, 4.5143, 4.2285, + 4.1143, 4.0143, 3.9000, 3.7714, 3.7429, 3.7429, 3.6714, 3.7714, 3.8857, + 3.9571, 3.9286, 3.9286, 3.8857, 4.0143, 4.0000, 5.1143, 4.6428, 4.4429, + 4.2285, 4.3857, 4.3714, 4.3571, 4.3429, 4.2857, 4.3000, 4.2857, 4.2714, + 4.2571, 4.2571, 4.2428, 4.3143, 4.2143, 4.0857, 4.0000, 3.8857, 3.8143, + 3.7857, 3.7143, 3.7286, 3.7429, 4.0143, 3.9857, 3.9857, 4.0714, 4.0000, + 4.1000, 4.1572, 5.0000, 4.7143, 4.5143, 4.3857, 4.3000, 4.3143, 4.3286, + 4.3429, 4.2571, 4.2571, 2.6143, 2.8143, 3.8714, 3.5000, 3.2571, 3.2286, + 3.1714, 3.0572, 3.0715, 3.1143, 4.1572, 3.9428, 3.7714, 3.6429, 3.7286, + 3.6143, 3.5714, 3.5286, 4.6714, 4.3571, 4.0571, 3.9000, 3.8857, 3.7286, + 3.6857, 3.6429, 3.5857, 3.5714, 3.6000, 3.7143, 3.7572, 3.7143, 3.8000, + 3.7286, 3.7857, 3.8286, 4.8572, 4.5429, 4.2571, 4.1429, 4.0429, 3.9286, + 3.8000, 3.7714, 3.7714, 3.7000, 3.8000, 3.9143, 3.9857, 3.9571, 3.9571, + 3.9143, 4.0429, 4.0286, 5.1429, 4.6714, 4.4714, 4.2571, 4.4143, 4.4000, + 4.3857, 4.3714, 4.3143, 4.3286, 4.3143, 4.3000, 4.2857, 4.2857, 4.2714, + 4.3429, 4.2428, 4.1143, 4.0286, 3.9143, 3.8428, 3.8143, 3.7429, 3.7572, + 3.7714, 4.0429, 4.0143, 4.0143, 4.1000, 4.0286, 4.1286, 4.1857, 5.0286, + 4.7429, 4.5429, 4.4143, 4.3286, 4.3429, 4.3571, 4.3714, 4.2857, 4.2857, + 4.3143, 2.6143, 2.8143, 3.8714, 3.5000, 3.2571, 3.2286, 3.1714, 3.0572, + 3.0715, 3.1143, 4.1572, 3.9428, 3.7714, 3.6429, 3.7286, 3.6143, 3.5714, + 3.5286, 4.6714, 4.3571, 4.0571, 3.9000, 3.8857, 3.7286, 3.6857, 3.6429, + 3.5857, 3.5714, 3.6000, 3.7143, 3.7572, 3.7143, 3.8000, 3.7286, 3.7857, + 3.8286, 4.8572, 4.5429, 4.2571, 4.1429, 4.0429, 3.9286, 3.8000, 3.7714, + 3.7714, 3.7000, 3.8000, 3.9143, 3.9857, 3.9571, 3.9571, 3.9143, 4.0429, + 4.0286, 5.1429, 4.6714, 4.4714, 4.2571, 4.4143, 4.4000, 4.3857, 4.3714, + 4.3143, 4.3286, 4.3143, 4.3000, 4.2857, 4.2857, 4.2714, 4.3429, 4.2428, + 4.1143, 4.0286, 3.9143, 3.8428, 3.8143, 3.7429, 3.7572, 3.7714, 4.0429, + 4.0143, 4.0143, 4.1000, 4.0286, 4.1286, 4.1857, 5.0286, 4.7429, 4.5429, + 4.4143, 4.3286, 4.3429, 4.3571, 4.3714, 4.2857, 4.2857, 4.3143, 4.3143, + 2.5714, 2.7714, 3.8286, 3.4572, 3.2143, 3.1857, 3.1285, 3.0143, 3.0286, + 3.0715, 4.1143, 3.9000, 3.7286, 3.6000, 3.6857, 3.5714, 3.5286, 3.4857, + 4.6286, 4.3143, 4.0143, 3.8571, 3.8428, 3.6857, 3.6429, 3.6000, 3.5428, + 3.5286, 3.5571, 3.6714, 3.7143, 3.6714, 3.7572, 3.6857, 3.7429, 3.7857, + 4.8143, 4.5000, 4.2143, 4.1000, 4.0000, 3.8857, 3.7572, 3.7286, 3.7286, + 3.6571, 3.7572, 3.8714, 3.9428, 3.9143, 3.9143, 3.8714, 4.0000, 3.9857, + 5.1000, 4.6286, 4.4286, 4.2143, 4.3714, 4.3571, 4.3429, 4.3286, 4.2714, + 4.2857, 4.2714, 4.2571, 4.2428, 4.2428, 4.2285, 4.3000, 4.2000, 4.0714, + 3.9857, 3.8714, 3.8000, 3.7714, 3.7000, 3.7143, 3.7286, 4.0000, 3.9714, + 3.9714, 4.0571, 3.9857, 4.0857, 4.1429, 4.9857, 4.7000, 4.5000, 4.3714, + 4.2857, 4.3000, 4.3143, 4.3286, 4.2428, 4.2428, 4.2714, 4.2714, 4.2285, + 2.6000, 2.8000, 3.8571, 3.4857, 3.2429, 3.2143, 3.1571, 3.0429, 3.0572, + 3.1000, 4.1429, 3.9286, 3.7572, 3.6286, 3.7143, 3.6000, 3.5571, 3.5143, + 4.6571, 4.3429, 4.0429, 3.8857, 3.8714, 3.7143, 3.6714, 3.6286, 3.5714, + 3.5571, 3.5857, 3.7000, 3.7429, 3.7000, 3.7857, 3.7143, 3.7714, 3.8143, + 4.8429, 4.5286, 4.2428, 4.1286, 4.0286, 3.9143, 3.7857, 3.7572, 3.7572, + 3.6857, 3.7857, 3.9000, 3.9714, 3.9428, 3.9428, 3.9000, 4.0286, 4.0143, + 5.1286, 4.6571, 4.4572, 4.2428, 4.4000, 4.3857, 4.3714, 4.3571, 4.3000, + 4.3143, 4.3000, 4.2857, 4.2714, 4.2714, 4.2571, 4.3286, 4.2285, 4.1000, + 4.0143, 3.9000, 3.8286, 3.8000, 3.7286, 3.7429, 3.7572, 4.0286, 4.0000, + 4.0000, 4.0857, 4.0143, 4.1143, 4.1715, 5.0143, 4.7286, 4.5286, 4.4000, + 4.3143, 4.3286, 4.3429, 4.3571, 4.2714, 4.2714, 4.3000, 4.3000, 4.2571, + 4.2857, 2.6857, 2.8857, 3.9428, 3.5714, 3.3286, 3.3000, 3.2429, 3.1285, + 3.1428, 3.1857, 4.2285, 4.0143, 3.8428, 3.7143, 3.8000, 3.6857, 3.6429, + 3.6000, 4.7429, 4.4286, 4.1286, 3.9714, 3.9571, 3.8000, 3.7572, 3.7143, + 3.6571, 3.6429, 3.6714, 3.7857, 3.8286, 3.7857, 3.8714, 3.8000, 3.8571, + 3.9000, 4.9285, 4.6143, 4.3286, 4.2143, 4.1143, 4.0000, 3.8714, 3.8428, + 3.8428, 3.7714, 3.8714, 3.9857, 4.0571, 4.0286, 4.0286, 3.9857, 4.1143, + 4.1000, 5.2143, 4.7429, 4.5429, 4.3286, 4.4857, 4.4714, 4.4572, 4.4429, + 4.3857, 4.4000, 4.3857, 4.3714, 4.3571, 4.3571, 4.3429, 4.4143, 4.3143, + 4.1857, 4.1000, 3.9857, 3.9143, 3.8857, 3.8143, 3.8286, 3.8428, 4.1143, + 4.0857, 4.0857, 4.1715, 4.1000, 4.2000, 4.2571, 5.1000, 4.8143, 4.6143, + 4.4857, 4.4000, 4.4143, 4.4286, 4.4429, 4.3571, 4.3571, 4.3857, 4.3857, + 4.3429, 4.3714, 4.4572, 2.7143, 2.9143, 3.9714, 3.6000, 3.3572, 3.3286, + 3.2714, 3.1571, 3.1714, 3.2143, 4.2571, 4.0429, 3.8714, 3.7429, 3.8286, + 3.7143, 3.6714, 3.6286, 4.7714, 4.4572, 4.1572, 4.0000, 3.9857, 3.8286, + 3.7857, 3.7429, 3.6857, 3.6714, 3.7000, 3.8143, 3.8571, 3.8143, 3.9000, + 3.8286, 3.8857, 3.9286, 4.9571, 4.6428, 4.3571, 4.2428, 4.1429, 4.0286, + 3.9000, 3.8714, 3.8714, 3.8000, 3.9000, 4.0143, 4.0857, 4.0571, 4.0571, + 4.0143, 4.1429, 4.1286, 5.2429, 4.7714, 4.5714, 4.3571, 4.5143, 4.5000, + 4.4857, 4.4714, 4.4143, 4.4286, 4.4143, 4.4000, 4.3857, 4.3857, 4.3714, + 4.4429, 4.3429, 4.2143, 4.1286, 4.0143, 3.9428, 3.9143, 3.8428, 3.8571, + 3.8714, 4.1429, 4.1143, 4.1143, 4.2000, 4.1286, 4.2285, 4.2857, 5.1286, + 4.8429, 4.6428, 4.5143, 4.4286, 4.4429, 4.4572, 4.4714, 4.3857, 4.3857, + 4.4143, 4.4143, 4.3714, 4.4000, 4.4857, 4.5143, 2.5286, 2.7286, 3.7857, + 3.4143, 3.1714, 3.1428, 3.0857, 2.9714, 2.9857, 3.0286, 4.0714, 3.8571, + 3.6857, 3.5571, 3.6429, 3.5286, 3.4857, 3.4429, 4.5857, 4.2714, 3.9714, + 3.8143, 3.8000, 3.6429, 3.6000, 3.5571, 3.5000, 3.4857, 3.5143, 3.6286, + 3.6714, 3.6286, 3.7143, 3.6429, 3.7000, 3.7429, 4.7714, 4.4572, 4.1715, + 4.0571, 3.9571, 3.8428, 3.7143, 3.6857, 3.6857, 3.6143, 3.7143, 3.8286, + 3.9000, 3.8714, 3.8714, 3.8286, 3.9571, 3.9428, 5.0571, 4.5857, 4.3857, + 4.1715, 4.3286, 4.3143, 4.3000, 4.2857, 4.2285, 4.2428, 4.2285, 4.2143, + 4.2000, 4.2000, 4.1857, 4.2571, 4.1572, 4.0286, 3.9428, 3.8286, 3.7572, + 3.7286, 3.6571, 3.6714, 3.6857, 3.9571, 3.9286, 3.9286, 4.0143, 3.9428, + 4.0429, 4.1000, 4.9428, 4.6571, 4.4572, 4.3286, 4.2428, 4.2571, 4.2714, + 4.2857, 4.2000, 4.2000, 4.2285, 4.2285, 4.1857, 4.2143, 4.3000, 4.3286, + 4.1429 }; -} // namespace eeqbc +} // namespace eeqbc -} // namespace multicharge_param +} // namespace multicharge_param diff --git a/include/dftd_ncoord.h b/include/dftd_ncoord.h index f4e898a..9f45841 100644 --- a/include/dftd_ncoord.h +++ b/include/dftd_ncoord.h @@ -23,34 +23,35 @@ #pragma once -#include #include "dftd_geometry.h" #include "dftd_matrix.h" #include "dftd_multicharge_param.h" +#include namespace dftd4 { -class NCoordBase -{ +class NCoordBase { public: - static const double rad[]; // cov. radii default: D3 covalent radii from dftd_ncoord.cpp - double kcn; // Steepness of counting function - double norm_exp; // exponent of the normalizing-factor in the counting function - double cutoff; // Coordination number cutoff distance + static const double + rad[]; // cov. radii default: D3 covalent radii from dftd_ncoord.cpp + double kcn; // Steepness of counting function + double + norm_exp; // exponent of the normalizing-factor in the counting function + double cutoff; // Coordination number cutoff distance double f_directed; // directed factor for EN scaled coordination number - double cn_max; // (Soft-)maximum value for the coordination number - const double* rcov; // covalent radii for CN + double cn_max; // (Soft-)maximum value for the coordination number + const double *rcov; // covalent radii for CN // Get the coordination number /** - * Wrapper for coordination number calculation. - * - * @param mol Molecule object. - * @param dist Distance matrix. - * @param cn Coordination number. - * @param dcndr Derivative of the coordination number. - * @param lgrad Flag for gradient computation. - * @return Exit status. - */ + * Wrapper for coordination number calculation. + * + * @param mol Molecule object. + * @param dist Distance matrix. + * @param cn Coordination number. + * @param dcndr Derivative of the coordination number. + * @param lgrad Flag for gradient computation. + * @return Exit status. + */ int get_ncoord( // without ghost atom indices const TMolecule &mol, const TMatrix &dist, @@ -58,17 +59,18 @@ class NCoordBase TMatrix &dcndr, // derivative of the coordination number bool lgrad); /** - * Wrapper for coordination number calculation. - * Allocates the cn vector unconditionally, and the dcndr matrix only if lgrad is true. - * - * @param mol Molecule object. - * @param realIdx List for real atoms excluding ghost/non atoms. - * @param dist Distance matrix. - * @param cn Coordination number. - * @param dcndr Derivative of the coordination number. - * @param lgrad Flag for gradient computation. - * @return Exit status. - */ + * Wrapper for coordination number calculation. + * Allocates the cn vector unconditionally, and the dcndr matrix only if + * lgrad is true. + * + * @param mol Molecule object. + * @param realIdx List for real atoms excluding ghost/non atoms. + * @param dist Distance matrix. + * @param cn Coordination number. + * @param dcndr Derivative of the coordination number. + * @param lgrad Flag for gradient computation. + * @return Exit status. + */ int get_ncoord( // with ghost atoms const TMolecule &mol, const TIVector &realIdx, @@ -77,90 +79,99 @@ class NCoordBase TMatrix &dcndr, // derivative of the coordination number bool lgrad); /** - * Calculate the coordination number. - * - * @param mol Molecule object. - * @param realIdx List for real atoms excluding ghost/non atoms. - * @param dist Distance matrix. - * @param cn Coordination number. - * @param dcndr Derivative of the coordination number. - * @return Exit status. - */ + * Calculate the coordination number. + * + * @param mol Molecule object. + * @param realIdx List for real atoms excluding ghost/non atoms. + * @param dist Distance matrix. + * @param cn Coordination number. + * @param dcndr Derivative of the coordination number. + * @return Exit status. + */ int ncoord_base( const TMolecule &mol, const TIVector &realIdx, const TMatrix &dist, - TVector &cn); + TVector &cn + ); /** - * Calculate error function coordination number and derivative - * w.r.t. nuclear coordinates. - * - * @param mol Molecule object. - * @param realIdx List for real atoms excluding ghost/non atoms. - * @param dist Distance matrix. - * @param cn Coordination number. - * @param dcndr Derivative of the coordination number. - * @return Exit status. - */ + * Calculate error function coordination number and derivative + * w.r.t. nuclear coordinates. + * + * @param mol Molecule object. + * @param realIdx List for real atoms excluding ghost/non atoms. + * @param dist Distance matrix. + * @param cn Coordination number. + * @param dcndr Derivative of the coordination number. + * @return Exit status. + */ int dr_ncoord_base( const TMolecule &mol, const TIVector &realIdx, const TMatrix &dist, TVector &cn, - TMatrix &dcndr); + TMatrix &dcndr + ); /** - * Electronegativity factor. - * - * @param i atom index - * @param j atom index - * @return Value of the electronegativity factor. - */ + * Electronegativity factor. + * + * @param i atom index + * @param j atom index + * @return Value of the electronegativity factor. + */ virtual double get_en_factor(int i, int j) const; // Calculate the element pair-specific covalent radii virtual double get_rcov(int, int) const; /** - * base class function for coordination number contributions. - * - * @param r distance between the two atoms - * @param rc summed up covalent radii of the two atoms - * @return Value of the counting function. - */ + * base class function for coordination number contributions. + * + * @param r distance between the two atoms + * @param rc summed up covalent radii of the two atoms + * @return Value of the counting function. + */ virtual double count_fct(double r, double rc) const = 0; /** - * Derivative of the counting function w.r.t. the distance. - * - * @param r distance between the two atoms - * @param rc summed up covalent radii of the two atoms - * @return Derivative of the counting function. - */ + * Derivative of the counting function w.r.t. the distance. + * + * @param r distance between the two atoms + * @param rc summed up covalent radii of the two atoms + * @return Derivative of the counting function. + */ virtual double dr_count_fct(double r, double rc) const = 0; /** - * TCutoff function for large coordination numbers - * - * @param cn_max Maximum CN (not strictly obeyed). - * @param cn On input coordination number, on output modified CN. - * @param dcndr On input derivative of CN w.r.t. cartesian coordinates, - * on output derivative of modified CN. - * @param lgrad Flag for gradient calculation. - */ - virtual int cut_coordination_number(const double cn_max, TVector &cn, TMatrix &dcndr, bool lgrad) = 0; + * TCutoff function for large coordination numbers + * + * @param cn_max Maximum CN (not strictly obeyed). + * @param cn On input coordination number, on output modified CN. + * @param dcndr On input derivative of CN w.r.t. cartesian coordinates, + * on output derivative of modified CN. + * @param lgrad Flag for gradient calculation. + */ + virtual int cut_coordination_number( + const double cn_max, + TVector &cn, + TMatrix &dcndr, + bool lgrad + ) = 0; // Constructor - NCoordBase(double optional_kcn = 7.5, double optional_norm_exp = 1.0, double optional_cutoff = 25.0, - double optional_f_directed = 1.0, double optional_cn_max = 8.0, const double* optional_rcov = rad); + NCoordBase( + double optional_kcn = 7.5, + double optional_norm_exp = 1.0, + double optional_cutoff = 25.0, + double optional_f_directed = 1.0, + double optional_cn_max = 8.0, + const double *optional_rcov = rad + ); // Virtual destructor - virtual ~NCoordBase() { - } + virtual ~NCoordBase() {} }; -inline double NCoordBase::get_en_factor(int i, int j) const { - return 1.0; -} +inline double NCoordBase::get_en_factor(int i, int j) const { return 1.0; } inline double NCoordBase::get_rcov(int i, int j) const { return rcov[i] + rcov[j]; } - // derived CN-class for erf()-based CN; includes default CN-cutoff class NCoordErf : public NCoordBase { public: @@ -169,11 +180,29 @@ class NCoordErf : public NCoordBase { // derivative of the erf() based counting function double dr_count_fct(double, double) const override; // Soft maximum/cutoff for coordination number - int cut_coordination_number(const double, TVector&, TMatrix&, bool) override; + int cut_coordination_number( + const double, + TVector &, + TMatrix &, + bool + ) override; // Constructor - NCoordErf(double optional_kcn = 7.5, double optional_norm_exp = 1.0, double optional_cutoff = 25.0, - double optional_f_directed = 1.0, double optional_cn_max = 8.0, const double* optional_rcov = rad) - : NCoordBase(optional_kcn, optional_norm_exp, optional_cutoff, optional_f_directed, optional_cn_max, optional_rcov){} + NCoordErf( + double optional_kcn = 7.5, + double optional_norm_exp = 1.0, + double optional_cutoff = 25.0, + double optional_f_directed = 1.0, + double optional_cn_max = 8.0, + const double *optional_rcov = rad + ) + : NCoordBase( + optional_kcn, + optional_norm_exp, + optional_cutoff, + optional_f_directed, + optional_cn_max, + optional_rcov + ) {} // Use default destructor; base class handles cleanup ~NCoordErf() override = default; }; @@ -186,34 +215,53 @@ class NCoordErfEN : public NCoordBase { // derivative of the erf() based counting function double dr_count_fct(double, double) const override; // Soft maximum/cutoff for coordination number - int cut_coordination_number(const double, TVector&, TMatrix&, bool) override; + int cut_coordination_number( + const double, + TVector &, + TMatrix &, + bool + ) override; // coordination number scaling factor based on electronegativity difference double get_en_factor(int, int) const override; // Calculate the element pair-specific covalent radii for EEQ-BC qloc double get_rcov(int, int) const override; // Constructor - NCoordErfEN(double optional_kcn = 7.5, double optional_norm_exp = 1.0, double optional_cutoff = 25.0, - double optional_f_directed = -1.0, double optional_cn_max = 8.0, const double* optional_rcov = multicharge_param::eeqbc::eeqbc_cov_radii) - : NCoordBase(optional_kcn, optional_norm_exp, optional_cutoff, optional_f_directed, optional_cn_max, optional_rcov){} + NCoordErfEN( + double optional_kcn = 7.5, + double optional_norm_exp = 1.0, + double optional_cutoff = 25.0, + double optional_f_directed = -1.0, + double optional_cn_max = 8.0, + const double *optional_rcov = multicharge_param::eeqbc::eeqbc_cov_radii + ) + : NCoordBase( + optional_kcn, + optional_norm_exp, + optional_cutoff, + optional_f_directed, + optional_cn_max, + optional_rcov + ) {} // Use default destructor; base class handles cleanup ~NCoordErfEN() override = default; }; inline double NCoordErfEN::get_en_factor(int i, int j) const { - return multicharge_param::eeqbc::eeqbc_en[j] - multicharge_param::eeqbc::eeqbc_en[i]; + return multicharge_param::eeqbc::eeqbc_en[j] - + multicharge_param::eeqbc::eeqbc_en[i]; } inline double NCoordErfEN::get_rcov(int i, int j) const { return rcov[i] + rcov[j]; } - // derived CN-class for the D4 model class NCoordErfD4 : public NCoordBase { private: static constexpr double k4 = 4.10451; static constexpr double k5 = 19.08857; static constexpr double k6 = 2 * 11.28174 * 11.28174; + public: // erf() based counting function double count_fct(double, double) const override; @@ -222,11 +270,29 @@ class NCoordErfD4 : public NCoordBase { // coordination number scaling factor based on electronegativity difference double get_en_factor(int, int) const override; // Soft maximum/cutoff for coordination number - int cut_coordination_number(const double, TVector&, TMatrix&, bool) override; + int cut_coordination_number( + const double, + TVector &, + TMatrix &, + bool + ) override; // Constructor - NCoordErfD4(double optional_kcn = 7.5, double optional_norm_exp = 1.0, double optional_cutoff = 25.0, - double optional_f_directed = 1.0, double optional_cn_max = 8.0, const double* optional_rcov = rad) - : NCoordBase(optional_kcn, optional_norm_exp, optional_cutoff, optional_f_directed, optional_cn_max, optional_rcov){} + NCoordErfD4( + double optional_kcn = 7.5, + double optional_norm_exp = 1.0, + double optional_cutoff = 25.0, + double optional_f_directed = 1.0, + double optional_cn_max = 8.0, + const double *optional_rcov = rad + ) + : NCoordBase( + optional_kcn, + optional_norm_exp, + optional_cutoff, + optional_f_directed, + optional_cn_max, + optional_rcov + ) {} // Use default destructor; base class handles cleanup ~NCoordErfD4() override = default; }; diff --git a/include/dftd_parameters.h b/include/dftd_parameters.h index ce93fda..0103379 100644 --- a/include/dftd_parameters.h +++ b/include/dftd_parameters.h @@ -29,7 +29,7 @@ namespace dftd4 { // TODO keep in sync with qcelems.h??? -constexpr int MAXELEMENT = 118+2; //dummy + H..Og + point charge +constexpr int MAXELEMENT = 118 + 2; // dummy + H..Og + point charge // clang-format off /** @@ -263,11 +263,11 @@ static const double gam[119]{ }; static const int refn[MAXELEMENT]{ - 0, 2, 1, 3, 4, 5, 7, 5, 4, 2, 1, 3, 4, 4, 5, 4, 3, 2, 1, 3, 4, 4, 4, 4, 4, 3, - 3, 4, 4, 2, 2, 3, 5, 4, 3, 2, 1, 3, 4, 3, 4, 4, 4, 3, 3, 4, 3, 2, 2, 4, 5, 4, - 3, 2, 1, 3, 4, 3, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 3, 3, 3, 5, - 3, 2, 2, 4, 5, 4, 3, 2, 1, 2, 3, 7, 5, 6, 7, 7, 7, 7, 7, 5, 7, 7, 7, 5, 7, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + 0, 2, 1, 3, 4, 5, 7, 5, 4, 2, 1, 3, 4, 4, 5, 4, 3, 2, 1, 3, 4, 4, 4, 4, + 4, 3, 3, 4, 4, 2, 2, 3, 5, 4, 3, 2, 1, 3, 4, 3, 4, 4, 4, 3, 3, 4, 3, 2, + 2, 4, 5, 4, 3, 2, 1, 3, 4, 3, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 4, 4, 3, 3, 3, 5, 3, 2, 2, 4, 5, 4, 3, 2, 1, 2, 3, 7, 5, 6, 7, 7, 7, 7, + 7, 5, 7, 7, 7, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // 1 @@ -6188,9 +6188,8 @@ static const double *refsq[MAXELEMENT]{ refsq80, refsq81, refsq82, refsq83, refsq84, refsq85, refsq86, refsq87, refsq88, refsq89, refsq90, refsq91, refsq92, refsq93, refsq94, refsq95, refsq96, refsq97, refsq98, refsq99, refsq100, refsq101, refsq102, refsq103, - nullptr, nullptr, nullptr, nullptr, - nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, - nullptr, nullptr, nullptr, nullptr, nullptr, nullptr + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }; static const double *refalpha[MAXELEMENT]{ @@ -6236,10 +6235,10 @@ static const double *refascale[MAXELEMENT]{ refascale85, refascale86, refascale87, refascale88, refascale89, refascale90, refascale91, refascale92, refascale93, refascale94, refascale95, refascale96, refascale97, refascale98, refascale99, - refascale100, refascale101, refascale102, refascale103, - nullptr, nullptr, nullptr, nullptr, - nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, - nullptr, nullptr, nullptr, nullptr, nullptr, nullptr + refascale100, refascale101, refascale102, refascale103, nullptr, + nullptr, nullptr, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, nullptr, nullptr }; static const double *refscount[MAXELEMENT]{ nullptr, refscount1, refscount2, refscount3, refscount4, @@ -6262,10 +6261,10 @@ static const double *refscount[MAXELEMENT]{ refscount85, refscount86, refscount87, refscount88, refscount89, refscount90, refscount91, refscount92, refscount93, refscount94, refscount95, refscount96, refscount97, refscount98, refscount99, - refscount100, refscount101, refscount102, refscount103, - nullptr, nullptr, nullptr, nullptr, - nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, - nullptr, nullptr, nullptr, nullptr, nullptr, nullptr + refscount100, refscount101, refscount102, refscount103, nullptr, + nullptr, nullptr, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, nullptr, nullptr }; static const int *refsys[MAXELEMENT]{ nullptr, refsys1, refsys2, refsys3, refsys4, refsys5, refsys6, @@ -6282,27 +6281,27 @@ static const int *refsys[MAXELEMENT]{ refsys77, refsys78, refsys79, refsys80, refsys81, refsys82, refsys83, refsys84, refsys85, refsys86, refsys87, refsys88, refsys89, refsys90, refsys91, refsys92, refsys93, refsys94, refsys95, refsys96, refsys97, - refsys98, refsys99, refsys100, refsys101, refsys102, refsys103, - nullptr, nullptr, nullptr, nullptr, - nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, - nullptr, nullptr, nullptr, nullptr, nullptr, nullptr + refsys98, refsys99, refsys100, refsys101, refsys102, refsys103, nullptr, + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, + nullptr }; static const int *refc[MAXELEMENT]{ - nullptr, refc1, refc2, refc3, refc4, refc5, refc6, refc7, refc8, - refc9, refc10, refc11, refc12, refc13, refc14, refc15, refc16, refc17, - refc18, refc19, refc20, refc21, refc22, refc23, refc24, refc25, refc26, - refc27, refc28, refc29, refc30, refc31, refc32, refc33, refc34, refc35, - refc36, refc37, refc38, refc39, refc40, refc41, refc42, refc43, refc44, - refc45, refc46, refc47, refc48, refc49, refc50, refc51, refc52, refc53, - refc54, refc55, refc56, refc57, refc58, refc59, refc60, refc61, refc62, - refc63, refc64, refc65, refc66, refc67, refc68, refc69, refc70, refc71, - refc72, refc73, refc74, refc75, refc76, refc77, refc78, refc79, refc80, - refc81, refc82, refc83, refc84, refc85, refc86, refc87, refc88, refc89, - refc90, refc91, refc92, refc93, refc94, refc95, refc96, refc97, refc98, - refc99, refc100, refc101, refc102, refc103, - nullptr, nullptr, nullptr, nullptr, - nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, - nullptr, nullptr, nullptr, nullptr, nullptr, nullptr + nullptr, refc1, refc2, refc3, refc4, refc5, refc6, refc7, + refc8, refc9, refc10, refc11, refc12, refc13, refc14, refc15, + refc16, refc17, refc18, refc19, refc20, refc21, refc22, refc23, + refc24, refc25, refc26, refc27, refc28, refc29, refc30, refc31, + refc32, refc33, refc34, refc35, refc36, refc37, refc38, refc39, + refc40, refc41, refc42, refc43, refc44, refc45, refc46, refc47, + refc48, refc49, refc50, refc51, refc52, refc53, refc54, refc55, + refc56, refc57, refc58, refc59, refc60, refc61, refc62, refc63, + refc64, refc65, refc66, refc67, refc68, refc69, refc70, refc71, + refc72, refc73, refc74, refc75, refc76, refc77, refc78, refc79, + refc80, refc81, refc82, refc83, refc84, refc85, refc86, refc87, + refc88, refc89, refc90, refc91, refc92, refc93, refc94, refc95, + refc96, refc97, refc98, refc99, refc100, refc101, refc102, refc103, + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }; // sec. 1 diff --git a/meson.build b/meson.build index 0bf7668..38c9216 100644 --- a/meson.build +++ b/meson.build @@ -43,7 +43,7 @@ if get_option('buildtype') == 'debug' add_project_arguments('-fno-omit-frame-pointer', language: 'cpp') add_project_link_arguments('-fno-omit-frame-pointer', language: 'cpp') - + sanitizer = get_option('sanitizer') if sanitizer == 'asan' message('Enabling ASan + UBSan + LSan') @@ -56,11 +56,11 @@ if get_option('buildtype') == 'debug' elif sanitizer == 'msan' message('Enabling Memory Sanitizer (MSan)') add_project_arguments('-Db_sanitize=memory', language: 'cpp') - + elif sanitizer == 'tsan' message('Enabling Thread Sanitizer (TSan)') add_project_arguments('-Db_sanitize=thread', language: 'cpp') - + else message('No sanitizers enabled') endif diff --git a/meson_options.txt b/meson_options.txt index 7ff1c55..87ec562 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -5,4 +5,4 @@ option( value: 'none', description: 'Choose a set of sanitizers to enable' -) \ No newline at end of file +) diff --git a/scripts/make-qcdftd4.sh b/scripts/make-qcdftd4.sh index 0bb145c..b3f2697 100755 --- a/scripts/make-qcdftd4.sh +++ b/scripts/make-qcdftd4.sh @@ -21,7 +21,7 @@ cat > qcdftd4param.h << 'EOT' * Extension for Fr, Ra and Actinides by: * Marvin Friede (MF121223) */ - + #ifndef QCDFTD4PARAM_H #define QCDFTD4PARAM_H diff --git a/scripts/make-qcdftd4param.sh b/scripts/make-qcdftd4param.sh index 76467ce..2dab53b 100755 --- a/scripts/make-qcdftd4param.sh +++ b/scripts/make-qcdftd4param.sh @@ -20,7 +20,7 @@ cat > qcdftd4param.h << 'EOT' * Extension for Fr, Ra and Actinides by: * Marvin Friede (MF121223) */ - + #ifndef QCDFTD4PARAM_H #define QCDFTD4PARAM_H diff --git a/src/dftd_dispersion.cpp b/src/dftd_dispersion.cpp index aa400af..2fe25df 100644 --- a/src/dftd_dispersion.cpp +++ b/src/dftd_dispersion.cpp @@ -105,10 +105,11 @@ int get_dispersion( TVector q; // partial charges from EEQ model TMatrix dqdr; // derivative of partial charges TVector gradient; // derivative of dispersion energy - NCoordErfD4 ncoord_erf_d4; // instance of erf() based coordination number for D4 - TVector cn; // coordination number + NCoordErfD4 + ncoord_erf_d4; // instance of erf() based coordination number for D4 + TVector cn; // coordination number TMatrix dcndr; // derivative of the coordination number - multicharge::EEQModel chrg_model; // EEQ charge model + multicharge::EEQModel chrg_model; // EEQ charge model q.NewVector(nat); if (lgrad) { @@ -117,7 +118,9 @@ int get_dispersion( } // calculate partial charges from EEQ model - info = chrg_model.get_charges(mol, realIdx, dist, charge, cutoff.cn_eeq, q, dqdr, lgrad); + info = chrg_model.get_charges( + mol, realIdx, dist, charge, cutoff.cn_eeq, q, dqdr, lgrad + ); if (info != EXIT_SUCCESS) return info; // get the D4 coordination number diff --git a/src/dftd_eeq.cpp b/src/dftd_eeq.cpp index b4277c7..85a4d77 100644 --- a/src/dftd_eeq.cpp +++ b/src/dftd_eeq.cpp @@ -26,13 +26,13 @@ #include "dftd_eeq.h" #include "dftd_geometry.h" #include "dftd_matrix.h" -#include "dftd_ncoord.h" #include "dftd_multicharge_param.h" +#include "dftd_ncoord.h" // wrap all charge models in the multicharge namespace namespace multicharge { - using dftd4::NCoordErf; - using dftd4::NCoordErfEN; +using dftd4::NCoordErf; +using dftd4::NCoordErfEN; // constants static const double small = 1e-14; @@ -41,7 +41,7 @@ static const double sqrtpi = std::sqrt(pi); static const double sqrt2pi = std::sqrt(2.0 / pi); // Base class for charge models -ChargeModel::ChargeModel(){} +ChargeModel::ChargeModel() {} // Get charges after adjusting atom indices in case ghost atoms are present int ChargeModel::get_charges( @@ -73,8 +73,8 @@ int ChargeModel::get_charges( int info{0}; bool lverbose{false}; const int nat = realIdx.Max() + 1; - TVector cn; // coordination number - TMatrix dcndr; // derivative of the coordination number + TVector cn; // coordination number + TMatrix dcndr; // derivative of the coordination number // get correct cn for current charge model get_cn(mol, realIdx, dist, cn, dcndr, lgrad); @@ -100,31 +100,49 @@ int ChargeModel::eeq_chrgeq( bool lverbose /*= false*/ ) { int info{0}; - const int n = realIdx.Max() + 1; // Number of atoms - int m = n + 1; // Number of atoms plus one for constraint + const int n = realIdx.Max() + 1; // Number of atoms + int m = n + 1; // Number of atoms plus one for constraint - TMatrix Amat; // Coulomb matrix - TVector xvec; // x (chi) vector, practically the right-hand side of the set of linear equations - TMatrix dxvecdr; // Derivative of the x vector w.r.t. atom positions + TMatrix Amat; // Coulomb matrix + TVector xvec; // x (chi) vector, practically the right-hand side of + // the set of linear equations + TMatrix dxvecdr; // Derivative of the x vector w.r.t. atom positions Amat.NewMat(m, m); xvec.NewVec(m); // EEQ-BC specific variables: - TVector qloc; // Local charge (allocated in get_qloc) - TMatrix dqlocdr; // Derivative of local charge w.r.t. atom positions (allocated in get_ncoord) - TMatrix cmat; // Capacitance matrix (allocated in get_cmat) - TMatrix dcmatdr; // Derivative of the capacitance matrix w.r.t. atom positions (allocated in get_dcmatdr) - - info = get_vrhs(mol, realIdx, charge, dist, cn, dcndr, xvec, dxvecdr, qloc, dqlocdr, cmat, dcmatdr, lgrad); + TVector qloc; // Local charge (allocated in get_qloc) + TMatrix dqlocdr; // Derivative of local charge w.r.t. atom positions + // (allocated in get_ncoord) + TMatrix cmat; // Capacitance matrix (allocated in get_cmat) + TMatrix dcmatdr; // Derivative of the capacitance matrix w.r.t. atom + // positions (allocated in get_dcmatdr) + + info = get_vrhs( + mol, + realIdx, + charge, + dist, + cn, + dcndr, + xvec, + dxvecdr, + qloc, + dqlocdr, + cmat, + dcmatdr, + lgrad + ); if (info != EXIT_SUCCESS) return info; info = get_amat_0d(mol, realIdx, dist, cn, qloc, cmat, Amat); if (info != EXIT_SUCCESS) return info; - TVector vrhs; // right-hand side (RHS) of linear equations; finally holds the solution of the linear equations + TVector vrhs; // right-hand side (RHS) of linear equations; finally + // holds the solution of the linear equations vrhs.NewVec(m); - TMatrix Ainv; // Inverse of the Coulomb matrix for dqdr + TMatrix Ainv; // Inverse of the Coulomb matrix for dqdr // Solve the set of linear equations with the Inverse Ainv // which we need later for dqdr as requested by lgrad=true if (lgrad) { @@ -139,7 +157,8 @@ int ChargeModel::eeq_chrgeq( BLAS_Add_Mat_x_Vec(vrhs, Ainv, xvec, false, 1.0); // if (info != EXIT_SUCCESS) return info; } - // Solve the set of linear equations directly (faster since we do not need Ainv) + // Solve the set of linear equations directly (faster since we do not need + // Ainv) else { TVector rhs; rhs.NewVec(m); @@ -152,19 +171,19 @@ int ChargeModel::eeq_chrgeq( // Extract the solution for (int i = 0, ii = 0; i < mol.NAtoms; i++) { - ii = realIdx(i); - if (ii < 0) continue; - vrhs(ii) = rhs(ii); + ii = realIdx(i); + if (ii < 0) continue; + vrhs(ii) = rhs(ii); } } // Remove charge constraint (make vector smaller by one) and total charge - double qtotal = 0.0; // total charge for checking charge constraint + double qtotal = 0.0; // total charge for checking charge constraint for (int iat = 0, ii = 0; iat != mol.NAtoms; iat++) { ii = realIdx(iat); if (ii < 0) continue; - qvec(ii) = vrhs(ii); // Assign partial charges to the correct variable + qvec(ii) = vrhs(ii); // Assign partial charges to the correct variable qtotal += qvec(ii); // Total charge of the system } @@ -198,9 +217,23 @@ int ChargeModel::eeq_chrgeq( TMatrix atrace; atrace.NewMat(m, 3); - // Calculate the derivative of the Coulomb matrix w.r.t. atom positions (dAmatdr) - info = get_damat_0d(mol, realIdx, dist, vrhs, Amat, dAmatdr, atrace, - cn, dcndr, qloc, dqlocdr, cmat, dcmatdr); + // Calculate the derivative of the Coulomb matrix w.r.t. atom positions + // (dAmatdr) + info = get_damat_0d( + mol, + realIdx, + dist, + vrhs, + Amat, + dAmatdr, + atrace, + cn, + dcndr, + qloc, + dqlocdr, + cmat, + dcmatdr + ); if (info != EXIT_SUCCESS) return info; for (int i = 0, ii = 0; i != mol.NAtoms; i++) { @@ -215,9 +248,9 @@ int ChargeModel::eeq_chrgeq( jj = realIdx(j); if (jj < 0) continue; - // dxvecdr = del C/del R * X + del X / del R * C + // dxvecdr = del C/del R * X + del X / del R * C // CN contribution - dAmatdr(3 * jj, ii) -= dxvecdr(ii, 3 * jj ); + dAmatdr(3 * jj, ii) -= dxvecdr(ii, 3 * jj); dAmatdr(3 * jj + 1, ii) -= dxvecdr(ii, 3 * jj + 1); dAmatdr(3 * jj + 2, ii) -= dxvecdr(ii, 3 * jj + 2); } @@ -261,11 +294,8 @@ int ChargeModel::eeq_chrgeq( // EEQ Model class derived from ChargeModel EEQModel::EEQModel() // Constructor initializer list - : xi(multicharge_param::eeq::xi), - gam(multicharge_param::eeq::gam), - kappa(multicharge_param::eeq::kappa), - alp(multicharge_param::eeq::alp) -{ + : xi(multicharge_param::eeq::xi), gam(multicharge_param::eeq::gam), + kappa(multicharge_param::eeq::kappa), alp(multicharge_param::eeq::alp) { ncoord_erf = NCoordErf(); } @@ -290,7 +320,7 @@ int EEQModel::get_vrhs( const int nat = realIdx.Max() + 1; if (lgrad) { - dxvecdr.NewMat(nat, 3*nat); + dxvecdr.NewMat(nat, 3 * nat); dxdcn.NewVec(nat); for (int i = 0, ii = 0; i != mol.NAtoms; i++) { ii = realIdx(i); @@ -304,9 +334,9 @@ int EEQModel::get_vrhs( for (int j = 0, jj = 0; j != mol.NAtoms; j++) { jj = realIdx(j); if (jj < 0) continue; - dxvecdr(ii, 3*jj ) = dxdcn(ii) * dcndr(ii, 3 * jj ); - dxvecdr(ii, 3*jj+1) = dxdcn(ii) * dcndr(ii, 3 * jj + 1); - dxvecdr(ii, 3*jj+2) = dxdcn(ii) * dcndr(ii, 3 * jj + 2); + dxvecdr(ii, 3 * jj) = dxdcn(ii) * dcndr(ii, 3 * jj); + dxvecdr(ii, 3 * jj + 1) = dxdcn(ii) * dcndr(ii, 3 * jj + 1); + dxvecdr(ii, 3 * jj + 2) = dxdcn(ii) * dcndr(ii, 3 * jj + 2); } } } else { @@ -421,10 +451,10 @@ int EEQModel::get_damat_0d( atrace(jj, 1) -= dgy * q(ii); atrace(jj, 2) -= dgz * q(ii); - dAmatdr(3 * ii, jj) = dgx * q(ii); - dAmatdr(3 * ii + 1, jj) = dgy * q(ii); - dAmatdr(3 * ii + 2, jj) = dgz * q(ii); - dAmatdr(3 * jj, ii) = -dgx * q(jj); + dAmatdr(3 * ii, jj) = dgx * q(ii); + dAmatdr(3 * ii + 1, jj) = dgy * q(ii); + dAmatdr(3 * ii + 2, jj) = dgz * q(ii); + dAmatdr(3 * jj, ii) = -dgx * q(jj); dAmatdr(3 * jj + 1, ii) = -dgy * q(jj); dAmatdr(3 * jj + 2, ii) = -dgz * q(jj); } @@ -441,14 +471,15 @@ int EEQModel::get_cn( TVector &cn, TMatrix &dcndr, bool lgrad -) -{ +) { int info{0}; // get the EEQ coordination number info = ncoord_erf.get_ncoord(mol, realIdx, dist, cn, dcndr, lgrad); if (info != EXIT_SUCCESS) { - throw std::runtime_error("EEQModel::get_cn: Failed to compute coordination numbers."); + throw std::runtime_error( + "EEQModel::get_cn: Failed to compute coordination numbers." + ); } return info; @@ -471,18 +502,19 @@ EEQBCModel::EEQBCModel() cap(multicharge_param::eeqbc::eeqbc_cap), cov_radii(multicharge_param::eeqbc::eeqbc_cov_radii), avg_cn(multicharge_param::eeqbc::eeqbc_avg_cn), - rvdw(multicharge_param::eeqbc::eeqbc_rvdw) -{ + rvdw(multicharge_param::eeqbc::eeqbc_rvdw) { ncoord_erf = NCoordErf( ncoorderf_kcn, ncoorderf_norm_exp, ncoorderf_cutoff, ncoorderf_f_directed, ncoorderf_cn_max, - multicharge_param::eeqbc::eeqbc_cov_radii); + multicharge_param::eeqbc::eeqbc_cov_radii + ); } -// Calculate the right-hand side (RHS) vector of the system of linear equations for EEQ-BC +// Calculate the right-hand side (RHS) vector of the system of linear equations +// for EEQ-BC int EEQBCModel::get_vrhs( const TMolecule &mol, const TIVector &realIdx, @@ -503,20 +535,33 @@ int EEQBCModel::get_vrhs( // calculate the capacitance matrix info = get_cmat(mol, realIdx, dist, cmat); if (info != EXIT_SUCCESS) { - printf("EEQBCModel::get_vrhs: Failed to calculate the capacitance matrix."); - return info; + printf("EEQBCModel::get_vrhs: Failed to calculate the capacitance matrix."); + return info; } - - if ( ! lgrad) { + + if (!lgrad) { // calculate the right-hand side (RHS) info = get_xvec(mol, realIdx, dist, cn, cmat, charge, qloc, xvec); } else { // calculate RHS and derivative - info = get_xvec_derivs(mol, realIdx, dist, cn, dcndr, cmat, charge, xvec, dxvecdr, qloc, dqlocdr, dcmatdr); + info = get_xvec_derivs( + mol, + realIdx, + dist, + cn, + dcndr, + cmat, + charge, + xvec, + dxvecdr, + qloc, + dqlocdr, + dcmatdr + ); } if (info != EXIT_SUCCESS) { - printf("EEQBCModel::get_vrhs: Failed to calculate the right hand side."); - return info; + printf("EEQBCModel::get_vrhs: Failed to calculate the right hand side."); + return info; } return EXIT_SUCCESS; @@ -533,42 +578,42 @@ int EEQBCModel::get_amat_0d( TMatrix &Amat ) const { const int nat = realIdx.Max() + 1; - int iat, jat; // atomic numbers + int iat, jat; // atomic numbers double norm_cn; // coordination number normalization factor double r, radi, radj, gamij2, tmp; - for (int i = 0, ii = 0; i < mol.NAtoms; i++) { ii = realIdx(i); if (ii < 0) continue; iat = mol.ATNO(i); norm_cn = 1.0 / pow(avg_cn[iat], norm_exp); - radi = rad[iat] * (1.0 - kcnrad*cn(ii)*norm_cn); + radi = rad[iat] * (1.0 - kcnrad * cn(ii) * norm_cn); for (int j = 0, jj = 0; j < i; j++) { jj = realIdx(j); if (jj < 0) continue; jat = mol.ATNO(j); r = dist(ii, jj); - norm_cn = 1.0 / pow(avg_cn[jat], norm_exp); - radj = rad[jat] * (1.0 - kcnrad*cn(jj)*norm_cn); + norm_cn = 1.0 / pow(avg_cn[jat], norm_exp); + radj = rad[jat] * (1.0 - kcnrad * cn(jj) * norm_cn); gamij2 = 1.0 / (radi * radi + radj * radj); tmp = cmat(jj, ii) * erf(r * sqrt(gamij2)) / r; Amat(jj, ii) = Amat(jj, ii) + tmp; Amat(ii, jj) = Amat(ii, jj) + tmp; } - tmp = eta[iat] + kqeta[iat] * qloc(ii) + sqrt(2.0/pi) / radi; + tmp = eta[iat] + kqeta[iat] * qloc(ii) + sqrt(2.0 / pi) / radi; Amat(ii, ii) = Amat(ii, ii) + tmp * cmat(ii, ii) + 1.0; // Set entries for charge constraint Amat(nat, ii) = 1.0; Amat(ii, nat) = 1.0; } - Amat(nat, nat) = 0.0; + Amat(nat, nat) = 0.0; return EXIT_SUCCESS; }; -// Calculate the derivative of the Coulomb matrix w.r.t. the coordinates for EEQ-BC +// Calculate the derivative of the Coulomb matrix w.r.t. the coordinates for +// EEQ-BC int EEQBCModel::get_damat_0d( const TMolecule &mol, const TIVector &realIdx, @@ -595,8 +640,7 @@ int EEQBCModel::get_damat_0d( TVector vec, dG; vec.NewVec(3); dG.NewVec(3); - dgamdr.NewVec(3*n_atoms); - + dgamdr.NewVec(3 * n_atoms); for (int i = 0, ii = 0; i < mol.NAtoms; i++) { ii = realIdx(i); @@ -605,7 +649,7 @@ int EEQBCModel::get_damat_0d( // Effective charge width of i norm_cn = 1.0 / pow(avg_cn[izp], norm_exp); radi = rad[izp] * (1.0 - kcnrad * cn(ii) * norm_cn); - dradcn_i = - rad[izp] * kcnrad * norm_cn; + dradcn_i = -rad[izp] * kcnrad * norm_cn; for (int j = 0, jj = 0; j < i; j++) { jj = realIdx(j); if (jj < 0) continue; @@ -613,21 +657,24 @@ int EEQBCModel::get_damat_0d( jzp = mol.ATNO(j); norm_cn = 1.0 / pow(avg_cn[jzp], norm_exp); radj = rad[jzp] * (1.0 - kcnrad * cn(jj) * norm_cn); - dradcn_j = - rad[jzp] * kcnrad * norm_cn; - gam = 1.0 / (pow(radi,2) + pow(radj,2)); + dradcn_j = -rad[jzp] * kcnrad * norm_cn; + gam = 1.0 / (pow(radi, 2) + pow(radj, 2)); for (int k = 0, kk = 0; k < mol.NAtoms; k++) { kk = realIdx(k); if (kk < 0) continue; // Coulomb interaction of Gaussian charges for (int c = 0; c < 3; c++) { vec(c) = mol.CC(jj, c) - mol.CC(ii, c); - dgamdr(3*kk+c) = -(radi * dradcn_i * dcndr(ii, 3*kk + c) + radj * dradcn_j * dcndr(jj, 3*kk + c)) * pow(gam, 3); + dgamdr(3 * kk + c) = -(radi * dradcn_i * dcndr(ii, 3 * kk + c) + + radj * dradcn_j * dcndr(jj, 3 * kk + c)) * + pow(gam, 3); } } // Explicit derivative r2 = pow(vec(0), 2) + pow(vec(1), 2) + pow(vec(2), 2); arg = gam * gam * r2; - dtmp1 = 2.0 * gam * exp(-arg) / (sqrtpi * r2) - erf(sqrt(arg)) / (r2 *sqrt(r2)); + dtmp1 = 2.0 * gam * exp(-arg) / (sqrtpi * r2) - + erf(sqrt(arg)) / (r2 * sqrt(r2)); // Effective charge width derivative dtmp2 = 2.0 * exp(-arg) / sqrtpi; // Capacitance derivative off-diagonal @@ -640,43 +687,45 @@ int EEQBCModel::get_damat_0d( dG(c) = dtmp1 * vec(c); atrace(ii, c) += -dG(c) * q(jj) * cmat(ii, jj); atrace(jj, c) += +dG(c) * q(ii) * cmat(jj, ii); - dAmatdr(3*ii+c, jj) += -dG(c) * q(ii) * cmat(jj, ii); - dAmatdr(3*jj+c, ii) += +dG(c) * q(jj) * cmat(ii, jj); + dAmatdr(3 * ii + c, jj) += -dG(c) * q(ii) * cmat(jj, ii); + dAmatdr(3 * jj + c, ii) += +dG(c) * q(jj) * cmat(ii, jj); // Effective charge width derivative - atrace(ii, c) += -dtmp2 * q(jj) * dgamdr(3*jj+c) * cmat(ii, jj); - atrace(jj, c) += -dtmp2 * q(ii) * dgamdr(3*ii+c) * cmat(jj, ii); - dAmatdr(3*ii+c, jj) += +dtmp2 * q(ii) * dgamdr(3*ii+c) * cmat(jj, ii); - dAmatdr(3*jj+c, ii) += +dtmp2 * q(jj) * dgamdr(3*jj+c) * cmat(ii, jj); + atrace(ii, c) += -dtmp2 * q(jj) * dgamdr(3 * jj + c) * cmat(ii, jj); + atrace(jj, c) += -dtmp2 * q(ii) * dgamdr(3 * ii + c) * cmat(jj, ii); + dAmatdr(3 * ii + c, jj) += + +dtmp2 * q(ii) * dgamdr(3 * ii + c) * cmat(jj, ii); + dAmatdr(3 * jj + c, ii) += + +dtmp2 * q(jj) * dgamdr(3 * jj + c) * cmat(ii, jj); // Capacitance derivative off-diagonal - atrace(ii, c) += -dtmp3 * q(jj) * dcmatdr(ii, 3*jj+c); - atrace(jj, c) += -dtmp3 * q(ii) * dcmatdr(jj, 3*ii+c); - dAmatdr(3*ii+c, jj) += +dtmp3 * q(ii) * dcmatdr(jj, 3*ii+c); - dAmatdr(3*jj+c, ii) += +dtmp3 * q(jj) * dcmatdr(ii, 3*jj+c); + atrace(ii, c) += -dtmp3 * q(jj) * dcmatdr(ii, 3 * jj + c); + atrace(jj, c) += -dtmp3 * q(ii) * dcmatdr(jj, 3 * ii + c); + dAmatdr(3 * ii + c, jj) += +dtmp3 * q(ii) * dcmatdr(jj, 3 * ii + c); + dAmatdr(3 * jj + c, ii) += +dtmp3 * q(jj) * dcmatdr(ii, 3 * jj + c); // Capacitance derivative diagonal - dAmatdr(3*jj+c, ii) += -dtmp4 * dcmatdr(ii, 3*jj+c); - dAmatdr(3*ii+c, jj) += -dtmp5 * dcmatdr(jj, 3*ii+c); + dAmatdr(3 * jj + c, ii) += -dtmp4 * dcmatdr(ii, 3 * jj + c); + dAmatdr(3 * ii + c, jj) += -dtmp5 * dcmatdr(jj, 3 * ii + c); } - } // jj - dtmp1 = kqeta[izp] * q(ii) * cmat(ii, ii); // Hardness - dtmp2 = -sqrt2pi * dradcn_i / pow(radi, 2) * q(ii) * cmat(ii, ii); // Effective charge width - for (int k = 0, kk = 0; k < mol.NAtoms; k++) { - kk = realIdx(k); - if (kk < 0) continue; - for (int c = 0; c < 3; c++) { - // Hardness derivative - dAmatdr(3*kk+c, ii) += +dtmp1 * dqlocdr(ii, 3*kk+c); - // Effective charge width derivative - dAmatdr(3*kk+c, ii) += +dtmp2 * dcndr(ii, 3*kk+c); - } - } - // Capacitance derivative - dtmp3 = (eta[izp] + kqeta[izp] * qloc(ii) + sqrt2pi / radi) * q(ii); + } // jj + dtmp1 = kqeta[izp] * q(ii) * cmat(ii, ii); // Hardness + dtmp2 = -sqrt2pi * dradcn_i / pow(radi, 2) * q(ii) * + cmat(ii, ii); // Effective charge width + for (int k = 0, kk = 0; k < mol.NAtoms; k++) { + kk = realIdx(k); + if (kk < 0) continue; for (int c = 0; c < 3; c++) { - dAmatdr(3*ii+c, ii) += +dtmp3 * dcmatdr(ii, 3*ii+c); + // Hardness derivative + dAmatdr(3 * kk + c, ii) += +dtmp1 * dqlocdr(ii, 3 * kk + c); + // Effective charge width derivative + dAmatdr(3 * kk + c, ii) += +dtmp2 * dcndr(ii, 3 * kk + c); } -} // ii + } + // Capacitance derivative + dtmp3 = (eta[izp] + kqeta[izp] * qloc(ii) + sqrt2pi / radi) * q(ii); + for (int c = 0; c < 3; c++) { + dAmatdr(3 * ii + c, ii) += +dtmp3 * dcmatdr(ii, 3 * ii + c); + } + } // ii - return EXIT_SUCCESS; }; @@ -685,12 +734,11 @@ int EEQBCModel::get_qloc( const TMolecule &mol, const TIVector &realIdx, const TMatrix &dist, - const double q_tot, // total system charge - TVector &qloc, // Local charge - TMatrix &dqlocdr, // Derivative of local charge w.r.t. atom positions + const double q_tot, // total system charge + TVector &qloc, // Local charge + TMatrix &dqlocdr, // Derivative of local charge w.r.t. atom positions bool lgrad -) -{ +) { const double cutoff = 25.0; TVector cn; // Electronegativity scaled coordination number with EEQ-BC parameters @@ -699,10 +747,11 @@ int EEQBCModel::get_qloc( ncoorderf_norm_exp, ncoorderf_cutoff, ncoorderfen_f_directed, - ncoorderf_cn_max); - const int n_atoms = realIdx.Max() + 1; // Number of atoms + ncoorderf_cn_max + ); + const int n_atoms = realIdx.Max() + 1; // Number of atoms qloc.NewVector(n_atoms); - const double q_tot_norm = q_tot/n_atoms; + const double q_tot_norm = q_tot / n_atoms; ncoord_erf_en.get_ncoord(mol, dist, cn, dqlocdr, lgrad); @@ -715,7 +764,6 @@ int EEQBCModel::get_qloc( return EXIT_SUCCESS; }; - // Calculate the coordination number, forwarding to get_ncoord int EEQBCModel::get_cn( const TMolecule &mol, @@ -724,53 +772,54 @@ int EEQBCModel::get_cn( TVector &cn, TMatrix &dcndr, bool lgrad -) -{ +) { int info{0}; info = ncoord_erf.get_ncoord(mol, realIdx, dist, cn, dcndr, lgrad); if (info != EXIT_SUCCESS) { - throw std::runtime_error("EEQBCModel::get_cn: Failed to compute coordination numbers."); + throw std::runtime_error( + "EEQBCModel::get_cn: Failed to compute coordination numbers." + ); } return info; }; -// Get capacitance for bond between atoms i and j for EEQ-BC +// Get capacitance for bond between atoms i and j for EEQ-BC int EEQBCModel::get_cpair( - int iat, // atom type of i - int jat, // atom type of j - double &dist_ij, // distance between atom j to atom i - double &c_ij // Out: Capacitance for bond ij + int iat, // atom type of i + int jat, // atom type of j + double &dist_ij, // distance between atom j to atom i + double &c_ij // Out: Capacitance for bond ij ) const { - int iat_zero = iat; // convert to index counting from zero (e.g. H=0) - int jat_zero = jat; // convert to index counting from zero (e.g. H=0) + int iat_zero = iat; // convert to index counting from zero (e.g. H=0) + int jat_zero = jat; // convert to index counting from zero (e.g. H=0) int ij_at; if (iat_zero > jat_zero) { - ij_at = (jat_zero + iat_zero*(iat_zero - 1)/2) - 1; + ij_at = (jat_zero + iat_zero * (iat_zero - 1) / 2) - 1; } else { - ij_at = (iat_zero + jat_zero*(jat_zero - 1)/2) - 1; + ij_at = (iat_zero + jat_zero * (jat_zero - 1) / 2) - 1; } // Calculate the argument of the error function - double arg = - kbc*(dist_ij - rvdw[ij_at])/(rvdw[ij_at]); - c_ij = sqrt(cap[iat]*cap[jat])*0.5*(1.0 + erf(arg)); + double arg = -kbc * (dist_ij - rvdw[ij_at]) / (rvdw[ij_at]); + c_ij = sqrt(cap[iat] * cap[jat]) * 0.5 * (1.0 + erf(arg)); return EXIT_SUCCESS; } -// Get derivative of the capacitance for bond between atoms i and j for EEQ-BC +// Get derivative of the capacitance for bond between atoms i and j for EEQ-BC int EEQBCModel::get_dcpair( - double dist_ij, // distance between atom j to atom i - double rvdw_ijat, // pairwise van der Waals radii for ij atom types - double cap_ij, // product of bond capacitances for atom types of i and j - TVector &vec, // Vector from j to i - TVector &dcdr_ij // Out: Capacitance for bond ij + double dist_ij, // distance between atom j to atom i + double rvdw_ijat, // pairwise van der Waals radii for ij atom types + double cap_ij, // product of bond capacitances for atom types of i and j + TVector &vec, // Vector from j to i + TVector &dcdr_ij // Out: Capacitance for bond ij ) const { // Calculate the argument of the error function // arg = -(kbc * (r1 - rvdw ) / rvdw)**2 - double arg = kbc * (dist_ij - rvdw_ijat) / rvdw_ijat; + double arg = kbc * (dist_ij - rvdw_ijat) / rvdw_ijat; // dtmp = sqrt(capi * capj) * kbc * exp(arg) / (sqrtpi * rvdw) - double dtmp = sqrt(cap_ij) * kbc * exp( - pow(arg, 2)) / (sqrt(pi) * rvdw_ijat); + double dtmp = sqrt(cap_ij) * kbc * exp(-pow(arg, 2)) / (sqrt(pi) * rvdw_ijat); for (int c = 0; c < 3; c++) { dcdr_ij(c) = dtmp * vec(c) / dist_ij; } @@ -780,33 +829,32 @@ int EEQBCModel::get_dcpair( // Get the capacitance matrix int EEQBCModel::get_cmat( - const TMolecule &mol, // molecular geometry - const TIVector &realIdx, // The real atom indices (for excluding dummy atoms) + const TMolecule &mol, // molecular geometry + const TIVector &realIdx, // The real atom indices (for excluding dummy atoms) const TMatrix &dist, // atom distances - TMatrix &cmat // Out: Capacitance matrix + TMatrix &cmat // Out: Capacitance matrix ) { - int iat; // atom type of i - int jat; // atom type of j - double c_ij; // Capacitance for bond between atoms i and j + int iat; // atom type of i + int jat; // atom type of j + double c_ij; // Capacitance for bond between atoms i and j double dist_ij; // distance between atoms i and j const int n_atoms = realIdx.Max() + 1; cmat.NewMatrix(n_atoms + 1, n_atoms + 1); - for (int i = 0, ii = 0; i < mol.NAtoms; i++) - { + for (int i = 0, ii = 0; i < mol.NAtoms; i++) { ii = realIdx(i); if (ii < 0) continue; iat = mol.ATNO(i); - for (int j = 0, jj = 0; j < i; j++) - { + for (int j = 0, jj = 0; j < i; j++) { jj = realIdx(j); if (jj < 0) continue; jat = mol.ATNO(j); - dist_ij = dist(ii,jj); + dist_ij = dist(ii, jj); get_cpair(iat, jat, dist_ij, c_ij); // Calulate Off-diagonal elements; bond capacitances - cmat(ii, jj) = - c_ij; - cmat(jj, ii) = - c_ij; - // Calculate diagonal elements; self-capacitance as the negative sum of bond capacitances + cmat(ii, jj) = -c_ij; + cmat(jj, ii) = -c_ij; + // Calculate diagonal elements; self-capacitance as the negative sum of + // bond capacitances cmat(ii, ii) = cmat(ii, ii) + c_ij; cmat(jj, jj) = cmat(jj, jj) + c_ij; } @@ -817,52 +865,51 @@ int EEQBCModel::get_cmat( // Get the derivative of the capacitance matrix int EEQBCModel::get_dcmatdr( - const TMolecule &mol, // molecular geometry - const TIVector &realIdx, // The real atom indices (for excluding dummy atoms) + const TMolecule &mol, // molecular geometry + const TIVector &realIdx, // The real atom indices (for excluding dummy atoms) const TMatrix &dist, // atom distances - TMatrix &dcmatdr // Out: Capacitance matrix + TMatrix &dcmatdr // Out: Capacitance matrix ) { - int iat; // atom type of i - int jat; // atom type of j - int ij_min, ij_max; // min and max from i and j - int ij_at; // pairwise index for atom types of i and j - double c_ij; // Capacitance for bond between atoms i and j - double dist_ij; // distance between atoms i and j - double rvdw_ijat; // pairwise van der Waals radii for ij atom types - double cap_ij; // product of bond capacitances for atom types of i and j + int iat; // atom type of i + int jat; // atom type of j + int ij_min, ij_max; // min and max from i and j + int ij_at; // pairwise index for atom types of i and j + double c_ij; // Capacitance for bond between atoms i and j + double dist_ij; // distance between atoms i and j + double rvdw_ijat; // pairwise van der Waals radii for ij atom types + double cap_ij; // product of bond capacitances for atom types of i and j TVector vec; // Vector from i to j vec.NewVec(3); TVector dcdr_ij; // Part ij of capacitance derivative dcdr_ij.NewVec(3); const int n_atoms = realIdx.Max() + 1; dcmatdr.NewMat(n_atoms, 3 * n_atoms); - for (int i = 0, ii = 0; i < mol.NAtoms; i++) - { + for (int i = 0, ii = 0; i < mol.NAtoms; i++) { ii = realIdx(i); if (ii < 0) continue; iat = mol.ATNO(i); - for (int j = 0, jj = 0; j < i; j++) - { + for (int j = 0, jj = 0; j < i; j++) { jj = realIdx(j); if (jj < 0) continue; jat = mol.ATNO(j); for (int c = 0; c < 3; c++) { vec(c) = mol.CC(jj, c) - mol.CC(ii, c); } - dist_ij = dist(ii,jj); + dist_ij = dist(ii, jj); ij_min = std::min(iat, jat); ij_max = std::max(iat, jat); - ij_at = ij_min + ij_max * (ij_max - 1)/2 - 1; + ij_at = ij_min + ij_max * (ij_max - 1) / 2 - 1; rvdw_ijat = rvdw[ij_at]; cap_ij = cap[iat] * cap[jat]; - get_dcpair( dist_ij, rvdw_ijat, cap_ij, vec, dcdr_ij); + get_dcpair(dist_ij, rvdw_ijat, cap_ij, vec, dcdr_ij); for (int c = 0; c < 3; c++) { - // Calculate Off-diagonal elements; bond capacitances - dcmatdr(jj, 3*ii+c) = - dcdr_ij(c); - dcmatdr(ii, 3*jj+c) = + dcdr_ij(c); - // Calculate diagonal elements; self-capacitance as the negative sum of bond capacitances - dcmatdr(ii, 3*ii+c) = dcmatdr(ii, 3*ii+c) + dcdr_ij(c); - dcmatdr(jj, 3*jj+c) = dcmatdr(jj, 3*jj+c) - dcdr_ij(c); + // Calculate Off-diagonal elements; bond capacitances + dcmatdr(jj, 3 * ii + c) = -dcdr_ij(c); + dcmatdr(ii, 3 * jj + c) = +dcdr_ij(c); + // Calculate diagonal elements; self-capacitance as the negative sum of + // bond capacitances + dcmatdr(ii, 3 * ii + c) = dcmatdr(ii, 3 * ii + c) + dcdr_ij(c); + dcmatdr(jj, 3 * jj + c) = dcmatdr(jj, 3 * jj + c) - dcdr_ij(c); } } } @@ -874,78 +921,79 @@ int EEQBCModel::get_dcmatdr( // A * q = b with Coulomb matrix A and partial charges q // b = X * C with electronegativity vector X and capacitance matrix C int EEQBCModel::get_xvec( - const TMolecule &mol, // molecular geometry - const TIVector &realIdx, // The real atom indices (for excluding dummy atoms) - const TMatrix &dist, // atom distances + const TMolecule &mol, // molecular geometry + const TIVector &realIdx, // The real atom indices (for excluding dummy atoms) + const TMatrix &dist, // atom distances const TVector &cn, TMatrix &cmat, // capacitance matrix - int charge, // total charge of the system + int charge, // total charge of the system TVector &qloc, - TVector &xvec // Out: electronegativity vector + TVector &xvec // Out: electronegativity vector ) { int info{0}; const int n_atoms = realIdx.Max() + 1; - TVector x_tmp; // dummy for xvec, has dimension N+1 including the constraint + TVector + x_tmp; // dummy for xvec, has dimension N+1 including the constraint TMatrix dqlocdr; - x_tmp.NewVector(n_atoms+1); - int i_atno; // atomic number of atom i + x_tmp.NewVector(n_atoms + 1); + int i_atno; // atomic number of atom i // get local charge info = get_qloc(mol, realIdx, dist, charge, qloc, dqlocdr, false); if (info != EXIT_SUCCESS) return info; - for (int i = 0, ii = 0; i < mol.NAtoms; i++) - { + for (int i = 0, ii = 0; i < mol.NAtoms; i++) { ii = realIdx(i); if (ii < 0) continue; i_atno = mol.ATNO(i); - x_tmp(ii) = - chi[i_atno] + kcnchi[i_atno]*cn(ii) + kqchi[i_atno]*qloc(ii); + x_tmp(ii) = + -chi[i_atno] + kcnchi[i_atno] * cn(ii) + kqchi[i_atno] * qloc(ii); } - + xvec.NewVector(n_atoms + 1); xvec(n_atoms) = charge; - for (int i = 0, ii = 0; i < mol.NAtoms; i++) - { + for (int i = 0, ii = 0; i < mol.NAtoms; i++) { ii = realIdx(i); if (ii < 0) continue; - for (int j = 0, jj = 0; j < mol.NAtoms; j++) - { + for (int j = 0, jj = 0; j < mol.NAtoms; j++) { jj = realIdx(j); if (jj < 0) continue; xvec(ii) = xvec(ii) + cmat(ii, jj) * x_tmp(jj); } } - return EXIT_SUCCESS; + return EXIT_SUCCESS; } // Get the right-hand side vector b and its derivative w.r.t. CN // A * q = b with Coulomb matrix A and partial charges q // b = X * C with electronegativity vector X and capacitance matrix C int EEQBCModel::get_xvec_derivs( - const TMolecule &mol, // molecular geometry - const TIVector &realIdx, // The real atom indices (for excluding dummy atoms) + const TMolecule &mol, // molecular geometry + const TIVector &realIdx, // The real atom indices (for excluding dummy atoms) const TMatrix &dist, // atom distances - const TVector &cn, // coordination number (CN) + const TVector &cn, // coordination number (CN) const TMatrix &dcndr, // coordination number derivative - TMatrix &cmat, // capacitance matrix - int charge, // total charge of the system - TVector &xvec, // Out: electronegativity vector - TMatrix &dxvecdr, // derivative of the entire right hand side w.r.t. atom positions + TMatrix &cmat, // capacitance matrix + int charge, // total charge of the system + TVector &xvec, // Out: electronegativity vector + TMatrix + &dxvecdr, // derivative of the entire right hand side w.r.t. atom positions TVector &qloc, - TMatrix &dqlocdr, // derivative of qloc w.r.t. atom positions + TMatrix &dqlocdr, // derivative of qloc w.r.t. atom positions TMatrix &dcmatdr ) { int info{0}; const int n_atoms = realIdx.Max() + 1; - int i_atno; // atomic number of atom i - TVector x_tmp; // dummy for xvec, has dimension N+1 including the constraint + int i_atno; // atomic number of atom i + TVector + x_tmp; // dummy for xvec, has dimension N+1 including the constraint TMatrix dxvecdr_tmp; TMatrix cmat_tmp; - x_tmp.NewVector(n_atoms+1); - dxvecdr_tmp.NewMat(n_atoms, 3*n_atoms); + x_tmp.NewVector(n_atoms + 1); + dxvecdr_tmp.NewMat(n_atoms, 3 * n_atoms); cmat_tmp.NewMat(n_atoms, n_atoms); - dxvecdr.NewMat(n_atoms, 3*n_atoms); + dxvecdr.NewMat(n_atoms, 3 * n_atoms); // calculate derivative of the capacitance info = get_dcmatdr(mol, realIdx, dist, dcmatdr); @@ -955,61 +1003,60 @@ int EEQBCModel::get_xvec_derivs( bool lgrad = true; // calculate dqlocdr info = get_qloc(mol, realIdx, dist, charge, qloc, dqlocdr, lgrad); if (info != EXIT_SUCCESS) return info; - for (int i=0, ii = 0; i < mol.NAtoms; i++) - { + for (int i = 0, ii = 0; i < mol.NAtoms; i++) { ii = realIdx(i); if (ii < 0) continue; i_atno = mol.ATNO(i); - for (int j = 0, jj = 0; j < mol.NAtoms; j++) - { + for (int j = 0, jj = 0; j < mol.NAtoms; j++) { jj = realIdx(j); if (jj < 0) continue; // setup C-matrix with correct size - cmat_tmp(ii,jj) = cmat(ii,jj); - for (int c = 0; c < 3; c++) - { - dxvecdr_tmp(ii, 3*jj+c) = kcnchi[i_atno] * dcndr(ii, 3*jj+c) + dxvecdr_tmp(ii, 3*jj+c); - dxvecdr_tmp(ii, 3*jj+c) = kqchi[i_atno] * dqlocdr(ii, 3*jj+c) + dxvecdr_tmp(ii, 3*jj+c); + cmat_tmp(ii, jj) = cmat(ii, jj); + for (int c = 0; c < 3; c++) { + dxvecdr_tmp(ii, 3 * jj + c) = + kcnchi[i_atno] * dcndr(ii, 3 * jj + c) + dxvecdr_tmp(ii, 3 * jj + c); + dxvecdr_tmp(ii, 3 * jj + c) = + kqchi[i_atno] * dqlocdr(ii, 3 * jj + c) + dxvecdr_tmp(ii, 3 * jj + c); } } } - + BLAS_Add_Mat_x_Mat(dxvecdr, cmat_tmp, dxvecdr_tmp, false, false, 1.0); - for (int i = 0, ii = 0; i < mol.NAtoms; i++) - { + for (int i = 0, ii = 0; i < mol.NAtoms; i++) { ii = realIdx(i); if (ii < 0) continue; i_atno = mol.ATNO(i); - x_tmp(ii) = - chi[i_atno] + kcnchi[i_atno]*cn(ii) + kqchi[i_atno]*qloc(ii); + x_tmp(ii) = + -chi[i_atno] + kcnchi[i_atno] * cn(ii) + kqchi[i_atno] * qloc(ii); } - + xvec.NewVector(n_atoms + 1); xvec(n_atoms) = charge; BLAS_Add_Mat_x_Vec(xvec, cmat, x_tmp, false, 1.0); - for (int i = 0, ii = 0; i < mol.NAtoms; i++) - { + for (int i = 0, ii = 0; i < mol.NAtoms; i++) { ii = realIdx(i); if (ii < 0) continue; - for (int j = 0, jj = 0; j < i; j++) - { + for (int j = 0, jj = 0; j < i; j++) { jj = realIdx(j); if (jj < 0) continue; for (int c = 0; c < 3; c++) { // setup dCij/dR * Xj - dxvecdr(ii, 3*ii+c) += x_tmp(jj) * dcmatdr(jj, 3*ii+c); - dxvecdr(jj, 3*jj+c) += x_tmp(ii) * dcmatdr(ii, 3*jj+c); - dxvecdr(jj, 3*ii+c) += (x_tmp(ii)-x_tmp(jj)) * dcmatdr(jj, 3*ii+c); - dxvecdr(ii, 3*jj+c) += (x_tmp(jj)-x_tmp(ii)) * dcmatdr(ii, 3*jj+c); + dxvecdr(ii, 3 * ii + c) += x_tmp(jj) * dcmatdr(jj, 3 * ii + c); + dxvecdr(jj, 3 * jj + c) += x_tmp(ii) * dcmatdr(ii, 3 * jj + c); + dxvecdr(jj, 3 * ii + c) += + (x_tmp(ii) - x_tmp(jj)) * dcmatdr(jj, 3 * ii + c); + dxvecdr(ii, 3 * jj + c) += + (x_tmp(jj) - x_tmp(ii)) * dcmatdr(ii, 3 * jj + c); } } - dxvecdr(ii, 3*ii ) += x_tmp(ii) * dcmatdr(ii, 3*ii ); - dxvecdr(ii, 3*ii+1) += x_tmp(ii) * dcmatdr(ii, 3*ii+1); - dxvecdr(ii, 3*ii+2) += x_tmp(ii) * dcmatdr(ii, 3*ii+2); + dxvecdr(ii, 3 * ii) += x_tmp(ii) * dcmatdr(ii, 3 * ii); + dxvecdr(ii, 3 * ii + 1) += x_tmp(ii) * dcmatdr(ii, 3 * ii + 1); + dxvecdr(ii, 3 * ii + 2) += x_tmp(ii) * dcmatdr(ii, 3 * ii + 2); } - return EXIT_SUCCESS; + return EXIT_SUCCESS; } } // namespace multicharge diff --git a/src/dftd_model.cpp b/src/dftd_model.cpp index e76f30f..c63c9e1 100644 --- a/src/dftd_model.cpp +++ b/src/dftd_model.cpp @@ -376,4 +376,4 @@ bool is_exceptional(double val) { return std::isnan(val) || (fabs(val) > std::numeric_limits::max()); } -} // namespace dftd4 \ No newline at end of file +} // namespace dftd4 diff --git a/src/dftd_ncoord.cpp b/src/dftd_ncoord.cpp index ec229d5..486d94f 100644 --- a/src/dftd_ncoord.cpp +++ b/src/dftd_ncoord.cpp @@ -27,8 +27,8 @@ #include "dftd_geometry.h" #include "dftd_matrix.h" -#include "dftd_ncoord.h" #include "dftd_multicharge_param.h" +#include "dftd_ncoord.h" namespace dftd4 { @@ -38,14 +38,11 @@ NCoordBase::NCoordBase( double optional_cutoff, double optional_f_directed, double optional_cn_max, - const double* optional_rcov -) : kcn(optional_kcn), - norm_exp(optional_norm_exp), - cutoff(optional_cutoff), - f_directed(optional_f_directed), - cn_max(optional_cn_max), - rcov(optional_rcov) -{} + const double *optional_rcov +) + : kcn(optional_kcn), norm_exp(optional_norm_exp), cutoff(optional_cutoff), + f_directed(optional_f_directed), cn_max(optional_cn_max), + rcov(optional_rcov) {} /** * Covalent radii (taken from Pyykko and Atsumi, Chem. Eur. J. 15, 2009, @@ -117,8 +114,8 @@ const double NCoordBase::rad[119]{ 3.98102303586706, 3.72905955258434, 3.95582668753879, }; - -static const double hlfosqrtpi = 1.0 / 1.7724538509055159; // one over square root of pi +static const double hlfosqrtpi = + 1.0 / 1.7724538509055159; // one over square root of pi /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// @@ -186,7 +183,7 @@ int NCoordBase::get_ncoord( const int nat = realIdx.Max() + 1; cn.NewVector(nat); if (lgrad) dcndr.NewMatrix(nat, 3 * nat); - + if (lgrad) { info = dr_ncoord_base(mol, realIdx, dist, cn, dcndr); } else { @@ -194,7 +191,8 @@ int NCoordBase::get_ncoord( } if (info != EXIT_SUCCESS) return info; - if (cn_max > 0.0) { // cn_max = -1.0 for EEQ-BC for cn and qloc; using NCoordErf and NCoordErfEN + if (cn_max > 0.0) { // cn_max = -1.0 for EEQ-BC for cn and qloc; using + // NCoordErf and NCoordErfEN info = cut_coordination_number(cn_max, cn, dcndr, lgrad); if (info != EXIT_SUCCESS) return info; } @@ -268,19 +266,19 @@ int NCoordBase::dr_ncoord_base( cn(jj) += countf * f_directed; dcountf = f_en * dr_count_fct(r, rcovij) / pow(rcovij, norm_exp); - dcndr(jj, 3 * jj ) -= dcountf * rx * f_directed; + dcndr(jj, 3 * jj) -= dcountf * rx * f_directed; dcndr(jj, 3 * jj + 1) -= dcountf * ry * f_directed; dcndr(jj, 3 * jj + 2) -= dcountf * rz * f_directed; - dcndr(jj, 3 * ii ) += dcountf * rx * f_directed; + dcndr(jj, 3 * ii) += dcountf * rx * f_directed; dcndr(jj, 3 * ii + 1) += dcountf * ry * f_directed; dcndr(jj, 3 * ii + 2) += dcountf * rz * f_directed; - dcndr(ii, 3 * jj ) -= dcountf * rx; + dcndr(ii, 3 * jj) -= dcountf * rx; dcndr(ii, 3 * jj + 1) -= dcountf * ry; dcndr(ii, 3 * jj + 2) -= dcountf * rz; - dcndr(ii, 3 * ii ) += dcountf * rx; + dcndr(ii, 3 * ii) += dcountf * rx; dcndr(ii, 3 * ii + 1) += dcountf * ry; dcndr(ii, 3 * ii + 2) += dcountf * rz; } @@ -293,32 +291,32 @@ int NCoordBase::dr_ncoord_base( /////////////////////////////////////////////////////////////////////////////// double NCoordErf::count_fct(double r, double rc) const { - return 0.5 * (1.0 + erf(-kcn * (r - rc)/pow(rc, norm_exp))); + return 0.5 * (1.0 + erf(-kcn * (r - rc) / pow(rc, norm_exp))); } double NCoordErf::dr_count_fct(double r, double rc) const { const double rc_norm_exp = pow(rc, norm_exp); - const double exponent_term = -pow(kcn * (r - rc)/rc_norm_exp, 2); + const double exponent_term = -pow(kcn * (r - rc) / rc_norm_exp, 2); return -kcn * hlfosqrtpi * exp(exponent_term); } double NCoordErfEN::count_fct(double r, double rc) const { - return 0.5 * (1.0 + erf(-kcn * (r - rc)/pow(rc, norm_exp))); + return 0.5 * (1.0 + erf(-kcn * (r - rc) / pow(rc, norm_exp))); } double NCoordErfEN::dr_count_fct(double r, double rc) const { const double rc_norm_exp = pow(rc, norm_exp); - const double exponent_term = -pow(kcn * (r - rc)/rc_norm_exp, 2); + const double exponent_term = -pow(kcn * (r - rc) / rc_norm_exp, 2); return -kcn * hlfosqrtpi * exp(exponent_term); } double NCoordErfD4::count_fct(double r, double rc) const { - return 0.5 * (1.0 + erf(-kcn * (r - rc)/pow(rc, norm_exp))); + return 0.5 * (1.0 + erf(-kcn * (r - rc) / pow(rc, norm_exp))); } double NCoordErfD4::dr_count_fct(double r, double rc) const { const double rc_norm_exp = pow(rc, norm_exp); - const double exponent_term = -pow(kcn * (r - rc)/rc_norm_exp, 2); + const double exponent_term = -pow(kcn * (r - rc) / rc_norm_exp, 2); return -kcn * hlfosqrtpi * exp(exponent_term); } @@ -337,12 +335,13 @@ int NCoordErf::cut_coordination_number( bool lgrad ) { if (lgrad) { - // cutting the cn is not (anti)symmetric, so dcndr is not antisymmetric anymore + // cutting the cn is not (anti)symmetric, so dcndr is not antisymmetric + // anymore double dcnpdcn; for (int i = 0; i != cn.N; i++) { dcnpdcn = dlog_cn_cut(cn_max, cn(i)); for (int j = 0; j != cn.N; j++) { - dcndr(i, 3 * j ) *= dcnpdcn; + dcndr(i, 3 * j) *= dcnpdcn; dcndr(i, 3 * j + 1) *= dcnpdcn; dcndr(i, 3 * j + 2) *= dcnpdcn; } diff --git a/test/main.cpp b/test/main.cpp index 7517de9..58ca78c 100644 --- a/test/main.cpp +++ b/test/main.cpp @@ -24,9 +24,9 @@ #include "test_disp2.h" #include "test_ghost.h" #include "test_grad.h" +#include "test_multi.h" #include "test_ncoord.h" #include "test_param.h" -#include "test_multi.h" enum test { invalid, diff --git a/test/molecules.h b/test/molecules.h index 4b27cf6..398ebb6 100644 --- a/test/molecules.h +++ b/test/molecules.h @@ -145,10 +145,10 @@ static const char hydroxide_atoms_A[hydroxide_n_A][3]{ static const double hydroxide_coord_A[hydroxide_n_A * 3]{ +0.00000000000000, +0.00000000000000, - -0.01000000000000, // Oxygen + -0.01000000000000, // Oxygen +0.00000000000000, +0.00000000000000, - +1.80000000000000, // Hydrogen + +1.80000000000000, // Hydrogen }; // Hydroxide ion (OH-) sorting "B" @@ -161,10 +161,10 @@ static const char hydroxide_atoms_B[hydroxide_n_B][3]{ static const double hydroxide_coord_B[hydroxide_n_B * 3]{ +0.00000000000000, +0.00000000000000, - +1.80000000000000, // Hydrogen + +1.80000000000000, // Hydrogen +0.00000000000000, +0.00000000000000, - -0.01000000000000, // Oxygen + -0.01000000000000, // Oxygen }; // MB16_43: 01 @@ -367,121 +367,48 @@ static const double actinides_coord[actinides_n * 3]{ static const int amalgam_n{56}; static const int amalgam_charge{0}; static const char amalgam_atoms[amalgam_n][3]{ - "he", - "ne", - "ar", - "kr", - "xe", - "rn", - "li", - "b", - "be", - "c", - "h", - "o", - "h", - "n", - "h", - "o", - "c", - "c", - "f", - "cl", - "c", - "c", - "c", - "h", - "c", - "br", - "at", - "i", - "na", - "al", - "mg", - "h", - "si", - "p", - "h", - "s", - "h", - "c", - "c", - "h", - "h", - "o", - "h", - "h", - "o", - "h", - "h", - "se", - "h", - "h", - "te", - "h", - "h", - "po", - "h", - "h" + "he", "ne", "ar", "kr", "xe", "rn", "li", "b", "be", "c", "h", "o", + "h", "n", "h", "o", "c", "c", "f", "cl", "c", "c", "c", "h", + "c", "br", "at", "i", "na", "al", "mg", "h", "si", "p", "h", "s", + "h", "c", "c", "h", "h", "o", "h", "h", "o", "h", "h", "se", + "h", "h", "te", "h", "h", "po", "h", "h" }; static const double amalgam_coord[amalgam_n * 3]{ - -8.24412055, -6.58780979, -0.91570650, - -6.42286818, 3.90712547, 4.86500198, - -4.90737238, -1.95282939, 7.86825624, - -0.37726965, 4.92890868, 0.95588204, - 13.38555226, 2.11718711, 1.81147578, - 13.15321224, 2.33063559, -5.87115854, - -7.65859324, -3.86785454, -3.03173103, - -8.90082657, -1.51503593, 1.95474829, - -7.15048995, -0.24936176, -0.62038223, - -4.29597130, -1.27062930, 0.62721393, - -10.72806234, -1.93304209, 3.29657114, - -2.08637070, -0.49174028, 0.81639801, - -7.07902488, -3.71571695, 4.64117407, - -4.59992498, -3.76766281, 1.88857834, - -3.52261371, -3.71637066, 3.48719798, - -7.19030864, -3.91148428, 2.82109087, - 0.40738064, -2.42265922, -3.49890723, - 1.60194914, -0.09413544, -3.65055172, - 2.22710681, 3.76932919, -5.71850741, - -1.36786746, 3.07862751, -9.79436860, - 0.99258997, 1.54015982, -5.57686673, - -0.78697416, 0.96614072, -7.40879667, - -2.02138722, -1.34900108, -7.21789800, - 2.97566733, 0.47460381, -2.23605219, - -1.43901063, -3.02645297, -5.27319702, - -4.52048514, -2.13126179, -9.69487380, - 1.50705279, -5.00133236, -0.44613628, - -3.34847853, -6.54426878, -4.98924265, - 7.39326107, -4.78317478, -2.73955769, - 6.73805630, 1.57365902, -5.61518652, - 6.57487539, 4.43501257, -1.01996941, - 7.67481939, -1.07984981, -2.56613001, - 7.07714209, -0.94539154, -9.82369772, - 8.06046833, -4.55945339, -8.32690067, - 4.24002482, -1.09444619, -9.48623334, - 4.83030003, -6.50824697, -6.76694609, - 3.16857808, -6.16789369, -8.60564090, - 5.65038102, -12.11407383, -2.16358858, - 7.49828789, -10.84757354, -1.04222812, - 3.98947118, -11.17048194, -2.88947999, - 5.72477568, -14.14203461, -2.34561989, - 7.47130878, -8.31368664, -0.71866358, - 9.36082193, -7.70479742, -0.60920006, - 9.17502500, -11.80483919, -0.30762578, - -6.62601245, 3.21948915, -0.72736379, - -6.32322321, 3.63571554, -2.46098961, - -5.00474256, 3.33318462, 0.10681509, - -11.53711695, -5.76950992, -5.74618428, - -11.11536735, -4.21494504, -7.93442044, - -10.46118337, -7.94640025, -6.97071464, - 12.82621494, -6.62177000, -1.60795607, - 11.38819319, -4.20140874, -2.84890169, - 13.91845142, -4.62346343, 0.64687720, - 10.24369296, -9.23027806, -6.33500557, - 12.98362119, -8.51243817, -7.95590708, - 11.88048032, -12.04935553, -5.38433128 + -8.24412055, -6.58780979, -0.91570650, -6.42286818, 3.90712547, + 4.86500198, -4.90737238, -1.95282939, 7.86825624, -0.37726965, + 4.92890868, 0.95588204, 13.38555226, 2.11718711, 1.81147578, + 13.15321224, 2.33063559, -5.87115854, -7.65859324, -3.86785454, + -3.03173103, -8.90082657, -1.51503593, 1.95474829, -7.15048995, + -0.24936176, -0.62038223, -4.29597130, -1.27062930, 0.62721393, + -10.72806234, -1.93304209, 3.29657114, -2.08637070, -0.49174028, + 0.81639801, -7.07902488, -3.71571695, 4.64117407, -4.59992498, + -3.76766281, 1.88857834, -3.52261371, -3.71637066, 3.48719798, + -7.19030864, -3.91148428, 2.82109087, 0.40738064, -2.42265922, + -3.49890723, 1.60194914, -0.09413544, -3.65055172, 2.22710681, + 3.76932919, -5.71850741, -1.36786746, 3.07862751, -9.79436860, + 0.99258997, 1.54015982, -5.57686673, -0.78697416, 0.96614072, + -7.40879667, -2.02138722, -1.34900108, -7.21789800, 2.97566733, + 0.47460381, -2.23605219, -1.43901063, -3.02645297, -5.27319702, + -4.52048514, -2.13126179, -9.69487380, 1.50705279, -5.00133236, + -0.44613628, -3.34847853, -6.54426878, -4.98924265, 7.39326107, + -4.78317478, -2.73955769, 6.73805630, 1.57365902, -5.61518652, + 6.57487539, 4.43501257, -1.01996941, 7.67481939, -1.07984981, + -2.56613001, 7.07714209, -0.94539154, -9.82369772, 8.06046833, + -4.55945339, -8.32690067, 4.24002482, -1.09444619, -9.48623334, + 4.83030003, -6.50824697, -6.76694609, 3.16857808, -6.16789369, + -8.60564090, 5.65038102, -12.11407383, -2.16358858, 7.49828789, + -10.84757354, -1.04222812, 3.98947118, -11.17048194, -2.88947999, + 5.72477568, -14.14203461, -2.34561989, 7.47130878, -8.31368664, + -0.71866358, 9.36082193, -7.70479742, -0.60920006, 9.17502500, + -11.80483919, -0.30762578, -6.62601245, 3.21948915, -0.72736379, + -6.32322321, 3.63571554, -2.46098961, -5.00474256, 3.33318462, + 0.10681509, -11.53711695, -5.76950992, -5.74618428, -11.11536735, + -4.21494504, -7.93442044, -10.46118337, -7.94640025, -6.97071464, + 12.82621494, -6.62177000, -1.60795607, 11.38819319, -4.20140874, + -2.84890169, 13.91845142, -4.62346343, 0.64687720, 10.24369296, + -9.23027806, -6.33500557, 12.98362119, -8.51243817, -7.95590708, + 11.88048032, -12.04935553, -5.38433128 }; #endif // MOLECULES_H diff --git a/test/test_ghost.cpp b/test/test_ghost.cpp index dbd0090..50fc154 100644 --- a/test/test_ghost.cpp +++ b/test/test_ghost.cpp @@ -82,8 +82,9 @@ int test_water( q.NewVector(nat); // calculate partial charges from EEQ model - info = - chrg_model.get_charges(mol, realIdx, dist, charge, cn_eeq_default, q, dqdr, false); + info = chrg_model.get_charges( + mol, realIdx, dist, charge, cn_eeq_default, q, dqdr, false + ); if (info != EXIT_SUCCESS) return info; // compare to ref @@ -152,7 +153,9 @@ int test_water( if (info != EXIT_SUCCESS) return info; dqdr.NewMatrix(3 * nat, nat); - info = chrg_model.get_charges(mol, realIdx, dist, charge, cutoff.cn_eeq, q, dqdr, lgrad); + info = chrg_model.get_charges( + mol, realIdx, dist, charge, cutoff.cn_eeq, q, dqdr, lgrad + ); if (info != EXIT_SUCCESS) return info; info = get_dispersion(mol, realIdx, charge, d4, par, cutoff, energy, d4grad); diff --git a/test/test_grad.cpp b/test/test_grad.cpp index 11d9226..18d8bb4 100644 --- a/test/test_grad.cpp +++ b/test/test_grad.cpp @@ -18,10 +18,10 @@ #include #include #include +#include #include #include #include -#include #include "molecules.h" #include "test_grad.h" @@ -169,11 +169,7 @@ int test_tpss0d4mbd_rost61m1() { return test_numgrad(mol, charge, par); } -int test_numgrad_dqdr_eeq( - int n, - const char atoms[][3], - const double coord[] -) { +int test_numgrad_dqdr_eeq(int n, const char atoms[][3], const double coord[]) { // assemble molecule int info; TMolecule mol; @@ -185,9 +181,9 @@ int test_numgrad_dqdr_eeq( TMatrix dist; dist.NewMat(mol.NAtoms, mol.NAtoms); - TMatrix num_dqdr; // numerical gradient of the partial charges + TMatrix num_dqdr; // numerical gradient of the partial charges num_dqdr.NewMat(3 * mol.NAtoms, mol.NAtoms); - TMatrix analytic_dqdr; // analytical gradient of the partial charges + TMatrix analytic_dqdr; // analytical gradient of the partial charges analytic_dqdr.NewMat(3 * mol.NAtoms, mol.NAtoms); multicharge::EEQModel eeq_model; TVector q; @@ -195,7 +191,6 @@ int test_numgrad_dqdr_eeq( q.NewVec(mol.NAtoms); dqdr.NewMat(3 * mol.NAtoms, mol.NAtoms); - TCutoff cutoff; // masking (nothing excluded) @@ -209,8 +204,9 @@ int test_numgrad_dqdr_eeq( // analytical gradient calc_distances(mol, realIdx, dist); - info = - eeq_model.get_charges(mol, realIdx, dist, 0, cutoff.cn_eeq, q, analytic_dqdr, true); + info = eeq_model.get_charges( + mol, realIdx, dist, 0, cutoff.cn_eeq, q, analytic_dqdr, true + ); if (info != EXIT_SUCCESS) return info; // calculate numerical gradient via finite difference method @@ -220,19 +216,22 @@ int test_numgrad_dqdr_eeq( q_r.NewVec(n); mol.CC(i, c) += step; calc_distances(mol, realIdx, dist); - eeq_model.get_charges(mol, realIdx, dist, 0, cutoff.cn_eeq, q_r, dqdr, false); + eeq_model.get_charges( + mol, realIdx, dist, 0, cutoff.cn_eeq, q_r, dqdr, false + ); // calculate backward point q_l.NewVec(n); mol.CC(i, c) = mol.CC(i, c) - 2 * step; calc_distances(mol, realIdx, dist); - eeq_model.get_charges(mol, realIdx, dist, 0, cutoff.cn_eeq, q_l, dqdr, false); + eeq_model.get_charges( + mol, realIdx, dist, 0, cutoff.cn_eeq, q_l, dqdr, false + ); // calculate numerical gradient as finite difference mol.CC(i, c) = mol.CC(i, c) + step; for (int j = 0; j < mol.NAtoms; j++) { num_dqdr(3 * i + c, j) = 0.5 * (q_r(j) - q_l(j)) / step; - } } } @@ -241,8 +240,13 @@ int test_numgrad_dqdr_eeq( for (int i = 0; i < mol.NAtoms; i++) { for (int c = 0; c < 3; c++) { for (int j = 0; j < mol.NAtoms; j++) { - if (check(analytic_dqdr(3 * i + c, j), num_dqdr(3 * i + c, j), thr) != EXIT_SUCCESS) { - print_fail("Gradient mismatch for dqdr in EEQ.\n", analytic_dqdr(3 * i + c, j), num_dqdr(3 * i + c, j)); + if (check(analytic_dqdr(3 * i + c, j), num_dqdr(3 * i + c, j), thr) != + EXIT_SUCCESS) { + print_fail( + "Gradient mismatch for dqdr in EEQ.\n", + analytic_dqdr(3 * i + c, j), + num_dqdr(3 * i + c, j) + ); return EXIT_FAILURE; } } @@ -268,9 +272,9 @@ int test_numgrad_dqdr_eeqbc( TMatrix dist; dist.NewMat(mol.NAtoms, mol.NAtoms); - TMatrix num_dqdr; // numerical gradient of the partial charges + TMatrix num_dqdr; // numerical gradient of the partial charges num_dqdr.NewMat(3 * mol.NAtoms, mol.NAtoms); - TMatrix analytic_dqdr; // analytical gradient of the partial charges + TMatrix analytic_dqdr; // analytical gradient of the partial charges analytic_dqdr.NewMat(3 * mol.NAtoms, mol.NAtoms); multicharge::EEQBCModel eeqbc_model; TVector q; @@ -291,8 +295,9 @@ int test_numgrad_dqdr_eeqbc( // analytical gradient calc_distances(mol, realIdx, dist); - info = - eeqbc_model.get_charges(mol, realIdx, dist, 0, cutoff.cn_eeq, q, analytic_dqdr, true); + info = eeqbc_model.get_charges( + mol, realIdx, dist, 0, cutoff.cn_eeq, q, analytic_dqdr, true + ); if (info != EXIT_SUCCESS) return info; // calculate numerical gradient via finite difference method @@ -302,13 +307,17 @@ int test_numgrad_dqdr_eeqbc( q_r.NewVec(n); mol.CC(i, c) += step; calc_distances(mol, realIdx, dist); - eeqbc_model.get_charges(mol, realIdx, dist, 0, cutoff.cn_eeq, q_r, dqdr, false); + eeqbc_model.get_charges( + mol, realIdx, dist, 0, cutoff.cn_eeq, q_r, dqdr, false + ); // calculate backward point q_l.NewVec(n); mol.CC(i, c) = mol.CC(i, c) - 2 * step; calc_distances(mol, realIdx, dist); - eeqbc_model.get_charges(mol, realIdx, dist, 0, cutoff.cn_eeq, q_l, dqdr, false); + eeqbc_model.get_charges( + mol, realIdx, dist, 0, cutoff.cn_eeq, q_l, dqdr, false + ); // calculate numerical gradient as finite difference mol.CC(i, c) = mol.CC(i, c) + step; @@ -322,8 +331,13 @@ int test_numgrad_dqdr_eeqbc( for (int i = 0; i < mol.NAtoms; i++) { for (int c = 0; c < 3; c++) { for (int j = 0; j < mol.NAtoms; j++) { - if (check(analytic_dqdr(3 * i + c, j), num_dqdr(3 * i + c, j), thr) != EXIT_SUCCESS) { - print_fail("Gradient mismatch for dqdr in EEQ-BC.\n", analytic_dqdr(3 * i + c, j), num_dqdr(3 * i + c, j)); + if (check(analytic_dqdr(3 * i + c, j), num_dqdr(3 * i + c, j), thr) != + EXIT_SUCCESS) { + print_fail( + "Gradient mismatch for dqdr in EEQ-BC.\n", + analytic_dqdr(3 * i + c, j), + num_dqdr(3 * i + c, j) + ); return EXIT_FAILURE; } } @@ -336,12 +350,12 @@ int test_numgrad_dqdr_eeqbc( int test_grad() { int info{0}; - info = test_numgrad_dqdr_eeq( - mb16_43_01_n, mb16_43_01_atoms, mb16_43_01_coord); + info = + test_numgrad_dqdr_eeq(mb16_43_01_n, mb16_43_01_atoms, mb16_43_01_coord); if (info != EXIT_SUCCESS) return info; - info = test_numgrad_dqdr_eeqbc( - mb16_43_01_n, mb16_43_01_atoms, mb16_43_01_coord); + info = + test_numgrad_dqdr_eeqbc(mb16_43_01_n, mb16_43_01_atoms, mb16_43_01_coord); if (info != EXIT_SUCCESS) return info; info = test_pbed4_mb01(); diff --git a/test/test_multi.cpp b/test/test_multi.cpp index 5f17064..0450ad7 100644 --- a/test/test_multi.cpp +++ b/test/test_multi.cpp @@ -1,63 +1,103 @@ #include "test_multi.h" -#include "dftd_multicharge_param.h" #include "dftd_eeq.h" +#include "dftd_multicharge_param.h" #include "molecules.h" #include "util.h" using namespace dftd4; -int test_multi_param(){ +int test_multi_param() { // Test EEQ-BC model parameters - // Since they are passed via the constructor initializer list, the sorting has to be the same + // Since they are passed via the constructor initializer list, the sorting has + // to be the same // as in the EEQ-BC parameter header file // Chi parameter (currently first in constructor initializer list) - if (check(multicharge_param::eeqbc::eeqbc_chi[1], param_eeqbc_chi_ref[0], 1.0E-9) == EXIT_FAILURE) { - print_fail("Multicharge: Param",multicharge_param::eeqbc::eeqbc_chi[1], param_eeqbc_chi_ref[0]); + if (check( + multicharge_param::eeqbc::eeqbc_chi[1], param_eeqbc_chi_ref[0], 1.0E-9 + ) == EXIT_FAILURE) { + print_fail( + "Multicharge: Param", + multicharge_param::eeqbc::eeqbc_chi[1], + param_eeqbc_chi_ref[0] + ); return EXIT_FAILURE; } - if (check(multicharge_param::eeqbc::eeqbc_chi[103], param_eeqbc_chi_ref[1], 1.0E-9) == EXIT_FAILURE) { - print_fail("Multicharge: Param",multicharge_param::eeqbc::eeqbc_chi[103], param_eeqbc_chi_ref[1]); + if (check( + multicharge_param::eeqbc::eeqbc_chi[103], param_eeqbc_chi_ref[1], 1.0E-9 + ) == EXIT_FAILURE) { + print_fail( + "Multicharge: Param", + multicharge_param::eeqbc::eeqbc_chi[103], + param_eeqbc_chi_ref[1] + ); return EXIT_FAILURE; } // rvdw parameter (currently last in constructor initializer list) // Also check correct indexing int iat = 1; int jat = 1; - int ij_at = (((iat - 1)*iat)/2 + jat)-1; // calculate index for half-vectorized matrix rvdw - if (check(multicharge_param::eeqbc::eeqbc_rvdw[ij_at], param_eeqbc_rvdw_ref[0], 1.0E-4) == EXIT_FAILURE) { - print_fail("Multicharge: Param",multicharge_param::eeqbc::eeqbc_rvdw[ij_at], param_eeqbc_rvdw_ref[0]); + int ij_at = (((iat - 1) * iat) / 2 + jat) - + 1; // calculate index for half-vectorized matrix rvdw + if (check( + multicharge_param::eeqbc::eeqbc_rvdw[ij_at], + param_eeqbc_rvdw_ref[0], + 1.0E-4 + ) == EXIT_FAILURE) { + print_fail( + "Multicharge: Param", + multicharge_param::eeqbc::eeqbc_rvdw[ij_at], + param_eeqbc_rvdw_ref[0] + ); return EXIT_FAILURE; } iat = 103; jat = 102; - ij_at = (((iat - 1)*iat)/2 + jat)-1; // calculate index for half-vectorized matrix rvdw - if (check(multicharge_param::eeqbc::eeqbc_rvdw[ij_at], param_eeqbc_rvdw_ref[1], 1.0E-4) == EXIT_FAILURE) { - print_fail("Multicharge: Param",multicharge_param::eeqbc::eeqbc_rvdw[ij_at], param_eeqbc_rvdw_ref[1]); + ij_at = (((iat - 1) * iat) / 2 + jat) - + 1; // calculate index for half-vectorized matrix rvdw + if (check( + multicharge_param::eeqbc::eeqbc_rvdw[ij_at], + param_eeqbc_rvdw_ref[1], + 1.0E-4 + ) == EXIT_FAILURE) { + print_fail( + "Multicharge: Param", + multicharge_param::eeqbc::eeqbc_rvdw[ij_at], + param_eeqbc_rvdw_ref[1] + ); return EXIT_FAILURE; } iat = 103; jat = 103; - ij_at = (((iat - 1)*iat)/2 + jat)-1; // calculate index for half-vectorized matrix rvdw - if (check(multicharge_param::eeqbc::eeqbc_rvdw[ij_at], param_eeqbc_rvdw_ref[2], 1.0E-4) == EXIT_FAILURE) { - print_fail("Multicharge: Param",multicharge_param::eeqbc::eeqbc_rvdw[ij_at], param_eeqbc_rvdw_ref[2]); + ij_at = (((iat - 1) * iat) / 2 + jat) - + 1; // calculate index for half-vectorized matrix rvdw + if (check( + multicharge_param::eeqbc::eeqbc_rvdw[ij_at], + param_eeqbc_rvdw_ref[2], + 1.0E-4 + ) == EXIT_FAILURE) { + print_fail( + "Multicharge: Param", + multicharge_param::eeqbc::eeqbc_rvdw[ij_at], + param_eeqbc_rvdw_ref[2] + ); return EXIT_FAILURE; } return EXIT_SUCCESS; } // Test member functions of ChargeModel and derived classes -int test_multi_functions(){ +int test_multi_functions() { int info; // assemble molecule TMolecule mol; info = get_molecule(mb16_43_01_n, mb16_43_01_atoms, mb16_43_01_coord, mol); if (info != EXIT_SUCCESS) { - printf("Multicharge: Functions, Failed to set up molecule."); - fflush(stdout); - return info; + printf("Multicharge: Functions, Failed to set up molecule."); + fflush(stdout); + return info; } - + // Test EEQ-BC member functions multicharge::EEQBCModel eeqbc_model; TIVector realIdx; @@ -72,21 +112,27 @@ int test_multi_functions(){ TVector q; TMatrix dqdr; q.NewVector(mb16_43_01_n); - dqdr.NewMatrix(3*mb16_43_01_n, mb16_43_01_n); + dqdr.NewMatrix(3 * mb16_43_01_n, mb16_43_01_n); eeqbc_model.get_cn(mol, realIdx, dist, cn, dcndr, true); - info = eeqbc_model.eeq_chrgeq(mol, realIdx, dist, cn, dcndr, mb16_43_01_charge, q, dqdr, true, false); + info = eeqbc_model.eeq_chrgeq( + mol, realIdx, dist, cn, dcndr, mb16_43_01_charge, q, dqdr, true, false + ); if (info != EXIT_SUCCESS) { - printf("Multicharge: Functions, Failed to calculate charges."); - fflush(stdout); - return info; + printf("Multicharge: Functions, Failed to calculate charges."); + fflush(stdout); + return info; } // Check against multicharge reference calculation - for (int i=0; i < mol.NAtoms; i++) { + for (int i = 0; i < mol.NAtoms; i++) { if (check(q(i), qvec_reference[i], 1.0E-8) == EXIT_FAILURE) { - print_fail("Multicharge: Functions, Partial charge differs from reference.", q(i), qvec_reference[i]); - return EXIT_FAILURE; + print_fail( + "Multicharge: Functions, Partial charge differs from reference.", + q(i), + qvec_reference[i] + ); + return EXIT_FAILURE; } } @@ -94,17 +140,17 @@ int test_multi_functions(){ } // Test member functions of ChargeModel and derived classes -int test_eeqbc_amalgam(){ +int test_eeqbc_amalgam() { int info; // assemble molecule TMolecule mol; info = get_molecule(amalgam_n, amalgam_atoms, amalgam_coord, mol); if (info != EXIT_SUCCESS) { - printf("Multicharge: Functions, Failed to set up molecule."); - fflush(stdout); - return info; + printf("Multicharge: Functions, Failed to set up molecule."); + fflush(stdout); + return info; } - + // Test EEQ-BC member functions multicharge::EEQBCModel eeqbc_model; TIVector realIdx; @@ -119,22 +165,29 @@ int test_eeqbc_amalgam(){ TVector q; TMatrix dqdr; q.NewVector(amalgam_n); - dqdr.NewMatrix(3*amalgam_n, amalgam_n); + dqdr.NewMatrix(3 * amalgam_n, amalgam_n); eeqbc_model.get_cn(mol, realIdx, dist, cn, dcndr, true); - info = eeqbc_model.eeq_chrgeq(mol, realIdx, dist, cn, dcndr, amalgam_charge, q, dqdr, false, false); + info = eeqbc_model.eeq_chrgeq( + mol, realIdx, dist, cn, dcndr, amalgam_charge, q, dqdr, false, false + ); if (info != EXIT_SUCCESS) { - printf("Multicharge: Failed to calculate charges."); - fflush(stdout); - return info; + printf("Multicharge: Failed to calculate charges."); + fflush(stdout); + return info; } // Check against multicharge reference calculation - for (int i=0; i < mol.NAtoms; i++) { + for (int i = 0; i < mol.NAtoms; i++) { if (check(q(i), qvec_amalgam_reference[i], 1.0E-8) == EXIT_FAILURE) { - print_fail("Multicharge: Functions, Partial charge differs from reference for amalgam.", q(i), qvec_amalgam_reference[i]); - return EXIT_FAILURE; + print_fail( + "Multicharge: Functions, Partial charge differs from reference for " + "amalgam.", + q(i), + qvec_amalgam_reference[i] + ); + return EXIT_FAILURE; } } @@ -142,7 +195,7 @@ int test_eeqbc_amalgam(){ } // Test for multicharge models -int test_multi(){ +int test_multi() { int info; // Test the charge model parameters diff --git a/test/test_multi.h b/test/test_multi.h index caaf1aa..a829ba2 100644 --- a/test/test_multi.h +++ b/test/test_multi.h @@ -2,358 +2,224 @@ #ifndef TEST_MULTICHARGE_H #define TEST_MULTICHARGE_H -static const double param_eeqbc_chi_ref[2]{ - 1.7500687479, - 0.6679573735 -}; +static const double param_eeqbc_chi_ref[2]{1.7500687479, 0.6679573735}; -static const double param_eeqbc_rvdw_ref[3]{ - 2.1823, - 4.3286, - 4.1429 -}; +static const double param_eeqbc_rvdw_ref[3]{2.1823, 4.3286, 4.1429}; static const double qvec_reference[]{ - 0.4757830909, -0.0426540501, -0.3778712260, -0.0967376090, - -0.1733641170, 0.1086601010, -0.1136284484, -0.3179396996, - -0.2456555247, 0.1761065724, 0.1145108507, -0.1222410255, - -0.0144595425, 0.2577820828, -0.1117775795, 0.4834861246 - }; + 0.4757830909, + -0.0426540501, + -0.3778712260, + -0.0967376090, + -0.1733641170, + 0.1086601010, + -0.1136284484, + -0.3179396996, + -0.2456555247, + 0.1761065724, + 0.1145108507, + -0.1222410255, + -0.0144595425, + 0.2577820828, + -0.1117775795, + 0.4834861246 +}; // reference gradient dqdr for mb16_43_01 static const double dqdr_reference[]{ - 0.000000000, 0.000000000, 0.000000000, // (0-2,0,0) - 0.119414865, 0.119414865, 0.119414865, - -0.009766387, -0.009766387, -0.009766387, - -0.129430372, -0.129430372, -0.129430372, - -0.026797289, -0.026797289, -0.026797289, - 0.034144659, 0.034144659, 0.034144659, - -0.007388839, -0.007388839, -0.007388839, - 0.032304539, 0.032304539, 0.032304539, - 0.010374760, 0.010374760, 0.010374760, - -0.037425485, -0.037425485, -0.037425485, - -0.003313457, -0.003313457, -0.003313457, - 0.017425270, 0.017425270, 0.017425270, - -0.006572642, -0.006572642, -0.006572642, - 0.001862799, 0.001862799, 0.001862799, - -0.004669860, -0.004669860, -0.004669860, - 0.006015602, 0.006015602, 0.006015602, - - 0.003821836, 0.003821836, 0.003821836, // (0-2,0,1) - 0.004036443, 0.004036443, 0.004036443, // (0-2,1,1) - 0.122929791, 0.122929791, 0.122929791, - 0.001205792, 0.001205792, 0.001205792, - -0.026345244, -0.026345244, -0.026345244, - 0.001145827, 0.001145827, 0.001145827, - 0.000982307, 0.000982307, 0.000982307, - 0.035008816, 0.035008816, 0.035008816, - 0.008471227, 0.008471227, 0.008471227, - 0.000693925, 0.000693925, 0.000693925, - -0.002006854, -0.002006854, -0.002006854, - -0.007359077, -0.007359077, -0.007359077, - -0.010110234, -0.010110234, -0.010110234, - -0.149754592, -0.149754592, -0.149754592, - -0.001580143, -0.001580143, -0.001580143, - 0.005455892, 0.005455892, 0.005455892, - - 0.017226125, 0.017226125, 0.017226125, // (0-2,0,2) - -0.032435186, -0.032435186, -0.032435186, - -0.002954316, -0.002954316, -0.002954316, - 0.091498968, 0.091498968, 0.091498968, - -0.003224121, -0.003224121, -0.003224121, - 0.091854054, 0.091854054, 0.091854054, - -0.003845758, -0.003845758, -0.003845758, - 0.003182059, 0.003182059, 0.003182059, - 0.006322413, 0.006322413, 0.006322413, - -0.022201436, -0.022201436, -0.022201436, - -0.002890625, -0.002890625, -0.002890625, - 0.009411540, 0.009411540, 0.009411540, - -0.000828985, -0.000828985, -0.000828985, - 0.003915955, 0.003915955, 0.003915955, - -0.140659022, -0.140659022, -0.140659022, - 0.006111833, 0.006111833, 0.006111833, - - -0.003257371, -0.003257371, -0.003257371, // (0-2,0,3) - -0.012890896, -0.012890896, -0.012890896, - -0.021780184, -0.021780184, -0.021780184, - 0.016465486, 0.016465486, 0.016465486, - 0.139385123, 0.139385123, 0.139385123, - 0.002945519, 0.002945519, 0.002945519, - 0.000291555, 0.000291555, 0.000291555, - 0.025585789, 0.025585789, 0.025585789, - 0.006272205, 0.006272205, 0.006272205, - -0.002388125, -0.002388125, -0.002388125, - -0.002249996, -0.002249996, -0.002249996, - -0.004658705, -0.004658705, -0.004658705, - -0.009508024, -0.009508024, -0.009508024, - -0.156869719, -0.156869719, -0.156869719, - 0.000302461, 0.000302461, 0.000302461, - 0.005672318, 0.005672318, 0.005672318, - - 0.013425194, 0.013425194, 0.013425194, // (0-2,0,4) - -0.005822358, -0.005822358, -0.005822358, - -0.002234564, -0.002234564, -0.002234564, - -0.006363872, -0.006363872, -0.006363872, - -0.001465590, -0.001465590, -0.001465590, - -0.273912363, -0.273912363, -0.273912363, - -0.012920615, -0.012920615, -0.012920615, - -0.002148003, -0.002148003, -0.002148003, - 0.005297600, 0.005297600, 0.005297600, - -0.015193613, -0.015193613, -0.015193613, - -0.002463893, -0.002463893, -0.002463893, - 0.052157319, 0.052157319, 0.052157319, - -0.000202900, -0.000202900, -0.000202900, - 0.005540465, 0.005540465, 0.005540465, - 0.295144040, 0.295144040, 0.295144040, - -0.028845350, -0.028845350, -0.028845350, - - -0.006566304, -0.006566304, -0.006566304, // (0-2,0,5) - -0.001105205, -0.001105205, -0.001105205, - -0.001685836, -0.001685836, -0.001685836, - -0.003194386, -0.003194386, -0.003194386, - -0.001199854, -0.001199854, -0.001199854, - 0.015421924, 0.015421924, 0.015421924, - 0.115192196, 0.115192196, 0.115192196, - -0.000231987, -0.000231987, -0.000231987, - 0.008316320, 0.008316320, 0.008316320, - -0.016758746, -0.016758746, -0.016758746, - -0.002445727, -0.002445727, -0.002445727, - 0.080670024, 0.080670024, 0.080670024, - -0.003115501, -0.003115501, -0.003115501, - 0.002587791, 0.002587791, 0.002587791, - -0.010221708, -0.010221708, -0.010221708, - -0.177149646, -0.177149646, -0.177149646, - - -0.005079660, -0.005079660, -0.005079660, // (0-2,0,6) - -0.011925192, -0.011925192, -0.011925192, - -0.014270148, -0.014270148, -0.014270148, - 0.007805712, 0.007805712, 0.007805712, - -0.013772958, -0.013772958, -0.013772958, - 0.004219976, 0.004219976, 0.004219976, - -0.000954442, -0.000954442, -0.000954442, - -0.255694347, -0.255694347, -0.255694347, - 0.015893669, 0.015893669, 0.015893669, - -0.005276456, -0.005276456, -0.005276456, - -0.006550628, -0.006550628, -0.006550628, - 0.000240351, 0.000240351, 0.000240351, - -0.008600808, -0.008600808, -0.008600808, - 0.286812002, 0.286812002, 0.286812002, - 0.000429281, 0.000429281, 0.000429281, - 0.006868732, 0.006868732, 0.006868732, - - -0.005224742, -0.005224742, -0.005224742, // (0-2,0,7) - 0.006672921, 0.006672921, 0.006672921, - -0.003714513, -0.003714513, -0.003714513, - -0.007324966, -0.007324966, -0.007324966, - -0.002267798, -0.002267798, -0.002267798, - 0.006697736, 0.006697736, 0.006697736, - -0.006381599, -0.006381599, -0.006381599, - 0.027388953, 0.027388953, 0.027388953, - -0.053364033, -0.053364033, -0.053364033, - -0.006528629, -0.006528629, -0.006528629, - 0.005615009, 0.005615009, 0.005615009, - 0.024071156, 0.024071156, 0.024071156, - -0.011923458, -0.011923458, -0.011923458, - -0.014965471, -0.014965471, -0.014965471, - -0.003707340, -0.003707340, -0.003707340, - -0.001355106, -0.001355106, -0.001355106, - - 0.041087138, 0.041087138, 0.041087138, // (0-2,0,8) - -0.023177438, -0.023177438, -0.023177438, - -0.002370227, -0.002370227, -0.002370227, - 0.000900653, 0.000900653, 0.000900653, - -0.003519113, -0.003519113, -0.003519113, - 0.047562942, 0.047562942, 0.047562942, - -0.025927233, -0.025927233, -0.025927233, - 0.015878930, 0.015878930, 0.015878930, - 0.016866294, 0.016866294, 0.016866294, - 0.115275958, 0.115275958, 0.115275958, - -0.005375032, -0.005375032, -0.005375032, - 0.070287906, 0.070287906, 0.070287906, - -0.007716735, -0.007716735, -0.007716735, - -0.007394883, -0.007394883, -0.007394883, - -0.085831905, -0.085831905, -0.085831905, - -0.107035018, -0.107035018, -0.107035018, - - 0.001574902, 0.001574902, 0.001574902, // (0-2,0,9) - 0.006476725, 0.006476725, 0.006476725, - -0.004368797, -0.004368797, -0.004368797, - -0.005996139, -0.005996139, -0.005996139, - -0.001961175, -0.001961175, -0.001961175, - 0.001843756, 0.001843756, 0.001843756, - -0.000795551, -0.000795551, -0.000795551, - 0.017728537, 0.017728537, 0.017728537, - -0.046142506, -0.046142506, -0.046142506, - -0.000581687, -0.000581687, -0.000581687, - 0.062923124, 0.062923124, 0.062923124, - 0.001159794, 0.001159794, 0.001159794, - -0.006605954, -0.006605954, -0.006605954, - -0.010304509, -0.010304509, -0.010304509, - -0.001999150, -0.001999150, -0.001999150, - 0.004188529, 0.004188529, 0.004188529, - - -0.015564996, -0.015564996, -0.015564996, // (0-2,0,10) - -0.000042665, -0.000042665, -0.000042665, - -0.001554026, -0.001554026, -0.001554026, - -0.004663795, -0.004663795, -0.004663795, - -0.001018132, -0.001018132, -0.001018132, - 0.030833945, 0.030833945, 0.030833945, - -0.033435117, -0.033435117, -0.033435117, - -0.000226070, -0.000226070, -0.000226070, - 0.010605614, 0.010605614, 0.010605614, - -0.011962138, -0.011962138, -0.011962138, - -0.003437893, -0.003437893, -0.003437893, - -0.303378514, -0.303378514, -0.303378514, - -0.002764909, -0.002764909, -0.002764909, - 0.002696539, 0.002696539, 0.002696539, - -0.025076301, -0.025076301, -0.025076301, - 0.353690658, 0.353690658, 0.353690658, - - -0.010267196, -0.010267196, -0.010267196, // (0-2,0,11) - 0.000709221, 0.000709221, 0.000709221, - -0.015230567, -0.015230567, -0.015230567, - -0.000187393, -0.000187393, -0.000187393, - -0.014756803, -0.014756803, -0.014756803, - 0.004259217, 0.004259217, 0.004259217, - -0.005529434, -0.005529434, -0.005529434, - 0.020828686, 0.020828686, 0.020828686, - 0.015871064, 0.015871064, 0.015871064, - -0.009486153, -0.009486153, -0.009486153, - -0.005849931, -0.005849931, -0.005849931, - 0.008209615, 0.008209615, 0.008209615, - 0.066306147, 0.066306147, 0.066306147, - 0.033531397, 0.033531397, 0.033531397, - -0.000569532, -0.000569532, -0.000569532, - 0.009270397, 0.009270397, 0.009270397, - - -0.107375933, -0.107375933, -0.107375933, // (0-2,0,12) - -0.013475484, -0.013475484, -0.013475484, - -0.031861757, -0.031861757, -0.031861757, - 0.012619124, 0.012619124, 0.012619124, - -0.031773440, -0.031773440, -0.031773440, - 0.006559095, 0.006559095, 0.006559095, - -0.001108022, -0.001108022, -0.001108022, - 0.043803544, 0.043803544, 0.043803544, - 0.017342703, 0.017342703, 0.017342703, - -0.005718482, -0.005718482, -0.005718482, - -0.005896076, -0.005896076, -0.005896076, - -0.001850527, -0.001850527, -0.001850527, - -0.032412625, -0.032412625, -0.032412625, - 0.016598570, 0.016598570, 0.016598570, - 0.000011074, 0.000011074, 0.000011074, - 0.009770531, 0.009770531, 0.009770531, - - 0.017391771, 0.017391771, 0.017391771, // (0-2,0,13) - -0.024588804, -0.024588804, -0.024588804, - -0.001995858, -0.001995858, -0.001995858, - 0.031076870, 0.031076870, 0.031076870, - -0.002307055, -0.002307055, -0.002307055, - -0.027399437, -0.027399437, -0.027399437, - -0.010985254, -0.010985254, -0.010985254, - 0.003758121, 0.003758121, 0.003758121, - 0.007718910, 0.007718910, 0.007718910, - -0.002458795, -0.002458795, -0.002458795, - -0.002719305, -0.002719305, -0.002719305, - 0.034241928, 0.034241928, 0.034241928, - -0.002471401, -0.002471401, -0.002471401, - 0.000681513, 0.000681513, 0.000681513, - 0.012984889, 0.012984889, 0.012984889, - -0.010239657, -0.010239657, -0.010239657, - - -0.005296665, -0.005296665, -0.005296665, // (0-2,0,14) - -0.004941121, -0.004941121, -0.004941121, - -0.001760473, -0.001760473, -0.001760473, - -0.003270176, -0.003270176, -0.003270176, - -0.001497442, -0.001497442, -0.001497442, - 0.033680126, 0.033680126, 0.033680126, - 0.009405484, 0.009405484, 0.009405484, - 0.005154229, 0.005154229, 0.005154229, - 0.017761506, 0.017761506, 0.017761506, - 0.050065382, 0.050065382, 0.050065382, - -0.005866127, -0.005866127, -0.005866127, - -0.026835990, -0.026835990, -0.026835990, - -0.006425759, -0.006425759, -0.006425759, - -0.001463026, -0.001463026, -0.001463026, - -0.024222777, -0.024222777, -0.024222777, - -0.043074035, -0.043074035, -0.043074035, - - 0.003290198, 0.003290198, 0.003290198, // (0-2,0,15) - -0.006905825, -0.006905825, -0.006905825, - -0.007382138, -0.007382138, -0.007382138, - -0.001141505, -0.001141505, -0.001141505, - -0.007479111, -0.007479111, -0.007479111, - 0.020143024, 0.020143024, 0.020143024, - -0.016599679, -0.016599679, -0.016599679, - 0.027678204, 0.027678204, 0.027678204, - -0.047607746, -0.047607746, -0.047607746, - -0.030055519, -0.030055519, -0.030055519, - -0.017472588, -0.017472588, -0.017472588, - 0.046207911, 0.046207911, 0.046207911, - 0.042953788, 0.042953788, 0.042953788, - -0.013474832, -0.013474832, -0.013474832, - -0.010334008, -0.010334008, -0.010334008, - -0.039345679, -0.039345679, -0.039345679, + 0.000000000, 0.000000000, 0.000000000, // (0-2,0,0) + 0.119414865, 0.119414865, 0.119414865, -0.009766387, -0.009766387, + -0.009766387, -0.129430372, -0.129430372, -0.129430372, -0.026797289, + -0.026797289, -0.026797289, 0.034144659, 0.034144659, 0.034144659, + -0.007388839, -0.007388839, -0.007388839, 0.032304539, 0.032304539, + 0.032304539, 0.010374760, 0.010374760, 0.010374760, -0.037425485, + -0.037425485, -0.037425485, -0.003313457, -0.003313457, -0.003313457, + 0.017425270, 0.017425270, 0.017425270, -0.006572642, -0.006572642, + -0.006572642, 0.001862799, 0.001862799, 0.001862799, -0.004669860, + -0.004669860, -0.004669860, 0.006015602, 0.006015602, 0.006015602, + + 0.003821836, 0.003821836, 0.003821836, // (0-2,0,1) + 0.004036443, 0.004036443, 0.004036443, // (0-2,1,1) + 0.122929791, 0.122929791, 0.122929791, 0.001205792, 0.001205792, + 0.001205792, -0.026345244, -0.026345244, -0.026345244, 0.001145827, + 0.001145827, 0.001145827, 0.000982307, 0.000982307, 0.000982307, + 0.035008816, 0.035008816, 0.035008816, 0.008471227, 0.008471227, + 0.008471227, 0.000693925, 0.000693925, 0.000693925, -0.002006854, + -0.002006854, -0.002006854, -0.007359077, -0.007359077, -0.007359077, + -0.010110234, -0.010110234, -0.010110234, -0.149754592, -0.149754592, + -0.149754592, -0.001580143, -0.001580143, -0.001580143, 0.005455892, + 0.005455892, 0.005455892, + + 0.017226125, 0.017226125, 0.017226125, // (0-2,0,2) + -0.032435186, -0.032435186, -0.032435186, -0.002954316, -0.002954316, + -0.002954316, 0.091498968, 0.091498968, 0.091498968, -0.003224121, + -0.003224121, -0.003224121, 0.091854054, 0.091854054, 0.091854054, + -0.003845758, -0.003845758, -0.003845758, 0.003182059, 0.003182059, + 0.003182059, 0.006322413, 0.006322413, 0.006322413, -0.022201436, + -0.022201436, -0.022201436, -0.002890625, -0.002890625, -0.002890625, + 0.009411540, 0.009411540, 0.009411540, -0.000828985, -0.000828985, + -0.000828985, 0.003915955, 0.003915955, 0.003915955, -0.140659022, + -0.140659022, -0.140659022, 0.006111833, 0.006111833, 0.006111833, + + -0.003257371, -0.003257371, -0.003257371, // (0-2,0,3) + -0.012890896, -0.012890896, -0.012890896, -0.021780184, -0.021780184, + -0.021780184, 0.016465486, 0.016465486, 0.016465486, 0.139385123, + 0.139385123, 0.139385123, 0.002945519, 0.002945519, 0.002945519, + 0.000291555, 0.000291555, 0.000291555, 0.025585789, 0.025585789, + 0.025585789, 0.006272205, 0.006272205, 0.006272205, -0.002388125, + -0.002388125, -0.002388125, -0.002249996, -0.002249996, -0.002249996, + -0.004658705, -0.004658705, -0.004658705, -0.009508024, -0.009508024, + -0.009508024, -0.156869719, -0.156869719, -0.156869719, 0.000302461, + 0.000302461, 0.000302461, 0.005672318, 0.005672318, 0.005672318, + + 0.013425194, 0.013425194, 0.013425194, // (0-2,0,4) + -0.005822358, -0.005822358, -0.005822358, -0.002234564, -0.002234564, + -0.002234564, -0.006363872, -0.006363872, -0.006363872, -0.001465590, + -0.001465590, -0.001465590, -0.273912363, -0.273912363, -0.273912363, + -0.012920615, -0.012920615, -0.012920615, -0.002148003, -0.002148003, + -0.002148003, 0.005297600, 0.005297600, 0.005297600, -0.015193613, + -0.015193613, -0.015193613, -0.002463893, -0.002463893, -0.002463893, + 0.052157319, 0.052157319, 0.052157319, -0.000202900, -0.000202900, + -0.000202900, 0.005540465, 0.005540465, 0.005540465, 0.295144040, + 0.295144040, 0.295144040, -0.028845350, -0.028845350, -0.028845350, + + -0.006566304, -0.006566304, -0.006566304, // (0-2,0,5) + -0.001105205, -0.001105205, -0.001105205, -0.001685836, -0.001685836, + -0.001685836, -0.003194386, -0.003194386, -0.003194386, -0.001199854, + -0.001199854, -0.001199854, 0.015421924, 0.015421924, 0.015421924, + 0.115192196, 0.115192196, 0.115192196, -0.000231987, -0.000231987, + -0.000231987, 0.008316320, 0.008316320, 0.008316320, -0.016758746, + -0.016758746, -0.016758746, -0.002445727, -0.002445727, -0.002445727, + 0.080670024, 0.080670024, 0.080670024, -0.003115501, -0.003115501, + -0.003115501, 0.002587791, 0.002587791, 0.002587791, -0.010221708, + -0.010221708, -0.010221708, -0.177149646, -0.177149646, -0.177149646, + + -0.005079660, -0.005079660, -0.005079660, // (0-2,0,6) + -0.011925192, -0.011925192, -0.011925192, -0.014270148, -0.014270148, + -0.014270148, 0.007805712, 0.007805712, 0.007805712, -0.013772958, + -0.013772958, -0.013772958, 0.004219976, 0.004219976, 0.004219976, + -0.000954442, -0.000954442, -0.000954442, -0.255694347, -0.255694347, + -0.255694347, 0.015893669, 0.015893669, 0.015893669, -0.005276456, + -0.005276456, -0.005276456, -0.006550628, -0.006550628, -0.006550628, + 0.000240351, 0.000240351, 0.000240351, -0.008600808, -0.008600808, + -0.008600808, 0.286812002, 0.286812002, 0.286812002, 0.000429281, + 0.000429281, 0.000429281, 0.006868732, 0.006868732, 0.006868732, + + -0.005224742, -0.005224742, -0.005224742, // (0-2,0,7) + 0.006672921, 0.006672921, 0.006672921, -0.003714513, -0.003714513, + -0.003714513, -0.007324966, -0.007324966, -0.007324966, -0.002267798, + -0.002267798, -0.002267798, 0.006697736, 0.006697736, 0.006697736, + -0.006381599, -0.006381599, -0.006381599, 0.027388953, 0.027388953, + 0.027388953, -0.053364033, -0.053364033, -0.053364033, -0.006528629, + -0.006528629, -0.006528629, 0.005615009, 0.005615009, 0.005615009, + 0.024071156, 0.024071156, 0.024071156, -0.011923458, -0.011923458, + -0.011923458, -0.014965471, -0.014965471, -0.014965471, -0.003707340, + -0.003707340, -0.003707340, -0.001355106, -0.001355106, -0.001355106, + + 0.041087138, 0.041087138, 0.041087138, // (0-2,0,8) + -0.023177438, -0.023177438, -0.023177438, -0.002370227, -0.002370227, + -0.002370227, 0.000900653, 0.000900653, 0.000900653, -0.003519113, + -0.003519113, -0.003519113, 0.047562942, 0.047562942, 0.047562942, + -0.025927233, -0.025927233, -0.025927233, 0.015878930, 0.015878930, + 0.015878930, 0.016866294, 0.016866294, 0.016866294, 0.115275958, + 0.115275958, 0.115275958, -0.005375032, -0.005375032, -0.005375032, + 0.070287906, 0.070287906, 0.070287906, -0.007716735, -0.007716735, + -0.007716735, -0.007394883, -0.007394883, -0.007394883, -0.085831905, + -0.085831905, -0.085831905, -0.107035018, -0.107035018, -0.107035018, + + 0.001574902, 0.001574902, 0.001574902, // (0-2,0,9) + 0.006476725, 0.006476725, 0.006476725, -0.004368797, -0.004368797, + -0.004368797, -0.005996139, -0.005996139, -0.005996139, -0.001961175, + -0.001961175, -0.001961175, 0.001843756, 0.001843756, 0.001843756, + -0.000795551, -0.000795551, -0.000795551, 0.017728537, 0.017728537, + 0.017728537, -0.046142506, -0.046142506, -0.046142506, -0.000581687, + -0.000581687, -0.000581687, 0.062923124, 0.062923124, 0.062923124, + 0.001159794, 0.001159794, 0.001159794, -0.006605954, -0.006605954, + -0.006605954, -0.010304509, -0.010304509, -0.010304509, -0.001999150, + -0.001999150, -0.001999150, 0.004188529, 0.004188529, 0.004188529, + + -0.015564996, -0.015564996, -0.015564996, // (0-2,0,10) + -0.000042665, -0.000042665, -0.000042665, -0.001554026, -0.001554026, + -0.001554026, -0.004663795, -0.004663795, -0.004663795, -0.001018132, + -0.001018132, -0.001018132, 0.030833945, 0.030833945, 0.030833945, + -0.033435117, -0.033435117, -0.033435117, -0.000226070, -0.000226070, + -0.000226070, 0.010605614, 0.010605614, 0.010605614, -0.011962138, + -0.011962138, -0.011962138, -0.003437893, -0.003437893, -0.003437893, + -0.303378514, -0.303378514, -0.303378514, -0.002764909, -0.002764909, + -0.002764909, 0.002696539, 0.002696539, 0.002696539, -0.025076301, + -0.025076301, -0.025076301, 0.353690658, 0.353690658, 0.353690658, + + -0.010267196, -0.010267196, -0.010267196, // (0-2,0,11) + 0.000709221, 0.000709221, 0.000709221, -0.015230567, -0.015230567, + -0.015230567, -0.000187393, -0.000187393, -0.000187393, -0.014756803, + -0.014756803, -0.014756803, 0.004259217, 0.004259217, 0.004259217, + -0.005529434, -0.005529434, -0.005529434, 0.020828686, 0.020828686, + 0.020828686, 0.015871064, 0.015871064, 0.015871064, -0.009486153, + -0.009486153, -0.009486153, -0.005849931, -0.005849931, -0.005849931, + 0.008209615, 0.008209615, 0.008209615, 0.066306147, 0.066306147, + 0.066306147, 0.033531397, 0.033531397, 0.033531397, -0.000569532, + -0.000569532, -0.000569532, 0.009270397, 0.009270397, 0.009270397, + + -0.107375933, -0.107375933, -0.107375933, // (0-2,0,12) + -0.013475484, -0.013475484, -0.013475484, -0.031861757, -0.031861757, + -0.031861757, 0.012619124, 0.012619124, 0.012619124, -0.031773440, + -0.031773440, -0.031773440, 0.006559095, 0.006559095, 0.006559095, + -0.001108022, -0.001108022, -0.001108022, 0.043803544, 0.043803544, + 0.043803544, 0.017342703, 0.017342703, 0.017342703, -0.005718482, + -0.005718482, -0.005718482, -0.005896076, -0.005896076, -0.005896076, + -0.001850527, -0.001850527, -0.001850527, -0.032412625, -0.032412625, + -0.032412625, 0.016598570, 0.016598570, 0.016598570, 0.000011074, + 0.000011074, 0.000011074, 0.009770531, 0.009770531, 0.009770531, + + 0.017391771, 0.017391771, 0.017391771, // (0-2,0,13) + -0.024588804, -0.024588804, -0.024588804, -0.001995858, -0.001995858, + -0.001995858, 0.031076870, 0.031076870, 0.031076870, -0.002307055, + -0.002307055, -0.002307055, -0.027399437, -0.027399437, -0.027399437, + -0.010985254, -0.010985254, -0.010985254, 0.003758121, 0.003758121, + 0.003758121, 0.007718910, 0.007718910, 0.007718910, -0.002458795, + -0.002458795, -0.002458795, -0.002719305, -0.002719305, -0.002719305, + 0.034241928, 0.034241928, 0.034241928, -0.002471401, -0.002471401, + -0.002471401, 0.000681513, 0.000681513, 0.000681513, 0.012984889, + 0.012984889, 0.012984889, -0.010239657, -0.010239657, -0.010239657, + + -0.005296665, -0.005296665, -0.005296665, // (0-2,0,14) + -0.004941121, -0.004941121, -0.004941121, -0.001760473, -0.001760473, + -0.001760473, -0.003270176, -0.003270176, -0.003270176, -0.001497442, + -0.001497442, -0.001497442, 0.033680126, 0.033680126, 0.033680126, + 0.009405484, 0.009405484, 0.009405484, 0.005154229, 0.005154229, + 0.005154229, 0.017761506, 0.017761506, 0.017761506, 0.050065382, + 0.050065382, 0.050065382, -0.005866127, -0.005866127, -0.005866127, + -0.026835990, -0.026835990, -0.026835990, -0.006425759, -0.006425759, + -0.006425759, -0.001463026, -0.001463026, -0.001463026, -0.024222777, + -0.024222777, -0.024222777, -0.043074035, -0.043074035, -0.043074035, + + 0.003290198, 0.003290198, 0.003290198, // (0-2,0,15) + -0.006905825, -0.006905825, -0.006905825, -0.007382138, -0.007382138, + -0.007382138, -0.001141505, -0.001141505, -0.001141505, -0.007479111, + -0.007479111, -0.007479111, 0.020143024, 0.020143024, 0.020143024, + -0.016599679, -0.016599679, -0.016599679, 0.027678204, 0.027678204, + 0.027678204, -0.047607746, -0.047607746, -0.047607746, -0.030055519, + -0.030055519, -0.030055519, -0.017472588, -0.017472588, -0.017472588, + 0.046207911, 0.046207911, 0.046207911, 0.042953788, 0.042953788, + 0.042953788, -0.013474832, -0.013474832, -0.013474832, -0.010334008, + -0.010334008, -0.010334008, -0.039345679, -0.039345679, -0.039345679, }; static const double qvec_amalgam_reference[]{ - 0.032868508, - 0.072854108, - 0.075831106, - 0.110432030, - 0.096887982, - 0.094833734, - 0.201333715, - -0.080608908, - 0.068731821, - 0.047872189, - -0.123961630, - -0.292706072, - 0.127453659, - -0.069640537, - 0.102473385, - -0.123128698, - -0.072745013, - -0.056184508, - -0.126128189, - 0.006018975, - 0.082870682, - 0.035737788, - -0.010427644, - 0.032408281, - -0.037079002, - -0.005864535, - 0.032073163, - 0.024264188, - 0.425432489, - 0.107423386, - 0.248688911, - -0.297062332, - 0.020683455, - -0.096287867, - -0.126368074, - -0.086839237, - 0.075028379, - -0.121742062, - 0.032952950, - 0.031287018, - 0.039686807, - -0.228757265, - 0.113827034, - 0.017100373, - -0.237251612, - 0.120001511, - 0.115043736, - -0.064053710, - 0.010428225, - 0.008714721, - 0.019227400, - -0.043394797, - -0.083676541, - -0.090495470, - -0.058955600, - -0.097112410 + 0.032868508, 0.072854108, 0.075831106, 0.110432030, 0.096887982, + 0.094833734, 0.201333715, -0.080608908, 0.068731821, 0.047872189, + -0.123961630, -0.292706072, 0.127453659, -0.069640537, 0.102473385, + -0.123128698, -0.072745013, -0.056184508, -0.126128189, 0.006018975, + 0.082870682, 0.035737788, -0.010427644, 0.032408281, -0.037079002, + -0.005864535, 0.032073163, 0.024264188, 0.425432489, 0.107423386, + 0.248688911, -0.297062332, 0.020683455, -0.096287867, -0.126368074, + -0.086839237, 0.075028379, -0.121742062, 0.032952950, 0.031287018, + 0.039686807, -0.228757265, 0.113827034, 0.017100373, -0.237251612, + 0.120001511, 0.115043736, -0.064053710, 0.010428225, 0.008714721, + 0.019227400, -0.043394797, -0.083676541, -0.090495470, -0.058955600, + -0.097112410 }; extern int test_multi(); -#endif // TEST_MULTICHARGE_H \ No newline at end of file +#endif // TEST_MULTICHARGE_H diff --git a/test/test_ncoord.cpp b/test/test_ncoord.cpp index 00a280b..fadb51a 100644 --- a/test/test_ncoord.cpp +++ b/test/test_ncoord.cpp @@ -78,12 +78,7 @@ int test_cn( return EXIT_SUCCESS; } - -int test_numgrad_d4( - int n, - const char atoms[][3], - const double coord[] -) { +int test_numgrad_d4(int n, const char atoms[][3], const double coord[]) { // assemble molecule int info; TMolecule mol; @@ -94,9 +89,10 @@ int test_numgrad_d4( TMatrix dist; dist.NewMat(mol.NAtoms, mol.NAtoms); - TMatrix num_dcndr; // numerical gradient of the coordination number + TMatrix num_dcndr; // numerical gradient of the coordination number num_dcndr.NewMat(mol.NAtoms, 3 * mol.NAtoms); - TMatrix analytic_dcndr; // analytical gradient of the coordination number + TMatrix + analytic_dcndr; // analytical gradient of the coordination number analytic_dcndr.NewMat(mol.NAtoms, 3 * mol.NAtoms); NCoordErfD4 ncoord_erf_d4; TVector cn, cn_r, cn_l; @@ -121,8 +117,13 @@ int test_numgrad_d4( for (int c = 0; c < 3; c++) { for (int i = 0; i < mol.NAtoms; i++) { for (int k = 0; k < i; k++) { - if (abs(analytic_dcndr(k, 3 * i + c) + analytic_dcndr(i, 3 * k + c)) > 1.0e-9 ) { - print_fail("Analytical CN-gradient is not antisymmetric for NCoordErfD4",analytic_dcndr(k, 3 * i + c) + analytic_dcndr(i, 3 * k + c) , 0.0); + if (abs(analytic_dcndr(k, 3 * i + c) + analytic_dcndr(i, 3 * k + c)) > + 1.0e-9) { + print_fail( + "Analytical CN-gradient is not antisymmetric for NCoordErfD4", + analytic_dcndr(k, 3 * i + c) + analytic_dcndr(i, 3 * k + c), + 0.0 + ); return EXIT_FAILURE; } } @@ -152,8 +153,13 @@ int test_numgrad_d4( for (int i = 0; i < mol.NAtoms; i++) { for (int c = 0; c < 3; c++) { for (int j = 0; j < mol.NAtoms; j++) { - if (check(analytic_dcndr(j, 3 * i + c), num_dcndr(j, 3 * i + c), thr) != EXIT_SUCCESS) { - print_fail("Gradient mismatch for NCoordErfD4 dcndr", analytic_dcndr(j, 3 * i + c), num_dcndr(j, 3 * i + c)); + if (check(analytic_dcndr(j, 3 * i + c), num_dcndr(j, 3 * i + c), thr) != + EXIT_SUCCESS) { + print_fail( + "Gradient mismatch for NCoordErfD4 dcndr", + analytic_dcndr(j, 3 * i + c), + num_dcndr(j, 3 * i + c) + ); return EXIT_FAILURE; } } @@ -163,12 +169,7 @@ int test_numgrad_d4( return EXIT_SUCCESS; } - -int test_numgrad( - int n, - const char atoms[][3], - const double coord[] -) { +int test_numgrad(int n, const char atoms[][3], const double coord[]) { // assemble molecule int info; TMolecule mol; @@ -179,9 +180,10 @@ int test_numgrad( TMatrix dist; dist.NewMat(mol.NAtoms, mol.NAtoms); - TMatrix num_dcndr; // numerical gradient of the coordination number + TMatrix num_dcndr; // numerical gradient of the coordination number num_dcndr.NewMat(mol.NAtoms, 3 * mol.NAtoms); - TMatrix analytic_dcndr; // analytical gradient of the coordination number + TMatrix + analytic_dcndr; // analytical gradient of the coordination number analytic_dcndr.NewMat(mol.NAtoms, 3 * mol.NAtoms); NCoordErf ncoord_erf; TVector cn, cn_r, cn_l; @@ -225,8 +227,13 @@ int test_numgrad( for (int i = 0; i < mol.NAtoms; i++) { for (int c = 0; c < 3; c++) { for (int j = 0; j < mol.NAtoms; j++) { - if (check(analytic_dcndr(j, 3 * i + c), num_dcndr(j, 3 * i + c), thr) != EXIT_SUCCESS) { - print_fail("Gradient mismatch for NCoordErf dcndr", analytic_dcndr(j, 3 * i + c), num_dcndr(j, 3 * i + c)); + if (check(analytic_dcndr(j, 3 * i + c), num_dcndr(j, 3 * i + c), thr) != + EXIT_SUCCESS) { + print_fail( + "Gradient mismatch for NCoordErf dcndr", + analytic_dcndr(j, 3 * i + c), + num_dcndr(j, 3 * i + c) + ); return EXIT_FAILURE; } } @@ -236,7 +243,6 @@ int test_numgrad( return EXIT_SUCCESS; } - int test_ncoord() { int info; @@ -252,24 +258,16 @@ int test_ncoord() { test_cn(rost61_m1_n, rost61_m1_atoms, rost61_m1_coord, rost61_m1_ref_cn); if (info != EXIT_SUCCESS) return info; - info = test_numgrad_d4( - mb16_43_01_n, mb16_43_01_atoms, mb16_43_01_coord - ); + info = test_numgrad_d4(mb16_43_01_n, mb16_43_01_atoms, mb16_43_01_coord); if (info != EXIT_SUCCESS) return info; - info = test_numgrad( - mb16_43_01_n, mb16_43_01_atoms, mb16_43_01_coord - ); + info = test_numgrad(mb16_43_01_n, mb16_43_01_atoms, mb16_43_01_coord); if (info != EXIT_SUCCESS) return info; - info = test_numgrad_d4( - water_n, water_atoms, water_coord - ); + info = test_numgrad_d4(water_n, water_atoms, water_coord); if (info != EXIT_SUCCESS) return info; - info = test_numgrad( - water_n, water_atoms, water_coord - ); + info = test_numgrad(water_n, water_atoms, water_coord); if (info != EXIT_SUCCESS) return info; return EXIT_SUCCESS; } diff --git a/test/util.cpp b/test/util.cpp index fcf6498..18eaa67 100644 --- a/test/util.cpp +++ b/test/util.cpp @@ -113,4 +113,4 @@ int element(const std::string &sym) { } return EXIT_SUCCESS; -} \ No newline at end of file +}