Add new comment

Equations and algorithm for Reverse Osmosis membranes comparison

By Daniel
Sun, 10/16/2016 - Updated 1 year ago
Posted in:
0 comments

Comparison method for Reverse Osmosis membrane datasheets or pilot plants.

Reverse Osmosis and Nanofiltration membrane datasheets specifications are good for evaluating the quality of the delivered products but almost useless to compare products performance. The main reason for that is that every membrane was tested under different conditions (pressure, salinity, solution composition, recovery, pH and temperature).

Water mass transport coefficient (A-Value) and Salt mass transport coefficient (B-value)

RO and NF membranes can be defined by two parameters known in the industry as A and B-values.

 

  • A-Value represents the water permeability or the resulting flux from a specific driving pressure. high A-Value represent a lower operating pressure for the membrane. A-Values are measured in units of flux per unit pressure, for example, GFD/psi or LMH/bar, in the International System: m²/(m².s.Pa).
     
  • B-Value is the salt diffusion rate through the membrane. Every salt has it's own B-value according to it's chemical and physical properties as well as membrane charges and composition. A high B-Value represent a low salt rejection for the membrane. B-Values are measured in flux units: GFD or LMH, in the International System: m³/(m².s).

 

Comparing membranes

To be able to compare different membranes we use the results form the test conditions (as stated in the datasheets) to determinate the A and B-values of that element and compare them. Those values are specific for the salt used (NaCl, MgSO4, etc...) and not necessarily correlate with other compounds rejection like Silica or Boron but that's the only way to compare datasheets properly.

 

The algorithm

The algorithm below uses the equations provided by the membrane manufactures, it was calibrated for single element comparisons, for multiple elements or systems please check Equations and algorithm for Reverse Osmosis systems normalization.


The precision of the results get worst when leaving from the typical test conditions like recoveries up to 15% or salt concentrations up to 32000mg/L.


This algorithm was implemented in Plutocalc Water so if you just need to compare datasheets you can try this software that works on any computer and also in mobile phones.

 

Source code and equations

