Changes in src/parser.cpp [6ac7ee:ce5ac3]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified src/parser.cpp ¶
r6ac7ee rce5ac3 2 2 * 3 3 * Declarations of various class functions for the parsing of value files. 4 * 4 * 5 5 */ 6 6 7 7 // ======================================= INCLUDES ========================================== 8 8 9 #include "helpers.hpp" 9 #include "helpers.hpp" 10 10 #include "parser.hpp" 11 11 … … 24 24 bool FilePresent(const char *filename, bool test) 25 25 { 26 27 28 29 30 31 32 33 34 35 26 ifstream input; 27 28 input.open(filename, ios::in); 29 if (input == NULL) { 30 if (!test) 31 cout << endl << "Unable to open " << filename << ", is the directory correct?" << endl; 32 return false; 33 } 34 input.close(); 35 return true; 36 36 }; 37 37 … … 43 43 bool TestParams(int argc, char **argv) 44 44 { 45 46 47 48 49 45 ifstream input; 46 stringstream line; 47 48 line << argv[1] << FRAGMENTPREFIX << KEYSETFILE; 49 return FilePresent(line.str().c_str(), false); 50 50 }; 51 51 … … 55 55 */ 56 56 MatrixContainer::MatrixContainer() { 57 Indices = NULL; 58 Header = (char *) Malloc(sizeof(char)*1023, "MatrixContainer::MatrixContainer: *Header"); 59 Matrix = (double ***) Malloc(sizeof(double **)*(1), "MatrixContainer::MatrixContainer: ***Matrix"); // one more each for the total molecule 60 RowCounter = (int *) Malloc(sizeof(int)*(1), "MatrixContainer::MatrixContainer: *RowCounter"); 61 Matrix[0] = NULL; 62 RowCounter[0] = -1; 63 MatrixCounter = 0; 64 ColumnCounter = 0; 57 Indices = NULL; 58 Header = (char **) Malloc(sizeof(char)*1, "MatrixContainer::MatrixContainer: **Header"); 59 Matrix = (double ***) Malloc(sizeof(double **)*(1), "MatrixContainer::MatrixContainer: ***Matrix"); // one more each for the total molecule 60 RowCounter = (int *) Malloc(sizeof(int)*(1), "MatrixContainer::MatrixContainer: *RowCounter"); 61 ColumnCounter = (int *) Malloc(sizeof(int)*(1), "MatrixContainer::MatrixContainer: *ColumnCounter"); 62 Header[0] = NULL; 63 Matrix[0] = NULL; 64 RowCounter[0] = -1; 65 MatrixCounter = 0; 66 ColumnCounter[0] = -1; 65 67 }; 66 68 … … 68 70 */ 69 71 MatrixContainer::~MatrixContainer() { 70 if (Matrix != NULL) { 71 for(int i=MatrixCounter;i--;) { 72 if (RowCounter != NULL) { 73 for(int j=RowCounter[i]+1;j--;) 74 Free((void **)&Matrix[i][j], "MatrixContainer::~MatrixContainer: *Matrix[][]"); 75 Free((void **)&Matrix[i], "MatrixContainer::~MatrixContainer: **Matrix[]"); 76 } 77 } 78 if ((RowCounter != NULL) && (Matrix[MatrixCounter] != NULL)) 79 for(int j=RowCounter[MatrixCounter]+1;j--;) 80 Free((void **)&Matrix[MatrixCounter][j], "MatrixContainer::~MatrixContainer: *Matrix[MatrixCounter][]"); 81 if (MatrixCounter != 0) 82 Free((void **)&Matrix[MatrixCounter], "MatrixContainer::~MatrixContainer: **Matrix[MatrixCounter]"); 83 Free((void **)&Matrix, "MatrixContainer::~MatrixContainer: ***Matrix"); 84 } 85 if (Indices != NULL) 86 for(int i=MatrixCounter+1;i--;) { 87 Free((void **)&Indices[i], "MatrixContainer::~MatrixContainer: *Indices[]"); 88 } 89 Free((void **)&Indices, "MatrixContainer::~MatrixContainer: **Indices"); 90 91 Free((void **)&Header, "MatrixContainer::~MatrixContainer: *Header"); 92 Free((void **)&RowCounter, "MatrixContainer::~MatrixContainer: *RowCounter"); 93 }; 94 72 if (Matrix != NULL) { 73 for(int i=MatrixCounter;i--;) { 74 if ((ColumnCounter != NULL) && (RowCounter != NULL)) { 75 for(int j=RowCounter[i]+1;j--;) 76 Free((void **)&Matrix[i][j], "MatrixContainer::~MatrixContainer: *Matrix[][]"); 77 Free((void **)&Matrix[i], "MatrixContainer::~MatrixContainer: **Matrix[]"); 78 } 79 } 80 if ((ColumnCounter != NULL) && (RowCounter != NULL) && (Matrix[MatrixCounter] != NULL)) 81 for(int j=RowCounter[MatrixCounter]+1;j--;) 82 Free((void **)&Matrix[MatrixCounter][j], "MatrixContainer::~MatrixContainer: *Matrix[MatrixCounter][]"); 83 if (MatrixCounter != 0) 84 Free((void **)&Matrix[MatrixCounter], "MatrixContainer::~MatrixContainer: **Matrix[MatrixCounter]"); 85 Free((void **)&Matrix, "MatrixContainer::~MatrixContainer: ***Matrix"); 86 } 87 if (Indices != NULL) 88 for(int i=MatrixCounter+1;i--;) { 89 Free((void **)&Indices[i], "MatrixContainer::~MatrixContainer: *Indices[]"); 90 } 91 Free((void **)&Indices, "MatrixContainer::~MatrixContainer: **Indices"); 92 93 if (Header != NULL) 94 for(int i=MatrixCounter+1;i--;) 95 Free((void **)&Header[i], "MatrixContainer::~MatrixContainer: *Header[]"); 96 Free((void **)&Header, "MatrixContainer::~MatrixContainer: **Header"); 97 Free((void **)&RowCounter, "MatrixContainer::~MatrixContainer: *RowCounter"); 98 Free((void **)&ColumnCounter, "MatrixContainer::~MatrixContainer: *RowCounter"); 99 }; 100 101 /** Either copies index matrix from another MatrixContainer or initialises with trivial mapping if NULL. 102 * This either copies the index matrix or just maps 1 to 1, 2 to 2 and so on for all fragments. 103 * \param *Matrix pointer to other MatrixContainer 104 * \return true - copy/initialisation sucessful, false - dimension false for copying 105 */ 106 bool MatrixContainer::InitialiseIndices(class MatrixContainer *Matrix) 107 { 108 cout << "Initialising indices"; 109 if (Matrix == NULL) { 110 cout << " with trivial mapping." << endl; 111 Indices = (int **) Malloc(sizeof(int *)*(MatrixCounter+1), "MatrixContainer::InitialiseIndices: **Indices"); 112 for(int i=MatrixCounter+1;i--;) { 113 Indices[i] = (int *) Malloc(sizeof(int)*RowCounter[i], "MatrixContainer::InitialiseIndices: *Indices[]"); 114 for(int j=RowCounter[i];j--;) 115 Indices[i][j] = j; 116 } 117 } else { 118 cout << " from other MatrixContainer." << endl; 119 if (MatrixCounter != Matrix->MatrixCounter) 120 return false; 121 Indices = (int **) Malloc(sizeof(int *)*(MatrixCounter+1), "MatrixContainer::InitialiseIndices: **Indices"); 122 for(int i=MatrixCounter+1;i--;) { 123 if (RowCounter[i] != Matrix->RowCounter[i]) 124 return false; 125 Indices[i] = (int *) Malloc(sizeof(int)*Matrix->RowCounter[i], "MatrixContainer::InitialiseIndices: *Indices[]"); 126 for(int j=Matrix->RowCounter[i];j--;) { 127 Indices[i][j] = Matrix->Indices[i][j]; 128 //cout << Indices[i][j] << "\t"; 129 } 130 //cout << endl; 131 } 132 } 133 return true; 134 }; 95 135 96 136 /** Parsing a number of matrices. 97 * 98 * 99 * 100 * 101 * 102 * 137 * -# open the matrix file 138 * -# skip some lines (\a skiplines) 139 * -# scan header lines for number of columns 140 * -# scan lines for number of rows 141 * -# allocate matrix 142 * -# loop over found column and row counts and parse in each entry 103 143 * \param *name directory with files 104 144 * \param skiplines number of inital lines to skip 105 145 * \param skiplines number of inital columns to skip 106 146 * \param MatrixNr index number in Matrix array to parse into 107 * \return parsing successful 147 * \return parsing successful 108 148 */ 109 149 bool MatrixContainer::ParseMatrix(const char *name, int skiplines, int skipcolumns, int MatrixNr) 110 150 { 111 ifstream input; 112 stringstream line; 113 string token; 114 char filename[1023]; 115 116 input.open(name, ios::in); 117 //cout << "Opening " << name << " ... " << input << endl; 118 if (input == NULL) { 119 cerr << endl << "Unable to open " << name << ", is the directory correct?" << endl; 120 return false; 121 } 122 123 // skip some initial lines 124 for (int m=skiplines+1;m--;) 125 input.getline(Header, 1023); 126 127 // scan header for number of columns 128 line.str(Header); 129 for(int k=skipcolumns;k--;) 130 line >> Header; 131 //cout << line.str() << endl; 132 ColumnCounter=0; 133 while ( getline(line,token, '\t') ) { 134 if (token.length() > 0) 135 ColumnCounter++; 136 } 137 //cout << line.str() << endl; 138 //cout << "ColumnCounter: " << ColumnCounter << "." << endl; 139 if (ColumnCounter == 0) 140 cerr << "ColumnCounter: " << ColumnCounter << " from file " << name << ", this is probably an error!" << endl; 141 142 // scan rest for number of rows/lines 143 RowCounter[MatrixNr]=-1; // counts one line too much 144 while (!input.eof()) { 145 input.getline(filename, 1023); 146 //cout << "Comparing: " << strncmp(filename,"MeanForce",9) << endl; 147 RowCounter[MatrixNr]++; // then line was not last MeanForce 148 if (strncmp(filename,"MeanForce", 9) == 0) { 149 break; 150 } 151 } 152 //cout << "RowCounter[" << MatrixNr << "]: " << RowCounter[MatrixNr] << " from file " << name << "." << endl; 153 if (RowCounter[MatrixNr] == 0) 154 cerr << "RowCounter[" << MatrixNr << "]: " << RowCounter[MatrixNr] << " from file " << name << ", this is probably an error!" << endl; 155 156 // allocate matrix if it's not zero dimension in one direction 157 if ((ColumnCounter > 0) && (RowCounter[MatrixNr] > -1)) { 158 Matrix[MatrixNr] = (double **) Malloc(sizeof(double *)*(RowCounter[MatrixNr]+1), "MatrixContainer::ParseFragmentMatrix: **Matrix[]"); 159 160 // parse in each entry for this matrix 161 input.clear(); 162 input.seekg(ios::beg); 163 for (int m=skiplines+1;m--;) 164 input.getline(Header, 1023); // skip header 165 line.str(Header); 166 for(int k=skipcolumns;k--;) // skip columns in header too 167 line >> filename; 168 strncpy(Header, line.str().c_str(), 1023); 169 for(int j=0;j<RowCounter[MatrixNr];j++) { 170 Matrix[MatrixNr][j] = (double *) Malloc(sizeof(double)*ColumnCounter, "MatrixContainer::ParseFragmentMatrix: *Matrix[][]"); 171 input.getline(filename, 1023); 172 stringstream lines(filename); 173 //cout << "Matrix at level " << j << ":";// << filename << endl; 174 for(int k=skipcolumns;k--;) 175 lines >> filename; 176 for(int k=0;(k<ColumnCounter) && (!lines.eof());k++) { 177 lines >> Matrix[MatrixNr][j][k]; 178 //cout << " " << setprecision(2) << Matrix[MatrixNr][j][k];; 179 } 180 //cout << endl; 181 Matrix[MatrixNr][ RowCounter[MatrixNr] ] = (double *) Malloc(sizeof(double)*ColumnCounter, "MatrixContainer::ParseFragmentMatrix: *Matrix[RowCounter[MatrixNr]][]"); 182 for(int j=ColumnCounter;j--;) 183 Matrix[MatrixNr][ RowCounter[MatrixNr] ][j] = 0.; 184 } 185 } else { 186 cerr << "ERROR: Matrix nr. " << MatrixNr << " has column and row count of (" << ColumnCounter << "," << RowCounter[MatrixNr] << "), could not allocate nor parse!" << endl; 187 } 188 input.close(); 189 return true; 151 ifstream input; 152 stringstream line; 153 string token; 154 char filename[1023]; 155 156 input.open(name, ios::in); 157 //cout << "Opening " << name << " ... " << input << endl; 158 if (input == NULL) { 159 cerr << endl << "Unable to open " << name << ", is the directory correct?" << endl; 160 return false; 161 } 162 163 // parse header 164 Header[MatrixNr] = (char *) Malloc(sizeof(char)*1024, "MatrixContainer::ParseMatrix: *Header[]"); 165 for (int m=skiplines+1;m--;) 166 input.getline(Header[MatrixNr], 1023); 167 168 // scan header for number of columns 169 line.str(Header[MatrixNr]); 170 for(int k=skipcolumns;k--;) 171 line >> Header[MatrixNr]; 172 //cout << line.str() << endl; 173 ColumnCounter[MatrixNr]=0; 174 while ( getline(line,token, '\t') ) { 175 if (token.length() > 0) 176 ColumnCounter[MatrixNr]++; 177 } 178 //cout << line.str() << endl; 179 //cout << "ColumnCounter[" << MatrixNr << "]: " << ColumnCounter[MatrixNr] << "." << endl; 180 if (ColumnCounter[MatrixNr] == 0) 181 cerr << "ColumnCounter[" << MatrixNr << "]: " << ColumnCounter[MatrixNr] << " from file " << name << ", this is probably an error!" << endl; 182 183 // scan rest for number of rows/lines 184 RowCounter[MatrixNr]=-1; // counts one line too much 185 while (!input.eof()) { 186 input.getline(filename, 1023); 187 //cout << "Comparing: " << strncmp(filename,"MeanForce",9) << endl; 188 RowCounter[MatrixNr]++; // then line was not last MeanForce 189 if (strncmp(filename,"MeanForce", 9) == 0) { 190 break; 191 } 192 } 193 //cout << "RowCounter[" << MatrixNr << "]: " << RowCounter[MatrixNr] << " from file " << name << "." << endl; 194 if (RowCounter[MatrixNr] == 0) 195 cerr << "RowCounter[" << MatrixNr << "]: " << RowCounter[MatrixNr] << " from file " << name << ", this is probably an error!" << endl; 196 197 // allocate matrix if it's not zero dimension in one direction 198 if ((ColumnCounter[MatrixNr] > 0) && (RowCounter[MatrixNr] > -1)) { 199 Matrix[MatrixNr] = (double **) Malloc(sizeof(double *)*(RowCounter[MatrixNr]+1), "MatrixContainer::ParseMatrix: **Matrix[]"); 200 201 // parse in each entry for this matrix 202 input.clear(); 203 input.seekg(ios::beg); 204 for (int m=skiplines+1;m--;) 205 input.getline(Header[MatrixNr], 1023); // skip header 206 line.str(Header[MatrixNr]); 207 for(int k=skipcolumns;k--;) // skip columns in header too 208 line >> filename; 209 strncpy(Header[MatrixNr], line.str().c_str(), 1023); 210 for(int j=0;j<RowCounter[MatrixNr];j++) { 211 Matrix[MatrixNr][j] = (double *) Malloc(sizeof(double)*ColumnCounter[MatrixNr], "MatrixContainer::ParseMatrix: *Matrix[][]"); 212 input.getline(filename, 1023); 213 stringstream lines(filename); 214 //cout << "Matrix at level " << j << ":";// << filename << endl; 215 for(int k=skipcolumns;k--;) 216 lines >> filename; 217 for(int k=0;(k<ColumnCounter[MatrixNr]) && (!lines.eof());k++) { 218 lines >> Matrix[MatrixNr][j][k]; 219 //cout << " " << setprecision(2) << Matrix[MatrixNr][j][k];; 220 } 221 //cout << endl; 222 Matrix[MatrixNr][ RowCounter[MatrixNr] ] = (double *) Malloc(sizeof(double)*ColumnCounter[MatrixNr], "MatrixContainer::ParseMatrix: *Matrix[RowCounter[MatrixNr]][]"); 223 for(int j=ColumnCounter[MatrixNr];j--;) 224 Matrix[MatrixNr][ RowCounter[MatrixNr] ][j] = 0.; 225 } 226 } else { 227 cerr << "ERROR: Matrix nr. " << MatrixNr << " has column and row count of (" << ColumnCounter[MatrixNr] << "," << RowCounter[MatrixNr] << "), could not allocate nor parse!" << endl; 228 } 229 input.close(); 230 return true; 190 231 }; 191 232 192 233 /** Parsing a number of matrices. 193 234 * -# First, count the number of matrices by counting lines in KEYSETFILE 194 * -# Then, 195 * 196 * 197 * 198 * 199 * 200 * 201 * 202 * -# Finally, allocate one additional matrix (\a MatrixCounter) containing combined or temporary values 235 * -# Then, 236 * -# construct the fragment number 237 * -# open the matrix file 238 * -# skip some lines (\a skiplines) 239 * -# scan header lines for number of columns 240 * -# scan lines for number of rows 241 * -# allocate matrix 242 * -# loop over found column and row counts and parse in each entry 243 * -# Finally, allocate one additional matrix (\a MatrixCounter) containing combined or temporary values 203 244 * \param *name directory with files 204 245 * \param *prefix prefix of each matrix file … … 206 247 * \param skiplines number of inital lines to skip 207 248 * \param skiplines number of inital columns to skip 208 * \return parsing successful 249 * \return parsing successful 209 250 */ 210 251 bool MatrixContainer::ParseFragmentMatrix(char *name, char *prefix, string suffix, int skiplines, int skipcolumns) 211 252 { 212 char filename[1023]; 213 ifstream input; 214 char *FragmentNumber = NULL; 215 stringstream file; 216 string token; 217 218 // count the number of matrices 219 MatrixCounter = -1; // we count one too much 220 file << name << FRAGMENTPREFIX << KEYSETFILE; 221 input.open(file.str().c_str(), ios::in); 222 if (input == NULL) { 223 cout << endl << "Unable to open " << file.str() << ", is the directory correct?" << endl; 224 return false; 225 } 226 while (!input.eof()) { 227 input.getline(filename, 1023); 228 stringstream zeile(filename); 229 MatrixCounter++; 230 } 231 input.close(); 232 cout << "Determined " << MatrixCounter << " fragments." << endl; 233 234 cout << "Parsing through each fragment and retrieving " << prefix << suffix << "." << endl; 235 Matrix = (double ***) ReAlloc(Matrix, sizeof(double **)*(MatrixCounter+1), "MatrixContainer::ParseFragmentMatrix: ***Matrix"); // one more each for the total molecule 236 RowCounter = (int *) ReAlloc(RowCounter, sizeof(int)*(MatrixCounter+1), "MatrixContainer::ParseFragmentMatrix: *RowCounter"); 237 for(int i=MatrixCounter+1;i--;) { 238 Matrix[i] = NULL; 239 RowCounter[i] = -1; 240 } 241 for(int i=0; i < MatrixCounter;i++) { 242 // open matrix file 243 FragmentNumber = FixedDigitNumber(MatrixCounter, i); 244 file.str(" "); 245 file << name << FRAGMENTPREFIX << FragmentNumber << prefix << suffix; 246 if (!ParseMatrix(file.str().c_str(), skiplines, skipcolumns, i)) 247 return false; 248 Free((void **)&FragmentNumber, "MatrixContainer::ParseFragmentMatrix: *FragmentNumber"); 249 } 250 return true; 253 char filename[1023]; 254 ifstream input; 255 char *FragmentNumber = NULL; 256 stringstream file; 257 string token; 258 259 // count the number of matrices 260 MatrixCounter = -1; // we count one too much 261 file << name << FRAGMENTPREFIX << KEYSETFILE; 262 input.open(file.str().c_str(), ios::in); 263 if (input == NULL) { 264 cout << endl << "Unable to open " << file.str() << ", is the directory correct?" << endl; 265 return false; 266 } 267 while (!input.eof()) { 268 input.getline(filename, 1023); 269 stringstream zeile(filename); 270 MatrixCounter++; 271 } 272 input.close(); 273 cout << "Determined " << MatrixCounter << " fragments." << endl; 274 275 cout << "Parsing through each fragment and retrieving " << prefix << suffix << "." << endl; 276 Header = (char **) ReAlloc(Header, sizeof(char *)*(MatrixCounter+1), "MatrixContainer::ParseFragmentMatrix: **Header"); // one more each for the total molecule 277 Matrix = (double ***) ReAlloc(Matrix, sizeof(double **)*(MatrixCounter+1), "MatrixContainer::ParseFragmentMatrix: ***Matrix"); // one more each for the total molecule 278 RowCounter = (int *) ReAlloc(RowCounter, sizeof(int)*(MatrixCounter+1), "MatrixContainer::ParseFragmentMatrix: *RowCounter"); 279 ColumnCounter = (int *) ReAlloc(ColumnCounter, sizeof(int)*(MatrixCounter+1), "MatrixContainer::ParseFragmentMatrix: *ColumnCounter"); 280 for(int i=MatrixCounter+1;i--;) { 281 Matrix[i] = NULL; 282 Header[i] = NULL; 283 RowCounter[i] = -1; 284 ColumnCounter[i] = -1; 285 } 286 for(int i=0; i < MatrixCounter;i++) { 287 // open matrix file 288 FragmentNumber = FixedDigitNumber(MatrixCounter, i); 289 file.str(" "); 290 file << name << FRAGMENTPREFIX << FragmentNumber << prefix << suffix; 291 if (!ParseMatrix(file.str().c_str(), skiplines, skipcolumns, i)) 292 return false; 293 Free((void **)&FragmentNumber, "MatrixContainer::ParseFragmentMatrix: *FragmentNumber"); 294 } 295 return true; 251 296 }; 252 297 253 298 /** Allocates and resets the memory for a number \a MCounter of matrices. 254 * \param * GivenHeader Header line299 * \param **GivenHeader Header line for each matrix 255 300 * \param MCounter number of matrices 256 301 * \param *RCounter number of rows for each matrix 257 * \param CCounter number of columns for all matrices 258 * \return Allocation successful 259 */ 260 bool MatrixContainer::AllocateMatrix(char *GivenHeader, int MCounter, int *RCounter, int CCounter) 261 { 262 Header = (char *) Malloc(sizeof(char)*1024, "MatrixContainer::ParseFragmentMatrix: *EnergyHeader"); 263 strncpy(Header, GivenHeader, 1023); 264 265 MatrixCounter = MCounter; 266 ColumnCounter = CCounter; 267 Matrix = (double ***) Malloc(sizeof(double **)*(MatrixCounter+1), "MatrixContainer::ParseFragmentMatrix: ***Matrix"); // one more each for the total molecule 268 RowCounter = (int *) Malloc(sizeof(int)*(MatrixCounter+1), "MatrixContainer::ParseFragmentMatrix: *RowCounter"); 269 for(int i=MatrixCounter+1;i--;) { 270 RowCounter[i] = RCounter[i]; 271 Matrix[i] = (double **) Malloc(sizeof(double *)*(RowCounter[i]+1), "MatrixContainer::ParseFragmentMatrix: **Matrix[]"); 272 for(int j=RowCounter[i]+1;j--;) { 273 Matrix[i][j] = (double *) Malloc(sizeof(double)*ColumnCounter, "MatrixContainer::ParseFragmentMatrix: *Matrix[][]"); 274 for(int k=ColumnCounter;k--;) 275 Matrix[i][j][k] = 0.; 276 } 277 } 278 return true; 302 * \param *CCounter number of columns for each matrix 303 * \return Allocation successful 304 */ 305 bool MatrixContainer::AllocateMatrix(char **GivenHeader, int MCounter, int *RCounter, int *CCounter) 306 { 307 MatrixCounter = MCounter; 308 Header = (char **) Malloc(sizeof(char *)*(MatrixCounter+1), "MatrixContainer::AllocateMatrix: *Header"); 309 Matrix = (double ***) Malloc(sizeof(double **)*(MatrixCounter+1), "MatrixContainer::AllocateMatrix: ***Matrix"); // one more each for the total molecule 310 RowCounter = (int *) Malloc(sizeof(int)*(MatrixCounter+1), "MatrixContainer::AllocateMatrix: *RowCounter"); 311 ColumnCounter = (int *) Malloc(sizeof(int)*(MatrixCounter+1), "MatrixContainer::AllocateMatrix: *ColumnCounter"); 312 for(int i=MatrixCounter+1;i--;) { 313 Header[i] = (char *) Malloc(sizeof(char)*1024, "MatrixContainer::AllocateMatrix: *Header[i]"); 314 strncpy(Header[i], GivenHeader[i], 1023); 315 RowCounter[i] = RCounter[i]; 316 ColumnCounter[i] = CCounter[i]; 317 Matrix[i] = (double **) Malloc(sizeof(double *)*(RowCounter[i]+1), "MatrixContainer::AllocateMatrix: **Matrix[]"); 318 for(int j=RowCounter[i]+1;j--;) { 319 Matrix[i][j] = (double *) Malloc(sizeof(double)*ColumnCounter[i], "MatrixContainer::AllocateMatrix: *Matrix[][]"); 320 for(int k=ColumnCounter[i];k--;) 321 Matrix[i][j][k] = 0.; 322 } 323 } 324 return true; 279 325 }; 280 326 … … 284 330 bool MatrixContainer::ResetMatrix() 285 331 { 286 287 288 for(int k=ColumnCounter;k--;)289 290 332 for(int i=MatrixCounter+1;i--;) 333 for(int j=RowCounter[i]+1;j--;) 334 for(int k=ColumnCounter[i];k--;) 335 Matrix[i][j][k] = 0.; 336 return true; 291 337 }; 292 338 … … 296 342 double MatrixContainer::FindMaxValue() 297 343 { 298 299 300 301 for(int k=ColumnCounter;k--;)302 303 304 305 344 double max = Matrix[0][0][0]; 345 for(int i=MatrixCounter+1;i--;) 346 for(int j=RowCounter[i]+1;j--;) 347 for(int k=ColumnCounter[i];k--;) 348 if (fabs(Matrix[i][j][k]) > max) 349 max = fabs(Matrix[i][j][k]); 350 if (fabs(max) < MYEPSILON) 351 max += MYEPSILON; 306 352 return max; 307 353 }; … … 312 358 double MatrixContainer::FindMinValue() 313 359 { 314 315 316 317 for(int k=ColumnCounter;k--;)318 319 320 321 322 360 double min = Matrix[0][0][0]; 361 for(int i=MatrixCounter+1;i--;) 362 for(int j=RowCounter[i]+1;j--;) 363 for(int k=ColumnCounter[i];k--;) 364 if (fabs(Matrix[i][j][k]) < min) 365 min = fabs(Matrix[i][j][k]); 366 if (fabs(min) < MYEPSILON) 367 min += MYEPSILON; 368 return min; 323 369 }; 324 370 … … 330 376 bool MatrixContainer::SetLastMatrix(double value, int skipcolumns) 331 377 { 332 333 for(int k=skipcolumns;k<ColumnCounter;k++)334 335 378 for(int j=RowCounter[MatrixCounter]+1;j--;) 379 for(int k=skipcolumns;k<ColumnCounter[MatrixCounter];k++) 380 Matrix[MatrixCounter][j][k] = value; 381 return true; 336 382 }; 337 383 … … 343 389 bool MatrixContainer::SetLastMatrix(double **values, int skipcolumns) 344 390 { 345 346 for(int k=skipcolumns;k<ColumnCounter;k++)347 348 349 }; 350 351 /** Sums the en ergy with each factor and put into last element of \a ***Energies.391 for(int j=RowCounter[MatrixCounter]+1;j--;) 392 for(int k=skipcolumns;k<ColumnCounter[MatrixCounter];k++) 393 Matrix[MatrixCounter][j][k] = values[j][k]; 394 return true; 395 }; 396 397 /** Sums the entries with each factor and put into last element of \a ***Matrix. 352 398 * Sums over "E"-terms to create the "F"-terms 353 * \param Matrix MatrixContainer with matrices (LevelCounter by ColumnCounter) with all the energies.399 * \param Matrix MatrixContainer with matrices (LevelCounter by *ColumnCounter) with all the energies. 354 400 * \param KeySet KeySetContainer with bond Order and association mapping of each fragment to an order 355 401 * \param Order bond order … … 358 404 bool MatrixContainer::SumSubManyBodyTerms(class MatrixContainer &MatrixValues, class KeySetsContainer &KeySet, int Order) 359 405 { 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 break; 378 379 380 381 382 cerr << "In fragment No. " << KeySet.OrderSet[Order][CurrentFragment]<< " current force index " << m << " is greater than " << RowCounter[ KeySet.OrderSet[Order][CurrentFragment] ] << "!" << endl;383 384 385 386 for(int l=ColumnCounter;l--;) // then adds/subtract each column 387 388 389 for(int l=ColumnCounter;l--;)390 391 392 393 //if ((ColumnCounter>1) && (RowCounter[0]-1 >= 1))394 //cout << "Fragments[ KeySet.OrderSet[" << Order << "][" << CurrentFragment << "]=" << KeySet.OrderSet[Order][CurrentFragment] << " ][" << RowCounter[0]-1 << "][" << 1 << "] = " <<Matrix[ KeySet.OrderSet[Order][CurrentFragment] ][RowCounter[0]-1][1] << endl;395 396 397 398 399 400 401 //cout << "Final Fragments[ KeySet.OrderSet[" << Order << "][" << CurrentFragment << "]=" << KeySet.OrderSet[Order][CurrentFragment] << " ][" << KeySet.AtomCounter[0]-1 << "][" << 1 << "] = " <<Matrix[ KeySet.OrderSet[Order][CurrentFragment] ][KeySet.AtomCounter[0]-1][1] << endl;402 403 404 406 // go through each order 407 for (int CurrentFragment=0;CurrentFragment<KeySet.FragmentsPerOrder[Order];CurrentFragment++) { 408 //cout << "Current Fragment is " << CurrentFragment << "/" << KeySet.OrderSet[Order][CurrentFragment] << "." << endl; 409 // then go per order through each suborder and pick together all the terms that contain this fragment 410 for(int SubOrder=0;SubOrder<=Order;SubOrder++) { // go through all suborders up to the desired order 411 for (int j=0;j<KeySet.FragmentsPerOrder[SubOrder];j++) { // go through all possible fragments of size suborder 412 if (KeySet.Contains(KeySet.OrderSet[Order][CurrentFragment], KeySet.OrderSet[SubOrder][j])) { 413 //cout << "Current other fragment is " << j << "/" << KeySet.OrderSet[SubOrder][j] << "." << endl; 414 // if the fragment's indices are all in the current fragment 415 for(int k=0;k<RowCounter[ KeySet.OrderSet[SubOrder][j] ];k++) { // go through all atoms in this fragment 416 int m = MatrixValues.Indices[ KeySet.OrderSet[SubOrder][j] ][k]; 417 //cout << "Current index is " << k << "/" << m << "." << endl; 418 if (m != -1) { // if it's not an added hydrogen 419 for (int l=0;l<RowCounter[ KeySet.OrderSet[Order][CurrentFragment] ];l++) { // look for the corresponding index in the current fragment 420 //cout << "Comparing " << m << " with " << MatrixValues.Indices[ KeySet.OrderSet[Order][CurrentFragment] ][l] << "." << endl; 421 if (m == MatrixValues.Indices[ KeySet.OrderSet[Order][CurrentFragment] ][l]) { 422 m = l; 423 break; 424 } 425 } 426 //cout << "Corresponding index in CurrentFragment is " << m << "." << endl; 427 if (m > RowCounter[ KeySet.OrderSet[Order][CurrentFragment] ]) { 428 cerr << "In fragment No. " << KeySet.OrderSet[Order][CurrentFragment] << " current force index " << m << " is greater than " << RowCounter[ KeySet.OrderSet[Order][CurrentFragment] ] << "!" << endl; 429 return false; 430 } 431 if (Order == SubOrder) { // equal order is always copy from Energies 432 for(int l=ColumnCounter[ KeySet.OrderSet[SubOrder][j] ];l--;) // then adds/subtract each column 433 Matrix[ KeySet.OrderSet[Order][CurrentFragment] ][m][l] += MatrixValues.Matrix[ KeySet.OrderSet[SubOrder][j] ][k][l]; 434 } else { 435 for(int l=ColumnCounter[ KeySet.OrderSet[SubOrder][j] ];l--;) 436 Matrix[ KeySet.OrderSet[Order][CurrentFragment] ][m][l] -= Matrix[ KeySet.OrderSet[SubOrder][j] ][k][l]; 437 } 438 } 439 //if ((ColumnCounter[ KeySet.OrderSet[SubOrder][j] ]>1) && (RowCounter[0]-1 >= 1)) 440 //cout << "Fragments[ KeySet.OrderSet[" << Order << "][" << CurrentFragment << "]=" << KeySet.OrderSet[Order][CurrentFragment] << " ][" << RowCounter[0]-1 << "][" << 1 << "] = " << Matrix[ KeySet.OrderSet[Order][CurrentFragment] ][RowCounter[0]-1][1] << endl; 441 } 442 } else { 443 //cout << "Fragment " << KeySet.OrderSet[SubOrder][j] << " is not contained in fragment " << KeySet.OrderSet[Order][CurrentFragment] << "." << endl; 444 } 445 } 446 } 447 //cout << "Final Fragments[ KeySet.OrderSet[" << Order << "][" << CurrentFragment << "]=" << KeySet.OrderSet[Order][CurrentFragment] << " ][" << KeySet.AtomCounter[0]-1 << "][" << 1 << "] = " << Matrix[ KeySet.OrderSet[Order][CurrentFragment] ][KeySet.AtomCounter[0]-1][1] << endl; 448 } 449 450 return true; 405 451 }; 406 452 … … 412 458 bool MatrixContainer::WriteTotalFragments(const char *name, const char *prefix) 413 459 { 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 output << Header<< endl;429 430 for(int k=0;k<ColumnCounter;k++)431 432 433 434 435 436 460 ofstream output; 461 char *FragmentNumber = NULL; 462 463 cout << "Writing fragment files." << endl; 464 for(int i=0;i<MatrixCounter;i++) { 465 stringstream line; 466 FragmentNumber = FixedDigitNumber(MatrixCounter, i); 467 line << name << FRAGMENTPREFIX << FragmentNumber << "/" << prefix; 468 Free((void **)&FragmentNumber, "*FragmentNumber"); 469 output.open(line.str().c_str(), ios::out); 470 if (output == NULL) { 471 cerr << "Unable to open output energy file " << line.str() << "!" << endl; 472 return false; 473 } 474 output << Header[i] << endl; 475 for(int j=0;j<RowCounter[i];j++) { 476 for(int k=0;k<ColumnCounter[i];k++) 477 output << scientific << Matrix[i][j][k] << "\t"; 478 output << endl; 479 } 480 output.close(); 481 } 482 return true; 437 483 }; 438 484 … … 445 491 bool MatrixContainer::WriteLastMatrix(const char *name, const char *prefix, const char *suffix) 446 492 { 447 448 449 450 451 452 453 454 455 456 457 output << Header<< endl;458 459 for(int k=0;k<ColumnCounter;k++)460 461 462 463 464 493 ofstream output; 494 stringstream line; 495 496 cout << "Writing matrix values of " << suffix << "." << endl; 497 line << name << prefix << suffix; 498 output.open(line.str().c_str(), ios::out); 499 if (output == NULL) { 500 cerr << "Unable to open output matrix file " << line.str() << "!" << endl; 501 return false; 502 } 503 output << Header[MatrixCounter] << endl; 504 for(int j=0;j<RowCounter[MatrixCounter];j++) { 505 for(int k=0;k<ColumnCounter[MatrixCounter];k++) 506 output << scientific << Matrix[MatrixCounter][j][k] << "\t"; 507 output << endl; 508 } 509 output.close(); 510 return true; 465 511 }; 466 512 467 513 // ======================================= CLASS EnergyMatrix ============================= 468 469 /** Create a trivial energy index mapping.470 * This just maps 1 to 1, 2 to 2 and so on for all fragments.471 * \return creation sucessful472 */473 bool EnergyMatrix::ParseIndices()474 {475 cout << "Parsing energy indices." << endl;476 Indices = (int **) Malloc(sizeof(int *)*(MatrixCounter+1), "EnergyMatrix::ParseIndices: **Indices");477 for(int i=MatrixCounter+1;i--;) {478 Indices[i] = (int *) Malloc(sizeof(int)*RowCounter[i], "EnergyMatrix::ParseIndices: *Indices[]");479 for(int j=RowCounter[i];j--;)480 Indices[i][j] = j;481 }482 return true;483 };484 514 485 515 /** Sums the energy with each factor and put into last element of \a EnergyMatrix::Matrix. 486 516 * Sums over the "F"-terms in ANOVA decomposition. 487 * \param Matrix MatrixContainer with matrices (LevelCounter by ColumnCounter) with all the energies.517 * \param Matrix MatrixContainer with matrices (LevelCounter by *ColumnCounter) with all the energies. 488 518 * \param CorrectionFragments MatrixContainer with hydrogen saturation correction per fragments 489 519 * \param KeySet KeySetContainer with bond Order and association mapping of each fragment to an order … … 494 524 bool EnergyMatrix::SumSubEnergy(class EnergyMatrix &Fragments, class EnergyMatrix *CorrectionFragments, class KeySetsContainer &KeySet, int Order, double sign) 495 525 { 496 497 498 499 500 for(int k=ColumnCounter;k--;)501 502 503 504 505 for(int k=ColumnCounter;k--;)506 507 526 // sum energy 527 if (CorrectionFragments == NULL) 528 for(int i=KeySet.FragmentsPerOrder[Order];i--;) 529 for(int j=RowCounter[ KeySet.OrderSet[Order][i] ];j--;) 530 for(int k=ColumnCounter[ KeySet.OrderSet[Order][i] ];k--;) 531 Matrix[MatrixCounter][j][k] += sign*Fragments.Matrix[ KeySet.OrderSet[Order][i] ][j][k]; 532 else 533 for(int i=KeySet.FragmentsPerOrder[Order];i--;) 534 for(int j=RowCounter[ KeySet.OrderSet[Order][i] ];j--;) 535 for(int k=ColumnCounter[ KeySet.OrderSet[Order][i] ];k--;) 536 Matrix[MatrixCounter][j][k] += sign*(Fragments.Matrix[ KeySet.OrderSet[Order][i] ][j][k] + CorrectionFragments->Matrix[ KeySet.OrderSet[Order][i] ][j][k]); 537 return true; 508 538 }; 509 539 … … 515 545 * \param skiplines number of inital columns to skip 516 546 * \return parsing successful 517 */ 547 */ 518 548 bool EnergyMatrix::ParseFragmentMatrix(char *name, char *prefix, string suffix, int skiplines, int skipcolumns) 519 549 { 520 char filename[1024]; 521 bool status = MatrixContainer::ParseFragmentMatrix(name, prefix, suffix, skiplines, skipcolumns); 522 523 if (status) { 524 // count maximum of columns 525 RowCounter[MatrixCounter] = 0; 526 for(int j=0; j < MatrixCounter;j++) // (energy matrix might be bigger than number of atoms in terms of rows) 527 if (RowCounter[j] > RowCounter[MatrixCounter]) 528 RowCounter[MatrixCounter] = RowCounter[j]; 529 // allocate last plus one matrix 530 cout << "Allocating last plus one matrix with " << (RowCounter[MatrixCounter]+1) << " rows and " << ColumnCounter << " columns." << endl; 531 Matrix[MatrixCounter] = (double **) Malloc(sizeof(double *)*(RowCounter[MatrixCounter]+1), "MatrixContainer::ParseFragmentMatrix: **Matrix[]"); 532 for(int j=0;j<=RowCounter[MatrixCounter];j++) 533 Matrix[MatrixCounter][j] = (double *) Malloc(sizeof(double)*ColumnCounter, "MatrixContainer::ParseFragmentMatrix: *Matrix[][]"); 534 535 // try independently to parse global energysuffix file if present 536 strncpy(filename, name, 1023); 537 strncat(filename, prefix, 1023-strlen(filename)); 538 strncat(filename, suffix.c_str(), 1023-strlen(filename)); 539 ParseMatrix(filename, skiplines, skipcolumns, MatrixCounter); 540 } 541 return status; 550 char filename[1024]; 551 bool status = MatrixContainer::ParseFragmentMatrix(name, prefix, suffix, skiplines, skipcolumns); 552 553 if (status) { 554 // count maximum of columns 555 RowCounter[MatrixCounter] = 0; 556 ColumnCounter[MatrixCounter] = 0; 557 for(int j=0; j < MatrixCounter;j++) { // (energy matrix might be bigger than number of atoms in terms of rows) 558 if (RowCounter[j] > RowCounter[MatrixCounter]) 559 RowCounter[MatrixCounter] = RowCounter[j]; 560 if (ColumnCounter[j] > ColumnCounter[MatrixCounter]) // take maximum of all for last matrix 561 ColumnCounter[MatrixCounter] = ColumnCounter[j]; 562 } 563 // allocate last plus one matrix 564 cout << "Allocating last plus one matrix with " << (RowCounter[MatrixCounter]+1) << " rows and " << ColumnCounter[MatrixCounter] << " columns." << endl; 565 Matrix[MatrixCounter] = (double **) Malloc(sizeof(double *)*(RowCounter[MatrixCounter]+1), "MatrixContainer::ParseFragmentMatrix: **Matrix[]"); 566 for(int j=0;j<=RowCounter[MatrixCounter];j++) 567 Matrix[MatrixCounter][j] = (double *) Malloc(sizeof(double)*ColumnCounter[MatrixCounter], "MatrixContainer::ParseFragmentMatrix: *Matrix[][]"); 568 569 // try independently to parse global energysuffix file if present 570 strncpy(filename, name, 1023); 571 strncat(filename, prefix, 1023-strlen(filename)); 572 strncat(filename, suffix.c_str(), 1023-strlen(filename)); 573 ParseMatrix(filename, skiplines, skipcolumns, MatrixCounter); 574 } 575 return status; 542 576 }; 543 577 … … 546 580 /** Parsing force Indices of each fragment 547 581 * \param *name directory with \a ForcesFile 548 * \return parsing successful 549 */ 550 bool ForceMatrix::ParseIndices(char *name) 551 { 552 553 554 555 556 557 558 559 560 561 //cout << "Opening " << line.str() << " ... "<< input << endl;562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 582 * \return parsing successful 583 */ 584 bool ForceMatrix::ParseIndices(char *name) 585 { 586 ifstream input; 587 char *FragmentNumber = NULL; 588 char filename[1023]; 589 stringstream line; 590 591 cout << "Parsing force indices for " << MatrixCounter << " matrices." << endl; 592 Indices = (int **) Malloc(sizeof(int *)*(MatrixCounter+1), "ForceMatrix::ParseIndices: **Indices"); 593 line << name << FRAGMENTPREFIX << FORCESFILE; 594 input.open(line.str().c_str(), ios::in); 595 //cout << "Opening " << line.str() << " ... " << input << endl; 596 if (input == NULL) { 597 cout << endl << "Unable to open " << line.str() << ", is the directory correct?" << endl; 598 return false; 599 } 600 for (int i=0;(i<MatrixCounter) && (!input.eof());i++) { 601 // get the number of atoms for this fragment 602 input.getline(filename, 1023); 603 line.str(filename); 604 // parse the values 605 Indices[i] = (int *) Malloc(sizeof(int)*RowCounter[i], "ForceMatrix::ParseIndices: *Indices[]"); 606 FragmentNumber = FixedDigitNumber(MatrixCounter, i); 607 //cout << FRAGMENTPREFIX << FragmentNumber << "[" << RowCounter[i] << "]:"; 608 Free((void **)&FragmentNumber, "ForceMatrix::ParseIndices: *FragmentNumber"); 609 for(int j=0;(j<RowCounter[i]) && (!line.eof());j++) { 610 line >> Indices[i][j]; 611 //cout << " " << Indices[i][j]; 612 } 613 //cout << endl; 614 } 615 Indices[MatrixCounter] = (int *) Malloc(sizeof(int)*RowCounter[MatrixCounter], "ForceMatrix::ParseIndices: *Indices[]"); 616 for(int j=RowCounter[MatrixCounter];j--;) { 617 Indices[MatrixCounter][j] = j; 618 } 619 input.close(); 620 return true; 587 621 }; 588 622 589 623 590 624 /** Sums the forces and puts into last element of \a ForceMatrix::Matrix. 591 * \param Matrix MatrixContainer with matrices (LevelCounter by ColumnCounter) with all the energies.625 * \param Matrix MatrixContainer with matrices (LevelCounter by *ColumnCounter) with all the energies. 592 626 * \param KeySet KeySetContainer with bond Order and association mapping of each fragment to an order 593 627 * \param Order bond order 594 * 628 * \param sign +1 or -1 595 629 * \return true if summing was successful 596 630 */ 597 631 bool ForceMatrix::SumSubForces(class ForceMatrix &Fragments, class KeySetsContainer &KeySet, int Order, double sign) 598 632 { 599 600 601 602 603 604 605 606 607 608 609 610 611 for(int k=2;k<ColumnCounter;k++)612 613 614 615 616 633 int FragmentNr; 634 // sum forces 635 for(int i=0;i<KeySet.FragmentsPerOrder[Order];i++) { 636 FragmentNr = KeySet.OrderSet[Order][i]; 637 for(int l=0;l<RowCounter[ FragmentNr ];l++) { 638 int j = Indices[ FragmentNr ][l]; 639 if (j > RowCounter[MatrixCounter]) { 640 cerr << "Current force index " << j << " is greater than " << RowCounter[MatrixCounter] << "!" << endl; 641 return false; 642 } 643 if (j != -1) { 644 //if (j == 0) cout << "Summing onto ion 0, type 0 from fragment " << FragmentNr << ", ion " << l << "." << endl; 645 for(int k=2;k<ColumnCounter[MatrixCounter];k++) 646 Matrix[MatrixCounter][j][k] += sign*Fragments.Matrix[ FragmentNr ][l][k]; 647 } 648 } 649 } 650 return true; 617 651 }; 618 652 … … 625 659 * \param skiplines number of inital columns to skip 626 660 * \return parsing successful 627 */ 661 */ 628 662 bool ForceMatrix::ParseFragmentMatrix(char *name, char *prefix, string suffix, int skiplines, int skipcolumns) 629 663 { 630 char filename[1023]; 631 ifstream input; 632 stringstream file; 633 int nr; 634 bool status = MatrixContainer::ParseFragmentMatrix(name, prefix, suffix, skiplines, skipcolumns); 635 636 if (status) { 637 // count number of atoms for last plus one matrix 638 file << name << FRAGMENTPREFIX << KEYSETFILE; 639 input.open(file.str().c_str(), ios::in); 640 if (input == NULL) { 641 cout << endl << "Unable to open " << file.str() << ", is the directory correct?" << endl; 642 return false; 643 } 644 RowCounter[MatrixCounter] = 0; 645 while (!input.eof()) { 646 input.getline(filename, 1023); 647 stringstream zeile(filename); 648 while (!zeile.eof()) { 649 zeile >> nr; 650 //cout << "Current index: " << nr << "." << endl; 651 if (nr > RowCounter[MatrixCounter]) 652 RowCounter[MatrixCounter] = nr; 653 } 654 } 655 RowCounter[MatrixCounter]++; // nr start at 0, count starts at 1 656 input.close(); 657 658 // allocate last plus one matrix 659 cout << "Allocating last plus one matrix with " << (RowCounter[MatrixCounter]+1) << " rows and " << ColumnCounter << " columns." << endl; 660 Matrix[MatrixCounter] = (double **) Malloc(sizeof(double *)*(RowCounter[MatrixCounter]+1), "MatrixContainer::ParseFragmentMatrix: **Matrix[]"); 661 for(int j=0;j<=RowCounter[MatrixCounter];j++) 662 Matrix[MatrixCounter][j] = (double *) Malloc(sizeof(double)*ColumnCounter, "MatrixContainer::ParseFragmentMatrix: *Matrix[][]"); 663 664 // try independently to parse global forcesuffix file if present 665 strncpy(filename, name, 1023); 666 strncat(filename, prefix, 1023-strlen(filename)); 667 strncat(filename, suffix.c_str(), 1023-strlen(filename)); 668 ParseMatrix(filename, skiplines, skipcolumns, MatrixCounter); 669 } 670 671 672 return status; 664 char filename[1023]; 665 ifstream input; 666 stringstream file; 667 int nr; 668 bool status = MatrixContainer::ParseFragmentMatrix(name, prefix, suffix, skiplines, skipcolumns); 669 670 if (status) { 671 // count number of atoms for last plus one matrix 672 file << name << FRAGMENTPREFIX << KEYSETFILE; 673 input.open(file.str().c_str(), ios::in); 674 if (input == NULL) { 675 cout << endl << "Unable to open " << file.str() << ", is the directory correct?" << endl; 676 return false; 677 } 678 RowCounter[MatrixCounter] = 0; 679 while (!input.eof()) { 680 input.getline(filename, 1023); 681 stringstream zeile(filename); 682 while (!zeile.eof()) { 683 zeile >> nr; 684 //cout << "Current index: " << nr << "." << endl; 685 if (nr > RowCounter[MatrixCounter]) 686 RowCounter[MatrixCounter] = nr; 687 } 688 } 689 RowCounter[MatrixCounter]++; // nr start at 0, count starts at 1 690 input.close(); 691 692 ColumnCounter[MatrixCounter] = 0; 693 for(int j=0; j < MatrixCounter;j++) { // (energy matrix might be bigger than number of atoms in terms of rows) 694 if (ColumnCounter[j] > ColumnCounter[MatrixCounter]) // take maximum of all for last matrix 695 ColumnCounter[MatrixCounter] = ColumnCounter[j]; 696 } 697 698 // allocate last plus one matrix 699 cout << "Allocating last plus one matrix with " << (RowCounter[MatrixCounter]+1) << " rows and " << ColumnCounter[MatrixCounter] << " columns." << endl; 700 Matrix[MatrixCounter] = (double **) Malloc(sizeof(double *)*(RowCounter[MatrixCounter]+1), "MatrixContainer::ParseFragmentMatrix: **Matrix[]"); 701 for(int j=0;j<=RowCounter[MatrixCounter];j++) 702 Matrix[MatrixCounter][j] = (double *) Malloc(sizeof(double)*ColumnCounter[MatrixCounter], "MatrixContainer::ParseFragmentMatrix: *Matrix[][]"); 703 704 // try independently to parse global forcesuffix file if present 705 strncpy(filename, name, 1023); 706 strncat(filename, prefix, 1023-strlen(filename)); 707 strncat(filename, suffix.c_str(), 1023-strlen(filename)); 708 ParseMatrix(filename, skiplines, skipcolumns, MatrixCounter); 709 } 710 711 712 return status; 713 }; 714 715 // ======================================= CLASS HessianMatrix ============================= 716 717 /** Parsing force Indices of each fragment 718 * \param *name directory with \a ForcesFile 719 * \return parsing successful 720 */ 721 bool HessianMatrix::ParseIndices(char *name) 722 { 723 ifstream input; 724 char *FragmentNumber = NULL; 725 char filename[1023]; 726 stringstream line; 727 728 cout << "Parsing hessian indices for " << MatrixCounter << " matrices." << endl; 729 Indices = (int **) Malloc(sizeof(int *)*(MatrixCounter+1), "HessianMatrix::ParseIndices: **Indices"); 730 line << name << FRAGMENTPREFIX << FORCESFILE; 731 input.open(line.str().c_str(), ios::in); 732 //cout << "Opening " << line.str() << " ... " << input << endl; 733 if (input == NULL) { 734 cout << endl << "Unable to open " << line.str() << ", is the directory correct?" << endl; 735 return false; 736 } 737 for (int i=0;(i<MatrixCounter) && (!input.eof());i++) { 738 // get the number of atoms for this fragment 739 input.getline(filename, 1023); 740 line.str(filename); 741 // parse the values 742 Indices[i] = (int *) Malloc(sizeof(int)*RowCounter[i], "HessianMatrix::ParseIndices: *Indices[]"); 743 FragmentNumber = FixedDigitNumber(MatrixCounter, i); 744 //cout << FRAGMENTPREFIX << FragmentNumber << "[" << RowCounter[i] << "]:"; 745 Free((void **)&FragmentNumber, "HessianMatrix::ParseIndices: *FragmentNumber"); 746 for(int j=0;(j<RowCounter[i]) && (!line.eof());j++) { 747 line >> Indices[i][j]; 748 //cout << " " << Indices[i][j]; 749 } 750 //cout << endl; 751 } 752 Indices[MatrixCounter] = (int *) Malloc(sizeof(int)*RowCounter[MatrixCounter], "HessianMatrix::ParseIndices: *Indices[]"); 753 for(int j=RowCounter[MatrixCounter];j--;) { 754 Indices[MatrixCounter][j] = j; 755 } 756 input.close(); 757 return true; 758 }; 759 760 761 /** Sums the hessian entries and puts into last element of \a HessianMatrix::Matrix. 762 * \param Matrix MatrixContainer with matrices (LevelCounter by *ColumnCounter) with all the energies. 763 * \param KeySet KeySetContainer with bond Order and association mapping of each fragment to an order 764 * \param Order bond order 765 * \param sign +1 or -1 766 * \return true if summing was successful 767 */ 768 bool HessianMatrix::SumSubHessians(class HessianMatrix &Fragments, class KeySetsContainer &KeySet, int Order, double sign) 769 { 770 int FragmentNr; 771 // sum forces 772 for(int i=0;i<KeySet.FragmentsPerOrder[Order];i++) { 773 FragmentNr = KeySet.OrderSet[Order][i]; 774 for(int l=0;l<RowCounter[ FragmentNr ];l++) { 775 int j = Indices[ FragmentNr ][l]; 776 if (j > RowCounter[MatrixCounter]) { 777 cerr << "Current hessian index " << j << " is greater than " << RowCounter[MatrixCounter] << ", where i=" << i << ", Order=" << Order << ", l=" << l << " and FragmentNr=" << FragmentNr << "!" << endl; 778 return false; 779 } 780 if (j != -1) { 781 for(int m=0;m<ColumnCounter[ FragmentNr ];m++) { 782 int k = Indices[ FragmentNr ][m]; 783 if (k > ColumnCounter[MatrixCounter]) { 784 cerr << "Current hessian index " << k << " is greater than " << ColumnCounter[MatrixCounter] << ", where m=" << m << ", j=" << j << ", i=" << i << ", Order=" << Order << ", l=" << l << " and FragmentNr=" << FragmentNr << "!" << endl; 785 return false; 786 } 787 if (k != -1) { 788 //cout << "Adding " << sign*Fragments.Matrix[ FragmentNr ][l][m] << " from [" << l << "][" << m << "] onto [" << j << "][" << k << "]." << endl; 789 Matrix[MatrixCounter][j][k] += sign*Fragments.Matrix[ FragmentNr ][l][m]; 790 } 791 } 792 } 793 } 794 } 795 return true; 796 }; 797 798 /** Constructor for class HessianMatrix. 799 */ 800 HessianMatrix::HessianMatrix() : MatrixContainer() 801 { 802 IsSymmetric = true; 803 } 804 805 /** Sums the hessian entries with each factor and put into last element of \a ***Matrix. 806 * Sums over "E"-terms to create the "F"-terms 807 * \param Matrix MatrixContainer with matrices (LevelCounter by *ColumnCounter) with all the energies. 808 * \param KeySet KeySetContainer with bond Order and association mapping of each fragment to an order 809 * \param Order bond order 810 * \return true if summing was successful 811 */ 812 bool HessianMatrix::SumSubManyBodyTerms(class MatrixContainer &MatrixValues, class KeySetsContainer &KeySet, int Order) 813 { 814 // go through each order 815 for (int CurrentFragment=0;CurrentFragment<KeySet.FragmentsPerOrder[Order];CurrentFragment++) { 816 //cout << "Current Fragment is " << CurrentFragment << "/" << KeySet.OrderSet[Order][CurrentFragment] << "." << endl; 817 // then go per order through each suborder and pick together all the terms that contain this fragment 818 for(int SubOrder=0;SubOrder<=Order;SubOrder++) { // go through all suborders up to the desired order 819 for (int j=0;j<KeySet.FragmentsPerOrder[SubOrder];j++) { // go through all possible fragments of size suborder 820 if (KeySet.Contains(KeySet.OrderSet[Order][CurrentFragment], KeySet.OrderSet[SubOrder][j])) { 821 //cout << "Current other fragment is " << j << "/" << KeySet.OrderSet[SubOrder][j] << "." << endl; 822 // if the fragment's indices are all in the current fragment 823 for(int k=0;k<RowCounter[ KeySet.OrderSet[SubOrder][j] ];k++) { // go through all atoms in this fragment 824 int m = MatrixValues.Indices[ KeySet.OrderSet[SubOrder][j] ][k]; 825 //cout << "Current row index is " << k << "/" << m << "." << endl; 826 if (m != -1) { // if it's not an added hydrogen 827 for (int l=0;l<RowCounter[ KeySet.OrderSet[Order][CurrentFragment] ];l++) { // look for the corresponding index in the current fragment 828 //cout << "Comparing " << m << " with " << MatrixValues.Indices[ KeySet.OrderSet[Order][CurrentFragment] ][l] << "." << endl; 829 if (m == MatrixValues.Indices[ KeySet.OrderSet[Order][CurrentFragment] ][l]) { 830 m = l; 831 break; 832 } 833 } 834 //cout << "Corresponding row index for " << k << " in CurrentFragment is " << m << "." << endl; 835 if (m > RowCounter[ KeySet.OrderSet[Order][CurrentFragment] ]) { 836 cerr << "In fragment No. " << KeySet.OrderSet[Order][CurrentFragment] << " current row index " << m << " is greater than " << RowCounter[ KeySet.OrderSet[Order][CurrentFragment] ] << "!" << endl; 837 return false; 838 } 839 840 for(int l=0;l<ColumnCounter[ KeySet.OrderSet[SubOrder][j] ];l++) { 841 int n = MatrixValues.Indices[ KeySet.OrderSet[SubOrder][j] ][l]; 842 //cout << "Current column index is " << l << "/" << n << "." << endl; 843 if (n != -1) { // if it's not an added hydrogen 844 for (int p=0;p<ColumnCounter[ KeySet.OrderSet[Order][CurrentFragment] ];p++) { // look for the corresponding index in the current fragment 845 //cout << "Comparing " << n << " with " << MatrixValues.Indices[ KeySet.OrderSet[Order][CurrentFragment] ][p] << "." << endl; 846 if (n == MatrixValues.Indices[ KeySet.OrderSet[Order][CurrentFragment] ][p]) { 847 n = p; 848 break; 849 } 850 } 851 //cout << "Corresponding column index for " << l << " in CurrentFragment is " << n << "." << endl; 852 if (n > ColumnCounter[ KeySet.OrderSet[Order][CurrentFragment] ]) { 853 cerr << "In fragment No. " << KeySet.OrderSet[Order][CurrentFragment] << " current column index " << n << " is greater than " << ColumnCounter[ KeySet.OrderSet[Order][CurrentFragment] ] << "!" << endl; 854 return false; 855 } 856 if (Order == SubOrder) { // equal order is always copy from Energies 857 //cout << "Adding " << MatrixValues.Matrix[ KeySet.OrderSet[SubOrder][j] ][k][l] << " from [" << k << "][" << l << "] onto [" << m << "][" << n << "]." << endl; 858 Matrix[ KeySet.OrderSet[Order][CurrentFragment] ][m][n] += MatrixValues.Matrix[ KeySet.OrderSet[SubOrder][j] ][k][l]; 859 } else { 860 //cout << "Subtracting " << Matrix[ KeySet.OrderSet[SubOrder][j] ][k][l] << " from [" << k << "][" << l << "] onto [" << m << "][" << n << "]." << endl; 861 Matrix[ KeySet.OrderSet[Order][CurrentFragment] ][m][n] -= Matrix[ KeySet.OrderSet[SubOrder][j] ][k][l]; 862 } 863 } 864 } 865 } 866 //if ((ColumnCounter[ KeySet.OrderSet[SubOrder][j] ]>1) && (RowCounter[0]-1 >= 1)) 867 //cout << "Fragments[ KeySet.OrderSet[" << Order << "][" << CurrentFragment << "]=" << KeySet.OrderSet[Order][CurrentFragment] << " ][" << RowCounter[0]-1 << "][" << 1 << "] = " << Matrix[ KeySet.OrderSet[Order][CurrentFragment] ][RowCounter[0]-1][1] << endl; 868 } 869 } else { 870 //cout << "Fragment " << KeySet.OrderSet[SubOrder][j] << " is not contained in fragment " << KeySet.OrderSet[Order][CurrentFragment] << "." << endl; 871 } 872 } 873 } 874 //cout << "Final Fragments[ KeySet.OrderSet[" << Order << "][" << CurrentFragment << "]=" << KeySet.OrderSet[Order][CurrentFragment] << " ][" << KeySet.AtomCounter[0]-1 << "][" << 1 << "] = " << Matrix[ KeySet.OrderSet[Order][CurrentFragment] ][KeySet.AtomCounter[0]-1][1] << endl; 875 } 876 877 return true; 878 }; 879 880 /** Calls MatrixContainer::ParseFragmentMatrix() and additionally allocates last plus one matrix. 881 * \param *name directory with files 882 * \param *prefix prefix of each matrix file 883 * \param *suffix suffix of each matrix file 884 * \param skiplines number of inital lines to skip 885 * \param skiplines number of inital columns to skip 886 * \return parsing successful 887 */ 888 bool HessianMatrix::ParseFragmentMatrix(char *name, char *prefix, string suffix, int skiplines, int skipcolumns) 889 { 890 char filename[1023]; 891 ifstream input; 892 stringstream file; 893 int nr; 894 bool status = MatrixContainer::ParseFragmentMatrix(name, prefix, suffix, skiplines, skipcolumns); 895 896 if (status) { 897 // count number of atoms for last plus one matrix 898 file << name << FRAGMENTPREFIX << KEYSETFILE; 899 input.open(file.str().c_str(), ios::in); 900 if (input == NULL) { 901 cout << endl << "Unable to open " << file.str() << ", is the directory correct?" << endl; 902 return false; 903 } 904 RowCounter[MatrixCounter] = 0; 905 ColumnCounter[MatrixCounter] = 0; 906 while (!input.eof()) { 907 input.getline(filename, 1023); 908 stringstream zeile(filename); 909 while (!zeile.eof()) { 910 zeile >> nr; 911 //cout << "Current index: " << nr << "." << endl; 912 if (nr > RowCounter[MatrixCounter]) { 913 RowCounter[MatrixCounter] = nr; 914 ColumnCounter[MatrixCounter] = nr; 915 } 916 } 917 } 918 RowCounter[MatrixCounter]++; // nr start at 0, count starts at 1 919 ColumnCounter[MatrixCounter]++; // nr start at 0, count starts at 1 920 input.close(); 921 922 // allocate last plus one matrix 923 cout << "Allocating last plus one matrix with " << (RowCounter[MatrixCounter]+1) << " rows and " << ColumnCounter[MatrixCounter] << " columns." << endl; 924 Matrix[MatrixCounter] = (double **) Malloc(sizeof(double *)*(RowCounter[MatrixCounter]+1), "MatrixContainer::ParseFragmentMatrix: **Matrix[]"); 925 for(int j=0;j<=RowCounter[MatrixCounter];j++) 926 Matrix[MatrixCounter][j] = (double *) Malloc(sizeof(double)*ColumnCounter[MatrixCounter], "MatrixContainer::ParseFragmentMatrix: *Matrix[][]"); 927 928 // try independently to parse global forcesuffix file if present 929 strncpy(filename, name, 1023); 930 strncat(filename, prefix, 1023-strlen(filename)); 931 strncat(filename, suffix.c_str(), 1023-strlen(filename)); 932 ParseMatrix(filename, skiplines, skipcolumns, MatrixCounter); 933 } 934 935 936 return status; 673 937 }; 674 938 … … 678 942 */ 679 943 KeySetsContainer::KeySetsContainer() { 680 681 682 683 684 685 944 KeySets = NULL; 945 AtomCounter = NULL; 946 FragmentCounter = 0; 947 Order = 0; 948 FragmentsPerOrder = 0; 949 OrderSet = NULL; 686 950 }; 687 951 … … 689 953 */ 690 954 KeySetsContainer::~KeySetsContainer() { 691 692 693 694 695 696 697 698 955 for(int i=FragmentCounter;i--;) 956 Free((void **)&KeySets[i], "KeySetsContainer::~KeySetsContainer: *KeySets[]"); 957 for(int i=Order;i--;) 958 Free((void **)&OrderSet[i], "KeySetsContainer::~KeySetsContainer: *OrderSet[]"); 959 Free((void **)&KeySets, "KeySetsContainer::~KeySetsContainer: **KeySets"); 960 Free((void **)&OrderSet, "KeySetsContainer::~KeySetsContainer: **OrderSet"); 961 Free((void **)&AtomCounter, "KeySetsContainer::~KeySetsContainer: *AtomCounter"); 962 Free((void **)&FragmentsPerOrder, "KeySetsContainer::~KeySetsContainer: *FragmentsPerOrder"); 699 963 }; 700 964 … … 706 970 */ 707 971 bool KeySetsContainer::ParseKeySets(const char *name, const int *ACounter, const int FCounter) { 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 972 ifstream input; 973 char *FragmentNumber = NULL; 974 stringstream file; 975 char filename[1023]; 976 977 FragmentCounter = FCounter; 978 cout << "Parsing key sets." << endl; 979 KeySets = (int **) Malloc(sizeof(int *)*FragmentCounter, "KeySetsContainer::ParseKeySets: **KeySets"); 980 for(int i=FragmentCounter;i--;) 981 KeySets[i] = NULL; 982 file << name << FRAGMENTPREFIX << KEYSETFILE; 983 input.open(file.str().c_str(), ios::in); 984 if (input == NULL) { 985 cout << endl << "Unable to open " << file.str() << ", is the directory correct?" << endl; 986 return false; 987 } 988 989 AtomCounter = (int *) Malloc(sizeof(int)*FragmentCounter, "KeySetsContainer::ParseKeySets: *RowCounter"); 990 for(int i=0;(i<FragmentCounter) && (!input.eof());i++) { 991 stringstream line; 992 AtomCounter[i] = ACounter[i]; 993 // parse the values 994 KeySets[i] = (int *) Malloc(sizeof(int)*AtomCounter[i], "KeySetsContainer::ParseKeySets: *KeySets[]"); 995 for(int j=AtomCounter[i];j--;) 996 KeySets[i][j] = -1; 997 FragmentNumber = FixedDigitNumber(FragmentCounter, i); 998 //cout << FRAGMENTPREFIX << FragmentNumber << "[" << AtomCounter[i] << "]:"; 999 Free((void **)&FragmentNumber, "KeySetsContainer::ParseKeySets: *FragmentNumber"); 1000 input.getline(filename, 1023); 1001 line.str(filename); 1002 for(int j=0;(j<AtomCounter[i]) && (!line.eof());j++) { 1003 line >> KeySets[i][j]; 1004 //cout << " " << KeySets[i][j]; 1005 } 1006 //cout << endl; 1007 } 1008 input.close(); 1009 return true; 746 1010 }; 747 1011 … … 751 1015 bool KeySetsContainer::ParseManyBodyTerms() 752 1016 { 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 1017 int Counter; 1018 1019 cout << "Creating Fragment terms." << endl; 1020 // scan through all to determine maximum order 1021 Order=0; 1022 for(int i=FragmentCounter;i--;) { 1023 Counter=0; 1024 for(int j=AtomCounter[i];j--;) 1025 if (KeySets[i][j] != -1) 1026 Counter++; 1027 if (Counter > Order) 1028 Order = Counter; 1029 } 1030 cout << "Found Order is " << Order << "." << endl; 1031 1032 // scan through all to determine fragments per order 1033 FragmentsPerOrder = (int *) Malloc(sizeof(int)*Order, "KeySetsContainer::ParseManyBodyTerms: *FragmentsPerOrder"); 1034 for(int i=Order;i--;) 1035 FragmentsPerOrder[i] = 0; 1036 for(int i=FragmentCounter;i--;) { 1037 Counter=0; 1038 for(int j=AtomCounter[i];j--;) 1039 if (KeySets[i][j] != -1) 1040 Counter++; 1041 FragmentsPerOrder[Counter-1]++; 1042 } 1043 for(int i=0;i<Order;i++) 1044 cout << "Found No. of Fragments of Order " << i+1 << " is " << FragmentsPerOrder[i] << "." << endl; 1045 1046 // scan through all to gather indices to each order set 1047 OrderSet = (int **) Malloc(sizeof(int *)*Order, "KeySetsContainer::ParseManyBodyTerms: **OrderSet"); 1048 for(int i=Order;i--;) 1049 OrderSet[i] = (int *) Malloc(sizeof(int)*FragmentsPerOrder[i], "KeySetsContainer::ParseManyBodyTermsKeySetsContainer::ParseManyBodyTerms: *OrderSet[]"); 1050 for(int i=Order;i--;) 1051 FragmentsPerOrder[i] = 0; 1052 for(int i=FragmentCounter;i--;) { 1053 Counter=0; 1054 for(int j=AtomCounter[i];j--;) 1055 if (KeySets[i][j] != -1) 1056 Counter++; 1057 OrderSet[Counter-1][FragmentsPerOrder[Counter-1]] = i; 1058 FragmentsPerOrder[Counter-1]++; 1059 } 1060 cout << "Printing OrderSet." << endl; 1061 for(int i=0;i<Order;i++) { 1062 for (int j=0;j<FragmentsPerOrder[i];j++) { 1063 cout << " " << OrderSet[i][j]; 1064 } 1065 cout << endl; 1066 } 1067 cout << endl; 1068 1069 1070 return true; 807 1071 }; 808 1072 … … 814 1078 bool KeySetsContainer::Contains(const int GreaterSet, const int SmallerSet) 815 1079 { 816 817 818 819 820 821 822 823 824 825 826 827 1080 bool result = true; 1081 bool intermediate; 1082 if ((GreaterSet < 0) || (SmallerSet < 0) || (GreaterSet > FragmentCounter) || (SmallerSet > FragmentCounter)) // index out of bounds 1083 return false; 1084 for(int i=AtomCounter[SmallerSet];i--;) { 1085 intermediate = false; 1086 for (int j=AtomCounter[GreaterSet];j--;) 1087 intermediate = (intermediate || ((KeySets[SmallerSet][i] == KeySets[GreaterSet][j]) || (KeySets[SmallerSet][i] == -1))); 1088 result = result && intermediate; 1089 } 1090 1091 return result; 828 1092 }; 829 1093
Note:
See TracChangeset
for help on using the changeset viewer.