Using a different Optimization.jl compatible solver

In this example we perform the simplistic optimisation the bond length of a Hydrogen molecule using a trust region quasi-Newton method from NLopt.

We create a calculator employing the density-functional toolkit to compute energies and forces at using the LDA density functional.

using DFTK
using PseudoPotentialData

pseudopotentials = PseudoFamily("dojo.nc.sr.lda.v0_4_1.oncvpsp3.standard.upf")
model_kwargs = (; functionals=LDA(), pseudopotentials)
basis_kwargs = (; kgrid=(1, 1, 1), Ecut=20.0)
calc = DFTKCalculator(; model_kwargs, basis_kwargs)
DFTKCalculator(functionals=Xc(lda_x, lda_c_pw), pseudopotentials=PseudoFamily("dojo.nc.sr.lda.v0_4_1.standard.upf"), Ecut=20.0, kgrid=(1, 1, 1))

and we build the hydrogen molecular system, where we attach pseudopotential information for DFTK:

using AtomsBuilder
using Unitful
using UnitfulAtomic

bounding_box = [[10.0, 0.0, 0.0], [0.0, 10.0, 0.0], [0.0, 0.0, 10.0]]u"Å"
system = periodic_system([:H => [0, 0, 1.]u"bohr",
                          :H => [0, 0, 3.]u"bohr"],
                         bounding_box)
nothing

We now run GeometryOptimization.minimize_energy!, but notably pass the NLopt.LD_TNEWTON solver from NLopt as the third argument to employ this solver. Extra keyword argument to NLopt can be added, e.g. here the maxevel=100, which limits the solver to 100 function evaluations:

using GeometryOptimization
using OptimizationNLopt
solver = NLopt.LD_TNEWTON()

results = minimize_energy!(system, calc, solver;
                           tol_forces=1e-4u"eV/Å", verbosity=1,
                           maxeval=100)
