Use ScheduleState to configure RFT

This commit is contained in:
Joakim Hove
2021-02-18 08:37:23 +01:00
parent 0c9390d93a
commit 4e57436773
14 changed files with 547 additions and 1022 deletions

View File

@@ -16,8 +16,8 @@
You should have received a copy of the GNU General Public License
along with OPM. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef RFT_CONFIG_HPP
#define RFT_CONFIG_HPP
#ifndef RFT_CONFIG2_HPP
#define RFT_CONFIG2_HPP
#include <cstddef>
#include <optional>
@@ -47,72 +47,41 @@ public:
YES = 1,
REPT = 2,
TIMESTEP = 3,
NO = 4
NO = 5
};
static std::string PLT2String(PLT enumValue);
static PLT PLTFromString( const std::string& stringValue);
template <typename Value>
using ConfigMap = std::unordered_map<
std::string, DynamicState<std::pair<Value, std::size_t>>
>;
using WellOpenTimeMap = std::unordered_map<std::string, std::size_t>;
RFTConfig();
explicit RFTConfig(const TimeMap& time_map);
void first_open(bool on);
void update(const std::string& wname, PLT mode);
void update(const std::string& wname, RFT mode);
bool active() const;
bool rft() const;
bool rft(const std::string& wname) const;
bool plt() const;
bool plt(const std::string& wname) const;
std::optional<RFTConfig> next() const;
std::optional<RFTConfig> well_open(const std::string& wname) const;
static RFTConfig serializeObject();
bool rft(const std::string& well, std::size_t report_step) const;
bool plt(const std::string& well, std::size_t report_step) const;
bool getWellOpenRFT(const std::string& well_name, std::size_t report_step) const;
void setWellOpenRFT(std::size_t report_step);
void setWellOpenRFT(const std::string& well_name);
bool active(std::size_t report_step) const;
std::size_t firstRFTOutput() const { return this->first_rft_event; }
void updateRFT(const std::string& well, std::size_t report_step, RFT value);
void updatePLT(const std::string& well, std::size_t report_step, PLT value);
void addWellOpen(const std::string& well, std::size_t report_step);
const TimeMap& timeMap() const;
bool operator==(const RFTConfig& data) const;
template<class Serializer>
void serializeOp(Serializer& serializer)
{
tm.serializeOp(serializer);
serializer(first_rft_event);
serializer(well_open_rft_time);
serializer(well_open_rft_name);
serializer(well_open);
serializer.template map<ConfigMap<RFT>,false>(rft_config);
serializer.template map<ConfigMap<PLT>,false>(plt_config);
serializer(first_open_rft);
serializer.template map<std::unordered_map<std::string, RFT>,false>(rft_state);
serializer.template map<std::unordered_map<std::string, PLT>,false>(plt_state);
serializer.template map<std::unordered_map<std::string, bool>,false>(open_wells);
}
private:
TimeMap tm;
std::size_t first_rft_event;
std::optional<std::size_t> well_open_rft_time;
WellOpenTimeMap well_open_rft_name;
WellOpenTimeMap well_open;
ConfigMap<RFT> rft_config;
ConfigMap<PLT> plt_config;
bool outputRftAtWellopen(WellOpenTimeMap::const_iterator well, const std::size_t report_step) const;
std::size_t firstWellopenStepNotBefore(const std::size_t report_step) const;
void updateFirstIfNotShut(const std::string& well_name, const std::size_t report_step);
void updateFirst(const std::size_t report_step);
void setWellOpenRFT(const std::string& well_name, const std::size_t report_step);
template <typename Value>
void updateConfig(const std::string& well_name,
const std::size_t report_step,
const Value value,
ConfigMap<Value>& cfgmap);
bool first_open_rft = false;
std::unordered_map<std::string, RFT> rft_state;
std::unordered_map<std::string, PLT> plt_state;
std::unordered_map<std::string, bool> open_wells;
};
}

View File

