SUBROUTINE Utube1_and_TripIn    !  is called in subroutine CirculationCodeSelect        string to annulus
    
        use UTUBEVARSModule
        Use GeoElements_FluidModule
        USE CMudPropertiesVariables
        USE MudSystemVARIABLES
use SimulationVariables !@@@
        use SimulationVariables
        USE sROP_Variables
        use SimulationVariables !@
        !use CTanks
    !@use ConfigurationVariables, TripTankVolume2 => data%EquipmentControl%DrillingWatch%TripTankVolume, TripTankDensity2 => TripTankDensity
        Use CShoeVariables
        Use CUnityOutputs
        
   implicit none
   
    write(*,*) 'Utube1 code'
!===========================================================WELL============================================================
!===========================================================WELL============================================================ 
        data%State%MudSystem%UtubeMode1Activated= .true.
        !write(*,*) 'QUTubeInput=' , QUTubeInput
        !Qinput=5000.
        data%State%MudSystem%StringFlowRate= UTUBEVARS%QUTubeInput        ! (gpm)
        data%State%MudSystem%AnnulusFlowRate= UTUBEVARS%QUTubeInput
        data%State%MudSystem%StringFlowRateFinal= data%State%MudSystem%StringFlowRate
        data%State%MudSystem%AnnulusFlowRateFinal= data%State%MudSystem%AnnulusFlowRate
!=========================================== 
       
        if (data%State%MudSystem%FirstSetUtube1==0) then
        !    call St_MudDischarged_Volume%AddToFirst (REAL(sum(data%State%F_Interval(1:F_StringIntervalCounts)%Volume)))  !startup initial
        !    call St_Mud_Backhead_X%AddToFirst (Xstart_PipeSection(1))
        !    call St_Mud_Backhead_section%AddToFirst (1)
        !    call St_Mud_Forehead_X%AddToFirst (Xend_PipeSection(F_StringIntervalCounts))
        !    call St_Mud_Forehead_section%AddToFirst (F_StringIntervalCounts)
        !    call data%State%MudSystem%St_Density%AddToFirst (REAL(ActiveDensity))       ! initial(ppg)
        !    call St_RemainedVolume_in_LastSection%AddToFirst (0.0d0)
        !    call St_EmptyVolume_inBackheadLocation%AddToFirst (0.0d0)
        !        
        !    call Ann_MudDischarged_Volume%AddToFirst (REAL(sum(data%State%F_Interval((F_StringIntervalCounts+F_BottomHoleIntervalCounts+1):F_IntervalsTotalCounts)%Volume)))  !startup initial
        !    call Ann_Mud_Backhead_X%AddToFirst (Xstart_PipeSection(F_StringIntervalCounts+1))
        !    call Ann_Mud_Backhead_section%AddToFirst (F_StringIntervalCounts+1)
        !    call Ann_Mud_Forehead_X%AddToFirst (Xend_PipeSection(NoPipeSections))
        !    call Ann_Mud_Forehead_section%AddToFirst (NoPipeSections)
        !    call Ann_Density%AddToFirst (REAL(ActiveDensity))       ! initial(ppg)
        !    call Ann_RemainedVolume_in_LastSection%AddToFirst (0.0d0)
        !    call Ann_EmptyVolume_inBackheadLocation%AddToFirst (0.0d0)
             !Hz_Density%Array(:)= 0.0      !commented
             !Hz_MudOrKick%Array(:)= 104      !commented
             
             data%State%MudSystem%Hz_Density_Utube= 0.0
             data%State%MudSystem%Hz_MudOrKick_Utube= 104             
        
            data%State%MudSystem%FirstSetUtube1= 1
        endif

        

        
!========================Horizontal PIPE ENTRANCE================= 
        
         !if (SuctionDensity_Old >= (ActiveDensity+0.05) .or. SuctionDensity_Old <= (ActiveDensity-0.05)) then     ! new mud is pumped
         !   !ImudCount= ImudCount+1
         !   !SuctionMud= ImudCount
         !   call Hz_Density%AddToFirst (REAL(ActiveDensity))     !ActiveDensity : badan in moteghayer bayad avaz beshe
         !   call Hz_MudDischarged_Volume%AddToFirst (0.0d0)
         !   call Hz_Mud_Forehead_X%AddToFirst (Xstart_PipeSection(1))
         !   call Hz_Mud_Forehead_section%AddToFirst (1)
         !   call Hz_Mud_Backhead_X%AddToFirst (Xstart_PipeSection(1))
         !   call Hz_Mud_Backhead_section%AddToFirst (1)
         !   call Hz_RemainedVolume_in_LastSection%AddToFirst (0.0d0)
         !   call Hz_EmptyVolume_inBackheadLocation%AddToFirst (0.0d0)
         !   call Hz_MudOrKick%AddToFirst (0)  
         !    
         !    SuctionDensity_Old= ActiveDensity
         !endif

!========================Horizontal PIPE STRING================= 

        !commented
        
