Running simulation on Spyder macOS

Hi all,

I was trying to start simulations on Spyder. I installed core simulators in the following directory (/Users/hoangnguyen/modsim_CADET/cadet/bin).

I used the example presented in Cadet Introduction and typed it as shown below. I constantly get the error: [Errno 2] No such file or directory: ‘/modsim_CADET/cadet/bin’

If I changed the path to Cadet.cadet_path = ‘/Users/hoangnguyen/modsim_CADET/cadet/bin’, it would return [Errno 13] Permission denied: ‘/Users/hoangnguyen/modsim_CADET/cadet/bin’.

I have tried to find a solution on the internet, but no luck. So anyone who has been able to run simulation in Python on macOS, would you please let me know how to fix it?

Thank you so much for your time.

Hoang Nguyen


import numpy as np
import matplotlib.pyplot as plt
from cadet import Cadet

Cadet.cadet_path = ‘/modsim_CADET/cadet/bin’

model = Cadet()

ncomp = 1
model.root.input.model.nunits = 3

INLET

model.root.input.model.unit_000.unit_type = ‘INLET’
model.root.input.model.unit_000.ncomp = ncomp
model.root.input.model.unit_000.inlet_type = ‘PIECEWISE_CUBIC_POLY’

GENERAL RATE MODEL

model.root.input.model.unit_001.unit_type = ‘GENERAL_RATE_MODEL’
model.root.input.model.unit_001.ncomp = ncomp

Geometry

model.root.input.model.unit_001.col_length = 0.1
model.root.input.model.unit_001.croos_section_area = 0.01
model.root.input.model.unit_001.col_porosity = 0.37
model.root.input.model.unit_001.par_porosity = 0.33
model.root.input.model.unit_001.par_radius = 1e-6

Transport

model.root.input.model.unit_001.col_dispersion = 1e-8
model.root.input.model.unit_001.film_diffusion = [1e-5,]
model.root.input.model.unit_001.par_diffusion = [1e-10,]
model.root.input.model.unit_001.par_surfdiffusion = [0.0,]

Adsorption model

model.root.input.model.unit_001.adsorption_model = ‘MULTI_COMPONENT_LANGMUIR’
model.root.input.model.unit_001.adsorption.is_kinetic = True
model.root.input.model.unit_001.adsorption.mcl_ka = [1.0,]
model.root.input.model.unit_001.adsorption.mcl_kd = [1.0,]
model.root.input.model.unit_001.adsorption.mcl_qmax = [100.0,]

Initial conditions

model.root.input.model.unit_001.init_c = [0.0,]
model.root.input.model.unit_001.init_q = [0.0,]

Discretization

Grid cells

model.root.input.model.unit_001.discretization.ncol = 20
model.root.input.model.unit_001.discretization.npar = 5

Bound states

model.root.input.model.unit_001.discretization.nbound = [1]

Other options

model.root.input.model.unit_001.discretization.par_disc_type = ‘EQUIDISTANT_PAR’
model.root.input.model.unit_001.discretization.use_analytic_jacobian = 1
model.root.input.model.unit_001.discretization.reconstruction = ‘WENO’
model.root.input.model.unit_001.discretization.gs_type = 1
model.root.input.model.unit_001.discretization.max_krylov = 0
model.root.input.model.unit_001.discretization.max_restarts = 10
model.root.input.model.unit_001.discretization.schur_safety = 1.0e-8

model.root.input.model.unit_001.discretization.weno.boundary_model = 0
model.root.input.model.unit_001.discretization.weno.weno_eps = 1e-10
model.root.input.model.unit_001.discretization.weno.weno_order = 3

OUTLET

model.root.input.model.unit_002.unit_type = ‘OUTLET’
model.root.input.model.unit_002.ncomp = ncomp

Time sections

model.root.input.solver.sections.nsec = 1
model.root.input.solver.sections.section_times = [0.0, 1200,] # s
model.root.input.solver.sections.section_continuity = []

model.root.input.model.unit_000.sec_000.const_coeff = [1.0e-3,] # mol / m^3
model.root.input.model.unit_000.sec_000.lin_coeff = [0.0,]
model.root.input.model.unit_000.sec_000.quad_coeff = [0.0,]
model.root.input.model.unit_000.sec_000.cube_coeff = [0.0,]

Connectivity

model.root.input.model.connections.nswitches = 1
model.root.input.model.connections.switch_000.section = 0
model.root.input.model.connections.switch_000.connections = [
0, 1, -1, -1, 60/1e6,
1, 2, -1, -1, 60/1e6]

SIMULATOR

model.root.input.model.solver.gs_type = 1
model.root.input.model.solver.max_krylov = 0
model.root.input.model.solver.max_restarts = 10
model.root.input.model.solver.schur_safety = 1e-8

Number of cores for parallel simulation

model.root.input.solver.nthreads = 2

Tolerances for the time integrator

model.root.input.solver.time_integrator.abstol = 1e-6
model.root.input.solver.time_integrator.algtol = 1e-10
model.root.input.solver.time_integrator.reltol = 1e-6
model.root.input.solver.time_integrator.init_step_size = 1e-6
model.root.input.solver.time_integrator.max_steps = 1000000

Return data

model.root.input[‘return’].split_components_data = 0
model.root.input[‘return’].split_ports_data = 0
model.root.input[‘return’].unit_000.write_solution_bulk = 1
model.root.input[‘return’].unit_000.write_solution_inlet = 1
model.root.input[‘return’].unit_000.write_solution_outlet = 1

Copy settings to the other unit operations

model.root.input[‘return’].unit_001 = model.root.input[‘return’].unit_000
model.root.input[‘return’].unit_002 = model.root.input[‘return’].unit_000

Solution times

model.root.input.solver.user_solution_times = np.linspace(0, 1200, 1001)

model.filename = ‘practice_introduction.h5’
model.save()

data = model.run()

if data.returncode == 0:
print(“Simulation completed successfully”)
model.load()
else:
print(data)
raise Exception(“Simulation failed”)

Plotting the results

plt.figure()

time = model.root.output.solution.solution_times
c = model.root.output.solution.unit_001.solution_outlet
plt.plot(time/60, c)
plt.xlabel(’time~/~min’)
plt.ylabel(’Outlet~concentration~/~mol \cdot m^{-3} ’)
plt.show()

Hey Hoang,

you need to provide the complete path to the cadet-cli. In the tutorials, we only had the path to the bin directory because we were also using other functions from there.

So in your case, you probably need to define:

Cadet.cadet_path = ‘/Users/hoangnguyen/modsim_CADET/cadet/bin/cadet-cli'

Btw, if you want to format code a little nicer in the forum, you can use 3 backticks (```) before and after the code block.

Hey Jo.
Thanks for your answer. I tried '/modsim_CADET/cadet/bin/cadet-cli' but failed. I should have tried your command. Too bad for me :slight_smile:

Anyway, it works now. Many thanks!