/* Copyright 2019 Andrew Myers, Axel Huebl, David Grote * Luca Fedeli, Maxence Thevenet, Revathi Jambunathan * Weiqun Zhang, levinem, Yinjian Zhao * * This file is part of WarpX. * * License: BSD-3-Clause-LBNL */ #include "Particles/ParticleIO.H" #include "Particles/MultiParticleContainer.H" #include "Particles/ParticleBuffer.H" #include "Particles/PhysicalParticleContainer.H" #include "Particles/RigidInjectedParticleContainer.H" #include "Particles/SpeciesPhysicalProperties.H" #include "Particles/WarpXParticleContainer.H" #include "Utils/WarpXConst.H" #include "Utils/WarpXProfilerWrapper.H" #include "WarpX.H" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace amrex; void RigidInjectedParticleContainer::ReadHeader (std::istream& is) { is >> charge >> mass; WarpX::GotoNextLine(is); int nlevs; is >> nlevs; WarpX::GotoNextLine(is); AMREX_ASSERT(zinject_plane_levels.size() == 0); for (int i = 0; i < nlevs; ++i) { int zinject_plane_tmp; is >> zinject_plane_tmp; zinject_plane_levels.push_back(zinject_plane_tmp); WarpX::GotoNextLine(is); } } void RigidInjectedParticleContainer::WriteHeader (std::ostream& os) const { // no need to write species_id os << charge << " " << mass << "\n"; int nlevs = zinject_plane_levels.size(); os << nlevs << "\n"; for (int i = 0; i < nlevs; ++i) { os << zinject_plane_levels[i] << "\n"; } } void WarpXParticleContainer::ReadHeader (std::istream& is) { is >> charge >> mass; WarpX::GotoNextLine(is); } void WarpXParticleContainer::WriteHeader (std::ostream& os) const { // no need to write species_id os << charge << " " << mass << "\n"; } void MultiParticleContainer::Restart (const std::string& dir) { // note: all containers is sorted like this // - species_names // - laser_names // we don't need to read back the laser particle charge/mass for (unsigned i = 0, n = species_names.size(); i < n; ++i) { allcontainers.at(i)->Restart(dir, species_names.at(i)); } } void MultiParticleContainer::ReadHeader (std::istream& is) { // note: all containers is sorted like this // - species_names // - laser_names // we don't need to read back the laser particle charge/mass for (unsigned i = 0, n = species_names.size(); i < n; ++i) { allcontainers.at(i)->ReadHeader(is); } } void MultiParticleContainer::WriteHeader (std::ostream& os) const { // note: all containers is sorted like this // - species_names // - laser_names // we don't need to read back the laser particle charge/mass for (unsigned i = 0, n = species_names.size(); i < n; ++i) { allcontainers.at(i)->WriteHeader(os); } } void PhysicalParticleContainer::ConvertUnits (ConvertDirection convert_direction) { WARPX_PROFILE("PhysicalParticleContainer::ConvertUnits()"); // Account for the special case of photons const auto t_mass = this->AmIA() ? PhysConst::m_e : this->getMass(); particlesConvertUnits(convert_direction, this, t_mass); }