223 lines
8.3 KiB
C++
223 lines
8.3 KiB
C++
/* -*- c++ -*- ----------------------------------------------------------
|
|
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 LMP_COMM_H
|
|
#define LMP_COMM_H
|
|
|
|
#include "pointers.h"
|
|
|
|
namespace LAMMPS_NS {
|
|
|
|
class Comm : protected Pointers {
|
|
public:
|
|
int style; // comm pattern: 0 = 6-way stencil, 1 = irregular tiling
|
|
int layout; // LAYOUT_UNIFORM = equal-sized bricks
|
|
// LAYOUT_NONUNIFORM = logical bricks, but diff sizes via LB
|
|
// LAYOUT_TILED = general tiling, due to RCB LB
|
|
int mode; // 0 = single cutoff, 1 = multi-type cutoff
|
|
|
|
int me,nprocs; // proc info
|
|
int ghost_velocity; // 1 if ghost atoms have velocity, 0 if not
|
|
double cutghost[3]; // cutoffs used for acquiring ghost atoms
|
|
double cutghostuser; // user-specified ghost cutoff (mode == 0)
|
|
double *cutusermulti; // per type user ghost cutoff (mode == 1)
|
|
int recv_from_partition; // recv proc layout from this partition
|
|
int send_to_partition; // send my proc layout to this partition
|
|
// -1 if no recv or send
|
|
int other_partition_style; // 0 = recv layout dims must be multiple of
|
|
// my layout dims
|
|
int maxexchange_atom; // max contribution to exchange from AtomVec
|
|
int maxexchange_fix; // max contribution to exchange from Fixes
|
|
int nthreads; // OpenMP threads per MPI process
|
|
|
|
// public settings specific to layout = UNIFORM, NONUNIFORM
|
|
|
|
int procgrid[3]; // procs assigned in each dim of 3d grid
|
|
int user_procgrid[3]; // user request for procs in each dim
|
|
int myloc[3]; // which proc I am in each dim
|
|
int procneigh[3][2]; // my 6 neighboring procs, 0/1 = left/right
|
|
double *xsplit,*ysplit,*zsplit; // fractional (0-1) sub-domain sizes
|
|
int ***grid2proc; // which proc owns i,j,k loc in 3d grid
|
|
|
|
// public settings specific to layout = TILED
|
|
|
|
int rcbnew; // 1 if just reset by rebalance, else 0
|
|
double mysplit[3][2]; // fractional (0-1) bounds of my sub-domain
|
|
double rcbcutfrac; // fractional RCB cut by this proc
|
|
int rcbcutdim; // dimension of RCB cut
|
|
|
|
// methods
|
|
|
|
Comm(class LAMMPS *);
|
|
virtual ~Comm();
|
|
// NOTE: copy_arrays is called from a constructor and must not be made virtual
|
|
void copy_arrays(class Comm *);
|
|
virtual void init();
|
|
void modify_params(int, char **);
|
|
|
|
void set_processors(int, char **); // set 3d processor grid attributes
|
|
virtual void set_proc_grid(int outflag = 1); // setup 3d grid of procs
|
|
|
|
virtual void setup() = 0; // setup 3d comm pattern
|
|
virtual void forward_comm(int dummy = 0) = 0; // forward comm of atom coords
|
|
virtual void reverse_comm() = 0; // reverse comm of forces
|
|
virtual void exchange() = 0; // move atoms to new procs
|
|
virtual void borders() = 0; // setup list of atoms to comm
|
|
|
|
// forward/reverse comm from a Pair, Fix, Compute, Dump
|
|
|
|
virtual void forward_comm_pair(class Pair *) = 0;
|
|
virtual void reverse_comm_pair(class Pair *) = 0;
|
|
virtual void forward_comm_fix(class Fix *, int size=0) = 0;
|
|
virtual void reverse_comm_fix(class Fix *, int size=0) = 0;
|
|
virtual void forward_comm_compute(class Compute *) = 0;
|
|
virtual void reverse_comm_compute(class Compute *) = 0;
|
|
virtual void forward_comm_dump(class Dump *) = 0;
|
|
virtual void reverse_comm_dump(class Dump *) = 0;
|
|
|
|
// forward comm of an array
|
|
// exchange of info on neigh stencil
|
|
// set processor mapping options
|
|
|
|
virtual void forward_comm_array(int, double **) = 0;
|
|
virtual int exchange_variable(int, double *, double *&) = 0;
|
|
int binary(double, int, double *);
|
|
|
|
// map a point to a processor, based on current decomposition
|
|
|
|
virtual void coord2proc_setup() {}
|
|
virtual int coord2proc(double *, int &, int &, int &);
|
|
|
|
// memory usage
|
|
|
|
virtual bigint memory_usage() = 0;
|
|
|
|
// non-virtual functions common to all Comm styles
|
|
|
|
void ring(int, int, void *, int, void (*)(int, char *),
|
|
void *, int self = 1);
|
|
int read_lines_from_file(FILE *, int, int, char *);
|
|
int read_lines_from_file_universe(FILE *, int, int, char *);
|
|
|
|
protected:
|
|
int bordergroup; // only communicate this group in borders
|
|
|
|
int triclinic; // 0 if domain is orthog, 1 if triclinic
|
|
int map_style; // non-0 if global->local mapping is done
|
|
int comm_x_only,comm_f_only; // 1 if only exchange x,f in for/rev comm
|
|
|
|
int size_forward; // # of per-atom datums in forward comm
|
|
int size_reverse; // # of datums in reverse comm
|
|
int size_border; // # of datums in forward border comm
|
|
|
|
int maxforward,maxreverse; // max # of datums in forward/reverse comm
|
|
int maxexchange; // max # of datums/atom in exchange comm
|
|
|
|
int gridflag; // option for creating 3d grid
|
|
int mapflag; // option for mapping procs to 3d grid
|
|
char xyz[4]; // xyz mapping of procs to 3d grid
|
|
char *customfile; // file with custom proc map
|
|
char *outfile; // proc grid/map output file
|
|
|
|
int otherflag; // 1 if this partition dependent on another
|
|
int other_style; // style of dependency
|
|
int other_procgrid[3]; // proc layout of another partition
|
|
int other_coregrid[3]; // core layout of another partition
|
|
int ncores; // # of cores per node
|
|
int coregrid[3]; // 3d grid of cores within a node
|
|
int user_coregrid[3]; // user request for cores in each dim
|
|
};
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
/* ERROR/WARNING messages:
|
|
|
|
W: OMP_NUM_THREADS environment is not set.
|
|
|
|
This environment variable must be set appropriately to use the
|
|
USER-OMP package.
|
|
|
|
E: Illegal ... command
|
|
|
|
Self-explanatory. Check the input script syntax and compare to the
|
|
documentation for the command. You can use -echo screen as a
|
|
command-line option when running LAMMPS to see the offending line.
|
|
|
|
E: Invalid group in comm_modify command
|
|
|
|
Self-explanatory.
|
|
|
|
E: Comm_modify group != atom_modify first group
|
|
|
|
Self-explanatory.
|
|
|
|
E: Use cutoff/multi keyword to set cutoff in multi mode
|
|
|
|
Mode is multi so cutoff keyword cannot be used.
|
|
|
|
E: Invalid cutoff in comm_modify command
|
|
|
|
Specified cutoff must be >= 0.0.
|
|
|
|
E: Use cutoff keyword to set cutoff in single mode
|
|
|
|
Mode is single so cutoff/multi keyword cannot be used.
|
|
|
|
E: Cannot set cutoff/multi before simulation box is defined
|
|
|
|
Self-explanatory.
|
|
|
|
E: Specified processors != physical processors
|
|
|
|
The 3d grid of processors defined by the processors command does not
|
|
match the number of processors LAMMPS is being run on.
|
|
|
|
E: Cannot use processors part command without using partitions
|
|
|
|
See the command-line -partition switch.
|
|
|
|
E: Invalid partitions in processors part command
|
|
|
|
Valid partitions are numbered 1 to N and the sender and receiver
|
|
cannot be the same partition.
|
|
|
|
E: Sending partition in processors part command is already a sender
|
|
|
|
Cannot specify a partition to be a sender twice.
|
|
|
|
E: Receiving partition in processors part command is already a receiver
|
|
|
|
Cannot specify a partition to be a receiver twice.
|
|
|
|
E: Processors grid numa and map style are incompatible
|
|
|
|
Using numa for gstyle in the processors command requires using
|
|
cart for the map option.
|
|
|
|
E: Processors part option and grid style are incompatible
|
|
|
|
Cannot use gstyle numa or custom with the part option.
|
|
|
|
E: Bad grid of processors
|
|
|
|
The 3d grid of processors defined by the processors command does not
|
|
match the number of processors LAMMPS is being run on.
|
|
|
|
E: Processor count in z must be 1 for 2d simulation
|
|
|
|
Self-explanatory.
|
|
|
|
*/
|