# -*-shell-script-*-
# Silicon nanowire bending (TCL)

source "scripts/Examples/Tcl/startup.tcl"
#*******************************************
# Definition of procedures
#*******************************************
proc initmd { n } {
#MD++ setnolog
MD++ setoverwrite
MD++ dirname = runs/si-nw-bend-$n
}
#end of proc initmd

proc create_nw_110 { r } { MD++ {
#--------------------------------------------
# Create Perfect Lattice Configuration
crystalstructure = diamond-cubic
latticeconst = 5.431 #(A) for Si
latticesize  = [ 1  1  0 15
                 0  0  1 30 
                 1 -1  0 10 ] # D = 5nm L = 3.0nm
makecrystal }
MD++ input  = \[ 1 2  0 0  $r  0  \]  
MD++ makecylinder
MD++ writeall = 1 zipfiles = 1 finalcnfile = "si-nw-$r.cn" writecn 
MD++ incnfile = "si-nw-$r.cn" readcn
} 
#end of proc initmd_110

proc create_nw_111 { r } { MD++ {
#--------------------------------------------
# Create Perfect Lattice Configuration
crystalstructure = diamond-cubic
latticeconst = 5.431 #(A) for Si
latticesize  = [ 1  1  1 15
                 1 -1  2 20
                 1 -1  0 10 ] # D = 5nm L = 3.7nm
makecrystal }
MD++ input  = \[ 1 2  0 0  $r  0  \]  
MD++ makecylinder
MD++ writeall = 1 zipfiles = 1 finalcnfile = "si-nw-$r.cn" writecn 
MD++ incnfile = "si-nw-$r.cn" readcn
} 
#end of proc initmd_110

#------------------------------------------------------------
proc readmeam-lammps { } { MD++ {
#Read in MEAM potential (Baskes format)
meamfile = "/home/caiwei/Codes/lammps-15Dec06/examples/meam/meamf"
nspecies = 1  element0 = "Siz" rcut = 6.0  readMEAM
NNM = 300
} }

#------------------------------------------------------------
proc readmeam { } { MD++ {
#Read in MEAM potential (MD++ format)
potfile = "/home/caiwei/Codes/MD++/potentials/MEAMDATA/meamdata.Siz" readMEAM
#xzbl = -10 xzbl0 = -9 #turn off correction
} }

#-------------------------------------------------------------
proc openwindow { } { MD++ {
# Plot Configuration
#
atomradius = 0.67 bondradius = 0.3 bondlength = 2 #2.8285 #for Si
atomcolor = orange bondcolor = red backgroundcolor = gray70 fixatomcolor = yellow
plotfreq = 100  rotateangles = [ 0 0 0 1.25 ]
openwin  alloccolors rotate saverot eval plot
} }
#end of proc openwindow

#--------------------------------------------
proc exitmd { } { MD++ quit }
#end of proc exitmd

#--------------------------------------------
proc relax_freebox { } { MD++ {
# Conjugate-Gradient relaxation
conj_ftol = 2e-6 conj_itmax = 1000 conj_fevalmax = 3000
conj_fixbox = 0  conj_fixboxvec = [ 1 1 1
                                    1 1 1
                                    1 1 0 ]
relax
} }
#end of proc relax_freebox
#--------------------------------------------
proc relax_fixbox { } { MD++ {
# Conjugate-Gradient relaxation
conj_ftol = 2e-6 conj_itmax = 1000 conj_fevalmax = 3000
conj_fixbox = 1  conj_fixboxvec = [ 0 1 1
                                    1 0 1
                                    1 1 0 ]
relax
} }
#end of proc relax_freebox

#--------------------------------------------
proc setup_md { } { MD++ {     
equilsteps = 0  timestep = 0.0001 # (ps)
atommass = 28.0855 # (g/mol)
DOUBLE_T = 0
saveprop = 1 savepropfreq = 100 openpropfile 
savecn = 1 savecnfreq = 1000 openintercnfile
plotfreq = 100
vt2 = 2e28  #1e28 2e28 5e28
wallmass = 2e3     # atommass * NP = 14380
boxdamp = 1e-3     # optimal damping for 216 atoms and wallmass 1e-3
saveH # Use current H as reference (H0), needed for specifying stress
fixboxvec  = [ 1 1 1 
               1 1 1
               1 1 0 ]
stress = [ 0 0 0
           0 0 0
           0 0 0 ]
output_fmt = "curstep EPOT KATOM Tinst HELM HELMP TSTRESS_zz P_com(0) P_com(1) P_com(2) F_com(0) F_com(1) F_com(2) Ptheta_com Torque" 
ensemble_type = "NVT" integrator_type = "VVerlet" implementation_type = 1
} }
#end of proc setup_md


    



#*******************************************
# Main program starts here
#*******************************************
# status 0:prepare liquid, 1: prepare liquid-solid interface, 2,3: measure Tm
# read in status from command line argument
if { $argc == 0 } {
 set status 0
} elseif { $argc > 0 } {
 set status [lindex $argv 0]
}
puts "status = $status"

if { $argc <= 1 } {
 set n 0
} elseif { $argc > 1 } {
 set n [lindex $argv 1]
}
puts "n = $n"

set radius  16

