00001
00007 #ifndef PME_K_SPACE_H__
00008 #define PME_K_SPACE_H__
00009
00010 #include "PmeBase.h"
00011 #include "Lattice.h"
00012
00013 #include "ComputeMoa.h"
00014 #include "ComputeMoaMgr.decl.h"
00015
00016 class PmeKSpace {
00017 #ifdef OPENATOM_VERSION
00018 friend class ComputeMoaMgr;
00019 #endif //OPENATOM_VERSION
00020
00021 public:
00022 PmeKSpace(PmeGrid grid, int K2_start, int K2_end, int K3_start, int K3_end);
00023 #ifdef OPENATOM_VERSION
00024 PmeKSpace(PmeGrid grid, int K2_start, int K2_end, int K3_start, int K3_end, CProxy_ComputeMoaMgr moaProxy);
00025 #endif //OPENATOM_VERSION
00026 ~PmeKSpace();
00027
00028 double compute_energy(float q_arr[], const Lattice &lattice, double ewald, double virial[]);
00029 double compute_energy_orthogonal_helper(float q_arr[], const Lattice &lattice, double ewald, double virial[]);
00030 void compute_energy_orthogonal_subset(float q_arr[], double *recips, double partialVirial[], double *partialEnergy, int k1from, int k1to);
00031
00032
00033 private:
00034
00035 double *bm1, *bm2, *bm3;
00036 double *exp1, *exp2, *exp3;
00037 double i_pi_volume, piob;
00038
00039 const PmeGrid myGrid;
00040 const int k2_start, k2_end, k3_start, k3_end;
00041
00042 void init_exp(double *xp, int K, int k_start, int k_end, double recip);
00043 };
00044
00045 #endif