hesvx(3)

okay so bestie, this is hesvx from the Library Functions Manual ๐ŸŽ€ and it's giving "the expert one" energy โ€” it solves your complex linear system and reports how wrong the answer might be. Iconic, honestly ๐Ÿ’… let's go.

โœจ NAME โœจ

hesvx โ€” {he,sy}svx: rook (v1, expert)


๐Ÿ’– SYNOPSIS ๐Ÿ’–

๐Ÿซถ Functions

  • subroutine chesvx (fact, uplo, n, nrhs, a, lda, af, ldaf, ipiv, b, ldb, x, ldx, rcond, ferr, berr, work, lwork, rwork, info) โ€” CHESVX computes the solution to system of linear equations A * X = B for HE matrices ๐ŸŒธ
  • subroutine csysvx (fact, uplo, n, nrhs, a, lda, af, ldaf, ipiv, b, ldb, x, ldx, rcond, ferr, berr, work, lwork, rwork, info) โ€” CSYSVX computes the solution to system of linear equations A * X = B for SY matrices ๐Ÿฆ‹
  • subroutine dsysvx (fact, uplo, n, nrhs, a, lda, af, ldaf, ipiv, b, ldb, x, ldx, rcond, ferr, berr, work, lwork, iwork, info) โ€” DSYSVX computes the solution to system of linear equations A * X = B for SY matrices ๐Ÿ’œ
  • subroutine ssysvx (fact, uplo, n, nrhs, a, lda, af, ldaf, ipiv, b, ldb, x, ldx, rcond, ferr, berr, work, lwork, iwork, info) โ€” SSYSVX computes the solution to system of linear equations A * X = B for SY matrices ๐Ÿ“
  • subroutine zhesvx (fact, uplo, n, nrhs, a, lda, af, ldaf, ipiv, b, ldb, x, ldx, rcond, ferr, berr, work, lwork, rwork, info) โ€” ZHESVX computes the solution to system of linear equations A * X = B for HE matrices ๐Ÿ”ฅ
  • subroutine zsysvx (fact, uplo, n, nrhs, a, lda, af, ldaf, ipiv, b, ldb, x, ldx, rcond, ferr, berr, work, lwork, rwork, info) โ€” ZSYSVX computes the solution to system of linear equations A * X = B for SY matrices โญ

๐ŸŒˆ Detailed Description

bestie there's literally nothing here, it's just the heading doing its little intro walk ๐Ÿ˜ญ the actual tea is all under Function Documentation โฌ‡๏ธ


๐Ÿ‘‘ Function Documentation

๐Ÿ’ซ subroutine chesvx

subroutine chesvx (character fact, character uplo, integer n, integer nrhs,
    complex, dimension( lda, * ) a, integer lda, complex, dimension( ldaf, *
    ) af, integer ldaf, integer, dimension( * ) ipiv, complex, dimension(
    ldb, * ) b, integer ldb, complex, dimension( ldx, * ) x, integer ldx,
    real rcond, real, dimension( * ) ferr, real, dimension( * ) berr,
    complex, dimension( * ) work, integer lwork, real, dimension( * ) rwork,
    integer info)

CHESVX computes the solution to system of linear equations A * X = B for HE matrices โœจ

๐ŸŒธ Purpose:

CHESVX uses the diagonal pivoting factorization to compute the solution to a complex system of linear equations A * X = B, where A is an N-by-N Hermitian matrix and X and B are N-by-NRHS matrices ๐Ÿซถ

Error bounds on the solution and a condition estimate are also provided. she does the math and the quality report, no cap ๐Ÿ’…

๐Ÿฆ‹ Description:

here's the little step-by-step, bestie โ€” the following steps are performed:

  1. If FACT = 'N', the diagonal pivoting method is used to factor A. The form of the factorization is
A = U * D * U**H,  if UPLO = 'U', or
A = L * D * L**H,  if UPLO = 'L',

where U (or L) is a product of permutation and unit upper (lower) triangular matrices, and D is Hermitian and block diagonal with 1-by-1 and 2-by-2 diagonal blocks ๐ŸŒธ

  1. If some D(i,i)=0, so that D is exactly singular, then the routine returns with INFO = i. Otherwise, the factored form of A is used to estimate the condition number of the matrix A. If the reciprocal of the condition number is less than machine precision, INFO = N+1 is returned as a warning, but the routine still goes on to solve for X and compute error bounds as described below ๐Ÿ‘€
  2. The system of equations is solved for X using the factored form of A โญ
  3. Iterative refinement is applied to improve the computed solution matrix and calculate error bounds and backward error estimates for it ๐Ÿ”ฅ

๐ŸŽ€ Parameters

FACT

FACT is CHARACTER*1 โ€” tells the routine whether you already did the factoring homework or whether she's doing it for you ๐Ÿซถ

  • = 'F': on entry, AF and IPIV contain the factored form of A. A, AF and IPIV will not be modified.
  • = 'N': the matrix A will be copied to AF and factored.

UPLO

UPLO is CHARACTER*1

  • = 'U': upper triangle of A is stored;
  • = 'L': lower triangle of A is stored.

N

N is INTEGER โ€” the number of linear equations, i.e., the order of the matrix A. N >= 0 ๐Ÿ’œ

NRHS

NRHS is INTEGER โ€” the number of right hand sides, i.e., the number of columns of the matrices B and X. NRHS >= 0 ๐Ÿ“

A

A is COMPLEX array, dimension (LDA,N) โ€” the Hermitian matrix A.

If UPLO = 'U', the leading N-by-N upper triangular part of A contains the upper triangular part of the matrix A, and the strictly lower triangular part of A is not referenced.

If UPLO = 'L', the leading N-by-N lower triangular part of A contains the lower triangular part of the matrix A, and the strictly upper triangular part of A is not referenced ๐Ÿ™ˆ

LDA

LDA is INTEGER โ€” the leading dimension of the array A. LDA >= max(1,N).

AF

AF is COMPLEX array, dimension (LDAF,N)

  • If FACT = 'F', then AF is an input argument and on entry contains the block diagonal matrix D and the multipliers used to obtain the factor U or L from the factorization A = U*D*U**H or A = L*D*L**H as computed by CHETRF.
  • If FACT = 'N', then AF is an output argument and on exit returns the block diagonal matrix D and the multipliers used to obtain the factor U or L from the factorization A = U*D*U**H or A = L*D*L**H โœจ

