Statistiques
| Révision :

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()