1#!/bin/sh 2 3########################################################################## 4# Shellscript: read pair styles from liggghts in files 5# Author : Josef Kerbl <josef.kerbl@dcs-computing.com> 6# Date : 2017-05-17 7# Category : LIGGGHTS Utility 8########################################################################## 9# Description 10# searches a path for liggghts files and reads the pair style 11########################################################################## 12 13PN=$(basename "$0") # Program name 14VER='0.1' 15 16Usage () { 17 echo >&2 "$PN - searches paths recursively for LIGGGHTS example input scripts (in.*), and extracts the pair styles, version $VER 18usage: $PN [-o outputfile] [-s LIGGGHTS src directory path] [-i] [-v] [-f] [-a] [paths|files] 19 -o: output filename (default: ./style_contact_model_autoExamples.whitelist) 20 -s: specify LIGGGHTS src directory path (default: ./) 21 -i: do not search recursively, look in specified files 22 -a: search recursive in all files, not only in.* 23 -f: force outfile to be overwritten 24 -v: verbose 25 26Example: 27 $PN ../examples/LIGGGHTS" 28 exit 1 29} 30 31Msg () { echo >&2 "$PN: $*"; } 32Fatal () { Msg "$@"; exit 1; } 33 34ProcessFile () 35{ 36 file="$1" 37 if [ "$verboseFlag" = "true" ]; then echo "processing $file"; fi 38 style=$(grep 'pair_style' "$file") 39 40 #read line by line 41 printf '%s\n' "$style" | while IFS= read line ; do 42 43 ### remove comments from line 44 line=$(echo "$line" | grep -o '^[^#]*') 45 line=$(echo "$line" | sed 's/"//g') 46 wStyle="GRAN_MODEL(" 47 #do checking on style 48 if [ -n "$line" ]; then 49 if [ "$verboseFlag" = "true" ]; then echo "found: $line"; fi 50 #check normal model 51 i=0 52 tmp="" 53 for model in $normal_models; do 54 55 if echo "$line" | grep -q "\b$( eval "echo \"\$normal_ident_$i\"")\b" ; then 56 tmp=${model} 57 break 58 fi 59 i=$((i + 1)) 60 done 61 if [ -n "$tmp" ]; then 62 wStyle="${wStyle}${tmp}, " 63 else 64 wStyle="${wStyle}HERTZ, " 65 fi 66 67 #check tangential model 68 i=0 69 tmp="" 70 for model in $tangential_models; do 71 if echo "$line" | grep -q "\b$( eval "echo \"\$tangential_ident_$i\"")\b" ; then 72 tmp=${model} 73 break 74 fi 75 i=$((i + 1)) 76 done 77 if [ -n "$tmp" ]; then 78 wStyle="${wStyle}${tmp}, " 79 else 80 wStyle="${wStyle}TANGENTIAL_OFF, " 81 fi 82 83 #check cohesion model 84 i=0 85 tmp="" 86 for model in $cohesion_models; do 87 if echo "$line" | grep -q "\b$( eval "echo \"\$cohesion_ident_$i\"")\b" ; then 88 tmp=${model} 89 break 90 fi 91 i=$((i + 1)) 92 done 93 if [ -n "$tmp" ]; then 94 wStyle="${wStyle}${tmp}, " 95 else 96 wStyle="${wStyle}COHESION_OFF, " 97 fi 98 99 #check rolling model 100 i=0 101 tmp="" 102 for model in $rolling_models; do 103 if echo "$line" | grep -q "\b$( eval "echo \"\$rolling_ident_$i\"")\b" ; then 104 tmp=${model} 105 break 106 fi 107 i=$((i + 1)) 108 done 109 if [ -n "$tmp" ]; then 110 wStyle="${wStyle}${tmp}, " 111 else 112 wStyle="${wStyle}ROLLING_OFF, " 113 fi 114 115 #check surface model 116 i=0 117 tmp="" 118 for model in $surface_models; do 119 if echo "$line" | grep -q "\b$( eval "echo \" \$surface_ident_$i\"")\b" ; then 120 tmp=${model} 121 break 122 fi 123 i=$((i + 1)) 124 done 125 if [ -n "$tmp" ]; then 126 wStyle="${wStyle}${tmp})" 127 else 128 wStyle="${wStyle}SURFACE_DEFAULT)" 129 fi 130 131 132 ###### check if model exists in whitelist 133 if [ -z "$(grep "${wStyle}" "$outfile")" ] ; then #"$result2" ] ; then 134 echo "$wStyle" >> "$outfile" 135 if [ "$verboseFlag" = "true" ]; then echo "extracted unique style $wStyle"; fi 136 fi 137 fi 138 done 139} 140 141#defaults 142recflag="true" 143outfile="style_contact_model_autoExamples.whitelist" 144ligSrcPath="./" 145forceFlag="false" 146verboseFlag="false" 147allFlag="false" 148 149while getopts ahifvqo:s:: opt 150do 151 case "$opt" in 152 o) outfile="$OPTARG";; 153 s) ligSrcPath="$OPTARG";; 154 i) recflag="false";; 155 f) forceFlag="true";; 156 a) allFlag="true";; 157 v) verboseFlag="true";; 158 h) Usage;; 159 \?) Usage;; 160 esac 161done 162shift $(( OPTIND - 1 )) 163 164## if no argument, show help 165if [ $# -lt 1 ] ; then 166 Usage 167fi 168 169##### DO STUFF 170tmpfile=filelist.tmp 171 172if [ -e "$outfile" ]; then 173 if [ $forceFlag = "false" ]; then 174 Fatal "outfile exists: $outfile. Run with -f to overwrite" 175 else 176 rm "$outfile" 177 fi 178fi 179touch "$outfile" 180 181if [ -e "$tmpfile" ]; then 182 if [ $forceFlag = "false" ]; then 183 Fatal "tmpfile exists: $tmpfile. Run with -f to overwrite" 184 else 185 rm "$tmpfile" 186 fi 187fi 188touch "$tmpfile" 189 190sed_ex="sed -E" # BSD sed 191sed --version | grep -i gnu > /dev/null 2>&1 192[ $? -eq 0 ] && sed_ex="sed -r" # GNU sed 193 194surface_models=$( grep -s -E '^SURFACE_MODEL' "$ligSrcPath"/surface_model_*.h | $sed_ex 's/.*SURFACE_MODEL\((.+),\s*(.+),\s*(.+)\)/\1/' ) 195normal_models=$( grep -s -E '^NORMAL_MODEL' "$ligSrcPath"/normal_model_*.h | $sed_ex 's/.*NORMAL_MODEL\((.+),\s*(.+),\s*(.+)\)/\1/' ) 196tangential_models=$(grep -s -E '^TANGENTIAL_MODEL' "$ligSrcPath"/tangential_model_*.h | $sed_ex 's/.*TANGENTIAL_MODEL\((.+),\s*(.+),\s*(.+)\)/\1/') 197cohesion_models=$(grep -s -E '^COHESION_MODEL' "$ligSrcPath"/cohesion_model_*.h | $sed_ex 's/.*COHESION_MODEL\((.+),\s*(.+),\s*(.+)\)/\1/') 198rolling_models=$(grep -s -E '^ROLLING_MODEL' "$ligSrcPath"/rolling_model_*.h | $sed_ex 's/.*ROLLING_MODEL\((.+),\s*(.+),\s*(.+)\)/\1/') 199 200surface_ident=$(grep -s -E '^SURFACE_MODEL' "$ligSrcPath"/surface_model_*.h | $sed_ex 's/.*SURFACE_MODEL\((.+),\s*(.+),\s*(.+)\)/\2/') 201normal_ident=$(grep -s -E '^NORMAL_MODEL' "$ligSrcPath"/normal_model_*.h | $sed_ex 's/.*NORMAL_MODEL\((.+),\s*(.+),\s*(.+)\)/\2/') 202tangential_ident=$(grep -s -E '^TANGENTIAL_MODEL' "$ligSrcPath"/tangential_model_*.h | $sed_ex 's/.*TANGENTIAL_MODEL\((.+),\s*(.+),\s*(.+)\)/\2/') 203cohesion_ident=$(grep -s -E '^COHESION_MODEL' "$ligSrcPath"/cohesion_model_*.h | $sed_ex 's/.*COHESION_MODEL\((.+),\s*(.+),\s*(.+)\)/\2/') 204rolling_ident=$(grep -s -E '^ROLLING_MODEL' "$ligSrcPath"/rolling_model_*.h | $sed_ex 's/.*ROLLING_MODEL\((.+),\s*(.+),\s*(.+)\)/\2/') 205 206## create pseudo arrays for access 207i=0 208for ident in $surface_ident; do 209 eval surface_ident_$i="$ident" 210 i=$((i + 1)) 211done 212 213i=0 214for ident in $normal_ident; do 215 eval normal_ident_$i="$ident" 216 i=$((i + 1)) 217done 218 219i=0 220for ident in $tangential_ident; do 221 eval tangential_ident_$i="$ident" 222 i=$((i + 1)) 223done 224 225i=0 226for ident in $cohesion_ident; do 227 eval cohesion_ident_$i="$ident" 228 i=$((i + 1)) 229done 230 231i=0 232for ident in $rolling_ident; do 233 eval rolling_ident_$i="$ident" 234 i=$((i + 1)) 235done 236 237if [ "$recflag" = "true" ] 238then 239 for path in "$@"; do 240 if [ "$allFlag" = "false" ] 241 then 242 find "$path" -name 'in.*' > "$tmpfile" 243 else 244 find "$path" -type f > "$tmpfile" 245 fi 246 247 while read line; do 248 ProcessFile "$line" 249 done < "$tmpfile" 250 done 251else 252 for file in "$@"; do 253 ProcessFile "$file" 254 done 255fi 256 257rm "$tmpfile" 258#### 259# final output 260echo "parsing of input scripts completed" 261echo "they are added to the whitelist: $outfile , only \"style_contact_model_autoExamples.whitelist\" is automatically invoked" 262