How Can I Vectorize a Computation in a Python Device Simulation Algorithm?

  • Context: Python 
  • Thread starter Thread starter maverick280857
  • Start date Start date
  • Tags Tags
    Python
maverick280857
Messages
1,774
Reaction score
5
Hi,

I am working on a device simulation algorithm, and am implementing it in Python on my laptop that runs Arch Linux. A particular step requires me to perform a computation of the form

[tex]\tilde{G} = G \Sigma_{c}^{in} G^{\dagger}[/tex]

where [itex]G[/itex] and [itex]\Sigma_{c}^{in}[/itex] are both [itex]N \times N[/itex] matrices, and [itex]\Sigma_{c}^{in}[/itex] is in fact a diagonal matrix.

N is of the order of 5040

Now, if I do this naively, the command to do it in Python is

Code:
Gtilde_n = Gtilde_n + dot( dot(G, sigcIn), conjugate(transpose(G)) )

(The addition is for purposes of sub-band summation, and isn't relevant to the question I'm posing.)

but this takes about 2 hours when it works (sometimes it just crashes my laptop).

Now if I utilize the fact that [itex]\Sigma_{c}^{in}[/itex] is diagonal, then I can do something more naive and write a for loop of the form

Code:
              for row in range(0,N):
                      for col in range(0,N):
                              sum = 0
                              for alpha in range(0,N):
                                      sum = sum + G[row,alpha]*sigcIn[alpha,alpha]*conjugate(G[col,alpha])
                              Gtilde_n[row,col] = Gtilde_n[row,col] + sum

But this doesn't look like a nice piece of code: it has 3 nested for loops, and looks a rather ancient way of doing the following calculation

[tex]\tilde{G}_{ij} = \sum_{\alpha}\sum_{\beta} G_{i\alpha}(\Sigma_{c}^{in})_{\alpha\beta}(G^{\dagger})_{\beta j} = \sum_{\alpha,\beta} G_{i\alpha}(\Sigma_{c}^{in})_{\alpha\alpha}\delta_{\alpha\beta} (G^{\dagger})_{\beta j} =\sum_{\alpha} G_{i\alpha}(\Sigma_{c}^{in})_{\alpha\alpha}G^{*}_{j\alpha}[/tex]

Is there some way to vectorize this?

In general, is there a better way to perform this computation?
 
Last edited:
on Phys.org
maverick280857 said:
[tex]G_{ij} = \cdots = \sum_{\alpha} G_{i\alpha}(\Sigma_{c}^{in})_{\alpha\alpha}G^{*}_{j\alpha}[/tex]

maverick280857 said:
Is there some way to vectorize this?

Trivially by partioning α's range for each ij, but I would rather try to exploit this
[tex]G_{i\alpha} G^{*}_{j\alpha} = \left(G_{j\alpha} G^{*}_{i\alpha}\right)^{*}[/tex] or/and(given Σ is real, what I suspect) premultiplying all [itex](G_{i})_{\alpha}[/itex] vectors component-wise by a vector made of the Σ diag components. That could well be done in parallel.

maverick280857 said:
In general, is there a better way to perform this computation?
Are there any known algebraic constraints on [itex]G[/itex]?
 
Last edited:
Thanks for your reply.

Solkar said:
Are there any known algebraic constraints on [itex]G[/itex]?

No, its just the matrix representation of a Green's function.
 
What does this notation mean - [itex]\Sigma_{c}^{in}[/itex]?

You said that it was a diagonal matrix, but I'm curious about the significance of c and in.
 
maverick280857 said:
No, its just the matrix representation of a Green's function.

You're sure there's no constraint related to its eigenspaces?
 
Last edited:
Mark44 said:
What does this notation mean - [itex]\Sigma_{c}^{in}[/itex]?

You said that it was a diagonal matrix, but I'm curious about the significance of c and in.

So [itex]\Sigma_{c}^{in} = \Sigma_{1}^{in} + \Sigma_{2}^{in}[/itex] is simply the sum of two so called inscattering matrices, computed from the self-energy in a many body problem. There are two terms because there are two contacts. For each contact,

[tex]\Sigma_{k}^{in} = f(E)\Gamma_k[/tex]

k = 1, 2, and

[tex]\Gamma_k = i[\Sigma_k - \Sigma_k^\dagger][/tex]

It turns out that [tex]\Gamma_i[/itex] is a real matrix, i.e. all its elements are real.[/tex]
 

Similar threads

  • · Replies 0 ·
Replies
0
Views
2K
  • · Replies 3 ·
Replies
3
Views
3K
  • · Replies 2 ·
Replies
2
Views
3K
  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 6 ·
Replies
6
Views
6K
  • · Replies 8 ·
Replies
8
Views
2K
  • · Replies 1 ·
Replies
1
Views
2K
  • · Replies 16 ·
Replies
16
Views
4K
Replies
3
Views
5K
  • · Replies 17 ·
Replies
17
Views
3K