module CMudPropertiesVariables
    use CIActionReference
    use CDoubleEventHandlerCollection
    implicit none   
    public    
    
    !pointers
    procedure (ActionDouble), pointer :: ActiveMudVolumePtr
    procedure (ActionDouble), pointer :: ActiveDensityPtr
    procedure (ActionDouble), pointer :: ReserveMudVolumePtr
    procedure (ActionDouble), pointer :: ReserveDensityPtr
    
    type(DoubleEventHandlerCollection) :: OnActiveMudVolumeChange
    type(DoubleEventHandlerCollection) :: OnActiveDensityChange
    type(DoubleEventHandlerCollection) :: OnReserveMudVolumeChange
    type(DoubleEventHandlerCollection) :: OnReserveDensityChange
    
    !constants
    integer, parameter :: WaterBase_MudType = 0
    integer, parameter :: OilBase_MudType = 1    
    integer, parameter :: PowerLaw_RheologyModel = 0
    integer, parameter :: Bingham_RheologyModel = 1
    integer, parameter :: Newtonian_RheologyModel = 2
    INTEGER, PARAMETER :: Herschel_Bulkley_RheologyModel = 3
    
    ! variables
    Type::MudPropertiesType
        integer :: ActiveMudType
        integer :: ActiveRheologyModel
        real(8) :: ActiveMudVolume
        real(8) :: ActiveMudVolumeGal
        real(8) :: ActiveDensity
        real(8) :: ActivePlasticViscosity
        real(8) :: ActiveYieldPoint
        real(8) :: ActiveThetaThreeHundred
        real(8) :: ActiveThetaSixHundred
        
        integer :: ReserveMudType
        real(8) :: ReserveMudVolume
        real(8) :: ReserveMudVolumeGal
        real(8) :: ReserveDensity
        real(8) :: ReservePlasticViscosity
        real(8) :: ReserveYieldPoint
        real(8) :: ReserveThetaThreeHundred
        real(8) :: ReserveThetaSixHundred
        
        real(8) :: ActiveTotalTankCapacity
        real(8) :: ActiveTotalTankCapacityGal
        real(8) :: ActiveSettledContents
        real(8) :: ActiveSettledContentsGal
        real(8) :: ActiveTotalContents
        real(8) :: ActiveTotalContentsGal
        logical :: ActiveAutoDensity
        !real(8) :: ReserveTotalTankCapacity
        !real(8) :: ReserveTotalTankCapacityGal
        !real(8) :: ReserveSettledContents
        !real(8) :: ReserveSettledContentsGal
        !real(8) :: ReserveTotalContents
        !real(8) :: ReserveTotalContentsGal
        real(8) :: InitialTripTankMudVolume
        real(8) :: InitialTripTankMudVolumeGal
        real(8) :: PedalFlowMeter
    End type MudPropertiesType
    Type(MudPropertiesType)::MudProperties


    contains   
    
    subroutine Set_ActiveMudVolume_StudentStation(v)
        implicit none
        real*8, intent(in) :: v
#ifdef ExcludeExtraChanges
        if(MudProperties%ActiveMudVolume == v) return
#endif
        MudProperties%ActiveMudVolume = v   
        if(associated(ActiveMudVolumePtr)) call ActiveMudVolumePtr(MudProperties%ActiveMudVolume)
    end subroutine
        
    subroutine Set_ActiveDensity_StudentStation(v)
        implicit none
        real*8, intent(in) :: v
#ifdef ExcludeExtraChanges
        if(MudProperties%ActiveDensity == v) return
#endif
        MudProperties%ActiveDensity = v    
        if(associated(ActiveDensityPtr)) call ActiveDensityPtr(MudProperties%ActiveDensity)
    end subroutine
    
    subroutine Set_ReserveMudVolume_StudentStation(v)
        implicit none
        real*8, intent(in) :: v
#ifdef ExcludeExtraChanges
        if(MudProperties%ReserveMudVolume == v) return
#endif
        MudProperties%ReserveMudVolume = v  
        if(associated(ReserveMudVolumePtr)) call ReserveMudVolumePtr(MudProperties%ReserveMudVolume)
    end subroutine
        
    subroutine Set_ReserveDensity_StudentStation(v)
        implicit none
        real*8, intent(in) :: v
#ifdef ExcludeExtraChanges
        if(MudProperties%ReserveDensity == v) return
#endif
        MudProperties%ReserveDensity = v   
        if(associated(ReserveDensityPtr)) call ReserveDensityPtr(MudProperties%ReserveDensity)
    end subroutine
    
    
    
    subroutine SubscribeActiveMudVolume(a)
    !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeActiveMudVolume
    !DEC$ ATTRIBUTES ALIAS: 'SubscribeActiveMudVolume' :: SubscribeActiveMudVolume
        implicit none
        procedure (ActionDouble) :: a
        ActiveMudVolumePtr => a
    end subroutine
        
    subroutine SubscribeActiveDensity(a)
    !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeActiveDensity
    !DEC$ ATTRIBUTES ALIAS: 'SubscribeActiveDensity' :: SubscribeActiveDensity
        implicit none
        procedure (ActionDouble) :: a
        ActiveDensityPtr => a
    end subroutine
    
    subroutine SubscribeReserveMudVolume(a)
    !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeReserveMudVolume
    !DEC$ ATTRIBUTES ALIAS: 'SubscribeReserveMudVolume' :: SubscribeReserveMudVolume
        implicit none
        procedure (ActionDouble) :: a
        ReserveMudVolumePtr => a
    end subroutine
        
    subroutine SubscribeReserveDensity(a)
    !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeReserveDensity
    !DEC$ ATTRIBUTES ALIAS: 'SubscribeReserveDensity' :: SubscribeReserveDensity
        implicit none
        procedure (ActionDouble) :: a
        ReserveDensityPtr => a
    end subroutine
        
end module CMudPropertiesVariables