Spahni Stein Rechtsanwälte
 
Navigation
Wichtige Links
Back
#!/bin/sh
# dewpoint
# Berechnung des Taupunkts
# aus Temperatur und Relativer Feuchte
#
# parameter:
# arg1 = Temperatur in Grad Celsius
# arg2 = Relative Luftfeuchtigkeit in %

# 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: 'dewpoint' needs bc"
	exit 1
fi

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

# Die relative Luftfeuchte muss im Bereich 0% ... 100% liegen
BOOL=$(echo "($2 >= 0) && ($2 <= 100)" | $BC)
if ! test $BOOL == 1 ; then
	echo "ERROR: dewpoint out of limits"
	exit 1
fi

# Formeln:
# r   = relative Luftfeuchte
# T   = Temperatur in °C
# TD  = Taupunkttemperatur in °C
# DD  = Dampfdruck in hPa
# 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))
# DD(r,T) = r/100 * SDD(T)
# r(T,TD) = 100 * SDD(TD) / SDD(T)
# TD(r,T) = b*v/(a-v)
# mit:
# v(r,T)  = log10(DD(r,T)/6.1078)
#
# 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)) ) );
      }

      define dd (r,t) {
         return (r / 100.0 * sdd(t));
      }

      /* factor 2.302585093 converts ln() to log() */
      v  = l(dd($2,$1) / 6.1078) / 2.302585093;
      tp = ((pb($1) * v) / (pa($1) - v));

      if ( tp >= 0.0 ) {
         tp = (tp + 0.05);
      } else {
         tp = (tp - 0.05);
      }

      scale = 1;
      (tp / 1.0);" | $BC

exit 0