nothing
Geometry optimisation convergence (in atomic units)
┌─────┬─────────────────┬───────────┬────────────┬────────┐
│   n │          Energy │ log10(ΔE) │ max(Force) │  Δtime │
├─────┼─────────────────┼───────────┼────────────┼────────┤
│   0 │ -1.105713124409 │           │  0.0820222 │  22.6s │
Geometry optimisation convergence (in atomic units)
┌─────┬─────────────────┬───────────┬────────────┬────────┐
│   n │          Energy │ log10(ΔE) │ max(Force) │  Δtime │
├─────┼─────────────────┼───────────┼────────────┼────────┤
│   0 │ -1.105713128077 │           │  0.0820221 │  28.6s │
Geometry optimisation convergence (in atomic units)
┌─────┬─────────────────┬───────────┬────────────┬────────┐
│   n │          Energy │ log10(ΔE) │ max(Force) │  Δtime │
├─────┼─────────────────┼───────────┼────────────┼────────┤
│   0 │ -1.105713126009 │           │  0.0820222 │  34.5s │
Geometry optimisation convergence (in atomic units)
┌─────┬─────────────────┬───────────┬────────────┬────────┐
│   n │          Energy │ log10(ΔE) │ max(Force) │  Δtime │
├─────┼─────────────────┼───────────┼────────────┼────────┤
│   0 │ -1.105713123568 │           │  0.0820222 │  40.4s │
Geometry optimisation convergence (in atomic units)
┌─────┬─────────────────┬───────────┬────────────┬────────┐
│   n │          Energy │ log10(ΔE) │ max(Force) │  Δtime │
├─────┼─────────────────┼───────────┼────────────┼────────┤
│   0 │ -1.114391636908 │           │  0.0763904 │  52.4s │
Geometry optimisation convergence (in atomic units)
┌─────┬─────────────────┬───────────┬────────────┬────────┐
│   n │          Energy │ log10(ΔE) │ max(Force) │  Δtime │
├─────┼─────────────────┼───────────┼────────────┼────────┤
│   0 │ -1.114391640324 │           │  0.0763904 │  58.4s │
Geometry optimisation convergence (in atomic units)
┌─────┬─────────────────┬───────────┬────────────┬────────┐
│   n │          Energy │ log10(ΔE) │ max(Force) │  Δtime │
├─────┼─────────────────┼───────────┼────────────┼────────┤
│   0 │ -0.731159565481 │           │    1.86946 │  68.3s │
Geometry optimisation convergence (in atomic units)
┌─────┬─────────────────┬───────────┬────────────┬────────┐
│   n │          Energy │ log10(ΔE) │ max(Force) │  Δtime │
├─────┼─────────────────┼───────────┼────────────┼────────┤
│   0 │ -1.126970225193 │           │  0.0923657 │  80.3s │
Geometry optimisation convergence (in atomic units)
┌─────┬─────────────────┬───────────┬────────────┬────────┐
│   n │          Energy │ log10(ΔE) │ max(Force) │  Δtime │
├─────┼─────────────────┼───────────┼────────────┼────────┤
│   0 │ -1.126970229324 │           │  0.0923657 │  86.3s │
Geometry optimisation convergence (in atomic units)
┌─────┬─────────────────┬───────────┬────────────┬────────┐
│   n │          Energy │ log10(ΔE) │ max(Force) │  Δtime │
├─────┼─────────────────┼───────────┼────────────┼────────┤
│   0 │ -1.134864470420 │           │   0.017646 │  95.4s │
Geometry optimisation convergence (in atomic units)
┌─────┬─────────────────┬───────────┬────────────┬────────┐
│   n │          Energy │ log10(ΔE) │ max(Force) │  Δtime │
├─────┼─────────────────┼───────────┼────────────┼────────┤
│   0 │ -1.134864471209 │           │   0.017646 │   101s │
Geometry optimisation convergence (in atomic units)
┌─────┬─────────────────┬───────────┬────────────┬────────┐
│   n │          Energy │ log10(ΔE) │ max(Force) │  Δtime │
├─────┼─────────────────┼───────────┼────────────┼────────┤
│   0 │ -1.135282887095 │           │ 0.00190393 │   110s │
Geometry optimisation convergence (in atomic units)
┌─────┬─────────────────┬───────────┬────────────┬────────┐
│   n │          Energy │ log10(ΔE) │ max(Force) │  Δtime │
├─────┼─────────────────┼───────────┼────────────┼────────┤
│   0 │ -1.135282887180 │           │ 0.00190391 │   116s │
Geometry optimisation convergence (in atomic units)
┌─────┬─────────────────┬───────────┬────────────┬────────┐
│   n │          Energy │ log10(ΔE) │ max(Force) │  Δtime │
├─────┼─────────────────┼───────────┼────────────┼────────┤
│   0 │ -1.135288289262 │           │ 7.66662e-6 │   125s │
Geometry optimisation convergence (in atomic units)
┌─────┬─────────────────┬───────────┬────────────┬────────┐
│   n │          Energy │ log10(ΔE) │ max(Force) │  Δtime │
├─────┼─────────────────┼───────────┼────────────┼────────┤
│   0 │ -1.135288289262 │           │ 7.65058e-6 │   130s │
Geometry optimisation convergence (in atomic units)
┌─────┬─────────────────┬───────────┬────────────┬────────┐
│   n │          Energy │ log10(ΔE) │ max(Force) │  Δtime │
├─────┼─────────────────┼───────────┼────────────┼────────┤
│   0 │ -1.135288289262 │           │  7.6648e-6 │   136s │
Geometry optimisation convergence (in atomic units)
┌─────┬─────────────────┬───────────┬────────────┬────────┐
│   n │          Energy │ log10(ΔE) │ max(Force) │  Δtime │
├─────┼─────────────────┼───────────┼────────────┼────────┤
│   0 │ -1.135288289262 │           │ 7.66663e-6 │   142s │
Geometry optimisation convergence (in atomic units)
┌─────┬─────────────────┬───────────┬────────────┬────────┐
│   n │          Energy │ log10(ΔE) │ max(Force) │  Δtime │
├─────┼─────────────────┼───────────┼────────────┼────────┤
│   0 │ -1.135288289453 │           │ 9.50209e-7 │   150s │
┌ Warning: NLopt failed to converge: FORCED_STOP
@ OptimizationNLopt ~/.julia/packages/OptimizationNLopt/LsFvb/src/OptimizationNLopt.jl:209

The final hydrogen bond length is:

using LinearAlgebra
norm(position(results.system[1]) - position(results.system[2]))
1.4524717268870435 a₀