''' <summary>
''' Classe encapsulant toutes les caractéristiques des sables
''' </summary>
<Serializable()> Public Class clsSable
    Private _NomSable As String = "Sable 0/4"
    Private _S_Vs As Integer
    Private _Densite As Double = 2.5
    Private _Humidite As Double = 0.07
    Private _Ms As Double
    Private _TeneurFines As Double = 0.015
    Private _ds As Double = 0
    Private _Dms As Double = 4
    Private _mf As Double
    Private _mfCible As Double = 2.5
    Private _Mf_prop As Double
    Private _Vol As Integer
    Private _Masse As Integer
    Private _MasseHumide As Integer
    Private _Choix_mesureGranulo As Integer = 0
    Private _Affichage_CourbeGranulo As Integer = 0
    Private _Type_Granulat As Integer = 1
    Private _Wabs As Double = 0.01
#Region "Caractéristiques du sable"
    ''' <summary>
    ''' nom du sable
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property NomSable As String
        Get
            NomSable = _NomSable
        End Get
        Set(value As String)
            If Not IsString(value) Then
                Throw New ArgumentException("La valeur du nom du sable n'est pas une chaine de caractères.")
            Else
                _NomSable = value
            End If
        End Set
    End Property

    ''' <summary>
    '''classe granulaire: dmini - unité: mm
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property ds As Double
        Get
            ds = _ds
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La Valeur de la classe granulaire du sable : dmini n'est pas numérique.")
            ElseIf value < 0 Then
                Throw New ArgumentException("La Valeur de la classe granulaire du sable : dmini doit être positive.")
            Else
                _ds = value
            End If
        End Set
    End Property

    ''' <summary>
    '''classe granulaire: D Maxi - unité: mm
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Dms As Double
        Get
            Dms = _Dms
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La Valeur de la classe granulaire du sable : D Maxi n'est pas numérique.")
            ElseIf value < 0 Then
                Throw New ArgumentException("La Valeur de la classe granulaire du sable : D Maxi doit être positive.")
            ElseIf value < ds Then
                Throw New ArgumentException("La Valeur de la classe granulaire du sable : D Maxi doit être supérieure à d mini.")
            Else
                _Dms = value
            End If
        End Set
    End Property

#Region "En attente Suppression"
    '''' <summary>
    ''''Qualité du sable - Suivant NF EN 12620+A1 : 1 = caractéristiques indicées A / 2 = caractéristiques indicées B / 3 = caractéristiques indicées C / 4 = caractéristiques indicées D
    '''' </summary>
    '''' <value></value>
    '''' <returns></returns>
    '''' <remarks></remarks>
    'Public Property Qualite As Integer
    '    Get
    '        Qualite = _Qualite
    '    End Get
    '    Set(value As Integer)
    '        If Not IsNumeric(value) Then
    '            Throw New ArgumentException("La valeur de la Qualité du sable n'est pas numérique.")
    '        ElseIf value < 1 OrElse value > 4 Then
    '            Throw New ArgumentException("La valeur de la Qualité du sable doit être comprise entre 1 et 4.")
    '        Else
    '            _Qualite = value
    '        End If
    '    End Set
    'End Property
#End Region

    ''' <summary>
    '''Sable correcteur : TRUE si le sable renseigné est un sable correcteur / FALSE dans le cas contraire
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Correcteur As Boolean = False

    ''' <summary>
    '''Densité du sable - Unité: kg/dm3 ou T/m3
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Densite As Double
        Get
            Densite = _Densite
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la densité du sable n'est pas numérique.")
            ElseIf value < 2 OrElse value > 4 Then
                Throw New ArgumentException("La valeur de la densité du sable doit être comprise entre 2 et 4.")
            Else
                _Densite = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Humidité du sable - Unité: SO - compris entre 0 et 0.5
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Humidite As Double
        Get
            Humidite = _Humidite
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de l'Humidite du sable n'est pas numérique.")
            ElseIf value < 0.00001 OrElse value > 0.2 Then
                Throw New ArgumentException("La valeur de l'Humidite du sable doit être comprise entre 0% et 20%." & Environment.NewLine & "La valeur obtenue est égale à " & (value * 100).ToString("#0") & " %.")
            Else
                _Humidite = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Coefficient d'absorption d'eau du sable - Unité: % - compris entre 0.001 et 0.15 soit entre 0,1% et 15 %
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Wabs As Double
        Get
            Wabs = _Wabs
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur du Coefficient d'absorption d'eau du sable n'est pas numérique.")
            ElseIf value < 0.00001 OrElse value > 0.1 Then
                Throw New ArgumentException("La valeur du Coefficient d'absorption d'eau du sable doit être comprise entre 0,1% et 10%." & Environment.NewLine & "La valeur obtenue est égale à " & (value * 100).ToString("#0") & " %.")
            Else
                _Wabs = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Forme du sable - Unité: 1 = granulat concassé / 2 = granulat roulé 
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Forme As Integer
        Get
            Forme = _Type_Granulat
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur du type de production du sable (concassé ou roulé) n'est pas numérique.")
            ElseIf value <> 1 And value <> 2 Then
                Throw New ArgumentException("La valeur du type de production du sable (concassé ou roulé) doit être égale à 1 ou à 2." & Environment.NewLine & "La variable est ici égale à " & value.ToString)
            Else
                _Type_Granulat = value
            End If
        End Set
    End Property
#End Region

    '''' <summary>
    ''''Pourcentage de sable contenant des fines naturelles inférieures à 63µm - unité: %
    '''' </summary>
    '''' <value></value>
    '''' <returns></returns>
    '''' <remarks></remarks>
    'Public Property Fine_sable As Integer
    '    Get
    '        Fine_sable = _Fine_sable
    '    End Get
    '    Set(value As Integer)
    '        If Not IsNumeric(value) Then
    '            Throw New ArgumentException("La valeur de Pourcentage de sable contenant des fines naturelles inférieures à 63µm n'est pas numérique.")
    '        ElseIf value < 0 Then
    '            Throw New ArgumentException("La valeur de Pourcentage de sable contenant des fines naturelles inférieures à 63µm doit être positif.")
    '        ElseIf value > 100 Then
    '            Throw New ArgumentException("La valeur de Pourcentage de sable contenant des fines naturelles inférieures à 63µm doit être inférieur à 100.")
    '        Else
    '            _Fine_sable = value
    '        End If
    '    End Set
    'End Property

    '''' <summary>
    ''''Valeur du passant - unité: %
    '''' </summary>
    '''' <value></value>
    '''' <returns></returns>
    '''' <remarks></remarks>
    'Public Property Tns As Integer
    '    Get
    '        Tns = _Tns
    '    End Get
    '    Set(value As Integer)
    '        If Not IsNumeric(value) Then
    '            Throw New ArgumentException("La Valeur du passant n'est pas numérique.")
    '        ElseIf value < 0 Then
    '            Throw New ArgumentException("La Valeur du passant doit être positif.")
    '        ElseIf value > 100 Then
    '            Throw New ArgumentException("La valeur de Pourcentage de sable contenant des fines naturelles inférieures à 63µm doit être inférieur à 100.")
    '        Else
    '            _Tns = value
    '        End If
    '    End Set
    'End Property

#Region "Formulation"

    ''' <summary>
    '''Répartition en % de sable dans le volume global de granulats rentrant dans la composition du béton - Unité: %
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Xml.Serialization.XmlIgnore> Public Property S_Vs As Integer
        Get
            S_Vs = _S_Vs
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de répartition en % de sable n'est pas numérique.")
            ElseIf value < 0 Then
                Throw New ArgumentException("La valeur de répartition en % de sable dans le volume global de granulats ne peut être négative. La valeur indiquée est " & value.ToString & " %.")
            ElseIf value > 100 Then
                Throw New ArgumentException("La valeur de répartition en % de sable dans le volume global de granulats ne peut pas être supérieure à 100%. La valeur indiquée est " & value.ToString & " %.")
            Else
                _S_Vs = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Répartition de plusieurs sables dans le volume global de sable en cas de composition de 2 sables - Unité: compris entre 0 et 1, soit 0,2 pour 20%
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Xml.Serialization.XmlIgnore> Public Property Mf_prop As Double
        Get
            Mf_prop = _Mf_prop
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de répartition suivant mf cible de sable n'est pas numérique.")
            ElseIf value < 0 Then
                Throw New ArgumentException("La valeur de répartition suivant mf cible de sable dans le volume global de sable ne peut être négative. La valeur indiquée est " & value.ToString & " %.")
            ElseIf value > 1 Then
                Throw New ArgumentException("La valeur de répartition suivant mf cible de sable dans le volume global de sable ne peut pas être supérieure à 1. La valeur indiquée est " & value.ToString & " %.")
            Else
                _Mf_prop = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Volume du sable rentrant dans la composition d'1 m3 de béton - Unité: L (ou dm3)
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Xml.Serialization.XmlIgnore> Public Property Vol As Integer
        Get
            Vol = _Vol
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur du volume de sable n'est pas numérique.")
            ElseIf value < 1 OrElse value > 850 Then
                Throw New ArgumentException("La valeur du volume de sable doit être comprise entre 1 et 850." & Environment.NewLine & "La valeur obtenue est égale à " & value.ToString("#0") & " L.")
            Else
                _Vol = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Masse de sable rentrant dans la composition d'1 m3 de béton - Unité: kg
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Xml.Serialization.XmlIgnore> Public Property Masse As Integer
        Get
            Masse = _Masse
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la masse de sable n'est pas numérique.")
            ElseIf value < 20 OrElse value > 2000 Then
                Throw New ArgumentException("La valeur de la masse de sable par m3 de béton doit être comprise entre 20 kg et 2000 kg." & Environment.NewLine & "La valeur obtenue est égale à " & value.ToString("#0") & " Kg.")
            Else
                _Masse = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Masse de sable humide rentrant dans la composition d'1 m3 de béton - Unité: kg
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Xml.Serialization.XmlIgnore> Public Property MasseHumide As Integer
        Get
            MasseHumide = _MasseHumide
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la masse de sable n'est pas numérique.")
            ElseIf value < 20 OrElse value > 2000 Then
                Throw New ArgumentException("La valeur de la masse de sable par m3 de béton doit être comprise entre 20 kg et 2000 kg." & Environment.NewLine & "La valeur obtenue est égale à " & value.ToString("#0") & " Kg.")
            Else
                _MasseHumide = value
            End If
        End Set
    End Property

#End Region

#Region "Granulométrie"

    ''' <summary>
    '''Masse totale de l'échantillon de sable - Unité: g
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Ms As Double
        Get
            Ms = _Ms
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la masse totale de l'échantillon de sable n'est pas numérique.")
            ElseIf value < 0 Then
                Throw New ArgumentException("La valeur de la masse totale de l'échantillon de sable doit être positif.")
            Else
                _Ms = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Choix du mode de mesure granulométrique - Unité: 0 = refus en g / 1 = refus cumulé en g / 2 = refus cumulé en % / 3 = tamisat cumulé en g / 4 = tamisat cumulé en % 
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Choix_mesureGranulo As Integer
        Get
            Choix_mesureGranulo = _Choix_mesureGranulo
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur du Choix du mode de mesure granulométrique n'est pas numérique.")
            ElseIf value <> 0 AndAlso value <> 1 AndAlso value <> 2 AndAlso value <> 3 AndAlso value <> 4 Then
                Throw New ArgumentException("La valeur du Choix du mode de mesure granulométrique doit être égale à 0, 1, 2, 3 ou 4." & Environment.NewLine & "La variable est ici égale à " & value.ToString)
            Else
                _Choix_mesureGranulo = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Choix du sable affiché dans la courbe granulométrique - Unité: 0 = aucune courbe/ 1 = affichage de la courbe
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Affichage_CourbeGranulo As Integer
        Get
            Affichage_CourbeGranulo = _Affichage_CourbeGranulo
        End Get
        Set(value As Integer)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur du Choix de la courbe granulométrique n'est pas numérique.")
            ElseIf value <> 0 AndAlso value <> 1 Then
                Throw New ArgumentException("La valeur du Choix de la courbe granulométrique doit être égale à 0 ou 1." & Environment.NewLine & "La variable est ici égale à " & value.ToString)
            Else
                _Affichage_CourbeGranulo = value
            End If
        End Set
    End Property

    ''' <summary>
    '''Teneur en % de fines du sable - fines = ensemble des grains solides passant au tamis de 0.63μm - Unité: % en volume, 2% renseigné sous forme 0.02
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property TeneurFines As Double
        Get
            TeneurFines = _TeneurFines
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur de la teneur en Fines n'est pas numérique.")
            ElseIf value < 0 Then
                Throw New ArgumentException("La valeur de la teneur en Fines doit être comprise entre positive.")
            ElseIf value > 0.5 Then
                Throw New ArgumentException("La valeur de la teneur en Fines ne peut être supérieure à 50%.")
            Else
                _TeneurFines = value
            End If
        End Set
    End Property

    ''' <summary>
    ''' Tamis normalisé pour établir les courbes granulométriques des composants du béton pour le sable - unité: mm
    ''' </summary>
    <Xml.Serialization.XmlIgnore> Public Property Disponibilite_Tamis As New Dictionary(Of Double, Boolean) From {{0.063, False}, {0.08, True}, {0.1, False}, {0.125, False}, {0.16, True}, {0.2, False}, {0.25, False}, {0.315, True}, {0.4, False},
     {0.5, False}, {0.63, True}, {0.8, False}, {1, False}, {1.25, True}, {1.6, False}, {2, False}, {2.5, True}, {3.15, False}, {4, False}, {5, True}, {6.3, False}, {8, False}, {10, True}} ', 12.5, 16, 20, 31.5, 40, 50, 63, 80}

    ''' <summary>
    ''' Tamis normalisé pour établir les courbes granulométriques des composants du béton pour le sable - unité: en valeurs booléennes
    ''' </summary>
    Public Property Disponibilite_Tamis_Bool As New List(Of Boolean) 'From {False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True, False, False, True}

    ''' <summary>
    '''Refus - Clé: dimension du tamis - Valeur: refus en g
    ''' </summary>
    ''' <remarks></remarks>
    <Xml.Serialization.XmlIgnore> Public Refus As New Dictionary(Of Double, Double) From {{0.063, 0}, {0.08, 0}, {0.1, 0}, {0.125, 0}, {0.16, 0}, {0.2, 0}, {0.25, 0}, {0.315, 0}, {0.4, 0}, {0.5, 0},
        {0.63, 0}, {0.8, 0}, {1, 0}, {1.25, 0}, {1.6, 0}, {2, 0}, {2.5, 0}, {3.15, 0}, {4, 0}, {5, 0}, {6.3, 0}, {8, 0}, {10, 0}}

    ''' <summary>
    '''Refus cumulé en g - Clé: dimension du tamis - Valeur: refus en g
    ''' </summary>
    ''' <remarks></remarks>
    <Xml.Serialization.XmlIgnore> Public RefusCumule_g As New Dictionary(Of Double, Double) From {{0.063, 0}, {0.08, 0}, {0.1, 0}, {0.125, 0}, {0.16, 0}, {0.2, 0}, {0.25, 0}, {0.315, 0}, {0.4, 0}, {0.5, 0},
        {0.63, 0}, {0.8, 0}, {1, 0}, {1.25, 0}, {1.6, 0}, {2, 0}, {2.5, 0}, {3.15, 0}, {4, 0}, {5, 0}, {6.3, 0}, {8, 0}, {10, 0}}

    ''' <summary>
    '''Refus cumulé en % - Clé: dimension du tamis - Valeur: refus en % soit 50% et non 0,50
    ''' </summary>
    ''' <remarks></remarks>
    <Xml.Serialization.XmlIgnore> Public RefusCumule_Pourcent As New Dictionary(Of Double, Double) From {{0.063, 0}, {0.08, 0}, {0.1, 0}, {0.125, 0}, {0.16, 0}, {0.2, 0}, {0.25, 0}, {0.315, 0}, {0.4, 0}, {0.5, 0},
        {0.63, 0}, {0.8, 0}, {1, 0}, {1.25, 0}, {1.6, 0}, {2, 0}, {2.5, 0}, {3.15, 0}, {4, 0}, {5, 0}, {6.3, 0}, {8, 0}, {10, 0}}

    ''' <summary>
    '''Tamisat cumulé en g - Clé: dimension du tamis - Valeur: Tamisat en g
    ''' </summary>
    ''' <remarks></remarks>
    <Xml.Serialization.XmlIgnore> Public TamisatCumule_g As New Dictionary(Of Double, Double) From {{0.063, 0}, {0.08, 0}, {0.1, 0}, {0.125, 0}, {0.16, 0}, {0.2, 0}, {0.25, 0}, {0.315, 0}, {0.4, 0}, {0.5, 0},
        {0.63, 0}, {0.8, 0}, {1, 0}, {1.25, 0}, {1.6, 0}, {2, 0}, {2.5, 0}, {3.15, 0}, {4, 0}, {5, 0}, {6.3, 0}, {8, 0}, {10, 0}}

    ''' <summary>
    '''Tamisat cumulé en % - Clé: dimension du tamis - Valeur: Tamisat en %  soit 50% et non 0,50
    ''' </summary>
    ''' <remarks></remarks>
    <Xml.Serialization.XmlIgnore> Public TamisatCumule_Pourcent As New Dictionary(Of Double, Double) From {{0.063, 0}, {0.08, 0}, {0.1, 0}, {0.125, 0}, {0.16, 0}, {0.2, 0}, {0.25, 0}, {0.315, 0}, {0.4, 0}, {0.5, 0},
        {0.63, 0}, {0.8, 0}, {1, 0}, {1.25, 0}, {1.6, 0}, {2, 0}, {2.5, 0}, {3.15, 0}, {4, 0}, {5, 0}, {6.3, 0}, {8, 0}, {10, 0}}

    ''' <summary>
    '''Valeurs Tamisat ou Refus, cumulé ou pas, en % ou grammes suivant la valeur du Choix du mode de mesure granulométrique - Unité: 0 = refus en g / 1 = refus cumulé en g / 2 = refus cumulé en % / 3 = tamisat cumulé en g / 4 = tamisat cumulé en % 
    ''' </summary>
    Public Val_Tamisat_Refus As New List(Of Double) 'From {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}

