Files
lammps/src/main.cpp
2021-05-12 18:31:10 -04:00

96 lines
2.7 KiB
C++

/* ----------------------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
https://lammps.sandia.gov/, Sandia National Laboratories
Steve Plimpton, sjplimp@sandia.gov
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
#include "lammps.h"
#include "input.h"
#include "mdi_interface.h"
#include <mpi.h>
#include <cstdlib>
#if defined(LAMMPS_TRAP_FPE) && defined(_GNU_SOURCE)
#include <fenv.h>
#endif
#if defined(LAMMPS_EXCEPTIONS)
#include "exceptions.h"
#endif
using namespace LAMMPS_NS;
/* ----------------------------------------------------------------------
main program to drive LAMMPS
------------------------------------------------------------------------- */
int main(int argc, char **argv)
{
MPI_Init(&argc,&argv);
// initialize MDI
if ( MDI_Init(&argc,&argv) )
MPI_Abort(MPI_COMM_WORLD, 1);
// get the MPI communicator that spans all ranks running LAMMPS
// when using MDI, this may be a subset of MPI_COMM_WORLD
MPI_Comm lammps_comm = MPI_COMM_WORLD;
int mdi_flag;
if ( MDI_Initialized(&mdi_flag) )
MPI_Abort(MPI_COMM_WORLD, 1);
if ( mdi_flag ) {
if ( MDI_MPI_get_world_comm( &lammps_comm ) )
MPI_Abort(MPI_COMM_WORLD, 1);
}
// enable trapping selected floating point exceptions.
// this uses GNU extensions and is only tested on Linux
// therefore we make it depend on -D_GNU_SOURCE, too.
#if defined(LAMMPS_TRAP_FPE) && defined(_GNU_SOURCE)
fesetenv(FE_NOMASK_ENV);
fedisableexcept(FE_ALL_EXCEPT);
feenableexcept(FE_DIVBYZERO);
feenableexcept(FE_INVALID);
feenableexcept(FE_OVERFLOW);
#endif
#ifdef LAMMPS_EXCEPTIONS
try {
LAMMPS *lammps = new LAMMPS(argc,argv,lammps_comm);
lammps->input->file();
delete lammps;
} catch(LAMMPSAbortException &ae) {
MPI_Abort(ae.universe, 1);
} catch(LAMMPSException &e) {
MPI_Barrier(lammps_comm);
MPI_Finalize();
exit(1);
} catch(fmt::format_error &fe) {
fprintf(stderr,"fmt::format_error: %s\n", fe.what());
MPI_Abort(MPI_COMM_WORLD, 1);
exit(1);
}
#else
try {
LAMMPS *lammps = new LAMMPS(argc,argv,lammps_comm);
lammps->input->file();
delete lammps;
} catch(fmt::format_error &fe) {
fprintf(stderr,"fmt::format_error: %s\n", fe.what());
MPI_Abort(MPI_COMM_WORLD, 1);
exit(1);
}
#endif
MPI_Barrier(lammps_comm);
MPI_Finalize();
}