!                Hz_MudDischarged_Volume%Array(1)= Hz_MudDischarged_Volume%Array(1)+ ((data%State%MudSystem%StringFlowRate/60.)*DeltaT_Mudline)    !(gal)
!         
!imud=0                               
!    do while (imud < Hz_Mud_Forehead_X%Length())
!        imud = imud + 1  
!        
!            if (imud> 1) then
!                Hz_Mud_Backhead_X%Array(imud)= Hz_Mud_Forehead_X%Array(imud-1)
!                Hz_Mud_Backhead_section%Array(imud)= Hz_Mud_Forehead_section%Array(imud-1)
!            endif
!            
!                
!            DirectionCoef= (Xend_PipeSection(Hz_Mud_Backhead_section%Array(imud))-Xstart_PipeSection(Hz_Mud_Backhead_section%Array(imud))) &
!                / ABS(Xend_PipeSection(Hz_Mud_Backhead_section%Array(imud))-Xstart_PipeSection(Hz_Mud_Backhead_section%Array(imud)))
!            ! +1 for string  ,   -1 for annulus
!                
!                                                                                                                    
!            Hz_EmptyVolume_inBackheadLocation%Array(imud)= DirectionCoef* (Xend_PipeSection(Hz_Mud_Backhead_section%Array(imud))- Hz_Mud_Backhead_X%Array(imud))* &
!                Area_PipeSectionFt(Hz_Mud_Backhead_section%Array(imud)) !(ft^3)          
!            Hz_EmptyVolume_inBackheadLocation%Array(imud)= Hz_EmptyVolume_inBackheadLocation%Array(imud)* 7.48051948        ! ft^3  to gal
!            
!
!            if ( Hz_MudDischarged_Volume%Array(imud) <= Hz_EmptyVolume_inBackheadLocation%Array(imud)) then
!                Hz_Mud_Forehead_section%Array(imud)= Hz_Mud_Backhead_section%Array(imud)
!                Hz_Mud_Forehead_X%Array(imud)= Hz_Mud_Backhead_X%Array(imud)+ DirectionCoef*(Hz_MudDischarged_Volume%Array(imud)/7.48051948)/Area_PipeSectionFt(Hz_Mud_Backhead_section%Array(imud))
!                                                                            !   7.48 is for gal to ft^3
!            else
!                    
!                isection= Hz_Mud_Backhead_section%Array(imud)+1
!                Hz_RemainedVolume_in_LastSection%Array(imud)= Hz_MudDischarged_Volume%Array(imud)- Hz_EmptyVolume_inBackheadLocation%Array(imud)
!                    
!                do 
!                        if (isection > 1) then        ! (horizontal pipe exit)
!                            Hz_MudDischarged_Volume%Array(imud)= Hz_MudDischarged_Volume%Array(imud)- Hz_RemainedVolume_in_LastSection%Array(imud)
!                            Hz_Mud_Forehead_X%Array(imud)= Xend_PipeSection(1)
!                            Hz_Mud_Forehead_section%Array(imud)= 1
!                            if (Hz_MudDischarged_Volume%Array(imud)<= 0.0d0)  then       ! imud is completely exited form the string
!                                call Hz_MudDischarged_Volume%Remove (imud)
!                                call Hz_Mud_Backhead_X%Remove (imud)
!                                call Hz_Mud_Backhead_section%Remove (imud)
!                                call Hz_Mud_Forehead_X%Remove (imud)
!                                call Hz_Mud_Forehead_section%Remove (imud)
!                                call Hz_Density%Remove (imud)
!                                call Hz_RemainedVolume_in_LastSection%Remove (imud)
!                                call Hz_EmptyVolume_inBackheadLocation%Remove (imud)
!                                call Hz_MudOrKick%Remove (imud)
!                                
!                            endif
!                            exit
!                        endif
!                                 
!                    xx= Hz_RemainedVolume_in_LastSection%Array(imud)/ PipeSection_VolumeCapacity(isection)   !(gal)
!                        
!                    if (xx<= 1.0) then
!                        Hz_Mud_Forehead_section%Array(imud)= isection
!                        Hz_Mud_Forehead_X%Array(imud)= (xx * (Xend_PipeSection(isection)- Xstart_PipeSection(isection)))+ Xstart_PipeSection(isection)
!                        exit
!                    else
!                        Hz_RemainedVolume_in_LastSection%Array(imud)= Hz_RemainedVolume_in_LastSection%Array(imud)- PipeSection_VolumeCapacity(isection)
!                        isection= isection+ 1
!                        
!                                
!                    endif
!
!                enddo
!            
!            endif   
!        
!    enddo
        
        !commented
        
!========================Horizontal PIPE END=================         
        
!========================STRING ENTRANCE================= 
        !write(*,*) 'a) data%State%MudSystem%St_Density%Length()=' , data%State%MudSystem%St_Density%Length()   
        
         if (ABS(data%State%MudSystem%St_Density%First() - data%State%MudSystem%Hz_Density_Utube) >= data%State%MudSystem%DensityMixTol) then     ! new mud is pumped
            call data%State%MudSystem%St_Density%AddToFirst (data%State%MudSystem%Hz_Density_Utube)
            call data%State%MudSystem%St_MudDischarged_Volume%AddToFirst (0.0d0)
            call data%State%MudSystem%St_Mud_Forehead_X%AddToFirst (data%State%MudSystem%Xstart_PipeSection(2))
            call data%State%MudSystem%St_Mud_Forehead_section%AddToFirst (2)
            call data%State%MudSystem%St_Mud_Backhead_X%AddToFirst (data%State%MudSystem%Xstart_PipeSection(2))
            call data%State%MudSystem%St_Mud_Backhead_section%AddToFirst (2)
            call data%State%MudSystem%St_RemainedVolume_in_LastSection%AddToFirst (0.0d0)
            call data%State%MudSystem%St_EmptyVolume_inBackheadLocation%AddToFirst (0.0d0)
            call data%State%MudSystem%St_MudOrKick%AddToFirst (data%State%MudSystem%Hz_MudOrKick_Utube)      ! Hz_MudOrKick%Last() = 104
             
             !StringDensity_Old= Hz_Density_Utube
         endif
        !write(*,*) 'b) data%State%MudSystem%St_Density%Length()=' , data%State%MudSystem%St_Density%Length() 
        !write(*,*) 'b) data%State%MudSystem%St_Density%Array(1)=' , data%State%MudSystem%St_Density%Array(1) 
        !write(*,*) 'b) St_MudOrKick%Array(1)=' , St_MudOrKick%Array(1) 
        

