#ifdef FIX_CLASS
FixStyle(srd,FixSRD)
#else
#ifndef LMP_FIX_SRD_H
#define LMP_FIX_SRD_H
#include "fix.h"
namespace LAMMPS_NS {
class FixSRD : public Fix {
public:
FixSRD(class LAMMPS *, int, char **);
~FixSRD();
int setmask();
void init();
void setup(int);
void pre_neighbor();
void post_force(int);
double compute_vector(int);
double memory_usage();
int pack_reverse_comm(int, int, double *);
void unpack_reverse_comm(int, int *, double *);
private:
int me,nprocs;
int bigexist,biggroup,biggroupbit;
int collidestyle,lamdaflag,overlap,insideflag,exactflag,maxbounceallow;
int cubicflag,shiftuser,shiftseed,shiftflag,tstat;
int rescale_rotate,rescale_collide;
double gridsrd,gridsearch,lamda,radfactor,cubictol;
int triclinic,change_size,change_shape,deformflag;
double dt_big,dt_srd;
double mass_big,mass_srd;
double temperature_srd;
double sigma;
double srd_per_cell;
double dmax,vmax,vmaxsq;
double maxbigdiam,minbigdiam;
double dist_ghost,dist_srd,dist_srd_reneigh;
int wallexist,nwall,wallvarflag;
class FixWallSRD *wallfix;
int *wallwhich;
double *xwall,*xwallhold,*vwall;
double **fwall;
double walltrigger;
class AtomVecEllipsoid *avec_ellipsoid;
class AtomVecLine *avec_line;
class AtomVecTri *avec_tri;
double srdlo[3],srdhi[3]; double srdlo_reneigh[3],srdhi_reneigh[3];
int dimension;
int initflag,setupflag,reneighflag;
class RanMars *random;
class RanPark *randomshift;
int ncheck,ncollide,ninside,nrescale,reneighcount;
int nbounce,bouncemaxnum,bouncemax;
int stats_flag;
int srd_bin_count;
double srd_bin_temp;
double stats[12],stats_all[12];
double **flocal; double **tlocal;
struct Big {
int index; int type; double radius,radsq; double aradsqinv; double bradsqinv;
double cradsqinv;
double length; double normbody[3]; double cutbinsq; double omega[3]; double ex[3],ey[3],ez[3]; double norm[3]; double theta; };
Big *biglist; int torqueflag;
int nbig; int maxbig; int nmax;
int nbins1,nbin1x,nbin1y,nbin1z;
double binsize1x,binsize1y,binsize1z;
double bininv1x,bininv1y,bininv1z;
struct BinAve {
int owner; int n; double xctr[3]; double vsum[3]; double random; double value[12]; };
struct BinComm {
int nsend,nrecv; int sendproc,recvproc; int *sendlist,*recvlist; };
struct BinShift {
int commflag; int nbins,nbinx,nbiny,nbinz; int maxbinsq,maxvbin;
int binlo[3],binhi[3]; double corner[3]; BinAve *vbin; BinComm bcomm[6]; };
BinShift shifts[2];
int maxbin1;
int *binhead; int *binnext; int maxbuf;
double *sbuf1,*sbuf2; double *rbuf1,*rbuf2;
int nbins2,nbin2x,nbin2y,nbin2z;
int maxbin2;
double binsize2x,binsize2y,binsize2z;
double bininv2x,bininv2y,bininv2z;
double xblo2,yblo2,zblo2;
int *nbinbig; int **binbig; int *binsrd; int nstencil; int maxstencil; int **stencil;
double tfraction,theta0,theta1;
double xs0[3],xs1[3],xsc[3];
double xb0[3],xb1[3],xbc[3];
double nbc[3];
void reset_velocities();
void vbin_comm(int);
void vbin_pack(BinAve *, int, int *, double *);
void vbin_unpack(double *, BinAve *, int, int *);
void xbin_comm(int, int);
void xbin_pack(BinAve *, int, int *, double *, int);
void xbin_unpack(double *, BinAve *, int, int *, int);
void collisions_single();
void collisions_multi();
int inside_sphere(double *, double *, Big *);
int inside_ellipsoid(double *, double *, Big *);
int inside_line(double *, double *, double *, double *, Big *, double);
int inside_tri(double *, double *, double *, double *, Big *, double);
int inside_wall(double *, int);
double collision_sphere_exact(double *, double *, double *, double *,
Big *, double *, double *, double *);
void collision_sphere_inexact(double *, double *,
Big *, double *, double *, double *);
double collision_ellipsoid_exact(double *, double *, double *, double *,
Big *, double *, double *, double *);
void collision_ellipsoid_inexact(double *, double *,
Big *, double *, double *, double *);
double collision_line_exact(double *, double *, double *, double *,
Big *, double, double *, double *, double *);
double collision_tri_exact(double *, double *, double *, double *,
Big *, double, double *, double *, double *);
double collision_wall_exact(double *, int, double *,
double *, double *, double *);
void collision_wall_inexact(double *, int, double *, double *, double *);
void slip(double *, double *, double *, Big *,
double *, double *, double *);
void slip_wall(double *, int, double *, double *);
void noslip(double *, double *, double *, Big *, int,
double *, double *, double *);
void force_torque(double *, double *, double *,
double *, double *, double *);
void force_wall(double *, double *, int);
int update_srd(int, double, double *, double *, double *, double *);
void parameterize();
void setup_bounds();
void setup_velocity_bins();
void setup_velocity_shift(int, int);
void setup_search_bins();
void setup_search_stencil();
void big_static();
void big_dynamic();
double point_bin_distance(double *, int, int, int);
double bin_bin_distance(int, int, int);
void velocity_stats(int);
double newton_raphson(double, double);
void lineside(double, double &, double &);
void triside(double, double &, double &);
double distance(int, int);
void print_collision(int, int, int, double, double,
double *, double *, double *, int);
};
}
#endif
#endif