#!/bin/sh #------------------------------------------------------------------------------ # ========= | # \\ / F ield | OpenFOAM: The Open Source CFD Toolbox # \\ / O peration | # \\ / A nd | www.openfoam.com # \\/ M anipulation | #------------------------------------------------------------------------------- # Copyright (C) 2015-2017 OpenFOAM Foundation # Copyright (C) 2020 OpenCFD Ltd. #------------------------------------------------------------------------------ # License # This file is part of OpenFOAM, distributed under GPL-3.0-or-later. # # Script # foamNewBC # # Description # Create directory of source and compilation files for a new BC # #------------------------------------------------------------------------------ Script=${0##*/} DIR="$WM_PROJECT_DIR/etc/codeTemplates/BC" usage() { while [ "$#" -ge 1 ]; do echo "$1"; shift; done cat< * Create directory of source and compilation files for a new boundary condition (dir) - .C and .H source files - Make (dir) - files - options Compiles a library named lib.so in \$FOAM_USER_LIBBIN: $FOAM_USER_LIBBIN conditions: -f | -fixedValue | fixedValue -m | -mixed | mixed options: -a | -all | all | template (creates a template class) -s | -scalar | scalar -v | -vector | vector -t | -tensor | tensor -symmTensor | symmTensor -sphericalTensor | sphericalTensor USAGE exit 1 } cap() { echo $1 | sed -e 's/^./\U&/' } # Implicitly covers a lone -help [ "$#" -gt 1 ] || usage case "$1" in (-h | -help*) usage ;; (-f | -fixedValue | fixedValue) BASE=fixedValue ;; (-m | -mixed | mixed ) BASE=mixed ;; (*) usage "Unknown condition '$1'" ;; esac shift case "$1" in (-a | -all | all | template) TYPE=Type UNIT='VALUE-or-(VALUE 0 0)' ;; (-s | -scalar | scalar) TYPE=scalar UNIT=VALUE ;; (-v | -vector | vector) TYPE=vector UNIT='(VALUE 0 0)' ;; (-t | -tensor | tensor) TYPE=tensor UNIT='(VALUE 0 0 0 0 0 0 0 0)' ;; (-symmTensor | symmTensor) TYPE=symmTensor UNIT='(VALUE 0 0 0 0 0)' ;; (-sphericalTensor | sphericalTensor) TYPE=sphericalTensor UNIT=VALUE ;; (*) usage "Unknown option '$1'" ;; esac shift [ "$#" -eq 1 ] || usage "Wrong number of arguments" NAME=$1 # Prevents over-writing of existing directory [ -d $NAME ] && usage "$NAME directory already exists, aborting..." echo "Creating $NAME directory" && mkdir $NAME # Establish meta template files to copy FILES=$(cd ${DIR} && ls *.*) [ "$TYPE" = "Type" ] || FILES=$(cd ${DIR} && ls BC.[CH]) # Substitutions for meta-template files FIELD="Field<${TYPE}>" [ "$TYPE" = "Type" ] || FIELD=${TYPE}Field FVPATCHF=fvPatch$(cap $FIELD) CLASS=$NAME$(cap $FVPATCHF) PARENT=$BASE$(cap $FVPATCHF) CONSTRUCT=$(echo $CLASS | sed 's///g') YEAR=$(date +%Y) # Create some example values for the Description n=0 for N in $(echo "ZERO ONE TWO THREE FOUR") do eval $(expr $N='$(echo $UNIT | sed "s#VALUE#$n#g")') n=$(( $n + 1 )) done # Make substitutions to meta-template files for F in $FILES do EXT=$(echo $F | sed "s#BC##") NEWFILE=${CONSTRUCT}${EXT} echo " Adding file ${NEWFILE}..." # Adds readScalar function when TYPE = scalar sed -e "s#TYPE#${TYPE}#g" \ -e "s#NAME#${NAME}#g" \ -e "s#BASE#${BASE}#g" \ -e "s#CONSTRUCT#${CONSTRUCT}#g" \ -e "s#YEAR#${YEAR}#g" \ -e "s#CLASS#${CLASS}#g" \ -e "s#FIELD#${FIELD}#g" \ -e "s#FVPATCHF#${FVPATCHF}#g" \ -e "s#PARENT#${PARENT}#g" \ -e "s#ZERO#${ZERO}#g" \ -e "s#ONE#${ONE}#g" \ -e "s#TWO#${TWO}#g" \ -e "s#THREE#${THREE}#g" \ -e "s#FOUR#${FOUR}#g" \ -e 's/>>/>>/g' \ ${DIR}/${F} > ${NAME}/${NEWFILE} case $BASE in fixedValue) # refValue(), refGrad(), valueFraction() removed # phip removed sed -i \ -e '/refValue/d' \ -e '/refGrad/d' \ -e '/valueFraction/d' \ -e '/const scalarField\& phip/,/);/d' \ ${NAME}/${NEWFILE} ;; mixed) # evaluate() removed # operator== becomes refValue() = sed -i \ -e '/evaluate/d' \ -e 's/operator==/refValue() =/g' \ ${NAME}/${NEWFILE} ;; esac case $TYPE in Type) # Build Macro removed (in ..Fields.C) sed -i -e '/Build Macro/,/^}/d' \ ${NAME}/${NEWFILE} ;; *) # template removed # this-> removed # .template functionTemplate<...> becomes functionTemplate<...> # template instantiation repository removed sed -i \ -e '/^template$/d' \ -e 's/this->//g' \ -e 's/\.template[\t ]*\([A-Za-z]\)/\.\1/g' \ -e '/#ifdef NoRepository/,/\/\/ */d' \ ${NAME}/${NEWFILE} ;; esac done echo "Creating Make subdirectory" && cp -r ${DIR}/Make ${NAME} COMPILED=$(cd ${NAME} && ls -r1 *C | head -1) # ...Fields.C for template class sed -i -e "s#NAME#${NAME}#g" -e "s#COMPILED.*#${COMPILED}#g" ${NAME}/Make/files #------------------------------------------------------------------------------