00001 //*****************************************************************************// 00002 // // 00003 // Copyright (c) 2001 // 00004 // INRIA // 00005 // 54600 VILLERS LES NANCY // 00006 // France // 00007 // // 00008 //*****************************************************************************// 00009 // // 00010 // *** NOTICE OF PROPRIETARY INFORMATION *** // 00011 // // 00012 // The information contained in this file is considered proprietary and the // 00013 // exclusive property of INRIA. This information may not be disclosed, // 00014 // duplicated or used, in whole or in part, for any purpose whatsoever // 00015 // without express written authorization from INRIA // 00016 // // 00017 //*****************************************************************************// 00018 00019 00020 #ifndef QC_LINEAR_PARTITIONER_H_ 00021 #define QC_LINEAR_PARTITIONER_H_ 00022 00023 #include <vector> 00024 00025 #include "QCCommon.hpp" 00026 #include "QCPoint.hpp" 00027 #include "QCAtoms.hpp" 00028 #include "QCPartitioner.hpp" 00029 00030 00031 00032 00033 00034 00039 template <class TPSystem> 00040 class QCLinearPartitioner : 00041 public QCPartitioner<TPSystem> 00042 { 00043 00045 public: 00046 00047 00048 00052 QCLinearPartitioner (void); 00053 00054 00055 00059 virtual ~QCLinearPartitioner (void); 00060 00061 00062 00066 QCPartSubDomain& getDomain (int i) { return domains[i]; } 00067 00068 00069 00070 00076 virtual void initData (const QCGeneralData& data, 00077 const QCFiles& files, 00078 const int * load, 00079 const int sizeLoad); 00080 00081 00082 00086 virtual void partitioning (TPSystem& mdsystem); 00087 00088 00089 00093 const std::vector<QCAtomIn>& getAtomsInZone (int i) const { return atomsInZone[i]; } 00094 00095 00096 00097 00098 00099 00101 protected: 00102 00103 00107 void setLoad (const QCSystem& system); 00108 00109 00110 00114 void setAtomZones (int nbAtoms); 00118 void extractDomains(TPSystem& system); 00122 void setToZero (void); 00126 void resetData (void); 00127 00128 00129 00133 void computeInnerReference (const QCSystem& system); 00134 00135 00136 00140 void projectOnInnerReference (QCSystem& system); 00141 00142 00143 00147 void setNeighbors (void); 00148 00149 00150 00154 void setXMinXMax (const QCSystem& root); 00155 00156 00157 00161 void setAtomsInKernel (const QCSystem& system); 00162 00163 00164 00168 void setAtomsInBuffers (const QCSystem& system); 00172 bool equilibrateAOs (QCFloat buffer1, QCFloat buffer2); 00176 void sortFirstAxis (QCSystem& system); 00180 void sortEigenVects (QCFloat *eigenVals, QCFloat ** eigenVects, int dim); 00181 00183 private: 00185 public: 00186 protected: 00190 static const int DIM = QCAtoms::DIMENSION; 00194 QCPoint3D gravityCenter; 00195 int partitionGrid[DIM]; 00196 QCPoint3D xAxis; 00197 QCPoint3D yAxis; 00198 QCPoint3D zAxis; 00199 QCFloat inertiaMatrix[DIM][DIM]; 00200 00201 QCPartSubDomain * domains; 00202 std::vector<QCAtomIn> * atomsInZone; 00203 00204 00205 private: 00206 00207 00208 00209 00210 00211 }; 00212 00213 00214 00215 00216 00217 00218 00219 00220 00221 #endif // QC_LINEAR_PARTITIONER_H_