diff --git a/src/info.cpp b/src/info.cpp index 9599942aa..8727baef8 100644 --- a/src/info.cpp +++ b/src/info.cpp @@ -1,278 +1,281 @@ /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator http://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. ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- Contributing author: Axel Kohlmeyer (Temple U) ------------------------------------------------------------------------- */ #include "string.h" #include "info.h" #include "atom.h" #include "comm.h" #include "compute.h" #include "domain.h" #include "dump.h" #include "fix.h" #include "force.h" #include "group.h" #include "input.h" #include "modify.h" #include "output.h" #include "region.h" #include "variable.h" #include "update.h" #include "error.h" #ifdef _WIN32 #include <windows.h> #include <stdint.h> #else #include <sys/time.h> #include <sys/resource.h> #include <sys/utsname.h> #endif #if defined __linux #include <malloc.h> #endif namespace LAMMPS_NS { // same as in variable.cpp enum{INDEX,LOOP,WORLD,UNIVERSE,ULOOP,STRING,GETENV, SCALARFILE,ATOMFILE,FORMAT,EQUAL,ATOM,PYTHON}; } static const char *varstyles[] = { "index", "loop", "world", "universe", "uloop", "string", "getenv", "file", "atomfile", "format", "equal", "atom", "python", "(unknown)"}; static const char *mapstyles[] = { "none", "array", "hash" }; static const char bstyles[] = "pfsm"; using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ void Info::command(int narg, char **arg) { if (!screen || comm->me) return; for (int idx = 0; idx < narg; ++idx) { fputs("\n",screen); if (strcmp(arg[idx],"computes") == 0) { int ncompute = modify->ncompute; Compute **compute = modify->compute; char **names = group->names; fprintf(screen,"Compute information:\n"); for (int i=0; i < ncompute; ++i) { fprintf(screen,"Compute[%3d]: %s, style: %s, group: %s\n", i, compute[i]->id, compute[i]->style, names[compute[i]->igroup]); } } else if (strcmp(arg[idx],"dumps") == 0) { int ndump = output->ndump; Dump **dump = output->dump; int *nevery = output->every_dump;\ char **vnames = output->var_dump; char **names = group->names; fprintf(screen,"Dump information:\n"); for (int i=0; i < ndump; ++i) { fprintf(screen,"Dump[%3d]: %s, file: %s, style: %s, group: %s, ", i, dump[i]->id, dump[i]->filename, dump[i]->style, names[dump[i]->igroup]); if (nevery[i]) { fprintf(screen,"every: %d\n", nevery[i]); } else { fprintf(screen,"every: %s\n", vnames[i]); } } } else if (strcmp(arg[idx],"fixes") == 0) { int nfix = modify->nfix; Fix **fix = modify->fix; char **names = group->names; fprintf(screen,"Fix information:\n"); for (int i=0; i < nfix; ++i) { fprintf(screen,"Fix[%3d]: %s, style: %s, group: %s\n", i, fix[i]->id, fix[i]->style, names[fix[i]->igroup]); } } else if (strcmp(arg[idx],"groups") == 0) { int ngroup = group->ngroup; char **names = group->names; int *dynamic = group->dynamic; fprintf(screen,"Group information:\n"); for (int i=0; i < ngroup; ++i) { fprintf(screen,"Group[%2d]: %s (%s)\n", i, names[i], dynamic[i] ? "dynamic" : "static"); } } else if (strcmp(arg[idx],"regions") == 0) { int nreg = domain->nregion; Region **regs = domain->regions; fprintf(screen,"Region information:\n"); for (int i=0; i < nreg; ++i) { fprintf(screen,"Region[%3d]: %s, style: %s, side: %s\n", i, regs[i]->id, regs[i]->style, regs[i]->interior ? "in" : "out"); } } else if (strcmp(arg[idx],"memory") == 0) { fprintf(screen,"Memory allocation information (MPI rank 0)\n"); #if defined(_WIN32) #else #if defined(__linux) struct mallinfo mi; mi = mallinfo(); - fprintf(screen,"Total dynamically allocated memory: %g Mbyte\n",(double)mi.uordblks/1048576.0); + fprintf(screen,"Total dynamically allocated memory: %.3g Mbyte\n",(double)mi.uordblks/1048576.0); #endif struct rusage ru; if (getrusage(RUSAGE_SELF, &ru) == 0) { - fprintf(screen,"Maximum resident set size: %g Mbyte\n",(double)ru.ru_maxrss/1024); + fprintf(screen,"Maximum resident set size: %.3g Mbyte\n",(double)ru.ru_maxrss/1024.0); +#if defined(__linux) + fprintf(screen,"Total stack size: %.3g Mbyte\n",(double)ru.ru_isrss/1024.0); +#endif } #endif } else if (strcmp(arg[idx],"os") == 0) { #if defined(_WIN32) fprintf(screen,"OS information:\n"); #else struct utsname ut; uname(&ut); fprintf(screen,"OS information: %s %s on %s\n", ut.sysname, ut.release, ut.machine); #endif } else if (strcmp(arg[idx],"time") == 0) { double wallclock = MPI_Wtime() - lmp->initclock; double cpuclock = 0.0; #if defined(_WIN32) // from MSD docs. FILETIME ct,et,kt,ut; union { FILETIME ft; uint64_t ui; } cpu; if (GetProcessTimes(GetCurrentProcess(),&ct,&et,&kt,&ut)) { cpu.ft = ut; cpuclock = cpu.ui * 0.0000001; } #else /* POSIX */ struct rusage ru; if (getrusage(RUSAGE_SELF, &ru) == 0) { cpuclock = (double) ru.ru_utime.tv_sec; cpuclock += (double) ru.ru_utime.tv_usec * 0.000001; } #endif /* ! _WIN32 */ int cpuh,cpum,cpus,wallh,wallm,walls; cpus = fmod(cpuclock,60.0); cpuclock = (cpuclock - cpus) / 60.0; cpum = fmod(cpuclock,60.0); cpuh = (cpuclock - cpum) / 60.0; walls = fmod(wallclock,60.0); wallclock = (wallclock - walls) / 60.0; wallm = fmod(wallclock,60.0); wallh = (wallclock - wallm) / 60.0; fprintf(screen,"Total time information (MPI rank 0):\n" " CPU time: %4d:%02d:%02d\n" " Wall time: %4d:%02d:%02d\n", cpuh,cpum,cpus,wallh,wallm,walls); } else if (strcmp(arg[idx],"variables") == 0) { int nvar = input->variable->nvar; int *style = input->variable->style; char **names = input->variable->names; char ***data = input->variable->data; fprintf(screen,"Variable information:\n"); for (int i=0; i < nvar; ++i) { int ndata = 1; fprintf(screen,"Variable[%3d]: %-10s style = %-10s def =", i,names[i],varstyles[style[i]]); if ((style[i] != LOOP) && (style[i] != ULOOP)) ndata = input->variable->num[i]; for (int j=0; j < ndata; ++j) fprintf(screen," %s",data[i][j]); fputs("\n",screen); } } else if (strcmp(arg[idx],"system") == 0) { fprintf(screen,"System information:\n"); fprintf(screen,"Units = %s\n",update->unit_style); fprintf(screen,"Atom style = %s\n", atom->atom_style); fprintf(screen,"Atom map = %s\n", mapstyles[atom->map_style]); if (atom->molecular > 0) { const char *msg; msg = (atom->molecular == 2) ? "template" : "standard"; fprintf(screen,"Molecule type = %s\n",msg); } fprintf(screen,"Atoms: " BIGINT_FORMAT ", types: %d, style: %s\n", atom->natoms, atom->ntypes, force->pair_style); if (atom->molecular > 0) { const char *msg; msg = force->bond_style ? force->bond_style : "none"; fprintf(screen,"Bonds: " BIGINT_FORMAT ", types: %d, style: %s\n", atom->nbonds, atom->nbondtypes, msg); msg = force->angle_style ? force->angle_style : "none"; fprintf(screen,"Angles: " BIGINT_FORMAT ", types: %d, style: %s\n", atom->nangles, atom->nangletypes, msg); msg = force->dihedral_style ? force->dihedral_style : "none"; fprintf(screen,"Dihedrals: " BIGINT_FORMAT ", types: %d, style: %s\n", atom->ndihedrals, atom->ndihedraltypes, msg); msg = force->improper_style ? force->improper_style : "none"; fprintf(screen,"Impropers: " BIGINT_FORMAT ", types: %d, style: %s\n", atom->nimpropers, atom->nimpropertypes, msg); const double * const special_lj = force->special_lj; const double * const special_coul = force->special_coul; fprintf(screen,"Special bond factors lj: %-10g %-10g %-10g\n" "Special bond factors coul: %-10g %-10g %-10g\n", special_lj[1],special_lj[2],special_lj[3], special_coul[1],special_coul[2],special_coul[3]); } fprintf(screen,"Kspace style = %s\n", force->kspace ? force->kspace_style : "none"); if (domain->box_exist) { fprintf(screen,"\n%s box: (%g x %g %g)\n", domain->triclinic ? "Triclinic" : "Orthogonal", domain->xprd, domain->yprd, domain->zprd); fprintf(screen,"Boundaries = %c,%c %c,%c %c,%c\n", bstyles[domain->boundary[0][0]],bstyles[domain->boundary[0][1]], bstyles[domain->boundary[1][0]],bstyles[domain->boundary[1][1]], bstyles[domain->boundary[2][0]],bstyles[domain->boundary[2][1]]); fprintf(screen,"Xlo, zhi = %g, %g\n", domain->boxlo[0], domain->boxhi[0]); fprintf(screen,"Ylo, zhi = %g, %g\n", domain->boxlo[1], domain->boxhi[1]); fprintf(screen,"Zlo, zhi = %g, %g\n", domain->boxlo[2], domain->boxhi[2]); if (domain->triclinic) fprintf(screen,"Xy, xz, yz = %g, %g, %g\n", domain->xy, domain->xz, domain->yz); } else { fputs("\nBox has not yet been created\n",screen); } } else { error->one(FLERR,"Unknown info command style"); } } }