Error in simulating affinity chrom with two components

HI All,
I saw an error when I was trying to simulate affinity chrom with two components.

It says "CompletedProcess(args=['c:/cadet/bin/cadet-cli.exe', 'model.h5'], returncode=1, stdout=b'', stderr=b'ERROR: The required parameter "PAR_TYPE_VOLFRAC" was not found\r\n')
---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_34100\2242269908.py in <module>
      9 else:
     10     print(data)
---> 11     raise Exception("Simulation failed")

Exception: Simulation failed". 

I read the instruction. I think PAR_TYPE_VOLFRAC is between 0 and 1 and it is optional.
If you can explain PAR_TYPE_VOLFRAC and give me some hints, it will be greatly appricaited!

Thanks.

Here is my code:

import numpy as np
import matplotlib.pyplot as plt

from cadet import Cadet
Cadet.cadet_path = 'c:/cadet/bin/cadet-cli.exe'

model = Cadet()

n_comp = 2
n_unit = 3

model.root.input.model.nunits = n_unit

# inlet
model.root.input.model.unit_000.unit_type = 'INLET'
model.root.input.model.unit_000.ncomp = n_comp
model.root.input.model.unit_000.inlet_type = 'PIECEWISE_CUBIC_POLY'

model.root.input.model.unit_001.unit_type = 'LUMPED_RATE_MODEL_WITH_PORES'
model.root.input.model.unit_001.ncomp = 1

## Geometry
model.root.input.model.unit_001.col_length = 0.6                # m
model.root.input.model.unit_001.cross_section_area = 0.0001       # m
model.root.input.model.unit_001.col_porosity = 0.37            # -
model.root.input.model.unit_001.par_porosity = 0.63             # -
model.root.input.model.unit_001.par_radius = 4.5e-5               # m
                                                                
## Transport
model.root.input.model.unit_001.col_dispersion = 2e-6           # m^2 / s (interstitial volume)
model.root.input.model.unit_001.film_diffusion = [1e-4, 1e-4]         # m / s
# model.root.input.model.unit_001.par_diffusion = [1e-10,]        # m^2 / s (mobile phase)  
# model.root.input.model.unit_001.par_surfdiffusion = [0.0,]      # m^2 / s (solid phase)

model.root.input.model.unit_001.adsorption_model = 'MULTI_COMPONENT_LANGMUIR'

model.root.input.model.unit_001.adsorption.is_kinetic = False
model.root.input.model.unit_001.adsorption.mcl_ka = [2, 3]
model.root.input.model.unit_001.adsorption.mcl_kd = [1, 1]
model.root.input.model.unit_001.adsorption.mcl_qmax = [1, 1]

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

### Grid cells
model.root.input.model.unit_001.discretization.ncol = 100
model.root.input.model.unit_001.discretization.npar = 5

### Bound states
model.root.input.model.unit_001.discretization.nbound = n_comp*[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 = n_comp

# Sections and connections
model.root.input.solver.sections.nsec = 2
model.root.input.solver.sections.section_times = [0.0, 50.0, 1200.0]
model.root.input.solver.sections.section_continuity = n_comp*[0,]

## Inlet Profile
model.root.input.model.unit_000.sec_000.const_coeff = n_comp*[1.0,]
model.root.input.model.unit_000.sec_001.const_coeff = n_comp*[0.0,]

## Switches
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, 1e-7,
    1, 2, -1, -1, 1e-7
]

#set the times that the simulator writes out data for
model.root.input.solver.user_solution_times = np.linspace(0, 1200, 601)

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 = 1

# 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

model.filename = 'model.h5'
model.save()

data = model.run()

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

Hey,

can I ask, why did you set ncomp = 1 for the LRMP?

model.root.input.model.unit_001.unit_type = 'LUMPED_RATE_MODEL_WITH_PORES'
model.root.input.model.unit_001.ncomp = 1

because if I set it to 2, as the rest of your system (and change init_c and init_q), everything works.

So for the column

model.root.input.model.unit_001.unit_type = 'LUMPED_RATE_MODEL_WITH_PORES'
model.root.input.model.unit_001.ncomp = 2

## Geometry
model.root.input.model.unit_001.col_length = 0.6  # m
model.root.input.model.unit_001.cross_section_area = 0.0001  # m
model.root.input.model.unit_001.col_porosity = 0.37  # -
model.root.input.model.unit_001.par_porosity = 0.63  # -
model.root.input.model.unit_001.par_radius = 4.5e-5  # m

## Transport
model.root.input.model.unit_001.col_dispersion = 2e-6  # m^2 / s (interstitial volume)
model.root.input.model.unit_001.film_diffusion = [1e-4, 1e-4]  # m / s
# model.root.input.model.unit_001.par_diffusion = [1e-10,]        # m^2 / s (mobile phase)
# model.root.input.model.unit_001.par_surfdiffusion = [0.0,]      # m^2 / s (solid phase)

model.root.input.model.unit_001.adsorption_model = 'MULTI_COMPONENT_LANGMUIR'

model.root.input.model.unit_001.adsorption.is_kinetic = False
model.root.input.model.unit_001.adsorption.mcl_ka = [2, 3]
model.root.input.model.unit_001.adsorption.mcl_kd = [1, 1]
model.root.input.model.unit_001.adsorption.mcl_qmax = [1, 1]

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

@ronald.jaepel Thanks very much for the quick response!
You are right the error is from the ncomp. It was mismatched with n_comp = 2.
I was checking discretization section and was not able to solve it.
After you changed these two places, the code works well now.
Again, thank you for the help!

1 Like