Spahni Stein Rechtsanwälte
 
Navigation
Wichtige Links
Back
#!/bin/sh
#
# relhumidity
# Berechnung der relativen Luftfeuchtigkeit
# aus Temperatur und Taupunkt
#
# parameter:
# arg1 = Temperatur
# arg2 = Taupunkt

# bc wird zum Rechnen gebraucht
BCPROG="/usr/bin/bc"
BCOPTS="-lq"
BC="$BCPROG $BCOPTS"

# mal sehen, ob das bc Programm gefunden wird
if ! which $BCPROG >/dev/null 2>&1 ; then
	echo "ERROR: relhumidity needs bc"
	exit 1
fi

# prüfe, ob zwei Argumente übergeben wurden
if test -z "$1" -o -z "$2" ; then
	echo "ERROR: relhumidity needs arguments <temperature> <dewpoint>"
	exit 1
fi

# Taupunkttemperatur kann nicht grösser sein als Temperatur
BOOL=$(echo "$1 >= $2" | $BC)
if ! test $BOOL == 1 ; then
	echo "ERROR: Dewpoint is greater than Temperature"
	exit 1
fi

# die eigentliche Berechnung macht bc
#echo "if ($1 > 0.0) { ta = 7.5 ; tb = 237.3 ; } \
#         else { ta = 7.6 ; tb = 240.7 ; } ; \
#      if ($2 > 0.0) { tpa = 7.5 ; tpb = 237.3 ; } \
#         else { tpa = 7.6 ; tpb = 240.7 ; } ; \
#      sddt  = 6.1078 * e( l(10) * ((ta  * $1) / (tb  + $1)) ) ; \
#      sddtp = 6.1078 * e( l(10) * ((tpa * $2) / (tpb + $2)) ) ; \
#      rh    = (100 * sddtp / sddt) + 0.05 ; \
#      scale = 1 ;
#      (rh / 1.0) * 1.0 ;" | $BC
#
# eine alternative Version (besser lesbar):
# Formeln:
# r   = relative Luftfeuchte
# T   = Temperatur in °C
# TD  = Taupunkttemperatur in °C
# SDD = Sättigungsdampfdruck in hPa
#
# Parameter:
# a = 7.5, b = 237.3 für T >= 0
# a = 7.6, b = 240.7 für T <  0
#
# SDD(T)  = 6.1078 * 10^((a*T)/(b+T))
# r(T,TD) = 100 * SDD(TD) / SDD(T)
#
# Da bc nur ganzzahlige Exponenten akzeptiert, muss mit
# Logarithmen gerechnet werden. Es gilt:
#   ln(a^b) = b * ln(a)
#   also: a^b = e^(b * ln(a))
#
echo "define pa (n) {
         if (n >= 0.0) {
            return (7.5);
         } else {
            return (7.6);
         }
      }

      define pb (n) {
         if (n >= 0.0) {
            return (237.3);
         } else {
            return (240.7);
         }
      }

      define sdd (t) {
         return (6.1078 * e( l(10) * ((pa(t) * t) / (pb(t) + t)) ) );
      }

      scale = 20;
      rh = (100.0 * sdd($2) / sdd($1));
      /* adding 0.05 for correct rounding */
      rh = (rh + 0.05);
      /* rounding result to one decimal digit */
      scale = 1;
      (rh / 1.0)" | $BC

exit 0