View Issue Details

IDProjectCategoryView StatusLast Update
0001655OpenFOAMBugpublic2015-06-15 17:56
ReporterSvensen Assigned Tohenry  
PrioritynormalSeverityfeatureReproducibilityalways
Status closedResolutionfixed 
PlatformGNU/LinuxOSUbuntuOS Version14.04
Summary0001655: foamJob. append output
DescriptionIt would be nice if foamJob can append the output to the existing log instead of overwriting it. So the whole statistics for the case which was runned several times can be stored in the only one log file
TagsNo tags attached.

Activities

henry

2015-04-17 15:14

manager   ~0004615

Could you provide a patch for this?

alexeym

2015-04-24 07:40

reporter  

foamJob-append-flag.patch (2,547 bytes)   
diff --git a/bin/foamJob b/bin/foamJob
index 20793c3..4d33c5d 100755
--- a/bin/foamJob
+++ b/bin/foamJob
@@ -40,6 +40,7 @@ options:
   -case <dir>       specify alternative case directory, default is the cwd
   -parallel         parallel run of processors
   -screen           also sends output to screen
+  -append           append to log file instead of overwriting it
   -version <ver>    specify an alternative OpenFOAM version
   -help             print the usage
 
@@ -127,6 +128,10 @@ do
       parallelOpt=true
       shift
       ;;
+   -a | -append)
+      appendOpt=true
+      shift
+      ;;
    -s | -screen)
       screenOpt=true
       shift
@@ -239,11 +244,18 @@ then
     #
     if [ "$screenOpt" = true ]
     then
-        echo "Executing: $mpirun $mpiopts $APPLICATION $(echoArgs "$@") -parallel | tee log"
-        $mpirun $mpiopts $APPLICATION "$@" -parallel | tee log
+        [ "$appendOpt" = true ] && teeOpts=" -a"
+        echo "Executing: $mpirun $mpiopts $APPLICATION $(echoArgs "$@") -parallel | tee$teeOpts log"
+        $mpirun $mpiopts $APPLICATION "$@" -parallel | tee $teeOpts log
     else
-        echo "Executing: $mpirun $mpiopts $APPLICATION $(echoArgs "$@") -parallel > log 2>&1"
-        $mpirun $mpiopts $APPLICATION "$@" -parallel > log 2>&1 &
+        if [ "$appendOpt" = true ]
+        then
+            echo "Executing: $mpirun $mpiopts $APPLICATION $(echoArgs "$@") -parallel >> log 2>&1"
+            $mpirun $mpiopts $APPLICATION "$@" -parallel >> log 2>&1 &
+        else
+            echo "Executing: $mpirun $mpiopts $APPLICATION $(echoArgs "$@") -parallel > log 2>&1"
+            $mpirun $mpiopts $APPLICATION "$@" -parallel > log 2>&1 &
+        fi
     fi
 
 else
@@ -252,12 +264,19 @@ else
     #
     if [ "$screenOpt" = true ]
     then
-        echo "Executing: $APPLICATION $(echoArgs "$@") | tee log &"
-        $APPLICATION "$@" | tee log &
+        [ "$appendOpt" = true ] && teeOpts=" -a"
+        echo "Executing: $APPLICATION $(echoArgs "$@") | tee$teeOpts log &"
+        $APPLICATION "$@" | tee $teeOpts log &
         wait $!
     else
-        echo "Executing: $APPLICATION $(echoArgs "$@") > log 2>&1 &"
-        $APPLICATION "$@" > log 2>&1 &
+        if [ "$appendOpt" = true ]
+        then
+            echo "Executing: $APPLICATION $(echoArgs "$@") >> log 2>&1 &"
+            $APPLICATION "$@" >> log 2>&1 &
+        else
+            echo "Executing: $APPLICATION $(echoArgs "$@") > log 2>&1 &"
+            $APPLICATION "$@" > log 2>&1 &
+        fi
     fi
 fi
 
foamJob-append-flag.patch (2,547 bytes)   

alexeym

2015-04-24 07:42

reporter   ~0004650

Attached quick solution. Not quite sure it is in accord with patch submission guidelines.

henry

2015-04-27 10:10

manager   ~0004657

@alexeym: Which version of OpenFOAM does the patch you provide apply to? I tried both OpenFOAM-2.3.x and OpenFOAM-dev but it failed for both.

Could you provide the complete foamJob script file and I will merge it line by line.

alexeym

2015-04-27 10:23

reporter   ~0004658

Patch was created for 2.3.1. Just tested, it works for 2.3.1 and 2.3.0. Please find complete foamJob script and terminal output on my RHEL 7 workstation attached.

alexeym

