2 scripts pour Calculer HClO en présence de stabilisant

Ce sujet comporte 8 messages et a été affiché 283 fois
 
Env. 2000 message
Wesh !

ci dessous un script Python

quifournit un tableau excel avec

HOCl (chlore actif)

en fonction
du pH de 7.0 à 8.0 par pas de 0.1
et du Chlore disponible (ppm)de 0.5 à 10 par ps de 0.5
pour 15 ppm de stab

ces valeurs peuvent etre facilement modifiees dans le script lui même en fonction des besoins de chacun
y a largement de quoi optimiser mon script et de plusieurs manières
(perso. y me suffit largement pour le moment...)

neamoins merci par avance pour les retours : critiques, commentaires, remarques, amléliorations, etc.

sinon le tableau XL dans son etat actuel permet deja l'édition de magnifiques courbes, presentations diverses, etc. pour les amateurs de ce genre de choses

du point de vue de la chimie, ce script s'appuie sur le papier de Wahman :

Free Chlorine and Cyanuric Acid Simulator Application Description - Version 0.50
EPA/600/S-17/165
June 2017




===============================================================
import numpy as np
from scipy.optimize import brentq
import pandas as pd

# Constantes Wahman v0.50 (25°C)
pK = {
    "K1a": 1.8,
    "K2": 3.75,
    "K4": 5.33,
    "K6": 6.88,
    "K7a": 4.51,
    "K8": 10.12,
    "K10": 11.40,
    "K11a": 6.90,
    "K12": 13.5,
    "K": 7.54
}

K = {k:10**(-v) for k,v in pK.items()}

# conversions ppm -> mol/L
MW_Cl2 = 70.906
MW_CYA = 129.07

def balances(hocl, pH, FC, CYA):

    H = 10**(-pH)

    TOTCl = FC*1e-3/MW_Cl2
    TOTCy = CYA*1e-3/MW_CYA

    # coefficient cyanurate
    A = (
        H**3/(K["K12"]*K["K10"]*K["K6"])
        + H**2/(K["K12"]*K["K10"])
        + H/K["K12"]
        + 1
        + hocl*H/(K["K12"]*K["K11a"])
        + hocl*H**2/(K["K12"]*K["K11a"]*K["K8"])
        + hocl*H**3/(K["K12"]*K["K11a"]*K["K8"]*K["K4"])
        + hocl**2*H**2/(K["K12"]*K["K11a"]*K["K8"]*K["K7a"])
        + hocl**2*H**3/(K["K12"]*K["K11a"]*K["K8"]*K["K7a"]*K["K2"])
        + hocl**3*H**3/(K["K12"]*K["K11a"]*K["K8"]*K["K7a"]*K["K2"]*K["K1a"])
    )

    Cy3 = TOTCy/A

    Cl3 = hocl**3*H**3*Cy3/(K["K12"]*K["K11a"]*K["K8"]*K["K7a"]*K["K2"]*K["K1a"])
    HCl2 = hocl**2*H**3*Cy3/(K["K12"]*K["K11a"]*K["K8"]*K["K7a"]*K["K2"])
    H2Cl = hocl*H**3*Cy3/(K["K12"]*K["K11a"]*K["K8"]*K["K4"])
    Cl2 = hocl**2*H**2*Cy3/(K["K12"]*K["K11a"]*K["K8"]*K["K7a"])
    HClCy = hocl*H**2*Cy3/(K["K12"]*K["K11a"]*K["K8"])
    ClCy = hocl*H*Cy3/(K["K12"]*K["K11a"])

    OCl = K["K"]*hocl/H

    calcCl = (
        3*Cl3
        +2*HCl2
        +H2Cl
        +2*Cl2
        +HClCy
        +ClCy
        +hocl
        +OCl
    )

    return calcCl-TOTCl


def HOCl_value(pH, FC, CYA):

    f=lambda x: balances(x,pH,FC,CYA)

    hocl=brentq(
        f,
        1e-12,
        FC*1e-3/MW_Cl2
    )

    # retour ppm HOCl
    return hocl*MW_Cl2*1000