LDAF

LDAF is INTEGER โ€” the leading dimension of the array AF. LDAF >= max(1,N).

IPIV

IPIV is INTEGER array, dimension (N)

  • If FACT = 'F', then IPIV is an input argument and on entry contains details of the interchanges and the block structure of D, as determined by CHETRF ๐Ÿฆ‹
  • If FACT = 'N', then IPIV is an output argument and on exit contains details of the interchanges and the block structure of D, as determined by CHETRF.

and here's how to read it, iykyk:

  • If IPIV(k) > 0, then rows and columns k and IPIV(k) were interchanged and D(k,k) is a 1-by-1 diagonal block.
  • If UPLO = 'U' and IPIV(k) = IPIV(k-1) < 0, then rows and columns k-1 and -IPIV(k) were interchanged and D(k-1:k,k-1:k) is a 2-by-2 diagonal block.
  • If UPLO = 'L' and IPIV(k) = IPIV(k+1) < 0, then rows and columns k+1 and -IPIV(k) were interchanged and D(k:k+1,k:k+1) is a 2-by-2 diagonal block ๐Ÿ’…

B

B is COMPLEX array, dimension (LDB,NRHS) โ€” the N-by-NRHS right hand side matrix B ๐ŸŒธ

LDB

LDB is INTEGER โ€” the leading dimension of the array B. LDB >= max(1,N).

X

X is COMPLEX array, dimension (LDX,NRHS) โ€” if INFO = 0 or INFO = N+1, the N-by-NRHS solution matrix X โญ

LDX

LDX is INTEGER โ€” the leading dimension of the array X. LDX >= max(1,N).

RCOND

RCOND is REAL โ€” the estimate of the reciprocal condition number of the matrix A.

If RCOND is less than the machine precision (in particular, if RCOND = 0), the matrix is singular to working precision ๐Ÿ’€ This condition is indicated by a return code of INFO > 0.

FERR

FERR is REAL array, dimension (NRHS) โ€” the estimated forward error bound for each solution vector X(j) (the j-th column of the solution matrix X) ๐Ÿซถ

If XTRUE is the true solution corresponding to X(j), FERR(j) is an estimated upper bound for the magnitude of the largest element in (X(j) - XTRUE) divided by the magnitude of the largest element in X(j). The estimate is as reliable as the estimate for RCOND, and is almost always a slight overestimate of the true error ๐Ÿ‘‘

BERR

BERR is REAL array, dimension (NRHS) โ€” the componentwise relative backward error of each solution vector X(j) (i.e., the smallest relative change in any element of A or B that makes X(j) an exact solution) ๐Ÿ”ฅ

WORK

WORK is COMPLEX array, dimension (MAX(1,LWORK)) โ€” on exit, if INFO = 0, WORK(1) returns the optimal LWORK โœจ

LWORK

LWORK is INTEGER โ€” the length of WORK.

LWORK >= max(1,2*N), and for best performance, when FACT = 'N', LWORK >= max(1,2*N,N*NB), where NB is the optimal blocksize for CHETRF.

If LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of the WORK array, returns this value as the first entry of the WORK array, and no error message related to LWORK is issued by XERBLA ๐Ÿ™ˆ

RWORK

RWORK is REAL array, dimension (N) ๐ŸŒˆ

INFO

  • INFO โ€” INFO is INTEGER, aka the final vibe report ๐Ÿ’…
    • = 0: successful exit โ€” clean run, we love to see it โœจ
    • < 0: if INFO = -i, the i-th argument had an illegal value โ€” check your inputs bestie ๐Ÿ˜ญ
    • > 0: if INFO = i, and i is:
      • <= N: D(i,i) is exactly zero. The factorization has been completed but the factor D is exactly singular, so the solution and error bounds could not be computed. RCOND = 0 is returned.
      • = N+1: D is nonsingular, but RCOND is less than machine precision, meaning that the matrix is singular to working precision. Nevertheless, the solution and error bounds are computed because there are a number of situations where the computed solution can be more accurate than the value of RCOND would suggest.

โœจ Author โœจ

Univ. of Tennessee

Univ. of California Berkeley

Univ. of Colorado Denver

NAG Ltd.

๐Ÿ“ Definition

Definition at line 282 of file chesvx.f.


๐ŸŒŸ subroutine csysvx ๐ŸŒŸ

   subroutine csysvx (character fact, character uplo, integer n, integer nrhs,
       complex, dimension( lda, * ) a, integer lda, complex, dimension( ldaf, *
       ) af, integer ldaf, integer, dimension( * ) ipiv, complex, dimension(
       ldb, * ) b, integer ldb, complex, dimension( ldx, * ) x, integer ldx,
       real rcond, real, dimension( * ) ferr, real, dimension( * ) berr,
       complex, dimension( * ) work, integer lwork, real, dimension( * ) rwork,
       integer info)

CSYSVX computes the solution to system of linear equations A * X = B for SY matrices โ€” that's the whole assignment bestie, no cap.

๐ŸŽฏ Purpose

Okay so CSYSVX uses the diagonal pivoting factorization to compute the solution to a complex system of linear equations A * X = B, where A is an N-by-N symmetric matrix and X and B are N-by-NRHS matrices.

Error bounds on the solution and a condition estimate are also provided. Iconic.

๐Ÿ“ Description

The following steps are performed:

  1. If FACT = 'N', the diagonal pivoting method is used to factor A. The form of the factorization is:
       A = U * D * U**T,  if UPLO = 'U', or
       A = L * D * L**T,  if UPLO = 'L',

where U (or L) is a product of permutation and unit upper (lower) triangular matrices, and D is symmetric and block diagonal with 1-by-1 and 2-by-2 diagonal blocks.

  1. If some D(i,i)=0, so that D is exactly singular, then the routine returns with INFO = i. Otherwise, the factored form of A is used to estimate the condition number of the matrix A. If the reciprocal of the condition number is less than machine precision, INFO = N+1 is returned as a warning, but the routine still goes on to solve for X and compute error bounds as described below.
  2. The system of equations is solved for X using the factored form of A.
  3. Iterative refinement is applied to improve the computed solution matrix and calculate error bounds and backward error estimates for it.