@@ -34,7 +34,6 @@
#include <opm/parser/eclipse/EclipseState/Util/OrderedMap.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/MessageLimits.hpp>
#include <opm/parser/eclipse/EclipseState/Runspec.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/RFTConfig.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/Network/ExtNetwork.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/Well/PAvg.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/Well/PAvgCalculatorCollection.hpp>
@@ -241,7 +240,7 @@ namespace Opm
void invalidNamePattern (const std::string& namePattern, std::size_t report_step, const ParseContext& parseContext, ErrorGuard& errors, const DeckKeyword& keyword) const;
const GuideRateConfig& guideRateConfig(std::size_t timeStep) const;
const RFTConfig& rftConfig() const;
std::optional<std::size_t> first_RFT() const;
/*
Will remove all completions which are connected to cell which is not
active. Will scan through all wells and all timesteps.
@@ -283,7 +282,6 @@ namespace Opm
{
m_sched_deck.serializeOp(serializer);
m_timeMap.serializeOp(serializer);
rft_config.serializeOp(serializer);
restart_config.serializeOp(serializer);
serializer.vector(snapshots);
m_static.serializeOp(serializer);
@@ -302,6 +300,7 @@ namespace Opm
pack_unpack<GroupOrder, Serializer>(serializer);
pack_unpack<GuideRateConfig, Serializer>(serializer);
pack_unpack<GasLiftOpt, Serializer>(serializer);
pack_unpack<RFTConfig, Serializer>(serializer);
pack_unpack_map<int, VFPProdTable, Serializer>(serializer);
pack_unpack_map<int, VFPInjTable, Serializer>(serializer);
@@ -446,7 +445,6 @@ namespace Opm
ScheduleStatic m_static;
ScheduleDeck m_sched_deck;
TimeMap m_timeMap;
RFTConfig rft_config;
RestartConfig restart_config;
std::optional<int> exit_status;
std::vector<ScheduleState> snapshots;
@@ -498,16 +496,13 @@ namespace Opm
const FieldPropsManager* fp,
const std::vector<std::string>& matching_wells,
bool runtime,
const std::unordered_map<std::string, double> * target_wellpi,
std::vector<std::pair<const DeckKeyword*, std::size_t > >& rftProperties);
const std::unordered_map<std::string, double> * target_wellpi);
static std::string formatDate(std::time_t t);
std::string simulationDays(std::size_t currentStep) const;
void applyEXIT(const DeckKeyword&, std::size_t currentStep);
void applyWELOPEN(const DeckKeyword&, std::size_t currentStep, bool runtime, const ParseContext&, ErrorGuard&, const std::vector<std::string>& matching_wells = {});
void applyWRFT(const DeckKeyword&, std::size_t currentStep);
void applyWRFTPLT(const DeckKeyword&, std::size_t currentStep);
struct HandlerContext {
const ScheduleBlock& block;
@@ -620,6 +615,8 @@ namespace Opm
void handleWPIMULT (const HandlerContext&, const ParseContext&, ErrorGuard&);
void handleWPMITAB (const HandlerContext&, const ParseContext&, ErrorGuard&);
void handleWPOLYMER (const HandlerContext&, const ParseContext&, ErrorGuard&);
void handleWRFT (const HandlerContext&, const ParseContext&, ErrorGuard&);
void handleWRFTPLT (const HandlerContext&, const ParseContext&, ErrorGuard&);
void handleWSALT (const HandlerContext&, const ParseContext&, ErrorGuard&);
void handleWSEGITER (const HandlerContext&, const ParseContext&, ErrorGuard&);
void handleWSEGSICD (const HandlerContext&, const ParseContext&, ErrorGuard&);

View File

@@ -47,6 +47,7 @@
#include <opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQConfig.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/Group/GuideRateConfig.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/GasLiftOpt.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/RFTConfig.hpp>
namespace {
@@ -318,6 +319,7 @@ namespace Opm {
ptr_member<UDQConfig> udq;
ptr_member<GasLiftOpt> glo;
ptr_member<GuideRateConfig> guide_rate;
ptr_member<RFTConfig> rft_config;
template <typename T> struct always_false1 : std::false_type {};
@@ -351,6 +353,8 @@ namespace Opm {
return this->glo;
else if constexpr ( std::is_same_v<T, GuideRateConfig> )
return this->guide_rate;
else if constexpr ( std::is_same_v<T, RFTConfig> )
return this->rft_config;
else
static_assert(always_false1<T>::value, "Template type <T> not supported in get()");
}
@@ -385,6 +389,8 @@ namespace Opm {
return this->glo;
else if constexpr ( std::is_same_v<T, GuideRateConfig> )
return this->guide_rate;
else if constexpr ( std::is_same_v<T, RFTConfig> )
return this->rft_config;
else
static_assert(always_false1<T>::value, "Template type <T> not supported in get()");
}

View File

@@ -29,7 +29,6 @@
#include <opm/parser/eclipse/EclipseState/EclipseState.hpp>
#include <opm/parser/eclipse/EclipseState/IOConfig/IOConfig.hpp>
#include <opm/parser/eclipse/EclipseState/Runspec.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/RFTConfig.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/RPTConfig.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/Schedule.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/Well/WellConnections.hpp>
@@ -160,7 +159,7 @@ bool EclipseIO::Impl::wantRFTOutput( const int report_step,
{
return !isSubstep
&& (static_cast<std::size_t>(report_step)
>= this->schedule.rftConfig().firstRFTOutput());
>= this->schedule.first_RFT());
}
/*
@@ -247,7 +246,7 @@ void EclipseIO::writeTimeStep(const Action::State& action_state,
// Open existing RFT file if report step is after first RFT event.
const auto openExisting = EclIO::OutputStream::RFT::OpenExisting {
static_cast<std::size_t>(report_step)
> schedule.rftConfig().firstRFTOutput()
> schedule.first_RFT()
};
EclIO::OutputStream::RFT rftFile {

View File

@@ -391,15 +391,15 @@ void Opm::RftIO::write(const int reportStep,
const ::Opm::data::WellRates& wellSol,
::Opm::EclIO::OutputStream::RFT& rftFile)
{
const auto& rftCfg = schedule.rftConfig();
if (! rftCfg.active(reportStep)) {
const auto& rftCfg = schedule[reportStep].rft_config();
if (! rftCfg.active()) {
// RFT not yet activated. Nothing to do.
return;
}
for (const auto& wname : schedule.wellNames(reportStep)) {
if (! (rftCfg.rft(wname, reportStep) ||
rftCfg.plt(wname, reportStep)))
if (! (rftCfg.rft(wname) ||
rftCfg.plt(wname)))
{
// RFT output not requested for 'wname' at this time.
continue;

View File

@@ -1824,6 +1824,48 @@ namespace {
}
}
void Schedule::handleWRFT(const HandlerContext& handlerContext, const ParseContext& parseContext, ErrorGuard& errors) {
auto new_rft = this->snapshots.back().rft_config();
for (const auto& record : handlerContext.keyword) {
const auto& item = record.getItem<ParserKeywords::WRFT::WELL>();
if (item.hasValue(0)) {
const std::string& wellNamePattern = record.getItem<ParserKeywords::WRFT::WELL>().getTrimmedString(0);
const auto well_names = wellNames(wellNamePattern, handlerContext.currentStep);
if (well_names.empty())
invalidNamePattern(wellNamePattern, handlerContext.currentStep, parseContext, errors, handlerContext.keyword);
for (const auto& well_name : well_names)
new_rft.update(well_name, RFTConfig::RFT::YES);
}
}
new_rft.first_open(true);
this->snapshots.back().rft_config.update( std::move(new_rft) );
}
void Schedule::handleWRFTPLT(const HandlerContext& handlerContext, const ParseContext& parseContext, ErrorGuard& errors) {
auto new_rft = this->snapshots.back().rft_config();
for (const auto& record : handlerContext.keyword) {
const std::string& wellNamePattern = record.getItem<ParserKeywords::WRFTPLT::WELL>().getTrimmedString(0);
const auto well_names = wellNames(wellNamePattern, handlerContext.currentStep);
auto RFTKey = RFTConfig::RFTFromString(record.getItem<ParserKeywords::WRFTPLT::OUTPUT_RFT>().getTrimmedString(0));
auto PLTKey = RFTConfig::PLTFromString(record.getItem<ParserKeywords::WRFTPLT::OUTPUT_PLT>().getTrimmedString(0));
if (well_names.empty())
invalidNamePattern(wellNamePattern, handlerContext.currentStep, parseContext, errors, handlerContext.keyword);
for (const auto& well_name : well_names) {
new_rft.update(well_name, RFTKey);
new_rft.update(well_name, PLTKey);
}
}
this->snapshots.back().rft_config.update( std::move(new_rft) );
}
bool Schedule::handleNormalKeyword(const HandlerContext& handlerContext, const ParseContext& parseContext, ErrorGuard& errors) {
using handler_function = void (Schedule::*)(const HandlerContext&, const ParseContext&, ErrorGuard&);
static const std::unordered_map<std::string,handler_function> handler_functions = {
@@ -1896,6 +1938,8 @@ namespace {
{ "WPIMULT" , &Schedule::handleWPIMULT },
{ "WPMITAB" , &Schedule::handleWPMITAB },
{ "WPOLYMER", &Schedule::handleWPOLYMER },
{ "WRFT" , &Schedule::handleWRFT },
{ "WRFTPLT" , &Schedule::handleWRFTPLT },
{ "WSALT" , &Schedule::handleWSALT },
{ "WSEGITER", &Schedule::handleWSEGITER },
{ "WSEGSICD", &Schedule::handleWSEGSICD },

View File

@@ -25,178 +25,6 @@
namespace Opm {
RFTConfig::RFTConfig()
: tm{}
, first_rft_event(tm.size())
{
}
RFTConfig::RFTConfig(const TimeMap& time_map) :
tm(time_map),
first_rft_event(tm.size())
{
}
RFTConfig RFTConfig::serializeObject()
{
RFTConfig result;
result.tm = TimeMap::serializeObject();
result.first_rft_event = 1;
result.well_open_rft_time = 2;
result.well_open_rft_name = {{"test1", 3}};
result.well_open = {{"test2", 4}};
result.rft_config = {{"test3", {{{RFT::TIMESTEP, 5}}, 6}}};
result.plt_config = {{"test3", {{{PLT::REPT, 7}}, 8}}};
return result;
}
bool RFTConfig::rft(const std::string& well_name, std::size_t report_step) const {
if (report_step >= this->tm.size())
throw std::invalid_argument("Invalid report step " + std::to_string(report_step));
if (this->outputRftAtWellopen(this->well_open.find(well_name), report_step))
return true;
auto cfg = this->rft_config.find(well_name);
if (cfg == this->rft_config.end())
return false;
const auto& rft_pair = cfg->second[report_step];
if (rft_pair.first == RFT::YES)
return (rft_pair.second == report_step);
if (rft_pair.first == RFT::NO)
return false;
if (rft_pair.first == RFT::REPT)
return true;
if (rft_pair.first == RFT::TIMESTEP)
return true;
return false;
}
bool RFTConfig::plt(const std::string& well_name, std::size_t report_step) const {
if (report_step >= this->tm.size())
throw std::invalid_argument("Invalid ");
auto cfg = this->plt_config.find(well_name);
if (cfg == this->plt_config.end())
return false;
const auto& plt_pair = cfg->second[report_step];
if (plt_pair.first == PLT::YES)
return (plt_pair.second == report_step);
if (plt_pair.first == PLT::NO)
return false;
if (plt_pair.first == PLT::REPT)
return true;
if (plt_pair.first == PLT::TIMESTEP)
return true;
return false;
}
template <typename Value>
void RFTConfig::updateConfig(const std::string& well_name,
const std::size_t report_step,
const Value value,
ConfigMap<Value>& cfgmap)
{
auto cfg = cfgmap.find(well_name);
if (cfg == cfgmap.end()) {
auto state = DynamicState<std::pair<Value, std::size_t>> {
this->tm, std::make_pair(Value::NO, 0)
};
auto stat = cfgmap.emplace(well_name, std::move(state));
if (! stat.second)
return;
cfg = stat.first;
}
cfg->second.update(report_step, std::make_pair(value, report_step));
}
void RFTConfig::updateRFT(const std::string& well_name, std::size_t report_step, RFT value) {
if (value == RFT::FOPN) {
this->setWellOpenRFT(well_name, report_step);
auto wo = this->well_open.find(well_name);
if (wo != this->well_open.end())
// New candidate first RFT event time is 'report_step' if
// well is already open, well's open event time otherwise.
this->updateFirst(std::max(report_step, wo->second));
} else {
this->updateConfig(well_name, report_step, value, this->rft_config);
if (value != RFT::NO)
// YES, REPT, or TIMESTEP.
this->updateFirstIfNotShut(well_name, report_step);
}
}
void RFTConfig::updatePLT(const std::string& well_name, std::size_t report_step, PLT value) {
this->updateConfig(well_name, report_step, value, this->plt_config);
if (value != PLT::NO)
// YES, REPT, or TIMESTEP.
this->updateFirstIfNotShut(well_name, report_step);
}
bool RFTConfig::getWellOpenRFT(const std::string& well_name, std::size_t report_step) const {
if (this->well_open_rft_name.count(well_name) > 0)
return true;
return (this->well_open_rft_time.has_value() && this->well_open_rft_time.value() <= report_step);
}
void RFTConfig::setWellOpenRFT(std::size_t report_step) {
if (this->well_open_rft_time.has_value())
this->well_open_rft_time = std::min(this->well_open_rft_time.value(), report_step);
else
this->well_open_rft_time = report_step;
this->updateFirst(this->firstWellopenStepNotBefore(report_step));
}
void RFTConfig::setWellOpenRFT(const std::string& well_name) {
this->setWellOpenRFT(well_name, std::size_t(0));
}
void RFTConfig::addWellOpen(const std::string& well_name, std::size_t report_step) {
// Implicitly handles 'well_name' already being in the map.
this->well_open.emplace(well_name, report_step);
}
bool RFTConfig::active(std::size_t report_step) const {
for (auto well = this->well_open.begin(), end = this->well_open.end(); well != end; ++well) {
if (this->outputRftAtWellopen(well, report_step))
return true;
}
for (const auto& rft_pair : this->rft_config) {
if (this->rft(rft_pair.first, report_step))
return true;
}
for (const auto& plt_pair : this->plt_config) {
if (this->rft(plt_pair.first, report_step))
return true;
}
return false;
}
std::string RFTConfig::RFT2String(RFT enumValue) {
switch (enumValue) {
case RFT::YES:
@@ -257,97 +85,131 @@ RFTConfig::PLT RFTConfig::PLTFromString( const std::string& stringValue ){
throw std::invalid_argument("Unknown enum state string: " + stringValue );
}
const TimeMap& RFTConfig::timeMap() const {
return tm;
}
bool RFTConfig::operator==(const RFTConfig& data) const {
return this->tm == data.tm &&
this->first_rft_event == data.first_rft_event &&
this->well_open_rft_time == data.well_open_rft_time &&
this->well_open_rft_name == data.well_open_rft_name &&
this->well_open == data.well_open &&
this->rft_config == data.rft_config &&
this->plt_config == data.plt_config;
return this->first_open_rft == data.first_open_rft &&
this->rft_state == data.rft_state &&
this->plt_state == data.plt_state &&
this->open_wells == data.open_wells;
}
bool RFTConfig::outputRftAtWellopen(WellOpenTimeMap::const_iterator well_iter, const std::size_t report_step) const {
assert ((report_step < this->tm.size()) && "Internal logic error for report step");
if (well_iter == this->well_open.end())
return false;
RFTConfig RFTConfig::serializeObject() {
RFTConfig rft_config;
rft_config.first_open( true );
return rft_config;
}
if (report_step < this->first_rft_event)
return false;
if (this->well_open_rft_time.has_value() && this->well_open_rft_time.value() <= report_step) {
// A general "Output RFT when the well is opened" has been
// configured with WRFT. Output RFT data if the well opens
// at this report step.
if (well_iter->second == report_step)
std::optional<RFTConfig> RFTConfig::well_open(const std::string& wname) const {
auto iter = this->open_wells.find(wname);
if (iter == this->open_wells.end()) {
if (this->first_open_rft) {
auto new_rft = *this;
new_rft.open_wells[wname] = true;
new_rft.update(wname, RFT::YES);
return new_rft;
} else {
auto new_rft = *this;
auto rft_fopn = std::find_if( new_rft.rft_state.begin(), new_rft.rft_state.end(), [&wname](const auto& rft_pair) -> bool { return (rft_pair.second == RFT::FOPN && rft_pair.first == wname); });
if (rft_fopn != new_rft.rft_state.end())
rft_fopn->second = RFT::YES;
new_rft.open_wells[wname] = true;
return new_rft;
}
}
return {};
}
void RFTConfig::first_open(bool on) {
this->first_open_rft = on;
}
void RFTConfig::update(const std::string& wname, RFT mode) {
if (mode == RFT::NO) {
auto iter = this->rft_state.find(wname);
if (iter != this->rft_state.end())
this->rft_state.erase( iter );
return;
}
if (mode == RFT::FOPN) {
if (this->open_wells.count(wname) > 0) {
this->open_wells[wname] = true;
mode = RFT::YES;
}
}
this->rft_state[wname] = mode;
}
bool RFTConfig::rft() const {
for (const auto& [_, mode] : this->rft_state) {
(void)_;
if (mode != RFT::FOPN)
return true;
}
auto rft_open = this->well_open_rft_name.find(well_iter->first);
if (rft_open == this->well_open_rft_name.end())
// No FOPN event configured for this well (i.e., well_iter->first).
return false;
// An FOPN setting has been configured with the WRFTPLT keyword.
// Output RFT data if we're at the FOPN event time and the well is
// already open or if we're after FOPN event time and the well
// opens at this step.
return ((report_step == rft_open->second) && (well_iter->second <= report_step))
|| ((report_step > rft_open->second) && (well_iter->second == report_step));
return false;
}
std::size_t RFTConfig::firstWellopenStepNotBefore(const std::size_t report_step) const {
if (well_open.empty())
// No well-open events at all (unexpected).
return this->tm.size();
using VT = WellOpenTimeMap::value_type;
auto event = std::min_element(this->well_open.begin(), this->well_open.end(),
[report_step](const VT& elem, const VT& low) -> bool
{
if (elem.second < report_step)
return false;
return elem.second < low.second;
});
if (event->second < report_step)
// All well-open events happen *before* 'report_step'.
return this->tm.size();
return event->second;
bool RFTConfig::plt() const {
return (this->plt_state.size() > 0);
}
void RFTConfig::updateFirstIfNotShut(const std::string& well_name, const std::size_t report_step) {
auto wo = this->well_open.find(well_name);
if ((wo != this->well_open.end()) && (wo->second <= report_step))
// Well opens no later than 'report_step'. New candidate
// first RFT output event is 'report_step'.
this->updateFirst(report_step);
}
void RFTConfig::updateFirst(const std::size_t report_step) {
this->first_rft_event = std::min(this->first_rft_event, report_step);
}
void RFTConfig::setWellOpenRFT(const std::string& well_name, const std::size_t report_step)
{
auto pos = this->well_open_rft_name.find(well_name);
if (pos == this->well_open_rft_name.end()) {
auto stat = this->well_open_rft_name.emplace(well_name, this->tm.size());
if (! stat.second)
return;
pos = stat.first;
void RFTConfig::update(const std::string& wname, PLT mode) {
if (mode == PLT::NO) {
auto iter = this->plt_state.find(wname);
if (iter != this->plt_state.end())
this->plt_state.erase( iter );
return;
}
pos->second = std::min(pos->second, report_step);
this->plt_state[wname] = mode;
}
bool RFTConfig::active() const {
return this->rft() || this->plt();
}
bool RFTConfig::rft(const std::string& wname) const {
auto well_iter = this->rft_state.find(wname);
if (well_iter == this->rft_state.end())
return false;
auto mode = well_iter->second;
if (mode == RFT::FOPN)
return false;
return true;
}
bool RFTConfig::plt(const std::string& wname) const {
auto well_iter = this->plt_state.find(wname);
if (well_iter == this->plt_state.end())
return false;
return true;
}
std::optional<RFTConfig> RFTConfig::next() const {
auto yes_iter_rft = std::find_if( this->rft_state.begin(), this->rft_state.end(), [](const auto& rft_pair) { return rft_pair.second == RFT::YES; });
auto yes_iter_plt = std::find_if( this->plt_state.begin(), this->plt_state.end(), [](const auto& plt_pair) { return plt_pair.second == PLT::YES; });
if (yes_iter_rft == this->rft_state.end() && yes_iter_plt == this->plt_state.end())
return {};
auto new_rft = *this;
for (auto iter = new_rft.rft_state.begin(); iter != new_rft.rft_state.end(); ) {
if (iter->second == RFT::YES)
iter = new_rft.rft_state.erase(iter);
else
iter++;
}
for (auto iter = new_rft.plt_state.begin(); iter != new_rft.plt_state.end(); ) {
if (iter->second == PLT::YES)
iter = new_rft.plt_state.erase(iter);
else
iter++;
}
return new_rft;
}
}

View File

@@ -112,7 +112,6 @@ namespace {
m_static( python, deck, runspec ),
m_sched_deck(deck, restart_info(rst) ),
m_timeMap( deck , restart_info( rst )),
rft_config(this->m_timeMap),
restart_config(m_timeMap, deck, parseContext, errors)
{
if (rst) {
@@ -244,7 +243,6 @@ namespace {
result.m_static = ScheduleStatic::serializeObject();
result.m_timeMap = TimeMap::serializeObject();
result.rft_config = RFTConfig::serializeObject();
result.restart_config = RestartConfig::serializeObject();
result.snapshots = { ScheduleState::serializeObject() };
@@ -273,8 +271,7 @@ namespace {
const FieldPropsManager* fp,
const std::vector<std::string>& matching_wells,
bool runtime,
const std::unordered_map<std::string, double> * target_wellpi,
std::vector<std::pair<const DeckKeyword*, std::size_t > >& rftProperties) {
const std::unordered_map<std::string, double> * target_wellpi) {
static const std::unordered_set<std::string> require_grid = {
"COMPDAT",
@@ -283,7 +280,6 @@ namespace {
HandlerContext handlerContext { block, keyword, currentStep, matching_wells, runtime , target_wellpi};
/*
The grid and fieldProps members create problems for reiterating the
Schedule section. We therefor single them out very clearly here.
@@ -295,13 +291,7 @@ namespace {
if (handleNormalKeyword(handlerContext, parseContext, errors))
return;
else if (keyword.name() == "WRFT")
rftProperties.push_back( std::make_pair( &keyword , currentStep ));
else if (keyword.name() == "WRFTPLT")
rftProperties.push_back( std::make_pair( &keyword , currentStep ));
else if (keyword.name() == "PYACTION")
if (keyword.name() == "PYACTION")
handlePYACTION(keyword);
}
@@ -473,24 +463,12 @@ void Schedule::iterateScheduleSection(std::size_t load_start, std::size_t load_e
fp,
{},
runtime,
target_wellpi,
rftProperties);
target_wellpi);
keyword_index++;
}
checkIfAllConnectionsIsShut(report_step);
}
for (auto rftPair = rftProperties.begin(); rftPair != rftProperties.end(); ++rftPair) {
const DeckKeyword& keyword = *rftPair->first;
std::size_t timeStep = rftPair->second;
if (keyword.name() == "WRFT")
applyWRFT(keyword, timeStep);
if (keyword.name() == "WRFTPLT")
applyWRFTPLT(keyword, timeStep);
}
}
void Schedule::addACTIONX(const Action::ActionX& action) {
@@ -560,8 +538,11 @@ void Schedule::iterateScheduleSection(std::size_t load_start, std::size_t load_e
auto old_status = well2.getStatus();
bool update = false;
if (well2.updateStatus(status)) {
if (status == Well::Status::OPEN)
this->rft_config.addWellOpen(well_name, reportStep);
if (status == Well::Status::OPEN) {
auto new_rft = this->snapshots.back().rft_config().well_open(well_name);
if (new_rft.has_value())
this->snapshots.back().rft_config.update( std::move(*new_rft) );
}
/*
The Well::updateStatus() will always return true because a new
@@ -628,11 +609,8 @@ void Schedule::iterateScheduleSection(std::size_t load_start, std::size_t load_e
+ " This well is prevented from opening at "
+ std::to_string( days ) + " days";
OpmLog::note(msg);
} else {
} else
this->updateWellStatus( wname, currentStep, well_status);
if (well_status == open)
this->rft_config.addWellOpen(wname, currentStep);
}
}
}
@@ -663,39 +641,13 @@ void Schedule::iterateScheduleSection(std::size_t load_start, std::size_t load_e
}
}
void Schedule::applyWRFT(const DeckKeyword& keyword, std::size_t currentStep) {
/* Rule for handling RFT: Request current RFT data output for specified wells, plus output when
* any well is subsequently opened
*/
for (const auto& record : keyword) {
const std::string& wellNamePattern = record.getItem("WELL").getTrimmedString(0);
const auto well_names = wellNames(wellNamePattern, currentStep);
for (const auto& well_name : well_names)
this->rft_config.updateRFT(well_name, currentStep, RFTConfig::RFT::YES);
std::optional<std::size_t> Schedule::first_RFT() const {
for (std::size_t report_step = 0; report_step < this->snapshots.size(); report_step++) {
if (this->snapshots[report_step].rft_config().active())
return report_step;
}
this->rft_config.setWellOpenRFT(currentStep);
}
void Schedule::applyWRFTPLT(const DeckKeyword& keyword, std::size_t currentStep) {
for (const auto& record : keyword) {
const std::string& wellNamePattern = record.getItem("WELL").getTrimmedString(0);
RFTConfig::RFT RFTKey = RFTConfig::RFTFromString(record.getItem("OUTPUT_RFT").getTrimmedString(0));
RFTConfig::PLT PLTKey = RFTConfig::PLTFromString(record.getItem("OUTPUT_PLT").getTrimmedString(0));
const auto well_names = wellNames(wellNamePattern, currentStep);
for (const auto& well_name : well_names) {
this->rft_config.updateRFT(well_name, currentStep, RFTKey);
this->rft_config.updatePLT(well_name, currentStep, PLTKey);
}
}
}
const RFTConfig& Schedule::rftConfig() const {
return this->rft_config;
return {};
}
@@ -1201,7 +1153,6 @@ void Schedule::iterateScheduleSection(std::size_t load_start, std::size_t load_e
void Schedule::applyAction(std::size_t reportStep, const std::chrono::system_clock::time_point&, const Action::ActionX& action, const Action::Result& result, const std::unordered_map<std::string, double>& target_wellpi) {
ParseContext parseContext;
ErrorGuard errors;
std::vector<std::pair< const DeckKeyword* , std::size_t> > ignored_rftProperties;
this->snapshots.resize(reportStep + 1);
auto& input_block = this->m_sched_deck[reportStep];
@@ -1217,8 +1168,7 @@ void Schedule::iterateScheduleSection(std::size_t load_start, std::size_t load_e
nullptr,
result.wells(),
true,
&target_wellpi,
ignored_rftProperties);
&target_wellpi);
}
if (reportStep < this->m_sched_deck.size() - 1)
iterateScheduleSection(reportStep + 1, this->m_sched_deck.size(), parseContext, errors, true, &target_wellpi, nullptr, nullptr);
@@ -1267,7 +1217,6 @@ void Schedule::iterateScheduleSection(std::size_t load_start, std::size_t load_e
return this->m_timeMap == data.m_timeMap &&
this->m_static == data.m_static &&
this->rft_config == data.rft_config &&
this->restart_config == data.restart_config &&
this->snapshots == data.snapshots;
}
@@ -1682,6 +1631,7 @@ void Schedule::create_first(const std::chrono::system_clock::time_point& start_t
sched_state.udq.update( UDQConfig( this->m_static.m_runspec.udqParams() ));
sched_state.glo.update( GasLiftOpt() );
sched_state.guide_rate.update( GuideRateConfig() );
sched_state.rft_config.update( RFTConfig() );
this->addGroup("FIELD", 0);
}

View File

@@ -65,6 +65,10 @@ ScheduleState::ScheduleState(const ScheduleState& src, const std::chrono::system
this->m_wellgroup_events.reset();
this->m_geo_keywords.clear();
this->target_wellpi.clear();
auto next_rft = this->rft_config().next();
if (next_rft.has_value())
this->rft_config.update( std::move(*next_rft) );
}
ScheduleState::ScheduleState(const ScheduleState& src, const std::chrono::system_clock::time_point& start_time, const std::chrono::system_clock::time_point& end_time) :
@@ -157,6 +161,7 @@ bool ScheduleState::operator==(const ScheduleState& other) const {
this->udq_active.get() == other.udq_active.get() &&
this->glo.get() == other.glo.get() &&
this->guide_rate.get() == other.guide_rate.get() &&
this->rft_config.get() == other.rft_config.get() &&
this->udq.get() == other.udq.get() &&
this->wells == other.wells &&
this->groups == other.groups &&
@@ -194,6 +199,7 @@ ScheduleState ScheduleState::serializeObject() {
ts.udq.update( UDQConfig::serializeObject() );
ts.guide_rate.update( GuideRateConfig::serializeObject() );
ts.glo.update( GasLiftOpt::serializeObject() );
ts.rft_config.update( RFTConfig::serializeObject() );
return ts;
}

View File

@@ -166,47 +166,36 @@ TSTEP
}
}
BOOST_AUTO_TEST_CASE(Simple)
{
const auto cse = parseDeckString(basesetup_5x5x5() + simple_tstep_all_open());
const auto& rftcfg = cse.sched.rftConfig();
BOOST_CHECK_EQUAL(rftcfg.timeMap().size(), std::size_t(20));
BOOST_CHECK_EQUAL(rftcfg.firstRFTOutput(), std::size_t(20));
const auto& sched = cse.sched;
BOOST_CHECK(!sched.first_RFT().has_value());
for (auto nstep = std::size_t(20), step = 0*nstep; step < nstep; ++step) {
BOOST_CHECK_MESSAGE(!rftcfg.active(step), "RFT Config must be Inactive");
BOOST_CHECK_MESSAGE(!rftcfg.getWellOpenRFT("I", step),
R"(Well "I" must not have a Well Open RFT request")");
BOOST_CHECK_MESSAGE(!rftcfg.getWellOpenRFT("P", step),
R"(Well "P" must not have a Well Open RFT request")");
BOOST_CHECK_MESSAGE( !sched[step].rft_config().active(), "RFT Config must be Inactive");
BOOST_CHECK_MESSAGE( !sched[step].rft_config().rft("P"), "RFT must be Inactive");
BOOST_CHECK_MESSAGE( !sched[step].rft_config().rft("I"), "PLT must be Inactive");
}
}
BOOST_AUTO_TEST_CASE(Simple_Deferred_Open)
{
const auto cse = parseDeckString(basesetup_5x5x5() + simple_tstep_deferred_open());
const auto& rftcfg = cse.sched.rftConfig();
BOOST_CHECK_EQUAL(rftcfg.timeMap().size(), std::size_t(20));
BOOST_CHECK_EQUAL(rftcfg.firstRFTOutput(), std::size_t(20));
const auto& sched = cse.sched;
BOOST_CHECK(!sched.first_RFT().has_value());
for (auto nstep = std::size_t(20), step = 0*nstep; step < nstep; ++step) {
BOOST_CHECK_MESSAGE(!rftcfg.active(step), "RFT Config must be Inactive");
// WELOPEN does not imply RFT output
BOOST_CHECK_MESSAGE(!rftcfg.getWellOpenRFT("I", step),
R"(Well "I" must not have a Well Open RFT request")");
BOOST_CHECK_MESSAGE(!rftcfg.getWellOpenRFT("P", step),
R"(Well "P" must not have a Well Open RFT request")");
BOOST_CHECK_MESSAGE( !sched[step].rft_config().active(), "RFT Config must be Inactive");
BOOST_CHECK_MESSAGE( !sched[step].rft_config().rft("P"), "RFT must be Inactive");
BOOST_CHECK_MESSAGE( !sched[step].rft_config().rft("I"), "PLT must be Inactive");
}
}
BOOST_AUTO_TEST_SUITE_END() // No_RFT_Keywords
// =====================================================================
BOOST_AUTO_TEST_SUITE(WRFT)
@@ -294,190 +283,95 @@ TSTEP
BOOST_AUTO_TEST_CASE(Simple)
{
const auto cse = parseDeckString(basesetup_5x5x5() + simple_tstep_all_open());
const auto& rftcfg = cse.sched.rftConfig();
const auto& sched = cse.sched;
BOOST_CHECK_EQUAL(rftcfg.timeMap().size(), std::size_t(11));
BOOST_CHECK_EQUAL(rftcfg.firstRFTOutput(), std::size_t( 7));
BOOST_CHECK_EQUAL(sched.first_RFT().value(), std::size_t( 7));
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 0), R"(Should NOT Output RFT Data for "P" at Step 0)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 1), R"(Should NOT Output RFT Data for "P" at Step 1)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 2), R"(Should NOT Output RFT Data for "P" at Step 2)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 3), R"(Should NOT Output RFT Data for "P" at Step 3)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 4), R"(Should NOT Output RFT Data for "P" at Step 4)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 5), R"(Should NOT Output RFT Data for "P" at Step 5)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 6), R"(Should NOT Output RFT Data for "P" at Step 6)");
BOOST_CHECK_MESSAGE( rftcfg.rft("P", 7), R"(Should Output RFT Data for "P" at Step 7)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 8), R"(Should NOT Output RFT Data for "P" at Step 8)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 9), R"(Should NOT Output RFT Data for "P" at Step 9)");
BOOST_CHECK_MESSAGE(!sched[0].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 0)");
BOOST_CHECK_MESSAGE(!sched[1].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 1)");
BOOST_CHECK_MESSAGE(!sched[2].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 2)");
BOOST_CHECK_MESSAGE(!sched[3].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 3)");
BOOST_CHECK_MESSAGE(!sched[4].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 4)");
BOOST_CHECK_MESSAGE(!sched[5].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 5)");
BOOST_CHECK_MESSAGE(!sched[6].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 6)");
BOOST_CHECK_MESSAGE( sched[7].rft_config().rft("P"), R"(Should Output RFT Data for "P" at Step 7)");
BOOST_CHECK_MESSAGE(!sched[8].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 8)");
BOOST_CHECK_MESSAGE(!sched[9].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 9)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 0), R"(Should NOT Output RFT Data for "I" at Step 0)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 1), R"(Should NOT Output RFT Data for "I" at Step 1)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 2), R"(Should NOT Output RFT Data for "I" at Step 2)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 3), R"(Should NOT Output RFT Data for "I" at Step 3)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 4), R"(Should NOT Output RFT Data for "I" at Step 4)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 5), R"(Should NOT Output RFT Data for "I" at Step 5)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 6), R"(Should NOT Output RFT Data for "I" at Step 6)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 7), R"(Should NOT Output RFT Data for "I" at Step 7)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 8), R"(Should NOT Output RFT Data for "I" at Step 8)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 9), R"(Should NOT Output RFT Data for "I" at Step 9)");
BOOST_CHECK_MESSAGE(!sched[0].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 0)");
BOOST_CHECK_MESSAGE(!sched[1].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 1)");
BOOST_CHECK_MESSAGE(!sched[2].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 2)");
BOOST_CHECK_MESSAGE(!sched[3].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 3)");
BOOST_CHECK_MESSAGE(!sched[4].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 4)");
BOOST_CHECK_MESSAGE(!sched[5].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 5)");
BOOST_CHECK_MESSAGE(!sched[6].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 6)");
BOOST_CHECK_MESSAGE(!sched[7].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 7)");
BOOST_CHECK_MESSAGE(!sched[8].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 8)");
BOOST_CHECK_MESSAGE(!sched[9].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 9)");
BOOST_CHECK_MESSAGE(!rftcfg.active(0), "RFT Config must be Inactive at Step 0");
BOOST_CHECK_MESSAGE(!rftcfg.active(1), "RFT Config must be Inactive at Step 1");
BOOST_CHECK_MESSAGE(!rftcfg.active(2), "RFT Config must be Inactive at Step 2");
BOOST_CHECK_MESSAGE(!rftcfg.active(3), "RFT Config must be Inactive at Step 3");
BOOST_CHECK_MESSAGE(!rftcfg.active(4), "RFT Config must be Inactive at Step 4");
BOOST_CHECK_MESSAGE(!rftcfg.active(5), "RFT Config must be Inactive at Step 5");
BOOST_CHECK_MESSAGE(!rftcfg.active(6), "RFT Config must be Inactive at Step 6");
BOOST_CHECK_MESSAGE( rftcfg.active(7), "RFT Config must be ACTIVE at Step 7");
BOOST_CHECK_MESSAGE(!rftcfg.active(8), "RFT Config must be Inactive at Step 8");
BOOST_CHECK_MESSAGE(!rftcfg.active(9), "RFT Config must be Inactive at Step 9");
BOOST_CHECK_MESSAGE(!rftcfg.getWellOpenRFT("I", 0),
R"(Well "I" must not have a Well Open RFT request at step 0")");
BOOST_CHECK_MESSAGE(!rftcfg.getWellOpenRFT("I", 1),
R"(Well "I" must not have a Well Open RFT request at step 1")");
BOOST_CHECK_MESSAGE(!rftcfg.getWellOpenRFT("I", 2),
R"(Well "I" must not have a Well Open RFT request at step 2")");
BOOST_CHECK_MESSAGE(!rftcfg.getWellOpenRFT("I", 3),
R"(Well "I" must not have a Well Open RFT request at step 3")");
BOOST_CHECK_MESSAGE(rftcfg.getWellOpenRFT("I", 4),
R"(Well "I" must have a Well Open RFT request at step 4")");
BOOST_CHECK_MESSAGE(rftcfg.getWellOpenRFT("I", 5),
R"(Well "I" must have a Well Open RFT request at step 5")");
BOOST_CHECK_MESSAGE(rftcfg.getWellOpenRFT("I", 6),
R"(Well "I" must have a Well Open RFT request at step 6")");
BOOST_CHECK_MESSAGE(rftcfg.getWellOpenRFT("I", 7),
R"(Well "I" must have a Well Open RFT request at step 7")");
BOOST_CHECK_MESSAGE(rftcfg.getWellOpenRFT("I", 8),
R"(Well "I" must have a Well Open RFT request at step 8")");
BOOST_CHECK_MESSAGE(rftcfg.getWellOpenRFT("I", 9),
R"(Well "I" must have a Well Open RFT request at step 9")");
BOOST_CHECK_MESSAGE(!rftcfg.getWellOpenRFT("P", 0),
R"(Well "P" must not have a Well Open RFT request at step 0")");
BOOST_CHECK_MESSAGE(!rftcfg.getWellOpenRFT("P", 1),
R"(Well "P" must not have a Well Open RFT request at step 1")");
BOOST_CHECK_MESSAGE(!rftcfg.getWellOpenRFT("P", 2),
R"(Well "P" must not have a Well Open RFT request at step 2")");
BOOST_CHECK_MESSAGE(!rftcfg.getWellOpenRFT("P", 3),
R"(Well "P" must not have a Well Open RFT request at step 3")");
BOOST_CHECK_MESSAGE(rftcfg.getWellOpenRFT("P", 4),
R"(Well "P" must have a Well Open RFT request at step 4")");
BOOST_CHECK_MESSAGE(rftcfg.getWellOpenRFT("P", 5),
R"(Well "P" must have a Well Open RFT request at step 5")");
BOOST_CHECK_MESSAGE(rftcfg.getWellOpenRFT("P", 6),
R"(Well "P" must have a Well Open RFT request at step 6")");
BOOST_CHECK_MESSAGE(rftcfg.getWellOpenRFT("P", 7),
R"(Well "P" must have a Well Open RFT request at step 7")");
BOOST_CHECK_MESSAGE(rftcfg.getWellOpenRFT("P", 8),
R"(Well "P" must have a Well Open RFT request at step 8")");
BOOST_CHECK_MESSAGE(rftcfg.getWellOpenRFT("P", 9),
R"(Well "P" must have a Well Open RFT request at step 9")");
BOOST_CHECK_MESSAGE(!sched[0].rft_config().active(), "RFT Config must be Inactive at Step 0");
BOOST_CHECK_MESSAGE(!sched[1].rft_config().active(), "RFT Config must be Inactive at Step 1");
BOOST_CHECK_MESSAGE(!sched[2].rft_config().active(), "RFT Config must be Inactive at Step 2");
BOOST_CHECK_MESSAGE(!sched[3].rft_config().active(), "RFT Config must be Inactive at Step 3");
BOOST_CHECK_MESSAGE(!sched[4].rft_config().active(), "RFT Config must be Inactive at Step 4");
BOOST_CHECK_MESSAGE(!sched[5].rft_config().active(), "RFT Config must be Inactive at Step 5");
BOOST_CHECK_MESSAGE(!sched[6].rft_config().active(), "RFT Config must be Inactive at Step 6");
BOOST_CHECK_MESSAGE( sched[7].rft_config().active(), "RFT Config must be ACTIVE at Step 7");
BOOST_CHECK_MESSAGE(!sched[8].rft_config().active(), "RFT Config must be Inactive at Step 8");
BOOST_CHECK_MESSAGE(!sched[9].rft_config().active(), "RFT Config must be Inactive at Step 9");
}
BOOST_AUTO_TEST_CASE(Deferred_Open)
{
const auto cse = parseDeckString(basesetup_5x5x5() + simple_tstep_deferred_open());
const auto& rftcfg = cse.sched.rftConfig();
const auto& sched = cse.sched;
BOOST_CHECK_EQUAL(rftcfg.timeMap().size(), std::size_t(14));
BOOST_CHECK_EQUAL(rftcfg.firstRFTOutput(), std::size_t( 7));
BOOST_CHECK_EQUAL(sched.first_RFT().value(), std::size_t( 7));
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 0), R"(Should NOT Output RFT Data for "P" at Step 0)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 1), R"(Should NOT Output RFT Data for "P" at Step 1)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 2), R"(Should NOT Output RFT Data for "P" at Step 2)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 3), R"(Should NOT Output RFT Data for "P" at Step 3)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 4), R"(Should NOT Output RFT Data for "P" at Step 4)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 5), R"(Should NOT Output RFT Data for "P" at Step 5)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 6), R"(Should NOT Output RFT Data for "P" at Step 6)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 7), R"(Should NOT Output RFT Data for "P" at Step 7)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 8), R"(Should NOT Output RFT Data for "P" at Step 8)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 9), R"(Should NOT Output RFT Data for "P" at Step 9)");
BOOST_CHECK_MESSAGE( rftcfg.rft("P", 10), R"(Should Output RFT Data for "P" at Step 10)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 11), R"(Should NOT Output RFT Data for "P" at Step 11)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 12), R"(Should NOT Output RFT Data for "P" at Step 12)");
BOOST_CHECK_MESSAGE(!sched[ 0].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 0)");
BOOST_CHECK_MESSAGE(!sched[ 1].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 1)");
BOOST_CHECK_MESSAGE(!sched[ 2].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 2)");
BOOST_CHECK_MESSAGE(!sched[ 3].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 3)");
BOOST_CHECK_MESSAGE(!sched[ 4].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 4)");
BOOST_CHECK_MESSAGE(!sched[ 5].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 5)");
BOOST_CHECK_MESSAGE(!sched[ 6].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 6)");
BOOST_CHECK_MESSAGE(!sched[ 7].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 7)");
BOOST_CHECK_MESSAGE(!sched[ 8].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 8)");
BOOST_CHECK_MESSAGE(!sched[ 9].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 9)");
BOOST_CHECK_MESSAGE( sched[10].rft_config().rft("P"), R"(Should Output RFT Data for "P" at Step 10)");
BOOST_CHECK_MESSAGE(!sched[11].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 11)");
BOOST_CHECK_MESSAGE(!sched[12].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 12)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 0), R"(Should NOT Output RFT Data for "I" at Step 0)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 1), R"(Should NOT Output RFT Data for "I" at Step 1)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 2), R"(Should NOT Output RFT Data for "I" at Step 2)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 3), R"(Should NOT Output RFT Data for "I" at Step 3)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 4), R"(Should NOT Output RFT Data for "I" at Step 4)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 5), R"(Should NOT Output RFT Data for "I" at Step 5)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 6), R"(Should NOT Output RFT Data for "I" at Step 6)");
BOOST_CHECK_MESSAGE( rftcfg.rft("I", 7), R"(Should Output RFT Data for "I" at Step 7)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 8), R"(Should NOT Output RFT Data for "I" at Step 8)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 9), R"(Should NOT Output RFT Data for "I" at Step 9)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 10), R"(Should NOT Output RFT Data for "I" at Step 9)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 11), R"(Should NOT Output RFT Data for "I" at Step 9)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 12), R"(Should NOT Output RFT Data for "I" at Step 9)");
BOOST_CHECK_MESSAGE(!sched[ 0].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 0)");
BOOST_CHECK_MESSAGE(!sched[ 1].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 1)");
BOOST_CHECK_MESSAGE(!sched[ 2].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 2)");
BOOST_CHECK_MESSAGE(!sched[ 3].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 3)");
BOOST_CHECK_MESSAGE(!sched[ 4].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 4)");
BOOST_CHECK_MESSAGE(!sched[ 5].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 5)");
BOOST_CHECK_MESSAGE(!sched[ 6].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 6)");
BOOST_CHECK_MESSAGE( sched[ 7].rft_config().rft("I"), R"(Should Output RFT Data for "I" at Step 7)");
BOOST_CHECK_MESSAGE(!sched[ 8].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 8)");
BOOST_CHECK_MESSAGE(!sched[ 9].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 9)");
BOOST_CHECK_MESSAGE(!sched[10].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 9)");
BOOST_CHECK_MESSAGE(!sched[11].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 9)");
BOOST_CHECK_MESSAGE(!sched[12].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 9)");
BOOST_CHECK_MESSAGE(!rftcfg.active( 0), "RFT Config must be Inactive at Step 0");
BOOST_CHECK_MESSAGE(!rftcfg.active( 1), "RFT Config must be Inactive at Step 1");
BOOST_CHECK_MESSAGE(!rftcfg.active( 2), "RFT Config must be Inactive at Step 2");
BOOST_CHECK_MESSAGE(!rftcfg.active( 3), "RFT Config must be Inactive at Step 3");
BOOST_CHECK_MESSAGE(!rftcfg.active( 4), "RFT Config must be Inactive at Step 4");
BOOST_CHECK_MESSAGE(!rftcfg.active( 5), "RFT Config must be Inactive at Step 5");
BOOST_CHECK_MESSAGE(!rftcfg.active( 6), "RFT Config must be Inactive at Step 6");
BOOST_CHECK_MESSAGE( rftcfg.active( 7), "RFT Config must be ACTIVE at Step 7");
BOOST_CHECK_MESSAGE(!rftcfg.active( 8), "RFT Config must be Inactive at Step 8");
BOOST_CHECK_MESSAGE(!rftcfg.active( 9), "RFT Config must be Inactive at Step 9");
BOOST_CHECK_MESSAGE( rftcfg.active(10), "RFT Config must be ACTIVE at Step 10");
BOOST_CHECK_MESSAGE(!rftcfg.active(11), "RFT Config must be Inactive at Step 11");
BOOST_CHECK_MESSAGE(!rftcfg.active(12), "RFT Config must be Inactive at Step 12");
BOOST_CHECK_MESSAGE(!rftcfg.getWellOpenRFT("I", 0),
R"(Well "I" must not have a Well Open RFT request at step 0")");
BOOST_CHECK_MESSAGE(!rftcfg.getWellOpenRFT("I", 1),
R"(Well "I" must not have a Well Open RFT request at step 1")");
BOOST_CHECK_MESSAGE(!rftcfg.getWellOpenRFT("I", 2),
R"(Well "I" must not have a Well Open RFT request at step 2")");
BOOST_CHECK_MESSAGE(!rftcfg.getWellOpenRFT("I", 3),
R"(Well "I" must not have a Well Open RFT request at step 3")");
BOOST_CHECK_MESSAGE(rftcfg.getWellOpenRFT("I", 4),
R"(Well "I" must have a Well Open RFT request at step 4")");
BOOST_CHECK_MESSAGE(rftcfg.getWellOpenRFT("I", 5),
R"(Well "I" must have a Well Open RFT request at step 5")");
BOOST_CHECK_MESSAGE(rftcfg.getWellOpenRFT("I", 6),
R"(Well "I" must have a Well Open RFT request at step 6")");
BOOST_CHECK_MESSAGE(rftcfg.getWellOpenRFT("I", 7),
R"(Well "I" must have a Well Open RFT request at step 7")");
BOOST_CHECK_MESSAGE(rftcfg.getWellOpenRFT("I", 8),
R"(Well "I" must have a Well Open RFT request at step 8")");
BOOST_CHECK_MESSAGE(rftcfg.getWellOpenRFT("I", 9),
R"(Well "I" must have a Well Open RFT request at step 9")");
BOOST_CHECK_MESSAGE(rftcfg.getWellOpenRFT("I", 10),
R"(Well "I" must have a Well Open RFT request at step 10")");
BOOST_CHECK_MESSAGE(rftcfg.getWellOpenRFT("I", 11),
R"(Well "I" must have a Well Open RFT request at step 11")");
BOOST_CHECK_MESSAGE(rftcfg.getWellOpenRFT("I", 12),
R"(Well "I" must have a Well Open RFT request at step 12")");
BOOST_CHECK_MESSAGE(!rftcfg.getWellOpenRFT("P", 0),
R"(Well "P" must not have a Well Open RFT request at step 0")");
BOOST_CHECK_MESSAGE(!rftcfg.getWellOpenRFT("P", 1),
R"(Well "P" must not have a Well Open RFT request at step 1")");
BOOST_CHECK_MESSAGE(!rftcfg.getWellOpenRFT("P", 2),
R"(Well "P" must not have a Well Open RFT request at step 2")");
BOOST_CHECK_MESSAGE(!rftcfg.getWellOpenRFT("P", 3),
R"(Well "P" must not have a Well Open RFT request at step 3")");
BOOST_CHECK_MESSAGE(rftcfg.getWellOpenRFT("P", 4),
R"(Well "P" must have a Well Open RFT request at step 4")");
BOOST_CHECK_MESSAGE(rftcfg.getWellOpenRFT("P", 5),
R"(Well "P" must have a Well Open RFT request at step 5")");
BOOST_CHECK_MESSAGE(rftcfg.getWellOpenRFT("P", 6),
R"(Well "P" must have a Well Open RFT request at step 6")");
BOOST_CHECK_MESSAGE(rftcfg.getWellOpenRFT("P", 7),
R"(Well "P" must have a Well Open RFT request at step 7")");
BOOST_CHECK_MESSAGE(rftcfg.getWellOpenRFT("P", 8),
R"(Well "P" must have a Well Open RFT request at step 8")");
BOOST_CHECK_MESSAGE(rftcfg.getWellOpenRFT("P", 9),
R"(Well "P" must have a Well Open RFT request at step 9")");
BOOST_CHECK_MESSAGE(rftcfg.getWellOpenRFT("P", 10),
R"(Well "P" must have a Well Open RFT request at step 10")");
BOOST_CHECK_MESSAGE(rftcfg.getWellOpenRFT("P", 11),
R"(Well "P" must have a Well Open RFT request at step 11")");
BOOST_CHECK_MESSAGE(rftcfg.getWellOpenRFT("P", 12),
R"(Well "P" must have a Well Open RFT request at step 12")");
BOOST_CHECK_MESSAGE(!sched[ 0].rft_config().active(), "RFT Config must be Inactive at Step 0");
BOOST_CHECK_MESSAGE(!sched[ 1].rft_config().active(), "RFT Config must be Inactive at Step 1");
BOOST_CHECK_MESSAGE(!sched[ 2].rft_config().active(), "RFT Config must be Inactive at Step 2");
BOOST_CHECK_MESSAGE(!sched[ 3].rft_config().active(), "RFT Config must be Inactive at Step 3");
BOOST_CHECK_MESSAGE(!sched[ 4].rft_config().active(), "RFT Config must be Inactive at Step 4");
BOOST_CHECK_MESSAGE(!sched[ 5].rft_config().active(), "RFT Config must be Inactive at Step 5");
BOOST_CHECK_MESSAGE(!sched[ 6].rft_config().active(), "RFT Config must be Inactive at Step 6");
BOOST_CHECK_MESSAGE( sched[ 7].rft_config().active(), "RFT Config must be ACTIVE at Step 7");
BOOST_CHECK_MESSAGE(!sched[ 8].rft_config().active(), "RFT Config must be Inactive at Step 8");
BOOST_CHECK_MESSAGE(!sched[ 9].rft_config().active(), "RFT Config must be Inactive at Step 9");
BOOST_CHECK_MESSAGE( sched[10].rft_config().active(), "RFT Config must be ACTIVE at Step 10");
BOOST_CHECK_MESSAGE(!sched[11].rft_config().active(), "RFT Config must be Inactive at Step 11");
BOOST_CHECK_MESSAGE(!sched[12].rft_config().active(), "RFT Config must be Inactive at Step 12");
}
BOOST_AUTO_TEST_SUITE_END() // WRFT
@@ -559,7 +453,7 @@ WRFTPLT
TSTEP
-- 5..7 (sim step = 4..6)
3*30 /
30 30 30/
WELOPEN
'I' 'OPEN' /
@@ -567,7 +461,7 @@ WELOPEN
TSTEP
-- 8..10 (sim step = 7..9)
3*30 /
30 30 30 /
WRFTPLT
'P' 1* YES /
@@ -584,7 +478,7 @@ COMPDAT
TSTEP
-- 11..13 (sim step = 10..12)
3*30 /
30 30 30 /
WRFTPLT
'P' YES /
@@ -614,264 +508,268 @@ TSTEP
}
}
BOOST_AUTO_TEST_CASE(All_Open)
{
const auto cse = parseDeckString(basesetup_5x5x5() + simple_tstep_all_open());
const auto& rftcfg = cse.sched.rftConfig();
const auto& sched = cse.sched;
BOOST_CHECK_EQUAL(sched.first_RFT().value(), std::size_t( 4));
BOOST_CHECK_EQUAL(rftcfg.timeMap().size(), std::size_t(16));
BOOST_CHECK_EQUAL(rftcfg.firstRFTOutput(), std::size_t( 4));
BOOST_CHECK_MESSAGE(!sched[ 0].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 0)");
BOOST_CHECK_MESSAGE(!sched[ 1].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 1)");
BOOST_CHECK_MESSAGE(!sched[ 2].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 2)");
BOOST_CHECK_MESSAGE(!sched[ 3].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 3)");
BOOST_CHECK_MESSAGE( sched[ 4].rft_config().rft("P"), R"(Should Output RFT Data for "P" at Step 4)");
BOOST_CHECK_MESSAGE(!sched[ 5].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 5)");
BOOST_CHECK_MESSAGE(!sched[ 6].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 6)");
BOOST_CHECK_MESSAGE(!sched[ 7].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 7)");
BOOST_CHECK_MESSAGE(!sched[ 8].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 8)");
BOOST_CHECK_MESSAGE(!sched[ 9].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 9)");
BOOST_CHECK_MESSAGE( sched[10].rft_config().rft("P"), R"(Should Output RFT Data for "P" at Step 10)");
BOOST_CHECK_MESSAGE(!sched[11].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 11)");
BOOST_CHECK_MESSAGE(!sched[12].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 12)");
BOOST_CHECK_MESSAGE( sched[13].rft_config().rft("P"), R"(Should Output RFT Data for "P" at Step 13)");
BOOST_CHECK_MESSAGE( sched[14].rft_config().rft("P"), R"(Should Output RFT Data for "P" at Step 14)");
BOOST_CHECK_MESSAGE( sched[15].rft_config().rft("P"), R"(Should Output RFT Data for "P" at Step 15)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 0), R"(Should NOT Output RFT Data for "P" at Step 0)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 1), R"(Should NOT Output RFT Data for "P" at Step 1)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 2), R"(Should NOT Output RFT Data for "P" at Step 2)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 3), R"(Should NOT Output RFT Data for "P" at Step 3)");
BOOST_CHECK_MESSAGE( rftcfg.rft("P", 4), R"(Should Output RFT Data for "P" at Step 4)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 5), R"(Should NOT Output RFT Data for "P" at Step 5)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 6), R"(Should NOT Output RFT Data for "P" at Step 6)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 7), R"(Should NOT Output RFT Data for "P" at Step 7)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 8), R"(Should NOT Output RFT Data for "P" at Step 8)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 9), R"(Should NOT Output RFT Data for "P" at Step 9)");
BOOST_CHECK_MESSAGE( rftcfg.rft("P", 10), R"(Should Output RFT Data for "P" at Step 10)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 11), R"(Should NOT Output RFT Data for "P" at Step 11)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 12), R"(Should NOT Output RFT Data for "P" at Step 12)");
BOOST_CHECK_MESSAGE( rftcfg.rft("P", 13), R"(Should Output RFT Data for "P" at Step 13)");
BOOST_CHECK_MESSAGE( rftcfg.rft("P", 14), R"(Should Output RFT Data for "P" at Step 14)");
BOOST_CHECK_MESSAGE( rftcfg.rft("P", 15), R"(Should Output RFT Data for "P" at Step 15)");
BOOST_CHECK_MESSAGE(!sched[ 0].rft_config().plt("P"), R"(Should NOT Output PLT Data for "P" at Step 0)");
BOOST_CHECK_MESSAGE(!sched[ 1].rft_config().plt("P"), R"(Should NOT Output PLT Data for "P" at Step 1)");
BOOST_CHECK_MESSAGE(!sched[ 2].rft_config().plt("P"), R"(Should NOT Output PLT Data for "P" at Step 2)");
BOOST_CHECK_MESSAGE(!sched[ 3].rft_config().plt("P"), R"(Should NOT Output PLT Data for "P" at Step 3)");
BOOST_CHECK_MESSAGE(!sched[ 4].rft_config().plt("P"), R"(Should NOT Output PLT Data for "P" at Step 4)");
BOOST_CHECK_MESSAGE(!sched[ 5].rft_config().plt("P"), R"(Should NOT Output PLT Data for "P" at Step 5)");
BOOST_CHECK_MESSAGE(!sched[ 6].rft_config().plt("P"), R"(Should NOT Output PLT Data for "P" at Step 6)");
BOOST_CHECK_MESSAGE( sched[ 7].rft_config().plt("P"), R"(Should Output PLT Data for "P" at Step 7)");
BOOST_CHECK_MESSAGE(!sched[ 8].rft_config().plt("P"), R"(Should NOT Output PLT Data for "P" at Step 8)");
BOOST_CHECK_MESSAGE(!sched[ 9].rft_config().plt("P"), R"(Should NOT Output PLT Data for "P" at Step 9)");
BOOST_CHECK_MESSAGE(!sched[10].rft_config().plt("P"), R"(Should NOT Output PLT Data for "P" at Step 10)");
BOOST_CHECK_MESSAGE(!sched[11].rft_config().plt("P"), R"(Should NOT Output PLT Data for "P" at Step 11)");
BOOST_CHECK_MESSAGE(!sched[12].rft_config().plt("P"), R"(Should NOT Output PLT Data for "P" at Step 12)");
BOOST_CHECK_MESSAGE(!sched[13].rft_config().plt("P"), R"(Should NOT Output PLT Data for "P" at Step 13)");
BOOST_CHECK_MESSAGE(!sched[14].rft_config().plt("P"), R"(Should NOT Output PLT Data for "P" at Step 14)");
BOOST_CHECK_MESSAGE(!sched[15].rft_config().plt("P"), R"(Should NOT Output PLT Data for "P" at Step 15)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P", 0), R"(Should NOT Output PLT Data for "P" at Step 0)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P", 1), R"(Should NOT Output PLT Data for "P" at Step 1)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P", 2), R"(Should NOT Output PLT Data for "P" at Step 2)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P", 3), R"(Should NOT Output PLT Data for "P" at Step 3)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P", 4), R"(Should NOT Output PLT Data for "P" at Step 4)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P", 5), R"(Should NOT Output PLT Data for "P" at Step 5)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P", 6), R"(Should NOT Output PLT Data for "P" at Step 6)");
BOOST_CHECK_MESSAGE( rftcfg.plt("P", 7), R"(Should Output PLT Data for "P" at Step 7)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P", 8), R"(Should NOT Output PLT Data for "P" at Step 8)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P", 9), R"(Should NOT Output PLT Data for "P" at Step 9)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P", 10), R"(Should NOT Output PLT Data for "P" at Step 10)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P", 11), R"(Should NOT Output PLT Data for "P" at Step 11)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P", 12), R"(Should NOT Output PLT Data for "P" at Step 12)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P", 13), R"(Should NOT Output PLT Data for "P" at Step 13)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P", 14), R"(Should NOT Output PLT Data for "P" at Step 14)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P", 15), R"(Should NOT Output PLT Data for "P" at Step 15)");
BOOST_CHECK_MESSAGE(!sched[ 0].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 0)");
BOOST_CHECK_MESSAGE(!sched[ 1].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 1)");
BOOST_CHECK_MESSAGE(!sched[ 2].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 2)");
BOOST_CHECK_MESSAGE(!sched[ 3].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 3)");
BOOST_CHECK_MESSAGE(!sched[ 4].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 4)");
BOOST_CHECK_MESSAGE(!sched[ 5].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 5)");
BOOST_CHECK_MESSAGE(!sched[ 6].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 6)");
BOOST_CHECK_MESSAGE( sched[ 7].rft_config().rft("I"), R"(Should Output RFT Data for "I" at Step 7)");
BOOST_CHECK_MESSAGE( sched[ 8].rft_config().rft("I"), R"(Should Output RFT Data for "I" at Step 8)");
BOOST_CHECK_MESSAGE( sched[ 9].rft_config().rft("I"), R"(Should Output RFT Data for "I" at Step 9)");
BOOST_CHECK_MESSAGE(!sched[10].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 10)");
BOOST_CHECK_MESSAGE(!sched[11].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 11)");
BOOST_CHECK_MESSAGE(!sched[12].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 12)");
BOOST_CHECK_MESSAGE( sched[13].rft_config().rft("I"), R"(Should Output RFT Data for "I" at Step 13)");
BOOST_CHECK_MESSAGE( sched[14].rft_config().rft("I"), R"(Should Output RFT Data for "I" at Step 14)");
BOOST_CHECK_MESSAGE( sched[15].rft_config().rft("I"), R"(Should Output RFT Data for "I" at Step 15)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 0), R"(Should NOT Output RFT Data for "I" at Step 0)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 1), R"(Should NOT Output RFT Data for "I" at Step 1)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 2), R"(Should NOT Output RFT Data for "I" at Step 2)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 3), R"(Should NOT Output RFT Data for "I" at Step 3)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 4), R"(Should NOT Output RFT Data for "I" at Step 4)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 5), R"(Should NOT Output RFT Data for "I" at Step 5)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 6), R"(Should NOT Output RFT Data for "I" at Step 6)");
BOOST_CHECK_MESSAGE( rftcfg.rft("I", 7), R"(Should Output RFT Data for "I" at Step 7)");
BOOST_CHECK_MESSAGE( rftcfg.rft("I", 8), R"(Should Output RFT Data for "I" at Step 8)");
BOOST_CHECK_MESSAGE( rftcfg.rft("I", 9), R"(Should Output RFT Data for "I" at Step 9)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 10), R"(Should NOT Output RFT Data for "I" at Step 10)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 11), R"(Should NOT Output RFT Data for "I" at Step 11)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 12), R"(Should NOT Output RFT Data for "I" at Step 12)");
BOOST_CHECK_MESSAGE( rftcfg.rft("I", 13), R"(Should Output RFT Data for "I" at Step 13)");
BOOST_CHECK_MESSAGE( rftcfg.rft("I", 14), R"(Should Output RFT Data for "I" at Step 14)");
BOOST_CHECK_MESSAGE( rftcfg.rft("I", 15), R"(Should Output RFT Data for "I" at Step 15)");
BOOST_CHECK_MESSAGE(!sched[ 0].rft_config().plt("I"), R"(Should NOT Output PLT Data for "I" at Step 0)");
BOOST_CHECK_MESSAGE(!sched[ 1].rft_config().plt("I"), R"(Should NOT Output PLT Data for "I" at Step 1)");
BOOST_CHECK_MESSAGE(!sched[ 2].rft_config().plt("I"), R"(Should NOT Output PLT Data for "I" at Step 2)");
BOOST_CHECK_MESSAGE(!sched[ 3].rft_config().plt("I"), R"(Should NOT Output PLT Data for "I" at Step 3)");
BOOST_CHECK_MESSAGE(!sched[ 4].rft_config().plt("I"), R"(Should NOT Output PLT Data for "I" at Step 4)");
BOOST_CHECK_MESSAGE(!sched[ 5].rft_config().plt("I"), R"(Should NOT Output PLT Data for "I" at Step 5)");
BOOST_CHECK_MESSAGE(!sched[ 6].rft_config().plt("I"), R"(Should NOT Output PLT Data for "I" at Step 6)");
BOOST_CHECK_MESSAGE(!sched[ 7].rft_config().plt("I"), R"(Should NOT Output PLT Data for "I" at Step 7)");
BOOST_CHECK_MESSAGE(!sched[ 8].rft_config().plt("I"), R"(Should NOT Output PLT Data for "I" at Step 8)");
BOOST_CHECK_MESSAGE(!sched[ 9].rft_config().plt("I"), R"(Should NOT Output PLT Data for "I" at Step 9)");
BOOST_CHECK_MESSAGE( sched[10].rft_config().plt("I"), R"(Should Output PLT Data for "I" at Step 10)");
BOOST_CHECK_MESSAGE(!sched[11].rft_config().plt("I"), R"(Should NOT Output PLT Data for "I" at Step 11)");
BOOST_CHECK_MESSAGE(!sched[12].rft_config().plt("I"), R"(Should NOT Output PLT Data for "I" at Step 12)");
BOOST_CHECK_MESSAGE(!sched[13].rft_config().plt("I"), R"(Should NOT Output PLT Data for "I" at Step 13)");
BOOST_CHECK_MESSAGE(!sched[14].rft_config().plt("I"), R"(Should NOT Output PLT Data for "I" at Step 14)");
BOOST_CHECK_MESSAGE(!sched[15].rft_config().plt("I"), R"(Should NOT Output PLT Data for "I" at Step 15)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("I", 0), R"(Should NOT Output PLT Data for "I" at Step 0)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("I", 1), R"(Should NOT Output PLT Data for "I" at Step 1)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("I", 2), R"(Should NOT Output PLT Data for "I" at Step 2)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("I", 3), R"(Should NOT Output PLT Data for "I" at Step 3)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("I", 4), R"(Should NOT Output PLT Data for "I" at Step 4)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("I", 5), R"(Should NOT Output PLT Data for "I" at Step 5)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("I", 6), R"(Should NOT Output PLT Data for "I" at Step 6)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("I", 7), R"(Should NOT Output PLT Data for "I" at Step 7)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("I", 8), R"(Should NOT Output PLT Data for "I" at Step 8)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("I", 9), R"(Should NOT Output PLT Data for "I" at Step 9)");
BOOST_CHECK_MESSAGE( rftcfg.plt("I", 10), R"(Should Output PLT Data for "I" at Step 10)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("I", 11), R"(Should NOT Output PLT Data for "I" at Step 11)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("I", 12), R"(Should NOT Output PLT Data for "I" at Step 12)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("I", 13), R"(Should NOT Output PLT Data for "I" at Step 13)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("I", 14), R"(Should NOT Output PLT Data for "I" at Step 14)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("I", 15), R"(Should NOT Output PLT Data for "I" at Step 15)");
BOOST_CHECK_MESSAGE(!rftcfg.active( 0), R"(RFT Config must be Inactive at Step 0)");
BOOST_CHECK_MESSAGE(!rftcfg.active( 1), R"(RFT Config must be Inactive at Step 1)");
BOOST_CHECK_MESSAGE(!rftcfg.active( 2), R"(RFT Config must be Inactive at Step 2)");
BOOST_CHECK_MESSAGE(!rftcfg.active( 3), R"(RFT Config must be Inactive at Step 3)");
BOOST_CHECK_MESSAGE( rftcfg.active( 4), R"(RFT Config must be Active at Step 4)");
BOOST_CHECK_MESSAGE(!rftcfg.active( 5), R"(RFT Config must be Inactive at Step 5)");
BOOST_CHECK_MESSAGE(!rftcfg.active( 6), R"(RFT Config must be Inactive at Step 6)");
BOOST_CHECK_MESSAGE( rftcfg.active( 7), R"(RFT Config must be Active at Step 7)");
BOOST_CHECK_MESSAGE( rftcfg.active( 8), R"(RFT Config must be Active at Step 8)");
BOOST_CHECK_MESSAGE( rftcfg.active( 9), R"(RFT Config must be Active at Step 9)");
BOOST_CHECK_MESSAGE( rftcfg.active(10), R"(RFT Config must be Active at Step 10)");
BOOST_CHECK_MESSAGE(!rftcfg.active(11), R"(RFT Config must be Inactive at Step 11)");
BOOST_CHECK_MESSAGE(!rftcfg.active(12), R"(RFT Config must be Inactive at Step 12)");
BOOST_CHECK_MESSAGE( rftcfg.active(13), R"(RFT Config must be Active at Step 13)");
BOOST_CHECK_MESSAGE( rftcfg.active(14), R"(RFT Config must be Active at Step 14)");
BOOST_CHECK_MESSAGE( rftcfg.active(15), R"(RFT Config must be Active at Step 15)");
BOOST_CHECK_MESSAGE(!sched[ 0].rft_config().active(), R"(RFT Config must be Inactive at Step 0)");
BOOST_CHECK_MESSAGE(!sched[ 1].rft_config().active(), R"(RFT Config must be Inactive at Step 1)");
BOOST_CHECK_MESSAGE(!sched[ 2].rft_config().active(), R"(RFT Config must be Inactive at Step 2)");
BOOST_CHECK_MESSAGE(!sched[ 3].rft_config().active(), R"(RFT Config must be Inactive at Step 3)");
BOOST_CHECK_MESSAGE( sched[ 4].rft_config().active(), R"(RFT Config must be Active at Step 4)");
BOOST_CHECK_MESSAGE(!sched[ 5].rft_config().active(), R"(RFT Config must be Inactive at Step 5)");
BOOST_CHECK_MESSAGE(!sched[ 6].rft_config().active(), R"(RFT Config must be Inactive at Step 6)");
BOOST_CHECK_MESSAGE( sched[ 7].rft_config().active(), R"(RFT Config must be Active at Step 7)");
BOOST_CHECK_MESSAGE( sched[ 8].rft_config().active(), R"(RFT Config must be Active at Step 8)");
BOOST_CHECK_MESSAGE( sched[ 9].rft_config().active(), R"(RFT Config must be Active at Step 9)");
BOOST_CHECK_MESSAGE( sched[10].rft_config().active(), R"(RFT Config must be Active at Step 10)");
BOOST_CHECK_MESSAGE(!sched[11].rft_config().active(), R"(RFT Config must be Inactive at Step 11)");
BOOST_CHECK_MESSAGE(!sched[12].rft_config().active(), R"(RFT Config must be Inactive at Step 12)");
BOOST_CHECK_MESSAGE( sched[13].rft_config().active(), R"(RFT Config must be Active at Step 13)");
BOOST_CHECK_MESSAGE( sched[14].rft_config().active(), R"(RFT Config must be Active at Step 14)");
BOOST_CHECK_MESSAGE( sched[15].rft_config().active(), R"(RFT Config must be Active at Step 15)");
}
BOOST_AUTO_TEST_CASE(Deferred_Open)
{
const auto cse = parseDeckString(basesetup_5x5x5() + simple_tstep_deferred_open());
const auto& rftcfg = cse.sched.rftConfig();
const auto& sched = cse.sched;
BOOST_CHECK_EQUAL(rftcfg.timeMap().size(), std::size_t(21));
BOOST_CHECK_EQUAL(rftcfg.firstRFTOutput(), std::size_t( 4));
BOOST_CHECK_EQUAL(sched.first_RFT().value(), std::size_t( 4));
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 0), R"(Should NOT Output RFT Data for "P" at Step 0)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 1), R"(Should NOT Output RFT Data for "P" at Step 1)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 2), R"(Should NOT Output RFT Data for "P" at Step 2)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 3), R"(Should NOT Output RFT Data for "P" at Step 3)");
BOOST_CHECK_MESSAGE( rftcfg.rft("P", 4), R"(Should Output RFT Data for "P" at Step 4)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 5), R"(Should NOT Output RFT Data for "P" at Step 5)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 6), R"(Should NOT Output RFT Data for "P" at Step 6)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 7), R"(Should NOT Output RFT Data for "P" at Step 7)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 8), R"(Should NOT Output RFT Data for "P" at Step 8)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 9), R"(Should NOT Output RFT Data for "P" at Step 9)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 10), R"(Should NOT Output RFT Data for "P" at Step 10)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 11), R"(Should NOT Output RFT Data for "P" at Step 11)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 12), R"(Should NOT Output RFT Data for "P" at Step 12)");
BOOST_CHECK_MESSAGE( rftcfg.rft("P", 13), R"(Should Output RFT Data for "P" at Step 13)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 14), R"(Should NOT Output RFT Data for "P" at Step 14)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 15), R"(Should NOT Output RFT Data for "P" at Step 15)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 16), R"(Should NOT Output RFT Data for "P" at Step 16)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P", 17), R"(Should NOT Output RFT Data for "P" at Step 17)");
BOOST_CHECK_MESSAGE( rftcfg.rft("P", 18), R"(Should Output RFT Data for "P" at Step 18)");
BOOST_CHECK_MESSAGE( rftcfg.rft("P", 19), R"(Should Output RFT Data for "P" at Step 19)");
BOOST_CHECK_MESSAGE( rftcfg.rft("P", 20), R"(Should Output RFT Data for "P" at Step 20)");
BOOST_CHECK_MESSAGE(!sched[ 0].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 0)");
BOOST_CHECK_MESSAGE(!sched[ 1].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 1)");
BOOST_CHECK_MESSAGE(!sched[ 2].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 2)");
BOOST_CHECK_MESSAGE(!sched[ 3].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 3)");
BOOST_CHECK_MESSAGE( sched[ 4].rft_config().rft("P"), R"(Should Output RFT Data for "P" at Step 4)");
BOOST_CHECK_MESSAGE(!sched[ 5].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 5)");
BOOST_CHECK_MESSAGE(!sched[ 6].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 6)");
BOOST_CHECK_MESSAGE(!sched[ 7].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 7)");
BOOST_CHECK_MESSAGE(!sched[ 8].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 8)");
BOOST_CHECK_MESSAGE(!sched[ 9].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 9)");
BOOST_CHECK_MESSAGE(!sched[10].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 10)");
BOOST_CHECK_MESSAGE(!sched[11].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 11)");
BOOST_CHECK_MESSAGE(!sched[12].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 12)");
BOOST_CHECK_MESSAGE( sched[13].rft_config().rft("P"), R"(Should Output RFT Data for "P" at Step 13)");
BOOST_CHECK_MESSAGE(!sched[14].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 14)");
BOOST_CHECK_MESSAGE(!sched[15].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 15)");
BOOST_CHECK_MESSAGE(!sched[16].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 16)");
BOOST_CHECK_MESSAGE(!sched[17].rft_config().rft("P"), R"(Should NOT Output RFT Data for "P" at Step 17)");
BOOST_CHECK_MESSAGE( sched[18].rft_config().rft("P"), R"(Should Output RFT Data for "P" at Step 18)");
BOOST_CHECK_MESSAGE( sched[19].rft_config().rft("P"), R"(Should Output RFT Data for "P" at Step 19)");
BOOST_CHECK_MESSAGE( sched[20].rft_config().rft("P"), R"(Should Output RFT Data for "P" at Step 20)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P", 0), R"(Should NOT Output PLT Data for "P" at Step 0)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P", 1), R"(Should NOT Output PLT Data for "P" at Step 1)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P", 2), R"(Should NOT Output PLT Data for "P" at Step 2)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P", 3), R"(Should NOT Output PLT Data for "P" at Step 3)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P", 4), R"(Should NOT Output PLT Data for "P" at Step 4)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P", 5), R"(Should NOT Output PLT Data for "P" at Step 5)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P", 6), R"(Should NOT Output PLT Data for "P" at Step 6)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P", 7), R"(Should NOT Output PLT Data for "P" at Step 7)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P", 8), R"(Should NOT Output PLT Data for "P" at Step 8)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P", 9), R"(Should NOT Output PLT Data for "P" at Step 9)");
BOOST_CHECK_MESSAGE( rftcfg.plt("P", 10), R"(Should Output PLT Data for "P" at Step 10)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P", 11), R"(Should NOT Output PLT Data for "P" at Step 11)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P", 12), R"(Should NOT Output PLT Data for "P" at Step 12)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P", 13), R"(Should NOT Output PLT Data for "P" at Step 13)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P", 14), R"(Should NOT Output PLT Data for "P" at Step 14)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P", 15), R"(Should NOT Output PLT Data for "P" at Step 15)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P", 16), R"(Should NOT Output PLT Data for "P" at Step 16)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P", 17), R"(Should NOT Output PLT Data for "P" at Step 17)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P", 18), R"(Should NOT Output PLT Data for "P" at Step 18)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P", 19), R"(Should NOT Output PLT Data for "P" at Step 19)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P", 20), R"(Should NOT Output PLT Data for "P" at Step 20)");
BOOST_CHECK_MESSAGE(!sched[ 0].rft_config().plt("P"), R"(Should NOT Output PLT Data for "P" at Step 0)");
BOOST_CHECK_MESSAGE(!sched[ 1].rft_config().plt("P"), R"(Should NOT Output PLT Data for "P" at Step 1)");
BOOST_CHECK_MESSAGE(!sched[ 2].rft_config().plt("P"), R"(Should NOT Output PLT Data for "P" at Step 2)");
BOOST_CHECK_MESSAGE(!sched[ 3].rft_config().plt("P"), R"(Should NOT Output PLT Data for "P" at Step 3)");
BOOST_CHECK_MESSAGE(!sched[ 4].rft_config().plt("P"), R"(Should NOT Output PLT Data for "P" at Step 4)");
BOOST_CHECK_MESSAGE(!sched[ 5].rft_config().plt("P"), R"(Should NOT Output PLT Data for "P" at Step 5)");
BOOST_CHECK_MESSAGE(!sched[ 6].rft_config().plt("P"), R"(Should NOT Output PLT Data for "P" at Step 6)");
BOOST_CHECK_MESSAGE(!sched[ 7].rft_config().plt("P"), R"(Should NOT Output PLT Data for "P" at Step 7)");
BOOST_CHECK_MESSAGE(!sched[ 8].rft_config().plt("P"), R"(Should NOT Output PLT Data for "P" at Step 8)");
BOOST_CHECK_MESSAGE(!sched[ 9].rft_config().plt("P"), R"(Should NOT Output PLT Data for "P" at Step 9)");
BOOST_CHECK_MESSAGE( sched[10].rft_config().plt("P"), R"(Should Output PLT Data for "P" at Step 10)");
BOOST_CHECK_MESSAGE(!sched[11].rft_config().plt("P"), R"(Should NOT Output PLT Data for "P" at Step 11)");
BOOST_CHECK_MESSAGE(!sched[12].rft_config().plt("P"), R"(Should NOT Output PLT Data for "P" at Step 12)");
BOOST_CHECK_MESSAGE(!sched[13].rft_config().plt("P"), R"(Should NOT Output PLT Data for "P" at Step 13)");
BOOST_CHECK_MESSAGE(!sched[14].rft_config().plt("P"), R"(Should NOT Output PLT Data for "P" at Step 14)");
BOOST_CHECK_MESSAGE(!sched[15].rft_config().plt("P"), R"(Should NOT Output PLT Data for "P" at Step 15)");
BOOST_CHECK_MESSAGE(!sched[16].rft_config().plt("P"), R"(Should NOT Output PLT Data for "P" at Step 16)");
BOOST_CHECK_MESSAGE(!sched[17].rft_config().plt("P"), R"(Should NOT Output PLT Data for "P" at Step 17)");
BOOST_CHECK_MESSAGE(!sched[18].rft_config().plt("P"), R"(Should NOT Output PLT Data for "P" at Step 18)");
BOOST_CHECK_MESSAGE(!sched[19].rft_config().plt("P"), R"(Should NOT Output PLT Data for "P" at Step 19)");
BOOST_CHECK_MESSAGE(!sched[20].rft_config().plt("P"), R"(Should NOT Output PLT Data for "P" at Step 20)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 0), R"(Should NOT Output RFT Data for "I" at Step 0)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 1), R"(Should NOT Output RFT Data for "I" at Step 1)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 2), R"(Should NOT Output RFT Data for "I" at Step 2)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 3), R"(Should NOT Output RFT Data for "I" at Step 3)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 4), R"(Should NOT Output RFT Data for "I" at Step 4)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 5), R"(Should NOT Output RFT Data for "I" at Step 5)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 6), R"(Should NOT Output RFT Data for "I" at Step 6)");
BOOST_CHECK_MESSAGE( rftcfg.rft("I", 7), R"(Should Output RFT Data for "I" at Step 7)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 8), R"(Should NOT Output RFT Data for "I" at Step 8)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 9), R"(Should NOT Output RFT Data for "I" at Step 9)");
BOOST_CHECK_MESSAGE( rftcfg.rft("I", 10), R"(Should Output RFT Data for "I" at Step 10)");
BOOST_CHECK_MESSAGE( rftcfg.rft("I", 11), R"(Should Output RFT Data for "I" at Step 11)");
BOOST_CHECK_MESSAGE( rftcfg.rft("I", 12), R"(Should Output RFT Data for "I" at Step 12)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 13), R"(Should Output RFT Data for "I" at Step 13)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 14), R"(Should NOT Output RFT Data for "I" at Step 14)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 15), R"(Should NOT Output RFT Data for "I" at Step 15)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 16), R"(Should NOT Output RFT Data for "I" at Step 16)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("I", 17), R"(Should NOT Output RFT Data for "I" at Step 17)");
BOOST_CHECK_MESSAGE( rftcfg.rft("I", 18), R"(Should Output RFT Data for "I" at Step 18)");
BOOST_CHECK_MESSAGE( rftcfg.rft("I", 19), R"(Should Output RFT Data for "I" at Step 19)");
BOOST_CHECK_MESSAGE( rftcfg.rft("I", 20), R"(Should Output RFT Data for "I" at Step 20)");
BOOST_CHECK_MESSAGE(!sched[ 0].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 0)");
BOOST_CHECK_MESSAGE(!sched[ 1].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 1)");
BOOST_CHECK_MESSAGE(!sched[ 2].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 2)");
BOOST_CHECK_MESSAGE(!sched[ 3].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 3)");
BOOST_CHECK_MESSAGE(!sched[ 4].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 4)");
BOOST_CHECK_MESSAGE(!sched[ 5].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 5)");
BOOST_CHECK_MESSAGE(!sched[ 6].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 6)");
BOOST_CHECK_MESSAGE( sched[ 7].rft_config().rft("I"), R"(Should Output RFT Data for "I" at Step 7)");
BOOST_CHECK_MESSAGE(!sched[ 8].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 8)");
BOOST_CHECK_MESSAGE(!sched[ 9].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 9)");
BOOST_CHECK_MESSAGE( sched[10].rft_config().rft("I"), R"(Should Output RFT Data for "I" at Step 10)");
BOOST_CHECK_MESSAGE( sched[11].rft_config().rft("I"), R"(Should Output RFT Data for "I" at Step 11)");
BOOST_CHECK_MESSAGE( sched[12].rft_config().rft("I"), R"(Should Output RFT Data for "I" at Step 12)");
BOOST_CHECK_MESSAGE(!sched[13].rft_config().rft("I"), R"(Should Output RFT Data for "I" at Step 13)");
BOOST_CHECK_MESSAGE(!sched[14].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 14)");
BOOST_CHECK_MESSAGE(!sched[15].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 15)");
BOOST_CHECK_MESSAGE(!sched[16].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 16)");
BOOST_CHECK_MESSAGE(!sched[17].rft_config().rft("I"), R"(Should NOT Output RFT Data for "I" at Step 17)");
BOOST_CHECK_MESSAGE( sched[18].rft_config().rft("I"), R"(Should Output RFT Data for "I" at Step 18)");
BOOST_CHECK_MESSAGE( sched[19].rft_config().rft("I"), R"(Should Output RFT Data for "I" at Step 19)");
BOOST_CHECK_MESSAGE( sched[20].rft_config().rft("I"), R"(Should Output RFT Data for "I" at Step 20)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("I", 0), R"(Should NOT Output PLT Data for "I" at Step 0)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("I", 1), R"(Should NOT Output PLT Data for "I" at Step 1)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("I", 2), R"(Should NOT Output PLT Data for "I" at Step 2)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("I", 3), R"(Should NOT Output PLT Data for "I" at Step 3)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("I", 4), R"(Should NOT Output PLT Data for "I" at Step 4)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("I", 5), R"(Should NOT Output PLT Data for "I" at Step 5)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("I", 6), R"(Should NOT Output PLT Data for "I" at Step 6)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("I", 7), R"(Should NOT Output PLT Data for "I" at Step 7)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("I", 8), R"(Should NOT Output PLT Data for "I" at Step 8)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("I", 9), R"(Should NOT Output PLT Data for "I" at Step 9)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("I", 10), R"(Should NOT Output PLT Data for "I" at Step 10)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("I", 11), R"(Should NOT Output PLT Data for "I" at Step 11)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("I", 12), R"(Should NOT Output PLT Data for "I" at Step 12)");
BOOST_CHECK_MESSAGE( rftcfg.plt("I", 13), R"(Should Output PLT Data for "I" at Step 13)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("I", 14), R"(Should NOT Output PLT Data for "I" at Step 14)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("I", 15), R"(Should NOT Output PLT Data for "I" at Step 15)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("I", 16), R"(Should NOT Output PLT Data for "I" at Step 16)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("I", 17), R"(Should NOT Output PLT Data for "I" at Step 17)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("I", 18), R"(Should NOT Output PLT Data for "I" at Step 18)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("I", 19), R"(Should NOT Output PLT Data for "I" at Step 19)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("I", 20), R"(Should NOT Output PLT Data for "I" at Step 20)");
BOOST_CHECK_MESSAGE(!sched[ 0].rft_config().plt("I"), R"(Should NOT Output PLT Data for "I" at Step 0)");
BOOST_CHECK_MESSAGE(!sched[ 1].rft_config().plt("I"), R"(Should NOT Output PLT Data for "I" at Step 1)");
BOOST_CHECK_MESSAGE(!sched[ 2].rft_config().plt("I"), R"(Should NOT Output PLT Data for "I" at Step 2)");
BOOST_CHECK_MESSAGE(!sched[ 3].rft_config().plt("I"), R"(Should NOT Output PLT Data for "I" at Step 3)");
BOOST_CHECK_MESSAGE(!sched[ 4].rft_config().plt("I"), R"(Should NOT Output PLT Data for "I" at Step 4)");
BOOST_CHECK_MESSAGE(!sched[ 5].rft_config().plt("I"), R"(Should NOT Output PLT Data for "I" at Step 5)");
BOOST_CHECK_MESSAGE(!sched[ 6].rft_config().plt("I"), R"(Should NOT Output PLT Data for "I" at Step 6)");
BOOST_CHECK_MESSAGE(!sched[ 7].rft_config().plt("I"), R"(Should NOT Output PLT Data for "I" at Step 7)");
BOOST_CHECK_MESSAGE(!sched[ 8].rft_config().plt("I"), R"(Should NOT Output PLT Data for "I" at Step 8)");
BOOST_CHECK_MESSAGE(!sched[ 9].rft_config().plt("I"), R"(Should NOT Output PLT Data for "I" at Step 9)");
BOOST_CHECK_MESSAGE(!sched[10].rft_config().plt("I"), R"(Should NOT Output PLT Data for "I" at Step 10)");
BOOST_CHECK_MESSAGE(!sched[11].rft_config().plt("I"), R"(Should NOT Output PLT Data for "I" at Step 11)");
BOOST_CHECK_MESSAGE(!sched[12].rft_config().plt("I"), R"(Should NOT Output PLT Data for "I" at Step 12)");
BOOST_CHECK_MESSAGE( sched[13].rft_config().plt("I"), R"(Should Output PLT Data for "I" at Step 13)");
BOOST_CHECK_MESSAGE(!sched[14].rft_config().plt("I"), R"(Should NOT Output PLT Data for "I" at Step 14)");
BOOST_CHECK_MESSAGE(!sched[15].rft_config().plt("I"), R"(Should NOT Output PLT Data for "I" at Step 15)");
BOOST_CHECK_MESSAGE(!sched[16].rft_config().plt("I"), R"(Should NOT Output PLT Data for "I" at Step 16)");
BOOST_CHECK_MESSAGE(!sched[17].rft_config().plt("I"), R"(Should NOT Output PLT Data for "I" at Step 17)");
BOOST_CHECK_MESSAGE(!sched[18].rft_config().plt("I"), R"(Should NOT Output PLT Data for "I" at Step 18)");
BOOST_CHECK_MESSAGE(!sched[19].rft_config().plt("I"), R"(Should NOT Output PLT Data for "I" at Step 19)");
BOOST_CHECK_MESSAGE(!sched[20].rft_config().plt("I"), R"(Should NOT Output PLT Data for "I" at Step 20)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P2", 0), R"(Should NOT Output RFT Data for "P2" at Step 0)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P2", 1), R"(Should NOT Output RFT Data for "P2" at Step 1)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P2", 2), R"(Should NOT Output RFT Data for "P2" at Step 2)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P2", 3), R"(Should NOT Output RFT Data for "P2" at Step 3)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P2", 4), R"(Should NOT Output RFT Data for "P2" at Step 4)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P2", 5), R"(Should NOT Output RFT Data for "P2" at Step 5)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P2", 6), R"(Should NOT Output RFT Data for "P2" at Step 6)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P2", 7), R"(Should NOT Output RFT Data for "P2" at Step 7)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P2", 8), R"(Should NOT Output RFT Data for "P2" at Step 8)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P2", 9), R"(Should NOT Output RFT Data for "P2" at Step 9)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P2", 10), R"(Should NOT Output RFT Data for "P2" at Step 10)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P2", 11), R"(Should NOT Output RFT Data for "P2" at Step 11)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P2", 12), R"(Should NOT Output RFT Data for "P2" at Step 12)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P2", 13), R"(Should NOT Output RFT Data for "P2" at Step 13)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P2", 14), R"(Should NOT Output RFT Data for "P2" at Step 14)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P2", 15), R"(Should NOT Output RFT Data for "P2" at Step 15)");
BOOST_CHECK_MESSAGE(!sched[ 0].rft_config().rft("P2"), R"(Should NOT Output RFT Data for "P2" at Step 0)");
BOOST_CHECK_MESSAGE(!sched[ 1].rft_config().rft("P2"), R"(Should NOT Output RFT Data for "P2" at Step 1)");
BOOST_CHECK_MESSAGE(!sched[ 2].rft_config().rft("P2"), R"(Should NOT Output RFT Data for "P2" at Step 2)");
BOOST_CHECK_MESSAGE(!sched[ 3].rft_config().rft("P2"), R"(Should NOT Output RFT Data for "P2" at Step 3)");
BOOST_CHECK_MESSAGE(!sched[ 4].rft_config().rft("P2"), R"(Should NOT Output RFT Data for "P2" at Step 4)");
BOOST_CHECK_MESSAGE(!sched[ 5].rft_config().rft("P2"), R"(Should NOT Output RFT Data for "P2" at Step 5)");
BOOST_CHECK_MESSAGE(!sched[ 6].rft_config().rft("P2"), R"(Should NOT Output RFT Data for "P2" at Step 6)");
BOOST_CHECK_MESSAGE(!sched[ 7].rft_config().rft("P2"), R"(Should NOT Output RFT Data for "P2" at Step 7)");
BOOST_CHECK_MESSAGE(!sched[ 8].rft_config().rft("P2"), R"(Should NOT Output RFT Data for "P2" at Step 8)");
BOOST_CHECK_MESSAGE(!sched[ 9].rft_config().rft("P2"), R"(Should NOT Output RFT Data for "P2" at Step 9)");
BOOST_CHECK_MESSAGE(!sched[10].rft_config().rft("P2"), R"(Should NOT Output RFT Data for "P2" at Step 10)");
BOOST_CHECK_MESSAGE(!sched[11].rft_config().rft("P2"), R"(Should NOT Output RFT Data for "P2" at Step 11)");
BOOST_CHECK_MESSAGE(!sched[12].rft_config().rft("P2"), R"(Should NOT Output RFT Data for "P2" at Step 12)");
BOOST_CHECK_MESSAGE(!sched[13].rft_config().rft("P2"), R"(Should NOT Output RFT Data for "P2" at Step 13)");
BOOST_CHECK_MESSAGE(!sched[14].rft_config().rft("P2"), R"(Should NOT Output RFT Data for "P2" at Step 14)");
BOOST_CHECK_MESSAGE(!sched[15].rft_config().rft("P2"), R"(Should NOT Output RFT Data for "P2" at Step 15)");
// NOTE: Not at FOPN because P2 was not declared at WRFTPLT:FOPN time.
BOOST_CHECK_MESSAGE(!rftcfg.rft("P2", 16), R"(Should NOT Output RFT Data for "P2" at Step 16)");
// NOTE: Not at FOPN becaus17e P2 was not declared at WRFTPLT:FOPN time.
BOOST_CHECK_MESSAGE(!sched[16].rft_config().rft("P2"), R"(Should NOT Output RFT Data for "P2" at Step 16)");
BOOST_CHECK_MESSAGE(!rftcfg.rft("P2", 17), R"(Should NOT Output RFT Data for "P2" at Step 17)");
BOOST_CHECK_MESSAGE( rftcfg.rft("P2", 18), R"(Should Output RFT Data for "P2" at Step 18)");
BOOST_CHECK_MESSAGE( rftcfg.rft("P2", 19), R"(Should Output RFT Data for "P2" at Step 19)");
BOOST_CHECK_MESSAGE( rftcfg.rft("P2", 20), R"(Should Output RFT Data for "P2" at Step 20)");
BOOST_CHECK_MESSAGE(!sched[17].rft_config().rft("P2"), R"(Should NOT Output RFT Data for "P2" at Step 17)");
BOOST_CHECK_MESSAGE( sched[18].rft_config().rft("P2"), R"(Should Output RFT Data for "P2" at Step 18)");
BOOST_CHECK_MESSAGE( sched[19].rft_config().rft("P2"), R"(Should Output RFT Data for "P2" at Step 19)");
BOOST_CHECK_MESSAGE( sched[20].rft_config().rft("P2"), R"(Should Output RFT Data for "P2" at Step 20)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P2", 0), R"(Should NOT Output PLT Data for "P2" at Step 0)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P2", 1), R"(Should NOT Output PLT Data for "P2" at Step 1)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P2", 2), R"(Should NOT Output PLT Data for "P2" at Step 2)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P2", 3), R"(Should NOT Output PLT Data for "P2" at Step 3)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P2", 4), R"(Should NOT Output PLT Data for "P2" at Step 4)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P2", 5), R"(Should NOT Output PLT Data for "P2" at Step 5)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P2", 6), R"(Should NOT Output PLT Data for "P2" at Step 6)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P2", 7), R"(Should NOT Output PLT Data for "P2" at Step 7)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P2", 8), R"(Should NOT Output PLT Data for "P2" at Step 8)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P2", 9), R"(Should NOT Output PLT Data for "P2" at Step 9)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P2", 10), R"(Should NOT Output PLT Data for "P2" at Step 10)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P2", 11), R"(Should NOT Output PLT Data for "P2" at Step 11)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P2", 12), R"(Should NOT Output PLT Data for "P2" at Step 12)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P2", 13), R"(Should NOT Output PLT Data for "P2" at Step 13)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P2", 14), R"(Should NOT Output PLT Data for "P2" at Step 14)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P2", 15), R"(Should NOT Output PLT Data for "P2" at Step 15)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P2", 16), R"(Should NOT Output PLT Data for "P2" at Step 16)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P2", 17), R"(Should NOT Output PLT Data for "P2" at Step 17)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P2", 18), R"(Should NOT Output PLT Data for "P2" at Step 18)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P2", 19), R"(Should NOT Output PLT Data for "P2" at Step 19)");
BOOST_CHECK_MESSAGE(!rftcfg.plt("P2", 20), R"(Should NOT Output PLT Data for "P2" at Step 20)");
BOOST_CHECK_MESSAGE(!sched[ 0].rft_config().plt("P2"), R"(Should NOT Output PLT Data for "P2" at Step 0)");
BOOST_CHECK_MESSAGE(!sched[ 1].rft_config().plt("P2"), R"(Should NOT Output PLT Data for "P2" at Step 1)");
BOOST_CHECK_MESSAGE(!sched[ 2].rft_config().plt("P2"), R"(Should NOT Output PLT Data for "P2" at Step 2)");
BOOST_CHECK_MESSAGE(!sched[ 3].rft_config().plt("P2"), R"(Should NOT Output PLT Data for "P2" at Step 3)");
BOOST_CHECK_MESSAGE(!sched[ 4].rft_config().plt("P2"), R"(Should NOT Output PLT Data for "P2" at Step 4)");
BOOST_CHECK_MESSAGE(!sched[ 5].rft_config().plt("P2"), R"(Should NOT Output PLT Data for "P2" at Step 5)");
BOOST_CHECK_MESSAGE(!sched[ 6].rft_config().plt("P2"), R"(Should NOT Output PLT Data for "P2" at Step 6)");
BOOST_CHECK_MESSAGE(!sched[ 7].rft_config().plt("P2"), R"(Should NOT Output PLT Data for "P2" at Step 7)");
BOOST_CHECK_MESSAGE(!sched[ 8].rft_config().plt("P2"), R"(Should NOT Output PLT Data for "P2" at Step 8)");
BOOST_CHECK_MESSAGE(!sched[ 9].rft_config().plt("P2"), R"(Should NOT Output PLT Data for "P2" at Step 9)");
BOOST_CHECK_MESSAGE(!sched[10].rft_config().plt("P2"), R"(Should NOT Output PLT Data for "P2" at Step 10)");
BOOST_CHECK_MESSAGE(!sched[11].rft_config().plt("P2"), R"(Should NOT Output PLT Data for "P2" at Step 11)");
BOOST_CHECK_MESSAGE(!sched[12].rft_config().plt("P2"), R"(Should NOT Output PLT Data for "P2" at Step 12)");
BOOST_CHECK_MESSAGE(!sched[13].rft_config().plt("P2"), R"(Should NOT Output PLT Data for "P2" at Step 13)");
BOOST_CHECK_MESSAGE(!sched[14].rft_config().plt("P2"), R"(Should NOT Output PLT Data for "P2" at Step 14)");
BOOST_CHECK_MESSAGE(!sched[15].rft_config().plt("P2"), R"(Should NOT Output PLT Data for "P2" at Step 15)");
BOOST_CHECK_MESSAGE(!sched[16].rft_config().plt("P2"), R"(Should NOT Output PLT Data for "P2" at Step 16)");
BOOST_CHECK_MESSAGE(!sched[17].rft_config().plt("P2"), R"(Should NOT Output PLT Data for "P2" at Step 17)");
BOOST_CHECK_MESSAGE(!sched[18].rft_config().plt("P2"), R"(Should NOT Output PLT Data for "P2" at Step 18)");
BOOST_CHECK_MESSAGE(!sched[19].rft_config().plt("P2"), R"(Should NOT Output PLT Data for "P2" at Step 19)");
BOOST_CHECK_MESSAGE(!sched[20].rft_config().plt("P2"), R"(Should NOT Output PLT Data for "P2" at Step 20)");
BOOST_CHECK_MESSAGE(!rftcfg.active( 0), R"(RFT Config must be Inactive at Step 0)");
BOOST_CHECK_MESSAGE(!rftcfg.active( 1), R"(RFT Config must be Inactive at Step 1)");
BOOST_CHECK_MESSAGE(!rftcfg.active( 2), R"(RFT Config must be Inactive at Step 2)");
BOOST_CHECK_MESSAGE(!rftcfg.active( 3), R"(RFT Config must be Inactive at Step 3)");
BOOST_CHECK_MESSAGE( rftcfg.active( 4), R"(RFT Config must be Active at Step 4)");
BOOST_CHECK_MESSAGE(!rftcfg.active( 5), R"(RFT Config must be Inactive at Step 5)");
BOOST_CHECK_MESSAGE(!rftcfg.active( 6), R"(RFT Config must be Inactive at Step 6)");
BOOST_CHECK_MESSAGE( rftcfg.active( 7), R"(RFT Config must be Active at Step 7)");
BOOST_CHECK_MESSAGE(!rftcfg.active( 8), R"(RFT Config must be Inactive at Step 8)");
BOOST_CHECK_MESSAGE(!rftcfg.active( 9), R"(RFT Config must be Inactive at Step 9)");
BOOST_CHECK_MESSAGE( rftcfg.active(10), R"(RFT Config must be Active at Step 10)");
BOOST_CHECK_MESSAGE( rftcfg.active(11), R"(RFT Config must be Active at Step 11)");
BOOST_CHECK_MESSAGE( rftcfg.active(12), R"(RFT Config must be Active at Step 12)");
BOOST_CHECK_MESSAGE( rftcfg.active(13), R"(RFT Config must be Active at Step 13)");
BOOST_CHECK_MESSAGE(!rftcfg.active(14), R"(RFT Config must be Inactive at Step 14)");
BOOST_CHECK_MESSAGE(!rftcfg.active(15), R"(RFT Config must be Inactive at Step 15)");
BOOST_CHECK_MESSAGE(!rftcfg.active(16), R"(RFT Config must be Inactive at Step 15)");
BOOST_CHECK_MESSAGE(!rftcfg.active(17), R"(RFT Config must be Inactive at Step 15)");
BOOST_CHECK_MESSAGE( rftcfg.active(18), R"(RFT Config must be Active at Step 15)");
BOOST_CHECK_MESSAGE( rftcfg.active(19), R"(RFT Config must be Active at Step 15)");
BOOST_CHECK_MESSAGE( rftcfg.active(20), R"(RFT Config must be Active at Step 15)");
BOOST_CHECK_MESSAGE(!sched[ 0].rft_config().active(), R"(RFT Config must be Inactive at Step 0)");
BOOST_CHECK_MESSAGE(!sched[ 1].rft_config().active(), R"(RFT Config must be Inactive at Step 1)");
BOOST_CHECK_MESSAGE(!sched[ 2].rft_config().active(), R"(RFT Config must be Inactive at Step 2)");
BOOST_CHECK_MESSAGE(!sched[ 3].rft_config().active(), R"(RFT Config must be Inactive at Step 3)");
BOOST_CHECK_MESSAGE( sched[ 4].rft_config().active(), R"(RFT Config must be Active at Step 4)");
BOOST_CHECK_MESSAGE(!sched[ 5].rft_config().active(), R"(RFT Config must be Inactive at Step 5)");
BOOST_CHECK_MESSAGE(!sched[ 6].rft_config().active(), R"(RFT Config must be Inactive at Step 6)");
BOOST_CHECK_MESSAGE( sched[ 7].rft_config().active(), R"(RFT Config must be Active at Step 7)");
BOOST_CHECK_MESSAGE(!sched[ 8].rft_config().active(), R"(RFT Config must be Inactive at Step 8)");
BOOST_CHECK_MESSAGE(!sched[ 9].rft_config().active(), R"(RFT Config must be Inactive at Step 9)");
BOOST_CHECK_MESSAGE( sched[10].rft_config().active(), R"(RFT Config must be Active at Step 10)");
BOOST_CHECK_MESSAGE( sched[11].rft_config().active(), R"(RFT Config must be Active at Step 11)");
BOOST_CHECK_MESSAGE( sched[12].rft_config().active(), R"(RFT Config must be Active at Step 12)");
BOOST_CHECK_MESSAGE( sched[13].rft_config().active(), R"(RFT Config must be Active at Step 13)");
BOOST_CHECK_MESSAGE(!sched[14].rft_config().active(), R"(RFT Config must be Inactive at Step 14)");
BOOST_CHECK_MESSAGE(!sched[15].rft_config().active(), R"(RFT Config must be Inactive at Step 15)");
BOOST_CHECK_MESSAGE(!sched[16].rft_config().active(), R"(RFT Config must be Inactive at Step 15)");
BOOST_CHECK_MESSAGE(!sched[17].rft_config().active(), R"(RFT Config must be Inactive at Step 15)");
BOOST_CHECK_MESSAGE( sched[18].rft_config().active(), R"(RFT Config must be Active at Step 15)");
BOOST_CHECK_MESSAGE( sched[19].rft_config().active(), R"(RFT Config must be Active at Step 15)");
BOOST_CHECK_MESSAGE( sched[20].rft_config().active(), R"(RFT Config must be Active at Step 15)");
}
BOOST_AUTO_TEST_SUITE_END() // WRFTPLT

