Single Molecule Generation
The primary API for generating a single biochar molecule is
generate_biochar() (convenience function) or
the lower-level BiocharGenerator class.
Generation pipeline
target_num_carbons
│
▼
Carbon skeleton (PAH library seed + ring-growth)
│ Parity-aware hex-lattice builder; 100 % aromatic for any size
▼
Oxygen assignment (functional groups dict or O/C-ratio-driven)
│
▼
Hydrogen assignment (fill valences → target H/C ratio)
│
▼
3D geometry
│ ≤ 80 heavy atoms: ETKDGv3 embedding + MMFF94 minimisation
│ > 80 heavy atoms: 2-D flat sheet + force-field minimisation
▼
OPLS-AA atom typing & partial charges
│
▼
Validation (composition, geometry, steric clashes)
│
▼
GROMACS export (.gro / .top / .itp)
Controlling size
The target_num_carbons parameter controls skeleton size.
The generator uses the built-in PAH library for sizes
up to 40 C, then grows the skeleton by appending fused hexagonal rings.
from biochar import generate_biochar
# Small molecule — exact match from PAH library
mol, coords, gro, top, itp = generate_biochar(
target_num_carbons=24, # coronene
output_directory="output",
)
# Large sheet — hex-lattice growth path
mol, coords, gro, top, itp = generate_biochar(
target_num_carbons=150,
output_directory="output",
)
PAH library (seed molecules)
Molecule |
C |
Type |
|---|---|---|
benzene |
6 |
Classic |
naphthalene |
10 |
Classic |
anthracene / phenanthrene |
14 |
Linear / angular |
pyrene |
16 |
Pericondensed |
chrysene / tetracene |
18 |
Various |
coronene |
24 |
7-ring compact |
hex_lattice_28/30/38/40 |
28–40 |
Graphene flakes |
Controlling composition
H/C and O/C ratios are set as targets with configurable tolerances:
mol, coords, gro, top, itp = generate_biochar(
target_num_carbons=80,
H_C_ratio=0.65, # high H → lower pyrolysis temperature
H_C_tolerance=0.10, # accept ± 10 %
O_C_ratio=0.20, # high O → more functional groups
O_C_tolerance=0.10,
)
Typical values by pyrolysis temperature:
Temperature |
H/C |
O/C |
|---|---|---|
300–400 °C |
0.6–0.8 |
0.15–0.25 |
500–600 °C |
0.4–0.6 |
0.08–0.15 |
700–800 °C |
0.2–0.4 |
0.02–0.08 |
Pentagon ring defects
Real biochar contains both 6-membered (hexagonal) and 5-membered (pentagonal)
rings due to incomplete graphitization. The defect_fraction parameter
controls the probability that each ring added during skeleton growth is a
pentagon instead of a hexagon.
mol, coords, gro, top, itp = generate_biochar(
target_num_carbons=80,
H_C_ratio=0.4,
O_C_ratio=0.05,
defect_fraction=0.15, # ~15 % of rings will be pentagons
output_directory="output",
seed=42,
)
Guidance on defect_fraction values:
Value |
Effect |
|---|---|
0.0 (default) |
Pure hexagonal PAH — flat graphene-like sheet |
0.05–0.10 |
Mild disorder — a few curvature-inducing defects |
0.10–0.20 |
Realistic amorphous biochar topology |
> 0.30 |
Highly disordered — may need more retries to kekulize |
Pentagon rings introduce curvature and parity constraints. The generator automatically handles parity (even/odd node count) to ensure each structure can be kekulized, retrying with a different sub-seed up to 5 times if needed.
Reproducibility
Pass an integer seed to get deterministic output:
mol, coords, gro, top, itp = generate_biochar(
target_num_carbons=80,
seed=42,
)
Using the class API
For more control, use BiocharGenerator
directly:
from biochar import BiocharGenerator, GeneratorConfig
config = GeneratorConfig(
target_num_carbons=100,
H_C_ratio=0.4,
O_C_ratio=0.08,
functional_groups={"phenolic": 4, "carboxyl": 1},
seed=99,
)
gen = BiocharGenerator(config)
mol, coords, composition = gen.generate()
gen.print_summary()
gro, top, itp = gen.export_gromacs("output", "bc_custom")