[Dart-dev] [5584] DART/branches/development/assim_tools/assim_tools_mod.f90: applying patches from Kodiak branch.

nancy at ucar.edu nancy at ucar.edu
Wed Feb 29 13:35:44 MST 2012


Revision: 5584
Author:   nancy
Date:     2012-02-29 13:35:44 -0700 (Wed, 29 Feb 2012)
Log Message:
-----------
applying patches from Kodiak branch.  see log for rev 5577.
fixes rare R4 underflow that results in a divide by 0.

Modified Paths:
--------------
    DART/branches/development/assim_tools/assim_tools_mod.f90

Property Changed:
----------------
    DART/branches/development/assim_tools/assim_tools_mod.f90

-------------- next part --------------
Modified: DART/branches/development/assim_tools/assim_tools_mod.f90
===================================================================
--- DART/branches/development/assim_tools/assim_tools_mod.f90	2012-02-29 20:31:18 UTC (rev 5583)
+++ DART/branches/development/assim_tools/assim_tools_mod.f90	2012-02-29 20:35:44 UTC (rev 5584)
@@ -1429,7 +1429,7 @@
 real(r8),           intent(inout) :: net_a
 real(r8), optional, intent(inout) :: correl_out
 
-real(r8) :: obs_state_cov
+real(r8) :: obs_state_cov, intermed
 real(r8) :: restoration_inc(ens_size), state_mean, state_var, correl
 real(r8) :: factor, exp_true_correl, mean_factor
 
@@ -1444,14 +1444,28 @@
 endif
 
 ! If correl_out is present, need correl for adaptive inflation
-! Also needed for file correction below
+! Also needed for file correction below.
+
+! WARNING: we have had several different numerical problems in this
+! section, especially with users running in single precision floating point.
+! Be very cautious if changing any code in this section, taking into
+! account underflow and overflow for 32 bit floats.
+
 if(present(correl_out) .or. sampling_error_correction) then
-   state_var = sum((state - state_mean)**2) / (ens_size - 1)
-   if (state_var < 0.0_r8) state_var = 0.0_r8
-   if ((obs_prior_var <= 0.0_r8) .or. (state_var <= 0.0_r8)) then
+   if (obs_state_cov == 0.0_r8 .or. obs_prior_var <= 0.0_r8) then
       correl = 0.0_r8
    else
-      correl = obs_state_cov / sqrt(obs_prior_var * state_var)
+      state_var = sum((state - state_mean)**2) / (ens_size - 1)
+      if (state_var <= 0.0_r8) then
+         correl = 0.0_r8
+      else
+         intermed = sqrt(obs_prior_var) * sqrt(state_var)
+         if (intermed <= 0.0_r8) then
+            correl = 0.0_r8
+         else
+            correl = obs_state_cov / intermed
+         endif
+      endif
    endif
    if(correl >  1.0_r8) correl =  1.0_r8
    if(correl < -1.0_r8) correl = -1.0_r8


Property changes on: DART/branches/development/assim_tools/assim_tools_mod.f90
___________________________________________________________________
Added: svn:mergeinfo
   + /DART/releases/Kodiak/assim_tools/assim_tools_mod.f90:5020-5583
/DART/trunk/assim_tools/assim_tools_mod.f90:4680-5293


More information about the Dart-dev mailing list