## MB04DD

### Balancing a real Hamiltonian matrix

[Specification] [Arguments] [Method] [References] [Comments] [Example]

Purpose

```  To balance a real Hamiltonian matrix,

[  A   G  ]
H =  [       T ] ,
[  Q  -A  ]

where A is an N-by-N matrix and G, Q are N-by-N symmetric
matrices. This involves, first, permuting H by a symplectic
similarity transformation to isolate eigenvalues in the first
1:ILO-1 elements on the diagonal of A; and second, applying a
diagonal similarity transformation to rows and columns
ILO:N, N+ILO:2*N to make the rows and columns as close in 1-norm
as possible. Both steps are optional.

```
Specification
```      SUBROUTINE MB04DD( JOB, N, A, LDA, QG, LDQG, ILO, SCALE, INFO )
C     .. Scalar Arguments ..
CHARACTER         JOB
INTEGER           ILO, INFO, LDA, LDQG, N
C     .. Array Arguments ..
DOUBLE PRECISION  A(LDA,*), QG(LDQG,*), SCALE(*)

```
Arguments

Mode Parameters

```  JOB     CHARACTER*1
Specifies the operations to be performed on H:
= 'N':  none, set ILO = 1, SCALE(I) = 1.0, I = 1 .. N;
= 'P':  permute only;
= 'S':  scale only;
= 'B':  both permute and scale.

```
Input/Output Parameters
```  N       (input) INTEGER
The order of the matrix A. N >= 0.

A       (input/output) DOUBLE PRECISION array, dimension (LDA,N)
On entry, the leading N-by-N part of this array must
contain the matrix A.
On exit, the leading N-by-N part of this array contains
the matrix A of the balanced Hamiltonian. In particular,
the strictly lower triangular part of the first ILO-1
columns of A is zero.

LDA     INTEGER
The leading dimension of the array A.  LDA >= MAX(1,N).

QG      (input/output) DOUBLE PRECISION array, dimension
(LDQG,N+1)
On entry, the leading N-by-N+1 part of this array must
contain the lower triangular part of the matrix Q and
the upper triangular part of the matrix G.
On exit, the leading N-by-N+1 part of this array contains
the lower and upper triangular parts of the matrices Q and
G, respectively, of the balanced Hamiltonian. In
particular, the lower triangular part of the first ILO-1
columns of QG is zero.

LDQG    INTEGER
The leading dimension of the array QG.  LDQG >= MAX(1,N).

ILO     (output) INTEGER
ILO-1 is the number of deflated eigenvalues in the
balanced Hamiltonian matrix.

SCALE   (output) DOUBLE PRECISION array of dimension (N)
Details of the permutations and scaling factors applied to
H.  For j = 1,...,ILO-1 let P(j) = SCALE(j). If P(j) <= N,
then rows and columns P(j) and P(j)+N are interchanged
with rows and columns j and j+N, respectively. If
P(j) > N, then row and column P(j)-N are interchanged with
row and column j+N by a generalized symplectic
permutation. For j = ILO,...,N the j-th element of SCALE
contains the factor of the scaling applied to row and
column j.

```
Error Indicator
```  INFO    INTEGER
= 0:  successful exit;
< 0:  if INFO = -i, the i-th argument had an illegal
value.

```
References
```   Benner, P.
Symplectic balancing of Hamiltonian matrices.
SIAM J. Sci. Comput., 22 (5), pp. 1885-1904, 2001.

```
```  None
```
Example

Program Text

