void TRAN_Add_ADensity_Lead( MPI_Comm comm1, int SpinP_switch, int Ngrid1, int Ngrid2, int Ngrid3, int My_NumGridB_AB, double *ADensity_Grid_B) #define grid_e_ref(i,j,k) ( ((i)-l1[0]) *Ngrid2*Ngrid3+(j)*Ngrid3+(k) ) { int side,l1[2],N2D,GNs; int i,j,k,spin,GN,BN_AB; int myid,numprocs; MPI_Comm_size(comm1,&numprocs); MPI_Comm_rank(comm1,&myid); if (myid==Host_ID){ printf("<TRAN_Add_ADensity_Lead>\n"); } /* set N2D and GNs */ N2D = Ngrid1*Ngrid2; GNs = ((myid*N2D+numprocs-1)/numprocs)*Ngrid3; /*********************************************************** add contribution to atomic charge density from electrodes side=0 -> left lead side=1 -> right lead ***********************************************************/ for (side=0; side<=1; side++){ if (side==0){ l1[0] = 0; l1[1] = TRAN_grid_bound[0]; } else{ l1[0] = TRAN_grid_bound[1]; l1[1] = Ngrid1-1; } for (BN_AB=0; BN_AB<My_NumGridB_AB; BN_AB++){ GN = BN_AB + GNs; i = GN/(Ngrid2*Ngrid3); j = (GN - i*Ngrid2*Ngrid3)/Ngrid3; k = GN - i*Ngrid2*Ngrid3 - j*Ngrid3; if ( l1[0]<=i && i<=l1[1] ) { ADensity_Grid_B[BN_AB] += ElectrodeADensity_Grid[side][ grid_e_ref(i,j,k) ]; } } } }
static void TRAN_FFT_Electrode_Grid(MPI_Comm comm1, int isign) /* #define grid_e_ref(i,j,k) ( (i)*Ngrid2*(l3[1]-l3[0]+1)+ (j)*(l3[1]-l3[0]+1) + (k)-l3[0] ) *#define fft2d_ref(i,j) ( (i)*Ngrid2+(j) ) */ { int side; int i,j,k; int l1[2]; #ifdef fftw2 fftwnd_plan p; #else fftw_plan p; #endif fftw_complex *in,*out; double factor; int myid; MPI_Comm_rank(comm1,&myid); if (print_stdout){ printf("TRAN_FFT_Electrode_Grid in\n"); } /* allocation * ElectrodedVHart_Grid_c is a global variable * do not free these */ l1[0]= 0; l1[1]= TRAN_grid_bound[0]; ElectrodedVHart_Grid_c[0]=(dcomplex*)malloc(sizeof(dcomplex)*Ngrid3*Ngrid2*(l1[1]-l1[0]+1) ); /* ElectrodedVHart_Grid_c = Vh_electrode(kx,ky, z=[0:TRAN_grid_bound[0]]), TRAN_grid_bound: integer */ l1[0]= TRAN_grid_bound[1]; l1[1]= Ngrid1-1; ElectrodedVHart_Grid_c[1]=(dcomplex*)malloc(sizeof(dcomplex)*Ngrid3*Ngrid2*(l1[1]-l1[0]+1) ); /* ElectrodedVHart_Grid_c = Vh_electrode(kx,ky, z=[TRAN_grid_bound[1]:Ngrid3-1]), TRAN_grid_bound: integer */ /* allocation for fft , * free these at last */ #ifdef fftw2 in = (fftw_complex*)malloc(sizeof(fftw_complex)*Ngrid3*Ngrid2); out = (fftw_complex*)malloc(sizeof(fftw_complex)*Ngrid3*Ngrid2); #else in = fftw_malloc(sizeof(fftw_complex)*Ngrid3*Ngrid2); out = fftw_malloc(sizeof(fftw_complex)*Ngrid3*Ngrid2); #endif #ifdef fftw2 p=fftw2d_create_plan(Ngrid2,Ngrid3,isign,FFTW_ESTIMATE); #else p=fftw_plan_dft_2d(Ngrid2,Ngrid3,in,out,isign,FFTW_ESTIMATE); #endif /* left side */ side=0; l1[0]= 0; l1[1]= TRAN_grid_bound[0]; factor = 1.0/( (double)(Ngrid2*Ngrid3) ) ; #define grid_e_ref(i,j,k) ( ( (i)-l1[0])*Ngrid2*Ngrid3+(j)*Ngrid3+(k) ) #define fft2d_ref(j,k) ( (j)*Ngrid3+ (k) ) for (i=l1[0];i<=l1[1];i++) { for (j=0;j<Ngrid2;j++){ for (k=0;k<Ngrid3;k++) { #ifdef fftw2 c_re(in[fft2d_ref(j,k)]) = ElectrodedVHart_Grid[side][grid_e_ref(i,j,k)]; c_im(in[fft2d_ref(j,k)]) = 0.0; #else in[fft2d_ref(j,k)][0]= ElectrodedVHart_Grid[side][grid_e_ref(i,j,k)]; in[fft2d_ref(j,k)][1]= 0.0; #endif } } #ifdef fftw2 fftwnd_one(p, in, out); #else fftw_execute(p); #endif for (j=0;j<Ngrid2;j++) { for (k=0;k<Ngrid3;k++) { #ifdef fftw2 ElectrodedVHart_Grid_c[side][grid_e_ref(i,j,k)].r = c_re(out[fft2d_ref(j,k)])*factor; ElectrodedVHart_Grid_c[side][grid_e_ref(i,j,k)].i = c_im(out[fft2d_ref(j,k)])*factor; #else ElectrodedVHart_Grid_c[side][grid_e_ref(i,j,k)].r = out[fft2d_ref(j,k)][0]*factor; ElectrodedVHart_Grid_c[side][grid_e_ref(i,j,k)].i = out[fft2d_ref(j,k)][1]*factor; #endif } } } /* k */ #ifdef DEBUG /*debug*/ { char name[100];int i; double R[4]; for(i=1;i<=3;i++) R[i]=0.0; sprintf(name,"ElectrodedVHart_Grid_c_lr.%d",myid); TRAN_Print_Grid_c(name,"ElectrodedVHart_Grid_c_li", Grid_Origin, gtv, l1[1]-l1[0]+1,Ngrid2, 0, Ngrid3-1, R, ElectrodedVHart_Grid_c[side]); } #endif /* right side */ side=1; l1[0]= TRAN_grid_bound[1]; l1[1]= Ngrid1-1; factor = 1.0/( (double) Ngrid2*Ngrid3 ); for (i=l1[0];i<=l1[1];i++) { for (j=0;j<Ngrid2;j++) { for (k=0;k<Ngrid3;k++) { #ifdef fftw2 c_re(in[fft2d_ref(j,k)]) = ElectrodedVHart_Grid[side][grid_e_ref(i,j,k)]; c_im(in[fft2d_ref(j,k)]) = 0.0; #else in[fft2d_ref(j,k)][0]= ElectrodedVHart_Grid[side][grid_e_ref(i,j,k)]; in[fft2d_ref(j,k)][1]= 0.0; #endif } } #ifdef fftw2 fftwnd_one(p, in, out); #else fftw_execute(p); #endif for (j=0;j<Ngrid2;j++) { for (k=0;k<Ngrid3;k++) { #ifdef fftw2 ElectrodedVHart_Grid_c[side][grid_e_ref(i,j,k)].r = c_re(out[fft2d_ref(j,k)])*factor; ElectrodedVHart_Grid_c[side][grid_e_ref(i,j,k)].i = c_im(out[fft2d_ref(j,k)])*factor; #else ElectrodedVHart_Grid_c[side][grid_e_ref(i,j,k)].r = out[fft2d_ref(j,k)][0]*factor; ElectrodedVHart_Grid_c[side][grid_e_ref(i,j,k)].i = out[fft2d_ref(j,k)][1]*factor; #endif } } } /* k */ #ifdef DEBUG /*debug*/ { char name[100];int i; double R[4]; for(i=1;i<=3;i++) R[i]=0.0; sprintf(name,"ElectrodedVHart_Grid_c_rr.%d",myid); TRAN_Print_Grid_c(name,"ElectrodedVHart_Grid_c_ri", Grid_Origin, gtv,l1[1]-l1[0]+1,Ngrid2, 0, Ngrid3-1, R, ElectrodedVHart_Grid_c[side]); } #endif #ifdef fftw2 fftwnd_destroy_plan(p); #else fftw_destroy_plan(p); #endif #ifdef fftw2 free(out); free(in); #else fftw_free(out); fftw_free(in); #endif if (print_stdout){ printf("TRAN_FFT_Electrode_Grid out\n"); } }