2015-04-27 10:23

reporter  

foamJob (7,177 bytes)   
#!/bin/sh
#------------------------------------------------------------------------------
# =========                 |
# \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
#  \\    /   O peration     |
#   \\  /    A nd           | Copyright (C) 2011-2013 OpenFOAM Foundation
#    \\/     M anipulation  |
#-------------------------------------------------------------------------------
# License
#     This file is part of OpenFOAM.
#
#     OpenFOAM is free software: you can redistribute it and/or modify it
#     under the terms of the GNU General Public License as published by
#     the Free Software Foundation, either version 3 of the License, or
#     (at your option) any later version.
#
#     OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
#     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
#     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
#     for more details.
#
#     You should have received a copy of the GNU General Public License
#     along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
#
# Script
#     foamJob
#
# Description
#     Run an OpenFOAM job in background.
#     Redirects the output to 'log' in the case directory.
#
#------------------------------------------------------------------------------
usage() {
    exec 1>&2
    while [ "$#" -ge 1 ]; do echo "$1"; shift; done
    cat<<USAGE

Usage: ${0##*/} [OPTION] <application> ...
options:
  -case <dir>       specify alternative case directory, default is the cwd
  -parallel         parallel run of processors
  -screen           also sends output to screen
  -append           append to log file instead of overwriting it
  -version <ver>    specify an alternative OpenFOAM version
  -help             print the usage

* run an OpenFOAM job in background.
  Redirects the output to 'log' in the case directory

USAGE
    exit 1
}

#for being able to echo strings that have single quotes
echoArgs() {
    addSpace=""

    for stringItem in "$@"; do

        echo -n "${addSpace}"

        if [ "${stringItem##* }" = "$stringItem" ]
        then
            echo -n "$stringItem"
            addSpace=" "
        else
            echo -n "'$stringItem'"
            addSpace=" "
        fi

    done

    unset stringItem addSpace
}

unset version

# replacement for possibly buggy 'which'
findExec() {
    case "$1" in
    */*)
        if [ -x "$1" ]
        then
            echo "$1"
            return 0
        fi
        ;;
    esac

    oldIFS=$IFS
    IFS=':'
    for d in $PATH
    do
        # echo "testing: $d/$1" 1>&2
        if [ -x "$d/$1" -a ! -d "$d/$1" ]
        then
            # echo "Found exec: $d/$1" 1>&2
            IFS=$oldIFS
            echo "$d/$1"
            return 0
        fi
     done
     IFS=$oldIFS
     echo ""
     return 1
}



# MAIN SCRIPT
#~~~~~~~~~~~~
unset parallelOpt screenOpt


# parse options
while [ "$#" -gt 0 ]
do
   case "$1" in
   -h | -help)
      usage
      ;;
   -case)
      [ "$#" -ge 2 ] || usage "'$1' option requires an argument"
      cd "$2" 2>/dev/null || usage "directory does not exist:  '$2'"
      shift 2
      ;;
   -p | -parallel)
      parallelOpt=true
      shift
      ;;
   -a | -append)
      appendOpt=true
      shift
      ;;
   -s | -screen)
      screenOpt=true
      shift
      ;;
   -v | -version)
      [ "$#" -ge 2 ] || usage "'$1' option requires an argument"
      version="$2"
      shift 2
      ;;
   --)
      shift
      break
      ;;
   -*)
      usage "invalid option '$1'"
      ;;
   *)
      break
      ;;
   esac
done

[ "$#" -ge 1 ] || usage "No application specified"


# use foamExec for a specified version
# also need foamExec for remote (parallel) runs
if [ -n "$version" -o "$parallelOpt" = true ]
then
    # when possible, determine if application even exists
    if [ -z "$version" ]
    then
        findExec $1 >/dev/null || usage "Application '$1' not found"
    fi

    # use foamExec for dispatching
    APPLICATION=`findExec foamExec` || usage "'foamExec' not found"

    [ -n "$version" ] && APPLICATION="$APPLICATION -version $version"

    # attempt to preserve the installation directory 'FOAM_INST_DIR'
    if [ -d "$FOAM_INST_DIR" ]
    then
        APPLICATION="$APPLICATION -prefix $FOAM_INST_DIR"
    fi

else
    APPLICATION=`findExec $1` || usage "Application '$1' not found"
    echo "Application : $1"
    shift
fi


if [ "$parallelOpt" = true ]
then
    # parallel
    # ~~~~~~~~

    #
    # is the case decomposed?
    #
    if [ -r "processor0" ]
    then
        NPROCS="`/bin/ls -1d processor* | wc -l`"
    else
        echo "Case is not currently decomposed"
        if [ -r system/decomposeParDict ]
        then
            echo "system/decomposeParDict exists"
            echo "Try decomposing with \"foamJob decomposePar\""
            exit 1
        else
            echo "Cannot find system/decomposeParDict file required to decompose the case for parallel running."
            echo "Please consult the User Guide for details of parallel running"
            exit 1
        fi
    fi

    #
    # locate mpirun
    #
    mpirun=`findExec mpirun` || usage "'mpirun' not found"
    mpiopts="-np $NPROCS"

    #
    # is the machine ready to run parallel?
    #
    echo "Parallel processing using $WM_MPLIB with $NPROCS processors"
    case "$WM_MPLIB" in
    *OPENMPI)
        # add hostfile info
        for hostfile in \
            hostfile \
            machines \
            system/hostfile \
            system/machines \
            ;
        do
            if [ -r $hostfile ]
            then
                mpiopts="$mpiopts -hostfile $hostfile"
                break
            fi
        done
        ;;
    esac

    #
    # run (in parallel)
    #
    if [ "$screenOpt" = true ]
    then
        [ "$appendOpt" = true ] && teeOpts=" -a"
        echo "Executing: $mpirun $mpiopts $APPLICATION $(echoArgs "$@") -parallel | tee$teeOpts log"
        $mpirun $mpiopts $APPLICATION "$@" -parallel | tee $teeOpts log
    else
        if [ "$appendOpt" = true ]
        then
            echo "Executing: $mpirun $mpiopts $APPLICATION $(echoArgs "$@") -parallel >> log 2>&1"
            $mpirun $mpiopts $APPLICATION "$@" -parallel >> log 2>&1 &
        else
            echo "Executing: $mpirun $mpiopts $APPLICATION $(echoArgs "$@") -parallel > log 2>&1"
            $mpirun $mpiopts $APPLICATION "$@" -parallel > log 2>&1 &
        fi
    fi

else
    #
    # run (on single processor)
    #
    if [ "$screenOpt" = true ]
    then
        [ "$appendOpt" = true ] && teeOpts=" -a"
        echo "Executing: $APPLICATION $(echoArgs "$@") | tee$teeOpts log &"
        $APPLICATION "$@" | tee $teeOpts log &
        wait $!
    else
        if [ "$appendOpt" = true ]
        then
            echo "Executing: $APPLICATION $(echoArgs "$@") >> log 2>&1 &"
            $APPLICATION "$@" >> log 2>&1 &
        else
            echo "Executing: $APPLICATION $(echoArgs "$@") > log 2>&1 &"
            $APPLICATION "$@" > log 2>&1 &
        fi
    fi
fi

#------------------------------------------------------------------------------
foamJob (7,177 bytes)   

alexeym

2015-04-27 10:23

reporter  

foamJob-patch-application.log (642 bytes)   
alexeym@daphne in OpenFOAM-2.3.0$ patch -p1 < foamJob-append-flag.patch
patching file bin/foamJob
alexeym@daphne in OpenFOAM-2.3.0$ foamJob 
No application specified

Usage: foamJob [OPTION] <application> ...
options:
  -case <dir>       specify alternative case directory, default is the cwd
  -parallel         parallel run of processors
  -screen           also sends output to screen
  -append           append to log file instead of overwriting it
  -version <ver>    specify an alternative OpenFOAM version
  -help             print the usage

* run an OpenFOAM job in background.
  Redirects the output to 'log' in the case directory

henry

2015-04-27 10:40

manager   ~0004659

Thanks, I found it worked on 2.3.0 and merged from there. It is easier if patches and/or files are provided for OpenFOAM-2.3.x and/or OpenFOAM-dev to facilitate inclusion in those public repositories and future releases.

The updated script (untested) in is OpenFOAM-dev:
commit 4c20de71bb8f1d383e2b14f75b565664d78270d2

if there are no problems with it I will include it in OpenFOAM-2.3.x.

Issue History

Date Modified Username Field Change
2015-04-13 13:26 Svensen New Issue
2015-04-17 15:14 henry Note Added: 0004615
2015-04-24 07:40 alexeym File Added: foamJob-append-flag.patch
2015-04-24 07:42 alexeym Note Added: 0004650
2015-04-27 10:10 henry Note Added: 0004657
2015-04-27 10:23 alexeym Note Added: 0004658
2015-04-27 10:23 alexeym File Added: foamJob
2015-04-27 10:23 alexeym File Added: foamJob-patch-application.log
2015-04-27 10:40 henry Note Added: 0004659
2015-06-15 17:56 henry Status new => closed
2015-06-15 17:56 henry Assigned To => henry
2015-06-15 17:56 henry Resolution open => fixed