/*
 * Driver.cc
 *
 *  Created on: Jan 23, 2012
 *      Author: cferenba
 *
 * Copyright (c) 2012, Los Alamos National Security, LLC.
 * All rights reserved.
 * Use of this source code is governed by a BSD-style open-source
 * license; see top-level LICENSE file for full license text.
 */

#include "Driver.hh"

#include <cstdlib>
#include <sys/time.h>
#include <iostream>
#include <fstream>
#include <iomanip>
#ifdef _OPENMP
#include "omp.h"
#endif

#include "InputFile.hh"
#include "Mesh.hh"
#include "Hydro.hh"

using namespace std;


Driver::Driver(const InputFile* inp, const string& pname)
        : probname(pname) {
    cout << "********************" << endl;
    cout << "Running PENNANT v0.6" << endl;
    cout << "********************" << endl;
    cout << endl;

#ifdef _OPENMP
    cout << "Running on " << omp_get_max_threads() << " threads" << endl;
#endif

    cstop = inp->getInt("cstop", 999999);
    tstop = inp->getDouble("tstop", 1.e99);
    if (cstop == 999999 && tstop == 1.e99) {
        cerr << "Must specify either cstop or tstop" << endl;
        exit(1);
    }
    dtmax = inp->getDouble("dtmax", 1.e99);
    dtinit = inp->getDouble("dtinit", 1.e99);
    dtfac = inp->getDouble("dtfac", 1.2);
    dtreport = inp->getInt("dtreport", 10);

    // initialize mesh, hydro
    mesh = new Mesh(inp);
    hydro = new Hydro(inp, mesh);

}

Driver::~Driver() {

    delete hydro;
    delete mesh;

}

void Driver::run() {

    const int numz = mesh->numz;

    time = 0.0;
    cycle = 0;

    // get starting timestamp;
    struct timeval sbegin;
    gettimeofday(&sbegin, NULL);
    double tbegin = sbegin.tv_sec + sbegin.tv_usec * 1.e-6;
    double tlast = tbegin;

    // main event loop
    while (cycle < cstop && time < tstop) {

        cycle += 1;

        // get timestep
        calcGlobalDt();

        // begin hydro cycle
        hydro->doCycle(dt);

        time += dt;

        if (cycle == 1 || cycle % dtreport == 0) {
            struct timeval scurr;
            gettimeofday(&scurr, NULL);
            double tcurr = scurr.tv_sec + scurr.tv_usec * 1.e-6;
            double tdiff = tcurr - tlast;

            cout << scientific << setprecision(5);
            cout << "End cycle " << setw(6) << cycle
                 << ", time = " << setw(11) << time
                 << ", dt = " << setw(11) << dt
                 << ", wall = " << setw(11) << tdiff << endl;
            cout << "dt limiter: " << msgdt << endl;

            tlast = tcurr;
        } // if cycle...

    } // while cycle...

    // get stopping timestamp;
    struct timeval send;
    gettimeofday(&send, NULL);
    double tend = send.tv_sec + send.tv_usec * 1.e-6;
    double runtime = tend - tbegin;

    hydro->getData();

    // write end message
    cout << endl;
    cout << "Run complete" << endl;
    cout << scientific << setprecision(6);
    cout << "cycle = " << setw(6) << cycle
         << ",         cstop = " << setw(6) << cstop << endl;
    cout << "time  = " << setw(14) << time
         << ", tstop = " << setw(14) << tstop << endl;

    cout << endl;
    cout << "**************************************" << endl;
    cout << "hydro cycle run time= " << setw(14) << runtime << endl;
    cout << "**************************************" << endl;

    // do final mesh output
    mesh->write(probname, cycle, time,
            hydro->zr, hydro->ze, hydro->zp);

}


void Driver::calcGlobalDt() {

    // Save timestep from last cycle
    dtlast = dt;
    msgdtlast = msgdt;

    // Compute timestep for this cycle
    dt = dtmax;
    msgdt = "Global maximum (dtmax)";

    if (cycle == 1) {
        // compare to initial timestep
        if (dtinit < dt) {
            dt = dtinit;
            msgdt = "Initial timestep";
        }
    } else {
        // compare to factor * previous timestep
        double dtrecover = dtfac * dtlast;
        if (dtrecover < dt) {
            dt = dtrecover;
            if (msgdtlast.substr(0, 8) == "Recovery")
                msgdt = msgdtlast;
            else
                msgdt = "Recovery: " + msgdtlast;
        }
    }

    // compare to time-to-end
    if ((tstop - time) < dt) {
        dt = tstop - time;
        msgdt = "Global (tstop - time)";
    }

    // compare to hydro dt
    hydro->getDtHydro(dt, msgdt);

}

