Skip to content

Commit

Permalink
Merge pull request #425 from lanl/jmm/unify-package-names
Browse files Browse the repository at this point in the history
Remove ambiguity in package names.
  • Loading branch information
pgrete authored Jan 25, 2021
2 parents a8505cf + b2b5471 commit 816ba6c
Show file tree
Hide file tree
Showing 15 changed files with 87 additions and 45 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
- [[PR 359]](https://github.com/lanl/parthenon/pull/359) MeshBlockPack support for buffer pack and unpack of CellCentered Variables

### Changed (changing behavior/API/variables/...)
- [[PR 425]](https://github.com/lanl/parthenon/pull/425) Remove ambiguity in package names. `Packages_t` no longer has an `operator[]` method. This has been replaced with `Add` and `Get`.
- [[PR 359]](https://github.com/lanl/parthenon/pull/359) Templated inline reconstruction functions to support different types (e.g., `ParArray4D` or `ParArrayND`)

### Fixed (not changing behavior/API/variables/...)
Expand Down
6 changes: 3 additions & 3 deletions example/advection/advection_driver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ TaskCollection AdvectionDriver::MakeTaskCollection(BlockList_t &blocks, const in
}

const auto &buffer_send_pack =
blocks[0]->packages["advection_package"]->Param<bool>("buffer_send_pack");
blocks[0]->packages.Get("advection_package")->Param<bool>("buffer_send_pack");
if (buffer_send_pack) {
TaskRegion &tr = tc.AddRegion(num_partitions);
for (int i = 0; i < num_partitions; i++) {
Expand All @@ -138,7 +138,7 @@ TaskCollection AdvectionDriver::MakeTaskCollection(BlockList_t &blocks, const in
}

const auto &buffer_recv_pack =
blocks[0]->packages["advection_package"]->Param<bool>("buffer_recv_pack");
blocks[0]->packages.Get("advection_package")->Param<bool>("buffer_recv_pack");
if (buffer_recv_pack) {
TaskRegion &tr = tc.AddRegion(num_partitions);
for (int i = 0; i < num_partitions; i++) {
Expand All @@ -154,7 +154,7 @@ TaskCollection AdvectionDriver::MakeTaskCollection(BlockList_t &blocks, const in
}

const auto &buffer_set_pack =
blocks[0]->packages["advection_package"]->Param<bool>("buffer_set_pack");
blocks[0]->packages.Get("advection_package")->Param<bool>("buffer_set_pack");
if (buffer_set_pack) {
TaskRegion &tr = tc.AddRegion(num_partitions);
for (int i = 0; i < num_partitions; i++) {
Expand Down
6 changes: 3 additions & 3 deletions example/advection/advection_package.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ AmrTag CheckRefinement(MeshBlockData<Real> *rc) {
},
Kokkos::MinMax<Real>(minmax));

auto pkg = pmb->packages["advection_package"];
auto pkg = pmb->packages.Get("advection_package");
const auto &refine_tol = pkg->Param<Real>("refine_tol");
const auto &derefine_tol = pkg->Param<Real>("derefine_tol");

Expand Down Expand Up @@ -279,7 +279,7 @@ void PostFill(MeshBlockData<Real> *rc) {
// provide the routine that estimates a stable timestep for this package
Real EstimateTimestepBlock(MeshBlockData<Real> *rc) {
auto pmb = rc->GetBlockPointer();
auto pkg = pmb->packages["advection_package"];
auto pkg = pmb->packages.Get("advection_package");
const auto &cfl = pkg->Param<Real>("cfl");
const auto &vx = pkg->Param<Real>("vx");
const auto &vy = pkg->Param<Real>("vy");
Expand Down Expand Up @@ -319,7 +319,7 @@ TaskStatus CalculateFluxes(std::shared_ptr<MeshBlockData<Real>> &rc) {
IndexRange kb = pmb->cellbounds.GetBoundsK(IndexDomain::interior);

ParArrayND<Real> advected = rc->Get("advected").data;
auto pkg = pmb->packages["advection_package"];
auto pkg = pmb->packages.Get("advection_package");
const auto &vx = pkg->Param<Real>("vx");
const auto &vy = pkg->Param<Real>("vy");
const auto &vz = pkg->Param<Real>("vz");
Expand Down
8 changes: 4 additions & 4 deletions example/advection/parthenon_app_inputs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ void ProblemGenerator(MeshBlock *pmb, ParameterInput *pin) {
auto &rc = pmb->meshblock_data.Get();
auto &q = rc->Get("advected").data;

auto pkg = pmb->packages["advection_package"];
auto pkg = pmb->packages.Get("advection_package");
const auto &amp = pkg->Param<Real>("amp");
const auto &vel = pkg->Param<Real>("vel");
const auto &k_par = pkg->Param<Real>("k_par");
Expand Down Expand Up @@ -93,7 +93,7 @@ void UserWorkAfterLoop(Mesh *mesh, ParameterInput *pin, SimTime &tm) {
Real max_err = 0.0;

for (auto &pmb : mesh->block_list) {
auto pkg = pmb->packages["advection_package"];
auto pkg = pmb->packages.Get("advection_package");

auto rc = pmb->meshblock_data.Get(); // get base container
const auto &amp = pkg->Param<Real>("amp");
Expand Down Expand Up @@ -212,12 +212,12 @@ void UserWorkAfterLoop(Mesh *mesh, ParameterInput *pin, SimTime &tm) {
Packages_t ProcessPackages(std::unique_ptr<ParameterInput> &pin) {
Packages_t packages;
auto pkg = advection_package::Initialize(pin.get());
packages[pkg->label()] = pkg;
packages.Add(pkg);

auto app = std::make_shared<StateDescriptor>("advection_app");
app->PreFillDerivedBlock = advection_package::PreFill;
app->PostFillDerivedBlock = advection_package::PostFill;
packages[app->label()] = app;
packages.Add(app);

return packages;
}
Expand Down
6 changes: 3 additions & 3 deletions example/calculate_pi/calculate_pi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ void SetInOrOut(MeshBlockData<Real> *rc) {
IndexRange jb = pmb->cellbounds.GetBoundsJ(IndexDomain::interior);
IndexRange kb = pmb->cellbounds.GetBoundsK(IndexDomain::interior);
ParArrayND<Real> &v = rc->Get("in_or_out").data;
const auto &radius = pmb->packages["calculate_pi"]->Param<Real>("radius");
const auto &radius = pmb->packages.Get("calculate_pi")->Param<Real>("radius");
auto &coords = pmb->coords;
// Set an indicator function that indicates whether the cell center
// is inside or outside of the circle we're interating the area of.
Expand Down Expand Up @@ -103,7 +103,7 @@ TaskStatus ComputeArea(std::shared_ptr<MeshData<Real>> &md, ParArrayHost<Real> a
}

TaskStatus AccumulateAreas(ParArrayHost<Real> areas, Packages_t &packages) {
const auto &radius = packages["calculate_pi"]->Param<Real>("radius");
const auto &radius = packages.Get("calculate_pi")->Param<Real>("radius");

Real area = 0.0;
for (int i = 0; i < areas.GetSize(); i++) {
Expand All @@ -119,7 +119,7 @@ TaskStatus AccumulateAreas(ParArrayHost<Real> areas, Packages_t &packages) {
Real pi_val = area;
#endif

packages["calculate_pi"]->AddParam("pi_val", pi_val);
packages.Get("calculate_pi")->AddParam("pi_val", pi_val);
return TaskStatus::complete;
}

Expand Down
4 changes: 2 additions & 2 deletions example/calculate_pi/pi_driver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ int main(int argc, char *argv[]) {
Packages_t ProcessPackages(std::unique_ptr<ParameterInput> &pin) {
Packages_t packages;
// only have one package for this app, but will typically have more things added to
packages["calculate_pi"] = calculate_pi::Initialize(pin.get());
packages.Add(calculate_pi::Initialize(pin.get()));
return packages;
}

Expand All @@ -90,7 +90,7 @@ parthenon::DriverStatus PiDriver::Execute() {
ConstructAndExecuteTaskLists<>(this);

// retrieve "pi_val" and post execute.
auto &pi_val = pmesh->packages["calculate_pi"]->Param<Real>("pi_val");
auto &pi_val = pmesh->packages.Get("calculate_pi")->Param<Real>("pi_val");
pmesh->mbcnt = pmesh->nbtotal; // this is how many blocks were processed
PostExecute(pi_val);
return DriverStatus::complete;
Expand Down
4 changes: 2 additions & 2 deletions example/face_fields/face_fields_example.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ Packages_t ProcessPackages(std::unique_ptr<ParameterInput> &pin) {
array_size);
package->AddField("f.f.face_averaged_value", m);

packages["FaceFieldExample"] = package;
packages.Add(package);
return packages;
}

Expand Down Expand Up @@ -167,7 +167,7 @@ TaskList FaceFieldExample::MakeTaskList(MeshBlock *pmb) {
parthenon::TaskStatus fill_faces(parthenon::MeshBlock *pmb) {
using parthenon::Real;

auto example = pmb->packages["FaceFieldExample"];
auto example = pmb->packages.Get("FaceFieldExample");
Real px = example->Param<Real>("px");
Real py = example->Param<Real>("py");
Real pz = example->Param<Real>("pz");
Expand Down
8 changes: 4 additions & 4 deletions example/particles/particles.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ namespace particles_example {

Packages_t ProcessPackages(std::unique_ptr<ParameterInput> &pin) {
Packages_t packages;
packages["particles_package"] = particles_example::Particles::Initialize(pin.get());
packages.Add(particles_example::Particles::Initialize(pin.get()));
return packages;
}

Expand Down Expand Up @@ -82,7 +82,7 @@ AmrTag CheckRefinement(MeshBlockData<Real> *rc) { return AmrTag::same; }

Real EstimateTimestepBlock(MeshBlockData<Real> *rc) {
auto pmb = rc->GetBlockPointer();
auto pkg = pmb->packages["particles_package"];
auto pkg = pmb->packages.Get("particles_package");
const Real &dt = pkg->Param<Real>("const_dt");
return dt;
}
Expand All @@ -97,7 +97,7 @@ Real EstimateTimestepBlock(MeshBlockData<Real> *rc) {
// first some helper tasks

TaskStatus DestroySomeParticles(MeshBlock *pmb) {
auto pkg = pmb->packages["particles_package"];
auto pkg = pmb->packages.Get("particles_package");
auto swarm = pmb->swarm_data.Get()->Get("my particles");
auto rng_pool = pkg->Param<RNGPool>("rng_pool");

Expand Down Expand Up @@ -170,7 +170,7 @@ TaskStatus DepositParticles(MeshBlock *pmb) {
}

TaskStatus CreateSomeParticles(MeshBlock *pmb) {
auto pkg = pmb->packages["particles_package"];
auto pkg = pmb->packages.Get("particles_package");
auto swarm = pmb->swarm_data.Get()->Get("my particles");
auto rng_pool = pkg->Param<RNGPool>("rng_pool");
auto num_particles = pkg->Param<int>("num_particles");
Expand Down
21 changes: 10 additions & 11 deletions src/interface/state_descriptor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -167,13 +167,13 @@ class SparseProvider : public VariableProvider {
void AddPrivate(const std::string &package, const std::string &var,
const Metadata &metadata) {
const std::string name = package + "::" + var;
for (auto &m : packages_[package]->AllSparseFields().at(var)) {
for (auto &m : packages_.Get(package)->AllSparseFields().at(var)) {
state_->AddField(name, m.second);
}
}
void AddProvides(const std::string &package, const std::string &var,
const Metadata &metadata) {
for (auto &m : packages_[package]->AllSparseFields().at(var)) {
for (auto &m : packages_.Get(package)->AllSparseFields().at(var)) {
state_->AddField(var, m.second);
}
}
Expand All @@ -192,15 +192,15 @@ class SwarmProvider : public VariableProvider {
: packages_(packages), state_(sd) {}
void AddPrivate(const std::string &package, const std::string &var,
const Metadata &metadata) {
AddSwarm_(packages_[package].get(), var, package + "::" + var, metadata);
AddSwarm_(packages_.Get(package).get(), var, package + "::" + var, metadata);
}
void AddProvides(const std::string &package, const std::string &var,
const Metadata &metadata) {
AddSwarm_(packages_[package].get(), var, var, metadata);
AddSwarm_(packages_.Get(package).get(), var, var, metadata);
}
void AddOverridable(const std::string &swarm, Metadata &metadata) {
state_->AddSwarm(swarm, metadata);
for (auto &pair : packages_) {
for (auto &pair : packages_.AllPackages()) {
auto &package = pair.second;
if (package->SwarmPresent(swarm)) {
for (auto &pair : package->AllSwarmValues(swarm)) {
Expand Down Expand Up @@ -343,22 +343,21 @@ std::shared_ptr<StateDescriptor> ResolvePackages(Packages_t &packages) {

// Add private/provides variables. Check for conflicts among those.
// Track dependent and overridable variables.
for (auto &pair : packages) {
for (auto &pair : packages.AllPackages()) {
auto &name = pair.first;
auto &package = pair.second;
package->ValidateMetadata(); // set unset flags
// sort
var_tracker.CategorizeCollection(package->label(), package->AllFields(),
&cvar_provider);
var_tracker.CategorizeCollection(name, package->AllFields(), &cvar_provider);
for (auto &p2 : package->AllSparseFields()) { // sparse
auto &var = p2.first;
auto &mdict = p2.second;
for (auto &p3 : mdict) {
auto &metadata = p3.second;
var_tracker.Categorize(package->label(), var, metadata, &sparse_provider);
var_tracker.Categorize(name, var, metadata, &sparse_provider);
}
}
swarm_tracker.CategorizeCollection(package->label(), package->AllSwarms(),
&swarm_provider);
swarm_tracker.CategorizeCollection(name, package->AllSwarms(), &swarm_provider);
}

// check that dependent variables are provided somewhere
Expand Down
22 changes: 21 additions & 1 deletion src/interface/state_descriptor.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#include "interface/params.hpp"
#include "interface/swarm.hpp"
#include "refinement/amr_criteria.hpp"
#include "utils/error_checking.hpp"

namespace parthenon {

Expand Down Expand Up @@ -245,7 +246,26 @@ class StateDescriptor {
Dictionary<Dictionary<Metadata>> swarmValueMetadataMap_;
};

using Packages_t = Dictionary<std::shared_ptr<StateDescriptor>>;
class Packages_t {
public:
Packages_t() = default;
void Add(const std::shared_ptr<StateDescriptor> &package) {
const auto &name = package->label();
PARTHENON_REQUIRE_THROWS(packages_.count(name) == 0,
"Package name " + name + " must be unique.");
packages_[name] = package;
return;
}
std::shared_ptr<StateDescriptor> const &Get(const std::string &name) {
return packages_.at(name);
}
const Dictionary<std::shared_ptr<StateDescriptor>> &AllPackages() const {
return packages_;
}

private:
Dictionary<std::shared_ptr<StateDescriptor>> packages_;
};

std::shared_ptr<StateDescriptor> ResolvePackages(Packages_t &packages);

Expand Down
8 changes: 4 additions & 4 deletions src/interface/update.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ template <typename T>
TaskStatus EstimateTimestep(T *rc) {
Kokkos::Profiling::pushRegion("Task_EstimateTimestep");
Real dt_min = std::numeric_limits<Real>::max();
for (const auto &pkg : rc->GetParentPointer()->packages) {
for (const auto &pkg : rc->GetParentPointer()->packages.AllPackages()) {
Real dt = pkg.second->EstimateTimestep(rc);
dt_min = std::min(dt_min, dt);
}
Expand All @@ -99,17 +99,17 @@ TaskStatus FillDerived(T *rc) {
Kokkos::Profiling::pushRegion("Task_FillDerived");
auto pm = rc->GetParentPointer();
Kokkos::Profiling::pushRegion("PreFillDerived");
for (const auto &pkg : pm->packages) {
for (const auto &pkg : pm->packages.AllPackages()) {
pkg.second->PreFillDerived(rc);
}
Kokkos::Profiling::popRegion(); // PreFillDerived
Kokkos::Profiling::pushRegion("FillDerived");
for (const auto &pkg : pm->packages) {
for (const auto &pkg : pm->packages.AllPackages()) {
pkg.second->FillDerived(rc);
}
Kokkos::Profiling::popRegion(); // FillDerived
Kokkos::Profiling::pushRegion("PostFillDerived");
for (const auto &pkg : pm->packages) {
for (const auto &pkg : pm->packages.AllPackages()) {
pkg.second->PostFillDerived(rc);
}
Kokkos::Profiling::popRegion(); // PostFillDerived
Expand Down
4 changes: 2 additions & 2 deletions src/parthenon_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ ParthenonStatus ParthenonManager::ParthenonInit(int argc, char *argv[]) {
// set up all the packages in the application
auto packages = ProcessPackages(pinput);
// always add the Refinement package
packages["ParthenonRefinement"] = Refinement::Initialize(pinput.get());
packages.Add(Refinement::Initialize(pinput.get()));

if (arg.res_flag == 0) {
pmesh = std::make_unique<Mesh>(pinput.get(), app_input.get(), properties, packages,
Expand All @@ -157,7 +157,7 @@ ParthenonStatus ParthenonManager::ParthenonInit(int argc, char *argv[]) {
}

// add root_level to all max_level
for (auto const &ph : packages) {
for (auto const &ph : packages.AllPackages()) {
for (auto &amr : ph.second->amr_criteria) {
amr->max_level += pmesh->GetRootLevel();
}
Expand Down
4 changes: 2 additions & 2 deletions src/pgen/default_pgen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,14 +56,14 @@ void Mesh::UserWorkInLoopDefault(Mesh *, ParameterInput *, SimTime const &) {

void Mesh::PreStepUserDiagnosticsInLoopDefault(Mesh *pmesh, ParameterInput *,
SimTime const &simtime) {
for (auto &package : pmesh->packages) {
for (auto &package : pmesh->packages.AllPackages()) {
package.second->PreStepDiagnostics(simtime, pmesh->mesh_data.Get().get());
}
}

void Mesh::PostStepUserDiagnosticsInLoopDefault(Mesh *pmesh, ParameterInput *,
SimTime const &simtime) {
for (auto &package : pmesh->packages) {
for (auto &package : pmesh->packages.AllPackages()) {
package.second->PostStepDiagnostics(simtime, pmesh->mesh_data.Get().get());
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/refinement/refinement.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ AmrTag CheckAllRefinement(MeshBlockData<Real> *rc) {
std::shared_ptr<MeshBlock> pmb = rc->GetBlockPointer();
// delta_level holds the max over all criteria. default to derefining.
AmrTag delta_level = AmrTag::derefine;
for (auto &pkg : pmb->packages) {
for (auto &pkg : pmb->packages.AllPackages()) {
auto &desc = pkg.second;
delta_level = std::max(delta_level, desc->CheckRefinement(rc));
if (delta_level == AmrTag::refine) {
Expand Down
Loading

0 comments on commit 816ba6c

Please sign in to comment.