#include <analysis/QuadratureManager.hpp>
#include <dev/ParallelChecker.hpp>
#include <language/PugsParser.hpp>
#include <mesh/DualConnectivityManager.hpp>
#include <mesh/DualMeshManager.hpp>
#include <mesh/MeshDataManager.hpp>
#include <mesh/SynchronizerManager.hpp>
#include <utils/ExecutionStatManager.hpp>
#include <utils/GlobalVariableManager.hpp>
#include <utils/PugsUtils.hpp>
#include <utils/RandomEngine.hpp>

int
main(int argc, char* argv[])
{
  ExecutionStatManager::create();
  ParallelChecker::create();

  std::string filename = initialize(argc, argv);

  SynchronizerManager::create();
  RandomEngine::create();
  QuadratureManager::create();
  MeshDataManager::create();
  DualConnectivityManager::create();
  DualMeshManager::create();

  GlobalVariableManager::create();

  parser(filename);
  ExecutionStatManager::printInfo();

  GlobalVariableManager::destroy();

  DualMeshManager::destroy();
  DualConnectivityManager::destroy();
  MeshDataManager::destroy();
  QuadratureManager::destroy();
  RandomEngine::destroy();
  SynchronizerManager::destroy();

  finalize();

  ParallelChecker::destroy();

  int return_code = ExecutionStatManager::getInstance().exitCode();
  ExecutionStatManager::destroy();

  return return_code;
}