root / ase / transport / tools.py @ 7
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() |