Class EVXData

java.lang.Object
com.polytechnik.utils.EVXData

public class EVXData extends Object
A container to store eigenvalue problem solution.
See Also:
  • Field Details

    • sL

      public final double sL
    • sH

      public final double sH
    • wL

      public final double wL
    • wH

      public final double wH
    • s0

      public final double s0
    • o_o

      public final double o_o
    • x0

      public final double x0
    • psiL

      public final double[] psiL
    • psiH

      public final double[] psiH
    • psi0

      public final double[] psi0
    • ev

      public final double[] ev
    • psik_at_x0

      public final double[] psik_at_x0
    • neq

      public final int neq
  • Constructor Details

    • EVXData

      public EVXData(int neq, double wL, double sL, double[] psiL, double wH, double sH, double[] psiH, double[] psi0, double[] ev, double[] psik_at_x0, double s0, double o_o, double x0)
  • Method Details

    • getPsi

      public double[] getPsi(int ind_lev)
      Return given eigenvector.
    • getEValues

      public double[] getEValues()
      Return all eigenvalues.
      See Also:
    • getFPsi

      public double getFPsi(int ind_lev, double[] FQQ)
      Return a single diagonal matrix element <psi_{ind_lev}|FQQ|psi_{ind_lev}>.
      Returns:
      FQQ diagonal matrix element.
    • getFPsi

      public double[] getFPsi(double[] FQQ)
      Calculates <psik|FQQ|psik> for all eigenvectors.
      Parameters:
      FQQ - The matrix.
      Returns:
      FQQ diagonal matrix elements.
    • getLambdaFPsi

      public double[] getLambdaFPsi(double[] FQQ)
      Return lambda[k]*<psik|FQQ|psik> for all eigenvectors.
      Parameters:
      FQQ - The matrix.
      Returns:
      FQQ diagonal matrix elements multiplied by eigenvalues.
    • getFPsiPsi

      public double getFPsiPsi(int ind_lev, double[] psi, double[] FQQ)
      Calculates <psi_{ind_lev}|FQQ|psi> for a given eigenvector ind_lev and wavefunction |psi>.
    • getFPsiPsi

      public double getFPsiPsi(int i, int j, double[] FQQ)
      Calculates <psi_i|FQQ|psi_j>.
      Returns:
      A single matrix element.
    • getPsiAt

      public double[] getPsiAt(double[] Qbasis_distribution)
      Calculate all eigenvectors at given distribution of basis functions. Regular values are getPsiAt(M.B.getX0Moments(this.neq,x)).
      See Also:
    • getRNat

      public double getRNat(double[] Qbasis_distribution)
      Calculate RN interpolation at given distribution of basis functions. Regular RN interpolation is getRNat(M.B.getX0Moments(this.neq,x)).
      See Also:
    • getPsiAveraged

      public double[] getPsiAveraged(double[] QQ, OrthogonalPolynomialsBasisFunctionsCalculatable<? extends BasisFunctionsCalculatable> M)
      Calculates <psik|QQ|1>.
      See Also:
    • getMSign

      public static double[] getMSign(double[] a)
      Make the highest order coefficient of sign=1. Used for unit tests to match eigenvectors within +- sign.
    • getMSign

      public static double[] getMSign(double[] a, double sign)
      Make the highest order coefficient of specific sign. Used for unit tests to match eigenvectors within +- sign.
    • test_orthogonality

      public static void test_orthogonality(String txt, int n, double[] basis, double[] QQi, double[] QQt, double eps)
      Test orthogonality unit test.
    • matchEVXData

      public static void matchEVXData(EVXData a, EVXData b, double eps)
    • matchEVXData

      public static void matchEVXData(EVXData a, EVXData b, boolean flag_psicheck, double eps)
    • matchEVXData

      public static void matchEVXData(EVXData a, EVXData b, boolean flag_psicheck, boolean flag_check_valuesAt_x0, double eps)
    • getEVXDataFromLebesgueQuadrature

      public static EVXData getEVXDataFromLebesgueQuadrature(LebesgueQuadratureWithEVData q)
      A warapper to convert LebesgueQuadratureWithEVData to EVXData object.
    • getEVXDataFromQQ

      public static EVXData getEVXDataFromQQ(int n, double[] QQf, double[] QQa, OrthogonalPolynomialsBasisFunctionsCalculatable<? extends BasisFunctionsCalculatable> M)
      Calculate EVXData from two matrices.
    • getEVXDataFromQQfDiagQQa

      public static EVXData getEVXDataFromQQfDiagQQa(int n, double[] QQf, double[] QQa, OrthogonalPolynomialsBasisFunctionsCalculatable<? extends BasisFunctionsCalculatable> M)
      Calculate EVXData from two matrices, assuming the QQa is diagonal.
    • _getEVXDataFromEVStates

      private static EVXData _getEVXDataFromEVStates(int n, double[] evS, OrthogonalPolynomialsBasisFunctionsCalculatable<? extends BasisFunctionsCalculatable> M, double x0)
    • getPsiFromBasis

      public static double[] getPsiFromBasis(int ind, double[] basis, int n)
      Extract psi from basis. The basis is n eigenvalues, followed by n eigenvectors.
    • getPsiFromBasis

      public static double[] getPsiFromBasis(int ind, double[] basis, int n, int basis_offset)
      Extract psi from basis. Eigenvectors start at given offset, n elements each.
    • convertMatrFromBtoQ_Basis

      public static double[] convertMatrFromBtoQ_Basis(int n, double[] matrB, double[] eVB, double[] G)
      Given b_i=\sum_k eVB_{ik} Q_k and <b_i b_j>=1, <Q_k Q_l>=G_{lk}, then Q_k = \sum_l <Q_k Q_l> eVB_lk and given a matrix matrB=<b_i|f|b_j> the matrix <Q_k|f|Q_s> = \sum_{l,i,j,m} G_{kl} eVB_il <b_i|f|b_j> eVB_jm G_{ms}. The method calculates G eV^T B eV G^T.
      Parameters:
      n - Basis dimension.
      matrB - The matrix in B basis.
      eVB - Conversion of Q basis to B basis. An array of n+n*n elements, firts n elements are eigenvalues (ignored) then n eigenvectors follow.
      G - Gram matrix in Q basis.
      Returns:
      The matrix converted to Q basis.
    • convertMatrFromQtoB_Basis

      public static double[] convertMatrFromQtoB_Basis(int n, double[] matrQ, double[] eVB)
      Calculate eV matrQ eV^T.
      Parameters:
      n - Basis dimension.
      matrQ - The matrix in Q basis.
      eVB - Conversion of Q basis to B basis. An array of n+n*n elements, firts n elements are eigenvalues (ignored) then n eigenvectors follow.
      Returns:
      The matrix converted to B basis.
    • convertMatrFromQtoB_Basis

      public static double[] convertMatrFromQtoB_Basis(int n, double[] matrQ, double[] basis, int nd, int basis_offset)
      Transorm quadratic form matrix to new basis.
      Parameters:
      n - Original basis dimesion.
      matrQ - Matrix in original basis, n x n matrix lD=n.
      basis - New basis, nd x n matrix, lD=n, possible data offset basis_offset.
      nd - New basis dimension.
      basis_offset - Offset of the baisis.
      Returns:
      Output, nd x nd matrix, res=basis x matrQ x basis^T.
    • convertPsiFromQtoB_Basis

      public static double[] convertPsiFromQtoB_Basis(double[] psiQ, double[] eVB, int nd, int basis_offset, double[] QQt, int ldQQ)
      Calculates eVB (ndxldQQ) x QQT (ldQQxldQQ) x psiQ.
    • convertPsiFromQtoB_Basis

      public static double[] convertPsiFromQtoB_Basis(int n, double[] psiQ, double[] eVB, double[] QQt)
      Calculate eVB G psiQ.
    • convertPsiFromBtoQ_Basis

      public static double[] convertPsiFromBtoQ_Basis(int n, double[] psiB, double[] eVB)
    • convertPsiFromBtoQ_Basis

      public static double[] convertPsiFromBtoQ_Basis(int nb, double[] psiB, int nq, double[] basis, int basis_offset)
      Calculate l=0..nq-1: psiQ[l]=sum_{k=0..nb-1} psiB[k]*basis[l+k*nq+basis_offset]
    • getBasisABProjections

      public static double[] getBasisABProjections(int n, double[] basisA, double[] QQ, double[] basisB)
      Calculate basisA QQ basisB^T.
      Returns:
      matrix[i*n+j]= <psiA[i]|QQ|psiB[j]>
    • getSymEVDiagT

      public static double[] getSymEVDiagT(int n, double[] QQv, double[] QQt, EVSolver MEV)
      Solve generalised eigenvalues problem, assuming QQt is diagonal.