View File

@@ -27,7 +27,6 @@
#include <opm/parser/eclipse/EclipseState/Grid/EclipseGrid.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/Schedule.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/TimeMap.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/RFTConfig.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/OilVaporizationProperties.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/Well/WellConnections.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/Well/Well.hpp>

View File

@@ -32,7 +32,6 @@
#include <opm/parser/eclipse/EclipseState/Schedule/Schedule.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/ScheduleState.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/TimeMap.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/RFTConfig.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/OilVaporizationProperties.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/Well/WellConnections.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/Well/Well.hpp>

View File

@@ -36,7 +36,6 @@
#include <opm/parser/eclipse/EclipseState/Runspec.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/Schedule.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/TimeMap.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/RFTConfig.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/OilVaporizationProperties.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/Well/WellConnections.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/Well/Well.hpp>
@@ -341,48 +340,7 @@ COMPDAT // with defaulted I and J
return input;
}
static std::string createDeckRFTConfig() {
return R"(RUNSPEC
START -- 0
1 NOV 1979 /
SCHEDULE
DATES -- 1 (sim step = 0)
1 DES 1979/
/
WELSPECS
'OP_1' 'OP' 9 9 1* 'OIL' 1* 1* 1* 1* 1* 1* 1* /
'OP_2' 'OP' 8 8 1* 'OIL' 1* 1* 1* 1* 1* 1* 1* /
'OP_3' 'OP' 7 7 1* 'OIL' 1* 1* 1* 1* 1* 1* 1* /
/
COMPDAT
'OP_1' 9 9 1 1 'OPEN' 1* 32.948 0.311 3047.839 1* 1* 'X' 22.100 /
'OP_1' 9 9 2 2 'OPEN' 1* 46.825 0.311 4332.346 1* 1* 'X' 22.123 /
'OP_2' 8 8 1 3 'OPEN' 1* 1.168 0.311 107.872 1* 1* 'Y' 21.925 /
'OP_2' 8 7 3 3 'OPEN' 1* 15.071 0.311 1391.859 1* 1* 'Y' 21.920 /
'OP_2' 8 7 3 6 'OPEN' 1* 6.242 0.311 576.458 1* 1* 'Y' 21.915 /
'OP_3' 7 7 1 1 'OPEN' 1* 27.412 0.311 2445.337 1* 1* 'Y' 18.521 /
'OP_3' 7 7 2 2 'OPEN' 1* 55.195 0.311 4923.842 1* 1* 'Y' 18.524 /
/
WELOPEN
'OP_2' 'OPEN' /
/
DATES -- 2 (sim step = 1)
10 JUL 2007 /
/
WRFTPLT
'OP_2' 'YES' 'NO' 'NO' /
/
DATES -- 3 (sim step = 2)
10 AUG 2007 /
/
COMPDAT
-- with defaulted I and J
'OP_1' 0 * 3 9 'OPEN' 1* 32.948 0.311 3047.839 1* 1* 'X' 22.100 /
/
END
)";
}
bool has_name(const std::vector<std::string>& names, const std::string& name) {
auto find_iter = std::find(names.begin(), names.end(), name);
@@ -837,108 +795,8 @@ DATES -- 6
BOOST_CHECK(Well::Status::SHUT == well_5.getStatus());
}
BOOST_AUTO_TEST_CASE(CreateScheduleDeckWithWRFT) {
Opm::Parser parser;
std::string input = R"(
START -- 0
1 NOV 1979 /
SCHEDULE
DATES -- 1
1 DES 1979/
/
WELSPECS
'OP_1' 'OP' 9 9 1* 'OIL' 1* 1* 1* 1* 1* 1* 1* /
'OP_2' 'OP' 4 4 1* 'OIL' 1* 1* 1* 1* 1* 1* 1* /
/
COMPDAT
'OP_1' 9 9 1 1 'OPEN' 1* 32.948 0.311 3047.839 1* 1* 'X' 22.100 /
'OP_1' 9 9 2 2 'OPEN' 1* 46.825 0.311 4332.346 1* 1* 'X' 22.123 /
'OP_1' 9 9 3 9 'OPEN' 1* 32.948 0.311 3047.839 1* 1* 'X' 22.100 /
'OP_2' 4 4 4 9 'OPEN' 1* 32.948 0.311 3047.839 1* 1* 'X' 22.100 /
/
DATES -- 2
10 OKT 2008 /
/
WRFT
/
WELOPEN
'OP_1' OPEN /
/
DATES -- 3
10 NOV 2008 /
/
WELOPEN
'OP_2' OPEN /
/
DATES -- 4
30 NOV 2008 /
/
)";
const auto& schedule = make_schedule(input);
const auto& rft_config = schedule.rftConfig();
BOOST_CHECK_EQUAL(2U, rft_config.firstRFTOutput());
BOOST_CHECK_EQUAL(true, rft_config.rft("OP_1", 2));
BOOST_CHECK_EQUAL(true, rft_config.rft("OP_2", 3));
}
BOOST_AUTO_TEST_CASE(CreateScheduleDeckWithWRFTPLT) {
Opm::Parser parser;
std::string input = R"(
START -- 0
1 NOV 1979 /
SCHEDULE
DATES -- 1
1 DES 1979/
/
WELSPECS
'OP_1' 'OP' 9 9 1* 'OIL' 1* 1* 1* 1* 1* 1* 1* /
/
COMPDAT
'OP_1' 9 9 1 1 'OPEN' 1* 32.948 0.311 3047.839 1* 1* 'X' 22.100 /
'OP_1' 9 9 2 2 'OPEN' 1* 46.825 0.311 4332.346 1* 1* 'X' 22.123 /
'OP_1' 9 9 3 9 'OPEN' 1* 32.948 0.311 3047.839 1* 1* 'X' 22.100 /
/
WELOPEN
'OP_1' SHUT /
/
DATES -- 2
10 OKT 2006 /
/
WELOPEN
'OP_1' SHUT /
/
WRFTPLT
'OP_1' FOPN /
/
DATES -- 3
10 OKT 2007 /
/
WELOPEN
'OP_1' OPEN 0 0 0 0 0 /
/
DATES -- 4
10 OKT 2008 /
/
WELOPEN
'OP_1' OPEN /
/
DATES -- 5
10 NOV 2008 /
/
)";
const auto& schedule = make_schedule(input);
const auto& well = schedule.getWell("OP_1", 4);
BOOST_CHECK(Well::Status::OPEN == well.getStatus());
const auto& rft_config = schedule.rftConfig();
BOOST_CHECK_EQUAL(rft_config.rft("OP_1", 3),false);
BOOST_CHECK_EQUAL(rft_config.rft("OP_1", 4),true);
BOOST_CHECK_EQUAL(rft_config.rft("OP_1", 5),false);
}
BOOST_AUTO_TEST_CASE(createDeckWithWeltArg) {
std::string input = R"(
@@ -3420,60 +3278,6 @@ BOOST_AUTO_TEST_CASE(GroupOrderTest) {
}
BOOST_AUTO_TEST_CASE(RFT_CONFIG) {
std::vector<std::time_t> tp = { asTimeT( TimeStampUTC(2010, 1, 1)),
asTimeT( TimeStampUTC(2010, 1, 2)),
asTimeT( TimeStampUTC(2010, 1, 3)),
asTimeT( TimeStampUTC(2010, 1, 4)),
asTimeT( TimeStampUTC(2010, 1, 5)),
asTimeT( TimeStampUTC(2010, 1, 6))};
TimeMap tm(tp);
RFTConfig conf(tm);
BOOST_CHECK_THROW( conf.rft("W1", 100), std::invalid_argument);
BOOST_CHECK_THROW( conf.plt("W1", 100), std::invalid_argument);
BOOST_CHECK(!conf.rft("W1", 2));
BOOST_CHECK(!conf.plt("W1", 2));
conf.setWellOpenRFT(2);
BOOST_CHECK(!conf.getWellOpenRFT("W1", 0));
conf.updateRFT("W1", 2, RFTConfig::RFT::YES);
BOOST_CHECK(conf.rft("W1", 2));
BOOST_CHECK(!conf.rft("W1", 1));
BOOST_CHECK(!conf.rft("W1", 3));
conf.updateRFT("W2", 2, RFTConfig::RFT::REPT);
conf.updateRFT("W2", 4, RFTConfig::RFT::NO);
BOOST_CHECK(!conf.rft("W2", 1));
BOOST_CHECK( conf.rft("W2", 2));
BOOST_CHECK( conf.rft("W2", 3));
BOOST_CHECK(!conf.rft("W2", 4));
conf.setWellOpenRFT("W3");
BOOST_CHECK(conf.getWellOpenRFT("W3", 2));
conf.updateRFT("W4", 2, RFTConfig::RFT::FOPN);
BOOST_CHECK(conf.getWellOpenRFT("W4", 2));
conf.addWellOpen("W10", 2);
conf.addWellOpen("W100", 3);
}
BOOST_AUTO_TEST_CASE(RFT_CONFIG2) {
const auto& schedule = make_schedule(createDeckRFTConfig());
const auto& rft_config = schedule.rftConfig();
BOOST_CHECK_EQUAL(2U, rft_config.firstRFTOutput());
}
BOOST_AUTO_TEST_CASE(nupcol) {

View File

@@ -154,14 +154,6 @@ BOOST_AUTO_TEST_CASE(WellTesting) {
BOOST_CHECK( Well::Status::SHUT == sched.getWell("W_2", 3).getStatus());
{
const auto& rft_config = sched.rftConfig();
BOOST_CHECK( !rft_config.rft("W_2", 2));
BOOST_CHECK( rft_config.rft("W_2", 3));
BOOST_CHECK( rft_config.rft("W_2", 4));
BOOST_CHECK( !rft_config.rft("W_2", 5));
BOOST_CHECK( rft_config.rft("W_1", 3));
}
{
const auto & prop3 = sched.getWell("W_2", 3).getProductionProperties();
BOOST_CHECK( Well::ProducerCMode::ORAT == prop3.controlMode);