๐ŸŒธ Parameters

  • FACT โ€” FACT is CHARACTER*1. Specifies whether or not the factored form of A has been supplied on entry.
    • = 'F': on entry, AF and IPIV contain the factored form of A. A, AF and IPIV will not be modified.
    • = 'N': the matrix A will be copied to AF and factored.
  • UPLO โ€” UPLO is CHARACTER*1.
    • = 'U': upper triangle of A is stored;
    • = 'L': lower triangle of A is stored.
  • N โ€” N is INTEGER. The number of linear equations, i.e., the order of the matrix A. N >= 0.
  • NRHS โ€” NRHS is INTEGER. The number of right hand sides, i.e., the number of columns of the matrices B and X. NRHS >= 0.
  • A โ€” A is COMPLEX array, dimension (LDA,N). The symmetric matrix A. If UPLO = 'U', the leading N-by-N upper triangular part of A contains the upper triangular part of the matrix A, and the strictly lower triangular part of A is not referenced. If UPLO = 'L', the leading N-by-N lower triangular part of A contains the lower triangular part of the matrix A, and the strictly upper triangular part of A is not referenced.
  • LDA โ€” LDA is INTEGER. The leading dimension of the array A. LDA >= max(1,N).
  • AF โ€” AF is COMPLEX array, dimension (LDAF,N). If FACT = 'F', then AF is an input argument and on entry contains the block diagonal matrix D and the multipliers used to obtain the factor U or L from the factorization A = U*D*U**T or A = L*D*L**T as computed by CSYTRF. If FACT = 'N', then AF is an output argument and on exit returns the block diagonal matrix D and the multipliers used to obtain the factor U or L from the factorization A = U*D*U**T or A = L*D*L**T.
  • LDAF โ€” LDAF is INTEGER. The leading dimension of the array AF. LDAF >= max(1,N).
  • IPIV โ€” IPIV is INTEGER array, dimension (N). If FACT = 'F', then IPIV is an input argument and on entry contains details of the interchanges and the block structure of D, as determined by CSYTRF. If IPIV(k) > 0, then rows and columns k and IPIV(k) were interchanged and D(k,k) is a 1-by-1 diagonal block. If UPLO = 'U' and IPIV(k) = IPIV(k-1) < 0, then rows and columns k-1 and -IPIV(k) were interchanged and D(k-1:k,k-1:k) is a 2-by-2 diagonal block. If UPLO = 'L' and IPIV(k) = IPIV(k+1) < 0, then rows and columns k+1 and -IPIV(k) were interchanged and D(k:k+1,k:k+1) is a 2-by-2 diagonal block. If FACT = 'N', then IPIV is an output argument and on exit contains details of the interchanges and the block structure of D, as determined by CSYTRF.
  • B โ€” B is COMPLEX array, dimension (LDB,NRHS). The N-by-NRHS right hand side matrix B.
  • LDB โ€” LDB is INTEGER. The leading dimension of the array B. LDB >= max(1,N).
  • X โ€” X is COMPLEX array, dimension (LDX,NRHS). If INFO = 0 or INFO = N+1, the N-by-NRHS solution matrix X.
  • LDX โ€” LDX is INTEGER. The leading dimension of the array X. LDX >= max(1,N).
  • RCOND โ€” RCOND is REAL. The estimate of the reciprocal condition number of the matrix A. If RCOND is less than the machine precision (in particular, if RCOND = 0), the matrix is singular to working precision. This condition is indicated by a return code of INFO > 0.
  • FERR โ€” FERR is REAL array, dimension (NRHS). The estimated forward error bound for each solution vector X(j) (the j-th column of the solution matrix X). If XTRUE is the true solution corresponding to X(j), FERR(j) is an estimated upper bound for the magnitude of the largest element in (X(j) - XTRUE) divided by the magnitude of the largest element in X(j). The estimate is as reliable as the estimate for RCOND, and is almost always a slight overestimate of the true error.
  • BERR โ€” BERR is REAL array, dimension (NRHS). The componentwise relative backward error of each solution vector X(j) (i.e., the smallest relative change in any element of A or B that makes X(j) an exact solution).
  • WORK โ€” WORK is COMPLEX array, dimension (MAX(1,LWORK)). On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
  • LWORK โ€” LWORK is INTEGER. The length of WORK. LWORK >= max(1,2*N), and for best performance, when FACT = 'N', LWORK >= max(1,2*N,N*NB), where NB is the optimal blocksize for CSYTRF. If LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of the WORK array, returns this value as the first entry of the WORK array, and no error message related to LWORK is issued by XERBLA.
  • RWORK โ€” RWORK is REAL array, dimension (N).
  • INFO โ€” INFO is INTEGER.
    • = 0: successful exit
    • < 0: if INFO = -i, the i-th argument had an illegal value
    • > 0: if INFO = i, and i is
      • <= N: D(i,i) is exactly zero. The factorization has been completed but the factor D is exactly singular, so the solution and error bounds could not be computed. RCOND = 0 is returned.
      • = N+1: D is nonsingular, but RCOND is less than machine precision, meaning that the matrix is singular to working precision. Nevertheless, the solution and error bounds are computed because there are a number of situations where the computed solution can be more accurate than the value of RCOND would suggest.

โœจ Author โœจ

Univ. of Tennessee

Univ. of California Berkeley

Univ. of Colorado Denver

NAG Ltd.

๐Ÿ“ Definition

Definition at line 282 of file csysvx.f.

๐ŸŒธ subroutine dsysvx

   subroutine dsysvx (character fact, character uplo, integer n, integer nrhs,
       double precision, dimension( lda, * ) a, integer lda, double precision,
       dimension( ldaf, * ) af, integer ldaf, integer, dimension( * ) ipiv,
       double precision, dimension( ldb, * ) b, integer ldb, double precision,
       dimension( ldx, * ) x, integer ldx, double precision rcond, double
       precision, dimension( * ) ferr, double precision, dimension( * ) berr,
       double precision, dimension( * ) work, integer lwork, integer,
       dimension( * ) iwork, integer info)

DSYSVX computes the solution to system of linear equations A * X = B for SY matrices. ๐Ÿ’…

๐ŸŽ€ Purpose ๐ŸŽ€

Okay so DSYSVX uses the diagonal pivoting factorization to compute the solution to a real system of linear equations A * X = B, where A is an N-by-N symmetric matrix and X and B are N-by-NRHS matrices. โœจ

