22#include <opm/common/utility/OpmInputError.hpp>
24#include <opm/input/eclipse/EclipseState/Grid/Box.hpp>
25#include <opm/input/eclipse/EclipseState/Grid/FieldData.hpp>
26#include <opm/input/eclipse/EclipseState/Grid/Keywords.hpp>
27#include <opm/input/eclipse/EclipseState/Grid/SatfuncPropertyInitializers.hpp>
28#include <opm/input/eclipse/EclipseState/Grid/TranCalculator.hpp>
29#include <opm/input/eclipse/EclipseState/Runspec.hpp>
30#include <opm/input/eclipse/EclipseState/Util/OrderedMap.hpp>
31#include <opm/input/eclipse/EclipseState/Tables/TableManager.hpp>
33#include <opm/input/eclipse/Units/UnitSystem.hpp>
35#include <opm/input/eclipse/Deck/DeckSection.hpp>
36#include <opm/input/eclipse/Deck/value_status.hpp>
48#include <unordered_map>
49#include <unordered_set>
57class NumericalAquifers;
106inline bool isFipxxx(
const std::string& keyword) {
109 if (keyword.size() < 4 || keyword ==
"FIPOWG") {
112 return keyword[0] ==
'F' && keyword[1] ==
'I' && keyword[2] ==
'P';
131 static const std::unordered_map<std::string, std::string> aliased_keywords = {{
"PERMR",
"PERMX"},
132 {
"PERMTHT",
"PERMY"}};
137static const std::unordered_map<std::string, keyword_info<double>> double_keywords = {{
"DISPERC",keyword_info<double>{}.unit_string(
"Length")},
138 {
"MINPVV", keyword_info<double>{}.init(0.0).unit_string(
"ReservoirVolume").global_kw(
true)},
139 {
"MULTPV", keyword_info<double>{}.init(1.0).mult(
true)},
140 {
"NTG", keyword_info<double>{}.init(1.0)},
141 {
"PORO", keyword_info<double>{}.distribute_top(
true)},
142 {
"PERMX", keyword_info<double>{}.unit_string(
"Permeability").distribute_top(
true).global_kw_until_edit()},
143 {
"PERMY", keyword_info<double>{}.unit_string(
"Permeability").distribute_top(
true).global_kw_until_edit()},
144 {
"PERMZ", keyword_info<double>{}.unit_string(
"Permeability").distribute_top(
true).global_kw_until_edit()},
145 {
"PERMR", keyword_info<double>{}.unit_string(
"Permeability").distribute_top(
true).global_kw_until_edit()},
146 {
"PERMTHT", keyword_info<double>{}.unit_string(
"Permeability").distribute_top(
true).global_kw_until_edit()},
147 {
"TEMPI", keyword_info<double>{}.unit_string(
"Temperature")},
148 {
"THCONR", keyword_info<double>{}.unit_string(
"Energy/AbsoluteTemperature*Length*Time")},
149 {
"THCONSF", keyword_info<double>{}},
150 {
"HEATCR", keyword_info<double>{}.unit_string(
"Energy/ReservoirVolume*AbsoluteTemperature")},
151 {
"HEATCRT", keyword_info<double>{}.unit_string(
"Energy/ReservoirVolume*AbsoluteTemperature*AbsoluteTemperature")},
152 {
"THCROCK", keyword_info<double>{}.unit_string(
"Energy/AbsoluteTemperature*Length*Time")},
153 {
"THCOIL", keyword_info<double>{}.unit_string(
"Energy/AbsoluteTemperature*Length*Time")},
154 {
"THCGAS", keyword_info<double>{}.unit_string(
"Energy/AbsoluteTemperature*Length*Time")},
155 {
"THCWATER",keyword_info<double>{}.unit_string(
"Energy/AbsoluteTemperature*Length*Time")},
156 {
"YMODULE", keyword_info<double>{}.unit_string(
"Giga*Pascal")},
157 {
"PRATIO", keyword_info<double>{}.unit_string(
"1")},
158 {
"BIOTCOEF", keyword_info<double>{}.unit_string(
"1")},
159 {
"POELCOEF", keyword_info<double>{}.unit_string(
"1")},
160 {
"THERMEXR", keyword_info<double>{}.unit_string(
"1/AbsoluteTemperature")},
161 {
"THELCOEF", keyword_info<double>{}.unit_string(
"Pressure/AbsoluteTemperature")},
162 {
"MULTX", keyword_info<double>{}.init(1.0).mult(
true)},
163 {
"MULTX-", keyword_info<double>{}.init(1.0).mult(
true)},
164 {
"MULTY", keyword_info<double>{}.init(1.0).mult(
true)},
165 {
"MULTY-", keyword_info<double>{}.init(1.0).mult(
true)},
166 {
"MULTZ", keyword_info<double>{}.init(1.0).mult(
true).global_kw(
true)},
167 {
"MULTZ-", keyword_info<double>{}.init(1.0).mult(
true).global_kw(
true)}};
169static const std::unordered_map<std::string, keyword_info<int>> int_keywords = {{
"ACTNUM", keyword_info<int>{}.init(1)},
170 {
"FLUXNUM", keyword_info<int>{}},
171 {
"ISOLNUM", keyword_info<int>{}.init(1)},
172 {
"MULTNUM", keyword_info<int>{}.init(1)},
173 {
"OPERNUM", keyword_info<int>{}},
174 {
"ROCKNUM", keyword_info<int>{}}};
187static const std::unordered_map<std::string, keyword_info<double>> double_keywords = {{
"MULTPV", keyword_info<double>{}.init(1.0).mult(
true)},
188 {
"PORV", keyword_info<double>{}.unit_string(
"ReservoirVolume")},
189 {
"MULTX", keyword_info<double>{}.init(1.0).mult(
true)},
190 {
"MULTX-", keyword_info<double>{}.init(1.0).mult(
true)},
191 {
"MULTY", keyword_info<double>{}.init(1.0).mult(
true)},
192 {
"MULTY-", keyword_info<double>{}.init(1.0).mult(
true)},
193 {
"MULTZ", keyword_info<double>{}.init(1.0).mult(
true).global_kw(
true)},
194 {
"MULTZ-", keyword_info<double>{}.init(1.0).mult(
true).global_kw(
true)}};
196static const std::unordered_map<std::string, keyword_info<int>> int_keywords = {};
200static const std::unordered_map<std::string, keyword_info<double>> double_keywords = {{
"SWATINIT", keyword_info<double>{}},
201 {
"PCG", keyword_info<double>{}.unit_string(
"Pressure")},
202 {
"IPCG", keyword_info<double>{}.unit_string(
"Pressure")},
203 {
"PCW", keyword_info<double>{}.unit_string(
"Pressure")},
204 {
"IPCW", keyword_info<double>{}.unit_string(
"Pressure")}};
205static const std::unordered_map<std::string, keyword_info<int>> int_keywords = {};
207#define dirfunc(base) base, base "X", base "X-", base "Y", base "Y-", base "Z", base "Z-"
209static const std::set<std::string> satfunc = {
"SWLPC",
"ISWLPC",
"SGLPC",
"ISGLPC",
246static const std::unordered_map<std::string, keyword_info<int>> int_keywords = {{
"ENDNUM", keyword_info<int>{}.init(1)},
247 {
"EOSNUM", keyword_info<int>{}.init(1)},
248 {
"EQLNUM", keyword_info<int>{}.init(1)},
249 {
"FIPNUM", keyword_info<int>{}.init(1)},
250 {
"IMBNUM", keyword_info<int>{}.init(1)},
251 {
"OPERNUM", keyword_info<int>{}},
252 {
"STRESSEQUILNUM", keyword_info<int>{}.init(1)},
253 {
"MISCNUM", keyword_info<int>{}},
254 {
"MISCNUM", keyword_info<int>{}},
255 {
"PVTNUM", keyword_info<int>{}.init(1)},
256 {
"SATNUM", keyword_info<int>{}.init(1)},
257 {
"LWSLTNUM", keyword_info<int>{}},
258 {
"ROCKNUM", keyword_info<int>{}},
259 {
"KRNUMX", keyword_info<int>{}},
260 {
"KRNUMY", keyword_info<int>{}},
261 {
"KRNUMZ", keyword_info<int>{}},
262 {
"IMBNUMX", keyword_info<int>{}},
263 {
"IMBNUMY", keyword_info<int>{}},
264 {
"IMBNUMZ", keyword_info<int>{}},
270static const std::unordered_map<std::string, keyword_info<double>> double_keywords = {{
"PRESSURE", keyword_info<double>{}.unit_string(
"Pressure")},
271 {
"SPOLY", keyword_info<double>{}.unit_string(
"Density")},
272 {
"SPOLYMW", keyword_info<double>{}},
273 {
"SSOL", keyword_info<double>{}},
274 {
"SWAT", keyword_info<double>{}},
275 {
"SGAS", keyword_info<double>{}},
276 {
"SMICR", keyword_info<double>{}.unit_string(
"Density")},
277 {
"SOXYG", keyword_info<double>{}.unit_string(
"Density")},
278 {
"SUREA", keyword_info<double>{}.unit_string(
"Density")},
279 {
"SBIOF", keyword_info<double>{}},
280 {
"SCALC", keyword_info<double>{}},
281 {
"SALTP", keyword_info<double>{}},
282 {
"SALT", keyword_info<double>{}.unit_string(
"Salinity")},
283 {
"TEMPI", keyword_info<double>{}.unit_string(
"Temperature")},
284 {
"RS", keyword_info<double>{}.unit_string(
"GasDissolutionFactor")},
285 {
"RSW", keyword_info<double>{}.unit_string(
"GasDissolutionFactor")},
286 {
"RV", keyword_info<double>{}.unit_string(
"OilDissolutionFactor")},
287 {
"RVW", keyword_info<double>{}.unit_string(
"OilDissolutionFactor")}
290static const std::unordered_map<std::string, keyword_info<double>> composition_keywords = {{
"XMF", keyword_info<double>{}},
291 {
"YMF", keyword_info<double>{}},
292 {
"ZMF", keyword_info<double>{}},
298static const std::unordered_map<std::string, keyword_info<double>> double_keywords = {{
"MULTX", keyword_info<double>{}.init(1.0).mult(
true)},
299 {
"MULTX-", keyword_info<double>{}.init(1.0).mult(
true)},
300 {
"MULTY", keyword_info<double>{}.init(1.0).mult(
true)},
301 {
"MULTY-", keyword_info<double>{}.init(1.0).mult(
true)},
302 {
"MULTZ", keyword_info<double>{}.init(1.0).mult(
true).global_kw(
true)},
303 {
"MULTZ-", keyword_info<double>{}.init(1.0).mult(
true).global_kw(
true)}};
305static const std::unordered_map<std::string, keyword_info<int>> int_keywords = {{
"ROCKNUM", keyword_info<int>{}}};
310keyword_info<T> global_kw_info(
const std::string& name,
bool allow_unsupported =
false);
312bool is_oper_keyword(
const std::string& name);
320 using ScalarOperation = Fieldprops::ScalarOperation;
325 std::string region_name;
336 return this->region_value == other.region_value &&
337 this->multiplier == other.multiplier &&
338 this->region_name == other.region_name;
413 const std::string& descr,
414 const std::string& operation)
const
416 switch (this->status) {
422 descr +
" " + this->keyword +
423 " is not fully initialised for " + operation,
429 descr +
" " + this->keyword +
430 " does not exist in input deck for " + operation,
436 descr +
" " + this->keyword +
437 " is not supported for " + operation,
455 throw std::runtime_error(
"The keyword: " +
keyword +
" has not been fully initialized");
458 throw std::out_of_range(
"No such keyword in deck: " +
keyword);
461 throw std::logic_error(
"The keyword " +
keyword +
" is not supported");
468 const std::vector<T>*
ptr()
const
470 return (this->data_ptr !=
nullptr)
471 ? &this->data_ptr->data
479 const std::vector<T>&
data()
const
482 return this->data_ptr->data;
530 const std::size_t ncomps);
535 void reset_actnum(
const std::vector<int>& actnum);
537 void prune_global_for_schedule_run();
541 const std::string& default_region()
const;
543 std::vector<int> actnum();
544 const std::vector<int>& actnumRaw()
const;
546 template <
typename T>
547 static bool supported(
const std::string& keyword);
549 template <
typename T>
550 bool has(
const std::string& keyword)
const;
552 template <
typename T>
553 std::vector<std::string> keys()
const;
567 template <
typename T>
569 try_get(
const std::string& keyword,
const unsigned int flags = 0u)
571 const auto allow_unsupported =
574 if (!allow_unsupported && !FieldProps::template supported<T>(keyword)) {
578 const auto has0 = this->
template has<T>(keyword);
586 const auto& field_data = this->
template
587 init_get<T>(keyword, std::is_same_v<T, double> && allow_unsupported);
589 if (field_data.valid() || allow_unsupported) {
598 this->
template erase<T>(keyword);
608 template <
typename T>
609 const std::vector<T>& get(
const std::string& keyword)
611 return this->
template try_get<T>(keyword).data();
614 template <
typename T>
615 std::vector<T> get_global(
const std::string& keyword)
617 const auto managed_field_data = this->
template try_get<T>(keyword);
618 const auto& field_data = managed_field_data.field_data();
620 const auto& kw_info = Fieldprops::keywords::
621 template global_kw_info<T>(keyword);
623 return kw_info.global
624 ? *field_data.global_data
625 : this->global_copy(field_data.data, kw_info.scalar_init);
628 template <
typename T>
629 std::vector<T> get_copy(
const std::string& keyword,
bool global)
631 const auto has0 = this->
template has<T>(keyword);
641 const auto& field_data = this->
template try_get<T>(keyword).field_data();
644 return this->get_copy(field_data.data, field_data.kw_info.scalar_init, global);
647 const auto initial_value = Fieldprops::keywords::
648 template global_kw_info<T>(keyword).scalar_init;
650 return this->get_copy(this->
template extract<T>(keyword), initial_value, global);
653 template <
typename T>
654 std::vector<bool> defaulted(
const std::string& keyword)
656 const auto& field = this->
template init_get<T>(keyword);
657 std::vector<bool> def(field.numCells());
659 for (std::size_t i = 0; i < def.size(); ++i) {
660 def[i] = value::defaulted(field.value_status[i]);
666 template <
typename T>
667 std::vector<T> global_copy(
const std::vector<T>& data,
668 const std::optional<T>& default_value)
const
670 const T fill_value = default_value.has_value() ? *default_value : 0;
672 std::vector<T> global_data(this->global_size, fill_value);
675 for (std::size_t g = 0; g < this->global_size; g++) {
676 if (this->m_actnum[g]) {
677 global_data[g] = data[i];
685 std::size_t active_size;
686 std::size_t global_size;
688 std::size_t num_int()
const
690 return this->int_data.size();
693 std::size_t num_double()
const
695 return this->double_data.size();
698 void handle_schedule_keywords(
const std::vector<DeckKeyword>& keywords);
699 bool tran_active(
const std::string& keyword)
const;
700 void apply_tran(
const std::string& keyword, std::vector<double>& data);
701 void apply_tranz_global(
const std::vector<size_t>& indices, std::vector<double>& data)
const;
702 bool operator==(
const FieldProps& other)
const;
703 static bool rst_cmp(
const FieldProps& full_arg,
const FieldProps& rst_arg);
705 const std::unordered_map<std::string,Fieldprops::TranCalculator>& getTran()
const
710 std::vector<std::string> fip_regions()
const;
714 void set_active_indices(
const std::vector<int>& indices);
717 void processMULTREGP(
const Deck& deck);
718 void scanGRIDSection(
const GRIDSection& grid_section);
719 void scanGRIDSectionOnlyACTNUM(
const GRIDSection& grid_section);
720 void scanEDITSection(
const EDITSection& edit_section);
721 void scanPROPSSection(
const PROPSSection& props_section);
722 void scanREGIONSSection(
const REGIONSSection& regions_section);
723 void scanSOLUTIONSection(
const SOLUTIONSection& solution_section,
const std::size_t ncomps);
724 double getSIValue(
const std::string& keyword,
double raw_value)
const;
725 double getSIValue(ScalarOperation op,
const std::string& keyword,
double raw_value)
const;
727 template <
typename T>
728 void erase(
const std::string& keyword);
730 template <
typename T>
731 std::vector<T> extract(
const std::string& keyword);
733 template <
typename T>
734 std::vector<T> get_copy(
const std::vector<T>& x,
735 const std::optional<T>& initial_value,
736 const bool global)
const
738 return (! global) ? x : this->global_copy(x, initial_value);
741 template <
typename T>
742 std::vector<T> get_copy(std::vector<T>&& x,
743 const std::optional<T>& initial_value,
744 const bool global)
const
746 return (! global) ? std::move(x) : this->global_copy(x, initial_value);
749 template <
typename T>
750 void operate(
const DeckRecord& record,
751 Fieldprops::FieldData<T>& target_data,
752 const Fieldprops::FieldData<T>& src_data,
753 const std::vector<Box::cell_index>& index_list,
754 const bool global =
false);
756 template <
typename T>
757 Fieldprops::FieldData<T>&
758 init_get(
const std::string& keyword,
bool allow_unsupported =
false);
760 template <
typename T>
761 Fieldprops::FieldData<T>&
762 init_get(
const std::string& keyword,
763 const Fieldprops::keywords::keyword_info<T>& kw_info,
764 const bool multiplier_in_edit =
false);
766 std::string region_name(
const DeckItem& region_item)
const;
768 std::pair<std::vector<Box::cell_index>,
bool>
769 region_index(
const std::string& region_name,
int region_value);
771 void handle_OPERATE(
const DeckKeyword& keyword, Box box);
772 void handle_operation(Section section,
const DeckKeyword& keyword, Box box);
773 void handle_operateR(
const DeckKeyword& keyword);
774 void handle_region_operation(
const DeckKeyword& keyword);
775 void handle_COPY(
const DeckKeyword& keyword, Box box,
bool region);
776 void distribute_toplayer(Fieldprops::FieldData<double>& field_data,
777 const std::vector<double>& deck_data,
780 double get_beta(
const std::string& func_name,
const std::string& target_array,
double raw_beta);
781 double get_alpha(
const std::string& func_name,
const std::string& target_array,
double raw_alpha);
783 void handle_keyword(Section section,
const DeckKeyword& keyword, Box& box);
784 void handle_double_keyword(Section section,
785 const Fieldprops::keywords::keyword_info<double>& kw_info,
786 const DeckKeyword& keyword,
787 const std::string& keyword_name,
790 void handle_double_keyword(Section section,
791 const Fieldprops::keywords::keyword_info<double>& kw_info,
792 const DeckKeyword& keyword,
795 void handle_int_keyword(
const Fieldprops::keywords::keyword_info<int>& kw_info,
796 const DeckKeyword& keyword,
799 void init_satfunc(
const std::string& keyword, Fieldprops::FieldData<double>& satfunc);
800 void init_porv(Fieldprops::FieldData<double>& porv);
801 void init_tempi(Fieldprops::FieldData<double>& tempi);
803 std::string canonical_fipreg_name(
const std::string& fipreg);
804 const std::string& canonical_fipreg_name(
const std::string& fipreg)
const;
811 void apply_multipliers();
813 static constexpr std::string_view getMultiplierPrefix()
815 using namespace std::literals;
819 const UnitSystem unit_system;
820 std::size_t nx,ny,nz;
822 SatFuncControls m_satfuncctrl;
823 std::vector<int> m_actnum;
824 std::unordered_map<int,int> m_active_index;
825 std::vector<double> cell_volume;
826 std::vector<double> cell_depth;
827 const std::string m_default_region;
828 const EclipseGrid * grid_ptr;
830 std::optional<satfunc::RawTableEndPoints> m_rtep;
831 std::vector<MultregpRecord> multregp;
832 std::unordered_map<std::string, Fieldprops::FieldData<int>> int_data;
833 std::unordered_map<std::string, Fieldprops::FieldData<double>> double_data;
834 std::unordered_map<std::string, std::string> fipreg_shortname_translation{};
836 std::unordered_map<std::string,Fieldprops::TranCalculator> tran;
843 std::unordered_map<std::string,Fieldprops::keywords::keyword_info<double>> multiplier_kw_infos_;
About cell information and dimension: The actual grid information is held in a pointer to an ERT ecl_...
Definition EclipseGrid.hpp:62
Definition FieldProps.hpp:317
FieldDataManager< T > try_get(const std::string &keyword, const unsigned int flags=0u)
Request read-only property array from internal cache.
Definition FieldProps.hpp:569
TryGetFlags
Options to restrict or relax a try_get() request.
Definition FieldProps.hpp:516
@ AllowUnsupported
Whether or not to permit looking up property names of unmatching types.
Definition FieldProps.hpp:519
@ MustExist
Whether or not the property must already exist.
Definition FieldProps.hpp:522
GetStatus
Property array existence status.
Definition FieldProps.hpp:343
@ NOT_SUPPPORTED_KEYWORD
Named property is not known to the internal handling mechanism.
@ MISSING_KEYWORD
Property has not yet been defined in the input file.
@ OK
Property exists and its property data is fully defined.
@ INVALID_DATA
Property array has not been fully initialised.
Definition KeywordLocation.hpp:27
Definition NumericalAquifers.hpp:38
Definition Runspec.hpp:46
Definition TableManager.hpp:66
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition Exceptions.hpp:30
Wrapper type for field properties.
Definition FieldProps.hpp:379
FieldDataManager(const std::string &k, GetStatus s, const Fieldprops::FieldData< T > *d)
Constructor.
Definition FieldProps.hpp:394
GetStatus status
Request status.
Definition FieldProps.hpp:384
const Fieldprops::FieldData< T > & field_data() const
Read-only access to contained FieldData object.
Definition FieldProps.hpp:489
const std::vector< T > * ptr() const
Access underlying property data elements.
Definition FieldProps.hpp:468
const Fieldprops::FieldData< T > * data_ptr
Property data.
Definition FieldProps.hpp:387
void verify_status(const KeywordLocation &loc, const std::string &descr, const std::string &operation) const
Validate result of.
Definition FieldProps.hpp:412
void verify_status() const
Validate result of.
Definition FieldProps.hpp:448
bool valid() const
Property validity predicate.
Definition FieldProps.hpp:499
const std::vector< T > & data() const
Access underlying property data elements.
Definition FieldProps.hpp:479
const std::string & keyword
Property name.
Definition FieldProps.hpp:381
Definition FieldProps.hpp:322
Definition FieldData.hpp:72