Welcome to the Overtoner, a quantum computation tool for deriving molar extinction coefficients for IR/NIR peaks.
This CLI performs the following quantum chemistry and Morse Model-based anharmonicty calulations to determine the molar extinction coefficent ε in $\text{M·cm}^{-1}$ for any organic molecule’s IR (or NIR) overtone peak. Its algorithm can even compute ε values for fundamnetal peaks, at full anharmonic accuracy.
- Molar mass (amu) of element A in an A-B stretch
- Molar mass (amu) of element B in an A-B stretch
- Fundamental frequency of molecule in
$\text{cm}^{-1}$ (wavenumber) - Observed frequency of molecule in
$\text{cm}^{-1}$ (wavenumber) - Approximate integer overtone order of the molecule’s observed wavenumber relative to the fundamental wavenumber
For an IR (or NIR) overtone transition from
Solving for
From
which avoids sign-convention issues that can make
- C–H
- C=O
- C–N
- N–H
- O–H
- Conda or Miniconda: Required for environment management
- Download from Anaconda or Miniconda
- Git: Required for cloning the repository
- Clone the Repository
git clone https://github.com/lukelevensaler/Organic-Morse-Solver.git
cd Organic-Morse-Solver
- Create the Conda Environment
The repository includes an environment.yml file that specifies all
required dependencies including: - PySCF: Quantum chemistry
calculations (SCF-level theory in the current implementation) -
NumPy/SciPy: Numerical computations and special functions -
Typer: CLI framework - PyBerny: Geometry optimization -
H5PY: Data storage for quantum chemistry results - High-Precision
Libraries: Optimized BLAS/LAPACK for numerical stability - Parallel
Computing: MPI support for distributed quantum chemistry calculations
Create the environment named morse_solver:
conda env create -f environment.yml
- Activate the Environment
conda activate morse_solver
- Verify Installation
Test that the CLI works correctly: python run_morse_model.py stretches
You should see the list of allowed organic stretches:
Allowed organic stretches: - C–H - C=O - C–N - N–H - O–H
Once installed, you can run the solver from the repository directory:
# Activate the environment (if not already active)
conda activate morse_solver
# Run the CLI
python3 run_morse_model.py compute --help
Common Issues:
- Conda environment creation fails: Ensure you have sufficient disk space (~2GB) and internet connectivity
- PySCF import errors: The environment includes all required quantum chemistry dependencies
- Permission errors: Ensure you have write access to your conda installation directory
This section describes the ab initio geometry optimization process, which is powered by Berny computations and Self-consistent field (SCF) evalutaions.
- Input: Cartesian coordinates in XYZ format (Element x y z) in Angstrom units
- Parse atomic symbols and positions into molecular structure
- Build PySCF molecule object with specified basis set (default: aug-cc-pVTZ)
Maximum precision SCF settings for geometry optimization: - Convergence
tolerance:
Uses analytic SCF gradients with Berny solver for geometry optimization:
- Convergence tolerance:
$1 \times 10^{-12}$ (extremely tight) - Maximum cycles: 200 (robust convergence)
- DIIS space: 15 (maximum space)
- Direct algorithm: enabled for numerical accuracy
- Maximum steps: 50 (user-configurable)
- Uses analytic SCF gradients for force evaluation
- Convergence on energy and gradient thresholds
Output: Optimized Cartesian coordinates at SCF level
This section describes the finite-difference calculation of dipole moment derivatives using SCF dipole moments.
For bond pair
Displacement along bond axis: $$ \begin{aligned} \vec{r}_i^{\pm} &= \vec{r}i \pm \frac{\delta}{2}\vec{u}{ij} \[4pt] \vec{r}_j^{\pm} &= \vec{r}j \mp \frac{\delta}{2}\vec{u}{ij} \end{aligned} $$
For two bonds sharing a common atom, e.g.,
Apply mass weighting using user-provided masses
Primary displacement: Use symmetric mode (larger projection typically).
- Basis set: aug-cc-pVTZ (or higher quality if specified)
- SCF convergence:
$1 \times 10^{-12}$ (extremely tight) - Maximum cycles: 200 (robust convergence)
- SCF Calculation: High-precision self-consistent field
- SCF Solution: Restricted or unrestricted Hartree–Fock
- Dipole Moment: Computed from SCF density matrices
$$ \vec{\mu} = -\text{Tr}\bigl[\mathbf{D}^{\text{SCF}} \cdot \hat{\vec{\mu}}\bigr] + \vec{\mu}{\mathrm{nuc}} $$ where $\mathbf{D}^{\text{SCF}}$ is the SCF density matrix and $\vec{\mu}{\mathrm{nuc}}$ is the nuclear contribution.
- Equilibrium:
$\vec{\mu}_0$ - Positive displacement:
$\vec{\mu}_+$ (geometry displaced by$+\delta$ ) - Negative displacement:
$\vec{\mu}_-$ (geometry displaced by$-\delta$ )
Output: First and second dipole derivatives in Debye units for Morse model input.
The Morse overtone integrals in this solver are evaluated using
dedicated routines in the stabilization subdirectory, chiefly
high_precision_arithmetic.py. These routines are designed for extreme
alternating series where individual terms are astronomically large, yet
the final physical quantities (transition dipole moments) are tiny.
API Map (functions → equations): - high_precision_log_gamma(x):
implements the Stirling-form approximation for high_precision_digamma(x),
high_precision_polygamma(1, x): implement the large-$x$ expansions for
high_precision_log_N_v(v, a, \lambda),
high_precision_N_v(v, a, \lambda): implement the normalization high_precision_S1_0n(n, a, \lambda):
evaluates the linear overlap high_precision_S2_0n(n, a, \lambda):
evaluates the quadratic overlap high_precision_alternating_sum_from_logs(...): performs the stabilized
alternating sum described in Section 5.
For large real arguments
- Log-gamma (Stirling form) for large
$x$ : $$ \ln\Gamma(x) ,\approx, \Bigl(x - \tfrac12\Bigr)\ln x - x + \tfrac12\ln(2\pi), \qquad x \gg 1. $$
This is implemented in high_precision_log_gamma(x) using Decimal.ln
for all logarithms. For moderate Decimal.
- Digamma function
$\psi(x) = \frac{d}{dx}\ln\Gamma(x)$ for large$x$ : $$ \psi(x) ,\approx, \ln x ,-, \frac{1}{2x} ,-, \frac{1}{12x^2} ,+, \frac{1}{120x^4} ,-, \frac{1}{252x^6} ,+,\cdots, \qquad x \gg 1. $$
This asymptotic series is implemented in high_precision_digamma(x)
(with SciPy used for moderate
- Trigamma (polygamma of order 1),
$\psi_1(x) = \frac{d}{dx}\psi(x)$ , is evaluated byhigh_precision_polygamma(1, x)using the corresponding high-precision representation (SciPy for moderate$x$ and asymptotics for large$x$ ).
All of these are performed in Decimal arithmetic with a globally set
precision (see getcontext().prec) so that the logarithms and
polynomial corrections retain far more than 16 digits.
\sqrt{
\frac{
a,(2\lambda - 2v - 1),\Gamma(v+1)
}{
\Gamma(2\lambda - v)
}
}
$$ are never formed directly. Instead,
high_precision_log_N_v(v,a,\lambda) computes $$
\ln N_v
\frac12\Bigl[ \ln a
- \ln(2\lambda - 2v - 1)
- \ln\Gamma(v+1)
- \ln\Gamma(2\lambda - v)
\Bigr],
$$ entirely in
Decimallog space usinghigh_precision_log_gamma. The actual$N_v$ is only obtained, if needed, via $$ N_v = \exp\bigl(\ln N_v\bigr), $$ and underflows are handled explicitly (values below about$\ln 10^{-100}$ are clamped).
These log-space normalization constants are used both in the
The Morse overlaps used in high_precision_S1_0n and
high_precision_S2_0n involve associated Laguerre polynomials
$L_n^{(_n)}(y)`. In the high-precision routines, the coefficients
$c_m$ of the polynomial expansion $$
L_n^{(\alpha_n)}(y) = \sum_{m=0}^{n} c_m, y^m
$$ are computed via Gamma functions in log form: $$
\ln c_m
\ln\Gamma(n+\alpha_n+1) ,-, \ln\Gamma(n-m+1) ,-, \ln\Gamma(\alpha_n+m+1), \qquad m=0,\dots,n. $$
This is exactly what the loop over high_precision_S1_0n_log_space and high_precision_S2_0n does: it
builds a list of Decimal values log_c_values (or log_c_vals)
holding c_signs.
The function high_precision_S1_0n (which calls
high_precision_S1_0n_log_space internally) implements the
high-precision evaluation of the linear overlap $S_1$ for the $0\to n$
transition. In log-space form, the integral is reduced to a finite sum
over $m$ , $$
S_1^{(0,n)}
\int_0^\infty y^{\beta-1},e^{-y} \Bigl(\ln\tfrac{y}{2\lambda}\Bigr) ,dy \quad\text{with}\quad \beta = 2\lambda - 5 + m. $$
\Gamma(\beta), \Bigl[\psi(\beta) - \ln(2\lambda)\Bigr]. $$
The code evaluates this in log-magnitude and sign form:
- Compute
$\ln\Gamma(\beta)$ viahigh_precision_log_gamma(beta). - Compute
$\psi(\beta)$ viahigh_precision_digamma(beta). - Compute
$\ln(2\lambda)$ aslog_2lambda = (2*lambda_dec).ln(). -
Form the difference $$ \Delta
\psi(\beta) - \ln(2\lambda). $$ - Determine the sign and log-magnitude: $$ \mathrm{sign}(I_m) = \mathrm{sign}(\Delta),\qquad \ln|I_m| = \ln\Gamma(\beta) + \ln|\Delta|. $$
The factorial
(-1)^m \cdot \mathrm{sign}(c_m) \cdot \mathrm{sign}(I_m). $$
The high_precision_S1_0n_log_space routine builds:
-
log_terms[m] = \ln|\text{term}_m|$ (asDecimal`), -
term_signs[m] = \mathrm{sign}(\text{term}_m)(asint$\pm1$ ),
and never directly forms
After the sum $\sum_m \text{term}m$ is computed (see §5), the overall normalization factor is applied in log space: $$ S_1^{(0,n)} = N_0 N_n,a^{-2},\sum{m=0}^n \text{term}_m, $$ with $$ \ln|N_0 N_n a^{-2}|
2\ln a. $$
Only at the very end is this combined log prefactor and log sum converted back to a real number via exponentiation.
The high-precision quadratic-overlap routine high_precision_S2_0n
mirrors the structure of high_precision_S1_0n but uses an $I_m^{(2)}$
integral that contains both $\psi$ and $\psi_1$ : $$
S_2^{(0,n)} =
\sum_{m=0}^n
(-1)^m
\frac{c_m}{m!}, I_m^{(2)},
$$ with $$
I_m^{(2)}
2\ln(2\lambda),\psi(\beta) + \ln(2\lambda)^2 \bigr]. $$
2\ln(2\lambda),\psi(\beta)
+
\ln(2\lambda)^2
$$ in high precision, then decomposes
As for log_terms
and term_signs, and the overall prefactor $$
N_0 N_n a^{-3}
$$ is applied in log space using high_precision_log_N_v
and Decimal.ln.
The summation of the series $$
\sum_{m=0}^n \text{term}_m
$$ is carried out by
high_precision_alternating_sum_from_logs(log_terms, term_signs):
-
Each pair
$(\ln|t_m|, \mathrm{sign}(t_m))$ is converted back to aDecimalvalue: $$ t_m = \mathrm{sign}(t_m),\exp\bigl(\ln|t_m|\bigr). $$ Extremely small terms with$\ln|t_m|$ below a cutoff (e.g. less than about$-1000$ ) are discarded as numerically irrelevant. -
The terms
$t_m$ are then summed purely inDecimalarithmetic: $$ S = \sum_{m=0}^n t_m $$ with 200 (or more) digits of precision, which preserves dozens of significant digits even when the partial sums suffer catastrophic cancellation.
This strategy ensures that while individual terms can be as large as $$
|t_m| \sim 10^{32000},
$$ the final sums $$
S_1^{(0,n)},, S_2^{(0,n)}
$$ can be accurately computed even when they are in the range
Internally, high_precision_arithmetic.py uses Python’s decimal
context to set a high, but tractable, working precision $$
\texttt{getcontext().prec} = \mathcal{O}(10^2\text{–}10^3),
$$ and then:
- All sensitive operations (log-gamma, digamma, trigamma, logarithms)
are done in
Decimal. - All large products and powers are expressed via
$\ln(\cdot)$ and only exponentiated once at the very end. - Alternating sums are accumulated directly in high precision to avoid loss of significance.
This is the stabilization backbone in the stabilization subdirectory
that makes the Morse transition dipole calculations numerically feasible
for very high overtones.
- Mass-weighted stretch coordinate: denote the (mass-weighted) normal
coordinate as
$Q$ (units: m). - Reduced mass for an A-B bond (e.g. N–H):
- Morse potential (measured from equilibrium at
$Q=0$ ):
where
-
$D_e$ is the dissociation energy (J), -
$a$ is the Morse inverse length parameter$\text{m}^{-1}$ .
-
Morse-level energy (wavenumbers,
$\tilde\nu$ in$\text{cm}^{-1}$ ): $$ \tilde E_v = \tilde\nu_e\bigl(v+\tfrac12\bigr) - \tilde\nu_e x_e\bigl(v+\tfrac12\bigr)^2 $$ where -
$\tilde\nu_e$ is the fundamental ($\text{cm}^{-1}$ ), -
$x_e$ is the anharmonicity constant (dimensionless). -
Relation between anharmonicity and Morse well depth: $$ \tilde\nu_e x_e = \frac{\tilde\nu_e^2}{4 D_e} \qquad \text{(with } D_e \text{ in cm}^{-1}\text{)} $$
Equivalently:
-
Conversion from
$D_e$ in$\text{cm}^{-1}$ to joules: $$ D_e(\mathrm{J}) ,=, D_e(\mathrm{cm^{-1}}) \times h c $$ with$h c = 1.98644586\times10^{-23}\ \mathrm{J\cdot cm}$ . -
Harmonic angular frequency (rad s$^{-1}$): $$ \omega_e ,=, 2\pi c,\tilde\nu_e $$ with
$c$ in cm s$^{-1}$ when$\tilde\nu_e$ is in$\text{cm}^{-1}$ . -
Relation to Morse parameter
$a$ (SI): $$ a ,=, \frac{\omega_e}{\sqrt{2 D_e(\mathrm{J})/\mu}}. $$ -
Dimensionless Morse parameter
$\lambda$ : $$ \lambda ,=, \frac{\sqrt{2\mu D_e(\mathrm{J})}}{a\hbar} ,=, \frac{1}{2 x_e}\quad(\text{spectroscopic shortcut}). $$
Introduce the exponential variable $$ y ,=, 2\lambda e^{-aQ}, \qquad y>0. $$
The normalized Morse eigenfunctions (in
Remarks: - Allowed
-
Expand the molecular dipole along the normal coordinate
$Q$ : $$ \mu(Q) ,=, \mu_0 + \mu'(0) Q + \tfrac12\mu''(0) Q^2 + \cdots $$ where$\mu'(0) = d\mu/dQ|_{0}$ , etc. -
Vibrational transition dipole (approximate, keeping low-order derivatives): $$ M_{i\to f} ,=, \langle\psi_i|\mu(Q)|\psi_f\rangle \approx \mu'(0)\langle\psi_i|Q|\psi_f\rangle + \tfrac12\mu''(0)\langle\psi_i|Q^2|\psi_f\rangle. $$
Define the overlap integrals $$ S_1^{(i,f)} \equiv \langle\psi_i|Q|\psi_f\rangle,\qquad S_2^{(i,f)} \equiv \langle\psi_i|Q^2|\psi_f\rangle. $$
Under
Use the associated-Laguerre expansion $$ L_n^{(\alpha)}(y) = \sum_{j=0}^{n} \frac{(-1)^j}{j!} \binom{n+\alpha}{n-j} y^j $$ (which is a finite polynomial). Multiplying two such polynomials gives a finite double sum and the integrals reduce to Gamma-function evaluations and derivatives.
Key Gamma/digamma identities used: $$
\int_0^{\infty} y^{\beta-1} e^{-y} ,dy = \Gamma(\beta),
$$ $$
\int_0^{\infty} y^{\beta-1} e^{-y} \ln y,dy = \Gamma(\beta),\psi(\beta),
$$ $$
\int_0^{\infty} y^{\beta-1} e^{-y} \ln^2 y,dy = \Gamma(\beta)\bigl[\psi(\beta)^2 + \psi^{(1)}(\beta)\bigr],
$$ where
Therefore each overlap becomes a finite sum of terms like
-
Integrated molar absorptivity in conventional units (cm M$^{-1}$) relates to the squared transition dipole via: $$ \boxed{,\int \varepsilon(\tilde\nu),d\tilde\nu ,=, 4.319\times10^{-9},|M_{i\to f}|^2,} $$ (valid when
$\tilde\nu$ is in$\text{cm}^{-1}$ and$M$ in C·m). -
For a Gaussian lineshape with FWHM
$\Delta\tilde\nu$ , the peak molar extinction is $$ \varepsilon_{\max} ,=, \frac{\int\varepsilon(\tilde\nu),d\tilde\nu}{\Delta\tilde\nu}\sqrt{\frac{4\ln2}{\pi}}. $$
- Degree = n $$ L_n^{(\alpha_n)}(y) = \sum_{m=0}^{n} (-1)^m \frac{c_m}{m!} y^m $$
$\alpha_n = 2\lambda - 2 n - 1$ - Coefficients: $$ \begin{aligned} c_0 &= \binom{n+\alpha_n}{n},\ c_1 &= \binom{n+\alpha_n}{n-1},\ \vdots \ c_n &= \frac{1}{n!} \binom{n+\alpha_n}{0} \end{aligned} $$
- Linear term: $$ S_1 = -\frac{N_0 N_n}{a^2} \sum_{m=0}^{n} (-1)^m \frac{c_m}{m!} I_m^{(1)}, \quad I_m^{(1)} = \int_0^\infty y^{2\lambda-6+m} e^{-y} (\ln y - \ln 2\lambda) dy $$
- Quadratic term: $$ S_2 = \frac{N_0 N_n}{a^3} \sum_{m=0}^{n} (-1)^m \frac{c_m}{m!} I_m^{(2)}, \quad I_m^{(2)} = \int_0^\infty y^{2\lambda-6+m} e^{-y} (\ln y - \ln 2\lambda)^2 dy $$
- Each integral can be expressed using Gamma, digamma, and trigamma functions for numerical evaluation.
- For overtone 0→n,
$\alpha_n = 2\lambda - 2 n - 1$ - The associated Laguerre polynomial expansion: $$ L_n^{(\alpha_n)}(y) = \sum_{m=0}^{n} (-1)^m c_m y^m / m! $$
- Binomial-based coefficients: $$ \begin{aligned} c_0 &= \binom{\alpha_n + n}{n},\ c_1 &= \binom{\alpha_n + n}{n-1},\ &\vdots\ c_n &= \frac{1}{n!} \binom{\alpha_n + n}{0} = \frac{1}{n!}. \end{aligned} $$
$$
I_m^{(1)} = \Gamma(2\lambda-5+m) \psi(2\lambda-5+m) - \ln(2\lambda) \Gamma(2\lambda-5+m),
$$ where
$$ S_1 = -\frac{N_0 N_n}{a^2} \sum_{m=0}^{n} (-1)^m c_m I_m^{(1)}/m!. $$ - High-precision evaluation or Stirling/log-Gamma approximations are recommended.
$$
I_m^{(2)} = \Gamma(2\lambda-5+m) \Bigl[ \psi(2\lambda-5+m)^2 + \psi^{(1)}(2\lambda-5+m) - 2 \ln 2\lambda \psi(2\lambda-5+m) + (\ln 2\lambda)^2 \Bigr],
$$ where
- Numerical evaluation uses the same approach as for S1.
Expand the dipole along the normal coordinate: $$ \mu(Q) = \mu_0 + \mu'(0) Q + \frac12 \mu''(0) Q^2 + \cdots $$
The transition dipole for 0→n is approximately: $$ M_{0\to n} \approx \mu'(0) S_1 + \frac12 \mu''(0) S_2. $$
- Linear derivative:
$\mu'(0)$ (user-assigned, typical scale 10⁻³⁰ to 10⁻²⁹ C·m/m for X–H, O–H, N–H, weaker for C–H) - Quadratic derivative:
$\mu''(0)$ (user-assigned, typically 10⁻⁴⁰ to 10⁻³⁹ C·m/m²)
$$ M_{0\to n} = \mu'(0) S_1 + \frac12 \mu''(0) S_2 $$ - S1 and S2 are obtained from Step 3 for the chosen bond and overtone.
Use the general formula for IR (or NIR) vibrational transitions: $$ \int \varepsilon(\tilde\nu) d\tilde\nu = 4.319\times10^{-9} |M_{0\to n}|^2 \quad [\mathrm{cm,M^{-1}}] $$ - Units: C·m → M·cm⁻¹ - User can adjust constants if necessary for units.
Assuming a Gaussian lineshape with FWHM
- Since IR overtones usually have extremely small molar exticntion
coefficients in general, and NIR overtones have even smaller values,
the results are scaled by a factor of
$10^{64}$ . This constant scalar multiple at the end of all calculations ensures that the results are scientifically usable, representing a relative molar absorptivity value.
The Morse solver provides two usage modes: batch mode (all parameters at once) and interactive mode (step-by-step prompts).
Provide all required parameters in a single command for automated workflows:
python3 \
--m1 12.011 \
--m2 1.008 \
--fundamental 2900.0 \
--observed 8700.0 \
--overtone 3 \
--coords "C 0.0 0.0 0.0\nH 1.1 0.0 0.0" \
--specified-spin 0 \
--bond "0,1" \
--delta 0.005 \
--basis aug-cc-pVTZ \
--fwhm 75.0Parameters: - --m1, --m2: Atomic masses (amu) for elements A and
B - --fundamental: Fundamental frequency (cm⁻¹) - --observed:
Observed overtone frequency (cm⁻¹) - --overtone: Integer overtone
number (n for 0→n transition) - --coords: Molecular geometry in XYZ
format (quoted multiline string) - --specified-spin: Spin multiplicity
(0 for singlet, 1 for doublet, etc.) - --bond: Bond atom indices as
“i,j” (0-based) - --delta: Finite difference displacement (Angstrom,
default: 0.005) - --basis: Quantum chemistry basis set (default:
aug-cc-pVTZ). Can be overridden with higher quality sets like
aug-cc-pVQZ or aug-cc-pV5Z for maximum accuracy. - --fwhm: Line width
for peak extinction (cm⁻¹, default: 75.0)
Run without parameters for guided input:
python3 run_morse_solverThe CLI will prompt for each parameter:
Morse Solver for IR (or NIR) Overtone Extinction Coefficients
Enter atomic mass of element A (amu): 12.011
Enter atomic mass of element B (amu): 1.008
Enter fundamental frequency (cm⁻¹): 2900.0
Enter observed frequency (cm⁻¹): 8700.0
Enter overtone number (integer): 3
📐 Molecular Geometry Input
Choose input method:
1. Type coordinates directly
2. Load from file
Selection: 1
Enter molecular coordinates (Element x y z format, blank line to finish):
C 0.0 0.0 0.0
H 1.1 0.0 0.0
[blank line]
Enter spin multiplicity: 0
Enter bond atom indices (i,j format): 0,1
Advanced Options (press Enter for defaults)
Finite difference step size (Å) [0.005]:
Basis set [aug-cc-pVTZ]: aug-cc-pVQZ
# Example of how the inetractive prompt handles:
Enter molecular coordinates (Element x y z format):
C 0.000000 0.000000 0.000000
H 1.100000 0.000000 0.000000
O -1.200000 0.000000 0.000000
H -1.800000 0.800000 0.000000
[blank line to finish]# Create coordinates file (e.g., molecule.xyz):
cat > molecule.xyz << EOF
C 0.000000 0.000000 0.000000
H 1.100000 0.000000 0.000000
O -1.200000 0.000000 0.000000
H -1.800000 0.800000 0.000000
EOF
# Then use in batch mode:
python3 run_morse_model.py compute --coords molecule.xyz [other parameters...]
python3 run_morse_model.py compute \
--m1 12.011 --m2 1.008 \
--fundamental 2917 --observed 8750 --overtone 3 \
--coords "C 0.0 0.0 0.0\nH 1.09 0.0 0.0\nH -0.36 1.03 0.0\nH -0.36 -0.51 0.89\nH -0.36 -0.51 -0.89" \
--specified-spin 0 --bond "0,1"python3 run_morse_model.py compute \
--m1 15.999 --m2 1.008 \
--fundamental 3657 --observed 10935 --overtone 3 \
--coords "O 0.0 0.0 0.0\nH 0.757 0.587 0.0\nH -0.757 0.587 0.0" \
--specified-spin 0 --bond "0,1"For molecules with symmetric stretching modes (the semicolon between bond axes is CRUCIAL):
python3 run_morse_model.py compute \
--dual-bonds "(0,2);(1,2)" \
--m1 12.011 --m2 15.999 \
[other parameters...]Fundamental peak ε values can also be determined with this software, if the overtone order is set to 0 and the observed frequency input is the same as the fundamental frequency:
python3 run_morse_model.py compute \
--m1 15.999 --m2 1.008 \
--fundamental 3657 --observed 3657 --overtone 0 \
--coords "O 0.0 0.0 0.0\nH 0.757 0.587 0.0\nH -0.757 0.587 0.0" \
--specified-spin 0 --bond "0,1"NOTE: ALL of the above examples are just arbitrary numbers, not actual valid data, including the hypothetical methane example. DO NOT USE THOSE DEMONSTRATION NUMBERS IN ACTUAL SCIENTIFIC RESEARCH!
The --basis flag allows you to control the quantum chemistry basis set
used for SCF calculations:
Default (Recommended): aug-cc-pVTZ - High accuracy for most
organic molecules - Good balance of precision and computational cost -
Suitable for production calculations
Higher Accuracy: aug-cc-pVQZ - Maximum precision for critical
applications - Significantly longer computation time - Recommended for
benchmarking or when highest accuracy is needed
Faster Computation: cc-pVDZ - Reduced accuracy but much faster -
Useful for testing, debugging, or large systems - Not recommended for
final results
Example with custom basis set:
python3 run_morse_model.py compute --basis aug-cc-pVQZ [other parameters...]The CLI provides detailed output including: - SCF geometry optimization results - Computed dipole derivatives - Morse model parameters - Final molar extinction coefficient