It also gives you error bounds on the solution and a condition estimate โ€” those are included, bestie. ๐Ÿซถ

๐Ÿ’ซ Description ๐Ÿ’ซ

The following steps are performed:

  1. If FACT = 'N', the diagonal pivoting method is used to factor A. The form of the factorization is A = U * D * U**T, if UPLO = 'U', or A = L * D * L**T, if UPLO = 'L', where U (or L) is a product of permutation and unit upper (lower) triangular matrices, and D is symmetric and block diagonal with 1-by-1 and 2-by-2 diagonal blocks.
  2. If some D(i,i)=0, so that D is exactly singular, then the routine returns with INFO = i. Otherwise, the factored form of A is used to estimate the condition number of the matrix A. If the reciprocal of the condition number is less than machine precision, INFO = N+1 is returned as a warning, but the routine still goes on to solve for X and compute error bounds as described below. ๐Ÿ˜ญ
  3. The system of equations is solved for X using the factored form of A.
  4. Iterative refinement is applied to improve the computed solution matrix and calculate error bounds and backward error estimates for it. ๐Ÿ”ฅ

โœจ Parameters โœจ

  • FACT โ€” FACT is CHARACTER*1. Specifies whether or not the factored form of A has been supplied on entry. = 'F': On entry, AF and IPIV contain the factored form of A. AF and IPIV will not be modified. = 'N': The matrix A will be copied to AF and factored.
  • UPLO โ€” UPLO is CHARACTER*1. = 'U': Upper triangle of A is stored; = 'L': Lower triangle of A is stored.
  • N โ€” N is INTEGER. The number of linear equations, i.e., the order of the matrix A. N >= 0.
  • NRHS โ€” NRHS is INTEGER. The number of right hand sides, i.e., the number of columns of the matrices B and X. NRHS >= 0.
  • A โ€” A is DOUBLE PRECISION array, dimension (LDA,N). The symmetric matrix A. If UPLO = 'U', the leading N-by-N upper triangular part of A contains the upper triangular part of the matrix A, and the strictly lower triangular part of A is not referenced. If UPLO = 'L', the leading N-by-N lower triangular part of A contains the lower triangular part of the matrix A, and the strictly upper triangular part of A is not referenced. ๐Ÿ‘‘
  • LDA โ€” LDA is INTEGER. The leading dimension of the array A. LDA >= max(1,N).
  • AF โ€” AF is DOUBLE PRECISION array, dimension (LDAF,N). If FACT = 'F', then AF is an input argument and on entry contains the block diagonal matrix D and the multipliers used to obtain the factor U or L from the factorization A = U*D*U**T or A = L*D*L**T as computed by DSYTRF. If FACT = 'N', then AF is an output argument and on exit returns the block diagonal matrix D and the multipliers used to obtain the factor U or L from the factorization A = U*D*U**T or A = L*D*L**T.
  • LDAF โ€” LDAF is INTEGER. The leading dimension of the array AF. LDAF >= max(1,N).
  • IPIV โ€” IPIV is INTEGER array, dimension (N). If FACT = 'F', then IPIV is an input argument and on entry contains details of the interchanges and the block structure of D, as determined by DSYTRF. If IPIV(k) > 0, then rows and columns k and IPIV(k) were interchanged and D(k,k) is a 1-by-1 diagonal block. If UPLO = 'U' and IPIV(k) = IPIV(k-1) < 0, then rows and columns k-1 and -IPIV(k) were interchanged and D(k-1:k,k-1:k) is a 2-by-2 diagonal block. If UPLO = 'L' and IPIV(k) = IPIV(k+1) < 0, then rows and columns k+1 and -IPIV(k) were interchanged and D(k:k+1,k:k+1) is a 2-by-2 diagonal block. If FACT = 'N', then IPIV is an output argument and on exit contains details of the interchanges and the block structure of D, as determined by DSYTRF.
  • B โ€” B is DOUBLE PRECISION array, dimension (LDB,NRHS). The N-by-NRHS right hand side matrix B.
  • LDB โ€” LDB is INTEGER. The leading dimension of the array B. LDB >= max(1,N).
  • X โ€” X is DOUBLE PRECISION array, dimension (LDX,NRHS). If INFO = 0 or INFO = N+1, the N-by-NRHS solution matrix X. ๐ŸŒˆ
  • LDX โ€” LDX is INTEGER. The leading dimension of the array X. LDX >= max(1,N).
  • RCOND โ€” RCOND is DOUBLE PRECISION. The estimate of the reciprocal condition number of the matrix A. If RCOND is less than the machine precision (in particular, if RCOND = 0), the matrix is singular to working precision. This condition is indicated by a return code of INFO > 0.
  • FERR โ€” FERR is DOUBLE PRECISION array, dimension (NRHS). The estimated forward error bound for each solution vector X(j) (the j-th column of the solution matrix X). If XTRUE is the true solution corresponding to X(j), FERR(j) is an estimated upper bound for the magnitude of the largest element in (X(j) - XTRUE) divided by the magnitude of the largest element in X(j). The estimate is as reliable as the estimate for RCOND, and is almost always a slight overestimate of the true error. ๐Ÿฆ‹
  • BERR โ€” BERR is DOUBLE PRECISION array, dimension (NRHS). The componentwise relative backward error of each solution vector X(j) (i.e., the smallest relative change in any element of A or B that makes X(j) an exact solution).
  • WORK โ€” WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)). On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
  • LWORK โ€” LWORK is INTEGER. The length of WORK. LWORK >= max(1,3*N), and for best performance, when FACT = 'N', LWORK >= max(1,3*N,N*NB), where NB is the optimal blocksize for DSYTRF. If LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of the WORK array, returns this value as the first entry of the WORK array, and no error message related to LWORK is issued by XERBLA. ๐Ÿ’€
  • IWORK โ€” IWORK is INTEGER array, dimension (N).
  • INFO โ€” INFO is INTEGER.
    • = 0: successful exit
    • < 0: if INFO = -i, the i-th argument had an illegal value
    • > 0: if INFO = i, and i is
      • <= N: D(i,i) is exactly zero. The factorization has been completed but the factor D is exactly singular, so the solution and error bounds could not be computed. RCOND = 0 is returned.
      • = N+1: D is nonsingular, but RCOND is less than machine precision, meaning that the matrix is singular to working precision. Nevertheless, the solution and error bounds are computed because there are a number of situations where the computed solution can be more accurate than the value of RCOND would suggest. ๐Ÿ˜ญ

