Files
ResInsight/ApplicationLibCode/ProjectDataModelCommands/RimcWellEventTimeline.h
T
Kristian Bendiksen 8324af966c #14666 Simulator Events: Expand INSERT_DATE into insert-date events
INSERT_DATE statements are now expanded into one timeline event per
occurrence instead of a list of bare dates, so each generated date keeps
the COMMENT of its statement.

- New RimWellEventInsertDate (EventType::INSERT_DATE): a date-only event
  that generates no keyword, added with
  WellEventTimeline.add_insert_date_event(event_date, comment).
- The schedule generator writes the comment of an insert-date event as
  "--" lines directly below its DATES keyword.
- generate_schedule(_text) no longer takes additional_dates; insert-date
  events are part of the timeline, but keep the previous behavior of not
  being filtered by set_timestamp().
- SimulatorEventsDocument.report_dates and ApplyReport.report_dates are
  replaced by SimulatorEventsDocument.insert_date_events/insert_dates;
  merging files drops insert dates repeating both date and comment.
2026-09-25 14:35:45 +02:00

299 lines
12 KiB
C++

/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2025- Equinor ASA
//
// ResInsight is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.
//
// See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
#pragma once
#include "RimKeywordEvent.h"
#include "RimWellEventControl.h"
#include "RimWellEventInsertDate.h"
#include "RimWellEventPerf.h"
#include "RimWellEventRawText.h"
#include "RimWellEventState.h"
#include "RimWellEventTimeline.h"
#include "RimWellEventValve.h"
#include "RimWellEventWellSpec.h"
#include "cafAppEnum.h"
#include "cafPdmField.h"
#include "cafPdmObjectMethod.h"
#include "cafPdmPtrArrayField.h"
#include "cafPdmPtrField.h"
#include <QString>
class RimEclipseCase;
class RimWellPath;
//==================================================================================================
///
//==================================================================================================
class RimcWellEventTimeline_addPerfEvent : public caf::PdmObjectCreationMethod
{
CAF_PDM_HEADER_INIT;
public:
RimcWellEventTimeline_addPerfEvent( caf::PdmObjectHandle* self );
std::expected<caf::PdmObjectHandle*, QString> execute() override;
QString classKeywordReturnedType() const override;
private:
caf::PdmField<QString> m_eventDate;
caf::PdmPtrField<RimWellPath*> m_wellPath;
caf::PdmField<double> m_startMd;
caf::PdmField<double> m_endMd;
caf::PdmField<double> m_diameter;
caf::PdmField<double> m_skinFactor;
caf::PdmField<caf::AppEnum<RimWellEventPerf::State>> m_state;
caf::PdmField<int> m_completionNumber;
};
//==================================================================================================
///
//==================================================================================================
class RimcWellEventTimeline_addValveEvent : public caf::PdmObjectCreationMethod
{
CAF_PDM_HEADER_INIT;
public:
RimcWellEventTimeline_addValveEvent( caf::PdmObjectHandle* self );
std::expected<caf::PdmObjectHandle*, QString> execute() override;
QString classKeywordReturnedType() const override;
private:
caf::PdmField<QString> m_eventDate;
caf::PdmPtrField<RimWellPath*> m_wellPath;
caf::PdmField<double> m_measuredDepth;
caf::PdmField<caf::AppEnum<RimWellEventValve::ValveType>> m_valveType;
caf::PdmField<caf::AppEnum<RimWellEventValve::State>> m_state;
caf::PdmField<double> m_flowCoefficient;
caf::PdmField<double> m_area;
caf::PdmField<double> m_aicdStrength;
caf::PdmField<double> m_aicdDensityCalibFluid;
caf::PdmField<double> m_aicdViscosityCalibFluid;
caf::PdmField<double> m_aicdVolFlowExp;
caf::PdmField<double> m_aicdViscFuncExp;
};
//==================================================================================================
///
//==================================================================================================
class RimcWellEventTimeline_addStateEvent : public caf::PdmObjectCreationMethod
{
CAF_PDM_HEADER_INIT;
public:
RimcWellEventTimeline_addStateEvent( caf::PdmObjectHandle* self );
std::expected<caf::PdmObjectHandle*, QString> execute() override;
QString classKeywordReturnedType() const override;
private:
caf::PdmField<QString> m_eventDate;
caf::PdmPtrField<RimWellPath*> m_wellPath;
caf::PdmField<caf::AppEnum<RimWellEventState::WellState>> m_wellState;
};
//==================================================================================================
///
//==================================================================================================
class RimcWellEventTimeline_addControlEvent : public caf::PdmObjectCreationMethod
{
CAF_PDM_HEADER_INIT;
public:
RimcWellEventTimeline_addControlEvent( caf::PdmObjectHandle* self );
std::expected<caf::PdmObjectHandle*, QString> execute() override;
QString classKeywordReturnedType() const override;
private:
caf::PdmField<QString> m_eventDate;
caf::PdmPtrField<RimWellPath*> m_wellPath;
caf::PdmField<caf::AppEnum<RimWellEventControl::ControlMode>> m_controlMode;
caf::PdmField<double> m_controlValue;
caf::PdmField<double> m_bhpLimit;
caf::PdmField<double> m_oilRate;
caf::PdmField<double> m_waterRate;
caf::PdmField<double> m_gasRate;
caf::PdmField<bool> m_isProducer;
};
//==================================================================================================
///
//==================================================================================================
class RimcWellEventTimeline_addTubingEvent : public caf::PdmObjectCreationMethod
{
CAF_PDM_HEADER_INIT;
public:
RimcWellEventTimeline_addTubingEvent( caf::PdmObjectHandle* self );
std::expected<caf::PdmObjectHandle*, QString> execute() override;
QString classKeywordReturnedType() const override;
private:
caf::PdmField<QString> m_eventDate;
caf::PdmPtrField<RimWellPath*> m_wellPath;
caf::PdmField<double> m_startMd;
caf::PdmField<double> m_endMd;
caf::PdmField<double> m_innerDiameter;
caf::PdmField<double> m_roughness;
};
//==================================================================================================
///
//==================================================================================================
class RimcWellEventTimeline_addWellSpecEvent : public caf::PdmObjectCreationMethod
{
CAF_PDM_HEADER_INIT;
public:
RimcWellEventTimeline_addWellSpecEvent( caf::PdmObjectHandle* self );
std::expected<caf::PdmObjectHandle*, QString> execute() override;
QString classKeywordReturnedType() const override;
private:
caf::PdmField<QString> m_eventDate;
caf::PdmPtrField<RimWellPath*> m_wellPath;
caf::PdmField<QString> m_groupName;
caf::PdmField<bool> m_allowCrossFlow;
caf::PdmField<std::optional<double>> m_referenceDepth;
caf::PdmField<caf::AppEnum<RimWellPathCompletionSettings::WellType>> m_wellType;
};
//==================================================================================================
///
//==================================================================================================
class RimcWellEventTimeline_addWellKeywordEvent : public caf::PdmObjectCreationMethod
{
CAF_PDM_HEADER_INIT;
public:
RimcWellEventTimeline_addWellKeywordEvent( caf::PdmObjectHandle* self );
std::expected<caf::PdmObjectHandle*, QString> execute() override;
QString classKeywordReturnedType() const override;
private:
caf::PdmField<QString> m_eventDate;
caf::PdmPtrField<RimWellPath*> m_wellPath;
caf::PdmField<QString> m_keywordName;
caf::PdmField<std::vector<QString>> m_itemNames;
caf::PdmField<std::vector<QString>> m_itemTypes;
caf::PdmField<std::vector<QString>> m_itemValues;
};
//==================================================================================================
///
//==================================================================================================
class RimcWellEventTimeline_addKeywordEvent : public caf::PdmObjectCreationMethod
{
CAF_PDM_HEADER_INIT;
public:
RimcWellEventTimeline_addKeywordEvent( caf::PdmObjectHandle* self );
std::expected<caf::PdmObjectHandle*, QString> execute() override;
QString classKeywordReturnedType() const override;
private:
caf::PdmField<QString> m_eventDate;
caf::PdmField<QString> m_keywordName;
caf::PdmField<std::vector<QString>> m_itemNames;
caf::PdmField<std::vector<QString>> m_itemTypes;
caf::PdmField<std::vector<QString>> m_itemValues;
};
//==================================================================================================
///
//==================================================================================================
class RimcWellEventTimeline_addRawTextEvent : public caf::PdmObjectCreationMethod
{
CAF_PDM_HEADER_INIT;
public:
RimcWellEventTimeline_addRawTextEvent( caf::PdmObjectHandle* self );
std::expected<caf::PdmObjectHandle*, QString> execute() override;
QString classKeywordReturnedType() const override;
private:
caf::PdmField<QString> m_eventDate;
caf::PdmField<QString> m_text;
caf::PdmField<caf::AppEnum<RimWellEventRawText::Placement>> m_placement;
caf::PdmField<QString> m_anchorKeyword;
caf::PdmField<int> m_priority;
};
//==================================================================================================
///
//==================================================================================================
class RimcWellEventTimeline_addInsertDateEvent : public caf::PdmObjectCreationMethod
{
CAF_PDM_HEADER_INIT;
public:
RimcWellEventTimeline_addInsertDateEvent( caf::PdmObjectHandle* self );
std::expected<caf::PdmObjectHandle*, QString> execute() override;
QString classKeywordReturnedType() const override;
private:
caf::PdmField<QString> m_eventDate;
caf::PdmField<QString> m_comment;
};
//==================================================================================================
///
//==================================================================================================
class RimcWellEventTimeline_setTimestamp : public caf::PdmVoidObjectMethod
{
CAF_PDM_HEADER_INIT;
public:
RimcWellEventTimeline_setTimestamp( caf::PdmObjectHandle* self );
std::expected<caf::PdmObjectHandle*, QString> execute() override;
private:
caf::PdmField<QString> m_timestamp;
};
//==================================================================================================
///
//==================================================================================================
class RimcWellEventTimeline_generateSchedule : public caf::PdmObjectMethod
{
CAF_PDM_HEADER_INIT;
public:
RimcWellEventTimeline_generateSchedule( caf::PdmObjectHandle* self );
std::expected<caf::PdmObjectHandle*, QString> execute() override;
QString classKeywordReturnedType() const override;
private:
caf::PdmPtrField<RimEclipseCase*> m_eclipseCase;
caf::PdmPtrArrayField<RimWellPath*> m_exportMswForWells;
caf::PdmField<bool> m_firstDateAsComment;
caf::PdmField<bool> m_alignColumns;
};