Changes in src/datacreator.cpp [6ac7ee:ce5ac3]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/datacreator.cpp
r6ac7ee rce5ac3 1 1 /** \file datacreator.cpp 2 2 * 3 * Declarations of assisting functions in creating data and plot files. 4 * 3 * Declarations of assisting functions in creating data and plot files. 4 * 5 5 */ 6 6 … … 19 19 bool OpenOutputFile(ofstream &output, const char *dir, const char *filename) 20 20 { 21 22 23 24 25 26 27 28 29 }; 21 stringstream name; 22 name << dir << "/" << filename; 23 output.open(name.str().c_str(), ios::out); 24 if (output == NULL) { 25 cout << "Unable to open " << name.str() << " for writing, is directory correct?" << endl; 26 return false; 27 } 28 return true; 29 }; 30 30 31 31 /** Opens a file for appending with \a *filename in \a *dir. … … 37 37 bool AppendOutputFile(ofstream &output, const char *dir, const char *filename) 38 38 { 39 40 41 42 43 44 45 46 47 }; 39 stringstream name; 40 name << dir << "/" << filename; 41 output.open(name.str().c_str(), ios::app); 42 if (output == NULL) { 43 cout << "Unable to open " << name.str() << " for writing, is directory correct?" << endl; 44 return false; 45 } 46 return true; 47 }; 48 48 49 49 /** Plots an energy vs. order. … … 54 54 * \return true if file was written successfully 55 55 */ 56 bool CreateDataEnergyOrder(class EnergyMatrix &Fragments, class KeySetsContainer &KeySet, char *dir, char *prefix, char *msg, char *datum) 57 { 58 59 60 61 62 if (!OpenOutputFile(output, dir, filename.str().c_str())) return false; 63 64 65 output << "#Order\tFrag.No.\t" << Fragments.Header<< endl;66 67 68 69 for(int k=Fragments.ColumnCounter;k--;)70 71 72 73 for (int l=0;l<Fragments.ColumnCounter;l++)74 75 76 77 78 56 bool CreateDataEnergyOrder(class EnergyMatrix &Fragments, class KeySetsContainer &KeySet, char *dir, char *prefix, char *msg, char *datum) 57 { 58 stringstream filename; 59 ofstream output; 60 61 filename << prefix << ".dat"; 62 if (!OpenOutputFile(output, dir, filename.str().c_str())) return false; 63 cout << msg << endl; 64 output << "# " << msg << ", created on " << datum; 65 output << "#Order\tFrag.No.\t" << Fragments.Header[Fragments.MatrixCounter] << endl; 66 for (int BondOrder=0;BondOrder<KeySet.Order;BondOrder++) { 67 for(int i=KeySet.FragmentsPerOrder[BondOrder];i--;) { 68 for(int j=Fragments.RowCounter[ KeySet.OrderSet[BondOrder][i] ];j--;) 69 for(int k=Fragments.ColumnCounter[ KeySet.OrderSet[BondOrder][i] ];k--;) 70 Fragments.Matrix[Fragments.MatrixCounter][j][k] += Fragments.Matrix[ KeySet.OrderSet[BondOrder][i] ][j][k]; 71 } 72 output << BondOrder+1 << "\t" << KeySet.FragmentsPerOrder[BondOrder]; 73 for (int l=0;l<Fragments.ColumnCounter[Fragments.MatrixCounter];l++) 74 output << scientific << "\t" << Fragments.Matrix[Fragments.MatrixCounter][ Fragments.RowCounter[Fragments.MatrixCounter]-1 ][l]; 75 output << endl; 76 } 77 output.close(); 78 return true; 79 79 }; 80 80 … … 87 87 * \return true if file was written successfully 88 88 */ 89 bool CreateDataDeltaEnergyOrder(class EnergyMatrix &Energy, class EnergyMatrix &Fragments, class KeySetsContainer &KeySet, char *dir, char *prefix, char *msg, char *datum) 90 { 91 92 93 94 95 if (!OpenOutputFile(output, dir, filename.str().c_str())) return false; 96 97 98 output << "#Order\tFrag.No.\t" << Fragments.Header<< endl;99 100 101 102 103 for(int k=Fragments.ColumnCounter;k--;)104 105 106 107 for (int l=0;l<Fragments.ColumnCounter;l++)108 109 110 111 112 113 114 115 89 bool CreateDataDeltaEnergyOrder(class EnergyMatrix &Energy, class EnergyMatrix &Fragments, class KeySetsContainer &KeySet, char *dir, char *prefix, char *msg, char *datum) 90 { 91 stringstream filename; 92 ofstream output; 93 94 filename << prefix << ".dat"; 95 if (!OpenOutputFile(output, dir, filename.str().c_str())) return false; 96 cout << msg << endl; 97 output << "# " << msg << ", created on " << datum; 98 output << "#Order\tFrag.No.\t" << Fragments.Header[Fragments.MatrixCounter] << endl; 99 Fragments.SetLastMatrix(Energy.Matrix[Energy.MatrixCounter],0); 100 for (int BondOrder=0;BondOrder<KeySet.Order;BondOrder++) { 101 for(int i=KeySet.FragmentsPerOrder[BondOrder];i--;) { 102 for(int j=Fragments.RowCounter[ KeySet.OrderSet[BondOrder][i] ];j--;) 103 for(int k=Fragments.ColumnCounter[ KeySet.OrderSet[BondOrder][i] ];k--;) 104 Fragments.Matrix[Fragments.MatrixCounter][j][k] -= Fragments.Matrix[ KeySet.OrderSet[BondOrder][i] ][j][k]; 105 } 106 output << BondOrder+1 << "\t" << KeySet.FragmentsPerOrder[BondOrder]; 107 for (int l=0;l<Fragments.ColumnCounter[Energy.MatrixCounter];l++) 108 if (fabs(Energy.Matrix[Energy.MatrixCounter][ Energy.RowCounter[Energy.MatrixCounter]-1 ][l]) < MYEPSILON) 109 output << scientific << "\t" << Fragments.Matrix[Fragments.MatrixCounter][ Fragments.RowCounter[Fragments.MatrixCounter]-1 ][l]; 110 else 111 output << scientific << "\t" << (Fragments.Matrix[Fragments.MatrixCounter][ Fragments.RowCounter[Fragments.MatrixCounter]-1 ][l] / Energy.Matrix[Energy.MatrixCounter][ Energy.RowCounter[Energy.MatrixCounter]-1 ][l]); 112 output << endl; 113 } 114 output.close(); 115 return true; 116 116 }; 117 117 … … 126 126 bool CreateDataForcesOrder(class ForceMatrix &Fragments, class KeySetsContainer &KeySet, char *dir, char *prefix, char *msg, char *datum, void (*CreateForce)(class MatrixContainer &, int)) 127 127 { 128 129 130 131 132 if (!OpenOutputFile(output, dir, filename.str().c_str())) return false; 133 134 135 output << "# Order\tFrag.No.\t" << Fragments.Header<< endl;136 137 138 139 140 141 for (int l=0;l<Fragments.ColumnCounter;l++)142 143 144 145 146 128 stringstream filename; 129 ofstream output; 130 131 filename << prefix << ".dat"; 132 if (!OpenOutputFile(output, dir, filename.str().c_str())) return false; 133 cout << msg << endl; 134 output << "# " << msg << ", created on " << datum; 135 output << "# Order\tFrag.No.\t" << Fragments.Header[Fragments.MatrixCounter] << endl; 136 Fragments.SetLastMatrix(0.,0); 137 for (int BondOrder=0;BondOrder<KeySet.Order;BondOrder++) { 138 Fragments.SumSubForces(Fragments, KeySet, BondOrder, 1.); 139 output << BondOrder+1 << "\t" << KeySet.FragmentsPerOrder[BondOrder]; 140 CreateForce(Fragments, Fragments.MatrixCounter); 141 for (int l=0;l<Fragments.ColumnCounter[Fragments.MatrixCounter];l++) 142 output << scientific << "\t" << Fragments.Matrix[Fragments.MatrixCounter][ Fragments.RowCounter[Fragments.MatrixCounter] ][l]; 143 output << endl; 144 } 145 output.close(); 146 return true; 147 147 }; 148 148 … … 158 158 bool CreateDataDeltaForcesOrder(class ForceMatrix &Force, class ForceMatrix &Fragments, class KeySetsContainer &KeySet, char *dir, char *prefix, char *msg, char *datum, void (*CreateForce)(class MatrixContainer &, int)) 159 159 { 160 161 162 163 164 if (!OpenOutputFile(output, dir, filename.str().c_str())) return false; 165 166 167 output << "# Order\tFrag.No.\t" << Fragments.Header<< endl;168 169 170 171 172 173 for (int l=0;l<Fragments.ColumnCounter;l++)174 175 176 177 178 160 stringstream filename; 161 ofstream output; 162 163 filename << prefix << ".dat"; 164 if (!OpenOutputFile(output, dir, filename.str().c_str())) return false; 165 cout << msg << endl; 166 output << "# " << msg << ", created on " << datum; 167 output << "# Order\tFrag.No.\t" << Fragments.Header[Fragments.MatrixCounter] << endl; 168 Fragments.SetLastMatrix(Force.Matrix[Force.MatrixCounter],0); 169 for (int BondOrder=0;BondOrder<KeySet.Order;BondOrder++) { 170 Fragments.SumSubForces(Fragments, KeySet, BondOrder, -1.); 171 output << BondOrder+1 << "\t" << KeySet.FragmentsPerOrder[BondOrder]; 172 CreateForce(Fragments, Fragments.MatrixCounter); 173 for (int l=0;l<Fragments.ColumnCounter[Fragments.MatrixCounter];l++) 174 output << scientific << "\t" << Fragments.Matrix[Fragments.MatrixCounter][ Fragments.RowCounter[Fragments.MatrixCounter] ][l]; 175 output << endl; 176 } 177 output.close(); 178 return true; 179 179 }; 180 180 … … 188 188 * \return true if file was written successfully 189 189 */ 190 bool CreateDataDeltaForcesOrderPerAtom(class ForceMatrix &Force, class ForceMatrix &Fragments, class KeySetsContainer &KeySet, char *dir, char *prefix, char *msg, char *datum) 191 { 192 193 194 195 196 197 if (!OpenOutputFile(output, dir, filename.str().c_str())) return false; 198 199 200 output << "# AtomNo\t" << Fragments.Header<< endl;201 202 203 204 205 206 207 for(int j=0;j<Fragments.RowCounter[ Fragments.MatrixCounter ];j++) { 208 209 for (int l=0;l<Fragments.ColumnCounter;l++) {210 211 212 213 214 215 } 216 // 217 218 // 219 // 220 221 222 223 224 225 226 190 bool CreateDataDeltaForcesOrderPerAtom(class ForceMatrix &Force, class ForceMatrix &Fragments, class KeySetsContainer &KeySet, char *dir, char *prefix, char *msg, char *datum) 191 { 192 stringstream filename; 193 ofstream output; 194 double norm = 0.; 195 196 filename << prefix << ".dat"; 197 if (!OpenOutputFile(output, dir, filename.str().c_str())) return false; 198 cout << msg << endl; 199 output << "# " << msg << ", created on " << datum; 200 output << "# AtomNo\t" << Fragments.Header[Fragments.MatrixCounter] << endl; 201 Fragments.SetLastMatrix(Force.Matrix[Force.MatrixCounter], 0); 202 for (int BondOrder=0;BondOrder<KeySet.Order;BondOrder++) { 203 //cout << "Current order is " << BondOrder << "." << endl; 204 Fragments.SumSubForces(Fragments, KeySet, BondOrder, -1.); 205 // errors per atom 206 output << endl << "#Order\t" << BondOrder+1 << endl; 207 for(int j=0;j<Fragments.RowCounter[ Fragments.MatrixCounter ];j++) { 208 output << Fragments.Indices[Fragments.MatrixCounter][j] << "\t"; 209 for (int l=0;l<Fragments.ColumnCounter[ Fragments.MatrixCounter ];l++) { 210 if (((l+1) % 3) == 0) { 211 norm = 0.; 212 for (int m=0;m<NDIM;m++) 213 norm += Force.Matrix[Force.MatrixCounter][ j ][l+m]*Force.Matrix[Force.MatrixCounter][ j ][l+m]; 214 norm = sqrt(norm); 215 } 216 // if (norm < MYEPSILON) 217 output << scientific << Fragments.Matrix[Fragments.MatrixCounter][ j ][l] << "\t"; 218 // else 219 // output << scientific << (Fragments.Matrix[Fragments.MatrixCounter][ j ][l] / norm) << "\t"; 220 } 221 output << endl; 222 } 223 output << endl; 224 } 225 output.close(); 226 return true; 227 227 }; 228 228 … … 235 235 * \return true if file was written successfully 236 236 */ 237 bool CreateDataForcesOrderPerAtom(class ForceMatrix &Fragments, class KeySetsContainer &KeySet, char *dir, char *prefix, char *msg, char *datum) 238 { 239 stringstream filename; 240 ofstream output; 241 242 filename << prefix << ".dat"; 243 if (!OpenOutputFile(output, dir, filename.str().c_str())) return false; 244 cout << msg << endl; 245 output << "# " << msg << ", created on " << datum; 246 output << "# AtomNo\t" << Fragments.Header << endl; 247 for (int BondOrder=0;BondOrder<KeySet.Order;BondOrder++) { 248 //cout << "Current order is " << BondOrder << "." << endl; 249 Fragments.SumSubForces(Fragments, KeySet, BondOrder, 1.); 250 // errors per atom 251 output << endl << "#Order\t" << BondOrder+1 << endl; 252 for(int j=0;j<Fragments.RowCounter[ Fragments.MatrixCounter ];j++) { 253 output << Fragments.Indices[Fragments.MatrixCounter][j] << "\t"; 254 for (int l=0;l<Fragments.ColumnCounter;l++) 255 output << scientific << Fragments.Matrix[Fragments.MatrixCounter][ j ][l] << "\t"; 256 output << endl; 257 } 258 output << endl; 259 } 260 output.close(); 261 return true; 237 bool CreateDataForcesOrderPerAtom(class ForceMatrix &Fragments, class KeySetsContainer &KeySet, char *dir, char *prefix, char *msg, char *datum) 238 { 239 stringstream filename; 240 ofstream output; 241 242 filename << prefix << ".dat"; 243 if (!OpenOutputFile(output, dir, filename.str().c_str())) return false; 244 cout << msg << endl; 245 output << "# " << msg << ", created on " << datum; 246 output << "# AtomNo\t" << Fragments.Header[Fragments.MatrixCounter] << endl; 247 for (int BondOrder=0;BondOrder<KeySet.Order;BondOrder++) { 248 //cout << "Current order is " << BondOrder << "." << endl; 249 Fragments.SumSubForces(Fragments, KeySet, BondOrder, 1.); 250 // errors per atom 251 output << endl << "#Order\t" << BondOrder+1 << endl; 252 for(int j=0;j<Fragments.RowCounter[ Fragments.MatrixCounter ];j++) { 253 output << Fragments.Indices[Fragments.MatrixCounter][j] << "\t"; 254 for (int l=0;l<Fragments.ColumnCounter[ Fragments.MatrixCounter ];l++) 255 output << scientific << Fragments.Matrix[Fragments.MatrixCounter][ j ][l] << "\t"; 256 output << endl; 257 } 258 output << endl; 259 } 260 output.close(); 261 return true; 262 }; 263 264 265 /** Plot hessian error vs. vs atom vs. order. 266 * \param &Hessian HessianMatrix containing reference values (in MatrixCounter matrix) 267 * \param &Fragments HessianMatrix class containing matrix values 268 * \param KeySet KeySetContainer class holding bond KeySetContainer::Order 269 * \param *prefix prefix in filename (without ending) 270 * \param *msg message to be place in first line as a comment 271 * \param *datum current date and time 272 * \return true if file was written successfully 273 */ 274 bool CreateDataDeltaHessianOrderPerAtom(class HessianMatrix &Hessian, class HessianMatrix &Fragments, class KeySetsContainer &KeySet, char *dir, char *prefix, char *msg, char *datum) 275 { 276 stringstream filename; 277 ofstream output; 278 279 filename << prefix << ".dat"; 280 if (!OpenOutputFile(output, dir, filename.str().c_str())) return false; 281 cout << msg << endl; 282 output << "# " << msg << ", created on " << datum; 283 output << "# AtomNo\t" << Fragments.Header[Fragments.MatrixCounter] << endl; 284 Fragments.SetLastMatrix(Hessian.Matrix[Hessian.MatrixCounter], 0); 285 for (int BondOrder=0;BondOrder<KeySet.Order;BondOrder++) { 286 //cout << "Current order is " << BondOrder << "." << endl; 287 Fragments.SumSubHessians(Fragments, KeySet, BondOrder, -1.); 288 // errors per atom 289 output << endl << "#Order\t" << BondOrder+1 << endl; 290 for(int j=0;j<Fragments.RowCounter[ Fragments.MatrixCounter ];j++) { 291 output << Fragments.Indices[Fragments.MatrixCounter][j] << "\t"; 292 for (int l=0;l<Fragments.ColumnCounter[ Fragments.MatrixCounter ];l++) { 293 output << scientific << Fragments.Matrix[Fragments.MatrixCounter][ j ][l] << "\t"; 294 } 295 output << endl; 296 } 297 output << endl; 298 } 299 output.close(); 300 return true; 301 }; 302 303 /** Plot hessian error vs. vs atom vs. order in the frobenius norm. 304 * \param &Hessian HessianMatrix containing reference values (in MatrixCounter matrix) 305 * \param &Fragments HessianMatrix class containing matrix values 306 * \param KeySet KeySetContainer class holding bond KeySetContainer::Order 307 * \param *prefix prefix in filename (without ending) 308 * \param *msg message to be place in first line as a comment 309 * \param *datum current date and time 310 * \return true if file was written successfully 311 */ 312 bool CreateDataDeltaFrobeniusOrderPerAtom(class HessianMatrix &Hessian, class HessianMatrix &Fragments, class KeySetsContainer &KeySet, char *dir, char *prefix, char *msg, char *datum) 313 { 314 stringstream filename; 315 ofstream output; 316 double norm = 0; 317 double tmp; 318 319 filename << prefix << ".dat"; 320 if (!OpenOutputFile(output, dir, filename.str().c_str())) return false; 321 cout << msg << endl; 322 output << "# " << msg << ", created on " << datum; 323 output << "# AtomNo\t"; 324 Fragments.SetLastMatrix(Hessian.Matrix[Hessian.MatrixCounter], 0); 325 for (int BondOrder=0;BondOrder<KeySet.Order;BondOrder++) { 326 output << "Order" << BondOrder+1 << "\t"; 327 } 328 output << endl; 329 output << Fragments.RowCounter[ Fragments.MatrixCounter ] << "\t"; 330 for (int BondOrder=0;BondOrder<KeySet.Order;BondOrder++) { 331 //cout << "Current order is " << BondOrder << "." << endl; 332 Fragments.SumSubHessians(Fragments, KeySet, BondOrder, -1.); 333 // frobenius norm of errors per atom 334 norm = 0.; 335 for(int j=0;j<Fragments.RowCounter[ Fragments.MatrixCounter ];j++) { 336 for (int l=0;l<Fragments.ColumnCounter[ Fragments.MatrixCounter ];l++) { 337 tmp = Fragments.Matrix[Fragments.MatrixCounter][ j ][l]; 338 norm += tmp*tmp; 339 } 340 } 341 output << scientific << sqrt(norm)/(Fragments.RowCounter[ Fragments.MatrixCounter ]*Fragments.ColumnCounter[ Fragments.MatrixCounter] ) << "\t"; 342 } 343 output << endl; 344 output.close(); 345 return true; 346 }; 347 348 /** Plot hessian error vs. vs atom vs. order. 349 * \param &Fragments HessianMatrix class containing matrix values 350 * \param KeySet KeySetContainer class holding bond KeySetContainer::Order 351 * \param *prefix prefix in filename (without ending) 352 * \param *msg message to be place in first line as a comment 353 * \param *datum current date and time 354 * \return true if file was written successfully 355 */ 356 bool CreateDataHessianOrderPerAtom(class HessianMatrix &Fragments, class KeySetsContainer &KeySet, char *dir, char *prefix, char *msg, char *datum) 357 { 358 stringstream filename; 359 ofstream output; 360 361 filename << prefix << ".dat"; 362 if (!OpenOutputFile(output, dir, filename.str().c_str())) return false; 363 cout << msg << endl; 364 output << "# " << msg << ", created on " << datum; 365 output << "# AtomNo\t" << Fragments.Header[ Fragments.MatrixCounter ] << endl; 366 Fragments.SetLastMatrix(0., 0); 367 for (int BondOrder=0;BondOrder<KeySet.Order;BondOrder++) { 368 //cout << "Current order is " << BondOrder << "." << endl; 369 Fragments.SumSubHessians(Fragments, KeySet, BondOrder, 1.); 370 // errors per atom 371 output << endl << "#Order\t" << BondOrder+1 << endl; 372 for(int j=0;j<Fragments.RowCounter[ Fragments.MatrixCounter ];j++) { 373 output << Fragments.Indices[Fragments.MatrixCounter][j] << "\t"; 374 for (int l=0;l<Fragments.ColumnCounter[ Fragments.MatrixCounter ];l++) 375 output << scientific << Fragments.Matrix[Fragments.MatrixCounter][ j ][l] << "\t"; 376 output << endl; 377 } 378 output << endl; 379 } 380 output.close(); 381 return true; 262 382 }; 263 383 … … 266 386 bool CreateDataFragment(class MatrixContainer &Fragment, class KeySetsContainer &KeySet, char *dir, char *prefix, char *msg, char *datum, void (*CreateFragment)(class MatrixContainer &, int)) 267 387 { 268 269 270 271 272 if (!OpenOutputFile(output, dir, filename.str().c_str())) return false; 273 274 275 output << "#Order\tFrag.No.\t" << Fragment.Header<< endl;276 277 278 279 280 for (int l=0;l<Fragment.ColumnCounter;l++)281 282 283 284 285 286 388 stringstream filename; 389 ofstream output; 390 391 filename << prefix << ".dat"; 392 if (!OpenOutputFile(output, dir, filename.str().c_str())) return false; 393 cout << msg << endl; 394 output << "# " << msg << ", created on " << datum << endl; 395 output << "#Order\tFrag.No.\t" << Fragment.Header[ Fragment.MatrixCounter ] << endl; 396 for (int BondOrder=0;BondOrder<KeySet.Order;BondOrder++) { 397 for(int i=0;i<KeySet.FragmentsPerOrder[BondOrder];i++) { 398 output << BondOrder+1 << "\t" << KeySet.OrderSet[BondOrder][i]+1; 399 CreateFragment(Fragment, KeySet.OrderSet[BondOrder][i]); 400 for (int l=0;l<Fragment.ColumnCounter[ KeySet.OrderSet[BondOrder][i] ];l++) 401 output << scientific << "\t" << Fragment.Matrix[ KeySet.OrderSet[BondOrder][i] ][ Fragment.RowCounter[ KeySet.OrderSet[BondOrder][i] ] ][l]; 402 output << endl; 403 } 404 } 405 output.close(); 406 return true; 287 407 }; 288 408 … … 291 411 * \param &KeySet KeySetsContainer with associations of each fragment to a bond order 292 412 * \param BondOrder current bond order 293 */ 413 */ 294 414 void CreateMaxFragmentOrder(class MatrixContainer &Fragments, class KeySetsContainer &KeySet, int BondOrder) 295 415 { 296 297 298 299 for (int k=Fragments.ColumnCounter;k--;)300 301 302 } 303 416 for(int j=Fragments.RowCounter[ Fragments.MatrixCounter ];j--;) { 417 for(int i=KeySet.FragmentsPerOrder[BondOrder];i--;) { 418 if (fabs(Fragments.Matrix[ Fragments.MatrixCounter ][j][1]) < fabs(Fragments.Matrix[ KeySet.OrderSet[BondOrder][i] ][j][1])) { 419 for (int k=Fragments.ColumnCounter[ Fragments.MatrixCounter ];k--;) 420 Fragments.Matrix[ Fragments.MatrixCounter ][j][k] = Fragments.Matrix[ KeySet.OrderSet[BondOrder][i] ][j][k]; 421 } 422 } 423 } 304 424 }; 305 425 … … 308 428 * \param &KeySet KeySetsContainer with associations of each fragment to a bond order 309 429 * \param BondOrder current bond order 310 */ 430 */ 311 431 void CreateMinFragmentOrder(class MatrixContainer &Fragments, class KeySetsContainer &KeySet, int BondOrder) 312 432 { 313 314 315 do {// first get a minimum value unequal to 0316 for (int k=Fragments.ColumnCounter;k--;)317 318 319 320 321 322 for (int k=Fragments.ColumnCounter;k--;)323 324 325 } 326 433 for(int j=0;j<Fragments.RowCounter[ Fragments.MatrixCounter ];j++) { 434 int i=0; 435 do { // first get a minimum value unequal to 0 436 for (int k=Fragments.ColumnCounter[ Fragments.MatrixCounter ];k--;) 437 Fragments.Matrix[ Fragments.MatrixCounter ][j][k] = Fragments.Matrix[ KeySet.OrderSet[BondOrder][i] ][j][k]; 438 i++; 439 } while ((fabs(Fragments.Matrix[ Fragments.MatrixCounter ][j][1]) < MYEPSILON) && (i<KeySet.FragmentsPerOrder[BondOrder])); 440 for(;i<KeySet.FragmentsPerOrder[BondOrder];i++) { // then find lowest 441 if (fabs(Fragments.Matrix[ Fragments.MatrixCounter ][j][1]) > fabs(Fragments.Matrix[ KeySet.OrderSet[BondOrder][i] ][j][1])) { 442 for (int k=Fragments.ColumnCounter[ Fragments.MatrixCounter ];k--;) 443 Fragments.Matrix[ Fragments.MatrixCounter ][j][k] = Fragments.Matrix[ KeySet.OrderSet[BondOrder][i] ][j][k]; 444 } 445 } 446 } 327 447 }; 328 448 … … 331 451 bool CreateDataFragmentOrder(class MatrixContainer &Fragment, class KeySetsContainer &KeySet, char *dir, char *prefix, char *msg, char *datum, void (*CreateFragmentOrder)(class MatrixContainer &, class KeySetsContainer &, int)) 332 452 { 333 334 335 336 337 if (!OpenOutputFile(output, dir, filename.str().c_str())) return false; 338 339 340 output << "#Order\tFrag.No.\t" << Fragment.Header<< endl;341 342 343 344 345 346 for (int l=0;l<Fragment.ColumnCounter;l++)347 348 349 350 351 453 stringstream filename; 454 ofstream output; 455 456 filename << prefix << ".dat"; 457 if (!OpenOutputFile(output, dir, filename.str().c_str())) return false; 458 cout << msg << endl; 459 output << "# " << msg << ", created on " << datum; 460 output << "#Order\tFrag.No.\t" << Fragment.Header[ Fragment.MatrixCounter ] << endl; 461 // max 462 for (int BondOrder=0;BondOrder<KeySet.Order;BondOrder++) { 463 Fragment.SetLastMatrix(0.,0); 464 CreateFragmentOrder(Fragment, KeySet, BondOrder); 465 output << BondOrder+1 << "\t" << KeySet.FragmentsPerOrder[BondOrder]; 466 for (int l=0;l<Fragment.ColumnCounter[ Fragment.MatrixCounter ];l++) 467 output << scientific << "\t" << Fragment.Matrix[ Fragment.MatrixCounter ][ Fragment.RowCounter[ Fragment.MatrixCounter ]-1 ][l]; 468 output << endl; 469 } 470 output.close(); 471 return true; 352 472 }; 353 473 … … 358 478 void CreateEnergy(class MatrixContainer &Energy, int MatrixNumber) 359 479 { 360 for(int k=0;k<Energy.ColumnCounter;k++)361 Energy.Matrix[MatrixNumber][ Energy.RowCounter[MatrixNumber] ] [k] =Energy.Matrix[MatrixNumber][ Energy.RowCounter[MatrixNumber]-1 ] [k];480 for(int k=0;k<Energy.ColumnCounter[MatrixNumber];k++) 481 Energy.Matrix[MatrixNumber][ Energy.RowCounter[MatrixNumber] ] [k] = Energy.Matrix[MatrixNumber][ Energy.RowCounter[MatrixNumber]-1 ] [k]; 362 482 }; 363 483 … … 369 489 void CreateMinimumForce(class MatrixContainer &Force, int MatrixNumber) 370 490 { 371 for (int l=Force.ColumnCounter;l--;)372 373 for (int l=5;l<Force.ColumnCounter;l+=3) {374 375 376 377 378 stored += Force.Matrix[MatrixNumber][ k ][l+m] 379 380 Force.Matrix[MatrixNumber][ Force.RowCounter[MatrixNumber] ][l+m] = Force.Matrix[MatrixNumber][ k ][l+m]; 381 382 383 384 385 386 387 tmp += Force.Matrix[MatrixNumber][ k ][l+m] 388 389 if ((fabs(tmp) > MYEPSILON) && (tmp < stored)) {// current force is greater than stored390 391 Force.Matrix[MatrixNumber][ Force.RowCounter[MatrixNumber] ][l+m] = Force.Matrix[MatrixNumber][ k ][l+m]; 392 393 394 395 491 for (int l=Force.ColumnCounter[MatrixNumber];l--;) 492 Force.Matrix[MatrixNumber][ Force.RowCounter[MatrixNumber] ][l] = 0.; 493 for (int l=5;l<Force.ColumnCounter[MatrixNumber];l+=3) { 494 double stored = 0; 495 int k=0; 496 do { 497 for (int m=NDIM;m--;) { 498 stored += Force.Matrix[MatrixNumber][ k ][l+m] 499 * Force.Matrix[MatrixNumber][ k ][l+m]; 500 Force.Matrix[MatrixNumber][ Force.RowCounter[MatrixNumber] ][l+m] = Force.Matrix[MatrixNumber][ k ][l+m]; 501 } 502 k++; 503 } while ((fabs(stored) < MYEPSILON) && (k<Force.RowCounter[MatrixNumber])); 504 for (;k<Force.RowCounter[MatrixNumber];k++) { 505 double tmp = 0; 506 for (int m=NDIM;m--;) 507 tmp += Force.Matrix[MatrixNumber][ k ][l+m] 508 * Force.Matrix[MatrixNumber][ k ][l+m]; 509 if ((fabs(tmp) > MYEPSILON) && (tmp < stored)) { // current force is greater than stored 510 for (int m=NDIM;m--;) 511 Force.Matrix[MatrixNumber][ Force.RowCounter[MatrixNumber] ][l+m] = Force.Matrix[MatrixNumber][ k ][l+m]; 512 stored = tmp; 513 } 514 } 515 } 396 516 }; 397 517 … … 399 519 * Results are stored in the matrix ForceMatrix::MatrixCounter of \a Force. 400 520 * \param Force ForceMatrix class containing matrix values 401 521 * \param MatrixNumber the index for the ForceMatrix::matrix array 402 522 */ 403 523 void CreateMeanForce(class MatrixContainer &Force, int MatrixNumber) 404 524 { 405 406 for (int l=Force.ColumnCounter;l--;)407 408 for (int l=5;l<Force.ColumnCounter;l+=3) {409 410 411 412 413 norm += Force.Matrix[MatrixNumber][ k ][l+m] 414 415 416 417 418 419 420 525 int divisor = 0; 526 for (int l=Force.ColumnCounter[MatrixNumber];l--;) 527 Force.Matrix[MatrixNumber][ Force.RowCounter[MatrixNumber] ][l] = 0.; 528 for (int l=5;l<Force.ColumnCounter[MatrixNumber];l+=3) { 529 double tmp = 0; 530 for (int k=Force.RowCounter[MatrixNumber];k--;) { 531 double norm = 0.; 532 for (int m=NDIM;m--;) 533 norm += Force.Matrix[MatrixNumber][ k ][l+m] 534 * Force.Matrix[MatrixNumber][ k ][l+m]; 535 tmp += sqrt(norm); 536 if (fabs(norm) > MYEPSILON) divisor++; 537 } 538 tmp /= (double)divisor; 539 Force.Matrix[MatrixNumber][ Force.RowCounter[MatrixNumber] ][l] = tmp; 540 } 421 541 }; 422 542 … … 428 548 void CreateMaximumForce(class MatrixContainer &Force, int MatrixNumber) 429 549 { 430 for (int l=5;l<Force.ColumnCounter;l+=3) {431 432 433 434 435 tmp += Force.Matrix[MatrixNumber][ k ][l+m] 436 437 if (tmp > stored) {// current force is greater than stored438 439 Force.Matrix[MatrixNumber][ Force.RowCounter[MatrixNumber] ][l+m] = Force.Matrix[MatrixNumber][ k ][l+m]; 440 441 442 443 550 for (int l=5;l<Force.ColumnCounter[MatrixNumber];l+=3) { 551 double stored = 0; 552 for (int k=Force.RowCounter[MatrixNumber];k--;) { 553 double tmp = 0; 554 for (int m=NDIM;m--;) 555 tmp += Force.Matrix[MatrixNumber][ k ][l+m] 556 * Force.Matrix[MatrixNumber][ k ][l+m]; 557 if (tmp > stored) { // current force is greater than stored 558 for (int m=NDIM;m--;) 559 Force.Matrix[MatrixNumber][ Force.RowCounter[MatrixNumber] ][l+m] = Force.Matrix[MatrixNumber][ k ][l+m]; 560 stored = tmp; 561 } 562 } 563 } 444 564 }; 445 565 … … 450 570 void CreateSameForce(class MatrixContainer &Force, int MatrixNumber) 451 571 { 452 572 // does nothing 453 573 }; 454 574 … … 460 580 void CreateVectorSumForce(class MatrixContainer &Force, int MatrixNumber) 461 581 { 462 for (int l=Force.ColumnCounter;l--;)463 464 for (int l=0;l<Force.ColumnCounter;l++) {465 466 467 582 for (int l=Force.ColumnCounter[MatrixNumber];l--;) 583 Force.Matrix[MatrixNumber][ Force.RowCounter[MatrixNumber] ][l] = 0.; 584 for (int l=0;l<Force.ColumnCounter[MatrixNumber];l++) { 585 for (int k=Force.RowCounter[MatrixNumber];k--;) 586 Force.Matrix[MatrixNumber][ Force.RowCounter[MatrixNumber] ][l] += Force.Matrix[MatrixNumber][k][l]; 587 } 468 588 }; 469 589 … … 472 592 * \param *key position of key 473 593 * \param *logscale axis for logscale 474 * \param *extraline extra set lines if desired 594 * \param *extraline extra set lines if desired 475 595 * \param mxtics small tics at ... 476 596 * \param xtics large tics at ... 477 * \param *xlabel label for x axis 597 * \param *xlabel label for x axis 478 598 * \param *ylabel label for y axis 479 */ 599 */ 480 600 void CreatePlotHeader(ofstream &output, const char *prefix, const int keycolumns, const char *key, const char *logscale, const char *extraline, const int mxtics, const int xtics, const char *xlabel, const char *ylabel) 481 601 { 482 483 484 485 486 487 488 489 490 491 492 493 494 495 602 //output << "#!/home/heber/build/pyxplot/pyxplot" << endl << endl; 603 output << "reset" << endl; 604 output << "set keycolumns "<< keycolumns << endl; 605 output << "set key " << key << endl; 606 output << "set mxtics "<< mxtics << endl; 607 output << "set xtics "<< xtics << endl; 608 if (logscale != NULL) 609 output << "set logscale " << logscale << endl; 610 if (extraline != NULL) 611 output << extraline << endl; 612 output << "set xlabel '" << xlabel << "'" << endl; 613 output << "set ylabel '" << ylabel << "'" << endl; 614 output << "set terminal eps color" << endl; 615 output << "set output '"<< prefix << ".eps'" << endl; 496 616 }; 497 617 … … 506 626 * \param mxtics small tics at ... 507 627 * \param xtics large tics at ... 508 * \param xlabel label for x axis 628 * \param xlabel label for x axis 509 629 * \param xlabel label for x axis 510 630 * \param *xrange xrange … … 514 634 * \param (*CreatePlotLines) function reference that writes a single plot line 515 635 * \return true if file was written successfully 516 */ 636 */ 517 637 bool CreatePlotOrder(class MatrixContainer &Matrix, const class KeySetsContainer &KeySet, const char *dir, const char *prefix, const int keycolumns, const char *key, const char *logscale, const char *extraline, const int mxtics, const int xtics, const char *xlabel, const char *ylabel, const char *xrange, const char *yrange, const char *xargument, const char *uses, void (*CreatePlotLines)(ofstream &, class MatrixContainer &, const char *, const char *, const char *)) 518 638 { 519 520 521 522 523 if (!OpenOutputFile(output, dir, filename.str().c_str())) return false; 524 525 526 527 output.close(); 528 639 stringstream filename; 640 ofstream output; 641 642 filename << prefix << ".pyx"; 643 if (!OpenOutputFile(output, dir, filename.str().c_str())) return false; 644 CreatePlotHeader(output, prefix, keycolumns, key, logscale, extraline, mxtics, xtics, xlabel, ylabel); 645 output << "plot " << xrange << " " << yrange << " \\" << endl; 646 CreatePlotLines(output, Matrix, prefix, xargument, uses); 647 output.close(); 648 return true; 529 649 }; 530 650 … … 538 658 void AbsEnergyPlotLine(ofstream &output, class MatrixContainer &Energy, const char *prefix, const char *xargument, const char *uses) 539 659 { 540 stringstream line(Energy.Header);541 542 543 544 for (int i=2; i<= Energy.ColumnCounter;i++) {545 546 547 548 549 if (i != (Energy.ColumnCounter))550 551 552 660 stringstream line(Energy.Header[ Energy.MatrixCounter ]); 661 string token; 662 663 getline(line, token, '\t'); 664 for (int i=2; i<= Energy.ColumnCounter[Energy.MatrixCounter];i++) { 665 getline(line, token, '\t'); 666 while (token[0] == ' ') // remove leading white spaces 667 token.erase(0,1); 668 output << "'" << prefix << ".dat' title '" << token << "' using " << xargument << ":(abs($" << i+2 << ")) " << uses; 669 if (i != (Energy.ColumnCounter[Energy.MatrixCounter])) 670 output << ", \\"; 671 output << endl; 672 } 553 673 }; 554 674 … … 562 682 void EnergyPlotLine(ofstream &output, class MatrixContainer &Energy, const char *prefix, const char *xargument, const char *uses) 563 683 { 564 stringstream line(Energy.Header);565 566 567 568 for (int i=1; i<= Energy.ColumnCounter;i++) {569 570 571 572 573 if (i != (Energy.ColumnCounter))574 575 576 684 stringstream line(Energy.Header[Energy.MatrixCounter]); 685 string token; 686 687 getline(line, token, '\t'); 688 for (int i=1; i<= Energy.ColumnCounter[Energy.MatrixCounter];i++) { 689 getline(line, token, '\t'); 690 while (token[0] == ' ') // remove leading white spaces 691 token.erase(0,1); 692 output << "'" << prefix << ".dat' title '" << token << "' using " << xargument << ":" << i+2 << " " << uses; 693 if (i != (Energy.ColumnCounter[Energy.MatrixCounter])) 694 output << ", \\"; 695 output << endl; 696 } 577 697 }; 578 698 … … 586 706 void ForceMagnitudePlotLine(ofstream &output, class MatrixContainer &Force, const char *prefix, const char *xargument, const char *uses) 587 707 { 588 stringstream line(Force.Header);589 590 591 592 593 594 595 596 for (int i=7; i< Force.ColumnCounter;i+=NDIM) {597 598 599 600 token.erase(token.length(), 1);// kill residual index char (the '0')601 602 if (i != (Force.ColumnCounter-1))603 604 605 606 607 708 stringstream line(Force.Header[Force.MatrixCounter]); 709 string token; 710 711 getline(line, token, '\t'); 712 getline(line, token, '\t'); 713 getline(line, token, '\t'); 714 getline(line, token, '\t'); 715 getline(line, token, '\t'); 716 for (int i=7; i< Force.ColumnCounter[Force.MatrixCounter];i+=NDIM) { 717 getline(line, token, '\t'); 718 while (token[0] == ' ') // remove leading white spaces 719 token.erase(0,1); 720 token.erase(token.length(), 1); // kill residual index char (the '0') 721 output << "'" << prefix << ".dat' title '" << token << "' using " << xargument << ":(sqrt($" << i+1 << "*$" << i+1 << "+$" << i+2 << "*$" << i+2 << "+$" << i+3 << "*$" << i+3 << ")) " << uses; 722 if (i != (Force.ColumnCounter[Force.MatrixCounter]-1)) 723 output << ", \\"; 724 output << endl; 725 getline(line, token, '\t'); 726 getline(line, token, '\t'); 727 } 608 728 }; 609 729 … … 617 737 void AbsFirstForceValuePlotLine(ofstream &output, class MatrixContainer &Force, const char *prefix, const char *xargument, const char *uses) 618 738 { 619 stringstream line(Force.Header);620 621 622 623 624 625 626 627 for (int i=7; i< Force.ColumnCounter;i+=NDIM) {628 629 630 631 token.erase(token.length(), 1);// kill residual index char (the '0')632 633 if (i != (Force.ColumnCounter-1))634 635 636 637 638 739 stringstream line(Force.Header[Force.MatrixCounter]); 740 string token; 741 742 getline(line, token, '\t'); 743 getline(line, token, '\t'); 744 getline(line, token, '\t'); 745 getline(line, token, '\t'); 746 getline(line, token, '\t'); 747 for (int i=7; i< Force.ColumnCounter[Force.MatrixCounter];i+=NDIM) { 748 getline(line, token, '\t'); 749 while (token[0] == ' ') // remove leading white spaces 750 token.erase(0,1); 751 token.erase(token.length(), 1); // kill residual index char (the '0') 752 output << "'" << prefix << ".dat' title '" << token << "' using " << xargument << ":(abs($" << i+1 << ")) " << uses; 753 if (i != (Force.ColumnCounter[Force.MatrixCounter]-1)) 754 output << ", \\"; 755 output << endl; 756 getline(line, token, '\t'); 757 getline(line, token, '\t'); 758 } 639 759 }; 640 760 … … 648 768 void BoxesForcePlotLine(ofstream &output, class MatrixContainer &Force, const char *prefix, const char *xargument, const char *uses) 649 769 { 650 stringstream line(Force.Header);651 652 653 654 655 656 657 658 659 for (int i=7; i< Force.ColumnCounter;i+=NDIM) {660 661 662 663 token.erase(token.length(), 1);// kill residual index char (the '0')664 665 if (i != (Force.ColumnCounter-1))666 667 668 669 670 770 stringstream line(Force.Header[Force.MatrixCounter]); 771 char *fillcolor[5] = {"black", "red", "blue", "green", "cyan"}; 772 string token; 773 774 getline(line, token, '\t'); 775 getline(line, token, '\t'); 776 getline(line, token, '\t'); 777 getline(line, token, '\t'); 778 getline(line, token, '\t'); 779 for (int i=7; i< Force.ColumnCounter[Force.MatrixCounter];i+=NDIM) { 780 getline(line, token, '\t'); 781 while (token[0] == ' ') // remove leading white spaces 782 token.erase(0,1); 783 token.erase(token.length(), 1); // kill residual index char (the '0') 784 output << "'" << prefix << ".dat' title '" << token << "' using ($" << xargument << "+" << fixed << setprecision(1) << (double)((i-7)/3)*0.2 << "):(sqrt($" << i+1 << "*$" << i+1 << "+$" << i+2 << "*$" << i+2 << "+$" << i+3 << "*$" << i+3 << ")) " << uses << " " << fillcolor[(i-7)/3]; 785 if (i != (Force.ColumnCounter[Force.MatrixCounter]-1)) 786 output << ", \\"; 787 output << endl; 788 getline(line, token, '\t'); 789 getline(line, token, '\t'); 790 } 671 791 }; 672 792 … … 680 800 void BoxesFirstForceValuePlotLine(ofstream &output, class MatrixContainer &Force, const char *prefix, const char *xargument, const char *uses) 681 801 { 682 stringstream line(Force.Header);683 684 685 686 687 688 689 690 691 for (int i=7; i< Force.ColumnCounter;i+=NDIM) {692 693 694 695 token.erase(token.length(), 1);// kill residual index char (the '0')696 697 if (i != (Force.ColumnCounter-1))698 699 700 701 702 703 }; 802 stringstream line(Force.Header[Force.MatrixCounter]); 803 char *fillcolor[5] = {"black", "red", "blue", "green", "cyan"}; 804 string token; 805 806 getline(line, token, '\t'); 807 getline(line, token, '\t'); 808 getline(line, token, '\t'); 809 getline(line, token, '\t'); 810 getline(line, token, '\t'); 811 for (int i=7; i< Force.ColumnCounter[Force.MatrixCounter];i+=NDIM) { 812 getline(line, token, '\t'); 813 while (token[0] == ' ') // remove leading white spaces 814 token.erase(0,1); 815 token.erase(token.length(), 1); // kill residual index char (the '0') 816 output << "'" << prefix << ".dat' title '" << token << "' using ($" << xargument << "+" << fixed << setprecision(1) << (double)((i-7)/3)*0.2 << "):" << i+1 << " " << uses << " " << fillcolor[(i-7)/3]; 817 if (i != (Force.ColumnCounter[Force.MatrixCounter]-1)) 818 output << ", \\"; 819 output << endl; 820 getline(line, token, '\t'); 821 getline(line, token, '\t'); 822 } 823 };
Note:
See TracChangeset
for help on using the changeset viewer.