unit Unit_Calcul;
{This code was developed by
 O.Siggaard-Andersen, M.D. Professor Emeritus and
 M.Siggaard-Andersen, Ph.D. Director Logos Design Inc.
 The code is the property of the authors
 and must not be used for commercial purposes.

 O.Siggaard-Andersen,
 M.D., Professor Emeritus,
 University of Copenhagen.
 o.siggaard-andersen@dadlnet.dk
 www.osa.suite.dk }

interface

procedure CalculateVar;                 //used by Form_Main
procedure CalculateRef;                 //used by Form_Main
var UnableToCalculate: Boolean;         //used by Form_Main
function Valid(Dato: string): Boolean;  //used by Form_Main
function CalculateAge: Boolean;         //used by Form_Main
function lg(x:Double): Double;                      //used by Form_AcidBaseChart
function antilg(x: Double): Double;                 //used by Form_AcidBaseChart
Function logit(x:Double):     Double;
Function antilogit(x:Double): Double;
function pHfr(pCO2, cBase, cHb, T: Double): Double; //used by Form_AcidBaseChart
function pCO2fr(pH, cBase, cHb, T: Double):Double;  //used by Form_AcidBaseChart
function cBaseof(pH, pCO2, cHb, T: Double): Double; //used by Form_AcidBaseChart
FUNCTION aFrom(pH,pCO2,xMetHb,xHbF,cDPG: Double): Double;        //used by Form_OxygenGraph
FUNCTION ctO2of(pO2, a, T, ctHb, FCOHb, FMetHb: Double): Double; //used by Form_OxygenGraph
FUNCTION pO2Alvof(FO2dI, Pamb, T, pCO2, RQ: Double): Double;
FUNCTION pO2hIof(FO2dI, Pamb, T: Double): Double;
FUNCTION pO2fr(sO2, a, T, FCOHb, FMetHb: Double): Double;
FUNCTION cHCO3of(pH, pCO2, T: Double): Double;
FUNCTION pHof(pCO2, cHCO3, T: Double): Double;

implementation

uses Dialogs, Math, SysUtils, Form_Main, Form_AVdisplay, Unit_Filing, Unit_Edit;

{All the functions for calculating the variables follow here}
CONST T0= 37.0;   pH0 = 7.40;   pCO20 = 5.33;    Epsilon= 10E-6;
var AgeYrs: Double;

Function lg(x:Double):        Double;   begin result:= (ln(x))/ln(10)    end;
Function antilg(x: Double):   Double;   begin result:= exp(ln(10)*x)     end;
Function logit(x:Double):     Double;   begin result:= ln(x/(1-x))       end;
Function antilogit(x:Double): Double;   begin result:= exp(x)/(1+exp(x)) end;
{.......Henderson-Hasselbalch Equation:........................................}
{for cHCO3of(), pCO2of(), pCO2af(), pHfr()}
FUNCTION pKof(T: Double): Double;
  Const  pKT0   = 6.1; dpKdT  = -0.0026;
  Begin  Result:= pKT0 + dpKdT*(T - T0) {-lg(1+antilg(pH-8.7))} End;
{for cHCO3of(), pCO2of(), pCO2af(), pH2of(), pCO22of(), pHfr()}
FUNCTION aCO2of(T: Double): Double;
  Const  aCO2T0 = 0.23 {mM/kPa}; dlgaCO2dT = -0.0092 {lg(mM/kPa)/K};
  Begin  Result:= aCO2T0 * antilg(dlgaCO2dT*(T - T0)) End;
{not used}
FUNCTION pHof(pCO2, cHCO3, T: Double): Double;
  Begin  Result:= pKof(T) + lg(cHCO3/(aCO2of(T)*pCO2))  End;
{used by pCO2fr()}
FUNCTION pCO2of(pH, cHCO3, T: Double): Double;
  Begin  Result:= cHCO3/(aCO2of(T)*antilg(pH - pKof(T)))  End;
{used for calculation of pCO2}
FUNCTION pCO2af(pH, ctCO2P, T: Double): Double;
  Begin  Result:= ctCO2P/(aCO2of(T)*(antilg(pH - pKof(T)) + 1))  End;
{used by pH2of(), pCO22of(), cBaseof(), pCO2fr(), calculation of cHCO3}
FUNCTION cHCO3of(pH, pCO2, T: Double): Double;
  Begin  Result:= pCO2*aCO2of(T)*antilg(pH - pKof(T))  End;
{used for calculation of ctCO2P}
FUNCTION ctCO2Pof(pH, pCO2, T: Double): Double;
  Begin  Result:= pCO2*aCO2of(T)*(1+antilg(pH - pKof(T)))     End;
{used by cBaseof() and calculation of pCO2T or pCO2m}

function pCO22of(pCO21, T1, T2, cHb, cAlb, pH1: Double): Double;
//Eqn. 10 and 11, p. 87 i min bog.
var betaX, dpHdT1, pH2, cHCO3, dlgpCO2dT1, pCO22, dpHdT2, dlgpCO2dT2,
      dpHdTmean, dlgpCO2dTMean: Double;
  begin
    betaX:= 7.7+8*(cAlb-cAlbN) + 2.3*cHb;

    dpHdT1:= (-0.0026 -
      betaX*0.016*(1/(2.3*cHCO3of(pH1,pCO21,T1)) + 1/(2.3*pCO21*aCO2of(T1))))/
      (1 + betaX* (1/(2.3*cHCO3of(pH1,pCO21,T1)) + 1/(2.3*pCO21*aCO2of(T1))));
    pH2:= pH1 + dpHdT1*(T2-T1);

    cHCO3:= cHCO3of(pH1,pCO21,T1);
    dlgpCO2dT1:= -0.0026 - (-0.0092) - dpHdT1 +
      (1/(2.3*cHCO3))* (betax*dpHdT1 + betax*0.016);
    pCO22:= antilg(lg(pCO21) + dlgpCO2dT1*(T2-T1));

    dpHdT2:= (-0.0026 -
      betaX*0.016*(1/(2.3*cHCO3of(pH2,pCO22,T2)) + 1/(2.3*pCO22*aCO2of(T2))))/
      (1 + betaX* (1/(2.3*cHCO3of(pH2,pCO22,T2)) + 1/(2.3*pCO22*aCO2of(T2))));
    dpHdTmean:= (dpHdT1 + dpHdT2)/2;
    pH2:= pH1 + dpHdTmean*(T2-T1);

    cHCO3:= cHCO3of(pH2,pCO22,T2);
    dlgpCO2dT2:= -0.0026 - (-0.0092) - dpHdT2 +
      (1/(2.3*cHCO3))* (betax*dpHdT2 + betax*0.016);
    dlgpCO2dTmean:= (dlgpCO2dT1 + dlgpCO2dT2)/2;

    Result:= antilg(lg(pCO21) + dlgpCO2dTmean*(T2-T1));
  end;

