125 lines
3.4 KiB
C++
125 lines
3.4 KiB
C++
/**********************************************************
|
|
|
|
This software is part of J.-S. Caux's ABACUS library.
|
|
|
|
Copyright (c) J.-S. Caux.
|
|
|
|
-----------------------------------------------------------
|
|
|
|
File: Sort_RAW_File.cc
|
|
|
|
Purpose: orders the file in form factor or energy.
|
|
|
|
***********************************************************/
|
|
|
|
#include "ABACUS.h"
|
|
|
|
using namespace std;
|
|
|
|
|
|
namespace ABACUS {
|
|
|
|
void Sort_RAW_File (const char ffsq_file[], char optionchar)
|
|
{
|
|
Sort_RAW_File (ffsq_file, optionchar, 'a'); // dummy whichDSF, doesn't matter
|
|
}
|
|
|
|
|
|
void Sort_RAW_File (const char ff_file[], char optionchar, char whichDSF)
|
|
{
|
|
// Sorts FF in decreasing order for 'f' option, or energies in increasing order for option 'e', and writes .dat_srt file
|
|
|
|
if (!(optionchar == 'e' || optionchar == 'f')) ABACUSerror("Wrong option in Sort_FF");
|
|
|
|
// Check size of threads file:
|
|
struct stat statbuf;
|
|
|
|
stat (ff_file, &statbuf);
|
|
int filesize = statbuf.st_size;
|
|
|
|
// Determine the number of entries approximately
|
|
int entry_size = 2* sizeof(float) + 2*sizeof(int);
|
|
|
|
//const int MAXDATA = 50000000;
|
|
const int MAXDATA = filesize/entry_size + 10;
|
|
|
|
DP* omega = new DP[MAXDATA];
|
|
int* iK = new int[MAXDATA];
|
|
DP* ff = new DP[MAXDATA];
|
|
DP* ff_im = new DP[MAXDATA];
|
|
DP* dev = new DP[MAXDATA];
|
|
string* label = new string[MAXDATA];
|
|
|
|
ifstream infile;
|
|
infile.open(ff_file);
|
|
|
|
if (infile.fail()) ABACUSerror("The input file was not opened successfully in Sort_RAW_File. ");
|
|
|
|
stringstream outfilename;
|
|
string outfilename_string;
|
|
outfilename << ff_file << "_srt_" << optionchar;
|
|
outfilename_string = outfilename.str();
|
|
const char* outfilename_c_str = outfilename_string.c_str();
|
|
|
|
ofstream outfile;
|
|
outfile.open(outfilename_c_str);
|
|
outfile.precision(16);
|
|
|
|
int Ndata = 0;
|
|
while (((infile.peek()) != EOF) && (Ndata < MAXDATA)) {
|
|
|
|
infile >> omega[Ndata];
|
|
infile >> iK[Ndata];
|
|
if (whichDSF != 'Z') infile >> ff[Ndata];
|
|
if (whichDSF == 'q') infile >> ff_im[Ndata]; // imaginary part of overlap, quench case
|
|
infile >> dev[Ndata];
|
|
infile >> label[Ndata];
|
|
|
|
Ndata++;
|
|
}
|
|
infile.close();
|
|
|
|
int* index = new int[Ndata];
|
|
DP* ffsq = new DP[Ndata];
|
|
|
|
for (int i = 0; i < Ndata; ++i) index[i] = i;
|
|
for (int i = 0; i < Ndata; ++i) ffsq[i] = ff[i] * ff[i];
|
|
|
|
if (optionchar == 'f') QuickSort(ffsq, index, 0, Ndata - 1);
|
|
else if (optionchar == 'e') QuickSort(omega, index, 0, Ndata - 1);
|
|
|
|
for (int i = 0; i < Ndata; i++) {
|
|
|
|
if (i > 0) outfile << endl;
|
|
if (optionchar == 'f') {
|
|
|
|
outfile << omega[index[Ndata - 1 - i] ] << "\t" << iK[index[Ndata - 1 - i] ];
|
|
if (whichDSF != 'Z') outfile << "\t" << ff[index[Ndata - 1 - i] ];
|
|
if (whichDSF == 'q') outfile << "\t" << ff_im[index[Ndata - 1 - i] ];
|
|
outfile << "\t" << dev[index[Ndata - 1 - i] ] << "\t" << label[index[Ndata - 1 - i] ];
|
|
}
|
|
else if (optionchar == 'e') {
|
|
outfile << omega[i] << "\t" << iK[index[i] ];
|
|
if (whichDSF != 'Z') outfile << "\t" << ff[index[i] ];
|
|
if (whichDSF == 'q') outfile << "\t" << ff_im[index[i] ];
|
|
outfile << "\t" << dev[index[i] ] << "\t" << label[index[i] ];
|
|
}
|
|
}
|
|
|
|
outfile.close();
|
|
|
|
delete[] omega;
|
|
delete[] iK;
|
|
delete[] ff;
|
|
delete[] ff_im;
|
|
delete[] dev;
|
|
delete[] label;
|
|
|
|
delete[] index;
|
|
delete[] ffsq;
|
|
|
|
return;
|
|
}
|
|
|
|
} // namespace ABACUS
|