21 #include "StdFace_vals.hpp" 22 #include "StdFace_ModelUtil.hpp" 34 struct StdIntList *StdI
38 int isite, jsite, ntransMax, nintrMax;
40 std::complex<double> Cphase;
46 fp = fopen(
"lattice.gp",
"w");
48 fprintf(stdout,
" @ Lattice Size & Shape\n\n");
67 StdI->phase[1] = StdI->phase[0];
70 StdI->NsiteUC = StdI->W;
72 StdI->direct[0][0] = (double)StdI->NsiteUC;
74 for (isite = 0; isite < StdI->NsiteUC; isite++){
75 StdI->tau[isite][0] = (double)isite / (
double)StdI->NsiteUC;
76 StdI->tau[isite][1] = 0.0; StdI->tau[isite][2] = 0.0;
81 fprintf(stdout,
"\n @ Hamiltonian \n\n");
92 if (strcmp(StdI->model,
"spin") == 0 ) {
135 if (strcmp(StdI->model,
"hubbard") == 0 ) {
144 fprintf(stdout,
"\n @ Numerical conditions\n\n");
149 StdI->nsite = StdI->L * StdI->NsiteUC;
150 if (strcmp(StdI->model,
"kondo") == 0 ) StdI->nsite *= 2;
151 StdI->locspinflag = (
int *)malloc(
sizeof(
int) * StdI->nsite);
153 if (strcmp(StdI->model,
"spin") == 0 )
154 for (isite = 0; isite < StdI->nsite; isite++)StdI->locspinflag[isite] = StdI->S2;
155 else if (strcmp(StdI->model,
"hubbard") == 0 )
156 for (isite = 0; isite < StdI->nsite; isite++)StdI->locspinflag[isite] = 0;
157 else if (strcmp(StdI->model,
"kondo") == 0 )
158 for (isite = 0; isite < StdI->nsite / 2; isite++) {
159 StdI->locspinflag[isite] = StdI->S2;
160 StdI->locspinflag[isite + StdI->nsite / 2] = 0;
165 if (strcmp(StdI->model,
"spin") == 0 ) {
166 ntransMax = StdI->L * StdI->NsiteUC * (StdI->S2 + 1 + 2 * StdI->S2);
167 nintrMax = StdI->L * StdI->NsiteUC * (1 + 1 + 1)
168 * (3 * StdI->S2 + 1) * (3 * StdI->S2 + 1)
169 + StdI->L * (StdI->NsiteUC - 1) * (1 + 1 + 1)
170 * (3 * StdI->S2 + 1) * (3 * StdI->S2 + 1);
173 ntransMax = StdI->L*StdI->NsiteUC * (2 + 2 + 2)
174 + StdI->L*(StdI->NsiteUC - 1) * (2 + 2 + 2);
175 nintrMax = StdI->L*StdI->NsiteUC * 1
176 + StdI->L*StdI->NsiteUC * 4 * (1 + 1)
177 + StdI->L*(StdI->NsiteUC - 1) * 4 * (1 + 1 + 1);
179 if (strcmp(StdI->model,
"kondo") == 0) {
180 ntransMax += StdI->L * StdI->NsiteUC * (StdI->S2 + 1 + 2 * StdI->S2);
181 nintrMax += StdI->nsite / 2 * (3 * 1 + 1) * (3 * StdI->S2 + 1);
189 for (iL = 0; iL < StdI->L; iL++) {
190 for (isiteUC = 0; isiteUC < StdI->NsiteUC; isiteUC++) {
192 isite = isiteUC + iL * StdI->NsiteUC;
193 if (strcmp(StdI->model,
"kondo") == 0 ) isite += StdI->L * StdI->NsiteUC;
197 if (strcmp(StdI->model,
"spin") == 0 ) {
203 if (strcmp(StdI->model,
"kondo") == 0 ) {
204 jsite = isiteUC + iL * StdI->NsiteUC;
212 StdFace_SetLabel(StdI, fp, 0, iL, 0, 1, isiteUC, isiteUC, &isite, &jsite, 1, &Cphase, dR);
214 if (strcmp(StdI->model,
"spin") == 0 ) {
224 StdFace_SetLabel(StdI, fp, 0, iL, 0, 2, isiteUC, isiteUC, &isite, &jsite, 2, &Cphase, dR);
226 if (strcmp(StdI->model,
"spin") == 0 ) {
236 if (isiteUC < StdI->NsiteUC - 1) {
240 StdFace_SetLabel(StdI, fp, 0, iL, 0, 0, isiteUC, isiteUC + 1, &isite, &jsite, 1, &Cphase, dR);
242 if (strcmp(StdI->model,
"spin") == 0 ) {
252 StdFace_SetLabel(StdI, fp, 0, iL, 0, 1, isiteUC, isiteUC + 1, &isite, &jsite, 1, &Cphase, dR);
254 if (strcmp(StdI->model,
"spin") == 0 ) {
264 StdFace_SetLabel(StdI, fp, 0, iL, 0, -1, isiteUC, isiteUC + 1, &isite, &jsite, 1, &Cphase, dR);
266 if (strcmp(StdI->model,
"spin") == 0 ) {
279 fprintf(fp,
"plot \'-\' w d lc 7\n0.0 0.0\nend\npause -1\n");
297 StdI->W = StdI->NsiteUC;
302 fp = fopen(
"boost.def",
"w");
303 fprintf(fp,
"# Magnetic field\n");
304 fprintf(fp,
"%25.15e %25.15e %25.15e\n",
305 -0.5 * StdI->Gamma, 0.0, -0.5 * StdI->h);
309 fprintf(fp,
"%d # Number of type of J\n", 5);
310 fprintf(fp,
"# J 1 (inter chain, vertical)\n");
311 fprintf(fp,
"%25.15e %25.15e %25.15e\n",
312 0.25 * StdI->J0[0][0], 0.25 * StdI->J0[0][1], 0.25 * StdI->J0[0][2]);
313 fprintf(fp,
"%25.15e %25.15e %25.15e\n",
314 0.25 * StdI->J0[0][1], 0.25 * StdI->J0[1][1], 0.25 * StdI->J0[1][2]);
315 fprintf(fp,
"%25.15e %25.15e %25.15e\n",
316 0.25 * StdI->J0[0][2], 0.25 * StdI->J0[1][2], 0.25 * StdI->J0[2][2]);
317 fprintf(fp,
"# J 2 (Nearest neighbor, along chain)\n");
318 fprintf(fp,
"%25.15e %25.15e %25.15e\n",
319 0.25 * StdI->J1[0][0], 0.25 * StdI->J1[0][1], 0.25 * StdI->J1[0][2]);
320 fprintf(fp,
"%25.15e %25.15e %25.15e\n",
321 0.25 * StdI->J1[0][1], 0.25 * StdI->J1[1][1], 0.25 * StdI->J1[1][2]);
322 fprintf(fp,
"%25.15e %25.15e %25.15e\n",
323 0.25 * StdI->J1[0][2], 0.25 * StdI->J1[1][2], 0.25 * StdI->J1[2][2]);
324 fprintf(fp,
"# J 3 (Second nearest neighbor, along chain)\n");
325 fprintf(fp,
"%25.15e %25.15e %25.15e\n",
326 0.25 * StdI->J1p[0][0], 0.25 * StdI->J1p[0][1], 0.25 * StdI->J1p[0][2]);
327 fprintf(fp,
"%25.15e %25.15e %25.15e\n",
328 0.25 * StdI->J1p[0][1], 0.25 * StdI->J1p[1][1], 0.25 * StdI->J1p[1][2]);
329 fprintf(fp,
"%25.15e %25.15e %25.15e\n",
330 0.25 * StdI->J1p[0][2], 0.25 * StdI->J1p[1][2], 0.25 * StdI->J1p[2][2]);
331 fprintf(fp,
"# J 4 (inter chain, diagonal1)\n");
332 fprintf(fp,
"%25.15e %25.15e %25.15e\n",
333 0.25 * StdI->J2[0][0], 0.25 * StdI->J2[0][1], 0.25 * StdI->J2[0][2]);
334 fprintf(fp,
"%25.15e %25.15e %25.15e\n",
335 0.25 * StdI->J2[0][1], 0.25 * StdI->J2[1][1], 0.25 * StdI->J2[1][2]);
336 fprintf(fp,
"%25.15e %25.15e %25.15e\n",
337 0.25 * StdI->J2[0][2], 0.25 * StdI->J2[1][2], 0.25 * StdI->J2[2][2]);
338 fprintf(fp,
"# J 5 (inter chain, diagonal2)\n");
339 fprintf(fp,
"%25.15e %25.15e %25.15e\n",
340 0.25 * StdI->J2p[0][0], 0.25 * StdI->J2p[0][1], 0.25 * StdI->J2p[0][2]);
341 fprintf(fp,
"%25.15e %25.15e %25.15e\n",
342 0.25 * StdI->J2p[0][1], 0.25 * StdI->J2p[1][1], 0.25 * StdI->J2p[1][2]);
343 fprintf(fp,
"%25.15e %25.15e %25.15e\n",
344 0.25 * StdI->J2p[0][2], 0.25 * StdI->J2p[1][2], 0.25 * StdI->J2p[2][2]);
349 fprintf(stdout,
"\n ERROR! S2 must be 1 in Boost. \n\n");
352 StdI->ishift_nspin = 2;
354 fprintf(stdout,
"\n ERROR! W != 2 \n\n");
357 if (StdI->L % 2 != 0) {
358 fprintf(stdout,
"\n ERROR! L %% 2 != 0 \n\n");
362 fprintf(stdout,
"\n ERROR! L < 4 \n\n");
367 StdI->num_pivot = StdI->W / 2;
369 fprintf(fp,
"# W0 R0 StdI->num_pivot StdI->ishift_nspin\n");
370 fprintf(fp,
"%d %d %d %d\n", StdI->W, StdI->L, StdI->num_pivot, StdI->ishift_nspin);
372 StdI->list_6spin_star = (
int **)malloc(
sizeof(
int*) * StdI->num_pivot);
373 for (ipivot = 0; ipivot < StdI->num_pivot; ipivot++) {
374 StdI->list_6spin_star[ipivot] = (
int *)malloc(
sizeof(
int) * 7);
377 for (ipivot = 0; ipivot < StdI->num_pivot; ipivot++) {
378 StdI->list_6spin_star[ipivot][0] = 7;
379 StdI->list_6spin_star[ipivot][1] = 1;
380 StdI->list_6spin_star[ipivot][2] = 1;
381 StdI->list_6spin_star[ipivot][3] = 1;
382 StdI->list_6spin_star[ipivot][4] = 1;
383 StdI->list_6spin_star[ipivot][5] = 1;
384 StdI->list_6spin_star[ipivot][6] = 1;
387 fprintf(fp,
"# StdI->list_6spin_star\n");
388 for (ipivot = 0; ipivot < StdI->num_pivot; ipivot++) {
389 fprintf(fp,
"# pivot %d\n", ipivot);
390 for (isite = 0; isite < 7; isite++) {
391 fprintf(fp,
"%d ", StdI->list_6spin_star[ipivot][isite]);
396 StdI->list_6spin_pair = (
int ***)malloc(
sizeof(
int**) * StdI->num_pivot);
397 for (ipivot = 0; ipivot < StdI->num_pivot; ipivot++) {
398 StdI->list_6spin_pair[ipivot] = (
int **)malloc(
sizeof(
int*) * 7);
399 for (isite = 0; isite < 7; isite++) {
400 StdI->list_6spin_pair[ipivot][isite] = (
int *)malloc(
sizeof(
int) * StdI->list_6spin_star[ipivot][0]);
404 for (ipivot = 0; ipivot < StdI->num_pivot; ipivot++) {
405 StdI->list_6spin_pair[ipivot][0][0] = 0;
406 StdI->list_6spin_pair[ipivot][1][0] = 1;
407 StdI->list_6spin_pair[ipivot][2][0] = 2;
408 StdI->list_6spin_pair[ipivot][3][0] = 3;
409 StdI->list_6spin_pair[ipivot][4][0] = 4;
410 StdI->list_6spin_pair[ipivot][5][0] = 5;
411 StdI->list_6spin_pair[ipivot][6][0] = 1;
412 StdI->list_6spin_pair[ipivot][0][1] = 0;
413 StdI->list_6spin_pair[ipivot][1][1] = 2;
414 StdI->list_6spin_pair[ipivot][2][1] = 1;
415 StdI->list_6spin_pair[ipivot][3][1] = 3;
416 StdI->list_6spin_pair[ipivot][4][1] = 4;
417 StdI->list_6spin_pair[ipivot][5][1] = 5;
418 StdI->list_6spin_pair[ipivot][6][1] = 2;
419 StdI->list_6spin_pair[ipivot][0][2] = 1;
420 StdI->list_6spin_pair[ipivot][1][2] = 3;
421 StdI->list_6spin_pair[ipivot][2][2] = 0;
422 StdI->list_6spin_pair[ipivot][3][2] = 2;
423 StdI->list_6spin_pair[ipivot][4][2] = 4;
424 StdI->list_6spin_pair[ipivot][5][2] = 5;
425 StdI->list_6spin_pair[ipivot][6][2] = 2;
426 StdI->list_6spin_pair[ipivot][0][3] = 0;
427 StdI->list_6spin_pair[ipivot][1][3] = 4;
428 StdI->list_6spin_pair[ipivot][2][3] = 1;
429 StdI->list_6spin_pair[ipivot][3][3] = 2;
430 StdI->list_6spin_pair[ipivot][4][3] = 3;
431 StdI->list_6spin_pair[ipivot][5][3] = 5;
432 StdI->list_6spin_pair[ipivot][6][3] = 3;
433 StdI->list_6spin_pair[ipivot][0][4] = 1;
434 StdI->list_6spin_pair[ipivot][1][4] = 5;
435 StdI->list_6spin_pair[ipivot][2][4] = 0;
436 StdI->list_6spin_pair[ipivot][3][4] = 2;
437 StdI->list_6spin_pair[ipivot][4][4] = 3;
438 StdI->list_6spin_pair[ipivot][5][4] = 4;
439 StdI->list_6spin_pair[ipivot][6][4] = 3;
440 StdI->list_6spin_pair[ipivot][0][5] = 0;
441 StdI->list_6spin_pair[ipivot][1][5] = 3;
442 StdI->list_6spin_pair[ipivot][2][5] = 1;
443 StdI->list_6spin_pair[ipivot][3][5] = 2;
444 StdI->list_6spin_pair[ipivot][4][5] = 4;
445 StdI->list_6spin_pair[ipivot][5][5] = 5;
446 StdI->list_6spin_pair[ipivot][6][5] = 4;
447 StdI->list_6spin_pair[ipivot][0][6] = 1;
448 StdI->list_6spin_pair[ipivot][1][6] = 2;
449 StdI->list_6spin_pair[ipivot][2][6] = 0;
450 StdI->list_6spin_pair[ipivot][3][6] = 3;
451 StdI->list_6spin_pair[ipivot][4][6] = 4;
452 StdI->list_6spin_pair[ipivot][5][6] = 5;
453 StdI->list_6spin_pair[ipivot][6][6] = 5;
456 fprintf(fp,
"# StdI->list_6spin_pair\n");
457 for (ipivot = 0; ipivot < StdI->num_pivot; ipivot++) {
458 fprintf(fp,
"# pivot %d\n", ipivot);
459 for (kintr = 0; kintr < StdI->list_6spin_star[ipivot][0]; kintr++) {
460 for (isite = 0; isite < 7; isite++) {
461 fprintf(fp,
"%d ", StdI->list_6spin_pair[ipivot][isite][kintr]);
468 for (ipivot = 0; ipivot < StdI->num_pivot; ipivot++) {
469 free(StdI->list_6spin_star[ipivot]);
471 free(StdI->list_6spin_star);
473 for (ipivot = 0; ipivot < StdI->num_pivot; ipivot++) {
474 for (isite = 0; isite < 7; isite++) {
475 free(StdI->list_6spin_pair[ipivot][isite]);
477 free(StdI->list_6spin_pair[ipivot]);
479 free(StdI->list_6spin_pair);
void StdFace_InputHopp(std::complex< double > t, std::complex< double > *t0, const char *t0name)
Input hopping integral from the input file, if it is not specified, use the default value(0 or the is...
void StdFace_SetLabel(struct StdIntList *StdI, FILE *fp, int iW, int iL, int diW, int diL, int isiteUC, int jsiteUC, int *isite, int *jsite, int connect, std::complex< double > *Cphase, double *dR)
Set Label in the gnuplot display (Only used in 2D system)
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_Ladder(struct StdIntList *StdI)
Setup a Hamiltonian for the generalized Heisenberg model on a square lattice.
void StdFace_Ladder_Boost(struct StdIntList *StdI)
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_InputSpin(double Jp[3][3], double JpAll, const char *Jpname)
Input spin-spin interaction other than nearest-neighbor.
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_RequiredVal_i(const char *valname, int val)
Stop HPhi if a variable (integer) which must be specified is absent in the input file (=2147483647...
void StdFace_exit(int errorcode)
MPI Abortation wrapper.
void StdFace_Hopping(struct StdIntList *StdI, std::complex< double > trans0, int isite, int jsite, double *dR)
Add Hopping for the both spin.
void StdFace_NotUsed_c(const char *valname, std::complex< double > val)
Stop HPhi if a variable (complex) not used is specified in the input file (!=NaN).
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_NotUsed_J(const char *valname, double JAll, double J[3][3])
Stop HPhi if variables (real) not used is specified in the input file (!=NaN).
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_InputCoulombV(double V, double *V0, const char *V0name)
Input off-site Coulomb interaction from the input file, if it is not specified, use the default value...
void StdFace_MallocInteractions(struct StdIntList *StdI, int ntransMax, int nintrMax)
Malloc Arrays for interactions.
void StdFace_NotUsed_i(const char *valname, int val)
Stop HPhi if a variable (integer) not used is specified in the input file (!=2147483647, the upper limt of Int).
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.
void StdFace_NotUsed_d(const char *valname, double val)
Stop HPhi if a variable (real) not used is specified in the input file (!=NaN).