!========================STRING================= 
                !WRITE (*,*) 'Utube1 data%State%MudSystem%StringFlowRate', data%State%MudSystem%StringFlowRate
                data%State%MudSystem%St_MudDischarged_Volume%Array(1)= data%State%MudSystem%St_MudDischarged_Volume%Array(1)+ ((data%State%MudSystem%StringFlowRate/60.d0)*data%State%MudSystem%DeltaT_Mudline)    !(gal)
         
imud=0                               
    do while (imud < data%State%MudSystem%St_Mud_Forehead_X%Length())
        imud = imud + 1                
        
        
            if (imud> 1) then
                data%State%MudSystem%St_Mud_Backhead_X%Array(imud)= data%State%MudSystem%St_Mud_Forehead_X%Array(imud-1)
                data%State%MudSystem%St_Mud_Backhead_section%Array(imud)= data%State%MudSystem%St_Mud_Forehead_section%Array(imud-1)
            endif
 
            data%State%MudSystem%DirectionCoef= (data%State%MudSystem%Xend_PipeSection(data%State%MudSystem%St_Mud_Backhead_section%Array(imud))-data%State%MudSystem%Xstart_PipeSection(data%State%MudSystem%St_Mud_Backhead_section%Array(imud))) &
                / ABS(data%State%MudSystem%Xend_PipeSection(data%State%MudSystem%St_Mud_Backhead_section%Array(imud))-data%State%MudSystem%Xstart_PipeSection(data%State%MudSystem%St_Mud_Backhead_section%Array(imud)))
            ! +1 for string  ,   -1 for annulus
                
                                                                                                                    
            data%State%MudSystem%St_EmptyVolume_inBackheadLocation%Array(imud)= data%State%MudSystem%DirectionCoef* (data%State%MudSystem%Xend_PipeSection(data%State%MudSystem%St_Mud_Backhead_section%Array(imud))- data%State%MudSystem%St_Mud_Backhead_X%Array(imud))* &
                data%State%MudSystem%Area_PipeSectionFt(data%State%MudSystem%St_Mud_Backhead_section%Array(imud)) !(ft^3)          
            data%State%MudSystem%St_EmptyVolume_inBackheadLocation%Array(imud)= data%State%MudSystem%St_EmptyVolume_inBackheadLocation%Array(imud)* 7.48051948d0        ! ft^3  to gal

            if ( data%State%MudSystem%St_MudDischarged_Volume%Array(imud) <= data%State%MudSystem%St_EmptyVolume_inBackheadLocation%Array(imud)) then
                data%State%MudSystem%St_Mud_Forehead_section%Array(imud)= data%State%MudSystem%St_Mud_Backhead_section%Array(imud)
                data%State%MudSystem%St_Mud_Forehead_X%Array(imud)= data%State%MudSystem%St_Mud_Backhead_X%Array(imud)+ data%State%MudSystem%DirectionCoef*(data%State%MudSystem%St_MudDischarged_Volume%Array(imud)/7.48051948d0)/data%State%MudSystem%Area_PipeSectionFt(data%State%MudSystem%St_Mud_Backhead_section%Array(imud))
                                                                            !   7.48 is for gal to ft^3
            else
                    
                data%State%MudSystem%isection= data%State%MudSystem%St_Mud_Backhead_section%Array(imud)+1
                data%State%MudSystem%St_RemainedVolume_in_LastSection%Array(imud)= data%State%MudSystem%St_MudDischarged_Volume%Array(imud)- data%State%MudSystem%St_EmptyVolume_inBackheadLocation%Array(imud)
                    
                do 
                        if (data%State%MudSystem%isection > data%State%F_Counts%StringIntervalCounts) then        ! last pipe section(string exit)  data%State%F_Counts%StringIntervalCounts includes Horizontal line
                            data%State%MudSystem%St_MudDischarged_Volume%Array(imud)= data%State%MudSystem%St_MudDischarged_Volume%Array(imud)- data%State%MudSystem%St_RemainedVolume_in_LastSection%Array(imud)
                            data%State%MudSystem%St_Mud_Forehead_X%Array(imud)= data%State%MudSystem%Xend_PipeSection(data%State%F_Counts%StringIntervalCounts)
                            data%State%MudSystem%St_Mud_Forehead_section%Array(imud)= data%State%F_Counts%StringIntervalCounts
                            
                            if (data%State%MudSystem%St_MudDischarged_Volume%Array(imud)<= 0.0d0)  then     ! imud is completely exited form the string
                                call RemoveStringMudArrays(imud)
                            endif
                            
                            exit
                        endif
                                 
                    data%State%MudSystem%xx= data%State%MudSystem%St_RemainedVolume_in_LastSection%Array(imud)/ data%State%MudSystem%PipeSection_VolumeCapacity(data%State%MudSystem%isection)   !(gal)
                        
                    if (data%State%MudSystem%xx<= 1.0) then
                        data%State%MudSystem%St_Mud_Forehead_section%Array(imud)= data%State%MudSystem%isection
                        data%State%MudSystem%St_Mud_Forehead_X%Array(imud)= (data%State%MudSystem%xx * (data%State%MudSystem%Xend_PipeSection(data%State%MudSystem%isection)- data%State%MudSystem%Xstart_PipeSection(data%State%MudSystem%isection)))+ data%State%MudSystem%Xstart_PipeSection(data%State%MudSystem%isection)
                        exit
                    else
                        data%State%MudSystem%St_RemainedVolume_in_LastSection%Array(imud)= data%State%MudSystem%St_RemainedVolume_in_LastSection%Array(imud)- data%State%MudSystem%PipeSection_VolumeCapacity(data%State%MudSystem%isection)
                        data%State%MudSystem%isection= data%State%MudSystem%isection+ 1
                        
                                
                    endif

                enddo
            
            endif   
        
    enddo
