U bent hier » http://www.goudappel.org/ ooor/oceanlib.php

Notice: Undefined variable: N in /home/sites/site42004/web/ooor/oceanlib.php on line 19

Notice: Undefined variable: G in /home/sites/site42004/web/ooor/oceanlib.php on line 20

Notice: Undefined variable: I in /home/sites/site42004/web/ooor/oceanlib.php on line 472

Oceanografische gereedschapset

De algoritmen en constanten zijn voorgeschreven door de UNESCO.
International Equation of State (IES 80) as described in Fofonoff, JGR, Vol 90 No. C2, pp 3332-3342, March 20, 1985


Program Density (input,output);
{Maart/September 1995 Henk Goudappel}
{worden UNITS CTD_NIOZ}


Uses Crt,Turbo3; {hoop ik..}

Label Start,Einde;

Var
Conductiviteit,Pressure,CRatio,
Salt,Temperature,lattitude,reference : Real;
Antwoord                             : Char;

Function Salinity(CRatio,Temperature,Pressure:Real):Real;
  Var
  A                      : Array [27..51] of Real;
  y                      : Real;

  Begin
    A[27] :=  0.0080     ;
    A[28] := -0.1692     ;
    A[29] := 25.3851     ;
    A[30] := 14.0941     ;
    A[31] := -7.0261     ;
    A[32] :=  2.7081     ;
    A[33] :=  2.070e-4   ;
    A[34] := -6.370e-8   ;
    A[35] :=  3.989e-12  ;
    A[36] :=  3.426e-2   ;
    A[37] :=  4.464e-4   ;
    A[38] :=  4.215e-1   ;
    A[39] := -3.107e-3   ;
    A[40] :=  0.6766097  ;
    A[41] :=  2.00564e-2 ;
    A[42] :=  1.104259e-4;
    A[43] := -6.9698e-7  ;
    A[44] :=  1.0031e-9  ;
    A[45] :=  0.0005     ;
    A[46] := -0.0056     ;
    A[47] := -0.0066     ;
    A[48] := -0.0375     ;
    A[49] :=  0.0636     ;
    A[50] := -0.0144     ;
    A[51] :=  0.0162     ;
  y :=  CRatio/((1+(Pressure*(A[33]+
                          A[34]*Pressure+
                          A[35]*Pressure*Pressure))/
                       (1+A[36]*Temperature+
                          A[37]*Temperature*Temperature+
                         (A[38]+
                          A[39]*Temperature)*CRatio))*
                         (A[40]+
                          A[41]*Temperature+
                          A[42]*Temperature*Temperature+
                          A[43]*Temperature*Temperature*Temperature+
                          A[44]*Temperature*Temperature*Temperature*Temperature));
    Salinity  := A[27]+
                 A[28]*SqRt(y)+
                 A[29]*y+
                 A[30]*SqRt(y)*y+
                 A[31]*y*y+
                 A[32]*SqRt(y)*y*y+
                (Temperature-15)*(
                 A[45]+
                 A[46]*SqRt(y)+
                 A[47]*y+
                 A[48]*SqRt(y)*y+
                 A[49]*y*y+
                 A[50]*SqRt(y)*y*y)/
             (1+(A[51]*(Temperature-15)));
end; {Function Salinity}

Function Dens(Salt,Temperature,Pressure:Real):Real;
  Var
  A                       : Array[0..5] of Real;
  B,E                     : Array[0..4] of Real;
  C,G,I,K,M               : Array[0..2] of Real;
  F,H                     : Array[0..3] of Real;
  D,J                     : Real;

  Begin
    A[0] :=  0.999842594e3;
    A[1] :=  6.793952e-2  ;
    A[2] := -9.095290e-3  ;
    A[3] :=  1.001685e-4  ;
    A[4] := -1.120083e-6  ;
    A[5] :=  6.536332e-9  ;
    B[0] :=  8.24493e-1   ;
    B[1] := -4.0899e-3    ;
    B[2] :=  7.6438e-5    ;
    B[3] := -8.2467e-7    ;
    B[4] :=  5.3875e-9    ;
    C[0] := -5.72466e-3   ;
    C[1] :=  1.0227e-4    ;
    C[2] := -1.6546e-6    ;
    D    :=  4.8314e-4    ;
    E[0] :=  1.965221e4   ;
    E[1] :=  1.484206e2   ;
    E[2] := -2.327105     ;
    E[3] :=  1.360477e-2  ;
    E[4] := -5.155288e-5  ;
    F[0] :=  5.4676e1     ;
    F[1] := -0.603459     ;
    F[2] :=  1.09987e-2   ;
    F[3] := -6.1670e-5    ;
    G[0] :=  7.944e-2     ;
    G[1] :=  1.6483e-2    ;
    G[2] := -5.3009e-4    ;
    H[0] :=  3.239908     ;
    H[1] :=  1.43713e-3   ;
    H[2] :=  1.16092e-4   ;
    H[3] := -5.77905e-7   ;
    I[0] :=  2.2838e-3    ;
    I[1] := -1.0981e-5    ;
    I[2] := -1.6078e-6    ;
    J    :=  1.91075e-4   ;
    K[0] :=  8.50935e-5   ;
    K[1] := -6.12293e-6   ;
    K[2] :=  5.2787e-8    ;
    M[0] := -9.9348e-7    ;
    M[1] :=  2.0816e-8    ;
    M[2] :=  9.1697e-10   ;

    Dens := (((A[0]+
                  A[1]*Temperature+
                  A[2]*Temperature*Temperature+
                  A[3]*Temperature*Temperature*Temperature+
                  A[4]*Temperature*Temperature*Temperature*Temperature+
                  A[5]*Temperature*Temperature*Temperature*Temperature*Temperature)+
                 (B[0]+
                  B[1]*Temperature+
                  B[2]*Temperature*Temperature+
                  B[3]*Temperature*Temperature*Temperature+
                  B[4]*Temperature*Temperature*Temperature*Temperature)*Salt)+
                ((C[0]+
                  C[1]*Temperature+
                  C[2]*Temperature*Temperature)*
                  SqRt(Salt)*Salt+D*Salt*Salt))/(1-(Pressure)/
               (((E[0]+
                  E[1]*Temperature+
                  E[2]*Temperature*Temperature+
                  E[3]*Temperature*Temperature*Temperature+
                  E[4]*Temperature*Temperature*Temperature*Temperature)+
                 (F[0]+
                  F[1]*Temperature+
                  F[2]*Temperature*Temperature+
                  F[3]*Temperature*Temperature*Temperature)*Salt)+
                ((G[0]+
                  G[1]*Temperature+
                  G[2]*Temperature*Temperature)*SqRt(Salt)*Salt)+
                ((H[0]+
                  H[1]*Temperature+
                  H[2]*Temperature*Temperature+
                  H[3]*Temperature*Temperature*Temperature)+
                 (I[0]+
                  I[1]*Temperature+
                  I[2]*Temperature*Temperature)*Salt+J*SqRt(Salt)*Salt)*Pressure+
                ((K[0]+
                  K[1]*Temperature+
                  K[2]*Temperature*Temperature)+
                 (M[0]+
                  M[1]*Temperature+
                  M[2]*Temperature*Temperature)*Salt)*Pressure*Pressure));
