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