!========================STRING END================= 
    
!========================== tripping in for OP remove ===============================   
                
    !if (DeltaVolumeOp>0. .and. DeltaVolumeOp< Op_MudDischarged_Volume%Last()) then
    !    Op_MudDischarged_Volume%Array(Op_MudDischarged_Volume%Length())= Op_MudDischarged_Volume%Array(Op_MudDischarged_Volume%Length()) - DeltaVolumeOp
    !else
    !    Op_MudDischarged_Volume%Array(Op_MudDischarged_Volume%Length()-1)=  Op_MudDischarged_Volume%Array(Op_MudDischarged_Volume%Length()-1) - (DeltaVolumeOp-Op_MudDischarged_Volume%Last())
    !                
    !    call Op_MudDischarged_Volume%Remove (Op_MudDischarged_Volume%Length())
    !    call Op_Mud_Backhead_X%Remove (Op_MudDischarged_Volume%Length())
    !    call Op_Mud_Backhead_section%Remove (Op_MudDischarged_Volume%Length())
    !    call Op_Mud_Forehead_X%Remove (Op_MudDischarged_Volume%Length())
    !    call Op_Mud_Forehead_section%Remove (Op_MudDischarged_Volume%Length())
    !    call Op_Density%Remove (Op_MudDischarged_Volume%Length())
    !    call Op_RemainedVolume_in_LastSection%Remove (Op_MudDischarged_Volume%Length())
    !    call Op_EmptyVolume_inBackheadLocation%Remove (Op_MudDischarged_Volume%Length())
    !    call Op_MudOrKick%Remove (Op_MudDischarged_Volume%Length())
    !endif
    !     

!============================= Bottom Hole ============================== 
        
                !Op_MudDischarged_Volume%Array(1)= Op_MudDischarged_Volume%Array(1)+ ((KickVARIABLES%GasKickPumpFlowRate/60.)*DeltaT_Mudline)    !(gal)    due to KickFlux    