# pour valeurs de pH de 7.0 à 8.01 par pas de 0.1
pH_values=np.arange(7.0,8.01,0.1)
# pour valeurs de FC de 0.5 à 10.1 par pas de 0.5
FC_values=np.arange(0.5,10.1,0.5)

table=[]

# modifier la valeur de CYA ci dessous dans la formule apres pH,FC
for FC in FC_values:
    row={"FC ppm":round(FC,1)}
    for pH in pH_values:
        row[f"pH {pH:.1f}"]=round(
            HOCl_value(pH,FC,15),
            4
        )
    table.append(row)

df=pd.DataFrame(table)

# print(df.to_string(index=False))

# transfert dans tableau Excel Modifier la valeur apres CYA
df.to_excel("HOCl_Wahman_CYA15C.xlsx", index=False)

================================================================
Si tous ceux qui croient avoir raison n'avaient pas tort, la vérité ne serait pas loin.
Pierre Dac
3
Messages : Env. 2000
Dept : Pyrenees Atlantiques
Ancienneté : + de 5 ans
 
Env. 1000 message
Ne vous prenez pas la tête pour la fourniture et/ou pose d'une pompe à chaleur de piscine...

Allez dans la section devis pompes à chaleur pour piscine du site, remplissez le formulaire et vous recevrez jusqu'à 5 devis comparatifs de professionnels de votre région. Comme ça vous ne courrez plus après les professionnels, c'est eux qui viennent à vous

C'est ici : http://www.forumpiscine.com/devis_piscine/0-36-devis_chauffage_pompes_a_chaleur_pour_piscine.php
 
Env. 200 message
Merci

ça fonctionne chez moi
penser à importer les modules numpy, scipy, pandas et openpyxl
0
Messages : Env. 200
Dept : Bas Rhin
Ancienneté : + de 4 ans
 
Env. 2000 message
Wesh !

greenood a écrit:Merci

ça fonctionne chez moi
penser à importer les modules numpy, scipy, pandas et openpyxl

 oui bien sur
le script pour ceux qui pratique tant soi peu le python
sinon y a toujours moyen de trouver un tuto sur la toile
Si tous ceux qui croient avoir raison n'avaient pas tort, la vérité ne serait pas loin.
Pierre Dac
0
Messages : Env. 2000
Dept : Pyrenees Atlantiques
Ancienneté : + de 5 ans
 
Env. 300 message
Pas de version Excel pour les ignares en Python ?
0
Messages : Env. 300
Dept : Vaucluse
Ancienneté : + de 7 ans
 
Env. 100 message
geeji a écrit:Pas de version Excel pour les ignares en Python ?


Comme mentionné le script génère un tableau Excel, avec des valeurs cibles en fonction des paramètres choisis.
Donc nul besoin de connaitre Python, il suffit de l'exécuter le script.

Pour cela il faut néanmoins avoir un environnement Python d'installé sur son PC. Si ce n'est pas le cas, voir ici : Python Releases for Windows | Python.org


Maintenant si quelqu'un est vraiment allergique à Python et  veut traduire le script Python en Office Script libre à lui ... 
0
Messages : Env. 100
Dept : Isere
Ancienneté : + de 1 an
 
Env. 1000 message
Bonjour,

Ci dessous un script que jai écrit en basic LibreOffice Calc.

Il crée une fonction HOCLCALC dans LibreOffice qui calcule le taux de HClO pour des valeurs données de pH, CyA et Chlore disponible exprimées en ppm.

A partir de cette fonction, tout un tas de possibilités pour faire un calcul unique, des tableaux, des courbes, etc.

Je l'ai implementée sur un ordinateur tournant sous Linux Mint et il ne devrait pas être trop compliqué  de l'installer sous d'autres OS.

Peut-être est-ce plus difficile de transcrire en Basic Excel....





REM  *****  BASIC  *****

Option Explicit

'=========================================================
'  hoclcalc v3,.2 - jph 2026
'  EPA HOCl / CYA MODEL  5.0
'  - coefficients H/Cy precalcules une seule fois par cellule
'  - Newton-Raphson securise (repli bissection)
'=========================================================

Private Const MWCL2 As Double = 71000
Private Const MWCYA As Double = 129070

