libEOS83.pl
author Andreas Thurnherr <ant@ldeo.columbia.edu>
Mon, 13 Apr 2020 11:06:22 -0400
changeset 40 c1803ae2540f
parent 4 ff72b00b4342
permissions -rw-r--r--
.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     1
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     2
#          L I B E O S 8 3 . P L 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     3
#          doc: Mon Mar  8 08:22:05 1999
4
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
     4
#          dlm: Tue Feb  5 16:42:28 2013
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     5
#          (c) 1999 A.M. Thurnherr
4
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
     6
#          uE-Info: 20 59 NIL 0 0 72 2 2 4 NIL ofnI
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     7
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     8
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     9
# Perl Implementation of UNESCO Eqn of State 1983
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    10
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    11
# Notes:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    12
# 	- copied from eos83calc.c which was in turn...
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    13
#	- copied from pexec_v4 (incl comments)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    14
#	- only subset of functions implemented
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    15
#	- some attempt at cleaning up the code has been made
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    16
#	- pressures in dbar throughout
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    17
#	- no temperature scale assumed; set PARAM ITS=90|68
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    18
#	- T90*1.00024=T68
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    19
#	- check values calculated with T68
4
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    20
#	- no conductivity unit assumed; set PARAM cond.unit=S/m|mS/cm
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    21
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    22
# HISTORY:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    23
#	Mar 08, 1999: - translated by hand from krc
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    24
#				  - added &alpha(), &beta(), &Rrho(), &TurnerAngle()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    25
#	Mar 13, 1999: - cosmetic changes
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    26
#	Mar 14, 1999: - BUG NAN instead of NaN
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    27
#	Mar 21, 1999: - make $sigmaR optional in &sVolAnom()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    28
#	Mar 31, 1999: - alias &potemp() = &theta(); &podens() = &sigma()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    29
#				  - added &temp() to calc in-situ from potemp
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    30
#	Sep 18, 1999: - parameter typechecking
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    31
#	Aug 28, 2000: - added PARAM T68 check
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    32
#	Aug 29, 2000: - forced temp_scale param check --- set to T68 or T90
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    33
#	Sep 25, 2000: - changed temp_scale to 68 or 90 (easier check)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    34
#				  - check for temp_scale during loading
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    35
#	Nov 07, 2000: - added &dynHt()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    36
#				  - strictified
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    37
#	Nov 13, 2000: - removed temp_scale check during loading (STUPID,
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    38
#					because PARAMs are only available after header
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    39
#					is read)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    40
#	Feb 28, 2001: - added &rho(S,T,P)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    41
#	Mar 28, 2001: - changed Rrho() to use podens
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    42
#				  - optimized &theta() for P == Pref
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    43
#	Apr  2, 2001: - &TurnerAngle() disabled pending adaptation to new Rrho()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    44
#	Apr  3, 2001: - updated &TurnerAngle()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    45
#	Jul 17, 2001: - cosmetics
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    46
#				  - added &grav(), &potErgAnom()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    47
#	Jul 18, 2001: - cosmetics
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    48
#	Jul 20, 2001: - changed temp_scale to ITS
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    49
#	Nov 26, 2001: - added &g(), &f()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    50
#	Dec 26, 2005: - update notes
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    51
#   Jul  1, 2006: - Version 3.3 [HISTORY]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    52
#				  - nan must be quoted for use strict
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    53
#	Nov  5, 2006: - added K15toSalin
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    54
#	Oct 18, 2007: - adapted to new &antsFunUsage()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    55
#				  - changed order of &salin() params
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    56
#	Oct 19, 2007: - continued
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    57
#				  - removed &grav(), podens(), potemp()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    58
#	Dec  1, 2007: - made theta(), sigma(), rho() return nan on nan input
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    59
#	Dec 21, 2007: - BUG: grav() was still used
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    60
#	Jan 20, 2008: - BUG: theta(), sigma(), rho() still generated error on nan in
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    61
#				  - made depth(), dynht(), potErgAnom() return nan on nan in
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    62
#	Jan  4, 2011: - maded salin(), sVel() return nan on nan in
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    63
#	Oct  6, 2011: - added %cond.unit (analogous to %ITS)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    64
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    65
require "$ANTS/libvec.pl";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    66
use strict;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    67
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    68
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    69
# PART I: stuff taken from PEXEC
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    70
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    71
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    72
{ # BEGIN STATIC SCOPE
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    73
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    74
	my($TCONV);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    75
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    76
	sub TCONV()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    77
	{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    78
		unless (defined($TCONV)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    79
			my($ITS) = &antsRequireParam('ITS');
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    80
			if ($ITS == 68) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    81
				$TCONV = 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    82
			} elsif ($ITS == 90) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    83
				$TCONV = 1.00024;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    84
			} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    85
				croak("$0: illegal PARAM-value ITS=$ITS\n");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    86
	        }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    87
	    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    88
	    return $TCONV;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    89
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    90
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    91
} # END STATIC SCOPE
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    92
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    93
#---------------------------------------------------------------------- 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    94
#	ADIABATIC TEMPERATURE GRADIENT DEG C/BAR							 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    95
#	REF: BRYDEN,H.,1973,DEEP-SEA RES.,20,401-408						 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    96
#	CHECK VALUE: ATGR80=3.255976E-3 FOR S=40 NSU,T=40 DEG C,			 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    97
#	PIN=10000 DECIBARS
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    98
#	NB: real check value appears to be 3.255976E-4; this makes sense
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    99
#	    as check value of potential temperature below is correct. Also
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   100
#       note the 0.1 factor on return.
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   101
#---------------------------------------------------------------------- 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   102
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   103
{ my(@fc);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   104
	sub adiaTempGrad(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   105
	{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   106
		my($S,$T,$P) = &antsFunUsage(3,'fff','[salin, temp, press(db)]',
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   107
									 \@fc,'salin','temp','press',@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   108
		my($DS);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   109
		my($TCONV) = &TCONV();
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   110
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   111
		$T *= $TCONV;		# use T68 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   112
		$P *= 0.1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   113
		$DS = $S - 35.0;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   114
		return 0.1 * ((((-2.1687E-13*$T+1.8676E-11)*$T-4.6206E-10)*$P
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   115
					+((2.7759E-10*$T-1.1351E-8)*$DS+((-5.4481E-12*$T
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   116
					+8.733E-10)*$T-6.7795E-8)*$T+1.8741E-6))*$P
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   117
					+(-4.2393E-7*$T+1.8932E-5)*$DS
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   118
					+((6.6228E-9*$T-6.836E-7)*$T+8.5258E-5)*$T+3.5803E-4) / $TCONV;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   119
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   120
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   121
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   122
#---------------------------------------------------------------------- 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   123
# TO COMPUTE LOCAL POTENTIAL TEMPERATURE AT PR							 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   124
#	USING BRYDEN 1973 POLYNOMIAL FOR ADIABATIC LAPSE RATE				 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   125
#	AND RUNGE-KUTTA 4-TH ORDER INTEGRATION ALGORITHM.					 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   126
#	REF: BRYDEN,H.,1973,DEEP-SEA RES.,20,401-408						 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   127
#	FOFONOFF,N.,1977,DEEP-SEA RES.,24,489-491							 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   128
#	CHECK VALUE: PTMP83 =36.89072 FOR S=40 NSU,T=40 DEG C,				 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   129
#	P(MEASURED PRESSURE)=10000 DECIBARS,Pref=0 DECIBARS
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   130
#---------------------------------------------------------------------- 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   131
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   132
{ my(@fc);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   133
	sub theta(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   134
	{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   135
		my($S,$T,$P,$Pref) =
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   136
			&antsFunUsage(4,'....','[salin, temp, press(db),] refpress(db)',
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   137
						  \@fc,'salin','temp','press',undef,@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   138
		return 'nan' unless numberp($S) && numberp($T) && numberp($P);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   139
		my($H,$XK,$Q);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   140
		my($TCONV) = &TCONV();
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   141
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   142
		return $T if ($P == $Pref);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   143
		$T *= $TCONV;	# use T68 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   144
		$H = $Pref - $P;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   145
		$XK = $H * &adiaTempGrad($S,$T/$TCONV,$P)*$TCONV;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   146
		$T += 0.5 * $XK;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   147
		$Q = $XK;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   148
		$P += 0.5 * $H;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   149
		$XK = $H * &adiaTempGrad($S,$T/$TCONV,$P)*$TCONV;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   150
		$T += 0.29289322 * ($XK-$Q);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   151
		$Q = 0.58578644*$XK + 0.121320344*$Q;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   152
		$XK = $H * &adiaTempGrad($S,$T/$TCONV,$P)*$TCONV;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   153
		$T += 1.707106781 * ($XK-$Q);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   154
		$Q = 3.414213562*$XK - 4.121320344*$Q;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   155
		$P += 0.5*$H;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   156
		$XK = $H * &adiaTempGrad($S,$T/$TCONV,$P)*$TCONV;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   157
		return ($T + ($XK-2.0*$Q)/6.0)/$TCONV;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   158
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   159
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   160
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   161
# can't easily do default fields because theta field name is not unique
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   162
sub temp(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   163
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   164
	my($S,$T,$P,$Pref) =
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   165
		&antsFunUsage(4,"ffff","salin, potemp, press(db), refpress(db)",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   166
	return &theta($S,$T,$Pref,$P);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   167
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   168
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   169
#---------------------------------------------------------------------- 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   170
#	Calculation of specific volume anomaly
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   171
#		Gill (1982), p.215: - specific volume = inverse of density
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   172
#							- SVA referenced to same press, T=0, S=35
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   173
#																		 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   174
#	 *************************************************					 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   175
#	 *** USES EQUATION OF STATE FOR SEA WATER 1980 ***					 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   176
#	 *************************************************					 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   177
#																		 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   178
#	Check value. SVAN83=981.30210E-8, SIGMA=59.82037					 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   179
#	for S=40, T=40, P=10000												 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   180
#																		 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   181
# 	NB: - this one was a bitch to translate, used f2c and it shows :-)	 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   182
#		- the 1e-8 factor in the check value is wrong; yup: see gill p.215
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   183
#		  (typical units are 1e-8m^3kg^-1)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   184
#		- check val appears to be slightly off, I get 981.30187319561
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   185
#	  
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   186
#---------------------------------------------------------------------- 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   187
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   188
sub sVolAnom(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   189
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   190
	my($S,$T,$P,$sigmaR) =
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   191
		&antsFunUsage(-3,'fff','salin, temp, press(db)[, ref to sigma var]',@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   192
	my($r3500) = 1028.1063;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   193
	my($r4)	   = 4.8314e-4;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   194
	my($dr350) = 28.106331;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   195
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   196
	my($temp0,$temp1,$temp2,$temp3,$temp4);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   197
	my($dvan,$dr35p,$p,$t,$dk,$pk,$sr,$gam,$sig,$rk35,$sva,$v350p);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   198
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   199
	my($TCONV) = &TCONV();
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   200
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   201
	$t = $T*$TCONV;								# use T68 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   202
	$p = $P / 10.;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   203
#	$sr = sqrt(abs($S));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   204
	$sr = sqrt($S);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   205
	$temp3 = (((($t * 6.536332e-9 - 1.120083e-6) * $t + 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   206
	  1.001685e-4) * $t - .00909529) * $t + .06793952) * $t 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   207
	  - 28.263737;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   208
	$temp2 = ((($t * 5.3875e-9 - 8.2467e-7) * $t + 7.6438e-5) 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   209
	  * $t - .0040899) * $t + .824493;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   210
	$temp1 = ($t * -1.6546e-6 + 1.0227e-4) * $t - .00572466;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   211
	$sig = ($r4 * $S + $temp1 * $sr + $temp2) * $S + $temp3;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   212
	$v350p = 1. / $r3500;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   213
	$sva = -$sig * $v350p / ($r3500 + $sig);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   214
	$$sigmaR = $sig + $dr350 if (defined($sigmaR));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   215
	return $sva * 1e8 if ($p == 0.0);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   216
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   217
	$temp0 = ($t * 9.1697e-10 + 2.0816e-8) * $t - 9.9348e-7;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   218
	$temp1 = ($t * 5.2787e-8 - 6.12293e-6) * $t + 3.47718e-5;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   219
	$temp1 = $temp1 + $temp0 * $S;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   220
	$temp0 = 1.91075e-4;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   221
	$temp2 = ($t * -1.6078e-6 - 1.0981e-5) * $t + .0022838;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   222
	$temp3 = (($t * -5.77905e-7 + 1.16092e-4) * $t + .00143713) * $t - .1194975;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   223
	$temp3 = ($temp0 * $sr + $temp2) * $S + $temp3;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   224
	$temp0 = ($t * -5.3009e-4 + .016483) * $t + .07944;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   225
	$temp2 = (($t * -6.167e-5 + .0109987) * $t - .603459) * $t + 54.6746;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   226
	$temp4 = ((($t * -5.155288e-5 + .01360477) * $t - 2.327105) * $t + 148.4206) * $t - 1930.06;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   227
	$temp4 = ($temp0 * $sr + $temp2) * $S + $temp4;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   228
	$dk = ($temp1 * $p + $temp3) * $p + $temp4;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   229
	$rk35 = ($p * 5.03217e-5 + 3.359406) * $p + 21582.27;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   230
	$gam = $p / $rk35;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   231
	$pk = 1. - $gam;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   232
	$sva = $sva * $pk + ($v350p + $sva) * $p * $dk / ($rk35 * ($rk35 + $dk));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   233
	$v350p *= $pk;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   234
	$dr35p = $gam / $v350p;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   235
	$dvan = $sva / ($v350p * ($v350p + $sva));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   236
	$$sigmaR = $dr350 + $dr35p - $dvan if (defined($sigmaR));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   237
	return $sva * 1e8;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   238
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   239
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   240
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   241
# Dynamic Height (from dyht83.F)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   242
#	Usage:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   243
#		- dynHt(salin,temp,press[,idx])
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   244
#	Check Values from PEXEC:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   245
#		- dynHt(40,18,20)  -> -.01879
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   246
#		- dynHt(??,16,50)  -> -.03194
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   247
#		- dynHt(??,14,100) -> -.00255
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   248
#	NB: - check values 2 & 3 do not appear to check out
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   249
#		- checked against WHOI-supplied BBTRE data indicates max
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   250
#		  diff of 1e-3 dyn.m at 5141m
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   251
#		- use different idx to use multiple times in single program
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   252
#		  (c.f. [gshear])
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   253
#		- behaves the same as the pexec version with PFIRST=0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   254
#		- dynamic height seems to be defined (1e-5 factor) to allow
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   255
#		  station distance to be in km and velocities in cm/s
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   256
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   257
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   258
{ # BEGIN static scope
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   259
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   260
	my(@lastP,@lastAnom,@ht);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   261
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   262
	sub dynHt(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   263
	{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   264
		my($S,$T,$P,$idx) =
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   265
			&antsFunUsage(-3,"...","salin, temp, press(db)[, <idx>]",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   266
		return 'nan' unless numbersp($S,$T,$P);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   267
		my($anom) = sVolAnom($S,$T,$P) * 1e-5;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   268
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   269
		if (!defined($ht[$idx])) {					# first call
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   270
			$ht[$idx] = $P * $anom;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   271
		} else {									# successive calls
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   272
		    croak("$0: pressure not increasing monotonically ($lastP[$idx] -> $P)\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   273
		    	if ($P < $lastP[$idx]);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   274
			$ht[$idx] += ($P-$lastP[$idx]) * ($anom+$lastAnom[$idx])/2;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   275
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   276
		$lastP[$idx] = $P; $lastAnom[$idx] = $anom;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   277
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   278
		return $ht[$idx];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   279
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   280
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   281
} # END static scope
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   282
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   283
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   284
# Local Gravity (from grav83.F)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   285
#	Usage:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   286
#		- g(press,lat)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   287
#	Check Values:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   288
#		- g(10000,30) = 9.804160
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   289
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   290
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   291
{ my(@fc);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   292
	sub g(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   293
	{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   294
		my($P,$lat) = &antsFunUsage(2,'ff','[press(db), lat]',\@fc,'press','%lat',@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   295
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   296
		my($x) = sin($lat/57.29578) ** 2;				    
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   297
		my($g) = 9.780318*(1.0+(5.2788e-3+2.36e-5*$x)*$x);	# global variation
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   298
		return $g + 1.092e-6 * $P;							# pressure correction
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   299
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   300
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   301
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   302
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   303
# Coriolis frequency
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   304
#	Usage:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   305
#		- f(%lat)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   306
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   307
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   308
{ my(@fc);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   309
	sub f(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   310
	{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   311
		my($lat) = &antsFunUsage(1,'f','[lat]',\@fc,'%lat',@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   312
		my($Omega) = 7.292e-5;								# Gill (1982)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   313
		return 2 * $Omega * sin(rad($lat));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   314
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   315
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   316
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   317
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   318
# Potential Energy Anomaly (from pean83.F)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   319
#	Usage:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   320
#		- potErgAnom(salin,temp,press,refPress,lat)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   321
#	Check Values from PEXEC: (NB: sequence of calls)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   322
#		- potErgAnom(40,18, 20,0,49.2235) = -1.91462
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   323
#		- potErgAnom(38,16, 50,0,49.2235) = -4.31092
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   324
#		- potErgAnom(36,14,100,0,49.2235) = 24.82922
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   325
#	Units:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   326
#		- Gill (1982) p.45: m^2/s^2 = J/kg
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   327
#	NB:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   328
#		- geopotential Phi is PEA wrt zero pressure
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   329
#		- PE of volume is volume integral of rho*PEA (c.f. Gill, p.80)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   330
#		- check value lat calculated so that g(0,lat) ~ 9.81
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   331
#		- IF Pref<P ON 1ST CALL, HEIGHT WILL BE CALCULATED FROM LEVEL
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   332
#		  Pref.  HENCE IF Pref = 0.0, FROM SEA SURFACE DOWN.
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   333
#		- different to pexec, this version sets values for P<Pref to nan
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   334
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   335
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   336
{ # BEGIN STATIC SCOPE
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   337
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   338
	my($gzero,$H,$lastZ,$lastP);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   339
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   340
	sub potErgAnom(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   341
	{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   342
		my($S,$T,$P,$Pref,$lat) =
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   343
	        &antsFunUsage(5,".....","salin, temp, press(db), refpress(db), lat",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   344
	    return 'nan' unless numbersp($S,$T,$P,$Pref,$lat);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   345
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   346
		return 'nan' if ($P < $Pref);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   347
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   348
		$gzero = g(0,$lat) unless (defined($gzero));		# 1st time
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   349
		my($g) = $gzero + 1.113e-4*$P;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   350
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   351
		my($anom) = sVolAnom($S,$T,$P) * 1e-3;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   352
		my($Z) = $anom * $P/$g;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   353
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   354
		if (defined($H)) {									# not 1st time
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   355
		    croak("$0: pressure not increasing monotonically\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   356
		    	if ($P < $lastP);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   357
			$H += ($Z+$lastZ) * ($P-$lastP)*0.5;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   358
		} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   359
			$H = (($anom*$Pref/$g)+$Z)*($P-$Pref)*0.5;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   360
        }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   361
        
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   362
		$lastP = $P; $lastZ = $Z;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   363
		return $H;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   364
    }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   365
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   366
} # END static scope
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   367
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   368
#---------------------------------------------------------------------- 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   369
# Density at pressure P (P - Measured pressure)						 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   370
# 						(PREF - Reference pressure)					 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   371
# Equation of state for seawater proposed by JPOTS 1980				 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   372
# References															 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   373
#		Millero et al 1980, Deep Sea Res.,27A,255-264					 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   374
#		Jpots Ninth Report 1978, Tenth Report 1980						 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   375
# Units:																 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   376
#	   Pressure   P  Decibars									 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   377
#	   Temperature T  Deg Celcius (IPTS-68)						 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   378
#	   Salinity   S  NSU (IPSS-78)								 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   379
#	   Density   RHO KG/M**3										 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   380
#	   Spec. Vol.  EOS80 M**3/KG									 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   381
#	check value. 43.331642 for P=10000,PREF=5000,T=40,S=40				 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   382
# NB: check value appears to be 42.33164!!!							 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   383
#---------------------------------------------------------------------- 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   384
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   385
{ my(@fc); 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   386
	sub sigma(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   387
	{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   388
		my($S,$T,$P,$Pref) =
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   389
			&antsFunUsage(4,'....','[salin, temp, press(db),] refpress(db)',
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   390
						  \@fc,'salin','temp','press',undef,@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   391
		return 'nan' unless numberp($S) && numberp($T) && numberp($P);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   392
		my($sig);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   393
		&sVolAnom($S,&theta($S,$T,$P,$Pref),$Pref,\$sig);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   394
		return $sig;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   395
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   396
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   397
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   398
{ my(@fc);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   399
	sub rho(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   400
	{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   401
		my($S,$T,$P) = &antsFunUsage(3,'...','[salin, temp, press(db)]',
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   402
									 \@fc,'salin','temp','press',@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   403
		return 'nan' unless numberp($S) && numberp($T) && numberp($P);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   404
		return 1000 + &sigma($S,$T,$P,$P);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   405
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   406
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   407
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   408
#---------------------------------------------------------------------- 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   409
#	FUNCTION TO CONVERT CONDUCTIVITY TO SALINITY ACCORDING TO THE		 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   410
#	ALGORITHMS RECOMMMENDED BY JPOTS USING THE 1978 PRACTICAL 			 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   411
#	SALINITY SCALE (IPSS-78) AND IPTS-68 FOR TEMPERATURE. 				 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   412
#	C1535=CONDUCTIVITY (FROM CULKIN&SMITH,1980,J.OCEAN.ENG.VOL.5 		 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   413
#    PP22-23) = 42.9140 AT    PRES=0.0, 							 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   414
#	SALINITY 35 NSU AND TEMPERATURE 15 DEG CELSIUS (IPTS-68) 			 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   415
#	PRESSURE=DECIBARS 													 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   416
#	RETURNS ZERO FOR CND<.0005 		 									 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   417
#	CHECKVALUES.... 													 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   418
#	SAL83 =40.000000 FOR CND=81.025545,T=40 DEG C,PIN=10000 			 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   419
#   DECIBARS														 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   420
#	WRITTEN BY N FOFONOFF; REVISED OCT 6 1980 							 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   421
#	FCN SAL83, XR=SQRT(RT) 												 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   422
#	DERIVATIVE WRT XR ; DSAL/DXR 										 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   423
#	RT35 																 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   424
#	C,B,A, POLYNOMIALS 													 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   425
#	NB: - done using f2c (couldn't be bothered)							 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   426
#		- removed SAL->COND												 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   427
#---------------------------------------------------------------------- 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   428
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   429
{ my(@fc);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   430
  my($cond_scale);	# 1 for mS/cm, 10 for S/m
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   431
	sub salin(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   432
	{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   433
		my($C,$T,$P) = &antsFunUsage(3,'...','[cond, temp, press(db)]',
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   434
									 \@fc,'cond','temp','press',@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   435
		return 'nan' unless numberp($C) && numberp($T) && numberp($P);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   436
		my($r__,$dt,$rt,$c1535);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   437
		my($TCONV) = &TCONV();
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   438
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   439
		unless (defined($cond_scale)) {				# deal with different conductivity units
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   440
			my($cu) = &antsRequireParam('cond.unit');
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   441
			if    ($cu eq 'S/m')   { $cond_scale = 10; }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   442
			elsif ($cu eq 'mS/cm') { $cond_scale = 1;  }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   443
			else { croak("$0: illegal PARAM-value cond.unit=$cu\n"); }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   444
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   445
		$C *= $cond_scale;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   446
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   447
		return 0.0 if ($C <= 5e-4); 				# zero salinity trap 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   448
		$T *= $TCONV;								# use T68 scale 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   449
		$c1535 = 42.914;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   450
		$dt = $T - 15.0;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   451
		$P *= .1;									# convert pressure to bars 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   452
		$r__ = $C / $c1535; 						# convert cond to salin
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   453
		$rt = $r__ / ((((($T * 1.0031e-9 - 6.9698e-7) * $T + 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   454
		  1.104259e-4) * $T + .0200564) * $T + .6766097) * ((($P 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   455
		  * 3.989e-12 - 6.37e-8) * $P + 2.07e-4) * $P / (
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   456
		  ($T * 4.464e-4 + .03426) * $T + 1. + ($T *
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   457
		  -.003107 + .4215) * $r__) + 1.));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   458
		$rt = sqrt(abs($rt));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   459
		return (((($rt * 2.7081 - 7.0261) * $rt + 14.0941) *
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   460
		   $rt + 25.3851) * $rt - .1692) * $rt + .008 + 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   461
		  $dt / ($dt * .0162 + 1.) * ((((($rt * -.0144 + 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   462
		  .0636) * $rt - .0375) * $rt - .0066) * $rt - 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   463
		  .0056) * $rt + 5e-4);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   464
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   465
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   466
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   467
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   468
# K15toSalin; see http://ioc.unesco.org/oceanteacher/OceanTeacher2/01_GlobOcToday/02_CollDta/02_OcDtaFunda/03_T&SScales/TemperatureAndSalinityScales.htm
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   469
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   470
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   471
sub K15toSalin(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   472
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   473
	my($K15) = &antsFunUsage(1,'f','K15',@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   474
	return  0.0080 -  0.1692 * $K15**0.5
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   475
				   + 25.3851 * $K15**1.0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   476
				   + 14.0941 * $K15**1.5
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   477
				   -  7.0261 * $K15**2.0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   478
				   +  2.7081 * $K15**2.5;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   479
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   480
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   481
#---------------------------------------------------------------------- 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   482
#	DEPTH IN METERS FROM PRESSURE IN DECIBARS USING						 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   483
#	SAUNDERS AND FOFONOFF'S METHOD.										 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   484
#	DEEP SEA RES., 1976,23,109-111.										 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   485
#	FORMULA REFITTED FOR EOS80											 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   486
#	CHECK VALUE. 9712.654 M FOR PIN=10000 DECIBARS,LATITUDE=30 DEG		 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   487
#	..CONVERT PRESSURE TO BARS
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   488
#	NB: results are closer to Saunders, JPO 11, 1981 than ref given
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   489
#	    above. They are not exact, either, however.
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   490
#---------------------------------------------------------------------- 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   491
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   492
{ my(@fc);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   493
	sub depth(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   494
	{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   495
		my($P,$lat) = &antsFunUsage(2,'..','[press(db), lat]',\@fc,'press','%lat',@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   496
		return 'nan' unless numbersp($P,$lat);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   497
		my($x) = sin($lat/57.29578);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   498
		$P *= 0.1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   499
		$x = $x*$x;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   500
		return ((((-1.82E-11*$P+2.279E-7)*$P-2.2512E-3)*$P+97.2659)*$P) /
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   501
			  (9.780318*(1.0+(5.2788E-3+2.36E-5*$x)*$x) + 1.092E-5*$P);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   502
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   503
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   504
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   505
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   506
#	Convert depth to pressure using 2nd order polynomial
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   507
#	From file pdepth.F (pexec)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   508
#	This is based on Saunders, JPO 11, 1981
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   509
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   510
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   511
{ my(@fc);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   512
	sub press(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   513
	{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   514
		my($d,$lat) = &antsFunUsage(2,'ff','[depth, lat]',\@fc,'depth','%lat',@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   515
		my($c1) = 5.92E-3 + 5.25E-3 * sin($lat/57.29578) ** 2;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   516
		my($c2) = 2.21E-6;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   517
		my($press) = (1 - $c1 - sqrt((1 - $c1)**2 - 4*$d*$c2)) / (2*$c2);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   518
		my($derr) = abs(&depth($press,$lat) - $d);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   519
	    
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   520
		&antsInfo("WARNING (libEOS83.pl): %.1gm depth error due to pressure " .
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   521
				  "approximation", $derr) if ($derr >= 1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   522
		return $press;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   523
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   524
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   525
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   526
#---------------------------------------------------------------------- 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   527
#	SOUND SPEED SEAWATER (CHEN & MILLERO 1977, JASA,62,1129-1135) 		 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   528
#	SPEED IN M/S, P IN DECIBARS, T DEG C (IPTS-68), S NSU(IPSS-78) 		 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   529
#	CHECK VALUE : 1731.9954 M/S FOR PIN=10000, T=40, C,S=40 			 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   530
#	NB: - f2c used (because of fortran `equivalence')					 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   531
#---------------------------------------------------------------------- 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   532
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   533
{ my(@fc);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   534
	sub sVel(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   535
	{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   536
		my($S,$T,$P) = &antsFunUsage(3,'...','[salin, temp, press(db)]',
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   537
									 \@fc,'salin','temp','press',@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   538
		return 'nan' unless numberp($S) && numberp($T) && numberp($P);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   539
		my($temp0,$temp1,$temp2,$temp3);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   540
		my($a,$b,$c__,$d__,$sr);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   541
		my($TCONV) = &TCONV();
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   542
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   543
		$T *= $TCONV;									# T68 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   544
		$P *= .1;										# CONVERT PRESSURE TO BARS 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   545
		$sr = sqrt(abs($S));							# S**2 TERM 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   546
		$d__ = .001727 - $P * 7.9836e-6;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   547
		$temp1 = $T * 1.7945e-7 + 7.3637e-5;			# S**3/2 TERM 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   548
		$temp0 = -.01922 - $T * 4.42e-5;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   549
		$b = $temp0 + $temp1 * $P;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   550
		$temp3 = ($T * -3.389e-13 + 6.649e-12) * $T + 1.1e-10;	# S**1 TERM 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   551
		$temp2 = (($T * 7.988e-12 - 1.6002e-10) * $T + 9.1041e-9) * $T - 3.9064e-7;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   552
		$temp1 = ((($T * -2.0122e-10 + 1.0507e-8) * $T - 6.4885e-8) * $T
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   553
			- 1.258e-5) * $T + 9.4742e-5;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   554
		$temp0 = ((($T * -3.21e-8 + 2.006e-6) * $T + 7.164e-5) * $T - .01262)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   555
			* $T + 1.389;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   556
		$a = (($temp3 * $P + $temp2) * $P + $temp1) * $P + $temp0;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   557
		$temp3 = ($T * -2.3643e-12 + 3.8504e-10) * $T - 9.7729e-9;	# S**0 TERM 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   558
		$temp2 = ((($T * 1.0405e-12 - 2.5335e-10) * $T + 2.5974e-8) * $T
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   559
			- 1.7107e-6) * $T + 3.126e-5;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   560
		$temp1 = ((($T * -6.1185e-10 + 1.3621e-7) * $T - 8.1788e-6) * $T
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   561
			+ 6.8982e-4) * $T + .153563;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   562
		$temp0 = (((($T * 3.1464e-9 - 1.478e-6) * $T + 3.342e-4) * $T - .0580852)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   563
			* $T + 5.03711) * $T + 1402.388;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   564
		$c__ = (($temp3 * $P + $temp2) * $P + $temp1) * $P + $temp0;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   565
		return $c__ + ($a + $b * $sr + $d__ * $S) * $S; 		# SOUND SPEED RETURN 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   566
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   567
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   568
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   569
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   570
# PART II: Homegrown Stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   571
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   572
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   573
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   574
# &alpha(S,T,P)		linear thermal expansion coefficient
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   575
# 	Notes:			- use temperature interval of 0.2 degrees
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   576
#					- depth instead of pressure ok
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   577
# 	Check Value:	- alpha(35,2,6000) = 0.000209447279306853
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   578
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   579
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   580
sub alpha(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   581
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   582
	my($S,$T,$P) = &antsFunUsage(3,"fff","salin, temp, press | depth",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   583
	return (&sigma($S,$T-.1,$P,$P) - &sigma($S,$T+.1,$P,$P))
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   584
			/ (.2 * (1000+&sigma($S,$T,$P,$P)));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   585
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   586
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   587
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   588
# &beta(S,T,P)		linear haline contraction coefficient
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   589
# 	Notes:			- use salinity interval of 0.02 psu
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   590
#					- depth instead of pressure ok
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   591
# 	Check Value:	- beta(35,2,6000) = 0.000718513652714652 (should check Gill)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   592
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   593
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   594
sub beta(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   595
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   596
	my($S,$T,$P) = &antsFunUsage(3,"fff","salin, temp, press | depth",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   597
	return (&sigma($S+0.01,$T,$P,$P) - &sigma($S-0.01,$T,$P,$P))
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   598
			/ (.02 * (1000+&sigma($S,$T,$P,$P)));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   599
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   600
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   601
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   602
# &Rrho(midS,S0,S1,midT,T0,T1,midP,P0,P1)	stability ratio
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   603
# 	Notes:			- depth instead of pressure ok
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   604
# 	Check Value:	- Rrho(35.05,35.1,35,4.27,4.82,3.72,2100,2100,2100) = 2.222
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   605
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   606
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   607
sub alphaDT(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   608
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   609
	my($S,$T0,$T1,$P,$P0,$P1) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   610
#		&antsFunUsage(6,"ffffff","S, T0, T1, P, P0, P1",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   611
	my($sgn) = ($P1 > $P0) ? 1 : -1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   612
	return $sgn * (&sigma($S,$T1,$P1,$P) - &sigma($S,$T0,$P0,$P));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   613
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   614
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   615
sub betaDS(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   616
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   617
	my($S0,$S1,$T,$P,$P0,$P1) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   618
#		&antsFunUsage(6,"ffffff","S0, S1, T, P, P0, P1",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   619
	my($sgn) = ($P1 > $P0) ? 1 : -1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   620
	return $sgn * (&sigma($S0,$T,$P0,$P) - &sigma($S1,$T,$P1,$P));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   621
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   622
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   623
sub Rrho(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   624
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   625
	my($S,$S0,$S1,$T,$T0,$T1,$P,$P0,$P1) =
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   626
		&antsFunUsage(9,"fffffffff","S, S0, S1, T, T0, T1, P, P0, P1",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   627
	my($aDT) = &alphaDT($S,$T0,$T1,$P,$P0,$P1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   628
	my($bDS) = &betaDS($S0,$S1,$T,$P,$P0,$P1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   629
	return $bDS == 0 ? 'nan' : $aDT / $bDS;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   630
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   631
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   632
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   633
# &TurnerAngle(midS,S0,S1,midT,T0,T1,midP,P0,P1)	Turner Angle
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   634
# 	Notes:						- c.f. &Rrho()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   635
#								- -45<Tu<45 	doubly stable
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   636
#								- Tu<-90, Tu>90 statically unstable
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   637
#								- 45<Tu<90 		fingering regime
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   638
#								- -90<Tu<-45	diffusive regime
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   639
# 	Check Value: TurnerAngle(35.05,35.1,35,4.27,4.82,3.72,2100,2100,2100.01) = 69.2296333539803
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   640
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   641
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   642
sub TurnerAngle(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   643
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   644
	my($S,$S0,$S1,$T,$T0,$T1,$P,$P0,$P1) =
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   645
		&antsFunUsage(9,"fffffffff","S, S0, S1, T, T0, T1, P, P0, P1",@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   646
	my($aDT) = &alphaDT($S,$T0,$T1,$P,$P0,$P1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   647
	my($bDS) = &betaDS($S0,$S1,$T,$P,$P0,$P1);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   648
	return atan2($aDT+$bDS,$aDT-$bDS)*57.29577951;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   649
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   650
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   651
1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   652