imud=0     
    do while (imud < data%State%MudSystem%Op_Mud_Forehead_X%Length())
        imud = imud + 1
        
            if (imud> 1) then
                data%State%MudSystem%Op_Mud_Backhead_X%Array(imud)= data%State%MudSystem%Op_Mud_Forehead_X%Array(imud-1)
                data%State%MudSystem%Op_Mud_Backhead_section%Array(imud)= data%State%MudSystem%Op_Mud_Forehead_section%Array(imud-1)
            endif
            
                
            data%State%MudSystem%DirectionCoef= (data%State%MudSystem%Xend_OpSection(data%State%MudSystem%Op_Mud_Backhead_section%Array(imud))-data%State%MudSystem%Xstart_OpSection(data%State%MudSystem%Op_Mud_Backhead_section%Array(imud))) &
                / ABS(data%State%MudSystem%Xend_OpSection(data%State%MudSystem%Op_Mud_Backhead_section%Array(imud))-data%State%MudSystem%Xstart_OpSection(data%State%MudSystem%Op_Mud_Backhead_section%Array(imud)))
            ! +1 for string  ,   -1 for annulus
                
                           
                                                                                                                    
            data%State%MudSystem%Op_EmptyVolume_inBackheadLocation%Array(imud)= data%State%MudSystem%DirectionCoef* (data%State%MudSystem%Xend_OpSection(data%State%MudSystem%Op_Mud_Backhead_section%Array(imud))- data%State%MudSystem%Op_Mud_Backhead_X%Array(imud))* &
                data%State%MudSystem%Area_OpSectionFt(data%State%MudSystem%Op_Mud_Backhead_section%Array(imud)) !(ft^3)          
            data%State%MudSystem%Op_EmptyVolume_inBackheadLocation%Array(imud)= data%State%MudSystem%Op_EmptyVolume_inBackheadLocation%Array(imud)* 7.48051948d0        ! ft^3  to gal
            
         
            if ( data%State%MudSystem%Op_MudDischarged_Volume%Array(imud) <= data%State%MudSystem%Op_EmptyVolume_inBackheadLocation%Array(imud)) then
                data%State%MudSystem%Op_Mud_Forehead_section%Array(imud)= data%State%MudSystem%Op_Mud_Backhead_section%Array(imud)
                data%State%MudSystem%Op_Mud_Forehead_X%Array(imud)= data%State%MudSystem%Op_Mud_Backhead_X%Array(imud)+ data%State%MudSystem%DirectionCoef*(data%State%MudSystem%Op_MudDischarged_Volume%Array(imud)/7.48051948d0)/data%State%MudSystem%Area_OpSectionFt(data%State%MudSystem%Op_Mud_Backhead_section%Array(imud))
                                                                            !   7.48 is for gal to ft^3
                
            else
                    
                data%State%MudSystem%isection= data%State%MudSystem%Op_Mud_Backhead_section%Array(imud)+1
                data%State%MudSystem%Op_RemainedVolume_in_LastSection%Array(imud)= data%State%MudSystem%Op_MudDischarged_Volume%Array(imud)- data%State%MudSystem%Op_EmptyVolume_inBackheadLocation%Array(imud)
                    
                do 
                        if (data%State%MudSystem%isection > data%State%F_Counts%BottomHoleIntervalCounts) then        ! last pipe section(well exit)
                            if( imud==1) data%State%MudSystem%KickDeltaVinAnnulus= data%State%MudSystem%Op_RemainedVolume_in_LastSection%Array(imud)      ! Kick enters Annulus space
                            data%State%MudSystem%Op_MudDischarged_Volume%Array(imud)= data%State%MudSystem%Op_MudDischarged_Volume%Array(imud)- data%State%MudSystem%Op_RemainedVolume_in_LastSection%Array(imud)
                            data%State%MudSystem%Op_Mud_Forehead_X%Array(imud)= data%State%MudSystem%Xend_OpSection(data%State%F_Counts%BottomHoleIntervalCounts)
                            data%State%MudSystem%Op_Mud_Forehead_section%Array(imud)= data%State%F_Counts%BottomHoleIntervalCounts
                                
                            if (data%State%MudSystem%Op_MudDischarged_Volume%Array(imud)<= 0.0d0)  then     ! imud is completely exited form the well
                                call RemoveOpMudArrays(imud)
                            endif
                            
                            exit
                        endif
                                 
                    data%State%MudSystem%xx= data%State%MudSystem%Op_RemainedVolume_in_LastSection%Array(imud)/ data%State%MudSystem%OpSection_VolumeCapacity(data%State%MudSystem%isection)   !(gal)
                        
                    if (data%State%MudSystem%xx<= 1.0) then
                        data%State%MudSystem%Op_Mud_Forehead_section%Array(imud)= data%State%MudSystem%isection
                        data%State%MudSystem%Op_Mud_Forehead_X%Array(imud)= (data%State%MudSystem%xx * (data%State%MudSystem%Xend_OpSection(data%State%MudSystem%isection)- data%State%MudSystem%Xstart_OpSection(data%State%MudSystem%isection)))+ data%State%MudSystem%Xstart_OpSection(data%State%MudSystem%isection)
                        exit
                    else
                        data%State%MudSystem%Op_RemainedVolume_in_LastSection%Array(imud)= data%State%MudSystem%Op_RemainedVolume_in_LastSection%Array(imud)- data%State%MudSystem%OpSection_VolumeCapacity(data%State%MudSystem%isection)
                        data%State%MudSystem%isection= data%State%MudSystem%isection+ 1
                        
                    endif

                enddo
            
            endif   
     
            
        if (data%State%MudSystem%Op_Mud_Forehead_X%Array(imud)== data%State%MudSystem%Xend_OpSection(data%State%F_Counts%BottomHoleIntervalCounts)) then
            data%State%MudSystem%totalLength = data%State%MudSystem%Op_MudDischarged_Volume%Length()
            do while(imud < data%State%MudSystem%totalLength)
                
                !imud = imud + 1
                call RemoveOpMudArrays(data%State%MudSystem%totalLength)
                data%State%MudSystem%totalLength = data%State%MudSystem%totalLength - 1

                
            enddo
            
            exit ! 
            
        endif            

       !WRITE(*,*) imud,'Op_MudDischarged_Volume%Array(imud)' , Op_MudDischarged_Volume%Array(imud), Op_Density%Array(imud)            
            
            
            
    enddo


    !write(*,*) 'Op_Mud_Forehead_X%Length()' , Op_Mud_Forehead_X%Length()
    !
    !   WRITE(*,*) 'Xend_PipeSection(F_StringIntervalCounts)' , Xend_PipeSection(F_StringIntervalCounts)
    !   WRITE(*,*) 'Op_Mud_Backhead_X%Array(1)' , Op_Mud_Backhead_X%Array(1) 
    !   WRITE(*,*) 'Op_Mud_Forehead_X%Array(1)' , Op_Mud_Forehead_X%Array(1)
    !   WRITE(*,*) 'Op_Mud_Backhead_X%Array(2)' , Op_Mud_Backhead_X%Array(2) 
    !   WRITE(*,*) 'Op_Mud_Forehead_X%Array(2)' , Op_Mud_Forehead_X%Array(2) 
!========================Bottom Hole END=================                 
 
    if (data%State%MudSystem%iLoc == 1) then
        data%State%MudSystem%MudSection= data%State%F_Counts%StringIntervalCounts+1
        data%State%MudSystem%BackheadX= data%State%MudSystem%Xstart_PipeSection(data%State%F_Counts%StringIntervalCounts+1)
    elseif (data%State%MudSystem%iLoc == 2) then
        data%State%MudSystem%MudSection= data%State%MudSystem%Kick_Forehead_section
        data%State%MudSystem%BackheadX= data%State%MudSystem%Kick_Forehead_X
    endif    
    
