public void CalculateFogIndex() { // Based on FSI formula: fsi = 4ts - 2(t850 + tds) + w850 var W850 = Earth.ATM.MidLevel.P.Gradient2(); var DIV = (Earth.ATM.MidLevel.P.Divergence()).EQ(4); FOG.Assign((r, c) => { var div = DIV[r, c]; if (div <= 0) { var ts = TS[r, c]; var t850 = Earth.ATM.MidLevel.T[r, c]; var w850 = W850[r, c]; var t = TE[r, c]; var hMid = Earth.ATM.MidLevel.H[r, c]; var hSea = Earth.ATM.SeaLevel.H[r, c]; var h = 0.5f * (hMid + hSea); var pMid = Earth.ATM.MidLevel.P[r, c]; var pSea = Earth.ATM.SeaLevel.P[r, c]; var dp = (pSea - pMid) / SimConstants.LevelHeights[LevelType.MidLevel]; var p = pSea - dp * Height[r, c]; var tds = LapseRate.DewPoint(p, t, h); var fsi = 2 * (4 * ts - 2 * (t850 - tds) + w850); if (fsi > 100) { return(100); } if (fsi < 0) { return(0); } return(fsi); } return(100); }); }