mirror of
https://github.com/triqs/dft_tools
synced 2024-12-27 14:53:39 +01:00
785 lines
22 KiB
Tcsh
Executable File
785 lines
22 KiB
Tcsh
Executable File
#!/bin/csh -f
|
|
hup
|
|
unalias rm
|
|
unalias mv
|
|
|
|
set name = $0
|
|
set bin = $name:h #directory of WIEN-executables
|
|
if !(-d $bin) set bin = .
|
|
set name = $name:t #name of this script-file
|
|
set logfile = :log
|
|
set tmp = (:$name) #temporary files
|
|
|
|
set scratch = # set directory for vectors and help files
|
|
if ($?SCRATCH) then #if envronment SCRATCH is set
|
|
set scratch=`echo $SCRATCH | sed -e 's/\/$//'`/ #set $scratch to that value
|
|
endif
|
|
|
|
|
|
|
|
#---> functions & subroutines
|
|
alias testinput 'set errin="\!:1";if (! -e \!:1 || -z \!:1) goto \!:2'
|
|
|
|
alias teststatus 'if ($status) goto error'
|
|
alias testerror 'if (! -z \!:1.error) goto error'
|
|
alias teststop 'if (\!:1 == $stopafter ) goto stop'
|
|
alias cleandayfile 'grep -v "\[" $dayfile >.tmp;'\
|
|
'mv .tmp $dayfile'
|
|
alias output 'set date = `date +"(%T)"`;'\
|
|
'printf "> %s\t%s " "\!:*" "$date" >> $dayfile'
|
|
|
|
alias exec '($bin/x \!:*) >> $dayfile;'\
|
|
'teststatus'
|
|
|
|
alias total_exec 'output \!:*;'\
|
|
'exec \!:*;'\
|
|
'cleandayfile;'\
|
|
'testerror \!:1;'\
|
|
'teststop \!:1'
|
|
alias TOTtoFOR 'sed "s/TOT/FOR/" \!:1 > $tmp;'\
|
|
'mv $tmp \!:1'
|
|
alias FORtoTOT 'sed "s/FOR/TOT/" \!:1 > $tmp;'\
|
|
'mv $tmp \!:1'
|
|
alias IPRINT_inc 'sed "s/0 NUMBER/1 NUMBER/g" \!:1 > .case.inc;'\
|
|
'mv .case.inc \!:1'
|
|
|
|
|
|
#---> default parameters
|
|
set ccut = 0.0000 #upper limit for charge convergence
|
|
set fcut = 0 #upper limit for force convergence
|
|
set ecut = 0.0001 #upper limit for energy convergence
|
|
unset ec_conv
|
|
set cc_conv
|
|
set fc_conv
|
|
set ec_test
|
|
unset ec_test1
|
|
unset cc_test
|
|
unset fc_test
|
|
set iter = 40 #maximum number of iterations
|
|
set riter = 99 #restart after $riter iterations
|
|
set stopafter #stop after $stopafter
|
|
set next #set -> start cycle with $next
|
|
set qlimit = 0.05 #set -> writes E-L in new in1 when qlimit is fulfilled
|
|
set in1new = 999
|
|
set write_all = -ef # new default: -in1ef is activated (version 10.1)
|
|
set para
|
|
set nohns
|
|
set nohns1 = 0
|
|
set it
|
|
set readHinv
|
|
set it0
|
|
unset vec2pratt
|
|
set itnum=0
|
|
set itnum1=0
|
|
set so
|
|
set complex
|
|
set complex2
|
|
set cmplx
|
|
set cmplx2
|
|
set broyd
|
|
set ctest=(0 0 0)
|
|
set etest=(0 0 0)
|
|
set msrcount=0
|
|
# QDMFT
|
|
set qdmft
|
|
set hf
|
|
set diaghf
|
|
set nonself
|
|
set noibz
|
|
set newklist
|
|
set redklist
|
|
set NSLOTS = 1
|
|
# END QDMFT
|
|
|
|
#---> default flags
|
|
unset renorm
|
|
set in1orig
|
|
unset force #set -> force-calculation after self-consistency
|
|
unset f_not_conv
|
|
unset help #set -> help output
|
|
unset init #set -> switches initially set to total energy calc.
|
|
|
|
#---> handling of input options
|
|
echo "> ($name) options: $argv" >> $logfile
|
|
alias sb 'shift; breaksw' #definition used in switch
|
|
while ($#argv)
|
|
switch ($1)
|
|
case -[H|h]:
|
|
set help; sb
|
|
case -so:
|
|
set complex2 = c
|
|
set cmplx2 = -c
|
|
set so = -so; sb
|
|
case -nohns:
|
|
set nohns = -nohns; shift; set nohns1 = $1;sb
|
|
case -it:
|
|
set itnum = 99; set it = -it; set it0 = -it; sb
|
|
case -it1:
|
|
set itnum = 99; set it = -it; set it0 = -it; touch .noHinv; sb
|
|
case -it2:
|
|
set itnum = 99; set it = -it; set it0 = -it; touch .fulldiag; sb
|
|
case -noHinv:
|
|
set itnum = 99; set it = -it; set it0 = -it; set readHinv = -noHinv; sb
|
|
case -vec2pratt:
|
|
set vec2pratt; sb
|
|
case -p:
|
|
set para = -p; sb
|
|
case -I:
|
|
set init; sb
|
|
case -NI:
|
|
unset broyd; sb
|
|
case -e:
|
|
shift; set stopafter = $1; sb
|
|
case -cc:
|
|
shift; set ccut = $1; set cc_test;unset cc_conv; sb
|
|
case -ec:
|
|
shift; set ecut = $1; set ec_test1;unset ec_conv; sb
|
|
case -fc:
|
|
shift; set f_not_conv; set fcut = $1; set fc_test;unset fc_conv; sb
|
|
case -ql:
|
|
shift; set qlimit = $1; sb
|
|
case -in1ef:
|
|
set in1new = -1;set write_all = -ef; sb
|
|
case -in1new:
|
|
shift; set in1new = $1;set write_all; sb
|
|
case -in1orig:
|
|
set in1orig = -in1orig; set in1new = 999; sb
|
|
case -renorm:
|
|
set renorm; set next=scf1; sb
|
|
case -i:
|
|
shift; set iter = $1; sb
|
|
case -r:
|
|
shift; set riter = $1; sb
|
|
case -s:
|
|
shift; set next = $1; sb
|
|
# QDMFT
|
|
case -qdmft:
|
|
set qdmft=-qdmft; shift; set NSLOTS = $1; sb
|
|
# END QDMFT
|
|
case -hf:
|
|
set hf = -hf; sb
|
|
case -diaghf:
|
|
set diaghf = -diaghf; set hf = -hf; set iter = 1; sb
|
|
case -nonself:
|
|
set nonself = -nonself; set hf = -hf; set iter = 1; sb
|
|
case -noibz:
|
|
set noibz = -noibz; sb
|
|
case -newklist:
|
|
set newklist = -newklist; set hf = -hf; sb
|
|
case -redklist:
|
|
set redklist = -redklist; set hf = -hf; sb
|
|
default:
|
|
echo "ERROR: option $1 does not exist \!"; sb
|
|
endsw
|
|
end
|
|
if ($?help) goto help
|
|
|
|
if($?cc_test) then
|
|
unset ec_test;set ec_conv
|
|
endif
|
|
if($?fc_test) then
|
|
unset ec_test;set ec_conv
|
|
endif
|
|
if($?ec_test1) then
|
|
set ec_test;unset ec_conv
|
|
endif
|
|
if(! $?ec_test) then
|
|
set ecut=0
|
|
endif
|
|
|
|
#---> path- and file-names
|
|
set file = `pwd`
|
|
set file = $file:t #tail of file-names
|
|
set dayfile = $file.dayfile #main output-file
|
|
|
|
#---> starting out
|
|
printf "\nCalculating $file in `pwd`\non `hostname` with PID $$\n" > $dayfile
|
|
echo "using `cat $WIENROOT/VERSION` in $WIENROOT" >> $dayfile
|
|
printf "\n:LABEL1: Calculations in `pwd`\n:LABEL2: on `hostname` at `date`\n" >> $file.scf
|
|
echo ":LABEL3: using `cat $WIENROOT/VERSION` in $WIENROOT" >> $file.scf
|
|
|
|
if ( "$so" == "-so" && "$hf" == "-hf") then
|
|
echo "Hartree-Fock and spin-orbit coupling not supported yet. STOP"
|
|
echo "Hartree-Fock and spin-orbit coupling not supported yet. STOP" >> $file.dayfile
|
|
exit 9
|
|
endif
|
|
|
|
if ( "$hf" == "-hf") then
|
|
if (-e $file.corewf) rm $file.corewf
|
|
IPRINT_inc $file.inc #modify IPRINT switch in case.inc
|
|
endif
|
|
|
|
#---> complex
|
|
if ((-e $file.in1c) && !(-z $file.in1c)) then
|
|
set complex = c
|
|
set complex2 = c
|
|
set cmplx = -c
|
|
set cmplx2 = -c
|
|
endif
|
|
|
|
set vresp
|
|
testinput $file.inm_vresp no_vresp
|
|
set vresp=-vresp
|
|
no_vresp:
|
|
|
|
# set iter/riter to 999 when MSR1a/MSECa is used
|
|
set testmsr=`head -1 $file.inm | grep "MSR[12]a" | cut -c1-3`
|
|
set testmsr1=`head -1 $file.inm | grep "MSECa" | cut -c1-5`
|
|
if($testmsr1 == 'MSECa') set testmsr=MSR
|
|
if ($testmsr == 'MSR') then
|
|
if($riter == "99") set riter=999
|
|
if($iter == "40") set iter=999
|
|
foreach i ($file.in2*)
|
|
TOTtoFOR $i #switch FOR-label
|
|
echo changing TOT to FOR in $i
|
|
end
|
|
if (! -e $file.inM && ! -z $file.inM ) then
|
|
x pairhess
|
|
echo $file.inM and .minrestart have been created by pairhess >>$dayfile
|
|
endif
|
|
endif
|
|
|
|
if ($next != "") goto start #start with optional program
|
|
set next = lapw0 #default start with lstart
|
|
|
|
if !(-e $file.clmsum) then
|
|
if (-e $file.clmsum_old) then
|
|
cp $file.clmsum_old $file.clmsum
|
|
else
|
|
echo 'no' $file'.clmsum(_old) file found, which is necessary for lapw0 \!'
|
|
echo 'no' $file'.clmsum(_old) file found, which is necessary for lapw0 \!'\
|
|
>>$dayfile
|
|
goto error
|
|
endif
|
|
endif
|
|
|
|
if ($?broyd) then
|
|
if (-e $file.broyd1) then
|
|
echo "$file.broyd* files present \! You did not save_lapw a previous clculation."
|
|
echo "You have 60 seconds to kill this job ( ^C or kill $$ )"
|
|
echo "or the script will rm *.broyd* and continue (use -NI to avoid automatic rm)"
|
|
sleep 60
|
|
rm *.broyd*
|
|
echo "$file.broyd* files removed \!" >> $dayfile
|
|
endif
|
|
endif
|
|
|
|
start: #initalization of in2-files
|
|
if ($?init && $testmsr != 'MSR' ) then
|
|
foreach i ($file.in2*)
|
|
sed "1s/[A-Z]..../TOT /" $i > $tmp
|
|
mv $tmp $i
|
|
end
|
|
endif
|
|
|
|
set icycle=1
|
|
|
|
set riter_save=$riter
|
|
printf "\n\n start \t(%s) " "`date`" >> $dayfile
|
|
|
|
#goto mixer only if clmval file is present
|
|
if ($next == "scf1") then
|
|
if !(-e $file.clmval) then
|
|
set next = lapw0
|
|
endif
|
|
endif
|
|
|
|
echo "with $next ($iter/$riter to go)" >> $dayfile
|
|
goto $next
|
|
|
|
|
|
cycle: #begin of sc-cycle
|
|
nohup echo in cycle $icycle " ETEST: $etest[3] CTEST: $ctest[3]"
|
|
hup
|
|
|
|
if ($it == '-it' ) then
|
|
set ittest=`echo "$icycle / $itnum * $itnum "| bc`
|
|
if ( $ittest == $icycle ) touch .fulldiag
|
|
endif
|
|
|
|
lapw0:
|
|
printf "\n cycle $icycle \t(%s) \t(%s)\n\n" "`date`" "$iter/$riter to go" >> $dayfile
|
|
|
|
testinput $file.in0_grr cont_lapw0
|
|
total_exec lapw0 -grr $para
|
|
|
|
cont_lapw0:
|
|
testinput $file.in0 error_input
|
|
total_exec lapw0 $para
|
|
|
|
if ($fcut == "0") goto lapw1
|
|
set f_exist=`grep :FHF $file.scf0`
|
|
if ($#f_exist == 0 ) then
|
|
set fcut=0
|
|
set fc_conv
|
|
echo Force-convergence not possible. Forces not present.
|
|
echo Force-convergence not possible. Forces not present.>> $dayfile
|
|
if($?ec_test) goto lapw1
|
|
if($?cc_test) goto lapw1
|
|
goto error
|
|
endif
|
|
#---> test of force-convergence for all forces
|
|
if !(-e $file.scf) goto lapw1
|
|
if(! $?ec_conv) goto lapw1
|
|
if(! $?cc_conv) goto lapw1
|
|
set natom=`head -2 $file.struct |tail -1 |cut -c28-30`
|
|
#set natom = `grep UNITCELL $file.output0 |awk '{print $NF}'`
|
|
set iatom = 1
|
|
set ftest = (1 0)
|
|
grep :FOR $file.scf >test_forces.scf
|
|
while ($iatom <= $natom) #cycle over all atoms
|
|
set itest=$iatom
|
|
@ itest ++
|
|
testinput $file.inM cont_force_test
|
|
set atest=`head -$itest $file.inM |tail -1`
|
|
set itest=`echo " $atest[1] + $atest[2] + $atest[3]"|bc`
|
|
if ( $itest == '0' ) goto skipforce
|
|
cont_force_test:
|
|
if ($iatom <= 9) then
|
|
set test = (`$bin/testconv -p :FOR00$iatom -c $fcut -f test_forces`)
|
|
else if ($iatom <= 99) then
|
|
set test = (`$bin/testconv -p :FOR0$iatom -c $fcut -f test_forces`)
|
|
else
|
|
set test = (`$bin/testconv -p :FOR$iatom -c $fcut -f test_forces`)
|
|
endif
|
|
if !($test[1]) set ftest[1] = 0
|
|
set ftest[2] = $test[2]
|
|
set ftest = ($ftest $test[3] $test[4])
|
|
skipforce:
|
|
@ iatom ++
|
|
end
|
|
rm test_forces.scf
|
|
echo ":FORCE convergence:" $ftest[1-] >> $dayfile
|
|
|
|
if ($ftest[1]) then #force convergenced
|
|
if ($nohns == '-nohns') then
|
|
set nohns
|
|
echo "NOHNS deactivated by FORCE convergence" >> $dayfile
|
|
else
|
|
# set iter = 1
|
|
if(! $?ec_conv) goto lapw1
|
|
if(! $?cc_conv) goto lapw1
|
|
set fc_conv
|
|
unset f_not_conv
|
|
foreach i ($file.in2*)
|
|
TOTtoFOR $i #switch FOR-label
|
|
end
|
|
endif
|
|
else
|
|
unset fc_conv
|
|
endif
|
|
|
|
lapw1:
|
|
testinput $file.in1$complex error_input
|
|
#generates in1-file from :EPL/EPH in case.scf2
|
|
# if ($icycle == $in1new) rm $file.broyd1 $file.broyd2
|
|
if ($icycle >= $in1new ) then
|
|
if (! -e $file.in1${complex}_orig ) cp $file.in1${complex} $file.in1${complex}_orig
|
|
write_in1_lapw $write_all -ql $qlimit $cmplx >> $dayfile
|
|
if($status == 0 ) cp $file.in1${complex}new $file.in1${complex}
|
|
endif
|
|
if($in1orig == '-in1orig') then
|
|
if ( -e $file.in1${complex}_orig ) mv $file.in1${complex}_orig $file.in1${complex}
|
|
# unset in1orig
|
|
endif
|
|
|
|
set readHinv0 = $readHinv
|
|
if (-e .noHinv) then
|
|
echo " case.storeHinv files removed"
|
|
set readHinv0 = -noHinv0
|
|
rm .noHinv
|
|
endif
|
|
if (-e .fulldiag) then
|
|
echo " full diagonalization forced"
|
|
set it0
|
|
set readHinv0
|
|
rm .fulldiag
|
|
endif
|
|
if ( $it0 == "-it" ) then
|
|
touch ${scratch}$file.vector.old
|
|
if( ! $?vec2pratt ) then
|
|
foreach i (${scratch}$file.vector*.old)
|
|
rm $i
|
|
end
|
|
vec2old_lapw $para >> $dayfile
|
|
else
|
|
vec2pratt_lapw $para >> $dayfile
|
|
endif
|
|
endif
|
|
|
|
if ( $hf == "-hf" ) then
|
|
if ((-e $file.vectorhf) && !(-z $file.vectorhf)) then
|
|
mv $file.vectorhf $file.vectorhf_old
|
|
if (!(-e $file.weighhf) || (-z $file.weighhf)) mv $file.energyhf $file.tmp_energyhf
|
|
else if ((-e $file.vectorhf_old) && !(-z $file.vectorhf_old)) then
|
|
if (!(-e $file.weighhf) || (-z $file.weighhf)) mv $file.energyhf $file.tmp_energyhf
|
|
else
|
|
cp $file.kgen_fbz $file.kgen
|
|
cp $file.klist_fbz $file.klist
|
|
total_exec lapw1 $it0 $nohns $readHinv0 $cmplx
|
|
mv $file.vector $file.vectorhf_old
|
|
mv $file.energy $file.tmp_energyhf
|
|
if (-e $file.weighhf) rm $file.weighhf
|
|
endif
|
|
cp $file.kgen_ibz $file.kgen
|
|
cp $file.klist_ibz $file.klist
|
|
if (!(-e $file.vsp_old) || (-z $file.vsp_old)) then
|
|
cp $file.vsp $file.vsp_old
|
|
endif
|
|
endif
|
|
|
|
total_exec lapw1 $it0 $para $nohns $readHinv0 $cmplx
|
|
set it0 = $it
|
|
set readHinv0 = $readHinv
|
|
|
|
lapwso:
|
|
if ( -e $file.scfso ) rm $file.scfso
|
|
if ( "$so" == "-so" ) then
|
|
testinput $file.inso error_input
|
|
total_exec lapwso $para $cmplx
|
|
endif
|
|
|
|
lapw2:
|
|
testinput $file.in2$complex2 error_input
|
|
if ( $hf == "-hf" ) then
|
|
if (!(-e $file.weighhf) || (-z $file.weighhf)) then
|
|
cp $file.kgen_fbz $file.kgen
|
|
cp $file.klist_fbz $file.klist
|
|
if (-e $file.vector) mv $file.vector $file.vector_save
|
|
mv $file.vectorhf_old $file.vector
|
|
if (-e $file.energy) mv $file.energy $file.energy_save
|
|
mv $file.tmp_energyhf $file.energy
|
|
total_exec lapw2 $vresp $in1orig $cmplx2
|
|
mv $file.weigh $file.weighhf
|
|
mv $file.vector $file.vectorhf_old
|
|
if (-e $file.vector_save) mv $file.vector_save $file.vector
|
|
mv $file.energy $file.energyhf
|
|
if (-e $file.energy_save) mv $file.energy_save $file.energy
|
|
cp $file.kgen_ibz $file.kgen
|
|
cp $file.klist_ibz $file.klist
|
|
endif
|
|
endif
|
|
#QDMFT
|
|
if ( "$qdmft" == "-qdmft" ) then
|
|
total_exec lapw2 $para $vresp -almd $cmplx2 $so
|
|
dmftproj $so # please check: $so can't be here
|
|
# pytriqs call
|
|
printf "\n> ERROR: Insert a correct call of pytriqs (with mpi wrapper, if needed) in run_triqs Wien2k script\n" >> $dayfile
|
|
printf "\n> stop\n" >> $dayfile
|
|
printf "\n> ERROR: Insert a correct call of pytriqs (with mpi wrapper, if needed) in run_triqs Wien2k script\n"
|
|
exit 0
|
|
# to call pytriqs uncomment and modify the line below to adapt it to your system
|
|
# the number of core is in NSLOTS variable
|
|
#mpprun --force-mpi=openmpi/1.3.2-i110074 /home/x_leopo/TRIQS_segment/triqs_install/bin/pytriqs $file.py
|
|
total_exec lapw2 $para $vresp -qdmft $cmplx2 $so
|
|
else
|
|
total_exec lapw2 $para $vresp $in1orig $cmplx2 $so
|
|
if ( $hf == "-hf" ) then
|
|
sed 's/:SUM/:SLSUM/g' < $file.scf2 > $file.scf2_tmp
|
|
mv $file.scf2_tmp $file.scf2
|
|
mv $file.clmval $file.clmvalsl
|
|
if ( -e $file.scfhf_1 ) rm $file.scfhf_*
|
|
endif
|
|
endif
|
|
# END QDMFT
|
|
|
|
rm -f $file.clmsc
|
|
|
|
if ( $hf == "-hf" ) goto hf
|
|
|
|
lapw1s:
|
|
testinput $file.in1${complex}s lcore
|
|
total_exec lapw1 -sc $para $nohns $readHinv $cmplx
|
|
|
|
lapw2s:
|
|
testinput $file.in2${complex2}s error_input
|
|
total_exec lapw2 -sc $para $vresp $in1orig $cmplx2
|
|
goto lcore
|
|
|
|
hf:
|
|
testinput $file.inhf error_input
|
|
if (!(-e $file.corewf) || (-z $file.corewf)) then
|
|
total_exec lcore
|
|
endif
|
|
total_exec hf $diaghf $nonself $noibz $newklist $redklist $para $cmplx
|
|
|
|
lapw2hf:
|
|
testinput $file.in2$complex2 error_input
|
|
cp $file.kgen_fbz $file.kgen
|
|
cp $file.klist_fbz $file.klist
|
|
total_exec lapw2 -hf $vresp $in1orig $cmplx2
|
|
cp $file.kgen_ibz $file.kgen
|
|
cp $file.klist_ibz $file.klist
|
|
|
|
lcore:
|
|
testinput $file.inc scf
|
|
total_exec lcore
|
|
|
|
coresuper:
|
|
if ( ! -e .lcore) goto scf
|
|
total_exec dstart -lcore
|
|
rm -f $file.clmcor
|
|
endif
|
|
|
|
scf:
|
|
if ( $hf == "-hf" ) then
|
|
foreach i ( 0 0_grr 1 so 2 1s 2s c hf 2hf )
|
|
if (-e $file.scf$i) cat $file.scf$i >> $file.scf
|
|
end
|
|
else
|
|
foreach i ( 0 1 so 2 1s 2s c )
|
|
if (-e $file.scf$i) cat $file.scf$i >> $file.scf
|
|
end
|
|
endif
|
|
scf1:
|
|
foreach i (clmsum vsp vns vrespsum )
|
|
if (-e $file.$i ) \
|
|
cp $file.$i $file.${i}_old #save last cycle
|
|
end
|
|
|
|
|
|
mixer:
|
|
testinput $file.inm error_input
|
|
total_exec mixer
|
|
cat $file.scfm >> $file.scf
|
|
|
|
if($?renorm) then
|
|
unset renorm
|
|
rm $file.broy*
|
|
endif
|
|
|
|
mixer_vresp:
|
|
testinput $file.inm_vresp energytest
|
|
total_exec mixer_vresp
|
|
grep -e "CTO " -e NEC $file.outputm_vresp | sed 's/:/:VRESP/' >> $file.scf
|
|
#total_exec int16
|
|
|
|
energytest:
|
|
#---> output energies
|
|
#set EF = `grep 'F E R' $file.scf2 |awk '{printf("%.5f", $NF)}'`
|
|
#set ET = `grep 'AL EN' $file.outputm |awk '{printf("%.5f", $NF)}'`
|
|
#cat << theend >> $dayfile
|
|
#EF $EF
|
|
#ET $ET
|
|
#theend
|
|
#echo $ET > $file.finM
|
|
|
|
#---> test of energy convergence
|
|
#if ($ecut == "0") goto chargetest
|
|
set etest = (`$bin/testconv -p :ENE -c $ecut`)
|
|
teststatus
|
|
echo ":ENERGY convergence: $etest[1-3]" >> $dayfile
|
|
if (! $?ec_test) goto chargetest
|
|
if ($etest[1]) then
|
|
if ($nohns == '-nohns') then
|
|
set nohns
|
|
echo "NOHNS deactivated by ENERGY convergence" >> $dayfile
|
|
else
|
|
# set iter = 1
|
|
set ec_conv
|
|
endif
|
|
else
|
|
unset ec_conv
|
|
endif
|
|
|
|
chargetest:
|
|
#if ($ccut == "0.0000") goto nextiter
|
|
set ctest = (`$bin/testconv -p :DIS -c $ccut`)
|
|
teststatus
|
|
echo ":CHARGE convergence: $ctest[1-3]" >> $dayfile
|
|
if (! $?cc_test) goto nextiter
|
|
if ($ctest[1]) then
|
|
if ($nohns == '-nohns') then
|
|
set nohns
|
|
echo "NOHNS deactivated by CHARGE convergence" >> $dayfile
|
|
else
|
|
# set iter = 1
|
|
set cc_conv
|
|
endif
|
|
else
|
|
unset cc_conv
|
|
endif
|
|
|
|
# check F-condition for MSR1a mode
|
|
if ($testmsr == 'MSR') then
|
|
set msrtest =(`grep :FRMS $file.scf |tail -1` )
|
|
if ($#msrtest >= 13 ) then
|
|
echo msrcount $msrcount msrtest $msrtest[13]
|
|
# Trap silly early convergene with "minimum-requests"
|
|
set etest2 = (`$bin/testconv -p :ENE -c 0.001`)
|
|
if ( $etest2[1] == '0')set msrtest[13]='F'
|
|
set ctest2 = (`$bin/testconv -p :DIS -c 0.01`)
|
|
if ( $ctest2[1] == '0')set msrtest[13]='F'
|
|
#
|
|
if ($msrtest[13] == 'T') then
|
|
#change in case.inm MSR1a/MSECa to MSR1/MSEC3, rm *.bro*, unset testmsr
|
|
@ msrcount ++
|
|
if($msrcount == 3) then
|
|
sed "1s/MSR1a/MSR1 /" $file.inm >$file.inm_tmp
|
|
sed "1s/MSECa/MSEC3/" $file.inm_tmp >$file.inm
|
|
rm *.broy* $file.inm_tmp
|
|
set a=`grep -e GREED *scfm | tail -1 | cut -c 50-55`
|
|
set b=`echo "scale=5; if( $a/2 > 0.05) $a/2 else 0.05 " |bc -l`
|
|
echo $b > .msec
|
|
echo "MSR1a/MSECa changed to MSR1/MSEC3 in $file.inm, relaxing only electrons" >> $dayfile
|
|
set testmsr
|
|
endif
|
|
else
|
|
set msrcount=0
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
#---> output forces
|
|
#grep 'FTOT' $file.outputm|awk '{print "FT ",$2,$4,$5,$6}'\
|
|
# >> $dayfile
|
|
#grep 'FTOT' $file.outputm|awk '{print $4,$5,$6}' \
|
|
# >> $file.finM
|
|
|
|
nextiter:
|
|
@ iter --
|
|
@ riter --
|
|
@ nohns1 --
|
|
@ icycle ++
|
|
|
|
if ($icycle == 2) set newklist
|
|
|
|
#---> nohns
|
|
if (! $nohns1 ) then
|
|
set nohns
|
|
echo "NOHNS deactivated" >> $dayfile
|
|
endif
|
|
|
|
#---> restart
|
|
if (! $riter && -e $file.broyd1) then
|
|
echo " restart" >> $dayfile
|
|
rm $file.broyd1 $file.broyd2
|
|
set riter=$riter_save
|
|
endif
|
|
|
|
foreach i ($tmp) #delete temporary files
|
|
if (-e $i) rm $i
|
|
end
|
|
|
|
#output cycle
|
|
#printf "%s\n\n" "$iter/$riter to go" >> $dayfile
|
|
if (-e .stop) goto stop1
|
|
if ($testmsr == 'MSR' && -e .minstop) then
|
|
sed "1s/MSR1a/MSR1 /" $file.inm >$file.inm_tmp
|
|
sed "1s/MSECa/MSEC3/" $file.inm_tmp >$file.inm
|
|
rm *.broy* $file.inm_tmp
|
|
set a=`grep -e GREED *scfm | tail -1 | cut -c 50-55`
|
|
set b=`echo "scale=5; if( $a/2 > 0.05) $a/2 else 0.05 " |bc -l`
|
|
echo $b > .msec
|
|
echo "MSR1a/MSECa changed to MSR1/MSEC3 in $file.inm, relaxing only electrons" >> $dayfile
|
|
set testmsr
|
|
endif
|
|
|
|
echo ec cc and fc_conv $?ec_conv $?cc_conv $?fc_conv
|
|
echo ec cc and fc_conv $?ec_conv $?cc_conv $?fc_conv >> $dayfile
|
|
if($?ec_conv && $?cc_conv && $?fc_conv && ($testmsr == '') ) goto stop
|
|
|
|
if ($iter) goto cycle #end of sc-cycle
|
|
|
|
if ( $?f_not_conv ) then
|
|
printf "\n> FORCES NOT CONVERGED\n" >> $dayfile
|
|
printf "\n> stop\n" >> $dayfile
|
|
printf "\n> FORCES NOT CONVERGED\n"
|
|
exit 3
|
|
endif
|
|
if ( ! $?ec_conv ) then
|
|
printf "\n> energy in SCF NOT CONVERGED\n" >> $dayfile
|
|
printf "\n> stop\n" >> $dayfile
|
|
printf "\n> energy in SCF NOT CONVERGED\n"
|
|
exit 0
|
|
endif
|
|
if ( ! $?cc_conv ) then
|
|
printf "\n> charge in SCF NOT CONVERGED\n" >> $dayfile
|
|
printf "\n> stop\n" >> $dayfile
|
|
printf "\n> charge in SCF NOT CONVERGED\n"
|
|
exit 0
|
|
endif
|
|
|
|
stop: #normal exit
|
|
printf "\n> stop\n" >> $dayfile
|
|
printf "\n> stop\n"
|
|
exit 0
|
|
|
|
stop1: #normal exit
|
|
printf "\n> stop due to .stop file\n" >> $dayfile
|
|
rm .stop
|
|
printf "\n> stop due to .stop file\n"
|
|
exit 1
|
|
|
|
error_input: #error exit
|
|
printf "\n> stop error: the required input file $errin for the next step could not be found\n" >> $dayfile
|
|
printf "\n> stop error: the required input file $errin for the next step could not be found\n"
|
|
exit 9
|
|
|
|
error: #error exit
|
|
printf "\n> stop error\n" >> $dayfile
|
|
printf "\n> stop error\n"
|
|
exit 9
|
|
|
|
help: #help exit
|
|
cat << theend
|
|
|
|
PROGRAM: $0
|
|
|
|
PURPOSE: running the nonmagnetic scf-cycle in WIEN
|
|
to be called within the case-subdirectory
|
|
has to be located in WIEN-executable directory
|
|
|
|
USAGE: $name [OPTIONS] [FLAGS]
|
|
|
|
OPTIONS:
|
|
-cc LIMIT -> charge convergence LIMIT (0.0001 e)
|
|
-ec LIMIT -> energy convergence LIMIT ($ecut Ry)
|
|
-fc LIMIT -> force convergence LIMIT (1.0 mRy/a.u.)
|
|
default is -ec 0.0001; multiple convergence tests possible
|
|
-e PROGRAM -> exit after PROGRAM ($stopafter)
|
|
-i NUMBER -> max. NUMBER ($iter) of iterations
|
|
-s PROGRAM -> start with PROGRAM ($next)
|
|
-r NUMBER -> restart after NUMBER ($riter) iterations (rm *.broyd*)
|
|
-nohns NUMBER ->do not use HNS for NUMBER iterations
|
|
-in1new N -> create "new" in1 file after N iter (write_in1 using scf2 info)
|
|
-ql LIMIT -> select LIMIT ($qlimit) as min.charge for E-L setting in new in1
|
|
-qdmft NP -> including DMFT from Aichhorn/Georges/Biermann running on NP proc
|
|
|
|
FLAGS:
|
|
-h/-H -> help
|
|
-I -> with initialization of in2-files to "TOT"
|
|
-NI -> does NOT remove case.broyd* (default: rm *.broyd* after 60 sec)
|
|
-p -> run k-points in parallel (needs .machine file [speed:name])
|
|
-it -> use iterative diagonalization
|
|
-it1 -> use iterative diag. with recreating H_inv (after basis change)
|
|
-it2 -> use iterative diag. with reinitialization (after basis change)
|
|
-noHinv -> use iterative diag. without H_inv
|
|
-vec2pratt -> use vec2pratt instead of vec2old for iterative diag.
|
|
-so -> run SCF including spin-orbit coupling
|
|
-renorm-> start with mixer and renormalize density
|
|
-in1orig-> if present, use case.in1_orig file; do not modify case.in1
|
|
-hf -> HF/hybrid-DFT calculation
|
|
-diaghf -> non-selfconsistent HF with diagonal HF only (only e_i)
|
|
-nonself -> non-selfconsistent HF/hybrid-DFT calculation (only E_x(HF))
|
|
-newklist -> HF/hybrid-DFT calculation starting from a different k-mesh
|
|
-redklist -> HF/hybrid-DFT calculation with a reduced k-mesh for the potential
|
|
|
|
CONTROL FILES:
|
|
.lcore runs core density superposition producing case.clmsc
|
|
.stop stop after SCF cycle
|
|
.minstop stops MSR1a minimization and changes to MSR1
|
|
.fulldiag force full diagonalization
|
|
.noHinv remove case.storeHinv files
|
|
case.inm_vresp activates calculation of vresp files for meta-GGAs
|
|
case.in0_grr activates a second call of lapw0 (mBJ pot., or E_xc analysis)
|
|
|
|
ENVIRONMENT VARIBLES:
|
|
SCRATCH directory where vectors and help files should go
|
|
|
|
theend
|
|
|
|
exit 1
|
|
|
|
|