Files
lammps-gran-kokkos/src/comm_tiled.h
Stan Gerald Moore 3272e84d31 whitespace
2024-04-29 11:00:45 -06:00

165 lines
7.3 KiB
C++

/* -*- c++ -*- ----------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
https://www.lammps.org/, Sandia National Laboratories
LAMMPS development team: developers@lammps.org
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_TILED_H
#define LMP_COMM_TILED_H
#include "comm.h"
namespace LAMMPS_NS {
class CommTiled : public Comm {
public:
CommTiled(class LAMMPS *);
CommTiled(class LAMMPS *, class Comm *);
~CommTiled() override;
void init() override;
void setup() override; // setup comm pattern
void forward_comm(int dummy = 0) override; // forward comm of atom coords
void reverse_comm() override; // reverse comm of forces
void exchange() override; // move atoms to new procs
void borders() override; // setup list of atoms to comm
void forward_comm(class Pair *) override; // forward comm from a Pair
void reverse_comm(class Pair *) override; // reverse comm from a Pair
void forward_comm(class Bond *) override; // forward comm from a Bond
void reverse_comm(class Bond *) override; // reverse comm from a Bond
void forward_comm(class Fix *, int size = 0) override; // forward comm from a Fix
void reverse_comm(class Fix *, int size = 0) override; // reverse comm from a Fix
void reverse_comm_variable(class Fix *) override; // variable size reverse comm from a Fix
void forward_comm(class Compute *) override; // forward from a Compute
void reverse_comm(class Compute *) override; // reverse from a Compute
void forward_comm(class Dump *) override; // forward comm from a Dump
void reverse_comm(class Dump *) override; // reverse comm from a Dump
void forward_comm_array(int, double **) override; // forward comm of array
void coord2proc_setup() override;
int coord2proc(double *, int &, int &, int &) override;
double memory_usage() override;
protected:
int nswap; // # of swaps to perform = 2*dim
int maxswap; // largest nswap can be = 6
// forward/reverse comm info, proc lists include self
int *nsendproc, *nrecvproc; // # of procs to send/recv to/from per swap
int *sendother, *recvother; // 1 if send/recv to/from other proc per swap
int *sendself; // 1 if send to self per swap
int *nprocmax; // current max # of send procs per swap
int **sendproc, **recvproc; // procs to send/recv to/from per swap
int **sendnum, **recvnum; // # of atoms to send/recv per swap/proc
int **size_forward_recv; // # of values to recv in each forward swap/proc
int **firstrecv; // where to put 1st recv atom per swap/proc
int **size_reverse_send; // # of values to send in each reverse swap/proc
int **size_reverse_recv; // # of values to recv in each reverse swap/proc
int **forward_recv_offset; // forward comm offsets in buf_recv per swap/proc
int **reverse_recv_offset; // reverse comm offsets in buf_recv per swap/proc
int ***sendlist; // list of atoms to send per swap/proc
int **maxsendlist; // max size of send list per swap/proc
int **pbc_flag; // general flag for sending atoms thru PBC
int ***pbc; // dimension flags for PBC adjustments
double ***sendbox; // bounding box of atoms to send per swap/proc
double **cutghostmulti; // cutghost on a per-collection basis
double **cutghostmultiold; // cutghost on a per-type basis
double ****sendbox_multi; // bounding box of atoms to send
// per swap/proc for multi comm
double ****sendbox_multiold; // bounding box of atoms to send
// per swap/proc for multi/old comm
// exchange comm info, proc lists do not include self
int *nexchproc; // # of procs to send/recv to/from in each dim
int *nexchprocmax; // current max # of exch procs for each dim
int **exchproc; // procs to exchange with per dim
int **exchnum; // # of values received per dim/proc
double *buf_send; // send buffer for all comm
double *buf_recv; // recv buffer for all comm
int maxsend, maxrecv; // current size of send/recv buffer
int smaxone, rmaxone; // max size in atoms of single borders send/recv
int smaxall, rmaxall; // max size in atoms of any borders send/recv
// for comm to all procs in one swap
int maxrequest; // max size of Request vector
MPI_Request *requests;
struct RCBinfo {
double mysplit[3][2]; // fractional RCB bounding box for one proc
double cutfrac; // fractional position of cut this proc owns
int dim; // dimension = 0/1/2 of cut
};
RCBinfo *rcbinfo; // list of RCB info for all procs
int noverlap; // # of overlapping procs
int maxoverlap; // current max length of overlap
int *overlap; // list of overlapping procs
double *prd; // local ptrs to Domain attributes
double *boxlo, *boxhi;
double *sublo, *subhi;
int dimension;
// NOTE: init_pointers and init_buffers are called from a constructor
// and must not be made virtual
void init_pointers();
void init_buffers();
int init_buffers_flag;
// box drop and other functions
typedef void (CommTiled::*BoxDropPtr)(int, double *, double *, int &);
BoxDropPtr box_drop;
void box_drop_brick(int, double *, double *, int &);
void box_drop_tiled(int, double *, double *, int &);
void box_drop_tiled_recurse(double *, double *, int, int, int &);
typedef void (CommTiled::*BoxOtherPtr)(int, int, int, double *, double *);
BoxOtherPtr box_other;
void box_other_brick(int, int, int, double *, double *);
void box_other_tiled(int, int, int, double *, double *);
typedef int (CommTiled::*BoxTouchPtr)(int, int, int);
BoxTouchPtr box_touch;
int box_touch_brick(int, int, int);
int box_touch_tiled(int, int, int);
typedef int (CommTiled::*PointDropPtr)(int, double *);
PointDropPtr point_drop;
int point_drop_brick(int, double *);
int point_drop_tiled(int, double *);
int point_drop_tiled_recurse(double *, int, int);
int closer_subbox_edge(int, double *);
virtual void grow_send(int, int); // reallocate send buffer
virtual void grow_recv(int, int flag = 0); // free/allocate recv buffer
virtual void grow_list(int, int, int); // reallocate sendlist for one swap/proc
void allocate_swap(int); // allocate swap arrays
virtual void grow_swap_send(int, int, int); // grow swap arrays for send and recv
void grow_swap_send_multi(int, int); // grow multi swap arrays for send and recv
void grow_swap_recv(int, int);
void deallocate_swap(int); // deallocate swap arrays
};
} // namespace LAMMPS_NS
#endif