Program Listing for File track_particle.hpp

Return to documentation for file (src/particle/track_particle/track_particle.hpp)

#pragma once

#include <string>

#include "fields.hpp"
#include "particle.hpp"

namespace lili::particle {
class TrackParticles {
 public:
  // Constructor
  TrackParticles()
      : n_track_(0), dtrack_save_(0), i_track_(0), i_dump_(0), prefix_("tp_") {
    InitializeTrackParticles();
  }

  TrackParticles(int n_track, int dtrack_save)
      : n_track_(n_track),
        dtrack_save_(dtrack_save),
        i_track_(0),
        i_dump_(0),
        prefix_("tp_") {
    InitializeTrackParticles();
  }

  // Copy constructor
  TrackParticles(const TrackParticles& other)
      : n_track_(other.n_track_),
        dtrack_save_(other.dtrack_save_),
        i_track_(other.i_track_),
        i_dump_(other.i_dump_),
        prefix_(other.prefix_) {
    InitializeTrackParticles();
    std::copy(other.idtrack_, other.idtrack_ + n_track_ * dtrack_save_,
              idtrack_);
    std::copy(other.xtrack_, other.xtrack_ + n_track_ * dtrack_save_, xtrack_);
    std::copy(other.ytrack_, other.ytrack_ + n_track_ * dtrack_save_, ytrack_);
    std::copy(other.ztrack_, other.ztrack_ + n_track_ * dtrack_save_, ztrack_);
    std::copy(other.utrack_, other.utrack_ + n_track_ * dtrack_save_, utrack_);
    std::copy(other.vtrack_, other.vtrack_ + n_track_ * dtrack_save_, vtrack_);
    std::copy(other.wtrack_, other.wtrack_ + n_track_ * dtrack_save_, wtrack_);
    std::copy(other.extrack_, other.extrack_ + n_track_ * dtrack_save_,
              extrack_);
    std::copy(other.eytrack_, other.eytrack_ + n_track_ * dtrack_save_,
              eytrack_);
    std::copy(other.eztrack_, other.eztrack_ + n_track_ * dtrack_save_,
              eztrack_);
    std::copy(other.bxtrack_, other.bxtrack_ + n_track_ * dtrack_save_,
              bxtrack_);
    std::copy(other.bytrack_, other.bytrack_ + n_track_ * dtrack_save_,
              bytrack_);
    std::copy(other.bztrack_, other.bztrack_ + n_track_ * dtrack_save_,
              bztrack_);
  }

  // Move constructor
  TrackParticles(TrackParticles&& other) noexcept : TrackParticles() {
    swap(*this, other);
  };

  // Destructor
  ~TrackParticles() {
    delete[] idtrack_;
    delete[] xtrack_;
    delete[] ytrack_;
    delete[] ztrack_;
    delete[] utrack_;
    delete[] vtrack_;
    delete[] wtrack_;
    delete[] extrack_;
    delete[] eytrack_;
    delete[] eztrack_;
    delete[] bxtrack_;
    delete[] bytrack_;
    delete[] bztrack_;
  };

  // Swap data
  friend void swap(TrackParticles& first, TrackParticles& second) noexcept {
    using std::swap;
    swap(first.n_track_, second.n_track_);
    swap(first.dtrack_save_, second.dtrack_save_);
    swap(first.i_track_, second.i_track_);
    swap(first.i_dump_, second.i_dump_);
    swap(first.prefix_, second.prefix_);

    swap(first.idtrack_, second.idtrack_);
    swap(first.xtrack_, second.xtrack_);
    swap(first.ytrack_, second.ytrack_);
    swap(first.ztrack_, second.ztrack_);
    swap(first.utrack_, second.utrack_);
    swap(first.vtrack_, second.vtrack_);
    swap(first.wtrack_, second.wtrack_);
    swap(first.extrack_, second.extrack_);
    swap(first.eytrack_, second.eytrack_);
    swap(first.eztrack_, second.eztrack_);
    swap(first.bxtrack_, second.bxtrack_);
    swap(first.bytrack_, second.bytrack_);
    swap(first.bztrack_, second.bztrack_);
  }

  // Operators
  TrackParticles& operator=(TrackParticles other) {
    swap(*this, other);
    return *this;
  }

  void InitializeTrackParticles();

  void SaveTrackedParticles(Particles& particles);

  void SaveTrackedParticles(Particles& particles, mesh::Fields& fields);

  void DumpTrackedParticles();

  // Getter
  int n_track() const { return n_track_; }
  int dl_track() const { return dl_track_; }
  int dtrack_save() const { return dtrack_save_; }
  int i_track() const { return i_track_; }
  int i_dump() const { return i_dump_; }
  std::string prefix() const { return prefix_; }

  // Setter
  int& dl_track() { return dl_track_; }
  void SetPrefix(std::string prefix) { prefix_ = prefix; }

  // Public data members
  Particles track_particles;

 private:
  int n_track_;
  int dl_track_;
  int dtrack_save_;
  int i_track_;
  int i_dump_;
  std::string prefix_;
  ulong* idtrack_;
  double *xtrack_, *ytrack_, *ztrack_;
  double *utrack_, *vtrack_, *wtrack_;
  double *extrack_, *eytrack_, *eztrack_;
  double *bxtrack_, *bytrack_, *bztrack_;
};
}  // namespace lili::particle