IAP GITLAB

Skip to content
Snippets Groups Projects
testProcessSequence.cc 5.27 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>

#include <corsika/setup/SetupTrajectory.h> // TODO: maybe try to break this dependency later!
using corsika::setup::Trajectory;
#include <corsika/units/PhysicalUnits.h>
using namespace corsika::units::si;

using namespace std;
using namespace corsika::process;

static const int nData = 10;

class ContinuousProcess1 : public ContinuousProcess<ContinuousProcess1> {
public:
  ContinuousProcess1() {}
  void Init() { cout << "ContinuousProcess1::Init" << endl; }
  template <typename D, typename S>
  inline EProcessReturn DoContinuous(D& d, Trajectory&, S&) const {
    cout << "ContinuousProcess1::DoContinuous" << endl;
    for (int i = 0; i < nData; ++i) d.p[i] += 0.933;
    return EProcessReturn::eOk;
  }

  template <typename Particle, typename Stack>
  inline EProcessReturn DoDiscrete(Particle&, Stack&) const {
    cout << "ContinuousProcess1::DoDiscrete" << endl;
    return EProcessReturn::eOk;
  }
};

class ContinuousProcess2 : public ContinuousProcess<ContinuousProcess2> {
public:
  ContinuousProcess2() {}
  void Init() { cout << "ContinuousProcess2::Init" << endl; }
  template <typename D, typename S>
  inline EProcessReturn DoContinuous(D& d, Trajectory&, S&) const {
    cout << "ContinuousProcess2::DoContinuous" << endl;
    for (int i = 0; i < nData; ++i) d.p[i] += 0.933;
    return EProcessReturn::eOk;
  }

  template <typename Particle, typename Stack>
  inline EProcessReturn DoDiscrete(Particle&, Stack&) const {
    cout << "ContinuousProcess2::DoDiscrete" << endl;
    return EProcessReturn::eOk;
  }
};

class Process1 : public DiscreteProcess<Process1> {
public:
  Process1() {}
  void Init() { cout << "Process1::Init" << endl; }
  template <typename D, typename S>
  inline EProcessReturn DoContinuous(D& d, Trajectory&, S&) const {
    for (int i = 0; i < nData; ++i) d.p[i] += 1 + i;
ralfulrich's avatar
ralfulrich committed
    return EProcessReturn::eOk;
  template <typename Particle, typename Stack>
  inline EProcessReturn DoDiscrete(Particle&, Stack&) const {
    cout << "Process1::DoDiscrete" << endl;
    return EProcessReturn::eOk;
  }
class Process2 : public DiscreteProcess<Process2> {
public:
  Process2() {}
  void Init() { cout << "Process2::Init" << endl; }
  template <typename D, typename S>
  inline EProcessReturn DoContinuous(D& d, Trajectory&, S&) const {
    for (int i = 0; i < nData; ++i) d.p[i] *= 0.7;
ralfulrich's avatar
ralfulrich committed
    return EProcessReturn::eOk;
  template <typename Particle, typename Stack>
  inline EProcessReturn DoDiscrete(Particle&, Stack&) const {
    cout << "Process2::DoDiscrete" << endl;
    return EProcessReturn::eOk;
  }
class Process3 : public DiscreteProcess<Process3> {
public:
  Process3() {}
  void Init() { cout << "Process3::Init" << endl; }
  template <typename D, typename S>
  inline EProcessReturn DoContinuous(D& d, Trajectory&, S&) const {
    for (int i = 0; i < nData; ++i) d.p[i] += 0.933;
ralfulrich's avatar
ralfulrich committed
    return EProcessReturn::eOk;
  template <typename Particle, typename Stack>
  inline EProcessReturn DoDiscrete(Particle&, Stack&) const {
    cout << "Process3::DoDiscrete" << endl;
    return EProcessReturn::eOk;
  }
};

class Process4 : public BaseProcess<Process4> {
public:
  Process4() {}
  void Init() { cout << "Process4::Init" << endl; }
  template <typename D, typename S>
  inline EProcessReturn DoContinuous(D& d, Trajectory&, 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) {
  // void DoDiscrete(Particle& p, Stack& s) const {
};

struct DummyData {
  double p[nData] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
};
struct DummyStack {};

TEST_CASE("Cascade", "[Cascade]") {

  SECTION("sectionTwo") {

    Process1 m1;
    Process2 m2;
    Process3 m3;
    Process4 m4;

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

    ContinuousProcess1 cp1;
    ContinuousProcess2 cp2;

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

    DummyData p;
    DummyStack s;
ralfulrich's avatar
ralfulrich committed

    cout << "-->init" << endl;
    sequence2.Init();
    cout << "-->docont" << endl;
ralfulrich's avatar
ralfulrich committed
    // auto const root = corsika::geometry::CoordinateSystem::CreateRootCS();
    // corsika::geometry::Point pos(root, {0_m, 0_m, 0_m});
    // corsika::geometry::Vector<SpeedType::dimension_type> vec(root,
    // {1_m/1_s,0_m/1_s,0_m/1_s}); corsika::geometry::Line traj(pos, vec);
    Trajectory
        t; //(corsika::geometry::Trajectory<corsika::geometry::Line>(traj, 0_s, 100_ns));
    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;
    for (int i = 0; i < nLoop; ++i) { sequence.DoContinuous(p, t, s); }
    for (int i = 0; i < nData; i++) { cout << "data[" << i << "]=" << p.p[i] << endl; }
    cout << "done" << endl;
  }

  SECTION("sectionThree") {}
}