source: src/datacreator.cpp@ 51c910

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 51c910 was d067d45, checked in by Frederik Heber <heber@…>, 15 years ago

Merge branch 'MultipleMolecules'

Conflicts:

molecuilder/src/analyzer.cpp
molecuilder/src/atom.cpp
molecuilder/src/boundary.cpp
molecuilder/src/boundary.hpp
molecuilder/src/builder.cpp
molecuilder/src/config.cpp
molecuilder/src/datacreator.hpp
molecuilder/src/helpers.cpp
molecuilder/src/joiner.cpp
molecuilder/src/moleculelist.cpp
molecuilder/src/molecules.cpp
molecuilder/src/molecules.hpp
molecuilder/src/parser.cpp
molecuilder/src/parser.hpp
molecuilder/src/vector.cpp
molecuilder/src/verbose.cpp

merges:

compilation fixes:

  • Property mode set to 100755
File size: 35.0 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
11//=========================== FUNCTIONS============================
12
13/** Opens a file with \a *filename in \a *dir.
14 * \param output file handle on return
15 * \param *dir directory
16 * \param *filename name of file
17 * \return true if file has been opened
18 */
19bool OpenOutputFile(ofstream &output, const char *dir, const char *filename)
20{
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
31/** Opens a file for appending with \a *filename in \a *dir.
32 * \param output file handle on return
33 * \param *dir directory
34 * \param *filename name of file
35 * \return true if file has been opened
36 */
37bool AppendOutputFile(ofstream &output, const char *dir, const char *filename)
38{
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
49/** Plots an energy vs. order.
50 * \param &Fragments EnergyMatrix class containing matrix values
51 * \param KeySet KeySetContainer class holding bond KeySetContainer::Order
52 * \param *prefix prefix in filename (without ending)
53 * \param *msg message to be place in first line as a comment
54 * \return true if file was written successfully
55 */
56bool 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};
80
81/** Plots an energy error vs. order.
82 * \param &Energy EnergyMatrix class containing reference values (in MatrixCounter matrix)
83 * \param &Fragments EnergyMatrix class containing matrix values
84 * \param KeySet KeySetContainer class holding bond KeySetContainer::Order
85 * \param *prefix prefix in filename (without ending)
86 * \param *msg message to be place in first line as a comment
87 * \return true if file was written successfully
88 */
89bool 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};
117
118/** Plot forces vs. order.
119 * \param &Fragments ForceMatrix class containing matrix values
120 * \param KeySet KeySetContainer class holding bond KeySetContainer::Order
121 * \param *prefix prefix in filename (without ending)
122 * \param *msg message to be place in first line as a comment
123 * \param *datum current date and time
124 * \return true if file was written successfully
125 */
126bool CreateDataForcesOrder(class ForceMatrix &Fragments, class KeySetsContainer &KeySet, char *dir, char *prefix, char *msg, char *datum, void (*CreateForce)(class MatrixContainer &, int))
127{
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};
148
149/** Plot forces error vs. order.
150 * \param &Force ForceMatrix containing reference values (in MatrixCounter matrix)
151 * \param &Fragments ForceMatrix class containing matrix values
152 * \param KeySet KeySetContainer class holding bond KeySetContainer::Order
153 * \param *prefix prefix in filename (without ending)
154 * \param *msg message to be place in first line as a comment
155 * \param *datum current date and time
156 * \return true if file was written successfully
157 */
158bool CreateDataDeltaForcesOrder(class ForceMatrix &Force, class ForceMatrix &Fragments, class KeySetsContainer &KeySet, char *dir, char *prefix, char *msg, char *datum, void (*CreateForce)(class MatrixContainer &, int))
159{
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};
180
181/** Plot forces error vs. vs atom vs. order.
182 * \param &Force ForceMatrix containing reference values (in MatrixCounter matrix)
183 * \param &Fragments ForceMatrix class containing matrix values
184 * \param KeySet KeySetContainer class holding bond KeySetContainer::Order
185 * \param *prefix prefix in filename (without ending)
186 * \param *msg message to be place in first line as a comment
187 * \param *datum current date and time
188 * \return true if file was written successfully
189 */
190bool 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};
228
229/** Plot forces error vs. vs atom vs. order.
230 * \param &Fragments ForceMatrix class containing matrix values
231 * \param KeySet KeySetContainer class holding bond KeySetContainer::Order
232 * \param *prefix prefix in filename (without ending)
233 * \param *msg message to be place in first line as a comment
234 * \param *datum current date and time
235 * \return true if file was written successfully
236 */
237bool 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 */
274bool 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 */
312bool 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 */
356bool 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;
382};
383
384/** Plot matrix vs. fragment.
385 */
386bool CreateDataFragment(class MatrixContainer &Fragment, class KeySetsContainer &KeySet, char *dir, char *prefix, char *msg, char *datum, void (*CreateFragment)(class MatrixContainer &, int))
387{
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;
407};
408
409/** Copies fragment energy values into last matrix of \a Matrix with greatest total energy.
410 * \param &Matrix MatrixContainer with all fragment energy values
411 * \param &KeySet KeySetsContainer with associations of each fragment to a bond order
412 * \param BondOrder current bond order
413 */
414void CreateMaxFragmentOrder(class MatrixContainer &Fragments, class KeySetsContainer &KeySet, int BondOrder)
415{
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 }
424};
425
426/** Copies fragment energy values into last matrix of \a Matrix with smallest total energy.
427 * \param &Matrix MatrixContainer with all fragment energy values
428 * \param &KeySet KeySetsContainer with associations of each fragment to a bond order
429 * \param BondOrder current bond order
430 */
431void CreateMinFragmentOrder(class MatrixContainer &Fragments, class KeySetsContainer &KeySet, int BondOrder)
432{
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 }
447};
448
449/** Plot matrix vs. fragment.
450 */
451bool CreateDataFragmentOrder(class MatrixContainer &Fragment, class KeySetsContainer &KeySet, char *dir, char *prefix, char *msg, char *datum, void (*CreateFragmentOrder)(class MatrixContainer &, class KeySetsContainer &, int))
452{
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;
472};
473
474/** Takes last but one row and copies into final row.
475 * \param Energy MatrixContainer with matrix values
476 * \param MatrixNumber the index for the ForceMatrix::matrix array
477 */
478void CreateEnergy(class MatrixContainer &Energy, int MatrixNumber)
479{
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];
482};
483
484/** Scans forces for the minimum in magnitude.
485 * Results are stored in the matrix ForceMatrix::MatrixCounter of \a Force.
486 * \param Force ForceMatrix class containing matrix values
487 * \param MatrixNumber the index for the ForceMatrix::matrix array
488 */
489void CreateMinimumForce(class MatrixContainer &Force, int MatrixNumber)
490{
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 }
516};
517
518/** Scans forces for the mean in magnitude.
519 * Results are stored in the matrix ForceMatrix::MatrixCounter of \a Force.
520 * \param Force ForceMatrix class containing matrix values
521 * \param MatrixNumber the index for the ForceMatrix::matrix array
522 */
523void CreateMeanForce(class MatrixContainer &Force, int MatrixNumber)
524{
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 }
541};
542
543/** Scans forces for the maximum in magnitude.
544 * Results are stored in the matrix ForceMatrix::MatrixCounter of \a Force.
545 * \param Force ForceMatrix class containing matrix values
546 * \param MatrixNumber the index for the ForceMatrix::matrix array
547 */
548void CreateMaximumForce(class MatrixContainer &Force, int MatrixNumber)
549{
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 }
564};
565
566/** Leaves the Force.Matrix as it is.
567 * \param Force ForceMatrix class containing matrix values
568 * \param MatrixNumber the index for the ForceMatrix::matrix array
569*/
570void CreateSameForce(class MatrixContainer &Force, int MatrixNumber)
571{
572 // does nothing
573};
574
575/** Adds vectorwise all forces.
576 * Results are stored in the matrix ForceMatrix::MatrixCounter of \a Force.
577 * \param Force ForceMatrix class containing matrix values
578 * \param MatrixNumber the index for the ForceMatrix::matrix array
579 */
580void CreateVectorSumForce(class MatrixContainer &Force, int MatrixNumber)
581{
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 }
588};
589
590/** Writes the standard pyxplot header info.
591 * \param keycolumns number of columns of the key
592 * \param *key position of key
593 * \param *logscale axis for logscale
594 * \param *extraline extra set lines if desired
595 * \param mxtics small tics at ...
596 * \param xtics large tics at ...
597 * \param *xlabel label for x axis
598 * \param *ylabel label for y axis
599 */
600void 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)
601{
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;
616};
617
618/** Creates the pyxplotfile for energy data.
619 * \param Matrix MatrixContainer with matrix values
620 * \param KeySet contains bond order
621 * \param *dir directory
622 * \param *prefix prefix for all filenames (without ending)
623 * \param keycolumns number of columns of the key
624 * \param *key position of key
625 * \param logscale axis for logscale
626 * \param mxtics small tics at ...
627 * \param xtics large tics at ...
628 * \param xlabel label for x axis
629 * \param xlabel label for x axis
630 * \param *xrange xrange
631 * \param *yrange yrange
632 * \param *xargument number of column to plot against (x axis)
633 * \param uses using string for plot command
634 * \param (*CreatePlotLines) function reference that writes a single plot line
635 * \return true if file was written successfully
636 */
637bool 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 *))
638{
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;
649};
650
651/** Writes plot lines for absolute energies.
652 * \param output file handler
653 * \param Energy MatrixContainer with matrix values
654 * \param *prefix prefix of data file
655 * \param *xargument number of column to plot against (x axis)
656 * \param *uses uses command
657 */
658void AbsEnergyPlotLine(ofstream &output, class MatrixContainer &Energy, const char *prefix, const char *xargument, const char *uses)
659{
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 }
673};
674
675/** Writes plot lines for energies.
676 * \param output file handler
677 * \param Energy MatrixContainer with matrix values
678 * \param *prefix prefix of data file
679 * \param *xargument number of column to plot against (x axis)
680 * \param *uses uses command
681 */
682void EnergyPlotLine(ofstream &output, class MatrixContainer &Energy, const char *prefix, const char *xargument, const char *uses)
683{
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 }
697};
698
699/** Writes plot lines for absolute force magnitudes.
700 * \param output file handler
701 * \param Force MatrixContainer with matrix values
702 * \param *prefix prefix of data file
703 * \param *xargument number of column to plot against (x axis)
704 * \param *uses uses command
705 */
706void ForceMagnitudePlotLine(ofstream &output, class MatrixContainer &Force, const char *prefix, const char *xargument, const char *uses)
707{
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 }
728};
729
730/** Writes plot lines for first component of force vector.
731 * \param output file handler
732 * \param Force MatrixContainer with matrix values
733 * \param *prefix prefix of data file
734 * \param *xargument number of column to plot against (x axis)
735 * \param *uses uses command
736 */
737void AbsFirstForceValuePlotLine(ofstream &output, class MatrixContainer &Force, const char *prefix, const char *xargument, const char *uses)
738{
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 }
759};
760
761/** Writes plot lines for force vector as boxes with a fillcolor.
762 * \param output file handler
763 * \param Force MatrixContainer with matrix values
764 * \param *prefix prefix of data file
765 * \param *xargument number of column to plot against (x axis)
766 * \param *uses uses command
767 */
768void BoxesForcePlotLine(ofstream &output, class MatrixContainer &Force, const char *prefix, const char *xargument, const char *uses)
769{
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 }
791};
792
793/** Writes plot lines for first force vector component as boxes with a fillcolor.
794 * \param output file handler
795 * \param Force MatrixContainer with matrix values
796 * \param *prefix prefix of data file
797 * \param *xargument number of column to plot against (x axis)
798 * \param *uses uses command
799 */
800void BoxesFirstForceValuePlotLine(ofstream &output, class MatrixContainer &Force, const char *prefix, const char *xargument, const char *uses)
801{
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 TracBrowser for help on using the repository browser.