Program Listing for File task.hpp

Return to documentation for file (src/task/task.hpp)

#pragma once

#include <filesystem>
#include <map>
#include <string>
#include <variant>
#include <vector>

#include "fields.hpp"
#include "input.hpp"
#include "parameter.hpp"
#include "particle.hpp"
#include "track_particle.hpp"

namespace lili::task {

enum class TaskType {
  Base,
  CreateOutput,
  InitParticles,
  InitFields,
  MoveParticlesFull,
};

enum class SimVarType {
  EMFields,
  ParticlesVector,
  TrackParticlesVector,
};

class Task {
 public:
  // Constructor
  Task() : type_(TaskType::Base), name_("") {}
  Task(TaskType type) : type_(type), name_("") {}
  Task(std::string name) : type_(TaskType::Base), name_(name) {}

  // Getters

  TaskType type() const { return type_; }

  std::string name() const { return name_; }

  bool is_initialized() const { return is_init_; }

  int i_run() const { return i_run_; }

  bool is_cleaned() const { return is_cleaned_; }

  // Setters

  void set_name(std::string name) { name_ = name; }

  int IncrementRun() { return i_run_++; }

  virtual void Initialize() { is_init_ = true; }

  virtual void Execute() {
    // Increment the run counter
    IncrementRun();
  }

  virtual void CleanUp() { is_cleaned_ = true; }

 private:
  TaskType type_;
  std::string name_;
  bool is_init_ = false;
  int i_run_ = 0;
  bool is_cleaned_ = false;
};

class TaskCreateOutput : public Task {
 public:
  // Constructor
  TaskCreateOutput() : Task(TaskType::CreateOutput) {
    set_name("CreateOutput");
  }
  TaskCreateOutput(std::string output_folder) : Task(TaskType::CreateOutput) {
    lili::output_folder = output_folder;
    set_name("CreateOutput");
  }

  void Initialize() override {
    std::string output_folder = lili::output_folder;
    if (!std::filesystem::is_directory(output_folder)) {
      std::filesystem::create_directory(output_folder);
    }
    std::cout << "Output folder : " << output_folder << std::endl;

    // Call the base class Initialize
    Task::Initialize();
  }
};

// Global variables
extern std::vector<std::unique_ptr<Task>> default_task_list;

extern std::vector<std::unique_ptr<Task>> loop_task_list;

extern std::map<
    task::SimVarType,
    std::variant<std::unique_ptr<mesh::Fields>,
                 std::unique_ptr<std::vector<particle::Particles>>,
                 std::unique_ptr<std::vector<particle::TrackParticles>>>>
    sim_vars;

void InitializeTask(Task* task);

void ExecuteTask(Task* task);

void CleanUpTask(Task* task);

void ParseTaskList(input::Input& input);
}  // namespace lili::task