forked from lijiext/lammps
git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@3564 f3b2605a-c512-4ea7-a41b-209d697bcdaa
This commit is contained in:
parent
af93705f78
commit
d6202909fd
|
@ -20,6 +20,9 @@
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
|
|
||||||
|
|
||||||
|
#include "comm.h"
|
||||||
|
|
||||||
using namespace LAMMPS_NS;
|
using namespace LAMMPS_NS;
|
||||||
|
|
||||||
// customize by adding keyword
|
// customize by adding keyword
|
||||||
|
@ -174,6 +177,7 @@ void ComputePropertyLocal::init()
|
||||||
else if (kindflag == IMPROPER) ncount = count_impropers(0);
|
else if (kindflag == IMPROPER) ncount = count_impropers(0);
|
||||||
|
|
||||||
if (ncount > nmax) reallocate(ncount);
|
if (ncount > nmax) reallocate(ncount);
|
||||||
|
size_local_rows = ncount;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
|
@ -190,6 +194,7 @@ void ComputePropertyLocal::compute_local()
|
||||||
else if (kindflag == IMPROPER) ncount = count_impropers(0);
|
else if (kindflag == IMPROPER) ncount = count_impropers(0);
|
||||||
|
|
||||||
if (ncount > nmax) reallocate(ncount);
|
if (ncount > nmax) reallocate(ncount);
|
||||||
|
size_local_rows = ncount;
|
||||||
|
|
||||||
if (kindflag == BOND) ncount = count_bonds(1);
|
if (kindflag == BOND) ncount = count_bonds(1);
|
||||||
else if (kindflag == ANGLE) ncount = count_angles(1);
|
else if (kindflag == ANGLE) ncount = count_angles(1);
|
||||||
|
@ -245,6 +250,7 @@ int ComputePropertyLocal::count_bonds(int flag)
|
||||||
m++;
|
m++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -285,6 +291,7 @@ int ComputePropertyLocal::count_angles(int flag)
|
||||||
m++;
|
m++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -328,6 +335,7 @@ int ComputePropertyLocal::count_dihedrals(int flag)
|
||||||
m++;
|
m++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -371,6 +379,7 @@ int ComputePropertyLocal::count_impropers(int flag)
|
||||||
m++;
|
m++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -380,8 +389,6 @@ void ComputePropertyLocal::reallocate(int n)
|
||||||
{
|
{
|
||||||
// grow vector or array and indices array
|
// grow vector or array and indices array
|
||||||
|
|
||||||
size_local_rows = n;
|
|
||||||
|
|
||||||
while (nmax < n) nmax += DELTA;
|
while (nmax < n) nmax += DELTA;
|
||||||
if (nvalues == 1) {
|
if (nvalues == 1) {
|
||||||
memory->sfree(vector);
|
memory->sfree(vector);
|
||||||
|
|
|
@ -65,8 +65,8 @@ DumpCustom::DumpCustom(LAMMPS *lmp, int narg, char **arg) :
|
||||||
|
|
||||||
// computes, fixes, variables which the dump accesses
|
// computes, fixes, variables which the dump accesses
|
||||||
|
|
||||||
field2index = (int *) memory->smalloc(nfield*sizeof(int),"dump:field2index");
|
field2index = new int[nfield];
|
||||||
argindex = (int *) memory->smalloc(nfield*sizeof(int),"dump:argindex");
|
argindex = new int[nfield];
|
||||||
|
|
||||||
ncompute = 0;
|
ncompute = 0;
|
||||||
id_compute = NULL;
|
id_compute = NULL;
|
||||||
|
@ -122,14 +122,13 @@ DumpCustom::~DumpCustom()
|
||||||
{
|
{
|
||||||
delete [] pack_choice;
|
delete [] pack_choice;
|
||||||
delete [] vtype;
|
delete [] vtype;
|
||||||
|
delete [] field2index;
|
||||||
|
delete [] argindex;
|
||||||
|
|
||||||
memory->sfree(thresh_array);
|
memory->sfree(thresh_array);
|
||||||
memory->sfree(thresh_op);
|
memory->sfree(thresh_op);
|
||||||
memory->sfree(thresh_value);
|
memory->sfree(thresh_value);
|
||||||
|
|
||||||
memory->sfree(field2index);
|
|
||||||
memory->sfree(argindex);
|
|
||||||
|
|
||||||
for (int i = 0; i < ncompute; i++) delete [] id_compute[i];
|
for (int i = 0; i < ncompute; i++) delete [] id_compute[i];
|
||||||
memory->sfree(id_compute);
|
memory->sfree(id_compute);
|
||||||
delete [] compute;
|
delete [] compute;
|
||||||
|
|
|
@ -0,0 +1,427 @@
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
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.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include "mpi.h"
|
||||||
|
#include "string.h"
|
||||||
|
#include "stdlib.h"
|
||||||
|
#include "dump_local.h"
|
||||||
|
#include "atom.h"
|
||||||
|
#include "modify.h"
|
||||||
|
#include "fix.h"
|
||||||
|
#include "compute.h"
|
||||||
|
#include "domain.h"
|
||||||
|
#include "update.h"
|
||||||
|
#include "memory.h"
|
||||||
|
#include "error.h"
|
||||||
|
|
||||||
|
|
||||||
|
#include "comm.h"
|
||||||
|
|
||||||
|
using namespace LAMMPS_NS;
|
||||||
|
|
||||||
|
enum{INDEX,COMPUTE,FIX};
|
||||||
|
enum{INT,DOUBLE};
|
||||||
|
|
||||||
|
#define INVOKED_LOCAL 16
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
DumpLocal::DumpLocal(LAMMPS *lmp, int narg, char **arg) :
|
||||||
|
Dump(lmp, narg, arg)
|
||||||
|
{
|
||||||
|
if (narg == 5) error->all("No dump local arguments specified");
|
||||||
|
|
||||||
|
nevery = atoi(arg[3]);
|
||||||
|
|
||||||
|
size_one = nfield = narg-5;
|
||||||
|
pack_choice = new FnPtrPack[nfield];
|
||||||
|
vtype = new int[nfield];
|
||||||
|
|
||||||
|
// computes & fixes which the dump accesses
|
||||||
|
|
||||||
|
field2index = new int[nfield];
|
||||||
|
argindex = new int[nfield];
|
||||||
|
|
||||||
|
ncompute = 0;
|
||||||
|
id_compute = NULL;
|
||||||
|
compute = NULL;
|
||||||
|
|
||||||
|
nfix = 0;
|
||||||
|
id_fix = NULL;
|
||||||
|
fix = NULL;
|
||||||
|
|
||||||
|
// process keywords
|
||||||
|
|
||||||
|
parse_fields(narg,arg);
|
||||||
|
|
||||||
|
// setup format strings
|
||||||
|
|
||||||
|
vformat = new char*[size_one];
|
||||||
|
|
||||||
|
format_default = new char[3*size_one+1];
|
||||||
|
format_default[0] = '\0';
|
||||||
|
|
||||||
|
for (int i = 0; i < size_one; i++) {
|
||||||
|
if (vtype[i] == INT) format_default = strcat(format_default,"%d ");
|
||||||
|
else format_default = strcat(format_default,"%g ");
|
||||||
|
vformat[i] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// setup column string
|
||||||
|
|
||||||
|
int n = 0;
|
||||||
|
for (int iarg = 5; iarg < narg; iarg++) n += strlen(arg[iarg]) + 2;
|
||||||
|
columns = new char[n];
|
||||||
|
columns[0] = '\0';
|
||||||
|
for (int iarg = 5; iarg < narg; iarg++) {
|
||||||
|
strcat(columns,arg[iarg]);
|
||||||
|
strcat(columns," ");
|
||||||
|
}
|
||||||
|
|
||||||
|
label = "BONDS";
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
DumpLocal::~DumpLocal()
|
||||||
|
{
|
||||||
|
delete [] pack_choice;
|
||||||
|
delete [] vtype;
|
||||||
|
delete [] field2index;
|
||||||
|
delete [] argindex;
|
||||||
|
|
||||||
|
for (int i = 0; i < ncompute; i++) delete [] id_compute[i];
|
||||||
|
memory->sfree(id_compute);
|
||||||
|
delete [] compute;
|
||||||
|
|
||||||
|
for (int i = 0; i < nfix; i++) delete [] id_fix[i];
|
||||||
|
memory->sfree(id_fix);
|
||||||
|
delete [] fix;
|
||||||
|
|
||||||
|
for (int i = 0; i < size_one; i++) delete [] vformat[i];
|
||||||
|
delete [] vformat;
|
||||||
|
|
||||||
|
delete [] columns;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void DumpLocal::init()
|
||||||
|
{
|
||||||
|
delete [] format;
|
||||||
|
char *str;
|
||||||
|
if (format_user) str = format_user;
|
||||||
|
else str = format_default;
|
||||||
|
|
||||||
|
int n = strlen(str) + 1;
|
||||||
|
format = new char[n];
|
||||||
|
strcpy(format,str);
|
||||||
|
|
||||||
|
// tokenize the format string and add space at end of each format element
|
||||||
|
|
||||||
|
char *ptr;
|
||||||
|
for (int i = 0; i < size_one; i++) {
|
||||||
|
if (i == 0) ptr = strtok(format," \0");
|
||||||
|
else ptr = strtok(NULL," \0");
|
||||||
|
delete [] vformat[i];
|
||||||
|
vformat[i] = new char[strlen(ptr) + 2];
|
||||||
|
strcpy(vformat[i],ptr);
|
||||||
|
vformat[i] = strcat(vformat[i]," ");
|
||||||
|
}
|
||||||
|
|
||||||
|
// find current ptr for each compute,fix,variable
|
||||||
|
// check that fix frequency is acceptable
|
||||||
|
|
||||||
|
int icompute;
|
||||||
|
for (int i = 0; i < ncompute; i++) {
|
||||||
|
icompute = modify->find_compute(id_compute[i]);
|
||||||
|
if (icompute < 0) error->all("Could not find dump custom compute ID");
|
||||||
|
compute[i] = modify->compute[icompute];
|
||||||
|
}
|
||||||
|
|
||||||
|
int ifix;
|
||||||
|
for (int i = 0; i < nfix; i++) {
|
||||||
|
ifix = modify->find_fix(id_fix[i]);
|
||||||
|
if (ifix < 0) error->all("Could not find dump custom fix ID");
|
||||||
|
fix[i] = modify->fix[ifix];
|
||||||
|
if (nevery % modify->fix[ifix]->peratom_freq)
|
||||||
|
error->all("Dump custom and fix not computed at compatible times");
|
||||||
|
}
|
||||||
|
|
||||||
|
// open single file, one time only
|
||||||
|
|
||||||
|
if (multifile == 0) openfile();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void DumpLocal::write_header(int ndump)
|
||||||
|
{
|
||||||
|
if (me == 0) {
|
||||||
|
fprintf(fp,"ITEM: TIMESTEP\n");
|
||||||
|
fprintf(fp,"%d\n",update->ntimestep);
|
||||||
|
fprintf(fp,"ITEM: NUMBER OF %s\n",label);
|
||||||
|
fprintf(fp,"%d\n",ndump);
|
||||||
|
fprintf(fp,"ITEM: %s\n",label);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int DumpLocal::count()
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
// invoke Computes for local quantities
|
||||||
|
|
||||||
|
if (ncompute) {
|
||||||
|
int ntimestep = update->ntimestep;
|
||||||
|
for (i = 0; i < ncompute; i++) {
|
||||||
|
if (!(compute[i]->invoked_flag & INVOKED_LOCAL)) {
|
||||||
|
compute[i]->compute_local();
|
||||||
|
compute[i]->invoked_flag |= INVOKED_LOCAL;
|
||||||
|
nmine = compute[i]->size_local_rows;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nmine;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int DumpLocal::pack()
|
||||||
|
{
|
||||||
|
for (int n = 0; n < size_one; n++) (this->*pack_choice[n])(n);
|
||||||
|
return nmine*size_one;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void DumpLocal::write_data(int n, double *buf)
|
||||||
|
{
|
||||||
|
int i,j;
|
||||||
|
|
||||||
|
int m = 0;
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
for (j = 0; j < size_one; j++) {
|
||||||
|
if (vtype[j] == INT) fprintf(fp,vformat[j],static_cast<int> (buf[m]));
|
||||||
|
else fprintf(fp,vformat[j],buf[m]);
|
||||||
|
m++;
|
||||||
|
}
|
||||||
|
fprintf(fp,"\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void DumpLocal::parse_fields(int narg, char **arg)
|
||||||
|
{
|
||||||
|
// customize by adding to if statement
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for (int iarg = 5; iarg < narg; iarg++) {
|
||||||
|
i = iarg-5;
|
||||||
|
|
||||||
|
if (strcmp(arg[iarg],"index") == 0) {
|
||||||
|
pack_choice[i] = &DumpLocal::pack_index;
|
||||||
|
vtype[i] = INT;
|
||||||
|
|
||||||
|
// compute value = c_ID
|
||||||
|
// if no trailing [], then arg is set to 0, else arg is int between []
|
||||||
|
|
||||||
|
} else if (strncmp(arg[iarg],"c_",2) == 0) {
|
||||||
|
pack_choice[i] = &DumpLocal::pack_compute;
|
||||||
|
vtype[i] = DOUBLE;
|
||||||
|
|
||||||
|
int n = strlen(arg[iarg]);
|
||||||
|
char *suffix = new char[n];
|
||||||
|
strcpy(suffix,&arg[iarg][2]);
|
||||||
|
|
||||||
|
char *ptr = strchr(suffix,'[');
|
||||||
|
if (ptr) {
|
||||||
|
if (suffix[strlen(suffix)-1] != ']')
|
||||||
|
error->all("Invalid keyword in dump local command");
|
||||||
|
argindex[i] = atoi(ptr+1);
|
||||||
|
*ptr = '\0';
|
||||||
|
} else argindex[i] = 0;
|
||||||
|
|
||||||
|
n = modify->find_compute(suffix);
|
||||||
|
if (n < 0) error->all("Could not find dump local compute ID");
|
||||||
|
if (modify->compute[n]->local_flag == 0)
|
||||||
|
error->all("Dump local compute does not compute local info");
|
||||||
|
if (argindex[i] == 0 && modify->compute[n]->size_local_cols > 0)
|
||||||
|
error->all("Dump local compute does not calculate local vector");
|
||||||
|
if (argindex[i] > 0 && modify->compute[n]->size_local_cols == 0)
|
||||||
|
error->all("Dump local compute does not calculate local array");
|
||||||
|
if (argindex[i] > 0 &&
|
||||||
|
argindex[i] > modify->compute[n]->size_local_cols)
|
||||||
|
error->all("Dump local compute vector is accessed out-of-range");
|
||||||
|
|
||||||
|
field2index[i] = add_compute(suffix);
|
||||||
|
delete [] suffix;
|
||||||
|
|
||||||
|
// fix value = f_ID
|
||||||
|
// if no trailing [], then arg is set to 0, else arg is between []
|
||||||
|
|
||||||
|
} else if (strncmp(arg[iarg],"f_",2) == 0) {
|
||||||
|
pack_choice[i] = &DumpLocal::pack_fix;
|
||||||
|
vtype[i] = DOUBLE;
|
||||||
|
|
||||||
|
int n = strlen(arg[iarg]);
|
||||||
|
char *suffix = new char[n];
|
||||||
|
strcpy(suffix,&arg[iarg][2]);
|
||||||
|
|
||||||
|
char *ptr = strchr(suffix,'[');
|
||||||
|
if (ptr) {
|
||||||
|
if (suffix[strlen(suffix)-1] != ']')
|
||||||
|
error->all("Invalid keyword in dump local command");
|
||||||
|
argindex[i] = atoi(ptr+1);
|
||||||
|
*ptr = '\0';
|
||||||
|
} else argindex[i] = 0;
|
||||||
|
|
||||||
|
n = modify->find_fix(suffix);
|
||||||
|
if (n < 0) error->all("Could not find dump local fix ID");
|
||||||
|
if (modify->fix[n]->local_flag == 0)
|
||||||
|
error->all("Dump local fix does not compute local info");
|
||||||
|
if (argindex[i] == 0 && modify->fix[n]->size_local_cols > 0)
|
||||||
|
error->all("Dump local fix does not compute local vector");
|
||||||
|
if (argindex[i] > 0 && modify->fix[n]->size_local_cols == 0)
|
||||||
|
error->all("Dump local fix does not compute local array");
|
||||||
|
if (argindex[i] > 0 &&
|
||||||
|
argindex[i] > modify->fix[n]->size_local_cols)
|
||||||
|
error->all("Dump local fix vector is accessed out-of-range");
|
||||||
|
|
||||||
|
field2index[i] = add_fix(suffix);
|
||||||
|
delete [] suffix;
|
||||||
|
|
||||||
|
} else error->all("Invalid keyword in dump local command");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
add Compute to list of Compute objects used by dump
|
||||||
|
return index of where this Compute is in list
|
||||||
|
if already in list, do not add, just return index, else add to list
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int DumpLocal::add_compute(char *id)
|
||||||
|
{
|
||||||
|
int icompute;
|
||||||
|
for (icompute = 0; icompute < ncompute; icompute++)
|
||||||
|
if (strcmp(id,id_compute[icompute]) == 0) break;
|
||||||
|
if (icompute < ncompute) return icompute;
|
||||||
|
|
||||||
|
id_compute = (char **)
|
||||||
|
memory->srealloc(id_compute,(ncompute+1)*sizeof(char *),"dump:id_compute");
|
||||||
|
delete [] compute;
|
||||||
|
compute = new Compute*[ncompute+1];
|
||||||
|
|
||||||
|
int n = strlen(id) + 1;
|
||||||
|
id_compute[ncompute] = new char[n];
|
||||||
|
strcpy(id_compute[ncompute],id);
|
||||||
|
ncompute++;
|
||||||
|
return ncompute-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
add Fix to list of Fix objects used by dump
|
||||||
|
return index of where this Fix is in list
|
||||||
|
if already in list, do not add, just return index, else add to list
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int DumpLocal::add_fix(char *id)
|
||||||
|
{
|
||||||
|
int ifix;
|
||||||
|
for (ifix = 0; ifix < nfix; ifix++)
|
||||||
|
if (strcmp(id,id_fix[ifix]) == 0) break;
|
||||||
|
if (ifix < nfix) return ifix;
|
||||||
|
|
||||||
|
id_fix = (char **)
|
||||||
|
memory->srealloc(id_fix,(nfix+1)*sizeof(char *),"dump:id_fix");
|
||||||
|
delete [] fix;
|
||||||
|
fix = new Fix*[nfix+1];
|
||||||
|
|
||||||
|
int n = strlen(id) + 1;
|
||||||
|
id_fix[nfix] = new char[n];
|
||||||
|
strcpy(id_fix[nfix],id);
|
||||||
|
nfix++;
|
||||||
|
return nfix-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
extraction of Compute, Fix results
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void DumpLocal::pack_compute(int n)
|
||||||
|
{
|
||||||
|
double *vector = compute[field2index[n]]->vector_local;
|
||||||
|
double **array = compute[field2index[n]]->array_local;
|
||||||
|
int ncount = compute[field2index[n]]->size_local_rows;
|
||||||
|
int index = argindex[n];
|
||||||
|
|
||||||
|
if (index == 0) {
|
||||||
|
for (int i = 0; i < ncount; i++) {
|
||||||
|
buf[n] = vector[i];
|
||||||
|
n += size_one;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
index--;
|
||||||
|
for (int i = 0; i < ncount; i++) {
|
||||||
|
buf[n] = array[i][index];
|
||||||
|
n += size_one;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void DumpLocal::pack_fix(int n)
|
||||||
|
{
|
||||||
|
double *vector = fix[field2index[n]]->vector_local;
|
||||||
|
double **array = fix[field2index[n]]->array_local;
|
||||||
|
int index = argindex[n];
|
||||||
|
|
||||||
|
if (index == 0) {
|
||||||
|
for (int i = 0; i < nmine; i++) {
|
||||||
|
buf[n] = vector[i];
|
||||||
|
n += size_one;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
index--;
|
||||||
|
for (int i = 0; i < nmine; i++) {
|
||||||
|
buf[n] = array[i][index];
|
||||||
|
n += size_one;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
one method for every keyword dump local can output
|
||||||
|
the local value is packed into buf starting at n with stride size_one
|
||||||
|
customize a new keyword by adding a method
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void DumpLocal::pack_index(int n)
|
||||||
|
{
|
||||||
|
int index;
|
||||||
|
MPI_Scan(&nmine,&index,1,MPI_INT,MPI_SUM,world);
|
||||||
|
index -= nmine;
|
||||||
|
|
||||||
|
for (int i = 0; i < nmine; i++) {
|
||||||
|
buf[n] = ++index;
|
||||||
|
n += size_one;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,74 @@
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
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.
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#ifndef DUMP_LOCAL_H
|
||||||
|
#define DUMP_LOCAL_H
|
||||||
|
|
||||||
|
#include "dump.h"
|
||||||
|
|
||||||
|
namespace LAMMPS_NS {
|
||||||
|
|
||||||
|
class DumpLocal : public Dump {
|
||||||
|
public:
|
||||||
|
DumpLocal(LAMMPS *, int, char **);
|
||||||
|
~DumpLocal();
|
||||||
|
void init();
|
||||||
|
|
||||||
|
private:
|
||||||
|
int nevery; // dump frequency to check Fix against
|
||||||
|
char *label; // string for dump file header
|
||||||
|
|
||||||
|
int nmine; // # of lines I am dumping
|
||||||
|
int *vtype; // type of each vector (INT, DOUBLE)
|
||||||
|
char **vformat; // format string for each vector element
|
||||||
|
|
||||||
|
char *columns; // column labels
|
||||||
|
|
||||||
|
int nfield; // # of keywords listed by user
|
||||||
|
|
||||||
|
int *field2index; // which compute,fix,variable calcs this field
|
||||||
|
int *argindex; // index into compute,fix scalar_atom,vector_atom
|
||||||
|
// 0 for scalar_atom, 1-N for vector_atom values
|
||||||
|
|
||||||
|
int ncompute; // # of Compute objects used by dump
|
||||||
|
char **id_compute; // their IDs
|
||||||
|
class Compute **compute; // list of ptrs to the Compute objects
|
||||||
|
|
||||||
|
int nfix; // # of Fix objects used by dump
|
||||||
|
char **id_fix; // their IDs
|
||||||
|
class Fix **fix; // list of ptrs to the Fix objects
|
||||||
|
|
||||||
|
// private methods
|
||||||
|
|
||||||
|
void write_header(int);
|
||||||
|
int count();
|
||||||
|
int pack();
|
||||||
|
void write_data(int, double *);
|
||||||
|
|
||||||
|
void parse_fields(int, char **);
|
||||||
|
int add_compute(char *);
|
||||||
|
int add_fix(char *);
|
||||||
|
|
||||||
|
// customize by adding a method prototype
|
||||||
|
|
||||||
|
typedef void (DumpLocal::*FnPtrPack)(int);
|
||||||
|
FnPtrPack *pack_choice; // ptrs to pack functions
|
||||||
|
|
||||||
|
void pack_index(int);
|
||||||
|
void pack_compute(int);
|
||||||
|
void pack_fix(int);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -133,12 +133,13 @@ void Output::setup(int flag)
|
||||||
// will not write on last step of run unless multiple of every
|
// will not write on last step of run unless multiple of every
|
||||||
// set next_dump_any to smallest next_dump
|
// set next_dump_any to smallest next_dump
|
||||||
// if no dumps, set next_dump_any to last+1 so will not influence next
|
// if no dumps, set next_dump_any to last+1 so will not influence next
|
||||||
// dump custom/cfg may invoke computes so wrap with clear/add
|
// wrap dumps that invoke computes with clear/add
|
||||||
|
|
||||||
if (ndump && update->restrict_output == 0) {
|
if (ndump && update->restrict_output == 0) {
|
||||||
for (int idump = 0; idump < ndump; idump++) {
|
for (int idump = 0; idump < ndump; idump++) {
|
||||||
if (strcmp(dump[idump]->style,"custom") == 0 ||
|
if (strcmp(dump[idump]->style,"custom") == 0 ||
|
||||||
strcmp(dump[idump]->style,"cfg") == 0)
|
strcmp(dump[idump]->style,"cfg") == 0 ||
|
||||||
|
strcmp(dump[idump]->style,"local") == 0)
|
||||||
modify->clearstep_compute();
|
modify->clearstep_compute();
|
||||||
if ((ntimestep % dump_every[idump] == 0 &&
|
if ((ntimestep % dump_every[idump] == 0 &&
|
||||||
last_dump[idump] != ntimestep) || last_dump[idump] < 0) {
|
last_dump[idump] != ntimestep) || last_dump[idump] < 0) {
|
||||||
|
@ -148,7 +149,8 @@ void Output::setup(int flag)
|
||||||
next_dump[idump] =
|
next_dump[idump] =
|
||||||
(ntimestep/dump_every[idump])*dump_every[idump] + dump_every[idump];
|
(ntimestep/dump_every[idump])*dump_every[idump] + dump_every[idump];
|
||||||
if (strcmp(dump[idump]->style,"custom") == 0 ||
|
if (strcmp(dump[idump]->style,"custom") == 0 ||
|
||||||
strcmp(dump[idump]->style,"cfg") == 0)
|
strcmp(dump[idump]->style,"cfg") == 0 ||
|
||||||
|
strcmp(dump[idump]->style,"local") == 0)
|
||||||
modify->addstep_compute(next_dump[idump]);
|
modify->addstep_compute(next_dump[idump]);
|
||||||
if (idump) next_dump_any = MYMIN(next_dump_any,next_dump[idump]);
|
if (idump) next_dump_any = MYMIN(next_dump_any,next_dump[idump]);
|
||||||
else next_dump_any = next_dump[0];
|
else next_dump_any = next_dump[0];
|
||||||
|
@ -201,19 +203,21 @@ void Output::setup(int flag)
|
||||||
void Output::write(int ntimestep)
|
void Output::write(int ntimestep)
|
||||||
{
|
{
|
||||||
// next_dump does not force output on last step of run
|
// next_dump does not force output on last step of run
|
||||||
// dump custom/cfg may invoke computes so wrap with clear/add
|
// wrap dumps that invoke computes with clear/add
|
||||||
|
|
||||||
if (next_dump_any == ntimestep) {
|
if (next_dump_any == ntimestep) {
|
||||||
for (int idump = 0; idump < ndump; idump++) {
|
for (int idump = 0; idump < ndump; idump++) {
|
||||||
if (next_dump[idump] == ntimestep && last_dump[idump] != ntimestep) {
|
if (next_dump[idump] == ntimestep && last_dump[idump] != ntimestep) {
|
||||||
if (strcmp(dump[idump]->style,"custom") == 0 ||
|
if (strcmp(dump[idump]->style,"custom") == 0 ||
|
||||||
strcmp(dump[idump]->style,"cfg") == 0)
|
strcmp(dump[idump]->style,"cfg") == 0 ||
|
||||||
|
strcmp(dump[idump]->style,"local") == 0)
|
||||||
modify->clearstep_compute();
|
modify->clearstep_compute();
|
||||||
dump[idump]->write();
|
dump[idump]->write();
|
||||||
last_dump[idump] = ntimestep;
|
last_dump[idump] = ntimestep;
|
||||||
next_dump[idump] += dump_every[idump];
|
next_dump[idump] += dump_every[idump];
|
||||||
if (strcmp(dump[idump]->style,"custom") == 0 ||
|
if (strcmp(dump[idump]->style,"custom") == 0 ||
|
||||||
strcmp(dump[idump]->style,"cfg") == 0)
|
strcmp(dump[idump]->style,"cfg") == 0 ||
|
||||||
|
strcmp(dump[idump]->style,"local") == 0)
|
||||||
modify->addstep_compute(next_dump[idump]);
|
modify->addstep_compute(next_dump[idump]);
|
||||||
}
|
}
|
||||||
if (idump) next_dump_any = MYMIN(next_dump_any,next_dump[idump]);
|
if (idump) next_dump_any = MYMIN(next_dump_any,next_dump[idump]);
|
||||||
|
|
|
@ -150,6 +150,7 @@ ComputeStyle(temp/sphere,ComputeTempSphere)
|
||||||
#include "dump_cfg.h"
|
#include "dump_cfg.h"
|
||||||
#include "dump_custom.h"
|
#include "dump_custom.h"
|
||||||
#include "dump_dcd.h"
|
#include "dump_dcd.h"
|
||||||
|
#include "dump_local.h"
|
||||||
#include "dump_xyz.h"
|
#include "dump_xyz.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -158,6 +159,7 @@ DumpStyle(atom,DumpAtom)
|
||||||
DumpStyle(cfg,DumpCFG)
|
DumpStyle(cfg,DumpCFG)
|
||||||
DumpStyle(custom,DumpCustom)
|
DumpStyle(custom,DumpCustom)
|
||||||
DumpStyle(dcd,DumpDCD)
|
DumpStyle(dcd,DumpDCD)
|
||||||
|
DumpStyle(local,DumpLocal)
|
||||||
DumpStyle(xyz,DumpXYZ)
|
DumpStyle(xyz,DumpXYZ)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -247,6 +247,7 @@ void Update::reset_timestep(int narg, char **arg)
|
||||||
modify->compute[i]->invoked_scalar = -1;
|
modify->compute[i]->invoked_scalar = -1;
|
||||||
modify->compute[i]->invoked_vector = -1;
|
modify->compute[i]->invoked_vector = -1;
|
||||||
modify->compute[i]->invoked_peratom = -1;
|
modify->compute[i]->invoked_peratom = -1;
|
||||||
|
modify->compute[i]->invoked_local = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < modify->ncompute; i++)
|
for (int i = 0; i < modify->ncompute; i++)
|
||||||
|
|
Loading…
Reference in New Issue