データを間引く

2013年8月30日

はじめに

計算結果を間引く方法について。

使用バージョン

OpenFOAM 2.2.1

注意

計算結果を削除するので、注意して実行してください。下記に従った結果によるいかなる損失に対しても責任は負いません。

データを間引く

必要以上に結果を出力してしまったとき、データを間引きたいが、そういう機能は標準では用意されてなさそうなので、下記のようなスクリプトを作ってみた。

使い方

clearCase <interval>
  • interval: 残すデータの間隔

たとえば、データが 0, 0.05, 0.1, 0.15, 0.2, ... とあった場合、interval = 2 とすると、0, 0.1, 0.2, ... が残り、他は削除される。ただし、最後の結果は常に残る。

実行時に確認メッセージが出る。

$ ./clearCase 2
Remaining directories:
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
Removing directories:
0.05
0.15
0.25
0.35
0.45
0.55
0.65
0.75
0.85
0.95
OK? (y or n):

y を入力したら削除が実行される。

clearCase

#!/bin/sh

if [ $# -lt 1 ] ; then
    echo "usage: clearCase <interval>"
    exit 0
fi

N=$1

if [ $N -le 1 ] ; then
    echo "interval must be > 1"
    exit 0
fi

if [ -d "processor0" ] ; then
    TIMES=`ls processor0 | grep '^[0-9.]*$' | sort -n`
else
    TIMES=`ls | grep '^[0-9.]*$' | sort -n`
fi

LATEST=`echo $TIMES | tr " " "\n" | tail -n 1`

echo "Remaining directories:"

PRINT_MAX=20

I=0
J=1
LAST=""
for TIME in $TIMES ; do
    if [ `expr $I % $N` -eq 0 ] ; then
        echo $TIME
        J=`expr $J + 1`
        LAST=$TIME
    fi

    I=`expr $I + 1`

    if [ $J -ge $PRINT_MAX ] ; then
        echo "..."
        break
    fi
done

if [ $LAST != $LATEST ] ; then
    echo $LATEST
fi

echo "Removing directories:"

I=0
J=1
for TIME in $TIMES ; do
    if [ `expr $I % $N` -ne 0 -a $TIME != $LATEST ] ; then
        echo $TIME
        J=`expr $J + 1`
    fi

    I=`expr $I + 1`

    if [ $J -ge $PRINT_MAX ] ; then
        echo "..."
        break
    fi
done

echo -n "OK? (y or n): "

R="n"
read R

if [ $R = "y" ] ; then
    echo "removing..."

    I=0
    for TIME in $TIMES ; do
        if [ `expr $I % $N` -ne 0 -a $TIME != $LATEST ] ; then
            rm -rf $TIME
        fi
        I=`expr $I + 1`
    done

    if [ -d "processor0" ] ; then
        for DIR in processor* ; do
            cd $DIR

            I=0
            for TIME in $TIMES ; do
                if [ `expr $I % $N` -ne 0 -a $TIME != $LATEST ] ; then
                    rm -rf $TIME
                fi
                I=`expr $I + 1`
            done

            cd ..
        done
    fi

    echo "done."
else
    echo "abort."
fi