MCPcopy Create free account
hub / github.com/NGSolve/ngsolve / PINVIT1

Function PINVIT1

python/eigenvalues.py:19–70  ·  view source on GitHub ↗

preconditioned inverse iteration

(mata, matm, pre, num=1, maxit=20, printrates=True, GramSchmidt=False)

Source from the content-addressed store, hash-verified

17
18
19def PINVIT1(mata, matm, pre, num=1, maxit=20, printrates=True, GramSchmidt=False):
20 """preconditioned inverse iteration"""
21 import scipy.linalg
22
23 r = mata.CreateRowVector()
24 Av = mata.CreateRowVector()
25 Mv = mata.CreateRowVector()
26
27 uvecs = []
28 for i in range(num):
29 uvecs.append (mata.CreateRowVector())
30
31 vecs = []
32 for i in range(2*num):
33 vecs.append (mata.CreateRowVector())
34
35 for v in uvecs:
36 r.SetRandom()
37 v.data = pre * r
38
39 asmall = Matrix(2*num, 2*num)
40 msmall = Matrix(2*num, 2*num)
41 lams = num * [1]
42
43 for i in range(maxit):
44
45 for j in range(num):
46 vecs[j].data = uvecs[j]
47 r.data = mata * vecs[j] - lams[j] * matm * vecs[j]
48 vecs[num+j].data = pre * r
49
50 if GramSchmidt:
51 Orthogonalize (vecs, matm)
52
53 for j in range(2*num):
54 Av.data = mata * vecs[j]
55 Mv.data = matm * vecs[j]
56 for k in range(2*num):
57 asmall[j,k] = InnerProduct(Av, vecs[k])
58 msmall[j,k] = InnerProduct(Mv, vecs[k])
59
60 ev,evec = scipy.linalg.eigh(a=asmall, b=msmall)
61 lams[:] = ev[0:num]
62 if printrates:
63 print (i, ":", lams)
64
65 for j in range(num):
66 uvecs[j][:] = 0.0
67 for k in range(2*num):
68 uvecs[j].data += float(evec[k,j]) * vecs[k]
69
70 return lams, uvecs
71
72
73

Callers

nothing calls this directly

Calls 4

OrthogonalizeFunction · 0.85
MatrixClass · 0.50
InnerProductFunction · 0.50
CreateRowVectorMethod · 0.45

Tested by

no test coverage detected