!========================ANNULUS ENTRANCE==================== 
        
                !write(*,*) 'iloc=====' , iLoc
        if ((ABS(data%State%MudSystem%AnnulusSuctionDensity_Old - data%State%MudSystem%St_Density%Last()) >= data%State%MudSystem%DensityMixTol) .OR. (data%State%MudSystem%DeltaVolumeOp == 0.0 .and. ABS(data%State%MudSystem%Ann_Density%Array(data%State%MudSystem%iLoc)-data%State%MudSystem%St_Density%Last())>=data%State%MudSystem%DensityMixTol .and. data%State%MudSystem%AnnulusFlowRate/=0.0d0) ) then ! new mud is pumped
        call data%State%MudSystem%Ann_Density%AddTo (data%State%MudSystem%iLoc,data%State%MudSystem%St_Density%Last())
        call data%State%MudSystem%Ann_MudDischarged_Volume%AddTo (data%State%MudSystem%iLoc,0.0d0)
        call data%State%MudSystem%Ann_Mud_Forehead_X%AddTo (data%State%MudSystem%iLoc,data%State%MudSystem%BackheadX)
        call data%State%MudSystem%Ann_Mud_Forehead_section%AddTo (data%State%MudSystem%iLoc,data%State%MudSystem%MudSection)
        call data%State%MudSystem%Ann_Mud_Backhead_X%AddTo (data%State%MudSystem%iLoc,data%State%MudSystem%BackheadX)
        call data%State%MudSystem%Ann_Mud_Backhead_section%AddTo (data%State%MudSystem%iLoc,data%State%MudSystem%MudSection)
        call data%State%MudSystem%Ann_RemainedVolume_in_LastSection%AddTo (data%State%MudSystem%iLoc,0.0d0)
        call data%State%MudSystem%Ann_EmptyVolume_inBackheadLocation%AddTo (data%State%MudSystem%iLoc,0.0d0)
        call data%State%MudSystem%Ann_MudOrKick%AddTo (data%State%MudSystem%iLoc,0)
        call data%State%MudSystem%Ann_CuttingMud%AddTo (data%State%MudSystem%iLoc,0)
             
        data%State%MudSystem%AnnulusSuctionDensity_Old= data%State%MudSystem%St_Density%Last()
            
        data%State%MudSystem%MudIsChanged= .true.
        endif  

                data%State%MudSystem%Ann_MudDischarged_Volume%Array(data%State%MudSystem%iLoc)= data%State%MudSystem%Ann_MudDischarged_Volume%Array(data%State%MudSystem%iLoc)+ ((data%State%MudSystem%AnnulusFlowRate/60.0d0)*data%State%MudSystem%DeltaT_Mudline)    !(gal)  
         
!========================Tripping In==================== 
         
