DrylandEcology / STEPWAT2

folder
4 stars 5 forks source link

WARNING: RGroup res_avail is Zero and res_required > 0 thrown rarely when root_active_rel does not match transpired water #509

Open kpalmqui opened 3 years ago

kpalmqui commented 3 years ago

This warning has re-appeared in the logfile for some simulations run by @MartinHoldrege for our 200 big sagebrush sites.

The weather inputs have been altered to represent intensification of the hydrological cycle - increased precipitation intensity along with more dry days (no changes to mean annual precipitation).

This occurred very rarely - 60 times for simulations run for 200 sites, 200 iterations, and 150 years (6,000,000 simulated years) - 0.001%

The plant functional types it occurred for: a.cool.forb a.warm.forb a.cool.grass succulents p.cool.forb

This warning is thrown when each of the above plant functional types has biomass > 0 in the given year, but roots_active_rel do not match where (depth) and when (month) total transpiration is available. The active roots of the functional type do not overlap with any available soil water for transpiration. Hence 0 is returned for use_by_group in function _transp_contribution_by_group and ultimately for res_avail downstream.

Here is an example for site 188, seed=15, problem occurs in year 153 for a.warm.forb and succulents.

------------------------Repetition/year = 1 / 153 sagebrush: biomass = 401.348816. a.cool.forb: biomass = 0.000000. a.warm.forb: biomass = 3.321000. p.cool.forb: biomass = 0.000000. p.warm.forb: biomass = 4.724042. a.cool.grass: biomass = 25.000000. p.cool.grass: biomass = 37.961628. p.warm.grass: biomass = 0.000000. shrub: biomass = 18.845034. succulents: biomass = 3.396019.

a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00007650, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00007029, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00458303, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00378436, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00268134, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00034791, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00007291, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.01258775, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.01039324, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00743131, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00101418, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00006724, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.01143053, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00928579, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00643927, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00080904, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00006454, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.01523113, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.01235301, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00850667, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00104743, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00005588, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00517544, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00420921, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00286073, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00032664, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00004869, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00203224, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00164795, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00111882, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00012346, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00003675, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00366312, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00299827, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00201787, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00022183, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00002116, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00577687, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00473093, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00322396, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00036632, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000455, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00230838, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00003693, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000 a.warm.forb: transp=0.00000000, roots_active_rel=0.00000000, use_by_group=0.00000000

There are several soil layer/period combinations for which roots_active_rel> 0 but they do not coincide with transp across any soil layers or months, hence use_by_group is 0.

I do not believe this is a bug, rather, I think it is the result of very dry soil conditions and no water available for transpiration in those layers for a very small handful of years.

use_by_group is reset to _resource_cur in function _sxw_update_resource and then _resource_cur is set to res_avail by function SXW_GetTranspiration

Thereafter, there is a check in rgroup_PartResources which results in the generation of the warning in the logfile and resets both res_avail and res_required:

if (ZRO(g->res_avail) && g->res_required > 0) {
            g->res_required = 0.0;
            Int i;
            ForEachEstSpp2(rg, i) {
                g->res_required += Species[g->est_spp[i]]->est_count;
            }

            g->res_avail = 1;

            LogError(logfp, LOGWARN, "RGroup %s : res_avail is Zero and res_required > 0 in year %d", g->name, Globals->currYear);
        }

I do not think this is an appropriate solution for the current situation. If there is one established individual (Species[g->est_spp[i]]->est_count), this will result in a PR of 1, and no resource limitation. This happens in all cases I have debugged for succulents thus far. Clearly this individual is resource limited.

@MartinHoldrege and I discussed potentially altering this check to force PR to number well above 1, such that mortality would occur (at least for some individuals) in function _no_resources via:

nk = (IntS) ( (n * (1.0 - 1.0/RGroup[rg]->pr))); where nk is number of individuals to be killed and n is number of established individuals

More details and final solution to follow...

@dschlaep tagging you to make you aware of this situation