helics 3.7.0
Loading...
Searching...
No Matches
TimeCoordinator.hpp
1/*
2Copyright (c) 2017-2026,
3Battelle Memorial Institute; Lawrence Livermore National Security, LLC; Alliance for Energy
4Innovation LLC. See the top-level NOTICE for additional details. All rights reserved.
5SPDX-License-Identifier: BSD-3-Clause
6*/
7#pragma once
8
9#include "../common/GuardedTypes.hpp"
10#include "ActionMessage.hpp"
11#include "BaseTimeCoordinator.hpp"
12
13#include <atomic>
14#include <functional>
15#include <nlohmann/json_fwd.hpp>
16#include <string>
17#include <utility>
18#include <vector>
19
20namespace helics {
21
23class tcoptions {
24 public:
25 Time timeDelta = Time::epsilon();
26 Time inputDelay = timeZero;
27 Time outputDelay = timeZero;
28 Time offset = timeZero;
29 Time period = timeZero;
30 // Time rtLag = timeZero;
31 // Time rtLead = timeZero;
32 // bool observer = false;
33 // bool realtime = false;
34 // bool source_only = false;
35 bool wait_for_current_time_updates = false;
36 bool uninterruptible = false;
37 bool restrictive_time_policy = false;
40 bool event_triggered = false;
41 int maxIterations = 50;
42};
43
49 protected:
52 TimeData total;
53 mutable TimeData lastSend;
54 // the variables for time coordination
55 Time time_granted{Time::minVal()};
56 Time time_requested{Time::maxVal()};
60 Time time_allow{Time::minVal()};
61 Time time_exec{Time::maxVal()};
62 Time time_message{Time::maxVal()};
63 Time time_value{Time::maxVal()};
66 Time time_grantBase{Time::minVal()};
68 Time time_block{Time::maxVal()};
69 Time maxTime{Time::maxVal()};
75 std::vector<std::pair<Time, int32_t>> timeBlocks;
78 std::uint8_t currentRestrictionLevel{0};
79
80 public:
83
85 bool hasInitUpdates{false};
87 bool hasIterationData{false};
90 bool needSendAll{false};
92 mutable bool triggered{false};
94 bool globalTime{false};
95
96 protected:
98 bool dynamicJoining{false};
99
100 std::atomic<int32_t> iteration{0};
101
102 public:
104 TimeCoordinator() = default;
106 explicit TimeCoordinator(std::function<void(const ActionMessage&)> userSendMessageFunction):
107 BaseTimeCoordinator(std::move(userSendMessageFunction))
108 {
109 }
110
112 void setProperty(int timeProperty, Time propertyVal);
114 void setProperty(int intProperty, int propertyVal);
116 void setOptionFlag(int optionFlag, bool value);
119
121 Time getTimeProperty(int timeProperty) const;
123 bool getOptionFlag(int optionFlag) const;
125 int getIntegerProperty(int intProperty) const;
126
128 Time getGrantedTime() const { return time_granted; }
132 Time allowedSendTime() const { return time_granted + info.outputDelay; }
134 std::vector<GlobalFederateId> getDependencies() const;
136 std::vector<GlobalFederateId> getDependents() const
137 {
138 return *dependent_federates.lock_shared();
139 }
140 const auto& getBarriers() const { return timeBlocks; }
144 int32_t getCurrentIteration() const { return iteration.load(); }
148 virtual bool updateTimeFactors() override;
152 void updateValueTime(Time valueUpdateTime, bool allowRequestSend);
156 void updateMessageTime(Time messageUpdateTime, bool allowRequestSend);
157
158 void specifyNonGranting(bool value = true) { nonGranting = value; }
159
160 private:
162 bool updateNextExecutionTime();
165 void updateNextPossibleEventTime();
167 Time getNextPossibleTime() const;
168 Time generateAllowedTime(Time testTime) const;
169 /* return true,true if the message was sent and skip federate was detected
170 true,false if the message was sent and skip federate was not detected
171 false,false, if the message was not sent
172 */
173 std::pair<bool, bool> checkAndSendTimeRequest(ActionMessage& upd, GlobalFederateId skip) const;
174
175 void sendTimeRequest(GlobalFederateId triggerFed) const;
176 void updateTimeGrant();
178 bool transmitTimingMessages(ActionMessage& msg,
179 GlobalFederateId skipFed = GlobalFederateId{}) const;
180
181 TimeProcessingResult processTimeBlockMessage(const ActionMessage& cmd);
182
183 Time updateTimeBlocks(int32_t blockId, Time newTime);
184
185 public:
186 virtual TimeProcessingResult processTimeMessage(const ActionMessage& cmd) override;
187
191 void processConfigUpdateMessage(const ActionMessage& cmd);
195 virtual bool addDependency(GlobalFederateId fedID) override;
199 virtual bool addDependent(GlobalFederateId fedID) override;
202 virtual void removeDependency(GlobalFederateId fedID) override;
205 virtual void removeDependent(GlobalFederateId fedID) override;
206
209 checkExecEntry(GlobalFederateId triggerFed = GlobalFederateId{}) override;
210
212 void sendUpdatedExecRequest(GlobalFederateId target = GlobalFederateId{},
213 GlobalFederateId minFed = GlobalFederateId{},
214 std::int32_t responseSequenceCounter = 0);
221 void timeRequest(Time nextTime,
222 IterationRequest iterate,
223 Time newValueTime,
224 Time newMessageTime);
225
226 virtual void enteringExecMode(IterationRequest mode) override;
228 MessageProcessingResult checkTimeGrant(GlobalFederateId triggerFed = GlobalFederateId{});
230 void localError();
232 virtual std::string printTimeStatus() const override;
234 void generateConfig(nlohmann::json& base) const;
235
237 virtual void generateDebuggingTimeInfo(nlohmann::json& base) const override;
238
240 std::pair<GlobalFederateId, Time> getMinGrantedDependency() const;
242 void enterInitialization();
244 void requestTimeCheck();
245
246 virtual Time getNextTime() const override;
247};
248
249} // namespace helics
Definition application_api/Federate.hpp:27
Definition ActionMessage.hpp:30
Definition BaseTimeCoordinator.hpp:25
bool nonGranting
Definition BaseTimeCoordinator.hpp:42
Definition TimeCoordinator.hpp:48
Time time_requested
the most recent time requested
Definition TimeCoordinator.hpp:56
virtual std::string printTimeStatus() const override
Definition TimeCoordinator.cpp:880
Time time_message
the time of the earliest message event
Definition TimeCoordinator.hpp:62
virtual bool updateTimeFactors() override
Definition TimeCoordinator.cpp:429
std::vector< std::pair< Time, int32_t > > timeBlocks
blocks for a particular timeblocking link
Definition TimeCoordinator.hpp:75
virtual MessageProcessingResult checkExecEntry(GlobalFederateId triggerFed=GlobalFederateId{}) override
Definition TimeCoordinator.cpp:993
virtual void removeDependent(GlobalFederateId fedID) override
Definition TimeCoordinator.cpp:923
std::vector< GlobalFederateId > getDependencies() const
Definition TimeCoordinator.cpp:934
bool needSendAll
Definition TimeCoordinator.hpp:90
void processConfigUpdateMessage(const ActionMessage &cmd)
Definition TimeCoordinator.cpp:1472
void setOptionFlag(int optionFlag, bool value)
Definition TimeCoordinator.cpp:1403
virtual bool addDependency(GlobalFederateId fedID) override
Definition TimeCoordinator.cpp:894
tcoptions info
basic time control information
Definition TimeCoordinator.hpp:77
void enterInitialization()
Definition TimeCoordinator.cpp:304
void updateMessageTime(Time messageUpdateTime, bool allowRequestSend)
Definition TimeCoordinator.cpp:395
TimeData upstream
the variables for time coordination
Definition TimeCoordinator.hpp:51
void updateValueTime(Time valueUpdateTime, bool allowRequestSend)
Definition TimeCoordinator.cpp:210
bool hasInitUpdates
flag indicating that a value or message was received during initialization stage
Definition TimeCoordinator.hpp:85
bool dynamicJoining
if set to true the time coordinator is joining an ongoing co-simulation
Definition TimeCoordinator.hpp:98
Time getRequestedTime() const
Definition TimeCoordinator.hpp:130
MessageProcessingResult checkTimeGrant(GlobalFederateId triggerFed=GlobalFederateId{})
Definition TimeCoordinator.cpp:479
virtual void removeDependency(GlobalFederateId fedID) override
Definition TimeCoordinator.cpp:912
Time time_block
a blocking time to not grant time >= the specified time
Definition TimeCoordinator.hpp:68
int getIntegerProperty(int intProperty) const
Definition TimeCoordinator.cpp:1442
std::pair< GlobalFederateId, Time > getMinGrantedDependency() const
Definition TimeCoordinator.cpp:1203
std::atomic< int32_t > iteration
current number of iterations
Definition TimeCoordinator.hpp:100
void setProperty(int timeProperty, Time propertyVal)
Definition TimeCoordinator.cpp:1367
virtual void enteringExecMode(IterationRequest mode) override
Definition TimeCoordinator.cpp:24
Time time_next
the next possible internal event time
Definition TimeCoordinator.hpp:57
TimeCoordinator(std::function< void(const ActionMessage &)> userSendMessageFunction)
Definition TimeCoordinator.hpp:106
void timeRequest(Time nextTime, IterationRequest iterate, Time newValueTime, Time newMessageTime)
Definition TimeCoordinator.cpp:103
bool globalTime
true if using a global time manager parent
Definition TimeCoordinator.hpp:94
Time getGrantedTime() const
Definition TimeCoordinator.hpp:128
bool hasIterationData
flag indicating that a value or message was received during iteration
Definition TimeCoordinator.hpp:87
bool triggered
indicator the federate was triggered recently
Definition TimeCoordinator.hpp:92
Time time_value
the time of the earliest value event
Definition TimeCoordinator.hpp:63
Time time_allow
the current allowable time
Definition TimeCoordinator.hpp:60
shared_guarded_m< std::vector< GlobalFederateId > > dependency_federates
these are to maintain an accessible record of dependency federates
Definition TimeCoordinator.hpp:73
void setDynamicJoining()
Definition TimeCoordinator.hpp:118
void sendUpdatedExecRequest(GlobalFederateId target=GlobalFederateId{}, GlobalFederateId minFed=GlobalFederateId{}, std::int32_t responseSequenceCounter=0)
Definition TimeCoordinator.cpp:958
Time time_grantBase
Definition TimeCoordinator.hpp:66
void generateConfig(nlohmann::json &base) const
Definition TimeCoordinator.cpp:244
shared_guarded_m< std::vector< GlobalFederateId > > dependent_federates
these are to maintain an accessible record of dependent federates
Definition TimeCoordinator.hpp:71
void localError()
Definition TimeCoordinator.cpp:60
virtual void generateDebuggingTimeInfo(nlohmann::json &base) const override
Definition TimeCoordinator.cpp:269
virtual bool addDependent(GlobalFederateId fedID) override
Definition TimeCoordinator.cpp:903
IterationRequest iterating
indicator that the coordinator should be iteratingif need be
Definition TimeCoordinator.hpp:82
Time time_granted
the most recent time granted
Definition TimeCoordinator.hpp:55
virtual Time getNextTime() const override
Definition TimeCoordinator.cpp:322
virtual TimeProcessingResult processTimeMessage(const ActionMessage &cmd) override
Definition TimeCoordinator.cpp:1221
void requestTimeCheck()
Definition TimeCoordinator.cpp:327
std::vector< GlobalFederateId > getDependents() const
Definition TimeCoordinator.hpp:136
Time getTimeProperty(int timeProperty) const
Definition TimeCoordinator.cpp:1424
Time time_exec
the time of the next targeted execution
Definition TimeCoordinator.hpp:61
bool getOptionFlag(int optionFlag) const
Definition TimeCoordinator.cpp:1454
Time time_minminDe
the minimum of the minimum dependency event Time
Definition TimeCoordinator.hpp:58
Time allowedSendTime() const
Definition TimeCoordinator.hpp:132
int32_t getCurrentIteration() const
Definition TimeCoordinator.hpp:144
Time time_minDe
the minimum event time of the dependencies
Definition TimeCoordinator.hpp:59
Definition TimeDependencies.hpp:62
Definition TimeCoordinator.hpp:23
bool event_triggered
Definition TimeCoordinator.hpp:40
the main namespace for the helics co-simulation library User functions will be in the helics namespac...
Definition AsyncFedCallInfo.hpp:14
MessageProcessingResult
Definition CoreTypes.hpp:75
constexpr Time timeZero
Definition helicsTime.hpp:31
IterationRequest
Definition CoreTypes.hpp:103
@ NO_ITERATIONS
indicator that the iterations have completed
TimeProcessingResult
Definition TimeDependencies.hpp:42
TimeRepresentation< count_time< 9 > > Time
Definition helicsTime.hpp:27
STL namespace.