#include #include #include //USING_NAMESPACE_CPS using namespace std; namespace cps { //uint32_t crc32_fast(const void* data, size_t length, uint32_t previousCrc32); int get_alcf_index( int x, int y, int z, int t, int* latt, int s, int ivec, int co ) { // int ls = GJP.SnodeSites(); int vol_4d_oo = latt[0]*latt[1]*latt[2]*latt[3] / 2; int vol_5d = vol_4d_oo * ls; int NtHalf = latt[3] / 2; int simd_coor = t / NtHalf; int regu_coor = (x + latt[0] * (y + latt[1] * ( z + latt[2] * (t % NtHalf) ) )) / 2; int regu_vol = vol_4d_oo / 2; return ivec * vol_5d * 24 + regu_coor * ls * 48 + s * 48 + co * 4 + simd_coor * 2; } int get_index( int x, int y, int z, int t, int* latt, int s, int ivec, int co ) { // int ls = GJP.SnodeSites(); int vol_4d_oo = latt[0]*latt[1]*latt[2]*latt[3] / 2; int vol_5d = vol_4d_oo * ls; int regu_coor = (x + latt[0] * (y + latt[1] * ( z + latt[2] * t ) )) / 2; int regu_vol = vol_4d_oo / 2; return ivec * vol_5d * 24 + s * vol_4d_oo * 24 + regu_coor * 24 + co * 2; } void alcf_evecs_save(char* dest,EigenCache* ec, int nkeep) { // format string char* dest_sep = strrchr(dest,'/'); *dest_sep = '\0'; char* meta_tag = dest_sep + 1; FILE* f; char fn[2048]; int i; if (!UniqueID()) { printf("STATUS: Writing %d eigenvectors to %s in ALCF format\n", nkeep,dest); } // 1) write eigen-values.txt if (!UniqueID()) { sprintf(fn,"%s/eigen-values.txt",dest); f=fopen(fn,"wt"); if (f) { fprintf(f,"%d\n",nkeep); for (i=0;ieval_address()[i]); fclose(f); } } // 2) write eigenvectors in 32 directories int id = UniqueID(); int slots_total = GJP.Nodes(0) * GJP.Nodes(1) * GJP.Nodes(2) * GJP.Nodes(3); int dir_id = id / (slots_total / 32); int nwrite_at_once = 32; int ngroups = slots_total / nwrite_at_once; int igroup; uint32_t crc32_all = 0x0; for (igroup=0;igroupevec_address())[size_float*i]; float* ev_in = (float*)ec->vec_ptr(i); // Keep in mind: without re-ordering ev<>ev_in the norm is OK when reading in, with it is not! { int x,y,z,t,s,co; int latt[] = { GJP.NodeSites(0), GJP.NodeSites(1), GJP.NodeSites(2), GJP.NodeSites(3) }; for (x=0;x