```*     MB04DD EXAMPLE PROGRAM TEXT
*     Copyright (c) 2002-2017 NICONET e.V.
*
*     .. Parameters ..
INTEGER          NIN, NOUT
PARAMETER        ( NIN = 5, NOUT = 6 )
INTEGER          NMAX
PARAMETER        ( NMAX = 100 )
INTEGER          LDA, LDQG
PARAMETER        ( LDA = NMAX, LDQG = NMAX )
*     .. Local Scalars ..
CHARACTER*1      JOB
INTEGER          I, ILO, INFO, J, N
*     .. Local Arrays ..
DOUBLE PRECISION A(LDA, NMAX), DUMMY(1), QG(LDQG, NMAX+1),
\$                 SCALE(NMAX)
*     .. External Functions ..
DOUBLE PRECISION DLANTR, DLAPY2
EXTERNAL         DLANTR, DLAPY2
*     .. External Subroutines ..
EXTERNAL         MB04DD
*     .. Executable Statements ..
WRITE ( NOUT, FMT = 99999 )
*     Skip the heading in the data file and read the data.
READ ( NIN, FMT = '()' )
READ ( NIN, FMT = * )  N, JOB
IF( N.LE.0 .OR. N.GT.NMAX ) THEN
WRITE ( NOUT, FMT = 99994 ) N
ELSE
READ ( NIN, FMT = * ) ( ( A(I,J), J = 1,N ), I = 1,N )
READ ( NIN, FMT = * ) ( ( QG(I,J), J = 1,N+1 ), I = 1,N )
CALL MB04DD( JOB, N, A, LDA, QG, LDQG, ILO, SCALE, INFO )
IF ( INFO.NE.0 ) THEN
WRITE ( NOUT, FMT = 99998 ) INFO
ELSE
WRITE ( NOUT, FMT = 99997 )
DO 30  I = 1, N
WRITE (NOUT, FMT = 99995) ( A(I,J), J = 1,N )
30          CONTINUE
WRITE ( NOUT, FMT = 99996 )
DO 40  I = 1, N
WRITE (NOUT, FMT = 99995) ( QG(I,J), J = 1,N+1 )
40          CONTINUE
WRITE (NOUT, FMT = 99993)  ILO
IF ( ILO.GT.1 ) THEN
WRITE (NOUT, FMT = 99992) DLAPY2( DLANTR( 'Frobenius',
\$                 'Lower', 'No Unit', N-1, ILO-1, A(2,1), LDA,
\$                 DUMMY ), DLANTR( 'Frobenius', 'Lower', 'No Unit',
\$                 N, ILO-1, QG(1,1), LDQG, DUMMY ) )
END IF
END IF
END IF
*
99999 FORMAT (' MB04DD EXAMPLE PROGRAM RESULTS',/1X)
99998 FORMAT (' INFO on exit from MB04DD = ',I2)
99997 FORMAT (' The balanced matrix A is ')
99996 FORMAT (/' The balanced matrix QG is ')
99995 FORMAT (20(1X,F12.4))
99994 FORMAT (/' N is out of range.',/' N = ',I5)
99993 FORMAT (/' ILO = ',I4)
99992 FORMAT (/' Norm of subdiagonal blocks: ',G7.2)
END
```
Program Data
```MB04DD EXAMPLE PROGRAM DATA
6       B
0         0         0         0         0         0
0.0994         0         0         0         0    0.9696
0.3248         0         0         0    0.4372    0.8308
0         0         0    0.0717         0         0
0         0         0         0         0    0.1976
0         0         0         0         0         0
0         0         0         0         0         0         0
0         0         0         0    0.0651         0         0
0         0         0         0         0         0         0
0         0    0.0444         0         0    0.1957         0
0.8144         0         0         0    0.3652         0    0.9121
0.9023         0         0         0         0         0    1.0945
```
Program Results
``` MB04DD EXAMPLE PROGRAM RESULTS

The balanced matrix A is
0.0000       0.0000       0.0000       0.0000       0.0000       0.9696
0.0000       0.0000       0.0000       0.0000      -0.8144      -0.9023
0.0000       0.0000       0.0000       0.0000       0.1093       0.2077
0.0000       0.0000       0.0000       0.0717       0.0000       0.0000
0.0000       0.0000       0.0000       0.0000       0.0000       0.1976
0.0000       0.0000       0.0000       0.0000       0.0000       0.0000

The balanced matrix QG is
0.0000       0.0000       0.0994       0.0000       0.0651       0.0000       0.0000
0.0000       0.0000       0.0000       0.0812       0.0000       0.0000       0.0000
0.0000       0.0000       0.0000       0.0000       0.0000       0.0000       0.0000
0.0000       0.0000       0.1776       0.0000       0.0000       0.1957       0.0000
0.0000       0.0000       0.0000       0.0000       0.3652       0.0000       0.9121
0.0000       0.0000       0.0000       0.0000       0.0000       0.0000       1.0945

ILO =    3

Norm of subdiagonal blocks: 0.0
```