#End Region


    ''' <summary>
    '''Module de finesse de l'échantillon de sable - Unité: sans unité
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <Xml.Serialization.XmlIgnore> Public ReadOnly Property mf As Double
        Get
            mf = _mf
        End Get
    End Property

    ''' <summary>
    '''Module de finesse du mélange des deux sables - Unité: sans unité
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks>La valeur doit être comprise entre 1.8 et 3.2</remarks>
    Public Property mfCible As Double
        Get
            mfCible = _mfCible
        End Get
        Set(value As Double)
            If Not IsNumeric(value) Then
                Throw New ArgumentException("La valeur du Module de finesse du mélange des deux sables n'est pas numérique.")
            ElseIf value < 1.8 OrElse value > 3.2 Then
                Throw New ArgumentException("La valeur du Module de finesse du mélange des deux sables doit être comprise entre 1.8 et 3.2.")
            Else
                _mfCible = value
            End If
        End Set
    End Property

    ''' <summary>Programme de calcul des tamisats et du module de finesse de l'échantillon de sable</summary>
    '''  <param name="i_finesse">0= refus / 1= refus cumulé g  / 2 = refus cumulé en % / 3 = tamisat cumulé en g / 4 = tamisat cumulé en % </param>
    '''  <param name="i_Methode"> 1= méthode Dreux Gorisse / 2 = méthode Baron Ollivier / 3 = ... / 4 = ... </param>
    Public Sub ModuleFinesse(ByVal i_finesse As Integer, Optional ByVal i_Methode As Integer = 1)

        Select Case i_finesse
            Case 0 'refus
                RefusCumule_g.Item(10) = Refus(10)
                If Disponibilite_Tamis(8) = True Then RefusCumule_g(8) = Refus.Item(10) + Refus.Item(8)
                If Disponibilite_Tamis(6.3) = True Then RefusCumule_g(6.3) = Refus.Item(6.3) + Refus.Item(8) + Refus.Item(10)
                RefusCumule_g.Item(5) = Refus(10) + Refus(8) + Refus(6.3) + Refus(5)
                If Disponibilite_Tamis(4) = True Then RefusCumule_g.Item(4) = Refus(4) + RefusCumule_g(5)
                If Disponibilite_Tamis(3.15) = True Then RefusCumule_g.Item(3.15) = Refus(3.15) + Refus(4) + RefusCumule_g(5)
                RefusCumule_g.Item(2.5) = Refus(2.5) + Refus(3.15) + Refus(4) + RefusCumule_g(5)
                If Disponibilite_Tamis(2) = True Then RefusCumule_g(2) = Refus(2) + RefusCumule_g(2.5)
                If Disponibilite_Tamis(1.6) = True Then RefusCumule_g(1.6) = Refus(1.6) + Refus(2) + RefusCumule_g(2.5)
                RefusCumule_g(1.25) = Refus(1.25) + Refus(1.6) + Refus(2) + RefusCumule_g(2.5)
                If Disponibilite_Tamis(1) = True Then RefusCumule_g(1) = Refus(1) + RefusCumule_g(1.25)
                If Disponibilite_Tamis(0.8) = True Then RefusCumule_g(0.8) = Refus(0.8) + Refus(1) + RefusCumule_g(1.25)
                RefusCumule_g(0.63) = Refus(0.63) + Refus(0.8) + Refus(1) + RefusCumule_g(1.25)
                If Disponibilite_Tamis(0.5) = True Then RefusCumule_g(0.5) = Refus(0.5) + RefusCumule_g(0.63)
                If Disponibilite_Tamis(0.4) = True Then RefusCumule_g(0.4) = Refus(0.4) + Refus(0.5) + RefusCumule_g(0.63)
                RefusCumule_g(0.315) = Refus(0.315) + Refus(0.4) + Refus(0.5) + RefusCumule_g(0.63)
                If Disponibilite_Tamis(0.25) = True Then RefusCumule_g(0.25) = Refus(0.25) + RefusCumule_g(0.315)
                If Disponibilite_Tamis(0.2) = True Then RefusCumule_g(0.2) = Refus(0.2) + Refus(0.25) + RefusCumule_g(0.315)
                RefusCumule_g(0.16) = Refus(0.16) + Refus(0.2) + Refus(0.25) + RefusCumule_g(0.315)
                If Disponibilite_Tamis(0.125) = True Then RefusCumule_g(0.125) = Refus(0.125) + RefusCumule_g(0.16)
                If Disponibilite_Tamis(0.1) = True Then RefusCumule_g(0.1) = Refus(0.1) + Refus(0.125) + RefusCumule_g(0.16)
                If Disponibilite_Tamis(0.08) = True Then RefusCumule_g(0.08) = Refus(0.08) + Refus(0.1) + Refus(0.125) + RefusCumule_g(0.16)
                If Disponibilite_Tamis(0.063) = True Then RefusCumule_g(0.063) = Refus(0.063) + Refus(0.08) + Refus(0.1) + Refus(0.125) + RefusCumule_g(0.16)
                'Refus cumulé en %
                RefusCumule_Pourcent(10) = Refus(10) * 100 / Ms
                If Disponibilite_Tamis(8) = True Then RefusCumule_Pourcent(8) = (Refus(10) + Refus(8)) * 100 / Ms
                If Disponibilite_Tamis(6.3) = True Then RefusCumule_Pourcent(6.3) = (Refus(6.3) + Refus(8) + Refus(10)) * 100 / Ms
                RefusCumule_Pourcent(5) = (Refus(10) + Refus(8) + Refus(6.3) + Refus(5)) * 100 / Ms
                If Disponibilite_Tamis(4) = True Then RefusCumule_Pourcent(4) = (Refus(4) + RefusCumule_g(5)) * 100 / Ms
                If Disponibilite_Tamis(3.15) = True Then RefusCumule_Pourcent(3.15) = (Refus(3.15) + Refus(4) + RefusCumule_g(5)) * 100 / Ms
                RefusCumule_Pourcent(2.5) = (Refus(2.5) + Refus(3.15) + Refus(4) + RefusCumule_g(5)) * 100 / Ms
                If Disponibilite_Tamis(2) = True Then RefusCumule_Pourcent(2) = (Refus(2) + RefusCumule_g(2.5)) * 100 / Ms
                If Disponibilite_Tamis(1.6) = True Then RefusCumule_Pourcent(1.6) = (Refus(1.6) + Refus(2) + RefusCumule_g(2.5)) * 100 / Ms
                RefusCumule_Pourcent(1.25) = (Refus(1.25) + Refus(1.6) + Refus(2) + RefusCumule_g(2.5)) * 100 / Ms
                If Disponibilite_Tamis(1) = True Then RefusCumule_Pourcent(1) = (Refus(1) + RefusCumule_g(1.25)) * 100 / Ms
                If Disponibilite_Tamis(0.8) = True Then RefusCumule_Pourcent(0.8) = (Refus(0.8) + Refus(1) + RefusCumule_g(1.25)) * 100 / Ms
                RefusCumule_Pourcent(0.63) = (Refus(0.63) + Refus(0.8) + Refus(1) + RefusCumule_g(1.25)) * 100 / Ms
                If Disponibilite_Tamis(0.5) = True Then RefusCumule_Pourcent(0.5) = (Refus(0.5) + RefusCumule_g(0.63)) * 100 / Ms
                If Disponibilite_Tamis(0.4) = True Then RefusCumule_Pourcent(0.4) = (Refus(0.4) + Refus(0.5) + RefusCumule_g(0.63)) * 100 / Ms
                RefusCumule_Pourcent(0.315) = (Refus(0.315) + Refus(0.4) + Refus(0.5) + RefusCumule_g(0.63)) * 100 / Ms
                If Disponibilite_Tamis(0.25) = True Then RefusCumule_Pourcent(0.25) = (Refus(0.25) + RefusCumule_g(0.315)) * 100 / Ms
                If Disponibilite_Tamis(0.2) = True Then RefusCumule_Pourcent(0.2) = (Refus(0.2) + Refus(0.25) + RefusCumule_g(0.315)) * 100 / Ms
                RefusCumule_Pourcent(0.16) = (Refus(0.16) + Refus(0.2) + Refus(0.25) + RefusCumule_g(0.315)) * 100 / Ms
                If Disponibilite_Tamis(0.125) = True Then RefusCumule_Pourcent(0.125) = (Refus(0.125) + RefusCumule_g(0.16)) * 100 / Ms
                If Disponibilite_Tamis(0.1) = True Then RefusCumule_Pourcent(0.1) = (Refus(0.1) + Refus(0.125) + RefusCumule_g(0.16)) * 100 / Ms
                If Disponibilite_Tamis(0.08) = True Then RefusCumule_Pourcent(0.08) = (Refus(0.08) + Refus(0.1) + Refus(0.125) + RefusCumule_g(0.16)) * 100 / Ms
                If Disponibilite_Tamis(0.063) = True Then RefusCumule_Pourcent(0.063) = (Refus(0.063) + Refus(0.08) + Refus(0.1) + Refus(0.125) + RefusCumule_g(0.16)) * 100 / Ms
                'Tamisat cumulé en g
                Call TamisatCumuleG()
                'Tamisat cumulé en %
                Call TamisatCumulePourcent()
            Case 1 'refus cumulé g
                'Tamisat cumulé en g
                Call TamisatCumuleG()
                'Tamisat cumulé en %
                Call TamisatCumulePourcent()
                'refus cumulé %
                RefusCumule_Pourcent(0.16) = 100 - TamisatCumule_Pourcent(0.16)
                RefusCumule_Pourcent(0.315) = 100 - TamisatCumule_Pourcent(0.315)
                RefusCumule_Pourcent(0.63) = 100 - TamisatCumule_Pourcent(0.63)
                RefusCumule_Pourcent(1.25) = 100 - TamisatCumule_Pourcent(1.25)
                RefusCumule_Pourcent(2.5) = 100 - TamisatCumule_Pourcent(2.5)
                RefusCumule_Pourcent(5) = 100 - TamisatCumule_Pourcent(5)
                RefusCumule_Pourcent(10) = 100 - TamisatCumule_Pourcent(10)
            Case 2 'refus cumulé %
                If Disponibilite_Tamis(0.063) = True Then RefusCumule_g(0.063) = RefusCumule_Pourcent(0.063) * Ms / 100 Else RefusCumule_g(0.063) = 0
                If Disponibilite_Tamis(0.08) = True Then RefusCumule_g(0.08) = RefusCumule_Pourcent(0.08) * Ms / 100 Else RefusCumule_g(0.08) = 0
                If Disponibilite_Tamis(0.1) = True Then RefusCumule_g(0.1) = RefusCumule_Pourcent(0.1) * Ms / 100 Else RefusCumule_g(0.1) = 0
                If Disponibilite_Tamis(0.125) = True Then RefusCumule_g(0.125) = RefusCumule_Pourcent(0.125) * Ms / 100 Else RefusCumule_g(0.125) = 0
                RefusCumule_g(0.16) = RefusCumule_Pourcent(0.16) * Ms / 100
                If Disponibilite_Tamis(0.2) = True Then RefusCumule_g(0.2) = RefusCumule_Pourcent(0.2) * Ms / 100 Else RefusCumule_g(0.2) = 0
                If Disponibilite_Tamis(0.25) = True Then RefusCumule_g(0.25) = RefusCumule_Pourcent(0.25) * Ms / 100 Else RefusCumule_g(0.25) = 0
                RefusCumule_g(0.315) = RefusCumule_Pourcent(0.315) * Ms / 100
                If Disponibilite_Tamis(0.4) = True Then RefusCumule_g(0.4) = RefusCumule_Pourcent(0.4) * Ms / 100 Else RefusCumule_g(0.4) = 0
                If Disponibilite_Tamis(0.5) = True Then RefusCumule_g(0.5) = RefusCumule_Pourcent(0.5) * Ms / 100 Else RefusCumule_g(0.5) = 0
                RefusCumule_g(0.63) = RefusCumule_Pourcent(0.63) * Ms / 100
                If Disponibilite_Tamis(0.8) = True Then RefusCumule_g(0.8) = RefusCumule_Pourcent(0.8) * Ms / 100 Else RefusCumule_g(0.8) = 0
                If Disponibilite_Tamis(1) = True Then RefusCumule_g(1) = RefusCumule_Pourcent(1) * Ms / 100 Else RefusCumule_g(1) = 0
                RefusCumule_g(1.25) = RefusCumule_Pourcent(1.25) * Ms / 100
                If Disponibilite_Tamis(1.6) = True Then RefusCumule_g(1.6) = RefusCumule_Pourcent(1.6) * Ms / 100 Else RefusCumule_g(1.6) = 0
                If Disponibilite_Tamis(2) = True Then RefusCumule_g(2) = RefusCumule_Pourcent(2) * Ms / 100 Else RefusCumule_g(2) = 0
                RefusCumule_g(2.5) = RefusCumule_Pourcent(2.5) * Ms / 100
                If Disponibilite_Tamis(3.15) = True Then RefusCumule_g(3.15) = RefusCumule_Pourcent(3.15) * Ms / 100 Else RefusCumule_g(3.15) = 0
                If Disponibilite_Tamis(4) = True Then RefusCumule_g(4) = RefusCumule_Pourcent(4) * Ms / 100 Else RefusCumule_g(4) = 0
                RefusCumule_g(5) = RefusCumule_Pourcent(5) * Ms / 100
                If Disponibilite_Tamis(6.3) = True Then RefusCumule_g(6.3) = RefusCumule_Pourcent(6.3) * Ms / 100 Else RefusCumule_g(6.3) = 0
                If Disponibilite_Tamis(8) = True Then RefusCumule_g(8) = RefusCumule_Pourcent(8) * Ms / 100 Else RefusCumule_g(8) = 0
                RefusCumule_g(10) = RefusCumule_Pourcent(10) * Ms / 100
                'Tamisat cumulé en g
                Call TamisatCumuleG()
                'Tamisat cumulé en %
                Call TamisatCumulePourcent()
            Case 3 'tamisat cumulé g
                'Tamisat cumulé en %
                Call TamisatCumulePourcent()
                'refus cumulé %
                RefusCumule_Pourcent(0.16) = 100 - TamisatCumule_Pourcent(0.16)
                RefusCumule_Pourcent(0.315) = 100 - TamisatCumule_Pourcent(0.315)
                RefusCumule_Pourcent(0.63) = 100 - TamisatCumule_Pourcent(0.63)
                RefusCumule_Pourcent(1.25) = 100 - TamisatCumule_Pourcent(1.25)
                RefusCumule_Pourcent(2.5) = 100 - TamisatCumule_Pourcent(2.5)
                RefusCumule_Pourcent(5) = 100 - TamisatCumule_Pourcent(5)
                RefusCumule_Pourcent(10) = 100 - TamisatCumule_Pourcent(10)
            Case 4 ' tamisat cumulé %
                'refus cumulé %
                RefusCumule_Pourcent(0.16) = 100 - TamisatCumule_Pourcent(0.16)
                RefusCumule_Pourcent(0.315) = 100 - TamisatCumule_Pourcent(0.315)
                If RefusCumule_Pourcent(0.315) > RefusCumule_Pourcent(0.16) Then
                    MessageBox.Show("RefusCumule_Pourcent(0.315) < RefusCumule_Pourcent(0.16)", "ModuleFinesse ", MessageBoxButtons.OK, MessageBoxIcon.Error) : Exit Sub
                End If
                RefusCumule_Pourcent(0.63) = 100 - TamisatCumule_Pourcent(0.63)
                If RefusCumule_Pourcent(0.63) > RefusCumule_Pourcent(0.315) Then
                    MessageBox.Show("RefusCumule_Pourcent(0.63) < RefusCumule_Pourcent(0.315)", "ModuleFinesse ", MessageBoxButtons.OK, MessageBoxIcon.Error) : Exit Sub
                End If
                RefusCumule_Pourcent(1.25) = 100 - TamisatCumule_Pourcent(1.25)
                If Disponibilite_Tamis(2.5) = True Then
                    RefusCumule_Pourcent(2.5) = 100 - TamisatCumule_Pourcent(2.5)
                Else
                    If RefusCumule_Pourcent(2) = 0 Then
                        RefusCumule_Pourcent(2.5) = 0
                    Else
                        MessageBox.Show("Disponibilite_Tamis(2.5) non disponible", "ModuleFinesse ", MessageBoxButtons.OK, MessageBoxIcon.Error) : Exit Sub
                    End If
                End If
                If Disponibilite_Tamis(5) = True Then
                    RefusCumule_Pourcent(5) = 100 - TamisatCumule_Pourcent(5)
                Else
                    If RefusCumule_Pourcent(4) = 0 Then
                        RefusCumule_Pourcent(5) = 0
                    Else
                        MessageBox.Show("Disponibilite_Tamis(5) non disponible", "ModuleFinesse ", MessageBoxButtons.OK, MessageBoxIcon.Error) : Exit Sub
                    End If
                End If
                If Disponibilite_Tamis(10) = True Then
                    RefusCumule_Pourcent(10) = 100 - TamisatCumule_Pourcent(10)
                Else
                    RefusCumule_Pourcent(10) = 0
                    'If RefusCumule_Pourcent(4) = 0 Then
                    '    RefusCumule_Pourcent(5) = 0
                    'Else
                    ' MessageBox.Show("Disponibilite_Tamis(5) non disponible", "ModuleFinesse ", MessageBoxButtons.OK, MessageBoxIcon.Error) : Exit Sub
                    ' End If
                End If
        End Select
        Select Case i_Methode
            Case 1 'Méthode dreux-Gorisse
                _mf = (RefusCumule_Pourcent(0.16) + RefusCumule_Pourcent(0.315) + RefusCumule_Pourcent(0.63) + RefusCumule_Pourcent(1.25) + RefusCumule_Pourcent(2.5) + RefusCumule_Pourcent(5)) / 100
            Case 2 'Méthode Baron-Ollivier
                _mf = (RefusCumule_Pourcent(0.16) + RefusCumule_Pourcent(0.315) + RefusCumule_Pourcent(0.63) + RefusCumule_Pourcent(1.25) + RefusCumule_Pourcent(2.5) + RefusCumule_Pourcent(5) + RefusCumule_Pourcent(10)) / 100
            Case Else
                _mf = (RefusCumule_Pourcent(0.16) + RefusCumule_Pourcent(0.315) + RefusCumule_Pourcent(0.63) + RefusCumule_Pourcent(1.25) + RefusCumule_Pourcent(2.5) + RefusCumule_Pourcent(5)) / 100
        End Select


    End Sub

    ''' <summary>
    ''' Programme de calcul du tamisat cumulé en % de l'échantillon de sable
    ''' </summary>
    Private Sub TamisatCumulePourcent()
        If Disponibilite_Tamis(0.063) = True Then TamisatCumule_Pourcent(0.063) = TamisatCumule_g(0.063) * 100 / Ms Else TamisatCumule_Pourcent(0.063) = 0
        If Disponibilite_Tamis(0.08) = True Then TamisatCumule_Pourcent(0.08) = TamisatCumule_g(0.08) * 100 / Ms
        If Disponibilite_Tamis(0.1) = True Then TamisatCumule_Pourcent(0.1) = TamisatCumule_g(0.1) * 100 / Ms
        If Disponibilite_Tamis(0.125) = True Then TamisatCumule_Pourcent(0.125) = TamisatCumule_g(0.125) * 100 / Ms
        TamisatCumule_Pourcent(0.16) = TamisatCumule_g(0.16) * 100 / Ms
        If Disponibilite_Tamis(0.2) = True Then TamisatCumule_Pourcent(0.2) = TamisatCumule_g(0.2) * 100 / Ms
        If Disponibilite_Tamis(0.25) = True Then TamisatCumule_Pourcent(0.25) = TamisatCumule_g(0.25) * 100 / Ms
        TamisatCumule_Pourcent(0.315) = TamisatCumule_g(0.315) * 100 / Ms
        If Disponibilite_Tamis(0.4) = True Then TamisatCumule_Pourcent(0.4) = TamisatCumule_g(0.4) * 100 / Ms
        If Disponibilite_Tamis(0.5) = True Then TamisatCumule_Pourcent(0.5) = TamisatCumule_g(0.5) * 100 / Ms
        TamisatCumule_Pourcent(0.63) = TamisatCumule_g(0.63) * 100 / Ms
        If Disponibilite_Tamis(0.8) = True Then TamisatCumule_Pourcent(0.8) = TamisatCumule_g(0.8) * 100 / Ms
        If Disponibilite_Tamis(1) = True Then TamisatCumule_Pourcent(1) = TamisatCumule_g(1) * 100 / Ms
        TamisatCumule_Pourcent(1.25) = TamisatCumule_g(1.25) * 100 / Ms
        If Disponibilite_Tamis(1.6) = True Then TamisatCumule_Pourcent(1.6) = TamisatCumule_g(1.6) * 100 / Ms
        If Disponibilite_Tamis(2) = True Then TamisatCumule_Pourcent(2) = TamisatCumule_g(2) * 100 / Ms
        TamisatCumule_Pourcent(2.5) = TamisatCumule_g(2.5) * 100 / Ms
        If Disponibilite_Tamis(3.15) = True Then TamisatCumule_Pourcent(3.15) = TamisatCumule_g(3.15) * 100 / Ms
        If Disponibilite_Tamis(4) = True Then TamisatCumule_Pourcent(4) = TamisatCumule_g(4) * 100 / Ms
        TamisatCumule_Pourcent(5) = TamisatCumule_g(5) * 100 / Ms
        If Disponibilite_Tamis(6.3) = True Then TamisatCumule_Pourcent(6.3) = TamisatCumule_g(6.3) * 100 / Ms
        If Disponibilite_Tamis(8) = True Then TamisatCumule_Pourcent(8) = TamisatCumule_g(8) * 100 / Ms
        TamisatCumule_Pourcent(10) = TamisatCumule_g(10) * 100 / Ms
    End Sub

    ''' <summary>
    ''' Programme de calcul du tamisat cumulé en g de l'échantillon de sable
    ''' </summary>
    Private Sub TamisatCumuleG()
        If Disponibilite_Tamis(0.063) = True Then TamisatCumule_g(0.063) = Ms - RefusCumule_g(0.063)
        If Disponibilite_Tamis(0.08) = True Then TamisatCumule_g(0.08) = Ms - RefusCumule_g(0.08)
        If Disponibilite_Tamis(0.1) = True Then TamisatCumule_g(0.1) = Ms - RefusCumule_g(0.1)
        If Disponibilite_Tamis(0.125) = True Then TamisatCumule_g(0.125) = Ms - RefusCumule_g(0.125)
        TamisatCumule_g(0.16) = Ms - RefusCumule_g(0.16)
        If Disponibilite_Tamis(0.2) = True Then TamisatCumule_g(0.2) = Ms - RefusCumule_g(0.2)
        If Disponibilite_Tamis(0.25) = True Then TamisatCumule_g(0.25) = Ms - RefusCumule_g(0.25)
        TamisatCumule_g(0.315) = Ms - RefusCumule_g(0.315)
        If Disponibilite_Tamis(0.4) = True Then TamisatCumule_g(0.4) = Ms - RefusCumule_g(0.4)
        If Disponibilite_Tamis(0.5) = True Then TamisatCumule_g(0.5) = Ms - RefusCumule_g(0.5)
        TamisatCumule_g(0.63) = Ms - RefusCumule_g(0.63)
        If Disponibilite_Tamis(0.8) = True Then TamisatCumule_g(0.8) = Ms - RefusCumule_g(0.8)
        If Disponibilite_Tamis(1) = True Then TamisatCumule_g(1) = Ms - RefusCumule_g(1)
        TamisatCumule_g(1.25) = Ms - RefusCumule_g(1.25)
        If Disponibilite_Tamis(1.6) = True Then TamisatCumule_g(1.6) = Ms - RefusCumule_g(1.6)
        If Disponibilite_Tamis(2) = True Then TamisatCumule_g(2) = Ms - RefusCumule_g(2)
        TamisatCumule_g(2.5) = Ms - RefusCumule_g(2.5)
        If Disponibilite_Tamis(3.15) = True Then TamisatCumule_g(3.15) = Ms - RefusCumule_g(3.15)
        If Disponibilite_Tamis(4) = True Then TamisatCumule_g(4) = Ms - RefusCumule_g(4)
        TamisatCumule_g(5) = Ms - RefusCumule_g(5)
        If Disponibilite_Tamis(6.3) = True Then TamisatCumule_g(6.3) = Ms - RefusCumule_g(6.3)
        If Disponibilite_Tamis(8) = True Then TamisatCumule_g(8) = Ms - RefusCumule_g(8)
        TamisatCumule_g(10) = Ms - RefusCumule_g(10)
    End Sub



    ''' <summary>
    ''' Fonction permettant de vérifier que la valeur transmise est bien numérique
    ''' </summary>
    ''' <returns>TRUE si la valeur est bien numérique sinon FALSE</returns>
    ''' <remarks></remarks>
    Private Function IsNumeric(Expression As Object) As Boolean
        Dim isNum As Boolean 'Variable to collect the Return value of the TryParse method.
        Dim retNum As Double ' Define variable to collect out parameter of the TryParse method. If the conversion fails, the out parameter Is zero.

        '// The TryParse method converts a string in a specified style And culture-specific format to its double-precision floating point number equivalent.
        '// The TryParse method does Not generate an exception if the conversion fails. If the conversion passes, True Is returned. If it does Not, False Is returned.
        isNum = Double.TryParse(Convert.ToString(Expression), System.Globalization.NumberStyles.Any, System.Globalization.NumberFormatInfo.InvariantInfo, retNum)
        Return isNum
    End Function

    ''' <summary>
    ''' Fonction permettant de vérifier que la valeur transmise est bien une chaine de caractères
    ''' </summary>
    ''' <returns>TRUE si la valeur est bien une chaine de caractères sinon FALSE</returns>
    ''' <remarks></remarks>
    Private Function IsString(Expression As Object) As Boolean
        Dim isStr As Boolean 'Variable to collect the Return value of the Convert.ToString method.
        Dim retStr As String '  
        '// The Convert.ToString method does Not generate an exception if the conversion fails. If the conversion passes, True Is returned. If it does Not, False Is returned.
        retStr = Convert.ToString(Expression)
        If retStr = "" Then
            isStr = False
        Else
            isStr = True
        End If
        Return isStr
    End Function
End Class
