[d52fb5] | 1 | #!/bin/sh
|
---|
| 2 | #
|
---|
| 3 | # Performs an molecular dynamics simulation with the BOSSANOVA method
|
---|
| 4 |
|
---|
| 5 | MPIRUN="/opt/packages/mpichgm-1.2.7..15/bin/mpirun.ch_gm"
|
---|
| 6 | #MPIRUN="/usr/bin/mpirun.mpich"
|
---|
[464c6d] | 7 | exec_prefix="@prefix@"
|
---|
| 8 | MOLECUILDER="@bindir@/molecuilder"
|
---|
| 9 | JOINER="@bindir@/joiner"
|
---|
| 10 | PCP="@bindir@/pcp"
|
---|
[d52fb5] | 11 |
|
---|
| 12 | function check {
|
---|
| 13 | if [ ! $? -eq 0 ]; then
|
---|
| 14 | echo "An error occured." | tee -a dynamic.log
|
---|
| 15 | exit 1;
|
---|
| 16 | fi
|
---|
| 17 | }
|
---|
| 18 |
|
---|
| 19 | function RunSim {
|
---|
| 20 | # 1 is the config file
|
---|
| 21 | # 2 is the number of nodes
|
---|
| 22 | # 3 further command line option
|
---|
| 23 | # 4 and argument
|
---|
| 24 | # set the maximum number of nodes
|
---|
| 25 | MaxNodes=`cat $2 | awk 'END{print NR}'`
|
---|
| 26 | gamma=`grep ProcPEGamma $1 | awk -F"\t" {'print $2'}`
|
---|
| 27 | psi=`grep ProcPEPsi $1 | awk -F"\t" {'print $2'}`
|
---|
| 28 | let nodes=$gamma*$psi
|
---|
| 29 | if [ $nodes -gt $MaxNodes ]; then
|
---|
| 30 | echo "Process $1 needs too many nodes! Breaking." | tee -a dynamic.log
|
---|
| 31 | exit 1
|
---|
| 32 | fi
|
---|
| 33 | ${MPIRUN} -machinefile $2 -np $nodes ${PCP} -a 86000 $3 $4 $1 2>/dev/null >/dev/null
|
---|
| 34 | check
|
---|
| 35 | }
|
---|
| 36 |
|
---|
| 37 | function MultiRunSim {
|
---|
| 38 | # 1 is config file
|
---|
| 39 | # 2 is the number of groups
|
---|
| 40 |
|
---|
| 41 | # find the next free proc group
|
---|
| 42 | DIR=`dirname $1`
|
---|
| 43 | started=0
|
---|
| 44 | while [ $started -eq 0 ]; do
|
---|
| 45 | groupnr=1
|
---|
| 46 | while [ $groupnr -le $2 ]; do
|
---|
| 47 | if [ ! -e "${DIR}/ProcRuns${groupnr}" ]; then
|
---|
| 48 | MaxNodes=`cat ${DIR}/ProcGroup${groupnr} | awk 'END{print NR}'`
|
---|
| 49 | gamma=`grep ProcPEGamma $1 | awk -F"\t" {'print $2'}`
|
---|
| 50 | psi=`grep ProcPEPsi $1 | awk -F"\t" {'print $2'}`
|
---|
| 51 | let nodes=$gamma*$psi
|
---|
| 52 | if [ $nodes -gt $MaxNodes ]; then
|
---|
| 53 | echo "Process $1 needs too many nodes! Breaking." | tee -a dynamic.log
|
---|
| 54 | exit 1
|
---|
| 55 | fi
|
---|
| 56 | echo "touch ${DIR}/ProcRuns${groupnr}" >"${DIR}/ProcBatch${groupnr}"
|
---|
| 57 | echo "${MPIRUN} -machinefile ${DIR}/ProcGroup${groupnr} -np $nodes ${PCP} -a 86000 $1 2>/dev/null >/dev/null" >>"${DIR}/ProcBatch${groupnr}"
|
---|
| 58 | echo "rm -f ${DIR}/ProcRuns${groupnr}" >>"${DIR}/ProcBatch${groupnr}"
|
---|
| 59 | /bin/sh "${DIR}/ProcBatch${groupnr}" &
|
---|
| 60 | started=1
|
---|
| 61 | let groupnr=${2}+1
|
---|
| 62 | else
|
---|
| 63 | let groupnr=$groupnr+1
|
---|
| 64 | fi
|
---|
| 65 | done
|
---|
| 66 | # wait a few seconds
|
---|
| 67 | sleep 5
|
---|
| 68 | done
|
---|
| 69 | }
|
---|
| 70 |
|
---|
| 71 | #PBS_NODEFILE="${DIR}/machines"
|
---|
| 72 |
|
---|
| 73 | # get command line options
|
---|
| 74 | if [ -z $4 ]; then
|
---|
| 75 | echo "Usage: $0 <config file> <Order> <max. bond distance> <MaxNodes> [MaxMDsteps]"
|
---|
| 76 | echo -e "\t<config file> the pcp config file of the total molecule"
|
---|
| 77 | echo -e "\t<Order> the highest bond order (i.e. the cutoff number in ANOVA series expansion)"
|
---|
| 78 | echo -e "\t<max. bond distance> maximum distance to look for bonds (bonds are associated by element covalent radii criterion)"
|
---|
| 79 | echo -e "\t[MaxMDSteps] overrides given MaxOuterStep in config file"
|
---|
| 80 | exit 1;
|
---|
| 81 | else
|
---|
| 82 | arg=$1
|
---|
| 83 | mainname=`grep mainname $arg | awk -F"\t" {'print $2'}`
|
---|
| 84 | order=$2
|
---|
| 85 | distance=$3
|
---|
| 86 | MaxNodes=$4
|
---|
| 87 | if [ -z $5 ]; then
|
---|
| 88 | MaxSteps=`grep MaxOuterStep $arg | awk -F"\t" {'print $2'}`
|
---|
| 89 | else
|
---|
| 90 | MaxSteps=$5
|
---|
| 91 | fi
|
---|
| 92 | echo "Going to run for a total of $MaxSteps steps, bond order $order and maximum distance $distance of config file $arg with a total of $MaxNodes nodes." | tee -a dynamic.log
|
---|
| 93 | fi
|
---|
| 94 |
|
---|
| 95 |
|
---|
| 96 | # get the directory
|
---|
| 97 | DIR=`dirname $arg`
|
---|
| 98 | if [ -z "`grep $DIR $arg`" ]; then
|
---|
| 99 | echo "Cannot find the directory $DIR in the config file." | tee -a dynamic.log
|
---|
| 100 | exit 1;
|
---|
| 101 | else
|
---|
| 102 | echo "Using $DIR as directory." | tee -a dynamic.log
|
---|
| 103 | fi
|
---|
| 104 |
|
---|
| 105 |
|
---|
| 106 | # delete old processor group files
|
---|
| 107 | rm ${DIR}/ProcGroup* -f
|
---|
| 108 | rm ${DIR}/ProcRuns* -f
|
---|
| 109 | rm ${DIR}/ProcBatch* -f
|
---|
| 110 |
|
---|
| 111 | # put nodes into groups
|
---|
| 112 | gamma=`grep ProcPEGamma $arg | awk -F"\t" {'print $2'}`
|
---|
| 113 | psi=`grep ProcPEPsi $arg | awk -F"\t" {'print $2'}`
|
---|
| 114 | let nodes=$gamma*$psi
|
---|
| 115 | let divisor=$MaxNodes/$nodes
|
---|
| 116 | echo "Using $divisor processor groups." | tee -a dynamic.log
|
---|
| 117 | nodenr=0
|
---|
| 118 | groupnr=1
|
---|
| 119 | for node in `cat <$PBS_NODEFILE`; do
|
---|
| 120 | let nodenr=$nodenr+1
|
---|
| 121 | #echo "Current node $nodenr is $node." | tee -a dynamic.log
|
---|
| 122 | let currentgrouplimit=$groupnr*$nodes
|
---|
| 123 | if [ $currentgrouplimit -lt $nodenr ]; then
|
---|
| 124 | let groupnr=$groupnr+1
|
---|
| 125 | fi
|
---|
| 126 | #echo "Putting into group $groupnr." | tee -a dynamic.log
|
---|
| 127 | echo "$node" >>"${DIR}/ProcGroup${groupnr}"
|
---|
| 128 | done
|
---|
| 129 | i=0
|
---|
| 130 | while [ $i -lt $groupnr ]; do
|
---|
| 131 | let i=$i+1
|
---|
| 132 | echo "Group nr. $i" | tee -a dynamic.log
|
---|
| 133 | echo "===========" | tee -a dynamic.log
|
---|
| 134 | cat <"${DIR}/ProcGroup${i}"
|
---|
| 135 | cat <"${DIR}/ProcGroup${i}" >>dynamic.log
|
---|
| 136 | echo -e "\n" | tee -a dynamic.log
|
---|
| 137 | done
|
---|
| 138 |
|
---|
| 139 | # copy first conf
|
---|
| 140 | cp $arg ${arg}.MD
|
---|
| 141 | cp $arg ${arg}.MD.MD
|
---|
| 142 |
|
---|
| 143 | # create fake pcp.energy.all by parsing a bit of the config file
|
---|
| 144 | MaxLevel=`grep MaxLevel $arg | awk -F"\t" '{print $2'}`
|
---|
| 145 | echo -e "Time\tTotal\tKinetic\tNonLocal\tCorrelation\tExchange\tPseudo\tHartree\t-Gauss\tEwald\tIonKin\tETotal\t" >${DIR}/pcp.full.energy.all
|
---|
| 146 | j=0
|
---|
| 147 | while [ $j -lt $MaxLevel ]; do
|
---|
| 148 | let j=$j+1
|
---|
| 149 | i=0
|
---|
| 150 | while [ $i -lt 12 ]; do
|
---|
| 151 | let i=$i+1
|
---|
| 152 | printf "%e\t" 0 >>${DIR}/pcp.full.energy.all
|
---|
| 153 | done
|
---|
| 154 | echo -n -e "\n" >>${DIR}/pcp.full.energy.all
|
---|
| 155 | done
|
---|
| 156 | echo "$MaxLevel lines created in ${DIR}/pcp.full.energy.all."
|
---|
| 157 |
|
---|
| 158 | # create fake pcp.forces.all by parsing a bit of the config file
|
---|
| 159 | MaxTypes=`grep MaxTypes $arg | awk -F"\t" '{print $2'}`
|
---|
| 160 | MaxIons=0
|
---|
| 161 | i=0
|
---|
| 162 | echo -e "Type\tNo\tPos0\tPos1\tPos2\tTotal0\tTotal1\tTotal2\tLocal0\tLocal1\tLocal2\tNLocal0\tNLocal1\tNLocal2\tMagnetic0\tMagnetic1\tMagnetic2\tEwald0\tEwald1\tEwald2" >${DIR}/pcp.full.forces.all
|
---|
| 163 | while [ $i -lt $MaxTypes ]; do
|
---|
| 164 | let type=$i+1
|
---|
| 165 | j=`grep -E "^Ion_Type${type}[^_]+" $arg | awk -F"\t" '{print $2'}`
|
---|
| 166 | echo "Ion type ${type} has $j ions."
|
---|
| 167 | ionnr=0
|
---|
| 168 | while [ $ionnr -lt $j ]; do
|
---|
| 169 | echo -n -e "$i\t$ionnr\t" >>${DIR}/pcp.full.forces.all
|
---|
| 170 | k=0
|
---|
| 171 | while [ $k -lt 18 ]; do
|
---|
| 172 | printf "%e\t" 0 >>${DIR}/pcp.full.forces.all
|
---|
| 173 | let k=$k+1
|
---|
| 174 | done
|
---|
| 175 | echo -n -e "\n" >>${DIR}/pcp.full.forces.all
|
---|
| 176 | let ionnr=$ionnr+1
|
---|
| 177 | done
|
---|
| 178 | let MaxIons=$MaxIons+$j
|
---|
| 179 | let i=$i+1
|
---|
| 180 | done
|
---|
| 181 | echo -e "MeanForce:\t0." >>${DIR}/pcp.full.forces.all
|
---|
| 182 | echo "$MaxIons lines created in ${DIR}/pcp.full.forces.all."
|
---|
| 183 |
|
---|
| 184 | i=1;
|
---|
| 185 | while [ $i -le $MaxSteps ]; do
|
---|
| 186 | # break down the molecule with molecuilder
|
---|
| 187 | sed -i -e "s#MaxOuterStep.*\##MaxOuterStep\t0\t\##" $arg.MD.MD
|
---|
| 188 | echo -n "Fragmenting ... " | tee -a dynamic.log
|
---|
| 189 | PWD=`pwd`
|
---|
| 190 | cd `dirname ${MOLECUILDER}`
|
---|
| 191 | ./`basename ${MOLECUILDER}` ${arg}.MD.MD -f $distance $order A
|
---|
| 192 | check
|
---|
| 193 | cd $PWD
|
---|
| 194 | echo "done." | tee -a dynamic.log
|
---|
| 195 |
|
---|
| 196 | # get the number of digits of the fragment count
|
---|
| 197 | digits=1
|
---|
| 198 | while [ ! -e ${DIR}/BondFragment`printf "%0${digits}d" 0`.conf ]; do
|
---|
| 199 | let digits=$digits+1
|
---|
| 200 | done
|
---|
| 201 | echo "Found $digits digits for the fragment number." | tee -a dynamic.log
|
---|
| 202 |
|
---|
| 203 | # get the fragment count
|
---|
| 204 | frag=0
|
---|
| 205 | while [ -e ${DIR}/BondFragment`printf "%0${digits}d" $frag`.conf ]; do
|
---|
| 206 | # unset MaxOuterStep in config file
|
---|
| 207 | sed -i -e "s#MaxOuterStep.*\##MaxOuterStep\t0\t\##" ${DIR}/BondFragment`printf "%0${digits}d" $frag`.conf
|
---|
| 208 | mkdir -p ${DIR}/BondFragment`printf "%0${digits}d" $frag`
|
---|
| 209 | let frag=$frag+1
|
---|
| 210 | done
|
---|
| 211 | echo "There are $frag fragments." | tee -a dynamic.log
|
---|
| 212 |
|
---|
| 213 | # evaluate each fragment
|
---|
| 214 | j=0;
|
---|
| 215 | while [ $j -lt $frag ]; do
|
---|
| 216 | number=`printf "%0${digits}d" $j`
|
---|
| 217 | echo -n "Starting calculation of Fragment $number at step $i ... " | tee -a dynamic.log
|
---|
| 218 | MultiRunSim ${DIR}/BondFragment${number}.conf $divisor
|
---|
| 219 | echo "done." | tee -a dynamic.log
|
---|
| 220 | let j=$j+1
|
---|
| 221 | done
|
---|
| 222 |
|
---|
| 223 | # wait till all ProcRuns files are gone
|
---|
| 224 | echo "Waiting for all running jobs at step $i to end ... " | tee -a dynamic.log
|
---|
| 225 | while [ ! -z "`ls ${DIR}/ProcRuns*`" ]; do
|
---|
| 226 | sleep 15
|
---|
| 227 | done
|
---|
| 228 | echo "done." | tee -a dynamic.log
|
---|
| 229 |
|
---|
| 230 | # join the resulting forces into a single file
|
---|
| 231 | cp ${DIR}/pcp.full.energy.all ${DIR}/pcp.energy.all
|
---|
| 232 | cp ${DIR}/pcp.full.forces.all ${DIR}/pcp.forces.all
|
---|
| 233 | echo -n "Joining fragment energies ... " | tee -a dynamic.log
|
---|
| 234 | ${JOINER} ${DIR}/ $mainname >/dev/null 2>/dev/null
|
---|
| 235 | check
|
---|
| 236 | echo "done." | tee -a dynamic.log
|
---|
| 237 |
|
---|
| 238 | # move the ions by calling pcp with this force file
|
---|
| 239 | sed -e "s#MaxOuterStep.*\##MaxOuterStep\t$i\t\##" ${arg}.MD.MD >${arg}.MD
|
---|
| 240 | echo -n "Moving ions with obtained forces at step $i ... " | tee -a dynamic.log
|
---|
| 241 | RunSim ${arg}.MD $PBS_NODEFILE -F "${DIR}/pcp.Order${order}.forces.all"
|
---|
| 242 | echo "done" | tee -a dynamic.log
|
---|
| 243 |
|
---|
| 244 | # last of all, put "joined" energy and forces under this step
|
---|
| 245 | cp ${DIR}/pcp.Order${order}.energy.all ${DIR}/pcp.step${i}.energy.all
|
---|
| 246 | cp ${DIR}/pcp.Order${order}.forces.all ${DIR}/pcp.step${i}.forces.all
|
---|
| 247 |
|
---|
| 248 | # next step
|
---|
| 249 | let i=$i+1
|
---|
| 250 | done
|
---|
| 251 |
|
---|
| 252 | # draw densities of each step
|
---|
| 253 | sed -e "s#DoOutVis.*\##DoOutVis\t2\t\##" ${arg}.MD.MD >${arg}.MD
|
---|
| 254 | echo -n "Calling simulation to draw final densities of all steps ... " | tee -a dynamic.log
|
---|
| 255 | RunSim ${arg}.MD $PBS_NODEFILE
|
---|
| 256 | echo "done." | tee -a dynamic.log
|
---|
| 257 |
|
---|
| 258 | exit 0
|
---|