#ifndef LMP_THR_OMP_H
#define LMP_THR_OMP_H
#if defined(_OPENMP)
#include <omp.h>
#endif
#include "pointers.h"
#include "error.h"
#include "fix_omp.h"
#include "thr_data.h"
namespace LAMMPS_NS {
class Pair;
class Bond;
class Angle;
class Dihedral;
class Improper;
class ThrOMP {
protected:
LAMMPS *lmp; FixOMP *fix;
const int thr_style;
int thr_error;
public:
ThrOMP(LAMMPS *, int);
virtual ~ThrOMP();
double memory_usage_thr();
inline void sync_threads() {
#if defined(_OPENMP)
#pragma omp barrier
#endif
{ ; }
};
enum {THR_NONE=0,THR_PAIR=1,THR_BOND=1<<1,THR_ANGLE=1<<2,
THR_DIHEDRAL=1<<3,THR_IMPROPER=1<<4,THR_KSPACE=1<<5,
THR_CHARMM=1<<6,
THR_FIX=1<<9,THR_INTGR=1<<10};
protected:
void ev_setup_thr(int, int, int, double *, double **, ThrData *);
void virial_fdotr_compute_thr(double * const, const double * const * const,
const double * const * const,
const int, const int, const int);
void reduce_thr(void * const style, const int eflag, const int vflag,
ThrData * const thr);
bool check_error_thr(const bool cond, const int tid, const char *fname,
const int line, const char *errmsg) {
if (cond) {
#if defined(_OPENMP)
#pragma omp atomic
++thr_error;
#endif
if (tid > 0) return true;
else lmp->error->one(fname,line,errmsg);
} else {
if (thr_error > 0) {
if (tid == 0) lmp->error->one(fname,line,errmsg);
else return true;
} else return false;
}
return false;
};
protected:
void e_tally_thr(Pair * const, const int, const int, const int,
const int, const double, const double, ThrData * const);
void v_tally_thr(Pair * const, const int, const int, const int,
const int, const double * const, ThrData * const);
void ev_tally_thr(Pair * const, const int, const int, const int, const int,
const double, const double, const double, const double,
const double, const double, ThrData * const);
void ev_tally_xyz_thr(Pair * const, const int, const int, const int,
const int, const double, const double, const double,
const double, const double, const double,
const double, const double, ThrData * const);
void ev_tally_xyz_full_thr(Pair * const, const int, const double, const double,
const double, const double, const double,
const double, const double, const double, ThrData * const);
void ev_tally3_thr(Pair * const, const int, const int, const int, const double,
const double, const double * const, const double * const,
const double * const, const double * const, ThrData * const);
void ev_tally4_thr(Pair * const, const int, const int, const int, const int,
const double, const double * const, const double * const,
const double * const, const double * const, const double * const,
const double * const, ThrData * const);
void ev_tally_thr(Bond * const, const int, const int, const int, const int,
const double, const double, const double, const double,
const double, ThrData * const);
void ev_tally_thr(Angle * const, const int, const int, const int, const int, const int,
const double, const double * const, const double * const,
const double, const double, const double, const double, const double,
const double, ThrData * const thr);
void ev_tally13_thr(Angle * const, const int, const int, const int, const int,
const double, const double, const double, const double,
const double, ThrData * const thr);
void ev_tally_thr(Dihedral * const, const int, const int, const int, const int, const int,
const int, const double, const double * const, const double * const,
const double * const, const double, const double, const double,
const double, const double, const double, const double, const double,
const double, ThrData * const);
void ev_tally_thr(Improper * const, const int, const int, const int, const int, const int,
const int, const double, const double * const, const double * const,
const double * const, const double, const double, const double,
const double, const double, const double, const double, const double,
const double, ThrData * const);
void v_tally2_thr(const int, const int, const double, const double * const, ThrData * const);
void v_tally3_thr(const int, const int, const int, const double * const, const double * const,
const double * const, const double * const, ThrData * const);
void v_tally4_thr(const int, const int, const int, const int, const double * const,
const double * const, const double * const, const double * const,
const double * const, const double * const, ThrData * const);
void ev_tally_list_thr(Pair * const, const int, const int * const,
const double * const, const double, const double,
ThrData * const);
};
static inline void loop_setup_thr(int &ifrom, int &ito, int &tid,
int inum, int nthreads)
{
#if defined(_OPENMP)
tid = omp_get_thread_num();
const int idelta = 1 + inum/nthreads;
ifrom = tid*idelta;
ito = ((ifrom + idelta) > inum) ? inum : ifrom + idelta;
#else
tid = 0;
ifrom = 0;
ito = inum;
nthreads = 1;
#endif
}
typedef struct { double x,y,z; } dbl3_t;
typedef struct { double x,y,z,w; } dbl4_t;
typedef struct { int a,b,t; } int3_t;
typedef struct { int a,b,c,t; } int4_t;
typedef struct { int a,b,c,d,t; } int5_t;
}
#endif