source: src/helpers.hpp@ 492279

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 492279 was 0de7e8, checked in by Frederik Heber <heber@…>, 15 years ago

FIX: Test Fragmentation is at MaxOrder was broken.

  • BUGFIX: molecule::CheckAdjacencyFileAgainstMolecule() called AtomCount() all the time instead of storing in const integer.
  • DOCUFIX: "done"/"failed" is now always indented by hand "\t" for better readability
  • DOCUFIX: Improved wordiness of CreateFatherLookupTable(), CheckAdjacencyFileAgainstMolecule_CompareBonds(), molecule::CheckAdjacencyFileAgainstMolecule()
  • TESTFIX: Molecules/2 created a dir sdt and movedf all BondFragment*conf* files thereto and counted, what for?
  • TESTFIX: Molecules/3 actually made only one fragmentation call. I guess before old stuff was not cleaned up and thus worked. But we need present KeySet and OrderAtSite to recognize MaxOrder! Hence, we now call it twice, first expecting 0, then 2 as return code which marks the correct procedure.
  • Property mode set to 100644
File size: 5.3 KB
Line 
1/** \file helpers.hpp
2 *
3 * Declaration of some auxiliary functions for memory dis-/allocation and so on
4 */
5
6#ifndef HELPERS_HPP_
7#define HELPERS_HPP_
8
9using namespace std;
10
11/*********************************************** includes ***********************************/
12
13// include config.h
14#ifdef HAVE_CONFIG_H
15#include <config.h>
16#endif
17
18#include <fstream>
19
20#include "defs.hpp"
21#include "log.hpp"
22#include "memoryallocator.hpp"
23
24/********************************************** definitions *********************************/
25
26/********************************************** helpful functions *********************************/
27
28// taken out of TREMOLO
29/*@-namechecks@*/
30#ifndef __GNUC__
31# undef __attribute__
32# define __attribute__(x)
33#endif
34/*@=namechecks@*/
35
36/* Behandelt aufgetretene Fehler. error ist der Fehlertyp(enum Errors)
37 void *SpecialData ist ein untypisierter Zeiger auf Spezielle Daten zur Fehlerbehandlung.
38 Man koennte auch noch einen Zeiger auf eine Funktion uebergeben */
39extern void /*@exits@*/ debug(const char *output);
40 //__attribute__ ((__return__));
41#define debug(data) debug_in((data), __FILE__, __LINE__)
42
43extern void /*@exits@*/ debug_in(const char *output,
44 const char *file, const int line);
45 //__attribute__ ((__return__));
46
47double ask_value(const char *text);
48bool check_bounds(double *x, double *cell_size);
49void bound(double *b, double lower_bound, double upper_bound);
50int CountLinesinFile(ifstream &InputFile);
51char *FixedDigitNumber(const int FragmentNumber, const int digits);
52bool IsValidNumber( const char *string);
53int CompareDoubles (const void * a, const void * b);
54double * ReturnFullMatrixforSymmetric(const double * const cell_size);
55double * InverseMatrix(const double * const A);
56void performCriticalExit();
57
58/********************************************** helpful template functions *********************************/
59
60
61/** returns greater of the two values.
62 * \param x first value
63 * \param y second value
64 * \return greater of the two (by operator>())
65 */
66template <typename T> T Max(T x, T y)
67{
68 if (x > y)
69 return x;
70 else return y;
71};
72
73/** returns smaller of the two values.
74 * \param x first value
75 * \param y second value
76 * \return smaller of the two (by operator<())
77 */
78template <typename T> T Min(T x, T y)
79{
80 if (x < y)
81 return x;
82 else return y;
83};
84
85/** Creates a lookup table for true father's Atom::Nr -> atom ptr.
86 * \param *start begin of chain list
87 * \paran *end end of chain list
88 * \param **Lookuptable pointer to return allocated lookup table (should be NULL on start)
89 * \param count optional predetermined size for table (otherwise we set the count to highest true father id)
90 * \return true - success, false - failure
91 */
92template <typename T> bool CreateFatherLookupTable(T *start, T *end, T **&LookupTable, int count = 0)
93{
94 bool status = true;
95 T *Walker = NULL;
96 int AtomNo;
97
98 if (LookupTable != NULL) {
99 DoeLog(0) && (eLog() << Verbose(0) << "Pointer for Lookup table is not NULL! Aborting ..." <<endl);
100 return false;
101 }
102
103 // count them
104 if (count == 0) {
105 Walker = start;
106 while (Walker->next != end) { // create a lookup table (Atom::nr -> atom) used as a marker table lateron
107 Walker = Walker->next;
108 count = (count < Walker->GetTrueFather()->nr) ? Walker->GetTrueFather()->nr : count;
109 }
110 }
111 if (count <= 0) {
112 DoeLog(1) && (eLog() << Verbose(1) << "Count of lookup list is 0 or less." << endl);
113 return false;
114 }
115
116 // allocate and fill
117 LookupTable = new T*[count];
118 if (LookupTable == NULL) {
119 DoeLog(0) && (eLog()<< Verbose(0) << "LookupTable memory allocation failed!" << endl);
120 performCriticalExit();
121 status = false;
122 } else {
123 Walker = start;
124 while (Walker->next != end) { // create a lookup table (Atom::nr -> atom) used as a marker table lateron
125 Walker = Walker->next;
126 AtomNo = Walker->GetTrueFather()->nr;
127 if ((AtomNo >= 0) && (AtomNo < count)) {
128 //*out << "Setting LookupTable[" << AtomNo << "] to " << *Walker << endl;
129 LookupTable[AtomNo] = Walker;
130 } else {
131 DoeLog(2) && (eLog() << Verbose(2) << "Walker " << *Walker << " exceeded range of nuclear ids [0, " << count << ")." << endl);
132 status = false;
133 break;
134 }
135 }
136 }
137
138 return status;
139};
140
141
142/** Frees a two-dimensional array.
143 * \param *ptr pointer to array
144 * \param dim first dim of array
145 */
146template <typename X> void Free2DArray(X **ptr, int dim)
147{
148 int i;
149 if (ptr != NULL) {
150 for(i=dim;i--;)
151 if (ptr[i] != NULL)
152 free(ptr[i]);
153 free(ptr);
154 }
155};
156
157template <typename T> void Increment(T *value, T *inc)
158{
159 *value += *inc;
160};
161
162template <typename T> void AbsoluteValue(T *value, T *abs)
163{
164 *value = *abs;
165};
166
167template <typename T> void IncrementalAbsoluteValue(T *value, T *abs)
168{
169 *value = *abs;
170 (*abs) += 1;
171};
172
173#define PLURAL_S(v) (((v)==1)?"":"s")
174
175// this is to allow different modes of access for
176// maps and sets
177template<typename Res,typename T>
178struct _take{
179 Res get(T value) const;
180};
181
182// if we have a set,vector etc we can directly access the result
183template<typename Res>
184struct _take<Res,Res>{
185 static inline Res get(Res value){
186 return value;
187 }
188};
189
190// if we have a map we have to access the second part of
191// the pair
192template<typename Res,typename T1>
193struct _take<Res,std::pair<T1,Res> >{
194 static inline Res get(std::pair<T1,Res> value){
195 return value.second;
196 }
197};
198
199#endif /*HELPERS_HPP_*/
Note: See TracBrowser for help on using the repository browser.