Setup a Hamiltonian for the Wannier90 *_hr.dat. 
(3) Set local spin flag (StdIntList::locspinflag) and the number of sites (StdIntList::nsite)
(4) Compute the upper limit of the number of Transfer & Interaction and malloc them.
(4.5) For spin system, compute super exchange interaction.
  428   int isite, jsite, ispin, ntransMax, nintrMax;
   429   int iL, iW, iH, kCell, it, ii;
   430   double Jtmp[3][3] = { {0.0} };
   432   std::complex<double> Cphase, DenMat0;
   433   double dR[3], *Uspin;
   435   std::complex<double> **tUJ, *****DenMat;
   441   fp = fopen(
"lattice.xsf", 
"w");
   448   fprintf(stdout, 
"\n  @ Wannier90 Geometry \n\n");
   452   tUJ = (std::complex<double> **)malloc(
sizeof(std::complex<double>*) * 3);
   453   tUJindx = (
int ***)malloc(
sizeof(
int**) * 3);
   458   fprintf(stdout, 
"\n  @ Wannier90 hopping \n\n");
   461   sprintf(filename, 
"%s_hr.dat", StdI->CDataFileHead);
   463     StdI->cutoff_t, StdI->cutoff_tR, StdI->cutoff_length_t,
   464      0, NtUJ, tUJindx, tUJ);
   468   fprintf(stdout, 
"\n  @ Wannier90 Coulomb \n\n");
   471   sprintf(filename, 
"%s_ur.dat", StdI->CDataFileHead);
   473     StdI->cutoff_u, StdI->cutoff_UR, StdI->cutoff_length_U, 
   474     1, NtUJ, tUJindx, tUJ);
   478   fprintf(stdout, 
"\n  @ Wannier90 Hund \n\n");
   481   sprintf(filename, 
"%s_jr.dat", StdI->CDataFileHead);
   483     StdI->cutoff_j, StdI->cutoff_JR, StdI->cutoff_length_J, 
   484     2, NtUJ, tUJindx, tUJ);
   488   fprintf(stdout, 
"\n  @ Wannier90 Density-matrix \n\n");
   489   sprintf(filename, 
"%s_dr.dat", StdI->CDataFileHead);
   494   fprintf(stdout, 
"\n  @ Hamiltonian \n\n");
   500   if (strcmp(StdI->model, 
"spin") == 0 ) {
   503   else if (strcmp(StdI->model, 
"hubbard") == 0) {
   507     printf(
"wannier + Kondo is not available !\n");
   510   fprintf(stdout, 
"\n  @ Numerical conditions\n\n");
   515   StdI->nsite = StdI->NsiteUC * StdI->NCell;
   516   StdI->locspinflag = (
int *)malloc(
sizeof(
int) * StdI->nsite);
   518   if(strcmp(StdI->model, 
"spin") == 0 )
   519     for (isite = 0; isite < StdI->nsite; isite++) StdI->locspinflag[isite] = StdI->S2;
   520   else if(strcmp(StdI->model, 
"hubbard") == 0 )
   521     for (isite = 0; isite < StdI->nsite; isite++) StdI->locspinflag[isite] = 0;
   525   if (strcmp(StdI->model, 
"spin") == 0 ) {
   526     ntransMax = StdI->nsite * (StdI->S2 + 1 + 2 * StdI->S2);
   527     nintrMax = StdI->NCell * (StdI->NsiteUC + NtUJ[0] + NtUJ[1] + NtUJ[2])
   528       * (3 * StdI->S2 + 1) * (3 * StdI->S2 + StdI->NsiteUC);
   530   else if (strcmp(StdI->model, 
"hubbard") == 0) {
   531     ntransMax = StdI->NCell * 2 * (2 * StdI->NsiteUC + NtUJ[0] * 2
   532       + NtUJ[1] * 2 * 3 + NtUJ[2] * 2 * 2);
   533     nintrMax = StdI->NCell * (NtUJ[1] + NtUJ[2] + StdI->NsiteUC);
   540   if (strcmp(StdI->model, 
"spin") == 0) {
   541     Uspin = (
double *)malloc(
sizeof(
double) * StdI->NsiteUC);
   542     for (it = 0; it < NtUJ[1]; it++)
   543       if (tUJindx[1][it][0] == 0 && tUJindx[1][it][1] == 0 && tUJindx[1][it][2] == 0
   544         && tUJindx[1][it][3] == tUJindx[1][it][4])     
   545         Uspin[tUJindx[1][it][3]] = real(tUJ[1][it]);
   550   for (kCell = 0; kCell < StdI->NCell; kCell++){
   552     iW = StdI->Cell[kCell][0];
   553     iL = StdI->Cell[kCell][1];
   554     iH = StdI->Cell[kCell][2];
   558     if (strcmp(StdI->model, 
"spin") == 0) {
   559       for (isite = StdI->NsiteUC*kCell; isite < StdI->NsiteUC*(kCell + 1); isite++) {
   564       for (isite = StdI->NsiteUC*kCell; isite < StdI->NsiteUC*(kCell + 1); isite++) {
   571     for (it = 0; it < NtUJ[0]; it++) {
   575       if (tUJindx[0][it][0] == 0 && tUJindx[0][it][1] == 0 && tUJindx[0][it][2] == 0
   576         && tUJindx[0][it][3] == tUJindx[0][it][4])
   578         if (strcmp(StdI->model, 
"hubbard") == 0) {
   579           isite = StdI->NsiteUC*kCell + tUJindx[0][it][3];
   580           for (ispin = 0; ispin < 2; ispin++) {
   581             StdI->trans[StdI->ntrans] = -tUJ[0][it];
   582             StdI->transindx[StdI->ntrans][0] = isite;
   583             StdI->transindx[StdI->ntrans][1] = ispin;
   584             StdI->transindx[StdI->ntrans][2] = isite;
   585             StdI->transindx[StdI->ntrans][3] = ispin;
   586             StdI->ntrans = StdI->ntrans + 1;
   595           tUJindx[0][it][0], tUJindx[0][it][1], tUJindx[0][it][2],
   596           tUJindx[0][it][3], tUJindx[0][it][4], &isite, &jsite, &Cphase, dR);
   597         if (strcmp(StdI->model, 
"spin") == 0) {
   598           for (ii = 0; ii < 3; ii++) 
   599             Jtmp[ii][ii] = 2.0 * real(tUJ[0][it] * conj(tUJ[0][it]))
   600             * (1.0 / Uspin[tUJindx[0][it][3]] + 1.0 / Uspin[tUJindx[0][it][4]]);
   611     for (it = 0; it < NtUJ[1]; it++) {
   615       if (tUJindx[1][it][0] == 0 && tUJindx[1][it][1] == 0 && tUJindx[1][it][2] == 0
   616         && tUJindx[1][it][3] == tUJindx[1][it][4])
   618         StdI->Cintra[StdI->NCintra] = real(tUJ[1][it]);
   619         StdI->CintraIndx[StdI->NCintra][0] = StdI->NsiteUC*kCell + tUJindx[1][it][3];
   624         if (StdI->double_counting == 1) {
   625           isite = StdI->NsiteUC*kCell + tUJindx[1][it][3];
   626           for (ispin = 0; ispin < 2; ispin++) {
   627             DenMat0 = DenMat[0][0][0][tUJindx[1][it][3]][tUJindx[1][it][3]];
   628             StdI->trans[StdI->ntrans] = 0.5*real(tUJ[1][it])*DenMat0;
   629             StdI->transindx[StdI->ntrans][0] = isite;
   630             StdI->transindx[StdI->ntrans][1] = ispin;
   631             StdI->transindx[StdI->ntrans][2] = isite;
   632             StdI->transindx[StdI->ntrans][3] = ispin;
   633             StdI->ntrans = StdI->ntrans + 1;
   642           tUJindx[1][it][0], tUJindx[1][it][1], tUJindx[1][it][2],
   643           tUJindx[1][it][3], tUJindx[1][it][4], &isite, &jsite, &Cphase, dR);
   648         if (StdI->double_counting == 1) {
   649           for (ispin = 0; ispin < 2; ispin++) {
   653             DenMat0 = DenMat[0][0][0][tUJindx[1][it][4]][tUJindx[1][it][4]];
   654             StdI->trans[StdI->ntrans] = real(tUJ[1][it])*DenMat0;
   655             StdI->transindx[StdI->ntrans][0] = isite;
   656             StdI->transindx[StdI->ntrans][1] = ispin;
   657             StdI->transindx[StdI->ntrans][2] = isite;
   658             StdI->transindx[StdI->ntrans][3] = ispin;
   659             StdI->ntrans = StdI->ntrans + 1;
   663             DenMat0 = DenMat[0][0][0][tUJindx[1][it][3]][tUJindx[1][it][3]];
   664             StdI->trans[StdI->ntrans] = real(tUJ[1][it])*DenMat0;
   665             StdI->transindx[StdI->ntrans][0] = jsite;
   666             StdI->transindx[StdI->ntrans][1] = ispin;
   667             StdI->transindx[StdI->ntrans][2] = jsite;
   668             StdI->transindx[StdI->ntrans][3] = ispin;
   669             StdI->ntrans = StdI->ntrans + 1;
   674           DenMat0 = DenMat[tUJindx[1][it][0]][tUJindx[1][it][1]][tUJindx[1][it][2]]
   675             [tUJindx[1][it][3]][tUJindx[1][it][4]];
   676           StdFace_Hopping(StdI, -0.5*Cphase * real(tUJ[1][it])*DenMat0, jsite, isite, dR);
   683     for (it = 0; it < NtUJ[2]; it++) {
   687       if (tUJindx[2][it][0] != 0 || tUJindx[2][it][1] != 0 || tUJindx[2][it][2] != 0
   688         || tUJindx[2][it][3] != tUJindx[2][it][4])
   691           tUJindx[2][it][0], tUJindx[2][it][1], tUJindx[2][it][2],
   692           tUJindx[2][it][3], tUJindx[2][it][4], &isite, &jsite, &Cphase, dR);
   694         StdI->Hund[StdI->NHund] = real(tUJ[2][it]);
   695         StdI->HundIndx[StdI->NHund][0] = isite;
   696         StdI->HundIndx[StdI->NHund][1] = jsite;
   699         if (strcmp(StdI->model, 
"hubbard") == 0) {
   700           StdI->Ex[StdI->NEx] = real(tUJ[2][it]);
   701           StdI->ExIndx[StdI->NEx][0] = isite;
   702           StdI->ExIndx[StdI->NEx][1] = jsite;
   705           StdI->PairHopp[StdI->NPairHopp] = real(tUJ[2][it]);
   706           StdI->PHIndx[StdI->NPairHopp][0] = isite;
   707           StdI->PHIndx[StdI->NPairHopp][1] = jsite;
   708           StdI->NPairHopp += 1;
   712           if (StdI->double_counting == 1) {
   713             for (ispin = 0; ispin < 2; ispin++) {
   717               DenMat0 = DenMat[0][0][0][tUJindx[2][it][4]][tUJindx[2][it][4]];
   718               StdI->trans[StdI->ntrans] = -0.5*real(tUJ[2][it]) *DenMat0;
   719               StdI->transindx[StdI->ntrans][0] = isite;
   720               StdI->transindx[StdI->ntrans][1] = ispin;
   721               StdI->transindx[StdI->ntrans][2] = isite;
   722               StdI->transindx[StdI->ntrans][3] = ispin;
   723               StdI->ntrans = StdI->ntrans + 1;
   727               DenMat0 = DenMat[0][0][0][tUJindx[2][it][3]][tUJindx[2][it][3]];
   728               StdI->trans[StdI->ntrans] = -0.5*real(tUJ[2][it]) *DenMat0;
   729               StdI->transindx[StdI->ntrans][0] = jsite;
   730               StdI->transindx[StdI->ntrans][1] = ispin;
   731               StdI->transindx[StdI->ntrans][2] = jsite;
   732               StdI->transindx[StdI->ntrans][3] = ispin;
   733               StdI->ntrans = StdI->ntrans + 1;
   738             DenMat0 = DenMat[tUJindx[2][it][0]][tUJindx[2][it][1]][tUJindx[2][it][2]]
   739                             [tUJindx[2][it][3]][tUJindx[2][it][4]];
   741               0.5*Cphase * real(tUJ[2][it])*(DenMat0 + 2.0*real(DenMat0)), jsite, isite, dR);
   746           StdI->Ex[StdI->NEx] = real(tUJ[2][it]);
   748           StdI->Ex[StdI->NEx] = -real(tUJ[2][it]);
   750           StdI->ExIndx[StdI->NEx][0] = isite;
   751           StdI->ExIndx[StdI->NEx][1] = jsite;
   763   for (it = 0; it < NtUJ[0]; it++) free(tUJindx[0][it]);
   766   for (it = 0; it < NtUJ[1]; it++) free(tUJindx[1][it]);
   769   for (it = 0; it < NtUJ[2]; it++) free(tUJindx[2][it]);
   772   if (strcmp(StdI->model, 
"spin") == 0) free(Uspin);
 static void read_W90(struct StdIntList *StdI, char *filename, double cutoff, int *cutoff_R, double cutoff_length, int itUJ, int *NtUJ, int ***tUJindx, std::complex< double > **tUJ)
Read Wannier90 hamiltonian file (*_hr) 
 
void StdFace_Coulomb(struct StdIntList *StdI, double V, int isite, int jsite)
Add onsite/offsite Coulomb term to the list StdIntList::Cinter and StdIntList::CinterIndx, and increase the number of them (StdIntList::NCinter). 
 
void StdFace_GeneralJ(struct StdIntList *StdI, double J[3][3], int Si2, int Sj2, int isite, int jsite)
Treat J as a 3*3 matrix [(6S + 1)*(6S' + 1) interactions]. 
 
void StdFace_PrintVal_d(const char *valname, double *val, double val0)
Print a valiable (real) read from the input file if it is not specified in the input file (=NaN)...
 
void StdFace_FindSite(struct StdIntList *StdI, int iW, int iL, int iH, int diW, int diL, int diH, int isiteUC, int jsiteUC, int *isite, int *jsite, std::complex< double > *Cphase, double *dR)
Find the index of transfer and interaction. 
 
void StdFace_exit(int errorcode)
MPI Abortation wrapper. 
 
static void geometry_W90(struct StdIntList *StdI)
Read Geometry file for wannier90. 
 
void StdFace_Hopping(struct StdIntList *StdI, std::complex< double > trans0, int isite, int jsite, double *dR)
Add Hopping for the both spin. 
 
void StdFace_HubbardLocal(struct StdIntList *StdI, double mu0, double h0, double Gamma0, double U0, int isite)
Add intra-Coulomb, magnetic field, chemical potential for the itenerant electron. ...
 
void StdFace_MagField(struct StdIntList *StdI, int S2, double h, double Gamma, int isite)
Add longitudinal and transvars magnetic field to the list. 
 
void StdFace_PrintGeometry(struct StdIntList *StdI)
Print geometry of sites for the pos-process of correlation function. 
 
void StdFace_PrintXSF(struct StdIntList *StdI)
Print lattice.xsf (XCrysDen format) 
 
void StdFace_MallocInteractions(struct StdIntList *StdI, int ntransMax, int nintrMax)
Malloc Arrays for interactions. 
 
static void PrintUHFinitial(struct StdIntList *StdI, int *NtUJ, std::complex< double > *****DenMat, int ***tUJindx)
Print the initial guess of UHF. 
 
void StdFace_PrintVal_i(const char *valname, int *val, int val0)
Print a valiable (integer) read from the input file if it is not specified in the input file (=214748...
 
void StdFace_InitSite(struct StdIntList *StdI, FILE *fp, int dim)
Initialize the super-cell where simulation is performed. 
 
static std::complex< double > ***** read_density_matrix(struct StdIntList *StdI, char *filename)
Read RESPACK Density-matrix file (*_dr.dat) 
 
void StdFace_NotUsed_d(const char *valname, double val)
Stop HPhi if a variable (real) not used is specified in the input file (!=NaN).