ABACUS/src/EXECS/Analyze_RAW_File.cc

87 lines
2.2 KiB
C++

/**********************************************************
This software is part of J.-S. Caux's ABACUS library.
Copyright (c) J.-S. Caux.
-----------------------------------------------------------
File: Analyze_RAW_File.cc
Purpose: give some statistics for the matrix element distribution in a raw file.
***********************************************************/
#include "ABACUS.h"
using namespace std;
using namespace ABACUS;
int main(int argc, char* argv[])
{
if (argc != 4) {
cout << "Argument needed: rawfile, iKmin, iKmax." << endl;
ABACUSerror("");
}
const char* rawfilename = argv[1];
int iKmin = atoi(argv[2]);
int iKmax = atoi(argv[3]);
ifstream RAW_infile;
RAW_infile.open(rawfilename);
if (RAW_infile.fail()) {
cout << rawfilename << endl;
ABACUSerror("Could not open RAW_infile... ");
}
DP omega;
int iK;
DP FF;
DP dev;
string label;
DP sumFFsq = 0.0;
DP sumFF4 = 0.0;
DP sumFFsqlnFFsq = 0.0;
Vect<int> nFFatK (0, iKmax - iKmin + 1);
Vect<DP> sumFFsqatK (0.0, iKmax - iKmin + 1);
Vect<DP> sumFF4atK (0.0, iKmax - iKmin + 1);
Vect<DP> sumFFsqlnFFsqatK (0.0, iKmax - iKmin + 1);
int nread = 0;
while (RAW_infile.peek() != EOF) {
RAW_infile >> omega >> iK >> FF >> dev >> label;
nread++;
sumFFsq += FF*FF;
sumFF4 += FF*FF*FF*FF;
sumFFsqlnFFsq += FF*FF * log(FF*FF);
if (iK >= iKmin && iK <= iKmax) {
nFFatK[iK-iKmin] += 1;
sumFFsqatK[iK - iKmin] += FF*FF;
sumFF4atK[iK - iKmin] += FF*FF*FF*FF;
sumFFsqlnFFsqatK[iK - iKmin] += FF*FF * log(FF*FF);
}
}
RAW_infile.close();
cout << "Inverse participation ratio: \t" << sumFF4/(sumFFsq*sumFFsq) << endl;
// Entropy is -sum (FFsq/sumFFsq) * ln(FFsq/sumFFsq) = sum (FFsq lnFFsq - FFsq ln sumFFsq)/sumFFsq
cout << "Entropy: \t" << -(sumFFsqlnFFsq - sumFFsq * log(sumFFsq))/sumFFsq << endl;
cout << "iK\tnFFatK\tIPRatiK\tentropyatiK:" << endl;
for (int iK = iKmin; iK <= iKmax; ++iK)
cout << iK << "\t" << nFFatK[iK-iKmin] << "\t"
<< sumFF4atK[iK-iKmin]/(sumFFsqatK[iK - iKmin] * sumFFsqatK[iK - iKmin]) << "\t"
<< -(sumFFsqlnFFsqatK[iK-iKmin] - sumFFsqatK[iK-iKmin] * log(sumFFsqatK[iK-iKmin])
)/sumFFsqatK[iK-iKmin]<< endl;
return(0);
}