IAP GITLAB

Skip to content
Snippets Groups Projects
testProcessSequence.cc 4.9 KiB
Newer Older

/**
 * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu
 *
 * See file AUTHORS for a list of contributors.
 *
 * This software is distributed under the terms of the GNU General Public
 * Licence version 3 (GPL Version 3). See file LICENSE for a full version of
 * the license.
 */

#define CATCH_CONFIG_MAIN // This tells Catch to provide a main() - only do this in one
                          // cpp file
#include <catch2/catch.hpp>

#include <array>
#include <iomanip>
#include <iostream>

#include <corsika/process/ProcessSequence.h>

Ralf Ulrich's avatar
Ralf Ulrich committed
using namespace corsika;
using namespace corsika::units::si;
using namespace corsika::process;
Ralf Ulrich's avatar
Ralf Ulrich committed
using namespace std;
static const int nData = 10;

Ralf Ulrich's avatar
Ralf Ulrich committed
int globalCount = 0;

class ContinuousProcess1 : public ContinuousProcess<ContinuousProcess1> {
Ralf Ulrich's avatar
Ralf Ulrich committed
  int fV = 0;

Ralf Ulrich's avatar
Ralf Ulrich committed
  ContinuousProcess1(const int v)
      : fV(v) {}
  void Init() {
    cout << "ContinuousProcess1::Init" << endl;
    assert(globalCount == fV);
    globalCount++;
  }
  template <typename D, typename T, typename S>
  inline EProcessReturn DoContinuous(D& d, T&, S&) const {
    cout << "ContinuousProcess1::DoContinuous" << endl;
    for (int i = 0; i < nData; ++i) d.p[i] += 0.933;
    return EProcessReturn::eOk;
  }
};

class ContinuousProcess2 : public ContinuousProcess<ContinuousProcess2> {
Ralf Ulrich's avatar
Ralf Ulrich committed
  int fV = 0;

Ralf Ulrich's avatar
Ralf Ulrich committed
  ContinuousProcess2(const int v)
      : fV(v) {}
  void Init() {
    cout << "ContinuousProcess2::Init" << endl;
    assert(globalCount == fV);
    globalCount++;
  }
  template <typename D, typename T, typename S>
  inline EProcessReturn DoContinuous(D& d, T&, S&) const {
    cout << "ContinuousProcess2::DoContinuous" << endl;
    for (int i = 0; i < nData; ++i) d.p[i] += 0.933;
    return EProcessReturn::eOk;
  }
};

class Process1 : public DiscreteProcess<Process1> {
Ralf Ulrich's avatar
Ralf Ulrich committed
  Process1(const int v)
      : fV(v) {}
  void Init() {
    cout << "Process1::Init" << endl;
    assert(globalCount == fV);
    globalCount++;
  }
  template <typename D, typename S>
Ralf Ulrich's avatar
Ralf Ulrich committed
  inline EProcessReturn DoDiscrete(D& d, S&) const {
    for (int i = 0; i < nData; ++i) d.p[i] += 1 + i;
ralfulrich's avatar
ralfulrich committed
    return EProcessReturn::eOk;
Ralf Ulrich's avatar
Ralf Ulrich committed
  // private:
  int fV;
class Process2 : public DiscreteProcess<Process2> {
Ralf Ulrich's avatar
Ralf Ulrich committed
  int fV = 0;

Ralf Ulrich's avatar
Ralf Ulrich committed
  Process2(const int v)
      : fV(v) {}
  void Init() {
    cout << "Process2::Init" << endl;
    assert(globalCount == fV);
    globalCount++;
  template <typename Particle, typename Stack>
  inline EProcessReturn DoDiscrete(Particle&, Stack&) const {
    cout << "Process2::DoDiscrete" << endl;
    return EProcessReturn::eOk;
  }
class Process3 : public DiscreteProcess<Process3> {
Ralf Ulrich's avatar
Ralf Ulrich committed
  int fV = 0;

Ralf Ulrich's avatar
Ralf Ulrich committed
  Process3(const int v)
      : fV(v) {}
  void Init() {
    cout << "Process3::Init" << endl;
    assert(globalCount == fV);
    globalCount++;
  template <typename Particle, typename Stack>
  inline EProcessReturn DoDiscrete(Particle&, Stack&) const {
    cout << "Process3::DoDiscrete" << endl;
    return EProcessReturn::eOk;
  }
};

class Process4 : public BaseProcess<Process4> {
Ralf Ulrich's avatar
Ralf Ulrich committed
  int fV = 0;

Ralf Ulrich's avatar
Ralf Ulrich committed
  Process4(const int v)
      : fV(v) {}
  void Init() {
    cout << "Process4::Init" << endl;
    assert(globalCount == fV);
    globalCount++;
  }
  template <typename D, typename T, typename S>
  inline EProcessReturn DoContinuous(D& d, T&, S&) const {
    for (int i = 0; i < nData; ++i) { d.p[i] /= 1.2; }
ralfulrich's avatar
ralfulrich committed
    return EProcessReturn::eOk;
  }
  // inline double MinStepLength(D& d) {
Ralf Ulrich's avatar
Ralf Ulrich committed
  template <typename Particle, typename Stack>
  EProcessReturn DoDiscrete(Particle&, Stack&) const {
    return EProcessReturn::eOk;
  }
  double p[nData] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
};
struct DummyStack {};
Ralf Ulrich's avatar
Ralf Ulrich committed
struct DummyTrajectory {};
Ralf Ulrich's avatar
Ralf Ulrich committed
TEST_CASE("Process Sequence", "[Process Sequence]") {
Ralf Ulrich's avatar
Ralf Ulrich committed
  SECTION("Check init order") {
    Process1 m1(0);
    Process2 m2(1);
    Process3 m3(2);
    Process4 m4(3);

    const auto sequence = m1 + m2 + m3 + m4;

Ralf Ulrich's avatar
Ralf Ulrich committed
    globalCount = 0;
    sequence.Init();
    // REQUIRE_NOTHROW( (sequence.Init()) );

    // const auto sequence_wrong = m3 + m2 + m1 + m4;
    // globalCount = 0;
    // sequence_wrong.Init();
    // REQUIRE_THROWS(sequence_wrong.Init());
  }

  SECTION("sectionTwo") {

    ContinuousProcess1 cp1(0);
    ContinuousProcess2 cp2(3);
    Process2 m2(1);
    Process3 m3(2);

    const auto sequence2 = cp1 + m2 + m3 + cp2;

    DummyData p;
    DummyStack s;
Ralf Ulrich's avatar
Ralf Ulrich committed
    DummyTrajectory t;
ralfulrich's avatar
ralfulrich committed

Ralf Ulrich's avatar
Ralf Ulrich committed
    cout << "-->init sequence2" << endl;
    globalCount = 0;
    sequence2.Init();
    cout << "-->docont" << endl;
    sequence2.DoContinuous(p, t, s);
    cout << "-->dodisc" << endl;
    sequence2.DoDiscrete(p, s);
    cout << "-->done" << endl;

    const int nLoop = 5;
    cout << "Running loop with n=" << nLoop << endl;
Ralf Ulrich's avatar
Ralf Ulrich committed
    for (int i = 0; i < nLoop; ++i) {
      sequence2.DoContinuous(p, t, s);
      sequence2.DoDiscrete(p, s);
    }
    for (int i = 0; i < nData; i++) { cout << "data[" << i << "]=" << p.p[i] << endl; }
    cout << "done" << endl;