source: src/datacreator.cpp@ 6cd16b

Action_Thermostats Add_AtomRandomPerturbation Add_FitFragmentPartialChargesAction Add_RotateAroundBondAction Add_SelectAtomByNameAction Added_ParseSaveFragmentResults AddingActions_SaveParseParticleParameters Adding_Graph_to_ChangeBondActions Adding_MD_integration_tests Adding_ParticleName_to_Atom Adding_StructOpt_integration_tests AtomFragments Automaking_mpqc_open AutomationFragmentation_failures Candidate_v1.5.4 Candidate_v1.6.0 Candidate_v1.6.1 ChangeBugEmailaddress ChangingTestPorts ChemicalSpaceEvaluator CombiningParticlePotentialParsing Combining_Subpackages Debian_Package_split Debian_package_split_molecuildergui_only Disabling_MemDebug Docu_Python_wait EmpiricalPotential_contain_HomologyGraph EmpiricalPotential_contain_HomologyGraph_documentation Enable_parallel_make_install Enhance_userguide Enhanced_StructuralOptimization Enhanced_StructuralOptimization_continued Example_ManyWaysToTranslateAtom Exclude_Hydrogens_annealWithBondGraph FitPartialCharges_GlobalError Fix_BoundInBox_CenterInBox_MoleculeActions Fix_ChargeSampling_PBC Fix_ChronosMutex Fix_FitPartialCharges Fix_FitPotential_needs_atomicnumbers Fix_ForceAnnealing Fix_IndependentFragmentGrids Fix_ParseParticles Fix_ParseParticles_split_forward_backward_Actions Fix_PopActions Fix_QtFragmentList_sorted_selection Fix_Restrictedkeyset_FragmentMolecule Fix_StatusMsg Fix_StepWorldTime_single_argument Fix_Verbose_Codepatterns Fix_fitting_potentials Fixes ForceAnnealing_goodresults ForceAnnealing_oldresults ForceAnnealing_tocheck ForceAnnealing_with_BondGraph ForceAnnealing_with_BondGraph_continued ForceAnnealing_with_BondGraph_continued_betteresults ForceAnnealing_with_BondGraph_contraction-expansion FragmentAction_writes_AtomFragments FragmentMolecule_checks_bonddegrees GeometryObjects Gui_Fixes Gui_displays_atomic_force_velocity ImplicitCharges IndependentFragmentGrids IndependentFragmentGrids_IndividualZeroInstances IndependentFragmentGrids_IntegrationTest IndependentFragmentGrids_Sole_NN_Calculation JobMarket_RobustOnKillsSegFaults JobMarket_StableWorkerPool JobMarket_unresolvable_hostname_fix MoreRobust_FragmentAutomation ODR_violation_mpqc_open PartialCharges_OrthogonalSummation PdbParser_setsAtomName PythonUI_with_named_parameters QtGui_reactivate_TimeChanged_changes Recreated_GuiChecks Rewrite_FitPartialCharges RotateToPrincipalAxisSystem_UndoRedo SaturateAtoms_findBestMatching SaturateAtoms_singleDegree StoppableMakroAction Subpackage_CodePatterns Subpackage_JobMarket Subpackage_LinearAlgebra Subpackage_levmar Subpackage_mpqc_open Subpackage_vmg Switchable_LogView ThirdParty_MPQC_rebuilt_buildsystem TrajectoryDependenant_MaxOrder TremoloParser_IncreasedPrecision TremoloParser_MultipleTimesteps TremoloParser_setsAtomName Ubuntu_1604_changes stable
Last change on this file since 6cd16b was a67d19, checked in by Frederik Heber <heber@…>, 15 years ago

Huge change: Log() << Verbose(.) --> DoLog(.) && (Log() << Verbose(.) << ...);

Most of the files are affected, but this is necessary as if DoLog() says verbosity is not enough, all the stream operators won"t get executed which saves substantial amount of computation time.

Signed-off-by: Frederik Heber <heber@…>

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