30 #define HDF5_STATUS_CHECK(status) { \
32 std::cerr << __FILE__ << ":" << __LINE__ << \
33 ": Problem with writing to file. Status code=" \
34 << status << std::endl; \
74 std::vector< std::tuple<int,int,int> > totalmom;
75 totalmom.reserve(
dim);
78 for(
unsigned int a=0;a<
baseUp.size();a++)
79 for(
unsigned int b=0;b<
baseDown.size();b++)
81 auto calcK = [] (
myint cur)
88 myint ksp = cur & (~cur + 1);
102 totalmom.push_back(std::make_tuple(a,b,K));
105 std::sort(totalmom.begin(), totalmom.end(),
106 [](
const std::tuple<int,int,int> & a,
const std::tuple<int,int,int> & b) ->
bool
108 return std::get<2>(a) < std::get<2>(b);
114 std::for_each(totalmom.begin(), totalmom.end(), [
this](std::tuple<int,int,int> elem)
116 auto tmp = std::make_pair(std::get<0>(elem), std::get<1>(elem));
117 mombase[std::get<2>(elem)].push_back(tmp);
135 std::cerr <<
"Build base before building MomHamiltonian" << std::endl;
143 int cur_dim =
mombase[B].size();
145 blockmat[B].reset(
new double [cur_dim*cur_dim]);
147 for(
int i=0;i<cur_dim;i++)
152 for(
int j=i;j<cur_dim;j++)
187 myint k2sp = downket & (~downket + 1);
206 myint k1sp = upket & (~upket + 1);
221 myint k3sp = upbra & (~upbra + 1);
247 result += signk1*signk2*signk3*signk4;
269 myint hop = ket & (~ket + 1);
273 result += -2* cos(2.0*M_PI/
L *
CountBits(hop-1));
297 dsymv_(&uplo,&dim,&beta,
blockmat[B].
get(),&dim,&x[offset],&incx,&alpha,&y[offset],&incx);
312 std::vector<double> eigenvalues(
dim);
325 std::sort(eigenvalues.begin(), eigenvalues.end());
340 std::vector<double> eigs(
dim);
341 std::vector< std::pair<int, double> > energy;
351 for(
int i=0;i<
dim;i++)
352 energy.push_back(std::make_pair(B,eigs[offset+i]));
357 std::sort(energy.begin(), energy.end(),
358 [](
const std::pair<int,double> & a,
const std::pair<int,double> & b) ->
bool
360 return a.second < b.second;
376 double Ucur = Ubegin;
381 std::vector<double> eigenvalues(
dim);
383 hid_t file_id, group_id, dataset_id, dataspace_id, attribute_id;
386 file_id = H5Fcreate(filename.c_str(), H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
389 group_id = H5Gcreate(file_id,
"run", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
392 dataspace_id = H5Screate(H5S_SCALAR);
394 attribute_id = H5Acreate (group_id,
"L", H5T_STD_I32LE, dataspace_id, H5P_DEFAULT, H5P_DEFAULT);
395 status = H5Awrite (attribute_id, H5T_NATIVE_INT, &
L );
397 status = H5Aclose(attribute_id);
400 attribute_id = H5Acreate (group_id,
"Nu", H5T_STD_I32LE, dataspace_id, H5P_DEFAULT, H5P_DEFAULT);
401 status = H5Awrite (attribute_id, H5T_NATIVE_INT, &
Nu );
403 status = H5Aclose(attribute_id);
406 attribute_id = H5Acreate (group_id,
"Nd", H5T_STD_I32LE, dataspace_id, H5P_DEFAULT, H5P_DEFAULT);
407 status = H5Awrite (attribute_id, H5T_NATIVE_INT, &
Nd );
409 status = H5Aclose(attribute_id);
412 attribute_id = H5Acreate (group_id,
"J", H5T_IEEE_F64LE, dataspace_id, H5P_DEFAULT, H5P_DEFAULT);
413 status = H5Awrite (attribute_id, H5T_NATIVE_DOUBLE, &
J );
415 status = H5Aclose(attribute_id);
418 attribute_id = H5Acreate (group_id,
"Ubegin", H5T_IEEE_F64LE, dataspace_id, H5P_DEFAULT, H5P_DEFAULT);
419 status = H5Awrite (attribute_id, H5T_NATIVE_DOUBLE, &Ubegin );
421 status = H5Aclose(attribute_id);
424 attribute_id = H5Acreate (group_id,
"Uend", H5T_IEEE_F64LE, dataspace_id, H5P_DEFAULT, H5P_DEFAULT);
425 status = H5Awrite (attribute_id, H5T_NATIVE_DOUBLE, &Uend );
427 status = H5Aclose(attribute_id);
430 attribute_id = H5Acreate (group_id,
"Ustep", H5T_IEEE_F64LE, dataspace_id, H5P_DEFAULT, H5P_DEFAULT);
431 status = H5Awrite (attribute_id, H5T_NATIVE_DOUBLE, &step );
433 status = H5Aclose(attribute_id);
436 status = H5Sclose(dataspace_id);
439 status = H5Gclose(group_id);
442 status = H5Fclose(file_id);
445 std::vector<double> diagonalelements(
dim);
447 std::vector< std::unique_ptr<double []> > offdiag;
453 #pragma omp parallel for
456 int cur_dim =
mombase[B].size();
459 for(
int tmp=0;tmp<B;tmp++)
462 offdiag[B].reset(
new double [cur_dim*cur_dim]);
464 for(
int i=0;i<cur_dim;i++)
471 for(
int j=i;j<cur_dim;j++)
476 offdiag[B][j+cur_dim*i] = 1.0/L*
interaction(a,b,c,d);
477 offdiag[B][i+cur_dim*j] = offdiag[B][j+cur_dim*i];
485 std::cout <<
"U = " << Ucur << std::endl;
489 #pragma omp parallel for
492 int cur_dim =
mombase[B].size();
495 for(
int tmp=0;tmp<B;tmp++)
498 std::memcpy(
blockmat[B].
get(),offdiag[B].
get(),cur_dim*cur_dim*
sizeof(
double));
500 int tmp = cur_dim*cur_dim;
504 for(
int i=0;i<cur_dim;i++)
505 blockmat[B][i+cur_dim*i] += diagonalelements[offset+i];
509 #pragma omp parallel for
515 for(
int tmp=0;tmp<B;tmp++)
522 std::stringstream name;
523 name << std::setprecision(5) << std::fixed <<
"/run/" << Ucur;
525 file_id = H5Fopen(filename.c_str(), H5F_ACC_RDWR, H5P_DEFAULT);
528 U_id = H5Gcreate(file_id, name.str().c_str(), H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
536 for(
int tmp=0;tmp<B;tmp++)
539 hsize_t dimarr =
dim;
541 dataspace_id = H5Screate_simple(1, &dimarr, NULL);
543 std::stringstream cur_block;
545 dataset_id = H5Dcreate(U_id, cur_block.str().c_str(), H5T_IEEE_F64LE, dataspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
547 status = H5Dwrite(dataset_id, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &eigenvalues[offset] );
550 status = H5Sclose(dataspace_id);
553 status = H5Dclose(dataset_id);
557 status = H5Gclose(U_id);
560 status = H5Fclose(file_id);