function pH2of(pH1, T1, T2, cHb, cAlb, pCO21: Double): Double;
//Eqn. 10 and 11, p. 87 i min bog.
var betaX, dpHdT1, pH2, cHCO3, dlgpCO2dT1, pCO22, dpHdT2,
      dpHdTmean: Double;
  begin
     betaX:= 7.7+8*(cAlb-cAlbN) + 2.3*cHb;

    dpHdT1:= (-0.0026 -
      betaX*0.016*(1/(2.3*cHCO3of(pH1,pCO21,T1)) + 1/(2.3*pCO21*aCO2of(T1))))/
      (1 + betaX* (1/(2.3*cHCO3of(pH1,pCO21,T1)) + 1/(2.3*pCO21*aCO2of(T1))));
    pH2:= pH1 + dpHdT1*(T2-T1);

    cHCO3:= cHCO3of(pH1,pCO21,T1);
    dlgpCO2dT1:= -0.0026 - (-0.0092) - dpHdT1 +
      (1/(2.3*cHCO3))* (betax*dpHdT1 + betax*0.016);
    pCO22:= antilg(lg(pCO21) + dlgpCO2dT1*(T2-T1));

    dpHdT2:= (-0.0026 -
      betaX*0.016*(1/(2.3*cHCO3of(pH2,pCO22,T2)) + 1/(2.3*pCO22*aCO2of(T2))))/
      (1 + betaX* (1/(2.3*cHCO3of(pH2,pCO22,T2)) + 1/(2.3*pCO22*aCO2of(T2))));
    dpHdTmean:= (dpHdT1 + dpHdT2)/2;
    Result:= pH1 + dpHdTmean*(T2-T1);
  end;

{New function: used for calculation of RQ}
FUNCTION ctCO2Bof(pH, pCO2, T, ctHb, sO2: Double): Double;
  Const dpHEdpHP = 0.77; dpHEdsO2 = 0.035; pHEx= 7.84; sO2x = 0.06;
          aCO2E0 = 0.195; ctHbE = 21; pHE0 = 7.19; pKE0 = 6.125;
  Var pHT0, pCO2T0, pKE, pHE, ctCO2E, ctCO2B, phiEB:  Double;
  Begin
   // pCO2T0 := pCO22of   (pCO2, T, T0, ctHb);
    pCO2T0 := pCO22of(pCO2, T, T0, ctHb, cAlb, pH);
 //   pHT0   := pH2of (pH, T, T0, ctHb);
    pHT0 := pH2of (pH, T, T0, ctHb, cAlb, pCO2);
    pHE:= pHE0 + dpHEdpHP*(pHT0 - pH0) + dpHEdsO2*(1 - sO2);
      {or: (pHE - 6.9) = alpha * (pHP - pH0), where alpha = 0.7 + f*(1-sO2)}
    pKE:= pKE0 - lg(1 + antilg(pHE - pHEx - sO2x*sO2));
    ctCO2E:= aCO2E0*pCO2T0*(1 + antilg(pHE - pKE));
    phiEB:= ctHb/ctHbE;
    ctCO2B:= ctCO2E*phiEB + ctCO2Pof(pHT0,pCO2T0,T0)*(1-phiEB);
    Result:= ctCO2B
  End;
{....... Van Slyke equation:   ................................................}
CONST  betaP= 7.7; betaHb= 2.3;  ctHbb= 43.0;

{used by pCO2fr(), pHfr(), and Calculation x 1}
{pH and pCO2 are referred to 37 øC;
 alternatively pH0 and pCO20 (i.e. the titration endpoint)
 could be converted to T; the result ought to be the same}
FUNCTION  cBaseOf(pH, pCO2, cHb, T: Double): Double;
  Var pHT0, pCO2T0: Double;
  Begin
    cAlbN:=0.66;
    //pCO2T0 := pCO22of(pCO2, T, T0, ctHb);
    pCO2T0 := pCO22of(pCO2, T, T0, cHb, cAlb, pH);
    //pHT0   := pH2of(pH, T, T0, ctHb);
    pHT0 := pH2of(pH, T, T0, ctHb, cAlb, pCO2);
    Result := (1-cHb/ctHbb)
                 *(cHCO3of(pHT0,pCO2T0,T0) - cHCO3of(pH0, pCO20, T0)
                     + (betaHb*cHb + betaP+8*(cAlb-cAlbN))*(pHT0-pH0))
  End; {cBaseOf}
{used by pCO2fr() and Calculation to check for negative value}
function cHCO3fr(pH, cBase, cHb, T: Double): Double;
  var pHT0: Double;
  begin
    cAlbN:=0.66;
    //pHT0:= pH2of(pH, T, T0, cHb);
    pHT0:= pH2of(pH, T, T0, cHb, cAlb, pCO2T);
    Result := cBase/(1-cHb/ctHbb)  + cHCO3of(pH0, pCO20, T0)
                     - (betaHb*cHb + betaP+8*(cAlb-cAlbN))*(pHT0 - pH0)
  end; {cHCO3fr()} {Can be negative!!!}
{used once by Calculation}
function pCO2fr(pH, cBase, cHb, T: Double): Double;
  var cHCO3: Double;
  begin cHCO3:=cHCO3fr(pH, cBase, cHb, T);
  if cHCO3>0 then Result:=pCO2of(pH, cHCO3, T) else Result:=-1
  end; {pCO2fr}
function  pHfr(pCO2, cBase, cHb, T: Double): Double;//Conversion to 37 C, calculation, conversion to T
  var pCO237, pH37guess, cBaseGuess: Double;
  begin
    pH37guess:= pH0; cAlbN:=0.66;
    //pCO237:=pCO22of(pCO2, T, T0, cHb);
    pCO237:= pCO22of(pCO2, T, T0, cHb, cAlb, pH37Guess);

    cBaseGuess:=cBaseof(pH37guess, pCO237, cHb, T0);
    {Newton Raphson: We know cBase as a function of pH at constant pCO2,
      but cannot express pH as a function of cBase}
    repeat pH37Guess:=pH37Guess + (cBase - cBaseGuess)/((1-cHb/ctHbb)*
             (betaP+8*(cAlb-cAlbN) + betaHb*cHb) + ln(10)*cHCO3of(pH37Guess, pCO237, T0));
           cBaseGuess:=cBaseof(pH37guess, pCO237, cHb, T0);
    until Abs(cBase - cBaseGuess) < epsilon;
    //Result:= pH2of(pH37guess, T0, T, cHb);
    Result:=pH2of(pH37guess, T0, T, cHb, cAlb, pCO237);
  end; {pHfr}

