gedmd(3)
โจ NAME โจ
gedmd โ DMD driver, Dynamic Mode Decomposition ๐
(also known as gedmd(3), straight out of your Library Functions Manual โ hi bestie, welcome ๐ซถ)
๐ธ SYNOPSIS ๐ธ
The functions ๐
Ok so there's a whole squad of them, one per precision/type combo. Same vibe, different letters. Here's the full lineup:
cgedmdโ CGEDMD computes the Dynamic Mode Decomposition (DMD) for a pair of data snapshot matrices.
subroutine cgedmd (jobs, jobz, jobr, jobf, whtsvd, m, n, x, ldx, y, ldy, nrnk, tol, k, eigs, z, ldz, res, b, ldb, w, ldw, s, lds, zwork, lzwork, rwork, lrwork, iwork, liwork, info)
cgedmdqโ CGEDMDQ computes the Dynamic Mode Decomposition (DMD) for a pair of data snapshot matrices.
subroutine cgedmdq (jobs, jobz, jobr, jobq, jobt, jobf, whtsvd, m, n, f, ldf, x, ldx, y, ldy, nrnk, tol, k, eigs, z, ldz, res, b, ldb, v, ldv, s, lds, zwork, lzwork, work, lwork, iwork, liwork, info)
dgedmdโ DGEDMD computes the Dynamic Mode Decomposition (DMD) for a pair of data snapshot matrices.
subroutine dgedmd (jobs, jobz, jobr, jobf, whtsvd, m, n, x, ldx, y, ldy, nrnk, tol, k, reig, imeig, z, ldz, res, b, ldb, w, ldw, s, lds, work, lwork, iwork, liwork, info)
dgedmdqโ DGEDMDQ computes the Dynamic Mode Decomposition (DMD) for a pair of data snapshot matrices.
subroutine dgedmdq (jobs, jobz, jobr, jobq, jobt, jobf, whtsvd, m, n, f, ldf, x, ldx, y, ldy, nrnk, tol, k, reig, imeig, z, ldz, res, b, ldb, v, ldv, s, lds, work, lwork, iwork, liwork, info)
sgedmdโ SGEDMD computes the Dynamic Mode Decomposition (DMD) for a pair of data snapshot matrices.
subroutine sgedmd (jobs, jobz, jobr, jobf, whtsvd, m, n, x, ldx, y, ldy, nrnk, tol, k, reig, imeig, z, ldz, res, b, ldb, w, ldw, s, lds, work, lwork, iwork, liwork, info)
sgedmdqโ SGEDMDQ computes the Dynamic Mode Decomposition (DMD) for a pair of data snapshot matrices.
subroutine sgedmdq (jobs, jobz, jobr, jobq, jobt, jobf, whtsvd, m, n, f, ldf, x, ldx, y, ldy, nrnk, tol, k, reig, imeig, z, ldz, res, b, ldb, v, ldv, s, lds, work, lwork, iwork, liwork, info)
zgedmdโ ZGEDMD computes the Dynamic Mode Decomposition (DMD) for a pair of data snapshot matrices.
subroutine zgedmd (jobs, jobz, jobr, jobf, whtsvd, m, n, x, ldx, y, ldy, nrnk, tol, k, eigs, z, ldz, res, b, ldb, w, ldw, s, lds, zwork, lzwork, rwork, lrwork, iwork, liwork, info)
zgedmdqโ ZGEDMDQ computes the Dynamic Mode Decomposition (DMD) for a pair of data snapshot matrices.
subroutine zgedmdq (jobs, jobz, jobr, jobq, jobt, jobf, whtsvd, m, n, f, ldf, x, ldx, y, ldy, nrnk, tol, k, eigs, z, ldz, res, b, ldb, v, ldv, s, lds, zwork, lzwork, work, lwork, iwork, liwork, info)
๐ซ Detailed Description ๐ซ
Not much prose lives here, the real content is all under the function docs below, so let's go ๐
๐ Function Documentation ๐
๐ subroutine cgedmd ๐
The whole signature, character for character, because I would never mess with your argument list:
subroutine cgedmd (character, intent(in) jobs, character, intent(in) jobz,
character, intent(in) jobr, character, intent(in) jobf, integer,
intent(in) whtsvd, integer, intent(in) m, integer, intent(in) n,
complex(kind=wp), dimension(ldx,*), intent(inout) x, integer, intent(in)
ldx, complex(kind=wp), dimension(ldy,*), intent(inout) y, integer,
intent(in) ldy, integer, intent(in) nrnk, real(kind=wp), intent(in) tol,
integer, intent(out) k, complex(kind=wp), dimension(*), intent(out)
eigs, complex(kind=wp), dimension(ldz,*), intent(out) z, integer,
intent(in) ldz, real(kind=wp), dimension(*), intent(out) res,
complex(kind=wp), dimension(ldb,*), intent(out) b, integer, intent(in)
ldb, complex(kind=wp), dimension(ldw,*), intent(out) w, integer,
intent(in) ldw, complex(kind=wp), dimension(lds,*), intent(out) s,
integer, intent(in) lds, complex(kind=wp), dimension(*), intent(out)
zwork, integer, intent(in) lzwork, real(kind=wp), dimension(*),
intent(out) rwork, integer, intent(in) lrwork, integer, dimension(*),
intent(out) iwork, integer, intent(in) liwork, integer, intent(out)
info)
CGEDMD computes the Dynamic Mode Decomposition (DMD) for a pair of data snapshot matrices. ๐ฆ
โจ Purpose โจ
CGEDMD computes the Dynamic Mode Decomposition (DMD) for a pair of data snapshot matrices. For the input matrices X and Y such that Y = A*X with an unaccessible matrix A, CGEDMD computes a certain number of Ritz pairs of A using the standard Rayleigh-Ritz extraction from a subspace of range(X) that is determined using the leading left singular vectors of X. Optionally, CGEDMD returns the residuals of the computed Ritz pairs, the information needed for a refinement of the Ritz vectors, or the eigenvectors of the Exact DMD. For further details see the references listed below. For more details of the implementation see [3].
๐ References ๐
[1] P. Schmid: Dynamic mode decomposition of numerical and experimental data, Journal of Fluid Mechanics 656, 5-28, 2010. [2] Z. Drmac, I. Mezic, R. Mohr: Data driven modal decompositions: analysis and enhancements, SIAM J. on Sci. Comp. 40 (4), A2253-A2285, 2018. [3] Z. Drmac: A LAPACK implementation of the Dynamic Mode Decomposition I. Technical report. AIMDyn Inc. and LAPACK Working Note 298. [4] J. Tu, C. W. Rowley, D. M. Luchtenburg, S. L. Brunton, N. Kutz: On Dynamic Mode Decomposition: Theory and Applications, Journal of Computational Dynamics 1(2), 391 -421, 2014.
๐ Developed and supported by ๐
Developed and coded by Zlatko Drmac, Faculty of Science, University of Zagreb;drmac@math.hrIn cooperation with AIMdyn Inc., Santa Barbara, CA. and supported by - DARPA SBIR project Contract No:W31P4Q-21-C-0007- DARPA PAI project Contract No:HR0011-18-9-0033- DARPA MoDyL project Contract No:HR0011-16-C-0116Any opinions, findings and conclusions or recommendations expressed in this material are those of the author and do not necessarily reflect the views of the DARPA SBIR Program Office
๐๏ธ Distribution Statement A ๐๏ธ
Approved for Public Release, Distribution Unlimited. Cleared by DARPA on September 29, 2022
๐ Parameters ๐
JOBS
JOBS(input)CHARACTER*1Determines whether the initial data snapshots are scaled by a diagonal matrix. -'S':: The data snapshots matrices X and Y are multiplied with a diagonal matrix D so thatX*Dhas unit nonzero columns (in the Euclidean 2-norm) -'C':: The snapshots are scaled as with the'S'option. If it is found that an i-th column of X is zero vector and the corresponding i-th column of Y is non-zero, then the i-th column of Y is set to zero and a warning flag is raised. -'Y':: The data snapshots matrices X and Y are multiplied by a diagonal matrix D so thatY*Dhas unit nonzero columns (in the Euclidean 2-norm) -'N':: No data scaling.
JOBZ
JOBZ(input)CHARACTER*1Determines whether the eigenvectors (Koopman modes) will be computed. -'V':: The eigenvectors (Koopman modes) will be computed and returned in the matrix Z. See the description of Z. -'F':: The eigenvectors (Koopman modes) will be returned in factored form as the productX(:,1:K)*W, where X contains a POD basis (leading left singular vectors of the data matrix X) and W contains the eigenvectors of the corresponding Rayleigh quotient. See the descriptions of K, X, W, Z. -'N':: The eigenvectors are not computed.
JOBR
JOBR(input)CHARACTER*1Determines whether to compute the residuals. -'R':: The residuals for the computed eigenpairs will be computed and stored in the array RES. See the description of RES. For this option to be legal, JOBZ must be'V'. -'N':: The residuals are not computed.
JOBF
JOBF(input)CHARACTER*1Specifies whether to store information needed for post-processing (e.g. computing refined Ritz vectors) -'R':: The matrix needed for the refinement of the Ritz vectors is computed and stored in the array B. See the description of B. -'E':: The unscaled eigenvectors of the Exact DMD are computed and returned in the array B. See the description of B. -'N':: No eigenvector refinement data is computed.
WHTSVD
WHTSVD(input)INTEGER,WHSTVDin{ 1, 2, 3, 4 }Allows for a selection of the SVD algorithm from the LAPACK library. -1::CGESVD(the QR SVD algorithm) -2::CGESDD(the Divide and Conquer algorithm; if enough workspace available, this is the fastest option) -3::CGESVDQ(the preconditioned QR SVD ; this and 4 are the most accurate options) -4::CGEJSV(the preconditioned Jacobi SVD; this and 3 are the most accurate options) For the four methods above, a significant difference in the accuracy of small singular values is possible if the snapshots vary in norm so that X is severely ill-conditioned. If small (smaller thanEPS*||X||) singular values are of interest andJOBS=='N', then the options (3, 4) give the most accurate results, where the option 4 is slightly better and with stronger theoretical background. IfJOBS=='S', i.e. the columns of X will be normalized, then all methods give nearly equally accurate results.
M
M(input)INTEGER,M>= 0The state space dimension (the row dimension of X, Y).
N
N(input)INTEGER,0 <= N <= MThe number of data snapshot pairs (the number of columns of X and Y).
X
(โฆand this is exactly where part 1 runs out of page, bestie โ X keeps going in the next chunk ๐ซถ)
X ๐
X (input/output) COMPLEX(KIND=WP) M-by-N array
- On entry,
Xcontains the data snapshot matrixX. It is assumed that the column norms ofXare in the range of the normalized floating point numbers. - On exit, the leading
Kcolumns ofXcontain a POD basis, i.e. the leadingKleft singular vectors of the input data matrixX,U(:,1:K). AllNcolumns ofXcontain all left singular vectors of the input matrixX.
See the descriptions of K, Z and W.
LDX ๐
LDX (input) INTEGER, LDX >= M
The leading dimension of the array X.
Y ๐ธ
Y (input/workspace/output) COMPLEX(KIND=WP) M-by-N array
- On entry,
Ycontains the data snapshot matrixY. - On exit,
- If
JOBR == 'R', the leadingKcolumns ofYcontain the residual vectors for the computed Ritz pairs. See the description ofRES. - If
JOBR == 'N',Ycontains the original input data, scaled according to the value ofJOBS.
- If
LDY ๐ฆ
LDY (input) INTEGER , LDY >= M
The leading dimension of the array Y.
NRNK ๐
NRNK (input) INTEGER
Determines the mode how to compute the numerical rank, i.e. how to truncate small singular values of the input matrix X. On input, if
NRNK = -1:: i-th singular valuesigma(i)is truncated ifsigma(i) <= TOL*sigma(1). This option is recommended.NRNK = -2:: i-th singular valuesigma(i)is truncated ifsigma(i) <= TOL*sigma(i-1). This option is included for R&D purposes. It requires highly accurate SVD, which may not be feasible.
The numerical rank can be enforced by using positive value of NRNK as follows:
0 < NRNK <= N:: at mostNRNKlargest singular values will be used. If the number of the computed nonzero singular values is less thanNRNK, then only those nonzero values will be used and the actually used dimension is less thanNRNK. The actual number of the nonzero singular values is returned in the variableK.
See the descriptions of TOL and K.
TOL โญ
TOL (input) REAL(KIND=WP), 0 <= TOL < 1
The tolerance for truncating small singular values. See the description of NRNK.
K ๐
K (output) INTEGER, 0 <= K <= N
The dimension of the POD basis for the data snapshot matrix X and the number of the computed Ritz pairs. The value of K is determined according to the rule set by the parameters NRNK and TOL. See the descriptions of NRNK and TOL.
EIGS โจ
EIGS (output) COMPLEX(KIND=WP) N-by-1 array
The leading K (K<=N) entries of EIGS contain the computed eigenvalues (Ritz values). See the descriptions of K, and Z.
Z ๐ง
Z (workspace/output) COMPLEX(KIND=WP) M-by-N array
- If
JOBZ =='V'thenZcontains the Ritz vectors.Z(:,i)is an eigenvector of the i-th Ritz value;||Z(:,i)||_2=1. - If
JOBZ == 'F', then theZ(:,i)'sare given implicitly as the columns ofX(:,1:K)*W(1:K,1:K), i.e.X(:,1:K)*W(:,i)is an eigenvector corresponding toEIGS(i). The columns ofW(1:k,1:K)are the computed eigenvectors of theK-by-KRayleigh quotient.
See the descriptions of EIGS, X and W.
LDZ ๐
LDZ (input) INTEGER , LDZ >= M
The leading dimension of the array Z.
RES ๐ฅ
RES (output) REAL(KIND=WP) N-by-1 array
RES(1:K) contains the residuals for the K computed Ritz pairs,
RES(i) = || A * Z(:,i) - EIGS(i)*Z(:,i))||_2.
See the description of EIGS and Z.
B ๐
B (output) COMPLEX(KIND=WP) M-by-N array.
IF JOBF =='R',B(1:M,1:K)containsA*U(:,1:K), and can be used for computing the refined vectors; see further details in the provided references.- If
JOBF == 'E',B(1:M,1:K)containsA*U(:,1:K)*W(1:K,1:K), which are the vectors from the Exact DMD, up to scaling by the inverse eigenvalues. - If
JOBF =='N', thenBis not referenced.
See the descriptions of X, W, K.
LDB ๐
LDB (input) INTEGER, LDB >= M
The leading dimension of the array B.
W ๐ซถ
W (workspace/output) COMPLEX(KIND=WP) N-by-N array
On exit, W(1:K,1:K) contains the K computed eigenvectors of the matrix Rayleigh quotient. The Ritz vectors (returned in Z) are the product of X (containing a POD basis for the input matrix X) and W. See the descriptions of K, S, X and Z. W is also used as a workspace to temporarily store the right singular vectors of X.
LDW ๐
LDW (input) INTEGER, LDW >= N
The leading dimension of the array W.
S ๐ฆ
S (workspace/output) COMPLEX(KIND=WP) N-by-N array
The array S(1:K,1:K) is used for the matrix Rayleigh quotient. This content is overwritten during the eigenvalue decomposition by CGEEV. See the description of K.
LDS ๐ธ
LDS (input) INTEGER, LDS >= N
The leading dimension of the array S.
ZWORK ๐
ZWORK (workspace/output) COMPLEX(KIND=WP) LZWORK-by-1 array
ZWORK is used as complex workspace in the complex SVD, as specified by WHTSVD (1,2, 3 or 4) and for CGEEV for computing the eigenvalues of a Rayleigh quotient.
If the call to CGEDMD is only workspace query, then ZWORK(1) contains the minimal complex workspace length and ZWORK(2) is the optimal complex workspace length. Hence, the length of work is at least 2.
See the description of LZWORK.
LZWORK ๐
LZWORK (input) INTEGER
The minimal length of the workspace vector ZWORK.
LZWORK is calculated as MAX(LZWORK_SVD, LZWORK_CGEEV), where LZWORK_CGEEV = MAX( 1, 2*N ) and the minimal LZWORK_SVD is calculated as follows
If WHTSVD == 1 :: CGESVD ::
LZWORK_SVD = MAX(1,2*MIN(M,N)+MAX(M,N))
If WHTSVD == 2 :: CGESDD ::
LZWORK_SVD = 2*MIN(M,N)*MIN(M,N)+2*MIN(M,N)+MAX(M,N)
If WHTSVD == 3 :: CGESVDQ ::
LZWORK_SVD = obtainable by a query
If WHTSVD == 4 :: CGEJSV ::
LZWORK_SVD = obtainable by a query
If on entry LZWORK = -1, then a workspace query is assumed and the procedure only computes the minimal and the optimal workspace lengths and returns them in LZWORK(1) and LZWORK(2), respectively.
RWORK โญ
RWORK (workspace/output) REAL(KIND=WP) LRWORK-by-1 array
On exit, RWORK(1:N) contains the singular values of X (for JOBS=='N') or column scaled X (JOBS=='S', 'C').
If WHTSVD==4, then RWORK(N+1) and RWORK(N+2) contain scaling factor RWORK(N+2)/RWORK(N+1) used to scale X and Y to avoid overflow in the SVD of X. This may be of interest if the scaling option is off and as many as possible smallest eigenvalues are desired to the highest feasible accuracy.
If the call to CGEDMD is only workspace query, then RWORK(1) contains the minimal workspace length. See the description of LRWORK.
LRWORK ๐
LRWORK (input) INTEGER
The minimal length of the workspace vector RWORK.
LRWORK is calculated as follows:
LRWORK = MAX(1, N+LRWORK_SVD,N+LRWORK_CGEEV), where
LRWORK_CGEEV = MAX(1,2*N) and RWORK_SVD is the real workspace
for the SVD subroutine determined by the input parameter
WHTSVD.
If WHTSVD == 1 :: CGESVD ::
LRWORK_SVD = 5*MIN(M,N)
If WHTSVD == 2 :: CGESDD ::
LRWORK_SVD = MAX(5*MIN(M,N)*MIN(M,N)+7*MIN(M,N),
2*MAX(M,N)*MIN(M,N)+2*MIN(M,N)*MIN(M,N)+MIN(M,N) ) )
If WHTSVD == 3 :: CGESVDQ ::
LRWORK_SVD = obtainable by a query
If WHTSVD == 4 :: CGEJSV ::
LRWORK_SVD = obtainable by a query
If on entry LRWORK = -1, then a workspace query is assumed and the procedure only computes the minimal real workspace length and returns it in RWORK(1).
IWORK ๐ญ
IWORK (workspace/output) INTEGER LIWORK-by-1 array
Workspace that is required only if WHTSVD equals 2 , 3 or 4. (See the description of WHTSVD).
If on entry LWORK =-1 or LIWORK=-1, then the minimal length of IWORK is computed and returned in IWORK(1). See the description of LIWORK.
LIWORK ๐
LIWORK (input) INTEGER
The minimal length of the workspace vector IWORK.
- If
WHTSVD == 1, then onlyIWORK(1)is used;LIWORK >=1 - If
WHTSVD == 2, thenLIWORK >= MAX(1,8*MIN(M,N)) - If
WHTSVD == 3, thenLIWORK >= MAX(1,M+N-1) - If
WHTSVD == 4, thenLIWORK >= MAX(3,M+3*N)
If on entry LIWORK = -1, then a workspace query is assumed and the procedure only computes the minimal and the optimal workspace lengths for ZWORK, RWORK and IWORK. See the descriptions of ZWORK, RWORK and IWORK.
INFO ๐ซถ
INFO(output)INTEGERโ the little status receipt at the end, bestie. it tells you what went down ๐-i < 0โ the i-th argument had an illegal value ๐ (rude of it, honestly)= 0โ successful return. slay ๐= 1โ void input, quick exit becauseM=0orN=0. nothing to do, we go home ๐= 2โ the SVD computation ofXdid not converge ๐ญ Suggestion: check the input data and/or repeat with differentWHTSVD.= 3โ the computation of the eigenvalues did not converge ๐= 4โ if data scaling was requested on input and the procedure found inconsistency in the data such that for some column index i,X(:,i) = 0butY(:,i) /= 0, thenY(:,i)is set to zero ifJOBS=='C'. The computation proceeds with original or modified data and the warning flag is set withINFO=4. โ ๏ธ
Author
Zlatko Drmac
Definition at line 496 of file cgedmd.f90.
๐ subroutine cgedmdq โ the QR-flavored one ๐
subroutine cgedmdq (character, intent(in) jobs, character, intent(in) jobz,
character, intent(in) jobr, character, intent(in) jobq, character,
intent(in) jobt, character, intent(in) jobf, integer, intent(in) whtsvd,
integer, intent(in) m, integer, intent(in) n, complex(kind=wp),
dimension(ldf,*), intent(inout) f, integer, intent(in) ldf,
complex(kind=wp), dimension(ldx,*), intent(out) x, integer, intent(in)
ldx, complex(kind=wp), dimension(ldy,*), intent(out) y, integer,
intent(in) ldy, integer, intent(in) nrnk, real(kind=wp), intent(in) tol,
integer, intent(out) k, complex(kind=wp), dimension(*), intent(out)
eigs, complex(kind=wp), dimension(ldz,*), intent(out) z, integer,
intent(in) ldz, real(kind=wp), dimension(*), intent(out) res,
complex(kind=wp), dimension(ldb,*), intent(out) b, integer, intent(in)
ldb, complex(kind=wp), dimension(ldv,*), intent(out) v, integer,
intent(in) ldv, complex(kind=wp), dimension(lds,*), intent(out) s,
integer, intent(in) lds, complex(kind=wp), dimension(*), intent(out)
zwork, integer, intent(in) lzwork, real(kind=wp), dimension(*),
intent(out) work, integer, intent(in) lwork, integer, dimension(*),
intent(out) iwork, integer, intent(in) liwork, integer, intent(out)
info)
CGEDMDQ computes the Dynamic Mode Decomposition (DMD) for a pair of data snapshot matrices. yes bestie, it said what it said ๐
Purpose:
CGEDMDQcomputes the Dynamic Mode Decomposition (DMD) for a pair of data snapshot matrices, using a QR factorization based compression of the data. For the input matricesXandYsuch thatY = A*Xwith an unaccessible matrixA,CGEDMDQcomputes a certain number of Ritz pairs ofAusing the standard Rayleigh-Ritz extraction from a subspace ofrange(X)that is determined using the leading left singular vectors ofX. Optionally,CGEDMDQreturns the residuals of the computed Ritz pairs, the information needed for a refinement of the Ritz vectors, or the eigenvectors of the Exact DMD. For further details see the references listed below. For more details of the implementation see [3]. โจ
References:
[1] P. Schmid: Dynamic mode decomposition of numerical and experimental data, Journal of Fluid Mechanics 656, 5-28, 2010. [2] Z. Drmac, I. Mezic, R. Mohr: Data driven modal decompositions: analysis and enhancements, SIAM J. on Sci. Comp. 40 (4), A2253-A2285, 2018. [3] Z. Drmac: A LAPACK implementation of the Dynamic Mode Decomposition I. Technical report. AIMDyn Inc. and LAPACK Working Note 298. [4] J. Tu, C. W. Rowley, D. M. Luchtenburg, S. L. Brunton, N. Kutz: On Dynamic Mode Decomposition: Theory and Applications, Journal of Computational Dynamics 1(2), 391 -421, 2014.
Developed and supported by:
Developed and coded by Zlatko Drmac, Faculty of Science, University of Zagreb; drmac@math.hr In cooperation with AIMdyn Inc., Santa Barbara, CA. and supported by - DARPA SBIR project Contract No: W31P4Q-21-C-0007 - DARPA PAI project Contract No: HR0011-18-9-0033 - DARPA MoDyL project Contract No: HR0011-16-C-0116 Any opinions, findings and conclusions or recommendations expressed in this material are those of the author and do not necessarily reflect the views of the DARPA SBIR Program Office.
Developed and supported by: (yes, it shows up twice โ not a glitch, we're just built different ๐ซถ)
Approved for Public Release, Distribution Unlimited. Cleared by DARPA on September 29, 2022
๐ Parameters
JOBSโ inputCHARACTER*1. Determines whether the initial data snapshots are scaled by a diagonal matrix. The data snapshots are the columns ofF. The leadingN-1columns ofFare denotedXand the trailingN-1columns are denotedY. ๐'S'โ The data snapshots matricesXandYare multiplied with a diagonal matrixDso thatX*Dhas unit nonzero columns (in the Euclidean 2-norm) โจ'C'โ The snapshots are scaled as with the'S'option. If it is found that an i-th column ofXis zero vector and the corresponding i-th column ofYis non-zero, then the i-th column ofYis set to zero and a warning flag is raised. โ ๏ธ'Y'โ The data snapshots matricesXandYare multiplied by a diagonal matrixDso thatY*Dhas unit nonzero columns (in the Euclidean 2-norm) ๐ฆ'N'โ No data scaling. keepin' it raw ๐
JOBZโ inputCHARACTER*1. Determines whether the eigenvectors (Koopman modes) will be computed. ๐ธ'V'โ The eigenvectors (Koopman modes) will be computed and returned in the matrixZ. See the description ofZ.'F'โ The eigenvectors (Koopman modes) will be returned in factored form as the productZ*V, whereZis orthonormal andVcontains the eigenvectors of the corresponding Rayleigh quotient. See the descriptions ofF,V,Z. ๐ง'Q'โ The eigenvectors (Koopman modes) will be returned in factored form as the productQ*Z, whereZcontains the eigenvectors of the compression of the underlying discretised operator onto the span of the data snapshots. See the descriptions ofF,V,Z.Qis from the inital QR facorization. ๐ฅ'N'โ The eigenvectors are not computed.
JOBRโ inputCHARACTER*1. Determines whether to compute the residuals. ๐ค'R'โ The residuals for the computed eigenpairs will be computed and stored in the arrayRES. See the description ofRES. For this option to be legal,JOBZmust be'V'. ๐จ'N'โ The residuals are not computed.
JOBQโ inputCHARACTER*1. Specifies whether to explicitly compute and return the unitary matrix from the QR factorization. ๐'Q'โ The matrixQof the QR factorization of the data snapshot matrix is computed and stored in the arrayF. See the description ofF.'N'โ The matrixQis not explicitly computed.
JOBTโ inputCHARACTER*1. Specifies whether to return the upper triangular factor from the QR factorization. โญ'R'โ The matrixRof the QR factorization of the data snapshot matrixFis returned in the arrayY. See the description ofYand Further details.'N'โ The matrixRis not returned.
JOBFโ inputCHARACTER*1. Specifies whether to store information needed for post-processing (e.g. computing refined Ritz vectors) ๐'R'โ The matrix needed for the refinement of the Ritz vectors is computed and stored in the arrayB. See the description ofB.'E'โ The unscaled eigenvectors of the Exact DMD are computed and returned in the arrayB. See the description ofB. ๐ฆ'N'โ No eigenvector refinement data is computed.- To be useful on exit, this option needs
JOBQ='Q'. ๐
WHTSVDโ inputINTEGER,WHSTVDin{ 1, 2, 3, 4 }. Allows for a selection of the SVD algorithm from the LAPACK library. ๐งฎ1โCGESVD(the QR SVD algorithm)2โCGESDD(the Divide and Conquer algorithm; if enough workspace available, this is the fastest option) โก3โCGESVDQ(the preconditioned QR SVD ; this and 4 are the most accurate options)4โCGEJSV(the preconditioned Jacobi SVD; this and 3 are the most accurate options) ๐- For the four methods above, a significant difference in the accuracy of small singular values is possible if the snapshots vary in norm so that
Xis severely ill-conditioned. If small (smaller thanEPS*||X||) singular values are of interest andJOBS=='N', then the options (3, 4) give the most accurate results, where the option 4 is slightly better and with stronger theoretical background. ๐ - If
JOBS=='S', i.e. the columns ofXwill be normalized, then all methods give nearly equally accurate results. ๐ซถ
Mโ inputINTEGER,M >= 0. The state space dimension (the number of rows ofF). ๐Nโ inputINTEGER,0 <= N <= M. The number of data snapshots from a single trajectory, taken at equidistant discrete times. This is the number of columns ofF. โฐFโFโ okay bestie, this one's a big deal ๐ it's an input/outputCOMPLEX(KIND=WP)M-by-Narray. On entry, the columns ofFare the sequence of data snapshots from a single trajectory, taken at equidistant discrete times. It is assumed that the column norms ofFare in the range of the normalized floating point numbers. On exit: ifJOBQ == 'Q', the arrayFcontains the orthogonal matrix/factor of the QR factorization of the initial data snapshots matrixF(see the description ofJOBQ). IfJOBQ == 'N', the entries inFstrictly below the main diagonal contain, column-wise, the information on the Householder vectors, as returned byCGEQRF. The remaining information to restore the orthogonal matrix of the initial QR factorization is stored inZWORK(1:MIN(M,N))โ see the description ofZWORK. No cap, this is the main character of the whole routine. ๐LDFโ inputINTEGER,LDF >= M. The leading dimension of the arrayF. Just give it the space it needs, bestie. โจXโ workspace/outputCOMPLEX(KIND=WP)MIN(M,N)-by-(N-1)array.Xis used as workspace to hold representations of the leadingN-1snapshots in the orthonormal basis computed in the QR factorization ofF. On exit, the leadingKcolumns ofXcontain the leadingKleft singular vectors of the above described content ofX. To lift them to the space of the left singular vectorsU(:,1:K)of the input data, pre-multiply with theQfactor from the initial QR factorization. See the descriptions ofF,K,VandZ. It's giving "glow-up era" for your snapshots. ๐ฆLDXโ inputINTEGER,LDX >= N. The leading dimension of the arrayX. Yes, it'sN, notMโ stay woke. ๐Yโ workspace/outputCOMPLEX(KIND=WP)MIN(M,N)-by-(N)array.Yis used as workspace to hold representations of the trailingN-1snapshots in the orthonormal basis computed in the QR factorization ofF. On exit: ifJOBT == 'R',Ycontains theMIN(M,N)-by-Nupper triangular factor from the QR factorization of the data snapshot matrixF. Trailing snapshots need love too, okay? ๐ธLDYโ inputINTEGER,LDY >= N. The leading dimension of the arrayY. Same energy asLDX, but forY. ๐NRNKโ inputINTEGER. Determines the mode how to compute the numerical rank, i.e. how to truncate small singular values of the input matrixX. On input, if:NRNK = -1:: i-th singular valuesigma(i)is truncated ifsigma(i) <= TOL*sigma(1). This option is recommended. โNRNK = -2:: i-th singular valuesigma(i)is truncated ifsigma(i) <= TOL*sigma(i-1). This option is included for R&D purposes. It requires highly accurate SVD, which may not be feasible. โ ๏ธ The numerical rank can be enforced by using positive value ofNRNKas follows:0 < NRNK <= N-1:: at mostNRNKlargest singular values will be used. If the number of the computed nonzero singular values is less thanNRNK, then only those nonzero values will be used and the actually used dimension is less thanNRNK. The actual number of the nonzero singular values is returned in the variableK. See the description ofK. Basically, you're the boss of how many singular values get to stay. ๐ช
TOLโ inputREAL(KIND=WP),0 <= TOL < 1. The tolerance for truncating small singular values. See the description ofNRNK. Small but mighty โ don't sleep on this one. ๐ฅKโ outputINTEGER,0 <= K <= N. The dimension of the SVD/POD basis for the leadingN-1data snapshots (columns ofF) and the number of the computed Ritz pairs. The value ofKis determined according to the rule set by the parametersNRNKandTOL. See the descriptions ofNRNKandTOL. This is the actual count that comes out โ no cap. ๐EIGSโ outputCOMPLEX(KIND=WP)(N-1)-by-1array. The leadingK(K<=N-1) entries ofEIGScontain the computed eigenvalues (Ritz values). See the descriptions ofK, andZ. The Ritz values are literally the eigenvalues of your compressed operator โ iconic. ๐Zโ workspace/outputCOMPLEX(KIND=WP)M-by-(N-1)array. IfJOBZ =='V'thenZcontains the Ritz vectors.Z(:,i)is an eigenvector of the i-th Ritz value;||Z(:,i)||_2=1. IfJOBZ == 'F', then theZ(:,i)'s are given implicitly asZ*V, whereZcontains orthonormal matrix (the product ofQfrom the initial QR factorization and the SVD/POD_basis returned byCGEDMDinX) and the second factor (the eigenvectors of the Rayleigh quotient) is in the arrayV, as returned byCGEDMD. That is,X(:,1:K)*V(:,i)is an eigenvector corresponding toEIGS(i). The columns ofV(1:K,1:K)are the computed eigenvectors of theK-by-KRayleigh quotient. See the descriptions ofEIGS,XandV. Two modes, both slay โ pick your fighter. ๐LDZโ inputINTEGER,LDZ >= M. The leading dimension of the arrayZ. Don't forget to size it right! ๐RESโ outputREAL(KIND=WP)(N-1)-by-1array.RES(1:K)contains the residuals for theKcomputed Ritz pairs,
RES(i) = || A * Z(:,i) - EIGS(i)*Z(:,i))||_2.
See the description of EIGS and Z. Residuals are like the vibe check โ how close did we actually get? ๐
Bโ outputCOMPLEX(KIND=WP)MIN(M,N)-by-(N-1)array. IfJOBF =='R',B(1:N,1:K)containsA*U(:,1:K), and can be used for computing the refined vectors; see further details in the provided references. IfJOBF == 'E',B(1:N,1;K)containsA*U(:,1:K)*W(1:K,1:K), which are the vectors from the Exact DMD, up to scaling by the inverse eigenvalues. In both cases, the content ofBcan be lifted to the original dimension of the input data by pre-multiplying with theQfactor from the initial QR factorization. HereAdenotes a compression of the underlying operator. See the descriptions ofFandX. IfJOBF =='N', thenBis not referenced. Note the semicolon inB(1:N,1;K)โ that's in the original, bestie, don't come for me. ๐ญLDBโ inputINTEGER,LDB >= MIN(M,N). The leading dimension of the arrayB. Size it like you mean it. โจVโ workspace/outputCOMPLEX(KIND=WP)(N-1)-by-(N-1)array. On exit,V(1:K,1:K)Vcontains theKeigenvectors of the Rayleigh quotient. The Ritz vectors (returned inZ) are the product ofQfrom the initial QR factorization (see the description ofF)X(see the description ofX) andV. It's giving collaboration โQ,X, andVworking together. ๐ซถLDVโ inputINTEGER,LDV >= N-1. The leading dimension of the arrayV. Yep,N-1โ notN. ๐Sโ outputCOMPLEX(KIND=WP)(N-1)-by-(N-1)array. The arrayS(1:K,1:K)is used for the matrix Rayleigh quotient. This content is overwritten during the eigenvalue decomposition byCGEEV. See the description ofK. Heads up:Sgets clobbered byCGEEVโ don't get attached. ๐LDSโ inputINTEGER,LDS >= N-1. The leading dimension of the arrayS. Match theN-1vibe. ๐ZWORKโ workspace/outputCOMPLEX(KIND=WP)LWORK-by-1array. On exit,ZWORK(1:MIN(M,N))contains the scalar factors of the elementary reflectors as returned byCGEQRFof theM-by-Ninput matrixF. If the call toCGEDMDQis only workspace query, thenZWORK(1)contains the minimal complex workspace length andZWORK(2)is the optimal complex workspace length. Hence, the length of work is at least2. See the description ofLZWORK. Workspace query?ZWORK(1)andZWORK(2)are your new besties. ๐LZWORKโ inputINTEGER. The minimal length of the workspace vectorZWORK.LZWORKis calculated as follows:
Let MLWQR = N (minimal workspace for CGEQRF[M,N])
MLWDMD = minimal workspace for CGEDMD (see the
description of LWORK in CGEDMD)
MLWMQR = N (minimal workspace for
ZUNMQR['L','N',M,N,N])
MLWGQR = N (minimal workspace for ZUNGQR[M,N,N])
MINMN = MIN(M,N)
Then
LZWORK = MAX(2, MIN(M,N)+MLWQR, MINMN+MLWDMD)
is further updated as follows:
if JOBZ == 'V' or JOBZ == 'F' THEN
LZWORK = MAX( LZWORK, MINMN+MLWMQR )
if JOBQ == 'Q' THEN
LZWORK = MAX( ZLWORK, MINMN+MLWGQR)
Note: the original says ZLWORK in that last line โ I'm not fixing it, I'm just the messenger. ๐ญ
WORKโ workspace/outputREAL(KIND=WP)LWORK-by-1array. On exit,WORK(1:N-1)contains the singular values of the input submatrixF(1:M,1:N-1). If the call toCGEDMDQis only workspace query, thenWORK(1)contains the minimal workspace length andWORK(2)is the optimal workspace length. hence, the length of work is at least2. See the description ofLWORK. Yes, "hence" is lowercase in the original โ keep it cute. ๐LWORKโ inputINTEGER. The minimal length of the workspace vectorWORK.LWORKis the same as inCGEDMD, because inCGEDMDQonlyCGEDMDrequires real workspace for snapshots of dimensionsMIN(M,N)-by-(N-1). If on entryLWORK = -1, then a workspace query is assumed and the procedure only computes the minimal and the optimal workspace lengths for bothWORKandIWORK. See the descriptions ofWORKandIWORK. Set it to-1to ask "how much space do I need?" โ it's the polite thing to do. ๐IWORKโ workspace/outputINTEGERLIWORK-by-1array. Workspace that is required only ifWHTSVDequals2,3or4. (See the description ofWHTSVD). If on entryLWORK =-1orLIWORK=-1, then the minimal length ofIWORKis computed and returned inIWORK(1). See the description ofLIWORK. Integer workspace, but make it fashion. โจLIWORKโ (the description continues in the next part, butLIWORKis the length ofIWORKโ stay tuned, bestie) ๐LIWORK(input) INTEGER โ bestie, this is the minimal length of the workspace vectorIWORK. IfWHTSVD == 1, then onlyIWORK(1)is used;LIWORK >=1. LetM1=MIN(M,N),N1=N-1. Then:- If
WHTSVD == 2, thenLIWORK >= MAX(1,8*MIN(M,N)) - If
WHTSVD == 3, thenLIWORK >= MAX(1,M+N-1) - If
WHTSVD == 4, thenLIWORK >= MAX(3,M+3*N)
- If
If on entry LIWORK = -1, then a workspace query is assumed and the procedure only computes the minimal and the optimal workspace lengths for both WORK and IWORK. See the descriptions of WORK and IWORK. โจ
INFO(output) INTEGER โ the receipts, no cap:-i < 0:: On entry, the i-th argument had an illegal value= 0:: Successful return.= 1:: Void input. Quick exit (M=0orN=0).= 2:: The SVD computation ofXdid not converge. Suggestion: Check the input data and/or repeat with differentWHTSVD.= 3:: The computation of the eigenvalues did not converge.= 4:: If data scaling was requested on input and the procedure found inconsistency in the data such that for some column indexi,X(:,i) = 0butY(:,i) /= 0, thenY(:,i)is set to zero ifJOBS=='C'. The computation proceeds with original or modified data and warning flag is set withINFO=4.
๐๏ธ Author
Zlatko Drmac
Definition at line 552 of file cgedmdq.f90.
๐ธ subroutine dgedmd
subroutine dgedmd (character, intent(in) jobs, character, intent(in) jobz,
character, intent(in) jobr, character, intent(in) jobf, integer,
intent(in) whtsvd, integer, intent(in) m, integer, intent(in) n,
real(kind=wp), dimension(ldx,*), intent(inout) x, integer, intent(in)
ldx, real(kind=wp), dimension(ldy,*), intent(inout) y, integer,
intent(in) ldy, integer, intent(in) nrnk, real(kind=wp), intent(in) tol,
integer, intent(out) k, real(kind=wp), dimension(*), intent(out) reig,
real(kind=wp), dimension(*), intent(out) imeig, real(kind=wp),
dimension(ldz,*), intent(out) z, integer, intent(in) ldz, real(kind=wp),
dimension(*), intent(out) res, real(kind=wp), dimension(ldb,*),
intent(out) b, integer, intent(in) ldb, real(kind=wp), dimension(ldw,*),
intent(out) w, integer, intent(in) ldw, real(kind=wp), dimension(lds,*),
intent(out) s, integer, intent(in) lds, real(kind=wp), dimension(*),
intent(out) work, integer, intent(in) lwork, integer, dimension(*),
intent(out) iwork, integer, intent(in) liwork, integer, intent(out)
info)
DGEDMD computes the Dynamic Mode Decomposition (DMD) for a pair of data snapshot matrices. ๐ฆ
๐ฏ Purpose
DGEDMD computes the Dynamic Mode Decomposition (DMD) for a pair of data snapshot matrices. For the input matrices X and Y such that Y = A*X with an unaccessible matrix A, DGEDMD computes a certain number of Ritz pairs of A using the standard Rayleigh-Ritz extraction from a subspace of range(X) that is determined using the leading left singular vectors of X. Optionally, DGEDMD returns the residuals of the computed Ritz pairs, the information needed for a refinement of the Ritz vectors, or the eigenvectors of the Exact DMD. For further details see the references listed below. For more details of the implementation see [3]. ๐
๐ References
- [1] P. Schmid: Dynamic mode decomposition of numerical and experimental data, Journal of Fluid Mechanics 656, 5-28, 2010.
- [2] Z. Drmac, I. Mezic, R. Mohr: Data driven modal decompositions: analysis and enhancements, SIAM J. on Sci. Comp. 40 (4), A2253-A2285, 2018.
- [3] Z. Drmac: A LAPACK implementation of the Dynamic Mode Decomposition I. Technical report. AIMDyn Inc. and LAPACK Working Note 298.
- [4] J. Tu, C. W. Rowley, D. M. Luchtenburg, S. L. Brunton, N. Kutz: On Dynamic Mode Decomposition: Theory and Applications, Journal of Computational Dynamics 1(2), 391 -421, 2014.
๐ Developed and supported by
Developed and coded by Zlatko Drmac, Faculty of Science, University of Zagreb; drmac@math.hr
In cooperation with AIMdyn Inc., Santa Barbara, CA.
and supported by
- DARPA SBIR project Contract No:
W31P4Q-21-C-0007 - DARPA PAI project Contract No:
HR0011-18-9-0033 - DARPA MoDyL project Contract No:
HR0011-16-C-0116
Any opinions, findings and conclusions or recommendations expressed in this material are those of the author and do not necessarily reflect the views of the DARPA SBIR Program Office.
๐ฆ Distribution Statement A
Approved for Public Release, Distribution Unlimited.
Cleared by DARPA on September 29, 2022.
๐ ๏ธ Parameters
JOBS(input) isCHARACTER*1โ determines whether the initial data snapshots are scaled by a diagonal matrix.'S':: The data snapshots matricesXandYare multiplied with a diagonal matrixDso thatX*Dhas unit nonzero columns (in the Euclidean 2-norm)'C':: The snapshots are scaled as with the'S'option. If it is found that an i-th column ofXis zero vector and the corresponding i-th column ofYis non-zero, then the i-th column ofYis set to zero and a warning flag is raised.'Y':: The data snapshots matricesXandYare multiplied by a diagonal matrixDso thatY*Dhas unit nonzero columns (in the Euclidean 2-norm)'N':: No data scaling.
JOBZ(input)CHARACTER*1โ determines whether the eigenvectors (Koopman modes) will be computed.'V':: The eigenvectors (Koopman modes) will be computed and returned in the matrixZ. See the description ofZ.'F':: The eigenvectors (Koopman modes) will be returned in factored form as the productX(:,1:K)*W, whereXcontains a POD basis (leading left singular vectors of the data matrixX) andWcontains the eigenvectors of the corresponding Rayleigh quotient. See the descriptions ofK,X,W,Z.'N':: The eigenvectors are not computed.
JOBR(input)CHARACTER*1โ determines whether to compute the residuals.'R':: The residuals for the computed eigenpairs will be computed and stored in the arrayRES. See the description ofRES. For this option to be legal,JOBZmust be'V'.'N':: The residuals are not computed.
JOBF(input)CHARACTER*1โ specifies whether to store information needed for post-processing (e.g. computing refined Ritz vectors).'R':: The matrix needed for the refinement of the Ritz vectors is computed and stored in the arrayB. See the description ofB.'E':: The unscaled eigenvectors of the Exact DMD are computed and returned in the arrayB. See the description ofB.'N':: No eigenvector refinement data is computed.
WHTSVD(input) INTEGER,WHSTVD in { 1, 2, 3, 4 }โ allows for a selection of the SVD algorithm from the LAPACK library. ๐ซถ1::DGESVD(the QR SVD algorithm)2::DGESDD(the Divide and Conquer algorithm; if enough workspace available, this is the fastest option)3::DGESVDQ(the preconditioned QR SVD ; this and 4 are the most accurate options)4::DGEJSV(the preconditioned Jacobi SVD; this and 3 are the most accurate options)
For the four methods above, a significant difference in the accuracy of small singular values is possible if the snapshots vary in norm so that X is severely ill-conditioned. If small (smaller than EPS*||X||) singular values are of interest and JOBS=='N', then the options (3, 4) give the most accurate results, where the option 4 is slightly better and with stronger theoretical background. If JOBS=='S', i.e. the columns of X will be normalized, then all methods give nearly equally accurate results.
M(input) INTEGER,M>= 0โ the state space dimension (the row dimension ofX,Y).N(input) INTEGER,0 <= N <= Mโ the number of data snapshot pairs (the number of columns ofXandY).X(input/output)REAL(KIND=WP)M-by-N array โ on entry,Xcontains the data snapshot matrixX. It is assumed that the column norms ofXare in the range of the normalized floating point numbers. On exit, the leadingKcolumns ofXcontain a POD basis, i.e. the leadingKleft singular vectors of the input data matrixX,U(:,1:K). AllNcolumns ofXcontain all left singular vectors of the input matrixX. See the descriptions ofK,ZandW. ๐ธLDX(input) INTEGER,LDX >= Mโ the leading dimension of the arrayX.Y(input/workspace/output)REAL(KIND=WP)M-by-N array โ on entry,Ycontains the data snapshot matrixY. On exit:- If
JOBR == 'R', the leadingKcolumns ofYcontain the residual vectors for the computed Ritz pairs. See the description ofRES. - If
JOBR == 'N',Ycontains the original input data, scaled according to the value ofJOBS.
- If
LDY(input) INTEGER ,LDY >= Mโ the leading dimension of the arrayY.NRNKNRNKโ (input)INTEGERโ this one sets the mode for computing the numerical rank, aka how we truncate the tiny singular values of the input matrixX. On input, if:NRNK = -1:: the i-th singular valuesigma(i)is truncated ifsigma(i) <= TOL*sigma(1). This option is recommended. ๐NRNK = -2:: the i-th singular valuesigma(i)is truncated ifsigma(i) <= TOL*sigma(i-1). This option is included for R&D purposes. It requires highly accurate SVD, which may not be feasible. iykyk, it's giving "lab experiment" energy ๐งช
The numerical rank can be enforced by using positive value of NRNK as follows:
0 < NRNK <= N :: at most NRNK largest singular values will be used. If the number of the computed nonzero singular values is less than NRNK, then only those nonzero values will be used and the actually used dimension is less than NRNK. The actual number of the nonzero singular values is returned in the variable K. See the descriptions of TOL and K.
TOLโ (input)REAL(KIND=WP),0 <= TOL < 1โ the tolerance for truncating small singular values. See the description ofNRNK. ๐Kโ (output)INTEGER,0 <= K <= Nโ the dimension of the POD basis for the data snapshot matrixXand the number of the computed Ritz pairs. The value ofKis determined according to the rule set by the parametersNRNKandTOL. See the descriptions ofNRNKandTOL. โจREIGโ (output)REAL(KIND=WP)N-by-1array โ the leadingK(K<=N) entries ofREIGcontain the real parts of the computed eigenvaluesREIG(1:K) + sqrt(-1)*IMEIG(1:K). See the descriptions ofK,IMEIG, andZ.IMEIGโ (output)REAL(KIND=WP)N-by-1array โ the leadingK(K<=N) entries ofIMEIGcontain the imaginary parts of the computed eigenvaluesREIG(1:K) + sqrt(-1)*IMEIG(1:K). The eigenvalues are determined as follows:
If IMEIG(i) == 0, then the corresponding eigenvalue is real, LAMBDA(i) = REIG(i).
If IMEIG(i)>0, then the corresponding complex conjugate pair of eigenvalues reads
LAMBDA(i) = REIG(i) + sqrt(-1)*IMAG(i)
LAMBDA(i+1) = REIG(i) - sqrt(-1)*IMAG(i)
That is, complex conjugate pairs have consecutive indices (i,i+1), with the positive imaginary part listed first. See the descriptions of K, REIG, and Z.
Zโ (workspace/output)REAL(KIND=WP)M-by-Narray.
If JOBZ =='V' then Z contains real Ritz vectors as follows:
- If
IMEIG(i)=0, thenZ(:,i)is an eigenvector of the i-th Ritz value;||Z(:,i)||_2=1. - If
IMEIG(i) > 0(andIMEIG(i+1) < 0) then[Z(:,i) Z(:,i+1)]span an invariant subspace and the Ritz values extracted from this subspace areREIG(i) + sqrt(-1)*IMEIG(i)andREIG(i) - sqrt(-1)*IMEIG(i). The corresponding eigenvectors areZ(:,i) + sqrt(-1)*Z(:,i+1)andZ(:,i) - sqrt(-1)*Z(:,i+1), respectively.|| Z(:,i:i+1)||_F = 1.
If JOBZ == 'F', then the above descriptions hold for the columns of X(:,1:K)*W(1:K,1:K), where the columns of W(1:k,1:K) are the computed eigenvectors of the K-by-K Rayleigh quotient. The columns of W(1:K,1:K) are similarly structured: If IMEIG(i) == 0 then X(:,1:K)*W(:,i) is an eigenvector, and if IMEIG(i)>0 then X(:,1:K)*W(:,i)+sqrt(-1)*X(:,1:K)*W(:,i+1) and X(:,1:K)*W(:,i)-sqrt(-1)*X(:,1:K)*W(:,i+1) are the eigenvectors of LAMBDA(i), LAMBDA(i+1). See the descriptions of REIG, IMEIG, X and W.
LDZโ (input)INTEGER,LDZ >= Mโ the leading dimension of the arrayZ. ๐RESโ (output)REAL(KIND=WP)N-by-1array โRES(1:K)contains the residuals for theKcomputed Ritz pairs.
If LAMBDA(i) is real, then
RES(i) = || A * Z(:,i) - LAMBDA(i)*Z(:,i))||_2.
If [LAMBDA(i), LAMBDA(i+1)] is a complex conjugate pair then
RES(i)=RES(i+1) = || A * Z(:,i:i+1) - Z(:,i:i+1) *B||_F
where B = [ real(LAMBDA(i)) imag(LAMBDA(i)) ]
[-imag(LAMBDA(i)) real(LAMBDA(i)) ].
It holds that
RES(i) = || A*ZC(:,i) - LAMBDA(i) *ZC(:,i) ||_2
RES(i+1) = || A*ZC(:,i+1) - LAMBDA(i+1)*ZC(:,i+1) ||_2
where ZC(:,i) = Z(:,i) + sqrt(-1)*Z(:,i+1)
ZC(:,i+1) = Z(:,i) - sqrt(-1)*Z(:,i+1)
See the description of REIG, IMEIG and Z.
Bโ (output)REAL(KIND=WP)M-by-Narray.
If JOBF =='R', B(1:M,1:K) contains A*U(:,1:K), and can be used for computing the refined vectors; see further details in the provided references.
If JOBF == 'E', B(1:M,1;K) contains A*U(:,1:K)*W(1:K,1:K), which are the vectors from the Exact DMD, up to scaling by the inverse eigenvalues.
If JOBF =='N', then B is not referenced.
See the descriptions of X, W, K.
LDBโ (input)INTEGER,LDB >= Mโ the leading dimension of the arrayB.Wโ (workspace/output)REAL(KIND=WP)N-by-Narray โ on exit,W(1:K,1:K)contains theKcomputed eigenvectors of the matrix Rayleigh quotient (real and imaginary parts for each complex conjugate pair of the eigenvalues). The Ritz vectors (returned inZ) are the product ofX(containing a POD basis for the input matrixX) andW. See the descriptions ofK,S,XandZ.Wis also used as a workspace to temporarily store the right singular vectors ofX. ๐ฆLDWโ (input)INTEGER,LDW >= Nโ the leading dimension of the arrayW.Sโ (workspace/output)REAL(KIND=WP)N-by-Narray โ the arrayS(1:K,1:K)is used for the matrix Rayleigh quotient. This content is overwritten during the eigenvalue decomposition byDGEEV. See the description ofK. ๐ญLDSโ (input)INTEGER,LDS >= Nโ the leading dimension of the arrayS.WORKโ (workspace/output)REAL(KIND=WP)LWORK-by-1array.
On exit, WORK(1:N) contains the singular values of X (for JOBS=='N') or column scaled X (JOBS=='S', 'C').
If WHTSVD==4, then WORK(N+1) and WORK(N+2) contain scaling factor WORK(N+2)/WORK(N+1) used to scale X and Y to avoid overflow in the SVD of X. This may be of interest if the scaling option is off and as many as possible smallest eigenvalues are desired to the highest feasible accuracy.
If the call to DGEDMD is only workspace query, then WORK(1) contains the minimal workspace length and WORK(2) is the optimal workspace length. Hence, the leng of WORK is at least 2. (source spelling, not mine ๐)
See the description of LWORK.
LWORKโ (input)INTEGERโ the minimal length of the workspace vectorWORK.LWORKis calculated as follows:
If WHTSVD == 1 ::
- If
JOBZ == 'V', then
LWORK >= MAX(2, N + LWORK_SVD, N+MAX(1,4*N)).
- If
JOBZ == 'N'then
LWORK >= MAX(2, N + LWORK_SVD, N+MAX(1,3*N)).
Here LWORK_SVD = MAX(1,3*N+M,5*N) is the minimal workspace length of DGESVD.
If WHTSVD == 2 ::
- If
JOBZ == 'V', then
LWORK >= MAX(2, N + LWORK_SVD, N+MAX(1,4*N))
- If
JOBZ == 'N', then
LWORK >= MAX(2, N + LWORK_SVD, N+MAX(1,3*N))
Here LWORK_SVD = MAX(M, 5*N*N+4*N)+3*N*N is the minimal workspace length of DGESDD.
If WHTSVD == 3 ::
- If
JOBZ == 'V', then
LWORK >= MAX(2, N+LWORK_SVD,N+MAX(1,4*N))
- If
JOBZ == 'N', then
LWORK >= MAX(2, N+LWORK_SVD,N+MAX(1,3*N))
Here
LWORK_SVD = N+M+MAX(3*N+1,
MAX(1,3*N+M,5*N),MAX(1,N))
is the minimal workspace length of DGESVDQ.
If WHTSVD == 4 ::
- If
JOBZ == 'V', then
LWORK >= MAX(2, N+LWORK_SVD,N+MAX(1,4*N))
- If
JOBZ == 'N', then
LWORK >= MAX(2, N+LWORK_SVD,N+MAX(1,3*N))
Here LWORK_SVD = MAX(7,2*M+N,6*N+2*N*N) is the minimal workspace length of DGEJSV.
The above expressions are not simplified in order to make the usage of WORK more transparent, and for easier checking. In any case, LWORK >= 2.
If on entry LWORK = -1, then a workspace query is assumed and the procedure only computes the minimal and the optimal workspace lengths for both WORK and IWORK. See the descriptions of WORK and IWORK.
IWORKโ (workspace/output)INTEGERLIWORK-by-1array โ workspace that is required only ifWHTSVDequals2,3or4. (See the description ofWHTSVD.) If on entryLWORK =-1orLIWORK=-1, then the minimal length ofIWORKis computed and returned inIWORK(1). See the description ofLIWORK. ๐LIWORKโ (input)INTEGERโ the minimal length of the workspace vectorIWORK.- If
WHTSVD == 1, then onlyIWORK(1)is used;LIWORK >=1 - If
WHTSVD == 2, thenLIWORK >= MAX(1,8*MIN(M,N)) - If
WHTSVD == 3, thenLIWORK >= MAX(1,M+N-1) - If
WHTSVD == 4, thenLIWORK >= MAX(3,M+3*N)
- If
If on entry LIWORK = -1, then a workspace query is assumed and the procedure only computes the minimal and the optimal workspace lengths for both WORK and IWORK. See the descriptions of WORK and IWORK.
INFOโ (output)INTEGER
okay so picking right back up with the INFO deets, because bestie this one's a whole mood board of possible outcomes ๐
-i < 0โ on entry, the i-th argument had an illegal value. classic. somebody passed something cursed.= 0โ successful return. we love to see it ๐= 1โ void input. quick exit (M=0orN=0). literally nothing to do, so it dipped immediately.= 2โ the SVD computation ofXdid not converge ๐ญ Suggestion: check the input data and/or repeat with a differentWHTSVD.= 3โ the computation of the eigenvalues did not converge. sad.= 4โ if data scaling was requested on input and the procedure found inconsistency in the data such that for some column index i,X(:,i) = 0butY(:,i) /= 0, thenY(:,i)is set to zero ifJOBS=='C'. The computation proceeds with original or modified data and the warning flag is set withINFO=4. so it just shrugs and keeps going ๐ซถ
Author
Zlatko Drmac
Definition at line 530 of file dgedmd.f90.
okay now we get to the queen of the page, the one with the extra Q energy โ DGEDMDQ ๐
subroutine dgedmdq (character, intent(in) jobs, character, intent(in) jobz,
character, intent(in) jobr, character, intent(in) jobq, character,
intent(in) jobt, character, intent(in) jobf, integer, intent(in) whtsvd,
integer, intent(in) m, integer, intent(in) n, real(kind=wp),
dimension(ldf,*), intent(inout) f, integer, intent(in) ldf,
real(kind=wp), dimension(ldx,*), intent(out) x, integer, intent(in) ldx,
real(kind=wp), dimension(ldy,*), intent(out) y, integer, intent(in) ldy,
integer, intent(in) nrnk, real(kind=wp), intent(in) tol, integer,
intent(out) k, real(kind=wp), dimension(*), intent(out) reig,
real(kind=wp), dimension(*), intent(out) imeig, real(kind=wp),
dimension(ldz,*), intent(out) z, integer, intent(in) ldz, real(kind=wp),
dimension(*), intent(out) res, real(kind=wp), dimension(ldb,*),
intent(out) b, integer, intent(in) ldb, real(kind=wp), dimension(ldv,*),
intent(out) v, integer, intent(in) ldv, real(kind=wp), dimension(lds,*),
intent(out) s, integer, intent(in) lds, real(kind=wp), dimension(*),
intent(out) work, integer, intent(in) lwork, integer, dimension(*),
intent(out) iwork, integer, intent(in) liwork, integer, intent(out)
info)
DGEDMDQ computes the Dynamic Mode Decomposition (DMD) for a pair of data snapshot matrices. that's the whole vibe, but like, let her explain.
โจ Purpose โจ
DGEDMDQ computes the Dynamic Mode Decomposition (DMD) for a pair of data snapshot matrices, using a QR factorization based compression of the data.
so โ for the input matrices X and Y such that Y = A*X with an unaccessible matrix A, DGEDMDQ computes a certain number of Ritz pairs of A using the standard Rayleigh-Ritz extraction from a subspace of range(X) that is determined using the leading left singular vectors of X. Optionally, DGEDMDQ returns the residuals of the computed Ritz pairs, the information needed for a refinement of the Ritz vectors, or the eigenvectors of the Exact DMD. it does it all, no cap ๐
For further details see the references listed below. For more details of the implementation see [3].
๐ References ๐
[1]P. Schmid: Dynamic mode decomposition of numerical and experimental data, Journal of Fluid Mechanics 656, 5-28, 2010.[2]Z. Drmac, I. Mezic, R. Mohr: Data driven modal decompositions: analysis and enhancements, SIAM J. on Sci. Comp. 40 (4), A2253-A2285, 2018.[3]Z. Drmac: A LAPACK implementation of the Dynamic Mode Decomposition I. Technical report. AIMDyn Inc. and LAPACK Working Note 298.[4]J. Tu, C. W. Rowley, D. M. Luchtenburg, S. L. Brunton, N. Kutz: On Dynamic Mode Decomposition: Theory and Applications, Journal of Computational Dynamics 1(2), 391 -421, 2014.
the reading list ate, honestly ๐ฅ
๐ธ Developed and supported by ๐ธ
Developed and coded by Zlatko Drmac, Faculty of Science, University of Zagreb; drmac@math.hr
In cooperation with AIMdyn Inc., Santa Barbara, CA.
and supported by:
- DARPA SBIR project โ Contract No:
W31P4Q-21-C-0007 - DARPA PAI project โ Contract No:
HR0011-18-9-0033 - DARPA MoDyL project โ Contract No:
HR0011-16-C-0116
Any opinions, findings and conclusions or recommendations expressed in this material are those of the author and do not necessarily reflect the views of the DARPA SBIR Program Office. (legal said what legal said ๐ซถ)
๐ฆ Distribution Statement A ๐ฆ
Approved for Public Release, Distribution Unlimited. Cleared by DARPA on September 29, 2022
iconic. cleared. periodt. ๐
โจ Parameters โจ
JOBS
JOBS (input) CHARACTER*1 โ determines whether the initial data snapshots are scaled by a diagonal matrix. The data snapshots are the columns of F. The leading N-1 columns of F are denoted X and the trailing N-1 columns are denoted Y. (yes, that's how the slicing works, don't @ me)
'S'โ the data snapshots matricesXandYare multiplied with a diagonal matrixDso thatX*Dhas unit nonzero columns (in the Euclidean 2-norm).'C'โ the snapshots are scaled as with the'S'option. If it is found that an i-th column ofXis zero vector and the corresponding i-th column ofYis non-zero, then the i-th column ofYis set to zero and a warning flag is raised. (the cleanup crew option ๐งน)'Y'โ the data snapshots matricesXandYare multiplied by a diagonal matrixDso thatY*Dhas unit nonzero columns (in the Euclidean 2-norm).'N'โ no data scaling.
JOBZ
JOBZ (input) CHARACTER*1 โ determines whether the eigenvectors (Koopman modes) will be computed. the main character decision, fr.
'V'โ the eigenvectors (Koopman modes) will be computed and returned in the matrixZ. See the description ofZ.'F'โ the eigenvectors (Koopman modes) will be returned in factored form as the productZ*V, whereZis orthonormal andVcontains the eigenvectors of the corresponding Rayleigh quotient. See the descriptions ofF,V,Z.'Q'โ the eigenvectors (Koopman modes) will be returned in factored form as the productQ*Z, whereZcontains the eigenvectors of the compression of the underlying discretized operator onto the span of the data snapshots. See the descriptions ofF,V,Z.Qis from the initial QR factorization.'N'โ the eigenvectors are not computed. (respectfully, we're skipping that part)
JOBR
JOBR (input) CHARACTER*1 โ determines whether to compute the residuals.
'R'โ the residuals for the computed eigenpairs will be computed and stored in the arrayRES. See the description ofRES. For this option to be legal,JOBZmust be'V'. โ ๏ธ so like, don't try it with anything else.'N'โ the residuals are not computed.
JOBQ
JOBQ (input) CHARACTER*1 โ specifies whether to explicitly compute and return the orthogonal matrix from the QR factorization.
'Q'โ the matrixQof the QR factorization of the data snapshot matrix is computed and stored in the arrayF. See the description ofF.'N'โ the matrixQis not explicitly computed.
JOBT
JOBT (input) CHARACTER*1 โ specifies whether to return the upper triangular factor from the QR factorization.
'R'โ the matrixRof the QR factorization of the data snapshot matrixFis returned in the arrayY. See the description ofYand Further details.'N'โ the matrixRis not returned.
JOBF
JOBF (input) CHARACTER*1 โ specifies whether to store information needed for post-processing (e.g. computing refined Ritz vectors)
'R'โ the matrix needed for the refinement of the Ritz vectors is computed and stored in the arrayB. See the description ofB.'E'โ the unscaled eigenvectors of the Exact DMD are computed and returned in the arrayB. See the description ofB.'N'โ no eigenvector refinement data is computed.- To be useful on exit, this option needs
JOBQ='Q'. ๐ keep that in mind bestie.
WHTSVD
WHTSVD (input) INTEGER, WHSTVD in { 1, 2, 3, 4 } โ allows for a selection of the SVD algorithm from the LAPACK library. pick your fighter ๐
1โDGESVD(the QR SVD algorithm)2โDGESDD(the Divide and Conquer algorithm; if enough workspace available, this is the fastest option) โก3โDGESVDQ(the preconditioned QR SVD; this and 4 are the most accurate options)4โDGEJSV(the preconditioned Jacobi SVD; this and 3 are the most accurate options)
For the four methods above, a significant difference in the accuracy of small singular values is possible if the snapshots vary in norm so that X is severely ill-conditioned. If small (smaller than EPS*||X||) singular values are of interest and JOBS=='N', then the options (3, 4) give the most accurate results, where the option 4 is slightly better and with stronger theoretical background. If JOBS=='S', i.e. the columns of X will be normalized, then all methods give nearly equally accurate results. so like, if you scaled, it's basically a tie ๐
M
M (input) INTEGER, M >= 0 โ the state space dimension (the number of rows of F).
N
N (input) INTEGER, 0 <= N <= M โ the number of data snapshots from a single trajectory, taken at equidistant discrete times. This is the number of columns of F.
F
F โ okay so this is the big one, and she has so much to sayโฆ
Fโ input/outputREAL(KIND=WP) M-by-Narray ๐- On entry: the columns of
Fare the sequence of data snapshots from a single trajectory, taken at equidistant discrete times. Itโs assumed that the column norms ofFare in the range of the normalized floating point numbers. โจ - On exit:
- If
JOBQ == 'Q',Fcontains the orthogonal matrix/factor of the QR factorization of the initial data snapshots matrixF. See the description ofJOBQ. - If
JOBQ == 'N', the entries inFstrictly below the main diagonal contain, column-wise, the information on the Householder vectors, as returned byDGEQRF. The remaining information to restore the orthogonal matrix of the initial QR factorization is stored inWORK(1:N). See the description ofWORK.
- If
- On entry: the columns of
LDFโ inputINTEGER,LDF >= M. The leading dimension of the arrayF. ๐Xโ workspace/outputREAL(KIND=WP) MIN(M,N)-by-(N-1)array.Xis used as workspace to hold representations of the leadingN-1snapshots in the orthonormal basis computed in the QR factorization ofF. On exit, the leadingKcolumns ofXcontain the leadingKleft singular vectors of the above described content ofX. To lift them to the space of the left singular vectorsU(:,1:K)of the input data, pre-multiply with theQfactor from the initial QR factorization. See the descriptions ofF,K,VandZ. ๐ฆLDXโ inputINTEGER,LDX >= N. The leading dimension of the arrayX. ๐ธYโ workspace/outputREAL(KIND=WP) MIN(M,N)-by-(N-1)array.Yis used as workspace to hold representations of the trailingN-1snapshots in the orthonormal basis computed in the QR factorization ofF. On exit, ifJOBT == 'R',Ycontains theMIN(M,N)-by-Nupper triangular factor from the QR factorization of the data snapshot matrixF. ๐LDYโ inputINTEGER,LDY >= N. The leading dimension of the arrayY. ๐ซถNRNKโ inputINTEGER. Determines the mode how to compute the numerical rank, i.e. how to truncate small singular values of the input matrixX. On input, if:NRNK = -1::i-th singular valuesigma(i)is truncated ifsigma(i) <= TOL*sigma(1). This option is recommended. ๐NRNK = -2::i-th singular valuesigma(i)is truncated ifsigma(i) <= TOL*sigma(i-1). This option is included for R&D purposes. It requires highly accurate SVD, which may not be feasible. ๐- The numerical rank can be enforced by using a positive value of
NRNKas follows:0 < NRNK <= N-1:: at mostNRNKlargest singular values will be used. If the number of the computed nonzero singular values is less thanNRNK, then only those nonzero values will be used and the actually used dimension is less thanNRNK. The actual number of the nonzero singular values is returned in the variableK. See the description ofK.
TOLโ inputREAL(KIND=WP),0 <= TOL < 1. The tolerance for truncating small singular values. See the description ofNRNK. ๐Kโ outputINTEGER,0 <= K <= N. The dimension of the SVD/POD basis for the leadingN-1data snapshots (columns ofF) and the number of the computed Ritz pairs. The value ofKis determined according to the rule set by the parametersNRNKandTOL. See the descriptions ofNRNKandTOL. โญREIGโ outputREAL(KIND=WP) (N-1)-by-1array. The leadingK(K<=N) entries ofREIGcontain the real parts of the computed eigenvaluesREIG(1:K) + sqrt(-1)*IMEIG(1:K). See the descriptions ofK,IMEIG,Z. ๐IMEIGโ outputREAL(KIND=WP) (N-1)-by-1array. The leadingK(K<N) entries ofIMEIGcontain the imaginary parts of the computed eigenvaluesREIG(1:K) + sqrt(-1)*IMEIG(1:K). The eigenvalues are determined as follows:- If
IMEIG(i) == 0, then the corresponding eigenvalue is real,LAMBDA(i) = REIG(i). - If
IMEIG(i)>0, then the corresponding complex conjugate pair of eigenvalues reads:
- If
LAMBDA(i) = REIG(i) + sqrt(-1)*IMAG(i)
LAMBDA(i+1) = REIG(i) - sqrt(-1)*IMAG(i)
- That is, complex conjugate pairs have consecutive indices
(i,i+1), with the positive imaginary part listed first. See the descriptions ofK,REIG,Z. ๐ฅ
Zโ workspace/outputREAL(KIND=WP) M-by-(N-1)array. ๐ญ- If
JOBZ == 'V'thenZcontains real Ritz vectors as follows:- If
IMEIG(i)=0, thenZ(:,i)is an eigenvector of thei-th Ritz value. - If
IMEIG(i) > 0(andIMEIG(i+1) < 0) then[Z(:,i) Z(:,i+1)]span an invariant subspace and the Ritz values extracted from this subspace areREIG(i) + sqrt(-1)*IMEIG(i)andREIG(i) - sqrt(-1)*IMEIG(i). The corresponding eigenvectors areZ(:,i) + sqrt(-1)*Z(:,i+1)andZ(:,i) - sqrt(-1)*Z(:,i+1), respectively.
- If
- If
JOBZ == 'F', then the above descriptions hold for the columns ofZ*V, where the columns ofVare the eigenvectors of theK-by-KRayleigh quotient, andZis orthonormal. The columns ofVare similarly structured: ifIMEIG(i) == 0thenZ*V(:,i)is an eigenvector, and ifIMEIG(i) > 0thenZ*V(:,i)+sqrt(-1)*Z*V(:,i+1)andZ*V(:,i)-sqrt(-1)*Z*V(:,i+1)are the eigenvectors ofLAMBDA(i),LAMBDA(i+1). See the descriptions ofREIG,IMEIG,XandV. ๐ง
- If
LDZโ inputINTEGER,LDZ >= M. The leading dimension of the arrayZ. ๐RESโ outputREAL(KIND=WP) (N-1)-by-1array.RES(1:K)contains the residuals for theKcomputed Ritz pairs. ๐- If
LAMBDA(i)is real, then:
- If
RES(i) = || A * Z(:,i) - LAMBDA(i)*Z(:,i))||_2.
- If
[LAMBDA(i), LAMBDA(i+1)]is a complex conjugate pair then:
RES(i)=RES(i+1) = || A * Z(:,i:i+1) - Z(:,i:i+1) *B||_F
where:
B = [ real(LAMBDA(i)) imag(LAMBDA(i)) ]
[-imag(LAMBDA(i)) real(LAMBDA(i)) ].
- It holds that:
RES(i) = || A*ZC(:,i) - LAMBDA(i) *ZC(:,i) ||_2
RES(i+1) = || A*ZC(:,i+1) - LAMBDA(i+1)*ZC(:,i+1) ||_2
where:
ZC(:,i) = Z(:,i) + sqrt(-1)*Z(:,i+1)
ZC(:,i+1) = Z(:,i) - sqrt(-1)*Z(:,i+1)
- See the description of
Z. โจ
Bโ outputREAL(KIND=WP) MIN(M,N)-by-(N-1)array. ๐- If
JOBF =='R',B(1:N,1:K)containsA*U(:,1:K), and can be used for computing the refined vectors; see further details in the provided references. - If
JOBF == 'E',B(1:N,1;K)containsA*U(:,1:K)*W(1:K,1:K), which are the vectors from the Exact DMD, up to scaling by the inverse eigenvalues. - In both cases, the content of
Bcan be lifted to the original dimension of the input data by pre-multiplying with theQfactor from the initial QR factorization. HereAdenotes a compression of the underlying operator. See the descriptions ofFandX. - If
JOBF =='N', thenBis not referenced. ๐
- If
LDBโ inputINTEGER,LDB >= MIN(M,N). The leading dimension of the arrayB. ๐ธVโ workspace/outputREAL(KIND=WP) (N-1)-by-(N-1)array. On exit,V(1:K,1:K)contains theKeigenvectors of the Rayleigh quotient. The eigenvectors of a complex conjugate pair of eigenvalues are returned in real form as explained in the description ofZ. The Ritz vectors (returned inZ) are the product ofXandV; see the descriptions ofXandZ. ๐ฆLDVโ inputINTEGER,LDV >= N-1. The leading dimension of the arrayV. ๐ซถSโ outputREAL(KIND=WP) (N-1)-by-(N-1)array. The arrayS(1:K,1:K)is used for the matrix Rayleigh quotient. This content is overwritten during the eigenvalue decomposition byDGEEV. See the description ofK. ๐LDSโ inputINTEGER,LDS >= N-1. The leading dimension of the arrayS. ๐WORKโ workspace/outputREAL(KIND=WP) LWORK-by-1array. On exit: ๐WORK(1:MIN(M,N))contains the scalar factors of the elementary reflectors as returned byDGEQRFof theM-by-Ninput matrixF.WORK(MIN(M,N)+1:MIN(M,N)+N-1)contains the singular values of the input submatrixF(1:M,1:N-1).- If the call to
DGEDMDQis only workspace query, thenWORK(1)contains the minimal workspace length andWORK(2)is the optimal workspace length. Hence, the length of work is at least2. See the description ofLWORK. โญ
LWORKโ
okay so LWORK is (input) INTEGER โ literally the minimal length of the workspace vector WORK, and the way it gets calculated is a whole little recipe, so stay with me bestie ๐
Let MLWQR = N (minimal workspace for DGEQRF[M,N])
MLWDMD = minimal workspace for DGEDMD (see the
description of LWORK in DGEDMD) for
snapshots of dimensions MIN(M,N)-by-(N-1)
MLWMQR = N (minimal workspace for
DORMQR['L','N',M,N,N])
MLWGQR = N (minimal workspace for DORGQR[M,N,N])
Then
LWORK = MAX(N+MLWQR, N+MLWDMD)
is updated as follows:
if JOBZ == 'V' or JOBZ == 'F' THEN
LWORK = MAX( LWORK, MIN(M,N)+N-1+MLWMQR )
if JOBQ == 'Q' THEN
LWORK = MAX( LWORK, MIN(M,N)+N-1+MLWGQR)
and if LWORK = -1 on entry, it's a workspace query era: the procedure only computes the minimal and the optimal workspace lengths for both WORK and IWORK. See the descriptions of WORK and IWORK โจ iykyk
IWORK ๐ซถ
IWORK is (workspace/output) INTEGER LIWORK-by-1 array โ not me with a whole array ๐ญ. It's workspace that is required only if WHTSVD equals 2, 3 or 4 (see the description of WHTSVD). If on entry LWORK =-1 or LIWORK=-1, then the minimal length of IWORK is computed and returned in IWORK(1). See the description of LIWORK.
LIWORK ๐
LIWORK is (input) INTEGER โ the minimal length of the workspace vector IWORK.
If WHTSVD == 1, then only IWORK(1) is used; LIWORK >=1.
Let M1=MIN(M,N), N1=N-1. Then the tea is:
- If
WHTSVD == 2, thenLIWORK >= MAX(1,8*MIN(M1,N1)) - If
WHTSVD == 3, thenLIWORK >= MAX(1,M1+N1-1) - If
WHTSVD == 4, thenLIWORK >= MAX(3,M1+3*N1)
If on entry LIWORK = -1, then a workspace query is assumed and the procedure only computes the minimal and the optimal workspace lengths for both WORK and IWORK. See the descriptions of WORK and IWORK.
INFO ๐
INFO is (output) INTEGER โ the vibes report, and no cap you need to read it:
-i < 0โ On entry, thei-th argument had an illegal value= 0โ Successful return.= 1โ Void input. Quick exit (M=0orN=0).= 2โ The SVD computation ofXdid not converge. Suggestion: Check the input data and/or repeat with differentWHTSVD.= 3โ The computation of the eigenvalues did not converge.= 4โ If data scaling was requested on input and the procedure found inconsistency in the data such that for some column indexi,X(:,i) = 0butY(:,i) /= 0, thenY(:,i)is set to zero ifJOBS=='C'. The computation proceeds with original or modified data and warning flag is set withINFO=4.
Author โ๏ธ
Zlatko Drmac
Definition at line 571 of file dgedmdq.f90.
subroutine sgedmd ๐
new function, new main character energy โ and here's the whole signature, verbatim, because we do not mess with function signatures in this house ๐
subroutine sgedmd (character, intent(in) jobs, character, intent(in) jobz,
character, intent(in) jobr, character, intent(in) jobf, integer,
intent(in) whtsvd, integer, intent(in) m, integer, intent(in) n,
real(kind=wp), dimension(ldx,*), intent(inout) x, integer, intent(in)
ldx, real(kind=wp), dimension(ldy,*), intent(inout) y, integer,
intent(in) ldy, integer, intent(in) nrnk, real(kind=wp), intent(in) tol,
integer, intent(out) k, real(kind=wp), dimension(*), intent(out) reig,
real(kind=wp), dimension(*), intent(out) imeig, real(kind=wp),
dimension(ldz,*), intent(out) z, integer, intent(in) ldz, real(kind=wp),
dimension(*), intent(out) res, real(kind=wp), dimension(ldb,*),
intent(out) b, integer, intent(in) ldb, real(kind=wp), dimension(ldw,*),
intent(out) w, integer, intent(in) ldw, real(kind=wp), dimension(lds,*),
intent(out) s, integer, intent(in) lds, real(kind=wp), dimension(*),
intent(out) work, integer, intent(in) lwork, integer, dimension(*),
intent(out) iwork, integer, intent(in) liwork, integer, intent(out)
info)
SGEDMD computes the Dynamic Mode Decomposition (DMD) for a pair of data snapshot matrices. periodt ๐
Purpose ๐
okay so SGEDMD computes the Dynamic Mode Decomposition (DMD) for a pair of data snapshot matrices. For the input matrices X and Y such that Y = A*X with an unaccessible matrix A, SGEDMD computes a certain number of Ritz pairs of A using the standard Rayleigh-Ritz extraction from a subspace of range(X) that is determined using the leading left singular vectors of X. Optionally, SGEDMD returns the residuals of the computed Ritz pairs, the information needed for a refinement of the Ritz vectors, or the eigenvectors of the Exact DMD. For further details see the references listed below. For more details of the implementation see [3].
References ๐
the receipts, bestie:
[1]P. Schmid: Dynamic mode decomposition of numerical and experimental data, Journal of Fluid Mechanics 656, 5-28, 2010.[2]Z. Drmac, I. Mezic, R. Mohr: Data driven modal decompositions: analysis and enhancements, SIAM J. on Sci. Comp. 40 (4), A2253-A2285, 2018.[3]Z. Drmac: A LAPACK implementation of the Dynamic Mode Decomposition I. Technical report. AIMDyn Inc. and LAPACK Working Note 298.[4]J. Tu, C. W. Rowley, D. M. Luchtenburg, S. L. Brunton, N. Kutz: On Dynamic Mode Decomposition: Theory and Applications, Journal of Computational Dynamics 1(2), 391 -421, 2014.
Developed and supported by ๐ซถ
Developed and coded by Zlatko Drmac, Faculty of Science, University of Zagreb; drmac@math.hr
In cooperation with AIMdyn Inc., Santa Barbara, CA.
and supported by
- DARPA SBIR project Contract No:
W31P4Q-21-C-0007 - DARPA PAI project Contract No:
HR0011-18-9-0033 - DARPA MoDyL project Contract No:
HR0011-16-C-0116
Any opinions, findings and conclusions or recommendations expressed in this material are those of the author and do not necessarily reflect the views of the DARPA SBIR Program Office
Distribution Statement A ๐ธ
Distribution Statement A:
Approved for Public Release, Distribution Unlimited.
Cleared by DARPA on September 29, 2022
Parameters ๐ง
JOBS (input) CHARACTER1* โ Determines whether the initial data snapshots are scaled by a diagonal matrix. vibe check:
'S'โ The data snapshots matricesXandYare multiplied with a diagonal matrixDso thatX*Dhas unit nonzero columns (in the Euclidean 2-norm)'C'โ The snapshots are scaled as with the'S'option. If it is found that ani-th column ofXis zero vector and the correspondingi-th column ofYis non-zero, then thei-th column ofYis set to zero and a warning flag is raised.'Y'โ The data snapshots matricesXandYare multiplied by a diagonal matrixDso thatY*Dhas unit nonzero columns (in the Euclidean 2-norm)'N'โ No data scaling.
JOBZ (input) CHARACTER1* โ Determines whether the eigenvectors (Koopman modes) will be computed. Koopman mode era:
'V'โ The eigenvectors (Koopman modes) will be computed and returned in the matrixZ. See the description ofZ.'F'โ The eigenvectors (Koopman modes) will be returned in factored form as the productX(:,1:K)*W, whereXcontains a POD basis (leading left singular vectors of the data matrixX) andWcontains the eigenvectors of the corresponding Rayleigh quotient. See the descriptions ofK,X,W,Z.'N'โ The eigenvectors are not computed.
JOBR (input) CHARACTER1* โ Determines whether to compute the residuals.
'R'โ The residuals for the computed eigenpairs will be computed and stored in the arrayRES. See the description ofRES. For this option to be legal,JOBZmust be'V'.'N'โ The residuals are not computed.
JOBF (input) CHARACTER1* โ Specifies whether to store information needed for post-processing (e.g. computing refined Ritz vectors)
'R'โ The matrix needed for the refinement of the Ritz vectors is computed and stored in the arrayB. See the description ofB.'E'โ The unscaled eigenvectors of the Exact DMD are computed and returned in the arrayB. See the description ofB.'N'โ No eigenvector refinement data is computed.
WHTSVD (input) INTEGER, WHSTVD in { 1, 2, 3, 4 } โ Allows for a selection of the SVD algorithm from the LAPACK library.
1โSGESVD(the QR SVD algorithm)2โSGESDD(the Divide and Conquer algorithm; if enough workspace available, this is the fastest option)3โSGESVDQ(the preconditioned QR SVD ; this and 4 are the most accurate options)4โSGEJSV(the preconditioned Jacobi SVD; this and 3 are the most accurate options)
For the four methods above, a significant difference in the accuracy of small singular values is possible if the snapshots vary in norm so that X is severely ill-conditioned. If small (smaller than EPS*||X||) singular values are of interest and JOBS=='N', then the options (3, 4) give the most accurate results, where the option 4 is slightly better and with stronger theoretical background.
If JOBS=='S', i.e. the columns of X will be normalized, then all methods give nearly equally accurate results.
M (input) INTEGER, M>= 0 โ The state space dimension (the row dimension of X, Y).
N
N
N (input) INTEGER, 0 <= N <= M โ the number of data snapshot pairs, i.e. the number of columns in X and Y. That's it, that's the whole job bestie ๐
X
X (input/output) REAL(KIND=WP) M-by-N array.
On entry, X holds the data snapshot matrix X. The vibe check here: it's assumed the column norms of X are in the range of the normalized floating point numbers โจ
On exit, the leading K columns of X contain a POD basis, aka the leading K left singular vectors of the input data matrix X, U(:,1:K). And all N columns of X contain all left singular vectors of the input matrix X. She ate, fr fr ๐
See the descriptions of K, Z and W.
LDX
LDX (input) INTEGER, LDX >= M โ the leading dimension of the array X. Respect the constraint or it's giving undefined behaviour energy ๐ญ
Y
Y (input/workspace/output) REAL(KIND=WP) M-by-N array.
On entry, Y contains the data snapshot matrix Y. ๐ฆ
On exit:
- If
JOBR == 'R', the leadingKcolumns ofYcontain the residual vectors for the computed Ritz pairs. See the description ofRES. - If
JOBR == 'N',Ycontains the original input data, scaled according to the value ofJOBS.
LDY
LDY (input) INTEGER, LDY >= M โ the leading dimension of the array Y. Same deal as LDX, no shortcuts ๐
NRNK
NRNK (input) INTEGER โ this one decides the mode for computing the numerical rank, meaning how we truncate the small singular values of the input matrix X. On input:
NRNK = -1:: the i-th singular valuesigma(i)is truncated ifsigma(i) <= TOL*sigma(1). This option is recommended. ๐ (it's the main character of rank detection)NRNK = -2:: the i-th singular valuesigma(i)is truncated ifsigma(i) <= TOL*sigma(i-1). This option is included for R&D purposes. It requires highly accurate SVD, which may not be feasible. ๐ (iconic but highkey risky)
And you can enforce the numerical rank by using a positive value of NRNK, like this:
0 < NRNK <= N:: at mostNRNKlargest singular values will be used. If the number of the computed nonzero singular values is less thanNRNK, then only those nonzero values will be used and the actually used dimension is less thanNRNK. The actual number of the nonzero singular values is returned in the variableK.
See the descriptions of TOL and K.
TOL
TOL (input) REAL(KIND=WP), 0 <= TOL < 1 โ the tolerance for truncating small singular values. No cap on the lore, see the description of NRNK ๐
K
K (output) INTEGER, 0 <= K <= N โ the dimension of the POD basis for the data snapshot matrix X, and the number of the computed Ritz pairs. The value of K is determined according to the rule set by the parameters NRNK and TOL. See the descriptions of NRNK and TOL ๐ธ
REIG
REIG (output) REAL(KIND=WP) N-by-1 array โ the leading K (K<=N) entries of REIG contain the real parts of the computed eigenvalues REIG(1:K) + sqrt(-1)*IMEIG(1:K). See the descriptions of K, IMEIG, and Z โจ
IMEIG
IMEIG (output) REAL(KIND=WP) N-by-1 array โ the leading K (K<=N) entries of IMEIG contain the imaginary parts of the computed eigenvalues REIG(1:K) + sqrt(-1)*IMEIG(1:K).
The eigenvalues are determined as follows:
- If
IMEIG(i) == 0, then the corresponding eigenvalue is real,LAMBDA(i) = REIG(i). - If
IMEIG(i)>0, then the corresponding complex conjugate pair of eigenvalues reads
LAMBDA(i) = REIG(i) + sqrt(-1)*IMAG(i)
LAMBDA(i+1) = REIG(i) - sqrt(-1)*IMAG(i)
That is, complex conjugate pairs have consecutive indices (i,i+1), with the positive imaginary part listed first. They're literally holding hands, iykyk ๐ซถ
See the descriptions of K, REIG, and Z.
Z
Z (workspace/output) REAL(KIND=WP) M-by-N array.
If JOBZ =='V' then Z contains real Ritz vectors as follows:
- If
IMEIG(i)=0, thenZ(:,i)is an eigenvector of the i-th Ritz value;||Z(:,i)||_2=1. - If
IMEIG(i) > 0(andIMEIG(i+1) < 0) then[Z(:,i) Z(:,i+1)]span an invariant subspace and the Ritz values extracted from this subspace areREIG(i) + sqrt(-1)*IMEIG(i)andREIG(i) - sqrt(-1)*IMEIG(i). The corresponding eigenvectors areZ(:,i) + sqrt(-1)*Z(:,i+1)andZ(:,i) - sqrt(-1)*Z(:,i+1), respectively.|| Z(:,i:i+1)||_F = 1.
If JOBZ == 'F', then the above descriptions hold for the columns of X(:,1:K)*W(1:K,1:K), where the columns of W(1:k,1:K) are the computed eigenvectors of the K-by-K Rayleigh quotient. The columns of W(1:K,1:K) are similarly structured: If IMEIG(i) == 0 then X(:,1:K)*W(:,i) is an eigenvector, and if IMEIG(i)>0 then
X(:,1:K)*W(:,i)+sqrt(-1)*X(:,1:K)*W(:,i+1) and
X(:,1:K)*W(:,i)-sqrt(-1)*X(:,1:K)*W(:,i+1)
are the eigenvectors of LAMBDA(i), LAMBDA(i+1).
See the descriptions of REIG, IMEIG, X and W ๐ง
LDZ
LDZ (input) INTEGER, LDZ >= M โ the leading dimension of the array Z. Yes bestie, another one, keep up ๐
RES
RES (output) REAL(KIND=WP) N-by-1 array โ RES(1:K) contains the residuals for the K computed Ritz pairs.
If LAMBDA(i) is real, then
RES(i) = || A * Z(:,i) - LAMBDA(i)*Z(:,i))||_2.
If [LAMBDA(i), LAMBDA(i+1)] is a complex conjugate pair then
RES(i)=RES(i+1) = || A * Z(:,i:i+1) - Z(:,i:i+1) *B||_F
where
B = [ real(LAMBDA(i)) imag(LAMBDA(i)) ]
[-imag(LAMBDA(i)) real(LAMBDA(i)) ].
It holds that
RES(i) = || A*ZC(:,i) - LAMBDA(i) *ZC(:,i) ||_2
RES(i+1) = || A*ZC(:,i+1) - LAMBDA(i+1)*ZC(:,i+1) ||_2
where
ZC(:,i) = Z(:,i) + sqrt(-1)*Z(:,i+1)
ZC(:,i+1) = Z(:,i) - sqrt(-1)*Z(:,i+1)
See the description of REIG, IMEIG and Z โญ
B
B (output) REAL(KIND=WP) M-by-N array.
- If
JOBF =='R',B(1:M,1:K)containsA*U(:,1:K), and can be used for computing the refined vectors; see further details in the provided references. - If
JOBF == 'E',B(1:M,1;K)containsA*U(:,1:K)*W(1:K,1:K), which are the vectors from the Exact DMD, up to scaling by the inverse eigenvalues. - If
JOBF =='N', thenBis not referenced.
See the descriptions of X, W, K ๐ฅ
LDB
LDB (input) INTEGER, LDB >= M โ the leading dimension of the array B. The leading-dimension saga continues, and honestly? Obsessed ๐
W
W (workspace/output) REAL(KIND=WP) N-by-N array.
On exit, W(1:K,1:K) contains the K computed eigenvectors of the matrix Rayleigh quotient (real and imaginary parts for each complex conjugate pair of the eigenvalues). The Ritz vectors (returned in Z) are the product of X (containing a POD basis for the input matrix X) and W. See the descriptions of K, S, X and Z ๐
W is also used as a workspace to temporarily store the left singular vectors of X. She's doing double duty, main character energy fr ๐
LDW
LDW (input) INTEGER, LDW >= N โ the leading dimension of the array W. (Note the N this time, not M โ yes, they switch it up on you ๐)
S
S (workspace/output) REAL(KIND=WP) N-by-N array โ the array S(1:K,1:K) is used for the matrix Rayleigh quotient. This content is overwritten during the eigenvalue decomposition by SGEEV. So don't get attached to whatever you put in there, it's gone ๐ญ
See the description of K.
LDS
LDS (input) INTEGER, LDS >= N โ the leading dimension of the array S ๐ฆ
WORK
WORK (workspace/output) REAL(KIND=WP) LWORK-by-1 array.
On exit, WORK(1:N) contains the singular values of X (for JOBS=='N') or column scaled X (JOBS=='S', 'C') โญ
If WHTSVD==4, then WORK(N+1) and WORK(N+2) contain scaling factor WORK(N+2)/WORK(N+1) used to scale X and Y to avoid overflow in the SVD of X. This may be of interest if the scaling option is off and as many as possible smallest eigenvalues are desired to the highest feasible accuracy. (Niche? Yes. Iconic? Also yes ๐)
If the call to SGEDMD is only workspace query, then WORK(1) contains the minimal workspace length and WORK(2) is the optimal workspace length. Hence, the length of work is at least 2.
See the description of LWORK โจ
LWORK
๐พ LWORK
LWORK (input) INTEGER โ the minimal length of the workspace vector WORK, bestie. Here's exactly how it's calculated:
If WHTSVD == 1 ::
If JOBZ == 'V', then
LWORK >= MAX(2, N + LWORK_SVD, N+MAX(1,4*N)).
If JOBZ == 'N' then
LWORK >= MAX(2, N + LWORK_SVD, N+MAX(1,3*N)).
Here LWORK_SVD = MAX(1,3*N+M,5*N) is the minimal
workspace length of SGESVD.
If WHTSVD == 2 ::
If JOBZ == 'V', then
LWORK >= MAX(2, N + LWORK_SVD, N+MAX(1,4*N))
If JOBZ == 'N', then
LWORK >= MAX(2, N + LWORK_SVD, N+MAX(1,3*N))
Here LWORK_SVD = MAX(M, 5*N*N+4*N)+3*N*N is the
minimal workspace length of SGESDD.
If WHTSVD == 3 ::
If JOBZ == 'V', then
LWORK >= MAX(2, N+LWORK_SVD,N+MAX(1,4*N))
If JOBZ == 'N', then
LWORK >= MAX(2, N+LWORK_SVD,N+MAX(1,3*N))
Here LWORK_SVD = N+M+MAX(3*N+1,
MAX(1,3*N+M,5*N),MAX(1,N))
is the minimal workspace length of SGESVDQ.
If WHTSVD == 4 ::
If JOBZ == 'V', then
LWORK >= MAX(2, N+LWORK_SVD,N+MAX(1,4*N))
If JOBZ == 'N', then
LWORK >= MAX(2, N+LWORK_SVD,N+MAX(1,3*N))
Here LWORK_SVD = MAX(7,2*M+N,6*N+2*N*N) is the
minimal workspace length of SGEJSV.
These expressions are not simplified โ and that's on purpose, no cap. It makes the usage of WORK more transparent and easier to check. In any case, LWORK >= 2.
If on entry LWORK = -1, then a workspace query is assumed and the procedure only computes the minimal and the optimal workspace lengths for both WORK and IWORK. See the descriptions of WORK and IWORK.
๐งบ IWORK
IWORK (workspace/output) INTEGER LIWORK-by-1 array โ workspace that is required only if WHTSVD equals 2 , 3 or 4. (See the description of WHTSVD.)
If on entry LWORK =-1 or LIWORK=-1, then the minimal length of IWORK is computed and returned in IWORK(1). See the description of LIWORK.
๐ LIWORK
LIWORK (input) INTEGER โ the minimal length of the workspace vector IWORK.
- If
WHTSVD == 1, then onlyIWORK(1)is used;LIWORK >=1 - If
WHTSVD == 2, thenLIWORK >= MAX(1,8*MIN(M,N)) - If
WHTSVD == 3, thenLIWORK >= MAX(1,M+N-1) - If
WHTSVD == 4, thenLIWORK >= MAX(3,M+3*N)
If on entry LIWORK = -1, then a workspace query is assumed and the procedure only computes the minimal and the optimal workspace lengths for both WORK and IWORK. See the descriptions of WORK and IWORK.
๐จ INFO
INFO (output) INTEGER
-i < 0โ On entry, the i-th argument had an illegal value.= 0โ Successful return.= 1โ Void input. Quick exit (M=0orN=0).= 2โ The SVD computation ofXdid not converge. Suggestion: Check the input data and/or repeat with differentWHTSVD.= 3โ The computation of the eigenvalues did not converge.= 4โ If data scaling was requested on input and the procedure found inconsistency in the data such that for some column indexi,X(:,i) = 0butY(:,i) /= 0, thenY(:,i)is set to zero ifJOBS=='C'. The computation proceeds with original or modified data and warning flag is set withINFO=4.
๐ Author
Zlatko Drmac
๐งพ Definition at line 530 of file sgedmd.f90.
๐ฆ subroutine sgedmdq
subroutine sgedmdq (character, intent(in) jobs, character, intent(in) jobz,
character, intent(in) jobr, character, intent(in) jobq, character,
intent(in) jobt, character, intent(in) jobf, integer, intent(in) whtsvd,
integer, intent(in) m, integer, intent(in) n, real(kind=wp),
dimension(ldf,*), intent(inout) f, integer, intent(in) ldf,
real(kind=wp), dimension(ldx,*), intent(out) x, integer, intent(in) ldx,
real(kind=wp), dimension(ldy,*), intent(out) y, integer, intent(in) ldy,
integer, intent(in) nrnk, real(kind=wp), intent(in) tol, integer,
intent(out) k, real(kind=wp), dimension(*), intent(out) reig,
real(kind=wp), dimension(*), intent(out) imeig, real(kind=wp),
dimension(ldz,*), intent(out) z, integer, intent(in) ldz, real(kind=wp),
dimension(*), intent(out) res, real(kind=wp), dimension(ldb,*),
intent(out) b, integer, intent(in) ldb, real(kind=wp), dimension(ldv,*),
intent(out) v, integer, intent(in) ldv, real(kind=wp), dimension(lds,*),
intent(out) s, integer, intent(in) lds, real(kind=wp), dimension(*),
intent(out) work, integer, intent(in) lwork, integer, dimension(*),
intent(out) iwork, integer, intent(in) liwork, integer, intent(out)
info)
SGEDMDQ computes the Dynamic Mode Decomposition (DMD) for a pair of data snapshot matrices. Periodt. ๐
๐ฏ Purpose
SGEDMDQ computes the Dynamic Mode Decomposition (DMD) for a pair of data snapshot matrices, using a QR factorization based compression of the data. For the input matrices X and Y such that Y = A*X with an unaccessible matrix A, SGEDMDQ computes a certain number of Ritz pairs of A using the standard Rayleigh-Ritz extraction from a subspace of range(X) that is determined using the leading left singular vectors of X. Optionally, SGEDMDQ returns the residuals of the computed Ritz pairs, the information needed for a refinement of the Ritz vectors, or the eigenvectors of the Exact DMD.
For further details see the references listed below. For more details of the implementation see [3].
๐ References
- [1] P. Schmid: Dynamic mode decomposition of numerical and experimental data, Journal of Fluid Mechanics 656, 5-28, 2010.
- [2] Z. Drmac, I. Mezic, R. Mohr: Data driven modal decompositions: analysis and enhancements, SIAM J. on Sci. Comp. 40 (4), A2253-A2285, 2018.
- [3] Z. Drmac: A LAPACK implementation of the Dynamic Mode Decomposition I. Technical report. AIMDyn Inc. and LAPACK Working Note 298.
- [4] J. Tu, C. W. Rowley, D. M. Luchtenburg, S. L. Brunton, N. Kutz: On Dynamic Mode Decomposition: Theory and Applications, Journal of Computational Dynamics 1(2), 391 -421, 2014.
๐ซถ Developed and supported by
Developed and coded by Zlatko Drmac, Faculty of Science, University of Zagreb; drmac@math.hr
In cooperation with AIMdyn Inc., Santa Barbara, CA.
and supported by
- DARPA SBIR project Contract No:
W31P4Q-21-C-0007 - DARPA PAI project Contract No:
HR0011-18-9-0033 - DARPA MoDyL project Contract No:
HR0011-16-C-0116
Any opinions, findings and conclusions or recommendations expressed in this material are those of the author and do not necessarily reflect the views of the DARPA SBIR Program Office.
๐ข Distribution Statement A
Approved for Public Release, Distribution Unlimited.
Cleared by DARPA on September 29, 2022
โจ Parameters
๐
JOBS
JOBS (input) CHARACTER*1 โ determines whether the initial data snapshots are scaled by a diagonal matrix. The data snapshots are the columns of F. The leading N-1 columns of F are denoted X and the trailing N-1 columns are denoted Y.
'S'โ The data snapshots matricesXandYare multiplied with a diagonal matrixDso thatX*Dhas unit nonzero columns (in the Euclidean 2-norm).'C'โ The snapshots are scaled as with the'S'option. If it is found that an i-th column ofXis zero vector and the corresponding i-th column ofYis non-zero, then the i-th column ofYis set to zero and a warning flag is raised.'Y'โ The data snapshots matricesXandYare multiplied by a diagonal matrixDso thatY*Dhas unit nonzero columns (in the Euclidean 2-norm).'N'โ No data scaling.
๐ธ JOBZ
JOBZ (input) CHARACTER*1 โ determines whether the eigenvectors (Koopman modes) will be computed.
'V'โ The eigenvectors (Koopman modes) will be computed and returned in the matrixZ. See the description ofZ.'F'โ The eigenvectors (Koopman modes) will be returned in factored form as the productZ*V, whereZis orthonormal andVcontains the eigenvectors of the corresponding Rayleigh quotient. See the descriptions ofF,V,Z.'Q'โ The eigenvectors (Koopman modes) will be returned in factored form as the productQ*Z, whereZcontains the eigenvectors of the compression of the underlying discretized operator onto the span of the data snapshots. See the descriptions ofF,V,Z.Qis from the initial QR factorization.'N'โ The eigenvectors are not computed.
๐ฆ JOBR
JOBR (input) CHARACTER*1 โ determines whether to compute the residuals.
'R'โ The residuals for the computed eigenpairs will be computed and stored in the arrayRES. See the description ofRES. For this option to be legal,JOBZmust be'V'.'N'โ The residuals are not computed.
๐ JOBQ
JOBQ (input) CHARACTER*1 โ specifies whether to explicitly compute and return the orthogonal matrix from the QR factorization.
'Q'โ The matrixQof the QR factorization of the data snapshot matrix is computed and stored in the arrayF. See the description ofF.'N'โ The matrixQis not explicitly computed.
๐ JOBT
JOBT ๐ซ
JOBT(input)CHARACTER*1โ tells the routine whether you want the upper triangular factor back, bestie. Say less.'R'โ the matrixRof the QR factorization of the data snapshot matrixFis returned in the arrayY. Peep the description ofYand Further details for the receipts.'N'โ the matrixRis not returned. We're gatekeeping it. ๐ซฃ
JOBF ๐
JOBF(input)CHARACTER*1โ controls whether we store the info you need for post-processing (like, say, computing refined Ritz vectors).'R'โ the matrix needed for the refinement of the Ritz vectors gets computed and stored in the arrayB. See the description ofB.'E'โ the unscaled eigenvectors of the Exact DMD are computed and returned in the arrayB. See the description ofB.'N'โ no eigenvector refinement data is computed. We simply โจ do not โจ.
Heads up: to be useful on exit, this option needsJOBQ='Q'. NoJOBQ='Q', no vibe. ๐
WHTSVD ๐
WHTSVD(input)INTEGER,WHSTVDin{ 1, 2, 3, 4 }โ lets you pick which SVD algorithm from the LAPACK library gets the aux.1โSGESVD(the QR SVD algorithm)2โSGESDD(the Divide and Conquer algorithm; if enough workspace available, this is the fastest option) ๐๏ธ3โSGESVDQ(the preconditioned QR SVD; this and 4 are the most accurate options)4โSGEJSV(the preconditioned Jacobi SVD; this and 3 are the most accurate options)
Okay so for the four methods above, there can be a significant difference in the accuracy of small singular values if the snapshots vary in norm so that X is severely ill-conditioned. So if small (smaller than EPS*||X||) singular values are of interest and JOBS=='N', then options (3, 4) give the most accurate results, where option 4 is slightly better and comes with stronger theoretical background. Science slay. ๐ฌ
And if JOBS=='S', i.e. the columns of X will be normalized, then all methods give nearly equally accurate results. Everyone wins, we love to see it. ๐
M ๐
M(input)INTEGER,M >= 0โ the state space dimension (the number of rows ofF).
N ๐ข
N(input)INTEGER,0 <= N <= Mโ the number of data snapshots from a single trajectory, taken at equidistant discrete times. Basically it's the number of columns ofF.
F ๐ฆ
F(input/output)REAL(KIND=WP)M-by-Narray
On entry: the columns ofFare the sequence of data snapshots from a single trajectory, taken at equidistant discrete times. It is assumed that the column norms ofFare in the range of the normalized floating point numbers. Noted, no cap.
< On exit:
- If
JOBQ == 'Q', the arrayFcontains the orthogonal matrix/factor of the QR factorization of the initial data snapshots matrixF. See the description ofJOBQ. - If
JOBQ == 'N', the entries inFstrictly below the main diagonal contain, column-wise, the information on the Householder vectors, as returned bySGEQRF. The remaining information to restore the orthogonal matrix of the initial QR factorization is stored inWORK(1:N). See the description ofWORK.
LDF ๐
LDF(input)INTEGER,LDF >= Mโ the leading dimension of the arrayF. Respect the leading dimension, it's literally the main character.
X โจ
X(workspace/output)REAL(KIND=WP)MIN(M,N)-by-(N-1)arrayโXis used as workspace to hold representations of the leadingN-1snapshots in the orthonormal basis computed in the QR factorization ofF.
On exit, the leading K columns of X contain the leading K left singular vectors of the above described content of X. To lift them to the space of the left singular vectors U(:,1:K) of the input data, pre-multiply with the Q factor from the initial QR factorization. See the descriptions of F, K, V and Z. ๐
LDX ๐
LDX(input)INTEGER,LDX >= Nโ the leading dimension of the arrayX.
Y ๐
Y(workspace/output)REAL(KIND=WP)MIN(M,N)-by-(N-1)arrayโYis used as workspace to hold representations of the trailingN-1snapshots in the orthonormal basis computed in the QR factorization ofF.
On exit:
- If
JOBT == 'R',Ycontains theMIN(M,N)-by-Nupper triangular factor from the QR factorization of the data snapshot matrixF. There it is. ๐
LDY ๐
LDY(input)INTEGER,LDY >= Nโ the leading dimension of the arrayY.
NRNK ๐
NRNK(input)INTEGERโ determines the mode for how to compute the numerical rank, i.e. how to truncate small singular values of the input matrixX. On input, if:NRNK = -1โ the i-th singular valuesigma(i)is truncated ifsigma(i) <= TOL*sigma(1). This option is recommended. โญ Use this one, bestie.NRNK = -2โ the i-th singular valuesigma(i)is truncated ifsigma(i) <= TOL*sigma(i-1). This option is included for R&D purposes. It requires highly accurate SVD, which may not be feasible. ๐ฌ (so like, careful.)
The numerical rank can be enforced by using a positive value of NRNK as follows:
0 < NRNK <= N-1โ at mostNRNKlargest singular values will be used. If the number of the computed nonzero singular values is less thanNRNK, then only those nonzero values will be used and the actually used dimension is less thanNRNK. The actual number of the nonzero singular values is returned in the variableK. See the description ofK.
TOL ๐ฏ
TOL(input)REAL(KIND=WP),0 <= TOL < 1โ the tolerance for truncating small singular values. See the description ofNRNK.
K ๐
K(output)INTEGER,0 <= K <= Nโ the dimension of the SVD/POD basis for the leadingN-1data snapshots (columns ofF) and the number of the computed Ritz pairs. The value ofKis determined according to the rule set by the parametersNRNKandTOL. See the descriptions ofNRNKandTOL.
REIG ๐ซ
REIG(output)REAL(KIND=WP)(N-1)-by-1arrayโ the leadingK(K<=N) entries ofREIGcontain the real parts of the computed eigenvalues
REIG(1:K) + sqrt(-1)*IMEIG(1:K).
See the descriptions of K, IMEIG, Z.
IMEIG ๐ธ
IMEIG(output)REAL(KIND=WP)(N-1)-by-1arrayโ the leadingK(K<N) entries ofREIGcontain the imaginary parts of the computed eigenvalues
REIG(1:K) + sqrt(-1)*IMEIG(1:K).
The eigenvalues are determined as follows โ okay so listen:
- If
IMEIG(i) == 0, then the corresponding eigenvalue is real,LAMBDA(i) = REIG(i). - If
IMEIG(i)>0, then the corresponding complex conjugate pair of eigenvalues reads
LAMBDA(i) = REIG(i) + sqrt(-1)*IMAG(i)
LAMBDA(i+1) = REIG(i) - sqrt(-1)*IMAG(i)
That is, complex conjugate pairs have consecutive indices (i,i+1), with the positive imaginary part listed first. Positivity first, always. ๐
See the descriptions of K, REIG, Z.
Z ๐ฆ
Z(workspace/output)REAL(KIND=WP)M-by-(N-1)array
If JOBZ =='V' then Z contains real Ritz vectors as follows:
- If
IMEIG(i)=0, thenZ(:,i)is an eigenvector of the i-th Ritz value. - If
IMEIG(i) > 0(andIMEIG(i+1) < 0) then[Z(:,i) Z(:,i+1)]span an invariant subspace and the Ritz values extracted from this subspace are
REIG(i) + sqrt(-1)*IMEIG(i) and
REIG(i) - sqrt(-1)*IMEIG(i).
The corresponding eigenvectors are
Z(:,i) + sqrt(-1)*Z(:,i+1) and
Z(:,i) - sqrt(-1)*Z(:,i+1), respectively.
If JOBZ == 'F', then the above descriptions hold for the columns of Z*V, where the columns of V are the eigenvectors of the K-by-K Rayleigh quotient, and Z is orthonormal. The columns of V are similarly structured: if IMEIG(i) == 0 then Z*V(:,i) is an eigenvector, and if IMEIG(i) > 0 then
Z*V(:,i)+sqrt(-1)*Z*V(:,i+1) and
Z*V(:,i)-sqrt(-1)*Z*V(:,i+1)
are the eigenvectors of LAMBDA(i), LAMBDA(i+1).
See the descriptions of REIG, IMEIG, X and V. ๐ง
LDZ ๐
LDZ(input)INTEGER,LDZ >= Mโ the leading dimension of the arrayZ.
RES ๐ฅ
RES(output)REAL(KIND=WP)(N-1)-by-1arrayโRES(1:K)contains the residuals for theKcomputed Ritz pairs.
If LAMBDA(i) is real, then
RES(i) = || A * Z(:,i) - LAMBDA(i)*Z(:,i))||_2.
If [LAMBDA(i), LAMBDA(i+1)] is a complex conjugate pair then
RES(i)=RES(i+1) = || A * Z(:,i:i+1) - Z(:,i:i+1) *B||_F
where
B = [ real(LAMBDA(i)) imag(LAMBDA(i)) ]
[-imag(LAMBDA(i)) real(LAMBDA(i)) ].
It holds that
RES(i) = || A*ZC(:,i) - LAMBDA(i) *ZC(:,i) ||_2
RES(i+1) = || A*ZC(:,i+1) - LAMBDA(i+1)*ZC(:,i+1) ||_2
where
ZC(:,i) = Z(:,i) + sqrt(-1)*Z(:,i+1)
ZC(:,i+1) = Z(:,i) - sqrt(-1)*Z(:,i+1)
See the description of Z. ๐ญ (the formulas are giving "trust the process")
B
Bโ (output)REAL(KIND=WP)MIN(M,N)-by-(N-1)array. Bestie, hereโs the lowkey important part: ifJOBF =='R', thenB(1:N,1:K)containsA*U(:,1:K), and it can be used for computing the refined vectors โ see the references for the full lore. IfJOBF == 'E', thenB(1:N,1;K)containsA*U(:,1:K)*W(1:K,1:K), which are the vectors from the Exact DMD, up to scaling by the inverse eigenvalues. In both cases, the content ofBcan be lifted to the original dimension of the input data by pre-multiplying with theQfactor from the initial QR factorization. HereAdenotes a compression of the underlying operator. See the descriptions ofFandX. IfJOBF =='N', thenBis not referenced.LDBโ (input)INTEGER,LDB >= MIN(M,N). The leading dimension of the arrayB.Vโ (workspace/output)REAL(KIND=WP)(N-1)-by-(N-1)array. On exit,V(1:K,1:K)contains theKeigenvectors of the Rayleigh quotient. The eigenvectors of a complex conjugate pair of eigenvalues are returned in real form as explained in the description ofZ. The Ritz vectors (returned inZ) are the product ofXandV; see the descriptions ofXandZ.LDVโ (input)INTEGER,LDV >= N-1. The leading dimension of the arrayV.Sโ (output)REAL(KIND=WP)(N-1)-by-(N-1)array. The arrayS(1:K,1:K)is used for the matrix Rayleigh quotient. This content is overwritten during the eigenvalue decomposition bySGEEV. See the description ofK.LDSโ (input)INTEGER,LDS >= N-1. The leading dimension of the arrayS.WORKโ (workspace/output)REAL(KIND=WP)LWORK-by-1array. On exit,WORK(1:MIN(M,N))contains the scalar factors of the elementary reflectors as returned bySGEQRFof theM-by-Ninput matrixF.WORK(MIN(M,N)+1:MIN(M,N)+N-1)contains the singular values of the input submatrixF(1:M,1:N-1). If the call toSGEDMDQis only workspace query, thenWORK(1)contains the minimal workspace length andWORK(2)is the optimal workspace length. Hence, the length of work is at least2. See the description ofLWORK.LWORKโ (input)INTEGER. The minimal length of the workspace vectorWORK.LWORKis calculated as follows:
Let MLWQR = N (minimal workspace for SGEQRF[M,N])
MLWDMD = minimal workspace for SGEDMD (see the
description of LWORK in SGEDMD) for
snapshots of dimensions MIN(M,N)-by-(N-1)
MLWMQR = N (minimal workspace for
SORMQR['L','N',M,N,N])
MLWGQR = N (minimal workspace for SORGQR[M,N,N])
Then
LWORK = MAX(N+MLWQR, N+MLWDMD)
is updated as follows:
if JOBZ == 'V' or JOBZ == 'F' THEN
LWORK = MAX( LWORK,MIN(M,N)+N-1 +MLWMQR )
if JOBQ == 'Q' THEN
LWORK = MAX( LWORK,MIN(M,N)+N-1+MLWGQR)
If on entry LWORK = -1, then a workspace query is
assumed and the procedure only computes the minimal
and the optimal workspace lengths for both WORK and
IWORK. See the descriptions of WORK and IWORK.
IWORKโ (workspace/output)INTEGERLIWORK-by-1array. Workspace that is required only ifWHTSVDequals2,3or4. (See the description ofWHTSVD.) If on entryLWORK =-1orLIWORK=-1, then the minimal length ofIWORKis computed and returned inIWORK(1). See the description ofLIWORK.LIWORKโ (input)INTEGER. The minimal length of the workspace vectorIWORK. IfWHTSVD == 1, then onlyIWORK(1)is used;LIWORK >=1. LetM1=MIN(M,N),N1=N-1. Then:- If
WHTSVD == 2, thenLIWORK >= MAX(1,8*MIN(M1,N1)) - If
WHTSVD == 3, thenLIWORK >= MAX(1,M1+N1-1) - If
WHTSVD == 4, thenLIWORK >= MAX(3,M1+3*N1)If on entryLIWORK = -1, then a worskpace query is assumed and the procedure only computes the minimal and the optimal workspace lengths for bothWORKandIWORK. See the descriptions ofWORKandIWORK.
- If
INFOโ (output)INTEGER.-i < 0:: On entry, thei-th argument had an illegal value.= 0:: Successful return.= 1:: Void input. Quick exit (M=0orN=0).= 2:: The SVD computation ofXdid not converge. Suggestion: Check the input data and/or repeat with differentWHTSVD.= 3:: The computation of the eigenvalues did not converge.= 4:: If data scaling was requested on input and the procedure found inconsistency in the data such that for some column indexi,X(:,i) = 0butY(:,i) /= 0, thenY(:,i)is set to zero ifJOBS=='C'. The computation proceeds with original or modified data and warning flag is set withINFO=4.
๐ Author
Zlatko Drmac
Definition at line 571 of file sgedmdq.f90.
subroutine zgedmd (character, intent(in) jobs, character, intent(in) jobz,
character, intent(in) jobr, character, intent(in) jobf, integer,
intent(in) whtsvd, integer, intent(in) m, integer, intent(in) n,
complex(kind=wp), dimension(ldx,*), intent(inout) x, integer, intent(in)
ldx, complex(kind=wp), dimension(ldy,*), intent(inout) y, integer,
intent(in) ldy, integer, intent(in) nrnk, real(kind=wp), intent(in) tol,
integer, intent(out) k, complex(kind=wp), dimension(*), intent(out)
eigs, complex(kind=wp), dimension(ldz,*), intent(out) z, integer,
intent(in) ldz, real(kind=wp), dimension(*), intent(out) res,
complex(kind=wp), dimension(ldb,*), intent(out) b, integer, intent(in)
ldb, complex(kind=wp), dimension(ldw,*), intent(out) w, integer,
intent(in) ldw, complex(kind=wp), dimension(lds,*), intent(out) s,
integer, intent(in) lds, complex(kind=wp), dimension(*), intent(out)
zwork, integer, intent(in) lzwork, real(kind=wp), dimension(*),
intent(out) rwork, integer, intent(in) lrwork, integer, dimension(*),
intent(out) iwork, integer, intent(in) liwork, integer, intent(out)
info)
ZGEDMD computes the Dynamic Mode Decomposition (DMD) for a pair of data snapshot matrices.
โจ Purpose
So ZGEDMD computes the Dynamic Mode Decomposition (DMD) for a pair of data snapshot matrices. For the input matrices X and Y such that Y = A*X with an unaccessible matrix A, ZGEDMD computes a certain number of Ritz pairs of A using the standard Rayleigh-Ritz extraction from a subspace of range(X) that is determined using the leading left singular vectors of X. Optionally, ZGEDMD returns the residuals of the computed Ritz pairs, the information needed for a refinement of the Ritz vectors, or the eigenvectors of the Exact DMD. For further details see the references listed below. For more details of the implementation see [3].
๐ References
[1]P. Schmid: Dynamic mode decomposition of numerical and experimental data, Journal of Fluid Mechanics 656, 5-28, 2010.[2]Z. Drmac, I. Mezic, R. Mohr: Data driven modal decompositions: analysis and enhancements, SIAM J. on Sci. Comp. 40 (4), A2253-A2285, 2018.[3]Z. Drmac: A LAPACK implementation of the Dynamic Mode Decomposition I. Technical report. AIMDyn Inc. and LAPACK Working Note 298.[4]J. Tu, C. W. Rowley, D. M. Luchtenburg, S. L. Brunton, N. Kutz: On Dynamic Mode Decomposition: Theory and Applications, Journal of Computational Dynamics 1(2), 391 -421, 2014.
๐ Developed and supported by
Developed and coded by Zlatko Drmac, Faculty of Science, University of Zagreb; drmac@math.hr
In cooperation with AIMdyn Inc., Santa Barbara, CA.
and supported by
- DARPA SBIR project Contract No: W31P4Q-21-C-0007
- DARPA PAI project Contract No: HR0011-18-9-0033
- DARPA MoDyL project Contract No: HR0011-16-C-0116
Any opinions, findings and conclusions or recommendations expressed in this material are those of the author and do not necessarily reflect the views of the DARPA SBIR Program Office
๐ Distribution Statement A
Approved for Public Release, Distribution Unlimited. Cleared by DARPA on September 29, 2022
๐ธ Parameters
JOBSโ (input)CHARACTER*1. Determines whether the initial data snapshots are scaled by a diagonal matrix.'S':: The data snapshots matricesXandYare multiplied with a diagonal matrixDso thatX*Dhas unit nonzero columns (in the Euclidean 2-norm).'C':: The snapshots are scaled as with the'S'option. If it is found that ani-th column ofXis zero vector and the correspondingi-th column ofYis non-zero, then thei-th column ofYis set to zero and a warning flag is raised.'Y':: The data snapshots matricesXandYare multiplied by a diagonal matrixDso thatY*Dhas unit nonzero columns (in the Euclidean 2-norm).'N':: No data scaling.
JOBZ
okay so we're still deep in the argument list and it's giving "the lore continues" ๐ โ no skipping, bestie, every flag is coming with us.
JOBZโJOBZ (input) CHARACTER*1. Determines whether the eigenvectors (Koopman modes) will be computed.'V':: The eigenvectors (Koopman modes) will be computed and returned in the matrixZ. See the description ofZ.'F':: The eigenvectors (Koopman modes) will be returned in factored form as the productX(:,1:K)*W, whereXcontains a POD basis (leading left singular vectors of the data matrixX) andWcontains the eigenvectors of the corresponding Rayleigh quotient. See the descriptions ofK,X,W,Z.'N':: The eigenvectors are not computed.
JOBRโJOBR (input) CHARACTER*1. Determines whether to compute the residuals.'R':: The residuals for the computed eigenpairs will be computed and stored in the arrayRES. See the description ofRES. For this option to be legal,JOBZmust be'V'.'N':: The residuals are not computed.
JOBFโJOBF (input) CHARACTER*1. Specifies whether to store information needed for post-processing (e.g. computing refined Ritz vectors).'R':: The matrix needed for the refinement of the Ritz vectors is computed and stored in the arrayB. See the description ofB.'E':: The unscaled eigenvectors of the Exact DMD are computed and returned in the arrayB. See the description ofB.'N':: No eigenvector refinement data is computed.
WHTSVDโWHTSVD (input) INTEGER, WHSTVD in { 1, 2, 3, 4 }. Allows for a selection of the SVD algorithm from the LAPACK library.1::ZGESVD(the QR SVD algorithm)2::ZGESDD(the Divide and Conquer algorithm; if enough workspace available, this is the fastest option)3::ZGESVDQ(the preconditioned QR SVD; this and4are the most accurate options)4::ZGEJSV(the preconditioned Jacobi SVD; this and3are the most accurate options)
For the four methods above, a significant difference in the accuracy of small singular values is possible if the snapshots vary in norm so that X is severely ill-conditioned. If small (smaller than EPS*||X||) singular values are of interest and JOBS=='N', then the options (3, 4) give the most accurate results, where the option 4 is slightly better and with stronger theoretical background. If JOBS=='S', i.e. the columns of X will be normalized, then all methods give nearly equally accurate results.
MโM (input) INTEGER, M>= 0. The state space dimension (the row dimension ofX,Y).NโN (input) INTEGER, 0 <= N <= M. The number of data snapshot pairs (the number of columns ofXandY).XโX (input/output) COMPLEX(KIND=WP) M-by-N array.>On entry,Xcontains the data snapshot matrixX. It is assumed that the column norms ofXare in the range of the normalized floating point numbers.<On exit, the leadingKcolumns ofXcontain a POD basis, i.e. the leadingKleft singular vectors of the input data matrixX,U(:,1:K). AllNcolumns ofXcontain all left singular vectors of the input matrixX. See the descriptions ofK,ZandW.
LDXโLDX (input) INTEGER, LDX >= M. The leading dimension of the arrayX.YโY (input/workspace/output) COMPLEX(KIND=WP) M-by-N array.>On entry,Ycontains the data snapshot matrixY.<On exit, ifJOBR == 'R', the leadingKcolumns ofYcontain the residual vectors for the computed Ritz pairs. See the description ofRES. IfJOBR == 'N',Ycontains the original input data, scaled according to the value ofJOBS.
LDYโLDY (input) INTEGER , LDY >= M. The leading dimension of the arrayY.NRNKโNRNK (input) INTEGER. Determines the mode how to compute the numerical rank, i.e. how to truncate small singular values of the input matrixX. On input, if:NRNK = -1:: i-th singular valuesigma(i)is truncated ifsigma(i) <= TOL*sigma(1). This option is recommended. โญNRNK = -2:: i-th singular valuesigma(i)is truncated ifsigma(i) <= TOL*sigma(i-1). This option is included for R&D purposes. It requires highly accurate SVD, which may not be feasible. ๐
The numerical rank can be enforced by using positive value of NRNK as follows: 0 < NRNK <= N :: at most NRNK largest singular values will be used. If the number of the computed nonzero singular values is less than NRNK, then only those nonzero values will be used and the actually used dimension is less than NRNK. The actual number of the nonzero singular values is returned in the variable K. See the descriptions of TOL and K.
TOLโTOL (input) REAL(KIND=WP), 0 <= TOL < 1. The tolerance for truncating small singular values. See the description ofNRNK.KโK (output) INTEGER, 0 <= K <= N. The dimension of the POD basis for the data snapshot matrixXand the number of the computed Ritz pairs. The value ofKis determined according to the rule set by the parametersNRNKandTOL. See the descriptions ofNRNKandTOL.EIGSโEIGS (output) COMPLEX(KIND=WP) N-by-1 array. The leadingK(K<=N) entries ofEIGScontain the computed eigenvalues (Ritz values). See the descriptions ofK, andZ.ZโZ (workspace/output) COMPLEX(KIND=WP) M-by-N array. IfJOBZ =='V'thenZcontains the Ritz vectors.Z(:,i)is an eigenvector of the i-th Ritz value;||Z(:,i)||_2=1. IfJOBZ == 'F', then theZ(:,i)'s are given implicitly as the columns ofX(:,1:K)*W(1:K,1:K), i.e.X(:,1:K)*W(:,i)is an eigenvector corresponding toEIGS(i). The columns ofW(1:k,1:K)are the computed eigenvectors of theK-by-KRayleigh quotient. See the descriptions ofEIGS,XandW.LDZโLDZ (input) INTEGER , LDZ >= M. The leading dimension of the arrayZ.RESโRES (output) REAL(KIND=WP) N-by-1 array.RES(1:K)contains the residuals for theKcomputed Ritz pairs,RES(i) = || A * Z(:,i) - EIGS(i)*Z(:,i))||_2.See the description ofEIGSandZ.BโB (output) COMPLEX(KIND=WP) M-by-N array.- If
JOBF =='R',B(1:M,1:K)containsA*U(:,1:K), and can be used for computing the refined vectors; see further details in the provided references. - If
JOBF == 'E',B(1:M,1:K)containsA*U(:,1:K)*W(1:K,1:K), which are the vectors from the Exact DMD, up to scaling by the inverse eigenvalues. - If
JOBF =='N', thenBis not referenced. See the descriptions ofX,W,K.
- If
LDBโLDB (input) INTEGER, LDB >= M. The leading dimension of the arrayB.WโW (workspace/output) COMPLEX(KIND=WP) N-by-N array. On exit,W(1:K,1:K)contains theKcomputed eigenvectors of the matrix Rayleigh quotient. The Ritz vectors (returned inZ) are the product ofX(containing a POD basis for the input matrixX) andW. See the descriptions ofK,S,XandZ.Wis also used as a workspace to temporarily store the right singular vectors ofX.LDWโLDW (input) INTEGER, LDW >= N. The leading dimension of the arrayW.SโS (workspace/output) COMPLEX(KIND=WP) N-by-N array. The arrayS(1:K,1:K)is used for the matrix Rayleigh quotient. This content is overwritten during the eigenvalue decomposition byZGEEV. See the description ofK.LDSโLDS (input) INTEGER, LDS >= N. The leading dimension of the arrayS.ZWORKโZWORK (workspace/output) COMPLEX(KIND=WP) LZWORK-by-1 array.ZWORKis used as complex workspace in the complex SVD, as specified byWHTSVD(1,2,3or4) and forZGEEVfor computing the eigenvalues of a Rayleigh quotient. If the call toZGEDMDis only workspace query, thenZWORK(1)contains the minimal complex workspace length andZWORK(2)is the optimal complex workspace length. Hence, the length of work is at least2. See the description ofLZWORK.LZWORKโLZWORK (input) INTEGER. The minimal length of the workspace vectorZWORK.LZWORKis calculated asMAX(LZWORK_SVD, LZWORK_ZGEEV), whereLZWORK_ZGEEV = MAX( 1, 2*N )and the minimalLZWORK_SVDis calculated as follows:- If
WHTSVD == 1::ZGESVD::LZWORK_SVD = MAX(1,2*MIN(M,N)+MAX(M,N)) - If
WHTSVD == 2::ZGESDD::LZWORK_SVD = 2*MIN(M,N)*MIN(M,N)+2*MIN(M,N)+MAX(M,N) - If
WHTSVD == 3::ZGESVDQ::LZWORK_SVD = obtainable by a query - If
WHTSVD == 4::ZGEJSV::LZWORK_SVD = obtainable by a query
- If
If on entry LZWORK = -1, then a workspace query is assumed and the procedure only computes the minimal and the optimal workspace lengths and returns them in LZWORK(1) and LZWORK(2), respectively.
RWORKโ ๐ซถ this is literally where the excerpt stops, bestie; no type or description is given here, and I'm not gonna make one up. The next part picks it right up.RWORK(REAL(KIND=WP)LRWORK-by-1 array, workspace/output) โ okay so on exit,RWORK(1:N)is holding the singular values ofX(that's whenJOBS=='N') or of the column scaledX(whenJOBS=='S'or'C'). And ifWHTSVD==4, thenRWORK(N+1)andRWORK(N+2)contain the scaling factorRWORK(N+2)/RWORK(N+1)that got used to scaleXandYso the SVD ofXdoesn't overflow ๐- ngl that scaling factor can be interesting to you if the scaling option is off and you want as many as possible smallest eigenvalues to the highest feasible accuracy ๐
- and if the call to
ZGEDMDis only a workspace query, thenRWORK(1)contains the minimal workspace length. See the description ofLRWORKโจ
LRWORK(INTEGER, input) โ the minimal length of the workspace vectorRWORK, bestie. It's calculated like this:
LRWORK = MAX(1, N+LRWORK_SVD,N+LRWORK_ZGEEV)
where LRWORK_ZGEEV = MAX(1,2*N) and RWORK_SVD is the real workspace for the SVD subroutine determined by the input parameter WHTSVD. So:
- If
WHTSVD == 1::ZGESVD::
LRWORK_SVD = 5*MIN(M,N)
- If
WHTSVD == 2::ZGESDD::
LRWORK_SVD = MAX(5*MIN(M,N)*MIN(M,N)+7*MIN(M,N),
2*MAX(M,N)*MIN(M,N)+2*MIN(M,N)*MIN(M,N)+MIN(M,N) ) )
- If
WHTSVD == 3::ZGESVDQ::LRWORK_SVD = obtainable by a query - If
WHTSVD == 4::ZGEJSV::LRWORK_SVD = obtainable by a query
And if on entry LRWORK = -1, then a workspace query is assumed and the procedure only computes the minimal real workspace length and returns it in RWORK(1). slay ๐ธ
IWORK(INTEGERLIWORK-by-1 array, workspace/output) โ workspace that's only required ifWHTSVDequals2,3or4(peep the description ofWHTSVDfor that one ๐ซถ). And if on entryLWORK =-1orLIWORK=-1, then the minimal length ofIWORKis computed and returned inIWORK(1). See the description ofLIWORK๐LIWORK(INTEGER, input) โ the minimal length of the workspace vectorIWORK. The tea โ:- If
WHTSVD == 1, then onlyIWORK(1)is used;LIWORK >=1 - If
WHTSVD == 2, thenLIWORK >= MAX(1,8*MIN(M,N)) - If
WHTSVD == 3, thenLIWORK >= MAX(1,M+N-1) - If
WHTSVD == 4, thenLIWORK >= MAX(3,M+3*N)
- If
And if on entry LIWORK = -1, then a workspace query is assumed and the procedure only computes the minimal and the optimal workspace lengths for ZWORK, RWORK and IWORK. See the descriptions of ZWORK, RWORK and IWORK ๐
INFO(INTEGER, output) โ the vibe check report at the end ๐ it's giving:-i < 0:: on entry, the i-th argument had an illegal value= 0:: successful return ๐= 1:: void input. Quick exit (M=0orN=0)= 2:: the SVD computation ofXdid not converge. Suggestion: check the input data and/or repeat with differentWHTSVD= 3:: the computation of the eigenvalues did not converge ๐ญ= 4:: if data scaling was requested on input and the procedure found inconsistency in the data such that for some column indexi,X(:,i) = 0butY(:,i) /= 0, thenY(:,i)is set to zero ifJOBS=='C'. The computation proceeds with original or modified data and warning flag is set withINFO=4
โ๏ธ Author
Zlatko Drmac ๐
Definition at line 496 of file zgedmd.f90.
๐ subroutine zgedmdq
subroutine zgedmdq (character, intent(in) jobs, character, intent(in) jobz,
character, intent(in) jobr, character, intent(in) jobq, character,
intent(in) jobt, character, intent(in) jobf, integer, intent(in) whtsvd,
integer, intent(in) m, integer, intent(in) n, complex(kind=wp),
dimension(ldf,*), intent(inout) f, integer, intent(in) ldf,
complex(kind=wp), dimension(ldx,*), intent(out) x, integer, intent(in)
ldx, complex(kind=wp), dimension(ldy,*), intent(out) y, integer,
intent(in) ldy, integer, intent(in) nrnk, real(kind=wp), intent(in) tol,
integer, intent(out) k, complex(kind=wp), dimension(*), intent(out)
eigs, complex(kind=wp), dimension(ldz,*), intent(out) z, integer,
intent(in) ldz, real(kind=wp), dimension(*), intent(out) res,
complex(kind=wp), dimension(ldb,*), intent(out) b, integer, intent(in)
ldb, complex(kind=wp), dimension(ldv,*), intent(out) v, integer,
intent(in) ldv, complex(kind=wp), dimension(lds,*), intent(out) s,
integer, intent(in) lds, complex(kind=wp), dimension(*), intent(out)
zwork, integer, intent(in) lzwork, real(kind=wp), dimension(*),
intent(out) work, integer, intent(in) lwork, integer, dimension(*),
intent(out) iwork, integer, intent(in) liwork, integer, intent(out)
info)
ZGEDMDQ computes the Dynamic Mode Decomposition (DMD) for a pair of data snapshot matrices. periodt โจ
๐ฏ Purpose
ZGEDMDQcomputes the Dynamic Mode Decomposition (DMD) for a pair of data snapshot matrices, using a QR factorization based compression of the data. For the input matricesXandYsuch thatY = A*Xwith an unaccessible matrixA,ZGEDMDQcomputes a certain number of Ritz pairs ofAusing the standard Rayleigh-Ritz extraction from a subspace ofrange(X)that is determined using the leading left singular vectors ofX. Optionally,ZGEDMDQreturns the residuals of the computed Ritz pairs, the information needed for a refinement of the Ritz vectors, or the eigenvectors of the Exact DMD. For further details see the references listed below. For more details of the implementation see [3].
๐ References
[1] P. Schmid: Dynamic mode decomposition of numerical and experimental data, Journal of Fluid Mechanics 656, 5-28, 2010. [2] Z. Drmac, I. Mezic, R. Mohr: Data driven modal decompositions: analysis and enhancements, SIAM J. on Sci. Comp. 40 (4), A2253-A2285, 2018. [3] Z. Drmac: A LAPACK implementation of the Dynamic Mode Decomposition I. Technical report. AIMDyn Inc. and LAPACK Working Note 298. [4] J. Tu, C. W. Rowley, D. M. Luchtenburg, S. L. Brunton, N. Kutz: On Dynamic Mode Decomposition: Theory and Applications, Journal of Computational Dynamics 1(2), 391 -421, 2014.
๐ Developed and supported by
Developed and coded by Zlatko Drmac, Faculty of Science, University of Zagreb;drmac@math.hrIn cooperation with AIMdyn Inc., Santa Barbara, CA. and supported by - DARPA SBIR project Contract No:W31P4Q-21-C-0007- DARPA PAI project Contract No:HR0011-18-9-0033- DARPA MoDyL project Contract No:HR0011-16-C-0116Any opinions, findings and conclusions or recommendations expressed in this material are those of the author and do not necessarily reflect the views of the DARPA SBIR Program Office.
๐ Developed and supported by
Distribution Statement A: Approved for Public Release, Distribution Unlimited. Cleared by DARPA on September 29, 2022 ๐ซก
Parameters
JOBS
JOBS(input)CHARACTER*1Determines whether the initial data snapshots are scaled by a diagonal matrix. The data snapshots are the columns ofF. The leadingN-1columns ofFare denotedXand the trailingN-1columns are denotedY.
'S'โ the data snapshots matricesXandYare multiplied with a diagonal matrixDso thatX*Dhas unit nonzero columns (in the Euclidean 2-norm) ๐'C'โ the snapshots are scaled as with the'S'option. If it is found that an i-th column ofXis zero vector and the corresponding i-th column ofYis non-zero, then the i-th column ofYis set to zero and a warning flag is raised โ ๏ธ'Y'โ the data snapshots matricesXandYare multiplied by a diagonal matrixDso thatY*Dhas unit nonzero columns (in the Euclidean 2-norm)'N'โ no data scaling
JOBZ
JOBZ(input)CHARACTER*1Determines whether the eigenvectors (Koopman modes) will be computed.
'V'โ the eigenvectors (Koopman modes) will be computed and returned in the matrixZ. See the description ofZ๐'F'โ the eigenvectors (Koopman modes) will be returned in factored form as the productZ*V, whereZis orthonormal andVcontains the eigenvectors of the corresponding Rayleigh quotient. See the descriptions ofF,V,Z'Q'โ the eigenvectors (Koopman modes) will be returned in factored form as the productQ*Z, whereZcontains the eigenvectors of the compression of the underlying discretized operator onto the span of the data snapshots. See the descriptions ofF,V,Z.Qis from the initial QR factorization ๐ฆ'N'โ the eigenvectors are not computed
JOBR
JOBR(input)CHARACTER*1Determines whether to compute the residuals.
'R'โ the residuals for the computed eigenpairs will be computed and stored in the arrayRES. See the description ofRES. For this option to be legal,JOBZmust be'V'๐'N'โ the residuals are not computed
JOBQ
JOBQ(input)CHARACTER*1Specifies whether to explicitly compute and return the unitary matrix from the QR factorization.
'Q'โ the matrixQof the QR factorization of the data snapshot matrix is computed and stored in the arrayF. See the description ofFโจ'N'โ the matrixQis not explicitly computed
JOBT
JOBT
JOBT (input) CHARACTER*1 โ tells us whether we're handing back the upper triangular factor from the QR factorization, bestie. The deets:
'R'โ the matrixRof the QR factorization of the data snapshot matrixFgets returned in the arrayY. Peep the description ofYand Further details.'N'โ nope,Ris not returned. Not today.
JOBF
JOBF (input) CHARACTER*1 โ controls whether we stash the info needed for post-processing (like, say, computing refined Ritz vectors ๐). Options:
'R'โ the matrix needed for the refinement of the Ritz vectors is computed and stored in the arrayB. See the description ofB.'E'โ the unscaled eigenvectors of the Exact DMD are computed and returned in the arrayB. See the description ofB.'N'โ no eigenvector refinement data is computed. Zero. Nada.
Heads up ๐ซถ: to actually be useful on exit, this option needs JOBQ='Q'.
WHTSVD
WHTSVD (input) INTEGER, WHSTVD in { 1, 2, 3, 4 } โ this is your SVD algorithm picker from the LAPACK library โจ:
1::ZGESVD(the QR SVD algorithm)2::ZGESDD(the Divide and Conquer algorithm; if enough workspace available, this is the fastest option)3::ZGESVDQ(the preconditioned QR SVD ; this and 4 are the most accurate options)4::ZGEJSV(the preconditioned Jacobi SVD; this and 3 are the most accurate options)
For the four methods above, a significant difference in the accuracy of small singular values is possible if the snapshots vary in norm so that X is severely ill-conditioned ๐ฌ. If small (smaller than EPS*||X||) singular values are of interest and JOBS=='N', then the options (3, 4) give the most accurate results, where the option 4 is slightly better and with stronger theoretical background. If JOBS=='S', i.e. the columns of X will be normalized, then all methods give nearly equally accurate results. Iconic.
M
M (input) INTEGER, M >= 0 โ the state space dimension (the number of rows of F).
N
N (input) INTEGER, 0 <= N <= M โ the number of data snapshots from a single trajectory, taken at equidistant discrete times. Basically this is the number of columns of F ๐
.
F
F (input/output) COMPLEX(KIND=WP) M-by-N array
- On entry, the columns of
Fare the sequence of data snapshots from a single trajectory, taken at equidistant discrete times. It is assumed that the column norms ofFare in the range of the normalized floating point numbers. - On exit, if
JOBQ == 'Q', the arrayFcontains the orthogonal matrix/factor of the QR factorization of the initial data snapshots matrixF. See the description ofJOBQ. IfJOBQ == 'N', the entries inFstrictly below the main diagonal contain, column-wise, the information on the Householder vectors, as returned byZGEQRF. The remaining information to restore the orthogonal matrix of the initial QR factorization is stored inZWORK(1:MIN(M,N)). See the description ofZWORK. ๐
LDF
LDF (input) INTEGER, LDF >= M โ the leading dimension of the array F. Don't skip leg day.
X
X (workspace/output) COMPLEX(KIND=WP) MIN(M,N)-by-(N-1) array
X is used as workspace to hold representations of the leading N-1 snapshots in the orthonormal basis computed in the QR factorization of F.
On exit, the leading K columns of X contain the leading K left singular vectors of the above described content of X. To lift them to the space of the left singular vectors U(:,1:K) of the input data, pre-multiply with the Q factor from the initial QR factorization. See the descriptions of F, K, V and Z. โจ
LDX
LDX (input) INTEGER, LDX >= N โ the leading dimension of the array X.
Y
Y (workspace/output) COMPLEX(KIND=WP) MIN(M,N)-by-(N) array
Y is used as workspace to hold representations of the trailing N-1 snapshots in the orthonormal basis computed in the QR factorization of F.
On exit, if JOBT == 'R', Y contains the MIN(M,N)-by-N upper triangular factor from the QR factorization of the data snapshot matrix F. ๐
LDY
LDY (input) INTEGER , LDY >= N โ the leading dimension of the array Y.
NRNK
NRNK (input) INTEGER โ decides the mode for computing the numerical rank, i.e. how we truncate small singular values of the input matrix X. On input:
NRNK = -1:: the i-th singular valuesigma(i)is truncated ifsigma(i) <= TOL*sigma(1). This option is recommended. ๐NRNK = -2:: the i-th singular valuesigma(i)is truncated ifsigma(i) <= TOL*sigma(i-1). This option is included for R&D purposes. It requires highly accurate SVD, which may not be feasible. ๐
The numerical rank can be enforced by using a positive value of NRNK as follows:
0 < NRNK <= N-1:: at mostNRNKlargest singular values will be used. If the number of the computed nonzero singular values is less thanNRNK, then only those nonzero values will be used and the actually used dimension is less thanNRNK. The actual number of the nonzero singular values is returned in the variableK. See the description ofK.
TOL
TOL (input) REAL(KIND=WP), 0 <= TOL < 1 โ the tolerance for truncating small singular values. See the description of NRNK. Be nice to your tiny sigmas ๐ธ.
K
K (output) INTEGER, 0 <= K <= N โ the dimension of the SVD/POD basis for the leading N-1 data snapshots (columns of F) and the number of the computed Ritz pairs. The value of K is determined according to the rule set by the parameters NRNK and TOL. See the descriptions of NRNK and TOL. ๐ฆ
EIGS
EIGS (output) COMPLEX(KIND=WP) (N-1)-by-1 array โ the leading K (K<=N-1) entries of EIGS contain the computed eigenvalues (Ritz values). See the descriptions of K, and Z. โญ
Z
Z (workspace/output) COMPLEX(KIND=WP) M-by-(N-1) array
If JOBZ =='V' then Z contains the Ritz vectors. Z(:,i) is an eigenvector of the i-th Ritz value; ||Z(:,i)||_2=1.
If JOBZ == 'F', then the Z(:,i)'s are given implicitly as Z*V, where Z contains orthonormal matrix (the product of Q from the initial QR factorization and the SVD/POD_basis returned by ZGEDMD in X) and the second factor (the eigenvectors of the Rayleigh quotient) is in the array V, as returned by ZGEDMD. That is, X(:,1:K)*V(:,i) is an eigenvector corresponding to EIGS(i). The columns of V(1:K,1:K) are the computed eigenvectors of the K-by-K Rayleigh quotient. See the descriptions of EIGS, X and V. ๐
LDZ
LDZ (input) INTEGER , LDZ >= M โ the leading dimension of the array Z.
RES
RES (output) REAL(KIND=WP) (N-1)-by-1 array โ RES(1:K) contains the residuals for the K computed Ritz pairs:
RES(i) = || A * Z(:,i) - EIGS(i)*Z(:,i))||_2.
See the description of EIGS and Z. ๐ญ (residuals never lie)
B
B (output) COMPLEX(KIND=WP) MIN(M,N)-by-(N-1) array.
- If
JOBF =='R',B(1:N,1:K)containsA*U(:,1:K), and can be used for computing the refined vectors; see further details in the provided references. - If
JOBF == 'E',B(1:N,1;K)containsA*U(:,1:K)*W(1:K,1:K), which are the vectors from the Exact DMD, up to scaling by the inverse eigenvalues.
In both cases, the content of B can be lifted to the original dimension of the input data by pre-multiplying with the Q factor from the initial QR factorization. Here A denotes a compression of the underlying operator. See the descriptions of F and X.
If JOBF =='N', then B is not referenced. ๐ซฅ
LDB
LDB (input) INTEGER, LDB >= MIN(M,N) โ the leading dimension of the array B.
V
V (workspace/output) COMPLEX(KIND=WP) (N-1)-by-(N-1) array
On exit, V(1:K,1:K) V contains the K eigenvectors of the Rayleigh quotient. The Ritz vectors (returned in Z) are the product of Q from the initial QR factorization (see the description of F) X (see the description of X) and V. ๐
LDV
LDV (input) INTEGER, LDV >= N-1 โ the leading dimension of the array V.
S
S (output) COMPLEX(KIND=WP) (N-1)-by-(N-1) array โ the array S(1:K,1:K) is used for the matrix Rayleigh quotient. This content is overwritten during the eigenvalue decomposition by ZGEEV. See the description of K. ๐
LDS
LDS (input) INTEGER, LDS >= N-1 โ the leading dimension of the array S.
ZWORK
ZWORK (workspace/output) COMPLEX(KIND=WP) LWORK-by-1 array
On exit, ZWORK(1:MIN(M,N)) contains the scalar factors of the elementary reflectors as returned by ZGEQRF of the M-by-N input matrix F.
If the call to ZGEDMDQ is only workspace query, then ZWORK(1) contains the minimal complex workspace length and ZWORK(2) is the optimal complex workspace length. Hence, the length of work is at least 2. See the description of LZWORK. โจ
LZWORK
LZWORK(input)INTEGERโ okay so this is the minimal length of theZWORKworkspace vector, bestie. It gets calculated like this:
Let
MLWQR = N (minimal workspace for ZGEQRF[M,N])
MLWDMD = minimal workspace for ZGEDMD (see the description of LWORK in ZGEDMD)
MLWMQR = N (minimal workspace for ZUNMQR['L','N',M,N,N])
MLWGQR = N (minimal workspace for ZUNGQR[M,N,N])
MINMN = MIN(M,N)
Then
LZWORK = MAX(2, MIN(M,N)+MLWQR, MINMN+MLWDMD)
is further updated as follows:
if JOBZ == 'V' or JOBZ == 'F' THEN
LZWORK = MAX(LZWORK, MINMN+MLWMQR)
if JOBQ == 'Q' THEN
LZWORK = MAX(ZLWORK, MINMN+MLWGQR)
WORK(workspace/output)REAL(KIND=WP)LWORK-by-1 array โ on exit,WORK(1:N-1)contains the singular values of the input submatrixF(1:M,1:N-1). If the call toZGEDMDQis only a workspace query, thenWORK(1)contains the minimal workspace length andWORK(2)is the optimal workspace length. Hence, the length ofWORKis at least 2. See the description ofLWORK.LWORK(input)INTEGERโ the minimal length of theWORKworkspace vector.LWORKis the same as inZGEDMD, because inZGEDMDQonlyZGEDMDrequires real workspace for snapshots of dimensionsMIN(M,N)-by-(N-1). If on entryLWORK = -1, then a workspace query is assumed and the procedure only computes the minimal and the optimal workspace length forWORK.IWORK(workspace/output)INTEGERLIWORK-by-1 array โ workspace that is required only ifWHTSVDequals 2, 3, or 4. (See the description ofWHTSVD.) If on entryLWORK =-1orLIWORK=-1, then the minimal length ofIWORKis computed and returned inIWORK(1). See the description ofLIWORK.LIWORK(input)INTEGERโ the minimal length of theIWORKworkspace vector. IfWHTSVD == 1, then onlyIWORK(1)is used;LIWORK >=1. LetM1=MIN(M,N),N1=N-1. Then:- If
WHTSVD == 2, thenLIWORK >= MAX(1,8*MIN(M1,N1)) - If
WHTSVD == 3, thenLIWORK >= MAX(1,M1+N1-1) - If
WHTSVD == 4, thenLIWORK >= MAX(3,M1+3*N1)
- If
If on entry LIWORK = -1, then a workspace query is assumed and the procedure only computes the minimal and the optimal workspace lengths for both WORK and IWORK. See the descriptions of WORK and IWORK.
INFO(output)INTEGERโ the exit-status tea, spilled:-i < 0 ::On entry, thei-th argument had an illegal value= 0 ::Successful return.= 1 ::Void input. Quick exit (M=0orN=0).= 2 ::The SVD computation ofXdid not converge. Suggestion: Check the input data and/or repeat with differentWHTSVD.= 3 ::The computation of the eigenvalues did not converge.= 4 ::If data scaling was requested on input and the procedure found inconsistency in the data such that for some column indexi,X(:,i) = 0 but Y(:,i) /= 0, thenY(:,i)is set to zero ifJOBS=='C'. The computation proceeds with original or modified data and warning flag is set withINFO=4.
๐ Author ๐
Zlatko Drmac
Definition at line 551 of file zgedmdq.f90.
๐ง Author ๐ง
Generated automatically by Doxygen for LAPACK from the source code.
Thatโs the LAPACK Version 3.12.0 gedmd(3) manual page, bestie โ source/version footer included, date not included, and weโre out ๐โจ๐
๐ฆ where this page comes from
- arch rolling: lapack-doc 3.12.1-2 ยท custom
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms