diff --git a/brew/water_constants.m b/brew/water_constants.m index 756e2ac..2c69bac 100644 --- a/brew/water_constants.m +++ b/brew/water_constants.m @@ -1,14 +1,16 @@ -i_H = 1; -i_C = 2; -i_O = 3; -i_Na = 4; -i_Cl = 5; -i_Ca = 6; -i_Mg = 7; -i_S = 8; -i_P = 9; -N_mol = 9; +EL_H = 1; +EL_C = 2; +EL_O = 3; +EL_Na = 4; +EL_Cl = 5; +EL_Ca = 6; +EL_Mg = 7; +EL_S = 8; +EL_P = 9; +EL_SO4 = 10; +EL_COUNT = 10; +# Elements M_H = 1.00794; % g/mol M_C = 12.0107; % g/mol M_O = 15.9994; % g/mol @@ -19,33 +21,20 @@ M_Mg = 24.305; % g/mol M_S = 32.06; % g/mol M_P = 30.9738; % g/mol -mol_masses = zeros(1, N_mol); -mol_masses(i_H) = M_H; -mol_masses(i_C) = M_C; -mol_masses(i_O) = M_O; -mol_masses(i_Na) = M_Na; -mol_masses(i_Cl) = M_Cl; -mol_masses(i_Ca) = M_Ca; -mol_masses(i_Mg) = M_Mg; -mol_masses(i_S) = M_S; -mol_masses(i_P) = M_P; +# Ions +M_SO4 = M_S+4*M_O; % g/mol -# Create single elements [g/mol] -M_EL_Ca = create_mol([i_Ca], [1], mol_masses); -M_EL_Mg = create_mol([i_Mg], [1], mol_masses); -M_EL_Na = create_mol([i_Na], [1], mol_masses); -M_EL_Cl = create_mol([i_Cl], [1], mol_masses); -M_EL_S = create_mol([i_S], [1], mol_masses); - -# Create common used compounds [g/mol] -M_CaSO4 = create_mol([i_Ca i_S i_O], [1 1 4], mol_masses); -M_CaCl2 = create_mol([i_Ca i_Cl], [1 2], mol_masses); -M_NaCl = create_mol([i_Na i_Cl], [1 1], mol_masses); -M_MgSO4 = create_mol([i_Mg i_S i_O], [1 1 4], mol_masses); -M_NaHCO3 = create_mol([i_Na i_H i_C i_O], [1 1 1 3], mol_masses); -M_HCl = create_mol([i_H i_Cl], [1 1], mol_masses); -M_H2SO4 = create_mol([i_H i_S i_O], [2 1 4], mol_masses); -M_H2O = create_mol([i_H i_O], [2 1], mol_masses); +mol_masses = zeros(1, EL_COUNT); +mol_masses(EL_H) = M_H; +mol_masses(EL_C) = M_C; +mol_masses(EL_O) = M_O; +mol_masses(EL_Na) = M_Na; +mol_masses(EL_Cl) = M_Cl; +mol_masses(EL_Ca) = M_Ca; +mol_masses(EL_Mg) = M_Mg; +mol_masses(EL_S) = M_S; +mol_masses(EL_P) = M_P; +mol_masses(EL_SO4) = M_SO4; function mol = create_mol(indices, n, mol_masses) N = length(mol_masses); @@ -53,6 +42,26 @@ function mol = create_mol(indices, n, mol_masses) mol(indices) = n.*mol_masses(indices); endfunction +# Create single elements [g/mol] +M_EL_Ca = create_mol([EL_Ca], [1], mol_masses); +M_EL_Mg = create_mol([EL_Mg], [1], mol_masses); +M_EL_Na = create_mol([EL_Na], [1], mol_masses); +M_EL_Cl = create_mol([EL_Cl], [1], mol_masses); +M_EL_S = create_mol([EL_S], [1], mol_masses); + +# Create single ions [g/mol] +M_EL_SO4 = create_mol([EL_SO4], [1], mol_masses); + +# Create common used compounds [g/mol] +M_CaSO4 = create_mol([EL_Ca EL_SO4], [1 1], mol_masses); +M_CaCl2 = create_mol([EL_Ca EL_Cl], [1 2], mol_masses); +M_NaCl = create_mol([EL_Na EL_Cl], [1 1], mol_masses); +M_MgSO4 = create_mol([EL_Mg EL_SO4], [1 1], mol_masses); +M_NaHCO3 = create_mol([EL_Na EL_H EL_C EL_O], [1 1 1 3], mol_masses); +M_HCl = create_mol([EL_H EL_Cl], [1 1], mol_masses); +M_H2SO4 = create_mol([EL_H EL_SO4], [2 1], mol_masses); +M_H2O = create_mol([EL_H EL_O], [2 1], mol_masses); + function mol = create_vec(indices, quantity, N) mol = zeros(1, N); mol(indices) = quantity; diff --git a/brew/water_optimizer.m b/brew/water_optimizer.m index e1cc22f..34db898 100644 --- a/brew/water_optimizer.m +++ b/brew/water_optimizer.m @@ -31,52 +31,56 @@ water_constants() k_Ca_0_mg = 94.0; % mg/l k_Mg_0_mg = 18.1; % mg/l k_Na_0_mg = 3.6; % mg/l -k_S_0_mg = 44.1; % mg/l k_Cl_0_mg = 4.6; % mg/l +k_SO4_0_mg = 44.1; % mg/l k_HCO3_0_mmol = 5.5; % mmol/l # Profile from tap water (Debug) k_Ca_0_mg = 100; % mg/l k_Mg_0_mg = 20; % mg/l k_Na_0_mg = 5; % mg/l -k_S_0_mg = 50; % mg/l k_Cl_0_mg = 5; % mg/l +k_SO4_0_mg = 50; % mg/l # Target Profile k_Ca_1_mg = 50; % mg/l -k_Mg_1_mg = 20; % mg/l +k_Mg_1_mg = 2; % mg/l k_Na_1_mg = 40; % mg/l k_Cl_1_mg = 100; % mg/l -k_S_1_mg = 50; % mg/l +k_SO4_1_mg = 50; % mg/l # Tap water: Calc Stoffmenge/l [mmol/l] n_Ca_0 = k_Ca_0_mg/sum(M_EL_Ca); n_Mg_0 = k_Mg_0_mg/sum(M_EL_Mg); n_Na_0 = k_Na_0_mg/sum(M_EL_Na); n_Cl_0 = k_Cl_0_mg/sum(M_EL_Cl); -n_S_0 = k_S_0_mg/sum(M_EL_S); +n_SO4_0 = k_SO4_0_mg/sum(M_EL_SO4); # Target: Calc Stoffmenge/l [mmol/l] n_Ca_1 = k_Ca_1_mg/sum(M_EL_Ca); n_Mg_1 = k_Mg_1_mg/sum(M_EL_Mg); n_Na_1 = k_Na_1_mg/sum(M_EL_Na); n_Cl_1 = k_Cl_1_mg/sum(M_EL_Cl); -n_S_1 = k_S_1_mg/sum(M_EL_S); +n_SO4_1 = k_SO4_1_mg/sum(M_EL_SO4); # Initial profile -m_A0 = k_ve*create_mol([i_Ca i_Mg i_Na i_Cl i_S], [n_Ca_0 n_Mg_0 n_Na_0 n_Cl_0 n_S_0], mol_masses) +m_A0 = k_ve*create_mol([EL_Ca EL_Mg EL_Na EL_Cl EL_SO4], [n_Ca_0 n_Mg_0 n_Na_0 n_Cl_0 n_SO4_0], mol_masses); # Target profile -m_T = create_mol([i_Ca i_Mg i_Na i_Cl i_S], [n_Ca_1 n_Mg_1 n_Na_1 n_Cl_1 n_S_1], mol_masses) +m_T = create_mol([EL_Ca EL_Mg EL_Na EL_Cl EL_SO4], [n_Ca_1 n_Mg_1 n_Na_1 n_Cl_1 n_SO4_1], mol_masses); if TEST_SUITE == 1, # Create molar masses of allowed substances, easy -Mp = [M_EL_Ca; M_EL_Mg; M_EL_Na; M_EL_Cl; M_EL_S]; +Mp = [M_EL_Ca; M_EL_Mg; M_EL_Na; M_EL_Cl; M_EL_SO4]; end if TEST_SUITE == 2, # Create molar masses of allowed substances, difficult -Mp = [M_CaSO4+2*M_H2O; M_CaCl2+2*M_H2O; M_MgSO4+7*M_H2O; M_NaCl; M_HCl] +Mp = [M_CaSO4+2*M_H2O; M_CaCl2+2*M_H2O; M_MgSO4+7*M_H2O; M_NaCl; M_HCl]; +Mp = [M_CaCl2+2*M_H2O; M_MgSO4+7*M_H2O; M_NaCl; M_HCl]; +Mp = [M_CaCl2+2*M_H2O; M_MgSO4+7*M_H2O; M_NaCl]; +Mp = [M_CaSO4+2*M_H2O; M_CaCl2+2*M_H2O; M_NaCl]; +#Mp = [M_MgSO4+7*M_H2O; M_CaCl2+2*M_H2O; M_NaCl]; end # Init vecfit vars @@ -85,7 +89,7 @@ end na = zeros(N_subst, 1); # ignore oxygen -mask = create_mol([i_Ca i_Mg i_S i_Cl i_Na], [1 1 1 1 1], mol_masses) > 0; +mask = m_T > 0; _dn = []; CONV_COUNTER_RELOAD = 20; @@ -108,10 +112,11 @@ while true, end plot(1:length(_dn), _dn); grid(); title("Distance"); xlabel("Iteration"); ylabel("Dn") -m_A1 Dn1 m_elem=sum(Mp.*na) m_subst_add_g_per_hl = na.*sum(Mp,2)/1000*100 +m_T +m_A1 endfunction