00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00038 #ifndef MM_LIMIT_TABLE_HEADER
00039 #define MM_LIMIT_TABLE_HEADER
00040
00041 #include "realtype.h"
00042 #include "multipole_prep.h"
00043
00044
00045 class MMLimitTable {
00046 typedef struct {
00047 ergo_real x[MAX_MULTIPOLE_DEGREE+1][MAX_MULTIPOLE_DEGREE_BASIC+1];
00048 } interaction_matrix_limit_struct;
00049 static const int NO_OF_STEPS_PER_RANGE = 5;
00050 static const int NO_OF_RANGES = 40;
00051 typedef struct {
00052 ergo_real startDistance;
00053 ergo_real maxDistance;
00054 ergo_real step;
00055 interaction_matrix_limit_struct list[NO_OF_STEPS_PER_RANGE];
00056 } interaction_matrix_limit_range_struct;
00057 const interaction_matrix_limit_struct & get_x_from_distance(ergo_real distance) const;
00058 public:
00059 MMLimitTable();
00060 ~MMLimitTable();
00061 void inittt(const MultipolePrepManager & multipolePrep);
00062 ergo_real get_max_abs_mm_contrib(int degree1,
00063 const ergo_real* maxMomentVectorNormList1,
00064 int degree2,
00065 const ergo_real* maxMomentVectorNormList2,
00066 ergo_real distance) const;
00067 int get_minimum_multipole_degree_needed(ergo_real distance,
00068 const multipole_struct_large* boxMultipole,
00069 int maxDegreeForDistrs,
00070 const ergo_real* maxMomentVectorNormForDistrsList,
00071 ergo_real threshold) const;
00072 int noOfRangesUsed;
00073 interaction_matrix_limit_range_struct rangeList[NO_OF_RANGES];
00074
00075 void write_to_buffer ( char * dataBuffer, size_t const bufferSize ) const;
00076 size_t get_size() const;
00077 void assign_from_buffer ( char const * dataBuffer, size_t const bufferSize);
00078 };
00079
00080
00081 #endif