2017-02-07 02:09:00 -06:00
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2017 - Statoil ASA
2018-08-10 07:47:06 -05:00
//
2017-02-07 02:09:00 -06:00
// 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.
2018-08-10 07:47:06 -05:00
//
2017-02-07 02:09:00 -06:00
// 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.
2018-08-10 07:47:06 -05:00
//
// See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
2017-02-07 02:09:00 -06:00
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////
# include "RimFractureTemplate.h"
2018-02-14 06:35:35 -06:00
# include "RiaFractureDefines.h"
2017-02-07 02:09:00 -06:00
# include "RigTesselatorTools.h"
# include "RimFracture.h"
2018-01-05 04:38:58 -06:00
# include "RimFractureContainment.h"
2017-02-07 02:09:00 -06:00
# include "RimProject.h"
# include "cafPdmObject.h"
2017-04-19 04:00:52 -05:00
# include "cafPdmUiDoubleSliderEditor.h"
2018-02-16 03:14:41 -06:00
# include "cafPdmUiDoubleValueEditor.h"
2018-03-01 07:16:08 -06:00
# include "cafPdmUiPushButtonEditor.h"
2018-08-10 07:47:06 -05:00
# include "cafPdmUiTextEditor.h"
2017-02-07 02:09:00 -06:00
# include "cvfVector3.h"
2018-01-05 04:38:58 -06:00
# include <cmath>
2017-02-07 02:09:00 -06:00
2018-08-10 07:47:06 -05:00
// clang-format off
2017-02-07 02:09:00 -06:00
namespace caf
{
template < >
void caf : : AppEnum < RimFractureTemplate : : FracOrientationEnum > : : setUp ( )
{
2018-02-21 12:53:22 -06:00
addItem ( RimFractureTemplate : : AZIMUTH , " Az " , " Azimuth " ) ;
addItem ( RimFractureTemplate : : ALONG_WELL_PATH , " AlongWellPath " , " Along Well Path " ) ;
addItem ( RimFractureTemplate : : TRANSVERSE_WELL_PATH , " TransverseWellPath " , " Transverse (normal) to Well Path " ) ;
2017-02-07 02:09:00 -06:00
setDefault ( RimFractureTemplate : : TRANSVERSE_WELL_PATH ) ;
}
2017-02-10 06:29:31 -06:00
2017-02-10 06:43:22 -06:00
template < >
2017-02-10 06:29:31 -06:00
void caf : : AppEnum < RimFractureTemplate : : FracConductivityEnum > : : setUp ( )
{
2017-02-22 04:52:06 -06:00
addItem ( RimFractureTemplate : : INFINITE_CONDUCTIVITY , " InfiniteConductivity " , " Infinite Conductivity " ) ;
2018-02-21 12:53:22 -06:00
addItem ( RimFractureTemplate : : FINITE_CONDUCTIVITY , " FiniteConductivity " , " Finite Conductivity " ) ;
2017-02-10 06:29:31 -06:00
setDefault ( RimFractureTemplate : : INFINITE_CONDUCTIVITY ) ;
}
2017-02-14 02:49:14 -06:00
2018-02-14 06:35:35 -06:00
template < >
2018-02-15 13:01:41 -06:00
void caf : : AppEnum < RimFractureTemplate : : PermeabilityEnum > : : setUp ( )
2018-02-14 06:35:35 -06:00
{
2018-02-21 12:53:22 -06:00
addItem ( RimFractureTemplate : : USER_DEFINED_PERMEABILITY , " UserDefinedPermeability " , " User Defined " ) ;
addItem ( RimFractureTemplate : : CONDUCTIVITY_FROM_FRACTURE , " FractureConductivity " , " Use Fracture Conductivity " ) ;
2018-02-14 06:35:35 -06:00
setDefault ( RimFractureTemplate : : CONDUCTIVITY_FROM_FRACTURE ) ;
}
2018-02-15 13:01:41 -06:00
template < >
void caf : : AppEnum < RimFractureTemplate : : WidthEnum > : : setUp ( )
{
2018-02-21 12:53:22 -06:00
addItem ( RimFractureTemplate : : USER_DEFINED_WIDTH , " UserDefinedWidth " , " User Defined " ) ;
addItem ( RimFractureTemplate : : WIDTH_FROM_FRACTURE , " FractureWidth " , " Use Fracture Width " ) ;
2017-02-14 02:49:14 -06:00
2018-02-15 13:01:41 -06:00
setDefault ( RimFractureTemplate : : WIDTH_FROM_FRACTURE ) ;
}
2018-02-15 14:43:35 -06:00
template < >
void caf : : AppEnum < RimFractureTemplate : : NonDarcyFlowEnum > : : setUp ( )
{
2018-02-21 12:53:22 -06:00
addItem ( RimFractureTemplate : : NON_DARCY_NONE , " None " , " None " ) ;
2018-03-20 04:58:06 -05:00
addItem ( RimFractureTemplate : : NON_DARCY_COMPUTED , " Computed " , " Compute D-factor " ) ;
addItem ( RimFractureTemplate : : NON_DARCY_USER_DEFINED , " UserDefined " , " User Defined D-factor " ) ;
2018-02-15 14:43:35 -06:00
setDefault ( RimFractureTemplate : : NON_DARCY_NONE ) ;
}
2018-09-24 08:10:46 -05:00
template < >
void caf : : AppEnum < RimFractureTemplate : : BetaFactorEnum > : : setUp ( )
{
addItem ( RimFractureTemplate : : USER_DEFINED_BETA_FACTOR , " UserDefinedBetaFactor " , " User Defined " ) ;
addItem ( RimFractureTemplate : : BETA_FACTOR_FROM_FRACTURE , " FractureBetaFactor " , " Use Fracture Beta Factor " ) ;
setDefault ( RimFractureTemplate : : USER_DEFINED_BETA_FACTOR ) ;
}
2017-02-07 02:09:00 -06:00
}
2018-02-09 00:26:48 -06:00
// TODO Move to cafPdmObject.h
# define CAF_PDM_InitField_Basic(field, keyword, default, uiName) CAF_PDM_InitField(field, keyword, default, uiName, "", "", "")
2017-02-07 02:09:00 -06:00
CAF_PDM_XML_ABSTRACT_SOURCE_INIT ( RimFractureTemplate , " RimFractureTemplate " ) ;
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
2018-01-10 00:44:26 -06:00
RimFractureTemplate : : RimFractureTemplate ( )
2017-02-07 02:09:00 -06:00
{
CAF_PDM_InitObject ( " Fracture Template " , " :/FractureTemplate16x16.png " , " " , " " ) ;
2018-03-02 02:33:17 -06:00
CAF_PDM_InitField ( & m_id , " Id " , - 1 , " ID " , " " , " " , " " ) ;
m_id . uiCapability ( ) - > setUiReadOnly ( true ) ;
2018-02-08 06:57:43 -06:00
CAF_PDM_InitField ( & m_name , " UserDescription " , QString ( " Fracture Template " ) , " Name " , " " , " " , " " ) ;
2018-02-19 06:54:29 -06:00
CAF_PDM_InitFieldNoDefault ( & m_nameAndUnit , " NameAndUnit " , " NameAndUnit " , " " , " " , " " ) ;
m_nameAndUnit . registerGetMethod ( this , & RimFractureTemplate : : nameAndUnit ) ;
m_nameAndUnit . uiCapability ( ) - > setUiHidden ( true ) ;
m_nameAndUnit . xmlCapability ( ) - > disableIO ( ) ;
2018-06-28 04:13:08 -05:00
CAF_PDM_InitField ( & m_fractureTemplateUnit , " UnitSystem " , caf : : AppEnum < RiaEclipseUnitTools : : UnitSystem > ( RiaEclipseUnitTools : : UNITS_UNKNOWN ) , " Units System " , " " , " " , " " ) ;
2018-02-08 06:57:43 -06:00
m_fractureTemplateUnit . uiCapability ( ) - > setUiReadOnly ( true ) ;
2017-02-14 02:49:14 -06:00
2018-02-08 06:57:43 -06:00
CAF_PDM_InitField ( & m_orientationType , " Orientation " , caf : : AppEnum < FracOrientationEnum > ( TRANSVERSE_WELL_PATH ) , " Fracture Orientation " , " " , " " , " " ) ;
2018-02-08 04:34:18 -06:00
CAF_PDM_InitField ( & m_azimuthAngle , " AzimuthAngle " , 0.0f , " Azimuth Angle " , " " , " " , " " ) ; //Is this correct description?
CAF_PDM_InitField ( & m_skinFactor , " SkinFactor " , 0.0f , " Skin Factor " , " " , " " , " " ) ;
2017-02-10 06:29:31 -06:00
2018-02-08 04:34:18 -06:00
CAF_PDM_InitField ( & m_perforationLength , " PerforationLength " , 1.0 , " Perforation Length " , " " , " " , " " ) ;
2018-02-21 12:53:22 -06:00
2018-02-08 04:34:18 -06:00
CAF_PDM_InitField ( & m_perforationEfficiency , " PerforationEfficiency " , 1.0 , " Perforation Efficiency " , " " , " " , " " ) ;
m_perforationEfficiency . uiCapability ( ) - > setUiEditorTypeName ( caf : : PdmUiDoubleSliderEditor : : uiEditorTypeName ( ) ) ;
2017-04-19 04:00:52 -05:00
2018-02-21 12:53:22 -06:00
CAF_PDM_InitField ( & m_wellDiameter , " WellDiameter " , 0.216 , " Well Diameter at Fracture " , " " , " " , " " ) ;
2018-02-08 04:34:18 -06:00
CAF_PDM_InitField ( & m_conductivityType , " ConductivityType " , caf : : AppEnum < FracConductivityEnum > ( FINITE_CONDUCTIVITY ) , " Conductivity in Fracture " , " " , " " , " " ) ;
2017-02-10 06:29:31 -06:00
2017-12-15 07:26:59 -06:00
CAF_PDM_InitFieldNoDefault ( & m_fractureContainment , " FractureContainmentField " , " Fracture Containment " , " " , " " , " " ) ;
2017-06-09 10:21:59 -05:00
m_fractureContainment = new RimFractureContainment ( ) ;
m_fractureContainment . uiCapability ( ) - > setUiTreeHidden ( true ) ;
m_fractureContainment . uiCapability ( ) - > setUiTreeChildrenHidden ( true ) ;
2018-02-09 00:26:48 -06:00
// Non-Darcy Flow options
2018-02-15 14:43:35 -06:00
CAF_PDM_InitFieldNoDefault ( & m_nonDarcyFlowType , " NonDarcyFlowType " , " Non-Darcy Flow " , " " , " " , " " ) ;
CAF_PDM_InitField ( & m_userDefinedDFactor , " UserDefinedDFactor " , 1.0 , " D Factor " , " " , " " , " " ) ;
2018-02-15 13:01:41 -06:00
CAF_PDM_InitFieldNoDefault ( & m_fractureWidthType , " FractureWidthType " , " Type " , " " , " " , " " ) ;
2018-03-20 04:42:53 -05:00
CAF_PDM_InitField_Basic ( & m_fractureWidth , " FractureWidth " , 0.01 , " Fracture Width (h) " ) ;
2018-02-15 13:01:41 -06:00
2018-09-24 08:10:46 -05:00
CAF_PDM_InitFieldNoDefault ( & m_betaFactorType , " BetaFactorType " , " Type " , " " , " " , " " ) ;
2018-03-20 04:58:06 -05:00
CAF_PDM_InitField_Basic ( & m_inertialCoefficient , " InertialCoefficient " , 0.006083236 , " <html>Inertial Coefficient (β)</html> [Forch. unit] " ) ;
2018-02-14 06:35:35 -06:00
2018-02-15 08:38:27 -06:00
CAF_PDM_InitFieldNoDefault ( & m_permeabilityType , " PermeabilityType " , " Type " , " " , " " , " " ) ;
CAF_PDM_InitField_Basic ( & m_relativePermeability , " RelativePermeability " , 1.0 , " Relative Permeability " ) ;
2018-02-15 13:01:41 -06:00
CAF_PDM_InitField ( & m_userDefinedEffectivePermeability , " EffectivePermeability " , 0.0 , " Effective Permeability (Ke) [mD] " , " " , " " , " " ) ;
2018-02-14 06:35:35 -06:00
2018-02-15 14:43:35 -06:00
CAF_PDM_InitField ( & m_relativeGasDensity , " RelativeGasDensity " , 0.8 , " <html>Relative Gas Density (γ)</html> " , " " , " Relative density of gas at surface conditions with respect to air at STP " , " " ) ;
2018-02-21 12:25:05 -06:00
CAF_PDM_InitField ( & m_gasViscosity , " GasViscosity " , 0.02 , " <html>Gas Viscosity (μ)</html> [cP] " , " " , " Gas viscosity at bottom hole pressure " , " " ) ;
2018-02-14 06:35:35 -06:00
CAF_PDM_InitFieldNoDefault ( & m_dFactorDisplayField , " dFactorDisplayField " , " D Factor " , " " , " " , " " ) ;
2018-08-17 02:16:16 -05:00
m_dFactorDisplayField . registerGetMethod ( this , & RimFractureTemplate : : dFactorForTemplate ) ;
2018-02-16 03:14:41 -06:00
m_dFactorDisplayField . uiCapability ( ) - > setUiEditorTypeName ( caf : : PdmUiDoubleValueEditor : : uiEditorTypeName ( ) ) ;
2018-02-14 06:35:35 -06:00
m_dFactorDisplayField . uiCapability ( ) - > setUiReadOnly ( true ) ;
2018-02-19 06:54:29 -06:00
m_dFactorDisplayField . xmlCapability ( ) - > disableIO ( ) ;
2018-02-14 06:35:35 -06:00
CAF_PDM_InitFieldNoDefault ( & m_dFactorSummaryText , " dFactorSummaryText " , " D Factor Summary " , " " , " " , " " ) ;
m_dFactorSummaryText . registerGetMethod ( this , & RimFractureTemplate : : dFactorSummary ) ;
m_dFactorSummaryText . uiCapability ( ) - > setUiReadOnly ( true ) ;
m_dFactorSummaryText . uiCapability ( ) - > setUiEditorTypeName ( caf : : PdmUiTextEditor : : uiEditorTypeName ( ) ) ;
m_dFactorSummaryText . uiCapability ( ) - > setUiLabelPosition ( caf : : PdmUiItemInfo : : LabelPosType : : TOP ) ;
2018-02-19 06:54:29 -06:00
m_dFactorSummaryText . xmlCapability ( ) - > disableIO ( ) ;
2018-03-01 07:16:08 -06:00
2018-03-05 03:20:47 -06:00
CAF_PDM_InitField ( & m_heightScaleFactor , " HeightScaleFactor " , 1.0 , " Height " , " " , " " , " " ) ;
2018-09-14 01:25:27 -05:00
CAF_PDM_InitField ( & m_halfLengthScaleFactor , " WidthScaleFactor " , 1.0 , " Half Length " , " " , " " , " " ) ;
2018-03-05 03:20:47 -06:00
CAF_PDM_InitField ( & m_dFactorScaleFactor , " DFactorScaleFactor " , 1.0 , " D-factor " , " " , " " , " " ) ;
2018-03-05 04:55:34 -06:00
CAF_PDM_InitField ( & m_conductivityScaleFactor , " ConductivityFactor " , 1.0 , " Conductivity " , " " , " The conductivity values read from file will be scaled with this parameters " , " " ) ;
2018-03-05 03:20:47 -06:00
CAF_PDM_InitField ( & m_scaleApplyButton , " ScaleApplyButton " , false , " Apply " , " " , " " , " " ) ;
2018-03-05 04:55:34 -06:00
2018-03-05 03:20:47 -06:00
m_scaleApplyButton . xmlCapability ( ) - > disableIO ( ) ;
m_scaleApplyButton . uiCapability ( ) - > setUiEditorTypeName ( caf : : PdmUiPushButtonEditor : : uiEditorTypeName ( ) ) ;
m_scaleApplyButton . uiCapability ( ) - > setUiLabelPosition ( caf : : PdmUiItemInfo : : HIDDEN ) ;
2017-02-07 02:09:00 -06:00
}
2018-08-10 07:47:06 -05:00
// clang-format on
2017-02-07 02:09:00 -06:00
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
///
2017-02-07 02:09:00 -06:00
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
RimFractureTemplate : : ~ RimFractureTemplate ( ) { }
2017-02-07 02:09:00 -06:00
2018-03-02 02:33:17 -06:00
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
///
2018-03-02 02:33:17 -06:00
//--------------------------------------------------------------------------------------------------
int RimFractureTemplate : : id ( ) const
{
return m_id ;
}
2018-02-08 06:57:43 -06:00
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
///
2018-02-08 06:57:43 -06:00
//--------------------------------------------------------------------------------------------------
void RimFractureTemplate : : setName ( const QString & name )
{
m_name = name ;
}
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
///
2018-02-08 06:57:43 -06:00
//--------------------------------------------------------------------------------------------------
void RimFractureTemplate : : setFractureTemplateUnit ( RiaEclipseUnitTools : : UnitSystemType unitSystem )
{
m_fractureTemplateUnit = unitSystem ;
}
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
///
2018-02-08 06:57:43 -06:00
//--------------------------------------------------------------------------------------------------
QString RimFractureTemplate : : name ( ) const
{
return m_name ;
}
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
///
2018-02-08 06:57:43 -06:00
//--------------------------------------------------------------------------------------------------
RimFractureTemplate : : FracOrientationEnum RimFractureTemplate : : orientationType ( ) const
{
return m_orientationType ( ) ;
}
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
///
2018-02-08 06:57:43 -06:00
//--------------------------------------------------------------------------------------------------
RiaEclipseUnitTools : : UnitSystemType RimFractureTemplate : : fractureTemplateUnit ( ) const
{
return m_fractureTemplateUnit ( ) ;
}
2017-02-07 02:09:00 -06:00
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
///
2017-02-07 02:09:00 -06:00
//--------------------------------------------------------------------------------------------------
caf : : PdmFieldHandle * RimFractureTemplate : : userDescriptionField ( )
{
2018-02-19 06:54:29 -06:00
return & m_nameAndUnit ;
2017-02-07 02:09:00 -06:00
}
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
///
2017-02-07 02:09:00 -06:00
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
void RimFractureTemplate : : fieldChangedByUi ( const caf : : PdmFieldHandle * changedField ,
const QVariant & oldValue ,
const QVariant & newValue )
2017-02-07 02:09:00 -06:00
{
2018-04-20 05:58:42 -05:00
bool createDisplayModelAndRedraw = false ;
2018-02-08 06:57:43 -06:00
if ( changedField = = & m_azimuthAngle | | changedField = = & m_orientationType )
2017-02-23 02:47:30 -06:00
{
2018-08-15 02:44:27 -05:00
for ( RimFracture * fracture : fracturesUsingThisTemplate ( ) )
2017-02-23 02:47:30 -06:00
{
2018-08-15 02:44:27 -05:00
if ( changedField = = & m_azimuthAngle & & ( fabs ( oldValue . toDouble ( ) - fracture - > m_azimuth ( ) ) < 1e-5 ) )
{
fracture - > m_azimuth = m_azimuthAngle ;
}
2017-02-23 02:47:30 -06:00
2018-08-15 02:44:27 -05:00
if ( changedField = = & m_orientationType )
2017-02-23 02:47:30 -06:00
{
2018-08-15 02:44:27 -05:00
if ( newValue = = AZIMUTH )
2017-02-23 02:47:30 -06:00
{
2018-08-15 02:44:27 -05:00
fracture - > m_azimuth = m_azimuthAngle ;
}
else
{
fracture - > updateAzimuthBasedOnWellAzimuthAngle ( ) ;
2017-02-23 02:47:30 -06:00
}
}
2018-04-20 05:58:42 -05:00
createDisplayModelAndRedraw = true ;
2017-02-23 02:47:30 -06:00
}
}
2017-02-07 02:09:00 -06:00
2018-02-08 04:34:18 -06:00
if ( changedField = = & m_perforationLength | | changedField = = & m_perforationEfficiency | | changedField = = & m_wellDiameter )
2017-04-19 04:00:52 -05:00
{
2018-08-15 02:44:27 -05:00
for ( RimFracture * fracture : fracturesUsingThisTemplate ( ) )
2017-04-19 04:00:52 -05:00
{
2018-08-15 02:44:27 -05:00
if ( changedField = = & m_perforationLength & & ( fabs ( oldValue . toDouble ( ) - fracture - > m_perforationLength ( ) ) < 1e-5 ) )
2017-04-19 04:00:52 -05:00
{
2018-08-15 02:44:27 -05:00
fracture - > m_perforationLength = m_perforationLength ;
}
if ( changedField = = & m_perforationEfficiency & &
( fabs ( oldValue . toDouble ( ) - fracture - > m_perforationEfficiency ( ) ) < 1e-5 ) )
{
fracture - > m_perforationEfficiency = m_perforationEfficiency ;
}
if ( changedField = = & m_wellDiameter & & ( fabs ( oldValue . toDouble ( ) - fracture - > m_wellDiameter ( ) ) < 1e-5 ) )
{
fracture - > m_wellDiameter = m_wellDiameter ;
2017-04-19 04:00:52 -05:00
}
}
}
2018-01-19 08:08:28 -06:00
2018-08-15 02:44:27 -05:00
for ( RimFracture * fracture : fracturesUsingThisTemplate ( ) )
{
fracture - > clearCachedNonDarcyProperties ( ) ;
}
2018-02-08 04:34:18 -06:00
if ( changedField = = & m_perforationLength )
2018-04-20 05:58:42 -05:00
{
createDisplayModelAndRedraw = true ;
}
if ( createDisplayModelAndRedraw )
2018-01-19 08:08:28 -06:00
{
RimProject * proj ;
this - > firstAncestorOrThisOfType ( proj ) ;
if ( proj )
{
2018-04-20 05:58:42 -05:00
proj - > reloadCompletionTypeResultsInAllViews ( ) ;
2018-01-19 08:08:28 -06:00
}
}
2017-04-19 04:00:52 -05:00
}
2017-02-07 02:09:00 -06:00
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
///
2017-02-07 02:09:00 -06:00
//--------------------------------------------------------------------------------------------------
void RimFractureTemplate : : defineUiOrdering ( QString uiConfigName , caf : : PdmUiOrdering & uiOrdering )
{
2018-02-09 00:26:48 -06:00
prepareFieldsForUiDisplay ( ) ;
2018-03-01 07:16:08 -06:00
{
2018-03-05 03:20:47 -06:00
auto group = uiOrdering . addNewGroup ( " Sensitivity Scale Factors " ) ;
2018-09-25 04:24:10 -05:00
group - > setCollapsedByDefault ( true ) ;
2018-03-01 07:16:08 -06:00
group - > add ( & m_heightScaleFactor ) ;
2018-09-14 01:25:27 -05:00
group - > add ( & m_halfLengthScaleFactor ) ;
2018-03-05 03:20:47 -06:00
group - > add ( & m_dFactorScaleFactor ) ;
2018-03-20 02:22:38 -05:00
group - > add ( & m_conductivityScaleFactor ) ;
2018-03-05 04:55:34 -06:00
2018-03-05 03:20:47 -06:00
group - > add ( & m_scaleApplyButton ) ;
2018-03-01 07:16:08 -06:00
}
2018-02-15 13:01:41 -06:00
auto nonDarcyFlowGroup = uiOrdering . addNewGroup ( " Non-Darcy Flow " ) ;
2018-02-15 14:43:35 -06:00
nonDarcyFlowGroup - > add ( & m_nonDarcyFlowType ) ;
2018-08-10 07:47:06 -05:00
2018-02-15 14:43:35 -06:00
if ( m_nonDarcyFlowType = = RimFractureTemplate : : NON_DARCY_USER_DEFINED )
2018-02-14 06:35:35 -06:00
{
2018-02-15 14:43:35 -06:00
nonDarcyFlowGroup - > add ( & m_userDefinedDFactor ) ;
2018-02-14 06:35:35 -06:00
}
2018-02-15 14:43:35 -06:00
if ( m_nonDarcyFlowType = = RimFractureTemplate : : NON_DARCY_COMPUTED )
2018-02-15 13:01:41 -06:00
{
2018-09-24 08:10:46 -05:00
{
auto group = nonDarcyFlowGroup - > addNewGroup ( " <html>Inertial Coefficient(β-factor)</html> " ) ;
group - > add ( & m_betaFactorType ) ;
group - > add ( & m_inertialCoefficient ) ;
}
2018-02-15 14:43:35 -06:00
{
auto group = nonDarcyFlowGroup - > addNewGroup ( " Effective Permeability " ) ;
group - > add ( & m_permeabilityType ) ;
group - > add ( & m_relativePermeability ) ;
group - > add ( & m_userDefinedEffectivePermeability ) ;
}
2018-02-15 13:01:41 -06:00
2018-02-15 14:43:35 -06:00
{
auto group = nonDarcyFlowGroup - > addNewGroup ( " Width " ) ;
group - > add ( & m_fractureWidthType ) ;
group - > add ( & m_fractureWidth ) ;
}
2018-02-14 06:35:35 -06:00
2018-02-15 14:43:35 -06:00
nonDarcyFlowGroup - > add ( & m_relativeGasDensity ) ;
nonDarcyFlowGroup - > add ( & m_gasViscosity ) ;
2018-08-17 02:16:16 -05:00
if ( orientationType ( ) ! = ALONG_WELL_PATH )
{
nonDarcyFlowGroup - > add ( & m_dFactorDisplayField ) ;
}
2018-02-15 14:43:35 -06:00
{
2018-08-10 07:47:06 -05:00
auto group = nonDarcyFlowGroup - > addNewGroup ( " D Factor Details " ) ;
2018-02-15 14:43:35 -06:00
group - > setCollapsedByDefault ( true ) ;
group - > add ( & m_dFactorSummaryText ) ;
}
2018-02-14 06:35:35 -06:00
}
2018-02-09 00:26:48 -06:00
uiOrdering . add ( & m_fractureTemplateUnit ) ;
2018-02-15 14:43:35 -06:00
uiOrdering . skipRemainingFields ( true ) ;
2018-02-09 00:26:48 -06:00
}
2017-02-14 02:49:14 -06:00
2018-02-09 00:26:48 -06:00
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
///
2018-02-09 00:26:48 -06:00
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
void RimFractureTemplate : : defineEditorAttribute ( const caf : : PdmFieldHandle * field ,
QString uiConfigName ,
caf : : PdmUiEditorAttribute * attribute )
2018-02-09 00:26:48 -06:00
{
if ( field = = & m_perforationEfficiency )
{
auto myAttr = dynamic_cast < caf : : PdmUiDoubleSliderEditorAttribute * > ( attribute ) ;
if ( myAttr )
{
myAttr - > m_minimum = 0 ;
myAttr - > m_maximum = 1.0 ;
}
}
2018-02-14 06:35:35 -06:00
if ( field = = & m_dFactorSummaryText )
{
auto myAttr = dynamic_cast < caf : : PdmUiTextEditorAttribute * > ( attribute ) ;
if ( myAttr )
{
myAttr - > wrapMode = caf : : PdmUiTextEditorAttribute : : NoWrap ;
2018-08-10 07:47:06 -05:00
2018-02-14 06:35:35 -06:00
QFont font ( " Monospace " , 10 ) ;
2018-08-10 07:47:06 -05:00
myAttr - > font = font ;
2018-02-14 06:35:35 -06:00
myAttr - > textMode = caf : : PdmUiTextEditorAttribute : : HTML ;
}
}
2018-03-01 07:16:08 -06:00
2018-03-05 03:20:47 -06:00
if ( field = = & m_scaleApplyButton )
2018-03-01 07:16:08 -06:00
{
2018-08-10 07:47:06 -05:00
caf : : PdmUiPushButtonEditorAttribute * attrib = dynamic_cast < caf : : PdmUiPushButtonEditorAttribute * > ( attribute ) ;
2018-03-01 07:16:08 -06:00
if ( attrib )
{
attrib - > m_buttonText = " Apply " ;
}
}
2018-02-14 06:35:35 -06:00
}
2018-02-09 00:26:48 -06:00
2018-02-16 07:17:28 -06:00
//--------------------------------------------------------------------------------------------------
///
2018-02-09 00:26:48 -06:00
//--------------------------------------------------------------------------------------------------
void RimFractureTemplate : : prepareFieldsForUiDisplay ( )
{
2018-02-08 06:57:43 -06:00
if ( m_fractureTemplateUnit = = RiaEclipseUnitTools : : UNITS_METRIC )
2017-06-08 04:00:35 -05:00
{
2018-02-08 04:34:18 -06:00
m_wellDiameter . uiCapability ( ) - > setUiName ( " Well Diameter [m] " ) ;
m_perforationLength . uiCapability ( ) - > setUiName ( " Perforation Length [m] " ) ;
2018-02-21 12:25:05 -06:00
m_fractureWidth . uiCapability ( ) - > setUiName ( " Fracture Width [m] " ) ;
2017-06-08 04:00:35 -05:00
}
2018-02-08 06:57:43 -06:00
else if ( m_fractureTemplateUnit = = RiaEclipseUnitTools : : UNITS_FIELD )
2017-06-08 04:00:35 -05:00
{
2018-02-08 04:34:18 -06:00
m_wellDiameter . uiCapability ( ) - > setUiName ( " Well Diameter [inches] " ) ;
2018-02-21 12:25:05 -06:00
m_perforationLength . uiCapability ( ) - > setUiName ( " Perforation Length [ft] " ) ;
m_fractureWidth . uiCapability ( ) - > setUiName ( " Fracture Width [ft] " ) ;
2017-06-08 04:00:35 -05:00
}
2018-08-10 07:47:06 -05:00
if ( m_orientationType = = RimFractureTemplate : : ALONG_WELL_PATH | |
m_orientationType = = RimFractureTemplate : : TRANSVERSE_WELL_PATH )
2017-02-10 03:33:07 -06:00
{
2018-02-08 04:34:18 -06:00
m_azimuthAngle . uiCapability ( ) - > setUiHidden ( true ) ;
2017-02-10 03:33:07 -06:00
}
2018-02-08 06:57:43 -06:00
else if ( m_orientationType = = RimFractureTemplate : : AZIMUTH )
2017-02-10 03:33:07 -06:00
{
2018-02-08 04:34:18 -06:00
m_azimuthAngle . uiCapability ( ) - > setUiHidden ( false ) ;
2017-02-10 03:33:07 -06:00
}
2017-06-02 08:34:37 -05:00
2018-02-08 06:57:43 -06:00
if ( m_orientationType = = RimFractureTemplate : : ALONG_WELL_PATH )
2017-06-02 08:34:37 -05:00
{
2018-02-08 04:34:18 -06:00
m_perforationEfficiency . uiCapability ( ) - > setUiHidden ( false ) ;
m_perforationLength . uiCapability ( ) - > setUiHidden ( false ) ;
2017-06-02 08:34:37 -05:00
}
2018-08-10 07:47:06 -05:00
else
2017-06-02 08:34:37 -05:00
{
2018-02-08 04:34:18 -06:00
m_perforationEfficiency . uiCapability ( ) - > setUiHidden ( true ) ;
m_perforationLength . uiCapability ( ) - > setUiHidden ( true ) ;
2017-06-02 08:34:37 -05:00
}
2017-06-26 03:43:14 -05:00
2018-02-08 04:34:18 -06:00
if ( m_conductivityType = = FINITE_CONDUCTIVITY )
2017-06-26 03:43:14 -05:00
{
2018-02-08 04:34:18 -06:00
m_wellDiameter . uiCapability ( ) - > setUiHidden ( false ) ;
2017-06-26 03:43:14 -05:00
}
2018-02-08 04:34:18 -06:00
else if ( m_conductivityType = = INFINITE_CONDUCTIVITY )
2017-06-26 03:43:14 -05:00
{
2018-02-08 04:34:18 -06:00
m_wellDiameter . uiCapability ( ) - > setUiHidden ( true ) ;
2017-06-26 03:43:14 -05:00
}
2017-04-19 04:00:52 -05:00
2018-02-09 00:26:48 -06:00
// Non Darcy Flow
2018-02-14 06:35:35 -06:00
2018-02-15 14:43:35 -06:00
{
2018-09-24 08:10:46 -05:00
if ( m_fractureWidthType = = RimFractureTemplate : : USER_DEFINED_WIDTH )
{
m_fractureWidth . uiCapability ( ) - > setUiReadOnly ( false ) ;
}
else
{
m_fractureWidth . uiCapability ( ) - > setUiReadOnly ( true ) ;
}
if ( m_betaFactorType = = RimFractureTemplate : : USER_DEFINED_BETA_FACTOR )
{
m_inertialCoefficient . uiCapability ( ) - > setUiReadOnly ( false ) ;
}
else
{
m_inertialCoefficient . uiCapability ( ) - > setUiReadOnly ( true ) ;
}
2018-02-15 14:43:35 -06:00
}
2018-02-15 13:01:41 -06:00
2018-02-16 00:58:07 -06:00
if ( m_permeabilityType = = RimFractureTemplate : : USER_DEFINED_PERMEABILITY )
2018-02-15 14:43:35 -06:00
{
2018-02-16 00:58:07 -06:00
m_relativePermeability . uiCapability ( ) - > setUiHidden ( true ) ;
m_userDefinedEffectivePermeability . uiCapability ( ) - > setUiHidden ( false ) ;
}
else
{
m_relativePermeability . uiCapability ( ) - > setUiHidden ( false ) ;
m_userDefinedEffectivePermeability . uiCapability ( ) - > setUiHidden ( true ) ;
2018-02-14 06:35:35 -06:00
}
}
2018-08-15 02:44:27 -05:00
QString indentedText ( const QString & text )
{
2018-08-17 02:16:16 -05:00
return QString ( " %1 \n " ) . arg ( text ) ;
2018-08-15 02:44:27 -05:00
}
2018-02-14 06:35:35 -06:00
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
///
2018-02-14 06:35:35 -06:00
//--------------------------------------------------------------------------------------------------
QString RimFractureTemplate : : dFactorSummary ( ) const
{
QString text ;
2018-08-10 07:47:06 -05:00
2018-08-17 02:16:16 -05:00
std : : vector < RimFracture * > fracturesToDisplay ;
{
auto candidateFractures = fracturesUsingThisTemplate ( ) ;
if ( orientationType ( ) ! = ALONG_WELL_PATH )
{
// D-factor values are identical for all fractures, only show summary for the first fracture
if ( ! candidateFractures . empty ( ) )
{
fracturesToDisplay . push_back ( candidateFractures . front ( ) ) ;
}
}
else
{
fracturesToDisplay = candidateFractures ;
}
}
for ( auto f : fracturesToDisplay )
2018-08-15 02:44:27 -05:00
{
f - > ensureValidNonDarcyProperties ( ) ;
2018-08-17 02:16:16 -05:00
if ( orientationType ( ) = = ALONG_WELL_PATH )
{
text + = QString ( " Fracture name : %1 " ) . arg ( f - > name ( ) ) ;
}
2018-08-15 02:44:27 -05:00
2018-08-17 02:16:16 -05:00
text + = " <pre> " ;
{
auto val = f - > nonDarcyProperties ( ) . dFactor ;
text + = indentedText ( QString ( " D-factor : %1 " ) . arg ( val ) ) ;
2018-02-14 06:35:35 -06:00
2018-08-17 02:16:16 -05:00
auto alpha = RiaDefines : : nonDarcyFlowAlpha ( m_fractureTemplateUnit ( ) ) ;
text + = indentedText ( QString ( " α : %1 " ) . arg ( alpha ) ) ;
2018-02-14 06:35:35 -06:00
2018-09-24 08:10:46 -05:00
auto beta = getOrComputeBetaFactor ( f ) ;
2018-08-17 02:16:16 -05:00
text + = indentedText ( QString ( " β : %1 " ) . arg ( beta ) ) ;
2018-02-14 06:35:35 -06:00
2018-08-17 02:16:16 -05:00
double effPerm = f - > nonDarcyProperties ( ) . effectivePermeability ;
text + = indentedText ( QString ( " Ke : %1 " ) . arg ( effPerm ) ) ;
2018-02-14 06:35:35 -06:00
2018-08-17 02:16:16 -05:00
double gamma = m_relativeGasDensity ;
text + = indentedText ( QString ( " γ : %1 " ) . arg ( gamma ) ) ;
2018-02-14 06:35:35 -06:00
2018-08-17 02:16:16 -05:00
auto h = f - > nonDarcyProperties ( ) . width ;
text + = indentedText ( QString ( " h : %1 " ) . arg ( h ) ) ;
2018-02-14 06:35:35 -06:00
2018-08-17 02:16:16 -05:00
auto wellRadius = f - > nonDarcyProperties ( ) . eqWellRadius ;
text + = indentedText ( QString ( " rw : %1 " ) . arg ( wellRadius ) ) ;
2018-02-14 06:35:35 -06:00
2018-08-17 02:16:16 -05:00
auto mu = m_gasViscosity ;
text + = indentedText ( QString ( " μ : %1 " ) . arg ( mu ) ) ;
}
text + = " </pre> " ;
2018-08-15 02:44:27 -05:00
text + = " <br> " ;
}
2018-02-14 06:35:35 -06:00
return text ;
}
2018-08-17 02:16:16 -05:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
double RimFractureTemplate : : dFactorForTemplate ( ) const
{
if ( orientationType ( ) = = ALONG_WELL_PATH )
{
return std : : numeric_limits < double > : : infinity ( ) ;
}
return computeDFactor ( nullptr ) ;
}
2018-02-14 06:35:35 -06:00
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
///
2018-02-14 06:35:35 -06:00
//--------------------------------------------------------------------------------------------------
2018-08-15 02:44:27 -05:00
double RimFractureTemplate : : computeEffectivePermeability ( const RimFracture * fractureInstance ) const
2018-02-14 06:35:35 -06:00
{
if ( m_permeabilityType ( ) = = RimFractureTemplate : : USER_DEFINED_PERMEABILITY )
{
2018-02-15 08:38:27 -06:00
return m_userDefinedEffectivePermeability ;
2018-02-14 06:35:35 -06:00
}
else
{
2018-06-28 07:44:52 -05:00
double fracPermeability = 0.0 ;
2018-09-24 08:10:46 -05:00
auto values = wellFractureIntersectionData ( fractureInstance ) ;
2018-06-28 07:44:52 -05:00
if ( values . isWidthAndPermeabilityDefined ( ) )
{
fracPermeability = values . m_permeability ;
}
else
{
auto conductivity = values . m_conductivity ;
2018-08-15 02:44:27 -05:00
auto width = computeFractureWidth ( fractureInstance ) ;
2018-06-28 07:44:52 -05:00
2018-09-24 08:10:46 -05:00
if ( fabs ( width ) < 1e-10 ) return std : : numeric_limits < double > : : infinity ( ) ;
2018-02-14 06:35:35 -06:00
2018-06-28 07:44:52 -05:00
fracPermeability = conductivity / width ;
}
2018-02-14 06:35:35 -06:00
2018-02-15 08:38:27 -06:00
return fracPermeability * m_relativePermeability ;
2018-02-14 06:35:35 -06:00
}
}
2018-08-17 02:16:16 -05:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
double RimFractureTemplate : : computeWellRadiusForDFactorCalculation ( const RimFracture * fractureInstance ) const
{
double radius = 0.0 ;
if ( m_orientationType = = ALONG_WELL_PATH & & fractureInstance )
{
auto perforationLength = fractureInstance - > perforationLength ( ) ;
radius = perforationLength / cvf : : PI_D ;
}
else
{
radius = m_wellDiameter / 2.0 ;
}
return radius ;
}
2018-02-14 06:35:35 -06:00
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
///
2018-02-14 06:35:35 -06:00
//--------------------------------------------------------------------------------------------------
2018-08-15 02:44:27 -05:00
double RimFractureTemplate : : computeDFactor ( const RimFracture * fractureInstance ) const
2018-02-14 06:35:35 -06:00
{
2018-03-05 03:20:47 -06:00
double d ;
2018-02-15 14:43:35 -06:00
if ( m_nonDarcyFlowType = = RimFractureTemplate : : NON_DARCY_USER_DEFINED )
{
2018-03-05 03:20:47 -06:00
d = m_userDefinedDFactor ;
2018-02-15 14:43:35 -06:00
}
2018-03-05 03:20:47 -06:00
else
{
2018-08-17 02:16:16 -05:00
double radius = computeWellRadiusForDFactorCalculation ( fractureInstance ) ;
double alpha = RiaDefines : : nonDarcyFlowAlpha ( m_fractureTemplateUnit ( ) ) ;
2018-09-24 08:10:46 -05:00
double beta = getOrComputeBetaFactor ( fractureInstance ) ;
2018-08-17 02:16:16 -05:00
double effPerm = computeEffectivePermeability ( fractureInstance ) ;
double gamma = m_relativeGasDensity ;
2018-02-15 14:43:35 -06:00
2018-08-17 02:16:16 -05:00
double mu = m_gasViscosity ;
double h = computeFractureWidth ( fractureInstance ) ;
2018-03-05 03:20:47 -06:00
2018-08-10 07:47:06 -05:00
double numerator = alpha * beta * effPerm * gamma ;
2018-03-05 03:20:47 -06:00
double denumerator = h * radius * mu ;
2018-02-14 06:35:35 -06:00
2018-09-24 08:10:46 -05:00
if ( denumerator < 1e-10 ) return std : : numeric_limits < double > : : infinity ( ) ;
2018-02-14 06:35:35 -06:00
2018-03-05 03:20:47 -06:00
d = numerator / denumerator ;
2018-08-15 02:44:27 -05:00
if ( m_orientationType = = ALONG_WELL_PATH )
{
// Correction for linear inflow into the well
// Dlinear = cgeometric * Dradial
// Dlinear = 1.2 * Dradial
d * = 1.2 ;
}
2018-03-05 03:20:47 -06:00
}
2018-02-14 06:35:35 -06:00
2018-03-05 03:20:47 -06:00
return d * m_dFactorScaleFactor ;
2018-02-14 06:35:35 -06:00
}
2018-02-16 00:58:07 -06:00
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
///
2018-02-16 00:58:07 -06:00
//--------------------------------------------------------------------------------------------------
2018-08-15 02:44:27 -05:00
double RimFractureTemplate : : computeKh ( const RimFracture * fractureInstance ) const
2018-02-16 00:58:07 -06:00
{
2018-03-20 04:48:06 -05:00
// kh = permeability * h
// conductivity = permeability * h
2018-09-24 08:10:46 -05:00
auto values = wellFractureIntersectionData ( fractureInstance ) ;
2018-06-28 07:44:52 -05:00
if ( values . isConductivityDefined ( ) )
2018-03-20 04:48:06 -05:00
{
// If conductivity is found in stim plan file, use this directly
return values . m_conductivity ;
}
2018-08-10 07:47:06 -05:00
2018-08-15 02:44:27 -05:00
return computeEffectivePermeability ( fractureInstance ) * computeFractureWidth ( fractureInstance ) ;
2018-02-16 00:58:07 -06:00
}
2018-02-21 02:50:50 -06:00
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
///
2018-02-21 02:50:50 -06:00
//--------------------------------------------------------------------------------------------------
void RimFractureTemplate : : convertToUnitSystem ( RiaEclipseUnitTools : : UnitSystem neededUnit )
{
2018-03-09 02:40:10 -06:00
if ( neededUnit = = RiaEclipseUnitTools : : UNITS_METRIC )
2018-02-21 02:50:50 -06:00
{
m_perforationLength = RiaEclipseUnitTools : : feetToMeter ( m_perforationLength ) ;
m_wellDiameter = RiaEclipseUnitTools : : inchToMeter ( m_wellDiameter ) ;
2018-02-21 12:25:05 -06:00
m_fractureWidth = RiaEclipseUnitTools : : feetToMeter ( m_fractureWidth ) ;
2018-02-21 02:50:50 -06:00
}
2018-03-09 02:40:10 -06:00
else if ( neededUnit = = RiaEclipseUnitTools : : UNITS_FIELD )
2018-02-21 02:50:50 -06:00
{
m_perforationLength = RiaEclipseUnitTools : : meterToFeet ( m_perforationLength ) ;
m_wellDiameter = RiaEclipseUnitTools : : meterToInch ( m_wellDiameter ) ;
2018-02-21 12:25:05 -06:00
m_fractureWidth = RiaEclipseUnitTools : : meterToFeet ( m_fractureWidth ) ;
2018-02-21 02:50:50 -06:00
}
}
2018-02-21 12:07:03 -06:00
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
///
2018-02-21 12:07:03 -06:00
//--------------------------------------------------------------------------------------------------
void RimFractureTemplate : : disconnectAllFracturesAndRedrawViews ( ) const
{
// The unit has changed. Disconnect all fractures referencing this fracture template to avoid mix of units between fracture
// and template
2018-08-15 02:44:27 -05:00
for ( auto fracture : fracturesUsingThisTemplate ( ) )
2018-02-21 12:07:03 -06:00
{
if ( fracture )
{
fracture - > setFractureTemplate ( nullptr ) ;
}
}
RimProject * proj ;
this - > firstAncestorOrThisOfType ( proj ) ;
if ( proj )
{
2018-09-11 05:41:45 -05:00
proj - > scheduleCreateDisplayModelAndRedrawAllViews ( ) ;
2018-02-21 12:07:03 -06:00
}
}
2018-03-02 02:33:17 -06:00
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
///
2018-03-02 02:33:17 -06:00
//--------------------------------------------------------------------------------------------------
void RimFractureTemplate : : setId ( int id )
{
m_id = id ;
}
2018-03-02 07:33:47 -06:00
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
///
2018-03-02 07:33:47 -06:00
//--------------------------------------------------------------------------------------------------
2018-09-14 01:25:27 -05:00
void RimFractureTemplate : : setScaleFactors ( double halfLengthScale ,
double heightScale ,
double dFactorScale ,
double conductivityScale )
2018-03-02 07:33:47 -06:00
{
2018-09-14 01:25:27 -05:00
m_halfLengthScaleFactor = halfLengthScale ;
2018-08-10 07:47:06 -05:00
m_heightScaleFactor = heightScale ;
m_dFactorScaleFactor = dFactorScale ;
2018-06-29 03:57:26 -05:00
m_conductivityScaleFactor = conductivityScale ;
2018-08-15 02:44:27 -05:00
for ( RimFracture * fracture : fracturesUsingThisTemplate ( ) )
{
fracture - > clearCachedNonDarcyProperties ( ) ;
}
2018-06-29 03:57:26 -05:00
}
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
///
2018-06-29 03:57:26 -05:00
//--------------------------------------------------------------------------------------------------
2018-09-14 01:25:27 -05:00
void RimFractureTemplate : : scaleFactors ( double * halfLengthScale ,
2018-08-10 07:47:06 -05:00
double * heightScale ,
double * dFactorScale ,
double * conductivityScale ) const
2018-06-29 03:57:26 -05:00
{
2018-09-14 01:25:27 -05:00
CVF_ASSERT ( halfLengthScale & & heightScale & & dFactorScale & & conductivityScale ) ;
2018-06-29 03:57:26 -05:00
2018-09-14 01:25:27 -05:00
* halfLengthScale = m_halfLengthScaleFactor ;
* heightScale = m_heightScaleFactor ;
2018-08-10 07:47:06 -05:00
* dFactorScale = m_dFactorScaleFactor ;
2018-06-29 03:57:26 -05:00
* conductivityScale = m_conductivityScaleFactor ;
2018-03-02 07:33:47 -06:00
}
2018-03-05 07:17:18 -06:00
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
///
2018-03-05 07:17:18 -06:00
//--------------------------------------------------------------------------------------------------
void RimFractureTemplate : : setContainmentTopKLayer ( int topKLayer )
{
m_fractureContainment - > setTopKLayer ( topKLayer ) ;
}
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
///
2018-03-05 07:17:18 -06:00
//--------------------------------------------------------------------------------------------------
void RimFractureTemplate : : setContainmentBaseKLayer ( int baseKLayer )
{
m_fractureContainment - > setBaseKLayer ( baseKLayer ) ;
}
2018-02-14 06:35:35 -06:00
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
///
2018-02-14 06:35:35 -06:00
//--------------------------------------------------------------------------------------------------
2018-08-15 02:44:27 -05:00
double RimFractureTemplate : : computeFractureWidth ( const RimFracture * fractureInstance ) const
2018-02-14 06:35:35 -06:00
{
2018-02-15 13:01:41 -06:00
if ( m_fractureWidthType = = RimFractureTemplate : : WIDTH_FROM_FRACTURE )
2018-02-09 00:26:48 -06:00
{
2018-09-24 08:10:46 -05:00
auto values = wellFractureIntersectionData ( fractureInstance ) ;
2018-08-10 07:47:06 -05:00
2018-02-14 06:35:35 -06:00
return values . m_width ;
2017-04-19 04:00:52 -05:00
}
2018-02-15 13:01:41 -06:00
return m_fractureWidth ;
2017-04-19 04:00:52 -05:00
}
2017-06-08 02:15:50 -05:00
2018-09-24 08:10:46 -05:00
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
double RimFractureTemplate : : getOrComputeBetaFactor ( const RimFracture * fractureInstance ) const
{
if ( m_betaFactorType = = RimFractureTemplate : : BETA_FACTOR_FROM_FRACTURE )
{
auto values = wellFractureIntersectionData ( fractureInstance ) ;
return values . m_betaFactorInForcheimerUnits ;
}
return m_inertialCoefficient ;
}
2018-09-13 01:32:27 -05:00
//--------------------------------------------------------------------------------------------------
2018-09-14 01:25:27 -05:00
///
2018-09-13 01:32:27 -05:00
//--------------------------------------------------------------------------------------------------
void RimFractureTemplate : : loadDataAndUpdateGeometryHasChanged ( )
{
onLoadDataAndUpdateGeometryHasChanged ( ) ;
}
2018-02-19 06:54:29 -06:00
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
///
2018-02-19 06:54:29 -06:00
//--------------------------------------------------------------------------------------------------
2018-08-15 02:44:27 -05:00
std : : vector < RimFracture * > RimFractureTemplate : : fracturesUsingThisTemplate ( ) const
{
std : : vector < RimFracture * > fractures ;
2018-08-15 05:55:45 -05:00
this - > objectsWithReferringPtrFieldsOfType ( fractures ) ;
2018-08-15 02:44:27 -05:00
return fractures ;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
2018-09-24 08:10:46 -05:00
bool RimFractureTemplate : : isBetaFactorAvailableOnFile ( ) const
{
return false ;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
2018-02-19 06:54:29 -06:00
QString RimFractureTemplate : : nameAndUnit ( ) const
{
QString decoratedName ;
if ( m_fractureTemplateUnit = = RiaEclipseUnitTools : : UNITS_METRIC )
{
decoratedName + = " [M] - " ;
}
else if ( m_fractureTemplateUnit = = RiaEclipseUnitTools : : UNITS_FIELD )
{
decoratedName + = " [F] - " ;
}
decoratedName + = m_name ;
return decoratedName ;
}
2017-06-15 03:49:27 -05:00
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
///
2017-06-15 03:49:27 -05:00
//--------------------------------------------------------------------------------------------------
2018-08-10 07:28:52 -05:00
double RimFractureTemplate : : wellDiameter ( ) const
2017-06-15 03:49:27 -05:00
{
2018-02-21 02:10:08 -06:00
return m_wellDiameter ;
2017-06-15 03:49:27 -05:00
}
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
///
2017-06-15 03:49:27 -05:00
//--------------------------------------------------------------------------------------------------
2018-08-10 07:28:52 -05:00
double RimFractureTemplate : : perforationLength ( ) const
2017-06-15 03:49:27 -05:00
{
2018-02-21 02:10:08 -06:00
return m_perforationLength ;
2017-06-15 03:49:27 -05:00
}
2017-06-20 04:18:19 -05:00
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
///
2017-06-20 04:18:19 -05:00
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
const RimFractureContainment * RimFractureTemplate : : fractureContainment ( ) const
2017-06-20 04:18:19 -05:00
{
return m_fractureContainment ( ) ;
}
2018-02-08 04:34:18 -06:00
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
///
2018-02-08 04:34:18 -06:00
//--------------------------------------------------------------------------------------------------
RimFractureTemplate : : FracConductivityEnum RimFractureTemplate : : conductivityType ( ) const
{
return m_conductivityType ( ) ;
}
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
///
2018-02-08 04:34:18 -06:00
//--------------------------------------------------------------------------------------------------
float RimFractureTemplate : : azimuthAngle ( ) const
{
return m_azimuthAngle ;
}
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
///
2018-02-08 04:34:18 -06:00
//--------------------------------------------------------------------------------------------------
float RimFractureTemplate : : skinFactor ( ) const
{
return m_skinFactor ;
}
2017-06-08 02:15:50 -05:00
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
///
2017-06-08 02:15:50 -05:00
//--------------------------------------------------------------------------------------------------
void RimFractureTemplate : : setDefaultWellDiameterFromUnit ( )
{
2018-02-08 06:57:43 -06:00
if ( m_fractureTemplateUnit = = RiaEclipseUnitTools : : UNITS_FIELD )
2017-06-08 02:15:50 -05:00
{
2018-02-08 04:34:18 -06:00
m_wellDiameter = 8.5 ;
2017-06-08 02:15:50 -05:00
}
2018-02-08 06:57:43 -06:00
else if ( m_fractureTemplateUnit = = RiaEclipseUnitTools : : UNITS_METRIC )
2017-06-08 02:15:50 -05:00
{
2018-02-08 04:34:18 -06:00
m_wellDiameter = 0.216 ;
2017-06-08 02:15:50 -05:00
}
2018-01-10 00:44:26 -06:00
}
2018-02-16 00:58:07 -06:00
//--------------------------------------------------------------------------------------------------
2018-08-10 07:47:06 -05:00
///
2018-02-16 00:58:07 -06:00
//--------------------------------------------------------------------------------------------------
bool RimFractureTemplate : : isNonDarcyFlowEnabled ( ) const
{
return m_nonDarcyFlowType ( ) ! = RimFractureTemplate : : NON_DARCY_NONE ;
}