Private Const K1a  As Double = 10^(-1.80)
Private Const K2   As Double = 10^(-3.75)
Private Const K4   As Double = 10^(-5.33)
Private Const K6   As Double = 10^(-6.88)
Private Const K7a  As Double = 10^(-4.51)
Private Const K8   As Double = 10^(-10.12)
Private Const K10  As Double = 10^(-11.40)
Private Const K11a As Double = 10^(-6.90)
Private Const K12  As Double = 10^(-13.50)

Private Const KHOCl As Double = 10^(-7.54)

Private Const INV_K1211      As Double = 1# / (K12 * K11a)
Private Const INV_K12118     As Double = 1# / (K12 * K11a * K8)
Private Const INV_K121187    As Double = 1# / (K12 * K11a * K8 * K7a)
Private Const INV_K1211872   As Double = 1# / (K12 * K11a * K8 * K7a * K2)
Private Const INV_K12118721  As Double = 1# / (K12 * K11a * K8 * K7a * K2 * K1a)
Private Const INV_K121184    As Double = 1# / (K12 * K11a * K8 * K4)
Private Const INV_K12106     As Double = 1# / (K12 * K10 * K6)
Private Const INV_K1210      As Double = 1# / (K12 * K10)
Private Const INV_K12        As Double = 1# / K12

Private Type TCoefs
   a3 As Double
   a2 As Double
   a1 As Double
   D  As Double
   E  As Double
   F  As Double
   G  As Double
   K  As Double
End Type

Private Function Cl2ToMol(ByVal x As Double) As Double
   Cl2ToMol = x / MWCL2
End Function

Private Function CyToMol(ByVal x As Double) As Double
   CyToMol = x / MWCYA
End Function

Private Function MolToCl2(ByVal x As Double) As Double
   MolToCl2 = x * MWCL2
End Function

Public Function HOClCalc( _
       ByVal pH As Double, _
       ByVal TOTCy As Double, _
       ByVal TOTCl As Double) As Double

   Dim H As Double
   Dim Cy As Double
   Dim Cl As Double
   Dim x As Double

   H = 10 ^ (-pH)

   Cy = CyToMol(TOTCy)
   Cl = Cl2ToMol(TOTCl)

   x = SolveHOCl(H, Cy, Cl)

   If x < 0# Then
       HOClCalc = 0#
       Exit Function
   End If

   HOClCalc = MolToCl2(x)

End Function

Private Sub BuildCoefs(ByVal H As Double, ByVal Cy As Double, ByRef co As TCoefs)

   Dim H2 As Double
   Dim H3 As Double
   Dim A As Double, B As Double, C As Double

   H2 = H * H
   H3 = H2 * H

   A = 3# * H3 * INV_K12118721

   B = 2# * H3 * INV_K1211872 _
     + 2# * H2 * INV_K121187

   C = H3 * INV_K121184 _
     + H2 * INV_K12118 _
     + H * INV_K1211

   co.a3 = Cy * A
   co.a2 = Cy * B
   co.a1 = Cy * C

   co.D = H3 * INV_K12118721

   co.E = H3 * INV_K1211872 _
        + H2 * INV_K121187

   co.F = C

   co.G = H3 * INV_K12106 _
        + H2 * INV_K1210 _
        + H * INV_K12 _
        + 1#

   co.K = 1# + KHOCl / H

End Sub

Private Sub EvalFast(ByVal x As Double, ByRef co As TCoefs, _
                     ByRef f As Double, ByRef df As Double)

   Dim Num As Double, Den As Double
   Dim dNum As Double, dDen As Double
   Dim x2 As Double

   x2 = x * x

   Num = co.a3 * x2 * x + co.a2 * x2 + co.a1 * x
   Den = co.D * x2 * x + co.E * x2 + co.F * x + co.G

   dNum = 3# * co.a3 * x2 + 2# * co.a2 * x + co.a1
   dDen = 3# * co.D * x2 + 2# * co.E * x + co.F

   f  = Num / Den + co.K * x
   df = (dNum * Den - Num * dDen) / (Den * Den) + co.K

End Sub