end; {Function Dens}

Function Soundspeed(Salt,Temperature,Pressure:Real):Real;
  Var
  A,C : array[0..32] of Real;
  B,D : array[0..11] of Real;
  sr,dd,bb,aa,cc  : Real;

  Begin
    C[0] := 1402.388;
    C[1] :=    5.03711;
    C[2] :=   -5.80852e-2;
    C[3] :=    3.3420e-4;
		C[4] :=   -1.47800e-6;
		C[5] :=    3.1464e-9;

		C[10]:=    0.153563;
		C[11]:=    6.8982e-4;
		C[12]:=   -8.1788e-6;
		C[13]:=    1.3621e-7;
		C[14]:=   -6.1185e-10;

		C[20]:=    3.1260e-5;
		C[21]:=   -1.7107e-6;
		C[22]:=    2.5974e-8;
		C[23]:=   -2.5335e-10;
		C[24]:=    1.0405e-12;
		C[30]:=   -9.7729e-9;
		C[31]:=    3.8504e-10;
		C[32]:=   -2.3643e-12;

		A[0] :=    1.389;
		A[1] :=   -1.262e-2;
		A[2] :=    7.164e-5;
		A[3] :=    2.006e-6;
		A[4] :=   -3.21e-8;

		A[10]:=    9.4742e-5;
		A[11]:=   -1.2580e-5;
		A[12]:=   -6.4885e-8;
		A[13]:=    1.0507e-8;
		A[14]:=   -2.0122e-10;

		A[20]:=   -3.9064e-7;
		A[21]:=    9.1041e-9;
		A[22]:=   -1.6002e-10;
		A[23]:=    7.988e-12;

		A[30]:=    1.100e-10;
		A[31]:=    6.649e-12;
		A[32]:=   -3.389e-13;

		B[0] :=   -1.922e-2;
		B[1] :=   -4.42e-5;
		B[10]:=    7.3637e-5;
		B[11]:=    1.7945e-7;

		D[0] :=    1.727e-3;
		D[10]:=   -7.9836e-6;

  Soundspeed := ((((C[32]*Temperature+C[31])*Temperature+C[30])*Pressure+
              ((((C[24]*Temperature+C[23])*Temperature+C[22])*Temperature+C[21])*Temperature+C[20]))*Pressure+
              ((((C[14]*Temperature+C[13])*Temperature+C[12])*Temperature+C[11])*Temperature+C[10]))*Pressure+
              (((((C[5]*Temperature+C[4])*Temperature+C[3])*Temperature+C[2])*Temperature+C[1])*Temperature+C[0])+
              (((((A[32]*Temperature+A[31])*Temperature+A[30])*Pressure+
              (((A[23]*Temperature+A[22])*Temperature+A[21])*Temperature+A[20]))*Pressure+
              ((((A[14]*Temperature+A[13])*Temperature+A[12])*Temperature+A[11])*Temperature+A[10]))*Pressure+
              ((((A[4]*Temperature+A[3])*Temperature+A[2])*Temperature+A[1])*Temperature+A[0])+
              (B[0]+B[1]*Temperature+(B[10]+B[11]*Temperature)*Pressure)*
              (SqRt(abs(Salt)))+
              (D[0]+D[10]*Pressure)*Salt)*Salt;
end;

Function Depth(Pressure,Lattitude:Real):Real;
  Var
  C,g   : array[1..4] of Real;
  lc    : Real;
  Begin
    Pressure :=  Pressure*10  ;
    C[1] :=  9.72659  ;
		C[2] := -2.2512e-5;
		C[3] :=  2.279e-10;
		C[4] := -1.82e-15 ;
    g[1] :=  5.2788e-3;
		g[2] :=  2.36e-5  ;
		g[3] :=  1.092e-6 ;
		g[4] :=  9.780318 ;
    lc   := 57.29578  ;
Depth := ((((C[4]*Pressure+C[3])*Pressure+C[2])*Pressure+C[1])*Pressure)/
          (g[4]*(1+(g[1]+g[2]*(sqr(sin(lattitude/lc))))*
					(sqr(sin(lattitude/lc))))+g[3]*Pressure);
