/*
 * configConverter.cu
 *
 * R. Larsen, S. Ali, D. Clarke
 *
 */

#include "../simulateqcd.h"

#define PREC double


struct ConvertParameters : LatticeParameters {
    Parameter<bool> compress_out;
    Parameter<std::string> format_out;

    ConvertParameters() {
        addDefault(compress_out, "compress_out", true);
        addDefault(format_out, "format_out", std::string("nersc"));
    }
};


int main(int argc, char *argv[]) {

    stdLogger.setVerbosity(INFO);
    const size_t HaloDepth = 2;

    ConvertParameters param;
    CommunicationBase commBase(&argc, &argv);

    param.readfile(commBase, "../parameter/applications/configConverter.param", argc, argv);
    if( param.compress_out()==true && param.format_out()=="ildg" ) {
        throw(rootLogger.fatal("ILDG format does not support compression."));
    }

    commBase.init(param.nodeDim());
    initIndexer(HaloDepth,param,commBase);

    Gaugefield<PREC,true,HaloDepth> gauge(commBase);

    /// Read in:
    if(param.format()=="nersc") {
        gauge.readconf_nersc(param.GaugefileName());
    } else if(param.format()=="ildg") {
        gauge.readconf_ildg(param.GaugefileName());
    } else if(param.format()=="milc"){
        gauge.readconf_milc(param.GaugefileName());
    } else if(param.format()=="openqcd"){
        gauge.readconf_openqcd(param.GaugefileName());
    } else {
        throw(rootLogger.fatal("Invalid specification for format ",param.format()));
    }

    /// Print out:
    if(param.format_out()=="nersc") {
        if(param.compress_out()) {
            gauge.writeconf_nersc(param.GaugefileName_out(), 2, param.prec_out());
        } else {
            gauge.writeconf_nersc(param.GaugefileName_out(), 3, param.prec_out());
        }
    } else if(param.format_out()=="ildg") {
        gauge.writeconf_ildg(param.GaugefileName_out(), param);
    } else {
        throw(rootLogger.fatal("Invalid specification for format_out ",param.format_out()));
    }

    return 0;
}