TABLE OF CONTENTS


::pwtk::neb_refine_exe_

SYNOPSIS

proc ::pwtk::neb_refine_exe_ {} {

    # mandatory variables: firstImage lastImage new_prefix num_of_images
    
    uplevel 1 {
        # previous-NEB: E*(->) and E*(<-) in eV
    
        set Eact_fwd [expr $::pwtk::ha2ev*($E($iTS) - $E(1))]
        set Eact_bck [expr $::pwtk::ha2ev*($E($iTS) - $E($nImages))]

        ifset nebi -
        print "Data from the previous neb.x calculation:

  previous-NEB input file:  $nebi
  previous-NEB path file :  $pathFile
  previous-NEB crd file  :  $crdFile

image        energy (eV)
"
        for {set i 1} {$i <= $nImages} {incr i} {
            print [format "%5i    %15.6f" $i [expr $::pwtk::ha2ev*$E($i)]]
        }
        print "
climbing image = $iTS

previous-NEB activation energy (->) = [format %7.3f $Eact_fwd] eV
previous-NEB activation energy (<-) = [format %7.3f $Eact_bck] eV

Data for the refinement neb.x calculation:

  index of the previous-NEB TS image:  $iTS
  image range of the previous-NEB MEP that will be refined:  \[$firstImage, $lastImage]
  number of images for the new neb.x:  $num_of_images"        
        ifnotempty opt(CI_scheme) { print "  CI_scheme for the new neb.x:         $opt(CI_scheme)" }
        ifnotempty opt(CI_thr)    { print "  path_thr  for the new neb.x:         $opt(CI_thr)" }        
        puts ""
        
        # check image indices
        if { ! [::pwtk::type::number posint -strict $firstImage] } { ::pwtk::error "expected positive integer for 'firstImage', but got $firstImage" 1 }
        if { ! [::pwtk::type::number posint -strict $lastImage] } { ::pwtk::error "expected positive integer for 'lastImage', but got $lastImage" 1 }
        if { ! [::pwtk::type::number posint -strict $num_of_images] } { ::pwtk::error "expected positive integer for 'num_of_images', but got $num_of_images" 1 }        
        if { ($lastImage < 2 || $lastImage > $nImages) } { ::pwtk "wrong index for the last image ($lastImage)" 1 }
        if { ($lastImage - $firstImage < 1) || ($firstImage < 1) } { ::pwtk::error "wrong index for the first image (firstImage=$firstImage, lastImage=$lastImage)" 1 }
        if { $num_of_images - ($lastImage - $firstImage) < 1 } { :
            :pwtk::error "specified 'num_of_images = $num_of_images' is too small, must be > [expr $lastImage - $firstImage]" 1
        }

        #
        # get positions of images
        #

        # first l treatment because it has if_pos(:) records
        
        set positions "
FIRST_IMAGE
[::pwtk::nebi::getImageAtmPos -k -if_pos $firstImage]
[::pwtk::nebi::getImageCharge -k $firstImage]
"

        # intermediate images

        for {set i [expr $firstImage+1]} {$i<$lastImage} {incr i} {
            append positions "
INTERMEDIATE_IMAGE    
[::pwtk::nebi::getImage $i]
"
        }

        # last image
        
        append positions "
LAST_IMAGE
[::pwtk::nebi::getImage $lastImage]
"

        # load positions
    
        POSITIONS $positions

        # adapt the input variables

        outdir_prefix [outdir]
        outdir_postfix $new_prefix
    
        PATH [subst {
            num_of_images = $num_of_images
            first_last_opt = .false.
        }]
        if { $opt(CI_thr) ne {} } {
            PATH " path_thr = $opt(CI_thr) "
        }
        CONTROL " prefix = '$new_prefix' "

        if { $opt(CI_scheme) ne {} } {
            PATH " CI_scheme = [squote $opt(CI_scheme)] "
        }

        print "NEB input for the new neb.x:\n\n[::pwtk::input::namelistGet PATH]"
        
        if { $opt(CI) ne {} } {
            CLIMBING_IMAGES $opt(CI)
            print [::pwtk::input::namelistPrint CLIMBING_IMAGES]
        }

        

        
        # run the neb.x calculation

        set CI_scheme [::pwtk::input::namelistGetVarValue PATH CI_scheme trim]
        ifset CI_scheme no-CI
        runNEB neb.$new_prefix.$CI_scheme

        # final printout of energies
        
        array set new [::pwtk::path::energies $new_prefix.path]
        set newE(TS) $new(Emax)
         # BEWARE: energies in the path file are in Hartrees
        set Eact_fwd [expr $::pwtk::ha2ev*($newE(TS) - $E(1))]
        set Eact_bck [expr $::pwtk::ha2ev*($newE(TS) - $E($nImages))]
        
        print "Data from the new refined neb.x calculation:

  new neb.x input  file:  neb.$new_prefix.$CI_scheme.in
  new neb.x output file:  neb.$new_prefix.$CI_scheme.out

image        energy (eV)
"
        for {set i 1} {$i <= $num_of_images} {incr i} {
            set key E($i)
            print [format "%5i    %15.6f" $i [expr $::pwtk::ha2ev*$new($key)]]
        }
        print "
climbing image = $new(iTS)

  previous_E(IS) = [format %7.3f [expr $::pwtk::ha2ev*$E(1)]] eV
  new_E(TS)      = [format %7.3f [expr $::pwtk::ha2ev*$new(Emax)]] eV
  previous_E(FS) = [format %7.3f [expr $::pwtk::ha2ev*$E($nImages)]] eV

new activation energy (->) = new_E(TS) - previous_E(IS) = [format %7.3f $Eact_fwd] eV
new activation energy (<-) = new_E(TS) - previous_E(FS) = [format %7.3f $Eact_bck] eV

merging previous and new NEB files...
"
        # merge src & new NEB dat, int, crd, and axsf files
        
        foreach {type name} [::pwtk::neb_refine_merge $src_prefix $new_prefix $firstImage $lastImage] {
            ::pwtk::print "  merged [format %-4s [string toupper $type]] file written to:  $name"
        }
        puts ""
        
        return neb.$new_prefix.$CI_scheme.out
    }
}