end;

Function Freezing_Point(Salt,Pressure:Real):Real;
Var
A : array[0..2] of Real;
B : Real;
Begin
  A[0] := -0.0575     ;
	A[1] :=  1.710523e-3;
	A[2] := -2.154996e-4;
  B    := -7.53e-4    ;
Freezing_Point := (A[0]+A[1]*SqRt(Abs(Salt))+A[2]*Salt)*Salt+B*Pressure;
end;

Function Adiabatic_lapse_rate(Salt,Temperature,Pressure:real):real;
Var
A,B,C,D,E : array[0..3] of Real;
Begin
   A[0] :=  3.5803e-5 ;
	A[1] :=  8.5258e-6 ;
	A[2] := -6.8360e-8 ;
	A[3] :=  6.6228e-10;
   B[0] :=  1.8932e-6 ;
	B[1] := -4.2393e-8 ;
   C[0] :=  1.8741e-8 ;
	C[1] := -6.7795e-10;
	C[2] :=  8.7330e-12;
	C[3] := -5.4481e-14;
   D[0] := -1.1351e-10;
	D[1] :=  2.7759e-12;
   E[0] := -4.6206e-13;
	E[1] :=  1.8676e-14;
	E[2] := -2.1687e-16;
Adiabatic_lapse_rate := (((E[2]*Temperature+E[1])*Temperature+E[0])*Pressure+
                         ((D[1]*Temperature+D[0])*(Salt-35)+
                         ((C[3]*Temperature+C[2])*Temperature+C[1])*Temperature+C[0]))*Pressure+
                          (B[1]*Temperature+B[0])*(Salt-35)+
                         ((A[3]*Temperature+A[2])*Temperature+A[1])*Temperature+A[0];
end;

Function Specific_Heat(Salt,Temperature,Pressure:Real):Real;
Var
A,AA,B,BB,C,CC,D,E,F,H      : array[0..4] of Real;
G,J,Cp,Delta2_Cp,Delta1_Cp  : Real;

Begin
  A[0] := -7.643575  ;
  A[1] :=  0.1072763 ;
  A[2] := -1.38385e-3;

  B[0] :=  0.1770383 ;
  B[1] := -4.07718e-3;
  B[2] :=  5.148e-5  ;

  C[0] :=  4217.4    ;
  C[1] := -3.720283  ;
  C[2] :=  0.1412855 ;
  C[3] := -2.654387e-3;
  C[4] :=  2.093236e-5;

  AA[0] := -4.9592e-1;
  AA[1] :=  1.45747e-2;
  AA[2] := -3.13885e-4;
  AA[3] :=  2.0357e-6;
  AA[4] :=  1.7168e-8;

  BB[0] :=  2.4931e-4;
  BB[1] := -1.08645e-5;
  BB[2] :=  2.87533e-7;
  BB[3] := -4.0027e-9;
  BB[4] :=  2.2956e-11;

  CC[0] := -5.422e-8 ;
  CC[1] :=  2.6380e-9;
  CC[2] := -6.5637e-11;
  CC[3] :=  6.136e-13;

  D[0] :=  4.9247e-3 ;
  D[1] := -1.28315e-4;
  D[2] :=  9.802e-7  ;
  D[3] :=  2.5941e-8 ;
  D[4] := -2.9179e-10;

  E[0] := -1.2331e-4 ;
  E[1] := -1.517e-6  ;
  E[2] :=  3.122e-8  ;

  F[0] := -2.9558e-6 ;
  F[1] :=  1.17054e-7;
  F[2] := -2.3905e-9 ;
  F[3] :=  1.8448e-11;

  G    :=  9.971e-8  ;

  H[0] :=  5.540e-10 ;
  H[1] := -1.7682e-11;
  H[2] :=  3.513e-13 ;

  J    := -1.4300e-12;

Specific_Heat :=           ((C[0]+
	                          C[1]*Temperature+
									  C[2]*Temperature*Temperature+
									  C[3]*Temperature*Temperature*Temperature+
									  C[4]*Temperature*Temperature*Temperature*Temperature)+
                  ((A[0]+A[1]*Temperature+A[2]*Temperature*Temperature)*Salt)+
                  ((B[0]+B[1]*Temperature+B[2]*Temperature*Temperature)*SqRt(Salt)*Salt))+
					            ((AA[0]+
	                          AA[1]*Temperature+
									  AA[2]*Temperature*Temperature+
									  AA[3]*Temperature*Temperature*Temperature+
									  AA[4]*Temperature*Temperature*Temperature*Temperature)*Pressure+
									((BB[0]+
	                          BB[1]*Temperature+
									  BB[2]*Temperature*Temperature+
									  BB[3]*Temperature*Temperature*Temperature+
									  BB[4]*Temperature*Temperature*Temperature*Temperature)*Pressure*Pressure)+
                           ((CC[0]+
	                          CC[1]*Temperature+
									  CC[2]*Temperature*Temperature+
									  CC[3]*Temperature*Temperature*Temperature)*Pressure*Pressure*Pressure))+
                         (((((D[0]+
	                           D[1]*Temperature+
									   D[2]*Temperature*Temperature+
									   D[3]*Temperature*Temperature*Temperature+
									   D[4]*Temperature*Temperature*Temperature*Temperature)*Salt)+
                            ((E[0]+
					 				   E[1]*Temperature+
									   E[2]*Temperature*Temperature+
									   E[3]*Temperature*Temperature*Temperature)*(SqRt(Salt)*Salt)))*Pressure)+
          		        	  ((((F[0]+
									   F[1]*Temperature+
									   F[2]*Temperature*Temperature+
									   F[3]*Temperature*Temperature*Temperature)*Salt)+
           		      (G*(SqRt(Salt)*Salt)))*Pressure*Pressure)+
                          ((((H[0]+
									   H[1]*Temperature+
									   H[2]*Temperature*Temperature)*Salt)+
                    (J*Temperature*(SqRt(Salt)*Salt)))*Pressure*Pressure*Pressure));
