File: TRAN_Calc_OneTransmission.c

package info (click to toggle)
openmx 3.2.4.dfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: lenny, squeeze
  • size: 62,572 kB
  • ctags: 2,684
  • sloc: ansic: 130,666; python: 876; makefile: 560; xml: 63; perl: 18; sh: 4
file content (101 lines) | stat: -rw-r--r-- 2,556 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#ifdef nompi
#include "mimic_mpi.h"
#else
#include <mpi.h>
#endif

#include "tran_prototypes.h"
#include "lapack_prototypes.h"

/* 
 * calculate transmission 
 *
 * input: SigmaL, SigmaR, G_CC^R(w)
 *   assuming w= w+i delta 
 *
 *   Gamma(w) = i (Sigma^R(w) - Sigma^A(w))
 * 
 *   T(w) = Trace[ Gamma_L(w) G^R(w) Gamma_R(w) G^A(w) ]
 *
 * work: v1,v2  dcomplex size=nc*nc
 */

void TRAN_Calc_OneTransmission(
   int nc, 
   dcomplex *SigmaL_R,   /* at w, changed when exit */
   dcomplex *SigmaL_A,   /* at w, changed when exit */
   dcomplex *SigmaR_R,   /* at w, changed when exit */
   dcomplex *SigmaR_A,   /* at w, changed when exit */
   dcomplex *GC_R,       /* at w, changed when exit */
   dcomplex *GC_A,       /* at w, changed when exit */
   dcomplex *v1,       /* work */
   dcomplex *v2,       /* work */
   dcomplex *value     /* output, transmission */
)
#define SigmaL_R_ref(i,j) SigmaL_R[nc*((j)-1)+(i)-1]
#define SigmaL_A_ref(i,j) SigmaL_A[nc*((j)-1)+(i)-1]
#define SigmaR_R_ref(i,j) SigmaR_R[nc*((j)-1)+(i)-1]
#define SigmaR_A_ref(i,j) SigmaR_A[nc*((j)-1)+(i)-1]
#define GC_R_ref(i,j)     GC_R[nc*((j)-1)+(i)-1]
#define GC_A_ref(i,j)     GC_A[nc*((j)-1)+(i)-1]
#define v1_ref(i,j)       v1[nc*((j)-1)+(i)-1]
{
  int i,j;
  dcomplex alpha,beta;
  double tmpr,tmpi;

  alpha.r=1.0; alpha.i=0.0;
  beta.r=0.0;  beta.i=0.0;

  /* Gamma_l = i (Sigma_l^R-Sigma_l^A) */
   
  for (j=1; j<=nc; j++) {
    for (i=1; i<=nc; i++) {

      tmpr = -(SigmaL_R_ref(i,j).i - SigmaL_A_ref(i,j).i);
      tmpi =  (SigmaL_R_ref(i,j).r - SigmaL_A_ref(i,j).r);

      SigmaL_R_ref(i,j).r = tmpr;
      SigmaL_R_ref(i,j).i = tmpi;

      tmpr = -(SigmaR_R_ref(i,j).i - SigmaR_A_ref(i,j).i);
      tmpi =  (SigmaR_R_ref(i,j).r - SigmaR_A_ref(i,j).r);

      SigmaR_R_ref(i,j).r = tmpr;
      SigmaR_R_ref(i,j).i = tmpi;
    }
  }

  /* sigma -> gamma */

  /* transmission= tr[GammaL G^R GammaR G^A] */

  /* GammaL * GR */
  F77_NAME(zgemm,ZGEMM)("N","N", &nc,&nc,&nc, &alpha, SigmaL_R, &nc, GC_R, &nc, &beta, v1, &nc );


  /* (GammaL * GR ) * GammaR */
  F77_NAME(zgemm,ZGEMM)("N","N", &nc,&nc,&nc, &alpha, v1, &nc, SigmaR_R, &nc, &beta, v2, &nc );

  /* (GammaL G^R GammaR ) * G^A */

  F77_NAME(zgemm,ZGEMM)("N","N", &nc,&nc,&nc, &alpha, v2, &nc, GC_A, &nc, &beta, v1, &nc );

  value->r=0.0; value->i = 0.0;
  /* trace */
  for (i=1;i<=nc;i++) {

    /*
    printf("i=%2d v1_ref(i,i).r=%15.12f\n",i,v1_ref(i,i).r);
    */

    value->r += v1_ref(i,i).r;
    value->i += v1_ref(i,i).i;
  } 

}