OPALX (Object Oriented Parallel Accelerator Library for Exascal) master (dc2a29eed580)
OPALX
Loading...
Searching...
No Matches
TestPolynomialTimeDependence.cpp
Go to the documentation of this file.
1//
2// Copyright (c) 2026, Paul Scherrer Institute, Villigen PSI, Switzerland
3// All rights reserved
4//
5// This file is part of OPAL.
6//
7// OPAL is free software: you can redistribute it and/or modify
8// it under the terms of the GNU General Public License as published by
9// the Free Software Foundation, either version 3 of the License, or
10// (at your option) any later version.
11//
12// You should have received a copy of the GNU General License
13// along with OPAL. If not, see <https://www.gnu.org/licenses/>.
14//
15
18#include "Ippl.h"
20#include "gtest/gtest.h"
21
22TEST(TestPolynomialTimeDependence, PolynomialTimeDependenceTest) {
23 // Check empty polynomial coefficients always returns 0.
24 std::vector<double> test;
25 PolynomialTimeDependence time_dependence_1(test);
26 EXPECT_DOUBLE_EQ(time_dependence_1.getValue(0.1), 0.);
27
28 // Check constant term produces constant
29 test.push_back(1.);
30 PolynomialTimeDependence time_dependence_2(test);
31 EXPECT_DOUBLE_EQ(time_dependence_2.getValue(0.1), 1.);
32
33 // Check cubic terms
34 test.push_back(2.);
35 test.push_back(3.);
36 PolynomialTimeDependence time_dependence_3(test);
37 EXPECT_DOUBLE_EQ(time_dependence_3.getValue(0.1), 1.23);
38
39 // Check clone produces same result
40 PolynomialTimeDependence* time_dependence_clone = time_dependence_3.clone();
41 EXPECT_DOUBLE_EQ(time_dependence_clone->getValue(0.1), 1.23);
42 delete time_dependence_clone;
43}
44
45TEST(TestPolynomialTimeDependence, TDMapTest) {
46 // throw on empty value
48 // set/get time dependence
49 PolynomialTimeDependence time_dep(std::vector<double>{});
50 const std::shared_ptr<PolynomialTimeDependence> td1(time_dep.clone());
52 EXPECT_EQ(AbstractTimeDependence::getTimeDependence("td1"), td1);
53 const std::shared_ptr<PolynomialTimeDependence> td2(time_dep.clone());
55 EXPECT_EQ(AbstractTimeDependence::getTimeDependence("td2"), td2);
56 EXPECT_EQ(AbstractTimeDependence::getTimeDependence("td1"), td1);
57 // set time dependence overwriting existing time dependence
58 // should overwrite, without memory leak
59 const std::shared_ptr<PolynomialTimeDependence> td3(time_dep.clone());
61 EXPECT_EQ(AbstractTimeDependence::getTimeDependence("td1"), td3);
62}
63
64TEST(TestPolynomialTimeDependence, TDMapNameLookupTest) {
66 PolynomialTimeDependence time_dep(std::vector<double>(1, 1));
67 std::shared_ptr<PolynomialTimeDependence> td1(time_dep.clone());
68 std::shared_ptr<PolynomialTimeDependence> td2(time_dep.clone());
69 std::shared_ptr<PolynomialTimeDependence> td3(time_dep.clone());
73 std::string name1 = AbstractTimeDependence::getName(td1);
74 EXPECT_EQ(name1, "td1");
75 std::string name2 = AbstractTimeDependence::getName(td2);
76 EXPECT_TRUE(name2 == "td2" || name2 == "td3");
78}
79
80TEST(TestPolynomialTimeDependence, Integral) {
81 // Check empty polynomial coefficients always returns 0.
82 PolynomialTimeDependence time_dependence_1(std::vector<double>{});
83 EXPECT_DOUBLE_EQ(time_dependence_1.getIntegral(0.1), 0.0);
84
85 // Check constant term produces constant
86 PolynomialTimeDependence time_dependence_2({1.0});
87 EXPECT_DOUBLE_EQ(time_dependence_2.getIntegral(0.1), 0.1);
88
89 // Check cubic terms
90 PolynomialTimeDependence time_dependence_3({1.0, 2.0, 3.0});
91 EXPECT_DOUBLE_EQ(time_dependence_3.getIntegral(0.1), 0.111);
92}
93
94TEST(TestPolynomialTimeDependence, Print) {
95 int argc = 0;
96 char** argv = nullptr;
97 ippl::initialize(argc, argv);
98 std::stringstream ss;
99 Inform inform("Test", ss);
100 inform.setOutputLevel(5);
101 PolynomialTimeDependence time_dependence({1.0, 2.0, 3.0});
102 inform << time_dependence << endl;
103 EXPECT_STREQ(
104 "Test> c0= 1.000000e+00 c1= 2.000000e+00 c2= 3.000000e+00 \nTest> \n",
105 ss.str().c_str());
106 ippl::finalize();
107}
TEST(TestPolynomialTimeDependence, PolynomialTimeDependenceTest)
static void setTimeDependence(const std::string &name, std::shared_ptr< AbstractTimeDependence > time_dep)
static std::string getName(const std::shared_ptr< AbstractTimeDependence > &time_dep)
static std::shared_ptr< AbstractTimeDependence > getTimeDependence(const std::string &name)
PolynomialTimeDependence * clone() override
double getValue(double time) override