This source code was written in JavaScript but it can easily be ported to Java, C or any other language. If you need to see it in action please check the Plutocalc Water application.

  1. /* =============================================================
  2. / * RO membrane comparison function for JavaScript
  3. * Developed by Daniel Brooke Peig ([email protected])
  4. *
  5. * Version 1.1
  6. *
  7. * http://www.danbp.org
  8. *
  9. * Copyright (C) 2016 Daniel Brooke Peig
  10. *
  11. /* =============================================================*/
  12. function ro_comparison(user_inputs){
  13.  
  14. //Declare variables
  15.  
  16. //Inputs - Declare and import
  17. //Convert for different user input units in this section
  18. var SolName = user_inputs.SolName; //Solution name (string). See SProp below for allowed names.
  19. var Cf = user_inputs.Cf; //Feed Concentration (mg/L)
  20. var Tf = user_inputs.Tf; //Temperature (C)
  21. var Pf = user_inputs.Pf; //Feed Pressure (bar)
  22. var Rec = user_inputs.Rec; //Recovery (%)
  23. var Qp_m3day = user_inputs.Qp; //Product Flow (m³/day)
  24. var Rej = user_inputs.Rej;//Salt Rejection (%)
  25. var Area = user_inputs.Area; //Membrane Area (m²)
  26.  
  27. //Calculation variables
  28. var Qp; //Product flow (m³/s)
  29. var Qr; //Reject flow (m³/s)
  30. var Qf; //Feed flow (m³/s)
  31. var Qfc; //Feed/concentrate average flow (m³/s)
  32. var TCF; //Temperature correction factor
  33. var Beta; //Polarization factor
  34. var CFR; //Average Feed/Concentrate Concentration Factor
  35. var Cp; //Permeate concentration (mg/L)
  36. var SMW; //Solute Molecular Weight (g/mol)
  37. var VHk; //Vant Hoff Coefficient
  38. var Ok; //Osmotic Coefficient
  39. var CMf; //Salt Molality in the Feed (mol/kg)
  40. var Rk = 0.08314462; //Universal Gas Constant (L.bar.(1/K).(1/mol))
  41. var Of; //Feed Osmotic Pressure (bar)
  42. var Op; //Permeate Osmotic Pressure (bar)
  43. var Ofc; //Average Feed/Concentrate Osmotic Pressure (bar)
  44. var Pd; //Pressure Drop (bar)
  45. var NDP; //Net Driving Pressure (bar)
  46. var A_SI; //Water mass transport coefficient at 25°C (m/(s.bar))
  47. var B_SI; //Salt mass transport coefficient at 25°C (m/s)
  48. var A_lmhbar; //Water mass transport coefficient at 25°C (LMH/bar)
  49. var B_lmh; //Salt mass transport coefficient at 25°C (LMH)
  50. var SProp; //Solution properties table
  51.  
  52. //System variables
  53. var ErrorLog;
  54. var user_outputs;
  55. var incomplete_inputs = false;
  56.  
  57. //Data tables
  58. //Solute name, Molecular Weight, Van't Hoff and Osmotic Coefficient
  59. SProp = [
  60. ["NaCl",58.4428,2,0.93],
  61. ["CaCl2",110.984,3,0.86],
  62. ["Glucose",180.1559,1,1.01],
  63. ["HCl",36.46094,2,0.95],
  64. ["KCl",74.5513,2,0.92],
  65. ["MgCl2",95.211,3,0.89],
  66. ["MgSO4",120.3676,2,0.58],
  67. ["Na2SO4",142.04,3,0.74],
  68. ["NaHCO3",84.007,2,0.96],
  69. ["NH4Cl",53.491,2,0.92],
  70. ["Sucrose",342.2965,1,1.02]
  71. ]
  72.  
  73. ErrorLog="";
  74.  
  75. //Check for invalid inputs (negative or zero)
  76. if(
  77. Cf<=0||
  78. Tf<=0||
  79. Pf<=0||
  80. Rec<=0||
  81. Qp_m3day<=0||
  82. Rej<=0||
  83. Area<=0
  84. ) incomplete_inputs = true;
  85.  
  86. //Calculations
  87.  
  88. if(Cf>100000) ErrorLog += "Concentration is higher than 10%, too much for the current osmotic pressure model.<BR>";
  89. if(Rec>20) ErrorLog += "Invalid recovery for a single element, max 20%.<BR>";
  90. if(Rej>100) ErrorLog += "Invalid rejection, max 100%.<BR>";
  91. if(Tf>80) ErrorLog += "Invalid temperature, max 80C.<BR>";
  92. if(Area>283) ErrorLog += "Area is too high for a single spiral element test.<BR>";
  93.  
  94. Qp = Qp_m3day/24/3600; //Unit conversion
  95. Qf = Qp/(Rec/100); //Feed flow
  96. Qr = Qf-Qp; //Concentrate flow
  97. Qfc = (Qr+Qf)/2; //Average feed/concentrate flow
  98. if(Tf>25) TCF = Math.exp(2640*(1/298-1/(273+Tf))); //Temperature correction factor from FILMTEC Manual
  99. if(Tf<=25) TCF = Math.exp(3020*(1/298-1/(273+Tf))); //Temperature correction factor from FILMTEC Manual
  100. Beta = Math.exp(0.7*Rec/100); //DOW FILMTEC Equation, valid only for very low recovery rates
  101. CFR = 0.5*(1+((1-Rec/100*(1-Rej/100))/(1-Rec/100))); //DOW FILMTEC Equation
  102. Cp = Cf*(1-Rej/100); //Permeate concentration (mg/L)
  103. for(var i=0;i<SProp.length;i++)
  104. if(SProp[i][0] == SolName) {
  105. SMW = SProp[i][1]; //Solution Molecular Weight (from table)
  106. VHk = SProp[i][2]; //Van't Hoff coefficient (from table)
  107. Ok = SProp[i][3]; //Osmotic Coefficient (from table)
  108. }
  109. CMf = (Cf/1000)/SMW; //Molality in the feed
  110. Of = VHk*Ok*CMf*Rk*(273+Tf); //Harmon Northrop Morse Equation for the Osmotic Pressure in the feed
  111. Op = Of*(1-Rej/100); //Osmotic Pressure in the permeate
  112. Ofc = Beta*CFR*Of; //Average feed/concentrate Osmotic Pressure
  113. Pd = 0.01*Math.pow(Qfc*15852,1.65)/14.5038; //DOW FILMTEC Equation with adjusted coefficient 1.65/14
  114. NDP = Pf-Pd/2-Ofc+Op; //Net Driving Pressure
  115. A_SI = Qp/(Area*TCF*NDP); //International system: m³/(m².s.bar)
  116. B_SI = Cp/(Cf*Beta*CFR*TCF*Area/Qp); //International system: m³/(m².s)
  117. A_lmhbar = A_SI*1000*3600; //Unit conversion: L/(m².h.bar) or LMH/bar
  118. B_lmh = B_SI*1000*3600; //Unit conversion: L/(m².h) or LMH
  119.  
  120. //Output the results
  121. //Convert for different user output units in this section
  122. if(ErrorLog.length == 0 && incomplete_inputs == false)
  123. user_outputs = {
  124. ErrorLog: ErrorLog, //Error messages
  125. A: A_lmhbar, //Water mass transport coefficient at 25°C (LMH/bar)
  126. B: B_lmh, //Salt mass transport coefficient at 25°C (LMH)
  127. NDP: NDP, //Net Driving Pressure (bar)
  128. Pd: Pd, //Differential pressure (bar)
  129. Ofc: Ofc //Average feed/concentrate osmotic pressure (bar)
  130. };
  131. else
  132. user_outputs = {
  133. ErrorLog: ErrorLog,
  134. A: 0,
  135. B: 0,
  136. NDP: 0,
  137. Pd: 0,
  138. Ofc: 0
  139. };
  140.  
  141.  
  142. return user_outputs;
  143.  
  144. } //End of the procedure
  145.  
  146. /****************************************************************************************************************************/
  147. //Usage example - results should display in the browser console
  148. var user_inputs =
  149. {
  150. SolName: "NaCl",
  151. Cf: 32000,
  152. Tf: 25,
  153. Pf: 58.95,
  154. Rec: 15,
  155. Qp: 28.39,
  156. Rej: 99.8,
  157. Area: 37.2
  158. };
  159.  
  160. console.log(ro_comparison(user_inputs));

Tags

The content of this field is kept private and will not be shown publicly.
CAPTCHA
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.