@@ -11,10 +11,12 @@ produces output as well.
1111struct GeoOptDefaultCallback
1212 verbosity:: Int
1313 always_show_header:: Bool
14+ show_virial:: Bool
1415 prev_time:: Ref{UInt64}
1516end
16- function GeoOptDefaultCallback (verbosity= 1 ; always_show_header= verbosity > 1 )
17- GeoOptDefaultCallback (verbosity, always_show_header, Ref {UInt64} (0 ))
17+ function GeoOptDefaultCallback (verbosity= 1 ;
18+ show_virial= true , always_show_header= verbosity > 1 )
19+ GeoOptDefaultCallback (verbosity, always_show_header, show_virial, Ref {UInt64} (0 ))
1820end
1921
2022format_log8 (value) = (value < 0 ? " " : " +" ) * (@sprintf " %8.2f" log10 (abs (value)))
@@ -29,7 +31,11 @@ function (cb::GeoOptDefaultCallback)(optim_state, geoopt_state)
2931 cb. prev_time[] = runtime_ns
3032
3133 Estr = (@sprintf " %+15.12f" round (austrip (geoopt_state. energy), sigdigits= 13 ))[1 : 15 ]
32- logΔE = optim_state. iter < 1 ? " " : format_log8 (austrip (geoopt_state. energy_change))
34+ if iszero (geoopt_state. energy_change) && optim_state. iter < 1
35+ logΔE = " "
36+ else
37+ logΔE = format_log8 (austrip (geoopt_state. energy_change))
38+ end
3339
3440 maxforce = austrip (maximum (norm, geoopt_state. forces))
3541 fstr = iszero (maxforce) ? " " : round (maxforce, sigdigits= 8 )
@@ -38,13 +44,20 @@ function (cb::GeoOptDefaultCallback)(optim_state, geoopt_state)
3844 (" n" , 3 , optim_state. iter),
3945 (" Energy" , 15 , Estr),
4046 (" log10(ΔE)" , 9 , logΔE),
41- (" max(Force)" , 10 , fstr),
47+ (" max(Force)" , 11 , fstr),
4248 # TODO Maximal atomic displacement
43- # TODO Current virial, trace of lattice deformation matrix
44- (" Δtime" , 6 , tstr),
45- # TODO Would be nice to have some simple way to add in
46- # a few calculator-specific things (e.g. total number of SCF iterations)
4749 ]
50+ if cb. show_virial
51+ maxvirial = austrip (maximum (abs, geoopt_state. virial))
52+ pressure = - austrip (tr (geoopt_state. virial)) / 3
53+ vstr = iszero (maxvirial) ? " " : round (maxvirial, sigdigits= 8 )
54+ pstr = iszero (pressure) ? " " : round (pressure, sigdigits= 2 )
55+ push! (fields, (" max(Virial)" , 11 , vstr))
56+ push! (fields, (" Pressure" , 8 , pstr))
57+ end
58+ push! (fields, (" Δtime" , 6 , tstr))
59+ # TODO Would be nice to have some simple way to add in
60+ # a few calculator-specific things (e.g. total number of SCF iterations)
4861
4962 if cb. always_show_header
5063 hlines = :all
0 commit comments