๐Ÿ‘‘ Author ๐Ÿ‘‘

  • Univ. of Tennessee
  • Univ. of California Berkeley
  • Univ. of Colorado Denver
  • NAG Ltd.

Definition at line 281 of file dsysvx.f.


๐ŸŒˆ subroutine ssysvx

   subroutine ssysvx (character fact, character uplo, integer n, integer nrhs,
       real, dimension( lda, * ) a, integer lda, real, dimension( ldaf, * ) af,
       integer ldaf, integer, dimension( * ) ipiv, real, dimension( ldb, * ) b,
       integer ldb, real, dimension( ldx, * ) x, integer ldx, real rcond, real,
       dimension( * ) ferr, real, dimension( * ) berr, real, dimension( * )
       work, integer lwork, integer, dimension( * ) iwork, integer info)

SSYSVX computes the solution to system of linear equations A * X = B for SY matrices. ๐ŸŽ€

๐Ÿฆ‹ Purpose ๐Ÿฆ‹

Okay so SSYSVX uses the diagonal pivoting factorization to compute the solution to a real system of linear equations A * X = B, where A is an N-by-N symmetric matrix and X and B are N-by-NRHS matrices. โœจ

Error bounds on the solution and a condition estimate are also provided. ๐Ÿซถ

๐Ÿ’– Description ๐Ÿ’–

So the actual play-by-play of what this routine does โ€” because you know you wanted the steps:

  1. If FACT = 'N', the diagonal pivoting method is used to factor A. The form of the factorization is:
A = U * D * U**T,  if UPLO = 'U', or
A = L * D * L**T,  if UPLO = 'L',

where U (or L) is a product of permutation and unit upper (lower) triangular matrices, and D is symmetric and block diagonal with 1-by-1 and 2-by-2 diagonal blocks. โœจ

  1. If some D(i,i)=0, so that D is exactly singular, then the routine returns with INFO = i. Otherwise, the factored form of A is used to estimate the condition number of the matrix A. If the reciprocal of the condition number is less than machine precision, INFO = N+1 is returned as a warning โ€” but bestie, the routine still goes on to solve for X and compute error bounds as described below. It does not give up on you. ๐Ÿซถ
  2. The system of equations is solved for X using the factored form of A. Slay.
  3. Iterative refinement is applied to improve the computed solution matrix and calculate error bounds and backward error estimates for it. Iconic glow-up behavior tbh.

