[Last revised - April 11, 2021]
To the BROOK90 Home page
In general, BROOK90 algorithms, and thus results, have changed very little since Version 3.1. Those changes that could affect results are shown in full bold face below and in Version 4 Updates. The primary change involves the weighting for interlayer hydraulic conductivity. However, for most sudies, the changes are probably insignificant, making BROOK90 a very stable model.
As of June 15, 2019 I have added a CC0 1.0 Universal License to BROOK90. This clarifies that my versions of BROOK90 and their documentation are in the public domain (not copyright). The full text of this license is at CC0 License and is in the Help menu on the BROOK90 main window.
Interlayer K Weighting and Gradient -
All BROOK90 versions through 3.3 and 4.3 used interpolated interlayer
conductivities and potential gradients based on layer thickness in subroutine
VERT. The original equations produced too little flow with a thick wet layer
over a thin dry one. The fix attempted in Versions 3.3 and 4.2/4.3 reversed
the problem and gave too little flow with a thin wet layer over a thick dry
one. The solution seems to be to treat the interface as if it cannot "see"
the thickness of a thick layer. So the equations now are:
KKMEANi = exp((ln(KKi) + ln(KKi+1)) / 2)
GRADi = (PSITi - PSITi+1) / RMIN(THICKi, THICKi+1)
Results do not differ among versions for simulations in which all layers have the same thickness. Differences are generally small unless both layer thickness and dryness differ greatly.
CS error fixed. - In all version 3.2x and version 3.3 changes in the Fixed parameter CS are not made or saved due to a code error. To change CS, edit the parameter file externally. This is corrected in Version 3.4.
International awareness, comma as decimal - Parts of BROOK90 should now respond properly to changing Windows-ControlPanel-RegionalSettings. The earlier incomplete test for a comma as decimal has been improved. Data files now may have either comma or period as the decimal point with space separators, or may be a .CSV file with period as decimal and comma as separator. Both saved and printed output conform to the Windows RegionalSetting. However, parameter files must always include a comma separator after the parameter name and decimal periods, as in previous versions. (Thanks to Ute Assmann for raising this issue.)
Parameters can be changed within a run. However, changes in Soil and Flow parameters will lead to erroneous results as some of these parameters are used only at the beginning of a run. In other words, don't change parameters in the middle of a run that are unlikely to change from one day to the next in reality!
Version 3.3 changed the K weighting but badly - see Version 3.4 above.
Comma-separated Values - (.csv) files saved from spreadsheets like Excel can be used for BROOK90 data files. The .csv file must have the correct 10 columns for daily input files and 6 columns for precipitation interval files. The .csv file must not remain open in Excel or BROOK90 won't be able to access it. For Version 3.2x the header line of the daily input files is still needed. If this header is in the first row of the spread sheet, then the first line of the saved .csv file will have extra commas. These must be removed with a text editor or various types of strange behavior will occur in BROOK90.
Parameter name changes - The call to subroutine ROUGH and the routine itself have variable Z0G changed to Z0GS. The effect of this bug was small. In subroutine SWGRA Z0G also changed to Z0GS to avoid confusing a variable with a parameter. Variables named CS and CC in subroutine SWPE were renamed to CCS and CCC to avoid confusion with the different global variables of the same name.
Parameter saving - Corrected the problem that if Fixed parameters were saved after a run, the final INTR and INTS were saved instead of the initial values. This could have caused errors for some users.
Bucket Model - In earlier versions setting QFPAR to zero to simulate a bucket model does not work quite right because QFPAR is reset to 0.01; QFFC should be set to 0.5.
EVAL Class Bug Fixed - The MID class in EVAL was defined as <5.0 mm flow in code through Version 3.23 instead of <=5.0mm; this is fixed in Version 3.24 thanks to Dan Strobridge. This fix changes EVAL results for the HB default files because one day is moved from HIGH to MID.
EVAL Column Bug Fixed - After a Rerun for Added Output, EVAL continued to use the first MESFLO and FLOW columns in the daily output, so continues to give the same results even if new MESFLO and FLOW columns are added. This is fixed in Version 3.24.
Parameter CR in Documentation - The parameter CR is the extinction coefficient for both net radiation (to get net radiation at the ground, ASUBS on page SUN-3) and visible light (to get light control on stomatal conductance, equation 34 on page PET-11). The documentation does not make clear that this is theoretically incorrect because visible light decreases much more rapidly than solar or net radiation downward into the canopy. Given the uncertainty in the other parameters in equation 33 there is not much point in differentiating the two values.
AWAT - When there are no roots, e.g. when RELHT = 0, there is no TRAN and available water AWAT = 0.
Arctic Winter Problem - A zero divide problem exists in the call to routine AVAILEN when I0HDAY = 0, that is, when the sun does not rise in arctic winter. BROOK90 is undoubtedly not applicable then anyway!! Users of the routine should reprogram so SOLRAD/I0HDAY in the call is set to 0.5 to simulate an average cloud cover for the longwave calculation. (A related potential problem of measured solar radiation exceeding potential for the day is handled by the existing maximum value of NOVERN = 1.)
Version 3.23 slightly modified to fix overrounding of KF and PSIM when saving parameter file.
KPT Graph - Version 3.23 adds an onscreen "KPT Graph" of hydraulic conductivity, K, and soil water content, THETA, vs. log of soil matric potential, PSI, for up to 7 selected soil layers. Both linear and log K curves are shown.
Saturated K - BROOK90 versions from 3.23 on can run with KF as the saturated K, THETAF = THSAT, and PSIF as the air-entry value, for instance with the original Clapp-Hornberger values. However, users who do this must realize that parameters RSSA, RSSB, QFPAR, and QFFC, which affect soil evaporation, surface flow, and bypass flow are also defined in terms of field capacity as specified by PSIF and THETAF; these processes therefore may not operate correctly and should be turned off. Click on path names in Help - Flow Chart for how to turn off specific paths.
First Windows Version
Infiltration through Layers - Added output selection of the (macropore) infiltration downward out of each layer. This variable did not previously have a name; it is now called SLFL(I), the SoiL inFiLtration downward out of layer I. SLFL(I) only occurs when INFEXP is greater than 0. Note that SLFL without subscript is the infiltration into the soil surface - effectively SLFL(0) - and is unaffected by the value of INFEXP. VRFL(I) (the vertical matrix flow out of a layer) is only the matrix flow out of each layer, and does not include SLFL(I). The total vertical flow out of a layer is VRFL(I) plus SRFL(I). This is not clearly stated in the documentation or in Version 3.22 and earlier Help. SLFL(I) either becomes bypass flow from deeper layers or becomes soil water in deeper layers. VRFL(I) will generally increase with depth as SLFL(I) decreases. For lysimeter work, users may want to assume that suction lysimeters collect VRFL(I) whereas zero-tension lysimeters collect both VRFL(I) and SLFLI(I).
Output with Precip Interval <1 Day - In Versions 3.1F and 3.1Q,
in the B90 main program under BEGIN PRECIP INTERVAL, .00001 should be changed
to -.01 and DTP changed to DT to read as follows:
IF (MESFLP <= -.01) THEN MESFLP = MESFL / DT
'one precip interval per day >
MESFLP = MESFL / DT
Also in POUTPUT.INC, MESFLP should not be divided by DTP in two places.
MESFLP is already a rate (unlike the other variable names ending in P, which are totals for the precip interval). These MESFLP fixes only affect anyone who has input or output measured flow with more than one precipitation interval per day, that is, used a PRFILE.
Obscure Bug - In Version 3.1, in the routine TBYLAYER the first section
FOR I% = 1 TO NLAYER%
IF (RROOTI(I%) > 1E+15) THEN
FLAG%(I%) = 1
ELSE IF (NOOUTF% = 1 AND PSITI(I%) / 1000! <= PSICR) THEN
FLAG%(I%) = 1
FLAG%(I%) = 0
This bug only appeared when MXRTLN was changed to zero for all layers in the middle of a Version 3.2 run. FLAG%(I%) was erroneously not set to one even when there were no roots, SUM was <1E-20, and the routine was exited without setting ATRAN(I%) to zero. This should not have affected Version 3.1 runs where ATRANI(I%) would default to a zero value throughout the run if there were no roots in any layer.