SUBROUTINE WellPressureDataTransfer !! This subroutine calculates pressure distribution in well !! We divide well hydraulic system to 4 zones. 1- pump to string zone; this zone is horizontal !! 2- string zone; this zone includes drill pipes and collars and is vertical or neraly vertical !! 3- annulus zone; this zone includes annulus space between string and openhole or casing !! 4- Openhole zone; this zone includes spaces under bit to bottom of the wellbore !! The last two zone includes annulus space and open hole, are influenced by kicks and have crucial role in !! computing pressure distribution because reference point (back pressure in well head open condition !! and bottomhole pressure in well head closed condition) are in one of them. because of this, pressure !! distribution calculates in two subroutines : PressureAnnAndOHDistribution and PressurePumptoBitDistribution !! pressure change through well consist of pressure change due to friction, change of elevation and acceleration !! frictional pressure drop calculated by subroutine Sub_Press_Drop_Calculator !! This subroutine includes hydrostatic pressure and later will include effect of corss-section area change !! which causes acceleration or decceleration of flow USE FricPressDropVarsModule use MudSystemModule USE MudSystemVARIABLES use SimulationVariables !@@@ USE GeoElements_FluidModule USE Fluid_Flow_Startup_Vars use KickVARIABLESModule ! USE CMudPropertiesVariables ! USE CBopStackVariables ! USE sROP_Variables ! USE CHOKEVARIABLES ! use CChokeManifoldVariables ! use SimulationVariables ! USE CBitProblemsVariables ! USE CChokeProblemsVariables ! USE CStringConfigurationVariables ! use CDataDisplayConsole IMPLICIT NONE INTEGER :: i , j REAL :: InstantaneousTotalOpenChokeArea , VolumeDensityProduct ChokeIsClosing = .FALSE. data%State%FricPressDrop%Kchoke = 0.0 data%State%FricPressDrop%KBit = 0.0 !!!!!!!!!!!!!!!! bit is present BitTrue = data%Configuration%StringConfiguration%StringConfigurations(1)%ComponentType == Bit_ComponentType ! Bit_ComponentType = 0 BitCd = 0.98 BitNozzDia = 32.0 * data%Configuration%StringConfiguration%BitDefinition%BitNozzleSize ! nozzle diameter in 1/32 in BitNozzleArea = 7.6699E-4 * BitNozzDia**2 BitNozzleNum = data%Configuration%StringConfiguration%BitDefinition%BitNozzleNo - data%State%FricPressDrop%BitJetsPlugged * data%problems%BitProblems%PlugJetsCount BitTotNozzArea = BitNozzleNum * BitNozzleArea + 0.5 * data%State%FricPressDrop%BitJetsWashedOut * data%problems%BitProblems%JetWashoutCount * BitNozzleArea IF (BitNozzleNum == 0) THEN data%State%FricPressDrop%BitTotallyPluged = .TRUE. ELSE data%State%FricPressDrop%BitTotallyPluged = .FALSE. END IF data%State%FricPressDrop%FloatValveIn = data%Configuration%StringConfiguration%BitDefinition%FloatValve !FloatValveOpen = .TRUE. !IF (JetWashoutCount > 0 .OR. PlugJetsCount > 0) THEN ! WRITE (*,*) 'PlugJetsCount' , PlugJetsCount ! WRITE (*,*) 'JetWashoutCount', JetWashoutCount !END IF !WRITE (*,*) 'BitNozzleNum', BitNozzleNum !WRITE (*,*) 'BitTotNozzArea', BitTotNozzArea !WRITE (*,*) 'Float Valve??', BitDefinition%FloatValve !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! IF(ALLOCATED(GasPocketFlowEl)) DEALLOCATE(GasPocketFlowEl) !!!!!!!!!!!!!!!!!!!! Well Head Condition ( Open or Closed ) ChokeKroneckerDelta = 0 IF (data%State%MudSystem%WellToPitsOpen == .FALSE. .AND. data%State%MudSystem%WellToChokeManifoldOpen == .FALSE.) THEN WellHeadOpen = .FALSE. !WRITE (*,*) ' Well Head is closed ' ELSE WellHeadOpen = .TRUE. END IF IF (data%State%MudSystem%WellToPitsOpen == .FALSE. .AND. data%State%MudSystem%WellToChokeManifoldOpen) ChokeKroneckerDelta = 1 !WRITE (*,*) ' WelltoPitsOpen=' , WelltoPitsOpen, 'WellToChokeManifoldOpen= ' , WellToChokeManifoldOpen !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! data%State%FricPressDrop%NoHorizontalEl = data%State%MudSystem%NoHorizontalMudElements data%State%FricPressDrop%NoStringEl = data%State%MudSystem%NoStringMudElements data%State%FricPressDrop%NoAnnulusEl = data%State%MudSystem%NoCasingMudElements data%State%FricPressDrop%NoWellToChokeEl = 0 IF (ChokeKroneckerDelta == 1) data%State%FricPressDrop%NoWellToChokeEl = data%State%MudSystem%ChokeLine_Density%Length() data%State%FricPressDrop%NoOpenHoleEl = data%State%MudSystem%NoBottomHoleMudElements data%State%FricPressDrop%NumbEl = data%State%FricPressDrop%NoHorizontalEl + data%State%FricPressDrop%NoStringEl + data%State%FricPressDrop%NoAnnulusEl + data%State%FricPressDrop%NoWellToChokeEl + data%State%FricPressDrop%NoOpenHoleEl IF(ALLOCATED(FlowEl)) then DEALLOCATE(FlowEl) endif ALLOCATE(FlowEl(data%State%FricPressDrop%NumbEl)) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Transfering Data from module:MudSystemVARIABLES to module:FricPressDropVars to calculate Pressure distribution in flow path !!!!!!!!!!!!!!!!!!!!!!! Horizontal line !WRITE (*,*) 'H', NoHorizontalEl DO i = 1 , data%State%FricPressDrop%NoHorizontalEl ! WRITE (*,*) 'H , i' , i FlowEl(i)%StartX = data%State%MudSystem%Xstart_MudElement%Array(i) !WRITE (*,*) 'StartX', FlowEl(i)%StartX FlowEl(i)%EndX = data%State%MudSystem%Xend_MudElement%Array(i) !WRITE (*,*) 'Endx', FlowEl(i)%EndX FlowEl(i)%StartTVD = 0.d0 FlowEl(i)%EndTVD = 0.d0 FlowEl(i)%Id = 0.0 FlowEl(i)%Od = data%State%MudSystem%PipeOD_MudElement%Array(i) FlowEl(i)%density = data%State%MudSystem%Density_MudElement%Array(i) FlowEl(i)%Dhyd = FlowEl(i)%Od FlowEl(i)%Length = ABS(FlowEl(i)%EndX - FlowEl(i)%StartX) FlowEl(i)%DepthDiff = 0.d0 FlowEl(i)%Volume = PI / 4.0 * FlowEl(i)%Od**2 * REAL(FlowEl(i)%Length) / Convfttoinch**2 IF (data%State%MudSystem%MudType_MudElement%Array(i) == 0) THEN ! = 0 for mud, = 1 for gas kick, = 4 for air FlowEl(i)%MaterialType = 0 ELSE IF (data%State%MudSystem%MudType_MudElement%Array(i) == 4) THEN FlowEl(i)%MaterialType = 4 ELSE FlowEl(i)%MaterialType = 1 END IF FlowEl(i)%dPdLgrav = 0.0 FlowEl(i)%StaticPressDiff = 0.0 END DO !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!! String data%State%FricPressDrop%StringFirstEl = data%State%FricPressDrop%NoHorizontalEl + 1 data%State%FricPressDrop%StringLastEl = data%State%FricPressDrop%NoHorizontalEl + data%State%FricPressDrop%NoStringEl DO i = data%State%FricPressDrop%NoHorizontalEl + 1 , data%State%FricPressDrop%NoHorizontalEl + data%State%FricPressDrop%NoStringEl ! WRITE (*,*) 'ST , i' , i FlowEl(i)%StartX = data%State%MudSystem%Xstart_MudElement%Array(i) !WRITE (*,*) 'StartX', FlowEl(i)%StartX FlowEl(i)%EndX = data%State%MudSystem%Xend_MudElement%Array(i) !WRITE (*,*) 'Endx', FlowEl(i)%EndX FlowEl(i)%StartTVD = data%State%MudSystem%TVDstart_MudElement%Array(i) !WRITE (*,*) 'StartTVD', FlowEl(i)%StartTVD FlowEl(i)%EndTVD = data%State%MudSystem%TVDend_MudElement%Array(i) !WRITE (*,*) 'EndTVD', FlowEl(i)%EndTVD FlowEl(i)%Id = 0.0 !WRITE (*,*) 'Id', FlowEl(i)%Id FlowEl(i)%Od = data%State%MudSystem%PipeOD_MudElement%Array(i) !WRITE (*,*) 'Od', FlowEl(i)%Od FlowEl(i)%Density = data%State%MudSystem%Density_MudElement%Array(i) !WRITE (*,*) 'Density', FlowEl(i)%Density FlowEl(i)%Dhyd = FlowEl(i)%Od FlowEl(i)%Length = ABS(FlowEl(i)%EndX - FlowEl(i)%StartX) !WRITE (*,*) 'Length', FlowEl(i)%Length FlowEl(i)%DepthDiff = ABS(FlowEl(i)%StartTVD - FlowEl(i)%EndTVD) !WRITE (*,*) 'DepthDiff', FlowEl(i)%DepthDiff FlowEl(i)%Area = PI / 4.0 * FlowEl(i)%Od**2 / Convfttoinch**2 FlowEl(i)%Volume = FlowEl(i)%Area * REAL(FlowEl(i)%Length) IF (data%State%MudSystem%MudType_MudElement%Array(i) == 0) THEN ! = 0 for mud, = 1 for gas kick, = 4 for air FlowEl(i)%MaterialType = 0 ELSE IF (data%State%MudSystem%MudType_MudElement%Array(i) == 4) THEN FlowEl(i)%MaterialType = 4 ELSE FlowEl(i)%MaterialType = 1 END IF IF (FlowEl(i)%MaterialType == 1 .OR. FlowEl(i)%MaterialType == 4) THEN FlowEl(i)%dPdLgrav = 0.0 ELSE FlowEl(i)%dPdLgrav = 0.052 * FlowEl(i)%Density END IF FlowEl(i)%StaticPressDiff = FlowEl(i)%dPdLgrav * REAL(FlowEl(i)%DepthDiff) END DO !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!! Annulus data%State%FricPressDrop%AnnulusFirstEl = data%State%FricPressDrop%NoHorizontalEl + data%State%FricPressDrop%NoStringEl + 1 data%State%FricPressDrop%AnnulusLastEl = data%State%FricPressDrop%NoHorizontalEl + data%State%FricPressDrop%NoStringEl + data%State%FricPressDrop%NoAnnulusEl DO i = data%State%FricPressDrop%NoHorizontalEl + data%State%FricPressDrop%NoStringEl + 1 , data%State%FricPressDrop%NoHorizontalEl + data%State%FricPressDrop%NoStringEl + data%State%FricPressDrop%NoAnnulusEl ! WRITE (*,*) 'AN , i' , i FlowEl(i)%StartX = data%State%MudSystem%Xstart_MudElement%Array(i) !WRITE (*,*) 'StartX', FlowEl(i)%StartX FlowEl(i)%EndX = data%State%MudSystem%Xend_MudElement%Array(i) !WRITE (*,*) 'Endx', FlowEl(i)%EndX FlowEl(i)%StartTVD = data%State%MudSystem%TVDstart_MudElement%Array(i) FlowEl(i)%EndTVD = data%State%MudSystem%TVDend_MudElement%Array(i) FlowEl(i)%Id = data%State%MudSystem%PipeID_MudElement%Array(i) FlowEl(i)%Od = data%State%MudSystem%PipeOD_MudElement%Array(i) FlowEl(i)%Density = data%State%MudSystem%Density_MudElement%Array(i) FlowEl(i)%Dhyd = FlowEl(i)%Od - FlowEl(i)%Id FlowEl(i)%Length = ABS(FlowEl(i)%EndX - FlowEl(i)%StartX) FlowEl(i)%DepthDiff = ABS(FlowEl(i)%StartTVD - FlowEl(i)%EndTVD) FlowEl(i)%Area = PI / 4.0 * (FlowEl(i)%Od**2 - FlowEl(i)%Id**2) / Convfttoinch**2 FlowEl(i)%Volume = FlowEl(i)%Area * REAL(FlowEl(i)%Length) IF (data%State%MudSystem%MudType_MudElement%Array(i) == 0) THEN ! = 0 for mud, = 1 for gas kick, = 4 for air FlowEl(i)%MaterialType = 0 ELSE IF (data%State%MudSystem%MudType_MudElement%Array(i) == 4) THEN FlowEl(i)%MaterialType = 4 ELSE FlowEl(i)%MaterialType = 1 END IF IF (FlowEl(i)%MaterialType == 1 .OR. FlowEl(i)%MaterialType == 4) THEN FlowEl(i)%dPdLgrav = 0.0 ELSE FlowEl(i)%dPdLgrav = 0.052 * FlowEl(i)%density END IF FlowEl(i)%StaticPressDiff = FlowEl(i)%dPdLgrav * REAL(FlowEl(i)%DepthDiff) END DO !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! Well to choke manifold path j = 1 DO i = data%State%FricPressDrop%NoHorizontalEl + data%State%FricPressDrop%NoStringEl + data%State%FricPressDrop%NoAnnulusEl + 1 , data%State%FricPressDrop%NoHorizontalEl + data%State%FricPressDrop%NoStringEl + data%State%FricPressDrop%NoAnnulusEl + data%State%FricPressDrop%NoWelltoChokeEl ! WRITE (*,*) 'CH , i' , i FlowEl(i)%StartX = data%State%MudSystem%ChokeLine_Mud_Backhead_X%Array(j) !WRITE (*,*) 'StartX', FlowEl(i)%StartX FlowEl(i)%EndX = data%State%MudSystem%ChokeLine_Mud_Forehead_X%Array(j) !WRITE (*,*) 'Endx', FlowEl(i)%EndX FlowEl(i)%StartTVD = 0.d0 FlowEl(i)%EndTVD = 0.d0 FlowEl(i)%Id = 0.0 FlowEl(i)%Od = data%Configuration%BopStack%ChokeLineId FlowEl(i)%density = data%State%MudSystem%ChokeLine_Density%Array(j) FlowEl(i)%Dhyd = FlowEl(i)%Od FlowEl(i)%Length = ABS(FlowEl(i)%EndX - FlowEl(i)%StartX) FlowEl(i)%DepthDiff = 0.d0 FlowEl(i)%Area = PI / 4.0 * FlowEl(i)%Od**2 / Convfttoinch**2 FlowEl(i)%Volume = FlowEl(i)%Area * REAL(FlowEl(i)%Length) IF (data%State%MudSystem%ChokeLine_MudOrKick%Array(j) == 0 .OR. data%State%MudSystem%ChokeLine_MudOrKick%Array(j) == 4) THEN ! = 0 for mud, = 1 for gas kick, = 4 for air FlowEl(i)%MaterialType = data%State%MudSystem%ChokeLine_MudOrKick%Array(j) ELSE FlowEl(i)%MaterialType = 1 END IF FlowEl(i)%dPdLgrav = 0.0 FlowEl(i)%StaticPressDiff = 0.0 !WRITE (*,*) 'Ch density, length, Type' , i, FlowEl(i)%density , FlowEl(i)%length, FlowEl(i)%MaterialType j = j + 1 END DO !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! Open Hole data%State%FricPressDrop%OpenholeFirstEl = data%State%FricPressDrop%NoHorizontalEl + data%State%FricPressDrop%NoStringEl + data%State%FricPressDrop%NoAnnulusEl + data%State%FricPressDrop%NoWelltoChokeEl + 1 j = 1 DO i = data%State%FricPressDrop%OpenholeFirstEl , data%State%FricPressDrop%NumbEl ! = NoHorizontalEl + NoStringEl + NoCasingEl + NoOpenHoleEl ! WRITE (*,*) 'OP , i' , i FlowEl(i)%StartX = data%State%MudSystem%Xstart_OpMudElement%Array(j) !WRITE (*,*) 'StartX', FlowEl(i)%StartX FlowEl(i)%EndX = data%State%MudSystem%Xend_OpMudElement%Array(j) !WRITE (*,*) 'Endx', FlowEl(i)%EndX FlowEl(i)%StartTVD = data%State%MudSystem%TVDstart_OpMudElement%Array(j) FlowEl(i)%EndTVD = data%State%MudSystem%TVDend_OpMudElement%Array(j) FlowEl(i)%Id = 0.0 FlowEl(i)%Od = data%State%MudSystem%PipeOD_OpMudElement%Array(j) FlowEl(i)%density = data%State%MudSystem%Density_OpMudElement%Array(j) FlowEl(i)%MaterialType = data%State%MudSystem%MudTypeOp_MudElement%Array(j) ! = 0 for mud, = 1 for gas kick, = 4 for air FlowEl(i)%Dhyd = FlowEl(i)%Od FlowEl(i)%Length = ABS(FlowEl(i)%EndX - FlowEl(i)%StartX) FlowEl(i)%DepthDiff = ABS(FlowEl(i)%StartTVD - FlowEl(i)%EndTVD) FlowEl(i)%Area = PI / 4.0 * FlowEl(i)%Od**2 / Convfttoinch**2 FlowEl(i)%Volume = FlowEl(i)%Area * REAL(FlowEl(i)%Length) IF (data%State%MudSystem%MudTypeOp_MudElement%Array(j) == 0) THEN ! = 0 for mud, = 1 for gas kick, = 4 for air FlowEl(i)%MaterialType = 0 ELSE IF (data%State%MudSystem%MudTypeOp_MudElement%Array(j) == 4) THEN FlowEl(i)%MaterialType = 4 ELSE FlowEl(i)%MaterialType = 1 END IF j = j + 1 IF (FlowEl(i)%MaterialType == 1) THEN FlowEl(i)%dPdLgrav = 0.0 ELSE FlowEl(i)%dPdLgrav = 0.052 * FlowEl(i)%density END IF FlowEl(i)%StaticPressDiff = FlowEl(i)%dPdLgrav * REAL(FlowEl(i)%DepthDiff) !WRITE (*,*) 'O density, length, Type of ith element' , i, FlowEl(i)%density , FlowEl(i)%length, FlowEl(i)%MaterialType END DO !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!! Mud Element Viscosity Calculation DO i = 1 , data%State%FricPressDrop%NumbEl IF (FlowEl(i)%MaterialType /= 0) CYCLE IF (FlowEl(i)%density < 8.33) THEN WRITE (*,*) 'H, S, A, Ch, O', data%State%FricPressDrop%NoHorizontalEl , data%State%FricPressDrop%StringFirstEl , data%State%FricPressDrop%AnnulusFirstEl , data%State%FricPressDrop%NoWellToChokeEl , data%State%FricPressDrop%OpenHoleFirstEl WRITE (*,*) 'Element No, Volume(gal), Density(ppg), Type' DO j = 1 , data%State%FricPressDrop%NumbEl WRITE (*,*) j, FlowEl(j)%Volume * ConvFt3toUSGal , FlowEl(j)%Density, FlowEl(j)%MaterialType END DO CALL ErrorStop('Density below water density (8.33)', i) CYCLE END IF FlowEl(i)%Theta600 = Theta600Refrence + 11.0 * (MAX(FlowEl(i)%density , 8.33) - DensityRefrence) FlowEl(i)%Theta300 = Theta300Refrence + 6.0 * (MAX(FlowEl(i)%density , 8.33) - DensityRefrence) !WRITE (*,*) 'i, Theta600, Theta600', i, FlowEl(i)%Theta600, FlowEl(i)%Theta300 END DO !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! FlowEl(:)%FlowRate = 0.0 FlowEl(:)%StartPress = 0.0 FlowEl(:)%EndPress = 0.0 !WRITE (*,*) 'NoGasPocket=' , SIZE(GasPocketWeight%Array) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! data%State%MudSystem%OpenArea32 = ((data%Equipments%ChokeManifold%LeftManualChoke * (1.0 - data%State%FricPressDrop%ManChoke1Plug * REAL(data%problems%ChokeProblems%ManualChoke1PluggedPercent)) / 100.0) + 0.5 * data%State%FricPressDrop%ManChoke1Washout) * data%State%Choke%ChokeAreaFullyOpen data%State%MudSystem%OpenArea33 = data%State%CHOOKE(1)%AreaChokeFinal * Convfttoinch**2 ! (1.d0 - data%State%CHOOKE(1)%PercentClose) * ChokeAreaFullyOpen data%State%MudSystem%OpenArea34 = data%State%CHOOKE(2)%AreaChokeFinal * Convfttoinch**2 ! (1.d0 - data%State%CHOOKE(2)%PercentClose) * ChokeAreaFullyOpen data%State%MudSystem%OpenArea35 = ((data%Equipments%ChokeManifold%RightManualChoke * (1.0 - data%State%FricPressDrop%ManChoke2Plug * REAL(data%problems%ChokeProblems%ManualChoke2PluggedPercent)) / 100.0) + 0.5 * data%State%FricPressDrop%ManChoke2Washout) * data%State%Choke%ChokeAreaFullyOpen !write(*,*) 'OpenArea32=' , OpenArea32, active32, ManChoke1Plug, ManualChoke1PluggedPercent, ManChoke1Washout !write(*,*) 'OpenArea33=' , OpenArea33, active33 !write(*,*) 'OpenArea34=' , OpenArea34, active34, !HydraulicChoke2PluggedPercent !write(*,*) 'OpenArea35=' , OpenArea35, active35, ManChoke2Plug, ManualChoke2PluggedPercent, ManChoke2Washout InstantaneousTotalOpenChokeArea = data%State%MudSystem%OpenArea32 * active32 + data%State%MudSystem%OpenArea33 * active33 + data%State%MudSystem%OpenArea34 * active34 + data%State%MudSystem%OpenArea35 * active35 + data%State%FricPressDrop%ChokeBypassArea * active29 data%State%FricPressDrop%OldTotalOpenChokeArea = data%State%FricPressDrop%TotalOpenChokeArea !WRITE (*,*) 'Instantaneous / Old TotalOpenChokeArea', InstantaneousTotalOpenChokeArea, OldTotalOpenChokeArea IF (data%State%FricPressDrop%OldTotalOpenChokeArea <= 0.01 * data%State%Choke%ChokeAreaFullyOpen) data%State%FricPressDrop%OldTotalOpenChokeArea = 0.01 * data%State%Choke%ChokeAreaFullyOpen IF (InstantaneousTotalOpenChokeArea <= 0.01 * data%State%Choke%ChokeAreaFullyOpen) THEN data%State%MudSystem%WellToChokeManifoldOpen = .FALSE. data%State%FricPressDrop%OldTotalOpenChokeArea = 0.01 * data%State%Choke%ChokeAreaFullyOpen !WRITE (*,*) ' Choke Controler Here 2' ELSE IF (InstantaneousTotalOpenChokeArea > 0.5 * data%State%Choke%ChokeAreaFullyOpen .OR. data%State%MudSystem%WellToPitsOpen) THEN ! mud flows through well to bell nipple, or choke is rather open data%State%FricPressDrop%TotalOpenChokeArea = InstantaneousTotalOpenChokeArea !WRITE (*,*) ' Choke Controler Here 1' ELSE IF (InstantaneousTotalOpenChokeArea > data%State%FricPressDrop%OldTotalOpenChokeArea) THEN data%State%FricPressDrop%TotalOpenChokeArea = MIN(1.1 * data%State%FricPressDrop%OldTotalOpenChokeArea , InstantaneousTotalOpenChokeArea) WRITE (*,*) ' Choke is opening' !, TotalOpenChokeArea, OldTotalOpenChokeArea, InstantaneousTotalOpenChokeArea ELSE IF (InstantaneousTotalOpenChokeArea < data%State%FricPressDrop%OldTotalOpenChokeArea) THEN data%State%FricPressDrop%TotalOpenChokeArea = MAX(0.9 * data%State%FricPressDrop%OldTotalOpenChokeArea , InstantaneousTotalOpenChokeArea) WRITE (*,*) ' Choke is closing' !, TotalOpenChokeArea, OldTotalOpenChokeArea, InstantaneousTotalOpenChokeArea ELSE data%State%FricPressDrop%TotalOpenChokeArea = InstantaneousTotalOpenChokeArea END IF END IF !WRITE (*,*) 'TotalOpenChokeArea=', TotalOpenChokeArea !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!! Well Head Condition ( Open or Closed ) ChokeKroneckerDelta = 0 !WRITE (*,*) ' WelltoPitsOpen = ', WelltoPitsOpen !WRITE (*,*) ' WellToChokeManifoldOpen = ', WellToChokeManifoldOpen IF (data%State%MudSystem%WellToPitsOpen == .FALSE. .AND. data%State%MudSystem%WellToChokeManifoldOpen == .FALSE.) THEN !WRITE (*,*) ' WelltoPitsOpen = ', WelltoPitsOpen !WRITE (*,*) ' WellToChokeManifoldOpen = ', WellToChokeManifoldOpen WellHeadOpen = .FALSE. !WRITE (*,*) ' Well Head is closed ' ELSE WellHeadOpen = .TRUE. END IF IF (data%State%MudSystem%WellToPitsOpen == .FALSE. .AND. data%State%MudSystem%WellToChokeManifoldOpen) ChokeKroneckerDelta = 1 !WRITE (*,*) ' WelltoPitsOpen=' , WelltoPitsOpen, 'WellToChokeManifoldOpen= ' , WellToChokeManifoldOpen !WRITE (*,*) 'WellToChokeOpen , WellToChokeWasOpen', WellToChokeManifoldOpen, WellToChokeManifoldWasOpen !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! IF (NoGasPocket > 0) THEN IF (data%State%MudSystem%Choke_Kick_Saved_Volume_Final > 0.d0) THEN !WRITE (*,*) 'Choke_Kick_Saved_Volume_Final=', Choke_Kick_Saved_Volume_Final, (GasPocketModifiedVol%Array(NoGasPocket) * Convft3ToUSgal) ExitMass = REAL(data%State%MudSystem%Choke_Kick_Saved_Volume_Final / (GasPocketModifiedVol%Array(NoGasPocket) * Convft3ToUSgal)) * GasPocketWeight%Array(NoGasPocket) !IF (NoGasPocket > 1) ExitMass = ExitMass + (SUM(GasPocketDeltaVol%Array(1 : NoGasPocket - 1)) / GasPocketNewVol%Array(NoGasPocket)) * GasPocketWeight%Array(NoGasPocket) !WRITE (*,*) 'Total Exit mass=' , ExitMass !, DeltaVolumePipe, data%State%MudSystem%StringFlowRate * dt / ConvMinToSec IF (FlowEl(data%State%FricPressDrop%OpenholeFirstEl - 1)%MaterialType /= 1) THEN CALL RemoveGasPocket(NoGasPocket) WRITE (*,*) 'Choke_Kick_Saved_Volume_Final=', data%State%MudSystem%Choke_Kick_Saved_Volume_Final END IF END IF !NoGasPocket = SIZE(GasPocketWeight%Array) IF (NoGasPocket > 0) CALL GasPocketFlowElementTransformer END IF IF (data%State%FricPressDrop%NoWelltoChokeEl > 0) THEN OldChokeDensity = ChokeDensity VolumeDensityProduct = 0.0 Do i = data%State%FricPressDrop%AnnulusLastEl + 1 , data%State%FricPressDrop%OpenholeFirstEl - 1 VolumeDensityProduct = VolumeDensityProduct + ((MAX(FlowEl(i)%Density , ChokeMinDensity)) * FlowEl(i)%Volume) End Do ChokeDensity = VolumeDensityProduct / SUM(FlowEl(data%State%FricPressDrop%AnnulusLastEl + 1 : data%State%FricPressDrop%OpenholeFirstEl - 1)%Volume) !WRITE (*,*) 'ChokeDensity=', ChokeDensity data%State%FricPressDrop%Kchoke = (ChokeDensity / ((2.0 * 89158.0) * (0.26 * 0.61 * data%State%FricPressDrop%TotalOpenChokeArea)**2)) * 4.d0 ! *4.d0: seyyed gofte END IF IF (data%State%FricPressDrop%BitTotallyPluged == .FALSE.) THEN data%State%FricPressDrop%KBit = FlowEl(data%State%FricPressDrop%StringLastEl)%density / 12042.0 / BitCd**2 / BitTotNozzArea**2 END IF END SUBROUTINE WellPressureDataTransfer SUBROUTINE GasPocketFlowElementTransformer !! This Subroutine makes relationship between fluid flow elements and gas pocket elements !! The main variable of this subroutine is GasPocketFlowEl !! For each gas pocket, GasPocketFlowEl has a row, which columns are numbers of flow elements which are contains that gas pocket !! For example, if we have two gas pockets and they are in (7,8) and (12,3,4) flow elements respectively, !! GasPocketFlowEl(1,:) = [12 , 3 , 4] and GasPocketFlowEl(2,:) = [7 , 8 , 0] USE FricPressDropVarsModule USE MudSystemVARIABLES use SimulationVariables USE GeoElements_FluidModule USE Fluid_Flow_Startup_Vars use KickVARIABLESModule USE CMudPropertiesVariables USE CBopStackVariables USE CDownHoleVariables USE CError IMPLICIT NONE INTEGER :: i , j , k REAL :: PressureCorrection PressureCorrection = 1.0 if (print_log) print *, "NoGasPocket = ",NoGasPocket ALLOCATE(GasPocketFlowEl(NoGasPocket , 1)) GasPocketFlowEl(:,:) = 0 !WRITE (*,*) 'NoGasPocket=' , NoGasPocket i = 1 j = 1 DO k = data%State%FricPressDrop%OpenholeFirstEl , data%State%FricPressDrop%NumbEl IF (FlowEl(k)%MaterialType == 1) THEN IF (j > 1) THEN IF (GasPocketFlowEl(i , j - 1) /= k - 1) THEN i = i + 1 j = 1 END IF END IF IF (SIZE(GasPocketFlowEl , dim = 2) < j) THEN if (print_log) print *, "GasPocketFlowEl = ",GasPocketFlowEl ALLOCATE(tempGasPocketFlowEl(SIZE(GasPocketFlowEl , dim = 1) , SIZE(GasPocketFlowEl , dim = 2))) tempGasPocketFlowEl = GasPocketFlowEl DEALLOCATE(GasPocketFlowEl) ALLOCATE(GasPocketFlowEl(SIZE(tempGasPocketFlowEl , dim = 1) , SIZE(tempGasPocketFlowEl , dim = 2) + 1)) GasPocketFlowEl(: , 1 : SIZE(tempGasPocketFlowEl , dim = 2)) = tempGasPocketFlowEl GasPocketFlowEl(: , SIZE(GasPocketFlowEl , dim = 2)) = 0 DEALLOCATE(tempGasPocketFlowEl) END IF GasPocketFlowEl(i , j) = k j = j + 1 END IF END DO !WRITE (*,*) 'GasPocketFlowEl=' , GasPocketFlowEl DO k = data%State%FricPressDrop%AnnulusFirstEl , data%State%FricPressDrop%OpenholeFirstEl - 1 IF (FlowEl(k)%MaterialType == 1) THEN IF (j > 1) THEN IF (k == data%State%FricPressDrop%AnnulusFirstEl .AND. GasPocketFlowEl(i , j - 1) == data%State%FricPressDrop%NumbEl) THEN !WRITE (*,*) 'Kick is Around Bit' ELSE IF (GasPocketFlowEl(i , j - 1) /= k - 1) THEN i = i + 1 j = 1 !WRITE (*,*) 'i, j, k', i, j, k, FlowEl(k)%MaterialType END IF END IF IF (j > SIZE(GasPocketFlowEl , dim = 2)) THEN if (print_log) print *, "GasPocketFlowEl = ",GasPocketFlowEl ALLOCATE(tempGasPocketFlowEl(SIZE(GasPocketFlowEl , dim = 1) , SIZE(GasPocketFlowEl , dim = 2))) tempGasPocketFlowEl = GasPocketFlowEl DEALLOCATE(GasPocketFlowEl) ALLOCATE(GasPocketFlowEl(SIZE(tempGasPocketFlowEl , dim = 1) , SIZE(tempGasPocketFlowEl , dim = 2) + 1)) GasPocketFlowEl(: , 1 : SIZE(tempGasPocketFlowEl , dim = 2)) = tempGasPocketFlowEl GasPocketFlowEl(: , SIZE(GasPocketFlowEl , dim = 2)) = 0 DEALLOCATE(tempGasPocketFlowEl) END IF IF (i > NoGasPocket) THEN WRITE (*,*) 'GasPocketFlowEl', GasPocketFlowEl WRITE (*,*) 'i , j , k', i, j, k WRITE (*,*) 'H, S, A, Ch, O', data%State%FricPressDrop%NoHorizontalEl , data%State%FricPressDrop%StringFirstEl , data%State%FricPressDrop%AnnulusFirstEl , data%State%FricPressDrop%NoWellToChokeEl , data%State%FricPressDrop%OpenHoleFirstEl WRITE (*,*) 'Element No, Volume(gal), Density(ppg), Type' DO j = 1 , data%State%FricPressDrop%NumbEl WRITE (*,*) j, FlowEl(j)%Volume * ConvFt3toUSGal , FlowEl(j)%Density, FlowEl(j)%MaterialType END DO CALL ErrorStop('Error in calculating GasPocketFlowEl') END IF GasPocketFlowEl(i , j) = k !WRITE (*,*) 'GasPocketFlowEl=' , GasPocketFlowEl j = j + 1 END IF !IF (i > NoGasPocket) CALL ErrorStop('Error in GasPocketFlowEl' , i) END DO !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! GasPocketModifiedVol%Array(:) = 0.d0 DO i = 1 , NoGasPocket !WRITE(*,*) 'GasPocketFlowEl Data' , i , GasPocketFlowEl(: , i) DO j = 1 , SIZE(GasPocketFlowEl , dim = 2) IF (GasPocketFlowEl(i , j) > 0) GasPocketModifiedVol%Array(i) = GasPocketModifiedVol%Array(i) + FlowEl(GasPocketFlowEl(i , j))%Volume END DO END DO i = data%State%FricPressDrop%AnnulusLastEl j = data%State%FricPressDrop%OpenholeFirstEl - 1 GasPocketOldVol%Array(:) = GasPocketModifiedVol%Array(:) GasPocketOldPress%Array(:) = GasPocketNewPress%Array(:) !WRITE (*,*) ' GasPocketweight%Array(1)', GasPocketweight%Array(1) IF (GasPocketWeight%Array(1) < 0.0) CALL ErrorStop(' Error in Calculating Mass ' , KickmdotBCoef) GasPocketDensity%Array(:) = (GasPocketweight%Array(:) / GasPocketModifiedVol%Array(:)) / convft3toUSgal ! [lbm/ft^3 to ppg] DO i = 1 , SIZE(GasPocketFlowEl , dim = 1) DO j = 1 , SIZE(GasPocketFlowEl , dim = 2) IF (GasPocketFlowEl(i , j) > 0) FlowEl(GasPocketFlowEl(i , j))%Density = GasPocketDensity%Array(i) END DO END DO !WRITE (*,*) 'Kick density (ppg)=' , GasPocketDensity(1) data%Equipments%DownHole%InfluxRate = MAX(((KickmdotACoef * (KickmdotBCoef - GasPocketNewPress%Array(1))) / GasPocketDensity%Array(1) * ConvMinToSec) , 0.0) !WRITE (*,*) ' InfluxRate (gpm) =', InfluxRate i = data%State%FricPressDrop%OpenholeFirstEl - 1 IF (data%State%MudSystem%Choke_Kick_Saved_Volume_Final > 0.d0 .AND. WellHeadOpen) THEN WRITE (*,*) 'Kick is exiting through the choke' !ExitMass = GasPocketDensity%Array(NoGasPocket) * (SUM(GasPocketFlowInduced%Array(:)) + (DeltaVolumePipe * ConvMinToSec / dt) + data%State%MudSystem%StringFlowRate) / ConvMinToSec * dt GasPocketWeight%Array(NoGasPocket) = GasPocketweight%Array(NoGasPocket) - ExitMass IF (GasPocketWeight%Array(NoGasPocket) > 0.0) THEN GasPocketOldPress%Array(NoGasPocket) = GasPocketWeight%Array(NoGasPocket) * data%State%GasType(KickGasType)%GasConstant * & GasPocketCompressibility%Array(NoGasPocket) * GasPocketNewTemp%Array(NoGasPocket) / GasPocketModifiedVol%Array(NoGasPocket) GasPocketDensity%Array(NoGasPocket) = (GasPocketweight%Array(NoGasPocket) / GasPocketModifiedVol%Array(NoGasPocket)) / convft3toUSgal GasPocketNewVol%Array(:) = GasPocketOldVol%Array(:) ELSE ! gas pocket is escaped from the well completely WRITE (*,*) ' Last Pocket Removed' WRITE (*,*) ' GasPocketFlowEl', GasPocketFlowEl CALL RemoveGasPocket(NoGasPocket) !WRITE (*,*) ' GasPocketFlowEl', GasPocketFlowEl END IF ELSE IF (NoGasPocket == 1 .OR. WellHeadOpen) THEN ! kick is not last element of choke line or well head is closed GasPocketNewPress%Array(:) = GasPocketNewPress%Array(:) * REAL(GasPocketNewVol%Array(:) / GasPocketOldVol%Array(:)) GasPocketOldPress%Array(:) = GasPocketNewPress%Array(:) GasPocketNewVol%Array(:) = GasPocketOldVol%Array(:) ELSE ! Many gas pocket is in the well and well head is closed 103 FORMAT (2I, 4X, (F9.3), 5X, (F9.3)) GasPocketNewPress%Array(NoGasPocket) = GasPocketOldPress%Array(NoGasPocket) GasPocketNewVol%Array(NoGasPocket) = GasPocketCompressibility%Array(NoGasPocket) * data%State%GasType(KickGasType)%GasConstant * & GasPocketNewTemp%Array(NoGasPocket) * GasPocketWeight%Array(NoGasPocket) / GasPocketNewPress%Array(NoGasPocket) !WRITE (*,*) 'Mid' DO WHILE (ABS(PressureCorrection * 10.0) > KickConvergenceTolerance) DO j = NoGasPocket - 1 , 1 , -1 CALL KickFunctionsCalculator(GasPocketNewPress%Array(j) , j , 5) GasPocketNewVol%Array(j) = GasPocketCompressibility%Array(j) * data%State%GasType(KickGasType)%GasConstant * & GasPocketNewTemp%Array(j) * GasPocketWeight%Array(j) / GasPocketNewPress%Array(j) !WRITE (*,*) j, REAL(GasPocketNewPress%Array(j)), REAL(GasPocketNewVol%Array(j) * Convft3toUSgal) END DO PressureCorrection = (SUM(GasPocketNewVol%Array(:)) - SUM(GasPocketOldVol%Array(:))) / SUM(GasPocketNewVol%Array(:) / GasPocketNewPress%Array(:)) GasPocketNewPress%Array(NoGasPocket) = GasPocketNewPress%Array(NoGasPocket) + PressureCorrection GasPocketNewVol%Array(NoGasPocket) = GasPocketCompressibility%Array(NoGasPocket) * data%State%GasType(KickGasType)%GasConstant * & GasPocketNewTemp%Array(NoGasPocket) * GasPocketWeight%Array(NoGasPocket) / GasPocketNewPress%Array(NoGasPocket) j = NoGasPocket !WRITE (*,*) j, REAL(GasPocketNewPress%Array(j)), REAL(GasPocketNewVol%Array(j) * Convft3toUSgal) END DO !WRITE (*,*) 'Pressure Correction = ', PressureCorrection WRITE (*,*) 'After' DO i = 1 , NoGasPocket WRITE (*,*) i, REAL(GasPocketNewPress%Array(i)), REAL((GasPocketNewVol%Array(i) * Convft3toUSgal)) END DO GasPocketOldPress%Array(:) = GasPocketNewPress%Array(:) END IF IF (GasPocketFlowEl(NoGasPocket , 1) == 0) THEN CALL RemoveGasPocket(1) !WRITE (*,*) 'GasPocketFlowEl', GasPocketFlowEl WRITE (*,*) 'First Pocket Removed' !WRITE (*,*) 'GasPocketFlowEl', GasPocketFlowEl END IF data%Equipments%DownHole%KickVolume = INT(SUM(GasPocketOldVol%Array(:)) * convft3toUSgal / 42. * 10.0) / 10.0 !WRITE (*,*) ' Gas Kick Pressure (psi) = ' , GasPocketOldPress(1) , INT((GasPocketNewVol(1) / GasPocketOldVol(1)) * 1000.d0) / 1000.d0 !WRITE (*,*) ' b) GasPocketNewVol (ft^3) = ' , GasPocketOldVol(1) END SUBROUTINE SUBROUTINE RemoveGasPocket(ilocal) use KickVARIABLESModule USE MudSystemVARIABLES use SimulationVariables !@@@ IMPLICIT NONE INTEGER :: ilocal DEALLOCATE(KickJacobian , OldKickJacobian , KickVandPFunction , KickUnknownVector , KickCorrectionVector) WRITE (*,*) 'Gas Pocket Will be Removed', ilocal call GasPocketOldPress%Remove(ilocal) call GasPocketNewPress%Remove(ilocal) call GasPocketOldTemp%Remove(ilocal) call GasPocketNewTemp%Remove(ilocal) call GasPocketOldVol%Remove(ilocal) call GasPocketNewVol%Remove(ilocal) call GasPocketDeltaVol%Remove(ilocal) call GasPocketFlowInduced%Remove(ilocal) call GasPocketModifiedVol%Remove(ilocal) call GasPocketWeight%Remove(ilocal) call GasPocketDensity%Remove(ilocal) call GasPocketCompressibility%Remove(ilocal) NoGasPocket = NoGasPocket - 1 IF (NoGasPocket > 0) THEN if (print_log) print *, "2 * NoGasPocket , 2 * NoGasPocket = ",2 * NoGasPocket , 2 * NoGasPocket ALLOCATE(KickJacobian(2 * NoGasPocket , 2 * NoGasPocket) , OldKickJacobian(2 * NoGasPocket , 2 * NoGasPocket) , KickVandPFunction(2 * NoGasPocket)) ALLOCATE(KickUnknownVector(2 * NoGasPocket) , KickCorrectionVector(2 * NoGasPocket)) IF (ALLOCATED(GasPocketFlowEl)) THEN ALLOCATE(tempGasPocketFlowEl(NoGasPocket , SIZE(GasPocketFlowEl , dim = 2))) tempGasPocketFlowEl = GasPocketFlowEl(1 : NoGasPocket , :) DEALLOCATE(GasPocketFlowEl) ALLOCATE(GasPocketFlowEl(SIZE(tempGasPocketFlowEl , dim = 1) , SIZE(tempGasPocketFlowEl , dim = 2))) GasPocketFlowEl = tempGasPocketFlowEl DEALLOCATE(tempGasPocketFlowEl) END IF ELSE ! NoGasPocket = 0 CALL GasPocketOldPress%Empty CALL GasPocketNewPress%Empty CALL GasPocketOldTemp%Empty CALL GasPocketNewTemp%Empty CALL GasPocketOldVol%Empty CALL GasPocketNewVol%Empty CALL GasPocketDeltaVol%Empty CALL GasPocketFlowInduced%Empty CALL GasPocketModifiedVol%Empty CALL GasPocketWeight%Empty CALL GasPocketDensity%Empty data%Equipments%DownHole%InfluxRate = 0.0 data%Equipments%DownHole%KickVolume = 0.0 END IF !WRITE (*,*) 'Gas Pocket Removed', NoGasPocket + 1, ALLOCATED(GasPocketWeight%Array) END SUBROUTINE