๐Ÿ’… Parameters ๐Ÿ’…

  • FACT โ€” FACT is CHARACTER*1. Specifies whether or not the factored form of A has been supplied on entry.
    • = 'F': on entry, AF and IPIV contain the factored form of A. AF and IPIV will not be modified.
    • = 'N': the matrix A will be copied to AF and factored.
  • UPLO โ€” UPLO is CHARACTER*1.
    • = 'U': upper triangle of A is stored;
    • = 'L': lower triangle of A is stored.
  • N โ€” N is INTEGER. The number of linear equations, i.e., the order of the matrix A. N >= 0.
  • NRHS โ€” NRHS is INTEGER. The number of right hand sides, i.e., the number of columns of the matrices B and X. NRHS >= 0.
  • A โ€” A is REAL array, dimension (LDA,N). The symmetric matrix A. If UPLO = 'U', the leading N-by-N upper triangular part of A contains the upper triangular part of the matrix A, and the strictly lower triangular part of A is not referenced. If UPLO = 'L', the leading N-by-N lower triangular part of A contains the lower triangular part of the matrix A, and the strictly upper triangular part of A is not referenced. Half the matrix is literally just vibes, not data. ๐Ÿฆ‹
  • LDA โ€” LDA is INTEGER. The leading dimension of the array A. LDA >= max(1,N).
  • AF โ€” AF is REAL array, dimension (LDAF,N).
    • If FACT = 'F', then AF is an input argument and on entry contains the block diagonal matrix D and the multipliers used to obtain the factor U or L from the factorization A = U*D*U**T or A = L*D*L**T as computed by SSYTRF.
    • If FACT = 'N', then AF is an output argument and on exit returns the block diagonal matrix D and the multipliers used to obtain the factor U or L from the factorization A = U*D*U**T or A = L*D*L**T.
  • LDAF โ€” LDAF is INTEGER. The leading dimension of the array AF. LDAF >= max(1,N).
  • IPIV โ€” IPIV is INTEGER array, dimension (N).
    • If FACT = 'F', then IPIV is an input argument and on entry contains details of the interchanges and the block structure of D, as determined by SSYTRF.
    • If IPIV(k) > 0, then rows and columns k and IPIV(k) were interchanged and D(k,k) is a 1-by-1 diagonal block.
    • If UPLO = 'U' and IPIV(k) = IPIV(k-1) < 0, then rows and columns k-1 and -IPIV(k) were interchanged and D(k-1:k,k-1:k) is a 2-by-2 diagonal block.
    • If UPLO = 'L' and IPIV(k) = IPIV(k+1) < 0, then rows and columns k+1 and -IPIV(k) were interchanged and D(k:k+1,k:k+1) is a 2-by-2 diagonal block. (Yes the sign flip is on purpose, don't @ me ๐Ÿ’€)
    • If FACT = 'N', then IPIV is an output argument and on exit contains details of the interchanges and the block structure of D, as determined by SSYTRF.
  • B โ€” B is REAL array, dimension (LDB,NRHS). The N-by-NRHS right hand side matrix B.
  • LDB โ€” LDB is INTEGER. The leading dimension of the array B. LDB >= max(1,N).
  • X โ€” X is REAL array, dimension (LDX,NRHS). If INFO = 0 or INFO = N+1, the N-by-NRHS solution matrix X. The whole point of the exercise, honestly. ๐ŸŽ€
  • LDX โ€” LDX is INTEGER. The leading dimension of the array X. LDX >= max(1,N).
  • RCOND โ€” RCOND is REAL. The estimate of the reciprocal condition number of the matrix A. If RCOND is less than the machine precision (in particular, if RCOND = 0), the matrix is singular to working precision. This condition is indicated by a return code of INFO > 0.
  • FERR โ€” FERR is REAL array, dimension (NRHS). The estimated forward error bound for each solution vector X(j) (the j-th column of the solution matrix X). If XTRUE is the true solution corresponding to X(j), FERR(j) is an estimated upper bound for the magnitude of the largest element in (X(j) - XTRUE) divided by the magnitude of the largest element in X(j). The estimate is as reliable as the estimate for RCOND, and is almost always a slight overestimate of the true error. Overestimating is self-care. ๐ŸŒธ
  • BERR โ€” BERR is REAL array, dimension (NRHS). The componentwise relative backward error of each solution vector X(j) (i.e., the smallest relative change in any element of A or B that makes X(j) an exact solution).
  • WORK โ€” WORK is REAL array, dimension (MAX(1,LWORK)). On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
  • LWORK โ€” LWORK is INTEGER. The length of WORK. LWORK >= max(1,3*N), and for best performance, when FACT = 'N', LWORK >= max(1,3*N,N*NB), where NB is the optimal blocksize for SSYTRF.
If LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of the WORK array, returns this value as the first entry of the WORK array, and no error message related to LWORK is issued by XERBLA. It's the "just asking, not committing" of Fortran. ๐Ÿ™ˆ
  • IWORK โ€” IWORK is INTEGER array, dimension (N). That's it, that's the whole description. No notes. ๐Ÿ’€
  • INFO โ€” INFO is INTEGER.
    • = 0: successful exit
    • < 0: if INFO = -i, the i-th argument had an illegal value
    • > 0: if INFO = i, and i is
      • <= N: D(i,i) is exactly zero. The factorization has been completed but the factor D is exactly singular, so the solution and error bounds could not be computed. RCOND = 0 is returned.
      • = N+1: D is nonsingular, but RCOND is less than machine precision, meaning that the matrix is singular to working precision. Nevertheless, the solution and error bounds are computed because there are a number of situations where the computed solution can be more accurate than the value of RCOND would suggest.

๐Ÿ‘‘ Author ๐Ÿ‘‘

Univ. of Tennessee

Univ. of California Berkeley

Univ. of Colorado Denver

NAG Ltd.

Definition at line 281 of file ssysvx.f. (yes, a whole squad wrote this, we stan a collaborative effort ๐Ÿซถ)


๐Ÿฆ‹ zhesvx ๐Ÿฆ‹

Okay bestie, now the complex one, literally โ€” same energy, more imaginary numbers:

subroutine zhesvx (character fact, character uplo, integer n, integer nrhs,
    complex*16, dimension( lda, * ) a, integer lda, complex*16, dimension(
    ldaf, * ) af, integer ldaf, integer, dimension( * ) ipiv, complex*16,
    dimension( ldb, * ) b, integer ldb, complex*16, dimension( ldx, * ) x,
    integer ldx, double precision rcond, double precision, dimension( * )
    ferr, double precision, dimension( * ) berr, complex*16, dimension( * )
    work, integer lwork, double precision, dimension( * ) rwork, integer
    info)

ZHESVX computes the solution to system of linear equations A * X = B for HE matrices. โœจ

๐ŸŒŸ Purpose ๐ŸŒŸ

ZHESVX uses the diagonal pivoting factorization to compute the solution to a complex system of linear equations A * X = B, where A is an N-by-N Hermitian matrix and X and B are N-by-NRHS matrices.

Error bounds on the solution and a condition estimate are also provided. Because we don't just want an answer, we want a receipt. ๐Ÿงพ

๐ŸŒˆ Description ๐ŸŒˆ

The following steps are performed:

  1. If FACT = 'N', the diagonal pivoting method is used to factor A. The form of the factorization is:
A = U * D * U**H,  if UPLO = 'U', or
A = L * D * L**H,  if UPLO = 'L',

where U (or L) is a product of permutation and unit upper (lower) triangular matrices, and D is Hermitian and block diagonal with 1-by-1 and 2-by-2 diagonal blocks. (Note the **H, not **T โ€” conjugate transpose, she's Hermitian, not merely symmetric, respect her. ๐Ÿ’…)

  1. If some D(i,i)=0, so that D is exactly singular, then the routine returns with INFO = i. Otherwise, the factored form of A is used to estimate the condition number of the matrix A. If the reciprocal of the condition number is less than machine precision, INFO = N+1 is returned as a warning, but the routine still goes on to solve for X and compute error bounds as described below.
  2. The system of equations is solved for X using the factored form of A.
  3. Iterative refinement is applied to improve the computed solution matrix and calculate error bounds and backward error estimates for it.

๐Ÿ’– Parameters ๐Ÿ’–

okay so FACT is up first, andโ€”

  • FACT โ€” FACT is CHARACTER*1. It tells you whether the factored form of A has already been handed to you on entry, bestie. The values are:
    • = 'F': On entry, AF and IPIV contain the factored form of A. A, AF and IPIV will not be modified.
    • = 'N': The matrix A will be copied to AF and factored.
  • UPLO โ€” UPLO is CHARACTER*1. Which triangle of A is stored:
    • = 'U': Upper triangle of A is stored;
    • = 'L': Lower triangle of A is stored.
  • N โ€” N is INTEGER. The number of linear equations, i.e., the order of the matrix A. N >= 0.
  • NRHS โ€” NRHS is INTEGER. The number of right hand sides, i.e., the number of columns of the matrices B and X. NRHS >= 0.
  • A โ€” A is COMPLEX*16 array, dimension (LDA,N). The Hermitian matrix A. If UPLO = 'U', the leading N-by-N upper triangular part of A contains the upper triangular part of the matrix A, and the strictly lower triangular part of A is not referenced. If UPLO = 'L', the leading N-by-N lower triangular part of A contains the lower triangular part of the matrix A, and the strictly upper triangular part of A is not referenced.
  • LDA โ€” LDA is INTEGER. The leading dimension of the array A. LDA >= max(1,N).
  • AF โ€” AF is COMPLEX*16 array, dimension (LDAF,N). If FACT = 'F', then AF is an input argument and on entry contains the block diagonal matrix D and the multipliers used to obtain the factor U or L from the factorization A = U*D*U**H or A = L*D*L**H as computed by ZHETRF.

If FACT = 'N', then AF is an output argument and on exit returns the block diagonal matrix D and the multipliers used to obtain the factor U or L from the factorization A = U*D*U**H or A = L*D*L**H.

  • LDAF โ€” LDAF is INTEGER. The leading dimension of the array AF. LDAF >= max(1,N).
  • IPIV โ€” IPIV is INTEGER array, dimension (N). If FACT = 'F', then IPIV is an input argument and on entry contains details of the interchanges and the block structure of D, as determined by ZHETRF. The rules are:
    • If IPIV(k) > 0, then rows and columns k and IPIV(k) were interchanged and D(k,k) is a 1-by-1 diagonal block.
    • If UPLO = 'U' and IPIV(k) = IPIV(k-1) < 0, then rows and columns k-1 and -IPIV(k) were interchanged and D(k-1:k,k-1:k) is a 2-by-2 diagonal block.
    • If UPLO = 'L' and IPIV(k) = IPIV(k+1) < 0, then rows and columns k+1 and -IPIV(k) were interchanged and D(k:k+1,k:k+1) is a 2-by-2 diagonal block.

If FACT = 'N', then IPIV is an output argument and on exit contains details of the interchanges and the block structure of D, as determined by ZHETRF.

  • B โ€” B is COMPLEX*16 array, dimension (LDB,NRHS). The N-by-NRHS right hand side matrix B.
  • LDB โ€” LDB is INTEGER. The leading dimension of the array B. LDB >= max(1,N).
  • X โ€” X is COMPLEX*16 array, dimension (LDX,NRHS). If INFO = 0 or INFO = N+1, the N-by-NRHS solution matrix X.
  • LDX โ€” LDX is INTEGER. The leading dimension of the array X. LDX >= max(1,N).
  • RCOND โ€” RCOND is DOUBLE PRECISION. The estimate of the reciprocal condition number of the matrix A. If RCOND is less than the machine precision (in particular, if RCOND = 0), the matrix is singular to working precision. This condition is indicated by a return code of INFO > 0.
  • FERR โ€” FERR is DOUBLE PRECISION array, dimension (NRHS). The estimated forward error bound for each solution vector X(j) (the j-th column of the solution matrix X). If XTRUE is the true solution corresponding to X(j), FERR(j) is an estimated upper bound for the magnitude of the largest element in (X(j) - XTRUE) divided by the magnitude of the largest element in X(j). The estimate is as reliable as the estimate for RCOND, and is almost always a slight overestimate of the true error.
  • BERR โ€” BERR is DOUBLE PRECISION array, dimension (NRHS). The componentwise relative backward error of each solution vector X(j) (i.e., the smallest relative change in any element of A or B that makes X(j) an exact solution).
  • WORK โ€” WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)). On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
  • LWORK โ€” LWORK is INTEGER. The length of WORK. LWORK >= MAX(1,2*N), and for best performance, when FACT = 'N', LWORK >= MAX(1,2*N,N*NB), where NB is the optimal blocksize for ZHETRF.

If LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of the WORK array, returns this value as the first entry of the WORK array, and no error message related to LWORK is issued by XERBLA.

  • RWORK โ€” RWORK is DOUBLE PRECISION array, dimension (N).
  • INFO โ€” INFO is INTEGER. The exit-status tea โ˜•:
    • = 0: successful exit
    • < 0: if INFO = -i, the i-th argument had an illegal value
    • > 0: if INFO = i, and i is
      • <= N: D(i,i) is exactly zero. The factorization has been completed but the factor D is exactly singular, so the solution and error bounds could not be computed. RCOND = 0 is returned.
      • = N+1: D is nonsingular, but RCOND is less than machine precision, meaning that the matrix is singular to working precision. Nevertheless, the solution and error bounds are computed because there are a number of situations where the computed solution can be more accurate than the value of RCOND would suggest.

๐Ÿซถ Author

Univ. of Tennessee

Univ. of California Berkeley

Univ. of Colorado Denver

NAG Ltd.

Definition at line 282 of file zhesvx.f.


๐ŸŒˆ ZSYSVX โ€” symmetric-matrix solver, same iconic energy ๐ŸŒˆ

subroutine zsysvx (character fact, character uplo, integer n, integer nrhs,
    complex*16, dimension( lda, * ) a, integer lda, complex*16, dimension(
    ldaf, * ) af, integer ldaf, integer, dimension( * ) ipiv, complex*16,
    dimension( ldb, * ) b, integer ldb, complex*16, dimension( ldx, * ) x,
    integer ldx, double precision rcond, double precision, dimension( * )
    ferr, double precision, dimension( * ) berr, complex*16, dimension( * )
    work, integer lwork, double precision, dimension( * ) rwork, integer
    info)

ZSYSVX computes the solution to system of linear equations A * X = B for SY matrices. Periodt. ๐Ÿ’…

Purpose ๐ŸŽฏ

ZSYSVX uses the diagonal pivoting factorization to compute the solution to a complex system of linear equations A * X = B, where A is an N-by-N symmetric matrix and X and B are N-by-NRHS matrices.

Error bounds on the solution and a condition estimate are also provided.

Description ๐Ÿงš

The following steps are performed:

  1. If FACT = 'N', the diagonal pivoting method is used to factor A. The form of the factorization is
A = U * D * U**T,  if UPLO = 'U', or
A = L * D * L**T,  if UPLO = 'L',

where U (or L) is a product of permutation and unit upper (lower) triangular matrices, and D is symmetric and block diagonal with 1-by-1 and 2-by-2 diagonal blocks.

  1. If some D(i,i)=0, so that D is exactly singular, then the routine returns with INFO = i. Otherwise, the factored form of A is used to estimate the condition number of the matrix A. If the reciprocal of the condition number is less than machine precision, INFO = N+1 is returned as a warning, but the routine still goes on to solve for X and compute error bounds as described below.
  2. The system of equations is solved for X using the factored form of A.
  3. Iterative refinement is applied to improve the computed solution matrix and calculate error bounds and backward error estimates for it.

