Tissue Forge C++ 0.2.1
Interactive, particle-based physics, chemistry and biology modeling and simulation environment
Loading...
Searching...
No Matches
tfParticleTimeEvent.h
Go to the documentation of this file.
1/*******************************************************************************
2 * This file is part of Tissue Forge.
3 * Copyright (c) 2022-2024 T.J. Sego
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU Lesser General Public License as published
7 * by the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 *
18 ******************************************************************************/
19
24
25#ifndef _SOURCE_EVENT_TFPARTICLETIMEEVENT_H_
26#define _SOURCE_EVENT_TFPARTICLETIMEEVENT_H_
27
28#include "tfTimeEvent.h"
29#include "tfParticleEvent.h"
30
31
32namespace TissueForge {
33
34
35 struct ParticleType;
36
37
38 namespace event {
39
40
41 struct ParticleEvent;
42
43 struct ParticleTimeEvent;
44
45 using ParticleTimeEventMethod = EventMethodT<ParticleTimeEvent>;
46
47 using ParticleTimeEventNextTimeSetter = FloatP_t (*)(ParticleTimeEvent&, const FloatP_t&);
48
55 CPPAPI_FUNC(FloatP_t) particleTimeEventSetNextTimeExponential(ParticleTimeEvent &event, const FloatP_t &time);
56
63 CPPAPI_FUNC(FloatP_t) particleTimeEventSetNextTimeDeterministic(ParticleTimeEvent &event, const FloatP_t &time);
64
65 using ParticleTimeEventParticleSelector = ParticleEventParticleSelectorT<ParticleTimeEvent>;
66
74
82
83 // keys for selecting a particle selector
84 enum class ParticleTimeEventParticleSelectorEnum : unsigned int {
85 LARGEST,
86 UNIFORM,
87 DEFAULT
88 };
89
90 typedef std::unordered_map<ParticleTimeEventParticleSelectorEnum, ParticleTimeEventParticleSelector> ParticleTimeEventParticleSelectorMapType;
91 static ParticleTimeEventParticleSelectorMapType particleTimeEventParticleSelectorMap {
92 {ParticleTimeEventParticleSelectorEnum::LARGEST, &particleTimeEventParticleSelectorLargest},
93 {ParticleTimeEventParticleSelectorEnum::UNIFORM, &particleTimeEventParticleSelectorUniform},
94 {ParticleTimeEventParticleSelectorEnum::DEFAULT, &particleTimeEventParticleSelectorUniform}
95 };
96
97 typedef std::unordered_map<std::string, ParticleTimeEventParticleSelectorEnum> ParticleTimeEventParticleSelectorNameMapType;
98 static ParticleTimeEventParticleSelectorNameMapType particleTimeEventParticleSelectorNameMap {
99 {"largest", ParticleTimeEventParticleSelectorEnum::LARGEST},
100 {"uniform", ParticleTimeEventParticleSelectorEnum::UNIFORM},
101 {"default", ParticleTimeEventParticleSelectorEnum::DEFAULT}
102 };
103
110 CPPAPI_FUNC(ParticleTimeEventParticleSelector*) getParticleTimeEventParticleSelector(ParticleTimeEventParticleSelectorEnum selectorEnum);
111
118 CPPAPI_FUNC(ParticleTimeEventParticleSelector*) getParticleTimeEventParticleSelectorN(std::string setterName);
119
124 enum class ParticleTimeEventTimeSetterEnum : unsigned int {
125 DETERMINISTIC,
126 EXPONENTIAL,
127 DEFAULT
128 };
129
130 typedef std::unordered_map<ParticleTimeEventTimeSetterEnum, ParticleTimeEventNextTimeSetter> ParticleTimeEventNextTimeSetterMapType;
131 static ParticleTimeEventNextTimeSetterMapType particleTimeEventNextTimeSetterMap {
132 {ParticleTimeEventTimeSetterEnum::DETERMINISTIC, &particleTimeEventSetNextTimeDeterministic},
133 {ParticleTimeEventTimeSetterEnum::EXPONENTIAL, &particleTimeEventSetNextTimeExponential},
134 {ParticleTimeEventTimeSetterEnum::DEFAULT, &particleTimeEventSetNextTimeDeterministic}
135 };
136
137 typedef std::unordered_map<std::string, ParticleTimeEventTimeSetterEnum> ParticleTimeEventNextTimeSetterNameMapType;
138 static ParticleTimeEventNextTimeSetterNameMapType particleTimeEventNextTimeSetterNameMap {
139 {"deterministic", ParticleTimeEventTimeSetterEnum::DETERMINISTIC},
140 {"exponential", ParticleTimeEventTimeSetterEnum::EXPONENTIAL},
141 {"default", ParticleTimeEventTimeSetterEnum::DEFAULT}
142 };
143
150 CPPAPI_FUNC(ParticleTimeEventNextTimeSetter*) getParticleTimeEventNextTimeSetter(ParticleTimeEventTimeSetterEnum setterEnum);
151
158 CPPAPI_FUNC(ParticleTimeEventNextTimeSetter*) getParticleTimeEventNextTimeSetterN(std::string setterName);
159
160 // Time-dependent particle event
161 struct CAPI_EXPORT ParticleTimeEvent : EventBase {
162
167
172
176 FloatP_t next_time;
177
181 FloatP_t period;
182
186 FloatP_t start_time;
187
191 FloatP_t end_time;
192
193 ParticleTimeEvent() {}
195 ParticleType *targetType,
196 const FloatP_t &period,
197 ParticleTimeEventMethod *invokeMethod,
198 ParticleTimeEventMethod *predicateMethod,
199 ParticleTimeEventNextTimeSetter *nextTimeSetter=NULL,
200 const FloatP_t &start_time=0,
201 const FloatP_t &end_time=-1,
202 ParticleTimeEventParticleSelector *particleSelector=NULL
203 );
204 virtual ~ParticleTimeEvent() {}
205
207 virtual HRESULT invoke();
208 virtual HRESULT eval(const FloatP_t &time);
209
210 operator TimeEvent&() const;
211
212 protected:
213
214 FloatP_t getNextTime(const FloatP_t &current_time);
215 ParticleHandle *getNextParticle();
216
217 HRESULT setParticleTimeEventNextTimeSetter(ParticleTimeEventNextTimeSetter *nextTimeSetter);
218 HRESULT setParticleTimeEventNextTimeSetter(ParticleTimeEventTimeSetterEnum setterEnum);
219 HRESULT setParticleTimeEventNextTimeSetter(std::string setterName);
220
221 HRESULT setParticleTimeEventParticleSelector(ParticleTimeEventParticleSelector *particleSelector);
222 HRESULT setParticleTimeEventParticleSelector(ParticleTimeEventParticleSelectorEnum selectorEnum);
223 HRESULT setParticleTimeEventParticleSelector(std::string selectorName);
224
225 private:
226
227 ParticleTimeEventMethod *invokeMethod;
228 ParticleTimeEventMethod *predicateMethod;
229 ParticleTimeEventNextTimeSetter *nextTimeSetter;
230 ParticleTimeEventParticleSelector *particleSelector;
231
232 };
233
234 // Event list for time-dependent particle events
235 using ParticleTimeEventList = EventListT<ParticleTimeEvent>;
236
237 // Module entry points
238
253 ParticleType *targetType,
254 const FloatP_t &period,
255 ParticleTimeEventMethod *invokeMethod,
256 ParticleTimeEventMethod *predicateMethod=NULL,
257 unsigned int nextTimeSetterEnum=0,
258 const FloatP_t &start_time=0,
259 const FloatP_t &end_time=-1,
260 unsigned int particleSelectorEnum=0
261 );
262
277 ParticleType *targetType,
278 const FloatP_t &period,
279 ParticleTimeEventMethod *invokeMethod,
280 ParticleTimeEventMethod *predicateMethod=NULL,
281 const std::string &distribution="default",
282 const FloatP_t &start_time=0,
283 const FloatP_t &end_time=-1,
284 const std::string &selector="default"
285 );
286
287}};
288
289#endif // _SOURCE_EVENT_TFPARTICLETIMEEVENT_H_
Tissue Forge event system.
Definition tfEvent.h:34
ParticleHandle * particleTimeEventParticleSelectorUniform(const ParticleTimeEvent &event)
Selects a particle according to a uniform random distribution by event target type.
FloatP_t particleTimeEventSetNextTimeDeterministic(ParticleTimeEvent &event, const FloatP_t &time)
Sets the next time on an event according to the period of the event.
ParticleTimeEventNextTimeSetter * getParticleTimeEventNextTimeSetterN(std::string setterName)
Gets the next time on an event according to an exponential distribution of the event period.
ParticleTimeEventTimeSetterEnum
keys for selecting a next time setter
Definition tfParticleTimeEvent.h:124
ParticleTimeEventParticleSelector * getParticleTimeEventParticleSelectorN(std::string setterName)
Gets the particle selector on an event.
ParticleTimeEvent * onParticleTimeEvent(ParticleType *targetType, const FloatP_t &period, ParticleTimeEventMethod *invokeMethod, ParticleTimeEventMethod *predicateMethod=NULL, unsigned int nextTimeSetterEnum=0, const FloatP_t &start_time=0, const FloatP_t &end_time=-1, unsigned int particleSelectorEnum=0)
Creates a time-dependent particle event using prescribed invoke and predicate functions.
ParticleHandle * particleTimeEventParticleSelectorLargest(const ParticleTimeEvent &event)
Selects largest particle by event target type.
FloatP_t particleTimeEventSetNextTimeExponential(ParticleTimeEvent &event, const FloatP_t &time)
Sets the next time on an event according to an exponential distribution of the event period.
ParticleTimeEvent * onParticleTimeEventN(ParticleType *targetType, const FloatP_t &period, ParticleTimeEventMethod *invokeMethod, ParticleTimeEventMethod *predicateMethod=NULL, const std::string &distribution="default", const FloatP_t &start_time=0, const FloatP_t &end_time=-1, const std::string &selector="default")
Creates a time-dependent particle event using prescribed invoke and predicate functions.
ParticleTimeEventParticleSelector * getParticleTimeEventParticleSelector(ParticleTimeEventParticleSelectorEnum selectorEnum)
Gets the particle selector on an event.
ParticleTimeEventNextTimeSetter * getParticleTimeEventNextTimeSetter(ParticleTimeEventTimeSetterEnum setterEnum)
Gets the next time on an event according to an exponential distribution of the event period.
Include Python header, disable linking to pythonX_d.lib on Windows in debug mode.
Definition tfAngleConfig.h:26
A handle to a particle.
Definition tfParticle.h:313
Structure containing information on each particle type.
Definition tfParticle.h:768
Definition tfEventList.h:59
Definition tfParticleEvent.h:126
Definition tfParticleTimeEvent.h:161
FloatP_t start_time
Time at which evaluations begin.
Definition tfParticleTimeEvent.h:186
ParticleHandle * targetParticle
Target particle of an event evaluation.
Definition tfParticleTimeEvent.h:171
FloatP_t end_time
Time at which evaluations stop.
Definition tfParticleTimeEvent.h:191
FloatP_t period
Period of event evaluations.
Definition tfParticleTimeEvent.h:181
FloatP_t next_time
Next time at which an evaluation occurs.
Definition tfParticleTimeEvent.h:176
ParticleType * targetType
Target particle type of this event.
Definition tfParticleTimeEvent.h:166
Definition tfTimeEvent.h:70
int32_t HRESULT
Definition tf_port.h:255