forked from The-OpenROAD-Project/OpenSTA
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Arnoldi.txt
57 lines (54 loc) · 2.39 KB
/
Arnoldi.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
The method is used for simulation with a time-and-voltage-dependent
current source. But it is simpler to describe with a linear driver.
Suppose we are given:
voltage nodes 1,..n initialized to V[j]=1.0
a resistor network described by a conductance matrix G[j,k]
a drive resistance from node 1 to ground, Rdrv
capacitance of the nodes, c[j], also written as a
diagonal matrix C[j,k]
The node voltages will fall to zero with time.
Matrix equation:
GV+CdV/dt = -(V[0]/Rdrv)e0
where e0 is the unit vector (1,0,0,..0).
Let G' be the matrix formed by taking G and adding 1/Rdrv in the
[0,0] position. Then we are solving G'V + CdV/dt = 0.
Let R be the inverse of G'. (In implementation, R may not actually
be formed as a matrix, instead some method of producing RV given V).
The exact solution would diagonalize sqrt(C) R sqrt(C).
The Arnoldi method takes a matrix M and a vector of interest V, and
considers the subspace of vectors near V in terms of the action of M,
that is, the space spanned by V, MV, MMV, etc, for a small number of
powers. We do this here, but instead of finding the part of MV orthogonal
to V, we find the part of RCV that is C-orthogonal of V. We use C
as the metric, so the basis vectors U0, U1, U2 that we generate satisfy
Ui.CUj = (i==j?1:0)
U0 = (1,1,..1)/sqrt(sum C)
representing the initial value of V, V[j] = sqrt(n)U0[j] at t=0.
sum(C) = C[0]+..C[n-1], so U0.C U0 = 1.
Let:
W = R C U0
d0 = U0.C W
W' = W - d0 U0
e0 = sqrt(W'.C W')
U1 = W'/e0
Then: U0.C U0 = U1.C U1 = 1, U0.C U1 = 0, and
R C U0 = d0 U0 + e0 U1
Next step:
W = R C U1
d1 = U1.C W
W' = W - d1 U1 - e0 U0
e1 = sqrt(W'.C W')
U2 = W'/e1
and we have U2.C U2 = 1, U2.C U1 = U2.C U0 = 0, and
RC U1 = e0 U0 + d1 U1 + e1 U2
In this way, RC, which in nonsymmetric in the original basis,
becomes a symmetric tridiagonal matrix in the U0,U1,.. basis.
We stop at, say, U3. The resulting 4x4 tridiagonal matrix is
positive definite, because it is the projection of sqrt(C)R sqrt(C)
to a subspace. So the eigenvalues of this small tridiagonal matrix
are guaranteed to be positive. This is the advantage over AWE.
In the actual implementation, I remember there was some way of
isolating the node 0 where drive resistance is attached, so that the
tridiagonal matrix (d,e) can be recalculated without knowing Rdrv,
and then just the first d0,e0 updated when the Rdrv is known, or
when Rdrv changes in a simulation.