Parameters ๐Ÿงฎ

  • FACT โ€” FACT is CHARACTER*1. Specifies whether or not the factored form of A has been supplied on entry.
    • = 'F': On entry, AF and IPIV contain the factored form of A. A, AF and IPIV will not be modified.
    • = 'N': The matrix A will be copied to AF and factored.
  • UPLO โ€” UPLO is CHARACTER*1.
    • = 'U': Upper triangle of A is stored;
    • = 'L': Lower triangle of A is stored.
  • N โ€” N is INTEGER. The number of linear equations, i.e., the order of the matrix A. N >= 0.
  • NRHS โ€” NRHS is INTEGER. The number of right hand sides, i.e., the number of columns of the matrices B and X. NRHS >= 0.
  • A โ€” and the A description rolls into the next part, bestie โ€” hold that thought ๐Ÿซถ

back in the arg docs at A, bestie โ€” lowkey the main character of this whole call ๐Ÿ’…

  • A โ€” COMPLEX*16 array, dimension (LDA,N). This is the symmetric matrix A, no cap. If UPLO = 'U', the leading N-by-N upper triangular part of A contains the upper triangular part of the matrix A, and the strictly lower triangular part of A is not referenced. If UPLO = 'L', the leading N-by-N lower triangular part of A contains the lower triangular part of the matrix A, and the strictly upper triangular part of A is not referenced. ๐Ÿฆ‹
  • LDA โ€” INTEGER. The leading dimension of the array A. LDA >= max(1,N). periodt.
  • AF โ€” COMPLEX*16 array, dimension (LDAF,N). If FACT = 'F', then AF is an input argument and on entry contains the block diagonal matrix D and the multipliers used to obtain the factor U or L from the factorization A = U*D*U**T or A = L*D*L**T as computed by ZSYTRF.

If FACT = 'N', then AF is an output argument and on exit returns the block diagonal matrix D and the multipliers used to obtain the factor U or L from the factorization A = U*D*U**T or A = L*D*L**T. โœจ

  • LDAF โ€” INTEGER. The leading dimension of the array AF. LDAF >= max(1,N). ๐ŸŽ€
  • IPIV โ€” INTEGER array, dimension (N). If FACT = 'F', then IPIV is an input argument and on entry contains details of the interchanges and the block structure of D, as determined by ZSYTRF.
    • If IPIV(k) > 0, then rows and columns k and IPIV(k) were interchanged and D(k,k) is a 1-by-1 diagonal block.
    • If UPLO = 'U' and IPIV(k) = IPIV(k-1) < 0, then rows and columns k-1 and -IPIV(k) were interchanged and D(k-1:k,k-1:k) is a 2-by-2 diagonal block.
    • If UPLO = 'L' and IPIV(k) = IPIV(k+1) < 0, then rows and columns k+1 and -IPIV(k) were interchanged and D(k:k+1,k:k+1) is a 2-by-2 diagonal block.

If FACT = 'N', then IPIV is an output argument and on exit contains details of the interchanges and the block structure of D, as determined by ZSYTRF. iykyk ๐Ÿ’œ

  • B โ€” COMPLEX*16 array, dimension (LDB,NRHS). The N-by-NRHS right hand side matrix B. ๐Ÿซถ
  • LDB โ€” INTEGER. The leading dimension of the array B. LDB >= max(1,N).
  • X โ€” COMPLEX*16 array, dimension (LDX,NRHS). If INFO = 0 or INFO = N+1, the N-by-NRHS solution matrix X. the way that X just shows up when everything works? iconic.
  • LDX โ€” INTEGER. The leading dimension of the array X. LDX >= max(1,N).
  • RCOND โ€” DOUBLE PRECISION. The estimate of the reciprocal condition number of the matrix A. If RCOND is less than the machine precision (in particular, if RCOND = 0), the matrix is singular to working precision. This condition is indicated by a return code of INFO > 0. not me side-eyeing RCOND = 0 ๐Ÿ˜ญ
  • FERR โ€” DOUBLE PRECISION array, dimension (NRHS). The estimated forward error bound for each solution vector X(j) (the j-th column of the solution matrix X). If XTRUE is the true solution corresponding to X(j), FERR(j) is an estimated upper bound for the magnitude of the largest element in (X(j) - XTRUE) divided by the magnitude of the largest element in X(j). The estimate is as reliable as the estimate for RCOND, and is almost always a slight overestimate of the true error. highkey helpful ๐Ÿ’–
  • BERR โ€” DOUBLE PRECISION array, dimension (NRHS). The componentwise relative backward error of each solution vector X(j) (i.e., the smallest relative change in any element of A or B that makes X(j) an exact solution). ๐Ÿ“
  • WORK โ€” COMPLEX*16 array, dimension (MAX(1,LWORK)). On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
  • LWORK โ€” INTEGER. The length of WORK. LWORK >= max(1,2*N), and for best performance, when FACT = 'N', LWORK >= max(1,2*N,N*NB), where NB is the optimal blocksize for ZSYTRF.

If LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of the WORK array, returns this value as the first entry of the WORK array, and no error message related to LWORK is issued by XERBLA. main character workspace behavior, fr fr ๐Ÿ’…

  • RWORK โ€” DOUBLE PRECISION array, dimension (N). ๐Ÿงš
  • INFO โ€” INTEGER. the whole vibe check right here:
    • = 0: successful exit
    • < 0: if INFO = -i, the i-th argument had an illegal value
    • > 0: if INFO = i, and i is
      • <= N: D(i,i) is exactly zero. The factorization has been completed but the factor D is exactly singular, so the solution and error bounds could not be computed. RCOND = 0 is returned.
      • = N+1: D is nonsingular, but RCOND is less than machine precision, meaning that the matrix is singular to working precision. Nevertheless, the solution and error bounds are computed because there are a number of situations where the computed solution can be more accurate than the value of RCOND would suggest. no cap, that last part is lowkey important ๐Ÿ”ฅ

๐Ÿ’– AUTHOR ๐Ÿ’–

  • Univ. of Tennessee
  • Univ. of California Berkeley
  • Univ. of Colorado Denver
  • NAG Ltd.
Definition at line 282 of file zsysvx.f.

๐Ÿ’– AUTHOR (the auto-generated one) ๐Ÿ’–

Generated automatically by Doxygen for LAPACK from the source code.


signing off from LAPACK, version 3.12.0, on the hesvx(3) page โ€” the footer doesnโ€™t show a separate date here, so thatโ€™s the whole tail, bestie ๐Ÿซถโœจ๐Ÿ’…

๐Ÿ“ฆ where this page comes from