Private Function Equation15Fast(ByVal x As Double, ByRef co As TCoefs) As Double
   Dim f As Double, df As Double
   EvalFast x, co, f, df
   Equation15Fast = f
End Function

Private Function SolveHOCl( _
       ByVal H As Double, _
       ByVal Cy As Double, _
       ByVal TotCl As Double) As Double

   Const MAXITER As Integer = 60
   Const EPSX    As Double = 1E-13
   Const EPSF    As Double = 1E-13

   Dim co As TCoefs
   Dim a As Double, b As Double, x As Double
   Dim fa As Double, fb As Double, fx As Double, dfx As Double
   Dim i As Integer
   Dim stp As Double
   Dim xNext As Double

   If TotCl <= 0# Then
       SolveHOCl = 0#
       Exit Function
   End If

   BuildCoefs H, Cy, co

   a = 0#
   b = TotCl

   fa = Equation15Fast(a, co) - TotCl
   fb = Equation15Fast(b, co) - TotCl

   If Abs(fa) < EPSF Then
       SolveHOCl = a
       Exit Function
   End If

   If Abs(fb) < EPSF Then
       SolveHOCl = b
       Exit Function
   End If

   If fa * fb > 0# Then
       SolveHOCl = -1#
       Exit Function
   End If

   x = TotCl / (1# + KHOCl / H)
   If x <= a Or x >= b Then x = 0.5 * (a + b)

   For i = 1 To MAXITER

       EvalFast x, co, fx, dfx
       fx = fx - TotCl

       If Abs(fx) < EPSF Then Exit For

       If fa * fx < 0# Then
           b = x
           fb = fx
       Else
           a = x
           fa = fx
       End If

       If dfx <> 0# Then
           stp = fx / dfx
       Else
           stp = (b - a)
       End If

       xNext = x - stp

       If xNext <= a Or xNext >= b Then
           xNext = 0.5 * (a + b)
       End If

       If Abs(xNext - x) < EPSX * (1# + Abs(x)) Then
           x = xNext
           Exit For
       End If

       x = xNext

   Next i

   If x < 0# Then x = 0#
   If x > TotCl Then x = TotCl

   SolveHOCl = x

End Function

Sub Test()
   MsgBox Cl2ToMol(5)
End Sub
1
Messages : Env. 1000
Dept : Bouches Du Rhone
Ancienneté : + de 6 ans
 
Env. 2000 message
Wouah !

j'avais essayé le solveur de LibreOffice
vachement lent et pas toujours convergent
la fonction de Chloramine c'est ultra précis et ultra rapide !
y aura surement un geek pour la transcription dans Exel...
Si tous ceux qui croient avoir raison n'avaient pas tort, la vérité ne serait pas loin.
Pierre Dac
0
Messages : Env. 2000
Dept : Pyrenees Atlantiques
Ancienneté : + de 5 ans
 
Env. 1000 message
Bonsoir,

On m'a fait remarquer que mon script Basic permettait de calculer HClO à partir de pH, CyA et Chole disponible mais pas "l’inverse".

Voici donc une nouvelle version de ce script qui créée deux fonctions dans LibreOffice Calc :

- hoclcalc(pH;CyA;CD) qui retourne HClO pour les valeurs de pH, CyA et chlore disponible

- totckcalc(pH;CyA;HClO) qui retourne le chlore disponible pour ....




REM ***** BASIC *****

'=========================================================
' hoclcalc v3.3 - jph 2026 avec TotClCalc
' EPA HOCl / CYA MODEL 5.0
' - coefficients H/Cy precalcules une seule fois par cellule
' - Newton-Raphson securise (repli bissection)
'=========================================================

Option Explicit

Private Const MWCL2 As Double = 71000
Private Const MWCYA As Double = 129070

Private Const K1a As Double = 10^(-1.80)
Private Const K2 As Double = 10^(-3.75)
Private Const K4 As Double = 10^(-5.33)
Private Const K6 As Double = 10^(-6.88)
Private Const K7a As Double = 10^(-4.51)
Private Const K8 As Double = 10^(-10.12)
Private Const K10 As Double = 10^(-11.40)
Private Const K11a As Double = 10^(-6.90)
Private Const K12 As Double = 10^(-13.50)

Private Const KHOCl As Double = 10^(-7.54)

Private Const INV_K1211 As Double = 1# / (K12 * K11a)
Private Const INV_K12118 As Double = 1# / (K12 * K11a * K8)
Private Const INV_K121187 As Double = 1# / (K12 * K11a * K8 * K7a)
Private Const INV_K1211872 As Double = 1# / (K12 * K11a * K8 * K7a * K2)
Private Const INV_K12118721 As Double = 1# / (K12 * K11a * K8 * K7a * K2 * K1a)
Private Const INV_K121184 As Double = 1# / (K12 * K11a * K8 * K4)
Private Const INV_K12106 As Double = 1# / (K12 * K10 * K6)
Private Const INV_K1210 As Double = 1# / (K12 * K10)
Private Const INV_K12 As Double = 1# / K12

Private Type TCoefs
a3 As Double
a2 As Double
a1 As Double
D As Double
E As Double
F As Double
G As Double
K As Double
End Type

Private Function Cl2ToMol(ByVal x As Double) As Double
Cl2ToMol = x / MWCL2
End Function

Private Function CyToMol(ByVal x As Double) As Double
CyToMol = x / MWCYA
End Function

Private Function MolToCl2(ByVal x As Double) As Double
MolToCl2 = x * MWCL2
End Function

Public Function HOClCalc( _
ByVal pH As Double, _
ByVal TOTCy As Double, _
ByVal TOTCl As Double) As Double

Dim H As Double
Dim Cy As Double
Dim Cl As Double
Dim x As Double

H = 10 ^ (-pH)

Cy = CyToMol(TOTCy)
Cl = Cl2ToMol(TOTCl)

x = SolveHOCl(H, Cy, Cl)

If x < 0# Then
HOClCalc = 0#
Exit Function
End If

HOClCalc = MolToCl2(x)

End Function

Private Sub BuildCoefs(ByVal H As Double, ByVal Cy As Double, ByRef co As TCoefs)

Dim H2 As Double
Dim H3 As Double
Dim A As Double, B As Double, C As Double

H2 = H * H
H3 = H2 * H

A = 3# * H3 * INV_K12118721

B = 2# * H3 * INV_K1211872 _
+ 2# * H2 * INV_K121187

C = H3 * INV_K121184 _
+ H2 * INV_K12118 _
+ H * INV_K1211

co.a3 = Cy * A
co.a2 = Cy * B
co.a1 = Cy * C

co.D = H3 * INV_K12118721

co.E = H3 * INV_K1211872 _
+ H2 * INV_K121187

co.F = C

co.G = H3 * INV_K12106 _
+ H2 * INV_K1210 _
+ H * INV_K12 _
+ 1#

co.K = 1# + KHOCl / H

End Sub

Private Sub EvalFast(ByVal x As Double, ByRef co As TCoefs, _
ByRef f As Double, ByRef df As Double)

Dim Num As Double, Den As Double
Dim dNum As Double, dDen As Double
Dim x2 As Double

x2 = x * x

Num = co.a3 * x2 * x + co.a2 * x2 + co.a1 * x
Den = co.D * x2 * x + co.E * x2 + co.F * x + co.G

dNum = 3# * co.a3 * x2 + 2# * co.a2 * x + co.a1
dDen = 3# * co.D * x2 + 2# * co.E * x + co.F

f = Num / Den + co.K * x
df = (dNum * Den - Num * dDen) / (Den * Den) + co.K

End Sub

Private Function Equation15Fast(ByVal x As Double, ByRef co As TCoefs) As Double
Dim f As Double, df As Double
EvalFast x, co, f, df
Equation15Fast = f
End Function

Private Function SolveHOCl( _
ByVal H As Double, _
ByVal Cy As Double, _
ByVal TotCl As Double) As Double

Const MAXITER As Integer = 60
Const EPSX As Double = 1E-13
Const EPSF As Double = 1E-13

Dim co As TCoefs
Dim a As Double, b As Double, x As Double
Dim fa As Double, fb As Double, fx As Double, dfx As Double
Dim i As Integer
Dim stp As Double
Dim xNext As Double

If TotCl <= 0# Then
SolveHOCl = 0#
Exit Function
End If

BuildCoefs H, Cy, co

a = 0#
b = TotCl

fa = Equation15Fast(a, co) - TotCl
fb = Equation15Fast(b, co) - TotCl

If Abs(fa) < EPSF Then
SolveHOCl = a
Exit Function
End If

If Abs(fb) < EPSF Then
SolveHOCl = b
Exit Function
End If

If fa * fb > 0# Then
SolveHOCl = -1#
Exit Function
End If

x = TotCl / (1# + KHOCl / H)
If x <= a Or x >= b Then x = 0.5 * (a + b)

For i = 1 To MAXITER

EvalFast x, co, fx, dfx
fx = fx - TotCl

If Abs(fx) < EPSF Then Exit For

If fa * fx < 0# Then
b = x
fb = fx
Else
a = x
fa = fx
End If

If dfx <> 0# Then
stp = fx / dfx
Else
stp = (b - a)
End If

xNext = x - stp

If xNext <= a Or xNext >= b Then
xNext = 0.5 * (a + b)
End If

If Abs(xNext - x) < EPSX * (1# + Abs(x)) Then
x = xNext
Exit For
End If

x = xNext

Next i

If x < 0# Then x = 0#
If x > TotCl Then x = TotCl

SolveHOCl = x

End Function

Public Function TotClCalc( _
ByVal pH As Double, _
ByVal TOTCy As Double, _
ByVal HOCl As Double) As Double

Dim H As Double
Dim Cy As Double
Dim x As Double
Dim co As TCoefs
Dim f As Double

H = 10 ^ (-pH)

Cy = CyToMol(TOTCy)
x = Cl2ToMol(HOCl) ' HOCl donné, converti en mol/L

BuildCoefs H, Cy, co

f = Equation15Fast(x, co)

TotClCalc = MolToCl2(f) ' reconversion en mg/L (ou unité "Cl2"

End Function

Sub Test()
MsgBox HOClCalc(7.2, 50, 3)
End Sub

Sub TestInverse()
Dim totCl As Double
Dim hocl As Double

' on calcule HOCl à partir de TotCl = 3, puis on retrouve TotCl à partir de ce HOCl
hocl = HOClCalc(7.2, 50, 3)
totCl = TotClCalc(7.2, 50, hocl)

MsgBox "HOCl = " & hocl & Chr(10) & "TotCl retrouvé = " & totCl
End Sub
0
Messages : Env. 1000
Dept : Bouches Du Rhone
Ancienneté : + de 6 ans

Picto forum Autres discussions sur ce sujet :

« 1ere mise en hivernage !!! »
Discussion lancée par Sevou95 - 31 réponses
« Bulle d'air filtre a sable »
Discussion lancée par CharledOnAir - 15 réponses
« Quelle puissance pour le moteur de la pompe? »
Discussion lancée par axurit66 - 7 réponses
« Schéma électrique coffret »
Discussion lancée par jeanoly - 2 réponses
« Electrolyseur O'Clair Code A1 »
Discussion lancée par BGhc - 8 réponses
« Chauffage au bois des piscine »
Discussion lancée par ocazeaux - 11 réponses
« Carte 2410124LF maytronics dolphin »
Discussion lancée par Jean-PI - 21 réponses

Picto forumC'est intéressant aussi !

Devis traitement de l'eauArtisan
Devis traitement de l'eau
Demandez des devis aux professionnels de votre région, en 3mn, gratuitement et sans engagement.
Le traitement de l'eau
Le traitement de l'eau
Les guides vous aident à y voir plus clair sur la piscine.
Forum Forum
Forum "filtration et chauffage"
Dans le forum, posez vos questions, consultez celles des autres, entraidez-vous.
Quel chauffage choisir pour votre piscine ?
Quel chauffage choisir pour votre piscine ?
Les guides vous aident à y voir plus clair sur la piscine.
5
personnes
surveillent ce sujet
  Suivre ce sujet
Ce sujet vous a-t-il aidé ?
0
0
Voir