2 * This file is part of the GROMACS molecular simulation package.
4 * Copyright (c) 2014,2015,2016,2018,2019,2021, by the GROMACS development team, led by
5 * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
6 * and including many others, as listed in the AUTHORS file in the
7 * top-level source directory and at http://www.gromacs.org.
9 * GROMACS is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public License
11 * as published by the Free Software Foundation; either version 2.1
12 * of the License, or (at your option) any later version.
14 * GROMACS is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with GROMACS; if not, see
21 * http://www.gnu.org/licenses, or write to the Free Software Foundation,
22 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 * If you want to redistribute modifications to GROMACS, please
25 * consider that scientific software is very special. Version
26 * control is crucial - bugs must be traceable. We will be happy to
27 * consider code for inclusion in the official distribution, but
28 * derived work must not be called official GROMACS. Details are found
29 * in the README & COPYING files - if they are missing, get the
30 * official version at http://www.gromacs.org.
32 * To help us fund GROMACS development, we humbly ask that you cite
33 * the research papers on the package. Check out http://www.gromacs.org.
37 * Tests various corners of gmx::RVec implementation.
39 * The main point of these tests is to check that all different constructs
40 * using gmx::RVec compile, and that some of the non-trivial conversions
41 * to/from rvec work as intended.
43 * \author Teemu Murtola <teemu.murtola@gmail.com>
44 * \ingroup module_math
48 #include "gromacs/math/vectypes.h"
52 #include <gtest/gtest.h>
54 #include "gromacs/math/vec.h"
56 #include "testutils/testasserts.h"
65 TEST(RVecTest, CanBeStoredInVector)
68 v.emplace_back(1, 2, 3);
70 EXPECT_EQ(1, v[0][XX]);
71 EXPECT_EQ(2, v[0][YY]);
72 EXPECT_EQ(3, v[0][ZZ]);
75 TEST(RVecTest, ConvertsImplicitlyFrom_rvec)
80 EXPECT_EQ(1, v[0][XX]);
81 EXPECT_EQ(2, v[0][YY]);
82 EXPECT_EQ(3, v[0][ZZ]);
85 TEST(RVecTest, ConvertsImplicitlyTo_rvec)
88 v.emplace_back(1, 2, 3);
96 TEST(RVecTest, WorksAsMutable_rvec)
99 v.emplace_back(1, 2, 3);
100 rvec x = { 2, 3, 4 };
102 EXPECT_EQ(2, v[0][XX]);
103 EXPECT_EQ(3, v[0][YY]);
104 EXPECT_EQ(4, v[0][ZZ]);
107 TEST(RVecTest, WorksAs_rvec_Array)
110 v.emplace_back(1, 2, 3);
111 v.emplace_back(2, 3, 4);
112 const rvec* r = as_rvec_array(v.data());
113 EXPECT_EQ(1, r[0][XX]);
114 EXPECT_EQ(2, r[0][YY]);
115 EXPECT_EQ(3, r[0][ZZ]);
116 EXPECT_EQ(2, r[1][XX]);
117 EXPECT_EQ(3, r[1][YY]);
118 EXPECT_EQ(4, r[1][ZZ]);
121 TEST(RVecTest, ComparesEqual)
126 EXPECT_EQ(a == b, true);
127 EXPECT_EQ(a == c, false);
130 TEST(RVecTest, ComparesUnequal)
135 EXPECT_EQ(a != b, false);
136 EXPECT_EQ(a != c, true);
140 * Test overloaded math operations
143 TEST(RVecTest, CanAddRVecToRvec)
154 TEST(RVecTest, CanAddAssignRVecToRvec)
165 TEST(RVecTest, CanSubtractRVecFromRvec)
173 EXPECT_EQ(-2, c[ZZ]);
176 TEST(RVecTest, CanSubtractAssignRVecFromRvec)
184 EXPECT_EQ(-2, b[ZZ]);
187 TEST(RVecTest, CanDotProductRVecByRvec)
196 TEST(RVecTest, CanCrossProductRVecByRvec)
202 EXPECT_EQ(-4, c[XX]);
204 EXPECT_EQ(-4, c[ZZ]);
208 * Test for inplace operations imported from vec.h
211 TEST(RVecTest, CanDivideRVecInplace)
222 TEST(RVecTest, CanScaleRVec)
232 TEST(RVecTest, CanDivideRVec)
242 TEST(RVecTest, CanDoUnitvFromRVec)
247 EXPECT_REAL_EQ(1, b[XX]);
248 EXPECT_REAL_EQ(0, b[YY]);
249 EXPECT_REAL_EQ(0, b[ZZ]);
252 TEST(RVecTest, CanSqLengthOfRVec)
257 EXPECT_REAL_EQ(9, b);
260 TEST(RVecTest, CanLengthOfRVec)
265 EXPECT_REAL_EQ(3, b);
268 TEST(RVecTest, CanCastToRVec)
278 TEST(RVecTest, CanCastToDVec)
290 * Tests for out of class functions
292 TEST(RVecTest, CanLeftScalarMultiply)
303 TEST(RVecTest, CanRightScalarMultiply)
314 TEST(RVecTest, CanGetUnitvFromRVec)
318 b = gmx::unitVector(a);
319 EXPECT_REAL_EQ(1, b[XX]);
320 EXPECT_REAL_EQ(0, b[YY]);
321 EXPECT_REAL_EQ(0, b[ZZ]);
324 TEST(RVecTest, CanGetSqLengthOfRVec)
329 EXPECT_REAL_EQ(9, b);
332 TEST(RVecTest, CanGetLengthOfRVec)
337 EXPECT_REAL_EQ(3, b);
340 TEST(RVecTest, CanDoCrossProductOfRVec)
345 c = gmx::cross(a, b);
346 EXPECT_EQ(-4, c[XX]);
348 EXPECT_EQ(-4, c[ZZ]);
351 TEST(RVecTest, CanDoDotProductOfRVec)
360 TEST(RVecTest, CanScaleByVector)
364 RVec scaled = scaleByVector(a, b);
365 EXPECT_REAL_EQ(3, scaled[XX]);
366 EXPECT_REAL_EQ(4, scaled[YY]);
367 EXPECT_REAL_EQ(3, scaled[ZZ]);
370 TEST(RVecTest, asIVec)
372 RVec a(1.2, 2.7, -3e3);
373 auto asIvec = a.toIVec();
375 EXPECT_REAL_EQ(1, asIvec[XX]);
376 EXPECT_REAL_EQ(2, asIvec[YY]);
377 EXPECT_REAL_EQ(-3000, asIvec[ZZ]);
380 TEST(RVecTest, elementWiseMin)
384 auto minAB = elementWiseMin(a, b);
386 EXPECT_REAL_EQ(1, minAB[XX]);
387 EXPECT_REAL_EQ(2, minAB[YY]);
388 EXPECT_REAL_EQ(1, minAB[ZZ]);
391 TEST(RVecTest, elementWiseMax)
395 auto maxAB = elementWiseMax(a, b);
397 EXPECT_REAL_EQ(3, maxAB[XX]);
398 EXPECT_REAL_EQ(2, maxAB[YY]);
399 EXPECT_REAL_EQ(3, maxAB[ZZ]);
403 * Helper function for testing DVec to dvec conversions.
405 const dvec* testFunction(const dvec& x)
410 TEST(RVecTest, WorksAs_dvec_Reference)
413 const dvec* r = testFunction(v.as_vec());
414 EXPECT_EQ(1, r[0][XX]);
415 EXPECT_EQ(2, r[0][YY]);
416 EXPECT_EQ(3, r[0][ZZ]);
420 * Helper function for testing IVec to ivec conversions.
422 const ivec* testFunction(const ivec& x)
427 TEST(RVecTest, WorksAs_ivec_Reference)
430 const ivec* r = testFunction(v.as_vec());
431 EXPECT_EQ(1, r[0][XX]);
432 EXPECT_EQ(2, r[0][YY]);
433 EXPECT_EQ(3, r[0][ZZ]);
437 * Helper function for testing RVec to rvec conversions.
439 #if !GMX_DOUBLE // otherwise rvec==dvec
440 const rvec* testFunction(const rvec& x)
446 TEST(RVecTest, WorksAs_rvec_Reference)
449 const rvec* r = testFunction(v);
450 EXPECT_EQ(1, r[0][XX]);
451 EXPECT_EQ(2, r[0][YY]);
452 EXPECT_EQ(3, r[0][ZZ]);
455 TEST(RVecTest, CopyConstructorWorks)
459 EXPECT_EQ(1, copy[XX]);
460 EXPECT_EQ(2, copy[YY]);
461 EXPECT_EQ(3, copy[ZZ]);
464 TEST(RVecTest, CopyAssignmentWorks)
469 EXPECT_EQ(1, copy[XX]);
470 EXPECT_EQ(2, copy[YY]);
471 EXPECT_EQ(3, copy[ZZ]);
474 TEST(RVecTest, MoveConstructorWorks)
478 EXPECT_EQ(1, copy[XX]);
479 EXPECT_EQ(2, copy[YY]);
480 EXPECT_EQ(3, copy[ZZ]);
483 TEST(RVecTest, MoveAssignmentWorks)
488 EXPECT_EQ(1, copy[XX]);
489 EXPECT_EQ(2, copy[YY]);
490 EXPECT_EQ(3, copy[ZZ]);