Computer-aided molecular and process design based on the FeOs framework.
The package provides infrastructure to perform a computer-aided molecular and process design. It consists of
- Implementation of a custom outer-approximation algorithms to solve the resulting MINLP
- Molecular representations (group counts (CoMT-CAMD) and molecule superstructures)
- Property models (PC-SAFT and (heterosegmented) gc-PC-SAFT)
The underlying NLP subproblems are solved using IPOPT via the ipopt-ad crate. For the solution of th MILP master problems, the solver is linked to the good_lp crate that offers a common interface to various open-source MILP solvers.
Just add the dependency to your Cargo.toml
feos-campd = "0.3"
The following sections demonstrates the usage of the framework, for the API details, check out the documentation.
// define the molecular representation using a molecule superstructure let molecule = SuperMolecule::alkane(min_size, size); // or a combination of superstructures let molecule = SuperMolecule::non_associating(min_size, size); // or use group and structure definitions for CoMT-CAMD // (currently not further customizable) let molecule = CoMTCAMD;
// The property model for heterosegmented gc-PC-SAFT is not customizable. It does not include association. let property_model = GcPcSaftPropertyModel; // For homosegmented PC-SAFT, the group parameters can be passes as arguments // and it is available as the full model let property_model = PcSaftPropertyModel::full("rehner2023_homo.json", Some("rehner2023_homo_binary.json")); // or non-associating (ignoring all associating groups) let property_model = PcSaftPropertyModel::non_associating("rehner2023_homo.json", Some("rehner2023_homo_binary.json"));
//To define a process model in Rust, implement the `ProcessModel` trait for your struct. impl<E: TotalHelmholtzEnergy<N: ...>> ProcessModel<E, N_X: ..., N: ...> for YourModel { fn variables(&self) -> [ContinuousVariable; N_X] { [ ContinuousVariable::new(..., ..., ...), ... ] } fn constraints(&self) -> Vec<GeneralConstraint> { vec![ GeneralConstraint::Inequality(..., ...), GeneralConstraint::Equality(...), ... ] } fn evaluate<D: DualNum<f64> + Copy>( &self, eos: &HelmholtzEnergyWrapper<E, D, N>, chemical_records: [&ChemicalRecord<D>; N], x: [D; 3], ) -> EosResult<(D, Vec<D>)> { ... } }
// combine molecular representation, property model, and process model in an optimization problem let campd = IntegratedDesign::new(molecule, property_model, process); // and pass it to the outer approximation solver let solver = OuterApproximation::new(&campd); // to determine a ranking of the optimal molecules for a pur component solver.solve_ranking(y0, highs, runs, options); // where highs can be replaced with any of the other MILP solvers provided by the good_lp crate.
Molecular representations and property models can be combined according to:
| PC-SAFT | gc-PC-SAFT | |
|---|---|---|
CoMTCAMD |
yes | no |
SuperMolecule |
yes | yes |
If you find FeOs-torch useful for your own research, consider citing our publication from which this library resulted.
@article{rehner2023molecule_superstructures,
author = {Rehner, Philipp and Schilling, Johannes and Bardow, André},
title = {Molecule superstructures for computer-aided molecular and process design}
journal = {Molecular Systems Design & Engineering},
volume = {8},
issue = {4},
number = {12},
pages = {488-499},
year = {2023}
}