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

Function LOBPCG

python/eigenvalues.py:113–163  ·  view source on GitHub ↗

Knyazev's cg-like extension of PINVIT

(mata, matm, pre, num=1, maxit=20, initial=None, printrates=True, largest=False)

Source from the content-addressed store, hash-verified

111
112
113def LOBPCG(mata, matm, pre, num=1, maxit=20, initial=None, printrates=True, largest=False):
114 """Knyazev's cg-like extension of PINVIT"""
115 import scipy.linalg
116
117 r = mata.CreateRowVector()
118
119 if initial:
120 num=len(initial)
121 uvecs = initial
122 else:
123 uvecs = MultiVector(r, num)
124
125 vecs = MultiVector(r, 3*num)
126 for v in vecs:
127 r.SetRandom()
128 v.data = pre * r
129
130 if initial:
131 vecs[0:num] = uvecs
132
133 lams = Vector(num * [1])
134
135 for i in range(maxit):
136 uvecs.data = mata * vecs[0:num] - (matm * vecs[0:num]).Scale (lams)
137 vecs[2*num:3*num] = pre * uvecs
138
139 vecs.Orthogonalize(matm)
140
141 asmall = InnerProduct (vecs, mata * vecs)
142 msmall = InnerProduct (vecs, matm * vecs)
143
144 ev,evec = scipy.linalg.eigh(a=asmall, b=msmall)
145
146 if not largest:
147 lams = Vector(ev[0:num])
148 if printrates:
149 print (i, ":", list(lams), flush=True)
150
151 uvecs[:] = vecs * Matrix(evec[:,0:num])
152 vecs[num:2*num] = vecs[0:num]
153 vecs[0:num] = uvecs
154 else:
155 lams = Vector(ev[2*num:3*num])
156 if printrates:
157 print (i, ":", list(lams), flush=True)
158
159 uvecs[:] = vecs * Matrix(evec[:,2*num:3*num])
160 vecs[num:2*num] = vecs[0:num]
161 vecs[0:num] = uvecs
162
163 return lams, uvecs
164
165
166

Callers

nothing calls this directly

Calls 6

VectorClass · 0.85
MultiVectorClass · 0.50
InnerProductFunction · 0.50
MatrixClass · 0.50
CreateRowVectorMethod · 0.45
ScaleMethod · 0.45

Tested by

no test coverage detected