# Example: Speed up SCF during geometry optimization¶

Generally the SCF converges more quickly when using a finite electronic temperature.

In this example it is shown (for a toy system that does not need the trick) how this can be done.

The report shows how the value of kT varies during a geometry optimization.

Download report BandAutomations.txt

We use a gradient dependent KT value (finite electronic temperature)

The value of kT gets progressively lower during the optimization

For two optimizers we do 3 steps and they do not converge. Yet the last single point should be done at KTlow=0.001

kT series for optimizer: Quasi-Newton
0.010000
0.007196
0.005094
0.002040
0.001000
0.001000
(the last kT should be 0.001)

scf converge serie for optimizer: Quasi-Newton
1.0E-03
1.0E-06
1.0E-06
1.0E-06
1.0E-06

kT series for optimizer: FIRE
0.010000
0.010000
0.010000
0.009000
0.007105
0.004077
0.001000
(the last kT should be 0.001)

scf converge serie for optimizer: FIRE
1.0E-03
1.0E-06
1.0E-06
1.0E-06
1.0E-06
1.0E-06



Download BandAutomations.run

#!/bin/bash

# the System is extremely artificial but the calculation points out something useful

# The system has two CO molecules, one of which is compressed.
# We freeze the coordinates of the compressed CO molecules

# We define a gradient dependent electronic temperature (excluding the gradient of the constrained atoms)
# When far from convergence a higher value is used to ease SCF convergence (not relevant to this system)
# When the gradients become small the temperature is lowered, so that is will have negligible influence on the energy

# Here we let on purpose not converge the geometry optimization
# The final calculation should be performed as a normal single point and we explicitly set in band the ElectronicTemperature to 0.001

report=report.txt

echo "We use a gradient dependent KT value (finite electronic temperature)" > $report printf "\nThe value of kT gets progressively lower during the optimization\n\n" >>$report

printf "\nFor two optimizers we do 3 steps and they do not converge. Yet the last single point should be done at KTlow=0.001\n\n" >> $report for optim in Quasi-Newton FIRE do export AMS_JOBNAME=test.optim=$optim

rm -rf $AMS_JOBNAME.results$AMSBIN/ams<<EOF

log
debug AutomationInteractionModule
end

Method $optim MaxIterations 5 EngineAutomations Gradient variable=Convergence%ElectronicTemperature InitialValue=0.01 FinalValue=0.001 HighGradient=0.1 LowGradient=1.0e-3 Iteration variable=Convergence%Criterion InitialValue=1.0e-3 FinalValue=1.0e-6 FirstIteration=0 LastIteration=1 Iteration variable=SCF%Iterations InitialValue=1 FinalValue=300 FirstIteration=0 LastIteration=1 End end Constraints Atom 3 Atom 4 End System Atoms C 0.0 0.0 0.0 O 1.13 0.0 0.0 C 0.0 5.0 0.0 O 1.0 5.0 0.0 End End Engine Band Basis Type=DZ Convergence ElectronicTemperature 0.001 NumBoltz 100 end NumericalQuality Basic EndEngine EOF echo "kT series for optimizer:$optim" >> $report grep "temperature kT"$AMS_JOBNAME.results/ams.log | awk '{print $NF}' >>$report
echo "(the last kT should be 0.001)" >> $report echo "">>$report
echo "">>$report echo "scf converge series for optimizer:$optim" >> $report grep "automated value for Convergence%Criterion"$AMS_JOBNAME.results/ams.log | awk '{print $NF}' >>$report
echo "">>$report tmp='.0' echo "">>$report
echo "scf max Iterations series for optimizer: $optim" >>$report
echo "  (converted to a real number to be able to catch a diff)" >> $report grep "automated value for SCF%Iterations"$AMS_JOBNAME.results/ams.log | awk '{print $NF ".0"}' >>$report
echo "">>$report done echo "begin report" cat$report