!write(*,*) 'DeltaVolumeOp=' , DeltaVolumeOp
            if (data%State%MudSystem%DeltaVolumeOp > 0.0 .and. data%State%MudSystem%MudIsChanged== .false.) then !.and. DrillingMode== .false.) then      ! trip in mode(loole paeen) 
                
            !write(*,*) 'Tripping In'
                
                data%State%MudSystem%NewDensity= (data%State%MudSystem%St_Density%Last()*((data%State%MudSystem%AnnulusFlowRate/60.)*data%State%MudSystem%DeltaT_Mudline)+data%State%MudSystem%Op_Density%Last()*data%State%MudSystem%DeltaVolumeOp)/(((data%State%MudSystem%AnnulusFlowRate/60.0d0)*data%State%MudSystem%DeltaT_Mudline)+data%State%MudSystem%DeltaVolumeOp)
                data%State%MudSystem%NewVolume= ((data%State%MudSystem%AnnulusFlowRate/60.)*data%State%MudSystem%DeltaT_Mudline)+data%State%MudSystem%DeltaVolumeOp
                
        !write(*,*) 'Ann_MudDischarged_Volume%Array(1)=', Ann_MudDischarged_Volume%Array(1), 'NewVolume=', NewVolume
        
            if (abs(data%State%MudSystem%Ann_Density%Array(data%State%MudSystem%iLoc)-data%State%MudSystem%NewDensity)< data%State%MudSystem%DensityMixTol) then ! 1-Pockets are Merged  - (ROP is 0)               
                data%State%MudSystem%Ann_Density%Array(data%State%MudSystem%iLoc)= (data%State%MudSystem%Ann_Density%Array(data%State%MudSystem%iLoc)*data%State%MudSystem%Ann_MudDischarged_Volume%Array(data%State%MudSystem%iLoc)+data%State%MudSystem%NewDensity*data%State%MudSystem%NewVolume)/(data%State%MudSystem%Ann_MudDischarged_Volume%Array(data%State%MudSystem%iLoc)+data%State%MudSystem%NewVolume)
                 data%State%MudSystem%Ann_MudDischarged_Volume%Array(data%State%MudSystem%iLoc)= data%State%MudSystem%Ann_MudDischarged_Volume%Array(data%State%MudSystem%iLoc)+data%State%MudSystem%DeltaVolumeOp
                 data%State%MudSystem%Ann_Mud_Forehead_X%Array(data%State%MudSystem%iLoc)= data%State%MudSystem%BackheadX
                 data%State%MudSystem%Ann_Mud_Forehead_section%Array(data%State%MudSystem%iLoc)= data%State%MudSystem%MudSection
                 data%State%MudSystem%Ann_Mud_Backhead_X%Array(data%State%MudSystem%iLoc)= data%State%MudSystem%BackheadX
                 data%State%MudSystem%Ann_Mud_Backhead_section%Array(data%State%MudSystem%iLoc)= data%State%MudSystem%MudSection
                 data%State%MudSystem%Ann_RemainedVolume_in_LastSection%Array(data%State%MudSystem%iLoc)= (0.0d0)
                 data%State%MudSystem%Ann_EmptyVolume_inBackheadLocation%Array(data%State%MudSystem%iLoc)= (0.0d0)                    
            else        ! 2-Merging conditions are not meeted, so new pocket
                call data%State%MudSystem%Ann_Density%AddTo (data%State%MudSystem%iLoc,data%State%MudSystem%NewDensity)
                call data%State%MudSystem%Ann_MudDischarged_Volume%AddTo (data%State%MudSystem%iLoc,data%State%MudSystem%NewVolume)
                call data%State%MudSystem%Ann_Mud_Forehead_X%AddTo (data%State%MudSystem%iLoc,data%State%MudSystem%BackheadX)
                call data%State%MudSystem%Ann_Mud_Forehead_section%AddTo (data%State%MudSystem%iLoc,data%State%MudSystem%MudSection)
                call data%State%MudSystem%Ann_Mud_Backhead_X%AddTo (data%State%MudSystem%iLoc,data%State%MudSystem%BackheadX)
                call data%State%MudSystem%Ann_Mud_Backhead_section%AddTo (data%State%MudSystem%iLoc,data%State%MudSystem%MudSection)
                call data%State%MudSystem%Ann_RemainedVolume_in_LastSection%AddTo (data%State%MudSystem%iLoc,0.0d0)
                call data%State%MudSystem%Ann_EmptyVolume_inBackheadLocation%AddTo (data%State%MudSystem%iLoc,0.0d0)
                call data%State%MudSystem%Ann_MudOrKick%AddTo (data%State%MudSystem%iLoc,0)
                call data%State%MudSystem%Ann_CuttingMud%AddTo (data%State%MudSystem%iLoc,0)
                
            endif
            
                
            elseif (data%State%MudSystem%DeltaVolumeOp > 0.0 .and. data%State%MudSystem%MudIsChanged== .true. .and.  data%State%ROP_Bit%RateOfPenetration==0.) then
                 data%State%MudSystem%Ann_Density%Array(data%State%MudSystem%iLoc)= data%State%MudSystem%NewDensity
                 data%State%MudSystem%Ann_MudDischarged_Volume%Array(data%State%MudSystem%iLoc)= data%State%MudSystem%NewVolume
                 data%State%MudSystem%Ann_Mud_Forehead_X%Array(data%State%MudSystem%iLoc)= data%State%MudSystem%BackheadX
                 data%State%MudSystem%Ann_Mud_Forehead_section%Array(data%State%MudSystem%iLoc)= data%State%MudSystem%MudSection
                 data%State%MudSystem%Ann_Mud_Backhead_X%Array(data%State%MudSystem%iLoc)= data%State%MudSystem%BackheadX
                 data%State%MudSystem%Ann_Mud_Backhead_section%Array(data%State%MudSystem%iLoc)= data%State%MudSystem%MudSection
                 data%State%MudSystem%Ann_RemainedVolume_in_LastSection%Array(data%State%MudSystem%iLoc)= (0.0d0)
                 data%State%MudSystem%Ann_EmptyVolume_inBackheadLocation%Array(data%State%MudSystem%iLoc)= (0.0d0)
            endif   
    

!========================Tripping In - End====================
  
            
!======================== ANNULUS ==================== 
             
                   data%State%MudSystem%MudIsChanged= .false.          
             
imud= 0

    do while (imud < data%State%MudSystem%Ann_Mud_Forehead_X%Length())
        imud = imud + 1
        
            if (imud> 1) then
                data%State%MudSystem%Ann_Mud_Backhead_X%Array(imud)= data%State%MudSystem%Ann_Mud_Forehead_X%Array(imud-1)
                data%State%MudSystem%Ann_Mud_Backhead_section%Array(imud)= data%State%MudSystem%Ann_Mud_Forehead_section%Array(imud-1)
            endif
      
            
!       <<< Fracture Shoe Lost            
            IF ( data%State%MudSystem%ShoeLost .and. data%State%MudSystem%LostInTripOutIsDone== .false.  .and. Shoe%ShoeDepth < data%State%MudSystem%Ann_Mud_Backhead_X%Array(imud) .and. Shoe%ShoeDepth >= data%State%MudSystem%Ann_Mud_Forehead_X%Array(imud) ) then
                !write(*,*) 'ShoeLost   imud,AnnVolume(imud), VolumeLost:' , imud,Ann_MudDischarged_Volume%Array(imud), (( Qlost/60.0d0)*DeltaT_Mudline)
                data%State%MudSystem%Ann_MudDischarged_Volume%Array(imud)= data%State%MudSystem%Ann_MudDischarged_Volume%Array(imud)-((data%State%MudSystem%Qlost/60.0d0)*data%State%MudSystem%DeltaT_Mudline)    !(gal)
                if (data%State%MudSystem%Ann_MudDischarged_Volume%Array(imud) < 0.0) then
                    !write(*,*) 'mud is removed by shoe lost, imud=' , imud
                    call RemoveAnnulusMudArrays(imud)
                    imud= imud-1
                    cycle
                endif
            ENDIF