if { $status == 0 } {
  initmd $n
  readmeam-lammps

  MD++ allocmultiple = 2
  create_nw_110 $radius 
  #create_nw_111 $radius

  #openwindow 
  
  set Lx [ MD++_Get H_11 ]
  puts "Lx = $Lx"

  MD++ bendsim = 1 bendspec = \[ 0.02 0.1 0 $Lx \] makebendhandle
  MD++ NP0 = 4650 NIMAGES = 855 
  #MD++ addbend 
  #MD++ plot

  setup_md
  
  MD++ ensemble_type = "NVT" integrator_type = "VVerlet" implementation_type = 1
  MD++ T_OBJ = 1000 totalsteps = 10000 initvelocity run
  MD++ finalcnfile = "handle-equil.cn" writeall = 1 writecn

  relax_fixbox
  MD++ finalcnfile = "../si-nw-bend/handle-relaxed.cn" writeall = 1 writecn
#  MD++ finalcnfile = "../si-nw-bend/handle-relaxed-0.cn" writeall = 1 writecn
#  MD++ sleep
  exitmd 

} elseif { $status == 1 } {

  initmd $n
  readmeam-lammps

#  MD++ incnfile = "handle-relaxed.cn" readcn
  MD++ incnfile = "../si-nw-bend/handle-relaxed.cn" readcn
#  MD++ incnfile = "../si-nw-bend/handle-relaxed-0.cn" readcn
  openwindow 
  MD++ plot

  set Lx 1.1520890786e+02
  MD++ bendsim = 1 bendspec = \[ 0.02 0.1 0 $Lx \] NP0 = 4650 NIMAGES = 855 
      
  set datafile "Bend.dat"
  set fileID [open $datafile w ]

  for {set x 0} {$x<=5} {incr x 1} {

     if { $x > 0 } { MD++ addbend }

     MD++ eval plot 
     relax_fixbox

     set Theta  [format %.4f [MD++_Get bendspec(2)]]
     set Epot   [MD++_Get EPOT]
     set BendMoment [MD++_Get BendMoment]

     puts $fileID "$Theta $Epot $BendMoment"
     flush $fileID

     MD++ finalcnfile = Bend$x.cn writeall = 1 writecn
  }

  close $fileID
  exitmd
  
} elseif { $status == 2 } {

  initmd $n
  readmeam-lammps

  MD++ incnfile = "../si-nw-bend/bend-relaxed.cn" readcn

  set Lx 1.1520890786e+02
  MD++ bendsim = 1 bendspec = \[ 0.02 0.1 0 $Lx \] NP0 = 4650 NIMAGES = 855 

  openwindow 

  setup_md
  
  MD++ ensemble_type = "NVT" integrator_type = "VVerlet" implementation_type = 1
  MD++ T_OBJ = 300 totalsteps = 100000 initvelocity run
  MD++ sleep
  exitmd

} elseif { $status == 3 } {
  # verify Virial expression
  initmd $n
  readmeam-lammps
  MD++ NNM = 200
  set datafile "Ediff.dat"
  set fileID [open $datafile w ]
#  MD++ sw3b_multiply = 1
#  MD++ sw2b_multiply = 1
  
#  MD++ incnfile = "../si-nw-bend/bend-relaxed.cn" readcn
  MD++ incnfile = "../si-nw-bend-1/Bend5.cn" readcn

#  MD++ atomeyepath = "/home/caiwei/Codes/MD++/Tools/AtomEye" atomeyeexe = "A.i686" atomeye
  
  set Lx 1.1520890786e+02
  MD++ bendsim = 1 bendspec = \[ 0 0.1 0.1 $Lx \] NP0 = 4650 NIMAGES = 855 eval
      set Theta  [format %.4f [MD++_Get bendspec(2)]]
      set E0   [MD++_Get EPOT]
      set B0 [MD++_Get BendMoment]
  puts $fileID "$Theta $E0 $B0"  

  set delta 5e-2
  set m2delta [expr -2*$delta]
  
  MD++ bendsim = 1 bendspec = \[ $delta \] NP0 = 4650 NIMAGES = 855 addbend eval
      set Theta  [format %.4f [MD++_Get bendspec(2)]]
      set E1     [MD++_Get EPOT]
      set B1     [MD++_Get BendMoment]
  puts $fileID "$Theta $E1 $B1"
      
  MD++ incnfile = "../si-nw-bend-1/Bend5.cn" readcn  
  MD++ bendsim = 1 bendspec = \[ 0 0.1 0.1 $Lx \]
  MD++ bendsim = 1 bendspec = \[ -$delta \] NP0 = 4650 NIMAGES = 855 addbend eval
      set Theta  [format %.4f [MD++_Get bendspec(2)]]
      set E2     [MD++_Get EPOT]
      set B2     [MD++_Get BendMoment]
  puts $fileID "$Theta $E2 $B2"

  set B0 [format %20.10e [expr $B0]]
  set B1 [format %20.10e [expr $B1]]
  set B2 [format %20.10e [expr $B2]]
  set Bnum [format %20.10e [expr ($E2-$E1)/2/$delta]]
  puts $fileID "B0=$B0  Bnum=$Bnum DB=[expr $B0-$Bnum]"
  
  close $fileID
  #MD++ sleep
  exitmd
        
} else {
 
  puts "unknown status = $status"
  exitmd
}

