forked from lijiext/lammps
101 lines
3.6 KiB
C++
101 lines
3.6 KiB
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_IRREGULAR_H
|
|
#define LMP_IRREGULAR_H
|
|
|
|
#include "pointers.h"
|
|
|
|
namespace LAMMPS_NS {
|
|
|
|
class Irregular : protected Pointers {
|
|
public:
|
|
Irregular(class LAMMPS *);
|
|
~Irregular();
|
|
void migrate_atoms();
|
|
int migrate_check();
|
|
int create_data(int, int *);
|
|
void exchange_data(char *, int, char *);
|
|
void destroy_data();
|
|
bigint memory_usage();
|
|
|
|
private:
|
|
int me,nprocs;
|
|
int triclinic;
|
|
int map_style;
|
|
int uniform;
|
|
double *xsplit,*ysplit,*zsplit; // ptrs to comm
|
|
int *procgrid; // ptr to comm
|
|
int ***grid2proc; // ptr to comm
|
|
double *boxlo; // ptr to domain
|
|
double *prd; // ptr to domain
|
|
|
|
int maxsend,maxrecv; // size of buffers in # of doubles
|
|
double *buf_send,*buf_recv;
|
|
|
|
// plan for irregular communication of atoms
|
|
// no params refer to atoms copied to self
|
|
|
|
struct PlanAtom {
|
|
int nsend; // # of messages to send
|
|
int nrecv; // # of messages to recv
|
|
int sendmax; // # of doubles in largest send message
|
|
int *proc_send; // procs to send to
|
|
int *length_send; // # of doubles to send to each proc
|
|
int *num_send; // # of atoms to send to each proc
|
|
int *index_send; // list of which atoms to send to each proc
|
|
int *offset_send; // where each atom starts in send buffer
|
|
int *proc_recv; // procs to recv from
|
|
int *length_recv; // # of doubles to recv from each proc
|
|
MPI_Request *request; // MPI requests for posted recvs
|
|
MPI_Status *status; // MPI statuses for WaitAll
|
|
};
|
|
|
|
// plan for irregular communication of datums
|
|
// only 2 self params refer to atoms copied to self
|
|
|
|
struct PlanData { // plan for irregular communication of data
|
|
int nsend; // # of messages to send
|
|
int nrecv; // # of messages to recv
|
|
int sendmax; // # of datums in largest send message
|
|
int *proc_send; // procs to send to
|
|
int *num_send; // # of datums to send to each proc
|
|
int *index_send; // list of which datums to send to each proc
|
|
int *proc_recv; // procs to recv from
|
|
int *num_recv; // # of datums to recv from each proc
|
|
int num_self; // # of datums to copy to self
|
|
int *index_self; // list of which datums to copy to self
|
|
MPI_Request *request; // MPI requests for posted recvs
|
|
MPI_Status *status; // MPI statuses for WaitAll
|
|
};
|
|
|
|
PlanAtom *aplan;
|
|
PlanData *dplan;
|
|
|
|
int create_atom(int, int *, int *);
|
|
void exchange_atom(double *, int *, double *);
|
|
void destroy_atom();
|
|
int coord2proc(double *, int &, int &, int &);
|
|
int binary(double, int, double *);
|
|
|
|
void grow_send(int,int); // reallocate send buffer
|
|
void grow_recv(int); // free/allocate recv buffer
|
|
};
|
|
|
|
}
|
|
|
|
#endif
|
|
/* ERROR/WARNING messages:
|
|
|
|
*/
|