(*****  End of Acid Base Status related functions ***************************************)
{***** OXYGEN STATUS RELATED FUNCTIONS **************************************************}
CONST
  p0         =  7;         {kPa}
  y0         =  1.8747;    {used by y() only}
  h0         =  3.5;       {used by h() only}
  k          =  0.5342857; {used by x(), y()}

  dbdT       =  0.055;     {/K;  used by pO2fr(), pO2of()}

  DctO2av0   =  2.3;       {mmol/L;  used by Calculation and CalculateReferences}

  dadcDPG0   =  0.3;       {used by aFrom() and cDPGof()}
  dadcDPGxHbF= -0.1;       {or perhaps -0.125 ?}
  cDPG0      =  5;         {mmol/L;  used by aFrom() and cDPGof()}
{used for dcdp(), pO2of(), ctO2of()}
FUNCTION aO2(T: Double): Double;
 Const  aO2T0=  0.0105;{(mmol/L)/kPa;}  dlnaO2dT= -0.0115;{/K;} d2lnaO2dT= 0.00042;{/K;}
 Begin Result:= exp(ln(aO2T0) + dlnaO2dT*(T - T0) + 0.5*d2lnaO2dT*Sqr(T - T0)) End;
{used by dcdp(), pO2of(), ctO2of() and calculation of ceHb}
FUNCTION  ceHbof(ctHb, FCOHb, FMetHb: Double): Double;
  Begin Result:= ctHb*(1-FCOHb-FMetHb) End;
{used by dcdp(), MpCOof(), sO2fr(), sO2of(), pO2fr(), cDPGof()}
FUNCTION sCO(FCOHb, FMetHb: Double): Double;
  Begin
    If FCOHb<0 then FCOHb:=0; Result:= FCOHb/(1 - FMetHb)
  End;
{used by y(), dydx()}
FUNCTION h(a: Double): Double;
  Begin Result:= h0 + a End;
{used by y(), dydx(), dyda()}
FUNCTION x(pO2CO, a, T: Double): Double;
  Begin Result:= ln(pO2CO/p0) - a - dbdT*(T - T0) End;
{The fundamental TANH equation; used by sO2CO(), pO2fr(), cDPGof()}
FUNCTION y(pO2CO, a, T: Double): Double;
  Begin Result:= y0 + x(pO2CO,a,T) + h(a)*tanh(k*x(pO2CO,a,T)) End;
{used by MpCOof(), dcdp(), sO2fr()}
FUNCTION sO2CO(pO2CO,a,T: Double): Double;
  Begin Result:= antilogit(y(pO2CO,a,T)) End;
{Haldane equation; used by sO2of(), pO2fr(), pO2of()}
FUNCTION MpCOof(pO2CO, a, T, FCOHb, FMetHb: Double): Double;
  Begin Result:= (pO2CO/sO2CO(pO2CO,a,T))*sCO(FCOHb, FMetHb) End;
{TANH equation; used by dyda(), dcdp(), pO2fr()}
FUNCTION dydx(pO2CO, a, T: Double): Double;
  Begin Result:= 1 + h(a)*k*(1 - sqr(tanh(k*x(pO2CO,a,T)))) End;
{TANH equation; used by cDPGof() only}
FUNCTION dyda(pO2CO, a, T: Double): Double;
  Begin Result:= tanh(k*x(pO2CO,a,T)) - dydx(pO2CO,a,T) End;
{TANH equation; used by pO2of() only}
FUNCTION dcdp(pO2CO, a, T, ctHb, FCOHb, FMetHb: Double): Double;
  Var sO2COc, sCOc, ceHb, dydxc: Double;
  Begin
    sO2COc:=sO2CO(pO2CO,a,T);
    sCOc :=sCO(FCOHb,FMetHb);
    ceHb:=ceHbOf(ctHb,FCOHb,FMetHb);
    dydxc:=dydx(pO2CO,a,T);
    Result:= aO2(T) + ceHb*dydxc*sO2COc*(1 - sO2COc)/(pO2CO*(1 - sCOc))
  End; {dcdp()}
{used by sO2of(), pO2of()}
FUNCTION sO2fr(pO2CO, a, T, FCOHb, FMetHb: Double): Double;
  Var sO2COc, sCOc: Double;
  Begin
    sO2COc:= sO2CO(pO2CO,a,T);
    sCOc :=  sCO(FCOHb, FMetHb);
    Result:= (sO2COc - sCOc)/(1 - sCOc);
  End; {of sO2fr()}
{used by sO2of(), pO2of() and Calculation x 3}
FUNCTION pO2fr(sO2, a, T, FCOHb, FMetHb: Double): Double;
  Var pO2CO, sO2CO, ym, yc, dydxc: Double;
  Begin
    pO2CO := Exp(ln(p0) + a + dbdT*(T - T0));
    sO2CO := sO2 + sCO(FCOHb, FMetHb)*(1 - sO2);
    ym    := logit(sO2CO);
    Repeat
      yc    := y(pO2CO,a,T);
      dydxc := dydx(pO2CO, a, T);
      pO2CO := Exp(ln(pO2CO) + (ym - yc)/dydxc);
    Until (Abs(ym - yc) < epsilon);
    Result:= pO2CO - MpCOof(pO2CO, a, T, FCOHb, FMetHb);
  End; {of pO2fr()}
{used by ctO2of(), Calculation x 3}
FUNCTION sO2of(pO2, a, T, FCOHb, FMetHb: Double): Double;
  Var MpCOa, MpCOb, sCOc: Double;
  Begin
    sCOc:=sCO(FCOHb,FMetHb);
    If sCOc>0 then MpCOa := pO2fr(sCOc,a,T,0,FMetHb) else MpCOa:=0;
    MpCOb:=MpCOa;
    Repeat
      MpCOb := 0.6*MpCOa + 0.4*MpCOb;{2*MpCOa-MpCOb;{0.6*MpCOa+0.4*MpCOb;}
      MpCOa := MpCOof(pO2 + MpCOb, a, T, FCOHb, FMetHb);
//      ShowMessage('MpCOa-MpCOb: '+FloatToStrF(MpCOa-MpCOb,ffFixed,8,4));
    Until (Abs(MpCOa - MpCOb) < epsilon);
    Result:= sO2fr(pO2 + MpCOa, a, T, FCOHb, FMetHb);
  End; {of sO2of()}
{used by Calculation x 3 and in CalculateReferences}
FUNCTION pO2of(ctO2, a, T, ctHb, FCOHb, FMetHb: Double): Double;
  Var pO2CO, sO2, ceHb, ctO2c, pO2, dcdpc: Double;
  Begin
    pO2CO  := Exp(ln(3.578) + 1.121*a + dbdT*(T - T0));
    Repeat
      sO2   := sO2fr(pO2CO, a, T, FCOHb, FMetHb);
      pO2   := pO2fr(sO2, a, T, FCOHb, FMetHb);
      ceHb  := ceHbOf(ctHb,FCOHb,FMetHb);
      ctO2c := aO2(T)*pO2 + ceHb*sO2;
      dcdpc := dcdp(pO2CO,a,T,ctHb,FCOHb,FMetHb);
      pO2CO := pO2CO + (ctO2 - ctO2c)/dcdpc;
      If pO2CO <= 0 Then  pO2CO := 0.01;
    Until (Abs(ctO2 - ctO2c) < epsilon);
    Result:= pO2CO - MpCOof(pO2CO, a, T, FCOHb, FMetHb);
  End; {of pO2of()}
{used by OsGraph}
FUNCTION ctO2of(pO2, a, T, ctHb, FCOHb, FMetHb: Double): Double;
  Var sO2: Double;
  Begin
//    ShowMessage('I am calculating ctO2of');
    sO2    := sO2of(pO2, a, T, FCOHb, FMetHb);
//    ShowMessage('I am returning with sO2of for ctO2 calculation: '+FloatToStrF(sO2,ffFixed,8,7));
    Result := aO2(T)*pO2 + sO2*ceHbOf(ctHb,FCOHb,FMetHb);
  End; {of ctO2of()}
Function ctO2fr(ctO2Alv, Fva: Double): Double;
  var ctO2: Double;
  begin
    if Fva=1 then ctO2:=0 else
    ctO2:= ctO2Alv - DctO2av0*Fva/(1-Fva);
    If ctO2<DctO2av0 then ctO2:= ctO2Alv *(1-Fva);
    Result:= ctO2;
  End;
Function Fvaof (ctO2, ctO2Alv: Double): Double;
  var ctO2v: Double;
  begin
    ctO2v:= ctO2 - DctO2av0;
    If ctO2v < 0 then ctO2v:= 0;
    {If (ctO2Alv>ctO2) then Result:=-0.001 else}
    Result:= (ctO2Alv - ctO2)/(ctO2Alv - ctO2v);
  end;
{used by cDPGof() and Calculation x 4}
FUNCTION aFrom(pH,pCO2,xMetHb,xHbF,cDPG: Double): Double;
  Const
    dadpH     = -0.88 ;
    dadlnpCO2 =  0.048;
    dadxMetHb = -0.7  ;
    dadxHbF   = -0.25 ;
  Begin
    Result   := dadpH     * (pH-pH0)
              + dadlnpCO2 * ln(pCO2/pCO20)
              + dadxMetHb * xMetHb
              + dadxHbF   * xHbF
              + (dadcDPG0 + dadcDPGxHbF*xHbF) * (cDPG/cDPG0-1);
  End; { aFrom()}
{used for Calculation of cDPG}
FUNCTION cDPGof(pO2, sO2, T, pH, pCO2, FCOHb, FMetHb, FHbF: Double): Double;
  Var aDPG0, a, sO2CO, pO2CO, ym, yc: Double;// s1,s2, s3:string;
  Begin
    aDPG0 := aFrom(pH, pCO2, FMetHb, FHbF, cDPG0);
    a     := aDPG0;
    sO2CO := sO2 + sCO(FCOHb, FMetHb)*(1 - sO2);
    pO2CO := pO2 * sO2CO/(sO2CO - sCO(FCOHb, FMetHb));
    ym    := logit(sO2CO);
 //   yc:=y(pO2CO, a, T);
    Repeat
      yc   := y(pO2CO, a, T);  
      If Abs(ym - yc) > 2 then  a:= a + 0.5*(ym - yc)/dyda(pO2CO, a, T)
                          else  a:= a +     (ym - yc)/dyda(pO2CO, a, T);
    Until (Abs(ym - yc) < epsilon) or (a<-h0); //If a < -h0 the (pO2,sO2) point is above the left asymptote!!!
    If a<-h0 then
    begin
      Result:= cDPG;
      UnableToCalculate:=true
    end else
    begin
      Result := cDPG0*(1 + (a - aDPG0)/(dadcDPG0 + dadcDPGxHbF * FHbF));
      UnableToCalculate:=false
    end
  End; {of cDPGof()}
{used by pO2Alvof, Calculation of pO2hI, OsGraph (GasMap)}
FUNCTION  pO2hIof(FO2dI, Pamb, T: Double): Double;
  function pH2Oof(T: Double): Double;
   const pH2O37 = 6.275 {kPa}; dlnpH2OdT = 0.0543 {/K}; d2lnpH2OdT= -0.00044 {kPa};
   begin pH2Oof:=pH2O37*exp(dlnpH2OdT*(T-T0)+d2lnpH2OdT*sqr(T-T0)/2) end;
  Begin if FO2dI=0 then Result:=0.05 else Result:=FO2dI*(Pamb-pH2Oof(T)) end;
{The alveolar air equation,  used for Calculation of pO2Alv and OsGraph (GasMap)}
FUNCTION  pO2Alvof(FO2dI, Pamb, T, pCO2, RQ: Double): Double;
  Begin Result:= pO2hIof(FO2dI,Pamb,T) - pCO2*(1/RQ - FO2dI*(1/RQ - 1));
        if Result<=0 then Result:=0.001;
  end;
FUNCTION ctO2Alvof(pO2Alv,pHT,pCO2T,cDPG, TPt,ctHb,FCOHb,FMetHb,FHbF: Double): Double;
  begin
    if pO2Alv> 0
    then Result:= ctO2of(pO2Alv,aFrom(pHT,pCO2T,FMetHb,FHbF,cDPG),TPt,ctHb,FCOHb,FMetHb)
    else Result:=0.01;
  end;
FUNCTION  cO2Hbof(ceHb, sO2: Double): Double;
  Begin Result:= ceHb*sO2 end;
FUNCTION pxof(ctO2, pHT, pCO2T,cDPG,TPt,ctHb,FCOHb,FMetHb,FHbF: Double): Double;
  begin
    If ctO2 > DctO2av0
    then Result:= pO2of(ctO2-DctO2av0, aFrom(pHT,pCO2T,FMetHb,FHbF,cDPG),TPt,ctHb,FCOHb,FMetHb)
    else Result:= 0.004//ctO2 - DctO2av0;
  end;
FUNCTION cxof(ctO2, ctO25: Double): Double;
  begin Result:=ctO2 - ctO25 end;
Function QpO2aFO2dIof(pO2a, FO2dI: Double): Double;
  begin if FO2dI>0.001 then Result:= pO2a/FO2dI else Result:=-0.01 end;
Function DpO2Aaof(pO2Alv, pO2a: Double): Double;
  begin Result:= pO2Alv - pO2a end;
Function RpO2aAof(pO2a, pO2Alv: Double): Double;
  begin Result:= pO2a/pO2Alv end;
Function RDpO2Aaaof(pO2Alv, pO2a: Double): Double;
  begin Result:= (pO2Alv - pO2a)/pO2a end;
Function DctO2Aaof(ctO2Alv, ctO2a: Double): Double;
  begin Result:= ctO2Alv - ctO2a end;
Function AreaOf(h, m: Double): Double;  {DuBois equation}
  const h0=180; m0=70; A0=1.87; a1=0.54468; a2=0.46336;
  begin Result:= A0 * power(h/h0,a1) * power(m/m0,a2) end;
{***  End  Calculation Functions  *****************************************}

Procedure CalculateVar;
var EmO2, Fva1: Double;
begin
  Case pHCalculInput of
    pHmpCO2m:      begin
      cBaseEcf :=cBaseof (pHm, pCO2m, ctHb*FBEcf, Tm);
      //pCO2T    :=pCO22of (pCO2m, Tm, TPt, ctHb);
      pCO2T := pCO22of(pCO2m, Tm, TPt, ctHb, cAlb, pHm);
      //pHT      :=pH2of   (pHm,  Tm, TPt, ctHb);
      pHT:= pH2of(pHm, Tm, TPt, ctHb, cAlb, pCO2m);
      ctCO2PT  :=ctCO2Pof(pHT,  pCO2T,  TPt);
                   end;
    pCO2TcBaseEcf: begin
      pHT      :=pHfr    (pCO2T, cBaseEcf, ctHb*FBEcf, TPt);
      //pCO2m    :=pCO22of (pCO2T, TPt,      Tm,   ctHb);
      pCO2m := pCO22of(pCO2T, TPt, Tm, ctHb, cAlb, pHT);
      //pHm      :=pH2of   (pHT,    TPt,  Tm,    ctHb);
      pHm      :=pH2of (pHT, TPt, Tm, ctHb, cAlb, pCO2T);
      ctCO2PT  :=ctCO2Pof(pHT,   pCO2T,    TPt);
                   end;
    pHTcBaseEcf:   begin
      pCO2T    :=pCO2fr  (pHT,   cBaseEcf, ctHb*FBEcf, TPt);
        If pCO2T=-1 then
        begin
          ShowMessage('Unable to calculate: pHT too high, or cBaseEcf too low');
          exit
        end;
      //pCO2m    :=pCO22of (pCO2T, TPt,      Tm,   ctHb);
      pCO2m := pCO22of(pCO2T, TPt, Tm, ctHb, cAlb, pHT);
      //pHm      :=pH2of   (pHT,   TPt,  Tm,    ctHb);
      pHm := pH2of (pHT, TPt, Tm, ctHb, cAlb, pCO2T);
      ctCO2PT  :=ctCO2Pof(pHT,   pCO2T,    TPt);
                   end;
    pHTpCO2T:      begin
      //pCO2m    :=pCO22of (pCO2T, TPt,      Tm,   ctHb);
      pCO2m := pCO22of(pCO2T, TPt, Tm, ctHb, cAlb, pHT);
      //pHm      :=pH2of   (pHT,   TPt,  Tm,    ctHb);
      pHm := pH2of (pHT, TPt, Tm, ctHb, cAlb, pCO2T);
      cBaseEcf :=cBaseof (pHm,   pCO2m,    ctHb*FBEcf, Tm);
      ctCO2PT  :=ctCO2Pof(pHT,   pCO2T,    TPt)
                   end;
    pHTctCO2PT:    begin
      pCO2T    :=pCO2af  (pHT,   ctCO2PT,  TPt);
      //pCO2m    :=pCO22of (pCO2T, TPt,      Tm,   ctHb);
      pCO2m := pCO22of(pCO2T, TPt, Tm, ctHb, cAlb, pHT);
      //pHm      :=pH2of   (pHT,   TPt,  Tm,    ctHb);
      pHm := pH2of (pHT, TPt, Tm, ctHb, cAlb, pCO2T);
      cBaseEcf :=cBaseof (pHm,   pCO2m,    ctHb*FBEcf, Tm)
                   end;
  end; {Case of}
  cHT      := antilg(9-pHT);
  cdCO2T   := aCO2of(TPt) * pCO2T;
  cBaseP   := cBaseof(pHm, pCO2m,    0 {ctHb}, Tm);
  cBaseB   := cBaseof(pHm, pCO2m,   ctHb, Tm);
  cHCO3T   := cHCO3of(pHm, pCO2m, Tm);
  pHstd    := pHfr(pCO20, cBaseB, ctHb, T0);
  cHCO3std := cHCO3of(pHstd, pCO20, T0);

  ceHb   := ceHbof  (ctHb, FCOHb,FMetHb);
  pO2hI  := pO2hIof (FO2dI,Pamb, TPt);
  Case O2CalculInput of
    pO2msO2m:
    begin
      cDPG   := cDPGof   (pO2m,sO2m,Tm,pHm,pCO2m,FCOHb,FMetHb,FHbF);
      ctO2   := ctO2of   (pO2m,aFrom(pHm,pCO2m,FMetHb,FHbF,cDPG),Tm, ctHb,FCOHb,FMetHb);
      pO2T   := pO2of    (ctO2,aFrom(pHT,pCO2T,FMetHb,FHbF,cDPG),TPt,ctHb,FCOHb,FMetHb);
      sO2T   := sO2of    (pO2T,aFrom(pHT,pCO2T,FMetHb,FHbF,cDPG),TPt,FCOHb,FMetHb);
      pO2Alv := pO2Alvof(FO2dI,Pamb, TPt,   pCO2T,  RQ);

      ctO2Alv:= ctO2Alvof(pO2Alv,pHT,pCO2T,cDPG,TPt,ctHb,FCOHb,FMetHb,FHbF);
      Repeat
        Fva    := Fvaof    (ctO2,ctO2Alv);
        Fva1   := Fva;
        pCO2Alv:= pCO2T-0.6*Fva;
        pO2Alv := pO2Alvof(FO2dI,Pamb, TPt,   pCO2Alv,  RQ);
        ctO2Alv:= ctO2Alvof(pO2Alv,pHT,pCO2T,cDPG,TPt,ctHb,FCOHb,FMetHb,FHbF);
        Fva    := Fvaof    (ctO2,ctO2Alv);
      Until (abs(Fva-Fva1)<0.001) or (abs(Fva-Fva1)>1);
    end;
    FvacDPG:   begin
      pCO2Alv:= pCO2T-0.6*Fva;
      pO2Alv := pO2Alvof(FO2dI,Pamb, TPt,   pCO2Alv,  RQ);
      ctO2Alv:= ctO2Alvof(pO2Alv,pHT,pCO2Alv,cDPG,TPt,ctHb,FCOHb,FMetHb,FHbF);
      ctO2   := ctO2fr   (ctO2Alv,Fva);
      pO2m   := pO2of    (ctO2,aFrom(pHm,pCO2m,FMetHb,FHbF,cDPG),Tm,ctHb,FCOHb,FMetHb);
      sO2m   := sO2of    (pO2m,aFrom(pHm,pCO2m,FMetHb,FHbF,cDPG),Tm,FCOHb,FMetHb);
      pO2T   := pO2of    (ctO2,aFrom(pHT,pCO2T,FMetHb,FHbF,cDPG),TPt,ctHb,FCOHb,FMetHb);
      sO2T   := sO2of    (pO2T,aFrom(pHT,pCO2T,FMetHb,FHbF,cDPG),TPt,FCOHb,FMetHb);
               end;
    pO2mcDPG:  begin
      sO2m   := sO2of    (pO2m, aFrom(pHm, pCO2m, FMetHb, FHbF, cDPG), Tm, FCOHb, FMetHb);
      ctO2   := ctO2of   (pO2m,aFrom(pHm,pCO2m,FMetHb,FHbF,cDPG),Tm, ctHb,FCOHb,FMetHb);
      pO2Alv := pO2Alvof(FO2dI,Pamb, TPt,   pCO2T,  RQ);
      ctO2Alv:= ctO2Alvof(pO2Alv,pHT,pCO2T,cDPG, TPt,ctHb,FCOHb,FMetHb,FHbF);
      Repeat
        Fva    := Fvaof    (ctO2,ctO2Alv);
        Fva1   := Fva;
        pCO2Alv:= pCO2T-0.6*Fva;
        pO2Alv := pO2Alvof(FO2dI,Pamb, TPt,   pCO2Alv,  RQ);
        ctO2Alv:= ctO2Alvof(pO2Alv,pHT,pCO2T,cDPG,TPt,ctHb,FCOHb,FMetHb,FHbF);
        Fva    := Fvaof    (ctO2,ctO2Alv);
      Until abs(Fva-Fva1)<0.001;
      pO2T   := pO2of    (ctO2,aFrom(pHT,pCO2T,FMetHb,FHbF,cDPG),TPt,ctHb,FCOHb,FMetHb);
      sO2T   := sO2of    (pO2T,aFrom(pHT,pCO2T,FMetHb,FHbF,cDPG),TPt,FCOHb,FMetHb);
               end;
    sO2mcDPG: begin
      pO2m   := pO2fr    (sO2m, aFrom(pHm, pCO2m, FMetHb, FHbF, cDPG), Tm, FCOHb, FMetHb);
      ctO2   := ctO2of   (pO2m,aFrom(pHm,pCO2m,FMetHb,FHbF,cDPG),Tm, ctHb,FCOHb,FMetHb);
      pO2Alv := pO2Alvof(FO2dI,Pamb, TPt,   pCO2T,  RQ);
      ctO2Alv:= ctO2Alvof(pO2Alv, pHT,pCO2T,cDPG, TPt,ctHb,FCOHb,FMetHb,FHbF);
      Repeat
        Fva    := Fvaof    (ctO2,ctO2Alv);
        Fva1   := Fva;
        pCO2Alv:= pCO2T-0.6*Fva;
        pO2Alv := pO2Alvof(FO2dI,Pamb, TPt,   pCO2Alv,  RQ);
        ctO2Alv:= ctO2Alvof(pO2Alv,pHT,pCO2T,cDPG,TPt,ctHb,FCOHb,FMetHb,FHbF);
        Fva    := Fvaof    (ctO2,ctO2Alv);
      Until abs(Fva-Fva1)<0.001;
      pO2T   := pO2of    (ctO2,aFrom(pHT,pCO2T,FMetHb,FHbF,cDPG),TPt,ctHb,FCOHb,FMetHb);
      sO2T   := sO2of    (pO2T,aFrom(pHT,pCO2T,FMetHb,FHbF,cDPG),TPt,FCOHb,FMetHb);
              end;
    pO2TcDPG: begin
      sO2T   := sO2of    (pO2T, aFrom(pHT, pCO2T, FMetHb, FHbF, cDPG), TPt,FCOHb, FMetHb);
      ctO2   := ctO2of   (pO2T,aFrom(pHT,pCO2T,FMetHb,FHbF,cDPG),TPt,ctHb,FCOHb,FMetHb);
      pO2Alv := pO2Alvof(FO2dI,Pamb, TPt,   pCO2T,  RQ);
      ctO2Alv:= ctO2Alvof(pO2Alv, pHT,pCO2T,cDPG, TPt,ctHb,FCOHb,FMetHb,FHbF);
      Repeat
        Fva    := Fvaof    (ctO2,ctO2Alv);
        Fva1   := Fva;
        pCO2Alv:= pCO2T-0.6*Fva;
        pO2Alv := pO2Alvof(FO2dI,Pamb, TPt,   pCO2Alv,  RQ);
        ctO2Alv:= ctO2Alvof(pO2Alv,pHT,pCO2T,cDPG,TPt,ctHb,FCOHb,FMetHb,FHbF);
        Fva    := Fvaof    (ctO2,ctO2Alv);
      Until abs(Fva-Fva1)<0.001;
      pO2m   := pO2of    (ctO2,aFrom(pHm,pCO2m,FMetHb,FHbF,cDPG),Tm,ctHb,FCOHb,FMetHb);
      sO2m   := sO2of    (pO2m,aFrom(pHm,pCO2m,FMetHb,FHbF,cDPG),Tm,FCOHb,FMetHb);
              end;
    sO2TcDPG: begin
      pO2T   := pO2fr    (sO2T, aFrom(pHT, pCO2T, FMetHb, FHbF, cDPG), TPt,FCOHb, FMetHb);
      ctO2   := ctO2of   (pO2T,aFrom(pHT,pCO2T,FMetHb,FHbF,cDPG),TPt,ctHb,FCOHb,FMetHb);
      pO2Alv := pO2Alvof(FO2dI,Pamb, TPt,   pCO2T,  RQ);
      ctO2Alv:= ctO2Alvof(pO2Alv, pHT,pCO2T,cDPG, TPt,ctHb,FCOHb,FMetHb,FHbF);
      Repeat
        Fva    := Fvaof    (ctO2,ctO2Alv);
        Fva1   := Fva;
        pCO2Alv:= pCO2T-0.6*Fva;
        pO2Alv := pO2Alvof(FO2dI,Pamb, TPt,   pCO2Alv,  RQ);
        ctO2Alv:= ctO2Alvof(pO2Alv,pHT,pCO2T,cDPG,TPt,ctHb,FCOHb,FMetHb,FHbF);
        Fva    := Fvaof    (ctO2,ctO2Alv);
      Until abs(Fva-Fva1)<0.001;
      pO2m   := pO2of    (ctO2,aFrom(pHm,pCO2m,FMetHb,FHbF,cDPG),Tm,ctHb,FCOHb,FMetHb);
      sO2m   := sO2of    (pO2m,aFrom(pHm,pCO2m,FMetHb,FHbF,cDPG),Tm,FCOHb,FMetHb);
              end;
  end;{Case of}
  cO2Hb  := cO2Hbof  (ceHb, sO2T);
  cdO2T   := ctO2 - cO2Hb;
  p50T   := pO2fr    (1/2,aFrom(pHT,pCO2T,FMetHb,FHbF,cDPG),TPt,FCOHb,FMetHb);
  p50std := pO2fr    (1/2,aFrom(pH0,pCO20,     0,   0,cDPG),37  ,    0,     0);
  px     := pxof     (ctO2, pHT, pCO2T,cDPG,TPt,ctHb,FCOHb,FMetHb,FHbF);

  ctO25  := ctO2of   (5{pO2v0},
                     //aFrom(pH2of(pHm, Tm, T0, ctHb),
                     aFrom(pH2of(pHm, Tm, T0, ctHb, cAlb, pCO2m),
                           //pCO22of(pCO2m, Tm, T0, ctHb),
                           pCO22of(pCO2m, Tm, T0, ctHb, cAlb, pHm),
                           FMetHb,FHbF,cDPG),
                     T0, ctHb, FCOHb, FMetHb);
  cx     := cxof     (ctO2, ctO25);
//  ctCO2BT:= ctCO2Bof (pHm,pCO2m,Tm, ctHb,sO2m);
  ctCO2BT:= ctCO2Bof (pHT,pCO2T,TPt,ctHb,sO2m);
  QpO2aFO2dI:= QpO2aFO2dIof(pO2T,FO2dI);
  DpO2Aa:= DpO2aAof(pO2Alv,pO2T);
  RpO2aA:= RpO2Aaof(pO2T,pO2Alv);
  RDpO2Aaa:=RDpO2aAaof(pO2Alv, pO2T);
  DctO2Aa:= DctO2aAof(ctO2Alv, ctO2);

(*  if (TypeOfBlood='Mixed venous')
  or (TypeOfBlood='Central venous')
  or (TypeOfBlood='Peripheral venous') then
  begin
    {pHTv:=pHT; pCO2Tv:=pCO2T; pO2Tv:=pO2T;} ctCO2Bv:=ctCO2BT; ctO2v:=ctO2;
//    TypeOfvBlood:=TypeOfBlood;
  end else*)
  if (TypeOfVBlood='') then
  begin
    pHTv:=0; pCO2Tv:=0; pO2Tv:=0; ctCO2Bv:=0; ctO2v:=0; RQav:=0
  end else
  begin
    DctO2av:=ctO2v-ctO2; DctCO2av:=ctCO2Bv-ctCO2BT;
    If DctO2av=0 then RQav:=0 else RQav:=-dctCO2av/DctO2av;
//    If FavDisplay.Visible then begin {} end;
  end;
  EmO2:= 450 + 99*(RQ - 0.82);
  {Calculate RMR (relative metabolic rate) and ref.value for AEr, AnrO2, and CI}

  If Sex='M' then
  if (AgeYrs<10) then AErN:=63-1.2  * AgeYrs else
  if AgeYrs<25   then AErN:=51-0.467*(AgeYrs-10) else
  if Ageyrs<50   then AErN:=44-0.08 *(AgeYrs-25) else
                      AErN:=42-0.12 *(AgeYrs-50);
  If Sex='F' then
  if (AgeYrs<10) then AErN:=63-1.4* AgeYrs else
  if Ageyrs<25   then AErN:=49-0.533*(AgeYrs-10) else
  if AgeYrs<50   then AErN:=41-0.08 *(AgeYrs-25) else
                      AErN:=39-0.12 *(AgeYrs-50);
  AErN:=exp(ln(AErN) + 0.09*(TPt - 37));
  AnrO2N:=60*AErN/EmO2;
  CIN:=AnrO2N/2.3; {Normal value for Cardiac Index}

  if CO<>0 then
  begin nrO2:=-CO*DctO2av;  Er:= EmO2 * nrO2 /60  end;

  if (PtHeight>0) and (Mass>0) then
  begin
    Area:=AreaOf(PtHeight, Mass); CI:=CO/Area; AnrO2:=nrO2/Area; AEr:=Er/Area;
      REr:=100*AEr/AErN;
      RCO:=100*CI/CIN;
      FavDisplay.HintChange;
{    FavDisplay.LnrO2.Hint:=(FloatToStrF(AnrO2N*0.8,ffFixed,4,1)+' - '+FloatToStrF(AnrO2N*1.2,ffFixed,4,1));
    FavDisplay.LEr.Hint:=(FloatToStrF(AErN*0.8,ffFixed,4,0)+' - '+FloatToStrF(AErN*1.2,ffFixed,4,0));
    FavDisplay.LCO.Hint:=(FloatToStrF(AnrO2N*0.8/2.3,ffFixed,4,1)+' - '+FloatToStrF(AnrO2N*1.2/2.3,ffFixed,4,1));
 }
  end else Area:=0;
end; {CalculateVar}


function DaysInMonth(m,y: integer): integer;
begin
  case m of
    1, 3, 5, 7, 8, 10, 12 : Result := 31;
        4, 6,     9, 11   : Result := 30;
    2                     : Result := 28+Ord(IsLeapYear(y));
    else Result:= 30
  end
end;

var yDD, mDD, dDD,
    yXD, mXD, dXD,
    yBD, mBD, dBD,
    ySD, mSD, dSD,
    yAge, mAge, {wAge,} dAge: Word;  //DD=DagsDato, SD=SampleDate, BD=BirthDate

function Valid(Dato: string): Boolean;
begin
  If Dato='' then begin Result:=false; exit end;
  ShortDateFormat:='ddMMyy'; //Result:=true;
  DecodeDate(Date, yDD, mDD, dDD);
  yXD:= StrToInt(Copy(Dato, 5, 2)); yXD:=yXD+2000;
  mXD:= StrToInt(Copy(Dato, 3, 2));
  dXD:= StrToInt(Copy(Dato, 1, 2));
  if (yXD>yDD) or ((yXD=yDD) and (mXD>mDD)) or ((yXD=yDD) and (mXD=mDD) and (dXD>dDD)) then yXD:=yXD-100;
  if (dXD<1) or (yXD<(yDD-100)) or (yXD>yDD) then Result:=False
  else
  case mXD of
    1..12 : Result := dXD <= DaysInMonth(mXD, yXD);
    else    Result := False;
  end;
  If Dato=BirthDate  then begin yBD:=yXD; mBD:=mXD; dBD:=dXD end else
  if Dato=SampleDate then begin ySD:=yXD; mSD:=mXD; dSD:=dXD end;
end;

function CalculateAge: Boolean;
begin {we want SampleDate > PatientDate}
  if  (yBD>ySD)
   or ((yBD=ySD) and (mBD>mSD))
   or ((yBD=ySD) and (mBD=mSD) and (dBD>dSD)) then Result:=false else
  begin if dSD < dBD then
    begin Dec(mSD); if mSD = 0 then  begin mSD := 12; Dec(ySD) end;
      Inc(dSD, DaysInMonth(mSD, ySD));
    end;
    dAge := dSD - dBD;
    if mSD < mBD then begin Inc(mSD, 12); Dec(ySD) end;
    mAge := mSD - mBD; yAge := ySD - yBD;
    If yAge>0 then begin Age:=yAge; AgeUnit:='y' end else
    if mAge>2 then begin Age:=mAge; AgeUnit:='m' end else
    if mAge>0 then begin Age:=trunc((mAge*30+dAge)/7); AgeUnit:='w' end else
                   begin Age:=dAge; AgeUnit:='d'; end;
    Result:=true;
  end
end;



PROCEDURE   CalculateRef;  //Should reference values be functions of Pamb?
Var
  TmPt,  pHmPt,  pCO2mPt, pO2mPt,
  TPtPt, PambPt, FO2dIPt, RQPt, FHbFPt,
  ctHbPt, FCOHbPt, FMetHbPt, cDPGPt, cAlbPt, FBEcfPt:   Double;
  sexfactor: integer;
  pHCalculInputPt: TpHCalculInput;
  O2CalculInputPt: TO2CalculInput;
Begin
  {Temporarily save Patient data}
  pHmPt:=pHm; pCO2mPt:=pCO2m;
  pO2mPt:=pO2m; cDPGPt:=cDPG; cAlbPt:=cAlb; FBEcfPt:=FBEcf;
  PambPt:=Pamb; FO2dIPt:=FO2dI; RQPt:=RQ; FHbFPt:=FHbF;
  ctHbPt:=ctHb; FCOHbPt:=FCOHb; FMetHbPt:=FMetHb;
  TmPt:=Tm; TPtPt:=TPt;
  pHCalculInputPt:=pHCalculInput;
  O2CalculInputPt:=O2CalculInput;
  {We need arithmetic values for sex and age for calculations}
  If Sex='F' THEN sexfactor:=0 ELSE sexfactor:=1;
  If AgeUnit = 'd' then AgeYrs:=Age/365 else
  if AgeUnit = 'w' then AgeYrs:=Age/52 else
  if AgeUnit = 'm' then AgeYrs:=Age/12 else
                        AgeYrs:=Age;
  {Set reference values for all input variables}
  Tm:=37;
  pHm   := (7.41-sexfactor*0.01) - 0.0147*(Tm-TPt);           //pHTRef is independent of TPt
  pCO2m := (5.14+0.36*sexfactor)* exp(0.021*(Tm-TPt)*ln(10)); //pCO2TRef is independent of TPt

  TPt:=37; Pamb:=101.325;     FO2dI:=0.21;  RQ:= 0.85; cAlb:= 0.66;
  Fva:= (2+0.13*AgeYrs)/100;  cDPG  := 5.3 - sexfactor*0.5;

  ctHb  := 8.4 + sexfactor; FCOHb  :=0.005; FMetHb:=0.005; FHbF:=0.005;
  {Calculate all the other variables with consideration of TypeOfBlood}
  pHCalculInput:=pHmpCO2m;
    O2CalculInput:=FvacDPG;
    CalculateVar;
    pHaN:=pHm; pCO2aN:=pCO2m; cBaseEcfaN:=cBaseEcf;
  If (TypeOfBlood<>'Arterial') and (TypeOfBlood<>'Capillary') then
  begin
    pHm  := pHm-0.02;  pCO2m:= pCO2m*1.15;  //or +0.6
    pO2m := 5.0*exp(dbdT*(Tm-37));
    O2CalculInput:=pO2mcDPG;
    CalculateVar;
  end else
  begin
    O2CalculInput:=FvacDPG;
    CalculateVar;
  end;
  {The normal mean value is calculated for each variable including input variables}
  FMain.MEBirthDate.Hint:='Format: '+ShortDateFormat;
  pHmN    := pHm;
  pCO2mN  := pCO2m;
  pO2mN   := pO2m;
  sO2mN   :=sO2m;
  sO2TN   :=sO2T;
  pHTN    := pHT;
  pCO2TN  := pCO2T;
  cdCO2TN := cdCO2T;
  cBaseEcfN :=cBaseEcf;
  cBasePN:= cBaseP;
  cBaseBN:= cBaseB;
  cAlbN:= cAlb;
  FBEcfN:= FBEcf;
  cHCO3TN:=cHCO3T;
  ctCO2PTN:=ctCO2PT;
  ctCO2BTN:=ctCO2BT;
  pHstdN:=pHstd;
  cHCO3stdN:=cHCO3std;
  TPtN    := TPt;
  PambN  := Pamb;
  FO2dIN := FO2dI;
  pO2hIN := pO2hI;
  RQN  := RQ;
  pO2AlvN := pO2Alv;
  FvaN    :=Fva;
  pxN  :=px;
  pO2TN  := pO2T;
  pO2TvN   := pxN;
  cDPGN   := cDPG;
  FHbFN := FHbF;
  p50TN   := p50T;
  p50stdN:=p50std;  //not used ??
  ctHbN   := ctHb;
  FCOHbN  := FCOHb;
  FMetHbN := FMetHb;
  ceHbN   := ceHb;
  ctO2N   :=ctO2;
  ctO2AlvN:=ctO2Alv;
  cO2HbN  := cO2Hb;
  cdO2TN  := cdO2T;
  ctO25N  := ctO25;
  cxN  := cx;
  DctO2avN:=2.3;
  DctCO2avN:=DctO2avN*RQN;
  cLacN := 0.9;

  {Return to patient values}
  Tm  :=TmPt;   pHm  :=pHmPt;   pCO2m :=pCO2mPt; pO2m:=pO2mPt; cDPG:=cDPGPt;
  TPt :=TPtPt;  Pamb :=PambPt;  FO2dI :=FO2dIPt; RQ  :=RQPt;   FHbF:=FHbFPt;
  ctHb:=ctHbPt; FCOHb:=FCOHbPt; FMetHb:=FMetHbPt; cAlb:=cAlbPt; FBEcf:=FBEcfPt;
  O2CalculInput:=pO2mcDPG;
  pHCalculInput:=pHmpCO2m;
  CalculateVar;
  pHCalculInput:=pHCalculInputPt;
  O2CalculInput:=O2CalculInputPt;
  FMain.HintChange;

end; {Procedure CalculateRef}


END.
