SPH
Job.cpp
Go to the documentation of this file.
1 #include "run/Job.h"
3 #include "post/MeshFile.h"
4 #include "quantities/Quantity.h"
5 #include "run/IRun.h"
7 #include "thread/CheckFunction.h"
8 
10 
12  if (SharedPtr<ParticleData> particleData = this->tryGetValue<ParticleData>()) {
13  SharedPtr<ParticleData> clonedData = makeShared<ParticleData>();
14  clonedData->storage = particleData->storage.clone(VisitorEnum::ALL_BUFFERS);
15  clonedData->overrides = particleData->overrides;
16  clonedData->stats = particleData->stats;
17  return clonedData;
18  } else {
19  // materials and domains are currently never modified by jobs, so we can share them
20  return *this;
21  }
22 }
23 
25  data.reset();
26 }
27 
28 static Array<AutoPtr<IJobDesc>> sRegisteredJobs;
29 
31  return sRegisteredJobs;
32 }
33 
34 RawPtr<IJobDesc> getJobDesc(const std::string& name) {
35  for (auto& desc : sRegisteredJobs) {
36  if (desc->className() == name) {
37  return desc.get();
38  }
39  }
40  return nullptr;
41 }
42 
43 VirtualSettings::Category& addGenericCategory(VirtualSettings& connector, std::string& instanceName) {
44  VirtualSettings::Category& cat = connector.addCategory("Generic");
45  cat.connect("Name", "name", instanceName);
46  return cat;
47 }
48 
49 JobRegistrar::JobRegistrar(std::string className,
50  std::string shortName,
51  std::string category,
52  CreateJobFunc func,
53  std::string tooltip) {
54 
55  class GenericDesc : public IJobDesc {
56  private:
57  std::string longName;
58  std::string shortName;
59  std::string cat;
60  std::string desc;
61  CreateJobFunc func;
62 
63  public:
64  GenericDesc(std::string longName,
65  std::string shortName,
66  std::string cat,
67  CreateJobFunc func,
68  std::string desc)
69  : longName(std::move(longName))
70  , shortName(std::move(shortName))
71  , cat(std::move(cat))
72  , desc(std::move(desc))
73  , func(func) {}
74 
75  virtual std::string className() const override {
76  return longName;
77  }
78 
79  virtual std::string category() const override {
80  return cat;
81  }
82 
83  virtual std::string tooltip() const override {
84  return desc;
85  }
86 
87  virtual AutoPtr<IJob> create(Optional<std::string> instanceName) const override {
89  AutoPtr<IJob> job = func(instanceName.valueOr("unnamed " + shortName));
90  return job;
91  }
92  };
93 
94  sRegisteredJobs.emplaceBack(makeAuto<GenericDesc>(className, shortName, category, func, tooltip));
95 }
96 
97 
98 JobRegistrar::JobRegistrar(std::string className,
99  std::string category,
100  CreateJobFunc func,
101  std::string tooltip)
102  : JobRegistrar(className, className, category, func, std::move(tooltip)) {}
103 
104 
105 IParticleJob::IParticleJob(const std::string& name)
106  : IJob(name) {}
107 
108 IParticleJob::~IParticleJob() = default;
109 
110 IRunJob::IRunJob(const std::string& name)
111  : IParticleJob(name) {}
112 
113 IRunJob::~IRunJob() = default;
114 
115 static SharedPtr<ParticleData> findStorageInput(const UnorderedMap<std::string, JobContext>& inputs,
116  const std::string& jobName) {
117  for (const auto& element : inputs) {
118  SharedPtr<ParticleData> data = element.value.tryGetValue<ParticleData>();
119  if (data != nullptr) {
120  return data;
121  }
122  }
123  throw InvalidSetup("No input particles found for job '" + jobName + "'");
124 }
125 
126 void IRunJob::evaluate(const RunSettings& global, IRunCallbacks& callbacks) {
127  SharedPtr<ParticleData> data = findStorageInput(inputs, instName);
128  RunSettings overrides = global;
129  overrides.addEntries(data->overrides);
130 
131  AutoPtr<IRun> run = this->getRun(overrides);
132  data->stats = run->run(data->storage, callbacks);
133  result = std::move(data);
134 }
135 
NAMESPACE_SPH_BEGIN
Definition: BarnesHut.cpp:13
Helper functions to check the internal consistency of the code.
@ NO_THROW
Function cannot throw exceptions.
#define CHECK_FUNCTION(flags)
Definition: CheckFunction.h:40
Container storing sorted unique values.
Basic interface defining a single run.
ArrayView< const AutoPtr< IJobDesc > > enumerateRegisteredJobs()
Returns a view of all currently registered jobs.
Definition: Job.cpp:30
VirtualSettings::Category & addGenericCategory(VirtualSettings &connector, std::string &instanceName)
Adds a common settings category, used by all jobs.
Definition: Job.cpp:43
RawPtr< IJobDesc > getJobDesc(const std::string &name)
Returns a job descriptor for given class name.
Definition: Job.cpp:34
Domain represented by triangular mesh.
#define NAMESPACE_SPH_END
Definition: Object.h:12
Holder of quantity values and their temporal derivatives.
Object providing safe access to continuous memory of data.
Definition: ArrayView.h:17
Generic dynamically allocated resizable storage.
Definition: Array.h:43
Provides a descriptor of a job that allows to create new instances.
Definition: Job.h:170
Base class for all object performing an operation in a simulation hierarchy.
Definition: Job.h:96
std::string instName
Definition: Job.h:100
UnorderedMap< std::string, JobContext > inputs
Contains all input data, identified by names of input slots.
Definition: Job.h:103
Base class for all jobs providing particle data.
Definition: Job.h:242
~IParticleJob() override
SharedPtr< ParticleData > result
Data filled by the job when it finishes.
Definition: Job.h:245
IParticleJob(const std::string &name)
Definition: Job.cpp:105
Callbacks executed by the simulation to provide feedback to the user.
Definition: IRun.h:27
IRunJob(const std::string &name)
Definition: Job.cpp:110
~IRunJob() override
virtual AutoPtr< IRun > getRun(const RunSettings &overrides) const =0
Returns the actual simulation object.
virtual void evaluate(const RunSettings &global, IRunCallbacks &callbacks) override final
Runs the operation provided by the job.
Definition: Job.cpp:126
Thrown when components of the run are mutually incompatible.
Definition: Exceptions.h:24
Data exchanged by jobs.
Definition: Job.h:52
JobContext clone() const
Duplicates the stored data.
Definition: Job.cpp:11
void release()
Releases all allocated data.
Definition: Job.cpp:24
INLINE Type valueOr(const TOther &other) const
Returns the stored value if the object has been initialized, otherwise returns provided parameter.
Definition: Optional.h:188
Non-owning wrapper of pointer.
Definition: RawPtr.h:19
void addEntries(const Settings &settings)
Adds entries from different Settings object into this one, overriding current entries.
Definition: Settings.h:297
INLINE void reset()
Definition: SharedPtr.h:227
Storage clone(const Flags< VisitorEnum > buffers) const
Clones specified buffers of the storage.
Definition: Storage.cpp:563
EntryControl & connect(const std::string &name, const std::string &key, TValue &value)
Connects to given reference.
Holds a map of virtual entries, associated with a unique name.
Category & addCategory(const std::string &name)
Creates a new category of entries.
Overload of std::swap for Sph::Array.
Definition: Array.h:578
Helper class, allowing to register job into the global list of jobs.
Definition: Job.h:203
JobRegistrar(std::string className, std::string category, CreateJobFunc func, std::string tooltip)
Registers a new job.
Definition: Job.cpp:98
Storage storage
Holds all particle positions and other quantities.
Definition: Job.h:35
Statistics stats
Final statistics of the simulation.
Definition: Job.h:38
RunSettings overrides
Overrides associated with the particle state.
Definition: Job.h:43