/*
xmd - molecular dynamics for metals and ceramics
By Jonathan Rifkin <jon.rifkin@uconn.edu>
Copyright 1995-2004 Jonathan Rifkin
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/*
************************************************************************
Compile Switches
************************************************************************
*/
/*
Switches of defintion of external Debug_g in cdhouse.h
*/
#define IS_CDHOUSE_H
/*
************************************************************************
Include Files
************************************************************************
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "cdhouse.h"
#include "cdsubs.h"
/*
************************************************************************
External Variables
************************************************************************
*/
/* Defined in cdsubs.c */
extern Particle_t *a;
int Debug_g = FALSE;
int CheckMem_g = FALSE;
/*
************************************************************************
Module-wide variables
************************************************************************
*/
static time_t InitialTime_m;
static int NumFatalError_m = 0;
/*
************************************************************************
Local Function Prototypes
************************************************************************
*/
static char *GetElapsedTimeStr (void);
/*
************************************************************************
Exported subroutines
************************************************************************
*/
/* Start timer */
void StartProgramTimer (void)
{
time (&InitialTime_m);
}
void CleanAfterError(void)
{
BOOLEAN IsProgramDone;
/* Increment number of fatal errors */
NumFatalError_m ++;
/* Write state file is any CMD steps done */
if (GetNumberOfMDSteps() > 0)
{
printf ("\n");
printf ("SAVING MD STATE\n");
printf (" Writing system state to file 'stop.sta'\n");
printf (" Current step is %li.\n", a->step);
read_command ("write state stop.sta", &IsProgramDone);
}
/* Call standard ending routines */
CleanBeforeEnd();
/* exit */
exit (1);
}
void CleanBeforeEnd (void)
{
/* Write time information */
printf ("\n");
printf ("TIME INFORMATION\n");
printf (" Ending Time: %s\n", GetCurrentTimeStr() );
printf (" Elapsed Time: %s\n", GetElapsedTimeStr() );
/* Write CMD statistics */
/* Print Program Statistics */
if (GetNumberOfMDSteps() > 0)
{
printf ("\n");
printf ("DYNAMICS STATISTICS\n");
printf (" Number of MD Steps: %8li\n",
GetNumberOfMDSteps() );
printf (" Number of Neighbor Searchs: %8li\n",
GetNumNeighborSearchCalls() );
printf (" Time spent on MD steps: %8.0lf (secs)\n",
GetElapsedMDTime() );
printf (" Time spent on Neighbor Search: %8.0lf (secs)\n",
GetElapsedNeighborSearchTime() );
}
/* Print Number of Command Errors */
printf ("\n");
printf ("ERROR STATISTICS\n");
printf (" Number of Fatal Errors: %4i",
NumFatalError_m );
if (NumFatalError_m > 0)
printf (" <======= !!!\n");
else
printf ("\n");
printf (" Number of Unknown Command Errors: %4i",
GetNumberOfCommandErrors() );
if (GetNumberOfCommandErrors() > 0)
printf (" <======= !!!\n");
else
printf ("\n");
printf (" Number of Misc. Warnings: %4i",
GetNumberOfWarnings() );
if (GetNumberOfWarnings() > 0)
printf (" <======= !!!\n");
else
printf ("\n");
}
/* Return time and date string */
char *GetCurrentTimeStr (void)
{
struct tm *timeptr;
static char TimeString[23];
time_t CurrentTime;
/* Get current time (in seconds from 1900) */
time (&CurrentTime);
/* Convert to date, time */
timeptr = localtime (&CurrentTime);
/* Form string */
sprintf (TimeString, "%02d/%02d/%04d %02d:%02d:%02d",
timeptr->tm_mon+1, timeptr->tm_mday, timeptr->tm_year+1900,
timeptr->tm_hour, timeptr->tm_min, timeptr->tm_sec);
/* Return string */
return TimeString;
}
/*
************************************************************************
Local Functions
************************************************************************
*/
/* Print elapsed time */
char *GetElapsedTimeStr (void)
{
static char ElapsedTimeStr[32];
time_t FinalTime;
double TimeDifference;
int Minute;
int Second;
/* Get time difference */
time (&FinalTime);
TimeDifference = difftime (FinalTime, InitialTime_m);
/* Convert from seconds to minutes, seconds */
Minute = TimeDifference / 60;
Second = TimeDifference - 60 * Minute;
/* Form string */
sprintf (ElapsedTimeStr, "%d min %02d sec",
Minute, Second);
/* Return string */
return ElapsedTimeStr;
}