#!/usr/bin/env bash # # Generates a bond table file by using the python script compute_pair_bondlength.py # on a given pair of elements # get options test ! -z "$3" || { echo "Usage: $0 -H -p -o [-b ]"; exit 255; } POSITIONAL_ARGS=() while [[ $# -gt 0 ]]; do case $1 in -H|--server-address) SERVER_ADDRESS="$2" shift # past argument shift # past value ;; -p|--server-port) SERVER_PORT="$2" shift # past argument shift # past value ;; -o|--output-file) BONDTABLEFILE="$2" shift # past argument shift # past value ;; -b|--basis-set) BASISSET_CMD="$2" shift # past argument shift # past value ;; --default) DEFAULT=YES shift # past argument ;; -*|--*) echo "Unknown option $1" exit 1 ;; *) POSITIONAL_ARGS+=("$1") # save positional arg shift # past argument ;; esac done # default values for command-line options BASISSET="${BASISSET_CMD:-6-31G}" # constants DIR=`dirname $0` PREFIX="bondtable-$(date "+%Y-%m-%d_%H-%M-%S").csv" JOBS="8" FOLDER="computation" # state options echo "Using server at $SERVER_ADDRESS:$SERVER_PORT." echo "Using $BASISSET as basis set." echo "Output bond table to $BONDTABLEFILE." # array of elements: without noble gases (and metals that take longer to compute) elements=("H" "Li" "Be" "B" "C" "N" "O" "F" "Na" "Mg" "Al" "Si" "P" "S" "Cl" "K" "Ca") ### generate pairs and fill string element_pairs="" for ((i=0;i<${#elements[*]};i++)); do elem1="${elements[$i]}" for ((j=i;j<${#elements[*]};j++)); do elem2="${elements[$j]}" if test -z "$element_pairs"; then element_pairs="$elem1\n$elem2" else element_pairs="${element_pairs}\n$elem1\n$elem2" fi done done ### go through all ordered pairs using gnu parallel echo -e $element_pairs | \ parallel \ -P $JOBS \ --nice 10 \ -N 2 \ --silent \ --results "$FOLDER" \ ./"$DIR"/compute_pair_bondlength \ --server-address "$SERVER_ADDRESS" \ --server-port "$SERVER_PORT" \ --output-prefix "$PREFIX" \ --basis-set "$BASISSET" \ --elements {} >/dev/null ### analyse distances from log files and create bond table file rm -f "$BONDTABLEFILE" for ((i=0;i<${#elements[*]};i++)); do echo -n -e "\t\"${elements[$i]}\"" >>"$BONDTABLEFILE" done echo -e -n "\n" >>"$BONDTABLEFILE" for ((i=0;i<${#elements[*]};i++)); do elem1="${elements[$i]}" echo -n -e "\"$elem1\"" >>"$BONDTABLEFILE" for ((j=0;j<${#elements[*]};j++)); do elem2="${elements[$j]}" LOGFILENAME="$FOLDER/1/$elem1/1/$elem2/stdout" if test ! -f "$LOGFILENAME"; then LOGFILENAME="$FOLDER/1/$elem2/1/$elem1/stdout" fi distance=$(grep "DISTANCE:" "$LOGFILENAME" | sed -e "s#DISTANCE:\s*[A-Za-z]\+\s\+[A-Za-z]\+:\s*\(.*\)#\1#" | awk '{print int($1*100)/100}') if test $? != 0; then distance="-1" fi echo -e -n "\t$distance" >>"$BONDTABLEFILE" done echo -e -n "\n" >>"$BONDTABLEFILE" done