end;

{Function Potential_Temperature(Salt,Temperature,Pressure,Reference:Real):Real;
Var
Begin
end;}

Procedure Signon;
Begin
   GoToXY(5,10);
   Write('Program Density calculates the Density and other properties of seawater        ');
   GoToXY(5,12);
   Write('         Variabeles are: Temperature, Pressure and Lattitude        ');
   GoToXY(5,13);
   Write('        and either Salinity, Conductivity or ConductivityRatio.      ');
   GoToXY(5,11);
   Write('            Version 1.0 March 1995 Henk Goudappel NIOZ Texel         ');
end;

Procedure UitvoerScherm;
Begin
                      WriteLn('Temperature                      : ',
                      Temperature:10:4,                         ' C');
                      WriteLn('Pressure                         : ',
                      Pressure*10:10:4,                         ' DBar');
                      WriteLn('Density                          : ',
                      Dens(Salt,Temperature,Pressure):10:4,     ' kg/m^3');
                      WriteLn('                                : ',
                      Dens(Salt,Temperature,Pressure)-1000:10:4,' kg/m^3');
                      WriteLn('Specific Volume                  : ',
                      (1/Dens(Salt,Temperature,Pressure)*1000):10:4, ' l/kg');
                      WriteLn('Specific Heat                    : ',
                      Specific_heat(Salt,Temperature,Pressure):10:4,     ' J/kg/C');
							 WriteLn('Soundspeed                       : ',
    						 Soundspeed(Salt,Temperature,Pressure):10:4,    ' m/s');
  							 WriteLn('Depth                            : ',
							 Depth(Pressure,lattitude):10:4,           ' m');
                      WriteLn('Freezingpoint                    : ',
							 Freezing_point(Salt,Pressure):10:4,       ' C');
                      WriteLn('Adiabatic lapse rate             : ',
	                   Adiabatic_lapse_rate(Salt,Temperature,Pressure):10:6,' C/dbar');
end;

Procedure Invoerscherm;
Begin
                      Temperature := 40;
{                      Write('Enter Temperature (C)          : ');
                      ReadLn(Temperature);
 }
{                      Write('Enter Pressure (Bar)            : ');
                      ReadLn(Pressure);
 }									Pressure := 1000;
 {                     Write('Enter Lattitude                 : ');
                      ReadLn(Lattitude);
}                 Lattitude := 30;    {Degrees}

end;


{        MAIN     }

Begin
   
   ClrScr;
   Signon;
   Start:
   GoToXY(28,20);
   Write(' to continue ');Read(Kbd,antwoord);
   if (IoResult <> 0) then Goto Start;
   ClrScr;
   GoToXY(18,10);
   WriteLn('[C]onductivity,[R]atio,[S]alinity,[Q]uit');
   Read(Kbd,Antwoord);
   if (IoResult <> 0) then Goto Start;
   ClrScr;
   Case Antwoord of
   'C','c'        : Begin
                      Write('Enter Conductivity                : ');
                      ReadLn(Conductiviteit);
                      CRatio := Conductiviteit/42.914 ;
									    Invoerscherm;
                      ClrScr;
                      Salinity(CRatio,Temperature,Pressure);
                      Salt := Salinity(CRatio,Temperature,Pressure);
								      WriteLn('Salinity                         : ',
                      Salt:10:4,' o/oo');
                      UitvoerScherm;
                    GoTo Start;
                    end;
   'R','r'        : Begin
                      Write('Enter ConductivityRatio           : ');
                      ReadLn(CRatio);
                      Invoerscherm;
                      ClrScr;
                      Salt := Salinity(CRatio,Temperature,Pressure);
								      WriteLn('Salinity                         : ',
                      Salt:10:4,' o/oo');
                      UitvoerScherm;
                    GoTo Start;
                    end;
   'S','s'        : Begin
                      Write('Enter Salinity (o/oo)    : ');
                      ReadLn(Salt);
                      Invoerscherm;
                      ClrScr;
                      WriteLn('Salinity                         : ',
                      Salt:10:4,' o/oo');
                      Uitvoerscherm;
                      GoTo Start;
                    end;
   'Q','q'        : Begin
                      GoToXY(30,10);
                      WriteLn('Quit [y/N] ?');
                      Read(Kbd,Antwoord);
                      if (IoResult <> 0) then GoTo Start;
                      Case Antwoord of
                         'Y','y','j','J': GoTo Einde;
                      Else GoTo Start;
                      end; {case}
                    end;
   Else GoTo Start;
   end; {case}
Einde:
end.


