source: src/LinearAlgebra/VectorContent.cpp@ 041462

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 041462 was 041462, checked in by Frederik Heber <heber@…>, 14 years ago

BUGFIX: operator<< for VectorContent placed "," at wrong position.

  • Property mode set to 100644
File size: 10.4 KB
Line 
1/*
2 * Project: MoleCuilder
3 * Description: creates and alters molecular systems
4 * Copyright (C) 2010 University of Bonn. All rights reserved.
5 * Please see the LICENSE file or "Copyright notice" in builder.cpp for details.
6 */
7
8/*
9 * VectorContent.cpp
10 *
11 * Created on: Nov 15, 2010
12 * Author: heber
13 */
14
15// include config.h
16#ifdef HAVE_CONFIG_H
17#include <config.h>
18#endif
19
20#include "Helpers/MemDebug.hpp"
21
22#include <gsl/gsl_vector.h>
23#include <cmath>
24#include <iostream>
25
26#include "Helpers/Assert.hpp"
27#include "Helpers/defs.hpp"
28#include "LinearAlgebra/Vector.hpp"
29#include "LinearAlgebra/VectorContent.hpp"
30
31/** Constructor of class VectorContent.
32 * Allocates GSL structures
33 * \param _dim number of components
34 */
35VectorContent::VectorContent(size_t _dim) :
36 dimension(_dim)
37{
38 content = gsl_vector_calloc(dimension);
39}
40
41/** Constructor of class VectorContent.
42 * We need this VectorBaseCase for the VectorContentView class.
43 * There no content should be allocated, as it is just a view with an internal
44 * gsl_vector_view. Hence, VectorBaseCase is just dummy class to give the
45 * constructor a unique signature.
46 * \param VectorBaseCase
47 */
48VectorContent::VectorContent(VectorBaseCase)
49{}
50
51/** Copy constructor of class VectorContent.
52 * Allocates GSL structures and copies components from \a *src.
53 * \param *src source vector
54 */
55VectorContent::VectorContent(const VectorContent * const src) :
56 dimension(src->dimension)
57{
58 content = gsl_vector_alloc(dimension);
59 gsl_vector_memcpy (content, src->content);
60};
61
62/** Copy constructor of class VectorContent.
63 * Allocates GSL structures and copies components from \a *src.
64 * \param *src source vector
65 */
66VectorContent::VectorContent(const VectorContent & src) :
67 dimension(src.dimension)
68{
69 content = gsl_vector_alloc(dimension);
70 gsl_vector_memcpy (content, src.content);
71};
72
73/** Destructor of class VectorContent.
74 * Frees GSL structures
75 */
76VectorContent::~VectorContent()
77{
78 if(content != NULL){
79 gsl_vector_free(content);
80 content = NULL;
81 }
82}
83
84/* ============================ Accessing =============================== */
85/** Accessor for manipulating component (i).
86 * \param i component number
87 * \return reference to component (i)
88 */
89double &VectorContent::at(size_t i)
90{
91 ASSERT((i>=0) && (i<dimension),
92 "VectorContent::at() - Index i="+toString(i)+" for Matrix access out of range [0,"+toString(dimension)+"]");
93 return *gsl_vector_ptr (content, i);
94}
95
96/** Constant accessor for (value of) component (i).
97 * \param i component number
98 * \return const component (i)
99 */
100const double VectorContent::at(size_t i) const
101{
102 ASSERT((i>=0) && (i<dimension),
103 "VectorContent::at() - Index i="+toString(i)+" for Matrix access out of range [0,"+toString(dimension)+"]");
104 return gsl_vector_get(content, i);
105}
106
107/** These functions return a pointer to the \a m-th element of a vector.
108 * If \a m lies outside the allowed range of 0 to VectorContent::dimension-1 then the error handler is invoked and a null pointer is returned.
109 * \param m m-th element
110 * \return pointer to \a m-th element
111 */
112double *VectorContent::Pointer(size_t m) const
113{
114 return gsl_vector_ptr (content, m);
115};
116
117/** These functions return a constant pointer to the \a m-th element of a vector.
118 * If \a m lies outside the allowed range of 0 to VectorContent::dimension-1 then the error handler is invoked and a null pointer is returned.
119 * \param m m-th element
120 * \return const pointer to \a m-th element
121 */
122const double *VectorContent::const_Pointer(size_t m) const
123{
124 return gsl_vector_const_ptr (content, m);
125};
126
127/** Assignment operator.
128 * \param &src source vector to assign \a *this to
129 * \return reference to \a *this
130 */
131VectorContent& VectorContent::operator=(const VectorContent& src)
132{
133 ASSERT(dimension == src.dimension, "Dimensions have to be the same to assign VectorContent onto another!");
134 // check for self assignment
135 if(&src!=this){
136 gsl_vector_memcpy(content, src.content);
137 }
138 return *this;
139}
140
141/* ========================== Initializing =============================== */
142/** This function sets all the elements of the vector to the value \a x.
143 * \param x value to set to
144 */
145void VectorContent::setValue(double x)
146{
147 gsl_vector_set_all (content, x);
148};
149
150/** This function sets the vector from a double array.
151 * Creates a vector view of the array and performs a memcopy.
152 * \param *x array of values (no dimension check is performed)
153 */
154void VectorContent::setFromDoubleArray(double * x)
155{
156 gsl_vector_view m = gsl_vector_view_array (x, dimension);
157 gsl_vector_memcpy (content, &m.vector);
158};
159
160/**
161 * This function sets the GSLvector from an ordinary vector.
162 *
163 * Takes access to the internal gsl_vector and copies it
164 */
165void VectorContent::setFromVector(Vector &v)
166{
167 gsl_vector_memcpy (content, v.get()->content);
168}
169
170/** This function sets all the elements of the vector to zero.
171 */
172void VectorContent::setZero()
173{
174 gsl_vector_set_zero (content);
175};
176
177/** This function makes a basis vector by setting all the elements of the vector to zero except for the i-th element which is set to one.
178 * \param i i-th component to set to unity (all other to zero)
179 * \return vector set
180 */
181int VectorContent::setBasis(size_t i)
182{
183 return gsl_vector_set_basis (content, i);
184};
185
186/* ====================== Exchanging elements ============================ */
187/** This function exchanges the \a i-th and \a j-th elements of the vector in-place.
188 * \param i i-th element to swap with ...
189 * \param j ... j-th element to swap against
190 */
191int VectorContent::SwapElements(size_t i, size_t j)
192{
193 return gsl_vector_swap_elements (content, i, j);
194};
195
196/** This function reverses the order of the elements of the vector.
197 */
198int VectorContent::Reverse()
199{
200 return gsl_vector_reverse (content);
201};
202
203
204/* ========================== Operators =============================== */
205/** Accessor for manipulating component (i).
206 * \param i component number
207 * \return reference to component (i)
208 */
209double &VectorContent::operator[](size_t i)
210{
211 ASSERT((i>=0) && (i<dimension),
212 "VectorContent::operator[]() - Index i="+toString(i)+" for Matrix access out of range [0,"+toString(dimension)+"]");
213 return *gsl_vector_ptr (content, i);
214}
215
216/** Constant accessor for (value of) component (i).
217 * \param i component number
218 * \return const component (i)
219 */
220const double VectorContent::operator[](size_t i) const
221{
222 ASSERT((i>=0) && (i<dimension),
223 "VectorContent::operator[]() - Index i="+toString(i)+" for Matrix access out of range [0,"+toString(dimension)+"]");
224 return gsl_vector_get(content, i);
225}
226
227
228/** Compares VectorContent \a to VectorContent \a b component-wise.
229 * \param a base VectorContent
230 * \param b VectorContent components to add
231 * \return a == b
232 */
233bool VectorContent::operator==(const VectorContent& b) const
234{
235 bool status = true;
236 ASSERT(dimension == b.dimension, "Dimenions of VectorContents to compare differ");
237 for (size_t i=0;i<dimension;i++)
238 status = status && (fabs(at(i) - b.at(i)) < MYEPSILON);
239 return status;
240};
241
242/** Sums VectorContent \a to this lhs component-wise.
243 * \param a base VectorContent
244 * \param b VectorContent components to add
245 * \return lhs + a
246 */
247const VectorContent& VectorContent::operator+=(const VectorContent& b)
248{
249 ASSERT(dimension == b.dimension, "Dimenions of VectorContents to compare differ");
250 for (size_t i=0;i<dimension;i++)
251 at(i) = at(i)+b.at(i);
252 return *this;
253};
254
255/** Subtracts VectorContent \a from this lhs component-wise.
256 * \param a base VectorContent
257 * \param b VectorContent components to add
258 * \return lhs - a
259 */
260const VectorContent& VectorContent::operator-=(const VectorContent& b)
261{
262 ASSERT(dimension == b.dimension, "Dimenions of VectorContents to compare differ");
263 for (size_t i=0;i<dimension;i++)
264 at(i) = at(i)-b.at(i);
265 return *this;
266};
267
268/** factor each component of \a a times a double \a m.
269 * \param a base VectorContent
270 * \param m factor
271 * \return lhs.Get(i) * m
272 */
273const VectorContent& VectorContent::operator*=(const double m)
274{
275 for (size_t i=0;i<dimension;i++)
276 at(i) = at(i)*m;
277 return *this;
278};
279
280/** Sums two VectorContents \a and \b component-wise.
281 * \param a first VectorContent
282 * \param b second VectorContent
283 * \return a + b
284 */
285VectorContent const operator+(const VectorContent& a, const VectorContent& b)
286{
287 ASSERT(a.dimension == b.dimension, "VectorContent::operator+() - dimensions have to match: "+toString(a.dimension)+" != "+toString(b.dimension)+"!");
288 VectorContent x(a);
289 for (size_t i=0;i<a.dimension;i++)
290 x.at(i) = a.at(i)+b.at(i);
291 return x;
292};
293
294/** Subtracts VectorContent \a from \b component-wise.
295 * \param a first VectorContent
296 * \param b second VectorContent
297 * \return a - b
298 */
299VectorContent const operator-(const VectorContent& a, const VectorContent& b)
300{
301 ASSERT(a.dimension == b.dimension, "VectorContent::operator-() - dimensions have to match: "+toString(a.dimension)+" != "+toString(b.dimension)+"!");
302 VectorContent x(a);
303 for (size_t i=0;i<a.dimension;i++)
304 x.at(i) = a.at(i)-b.at(i);
305 return x;
306};
307
308/** Factors given VectorContent \a a times \a m.
309 * \param a VectorContent
310 * \param m factor
311 * \return m * a
312 */
313VectorContent const operator*(const VectorContent& a, const double m)
314{
315 VectorContent x(a);
316 for (size_t i=0;i<a.dimension;i++)
317 x.at(i) = a.at(i)*m;
318 return x;
319};
320
321/** Factors given VectorContent \a a times \a m.
322 * \param m factor
323 * \param a VectorContent
324 * \return m * a
325 */
326VectorContent const operator*(const double m, const VectorContent& a )
327{
328 VectorContent x(a);
329 for (size_t i=0;i<a.dimension;i++)
330 x.at(i) = a.at(i)*m;
331 return x;
332};
333
334ostream& operator<<(ostream& ost, const VectorContent& m)
335{
336 ost << "(";
337 for (size_t i=0;i<m.dimension;i++) {
338 ost << m.at(i);
339 if (i != m.dimension-1)
340 ost << ",";
341 }
342 ost << ")";
343 return ost;
344};
345
346/* ====================== Checking State ============================ */
347/** Checks whether vector has all components zero.
348 * TODO: This might see some numerical instabilities for huge dimension and small number.
349 * For stability one should sort the order of summing!
350 * @return true - vector is zero, false - vector is not
351 */
352bool VectorContent::IsZero() const
353{
354 double result = 0.;
355 for (size_t i = dimension; i--; )
356 result += fabs(at(i));
357 return (result < MYEPSILON);
358};
359
360/** Checks whether vector has length of 1.
361 * @return true - vector is normalized, false - vector is not
362 */
363bool VectorContent::IsOne() const
364{
365 double NormValue = 0.;
366 for (size_t i=dimension;--i;)
367 NormValue += at(i)*at(i);
368 return (fabs(NormValue - 1.) < MYEPSILON);
369};
370
Note: See TracBrowser for help on using the repository browser.