LAPACK  3.4.1
LAPACK: Linear Algebra PACKage
dlakf2.f
Go to the documentation of this file.
00001 *> \brief \b DLAKF2
00002 *
00003 *  =========== DOCUMENTATION ===========
00004 *
00005 * Online html documentation available at 
00006 *            http://www.netlib.org/lapack/explore-html/ 
00007 *
00008 *  Definition:
00009 *  ===========
00010 *
00011 *       SUBROUTINE DLAKF2( M, N, A, LDA, B, D, E, Z, LDZ )
00012 * 
00013 *       .. Scalar Arguments ..
00014 *       INTEGER            LDA, LDZ, M, N
00015 *       ..
00016 *       .. Array Arguments ..
00017 *       DOUBLE PRECISION   A( LDA, * ), B( LDA, * ), D( LDA, * ),
00018 *      $                   E( LDA, * ), Z( LDZ, * )
00019 *       ..
00020 *  
00021 *
00022 *> \par Purpose:
00023 *  =============
00024 *>
00025 *> \verbatim
00026 *>
00027 *> Form the 2*M*N by 2*M*N matrix
00028 *>
00029 *>        Z = [ kron(In, A)  -kron(B', Im) ]
00030 *>            [ kron(In, D)  -kron(E', Im) ],
00031 *>
00032 *> where In is the identity matrix of size n and X' is the transpose
00033 *> of X. kron(X, Y) is the Kronecker product between the matrices X
00034 *> and Y.
00035 *> \endverbatim
00036 *
00037 *  Arguments:
00038 *  ==========
00039 *
00040 *> \param[in] M
00041 *> \verbatim
00042 *>          M is INTEGER
00043 *>          Size of matrix, must be >= 1.
00044 *> \endverbatim
00045 *>
00046 *> \param[in] N
00047 *> \verbatim
00048 *>          N is INTEGER
00049 *>          Size of matrix, must be >= 1.
00050 *> \endverbatim
00051 *>
00052 *> \param[in] A
00053 *> \verbatim
00054 *>          A is DOUBLE PRECISION, dimension ( LDA, M )
00055 *>          The matrix A in the output matrix Z.
00056 *> \endverbatim
00057 *>
00058 *> \param[in] LDA
00059 *> \verbatim
00060 *>          LDA is INTEGER
00061 *>          The leading dimension of A, B, D, and E. ( LDA >= M+N )
00062 *> \endverbatim
00063 *>
00064 *> \param[in] B
00065 *> \verbatim
00066 *>          B is DOUBLE PRECISION, dimension ( LDA, N )
00067 *> \endverbatim
00068 *>
00069 *> \param[in] D
00070 *> \verbatim
00071 *>          D is DOUBLE PRECISION, dimension ( LDA, M )
00072 *> \endverbatim
00073 *>
00074 *> \param[in] E
00075 *> \verbatim
00076 *>          E is DOUBLE PRECISION, dimension ( LDA, N )
00077 *>
00078 *>          The matrices used in forming the output matrix Z.
00079 *> \endverbatim
00080 *>
00081 *> \param[out] Z
00082 *> \verbatim
00083 *>          Z is DOUBLE PRECISION, dimension ( LDZ, 2*M*N )
00084 *>          The resultant Kronecker M*N*2 by M*N*2 matrix (see above.)
00085 *> \endverbatim
00086 *>
00087 *> \param[in] LDZ
00088 *> \verbatim
00089 *>          LDZ is INTEGER
00090 *>          The leading dimension of Z. ( LDZ >= 2*M*N )
00091 *> \endverbatim
00092 *
00093 *  Authors:
00094 *  ========
00095 *
00096 *> \author Univ. of Tennessee 
00097 *> \author Univ. of California Berkeley 
00098 *> \author Univ. of Colorado Denver 
00099 *> \author NAG Ltd. 
00100 *
00101 *> \date November 2011
00102 *
00103 *> \ingroup double_matgen
00104 *
00105 *  =====================================================================
00106       SUBROUTINE DLAKF2( M, N, A, LDA, B, D, E, Z, LDZ )
00107 *
00108 *  -- LAPACK computational routine (version 3.4.0) --
00109 *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
00110 *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
00111 *     November 2011
00112 *
00113 *     .. Scalar Arguments ..
00114       INTEGER            LDA, LDZ, M, N
00115 *     ..
00116 *     .. Array Arguments ..
00117       DOUBLE PRECISION   A( LDA, * ), B( LDA, * ), D( LDA, * ),
00118      $                   E( LDA, * ), Z( LDZ, * )
00119 *     ..
00120 *
00121 *  ====================================================================
00122 *
00123 *     .. Parameters ..
00124       DOUBLE PRECISION   ZERO
00125       PARAMETER          ( ZERO = 0.0D+0 )
00126 *     ..
00127 *     .. Local Scalars ..
00128       INTEGER            I, IK, J, JK, L, MN, MN2
00129 *     ..
00130 *     .. External Subroutines ..
00131       EXTERNAL           DLASET
00132 *     ..
00133 *     .. Executable Statements ..
00134 *
00135 *     Initialize Z
00136 *
00137       MN = M*N
00138       MN2 = 2*MN
00139       CALL DLASET( 'Full', MN2, MN2, ZERO, ZERO, Z, LDZ )
00140 *
00141       IK = 1
00142       DO 50 L = 1, N
00143 *
00144 *        form kron(In, A)
00145 *
00146          DO 20 I = 1, M
00147             DO 10 J = 1, M
00148                Z( IK+I-1, IK+J-1 ) = A( I, J )
00149    10       CONTINUE
00150    20    CONTINUE
00151 *
00152 *        form kron(In, D)
00153 *
00154          DO 40 I = 1, M
00155             DO 30 J = 1, M
00156                Z( IK+MN+I-1, IK+J-1 ) = D( I, J )
00157    30       CONTINUE
00158    40    CONTINUE
00159 *
00160          IK = IK + M
00161    50 CONTINUE
00162 *
00163       IK = 1
00164       DO 90 L = 1, N
00165          JK = MN + 1
00166 *
00167          DO 80 J = 1, N
00168 *
00169 *           form -kron(B', Im)
00170 *
00171             DO 60 I = 1, M
00172                Z( IK+I-1, JK+I-1 ) = -B( J, L )
00173    60       CONTINUE
00174 *
00175 *           form -kron(E', Im)
00176 *
00177             DO 70 I = 1, M
00178                Z( IK+MN+I-1, JK+I-1 ) = -E( J, L )
00179    70       CONTINUE
00180 *
00181             JK = JK + M
00182    80    CONTINUE
00183 *
00184          IK = IK + M
00185    90 CONTINUE
00186 *
00187       RETURN
00188 *
00189 *     End of DLAKF2
00190 *
00191       END
 All Files Functions