321 const auto& intQuants = simulator_.model().intensiveQuantities(cell_index, 0);
322 const auto& fs = intQuants.fluidState();
323 const auto& unitSyst = simulator_.vanguard().schedule().getUnits();
327 if (spec.actual_name ==
"PRESSURE") {
328 value = getValue(fs.pressure(oilPhaseIdx));
329 value = unitSyst.from_si(UnitSystem::measure::pressure, value);
330 }
else if (spec.actual_name ==
"SWAT") {
331 value = getValue(fs.saturation(waterPhaseIdx));
332 }
else if (spec.actual_name ==
"SGAS") {
333 value = getValue(fs.saturation(gasPhaseIdx));
334 }
else if (spec.actual_name ==
"SOIL") {
335 value = getValue(fs.saturation(oilPhaseIdx));
336 }
else if (spec.actual_name ==
"RS") {
337 value = getValue(fs.Rs());
338 value = unitSyst.from_si(UnitSystem::measure::gas_oil_ratio, value);
339 }
else if (spec.actual_name ==
"RV") {
340 value = getValue(fs.Rv());
341 value = unitSyst.from_si(UnitSystem::measure::oil_gas_ratio, value);
342 }
else if (spec.actual_name ==
"PERMX") {
343 const auto& eclState = simulator_.vanguard().eclState();
344 const auto& fp = eclState.fieldProps();
345 auto permX = fp.get_double(
"PERMX");
346 value = permX[cell_index];
347 value = unitSyst.from_si(UnitSystem::measure::permeability, value);
349 OPM_THROW(std::runtime_error,
"Unknown per-cell feature: " + spec.actual_name);
352 Scalar transformed = spec.transform.apply(value);
353 Scalar scaled = spec.scaler.scale(transformed);
419 ML::Tensor<Evaluation>& output,
423 const auto& features = config.output_features;
427 const auto& unitSyst = simulator_.vanguard().schedule().getUnits();
429 for (std::size_t i = 0; i < config.n_cells; ++i) {
430 const int cell_idx = config.cell_indices[i];
431 const auto& intQuants = simulator_.model().intensiveQuantities(cell_idx, 0);
432 auto fs = intQuants.fluidState();
437 Scalar sw_val = -1.0;
438 Scalar so_val = -1.0;
439 Scalar sg_val = -1.0;
440 Scalar po_val = -1.0;
442 for (
const auto& [name, spec] : features) {
444 auto scaled_value = getValue(output(feature_idx * config.n_cells + i));
447 Scalar raw_value = spec.scaler.unscale(scaled_value);
450 raw_value = spec.transform.applyInverse(raw_value);
453 if (spec.actual_name ==
"PRESSURE") {
454 raw_value = raw_value + unitSyst.from_si(UnitSystem::measure::pressure, getValue(fs.pressure(oilPhaseIdx)));
455 }
else if (spec.actual_name ==
"SWAT") {
456 raw_value += getValue(fs.saturation(waterPhaseIdx));
457 }
else if (spec.actual_name ==
"SOIL") {
458 raw_value += getValue(fs.saturation(oilPhaseIdx));
459 }
else if (spec.actual_name ==
"SGAS") {
460 raw_value += getValue(fs.saturation(gasPhaseIdx));
461 }
else if (spec.actual_name ==
"RS") {
462 raw_value = raw_value + unitSyst.from_si(UnitSystem::measure::gas_oil_ratio, getValue(fs.Rs()));
463 }
else if (spec.actual_name ==
"RV") {
464 raw_value = raw_value + unitSyst.from_si(UnitSystem::measure::oil_gas_ratio, getValue(fs.Rv()));
466 OPM_THROW(std::runtime_error,
"Unknown delta feature: " + name);
470 if (spec.actual_name ==
"PRESSURE") {
471 po_val = unitSyst.to_si(UnitSystem::measure::pressure, raw_value);
472 }
else if (spec.actual_name ==
"SWAT") {
474 }
else if (spec.actual_name ==
"SOIL") {
476 }
else if (spec.actual_name ==
"SGAS") {
478 }
else if (spec.actual_name ==
"RS") {
479 if constexpr (compositionSwitchEnabled) {
480 raw_value = unitSyst.to_si(UnitSystem::measure::gas_oil_ratio, raw_value);
483 }
else if (spec.actual_name ==
"RV") {
484 if constexpr (compositionSwitchEnabled) {
485 raw_value = unitSyst.to_si(UnitSystem::measure::oil_gas_ratio, raw_value);
489 OPM_THROW(std::runtime_error,
"Unknown output feature: " + name);
495 int sat_count =
static_cast<int>(flags.has_SWAT) +
static_cast<int>(flags.has_SOIL) +
static_cast<int>(flags.has_SGAS);
497 if (sat_count >= 2) {
502 if (!flags.has_SWAT) {
504 }
else if (!flags.has_SOIL) {
506 }
else if (!flags.has_SGAS) {
510 sw = max(0.0, min(sw, 1.0));
511 so = max(0.0, min(so, 1.0));
512 sg = max(0.0, min(sg, 1.0));
514 Scalar sum = sw + so + sg;
516 OPM_THROW(std::runtime_error,
"Saturation sum is zero in cell " + std::to_string(cell_idx));
519 fs.setSaturation(waterPhaseIdx, sw / sum);
520 fs.setSaturation(oilPhaseIdx, so / sum);
521 fs.setSaturation(gasPhaseIdx, sg / sum);
524 if (flags.has_PRESSURE) {
525 std::array<Evaluation, numPhases> pC;
526 const auto& materialParams = simulator_.problem().materialLawParams(cell_idx);
527 MaterialLaw::capillaryPressures(pC, materialParams, fs);
529 for (
unsigned phaseIdx = 0; phaseIdx < numPhases; ++phaseIdx) {
530 if (!FluidSystem::phaseIsActive(phaseIdx))
continue;
531 if (phaseIdx == oilPhaseIdx) {
532 fs.setPressure(phaseIdx, po_val);
534 fs.setPressure(phaseIdx, po_val - pC[phaseIdx]);
539 auto& primaryVars = simulator_.model().solution(0)[cell_idx];
540 primaryVars.assignNaive(fs);
543 simulator_.model().invalidateAndUpdateIntensiveQuantities(0);