Function Pot_Temp((Salt,Temperature,Pressure:real):real;

{      PRESS  -> PRESSURE IN DECIBARS
       TEMP   -> TEMPERATURE IN CELSIUS DEGREES
       S      -> SALINITY PSS 78
       RP     -> REFERENCE PRESSURE IN DECIBARS
                 (0.0 FOR THE QUANTITY THETA)
       POTEMP <- POTENTIAL TEMPERATURE (DEG C)

       REAL PRESS,TEMP,S,RP,POTEMP    }
     VAR
          I,J,N    :      INTEGER;
          DP,P,Q,R1,R2,R3,R4,R5,S1,T,X :REAL;
     begin
      S1 := Salt-35.0;
      P  := PRESSure ;
      T  := TEMPerature ;
      DP := RP - P     ;
      N  := FIX(ABS(DP)/1000.) + 1 ;
      DP := DP/FLOAT(N)
      DO 10 I:=1,N
         DO 20 J=1,4
            R1 = ((-2.1687E-16*T+1.8676E-14)*T-4.6206E-13)*P
            R2 = (2.7759E-12*T-1.1351E-10)*S1
            R3 = ((-5.4481E-14*T+8.733E-12)*T-6.7795E-10)*T
            R4 = (R1+(R2+R3+1.8741E-8))*P+(-4.2393E-8*T+1.8932E-6)*S1
            R5 = R4+((6.6228E-10*T-6.836E-8)*T+8.5258E-6)*T+3.5803E-5
            X  = DP*R5
            GO TO (100,200,300,400),J
  100       CONTINUE
            T = T+.5*X
            Q = X
            P = P + .5*DP
            GO TO 20
  200       CONTINUE
            T = T + .29298322*(X-Q)
            Q = .58578644*X + .121320344*Q
            GO TO 20
  300       CONTINUE
            T = T + 1.707106781*(X-Q)
            Q = 3.414213562*X - 4.121320344*Q
            P = P + .5*DP
            GO TO 20
  400       CONTINUE
            T = T + (X-2.0*Q)/6.0
  20      CONTINUE
  10    CONTINUE
        POTEMP = T
        RETURN
       END POTMP
  END


Er is ook een JavaScript van


	var depth,p,t,c,s,d,sp,cp;
	
	var binaryLimit = 1000;
	var lat = 30.0;
	
	function initializeVars() {
		document.state.depth.value = 0.0;
		document.state.p.value = 0.0;
		document.state.t.value = 15.0;
		document.state.c.value = 4.29140;
		document.state.s.value = 35.00;
		document.state.d.value = 1025.97;
		document.state.sp.value = 1506.7;
		document.state.cp.value = 3989.8;
		document.state.tf.value = -1.922;
		document.state.lr.value = 0.150544;
		document.state.pt.value = 15.0;
		
		document.state.depthb.checked = false;
		document.state.pb.checked = true;
		document.state.tb.checked = true;
		document.state.cb.checked = true;
		document.state.sb.checked = false;
		document.state.db.checked = false;
	}
   
	function changeSelDepth() {
		document.state.pb.checked = !document.state.depthb.checked;
	}
   	
	function changeSelPress() {
		document.state.depthb.checked = !document.state.pb.checked;
	}
   
   function changeSelection() {
   	if ( !check2of4buttons() ) return;
		if ( document.state.tb.checked ) {
			changeTemperature();
		} else if ( document.state.cb.checked ) {
			changeConductivity();
		} else if ( document.state.sb.checked ) {
			changeSalinity();
		}
   }
   
	function check2of4buttons() {
		var i = 0;
   		
		if ( document.state.tb.checked == true ) ++i;
		if ( document.state.cb.checked == true ) ++i;
		if ( document.state.sb.checked == true ) ++i;
		if ( document.state.db.checked == true ) ++i;
   		
		return ( i == 2 );
	}
	
	function checkVars() {
		if ( typeof depth != 'number' ) depth = eval(document.state.depth.value);
		if ( typeof p != 'number' ) p = eval(document.state.p.value);
		if ( typeof t != 'number' ) t = eval(document.state.t.value);
		if ( typeof c != 'number' ) c = eval(document.state.c.value);
		if ( typeof s != 'number' ) s = eval(document.state.s.value);
		if ( typeof d != 'number' ) d = eval(document.state.d.value);
	}	

	//
	// These functions are called when a parameter is changed to recompute the display
	//	
	function changeDepth() {
		checkVars();
		depth = eval(document.state.depth.value);
		document.state.depthb.checked = true;
		document.state.pb.checked = false;
		pressure_depth();
		changeDepthPressure();
	}
	   	
	function changePressure() {
		checkVars();
		p = eval(document.state.p.value);
		document.state.p.value = p;
		document.state.depthb.checked = false;
		document.state.pb.checked = true;
		depth_p();
		changeDepthPressure();
	}
	
	function changeDepthPressure() {
		if ( document.state.tb.checked )
			changeTemperature();
		else if ( document.state.cb.checked )
			changeConductivity();
		else if ( document.state.sb.checked )
			changeSalinity();
		computeOthers();
	}
	
	function changeTemperature() {
		checkVars();
		t = eval(document.state.t.value);
		document.state.t.value = t;
		document.state.tb.checked = true;
		if( !check2of4buttons() ) {
			window.alert('Exactly two of the bottom 4 buttons must be selected.');
			return;
		}
		if ( document.state.cb.checked ) {
			salinity_ctp();
			density_stp();
		} else if ( document.state.sb.checked ) {
			conductivity_stp();
			density_stp();
		} else if ( document.state.db.checked ) {
			salinity_dtp();
			conductivity_stp();
		}
		computeOthers();
	}
	   	
	function changeConductivity() {
		checkVars();
		c = eval(document.state.c.value);
		document.state.c.value = c;
		document.state.cb.checked = true;
		if( !check2of4buttons() ) {
			window.alert('Exactly two of the bottom 4 buttons must be selected.');
			return;
		}
		if ( document.state.tb.checked ) {
			salinity_ctp();
			density_stp();
		} else if ( document.state.sb.checked ) {
			temperature_csp();
			density_stp();
		} else if ( document.state.db.checked ) {
			tempSalt_dcp();
		}
		computeOthers();
	}
	   	
	function changeSalinity() {
		checkVars();
		s = eval(document.state.s.value);
		document.state.s.value = s;
		document.state.sb.checked = true;
		if( !check2of4buttons() ) {
			window.alert('Exactly two of the bottom 4 buttons must be selected.');
			return;
		}
		if ( document.state.tb.checked ) {
			conductivity_stp();
			density_stp();
		} else if ( document.state.cb.checked ) {
			temperature_csp();
			density_stp();
		} else if ( document.state.db.checked ) {
			temperature_dsp();
			conductivity_stp();
		}
		computeOthers();
	}
	   	
	function changeDensity() {
		checkVars();
		d = eval(document.state.d.value);
		document.state.d.value = d;
		document.state.db.checked = true;
		if( !check2of4buttons() ) {
			window.alert('Exactly two of the bottom 4 buttons must be selected.');
			return;
		}
		if ( document.state.tb.checked ) {
			salinity_dtp();
			conductivity_stp();
		} else if ( document.state.cb.checked ) {
			tempSalt_dcp();
		} else if ( document.state.sb.checked ) {
			temperature_dsp();
			conductivity_stp();
		}
		computeOthers();
	}
   	
	//
	// These functions are called to compute one parameter from the others
 	//
	function round(x,n) {
		var scl = 1;
		
		if ( typeof x != 'number' ) return x;
		for(i=n;i;--i) scl *= 10.0;
		return Math.round( scl * x ) / scl;
	}
	
 	function depth_p() {
 		var slat = Math.sin(30*3.14159265/180.0);
 		var c1 = 5.92e-3 + 5.25e-3 * slat * slat;
 		var c2 = 2.21e-6;
 		
  		depth = ((1-c1) - c2 * p) * p;
  		document.state.depth.value = round(depth,3);
  	}

 	function pressure_depth() {
 		var slat = Math.sin(30*3.14159265/180.0);
 		var c1 = 5.92e-3 + 5.25e-3 * slat * slat;
 		var c2 = 2.21e-6;

		p = ((1-c1)-Math.sqrt((1-c1)*(1-c1)-4*c2*depth)) / (2*c2)
  		document.state.p.value = round(p,4);
  	}

 	function conductivity_stp() {
  		c = conductivity(s,t,p);
  		document.state.c.value = round(c,6);
  	}

 	function density_stp() {
  		d = density(s,t,p);
  		document.state.d.value = round(d,6);
  	}

 	function salinity_ctp() {
  		s = salinity(c,t,p);
  		document.state.s.value = round(s,6);
  	}

 	function salinity_dtp() {
  		s = salinityd(d,t,p);
  		document.state.s.value = round(s,6);
  	}

 	function temperature_dsp() {
  		t = temperatureds(d,s,p);
  		document.state.t.value = round(t,6);
  	}

 	function temperature_csp() {
  		t = temperaturecs(c,s,p);
  		document.state.t.value = round(t,6);
  	}

 	function tempSalt_dcp() {
  		tempSaltdc(d,c,p);
  		document.state.t.value = round(t,6);
  		document.state.s.value = round(s,6);
  	}
  	
  	function computeOthers() {
  		sp = soundSpeed(s,t,p/10);
  		document.state.sp.value = round(sp,1);
  		cp = specificHeat(s,t,p/10);
  		document.state.cp.value = round(cp,1);
		tf = freezingPoint(s,p);
  		document.state.tf.value = round(tf,3);
  		lr = 1000 * adiabaticLapseRate(s,t,p);
  		document.state.lr.value = round(lr,6);
  		pt = potentialTemperature(s,t,p);
  		document.state.pt.value = round(pt,5);
  	}


	//
	// These functions are called in the computation of parameters
 	//
 	
 	// Compute temp and salinity from density, conductivity and pressure
 	function tempSaltdc(d,c,p) {
		var tlo = 0.0;
		var thi = 100.0;
		var err = 1.0;
		
		var dNew;
		
		var i = 0;
		
		while( (Math.abs(err) > 0.00001) && (i < binaryLimit) ) {
			t = (thi+tlo) / 2.0;
			s = salinity(c,t,p)
			dNew = density(s,t,p);
			err = (dNew-d) / d;
			if (err < 0.0)
				thi = t;
			else
				tlo = t;
			++i;
		}
		if ( i >= binaryLimit ) {
			t = Number.NaN;
			s = Number.NaN;
		}
 	}
 	
 	// Compute temperature from conductivity, salinity and pressure
	function temperaturecs(c,s,p) {
		var tmp;
		
		var tlo = 0.0;
		var thi = 100.0;
		var err = 1.0;
		
		var sNew;
		
		var i = 0;
		
		while( (Math.abs(err) > 0.00001) && (i < binaryLimit) ) {
			tmp = (thi+tlo) / 2.0;
			sNew = salinity(c,tmp,p);
			err = (sNew-s) / s;
			if (err < 0.0)
				thi = tmp;
			else
				tlo = tmp;
			++i;
		}
		if ( i >= binaryLimit )
			return Number.NaN;
		else
			return tmp;
 	}
 	
 	// Compute temperature from density, salinity and pressure
	function temperatureds(d,s,p) {
		var tmp;
		
		var tlo = 0.0;
		var thi = 100.0;
		var err = 1.0;
		
		var dNew;
		
		var i = 0;
		
		while( (Math.abs(err) > 0.00001) && (i < binaryLimit) ) {
			tmp = (thi+tlo) / 2.0;
			dNew = density(s,tmp,p);
			err = (dNew-d) / d;
			if (err < 0.0)
				thi = tmp;
			else
				tlo = tmp;
			++i;
		}
		if ( i >= binaryLimit )
			return Number.NaN;
		else
			return tmp;
 	}
 	
 	// Compute salinity (psu) from density, temperature and pressure
 	function salinityd(d,t,p) {
		var sal;
		
		var slo = 0.0;
		var shi = 100.0;
		var err = 1.0;
		
		var dNew;
		
		var i = 0;
		
		while( (Math.abs(err) > 0.00001) && (i < binaryLimit) ) {
			sal = (shi+slo) / 2.0;
			dNew = density(sal,t,p);
			err = (dNew-d) / d;
			if (err > 0.0)
				shi = sal;
			else
				slo = sal;
			++i;
		}
		if ( i >= binaryLimit )
			return Number.NaN;
		else
			return sal;
 	}
 	
 	// Compute salinity (psu) from conductivity, temperature and pressure
	function salinity(c,t,p) {
		var R,rt,Rp,Rt,A,B,C,sal;
		
		R = c / 4.29140;
		rt = 0.6766097 + t * ( 0.0200564
					   + t * ( 1.104259e-04 
					   + t * ( -6.9698e-07 
					   + t * 1.0031e-09 ) ) );
		A = 0.4215 - 0.003107 * t;
		B = 1 + t * ( 0.03426 + t * 0.0004464 );
		C = p * ( 2.07e-5 + p * ( -6.37e-10 + p * 3.989e-15 ) );
		Rp = 1 + C / ( B + A * R );
		Rt = R / rt / Rp;
		sal = s_Rt(t,Rt);
		return sal;
	}
	
	function s_Rt(t,Rt) {
		var Rt5,t15,dels,sal;
		
		Rt5 = Math.sqrt( Rt );
		t15 = t - 15;
		dels = t15 / ( 1 + 0.0162 * t15 );
		sal =  ( 14.0941 + dels * -0.0375 ) + Rt5 * ( ( -7.0261 + dels *  0.0636 )
										    + Rt5 * ( (  2.7081 + dels *  -0.0144 ) ) );
		sal = ( 0.008 + dels * 0.0005 ) + Rt5 * ( ( -0.1692 + dels * -0.0056 )
										+ Rt5 * ( ( 25.3851 + dels * -0.0066 )
										+ Rt5 * sal ) );
		return sal;
	}

	// Compute conductivity from salinity, temperature and pressure
	function conductivity(s,t,p) {
		var R,Rt,rt,A,B,C;
		
		var Rtlo = 0.0;
		var Rthi = 10.0;
		var err = 1.0;
		
		var sNew;
		
		var i = 0;
		
		if( s < 0.01 ) return 0.0;
		
		while( (Math.abs(err) > 0.00001) && (i < binaryLimit) ) {
			Rt = (Rthi+Rtlo) / 2.0;
			sNew = s_Rt(t,Rt);
			err = (sNew-s) / s;
			if (err > 0.0)
				Rthi = Rt;
			else
				Rtlo = Rt;
			++i;
		}
		if ( i >= binaryLimit )
			return Number.NaN;
		
		rt = 0.6766097 + t * ( 0.0200564
					   + t * ( 1.104259e-04 
					   + t * ( -6.9698e-07 
					   + t * 1.0031e-09 ) ) );
		A = 0.4215 - 0.003107 * t;
		B = 1 + t * ( 0.03426 + t * 0.0004464 );
		C = p * ( 2.07e-5 + p * ( -6.37e-10 + p * 3.989e-15 ) );

		R = ( Math.sqrt( (A*rt*Rt-B)*(A*rt*Rt-B) + 4*rt*Rt*A*(B+C) ) + (A*rt*Rt-B) ) / (2*A);
		return R * 4.29140;
	}
	
	// Compute density at the surface from salinity and temperature
	function density0(s,t)
	{
		var A,B,C,D,dens0;
		
		A =   1.001685e-04 + t * ( -1.120083e-06 + t * 6.536332e-09 );
		A = 999.842594 + t * (  6.793952e-02 + t * ( -9.095290e-03 + t * A ) );
		B =   7.6438e-05 + t * ( -8.2467e-07 + t * 5.3875e-09 );
		B =   0.824493 + t * ( -4.0899e-03 + t * B );
		C =  -5.72466e-03 + t * ( 1.0227e-04 - t * 1.6546e-06 );
		D = 4.8314e-04;
		dens0 = A + s * (  B + C * Math.sqrt(s) + D * s );
		return dens0;
	}
	
	// Compute density from salinity, temperature and pressure
	function density(s,t,p) {
		var d0,d,K,E,F,G,H,I,J,M,N,t2,t3,t4,s1p5,pb

		t2 = t * t;
		t3 = t2 * t;
		t4 = t3 * t;
				
		d0 = density0(s,t);
		E = 19652.21 + 148.4206 * t - 2.327105 * t2 + 1.360477e-2 * t3 - 5.155288e-5 * t4;
		F = 54.6746 - 0.603459 * t + 1.09987e-2 * t2 - 6.1670e-5 * t3;
		G = 7.944e-2 + 1.6483e-2 * t - 5.3009e-4 * t2;
		H = 3.239908 + 1.43713e-3 * t + 1.16092e-4 * t2 - 5.77905e-7 * t3;
		I = 2.2838e-3 - 1.0981e-5 * t - 1.6078e-6 * t2;
		J = 1.91075e-4;
		M = 8.50935e-5 - 6.12293e-6 * t + 5.2787e-8 * t2;
		N = -9.9348e-7 + 2.0816e-8 * t + 9.1697e-10 * t2;
		
		s1p5 = s * Math.sqrt(s);
	
		pb = p/10;
	
		K = (E + F*s + G*s1p5) + (H + I*s + J*s1p5) * pb + (M + N*s) * pb * pb;
		d = d0 / (1 - pb/K);
		return d;
	}

	// Compute speed of sound (m/s) from salinity (psu), temperature (deg C) and pressure (bar)
	function soundSpeed(s,t,p) {
		var sr,D,b1,b0,B,a3,a2,a1,a0,A,c3,c2,c1,c0,C
				
		sr = Math.sqrt(s);
		D = 1.727e-3 - 7.9836e-6 * p;
		b1 = 7.3637e-5 + 1.7945e-7 * t;
		b0 = -1.922e-2 - 4.42e-5 * t;
		B = b0 + b1 * p;
		a3 = (-3.389e-13 * t + 6.649e-12) * t + 1.100e-10;
		a2 = ((7.988e-12 * t - 1.6002e-10) * t + 9.1041e-9) * t - 3.9064e-7;
		a1 = (((-2.0122e-10 * t + 1.0507e-8) * t - 6.4885e-8) * t - 1.2580e-5) * t + 9.4742e-5;
		a0 = (((-3.21e-8 * t + 2.006e-6) * t + 7.164e-5) * t -1.262e-2) * t + 1.389;
		A = ((a3 * p + a2) * p + a1) * p + a0;
		c3 = (-2.3643e-12 * t + 3.8504e-10) * t - 9.7729e-9;
		c2 = (((1.0405e-12 * t -2.5335e-10) * t + 2.5974e-8) * t - 1.7107e-6) * t + 3.1260e-5;
		c1 = (((-6.1185e-10 * t + 1.3621e-7) * t - 8.1788e-6) * t + 6.8982e-4) * t + 0.153563;
		c0 = ((((3.1464e-9 * t - 1.47800e-6) * t + 3.3420e-4) * t - 5.80852e-2) * t + 5.03711) * t + 1402.388;
		C = ((c3 * p + c2) * p + c1) * p + c0;
		return (C + (A + B * sr + D * s) * s);
	}
	
	// Compute specific heat (J/kg/deg C) from salinity (psu), temperature (deg C) and pressure (bar)
	function specificHeat(s,t,p) {
		var sr,a,b,c,cp0,cp1,cp2,cpsw
		
		sr = Math.sqrt(s);
		// specific heat cp0 for p=0
		a = (-1.38385e-3 * t + 0.1072763 ) * t - 7.643575;
		b = (5.148e-5 * t - 4.07718e-3) * t + 0.1770383;
		c = (((2.093236e-5 * t - 2.654387e-3) * t + 0.1412855) * t - 3.720283) * t + 4217.4;
		cp0 = (b*sr+a)*s+c;
		// cp1 pressure and temperature terms for s=0
		a = (((1.7168e-8 * t + 2.0357e-6) * t - 3.13885e-4) * t + 1.45747e-2) * t - 0.49592;
		b = (((2.2956e-11 * t - 4.0027e-9) * t + 2.87533e-7) * t - 1.08645e-5) * t + 2.4931e-4;
		c = ((6.136e-13 * t - 6.5637e-11) * t + 2.6380e-9) * t - 5.422e-8;
		cp1 = ((c*p+b)*p+a)*p;
		// cp2 pressure and temperature terms for s > 0
		a = (((-2.9179e-10 * t + 2.5941e-8) * t + 9.802e-7) * t - 1.28315e-4) * t + 4.9247e-3;
		b = (3.122e-8 * t - 1.517e-6) * t - 1.2331e-4;
		a = (a+b*sr)*s;
		b = ((1.8448e-11 * t - 2.3905e-9) * t + 1.17054e-7) * t - 2.9558e-6;
		b = (b + 9.971e-8 * sr) * s;
		c = (3.513e-13 * t - 1.7682e-11) * t + 5.540e-10;
		c = (c - 1.4300e-12 * t * sr) * s;
		cp2 = ((c*p+b)*p+a)*p;
		cpsw = cp0 + cp1 + cp2;
		return cpsw;
	}
	
	// Compute freezing point of water (deg C) from salinity (psu) and pressure (dBar)
	function freezingPoint(s,p) {
		var tf;
		var sr = Math.sqrt(s);
		
		tf = (-0.0575 + 1.710523e-3 * sr - 2.154996e-4 * s) * s - 7.53e-4 * p;
		return tf;
	}
	
	// Compute adiabatic lapse rate (deg C/dBar) from salinity (psu), temperature (deg C) and pressure (dBar)
	function adiabaticLapseRate(s,t,p) {
		var ds,atg;
		
		ds = s - 35.0;
		atg = ((-2.1687e-16 * t + 1.8676e-14) * t - 4.6206e-13) * p * p;
		atg = atg + (2.7759e-12 * t - 1.1351e-10 ) * ds * p;
		atg = atg + (((-5.4481e-14 * t + 8.7330e-12) * t - 6.7795e-10) * t + 1.8741e-8) * p;
		atg = atg + (-4.2393e-8 * t + 1.8932e-6 ) * ds;
		atg = atg + ((6.6228e-10 * t - 6.8360e-8) * t + 8.5258e-6) * t + 3.5803e-5;
		return atg;
	}
	
	// Compute potential temperature (deg C) from salinity (psu), temperature (deg C) and pressure (dBar)
	function potentialTemperature(s,t0,p0) {
		var p,t,h,xk,q,theta
		
		p = p0;
		t = t0;
		h = 0 - p;
		xk = h * adiabaticLapseRate(s,t,p);
		t = t + 0.5 * xk;
		q = xk;
		p = p + 0.5 * h;
		xk = h * adiabaticLapseRate(s,t,p);
		t = t + 0.29289322 *(xk-q);
		q = 0.58578644 * xk + 0.121320344 * q;
		xk = h * adiabaticLapseRate(s,t,p);
		t = t + 1.707106781 *(xk-q);
		q = 3.414213562 * xk - 4.121320344 * q;
		p = p + 0.5 * h;
		xk = h * adiabaticLapseRate(s,t,p);
		theta = t + (xk-2.0*q)/6.0;
		return theta;
	}