{ "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 }