inline std::vector< Completion > fromCOMPDAT( const EclipseGrid& grid, const DeckRecord& compdatRecord, const Well& well, int prev_complnum ) { std::vector< Completion > completions; // We change from eclipse's 1 - n, to a 0 - n-1 solution // I and J can be defaulted with 0 or *, in which case they are fetched // from the well head const auto& itemI = compdatRecord.getItem( "I" ); const auto defaulted_I = itemI.defaultApplied( 0 ) || itemI.get< int >( 0 ) == 0; const int I = !defaulted_I ? itemI.get< int >( 0 ) - 1 : well.getHeadI(); const auto& itemJ = compdatRecord.getItem( "J" ); const auto defaulted_J = itemJ.defaultApplied( 0 ) || itemJ.get< int >( 0 ) == 0; const int J = !defaulted_J ? itemJ.get< int >( 0 ) - 1 : well.getHeadJ(); int K1 = compdatRecord.getItem("K1").get< int >(0) - 1; int K2 = compdatRecord.getItem("K2").get< int >(0) - 1; WellCompletion::StateEnum state = WellCompletion::StateEnumFromString( compdatRecord.getItem("STATE").getTrimmedString(0) ); Value<double> connectionTransmissibilityFactor("ConnectionTransmissibilityFactor"); Value<double> diameter("Diameter"); Value<double> skinFactor("SkinFactor"); { const auto& connectionTransmissibilityFactorItem = compdatRecord.getItem("CONNECTION_TRANSMISSIBILITY_FACTOR"); const auto& diameterItem = compdatRecord.getItem("DIAMETER"); const auto& skinFactorItem = compdatRecord.getItem("SKIN"); if (connectionTransmissibilityFactorItem.hasValue(0) && connectionTransmissibilityFactorItem.getSIDouble(0) > 0) connectionTransmissibilityFactor.setValue(connectionTransmissibilityFactorItem.getSIDouble(0)); if (diameterItem.hasValue(0)) diameter.setValue( diameterItem.getSIDouble(0)); if (skinFactorItem.hasValue(0)) skinFactor.setValue( skinFactorItem.get< double >(0)); } const WellCompletion::DirectionEnum direction = WellCompletion::DirectionEnumFromString(compdatRecord.getItem("DIR").getTrimmedString(0)); for (int k = K1; k <= K2; k++) { completions.emplace_back( I, J, k, int( completions.size() + prev_complnum ) + 1, grid.getCellDepth( I,J,k ), state, connectionTransmissibilityFactor, diameter, skinFactor, direction ); } return completions; }
std::pair<std::string , std::vector<CompletionPtr> > Completion::completionsFromCOMPDATRecord( const DeckRecord& compdatRecord ) { std::vector<CompletionPtr> completions; std::string well = compdatRecord.getItem("WELL").getTrimmedString(0); // We change from eclipse's 1 - n, to a 0 - n-1 solution int I = compdatRecord.getItem("I").get< int >(0) - 1; int J = compdatRecord.getItem("J").get< int >(0) - 1; int K1 = compdatRecord.getItem("K1").get< int >(0) - 1; int K2 = compdatRecord.getItem("K2").get< int >(0) - 1; WellCompletion::StateEnum state = WellCompletion::StateEnumFromString( compdatRecord.getItem("STATE").getTrimmedString(0) ); Value<double> connectionTransmissibilityFactor("ConnectionTransmissibilityFactor"); Value<double> diameter("Diameter"); Value<double> skinFactor("SkinFactor"); { const auto& connectionTransmissibilityFactorItem = compdatRecord.getItem("CONNECTION_TRANSMISSIBILITY_FACTOR"); const auto& diameterItem = compdatRecord.getItem("DIAMETER"); const auto& skinFactorItem = compdatRecord.getItem("SKIN"); if (connectionTransmissibilityFactorItem.hasValue(0) && connectionTransmissibilityFactorItem.getSIDouble(0) > 0) connectionTransmissibilityFactor.setValue(connectionTransmissibilityFactorItem.getSIDouble(0)); if (diameterItem.hasValue(0)) diameter.setValue( diameterItem.getSIDouble(0)); if (skinFactorItem.hasValue(0)) skinFactor.setValue( skinFactorItem.get< double >(0)); } const WellCompletion::DirectionEnum direction = WellCompletion::DirectionEnumFromString(compdatRecord.getItem("DIR").getTrimmedString(0)); for (int k = K1; k <= K2; k++) { CompletionPtr completion(new Completion(I , J , k , state , connectionTransmissibilityFactor, diameter, skinFactor, direction )); completions.push_back( completion ); } return std::pair<std::string , std::vector<CompletionPtr> >( well , completions ); }