!           Fracture Shoe Lost >>>             
            
            
            
            
            
            
            
            
            data%State%MudSystem%DirectionCoef= (data%State%MudSystem%Xend_PipeSection(data%State%MudSystem%Ann_Mud_Backhead_section%Array(imud))-data%State%MudSystem%Xstart_PipeSection(data%State%MudSystem%Ann_Mud_Backhead_section%Array(imud))) &
                / ABS(data%State%MudSystem%Xend_PipeSection(data%State%MudSystem%Ann_Mud_Backhead_section%Array(imud))-data%State%MudSystem%Xstart_PipeSection(data%State%MudSystem%Ann_Mud_Backhead_section%Array(imud)))
            ! +1 for string  ,   -1 for annulus
                
                                                                                                                    
            data%State%MudSystem%Ann_EmptyVolume_inBackheadLocation%Array(imud)= data%State%MudSystem%DirectionCoef* (data%State%MudSystem%Xend_PipeSection(data%State%MudSystem%Ann_Mud_Backhead_section%Array(imud))- data%State%MudSystem%Ann_Mud_Backhead_X%Array(imud))* &
                data%State%MudSystem%Area_PipeSectionFt(data%State%MudSystem%Ann_Mud_Backhead_section%Array(imud)) !(ft^3)          
            data%State%MudSystem%Ann_EmptyVolume_inBackheadLocation%Array(imud)= data%State%MudSystem%Ann_EmptyVolume_inBackheadLocation%Array(imud)* 7.48051948d0        ! ft^3  to gal
            
         
            if ( data%State%MudSystem%Ann_MudDischarged_Volume%Array(imud) <= data%State%MudSystem%Ann_EmptyVolume_inBackheadLocation%Array(imud)) then
                data%State%MudSystem%Ann_Mud_Forehead_section%Array(imud)= data%State%MudSystem%Ann_Mud_Backhead_section%Array(imud)
                data%State%MudSystem%Ann_Mud_Forehead_X%Array(imud)= data%State%MudSystem%Ann_Mud_Backhead_X%Array(imud)+ data%State%MudSystem%DirectionCoef*(data%State%MudSystem%Ann_MudDischarged_Volume%Array(imud)/7.48051948d0)/data%State%MudSystem%Area_PipeSectionFt(data%State%MudSystem%Ann_Mud_Backhead_section%Array(imud))
                                                                            !   7.48 is for gal to ft^3
                
            else
                    
                data%State%MudSystem%isection= data%State%MudSystem%Ann_Mud_Backhead_section%Array(imud)+1
                data%State%MudSystem%Ann_RemainedVolume_in_LastSection%Array(imud)= data%State%MudSystem%Ann_MudDischarged_Volume%Array(imud)- data%State%MudSystem%Ann_EmptyVolume_inBackheadLocation%Array(imud)
                    
                do 
                        if (data%State%MudSystem%isection > data%State%MudSystem%NoPipeSections) then        ! last pipe section(well exit)
                            data%State%MudSystem%Ann_MudDischarged_Volume%Array(imud)= data%State%MudSystem%Ann_MudDischarged_Volume%Array(imud)- data%State%MudSystem%Ann_RemainedVolume_in_LastSection%Array(imud)
                            data%State%MudSystem%Ann_Mud_Forehead_X%Array(imud)= data%State%MudSystem%Xend_PipeSection(data%State%MudSystem%NoPipeSections)
                            data%State%MudSystem%Ann_Mud_Forehead_section%Array(imud)= data%State%MudSystem%NoPipeSections
                                
                            if (data%State%MudSystem%Ann_MudDischarged_Volume%Array(imud)<= 0.0d0)  then        ! imud is completely exited form the well
                                call RemoveAnnulusMudArrays(imud)
                            endif
                            
                            exit
                        endif
                                 
                    data%State%MudSystem%xx= data%State%MudSystem%Ann_RemainedVolume_in_LastSection%Array(imud)/ data%State%MudSystem%PipeSection_VolumeCapacity(data%State%MudSystem%isection)   !(gal)
                        
                    if (data%State%MudSystem%xx<= 1.0) then
                        data%State%MudSystem%Ann_Mud_Forehead_section%Array(imud)= data%State%MudSystem%isection
                        data%State%MudSystem%Ann_Mud_Forehead_X%Array(imud)= (data%State%MudSystem%xx * (data%State%MudSystem%Xend_PipeSection(data%State%MudSystem%isection)- data%State%MudSystem%Xstart_PipeSection(data%State%MudSystem%isection)))+ data%State%MudSystem%Xstart_PipeSection(data%State%MudSystem%isection)
                        exit
                    else
                        data%State%MudSystem%Ann_RemainedVolume_in_LastSection%Array(imud)= data%State%MudSystem%Ann_RemainedVolume_in_LastSection%Array(imud)- data%State%MudSystem%PipeSection_VolumeCapacity(data%State%MudSystem%isection)
                        data%State%MudSystem%isection= data%State%MudSystem%isection+ 1
                                
                    endif

                enddo
            
            endif         
     
    enddo
!========================ANNULUS END================= 
    
    !if ( WellisNOTFull == .false. ) then
    !    write(*,*) 'data%State%MudSystem%AnnulusFlowRate==' , data%State%MudSystem%AnnulusFlowRate
    !    call Set_FlowRate(real(100.*min(data%State%MudSystem%AnnulusFlowRate,PedalMeter)/(PedalMeter/10.), 8))
    !
    !    
    !endif
    

        
end subroutine Utube1_and_TripIn