root / ase / transport / tools.py @ 1
Historique | Voir | Annoter | Télécharger (14,08 ko)
1 | 1 | tkerber | import numpy as np |
---|---|---|---|
2 | 1 | tkerber | from math import sqrt, exp |
3 | 1 | tkerber | |
4 | 1 | tkerber | def tri2full(H_nn, UL='L'): |
5 | 1 | tkerber | """Fill in values of hermitian matrix.
|
6 | 1 | tkerber |
|
7 | 1 | tkerber | Fill values in lower or upper triangle of H_nn based on the opposite
|
8 | 1 | tkerber | triangle, such that the resulting matrix is symmetric/hermitian.
|
9 | 1 | tkerber |
|
10 | 1 | tkerber | UL='U' will copy (conjugated) values from upper triangle into the
|
11 | 1 | tkerber | lower triangle.
|
12 | 1 | tkerber |
|
13 | 1 | tkerber | UL='L' will copy (conjugated) values from lower triangle into the
|
14 | 1 | tkerber | upper triangle.
|
15 | 1 | tkerber | """
|
16 | 1 | tkerber | N, tmp = H_nn.shape |
17 | 1 | tkerber | assert N == tmp, 'Matrix must be square' |
18 | 1 | tkerber | #assert np.isreal(H_nn.diagonal()).all(), 'Diagonal should be real'
|
19 | 1 | tkerber | if UL != 'L': |
20 | 1 | tkerber | H_nn = H_nn.T |
21 | 1 | tkerber | |
22 | 1 | tkerber | for n in range(N - 1): |
23 | 1 | tkerber | H_nn[n, n + 1:] = H_nn[n + 1:, n].conj() |
24 | 1 | tkerber | |
25 | 1 | tkerber | def dagger(matrix): |
26 | 1 | tkerber | return np.conj(matrix.T)
|
27 | 1 | tkerber | |
28 | 1 | tkerber | def rotate_matrix(h, u): |
29 | 1 | tkerber | return np.dot(u.T.conj(), np.dot(h, u))
|
30 | 1 | tkerber | |
31 | 1 | tkerber | def get_subspace(matrix, index): |
32 | 1 | tkerber | """Get the subspace spanned by the basis function listed in index"""
|
33 | 1 | tkerber | assert matrix.ndim == 2 and matrix.shape[0] == matrix.shape[1] |
34 | 1 | tkerber | return matrix.take(index, 0).take(index, 1) |
35 | 1 | tkerber | |
36 | 1 | tkerber | permute_matrix = get_subspace |
37 | 1 | tkerber | |
38 | 1 | tkerber | def normalize(matrix, S=None): |
39 | 1 | tkerber | """Normalize column vectors.
|
40 | 1 | tkerber |
|
41 | 1 | tkerber | ::
|
42 | 1 | tkerber |
|
43 | 1 | tkerber | <matrix[:,i]| S |matrix[:,i]> = 1
|
44 | 1 | tkerber |
|
45 | 1 | tkerber | """
|
46 | 1 | tkerber | for col in matrix.T: |
47 | 1 | tkerber | if S is None: |
48 | 1 | tkerber | col /= np.linalg.norm(col) |
49 | 1 | tkerber | else:
|
50 | 1 | tkerber | col /= np.sqrt(np.dot(col.conj(), np.dot(S, col))) |
51 | 1 | tkerber | |
52 | 1 | tkerber | def subdiagonalize(h_ii, s_ii, index_j): |
53 | 1 | tkerber | nb = h_ii.shape[0]
|
54 | 1 | tkerber | nb_sub = len(index_j)
|
55 | 1 | tkerber | h_sub_jj = get_subspace(h_ii, index_j) |
56 | 1 | tkerber | s_sub_jj = get_subspace(s_ii, index_j) |
57 | 1 | tkerber | e_j, v_jj = np.linalg.eig(np.linalg.solve(s_sub_jj, h_sub_jj)) |
58 | 1 | tkerber | normalize(v_jj, s_sub_jj) # normalize: <v_j|s|v_j> = 1
|
59 | 1 | tkerber | permute_list = np.argsort(e_j.real) |
60 | 1 | tkerber | e_j = np.take(e_j, permute_list) |
61 | 1 | tkerber | v_jj = np.take(v_jj, permute_list, axis=1)
|
62 | 1 | tkerber | |
63 | 1 | tkerber | #setup transformation matrix
|
64 | 1 | tkerber | c_ii = np.identity(nb, complex)
|
65 | 1 | tkerber | for i in xrange(nb_sub): |
66 | 1 | tkerber | for j in xrange(nb_sub): |
67 | 1 | tkerber | c_ii[index_j[i], index_j[j]] = v_jj[i, j] |
68 | 1 | tkerber | |
69 | 1 | tkerber | h1_ii = rotate_matrix(h_ii, c_ii) |
70 | 1 | tkerber | s1_ii = rotate_matrix(s_ii, c_ii) |
71 | 1 | tkerber | |
72 | 1 | tkerber | return h1_ii, s1_ii, c_ii, e_j
|
73 | 1 | tkerber | |
74 | 1 | tkerber | def cutcoupling(h, s, index_n): |
75 | 1 | tkerber | for i in index_n: |
76 | 1 | tkerber | s[:, i] = 0.0
|
77 | 1 | tkerber | s[i, :] = 0.0
|
78 | 1 | tkerber | s[i, i] = 1.0
|
79 | 1 | tkerber | Ei = h[i, i] |
80 | 1 | tkerber | h[:, i] = 0.0
|
81 | 1 | tkerber | h[i, :] = 0.0
|
82 | 1 | tkerber | h[i, i] = Ei |
83 | 1 | tkerber | |
84 | 1 | tkerber | def fermidistribution(energy, kt): |
85 | 1 | tkerber | #fermi level is fixed to zero
|
86 | 1 | tkerber | return 1.0 / (1.0 + np.exp(energy / kt) ) |
87 | 1 | tkerber | |
88 | 1 | tkerber | def fliplr(a): |
89 | 1 | tkerber | length=len(a)
|
90 | 1 | tkerber | b = [0] * length
|
91 | 1 | tkerber | for i in range(length): |
92 | 1 | tkerber | b[i] = a[length - i - 1]
|
93 | 1 | tkerber | return b
|
94 | 1 | tkerber | |
95 | 1 | tkerber | def plot_path(energy): |
96 | 1 | tkerber | import pylab |
97 | 1 | tkerber | pylab.plot(np.real(energy), np.imag(energy), 'b--o')
|
98 | 1 | tkerber | pylab.show() |
99 | 1 | tkerber | |
100 | 1 | tkerber | |
101 | 1 | tkerber | def function_integral(function, calcutype): |
102 | 1 | tkerber | #return the integral of the 'function' on 'intrange'
|
103 | 1 | tkerber | #the function can be a value or a matrix, arg1,arg2 are the possible
|
104 | 1 | tkerber | #parameters of the function
|
105 | 1 | tkerber | |
106 | 1 | tkerber | intctrl = function.intctrl |
107 | 1 | tkerber | if calcutype == 'eqInt': |
108 | 1 | tkerber | intrange = intctrl.eqintpath |
109 | 1 | tkerber | tol = intctrl.eqinttol |
110 | 1 | tkerber | if hasattr(function.intctrl, 'eqpath_radius'): |
111 | 1 | tkerber | radius = function.intctrl.eqpath_radius |
112 | 1 | tkerber | else:
|
113 | 1 | tkerber | radius = -1
|
114 | 1 | tkerber | if hasattr(function.intctrl, 'eqpath_origin'): |
115 | 1 | tkerber | origin = function.intctrl.eqpath_origin |
116 | 1 | tkerber | else:
|
117 | 1 | tkerber | origin = 1000
|
118 | 1 | tkerber | elif calcutype == 'neInt': |
119 | 1 | tkerber | intrange = intctrl.neintpath |
120 | 1 | tkerber | tol = intctrl.neinttol |
121 | 1 | tkerber | radius = -1
|
122 | 1 | tkerber | origin = 1000
|
123 | 1 | tkerber | elif calcutype == 'locInt': |
124 | 1 | tkerber | intrange = intctrl.locintpath |
125 | 1 | tkerber | tol = intctrl.locinttol |
126 | 1 | tkerber | if hasattr(function.intctrl, 'locpath_radius'): |
127 | 1 | tkerber | radius = function.intctrl.locpath_radius |
128 | 1 | tkerber | else:
|
129 | 1 | tkerber | radius = -1
|
130 | 1 | tkerber | if hasattr(function.intctrl, 'locpath_origin'): |
131 | 1 | tkerber | origin = function.intctrl.locpath_origin |
132 | 1 | tkerber | else:
|
133 | 1 | tkerber | origin = 1000
|
134 | 1 | tkerber | trace = 0
|
135 | 1 | tkerber | a = 0.
|
136 | 1 | tkerber | b = 1.
|
137 | 1 | tkerber | |
138 | 1 | tkerber | #Initialize with 13 function evaluations.
|
139 | 1 | tkerber | c = (a + b) / 2
|
140 | 1 | tkerber | h = (b - a) / 2
|
141 | 1 | tkerber | realmin = 2e-17
|
142 | 1 | tkerber | |
143 | 1 | tkerber | s = [.942882415695480, sqrt(2.0/3), |
144 | 1 | tkerber | .641853342345781, 1/sqrt(5.0), .236383199662150] |
145 | 1 | tkerber | s1 = [0] * len(s) |
146 | 1 | tkerber | s2 = [0] * len(s) |
147 | 1 | tkerber | for i in range(len(s)): |
148 | 1 | tkerber | s1[i] = c - s[i] * h |
149 | 1 | tkerber | s2[i] = c + fliplr(s)[i] * h |
150 | 1 | tkerber | x0 = [a] + s1 + [c] + s2 + [b] |
151 | 1 | tkerber | |
152 | 1 | tkerber | s0 = [.0158271919734802, .094273840218850, .155071987336585, |
153 | 1 | tkerber | .188821573960182, .199773405226859, .224926465333340] |
154 | 1 | tkerber | w0 = s0 + [.242611071901408] + fliplr(s0)
|
155 | 1 | tkerber | w1 = [1, 0, 0, 0, 5, 0, 0, 0, 5, 0, 0, 0, 1] |
156 | 1 | tkerber | w2 = [77, 0, 432, 0, 625, 0, 672, 0, 625, 0, 432, 0, 77] |
157 | 1 | tkerber | for i in range(len(w1)): |
158 | 1 | tkerber | w1[i] = w1[i] / 6.0
|
159 | 1 | tkerber | w2[i] = w2[i] / 1470.0
|
160 | 1 | tkerber | |
161 | 1 | tkerber | dZ = [intrange[:len(intrange) - 1], intrange[1:]] |
162 | 1 | tkerber | hmin = [0] * len(dZ[1]) |
163 | 1 | tkerber | |
164 | 1 | tkerber | path_type = [] |
165 | 1 | tkerber | for i in range(len(intrange) - 1): |
166 | 1 | tkerber | rs = np.abs(dZ[0][i] - origin)
|
167 | 1 | tkerber | re = np.abs(dZ[1][i] - origin)
|
168 | 1 | tkerber | if abs(rs - radius) < 1.0e-8 and abs(re - radius) < 1.0e-8: |
169 | 1 | tkerber | path_type.append('half_circle')
|
170 | 1 | tkerber | else:
|
171 | 1 | tkerber | path_type.append('line')
|
172 | 1 | tkerber | |
173 | 1 | tkerber | for i in range(len(dZ[1])): |
174 | 1 | tkerber | if path_type[i] == 'half_circle': |
175 | 1 | tkerber | dZ[0][i] = 0 |
176 | 1 | tkerber | dZ[1][i] = np.pi
|
177 | 1 | tkerber | for i in range(len(dZ[1])): |
178 | 1 | tkerber | dZ[1][i] = dZ[1][i] - dZ[0][i] |
179 | 1 | tkerber | hmin[i] = realmin / 1024 * abs(dZ[1][i]) |
180 | 1 | tkerber | |
181 | 1 | tkerber | |
182 | 1 | tkerber | temp = np.array([[1] * 13, x0]).transpose() |
183 | 1 | tkerber | |
184 | 1 | tkerber | Zx = np.dot(temp, np.array(dZ)) |
185 | 1 | tkerber | |
186 | 1 | tkerber | Zxx = [] |
187 | 1 | tkerber | for i in range(len(intrange) - 1): |
188 | 1 | tkerber | for j in range(13): |
189 | 1 | tkerber | Zxx.append(Zx[j][i]) |
190 | 1 | tkerber | |
191 | 1 | tkerber | ns = 0
|
192 | 1 | tkerber | ne = 12
|
193 | 1 | tkerber | if path_type[0] == 'line': |
194 | 1 | tkerber | yns = function.calgfunc(Zxx[ns], calcutype) |
195 | 1 | tkerber | elif path_type[0] == 'half_circle': |
196 | 1 | tkerber | energy = origin + radius * np.exp((np.pi - Zxx[ns + i]) * 1.j)
|
197 | 1 | tkerber | yns = -1.j * radius * np.exp(-1.j* Zxx[ns +i])* function.calgfunc(energy, calcutype) |
198 | 1 | tkerber | fcnt = 0
|
199 | 1 | tkerber | |
200 | 1 | tkerber | |
201 | 1 | tkerber | for n in range(len(intrange)-1): |
202 | 1 | tkerber | # below evaluate the integral and adjust the tolerance
|
203 | 1 | tkerber | Q1pQ0 = yns * (w1[0] - w0[0]) |
204 | 1 | tkerber | Q2pQ0 = yns * (w2[0] - w0[0]) |
205 | 1 | tkerber | fcnt = fcnt + 12
|
206 | 1 | tkerber | for i in range(1,12): |
207 | 1 | tkerber | if path_type[n] == 'line': |
208 | 1 | tkerber | yne = function.calgfunc(Zxx[ns + i], calcutype) |
209 | 1 | tkerber | elif path_type[n] == 'half_circle': |
210 | 1 | tkerber | energy = origin + radius * np.exp((np.pi -Zxx[ns + i]) * 1.j)
|
211 | 1 | tkerber | yne = -1.j * radius * np.exp(-1.j * Zxx[ns + i])* function.calgfunc(energy, calcutype) |
212 | 1 | tkerber | Q1pQ0 += yne * (w1[i] - w0[i]) |
213 | 1 | tkerber | Q2pQ0 += yne * (w2[i] - w0[i]) |
214 | 1 | tkerber | |
215 | 1 | tkerber | # Increase the tolerance if refinement appears to be effective
|
216 | 1 | tkerber | r = np.abs(Q2pQ0) / (np.abs(Q1pQ0) + np.abs(realmin)) |
217 | 1 | tkerber | dim = np.product(r.shape) |
218 | 1 | tkerber | r = np.sum(r) / dim |
219 | 1 | tkerber | if r > 0 and r < 1: |
220 | 1 | tkerber | thistol = tol / r |
221 | 1 | tkerber | else:
|
222 | 1 | tkerber | thistol = tol |
223 | 1 | tkerber | if path_type[n] == 'line': |
224 | 1 | tkerber | yne = function.calgfunc(Zxx[ne], calcutype) |
225 | 1 | tkerber | elif path_type[n] == 'half_circle': |
226 | 1 | tkerber | energy = origin + radius * np.exp((np.pi -Zxx[ne]) * 1.j)
|
227 | 1 | tkerber | yne = -1.j * radius * np.exp(-1.j * Zxx[ne])* function.calgfunc(energy, calcutype) |
228 | 1 | tkerber | #Call the recursive core integrator
|
229 | 1 | tkerber | |
230 | 1 | tkerber | Qk, xpk, wpk, fcnt, warn = quadlstep(function, Zxx[ns], |
231 | 1 | tkerber | Zxx[ne], yns, yne, |
232 | 1 | tkerber | thistol, trace, fcnt, |
233 | 1 | tkerber | hmin[n], calcutype, path_type[n], |
234 | 1 | tkerber | origin, radius) |
235 | 1 | tkerber | if n == 0: |
236 | 1 | tkerber | Q = np.copy(Qk) |
237 | 1 | tkerber | Xp = xpk[:] |
238 | 1 | tkerber | Wp = wpk[:] |
239 | 1 | tkerber | else:
|
240 | 1 | tkerber | Q += Qk |
241 | 1 | tkerber | Xp = Xp[:-1] + xpk
|
242 | 1 | tkerber | Wp = Wp[:-1] + [Wp[-1] + wpk[0]] + wpk[1:] |
243 | 1 | tkerber | if warn == 1: |
244 | 1 | tkerber | print 'warning: Minimum step size reached,singularity possible' |
245 | 1 | tkerber | elif warn == 2: |
246 | 1 | tkerber | print 'warning: Maximum function count excced; singularity likely' |
247 | 1 | tkerber | elif warn == 3: |
248 | 1 | tkerber | print 'warning: Infinite or Not-a-Number function value encountered' |
249 | 1 | tkerber | else:
|
250 | 1 | tkerber | pass
|
251 | 1 | tkerber | |
252 | 1 | tkerber | ns += 13
|
253 | 1 | tkerber | ne += 13
|
254 | 1 | tkerber | yns = np.copy(yne) |
255 | 1 | tkerber | |
256 | 1 | tkerber | return Q,Xp,Wp,fcnt
|
257 | 1 | tkerber | |
258 | 1 | tkerber | def quadlstep(f, Za, Zb, fa, fb, tol, trace, fcnt, hmin, calcutype, |
259 | 1 | tkerber | path_type, origin, radius): |
260 | 1 | tkerber | #Gaussian-Lobatto and Kronrod method
|
261 | 1 | tkerber | #QUADLSTEP Recursive core routine for integral
|
262 | 1 | tkerber | #input parameters:
|
263 | 1 | tkerber | # f ---------- function, here we just use the module calgfunc
|
264 | 1 | tkerber | # to return the value, if wanna use it for
|
265 | 1 | tkerber | # another one, change it
|
266 | 1 | tkerber | # Za, Zb ---------- the start and end point of the integral
|
267 | 1 | tkerber | # fa, fb ---------- the function value on Za and Zb
|
268 | 1 | tkerber | # fcnt ---------- the number of the funtion recalled till now
|
269 | 1 | tkerber | #output parameters:
|
270 | 1 | tkerber | # Q ---------- integral
|
271 | 1 | tkerber | # Xp ---------- selected points
|
272 | 1 | tkerber | # Wp ---------- weight
|
273 | 1 | tkerber | # fcnt ---------- the number of the function recalled till now
|
274 | 1 | tkerber | |
275 | 1 | tkerber | maxfcnt = 10000
|
276 | 1 | tkerber | |
277 | 1 | tkerber | # Evaluate integrand five times in interior of subintrval [a,b]
|
278 | 1 | tkerber | Zh = (Zb - Za) / 2.0
|
279 | 1 | tkerber | if abs(Zh) < hmin: |
280 | 1 | tkerber | # Minimun step size reached; singularity possible
|
281 | 1 | tkerber | Q = Zh * (fa + fb) |
282 | 1 | tkerber | if path_type == 'line': |
283 | 1 | tkerber | Xp = [Za, Zb] |
284 | 1 | tkerber | elif path_type == 'half_circle': |
285 | 1 | tkerber | Xp = [origin + radius * np.exp((np.pi - Za) * 1.j),
|
286 | 1 | tkerber | origin + radius * np.exp((np.pi - Zb) * 1.j)]
|
287 | 1 | tkerber | Wp = [Zh, Zh] |
288 | 1 | tkerber | warn = 1
|
289 | 1 | tkerber | return Q, Xp, Wp, fcnt, warn
|
290 | 1 | tkerber | fcnt += 5
|
291 | 1 | tkerber | if fcnt > maxfcnt:
|
292 | 1 | tkerber | #Maximum function count exceed; singularity likely
|
293 | 1 | tkerber | Q = Zh * (fa + fb) |
294 | 1 | tkerber | if path_type == 'line': |
295 | 1 | tkerber | Xp = [Za, Zb] |
296 | 1 | tkerber | elif path_type == 'half_circle': |
297 | 1 | tkerber | Xp = [origin + radius * np.exp((np.pi - Za) * 1.j),
|
298 | 1 | tkerber | origin + radius * np.exp((np.pi - Zb) * 1.j)]
|
299 | 1 | tkerber | Wp = [Zh, Zh] |
300 | 1 | tkerber | warn = 2
|
301 | 1 | tkerber | return Q, Xp, Wp, fcnt, warn
|
302 | 1 | tkerber | x = [0.18350341907227, 0.55278640450004, 1.0, |
303 | 1 | tkerber | 1.44721359549996, 1.81649658092773]; |
304 | 1 | tkerber | Zx = [0] * len(x) |
305 | 1 | tkerber | y = [0] * len(x) |
306 | 1 | tkerber | for i in range(len(x)): |
307 | 1 | tkerber | x[i] *= 0.5
|
308 | 1 | tkerber | Zx[i] = Za + (Zb - Za) * x[i] |
309 | 1 | tkerber | if path_type == 'line': |
310 | 1 | tkerber | y[i] = f.calgfunc(Zx[i], calcutype) |
311 | 1 | tkerber | elif path_type == 'half_circle': |
312 | 1 | tkerber | energy = origin + radius * np.exp((np.pi - Zx[i]) * 1.j)
|
313 | 1 | tkerber | y[i] = f.calgfunc(energy, calcutype) |
314 | 1 | tkerber | #Four point Lobatto quadrature
|
315 | 1 | tkerber | s1 = [1.0, 0.0, 5.0, 0.0, 5.0, 0.0, 1.0] |
316 | 1 | tkerber | s2 = [77.0, 432.0, 625.0, 672.0, 625.0, 432.0, 77.0] |
317 | 1 | tkerber | Wk = [0] * 7 |
318 | 1 | tkerber | Wp = [0] * 7 |
319 | 1 | tkerber | for i in range(7): |
320 | 1 | tkerber | Wk[i] = (Zh / 6.0) * s1[i]
|
321 | 1 | tkerber | Wp[i] = (Zh / 1470.0) * s2[i]
|
322 | 1 | tkerber | if path_type == 'line': |
323 | 1 | tkerber | Xp = [Za] + Zx + [Zb] |
324 | 1 | tkerber | elif path_type == 'half_circle': |
325 | 1 | tkerber | Xp = [Za] + Zx + [Zb] |
326 | 1 | tkerber | for i in range(7): |
327 | 1 | tkerber | factor = -1.j * radius * np.exp(1.j * (np.pi - Xp[i])) |
328 | 1 | tkerber | Wk[i] *= factor |
329 | 1 | tkerber | Wp[i] *= factor |
330 | 1 | tkerber | Xp[i] = origin + radius * np.exp((np.pi - Xp[i]) * 1.j)
|
331 | 1 | tkerber | Qk = fa * Wk[0] + fb * Wk[6] |
332 | 1 | tkerber | Q = fa * Wp[0] + fb * Wp[6] |
333 | 1 | tkerber | for i in range(1, 6): |
334 | 1 | tkerber | Qk += y[i-1] * Wk[i]
|
335 | 1 | tkerber | Q += y[i-1] * Wp[i]
|
336 | 1 | tkerber | if np.isinf(np.max(np.abs(Q))):
|
337 | 1 | tkerber | Q = Zh * (fa + fb) |
338 | 1 | tkerber | if path_type == 'line': |
339 | 1 | tkerber | Xp = [Za, Zb] |
340 | 1 | tkerber | elif path_type == 'half_circle': |
341 | 1 | tkerber | Xp = [origin + radius * np.exp((np.pi - Za) * 1.j),
|
342 | 1 | tkerber | origin + radius * np.exp((np.pi - Zb) * 1.j)]
|
343 | 1 | tkerber | Wp = [Zh, Zh] |
344 | 1 | tkerber | warn = 3
|
345 | 1 | tkerber | return Qk, Xp, Wp, fcnt, warn
|
346 | 1 | tkerber | else:
|
347 | 1 | tkerber | pass
|
348 | 1 | tkerber | if trace:
|
349 | 1 | tkerber | print fcnt, real(Za), imag(Za), abs(Zh) |
350 | 1 | tkerber | #Check accurancy of integral over this subinterval
|
351 | 1 | tkerber | XXk = [Xp[0], Xp[2], Xp[4], Xp[6]] |
352 | 1 | tkerber | WWk = [Wk[0], Wk[2], Wk[4], Wk[6]] |
353 | 1 | tkerber | YYk = [fa, y[1], y[3], fb] |
354 | 1 | tkerber | if np.max(np.abs(Qk - Q)) <= tol:
|
355 | 1 | tkerber | warn = 0
|
356 | 1 | tkerber | return Q, XXk, WWk, fcnt, warn
|
357 | 1 | tkerber | #Subdivide into six subintevals
|
358 | 1 | tkerber | else:
|
359 | 1 | tkerber | Q, Xk, Wk, fcnt, warn = quadlstep(f, Za, Zx[1], fa, YYk[1], |
360 | 1 | tkerber | tol, trace, fcnt, hmin, |
361 | 1 | tkerber | calcutype, path_type, |
362 | 1 | tkerber | origin, radius) |
363 | 1 | tkerber | |
364 | 1 | tkerber | Qk, xkk, wkk, fcnt, warnk = quadlstep(f, Zx[1],
|
365 | 1 | tkerber | Zx[3], YYk[1], YYk[2], tol, trace, fcnt, hmin, |
366 | 1 | tkerber | calcutype, path_type, |
367 | 1 | tkerber | origin, radius) |
368 | 1 | tkerber | Q += Qk |
369 | 1 | tkerber | Xk = Xk[:-1] + xkk
|
370 | 1 | tkerber | Wk = Wk[:-1] + [Wk[-1] + wkk[0]] + wkk[1:] |
371 | 1 | tkerber | warn = max(warn, warnk)
|
372 | 1 | tkerber | |
373 | 1 | tkerber | Qk, xkk, wkk, fcnt, warnk = quadlstep(f, Zx[3], Zb, YYk[2], fb, |
374 | 1 | tkerber | tol, trace, fcnt, hmin, |
375 | 1 | tkerber | calcutype, path_type, |
376 | 1 | tkerber | origin, radius) |
377 | 1 | tkerber | Q += Qk |
378 | 1 | tkerber | Xk = Xk[:-1] + xkk
|
379 | 1 | tkerber | Wk = Wk[:-1] + [Wk[-1] + wkk[0]] + wkk[1:] |
380 | 1 | tkerber | warn = max(warn, warnk)
|
381 | 1 | tkerber | return Q, Xk, Wk, fcnt, warn
|
382 | 1 | tkerber | |
383 | 1 | tkerber | def mytextread0(filename): |
384 | 1 | tkerber | num = 0
|
385 | 1 | tkerber | df = file(filename)
|
386 | 1 | tkerber | df.seek(0)
|
387 | 1 | tkerber | for line in df: |
388 | 1 | tkerber | if num == 0: |
389 | 1 | tkerber | dim = line.strip().split(' ')
|
390 | 1 | tkerber | row = int(dim[0]) |
391 | 1 | tkerber | col = int(dim[1]) |
392 | 1 | tkerber | mat = np.empty([row, col]) |
393 | 1 | tkerber | else:
|
394 | 1 | tkerber | data = line.strip().split(' ')
|
395 | 1 | tkerber | if len(data) == 0 or len(data)== 1: |
396 | 1 | tkerber | break
|
397 | 1 | tkerber | else:
|
398 | 1 | tkerber | for i in range(len(data)): |
399 | 1 | tkerber | mat[num - 1, i] = float(data[i]) |
400 | 1 | tkerber | num += 1
|
401 | 1 | tkerber | return mat
|
402 | 1 | tkerber | |
403 | 1 | tkerber | def mytextread1(filename): |
404 | 1 | tkerber | num = 0
|
405 | 1 | tkerber | df = file(filename)
|
406 | 1 | tkerber | df.seek(0)
|
407 | 1 | tkerber | data = [] |
408 | 1 | tkerber | for line in df: |
409 | 1 | tkerber | tmp = line.strip() |
410 | 1 | tkerber | if len(tmp) != 0: |
411 | 1 | tkerber | data.append(float(tmp))
|
412 | 1 | tkerber | else:
|
413 | 1 | tkerber | break
|
414 | 1 | tkerber | dim = int(sqrt(len(data))) |
415 | 1 | tkerber | mat = np.empty([dim, dim]) |
416 | 1 | tkerber | for i in range(dim): |
417 | 1 | tkerber | for j in range(dim): |
418 | 1 | tkerber | mat[i, j] = data[num] |
419 | 1 | tkerber | num += 1
|
420 | 1 | tkerber | return mat
|
421 | 1 | tkerber | |
422 | 1 | tkerber | def mytextwrite1(filename, mat): |
423 | 1 | tkerber | num = 0
|
424 | 1 | tkerber | df = open(filename,'w') |
425 | 1 | tkerber | df.seek(0)
|
426 | 1 | tkerber | dim = mat.shape[0]
|
427 | 1 | tkerber | if dim != mat.shape[1]: |
428 | 1 | tkerber | print 'matwirte, matrix is not square' |
429 | 1 | tkerber | for i in range(dim): |
430 | 1 | tkerber | for j in range(dim): |
431 | 1 | tkerber | df.write('%20.20e\n'% mat[i, j])
|
432 | 1 | tkerber | df.close() |