{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "f95fb095",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"All good\n"
]
}
],
"source": [
"import platform\n",
"from pathlib import Path\n",
"from cadet import Cadet\n",
"\n",
"# put in the path to the bin folder\n",
"#cadet_bin_path = Path('D:/Program Files (x86)/cadet/bin')\n",
"cadet_bin_path = Path('C:/Users/Nils-Arbeit/cadet/bin')\n",
"\n",
"if platform.system() == 'Windows':\n",
" #cadet_path = cadet_bin_path / \"D:/Program Files (x86)/Freundlich_isotherm/Pre_build_binaries/bin/cadet-cli.exe\" #\"D:/Program Files (x86)/Freundlich_isotherm/Pre_build_binaries/bin/cadet-cli.exe\", \"D:/Program Files (x86)/cadet/bin/cadet-cli.exe\"\n",
" cadet_path = cadet_bin_path / \"D:/Studium/MA Runde 2/02a Simulationen/02 Freundlich Basismodel/MyCadetProjects/Pre_build_binaries/bin/cadet-cli.exe\" #\"D:/Program Files (x86)/Freundlich_isotherm/Pre_build_binaries/bin/cadet-cli.exe\", \"D:/Program Files (x86)/cadet/bin/cadet-cli.exe\"\n",
" lwe_path = cadet_bin_path / \"D:/Studium/MA Runde 2/02a Simulationen/02 Freundlich Basismodel/MyCadetProjects/Pre_build_binaries/bin/createLWE.exe\" #\"D:/Program Files (x86)/Freundlich_isotherm/Pre_build_binaries/bin/createLWE.exe\"\n",
" \n",
"else:\n",
" cadet_path = cadet_bin_path / \"cadet-cli\"\n",
" lwe_path = cadet_bin_path / \"createLWE\"\n",
"\n",
"if cadet_path.exists() and lwe_path.exists():\n",
" Cadet.cadet_path = cadet_path.as_posix()\n",
" print(\"All good\")\n",
"elif cadet_path.exists() and not lwe_path.exists():\n",
" print(\"CADET was found but createLWE.exe was not found. Please make sure that none of the files have been moved.\")\n",
"else:\n",
" print(\"CADET could not be found. Please check the bin path\")"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "c749511f",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import os\n",
"from IPython.display import display, HTML, clear_output\n",
"display(HTML(\"\"))\n",
"\n",
"from IPython.display import Image\n",
"\n",
"from pathlib import Path \n",
"# python numeric library\n",
"import numpy as np\n",
"\n",
"# scientific library for python\n",
"import scipy\n",
"\n",
"# pandas is python library for data analysis\n",
"import pandas as pd\n",
"\n",
"# addict is a library that makes it easier to create nested dictionaries\n",
"from addict import Dict\n",
"\n",
"# json is a standard text based format and it used in CADETMatch for the configuration file\n",
"import json\n",
"\n",
"# python plotting library\n",
"import matplotlib.pyplot as plt\n",
"%config InlineBackend.figure_format='svg'\n",
"%matplotlib inline\n",
"\n",
"# jupyter widget support\n",
"from ipywidgets import interact, interactive\n",
"import ipywidgets as widgets\n",
"\n",
"# Temporary files for simulation objects\n",
"import tempfile\n",
"tempfile.tempdir = os.path.join(Path.home())\n",
"\n",
"import subprocess"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "be50977a",
"metadata": {},
"outputs": [],
"source": [
"def get_cadet_template(n_units=3, split_components_data=False):\n",
" cadet_template = Cadet()\n",
" \n",
" cadet_template.root.input.model.nunits = n_units\n",
" \n",
" # Store solution\n",
" cadet_template.root.input['return'].split_components_data = False\n",
" cadet_template.root.input['return'].split_ports_data = 0\n",
" cadet_template.root.input['return'].write_solution_last = True\n",
" cadet_template.root.input['return'].unit_000.write_solution_inlet = 1 #1\n",
" cadet_template.root.input['return'].unit_000.write_solution_outlet = 1\n",
" cadet_template.root.input['return'].unit_000.write_solution_bulk = 1 #1\n",
" cadet_template.root.input['return'].unit_000.write_solution_particle = 1 #1\n",
" cadet_template.root.input['return'].unit_000.write_solution_solid = 1\n",
" cadet_template.root.input['return'].unit_000.write_solution_flux = 1 #1\n",
" cadet_template.root.input['return'].unit_000.write_solution_volume = 1\n",
" cadet_template.root.input['return'].unit_000.write_coordinates = 1\n",
" cadet_template.root.input['return'].unit_000.write_sens_outlet = 1\n",
" \n",
" for unit in range(n_units):\n",
" cadet_template.root.input['return']['unit_{0:03d}'.format(unit)] = cadet_template.root.input['return'].unit_000\n",
" \n",
" # Tolerances for the time integrator\n",
" cadet_template.root.input.solver.time_integrator.abstol = 1e-6\n",
" cadet_template.root.input.solver.time_integrator.algtol = 1e-10\n",
" cadet_template.root.input.solver.time_integrator.reltol = 1e-6\n",
" cadet_template.root.input.solver.time_integrator.init_step_size = 1e-6\n",
" cadet_template.root.input.solver.time_integrator.max_steps = 1000000\n",
" \n",
" # Solver settings\n",
" cadet_template.root.input.model.solver.gs_type = 1\n",
" cadet_template.root.input.model.solver.max_krylov = 0\n",
" cadet_template.root.input.model.solver.max_restarts = 10\n",
" cadet_template.root.input.model.solver.schur_safety = 1e-8\n",
"\n",
" # Run the simulation on single thread\n",
" cadet_template.root.input.solver.nthreads = -1\n",
" \n",
" return cadet_template \n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "45624dc1",
"metadata": {},
"outputs": [],
"source": [
"def set_discretization(model, n_bound=None, n_col=100):\n",
" columns = {'GENERAL_RATE_MODEL', 'LUMPED_RATE_MODEL_WITH_PORES', 'LUMPED_RATE_MODEL_WITHOUT_PORES'}\n",
" \n",
" \n",
" for unit_name, unit in model.root.input.model.items():\n",
" if 'unit_' in unit_name and unit.unit_type in columns:\n",
" unit.discretization.ncol = n_col\n",
" unit.discretization.npar = 1 # vorher 5\n",
" \n",
" if n_bound is None:\n",
" n_bound = unit.ncomp*[0]\n",
" unit.discretization.nbound = n_bound\n",
" \n",
" unit.discretization.par_disc_type = 'EQUIDISTANT_PAR'\n",
" unit.discretization.use_analytic_jacobian = 1\n",
" unit.discretization.reconstruction = 'WENO'\n",
" unit.discretization.gs_type = 1\n",
" unit.discretization.max_krylov = 0\n",
" unit.discretization.max_restarts = 10\n",
" unit.discretization.schur_safety = 1.0e-8\n",
"\n",
" unit.discretization.weno.boundary_model = 0\n",
" unit.discretization.weno.weno_eps = 1e-10\n",
" unit.discretization.weno.weno_order = 3"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "18997c01",
"metadata": {},
"outputs": [],
"source": [
"def save_to_csv(time, c, file_name):\n",
" combined_data = np.column_stack(time, c)\n",
" \n",
" np.save_to_csv(file_name, combined_data, delimiter=',')"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "36a860d5",
"metadata": {},
"outputs": [],
"source": [
"def run_simulation(cadet, file_name=None):\n",
" f = next(tempfile._get_candidate_names())\n",
" file = os.path.join(tempfile.tempdir, f + '.h5')\n",
" \n",
" cadet.filename = file\n",
"\n",
" # save the simulation\n",
" cadet.save()\n",
"\n",
" # run the simulation\n",
" data = cadet.run()\n",
"\n",
" if data.returncode == 0:\n",
" print(\"Simulation completed successfully\")\n",
" cadet.load() \n",
" else:\n",
" print(data)\n",
" raise Exception(\"Simulation failed\")\n",
"\n",
" if file_name is not None:\n",
" cadet.filename = file_name\n",
"\n",
" # save the simulation\n",
" cadet.save()\n",
" else:\n",
" os.remove(file)\n",
" \n",
" return cadet"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "88fe9a4d",
"metadata": {},
"outputs": [],
"source": [
"def create_column_bB_GRM_AFR(t_in_seconds,n_col, n_bound,n_partype, c_feed, adsorption_parameters, resolution, sizeclasses, porosityclasses ,vol_frac, porediffusion=1,k_film=[2.970e-6] ,\n",
" k_RL=[8.374e-4], volume_flow_rate = 4.71e-5 ):\n",
" \n",
" t_in_minutes = t_in_seconds / 60\n",
" t_in_hours = t_in_minutes / 60\n",
" \n",
" n_comp = len(c_feed) \n",
" \n",
"\n",
" model = get_cadet_template(n_units=3)\n",
" \n",
" \n",
" ######################################### INLET ###########################################################\n",
" model.root.input.model.unit_000.unit_type = 'INLET'\n",
" model.root.input.model.unit_000.ncomp = n_comp \n",
" model.root.input.model.unit_000.inlet_type = 'PIECEWISE_CUBIC_POLY'\n",
" \n",
" model.root.input.model.unit_000.sec_000.const_coeff = c_feed # mol/m^3\n",
"\n",
" #################################### Column ################################################################\n",
" model.root.input.model.unit_001.unit_type = 'GENERAL_RATE_MODEL' \n",
" model.root.input.model.unit_001.ncomp = n_comp \n",
" model.root.input.model.unit_001.col_length = 2.1 # m Pit: 2.1\n",
" model.root.input.model.unit_001.col_porosity = 0.45 # Pit: 0.45 \n",
" model.root.input.model.unit_001.cross_section_area = 0.046 # m^2 Pit: 0.046\n",
" model.root.input.model.unit_001.velocity = 2.28e-3 # m/s Pit: 2.28e-3 #3.25e-3\n",
" model.root.input.model.unit_001.col_dispersion = n_comp*[0] # m^2/s Aumeier:\n",
" model.root.input.model.unit_001.init_c = n_comp * [0] # mol/m^3 \n",
" model.root.input.model.unit_001.init_q = n_comp *[0] \n",
" \n",
" \n",
" ##################################Particles###################################################################\n",
" \n",
" model.root.input.model.unit_001.film_diffusion = k_film # m/s\n",
" model.root.input.model.unit_001.film_diffusion_multiplex = 0 \n",
" model.root.input.model.unit_001.par_diffusion = [porediffusion,] # m^2 / s (mobile phase) Vereinfachung da homogene Partikelprosität angenommen 0.555*2.181e-10\n",
" model.root.input.model.unit_001.par_diffusion_multiplex = 0\n",
" model.root.input.model.unit_001.par_surfdiffusion = [0,] # m^2 / s (solid phase)\n",
" model.root.input.model.unit_001.par_surfdiffusion_multiplex = 0\n",
" model.root.input.model.unit_001.par_porosity = porosityclasses # Pitt: 0.49\n",
" model.root.input.model.unit_001.par_radius = sizeclasses # [5.5e-4,4.5e-4,3.5e-4,2.5e-4,1.5e-4] # m beachte RADIUS!!!!! Pitt d=1.1mm --> 0,55mm\n",
" model.root.input.model.unit_001.par_type_volfrac = vol_frac \n",
"\n",
" \n",
" ##########################Reaction#########################################################\n",
" \n",
" model.root.input.model.unit_001.reaction_model_particles = 'MASS_ACTION_LAW'\n",
" model.root.input.model.unit_001.reaction_particle.MAL_KFWD_liquid = k_RL\n",
" #model.root.input.model.unit_001.reaction_particle.MAL_KFWD_solid = [0]\n",
"\n",
" model.root.input.model.unit_001.reaction_particle.MAL_KBWD_liquid = 0\n",
" #model.root.input.model.unit_001.reaction_particle.MAL_KBWD_solid = [0]\n",
" \n",
" model.root.input.model.unit_001.reaction_particle.MAL_STOICHIOMETRY_liquid = [-1] #[-1, 1] nur wenn zwei Komponenten in c_feed = [6.865, 0] sind, wurde nur einmal verwendet um den DOC Abbau abzubilden\n",
" #model.root.input.model.unit_001.reaction_particle.MAL_STOICHIOMETRY_solid = [-1]\n",
" \n",
" ################################### Adsorption ###############################################################\n",
" model.root.input.model.unit_001.adsorption_model = 'FREUNDLICH_LDF' \n",
" model.root.input.model.unit_001.adsorption = adsorption_parameters \n",
"\n",
" ################################### Discretization #############################################################\n",
" \n",
" set_discretization(model, n_bound)\n",
" \n",
" model.root.input.model.unit_001.discretization.ncol = n_col \n",
" model.root.input.model.unit_001.discretization.nbound = n_bound \n",
" model.root.input.model.unit_001.discretization.npartype = n_partype\n",
" model.root.input.model.unit_001.discretization.par_geom = 'SPHERE' \n",
"\n",
" ########################################### Outlet ######################################################\n",
" model.root.input.model.unit_002.unit_type = 'OUTLET'\n",
" model.root.input.model.unit_002.ncomp = n_comp\n",
"\n",
" \n",
" ###################################### Sections and Switches ############################################\n",
" model.root.input.solver.sections.nsec = 1 \n",
" model.root.input.solver.sections.section_times = [0.0, t_in_seconds] \n",
" model.root.input.solver.sections.section_continuity = [0] \n",
"\n",
" model.root.input.model.connections.nswitches = 1 \n",
" model.root.input.model.connections.switch_000.section = 0 \n",
" model.root.input.model.connections.switch_000.connections = [\n",
" \n",
" 0, 1, -1, -1, volume_flow_rate, \n",
" 1, 2, -1, -1, volume_flow_rate]\n",
" \n",
"\n",
" #unit_from, unit_to, component_from, component_to, volumetric flow rate\n",
" #unit_000, unit_001, all components, all components, Q\n",
" #unit_001, unit_002, all components, all components, Q\n",
" #-1 = all components from origin and destination unit are connected\n",
" \n",
" \n",
" ####################################### Simulator Settings ################################################\n",
" \n",
" \n",
" model.root.input.solver.user_solution_times = np.linspace(0, t_in_seconds, resolution)\n",
" \n",
" return model"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "5479848e",
"metadata": {},
"outputs": [],
"source": [
"#############################################General rate model with pores befor backwash with reaction, with biodegradation ##############################\n",
"# Version for Maike\n",
"def create_column_bB_GRM_AFR_for_Maike(t_in_seconds,n_col, n_bound,n_partype, c_feed, adsorption_parameters, resolution, length=2.1, bedporosity=0.45,porediffusion=0.555*2.181e-10,\n",
" k_film=[2.970e-6] ,k_RL=[8.374e-4], volume_flow_rate = 4.71e-5 ):\n",
" \n",
" t_in_minutes = t_in_seconds / 60\n",
" t_in_hours = t_in_minutes / 60\n",
" \n",
" n_comp = len(c_feed) \n",
" model = get_cadet_template(n_units=3)\n",
" \n",
" \n",
" ######################################### INLET ###########################################################\n",
" model.root.input.model.unit_000.unit_type = 'INLET'\n",
" model.root.input.model.unit_000.ncomp = n_comp \n",
" model.root.input.model.unit_000.inlet_type = 'PIECEWISE_CUBIC_POLY'\n",
" \n",
" model.root.input.model.unit_000.sec_000.const_coeff = c_feed # mol/m^3\n",
"\n",
" #################################### Column ################################################################\n",
" model.root.input.model.unit_001.unit_type = 'GENERAL_RATE_MODEL' \n",
" model.root.input.model.unit_001.ncomp = n_comp \n",
" model.root.input.model.unit_001.col_length = length # m Pit: 2.1\n",
" model.root.input.model.unit_001.col_porosity = 0.45 # Pit: 0.45 \n",
" model.root.input.model.unit_001.cross_section_area = 0.046 # m^2 Pit: 0.046\n",
" model.root.input.model.unit_001.velocity = 2.28e-3 # m/s Pit: 2.28e-3 #3.25e-3\n",
" model.root.input.model.unit_001.col_dispersion = n_comp*[0] # m^2/s Aumeier:\n",
" model.root.input.model.unit_001.init_c = n_comp * [0] # mol/m^3 \n",
" model.root.input.model.unit_001.init_q = n_comp *[0] \n",
" \n",
" \n",
" ##################################Particles###################################################################\n",
" \n",
" model.root.input.model.unit_001.film_diffusion = k_film # m/s\n",
" model.root.input.model.unit_001.film_diffusion_multiplex = 0 \n",
" model.root.input.model.unit_001.par_diffusion = [8.244e-7,] # m^2 / s (mobile phase) Vereinfachung da homogene Partikelprosität angenommen 2.181e-10 oder k_kin\n",
" model.root.input.model.unit_001.par_diffusion_multiplex = 0\n",
" model.root.input.model.unit_001.par_surfdiffusion = [0,] # m^2 / s (solid phase)\n",
" model.root.input.model.unit_001.par_surfdiffusion_multiplex = 0\n",
" model.root.input.model.unit_001.par_porosity = 0.555 # Pitt: 0.49\n",
" model.root.input.model.unit_001.par_radius = 5.5e-4 # [5.5e-4,4.5e-4,3.5e-4,2.5e-4,1.5e-4] # m beachte RADIUS!!!!! Pitt d=1.1mm --> 0,55mm\n",
" #model.root.input.model.unit_001.par_type_volfrac = vol_frac \n",
"\n",
" \n",
" ##########################Reaction#########################################################\n",
" \n",
" model.root.input.model.unit_001.reaction_model_particles = 'MASS_ACTION_LAW'\n",
" model.root.input.model.unit_001.reaction_particle.MAL_KFWD_liquid = k_RL\n",
" #model.root.input.model.unit_001.reaction_particle.MAL_KFWD_solid = [0]\n",
"\n",
" model.root.input.model.unit_001.reaction_particle.MAL_KBWD_liquid = 0\n",
" #model.root.input.model.unit_001.reaction_particle.MAL_KBWD_solid = [0]\n",
" \n",
" model.root.input.model.unit_001.reaction_particle.MAL_STOICHIOMETRY_liquid = [-1] #[-1, 1] nur wenn zwei Komponenten in c_feed = [6.865, 0] sind, wurde nur einmal verwendet um den DOC Abbau abzubilden\n",
" #model.root.input.model.unit_001.reaction_particle.MAL_STOICHIOMETRY_solid = [-1]\n",
" \n",
" ################################### Adsorption ###############################################################\n",
" model.root.input.model.unit_001.adsorption_model = 'FREUNDLICH_LDF' \n",
" model.root.input.model.unit_001.adsorption = adsorption_parameters \n",
"\n",
" ################################### Discretization #############################################################\n",
" \n",
" set_discretization(model, n_bound)\n",
" \n",
" model.root.input.model.unit_001.discretization.ncol = n_col \n",
" model.root.input.model.unit_001.discretization.nbound = n_bound \n",
" model.root.input.model.unit_001.discretization.npartype = n_partype # soll 1 sein\n",
" model.root.input.model.unit_001.discretization.par_geom = 'SPHERE' \n",
"\n",
" ########################################### Outlet ######################################################\n",
" model.root.input.model.unit_002.unit_type = 'OUTLET'\n",
" model.root.input.model.unit_002.ncomp = n_comp\n",
"\n",
" \n",
" ###################################### Sections and Switches ############################################\n",
" model.root.input.solver.sections.nsec = 1 \n",
" model.root.input.solver.sections.section_times = [0.0, t_in_seconds] \n",
" model.root.input.solver.sections.section_continuity = [0] \n",
"\n",
" model.root.input.model.connections.nswitches = 1 \n",
" model.root.input.model.connections.switch_000.section = 0 \n",
" model.root.input.model.connections.switch_000.connections = [\n",
" \n",
" 0, 1, -1, -1, volume_flow_rate, \n",
" 1, 2, -1, -1, volume_flow_rate]\n",
" \n",
"\n",
" #unit_from, unit_to, component_from, component_to, volumetric flow rate\n",
" #unit_000, unit_001, all components, all components, Q\n",
" #unit_001, unit_002, all components, all components, Q\n",
" #-1 = all components from origin and destination unit are connected\n",
" \n",
" \n",
" ####################################### Simulator Settings ################################################\n",
" \n",
" \n",
" model.root.input.solver.user_solution_times = np.linspace(0, t_in_seconds, resolution)\n",
" \n",
" return model"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "1f514335",
"metadata": {},
"outputs": [],
"source": [
"def create_column_GRM_Nette(t_in_seconds,n_col, n_bound,n_partype, c_feed, adsorption_parameters, resolution, sizeclasses, porosityclasses ,vol_frac, porediffusion,k_film ,\n",
" k_RL, volume_flow_rate , length=2.1):\n",
" \n",
" t_in_minutes = t_in_seconds / 60\n",
" t_in_hours = t_in_minutes / 60\n",
" \n",
" n_comp = len(c_feed) \n",
" \n",
"\n",
" model = get_cadet_template(n_units=3)\n",
" \n",
" \n",
" ######################################### INLET ###########################################################\n",
" model.root.input.model.unit_000.unit_type = 'INLET'\n",
" model.root.input.model.unit_000.ncomp = n_comp \n",
" model.root.input.model.unit_000.inlet_type = 'PIECEWISE_CUBIC_POLY'\n",
" \n",
" model.root.input.model.unit_000.sec_000.const_coeff = c_feed # mol/m^3\n",
"\n",
" #################################### Column ################################################################\n",
" model.root.input.model.unit_001.unit_type = 'GENERAL_RATE_MODEL' \n",
" model.root.input.model.unit_001.ncomp = n_comp \n",
" model.root.input.model.unit_001.col_length = length # m G.F.: 2.1 , G.3; G.2: G.1: \n",
" model.root.input.model.unit_001.col_porosity = 0.45 # Pit: 0.45 \n",
" model.root.input.model.unit_001.cross_section_area = 0.046 # m^2 Pit: 0.046\n",
" model.root.input.model.unit_001.velocity = 2.28e-3 # m/s Pit: 2.28e-3 #3.25e-3\n",
" model.root.input.model.unit_001.col_dispersion = n_comp*[0] # m^2/s Aumeier:\n",
" model.root.input.model.unit_001.init_c = n_comp * [0] # mol/m^3 \n",
" model.root.input.model.unit_001.init_q = n_comp *[0] \n",
" \n",
" \n",
" ##################################Particles###################################################################\n",
" \n",
" model.root.input.model.unit_001.film_diffusion = k_film # m/s\n",
" model.root.input.model.unit_001.film_diffusion_multiplex = 0 \n",
" model.root.input.model.unit_001.par_diffusion = porediffusion # m^2 / s (mobile phase) Vereinfachung da homogene Partikelprosität angenommen 0.555*2.181e-10\n",
" model.root.input.model.unit_001.par_diffusion_multiplex = 0\n",
" model.root.input.model.unit_001.par_surfdiffusion = [0,] # m^2 / s (solid phase)\n",
" model.root.input.model.unit_001.par_surfdiffusion_multiplex = 0\n",
" model.root.input.model.unit_001.par_porosity = porosityclasses # Pitt: 0.49\n",
" model.root.input.model.unit_001.par_radius = sizeclasses # [5.5e-4,4.5e-4,3.5e-4,2.5e-4,1.5e-4] # m beachte RADIUS!!!!! Pitt d=1.1mm --> 0,55mm\n",
" model.root.input.model.unit_001.par_type_volfrac = vol_frac \n",
"\n",
" \n",
" ##########################Reaction#########################################################\n",
" \n",
" model.root.input.model.unit_001.reaction_model_particles = 'MASS_ACTION_LAW'\n",
" model.root.input.model.unit_001.reaction_particle.MAL_KFWD_liquid = k_RL\n",
" #model.root.input.model.unit_001.reaction_particle.MAL_KFWD_solid = [0]\n",
"\n",
" model.root.input.model.unit_001.reaction_particle.MAL_KBWD_liquid = 0\n",
" #model.root.input.model.unit_001.reaction_particle.MAL_KBWD_solid = [0]\n",
" \n",
" model.root.input.model.unit_001.reaction_particle.MAL_STOICHIOMETRY_liquid = [-1] #[-1, 1] nur wenn zwei Komponenten in c_feed = [6.865, 0] sind, wurde nur einmal verwendet um den DOC Abbau abzubilden\n",
" #model.root.input.model.unit_001.reaction_particle.MAL_STOICHIOMETRY_solid = [-1]\n",
" \n",
" ################################### Adsorption ###############################################################\n",
" model.root.input.model.unit_001.adsorption_model = 'FREUNDLICH_LDF' \n",
" model.root.input.model.unit_001.adsorption = adsorption_parameters \n",
"\n",
" ################################### Discretization #############################################################\n",
" \n",
" set_discretization(model, n_bound)\n",
" \n",
" model.root.input.model.unit_001.discretization.ncol = n_col \n",
" model.root.input.model.unit_001.discretization.nbound = n_bound \n",
" model.root.input.model.unit_001.discretization.npartype = n_partype\n",
" model.root.input.model.unit_001.discretization.par_geom = 'SPHERE' \n",
"\n",
" ########################################### Outlet ######################################################\n",
" model.root.input.model.unit_002.unit_type = 'OUTLET'\n",
" model.root.input.model.unit_002.ncomp = n_comp\n",
"\n",
" \n",
" ###################################### Sections and Switches ############################################\n",
" model.root.input.solver.sections.nsec = 1 \n",
" model.root.input.solver.sections.section_times = [0.0, t_in_seconds] \n",
" model.root.input.solver.sections.section_continuity = [0] \n",
"\n",
" model.root.input.model.connections.nswitches = 1 \n",
" model.root.input.model.connections.switch_000.section = 0 \n",
" model.root.input.model.connections.switch_000.connections = [\n",
" \n",
" 0, 1, -1, -1, volume_flow_rate, \n",
" 1, 2, -1, -1, volume_flow_rate]\n",
" \n",
"\n",
" #unit_from, unit_to, component_from, component_to, volumetric flow rate\n",
" #unit_000, unit_001, all components, all components, Q\n",
" #unit_001, unit_002, all components, all components, Q\n",
" #-1 = all components from origin and destination unit are connected\n",
" \n",
" \n",
" ####################################### Simulator Settings ################################################\n",
" \n",
" \n",
" model.root.input.solver.user_solution_times = np.linspace(0, t_in_seconds, resolution)\n",
" \n",
" return model"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8a19ac56",
"metadata": {},
"outputs": [],
"source": [
"def runandoutput_Nette(t_in_seconds, n_col, n_bound, c_feed, adsorption_parameters, resolution, sizeclasses,porosityclasses ,n_partype,vol_frac,porediffusion,k_film ,k_RL, volume_flow_rate,\n",
" size_distribution=None, porosity_distribution=None, axial_distribution=None , label_addon=''):\n",
" \n",
" saeule_vor_rueckspuelung_GF = create_column_GRM_Nette(t_in_seconds,n_col, n_bound,n_partype, c_feed, adsorption_parameters, resolution, sizeclasses, porosityclasses ,vol_frac,\n",
" porediffusion,k_film ,k_RL, volume_flow_rate , length=2.1)\n",
" run_simulation(saeule_vor_rueckspuelung_GF)\n",
" \n",
" #ncol und vol_frac müssen reduziert werden\n",
" ncol_G1 = int(n_col*(0.9/2.1))\n",
" vol_frac=np.array(vol_frac).reshape(n_col,n_partype)\n",
" vol_frac_G1= vol_frac[:-(ncol-ncol_G1), :]\n",
" vol_frac_G1=vol_frac_G1.flatten()\n",
" vol_frac_G1=vol_frac_G1.tolist()\n",
" saeule_vor_rueckspuelung_G1 = create_column_GRM_Nette(t_in_seconds,ncol_G1, n_bound,n_partype, c_feed, adsorption_parameters, resolution, sizeclasses, porosityclasses ,vol_frac_G1,\n",
" porediffusion,k_film ,k_RL, volume_flow_rate , length=0.9)\n",
" run_simulation(saeule_vor_rueckspuelung_G1)\n",
" \n",
" ncol_G2 = int(n_col*(1.3/2.1))\n",
" vol_frac=np.array(vol_frac).reshape(n_col,n_partype)\n",
" vol_frac_G2= vol_frac[:-(ncol-ncol_G2), :]\n",
" vol_frac_G2=vol_frac_G2.flatten()\n",
" vol_frac_G2=vol_frac_G2.tolist()\n",
" saeule_vor_rueckspuelung_G2 = create_column_GRM_Nette(t_in_seconds,ncol_G2, n_bound,n_partype, c_feed, adsorption_parameters, resolution, sizeclasses, porosityclasses ,vol_frac_G2,\n",
" porediffusion,k_film ,k_RL, volume_flow_rate , length=1.3)\n",
" run_simulation(saeule_vor_rueckspuelung_G2)\n",
" \n",
" ncol_G3 = int(n_col*(1.7/2.1))\n",
" vol_frac=np.array(vol_frac).reshape(n_col,n_partype)\n",
" vol_frac_G3= vol_frac[:-(ncol-ncol_G3), :]\n",
" vol_frac_G3=vol_frac_G3.flatten()\n",
" vol_frac_G3=vol_frac_G3.tolist()\n",
" saeule_vor_rueckspuelung_G3 = create_column_GRM_Nette(t_in_seconds,ncol_G3, n_bound,n_partype, c_feed, adsorption_parameters, resolution, sizeclasses, porosityclasses ,vol_frac_G3,\n",
" porediffusion,k_film ,k_RL, volume_flow_rate , length=1.7)\n",
" run_simulation(saeule_vor_rueckspuelung_G3)\n",
" \n",
" time = saeule_vor_rueckspuelung_GF.root.output.solution.solution_times\n",
" c_out_GF = saeule_vor_rueckspuelung_GF.root.output.solution.unit_001.solution_outlet\n",
" c_out_G1 = saeule_vor_rueckspuelung_G1.root.output.solution.unit_001.solution_outlet\n",
" c_out_G2 = saeule_vor_rueckspuelung_G2.root.output.solution.unit_001.solution_outlet\n",
" c_out_G3 = saeule_vor_rueckspuelung_G3.root.output.solution.unit_001.solution_outlet\n",
"\n",
"\n",
" zeit= saeule_vor_rueckspuelung_GF.root.meta.time_sim\n",
"\n",
" table_cout_GF = pd.DataFrame(c_out_GF,index= time)\n",
" table_cout_G1 = pd.DataFrame(c_out_G1,index= time)\n",
" table_cout_G2 = pd.DataFrame(c_out_G2,index= time)\n",
" table_cout_G3 = pd.DataFrame(c_out_G3,index= time)\n",
"\n",
"\n",
" if axial_distribution is not None:\n",
" if size_distribution is not None:\n",
" if porosity_distribution is not None:\n",
" label='Case 8' # inhomogener Fall\n",
" else:\n",
" label='Case 7'\n",
" else:\n",
" if porosity_distribution is not None:\n",
" label='Case 6'\n",
" else:\n",
" label='Case 5'\n",
" else:\n",
" if size_distribution is not None:\n",
" if porosity_distribution is not None:\n",
" label='Case 4'\n",
" else:\n",
" label='Case 3'\n",
" else:\n",
" if porosity_distribution is not None:\n",
" label='Case 2'\n",
" else:\n",
" label='Case 1' #homogener Fall\n",
"\n",
" if size_distribution is not None:\n",
" experiment_name= size_distribution\n",
" else:\n",
" experiment_name= porosity_distribution \n",
" \n",
" outputname = ['table_cout_GF','table_cout_G1','table_cout_G2','table_cout_G3']\n",
" output = [table_cout_GF , table_cout_G1 , table_cout_G2 , table_cout_G3]\n",
" for k in range(len(output)):\n",
" filepath1 = Path('D:/Studium/MA Runde 2/02a Simulationen/06 Results/Simulationresults/'+ str(label)+'/'+experiment_name[38:]+'/'+outputname[k]+'_'+label_addon+'.csv')\n",
" filepath1.parent.mkdir(parents=True, exist_ok=True) \n",
" output[k].to_csv(filepath1)\n",
"\n",
" DBK_DOC_4 = np.loadtxt(\"D:/Studium/Pit´s_Code/7_CADET_Workspace/7_CADET_Workspace/10_plots/input_data/1_DOC_SAK/DOC_Potenz_G3.F.csv\", delimiter=',')\n",
" time_real4 = DBK_DOC_4[:,0]\n",
" c_out_4P = DBK_DOC_4[:,2]\n",
" plt.figure()\n",
" plt.title('Breakthrough curve')\n",
" plt.xlabel('$Time~/~Days$')\n",
" plt.ylabel('$Concentration~/~ mg/l $')\n",
" plt.plot(time/86400, c_out_GF, color = 'r', label='$c_{out}$') \n",
" plt.scatter(time_real4/86400, c_out_4P, color = 'k', label='G3.F', s = 10, marker = \"x\") \n",
" plt.legend(loc=2)\n",
" plt.savefig('D:/Studium/MA Runde 2/02a Simulationen/06 Results/Simulationresults/'+ str(label)+'/'+experiment_name[38:]+'/'+'c_out_GF'+'_'+label_addon+'.png')\n",
" \n",
" DBK_DOC_3 = np.loadtxt('D:/Studium/Pit´s_Code/7_CADET_Workspace/7_CADET_Workspace/10_plots/input_data/1_DOC_SAK/DOC_Potenz_G3.3.csv', delimiter=',')\n",
" time_real3 = DBK_DOC_3[:,0]\n",
" c_out_3P = DBK_DOC_3[:,2]\n",
"\n",
" DBK_DOC_2 = np.loadtxt('D:/Studium/Pit´s_Code/7_CADET_Workspace/7_CADET_Workspace/10_plots/input_data/1_DOC_SAK/DOC_Potenz_G3.2.csv', delimiter=',')\n",
" time_real2 = DBK_DOC_2[:,0]\n",
" c_out_2P = DBK_DOC_2[:,2]\n",
"\n",
" DBK_DOC_1 = np.loadtxt('D:/Studium/Pit´s_Code/7_CADET_Workspace/7_CADET_Workspace/10_plots/input_data/1_DOC_SAK/DOC_Potenz_G3.1.csv', delimiter=',')\n",
" time_real1 = DBK_DOC_1[:,0]\n",
" c_out_1P = DBK_DOC_1[:,2]\n",
" \n",
" plt.figure()\n",
" plt.title(str(label)+' '+ size_distribution[38:])\n",
" plt.xlabel('$Time~/~Days$')\n",
" plt.ylabel('$Concentration~/~ mg/l $')\n",
" plt.plot(time/86400, c_out_G1, color = 'k', linestyle = 'dashed', label = '$G3.1_{simuliert}$', lw=1.2) \n",
" plt.plot(time/86400, c_out_G2, color = 'k', linestyle = 'dotted', label = '$G3.2_{simuliert}$', lw=1.2) \n",
" plt.plot(time/86400, c_out_G3, color = 'k', linestyle = 'dashdot', label = '$G3.3_{simuliert}$', lw=1.2) \n",
" plt.scatter(time_real1/86400, c_out_1P, color = 'cadetblue', marker = 'o', label = '$G3.1_{Mittel.}$' ,lw=1.2) \n",
" plt.scatter(time_real2/86400, c_out_2P, color = 'navy', marker = '+', label = '$G3.2_{Mittel.}$' ,lw=1.2) \n",
" plt.scatter(time_real3/86400, c_out_3P, color = 'grey', marker = 'd', label = '$G3.3_{Mittel.}$', lw=1.2) \n",
" plt.legend(loc=2)\n",
" plt.savefig('D:/Studium/MA Runde 2/02a Simulationen/06 Results/Simulationresults/'+ str(label)+'/'+experiment_name[38:]+'/'+'c_out_G1-G3'+'_'+label_addon+'.png')\n",
" return zeit, saeule_vor_rueckspuelung_GF"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ce7b3dcf",
"metadata": {},
"outputs": [],
"source": [
"def runandoutput(t_in_seconds, n_col, n_bound, c_feed, adsorption_parameters, resolution, sizeclasses,porosityclasses ,n_partype,vol_frac,\n",
" size_distribution=None, porosity_distribution=None, axial_distribution=None , label_addon=''):\n",
" \n",
" saeule_vor_rueckspuelung = create_column__bB_GRM_AFR(t_in_seconds,n_col, n_bound,n_partype, c_feed, adsorption_parameters, resolution, sizeclasses,porosityclasses ,vol_frac)\n",
" run_simulation(saeule_vor_rueckspuelung)\n",
" \n",
" if run_simulation is not None:\n",
" \n",
" time = saeule_vor_rueckspuelung.root.output.solution.solution_times\n",
" c_bulk = saeule_vor_rueckspuelung.root.output.solution.unit_001.solution_bulk\n",
" c_particle = saeule_vor_rueckspuelung.root.output.solution.unit_001.solution_particle\n",
" c_particle_npartype = saeule_vor_rueckspuelung.root.output.solution.unit_001.solution_particle_partype_000\n",
" c_solid = saeule_vor_rueckspuelung.root.output.solution.unit_001.solution_solid\n",
" c_solid_npartype= saeule_vor_rueckspuelung.root.output.solution.unit_001.solution_solid_partype_000\n",
" c_out = saeule_vor_rueckspuelung.root.output.solution.unit_001.solution_outlet\n",
" c_in = saeule_vor_rueckspuelung.root.output.solution.unit_001.solution_inlet\n",
" #column_length = saeule_vor_rueckspuelung.root.output.coordinates.unit_001.axial_coordinates\n",
" #particlecoord = saeule_vor_rueckspuelung.root.output.coordinates.unit_001.particle_coordinates_004\n",
" zeit= saeule_vor_rueckspuelung.root.meta.time_sim\n",
" \n",
" table_csolidpartype= pd.DataFrame(index= time)\n",
" table_cparpartype= pd.DataFrame(index= time)\n",
" for i in range(n_partype):\n",
" #parcoord=np.append(parcoord,saeule_vor_rueckspuelung.root.output.solution.unit_001['solution_particle_partype_{0:03d}'.format(i)])\n",
" particletypeX = saeule_vor_rueckspuelung.root.output.solution.unit_001['solution_particle_partype_{0:03d}'.format(i)]\n",
" particletypeY = saeule_vor_rueckspuelung.root.output.solution.unit_001['solution_solid_partype_{0:03d}'.format(i)]\n",
" col_name1 = []\n",
" col_name2 = []\n",
" for j in range(n_col): \n",
" name = 'npar'+str(i)+'-ncol'+str(j)\n",
" col_name1 = np.append(col_name1,name)\n",
" col_name2 = np.append(col_name2,name)\n",
" tableX = pd.DataFrame(particletypeX[:,:,0,0], index= time)\n",
" tableX.columns = col_name1\n",
" tableY = pd.DataFrame(particletypeY[:,:,0,0], index= time)\n",
" tableY.columns = col_name2\n",
" table_cparpartype = pd.concat([table_cparpartype,tableX], axis=1)\n",
" table_csolidpartype = pd.concat([table_csolidpartype,tableY], axis=1)\n",
" \n",
" table_cbulk = pd.DataFrame(c_bulk[:,:,0],index= time)\n",
" table_cout = pd.DataFrame(c_out,index= time)\n",
" #table_csolid = pd.DataFrame(c_solid[:,:,0],index= time)\n",
" #table_cparticle = pd.DataFrame(c_particle[:,:,0],index= time)\n",
" \n",
" if axial_distribution is not None:\n",
" if size_distribution is not None:\n",
" if porosity_distribution is not None:\n",
" label='Case 8' # inhomogener Fall\n",
" else:\n",
" label='Case 7'\n",
" else:\n",
" if porosity_distribution is not None:\n",
" label='Case 6'\n",
" else:\n",
" label='Case 5'\n",
" else:\n",
" if size_distribution is not None:\n",
" if porosity_distribution is not None:\n",
" label='Case 4'\n",
" else:\n",
" label='Case 3'\n",
" else:\n",
" if porosity_distribution is not None:\n",
" label='Case 2'\n",
" else:\n",
" label='Case 1' #homogener Fall\n",
" \n",
" if n_partype>1:\n",
" outputname = ['table_csolidpartype','table_cparpartype','table_cbulk','table_cout']\n",
" output = [table_csolidpartype , table_cparpartype , table_cbulk , table_cout]\n",
" for k in range(len(output)):\n",
" filepath1 = Path('D:/Studium/MA Runde 2/02a Simulationen/06 Results/Simulationresults/'+ str(label)+'/'+size_distribution+'_'+outputname[k]+label_addon+'.csv')\n",
" filepath1.parent.mkdir(parents=True, exist_ok=True) \n",
" output[k].to_csv(filepath1)\n",
" else: # warum nicht to_excel?\n",
" outputname = ['table_cbulk','table_cout']\n",
" output = [table_cbulk,table_cout]\n",
" for k in range(len(output)):\n",
" filepath1 = Path('D:/Studium/MA Runde 2/02a Simulationen/06 Results/Simulationresults/'+ str(label)+'/'+'Run'+'_'+outputname[k]+label_addon+'.csv')\n",
" filepath1.parent.mkdir(parents=True, exist_ok=True) \n",
" output[k].to_csv(filepath1)\n",
" DBK_DOC_4 = np.loadtxt(\"D:/Studium/Pit´s_Code/7_CADET_Workspace/7_CADET_Workspace/10_plots/input_data/1_DOC_SAK/DOC_Potenz_G3.F.csv\", delimiter=',')\n",
" time_real4 = DBK_DOC_4[:,0]\n",
" c_out_4P = DBK_DOC_4[:,2]\n",
" plt.figure()\n",
" plt.title('Durchbruchskurve')\n",
" plt.xlabel('$Zeit~/~Tage$')\n",
" plt.ylabel('$Konzentration~/~ mg/l $')\n",
" plt.plot(time/86400, c_out, color = 'r', label='$c_{out}$') \n",
" plt.scatter(time_real4/86400, c_out_4P, color = 'k', label='G3.F', s = 10, marker = \"x\") \n",
" plt.legend(loc=2)\n",
" plt.savefig('D:/Studium/MA Runde 2/02a Simulationen/06 Results/Simulationresults/'+ str(label)+'/'+'Run'+'_'+outputname[k]+label_addon+'.png')\n",
" return zeit, saeule_vor_rueckspuelung"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "3abe5d02",
"metadata": {},
"outputs": [],
"source": [
"from CADETMatch.jupyter import Match"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "66fe23b5",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "76c241a8",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.15"
}
},
"nbformat": 4,
"nbformat_minor": 5
}