cek / src /pycek_public /surface_adsorption.py
praiteri's picture
tweaks and fixed student ID
79484be
import pycek_public as cek
import numpy as np
class surface_adsorption(cek.cek_labs):
def setup_lab(self):
"""
Define base information for the lab.
They can be overwrite by the user using the kwargs in the constructor or
by calling the set_parameters method.
"""
self.add_metadata(
laboratory = 'Surface Adsorption Lab',
columns = ["Dye added (mg)", "Dye in solution (mol/L)"]
)
self.volume = 1 # L
self.minDye = 500 # mg
self.maxDye = 10000 # mg
self.sample_parameters = {
"dH" : -19.51e3, # J/mol
"dS" : -10, # J/mol/K
"Q" : 0.0001, # monolayer coverage (mol/m^2)
"molarMass": 584.910641, # g/mol
}
self.number_of_values = 100
self.noise_level = 0.5e-5
self.precision = 10
def create_data(self):
"""
Generate the data
"""
self.set_parameters(
sample = self.sample,
number_of_values = self.number_of_values,
)
self.add_metadata(**{
"Temperature (C)" : self.temperature - 273.15,
"Volume (L)" : self.volume,
"Molar mass (g/mol)" : self.sample_parameters["molarMass"],
"MinDye (mg)" : self.minDye,
"MaxDye (mg)" : self.maxDye,
'Number of values' : self.number_of_values,
})
# Langmuir isotherm equilibrium constant
# Convert to kJ/mol
lnK = (-self.sample_parameters["dH"] / (self.temperature) + self.sample_parameters["dS"]) / self.R
K = np.exp(lnK) # in L/mol
conversion_factor = 1000 * self.sample_parameters["molarMass"] * self.volume
conc_range = np.array([self.minDye, self.maxDye]) / conversion_factor
self.data = self.generate_data_from_function(
lambda x,K,Q: ((x*K - K*Q - 1) + np.sqrt((x*K - K*Q - 1)**2 + 4*x*K) ) / (2*K) ,
{"K":K , "Q":self.sample_parameters["Q"]},
self.number_of_values,
xrange = conc_range,
xspacing = 'linear',
noise_level = self.noise_level,
positive = True,
)
self.data[:,0] *= conversion_factor
return self.data