00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef QC_PART_SUBDOMAIN_H_
00021 #define QC_PART_SUBDOMAIN_H_
00022
00023
00024
00025 #include <vector>
00026
00027 #include "QCAtoms.hpp"
00028
00033 class QCPartSubDomain
00034 {
00035
00037 public:
00041 QCPartSubDomain (void);
00045 ~QCPartSubDomain (void);
00049 int getId (void) const { return id; }
00053 int getNbAtoms (void) const { return nbAtoms; }
00057 int getNbNeighbors (void) const { return neighborsIdxs.size(); }
00061 int getNeighborIdx (int i) const { return neighborsIdxs[i]; }
00065 int getNeighborPos (int id) const {
00066 int pos = -1;
00067 for (unsigned int i = 0; i < neighborsIdxs.size(); ++i) {
00068 if (neighborsIdxs[i] == id) {
00069 pos = i;
00070 break;
00071 }
00072 }
00073 return pos;
00074 }
00075
00076
00077
00081 void getXMin (QCPoint3D& copy) const {
00082 copy[COORDX] = xMin[COORDX];
00083 copy[COORDY] = xMin[COORDY];
00084 copy[COORDZ] = xMin[COORDZ];
00085 }
00086
00087
00091 void getXMax (QCPoint3D& copy) const {
00092 copy[COORDX] = xMax[COORDX];
00093 copy[COORDY] = xMax[COORDY];
00094 copy[COORDZ] = xMax[COORDZ];
00095 }
00096
00097
00101 int getNbAtomsKernel (void) const { return atomsInKernel.size(); }
00102
00103
00107 int * getLocalNum (void) { return localNum; }
00108
00109
00113 vector<int>& getAtomsInKernel (void) { return atomsInKernel; }
00114
00115
00119 vector<int>& getAtomsInShell1 (int i) { return atomsInShell1[i]; }
00120 int getNbAtomsShell1 (int i) const { return atomsInShell1[i].size(); }
00121
00125 vector<int>& getAtomsInShell2 (int i) { return atomsInShell2[i]; }
00127 int getNbAtomsShell2 (int i) const { return atomsInShell2[i].size(); }
00128
00132 int getNbShared (int i) const { return (getNbAtomsShell1 (i) +
00133 getNbAtomsShell2 (i)); }
00134
00135
00139 vector<int>& getAtomIsInKernel (void) { return atomIsInKernel; }
00140
00141
00145 QCFloat getXLength (void) const { return xMax[0] - xMin[0] ;}
00146
00147
00148
00152 int getLoad (void) const
00153 { return weight[QC_CORE] + weight[QC_SHELL1] + weight[QC_SHELL2]; }
00154
00155
00156
00160 int getLocalNumberOfSubdomain (int num) {
00161 for (int i = 0 ; i < static_cast<int>(neighborsIdxs.size()); ++i) {
00162 if(neighborsIdxs[i] == num) {
00163 return i ;
00164 }
00165 }
00166 return -1;
00167 }
00168
00169
00173 void setIds (int anId, int idx, int idy=0, int idz=0) {
00174 id = anId;
00175 localNum[COORDX] = idx;
00176 localNum[COORDY] = idy;
00177 localNum[COORDZ] = idz;
00178 }
00179
00180
00184 void setXMin (const QCPoint3D& p) {
00185 xMin[COORDX] = p[COORDX];
00186 xMin[COORDY] = p[COORDY];
00187 xMin[COORDZ] = p[COORDZ];
00188 }
00189
00190
00194 void setXMax (const QCPoint3D& p) {
00195 xMax[COORDX] = p[COORDX];
00196 xMax[COORDY] = p[COORDY];
00197 xMax[COORDZ] = p[COORDZ];
00198 }
00199
00200
00204 void setLoadInKernel (int l) { weight[QC_CORE] = l;}
00205
00206
00210 void setLoadInShell1 (int l) { weight[QC_SHELL1] = l;}
00211
00212
00216 void setLoadInShell2 (int l) { weight[QC_SHELL2] = l;}
00217
00218
00222 void addIndexInKernel (int num) {
00223 atomsInKernel.push_back(num);
00224 ++nbAtomsCore;
00225 ++nbAtoms;
00226 }
00227
00228
00232 void addIndexInOverlap (int i, int num) {
00233 atomsInShell1[i].push_back(num);
00234 ++nbAtomsShell1;
00235 ++nbAtoms;
00236 }
00237
00238
00242 void addIndexInCut (int i, int num) {
00243 atomsInShell2[i].push_back(num);
00244 ++nbAtomsShell2;
00245 ++nbAtoms;
00246 }
00250 void computeNumbers (void);
00251
00252
00253
00257 void resetData (void);
00258
00259
00260
00264 void addNeighbor (int idx) { neighborsIdxs.push_back(idx); }
00265
00266
00267
00271 void addNeighbors (int * idxs, int nb) {
00272 int i, j;
00273 neighborsIdxs.resize(nb);
00274 for (i = 0, j = 0; j < nb; ++i) {
00275 if (idxs[i]) {
00276 neighborsIdxs[j] = i;
00277
00278
00279 ++j;
00280 }
00281 }
00282 }
00283
00284
00285
00286
00290 bool initNbOverlapDomain(void);
00291
00292
00293
00297 void addAtomsInKernel (const QCAtoms& atoms, bool useFrag);
00298
00299
00300
00304 void addAtomsInBuffers (const QCAtoms& atoms,
00305 QCPartSubDomain& domain,
00306 int localOverlapSubDomain,
00307 QCFloat buffer1,
00308 QCFloat buffer2,
00309 bool useFrag);
00310
00311
00315 vector<int>& getSharedAtomsVect (void) { return nbSharedAtoms; }
00316
00317 int getSharedAtoms (int i) const { return nbSharedAtoms[i]; }
00318
00319 int & getNbOverlp (void) { return nbOverlp; }
00323 void write (void) ;
00324
00325
00326
00328 protected:
00329
00330
00331
00333 private:
00334
00335
00336
00337
00340 public:
00341 protected:
00342 private:
00343
00347 static const int DIM = QCAtoms::DIMENSION;
00348 int id;
00349 int localNum[DIM];
00350 int nbAtoms;
00351 int nbAtomsCore;
00352 int nbAtomsShell1;
00353 int nbAtomsShell2;
00354 int weight[NB_ZONES];
00355 QCPoint3D xMin;
00356 QCPoint3D xMax;
00357 QCFloat boxDims[DIM];
00359 vector<int> neighborsIdxs;
00360 vector<int> atomsInKernel;
00361 vector<int> atomIsInKernel;
00362 vector<int> *atomsInShell1;
00363 vector<int> *atomsInShell2;
00364 vector<int> nbSharedAtoms;
00365 int nbOverlp;
00366
00367 };
00368
00369
00370 #endif // QC_PART_SUBDOMAIN_H_