Skip to content

Instantly share code, notes, and snippets.

@Ncmexp2717
Last active December 2, 2020 15:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Ncmexp2717/4a669c843f5a118ca87c65a2a98b5357 to your computer and use it in GitHub Desktop.
Save Ncmexp2717/4a669c843f5a118ca87c65a2a98b5357 to your computer and use it in GitHub Desktop.
A correction about sawtooth potential for electric fields
/**********************************************************************
Force.c:
Force.c is a subroutine to calculate force on atoms.
Log of Force.c:
22/Nov/2001 Released by T. Ozaki
18/Apr/2013 Force3() modified by A.M. Ito
2/Nov./2020 Modified by N. Yamaguchi for a correction
about sawtooth potential for electric fields
***********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include "openmx_common.h"
#include "mpi.h"
#include <omp.h>
#define measure_time 0
static void dH_U_full(int Mc_AN, int h_AN, int q_AN,
double *****OLP, double ****v_eff,
double ***Hx, double ***Hy, double ***Hz);
static void dH_U_NC_full(int Mc_AN, int h_AN, int q_AN,
double *****OLP, dcomplex *****NC_v_eff,
dcomplex ****Hx, dcomplex ****Hy, dcomplex ****Hz);
static void dHNL(int where_flag,
int Mc_AN, int h_AN, int q_AN,
double ******DS_NL1,
dcomplex ***Hx, dcomplex ***Hy, dcomplex ***Hz);
static void dHVNA(int where_flag, int Mc_AN, int h_AN, int q_AN,
Type_DS_VNA *****DS_VNA1,
double *****TmpHVNA2, double *****TmpHVNA3,
double **Hx, double **Hy, double **Hz);
static void dHNL_SO(
double *sumx0r,
double *sumy0r,
double *sumz0r,
double *sumx1r,
double *sumy1r,
double *sumz1r,
double *sumx2r,
double *sumy2r,
double *sumz2r,
double *sumx0i,
double *sumy0i,
double *sumz0i,
double *sumx1i,
double *sumy1i,
double *sumz1i,
double *sumx2i,
double *sumy2i,
double *sumz2i,
double fugou,
double PFp,
double PFm,
double ene_p,
double ene_m,
int l2, int *l,
int Mc_AN, int k, int m,
int Mj_AN, int kl, int n,
double ******DS_NL1);
static void dHCH(int where_flag,
int Mc_AN, int h_AN, int q_AN,
double *****OLP1,
dcomplex ***Hx, dcomplex ***Hy, dcomplex ***Hz);
static void dHCH_SO(double *sumx0r, double *sumx0i, double *sumy0r, double *sumy0i, double *sumz0r, double *sumz0i,
double *sumx1r, double *sumx1i, double *sumy1r, double *sumy1i, double *sumz1r, double *sumz1i,
double *sumx2r, double *sumx2i, double *sumy2r, double *sumy2i, double *sumz2r, double *sumz2i,
double fugou,
int Mc_AN, int k, int m,
int Mj_AN, int kl, int n,
int kg, int wakg,
double penalty_value,
double *****OLP1);
static void MPI_OLP(double *****OLP1);
static void Force3();
static void Force4();
static void Force4B(double *****CDM0);
static void Force_HNL(double *****CDM0, double *****iDM0);
static void Force_CoreHole(double *****CDM0, double *****iDM0);
double Force(double *****H0,
double ******DS_NL,
double *****OLP,
double *****CDM,
double *****EDM)
{
static int firsttime=1;
int Nc,GNc,GRc,Cwan,s1,s2,BN_AB;
int Mc_AN,Gc_AN,MNc,start_q_AN;
double x,y,z,dx,dy,dz,tmp0,tmp1,tmp2,tmp3;
double xx,r2,tot_den;
double sumx,sumy,sumz,r,dege,pref;
int i,j,k,l,Hwan,Qwan,so,p0,q,q0;
int h_AN,Gh_AN,q_AN,Gq_AN;
int ian,jan,kl,spin,spinmax,al,be,p,size_CDM0,size_iDM0;
int tno0,tno1,tno2,Mh_AN,Mq_AN,n,num,size1,size2;
int wanA,wanB,Gc_BN;
int XC_P_switch;
double time0;
double dum,dge;
double dEx,dEy,dEz;
double Cxyz[4];
double *Fx,*Fy,*Fz;
dcomplex ***Hx;
dcomplex ***Hy;
dcomplex ***Hz;
double ***HUx;
double ***HUy;
double ***HUz;
dcomplex ****NC_HUx;
dcomplex ****NC_HUy;
dcomplex ****NC_HUz;
double **HVNAx;
double **HVNAy;
double **HVNAz;
double *****CDM0;
double *****iDM0;
double *tmp_array;
double *tmp_array2;
double Re00x,Re00y,Re00z;
double Re11x,Re11y,Re11z;
double Re01x,Re01y,Re01z;
double Im00x,Im00y,Im00z;
double Im11x,Im11y,Im11z;
double Im01x,Im01y,Im01z;
int *Snd_CDM0_Size,*Rcv_CDM0_Size;
int *Snd_iDM0_Size,*Rcv_iDM0_Size;
double TStime,TEtime;
int numprocs,myid,tag=999,ID,IDS,IDR;
double Stime_atom, Etime_atom;
/* for OpenMP */
int OMPID,Nthrds,Nprocs;
double stime,etime;
MPI_Status stat;
MPI_Request request;
/* MPI */
MPI_Comm_size(mpi_comm_level1,&numprocs);
MPI_Comm_rank(mpi_comm_level1,&myid);
MPI_Barrier(mpi_comm_level1);
dtime(&TStime);
/****************************************************
allocation of arrays:
****************************************************/
Fx = (double*)malloc(sizeof(double)*(Matomnum+1));
Fy = (double*)malloc(sizeof(double)*(Matomnum+1));
Fz = (double*)malloc(sizeof(double)*(Matomnum+1));
HVNAx = (double**)malloc(sizeof(double*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
HVNAx[j] = (double*)malloc(sizeof(double)*List_YOUSO[7]);
}
HVNAy = (double**)malloc(sizeof(double*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
HVNAy[j] = (double*)malloc(sizeof(double)*List_YOUSO[7]);
}
HVNAz = (double**)malloc(sizeof(double*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
HVNAz[j] = (double*)malloc(sizeof(double)*List_YOUSO[7]);
}
/* CDM0 */
size_CDM0 = 0;
CDM0 = (double*****)malloc(sizeof(double****)*(SpinP_switch+1));
for (k=0; k<=SpinP_switch; k++){
CDM0[k] = (double****)malloc(sizeof(double***)*(Matomnum+MatomnumF+1));
FNAN[0] = 0;
for (Mc_AN=0; Mc_AN<=(Matomnum+MatomnumF); Mc_AN++){
if (Mc_AN==0){
Gc_AN = 0;
tno0 = 1;
}
else{
Gc_AN = F_M2G[Mc_AN];
Cwan = WhatSpecies[Gc_AN];
tno0 = Spe_Total_CNO[Cwan];
}
CDM0[k][Mc_AN] = (double***)malloc(sizeof(double**)*(FNAN[Gc_AN]+1));
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
if (Mc_AN==0){
tno1 = 1;
}
else{
Gh_AN = natn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
tno1 = Spe_Total_CNO[Hwan];
}
CDM0[k][Mc_AN][h_AN] = (double**)malloc(sizeof(double*)*tno0);
for (i=0; i<tno0; i++){
CDM0[k][Mc_AN][h_AN][i] = (double*)malloc(sizeof(double)*tno1);
size_CDM0 += tno1;
}
}
}
}
Snd_CDM0_Size = (int*)malloc(sizeof(int)*numprocs);
Rcv_CDM0_Size = (int*)malloc(sizeof(int)*numprocs);
/* iDM0 */
if ( SO_switch==1 || (Hub_U_switch==1 && SpinP_switch==3) || 1<=Constraint_NCS_switch
|| Zeeman_NCS_switch==1 || Zeeman_NCO_switch==1 ){
size_iDM0 = 0;
iDM0 = (double*****)malloc(sizeof(double****)*2);
for (k=0; k<2; k++){
iDM0[k] = (double****)malloc(sizeof(double***)*(Matomnum+MatomnumF+1));
FNAN[0] = 0;
for (Mc_AN=0; Mc_AN<=(Matomnum+MatomnumF); Mc_AN++){
if (Mc_AN==0){
Gc_AN = 0;
tno0 = 1;
}
else{
Gc_AN = F_M2G[Mc_AN];
Cwan = WhatSpecies[Gc_AN];
tno0 = Spe_Total_CNO[Cwan];
}
iDM0[k][Mc_AN] = (double***)malloc(sizeof(double**)*(FNAN[Gc_AN]+1));
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
if (Mc_AN==0){
tno1 = 1;
}
else{
Gh_AN = natn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
tno1 = Spe_Total_CNO[Hwan];
}
iDM0[k][Mc_AN][h_AN] = (double**)malloc(sizeof(double*)*tno0);
for (i=0; i<tno0; i++){
iDM0[k][Mc_AN][h_AN][i] = (double*)malloc(sizeof(double)*tno1);
size_iDM0 += tno1;
}
}
}
}
Snd_iDM0_Size = (int*)malloc(sizeof(int)*numprocs);
Rcv_iDM0_Size = (int*)malloc(sizeof(int)*numprocs);
}
/****************************************************
PrintMemory
****************************************************/
if (firsttime) {
PrintMemory("Force: Hx",sizeof(dcomplex)*List_YOUSO[7]*List_YOUSO[7],NULL);
PrintMemory("Force: Hy",sizeof(dcomplex)*List_YOUSO[7]*List_YOUSO[7],NULL);
PrintMemory("Force: Hz",sizeof(dcomplex)*List_YOUSO[7]*List_YOUSO[7],NULL);
PrintMemory("Force: CDM0",sizeof(double)*size_CDM0,NULL);
if ( SO_switch==1 || (Hub_U_switch==1 && SpinP_switch==3) || 1<=Constraint_NCS_switch
|| Zeeman_NCS_switch==1 || Zeeman_NCO_switch==1){
PrintMemory("Force: iDM0",sizeof(double)*size_iDM0,NULL);
}
firsttime=0;
}
/****************************************************
CDM to CDM0
****************************************************/
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
Gc_AN = M2G[Mc_AN];
Cwan = WhatSpecies[Gc_AN];
tno1 = Spe_Total_CNO[Cwan];
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
Gh_AN = natn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
tno2 = Spe_Total_CNO[Hwan];
for (spin=0; spin<=SpinP_switch; spin++){
for (i=0; i<tno1; i++){
for (j=0; j<tno2; j++){
CDM0[spin][Mc_AN][h_AN][i][j] = CDM[spin][Mc_AN][h_AN][i][j];
}
}
}
}
}
/****************************************************
iDM to iDM0
****************************************************/
if ( SO_switch==1 || (Hub_U_switch==1 && F_U_flag==1 && SpinP_switch==3) || 1<=Constraint_NCS_switch
|| Zeeman_NCS_switch==1 || Zeeman_NCO_switch==1){
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
Gc_AN = M2G[Mc_AN];
Cwan = WhatSpecies[Gc_AN];
tno1 = Spe_Total_CNO[Cwan];
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
Gh_AN = natn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
tno2 = Spe_Total_CNO[Hwan];
for (i=0; i<tno1; i++){
for (j=0; j<tno2; j++){
iDM0[0][Mc_AN][h_AN][i][j] = iDM[0][0][Mc_AN][h_AN][i][j];
iDM0[1][Mc_AN][h_AN][i][j] = iDM[0][1][Mc_AN][h_AN][i][j];
}
}
}
}
}
/****************************************************
MPI:
CDM0
****************************************************/
/***********************************
set data size
************************************/
for (ID=0; ID<numprocs; ID++){
IDS = (myid + ID) % numprocs;
IDR = (myid - ID + numprocs) % numprocs;
if (ID!=0){
tag = 999;
/* find data size to send block data */
if (F_Snd_Num[IDS]!=0){
size1 = 0;
for (spin=0; spin<=SpinP_switch; spin++){
for (n=0; n<F_Snd_Num[IDS]; n++){
Mc_AN = Snd_MAN[IDS][n];
Gc_AN = Snd_GAN[IDS][n];
Cwan = WhatSpecies[Gc_AN];
tno1 = Spe_Total_CNO[Cwan];
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
Gh_AN = natn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
tno2 = Spe_Total_CNO[Hwan];
for (i=0; i<tno1; i++){
for (j=0; j<tno2; j++){
size1++;
}
}
}
}
}
Snd_CDM0_Size[IDS] = size1;
MPI_Isend(&size1, 1, MPI_INT, IDS, tag, mpi_comm_level1, &request);
}
else{
Snd_CDM0_Size[IDS] = 0;
}
/* receiving of size of data */
if (F_Rcv_Num[IDR]!=0){
MPI_Recv(&size2, 1, MPI_INT, IDR, tag, mpi_comm_level1, &stat);
Rcv_CDM0_Size[IDR] = size2;
}
else{
Rcv_CDM0_Size[IDR] = 0;
}
if (F_Snd_Num[IDS]!=0) MPI_Wait(&request,&stat);
}
else{
Snd_CDM0_Size[IDS] = 0;
Rcv_CDM0_Size[IDR] = 0;
}
}
/***********************************
data transfer
************************************/
tag = 999;
for (ID=0; ID<numprocs; ID++){
IDS = (myid + ID) % numprocs;
IDR = (myid - ID + numprocs) % numprocs;
if (ID!=0){
/*****************************
sending of data
*****************************/
if (F_Snd_Num[IDS]!=0){
size1 = Snd_CDM0_Size[IDS];
/* allocation of array */
tmp_array = (double*)malloc(sizeof(double)*size1);
/* multidimentional array to vector array */
num = 0;
for (spin=0; spin<=SpinP_switch; spin++){
for (n=0; n<F_Snd_Num[IDS]; n++){
Mc_AN = Snd_MAN[IDS][n];
Gc_AN = Snd_GAN[IDS][n];
Cwan = WhatSpecies[Gc_AN];
tno1 = Spe_Total_CNO[Cwan];
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
Gh_AN = natn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
tno2 = Spe_Total_CNO[Hwan];
for (i=0; i<tno1; i++){
for (j=0; j<tno2; j++){
tmp_array[num] = CDM[spin][Mc_AN][h_AN][i][j];
num++;
}
}
}
}
}
MPI_Isend(&tmp_array[0], size1, MPI_DOUBLE, IDS, tag, mpi_comm_level1, &request);
}
/*****************************
receiving of block data
*****************************/
if (F_Rcv_Num[IDR]!=0){
size2 = Rcv_CDM0_Size[IDR];
/* allocation of array */
tmp_array2 = (double*)malloc(sizeof(double)*size2);
MPI_Recv(&tmp_array2[0], size2, MPI_DOUBLE, IDR, tag, mpi_comm_level1, &stat);
num = 0;
for (spin=0; spin<=SpinP_switch; spin++){
Mc_AN = F_TopMAN[IDR] - 1;
for (n=0; n<F_Rcv_Num[IDR]; n++){
Mc_AN++;
Gc_AN = Rcv_GAN[IDR][n];
Cwan = WhatSpecies[Gc_AN];
tno1 = Spe_Total_CNO[Cwan];
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
Gh_AN = natn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
tno2 = Spe_Total_CNO[Hwan];
for (i=0; i<tno1; i++){
for (j=0; j<tno2; j++){
CDM0[spin][Mc_AN][h_AN][i][j] = tmp_array2[num];
num++;
}
}
}
}
}
/* freeing of array */
free(tmp_array2);
}
if (F_Snd_Num[IDS]!=0){
MPI_Wait(&request,&stat);
free(tmp_array); /* freeing of array */
}
}
}
/****************************************************
MPI:
iDM0
****************************************************/
if ( SO_switch==1 || (Hub_U_switch==1 && F_U_flag==1 && SpinP_switch==3) || 1<=Constraint_NCS_switch
|| Zeeman_NCS_switch==1 || Zeeman_NCO_switch==1){
/***********************************
set data size
************************************/
for (ID=0; ID<numprocs; ID++){
IDS = (myid + ID) % numprocs;
IDR = (myid - ID + numprocs) % numprocs;
if (ID!=0){
tag = 999;
/* find data size to send block data */
if (F_Snd_Num[IDS]!=0){
size1 = 0;
for (so=0; so<2; so++){
for (n=0; n<F_Snd_Num[IDS]; n++){
Mc_AN = Snd_MAN[IDS][n];
Gc_AN = Snd_GAN[IDS][n];
Cwan = WhatSpecies[Gc_AN];
tno1 = Spe_Total_CNO[Cwan];
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
Gh_AN = natn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
tno2 = Spe_Total_CNO[Hwan];
for (i=0; i<tno1; i++){
for (j=0; j<tno2; j++){
size1++;
}
}
}
}
}
Snd_iDM0_Size[IDS] = size1;
MPI_Isend(&size1, 1, MPI_INT, IDS, tag, mpi_comm_level1, &request);
}
else{
Snd_iDM0_Size[IDS] = 0;
}
/* receiving of size of data */
if (F_Rcv_Num[IDR]!=0){
MPI_Recv(&size2, 1, MPI_INT, IDR, tag, mpi_comm_level1, &stat);
Rcv_iDM0_Size[IDR] = size2;
}
else{
Rcv_iDM0_Size[IDR] = 0;
}
if (F_Snd_Num[IDS]!=0) MPI_Wait(&request,&stat);
}
else{
Snd_iDM0_Size[IDS] = 0;
Rcv_iDM0_Size[IDR] = 0;
}
}
/***********************************
data transfer
************************************/
tag = 999;
for (ID=0; ID<numprocs; ID++){
IDS = (myid + ID) % numprocs;
IDR = (myid - ID + numprocs) % numprocs;
if (ID!=0){
/*****************************
sending of data
*****************************/
if (F_Snd_Num[IDS]!=0){
size1 = Snd_iDM0_Size[IDS];
/* allocation of array */
tmp_array = (double*)malloc(sizeof(double)*size1);
/* multidimentional array to vector array */
num = 0;
for (so=0; so<2; so++){
for (n=0; n<F_Snd_Num[IDS]; n++){
Mc_AN = Snd_MAN[IDS][n];
Gc_AN = Snd_GAN[IDS][n];
Cwan = WhatSpecies[Gc_AN];
tno1 = Spe_Total_CNO[Cwan];
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
Gh_AN = natn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
tno2 = Spe_Total_CNO[Hwan];
for (i=0; i<tno1; i++){
for (j=0; j<tno2; j++){
tmp_array[num] = iDM[0][so][Mc_AN][h_AN][i][j];
num++;
}
}
}
}
}
MPI_Isend(&tmp_array[0], size1, MPI_DOUBLE, IDS, tag, mpi_comm_level1, &request);
}
/*****************************
receiving of block data
*****************************/
if (F_Rcv_Num[IDR]!=0){
size2 = Rcv_iDM0_Size[IDR];
/* allocation of array */
tmp_array2 = (double*)malloc(sizeof(double)*size2);
MPI_Recv(&tmp_array2[0], size2, MPI_DOUBLE, IDR, tag, mpi_comm_level1, &stat);
num = 0;
for (so=0; so<2; so++){
Mc_AN = F_TopMAN[IDR] - 1;
for (n=0; n<F_Rcv_Num[IDR]; n++){
Mc_AN++;
Gc_AN = Rcv_GAN[IDR][n];
Cwan = WhatSpecies[Gc_AN];
tno1 = Spe_Total_CNO[Cwan];
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
Gh_AN = natn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
tno2 = Spe_Total_CNO[Hwan];
for (i=0; i<tno1; i++){
for (j=0; j<tno2; j++){
iDM0[so][Mc_AN][h_AN][i][j] = tmp_array2[num];
num++;
}
}
}
}
}
/* freeing of array */
free(tmp_array2);
}
if (F_Snd_Num[IDS]!=0){
MPI_Wait(&request,&stat);
free(tmp_array); /* freeing of array */
}
}
}
} /* if ( SO_switch==1 || (Hub_U_switch==1 && F_U_flag==1 && SpinP_switch==3)
|| 1<=Constraint_NCS_switch || Zeeman_NCS_switch==1 || Zeeman_NCO_switch==1) */
/****************************************************
#1 of force
-\int \delta V_H drho_a/dx dr
and
force induced from PCC
+\int V_XC drho_pcc/dx dr
****************************************************/
if (myid==Host_ID && 0<level_stdout){
printf(" Force calculation #1\n");fflush(stdout);
}
dtime(&stime);
/*********************************************************
set RefVxc_Grid, where the CA-LDA exchange-correlation
functional is alway used.
*********************************************************/
XC_P_switch = 1;
for (BN_AB=0; BN_AB<My_NumGridB_AB; BN_AB++){
tot_den = ADensity_Grid_B[BN_AB] + ADensity_Grid_B[BN_AB];
if (PCC_switch==1) {
tot_den += PCCDensity_Grid_B[0][BN_AB] + PCCDensity_Grid_B[1][BN_AB];
}
RefVxc_Grid_B[BN_AB] = XC_Ceperly_Alder(tot_den,XC_P_switch);
}
Data_Grid_Copy_B2C_1( RefVxc_Grid_B, RefVxc_Grid );
Data_Grid_Copy_B2C_1( dVHart_Grid_B, dVHart_Grid );
Data_Grid_Copy_B2C_2( Vxc_Grid_B, Vxc_Grid );
Data_Grid_Copy_B2C_2( Density_Grid_B, Density_Grid );
#pragma omp parallel shared(myid,Spe_OpenCore_flag,Spe_Atomic_PCC,Spe_VPS_RV,Spe_VPS_XV,Spe_Num_Mesh_VPS,Spe_PAO_RV,Spe_Atomic_Den,Spe_PAO_XV,Spe_Num_Mesh_PAO,time_per_atom,level_stdout,GridVol,Vxc_Grid,RefVxc_Grid,SpinP_switch,F_Vxc_flag,PCC_switch,dVHart_Grid,F_dVHart_flag,Gxyz,atv,MGridListAtom,CellListAtom,GridListAtom,GridN_Atom,WhatSpecies,M2G,Matomnum) private(OMPID,Nthrds,Nprocs,Mc_AN,Stime_atom,Etime_atom,Gc_AN,Cwan,sumx,sumy,sumz,Nc,GNc,GRc,MNc,Cxyz,x,y,z,dx,dy,dz,r,r2,tmp0,tmp1,tmp2,xx)
{
/* get info. on OpenMP */
OMPID = omp_get_thread_num();
Nthrds = omp_get_num_threads();
Nprocs = omp_get_num_procs();
for (Mc_AN=(OMPID*Matomnum/Nthrds+1); Mc_AN<((OMPID+1)*Matomnum/Nthrds+1); Mc_AN++){
dtime(&Stime_atom);
Gc_AN = M2G[Mc_AN];
Cwan = WhatSpecies[Gc_AN];
sumx = 0.0;
sumy = 0.0;
sumz = 0.0;
for (Nc=0; Nc<GridN_Atom[Gc_AN]; Nc++){
GNc = GridListAtom[Mc_AN][Nc];
GRc = CellListAtom[Mc_AN][Nc];
MNc = MGridListAtom[Mc_AN][Nc];
Get_Grid_XYZ(GNc,Cxyz);
x = Cxyz[1] + atv[GRc][1];
y = Cxyz[2] + atv[GRc][2];
z = Cxyz[3] + atv[GRc][3];
dx = Gxyz[Gc_AN][1] - x;
dy = Gxyz[Gc_AN][2] - y;
dz = Gxyz[Gc_AN][3] - z;
r2 = dx*dx + dy*dy + dz*dz;
r = sqrt(r2);
xx = 0.5*log(r2);
/* for empty atoms */
if (r<1.0e-10) r = 1.0e-10;
if (1.0e-14<r){
tmp0 = Dr_KumoF( Spe_Num_Mesh_PAO[Cwan], xx, r,
Spe_PAO_XV[Cwan], Spe_PAO_RV[Cwan], Spe_Atomic_Den[Cwan]);
tmp1 = dVHart_Grid[MNc]*tmp0/r*F_dVHart_flag;
sumx += tmp1*dx;
sumy += tmp1*dy;
sumz += tmp1*dz;
/* contribution of Exc^(0) */
tmp1 = RefVxc_Grid[MNc]*tmp0/r*F_Vxc_flag;
sumx += tmp1*dx;
sumy += tmp1*dy;
sumz += tmp1*dz;
/* Added by N. Yamaguchi ***/
if (E_Field_switch==1){
tmp1=VEF_Grid[MNc]*tmp0/r*F_VEF_flag;
sumx+=tmp1*dx;
sumy+=tmp1*dy;
sumz+=tmp1*dz;
}
/* ***/
/* partial core correction */
if (PCC_switch==1){
tmp0 = 0.5*F_Vxc_flag*Dr_KumoF( Spe_Num_Mesh_VPS[Cwan], xx, r,
Spe_VPS_XV[Cwan], Spe_VPS_RV[Cwan], Spe_Atomic_PCC[Cwan]);
if (SpinP_switch==0){
tmp2 = 2.0*Vxc_Grid[0][MNc];
}
else {
if (Spe_OpenCore_flag[Cwan]==0){
tmp2 = Vxc_Grid[0][MNc] + Vxc_Grid[1][MNc];
}
else if (Spe_OpenCore_flag[Cwan]==1){
tmp2 = 2.0*Vxc_Grid[0][MNc];
}
else if (Spe_OpenCore_flag[Cwan]==-1){
tmp2 = 2.0*Vxc_Grid[1][MNc];
}
}
tmp1 = tmp2*tmp0/r;
sumx -= tmp1*dx;
sumy -= tmp1*dy;
sumz -= tmp1*dz;
/* contribution of Exc^(0) */
tmp2 = 2.0*RefVxc_Grid[MNc];
tmp1 = tmp2*tmp0/r;
sumx += tmp1*dx;
sumy += tmp1*dy;
sumz += tmp1*dz;
}
}
}
Gxyz[Gc_AN][17] = -sumx*GridVol;
Gxyz[Gc_AN][18] = -sumy*GridVol;
Gxyz[Gc_AN][19] = -sumz*GridVol;
if (2<=level_stdout){
printf("<Force> force(1) myid=%2d Mc_AN=%2d Gc_AN=%2d %15.12f %15.12f %15.12f\n",
myid,Mc_AN,Gc_AN,-sumx*GridVol,-sumy*GridVol,-sumz*GridVol);fflush(stdout);
}
dtime(&Etime_atom);
time_per_atom[Gc_AN] += Etime_atom - Stime_atom;
}
} /* #pragma omp parallel */
dtime(&etime);
if(myid==0 && measure_time){
printf("Time for force#1=%18.5f\n",etime-stime);fflush(stdout);
}
/****************************************************
added by T.Ohwaki
#1' of force
contribution from an artificial wall applied
in the ESM method so that atoms cannot go beyond
the boundary of the unit cell along the a-axis.
****************************************************/
if (ESM_switch!=0){
double fx,xb,x0,x,a;
/* modified by AdvanceSoft */
xb = Grid_Origin[ESM_direction] + tv[1][ESM_direction];
a = ESM_wall_height/pow(1.89,3.0);
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
Gc_AN = M2G[Mc_AN];
x = Gxyz[Gc_AN][ESM_direction];
x0 = xb - ESM_wall_position;
dx = x - x0;
if (0.0<dx){
fx = 3.0*a*dx*dx;
}
else {
fx = 0.0;
}
Gxyz[Gc_AN][16+ESM_direction] += fx;
/*
printf("Gc_AN=%2d fx=%15.12f\n",Gc_AN,fx);fflush(stdout);
*/
/* add an artifical force if required. */
if(Arti_Force==1){
if(Gc_AN==1) Gxyz[1][16+ESM_direction] += Arti_Grad;
if(myid==0) printf(" adding force at the proc. 'Force #1' \n");
}
}
}
/****************************************************
contraction
H0
OLP
****************************************************/
MPI_Barrier(mpi_comm_level1);
if (Cnt_switch==1){
Cont_Matrix0(H0[0],CntH0[0]);
Cont_Matrix0(H0[1],CntH0[1]);
Cont_Matrix0(H0[2],CntH0[2]);
Cont_Matrix0(H0[3],CntH0[3]);
Cont_Matrix0(OLP[0],CntOLP[0]);
Cont_Matrix0(OLP[1],CntOLP[1]);
Cont_Matrix0(OLP[2],CntOLP[2]);
Cont_Matrix0(OLP[3],CntOLP[3]);
}
if ( Hub_U_switch==1 && Hub_U_occupation==1 ){
MPI_OLP(OLP);
}
MPI_Barrier(mpi_comm_level1);
/****************************************************
#2 of force
kinetic operator and contribution from the Hubbard
term with the full representation in calculating
the occupation number
****************************************************/
dtime(&stime);
if (myid==Host_ID && 0<level_stdout){
printf(" Force calculation #2\n");fflush(stdout);
}
#pragma omp parallel shared(time_per_atom,Gxyz,myid,level_stdout,iDM0,CDM0,CntH0,H0,F_Kin_flag,NC_v_eff,v_eff,OLP,Hub_U_occupation,Cnt_switch,F_NL_flag,List_YOUSO,RMI1,Zeeman_NCO_switch,Zeeman_NCS_switch,Constraint_NCS_switch,F_U_flag,Hub_U_switch,SO_switch,SpinP_switch,Spe_Total_CNO,F_G2M,natn,FNAN,WhatSpecies,M2G,Matomnum) private(OMPID,Nthrds,Nprocs,Mc_AN,Stime_atom,Etime_atom,Gc_AN,Cwan,dEx,dEy,dEz,h_AN,Gh_AN,Mh_AN,Hwan,ian,start_q_AN,q_AN,Gq_AN,Mq_AN,Qwan,jan,kl,so,i,j,k,Hx,Hy,Hz,HUx,HUy,HUz,NC_HUx,NC_HUy,NC_HUz,s1,s2,pref,spinmax,spin)
{
/* allocation of arrays */
Hx = (dcomplex***)malloc(sizeof(dcomplex**)*3);
for (i=0; i<3; i++){
Hx[i] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hx[i][j] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
Hy = (dcomplex***)malloc(sizeof(dcomplex**)*3);
for (i=0; i<3; i++){
Hy[i] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hy[i][j] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
Hz = (dcomplex***)malloc(sizeof(dcomplex**)*3);
for (i=0; i<3; i++){
Hz[i] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hz[i][j] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
if ( (Hub_U_switch==1 || 1<=Constraint_NCS_switch || Zeeman_NCS_switch==1 || Zeeman_NCO_switch==1)
&& (Hub_U_occupation==1 || Hub_U_occupation==2)
&& SpinP_switch!=3 ){
HUx = (double***)malloc(sizeof(double**)*3);
for (i=0; i<3; i++){
HUx[i] = (double**)malloc(sizeof(double*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
HUx[i][j] = (double*)malloc(sizeof(double)*List_YOUSO[7]);
}
}
HUy = (double***)malloc(sizeof(double**)*3);
for (i=0; i<3; i++){
HUy[i] = (double**)malloc(sizeof(double*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
HUy[i][j] = (double*)malloc(sizeof(double)*List_YOUSO[7]);
}
}
HUz = (double***)malloc(sizeof(double**)*3);
for (i=0; i<3; i++){
HUz[i] = (double**)malloc(sizeof(double*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
HUz[i][j] = (double*)malloc(sizeof(double)*List_YOUSO[7]);
}
}
}
if ( (Hub_U_switch==1 || 1<=Constraint_NCS_switch || Zeeman_NCS_switch==1 || Zeeman_NCO_switch==1)
&& (Hub_U_occupation==1 || Hub_U_occupation==2)
&& SpinP_switch==3 ){
NC_HUx = (dcomplex****)malloc(sizeof(dcomplex***)*2);
for (i=0; i<2; i++){
NC_HUx[i] = (dcomplex***)malloc(sizeof(dcomplex**)*2);
for (j=0; j<2; j++){
NC_HUx[i][j] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (k=0; k<List_YOUSO[7]; k++){
NC_HUx[i][j][k] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
}
NC_HUy = (dcomplex****)malloc(sizeof(dcomplex***)*2);
for (i=0; i<2; i++){
NC_HUy[i] = (dcomplex***)malloc(sizeof(dcomplex**)*2);
for (j=0; j<2; j++){
NC_HUy[i][j] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (k=0; k<List_YOUSO[7]; k++){
NC_HUy[i][j][k] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
}
NC_HUz = (dcomplex****)malloc(sizeof(dcomplex***)*2);
for (i=0; i<2; i++){
NC_HUz[i] = (dcomplex***)malloc(sizeof(dcomplex**)*2);
for (j=0; j<2; j++){
NC_HUz[i][j] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (k=0; k<List_YOUSO[7]; k++){
NC_HUz[i][j][k] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
}
}
/* get info. on OpenMP */
OMPID = omp_get_thread_num();
Nthrds = omp_get_num_threads();
Nprocs = omp_get_num_procs();
for (Mc_AN=(OMPID*Matomnum/Nthrds+1); Mc_AN<((OMPID+1)*Matomnum/Nthrds+1); Mc_AN++){
dtime(&Stime_atom);
Gc_AN = M2G[Mc_AN];
Cwan = WhatSpecies[Gc_AN];
dEx = 0.0;
dEy = 0.0;
dEz = 0.0;
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
Gh_AN = natn[Gc_AN][h_AN];
Mh_AN = F_G2M[Gh_AN];
Hwan = WhatSpecies[Gh_AN];
ian = Spe_Total_CNO[Hwan];
if ( SpinP_switch==3 && (SO_switch==1 || (Hub_U_switch==1 && F_U_flag==1)
|| 1<=Constraint_NCS_switch || Zeeman_NCS_switch==1 || Zeeman_NCO_switch==1) )
start_q_AN = 0;
else
start_q_AN = h_AN;
for (q_AN=start_q_AN; q_AN<=FNAN[Gc_AN]; q_AN++){
Gq_AN = natn[Gc_AN][q_AN];
Mq_AN = F_G2M[Gq_AN];
Qwan = WhatSpecies[Gq_AN];
jan = Spe_Total_CNO[Qwan];
kl = RMI1[Mc_AN][h_AN][q_AN];
if (0<=kl){
for (so=0; so<3; so++){
for (i=0; i<List_YOUSO[7]; i++){
for (j=0; j<List_YOUSO[7]; j++){
Hx[so][i][j] = Complex(0.0,0.0);
Hy[so][i][j] = Complex(0.0,0.0);
Hz[so][i][j] = Complex(0.0,0.0);
}
}
}
/****************************************************
Contribution from LDA+U with 'full'treatment for
counting the occupation number
****************************************************/
if ( (Hub_U_switch==1 && F_U_flag==1) || 1<=Constraint_NCS_switch
|| Zeeman_NCS_switch==1 || Zeeman_NCO_switch==1 ){
/* full treatment and collinear case */
if (Hub_U_occupation==1 && SpinP_switch!=3){
/* initialize HUx, HUy, and HUz */
for (so=0; so<3; so++){
for (i=0; i<List_YOUSO[7]; i++){
for (j=0; j<List_YOUSO[7]; j++){
HUx[so][i][j] = 0.0;
HUy[so][i][j] = 0.0;
HUz[so][i][j] = 0.0;
}
}
}
dH_U_full(Mc_AN,h_AN,q_AN,OLP,v_eff,HUx,HUy,HUz);
/* add the contribution to Hx, Hy, and Hz */
if (SpinP_switch==0) spinmax = 0;
else spinmax = 1;
for (spin=0; spin<=spinmax; spin++){
for (i=0; i<ian; i++){
for (j=0; j<jan; j++){
Hx[spin][i][j].r += HUx[spin][i][j];
Hy[spin][i][j].r += HUy[spin][i][j];
Hz[spin][i][j].r += HUz[spin][i][j];
}
}
}
}
/* full treatment and non-collinear case */
else if (Hub_U_occupation==1 && SpinP_switch==3){
/* initialize NC_HUx, NC_HUy, and NC_HUz */
for (s1=0; s1<2; s1++){
for (s2=0; s2<2; s2++){
for (i=0; i<List_YOUSO[7]; i++){
for (j=0; j<List_YOUSO[7]; j++){
NC_HUx[s1][s2][i][j] = Complex(0.0,0.0);
NC_HUy[s1][s2][i][j] = Complex(0.0,0.0);
NC_HUz[s1][s2][i][j] = Complex(0.0,0.0);
}
}
}
}
dH_U_NC_full(Mc_AN,h_AN,q_AN,OLP,NC_v_eff,NC_HUx,NC_HUy,NC_HUz);
/******************************************************
add the contribution to Hx, Hy, and Hz
Hx[0] 00
Hx[1] 11
Hx[2] 01
******************************************************/
for (i=0; i<ian; i++){
for (j=0; j<jan; j++){
Hx[0][i][j].r += NC_HUx[0][0][i][j].r;
Hy[0][i][j].r += NC_HUy[0][0][i][j].r;
Hz[0][i][j].r += NC_HUz[0][0][i][j].r;
Hx[1][i][j].r += NC_HUx[1][1][i][j].r;
Hy[1][i][j].r += NC_HUy[1][1][i][j].r;
Hz[1][i][j].r += NC_HUz[1][1][i][j].r;
Hx[2][i][j].r += NC_HUx[0][1][i][j].r;
Hy[2][i][j].r += NC_HUy[0][1][i][j].r;
Hz[2][i][j].r += NC_HUz[0][1][i][j].r;
Hx[0][i][j].i += NC_HUx[0][0][i][j].i;
Hy[0][i][j].i += NC_HUy[0][0][i][j].i;
Hz[0][i][j].i += NC_HUz[0][0][i][j].i;
Hx[1][i][j].i += NC_HUx[1][1][i][j].i;
Hy[1][i][j].i += NC_HUy[1][1][i][j].i;
Hz[1][i][j].i += NC_HUz[1][1][i][j].i;
Hx[2][i][j].i += NC_HUx[0][1][i][j].i;
Hy[2][i][j].i += NC_HUy[0][1][i][j].i;
Hz[2][i][j].i += NC_HUz[0][1][i][j].i;
}
}
}
}
/****************************************************
H0 = dKinetic
****************************************************/
if (F_Kin_flag==1){
/* in case of no obital optimization */
if (Cnt_switch==0){
if (h_AN==0){
for (i=0; i<ian; i++){
for (j=0; j<jan; j++){
Hx[0][i][j].r += H0[1][Mc_AN][q_AN][i][j];
Hy[0][i][j].r += H0[2][Mc_AN][q_AN][i][j];
Hz[0][i][j].r += H0[3][Mc_AN][q_AN][i][j];
Hx[1][i][j].r += H0[1][Mc_AN][q_AN][i][j];
Hy[1][i][j].r += H0[2][Mc_AN][q_AN][i][j];
Hz[1][i][j].r += H0[3][Mc_AN][q_AN][i][j];
}
}
}
else if (h_AN!=0 && q_AN==0){
for (i=0; i<ian; i++){
for (j=0; j<jan; j++){
Hx[0][i][j].r += H0[1][Mc_AN][h_AN][j][i];
Hy[0][i][j].r += H0[2][Mc_AN][h_AN][j][i];
Hz[0][i][j].r += H0[3][Mc_AN][h_AN][j][i];
Hx[1][i][j].r += H0[1][Mc_AN][h_AN][j][i];
Hy[1][i][j].r += H0[2][Mc_AN][h_AN][j][i];
Hz[1][i][j].r += H0[3][Mc_AN][h_AN][j][i];
}
}
}
}
/* in case of obital optimization */
else{
if (h_AN==0){
for (i=0; i<ian; i++){
for (j=0; j<jan; j++){
Hx[0][i][j].r += CntH0[1][Mc_AN][q_AN][i][j];
Hy[0][i][j].r += CntH0[2][Mc_AN][q_AN][i][j];
Hz[0][i][j].r += CntH0[3][Mc_AN][q_AN][i][j];
Hx[1][i][j].r += CntH0[1][Mc_AN][q_AN][i][j];
Hy[1][i][j].r += CntH0[2][Mc_AN][q_AN][i][j];
Hz[1][i][j].r += CntH0[3][Mc_AN][q_AN][i][j];
}
}
}
else if (h_AN!=0 && q_AN==0){
for (i=0; i<ian; i++){
for (j=0; j<jan; j++){
Hx[0][i][j].r += CntH0[1][Mc_AN][h_AN][j][i];
Hy[0][i][j].r += CntH0[2][Mc_AN][h_AN][j][i];
Hz[0][i][j].r += CntH0[3][Mc_AN][h_AN][j][i];
Hx[1][i][j].r += CntH0[1][Mc_AN][h_AN][j][i];
Hy[1][i][j].r += CntH0[2][Mc_AN][h_AN][j][i];
Hz[1][i][j].r += CntH0[3][Mc_AN][h_AN][j][i];
}
}
}
}
} /* if F_Kin_flag */
/****************************************************
\sum rho*dH
****************************************************/
/* non-spin polarization */
if (SpinP_switch==0){
if (q_AN==h_AN) pref = 2.0;
else pref = 4.0;
for (i=0; i<Spe_Total_CNO[Hwan]; i++){
for (j=0; j<Spe_Total_CNO[Qwan]; j++){
dEx += pref*CDM0[0][Mh_AN][kl][i][j]*Hx[0][i][j].r;
dEy += pref*CDM0[0][Mh_AN][kl][i][j]*Hy[0][i][j].r;
dEz += pref*CDM0[0][Mh_AN][kl][i][j]*Hz[0][i][j].r;
}
}
}
/* collinear spin polarized or non-colliear without SO and LDA+U */
else if (SpinP_switch==1 || (SpinP_switch==3 && SO_switch==0 && Hub_U_switch==0
&& Constraint_NCS_switch==0 && Zeeman_NCS_switch==0 && Zeeman_NCO_switch==0)){
if (q_AN==h_AN) pref = 1.0;
else pref = 2.0;
for (i=0; i<Spe_Total_CNO[Hwan]; i++){
for (j=0; j<Spe_Total_CNO[Qwan]; j++){
dEx += pref*( CDM0[0][Mh_AN][kl][i][j]*Hx[0][i][j].r
+ CDM0[1][Mh_AN][kl][i][j]*Hx[1][i][j].r);
dEy += pref*( CDM0[0][Mh_AN][kl][i][j]*Hy[0][i][j].r
+ CDM0[1][Mh_AN][kl][i][j]*Hy[1][i][j].r);
dEz += pref*( CDM0[0][Mh_AN][kl][i][j]*Hz[0][i][j].r
+ CDM0[1][Mh_AN][kl][i][j]*Hz[1][i][j].r);
}
}
}
/* spin collinear with spin-orbit coupling */
else if ( SpinP_switch==1 && SO_switch==1 ){
printf("Spin-orbit coupling is not supported for collinear DFT calculations.\n");fflush(stdout);
MPI_Finalize();
exit(0);
}
/* spin non-collinear with spin-orbit coupling or with LDA+U */
else if ( SpinP_switch==3 && (SO_switch==1 || (Hub_U_switch==1 && F_U_flag==1)
|| 1<=Constraint_NCS_switch || Zeeman_NCS_switch==1 || Zeeman_NCO_switch==1) ){
for (i=0; i<Spe_Total_CNO[Hwan]; i++){
for (j=0; j<Spe_Total_CNO[Qwan]; j++){
dEx += CDM0[0][Mh_AN][kl][i][j]*Hx[0][i][j].r
- iDM0[0][Mh_AN][kl][i][j]*Hx[0][i][j].i
+ CDM0[1][Mh_AN][kl][i][j]*Hx[1][i][j].r
- iDM0[1][Mh_AN][kl][i][j]*Hx[1][i][j].i
+ 2.0*CDM0[2][Mh_AN][kl][i][j]*Hx[2][i][j].r
- 2.0*CDM0[3][Mh_AN][kl][i][j]*Hx[2][i][j].i;
dEy += CDM0[0][Mh_AN][kl][i][j]*Hy[0][i][j].r
- iDM0[0][Mh_AN][kl][i][j]*Hy[0][i][j].i
+ CDM0[1][Mh_AN][kl][i][j]*Hy[1][i][j].r
- iDM0[1][Mh_AN][kl][i][j]*Hy[1][i][j].i
+ 2.0*CDM0[2][Mh_AN][kl][i][j]*Hy[2][i][j].r
- 2.0*CDM0[3][Mh_AN][kl][i][j]*Hy[2][i][j].i;
dEz += CDM0[0][Mh_AN][kl][i][j]*Hz[0][i][j].r
- iDM0[0][Mh_AN][kl][i][j]*Hz[0][i][j].i
+ CDM0[1][Mh_AN][kl][i][j]*Hz[1][i][j].r
- iDM0[1][Mh_AN][kl][i][j]*Hz[1][i][j].i
+ 2.0*CDM0[2][Mh_AN][kl][i][j]*Hz[2][i][j].r
- 2.0*CDM0[3][Mh_AN][kl][i][j]*Hz[2][i][j].i;
}
}
}
} /* if (0<=kl) */
} /* q_AN */
} /* h_AN */
/****************************************************
#2 of Force
****************************************************/
if (2<=level_stdout){
printf("<Force> force(2) myid=%2d Mc_AN=%2d Gc_AN=%2d %15.12f %15.12f %15.12f\n",
myid,Mc_AN,Gc_AN,dEx,dEy,dEz);fflush(stdout);
}
Gxyz[Gc_AN][17] += dEx;
Gxyz[Gc_AN][18] += dEy;
Gxyz[Gc_AN][19] += dEz;
dtime(&Etime_atom);
time_per_atom[Gc_AN] += Etime_atom - Stime_atom;
} /* Mc_AN */
/* freeing of arrays */
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hx[i][j]);
}
free(Hx[i]);
}
free(Hx);
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hy[i][j]);
}
free(Hy[i]);
}
free(Hy);
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hz[i][j]);
}
free(Hz[i]);
}
free(Hz);
if ( (Hub_U_switch==1 || 1<=Constraint_NCS_switch || Zeeman_NCS_switch==1 || Zeeman_NCO_switch==1)
&& (Hub_U_occupation==1 || Hub_U_occupation==2)
&& SpinP_switch!=3 ){
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(HUx[i][j]);
}
free(HUx[i]);
}
free(HUx);
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(HUy[i][j]);
}
free(HUy[i]);
}
free(HUy);
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(HUz[i][j]);
}
free(HUz[i]);
}
free(HUz);
}
if ( (Hub_U_switch==1 || 1<=Constraint_NCS_switch || Zeeman_NCS_switch==1 || Zeeman_NCO_switch==1)
&& (Hub_U_occupation==1 || Hub_U_occupation==2)
&& SpinP_switch==3 ){
for (i=0; i<2; i++){
for (j=0; j<2; j++){
for (k=0; k<List_YOUSO[7]; k++){
free(NC_HUx[i][j][k]);
}
free(NC_HUx[i][j]);
}
free(NC_HUx[i]);
}
free(NC_HUx);
for (i=0; i<2; i++){
for (j=0; j<2; j++){
for (k=0; k<List_YOUSO[7]; k++){
free(NC_HUy[i][j][k]);
}
free(NC_HUy[i][j]);
}
free(NC_HUy[i]);
}
free(NC_HUy);
for (i=0; i<2; i++){
for (j=0; j<2; j++){
for (k=0; k<List_YOUSO[7]; k++){
free(NC_HUz[i][j][k]);
}
free(NC_HUz[i][j]);
}
free(NC_HUz[i]);
}
free(NC_HUz);
}
} /* #pragma omp parallel */
dtime(&etime);
if(myid==0 && measure_time){
printf("Time for force#2=%18.5f\n",etime-stime);fflush(stdout);
}
/****************************************************
#3 of Force
dn/dx * (VNA + dVH + Vxc)
or
dn/dx * (dVH + Vxc)
****************************************************/
dtime(&stime);
if (myid==Host_ID && 0<level_stdout){
printf(" Force calculation #3\n");fflush(stdout);
}
Force3();
dtime(&etime);
if(myid==0 && measure_time){
printf("Time for force#3=%18.5f\n",etime-stime);fflush(stdout);
}
/****************************************************
#4 of Force
Force4: n * dVNA/dx
Force4B: from separable VNA projectors
****************************************************/
dtime(&stime);
if (myid==Host_ID && 0<level_stdout){
printf(" Force calculation #4\n");fflush(stdout);
}
if (ProExpn_VNA==0 && F_VNA_flag==1){
Force4();
}
else if (ProExpn_VNA==1 && F_VNA_flag==1){
Force4B(CDM0);
}
dtime(&etime);
if(myid==0 && measure_time){
printf("Time for force#4=%18.5f\n",etime-stime);fflush(stdout);
}
/****************************************************
#5 of Force
Contribution from overlap
****************************************************/
dtime(&stime);
if (myid==Host_ID && 0<level_stdout){
printf(" Force calculation #5\n");fflush(stdout);
}
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
Fx[Mc_AN] = 0.0;
Fy[Mc_AN] = 0.0;
Fz[Mc_AN] = 0.0;
}
#pragma omp parallel shared(time_per_atom,Fx,Fy,Fz,CntOLP,OLP,Cnt_switch,EDM,SpinP_switch,Spe_Total_CNO,natn,FNAN,WhatSpecies,M2G,Matomnum) private(OMPID,Nthrds,Nprocs,Mc_AN,Stime_atom,Etime_atom,Gc_AN,Cwan,h_AN,Gh_AN,Hwan,i,j,dum,dx,dy,dz)
{
/* get info. on OpenMP */
OMPID = omp_get_thread_num();
Nthrds = omp_get_num_threads();
Nprocs = omp_get_num_procs();
for (Mc_AN=(OMPID*Matomnum/Nthrds+1); Mc_AN<((OMPID+1)*Matomnum/Nthrds+1); Mc_AN++){
dtime(&Stime_atom);
Gc_AN = M2G[Mc_AN];
Cwan = WhatSpecies[Gc_AN];
for (h_AN=1; h_AN<=FNAN[Gc_AN]; h_AN++){
Gh_AN = natn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
for (i=0; i<Spe_Total_CNO[Cwan]; i++){
for (j=0; j<Spe_Total_CNO[Hwan]; j++){
if (SpinP_switch==0){
dum = 2.0*EDM[0][Mc_AN][h_AN][i][j];
}
else if (SpinP_switch==1 || SpinP_switch==3){
dum = EDM[0][Mc_AN][h_AN][i][j] + EDM[1][Mc_AN][h_AN][i][j];
}
if (Cnt_switch==0){
dx = dum*OLP[1][Mc_AN][h_AN][i][j];
dy = dum*OLP[2][Mc_AN][h_AN][i][j];
dz = dum*OLP[3][Mc_AN][h_AN][i][j];
}
else{
dx = dum*CntOLP[1][Mc_AN][h_AN][i][j];
dy = dum*CntOLP[2][Mc_AN][h_AN][i][j];
dz = dum*CntOLP[3][Mc_AN][h_AN][i][j];
}
Fx[Mc_AN] = Fx[Mc_AN] - 2.0*dx;
Fy[Mc_AN] = Fy[Mc_AN] - 2.0*dy;
Fz[Mc_AN] = Fz[Mc_AN] - 2.0*dz;
}
}
}
dtime(&Etime_atom);
time_per_atom[Gc_AN] += Etime_atom - Stime_atom;
}
} /* #pragma omp parallel */
dtime(&etime);
if(myid==0 && measure_time){
printf("Time for force#5=%18.5f\n",etime-stime);fflush(stdout);
}
/****************************************************
add #5 of Force
****************************************************/
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
Gc_AN = M2G[Mc_AN];
Gxyz[Gc_AN][17] += Fx[Mc_AN];
Gxyz[Gc_AN][18] += Fy[Mc_AN];
Gxyz[Gc_AN][19] += Fz[Mc_AN];
if (2<=level_stdout){
printf("<Force> force(5) myid=%2d Mc_AN=%2d Gc_AN=%2d %15.12f %15.12f %15.12f\n",
myid,Mc_AN,Gc_AN,Fx[Mc_AN],Fy[Mc_AN],Fz[Mc_AN]);fflush(stdout);
}
}
/****************************************************************
In case that the dual representation is used for evaluation of
the occupation number in the LDA+U method, the following force
term is added.
****************************************************************/
if ( (Hub_U_switch==1 || 1<=Constraint_NCS_switch || Zeeman_NCS_switch==1 || Zeeman_NCO_switch==1)
&& (Hub_U_occupation==1 || Hub_U_occupation==2)
&& SpinP_switch!=3 ){
HUx = (double***)malloc(sizeof(double**)*3);
for (i=0; i<3; i++){
HUx[i] = (double**)malloc(sizeof(double*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
HUx[i][j] = (double*)malloc(sizeof(double)*List_YOUSO[7]);
}
}
HUy = (double***)malloc(sizeof(double**)*3);
for (i=0; i<3; i++){
HUy[i] = (double**)malloc(sizeof(double*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
HUy[i][j] = (double*)malloc(sizeof(double)*List_YOUSO[7]);
}
}
HUz = (double***)malloc(sizeof(double**)*3);
for (i=0; i<3; i++){
HUz[i] = (double**)malloc(sizeof(double*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
HUz[i][j] = (double*)malloc(sizeof(double)*List_YOUSO[7]);
}
}
}
if ( (Hub_U_switch==1 || 1<=Constraint_NCS_switch || Zeeman_NCS_switch==1 || Zeeman_NCO_switch==1)
&& F_U_flag==1 && Hub_U_occupation==2){
if (myid==Host_ID) printf(" Force calculation for LDA_U with dual\n");fflush(stdout);
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
Fx[Mc_AN] = 0.0;
Fy[Mc_AN] = 0.0;
Fz[Mc_AN] = 0.0;
}
/****************************************************
if (SpinP_switch!=3)
collinear case
****************************************************/
if (SpinP_switch!=3){
if (SpinP_switch==0){
spinmax = 0;
dege = 2.0;
}
else{
spinmax = 1;
dege = 1.0;
}
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
dtime(&Stime_atom);
Gc_AN = M2G[Mc_AN];
Cwan = WhatSpecies[Gc_AN];
for (spin=0; spin<=spinmax; spin++){
for (h_AN=1; h_AN<=FNAN[Gc_AN]; h_AN++){
Gh_AN = natn[Gc_AN][h_AN];
Mh_AN = F_G2M[Gh_AN];
Hwan = WhatSpecies[Gh_AN];
/* non-orbital optimization */
if (Cnt_switch==0){
for (i=0; i<Spe_Total_NO[Cwan]; i++){
for (j=0; j<Spe_Total_NO[Hwan]; j++){
tmp1 = 0.0;
tmp2 = 0.0;
tmp3 = 0.0;
for (k=0; k<Spe_Total_NO[Cwan]; k++){
tmp1 += v_eff[spin][Mc_AN][i][k]*OLP[1][Mc_AN][h_AN][k][j];
tmp2 += v_eff[spin][Mc_AN][i][k]*OLP[2][Mc_AN][h_AN][k][j];
tmp3 += v_eff[spin][Mc_AN][i][k]*OLP[3][Mc_AN][h_AN][k][j];
}
for (k=0; k<Spe_Total_NO[Hwan]; k++){
tmp1 += v_eff[spin][Mh_AN][k][j]*OLP[1][Mc_AN][h_AN][i][k];
tmp2 += v_eff[spin][Mh_AN][k][j]*OLP[2][Mc_AN][h_AN][i][k];
tmp3 += v_eff[spin][Mh_AN][k][j]*OLP[3][Mc_AN][h_AN][i][k];
}
dx = tmp1*dege*CDM[spin][Mc_AN][h_AN][i][j];
dy = tmp2*dege*CDM[spin][Mc_AN][h_AN][i][j];
dz = tmp3*dege*CDM[spin][Mc_AN][h_AN][i][j];
Fx[Mc_AN] += dx;
Fy[Mc_AN] += dy;
Fz[Mc_AN] += dz;
}
}
}
/* orbital optimization */
else if (Cnt_switch==1){
/* HUx, HUy, HUz for primitive orbital */
for (i=0; i<Spe_Total_NO[Cwan]; i++){
for (j=0; j<Spe_Total_NO[Hwan]; j++){
tmp1 = 0.0;
tmp2 = 0.0;
tmp3 = 0.0;
for (k=0; k<Spe_Total_NO[Cwan]; k++){
tmp1 += v_eff[spin][Mc_AN][i][k]*OLP[1][Mc_AN][h_AN][k][j];
tmp2 += v_eff[spin][Mc_AN][i][k]*OLP[2][Mc_AN][h_AN][k][j];
tmp3 += v_eff[spin][Mc_AN][i][k]*OLP[3][Mc_AN][h_AN][k][j];
}
for (k=0; k<Spe_Total_NO[Hwan]; k++){
tmp1 += v_eff[spin][Mh_AN][k][j]*OLP[1][Mc_AN][h_AN][i][k];
tmp2 += v_eff[spin][Mh_AN][k][j]*OLP[2][Mc_AN][h_AN][i][k];
tmp3 += v_eff[spin][Mh_AN][k][j]*OLP[3][Mc_AN][h_AN][i][k];
}
HUx[0][i][j] = tmp1;
HUy[0][i][j] = tmp2;
HUz[0][i][j] = tmp3;
}
}
/* contract HUx, HUy, HUz */
for (al=0; al<Spe_Total_CNO[Cwan]; al++){
for (be=0; be<Spe_Total_CNO[Hwan]; be++){
tmp1 = 0.0;
tmp2 = 0.0;
tmp3 = 0.0;
for (p=0; p<Spe_Specified_Num[Cwan][al]; p++){
p0 = Spe_Trans_Orbital[Cwan][al][p];
for (q=0; q<Spe_Specified_Num[Hwan][be]; q++){
q0 = Spe_Trans_Orbital[Hwan][be][q];
tmp0 = CntCoes[Mc_AN][al][p]*CntCoes[Mh_AN][be][q];
tmp1 += tmp0*HUx[0][p0][q0];
tmp2 += tmp0*HUy[0][p0][q0];
tmp3 += tmp0*HUz[0][p0][q0];
}
}
dx = tmp1*dege*CDM[spin][Mc_AN][h_AN][al][be];
dy = tmp2*dege*CDM[spin][Mc_AN][h_AN][al][be];
dz = tmp3*dege*CDM[spin][Mc_AN][h_AN][al][be];
Fx[Mc_AN] += dx;
Fy[Mc_AN] += dy;
Fz[Mc_AN] += dz;
}
}
}
}
}
dtime(&Etime_atom);
time_per_atom[Gc_AN] += Etime_atom - Stime_atom;
}
}
/****************************************************
if (SpinP_switch==3)
spin non-collinear
****************************************************/
else {
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
dtime(&Stime_atom);
Gc_AN = M2G[Mc_AN];
Cwan = WhatSpecies[Gc_AN];
for (h_AN=1; h_AN<=FNAN[Gc_AN]; h_AN++){
Gh_AN = natn[Gc_AN][h_AN];
Mh_AN = F_G2M[Gh_AN];
Hwan = WhatSpecies[Gh_AN];
kl = RMI1[Mc_AN][h_AN][0];
for (i=0; i<Spe_Total_NO[Cwan]; i++){
for (j=0; j<Spe_Total_NO[Hwan]; j++){
Re00x = 0.0; Re00y = 0.0; Re00z = 0.0;
Re11x = 0.0; Re11y = 0.0; Re11z = 0.0;
Re01x = 0.0; Re01y = 0.0; Re01z = 0.0;
Im00x = 0.0; Im00y = 0.0; Im00z = 0.0;
Im11x = 0.0; Im11y = 0.0; Im11z = 0.0;
Im01x = 0.0; Im01y = 0.0; Im01z = 0.0;
for (k=0; k<Spe_Total_NO[Cwan]; k++){
Re00x += NC_v_eff[0][0][Mc_AN][i][k].r * OLP[1][Mc_AN][h_AN][k][j];
Re00y += NC_v_eff[0][0][Mc_AN][i][k].r * OLP[2][Mc_AN][h_AN][k][j];
Re00z += NC_v_eff[0][0][Mc_AN][i][k].r * OLP[3][Mc_AN][h_AN][k][j];
Re11x += NC_v_eff[1][1][Mc_AN][i][k].r * OLP[1][Mc_AN][h_AN][k][j];
Re11y += NC_v_eff[1][1][Mc_AN][i][k].r * OLP[2][Mc_AN][h_AN][k][j];
Re11z += NC_v_eff[1][1][Mc_AN][i][k].r * OLP[3][Mc_AN][h_AN][k][j];
Re01x += NC_v_eff[0][1][Mc_AN][i][k].r * OLP[1][Mc_AN][h_AN][k][j];
Re01y += NC_v_eff[0][1][Mc_AN][i][k].r * OLP[2][Mc_AN][h_AN][k][j];
Re01z += NC_v_eff[0][1][Mc_AN][i][k].r * OLP[3][Mc_AN][h_AN][k][j];
Im00x += NC_v_eff[0][0][Mc_AN][i][k].i * OLP[1][Mc_AN][h_AN][k][j];
Im00y += NC_v_eff[0][0][Mc_AN][i][k].i * OLP[2][Mc_AN][h_AN][k][j];
Im00z += NC_v_eff[0][0][Mc_AN][i][k].i * OLP[3][Mc_AN][h_AN][k][j];
Im11x += NC_v_eff[1][1][Mc_AN][i][k].i * OLP[1][Mc_AN][h_AN][k][j];
Im11y += NC_v_eff[1][1][Mc_AN][i][k].i * OLP[2][Mc_AN][h_AN][k][j];
Im11z += NC_v_eff[1][1][Mc_AN][i][k].i * OLP[3][Mc_AN][h_AN][k][j];
Im01x += NC_v_eff[0][1][Mc_AN][i][k].i * OLP[1][Mc_AN][h_AN][k][j];
Im01y += NC_v_eff[0][1][Mc_AN][i][k].i * OLP[2][Mc_AN][h_AN][k][j];
Im01z += NC_v_eff[0][1][Mc_AN][i][k].i * OLP[3][Mc_AN][h_AN][k][j];
}
for (k=0; k<Spe_Total_NO[Hwan]; k++){
Re00x += NC_v_eff[0][0][Mh_AN][k][j].r * OLP[1][Mc_AN][h_AN][i][k];
Re00y += NC_v_eff[0][0][Mh_AN][k][j].r * OLP[2][Mc_AN][h_AN][i][k];
Re00z += NC_v_eff[0][0][Mh_AN][k][j].r * OLP[3][Mc_AN][h_AN][i][k];
Re11x += NC_v_eff[1][1][Mh_AN][k][j].r * OLP[1][Mc_AN][h_AN][i][k];
Re11y += NC_v_eff[1][1][Mh_AN][k][j].r * OLP[2][Mc_AN][h_AN][i][k];
Re11z += NC_v_eff[1][1][Mh_AN][k][j].r * OLP[3][Mc_AN][h_AN][i][k];
Re01x += NC_v_eff[0][1][Mh_AN][k][j].r * OLP[1][Mc_AN][h_AN][i][k];
Re01y += NC_v_eff[0][1][Mh_AN][k][j].r * OLP[2][Mc_AN][h_AN][i][k];
Re01z += NC_v_eff[0][1][Mh_AN][k][j].r * OLP[3][Mc_AN][h_AN][i][k];
Im00x += NC_v_eff[0][0][Mh_AN][k][j].i * OLP[1][Mc_AN][h_AN][i][k];
Im00y += NC_v_eff[0][0][Mh_AN][k][j].i * OLP[2][Mc_AN][h_AN][i][k];
Im00z += NC_v_eff[0][0][Mh_AN][k][j].i * OLP[3][Mc_AN][h_AN][i][k];
Im11x += NC_v_eff[1][1][Mh_AN][k][j].i * OLP[1][Mc_AN][h_AN][i][k];
Im11y += NC_v_eff[1][1][Mh_AN][k][j].i * OLP[2][Mc_AN][h_AN][i][k];
Im11z += NC_v_eff[1][1][Mh_AN][k][j].i * OLP[3][Mc_AN][h_AN][i][k];
Im01x += NC_v_eff[0][1][Mh_AN][k][j].i * OLP[1][Mc_AN][h_AN][i][k];
Im01y += NC_v_eff[0][1][Mh_AN][k][j].i * OLP[2][Mc_AN][h_AN][i][k];
Im01z += NC_v_eff[0][1][Mh_AN][k][j].i * OLP[3][Mc_AN][h_AN][i][k];
}
dx = Re00x*CDM0[0][Mc_AN][h_AN][i][j]
+ Re11x*CDM0[1][Mc_AN][h_AN][i][j]
+ 2.0*Re01x*CDM0[2][Mc_AN][h_AN][i][j]
- Im00x*iDM0[0][Mc_AN][h_AN][i][j]
- Im11x*iDM0[1][Mc_AN][h_AN][i][j]
- 2.0*Im01x*CDM0[3][Mc_AN][h_AN][i][j];
dy = Re00y*CDM0[0][Mc_AN][h_AN][i][j]
+ Re11y*CDM0[1][Mc_AN][h_AN][i][j]
+ 2.0*Re01y*CDM0[2][Mc_AN][h_AN][i][j]
- Im00y*iDM0[0][Mc_AN][h_AN][i][j]
- Im11y*iDM0[1][Mc_AN][h_AN][i][j]
- 2.0*Im01y*CDM0[3][Mc_AN][h_AN][i][j];
dz = Re00z*CDM0[0][Mc_AN][h_AN][i][j]
+ Re11z*CDM0[1][Mc_AN][h_AN][i][j]
+ 2.0*Re01z*CDM0[2][Mc_AN][h_AN][i][j]
- Im00z*iDM0[0][Mc_AN][h_AN][i][j]
- Im11z*iDM0[1][Mc_AN][h_AN][i][j]
- 2.0*Im01z*CDM0[3][Mc_AN][h_AN][i][j];
Fx[Mc_AN] += 0.5*dx;
Fy[Mc_AN] += 0.5*dy;
Fz[Mc_AN] += 0.5*dz;
Re00x = 0.0; Re00y = 0.0; Re00z = 0.0;
Re11x = 0.0; Re11y = 0.0; Re11z = 0.0;
Re01x = 0.0; Re01y = 0.0; Re01z = 0.0;
Im00x = 0.0; Im00y = 0.0; Im00z = 0.0;
Im11x = 0.0; Im11y = 0.0; Im11z = 0.0;
Im01x = 0.0; Im01y = 0.0; Im01z = 0.0;
for (k=0; k<Spe_Total_NO[Hwan]; k++){
Re00x += NC_v_eff[0][0][Mh_AN][j][k].r * OLP[1][Mc_AN][h_AN][i][k];
Re00y += NC_v_eff[0][0][Mh_AN][j][k].r * OLP[2][Mc_AN][h_AN][i][k];
Re00z += NC_v_eff[0][0][Mh_AN][j][k].r * OLP[3][Mc_AN][h_AN][i][k];
Re11x += NC_v_eff[1][1][Mh_AN][j][k].r * OLP[1][Mc_AN][h_AN][i][k];
Re11y += NC_v_eff[1][1][Mh_AN][j][k].r * OLP[2][Mc_AN][h_AN][i][k];
Re11z += NC_v_eff[1][1][Mh_AN][j][k].r * OLP[3][Mc_AN][h_AN][i][k];
Re01x += NC_v_eff[0][1][Mh_AN][j][k].r * OLP[1][Mc_AN][h_AN][i][k];
Re01y += NC_v_eff[0][1][Mh_AN][j][k].r * OLP[2][Mc_AN][h_AN][i][k];
Re01z += NC_v_eff[0][1][Mh_AN][j][k].r * OLP[3][Mc_AN][h_AN][i][k];
Im00x += NC_v_eff[0][0][Mh_AN][j][k].i * OLP[1][Mc_AN][h_AN][i][k];
Im00y += NC_v_eff[0][0][Mh_AN][j][k].i * OLP[2][Mc_AN][h_AN][i][k];
Im00z += NC_v_eff[0][0][Mh_AN][j][k].i * OLP[3][Mc_AN][h_AN][i][k];
Im11x += NC_v_eff[1][1][Mh_AN][j][k].i * OLP[1][Mc_AN][h_AN][i][k];
Im11y += NC_v_eff[1][1][Mh_AN][j][k].i * OLP[2][Mc_AN][h_AN][i][k];
Im11z += NC_v_eff[1][1][Mh_AN][j][k].i * OLP[3][Mc_AN][h_AN][i][k];
Im01x += NC_v_eff[0][1][Mh_AN][j][k].i * OLP[1][Mc_AN][h_AN][i][k];
Im01y += NC_v_eff[0][1][Mh_AN][j][k].i * OLP[2][Mc_AN][h_AN][i][k];
Im01z += NC_v_eff[0][1][Mh_AN][j][k].i * OLP[3][Mc_AN][h_AN][i][k];
}
for (k=0; k<Spe_Total_NO[Cwan]; k++){
Re00x += NC_v_eff[0][0][Mc_AN][k][i].r * OLP[1][Mc_AN][h_AN][k][j];
Re00y += NC_v_eff[0][0][Mc_AN][k][i].r * OLP[2][Mc_AN][h_AN][k][j];
Re00z += NC_v_eff[0][0][Mc_AN][k][i].r * OLP[3][Mc_AN][h_AN][k][j];
Re11x += NC_v_eff[1][1][Mc_AN][k][i].r * OLP[1][Mc_AN][h_AN][k][j];
Re11y += NC_v_eff[1][1][Mc_AN][k][i].r * OLP[2][Mc_AN][h_AN][k][j];
Re11z += NC_v_eff[1][1][Mc_AN][k][i].r * OLP[3][Mc_AN][h_AN][k][j];
Re01x += NC_v_eff[0][1][Mc_AN][k][i].r * OLP[1][Mc_AN][h_AN][k][j];
Re01y += NC_v_eff[0][1][Mc_AN][k][i].r * OLP[2][Mc_AN][h_AN][k][j];
Re01z += NC_v_eff[0][1][Mc_AN][k][i].r * OLP[3][Mc_AN][h_AN][k][j];
Im00x += NC_v_eff[0][0][Mc_AN][k][i].i * OLP[1][Mc_AN][h_AN][k][j];
Im00y += NC_v_eff[0][0][Mc_AN][k][i].i * OLP[2][Mc_AN][h_AN][k][j];
Im00z += NC_v_eff[0][0][Mc_AN][k][i].i * OLP[3][Mc_AN][h_AN][k][j];
Im11x += NC_v_eff[1][1][Mc_AN][k][i].i * OLP[1][Mc_AN][h_AN][k][j];
Im11y += NC_v_eff[1][1][Mc_AN][k][i].i * OLP[2][Mc_AN][h_AN][k][j];
Im11z += NC_v_eff[1][1][Mc_AN][k][i].i * OLP[3][Mc_AN][h_AN][k][j];
Im01x += NC_v_eff[0][1][Mc_AN][k][i].i * OLP[1][Mc_AN][h_AN][k][j];
Im01y += NC_v_eff[0][1][Mc_AN][k][i].i * OLP[2][Mc_AN][h_AN][k][j];
Im01z += NC_v_eff[0][1][Mc_AN][k][i].i * OLP[3][Mc_AN][h_AN][k][j];
}
dx = Re00x*CDM0[0][Mh_AN][kl][j][i]
+ Re11x*CDM0[1][Mh_AN][kl][j][i]
+ 2.0*Re01x*CDM0[2][Mh_AN][kl][j][i]
- Im00x*iDM0[0][Mh_AN][kl][j][i]
- Im11x*iDM0[1][Mh_AN][kl][j][i]
- 2.0*Im01x*CDM0[3][Mh_AN][kl][j][i];
dy = Re00y*CDM0[0][Mh_AN][kl][j][i]
+ Re11y*CDM0[1][Mh_AN][kl][j][i]
+ 2.0*Re01y*CDM0[2][Mh_AN][kl][j][i]
- Im00y*iDM0[0][Mh_AN][kl][j][i]
- Im11y*iDM0[1][Mh_AN][kl][j][i]
- 2.0*Im01y*CDM0[3][Mh_AN][kl][j][i];
dz = Re00z*CDM0[0][Mh_AN][kl][j][i]
+ Re11z*CDM0[1][Mh_AN][kl][j][i]
+ 2.0*Re01z*CDM0[2][Mh_AN][kl][j][i]
- Im00z*iDM0[0][Mh_AN][kl][j][i]
- Im11z*iDM0[1][Mh_AN][kl][j][i]
- 2.0*Im01z*CDM0[3][Mh_AN][kl][j][i];
Fx[Mc_AN] += 0.5*dx;
Fy[Mc_AN] += 0.5*dy;
Fz[Mc_AN] += 0.5*dz;
}
}
}
dtime(&Etime_atom);
time_per_atom[Gc_AN] += Etime_atom - Stime_atom;
}
}
/****************************************************
add the contribution
****************************************************/
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
Gc_AN = M2G[Mc_AN];
Gxyz[Gc_AN][17] += Fx[Mc_AN];
Gxyz[Gc_AN][18] += Fy[Mc_AN];
Gxyz[Gc_AN][19] += Fz[Mc_AN];
if (2<=level_stdout){
printf("<Force> force(LDA_U_dual) myid=%2d Mc_AN=%2d Gc_AN=%2d %15.12f %15.12f %15.12f\n",
myid,Mc_AN,Gc_AN,Fx[Mc_AN],Fy[Mc_AN],Fz[Mc_AN]);fflush(stdout);
}
}
} /* if ( (Hub_U_switch==1 || 1<=Constraint_NCS_switch || Zeeman_NCS_switch==1 || Zeeman_NCO_switch==1)
&& F_U_flag==1 && Hub_U_occupation==2) */
/****************************************************
Force arising from HNL
****************************************************/
Force_HNL(CDM0, iDM0);
/****************************************************
Force arising from the penalty functional
to create a core hole
****************************************************/
if (core_hole_state_flag==1){
Force_CoreHole(CDM0, iDM0);
}
/****************************************************
freeing of arrays:
****************************************************/
if ( (Hub_U_switch==1 || 1<=Constraint_NCS_switch || Zeeman_NCS_switch==1 || Zeeman_NCO_switch==1)
&& (Hub_U_occupation==1 || Hub_U_occupation==2)
&& SpinP_switch!=3 ){
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(HUx[i][j]);
}
free(HUx[i]);
}
free(HUx);
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(HUy[i][j]);
}
free(HUy[i]);
}
free(HUy);
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(HUz[i][j]);
}
free(HUz[i]);
}
free(HUz);
}
free(Fx);
free(Fy);
free(Fz);
for (j=0; j<List_YOUSO[7]; j++){
free(HVNAx[j]);
}
free(HVNAx);
for (j=0; j<List_YOUSO[7]; j++){
free(HVNAy[j]);
}
free(HVNAy);
for (j=0; j<List_YOUSO[7]; j++){
free(HVNAz[j]);
}
free(HVNAz);
/* CDM0 */
for (k=0; k<=SpinP_switch; k++){
FNAN[0] = 0;
for (Mc_AN=0; Mc_AN<=(Matomnum+MatomnumF); Mc_AN++){
if (Mc_AN==0){
Gc_AN = 0;
tno0 = 1;
}
else{
Gc_AN = F_M2G[Mc_AN];
Cwan = WhatSpecies[Gc_AN];
tno0 = Spe_Total_CNO[Cwan];
}
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
if (Mc_AN==0){
tno1 = 1;
}
else{
Gh_AN = natn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
tno1 = Spe_Total_CNO[Hwan];
}
for (i=0; i<tno0; i++){
free(CDM0[k][Mc_AN][h_AN][i]);
}
free(CDM0[k][Mc_AN][h_AN]);
}
free(CDM0[k][Mc_AN]);
}
free(CDM0[k]);
}
free(CDM0);
free(Snd_CDM0_Size);
free(Rcv_CDM0_Size);
/* iDM0 */
if ( SO_switch==1 || (Hub_U_switch==1 && SpinP_switch==3) || 1<=Constraint_NCS_switch
|| Zeeman_NCS_switch==1 || Zeeman_NCO_switch==1 ){
for (k=0; k<2; k++){
FNAN[0] = 0;
for (Mc_AN=0; Mc_AN<=(Matomnum+MatomnumF); Mc_AN++){
if (Mc_AN==0){
Gc_AN = 0;
tno0 = 1;
}
else{
Gc_AN = F_M2G[Mc_AN];
Cwan = WhatSpecies[Gc_AN];
tno0 = Spe_Total_CNO[Cwan];
}
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
if (Mc_AN==0){
tno1 = 1;
}
else{
Gh_AN = natn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
tno1 = Spe_Total_CNO[Hwan];
}
for (i=0; i<tno0; i++){
free(iDM0[k][Mc_AN][h_AN][i]);
}
free(iDM0[k][Mc_AN][h_AN]);
}
free(iDM0[k][Mc_AN]);
}
free(iDM0[k]);
}
free(iDM0);
free(Snd_iDM0_Size);
free(Rcv_iDM0_Size);
}
/* for time */
MPI_Barrier(mpi_comm_level1);
dtime(&TEtime);
time0 = TEtime - TStime;
return time0;
}
void Force3()
{
/****************************************************
#3 of Force
dn/dx * (VNA + dVH + Vxc)
or
dn/dx * (dVH + Vxc)
****************************************************/
/* for OpenMP */
/* MPI */
int numprocs, myid;
MPI_Comm_size(mpi_comm_level1, &numprocs);
MPI_Comm_rank(mpi_comm_level1, &myid);
/**********************************************************
main loop for calculation of force #3
**********************************************************/
/* shared memory for force */
double** Vpot_grid = (double**)malloc(sizeof(double*)*(SpinP_switch + 1));
{
double* p2 = (double*)malloc(sizeof(double)*(SpinP_switch + 1)*Max_GridN_Atom);
int spin;
for (spin = 0; spin<(SpinP_switch + 1); spin++) {
Vpot_grid[spin] = p2;
p2 += Max_GridN_Atom;
}
}
double*** dChi0 = (double***)malloc(sizeof(double**)*Max_GridN_Atom);
{
double** p2 = (double**)malloc(sizeof(double*)*Max_GridN_Atom*List_YOUSO[7]);
double* p = (double*)malloc(sizeof(double)*Max_GridN_Atom*List_YOUSO[7] * 3);
int Nc;
for (Nc = 0; Nc<Max_GridN_Atom; Nc++) {
dChi0[Nc] = p2;
p2 += List_YOUSO[7];
int i;
for (i = 0; i<List_YOUSO[7]; i++) {
dChi0[Nc][i] = p;
p += 3;
}
}
}
double sumx = 0.0; /* this must be defined out of parallel pragma */
double sumy = 0.0;
double sumz = 0.0;
#pragma omp parallel
{
/* allocation of arrays */
double** dorbs0 = (double**)malloc(sizeof(double*) * 4);
{
int i;
for (i = 0; i<4; i++) {
dorbs0[i] = (double*)malloc(sizeof(double)*List_YOUSO[7]);
}
}
double* orbs1 = (double*)malloc(sizeof(double)*List_YOUSO[7]);
struct WORK_DORBITAL work_dObs;
Get_dOrbitals_init(&work_dObs);
double time1 = 0.0;
double time2 = 0.0;
double last_time;
double current_time;
int Mc_AN;
for (Mc_AN = 1; Mc_AN <= Matomnum; Mc_AN++) {
int Gc_AN = M2G[Mc_AN];
int Cwan = WhatSpecies[Gc_AN];
int NO0 = Spe_Total_CNO[Cwan];
/***********************************
calc dOrb0
***********************************/
#pragma omp barrier /* this barrier is necessary to wait (1)clearing sumx, sumy, sumz, and (2)initializing work_dObs */
dtime(&last_time);
int Nc;
#pragma omp for
for (Nc=0; Nc<GridN_Atom[Gc_AN]; Nc++) {
int GNc = GridListAtom[Mc_AN][Nc];
int GRc = CellListAtom[Mc_AN][Nc];
int MNc = MGridListAtom[Mc_AN][Nc];
double Cxyz[4];
Get_Grid_XYZ(GNc, Cxyz);
double x = Cxyz[1] + atv[GRc][1];
double y = Cxyz[2] + atv[GRc][2];
double z = Cxyz[3] + atv[GRc][3];
double dx = x - Gxyz[Gc_AN][1];
double dy = y - Gxyz[Gc_AN][2];
double dz = z - Gxyz[Gc_AN][3];
if (Cnt_switch == 0) {
/* AITUNE201704 : Get_dOrbitals(Cwan, dx, dy, dz, dorbs0); */
/* Get_dOrbitals_work(Cwan, dx, dy, dz, dorbs0, work_dObs); */
/* start: direct inlining of Get_dOrbitals_work */
int wan=Cwan;
double x=dx,y=dy,z=dz;
int i, i1, i2, i3, i4, j, l, l1;
int po, L0, Mul0, M0;
int mp_min, mp_max, m;
double dum, dum1, dum2, dum3, dum4;
double siQ, coQ, siP, coP, a, b, c;
double dx, rm, tmp0, tmp1, id, d;
double drx, dry, drz, R, Q, P, Rmin;
double S_coordinate[3];
double **RF = work_dObs.RF;
double **dRF = work_dObs.dRF;
double **AF = work_dObs.AF;
double **dAFQ = work_dObs.dAFQ;
double **dAFP = work_dObs.dAFP;
double h1, h2, h3, f1, f2, f3, f4, dfx, dfx2;
double g1, g2, x1, x2, y1, y2, y12, y22, f, df, df2;
double dRx, dRy, dRz, dQx, dQy, dQz, dPx, dPy, dPz;
double dChiR, dChiQ, dChiP, h, sum0, sum1;
double SH[Supported_MaxL * 2 + 1][2];
double dSHt[Supported_MaxL * 2 + 1][2];
double dSHp[Supported_MaxL * 2 + 1][2];
/* start calc. */
Rmin = 10e-14;
xyz2spherical(x, y, z, 0.0, 0.0, 0.0, S_coordinate);
R = S_coordinate[0];
Q = S_coordinate[1];
P = S_coordinate[2];
if (R < Rmin) {
x = x + Rmin;
y = y + Rmin;
z = z + Rmin;
xyz2spherical(x, y, z, 0.0, 0.0, 0.0, S_coordinate);
R = S_coordinate[0];
Q = S_coordinate[1];
P = S_coordinate[2];
}
po = 0;
mp_min = 0;
mp_max = Spe_Num_Mesh_PAO[wan] - 1;
if (Spe_PAO_RV[wan][Spe_Num_Mesh_PAO[wan] - 1] < R) {
for (L0 = 0; L0 <= Spe_MaxL_Basis[wan]; L0++) {
for (Mul0 = 0; Mul0 < Spe_Num_Basis[wan][L0]; Mul0++) {
RF[L0][Mul0] = 0.0;
dRF[L0][Mul0] = 0.0;
}
}
po = 1;
}
else if (R < Spe_PAO_RV[wan][0]) {
m = 4;
rm = Spe_PAO_RV[wan][m];
h1 = Spe_PAO_RV[wan][m - 1] - Spe_PAO_RV[wan][m - 2];
h2 = Spe_PAO_RV[wan][m] - Spe_PAO_RV[wan][m - 1];
h3 = Spe_PAO_RV[wan][m + 1] - Spe_PAO_RV[wan][m];
x1 = rm - Spe_PAO_RV[wan][m - 1];
x2 = rm - Spe_PAO_RV[wan][m];
y1 = x1 / h2;
y2 = x2 / h2;
y12 = y1*y1;
y22 = y2*y2;
dum = h1 + h2;
dum1 = h1 / h2 / dum;
dum2 = h2 / h1 / dum;
dum = h2 + h3;
dum3 = h2 / h3 / dum;
dum4 = h3 / h2 / dum;
for (L0 = 0; L0 <= Spe_MaxL_Basis[wan]; L0++) {
for (Mul0 = 0; Mul0 < Spe_Num_Basis[wan][L0]; Mul0++) {
f1 = Spe_PAO_RWF[wan][L0][Mul0][m - 2];
f2 = Spe_PAO_RWF[wan][L0][Mul0][m - 1];
f3 = Spe_PAO_RWF[wan][L0][Mul0][m];
f4 = Spe_PAO_RWF[wan][L0][Mul0][m + 1];
if (m == 1) {
h1 = -(h2 + h3);
f1 = f4;
} else if (m == (Spe_Num_Mesh_PAO[wan] - 1)) {
h3 = -(h1 + h2);
f4 = f1;
}
dum = f3 - f2;
g1 = dum*dum1 + (f2 - f1)*dum2;
g2 = (f4 - f3)*dum3 + dum*dum4;
f = y22*(3.0*f2 + h2*g1 + (2.0*f2 + h2*g1)*y2)
+ y12*(3.0*f3 - h2*g2 - (2.0*f3 - h2*g2)*y1);
df = 2.0*y2 / h2*(3.0*f2 + h2*g1 + (2.0*f2 + h2*g1)*y2)
+ y22*(2.0*f2 + h2*g1) / h2
+ 2.0*y1 / h2*(3.0*f3 - h2*g2 - (2.0*f3 - h2*g2)*y1)
- y12*(2.0*f3 - h2*g2) / h2;
if (L0 == 0) {
a = 0.0;
b = 0.5*df / rm;
c = 0.0;
d = f - b*rm*rm;
}
else if (L0 == 1) {
a = (rm*df - f) / (2.0*rm*rm*rm);
b = 0.0;
c = df - 3.0*a*rm*rm;
d = 0.0;
}
else {
b = (3.0*f - rm*df) / (rm*rm);
a = (f - b*rm*rm) / (rm*rm*rm);
c = 0.0;
d = 0.0;
}
RF[L0][Mul0] = a*R*R*R + b*R*R + c*R + d;
dRF[L0][Mul0] = 3.0*a*R*R + 2.0*b*R + c;
}
}
}
else {
do {
m = (mp_min + mp_max) / 2;
if (Spe_PAO_RV[wan][m] < R)
mp_min = m;
else
mp_max = m;
} while ((mp_max - mp_min) != 1);
m = mp_max;
h1 = Spe_PAO_RV[wan][m - 1] - Spe_PAO_RV[wan][m - 2];
h2 = Spe_PAO_RV[wan][m] - Spe_PAO_RV[wan][m - 1];
h3 = Spe_PAO_RV[wan][m + 1] - Spe_PAO_RV[wan][m];
x1 = R - Spe_PAO_RV[wan][m - 1];
x2 = R - Spe_PAO_RV[wan][m];
y1 = x1 / h2;
y2 = x2 / h2;
y12 = y1*y1;
y22 = y2*y2;
dum = h1 + h2;
dum1 = h1 / h2 / dum;
dum2 = h2 / h1 / dum;
dum = h2 + h3;
dum3 = h2 / h3 / dum;
dum4 = h3 / h2 / dum;
for (L0 = 0; L0 <= Spe_MaxL_Basis[wan]; L0++) {
for (Mul0 = 0; Mul0 < Spe_Num_Basis[wan][L0]; Mul0++) {
f1 = Spe_PAO_RWF[wan][L0][Mul0][m - 2];
f2 = Spe_PAO_RWF[wan][L0][Mul0][m - 1];
f3 = Spe_PAO_RWF[wan][L0][Mul0][m];
f4 = Spe_PAO_RWF[wan][L0][Mul0][m + 1];
if (m == 1) {
h1 = -(h2 + h3);
f1 = f4;
} else if (m == (Spe_Num_Mesh_PAO[wan] - 1)) {
h3 = -(h1 + h2);
f4 = f1;
}
dum = f3 - f2;
g1 = dum*dum1 + (f2 - f1)*dum2;
g2 = (f4 - f3)*dum3 + dum*dum4;
f = y22*(3.0*f2 + h2*g1 + (2.0*f2 + h2*g1)*y2)
+ y12*(3.0*f3 - h2*g2 - (2.0*f3 - h2*g2)*y1);
df = 2.0*y2 / h2*(3.0*f2 + h2*g1 + (2.0*f2 + h2*g1)*y2)
+ y2*y2*(2.0*f2 + h2*g1) / h2
+ 2.0*y1 / h2*(3.0*f3 - h2*g2 - (2.0*f3 - h2*g2)*y1)
- y1*y1*(2.0*f3 - h2*g2) / h2;
RF[L0][Mul0] = f;
dRF[L0][Mul0] = df;
}
}
}
/* dr/dx,y,z, dQ/dx,y,z, dP/dx,y,z and dAngular */
if (po == 0) {
/* Angular */
siQ = sin(Q);
coQ = cos(Q);
siP = sin(P);
coP = cos(P);
dRx = siQ*coP;
dRy = siQ*siP;
dRz = coQ;
if (Rmin < R) {
dQx = coQ*coP / R;
dQy = coQ*siP / R;
dQz = -siQ / R;
} else {
dQx = 0.0;
dQy = 0.0;
dQz = 0.0;
}
/* RICS note 72P */
if (Rmin < R) {
dPx = -siP / R;
dPy = coP / R;
dPz = 0.0;
} else {
dPx = 0.0;
dPy = 0.0;
dPz = 0.0;
}
for (L0 = 0; L0 <= Spe_MaxL_Basis[wan]; L0++) {
if (L0 == 0) {
AF[0][0] = 0.282094791773878;
dAFQ[0][0] = 0.0;
dAFP[0][0] = 0.0;
} else if (L0 == 1) {
dum = 0.48860251190292*siQ;
AF[1][0] = dum*coP;
AF[1][1] = dum*siP;
AF[1][2] = 0.48860251190292*coQ;
dAFQ[1][0] = 0.48860251190292*coQ*coP;
dAFQ[1][1] = 0.48860251190292*coQ*siP;
dAFQ[1][2] = -0.48860251190292*siQ;
dAFP[1][0] = -0.48860251190292*siP;
dAFP[1][1] = 0.48860251190292*coP;
dAFP[1][2] = 0.0;
} else if (L0 == 2) {
dum1 = siQ*siQ;
dum2 = 1.09254843059208*siQ*coQ;
AF[2][0] = 0.94617469575756*coQ*coQ - 0.31539156525252;
AF[2][1] = 0.54627421529604*dum1*(1.0 - 2.0*siP*siP);
AF[2][2] = 1.09254843059208*dum1*siP*coP;
AF[2][3] = dum2*coP;
AF[2][4] = dum2*siP;
dAFQ[2][0] = -1.89234939151512*siQ*coQ;
dAFQ[2][1] = 1.09254843059208*siQ*coQ*(1.0 - 2.0*siP*siP);
dAFQ[2][2] = 2.18509686118416*siQ*coQ*siP*coP;
dAFQ[2][3] = 1.09254843059208*(1.0 - 2.0*siQ*siQ)*coP;
dAFQ[2][4] = 1.09254843059208*(1.0 - 2.0*siQ*siQ)*siP;
/* RICS note 72P */
dAFP[2][0] = 0.0;
dAFP[2][1] = -2.18509686118416*siQ*siP*coP;
dAFP[2][2] = 1.09254843059208*siQ*(1.0 - 2.0*siP*siP);
dAFP[2][3] = -1.09254843059208*coQ*siP;
dAFP[2][4] = 1.09254843059208*coQ*coP;
}
else if (L0 == 3) {
AF[3][0] = 0.373176332590116*(5.0*coQ*coQ*coQ - 3.0*coQ);
AF[3][1] = 0.457045799464466*coP*siQ*(5.0*coQ*coQ - 1.0);
AF[3][2] = 0.457045799464466*siP*siQ*(5.0*coQ*coQ - 1.0);
AF[3][3] = 1.44530572132028*siQ*siQ*coQ*(coP*coP - siP*siP);
AF[3][4] = 2.89061144264055*siQ*siQ*coQ*siP*coP;
AF[3][5] = 0.590043589926644*siQ*siQ*siQ*(4.0*coP*coP*coP - 3.0*coP);
AF[3][6] = 0.590043589926644*siQ*siQ*siQ*(3.0*siP - 4.0*siP*siP*siP);
dAFQ[3][0] = 0.373176332590116*siQ*(-15.0*coQ*coQ + 3.0);
dAFQ[3][1] = 0.457045799464466*coP*coQ*(15.0*coQ*coQ - 11.0);
dAFQ[3][2] = 0.457045799464466*siP*coQ*(15.0*coQ*coQ - 11.0);
dAFQ[3][3] = 1.44530572132028*(coP*coP - siP*siP)*siQ*(2.0*coQ*coQ - siQ*siQ);
dAFQ[3][4] = 2.89061144264055*coP*siP*siQ*(2.0*coQ*coQ - siQ*siQ);
dAFQ[3][5] = 1.770130769779932*coP*coQ*siQ*siQ*(-3.0 + 4.0*coP*coP);
dAFQ[3][6] = 1.770130769779932*coQ*siP*siQ*siQ*(3.0 - 4.0*siP*siP);
/* RICS note 72P */
dAFP[3][0] = 0.0;
dAFP[3][1] = 0.457045799464466*siP*(-5.0*coQ*coQ + 1.0);
dAFP[3][2] = 0.457045799464466*coP*(5.0*coQ*coQ - 1.0);
dAFP[3][3] = -5.781222885281120*coP*coQ*siP*siQ;
dAFP[3][4] = 2.89061144264055*coQ*siQ*(coP*coP - siP*siP);
dAFP[3][5] = 1.770130769779932*siP*siQ*siQ*(1.0 - 4.0*coP*coP);
dAFP[3][6] = 1.770130769779932*coP*siQ*siQ*(1.0 - 4.0*siP*siP);
}
else if (4 <= L0) {
/* calculation of complex spherical harmonics functions */
for (m = -L0; m <= L0; m++) {
ComplexSH(L0, m, Q, P, SH[L0 + m], dSHt[L0 + m], dSHp[L0 + m]);
}
/* transformation of complex to real */
for (i = 0; i < (L0 * 2 + 1); i++) {
sum0 = 0.0;
sum1 = 0.0;
for (j = 0; j < (L0 * 2 + 1); j++) {
sum0 += Comp2Real[L0][i][j].r*SH[j][0] - Comp2Real[L0][i][j].i*SH[j][1];
sum1 += Comp2Real[L0][i][j].r*SH[j][1] + Comp2Real[L0][i][j].i*SH[j][0];
}
AF[L0][i] = sum0 + sum1;
sum0 = 0.0;
sum1 = 0.0;
for (j = 0; j < (L0 * 2 + 1); j++) {
sum0 += Comp2Real[L0][i][j].r*dSHt[j][0] - Comp2Real[L0][i][j].i*dSHt[j][1];
sum1 += Comp2Real[L0][i][j].r*dSHt[j][1] + Comp2Real[L0][i][j].i*dSHt[j][0];
}
dAFQ[L0][i] = sum0 + sum1;
sum0 = 0.0;
sum1 = 0.0;
for (j = 0; j < (L0 * 2 + 1); j++) {
sum0 += Comp2Real[L0][i][j].r*dSHp[j][0] - Comp2Real[L0][i][j].i*dSHp[j][1];
sum1 += Comp2Real[L0][i][j].r*dSHp[j][1] + Comp2Real[L0][i][j].i*dSHp[j][0];
}
dAFP[L0][i] = sum0 + sum1;
}
}
}
}
/* Chi */
i1 = -1;
for (L0 = 0; L0 <= Spe_MaxL_Basis[wan]; L0++) {
for (Mul0 = 0; Mul0 < Spe_Num_Basis[wan][L0]; Mul0++) {
for (M0 = 0; M0 <= 2 * L0; M0++) {
i1++;
dChiR = dRF[L0][Mul0] * AF[L0][M0];
dChiQ = RF[L0][Mul0] * dAFQ[L0][M0];
dChiP = RF[L0][Mul0] * dAFP[L0][M0];
dorbs0[0][i1] = RF[L0][Mul0] * AF[L0][M0];
dorbs0[1][i1] = -dRx*dChiR - dQx*dChiQ - dPx*dChiP;
dorbs0[2][i1] = -dRy*dChiR - dQy*dChiQ - dPy*dChiP;
dorbs0[3][i1] = -dRz*dChiR - dQz*dChiQ - dPz*dChiP;
}
}
}
/* end: direct inlining of Get_dOrbitals_work */
}
else {
Get_Cnt_dOrbitals(Mc_AN, dx, dy, dz, dorbs0);
}
int k;
for (k = 0; k<3; k++) {
int i;
for (i = 0; i<NO0; i++) {
dChi0[Nc][i][k] = dorbs0[k + 1][i];
}
}
if (SpinP_switch == 0 || SpinP_switch == 1) {
int spin;
for (spin = 0; spin <= SpinP_switch; spin++) {
double Vpt;
if (0 <= MNc) {
if (E_Field_switch == 1) {
if (ProExpn_VNA == 0) {
Vpt = F_dVHart_flag*dVHart_Grid[MNc]
+ F_Vxc_flag*Vxc_Grid[spin][MNc]
+ F_VNA_flag*VNA_Grid[MNc]
+ F_VEF_flag*VEF_Grid[MNc];
} else {
Vpt = F_dVHart_flag*dVHart_Grid[MNc]
+ F_Vxc_flag*Vxc_Grid[spin][MNc]
+ F_VEF_flag*VEF_Grid[MNc];
}
} else {
if (ProExpn_VNA == 0) {
Vpt = F_dVHart_flag*dVHart_Grid[MNc]
+ F_Vxc_flag*Vxc_Grid[spin][MNc]
+ F_VNA_flag*VNA_Grid[MNc];
} else {
Vpt = F_dVHart_flag*dVHart_Grid[MNc]
+ F_Vxc_flag*Vxc_Grid[spin][MNc];
}
}
} else {
Vpt = 0.0;
}
if (SpinP_switch == 0) {
Vpot_grid[0][Nc] = 4.0 * Vpt;
} else if (SpinP_switch == 1) {
Vpot_grid[spin][Nc] = 2.0 * Vpt;
}
}
}
else if (SpinP_switch == 3) {
/* spin non-collinear */
double ReVpt11;
double ReVpt22;
double ReVpt21;
double ImVpt21;
if (0 <= MNc) {
if (E_Field_switch == 1) {
if (ProExpn_VNA == 0) {
ReVpt11 = F_dVHart_flag*dVHart_Grid[MNc]
+ F_Vxc_flag*Vxc_Grid[0][MNc]
+ F_VNA_flag*VNA_Grid[MNc]
+ F_VEF_flag*VEF_Grid[MNc];
ReVpt22 = F_dVHart_flag*dVHart_Grid[MNc]
+ F_Vxc_flag*Vxc_Grid[1][MNc]
+ F_VNA_flag*VNA_Grid[MNc]
+ F_VEF_flag*VEF_Grid[MNc];
ReVpt21 = F_Vxc_flag*Vxc_Grid[2][MNc];
ImVpt21 = -F_Vxc_flag*Vxc_Grid[3][MNc];
} else {
ReVpt11 = F_dVHart_flag*dVHart_Grid[MNc]
+ F_Vxc_flag*Vxc_Grid[0][MNc]
+ F_VEF_flag*VEF_Grid[MNc];
ReVpt22 = F_dVHart_flag*dVHart_Grid[MNc]
+ F_Vxc_flag*Vxc_Grid[1][MNc]
+ F_VEF_flag*VEF_Grid[MNc];
ReVpt21 = F_Vxc_flag*Vxc_Grid[2][MNc];
ImVpt21 = -F_Vxc_flag*Vxc_Grid[3][MNc];
}
} else {
if (ProExpn_VNA == 0) {
ReVpt11 = F_dVHart_flag*dVHart_Grid[MNc]
+ F_Vxc_flag*Vxc_Grid[0][MNc]
+ F_VNA_flag*VNA_Grid[MNc];
ReVpt22 = F_dVHart_flag*dVHart_Grid[MNc]
+ F_Vxc_flag*Vxc_Grid[1][MNc]
+ F_VNA_flag*VNA_Grid[MNc];
ReVpt21 = F_Vxc_flag*Vxc_Grid[2][MNc];
ImVpt21 = -F_Vxc_flag*Vxc_Grid[3][MNc];
} else {
ReVpt11 = F_dVHart_flag*dVHart_Grid[MNc] + F_Vxc_flag*Vxc_Grid[0][MNc];
ReVpt22 = F_dVHart_flag*dVHart_Grid[MNc] + F_Vxc_flag*Vxc_Grid[1][MNc];
ReVpt21 = F_Vxc_flag*Vxc_Grid[2][MNc];
ImVpt21 = -F_Vxc_flag*Vxc_Grid[3][MNc];
}
}
} else {
ReVpt11 = 0.0;
ReVpt22 = 0.0;
ReVpt21 = 0.0;
ImVpt21 = 0.0;
}
Vpot_grid[0][Nc] = 2.0 * ReVpt11;
Vpot_grid[1][Nc] = 2.0 * ReVpt22;
Vpot_grid[2][Nc] = 4.0 * ReVpt21;
Vpot_grid[3][Nc] = 4.0 * ImVpt21;
}
}/* Nc, here omp barrier is called implicitly because of end of for loop */
dtime(&current_time);
time1 += current_time - last_time;
last_time = current_time;
int h_AN;
for (h_AN = 0; h_AN <= FNAN[Gc_AN]; h_AN++) {
int Gh_AN = natn[Gc_AN][h_AN];
int Mh_AN = F_G2M[Gh_AN];
int Rnh = ncn[Gc_AN][h_AN];
int Hwan = WhatSpecies[Gh_AN];
int NO1 = Spe_Total_CNO[Hwan];
int Nog;
#pragma omp for reduction (+:sumx, sumy, sumz)
for (Nog = 0; Nog<NumOLG[Mc_AN][h_AN]; Nog++) {
int Nc = GListTAtoms1[Mc_AN][h_AN][Nog];
int Nh = GListTAtoms2[Mc_AN][h_AN][Nog];
double** const ai_dorbs0 = dChi0[Nc];
/* set orbs1 */
if (G2ID[Gh_AN] == myid) {
int j;
for (j = 0; j<NO1; j++) {
orbs1[j] = Orbs_Grid[Mh_AN][Nh][j];
}
} else {
int j;
for (j = 0; j<NO1; j++) {
orbs1[j] = Orbs_Grid_FNAN[Mc_AN][h_AN][Nog][j];
}
}
int spin;
for (spin = 0; spin <= SpinP_switch; spin++) {
double tmpx = 0.0;
double tmpy = 0.0;
double tmpz = 0.0;
int i;
for (i = 0; i<NO0; i++) {
double tmp0 = 0.0;
int j;
for (j = 0; j<NO1; j++) {
tmp0 += orbs1[j] * DM[0][spin][Mc_AN][h_AN][i][j];
}
tmpx += ai_dorbs0[i][0] * tmp0;
tmpy += ai_dorbs0[i][1] * tmp0;
tmpz += ai_dorbs0[i][2] * tmp0;
}
/* due to difference in the definition between density matrix and density */
double Vpt = Vpot_grid[spin][Nc];
sumx += tmpx * Vpt;
sumy += tmpy * Vpt;
sumz += tmpz * Vpt;
}/* spin */
}/* Nog */
}/* h_AN, here omp barrier is called implicitly because of end of for loop */
/***********************************
calc force #3
***********************************/
#pragma omp master
{
Gxyz[Gc_AN][17] += sumx*GridVol;
Gxyz[Gc_AN][18] += sumy*GridVol;
Gxyz[Gc_AN][19] += sumz*GridVol;
sumx = 0.0;
sumy = 0.0;
sumz = 0.0;
}
dtime(&current_time);
time2 += current_time - last_time;
last_time = current_time;
#pragma omp master
if (2 <= level_stdout) {
printf("<Force> force(3) myid=%2d Mc_AN=%2d Gc_AN=%2d %15.12f %15.12f %15.12f\n",
myid, Mc_AN, Gc_AN, sumx*GridVol, sumy*GridVol, sumz*GridVol); fflush(stdout);
printf("<Force> force(3) myid=%2d GridN_Atom[Gc_AN] = %d, FNAN[Gc_AN] = %d\n",
myid, GridN_Atom[Gc_AN], FNAN[Gc_AN]);
}
} /* Mc_AN */
#if measure_time
#pragma omp master
printf("<Force> force(3) myid=%2d time1, 2 = %lf [s], %lf [s]\n", myid, time1, time2);
#endif
/* freeing of arrays */
free(orbs1);
int i;
for (i = 0; i<4; i++) {
free(dorbs0[i]);
}
free(dorbs0);
Get_dOrbitals_free(work_dObs);
} /* #pragma omp parallel */
/* free */
free(dChi0[0][0]);
free(dChi0[0]);
free(dChi0);
free(Vpot_grid[0]);
free(Vpot_grid);
}
void Force4()
{
/****************************************************
#4 of Force
n * dVNA/dx
****************************************************/
int Mc_AN,Gc_AN,Cwan,Hwan,NO0,NO1;
int i,j,k,Nc,Nh,GNc,GRc,MNc;
int h_AN,Gh_AN,Mh_AN,Rnh,spin,Nog;
double sum,tmp0,r,dx,dy,dz;
double dvx,dvy,dvz;
double sumx,sumy,sumz;
double x,y,z,den;
double Cxyz[4];
/**********************************************************
main loop for calculation of force #4
**********************************************************/
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
Gc_AN = M2G[Mc_AN];
Cwan = WhatSpecies[Gc_AN];
NO0 = Spe_Total_CNO[Cwan];
/***********************************
summation
***********************************/
sumx = 0.0;
sumy = 0.0;
sumz = 0.0;
for (Nc=0; Nc<GridN_Atom[Gc_AN]; Nc++){
GNc = GridListAtom[Mc_AN][Nc];
GRc = CellListAtom[Mc_AN][Nc];
MNc = MGridListAtom[Mc_AN][Nc];
Get_Grid_XYZ(GNc,Cxyz);
x = Cxyz[1] + atv[GRc][1];
y = Cxyz[2] + atv[GRc][2];
z = Cxyz[3] + atv[GRc][3];
dx = Gxyz[Gc_AN][1] - x;
dy = Gxyz[Gc_AN][2] - y;
dz = Gxyz[Gc_AN][3] - z;
r = sqrt(dx*dx + dy*dy + dz*dz);
/* for empty atoms or finite elemens basis */
if (r<1.0e-10) r = 1.0e-10;
if (1.0e-14<r){
tmp0 = Dr_VNAF(Cwan,r);
dvx = tmp0*dx/r;
dvy = tmp0*dy/r;
dvz = tmp0*dz/r;
}
else{
dvx = 0.0;
dvy = 0.0;
dvz = 0.0;
}
den = Density_Grid[0][MNc] + Density_Grid[1][MNc];
sumx += den*dvx;
sumy += den*dvy;
sumz += den*dvz;
}
Gxyz[Gc_AN][17] += sumx*GridVol;
Gxyz[Gc_AN][18] += sumy*GridVol;
Gxyz[Gc_AN][19] += sumz*GridVol;
/*
if (2<=level_stdout){
printf("<Force> force(4) myid=%2d Mc_AN=%2d Gc_AN=%2d %15.12f %15.12f %15.12f\n",
myid,Mc_AN,Gc_AN,sumx*GridVol,sumy*GridVol,sumz*GridVol);fflush(stdout);
}
*/
}
}
void Force_HNL(double *****CDM0, double *****iDM0)
{
/****************************************************
Force arising from HNL
****************************************************/
int Mc_AN,Gc_AN,Cwan,i,j,h_AN,q_AN,Mq_AN,start_q_AN;
int jan,kl,km,kl1,Qwan,Gq_AN,Gh_AN,Mh_AN,Hwan,ian;
int l1,l2,l3,l,LL,Mul1,tno0,ncp,so;
int tno1,tno2,size1,size2,n,kk,num,po,po1,po2;
int numprocs,myid,tag=999,ID,IDS,IDR;
int **S_array,**R_array;
int S_comm_flag,R_comm_flag;
int SA_num,q,Sc_AN,GSc_AN,smul;
int Sc_wan,Sh_AN,GSh_AN,Sh_wan;
int Sh_AN2,fan,jg,j0,jg0,Mj_AN0;
int Original_Mc_AN;
double rcutA,rcutB,rcut;
double dEx,dEy,dEz,ene,pref;
double Stime_atom, Etime_atom;
dcomplex ***Hx,***Hy,***Hz;
dcomplex ***Hx0,***Hy0,***Hz0;
dcomplex ***Hx1,***Hy1,***Hz1;
int *Snd_DS_NL_Size,*Rcv_DS_NL_Size;
int *Indicator;
double *tmp_array;
double *tmp_array2;
/* for OpenMP */
int OMPID,Nthrds,Nthrds0,Nprocs,Nloop,ODNloop;
int *OneD2h_AN,*OneD2q_AN;
double *dEx_threads;
double *dEy_threads;
double *dEz_threads;
double stime,etime;
double stime1,etime1;
MPI_Status stat;
MPI_Request request;
/* MPI */
MPI_Comm_size(mpi_comm_level1,&numprocs);
MPI_Comm_rank(mpi_comm_level1,&myid);
dtime(&stime);
/****************************
allocation of arrays
*****************************/
Indicator = (int*)malloc(sizeof(int)*numprocs);
S_array = (int**)malloc(sizeof(int*)*numprocs);
for (ID=0; ID<numprocs; ID++){
S_array[ID] = (int*)malloc(sizeof(int)*3);
}
R_array = (int**)malloc(sizeof(int*)*numprocs);
for (ID=0; ID<numprocs; ID++){
R_array[ID] = (int*)malloc(sizeof(int)*3);
}
Snd_DS_NL_Size = (int*)malloc(sizeof(int)*numprocs);
Rcv_DS_NL_Size = (int*)malloc(sizeof(int)*numprocs);
/* initialize the temporal array storing the force contribution */
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
Gc_AN = F_M2G[Mc_AN];
Gxyz[Gc_AN][41] = 0.0;
Gxyz[Gc_AN][42] = 0.0;
Gxyz[Gc_AN][43] = 0.0;
}
/*************************************************************
contraction of DS_NL
Note: DS_NL is overwritten by CntDS_NL in Cont_Matrix1().
*************************************************************/
if (Cnt_switch==1){
for (so=0; so<(SO_switch+1); so++){
Cont_Matrix1(DS_NL[so][0],CntDS_NL[so][0]);
Cont_Matrix1(DS_NL[so][1],CntDS_NL[so][1]);
Cont_Matrix1(DS_NL[so][2],CntDS_NL[so][2]);
Cont_Matrix1(DS_NL[so][3],CntDS_NL[so][3]);
}
}
/*****************************************}**********************
THE FIRST CASE:
In case of I=i or I=j
for d [ \sum_k <i|k>ek<k|j> ]/dRI
****************************************************************/
/*******************************************************
*******************************************************
multiplying overlap integrals WITH COMMUNICATION
In case of I=i or I=j
for d [ \sum_k <i|k>ek<k|j> ]/dRI
*******************************************************
*******************************************************/
MPI_Barrier(mpi_comm_level1);
dtime(&stime);
Hx0 = (dcomplex***)malloc(sizeof(dcomplex**)*3);
for (i=0; i<3; i++){
Hx0[i] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hx0[i][j] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
Hy0 = (dcomplex***)malloc(sizeof(dcomplex**)*3);
for (i=0; i<3; i++){
Hy0[i] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hy0[i][j] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
Hz0 = (dcomplex***)malloc(sizeof(dcomplex**)*3);
for (i=0; i<3; i++){
Hz0[i] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hz0[i][j] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
Hx1 = (dcomplex***)malloc(sizeof(dcomplex**)*3);
for (i=0; i<3; i++){
Hx1[i] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hx1[i][j] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
Hy1 = (dcomplex***)malloc(sizeof(dcomplex**)*3);
for (i=0; i<3; i++){
Hy1[i] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hy1[i][j] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
Hz1 = (dcomplex***)malloc(sizeof(dcomplex**)*3);
for (i=0; i<3; i++){
Hz1[i] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hz1[i][j] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
for (ID=0; ID<numprocs; ID++){
F_Snd_Num_WK[ID] = 0;
F_Rcv_Num_WK[ID] = 0;
}
do {
/***********************************
set the size of data
************************************/
for (ID=0; ID<numprocs; ID++){
IDS = (myid + ID) % numprocs;
IDR = (myid - ID + numprocs) % numprocs;
/* find the data size to send the block data */
if ( 0<(F_Snd_Num[IDS]-F_Snd_Num_WK[IDS]) ){
size1 = 0;
n = F_Snd_Num_WK[IDS];
Mc_AN = Snd_MAN[IDS][n];
Gc_AN = Snd_GAN[IDS][n];
Cwan = WhatSpecies[Gc_AN];
tno1 = Spe_Total_NO[Cwan];
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
Gh_AN = natn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
tno2 = Spe_Total_VPS_Pro[Hwan];
size1 += (VPS_j_dependency[Hwan]+1)*tno1*tno2;
}
Snd_DS_NL_Size[IDS] = size1;
MPI_Isend(&size1, 1, MPI_INT, IDS, tag, mpi_comm_level1, &request);
}
else{
Snd_DS_NL_Size[IDS] = 0;
}
/* receiving of the size of the data */
if ( 0<(F_Rcv_Num[IDR]-F_Rcv_Num_WK[IDR]) ){
MPI_Recv(&size2, 1, MPI_INT, IDR, tag, mpi_comm_level1, &stat);
Rcv_DS_NL_Size[IDR] = size2;
}
else{
Rcv_DS_NL_Size[IDR] = 0;
}
if ( 0<(F_Snd_Num[IDS]-F_Snd_Num_WK[IDS]) ) MPI_Wait(&request,&stat);
} /* ID */
/***********************************
data transfer
************************************/
for (ID=0; ID<numprocs; ID++){
IDS = (myid + ID) % numprocs;
IDR = (myid - ID + numprocs) % numprocs;
/******************************
sending of the data
******************************/
if ( 0<(F_Snd_Num[IDS]-F_Snd_Num_WK[IDS]) ){
size1 = Snd_DS_NL_Size[IDS];
/* allocation of the array */
tmp_array = (double*)malloc(sizeof(double)*size1);
/* multidimentional array to the vector array */
num = 0;
n = F_Snd_Num_WK[IDS];
Mc_AN = Snd_MAN[IDS][n];
Gc_AN = Snd_GAN[IDS][n];
Cwan = WhatSpecies[Gc_AN];
tno1 = Spe_Total_NO[Cwan];
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
Gh_AN = natn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
tno2 = Spe_Total_VPS_Pro[Hwan];
for (so=0; so<=VPS_j_dependency[Hwan]; so++){
for (i=0; i<tno1; i++){
for (j=0; j<tno2; j++){
tmp_array[num] = DS_NL[so][0][Mc_AN][h_AN][i][j];
num++;
}
}
}
}
MPI_Isend(&tmp_array[0], size1, MPI_DOUBLE, IDS, tag, mpi_comm_level1, &request);
}
/******************************
receiving of the block data
******************************/
if ( 0<(F_Rcv_Num[IDR]-F_Rcv_Num_WK[IDR]) ){
size2 = Rcv_DS_NL_Size[IDR];
tmp_array2 = (double*)malloc(sizeof(double)*size2);
MPI_Recv(&tmp_array2[0], size2, MPI_DOUBLE, IDR, tag, mpi_comm_level1, &stat);
/* store */
num = 0;
n = F_Rcv_Num_WK[IDR];
Original_Mc_AN = F_TopMAN[IDR] + n;
Gc_AN = Rcv_GAN[IDR][n];
Cwan = WhatSpecies[Gc_AN];
tno1 = Spe_Total_NO[Cwan];
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
Gh_AN = natn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
tno2 = Spe_Total_VPS_Pro[Hwan];
for (so=0; so<=VPS_j_dependency[Hwan]; so++){
for (i=0; i<tno1; i++){
for (j=0; j<tno2; j++){
DS_NL[so][0][Matomnum+1][h_AN][i][j] = tmp_array2[num];
num++;
}
}
}
}
/* free tmp_array2 */
free(tmp_array2);
/*****************************************************************
multiplying overlap integrals
*****************************************************************/
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
dtime(&Stime_atom);
dEx = 0.0;
dEy = 0.0;
dEz = 0.0;
Gc_AN = M2G[Mc_AN];
Cwan = WhatSpecies[Gc_AN];
fan = FNAN[Gc_AN];
h_AN = 0;
Gh_AN = natn[Gc_AN][h_AN];
Mh_AN = F_G2M[Gh_AN];
Hwan = WhatSpecies[Gh_AN];
ian = Spe_Total_CNO[Hwan];
n = F_Rcv_Num_WK[IDR];
jg = Rcv_GAN[IDR][n];
for (j0=0; j0<=fan; j0++){
jg0 = natn[Gc_AN][j0];
Mj_AN0 = F_G2M[jg0];
po2 = 0;
if (Original_Mc_AN==Mj_AN0){
po2 = 1;
q_AN = j0;
}
if (po2==1){
Gq_AN = natn[Gc_AN][q_AN];
Mq_AN = F_G2M[Gq_AN];
Qwan = WhatSpecies[Gq_AN];
jan = Spe_Total_CNO[Qwan];
kl = RMI1[Mc_AN][h_AN][q_AN];
dHNL(0,Mc_AN,h_AN,q_AN,DS_NL,Hx0,Hy0,Hz0);
/* contribution of force = Trace(CDM0*dH) */
/* spin non-polarization */
if (SpinP_switch==0){
if (q_AN==h_AN) pref = 2.0;
else pref = 4.0;
for (i=0; i<ian; i++){
for (j=0; j<jan; j++){
dEx += pref*CDM0[0][Mh_AN][kl][i][j]*Hx0[0][i][j].r;
dEy += pref*CDM0[0][Mh_AN][kl][i][j]*Hy0[0][i][j].r;
dEz += pref*CDM0[0][Mh_AN][kl][i][j]*Hz0[0][i][j].r;
}
}
}
/* collinear spin polarized or non-colliear without SO and LDA+U */
else if (SpinP_switch==1 || (SpinP_switch==3 && SO_switch==0 && Hub_U_switch==0
&& Constraint_NCS_switch==0 && Zeeman_NCS_switch==0 && Zeeman_NCO_switch==0)){
if (q_AN==h_AN) pref = 1.0;
else pref = 2.0;
for (i=0; i<Spe_Total_CNO[Hwan]; i++){
for (j=0; j<Spe_Total_CNO[Qwan]; j++){
dEx += pref*( CDM0[0][Mh_AN][kl][i][j]*Hx0[0][i][j].r
+ CDM0[1][Mh_AN][kl][i][j]*Hx0[1][i][j].r);
dEy += pref*( CDM0[0][Mh_AN][kl][i][j]*Hy0[0][i][j].r
+ CDM0[1][Mh_AN][kl][i][j]*Hy0[1][i][j].r);
dEz += pref*( CDM0[0][Mh_AN][kl][i][j]*Hz0[0][i][j].r
+ CDM0[1][Mh_AN][kl][i][j]*Hz0[1][i][j].r);
}
}
}
/* spin non-collinear with spin-orbit coupling or with LDA+U */
else if ( SpinP_switch==3 && (SO_switch==1 || (Hub_U_switch==1 && F_U_flag==1)
|| 1<=Constraint_NCS_switch || Zeeman_NCS_switch==1 || Zeeman_NCO_switch==1)){
if (q_AN==h_AN){
for (i=0; i<Spe_Total_CNO[Hwan]; i++){
for (j=0; j<Spe_Total_CNO[Qwan]; j++){
dEx +=
CDM0[0][Mh_AN][kl][i][j]*Hx0[0][i][j].r
- iDM0[0][Mh_AN][kl][i][j]*Hx0[0][i][j].i
+ CDM0[1][Mh_AN][kl][i][j]*Hx0[1][i][j].r
- iDM0[1][Mh_AN][kl][i][j]*Hx0[1][i][j].i
+ 2.0*CDM0[2][Mh_AN][kl][i][j]*Hx0[2][i][j].r
- 2.0*CDM0[3][Mh_AN][kl][i][j]*Hx0[2][i][j].i;
dEy +=
CDM0[0][Mh_AN][kl][i][j]*Hy0[0][i][j].r
- iDM0[0][Mh_AN][kl][i][j]*Hy0[0][i][j].i
+ CDM0[1][Mh_AN][kl][i][j]*Hy0[1][i][j].r
- iDM0[1][Mh_AN][kl][i][j]*Hy0[1][i][j].i
+ 2.0*CDM0[2][Mh_AN][kl][i][j]*Hy0[2][i][j].r
- 2.0*CDM0[3][Mh_AN][kl][i][j]*Hy0[2][i][j].i;
dEz +=
CDM0[0][Mh_AN][kl][i][j]*Hz0[0][i][j].r
- iDM0[0][Mh_AN][kl][i][j]*Hz0[0][i][j].i
+ CDM0[1][Mh_AN][kl][i][j]*Hz0[1][i][j].r
- iDM0[1][Mh_AN][kl][i][j]*Hz0[1][i][j].i
+ 2.0*CDM0[2][Mh_AN][kl][i][j]*Hz0[2][i][j].r
- 2.0*CDM0[3][Mh_AN][kl][i][j]*Hz0[2][i][j].i;
}
}
}
else {
for (i=0; i<Spe_Total_CNO[Hwan]; i++){ /* Hwan */
for (j=0; j<Spe_Total_CNO[Qwan]; j++){ /* Qwan */
dEx +=
CDM0[0][Mh_AN][kl ][i][j]*Hx0[0][i][j].r
- iDM0[0][Mh_AN][kl ][i][j]*Hx0[0][i][j].i
+ CDM0[1][Mh_AN][kl ][i][j]*Hx0[1][i][j].r
- iDM0[1][Mh_AN][kl ][i][j]*Hx0[1][i][j].i
+ 2.0*CDM0[2][Mh_AN][kl ][i][j]*Hx0[2][i][j].r
- 2.0*CDM0[3][Mh_AN][kl ][i][j]*Hx0[2][i][j].i;
dEy +=
CDM0[0][Mh_AN][kl ][i][j]*Hy0[0][i][j].r
- iDM0[0][Mh_AN][kl ][i][j]*Hy0[0][i][j].i
+ CDM0[1][Mh_AN][kl ][i][j]*Hy0[1][i][j].r
- iDM0[1][Mh_AN][kl ][i][j]*Hy0[1][i][j].i
+ 2.0*CDM0[2][Mh_AN][kl ][i][j]*Hy0[2][i][j].r
- 2.0*CDM0[3][Mh_AN][kl ][i][j]*Hy0[2][i][j].i;
dEz +=
CDM0[0][Mh_AN][kl ][i][j]*Hz0[0][i][j].r
- iDM0[0][Mh_AN][kl ][i][j]*Hz0[0][i][j].i
+ CDM0[1][Mh_AN][kl ][i][j]*Hz0[1][i][j].r
- iDM0[1][Mh_AN][kl ][i][j]*Hz0[1][i][j].i
+ 2.0*CDM0[2][Mh_AN][kl ][i][j]*Hz0[2][i][j].r
- 2.0*CDM0[3][Mh_AN][kl ][i][j]*Hz0[2][i][j].i;
} /* j */
} /* i */
dHNL(0,Mc_AN,q_AN,h_AN,DS_NL,Hx1,Hy1,Hz1);
kl1 = RMI1[Mc_AN][q_AN][h_AN];
for (i=0; i<Spe_Total_CNO[Qwan]; i++){ /* Qwan */
for (j=0; j<Spe_Total_CNO[Hwan]; j++){ /* Hwan */
dEx +=
CDM0[0][Mq_AN][kl1][i][j]*Hx1[0][i][j].r
- iDM0[0][Mq_AN][kl1][i][j]*Hx1[0][i][j].i
+ CDM0[1][Mq_AN][kl1][i][j]*Hx1[1][i][j].r
- iDM0[1][Mq_AN][kl1][i][j]*Hx1[1][i][j].i
+ 2.0*CDM0[2][Mq_AN][kl1][i][j]*Hx1[2][i][j].r
- 2.0*CDM0[3][Mq_AN][kl1][i][j]*Hx1[2][i][j].i;
dEy +=
CDM0[0][Mq_AN][kl1][i][j]*Hy1[0][i][j].r
- iDM0[0][Mq_AN][kl1][i][j]*Hy1[0][i][j].i
+ CDM0[1][Mq_AN][kl1][i][j]*Hy1[1][i][j].r
- iDM0[1][Mq_AN][kl1][i][j]*Hy1[1][i][j].i
+ 2.0*CDM0[2][Mq_AN][kl1][i][j]*Hy1[2][i][j].r
- 2.0*CDM0[3][Mq_AN][kl1][i][j]*Hy1[2][i][j].i;
dEz +=
CDM0[0][Mq_AN][kl1][i][j]*Hz1[0][i][j].r
- iDM0[0][Mq_AN][kl1][i][j]*Hz1[0][i][j].i
+ CDM0[1][Mq_AN][kl1][i][j]*Hz1[1][i][j].r
- iDM0[1][Mq_AN][kl1][i][j]*Hz1[1][i][j].i
+ 2.0*CDM0[2][Mq_AN][kl1][i][j]*Hz1[2][i][j].r
- 2.0*CDM0[3][Mq_AN][kl1][i][j]*Hz1[2][i][j].i;
} /* j */
} /* i */
}
}
} /* if (po2==1) */
} /* j0 */
/* force from #4B */
Gxyz[Gc_AN][41] += dEx;
Gxyz[Gc_AN][42] += dEy;
Gxyz[Gc_AN][43] += dEz;
/* timing */
dtime(&Etime_atom);
time_per_atom[Gc_AN] += Etime_atom - Stime_atom;
} /* Mc_AN */
/********************************************
increment of F_Rcv_Num_WK[IDR]
********************************************/
F_Rcv_Num_WK[IDR]++;
} /* if ( 0<(F_Snd_Num[IDS]-F_Snd_Num_WK[IDS]) ) */
if ( 0<(F_Snd_Num[IDS]-F_Snd_Num_WK[IDS]) ) {
MPI_Wait(&request,&stat);
free(tmp_array); /* freeing of array */
/********************************************
increment of F_Snd_Num_WK[IDS]
********************************************/
F_Snd_Num_WK[IDS]++;
}
} /* ID */
/*****************************************************
check whether all the communications have finished
*****************************************************/
po = 0;
for (ID=0; ID<numprocs; ID++){
IDS = (myid + ID) % numprocs;
IDR = (myid - ID + numprocs) % numprocs;
if ( 0<(F_Snd_Num[IDS]-F_Snd_Num_WK[IDS]) ) po += F_Snd_Num[IDS]-F_Snd_Num_WK[IDS];
if ( 0<(F_Rcv_Num[IDR]-F_Rcv_Num_WK[IDR]) ) po += F_Rcv_Num[IDR]-F_Rcv_Num_WK[IDR];
}
} while (po!=0);
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hx0[i][j]);
}
free(Hx0[i]);
}
free(Hx0);
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hy0[i][j]);
}
free(Hy0[i]);
}
free(Hy0);
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hz0[i][j]);
}
free(Hz0[i]);
}
free(Hz0);
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hx1[i][j]);
}
free(Hx1[i]);
}
free(Hx1);
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hy1[i][j]);
}
free(Hy1[i]);
}
free(Hy1);
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hz1[i][j]);
}
free(Hz1[i]);
}
free(Hz1);
dtime(&etime);
if(myid==0 && measure_time){
printf("Time for part1 of force_NL=%18.5f\n",etime-stime);fflush(stdout);
}
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
Gc_AN = M2G[Mc_AN];
if (2<=level_stdout){
printf("<Force> force(HNL1) myid=%2d Mc_AN=%2d Gc_AN=%2d %15.12f %15.12f %15.12f\n",
myid,Mc_AN,Gc_AN,Gxyz[Gc_AN][41],Gxyz[Gc_AN][42],Gxyz[Gc_AN][43]);fflush(stdout);
}
}
/*******************************************************
*******************************************************
THE FIRST CASE:
multiplying overlap integrals WITHOUT COMMUNICATION
In case of I=i or I=j
for d [ \sum_k <i|k>ek<k|j> ]/dRI
*******************************************************
*******************************************************/
dtime(&stime);
#pragma omp parallel shared(time_per_atom,Gxyz,CDM0,SpinP_switch,SO_switch,Hub_U_switch,F_U_flag,Constraint_NCS_switch,Zeeman_NCS_switch,Zeeman_NCO_switch,DS_NL,RMI1,FNAN,Spe_Total_CNO,WhatSpecies,F_G2M,natn,M2G,Matomnum,List_YOUSO,F_NL_flag) private(Hx0,Hy0,Hz0,Hx1,Hy1,Hz1,OMPID,Nthrds,Nprocs,Mc_AN,Stime_atom,Etime_atom,dEx,dEy,dEz,Gc_AN,h_AN,Gh_AN,Mh_AN,Hwan,ian,q_AN,Gq_AN,Mq_AN,Qwan,jan,kl,kl1,i,j,kk,pref)
{
/* allocation of array */
Hx0 = (dcomplex***)malloc(sizeof(dcomplex**)*3);
for (i=0; i<3; i++){
Hx0[i] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hx0[i][j] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
Hy0 = (dcomplex***)malloc(sizeof(dcomplex**)*3);
for (i=0; i<3; i++){
Hy0[i] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hy0[i][j] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
Hz0 = (dcomplex***)malloc(sizeof(dcomplex**)*3);
for (i=0; i<3; i++){
Hz0[i] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hz0[i][j] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
Hx1 = (dcomplex***)malloc(sizeof(dcomplex**)*3);
for (i=0; i<3; i++){
Hx1[i] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hx1[i][j] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
Hy1 = (dcomplex***)malloc(sizeof(dcomplex**)*3);
for (i=0; i<3; i++){
Hy1[i] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hy1[i][j] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
Hz1 = (dcomplex***)malloc(sizeof(dcomplex**)*3);
for (i=0; i<3; i++){
Hz1[i] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hz1[i][j] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
/* get info. on OpenMP */
OMPID = omp_get_thread_num();
Nthrds = omp_get_num_threads();
Nprocs = omp_get_num_procs();
for (Mc_AN=(OMPID*Matomnum/Nthrds+1); Mc_AN<((OMPID+1)*Matomnum/Nthrds+1); Mc_AN++){
dtime(&Stime_atom);
dEx = 0.0;
dEy = 0.0;
dEz = 0.0;
Gc_AN = M2G[Mc_AN];
h_AN = 0;
Gh_AN = natn[Gc_AN][h_AN];
Mh_AN = F_G2M[Gh_AN];
Hwan = WhatSpecies[Gh_AN];
ian = Spe_Total_CNO[Hwan];
for (q_AN=0; q_AN<=FNAN[Gc_AN]; q_AN++){
Gq_AN = natn[Gc_AN][q_AN];
Mq_AN = F_G2M[Gq_AN];
if (Mq_AN<=Matomnum){
Qwan = WhatSpecies[Gq_AN];
jan = Spe_Total_CNO[Qwan];
kl = RMI1[Mc_AN][h_AN][q_AN];
dHNL(0,Mc_AN,h_AN,q_AN,DS_NL,Hx0,Hy0,Hz0);
if (SpinP_switch==0){
if (q_AN==h_AN) pref = 2.0;
else pref = 4.0;
for (i=0; i<ian; i++){
for (j=0; j<jan; j++){
dEx += pref*CDM0[0][Mh_AN][kl][i][j]*Hx0[0][i][j].r;
dEy += pref*CDM0[0][Mh_AN][kl][i][j]*Hy0[0][i][j].r;
dEz += pref*CDM0[0][Mh_AN][kl][i][j]*Hz0[0][i][j].r;
}
}
}
/* collinear spin polarized or non-colliear without SO and LDA+U */
else if (SpinP_switch==1 || (SpinP_switch==3 && SO_switch==0 && Hub_U_switch==0
&& Constraint_NCS_switch==0 && Zeeman_NCS_switch==0 && Zeeman_NCO_switch==0)){
if (q_AN==h_AN) pref = 1.0;
else pref = 2.0;
for (i=0; i<ian; i++){
for (j=0; j<jan; j++){
dEx += pref*( CDM0[0][Mh_AN][kl][i][j]*Hx0[0][i][j].r
+ CDM0[1][Mh_AN][kl][i][j]*Hx0[1][i][j].r);
dEy += pref*( CDM0[0][Mh_AN][kl][i][j]*Hy0[0][i][j].r
+ CDM0[1][Mh_AN][kl][i][j]*Hy0[1][i][j].r);
dEz += pref*( CDM0[0][Mh_AN][kl][i][j]*Hz0[0][i][j].r
+ CDM0[1][Mh_AN][kl][i][j]*Hz0[1][i][j].r);
}
}
}
/* spin non-collinear with spin-orbit coupling or with LDA+U */
else if ( SpinP_switch==3 && (SO_switch==1 || (Hub_U_switch==1 && F_U_flag==1)
|| 1<=Constraint_NCS_switch || Zeeman_NCS_switch==1 || Zeeman_NCO_switch==1)){
if (q_AN==h_AN){
for (i=0; i<Spe_Total_CNO[Hwan]; i++){
for (j=0; j<Spe_Total_CNO[Qwan]; j++){
dEx +=
CDM0[0][Mh_AN][kl][i][j]*Hx0[0][i][j].r
- iDM0[0][Mh_AN][kl][i][j]*Hx0[0][i][j].i
+ CDM0[1][Mh_AN][kl][i][j]*Hx0[1][i][j].r
- iDM0[1][Mh_AN][kl][i][j]*Hx0[1][i][j].i
+ 2.0*CDM0[2][Mh_AN][kl][i][j]*Hx0[2][i][j].r
- 2.0*CDM0[3][Mh_AN][kl][i][j]*Hx0[2][i][j].i;
dEy +=
CDM0[0][Mh_AN][kl][i][j]*Hy0[0][i][j].r
- iDM0[0][Mh_AN][kl][i][j]*Hy0[0][i][j].i
+ CDM0[1][Mh_AN][kl][i][j]*Hy0[1][i][j].r
- iDM0[1][Mh_AN][kl][i][j]*Hy0[1][i][j].i
+ 2.0*CDM0[2][Mh_AN][kl][i][j]*Hy0[2][i][j].r
- 2.0*CDM0[3][Mh_AN][kl][i][j]*Hy0[2][i][j].i;
dEz +=
CDM0[0][Mh_AN][kl][i][j]*Hz0[0][i][j].r
- iDM0[0][Mh_AN][kl][i][j]*Hz0[0][i][j].i
+ CDM0[1][Mh_AN][kl][i][j]*Hz0[1][i][j].r
- iDM0[1][Mh_AN][kl][i][j]*Hz0[1][i][j].i
+ 2.0*CDM0[2][Mh_AN][kl][i][j]*Hz0[2][i][j].r
- 2.0*CDM0[3][Mh_AN][kl][i][j]*Hz0[2][i][j].i;
}
}
}
else{
for (i=0; i<Spe_Total_CNO[Hwan]; i++){ /* Hwan */
for (j=0; j<Spe_Total_CNO[Qwan]; j++){ /* Qwan */
dEx +=
CDM0[0][Mh_AN][kl ][i][j]*Hx0[0][i][j].r
- iDM0[0][Mh_AN][kl ][i][j]*Hx0[0][i][j].i
+ CDM0[1][Mh_AN][kl ][i][j]*Hx0[1][i][j].r
- iDM0[1][Mh_AN][kl ][i][j]*Hx0[1][i][j].i
+ 2.0*CDM0[2][Mh_AN][kl ][i][j]*Hx0[2][i][j].r
- 2.0*CDM0[3][Mh_AN][kl ][i][j]*Hx0[2][i][j].i;
dEy +=
CDM0[0][Mh_AN][kl ][i][j]*Hy0[0][i][j].r
- iDM0[0][Mh_AN][kl ][i][j]*Hy0[0][i][j].i
+ CDM0[1][Mh_AN][kl ][i][j]*Hy0[1][i][j].r
- iDM0[1][Mh_AN][kl ][i][j]*Hy0[1][i][j].i
+ 2.0*CDM0[2][Mh_AN][kl ][i][j]*Hy0[2][i][j].r
- 2.0*CDM0[3][Mh_AN][kl ][i][j]*Hy0[2][i][j].i;
dEz +=
CDM0[0][Mh_AN][kl ][i][j]*Hz0[0][i][j].r
- iDM0[0][Mh_AN][kl ][i][j]*Hz0[0][i][j].i
+ CDM0[1][Mh_AN][kl ][i][j]*Hz0[1][i][j].r
- iDM0[1][Mh_AN][kl ][i][j]*Hz0[1][i][j].i
+ 2.0*CDM0[2][Mh_AN][kl ][i][j]*Hz0[2][i][j].r
- 2.0*CDM0[3][Mh_AN][kl ][i][j]*Hz0[2][i][j].i;
} /* j */
} /* i */
dHNL(0,Mc_AN,q_AN,h_AN,DS_NL,Hx1,Hy1,Hz1);
kl1 = RMI1[Mc_AN][q_AN][h_AN];
for (i=0; i<Spe_Total_CNO[Qwan]; i++){ /* Qwan */
for (j=0; j<Spe_Total_CNO[Hwan]; j++){ /* Hwan */
dEx +=
CDM0[0][Mq_AN][kl1][i][j]*Hx1[0][i][j].r
- iDM0[0][Mq_AN][kl1][i][j]*Hx1[0][i][j].i
+ CDM0[1][Mq_AN][kl1][i][j]*Hx1[1][i][j].r
- iDM0[1][Mq_AN][kl1][i][j]*Hx1[1][i][j].i
+ 2.0*CDM0[2][Mq_AN][kl1][i][j]*Hx1[2][i][j].r
- 2.0*CDM0[3][Mq_AN][kl1][i][j]*Hx1[2][i][j].i;
dEy +=
CDM0[0][Mq_AN][kl1][i][j]*Hy1[0][i][j].r
- iDM0[0][Mq_AN][kl1][i][j]*Hy1[0][i][j].i
+ CDM0[1][Mq_AN][kl1][i][j]*Hy1[1][i][j].r
- iDM0[1][Mq_AN][kl1][i][j]*Hy1[1][i][j].i
+ 2.0*CDM0[2][Mq_AN][kl1][i][j]*Hy1[2][i][j].r
- 2.0*CDM0[3][Mq_AN][kl1][i][j]*Hy1[2][i][j].i;
dEz +=
CDM0[0][Mq_AN][kl1][i][j]*Hz1[0][i][j].r
- iDM0[0][Mq_AN][kl1][i][j]*Hz1[0][i][j].i
+ CDM0[1][Mq_AN][kl1][i][j]*Hz1[1][i][j].r
- iDM0[1][Mq_AN][kl1][i][j]*Hz1[1][i][j].i
+ 2.0*CDM0[2][Mq_AN][kl1][i][j]*Hz1[2][i][j].r
- 2.0*CDM0[3][Mq_AN][kl1][i][j]*Hz1[2][i][j].i;
} /* j */
} /* i */
}
}
}
}
/* force from #4B */
if (F_NL_flag==1){
Gxyz[Gc_AN][41] += dEx;
Gxyz[Gc_AN][42] += dEy;
Gxyz[Gc_AN][43] += dEz;
}
/* timing */
dtime(&Etime_atom);
time_per_atom[Gc_AN] += Etime_atom - Stime_atom;
} /* Mc_AN */
/* freeing of array */
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hx0[i][j]);
}
free(Hx0[i]);
}
free(Hx0);
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hy0[i][j]);
}
free(Hy0[i]);
}
free(Hy0);
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hz0[i][j]);
}
free(Hz0[i]);
}
free(Hz0);
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hx1[i][j]);
}
free(Hx1[i]);
}
free(Hx1);
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hy1[i][j]);
}
free(Hy1[i]);
}
free(Hy1);
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hz1[i][j]);
}
free(Hz1[i]);
}
free(Hz1);
} /* #pragma omp parallel */
dtime(&etime);
if(myid==0 && measure_time){
printf("Time for part2 of force_NL=%18.5f\n",etime-stime);fflush(stdout);
}
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
Gc_AN = M2G[Mc_AN];
if (2<=level_stdout){
printf("<Force> force(HNL2) myid=%2d Mc_AN=%2d Gc_AN=%2d %15.12f %15.12f %15.12f\n",
myid,Mc_AN,Gc_AN,Gxyz[Gc_AN][41],Gxyz[Gc_AN][42],Gxyz[Gc_AN][43]);fflush(stdout);
}
}
/*************************************************************
THE SECOND CASE:
In case of I=k with I!=i and I!=j
d [ \sum_k <i|k>ek<k|j> ]/dRI
*************************************************************/
/************************************************************
MPI communication of DS_NL whose basis part is not located
on own site but projector part is located on own site.
************************************************************/
MPI_Barrier(mpi_comm_level1);
dtime(&stime);
for (ID=0; ID<numprocs; ID++) Indicator[ID] = 0;
for (Mc_AN=1; Mc_AN<=Max_Matomnum; Mc_AN++){
if (Mc_AN<=Matomnum) Gc_AN = M2G[Mc_AN];
else Gc_AN = 0;
for (ID=0; ID<numprocs; ID++){
IDS = (myid + ID) % numprocs;
IDR = (myid - ID + numprocs) % numprocs;
i = Indicator[IDS];
po = 0;
Gh_AN = Pro_Snd_GAtom[IDS][i];
if (Gh_AN!=0){
/* find the range with the same global atomic number */
do {
i++;
if (Gh_AN!=Pro_Snd_GAtom[IDS][i]) po = 1;
} while(po==0);
i--;
SA_num = i - Indicator[IDS] + 1;
/* find the data size to send the block data */
size1 = 0;
for (q=Indicator[IDS]; q<=(Indicator[IDS]+SA_num-1); q++){
Sc_AN = Pro_Snd_MAtom[IDS][q];
GSc_AN = F_M2G[Sc_AN];
Sc_wan = WhatSpecies[GSc_AN];
tno1 = Spe_Total_CNO[Sc_wan];
Sh_AN = Pro_Snd_LAtom[IDS][q];
GSh_AN = natn[GSc_AN][Sh_AN];
Sh_wan = WhatSpecies[GSh_AN];
tno2 = Spe_Total_VPS_Pro[Sh_wan];
smul = (VPS_j_dependency[Sh_wan]+1);
size1 += smul*4*tno1*tno2;
size1 += 3;
}
} /* if (Gh_AN!=0) */
else {
SA_num = 0;
size1 = 0;
}
S_array[IDS][0] = Gh_AN;
S_array[IDS][1] = SA_num;
S_array[IDS][2] = size1;
if (ID!=0){
MPI_Isend(&S_array[IDS][0], 3, MPI_INT, IDS, tag, mpi_comm_level1, &request);
MPI_Recv( &R_array[IDR][0], 3, MPI_INT, IDR, tag, mpi_comm_level1, &stat);
MPI_Wait(&request,&stat);
}
else {
R_array[myid][0] = S_array[myid][0];
R_array[myid][1] = S_array[myid][1];
R_array[myid][2] = S_array[myid][2];
}
if (R_array[IDR][0]==Gc_AN) R_comm_flag = 1;
else R_comm_flag = 0;
if (ID!=0){
MPI_Isend(&R_comm_flag, 1, MPI_INT, IDR, tag, mpi_comm_level1, &request);
MPI_Recv( &S_comm_flag, 1, MPI_INT, IDS, tag, mpi_comm_level1, &stat);
MPI_Wait(&request,&stat);
}
else{
S_comm_flag = R_comm_flag;
}
/*****************************************
send the data
*****************************************/
/* if (S_comm_flag==1) then, send data to IDS */
if (S_comm_flag==1){
/* allocate tmp_array */
tmp_array = (double*)malloc(sizeof(double)*size1);
/* multidimentional array to vector array */
num = 0;
for (q=Indicator[IDS]; q<=(Indicator[IDS]+SA_num-1); q++){
Sc_AN = Pro_Snd_MAtom[IDS][q];
GSc_AN = F_M2G[Sc_AN];
Sc_wan = WhatSpecies[GSc_AN];
tno1 = Spe_Total_CNO[Sc_wan];
Sh_AN = Pro_Snd_LAtom[IDS][q];
GSh_AN = natn[GSc_AN][Sh_AN];
Sh_wan = WhatSpecies[GSh_AN];
tno2 = Spe_Total_VPS_Pro[Sh_wan];
Sh_AN2 = Pro_Snd_LAtom2[IDS][q];
tmp_array[num] = (double)Sc_AN; num++;
tmp_array[num] = (double)Sh_AN; num++;
tmp_array[num] = (double)Sh_AN2; num++;
for (so=0; so<=VPS_j_dependency[Sh_wan]; so++){
for (kk=0; kk<=3; kk++){
for (i=0; i<tno1; i++){
for (j=0; j<tno2; j++){
tmp_array[num] = DS_NL[so][kk][Sc_AN][Sh_AN][i][j];
num++;
}
}
}
}
}
if (ID!=0){
MPI_Isend(&tmp_array[0], size1, MPI_DOUBLE, IDS, tag, mpi_comm_level1, &request);
}
/* update Indicator[IDS] */
Indicator[IDS] += SA_num;
} /* if (S_comm_flag==1) */
/*****************************************
receive the data
*****************************************/
/* if (R_comm_flag==1) then, receive the data from IDR */
if (R_comm_flag==1){
size2 = R_array[IDR][2];
tmp_array2 = (double*)malloc(sizeof(double)*size2);
if (ID!=0){
MPI_Recv(&tmp_array2[0], size2, MPI_DOUBLE, IDR, tag, mpi_comm_level1, &stat);
}
else{
for (i=0; i<size2; i++) tmp_array2[i] = tmp_array[i];
}
/* store */
num = 0;
for (n=0; n<R_array[IDR][1]; n++){
Sc_AN = (int)tmp_array2[num]; num++;
Sh_AN = (int)tmp_array2[num]; num++;
Sh_AN2 = (int)tmp_array2[num]; num++;
GSc_AN = natn[Gc_AN][Sh_AN2];
Sc_wan = WhatSpecies[GSc_AN];
tno1 = Spe_Total_CNO[Sc_wan];
GSh_AN = natn[GSc_AN][Sh_AN];
Sh_wan = WhatSpecies[GSh_AN];
tno2 = Spe_Total_VPS_Pro[Sh_wan];
for (so=0; so<=VPS_j_dependency[Sh_wan]; so++){
for (kk=0; kk<=3; kk++){
for (i=0; i<tno1; i++){
for (j=0; j<tno2; j++){
DS_NL[so][kk][Matomnum+1][Sh_AN2][i][j] = tmp_array2[num];
num++;
}
}
}
}
}
/* free tmp_array2 */
free(tmp_array2);
} /* if (R_comm_flag==1) */
if (S_comm_flag==1){
if (ID!=0) MPI_Wait(&request,&stat);
free(tmp_array); /* freeing of array */
}
} /* ID */
if (Mc_AN<=Matomnum){
/* get Nthrds0 */
#pragma omp parallel shared(Nthrds0)
{
Nthrds0 = omp_get_num_threads();
}
/* allocation of arrays */
dEx_threads = (double*)malloc(sizeof(double)*Nthrds0);
dEy_threads = (double*)malloc(sizeof(double)*Nthrds0);
dEz_threads = (double*)malloc(sizeof(double)*Nthrds0);
for (Nloop=0; Nloop<Nthrds0; Nloop++){
dEx_threads[Nloop] = 0.0;
dEy_threads[Nloop] = 0.0;
dEz_threads[Nloop] = 0.0;
}
/* one-dimensionalize the h_AN and q_AN loops */
OneD2h_AN = (int*)malloc(sizeof(int)*(FNAN[Gc_AN]+1)*(FNAN[Gc_AN]+2));
OneD2q_AN = (int*)malloc(sizeof(int)*(FNAN[Gc_AN]+1)*(FNAN[Gc_AN]+2));
ODNloop = 0;
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
if ( SpinP_switch==3 && (SO_switch==1 || (Hub_U_switch==1 && F_U_flag==1)
|| 1<=Constraint_NCS_switch || Zeeman_NCS_switch==1 || Zeeman_NCO_switch==1)
|| (Solver==5 || Solver==8 || Solver==11) )
start_q_AN = 0;
else
start_q_AN = h_AN;
for (q_AN=start_q_AN; q_AN<=FNAN[Gc_AN]; q_AN++){
kl = RMI1[Mc_AN][h_AN][q_AN];
if (0<=kl){
OneD2h_AN[ODNloop] = h_AN;
OneD2q_AN[ODNloop] = q_AN;
ODNloop++;
}
}
}
#pragma omp parallel shared(ODNloop,OneD2h_AN,OneD2q_AN,Mc_AN,Gc_AN,dEx_threads,dEy_threads,dEz_threads,CDM0,SpinP_switch,SO_switch,Hub_U_switch,Constraint_NCS_switch,Zeeman_NCS_switch,Zeeman_NCO_switch,DS_NL,RMI1,Spe_Total_CNO,WhatSpecies,F_G2M,natn,FNAN,List_YOUSO,Solver,F_NL_flag,F_U_flag) private(OMPID,Nthrds,Nprocs,Hx,Hy,Hz,i,j,h_AN,Gh_AN,Mh_AN,Hwan,ian,q_AN,Gq_AN,Mq_AN,Qwan,jan,kl,km,Nloop,pref)
{
/* allocation of arrays */
Hx = (dcomplex***)malloc(sizeof(dcomplex**)*3);
for (i=0; i<3; i++){
Hx[i] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hx[i][j] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
Hy = (dcomplex***)malloc(sizeof(dcomplex**)*3);
for (i=0; i<3; i++){
Hy[i] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hy[i][j] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
Hz = (dcomplex***)malloc(sizeof(dcomplex**)*3);
for (i=0; i<3; i++){
Hz[i] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hz[i][j] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
/* get info. on OpenMP */
OMPID = omp_get_thread_num();
Nthrds = omp_get_num_threads();
Nprocs = omp_get_num_procs();
for (Nloop=OMPID*ODNloop/Nthrds; Nloop<(OMPID+1)*ODNloop/Nthrds; Nloop++){
/* get h_AN and q_AN */
h_AN = OneD2h_AN[Nloop];
q_AN = OneD2q_AN[Nloop];
/* set informations on h_AN */
Gh_AN = natn[Gc_AN][h_AN];
Mh_AN = F_G2M[Gh_AN];
Hwan = WhatSpecies[Gh_AN];
ian = Spe_Total_CNO[Hwan];
/* set informations on q_AN */
Gq_AN = natn[Gc_AN][q_AN];
Mq_AN = F_G2M[Gq_AN];
Qwan = WhatSpecies[Gq_AN];
jan = Spe_Total_CNO[Qwan];
kl = RMI1[Mc_AN][h_AN][q_AN];
km = RMI1[Mc_AN][q_AN][h_AN];
if (0<=kl){
dHNL(1,Mc_AN,h_AN,q_AN,DS_NL,Hx,Hy,Hz);
/* contribution of force = Trace(CDM0*dH) */
/* spin non-polarization */
if (SpinP_switch==0){
if (Solver==5 || Solver==8 || Solver==11){
pref = 2.0;
}
else {
if (q_AN==h_AN) pref = 2.0;
else pref = 4.0;
}
for (i=0; i<ian; i++){
for (j=0; j<jan; j++){
dEx_threads[OMPID] += pref*CDM0[0][Mh_AN][kl][i][j]*Hx[0][i][j].r;
dEy_threads[OMPID] += pref*CDM0[0][Mh_AN][kl][i][j]*Hy[0][i][j].r;
dEz_threads[OMPID] += pref*CDM0[0][Mh_AN][kl][i][j]*Hz[0][i][j].r;
}
}
}
/* collinear spin polarized or non-colliear without SO and LDA+U */
else if (SpinP_switch==1 || (SpinP_switch==3 && SO_switch==0 && Hub_U_switch==0
&& Constraint_NCS_switch==0 && Zeeman_NCS_switch==0 && Zeeman_NCO_switch==0)){
if (Solver==5 || Solver==8 || Solver==11){
pref = 1.0;
}
else {
if (q_AN==h_AN) pref = 1.0;
else pref = 2.0;
}
for (i=0; i<ian; i++){
for (j=0; j<jan; j++){
dEx_threads[OMPID] += pref*( CDM0[0][Mh_AN][kl][i][j]*Hx[0][i][j].r
+ CDM0[1][Mh_AN][kl][i][j]*Hx[1][i][j].r);
dEy_threads[OMPID] += pref*( CDM0[0][Mh_AN][kl][i][j]*Hy[0][i][j].r
+ CDM0[1][Mh_AN][kl][i][j]*Hy[1][i][j].r);
dEz_threads[OMPID] += pref*( CDM0[0][Mh_AN][kl][i][j]*Hz[0][i][j].r
+ CDM0[1][Mh_AN][kl][i][j]*Hz[1][i][j].r);
}
}
}
/* spin non-collinear with spin-orbit coupling or with LDA+U */
else if ( SpinP_switch==3 && (SO_switch==1 || (Hub_U_switch==1 && F_U_flag==1)
|| 1<=Constraint_NCS_switch || Zeeman_NCS_switch==1 || Zeeman_NCO_switch==1)){
pref = 1.0;
for (i=0; i<ian; i++){
for (j=0; j<jan; j++){
dEx_threads[OMPID] +=
pref*(CDM0[0][Mh_AN][kl][i][j]*Hx[0][i][j].r
- iDM0[0][Mh_AN][kl][i][j]*Hx[0][i][j].i
+ CDM0[1][Mh_AN][kl][i][j]*Hx[1][i][j].r
- iDM0[1][Mh_AN][kl][i][j]*Hx[1][i][j].i
+ 2.0*CDM0[2][Mh_AN][kl][i][j]*Hx[2][i][j].r
- 2.0*CDM0[3][Mh_AN][kl][i][j]*Hx[2][i][j].i);
dEy_threads[OMPID] +=
pref*(CDM0[0][Mh_AN][kl][i][j]*Hy[0][i][j].r
- iDM0[0][Mh_AN][kl][i][j]*Hy[0][i][j].i
+ CDM0[1][Mh_AN][kl][i][j]*Hy[1][i][j].r
- iDM0[1][Mh_AN][kl][i][j]*Hy[1][i][j].i
+ 2.0*CDM0[2][Mh_AN][kl][i][j]*Hy[2][i][j].r
- 2.0*CDM0[3][Mh_AN][kl][i][j]*Hy[2][i][j].i);
dEz_threads[OMPID] +=
pref*(CDM0[0][Mh_AN][kl][i][j]*Hz[0][i][j].r
- iDM0[0][Mh_AN][kl][i][j]*Hz[0][i][j].i
+ CDM0[1][Mh_AN][kl][i][j]*Hz[1][i][j].r
- iDM0[1][Mh_AN][kl][i][j]*Hz[1][i][j].i
+ 2.0*CDM0[2][Mh_AN][kl][i][j]*Hz[2][i][j].r
- 2.0*CDM0[3][Mh_AN][kl][i][j]*Hz[2][i][j].i);
}
}
}
} /* if (0<=kl) */
} /* Nloop */
/* freeing of arrays */
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hx[i][j]);
}
free(Hx[i]);
}
free(Hx);
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hy[i][j]);
}
free(Hy[i]);
}
free(Hy);
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hz[i][j]);
}
free(Hz[i]);
}
free(Hz);
} /* #pragma omp parallel */
/* sum of dEx_threads */
dEx = 0.0;
dEy = 0.0;
dEz = 0.0;
if (F_NL_flag==1){
for (Nloop=0; Nloop<Nthrds0; Nloop++){
dEx += dEx_threads[Nloop];
dEy += dEy_threads[Nloop];
dEz += dEz_threads[Nloop];
}
/* force from #4B */
Gxyz[Gc_AN][41] += dEx;
Gxyz[Gc_AN][42] += dEy;
Gxyz[Gc_AN][43] += dEz;
}
if (2<=level_stdout){
printf("<Force> force(HNL3) myid=%2d Mc_AN=%2d Gc_AN=%2d %15.12f %15.12f %15.12f\n",
myid,Mc_AN,Gc_AN,dEx,dEy,dEz);fflush(stdout);
}
/* freeing of array */
free(OneD2q_AN);
free(OneD2h_AN);
free(dEx_threads);
free(dEy_threads);
free(dEz_threads);
} /* if (Mc_AN<=Matomnum) */
} /* Mc_AN */
dtime(&etime);
if(myid==0 && measure_time){
printf("Time for part3 of force_NL=%18.5f\n",etime-stime);fflush(stdout);
}
/********************************************************
adding Gxyz[Gc_AN][41,42,43] to Gxyz[Gc_AN][17,18,19]
********************************************************/
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
Gc_AN = M2G[Mc_AN];
if (2<=level_stdout){
printf("<Force> force(HNL) myid=%2d Mc_AN=%2d Gc_AN=%2d %15.12f %15.12f %15.12f\n",
myid,Mc_AN,Gc_AN,Gxyz[Gc_AN][41],Gxyz[Gc_AN][42],Gxyz[Gc_AN][43]);fflush(stdout);
}
Gxyz[Gc_AN][17] += Gxyz[Gc_AN][41];
Gxyz[Gc_AN][18] += Gxyz[Gc_AN][42];
Gxyz[Gc_AN][19] += Gxyz[Gc_AN][43];
}
/***********************************
freeing of arrays
************************************/
free(Indicator);
for (ID=0; ID<numprocs; ID++){
free(S_array[ID]);
}
free(S_array);
for (ID=0; ID<numprocs; ID++){
free(R_array[ID]);
}
free(R_array);
free(Snd_DS_NL_Size);
free(Rcv_DS_NL_Size);
}
void Force4B(double *****CDM0)
{
/****************************************************
#4 of Force
by the projector expansion of VNA
****************************************************/
int Mc_AN,Gc_AN,Cwan,i,j,h_AN,q_AN,start_q_AN,Mq_AN;
int jan,kl,Qwan,Gq_AN,Gh_AN,Mh_AN,Hwan,ian;
int l1,l2,l3,l,LL,Mul1,Num_RVNA,tno0,ncp;
int tno1,tno2,size1,size2,n,kk,num,po,po1,po2;
int numprocs,myid,tag=999,ID,IDS,IDR;
int **S_array,**R_array;
int S_comm_flag,R_comm_flag;
int SA_num,q,Sc_AN,GSc_AN;
int Sc_wan,Sh_AN,GSh_AN,Sh_wan;
int Sh_AN2,fan,jg,j0,jg0,Mj_AN0;
int Original_Mc_AN;
double rcutA,rcutB,rcut;
double dEx,dEy,dEz,ene,pref;
double Stime_atom, Etime_atom;
double **HVNAx,**HVNAy,**HVNAz;
int *VNA_List;
int *VNA_List2;
int *Snd_DS_VNA_Size,*Rcv_DS_VNA_Size;
int *Indicator;
Type_DS_VNA *tmp_array;
Type_DS_VNA *tmp_array2;
/* for OpenMP */
int OMPID,Nthrds,Nthrds0,Nprocs,Nloop,ODNloop;
int *OneD2h_AN,*OneD2q_AN;
double *dEx_threads;
double *dEy_threads;
double *dEz_threads;
double stime,etime;
double stime1,etime1;
MPI_Status stat;
MPI_Request request;
static int counter=0;
counter++;
/* MPI */
MPI_Comm_size(mpi_comm_level1,&numprocs);
MPI_Comm_rank(mpi_comm_level1,&myid);
dtime(&stime);
/****************************
allocation of arrays
*****************************/
Indicator = (int*)malloc(sizeof(int)*numprocs);
S_array = (int**)malloc(sizeof(int*)*numprocs);
for (ID=0; ID<numprocs; ID++){
S_array[ID] = (int*)malloc(sizeof(int)*3);
}
R_array = (int**)malloc(sizeof(int*)*numprocs);
for (ID=0; ID<numprocs; ID++){
R_array[ID] = (int*)malloc(sizeof(int)*3);
}
Snd_DS_VNA_Size = (int*)malloc(sizeof(int)*numprocs);
Rcv_DS_VNA_Size = (int*)malloc(sizeof(int)*numprocs);
VNA_List = (int*)malloc(sizeof(int)*(List_YOUSO[34]*(List_YOUSO[35] + 1)+2) );
VNA_List2 = (int*)malloc(sizeof(int)*(List_YOUSO[34]*(List_YOUSO[35] + 1)+2) );
/* initialize the temporal array storing the force contribution */
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
Gc_AN = F_M2G[Mc_AN];
Gxyz[Gc_AN][41] = 0.0;
Gxyz[Gc_AN][42] = 0.0;
Gxyz[Gc_AN][43] = 0.0;
}
/*************************************************************
contraction of DS_VNA and HVNA2
*************************************************************/
if (Cnt_switch==1 && ProExpn_VNA==1){
Cont_Matrix2(DS_VNA[0],CntDS_VNA[0]);
Cont_Matrix2(DS_VNA[1],CntDS_VNA[1]);
Cont_Matrix2(DS_VNA[2],CntDS_VNA[2]);
Cont_Matrix2(DS_VNA[3],CntDS_VNA[3]);
Cont_Matrix3(HVNA2[1],CntHVNA2[1]);
Cont_Matrix3(HVNA2[2],CntHVNA2[2]);
Cont_Matrix3(HVNA2[3],CntHVNA2[3]);
Cont_Matrix4(HVNA3[1],CntHVNA3[1]);
Cont_Matrix4(HVNA3[2],CntHVNA3[2]);
Cont_Matrix4(HVNA3[3],CntHVNA3[3]);
}
/*************************************************************
make VNA_List and VNA_List2
*************************************************************/
l = 0;
for (i=0; i<=List_YOUSO[35]; i++){ /* max L */
for (j=0; j<List_YOUSO[34]; j++){ /* # of radial projectors */
VNA_List[l] = i;
VNA_List2[l] = j;
l++;
}
}
Num_RVNA = List_YOUSO[34]*(List_YOUSO[35] + 1);
dtime(&etime);
if(myid==0 && measure_time){
printf("Time for part1 of force#4=%18.5f\n",etime-stime);fflush(stdout);
}
/*****************************************************
if orbital optimization
copy CntDS_VNA[0] into DS_VNA[0]
*****************************************************/
if (Cnt_switch==1){
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
Gc_AN = F_M2G[Mc_AN];
Cwan = WhatSpecies[Gc_AN];
tno0 = Spe_Total_CNO[Cwan];
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
Gh_AN = natn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
for (i=0; i<tno0; i++){
l = 0;
for (l1=0; l1<Num_RVNA; l1++){
l2 = 2*VNA_List[l1];
for (l3=0; l3<=l2; l3++){
DS_VNA[0][Mc_AN][h_AN][i][l] = CntDS_VNA[0][Mc_AN][h_AN][i][l];
l++;
}
}
}
}
}
}
/*****************************************************
(1) pre-multiplying DS_VNA[kk] with ene
(2) copy DS_VNA[kk] or CntDS_VNA[kk] into DS_VNA[kk]
*****************************************************/
dtime(&stime);
#pragma omp parallel shared(CntDS_VNA,DS_VNA,Cnt_switch,VNA_proj_ene,VNA_List2,VNA_List,Num_RVNA,natn,FNAN,Spe_Total_CNO,WhatSpecies,F_M2G,Matomnum) private(kk,OMPID,Nthrds,Nprocs,Gc_AN,Cwan,tno0,Mc_AN,h_AN,Gh_AN,Hwan,i,l,l1,LL,Mul1,ene,l2,l3)
{
/* get info. on OpenMP */
OMPID = omp_get_thread_num();
Nthrds = omp_get_num_threads();
Nprocs = omp_get_num_procs();
for (kk=1; kk<=3; kk++){
for (Mc_AN=(OMPID*Matomnum/Nthrds+1); Mc_AN<((OMPID+1)*Matomnum/Nthrds+1); Mc_AN++){
Gc_AN = F_M2G[Mc_AN];
Cwan = WhatSpecies[Gc_AN];
tno0 = Spe_Total_CNO[Cwan];
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
Gh_AN = natn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
for (i=0; i<tno0; i++){
l = 0;
for (l1=0; l1<Num_RVNA; l1++){
LL = VNA_List[l1];
Mul1 = VNA_List2[l1];
ene = VNA_proj_ene[Hwan][LL][Mul1];
l2 = 2*VNA_List[l1];
if (Cnt_switch==0){
for (l3=0; l3<=l2; l3++){
DS_VNA[kk][Mc_AN][h_AN][i][l] = ene*DS_VNA[kk][Mc_AN][h_AN][i][l];
l++;
}
}
else{
for (l3=0; l3<=l2; l3++){
DS_VNA[kk][Mc_AN][h_AN][i][l] = ene*CntDS_VNA[kk][Mc_AN][h_AN][i][l];
l++;
}
}
}
}
} /* h_AN */
} /* Mc_AN */
} /* kk */
} /* #pragma omp parallel */
dtime(&etime);
if(myid==0 && measure_time){
printf("Time for part2 of force#4=%18.5f\n",etime-stime);fflush(stdout);
}
/*****************************************}**********************
THE FIRST CASE:
In case of I=i or I=j
for d [ \sum_k <i|k>ek<k|j> ]/dRI
****************************************************************/
/*******************************************************
*******************************************************
multiplying overlap integrals WITH COMMUNICATION
*******************************************************
*******************************************************/
MPI_Barrier(mpi_comm_level1);
dtime(&stime);
for (ID=0; ID<numprocs; ID++){
F_Snd_Num_WK[ID] = 0;
F_Rcv_Num_WK[ID] = 0;
}
do {
/***********************************
set the size of data
************************************/
for (ID=0; ID<numprocs; ID++){
IDS = (myid + ID) % numprocs;
IDR = (myid - ID + numprocs) % numprocs;
/* find the data size to send the block data */
if ( 0<(F_Snd_Num[IDS]-F_Snd_Num_WK[IDS]) ){
size1 = 0;
n = F_Snd_Num_WK[IDS];
Mc_AN = Snd_MAN[IDS][n];
Gc_AN = Snd_GAN[IDS][n];
Cwan = WhatSpecies[Gc_AN];
tno1 = Spe_Total_NO[Cwan];
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
Gh_AN = natn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
tno2 = (List_YOUSO[35]+1)*(List_YOUSO[35]+1)*List_YOUSO[34];
size1 += tno1*tno2;
}
Snd_DS_VNA_Size[IDS] = size1;
MPI_Isend(&size1, 1, MPI_INT, IDS, tag, mpi_comm_level1, &request);
}
else{
Snd_DS_VNA_Size[IDS] = 0;
}
/* receiving of the size of the data */
if ( 0<(F_Rcv_Num[IDR]-F_Rcv_Num_WK[IDR]) ){
MPI_Recv(&size2, 1, MPI_INT, IDR, tag, mpi_comm_level1, &stat);
Rcv_DS_VNA_Size[IDR] = size2;
}
else{
Rcv_DS_VNA_Size[IDR] = 0;
}
if ( 0<(F_Snd_Num[IDS]-F_Snd_Num_WK[IDS]) ) MPI_Wait(&request,&stat);
} /* ID */
/***********************************
data transfer
************************************/
for (ID=0; ID<numprocs; ID++){
IDS = (myid + ID) % numprocs;
IDR = (myid - ID + numprocs) % numprocs;
/******************************
sending of the data
******************************/
if ( 0<(F_Snd_Num[IDS]-F_Snd_Num_WK[IDS]) ){
size1 = Snd_DS_VNA_Size[IDS];
/* allocation of the array */
tmp_array = (Type_DS_VNA*)malloc(sizeof(Type_DS_VNA)*size1);
/* multidimentional array to the vector array */
num = 0;
n = F_Snd_Num_WK[IDS];
Mc_AN = Snd_MAN[IDS][n];
Gc_AN = Snd_GAN[IDS][n];
Cwan = WhatSpecies[Gc_AN];
tno1 = Spe_Total_NO[Cwan];
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
Gh_AN = natn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
tno2 = (List_YOUSO[35]+1)*(List_YOUSO[35]+1)*List_YOUSO[34];
for (i=0; i<tno1; i++){
for (j=0; j<tno2; j++){
tmp_array[num] = DS_VNA[0][Mc_AN][h_AN][i][j];
num++;
}
}
}
MPI_Isend(&tmp_array[0], size1, MPI_Type_DS_VNA, IDS, tag, mpi_comm_level1, &request);
}
/******************************
receiving of the block data
******************************/
if ( 0<(F_Rcv_Num[IDR]-F_Rcv_Num_WK[IDR]) ){
size2 = Rcv_DS_VNA_Size[IDR];
tmp_array2 = (Type_DS_VNA*)malloc(sizeof(Type_DS_VNA)*size2);
MPI_Recv(&tmp_array2[0], size2, MPI_Type_DS_VNA, IDR, tag, mpi_comm_level1, &stat);
/* store */
num = 0;
n = F_Rcv_Num_WK[IDR];
Original_Mc_AN = F_TopMAN[IDR] + n;
Gc_AN = Rcv_GAN[IDR][n];
Cwan = WhatSpecies[Gc_AN];
tno1 = Spe_Total_NO[Cwan];
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
Gh_AN = natn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
tno2 = (List_YOUSO[35]+1)*(List_YOUSO[35]+1)*List_YOUSO[34];
for (i=0; i<tno1; i++){
for (j=0; j<tno2; j++){
DS_VNA[0][Matomnum+1][h_AN][i][j] = tmp_array2[num];
num++;
}
}
}
/* free tmp_array2 */
free(tmp_array2);
/*****************************************
multiplying overlap integrals
*****************************************/
#pragma omp parallel shared(List_YOUSO,time_per_atom,Gxyz,CDM0,SpinP_switch,CntHVNA2,HVNA2,DS_VNA,Cnt_switch,RMI1,Original_Mc_AN,IDR,Rcv_GAN,F_Rcv_Num_WK,Spe_Total_CNO,F_G2M,natn,FNAN,WhatSpecies,M2G,Matomnum) private(OMPID,Nthrds,Nprocs,Stime_atom,Etime_atom,dEx,dEy,dEz,Gc_AN,Mc_AN,Cwan,fan,h_AN,Gh_AN,Mh_AN,Hwan,ian,n,jg,j0,jg0,Mj_AN0,po2,q_AN,Gq_AN,Mq_AN,Qwan,jan,kl,HVNAx,HVNAy,HVNAz,i,j)
{
/* allocation of array */
HVNAx = (double**)malloc(sizeof(double*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
HVNAx[j] = (double*)malloc(sizeof(double)*List_YOUSO[7]);
}
HVNAy = (double**)malloc(sizeof(double*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
HVNAy[j] = (double*)malloc(sizeof(double)*List_YOUSO[7]);
}
HVNAz = (double**)malloc(sizeof(double*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
HVNAz[j] = (double*)malloc(sizeof(double)*List_YOUSO[7]);
}
/* get info. on OpenMP */
OMPID = omp_get_thread_num();
Nthrds = omp_get_num_threads();
Nprocs = omp_get_num_procs();
for (Mc_AN=(OMPID*Matomnum/Nthrds+1); Mc_AN<((OMPID+1)*Matomnum/Nthrds+1); Mc_AN++){
dtime(&Stime_atom);
dEx = 0.0;
dEy = 0.0;
dEz = 0.0;
Gc_AN = M2G[Mc_AN];
Cwan = WhatSpecies[Gc_AN];
fan = FNAN[Gc_AN];
h_AN = 0;
Gh_AN = natn[Gc_AN][h_AN];
Mh_AN = F_G2M[Gh_AN];
Hwan = WhatSpecies[Gh_AN];
ian = Spe_Total_CNO[Hwan];
n = F_Rcv_Num_WK[IDR];
jg = Rcv_GAN[IDR][n];
for (j0=0; j0<=fan; j0++){
jg0 = natn[Gc_AN][j0];
Mj_AN0 = F_G2M[jg0];
po2 = 0;
if (Original_Mc_AN==Mj_AN0){
po2 = 1;
q_AN = j0;
}
if (po2==1){
Gq_AN = natn[Gc_AN][q_AN];
Mq_AN = F_G2M[Gq_AN];
Qwan = WhatSpecies[Gq_AN];
jan = Spe_Total_CNO[Qwan];
kl = RMI1[Mc_AN][h_AN][q_AN];
if (Cnt_switch==0) {
dHVNA(0,Mc_AN,h_AN,q_AN,DS_VNA,HVNA2,HVNA3,HVNAx,HVNAy,HVNAz);
}
else {
dHVNA(0,Mc_AN,h_AN,q_AN,DS_VNA,CntHVNA2,CntHVNA3,HVNAx,HVNAy,HVNAz);
}
/* contribution of force = Trace(CDM0*dH) */
/* spin non-polarization */
if (SpinP_switch==0){
for (i=0; i<ian; i++){
for (j=0; j<jan; j++){
if (q_AN==h_AN){
dEx += 2.0*CDM0[0][Mh_AN][kl][i][j]*HVNAx[i][j];
dEy += 2.0*CDM0[0][Mh_AN][kl][i][j]*HVNAy[i][j];
dEz += 2.0*CDM0[0][Mh_AN][kl][i][j]*HVNAz[i][j];
}
else{
dEx += 4.0*CDM0[0][Mh_AN][kl][i][j]*HVNAx[i][j];
dEy += 4.0*CDM0[0][Mh_AN][kl][i][j]*HVNAy[i][j];
dEz += 4.0*CDM0[0][Mh_AN][kl][i][j]*HVNAz[i][j];
}
}
}
}
/* else */
else{
for (i=0; i<ian; i++){
for (j=0; j<jan; j++){
if (q_AN==h_AN){
dEx += ( CDM0[0][Mh_AN][kl][i][j]
+ CDM0[1][Mh_AN][kl][i][j] )*HVNAx[i][j];
dEy += ( CDM0[0][Mh_AN][kl][i][j]
+ CDM0[1][Mh_AN][kl][i][j] )*HVNAy[i][j];
dEz += ( CDM0[0][Mh_AN][kl][i][j]
+ CDM0[1][Mh_AN][kl][i][j] )*HVNAz[i][j];
}
else{
dEx += 2.0*( CDM0[0][Mh_AN][kl][i][j]
+ CDM0[1][Mh_AN][kl][i][j] )*HVNAx[i][j];
dEy += 2.0*( CDM0[0][Mh_AN][kl][i][j]
+ CDM0[1][Mh_AN][kl][i][j] )*HVNAy[i][j];
dEz += 2.0*( CDM0[0][Mh_AN][kl][i][j]
+ CDM0[1][Mh_AN][kl][i][j] )*HVNAz[i][j];
}
}
}
}
} /* if (po2==1) */
} /* j0 */
/* force from #4B */
Gxyz[Gc_AN][41] += dEx;
Gxyz[Gc_AN][42] += dEy;
Gxyz[Gc_AN][43] += dEz;
/* timing */
dtime(&Etime_atom);
time_per_atom[Gc_AN] += Etime_atom - Stime_atom;
} /* Mc_AN */
/* freeing of array */
for (j=0; j<List_YOUSO[7]; j++){
free(HVNAx[j]);
}
free(HVNAx);
for (j=0; j<List_YOUSO[7]; j++){
free(HVNAy[j]);
}
free(HVNAy);
for (j=0; j<List_YOUSO[7]; j++){
free(HVNAz[j]);
}
free(HVNAz);
} /* #pragma omp parallel */
/********************************************
increment of F_Rcv_Num_WK[IDR]
********************************************/
F_Rcv_Num_WK[IDR]++;
} /* if ( 0<(F_Snd_Num[IDS]-F_Snd_Num_WK[IDS]) ) */
if ( 0<(F_Snd_Num[IDS]-F_Snd_Num_WK[IDS]) ) {
MPI_Wait(&request,&stat);
free(tmp_array); /* freeing of array */
/********************************************
increment of F_Snd_Num_WK[IDS]
********************************************/
F_Snd_Num_WK[IDS]++;
}
} /* ID */
/*****************************************************
check whether all the communications have finished
*****************************************************/
po = 0;
for (ID=0; ID<numprocs; ID++){
IDS = (myid + ID) % numprocs;
IDR = (myid - ID + numprocs) % numprocs;
if ( 0<(F_Snd_Num[IDS]-F_Snd_Num_WK[IDS]) ) po += F_Snd_Num[IDS]-F_Snd_Num_WK[IDS];
if ( 0<(F_Rcv_Num[IDR]-F_Rcv_Num_WK[IDR]) ) po += F_Rcv_Num[IDR]-F_Rcv_Num_WK[IDR];
}
} while (po!=0);
dtime(&etime);
if(myid==0 && measure_time){
printf("Time for part3 of force#4=%18.5f\n",etime-stime);fflush(stdout);
}
/*******************************************************
*******************************************************
THE FIRST CASE:
multiplying overlap integrals WITHOUT COMMUNICATION
*******************************************************
*******************************************************/
dtime(&stime);
#pragma omp parallel shared(time_per_atom,Gxyz,CDM0,SpinP_switch,CntHVNA2,HVNA2,DS_VNA,Cnt_switch,RMI1,FNAN,Spe_Total_CNO,WhatSpecies,F_G2M,natn,M2G,Matomnum,List_YOUSO) private(HVNAx,HVNAy,HVNAz,OMPID,Nthrds,Nprocs,Mc_AN,Stime_atom,Etime_atom,dEx,dEy,dEz,Gc_AN,h_AN,Gh_AN,Mh_AN,Hwan,ian,q_AN,Gq_AN,Mq_AN,Qwan,jan,kl,i,j,kk)
{
/* allocation of array */
HVNAx = (double**)malloc(sizeof(double*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
HVNAx[j] = (double*)malloc(sizeof(double)*List_YOUSO[7]);
}
HVNAy = (double**)malloc(sizeof(double*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
HVNAy[j] = (double*)malloc(sizeof(double)*List_YOUSO[7]);
}
HVNAz = (double**)malloc(sizeof(double*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
HVNAz[j] = (double*)malloc(sizeof(double)*List_YOUSO[7]);
}
/* get info. on OpenMP */
OMPID = omp_get_thread_num();
Nthrds = omp_get_num_threads();
Nprocs = omp_get_num_procs();
for (Mc_AN=(OMPID*Matomnum/Nthrds+1); Mc_AN<((OMPID+1)*Matomnum/Nthrds+1); Mc_AN++){
dtime(&Stime_atom);
dEx = 0.0;
dEy = 0.0;
dEz = 0.0;
Gc_AN = M2G[Mc_AN];
h_AN = 0;
Gh_AN = natn[Gc_AN][h_AN];
Mh_AN = F_G2M[Gh_AN];
Hwan = WhatSpecies[Gh_AN];
ian = Spe_Total_CNO[Hwan];
for (q_AN=h_AN; q_AN<=FNAN[Gc_AN]; q_AN++){
Gq_AN = natn[Gc_AN][q_AN];
Mq_AN = F_G2M[Gq_AN];
if (Mq_AN<=Matomnum){
Qwan = WhatSpecies[Gq_AN];
jan = Spe_Total_CNO[Qwan];
kl = RMI1[Mc_AN][h_AN][q_AN];
if (Cnt_switch==0) {
dHVNA(0,Mc_AN,h_AN,q_AN,DS_VNA,HVNA2,HVNA3,HVNAx,HVNAy,HVNAz);
}
else {
dHVNA(0,Mc_AN,h_AN,q_AN,DS_VNA,CntHVNA2,CntHVNA3,HVNAx,HVNAy,HVNAz);
}
if (SpinP_switch==0){
for (i=0; i<ian; i++){
for (j=0; j<jan; j++){
if (q_AN==h_AN){
dEx += 2.0*CDM0[0][Mh_AN][kl][i][j]*HVNAx[i][j];
dEy += 2.0*CDM0[0][Mh_AN][kl][i][j]*HVNAy[i][j];
dEz += 2.0*CDM0[0][Mh_AN][kl][i][j]*HVNAz[i][j];
}
else{
dEx += 4.0*CDM0[0][Mh_AN][kl][i][j]*HVNAx[i][j];
dEy += 4.0*CDM0[0][Mh_AN][kl][i][j]*HVNAy[i][j];
dEz += 4.0*CDM0[0][Mh_AN][kl][i][j]*HVNAz[i][j];
}
}
}
}
/* else */
else{
for (i=0; i<ian; i++){
for (j=0; j<jan; j++){
if (q_AN==h_AN){
dEx += ( CDM0[0][Mh_AN][kl][i][j]
+ CDM0[1][Mh_AN][kl][i][j] )*HVNAx[i][j];
dEy += ( CDM0[0][Mh_AN][kl][i][j]
+ CDM0[1][Mh_AN][kl][i][j] )*HVNAy[i][j];
dEz += ( CDM0[0][Mh_AN][kl][i][j]
+ CDM0[1][Mh_AN][kl][i][j] )*HVNAz[i][j];
}
else{
dEx += 2.0*( CDM0[0][Mh_AN][kl][i][j]
+ CDM0[1][Mh_AN][kl][i][j] )*HVNAx[i][j];
dEy += 2.0*( CDM0[0][Mh_AN][kl][i][j]
+ CDM0[1][Mh_AN][kl][i][j] )*HVNAy[i][j];
dEz += 2.0*( CDM0[0][Mh_AN][kl][i][j]
+ CDM0[1][Mh_AN][kl][i][j] )*HVNAz[i][j];
}
}
}
}
}
}
/* force from #4B */
Gxyz[Gc_AN][41] += dEx;
Gxyz[Gc_AN][42] += dEy;
Gxyz[Gc_AN][43] += dEz;
/* timing */
dtime(&Etime_atom);
time_per_atom[Gc_AN] += Etime_atom - Stime_atom;
} /* Mc_AN */
/* freeing of array */
for (j=0; j<List_YOUSO[7]; j++){
free(HVNAx[j]);
}
free(HVNAx);
for (j=0; j<List_YOUSO[7]; j++){
free(HVNAy[j]);
}
free(HVNAy);
for (j=0; j<List_YOUSO[7]; j++){
free(HVNAz[j]);
}
free(HVNAz);
} /* #pragma omp parallel */
dtime(&etime);
if(myid==0 && measure_time){
printf("Time for part4 of force#4=%18.5f\n",etime-stime);fflush(stdout);
}
/*************************************************************
THE SECOND CASE:
In case of I=k with I!=i and I!=j
d [ \sum_k <i|k>ek<k|j> ]/dRI
*************************************************************/
/************************************************************
MPI communication of DS_VNA whose basis part is not located
on own site but projector part is located on own site.
************************************************************/
MPI_Barrier(mpi_comm_level1);
dtime(&stime);
for (ID=0; ID<numprocs; ID++) Indicator[ID] = 0;
for (Mc_AN=1; Mc_AN<=Max_Matomnum; Mc_AN++){
dtime(&Stime_atom);
dtime(&stime1);
if (Mc_AN<=Matomnum) Gc_AN = M2G[Mc_AN];
else Gc_AN = 0;
for (ID=0; ID<numprocs; ID++){
IDS = (myid + ID) % numprocs;
IDR = (myid - ID + numprocs) % numprocs;
i = Indicator[IDS];
po = 0;
Gh_AN = Pro_Snd_GAtom[IDS][i];
if (Gh_AN!=0){
/* find the range with the same global atomic number */
do {
i++;
if (Gh_AN!=Pro_Snd_GAtom[IDS][i]) po = 1;
} while(po==0);
i--;
SA_num = i - Indicator[IDS] + 1;
/* find the data size to send the block data */
size1 = 0;
for (q=Indicator[IDS]; q<=(Indicator[IDS]+SA_num-1); q++){
Sc_AN = Pro_Snd_MAtom[IDS][q];
GSc_AN = F_M2G[Sc_AN];
Sc_wan = WhatSpecies[GSc_AN];
tno1 = Spe_Total_CNO[Sc_wan];
tno2 = (List_YOUSO[35]+1)*(List_YOUSO[35]+1)*List_YOUSO[34];
size1 += 4*tno1*tno2;
size1 += 3;
}
} /* if (Gh_AN!=0) */
else {
SA_num = 0;
size1 = 0;
}
S_array[IDS][0] = Gh_AN;
S_array[IDS][1] = SA_num;
S_array[IDS][2] = size1;
if (ID!=0){
MPI_Isend(&S_array[IDS][0], 3, MPI_INT, IDS, tag, mpi_comm_level1, &request);
MPI_Recv( &R_array[IDR][0], 3, MPI_INT, IDR, tag, mpi_comm_level1, &stat);
MPI_Wait(&request,&stat);
}
else {
R_array[myid][0] = S_array[myid][0];
R_array[myid][1] = S_array[myid][1];
R_array[myid][2] = S_array[myid][2];
}
if (R_array[IDR][0]==Gc_AN) R_comm_flag = 1;
else R_comm_flag = 0;
if (ID!=0){
MPI_Isend(&R_comm_flag, 1, MPI_INT, IDR, tag, mpi_comm_level1, &request);
MPI_Recv( &S_comm_flag, 1, MPI_INT, IDS, tag, mpi_comm_level1, &stat);
MPI_Wait(&request,&stat);
}
else{
S_comm_flag = R_comm_flag;
}
/*
if (counter==2 && ID==8){
printf("QQQ4 myid=%2d\n",myid);fflush(stdout);
MPI_Finalize();
exit(0);
}
*/
/*****************************************
send the data
*****************************************/
/* if (S_comm_flag==1) then, send data to IDS */
if (S_comm_flag==1){
/* allocate tmp_array */
tmp_array = (Type_DS_VNA*)malloc(sizeof(Type_DS_VNA)*size1);
/* multidimentional array to vector array */
num = 0;
for (q=Indicator[IDS]; q<=(Indicator[IDS]+SA_num-1); q++){
Sc_AN = Pro_Snd_MAtom[IDS][q];
GSc_AN = F_M2G[Sc_AN];
Sc_wan = WhatSpecies[GSc_AN];
tno1 = Spe_Total_CNO[Sc_wan];
Sh_AN = Pro_Snd_LAtom[IDS][q];
GSh_AN = natn[GSc_AN][Sh_AN];
Sh_wan = WhatSpecies[GSh_AN];
tno2 = (List_YOUSO[35]+1)*(List_YOUSO[35]+1)*List_YOUSO[34];
Sh_AN2 = Pro_Snd_LAtom2[IDS][q];
tmp_array[num] = (Type_DS_VNA)Sc_AN; num++;
tmp_array[num] = (Type_DS_VNA)Sh_AN; num++;
tmp_array[num] = (Type_DS_VNA)Sh_AN2; num++;
for (kk=0; kk<=3; kk++){
for (i=0; i<tno1; i++){
for (j=0; j<tno2; j++){
tmp_array[num] = DS_VNA[kk][Sc_AN][Sh_AN][i][j];
num++;
}
}
}
}
if (ID!=0){
MPI_Isend(&tmp_array[0], size1, MPI_Type_DS_VNA, IDS, tag, mpi_comm_level1, &request);
}
/* update Indicator[IDS] */
Indicator[IDS] += SA_num;
} /* if (S_comm_flag==1) */
/*****************************************
receive the data
*****************************************/
/* if (R_comm_flag==1) then, receive the data from IDR */
if (R_comm_flag==1){
size2 = R_array[IDR][2];
tmp_array2 = (Type_DS_VNA*)malloc(sizeof(Type_DS_VNA)*size2);
if (ID!=0){
MPI_Recv(&tmp_array2[0], size2, MPI_Type_DS_VNA, IDR, tag, mpi_comm_level1, &stat);
}
else{
for (i=0; i<size2; i++) tmp_array2[i] = tmp_array[i];
}
/* store */
num = 0;
for (n=0; n<R_array[IDR][1]; n++){
Sc_AN = (int)tmp_array2[num]; num++;
Sh_AN = (int)tmp_array2[num]; num++;
Sh_AN2 = (int)tmp_array2[num]; num++;
GSc_AN = natn[Gc_AN][Sh_AN2];
Sc_wan = WhatSpecies[GSc_AN];
tno1 = Spe_Total_CNO[Sc_wan];
tno2 = (List_YOUSO[35]+1)*(List_YOUSO[35]+1)*List_YOUSO[34];
for (kk=0; kk<=3; kk++){
for (i=0; i<tno1; i++){
for (j=0; j<tno2; j++){
DS_VNA[kk][Matomnum+1][Sh_AN2][i][j] = tmp_array2[num];
num++;
}
}
}
}
/* free tmp_array2 */
free(tmp_array2);
} /* if (R_comm_flag==1) */
if (S_comm_flag==1){
if (ID!=0) MPI_Wait(&request,&stat);
free(tmp_array); /* freeing of array */
}
} /* ID */
dtime(&etime1);
if(myid==0 && measure_time){
printf("Time for part5A of force#4=%18.5f\n",etime1-stime1);fflush(stdout);
}
dtime(&stime1);
if (Mc_AN<=Matomnum){
/* get Nthrds0 */
#pragma omp parallel shared(Nthrds0)
{
Nthrds0 = omp_get_num_threads();
}
/* allocation of arrays */
dEx_threads = (double*)malloc(sizeof(double)*Nthrds0);
dEy_threads = (double*)malloc(sizeof(double)*Nthrds0);
dEz_threads = (double*)malloc(sizeof(double)*Nthrds0);
for (Nloop=0; Nloop<Nthrds0; Nloop++){
dEx_threads[Nloop] = 0.0;
dEy_threads[Nloop] = 0.0;
dEz_threads[Nloop] = 0.0;
}
/* one-dimensionalize the h_AN and q_AN loops */
OneD2h_AN = (int*)malloc(sizeof(int)*(FNAN[Gc_AN]+1)*(FNAN[Gc_AN]+2));
OneD2q_AN = (int*)malloc(sizeof(int)*(FNAN[Gc_AN]+1)*(FNAN[Gc_AN]+2));
ODNloop = 0;
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
if ( Solver==5 || Solver==8 || Solver==11)
start_q_AN = 0;
else
start_q_AN = h_AN;
for (q_AN=start_q_AN; q_AN<=FNAN[Gc_AN]; q_AN++){
kl = RMI1[Mc_AN][h_AN][q_AN];
if (0<=kl){
OneD2h_AN[ODNloop] = h_AN;
OneD2q_AN[ODNloop] = q_AN;
ODNloop++;
}
}
}
#pragma omp parallel shared(ODNloop,OneD2h_AN,OneD2q_AN,Mc_AN,Gc_AN,dEx_threads,dEy_threads,dEz_threads,CDM0,SpinP_switch,CntHVNA2,HVNA2,DS_VNA,Cnt_switch,RMI1,Spe_Total_CNO,WhatSpecies,F_G2M,natn,FNAN,List_YOUSO,Solver) private(OMPID,Nthrds,Nprocs,HVNAx,HVNAy,HVNAz,i,j,h_AN,Gh_AN,Mh_AN,Hwan,ian,q_AN,Gq_AN,Mq_AN,Qwan,jan,kl,Nloop,pref)
{
/* allocation of arrays */
HVNAx = (double**)malloc(sizeof(double*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
HVNAx[j] = (double*)malloc(sizeof(double)*List_YOUSO[7]);
}
HVNAy = (double**)malloc(sizeof(double*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
HVNAy[j] = (double*)malloc(sizeof(double)*List_YOUSO[7]);
}
HVNAz = (double**)malloc(sizeof(double*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
HVNAz[j] = (double*)malloc(sizeof(double)*List_YOUSO[7]);
}
/* get info. on OpenMP */
OMPID = omp_get_thread_num();
Nthrds = omp_get_num_threads();
Nprocs = omp_get_num_procs();
for (Nloop=OMPID*ODNloop/Nthrds; Nloop<(OMPID+1)*ODNloop/Nthrds; Nloop++){
/* get h_AN and q_AN */
h_AN = OneD2h_AN[Nloop];
q_AN = OneD2q_AN[Nloop];
/* set informations on h_AN */
Gh_AN = natn[Gc_AN][h_AN];
Mh_AN = F_G2M[Gh_AN];
Hwan = WhatSpecies[Gh_AN];
ian = Spe_Total_CNO[Hwan];
/* set informations on q_AN */
Gq_AN = natn[Gc_AN][q_AN];
Mq_AN = F_G2M[Gq_AN];
Qwan = WhatSpecies[Gq_AN];
jan = Spe_Total_CNO[Qwan];
kl = RMI1[Mc_AN][h_AN][q_AN];
if (0<=kl){
if (Cnt_switch==0)
dHVNA(1,Mc_AN,h_AN,q_AN,DS_VNA,HVNA2,HVNA3,HVNAx,HVNAy,HVNAz);
else
dHVNA(1,Mc_AN,h_AN,q_AN,DS_VNA,CntHVNA2,CntHVNA3,HVNAx,HVNAy,HVNAz);
/* contribution of force = Trace(CDM0*dH) */
/* spin non-polarization */
if (SpinP_switch==0){
if (Solver==5 || Solver==8 || Solver==11){
pref = 2.0;
}
else {
if (q_AN==h_AN) pref = 2.0;
else pref = 4.0;
}
for (i=0; i<ian; i++){
for (j=0; j<jan; j++){
dEx_threads[OMPID] += pref*CDM0[0][Mh_AN][kl][i][j]*HVNAx[i][j];
dEy_threads[OMPID] += pref*CDM0[0][Mh_AN][kl][i][j]*HVNAy[i][j];
dEz_threads[OMPID] += pref*CDM0[0][Mh_AN][kl][i][j]*HVNAz[i][j];
}
}
}
/* else */
else{
if (Solver==5 || Solver==8 || Solver==11){
pref = 1.0;
}
else {
if (q_AN==h_AN) pref = 1.0;
else pref = 2.0;
}
for (i=0; i<ian; i++){
for (j=0; j<jan; j++){
dEx_threads[OMPID] += pref*( CDM0[0][Mh_AN][kl][i][j]
+ CDM0[1][Mh_AN][kl][i][j] )*HVNAx[i][j];
dEy_threads[OMPID] += pref*( CDM0[0][Mh_AN][kl][i][j]
+ CDM0[1][Mh_AN][kl][i][j] )*HVNAy[i][j];
dEz_threads[OMPID] += pref*( CDM0[0][Mh_AN][kl][i][j]
+ CDM0[1][Mh_AN][kl][i][j] )*HVNAz[i][j];
}
}
}
} /* if (0<=kl) */
} /* Nloop */
/* freeing of arrays */
for (j=0; j<List_YOUSO[7]; j++){
free(HVNAx[j]);
}
free(HVNAx);
for (j=0; j<List_YOUSO[7]; j++){
free(HVNAy[j]);
}
free(HVNAy);
for (j=0; j<List_YOUSO[7]; j++){
free(HVNAz[j]);
}
free(HVNAz);
} /* #pragma omp parallel */
/* sum of dEx_threads */
dEx = 0.0;
dEy = 0.0;
dEz = 0.0;
for (Nloop=0; Nloop<Nthrds0; Nloop++){
dEx += dEx_threads[Nloop];
dEy += dEy_threads[Nloop];
dEz += dEz_threads[Nloop];
}
/* force from #4B */
Gxyz[Gc_AN][41] += dEx;
Gxyz[Gc_AN][42] += dEy;
Gxyz[Gc_AN][43] += dEz;
/* timing */
dtime(&Etime_atom);
time_per_atom[Gc_AN] += Etime_atom - Stime_atom;
/* freeing of array */
free(OneD2q_AN);
free(OneD2h_AN);
free(dEx_threads);
free(dEy_threads);
free(dEz_threads);
} /* if (Mc_AN<=Matomnum) */
dtime(&etime1);
if(myid==0 && measure_time){
printf("Time for part5B of force#4=%18.5f\n",etime1-stime1);fflush(stdout);
}
} /* Mc_AN */
dtime(&etime);
if(myid==0 && measure_time){
printf("Time for part5 of force#4=%18.5f\n",etime-stime);fflush(stdout);
}
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
Gc_AN = M2G[Mc_AN];
if (2<=level_stdout){
printf("<Force> force(4B) myid=%2d Mc_AN=%2d Gc_AN=%2d %15.12f %15.12f %15.12f\n",
myid,Mc_AN,Gc_AN,Gxyz[Gc_AN][41],Gxyz[Gc_AN][42],Gxyz[Gc_AN][43]);fflush(stdout);
}
Gxyz[Gc_AN][17] += Gxyz[Gc_AN][41];
Gxyz[Gc_AN][18] += Gxyz[Gc_AN][42];
Gxyz[Gc_AN][19] += Gxyz[Gc_AN][43];
}
/***********************************
freeing of arrays
************************************/
free(Indicator);
for (ID=0; ID<numprocs; ID++){
free(S_array[ID]);
}
free(S_array);
for (ID=0; ID<numprocs; ID++){
free(R_array[ID]);
}
free(R_array);
free(Snd_DS_VNA_Size);
free(Rcv_DS_VNA_Size);
free(VNA_List);
free(VNA_List2);
}
void dHNL(int where_flag,
int Mc_AN, int h_AN, int q_AN,
double ******DS_NL1,
dcomplex ***Hx, dcomplex ***Hy, dcomplex ***Hz)
{
int i,j,k,m,n,l,kg,kan,so,deri_kind;
int ig,ian,jg,jan,kl,kl1,kl2;
int wakg,l1,l2,l3,Gc_AN,Mi_AN,Mi_AN2,Mj_AN,Mj_AN2;
int Rni,Rnj,somax;
double PF[2],sumx,sumy,sumz,ene,dmp,deri_dmp;
double tmpx,tmpy,tmpz,tmp,r;
double x0,y0,z0,x1,y1,z1,dx,dy,dz;
double rcuti,rcutj,rcut;
double PFp,PFm,ene_p,ene_m;
dcomplex sumx0,sumy0,sumz0;
dcomplex sumx1,sumy1,sumz1;
dcomplex sumx2,sumy2,sumz2;
/****************************************************
start calc.
****************************************************/
Gc_AN = M2G[Mc_AN];
ig = natn[Gc_AN][h_AN];
Rni = ncn[Gc_AN][h_AN];
Mi_AN = F_G2M[ig];
ian = Spe_Total_CNO[WhatSpecies[ig]];
rcuti = Spe_Atom_Cut1[WhatSpecies[ig]];
jg = natn[Gc_AN][q_AN];
Rnj = ncn[Gc_AN][q_AN];
Mj_AN = F_G2M[jg];
jan = Spe_Total_CNO[WhatSpecies[jg]];
rcutj = Spe_Atom_Cut1[WhatSpecies[jg]];
rcut = rcuti + rcutj;
kl = RMI1[Mc_AN][h_AN][q_AN];
dmp = dampingF(rcut,Dis[ig][kl]);
for (so=0; so<3; so++){
for (i=0; i<List_YOUSO[7]; i++){
for (j=0; j<List_YOUSO[7]; j++){
Hx[so][i][j] = Complex(0.0,0.0);
Hy[so][i][j] = Complex(0.0,0.0);
Hz[so][i][j] = Complex(0.0,0.0);
}
}
}
if (h_AN==0){
/****************************************************
dH*ep*H
****************************************************/
for (k=0; k<=FNAN[Gc_AN]; k++){
kg = natn[Gc_AN][k];
wakg = WhatSpecies[kg];
kan = Spe_Total_VPS_Pro[wakg];
kl = RMI1[Mc_AN][q_AN][k];
/****************************************************
l-dependent non-local part
****************************************************/
if (0<=kl && VPS_j_dependency[wakg]==0 && where_flag==0){
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
sumx = 0.0;
sumy = 0.0;
sumz = 0.0;
l = 0;
for (l1=1; l1<=Spe_Num_RVPS[wakg]; l1++){
ene = Spe_VNLE[0][wakg][l1-1];
if (Spe_VPS_List[wakg][l1]==0) l2 = 0;
else if (Spe_VPS_List[wakg][l1]==1) l2 = 2;
else if (Spe_VPS_List[wakg][l1]==2) l2 = 4;
else if (Spe_VPS_List[wakg][l1]==3) l2 = 6;
if (Mj_AN<=Matomnum) Mj_AN2 = Mj_AN;
else Mj_AN2 = Matomnum + 1;
for (l3=0; l3<=l2; l3++){
sumx += ene*DS_NL1[0][1][Mc_AN][k][m][l]*DS_NL1[0][0][Mj_AN2][kl][n][l];
sumy += ene*DS_NL1[0][2][Mc_AN][k][m][l]*DS_NL1[0][0][Mj_AN2][kl][n][l];
sumz += ene*DS_NL1[0][3][Mc_AN][k][m][l]*DS_NL1[0][0][Mj_AN2][kl][n][l];
l++;
}
}
Hx[0][m][n].r += sumx;
Hy[0][m][n].r += sumy;
Hz[0][m][n].r += sumz;
Hx[1][m][n].r += sumx;
Hy[1][m][n].r += sumy;
Hz[1][m][n].r += sumz;
} /* n */
} /* m */
} /* if */
/****************************************************
j-dependent non-local part
****************************************************/
else if ( 0<=kl && VPS_j_dependency[wakg]==1 && where_flag==0 ){
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
sumx0 = Complex(0.0,0.0);
sumy0 = Complex(0.0,0.0);
sumz0 = Complex(0.0,0.0);
sumx1 = Complex(0.0,0.0);
sumy1 = Complex(0.0,0.0);
sumz1 = Complex(0.0,0.0);
sumx2 = Complex(0.0,0.0);
sumy2 = Complex(0.0,0.0);
sumz2 = Complex(0.0,0.0);
if (Mj_AN<=Matomnum) Mj_AN2 = Mj_AN;
else Mj_AN2 = Matomnum + 1;
l = 0;
for (l1=1; l1<=Spe_Num_RVPS[wakg]; l1++){
ene_p = Spe_VNLE[0][wakg][l1-1];
ene_m = Spe_VNLE[1][wakg][l1-1];
if (Spe_VPS_List[wakg][l1]==0) { l2=0; PFp=1.0; PFm=0.0; }
else if (Spe_VPS_List[wakg][l1]==1) { l2=2; PFp=2.0/3.0; PFm=1.0/3.0; }
else if (Spe_VPS_List[wakg][l1]==2) { l2=4; PFp=3.0/5.0; PFm=2.0/5.0; }
else if (Spe_VPS_List[wakg][l1]==3) { l2=6; PFp=4.0/7.0; PFm=3.0/7.0; }
dHNL_SO(&sumx0.r,&sumy0.r,&sumz0.r,
&sumx1.r,&sumy1.r,&sumz1.r,
&sumx2.r,&sumy2.r,&sumz2.r,
&sumx0.i,&sumy0.i,&sumz0.i,
&sumx1.i,&sumy1.i,&sumz1.i,
&sumx2.i,&sumy2.i,&sumz2.i,
1.0,
PFp, PFm,
ene_p,ene_m,
l2, &l,
Mc_AN ,k, m,
Mj_AN2,kl,n,
DS_NL1);
}
if (q_AN==0){
l = 0;
for (l1=1; l1<=Spe_Num_RVPS[wakg]; l1++){
ene_p = Spe_VNLE[0][wakg][l1-1];
ene_m = Spe_VNLE[1][wakg][l1-1];
if (Spe_VPS_List[wakg][l1]==0) { l2=0; PFp=1.0; PFm=0.0; }
else if (Spe_VPS_List[wakg][l1]==1) { l2=2; PFp=2.0/3.0; PFm=1.0/3.0; }
else if (Spe_VPS_List[wakg][l1]==2) { l2=4; PFp=3.0/5.0; PFm=2.0/5.0; }
else if (Spe_VPS_List[wakg][l1]==3) { l2=6; PFp=4.0/7.0; PFm=3.0/7.0; }
dHNL_SO(&sumx0.r,&sumy0.r,&sumz0.r,
&sumx1.r,&sumy1.r,&sumz1.r,
&sumx2.r,&sumy2.r,&sumz2.r,
&sumx0.i,&sumy0.i,&sumz0.i,
&sumx1.i,&sumy1.i,&sumz1.i,
&sumx2.i,&sumy2.i,&sumz2.i,
-1.0,
PFp, PFm,
ene_p,ene_m,
l2, &l,
Mj_AN2, kl, n,
Mc_AN, k, m,
DS_NL1);
}
}
Hx[0][m][n].r += sumx0.r; /* up-up */
Hy[0][m][n].r += sumy0.r; /* up-up */
Hz[0][m][n].r += sumz0.r; /* up-up */
Hx[1][m][n].r += sumx1.r; /* dn-dn */
Hy[1][m][n].r += sumy1.r; /* dn-dn */
Hz[1][m][n].r += sumz1.r; /* dn-dn */
Hx[2][m][n].r += sumx2.r; /* up-dn */
Hy[2][m][n].r += sumy2.r; /* up-dn */
Hz[2][m][n].r += sumz2.r; /* up-dn */
Hx[0][m][n].i += sumx0.i; /* up-up */
Hy[0][m][n].i += sumy0.i; /* up-up */
Hz[0][m][n].i += sumz0.i; /* up-up */
Hx[1][m][n].i += sumx1.i; /* dn-dn */
Hy[1][m][n].i += sumy1.i; /* dn-dn */
Hz[1][m][n].i += sumz1.i; /* dn-dn */
Hx[2][m][n].i += sumx2.i; /* up-dn */
Hy[2][m][n].i += sumy2.i; /* up-dn */
Hz[2][m][n].i += sumz2.i; /* up-dn */
}
}
}
} /* k */
/****************************************************
H*ep*dH
****************************************************/
/* h_AN==0 && q_AN==0 */
if (q_AN==0 && VPS_j_dependency[wakg]==0){
for (m=0; m<ian; m++){
for (n=m; n<jan; n++){
tmpx = Hx[0][m][n].r + Hx[0][n][m].r;
Hx[0][m][n].r = tmpx;
Hx[0][n][m].r = tmpx;
Hx[1][m][n].r = tmpx;
Hx[1][n][m].r = tmpx;
tmpy = Hy[0][m][n].r + Hy[0][n][m].r;
Hy[0][m][n].r = tmpy;
Hy[0][n][m].r = tmpy;
Hy[1][m][n].r = tmpy;
Hy[1][n][m].r = tmpy;
tmpz = Hz[0][m][n].r + Hz[0][n][m].r;
Hz[0][m][n].r = tmpz;
Hz[0][n][m].r = tmpz;
Hz[1][m][n].r = tmpz;
Hz[1][n][m].r = tmpz;
}
}
}
else if (where_flag==1){
kg = natn[Gc_AN][0];
wakg = WhatSpecies[kg];
kan = Spe_Total_VPS_Pro[wakg];
kl = RMI1[Mc_AN][q_AN][0];
/****************************************************
l-dependent non-local part
****************************************************/
if (VPS_j_dependency[wakg]==0){
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
sumx = 0.0;
sumy = 0.0;
sumz = 0.0;
if (Mj_AN<=Matomnum){
Mj_AN2 = Mj_AN;
kl2 = RMI1[Mc_AN][q_AN][0];
}
else{
Mj_AN2 = Matomnum + 1;
kl2 = RMI1[Mc_AN][0][q_AN];
}
l = 0;
for (l1=1; l1<=Spe_Num_RVPS[wakg]; l1++){
ene = Spe_VNLE[0][wakg][l1-1];
if (Spe_VPS_List[wakg][l1]==0) l2 = 0;
else if (Spe_VPS_List[wakg][l1]==1) l2 = 2;
else if (Spe_VPS_List[wakg][l1]==2) l2 = 4;
else if (Spe_VPS_List[wakg][l1]==3) l2 = 6;
for (l3=0; l3<=l2; l3++){
sumx -= ene*DS_NL1[0][0][Mc_AN][0][m][l]*DS_NL1[0][1][Mj_AN2][kl2][n][l];
sumy -= ene*DS_NL1[0][0][Mc_AN][0][m][l]*DS_NL1[0][2][Mj_AN2][kl2][n][l];
sumz -= ene*DS_NL1[0][0][Mc_AN][0][m][l]*DS_NL1[0][3][Mj_AN2][kl2][n][l];
l++;
}
}
Hx[0][m][n].r += sumx;
Hy[0][m][n].r += sumy;
Hz[0][m][n].r += sumz;
Hx[1][m][n].r += sumx;
Hy[1][m][n].r += sumy;
Hz[1][m][n].r += sumz;
}
}
}
/****************************************************
j-dependent non-local part
****************************************************/
else if ( VPS_j_dependency[wakg]==1 ){
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
sumx0 = Complex(0.0,0.0);
sumy0 = Complex(0.0,0.0);
sumz0 = Complex(0.0,0.0);
sumx1 = Complex(0.0,0.0);
sumy1 = Complex(0.0,0.0);
sumz1 = Complex(0.0,0.0);
sumx2 = Complex(0.0,0.0);
sumy2 = Complex(0.0,0.0);
sumz2 = Complex(0.0,0.0);
if (Mj_AN<=Matomnum){
Mj_AN2 = Mj_AN;
kl2 = RMI1[Mc_AN][q_AN][0];
}
else{
Mj_AN2 = Matomnum + 1;
kl2 = RMI1[Mc_AN][0][q_AN];
}
l = 0;
for (l1=1; l1<=Spe_Num_RVPS[wakg]; l1++){
ene_p = Spe_VNLE[0][wakg][l1-1];
ene_m = Spe_VNLE[1][wakg][l1-1];
if (Spe_VPS_List[wakg][l1]==0) { l2=0; PFp=1.0; PFm=0.0; }
else if (Spe_VPS_List[wakg][l1]==1) { l2=2; PFp=2.0/3.0; PFm=1.0/3.0; }
else if (Spe_VPS_List[wakg][l1]==2) { l2=4; PFp=3.0/5.0; PFm=2.0/5.0; }
else if (Spe_VPS_List[wakg][l1]==3) { l2=6; PFp=4.0/7.0; PFm=3.0/7.0; }
/* 1 */
dHNL_SO(&sumx0.r,&sumy0.r,&sumz0.r,
&sumx1.r,&sumy1.r,&sumz1.r,
&sumx2.r,&sumy2.r,&sumz2.r,
&sumx0.i,&sumy0.i,&sumz0.i,
&sumx1.i,&sumy1.i,&sumz1.i,
&sumx2.i,&sumy2.i,&sumz2.i,
-1.0,
PFp, PFm,
-ene_p,-ene_m,
l2, &l,
Mj_AN2,kl2,n,
Mc_AN, 0, m,
DS_NL1);
}
Hx[0][m][n].r += sumx0.r; /* up-up */
Hy[0][m][n].r += sumy0.r; /* up-up */
Hz[0][m][n].r += sumz0.r; /* up-up */
Hx[1][m][n].r += sumx1.r; /* dn-dn */
Hy[1][m][n].r += sumy1.r; /* dn-dn */
Hz[1][m][n].r += sumz1.r; /* dn-dn */
Hx[2][m][n].r += sumx2.r; /* up-dn */
Hy[2][m][n].r += sumy2.r; /* up-dn */
Hz[2][m][n].r += sumz2.r; /* up-dn */
Hx[0][m][n].i += sumx0.i; /* up-up */
Hy[0][m][n].i += sumy0.i; /* up-up */
Hz[0][m][n].i += sumz0.i; /* up-up */
Hx[1][m][n].i += sumx1.i; /* dn-dn */
Hy[1][m][n].i += sumy1.i; /* dn-dn */
Hz[1][m][n].i += sumz1.i; /* dn-dn */
Hx[2][m][n].i += sumx2.i; /* up-dn */
Hy[2][m][n].i += sumy2.i; /* up-dn */
Hz[2][m][n].i += sumz2.i; /* up-dn */
}
}
}
}
} /* if (h_AN==0) */
else if (where_flag==0){
/****************************************************
H*ep*dH
if (h_AN!=0 && where_flag==0)
This happens
only if
( SpinP_switch==3
&&
(SO_switch==1 || (Hub_U_switch==1 && F_U_flag==1)
|| 1<=Constraint_NCS_switch || Zeeman_NCS_switch==1
|| Zeeman_NCO_switch==1)
&&
q_AN==0
)
****************************************************/
for (k=0; k<=FNAN[Gc_AN]; k++){
kg = natn[Gc_AN][k];
wakg = WhatSpecies[kg];
kan = Spe_Total_VPS_Pro[wakg];
kl = RMI1[Mc_AN][h_AN][k];
if (Mi_AN<=Matomnum) Mi_AN2 = Mi_AN;
else Mi_AN2 = Matomnum + 1;
if (0<=kl && VPS_j_dependency[wakg]==1){
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
sumx0 = Complex(0.0,0.0);
sumy0 = Complex(0.0,0.0);
sumz0 = Complex(0.0,0.0);
sumx1 = Complex(0.0,0.0);
sumy1 = Complex(0.0,0.0);
sumz1 = Complex(0.0,0.0);
sumx2 = Complex(0.0,0.0);
sumy2 = Complex(0.0,0.0);
sumz2 = Complex(0.0,0.0);
l = 0;
for (l1=1; l1<=Spe_Num_RVPS[wakg]; l1++){
ene_p = Spe_VNLE[0][wakg][l1-1];
ene_m = Spe_VNLE[1][wakg][l1-1];
if (Spe_VPS_List[wakg][l1]==0) { l2=0; PFp=1.0; PFm=0.0; }
else if (Spe_VPS_List[wakg][l1]==1) { l2=2; PFp=2.0/3.0; PFm=1.0/3.0; }
else if (Spe_VPS_List[wakg][l1]==2) { l2=4; PFp=3.0/5.0; PFm=2.0/5.0; }
else if (Spe_VPS_List[wakg][l1]==3) { l2=6; PFp=4.0/7.0; PFm=3.0/7.0; }
dHNL_SO(&sumx0.r,&sumy0.r,&sumz0.r,
&sumx1.r,&sumy1.r,&sumz1.r,
&sumx2.r,&sumy2.r,&sumz2.r,
&sumx0.i,&sumy0.i,&sumz0.i,
&sumx1.i,&sumy1.i,&sumz1.i,
&sumx2.i,&sumy2.i,&sumz2.i,
-1.0,
PFp, PFm,
ene_p, ene_m,
l2, &l,
Mj_AN, k, n,
Mi_AN2, kl, m,
DS_NL1);
}
Hx[0][m][n].r += sumx0.r; /* up-up */
Hy[0][m][n].r += sumy0.r; /* up-up */
Hz[0][m][n].r += sumz0.r; /* up-up */
Hx[1][m][n].r += sumx1.r; /* dn-dn */
Hy[1][m][n].r += sumy1.r; /* dn-dn */
Hz[1][m][n].r += sumz1.r; /* dn-dn */
Hx[2][m][n].r += sumx2.r; /* up-dn */
Hy[2][m][n].r += sumy2.r; /* up-dn */
Hz[2][m][n].r += sumz2.r; /* up-dn */
Hx[0][m][n].i += sumx0.i; /* up-up */
Hy[0][m][n].i += sumy0.i; /* up-up */
Hz[0][m][n].i += sumz0.i; /* up-up */
Hx[1][m][n].i += sumx1.i; /* dn-dn */
Hy[1][m][n].i += sumy1.i; /* dn-dn */
Hz[1][m][n].i += sumz1.i; /* dn-dn */
Hx[2][m][n].i += sumx2.i; /* up-dn */
Hy[2][m][n].i += sumy2.i; /* up-dn */
Hz[2][m][n].i += sumz2.i; /* up-dn */
}
}
}
}
}
/* if (h_AN!=0 && where_flag==1) */
else {
/****************************************************
dH*ep*H
****************************************************/
kg = natn[Gc_AN][0];
wakg = WhatSpecies[kg];
kan = Spe_Total_VPS_Pro[wakg];
kl1 = RMI1[Mc_AN][0][h_AN];
kl2 = RMI1[Mc_AN][0][q_AN];
/****************************************************
l-dependent non-local part
****************************************************/
if (VPS_j_dependency[wakg]==0){
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
sumx = 0.0;
sumy = 0.0;
sumz = 0.0;
l = 0;
for (l1=1; l1<=Spe_Num_RVPS[wakg]; l1++){
ene = Spe_VNLE[0][wakg][l1-1];
if (Spe_VPS_List[wakg][l1]==0) l2 = 0;
else if (Spe_VPS_List[wakg][l1]==1) l2 = 2;
else if (Spe_VPS_List[wakg][l1]==2) l2 = 4;
else if (Spe_VPS_List[wakg][l1]==3) l2 = 6;
for (l3=0; l3<=l2; l3++){
sumx -= ene*DS_NL1[0][1][Matomnum+1][kl1][m][l]*DS_NL1[0][0][Matomnum+1][kl2][n][l];
sumy -= ene*DS_NL1[0][2][Matomnum+1][kl1][m][l]*DS_NL1[0][0][Matomnum+1][kl2][n][l];
sumz -= ene*DS_NL1[0][3][Matomnum+1][kl1][m][l]*DS_NL1[0][0][Matomnum+1][kl2][n][l];
l++;
}
}
Hx[0][m][n].r = sumx;
Hy[0][m][n].r = sumy;
Hz[0][m][n].r = sumz;
Hx[1][m][n].r = sumx;
Hy[1][m][n].r = sumy;
Hz[1][m][n].r = sumz;
Hx[2][m][n].r = 0.0;
Hy[2][m][n].r = 0.0;
Hz[2][m][n].r = 0.0;
Hx[0][m][n].i = 0.0;
Hy[0][m][n].i = 0.0;
Hz[0][m][n].i = 0.0;
Hx[1][m][n].i = 0.0;
Hy[1][m][n].i = 0.0;
Hz[1][m][n].i = 0.0;
Hx[2][m][n].i = 0.0;
Hy[2][m][n].i = 0.0;
Hz[2][m][n].i = 0.0;
}
}
}
/****************************************************
j-dependent non-local part
****************************************************/
else if ( VPS_j_dependency[wakg]==1 ){
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
sumx0 = Complex(0.0,0.0);
sumy0 = Complex(0.0,0.0);
sumz0 = Complex(0.0,0.0);
sumx1 = Complex(0.0,0.0);
sumy1 = Complex(0.0,0.0);
sumz1 = Complex(0.0,0.0);
sumx2 = Complex(0.0,0.0);
sumy2 = Complex(0.0,0.0);
sumz2 = Complex(0.0,0.0);
l = 0;
for (l1=1; l1<=Spe_Num_RVPS[wakg]; l1++){
ene_p = Spe_VNLE[0][wakg][l1-1];
ene_m = Spe_VNLE[1][wakg][l1-1];
if (Spe_VPS_List[wakg][l1]==0) { l2=0; PFp=1.0; PFm=0.0; }
else if (Spe_VPS_List[wakg][l1]==1) { l2=2; PFp=2.0/3.0; PFm=1.0/3.0; }
else if (Spe_VPS_List[wakg][l1]==2) { l2=4; PFp=3.0/5.0; PFm=2.0/5.0; }
else if (Spe_VPS_List[wakg][l1]==3) { l2=6; PFp=4.0/7.0; PFm=3.0/7.0; }
/* 2 */
dHNL_SO(&sumx0.r,&sumy0.r,&sumz0.r,
&sumx1.r,&sumy1.r,&sumz1.r,
&sumx2.r,&sumy2.r,&sumz2.r,
&sumx0.i,&sumy0.i,&sumz0.i,
&sumx1.i,&sumy1.i,&sumz1.i,
&sumx2.i,&sumy2.i,&sumz2.i,
1.0,
PFp, PFm,
-ene_p,-ene_m,
l2, &l,
Matomnum+1, kl1,m,
Matomnum+1, kl2,n,
DS_NL1);
}
Hx[0][m][n].r = sumx0.r; /* up-up */
Hy[0][m][n].r = sumy0.r; /* up-up */
Hz[0][m][n].r = sumz0.r; /* up-up */
Hx[1][m][n].r = sumx1.r; /* dn-dn */
Hy[1][m][n].r = sumy1.r; /* dn-dn */
Hz[1][m][n].r = sumz1.r; /* dn-dn */
Hx[2][m][n].r = sumx2.r; /* up-dn */
Hy[2][m][n].r = sumy2.r; /* up-dn */
Hz[2][m][n].r = sumz2.r; /* up-dn */
Hx[0][m][n].i = sumx0.i; /* up-up */
Hy[0][m][n].i = sumy0.i; /* up-up */
Hz[0][m][n].i = sumz0.i; /* up-up */
Hx[1][m][n].i = sumx1.i; /* dn-dn */
Hy[1][m][n].i = sumy1.i; /* dn-dn */
Hz[1][m][n].i = sumz1.i; /* dn-dn */
Hx[2][m][n].i = sumx2.i; /* up-dn */
Hy[2][m][n].i = sumy2.i; /* up-dn */
Hz[2][m][n].i = sumz2.i; /* up-dn */
}
}
}
/****************************************************
H*ep*dH
****************************************************/
if (q_AN!=0) {
kg = natn[Gc_AN][0];
wakg = WhatSpecies[kg];
kan = Spe_Total_VPS_Pro[wakg];
kl1 = RMI1[Mc_AN][0][h_AN];
kl2 = RMI1[Mc_AN][0][q_AN];
/****************************************************
l-dependent non-local part
****************************************************/
if (VPS_j_dependency[wakg]==0){
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
sumx = 0.0;
sumy = 0.0;
sumz = 0.0;
l = 0;
for (l1=1; l1<=Spe_Num_RVPS[wakg]; l1++){
ene = Spe_VNLE[0][wakg][l1-1];
if (Spe_VPS_List[wakg][l1]==0) l2 = 0;
else if (Spe_VPS_List[wakg][l1]==1) l2 = 2;
else if (Spe_VPS_List[wakg][l1]==2) l2 = 4;
else if (Spe_VPS_List[wakg][l1]==3) l2 = 6;
for (l3=0; l3<=l2; l3++){
sumx -= ene*DS_NL1[0][0][Matomnum+1][kl1][m][l]*DS_NL1[0][1][Matomnum+1][kl2][n][l];
sumy -= ene*DS_NL1[0][0][Matomnum+1][kl1][m][l]*DS_NL1[0][2][Matomnum+1][kl2][n][l];
sumz -= ene*DS_NL1[0][0][Matomnum+1][kl1][m][l]*DS_NL1[0][3][Matomnum+1][kl2][n][l];
l++;
}
}
Hx[0][m][n].r += sumx;
Hy[0][m][n].r += sumy;
Hz[0][m][n].r += sumz;
Hx[1][m][n].r += sumx;
Hy[1][m][n].r += sumy;
Hz[1][m][n].r += sumz;
}
}
}
/****************************************************
j-dependent non-local part
****************************************************/
else if ( VPS_j_dependency[wakg]==1 ){
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
sumx0 = Complex(0.0,0.0);
sumy0 = Complex(0.0,0.0);
sumz0 = Complex(0.0,0.0);
sumx1 = Complex(0.0,0.0);
sumy1 = Complex(0.0,0.0);
sumz1 = Complex(0.0,0.0);
sumx2 = Complex(0.0,0.0);
sumy2 = Complex(0.0,0.0);
sumz2 = Complex(0.0,0.0);
l = 0;
for (l1=1; l1<=Spe_Num_RVPS[wakg]; l1++){
ene_p = Spe_VNLE[0][wakg][l1-1];
ene_m = Spe_VNLE[1][wakg][l1-1];
if (Spe_VPS_List[wakg][l1]==0) { l2=0; PFp=1.0; PFm=0.0; }
else if (Spe_VPS_List[wakg][l1]==1) { l2=2; PFp=2.0/3.0; PFm=1.0/3.0; }
else if (Spe_VPS_List[wakg][l1]==2) { l2=4; PFp=3.0/5.0; PFm=2.0/5.0; }
else if (Spe_VPS_List[wakg][l1]==3) { l2=6; PFp=4.0/7.0; PFm=3.0/7.0; }
/* 4 */
dHNL_SO(&sumx0.r,&sumy0.r,&sumz0.r,
&sumx1.r,&sumy1.r,&sumz1.r,
&sumx2.r,&sumy2.r,&sumz2.r,
&sumx0.i,&sumy0.i,&sumz0.i,
&sumx1.i,&sumy1.i,&sumz1.i,
&sumx2.i,&sumy2.i,&sumz2.i,
-1.0,
PFp, PFm,
-ene_p,-ene_m,
l2, &l,
Matomnum+1, kl2,n,
Matomnum+1, kl1,m,
DS_NL1);
}
Hx[0][m][n].r += sumx0.r; /* up-up */
Hy[0][m][n].r += sumy0.r; /* up-up */
Hz[0][m][n].r += sumz0.r; /* up-up */
Hx[1][m][n].r += sumx1.r; /* dn-dn */
Hy[1][m][n].r += sumy1.r; /* dn-dn */
Hz[1][m][n].r += sumz1.r; /* dn-dn */
Hx[2][m][n].r += sumx2.r; /* up-dn */
Hy[2][m][n].r += sumy2.r; /* up-dn */
Hz[2][m][n].r += sumz2.r; /* up-dn */
Hx[0][m][n].i += sumx0.i; /* up-up */
Hy[0][m][n].i += sumy0.i; /* up-up */
Hz[0][m][n].i += sumz0.i; /* up-up */
Hx[1][m][n].i += sumx1.i; /* dn-dn */
Hy[1][m][n].i += sumy1.i; /* dn-dn */
Hz[1][m][n].i += sumz1.i; /* dn-dn */
Hx[2][m][n].i += sumx2.i; /* up-dn */
Hy[2][m][n].i += sumy2.i; /* up-dn */
Hz[2][m][n].i += sumz2.i; /* up-dn */
}
}
}
}
} /* else */
/****************************************************
contribution by dampingF
****************************************************/
/* Qij * dH/dx */
for (so=0; so<3; so++){
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
Hx[so][m][n].r = dmp*Hx[so][m][n].r;
Hy[so][m][n].r = dmp*Hy[so][m][n].r;
Hz[so][m][n].r = dmp*Hz[so][m][n].r;
Hx[so][m][n].i = dmp*Hx[so][m][n].i;
Hy[so][m][n].i = dmp*Hy[so][m][n].i;
Hz[so][m][n].i = dmp*Hz[so][m][n].i;
}
}
}
/* dQij/dx * H */
if ( (h_AN==0 && q_AN!=0) || (h_AN!=0 && q_AN==0) ){
if (h_AN==0) kl = q_AN;
else if (q_AN==0) kl = h_AN;
if (SpinP_switch==0) somax = 0;
else if (SpinP_switch==1) somax = 1;
else if (SpinP_switch==3) somax = 2;
r = Dis[Gc_AN][kl];
if (rcut<=r) {
deri_dmp = 0.0;
tmp = 0.0;
}
else {
deri_dmp = deri_dampingF(rcut,r);
tmp = deri_dmp/dmp;
}
x0 = Gxyz[ig][1] + atv[Rni][1];
y0 = Gxyz[ig][2] + atv[Rni][2];
z0 = Gxyz[ig][3] + atv[Rni][3];
x1 = Gxyz[jg][1] + atv[Rnj][1];
y1 = Gxyz[jg][2] + atv[Rnj][2];
z1 = Gxyz[jg][3] + atv[Rnj][3];
/* for empty atoms or finite elemens basis */
if (r<1.0e-10) r = 1.0e-10;
if (h_AN==0 && q_AN!=0){
dx = tmp*(x0-x1)/r;
dy = tmp*(y0-y1)/r;
dz = tmp*(z0-z1)/r;
}
else if (h_AN!=0 && q_AN==0){
dx = tmp*(x1-x0)/r;
dy = tmp*(y1-y0)/r;
dz = tmp*(z1-z0)/r;
}
if (SpinP_switch==0 || SpinP_switch==1){
if (h_AN==0){
for (so=0; so<=somax; so++){
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
Hx[so][m][n].r += HNL[so][Mc_AN][kl][m][n]*dx;
Hy[so][m][n].r += HNL[so][Mc_AN][kl][m][n]*dy;
Hz[so][m][n].r += HNL[so][Mc_AN][kl][m][n]*dz;
}
}
}
}
else if (q_AN==0){
for (so=0; so<=somax; so++){
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
Hx[so][m][n].r += HNL[so][Mc_AN][kl][n][m]*dx;
Hy[so][m][n].r += HNL[so][Mc_AN][kl][n][m]*dy;
Hz[so][m][n].r += HNL[so][Mc_AN][kl][n][m]*dz;
}
}
}
}
}
else if (SpinP_switch==3){
if (h_AN==0){
for (so=0; so<=somax; so++){
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
Hx[so][m][n].r += HNL[so][Mc_AN][kl][m][n]*dx;
Hy[so][m][n].r += HNL[so][Mc_AN][kl][m][n]*dy;
Hz[so][m][n].r += HNL[so][Mc_AN][kl][m][n]*dz;
}
}
}
}
else if (q_AN==0){
for (so=0; so<=somax; so++){
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
Hx[so][m][n].r += HNL[so][Mc_AN][kl][n][m]*dx;
Hy[so][m][n].r += HNL[so][Mc_AN][kl][n][m]*dy;
Hz[so][m][n].r += HNL[so][Mc_AN][kl][n][m]*dz;
}
}
}
}
if (SO_switch==1){
if (h_AN==0){
for (so=0; so<=somax; so++){
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
Hx[so][m][n].i += iHNL[so][Mc_AN][kl][m][n]*dx;
Hy[so][m][n].i += iHNL[so][Mc_AN][kl][m][n]*dy;
Hz[so][m][n].i += iHNL[so][Mc_AN][kl][m][n]*dz;
}
}
}
}
else if (q_AN==0){
for (so=0; so<=somax; so++){
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
Hx[so][m][n].i += iHNL[so][Mc_AN][kl][n][m]*dx;
Hy[so][m][n].i += iHNL[so][Mc_AN][kl][n][m]*dy;
Hz[so][m][n].i += iHNL[so][Mc_AN][kl][n][m]*dz;
}
}
}
}
}
}
}
}
void dHVNA(int where_flag, int Mc_AN, int h_AN, int q_AN,
Type_DS_VNA *****DS_VNA1,
double *****TmpHVNA2, double *****TmpHVNA3,
double **Hx, double **Hy, double **Hz)
{
int i,j,k,m,n,l,kg,kan,so,deri_kind;
int ig,ian,jg,jan,kl,kl1,kl2,Rni,Rnj;
int wakg,l1,l2,l3,Gc_AN,Mi_AN,Mj_AN,Mj_AN2,num_projectors;
double sumx,sumy,sumz,ene,rcuti,rcutj,rcut;
double tmpx,tmpy,tmpz,dmp,deri_dmp,tmp;
double dx,dy,dz,x0,y0,z0,x1,y1,z1,r;
double PFp,PFm,ene_p,ene_m;
double sumx0,sumy0,sumz0;
double sumx1,sumy1,sumz1;
double sumx2,sumy2,sumz2;
int L,LL,Mul1,Num_RVNA;
Num_RVNA = List_YOUSO[34]*(List_YOUSO[35] + 1);
num_projectors = (List_YOUSO[35]+1)*(List_YOUSO[35]+1)*List_YOUSO[34];
/****************************************************
start calc.
****************************************************/
Gc_AN = M2G[Mc_AN];
ig = natn[Gc_AN][h_AN];
Rni = ncn[Gc_AN][h_AN];
Mi_AN = F_G2M[ig];
ian = Spe_Total_CNO[WhatSpecies[ig]];
rcuti = Spe_Atom_Cut1[WhatSpecies[ig]];
jg = natn[Gc_AN][q_AN];
Rnj = ncn[Gc_AN][q_AN];
Mj_AN = F_G2M[jg];
jan = Spe_Total_CNO[WhatSpecies[jg]];
rcutj = Spe_Atom_Cut1[WhatSpecies[jg]];
rcut = rcuti + rcutj;
kl = RMI1[Mc_AN][h_AN][q_AN];
dmp = dampingF(rcut,Dis[ig][kl]);
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
Hx[m][n] = 0.0;
Hy[m][n] = 0.0;
Hz[m][n] = 0.0;
}
}
/****************************************************
two-center integral with orbitals on one-center
in case of h_AN==0 && q_AN==0
****************************************************/
if (h_AN==0 && q_AN==0 && where_flag==0){
for (k=1; k<=FNAN[Gc_AN]; k++){
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
Hx[m][n] += TmpHVNA2[1][Mc_AN][k][m][n];
Hy[m][n] += TmpHVNA2[2][Mc_AN][k][m][n];
Hz[m][n] += TmpHVNA2[3][Mc_AN][k][m][n];
}
}
}
}
/****************************************************
two-center integral with orbitals on one-center
in case of h_AN==q_AN && h_AN!=0
****************************************************/
else if (h_AN==q_AN && h_AN!=0){
kl = RMI1[Mc_AN][h_AN][0];
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
Hx[m][n] = -TmpHVNA3[1][Mc_AN][h_AN][m][n];
Hy[m][n] = -TmpHVNA3[2][Mc_AN][h_AN][m][n];
Hz[m][n] = -TmpHVNA3[3][Mc_AN][h_AN][m][n];
}
}
}
/****************************************************
two and three center integrals
with orbitals on two-center
****************************************************/
else{
if (h_AN==0){
/****************************************************
dH*ep*H
****************************************************/
for (k=0; k<=FNAN[Gc_AN]; k++){
kg = natn[Gc_AN][k];
wakg = WhatSpecies[kg];
kl = RMI1[Mc_AN][q_AN][k];
/****************************************************
non-local part
****************************************************/
if (0<=kl && where_flag==0){
if (Mj_AN<=Matomnum) Mj_AN2 = Mj_AN;
else Mj_AN2 = Matomnum+1;
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
sumx = 0.0;
sumy = 0.0;
sumz = 0.0;
for (l=0; l<num_projectors; l++){
sumx += DS_VNA1[1][Mc_AN][k][m][l]*DS_VNA1[0][Mj_AN2][kl][n][l];
sumy += DS_VNA1[2][Mc_AN][k][m][l]*DS_VNA1[0][Mj_AN2][kl][n][l];
sumz += DS_VNA1[3][Mc_AN][k][m][l]*DS_VNA1[0][Mj_AN2][kl][n][l];
}
Hx[m][n] += sumx;
Hy[m][n] += sumy;
Hz[m][n] += sumz;
} /* n */
} /* m */
} /* if */
} /* k */
/****************************************************
H*ep*dH
****************************************************/
/* non-local part */
if (q_AN==0){
for (m=0; m<ian; m++){
for (n=m; n<jan; n++){
tmpx = Hx[m][n] + Hx[n][m];
Hx[m][n] = tmpx;
Hx[n][m] = tmpx;
tmpy = Hy[m][n] + Hy[n][m];
Hy[m][n] = tmpy;
Hy[n][m] = tmpy;
tmpz = Hz[m][n] + Hz[n][m];
Hz[m][n] = tmpz;
Hz[n][m] = tmpz;
}
}
}
else if (where_flag==1) {
kg = natn[Gc_AN][0];
wakg = WhatSpecies[kg];
/****************************************************
non-local part
****************************************************/
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
sumx = 0.0;
sumy = 0.0;
sumz = 0.0;
if (Mj_AN<=Matomnum){
Mj_AN2 = Mj_AN;
kl = RMI1[Mc_AN][q_AN][0];
}
else{
Mj_AN2 = Matomnum+1;
kl = RMI1[Mc_AN][0][q_AN];
}
for (l=0; l<num_projectors; l++){
sumx -= DS_VNA1[0][Mc_AN][0][m][l]*DS_VNA1[1][Mj_AN2][kl][n][l];
sumy -= DS_VNA1[0][Mc_AN][0][m][l]*DS_VNA1[2][Mj_AN2][kl][n][l];
sumz -= DS_VNA1[0][Mc_AN][0][m][l]*DS_VNA1[3][Mj_AN2][kl][n][l];
}
Hx[m][n] += sumx;
Hy[m][n] += sumy;
Hz[m][n] += sumz;
}
}
}
} /* if (h_AN==0) */
else {
/****************************************************
dH*ep*H
****************************************************/
kg = natn[Gc_AN][0];
wakg = WhatSpecies[kg];
kl1 = RMI1[Mc_AN][0][h_AN];
kl2 = RMI1[Mc_AN][0][q_AN];
/****************************************************
non-local part
****************************************************/
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
sumx = 0.0;
sumy = 0.0;
sumz = 0.0;
for (l=0; l<num_projectors; l++){
sumx -= DS_VNA1[1][Matomnum+1][kl1][m][l]*DS_VNA1[0][Matomnum+1][kl2][n][l];
sumy -= DS_VNA1[2][Matomnum+1][kl1][m][l]*DS_VNA1[0][Matomnum+1][kl2][n][l];
sumz -= DS_VNA1[3][Matomnum+1][kl1][m][l]*DS_VNA1[0][Matomnum+1][kl2][n][l];
}
Hx[m][n] = sumx;
Hy[m][n] = sumy;
Hz[m][n] = sumz;
}
}
/****************************************************
H*ep*dH
****************************************************/
if (q_AN!=0){
kg = natn[Gc_AN][0];
wakg = WhatSpecies[kg];
kl1 = RMI1[Mc_AN][0][h_AN];
kl2 = RMI1[Mc_AN][0][q_AN];
/****************************************************
non-local part
****************************************************/
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
sumx = 0.0;
sumy = 0.0;
sumz = 0.0;
for (l=0; l<num_projectors; l++){
sumx -= DS_VNA1[0][Matomnum+1][kl1][m][l]*DS_VNA1[1][Matomnum+1][kl2][n][l];
sumy -= DS_VNA1[0][Matomnum+1][kl1][m][l]*DS_VNA1[2][Matomnum+1][kl2][n][l];
sumz -= DS_VNA1[0][Matomnum+1][kl1][m][l]*DS_VNA1[3][Matomnum+1][kl2][n][l];
}
Hx[m][n] += sumx;
Hy[m][n] += sumy;
Hz[m][n] += sumz;
}
}
}
}
}
/****************************************************
contribution by dampingF
****************************************************/
/* Qij * dH/dx */
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
Hx[m][n] = dmp*Hx[m][n];
Hy[m][n] = dmp*Hy[m][n];
Hz[m][n] = dmp*Hz[m][n];
}
}
/* dQij/dx * H */
if ( (h_AN==0 && q_AN!=0) || (h_AN!=0 && q_AN==0) ){
if (h_AN==0) kl = q_AN;
else if (q_AN==0) kl = h_AN;
r = Dis[Gc_AN][kl];
if (rcut<=r) {
deri_dmp = 0.0;
tmp = 0.0;
}
else {
deri_dmp = deri_dampingF(rcut,r);
tmp = deri_dmp/dmp;
}
x0 = Gxyz[ig][1] + atv[Rni][1];
x1 = Gxyz[jg][1] + atv[Rnj][1];
y0 = Gxyz[ig][2] + atv[Rni][2];
y1 = Gxyz[jg][2] + atv[Rnj][2];
z0 = Gxyz[ig][3] + atv[Rni][3];
z1 = Gxyz[jg][3] + atv[Rnj][3];
/* for empty atoms or finite elemens basis */
if (r<1.0e-10) r = 1.0e-10;
if ( h_AN==0 ){
dx = tmp*(x0-x1)/r;
dy = tmp*(y0-y1)/r;
dz = tmp*(z0-z1)/r;
}
else if ( q_AN==0 ){
dx = tmp*(x1-x0)/r;
dy = tmp*(y1-y0)/r;
dz = tmp*(z1-z0)/r;
}
if (h_AN==0){
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
Hx[m][n] += HVNA[Mc_AN][kl][m][n]*dx;
Hy[m][n] += HVNA[Mc_AN][kl][m][n]*dy;
Hz[m][n] += HVNA[Mc_AN][kl][m][n]*dz;
}
}
}
else if (q_AN==0){
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
Hx[m][n] += HVNA[Mc_AN][kl][n][m]*dx;
Hy[m][n] += HVNA[Mc_AN][kl][n][m]*dy;
Hz[m][n] += HVNA[Mc_AN][kl][n][m]*dz;
}
}
}
}
}
void dHNL_SO(
double *sumx0r,
double *sumy0r,
double *sumz0r,
double *sumx1r,
double *sumy1r,
double *sumz1r,
double *sumx2r,
double *sumy2r,
double *sumz2r,
double *sumx0i,
double *sumy0i,
double *sumz0i,
double *sumx1i,
double *sumy1i,
double *sumz1i,
double *sumx2i,
double *sumy2i,
double *sumz2i,
double fugou,
double PFp,
double PFm,
double ene_p,
double ene_m,
int l2, int *l,
int Mc_AN, int k, int m,
int Mj_AN, int kl, int n,
double ******DS_NL1)
{
int l3,i;
double tmpx,tmpy,tmpz;
double tmp0,tmp1,tmp2;
double tmp3,tmp4,tmp5,tmp6;
double deri[4];
/****************************************************
off-diagonal contribution to up-dn matrix
for spin non-collinear
****************************************************/
if (SpinP_switch==3){
/* p */
if (l2==2){
/* real contribution of l+1/2 to off diagonal up-down matrix */
tmpx =
fugou*
( ene_p/3.0*DS_NL1[0][1][Mc_AN][k][m][*l ]*DS_NL1[0][0][Mj_AN][kl][n][*l+2]
-ene_p/3.0*DS_NL1[0][1][Mc_AN][k][m][*l+2]*DS_NL1[0][0][Mj_AN][kl][n][*l ] );
tmpy =
fugou*
( ene_p/3.0*DS_NL1[0][2][Mc_AN][k][m][*l ]*DS_NL1[0][0][Mj_AN][kl][n][*l+2]
-ene_p/3.0*DS_NL1[0][2][Mc_AN][k][m][*l+2]*DS_NL1[0][0][Mj_AN][kl][n][*l ] );
tmpz =
fugou*
( ene_p/3.0*DS_NL1[0][3][Mc_AN][k][m][*l ]*DS_NL1[0][0][Mj_AN][kl][n][*l+2]
-ene_p/3.0*DS_NL1[0][3][Mc_AN][k][m][*l+2]*DS_NL1[0][0][Mj_AN][kl][n][*l ] );
*sumx2r += tmpx;
*sumy2r += tmpy;
*sumz2r += tmpz;
/* imaginary contribution of l+1/2 to off diagonal up-down matrix */
tmpx =
fugou*
( -ene_p/3.0*DS_NL1[0][1][Mc_AN][k][m][*l+1]*DS_NL1[0][0][Mj_AN][kl][n][*l+2]
+ene_p/3.0*DS_NL1[0][1][Mc_AN][k][m][*l+2]*DS_NL1[0][0][Mj_AN][kl][n][*l+1] );
tmpy =
fugou*
( -ene_p/3.0*DS_NL1[0][2][Mc_AN][k][m][*l+1]*DS_NL1[0][0][Mj_AN][kl][n][*l+2]
+ene_p/3.0*DS_NL1[0][2][Mc_AN][k][m][*l+2]*DS_NL1[0][0][Mj_AN][kl][n][*l+1] );
tmpz =
fugou*
( -ene_p/3.0*DS_NL1[0][3][Mc_AN][k][m][*l+1]*DS_NL1[0][0][Mj_AN][kl][n][*l+2]
+ene_p/3.0*DS_NL1[0][3][Mc_AN][k][m][*l+2]*DS_NL1[0][0][Mj_AN][kl][n][*l+1] );
*sumx2i += tmpx;
*sumy2i += tmpy;
*sumz2i += tmpz;
/* real contribution of l-1/2 for to diagonal up-down matrix */
tmpx =
fugou*
( ene_m/3.0*DS_NL1[1][1][Mc_AN][k][m][*l ]*DS_NL1[1][0][Mj_AN][kl][n][*l+2]
-ene_m/3.0*DS_NL1[1][1][Mc_AN][k][m][*l+2]*DS_NL1[1][0][Mj_AN][kl][n][*l ] );
tmpy =
fugou*
( ene_m/3.0*DS_NL1[1][2][Mc_AN][k][m][*l ]*DS_NL1[1][0][Mj_AN][kl][n][*l+2]
-ene_m/3.0*DS_NL1[1][2][Mc_AN][k][m][*l+2]*DS_NL1[1][0][Mj_AN][kl][n][*l ] );
tmpz =
fugou*
( ene_m/3.0*DS_NL1[1][3][Mc_AN][k][m][*l ]*DS_NL1[1][0][Mj_AN][kl][n][*l+2]
-ene_m/3.0*DS_NL1[1][3][Mc_AN][k][m][*l+2]*DS_NL1[1][0][Mj_AN][kl][n][*l ] );
*sumx2r -= tmpx;
*sumy2r -= tmpy;
*sumz2r -= tmpz;
/* imaginary contribution of l-1/2 to off diagonal up-down matrix */
tmpx =
fugou*
( -ene_m/3.0*DS_NL1[1][1][Mc_AN][k][m][*l+1]*DS_NL1[1][0][Mj_AN][kl][n][*l+2]
+ene_m/3.0*DS_NL1[1][1][Mc_AN][k][m][*l+2]*DS_NL1[1][0][Mj_AN][kl][n][*l+1] );
tmpy =
fugou*
( -ene_m/3.0*DS_NL1[1][2][Mc_AN][k][m][*l+1]*DS_NL1[1][0][Mj_AN][kl][n][*l+2]
+ene_m/3.0*DS_NL1[1][2][Mc_AN][k][m][*l+2]*DS_NL1[1][0][Mj_AN][kl][n][*l+1] );
tmpz =
fugou*
( -ene_m/3.0*DS_NL1[1][3][Mc_AN][k][m][*l+1]*DS_NL1[1][0][Mj_AN][kl][n][*l+2]
+ene_m/3.0*DS_NL1[1][3][Mc_AN][k][m][*l+2]*DS_NL1[1][0][Mj_AN][kl][n][*l+1] );
*sumx2i -= tmpx;
*sumy2i -= tmpy;
*sumz2i -= tmpz;
}
/* d */
if (l2==4){
tmp0 = sqrt(3.0);
tmp1 = ene_p/5.0;
tmp2 = tmp0*tmp1;
/* real contribution of l+1/2 to off diagonal up-down matrix */
for (i=1; i<=3; i++){
deri[i] =
fugou*
( -tmp2*DS_NL1[0][i][Mc_AN][k][m][*l ]*DS_NL1[0][0][Mj_AN][kl][n][*l+3]
+tmp2*DS_NL1[0][i][Mc_AN][k][m][*l+3]*DS_NL1[0][0][Mj_AN][kl][n][*l ]
+tmp1*DS_NL1[0][i][Mc_AN][k][m][*l+1]*DS_NL1[0][0][Mj_AN][kl][n][*l+3]
-tmp1*DS_NL1[0][i][Mc_AN][k][m][*l+3]*DS_NL1[0][0][Mj_AN][kl][n][*l+1]
+tmp1*DS_NL1[0][i][Mc_AN][k][m][*l+2]*DS_NL1[0][0][Mj_AN][kl][n][*l+4]
-tmp1*DS_NL1[0][i][Mc_AN][k][m][*l+4]*DS_NL1[0][0][Mj_AN][kl][n][*l+2] );
}
*sumx2r += deri[1];
*sumy2r += deri[2];
*sumz2r += deri[3];
/* imaginary contribution of l+1/2 to off diagonal up-down matrix */
for (i=1; i<=3; i++){
deri[i] =
fugou*
( +tmp2*DS_NL1[0][i][Mc_AN][k][m][*l ]*DS_NL1[0][0][Mj_AN][kl][n][*l+4]
-tmp2*DS_NL1[0][i][Mc_AN][k][m][*l+4]*DS_NL1[0][0][Mj_AN][kl][n][*l ]
+tmp1*DS_NL1[0][i][Mc_AN][k][m][*l+1]*DS_NL1[0][0][Mj_AN][kl][n][*l+4]
-tmp1*DS_NL1[0][i][Mc_AN][k][m][*l+4]*DS_NL1[0][0][Mj_AN][kl][n][*l+1]
-tmp1*DS_NL1[0][i][Mc_AN][k][m][*l+2]*DS_NL1[0][0][Mj_AN][kl][n][*l+3]
+tmp1*DS_NL1[0][i][Mc_AN][k][m][*l+3]*DS_NL1[0][0][Mj_AN][kl][n][*l+2] );
}
*sumx2i += deri[1];
*sumy2i += deri[2];
*sumz2i += deri[3];
/* real contribution of l-1/2 for to diagonal up-down matrix */
tmp1 = ene_m/5.0;
tmp2 = tmp0*tmp1;
for (i=1; i<=3; i++){
deri[i] =
fugou*
( -tmp2*DS_NL1[1][i][Mc_AN][k][m][*l ]*DS_NL1[1][0][Mj_AN][kl][n][*l+3]
+tmp2*DS_NL1[1][i][Mc_AN][k][m][*l+3]*DS_NL1[1][0][Mj_AN][kl][n][*l ]
+tmp1*DS_NL1[1][i][Mc_AN][k][m][*l+1]*DS_NL1[1][0][Mj_AN][kl][n][*l+3]
-tmp1*DS_NL1[1][i][Mc_AN][k][m][*l+3]*DS_NL1[1][0][Mj_AN][kl][n][*l+1]
+tmp1*DS_NL1[1][i][Mc_AN][k][m][*l+2]*DS_NL1[1][0][Mj_AN][kl][n][*l+4]
-tmp1*DS_NL1[1][i][Mc_AN][k][m][*l+4]*DS_NL1[1][0][Mj_AN][kl][n][*l+2] );
}
*sumx2r -= deri[1];
*sumy2r -= deri[2];
*sumz2r -= deri[3];
/* imaginary contribution of l-1/2 to off diagonal up-down matrix */
for (i=1; i<=3; i++){
deri[i] =
fugou*
( +tmp2*DS_NL1[1][i][Mc_AN][k][m][*l ]*DS_NL1[1][0][Mj_AN][kl][n][*l+4]
-tmp2*DS_NL1[1][i][Mc_AN][k][m][*l+4]*DS_NL1[1][0][Mj_AN][kl][n][*l ]
+tmp1*DS_NL1[1][i][Mc_AN][k][m][*l+1]*DS_NL1[1][0][Mj_AN][kl][n][*l+4]
-tmp1*DS_NL1[1][i][Mc_AN][k][m][*l+4]*DS_NL1[1][0][Mj_AN][kl][n][*l+1]
-tmp1*DS_NL1[1][i][Mc_AN][k][m][*l+2]*DS_NL1[1][0][Mj_AN][kl][n][*l+3]
+tmp1*DS_NL1[1][i][Mc_AN][k][m][*l+3]*DS_NL1[1][0][Mj_AN][kl][n][*l+2] );
}
*sumx2i -= deri[1];
*sumy2i -= deri[2];
*sumz2i -= deri[3];
}
/* f */
if (l2==6){
/* real contribution of l+1/2 to off diagonal up-down matrix */
tmp0 = sqrt(6.0);
tmp1 = sqrt(3.0/2.0);
tmp2 = sqrt(5.0/2.0);
tmp3 = ene_p/7.0;
tmp4 = tmp1*tmp3; /* sqrt(3.0/2.0) */
tmp5 = tmp2*tmp3; /* sqrt(5.0/2.0) */
tmp6 = tmp0*tmp3; /* sqrt(6.0) */
for (i=1; i<=3; i++){
deri[i] =
fugou*
( -tmp6*DS_NL1[0][i][Mc_AN][k][m][*l ]*DS_NL1[0][0][Mj_AN][kl][n][*l+1]
+tmp6*DS_NL1[0][i][Mc_AN][k][m][*l+1]*DS_NL1[0][0][Mj_AN][kl][n][*l ]
-tmp5*DS_NL1[0][i][Mc_AN][k][m][*l+1]*DS_NL1[0][0][Mj_AN][kl][n][*l+3]
+tmp5*DS_NL1[0][i][Mc_AN][k][m][*l+3]*DS_NL1[0][0][Mj_AN][kl][n][*l+1]
-tmp5*DS_NL1[0][i][Mc_AN][k][m][*l+2]*DS_NL1[0][0][Mj_AN][kl][n][*l+4]
+tmp5*DS_NL1[0][i][Mc_AN][k][m][*l+4]*DS_NL1[0][0][Mj_AN][kl][n][*l+2]
-tmp4*DS_NL1[0][i][Mc_AN][k][m][*l+3]*DS_NL1[0][0][Mj_AN][kl][n][*l+5]
+tmp4*DS_NL1[0][i][Mc_AN][k][m][*l+5]*DS_NL1[0][0][Mj_AN][kl][n][*l+3]
-tmp4*DS_NL1[0][i][Mc_AN][k][m][*l+4]*DS_NL1[0][0][Mj_AN][kl][n][*l+6]
+tmp4*DS_NL1[0][i][Mc_AN][k][m][*l+6]*DS_NL1[0][0][Mj_AN][kl][n][*l+4] );
}
*sumx2r += deri[1];
*sumy2r += deri[2];
*sumz2r += deri[3];
/* imaginary contribution of l+1/2 to off diagonal up-down matrix */
for (i=1; i<=3; i++){
deri[i] =
fugou*
( +tmp6*DS_NL1[0][i][Mc_AN][k][m][*l ]*DS_NL1[0][0][Mj_AN][kl][n][*l+2]
-tmp6*DS_NL1[0][i][Mc_AN][k][m][*l+2]*DS_NL1[0][0][Mj_AN][kl][n][*l ]
+tmp5*DS_NL1[0][i][Mc_AN][k][m][*l+1]*DS_NL1[0][0][Mj_AN][kl][n][*l+4]
-tmp5*DS_NL1[0][i][Mc_AN][k][m][*l+4]*DS_NL1[0][0][Mj_AN][kl][n][*l+1]
-tmp5*DS_NL1[0][i][Mc_AN][k][m][*l+2]*DS_NL1[0][0][Mj_AN][kl][n][*l+3]
+tmp5*DS_NL1[0][i][Mc_AN][k][m][*l+3]*DS_NL1[0][0][Mj_AN][kl][n][*l+2]
+tmp4*DS_NL1[0][i][Mc_AN][k][m][*l+3]*DS_NL1[0][0][Mj_AN][kl][n][*l+6]
-tmp4*DS_NL1[0][i][Mc_AN][k][m][*l+6]*DS_NL1[0][0][Mj_AN][kl][n][*l+3]
-tmp4*DS_NL1[0][i][Mc_AN][k][m][*l+4]*DS_NL1[0][0][Mj_AN][kl][n][*l+5]
+tmp4*DS_NL1[0][i][Mc_AN][k][m][*l+5]*DS_NL1[0][0][Mj_AN][kl][n][*l+4] );
}
*sumx2i += deri[1];
*sumy2i += deri[2];
*sumz2i += deri[3];
/* real contribution of l-1/2 for to diagonal up-down matrix */
tmp3 = ene_m/7.0;
tmp4 = tmp1*tmp3; /* sqrt(3.0/2.0) */
tmp5 = tmp2*tmp3; /* sqrt(5.0/2.0) */
tmp6 = tmp0*tmp3; /* sqrt(6.0) */
for (i=1; i<=3; i++){
deri[i] =
fugou*
( -tmp6*DS_NL1[1][i][Mc_AN][k][m][*l ]*DS_NL1[1][0][Mj_AN][kl][n][*l+1]
+tmp6*DS_NL1[1][i][Mc_AN][k][m][*l+1]*DS_NL1[1][0][Mj_AN][kl][n][*l ]
-tmp5*DS_NL1[1][i][Mc_AN][k][m][*l+1]*DS_NL1[1][0][Mj_AN][kl][n][*l+3]
+tmp5*DS_NL1[1][i][Mc_AN][k][m][*l+3]*DS_NL1[1][0][Mj_AN][kl][n][*l+1]
-tmp5*DS_NL1[1][i][Mc_AN][k][m][*l+2]*DS_NL1[1][0][Mj_AN][kl][n][*l+4]
+tmp5*DS_NL1[1][i][Mc_AN][k][m][*l+4]*DS_NL1[1][0][Mj_AN][kl][n][*l+2]
-tmp4*DS_NL1[1][i][Mc_AN][k][m][*l+3]*DS_NL1[1][0][Mj_AN][kl][n][*l+5]
+tmp4*DS_NL1[1][i][Mc_AN][k][m][*l+5]*DS_NL1[1][0][Mj_AN][kl][n][*l+3]
-tmp4*DS_NL1[1][i][Mc_AN][k][m][*l+4]*DS_NL1[1][0][Mj_AN][kl][n][*l+6]
+tmp4*DS_NL1[1][i][Mc_AN][k][m][*l+6]*DS_NL1[1][0][Mj_AN][kl][n][*l+4] );
}
*sumx2r -= deri[1];
*sumy2r -= deri[2];
*sumz2r -= deri[3];
/* imaginary contribution of l-1/2 to off diagonal up-down matrix */
for (i=1; i<=3; i++){
deri[i] =
fugou*
( +tmp6*DS_NL1[1][i][Mc_AN][k][m][*l ]*DS_NL1[1][0][Mj_AN][kl][n][*l+2]
-tmp6*DS_NL1[1][i][Mc_AN][k][m][*l+2]*DS_NL1[1][0][Mj_AN][kl][n][*l ]
+tmp5*DS_NL1[1][i][Mc_AN][k][m][*l+1]*DS_NL1[1][0][Mj_AN][kl][n][*l+4]
-tmp5*DS_NL1[1][i][Mc_AN][k][m][*l+4]*DS_NL1[1][0][Mj_AN][kl][n][*l+1]
-tmp5*DS_NL1[1][i][Mc_AN][k][m][*l+2]*DS_NL1[1][0][Mj_AN][kl][n][*l+3]
+tmp5*DS_NL1[1][i][Mc_AN][k][m][*l+3]*DS_NL1[1][0][Mj_AN][kl][n][*l+2]
+tmp4*DS_NL1[1][i][Mc_AN][k][m][*l+3]*DS_NL1[1][0][Mj_AN][kl][n][*l+6]
-tmp4*DS_NL1[1][i][Mc_AN][k][m][*l+6]*DS_NL1[1][0][Mj_AN][kl][n][*l+3]
-tmp4*DS_NL1[1][i][Mc_AN][k][m][*l+4]*DS_NL1[1][0][Mj_AN][kl][n][*l+5]
+tmp4*DS_NL1[1][i][Mc_AN][k][m][*l+5]*DS_NL1[1][0][Mj_AN][kl][n][*l+4] );
}
*sumx2i -= deri[1];
*sumy2i -= deri[2];
*sumz2i -= deri[3];
}
}
/****************************************************
off-diagonal contribution on up-up and dn-dn
****************************************************/
/* p */
if (l2==2){
tmpx =
fugou*
( ene_p/3.0*DS_NL1[0][1][Mc_AN][k][m][*l ]*DS_NL1[0][0][Mj_AN][kl][n][*l+1]
-ene_p/3.0*DS_NL1[0][1][Mc_AN][k][m][*l+1]*DS_NL1[0][0][Mj_AN][kl][n][*l ] );
tmpy =
fugou*
( ene_p/3.0*DS_NL1[0][2][Mc_AN][k][m][*l ]*DS_NL1[0][0][Mj_AN][kl][n][*l+1]
-ene_p/3.0*DS_NL1[0][2][Mc_AN][k][m][*l+1]*DS_NL1[0][0][Mj_AN][kl][n][*l ] );
tmpz =
fugou*
( ene_p/3.0*DS_NL1[0][3][Mc_AN][k][m][*l ]*DS_NL1[0][0][Mj_AN][kl][n][*l+1]
-ene_p/3.0*DS_NL1[0][3][Mc_AN][k][m][*l+1]*DS_NL1[0][0][Mj_AN][kl][n][*l ] );
/* contribution of l+1/2 for up spin */
*sumx0i += -tmpx;
*sumy0i += -tmpy;
*sumz0i += -tmpz;
/* contribution of l+1/2 for down spin */
*sumx1i += tmpx;
*sumy1i += tmpy;
*sumz1i += tmpz;
tmpx =
fugou*
( ene_m/3.0*DS_NL1[1][1][Mc_AN][k][m][*l ]*DS_NL1[1][0][Mj_AN][kl][n][*l+1]
-ene_m/3.0*DS_NL1[1][1][Mc_AN][k][m][*l+1]*DS_NL1[1][0][Mj_AN][kl][n][*l ] );
tmpy =
fugou*
( ene_m/3.0*DS_NL1[1][2][Mc_AN][k][m][*l ]*DS_NL1[1][0][Mj_AN][kl][n][*l+1]
-ene_m/3.0*DS_NL1[1][2][Mc_AN][k][m][*l+1]*DS_NL1[1][0][Mj_AN][kl][n][*l ] );
tmpz =
fugou*
( ene_m/3.0*DS_NL1[1][3][Mc_AN][k][m][*l ]*DS_NL1[1][0][Mj_AN][kl][n][*l+1]
-ene_m/3.0*DS_NL1[1][3][Mc_AN][k][m][*l+1]*DS_NL1[1][0][Mj_AN][kl][n][*l ] );
/* contribution of l-1/2 for up spin */
*sumx0i += tmpx;
*sumy0i += tmpy;
*sumz0i += tmpz;
/* contribution of l+1/2 for down spin */
*sumx1i += -tmpx;
*sumy1i += -tmpy;
*sumz1i += -tmpz;
}
/* d */
else if (l2==4){
tmpx =
fugou*
(
ene_p*2.0/5.0*DS_NL1[0][1][Mc_AN][k][m][*l+1]*DS_NL1[0][0][Mj_AN][kl][n][*l+2]
-ene_p*2.0/5.0*DS_NL1[0][1][Mc_AN][k][m][*l+2]*DS_NL1[0][0][Mj_AN][kl][n][*l+1]
+ene_p*1.0/5.0*DS_NL1[0][1][Mc_AN][k][m][*l+3]*DS_NL1[0][0][Mj_AN][kl][n][*l+4]
-ene_p*1.0/5.0*DS_NL1[0][1][Mc_AN][k][m][*l+4]*DS_NL1[0][0][Mj_AN][kl][n][*l+3] );
tmpy =
fugou*
(
ene_p*2.0/5.0*DS_NL1[0][2][Mc_AN][k][m][*l+1]*DS_NL1[0][0][Mj_AN][kl][n][*l+2]
-ene_p*2.0/5.0*DS_NL1[0][2][Mc_AN][k][m][*l+2]*DS_NL1[0][0][Mj_AN][kl][n][*l+1]
+ene_p*1.0/5.0*DS_NL1[0][2][Mc_AN][k][m][*l+3]*DS_NL1[0][0][Mj_AN][kl][n][*l+4]
-ene_p*1.0/5.0*DS_NL1[0][2][Mc_AN][k][m][*l+4]*DS_NL1[0][0][Mj_AN][kl][n][*l+3] );
tmpz =
fugou*
(
ene_p*2.0/5.0*DS_NL1[0][3][Mc_AN][k][m][*l+1]*DS_NL1[0][0][Mj_AN][kl][n][*l+2]
-ene_p*2.0/5.0*DS_NL1[0][3][Mc_AN][k][m][*l+2]*DS_NL1[0][0][Mj_AN][kl][n][*l+1]
+ene_p*1.0/5.0*DS_NL1[0][3][Mc_AN][k][m][*l+3]*DS_NL1[0][0][Mj_AN][kl][n][*l+4]
-ene_p*1.0/5.0*DS_NL1[0][3][Mc_AN][k][m][*l+4]*DS_NL1[0][0][Mj_AN][kl][n][*l+3] );
/* contribution of l+1/2 for up spin */
*sumx0i += -tmpx;
*sumy0i += -tmpy;
*sumz0i += -tmpz;
/* contribution of l+1/2 for down spin */
*sumx1i += tmpx;
*sumy1i += tmpy;
*sumz1i += tmpz;
tmpx =
fugou*
(
ene_m*2.0/5.0*DS_NL1[1][1][Mc_AN][k][m][*l+1]*DS_NL1[1][0][Mj_AN][kl][n][*l+2]
-ene_m*2.0/5.0*DS_NL1[1][1][Mc_AN][k][m][*l+2]*DS_NL1[1][0][Mj_AN][kl][n][*l+1]
+ene_m*1.0/5.0*DS_NL1[1][1][Mc_AN][k][m][*l+3]*DS_NL1[1][0][Mj_AN][kl][n][*l+4]
-ene_m*1.0/5.0*DS_NL1[1][1][Mc_AN][k][m][*l+4]*DS_NL1[1][0][Mj_AN][kl][n][*l+3] );
tmpy =
fugou*
(
ene_m*2.0/5.0*DS_NL1[1][2][Mc_AN][k][m][*l+1]*DS_NL1[1][0][Mj_AN][kl][n][*l+2]
-ene_m*2.0/5.0*DS_NL1[1][2][Mc_AN][k][m][*l+2]*DS_NL1[1][0][Mj_AN][kl][n][*l+1]
+ene_m*1.0/5.0*DS_NL1[1][2][Mc_AN][k][m][*l+3]*DS_NL1[1][0][Mj_AN][kl][n][*l+4]
-ene_m*1.0/5.0*DS_NL1[1][2][Mc_AN][k][m][*l+4]*DS_NL1[1][0][Mj_AN][kl][n][*l+3] );
tmpz =
fugou*
(
ene_m*2.0/5.0*DS_NL1[1][3][Mc_AN][k][m][*l+1]*DS_NL1[1][0][Mj_AN][kl][n][*l+2]
-ene_m*2.0/5.0*DS_NL1[1][3][Mc_AN][k][m][*l+2]*DS_NL1[1][0][Mj_AN][kl][n][*l+1]
+ene_m*1.0/5.0*DS_NL1[1][3][Mc_AN][k][m][*l+3]*DS_NL1[1][0][Mj_AN][kl][n][*l+4]
-ene_m*1.0/5.0*DS_NL1[1][3][Mc_AN][k][m][*l+4]*DS_NL1[1][0][Mj_AN][kl][n][*l+3] );
/* contribution of l-1/2 for up spin */
*sumx0i += tmpx;
*sumy0i += tmpy;
*sumz0i += tmpz;
/* contribution of l-1/2 for down spin */
*sumx1i += -tmpx;
*sumy1i += -tmpy;
*sumz1i += -tmpz;
}
/* f */
else if (l2==6){
tmpx =
fugou*
(
ene_p*1.0/7.0*DS_NL1[0][1][Mc_AN][k][m][*l+1]*DS_NL1[0][0][Mj_AN][kl][n][*l+2]
-ene_p*1.0/7.0*DS_NL1[0][1][Mc_AN][k][m][*l+2]*DS_NL1[0][0][Mj_AN][kl][n][*l+1]
+ene_p*2.0/7.0*DS_NL1[0][1][Mc_AN][k][m][*l+3]*DS_NL1[0][0][Mj_AN][kl][n][*l+4]
-ene_p*2.0/7.0*DS_NL1[0][1][Mc_AN][k][m][*l+4]*DS_NL1[0][0][Mj_AN][kl][n][*l+3]
+ene_p*3.0/7.0*DS_NL1[0][1][Mc_AN][k][m][*l+5]*DS_NL1[0][0][Mj_AN][kl][n][*l+6]
-ene_p*3.0/7.0*DS_NL1[0][1][Mc_AN][k][m][*l+6]*DS_NL1[0][0][Mj_AN][kl][n][*l+5] );
tmpy =
fugou*
(
ene_p*1.0/7.0*DS_NL1[0][2][Mc_AN][k][m][*l+1]*DS_NL1[0][0][Mj_AN][kl][n][*l+2]
-ene_p*1.0/7.0*DS_NL1[0][2][Mc_AN][k][m][*l+2]*DS_NL1[0][0][Mj_AN][kl][n][*l+1]
+ene_p*2.0/7.0*DS_NL1[0][2][Mc_AN][k][m][*l+3]*DS_NL1[0][0][Mj_AN][kl][n][*l+4]
-ene_p*2.0/7.0*DS_NL1[0][2][Mc_AN][k][m][*l+4]*DS_NL1[0][0][Mj_AN][kl][n][*l+3]
+ene_p*3.0/7.0*DS_NL1[0][2][Mc_AN][k][m][*l+5]*DS_NL1[0][0][Mj_AN][kl][n][*l+6]
-ene_p*3.0/7.0*DS_NL1[0][2][Mc_AN][k][m][*l+6]*DS_NL1[0][0][Mj_AN][kl][n][*l+5] );
tmpz =
fugou*
(
ene_p*1.0/7.0*DS_NL1[0][3][Mc_AN][k][m][*l+1]*DS_NL1[0][0][Mj_AN][kl][n][*l+2]
-ene_p*1.0/7.0*DS_NL1[0][3][Mc_AN][k][m][*l+2]*DS_NL1[0][0][Mj_AN][kl][n][*l+1]
+ene_p*2.0/7.0*DS_NL1[0][3][Mc_AN][k][m][*l+3]*DS_NL1[0][0][Mj_AN][kl][n][*l+4]
-ene_p*2.0/7.0*DS_NL1[0][3][Mc_AN][k][m][*l+4]*DS_NL1[0][0][Mj_AN][kl][n][*l+3]
+ene_p*3.0/7.0*DS_NL1[0][3][Mc_AN][k][m][*l+5]*DS_NL1[0][0][Mj_AN][kl][n][*l+6]
-ene_p*3.0/7.0*DS_NL1[0][3][Mc_AN][k][m][*l+6]*DS_NL1[0][0][Mj_AN][kl][n][*l+5] );
/* contribution of l+1/2 for up spin */
*sumx0i += -tmpx;
*sumy0i += -tmpy;
*sumz0i += -tmpz;
/* contribution of l+1/2 for down spin */
*sumx1i += tmpx;
*sumy1i += tmpy;
*sumz1i += tmpz;
tmpx =
fugou*
(
ene_m*1.0/7.0*DS_NL1[1][1][Mc_AN][k][m][*l+1]*DS_NL1[1][0][Mj_AN][kl][n][*l+2]
-ene_m*1.0/7.0*DS_NL1[1][1][Mc_AN][k][m][*l+2]*DS_NL1[1][0][Mj_AN][kl][n][*l+1]
+ene_m*2.0/7.0*DS_NL1[1][1][Mc_AN][k][m][*l+3]*DS_NL1[1][0][Mj_AN][kl][n][*l+4]
-ene_m*2.0/7.0*DS_NL1[1][1][Mc_AN][k][m][*l+4]*DS_NL1[1][0][Mj_AN][kl][n][*l+3]
+ene_m*3.0/7.0*DS_NL1[1][1][Mc_AN][k][m][*l+5]*DS_NL1[1][0][Mj_AN][kl][n][*l+6]
-ene_m*3.0/7.0*DS_NL1[1][1][Mc_AN][k][m][*l+6]*DS_NL1[1][0][Mj_AN][kl][n][*l+5] );
tmpy =
fugou*
(
ene_m*1.0/7.0*DS_NL1[1][2][Mc_AN][k][m][*l+1]*DS_NL1[1][0][Mj_AN][kl][n][*l+2]
-ene_m*1.0/7.0*DS_NL1[1][2][Mc_AN][k][m][*l+2]*DS_NL1[1][0][Mj_AN][kl][n][*l+1]
+ene_m*2.0/7.0*DS_NL1[1][2][Mc_AN][k][m][*l+3]*DS_NL1[1][0][Mj_AN][kl][n][*l+4]
-ene_m*2.0/7.0*DS_NL1[1][2][Mc_AN][k][m][*l+4]*DS_NL1[1][0][Mj_AN][kl][n][*l+3]
+ene_m*3.0/7.0*DS_NL1[1][2][Mc_AN][k][m][*l+5]*DS_NL1[1][0][Mj_AN][kl][n][*l+6]
-ene_m*3.0/7.0*DS_NL1[1][2][Mc_AN][k][m][*l+6]*DS_NL1[1][0][Mj_AN][kl][n][*l+5] );
tmpz =
fugou*
(
ene_m*1.0/7.0*DS_NL1[1][3][Mc_AN][k][m][*l+1]*DS_NL1[1][0][Mj_AN][kl][n][*l+2]
-ene_m*1.0/7.0*DS_NL1[1][3][Mc_AN][k][m][*l+2]*DS_NL1[1][0][Mj_AN][kl][n][*l+1]
+ene_m*2.0/7.0*DS_NL1[1][3][Mc_AN][k][m][*l+3]*DS_NL1[1][0][Mj_AN][kl][n][*l+4]
-ene_m*2.0/7.0*DS_NL1[1][3][Mc_AN][k][m][*l+4]*DS_NL1[1][0][Mj_AN][kl][n][*l+3]
+ene_m*3.0/7.0*DS_NL1[1][3][Mc_AN][k][m][*l+5]*DS_NL1[1][0][Mj_AN][kl][n][*l+6]
-ene_m*3.0/7.0*DS_NL1[1][3][Mc_AN][k][m][*l+6]*DS_NL1[1][0][Mj_AN][kl][n][*l+5] );
/* contribution of l-1/2 for up spin */
*sumx0i += tmpx;
*sumy0i += tmpy;
*sumz0i += tmpz;
/* contribution of l-1/2 for down spin */
*sumx1i += -tmpx;
*sumy1i += -tmpy;
*sumz1i += -tmpz;
}
/****************************************************
diagonal contribution on up-up and dn-dn
****************************************************/
for (l3=0; l3<=l2; l3++){
/* VNL for j=l+1/2 */
tmpx = PFp*ene_p*DS_NL1[0][1][Mc_AN][k][m][*l]*DS_NL1[0][0][Mj_AN][kl][n][*l];
tmpy = PFp*ene_p*DS_NL1[0][2][Mc_AN][k][m][*l]*DS_NL1[0][0][Mj_AN][kl][n][*l];
tmpz = PFp*ene_p*DS_NL1[0][3][Mc_AN][k][m][*l]*DS_NL1[0][0][Mj_AN][kl][n][*l];
*sumx0r += tmpx;
*sumy0r += tmpy;
*sumz0r += tmpz;
*sumx1r += tmpx;
*sumy1r += tmpy;
*sumz1r += tmpz;
/* VNL for j=l-1/2 */
tmpx = PFm*ene_m*DS_NL1[1][1][Mc_AN][k][m][*l]*DS_NL1[1][0][Mj_AN][kl][n][*l];
tmpy = PFm*ene_m*DS_NL1[1][2][Mc_AN][k][m][*l]*DS_NL1[1][0][Mj_AN][kl][n][*l];
tmpz = PFm*ene_m*DS_NL1[1][3][Mc_AN][k][m][*l]*DS_NL1[1][0][Mj_AN][kl][n][*l];
*sumx0r += tmpx;
*sumy0r += tmpy;
*sumz0r += tmpz;
*sumx1r += tmpx;
*sumy1r += tmpy;
*sumz1r += tmpz;
*l = *l + 1;
}
}
void dH_U_full(int Mc_AN, int h_AN, int q_AN,
double *****OLP, double ****v_eff,
double ***Hx, double ***Hy, double ***Hz)
{
int i,j,k,m,n,kg,kan,so,deri_kind,Mk_AN;
int ig,ian,jg,jan,kl,kl1,kl2,spin,spinmax;
int wakg,l1,l2,l3,Gc_AN,Mi_AN,Mj_AN;
int Rwan,Lwan,p,p0;
double PF[2],sumx,sumy,sumz,ene;
double tmpx,tmpy,tmpz;
double Lsum0,Lsum1,Lsum2,Lsum3;
double Rsum0,Rsum1,Rsum2,Rsum3;
double PFp,PFm,ene_p,ene_m;
double ***Hx2,***Hy2,***Hz2;
double sumx0,sumy0,sumz0;
double sumx1,sumy1,sumz1;
double sumx2,sumy2,sumz2;
/****************************************************
allocation of arrays:
double Hx2[3][List_YOUSO[7]][List_YOUSO[7]];
double Hy2[3][List_YOUSO[7]][List_YOUSO[7]];
double Hz2[3][List_YOUSO[7]][List_YOUSO[7]];
****************************************************/
Hx2 = (double***)malloc(sizeof(double**)*3);
for (i=0; i<3; i++){
Hx2[i] = (double**)malloc(sizeof(double*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hx2[i][j] = (double*)malloc(sizeof(double)*List_YOUSO[7]);
}
}
Hy2 = (double***)malloc(sizeof(double**)*3);
for (i=0; i<3; i++){
Hy2[i] = (double**)malloc(sizeof(double*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hy2[i][j] = (double*)malloc(sizeof(double)*List_YOUSO[7]);
}
}
Hz2 = (double***)malloc(sizeof(double**)*3);
for (i=0; i<3; i++){
Hz2[i] = (double**)malloc(sizeof(double*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hz2[i][j] = (double*)malloc(sizeof(double)*List_YOUSO[7]);
}
}
/****************************************************
start calc.
****************************************************/
if (SpinP_switch==0) spinmax = 0;
else spinmax = 1;
Gc_AN = M2G[Mc_AN];
ig = natn[Gc_AN][h_AN];
Lwan = WhatSpecies[ig];
Mi_AN = F_G2M[ig]; /* F_G2M should be used */
ian = Spe_Total_CNO[Lwan];
jg = natn[Gc_AN][q_AN];
Rwan = WhatSpecies[jg];
Mj_AN = F_G2M[jg]; /* F_G2M should be used */
jan = Spe_Total_CNO[Rwan];
if (h_AN==0){
/****************************************************
dS*ep*S
****************************************************/
for (k=0; k<=FNAN[Gc_AN]; k++){
kg = natn[Gc_AN][k];
Mk_AN = F_G2M[kg]; /* F_G2M should be used */
wakg = WhatSpecies[kg];
kan = Spe_Total_NO[wakg];
kl = RMI1[Mc_AN][q_AN][k];
/****************************************************
derivative at h_AN (=Mc_AN)
****************************************************/
if (0<=kl){
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
for (spin=0; spin<=spinmax; spin++){
sumx = 0.0;
sumy = 0.0;
sumz = 0.0;
if (Cnt_switch==0){
for (l1=0; l1<kan; l1++){
for (l2=0; l2<kan; l2++){
ene = v_eff[spin][Mk_AN][l1][l2];
sumx += ene*OLP[1][Mc_AN][k][m][l1]*OLP[0][Mj_AN][kl][n][l2];
sumy += ene*OLP[2][Mc_AN][k][m][l1]*OLP[0][Mj_AN][kl][n][l2];
sumz += ene*OLP[3][Mc_AN][k][m][l1]*OLP[0][Mj_AN][kl][n][l2];
}
}
}
else if (Cnt_switch==1){
for (l1=0; l1<kan; l1++){
for (l2=0; l2<kan; l2++){
Lsum1 = 0.0;
Lsum2 = 0.0;
Lsum3 = 0.0;
for (p=0; p<Spe_Specified_Num[Lwan][m]; p++){
p0 = Spe_Trans_Orbital[Lwan][m][p];
Lsum1 += CntCoes[Mc_AN][m][p]*OLP[1][Mc_AN][k][p0][l1];
Lsum2 += CntCoes[Mc_AN][m][p]*OLP[2][Mc_AN][k][p0][l1];
Lsum3 += CntCoes[Mc_AN][m][p]*OLP[3][Mc_AN][k][p0][l1];
}
Rsum0 = 0.0;
for (p=0; p<Spe_Specified_Num[Rwan][n]; p++){
p0 = Spe_Trans_Orbital[Rwan][n][p];
Rsum0 += CntCoes[Mj_AN][n][p]*OLP[0][Mj_AN][kl][p0][l2];
}
ene = v_eff[spin][Mk_AN][l1][l2];
sumx += ene*Lsum1*Rsum0;
sumy += ene*Lsum2*Rsum0;
sumz += ene*Lsum3*Rsum0;
}
}
}
if (k==0){
Hx[spin][m][n] = sumx;
Hy[spin][m][n] = sumy;
Hz[spin][m][n] = sumz;
Hx[2][m][n] = 0.0;
Hy[2][m][n] = 0.0;
Hz[2][m][n] = 0.0;
}
else {
Hx[spin][m][n] += sumx;
Hy[spin][m][n] += sumy;
Hz[spin][m][n] += sumz;
}
}
}
}
} /* if */
} /* k */
/****************************************************
S*ep*dS
****************************************************/
if (q_AN==0){
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
Hx2[0][m][n] = Hx[0][m][n];
Hy2[0][m][n] = Hy[0][m][n];
Hz2[0][m][n] = Hz[0][m][n];
Hx2[1][m][n] = Hx[1][m][n];
Hy2[1][m][n] = Hy[1][m][n];
Hz2[1][m][n] = Hz[1][m][n];
}
}
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
Hx[0][m][n] = Hx2[0][m][n] + Hx2[0][n][m];
Hy[0][m][n] = Hy2[0][m][n] + Hy2[0][n][m];
Hz[0][m][n] = Hz2[0][m][n] + Hz2[0][n][m];
Hx[1][m][n] = Hx2[1][m][n] + Hx2[1][n][m];
Hy[1][m][n] = Hy2[1][m][n] + Hy2[1][n][m];
Hz[1][m][n] = Hz2[1][m][n] + Hz2[1][n][m];
}
}
}
else {
kg = natn[Gc_AN][0];
Mk_AN = F_G2M[kg]; /* F_G2M should be used */
wakg = WhatSpecies[kg];
kan = Spe_Total_NO[wakg];
kl = RMI1[Mc_AN][q_AN][0];
/****************************************************
derivative at k=0
****************************************************/
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
for (spin=0; spin<=spinmax; spin++){
sumx = 0.0;
sumy = 0.0;
sumz = 0.0;
if (Cnt_switch==0){
for (l1=0; l1<kan; l1++){
for (l2=0; l2<kan; l2++){
ene = v_eff[spin][Mk_AN][l1][l2];
sumx -= ene*OLP[0][Mc_AN][0][m][l1]*OLP[1][Mj_AN][kl][n][l2];
sumy -= ene*OLP[0][Mc_AN][0][m][l1]*OLP[2][Mj_AN][kl][n][l2];
sumz -= ene*OLP[0][Mc_AN][0][m][l1]*OLP[3][Mj_AN][kl][n][l2];
}
}
}
else if (Cnt_switch==1){
for (l1=0; l1<kan; l1++){
for (l2=0; l2<kan; l2++){
Lsum0 = 0.0;
for (p=0; p<Spe_Specified_Num[Lwan][m]; p++){
p0 = Spe_Trans_Orbital[Lwan][m][p];
Lsum0 += CntCoes[Mc_AN][m][p]*OLP[0][Mc_AN][0][p0][l1];
}
Rsum1 = 0.0;
Rsum2 = 0.0;
Rsum3 = 0.0;
for (p=0; p<Spe_Specified_Num[Rwan][n]; p++){
p0 = Spe_Trans_Orbital[Rwan][n][p];
Rsum1 += CntCoes[Mj_AN][n][p]*OLP[1][Mj_AN][kl][p0][l2];
Rsum2 += CntCoes[Mj_AN][n][p]*OLP[2][Mj_AN][kl][p0][l2];
Rsum3 += CntCoes[Mj_AN][n][p]*OLP[3][Mj_AN][kl][p0][l2];
}
ene = v_eff[spin][Mk_AN][l1][l2];
sumx -= ene*Lsum0*Rsum1;
sumy -= ene*Lsum0*Rsum2;
sumz -= ene*Lsum0*Rsum3;
}
}
}
Hx[spin][m][n] += sumx;
Hy[spin][m][n] += sumy;
Hz[spin][m][n] += sumz;
}
}
}
}
} /* if (h_AN==0) */
else {
/****************************************************
dS*ep*S
****************************************************/
kg = natn[Gc_AN][0];
Mk_AN = F_G2M[kg]; /* F_G2M should be used */
wakg = WhatSpecies[kg];
kan = Spe_Total_NO[wakg];
kl1 = RMI1[Mc_AN][h_AN][0];
kl2 = RMI1[Mc_AN][q_AN][0];
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
for (spin=0; spin<=spinmax; spin++){
sumx = 0.0;
sumy = 0.0;
sumz = 0.0;
if (Cnt_switch==0){
for (l1=0; l1<kan; l1++){
for (l2=0; l2<kan; l2++){
ene = v_eff[spin][Mk_AN][l1][l2];
sumx -= ene*OLP[1][Mi_AN][kl1][m][l1]*OLP[0][Mj_AN][kl2][n][l2];
sumy -= ene*OLP[2][Mi_AN][kl1][m][l1]*OLP[0][Mj_AN][kl2][n][l2];
sumz -= ene*OLP[3][Mi_AN][kl1][m][l1]*OLP[0][Mj_AN][kl2][n][l2];
}
}
}
else if (Cnt_switch==1){
for (l1=0; l1<kan; l1++){
for (l2=0; l2<kan; l2++){
Lsum1 = 0.0;
Lsum2 = 0.0;
Lsum3 = 0.0;
for (p=0; p<Spe_Specified_Num[Lwan][m]; p++){
p0 = Spe_Trans_Orbital[Lwan][m][p];
Lsum1 += CntCoes[Mi_AN][m][p]*OLP[1][Mi_AN][kl1][p0][l1];
Lsum2 += CntCoes[Mi_AN][m][p]*OLP[2][Mi_AN][kl1][p0][l1];
Lsum3 += CntCoes[Mi_AN][m][p]*OLP[3][Mi_AN][kl1][p0][l1];
}
Rsum0 = 0.0;
for (p=0; p<Spe_Specified_Num[Rwan][n]; p++){
p0 = Spe_Trans_Orbital[Rwan][n][p];
Rsum0 += CntCoes[Mj_AN][n][p]*OLP[0][Mj_AN][kl2][p0][l2];
}
ene = v_eff[spin][Mk_AN][l1][l2];
sumx -= ene*Lsum1*Rsum0;
sumy -= ene*Lsum2*Rsum0;
sumz -= ene*Lsum3*Rsum0;
}
}
}
Hx[spin][m][n] = sumx;
Hy[spin][m][n] = sumy;
Hz[spin][m][n] = sumz;
Hx[2][m][n] = 0.0;
Hy[2][m][n] = 0.0;
Hz[2][m][n] = 0.0;
}
}
}
/****************************************************
S*ep*dS
****************************************************/
if (q_AN==0){
for (k=0; k<=FNAN[Gc_AN]; k++){
kg = natn[Gc_AN][k];
Mk_AN = F_G2M[kg]; /* F_G2M should be used */
wakg = WhatSpecies[kg];
kan = Spe_Total_NO[wakg];
kl1 = RMI1[Mc_AN][h_AN][k];
kl2 = RMI1[Mc_AN][q_AN][k];
if (0<=kl1){
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
for (spin=0; spin<=spinmax; spin++){
sumx = 0.0;
sumy = 0.0;
sumz = 0.0;
if (Cnt_switch==0){
for (l1=0; l1<kan; l1++){
for (l2=0; l2<kan; l2++){
ene = v_eff[spin][Mk_AN][l1][l2];
sumx += ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[1][Mj_AN][kl2][n][l2];
sumy += ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[2][Mj_AN][kl2][n][l2];
sumz += ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[3][Mj_AN][kl2][n][l2];
}
}
}
else if (Cnt_switch==1){
for (l1=0; l1<kan; l1++){
for (l2=0; l2<kan; l2++){
Lsum0 = 0.0;
for (p=0; p<Spe_Specified_Num[Lwan][m]; p++){
p0 = Spe_Trans_Orbital[Lwan][m][p];
Lsum0 += CntCoes[Mi_AN][m][p]*OLP[0][Mi_AN][kl1][p0][l1];
}
Rsum1 = 0.0;
Rsum2 = 0.0;
Rsum3 = 0.0;
for (p=0; p<Spe_Specified_Num[Rwan][n]; p++){
p0 = Spe_Trans_Orbital[Rwan][n][p];
Rsum1 += CntCoes[Mj_AN][n][p]*OLP[1][Mj_AN][kl2][p0][l2];
Rsum2 += CntCoes[Mj_AN][n][p]*OLP[2][Mj_AN][kl2][p0][l2];
Rsum3 += CntCoes[Mj_AN][n][p]*OLP[3][Mj_AN][kl2][p0][l2];
}
ene = v_eff[spin][Mk_AN][l1][l2];
sumx += ene*Lsum0*Rsum1;
sumy += ene*Lsum0*Rsum2;
sumz += ene*Lsum0*Rsum3;
}
}
}
Hx[spin][m][n] += sumx;
Hy[spin][m][n] += sumy;
Hz[spin][m][n] += sumz;
}
}
}
}
}
} /* if (q_AN==0) */
else {
kg = natn[Gc_AN][0];
Mk_AN = F_G2M[kg]; /* F_G2M should be used */
wakg = WhatSpecies[kg];
kan = Spe_Total_NO[wakg];
kl1 = RMI1[Mc_AN][h_AN][0];
kl2 = RMI1[Mc_AN][q_AN][0];
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
for (spin=0; spin<=spinmax; spin++){
sumx = 0.0;
sumy = 0.0;
sumz = 0.0;
if (Cnt_switch==0){
for (l1=0; l1<kan; l1++){
for (l2=0; l2<kan; l2++){
ene = v_eff[spin][Mk_AN][l1][l2];
sumx -= ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[1][Mj_AN][kl2][n][l2];
sumy -= ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[2][Mj_AN][kl2][n][l2];
sumz -= ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[3][Mj_AN][kl2][n][l2];
}
}
}
else if (Cnt_switch==1){
for (l1=0; l1<kan; l1++){
for (l2=0; l2<kan; l2++){
Lsum0 = 0.0;
for (p=0; p<Spe_Specified_Num[Lwan][m]; p++){
p0 = Spe_Trans_Orbital[Lwan][m][p];
Lsum0 += CntCoes[Mi_AN][m][p]*OLP[0][Mi_AN][kl1][p0][l1];
}
Rsum1 = 0.0;
Rsum2 = 0.0;
Rsum3 = 0.0;
for (p=0; p<Spe_Specified_Num[Rwan][n]; p++){
p0 = Spe_Trans_Orbital[Rwan][n][p];
Rsum1 += CntCoes[Mj_AN][n][p]*OLP[1][Mj_AN][kl2][p0][l2];
Rsum2 += CntCoes[Mj_AN][n][p]*OLP[2][Mj_AN][kl2][p0][l2];
Rsum3 += CntCoes[Mj_AN][n][p]*OLP[3][Mj_AN][kl2][p0][l2];
}
ene = v_eff[spin][Mk_AN][l1][l2];
sumx -= ene*Lsum0*Rsum1;
sumy -= ene*Lsum0*Rsum2;
sumz -= ene*Lsum0*Rsum3;
}
}
}
Hx[spin][m][n] += sumx;
Hy[spin][m][n] += sumy;
Hz[spin][m][n] += sumz;
}
}
}
}
}
/****************************************************
freeing of arrays:
double Hx2[3][List_YOUSO[7]][List_YOUSO[7]];
double Hy2[3][List_YOUSO[7]][List_YOUSO[7]];
double Hz2[3][List_YOUSO[7]][List_YOUSO[7]];
****************************************************/
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hx2[i][j]);
}
free(Hx2[i]);
}
free(Hx2);
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hy2[i][j]);
}
free(Hy2[i]);
}
free(Hy2);
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hz2[i][j]);
}
free(Hz2[i]);
}
free(Hz2);
}
void dH_U_NC_full(int Mc_AN, int h_AN, int q_AN,
double *****OLP, dcomplex *****NC_v_eff,
dcomplex ****Hx, dcomplex ****Hy, dcomplex ****Hz)
{
int i,j,k,m,n,kg,kan,so,deri_kind,Mk_AN;
int ig,ian,jg,jan,kl,kl1,kl2,spin;
int wakg,l1,l2,l3,Gc_AN,Mi_AN,Mj_AN;
int Rwan,Lwan,p,p0,s1,s2;
double PF[2],sumx,sumy,sumz,ene;
double tmpx,tmpy,tmpz;
double Lsum0,Lsum1,Lsum2,Lsum3;
double Rsum0,Rsum1,Rsum2,Rsum3;
double PFp,PFm,ene_p,ene_m;
double Re00x,Re00y,Re00z;
double Re11x,Re11y,Re11z;
double Re01x,Re01y,Re01z;
double Re10x,Re10y,Re10z;
double Im00x,Im00y,Im00z;
double Im11x,Im11y,Im11z;
double Im01x,Im01y,Im01z;
double Im10x,Im10y,Im10z;
/****************************************************
start calc.
****************************************************/
Gc_AN = M2G[Mc_AN];
ig = natn[Gc_AN][h_AN];
Lwan = WhatSpecies[ig];
Mi_AN = F_G2M[ig]; /* F_G2M should be used */
ian = Spe_Total_CNO[Lwan];
jg = natn[Gc_AN][q_AN];
Rwan = WhatSpecies[jg];
Mj_AN = F_G2M[jg]; /* F_G2M should be used */
jan = Spe_Total_CNO[Rwan];
if (h_AN==0){
/****************************************************
dS*ep*S
****************************************************/
for (k=0; k<=FNAN[Gc_AN]; k++){
kg = natn[Gc_AN][k];
Mk_AN = F_G2M[kg]; /* F_G2M should be used */
wakg = WhatSpecies[kg];
kan = Spe_Total_NO[wakg];
kl = RMI1[Mc_AN][q_AN][k];
/****************************************************
derivative at h_AN (=Mc_AN)
****************************************************/
if (0<=kl){
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
Re00x = 0.0; Re00y = 0.0; Re00z = 0.0;
Re11x = 0.0; Re11y = 0.0; Re11z = 0.0;
Re01x = 0.0; Re01y = 0.0; Re01z = 0.0;
Re10x = 0.0; Re10y = 0.0; Re10z = 0.0;
Im00x = 0.0; Im00y = 0.0; Im00z = 0.0;
Im11x = 0.0; Im11y = 0.0; Im11z = 0.0;
Im01x = 0.0; Im01y = 0.0; Im01z = 0.0;
Im10x = 0.0; Im10y = 0.0; Im10z = 0.0;
for (l1=0; l1<kan; l1++){
for (l2=0; l2<kan; l2++){
ene = NC_v_eff[0][0][Mk_AN][l1][l2].r;
Re00x += ene*OLP[1][Mc_AN][k][m][l1]*OLP[0][Mj_AN][kl][n][l2];
Re00y += ene*OLP[2][Mc_AN][k][m][l1]*OLP[0][Mj_AN][kl][n][l2];
Re00z += ene*OLP[3][Mc_AN][k][m][l1]*OLP[0][Mj_AN][kl][n][l2];
ene = NC_v_eff[1][1][Mk_AN][l1][l2].r;
Re11x += ene*OLP[1][Mc_AN][k][m][l1]*OLP[0][Mj_AN][kl][n][l2];
Re11y += ene*OLP[2][Mc_AN][k][m][l1]*OLP[0][Mj_AN][kl][n][l2];
Re11z += ene*OLP[3][Mc_AN][k][m][l1]*OLP[0][Mj_AN][kl][n][l2];
ene = NC_v_eff[0][1][Mk_AN][l1][l2].r;
Re01x += ene*OLP[1][Mc_AN][k][m][l1]*OLP[0][Mj_AN][kl][n][l2];
Re01y += ene*OLP[2][Mc_AN][k][m][l1]*OLP[0][Mj_AN][kl][n][l2];
Re01z += ene*OLP[3][Mc_AN][k][m][l1]*OLP[0][Mj_AN][kl][n][l2];
ene = NC_v_eff[1][0][Mk_AN][l1][l2].r;
Re10x += ene*OLP[1][Mc_AN][k][m][l1]*OLP[0][Mj_AN][kl][n][l2];
Re10y += ene*OLP[2][Mc_AN][k][m][l1]*OLP[0][Mj_AN][kl][n][l2];
Re10z += ene*OLP[3][Mc_AN][k][m][l1]*OLP[0][Mj_AN][kl][n][l2];
ene = NC_v_eff[0][0][Mk_AN][l1][l2].i;
Im00x += ene*OLP[1][Mc_AN][k][m][l1]*OLP[0][Mj_AN][kl][n][l2];
Im00y += ene*OLP[2][Mc_AN][k][m][l1]*OLP[0][Mj_AN][kl][n][l2];
Im00z += ene*OLP[3][Mc_AN][k][m][l1]*OLP[0][Mj_AN][kl][n][l2];
ene = NC_v_eff[1][1][Mk_AN][l1][l2].i;
Im11x += ene*OLP[1][Mc_AN][k][m][l1]*OLP[0][Mj_AN][kl][n][l2];
Im11y += ene*OLP[2][Mc_AN][k][m][l1]*OLP[0][Mj_AN][kl][n][l2];
Im11z += ene*OLP[3][Mc_AN][k][m][l1]*OLP[0][Mj_AN][kl][n][l2];
ene = NC_v_eff[0][1][Mk_AN][l1][l2].i;
Im01x += ene*OLP[1][Mc_AN][k][m][l1]*OLP[0][Mj_AN][kl][n][l2];
Im01y += ene*OLP[2][Mc_AN][k][m][l1]*OLP[0][Mj_AN][kl][n][l2];
Im01z += ene*OLP[3][Mc_AN][k][m][l1]*OLP[0][Mj_AN][kl][n][l2];
ene = NC_v_eff[1][0][Mk_AN][l1][l2].i;
Im10x += ene*OLP[1][Mc_AN][k][m][l1]*OLP[0][Mj_AN][kl][n][l2];
Im10y += ene*OLP[2][Mc_AN][k][m][l1]*OLP[0][Mj_AN][kl][n][l2];
Im10z += ene*OLP[3][Mc_AN][k][m][l1]*OLP[0][Mj_AN][kl][n][l2];
}
}
if (k==0){
Hx[0][0][m][n] = Complex(Re00x,Im00x);
Hy[0][0][m][n] = Complex(Re00y,Im00y);
Hz[0][0][m][n] = Complex(Re00z,Im00z);
Hx[1][1][m][n] = Complex(Re11x,Im11x);
Hy[1][1][m][n] = Complex(Re11y,Im11y);
Hz[1][1][m][n] = Complex(Re11z,Im11z);
Hx[0][1][m][n] = Complex(Re01x,Im01x);
Hy[0][1][m][n] = Complex(Re01y,Im01y);
Hz[0][1][m][n] = Complex(Re01z,Im01z);
Hx[1][0][m][n] = Complex(Re10x,Im10x);
Hy[1][0][m][n] = Complex(Re10y,Im10y);
Hz[1][0][m][n] = Complex(Re10z,Im10z);
}
else{
Hx[0][0][m][n].r += Re00x; Hx[0][0][m][n].i += Im00x;
Hy[0][0][m][n].r += Re00y; Hy[0][0][m][n].i += Im00y;
Hz[0][0][m][n].r += Re00z; Hz[0][0][m][n].i += Im00z;
Hx[1][1][m][n].r += Re11x; Hx[1][1][m][n].i += Im11x;
Hy[1][1][m][n].r += Re11y; Hy[1][1][m][n].i += Im11y;
Hz[1][1][m][n].r += Re11z; Hz[1][1][m][n].i += Im11z;
Hx[0][1][m][n].r += Re01x; Hx[0][1][m][n].i += Im01x;
Hy[0][1][m][n].r += Re01y; Hy[0][1][m][n].i += Im01y;
Hz[0][1][m][n].r += Re01z; Hz[0][1][m][n].i += Im01z;
Hx[1][0][m][n].r += Re10x; Hx[1][0][m][n].i += Im10x;
Hy[1][0][m][n].r += Re10y; Hy[1][0][m][n].i += Im10y;
Hz[1][0][m][n].r += Re10z; Hz[1][0][m][n].i += Im10z;
}
} /* n */
} /* m */
} /* if */
} /* k */
/****************************************************
S*ep*dS
****************************************************/
/* ????? */
if (q_AN==0){
for (s1=0; s1<2; s1++){
for (s2=0; s2<2; s2++){
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
Hx[s1][s2][m][n].r = 2.0*Hx[s1][s2][m][n].r;
Hy[s1][s2][m][n].r = 2.0*Hy[s1][s2][m][n].r;
Hz[s1][s2][m][n].r = 2.0*Hz[s1][s2][m][n].r;
Hx[s1][s2][m][n].i = 2.0*Hx[s1][s2][m][n].i;
Hy[s1][s2][m][n].i = 2.0*Hy[s1][s2][m][n].i;
Hz[s1][s2][m][n].i = 2.0*Hz[s1][s2][m][n].i;
}
}
}
}
}
else {
kg = natn[Gc_AN][0];
Mk_AN = F_G2M[kg]; /* F_G2M should be used */
wakg = WhatSpecies[kg];
kan = Spe_Total_NO[wakg];
kl = RMI1[Mc_AN][q_AN][0];
/****************************************************
derivative at k=0
****************************************************/
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
Re00x = 0.0; Re00y = 0.0; Re00z = 0.0;
Re11x = 0.0; Re11y = 0.0; Re11z = 0.0;
Re01x = 0.0; Re01y = 0.0; Re01z = 0.0;
Re10x = 0.0; Re10y = 0.0; Re10z = 0.0;
Im00x = 0.0; Im00y = 0.0; Im00z = 0.0;
Im11x = 0.0; Im11y = 0.0; Im11z = 0.0;
Im01x = 0.0; Im01y = 0.0; Im01z = 0.0;
Im10x = 0.0; Im10y = 0.0; Im10z = 0.0;
for (l1=0; l1<kan; l1++){
for (l2=0; l2<kan; l2++){
ene = NC_v_eff[0][0][Mk_AN][l1][l2].r;
Re00x -= ene*OLP[0][Mc_AN][0][m][l1]*OLP[1][Mj_AN][kl][n][l2];
Re00y -= ene*OLP[0][Mc_AN][0][m][l1]*OLP[2][Mj_AN][kl][n][l2];
Re00z -= ene*OLP[0][Mc_AN][0][m][l1]*OLP[3][Mj_AN][kl][n][l2];
ene = NC_v_eff[1][1][Mk_AN][l1][l2].r;
Re11x -= ene*OLP[0][Mc_AN][0][m][l1]*OLP[1][Mj_AN][kl][n][l2];
Re11y -= ene*OLP[0][Mc_AN][0][m][l1]*OLP[2][Mj_AN][kl][n][l2];
Re11z -= ene*OLP[0][Mc_AN][0][m][l1]*OLP[3][Mj_AN][kl][n][l2];
ene = NC_v_eff[0][1][Mk_AN][l1][l2].r;
Re01x -= ene*OLP[0][Mc_AN][0][m][l1]*OLP[1][Mj_AN][kl][n][l2];
Re01y -= ene*OLP[0][Mc_AN][0][m][l1]*OLP[2][Mj_AN][kl][n][l2];
Re01z -= ene*OLP[0][Mc_AN][0][m][l1]*OLP[3][Mj_AN][kl][n][l2];
ene = NC_v_eff[1][0][Mk_AN][l1][l2].r;
Re10x -= ene*OLP[0][Mc_AN][0][m][l1]*OLP[1][Mj_AN][kl][n][l2];
Re10y -= ene*OLP[0][Mc_AN][0][m][l1]*OLP[2][Mj_AN][kl][n][l2];
Re10z -= ene*OLP[0][Mc_AN][0][m][l1]*OLP[3][Mj_AN][kl][n][l2];
ene = NC_v_eff[0][0][Mk_AN][l1][l2].i;
Im00x -= ene*OLP[0][Mc_AN][0][m][l1]*OLP[1][Mj_AN][kl][n][l2];
Im00y -= ene*OLP[0][Mc_AN][0][m][l1]*OLP[2][Mj_AN][kl][n][l2];
Im00z -= ene*OLP[0][Mc_AN][0][m][l1]*OLP[3][Mj_AN][kl][n][l2];
ene = NC_v_eff[1][1][Mk_AN][l1][l2].i;
Im11x -= ene*OLP[0][Mc_AN][0][m][l1]*OLP[1][Mj_AN][kl][n][l2];
Im11y -= ene*OLP[0][Mc_AN][0][m][l1]*OLP[2][Mj_AN][kl][n][l2];
Im11z -= ene*OLP[0][Mc_AN][0][m][l1]*OLP[3][Mj_AN][kl][n][l2];
ene = NC_v_eff[0][1][Mk_AN][l1][l2].i;
Im01x -= ene*OLP[0][Mc_AN][0][m][l1]*OLP[1][Mj_AN][kl][n][l2];
Im01y -= ene*OLP[0][Mc_AN][0][m][l1]*OLP[2][Mj_AN][kl][n][l2];
Im01z -= ene*OLP[0][Mc_AN][0][m][l1]*OLP[3][Mj_AN][kl][n][l2];
ene = NC_v_eff[1][0][Mk_AN][l1][l2].i;
Im10x -= ene*OLP[0][Mc_AN][0][m][l1]*OLP[1][Mj_AN][kl][n][l2];
Im10y -= ene*OLP[0][Mc_AN][0][m][l1]*OLP[2][Mj_AN][kl][n][l2];
Im10z -= ene*OLP[0][Mc_AN][0][m][l1]*OLP[3][Mj_AN][kl][n][l2];
}
}
Hx[0][0][m][n].r += Re00x; Hx[0][0][m][n].i += Im00x;
Hy[0][0][m][n].r += Re00y; Hy[0][0][m][n].i += Im00y;
Hz[0][0][m][n].r += Re00z; Hz[0][0][m][n].i += Im00z;
Hx[1][1][m][n].r += Re11x; Hx[1][1][m][n].i += Im11x;
Hy[1][1][m][n].r += Re11y; Hy[1][1][m][n].i += Im11y;
Hz[1][1][m][n].r += Re11z; Hz[1][1][m][n].i += Im11z;
Hx[0][1][m][n].r += Re01x; Hx[0][1][m][n].i += Im01x;
Hy[0][1][m][n].r += Re01y; Hy[0][1][m][n].i += Im01y;
Hz[0][1][m][n].r += Re01z; Hz[0][1][m][n].i += Im01z;
Hx[1][0][m][n].r += Re10x; Hx[1][0][m][n].i += Im10x;
Hy[1][0][m][n].r += Re10y; Hy[1][0][m][n].i += Im10y;
Hz[1][0][m][n].r += Re10z; Hz[1][0][m][n].i += Im10z;
}
}
}
} /* if (h_AN==0) */
else {
/****************************************************
dS*ep*S
****************************************************/
kg = natn[Gc_AN][0];
Mk_AN = F_G2M[kg]; /* F_G2M should be used */
wakg = WhatSpecies[kg];
kan = Spe_Total_NO[wakg];
kl1 = RMI1[Mc_AN][h_AN][0];
kl2 = RMI1[Mc_AN][q_AN][0];
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
Re00x = 0.0; Re00y = 0.0; Re00z = 0.0;
Re11x = 0.0; Re11y = 0.0; Re11z = 0.0;
Re01x = 0.0; Re01y = 0.0; Re01z = 0.0;
Re10x = 0.0; Re10y = 0.0; Re10z = 0.0;
Im00x = 0.0; Im00y = 0.0; Im00z = 0.0;
Im11x = 0.0; Im11y = 0.0; Im11z = 0.0;
Im01x = 0.0; Im01y = 0.0; Im01z = 0.0;
Im10x = 0.0; Im10y = 0.0; Im10z = 0.0;
for (l1=0; l1<kan; l1++){
for (l2=0; l2<kan; l2++){
ene = NC_v_eff[0][0][Mk_AN][l1][l2].r;
Re00x -= ene*OLP[1][Mi_AN][kl1][m][l1]*OLP[0][Mj_AN][kl2][n][l2];
Re00y -= ene*OLP[2][Mi_AN][kl1][m][l1]*OLP[0][Mj_AN][kl2][n][l2];
Re00z -= ene*OLP[3][Mi_AN][kl1][m][l1]*OLP[0][Mj_AN][kl2][n][l2];
ene = NC_v_eff[1][1][Mk_AN][l1][l2].r;
Re11x -= ene*OLP[1][Mi_AN][kl1][m][l1]*OLP[0][Mj_AN][kl2][n][l2];
Re11y -= ene*OLP[2][Mi_AN][kl1][m][l1]*OLP[0][Mj_AN][kl2][n][l2];
Re11z -= ene*OLP[3][Mi_AN][kl1][m][l1]*OLP[0][Mj_AN][kl2][n][l2];
ene = NC_v_eff[0][1][Mk_AN][l1][l2].r;
Re01x -= ene*OLP[1][Mi_AN][kl1][m][l1]*OLP[0][Mj_AN][kl2][n][l2];
Re01y -= ene*OLP[2][Mi_AN][kl1][m][l1]*OLP[0][Mj_AN][kl2][n][l2];
Re01z -= ene*OLP[3][Mi_AN][kl1][m][l1]*OLP[0][Mj_AN][kl2][n][l2];
ene = NC_v_eff[1][0][Mk_AN][l1][l2].r;
Re10x -= ene*OLP[1][Mi_AN][kl1][m][l1]*OLP[0][Mj_AN][kl2][n][l2];
Re10y -= ene*OLP[2][Mi_AN][kl1][m][l1]*OLP[0][Mj_AN][kl2][n][l2];
Re10z -= ene*OLP[3][Mi_AN][kl1][m][l1]*OLP[0][Mj_AN][kl2][n][l2];
ene = NC_v_eff[0][0][Mk_AN][l1][l2].i;
Im00x -= ene*OLP[1][Mi_AN][kl1][m][l1]*OLP[0][Mj_AN][kl2][n][l2];
Im00y -= ene*OLP[2][Mi_AN][kl1][m][l1]*OLP[0][Mj_AN][kl2][n][l2];
Im00z -= ene*OLP[3][Mi_AN][kl1][m][l1]*OLP[0][Mj_AN][kl2][n][l2];
ene = NC_v_eff[1][1][Mk_AN][l1][l2].i;
Im11x -= ene*OLP[1][Mi_AN][kl1][m][l1]*OLP[0][Mj_AN][kl2][n][l2];
Im11y -= ene*OLP[2][Mi_AN][kl1][m][l1]*OLP[0][Mj_AN][kl2][n][l2];
Im11z -= ene*OLP[3][Mi_AN][kl1][m][l1]*OLP[0][Mj_AN][kl2][n][l2];
ene = NC_v_eff[0][1][Mk_AN][l1][l2].i;
Im01x -= ene*OLP[1][Mi_AN][kl1][m][l1]*OLP[0][Mj_AN][kl2][n][l2];
Im01y -= ene*OLP[2][Mi_AN][kl1][m][l1]*OLP[0][Mj_AN][kl2][n][l2];
Im01z -= ene*OLP[3][Mi_AN][kl1][m][l1]*OLP[0][Mj_AN][kl2][n][l2];
ene = NC_v_eff[1][0][Mk_AN][l1][l2].i;
Im10x -= ene*OLP[1][Mi_AN][kl1][m][l1]*OLP[0][Mj_AN][kl2][n][l2];
Im10y -= ene*OLP[2][Mi_AN][kl1][m][l1]*OLP[0][Mj_AN][kl2][n][l2];
Im10z -= ene*OLP[3][Mi_AN][kl1][m][l1]*OLP[0][Mj_AN][kl2][n][l2];
}
}
Hx[0][0][m][n] = Complex(Re00x,Im00x);
Hy[0][0][m][n] = Complex(Re00y,Im00y);
Hz[0][0][m][n] = Complex(Re00z,Im00z);
Hx[1][1][m][n] = Complex(Re11x,Im11x);
Hy[1][1][m][n] = Complex(Re11y,Im11y);
Hz[1][1][m][n] = Complex(Re11z,Im11z);
Hx[0][1][m][n] = Complex(Re01x,Im01x);
Hy[0][1][m][n] = Complex(Re01y,Im01y);
Hz[0][1][m][n] = Complex(Re01z,Im01z);
Hx[1][0][m][n] = Complex(Re10x,Im10x);
Hy[1][0][m][n] = Complex(Re10y,Im10y);
Hz[1][0][m][n] = Complex(Re10z,Im10z);
}
}
/****************************************************
S*ep*dS
****************************************************/
if (q_AN==0){
for (k=0; k<=FNAN[Gc_AN]; k++){
kg = natn[Gc_AN][k];
Mk_AN = F_G2M[kg]; /* F_G2M should be used */
wakg = WhatSpecies[kg];
kan = Spe_Total_NO[wakg];
kl1 = RMI1[Mc_AN][h_AN][k];
kl2 = RMI1[Mc_AN][q_AN][k];
if (0<=kl1){
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
Re00x = 0.0; Re00y = 0.0; Re00z = 0.0;
Re11x = 0.0; Re11y = 0.0; Re11z = 0.0;
Re01x = 0.0; Re01y = 0.0; Re01z = 0.0;
Re10x = 0.0; Re10y = 0.0; Re10z = 0.0;
Im00x = 0.0; Im00y = 0.0; Im00z = 0.0;
Im11x = 0.0; Im11y = 0.0; Im11z = 0.0;
Im01x = 0.0; Im01y = 0.0; Im01z = 0.0;
Im10x = 0.0; Im10y = 0.0; Im10z = 0.0;
for (l1=0; l1<kan; l1++){
for (l2=0; l2<kan; l2++){
ene = NC_v_eff[0][0][Mk_AN][l1][l2].r;
Re00x += ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[1][Mj_AN][kl2][n][l2];
Re00y += ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[2][Mj_AN][kl2][n][l2];
Re00z += ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[3][Mj_AN][kl2][n][l2];
ene = NC_v_eff[1][1][Mk_AN][l1][l2].r;
Re11x += ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[1][Mj_AN][kl2][n][l2];
Re11y += ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[2][Mj_AN][kl2][n][l2];
Re11z += ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[3][Mj_AN][kl2][n][l2];
ene = NC_v_eff[0][1][Mk_AN][l1][l2].r;
Re01x += ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[1][Mj_AN][kl2][n][l2];
Re01y += ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[2][Mj_AN][kl2][n][l2];
Re01z += ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[3][Mj_AN][kl2][n][l2];
ene = NC_v_eff[1][0][Mk_AN][l1][l2].r;
Re10x += ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[1][Mj_AN][kl2][n][l2];
Re10y += ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[2][Mj_AN][kl2][n][l2];
Re10z += ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[3][Mj_AN][kl2][n][l2];
ene = NC_v_eff[0][0][Mk_AN][l1][l2].i;
Im00x += ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[1][Mj_AN][kl2][n][l2];
Im00y += ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[2][Mj_AN][kl2][n][l2];
Im00z += ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[3][Mj_AN][kl2][n][l2];
ene = NC_v_eff[1][1][Mk_AN][l1][l2].i;
Im11x += ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[1][Mj_AN][kl2][n][l2];
Im11y += ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[2][Mj_AN][kl2][n][l2];
Im11z += ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[3][Mj_AN][kl2][n][l2];
ene = NC_v_eff[0][1][Mk_AN][l1][l2].i;
Im01x += ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[1][Mj_AN][kl2][n][l2];
Im01y += ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[2][Mj_AN][kl2][n][l2];
Im01z += ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[3][Mj_AN][kl2][n][l2];
ene = NC_v_eff[1][0][Mk_AN][l1][l2].i;
Im10x += ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[1][Mj_AN][kl2][n][l2];
Im10y += ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[2][Mj_AN][kl2][n][l2];
Im10z += ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[3][Mj_AN][kl2][n][l2];
}
}
Hx[0][0][m][n].r += Re00x; Hx[0][0][m][n].i += Im00x;
Hy[0][0][m][n].r += Re00y; Hy[0][0][m][n].i += Im00y;
Hz[0][0][m][n].r += Re00z; Hz[0][0][m][n].i += Im00z;
Hx[1][1][m][n].r += Re11x; Hx[1][1][m][n].i += Im11x;
Hy[1][1][m][n].r += Re11y; Hy[1][1][m][n].i += Im11y;
Hz[1][1][m][n].r += Re11z; Hz[1][1][m][n].i += Im11z;
Hx[0][1][m][n].r += Re01x; Hx[0][1][m][n].i += Im01x;
Hy[0][1][m][n].r += Re01y; Hy[0][1][m][n].i += Im01y;
Hz[0][1][m][n].r += Re01z; Hz[0][1][m][n].i += Im01z;
Hx[1][0][m][n].r += Re10x; Hx[1][0][m][n].i += Im10x;
Hy[1][0][m][n].r += Re10y; Hy[1][0][m][n].i += Im10y;
Hz[1][0][m][n].r += Re10z; Hz[1][0][m][n].i += Im10z;
}
}
}
}
} /* if (q_AN==0) */
else {
kg = natn[Gc_AN][0];
Mk_AN = F_G2M[kg]; /* F_G2M should be used */
wakg = WhatSpecies[kg];
kan = Spe_Total_NO[wakg];
kl1 = RMI1[Mc_AN][h_AN][0];
kl2 = RMI1[Mc_AN][q_AN][0];
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
Re00x = 0.0; Re00y = 0.0; Re00z = 0.0;
Re11x = 0.0; Re11y = 0.0; Re11z = 0.0;
Re01x = 0.0; Re01y = 0.0; Re01z = 0.0;
Re10x = 0.0; Re10y = 0.0; Re10z = 0.0;
Im00x = 0.0; Im00y = 0.0; Im00z = 0.0;
Im11x = 0.0; Im11y = 0.0; Im11z = 0.0;
Im01x = 0.0; Im01y = 0.0; Im01z = 0.0;
Im10x = 0.0; Im10y = 0.0; Im10z = 0.0;
for (l1=0; l1<kan; l1++){
for (l2=0; l2<kan; l2++){
ene = NC_v_eff[0][0][Mk_AN][l1][l2].r;
Re00x -= ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[1][Mj_AN][kl2][n][l2];
Re00y -= ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[2][Mj_AN][kl2][n][l2];
Re00z -= ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[3][Mj_AN][kl2][n][l2];
ene = NC_v_eff[1][1][Mk_AN][l1][l2].r;
Re11x -= ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[1][Mj_AN][kl2][n][l2];
Re11y -= ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[2][Mj_AN][kl2][n][l2];
Re11z -= ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[3][Mj_AN][kl2][n][l2];
ene = NC_v_eff[0][1][Mk_AN][l1][l2].r;
Re01x -= ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[1][Mj_AN][kl2][n][l2];
Re01y -= ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[2][Mj_AN][kl2][n][l2];
Re01z -= ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[3][Mj_AN][kl2][n][l2];
ene = NC_v_eff[1][0][Mk_AN][l1][l2].r;
Re10x -= ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[1][Mj_AN][kl2][n][l2];
Re10y -= ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[2][Mj_AN][kl2][n][l2];
Re10z -= ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[3][Mj_AN][kl2][n][l2];
ene = NC_v_eff[0][0][Mk_AN][l1][l2].i;
Im00x -= ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[1][Mj_AN][kl2][n][l2];
Im00y -= ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[2][Mj_AN][kl2][n][l2];
Im00z -= ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[3][Mj_AN][kl2][n][l2];
ene = NC_v_eff[1][1][Mk_AN][l1][l2].i;
Im11x -= ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[1][Mj_AN][kl2][n][l2];
Im11y -= ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[2][Mj_AN][kl2][n][l2];
Im11z -= ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[3][Mj_AN][kl2][n][l2];
ene = NC_v_eff[0][1][Mk_AN][l1][l2].i;
Im01x -= ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[1][Mj_AN][kl2][n][l2];
Im01y -= ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[2][Mj_AN][kl2][n][l2];
Im01z -= ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[3][Mj_AN][kl2][n][l2];
ene = NC_v_eff[1][0][Mk_AN][l1][l2].i;
Im10x -= ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[1][Mj_AN][kl2][n][l2];
Im10y -= ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[2][Mj_AN][kl2][n][l2];
Im10z -= ene*OLP[0][Mi_AN][kl1][m][l1]*OLP[3][Mj_AN][kl2][n][l2];
}
}
Hx[0][0][m][n].r += Re00x; Hx[0][0][m][n].i += Im00x;
Hy[0][0][m][n].r += Re00y; Hy[0][0][m][n].i += Im00y;
Hz[0][0][m][n].r += Re00z; Hz[0][0][m][n].i += Im00z;
Hx[1][1][m][n].r += Re11x; Hx[1][1][m][n].i += Im11x;
Hy[1][1][m][n].r += Re11y; Hy[1][1][m][n].i += Im11y;
Hz[1][1][m][n].r += Re11z; Hz[1][1][m][n].i += Im11z;
Hx[0][1][m][n].r += Re01x; Hx[0][1][m][n].i += Im01x;
Hy[0][1][m][n].r += Re01y; Hy[0][1][m][n].i += Im01y;
Hz[0][1][m][n].r += Re01z; Hz[0][1][m][n].i += Im01z;
Hx[1][0][m][n].r += Re10x; Hx[1][0][m][n].i += Im10x;
Hy[1][0][m][n].r += Re10y; Hy[1][0][m][n].i += Im10y;
Hz[1][0][m][n].r += Re10z; Hz[1][0][m][n].i += Im10z;
}
}
}
}
}
void dHCH(int where_flag,
int Mc_AN, int h_AN, int q_AN,
double *****OLP1,
dcomplex ***Hx, dcomplex ***Hy, dcomplex ***Hz)
{
int i,j,k,m,n,l,kg,kan,so,deri_kind,L;
int ig,ian,jg,jan,kl,kl1,kl2,mul;
int wakg,l1,l2,l3,Gc_AN,Mi_AN,Mi_AN2,Mj_AN,Mj_AN2;
int Rni,Rnj,somax,apply_flag,target_spin;
double **penalty;
double penalty_value;
double PF[2],sumx[2],sumy[2],sumz[2],ene,dmp,deri_dmp;
double tmpx,tmpy,tmpz,tmp,r;
double x0,y0,z0,x1,y1,z1,dx,dy,dz;
double rcuti,rcutj,rcut;
double PFp,PFm,ene_p,ene_m;
dcomplex sumx0,sumy0,sumz0;
dcomplex sumx1,sumy1,sumz1;
dcomplex sumx2,sumy2,sumz2;
/****************************************************
start calc.
****************************************************/
/* set penalty */
penalty_value = penalty_value_CoreHole;
penalty = (double**)malloc(sizeof(double*)*2);
for (i=0; i<2; i++){
penalty[i] = (double*)malloc(sizeof(double)*List_YOUSO[7]);
}
wakg = WhatSpecies[Core_Hole_Atom];
/* set penalty */
if (VPS_j_dependency[wakg]==0){
for (i=0; i<Spe_Total_NO[wakg]; i++){
penalty[0][i] = 0.0;
penalty[1][i] = 0.0;
}
L = 0;
for (l=0; l<=Spe_MaxL_Basis[wakg]; l++){
for (mul=0; mul<Spe_Num_Basis[wakg][l]; mul++){
apply_flag = 0;
if ((strcmp(Core_Hole_Orbital,"s")==0) && l==0 && mul==0) {
if (Core_Hole_J==1) target_spin = 0;
else target_spin = 1;
apply_flag = 1;
}
else if ((strcmp(Core_Hole_Orbital,"p")==0) && l==1 && mul==0) {
if (Core_Hole_J<=3) target_spin = 0;
else target_spin = 1;
apply_flag = 1;
}
else if ((strcmp(Core_Hole_Orbital,"d")==0) && l==2 && mul==0) {
if (Core_Hole_J<=5) target_spin = 0;
else target_spin = 1;
apply_flag = 1;
}
else if ((strcmp(Core_Hole_Orbital,"f")==0) && l==3 && mul==0) {
if (Core_Hole_J<=7) target_spin = 0;
else target_spin = 1;
apply_flag = 1;
}
/* set the penalty into all the states speficied by l and mul */
if (apply_flag==1 && Core_Hole_J==0){
for (i=0; i<(2*l+1); i++){
penalty[0][L+i] = penalty_value;
penalty[1][L+i] = penalty_value;
}
}
/* set the penalty into one of the states speficied by l and mul */
else if (apply_flag==1){
penalty[target_spin][L+(Core_Hole_J-1) % (2*l+1)] = penalty_value;
}
/* increment of L */
L += 2*l+1;
}
}
}
/* get information of relevant atoms */
Gc_AN = M2G[Mc_AN];
ig = natn[Gc_AN][h_AN];
Rni = ncn[Gc_AN][h_AN];
Mi_AN = F_G2M[ig];
ian = Spe_Total_CNO[WhatSpecies[ig]];
rcuti = Spe_Atom_Cut1[WhatSpecies[ig]];
jg = natn[Gc_AN][q_AN];
Rnj = ncn[Gc_AN][q_AN];
Mj_AN = F_G2M[jg];
jan = Spe_Total_CNO[WhatSpecies[jg]];
rcutj = Spe_Atom_Cut1[WhatSpecies[jg]];
rcut = rcuti + rcutj;
kl = RMI1[Mc_AN][h_AN][q_AN];
dmp = dampingF(rcut,Dis[ig][kl]);
for (so=0; so<3; so++){
for (i=0; i<List_YOUSO[7]; i++){
for (j=0; j<List_YOUSO[7]; j++){
Hx[so][i][j] = Complex(0.0,0.0);
Hy[so][i][j] = Complex(0.0,0.0);
Hz[so][i][j] = Complex(0.0,0.0);
}
}
}
if (h_AN==0){
/****************************************************
dH*ep*H
****************************************************/
for (k=0; k<=FNAN[Gc_AN]; k++){
kg = natn[Gc_AN][k];
wakg = WhatSpecies[kg];
kan = Spe_Total_CNO[wakg];
kl = RMI1[Mc_AN][q_AN][k];
/****************************************************
l-dependent non-local part
****************************************************/
if (0<=kl && VPS_j_dependency[wakg]==0 && where_flag==0){
if (Mj_AN<=Matomnum) Mj_AN2 = Mj_AN;
else Mj_AN2 = Matomnum + 1;
if (kg==Core_Hole_Atom){
/* calculate the multiplication */
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
sumx[0] = 0.0; sumx[1] = 0.0;
sumy[0] = 0.0; sumy[1] = 0.0;
sumz[0] = 0.0; sumz[1] = 0.0;
for (i=0; i<Spe_Total_CNO[wakg]; i++){
sumx[0] += penalty[0][i]*OLP1[1][Mc_AN][k][m][i]*OLP1[0][Mj_AN2][kl][n][i];
sumy[0] += penalty[0][i]*OLP1[2][Mc_AN][k][m][i]*OLP1[0][Mj_AN2][kl][n][i];
sumz[0] += penalty[0][i]*OLP1[3][Mc_AN][k][m][i]*OLP1[0][Mj_AN2][kl][n][i];
sumx[1] += penalty[1][i]*OLP1[1][Mc_AN][k][m][i]*OLP1[0][Mj_AN2][kl][n][i];
sumy[1] += penalty[1][i]*OLP1[2][Mc_AN][k][m][i]*OLP1[0][Mj_AN2][kl][n][i];
sumz[1] += penalty[1][i]*OLP1[3][Mc_AN][k][m][i]*OLP1[0][Mj_AN2][kl][n][i];
}
Hx[0][m][n].r += sumx[0];
Hy[0][m][n].r += sumy[0];
Hz[0][m][n].r += sumz[0];
Hx[1][m][n].r += sumx[1];
Hy[1][m][n].r += sumy[1];
Hz[1][m][n].r += sumz[1];
} /* n */
} /* m */
} /* if (kg==Core_Hole_Atom) */
} /* if */
/****************************************************
j-dependent non-local part
****************************************************/
else if ( 0<=kl && VPS_j_dependency[wakg]==1 && where_flag==0 ){
if (Mj_AN<=Matomnum) Mj_AN2 = Mj_AN;
else Mj_AN2 = Matomnum + 1;
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
sumx0 = Complex(0.0,0.0); sumy0 = Complex(0.0,0.0); sumz0 = Complex(0.0,0.0);
sumx1 = Complex(0.0,0.0); sumy1 = Complex(0.0,0.0); sumz1 = Complex(0.0,0.0);
sumx2 = Complex(0.0,0.0); sumy2 = Complex(0.0,0.0); sumz2 = Complex(0.0,0.0);
dHCH_SO( &sumx0.r,&sumx0.i, &sumy0.r,&sumy0.i, &sumz0.r,&sumz0.i,
&sumx1.r,&sumx1.i, &sumy1.r,&sumy1.i, &sumz1.r,&sumz1.i,
&sumx2.r,&sumx2.i, &sumy2.r,&sumy2.i, &sumz2.r,&sumz2.i,
1.0,
Mc_AN ,k, m,
Mj_AN2,kl,n,
kg, wakg,
penalty_value,
OLP1 );
if (q_AN==0){
dHCH_SO( &sumx0.r,&sumx0.i, &sumy0.r,&sumy0.i, &sumz0.r,&sumz0.i,
&sumx1.r,&sumx1.i, &sumy1.r,&sumy1.i, &sumz1.r,&sumz1.i,
&sumx2.r,&sumx2.i, &sumy2.r,&sumy2.i, &sumz2.r,&sumz2.i,
-1.0,
Mj_AN2, kl,n,
Mc_AN ,k, m,
kg, wakg,
penalty_value,
OLP1 );
}
Hx[0][m][n].r += sumx0.r; /* up-up */
Hy[0][m][n].r += sumy0.r; /* up-up */
Hz[0][m][n].r += sumz0.r; /* up-up */
Hx[1][m][n].r += sumx1.r; /* dn-dn */
Hy[1][m][n].r += sumy1.r; /* dn-dn */
Hz[1][m][n].r += sumz1.r; /* dn-dn */
Hx[2][m][n].r += sumx2.r; /* up-dn */
Hy[2][m][n].r += sumy2.r; /* up-dn */
Hz[2][m][n].r += sumz2.r; /* up-dn */
Hx[0][m][n].i += sumx0.i; /* up-up */
Hy[0][m][n].i += sumy0.i; /* up-up */
Hz[0][m][n].i += sumz0.i; /* up-up */
Hx[1][m][n].i += sumx1.i; /* dn-dn */
Hy[1][m][n].i += sumy1.i; /* dn-dn */
Hz[1][m][n].i += sumz1.i; /* dn-dn */
Hx[2][m][n].i += sumx2.i; /* up-dn */
Hy[2][m][n].i += sumy2.i; /* up-dn */
Hz[2][m][n].i += sumz2.i; /* up-dn */
}
}
}
} /* k */
/****************************************************
H*ep*dH
****************************************************/
/* h_AN==0 && q_AN==0 */
if (q_AN==0 && VPS_j_dependency[wakg]==0){
for (m=0; m<ian; m++){
for (n=m; n<jan; n++){
tmpx = Hx[0][m][n].r + Hx[0][n][m].r;
Hx[0][m][n].r = tmpx;
Hx[0][n][m].r = tmpx;
tmpy = Hy[0][m][n].r + Hy[0][n][m].r;
Hy[0][m][n].r = tmpy;
Hy[0][n][m].r = tmpy;
tmpz = Hz[0][m][n].r + Hz[0][n][m].r;
Hz[0][m][n].r = tmpz;
Hz[0][n][m].r = tmpz;
tmpx = Hx[1][m][n].r + Hx[1][n][m].r;
Hx[1][m][n].r = tmpx;
Hx[1][n][m].r = tmpx;
tmpy = Hy[1][m][n].r + Hy[1][n][m].r;
Hy[1][m][n].r = tmpy;
Hy[1][n][m].r = tmpy;
tmpz = Hz[1][m][n].r + Hz[1][n][m].r;
Hz[1][m][n].r = tmpz;
Hz[1][n][m].r = tmpz;
}
}
}
else if (where_flag==1){
kg = natn[Gc_AN][0];
wakg = WhatSpecies[kg];
kan = Spe_Total_VPS_Pro[wakg];
kl = RMI1[Mc_AN][q_AN][0];
/****************************************************
l-dependent non-local part
****************************************************/
if (VPS_j_dependency[wakg]==0){
if (Mj_AN<=Matomnum){
Mj_AN2 = Mj_AN;
kl2 = RMI1[Mc_AN][q_AN][0];
}
else{
Mj_AN2 = Matomnum + 1;
kl2 = RMI1[Mc_AN][0][q_AN];
}
if (kg==Core_Hole_Atom){
/* calculate the multiplication */
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
sumx[0] = 0.0; sumx[1] = 0.0;
sumy[0] = 0.0; sumy[1] = 0.0;
sumz[0] = 0.0; sumz[1] = 0.0;
for (i=0; i<Spe_Total_CNO[wakg]; i++){
sumx[0] -= penalty[0][i]*OLP1[0][Mc_AN][0][m][i]*OLP1[1][Mj_AN2][kl2][n][i];
sumy[0] -= penalty[0][i]*OLP1[0][Mc_AN][0][m][i]*OLP1[2][Mj_AN2][kl2][n][i];
sumz[0] -= penalty[0][i]*OLP1[0][Mc_AN][0][m][i]*OLP1[3][Mj_AN2][kl2][n][i];
sumx[1] -= penalty[1][i]*OLP1[0][Mc_AN][0][m][i]*OLP1[1][Mj_AN2][kl2][n][i];
sumy[1] -= penalty[1][i]*OLP1[0][Mc_AN][0][m][i]*OLP1[2][Mj_AN2][kl2][n][i];
sumz[1] -= penalty[1][i]*OLP1[0][Mc_AN][0][m][i]*OLP1[3][Mj_AN2][kl2][n][i];
}
Hx[0][m][n].r += sumx[0];
Hy[0][m][n].r += sumy[0];
Hz[0][m][n].r += sumz[0];
Hx[1][m][n].r += sumx[1];
Hy[1][m][n].r += sumy[1];
Hz[1][m][n].r += sumz[1];
}
}
} /* if (kg==Core_Hole_Atom) */
}
/****************************************************
j-dependent non-local part
****************************************************/
else if ( VPS_j_dependency[wakg]==1 ){
if (Mj_AN<=Matomnum){
Mj_AN2 = Mj_AN;
kl2 = RMI1[Mc_AN][q_AN][0];
}
else{
Mj_AN2 = Matomnum + 1;
kl2 = RMI1[Mc_AN][0][q_AN];
}
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
sumx0 = Complex(0.0,0.0); sumy0 = Complex(0.0,0.0); sumz0 = Complex(0.0,0.0);
sumx1 = Complex(0.0,0.0); sumy1 = Complex(0.0,0.0); sumz1 = Complex(0.0,0.0);
sumx2 = Complex(0.0,0.0); sumy2 = Complex(0.0,0.0); sumz2 = Complex(0.0,0.0);
/* 1 */
dHCH_SO( &sumx0.r,&sumx0.i, &sumy0.r,&sumy0.i, &sumz0.r,&sumz0.i,
&sumx1.r,&sumx1.i, &sumy1.r,&sumy1.i, &sumz1.r,&sumz1.i,
&sumx2.r,&sumx2.i, &sumy2.r,&sumy2.i, &sumz2.r,&sumz2.i,
-1.0,
Mj_AN2,kl2,n,
Mc_AN, 0, m,
kg, wakg,
-penalty_value,
OLP1 );
Hx[0][m][n].r += sumx0.r; /* up-up */
Hy[0][m][n].r += sumy0.r; /* up-up */
Hz[0][m][n].r += sumz0.r; /* up-up */
Hx[1][m][n].r += sumx1.r; /* dn-dn */
Hy[1][m][n].r += sumy1.r; /* dn-dn */
Hz[1][m][n].r += sumz1.r; /* dn-dn */
Hx[2][m][n].r += sumx2.r; /* up-dn */
Hy[2][m][n].r += sumy2.r; /* up-dn */
Hz[2][m][n].r += sumz2.r; /* up-dn */
Hx[0][m][n].i += sumx0.i; /* up-up */
Hy[0][m][n].i += sumy0.i; /* up-up */
Hz[0][m][n].i += sumz0.i; /* up-up */
Hx[1][m][n].i += sumx1.i; /* dn-dn */
Hy[1][m][n].i += sumy1.i; /* dn-dn */
Hz[1][m][n].i += sumz1.i; /* dn-dn */
Hx[2][m][n].i += sumx2.i; /* up-dn */
Hy[2][m][n].i += sumy2.i; /* up-dn */
Hz[2][m][n].i += sumz2.i; /* up-dn */
}
}
}
}
} /* if (h_AN==0) */
else if (where_flag==0){
/****************************************************
H*ep*dH
if (h_AN!=0 && where_flag==0)
This happens
only if
( SpinP_switch==3
&&
(SO_switch==1 || (Hub_U_switch==1 && F_U_flag==1)
|| 1<=Constraint_NCS_switch || Zeeman_NCS_switch==1
|| Zeeman_NCO_switch==1)
&&
q_AN==0
)
****************************************************/
for (k=0; k<=FNAN[Gc_AN]; k++){
kg = natn[Gc_AN][k];
wakg = WhatSpecies[kg];
kan = Spe_Total_VPS_Pro[wakg];
kl = RMI1[Mc_AN][h_AN][k];
if (Mi_AN<=Matomnum) Mi_AN2 = Mi_AN;
else Mi_AN2 = Matomnum + 1;
if (0<=kl && VPS_j_dependency[wakg]==1){
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
sumx0 = Complex(0.0,0.0); sumy0 = Complex(0.0,0.0); sumz0 = Complex(0.0,0.0);
sumx1 = Complex(0.0,0.0); sumy1 = Complex(0.0,0.0); sumz1 = Complex(0.0,0.0);
sumx2 = Complex(0.0,0.0); sumy2 = Complex(0.0,0.0); sumz2 = Complex(0.0,0.0);
dHCH_SO( &sumx0.r,&sumx0.i, &sumy0.r,&sumy0.i, &sumz0.r,&sumz0.i,
&sumx1.r,&sumx1.i, &sumy1.r,&sumy1.i, &sumz1.r,&sumz1.i,
&sumx2.r,&sumx2.i, &sumy2.r,&sumy2.i, &sumz2.r,&sumz2.i,
-1.0,
Mj_AN, k, n,
Mi_AN2, kl, m,
kg, wakg,
penalty_value,
OLP1 );
Hx[0][m][n].r += sumx0.r; /* up-up */
Hy[0][m][n].r += sumy0.r; /* up-up */
Hz[0][m][n].r += sumz0.r; /* up-up */
Hx[1][m][n].r += sumx1.r; /* dn-dn */
Hy[1][m][n].r += sumy1.r; /* dn-dn */
Hz[1][m][n].r += sumz1.r; /* dn-dn */
Hx[2][m][n].r += sumx2.r; /* up-dn */
Hy[2][m][n].r += sumy2.r; /* up-dn */
Hz[2][m][n].r += sumz2.r; /* up-dn */
Hx[0][m][n].i += sumx0.i; /* up-up */
Hy[0][m][n].i += sumy0.i; /* up-up */
Hz[0][m][n].i += sumz0.i; /* up-up */
Hx[1][m][n].i += sumx1.i; /* dn-dn */
Hy[1][m][n].i += sumy1.i; /* dn-dn */
Hz[1][m][n].i += sumz1.i; /* dn-dn */
Hx[2][m][n].i += sumx2.i; /* up-dn */
Hy[2][m][n].i += sumy2.i; /* up-dn */
Hz[2][m][n].i += sumz2.i; /* up-dn */
}
}
}
}
}
/* if (h_AN!=0 && where_flag==1) */
else {
/****************************************************
dH*ep*H
****************************************************/
kg = natn[Gc_AN][0];
wakg = WhatSpecies[kg];
kan = Spe_Total_VPS_Pro[wakg];
kl1 = RMI1[Mc_AN][0][h_AN];
kl2 = RMI1[Mc_AN][0][q_AN];
/****************************************************
l-dependent non-local part
****************************************************/
if (VPS_j_dependency[wakg]==0){
if (kg==Core_Hole_Atom){
/* calculate the multiplication */
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
sumx[0] = 0.0; sumx[1] = 0.0;
sumy[0] = 0.0; sumy[1] = 0.0;
sumz[0] = 0.0; sumz[1] = 0.0;
for (i=0; i<Spe_Total_CNO[wakg]; i++){
sumx[0] -= penalty[0][i]*OLP1[1][Matomnum+1][kl1][m][i]*OLP1[0][Matomnum+1][kl2][n][i];
sumy[0] -= penalty[0][i]*OLP1[2][Matomnum+1][kl1][m][i]*OLP1[0][Matomnum+1][kl2][n][i];
sumz[0] -= penalty[0][i]*OLP1[3][Matomnum+1][kl1][m][i]*OLP1[0][Matomnum+1][kl2][n][i];
sumx[1] -= penalty[1][i]*OLP1[1][Matomnum+1][kl1][m][i]*OLP1[0][Matomnum+1][kl2][n][i];
sumy[1] -= penalty[1][i]*OLP1[2][Matomnum+1][kl1][m][i]*OLP1[0][Matomnum+1][kl2][n][i];
sumz[1] -= penalty[1][i]*OLP1[3][Matomnum+1][kl1][m][i]*OLP1[0][Matomnum+1][kl2][n][i];
}
Hx[0][m][n].r = sumx[0];
Hy[0][m][n].r = sumy[0];
Hz[0][m][n].r = sumz[0];
Hx[1][m][n].r = sumx[1];
Hy[1][m][n].r = sumy[1];
Hz[1][m][n].r = sumz[1];
Hx[2][m][n].r = 0.0;
Hy[2][m][n].r = 0.0;
Hz[2][m][n].r = 0.0;
Hx[0][m][n].i = 0.0;
Hy[0][m][n].i = 0.0;
Hz[0][m][n].i = 0.0;
Hx[1][m][n].i = 0.0;
Hy[1][m][n].i = 0.0;
Hz[1][m][n].i = 0.0;
Hx[2][m][n].i = 0.0;
Hy[2][m][n].i = 0.0;
Hz[2][m][n].i = 0.0;
}
}
}
}
/****************************************************
j-dependent non-local part
****************************************************/
else if ( VPS_j_dependency[wakg]==1 ){
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
sumx0 = Complex(0.0,0.0); sumy0 = Complex(0.0,0.0); sumz0 = Complex(0.0,0.0);
sumx1 = Complex(0.0,0.0); sumy1 = Complex(0.0,0.0); sumz1 = Complex(0.0,0.0);
sumx2 = Complex(0.0,0.0); sumy2 = Complex(0.0,0.0); sumz2 = Complex(0.0,0.0);
/* 2 */
dHCH_SO( &sumx0.r,&sumx0.i, &sumy0.r,&sumy0.i, &sumz0.r,&sumz0.i,
&sumx1.r,&sumx1.i, &sumy1.r,&sumy1.i, &sumz1.r,&sumz1.i,
&sumx2.r,&sumx2.i, &sumy2.r,&sumy2.i, &sumz2.r,&sumz2.i,
1.0,
Matomnum+1, kl1,m,
Matomnum+1, kl2,n,
kg, wakg,
-penalty_value,
OLP1 );
Hx[0][m][n].r = sumx0.r; /* up-up */
Hy[0][m][n].r = sumy0.r; /* up-up */
Hz[0][m][n].r = sumz0.r; /* up-up */
Hx[1][m][n].r = sumx1.r; /* dn-dn */
Hy[1][m][n].r = sumy1.r; /* dn-dn */
Hz[1][m][n].r = sumz1.r; /* dn-dn */
Hx[2][m][n].r = sumx2.r; /* up-dn */
Hy[2][m][n].r = sumy2.r; /* up-dn */
Hz[2][m][n].r = sumz2.r; /* up-dn */
Hx[0][m][n].i = sumx0.i; /* up-up */
Hy[0][m][n].i = sumy0.i; /* up-up */
Hz[0][m][n].i = sumz0.i; /* up-up */
Hx[1][m][n].i = sumx1.i; /* dn-dn */
Hy[1][m][n].i = sumy1.i; /* dn-dn */
Hz[1][m][n].i = sumz1.i; /* dn-dn */
Hx[2][m][n].i = sumx2.i; /* up-dn */
Hy[2][m][n].i = sumy2.i; /* up-dn */
Hz[2][m][n].i = sumz2.i; /* up-dn */
}
}
}
/****************************************************
H*ep*dH
****************************************************/
if (q_AN!=0) {
kg = natn[Gc_AN][0];
wakg = WhatSpecies[kg];
kan = Spe_Total_VPS_Pro[wakg];
kl1 = RMI1[Mc_AN][0][h_AN];
kl2 = RMI1[Mc_AN][0][q_AN];
/****************************************************
l-dependent non-local part
****************************************************/
if (VPS_j_dependency[wakg]==0){
if (kg==Core_Hole_Atom){
/* calculate the multiplication */
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
sumx[0] = 0.0; sumx[1] = 0.0;
sumy[0] = 0.0; sumy[1] = 0.0;
sumz[0] = 0.0; sumz[1] = 0.0;
for (i=0; i<Spe_Total_CNO[wakg]; i++){
sumx[0] -= penalty[0][i]*OLP1[0][Matomnum+1][kl1][m][i]*OLP1[1][Matomnum+1][kl2][n][i];
sumy[0] -= penalty[0][i]*OLP1[0][Matomnum+1][kl1][m][i]*OLP1[2][Matomnum+1][kl2][n][i];
sumz[0] -= penalty[0][i]*OLP1[0][Matomnum+1][kl1][m][i]*OLP1[3][Matomnum+1][kl2][n][i];
sumx[1] -= penalty[1][i]*OLP1[0][Matomnum+1][kl1][m][i]*OLP1[1][Matomnum+1][kl2][n][i];
sumy[1] -= penalty[1][i]*OLP1[0][Matomnum+1][kl1][m][i]*OLP1[2][Matomnum+1][kl2][n][i];
sumz[1] -= penalty[1][i]*OLP1[0][Matomnum+1][kl1][m][i]*OLP1[3][Matomnum+1][kl2][n][i];
}
Hx[0][m][n].r += sumx[0];
Hy[0][m][n].r += sumy[0];
Hz[0][m][n].r += sumz[0];
Hx[1][m][n].r += sumx[1];
Hy[1][m][n].r += sumy[1];
Hz[1][m][n].r += sumz[1];
}
}
}
}
/****************************************************
j-dependent non-local part
****************************************************/
else if ( VPS_j_dependency[wakg]==1 ){
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
sumx0 = Complex(0.0,0.0); sumy0 = Complex(0.0,0.0); sumz0 = Complex(0.0,0.0);
sumx1 = Complex(0.0,0.0); sumy1 = Complex(0.0,0.0); sumz1 = Complex(0.0,0.0);
sumx2 = Complex(0.0,0.0); sumy2 = Complex(0.0,0.0); sumz2 = Complex(0.0,0.0);
/* 4 */
dHCH_SO( &sumx0.r,&sumx0.i, &sumy0.r,&sumy0.i, &sumz0.r,&sumz0.i,
&sumx1.r,&sumx1.i, &sumy1.r,&sumy1.i, &sumz1.r,&sumz1.i,
&sumx2.r,&sumx2.i, &sumy2.r,&sumy2.i, &sumz2.r,&sumz2.i,
-1.0,
Matomnum+1, kl2,n,
Matomnum+1, kl1,m,
kg, wakg,
-penalty_value,
OLP1 );
Hx[0][m][n].r += sumx0.r; /* up-up */
Hy[0][m][n].r += sumy0.r; /* up-up */
Hz[0][m][n].r += sumz0.r; /* up-up */
Hx[1][m][n].r += sumx1.r; /* dn-dn */
Hy[1][m][n].r += sumy1.r; /* dn-dn */
Hz[1][m][n].r += sumz1.r; /* dn-dn */
Hx[2][m][n].r += sumx2.r; /* up-dn */
Hy[2][m][n].r += sumy2.r; /* up-dn */
Hz[2][m][n].r += sumz2.r; /* up-dn */
Hx[0][m][n].i += sumx0.i; /* up-up */
Hy[0][m][n].i += sumy0.i; /* up-up */
Hz[0][m][n].i += sumz0.i; /* up-up */
Hx[1][m][n].i += sumx1.i; /* dn-dn */
Hy[1][m][n].i += sumy1.i; /* dn-dn */
Hz[1][m][n].i += sumz1.i; /* dn-dn */
Hx[2][m][n].i += sumx2.i; /* up-dn */
Hy[2][m][n].i += sumy2.i; /* up-dn */
Hz[2][m][n].i += sumz2.i; /* up-dn */
}
}
}
}
} /* else */
/****************************************************
contribution by dampingF
****************************************************/
/* Qij * dH/dx */
for (so=0; so<3; so++){
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
Hx[so][m][n].r = dmp*Hx[so][m][n].r;
Hy[so][m][n].r = dmp*Hy[so][m][n].r;
Hz[so][m][n].r = dmp*Hz[so][m][n].r;
Hx[so][m][n].i = dmp*Hx[so][m][n].i;
Hy[so][m][n].i = dmp*Hy[so][m][n].i;
Hz[so][m][n].i = dmp*Hz[so][m][n].i;
}
}
}
/* dQij/dx * H */
if ( (h_AN==0 && q_AN!=0) || (h_AN!=0 && q_AN==0) ){
if (h_AN==0) kl = q_AN;
else if (q_AN==0) kl = h_AN;
if (SpinP_switch==0) somax = 0;
else if (SpinP_switch==1) somax = 1;
else if (SpinP_switch==3) somax = 2;
r = Dis[Gc_AN][kl];
if (rcut<=r) {
deri_dmp = 0.0;
tmp = 0.0;
}
else {
deri_dmp = deri_dampingF(rcut,r);
tmp = deri_dmp/dmp;
}
x0 = Gxyz[ig][1] + atv[Rni][1];
y0 = Gxyz[ig][2] + atv[Rni][2];
z0 = Gxyz[ig][3] + atv[Rni][3];
x1 = Gxyz[jg][1] + atv[Rnj][1];
y1 = Gxyz[jg][2] + atv[Rnj][2];
z1 = Gxyz[jg][3] + atv[Rnj][3];
/* for empty atoms or finite elemens basis */
if (r<1.0e-10) r = 1.0e-10;
if (h_AN==0 && q_AN!=0){
dx = tmp*(x0-x1)/r;
dy = tmp*(y0-y1)/r;
dz = tmp*(z0-z1)/r;
}
else if (h_AN!=0 && q_AN==0){
dx = tmp*(x1-x0)/r;
dy = tmp*(y1-y0)/r;
dz = tmp*(z1-z0)/r;
}
if (SpinP_switch==0 || SpinP_switch==1){
if (h_AN==0){
for (so=0; so<=somax; so++){
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
Hx[so][m][n].r += HCH[so][Mc_AN][kl][m][n]*dx;
Hy[so][m][n].r += HCH[so][Mc_AN][kl][m][n]*dy;
Hz[so][m][n].r += HCH[so][Mc_AN][kl][m][n]*dz;
}
}
}
}
else if (q_AN==0){
for (so=0; so<=somax; so++){
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
Hx[so][m][n].r += HCH[so][Mc_AN][kl][n][m]*dx;
Hy[so][m][n].r += HCH[so][Mc_AN][kl][n][m]*dy;
Hz[so][m][n].r += HCH[so][Mc_AN][kl][n][m]*dz;
}
}
}
}
}
else if (SpinP_switch==3){
if (h_AN==0){
for (so=0; so<=somax; so++){
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
Hx[so][m][n].r += HCH[so][Mc_AN][kl][m][n]*dx;
Hy[so][m][n].r += HCH[so][Mc_AN][kl][m][n]*dy;
Hz[so][m][n].r += HCH[so][Mc_AN][kl][m][n]*dz;
}
}
}
}
else if (q_AN==0){
for (so=0; so<=somax; so++){
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
Hx[so][m][n].r += HCH[so][Mc_AN][kl][n][m]*dx;
Hy[so][m][n].r += HCH[so][Mc_AN][kl][n][m]*dy;
Hz[so][m][n].r += HCH[so][Mc_AN][kl][n][m]*dz;
}
}
}
}
if (SO_switch==1){
if (h_AN==0){
for (so=0; so<=somax; so++){
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
Hx[so][m][n].i += iHCH[so][Mc_AN][kl][m][n]*dx;
Hy[so][m][n].i += iHCH[so][Mc_AN][kl][m][n]*dy;
Hz[so][m][n].i += iHCH[so][Mc_AN][kl][m][n]*dz;
}
}
}
}
else if (q_AN==0){
for (so=0; so<=somax; so++){
for (m=0; m<ian; m++){
for (n=0; n<jan; n++){
Hx[so][m][n].i += iHCH[so][Mc_AN][kl][n][m]*dx;
Hy[so][m][n].i += iHCH[so][Mc_AN][kl][n][m]*dy;
Hz[so][m][n].i += iHCH[so][Mc_AN][kl][n][m]*dz;
}
}
}
}
}
}
}
/* freeing of array */
for (i=0; i<2; i++){
free(penalty[i]);
}
free(penalty);
}
void dHCH_SO(double *sumx0r, double *sumx0i, double *sumy0r, double *sumy0i, double *sumz0r, double *sumz0i,
double *sumx1r, double *sumx1i, double *sumy1r, double *sumy1i, double *sumz1r, double *sumz1i,
double *sumx2r, double *sumx2i, double *sumy2r, double *sumy2i, double *sumz2r, double *sumz2i,
double fugou,
int Mc_AN, int k, int m,
int Mj_AN, int kl, int n,
int kg, int wakg,
double penalty_value,
double *****OLP1)
{
int L,L2,l,mul,apply_flag;
double d12_m12,d12_p12;
double d32_m12,d32_p12,d32_m32,d32_p32;
double d52_m12,d52_p12,d52_m32,d52_p32,d52_m52,d52_p52;
double d72_m12,d72_p12,d72_m32,d72_p32,d72_m52,d72_p52,d72_m72,d72_p72;
if (kg!=Core_Hole_Atom) return;
/****************************************************
set penalty coefficients
****************************************************/
L = 0;
for (l=0; l<=Spe_MaxL_Basis[wakg]; l++){
for (mul=0; mul<Spe_Num_Basis[wakg][l]; mul++){
apply_flag = 0;
if ((strcmp(Core_Hole_Orbital,"s")==0) && l==0 && mul==0) {
L2 = 0;
apply_flag = 1;
}
else if ((strcmp(Core_Hole_Orbital,"p")==0) && l==1 && mul==0) {
L2 = 2;
apply_flag = 1;
}
else if ((strcmp(Core_Hole_Orbital,"d")==0) && l==2 && mul==0) {
L2 = 4;
apply_flag = 1;
}
else if ((strcmp(Core_Hole_Orbital,"f")==0) && l==3 && mul==0) {
L2 = 6;
apply_flag = 1;
}
if (apply_flag==1){
/****************************************************
set coefficients related to penalty
****************************************************/
if (L2==0){
if (Core_Hole_J==0){
/* for Core_Hole_J==0 */
d12_p12 = penalty_value;
d12_m12 = penalty_value;
}
else{
/* for Core_Hole_J!=0 */
d12_p12 = penalty_value*(Core_Hole_J==1);
d12_m12 = penalty_value*(Core_Hole_J==2);
}
}
else if (L2==2){
if (Core_Hole_J==0){
/* for Core_Hole_J==0 */
d32_p32 = penalty_value/3.0;
d32_p12 = penalty_value/3.0;
d32_m12 = penalty_value/3.0;
d32_m32 = penalty_value/3.0;
d12_p12 = penalty_value/3.0;
d12_m12 = penalty_value/3.0;
}
else{
/* for Core_Hole_J!=0 */
d32_p32 = penalty_value/3.0*(Core_Hole_J==1);
d32_p12 = penalty_value/3.0*(Core_Hole_J==2);
d32_m12 = penalty_value/3.0*(Core_Hole_J==3);
d32_m32 = penalty_value/3.0*(Core_Hole_J==4);
d12_p12 = penalty_value/3.0*(Core_Hole_J==5);
d12_m12 = penalty_value/3.0*(Core_Hole_J==6);
}
}
else if (L2==4){
if (Core_Hole_J==0){
/* for Core_Hole_J==0 */
d52_p52 = penalty_value/5.0;
d52_p32 = penalty_value/5.0;
d52_p12 = penalty_value/5.0;
d52_m12 = penalty_value/5.0;
d52_m32 = penalty_value/5.0;
d52_m52 = penalty_value/5.0;
d32_p32 = penalty_value/5.0;
d32_p12 = penalty_value/5.0;
d32_m12 = penalty_value/5.0;
d32_m32 = penalty_value/5.0;
}
else{
/* for Core_Hole_J!=0 */
d52_p52 = penalty_value/5.0*(Core_Hole_J==1);
d52_p32 = penalty_value/5.0*(Core_Hole_J==2);
d52_p12 = penalty_value/5.0*(Core_Hole_J==3);
d52_m12 = penalty_value/5.0*(Core_Hole_J==4);
d52_m32 = penalty_value/5.0*(Core_Hole_J==5);
d52_m52 = penalty_value/5.0*(Core_Hole_J==6);
d32_p32 = penalty_value/5.0*(Core_Hole_J==7);
d32_p12 = penalty_value/5.0*(Core_Hole_J==8);
d32_m12 = penalty_value/5.0*(Core_Hole_J==9);
d32_m32 = penalty_value/5.0*(Core_Hole_J==10);
}
}
else if (L2==6){
if (Core_Hole_J==0){
/* for Core_Hole_J==0 */
d72_p72 = penalty_value/7.0;
d72_p52 = penalty_value/7.0;
d72_p32 = penalty_value/7.0;
d72_p12 = penalty_value/7.0;
d72_m12 = penalty_value/7.0;
d72_m32 = penalty_value/7.0;
d72_m52 = penalty_value/7.0;
d72_m72 = penalty_value/7.0;
d52_p52 = penalty_value/7.0;
d52_p32 = penalty_value/7.0;
d52_p12 = penalty_value/7.0;
d52_m12 = penalty_value/7.0;
d52_m32 = penalty_value/7.0;
d52_m52 = penalty_value/7.0;
}
else{
/* for Core_Hole_J!=0 */
d72_p72 = penalty_value/7.0*(Core_Hole_J==1);
d72_p52 = penalty_value/7.0*(Core_Hole_J==2);
d72_p32 = penalty_value/7.0*(Core_Hole_J==3);
d72_p12 = penalty_value/7.0*(Core_Hole_J==4);
d72_m12 = penalty_value/7.0*(Core_Hole_J==5);
d72_m32 = penalty_value/7.0*(Core_Hole_J==6);
d72_m52 = penalty_value/7.0*(Core_Hole_J==7);
d72_m72 = penalty_value/7.0*(Core_Hole_J==8);
d52_p52 = penalty_value/7.0*(Core_Hole_J==9);
d52_p32 = penalty_value/7.0*(Core_Hole_J==10);
d52_p12 = penalty_value/7.0*(Core_Hole_J==11);
d52_m12 = penalty_value/7.0*(Core_Hole_J==12);
d52_m32 = penalty_value/7.0*(Core_Hole_J==13);
d52_m52 = penalty_value/7.0*(Core_Hole_J==14);
}
}
/****************************************************
off-diagonal contribution on up-dn
for spin non-collinear
****************************************************/
if (SpinP_switch==3){
/***************
p
***************/
if (L2==2){
/* real contribution of l+1/2 to off-diagonal up-down matrix */
*sumx2r += fugou*(
d32_m12*OLP1[1][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+2]
-d32_p12*OLP1[1][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L ] );
*sumy2r += fugou*(
d32_m12*OLP1[2][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+2]
-d32_p12*OLP1[2][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L ] );
*sumz2r += fugou*(
d32_m12*OLP1[3][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+2]
-d32_p12*OLP1[3][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L ] );
/* imaginary contribution of l+1/2 to off-diagonal up-down matrix */
*sumx2i += fugou*(
-d32_m12*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+2]
+d32_p12*OLP1[1][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+1] );
*sumx2i += fugou*(
-d32_m12*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+2]
+d32_p12*OLP1[2][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+1] );
*sumx2i += fugou*(
-d32_m12*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+2]
+d32_p12*OLP1[3][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+1] );
/* real contribution of l-1/2 for to off-diagonal up-down matrix */
*sumx2r -= fugou*(
d12_m12*OLP1[1][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+2]
-d12_p12*OLP1[1][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L ] );
*sumy2r -= fugou*(
d12_m12*OLP1[2][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+2]
-d12_p12*OLP1[2][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L ] );
*sumz2r -= fugou*(
d12_m12*OLP1[3][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+2]
-d12_p12*OLP1[3][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L ] );
/* imaginary contribution of l-1/2 to off-diagonal up-down matrix */
*sumx2i -= fugou*(
-d12_m12*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+2]
+d12_p12*OLP1[1][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+1] );
*sumy2i -= fugou*(
-d12_m12*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+2]
+d12_p12*OLP1[2][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+1] );
*sumz2i -= fugou*(
-d12_m12*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+2]
+d12_p12*OLP1[3][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+1] );
}
/***************
d
***************/
else if (L2==4){
/* real contribution of l+1/2 to off diagonal up-down matrix */
*sumx2r += fugou*(
-sqrt(3.0)*d52_p12*OLP1[1][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+3]
+sqrt(3.0)*d52_m12*OLP1[1][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L ]
+d52_m32*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+3]
-d52_p32*OLP1[1][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+1]
+d52_m32*OLP1[1][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+4]
-d52_p32*OLP1[1][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+2] );
*sumy2r += fugou*(
-sqrt(3.0)*d52_p12*OLP1[2][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+3]
+sqrt(3.0)*d52_m12*OLP1[2][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L ]
+d52_m32*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+3]
-d52_p32*OLP1[2][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+1]
+d52_m32*OLP1[2][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+4]
-d52_p32*OLP1[2][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+2] );
*sumz2r += fugou*(
-sqrt(3.0)*d52_p12*OLP1[3][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+3]
+sqrt(3.0)*d52_m12*OLP1[3][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L ]
+d52_m32*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+3]
-d52_p32*OLP1[3][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+1]
+d52_m32*OLP1[3][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+4]
-d52_p32*OLP1[3][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+2] );
/* imaginary contribution of l+1/2 to off diagonal up-down matrix */
*sumx2i += fugou*(
sqrt(3.0)*d52_p12*OLP1[1][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+4]
-sqrt(3.0)*d52_m12*OLP1[1][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L ]
+d52_m32*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+4]
-d52_p32*OLP1[1][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+1]
-d52_m32*OLP1[1][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+3]
+d52_p32*OLP1[1][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+2] );
*sumy2i += fugou*(
sqrt(3.0)*d52_p12*OLP1[2][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+4]
-sqrt(3.0)*d52_m12*OLP1[2][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L ]
+d52_m32*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+4]
-d52_p32*OLP1[2][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+1]
-d52_m32*OLP1[2][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+3]
+d52_p32*OLP1[2][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+2] );
*sumz2i += fugou*(
sqrt(3.0)*d52_p12*OLP1[3][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+4]
-sqrt(3.0)*d52_m12*OLP1[3][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L ]
+d52_m32*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+4]
-d52_p32*OLP1[3][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+1]
-d52_m32*OLP1[3][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+3]
+d52_p32*OLP1[3][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+2] );
/* real contribution of l-1/2 for to diagonal up-down matrix */
*sumx2r -= fugou*(
-sqrt(3.0)*d32_p12*OLP1[1][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+3]
+sqrt(3.0)*d32_m12*OLP1[1][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L ]
+d32_m32*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+3]
-d32_p32*OLP1[1][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+1]
+d32_m32*OLP1[1][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+4]
-d32_p32*OLP1[1][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+2] );
*sumy2r -= fugou*(
-sqrt(3.0)*d32_p12*OLP1[2][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+3]
+sqrt(3.0)*d32_m12*OLP1[2][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L ]
+d32_m32*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+3]
-d32_p32*OLP1[2][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+1]
+d32_m32*OLP1[2][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+4]
-d32_p32*OLP1[2][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+2] );
*sumz2r -= fugou*(
-sqrt(3.0)*d32_p12*OLP1[3][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+3]
+sqrt(3.0)*d32_m12*OLP1[3][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L ]
+d32_m32*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+3]
-d32_p32*OLP1[3][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+1]
+d32_m32*OLP1[3][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+4]
-d32_p32*OLP1[3][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+2] );
/* imaginary contribution of l-1/2 to off diagonal up-down matrix */
*sumx2i -= fugou*(
sqrt(3.0)*d32_p12*OLP1[1][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+4]
-sqrt(3.0)*d32_m12*OLP1[1][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L ]
+d32_m32*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+4]
-d32_p32*OLP1[1][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+1]
-d32_m32*OLP1[1][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+3]
+d32_p32*OLP1[1][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+2] );
*sumy2i -= fugou*(
sqrt(3.0)*d32_p12*OLP1[2][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+4]
-sqrt(3.0)*d32_m12*OLP1[2][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L ]
+d32_m32*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+4]
-d32_p32*OLP1[2][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+1]
-d32_m32*OLP1[2][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+3]
+d32_p32*OLP1[2][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+2] );
*sumz2i -= fugou*(
sqrt(3.0)*d32_p12*OLP1[3][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+4]
-sqrt(3.0)*d32_m12*OLP1[3][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L ]
+d32_m32*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+4]
-d32_p32*OLP1[3][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+1]
-d32_m32*OLP1[3][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+3]
+d32_p32*OLP1[3][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+2] );
}
/***************
f
***************/
else if (L2==6){
/* real contribution of l+1/2 to off diagonal up-down matrix */
*sumx2r += fugou*(
-sqrt(6.0)*d72_p12*OLP1[1][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+1]
+sqrt(6.0)*d72_m12*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L ]
-sqrt(2.5)*d72_p32*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+3]
+sqrt(2.5)*d72_m32*OLP1[1][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+1]
-sqrt(2.5)*d72_p32*OLP1[1][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+4]
+sqrt(2.5)*d72_m32*OLP1[1][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+2]
-sqrt(1.5)*d72_p52*OLP1[1][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+5]
+sqrt(1.5)*d72_m52*OLP1[1][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+3]
-sqrt(1.5)*d72_p52*OLP1[1][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+6]
+sqrt(1.5)*d72_m52*OLP1[1][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+4] );
*sumy2r += fugou*(
-sqrt(6.0)*d72_p12*OLP1[2][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+1]
+sqrt(6.0)*d72_m12*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L ]
-sqrt(2.5)*d72_p32*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+3]
+sqrt(2.5)*d72_m32*OLP1[2][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+1]
-sqrt(2.5)*d72_p32*OLP1[2][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+4]
+sqrt(2.5)*d72_m32*OLP1[2][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+2]
-sqrt(1.5)*d72_p52*OLP1[2][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+5]
+sqrt(1.5)*d72_m52*OLP1[2][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+3]
-sqrt(1.5)*d72_p52*OLP1[2][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+6]
+sqrt(1.5)*d72_m52*OLP1[2][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+4] );
*sumz2r += fugou*(
-sqrt(6.0)*d72_p12*OLP1[3][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+1]
+sqrt(6.0)*d72_m12*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L ]
-sqrt(2.5)*d72_p32*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+3]
+sqrt(2.5)*d72_m32*OLP1[3][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+1]
-sqrt(2.5)*d72_p32*OLP1[3][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+4]
+sqrt(2.5)*d72_m32*OLP1[3][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+2]
-sqrt(1.5)*d72_p52*OLP1[3][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+5]
+sqrt(1.5)*d72_m52*OLP1[3][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+3]
-sqrt(1.5)*d72_p52*OLP1[3][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+6]
+sqrt(1.5)*d72_m52*OLP1[3][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+4] );
/* imaginary contribution of l+1/2 to off diagonal up-down matrix */
*sumx2i += fugou*(
sqrt(6.0)*d72_p12*OLP1[1][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+2]
-sqrt(6.0)*d72_m12*OLP1[1][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L ]
+sqrt(2.5)*d72_p32*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+4]
-sqrt(2.5)*d72_m32*OLP1[1][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+1]
-sqrt(2.5)*d72_p32*OLP1[1][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+3]
+sqrt(2.5)*d72_m32*OLP1[1][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+2]
+sqrt(1.5)*d72_p52*OLP1[1][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+6]
-sqrt(1.5)*d72_m52*OLP1[1][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+3]
-sqrt(1.5)*d72_p52*OLP1[1][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+5]
+sqrt(1.5)*d72_m52*OLP1[1][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+4] );
*sumy2i += fugou*(
sqrt(6.0)*d72_p12*OLP1[2][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+2]
-sqrt(6.0)*d72_m12*OLP1[2][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L ]
+sqrt(2.5)*d72_p32*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+4]
-sqrt(2.5)*d72_m32*OLP1[2][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+1]
-sqrt(2.5)*d72_p32*OLP1[2][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+3]
+sqrt(2.5)*d72_m32*OLP1[2][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+2]
+sqrt(1.5)*d72_p52*OLP1[2][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+6]
-sqrt(1.5)*d72_m52*OLP1[2][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+3]
-sqrt(1.5)*d72_p52*OLP1[2][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+5]
+sqrt(1.5)*d72_m52*OLP1[2][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+4] );
*sumz2i += fugou*(
sqrt(6.0)*d72_p12*OLP1[3][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+2]
-sqrt(6.0)*d72_m12*OLP1[3][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L ]
+sqrt(2.5)*d72_p32*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+4]
-sqrt(2.5)*d72_m32*OLP1[3][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+1]
-sqrt(2.5)*d72_p32*OLP1[3][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+3]
+sqrt(2.5)*d72_m32*OLP1[3][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+2]
+sqrt(1.5)*d72_p52*OLP1[3][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+6]
-sqrt(1.5)*d72_m52*OLP1[3][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+3]
-sqrt(1.5)*d72_p52*OLP1[3][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+5]
+sqrt(1.5)*d72_m52*OLP1[3][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+4] );
/* real contribution of l-1/2 for to off-diagonal up-down matrix */
*sumx2r -= fugou*(
-sqrt(6.0)*d52_p12*OLP1[1][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+1]
+sqrt(6.0)*d52_m12*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L ]
-sqrt(2.5)*d52_p32*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+3]
+sqrt(2.5)*d52_m32*OLP1[1][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+1]
-sqrt(2.5)*d52_p32*OLP1[1][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+4]
+sqrt(2.5)*d52_m32*OLP1[1][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+2]
-sqrt(1.5)*d52_p52*OLP1[1][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+5]
+sqrt(1.5)*d52_m52*OLP1[1][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+3]
-sqrt(1.5)*d52_p52*OLP1[1][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+6]
+sqrt(1.5)*d52_m52*OLP1[1][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+4] );
*sumy2r -= fugou*(
-sqrt(6.0)*d52_p12*OLP1[2][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+1]
+sqrt(6.0)*d52_m12*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L ]
-sqrt(2.5)*d52_p32*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+3]
+sqrt(2.5)*d52_m32*OLP1[2][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+1]
-sqrt(2.5)*d52_p32*OLP1[2][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+4]
+sqrt(2.5)*d52_m32*OLP1[2][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+2]
-sqrt(1.5)*d52_p52*OLP1[2][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+5]
+sqrt(1.5)*d52_m52*OLP1[2][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+3]
-sqrt(1.5)*d52_p52*OLP1[2][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+6]
+sqrt(1.5)*d52_m52*OLP1[2][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+4] );
*sumz2r -= fugou*(
-sqrt(6.0)*d52_p12*OLP1[3][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+1]
+sqrt(6.0)*d52_m12*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L ]
-sqrt(2.5)*d52_p32*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+3]
+sqrt(2.5)*d52_m32*OLP1[3][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+1]
-sqrt(2.5)*d52_p32*OLP1[3][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+4]
+sqrt(2.5)*d52_m32*OLP1[3][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+2]
-sqrt(1.5)*d52_p52*OLP1[3][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+5]
+sqrt(1.5)*d52_m52*OLP1[3][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+3]
-sqrt(1.5)*d52_p52*OLP1[3][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+6]
+sqrt(1.5)*d52_m52*OLP1[3][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+4] );
/* imaginary contribution of l-1/2 to off diagonal up-down matrix */
*sumx2i -= fugou*(
sqrt(6.0)*d52_p12*OLP1[1][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+2]
-sqrt(6.0)*d52_m12*OLP1[1][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L ]
+sqrt(2.5)*d52_p32*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+4]
-sqrt(2.5)*d52_m32*OLP1[1][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+1]
-sqrt(2.5)*d52_p32*OLP1[1][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+3]
+sqrt(2.5)*d52_m32*OLP1[1][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+2]
+sqrt(1.5)*d52_p52*OLP1[1][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+6]
-sqrt(1.5)*d52_m52*OLP1[1][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+3]
-sqrt(1.5)*d52_p52*OLP1[1][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+5]
+sqrt(1.5)*d52_m52*OLP1[1][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+4] );
*sumy2i -= fugou*(
sqrt(6.0)*d52_p12*OLP1[2][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+2]
-sqrt(6.0)*d52_m12*OLP1[2][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L ]
+sqrt(2.5)*d52_p32*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+4]
-sqrt(2.5)*d52_m32*OLP1[2][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+1]
-sqrt(2.5)*d52_p32*OLP1[2][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+3]
+sqrt(2.5)*d52_m32*OLP1[2][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+2]
+sqrt(1.5)*d52_p52*OLP1[2][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+6]
-sqrt(1.5)*d52_m52*OLP1[2][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+3]
-sqrt(1.5)*d52_p52*OLP1[2][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+5]
+sqrt(1.5)*d52_m52*OLP1[2][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+4] );
*sumz2i -= fugou*(
sqrt(6.0)*d52_p12*OLP1[3][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+2]
-sqrt(6.0)*d52_m12*OLP1[3][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L ]
+sqrt(2.5)*d52_p32*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+4]
-sqrt(2.5)*d52_m32*OLP1[3][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+1]
-sqrt(2.5)*d52_p32*OLP1[3][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+3]
+sqrt(2.5)*d52_m32*OLP1[3][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+2]
+sqrt(1.5)*d52_p52*OLP1[3][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+6]
-sqrt(1.5)*d52_m52*OLP1[3][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+3]
-sqrt(1.5)*d52_p52*OLP1[3][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+5]
+sqrt(1.5)*d52_m52*OLP1[3][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+4] );
}
} /* if (SpinP_switch==3) */
/****************************************************
off-diagonal contribution on up-up and dn-dn
****************************************************/
/* p */
if (L2==2){
/* contribution of l+1/2 for up spin */
*sumx0i += 0.5*fugou*(
+( d32_m12-3.0*d32_p32)*OLP1[1][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+1]
+(-d32_m12+3.0*d32_p32)*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L ] );
*sumy0i += 0.5*fugou*(
+( d32_m12-3.0*d32_p32)*OLP1[2][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+1]
+(-d32_m12+3.0*d32_p32)*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L ] );
*sumz0i += 0.5*fugou*(
+( d32_m12-3.0*d32_p32)*OLP1[3][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+1]
+(-d32_m12+3.0*d32_p32)*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L ] );
/* contribution of l+1/2 for down spin */
*sumx1i += 0.5*fugou*(
+(-d32_p12+3.0*d32_m32)*OLP1[1][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+1]
+(+d32_p12-3.0*d32_m32)*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L ] );
*sumy1i += 0.5*fugou*(
+(-d32_p12+3.0*d32_m32)*OLP1[2][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+1]
+(+d32_p12-3.0*d32_m32)*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L ] );
*sumz1i += 0.5*fugou*(
+(-d32_p12+3.0*d32_m32)*OLP1[3][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+1]
+(+d32_p12-3.0*d32_m32)*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L ] );
/* contribution of l-1/2 for up spin */
*sumx0i += fugou*(
d12_m12*OLP1[1][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+1]
-d12_m12*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L ] );
*sumy0i += fugou*(
d12_m12*OLP1[2][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+1]
-d12_m12*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L ] );
*sumz0i += fugou*(
d12_m12*OLP1[3][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+1]
-d12_m12*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L ] );
/* contribution of l-1/2 for down spin */
*sumx1i += fugou*(
-d12_p12*OLP1[1][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+1]
+d12_p12*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L ] );
*sumy1i += fugou*(
-d12_p12*OLP1[2][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+1]
+d12_p12*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L ] );
*sumz1i += fugou*(
-d12_p12*OLP1[3][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L+1]
+d12_p12*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L ] );
}
/* d */
else if (L2==4){
/* contribution of l+1/2 for up spin */
*sumx0i += 0.5*fugou*(
+( d52_m32-5.0*d52_p52)*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+2]
+( -d52_m32+5.0*d52_p52)*OLP1[1][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+1]
+( 2.0*d52_m12-4.0*d52_p32)*OLP1[1][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+4]
+(-2.0*d52_m12+4.0*d52_p32)*OLP1[1][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+3] );
*sumy0i += 0.5*fugou*(
+( d52_m32-5.0*d52_p52)*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+2]
+( -d52_m32+5.0*d52_p52)*OLP1[2][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+1]
+( 2.0*d52_m12-4.0*d52_p32)*OLP1[2][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+4]
+(-2.0*d52_m12+4.0*d52_p32)*OLP1[2][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+3] );
*sumz0i += 0.5*fugou*(
+( d52_m32-5.0*d52_p52)*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+2]
+( -d52_m32+5.0*d52_p52)*OLP1[3][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+1]
+( 2.0*d52_m12-4.0*d52_p32)*OLP1[3][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+4]
+(-2.0*d52_m12+4.0*d52_p32)*OLP1[3][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+3] );
/* contribution of l+1/2 for down spin */
*sumx1i += 0.5*fugou*(
-( d52_p32-5.0*d52_m52)*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+2]
-( -d52_p32+5.0*d52_m52)*OLP1[1][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+1]
-( 2.0*d52_p12-4.0*d52_m32)*OLP1[1][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+4]
-(-2.0*d52_p12+4.0*d52_m32)*OLP1[1][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+3] );
*sumy1i += 0.5*fugou*(
-( d52_p32-5.0*d52_m52)*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+2]
-( -d52_p32+5.0*d52_m52)*OLP1[2][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+1]
-( 2.0*d52_p12-4.0*d52_m32)*OLP1[2][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+4]
-(-2.0*d52_p12+4.0*d52_m32)*OLP1[2][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+3] );
*sumz1i += 0.5*fugou*(
-( d52_p32-5.0*d52_m52)*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+2]
-( -d52_p32+5.0*d52_m52)*OLP1[3][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+1]
-( 2.0*d52_p12-4.0*d52_m32)*OLP1[3][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+4]
-(-2.0*d52_p12+4.0*d52_m32)*OLP1[3][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+3] );
/* contribution of l-1/2 for up spin */
*sumx0i += 0.5*fugou*(
( 4.0*d32_m32)*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+2]
+( -4.0*d32_m32)*OLP1[1][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+1]
+( 3.0*d32_m12-d32_p32)*OLP1[1][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+4]
+(-3.0*d32_m12+d32_p32)*OLP1[1][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+3] );
*sumy0i += 0.5*fugou*(
( 4.0*d32_m32)*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+2]
+( -4.0*d32_m32)*OLP1[2][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+1]
+( 3.0*d32_m12-d32_p32)*OLP1[2][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+4]
+(-3.0*d32_m12+d32_p32)*OLP1[2][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+3] );
*sumz0i += 0.5*fugou*(
( 4.0*d32_m32)*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+2]
+( -4.0*d32_m32)*OLP1[3][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+1]
+( 3.0*d32_m12-d32_p32)*OLP1[3][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+4]
+(-3.0*d32_m12+d32_p32)*OLP1[3][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+3] );
/* contribution of l-1/2 for down spin */
*sumx1i += 0.5*fugou*(
( -4.0*d32_p32)*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+2]
+( +4.0*d32_p32)*OLP1[1][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+1]
-( 3.0*d32_p12-d32_m32)*OLP1[1][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+4]
-(-3.0*d32_p12+d32_m32)*OLP1[1][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+3] );
*sumy1i += 0.5*fugou*(
( -4.0*d32_p32)*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+2]
+( +4.0*d32_p32)*OLP1[2][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+1]
-( 3.0*d32_p12-d32_m32)*OLP1[2][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+4]
-(-3.0*d32_p12+d32_m32)*OLP1[2][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+3] );
*sumz1i += 0.5*fugou*(
( -4.0*d32_p32)*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+2]
+( +4.0*d32_p32)*OLP1[3][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+1]
-( 3.0*d32_p12-d32_m32)*OLP1[3][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+4]
-(-3.0*d32_p12+d32_m32)*OLP1[3][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+3] );
}
/* f */
else if (L2==6){
/* contribution of l+1/2 for up spin */
*sumx0i += 0.5*fugou*(
( 3.0*d72_m12-5.0*d72_p32)*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+2]
+(-3.0*d72_m12+5.0*d72_p32)*OLP1[1][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+1]
+( 2.0*d72_m32-6.0*d72_p52)*OLP1[1][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+4]
+(-2.0*d72_m32+6.0*d72_p52)*OLP1[1][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+3]
+( 1.0*d72_m52-7.0*d72_p72)*OLP1[1][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+6]
+(-1.0*d72_m52+7.0*d72_p72)*OLP1[1][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+5] );
*sumy0i += 0.5*fugou*(
( 3.0*d72_m12-5.0*d72_p32)*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+2]
+(-3.0*d72_m12+5.0*d72_p32)*OLP1[2][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+1]
+( 2.0*d72_m32-6.0*d72_p52)*OLP1[2][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+4]
+(-2.0*d72_m32+6.0*d72_p52)*OLP1[2][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+3]
+( 1.0*d72_m52-7.0*d72_p72)*OLP1[2][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+6]
+(-1.0*d72_m52+7.0*d72_p72)*OLP1[2][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+5] );
*sumz0i += 0.5*fugou*(
( 3.0*d72_m12-5.0*d72_p32)*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+2]
+(-3.0*d72_m12+5.0*d72_p32)*OLP1[3][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+1]
+( 2.0*d72_m32-6.0*d72_p52)*OLP1[3][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+4]
+(-2.0*d72_m32+6.0*d72_p52)*OLP1[3][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+3]
+( 1.0*d72_m52-7.0*d72_p72)*OLP1[3][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+6]
+(-1.0*d72_m52+7.0*d72_p72)*OLP1[3][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+5] );
/* contribution of l+1/2 for down spin */
*sumx1i += 0.5*fugou*(
-( 3.0*d72_p12-5.0*d72_m32)*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+2]
-(-3.0*d72_p12+5.0*d72_m32)*OLP1[1][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+1]
-( 2.0*d72_p32-6.0*d72_m52)*OLP1[1][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+4]
-(-2.0*d72_p32+6.0*d72_m52)*OLP1[1][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+3]
-( 1.0*d72_p52-7.0*d72_m72)*OLP1[1][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+6]
-(-1.0*d72_p52+7.0*d72_m72)*OLP1[1][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+5] );
*sumy1i += 0.5*fugou*(
-( 3.0*d72_p12-5.0*d72_m32)*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+2]
-(-3.0*d72_p12+5.0*d72_m32)*OLP1[2][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+1]
-( 2.0*d72_p32-6.0*d72_m52)*OLP1[2][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+4]
-(-2.0*d72_p32+6.0*d72_m52)*OLP1[2][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+3]
-( 1.0*d72_p52-7.0*d72_m72)*OLP1[2][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+6]
-(-1.0*d72_p52+7.0*d72_m72)*OLP1[2][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+5] );
*sumz1i += 0.5*fugou*(
-( 3.0*d72_p12-5.0*d72_m32)*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+2]
-(-3.0*d72_p12+5.0*d72_m32)*OLP1[3][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+1]
-( 2.0*d72_p32-6.0*d72_m52)*OLP1[3][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+4]
-(-2.0*d72_p32+6.0*d72_m52)*OLP1[3][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+3]
-( 1.0*d72_p52-7.0*d72_m72)*OLP1[3][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+6]
-(-1.0*d72_p52+7.0*d72_m72)*OLP1[3][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+5] );
/* contribution of l-1/2 for up spin */
*sumx0i += 0.5*fugou*(
( 4.0*d52_m12-2.0*d52_p32)*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+2]
+(-4.0*d52_m12+2.0*d52_p32)*OLP1[1][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+1]
+( 5.0*d52_m32-1.0*d52_p52)*OLP1[1][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+4]
+(-5.0*d52_m32+1.0*d52_p52)*OLP1[1][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+3]
+(+6.0*d52_m52 )*OLP1[1][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+6]
+(-6.0*d52_m52 )*OLP1[1][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+5] );
*sumy0i += 0.5*fugou*(
( 4.0*d52_m12-2.0*d52_p32)*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+2]
+(-4.0*d52_m12+2.0*d52_p32)*OLP1[2][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+1]
+( 5.0*d52_m32-1.0*d52_p52)*OLP1[2][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+4]
+(-5.0*d52_m32+1.0*d52_p52)*OLP1[2][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+3]
+(+6.0*d52_m52 )*OLP1[2][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+6]
+(-6.0*d52_m52 )*OLP1[2][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+5] );
*sumz0i += 0.5*fugou*(
( 4.0*d52_m12-2.0*d52_p32)*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+2]
+(-4.0*d52_m12+2.0*d52_p32)*OLP1[3][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+1]
+( 5.0*d52_m32-1.0*d52_p52)*OLP1[3][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+4]
+(-5.0*d52_m32+1.0*d52_p52)*OLP1[3][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+3]
+(+6.0*d52_m52 )*OLP1[3][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+6]
+(-6.0*d52_m52 )*OLP1[3][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+5] );
/* contribution of l-1/2 for down spin */
*sumx1i += 0.5*fugou*(
-( 4.0*d52_p12-2.0*d52_m32)*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+2]
-(-4.0*d52_p12+2.0*d52_m32)*OLP1[1][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+1]
-( 5.0*d52_p32-1.0*d52_m52)*OLP1[1][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+4]
-(-5.0*d52_p32+1.0*d52_m52)*OLP1[1][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+3]
-(+6.0*d52_p52 )*OLP1[1][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+6]
-(-6.0*d52_p52 )*OLP1[1][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+5] );
*sumy1i += 0.5*fugou*(
-( 4.0*d52_p12-2.0*d52_m32)*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+2]
-(-4.0*d52_p12+2.0*d52_m32)*OLP1[2][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+1]
-( 5.0*d52_p32-1.0*d52_m52)*OLP1[2][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+4]
-(-5.0*d52_p32+1.0*d52_m52)*OLP1[2][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+3]
-(+6.0*d52_p52 )*OLP1[2][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+6]
-(-6.0*d52_p52 )*OLP1[2][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+5] );
*sumz1i += 0.5*fugou*(
-( 4.0*d52_p12-2.0*d52_m32)*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+2]
-(-4.0*d52_p12+2.0*d52_m32)*OLP1[3][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+1]
-( 5.0*d52_p32-1.0*d52_m52)*OLP1[3][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+4]
-(-5.0*d52_p32+1.0*d52_m52)*OLP1[3][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+3]
-(+6.0*d52_p52 )*OLP1[3][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+6]
-(-6.0*d52_p52 )*OLP1[3][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+5] );
}
/****************************************************
diagonal contribution on up-up and dn-dn
****************************************************/
/* s */
if (L2==0){
/* VNL for j=l+1/2 */
*sumx0r += d12_p12*OLP1[1][Mc_AN][k][m][L]*OLP1[0][Mj_AN][kl][n][L];
*sumy0r += d12_p12*OLP1[2][Mc_AN][k][m][L]*OLP1[0][Mj_AN][kl][n][L];
*sumz0r += d12_p12*OLP1[3][Mc_AN][k][m][L]*OLP1[0][Mj_AN][kl][n][L];
*sumx1r += d12_m12*OLP1[1][Mc_AN][k][m][L]*OLP1[0][Mj_AN][kl][n][L];
*sumy1r += d12_m12*OLP1[2][Mc_AN][k][m][L]*OLP1[0][Mj_AN][kl][n][L];
*sumz1r += d12_m12*OLP1[3][Mc_AN][k][m][L]*OLP1[0][Mj_AN][kl][n][L];
/* note that VNL for j=l-1/2 is zero */
}
/* p */
else if (L2==2){
/* VNL for j=l+1/2 */
*sumx0r += 0.5*(d32_m12+3.0*d32_p32)*OLP1[1][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumx0r += 0.5*(d32_m12+3.0*d32_p32)*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumx0r += 0.5*( 4.0*d32_p12)*OLP1[1][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
*sumy0r += 0.5*(d32_m12+3.0*d32_p32)*OLP1[2][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumy0r += 0.5*(d32_m12+3.0*d32_p32)*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumy0r += 0.5*( 4.0*d32_p12)*OLP1[2][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
*sumz0r += 0.5*(d32_m12+3.0*d32_p32)*OLP1[3][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumz0r += 0.5*(d32_m12+3.0*d32_p32)*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumz0r += 0.5*( 4.0*d32_p12)*OLP1[3][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
*sumx1r += 0.5*(d32_p12+3.0*d32_m32)*OLP1[1][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumx1r += 0.5*(d32_p12+3.0*d32_m32)*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumx1r += 0.5*( 4.0*d32_m12)*OLP1[1][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
*sumy1r += 0.5*(d32_p12+3.0*d32_m32)*OLP1[2][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumy1r += 0.5*(d32_p12+3.0*d32_m32)*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumy1r += 0.5*( 4.0*d32_m12)*OLP1[2][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
*sumz1r += 0.5*(d32_p12+3.0*d32_m32)*OLP1[3][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumz1r += 0.5*(d32_p12+3.0*d32_m32)*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumz1r += 0.5*( 4.0*d32_m12)*OLP1[3][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
/* VNL for j=l-1/2 */
*sumx0r += d12_m12*OLP1[1][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumx0r += d12_m12*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumx0r += d12_p12*OLP1[1][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
*sumy0r += d12_m12*OLP1[2][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumy0r += d12_m12*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumy0r += d12_p12*OLP1[2][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
*sumz0r += d12_m12*OLP1[3][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumz0r += d12_m12*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumz0r += d12_p12*OLP1[3][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
*sumx1r += d12_p12*OLP1[1][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumx1r += d12_p12*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumx1r += d12_m12*OLP1[1][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
*sumy1r += d12_p12*OLP1[2][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumy1r += d12_p12*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumy1r += d12_m12*OLP1[2][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
*sumz1r += d12_p12*OLP1[3][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumz1r += d12_p12*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumz1r += d12_m12*OLP1[3][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
}
/* d */
else if (L2==4){
/* VNL for j=l+1/2 */
*sumx0r += 0.5*( 6.0*d52_p12)*OLP1[1][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumx0r += 0.5*(1.0*d52_m32+5.0*d52_p52)*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumx0r += 0.5*(1.0*d52_m32+5.0*d52_p52)*OLP1[1][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
*sumx0r += 0.5*(2.0*d52_m12+4.0*d52_p32)*OLP1[1][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+3];
*sumx0r += 0.5*(2.0*d52_m12+4.0*d52_p32)*OLP1[1][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+4];
*sumy0r += 0.5*( 6.0*d52_p12)*OLP1[2][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumy0r += 0.5*(1.0*d52_m32+5.0*d52_p52)*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumy0r += 0.5*(1.0*d52_m32+5.0*d52_p52)*OLP1[2][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
*sumy0r += 0.5*(2.0*d52_m12+4.0*d52_p32)*OLP1[2][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+3];
*sumy0r += 0.5*(2.0*d52_m12+4.0*d52_p32)*OLP1[2][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+4];
*sumz0r += 0.5*( 6.0*d52_p12)*OLP1[3][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumz0r += 0.5*(1.0*d52_m32+5.0*d52_p52)*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumz0r += 0.5*(1.0*d52_m32+5.0*d52_p52)*OLP1[3][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
*sumz0r += 0.5*(2.0*d52_m12+4.0*d52_p32)*OLP1[3][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+3];
*sumz0r += 0.5*(2.0*d52_m12+4.0*d52_p32)*OLP1[3][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+4];
*sumx1r += 0.5*( 6.0*d52_m12)*OLP1[1][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumx1r += 0.5*(1.0*d52_p32+5.0*d52_m52)*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumx1r += 0.5*(1.0*d52_p32+5.0*d52_m52)*OLP1[1][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
*sumx1r += 0.5*(2.0*d52_p12+4.0*d52_m32)*OLP1[1][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+3];
*sumx1r += 0.5*(2.0*d52_p12+4.0*d52_m32)*OLP1[1][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+4];
*sumy1r += 0.5*( 6.0*d52_m12)*OLP1[2][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumy1r += 0.5*(1.0*d52_p32+5.0*d52_m52)*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumy1r += 0.5*(1.0*d52_p32+5.0*d52_m52)*OLP1[2][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
*sumy1r += 0.5*(2.0*d52_p12+4.0*d52_m32)*OLP1[2][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+3];
*sumy1r += 0.5*(2.0*d52_p12+4.0*d52_m32)*OLP1[2][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+4];
*sumz1r += 0.5*( 6.0*d52_m12)*OLP1[3][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumz1r += 0.5*(1.0*d52_p32+5.0*d52_m52)*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumz1r += 0.5*(1.0*d52_p32+5.0*d52_m52)*OLP1[3][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
*sumz1r += 0.5*(2.0*d52_p12+4.0*d52_m32)*OLP1[3][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+3];
*sumz1r += 0.5*(2.0*d52_p12+4.0*d52_m32)*OLP1[3][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+4];
/* VNL for j=l-1/2 */
*sumx0r += 0.5*( 4.0*d32_p12)*OLP1[1][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumx0r += 0.5*( 4.0*d32_m32)*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumx0r += 0.5*( 4.0*d32_m32)*OLP1[1][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
*sumx0r += 0.5*(3.0*d32_m12+1.0*d32_p32)*OLP1[1][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+3];
*sumx0r += 0.5*(3.0*d32_m12+1.0*d32_p32)*OLP1[1][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+4];
*sumy0r += 0.5*( 4.0*d32_p12)*OLP1[2][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumy0r += 0.5*( 4.0*d32_m32)*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumy0r += 0.5*( 4.0*d32_m32)*OLP1[2][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
*sumy0r += 0.5*(3.0*d32_m12+1.0*d32_p32)*OLP1[2][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+3];
*sumy0r += 0.5*(3.0*d32_m12+1.0*d32_p32)*OLP1[2][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+4];
*sumz0r += 0.5*( 4.0*d32_p12)*OLP1[3][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumz0r += 0.5*( 4.0*d32_m32)*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumz0r += 0.5*( 4.0*d32_m32)*OLP1[3][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
*sumz0r += 0.5*(3.0*d32_m12+1.0*d32_p32)*OLP1[3][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+3];
*sumz0r += 0.5*(3.0*d32_m12+1.0*d32_p32)*OLP1[3][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+4];
*sumx1r += 0.5*( 4.0*d32_m12)*OLP1[1][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumx1r += 0.5*( 4.0*d32_p32)*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumx1r += 0.5*( 4.0*d32_p32)*OLP1[1][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
*sumx1r += 0.5*(3.0*d32_p12+1.0*d32_m32)*OLP1[1][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+3];
*sumx1r += 0.5*(3.0*d32_p12+1.0*d32_m32)*OLP1[1][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+4];
*sumy1r += 0.5*( 4.0*d32_m12)*OLP1[2][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumy1r += 0.5*( 4.0*d32_p32)*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumy1r += 0.5*( 4.0*d32_p32)*OLP1[2][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
*sumy1r += 0.5*(3.0*d32_p12+1.0*d32_m32)*OLP1[2][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+3];
*sumy1r += 0.5*(3.0*d32_p12+1.0*d32_m32)*OLP1[2][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+4];
*sumz1r += 0.5*( 4.0*d32_m12)*OLP1[3][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumz1r += 0.5*( 4.0*d32_p32)*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumz1r += 0.5*( 4.0*d32_p32)*OLP1[3][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
*sumz1r += 0.5*(3.0*d32_p12+1.0*d32_m32)*OLP1[3][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+3];
*sumz1r += 0.5*(3.0*d32_p12+1.0*d32_m32)*OLP1[3][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+4];
}
/* f */
else if (L2==6){
/* VNL for j=l+1/2 */
*sumx0r += 0.5*( 8.0*d72_p12)*OLP1[1][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumx0r += 0.5*(3.0*d72_m12+5.0*d72_p32)*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumx0r += 0.5*(3.0*d72_m12+5.0*d72_p32)*OLP1[1][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
*sumx0r += 0.5*(2.0*d72_m32+6.0*d72_p52)*OLP1[1][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+3];
*sumx0r += 0.5*(2.0*d72_m32+6.0*d72_p52)*OLP1[1][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+4];
*sumx0r += 0.5*(1.0*d72_m52+7.0*d72_p72)*OLP1[1][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+5];
*sumx0r += 0.5*(1.0*d72_m52+7.0*d72_p72)*OLP1[1][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+6];
*sumy0r += 0.5*( 8.0*d72_p12)*OLP1[2][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumy0r += 0.5*(3.0*d72_m12+5.0*d72_p32)*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumy0r += 0.5*(3.0*d72_m12+5.0*d72_p32)*OLP1[2][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
*sumy0r += 0.5*(2.0*d72_m32+6.0*d72_p52)*OLP1[2][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+3];
*sumy0r += 0.5*(2.0*d72_m32+6.0*d72_p52)*OLP1[2][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+4];
*sumy0r += 0.5*(1.0*d72_m52+7.0*d72_p72)*OLP1[2][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+5];
*sumy0r += 0.5*(1.0*d72_m52+7.0*d72_p72)*OLP1[2][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+6];
*sumz0r += 0.5*( 8.0*d72_p12)*OLP1[3][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumz0r += 0.5*(3.0*d72_m12+5.0*d72_p32)*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumz0r += 0.5*(3.0*d72_m12+5.0*d72_p32)*OLP1[3][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
*sumz0r += 0.5*(2.0*d72_m32+6.0*d72_p52)*OLP1[3][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+3];
*sumz0r += 0.5*(2.0*d72_m32+6.0*d72_p52)*OLP1[3][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+4];
*sumz0r += 0.5*(1.0*d72_m52+7.0*d72_p72)*OLP1[3][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+5];
*sumz0r += 0.5*(1.0*d72_m52+7.0*d72_p72)*OLP1[3][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+6];
*sumx1r += 0.5*( 8.0*d72_m12)*OLP1[1][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumx1r += 0.5*(3.0*d72_p12+5.0*d72_m32)*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumx1r += 0.5*(3.0*d72_p12+5.0*d72_m32)*OLP1[1][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
*sumx1r += 0.5*(2.0*d72_p32+6.0*d72_m52)*OLP1[1][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+3];
*sumx1r += 0.5*(2.0*d72_p32+6.0*d72_m52)*OLP1[1][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+4];
*sumx1r += 0.5*(1.0*d72_p52+7.0*d72_m72)*OLP1[1][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+5];
*sumx1r += 0.5*(1.0*d72_p52+7.0*d72_m72)*OLP1[1][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+6];
*sumy1r += 0.5*( 8.0*d72_m12)*OLP1[2][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumy1r += 0.5*(3.0*d72_p12+5.0*d72_m32)*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumy1r += 0.5*(3.0*d72_p12+5.0*d72_m32)*OLP1[2][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
*sumy1r += 0.5*(2.0*d72_p32+6.0*d72_m52)*OLP1[2][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+3];
*sumy1r += 0.5*(2.0*d72_p32+6.0*d72_m52)*OLP1[2][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+4];
*sumy1r += 0.5*(1.0*d72_p52+7.0*d72_m72)*OLP1[2][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+5];
*sumy1r += 0.5*(1.0*d72_p52+7.0*d72_m72)*OLP1[2][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+6];
*sumz1r += 0.5*( 8.0*d72_m12)*OLP1[3][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumz1r += 0.5*(3.0*d72_p12+5.0*d72_m32)*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumz1r += 0.5*(3.0*d72_p12+5.0*d72_m32)*OLP1[3][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
*sumz1r += 0.5*(2.0*d72_p32+6.0*d72_m52)*OLP1[3][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+3];
*sumz1r += 0.5*(2.0*d72_p32+6.0*d72_m52)*OLP1[3][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+4];
*sumz1r += 0.5*(1.0*d72_p52+7.0*d72_m72)*OLP1[3][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+5];
*sumz1r += 0.5*(1.0*d72_p52+7.0*d72_m72)*OLP1[3][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+6];
/* VNL for j=l-1/2 */
*sumx0r += 0.5*( 6.0*d52_p12)*OLP1[1][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumx0r += 0.5*(4.0*d52_m12+2.0*d52_p32)*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumx0r += 0.5*(4.0*d52_m12+2.0*d52_p32)*OLP1[1][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
*sumx0r += 0.5*(5.0*d52_m32+1.0*d52_p52)*OLP1[1][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+3];
*sumx0r += 0.5*(5.0*d52_m32+1.0*d52_p52)*OLP1[1][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+4];
*sumx0r += 0.5*(6.0*d52_m52 )*OLP1[1][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+5];
*sumx0r += 0.5*(6.0*d52_m52 )*OLP1[1][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+6];
*sumy0r += 0.5*( 6.0*d52_p12)*OLP1[2][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumy0r += 0.5*(4.0*d52_m12+2.0*d52_p32)*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumy0r += 0.5*(4.0*d52_m12+2.0*d52_p32)*OLP1[2][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
*sumy0r += 0.5*(5.0*d52_m32+1.0*d52_p52)*OLP1[2][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+3];
*sumy0r += 0.5*(5.0*d52_m32+1.0*d52_p52)*OLP1[2][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+4];
*sumy0r += 0.5*(6.0*d52_m52 )*OLP1[2][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+5];
*sumy0r += 0.5*(6.0*d52_m52 )*OLP1[2][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+6];
*sumz0r += 0.5*( 6.0*d52_p12)*OLP1[3][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumz0r += 0.5*(4.0*d52_m12+2.0*d52_p32)*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumz0r += 0.5*(4.0*d52_m12+2.0*d52_p32)*OLP1[3][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
*sumz0r += 0.5*(5.0*d52_m32+1.0*d52_p52)*OLP1[3][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+3];
*sumz0r += 0.5*(5.0*d52_m32+1.0*d52_p52)*OLP1[3][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+4];
*sumz0r += 0.5*(6.0*d52_m52 )*OLP1[3][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+5];
*sumz0r += 0.5*(6.0*d52_m52 )*OLP1[3][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+6];
*sumx1r += 0.5*( 6.0*d52_m12)*OLP1[1][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumx1r += 0.5*(4.0*d52_p12+2.0*d52_m32)*OLP1[1][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumx1r += 0.5*(4.0*d52_p12+2.0*d52_m32)*OLP1[1][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
*sumx1r += 0.5*(5.0*d52_p32+1.0*d52_m52)*OLP1[1][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+3];
*sumx1r += 0.5*(5.0*d52_p32+1.0*d52_m52)*OLP1[1][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+4];
*sumx1r += 0.5*(6.0*d52_p52 )*OLP1[1][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+5];
*sumx1r += 0.5*(6.0*d52_p52 )*OLP1[1][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+6];
*sumy1r += 0.5*( 6.0*d52_m12)*OLP1[2][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumy1r += 0.5*(4.0*d52_p12+2.0*d52_m32)*OLP1[2][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumy1r += 0.5*(4.0*d52_p12+2.0*d52_m32)*OLP1[2][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
*sumy1r += 0.5*(5.0*d52_p32+1.0*d52_m52)*OLP1[2][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+3];
*sumy1r += 0.5*(5.0*d52_p32+1.0*d52_m52)*OLP1[2][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+4];
*sumy1r += 0.5*(6.0*d52_p52 )*OLP1[2][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+5];
*sumy1r += 0.5*(6.0*d52_p52 )*OLP1[2][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+6];
*sumz1r += 0.5*( 6.0*d52_m12)*OLP1[3][Mc_AN][k][m][L ]*OLP1[0][Mj_AN][kl][n][L ];
*sumz1r += 0.5*(4.0*d52_p12+2.0*d52_m32)*OLP1[3][Mc_AN][k][m][L+1]*OLP1[0][Mj_AN][kl][n][L+1];
*sumz1r += 0.5*(4.0*d52_p12+2.0*d52_m32)*OLP1[3][Mc_AN][k][m][L+2]*OLP1[0][Mj_AN][kl][n][L+2];
*sumz1r += 0.5*(5.0*d52_p32+1.0*d52_m52)*OLP1[3][Mc_AN][k][m][L+3]*OLP1[0][Mj_AN][kl][n][L+3];
*sumz1r += 0.5*(5.0*d52_p32+1.0*d52_m52)*OLP1[3][Mc_AN][k][m][L+4]*OLP1[0][Mj_AN][kl][n][L+4];
*sumz1r += 0.5*(6.0*d52_p52 )*OLP1[3][Mc_AN][k][m][L+5]*OLP1[0][Mj_AN][kl][n][L+5];
*sumz1r += 0.5*(6.0*d52_p52 )*OLP1[3][Mc_AN][k][m][L+6]*OLP1[0][Mj_AN][kl][n][L+6];
}
} /* if (apply_flag==1) */
/* increment of L */
L += 2*l + 1;
} /* mul */
} /* l */
}
void MPI_OLP(double *****OLP1)
{
int i,j,h_AN,Gh_AN,Hwan,n;
int tno1,tno2,Mc_AN,Gc_AN,Cwan;
int num,k,size1,size2;
double *tmp_array;
double *tmp_array2;
int *Snd_S_Size,*Rcv_S_Size;
int numprocs,myid,ID,IDS,IDR,tag=999;
MPI_Status stat;
MPI_Request request;
/* MPI */
MPI_Comm_size(mpi_comm_level1,&numprocs);
MPI_Comm_rank(mpi_comm_level1,&myid);
/****************************************************
allocation of arrays:
****************************************************/
Snd_S_Size = (int*)malloc(sizeof(int)*numprocs);
Rcv_S_Size = (int*)malloc(sizeof(int)*numprocs);
/******************************************************************
MPI
OLP1[1], OLP1[2], and OLP1[3]
note:
OLP is used in DC and GDC method, where overlap integrals
of Matomnum+MatomnumF+MatomnumS+1 are stored.
However, overlap integrals of Matomnum+MatomnumF+1 are
stored in Force.c. So, F_TopMAN should be used to refer
overlap integrals in Force.c, while S_TopMAN should be
used in DC and GDC routines.
Although OLP is used in Eff_Hub_Pot.c, the usage is
consistent with that of DC and GDC routines by the following
reason:
DC or GDC: OLP + Spe_Total_NO if no orbital optimization
CntOLP + Spe_Total_CNO if orbital optimization
Eff_Hub_Pot: OLP + Spe_Total_NO always since the U-potential
affects to primitive orbital
If no orbital optimization, both the usages are consistent.
If orbital optimization, CntOLP and OLP are used in DC(GDC) and
Eff_Hub_Pot.c, respectively. Therefore, there is no conflict.
*******************************************************************/
/***********************************
set data size
************************************/
for (ID=0; ID<numprocs; ID++){
IDS = (myid + ID) % numprocs;
IDR = (myid - ID + numprocs) % numprocs;
if (ID!=0){
tag = 999;
/* find data size to send block data */
if (F_Snd_Num[IDS]!=0){
size1 = 0;
for (n=0; n<F_Snd_Num[IDS]; n++){
Mc_AN = Snd_MAN[IDS][n];
Gc_AN = Snd_GAN[IDS][n];
Cwan = WhatSpecies[Gc_AN];
tno1 = Spe_Total_NO[Cwan];
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
Gh_AN = natn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
tno2 = Spe_Total_NO[Hwan];
size1 += 4*tno1*tno2;
}
}
Snd_S_Size[IDS] = size1;
MPI_Isend(&size1, 1, MPI_INT, IDS, tag, mpi_comm_level1, &request);
}
else{
Snd_S_Size[IDS] = 0;
}
/* receiving of size of data */
if (F_Rcv_Num[IDR]!=0){
MPI_Recv(&size2, 1, MPI_INT, IDR, tag, mpi_comm_level1, &stat);
Rcv_S_Size[IDR] = size2;
}
else{
Rcv_S_Size[IDR] = 0;
}
if (F_Snd_Num[IDS]!=0) MPI_Wait(&request,&stat);
}
else{
Snd_S_Size[IDS] = 0;
Rcv_S_Size[IDR] = 0;
}
}
/***********************************
data transfer
************************************/
tag = 999;
for (ID=0; ID<numprocs; ID++){
IDS = (myid + ID) % numprocs;
IDR = (myid - ID + numprocs) % numprocs;
if (ID!=0){
/*****************************
sending of data
*****************************/
if (F_Snd_Num[IDS]!=0){
size1 = Snd_S_Size[IDS];
/* allocation of array */
tmp_array = (double*)malloc(sizeof(double)*size1);
/* multidimentional array to vector array */
num = 0;
for (k=0; k<=3; k++){
for (n=0; n<F_Snd_Num[IDS]; n++){
Mc_AN = Snd_MAN[IDS][n];
Gc_AN = Snd_GAN[IDS][n];
Cwan = WhatSpecies[Gc_AN];
tno1 = Spe_Total_NO[Cwan];
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
Gh_AN = natn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
tno2 = Spe_Total_NO[Hwan];
for (i=0; i<tno1; i++){
for (j=0; j<tno2; j++){
tmp_array[num] = OLP1[k][Mc_AN][h_AN][i][j];
num++;
}
}
}
}
}
MPI_Isend(&tmp_array[0], size1, MPI_DOUBLE, IDS, tag, mpi_comm_level1, &request);
}
/*****************************
receiving of block data
*****************************/
if (F_Rcv_Num[IDR]!=0){
size2 = Rcv_S_Size[IDR];
/* allocation of array */
tmp_array2 = (double*)malloc(sizeof(double)*size2);
MPI_Recv(&tmp_array2[0], size2, MPI_DOUBLE, IDR, tag, mpi_comm_level1, &stat);
num = 0;
for (k=0; k<=3; k++){
Mc_AN = F_TopMAN[IDR] - 1; /* F_TopMAN should be used. */
for (n=0; n<F_Rcv_Num[IDR]; n++){
Mc_AN++;
Gc_AN = Rcv_GAN[IDR][n];
Cwan = WhatSpecies[Gc_AN];
tno1 = Spe_Total_NO[Cwan];
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
Gh_AN = natn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
tno2 = Spe_Total_NO[Hwan];
for (i=0; i<tno1; i++){
for (j=0; j<tno2; j++){
OLP1[k][Mc_AN][h_AN][i][j] = tmp_array2[num];
num++;
}
}
}
}
}
/* freeing of array */
free(tmp_array2);
}
if (F_Snd_Num[IDS]!=0){
MPI_Wait(&request,&stat);
free(tmp_array); /* freeing of array */
}
}
}
/****************************************************
freeing of arrays:
****************************************************/
free(Snd_S_Size);
free(Rcv_S_Size);
}
void Force_CoreHole(double *****CDM0, double *****iDM0)
{
/****************************************************
Force arising from the penalty functional
to create a core hole
****************************************************/
int Mc_AN,Gc_AN,Cwan,i,j,h_AN,q_AN,Mq_AN,start_q_AN;
int jan,kl,km,kl1,Qwan,Gq_AN,Gh_AN,Mh_AN,Hwan,ian;
int l1,l2,l3,l,LL,Mul1,tno0,ncp,so;
int tno1,tno2,size1,size2,n,kk,num,po,po1,po2;
int numprocs,myid,tag=999,ID,IDS,IDR;
int **S_array,**R_array;
int S_comm_flag,R_comm_flag;
int SA_num,q,Sc_AN,GSc_AN,smul;
int Sc_wan,Sh_AN,GSh_AN,Sh_wan;
int Sh_AN2,fan,jg,j0,jg0,Mj_AN0;
int Original_Mc_AN;
double rcutA,rcutB,rcut;
double dEx,dEy,dEz,ene,pref;
double Stime_atom, Etime_atom;
dcomplex ***Hx,***Hy,***Hz;
dcomplex ***Hx0,***Hy0,***Hz0;
dcomplex ***Hx1,***Hy1,***Hz1;
int *Snd_OLP_Size,*Rcv_OLP_Size;
int *Indicator;
double *tmp_array;
double *tmp_array2;
/* for OpenMP */
int OMPID,Nthrds,Nthrds0,Nprocs,Nloop,ODNloop;
int *OneD2h_AN,*OneD2q_AN;
double *dEx_threads;
double *dEy_threads;
double *dEz_threads;
double stime,etime;
double stime1,etime1;
MPI_Status stat;
MPI_Request request;
/* MPI */
MPI_Comm_size(mpi_comm_level1,&numprocs);
MPI_Comm_rank(mpi_comm_level1,&myid);
dtime(&stime);
/****************************
allocation of arrays
*****************************/
Indicator = (int*)malloc(sizeof(int)*numprocs);
S_array = (int**)malloc(sizeof(int*)*numprocs);
for (ID=0; ID<numprocs; ID++){
S_array[ID] = (int*)malloc(sizeof(int)*3);
}
R_array = (int**)malloc(sizeof(int*)*numprocs);
for (ID=0; ID<numprocs; ID++){
R_array[ID] = (int*)malloc(sizeof(int)*3);
}
Snd_OLP_Size = (int*)malloc(sizeof(int)*numprocs);
Rcv_OLP_Size = (int*)malloc(sizeof(int)*numprocs);
/* initialize the temporal array storing the force contribution */
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
Gc_AN = F_M2G[Mc_AN];
Gxyz[Gc_AN][41] = 0.0;
Gxyz[Gc_AN][42] = 0.0;
Gxyz[Gc_AN][43] = 0.0;
}
/*****************************************}**********************
THE FIRST CASE:
In case of I=i or I=j
for d [ \sum_k <i|k>ek<k|j> ]/dRI
****************************************************************/
/*******************************************************
*******************************************************
multiplying overlap integrals WITH COMMUNICATION
In case of I=i or I=j
for d [ \sum_k <i|k>ek<k|j> ]/dRI
*******************************************************
*******************************************************/
MPI_Barrier(mpi_comm_level1);
dtime(&stime);
Hx0 = (dcomplex***)malloc(sizeof(dcomplex**)*3);
for (i=0; i<3; i++){
Hx0[i] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hx0[i][j] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
Hy0 = (dcomplex***)malloc(sizeof(dcomplex**)*3);
for (i=0; i<3; i++){
Hy0[i] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hy0[i][j] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
Hz0 = (dcomplex***)malloc(sizeof(dcomplex**)*3);
for (i=0; i<3; i++){
Hz0[i] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hz0[i][j] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
Hx1 = (dcomplex***)malloc(sizeof(dcomplex**)*3);
for (i=0; i<3; i++){
Hx1[i] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hx1[i][j] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
Hy1 = (dcomplex***)malloc(sizeof(dcomplex**)*3);
for (i=0; i<3; i++){
Hy1[i] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hy1[i][j] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
Hz1 = (dcomplex***)malloc(sizeof(dcomplex**)*3);
for (i=0; i<3; i++){
Hz1[i] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hz1[i][j] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
for (ID=0; ID<numprocs; ID++){
F_Snd_Num_WK[ID] = 0;
F_Rcv_Num_WK[ID] = 0;
}
do {
/***********************************
set the size of data
************************************/
for (ID=0; ID<numprocs; ID++){
IDS = (myid + ID) % numprocs;
IDR = (myid - ID + numprocs) % numprocs;
/* find the data size to send the block data */
if ( 0<(F_Snd_Num[IDS]-F_Snd_Num_WK[IDS]) ){
size1 = 0;
n = F_Snd_Num_WK[IDS];
Mc_AN = Snd_MAN[IDS][n];
Gc_AN = Snd_GAN[IDS][n];
Cwan = WhatSpecies[Gc_AN];
tno1 = Spe_Total_CNO[Cwan];
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
Gh_AN = natn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
tno2 = Spe_Total_CNO[Hwan];
size1 += tno1*tno2;
}
Snd_OLP_Size[IDS] = size1;
MPI_Isend(&size1, 1, MPI_INT, IDS, tag, mpi_comm_level1, &request);
}
else{
Snd_OLP_Size[IDS] = 0;
}
/* receiving of the size of the data */
if ( 0<(F_Rcv_Num[IDR]-F_Rcv_Num_WK[IDR]) ){
MPI_Recv(&size2, 1, MPI_INT, IDR, tag, mpi_comm_level1, &stat);
Rcv_OLP_Size[IDR] = size2;
}
else{
Rcv_OLP_Size[IDR] = 0;
}
if ( 0<(F_Snd_Num[IDS]-F_Snd_Num_WK[IDS]) ) MPI_Wait(&request,&stat);
} /* ID */
/***********************************
data transfer
************************************/
for (ID=0; ID<numprocs; ID++){
IDS = (myid + ID) % numprocs;
IDR = (myid - ID + numprocs) % numprocs;
/******************************
sending of the data
******************************/
if ( 0<(F_Snd_Num[IDS]-F_Snd_Num_WK[IDS]) ){
size1 = Snd_OLP_Size[IDS];
/* allocation of the array */
tmp_array = (double*)malloc(sizeof(double)*size1);
/* multidimentional array to the vector array */
num = 0;
n = F_Snd_Num_WK[IDS];
Mc_AN = Snd_MAN[IDS][n];
Gc_AN = Snd_GAN[IDS][n];
Cwan = WhatSpecies[Gc_AN];
tno1 = Spe_Total_CNO[Cwan];
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
Gh_AN = natn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
tno2 = Spe_Total_CNO[Hwan];
for (i=0; i<tno1; i++){
for (j=0; j<tno2; j++){
tmp_array[num] = OLP_CH[0][Mc_AN][h_AN][i][j];
num++;
}
}
}
MPI_Isend(&tmp_array[0], size1, MPI_DOUBLE, IDS, tag, mpi_comm_level1, &request);
}
/******************************
receiving of the block data
******************************/
if ( 0<(F_Rcv_Num[IDR]-F_Rcv_Num_WK[IDR]) ){
size2 = Rcv_OLP_Size[IDR];
tmp_array2 = (double*)malloc(sizeof(double)*size2);
MPI_Recv(&tmp_array2[0], size2, MPI_DOUBLE, IDR, tag, mpi_comm_level1, &stat);
/* store */
num = 0;
n = F_Rcv_Num_WK[IDR];
Original_Mc_AN = F_TopMAN[IDR] + n;
Gc_AN = Rcv_GAN[IDR][n];
Cwan = WhatSpecies[Gc_AN];
tno1 = Spe_Total_CNO[Cwan];
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
Gh_AN = natn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
tno2 = Spe_Total_CNO[Hwan];
for (i=0; i<tno1; i++){
for (j=0; j<tno2; j++){
OLP_CH[0][Matomnum+1][h_AN][i][j] = tmp_array2[num];
num++;
}
}
}
/* free tmp_array2 */
free(tmp_array2);
/*****************************************************************
multiplying overlap integrals
*****************************************************************/
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
dtime(&Stime_atom);
dEx = 0.0;
dEy = 0.0;
dEz = 0.0;
Gc_AN = M2G[Mc_AN];
Cwan = WhatSpecies[Gc_AN];
fan = FNAN[Gc_AN];
h_AN = 0;
Gh_AN = natn[Gc_AN][h_AN];
Mh_AN = F_G2M[Gh_AN];
Hwan = WhatSpecies[Gh_AN];
ian = Spe_Total_CNO[Hwan];
n = F_Rcv_Num_WK[IDR];
jg = Rcv_GAN[IDR][n];
for (j0=0; j0<=fan; j0++){
jg0 = natn[Gc_AN][j0];
Mj_AN0 = F_G2M[jg0];
po2 = 0;
if (Original_Mc_AN==Mj_AN0){
po2 = 1;
q_AN = j0;
}
if (po2==1){
Gq_AN = natn[Gc_AN][q_AN];
Mq_AN = F_G2M[Gq_AN];
Qwan = WhatSpecies[Gq_AN];
jan = Spe_Total_CNO[Qwan];
kl = RMI1[Mc_AN][h_AN][q_AN];
dHCH(0,Mc_AN,h_AN,q_AN,OLP_CH,Hx0,Hy0,Hz0);
/* contribution of force = Trace(CDM0*dH) */
/* spin non-polarization */
if (SpinP_switch==0){
if (q_AN==h_AN) pref = 2.0;
else pref = 4.0;
for (i=0; i<ian; i++){
for (j=0; j<jan; j++){
dEx += pref*CDM0[0][Mh_AN][kl][i][j]*Hx0[0][i][j].r;
dEy += pref*CDM0[0][Mh_AN][kl][i][j]*Hy0[0][i][j].r;
dEz += pref*CDM0[0][Mh_AN][kl][i][j]*Hz0[0][i][j].r;
}
}
}
/* collinear spin polarized or non-colliear without SO and LDA+U */
else if (SpinP_switch==1 || (SpinP_switch==3 && SO_switch==0 && Hub_U_switch==0
&& Constraint_NCS_switch==0 && Zeeman_NCS_switch==0 && Zeeman_NCO_switch==0)){
if (q_AN==h_AN) pref = 1.0;
else pref = 2.0;
for (i=0; i<Spe_Total_CNO[Hwan]; i++){
for (j=0; j<Spe_Total_CNO[Qwan]; j++){
dEx += pref*( CDM0[0][Mh_AN][kl][i][j]*Hx0[0][i][j].r
+ CDM0[1][Mh_AN][kl][i][j]*Hx0[1][i][j].r);
dEy += pref*( CDM0[0][Mh_AN][kl][i][j]*Hy0[0][i][j].r
+ CDM0[1][Mh_AN][kl][i][j]*Hy0[1][i][j].r);
dEz += pref*( CDM0[0][Mh_AN][kl][i][j]*Hz0[0][i][j].r
+ CDM0[1][Mh_AN][kl][i][j]*Hz0[1][i][j].r);
}
}
}
/* spin non-collinear with spin-orbit coupling or with LDA+U */
else if ( SpinP_switch==3 && (SO_switch==1 || (Hub_U_switch==1 && F_U_flag==1)
|| 1<=Constraint_NCS_switch || Zeeman_NCS_switch==1 || Zeeman_NCO_switch==1)){
if (q_AN==h_AN){
for (i=0; i<Spe_Total_CNO[Hwan]; i++){
for (j=0; j<Spe_Total_CNO[Qwan]; j++){
dEx +=
CDM0[0][Mh_AN][kl][i][j]*Hx0[0][i][j].r
- iDM0[0][Mh_AN][kl][i][j]*Hx0[0][i][j].i
+ CDM0[1][Mh_AN][kl][i][j]*Hx0[1][i][j].r
- iDM0[1][Mh_AN][kl][i][j]*Hx0[1][i][j].i
+ 2.0*CDM0[2][Mh_AN][kl][i][j]*Hx0[2][i][j].r
- 2.0*CDM0[3][Mh_AN][kl][i][j]*Hx0[2][i][j].i;
dEy +=
CDM0[0][Mh_AN][kl][i][j]*Hy0[0][i][j].r
- iDM0[0][Mh_AN][kl][i][j]*Hy0[0][i][j].i
+ CDM0[1][Mh_AN][kl][i][j]*Hy0[1][i][j].r
- iDM0[1][Mh_AN][kl][i][j]*Hy0[1][i][j].i
+ 2.0*CDM0[2][Mh_AN][kl][i][j]*Hy0[2][i][j].r
- 2.0*CDM0[3][Mh_AN][kl][i][j]*Hy0[2][i][j].i;
dEz +=
CDM0[0][Mh_AN][kl][i][j]*Hz0[0][i][j].r
- iDM0[0][Mh_AN][kl][i][j]*Hz0[0][i][j].i
+ CDM0[1][Mh_AN][kl][i][j]*Hz0[1][i][j].r
- iDM0[1][Mh_AN][kl][i][j]*Hz0[1][i][j].i
+ 2.0*CDM0[2][Mh_AN][kl][i][j]*Hz0[2][i][j].r
- 2.0*CDM0[3][Mh_AN][kl][i][j]*Hz0[2][i][j].i;
}
}
}
else {
for (i=0; i<Spe_Total_CNO[Hwan]; i++){ /* Hwan */
for (j=0; j<Spe_Total_CNO[Qwan]; j++){ /* Qwan */
dEx +=
CDM0[0][Mh_AN][kl ][i][j]*Hx0[0][i][j].r
- iDM0[0][Mh_AN][kl ][i][j]*Hx0[0][i][j].i
+ CDM0[1][Mh_AN][kl ][i][j]*Hx0[1][i][j].r
- iDM0[1][Mh_AN][kl ][i][j]*Hx0[1][i][j].i
+ 2.0*CDM0[2][Mh_AN][kl ][i][j]*Hx0[2][i][j].r
- 2.0*CDM0[3][Mh_AN][kl ][i][j]*Hx0[2][i][j].i;
dEy +=
CDM0[0][Mh_AN][kl ][i][j]*Hy0[0][i][j].r
- iDM0[0][Mh_AN][kl ][i][j]*Hy0[0][i][j].i
+ CDM0[1][Mh_AN][kl ][i][j]*Hy0[1][i][j].r
- iDM0[1][Mh_AN][kl ][i][j]*Hy0[1][i][j].i
+ 2.0*CDM0[2][Mh_AN][kl ][i][j]*Hy0[2][i][j].r
- 2.0*CDM0[3][Mh_AN][kl ][i][j]*Hy0[2][i][j].i;
dEz +=
CDM0[0][Mh_AN][kl ][i][j]*Hz0[0][i][j].r
- iDM0[0][Mh_AN][kl ][i][j]*Hz0[0][i][j].i
+ CDM0[1][Mh_AN][kl ][i][j]*Hz0[1][i][j].r
- iDM0[1][Mh_AN][kl ][i][j]*Hz0[1][i][j].i
+ 2.0*CDM0[2][Mh_AN][kl ][i][j]*Hz0[2][i][j].r
- 2.0*CDM0[3][Mh_AN][kl ][i][j]*Hz0[2][i][j].i;
} /* j */
} /* i */
dHCH(0,Mc_AN,q_AN,h_AN,OLP_CH,Hx1,Hy1,Hz1);
kl1 = RMI1[Mc_AN][q_AN][h_AN];
for (i=0; i<Spe_Total_CNO[Qwan]; i++){ /* Qwan */
for (j=0; j<Spe_Total_CNO[Hwan]; j++){ /* Hwan */
dEx +=
CDM0[0][Mq_AN][kl1][i][j]*Hx1[0][i][j].r
- iDM0[0][Mq_AN][kl1][i][j]*Hx1[0][i][j].i
+ CDM0[1][Mq_AN][kl1][i][j]*Hx1[1][i][j].r
- iDM0[1][Mq_AN][kl1][i][j]*Hx1[1][i][j].i
+ 2.0*CDM0[2][Mq_AN][kl1][i][j]*Hx1[2][i][j].r
- 2.0*CDM0[3][Mq_AN][kl1][i][j]*Hx1[2][i][j].i;
dEy +=
CDM0[0][Mq_AN][kl1][i][j]*Hy1[0][i][j].r
- iDM0[0][Mq_AN][kl1][i][j]*Hy1[0][i][j].i
+ CDM0[1][Mq_AN][kl1][i][j]*Hy1[1][i][j].r
- iDM0[1][Mq_AN][kl1][i][j]*Hy1[1][i][j].i
+ 2.0*CDM0[2][Mq_AN][kl1][i][j]*Hy1[2][i][j].r
- 2.0*CDM0[3][Mq_AN][kl1][i][j]*Hy1[2][i][j].i;
dEz +=
CDM0[0][Mq_AN][kl1][i][j]*Hz1[0][i][j].r
- iDM0[0][Mq_AN][kl1][i][j]*Hz1[0][i][j].i
+ CDM0[1][Mq_AN][kl1][i][j]*Hz1[1][i][j].r
- iDM0[1][Mq_AN][kl1][i][j]*Hz1[1][i][j].i
+ 2.0*CDM0[2][Mq_AN][kl1][i][j]*Hz1[2][i][j].r
- 2.0*CDM0[3][Mq_AN][kl1][i][j]*Hz1[2][i][j].i;
} /* j */
} /* i */
}
}
} /* if (po2==1) */
} /* j0 */
/* force from #4B */
Gxyz[Gc_AN][41] += dEx;
Gxyz[Gc_AN][42] += dEy;
Gxyz[Gc_AN][43] += dEz;
/* timing */
dtime(&Etime_atom);
time_per_atom[Gc_AN] += Etime_atom - Stime_atom;
} /* Mc_AN */
/********************************************
increment of F_Rcv_Num_WK[IDR]
********************************************/
F_Rcv_Num_WK[IDR]++;
} /* if ( 0<(F_Snd_Num[IDS]-F_Snd_Num_WK[IDS]) ) */
if ( 0<(F_Snd_Num[IDS]-F_Snd_Num_WK[IDS]) ) {
MPI_Wait(&request,&stat);
free(tmp_array); /* freeing of array */
/********************************************
increment of F_Snd_Num_WK[IDS]
********************************************/
F_Snd_Num_WK[IDS]++;
}
} /* ID */
/*****************************************************
check whether all the communications have finished
*****************************************************/
po = 0;
for (ID=0; ID<numprocs; ID++){
IDS = (myid + ID) % numprocs;
IDR = (myid - ID + numprocs) % numprocs;
if ( 0<(F_Snd_Num[IDS]-F_Snd_Num_WK[IDS]) ) po += F_Snd_Num[IDS]-F_Snd_Num_WK[IDS];
if ( 0<(F_Rcv_Num[IDR]-F_Rcv_Num_WK[IDR]) ) po += F_Rcv_Num[IDR]-F_Rcv_Num_WK[IDR];
}
} while (po!=0);
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hx0[i][j]);
}
free(Hx0[i]);
}
free(Hx0);
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hy0[i][j]);
}
free(Hy0[i]);
}
free(Hy0);
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hz0[i][j]);
}
free(Hz0[i]);
}
free(Hz0);
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hx1[i][j]);
}
free(Hx1[i]);
}
free(Hx1);
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hy1[i][j]);
}
free(Hy1[i]);
}
free(Hy1);
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hz1[i][j]);
}
free(Hz1[i]);
}
free(Hz1);
dtime(&etime);
if(myid==0 && measure_time){
printf("Time for part1 of force_HCH=%18.5f\n",etime-stime);fflush(stdout);
}
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
Gc_AN = M2G[Mc_AN];
if (2<=level_stdout){
printf("<Force> force(HCH1) myid=%2d Mc_AN=%2d Gc_AN=%2d %15.12f %15.12f %15.12f\n",
myid,Mc_AN,Gc_AN,Gxyz[Gc_AN][41],Gxyz[Gc_AN][42],Gxyz[Gc_AN][43]);fflush(stdout);
}
}
/*******************************************************
*******************************************************
THE FIRST CASE:
multiplying overlap integrals WITHOUT COMMUNICATION
In case of I=i or I=j
for d [ \sum_k <i|k>ek<k|j> ]/dRI
*******************************************************
*******************************************************/
dtime(&stime);
#pragma omp parallel shared(time_per_atom,Gxyz,CDM0,SpinP_switch,SO_switch,Hub_U_switch,F_U_flag,Constraint_NCS_switch,Zeeman_NCS_switch,Zeeman_NCO_switch,OLP_CH,RMI1,FNAN,Spe_Total_CNO,WhatSpecies,F_G2M,natn,M2G,Matomnum,List_YOUSO,F_NL_flag) private(Hx0,Hy0,Hz0,Hx1,Hy1,Hz1,OMPID,Nthrds,Nprocs,Mc_AN,Stime_atom,Etime_atom,dEx,dEy,dEz,Gc_AN,h_AN,Gh_AN,Mh_AN,Hwan,ian,q_AN,Gq_AN,Mq_AN,Qwan,jan,kl,kl1,i,j,kk,pref)
{
/* allocation of array */
Hx0 = (dcomplex***)malloc(sizeof(dcomplex**)*3);
for (i=0; i<3; i++){
Hx0[i] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hx0[i][j] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
Hy0 = (dcomplex***)malloc(sizeof(dcomplex**)*3);
for (i=0; i<3; i++){
Hy0[i] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hy0[i][j] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
Hz0 = (dcomplex***)malloc(sizeof(dcomplex**)*3);
for (i=0; i<3; i++){
Hz0[i] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hz0[i][j] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
Hx1 = (dcomplex***)malloc(sizeof(dcomplex**)*3);
for (i=0; i<3; i++){
Hx1[i] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hx1[i][j] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
Hy1 = (dcomplex***)malloc(sizeof(dcomplex**)*3);
for (i=0; i<3; i++){
Hy1[i] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hy1[i][j] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
Hz1 = (dcomplex***)malloc(sizeof(dcomplex**)*3);
for (i=0; i<3; i++){
Hz1[i] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hz1[i][j] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
/* get info. on OpenMP */
OMPID = omp_get_thread_num();
Nthrds = omp_get_num_threads();
Nprocs = omp_get_num_procs();
for (Mc_AN=(OMPID*Matomnum/Nthrds+1); Mc_AN<((OMPID+1)*Matomnum/Nthrds+1); Mc_AN++){
dtime(&Stime_atom);
dEx = 0.0;
dEy = 0.0;
dEz = 0.0;
Gc_AN = M2G[Mc_AN];
h_AN = 0;
Gh_AN = natn[Gc_AN][h_AN];
Mh_AN = F_G2M[Gh_AN];
Hwan = WhatSpecies[Gh_AN];
ian = Spe_Total_CNO[Hwan];
for (q_AN=0; q_AN<=FNAN[Gc_AN]; q_AN++){
Gq_AN = natn[Gc_AN][q_AN];
Mq_AN = F_G2M[Gq_AN];
if (Mq_AN<=Matomnum){
Qwan = WhatSpecies[Gq_AN];
jan = Spe_Total_CNO[Qwan];
kl = RMI1[Mc_AN][h_AN][q_AN];
dHCH(0,Mc_AN,h_AN,q_AN,OLP_CH,Hx0,Hy0,Hz0);
if (SpinP_switch==0){
if (q_AN==h_AN) pref = 2.0;
else pref = 4.0;
for (i=0; i<ian; i++){
for (j=0; j<jan; j++){
dEx += pref*CDM0[0][Mh_AN][kl][i][j]*Hx0[0][i][j].r;
dEy += pref*CDM0[0][Mh_AN][kl][i][j]*Hy0[0][i][j].r;
dEz += pref*CDM0[0][Mh_AN][kl][i][j]*Hz0[0][i][j].r;
}
}
}
/* collinear spin polarized or non-colliear without SO and LDA+U */
else if (SpinP_switch==1 || (SpinP_switch==3 && SO_switch==0 && Hub_U_switch==0
&& Constraint_NCS_switch==0 && Zeeman_NCS_switch==0 && Zeeman_NCO_switch==0)){
if (q_AN==h_AN) pref = 1.0;
else pref = 2.0;
for (i=0; i<ian; i++){
for (j=0; j<jan; j++){
dEx += pref*( CDM0[0][Mh_AN][kl][i][j]*Hx0[0][i][j].r
+ CDM0[1][Mh_AN][kl][i][j]*Hx0[1][i][j].r);
dEy += pref*( CDM0[0][Mh_AN][kl][i][j]*Hy0[0][i][j].r
+ CDM0[1][Mh_AN][kl][i][j]*Hy0[1][i][j].r);
dEz += pref*( CDM0[0][Mh_AN][kl][i][j]*Hz0[0][i][j].r
+ CDM0[1][Mh_AN][kl][i][j]*Hz0[1][i][j].r);
}
}
}
/* spin non-collinear with spin-orbit coupling or with LDA+U */
else if ( SpinP_switch==3 && (SO_switch==1 || (Hub_U_switch==1 && F_U_flag==1)
|| 1<=Constraint_NCS_switch || Zeeman_NCS_switch==1 || Zeeman_NCO_switch==1)){
if (q_AN==h_AN){
for (i=0; i<Spe_Total_CNO[Hwan]; i++){
for (j=0; j<Spe_Total_CNO[Qwan]; j++){
dEx +=
CDM0[0][Mh_AN][kl][i][j]*Hx0[0][i][j].r
- iDM0[0][Mh_AN][kl][i][j]*Hx0[0][i][j].i
+ CDM0[1][Mh_AN][kl][i][j]*Hx0[1][i][j].r
- iDM0[1][Mh_AN][kl][i][j]*Hx0[1][i][j].i
+ 2.0*CDM0[2][Mh_AN][kl][i][j]*Hx0[2][i][j].r
- 2.0*CDM0[3][Mh_AN][kl][i][j]*Hx0[2][i][j].i;
dEy +=
CDM0[0][Mh_AN][kl][i][j]*Hy0[0][i][j].r
- iDM0[0][Mh_AN][kl][i][j]*Hy0[0][i][j].i
+ CDM0[1][Mh_AN][kl][i][j]*Hy0[1][i][j].r
- iDM0[1][Mh_AN][kl][i][j]*Hy0[1][i][j].i
+ 2.0*CDM0[2][Mh_AN][kl][i][j]*Hy0[2][i][j].r
- 2.0*CDM0[3][Mh_AN][kl][i][j]*Hy0[2][i][j].i;
dEz +=
CDM0[0][Mh_AN][kl][i][j]*Hz0[0][i][j].r
- iDM0[0][Mh_AN][kl][i][j]*Hz0[0][i][j].i
+ CDM0[1][Mh_AN][kl][i][j]*Hz0[1][i][j].r
- iDM0[1][Mh_AN][kl][i][j]*Hz0[1][i][j].i
+ 2.0*CDM0[2][Mh_AN][kl][i][j]*Hz0[2][i][j].r
- 2.0*CDM0[3][Mh_AN][kl][i][j]*Hz0[2][i][j].i;
}
}
}
else{
for (i=0; i<Spe_Total_CNO[Hwan]; i++){ /* Hwan */
for (j=0; j<Spe_Total_CNO[Qwan]; j++){ /* Qwan */
dEx +=
CDM0[0][Mh_AN][kl ][i][j]*Hx0[0][i][j].r
- iDM0[0][Mh_AN][kl ][i][j]*Hx0[0][i][j].i
+ CDM0[1][Mh_AN][kl ][i][j]*Hx0[1][i][j].r
- iDM0[1][Mh_AN][kl ][i][j]*Hx0[1][i][j].i
+ 2.0*CDM0[2][Mh_AN][kl ][i][j]*Hx0[2][i][j].r
- 2.0*CDM0[3][Mh_AN][kl ][i][j]*Hx0[2][i][j].i;
dEy +=
CDM0[0][Mh_AN][kl ][i][j]*Hy0[0][i][j].r
- iDM0[0][Mh_AN][kl ][i][j]*Hy0[0][i][j].i
+ CDM0[1][Mh_AN][kl ][i][j]*Hy0[1][i][j].r
- iDM0[1][Mh_AN][kl ][i][j]*Hy0[1][i][j].i
+ 2.0*CDM0[2][Mh_AN][kl ][i][j]*Hy0[2][i][j].r
- 2.0*CDM0[3][Mh_AN][kl ][i][j]*Hy0[2][i][j].i;
dEz +=
CDM0[0][Mh_AN][kl ][i][j]*Hz0[0][i][j].r
- iDM0[0][Mh_AN][kl ][i][j]*Hz0[0][i][j].i
+ CDM0[1][Mh_AN][kl ][i][j]*Hz0[1][i][j].r
- iDM0[1][Mh_AN][kl ][i][j]*Hz0[1][i][j].i
+ 2.0*CDM0[2][Mh_AN][kl ][i][j]*Hz0[2][i][j].r
- 2.0*CDM0[3][Mh_AN][kl ][i][j]*Hz0[2][i][j].i;
} /* j */
} /* i */
dHCH(0,Mc_AN,q_AN,h_AN,OLP_CH,Hx1,Hy1,Hz1);
kl1 = RMI1[Mc_AN][q_AN][h_AN];
for (i=0; i<Spe_Total_CNO[Qwan]; i++){ /* Qwan */
for (j=0; j<Spe_Total_CNO[Hwan]; j++){ /* Hwan */
dEx +=
CDM0[0][Mq_AN][kl1][i][j]*Hx1[0][i][j].r
- iDM0[0][Mq_AN][kl1][i][j]*Hx1[0][i][j].i
+ CDM0[1][Mq_AN][kl1][i][j]*Hx1[1][i][j].r
- iDM0[1][Mq_AN][kl1][i][j]*Hx1[1][i][j].i
+ 2.0*CDM0[2][Mq_AN][kl1][i][j]*Hx1[2][i][j].r
- 2.0*CDM0[3][Mq_AN][kl1][i][j]*Hx1[2][i][j].i;
dEy +=
CDM0[0][Mq_AN][kl1][i][j]*Hy1[0][i][j].r
- iDM0[0][Mq_AN][kl1][i][j]*Hy1[0][i][j].i
+ CDM0[1][Mq_AN][kl1][i][j]*Hy1[1][i][j].r
- iDM0[1][Mq_AN][kl1][i][j]*Hy1[1][i][j].i
+ 2.0*CDM0[2][Mq_AN][kl1][i][j]*Hy1[2][i][j].r
- 2.0*CDM0[3][Mq_AN][kl1][i][j]*Hy1[2][i][j].i;
dEz +=
CDM0[0][Mq_AN][kl1][i][j]*Hz1[0][i][j].r
- iDM0[0][Mq_AN][kl1][i][j]*Hz1[0][i][j].i
+ CDM0[1][Mq_AN][kl1][i][j]*Hz1[1][i][j].r
- iDM0[1][Mq_AN][kl1][i][j]*Hz1[1][i][j].i
+ 2.0*CDM0[2][Mq_AN][kl1][i][j]*Hz1[2][i][j].r
- 2.0*CDM0[3][Mq_AN][kl1][i][j]*Hz1[2][i][j].i;
} /* j */
} /* i */
}
}
}
}
/* force from #4B */
if (F_NL_flag==1){
Gxyz[Gc_AN][41] += dEx;
Gxyz[Gc_AN][42] += dEy;
Gxyz[Gc_AN][43] += dEz;
}
/* timing */
dtime(&Etime_atom);
time_per_atom[Gc_AN] += Etime_atom - Stime_atom;
} /* Mc_AN */
/* freeing of array */
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hx0[i][j]);
}
free(Hx0[i]);
}
free(Hx0);
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hy0[i][j]);
}
free(Hy0[i]);
}
free(Hy0);
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hz0[i][j]);
}
free(Hz0[i]);
}
free(Hz0);
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hx1[i][j]);
}
free(Hx1[i]);
}
free(Hx1);
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hy1[i][j]);
}
free(Hy1[i]);
}
free(Hy1);
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hz1[i][j]);
}
free(Hz1[i]);
}
free(Hz1);
} /* #pragma omp parallel */
dtime(&etime);
if(myid==0 && measure_time){
printf("Time for part2 of force_HCH=%18.5f\n",etime-stime);fflush(stdout);
}
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
Gc_AN = M2G[Mc_AN];
if (2<=level_stdout){
printf("<Force> force(HCH2) myid=%2d Mc_AN=%2d Gc_AN=%2d %15.12f %15.12f %15.12f\n",
myid,Mc_AN,Gc_AN,Gxyz[Gc_AN][41],Gxyz[Gc_AN][42],Gxyz[Gc_AN][43]);fflush(stdout);
}
}
/*************************************************************
THE SECOND CASE:
In case of I=k with I!=i and I!=j
d [ \sum_k <i|k>ek<k|j> ]/dRI
*************************************************************/
/************************************************************
MPI communication of OLP_CH whose basis part is not located
on own site but projector part is located on own site.
************************************************************/
MPI_Barrier(mpi_comm_level1);
dtime(&stime);
for (ID=0; ID<numprocs; ID++) Indicator[ID] = 0;
for (Mc_AN=1; Mc_AN<=Max_Matomnum; Mc_AN++){
if (Mc_AN<=Matomnum) Gc_AN = M2G[Mc_AN];
else Gc_AN = 0;
for (ID=0; ID<numprocs; ID++){
IDS = (myid + ID) % numprocs;
IDR = (myid - ID + numprocs) % numprocs;
i = Indicator[IDS];
po = 0;
Gh_AN = Pro_Snd_GAtom[IDS][i];
if (Gh_AN!=0){
/* find the range with the same global atomic number */
do {
i++;
if (Gh_AN!=Pro_Snd_GAtom[IDS][i]) po = 1;
} while(po==0);
i--;
SA_num = i - Indicator[IDS] + 1;
/* find the data size to send the block data */
size1 = 0;
for (q=Indicator[IDS]; q<=(Indicator[IDS]+SA_num-1); q++){
Sc_AN = Pro_Snd_MAtom[IDS][q];
GSc_AN = F_M2G[Sc_AN];
Sc_wan = WhatSpecies[GSc_AN];
tno1 = Spe_Total_CNO[Sc_wan];
Sh_AN = Pro_Snd_LAtom[IDS][q];
GSh_AN = natn[GSc_AN][Sh_AN];
Sh_wan = WhatSpecies[GSh_AN];
tno2 = Spe_Total_CNO[Sh_wan];
size1 += 4*tno1*tno2;
size1 += 3;
}
} /* if (Gh_AN!=0) */
else {
SA_num = 0;
size1 = 0;
}
S_array[IDS][0] = Gh_AN;
S_array[IDS][1] = SA_num;
S_array[IDS][2] = size1;
if (ID!=0){
MPI_Isend(&S_array[IDS][0], 3, MPI_INT, IDS, tag, mpi_comm_level1, &request);
MPI_Recv( &R_array[IDR][0], 3, MPI_INT, IDR, tag, mpi_comm_level1, &stat);
MPI_Wait(&request,&stat);
}
else {
R_array[myid][0] = S_array[myid][0];
R_array[myid][1] = S_array[myid][1];
R_array[myid][2] = S_array[myid][2];
}
if (R_array[IDR][0]==Gc_AN) R_comm_flag = 1;
else R_comm_flag = 0;
if (ID!=0){
MPI_Isend(&R_comm_flag, 1, MPI_INT, IDR, tag, mpi_comm_level1, &request);
MPI_Recv( &S_comm_flag, 1, MPI_INT, IDS, tag, mpi_comm_level1, &stat);
MPI_Wait(&request,&stat);
}
else{
S_comm_flag = R_comm_flag;
}
/*****************************************
send the data
*****************************************/
/* if (S_comm_flag==1) then, send data to IDS */
if (S_comm_flag==1){
/* allocate tmp_array */
tmp_array = (double*)malloc(sizeof(double)*size1);
/* multidimentional array to vector array */
num = 0;
for (q=Indicator[IDS]; q<=(Indicator[IDS]+SA_num-1); q++){
Sc_AN = Pro_Snd_MAtom[IDS][q];
GSc_AN = F_M2G[Sc_AN];
Sc_wan = WhatSpecies[GSc_AN];
tno1 = Spe_Total_CNO[Sc_wan];
Sh_AN = Pro_Snd_LAtom[IDS][q];
GSh_AN = natn[GSc_AN][Sh_AN];
Sh_wan = WhatSpecies[GSh_AN];
tno2 = Spe_Total_CNO[Sh_wan];
Sh_AN2 = Pro_Snd_LAtom2[IDS][q];
tmp_array[num] = (double)Sc_AN; num++;
tmp_array[num] = (double)Sh_AN; num++;
tmp_array[num] = (double)Sh_AN2; num++;
for (kk=0; kk<=3; kk++){
for (i=0; i<tno1; i++){
for (j=0; j<tno2; j++){
tmp_array[num] = OLP_CH[kk][Sc_AN][Sh_AN][i][j];
num++;
}
}
}
}
if (ID!=0){
MPI_Isend(&tmp_array[0], size1, MPI_DOUBLE, IDS, tag, mpi_comm_level1, &request);
}
/* update Indicator[IDS] */
Indicator[IDS] += SA_num;
} /* if (S_comm_flag==1) */
/*****************************************
receiving the data
*****************************************/
/* if (R_comm_flag==1) then, receive the data from IDR */
if (R_comm_flag==1){
size2 = R_array[IDR][2];
tmp_array2 = (double*)malloc(sizeof(double)*size2);
if (ID!=0){
MPI_Recv(&tmp_array2[0], size2, MPI_DOUBLE, IDR, tag, mpi_comm_level1, &stat);
}
else{
for (i=0; i<size2; i++) tmp_array2[i] = tmp_array[i];
}
/* store */
num = 0;
for (n=0; n<R_array[IDR][1]; n++){
Sc_AN = (int)tmp_array2[num]; num++;
Sh_AN = (int)tmp_array2[num]; num++;
Sh_AN2 = (int)tmp_array2[num]; num++;
GSc_AN = natn[Gc_AN][Sh_AN2];
Sc_wan = WhatSpecies[GSc_AN];
tno1 = Spe_Total_CNO[Sc_wan];
GSh_AN = natn[GSc_AN][Sh_AN];
Sh_wan = WhatSpecies[GSh_AN];
tno2 = Spe_Total_CNO[Sh_wan];
for (kk=0; kk<=3; kk++){
for (i=0; i<tno1; i++){
for (j=0; j<tno2; j++){
OLP_CH[kk][Matomnum+1][Sh_AN2][i][j] = tmp_array2[num];
num++;
}
}
}
}
/* free tmp_array2 */
free(tmp_array2);
} /* if (R_comm_flag==1) */
if (S_comm_flag==1){
if (ID!=0) MPI_Wait(&request,&stat);
free(tmp_array); /* freeing of array */
}
} /* ID */
if (Mc_AN<=Matomnum){
/* get Nthrds0 */
#pragma omp parallel shared(Nthrds0)
{
Nthrds0 = omp_get_num_threads();
}
/* allocation of arrays */
dEx_threads = (double*)malloc(sizeof(double)*Nthrds0);
dEy_threads = (double*)malloc(sizeof(double)*Nthrds0);
dEz_threads = (double*)malloc(sizeof(double)*Nthrds0);
for (Nloop=0; Nloop<Nthrds0; Nloop++){
dEx_threads[Nloop] = 0.0;
dEy_threads[Nloop] = 0.0;
dEz_threads[Nloop] = 0.0;
}
/* one-dimensionalize the h_AN and q_AN loops */
OneD2h_AN = (int*)malloc(sizeof(int)*(FNAN[Gc_AN]+1)*(FNAN[Gc_AN]+2));
OneD2q_AN = (int*)malloc(sizeof(int)*(FNAN[Gc_AN]+1)*(FNAN[Gc_AN]+2));
ODNloop = 0;
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
if ( SpinP_switch==3 && (SO_switch==1 || (Hub_U_switch==1 && F_U_flag==1)
|| 1<=Constraint_NCS_switch || Zeeman_NCS_switch==1 || Zeeman_NCO_switch==1)
|| (Solver==5 || Solver==8 || Solver==11) )
start_q_AN = 0;
else
start_q_AN = h_AN;
for (q_AN=start_q_AN; q_AN<=FNAN[Gc_AN]; q_AN++){
kl = RMI1[Mc_AN][h_AN][q_AN];
if (0<=kl){
OneD2h_AN[ODNloop] = h_AN;
OneD2q_AN[ODNloop] = q_AN;
ODNloop++;
}
}
}
#pragma omp parallel shared(ODNloop,OneD2h_AN,OneD2q_AN,Mc_AN,Gc_AN,dEx_threads,dEy_threads,dEz_threads,CDM0,SpinP_switch,SO_switch,Hub_U_switch,Constraint_NCS_switch,Zeeman_NCS_switch,Zeeman_NCO_switch,OLP_CH,RMI1,Spe_Total_CNO,WhatSpecies,F_G2M,natn,FNAN,List_YOUSO,Solver,F_NL_flag,F_U_flag) private(OMPID,Nthrds,Nprocs,Hx,Hy,Hz,i,j,h_AN,Gh_AN,Mh_AN,Hwan,ian,q_AN,Gq_AN,Mq_AN,Qwan,jan,kl,km,Nloop,pref)
{
/* allocation of arrays */
Hx = (dcomplex***)malloc(sizeof(dcomplex**)*3);
for (i=0; i<3; i++){
Hx[i] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hx[i][j] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
Hy = (dcomplex***)malloc(sizeof(dcomplex**)*3);
for (i=0; i<3; i++){
Hy[i] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hy[i][j] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
Hz = (dcomplex***)malloc(sizeof(dcomplex**)*3);
for (i=0; i<3; i++){
Hz[i] = (dcomplex**)malloc(sizeof(dcomplex*)*List_YOUSO[7]);
for (j=0; j<List_YOUSO[7]; j++){
Hz[i][j] = (dcomplex*)malloc(sizeof(dcomplex)*List_YOUSO[7]);
}
}
/* get info. on OpenMP */
OMPID = omp_get_thread_num();
Nthrds = omp_get_num_threads();
Nprocs = omp_get_num_procs();
for (Nloop=OMPID*ODNloop/Nthrds; Nloop<(OMPID+1)*ODNloop/Nthrds; Nloop++){
/* get h_AN and q_AN */
h_AN = OneD2h_AN[Nloop];
q_AN = OneD2q_AN[Nloop];
/* set informations on h_AN */
Gh_AN = natn[Gc_AN][h_AN];
Mh_AN = F_G2M[Gh_AN];
Hwan = WhatSpecies[Gh_AN];
ian = Spe_Total_CNO[Hwan];
/* set informations on q_AN */
Gq_AN = natn[Gc_AN][q_AN];
Mq_AN = F_G2M[Gq_AN];
Qwan = WhatSpecies[Gq_AN];
jan = Spe_Total_CNO[Qwan];
kl = RMI1[Mc_AN][h_AN][q_AN];
km = RMI1[Mc_AN][q_AN][h_AN];
if (0<=kl){
dHCH(1,Mc_AN,h_AN,q_AN,OLP_CH,Hx,Hy,Hz);
/* contribution of force = Trace(CDM0*dH) */
/* spin non-polarization */
if (SpinP_switch==0){
if (Solver==5 || Solver==8 || Solver==11){
pref = 2.0;
}
else {
if (q_AN==h_AN) pref = 2.0;
else pref = 4.0;
}
for (i=0; i<ian; i++){
for (j=0; j<jan; j++){
dEx_threads[OMPID] += pref*CDM0[0][Mh_AN][kl][i][j]*Hx[0][i][j].r;
dEy_threads[OMPID] += pref*CDM0[0][Mh_AN][kl][i][j]*Hy[0][i][j].r;
dEz_threads[OMPID] += pref*CDM0[0][Mh_AN][kl][i][j]*Hz[0][i][j].r;
}
}
}
/* collinear spin polarized or non-colliear without SO and LDA+U */
else if (SpinP_switch==1 || (SpinP_switch==3 && SO_switch==0 && Hub_U_switch==0
&& Constraint_NCS_switch==0 && Zeeman_NCS_switch==0 && Zeeman_NCO_switch==0)){
if (Solver==5 || Solver==8 || Solver==11){
pref = 1.0;
}
else {
if (q_AN==h_AN) pref = 1.0;
else pref = 2.0;
}
for (i=0; i<ian; i++){
for (j=0; j<jan; j++){
dEx_threads[OMPID] += pref*( CDM0[0][Mh_AN][kl][i][j]*Hx[0][i][j].r
+ CDM0[1][Mh_AN][kl][i][j]*Hx[1][i][j].r);
dEy_threads[OMPID] += pref*( CDM0[0][Mh_AN][kl][i][j]*Hy[0][i][j].r
+ CDM0[1][Mh_AN][kl][i][j]*Hy[1][i][j].r);
dEz_threads[OMPID] += pref*( CDM0[0][Mh_AN][kl][i][j]*Hz[0][i][j].r
+ CDM0[1][Mh_AN][kl][i][j]*Hz[1][i][j].r);
}
}
}
/* spin non-collinear with spin-orbit coupling or with LDA+U */
else if ( SpinP_switch==3 && (SO_switch==1 || (Hub_U_switch==1 && F_U_flag==1)
|| 1<=Constraint_NCS_switch || Zeeman_NCS_switch==1 || Zeeman_NCO_switch==1)){
pref = 1.0;
for (i=0; i<ian; i++){
for (j=0; j<jan; j++){
dEx_threads[OMPID] +=
pref*(CDM0[0][Mh_AN][kl][i][j]*Hx[0][i][j].r
- iDM0[0][Mh_AN][kl][i][j]*Hx[0][i][j].i
+ CDM0[1][Mh_AN][kl][i][j]*Hx[1][i][j].r
- iDM0[1][Mh_AN][kl][i][j]*Hx[1][i][j].i
+ 2.0*CDM0[2][Mh_AN][kl][i][j]*Hx[2][i][j].r
- 2.0*CDM0[3][Mh_AN][kl][i][j]*Hx[2][i][j].i);
dEy_threads[OMPID] +=
pref*(CDM0[0][Mh_AN][kl][i][j]*Hy[0][i][j].r
- iDM0[0][Mh_AN][kl][i][j]*Hy[0][i][j].i
+ CDM0[1][Mh_AN][kl][i][j]*Hy[1][i][j].r
- iDM0[1][Mh_AN][kl][i][j]*Hy[1][i][j].i
+ 2.0*CDM0[2][Mh_AN][kl][i][j]*Hy[2][i][j].r
- 2.0*CDM0[3][Mh_AN][kl][i][j]*Hy[2][i][j].i);
dEz_threads[OMPID] +=
pref*(CDM0[0][Mh_AN][kl][i][j]*Hz[0][i][j].r
- iDM0[0][Mh_AN][kl][i][j]*Hz[0][i][j].i
+ CDM0[1][Mh_AN][kl][i][j]*Hz[1][i][j].r
- iDM0[1][Mh_AN][kl][i][j]*Hz[1][i][j].i
+ 2.0*CDM0[2][Mh_AN][kl][i][j]*Hz[2][i][j].r
- 2.0*CDM0[3][Mh_AN][kl][i][j]*Hz[2][i][j].i);
}
}
}
} /* if (0<=kl) */
} /* Nloop */
/* freeing of arrays */
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hx[i][j]);
}
free(Hx[i]);
}
free(Hx);
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hy[i][j]);
}
free(Hy[i]);
}
free(Hy);
for (i=0; i<3; i++){
for (j=0; j<List_YOUSO[7]; j++){
free(Hz[i][j]);
}
free(Hz[i]);
}
free(Hz);
} /* #pragma omp parallel */
/* sum of dEx_threads */
dEx = 0.0;
dEy = 0.0;
dEz = 0.0;
if (F_NL_flag==1){
for (Nloop=0; Nloop<Nthrds0; Nloop++){
dEx += dEx_threads[Nloop];
dEy += dEy_threads[Nloop];
dEz += dEz_threads[Nloop];
}
/* force from #4B */
Gxyz[Gc_AN][41] += dEx;
Gxyz[Gc_AN][42] += dEy;
Gxyz[Gc_AN][43] += dEz;
}
if (2<=level_stdout){
printf("<Force> force(HCH3) myid=%2d Mc_AN=%2d Gc_AN=%2d %15.12f %15.12f %15.12f\n",
myid,Mc_AN,Gc_AN,dEx,dEy,dEz);fflush(stdout);
}
/* freeing of array */
free(OneD2q_AN);
free(OneD2h_AN);
free(dEx_threads);
free(dEy_threads);
free(dEz_threads);
} /* if (Mc_AN<=Matomnum) */
} /* Mc_AN */
dtime(&etime);
if(myid==0 && measure_time){
printf("Time for part3 of force_NL=%18.5f\n",etime-stime);fflush(stdout);
}
/********************************************************
adding Gxyz[Gc_AN][41,42,43] to Gxyz[Gc_AN][17,18,19]
********************************************************/
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
Gc_AN = M2G[Mc_AN];
if (2<=level_stdout){
printf("<Force> force(HCH) myid=%2d Mc_AN=%2d Gc_AN=%2d %15.12f %15.12f %15.12f\n",
myid,Mc_AN,Gc_AN,Gxyz[Gc_AN][41],Gxyz[Gc_AN][42],Gxyz[Gc_AN][43]);fflush(stdout);
}
Gxyz[Gc_AN][17] += Gxyz[Gc_AN][41];
Gxyz[Gc_AN][18] += Gxyz[Gc_AN][42];
Gxyz[Gc_AN][19] += Gxyz[Gc_AN][43];
}
/***********************************
freeing of arrays
************************************/
free(Indicator);
for (ID=0; ID<numprocs; ID++){
free(S_array[ID]);
}
free(S_array);
for (ID=0; ID<numprocs; ID++){
free(R_array[ID]);
}
free(R_array);
free(Snd_OLP_Size);
free(Rcv_OLP_Size);
}
/**********************************************************************
Total_Energy.c:
Total_Energy.c is a subrutine to calculate the total energy
Log of Total_Energy.c:
22/Nov/2001 Released by T. Ozaki
19/Feb/2006 The subroutine name 'Correction_Energy' was changed
to 'Total_Energy'
2/Dec./2020 Modified by N. Yamaguchi for a correction
about sawtooth potential for electric fields
***********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include "openmx_common.h"
#include "mpi.h"
#include <omp.h>
#define measure_time 0
#define Num_Leb_Grid 590
static double Calc_Ecore();
static double Calc_EH0(int MD_iter);
static double Calc_Ekin();
static double Calc_Ena();
static double Calc_Enl();
static double Calc_ECH();
static void Calc_EXC_EH1(double ECE[],double *****CDM);
static double Calc_Ehub(); /* --- added by MJ */
static double Calc_EdftD(); /* added by okuno */
static double Calc_EdftD3(); /* added by Ellner */
static void EH0_TwoCenter(int Gc_AN, int h_AN, double VH0ij[4]);
static void EH0_TwoCenter_at_Cutoff(int wan1, int wan2, double VH0ij[4]);
static void Set_Lebedev_Grid();
static void Energy_Decomposition(double ECE[]);
double Leb_Grid_XYZW[Num_Leb_Grid][4];
/* for OpenMP */
int OneD_Nloop,*OneD2Mc_AN,*OneD2h_AN;
double Total_Energy(int MD_iter, double *****CDM, double ECE[])
{
double time0;
double TStime,TEtime;
int numprocs,myid;
int Mc_AN,Gc_AN,h_AN;
double stime,etime;
/* MPI */
MPI_Comm_size(mpi_comm_level1,&numprocs);
MPI_Comm_rank(mpi_comm_level1,&myid);
dtime(&TStime);
/****************************************************
For OpenMP:
making of arrays of the one-dimensionalized loop
****************************************************/
OneD_Nloop = 0;
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
Gc_AN = M2G[Mc_AN];
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
OneD_Nloop++;
}
}
OneD2Mc_AN = (int*)malloc(sizeof(int)*(OneD_Nloop+1));
OneD2h_AN = (int*)malloc(sizeof(int)*(OneD_Nloop+1));
OneD_Nloop = 0;
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
Gc_AN = M2G[Mc_AN];
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
OneD2Mc_AN[OneD_Nloop] = Mc_AN;
OneD2h_AN[OneD_Nloop] = h_AN;
OneD_Nloop++;
}
}
/****************************************************
core-core repulsion energy
****************************************************/
dtime(&stime);
ECE[0] = Calc_Ecore();
dtime(&etime);
if(myid==0 && measure_time){
printf("Time for Ecore=%18.5f\n",etime-stime);fflush(stdout);
}
/****************************************************
EH0 = -1/2\int n^a(r) V^a_H dr
****************************************************/
dtime(&stime);
ECE[1] = Calc_EH0(MD_iter);
dtime(&etime);
if(myid==0 && measure_time){
printf("Time for EH0=%18.5f\n",etime-stime);fflush(stdout);
}
/****************************************************
kinetic energy
****************************************************/
dtime(&stime);
if (F_Kin_flag==1) ECE[2] = Calc_Ekin();
dtime(&etime);
if(myid==0 && measure_time){
printf("Time for Ekin=%18.5f\n",etime-stime);fflush(stdout);
}
/****************************************************
neutral atom potential energy
****************************************************/
dtime(&stime);
if (F_VNA_flag==1 && ProExpn_VNA==1) ECE[3] = Calc_Ena();
dtime(&etime);
if(myid==0 && measure_time){
printf("Time for Ena=%18.5f\n",etime-stime);fflush(stdout);
}
/****************************************************
non-local pseudo potential energy
****************************************************/
dtime(&stime);
if (F_NL_flag==1) ECE[4] = Calc_Enl();
dtime(&etime);
if(myid==0 && measure_time){
printf("Time for Enl=%18.5f\n",etime-stime);fflush(stdout);
}
/****************************************************
The penalty term to create a core hole
****************************************************/
dtime(&stime);
if (core_hole_state_flag==1 && F_CH_flag==1){
ECE[14] = Calc_ECH();
}
dtime(&etime);
if(myid==0 && measure_time){
printf("Time for ECH=%18.5f\n",etime-stime);fflush(stdout);
}
/****************************************************
EXC = \sum_{\sigma} (n_{\sigma}(r)+n_pcc(r)\epsilon_{xc}
EH1 = 1/2\int {n(r)-n_a(r)} \delta V_H(r) dr
if (ProExpn_VNA==0) Ena = \int n(r) Vna(r) dr
****************************************************/
dtime(&stime);
Calc_EXC_EH1(ECE,CDM);
dtime(&etime);
if(myid==0 && measure_time){
printf("Time for EXC_EH1=%18.5f\n",etime-stime);fflush(stdout);
}
/****************************************************
LDA+U energy --- added by MJ
****************************************************/
if (F_U_flag==1){
if (Hub_U_switch==1) ECE[8] = Calc_Ehub();
else ECE[8] = 0.0;
}
/*********************************************************
DFT-D2 and D3 by Grimme (implemented by Okuno and Ellner)
*********************************************************/
if(F_dftD_flag==1){
if(dftD_switch==1){
if(version_dftD==2) ECE[13] = Calc_EdftD();
if(version_dftD==3) ECE[13] = Calc_EdftD3();
}
else ECE[13] = 0.0;
}
/****************************************************
Stress coming from volume terms
ECE[3]; Una
ECE[5]; UH1
The volume term coming from Exc is added in
Calc_EXC_EH1
****************************************************/
if (scf_stress_flag){
if (ProExpn_VNA==0){
double s3,s5;
s3 = (double)F_VNA_flag*ECE[3];
s5 = (double)F_dVHart_flag*ECE[5];
Stress_Tensor[0] += s3 + s5;
Stress_Tensor[4] += s3 + s5;
Stress_Tensor[8] += s3 + s5;
}
else{
double s5;
s5 = (double)F_dVHart_flag*ECE[5];
Stress_Tensor[0] += s5;
Stress_Tensor[4] += s5;
Stress_Tensor[8] += s5;
}
{
int i,j;
double tmp;
/* symmetrization of stress tensor */
for (i=0; i<3; i++){
for (j=(i+1); j<3; j++){
tmp = 0.5*(Stress_Tensor[3*i+j]+Stress_Tensor[3*j+i]);
Stress_Tensor[3*i+j] = tmp;
Stress_Tensor[3*j+i] = tmp;
}
}
/* show the stress tensor including all the contributions */
if (myid==Host_ID && 0<level_stdout){
printf("\n*******************************************************\n"); fflush(stdout);
printf(" Stress tensor (Hartree/bohr^3) \n"); fflush(stdout);
printf("*******************************************************\n\n"); fflush(stdout);
for (i=0; i<3; i++){
for (j=0; j<3; j++){
printf("%17.8f ", Stress_Tensor[3*i+j]/Cell_Volume);
}
printf("\n");fflush(stdout);
}
}
}
}
/*********************************************************
decomposition of total energy
*********************************************************/
if (Energy_Decomposition_flag==1){
Energy_Decomposition(ECE);
}
/****************************************************
freeing of arrays
****************************************************/
free(OneD2Mc_AN);
free(OneD2h_AN);
/* computational time */
dtime(&TEtime);
time0 = TEtime - TStime;
return time0;
}
double Calc_Ekin()
{
/****************************************************
calculate the kinetic energy, Ekin
****************************************************/
int i,j,spin,spinmax;
int Mc_AN,Gc_AN,Cwan,Rn,h_AN,Gh_AN,Hwan;
double My_Ekin,Ekin,Zc,Zh,dum,dum2;
int numprocs,myid;
double Stime_atom, Etime_atom;
double *My_Ekin_threads;
/* for OpenMP */
int OMPID,Nthrds,Nthrds0,Nprocs,Nloop;
/* MPI */
MPI_Comm_size(mpi_comm_level1,&numprocs);
MPI_Comm_rank(mpi_comm_level1,&myid);
/****************************************************
conventional calculation of kinetic energy
****************************************************/
/* get Nthrds0 */
#pragma omp parallel shared(Nthrds0)
{
Nthrds0 = omp_get_num_threads();
}
/* allocation of array */
My_Ekin_threads = (double*)malloc(sizeof(double)*Nthrds0);
for (Nloop=0; Nloop<Nthrds0; Nloop++) My_Ekin_threads[Nloop] = 0.0;
if (SpinP_switch==0 || SpinP_switch==1){
for (spin=0; spin<=SpinP_switch; spin++){
#pragma omp parallel shared(SpinP_switch,time_per_atom,spin,CntH0,H0,DM,My_Ekin_threads,Spe_Total_CNO,Cnt_switch,natn,WhatSpecies,M2G,OneD2h_AN,OneD2Mc_AN,OneD_Nloop) private(OMPID,Nthrds,Nprocs,Nloop,Stime_atom,Mc_AN,h_AN,Gc_AN,Cwan,Gh_AN,Hwan,i,j,Etime_atom)
{
/* get info. on OpenMP */
OMPID = omp_get_thread_num();
Nthrds = omp_get_num_threads();
Nprocs = omp_get_num_procs();
/* one-dimensionalized loop */
for (Nloop=OMPID*OneD_Nloop/Nthrds; Nloop<(OMPID+1)*OneD_Nloop/Nthrds; Nloop++){
dtime(&Stime_atom);
/* get Mc_AN and h_AN */
Mc_AN = OneD2Mc_AN[Nloop];
h_AN = OneD2h_AN[Nloop];
/* set data on Mc_AN */
Gc_AN = M2G[Mc_AN];
Cwan = WhatSpecies[Gc_AN];
/* set data on h_AN */
Gh_AN = natn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
if (Cnt_switch==0){
for (i=0; i<Spe_Total_CNO[Cwan]; i++){
for (j=0; j<Spe_Total_CNO[Hwan]; j++){
My_Ekin_threads[OMPID] += DM[0][spin][Mc_AN][h_AN][i][j]*H0[0][Mc_AN][h_AN][i][j];
}
}
}
else{
for (i=0; i<Spe_Total_CNO[Cwan]; i++){
for (j=0; j<Spe_Total_CNO[Hwan]; j++){
My_Ekin_threads[OMPID] += DM[0][spin][Mc_AN][h_AN][i][j]*CntH0[0][Mc_AN][h_AN][i][j];
}
}
}
dtime(&Etime_atom);
time_per_atom[Gc_AN] += Etime_atom - Stime_atom;
}
if (SpinP_switch==0) My_Ekin_threads[OMPID] = 2.0*My_Ekin_threads[OMPID];
} /* #pragma omp parallel */
} /* spin */
}
else if (SpinP_switch==3){
#pragma omp parallel shared(time_per_atom,H0,DM,My_Ekin_threads,Spe_Total_CNO,natn,WhatSpecies,M2G,OneD2h_AN,OneD2Mc_AN,OneD_Nloop) private(OMPID,Nthrds,Nprocs,Nloop,Stime_atom,Mc_AN,Gc_AN,Cwan,h_AN,Gh_AN,Hwan,i,j,Etime_atom)
{
/* get info. on OpenMP */
OMPID = omp_get_thread_num();
Nthrds = omp_get_num_threads();
Nprocs = omp_get_num_procs();
/* one-dimensionalized loop */
for (Nloop=OMPID*OneD_Nloop/Nthrds; Nloop<(OMPID+1)*OneD_Nloop/Nthrds; Nloop++){
dtime(&Stime_atom);
/* get Mc_AN and h_AN */
Mc_AN = OneD2Mc_AN[Nloop];
h_AN = OneD2h_AN[Nloop];
/* set data on Mc_AN */
Gc_AN = M2G[Mc_AN];
Cwan = WhatSpecies[Gc_AN];
/* set data on h_AN */
Gh_AN = natn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
for (i=0; i<Spe_Total_CNO[Cwan]; i++){
for (j=0; j<Spe_Total_CNO[Hwan]; j++){
My_Ekin_threads[OMPID] += (DM[0][0][Mc_AN][h_AN][i][j] + DM[0][1][Mc_AN][h_AN][i][j])*H0[0][Mc_AN][h_AN][i][j];
}
}
dtime(&Etime_atom);
time_per_atom[Gc_AN] += Etime_atom - Stime_atom;
}
} /* #pragma omp parallel */
}
/* sum of My_Ekin_threads */
My_Ekin = 0.0;
for (Nloop=0; Nloop<Nthrds0; Nloop++){
My_Ekin += My_Ekin_threads[Nloop];
}
/* sum of My_Ekin */
MPI_Allreduce(&My_Ekin, &Ekin, 1, MPI_DOUBLE, MPI_SUM, mpi_comm_level1);
/* freeing of array */
free(My_Ekin_threads);
/****************************************************
return Ekin
****************************************************/
return Ekin;
}
double Calc_Ena()
{
/****************************************************
calculate the neutral atom potential energy, Ena
****************************************************/
int i,j,spin,spinmax;
int Mc_AN,Gc_AN,Cwan,Rn,h_AN,Gh_AN,Hwan;
double My_Ena,Ena,Zc,Zh,dum,dum2;
int numprocs,myid;
double Stime_atom, Etime_atom;
double *My_Ena_threads;
/* for OpenMP */
int OMPID,Nthrds,Nthrds0,Nprocs,Nloop;
/* MPI */
MPI_Comm_size(mpi_comm_level1,&numprocs);
MPI_Comm_rank(mpi_comm_level1,&myid);
/**********************************************************
conventional calculation of neutral atom potential energy
**********************************************************/
/* get Nthrds0 */
#pragma omp parallel shared(Nthrds0)
{
Nthrds0 = omp_get_num_threads();
}
/* allocation of array */
My_Ena_threads = (double*)malloc(sizeof(double)*Nthrds0);
for (Nloop=0; Nloop<Nthrds0; Nloop++) My_Ena_threads[Nloop] = 0.0;
if (SpinP_switch==0 || SpinP_switch==1){
if (Cnt_switch==1){
/* temporaly, we borrow the CntH0 matrix */
Cont_Matrix0(HVNA,CntH0[0]);
}
for (spin=0; spin<=SpinP_switch; spin++){
#pragma omp parallel shared(spin,SpinP_switch,time_per_atom,CntH0,HVNA,DM,My_Ena_threads,Spe_Total_CNO,Cnt_switch,natn,WhatSpecies,M2G,OneD2h_AN,OneD2Mc_AN,OneD_Nloop) private(OMPID,Nthrds,Nprocs,Nloop,Stime_atom,Mc_AN,h_AN,Gc_AN,Cwan,Gh_AN,Hwan,i,j,Etime_atom)
{
/* get info. on OpenMP */
OMPID = omp_get_thread_num();
Nthrds = omp_get_num_threads();
Nprocs = omp_get_num_procs();
/* one-dimensionalized loop */
for (Nloop=OMPID*OneD_Nloop/Nthrds; Nloop<(OMPID+1)*OneD_Nloop/Nthrds; Nloop++){
dtime(&Stime_atom);
/* get Mc_AN and h_AN */
Mc_AN = OneD2Mc_AN[Nloop];
h_AN = OneD2h_AN[Nloop];
/* set data on Mc_AN */
Gc_AN = M2G[Mc_AN];
Cwan = WhatSpecies[Gc_AN];
/* set data on h_AN */
Gh_AN = natn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
if (Cnt_switch==0){
for (i=0; i<Spe_Total_CNO[Cwan]; i++){
for (j=0; j<Spe_Total_CNO[Hwan]; j++){
My_Ena_threads[OMPID] += DM[0][spin][Mc_AN][h_AN][i][j]*HVNA[Mc_AN][h_AN][i][j];
}
}
}
else {
for (i=0; i<Spe_Total_CNO[Cwan]; i++){
for (j=0; j<Spe_Total_CNO[Hwan]; j++){
My_Ena_threads[OMPID] += DM[0][spin][Mc_AN][h_AN][i][j]*CntH0[0][Mc_AN][h_AN][i][j];
}
}
}
dtime(&Etime_atom);
time_per_atom[Gc_AN] += Etime_atom - Stime_atom;
}
if (SpinP_switch==0) My_Ena_threads[OMPID] = 2.0*My_Ena_threads[OMPID];
} /* #pragma omp parallel */
} /* spin */
}
else if (SpinP_switch==3){
#pragma omp parallel shared(time_per_atom,HVNA,DM,Spe_Total_CNO,natn,WhatSpecies,M2G,OneD2h_AN,OneD2Mc_AN,OneD_Nloop) private(OMPID,Nthrds,Nprocs,Nloop,Stime_atom,Mc_AN,Gc_AN,h_AN,Cwan,Gh_AN,Hwan,i,j,Etime_atom)
{
/* get info. on OpenMP */
OMPID = omp_get_thread_num();
Nthrds = omp_get_num_threads();
Nprocs = omp_get_num_procs();
/* one-dimensionalized loop */
for (Nloop=OMPID*OneD_Nloop/Nthrds; Nloop<(OMPID+1)*OneD_Nloop/Nthrds; Nloop++){
dtime(&Stime_atom);
/* get Mc_AN and h_AN */
Mc_AN = OneD2Mc_AN[Nloop];
h_AN = OneD2h_AN[Nloop];
/* set data on Mc_AN */
Gc_AN = M2G[Mc_AN];
Cwan = WhatSpecies[Gc_AN];
/* set data on h_AN */
Gh_AN = natn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
for (i=0; i<Spe_Total_CNO[Cwan]; i++){
for (j=0; j<Spe_Total_CNO[Hwan]; j++){
My_Ena_threads[OMPID] += (DM[0][0][Mc_AN][h_AN][i][j]+DM[0][1][Mc_AN][h_AN][i][j])*HVNA[Mc_AN][h_AN][i][j];
}
}
dtime(&Etime_atom);
time_per_atom[Gc_AN] += Etime_atom - Stime_atom;
} /* Nloop */
} /* #pragma omp parallel */
} /* else if (SpinP_switch==3) */
/* sum of My_Ena_threads */
My_Ena = 0.0;
for (Nloop=0; Nloop<Nthrds0; Nloop++){
My_Ena += My_Ena_threads[Nloop];
}
/* sum of My_Ena */
MPI_Allreduce(&My_Ena, &Ena, 1, MPI_DOUBLE, MPI_SUM, mpi_comm_level1);
/* freeing of array */
free(My_Ena_threads);
/****************************************************
return Ena
****************************************************/
return Ena;
}
double Calc_Enl()
{
/****************************************************
calculate the non-local pseudo potential energy
****************************************************/
int i,j,spin,spinmax;
int Mc_AN,Gc_AN,Cwan,Rn,h_AN,Gh_AN,Hwan;
double My_Enl,Enl,Zc,Zh,dum,dum2;
int numprocs,myid;
double Stime_atom, Etime_atom;
double *My_Enl_threads;
/* for OpenMP */
int OMPID,Nthrds,Nthrds0,Nprocs,Nloop;
/* MPI */
MPI_Comm_size(mpi_comm_level1,&numprocs);
MPI_Comm_rank(mpi_comm_level1,&myid);
/*******************************************************************
conventional calculation of the non-local pseudo potential energy
*******************************************************************/
/* get Nthrds0 */
#pragma omp parallel shared(Nthrds0)
{
Nthrds0 = omp_get_num_threads();
}
/* allocation of array */
My_Enl_threads = (double*)malloc(sizeof(double)*Nthrds0);
for (Nloop=0; Nloop<Nthrds0; Nloop++) My_Enl_threads[Nloop] = 0.0;
if (SpinP_switch==0 || SpinP_switch==1){
for (spin=0; spin<=SpinP_switch; spin++){
if (Cnt_switch==1){
/* temporaly, borrow the CntH0 matrix */
Cont_Matrix0(HNL[spin],CntH0[0]);
}
#pragma omp parallel shared(spin,SpinP_switch,time_per_atom,CntH0,HNL,DM,My_Enl_threads,Spe_Total_CNO,Cnt_switch,natn,WhatSpecies,M2G,OneD2h_AN,OneD2Mc_AN,OneD_Nloop) private(OMPID,Nthrds,Nprocs,Nloop,Stime_atom,Mc_AN,h_AN,Gc_AN,Cwan,Gh_AN,Hwan,Etime_atom,i,j)
{
/* get info. on OpenMP */
OMPID = omp_get_thread_num();
Nthrds = omp_get_num_threads();
Nprocs = omp_get_num_procs();
/* one-dimensionalized loop */
for (Nloop=OMPID*OneD_Nloop/Nthrds; Nloop<(OMPID+1)*OneD_Nloop/Nthrds; Nloop++){
dtime(&Stime_atom);
/* get Mc_AN and h_AN */
Mc_AN = OneD2Mc_AN[Nloop];
h_AN = OneD2h_AN[Nloop];
/* set data on Mc_AN */
Gc_AN = M2G[Mc_AN];
Cwan = WhatSpecies[Gc_AN];
/* set data on h_AN */
Gh_AN = natn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
if (Cnt_switch==0){
for (i=0; i<Spe_Total_CNO[Cwan]; i++){
for (j=0; j<Spe_Total_CNO[Hwan]; j++){
My_Enl_threads[OMPID] += DM[0][spin][Mc_AN][h_AN][i][j]*HNL[spin][Mc_AN][h_AN][i][j];
}
}
}
else {
for (i=0; i<Spe_Total_CNO[Cwan]; i++){
for (j=0; j<Spe_Total_CNO[Hwan]; j++){
My_Enl_threads[OMPID] += DM[0][spin][Mc_AN][h_AN][i][j]*CntH0[0][Mc_AN][h_AN][i][j];
}
}
}
dtime(&Etime_atom);
time_per_atom[Gc_AN] += Etime_atom - Stime_atom;
} /* Nloop */
if (SpinP_switch==0) My_Enl_threads[OMPID] = 2.0*My_Enl_threads[OMPID];
} /* #pragma omp parallel */
} /* spin */
}
else if (SpinP_switch==3){
#pragma omp parallel shared(time_per_atom,iHNL0,HNL,iDM,DM,My_Enl_threads,Spe_Total_CNO,natn,WhatSpecies,M2G,OneD2h_AN,OneD2Mc_AN,OneD_Nloop) private(OMPID,Nthrds,Nprocs,Nloop,Stime_atom,Etime_atom,Mc_AN,h_AN,Gc_AN,Cwan,Gh_AN,Hwan,i,j)
{
/* get info. on OpenMP */
OMPID = omp_get_thread_num();
Nthrds = omp_get_num_threads();
Nprocs = omp_get_num_procs();
/* one-dimensionalized loop */
for (Nloop=OMPID*OneD_Nloop/Nthrds; Nloop<(OMPID+1)*OneD_Nloop/Nthrds; Nloop++){
dtime(&Stime_atom);
/* get Mc_AN and h_AN */
Mc_AN = OneD2Mc_AN[Nloop];
h_AN = OneD2h_AN[Nloop];
/* set data on Mc_AN */
Gc_AN = M2G[Mc_AN];
Cwan = WhatSpecies[Gc_AN];
/* set data on h_AN */
Gh_AN = natn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
for (i=0; i<Spe_Total_CNO[Cwan]; i++){
for (j=0; j<Spe_Total_CNO[Hwan]; j++){
My_Enl_threads[OMPID] +=
DM[0][0][Mc_AN][h_AN][i][j]* HNL[0][Mc_AN][h_AN][i][j]
- iDM[0][0][Mc_AN][h_AN][i][j]*iHNL0[0][Mc_AN][h_AN][i][j]
+ DM[0][1][Mc_AN][h_AN][i][j]* HNL[1][Mc_AN][h_AN][i][j]
- iDM[0][1][Mc_AN][h_AN][i][j]*iHNL0[1][Mc_AN][h_AN][i][j]
+ 2.0*DM[0][2][Mc_AN][h_AN][i][j]* HNL[2][Mc_AN][h_AN][i][j]
- 2.0*DM[0][3][Mc_AN][h_AN][i][j]*iHNL0[2][Mc_AN][h_AN][i][j];
}
}
dtime(&Etime_atom);
time_per_atom[Gc_AN] += Etime_atom - Stime_atom;
} /* Nloop */
} /* #pragma omp parallel */
}
/* sum of My_Enl_threads */
My_Enl = 0.0;
for (Nloop=0; Nloop<Nthrds0; Nloop++){
My_Enl += My_Enl_threads[Nloop];
}
/* sum of My_Enl */
MPI_Allreduce(&My_Enl, &Enl, 1, MPI_DOUBLE, MPI_SUM, mpi_comm_level1);
/* freeing of array */
free(My_Enl_threads);
/****************************************************
return Enl
****************************************************/
return Enl;
}
double Calc_ECH()
{
/****************************************************
calculate the penalty term to create a core-hole
****************************************************/
int i,j,spin,spinmax;
int Mc_AN,Gc_AN,Cwan,Rn,h_AN,Gh_AN,Hwan;
double My_ECH,ECH,Zc,Zh,dum,dum2;
int numprocs,myid;
double Stime_atom, Etime_atom;
double *My_ECH_threads;
/* for OpenMP */
int OMPID,Nthrds,Nthrds0,Nprocs,Nloop;
/* MPI */
MPI_Comm_size(mpi_comm_level1,&numprocs);
MPI_Comm_rank(mpi_comm_level1,&myid);
/*******************************************************************
conventional calculation of the penalty term
*******************************************************************/
/* get Nthrds0 */
#pragma omp parallel shared(Nthrds0)
{
Nthrds0 = omp_get_num_threads();
}
/* allocation of array */
My_ECH_threads = (double*)malloc(sizeof(double)*Nthrds0);
for (Nloop=0; Nloop<Nthrds0; Nloop++) My_ECH_threads[Nloop] = 0.0;
if (SpinP_switch==0 || SpinP_switch==1){
for (spin=0; spin<=SpinP_switch; spin++){
#pragma omp parallel shared(spin,SpinP_switch,time_per_atom,HCH,DM,My_ECH_threads,Spe_Total_CNO,Cnt_switch,natn,WhatSpecies,M2G,OneD2h_AN,OneD2Mc_AN,OneD_Nloop) private(OMPID,Nthrds,Nprocs,Nloop,Stime_atom,Mc_AN,h_AN,Gc_AN,Cwan,Gh_AN,Hwan,Etime_atom,i,j)
{
/* get info. on OpenMP */
OMPID = omp_get_thread_num();
Nthrds = omp_get_num_threads();
Nprocs = omp_get_num_procs();
/* one-dimensionalized loop */
for (Nloop=OMPID*OneD_Nloop/Nthrds; Nloop<(OMPID+1)*OneD_Nloop/Nthrds; Nloop++){
dtime(&Stime_atom);
/* get Mc_AN and h_AN */
Mc_AN = OneD2Mc_AN[Nloop];
h_AN = OneD2h_AN[Nloop];
/* set data on Mc_AN */
Gc_AN = M2G[Mc_AN];
Cwan = WhatSpecies[Gc_AN];
/* set data on h_AN */
Gh_AN = natn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
for (i=0; i<Spe_Total_CNO[Cwan]; i++){
for (j=0; j<Spe_Total_CNO[Hwan]; j++){
My_ECH_threads[OMPID] += DM[0][spin][Mc_AN][h_AN][i][j]*HCH[spin][Mc_AN][h_AN][i][j];
}
}
dtime(&Etime_atom);
time_per_atom[Gc_AN] += Etime_atom - Stime_atom;
} /* Nloop */
if (SpinP_switch==0) My_ECH_threads[OMPID] = 2.0*My_ECH_threads[OMPID];
} /* #pragma omp parallel */
} /* spin */
}
else if (SpinP_switch==3){
#pragma omp parallel shared(time_per_atom,iHCH,HCH,iDM,DM,My_ECH_threads,Spe_Total_CNO,natn,WhatSpecies,M2G,OneD2h_AN,OneD2Mc_AN,OneD_Nloop) private(OMPID,Nthrds,Nprocs,Nloop,Stime_atom,Etime_atom,Mc_AN,h_AN,Gc_AN,Cwan,Gh_AN,Hwan,i,j)
{
/* get info. on OpenMP */
OMPID = omp_get_thread_num();
Nthrds = omp_get_num_threads();
Nprocs = omp_get_num_procs();
/* one-dimensionalized loop */
for (Nloop=OMPID*OneD_Nloop/Nthrds; Nloop<(OMPID+1)*OneD_Nloop/Nthrds; Nloop++){
dtime(&Stime_atom);
/* get Mc_AN and h_AN */
Mc_AN = OneD2Mc_AN[Nloop];
h_AN = OneD2h_AN[Nloop];
/* set data on Mc_AN */
Gc_AN = M2G[Mc_AN];
Cwan = WhatSpecies[Gc_AN];
/* set data on h_AN */
Gh_AN = natn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
for (i=0; i<Spe_Total_CNO[Cwan]; i++){
for (j=0; j<Spe_Total_CNO[Hwan]; j++){
My_ECH_threads[OMPID] +=
DM[0][0][Mc_AN][h_AN][i][j]* HCH[0][Mc_AN][h_AN][i][j]
- iDM[0][0][Mc_AN][h_AN][i][j]*iHCH[0][Mc_AN][h_AN][i][j]
+ DM[0][1][Mc_AN][h_AN][i][j]* HCH[1][Mc_AN][h_AN][i][j]
- iDM[0][1][Mc_AN][h_AN][i][j]*iHCH[1][Mc_AN][h_AN][i][j]
+ 2.0*DM[0][2][Mc_AN][h_AN][i][j]* HCH[2][Mc_AN][h_AN][i][j]
- 2.0*DM[0][3][Mc_AN][h_AN][i][j]*iHCH[2][Mc_AN][h_AN][i][j];
}
}
dtime(&Etime_atom);
time_per_atom[Gc_AN] += Etime_atom - Stime_atom;
} /* Nloop */
} /* #pragma omp parallel */
}
/* sum of My_ECH_threads */
My_ECH = 0.0;
for (Nloop=0; Nloop<Nthrds0; Nloop++){
My_ECH += My_ECH_threads[Nloop];
}
/* sum of My_ECH */
MPI_Allreduce(&My_ECH, &ECH, 1, MPI_DOUBLE, MPI_SUM, mpi_comm_level1);
/* freeing of array */
free(My_ECH_threads);
/****************************************************
return ECH
****************************************************/
return ECH;
}
double Calc_Ecore()
{
/****************************************************
Ecore
****************************************************/
int Mc_AN,Gc_AN,Cwan,Rn,h_AN,Gh_AN,Hwan;
int i,spin,spinmax;
double My_Ecore,Ecore,Zc,Zh,dum,dum2;
double *My_Ecore_threads;
double TmpEcore,dEx,dEy,dEz,r,lx,ly,lz;
int numprocs,myid;
double Stime_atom,Etime_atom;
/* for OpenMP */
int OMPID,Nthrds,Nthrds0,Nprocs,Nloop;
/* MPI */
MPI_Comm_size(mpi_comm_level1,&numprocs);
MPI_Comm_rank(mpi_comm_level1,&myid);
if (myid==Host_ID && 0<level_stdout){
printf(" Force calculation #6\n");fflush(stdout);
}
/* get Nthrds0 */
#pragma omp parallel shared(Nthrds0)
{
Nthrds0 = omp_get_num_threads();
}
/* allocation of array */
My_Ecore_threads = (double*)malloc(sizeof(double)*Nthrds0);
for (Nloop=0; Nloop<Nthrds0; Nloop++) My_Ecore_threads[Nloop] = 0.0;
#pragma omp parallel shared(level_stdout,time_per_atom,atv,Gxyz,Dis,ncn,natn,FNAN,Spe_Core_Charge,WhatSpecies,M2G,Matomnum,My_Ecore_threads,DecEscc,Energy_Decomposition_flag,SpinP_switch,Spe_MaxL_Basis,Spe_Num_Basis) private(OMPID,Nthrds,Nprocs,Mc_AN,Stime_atom,Gc_AN,Cwan,Zc,dEx,dEy,dEz,h_AN,Gh_AN,Rn,Hwan,Zh,r,lx,ly,lz,dum,dum2,Etime_atom,TmpEcore)
{
/* get info. on OpenMP */
OMPID = omp_get_thread_num();
Nthrds = omp_get_num_threads();
Nprocs = omp_get_num_procs();
for (Mc_AN=(OMPID*Matomnum/Nthrds+1); Mc_AN<((OMPID+1)*Matomnum/Nthrds+1); Mc_AN++){
dtime(&Stime_atom);
Gc_AN = M2G[Mc_AN];
Cwan = WhatSpecies[Gc_AN];
Zc = Spe_Core_Charge[Cwan];
dEx = 0.0;
dEy = 0.0;
dEz = 0.0;
TmpEcore = 0.0;
for (h_AN=1; h_AN<=FNAN[Gc_AN]; h_AN++){
Gh_AN = natn[Gc_AN][h_AN];
Rn = ncn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
Zh = Spe_Core_Charge[Hwan];
r = Dis[Gc_AN][h_AN];
/* for empty atoms or finite elemens basis */
if (r<1.0e-10) r = 1.0e-10;
lx = (Gxyz[Gc_AN][1] - Gxyz[Gh_AN][1] - atv[Rn][1])/r;
ly = (Gxyz[Gc_AN][2] - Gxyz[Gh_AN][2] - atv[Rn][2])/r;
lz = (Gxyz[Gc_AN][3] - Gxyz[Gh_AN][3] - atv[Rn][3])/r;
dum = Zc*Zh/r;
dum2 = dum/r;
TmpEcore += dum;
dEx = dEx - lx*dum2;
dEy = dEy - ly*dum2;
dEz = dEz - lz*dum2;
} /* h_AN */
/****************************************************
#6 of force
Contribution from the core-core repulsions
****************************************************/
My_Ecore_threads[OMPID] += 0.50*TmpEcore;
Gxyz[Gc_AN][17] += dEx;
Gxyz[Gc_AN][18] += dEy;
Gxyz[Gc_AN][19] += dEz;
if (Energy_Decomposition_flag==1){
DecEscc[0][Mc_AN][0] = 0.25*TmpEcore;
DecEscc[1][Mc_AN][0] = 0.25*TmpEcore;
}
if (2<=level_stdout){
printf("<Total_Ene> force(6) myid=%2d Mc_AN=%2d Gc_AN=%2d %15.12f %15.12f %15.12f\n",
myid,Mc_AN,Gc_AN,dEx,dEy,dEz);fflush(stdout);
}
dtime(&Etime_atom);
time_per_atom[Gc_AN] += Etime_atom - Stime_atom;
}
} /* #pragma omp parallel */
My_Ecore = 0.0;
for (Nloop=0; Nloop<Nthrds0; Nloop++){
My_Ecore += My_Ecore_threads[Nloop];
}
MPI_Allreduce(&My_Ecore, &Ecore, 1, MPI_DOUBLE, MPI_SUM, mpi_comm_level1);
/* freeing of array */
free(My_Ecore_threads);
return Ecore;
}
double Calc_EH0(int MD_iter)
{
/****************************************************
EH0 = -1/2\int n^a(r) V^a_H dr
****************************************************/
int Mc_AN,Gc_AN,h_AN,Gh_AN,num,gnum,i;
int wan,wan1,wan2,Nd,n1,n2,n3,spin,spinmax;
double bc,dx,x,y,z,r1,r2,rho0,xx;
double Scale_Grid_Ecut,TmpEH0;
double EH0ij[4],My_EH0,EH0,tmp0;
double *Fx,*Fy,*Fz,*g0;
double dEx,dEy,dEz,Dx,Sx;
double Z1,Z2,factor;
double My_dEx,My_dEy,My_dEz;
int numprocs,myid,ID;
double stime,etime;
double Stime_atom, Etime_atom;
/* for OpenMP */
int OMPID,Nthrds,Nthrds0,Nprocs,Nloop;
double *My_EH0_threads;
/* MPI */
MPI_Comm_size(mpi_comm_level1,&numprocs);
MPI_Comm_rank(mpi_comm_level1,&myid);
/****************************************************
allocation of arrays:
double Fx[Matomnum+1];
double Fy[Matomnum+1];
doubel Fz[Matomnum+1];
****************************************************/
Fx = (double*)malloc(sizeof(double)*(Matomnum+1));
Fy = (double*)malloc(sizeof(double)*(Matomnum+1));
Fz = (double*)malloc(sizeof(double)*(Matomnum+1));
/****************************************************
Set of atomic density on grids
****************************************************/
if (MD_iter==1){
dtime(&stime);
Scale_Grid_Ecut = 16.0*600.0;
/* estimate the size of an array g0 */
Max_Nd = 0;
for (wan=0; wan<SpeciesNum; wan++){
Spe_Spe2Ban[wan] = wan;
bc = Spe_Atom_Cut1[wan];
dx = PI/sqrt(Scale_Grid_Ecut);
Nd = 2*(int)(bc/dx) + 1;
if (Max_Nd<Nd) Max_Nd = Nd;
}
/* estimate sizes of arrays GridX,Y,Z_EH0, Arho_EH0, and Wt_EH0 */
Max_TGN_EH0 = 0;
for (wan=0; wan<SpeciesNum; wan++){
Spe_Spe2Ban[wan] = wan;
bc = Spe_Atom_Cut1[wan];
dx = PI/sqrt(Scale_Grid_Ecut);
Nd = 2*(int)(bc/dx) + 1;
dx = 2.0*bc/(double)(Nd-1);
gnum = Nd*CoarseGL_Mesh;
if (Max_TGN_EH0<gnum) Max_TGN_EH0 = gnum;
if (2<=level_stdout){
printf("<Calc_EH0> A spe=%2d 1D-grids=%2d 3D-grids=%2d\n",wan,Nd,gnum);fflush(stdout);
}
}
/* allocation of arrays GridX,Y,Z_EH0, Arho_EH0, and Wt_EH0 */
Max_TGN_EH0 += 10;
Allocate_Arrays(4);
/* calculate GridX,Y,Z_EH0 and Wt_EH0 */
#pragma omp parallel shared(Spe_Num_Mesh_PAO,Spe_PAO_XV,Spe_Atomic_Den,Max_Nd,level_stdout,TGN_EH0,Wt_EH0,Arho_EH0,GridZ_EH0,GridY_EH0,GridX_EH0,Scale_Grid_Ecut,Spe_Atom_Cut1,dv_EH0,Spe_Spe2Ban,SpeciesNum,CoarseGL_Abscissae,CoarseGL_Weight) private(OMPID,Nthrds,Nprocs,wan,bc,dx,Nd,gnum,n1,n2,n3,x,y,z,tmp0,r1,rho0,g0,Sx,Dx,xx)
{
int l,p;
/* allocation of arrays g0 */
g0 = (double*)malloc(sizeof(double)*Max_Nd);
/* get info. on OpenMP */
OMPID = omp_get_thread_num();
Nthrds = omp_get_num_threads();
Nprocs = omp_get_num_procs();
for (wan=OMPID*SpeciesNum/Nthrds; wan<(OMPID+1)*SpeciesNum/Nthrds; wan++){
Spe_Spe2Ban[wan] = wan;
bc = Spe_Atom_Cut1[wan];
dx = PI/sqrt(Scale_Grid_Ecut);
Nd = 2*(int)(bc/dx) + 1;
dx = 2.0*bc/(double)(Nd-1);
dv_EH0[wan] = dx;
for (n1=0; n1<Nd; n1++){
g0[n1] = dx*(double)n1 - bc;
}
gnum = 0;
y = 0.0;
Sx = Spe_Atom_Cut1[wan] + 0.0;
Dx = Spe_Atom_Cut1[wan] - 0.0;
for (n3=0; n3<Nd; n3++){
z = g0[n3];
tmp0 = z*z;
for (n1=0; n1<CoarseGL_Mesh; n1++){
x = 0.50*(Dx*CoarseGL_Abscissae[n1] + Sx);
xx = 0.5*log(x*x + tmp0);
GridX_EH0[wan][gnum] = x;
GridY_EH0[wan][gnum] = y;
GridZ_EH0[wan][gnum] = z;
rho0 = KumoF( Spe_Num_Mesh_PAO[wan], xx,
Spe_PAO_XV[wan], Spe_PAO_RV[wan], Spe_Atomic_Den[wan]);
Arho_EH0[wan][gnum] = rho0;
Wt_EH0[wan][gnum] = PI*x*CoarseGL_Weight[n1]*Dx;
/* increment of gnum */
gnum++;
}
} /* n3 */
TGN_EH0[wan] = gnum;
if (2<=level_stdout){
printf("<Calc_EH0> B spe=%2d 1D-grids=%2d 3D-grids=%2d\n",wan,Nd,gnum);fflush(stdout);
}
} /* wan */
/* free */
free(g0);
} /* #pragma omp parallel */
dtime(&etime);
if(myid==0 && measure_time){
printf("Time for part1 of EH0=%18.5f\n",etime-stime);fflush(stdout);
}
} /* if (MD_iter==1) */
/****************************************************
calculation of scaling factors:
****************************************************/
if (MD_iter==1){
for (wan1=0; wan1<SpeciesNum; wan1++){
r1 = Spe_Atom_Cut1[wan1];
Z1 = Spe_Core_Charge[wan1];
for (wan2=0; wan2<SpeciesNum; wan2++){
/* EH0_TwoCenter_at_Cutoff is parallelized by OpenMP */
EH0_TwoCenter_at_Cutoff(wan1, wan2, EH0ij);
r2 = Spe_Atom_Cut1[wan2];
Z2 = Spe_Core_Charge[wan2];
tmp0 = Z1*Z2/(r1+r2);
if (1.0e-20<fabs(EH0ij[0])){
EH0_scaling[wan1][wan2] = tmp0/EH0ij[0];
}
else{
EH0_scaling[wan1][wan2] = 0.0;
}
}
}
}
/****************************************************
-1/2\int n^a(r) V^a_H dr
****************************************************/
dtime(&stime);
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
Fx[Mc_AN] = 0.0;
Fy[Mc_AN] = 0.0;
Fz[Mc_AN] = 0.0;
}
/* get Nthrds0 */
#pragma omp parallel shared(Nthrds0)
{
Nthrds0 = omp_get_num_threads();
}
/* allocation of array */
My_EH0_threads = (double*)malloc(sizeof(double)*Nthrds0);
for (Nloop=0; Nloop<Nthrds0; Nloop++) My_EH0_threads[Nloop] = 0.0;
#pragma omp parallel shared(time_per_atom,RMI1,EH0_scaling,natn,FNAN,WhatSpecies,M2G,Matomnum,My_EH0_threads,DecEscc,Energy_Decomposition_flag,List_YOUSO,Spe_MaxL_Basis,Spe_Num_Basis,SpinP_switch) private(OMPID,Nthrds,Nprocs,Mc_AN,Stime_atom,Gc_AN,wan1,h_AN,Gh_AN,wan2,factor,Etime_atom,TmpEH0)
{
int l,p;
double EH0ij[4];
/* get info. on OpenMP */
OMPID = omp_get_thread_num();
Nthrds = omp_get_num_threads();
Nprocs = omp_get_num_procs();
for (Mc_AN=(OMPID*Matomnum/Nthrds+1); Mc_AN<((OMPID+1)*Matomnum/Nthrds+1); Mc_AN++){
dtime(&Stime_atom);
Gc_AN = M2G[Mc_AN];
wan1 = WhatSpecies[Gc_AN];
TmpEH0 = 0.0;
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
Gh_AN = natn[Gc_AN][h_AN];
wan2 = WhatSpecies[Gh_AN];
if (h_AN==0) factor = 1.0;
else factor = EH0_scaling[wan1][wan2];
EH0_TwoCenter(Gc_AN, h_AN, EH0ij);
TmpEH0 -= 0.250*factor*EH0ij[0];
Fx[Mc_AN] = Fx[Mc_AN] - 0.5*factor*EH0ij[1];
Fy[Mc_AN] = Fy[Mc_AN] - 0.5*factor*EH0ij[2];
Fz[Mc_AN] = Fz[Mc_AN] - 0.5*factor*EH0ij[3];
if (h_AN==0) factor = 1.0;
else factor = EH0_scaling[wan2][wan1];
EH0_TwoCenter(Gh_AN, RMI1[Mc_AN][h_AN][0], EH0ij);
TmpEH0 -= 0.250*factor*EH0ij[0];
Fx[Mc_AN] = Fx[Mc_AN] + 0.5*factor*EH0ij[1];
Fy[Mc_AN] = Fy[Mc_AN] + 0.5*factor*EH0ij[2];
Fz[Mc_AN] = Fz[Mc_AN] + 0.5*factor*EH0ij[3];
} /* h_AN */
My_EH0_threads[OMPID] += TmpEH0;
if (Energy_Decomposition_flag==1){
DecEscc[0][Mc_AN][0] += 0.5*TmpEH0;
DecEscc[1][Mc_AN][0] += 0.5*TmpEH0;
}
dtime(&Etime_atom);
time_per_atom[Gc_AN] += Etime_atom - Stime_atom;
} /* Mc_AN */
} /* #pragma omp parallel */
/* sum of My_EH0_threads */
My_EH0 = 0.0;
for (Nloop=0; Nloop<Nthrds0; Nloop++){
My_EH0 += My_EH0_threads[Nloop];
}
/* sum of My_EH0 */
MPI_Allreduce(&My_EH0, &EH0, 1, MPI_DOUBLE, MPI_SUM, mpi_comm_level1);
/* freeing of array */
free(My_EH0_threads);
dtime(&etime);
if(myid==0 && measure_time){
printf("Time for part2 of EH0=%18.5f\n",etime-stime);fflush(stdout);
}
/*******************************************************
#7 of force
contribution from the classical Coulomb energy between
the neutral atomic charge and the neutral potential
*******************************************************/
if (myid==Host_ID && 0<level_stdout){
printf(" Force calculation #7\n");fflush(stdout);
}
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
Gc_AN = M2G[Mc_AN];
if (2<=level_stdout){
printf("<Total_Ene> force(7) myid=%2d Mc_AN=%2d Gc_AN=%2d %15.12f %15.12f %15.12f\n",
myid,Mc_AN,Gc_AN,Fx[Mc_AN],Fy[Mc_AN],Fz[Mc_AN]);fflush(stdout);
}
Gxyz[Gc_AN][17] += Fx[Mc_AN];
Gxyz[Gc_AN][18] += Fy[Mc_AN];
Gxyz[Gc_AN][19] += Fz[Mc_AN];
}
/****************************************************
MPI, Gxyz[Gc_AN][17-19]
****************************************************/
for (Gc_AN=1; Gc_AN<=atomnum; Gc_AN++){
ID = G2ID[Gc_AN];
MPI_Bcast(&Gxyz[Gc_AN][17], 3, MPI_DOUBLE, ID, mpi_comm_level1);
}
/****************************************************
freeing of arrays:
double Fx[Matomnum+1];
double Fy[Matomnum+1];
doubel Fz[Matomnum+1];
****************************************************/
free(Fx);
free(Fy);
free(Fz);
/* return */
return EH0;
}
void Calc_EXC_EH1(double ECE[],double *****CDM)
{
/************************************************************
EXC = \sum_{\sigma} (n_{\sigma}(r)+n_pcc(r)\epsilon_{xc}
EH1 = 1/2\int {n(r)-n_a(r)} \delta V_H dr
************************************************************/
static int firsttime=1;
int i,spin,spinmax,XC_P_switch;
int numS,numR,My_GNum,BN_AB;
int n,n1,n2,n3,Ng1,Ng2,Ng3,j,k;
int GNc,GRc,MNc;
int GN,GNs,BN,DN,LN,N2D,n2D,N3[4];
double EXC[2],EH1,sum,tot_den;
double My_EXC[2],My_EH1;
double My_EXC_VolumeTerm[2];
double EXC_VolumeTerm[2];
double My_Eef,Eef;
double My_Ena,Ena;
double sum_charge,My_charge;
int numprocs,myid,tag=999,ID,IDS,IDR;
double Cxyz[4],gradxyz[4];
double Stime_atom,Etime_atom;
double time0,time1;
double sden[2],tden,aden,pden[2];
/* dipole moment */
int Gc_AN,Mc_AN,spe;
double x,y,z,den,charge,cden_BG;
double E_dpx,E_dpy,E_dpz;
double E_dpx_BG,E_dpy_BG,E_dpz_BG;
double C_dpx,C_dpy,C_dpz;
double My_E_dpx_BG,My_E_dpy_BG,My_E_dpz_BG;
double My_E_dpx,My_E_dpy,My_E_dpz;
double My_C_dpx,My_C_dpy,My_C_dpz;
double AU2Debye,AbsD;
double x0,y0,z0,r;
double rs,re,ts,te,ps,pe;
double Sp,Dp,St,Dt,Sr,Dr;
double r1,dx,dy,dz,dx1,dy1,dz1;
double x1,y1,z1,den0,exc0,w;
double sumr,sumt;
double sumrx,sumtx;
double sumry,sumty;
double sumrz,sumtz;
double gden0,vxc0;
double *My_sumr,*My_sumrx,*My_sumry,*My_sumrz;
int ir,ia,Cwan,Rn,Hwan,Gh_AN,h_AN;
char file_DPM[YOUSO10] = ".dpm";
FILE *fp_DPM;
char buf[fp_bsize]; /* setvbuf */
MPI_Status stat;
MPI_Request request;
/* for OpenMP */
int OMPID,Nthrds,Nthrds0,Nprocs,Nloop;
/* MPI */
MPI_Comm_size(mpi_comm_level1,&numprocs);
MPI_Comm_rank(mpi_comm_level1,&myid);
if (SpinP_switch==0) spinmax = 0;
else if (SpinP_switch==1) spinmax = 1;
else if (SpinP_switch==3) spinmax = 1;
/****************************************************
set Vxc_Grid
****************************************************/
XC_P_switch = 0;
Set_XC_Grid(2, XC_P_switch,XC_switch,
Density_Grid_D[0],Density_Grid_D[1],
Density_Grid_D[2],Density_Grid_D[3],
Vxc_Grid_D[0], Vxc_Grid_D[1],
Vxc_Grid_D[2], Vxc_Grid_D[3],
NULL,NULL);
/****************************************************
copy Vxc_Grid_D to Vxc_Grid_B
****************************************************/
Ng1 = Max_Grid_Index_D[1] - Min_Grid_Index_D[1] + 1;
Ng2 = Max_Grid_Index_D[2] - Min_Grid_Index_D[2] + 1;
Ng3 = Max_Grid_Index_D[3] - Min_Grid_Index_D[3] + 1;
for (n=0; n<Num_Rcv_Grid_B2D[myid]; n++){
DN = Index_Rcv_Grid_B2D[myid][n];
BN = Index_Snd_Grid_B2D[myid][n];
i = DN/(Ng2*Ng3);
j = (DN-i*Ng2*Ng3)/Ng3;
k = DN - i*Ng2*Ng3 - j*Ng3;
if ( !(i<=1 || (Ng1-2)<=i || j<=1 || (Ng2-2)<=j || k<=1 || (Ng3-2)<=k)){
for (spin=0; spin<=SpinP_switch; spin++){
Vxc_Grid_B[spin][BN] = Vxc_Grid_D[spin][DN];
}
}
}
/*********************************************************
set RefVxc_Grid, where the CA-LDA exchange-correlation
functional is alway used.
*********************************************************/
XC_P_switch = 0;
for (BN_AB=0; BN_AB<My_NumGridB_AB; BN_AB++){
tot_den = ADensity_Grid_B[BN_AB] + ADensity_Grid_B[BN_AB];
if (PCC_switch==1) {
tot_den += PCCDensity_Grid_B[0][BN_AB] + PCCDensity_Grid_B[1][BN_AB];
}
RefVxc_Grid_B[BN_AB] = XC_Ceperly_Alder(tot_den,XC_P_switch);
}
/****************************************************
calculations of Ena, Eef, EH1, and EXC
****************************************************/
My_Ena = 0.0;
My_Eef = 0.0;
My_EH1 = 0.0;
My_EXC[0] = 0.0;
My_EXC[1] = 0.0;
for (BN=0; BN<My_NumGridB_AB; BN++){
sden[0] = Density_Grid_B[0][BN];
sden[1] = Density_Grid_B[1][BN];
tden = sden[0] + sden[1];
aden = ADensity_Grid_B[BN];
pden[0] = PCCDensity_Grid_B[0][BN];
pden[1] = PCCDensity_Grid_B[1][BN];
/* if (ProExpn_VNA==off), Ena is calculated here. */
if (ProExpn_VNA==0) My_Ena += tden*VNA_Grid_B[BN];
/* electric energy by electric field */
/* Disabled by N. Yamaguchi ***
if (E_Field_switch==1) My_Eef += tden*VEF_Grid_B[BN];
* ***/
/* Added by N. Yamaguchi ***/
if (E_Field_switch==1){
My_Eef+=(tden-2.0*aden)*VEF_Grid_B[BN];
}
/* ***/
/* EH1 = 1/2\int \delta n(r) \delta V_H dr */
My_EH1 += (tden - 2.0*aden)*dVHart_Grid_B[BN];
/* EXC = \sum_{\sigma} (n_{\sigma}+n_pcc)\epsilon_{xc}
-(n_{atom}+n_pcc)\epsilon_{xc}(n_{atom})
calculation of the difference between the xc energies
calculated by wave-function-charge and atomic charge
on the coarse grid. */
for (spin=0; spin<=spinmax; spin++){
My_EXC[spin] += (sden[spin]+pden[spin])*Vxc_Grid_B[spin][BN]
-(aden+pden[spin])*RefVxc_Grid_B[BN];
}
} /* BN */
/****************************************************
multiplying GridVol and MPI communication
****************************************************/
MPI_Barrier(mpi_comm_level1);
/* if (ProExpn_VNA==off), Ena is calculated here. */
if (ProExpn_VNA==0){
if (F_VNA_flag==1){
My_Ena *= GridVol;
MPI_Allreduce(&My_Ena, &Ena, 1, MPI_DOUBLE, MPI_SUM, mpi_comm_level1);
ECE[3] = Ena;
}
else{
ECE[3] = 0.0;
}
}
/* electric energy by electric field */
if (E_Field_switch==1){
My_Eef *= GridVol;
MPI_Allreduce(&My_Eef, &Eef, 1, MPI_DOUBLE, MPI_SUM, mpi_comm_level1);
ECE[12] = Eef;
}
else {
ECE[12] = 0.0;
}
if (F_VEF_flag==0){
ECE[12] = 0.0;
}
/* EH1 = 1/2\int \delta n(r) \delta V_H dr */
My_EH1 *= (0.5*GridVol);
/************************************************************
EXC = \sum_{\sigma} n_{\sigma}\epsilon_{xc}
- n_{atom}\epsilon_{xc}(n_{atom})
calculation of the difference between the xc energies
calculated by wave-function-charge and atomic charge
on the coarse grid.
My_EXC_VolumeTerm will be used to take account of
volume term for stress.
*************************************************************/
My_EXC[0] *= GridVol;
My_EXC[1] *= GridVol;
My_EXC_VolumeTerm[0] = My_EXC[0];
My_EXC_VolumeTerm[1] = My_EXC[1];
/****************************************************
calculation of Exc^(0) and its contribution
to forces on the fine mesh
****************************************************/
Set_Lebedev_Grid();
/* get Nthrds0 */
#pragma omp parallel shared(Nthrds0)
{
Nthrds0 = omp_get_num_threads();
}
/* initialize the temporal array storing the force contribution */
for (Gc_AN=1; Gc_AN<=atomnum; Gc_AN++){
Gxyz[Gc_AN][41] = 0.0;
Gxyz[Gc_AN][42] = 0.0;
Gxyz[Gc_AN][43] = 0.0;
}
/* start calc. */
rs = 0.0;
sum = 0.0;
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
Gc_AN = M2G[Mc_AN];
Cwan = WhatSpecies[Gc_AN];
re = Spe_Atom_Cut1[Cwan];
Sr = re + rs;
Dr = re - rs;
/* allocation of arrays */
double *My_sumr,**My_sumrx,**My_sumry,**My_sumrz;
My_sumr = (double*)malloc(sizeof(double)*Nthrds0);
for (i=0; i<Nthrds0; i++) My_sumr[i] = 0.0;
My_sumrx = (double**)malloc(sizeof(double*)*Nthrds0);
for (i=0; i<Nthrds0; i++){
My_sumrx[i] = (double*)malloc(sizeof(double)*(FNAN[Gc_AN]+1));
for (j=0; j<(FNAN[Gc_AN]+1); j++){
My_sumrx[i][j] = 0.0;
}
}
My_sumry = (double**)malloc(sizeof(double*)*Nthrds0);
for (i=0; i<Nthrds0; i++){
My_sumry[i] = (double*)malloc(sizeof(double)*(FNAN[Gc_AN]+1));
for (j=0; j<(FNAN[Gc_AN]+1); j++){
My_sumry[i][j] = 0.0;
}
}
My_sumrz = (double**)malloc(sizeof(double*)*Nthrds0);
for (i=0; i<Nthrds0; i++){
My_sumrz[i] = (double*)malloc(sizeof(double)*(FNAN[Gc_AN]+1));
for (j=0; j<(FNAN[Gc_AN]+1); j++){
My_sumrz[i][j] = 0.0;
}
}
#pragma omp parallel shared(Spe_Atomic_Den2,Spe_PAO_XV,Spe_Num_Mesh_PAO,Leb_Grid_XYZW,My_sumr,My_sumrx,My_sumry,My_sumrz,Dr,Sr,CoarseGL_Abscissae,CoarseGL_Weight,Gxyz,Gc_AN,FNAN,natn,ncn,WhatSpecies,atv,F_Vxc_flag,Cwan,PCC_switch) private(OMPID,Nthrds,Nprocs,ir,ia,r,w,sumt,sumtx,sumty,sumtz,x,x0,y0,z0,h_AN,Gh_AN,Rn,Hwan,x1,y1,z1,dx,dy,dz,r1,den,den0,gden0,dx1,dy1,dz1,exc0,vxc0)
{
double *gx,*gy,*gz,dexc0;
double *sum_gx,*sum_gy,*sum_gz;
gx = (double*)malloc(sizeof(double)*(FNAN[Gc_AN]+1));
gy = (double*)malloc(sizeof(double)*(FNAN[Gc_AN]+1));
gz = (double*)malloc(sizeof(double)*(FNAN[Gc_AN]+1));
sum_gx = (double*)malloc(sizeof(double)*(FNAN[Gc_AN]+1));
sum_gy = (double*)malloc(sizeof(double)*(FNAN[Gc_AN]+1));
sum_gz = (double*)malloc(sizeof(double)*(FNAN[Gc_AN]+1));
/* get info. on OpenMP */
OMPID = omp_get_thread_num();
Nthrds = omp_get_num_threads();
Nprocs = omp_get_num_procs();
for (ir=(OMPID*CoarseGL_Mesh/Nthrds); ir<((OMPID+1)*CoarseGL_Mesh/Nthrds); ir++){
r = 0.50*(Dr*CoarseGL_Abscissae[ir] + Sr);
sumt = 0.0;
for (i=0; i<(FNAN[Gc_AN]+1); i++){
sum_gx[i] = 0.0;
sum_gy[i] = 0.0;
sum_gz[i] = 0.0;
}
for (ia=0; ia<Num_Leb_Grid; ia++){
x0 = r*Leb_Grid_XYZW[ia][0] + Gxyz[Gc_AN][1];
y0 = r*Leb_Grid_XYZW[ia][1] + Gxyz[Gc_AN][2];
z0 = r*Leb_Grid_XYZW[ia][2] + Gxyz[Gc_AN][3];
/* calculate rho_atom + rho_pcc */
den = 0.0;
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
Gh_AN = natn[Gc_AN][h_AN];
Rn = ncn[Gc_AN][h_AN];
Hwan = WhatSpecies[Gh_AN];
x1 = Gxyz[Gh_AN][1] + atv[Rn][1];
y1 = Gxyz[Gh_AN][2] + atv[Rn][2];
z1 = Gxyz[Gh_AN][3] + atv[Rn][3];
dx = x1 - x0;
dy = y1 - y0;
dz = z1 - z0;
x = 0.5*log(dx*dx + dy*dy + dz*dz);
/* calculate density */
den += KumoF( Spe_Num_Mesh_PAO[Hwan], x,
Spe_PAO_XV[Hwan], Spe_PAO_RV[Hwan], Spe_Atomic_Den2[Hwan])*F_Vxc_flag;
if (h_AN==0) den0 = den;
/* calculate gradient of density */
if (h_AN!=0){
r1 = sqrt(dx*dx + dy*dy + dz*dz);
gden0 = Dr_KumoF( Spe_Num_Mesh_PAO[Hwan], x, r1,
Spe_PAO_XV[Hwan], Spe_PAO_RV[Hwan], Spe_Atomic_Den2[Hwan])*F_Vxc_flag;
gx[h_AN] = gden0/r1*dx;
gy[h_AN] = gden0/r1*dy;
gz[h_AN] = gden0/r1*dz;
}
} /* h_AN */
/* calculate the CA-LDA exchange-correlation energy density */
exc0 = XC_Ceperly_Alder(den,0);
/* calculate the CA-LDA exchange-correlation potential */
dexc0 = XC_Ceperly_Alder(den,3);
/* Lebedev quadrature */
w = Leb_Grid_XYZW[ia][3];
sumt += w*den0*exc0;
for (h_AN=1; h_AN<=FNAN[Gc_AN]; h_AN++){
sum_gx[h_AN] += w*den0*dexc0*gx[h_AN];
sum_gy[h_AN] += w*den0*dexc0*gy[h_AN];
sum_gz[h_AN] += w*den0*dexc0*gz[h_AN];
}
} /* ia */
/* r for Gauss-Legendre quadrature */
w = r*r*CoarseGL_Weight[ir];
My_sumr[OMPID] += w*sumt;
for (h_AN=1; h_AN<=FNAN[Gc_AN]; h_AN++){
My_sumrx[OMPID][h_AN] += w*sum_gx[h_AN];
My_sumry[OMPID][h_AN] += w*sum_gy[h_AN];
My_sumrz[OMPID][h_AN] += w*sum_gz[h_AN];
}
} /* ir */
free(gx);
free(gy);
free(gz);
free(sum_gx);
free(sum_gy);
free(sum_gz);
} /* #pragma omp */
sumr = 0.0;
for (Nloop=0; Nloop<Nthrds0; Nloop++){
sumr += My_sumr[Nloop];
}
sum += 2.0*PI*Dr*sumr;
/* add force */
for (h_AN=1; h_AN<=FNAN[Gc_AN]; h_AN++){
sumrx = 0.0;
sumry = 0.0;
sumrz = 0.0;
for (Nloop=0; Nloop<Nthrds0; Nloop++){
sumrx += My_sumrx[Nloop][h_AN];
sumry += My_sumry[Nloop][h_AN];
sumrz += My_sumrz[Nloop][h_AN];
}
Gh_AN = natn[Gc_AN][h_AN];
Gxyz[Gh_AN][41] += 2.0*PI*Dr*sumrx;
Gxyz[Gh_AN][42] += 2.0*PI*Dr*sumry;
Gxyz[Gh_AN][43] += 2.0*PI*Dr*sumrz;
Gxyz[Gc_AN][41] -= 2.0*PI*Dr*sumrx;
Gxyz[Gc_AN][42] -= 2.0*PI*Dr*sumry;
Gxyz[Gc_AN][43] -= 2.0*PI*Dr*sumrz;
}
/* freeing of arrays */
free(My_sumr);
for (i=0; i<Nthrds0; i++){
free(My_sumrx[i]);
}
free(My_sumrx);
for (i=0; i<Nthrds0; i++){
free(My_sumry[i]);
}
free(My_sumry);
for (i=0; i<Nthrds0; i++){
free(My_sumrz[i]);
}
free(My_sumrz);
} /* Mc_AN */
/* add Exc^0 calculated on the fine mesh to My_EXC */
My_EXC[0] += 0.5*sum;
My_EXC[1] += 0.5*sum;
/* MPI: Gxyz[][41,42,43] */
for (Gc_AN=1; Gc_AN<=atomnum; Gc_AN++){
MPI_Allreduce(&Gxyz[Gc_AN][41], &gradxyz[0], 3, MPI_DOUBLE, MPI_SUM, mpi_comm_level1);
Gxyz[Gc_AN][17] += gradxyz[0];
Gxyz[Gc_AN][18] += gradxyz[1];
Gxyz[Gc_AN][19] += gradxyz[2];
if (2<=level_stdout){
printf("<Total_Ene> force(8) myid=%2d Gc_AN=%2d %15.12f %15.12f %15.12f\n",
myid,Gc_AN,gradxyz[0],gradxyz[1],gradxyz[2]);
}
}
/****************************************************
MPI, Gxyz[Gc_AN][17-19]
****************************************************/
for (Gc_AN=1; Gc_AN<=atomnum; Gc_AN++){
ID = G2ID[Gc_AN];
MPI_Bcast(&Gxyz[Gc_AN][17], 3, MPI_DOUBLE, ID, mpi_comm_level1);
if (2<=level_stdout && myid==Host_ID){
printf("<Total_Ene> force(t) myid=%2d Gc_AN=%2d %15.12f %15.12f %15.12f\n",
myid,Gc_AN,Gxyz[Gc_AN][17],Gxyz[Gc_AN][18],Gxyz[Gc_AN][19]);fflush(stdout);
}
}
/****************************************************
MPI:
EH1, EXC
****************************************************/
MPI_Barrier(mpi_comm_level1);
MPI_Allreduce(&My_EH1, &EH1, 1, MPI_DOUBLE, MPI_SUM, mpi_comm_level1);
for (spin=0; spin<=spinmax; spin++){
MPI_Allreduce(&My_EXC[spin], &EXC[spin], 1, MPI_DOUBLE, MPI_SUM, mpi_comm_level1);
MPI_Allreduce(&My_EXC_VolumeTerm[spin], &EXC_VolumeTerm[spin], 1, MPI_DOUBLE, MPI_SUM, mpi_comm_level1);
}
if (SpinP_switch==0){
ECE[5] = EH1;
ECE[6] = EXC[0];
ECE[7] = EXC[0];
EXC_VolumeTerm[1] = EXC_VolumeTerm[0];
}
else if (SpinP_switch==1 || SpinP_switch==3) {
ECE[5] = EH1;
ECE[6] = EXC[0];
ECE[7] = EXC[1];
}
if (F_dVHart_flag==0){
ECE[5] = 0.0;
}
if (F_Vxc_flag==0){
ECE[6] = 0.0;
ECE[7] = 0.0;
}
if (F_Vxc_flag==1){
Stress_Tensor[0] += EXC_VolumeTerm[0] + EXC_VolumeTerm[1];
Stress_Tensor[4] += EXC_VolumeTerm[0] + EXC_VolumeTerm[1];
Stress_Tensor[8] += EXC_VolumeTerm[0] + EXC_VolumeTerm[1];
}
/****************************************************
calculation of dipole moment
****************************************************/
/* contribution from electron density */
N2D = Ngrid1*Ngrid2;
GNs = ((myid*N2D+numprocs-1)/numprocs)*Ngrid3;
My_E_dpx = 0.0;
My_E_dpy = 0.0;
My_E_dpz = 0.0;
My_E_dpx_BG = 0.0;
My_E_dpy_BG = 0.0;
My_E_dpz_BG = 0.0;
for (BN=0; BN<My_NumGridB_AB; BN++){
GN = BN + GNs;
n1 = GN/(Ngrid2*Ngrid3);
n2 = (GN - n1*Ngrid2*Ngrid3)/Ngrid3;
n3 = GN - n1*Ngrid2*Ngrid3 - n2*Ngrid3;
x = (double)n1*gtv[1][1] + (double)n2*gtv[2][1]
+ (double)n3*gtv[3][1] + Grid_Origin[1];
y = (double)n1*gtv[1][2] + (double)n2*gtv[2][2]
+ (double)n3*gtv[3][2] + Grid_Origin[2];
z = (double)n1*gtv[1][3] + (double)n2*gtv[2][3]
+ (double)n3*gtv[3][3] + Grid_Origin[3];
den = Density_Grid_B[0][BN] + Density_Grid_B[1][BN];
My_E_dpx += den*x;
My_E_dpy += den*y;
My_E_dpz += den*z;
My_E_dpx_BG += x;
My_E_dpy_BG += y;
My_E_dpz_BG += z;
} /* BN */
MPI_Allreduce(&My_E_dpx, &E_dpx, 1, MPI_DOUBLE, MPI_SUM, mpi_comm_level1);
MPI_Allreduce(&My_E_dpy, &E_dpy, 1, MPI_DOUBLE, MPI_SUM, mpi_comm_level1);
MPI_Allreduce(&My_E_dpz, &E_dpz, 1, MPI_DOUBLE, MPI_SUM, mpi_comm_level1);
MPI_Allreduce(&My_E_dpx_BG, &E_dpx_BG, 1, MPI_DOUBLE, MPI_SUM, mpi_comm_level1);
MPI_Allreduce(&My_E_dpy_BG, &E_dpy_BG, 1, MPI_DOUBLE, MPI_SUM, mpi_comm_level1);
MPI_Allreduce(&My_E_dpz_BG, &E_dpz_BG, 1, MPI_DOUBLE, MPI_SUM, mpi_comm_level1);
E_dpx = E_dpx*GridVol;
E_dpy = E_dpy*GridVol;
E_dpz = E_dpz*GridVol;
cden_BG = system_charge/Cell_Volume;
E_dpx_BG = E_dpx_BG*GridVol*cden_BG;
E_dpy_BG = E_dpy_BG*GridVol*cden_BG;
E_dpz_BG = E_dpz_BG*GridVol*cden_BG;
/* contribution from core charge */
My_C_dpx = 0.0;
My_C_dpy = 0.0;
My_C_dpz = 0.0;
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
Gc_AN = M2G[Mc_AN];
x = Gxyz[Gc_AN][1];
y = Gxyz[Gc_AN][2];
z = Gxyz[Gc_AN][3];
spe = WhatSpecies[Gc_AN];
charge = Spe_Core_Charge[spe];
My_C_dpx += charge*x;
My_C_dpy += charge*y;
My_C_dpz += charge*z;
}
MPI_Allreduce(&My_C_dpx, &C_dpx, 1, MPI_DOUBLE, MPI_SUM, mpi_comm_level1);
MPI_Allreduce(&My_C_dpy, &C_dpy, 1, MPI_DOUBLE, MPI_SUM, mpi_comm_level1);
MPI_Allreduce(&My_C_dpz, &C_dpz, 1, MPI_DOUBLE, MPI_SUM, mpi_comm_level1);
AU2Debye = 2.54174776;
dipole_moment[0][1] = AU2Debye*(C_dpx - E_dpx - E_dpx_BG);
dipole_moment[0][2] = AU2Debye*(C_dpy - E_dpy - E_dpy_BG);
dipole_moment[0][3] = AU2Debye*(C_dpz - E_dpz - E_dpz_BG);
dipole_moment[1][1] = AU2Debye*C_dpx;
dipole_moment[1][2] = AU2Debye*C_dpy;
dipole_moment[1][3] = AU2Debye*C_dpz;
dipole_moment[2][1] = -AU2Debye*E_dpx;
dipole_moment[2][2] = -AU2Debye*E_dpy;
dipole_moment[2][3] = -AU2Debye*E_dpz;
dipole_moment[3][1] = -AU2Debye*E_dpx_BG;
dipole_moment[3][2] = -AU2Debye*E_dpy_BG;
dipole_moment[3][3] = -AU2Debye*E_dpz_BG;
AbsD = sqrt( dipole_moment[0][1]*dipole_moment[0][1]
+ dipole_moment[0][2]*dipole_moment[0][2]
+ dipole_moment[0][3]*dipole_moment[0][3] );
if (myid==Host_ID){
if (0<level_stdout){
printf("\n*******************************************************\n"); fflush(stdout);
printf(" Dipole moment (Debye) \n"); fflush(stdout);
printf("*******************************************************\n\n"); fflush(stdout);
printf(" Absolute D %17.8f\n\n",AbsD);
printf(" Dx Dy Dz\n"); fflush(stdout);
printf(" Total %17.8f %17.8f %17.8f\n",
dipole_moment[0][1],dipole_moment[0][2],dipole_moment[0][3]);fflush(stdout);
printf(" Core %17.8f %17.8f %17.8f\n",
dipole_moment[1][1],dipole_moment[1][2],dipole_moment[1][3]);fflush(stdout);
printf(" Electron %17.8f %17.8f %17.8f\n",
dipole_moment[2][1],dipole_moment[2][2],dipole_moment[2][3]);fflush(stdout);
printf(" Back ground %17.8f %17.8f %17.8f\n",
dipole_moment[3][1],dipole_moment[3][2],dipole_moment[3][3]);fflush(stdout);
}
/********************************************************
write the dipole moments to a file
********************************************************/
fnjoint(filepath,filename,file_DPM);
if ((fp_DPM = fopen(file_DPM,"w")) != NULL){
#ifdef xt3
setvbuf(fp_DPM,buf,_IOFBF,fp_bsize); /* setvbuf */
#endif
fprintf(fp_DPM,"\n");
fprintf(fp_DPM,"***********************************************************\n");
fprintf(fp_DPM,"***********************************************************\n");
fprintf(fp_DPM," Dipole moment (Debye) \n");
fprintf(fp_DPM,"***********************************************************\n");
fprintf(fp_DPM,"***********************************************************\n\n");
fprintf(fp_DPM," Absolute D %17.8f\n\n",AbsD);
fprintf(fp_DPM," Dx Dy Dz\n");
fprintf(fp_DPM," Total %17.8f %17.8f %17.8f\n",
dipole_moment[0][1],dipole_moment[0][2],dipole_moment[0][3]);
fprintf(fp_DPM," Core %17.8f %17.8f %17.8f\n",
dipole_moment[1][1],dipole_moment[1][2],dipole_moment[1][3]);
fprintf(fp_DPM," Electron %17.8f %17.8f %17.8f\n",
dipole_moment[2][1],dipole_moment[2][2],dipole_moment[2][3]);
fprintf(fp_DPM," Back ground %17.8f %17.8f %17.8f\n",
dipole_moment[3][1],dipole_moment[3][2],dipole_moment[3][3]);
fclose(fp_DPM);
}
else{
printf("Failure of saving the DPM file.\n");fflush(stdout);
}
}
}
void EH0_TwoCenter(int Gc_AN, int h_AN, double VH0ij[4])
{
int n1,ban;
int Gh_AN,Rn,wan1,wan2;
double dv,x,y,z,r,r2,xx,va0,rho0,dr_va0;
double z2,sum,sumr,sumx,sumy,sumz,wt;
Gh_AN = natn[Gc_AN][h_AN];
Rn = ncn[Gc_AN][h_AN];
wan1 = WhatSpecies[Gc_AN];
ban = Spe_Spe2Ban[wan1];
wan2 = WhatSpecies[Gh_AN];
dv = dv_EH0[ban];
sum = 0.0;
sumr = 0.0;
for (n1=0; n1<TGN_EH0[ban]; n1++){
x = GridX_EH0[ban][n1];
y = GridY_EH0[ban][n1];
z = GridZ_EH0[ban][n1];
rho0 = Arho_EH0[ban][n1];
wt = Wt_EH0[ban][n1];
z2 = z - Dis[Gc_AN][h_AN];
r2 = x*x + y*y + z2*z2;
r = sqrt(r2);
xx = 0.5*log(r2);
/* for empty atoms or finite elemens basis */
if (r<1.0e-10) r = 1.0e-10;
va0 = VH_AtomF(wan2,
Spe_Num_Mesh_VPS[wan2], xx, r,
Spe_VPS_XV[wan2], Spe_VPS_RV[wan2], Spe_VH_Atom[wan2]);
sum += wt*va0*rho0;
if (h_AN!=0 && 1.0e-14<r){
dr_va0 = Dr_VH_AtomF(wan2,
Spe_Num_Mesh_VPS[wan2], xx, r,
Spe_VPS_XV[wan2], Spe_VPS_RV[wan2], Spe_VH_Atom[wan2]);
sumr -= wt*rho0*dr_va0*z2/r;
}
}
sum = sum*dv;
if (h_AN!=0){
/* for empty atoms or finite elemens basis */
r = Dis[Gc_AN][h_AN];
if (r<1.0e-10) r = 1.0e-10;
x = Gxyz[Gc_AN][1] - (Gxyz[Gh_AN][1] + atv[Rn][1]);
y = Gxyz[Gc_AN][2] - (Gxyz[Gh_AN][2] + atv[Rn][2]);
z = Gxyz[Gc_AN][3] - (Gxyz[Gh_AN][3] + atv[Rn][3]);
sumr = sumr*dv;
sumx = sumr*x/r;
sumy = sumr*y/r;
sumz = sumr*z/r;
}
else{
sumx = 0.0;
sumy = 0.0;
sumz = 0.0;
}
VH0ij[0] = sum;
VH0ij[1] = sumx;
VH0ij[2] = sumy;
VH0ij[3] = sumz;
}
void EH0_TwoCenter_at_Cutoff(int wan1, int wan2, double VH0ij[4])
{
int n1,ban;
double dv,x,y,z,r1,r2,va0,rho0,dr_va0,rcut;
double z2,sum,sumr,sumx,sumy,sumz,wt,r,xx;
/* for OpenMP */
int OMPID,Nthrds,Nthrds0,Nprocs,Nloop;
double *my_sum_threads;
ban = Spe_Spe2Ban[wan1];
dv = dv_EH0[ban];
rcut = Spe_Atom_Cut1[wan1] + Spe_Atom_Cut1[wan2];
/* get Nthrds0 */
#pragma omp parallel shared(Nthrds0)
{
Nthrds0 = omp_get_num_threads();
}
/* allocation of array */
my_sum_threads = (double*)malloc(sizeof(double)*Nthrds0);
for (Nloop=0; Nloop<Nthrds0; Nloop++){
my_sum_threads[Nloop] = 0.0;
}
#pragma omp parallel shared(Spe_VH_Atom,Spe_VPS_XV,Spe_VPS_RV,Spe_Num_Mesh_VPS,wan2,Wt_EH0,my_sum_threads,rcut,Arho_EH0,GridZ_EH0,GridY_EH0,GridX_EH0,TGN_EH0,ban) private(n1,OMPID,Nthrds,Nprocs,x,y,z,rho0,wt,z2,r2,va0,r,xx)
{
/* get info. on OpenMP */
OMPID = omp_get_thread_num();
Nthrds = omp_get_num_threads();
Nprocs = omp_get_num_procs();
for (n1=OMPID*TGN_EH0[ban]/Nthrds; n1<(OMPID+1)*TGN_EH0[ban]/Nthrds; n1++){
x = GridX_EH0[ban][n1];
y = GridY_EH0[ban][n1];
z = GridZ_EH0[ban][n1];
rho0 = Arho_EH0[ban][n1];
wt = Wt_EH0[ban][n1];
z2 = z - rcut;
r2 = x*x + y*y + z2*z2;
r = sqrt(r2);
xx = 0.5*log(r2);
va0 = VH_AtomF(wan2,
Spe_Num_Mesh_VPS[wan2], xx, r,
Spe_VPS_XV[wan2], Spe_VPS_RV[wan2], Spe_VH_Atom[wan2]);
my_sum_threads[OMPID] += wt*va0*rho0;
}
} /* #pragma omp parallel */
sum = 0.0;
for (Nloop=0; Nloop<Nthrds0; Nloop++){
sum += my_sum_threads[Nloop];
}
sum = sum*dv;
sumx = 0.0;
sumy = 0.0;
sumz = 0.0;
VH0ij[0] = sum;
VH0ij[1] = sumx;
VH0ij[2] = sumy;
VH0ij[3] = sumz;
/* freeing of array */
free(my_sum_threads);
}
double Calc_Ehub()
{
/****************************************************
LDA+U energy correction added by MJ
****************************************************/
int Mc_AN,Gc_AN,wan1;
int cnt1,cnt2,l1,mul1,m1,l2,mul2,m2;
int spin,max_spin;
double My_Ehub,Ehub,Uvalue,tmpv,sum;
int numprocs,myid,ID;
/* added by S.Ryee */
int on_off,cnt_start,tmp_l1,ii,jj,kk,ll;
double Jvalue,tmpEhub1,tmpEhub2,tmpEhub3,tmpEhub4,trace_spin,trace_opp_spin;
int dd;
int NZUJ;
dcomplex N_00_ac,N_11_ac,N_00_bd,N_11_bd,N_01_ac,N_10_ac,N_01_bd,N_10_bd;
dcomplex AMF_00_ac,AMF_11_ac,AMF_00_bd,AMF_11_bd,AMF_01_ac,AMF_10_ac,AMF_01_bd,AMF_10_bd;
dcomplex trace_N00,trace_N11,trace_N01,trace_N10;
/*******************/
/* MPI */
MPI_Comm_size(mpi_comm_level1,&numprocs);
MPI_Comm_rank(mpi_comm_level1,&myid);
/****************************************************
caculation of My_Ehub
****************************************************/
if (SpinP_switch==0) max_spin = 0;
else if (SpinP_switch==1) max_spin = 1;
else if (SpinP_switch==3) max_spin = 1;
My_Ehub = 0.0;
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
Gc_AN = M2G[Mc_AN];
wan1 = WhatSpecies[Gc_AN];
/****************************************************
collinear case
****************************************************/
if (SpinP_switch!=3){
switch (Hub_Type){
case 1: /* Dudarev form */
for (spin=0; spin<=max_spin; spin++){
/* Hubbard term, 0.5*Tr(N) */
cnt1 = 0;
for(l1=0; l1<=Spe_MaxL_Basis[wan1]; l1++ ){
for(mul1=0; mul1<Spe_Num_Basis[wan1][l1]; mul1++){
Uvalue = Hub_U_Basis[wan1][l1][mul1];
for(m1=0; m1<(2*l1+1); m1++){
tmpv = 0.5*Uvalue*DM_onsite[0][spin][Mc_AN][cnt1][cnt1];
My_Ehub += tmpv;
cnt1++;
}
}
}
/* Hubbard term, -0.5*Tr(N*N) */
cnt1 = 0;
for(l1=0; l1<=Spe_MaxL_Basis[wan1]; l1++ ){
for(mul1=0; mul1<Spe_Num_Basis[wan1][l1]; mul1++){
for(m1=0; m1<(2*l1+1); m1++){
sum = 0.0;
cnt2 = 0;
for(l2=0; l2<=Spe_MaxL_Basis[wan1]; l2++ ){
for(mul2=0; mul2<Spe_Num_Basis[wan1][l2]; mul2++){
for(m2=0; m2<(2*l2+1); m2++){
if (l1==l2 && mul1==mul2){
Uvalue = Hub_U_Basis[wan1][l1][mul1];
sum -= 0.5*Uvalue*DM_onsite[0][spin][Mc_AN][cnt1][cnt2]*
DM_onsite[0][spin][Mc_AN][cnt2][cnt1];
}
cnt2++;
}
}
}
My_Ehub += sum;
cnt1++;
}
}
}
} /* spin */
break;
case 2: /* general form by S.Ryee */
/* U Energy */
for(l1=0; l1<=Spe_MaxL_Basis[wan1]; l1++){
for(mul1=0; mul1<Spe_Num_Basis[wan1][l1]; mul1++){
Uvalue = Hub_U_Basis[wan1][l1][mul1];
Jvalue = Hund_J_Basis[wan1][l1][mul1];
NZUJ = Nonzero_UJ[wan1][l1][mul1];
if(NZUJ>0){
cnt_start = 0;
switch (mul1){
case 0: /* mul1 = 0 */
if(l1 > 0){
for(tmp_l1=0; tmp_l1<l1; tmp_l1++){
cnt_start += (2*tmp_l1+1)*Spe_Num_Basis[wan1][tmp_l1];
}
}
else{ /* l1 = 0 */
cnt_start = 0;
}
break;
case 1: /* mul1 = 1 */
if(l1 > 0){
for(tmp_l1=0; tmp_l1<l1; tmp_l1++){
cnt_start += (2*tmp_l1+1)*Spe_Num_Basis[wan1][tmp_l1];
}
cnt_start += (2*l1+1)*mul1;
}
else{ /* l1 = 0 */
cnt_start = (2*l1+1)*mul1;
}
break;
} /* switch (mul1) */
trace_spin = 0.0;
trace_opp_spin = 0.0;
for(ii=0; ii<(2*l1+1); ii++){
trace_spin += DM_onsite[0][0][Mc_AN][cnt_start+ii][cnt_start+ii];
trace_opp_spin += DM_onsite[0][1][Mc_AN][cnt_start+ii][cnt_start+ii];
}
/* dc Energy */
if(dc_Type==1){ /* sFLL */
My_Ehub -= 0.5*(Uvalue)*(trace_spin+trace_opp_spin)*(trace_spin+trace_opp_spin-1.0)
-0.5*(Jvalue)*(trace_spin*(trace_spin-1.0)+trace_opp_spin*(trace_opp_spin-1.0));
} /* sFLL */
if(dc_Type==3){ /* cFLL */
My_Ehub -= 0.5*(Uvalue)*(trace_spin+trace_opp_spin)*(trace_spin+trace_opp_spin-1.0)
-0.25*(Jvalue)*(trace_spin+trace_opp_spin)*(trace_spin+trace_opp_spin-2.0);
} /* cFLL */
/*f(dc_Type==3){
My_Ehub -= dc_alpha[count]*(0.5*(Uvalue)*(trace_spin+trace_opp_spin)*(trace_spin+trace_opp_spin-1.0)
-0.5*(Jvalue)*(trace_spin*(trace_spin-1.0)+trace_opp_spin*(trace_opp_spin-1.0)));
} */
/* loop start for interaction energy */
for(ii=0; ii<(2*l1+1); ii++){
for(jj=0; jj<(2*l1+1); jj++){
for(kk=0; kk<(2*l1+1); kk++){
for(ll=0; ll<(2*l1+1); ll++){
switch(dc_Type){
case 1: /* sFLL */
tmpEhub1 = 0.5*Coulomb_Array[NZUJ][ii][jj][kk][ll]*
(DM_onsite[0][0][Mc_AN][cnt_start+ii][cnt_start+kk]*
DM_onsite[0][1][Mc_AN][cnt_start+jj][cnt_start+ll]
+DM_onsite[0][1][Mc_AN][cnt_start+ii][cnt_start+kk]*
DM_onsite[0][0][Mc_AN][cnt_start+jj][cnt_start+ll]);
tmpEhub2 = 0.5*(Coulomb_Array[NZUJ][ii][jj][kk][ll]-Coulomb_Array[NZUJ][ii][jj][ll][kk])*
(DM_onsite[0][0][Mc_AN][cnt_start+ii][cnt_start+kk]*
DM_onsite[0][0][Mc_AN][cnt_start+jj][cnt_start+ll]
+DM_onsite[0][1][Mc_AN][cnt_start+ii][cnt_start+kk]*
DM_onsite[0][1][Mc_AN][cnt_start+jj][cnt_start+ll]);
My_Ehub += tmpEhub1 + tmpEhub2;
break;
case 2: /* sAMF */
tmpEhub1 = 0.5*Coulomb_Array[NZUJ][ii][jj][kk][ll]*
(AMF_Array[NZUJ][0][0][ii][kk]*
AMF_Array[NZUJ][1][0][jj][ll]
+AMF_Array[NZUJ][1][0][ii][kk]*
AMF_Array[NZUJ][0][0][jj][ll]);
tmpEhub2 = 0.5*(Coulomb_Array[NZUJ][ii][jj][kk][ll]-Coulomb_Array[NZUJ][ii][jj][ll][kk])*
(AMF_Array[NZUJ][0][0][ii][kk]*
AMF_Array[NZUJ][0][0][jj][ll]
+AMF_Array[NZUJ][1][0][ii][kk]*
AMF_Array[NZUJ][1][0][jj][ll]);
My_Ehub += tmpEhub1 + tmpEhub2;
break;
case 3: /* cFLL */
tmpEhub1 = 0.5*Coulomb_Array[NZUJ][ii][jj][kk][ll]*
(DM_onsite[0][0][Mc_AN][cnt_start+ii][cnt_start+kk]*
DM_onsite[0][1][Mc_AN][cnt_start+jj][cnt_start+ll]
+DM_onsite[0][1][Mc_AN][cnt_start+ii][cnt_start+kk]*
DM_onsite[0][0][Mc_AN][cnt_start+jj][cnt_start+ll]);
tmpEhub2 = 0.5*(Coulomb_Array[NZUJ][ii][jj][kk][ll]-Coulomb_Array[NZUJ][ii][jj][ll][kk])*
(DM_onsite[0][0][Mc_AN][cnt_start+ii][cnt_start+kk]*
DM_onsite[0][0][Mc_AN][cnt_start+jj][cnt_start+ll]
+DM_onsite[0][1][Mc_AN][cnt_start+ii][cnt_start+kk]*
DM_onsite[0][1][Mc_AN][cnt_start+jj][cnt_start+ll]);
My_Ehub += tmpEhub1 + tmpEhub2;
break;
case 4: /* cAMF */
tmpEhub1 = 0.5*Coulomb_Array[NZUJ][ii][jj][kk][ll]*
(AMF_Array[NZUJ][0][0][ii][kk]*
AMF_Array[NZUJ][1][0][jj][ll]
+AMF_Array[NZUJ][1][0][ii][kk]*
AMF_Array[NZUJ][0][0][jj][ll]);
tmpEhub2 = 0.5*(Coulomb_Array[NZUJ][ii][jj][kk][ll]-Coulomb_Array[NZUJ][ii][jj][ll][kk])*
(AMF_Array[NZUJ][0][0][ii][kk]*
AMF_Array[NZUJ][0][0][jj][ll]
+AMF_Array[NZUJ][1][0][ii][kk]*
AMF_Array[NZUJ][1][0][jj][ll]);
My_Ehub += tmpEhub1 + tmpEhub2;
break;
/* case 3:
tmpEhub1 = 0.5*dc_alpha[count]*(Coulomb_Array[count][ii][jj][kk][ll]*
(DM_onsite[0][0][Mc_AN][cnt_start+ii][cnt_start+kk]*
DM_onsite[0][1][Mc_AN][cnt_start+jj][cnt_start+ll]
+DM_onsite[0][1][Mc_AN][cnt_start+ii][cnt_start+kk]*
DM_onsite[0][0][Mc_AN][cnt_start+jj][cnt_start+ll]));
tmpEhub2 = 0.5*dc_alpha[count]*((Coulomb_Array[count][ii][jj][kk][ll]-Coulomb_Array[count][ii][jj][ll][kk])*
(DM_onsite[0][0][Mc_AN][cnt_start+ii][cnt_start+kk]*
DM_onsite[0][0][Mc_AN][cnt_start+jj][cnt_start+ll]
+DM_onsite[0][1][Mc_AN][cnt_start+ii][cnt_start+kk]*
DM_onsite[0][1][Mc_AN][cnt_start+jj][cnt_start+ll]));
tmpEhub3 = 0.5*(1.0-dc_alpha[count])*(Coulomb_Array[count][ii][jj][kk][ll]*
(AMF_Array[count][0][0][ii][kk]*
AMF_Array[count][1][0][jj][ll]
+AMF_Array[count][1][0][ii][kk]*
AMF_Array[count][0][0][jj][ll]));
tmpEhub4 = 0.5*(1.0-dc_alpha[count])*((Coulomb_Array[count][ii][jj][kk][ll]-Coulomb_Array[count][ii][jj][ll][kk])*
(AMF_Array[count][0][0][ii][kk]*
AMF_Array[count][0][0][jj][ll]
+AMF_Array[count][1][0][ii][kk]*
AMF_Array[count][1][0][jj][ll]));
My_Ehub += tmpEhub1 + tmpEhub2 + tmpEhub3 + tmpEhub4;
break; */
} /* switch dc_Type */
}
}
}
}
}
} /* mul1 */
} /* l1 */
break;
} /* Hub_Type */
} /* SpinP_switch */
/****************************************************
non-collinear case
****************************************************/
else {
switch (Hub_Type){
case 1: /* Dudarev form */
/* Hubbard term, 0.5*Tr(N) */
cnt1 = 0;
for(l1=0; l1<=Spe_MaxL_Basis[wan1]; l1++ ){
for(mul1=0; mul1<Spe_Num_Basis[wan1][l1]; mul1++){
Uvalue = Hub_U_Basis[wan1][l1][mul1];
for(m1=0; m1<(2*l1+1); m1++){
tmpv = 0.5*Uvalue*( NC_OcpN[0][0][0][Mc_AN][cnt1][cnt1].r
+ NC_OcpN[0][1][1][Mc_AN][cnt1][cnt1].r);
My_Ehub += tmpv;
cnt1++;
}
}
}
/* Hubbard term, -0.5*Tr(N*N) */
cnt1 = 0;
for(l1=0; l1<=Spe_MaxL_Basis[wan1]; l1++ ){
for(mul1=0; mul1<Spe_Num_Basis[wan1][l1]; mul1++){
for(m1=0; m1<(2*l1+1); m1++){
sum = 0.0;
cnt2 = 0;
for(l2=0; l2<=Spe_MaxL_Basis[wan1]; l2++ ){
for(mul2=0; mul2<Spe_Num_Basis[wan1][l2]; mul2++){
for(m2=0; m2<(2*l2+1); m2++){
if (l1==l2 && mul1==mul2){
Uvalue = Hub_U_Basis[wan1][l1][mul1];
sum -= 0.5*Uvalue*( NC_OcpN[0][0][0][Mc_AN][cnt1][cnt2].r*
NC_OcpN[0][0][0][Mc_AN][cnt1][cnt2].r
+
NC_OcpN[0][0][0][Mc_AN][cnt1][cnt2].i*
NC_OcpN[0][0][0][Mc_AN][cnt1][cnt2].i
+
NC_OcpN[0][0][1][Mc_AN][cnt1][cnt2].r*
NC_OcpN[0][0][1][Mc_AN][cnt1][cnt2].r
+
NC_OcpN[0][0][1][Mc_AN][cnt1][cnt2].i*
NC_OcpN[0][0][1][Mc_AN][cnt1][cnt2].i
+
NC_OcpN[0][1][0][Mc_AN][cnt1][cnt2].r*
NC_OcpN[0][1][0][Mc_AN][cnt1][cnt2].r
+
NC_OcpN[0][1][0][Mc_AN][cnt1][cnt2].i*
NC_OcpN[0][1][0][Mc_AN][cnt1][cnt2].i
+
NC_OcpN[0][1][1][Mc_AN][cnt1][cnt2].r*
NC_OcpN[0][1][1][Mc_AN][cnt1][cnt2].r
+
NC_OcpN[0][1][1][Mc_AN][cnt1][cnt2].i*
NC_OcpN[0][1][1][Mc_AN][cnt1][cnt2].i );
}
cnt2++;
}
}
}
My_Ehub += sum;
cnt1++;
} /* m1 */
} /* mul1 */
} /* l1 */
break;
case 2: /* general form by S.Ryee */
/* U Energy */
for(l1=0; l1<=Spe_MaxL_Basis[wan1]; l1++ ){
for(mul1=0; mul1<Spe_Num_Basis[wan1][l1]; mul1++){
Uvalue = Hub_U_Basis[wan1][l1][mul1];
Jvalue = Hund_J_Basis[wan1][l1][mul1];
NZUJ = Nonzero_UJ[wan1][l1][mul1];
if(NZUJ>0){
cnt_start = 0;
switch (mul1){
case 0: /* mul1 = 0 */
if(l1 > 0){
for(tmp_l1=0; tmp_l1<l1; tmp_l1++){
cnt_start += (2*tmp_l1+1)*Spe_Num_Basis[wan1][tmp_l1];
}
}
else{ /* l1 = 0 */
cnt_start = 0;
}
break;
case 1: /* mul1 = 1 */
if(l1 > 0){
for(tmp_l1=0; tmp_l1<l1; tmp_l1++){
cnt_start += (2*tmp_l1+1)*Spe_Num_Basis[wan1][tmp_l1];
}
cnt_start += (2*l1+1)*mul1;
}
else{ /* l1 = 0 */
cnt_start = (2*l1+1)*mul1;
}
break;
} /* switch (mul1) */
trace_N00.r = 0.0;
trace_N00.i = 0.0;
trace_N11.r = 0.0;
trace_N11.i = 0.0;
trace_N01.r = 0.0;
trace_N01.i = 0.0;
trace_N10.r = 0.0;
trace_N10.i = 0.0;
for(dd=0; dd<(2*l1+1); dd++){
trace_N00.r += NC_OcpN[0][0][0][Mc_AN][cnt_start+dd][cnt_start+dd].r;
trace_N00.i += NC_OcpN[0][0][0][Mc_AN][cnt_start+dd][cnt_start+dd].i;
trace_N11.r += NC_OcpN[0][1][1][Mc_AN][cnt_start+dd][cnt_start+dd].r;
trace_N11.i += NC_OcpN[0][1][1][Mc_AN][cnt_start+dd][cnt_start+dd].i;
trace_N01.r += NC_OcpN[0][0][1][Mc_AN][cnt_start+dd][cnt_start+dd].r;
trace_N01.i += NC_OcpN[0][0][1][Mc_AN][cnt_start+dd][cnt_start+dd].i;
trace_N10.r += NC_OcpN[0][1][0][Mc_AN][cnt_start+dd][cnt_start+dd].r;
trace_N10.i += NC_OcpN[0][1][0][Mc_AN][cnt_start+dd][cnt_start+dd].i;
}
/* Double counting energy */
if(dc_Type==1){ /* sFLL */
My_Ehub -= 0.5*(Uvalue)*(trace_N00.r+trace_N11.r)*(trace_N00.r+trace_N11.r-1.0)
-0.5*(Jvalue)*(Cmul(trace_N00,Csub(trace_N00,Complex(1.0,0.0))).r
+Cmul(trace_N11,Csub(trace_N11,Complex(1.0,0.0))).r);
My_Ehub -=-0.5*(Jvalue)*(Cmul(trace_N01,trace_N10).r + Cmul(trace_N10,trace_N01).r);
} /* sFLL */
if(dc_Type==3){ /* cFLL */
My_Ehub -= 0.5*(Uvalue)*(trace_N00.r+trace_N11.r)*(trace_N00.r+trace_N11.r-1.0)
-0.25*(Jvalue)*(trace_N00.r+trace_N11.r)*(trace_N00.r+trace_N11.r-2.0);
} /* cFLL */
/* if(dc_Type==3){
My_Ehub -= dc_alpha[count]*(0.5*(Uvalue)*(trace_N00.r+trace_N11.r)*(trace_N00.r+trace_N11.r-1.0)
-0.5*(Jvalue)*(Cmul(trace_N00,Csub(trace_N00,Complex(1.0,0.0))).r
+Cmul(trace_N11,Csub(trace_N11,Complex(1.0,0.0))).r));
My_Ehub -=-dc_alpha[count]*(0.5*(Jvalue)*(Cmul(trace_N01,trace_N10).r + Cmul(trace_N10,trace_N01).r));
} */
/* loop start for interaction energy */
for(ii=0; ii<(2*l1+1); ii++){
for(jj=0; jj<(2*l1+1); jj++){
for(kk=0; kk<(2*l1+1); kk++){
for(ll=0; ll<(2*l1+1); ll++){
switch(dc_Type){
case 1: /* sFLL */
N_00_ac.r=NC_OcpN[0][0][0][Mc_AN][cnt_start+ii][cnt_start+kk].r;
N_00_ac.i=NC_OcpN[0][0][0][Mc_AN][cnt_start+ii][cnt_start+kk].i;
N_11_ac.r=NC_OcpN[0][1][1][Mc_AN][cnt_start+ii][cnt_start+kk].r;
N_11_ac.i=NC_OcpN[0][1][1][Mc_AN][cnt_start+ii][cnt_start+kk].i;
N_00_bd.r=NC_OcpN[0][0][0][Mc_AN][cnt_start+jj][cnt_start+ll].r;
N_00_bd.i=NC_OcpN[0][0][0][Mc_AN][cnt_start+jj][cnt_start+ll].i;
N_11_bd.r=NC_OcpN[0][1][1][Mc_AN][cnt_start+jj][cnt_start+ll].r;
N_11_bd.i=NC_OcpN[0][1][1][Mc_AN][cnt_start+jj][cnt_start+ll].i;
N_01_ac.r=NC_OcpN[0][0][1][Mc_AN][cnt_start+ii][cnt_start+kk].r;
N_01_ac.i=NC_OcpN[0][0][1][Mc_AN][cnt_start+ii][cnt_start+kk].i;
N_10_ac.r=NC_OcpN[0][1][0][Mc_AN][cnt_start+ii][cnt_start+kk].r;
N_10_ac.i=NC_OcpN[0][1][0][Mc_AN][cnt_start+ii][cnt_start+kk].i;
N_01_bd.r=NC_OcpN[0][0][1][Mc_AN][cnt_start+jj][cnt_start+ll].r;
N_01_bd.i=NC_OcpN[0][0][1][Mc_AN][cnt_start+jj][cnt_start+ll].i;
N_10_bd.r=NC_OcpN[0][1][0][Mc_AN][cnt_start+jj][cnt_start+ll].r;
N_10_bd.i=NC_OcpN[0][1][0][Mc_AN][cnt_start+jj][cnt_start+ll].i;
/* diagonal term */
tmpEhub1 = 0.5*Coulomb_Array[NZUJ][ii][jj][kk][ll]*
(Cmul(N_00_ac,N_00_bd).r + Cmul(N_11_ac,N_11_bd).r
+Cmul(N_00_ac,N_11_bd).r + Cmul(N_11_ac,N_00_bd).r)
-0.5*Coulomb_Array[NZUJ][ii][jj][ll][kk]*
(Cmul(N_00_ac,N_00_bd).r + Cmul(N_11_ac,N_11_bd).r);
/* off-diagonal term */
tmpEhub2 = -0.5*Coulomb_Array[NZUJ][ii][jj][ll][kk]*
(Cmul(N_01_ac,N_10_bd).r + Cmul(N_10_ac,N_01_bd).r);
/* LDA+U energy */
My_Ehub += tmpEhub1 + tmpEhub2;
break;
case 2: /* sAMF */
N_00_ac.r=AMF_Array[NZUJ][0][0][ii][kk];
N_00_ac.i=AMF_Array[NZUJ][0][1][ii][kk];
N_11_ac.r=AMF_Array[NZUJ][1][0][ii][kk];
N_11_ac.i=AMF_Array[NZUJ][1][1][ii][kk];
N_00_bd.r=AMF_Array[NZUJ][0][0][jj][ll];
N_00_bd.i=AMF_Array[NZUJ][0][1][jj][ll];
N_11_bd.r=AMF_Array[NZUJ][1][0][jj][ll];
N_11_bd.i=AMF_Array[NZUJ][1][1][jj][ll];
N_01_ac.r=AMF_Array[NZUJ][2][0][ii][kk];
N_01_ac.i=AMF_Array[NZUJ][2][1][ii][kk];
N_10_ac.r=AMF_Array[NZUJ][3][0][ii][kk];
N_10_ac.i=AMF_Array[NZUJ][3][1][ii][kk];
N_01_bd.r=AMF_Array[NZUJ][2][0][jj][ll];
N_01_bd.i=AMF_Array[NZUJ][2][1][jj][ll];
N_10_bd.r=AMF_Array[NZUJ][3][0][jj][ll];
N_10_bd.i=AMF_Array[NZUJ][3][1][jj][ll];
/* diagonal term */
tmpEhub1 = 0.5*Coulomb_Array[NZUJ][ii][jj][kk][ll]*
(Cmul(N_00_ac,N_00_bd).r + Cmul(N_11_ac,N_11_bd).r
+Cmul(N_00_ac,N_11_bd).r + Cmul(N_11_ac,N_00_bd).r)
-0.5*Coulomb_Array[NZUJ][ii][jj][ll][kk]*
(Cmul(N_00_ac,N_00_bd).r + Cmul(N_11_ac,N_11_bd).r);
/* off-diagonal term */
tmpEhub2 = -0.5*Coulomb_Array[NZUJ][ii][jj][ll][kk]*
(Cmul(N_01_ac,N_10_bd).r + Cmul(N_10_ac,N_01_bd).r);
/* LDA+U energy */
My_Ehub += tmpEhub1 + tmpEhub2;
break;
case 3: /* cFLL */
N_00_ac.r=NC_OcpN[0][0][0][Mc_AN][cnt_start+ii][cnt_start+kk].r;
N_00_ac.i=NC_OcpN[0][0][0][Mc_AN][cnt_start+ii][cnt_start+kk].i;
N_11_ac.r=NC_OcpN[0][1][1][Mc_AN][cnt_start+ii][cnt_start+kk].r;
N_11_ac.i=NC_OcpN[0][1][1][Mc_AN][cnt_start+ii][cnt_start+kk].i;
N_00_bd.r=NC_OcpN[0][0][0][Mc_AN][cnt_start+jj][cnt_start+ll].r;
N_00_bd.i=NC_OcpN[0][0][0][Mc_AN][cnt_start+jj][cnt_start+ll].i;
N_11_bd.r=NC_OcpN[0][1][1][Mc_AN][cnt_start+jj][cnt_start+ll].r;
N_11_bd.i=NC_OcpN[0][1][1][Mc_AN][cnt_start+jj][cnt_start+ll].i;
N_01_ac.r=NC_OcpN[0][0][1][Mc_AN][cnt_start+ii][cnt_start+kk].r;
N_01_ac.i=NC_OcpN[0][0][1][Mc_AN][cnt_start+ii][cnt_start+kk].i;
N_10_ac.r=NC_OcpN[0][1][0][Mc_AN][cnt_start+ii][cnt_start+kk].r;
N_10_ac.i=NC_OcpN[0][1][0][Mc_AN][cnt_start+ii][cnt_start+kk].i;
N_01_bd.r=NC_OcpN[0][0][1][Mc_AN][cnt_start+jj][cnt_start+ll].r;
N_01_bd.i=NC_OcpN[0][0][1][Mc_AN][cnt_start+jj][cnt_start+ll].i;
N_10_bd.r=NC_OcpN[0][1][0][Mc_AN][cnt_start+jj][cnt_start+ll].r;
N_10_bd.i=NC_OcpN[0][1][0][Mc_AN][cnt_start+jj][cnt_start+ll].i;
/* diagonal term */
tmpEhub1 = 0.5*Coulomb_Array[NZUJ][ii][jj][kk][ll]*
(Cmul(N_00_ac,N_00_bd).r + Cmul(N_11_ac,N_11_bd).r
+Cmul(N_00_ac,N_11_bd).r + Cmul(N_11_ac,N_00_bd).r)
-0.5*Coulomb_Array[NZUJ][ii][jj][ll][kk]*
(Cmul(N_00_ac,N_00_bd).r + Cmul(N_11_ac,N_11_bd).r);
/* off-diagonal term */
tmpEhub2 = -0.5*Coulomb_Array[NZUJ][ii][jj][ll][kk]*
(Cmul(N_01_ac,N_10_bd).r + Cmul(N_10_ac,N_01_bd).r);
/* LDA+U energy */
My_Ehub += tmpEhub1 + tmpEhub2;
break;
case 4: /* cAMF */
N_00_ac.r=AMF_Array[NZUJ][0][0][ii][kk];
N_00_ac.i=AMF_Array[NZUJ][0][1][ii][kk];
N_11_ac.r=AMF_Array[NZUJ][1][0][ii][kk];
N_11_ac.i=AMF_Array[NZUJ][1][1][ii][kk];
N_00_bd.r=AMF_Array[NZUJ][0][0][jj][ll];
N_00_bd.i=AMF_Array[NZUJ][0][1][jj][ll];
N_11_bd.r=AMF_Array[NZUJ][1][0][jj][ll];
N_11_bd.i=AMF_Array[NZUJ][1][1][jj][ll];
N_01_ac.r=AMF_Array[NZUJ][2][0][ii][kk];
N_01_ac.i=AMF_Array[NZUJ][2][1][ii][kk];
N_10_ac.r=AMF_Array[NZUJ][3][0][ii][kk];
N_10_ac.i=AMF_Array[NZUJ][3][1][ii][kk];
N_01_bd.r=AMF_Array[NZUJ][2][0][jj][ll];
N_01_bd.i=AMF_Array[NZUJ][2][1][jj][ll];
N_10_bd.r=AMF_Array[NZUJ][3][0][jj][ll];
N_10_bd.i=AMF_Array[NZUJ][3][1][jj][ll];
/* diagonal term */
tmpEhub1 = 0.5*Coulomb_Array[NZUJ][ii][jj][kk][ll]*
(Cmul(N_00_ac,N_00_bd).r + Cmul(N_11_ac,N_11_bd).r
+Cmul(N_00_ac,N_11_bd).r + Cmul(N_11_ac,N_00_bd).r)
-0.5*Coulomb_Array[NZUJ][ii][jj][ll][kk]*
(Cmul(N_00_ac,N_00_bd).r + Cmul(N_11_ac,N_11_bd).r);
/* off-diagonal term */
tmpEhub2 = -0.5*Coulomb_Array[NZUJ][ii][jj][ll][kk]*
(Cmul(N_01_ac,N_10_bd).r + Cmul(N_10_ac,N_01_bd).r);
/* LDA+U energy */
My_Ehub += tmpEhub1 + tmpEhub2;
break;
/* case 3:
N_00_ac.r=NC_OcpN[0][0][0][Mc_AN][cnt_start+ii][cnt_start+kk].r;
N_00_ac.i=NC_OcpN[0][0][0][Mc_AN][cnt_start+ii][cnt_start+kk].i;
N_11_ac.r=NC_OcpN[0][1][1][Mc_AN][cnt_start+ii][cnt_start+kk].r;
N_11_ac.i=NC_OcpN[0][1][1][Mc_AN][cnt_start+ii][cnt_start+kk].i;
N_00_bd.r=NC_OcpN[0][0][0][Mc_AN][cnt_start+jj][cnt_start+ll].r;
N_00_bd.i=NC_OcpN[0][0][0][Mc_AN][cnt_start+jj][cnt_start+ll].i;
N_11_bd.r=NC_OcpN[0][1][1][Mc_AN][cnt_start+jj][cnt_start+ll].r;
N_11_bd.i=NC_OcpN[0][1][1][Mc_AN][cnt_start+jj][cnt_start+ll].i;
N_01_ac.r=NC_OcpN[0][0][1][Mc_AN][cnt_start+ii][cnt_start+kk].r;
N_01_ac.i=NC_OcpN[0][0][1][Mc_AN][cnt_start+ii][cnt_start+kk].i;
N_10_ac.r=NC_OcpN[0][1][0][Mc_AN][cnt_start+ii][cnt_start+kk].r;
N_10_ac.i=NC_OcpN[0][1][0][Mc_AN][cnt_start+ii][cnt_start+kk].i;
N_01_bd.r=NC_OcpN[0][0][1][Mc_AN][cnt_start+jj][cnt_start+ll].r;
N_01_bd.i=NC_OcpN[0][0][1][Mc_AN][cnt_start+jj][cnt_start+ll].i;
N_10_bd.r=NC_OcpN[0][1][0][Mc_AN][cnt_start+jj][cnt_start+ll].r;
N_10_bd.i=NC_OcpN[0][1][0][Mc_AN][cnt_start+jj][cnt_start+ll].i;
AMF_00_ac.r=AMF_Array[count][0][0][ii][kk];
AMF_00_ac.i=AMF_Array[count][0][1][ii][kk];
AMF_11_ac.r=AMF_Array[count][1][0][ii][kk];
AMF_11_ac.i=AMF_Array[count][1][1][ii][kk];
AMF_00_bd.r=AMF_Array[count][0][0][jj][ll];
AMF_00_bd.i=AMF_Array[count][0][1][jj][ll];
AMF_11_bd.r=AMF_Array[count][1][0][jj][ll];
AMF_11_bd.i=AMF_Array[count][1][1][jj][ll];
AMF_01_ac.r=AMF_Array[count][2][0][ii][kk];
AMF_01_ac.i=AMF_Array[count][2][1][ii][kk];
AMF_10_ac.r=AMF_Array[count][3][0][ii][kk];
AMF_10_ac.i=AMF_Array[count][3][1][ii][kk];
AMF_01_bd.r=AMF_Array[count][2][0][jj][ll];
AMF_01_bd.i=AMF_Array[count][2][1][jj][ll];
AMF_10_bd.r=AMF_Array[count][3][0][jj][ll];
AMF_10_bd.i=AMF_Array[count][3][1][jj][ll];
tmpEhub1 = 0.5*Coulomb_Array[count][ii][jj][kk][ll]*
(Cmul(N_00_ac,N_00_bd).r + Cmul(N_11_ac,N_11_bd).r
+Cmul(N_00_ac,N_11_bd).r + Cmul(N_11_ac,N_00_bd).r)
-0.5*Coulomb_Array[count][ii][jj][ll][kk]*
(Cmul(N_00_ac,N_00_bd).r + Cmul(N_11_ac,N_11_bd).r);
tmpEhub2 = -0.5*Coulomb_Array[count][ii][jj][ll][kk]*
(Cmul(N_01_ac,N_10_bd).r + Cmul(N_10_ac,N_01_bd).r);
tmpEhub3 = 0.5*Coulomb_Array[count][ii][jj][kk][ll]*
(Cmul(AMF_00_ac,AMF_00_bd).r + Cmul(AMF_11_ac,AMF_11_bd).r
+Cmul(AMF_00_ac,AMF_11_bd).r + Cmul(AMF_11_ac,AMF_00_bd).r)
-0.5*Coulomb_Array[count][ii][jj][ll][kk]*
(Cmul(AMF_00_ac,AMF_00_bd).r + Cmul(AMF_11_ac,AMF_11_bd).r);
tmpEhub4 = -0.5*Coulomb_Array[count][ii][jj][ll][kk]*
(Cmul(AMF_01_ac,AMF_10_bd).r + Cmul(AMF_10_ac,AMF_01_bd).r);
My_Ehub += dc_alpha[count]*(tmpEhub1+tmpEhub2) + (1.0-dc_alpha[count])*(tmpEhub3+tmpEhub4);
break; */
} /* dc switch */
}
}
}
}
} /* Uvalue != 0.0 || Jvalue != 0.0 */
} /* mul1 */
} /* l1 */
break;
} /* Hub_Type */
} /* SpinP_switch */
} /* Mc_AN */
if (SpinP_switch==0) My_Ehub = 2.0*My_Ehub;
/****************************************************
MPI My_Ehub
****************************************************/
MPI_Allreduce(&My_Ehub, &Ehub, 1, MPI_DOUBLE, MPI_SUM, mpi_comm_level1);
/* if (F_U_flag==0) */
if (F_U_flag==0) Ehub = 0.0;
return Ehub;
}
/* okuno */
double Calc_EdftD()
{
/************************************************
The subroutine calculates the semiemprical
vdW correction to DFT-GGA proposed by
S. Grimme, J. Comput. Chem. 27, 1787 (2006).
*************************************************/
double My_EdftD,EdftD;
double rij[4],fdamp,fdamp2;
double rij0[4],par;
double dist,dist6,dist2;
double exparg,expval;
double rcut_dftD2;
int numprocs,myid,ID;
int Mc_AN,Gc_AN,wanA,wanB;
int Gc_BN;
int nrm,nr;
int i,j;
int n1,n2,n3;
int per_flag1,per_flag2;
int n1_max,n2_max,n3_max;
double test_ene;
double dblcnt_factor;
double E,dEx,dEy,dEz,dist7;
/* MPI */
MPI_Comm_size(mpi_comm_level1,&numprocs);
MPI_Comm_rank(mpi_comm_level1,&myid);
My_EdftD = 0.0;
EdftD = 0.0;
rcut_dftD2 = rcut_dftD*rcut_dftD;
dblcnt_factor = 0.5;
/* here we calculate DFT-D dispersion energy */
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
E = 0.0;
dEx = 0.0;
dEy = 0.0;
dEz = 0.0;
Gc_AN = M2G[Mc_AN];
wanA = WhatSpecies[Gc_AN];
per_flag1 = (int)Gxyz[Gc_AN][60];
for(Gc_BN=1; Gc_BN<=atomnum; Gc_BN++){
wanB = WhatSpecies[Gc_BN];
per_flag2 = (int)Gxyz[Gc_BN][60];
rij0[1] = Gxyz[Gc_AN][1] - Gxyz[Gc_BN][1];
rij0[2] = Gxyz[Gc_AN][2] - Gxyz[Gc_BN][2];
rij0[3] = Gxyz[Gc_AN][3] - Gxyz[Gc_BN][3];
par = beta_dftD/(Rsum_dftD[wanA][wanB]);
if (per_flag1==0 && per_flag2==0){
n1_max = 0;
n2_max = 0;
n3_max = 0;
}
else if (per_flag1==0 && per_flag2==1){
n1_max = n1_DFT_D;
n2_max = n2_DFT_D;
n3_max = n3_DFT_D;
}
else if (per_flag1==1 && per_flag2==0){
n1_max = 0;
n2_max = 0;
n3_max = 0;
}
else if (per_flag1==1 && per_flag2==1){
n1_max = n1_DFT_D;
n2_max = n2_DFT_D;
n3_max = n3_DFT_D;
}
/*
printf("Gc_AN=%2d Gc_BN=%2d %2d %2d %2d %2d %2d\n",Gc_AN,Gc_BN,per_flag1,per_flag2,n1_max,n2_max,n3_max);
*/
for (n1=-n1_max; n1<=n1_max; n1++){
for (n2=-n2_max; n2<=n2_max; n2++){
for (n3=-n3_max; n3<=n3_max; n3++){
/* for double counting */
if((!(abs(n1)+abs(n2)+abs(n3))==0) && (per_flag1==0 && per_flag2==1) ){
dblcnt_factor = 1.0;
}
else{
dblcnt_factor = 0.5;
}
rij[1] = rij0[1] - ( (double)n1*tv[1][1]
+ (double)n2*tv[2][1]
+ (double)n3*tv[3][1] );
rij[2] = rij0[2] - ( (double)n1*tv[1][2]
+ (double)n2*tv[2][2]
+ (double)n3*tv[3][2] );
rij[3] = rij0[3] - ( (double)n1*tv[1][3]
+ (double)n2*tv[2][3]
+ (double)n3*tv[3][3] );
dist2 = rij[1]*rij[1] + rij[2]*rij[2] + rij[3]*rij[3];
if (0.1<dist2 && dist2<=rcut_dftD2){
dist = sqrt(dist2);
dist6 = dist2*dist2*dist2;
/* calculate the vdW energy */
exparg = -beta_dftD*((dist/Rsum_dftD[wanA][wanB])-1.0);
expval = exp(exparg);
fdamp = scal6_dftD/(1.0+expval);
E -= dblcnt_factor*C6ij_dftD[wanA][wanB]/dist6*fdamp;
/* calculate the gradient of the vdW energy */
dist7 = dist6 * dist;
fdamp2 = C6ij_dftD[wanA][wanB]*fdamp/dist6*(expval*par/(1.0+expval) - 6.0/dist);
dEx -= fdamp2*rij[1]/dist;
dEy -= fdamp2*rij[2]/dist;
dEz -= fdamp2*rij[3]/dist;
}
} /* n3 */
} /* n2 */
} /* n1 */
} /* Gc_BN */
My_EdftD += E;
/* energy decomposition */
if (Energy_Decomposition_flag==1){
DecEvdw[0][Mc_AN][0] = E;
DecEvdw[1][Mc_AN][0] = E;
}
/* gradients from two-body terms */
Gxyz[Gc_AN][17] += dEx;
Gxyz[Gc_AN][18] += dEy;
Gxyz[Gc_AN][19] += dEz;
/*
printf("Gc_AN=%2d dEx=%15.12f dEy=%15.12f dEz=%15.12f\n",Gc_AN,dEx,dEy,dEz);
*/
} /* Mc_AN */
MPI_Allreduce(&My_EdftD, &EdftD, 1, MPI_DOUBLE, MPI_SUM, mpi_comm_level1);
return EdftD;
}
/* okuno */
/* Ellner */
double Calc_EdftD3()
{
/***********************************************************************
The subroutine calculates the semiemprical DFTD3 vdW correction
DFTD3 with zero damping:
Grimme, S. et al. H. J. Chem. Phys. (2010), 132, 154104
DFTD3 with BJ damping
Becke, A. D.; Johnson, E. R. J. Chem. Phys. 2005, 122, 154101
Johnson, E. R.; Becke, A. D. J. Chem. Phys. 2005, 123, 024101
Johnson, E. R.; Becke, A. D. J. Chem. Phys. 2006, 124, 174104
************************************************************************/
/* VARIABLES DECLARATOIN */
double My_EdftD,EdftD; /* energy */
double E; /* atomic energy */
double rij[4],fdamp,fdamp6,fdamp8,t6,t62,t8,t82,dE6,dE8,dEC,**dEC0; /* interaction */
double rij0[4]; /* positions */
double dist,dist2,dist5,dist6,dist7,dist8; /**/
double rcut2, cncut2; /* cutoff values */
int numprocs,myid,ID; /* MPI */
int Mc_AN,Gc_AN,Gc_BN,Gc_CN,wanA,wanB,iZ; /* atom counting and species */
int i,j; /* dummy vars */
int n1,n2,n3,n1_max,n2_max,n3_max; /* PBC */
double per_flagA, per_flagB, dblcnt_factor; /* double counting */
double dEx,dEy,dEz; /* gradients*/
double xn, *CN, *****dCN; /* Coordination number */
double exparg,expval, powarg, powval; /**/
double Z, W, C6_ref, dAi, dBj, Lij, C6, C8, **dC6ij, dZi, dZj, dWi, dWj; /* Gaussian distance C6, C8 parameter */
double C8C6;
/* START: for printing gradients ERASE
double *xgrad,*ygrad,*zgrad;
END: for printing gradients ERASE */
/* MPI AND INITIALIZATION */
MPI_Comm_size(mpi_comm_level1,&numprocs);
MPI_Comm_rank(mpi_comm_level1,&myid);
n1_max = n1_CN_DFT_D;
n2_max = n2_CN_DFT_D;
n3_max = n3_CN_DFT_D;
My_EdftD = 0.0;
EdftD = 0.0;
rcut2 = rcut_dftD*rcut_dftD;
cncut2 = cncut_dftD*cncut_dftD;
CN = (double*)malloc(sizeof(double)*(atomnum+1));
dC6ij = (double**)malloc(sizeof(double*)*(atomnum+1));
dEC0 = (double**)malloc(sizeof(double*)*(atomnum+1));
dCN = (double*****)malloc(sizeof(double****)*(atomnum+1));
for(Gc_AN=0; Gc_AN<atomnum+1; Gc_AN++){
dC6ij[Gc_AN]=(double*)malloc(sizeof(double)*(atomnum+1));
dEC0[Gc_AN]=(double*)malloc(sizeof(double*)*(atomnum+1));
for (i=0; i<(atomnum+1); i++){
dC6ij[Gc_AN][i] = 0.0;
dEC0[Gc_AN][i] = 0.0;
}
dCN[Gc_AN] =(double****)malloc(sizeof(double***)*(atomnum+1));
for(Gc_BN=0; Gc_BN<atomnum+1; Gc_BN++){
dCN[Gc_AN][Gc_BN] =(double***)malloc(sizeof(double**)*(2*n1_max+1));
for (n1=0; n1<=2*n1_max; n1++){
dCN[Gc_AN][Gc_BN][n1] =(double**)malloc(sizeof(double*)*(2*n2_max+1));
for (n2=0; n2<=2*n2_max; n2++){
dCN[Gc_AN][Gc_BN][n1][n2] =(double*)malloc(sizeof(double)*(2*n3_max+1));
for (i=0; i<(2*n3_max+1); i++) dCN[Gc_AN][Gc_BN][n1][n2][i] = 0.0;
} /* n2 */
} /* n1 */
} /* Gc_BN */
} /* Gc_AN */
/* START: for printing gradients ERASE
xgrad = (double*)malloc(sizeof(double)*(atomnum+1));
ygrad = (double*)malloc(sizeof(double)*(atomnum+1));
zgrad = (double*)malloc(sizeof(double)*(atomnum+1));
END: for printing gradients ERASE */
/* Compute coordination numbers CN_A and derivative dCN_AB/dr_AB by adding an inverse damping function */
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
Gc_AN = M2G[Mc_AN];
wanA = WhatSpecies[Gc_AN];
iZ = Spe_WhatAtom[wanA];
if ( iZ>0 ) {
xn=0.0;
for(Gc_BN=1; Gc_BN<=atomnum; Gc_BN++){
wanB = WhatSpecies[Gc_BN];
iZ = Spe_WhatAtom[wanB];
if ( iZ>0 ) {
per_flagB = (int)Gxyz[Gc_BN][60];
rij0[1] = Gxyz[Gc_AN][1] - Gxyz[Gc_BN][1];
rij0[2] = Gxyz[Gc_AN][2] - Gxyz[Gc_BN][2];
rij0[3] = Gxyz[Gc_AN][3] - Gxyz[Gc_BN][3];
if (per_flagB==0){
n1_max = 0;
n2_max = 0;
n3_max = 0;
}
else {
n1_max = n1_CN_DFT_D;
n2_max = n2_CN_DFT_D;
n3_max = n3_CN_DFT_D;
}
for (n1=-n1_max; n1<=n1_max; n1++){
for (n2=-n2_max; n2<=n2_max; n2++){
for (n3=-n3_max; n3<=n3_max; n3++){
rij[1] = rij0[1] - ( (double)n1*tv[1][1]
+ (double)n2*tv[2][1]
+ (double)n3*tv[3][1] );
rij[2] = rij0[2] - ( (double)n1*tv[1][2]
+ (double)n2*tv[2][2]
+ (double)n3*tv[3][2] );
rij[3] = rij0[3] - ( (double)n1*tv[1][3]
+ (double)n2*tv[2][3]
+ (double)n3*tv[3][3] );
dist2 = rij[1]*rij[1] + rij[2]*rij[2] + rij[3]*rij[3];
if (dist2<cncut2 && dist2>0.1){
dist = sqrt(dist2);
exparg = -k1_dftD*((rcovab_dftD[wanA][wanB]/dist)-1.0); /* Rsum is scaled by k2 */
expval = exp(exparg);
fdamp = 1.0/(1.0+expval);
xn+=fdamp;
dCN[Gc_AN][Gc_BN][n1+n1_CN_DFT_D][n2+n2_CN_DFT_D][n3+n3_CN_DFT_D]=-fdamp*fdamp*expval*k1_dftD*rcovab_dftD[wanA][wanB]/dist2;
}
else{
dCN[Gc_AN][Gc_BN][n1+n1_CN_DFT_D][n2+n2_CN_DFT_D][n3+n3_CN_DFT_D]=0.0;
}
} /* n3 */
} /* n2 */
} /* n1 */
}
} /* Gc_BN */
CN[Gc_AN] = xn;
}
} /* Mc_AN */
/*MPI BROADCAST CN NUMBERS - MPI_Barrier(mpi_comm_level1); */
MPI_Barrier(mpi_comm_level1); /* NOT SURE IF NEEDED! */
for (Gc_AN=1; Gc_AN<=atomnum; Gc_AN++){
wanA = WhatSpecies[Gc_AN];
iZ = Spe_WhatAtom[wanA];
if ( iZ>0 ) {
ID = G2ID[Gc_AN];
MPI_Bcast(&CN[Gc_AN], 1, MPI_DOUBLE, ID, mpi_comm_level1);
for (Gc_BN=1; Gc_BN<=atomnum; Gc_BN++){
wanB = WhatSpecies[Gc_BN];
iZ = Spe_WhatAtom[wanB];
if ( iZ>0 ) {
per_flagB = (int)Gxyz[Gc_BN][60];
if (per_flagB==0){
n1_max = 0;
n2_max = 0;
n3_max = 0;
}
else {
n1_max = n1_CN_DFT_D;
n2_max = n2_CN_DFT_D;
n3_max = n3_CN_DFT_D;
}
for (n1=-n1_max; n1<=n1_max; n1++){
for (n2=-n2_max; n2<=n2_max; n2++){
for (n3=-n3_max; n3<=n3_max; n3++){
MPI_Bcast(&dCN[Gc_AN][Gc_BN][n1+n1_CN_DFT_D][n2+n2_CN_DFT_D][n3+n3_CN_DFT_D], 1, MPI_DOUBLE, ID, mpi_comm_level1);
} /* n3 */
} /* n2 */
} /* n1 */
}
} /* Gc_BN */
}
} /* Gc_AN */
/* Calculate energy and collect gradients two body terms C_ij*d(f_ij/r_ij)/dr_ij also dCi_ij dCj_ij dEC0_ij needed in gradients of 3 body terms */
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
Gc_AN = M2G[Mc_AN];
wanA = WhatSpecies[Gc_AN];
iZ = Spe_WhatAtom[wanA];
if ( iZ>0 ) {
dblcnt_factor=0.5;
dEx = 0.0;
dEy = 0.0;
dEz = 0.0;
E = 0.0;
per_flagA = (int)Gxyz[Gc_AN][60];
for(Gc_BN=1; Gc_BN<=atomnum; Gc_BN++){
wanB = WhatSpecies[Gc_BN];
iZ = Spe_WhatAtom[wanB];
if ( iZ>0 ) {
dEC0[Gc_AN][Gc_BN]=0.0;
per_flagB = (int)Gxyz[Gc_BN][60];
rij0[1] = Gxyz[Gc_AN][1] - Gxyz[Gc_BN][1];
rij0[2] = Gxyz[Gc_AN][2] - Gxyz[Gc_BN][2];
rij0[3] = Gxyz[Gc_AN][3] - Gxyz[Gc_BN][3];
/* Calculate C6, C8 coefficient and derivatives with Gaussian-distance (L) */
Z = 0.0;
W = 0.0;
dZi=0.0;
dZj=0.0;
dWi=0.0;
dWj=0.0;
for (i=0; i<maxcn_dftD[wanA]; i++){
for (j=0; j<maxcn_dftD[wanB]; j++){
C6_ref=C6ab_dftD[wanA][wanB][i][j][0];
if (C6_ref>1.0e-12){
dAi = CN[Gc_AN] - C6ab_dftD[wanA][wanB][i][j][1];
dBj = CN[Gc_BN] - C6ab_dftD[wanA][wanB][i][j][2];
exparg = -k3_dftD*( dAi*dAi + dBj*dBj );
Lij=exp(exparg);
Z += C6_ref*Lij;
W += Lij;
dZi+=C6_ref*Lij*2.0*k3_dftD*dAi;
dZj+=C6_ref*Lij*2.0*k3_dftD*dBj;
dWi+=Lij*2.0*k3_dftD*dAi;
dWj+=Lij*2.0*k3_dftD*dBj;
}
} /* CN_j */
} /* CN_i */
if (W>1.0e-12){
C6 = Z/W;
C8 = 3.0*C6*r2r4ab_dftD[wanA][wanB];
C8C6 = 3.0*r2r4ab_dftD[wanA][wanB];
dC6ij[Gc_AN][Gc_BN]=((dZi*W)-(dWi*Z))/(W*W);
}
else{
C6 = 0.0;
C8 = 0.0;
C8C6 = 3.0*r2r4ab_dftD[wanA][wanB];
dC6ij[Gc_AN][Gc_BN]=0.0;
}
/* CALCULATE ENERGY AND TWO FIRST PART OF GRADIENTS*/
if (per_flagB==0){
n1_max = 0;
n2_max = 0;
n3_max = 0;
}
else {
n1_max = n1_DFT_D;
n2_max = n2_DFT_D;
n3_max = n3_DFT_D;
}
for (n1=-n1_max; n1<=n1_max; n1++){
for (n2=-n2_max; n2<=n2_max; n2++){
for (n3=-n3_max; n3<=n3_max; n3++){
/* for double counting */
if((!(abs(n1)+abs(n2)+abs(n3))==0) && (per_flagA==0 && per_flagB==1) ){
dblcnt_factor = 1.0;
}
else{
dblcnt_factor = 0.5;
}
rij[1] = rij0[1] - ( (double)n1*tv[1][1]
+ (double)n2*tv[2][1]
+ (double)n3*tv[3][1] );
rij[2] = rij0[2] - ( (double)n1*tv[1][2]
+ (double)n2*tv[2][2]
+ (double)n3*tv[3][2] );
rij[3] = rij0[3] - ( (double)n1*tv[1][3]
+ (double)n2*tv[2][3]
+ (double)n3*tv[3][3] );
dist2 = rij[1]*rij[1] + rij[2]*rij[2] + rij[3]*rij[3];
if (0.1<dist2 && dist2<rcut2){
dist = sqrt(dist2);
dist5 = dist2*dist2*dist;
dist6 = dist2*dist2*dist2;
dist7 = dist6*dist;
dist8 = dist6*dist2;
if (DFTD3_damp_dftD == 1){ /*DFTD3 ZERO DAMPING*/
/* calculate the vdW energy of E6 and grad of f6/r6 term*/
powarg = dist/(sr6_dftD*r0ab_dftD[wanB][wanA]);
powval = pow(powarg,-alp6_dftD);
fdamp6 = 1.0/(1.0+6.0*powval);
E -= dblcnt_factor*s6_dftD*C6*fdamp6/dist6;
dE6=(s6_dftD*C6*fdamp6/dist6)*(6.0/dist)*(-1.0+alp6_dftD*powval*fdamp6);
/* calculate the vdW energy of E8 and grad of f8/r8 term*/
powarg = dist/(sr8_dftD*r0ab_dftD[wanB][wanA]);
powval = pow(powarg,-alp8_dftD);
fdamp8 = 1.0/(1.0+6.0*powval);
E -= dblcnt_factor*s8_dftD*C8*fdamp8/dist8;
dE8=(s8_dftD*C8*fdamp8/dist8)*(2.0/dist)*(-4.0+3.0*alp8_dftD*powval*fdamp8);
dEC0[Gc_AN][Gc_BN]+=s6_dftD*fdamp6/dist6+s8_dftD*3.0*r2r4ab_dftD[wanA][wanB]*fdamp8/dist8;
} /* END IF ZERO DAMPING */
if (DFTD3_damp_dftD == 2){ /*DFTD3 BJ DAMPING*/
fdamp = (a1_dftD*sqrt(C8C6)+a2_dftD);
fdamp6=fdamp*fdamp*fdamp*fdamp*fdamp*fdamp;
fdamp8=fdamp6*fdamp*fdamp;
t6=dist6 + fdamp6;
t62=t6*t6;
t8=dist8 + fdamp8;
t82=t8*t8;
E -= dblcnt_factor*s6_dftD*C6/t6;
dE6=-s6_dftD*C6*6.0*dist5/t62;
E -= dblcnt_factor*s8_dftD*C8/t8;
dE8=-s8_dftD*C8*8.0*dist7/t82;
dEC0[Gc_AN][Gc_BN]+=s6_dftD/t6+s8_dftD*3.0*r2r4ab_dftD[wanA][wanB]/t8;
} /* IF BJ DAMPING */
dEx -= (dE6+dE8)*rij[1]/dist;
dEy -= (dE6+dE8)*rij[2]/dist;
dEz -= (dE6+dE8)*rij[3]/dist;
} /* if dist2 < rcut */
} /* n3 */
} /* n2 */
} /* n1 */
}
} /* Gc_BN */
My_EdftD += E;
/* energy decomposition */
if (Energy_Decomposition_flag==1){
DecEvdw[0][Mc_AN][0] = E;
DecEvdw[1][Mc_AN][0] = E;
}
/* gradients from two-body terms */
Gxyz[Gc_AN][17] += dEx;
Gxyz[Gc_AN][18] += dEy;
Gxyz[Gc_AN][19] += dEz;
/* START: for printing gradients ERASE
xgrad[Gc_AN]=dEx;ygrad[Gc_AN]=dEy;zgrad[Gc_AN]=dEz;
END: for printing gradients ERASE */
}
} /* Mc_AN */
/*MPI BROADCAST GRADIENTS AND REDUCE ENERGIES - MPI_Barrier(mpi_comm_level1); */
MPI_Allreduce(&My_EdftD, &EdftD, 1, MPI_DOUBLE, MPI_SUM, mpi_comm_level1);
for (Gc_AN=1; Gc_AN<=atomnum; Gc_AN++){
wanA = WhatSpecies[Gc_AN];
iZ = Spe_WhatAtom[wanA];
if ( iZ>0 ) {
ID = G2ID[Gc_AN];
MPI_Bcast(&CN[Gc_AN], 1, MPI_DOUBLE, ID, mpi_comm_level1);
for (Gc_BN=1; Gc_BN<=atomnum; Gc_BN++){
wanB = WhatSpecies[Gc_BN];
iZ = Spe_WhatAtom[wanB];
if ( iZ>0 ) {
MPI_Bcast(&dC6ij[Gc_AN][Gc_BN], 1, MPI_DOUBLE, ID, mpi_comm_level1);
MPI_Bcast(&dEC0[Gc_AN][Gc_BN], 1, MPI_DOUBLE, ID, mpi_comm_level1);
}
} /* Gc_BN */
}
} /* Gc_AN */
MPI_Barrier(mpi_comm_level1); /* NOT SURE IF ITS NEEDED! */
/* Calculate three body terms of gradients */
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
Gc_AN = M2G[Mc_AN];
wanA = WhatSpecies[Gc_AN];
iZ = Spe_WhatAtom[wanA];
if ( iZ>0 ) {
dEx = 0.0;
dEy = 0.0;
dEz = 0.0;
for(Gc_BN=1; Gc_BN<=atomnum; Gc_BN++){
wanB = WhatSpecies[Gc_BN];
iZ = Spe_WhatAtom[wanB];
if ( iZ>0 ) {
per_flagB = (int)Gxyz[Gc_BN][60];
rij0[1] = Gxyz[Gc_AN][1] - Gxyz[Gc_BN][1];
rij0[2] = Gxyz[Gc_AN][2] - Gxyz[Gc_BN][2];
rij0[3] = Gxyz[Gc_AN][3] - Gxyz[Gc_BN][3];
if (per_flagB==0){
n1_max = 0;
n2_max = 0;
n3_max = 0;
}
else {
n1_max = n1_CN_DFT_D;
n2_max = n2_CN_DFT_D;
n3_max = n3_CN_DFT_D;
}
for (n1=-n1_max; n1<=n1_max; n1++){
for (n2=-n2_max; n2<=n2_max; n2++){
for (n3=-n3_max; n3<=n3_max; n3++){
dEC=0.0;
rij[1] = rij0[1] - ( (double)n1*tv[1][1]
+ (double)n2*tv[2][1]
+ (double)n3*tv[3][1] );
rij[2] = rij0[2] - ( (double)n1*tv[1][2]
+ (double)n2*tv[2][2]
+ (double)n3*tv[3][2] );
rij[3] = rij0[3] - ( (double)n1*tv[1][3]
+ (double)n2*tv[2][3]
+ (double)n3*tv[3][3] );
dist2 = rij[1]*rij[1] + rij[2]*rij[2] + rij[3]*rij[3];
if (0.1<dist2 && dist2<cncut2){
/* calculate grad of C6 term: dEC=dEC0_ik*dC6_ik*dCN_ij+dEC0_jk*dC6_jk*dCN_ij */
dist=sqrt(dist2);
for(Gc_CN=1; Gc_CN<=atomnum; Gc_CN++){
dEC += dEC0[Gc_AN][Gc_CN]*dC6ij[Gc_AN][Gc_CN]*dCN[Gc_AN][Gc_BN][n1+n1_CN_DFT_D][n2+n2_CN_DFT_D][n3+n3_CN_DFT_D];
dEC += dEC0[Gc_BN][Gc_CN]*dC6ij[Gc_BN][Gc_CN]*dCN[Gc_AN][Gc_BN][n1+n1_CN_DFT_D][n2+n2_CN_DFT_D][n3+n3_CN_DFT_D];
} /* Gc_CN */
dEx += dEC*rij[1]/dist;
dEy += dEC*rij[2]/dist;
dEz += dEC*rij[3]/dist;
} /* if dist2 < cn_thr */
} /* n3 */
} /* n2 */
} /* n1 */
}
} /* Gc_BN */
Gxyz[Gc_AN][17] += dEx;
Gxyz[Gc_AN][18] += dEy;
Gxyz[Gc_AN][19] += dEz;
/* START: for printing gradients ERASE
xgrad[Gc_AN]+=dEx;ygrad[Gc_AN]+=dEy;zgrad[Gc_AN]+=dEz;
END: for printing gradients ERASE */
}
} /* Mc_AN */
/* START: for printing gradients ERASE
MPI_Barrier(mpi_comm_level1);
for (Gc_AN=1; Gc_AN<=atomnum; Gc_AN++){
ID = G2ID[Gc_AN];
MPI_Bcast(&xgrad[Gc_AN], 1, MPI_DOUBLE, ID, mpi_comm_level1);
MPI_Bcast(&ygrad[Gc_AN], 1, MPI_DOUBLE, ID, mpi_comm_level1);
MPI_Bcast(&zgrad[Gc_AN], 1, MPI_DOUBLE, ID, mpi_comm_level1);
}
if(myid==0){
printf("DFTD3: ATOM NUMBER, COORDINATION NUMBER, GRADIENTS (X, Y, Z)\n");
for(Gc_AN=1; Gc_AN<=atomnum; Gc_AN++){
printf("%4d %10.6e %+12.8e %+12.8e %+12.8e \n",Gc_AN, CN[Gc_AN],xgrad[Gc_AN],ygrad[Gc_AN],zgrad[Gc_AN]);fflush(stdout);
}
}
free(xgrad);free(ygrad);free(zgrad);
END: for printing gradients ERASE */
/* free arrays */
for(Gc_AN=0; Gc_AN<atomnum+1; Gc_AN++){
for(Gc_BN=0; Gc_BN<atomnum+1; Gc_BN++){
for (n1=0; n1<=2*n1_CN_DFT_D; n1++){
for (n2=0; n2<=2*n2_CN_DFT_D; n2++){
free(dCN[Gc_AN][Gc_BN][n1][n2]);
} /* n2 */
free(dCN[Gc_AN][Gc_BN][n1]);
} /* n1 */
free(dCN[Gc_AN][Gc_BN]);
} /* Gc_BN */
free(dC6ij[Gc_AN]);
free(dEC0[Gc_AN]);
free(dCN[Gc_AN]);
} /* Gc_AN */
free(dC6ij);
free(dEC0);
free(dCN);
free(CN);
return EdftD;
}
/* Ellner */
void Energy_Decomposition(double ECE[])
{
static int firsttime=1;
int i,spin,spinmax,XC_P_switch;
int numS,numR,My_GNum,BN_AB,max_ene;
int n,n1,n2,n3,Ng1,Ng2,Ng3,j,k;
int GN,GNs,BN,DN,LN,N2D,n2D,N3[4];
double intVH1[2],intVxc[2];
double My_intVH1[2],My_intVxc[2];
double c[2],Etot;
int numprocs,myid,tag=999,ID,IDS,IDR;
double Cxyz[4],gradxyz[4];
double Stime_atom,Etime_atom;
double time0,time1;
double sden[2],tden,aden,pden[2];
int tnoA,tnoB,wanA,wanB,Mc_AN,Gc_AN,h_AN;
double sum,tsum,Total_Mul_up,Total_Mul_dn;
/* MPI */
MPI_Comm_size(mpi_comm_level1,&numprocs);
MPI_Comm_rank(mpi_comm_level1,&myid);
/* calculation of total energy */
max_ene = 14;
Etot = 0.0;
for (i=0; i<=max_ene; i++){
Etot += ECE[i];
}
Etot = Etot - ECE[0] - ECE[1] - ECE[13];
Total_Mul_up = 0.0;
Total_Mul_dn = 0.0;
for (Gc_AN=1; Gc_AN<=atomnum; Gc_AN++){
Total_Mul_up += InitN_USpin[Gc_AN];
Total_Mul_dn += InitN_DSpin[Gc_AN];
}
if (SpinP_switch==0){
c[0] = 0.5*(Etot - Uele)/(Total_Mul_up+1.0e-15);
}
else if (SpinP_switch==1) {
c[0] = (Etot - Uele)/(Total_Mul_up+Total_Mul_dn+1.0e-15);
c[1] = c[0];
}
else if (SpinP_switch==3) {
c[0] = (Etot - Uele)/(Total_Mul_up+Total_Mul_dn+1.0e-15);
c[1] = c[0];
}
/****************************************************
calculations of DecEkin, DecEv, and DecEcon
****************************************************/
if (SpinP_switch==0 || SpinP_switch==1){
for (spin=0; spin<=SpinP_switch; spin++){
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
Gc_AN = M2G[Mc_AN];
wanA = WhatSpecies[Gc_AN];
tnoA = Spe_Total_CNO[wanA];
for (i=0; i<tnoA; i++){
DecEkin[spin][Mc_AN][i] = 0.0;
DecEv[spin][Mc_AN][i] = 0.0;
DecEcon[spin][Mc_AN][i] = 0.0;
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
wanB = WhatSpecies[natn[Gc_AN][h_AN]];
tnoB = Spe_Total_CNO[wanB];
for (j=0; j<tnoB; j++){
DecEkin[spin][Mc_AN][i] += DM[0][spin][Mc_AN][h_AN][i][j]*H0[0][Mc_AN][h_AN][i][j];
DecEv[spin][Mc_AN][i] += DM[0][spin][Mc_AN][h_AN][i][j]*(H[spin][Mc_AN][h_AN][i][j]-H0[0][Mc_AN][h_AN][i][j]);
DecEcon[spin][Mc_AN][i] += DM[0][spin][Mc_AN][h_AN][i][j]*OLP[0][Mc_AN][h_AN][i][j]*c[spin];
}
}
}
}
}
}
else if (SpinP_switch==3){
for (Mc_AN=1; Mc_AN<=Matomnum; Mc_AN++){
Gc_AN = M2G[Mc_AN];
wanA = WhatSpecies[Gc_AN];
tnoA = Spe_Total_CNO[wanA];
for (i=0; i<tnoA; i++){
DecEkin[0][Mc_AN][i] = 0.0;
DecEkin[1][Mc_AN][i] = 0.0;
DecEv[0][Mc_AN][i] = 0.0;
DecEv[1][Mc_AN][i] = 0.0;
DecEcon[0][Mc_AN][i] = 0.0;
DecEcon[1][Mc_AN][i] = 0.0;
for (h_AN=0; h_AN<=FNAN[Gc_AN]; h_AN++){
wanB = WhatSpecies[natn[Gc_AN][h_AN]];
tnoB = Spe_Total_CNO[wanB];
for (j=0; j<tnoB; j++){
DecEkin[0][Mc_AN][i] += DM[0][0][Mc_AN][h_AN][i][j]*H0[0][Mc_AN][h_AN][i][j];
DecEkin[1][Mc_AN][i] += DM[0][1][Mc_AN][h_AN][i][j]*H0[0][Mc_AN][h_AN][i][j];
DecEcon[0][Mc_AN][i] += DM[0][0][Mc_AN][h_AN][i][j]*OLP[0][Mc_AN][h_AN][i][j]*c[0];
DecEcon[1][Mc_AN][i] += DM[0][1][Mc_AN][h_AN][i][j]*OLP[0][Mc_AN][h_AN][i][j]*c[1];
DecEv[0][Mc_AN][i] +=
DM[0][0][Mc_AN][h_AN][i][j]*(H[0][Mc_AN][h_AN][i][j]-H0[0][Mc_AN][h_AN][i][j])
- iDM[0][0][Mc_AN][h_AN][i][j]*iHNL[0][Mc_AN][h_AN][i][j]
+ DM[0][1][Mc_AN][h_AN][i][j]*(H[1][Mc_AN][h_AN][i][j]-H0[0][Mc_AN][h_AN][i][j])
- iDM[0][1][Mc_AN][h_AN][i][j]*iHNL[1][Mc_AN][h_AN][i][j]
+ 2.0*DM[0][2][Mc_AN][h_AN][i][j]*H[2][Mc_AN][h_AN][i][j]
- 2.0*DM[0][3][Mc_AN][h_AN][i][j]*(H[3][Mc_AN][h_AN][i][j]+iHNL[2][Mc_AN][h_AN][i][j]);
DecEv[1][Mc_AN][i] = 0.0;
}
}
}
}
}
}
void Set_Lebedev_Grid()
{
/* 590 */
if (Num_Leb_Grid==590){
Leb_Grid_XYZW[ 0][0]= 1.000000000000000;
Leb_Grid_XYZW[ 0][1]= 0.000000000000000;
Leb_Grid_XYZW[ 0][2]= 0.000000000000000;
Leb_Grid_XYZW[ 0][3]= 0.000309512129531;
Leb_Grid_XYZW[ 1][0]=-1.000000000000000;
Leb_Grid_XYZW[ 1][1]= 0.000000000000000;
Leb_Grid_XYZW[ 1][2]= 0.000000000000000;
Leb_Grid_XYZW[ 1][3]= 0.000309512129531;
Leb_Grid_XYZW[ 2][0]= 0.000000000000000;
Leb_Grid_XYZW[ 2][1]= 1.000000000000000;
Leb_Grid_XYZW[ 2][2]= 0.000000000000000;
Leb_Grid_XYZW[ 2][3]= 0.000309512129531;
Leb_Grid_XYZW[ 3][0]= 0.000000000000000;
Leb_Grid_XYZW[ 3][1]=-1.000000000000000;
Leb_Grid_XYZW[ 3][2]= 0.000000000000000;
Leb_Grid_XYZW[ 3][3]= 0.000309512129531;
Leb_Grid_XYZW[ 4][0]= 0.000000000000000;
Leb_Grid_XYZW[ 4][1]= 0.000000000000000;
Leb_Grid_XYZW[ 4][2]= 1.000000000000000;
Leb_Grid_XYZW[ 4][3]= 0.000309512129531;
Leb_Grid_XYZW[ 5][0]= 0.000000000000000;
Leb_Grid_XYZW[ 5][1]= 0.000000000000000;
Leb_Grid_XYZW[ 5][2]=-1.000000000000000;
Leb_Grid_XYZW[ 5][3]= 0.000309512129531;
Leb_Grid_XYZW[ 6][0]= 0.577350269189626;
Leb_Grid_XYZW[ 6][1]= 0.577350269189626;
Leb_Grid_XYZW[ 6][2]= 0.577350269189626;
Leb_Grid_XYZW[ 6][3]= 0.001852379698597;
Leb_Grid_XYZW[ 7][0]=-0.577350269189626;
Leb_Grid_XYZW[ 7][1]= 0.577350269189626;
Leb_Grid_XYZW[ 7][2]= 0.577350269189626;
Leb_Grid_XYZW[ 7][3]= 0.001852379698597;
Leb_Grid_XYZW[ 8][0]= 0.577350269189626;
Leb_Grid_XYZW[ 8][1]=-0.577350269189626;
Leb_Grid_XYZW[ 8][2]= 0.577350269189626;
Leb_Grid_XYZW[ 8][3]= 0.001852379698597;
Leb_Grid_XYZW[ 9][0]=-0.577350269189626;
Leb_Grid_XYZW[ 9][1]=-0.577350269189626;
Leb_Grid_XYZW[ 9][2]= 0.577350269189626;
Leb_Grid_XYZW[ 9][3]= 0.001852379698597;
Leb_Grid_XYZW[ 10][0]= 0.577350269189626;
Leb_Grid_XYZW[ 10][1]= 0.577350269189626;
Leb_Grid_XYZW[ 10][2]=-0.577350269189626;
Leb_Grid_XYZW[ 10][3]= 0.001852379698597;
Leb_Grid_XYZW[ 11][0]=-0.577350269189626;
Leb_Grid_XYZW[ 11][1]= 0.577350269189626;
Leb_Grid_XYZW[ 11][2]=-0.577350269189626;
Leb_Grid_XYZW[ 11][3]= 0.001852379698597;
Leb_Grid_XYZW[ 12][0]= 0.577350269189626;
Leb_Grid_XYZW[ 12][1]=-0.577350269189626;
Leb_Grid_XYZW[ 12][2]=-0.577350269189626;
Leb_Grid_XYZW[ 12][3]= 0.001852379698597;
Leb_Grid_XYZW[ 13][0]=-0.577350269189626;
Leb_Grid_XYZW[ 13][1]=-0.577350269189626;
Leb_Grid_XYZW[ 13][2]=-0.577350269189626;
Leb_Grid_XYZW[ 13][3]= 0.001852379698597;
Leb_Grid_XYZW[ 14][0]= 0.704095493822747;
Leb_Grid_XYZW[ 14][1]= 0.704095493822747;
Leb_Grid_XYZW[ 14][2]= 0.092190407076898;
Leb_Grid_XYZW[ 14][3]= 0.001871790639278;
Leb_Grid_XYZW[ 15][0]=-0.704095493822747;
Leb_Grid_XYZW[ 15][1]= 0.704095493822747;
Leb_Grid_XYZW[ 15][2]= 0.092190407076898;
Leb_Grid_XYZW[ 15][3]= 0.001871790639278;
Leb_Grid_XYZW[ 16][0]= 0.704095493822747;
Leb_Grid_XYZW[ 16][1]=-0.704095493822747;
Leb_Grid_XYZW[ 16][2]= 0.092190407076898;
Leb_Grid_XYZW[ 16][3]= 0.001871790639278;
Leb_Grid_XYZW[ 17][0]=-0.704095493822747;
Leb_Grid_XYZW[ 17][1]=-0.704095493822747;
Leb_Grid_XYZW[ 17][2]= 0.092190407076898;
Leb_Grid_XYZW[ 17][3]= 0.001871790639278;
Leb_Grid_XYZW[ 18][0]= 0.704095493822747;
Leb_Grid_XYZW[ 18][1]= 0.704095493822747;
Leb_Grid_XYZW[ 18][2]=-0.092190407076898;
Leb_Grid_XYZW[ 18][3]= 0.001871790639278;
Leb_Grid_XYZW[ 19][0]=-0.704095493822747;
Leb_Grid_XYZW[ 19][1]= 0.704095493822747;
Leb_Grid_XYZW[ 19][2]=-0.092190407076898;
Leb_Grid_XYZW[ 19][3]= 0.001871790639278;
Leb_Grid_XYZW[ 20][0]= 0.704095493822747;
Leb_Grid_XYZW[ 20][1]=-0.704095493822747;
Leb_Grid_XYZW[ 20][2]=-0.092190407076898;
Leb_Grid_XYZW[ 20][3]= 0.001871790639278;
Leb_Grid_XYZW[ 21][0]=-0.704095493822747;
Leb_Grid_XYZW[ 21][1]=-0.704095493822747;
Leb_Grid_XYZW[ 21][2]=-0.092190407076898;
Leb_Grid_XYZW[ 21][3]= 0.001871790639278;
Leb_Grid_XYZW[ 22][0]= 0.704095493822747;
Leb_Grid_XYZW[ 22][1]= 0.092190407076898;
Leb_Grid_XYZW[ 22][2]= 0.704095493822747;
Leb_Grid_XYZW[ 22][3]= 0.001871790639278;
Leb_Grid_XYZW[ 23][0]=-0.704095493822747;
Leb_Grid_XYZW[ 23][1]= 0.092190407076898;
Leb_Grid_XYZW[ 23][2]= 0.704095493822747;
Leb_Grid_XYZW[ 23][3]= 0.001871790639278;
Leb_Grid_XYZW[ 24][0]= 0.704095493822747;
Leb_Grid_XYZW[ 24][1]=-0.092190407076898;
Leb_Grid_XYZW[ 24][2]= 0.704095493822747;
Leb_Grid_XYZW[ 24][3]= 0.001871790639278;
Leb_Grid_XYZW[ 25][0]=-0.704095493822747;
Leb_Grid_XYZW[ 25][1]=-0.092190407076898;
Leb_Grid_XYZW[ 25][2]= 0.704095493822747;
Leb_Grid_XYZW[ 25][3]= 0.001871790639278;
Leb_Grid_XYZW[ 26][0]= 0.704095493822747;
Leb_Grid_XYZW[ 26][1]= 0.092190407076898;
Leb_Grid_XYZW[ 26][2]=-0.704095493822747;
Leb_Grid_XYZW[ 26][3]= 0.001871790639278;
Leb_Grid_XYZW[ 27][0]=-0.704095493822747;
Leb_Grid_XYZW[ 27][1]= 0.092190407076898;
Leb_Grid_XYZW[ 27][2]=-0.704095493822747;
Leb_Grid_XYZW[ 27][3]= 0.001871790639278;
Leb_Grid_XYZW[ 28][0]= 0.704095493822747;
Leb_Grid_XYZW[ 28][1]=-0.092190407076898;
Leb_Grid_XYZW[ 28][2]=-0.704095493822747;
Leb_Grid_XYZW[ 28][3]= 0.001871790639278;
Leb_Grid_XYZW[ 29][0]=-0.704095493822747;
Leb_Grid_XYZW[ 29][1]=-0.092190407076898;
Leb_Grid_XYZW[ 29][2]=-0.704095493822747;
Leb_Grid_XYZW[ 29][3]= 0.001871790639278;
Leb_Grid_XYZW[ 30][0]= 0.092190407076898;
Leb_Grid_XYZW[ 30][1]= 0.704095493822747;
Leb_Grid_XYZW[ 30][2]= 0.704095493822747;
Leb_Grid_XYZW[ 30][3]= 0.001871790639278;
Leb_Grid_XYZW[ 31][0]=-0.092190407076898;
Leb_Grid_XYZW[ 31][1]= 0.704095493822747;
Leb_Grid_XYZW[ 31][2]= 0.704095493822747;
Leb_Grid_XYZW[ 31][3]= 0.001871790639278;
Leb_Grid_XYZW[ 32][0]= 0.092190407076898;
Leb_Grid_XYZW[ 32][1]=-0.704095493822747;
Leb_Grid_XYZW[ 32][2]= 0.704095493822747;
Leb_Grid_XYZW[ 32][3]= 0.001871790639278;
Leb_Grid_XYZW[ 33][0]=-0.092190407076898;
Leb_Grid_XYZW[ 33][1]=-0.704095493822747;
Leb_Grid_XYZW[ 33][2]= 0.704095493822747;
Leb_Grid_XYZW[ 33][3]= 0.001871790639278;
Leb_Grid_XYZW[ 34][0]= 0.092190407076898;
Leb_Grid_XYZW[ 34][1]= 0.704095493822747;
Leb_Grid_XYZW[ 34][2]=-0.704095493822747;
Leb_Grid_XYZW[ 34][3]= 0.001871790639278;
Leb_Grid_XYZW[ 35][0]=-0.092190407076898;
Leb_Grid_XYZW[ 35][1]= 0.704095493822747;
Leb_Grid_XYZW[ 35][2]=-0.704095493822747;
Leb_Grid_XYZW[ 35][3]= 0.001871790639278;
Leb_Grid_XYZW[ 36][0]= 0.092190407076898;
Leb_Grid_XYZW[ 36][1]=-0.704095493822747;
Leb_Grid_XYZW[ 36][2]=-0.704095493822747;
Leb_Grid_XYZW[ 36][3]= 0.001871790639278;
Leb_Grid_XYZW[ 37][0]=-0.092190407076898;
Leb_Grid_XYZW[ 37][1]=-0.704095493822747;
Leb_Grid_XYZW[ 37][2]=-0.704095493822747;
Leb_Grid_XYZW[ 37][3]= 0.001871790639278;
Leb_Grid_XYZW[ 38][0]= 0.680774406645524;
Leb_Grid_XYZW[ 38][1]= 0.680774406645524;
Leb_Grid_XYZW[ 38][2]= 0.270356088359165;
Leb_Grid_XYZW[ 38][3]= 0.001858812585438;
Leb_Grid_XYZW[ 39][0]=-0.680774406645524;
Leb_Grid_XYZW[ 39][1]= 0.680774406645524;
Leb_Grid_XYZW[ 39][2]= 0.270356088359165;
Leb_Grid_XYZW[ 39][3]= 0.001858812585438;
Leb_Grid_XYZW[ 40][0]= 0.680774406645524;
Leb_Grid_XYZW[ 40][1]=-0.680774406645524;
Leb_Grid_XYZW[ 40][2]= 0.270356088359165;
Leb_Grid_XYZW[ 40][3]= 0.001858812585438;
Leb_Grid_XYZW[ 41][0]=-0.680774406645524;
Leb_Grid_XYZW[ 41][1]=-0.680774406645524;
Leb_Grid_XYZW[ 41][2]= 0.270356088359165;
Leb_Grid_XYZW[ 41][3]= 0.001858812585438;
Leb_Grid_XYZW[ 42][0]= 0.680774406645524;
Leb_Grid_XYZW[ 42][1]= 0.680774406645524;
Leb_Grid_XYZW[ 42][2]=-0.270356088359165;
Leb_Grid_XYZW[ 42][3]= 0.001858812585438;
Leb_Grid_XYZW[ 43][0]=-0.680774406645524;
Leb_Grid_XYZW[ 43][1]= 0.680774406645524;
Leb_Grid_XYZW[ 43][2]=-0.270356088359165;
Leb_Grid_XYZW[ 43][3]= 0.001858812585438;
Leb_Grid_XYZW[ 44][0]= 0.680774406645524;
Leb_Grid_XYZW[ 44][1]=-0.680774406645524;
Leb_Grid_XYZW[ 44][2]=-0.270356088359165;
Leb_Grid_XYZW[ 44][3]= 0.001858812585438;
Leb_Grid_XYZW[ 45][0]=-0.680774406645524;
Leb_Grid_XYZW[ 45][1]=-0.680774406645524;
Leb_Grid_XYZW[ 45][2]=-0.270356088359165;
Leb_Grid_XYZW[ 45][3]= 0.001858812585438;
Leb_Grid_XYZW[ 46][0]= 0.680774406645524;
Leb_Grid_XYZW[ 46][1]= 0.270356088359165;
Leb_Grid_XYZW[ 46][2]= 0.680774406645524;
Leb_Grid_XYZW[ 46][3]= 0.001858812585438;
Leb_Grid_XYZW[ 47][0]=-0.680774406645524;
Leb_Grid_XYZW[ 47][1]= 0.270356088359165;
Leb_Grid_XYZW[ 47][2]= 0.680774406645524;
Leb_Grid_XYZW[ 47][3]= 0.001858812585438;
Leb_Grid_XYZW[ 48][0]= 0.680774406645524;
Leb_Grid_XYZW[ 48][1]=-0.270356088359165;
Leb_Grid_XYZW[ 48][2]= 0.680774406645524;
Leb_Grid_XYZW[ 48][3]= 0.001858812585438;
Leb_Grid_XYZW[ 49][0]=-0.680774406645524;
Leb_Grid_XYZW[ 49][1]=-0.270356088359165;
Leb_Grid_XYZW[ 49][2]= 0.680774406645524;
Leb_Grid_XYZW[ 49][3]= 0.001858812585438;
Leb_Grid_XYZW[ 50][0]= 0.680774406645524;
Leb_Grid_XYZW[ 50][1]= 0.270356088359165;
Leb_Grid_XYZW[ 50][2]=-0.680774406645524;
Leb_Grid_XYZW[ 50][3]= 0.001858812585438;
Leb_Grid_XYZW[ 51][0]=-0.680774406645524;
Leb_Grid_XYZW[ 51][1]= 0.270356088359165;
Leb_Grid_XYZW[ 51][2]=-0.680774406645524;
Leb_Grid_XYZW[ 51][3]= 0.001858812585438;
Leb_Grid_XYZW[ 52][0]= 0.680774406645524;
Leb_Grid_XYZW[ 52][1]=-0.270356088359165;
Leb_Grid_XYZW[ 52][2]=-0.680774406645524;
Leb_Grid_XYZW[ 52][3]= 0.001858812585438;
Leb_Grid_XYZW[ 53][0]=-0.680774406645524;
Leb_Grid_XYZW[ 53][1]=-0.270356088359165;
Leb_Grid_XYZW[ 53][2]=-0.680774406645524;
Leb_Grid_XYZW[ 53][3]= 0.001858812585438;
Leb_Grid_XYZW[ 54][0]= 0.270356088359165;
Leb_Grid_XYZW[ 54][1]= 0.680774406645524;
Leb_Grid_XYZW[ 54][2]= 0.680774406645524;
Leb_Grid_XYZW[ 54][3]= 0.001858812585438;
Leb_Grid_XYZW[ 55][0]=-0.270356088359165;
Leb_Grid_XYZW[ 55][1]= 0.680774406645524;
Leb_Grid_XYZW[ 55][2]= 0.680774406645524;
Leb_Grid_XYZW[ 55][3]= 0.001858812585438;
Leb_Grid_XYZW[ 56][0]= 0.270356088359165;
Leb_Grid_XYZW[ 56][1]=-0.680774406645524;
Leb_Grid_XYZW[ 56][2]= 0.680774406645524;
Leb_Grid_XYZW[ 56][3]= 0.001858812585438;
Leb_Grid_XYZW[ 57][0]=-0.270356088359165;
Leb_Grid_XYZW[ 57][1]=-0.680774406645524;
Leb_Grid_XYZW[ 57][2]= 0.680774406645524;
Leb_Grid_XYZW[ 57][3]= 0.001858812585438;
Leb_Grid_XYZW[ 58][0]= 0.270356088359165;
Leb_Grid_XYZW[ 58][1]= 0.680774406645524;
Leb_Grid_XYZW[ 58][2]=-0.680774406645524;
Leb_Grid_XYZW[ 58][3]= 0.001858812585438;
Leb_Grid_XYZW[ 59][0]=-0.270356088359165;
Leb_Grid_XYZW[ 59][1]= 0.680774406645524;
Leb_Grid_XYZW[ 59][2]=-0.680774406645524;
Leb_Grid_XYZW[ 59][3]= 0.001858812585438;
Leb_Grid_XYZW[ 60][0]= 0.270356088359165;
Leb_Grid_XYZW[ 60][1]=-0.680774406645524;
Leb_Grid_XYZW[ 60][2]=-0.680774406645524;
Leb_Grid_XYZW[ 60][3]= 0.001858812585438;
Leb_Grid_XYZW[ 61][0]=-0.270356088359165;
Leb_Grid_XYZW[ 61][1]=-0.680774406645524;
Leb_Grid_XYZW[ 61][2]=-0.680774406645524;
Leb_Grid_XYZW[ 61][3]= 0.001858812585438;
Leb_Grid_XYZW[ 62][0]= 0.637254693925875;
Leb_Grid_XYZW[ 62][1]= 0.637254693925875;
Leb_Grid_XYZW[ 62][2]= 0.433373868777154;
Leb_Grid_XYZW[ 62][3]= 0.001852028828296;
Leb_Grid_XYZW[ 63][0]=-0.637254693925875;
Leb_Grid_XYZW[ 63][1]= 0.637254693925875;
Leb_Grid_XYZW[ 63][2]= 0.433373868777154;
Leb_Grid_XYZW[ 63][3]= 0.001852028828296;
Leb_Grid_XYZW[ 64][0]= 0.637254693925875;
Leb_Grid_XYZW[ 64][1]=-0.637254693925875;
Leb_Grid_XYZW[ 64][2]= 0.433373868777154;
Leb_Grid_XYZW[ 64][3]= 0.001852028828296;
Leb_Grid_XYZW[ 65][0]=-0.637254693925875;
Leb_Grid_XYZW[ 65][1]=-0.637254693925875;
Leb_Grid_XYZW[ 65][2]= 0.433373868777154;
Leb_Grid_XYZW[ 65][3]= 0.001852028828296;
Leb_Grid_XYZW[ 66][0]= 0.637254693925875;
Leb_Grid_XYZW[ 66][1]= 0.637254693925875;
Leb_Grid_XYZW[ 66][2]=-0.433373868777154;
Leb_Grid_XYZW[ 66][3]= 0.001852028828296;
Leb_Grid_XYZW[ 67][0]=-0.637254693925875;
Leb_Grid_XYZW[ 67][1]= 0.637254693925875;
Leb_Grid_XYZW[ 67][2]=-0.433373868777154;
Leb_Grid_XYZW[ 67][3]= 0.001852028828296;
Leb_Grid_XYZW[ 68][0]= 0.637254693925875;
Leb_Grid_XYZW[ 68][1]=-0.637254693925875;
Leb_Grid_XYZW[ 68][2]=-0.433373868777154;
Leb_Grid_XYZW[ 68][3]= 0.001852028828296;
Leb_Grid_XYZW[ 69][0]=-0.637254693925875;
Leb_Grid_XYZW[ 69][1]=-0.637254693925875;
Leb_Grid_XYZW[ 69][2]=-0.433373868777154;
Leb_Grid_XYZW[ 69][3]= 0.001852028828296;
Leb_Grid_XYZW[ 70][0]= 0.637254693925875;
Leb_Grid_XYZW[ 70][1]= 0.433373868777154;
Leb_Grid_XYZW[ 70][2]= 0.637254693925875;
Leb_Grid_XYZW[ 70][3]= 0.001852028828296;
Leb_Grid_XYZW[ 71][0]=-0.637254693925875;
Leb_Grid_XYZW[ 71][1]= 0.433373868777154;
Leb_Grid_XYZW[ 71][2]= 0.637254693925875;
Leb_Grid_XYZW[ 71][3]= 0.001852028828296;
Leb_Grid_XYZW[ 72][0]= 0.637254693925875;
Leb_Grid_XYZW[ 72][1]=-0.433373868777154;
Leb_Grid_XYZW[ 72][2]= 0.637254693925875;
Leb_Grid_XYZW[ 72][3]= 0.001852028828296;
Leb_Grid_XYZW[ 73][0]=-0.637254693925875;
Leb_Grid_XYZW[ 73][1]=-0.433373868777154;
Leb_Grid_XYZW[ 73][2]= 0.637254693925875;
Leb_Grid_XYZW[ 73][3]= 0.001852028828296;
Leb_Grid_XYZW[ 74][0]= 0.637254693925875;
Leb_Grid_XYZW[ 74][1]= 0.433373868777154;
Leb_Grid_XYZW[ 74][2]=-0.637254693925875;
Leb_Grid_XYZW[ 74][3]= 0.001852028828296;
Leb_Grid_XYZW[ 75][0]=-0.637254693925875;
Leb_Grid_XYZW[ 75][1]= 0.433373868777154;
Leb_Grid_XYZW[ 75][2]=-0.637254693925875;
Leb_Grid_XYZW[ 75][3]= 0.001852028828296;
Leb_Grid_XYZW[ 76][0]= 0.637254693925875;
Leb_Grid_XYZW[ 76][1]=-0.433373868777154;
Leb_Grid_XYZW[ 76][2]=-0.637254693925875;
Leb_Grid_XYZW[ 76][3]= 0.001852028828296;
Leb_Grid_XYZW[ 77][0]=-0.637254693925875;
Leb_Grid_XYZW[ 77][1]=-0.433373868777154;
Leb_Grid_XYZW[ 77][2]=-0.637254693925875;
Leb_Grid_XYZW[ 77][3]= 0.001852028828296;
Leb_Grid_XYZW[ 78][0]= 0.433373868777154;
Leb_Grid_XYZW[ 78][1]= 0.637254693925875;
Leb_Grid_XYZW[ 78][2]= 0.637254693925875;
Leb_Grid_XYZW[ 78][3]= 0.001852028828296;
Leb_Grid_XYZW[ 79][0]=-0.433373868777154;
Leb_Grid_XYZW[ 79][1]= 0.637254693925875;
Leb_Grid_XYZW[ 79][2]= 0.637254693925875;
Leb_Grid_XYZW[ 79][3]= 0.001852028828296;
Leb_Grid_XYZW[ 80][0]= 0.433373868777154;
Leb_Grid_XYZW[ 80][1]=-0.637254693925875;
Leb_Grid_XYZW[ 80][2]= 0.637254693925875;
Leb_Grid_XYZW[ 80][3]= 0.001852028828296;
Leb_Grid_XYZW[ 81][0]=-0.433373868777154;
Leb_Grid_XYZW[ 81][1]=-0.637254693925875;
Leb_Grid_XYZW[ 81][2]= 0.637254693925875;
Leb_Grid_XYZW[ 81][3]= 0.001852028828296;
Leb_Grid_XYZW[ 82][0]= 0.433373868777154;
Leb_Grid_XYZW[ 82][1]= 0.637254693925875;
Leb_Grid_XYZW[ 82][2]=-0.637254693925875;
Leb_Grid_XYZW[ 82][3]= 0.001852028828296;
Leb_Grid_XYZW[ 83][0]=-0.433373868777154;
Leb_Grid_XYZW[ 83][1]= 0.637254693925875;
Leb_Grid_XYZW[ 83][2]=-0.637254693925875;
Leb_Grid_XYZW[ 83][3]= 0.001852028828296;
Leb_Grid_XYZW[ 84][0]= 0.433373868777154;
Leb_Grid_XYZW[ 84][1]=-0.637254693925875;
Leb_Grid_XYZW[ 84][2]=-0.637254693925875;
Leb_Grid_XYZW[ 84][3]= 0.001852028828296;
Leb_Grid_XYZW[ 85][0]=-0.433373868777154;
Leb_Grid_XYZW[ 85][1]=-0.637254693925875;
Leb_Grid_XYZW[ 85][2]=-0.637254693925875;
Leb_Grid_XYZW[ 85][3]= 0.001852028828296;
Leb_Grid_XYZW[ 86][0]= 0.504441970780036;
Leb_Grid_XYZW[ 86][1]= 0.504441970780036;
Leb_Grid_XYZW[ 86][2]= 0.700768575373573;
Leb_Grid_XYZW[ 86][3]= 0.001846715956151;
Leb_Grid_XYZW[ 87][0]=-0.504441970780036;
Leb_Grid_XYZW[ 87][1]= 0.504441970780036;
Leb_Grid_XYZW[ 87][2]= 0.700768575373573;
Leb_Grid_XYZW[ 87][3]= 0.001846715956151;
Leb_Grid_XYZW[ 88][0]= 0.504441970780036;
Leb_Grid_XYZW[ 88][1]=-0.504441970780036;
Leb_Grid_XYZW[ 88][2]= 0.700768575373573;
Leb_Grid_XYZW[ 88][3]= 0.001846715956151;
Leb_Grid_XYZW[ 89][0]=-0.504441970780036;
Leb_Grid_XYZW[ 89][1]=-0.504441970780036;
Leb_Grid_XYZW[ 89][2]= 0.700768575373573;
Leb_Grid_XYZW[ 89][3]= 0.001846715956151;
Leb_Grid_XYZW[ 90][0]= 0.504441970780036;
Leb_Grid_XYZW[ 90][1]= 0.504441970780036;
Leb_Grid_XYZW[ 90][2]=-0.700768575373573;
Leb_Grid_XYZW[ 90][3]= 0.001846715956151;
Leb_Grid_XYZW[ 91][0]=-0.504441970780036;
Leb_Grid_XYZW[ 91][1]= 0.504441970780036;
Leb_Grid_XYZW[ 91][2]=-0.700768575373573;
Leb_Grid_XYZW[ 91][3]= 0.001846715956151;
Leb_Grid_XYZW[ 92][0]= 0.504441970780036;
Leb_Grid_XYZW[ 92][1]=-0.504441970780036;
Leb_Grid_XYZW[ 92][2]=-0.700768575373573;
Leb_Grid_XYZW[ 92][3]= 0.001846715956151;
Leb_Grid_XYZW[ 93][0]=-0.504441970780036;
Leb_Grid_XYZW[ 93][1]=-0.504441970780036;
Leb_Grid_XYZW[ 93][2]=-0.700768575373573;
Leb_Grid_XYZW[ 93][3]= 0.001846715956151;
Leb_Grid_XYZW[ 94][0]= 0.504441970780036;
Leb_Grid_XYZW[ 94][1]= 0.700768575373573;
Leb_Grid_XYZW[ 94][2]= 0.504441970780036;
Leb_Grid_XYZW[ 94][3]= 0.001846715956151;
Leb_Grid_XYZW[ 95][0]=-0.504441970780036;
Leb_Grid_XYZW[ 95][1]= 0.700768575373573;
Leb_Grid_XYZW[ 95][2]= 0.504441970780036;
Leb_Grid_XYZW[ 95][3]= 0.001846715956151;
Leb_Grid_XYZW[ 96][0]= 0.504441970780036;
Leb_Grid_XYZW[ 96][1]=-0.700768575373573;
Leb_Grid_XYZW[ 96][2]= 0.504441970780036;
Leb_Grid_XYZW[ 96][3]= 0.001846715956151;
Leb_Grid_XYZW[ 97][0]=-0.504441970780036;
Leb_Grid_XYZW[ 97][1]=-0.700768575373573;
Leb_Grid_XYZW[ 97][2]= 0.504441970780036;
Leb_Grid_XYZW[ 97][3]= 0.001846715956151;
Leb_Grid_XYZW[ 98][0]= 0.504441970780036;
Leb_Grid_XYZW[ 98][1]= 0.700768575373573;
Leb_Grid_XYZW[ 98][2]=-0.504441970780036;
Leb_Grid_XYZW[ 98][3]= 0.001846715956151;
Leb_Grid_XYZW[ 99][0]=-0.504441970780036;
Leb_Grid_XYZW[ 99][1]= 0.700768575373573;
Leb_Grid_XYZW[ 99][2]=-0.504441970780036;
Leb_Grid_XYZW[ 99][3]= 0.001846715956151;
Leb_Grid_XYZW[ 100][0]= 0.504441970780036;
Leb_Grid_XYZW[ 100][1]=-0.700768575373573;
Leb_Grid_XYZW[ 100][2]=-0.504441970780036;
Leb_Grid_XYZW[ 100][3]= 0.001846715956151;
Leb_Grid_XYZW[ 101][0]=-0.504441970780036;
Leb_Grid_XYZW[ 101][1]=-0.700768575373573;
Leb_Grid_XYZW[ 101][2]=-0.504441970780036;
Leb_Grid_XYZW[ 101][3]= 0.001846715956151;
Leb_Grid_XYZW[ 102][0]= 0.700768575373573;
Leb_Grid_XYZW[ 102][1]= 0.504441970780036;
Leb_Grid_XYZW[ 102][2]= 0.504441970780036;
Leb_Grid_XYZW[ 102][3]= 0.001846715956151;
Leb_Grid_XYZW[ 103][0]=-0.700768575373573;
Leb_Grid_XYZW[ 103][1]= 0.504441970780036;
Leb_Grid_XYZW[ 103][2]= 0.504441970780036;
Leb_Grid_XYZW[ 103][3]= 0.001846715956151;
Leb_Grid_XYZW[ 104][0]= 0.700768575373573;
Leb_Grid_XYZW[ 104][1]=-0.504441970780036;
Leb_Grid_XYZW[ 104][2]= 0.504441970780036;
Leb_Grid_XYZW[ 104][3]= 0.001846715956151;
Leb_Grid_XYZW[ 105][0]=-0.700768575373573;
Leb_Grid_XYZW[ 105][1]=-0.504441970780036;
Leb_Grid_XYZW[ 105][2]= 0.504441970780036;
Leb_Grid_XYZW[ 105][3]= 0.001846715956151;
Leb_Grid_XYZW[ 106][0]= 0.700768575373573;
Leb_Grid_XYZW[ 106][1]= 0.504441970780036;
Leb_Grid_XYZW[ 106][2]=-0.504441970780036;
Leb_Grid_XYZW[ 106][3]= 0.001846715956151;
Leb_Grid_XYZW[ 107][0]=-0.700768575373573;
Leb_Grid_XYZW[ 107][1]= 0.504441970780036;
Leb_Grid_XYZW[ 107][2]=-0.504441970780036;
Leb_Grid_XYZW[ 107][3]= 0.001846715956151;
Leb_Grid_XYZW[ 108][0]= 0.700768575373573;
Leb_Grid_XYZW[ 108][1]=-0.504441970780036;
Leb_Grid_XYZW[ 108][2]=-0.504441970780036;
Leb_Grid_XYZW[ 108][3]= 0.001846715956151;
Leb_Grid_XYZW[ 109][0]=-0.700768575373573;
Leb_Grid_XYZW[ 109][1]=-0.504441970780036;
Leb_Grid_XYZW[ 109][2]=-0.504441970780036;
Leb_Grid_XYZW[ 109][3]= 0.001846715956151;
Leb_Grid_XYZW[ 110][0]= 0.421576178401097;
Leb_Grid_XYZW[ 110][1]= 0.421576178401097;
Leb_Grid_XYZW[ 110][2]= 0.802836877335274;
Leb_Grid_XYZW[ 110][3]= 0.001818471778163;
Leb_Grid_XYZW[ 111][0]=-0.421576178401097;
Leb_Grid_XYZW[ 111][1]= 0.421576178401097;
Leb_Grid_XYZW[ 111][2]= 0.802836877335274;
Leb_Grid_XYZW[ 111][3]= 0.001818471778163;
Leb_Grid_XYZW[ 112][0]= 0.421576178401097;
Leb_Grid_XYZW[ 112][1]=-0.421576178401097;
Leb_Grid_XYZW[ 112][2]= 0.802836877335274;
Leb_Grid_XYZW[ 112][3]= 0.001818471778163;
Leb_Grid_XYZW[ 113][0]=-0.421576178401097;
Leb_Grid_XYZW[ 113][1]=-0.421576178401097;
Leb_Grid_XYZW[ 113][2]= 0.802836877335274;
Leb_Grid_XYZW[ 113][3]= 0.001818471778163;
Leb_Grid_XYZW[ 114][0]= 0.421576178401097;
Leb_Grid_XYZW[ 114][1]= 0.421576178401097;
Leb_Grid_XYZW[ 114][2]=-0.802836877335274;
Leb_Grid_XYZW[ 114][3]= 0.001818471778163;
Leb_Grid_XYZW[ 115][0]=-0.421576178401097;
Leb_Grid_XYZW[ 115][1]= 0.421576178401097;
Leb_Grid_XYZW[ 115][2]=-0.802836877335274;
Leb_Grid_XYZW[ 115][3]= 0.001818471778163;
Leb_Grid_XYZW[ 116][0]= 0.421576178401097;
Leb_Grid_XYZW[ 116][1]=-0.421576178401097;
Leb_Grid_XYZW[ 116][2]=-0.802836877335274;
Leb_Grid_XYZW[ 116][3]= 0.001818471778163;
Leb_Grid_XYZW[ 117][0]=-0.421576178401097;
Leb_Grid_XYZW[ 117][1]=-0.421576178401097;
Leb_Grid_XYZW[ 117][2]=-0.802836877335274;
Leb_Grid_XYZW[ 117][3]= 0.001818471778163;
Leb_Grid_XYZW[ 118][0]= 0.421576178401097;
Leb_Grid_XYZW[ 118][1]= 0.802836877335274;
Leb_Grid_XYZW[ 118][2]= 0.421576178401097;
Leb_Grid_XYZW[ 118][3]= 0.001818471778163;
Leb_Grid_XYZW[ 119][0]=-0.421576178401097;
Leb_Grid_XYZW[ 119][1]= 0.802836877335274;
Leb_Grid_XYZW[ 119][2]= 0.421576178401097;
Leb_Grid_XYZW[ 119][3]= 0.001818471778163;
Leb_Grid_XYZW[ 120][0]= 0.421576178401097;
Leb_Grid_XYZW[ 120][1]=-0.802836877335274;
Leb_Grid_XYZW[ 120][2]= 0.421576178401097;
Leb_Grid_XYZW[ 120][3]= 0.001818471778163;
Leb_Grid_XYZW[ 121][0]=-0.421576178401097;
Leb_Grid_XYZW[ 121][1]=-0.802836877335274;
Leb_Grid_XYZW[ 121][2]= 0.421576178401097;
Leb_Grid_XYZW[ 121][3]= 0.001818471778163;
Leb_Grid_XYZW[ 122][0]= 0.421576178401097;
Leb_Grid_XYZW[ 122][1]= 0.802836877335274;
Leb_Grid_XYZW[ 122][2]=-0.421576178401097;
Leb_Grid_XYZW[ 122][3]= 0.001818471778163;
Leb_Grid_XYZW[ 123][0]=-0.421576178401097;
Leb_Grid_XYZW[ 123][1]= 0.802836877335274;
Leb_Grid_XYZW[ 123][2]=-0.421576178401097;
Leb_Grid_XYZW[ 123][3]= 0.001818471778163;
Leb_Grid_XYZW[ 124][0]= 0.421576178401097;
Leb_Grid_XYZW[ 124][1]=-0.802836877335274;
Leb_Grid_XYZW[ 124][2]=-0.421576178401097;
Leb_Grid_XYZW[ 124][3]= 0.001818471778163;
Leb_Grid_XYZW[ 125][0]=-0.421576178401097;
Leb_Grid_XYZW[ 125][1]=-0.802836877335274;
Leb_Grid_XYZW[ 125][2]=-0.421576178401097;
Leb_Grid_XYZW[ 125][3]= 0.001818471778163;
Leb_Grid_XYZW[ 126][0]= 0.802836877335274;
Leb_Grid_XYZW[ 126][1]= 0.421576178401097;
Leb_Grid_XYZW[ 126][2]= 0.421576178401097;
Leb_Grid_XYZW[ 126][3]= 0.001818471778163;
Leb_Grid_XYZW[ 127][0]=-0.802836877335274;
Leb_Grid_XYZW[ 127][1]= 0.421576178401097;
Leb_Grid_XYZW[ 127][2]= 0.421576178401097;
Leb_Grid_XYZW[ 127][3]= 0.001818471778163;
Leb_Grid_XYZW[ 128][0]= 0.802836877335274;
Leb_Grid_XYZW[ 128][1]=-0.421576178401097;
Leb_Grid_XYZW[ 128][2]= 0.421576178401097;
Leb_Grid_XYZW[ 128][3]= 0.001818471778163;
Leb_Grid_XYZW[ 129][0]=-0.802836877335274;
Leb_Grid_XYZW[ 129][1]=-0.421576178401097;
Leb_Grid_XYZW[ 129][2]= 0.421576178401097;
Leb_Grid_XYZW[ 129][3]= 0.001818471778163;
Leb_Grid_XYZW[ 130][0]= 0.802836877335274;
Leb_Grid_XYZW[ 130][1]= 0.421576178401097;
Leb_Grid_XYZW[ 130][2]=-0.421576178401097;
Leb_Grid_XYZW[ 130][3]= 0.001818471778163;
Leb_Grid_XYZW[ 131][0]=-0.802836877335274;
Leb_Grid_XYZW[ 131][1]= 0.421576178401097;
Leb_Grid_XYZW[ 131][2]=-0.421576178401097;
Leb_Grid_XYZW[ 131][3]= 0.001818471778163;
Leb_Grid_XYZW[ 132][0]= 0.802836877335274;
Leb_Grid_XYZW[ 132][1]=-0.421576178401097;
Leb_Grid_XYZW[ 132][2]=-0.421576178401097;
Leb_Grid_XYZW[ 132][3]= 0.001818471778163;
Leb_Grid_XYZW[ 133][0]=-0.802836877335274;
Leb_Grid_XYZW[ 133][1]=-0.421576178401097;
Leb_Grid_XYZW[ 133][2]=-0.421576178401097;
Leb_Grid_XYZW[ 133][3]= 0.001818471778163;
Leb_Grid_XYZW[ 134][0]= 0.331792073647212;
Leb_Grid_XYZW[ 134][1]= 0.331792073647212;
Leb_Grid_XYZW[ 134][2]= 0.883078727934133;
Leb_Grid_XYZW[ 134][3]= 0.001749564657281;
Leb_Grid_XYZW[ 135][0]=-0.331792073647212;
Leb_Grid_XYZW[ 135][1]= 0.331792073647212;
Leb_Grid_XYZW[ 135][2]= 0.883078727934133;
Leb_Grid_XYZW[ 135][3]= 0.001749564657281;
Leb_Grid_XYZW[ 136][0]= 0.331792073647212;
Leb_Grid_XYZW[ 136][1]=-0.331792073647212;
Leb_Grid_XYZW[ 136][2]= 0.883078727934133;
Leb_Grid_XYZW[ 136][3]= 0.001749564657281;
Leb_Grid_XYZW[ 137][0]=-0.331792073647212;
Leb_Grid_XYZW[ 137][1]=-0.331792073647212;
Leb_Grid_XYZW[ 137][2]= 0.883078727934133;
Leb_Grid_XYZW[ 137][3]= 0.001749564657281;
Leb_Grid_XYZW[ 138][0]= 0.331792073647212;
Leb_Grid_XYZW[ 138][1]= 0.331792073647212;
Leb_Grid_XYZW[ 138][2]=-0.883078727934133;
Leb_Grid_XYZW[ 138][3]= 0.001749564657281;
Leb_Grid_XYZW[ 139][0]=-0.331792073647212;
Leb_Grid_XYZW[ 139][1]= 0.331792073647212;
Leb_Grid_XYZW[ 139][2]=-0.883078727934133;
Leb_Grid_XYZW[ 139][3]= 0.001749564657281;
Leb_Grid_XYZW[ 140][0]= 0.331792073647212;
Leb_Grid_XYZW[ 140][1]=-0.331792073647212;
Leb_Grid_XYZW[ 140][2]=-0.883078727934133;
Leb_Grid_XYZW[ 140][3]= 0.001749564657281;
Leb_Grid_XYZW[ 141][0]=-0.331792073647212;
Leb_Grid_XYZW[ 141][1]=-0.331792073647212;
Leb_Grid_XYZW[ 141][2]=-0.883078727934133;
Leb_Grid_XYZW[ 141][3]= 0.001749564657281;
Leb_Grid_XYZW[ 142][0]= 0.331792073647212;
Leb_Grid_XYZW[ 142][1]= 0.883078727934133;
Leb_Grid_XYZW[ 142][2]= 0.331792073647212;
Leb_Grid_XYZW[ 142][3]= 0.001749564657281;
Leb_Grid_XYZW[ 143][0]=-0.331792073647212;
Leb_Grid_XYZW[ 143][1]= 0.883078727934133;
Leb_Grid_XYZW[ 143][2]= 0.331792073647212;
Leb_Grid_XYZW[ 143][3]= 0.001749564657281;
Leb_Grid_XYZW[ 144][0]= 0.331792073647212;
Leb_Grid_XYZW[ 144][1]=-0.883078727934133;
Leb_Grid_XYZW[ 144][2]= 0.331792073647212;
Leb_Grid_XYZW[ 144][3]= 0.001749564657281;
Leb_Grid_XYZW[ 145][0]=-0.331792073647212;
Leb_Grid_XYZW[ 145][1]=-0.883078727934133;
Leb_Grid_XYZW[ 145][2]= 0.331792073647212;
Leb_Grid_XYZW[ 145][3]= 0.001749564657281;
Leb_Grid_XYZW[ 146][0]= 0.331792073647212;
Leb_Grid_XYZW[ 146][1]= 0.883078727934133;
Leb_Grid_XYZW[ 146][2]=-0.331792073647212;
Leb_Grid_XYZW[ 146][3]= 0.001749564657281;
Leb_Grid_XYZW[ 147][0]=-0.331792073647212;
Leb_Grid_XYZW[ 147][1]= 0.883078727934133;
Leb_Grid_XYZW[ 147][2]=-0.331792073647212;
Leb_Grid_XYZW[ 147][3]= 0.001749564657281;
Leb_Grid_XYZW[ 148][0]= 0.331792073647212;
Leb_Grid_XYZW[ 148][1]=-0.883078727934133;
Leb_Grid_XYZW[ 148][2]=-0.331792073647212;
Leb_Grid_XYZW[ 148][3]= 0.001749564657281;
Leb_Grid_XYZW[ 149][0]=-0.331792073647212;
Leb_Grid_XYZW[ 149][1]=-0.883078727934133;
Leb_Grid_XYZW[ 149][2]=-0.331792073647212;
Leb_Grid_XYZW[ 149][3]= 0.001749564657281;
Leb_Grid_XYZW[ 150][0]= 0.883078727934133;
Leb_Grid_XYZW[ 150][1]= 0.331792073647212;
Leb_Grid_XYZW[ 150][2]= 0.331792073647212;
Leb_Grid_XYZW[ 150][3]= 0.001749564657281;
Leb_Grid_XYZW[ 151][0]=-0.883078727934133;
Leb_Grid_XYZW[ 151][1]= 0.331792073647212;
Leb_Grid_XYZW[ 151][2]= 0.331792073647212;
Leb_Grid_XYZW[ 151][3]= 0.001749564657281;
Leb_Grid_XYZW[ 152][0]= 0.883078727934133;
Leb_Grid_XYZW[ 152][1]=-0.331792073647212;
Leb_Grid_XYZW[ 152][2]= 0.331792073647212;
Leb_Grid_XYZW[ 152][3]= 0.001749564657281;
Leb_Grid_XYZW[ 153][0]=-0.883078727934133;
Leb_Grid_XYZW[ 153][1]=-0.331792073647212;
Leb_Grid_XYZW[ 153][2]= 0.331792073647212;
Leb_Grid_XYZW[ 153][3]= 0.001749564657281;
Leb_Grid_XYZW[ 154][0]= 0.883078727934133;
Leb_Grid_XYZW[ 154][1]= 0.331792073647212;
Leb_Grid_XYZW[ 154][2]=-0.331792073647212;
Leb_Grid_XYZW[ 154][3]= 0.001749564657281;
Leb_Grid_XYZW[ 155][0]=-0.883078727934133;
Leb_Grid_XYZW[ 155][1]= 0.331792073647212;
Leb_Grid_XYZW[ 155][2]=-0.331792073647212;
Leb_Grid_XYZW[ 155][3]= 0.001749564657281;
Leb_Grid_XYZW[ 156][0]= 0.883078727934133;
Leb_Grid_XYZW[ 156][1]=-0.331792073647212;
Leb_Grid_XYZW[ 156][2]=-0.331792073647212;
Leb_Grid_XYZW[ 156][3]= 0.001749564657281;
Leb_Grid_XYZW[ 157][0]=-0.883078727934133;
Leb_Grid_XYZW[ 157][1]=-0.331792073647212;
Leb_Grid_XYZW[ 157][2]=-0.331792073647212;
Leb_Grid_XYZW[ 157][3]= 0.001749564657281;
Leb_Grid_XYZW[ 158][0]= 0.238473670142189;
Leb_Grid_XYZW[ 158][1]= 0.238473670142189;
Leb_Grid_XYZW[ 158][2]= 0.941414158220403;
Leb_Grid_XYZW[ 158][3]= 0.001617210647254;
Leb_Grid_XYZW[ 159][0]=-0.238473670142189;
Leb_Grid_XYZW[ 159][1]= 0.238473670142189;
Leb_Grid_XYZW[ 159][2]= 0.941414158220403;
Leb_Grid_XYZW[ 159][3]= 0.001617210647254;
Leb_Grid_XYZW[ 160][0]= 0.238473670142189;
Leb_Grid_XYZW[ 160][1]=-0.238473670142189;
Leb_Grid_XYZW[ 160][2]= 0.941414158220403;
Leb_Grid_XYZW[ 160][3]= 0.001617210647254;
Leb_Grid_XYZW[ 161][0]=-0.238473670142189;
Leb_Grid_XYZW[ 161][1]=-0.238473670142189;
Leb_Grid_XYZW[ 161][2]= 0.941414158220403;
Leb_Grid_XYZW[ 161][3]= 0.001617210647254;
Leb_Grid_XYZW[ 162][0]= 0.238473670142189;
Leb_Grid_XYZW[ 162][1]= 0.238473670142189;
Leb_Grid_XYZW[ 162][2]=-0.941414158220403;
Leb_Grid_XYZW[ 162][3]= 0.001617210647254;
Leb_Grid_XYZW[ 163][0]=-0.238473670142189;
Leb_Grid_XYZW[ 163][1]= 0.238473670142189;
Leb_Grid_XYZW[ 163][2]=-0.941414158220403;
Leb_Grid_XYZW[ 163][3]= 0.001617210647254;
Leb_Grid_XYZW[ 164][0]= 0.238473670142189;
Leb_Grid_XYZW[ 164][1]=-0.238473670142189;
Leb_Grid_XYZW[ 164][2]=-0.941414158220403;
Leb_Grid_XYZW[ 164][3]= 0.001617210647254;
Leb_Grid_XYZW[ 165][0]=-0.238473670142189;
Leb_Grid_XYZW[ 165][1]=-0.238473670142189;
Leb_Grid_XYZW[ 165][2]=-0.941414158220403;
Leb_Grid_XYZW[ 165][3]= 0.001617210647254;
Leb_Grid_XYZW[ 166][0]= 0.238473670142189;
Leb_Grid_XYZW[ 166][1]= 0.941414158220403;
Leb_Grid_XYZW[ 166][2]= 0.238473670142189;
Leb_Grid_XYZW[ 166][3]= 0.001617210647254;
Leb_Grid_XYZW[ 167][0]=-0.238473670142189;
Leb_Grid_XYZW[ 167][1]= 0.941414158220403;
Leb_Grid_XYZW[ 167][2]= 0.238473670142189;
Leb_Grid_XYZW[ 167][3]= 0.001617210647254;
Leb_Grid_XYZW[ 168][0]= 0.238473670142189;
Leb_Grid_XYZW[ 168][1]=-0.941414158220403;
Leb_Grid_XYZW[ 168][2]= 0.238473670142189;
Leb_Grid_XYZW[ 168][3]= 0.001617210647254;
Leb_Grid_XYZW[ 169][0]=-0.238473670142189;
Leb_Grid_XYZW[ 169][1]=-0.941414158220403;
Leb_Grid_XYZW[ 169][2]= 0.238473670142189;
Leb_Grid_XYZW[ 169][3]= 0.001617210647254;
Leb_Grid_XYZW[ 170][0]= 0.238473670142189;
Leb_Grid_XYZW[ 170][1]= 0.941414158220403;
Leb_Grid_XYZW[ 170][2]=-0.238473670142189;
Leb_Grid_XYZW[ 170][3]= 0.001617210647254;
Leb_Grid_XYZW[ 171][0]=-0.238473670142189;
Leb_Grid_XYZW[ 171][1]= 0.941414158220403;
Leb_Grid_XYZW[ 171][2]=-0.238473670142189;
Leb_Grid_XYZW[ 171][3]= 0.001617210647254;
Leb_Grid_XYZW[ 172][0]= 0.238473670142189;
Leb_Grid_XYZW[ 172][1]=-0.941414158220403;
Leb_Grid_XYZW[ 172][2]=-0.238473670142189;
Leb_Grid_XYZW[ 172][3]= 0.001617210647254;
Leb_Grid_XYZW[ 173][0]=-0.238473670142189;
Leb_Grid_XYZW[ 173][1]=-0.941414158220403;
Leb_Grid_XYZW[ 173][2]=-0.238473670142189;
Leb_Grid_XYZW[ 173][3]= 0.001617210647254;
Leb_Grid_XYZW[ 174][0]= 0.941414158220403;
Leb_Grid_XYZW[ 174][1]= 0.238473670142189;
Leb_Grid_XYZW[ 174][2]= 0.238473670142189;
Leb_Grid_XYZW[ 174][3]= 0.001617210647254;
Leb_Grid_XYZW[ 175][0]=-0.941414158220403;
Leb_Grid_XYZW[ 175][1]= 0.238473670142189;
Leb_Grid_XYZW[ 175][2]= 0.238473670142189;
Leb_Grid_XYZW[ 175][3]= 0.001617210647254;
Leb_Grid_XYZW[ 176][0]= 0.941414158220403;
Leb_Grid_XYZW[ 176][1]=-0.238473670142189;
Leb_Grid_XYZW[ 176][2]= 0.238473670142189;
Leb_Grid_XYZW[ 176][3]= 0.001617210647254;
Leb_Grid_XYZW[ 177][0]=-0.941414158220403;
Leb_Grid_XYZW[ 177][1]=-0.238473670142189;
Leb_Grid_XYZW[ 177][2]= 0.238473670142189;
Leb_Grid_XYZW[ 177][3]= 0.001617210647254;
Leb_Grid_XYZW[ 178][0]= 0.941414158220403;
Leb_Grid_XYZW[ 178][1]= 0.238473670142189;
Leb_Grid_XYZW[ 178][2]=-0.238473670142189;
Leb_Grid_XYZW[ 178][3]= 0.001617210647254;
Leb_Grid_XYZW[ 179][0]=-0.941414158220403;
Leb_Grid_XYZW[ 179][1]= 0.238473670142189;
Leb_Grid_XYZW[ 179][2]=-0.238473670142189;
Leb_Grid_XYZW[ 179][3]= 0.001617210647254;
Leb_Grid_XYZW[ 180][0]= 0.941414158220403;
Leb_Grid_XYZW[ 180][1]=-0.238473670142189;
Leb_Grid_XYZW[ 180][2]=-0.238473670142189;
Leb_Grid_XYZW[ 180][3]= 0.001617210647254;
Leb_Grid_XYZW[ 181][0]=-0.941414158220403;
Leb_Grid_XYZW[ 181][1]=-0.238473670142189;
Leb_Grid_XYZW[ 181][2]=-0.238473670142189;
Leb_Grid_XYZW[ 181][3]= 0.001617210647254;
Leb_Grid_XYZW[ 182][0]= 0.145903644915776;
Leb_Grid_XYZW[ 182][1]= 0.145903644915776;
Leb_Grid_XYZW[ 182][2]= 0.978480583762694;
Leb_Grid_XYZW[ 182][3]= 0.001384737234852;
Leb_Grid_XYZW[ 183][0]=-0.145903644915776;
Leb_Grid_XYZW[ 183][1]= 0.145903644915776;
Leb_Grid_XYZW[ 183][2]= 0.978480583762694;
Leb_Grid_XYZW[ 183][3]= 0.001384737234852;
Leb_Grid_XYZW[ 184][0]= 0.145903644915776;
Leb_Grid_XYZW[ 184][1]=-0.145903644915776;
Leb_Grid_XYZW[ 184][2]= 0.978480583762694;
Leb_Grid_XYZW[ 184][3]= 0.001384737234852;
Leb_Grid_XYZW[ 185][0]=-0.145903644915776;
Leb_Grid_XYZW[ 185][1]=-0.145903644915776;
Leb_Grid_XYZW[ 185][2]= 0.978480583762694;
Leb_Grid_XYZW[ 185][3]= 0.001384737234852;
Leb_Grid_XYZW[ 186][0]= 0.145903644915776;
Leb_Grid_XYZW[ 186][1]= 0.145903644915776;
Leb_Grid_XYZW[ 186][2]=-0.978480583762694;
Leb_Grid_XYZW[ 186][3]= 0.001384737234852;
Leb_Grid_XYZW[ 187][0]=-0.145903644915776;
Leb_Grid_XYZW[ 187][1]= 0.145903644915776;
Leb_Grid_XYZW[ 187][2]=-0.978480583762694;
Leb_Grid_XYZW[ 187][3]= 0.001384737234852;
Leb_Grid_XYZW[ 188][0]= 0.145903644915776;
Leb_Grid_XYZW[ 188][1]=-0.145903644915776;
Leb_Grid_XYZW[ 188][2]=-0.978480583762694;
Leb_Grid_XYZW[ 188][3]= 0.001384737234852;
Leb_Grid_XYZW[ 189][0]=-0.145903644915776;
Leb_Grid_XYZW[ 189][1]=-0.145903644915776;
Leb_Grid_XYZW[ 189][2]=-0.978480583762694;
Leb_Grid_XYZW[ 189][3]= 0.001384737234852;
Leb_Grid_XYZW[ 190][0]= 0.145903644915776;
Leb_Grid_XYZW[ 190][1]= 0.978480583762694;
Leb_Grid_XYZW[ 190][2]= 0.145903644915776;
Leb_Grid_XYZW[ 190][3]= 0.001384737234852;
Leb_Grid_XYZW[ 191][0]=-0.145903644915776;
Leb_Grid_XYZW[ 191][1]= 0.978480583762694;
Leb_Grid_XYZW[ 191][2]= 0.145903644915776;
Leb_Grid_XYZW[ 191][3]= 0.001384737234852;
Leb_Grid_XYZW[ 192][0]= 0.145903644915776;
Leb_Grid_XYZW[ 192][1]=-0.978480583762694;
Leb_Grid_XYZW[ 192][2]= 0.145903644915776;
Leb_Grid_XYZW[ 192][3]= 0.001384737234852;
Leb_Grid_XYZW[ 193][0]=-0.145903644915776;
Leb_Grid_XYZW[ 193][1]=-0.978480583762694;
Leb_Grid_XYZW[ 193][2]= 0.145903644915776;
Leb_Grid_XYZW[ 193][3]= 0.001384737234852;
Leb_Grid_XYZW[ 194][0]= 0.145903644915776;
Leb_Grid_XYZW[ 194][1]= 0.978480583762694;
Leb_Grid_XYZW[ 194][2]=-0.145903644915776;
Leb_Grid_XYZW[ 194][3]= 0.001384737234852;
Leb_Grid_XYZW[ 195][0]=-0.145903644915776;
Leb_Grid_XYZW[ 195][1]= 0.978480583762694;
Leb_Grid_XYZW[ 195][2]=-0.145903644915776;
Leb_Grid_XYZW[ 195][3]= 0.001384737234852;
Leb_Grid_XYZW[ 196][0]= 0.145903644915776;
Leb_Grid_XYZW[ 196][1]=-0.978480583762694;
Leb_Grid_XYZW[ 196][2]=-0.145903644915776;
Leb_Grid_XYZW[ 196][3]= 0.001384737234852;
Leb_Grid_XYZW[ 197][0]=-0.145903644915776;
Leb_Grid_XYZW[ 197][1]=-0.978480583762694;
Leb_Grid_XYZW[ 197][2]=-0.145903644915776;
Leb_Grid_XYZW[ 197][3]= 0.001384737234852;
Leb_Grid_XYZW[ 198][0]= 0.978480583762694;
Leb_Grid_XYZW[ 198][1]= 0.145903644915776;
Leb_Grid_XYZW[ 198][2]= 0.145903644915776;
Leb_Grid_XYZW[ 198][3]= 0.001384737234852;
Leb_Grid_XYZW[ 199][0]=-0.978480583762694;
Leb_Grid_XYZW[ 199][1]= 0.145903644915776;
Leb_Grid_XYZW[ 199][2]= 0.145903644915776;
Leb_Grid_XYZW[ 199][3]= 0.001384737234852;
Leb_Grid_XYZW[ 200][0]= 0.978480583762694;
Leb_Grid_XYZW[ 200][1]=-0.145903644915776;
Leb_Grid_XYZW[ 200][2]= 0.145903644915776;
Leb_Grid_XYZW[ 200][3]= 0.001384737234852;
Leb_Grid_XYZW[ 201][0]=-0.978480583762694;
Leb_Grid_XYZW[ 201][1]=-0.145903644915776;
Leb_Grid_XYZW[ 201][2]= 0.145903644915776;
Leb_Grid_XYZW[ 201][3]= 0.001384737234852;
Leb_Grid_XYZW[ 202][0]= 0.978480583762694;
Leb_Grid_XYZW[ 202][1]= 0.145903644915776;
Leb_Grid_XYZW[ 202][2]=-0.145903644915776;
Leb_Grid_XYZW[ 202][3]= 0.001384737234852;
Leb_Grid_XYZW[ 203][0]=-0.978480583762694;
Leb_Grid_XYZW[ 203][1]= 0.145903644915776;
Leb_Grid_XYZW[ 203][2]=-0.145903644915776;
Leb_Grid_XYZW[ 203][3]= 0.001384737234852;
Leb_Grid_XYZW[ 204][0]= 0.978480583762694;
Leb_Grid_XYZW[ 204][1]=-0.145903644915776;
Leb_Grid_XYZW[ 204][2]=-0.145903644915776;
Leb_Grid_XYZW[ 204][3]= 0.001384737234852;
Leb_Grid_XYZW[ 205][0]=-0.978480583762694;
Leb_Grid_XYZW[ 205][1]=-0.145903644915776;
Leb_Grid_XYZW[ 205][2]=-0.145903644915776;
Leb_Grid_XYZW[ 205][3]= 0.001384737234852;
Leb_Grid_XYZW[ 206][0]= 0.060950341155072;
Leb_Grid_XYZW[ 206][1]= 0.060950341155072;
Leb_Grid_XYZW[ 206][2]= 0.996278129754016;
Leb_Grid_XYZW[ 206][3]= 0.000976433116505;
Leb_Grid_XYZW[ 207][0]=-0.060950341155072;
Leb_Grid_XYZW[ 207][1]= 0.060950341155072;
Leb_Grid_XYZW[ 207][2]= 0.996278129754016;
Leb_Grid_XYZW[ 207][3]= 0.000976433116505;
Leb_Grid_XYZW[ 208][0]= 0.060950341155072;
Leb_Grid_XYZW[ 208][1]=-0.060950341155072;
Leb_Grid_XYZW[ 208][2]= 0.996278129754016;
Leb_Grid_XYZW[ 208][3]= 0.000976433116505;
Leb_Grid_XYZW[ 209][0]=-0.060950341155072;
Leb_Grid_XYZW[ 209][1]=-0.060950341155072;
Leb_Grid_XYZW[ 209][2]= 0.996278129754016;
Leb_Grid_XYZW[ 209][3]= 0.000976433116505;
Leb_Grid_XYZW[ 210][0]= 0.060950341155072;
Leb_Grid_XYZW[ 210][1]= 0.060950341155072;
Leb_Grid_XYZW[ 210][2]=-0.996278129754016;
Leb_Grid_XYZW[ 210][3]= 0.000976433116505;
Leb_Grid_XYZW[ 211][0]=-0.060950341155072;
Leb_Grid_XYZW[ 211][1]= 0.060950341155072;
Leb_Grid_XYZW[ 211][2]=-0.996278129754016;
Leb_Grid_XYZW[ 211][3]= 0.000976433116505;
Leb_Grid_XYZW[ 212][0]= 0.060950341155072;
Leb_Grid_XYZW[ 212][1]=-0.060950341155072;
Leb_Grid_XYZW[ 212][2]=-0.996278129754016;
Leb_Grid_XYZW[ 212][3]= 0.000976433116505;
Leb_Grid_XYZW[ 213][0]=-0.060950341155072;
Leb_Grid_XYZW[ 213][1]=-0.060950341155072;
Leb_Grid_XYZW[ 213][2]=-0.996278129754016;
Leb_Grid_XYZW[ 213][3]= 0.000976433116505;
Leb_Grid_XYZW[ 214][0]= 0.060950341155072;
Leb_Grid_XYZW[ 214][1]= 0.996278129754016;
Leb_Grid_XYZW[ 214][2]= 0.060950341155072;
Leb_Grid_XYZW[ 214][3]= 0.000976433116505;
Leb_Grid_XYZW[ 215][0]=-0.060950341155072;
Leb_Grid_XYZW[ 215][1]= 0.996278129754016;
Leb_Grid_XYZW[ 215][2]= 0.060950341155072;
Leb_Grid_XYZW[ 215][3]= 0.000976433116505;
Leb_Grid_XYZW[ 216][0]= 0.060950341155072;
Leb_Grid_XYZW[ 216][1]=-0.996278129754016;
Leb_Grid_XYZW[ 216][2]= 0.060950341155072;
Leb_Grid_XYZW[ 216][3]= 0.000976433116505;
Leb_Grid_XYZW[ 217][0]=-0.060950341155072;
Leb_Grid_XYZW[ 217][1]=-0.996278129754016;
Leb_Grid_XYZW[ 217][2]= 0.060950341155072;
Leb_Grid_XYZW[ 217][3]= 0.000976433116505;
Leb_Grid_XYZW[ 218][0]= 0.060950341155072;
Leb_Grid_XYZW[ 218][1]= 0.996278129754016;
Leb_Grid_XYZW[ 218][2]=-0.060950341155072;
Leb_Grid_XYZW[ 218][3]= 0.000976433116505;
Leb_Grid_XYZW[ 219][0]=-0.060950341155072;
Leb_Grid_XYZW[ 219][1]= 0.996278129754016;
Leb_Grid_XYZW[ 219][2]=-0.060950341155072;
Leb_Grid_XYZW[ 219][3]= 0.000976433116505;
Leb_Grid_XYZW[ 220][0]= 0.060950341155072;
Leb_Grid_XYZW[ 220][1]=-0.996278129754016;
Leb_Grid_XYZW[ 220][2]=-0.060950341155072;
Leb_Grid_XYZW[ 220][3]= 0.000976433116505;
Leb_Grid_XYZW[ 221][0]=-0.060950341155072;
Leb_Grid_XYZW[ 221][1]=-0.996278129754016;
Leb_Grid_XYZW[ 221][2]=-0.060950341155072;
Leb_Grid_XYZW[ 221][3]= 0.000976433116505;
Leb_Grid_XYZW[ 222][0]= 0.996278129754016;
Leb_Grid_XYZW[ 222][1]= 0.060950341155072;
Leb_Grid_XYZW[ 222][2]= 0.060950341155072;
Leb_Grid_XYZW[ 222][3]= 0.000976433116505;
Leb_Grid_XYZW[ 223][0]=-0.996278129754016;
Leb_Grid_XYZW[ 223][1]= 0.060950341155072;
Leb_Grid_XYZW[ 223][2]= 0.060950341155072;
Leb_Grid_XYZW[ 223][3]= 0.000976433116505;
Leb_Grid_XYZW[ 224][0]= 0.996278129754016;
Leb_Grid_XYZW[ 224][1]=-0.060950341155072;
Leb_Grid_XYZW[ 224][2]= 0.060950341155072;
Leb_Grid_XYZW[ 224][3]= 0.000976433116505;
Leb_Grid_XYZW[ 225][0]=-0.996278129754016;
Leb_Grid_XYZW[ 225][1]=-0.060950341155072;
Leb_Grid_XYZW[ 225][2]= 0.060950341155072;
Leb_Grid_XYZW[ 225][3]= 0.000976433116505;
Leb_Grid_XYZW[ 226][0]= 0.996278129754016;
Leb_Grid_XYZW[ 226][1]= 0.060950341155072;
Leb_Grid_XYZW[ 226][2]=-0.060950341155072;
Leb_Grid_XYZW[ 226][3]= 0.000976433116505;
Leb_Grid_XYZW[ 227][0]=-0.996278129754016;
Leb_Grid_XYZW[ 227][1]= 0.060950341155072;
Leb_Grid_XYZW[ 227][2]=-0.060950341155072;
Leb_Grid_XYZW[ 227][3]= 0.000976433116505;
Leb_Grid_XYZW[ 228][0]= 0.996278129754016;
Leb_Grid_XYZW[ 228][1]=-0.060950341155072;
Leb_Grid_XYZW[ 228][2]=-0.060950341155072;
Leb_Grid_XYZW[ 228][3]= 0.000976433116505;
Leb_Grid_XYZW[ 229][0]=-0.996278129754016;
Leb_Grid_XYZW[ 229][1]=-0.060950341155072;
Leb_Grid_XYZW[ 229][2]=-0.060950341155072;
Leb_Grid_XYZW[ 229][3]= 0.000976433116505;
Leb_Grid_XYZW[ 230][0]= 0.611684344200988;
Leb_Grid_XYZW[ 230][1]= 0.791101929626902;
Leb_Grid_XYZW[ 230][2]= 0.000000000000000;
Leb_Grid_XYZW[ 230][3]= 0.001857161196774;
Leb_Grid_XYZW[ 231][0]=-0.611684344200988;
Leb_Grid_XYZW[ 231][1]= 0.791101929626902;
Leb_Grid_XYZW[ 231][2]= 0.000000000000000;
Leb_Grid_XYZW[ 231][3]= 0.001857161196774;
Leb_Grid_XYZW[ 232][0]= 0.611684344200988;
Leb_Grid_XYZW[ 232][1]=-0.791101929626902;
Leb_Grid_XYZW[ 232][2]= 0.000000000000000;
Leb_Grid_XYZW[ 232][3]= 0.001857161196774;
Leb_Grid_XYZW[ 233][0]=-0.611684344200988;
Leb_Grid_XYZW[ 233][1]=-0.791101929626902;
Leb_Grid_XYZW[ 233][2]= 0.000000000000000;
Leb_Grid_XYZW[ 233][3]= 0.001857161196774;
Leb_Grid_XYZW[ 234][0]= 0.791101929626902;
Leb_Grid_XYZW[ 234][1]= 0.611684344200988;
Leb_Grid_XYZW[ 234][2]= 0.000000000000000;
Leb_Grid_XYZW[ 234][3]= 0.001857161196774;
Leb_Grid_XYZW[ 235][0]=-0.791101929626902;
Leb_Grid_XYZW[ 235][1]= 0.611684344200988;
Leb_Grid_XYZW[ 235][2]= 0.000000000000000;
Leb_Grid_XYZW[ 235][3]= 0.001857161196774;
Leb_Grid_XYZW[ 236][0]= 0.791101929626902;
Leb_Grid_XYZW[ 236][1]=-0.611684344200988;
Leb_Grid_XYZW[ 236][2]= 0.000000000000000;
Leb_Grid_XYZW[ 236][3]= 0.001857161196774;
Leb_Grid_XYZW[ 237][0]=-0.791101929626902;
Leb_Grid_XYZW[ 237][1]=-0.611684344200988;
Leb_Grid_XYZW[ 237][2]= 0.000000000000000;
Leb_Grid_XYZW[ 237][3]= 0.001857161196774;
Leb_Grid_XYZW[ 238][0]= 0.611684344200988;
Leb_Grid_XYZW[ 238][1]= 0.000000000000000;
Leb_Grid_XYZW[ 238][2]= 0.791101929626902;
Leb_Grid_XYZW[ 238][3]= 0.001857161196774;
Leb_Grid_XYZW[ 239][0]=-0.611684344200988;
Leb_Grid_XYZW[ 239][1]= 0.000000000000000;
Leb_Grid_XYZW[ 239][2]= 0.791101929626902;
Leb_Grid_XYZW[ 239][3]= 0.001857161196774;
Leb_Grid_XYZW[ 240][0]= 0.611684344200988;
Leb_Grid_XYZW[ 240][1]= 0.000000000000000;
Leb_Grid_XYZW[ 240][2]=-0.791101929626902;
Leb_Grid_XYZW[ 240][3]= 0.001857161196774;
Leb_Grid_XYZW[ 241][0]=-0.611684344200988;
Leb_Grid_XYZW[ 241][1]= 0.000000000000000;
Leb_Grid_XYZW[ 241][2]=-0.791101929626902;
Leb_Grid_XYZW[ 241][3]= 0.001857161196774;
Leb_Grid_XYZW[ 242][0]= 0.791101929626902;
Leb_Grid_XYZW[ 242][1]= 0.000000000000000;
Leb_Grid_XYZW[ 242][2]= 0.611684344200988;
Leb_Grid_XYZW[ 242][3]= 0.001857161196774;
Leb_Grid_XYZW[ 243][0]=-0.791101929626902;
Leb_Grid_XYZW[ 243][1]= 0.000000000000000;
Leb_Grid_XYZW[ 243][2]= 0.611684344200988;
Leb_Grid_XYZW[ 243][3]= 0.001857161196774;
Leb_Grid_XYZW[ 244][0]= 0.791101929626902;
Leb_Grid_XYZW[ 244][1]= 0.000000000000000;
Leb_Grid_XYZW[ 244][2]=-0.611684344200988;
Leb_Grid_XYZW[ 244][3]= 0.001857161196774;
Leb_Grid_XYZW[ 245][0]=-0.791101929626902;
Leb_Grid_XYZW[ 245][1]= 0.000000000000000;
Leb_Grid_XYZW[ 245][2]=-0.611684344200988;
Leb_Grid_XYZW[ 245][3]= 0.001857161196774;
Leb_Grid_XYZW[ 246][0]= 0.000000000000000;
Leb_Grid_XYZW[ 246][1]= 0.611684344200988;
Leb_Grid_XYZW[ 246][2]= 0.791101929626902;
Leb_Grid_XYZW[ 246][3]= 0.001857161196774;
Leb_Grid_XYZW[ 247][0]= 0.000000000000000;
Leb_Grid_XYZW[ 247][1]=-0.611684344200988;
Leb_Grid_XYZW[ 247][2]= 0.791101929626902;
Leb_Grid_XYZW[ 247][3]= 0.001857161196774;
Leb_Grid_XYZW[ 248][0]= 0.000000000000000;
Leb_Grid_XYZW[ 248][1]= 0.611684344200988;
Leb_Grid_XYZW[ 248][2]=-0.791101929626902;
Leb_Grid_XYZW[ 248][3]= 0.001857161196774;
Leb_Grid_XYZW[ 249][0]= 0.000000000000000;
Leb_Grid_XYZW[ 249][1]=-0.611684344200988;
Leb_Grid_XYZW[ 249][2]=-0.791101929626902;
Leb_Grid_XYZW[ 249][3]= 0.001857161196774;
Leb_Grid_XYZW[ 250][0]= 0.000000000000000;
Leb_Grid_XYZW[ 250][1]= 0.791101929626902;
Leb_Grid_XYZW[ 250][2]= 0.611684344200988;
Leb_Grid_XYZW[ 250][3]= 0.001857161196774;
Leb_Grid_XYZW[ 251][0]= 0.000000000000000;
Leb_Grid_XYZW[ 251][1]=-0.791101929626902;
Leb_Grid_XYZW[ 251][2]= 0.611684344200988;
Leb_Grid_XYZW[ 251][3]= 0.001857161196774;
Leb_Grid_XYZW[ 252][0]= 0.000000000000000;
Leb_Grid_XYZW[ 252][1]= 0.791101929626902;
Leb_Grid_XYZW[ 252][2]=-0.611684344200988;
Leb_Grid_XYZW[ 252][3]= 0.001857161196774;
Leb_Grid_XYZW[ 253][0]= 0.000000000000000;
Leb_Grid_XYZW[ 253][1]=-0.791101929626902;
Leb_Grid_XYZW[ 253][2]=-0.611684344200988;
Leb_Grid_XYZW[ 253][3]= 0.001857161196774;
Leb_Grid_XYZW[ 254][0]= 0.396475534819986;
Leb_Grid_XYZW[ 254][1]= 0.918045287711454;
Leb_Grid_XYZW[ 254][2]= 0.000000000000000;
Leb_Grid_XYZW[ 254][3]= 0.001705153996396;
Leb_Grid_XYZW[ 255][0]=-0.396475534819986;
Leb_Grid_XYZW[ 255][1]= 0.918045287711454;
Leb_Grid_XYZW[ 255][2]= 0.000000000000000;
Leb_Grid_XYZW[ 255][3]= 0.001705153996396;
Leb_Grid_XYZW[ 256][0]= 0.396475534819986;
Leb_Grid_XYZW[ 256][1]=-0.918045287711454;
Leb_Grid_XYZW[ 256][2]= 0.000000000000000;
Leb_Grid_XYZW[ 256][3]= 0.001705153996396;
Leb_Grid_XYZW[ 257][0]=-0.396475534819986;
Leb_Grid_XYZW[ 257][1]=-0.918045287711454;
Leb_Grid_XYZW[ 257][2]= 0.000000000000000;
Leb_Grid_XYZW[ 257][3]= 0.001705153996396;
Leb_Grid_XYZW[ 258][0]= 0.918045287711454;
Leb_Grid_XYZW[ 258][1]= 0.396475534819986;
Leb_Grid_XYZW[ 258][2]= 0.000000000000000;
Leb_Grid_XYZW[ 258][3]= 0.001705153996396;
Leb_Grid_XYZW[ 259][0]=-0.918045287711454;
Leb_Grid_XYZW[ 259][1]= 0.396475534819986;
Leb_Grid_XYZW[ 259][2]= 0.000000000000000;
Leb_Grid_XYZW[ 259][3]= 0.001705153996396;
Leb_Grid_XYZW[ 260][0]= 0.918045287711454;
Leb_Grid_XYZW[ 260][1]=-0.396475534819986;
Leb_Grid_XYZW[ 260][2]= 0.000000000000000;
Leb_Grid_XYZW[ 260][3]= 0.001705153996396;
Leb_Grid_XYZW[ 261][0]=-0.918045287711454;
Leb_Grid_XYZW[ 261][1]=-0.396475534819986;
Leb_Grid_XYZW[ 261][2]= 0.000000000000000;
Leb_Grid_XYZW[ 261][3]= 0.001705153996396;
Leb_Grid_XYZW[ 262][0]= 0.396475534819986;
Leb_Grid_XYZW[ 262][1]= 0.000000000000000;
Leb_Grid_XYZW[ 262][2]= 0.918045287711454;
Leb_Grid_XYZW[ 262][3]= 0.001705153996396;
Leb_Grid_XYZW[ 263][0]=-0.396475534819986;
Leb_Grid_XYZW[ 263][1]= 0.000000000000000;
Leb_Grid_XYZW[ 263][2]= 0.918045287711454;
Leb_Grid_XYZW[ 263][3]= 0.001705153996396;
Leb_Grid_XYZW[ 264][0]= 0.396475534819986;
Leb_Grid_XYZW[ 264][1]= 0.000000000000000;
Leb_Grid_XYZW[ 264][2]=-0.918045287711454;
Leb_Grid_XYZW[ 264][3]= 0.001705153996396;
Leb_Grid_XYZW[ 265][0]=-0.396475534819986;
Leb_Grid_XYZW[ 265][1]= 0.000000000000000;
Leb_Grid_XYZW[ 265][2]=-0.918045287711454;
Leb_Grid_XYZW[ 265][3]= 0.001705153996396;
Leb_Grid_XYZW[ 266][0]= 0.918045287711454;
Leb_Grid_XYZW[ 266][1]= 0.000000000000000;
Leb_Grid_XYZW[ 266][2]= 0.396475534819986;
Leb_Grid_XYZW[ 266][3]= 0.001705153996396;
Leb_Grid_XYZW[ 267][0]=-0.918045287711454;
Leb_Grid_XYZW[ 267][1]= 0.000000000000000;
Leb_Grid_XYZW[ 267][2]= 0.396475534819986;
Leb_Grid_XYZW[ 267][3]= 0.001705153996396;
Leb_Grid_XYZW[ 268][0]= 0.918045287711454;
Leb_Grid_XYZW[ 268][1]= 0.000000000000000;
Leb_Grid_XYZW[ 268][2]=-0.396475534819986;
Leb_Grid_XYZW[ 268][3]= 0.001705153996396;
Leb_Grid_XYZW[ 269][0]=-0.918045287711454;
Leb_Grid_XYZW[ 269][1]= 0.000000000000000;
Leb_Grid_XYZW[ 269][2]=-0.396475534819986;
Leb_Grid_XYZW[ 269][3]= 0.001705153996396;
Leb_Grid_XYZW[ 270][0]= 0.000000000000000;
Leb_Grid_XYZW[ 270][1]= 0.396475534819986;
Leb_Grid_XYZW[ 270][2]= 0.918045287711454;
Leb_Grid_XYZW[ 270][3]= 0.001705153996396;
Leb_Grid_XYZW[ 271][0]= 0.000000000000000;
Leb_Grid_XYZW[ 271][1]=-0.396475534819986;
Leb_Grid_XYZW[ 271][2]= 0.918045287711454;
Leb_Grid_XYZW[ 271][3]= 0.001705153996396;
Leb_Grid_XYZW[ 272][0]= 0.000000000000000;
Leb_Grid_XYZW[ 272][1]= 0.396475534819986;
Leb_Grid_XYZW[ 272][2]=-0.918045287711454;
Leb_Grid_XYZW[ 272][3]= 0.001705153996396;
Leb_Grid_XYZW[ 273][0]= 0.000000000000000;
Leb_Grid_XYZW[ 273][1]=-0.396475534819986;
Leb_Grid_XYZW[ 273][2]=-0.918045287711454;
Leb_Grid_XYZW[ 273][3]= 0.001705153996396;
Leb_Grid_XYZW[ 274][0]= 0.000000000000000;
Leb_Grid_XYZW[ 274][1]= 0.918045287711454;
Leb_Grid_XYZW[ 274][2]= 0.396475534819986;
Leb_Grid_XYZW[ 274][3]= 0.001705153996396;
Leb_Grid_XYZW[ 275][0]= 0.000000000000000;
Leb_Grid_XYZW[ 275][1]=-0.918045287711454;
Leb_Grid_XYZW[ 275][2]= 0.396475534819986;
Leb_Grid_XYZW[ 275][3]= 0.001705153996396;
Leb_Grid_XYZW[ 276][0]= 0.000000000000000;
Leb_Grid_XYZW[ 276][1]= 0.918045287711454;
Leb_Grid_XYZW[ 276][2]=-0.396475534819986;
Leb_Grid_XYZW[ 276][3]= 0.001705153996396;
Leb_Grid_XYZW[ 277][0]= 0.000000000000000;
Leb_Grid_XYZW[ 277][1]=-0.918045287711454;
Leb_Grid_XYZW[ 277][2]=-0.396475534819986;
Leb_Grid_XYZW[ 277][3]= 0.001705153996396;
Leb_Grid_XYZW[ 278][0]= 0.172478200990772;
Leb_Grid_XYZW[ 278][1]= 0.985013335028002;
Leb_Grid_XYZW[ 278][2]= 0.000000000000000;
Leb_Grid_XYZW[ 278][3]= 0.001300321685886;
Leb_Grid_XYZW[ 279][0]=-0.172478200990772;
Leb_Grid_XYZW[ 279][1]= 0.985013335028002;
Leb_Grid_XYZW[ 279][2]= 0.000000000000000;
Leb_Grid_XYZW[ 279][3]= 0.001300321685886;
Leb_Grid_XYZW[ 280][0]= 0.172478200990772;
Leb_Grid_XYZW[ 280][1]=-0.985013335028002;
Leb_Grid_XYZW[ 280][2]= 0.000000000000000;
Leb_Grid_XYZW[ 280][3]= 0.001300321685886;
Leb_Grid_XYZW[ 281][0]=-0.172478200990772;
Leb_Grid_XYZW[ 281][1]=-0.985013335028002;
Leb_Grid_XYZW[ 281][2]= 0.000000000000000;
Leb_Grid_XYZW[ 281][3]= 0.001300321685886;
Leb_Grid_XYZW[ 282][0]= 0.985013335028002;
Leb_Grid_XYZW[ 282][1]= 0.172478200990772;
Leb_Grid_XYZW[ 282][2]= 0.000000000000000;
Leb_Grid_XYZW[ 282][3]= 0.001300321685886;
Leb_Grid_XYZW[ 283][0]=-0.985013335028002;
Leb_Grid_XYZW[ 283][1]= 0.172478200990772;
Leb_Grid_XYZW[ 283][2]= 0.000000000000000;
Leb_Grid_XYZW[ 283][3]= 0.001300321685886;
Leb_Grid_XYZW[ 284][0]= 0.985013335028002;
Leb_Grid_XYZW[ 284][1]=-0.172478200990772;
Leb_Grid_XYZW[ 284][2]= 0.000000000000000;
Leb_Grid_XYZW[ 284][3]= 0.001300321685886;
Leb_Grid_XYZW[ 285][0]=-0.985013335028002;
Leb_Grid_XYZW[ 285][1]=-0.172478200990772;
Leb_Grid_XYZW[ 285][2]= 0.000000000000000;
Leb_Grid_XYZW[ 285][3]= 0.001300321685886;
Leb_Grid_XYZW[ 286][0]= 0.172478200990772;
Leb_Grid_XYZW[ 286][1]= 0.000000000000000;
Leb_Grid_XYZW[ 286][2]= 0.985013335028002;
Leb_Grid_XYZW[ 286][3]= 0.001300321685886;
Leb_Grid_XYZW[ 287][0]=-0.172478200990772;
Leb_Grid_XYZW[ 287][1]= 0.000000000000000;
Leb_Grid_XYZW[ 287][2]= 0.985013335028002;
Leb_Grid_XYZW[ 287][3]= 0.001300321685886;
Leb_Grid_XYZW[ 288][0]= 0.172478200990772;
Leb_Grid_XYZW[ 288][1]= 0.000000000000000;
Leb_Grid_XYZW[ 288][2]=-0.985013335028002;
Leb_Grid_XYZW[ 288][3]= 0.001300321685886;
Leb_Grid_XYZW[ 289][0]=-0.172478200990772;
Leb_Grid_XYZW[ 289][1]= 0.000000000000000;
Leb_Grid_XYZW[ 289][2]=-0.985013335028002;
Leb_Grid_XYZW[ 289][3]= 0.001300321685886;
Leb_Grid_XYZW[ 290][0]= 0.985013335028002;
Leb_Grid_XYZW[ 290][1]= 0.000000000000000;
Leb_Grid_XYZW[ 290][2]= 0.172478200990772;
Leb_Grid_XYZW[ 290][3]= 0.001300321685886;
Leb_Grid_XYZW[ 291][0]=-0.985013335028002;
Leb_Grid_XYZW[ 291][1]= 0.000000000000000;
Leb_Grid_XYZW[ 291][2]= 0.172478200990772;
Leb_Grid_XYZW[ 291][3]= 0.001300321685886;
Leb_Grid_XYZW[ 292][0]= 0.985013335028002;
Leb_Grid_XYZW[ 292][1]= 0.000000000000000;
Leb_Grid_XYZW[ 292][2]=-0.172478200990772;
Leb_Grid_XYZW[ 292][3]= 0.001300321685886;
Leb_Grid_XYZW[ 293][0]=-0.985013335028002;
Leb_Grid_XYZW[ 293][1]= 0.000000000000000;
Leb_Grid_XYZW[ 293][2]=-0.172478200990772;
Leb_Grid_XYZW[ 293][3]= 0.001300321685886;
Leb_Grid_XYZW[ 294][0]= 0.000000000000000;
Leb_Grid_XYZW[ 294][1]= 0.172478200990772;
Leb_Grid_XYZW[ 294][2]= 0.985013335028002;
Leb_Grid_XYZW[ 294][3]= 0.001300321685886;
Leb_Grid_XYZW[ 295][0]= 0.000000000000000;
Leb_Grid_XYZW[ 295][1]=-0.172478200990772;
Leb_Grid_XYZW[ 295][2]= 0.985013335028002;
Leb_Grid_XYZW[ 295][3]= 0.001300321685886;
Leb_Grid_XYZW[ 296][0]= 0.000000000000000;
Leb_Grid_XYZW[ 296][1]= 0.172478200990772;
Leb_Grid_XYZW[ 296][2]=-0.985013335028002;
Leb_Grid_XYZW[ 296][3]= 0.001300321685886;
Leb_Grid_XYZW[ 297][0]= 0.000000000000000;
Leb_Grid_XYZW[ 297][1]=-0.172478200990772;
Leb_Grid_XYZW[ 297][2]=-0.985013335028002;
Leb_Grid_XYZW[ 297][3]= 0.001300321685886;
Leb_Grid_XYZW[ 298][0]= 0.000000000000000;
Leb_Grid_XYZW[ 298][1]= 0.985013335028002;
Leb_Grid_XYZW[ 298][2]= 0.172478200990772;
Leb_Grid_XYZW[ 298][3]= 0.001300321685886;
Leb_Grid_XYZW[ 299][0]= 0.000000000000000;
Leb_Grid_XYZW[ 299][1]=-0.985013335028002;
Leb_Grid_XYZW[ 299][2]= 0.172478200990772;
Leb_Grid_XYZW[ 299][3]= 0.001300321685886;
Leb_Grid_XYZW[ 300][0]= 0.000000000000000;
Leb_Grid_XYZW[ 300][1]= 0.985013335028002;
Leb_Grid_XYZW[ 300][2]=-0.172478200990772;
Leb_Grid_XYZW[ 300][3]= 0.001300321685886;
Leb_Grid_XYZW[ 301][0]= 0.000000000000000;
Leb_Grid_XYZW[ 301][1]=-0.985013335028002;
Leb_Grid_XYZW[ 301][2]=-0.172478200990772;
Leb_Grid_XYZW[ 301][3]= 0.001300321685886;
Leb_Grid_XYZW[ 302][0]= 0.561026380862206;
Leb_Grid_XYZW[ 302][1]= 0.351828092773352;
Leb_Grid_XYZW[ 302][2]= 0.749310611904116;
Leb_Grid_XYZW[ 302][3]= 0.001842866472905;
Leb_Grid_XYZW[ 303][0]=-0.561026380862206;
Leb_Grid_XYZW[ 303][1]= 0.351828092773352;
Leb_Grid_XYZW[ 303][2]= 0.749310611904116;
Leb_Grid_XYZW[ 303][3]= 0.001842866472905;
Leb_Grid_XYZW[ 304][0]= 0.561026380862206;
Leb_Grid_XYZW[ 304][1]=-0.351828092773352;
Leb_Grid_XYZW[ 304][2]= 0.749310611904116;
Leb_Grid_XYZW[ 304][3]= 0.001842866472905;
Leb_Grid_XYZW[ 305][0]=-0.561026380862206;
Leb_Grid_XYZW[ 305][1]=-0.351828092773352;
Leb_Grid_XYZW[ 305][2]= 0.749310611904116;
Leb_Grid_XYZW[ 305][3]= 0.001842866472905;
Leb_Grid_XYZW[ 306][0]= 0.561026380862206;
Leb_Grid_XYZW[ 306][1]= 0.351828092773352;
Leb_Grid_XYZW[ 306][2]=-0.749310611904116;
Leb_Grid_XYZW[ 306][3]= 0.001842866472905;
Leb_Grid_XYZW[ 307][0]=-0.561026380862206;
Leb_Grid_XYZW[ 307][1]= 0.351828092773352;
Leb_Grid_XYZW[ 307][2]=-0.749310611904116;
Leb_Grid_XYZW[ 307][3]= 0.001842866472905;
Leb_Grid_XYZW[ 308][0]= 0.561026380862206;
Leb_Grid_XYZW[ 308][1]=-0.351828092773352;
Leb_Grid_XYZW[ 308][2]=-0.749310611904116;
Leb_Grid_XYZW[ 308][3]= 0.001842866472905;
Leb_Grid_XYZW[ 309][0]=-0.561026380862206;
Leb_Grid_XYZW[ 309][1]=-0.351828092773352;
Leb_Grid_XYZW[ 309][2]=-0.749310611904116;
Leb_Grid_XYZW[ 309][3]= 0.001842866472905;
Leb_Grid_XYZW[ 310][0]= 0.561026380862206;
Leb_Grid_XYZW[ 310][1]= 0.749310611904116;
Leb_Grid_XYZW[ 310][2]= 0.351828092773352;
Leb_Grid_XYZW[ 310][3]= 0.001842866472905;
Leb_Grid_XYZW[ 311][0]=-0.561026380862206;
Leb_Grid_XYZW[ 311][1]= 0.749310611904116;
Leb_Grid_XYZW[ 311][2]= 0.351828092773352;
Leb_Grid_XYZW[ 311][3]= 0.001842866472905;
Leb_Grid_XYZW[ 312][0]= 0.561026380862206;
Leb_Grid_XYZW[ 312][1]=-0.749310611904116;
Leb_Grid_XYZW[ 312][2]= 0.351828092773352;
Leb_Grid_XYZW[ 312][3]= 0.001842866472905;
Leb_Grid_XYZW[ 313][0]=-0.561026380862206;
Leb_Grid_XYZW[ 313][1]=-0.749310611904116;
Leb_Grid_XYZW[ 313][2]= 0.351828092773352;
Leb_Grid_XYZW[ 313][3]= 0.001842866472905;
Leb_Grid_XYZW[ 314][0]= 0.561026380862206;
Leb_Grid_XYZW[ 314][1]= 0.749310611904116;
Leb_Grid_XYZW[ 314][2]=-0.351828092773352;
Leb_Grid_XYZW[ 314][3]= 0.001842866472905;
Leb_Grid_XYZW[ 315][0]=-0.561026380862206;
Leb_Grid_XYZW[ 315][1]= 0.749310611904116;
Leb_Grid_XYZW[ 315][2]=-0.351828092773352;
Leb_Grid_XYZW[ 315][3]= 0.001842866472905;
Leb_Grid_XYZW[ 316][0]= 0.561026380862206;
Leb_Grid_XYZW[ 316][1]=-0.749310611904116;
Leb_Grid_XYZW[ 316][2]=-0.351828092773352;
Leb_Grid_XYZW[ 316][3]= 0.001842866472905;
Leb_Grid_XYZW[ 317][0]=-0.561026380862206;
Leb_Grid_XYZW[ 317][1]=-0.749310611904116;
Leb_Grid_XYZW[ 317][2]=-0.351828092773352;
Leb_Grid_XYZW[ 317][3]= 0.001842866472905;
Leb_Grid_XYZW[ 318][0]= 0.351828092773352;
Leb_Grid_XYZW[ 318][1]= 0.561026380862206;
Leb_Grid_XYZW[ 318][2]= 0.749310611904116;
Leb_Grid_XYZW[ 318][3]= 0.001842866472905;
Leb_Grid_XYZW[ 319][0]=-0.351828092773352;
Leb_Grid_XYZW[ 319][1]= 0.561026380862206;
Leb_Grid_XYZW[ 319][2]= 0.749310611904116;
Leb_Grid_XYZW[ 319][3]= 0.001842866472905;
Leb_Grid_XYZW[ 320][0]= 0.351828092773352;
Leb_Grid_XYZW[ 320][1]=-0.561026380862206;
Leb_Grid_XYZW[ 320][2]= 0.749310611904116;
Leb_Grid_XYZW[ 320][3]= 0.001842866472905;
Leb_Grid_XYZW[ 321][0]=-0.351828092773352;
Leb_Grid_XYZW[ 321][1]=-0.561026380862206;
Leb_Grid_XYZW[ 321][2]= 0.749310611904116;
Leb_Grid_XYZW[ 321][3]= 0.001842866472905;
Leb_Grid_XYZW[ 322][0]= 0.351828092773352;
Leb_Grid_XYZW[ 322][1]= 0.561026380862206;
Leb_Grid_XYZW[ 322][2]=-0.749310611904116;
Leb_Grid_XYZW[ 322][3]= 0.001842866472905;
Leb_Grid_XYZW[ 323][0]=-0.351828092773352;
Leb_Grid_XYZW[ 323][1]= 0.561026380862206;
Leb_Grid_XYZW[ 323][2]=-0.749310611904116;
Leb_Grid_XYZW[ 323][3]= 0.001842866472905;
Leb_Grid_XYZW[ 324][0]= 0.351828092773352;
Leb_Grid_XYZW[ 324][1]=-0.561026380862206;
Leb_Grid_XYZW[ 324][2]=-0.749310611904116;
Leb_Grid_XYZW[ 324][3]= 0.001842866472905;
Leb_Grid_XYZW[ 325][0]=-0.351828092773352;
Leb_Grid_XYZW[ 325][1]=-0.561026380862206;
Leb_Grid_XYZW[ 325][2]=-0.749310611904116;
Leb_Grid_XYZW[ 325][3]= 0.001842866472905;
Leb_Grid_XYZW[ 326][0]= 0.351828092773352;
Leb_Grid_XYZW[ 326][1]= 0.749310611904116;
Leb_Grid_XYZW[ 326][2]= 0.561026380862206;
Leb_Grid_XYZW[ 326][3]= 0.001842866472905;
Leb_Grid_XYZW[ 327][0]=-0.351828092773352;
Leb_Grid_XYZW[ 327][1]= 0.749310611904116;
Leb_Grid_XYZW[ 327][2]= 0.561026380862206;
Leb_Grid_XYZW[ 327][3]= 0.001842866472905;
Leb_Grid_XYZW[ 328][0]= 0.351828092773352;
Leb_Grid_XYZW[ 328][1]=-0.749310611904116;
Leb_Grid_XYZW[ 328][2]= 0.561026380862206;
Leb_Grid_XYZW[ 328][3]= 0.001842866472905;
Leb_Grid_XYZW[ 329][0]=-0.351828092773352;
Leb_Grid_XYZW[ 329][1]=-0.749310611904116;
Leb_Grid_XYZW[ 329][2]= 0.561026380862206;
Leb_Grid_XYZW[ 329][3]= 0.001842866472905;
Leb_Grid_XYZW[ 330][0]= 0.351828092773352;
Leb_Grid_XYZW[ 330][1]= 0.749310611904116;
Leb_Grid_XYZW[ 330][2]=-0.561026380862206;
Leb_Grid_XYZW[ 330][3]= 0.001842866472905;
Leb_Grid_XYZW[ 331][0]=-0.351828092773352;
Leb_Grid_XYZW[ 331][1]= 0.749310611904116;
Leb_Grid_XYZW[ 331][2]=-0.561026380862206;
Leb_Grid_XYZW[ 331][3]= 0.001842866472905;
Leb_Grid_XYZW[ 332][0]= 0.351828092773352;
Leb_Grid_XYZW[ 332][1]=-0.749310611904116;
Leb_Grid_XYZW[ 332][2]=-0.561026380862206;
Leb_Grid_XYZW[ 332][3]= 0.001842866472905;
Leb_Grid_XYZW[ 333][0]=-0.351828092773352;
Leb_Grid_XYZW[ 333][1]=-0.749310611904116;
Leb_Grid_XYZW[ 333][2]=-0.561026380862206;
Leb_Grid_XYZW[ 333][3]= 0.001842866472905;
Leb_Grid_XYZW[ 334][0]= 0.749310611904116;
Leb_Grid_XYZW[ 334][1]= 0.561026380862206;
Leb_Grid_XYZW[ 334][2]= 0.351828092773352;
Leb_Grid_XYZW[ 334][3]= 0.001842866472905;
Leb_Grid_XYZW[ 335][0]=-0.749310611904116;
Leb_Grid_XYZW[ 335][1]= 0.561026380862206;
Leb_Grid_XYZW[ 335][2]= 0.351828092773352;
Leb_Grid_XYZW[ 335][3]= 0.001842866472905;
Leb_Grid_XYZW[ 336][0]= 0.749310611904116;
Leb_Grid_XYZW[ 336][1]=-0.561026380862206;
Leb_Grid_XYZW[ 336][2]= 0.351828092773352;
Leb_Grid_XYZW[ 336][3]= 0.001842866472905;
Leb_Grid_XYZW[ 337][0]=-0.749310611904116;
Leb_Grid_XYZW[ 337][1]=-0.561026380862206;
Leb_Grid_XYZW[ 337][2]= 0.351828092773352;
Leb_Grid_XYZW[ 337][3]= 0.001842866472905;
Leb_Grid_XYZW[ 338][0]= 0.749310611904116;
Leb_Grid_XYZW[ 338][1]= 0.561026380862206;
Leb_Grid_XYZW[ 338][2]=-0.351828092773352;
Leb_Grid_XYZW[ 338][3]= 0.001842866472905;
Leb_Grid_XYZW[ 339][0]=-0.749310611904116;
Leb_Grid_XYZW[ 339][1]= 0.561026380862206;
Leb_Grid_XYZW[ 339][2]=-0.351828092773352;
Leb_Grid_XYZW[ 339][3]= 0.001842866472905;
Leb_Grid_XYZW[ 340][0]= 0.749310611904116;
Leb_Grid_XYZW[ 340][1]=-0.561026380862206;
Leb_Grid_XYZW[ 340][2]=-0.351828092773352;
Leb_Grid_XYZW[ 340][3]= 0.001842866472905;
Leb_Grid_XYZW[ 341][0]=-0.749310611904116;
Leb_Grid_XYZW[ 341][1]=-0.561026380862206;
Leb_Grid_XYZW[ 341][2]=-0.351828092773352;
Leb_Grid_XYZW[ 341][3]= 0.001842866472905;
Leb_Grid_XYZW[ 342][0]= 0.749310611904116;
Leb_Grid_XYZW[ 342][1]= 0.351828092773352;
Leb_Grid_XYZW[ 342][2]= 0.561026380862206;
Leb_Grid_XYZW[ 342][3]= 0.001842866472905;
Leb_Grid_XYZW[ 343][0]=-0.749310611904116;
Leb_Grid_XYZW[ 343][1]= 0.351828092773352;
Leb_Grid_XYZW[ 343][2]= 0.561026380862206;
Leb_Grid_XYZW[ 343][3]= 0.001842866472905;
Leb_Grid_XYZW[ 344][0]= 0.749310611904116;
Leb_Grid_XYZW[ 344][1]=-0.351828092773352;
Leb_Grid_XYZW[ 344][2]= 0.561026380862206;
Leb_Grid_XYZW[ 344][3]= 0.001842866472905;
Leb_Grid_XYZW[ 345][0]=-0.749310611904116;
Leb_Grid_XYZW[ 345][1]=-0.351828092773352;
Leb_Grid_XYZW[ 345][2]= 0.561026380862206;
Leb_Grid_XYZW[ 345][3]= 0.001842866472905;
Leb_Grid_XYZW[ 346][0]= 0.749310611904116;
Leb_Grid_XYZW[ 346][1]= 0.351828092773352;
Leb_Grid_XYZW[ 346][2]=-0.561026380862206;
Leb_Grid_XYZW[ 346][3]= 0.001842866472905;
Leb_Grid_XYZW[ 347][0]=-0.749310611904116;
Leb_Grid_XYZW[ 347][1]= 0.351828092773352;
Leb_Grid_XYZW[ 347][2]=-0.561026380862206;
Leb_Grid_XYZW[ 347][3]= 0.001842866472905;
Leb_Grid_XYZW[ 348][0]= 0.749310611904116;
Leb_Grid_XYZW[ 348][1]=-0.351828092773352;
Leb_Grid_XYZW[ 348][2]=-0.561026380862206;
Leb_Grid_XYZW[ 348][3]= 0.001842866472905;
Leb_Grid_XYZW[ 349][0]=-0.749310611904116;
Leb_Grid_XYZW[ 349][1]=-0.351828092773352;
Leb_Grid_XYZW[ 349][2]=-0.561026380862206;
Leb_Grid_XYZW[ 349][3]= 0.001842866472905;
Leb_Grid_XYZW[ 350][0]= 0.474239284255198;
Leb_Grid_XYZW[ 350][1]= 0.263471665593795;
Leb_Grid_XYZW[ 350][2]= 0.840047488359050;
Leb_Grid_XYZW[ 350][3]= 0.001802658934377;
Leb_Grid_XYZW[ 351][0]=-0.474239284255198;
Leb_Grid_XYZW[ 351][1]= 0.263471665593795;
Leb_Grid_XYZW[ 351][2]= 0.840047488359050;
Leb_Grid_XYZW[ 351][3]= 0.001802658934377;
Leb_Grid_XYZW[ 352][0]= 0.474239284255198;
Leb_Grid_XYZW[ 352][1]=-0.263471665593795;
Leb_Grid_XYZW[ 352][2]= 0.840047488359050;
Leb_Grid_XYZW[ 352][3]= 0.001802658934377;
Leb_Grid_XYZW[ 353][0]=-0.474239284255198;
Leb_Grid_XYZW[ 353][1]=-0.263471665593795;
Leb_Grid_XYZW[ 353][2]= 0.840047488359050;
Leb_Grid_XYZW[ 353][3]= 0.001802658934377;
Leb_Grid_XYZW[ 354][0]= 0.474239284255198;
Leb_Grid_XYZW[ 354][1]= 0.263471665593795;
Leb_Grid_XYZW[ 354][2]=-0.840047488359050;
Leb_Grid_XYZW[ 354][3]= 0.001802658934377;
Leb_Grid_XYZW[ 355][0]=-0.474239284255198;
Leb_Grid_XYZW[ 355][1]= 0.263471665593795;
Leb_Grid_XYZW[ 355][2]=-0.840047488359050;
Leb_Grid_XYZW[ 355][3]= 0.001802658934377;
Leb_Grid_XYZW[ 356][0]= 0.474239284255198;
Leb_Grid_XYZW[ 356][1]=-0.263471665593795;
Leb_Grid_XYZW[ 356][2]=-0.840047488359050;
Leb_Grid_XYZW[ 356][3]= 0.001802658934377;
Leb_Grid_XYZW[ 357][0]=-0.474239284255198;
Leb_Grid_XYZW[ 357][1]=-0.263471665593795;
Leb_Grid_XYZW[ 357][2]=-0.840047488359050;
Leb_Grid_XYZW[ 357][3]= 0.001802658934377;
Leb_Grid_XYZW[ 358][0]= 0.474239284255198;
Leb_Grid_XYZW[ 358][1]= 0.840047488359050;
Leb_Grid_XYZW[ 358][2]= 0.263471665593795;
Leb_Grid_XYZW[ 358][3]= 0.001802658934377;
Leb_Grid_XYZW[ 359][0]=-0.474239284255198;
Leb_Grid_XYZW[ 359][1]= 0.840047488359050;
Leb_Grid_XYZW[ 359][2]= 0.263471665593795;
Leb_Grid_XYZW[ 359][3]= 0.001802658934377;
Leb_Grid_XYZW[ 360][0]= 0.474239284255198;
Leb_Grid_XYZW[ 360][1]=-0.840047488359050;
Leb_Grid_XYZW[ 360][2]= 0.263471665593795;
Leb_Grid_XYZW[ 360][3]= 0.001802658934377;
Leb_Grid_XYZW[ 361][0]=-0.474239284255198;
Leb_Grid_XYZW[ 361][1]=-0.840047488359050;
Leb_Grid_XYZW[ 361][2]= 0.263471665593795;
Leb_Grid_XYZW[ 361][3]= 0.001802658934377;
Leb_Grid_XYZW[ 362][0]= 0.474239284255198;
Leb_Grid_XYZW[ 362][1]= 0.840047488359050;
Leb_Grid_XYZW[ 362][2]=-0.263471665593795;
Leb_Grid_XYZW[ 362][3]= 0.001802658934377;
Leb_Grid_XYZW[ 363][0]=-0.474239284255198;
Leb_Grid_XYZW[ 363][1]= 0.840047488359050;
Leb_Grid_XYZW[ 363][2]=-0.263471665593795;
Leb_Grid_XYZW[ 363][3]= 0.001802658934377;
Leb_Grid_XYZW[ 364][0]= 0.474239284255198;
Leb_Grid_XYZW[ 364][1]=-0.840047488359050;
Leb_Grid_XYZW[ 364][2]=-0.263471665593795;
Leb_Grid_XYZW[ 364][3]= 0.001802658934377;
Leb_Grid_XYZW[ 365][0]=-0.474239284255198;
Leb_Grid_XYZW[ 365][1]=-0.840047488359050;
Leb_Grid_XYZW[ 365][2]=-0.263471665593795;
Leb_Grid_XYZW[ 365][3]= 0.001802658934377;
Leb_Grid_XYZW[ 366][0]= 0.263471665593795;
Leb_Grid_XYZW[ 366][1]= 0.474239284255198;
Leb_Grid_XYZW[ 366][2]= 0.840047488359050;
Leb_Grid_XYZW[ 366][3]= 0.001802658934377;
Leb_Grid_XYZW[ 367][0]=-0.263471665593795;
Leb_Grid_XYZW[ 367][1]= 0.474239284255198;
Leb_Grid_XYZW[ 367][2]= 0.840047488359050;
Leb_Grid_XYZW[ 367][3]= 0.001802658934377;
Leb_Grid_XYZW[ 368][0]= 0.263471665593795;
Leb_Grid_XYZW[ 368][1]=-0.474239284255198;
Leb_Grid_XYZW[ 368][2]= 0.840047488359050;
Leb_Grid_XYZW[ 368][3]= 0.001802658934377;
Leb_Grid_XYZW[ 369][0]=-0.263471665593795;
Leb_Grid_XYZW[ 369][1]=-0.474239284255198;
Leb_Grid_XYZW[ 369][2]= 0.840047488359050;
Leb_Grid_XYZW[ 369][3]= 0.001802658934377;
Leb_Grid_XYZW[ 370][0]= 0.263471665593795;
Leb_Grid_XYZW[ 370][1]= 0.474239284255198;
Leb_Grid_XYZW[ 370][2]=-0.840047488359050;
Leb_Grid_XYZW[ 370][3]= 0.001802658934377;
Leb_Grid_XYZW[ 371][0]=-0.263471665593795;
Leb_Grid_XYZW[ 371][1]= 0.474239284255198;
Leb_Grid_XYZW[ 371][2]=-0.840047488359050;
Leb_Grid_XYZW[ 371][3]= 0.001802658934377;
Leb_Grid_XYZW[ 372][0]= 0.263471665593795;
Leb_Grid_XYZW[ 372][1]=-0.474239284255198;
Leb_Grid_XYZW[ 372][2]=-0.840047488359050;
Leb_Grid_XYZW[ 372][3]= 0.001802658934377;
Leb_Grid_XYZW[ 373][0]=-0.263471665593795;
Leb_Grid_XYZW[ 373][1]=-0.474239284255198;
Leb_Grid_XYZW[ 373][2]=-0.840047488359050;
Leb_Grid_XYZW[ 373][3]= 0.001802658934377;
Leb_Grid_XYZW[ 374][0]= 0.263471665593795;
Leb_Grid_XYZW[ 374][1]= 0.840047488359050;
Leb_Grid_XYZW[ 374][2]= 0.474239284255198;
Leb_Grid_XYZW[ 374][3]= 0.001802658934377;
Leb_Grid_XYZW[ 375][0]=-0.263471665593795;
Leb_Grid_XYZW[ 375][1]= 0.840047488359050;
Leb_Grid_XYZW[ 375][2]= 0.474239284255198;
Leb_Grid_XYZW[ 375][3]= 0.001802658934377;
Leb_Grid_XYZW[ 376][0]= 0.263471665593795;
Leb_Grid_XYZW[ 376][1]=-0.840047488359050;
Leb_Grid_XYZW[ 376][2]= 0.474239284255198;
Leb_Grid_XYZW[ 376][3]= 0.001802658934377;
Leb_Grid_XYZW[ 377][0]=-0.263471665593795;
Leb_Grid_XYZW[ 377][1]=-0.840047488359050;
Leb_Grid_XYZW[ 377][2]= 0.474239284255198;
Leb_Grid_XYZW[ 377][3]= 0.001802658934377;
Leb_Grid_XYZW[ 378][0]= 0.263471665593795;
Leb_Grid_XYZW[ 378][1]= 0.840047488359050;
Leb_Grid_XYZW[ 378][2]=-0.474239284255198;
Leb_Grid_XYZW[ 378][3]= 0.001802658934377;
Leb_Grid_XYZW[ 379][0]=-0.263471665593795;
Leb_Grid_XYZW[ 379][1]= 0.840047488359050;
Leb_Grid_XYZW[ 379][2]=-0.474239284255198;
Leb_Grid_XYZW[ 379][3]= 0.001802658934377;
Leb_Grid_XYZW[ 380][0]= 0.263471665593795;
Leb_Grid_XYZW[ 380][1]=-0.840047488359050;
Leb_Grid_XYZW[ 380][2]=-0.474239284255198;
Leb_Grid_XYZW[ 380][3]= 0.001802658934377;
Leb_Grid_XYZW[ 381][0]=-0.263471665593795;
Leb_Grid_XYZW[ 381][1]=-0.840047488359050;
Leb_Grid_XYZW[ 381][2]=-0.474239284255198;
Leb_Grid_XYZW[ 381][3]= 0.001802658934377;
Leb_Grid_XYZW[ 382][0]= 0.840047488359050;
Leb_Grid_XYZW[ 382][1]= 0.474239284255198;
Leb_Grid_XYZW[ 382][2]= 0.263471665593795;
Leb_Grid_XYZW[ 382][3]= 0.001802658934377;
Leb_Grid_XYZW[ 383][0]=-0.840047488359050;
Leb_Grid_XYZW[ 383][1]= 0.474239284255198;
Leb_Grid_XYZW[ 383][2]= 0.263471665593795;
Leb_Grid_XYZW[ 383][3]= 0.001802658934377;
Leb_Grid_XYZW[ 384][0]= 0.840047488359050;
Leb_Grid_XYZW[ 384][1]=-0.474239284255198;
Leb_Grid_XYZW[ 384][2]= 0.263471665593795;
Leb_Grid_XYZW[ 384][3]= 0.001802658934377;
Leb_Grid_XYZW[ 385][0]=-0.840047488359050;
Leb_Grid_XYZW[ 385][1]=-0.474239284255198;
Leb_Grid_XYZW[ 385][2]= 0.263471665593795;
Leb_Grid_XYZW[ 385][3]= 0.001802658934377;
Leb_Grid_XYZW[ 386][0]= 0.840047488359050;
Leb_Grid_XYZW[ 386][1]= 0.474239284255198;
Leb_Grid_XYZW[ 386][2]=-0.263471665593795;
Leb_Grid_XYZW[ 386][3]= 0.001802658934377;
Leb_Grid_XYZW[ 387][0]=-0.840047488359050;
Leb_Grid_XYZW[ 387][1]= 0.474239284255198;
Leb_Grid_XYZW[ 387][2]=-0.263471665593795;
Leb_Grid_XYZW[ 387][3]= 0.001802658934377;
Leb_Grid_XYZW[ 388][0]= 0.840047488359050;
Leb_Grid_XYZW[ 388][1]=-0.474239284255198;
Leb_Grid_XYZW[ 388][2]=-0.263471665593795;
Leb_Grid_XYZW[ 388][3]= 0.001802658934377;
Leb_Grid_XYZW[ 389][0]=-0.840047488359050;
Leb_Grid_XYZW[ 389][1]=-0.474239284255198;
Leb_Grid_XYZW[ 389][2]=-0.263471665593795;
Leb_Grid_XYZW[ 389][3]= 0.001802658934377;
Leb_Grid_XYZW[ 390][0]= 0.840047488359050;
Leb_Grid_XYZW[ 390][1]= 0.263471665593795;
Leb_Grid_XYZW[ 390][2]= 0.474239284255198;
Leb_Grid_XYZW[ 390][3]= 0.001802658934377;
Leb_Grid_XYZW[ 391][0]=-0.840047488359050;
Leb_Grid_XYZW[ 391][1]= 0.263471665593795;
Leb_Grid_XYZW[ 391][2]= 0.474239284255198;
Leb_Grid_XYZW[ 391][3]= 0.001802658934377;
Leb_Grid_XYZW[ 392][0]= 0.840047488359050;
Leb_Grid_XYZW[ 392][1]=-0.263471665593795;
Leb_Grid_XYZW[ 392][2]= 0.474239284255198;
Leb_Grid_XYZW[ 392][3]= 0.001802658934377;
Leb_Grid_XYZW[ 393][0]=-0.840047488359050;
Leb_Grid_XYZW[ 393][1]=-0.263471665593795;
Leb_Grid_XYZW[ 393][2]= 0.474239284255198;
Leb_Grid_XYZW[ 393][3]= 0.001802658934377;
Leb_Grid_XYZW[ 394][0]= 0.840047488359050;
Leb_Grid_XYZW[ 394][1]= 0.263471665593795;
Leb_Grid_XYZW[ 394][2]=-0.474239284255198;
Leb_Grid_XYZW[ 394][3]= 0.001802658934377;
Leb_Grid_XYZW[ 395][0]=-0.840047488359050;
Leb_Grid_XYZW[ 395][1]= 0.263471665593795;
Leb_Grid_XYZW[ 395][2]=-0.474239284255198;
Leb_Grid_XYZW[ 395][3]= 0.001802658934377;
Leb_Grid_XYZW[ 396][0]= 0.840047488359050;
Leb_Grid_XYZW[ 396][1]=-0.263471665593795;
Leb_Grid_XYZW[ 396][2]=-0.474239284255198;
Leb_Grid_XYZW[ 396][3]= 0.001802658934377;
Leb_Grid_XYZW[ 397][0]=-0.840047488359050;
Leb_Grid_XYZW[ 397][1]=-0.263471665593795;
Leb_Grid_XYZW[ 397][2]=-0.474239284255198;
Leb_Grid_XYZW[ 397][3]= 0.001802658934377;
Leb_Grid_XYZW[ 398][0]= 0.598412649788538;
Leb_Grid_XYZW[ 398][1]= 0.181664084036021;
Leb_Grid_XYZW[ 398][2]= 0.780320742479920;
Leb_Grid_XYZW[ 398][3]= 0.001849830560444;
Leb_Grid_XYZW[ 399][0]=-0.598412649788538;
Leb_Grid_XYZW[ 399][1]= 0.181664084036021;
Leb_Grid_XYZW[ 399][2]= 0.780320742479920;
Leb_Grid_XYZW[ 399][3]= 0.001849830560444;
Leb_Grid_XYZW[ 400][0]= 0.598412649788538;
Leb_Grid_XYZW[ 400][1]=-0.181664084036021;
Leb_Grid_XYZW[ 400][2]= 0.780320742479920;
Leb_Grid_XYZW[ 400][3]= 0.001849830560444;
Leb_Grid_XYZW[ 401][0]=-0.598412649788538;
Leb_Grid_XYZW[ 401][1]=-0.181664084036021;
Leb_Grid_XYZW[ 401][2]= 0.780320742479920;
Leb_Grid_XYZW[ 401][3]= 0.001849830560444;
Leb_Grid_XYZW[ 402][0]= 0.598412649788538;
Leb_Grid_XYZW[ 402][1]= 0.181664084036021;
Leb_Grid_XYZW[ 402][2]=-0.780320742479920;
Leb_Grid_XYZW[ 402][3]= 0.001849830560444;
Leb_Grid_XYZW[ 403][0]=-0.598412649788538;
Leb_Grid_XYZW[ 403][1]= 0.181664084036021;
Leb_Grid_XYZW[ 403][2]=-0.780320742479920;
Leb_Grid_XYZW[ 403][3]= 0.001849830560444;
Leb_Grid_XYZW[ 404][0]= 0.598412649788538;
Leb_Grid_XYZW[ 404][1]=-0.181664084036021;
Leb_Grid_XYZW[ 404][2]=-0.780320742479920;
Leb_Grid_XYZW[ 404][3]= 0.001849830560444;
Leb_Grid_XYZW[ 405][0]=-0.598412649788538;
Leb_Grid_XYZW[ 405][1]=-0.181664084036021;
Leb_Grid_XYZW[ 405][2]=-0.780320742479920;
Leb_Grid_XYZW[ 405][3]= 0.001849830560444;
Leb_Grid_XYZW[ 406][0]= 0.598412649788538;
Leb_Grid_XYZW[ 406][1]= 0.780320742479920;
Leb_Grid_XYZW[ 406][2]= 0.181664084036021;
Leb_Grid_XYZW[ 406][3]= 0.001849830560444;
Leb_Grid_XYZW[ 407][0]=-0.598412649788538;
Leb_Grid_XYZW[ 407][1]= 0.780320742479920;
Leb_Grid_XYZW[ 407][2]= 0.181664084036021;
Leb_Grid_XYZW[ 407][3]= 0.001849830560444;
Leb_Grid_XYZW[ 408][0]= 0.598412649788538;
Leb_Grid_XYZW[ 408][1]=-0.780320742479920;
Leb_Grid_XYZW[ 408][2]= 0.181664084036021;
Leb_Grid_XYZW[ 408][3]= 0.001849830560444;
Leb_Grid_XYZW[ 409][0]=-0.598412649788538;
Leb_Grid_XYZW[ 409][1]=-0.780320742479920;
Leb_Grid_XYZW[ 409][2]= 0.181664084036021;
Leb_Grid_XYZW[ 409][3]= 0.001849830560444;
Leb_Grid_XYZW[ 410][0]= 0.598412649788538;
Leb_Grid_XYZW[ 410][1]= 0.780320742479920;
Leb_Grid_XYZW[ 410][2]=-0.181664084036021;
Leb_Grid_XYZW[ 410][3]= 0.001849830560444;
Leb_Grid_XYZW[ 411][0]=-0.598412649788538;
Leb_Grid_XYZW[ 411][1]= 0.780320742479920;
Leb_Grid_XYZW[ 411][2]=-0.181664084036021;
Leb_Grid_XYZW[ 411][3]= 0.001849830560444;
Leb_Grid_XYZW[ 412][0]= 0.598412649788538;
Leb_Grid_XYZW[ 412][1]=-0.780320742479920;
Leb_Grid_XYZW[ 412][2]=-0.181664084036021;
Leb_Grid_XYZW[ 412][3]= 0.001849830560444;
Leb_Grid_XYZW[ 413][0]=-0.598412649788538;
Leb_Grid_XYZW[ 413][1]=-0.780320742479920;
Leb_Grid_XYZW[ 413][2]=-0.181664084036021;
Leb_Grid_XYZW[ 413][3]= 0.001849830560444;
Leb_Grid_XYZW[ 414][0]= 0.181664084036021;
Leb_Grid_XYZW[ 414][1]= 0.598412649788538;
Leb_Grid_XYZW[ 414][2]= 0.780320742479920;
Leb_Grid_XYZW[ 414][3]= 0.001849830560444;
Leb_Grid_XYZW[ 415][0]=-0.181664084036021;
Leb_Grid_XYZW[ 415][1]= 0.598412649788538;
Leb_Grid_XYZW[ 415][2]= 0.780320742479920;
Leb_Grid_XYZW[ 415][3]= 0.001849830560444;
Leb_Grid_XYZW[ 416][0]= 0.181664084036021;
Leb_Grid_XYZW[ 416][1]=-0.598412649788538;
Leb_Grid_XYZW[ 416][2]= 0.780320742479920;
Leb_Grid_XYZW[ 416][3]= 0.001849830560444;
Leb_Grid_XYZW[ 417][0]=-0.181664084036021;
Leb_Grid_XYZW[ 417][1]=-0.598412649788538;
Leb_Grid_XYZW[ 417][2]= 0.780320742479920;
Leb_Grid_XYZW[ 417][3]= 0.001849830560444;
Leb_Grid_XYZW[ 418][0]= 0.181664084036021;
Leb_Grid_XYZW[ 418][1]= 0.598412649788538;
Leb_Grid_XYZW[ 418][2]=-0.780320742479920;
Leb_Grid_XYZW[ 418][3]= 0.001849830560444;
Leb_Grid_XYZW[ 419][0]=-0.181664084036021;
Leb_Grid_XYZW[ 419][1]= 0.598412649788538;
Leb_Grid_XYZW[ 419][2]=-0.780320742479920;
Leb_Grid_XYZW[ 419][3]= 0.001849830560444;
Leb_Grid_XYZW[ 420][0]= 0.181664084036021;
Leb_Grid_XYZW[ 420][1]=-0.598412649788538;
Leb_Grid_XYZW[ 420][2]=-0.780320742479920;
Leb_Grid_XYZW[ 420][3]= 0.001849830560444;
Leb_Grid_XYZW[ 421][0]=-0.181664084036021;
Leb_Grid_XYZW[ 421][1]=-0.598412649788538;
Leb_Grid_XYZW[ 421][2]=-0.780320742479920;
Leb_Grid_XYZW[ 421][3]= 0.001849830560444;
Leb_Grid_XYZW[ 422][0]= 0.181664084036021;
Leb_Grid_XYZW[ 422][1]= 0.780320742479920;
Leb_Grid_XYZW[ 422][2]= 0.598412649788538;
Leb_Grid_XYZW[ 422][3]= 0.001849830560444;
Leb_Grid_XYZW[ 423][0]=-0.181664084036021;
Leb_Grid_XYZW[ 423][1]= 0.780320742479920;
Leb_Grid_XYZW[ 423][2]= 0.598412649788538;
Leb_Grid_XYZW[ 423][3]= 0.001849830560444;
Leb_Grid_XYZW[ 424][0]= 0.181664084036021;
Leb_Grid_XYZW[ 424][1]=-0.780320742479920;
Leb_Grid_XYZW[ 424][2]= 0.598412649788538;
Leb_Grid_XYZW[ 424][3]= 0.001849830560444;
Leb_Grid_XYZW[ 425][0]=-0.181664084036021;
Leb_Grid_XYZW[ 425][1]=-0.780320742479920;
Leb_Grid_XYZW[ 425][2]= 0.598412649788538;
Leb_Grid_XYZW[ 425][3]= 0.001849830560444;
Leb_Grid_XYZW[ 426][0]= 0.181664084036021;
Leb_Grid_XYZW[ 426][1]= 0.780320742479920;
Leb_Grid_XYZW[ 426][2]=-0.598412649788538;
Leb_Grid_XYZW[ 426][3]= 0.001849830560444;
Leb_Grid_XYZW[ 427][0]=-0.181664084036021;
Leb_Grid_XYZW[ 427][1]= 0.780320742479920;
Leb_Grid_XYZW[ 427][2]=-0.598412649788538;
Leb_Grid_XYZW[ 427][3]= 0.001849830560444;
Leb_Grid_XYZW[ 428][0]= 0.181664084036021;
Leb_Grid_XYZW[ 428][1]=-0.780320742479920;
Leb_Grid_XYZW[ 428][2]=-0.598412649788538;
Leb_Grid_XYZW[ 428][3]= 0.001849830560444;
Leb_Grid_XYZW[ 429][0]=-0.181664084036021;
Leb_Grid_XYZW[ 429][1]=-0.780320742479920;
Leb_Grid_XYZW[ 429][2]=-0.598412649788538;
Leb_Grid_XYZW[ 429][3]= 0.001849830560444;
Leb_Grid_XYZW[ 430][0]= 0.780320742479920;
Leb_Grid_XYZW[ 430][1]= 0.598412649788538;
Leb_Grid_XYZW[ 430][2]= 0.181664084036021;
Leb_Grid_XYZW[ 430][3]= 0.001849830560444;
Leb_Grid_XYZW[ 431][0]=-0.780320742479920;
Leb_Grid_XYZW[ 431][1]= 0.598412649788538;
Leb_Grid_XYZW[ 431][2]= 0.181664084036021;
Leb_Grid_XYZW[ 431][3]= 0.001849830560444;
Leb_Grid_XYZW[ 432][0]= 0.780320742479920;
Leb_Grid_XYZW[ 432][1]=-0.598412649788538;
Leb_Grid_XYZW[ 432][2]= 0.181664084036021;
Leb_Grid_XYZW[ 432][3]= 0.001849830560444;
Leb_Grid_XYZW[ 433][0]=-0.780320742479920;
Leb_Grid_XYZW[ 433][1]=-0.598412649788538;
Leb_Grid_XYZW[ 433][2]= 0.181664084036021;
Leb_Grid_XYZW[ 433][3]= 0.001849830560444;
Leb_Grid_XYZW[ 434][0]= 0.780320742479920;
Leb_Grid_XYZW[ 434][1]= 0.598412649788538;
Leb_Grid_XYZW[ 434][2]=-0.181664084036021;
Leb_Grid_XYZW[ 434][3]= 0.001849830560444;
Leb_Grid_XYZW[ 435][0]=-0.780320742479920;
Leb_Grid_XYZW[ 435][1]= 0.598412649788538;
Leb_Grid_XYZW[ 435][2]=-0.181664084036021;
Leb_Grid_XYZW[ 435][3]= 0.001849830560444;
Leb_Grid_XYZW[ 436][0]= 0.780320742479920;
Leb_Grid_XYZW[ 436][1]=-0.598412649788538;
Leb_Grid_XYZW[ 436][2]=-0.181664084036021;
Leb_Grid_XYZW[ 436][3]= 0.001849830560444;
Leb_Grid_XYZW[ 437][0]=-0.780320742479920;
Leb_Grid_XYZW[ 437][1]=-0.598412649788538;
Leb_Grid_XYZW[ 437][2]=-0.181664084036021;
Leb_Grid_XYZW[ 437][3]= 0.001849830560444;
Leb_Grid_XYZW[ 438][0]= 0.780320742479920;
Leb_Grid_XYZW[ 438][1]= 0.181664084036021;
Leb_Grid_XYZW[ 438][2]= 0.598412649788538;
Leb_Grid_XYZW[ 438][3]= 0.001849830560444;
Leb_Grid_XYZW[ 439][0]=-0.780320742479920;
Leb_Grid_XYZW[ 439][1]= 0.181664084036021;
Leb_Grid_XYZW[ 439][2]= 0.598412649788538;
Leb_Grid_XYZW[ 439][3]= 0.001849830560444;
Leb_Grid_XYZW[ 440][0]= 0.780320742479920;
Leb_Grid_XYZW[ 440][1]=-0.181664084036021;
Leb_Grid_XYZW[ 440][2]= 0.598412649788538;
Leb_Grid_XYZW[ 440][3]= 0.001849830560444;
Leb_Grid_XYZW[ 441][0]=-0.780320742479920;
Leb_Grid_XYZW[ 441][1]=-0.181664084036021;
Leb_Grid_XYZW[ 441][2]= 0.598412649788538;
Leb_Grid_XYZW[ 441][3]= 0.001849830560444;
Leb_Grid_XYZW[ 442][0]= 0.780320742479920;
Leb_Grid_XYZW[ 442][1]= 0.181664084036021;
Leb_Grid_XYZW[ 442][2]=-0.598412649788538;
Leb_Grid_XYZW[ 442][3]= 0.001849830560444;
Leb_Grid_XYZW[ 443][0]=-0.780320742479920;
Leb_Grid_XYZW[ 443][1]= 0.181664084036021;
Leb_Grid_XYZW[ 443][2]=-0.598412649788538;
Leb_Grid_XYZW[ 443][3]= 0.001849830560444;
Leb_Grid_XYZW[ 444][0]= 0.780320742479920;
Leb_Grid_XYZW[ 444][1]=-0.181664084036021;
Leb_Grid_XYZW[ 444][2]=-0.598412649788538;
Leb_Grid_XYZW[ 444][3]= 0.001849830560444;
Leb_Grid_XYZW[ 445][0]=-0.780320742479920;
Leb_Grid_XYZW[ 445][1]=-0.181664084036021;
Leb_Grid_XYZW[ 445][2]=-0.598412649788538;
Leb_Grid_XYZW[ 445][3]= 0.001849830560444;
Leb_Grid_XYZW[ 446][0]= 0.379103540769556;
Leb_Grid_XYZW[ 446][1]= 0.172079522565688;
Leb_Grid_XYZW[ 446][2]= 0.909213475092374;
Leb_Grid_XYZW[ 446][3]= 0.001713904507107;
Leb_Grid_XYZW[ 447][0]=-0.379103540769556;
Leb_Grid_XYZW[ 447][1]= 0.172079522565688;
Leb_Grid_XYZW[ 447][2]= 0.909213475092374;
Leb_Grid_XYZW[ 447][3]= 0.001713904507107;
Leb_Grid_XYZW[ 448][0]= 0.379103540769556;
Leb_Grid_XYZW[ 448][1]=-0.172079522565688;
Leb_Grid_XYZW[ 448][2]= 0.909213475092374;
Leb_Grid_XYZW[ 448][3]= 0.001713904507107;
Leb_Grid_XYZW[ 449][0]=-0.379103540769556;
Leb_Grid_XYZW[ 449][1]=-0.172079522565688;
Leb_Grid_XYZW[ 449][2]= 0.909213475092374;
Leb_Grid_XYZW[ 449][3]= 0.001713904507107;
Leb_Grid_XYZW[ 450][0]= 0.379103540769556;
Leb_Grid_XYZW[ 450][1]= 0.172079522565688;
Leb_Grid_XYZW[ 450][2]=-0.909213475092374;
Leb_Grid_XYZW[ 450][3]= 0.001713904507107;
Leb_Grid_XYZW[ 451][0]=-0.379103540769556;
Leb_Grid_XYZW[ 451][1]= 0.172079522565688;
Leb_Grid_XYZW[ 451][2]=-0.909213475092374;
Leb_Grid_XYZW[ 451][3]= 0.001713904507107;
Leb_Grid_XYZW[ 452][0]= 0.379103540769556;
Leb_Grid_XYZW[ 452][1]=-0.172079522565688;
Leb_Grid_XYZW[ 452][2]=-0.909213475092374;
Leb_Grid_XYZW[ 452][3]= 0.001713904507107;
Leb_Grid_XYZW[ 453][0]=-0.379103540769556;
Leb_Grid_XYZW[ 453][1]=-0.172079522565688;
Leb_Grid_XYZW[ 453][2]=-0.909213475092374;
Leb_Grid_XYZW[ 453][3]= 0.001713904507107;
Leb_Grid_XYZW[ 454][0]= 0.379103540769556;
Leb_Grid_XYZW[ 454][1]= 0.909213475092374;
Leb_Grid_XYZW[ 454][2]= 0.172079522565688;
Leb_Grid_XYZW[ 454][3]= 0.001713904507107;
Leb_Grid_XYZW[ 455][0]=-0.379103540769556;
Leb_Grid_XYZW[ 455][1]= 0.909213475092374;
Leb_Grid_XYZW[ 455][2]= 0.172079522565688;
Leb_Grid_XYZW[ 455][3]= 0.001713904507107;
Leb_Grid_XYZW[ 456][0]= 0.379103540769556;
Leb_Grid_XYZW[ 456][1]=-0.909213475092374;
Leb_Grid_XYZW[ 456][2]= 0.172079522565688;
Leb_Grid_XYZW[ 456][3]= 0.001713904507107;
Leb_Grid_XYZW[ 457][0]=-0.379103540769556;
Leb_Grid_XYZW[ 457][1]=-0.909213475092374;
Leb_Grid_XYZW[ 457][2]= 0.172079522565688;
Leb_Grid_XYZW[ 457][3]= 0.001713904507107;
Leb_Grid_XYZW[ 458][0]= 0.379103540769556;
Leb_Grid_XYZW[ 458][1]= 0.909213475092374;
Leb_Grid_XYZW[ 458][2]=-0.172079522565688;
Leb_Grid_XYZW[ 458][3]= 0.001713904507107;
Leb_Grid_XYZW[ 459][0]=-0.379103540769556;
Leb_Grid_XYZW[ 459][1]= 0.909213475092374;
Leb_Grid_XYZW[ 459][2]=-0.172079522565688;
Leb_Grid_XYZW[ 459][3]= 0.001713904507107;
Leb_Grid_XYZW[ 460][0]= 0.379103540769556;
Leb_Grid_XYZW[ 460][1]=-0.909213475092374;
Leb_Grid_XYZW[ 460][2]=-0.172079522565688;
Leb_Grid_XYZW[ 460][3]= 0.001713904507107;
Leb_Grid_XYZW[ 461][0]=-0.379103540769556;
Leb_Grid_XYZW[ 461][1]=-0.909213475092374;
Leb_Grid_XYZW[ 461][2]=-0.172079522565688;
Leb_Grid_XYZW[ 461][3]= 0.001713904507107;
Leb_Grid_XYZW[ 462][0]= 0.172079522565688;
Leb_Grid_XYZW[ 462][1]= 0.379103540769556;
Leb_Grid_XYZW[ 462][2]= 0.909213475092374;
Leb_Grid_XYZW[ 462][3]= 0.001713904507107;
Leb_Grid_XYZW[ 463][0]=-0.172079522565688;
Leb_Grid_XYZW[ 463][1]= 0.379103540769556;
Leb_Grid_XYZW[ 463][2]= 0.909213475092374;
Leb_Grid_XYZW[ 463][3]= 0.001713904507107;
Leb_Grid_XYZW[ 464][0]= 0.172079522565688;
Leb_Grid_XYZW[ 464][1]=-0.379103540769556;
Leb_Grid_XYZW[ 464][2]= 0.909213475092374;
Leb_Grid_XYZW[ 464][3]= 0.001713904507107;
Leb_Grid_XYZW[ 465][0]=-0.172079522565688;
Leb_Grid_XYZW[ 465][1]=-0.379103540769556;
Leb_Grid_XYZW[ 465][2]= 0.909213475092374;
Leb_Grid_XYZW[ 465][3]= 0.001713904507107;
Leb_Grid_XYZW[ 466][0]= 0.172079522565688;
Leb_Grid_XYZW[ 466][1]= 0.379103540769556;
Leb_Grid_XYZW[ 466][2]=-0.909213475092374;
Leb_Grid_XYZW[ 466][3]= 0.001713904507107;
Leb_Grid_XYZW[ 467][0]=-0.172079522565688;
Leb_Grid_XYZW[ 467][1]= 0.379103540769556;
Leb_Grid_XYZW[ 467][2]=-0.909213475092374;
Leb_Grid_XYZW[ 467][3]= 0.001713904507107;
Leb_Grid_XYZW[ 468][0]= 0.172079522565688;
Leb_Grid_XYZW[ 468][1]=-0.379103540769556;
Leb_Grid_XYZW[ 468][2]=-0.909213475092374;
Leb_Grid_XYZW[ 468][3]= 0.001713904507107;
Leb_Grid_XYZW[ 469][0]=-0.172079522565688;
Leb_Grid_XYZW[ 469][1]=-0.379103540769556;
Leb_Grid_XYZW[ 469][2]=-0.909213475092374;
Leb_Grid_XYZW[ 469][3]= 0.001713904507107;
Leb_Grid_XYZW[ 470][0]= 0.172079522565688;
Leb_Grid_XYZW[ 470][1]= 0.909213475092374;
Leb_Grid_XYZW[ 470][2]= 0.379103540769556;
Leb_Grid_XYZW[ 470][3]= 0.001713904507107;
Leb_Grid_XYZW[ 471][0]=-0.172079522565688;
Leb_Grid_XYZW[ 471][1]= 0.909213475092374;
Leb_Grid_XYZW[ 471][2]= 0.379103540769556;
Leb_Grid_XYZW[ 471][3]= 0.001713904507107;
Leb_Grid_XYZW[ 472][0]= 0.172079522565688;
Leb_Grid_XYZW[ 472][1]=-0.909213475092374;
Leb_Grid_XYZW[ 472][2]= 0.379103540769556;
Leb_Grid_XYZW[ 472][3]= 0.001713904507107;
Leb_Grid_XYZW[ 473][0]=-0.172079522565688;
Leb_Grid_XYZW[ 473][1]=-0.909213475092374;
Leb_Grid_XYZW[ 473][2]= 0.379103540769556;
Leb_Grid_XYZW[ 473][3]= 0.001713904507107;
Leb_Grid_XYZW[ 474][0]= 0.172079522565688;
Leb_Grid_XYZW[ 474][1]= 0.909213475092374;
Leb_Grid_XYZW[ 474][2]=-0.379103540769556;
Leb_Grid_XYZW[ 474][3]= 0.001713904507107;
Leb_Grid_XYZW[ 475][0]=-0.172079522565688;
Leb_Grid_XYZW[ 475][1]= 0.909213475092374;
Leb_Grid_XYZW[ 475][2]=-0.379103540769556;
Leb_Grid_XYZW[ 475][3]= 0.001713904507107;
Leb_Grid_XYZW[ 476][0]= 0.172079522565688;
Leb_Grid_XYZW[ 476][1]=-0.909213475092374;
Leb_Grid_XYZW[ 476][2]=-0.379103540769556;
Leb_Grid_XYZW[ 476][3]= 0.001713904507107;
Leb_Grid_XYZW[ 477][0]=-0.172079522565688;
Leb_Grid_XYZW[ 477][1]=-0.909213475092374;
Leb_Grid_XYZW[ 477][2]=-0.379103540769556;
Leb_Grid_XYZW[ 477][3]= 0.001713904507107;
Leb_Grid_XYZW[ 478][0]= 0.909213475092374;
Leb_Grid_XYZW[ 478][1]= 0.379103540769556;
Leb_Grid_XYZW[ 478][2]= 0.172079522565688;
Leb_Grid_XYZW[ 478][3]= 0.001713904507107;
Leb_Grid_XYZW[ 479][0]=-0.909213475092374;
Leb_Grid_XYZW[ 479][1]= 0.379103540769556;
Leb_Grid_XYZW[ 479][2]= 0.172079522565688;
Leb_Grid_XYZW[ 479][3]= 0.001713904507107;
Leb_Grid_XYZW[ 480][0]= 0.909213475092374;
Leb_Grid_XYZW[ 480][1]=-0.379103540769556;
Leb_Grid_XYZW[ 480][2]= 0.172079522565688;
Leb_Grid_XYZW[ 480][3]= 0.001713904507107;
Leb_Grid_XYZW[ 481][0]=-0.909213475092374;
Leb_Grid_XYZW[ 481][1]=-0.379103540769556;
Leb_Grid_XYZW[ 481][2]= 0.172079522565688;
Leb_Grid_XYZW[ 481][3]= 0.001713904507107;
Leb_Grid_XYZW[ 482][0]= 0.909213475092374;
Leb_Grid_XYZW[ 482][1]= 0.379103540769556;
Leb_Grid_XYZW[ 482][2]=-0.172079522565688;
Leb_Grid_XYZW[ 482][3]= 0.001713904507107;
Leb_Grid_XYZW[ 483][0]=-0.909213475092374;
Leb_Grid_XYZW[ 483][1]= 0.379103540769556;
Leb_Grid_XYZW[ 483][2]=-0.172079522565688;
Leb_Grid_XYZW[ 483][3]= 0.001713904507107;
Leb_Grid_XYZW[ 484][0]= 0.909213475092374;
Leb_Grid_XYZW[ 484][1]=-0.379103540769556;
Leb_Grid_XYZW[ 484][2]=-0.172079522565688;
Leb_Grid_XYZW[ 484][3]= 0.001713904507107;
Leb_Grid_XYZW[ 485][0]=-0.909213475092374;
Leb_Grid_XYZW[ 485][1]=-0.379103540769556;
Leb_Grid_XYZW[ 485][2]=-0.172079522565688;
Leb_Grid_XYZW[ 485][3]= 0.001713904507107;
Leb_Grid_XYZW[ 486][0]= 0.909213475092374;
Leb_Grid_XYZW[ 486][1]= 0.172079522565688;
Leb_Grid_XYZW[ 486][2]= 0.379103540769556;
Leb_Grid_XYZW[ 486][3]= 0.001713904507107;
Leb_Grid_XYZW[ 487][0]=-0.909213475092374;
Leb_Grid_XYZW[ 487][1]= 0.172079522565688;
Leb_Grid_XYZW[ 487][2]= 0.379103540769556;
Leb_Grid_XYZW[ 487][3]= 0.001713904507107;
Leb_Grid_XYZW[ 488][0]= 0.909213475092374;
Leb_Grid_XYZW[ 488][1]=-0.172079522565688;
Leb_Grid_XYZW[ 488][2]= 0.379103540769556;
Leb_Grid_XYZW[ 488][3]= 0.001713904507107;
Leb_Grid_XYZW[ 489][0]=-0.909213475092374;
Leb_Grid_XYZW[ 489][1]=-0.172079522565688;
Leb_Grid_XYZW[ 489][2]= 0.379103540769556;
Leb_Grid_XYZW[ 489][3]= 0.001713904507107;
Leb_Grid_XYZW[ 490][0]= 0.909213475092374;
Leb_Grid_XYZW[ 490][1]= 0.172079522565688;
Leb_Grid_XYZW[ 490][2]=-0.379103540769556;
Leb_Grid_XYZW[ 490][3]= 0.001713904507107;
Leb_Grid_XYZW[ 491][0]=-0.909213475092374;
Leb_Grid_XYZW[ 491][1]= 0.172079522565688;
Leb_Grid_XYZW[ 491][2]=-0.379103540769556;
Leb_Grid_XYZW[ 491][3]= 0.001713904507107;
Leb_Grid_XYZW[ 492][0]= 0.909213475092374;
Leb_Grid_XYZW[ 492][1]=-0.172079522565688;
Leb_Grid_XYZW[ 492][2]=-0.379103540769556;
Leb_Grid_XYZW[ 492][3]= 0.001713904507107;
Leb_Grid_XYZW[ 493][0]=-0.909213475092374;
Leb_Grid_XYZW[ 493][1]=-0.172079522565688;
Leb_Grid_XYZW[ 493][2]=-0.379103540769556;
Leb_Grid_XYZW[ 493][3]= 0.001713904507107;
Leb_Grid_XYZW[ 494][0]= 0.277867319058624;
Leb_Grid_XYZW[ 494][1]= 0.082130215819325;
Leb_Grid_XYZW[ 494][2]= 0.957102074310073;
Leb_Grid_XYZW[ 494][3]= 0.001555213603397;
Leb_Grid_XYZW[ 495][0]=-0.277867319058624;
Leb_Grid_XYZW[ 495][1]= 0.082130215819325;
Leb_Grid_XYZW[ 495][2]= 0.957102074310073;
Leb_Grid_XYZW[ 495][3]= 0.001555213603397;
Leb_Grid_XYZW[ 496][0]= 0.277867319058624;
Leb_Grid_XYZW[ 496][1]=-0.082130215819325;
Leb_Grid_XYZW[ 496][2]= 0.957102074310073;
Leb_Grid_XYZW[ 496][3]= 0.001555213603397;
Leb_Grid_XYZW[ 497][0]=-0.277867319058624;
Leb_Grid_XYZW[ 497][1]=-0.082130215819325;
Leb_Grid_XYZW[ 497][2]= 0.957102074310073;
Leb_Grid_XYZW[ 497][3]= 0.001555213603397;
Leb_Grid_XYZW[ 498][0]= 0.277867319058624;
Leb_Grid_XYZW[ 498][1]= 0.082130215819325;
Leb_Grid_XYZW[ 498][2]=-0.957102074310073;
Leb_Grid_XYZW[ 498][3]= 0.001555213603397;
Leb_Grid_XYZW[ 499][0]=-0.277867319058624;
Leb_Grid_XYZW[ 499][1]= 0.082130215819325;
Leb_Grid_XYZW[ 499][2]=-0.957102074310073;
Leb_Grid_XYZW[ 499][3]= 0.001555213603397;
Leb_Grid_XYZW[ 500][0]= 0.277867319058624;
Leb_Grid_XYZW[ 500][1]=-0.082130215819325;
Leb_Grid_XYZW[ 500][2]=-0.957102074310073;
Leb_Grid_XYZW[ 500][3]= 0.001555213603397;
Leb_Grid_XYZW[ 501][0]=-0.277867319058624;
Leb_Grid_XYZW[ 501][1]=-0.082130215819325;
Leb_Grid_XYZW[ 501][2]=-0.957102074310073;
Leb_Grid_XYZW[ 501][3]= 0.001555213603397;
Leb_Grid_XYZW[ 502][0]= 0.277867319058624;
Leb_Grid_XYZW[ 502][1]= 0.957102074310073;
Leb_Grid_XYZW[ 502][2]= 0.082130215819325;
Leb_Grid_XYZW[ 502][3]= 0.001555213603397;
Leb_Grid_XYZW[ 503][0]=-0.277867319058624;
Leb_Grid_XYZW[ 503][1]= 0.957102074310073;
Leb_Grid_XYZW[ 503][2]= 0.082130215819325;
Leb_Grid_XYZW[ 503][3]= 0.001555213603397;
Leb_Grid_XYZW[ 504][0]= 0.277867319058624;
Leb_Grid_XYZW[ 504][1]=-0.957102074310073;
Leb_Grid_XYZW[ 504][2]= 0.082130215819325;
Leb_Grid_XYZW[ 504][3]= 0.001555213603397;
Leb_Grid_XYZW[ 505][0]=-0.277867319058624;
Leb_Grid_XYZW[ 505][1]=-0.957102074310073;
Leb_Grid_XYZW[ 505][2]= 0.082130215819325;
Leb_Grid_XYZW[ 505][3]= 0.001555213603397;
Leb_Grid_XYZW[ 506][0]= 0.277867319058624;
Leb_Grid_XYZW[ 506][1]= 0.957102074310073;
Leb_Grid_XYZW[ 506][2]=-0.082130215819325;
Leb_Grid_XYZW[ 506][3]= 0.001555213603397;
Leb_Grid_XYZW[ 507][0]=-0.277867319058624;
Leb_Grid_XYZW[ 507][1]= 0.957102074310073;
Leb_Grid_XYZW[ 507][2]=-0.082130215819325;
Leb_Grid_XYZW[ 507][3]= 0.001555213603397;
Leb_Grid_XYZW[ 508][0]= 0.277867319058624;
Leb_Grid_XYZW[ 508][1]=-0.957102074310073;
Leb_Grid_XYZW[ 508][2]=-0.082130215819325;
Leb_Grid_XYZW[ 508][3]= 0.001555213603397;
Leb_Grid_XYZW[ 509][0]=-0.277867319058624;
Leb_Grid_XYZW[ 509][1]=-0.957102074310073;
Leb_Grid_XYZW[ 509][2]=-0.082130215819325;
Leb_Grid_XYZW[ 509][3]= 0.001555213603397;
Leb_Grid_XYZW[ 510][0]= 0.082130215819325;
Leb_Grid_XYZW[ 510][1]= 0.277867319058624;
Leb_Grid_XYZW[ 510][2]= 0.957102074310073;
Leb_Grid_XYZW[ 510][3]= 0.001555213603397;
Leb_Grid_XYZW[ 511][0]=-0.082130215819325;
Leb_Grid_XYZW[ 511][1]= 0.277867319058624;
Leb_Grid_XYZW[ 511][2]= 0.957102074310073;
Leb_Grid_XYZW[ 511][3]= 0.001555213603397;
Leb_Grid_XYZW[ 512][0]= 0.082130215819325;
Leb_Grid_XYZW[ 512][1]=-0.277867319058624;
Leb_Grid_XYZW[ 512][2]= 0.957102074310073;
Leb_Grid_XYZW[ 512][3]= 0.001555213603397;
Leb_Grid_XYZW[ 513][0]=-0.082130215819325;
Leb_Grid_XYZW[ 513][1]=-0.277867319058624;
Leb_Grid_XYZW[ 513][2]= 0.957102074310073;
Leb_Grid_XYZW[ 513][3]= 0.001555213603397;
Leb_Grid_XYZW[ 514][0]= 0.082130215819325;
Leb_Grid_XYZW[ 514][1]= 0.277867319058624;
Leb_Grid_XYZW[ 514][2]=-0.957102074310073;
Leb_Grid_XYZW[ 514][3]= 0.001555213603397;
Leb_Grid_XYZW[ 515][0]=-0.082130215819325;
Leb_Grid_XYZW[ 515][1]= 0.277867319058624;
Leb_Grid_XYZW[ 515][2]=-0.957102074310073;
Leb_Grid_XYZW[ 515][3]= 0.001555213603397;
Leb_Grid_XYZW[ 516][0]= 0.082130215819325;
Leb_Grid_XYZW[ 516][1]=-0.277867319058624;
Leb_Grid_XYZW[ 516][2]=-0.957102074310073;
Leb_Grid_XYZW[ 516][3]= 0.001555213603397;
Leb_Grid_XYZW[ 517][0]=-0.082130215819325;
Leb_Grid_XYZW[ 517][1]=-0.277867319058624;
Leb_Grid_XYZW[ 517][2]=-0.957102074310073;
Leb_Grid_XYZW[ 517][3]= 0.001555213603397;
Leb_Grid_XYZW[ 518][0]= 0.082130215819325;
Leb_Grid_XYZW[ 518][1]= 0.957102074310073;
Leb_Grid_XYZW[ 518][2]= 0.277867319058624;
Leb_Grid_XYZW[ 518][3]= 0.001555213603397;
Leb_Grid_XYZW[ 519][0]=-0.082130215819325;
Leb_Grid_XYZW[ 519][1]= 0.957102074310073;
Leb_Grid_XYZW[ 519][2]= 0.277867319058624;
Leb_Grid_XYZW[ 519][3]= 0.001555213603397;
Leb_Grid_XYZW[ 520][0]= 0.082130215819325;
Leb_Grid_XYZW[ 520][1]=-0.957102074310073;
Leb_Grid_XYZW[ 520][2]= 0.277867319058624;
Leb_Grid_XYZW[ 520][3]= 0.001555213603397;
Leb_Grid_XYZW[ 521][0]=-0.082130215819325;
Leb_Grid_XYZW[ 521][1]=-0.957102074310073;
Leb_Grid_XYZW[ 521][2]= 0.277867319058624;
Leb_Grid_XYZW[ 521][3]= 0.001555213603397;
Leb_Grid_XYZW[ 522][0]= 0.082130215819325;
Leb_Grid_XYZW[ 522][1]= 0.957102074310073;
Leb_Grid_XYZW[ 522][2]=-0.277867319058624;
Leb_Grid_XYZW[ 522][3]= 0.001555213603397;
Leb_Grid_XYZW[ 523][0]=-0.082130215819325;
Leb_Grid_XYZW[ 523][1]= 0.957102074310073;
Leb_Grid_XYZW[ 523][2]=-0.277867319058624;
Leb_Grid_XYZW[ 523][3]= 0.001555213603397;
Leb_Grid_XYZW[ 524][0]= 0.082130215819325;
Leb_Grid_XYZW[ 524][1]=-0.957102074310073;
Leb_Grid_XYZW[ 524][2]=-0.277867319058624;
Leb_Grid_XYZW[ 524][3]= 0.001555213603397;
Leb_Grid_XYZW[ 525][0]=-0.082130215819325;
Leb_Grid_XYZW[ 525][1]=-0.957102074310073;
Leb_Grid_XYZW[ 525][2]=-0.277867319058624;
Leb_Grid_XYZW[ 525][3]= 0.001555213603397;
Leb_Grid_XYZW[ 526][0]= 0.957102074310073;
Leb_Grid_XYZW[ 526][1]= 0.277867319058624;
Leb_Grid_XYZW[ 526][2]= 0.082130215819325;
Leb_Grid_XYZW[ 526][3]= 0.001555213603397;
Leb_Grid_XYZW[ 527][0]=-0.957102074310073;
Leb_Grid_XYZW[ 527][1]= 0.277867319058624;
Leb_Grid_XYZW[ 527][2]= 0.082130215819325;
Leb_Grid_XYZW[ 527][3]= 0.001555213603397;
Leb_Grid_XYZW[ 528][0]= 0.957102074310073;
Leb_Grid_XYZW[ 528][1]=-0.277867319058624;
Leb_Grid_XYZW[ 528][2]= 0.082130215819325;
Leb_Grid_XYZW[ 528][3]= 0.001555213603397;
Leb_Grid_XYZW[ 529][0]=-0.957102074310073;
Leb_Grid_XYZW[ 529][1]=-0.277867319058624;
Leb_Grid_XYZW[ 529][2]= 0.082130215819325;
Leb_Grid_XYZW[ 529][3]= 0.001555213603397;
Leb_Grid_XYZW[ 530][0]= 0.957102074310073;
Leb_Grid_XYZW[ 530][1]= 0.277867319058624;
Leb_Grid_XYZW[ 530][2]=-0.082130215819325;
Leb_Grid_XYZW[ 530][3]= 0.001555213603397;
Leb_Grid_XYZW[ 531][0]=-0.957102074310073;
Leb_Grid_XYZW[ 531][1]= 0.277867319058624;
Leb_Grid_XYZW[ 531][2]=-0.082130215819325;
Leb_Grid_XYZW[ 531][3]= 0.001555213603397;
Leb_Grid_XYZW[ 532][0]= 0.957102074310073;
Leb_Grid_XYZW[ 532][1]=-0.277867319058624;
Leb_Grid_XYZW[ 532][2]=-0.082130215819325;
Leb_Grid_XYZW[ 532][3]= 0.001555213603397;
Leb_Grid_XYZW[ 533][0]=-0.957102074310073;
Leb_Grid_XYZW[ 533][1]=-0.277867319058624;
Leb_Grid_XYZW[ 533][2]=-0.082130215819325;
Leb_Grid_XYZW[ 533][3]= 0.001555213603397;
Leb_Grid_XYZW[ 534][0]= 0.957102074310073;
Leb_Grid_XYZW[ 534][1]= 0.082130215819325;
Leb_Grid_XYZW[ 534][2]= 0.277867319058624;
Leb_Grid_XYZW[ 534][3]= 0.001555213603397;
Leb_Grid_XYZW[ 535][0]=-0.957102074310073;
Leb_Grid_XYZW[ 535][1]= 0.082130215819325;
Leb_Grid_XYZW[ 535][2]= 0.277867319058624;
Leb_Grid_XYZW[ 535][3]= 0.001555213603397;
Leb_Grid_XYZW[ 536][0]= 0.957102074310073;
Leb_Grid_XYZW[ 536][1]=-0.082130215819325;
Leb_Grid_XYZW[ 536][2]= 0.277867319058624;
Leb_Grid_XYZW[ 536][3]= 0.001555213603397;
Leb_Grid_XYZW[ 537][0]=-0.957102074310073;
Leb_Grid_XYZW[ 537][1]=-0.082130215819325;
Leb_Grid_XYZW[ 537][2]= 0.277867319058624;
Leb_Grid_XYZW[ 537][3]= 0.001555213603397;
Leb_Grid_XYZW[ 538][0]= 0.957102074310073;
Leb_Grid_XYZW[ 538][1]= 0.082130215819325;
Leb_Grid_XYZW[ 538][2]=-0.277867319058624;
Leb_Grid_XYZW[ 538][3]= 0.001555213603397;
Leb_Grid_XYZW[ 539][0]=-0.957102074310073;
Leb_Grid_XYZW[ 539][1]= 0.082130215819325;
Leb_Grid_XYZW[ 539][2]=-0.277867319058624;
Leb_Grid_XYZW[ 539][3]= 0.001555213603397;
Leb_Grid_XYZW[ 540][0]= 0.957102074310073;
Leb_Grid_XYZW[ 540][1]=-0.082130215819325;
Leb_Grid_XYZW[ 540][2]=-0.277867319058624;
Leb_Grid_XYZW[ 540][3]= 0.001555213603397;
Leb_Grid_XYZW[ 541][0]=-0.957102074310073;
Leb_Grid_XYZW[ 541][1]=-0.082130215819325;
Leb_Grid_XYZW[ 541][2]=-0.277867319058624;
Leb_Grid_XYZW[ 541][3]= 0.001555213603397;
Leb_Grid_XYZW[ 542][0]= 0.503356427107512;
Leb_Grid_XYZW[ 542][1]= 0.089992058420749;
Leb_Grid_XYZW[ 542][2]= 0.859379855890721;
Leb_Grid_XYZW[ 542][3]= 0.001802239128009;
Leb_Grid_XYZW[ 543][0]=-0.503356427107512;
Leb_Grid_XYZW[ 543][1]= 0.089992058420749;
Leb_Grid_XYZW[ 543][2]= 0.859379855890721;
Leb_Grid_XYZW[ 543][3]= 0.001802239128009;
Leb_Grid_XYZW[ 544][0]= 0.503356427107512;
Leb_Grid_XYZW[ 544][1]=-0.089992058420749;
Leb_Grid_XYZW[ 544][2]= 0.859379855890721;
Leb_Grid_XYZW[ 544][3]= 0.001802239128009;
Leb_Grid_XYZW[ 545][0]=-0.503356427107512;
Leb_Grid_XYZW[ 545][1]=-0.089992058420749;
Leb_Grid_XYZW[ 545][2]= 0.859379855890721;
Leb_Grid_XYZW[ 545][3]= 0.001802239128009;
Leb_Grid_XYZW[ 546][0]= 0.503356427107512;
Leb_Grid_XYZW[ 546][1]= 0.089992058420749;
Leb_Grid_XYZW[ 546][2]=-0.859379855890721;
Leb_Grid_XYZW[ 546][3]= 0.001802239128009;
Leb_Grid_XYZW[ 547][0]=-0.503356427107512;
Leb_Grid_XYZW[ 547][1]= 0.089992058420749;
Leb_Grid_XYZW[ 547][2]=-0.859379855890721;
Leb_Grid_XYZW[ 547][3]= 0.001802239128009;
Leb_Grid_XYZW[ 548][0]= 0.503356427107512;
Leb_Grid_XYZW[ 548][1]=-0.089992058420749;
Leb_Grid_XYZW[ 548][2]=-0.859379855890721;
Leb_Grid_XYZW[ 548][3]= 0.001802239128009;
Leb_Grid_XYZW[ 549][0]=-0.503356427107512;
Leb_Grid_XYZW[ 549][1]=-0.089992058420749;
Leb_Grid_XYZW[ 549][2]=-0.859379855890721;
Leb_Grid_XYZW[ 549][3]= 0.001802239128009;
Leb_Grid_XYZW[ 550][0]= 0.503356427107512;
Leb_Grid_XYZW[ 550][1]= 0.859379855890721;
Leb_Grid_XYZW[ 550][2]= 0.089992058420749;
Leb_Grid_XYZW[ 550][3]= 0.001802239128009;
Leb_Grid_XYZW[ 551][0]=-0.503356427107512;
Leb_Grid_XYZW[ 551][1]= 0.859379855890721;
Leb_Grid_XYZW[ 551][2]= 0.089992058420749;
Leb_Grid_XYZW[ 551][3]= 0.001802239128009;
Leb_Grid_XYZW[ 552][0]= 0.503356427107512;
Leb_Grid_XYZW[ 552][1]=-0.859379855890721;
Leb_Grid_XYZW[ 552][2]= 0.089992058420749;
Leb_Grid_XYZW[ 552][3]= 0.001802239128009;
Leb_Grid_XYZW[ 553][0]=-0.503356427107512;
Leb_Grid_XYZW[ 553][1]=-0.859379855890721;
Leb_Grid_XYZW[ 553][2]= 0.089992058420749;
Leb_Grid_XYZW[ 553][3]= 0.001802239128009;
Leb_Grid_XYZW[ 554][0]= 0.503356427107512;
Leb_Grid_XYZW[ 554][1]= 0.859379855890721;
Leb_Grid_XYZW[ 554][2]=-0.089992058420749;
Leb_Grid_XYZW[ 554][3]= 0.001802239128009;
Leb_Grid_XYZW[ 555][0]=-0.503356427107512;
Leb_Grid_XYZW[ 555][1]= 0.859379855890721;
Leb_Grid_XYZW[ 555][2]=-0.089992058420749;
Leb_Grid_XYZW[ 555][3]= 0.001802239128009;
Leb_Grid_XYZW[ 556][0]= 0.503356427107512;
Leb_Grid_XYZW[ 556][1]=-0.859379855890721;
Leb_Grid_XYZW[ 556][2]=-0.089992058420749;
Leb_Grid_XYZW[ 556][3]= 0.001802239128009;
Leb_Grid_XYZW[ 557][0]=-0.503356427107512;
Leb_Grid_XYZW[ 557][1]=-0.859379855890721;
Leb_Grid_XYZW[ 557][2]=-0.089992058420749;
Leb_Grid_XYZW[ 557][3]= 0.001802239128009;
Leb_Grid_XYZW[ 558][0]= 0.089992058420749;
Leb_Grid_XYZW[ 558][1]= 0.503356427107512;
Leb_Grid_XYZW[ 558][2]= 0.859379855890721;
Leb_Grid_XYZW[ 558][3]= 0.001802239128009;
Leb_Grid_XYZW[ 559][0]=-0.089992058420749;
Leb_Grid_XYZW[ 559][1]= 0.503356427107512;
Leb_Grid_XYZW[ 559][2]= 0.859379855890721;
Leb_Grid_XYZW[ 559][3]= 0.001802239128009;
Leb_Grid_XYZW[ 560][0]= 0.089992058420749;
Leb_Grid_XYZW[ 560][1]=-0.503356427107512;
Leb_Grid_XYZW[ 560][2]= 0.859379855890721;
Leb_Grid_XYZW[ 560][3]= 0.001802239128009;
Leb_Grid_XYZW[ 561][0]=-0.089992058420749;
Leb_Grid_XYZW[ 561][1]=-0.503356427107512;
Leb_Grid_XYZW[ 561][2]= 0.859379855890721;
Leb_Grid_XYZW[ 561][3]= 0.001802239128009;
Leb_Grid_XYZW[ 562][0]= 0.089992058420749;
Leb_Grid_XYZW[ 562][1]= 0.503356427107512;
Leb_Grid_XYZW[ 562][2]=-0.859379855890721;
Leb_Grid_XYZW[ 562][3]= 0.001802239128009;
Leb_Grid_XYZW[ 563][0]=-0.089992058420749;
Leb_Grid_XYZW[ 563][1]= 0.503356427107512;
Leb_Grid_XYZW[ 563][2]=-0.859379855890721;
Leb_Grid_XYZW[ 563][3]= 0.001802239128009;
Leb_Grid_XYZW[ 564][0]= 0.089992058420749;
Leb_Grid_XYZW[ 564][1]=-0.503356427107512;
Leb_Grid_XYZW[ 564][2]=-0.859379855890721;
Leb_Grid_XYZW[ 564][3]= 0.001802239128009;
Leb_Grid_XYZW[ 565][0]=-0.089992058420749;
Leb_Grid_XYZW[ 565][1]=-0.503356427107512;
Leb_Grid_XYZW[ 565][2]=-0.859379855890721;
Leb_Grid_XYZW[ 565][3]= 0.001802239128009;
Leb_Grid_XYZW[ 566][0]= 0.089992058420749;
Leb_Grid_XYZW[ 566][1]= 0.859379855890721;
Leb_Grid_XYZW[ 566][2]= 0.503356427107512;
Leb_Grid_XYZW[ 566][3]= 0.001802239128009;
Leb_Grid_XYZW[ 567][0]=-0.089992058420749;
Leb_Grid_XYZW[ 567][1]= 0.859379855890721;
Leb_Grid_XYZW[ 567][2]= 0.503356427107512;
Leb_Grid_XYZW[ 567][3]= 0.001802239128009;
Leb_Grid_XYZW[ 568][0]= 0.089992058420749;
Leb_Grid_XYZW[ 568][1]=-0.859379855890721;
Leb_Grid_XYZW[ 568][2]= 0.503356427107512;
Leb_Grid_XYZW[ 568][3]= 0.001802239128009;
Leb_Grid_XYZW[ 569][0]=-0.089992058420749;
Leb_Grid_XYZW[ 569][1]=-0.859379855890721;
Leb_Grid_XYZW[ 569][2]= 0.503356427107512;
Leb_Grid_XYZW[ 569][3]= 0.001802239128009;
Leb_Grid_XYZW[ 570][0]= 0.089992058420749;
Leb_Grid_XYZW[ 570][1]= 0.859379855890721;
Leb_Grid_XYZW[ 570][2]=-0.503356427107512;
Leb_Grid_XYZW[ 570][3]= 0.001802239128009;
Leb_Grid_XYZW[ 571][0]=-0.089992058420749;
Leb_Grid_XYZW[ 571][1]= 0.859379855890721;
Leb_Grid_XYZW[ 571][2]=-0.503356427107512;
Leb_Grid_XYZW[ 571][3]= 0.001802239128009;
Leb_Grid_XYZW[ 572][0]= 0.089992058420749;
Leb_Grid_XYZW[ 572][1]=-0.859379855890721;
Leb_Grid_XYZW[ 572][2]=-0.503356427107512;
Leb_Grid_XYZW[ 572][3]= 0.001802239128009;
Leb_Grid_XYZW[ 573][0]=-0.089992058420749;
Leb_Grid_XYZW[ 573][1]=-0.859379855890721;
Leb_Grid_XYZW[ 573][2]=-0.503356427107512;
Leb_Grid_XYZW[ 573][3]= 0.001802239128009;
Leb_Grid_XYZW[ 574][0]= 0.859379855890721;
Leb_Grid_XYZW[ 574][1]= 0.503356427107512;
Leb_Grid_XYZW[ 574][2]= 0.089992058420749;
Leb_Grid_XYZW[ 574][3]= 0.001802239128009;
Leb_Grid_XYZW[ 575][0]=-0.859379855890721;
Leb_Grid_XYZW[ 575][1]= 0.503356427107512;
Leb_Grid_XYZW[ 575][2]= 0.089992058420749;
Leb_Grid_XYZW[ 575][3]= 0.001802239128009;
Leb_Grid_XYZW[ 576][0]= 0.859379855890721;
Leb_Grid_XYZW[ 576][1]=-0.503356427107512;
Leb_Grid_XYZW[ 576][2]= 0.089992058420749;
Leb_Grid_XYZW[ 576][3]= 0.001802239128009;
Leb_Grid_XYZW[ 577][0]=-0.859379855890721;
Leb_Grid_XYZW[ 577][1]=-0.503356427107512;
Leb_Grid_XYZW[ 577][2]= 0.089992058420749;
Leb_Grid_XYZW[ 577][3]= 0.001802239128009;
Leb_Grid_XYZW[ 578][0]= 0.859379855890721;
Leb_Grid_XYZW[ 578][1]= 0.503356427107512;
Leb_Grid_XYZW[ 578][2]=-0.089992058420749;
Leb_Grid_XYZW[ 578][3]= 0.001802239128009;
Leb_Grid_XYZW[ 579][0]=-0.859379855890721;
Leb_Grid_XYZW[ 579][1]= 0.503356427107512;
Leb_Grid_XYZW[ 579][2]=-0.089992058420749;
Leb_Grid_XYZW[ 579][3]= 0.001802239128009;
Leb_Grid_XYZW[ 580][0]= 0.859379855890721;
Leb_Grid_XYZW[ 580][1]=-0.503356427107512;
Leb_Grid_XYZW[ 580][2]=-0.089992058420749;
Leb_Grid_XYZW[ 580][3]= 0.001802239128009;
Leb_Grid_XYZW[ 581][0]=-0.859379855890721;
Leb_Grid_XYZW[ 581][1]=-0.503356427107512;
Leb_Grid_XYZW[ 581][2]=-0.089992058420749;
Leb_Grid_XYZW[ 581][3]= 0.001802239128009;
Leb_Grid_XYZW[ 582][0]= 0.859379855890721;
Leb_Grid_XYZW[ 582][1]= 0.089992058420749;
Leb_Grid_XYZW[ 582][2]= 0.503356427107512;
Leb_Grid_XYZW[ 582][3]= 0.001802239128009;
Leb_Grid_XYZW[ 583][0]=-0.859379855890721;
Leb_Grid_XYZW[ 583][1]= 0.089992058420749;
Leb_Grid_XYZW[ 583][2]= 0.503356427107512;
Leb_Grid_XYZW[ 583][3]= 0.001802239128009;
Leb_Grid_XYZW[ 584][0]= 0.859379855890721;
Leb_Grid_XYZW[ 584][1]=-0.089992058420749;
Leb_Grid_XYZW[ 584][2]= 0.503356427107512;
Leb_Grid_XYZW[ 584][3]= 0.001802239128009;
Leb_Grid_XYZW[ 585][0]=-0.859379855890721;
Leb_Grid_XYZW[ 585][1]=-0.089992058420749;
Leb_Grid_XYZW[ 585][2]= 0.503356427107512;
Leb_Grid_XYZW[ 585][3]= 0.001802239128009;
Leb_Grid_XYZW[ 586][0]= 0.859379855890721;
Leb_Grid_XYZW[ 586][1]= 0.089992058420749;
Leb_Grid_XYZW[ 586][2]=-0.503356427107512;
Leb_Grid_XYZW[ 586][3]= 0.001802239128009;
Leb_Grid_XYZW[ 587][0]=-0.859379855890721;
Leb_Grid_XYZW[ 587][1]= 0.089992058420749;
Leb_Grid_XYZW[ 587][2]=-0.503356427107512;
Leb_Grid_XYZW[ 587][3]= 0.001802239128009;
Leb_Grid_XYZW[ 588][0]= 0.859379855890721;
Leb_Grid_XYZW[ 588][1]=-0.089992058420749;
Leb_Grid_XYZW[ 588][2]=-0.503356427107512;
Leb_Grid_XYZW[ 588][3]= 0.001802239128009;
Leb_Grid_XYZW[ 589][0]=-0.859379855890721;
Leb_Grid_XYZW[ 589][1]=-0.089992058420749;
Leb_Grid_XYZW[ 589][2]=-0.503356427107512;
Leb_Grid_XYZW[ 589][3]= 0.001802239128009;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment