def launch_model(herb_csv, grass_csv, outdir):
    forage_args = {
        'latitude': 0.02759,
        'prop_legume': 0.0,
        'steepness': 1.,
        'DOY': 270,
        'start_year': 2015,
        'start_month': 11,
        'num_months': 6,
        'mgmt_threshold': 0.1,
        'century_dir':
        'C:/Users/Ginger/Dropbox/NatCap_backup/Forage_model/CENTURY4.6/Century46_PC_Jan-2014',
        'outdir': outdir,
        'template_level': 'GL',
        'fix_file': 'drytrpfi.100',
        'user_define_protein': 0,
        'user_define_digestibility': 0,
        'herbivore_csv': herb_csv,
        'grass_csv': grass_csv,
        'supp_csv':
        "C:/Users/Ginger/Dropbox/NatCap_backup/Forage_model/Forage_model/model_inputs/Rubanza_et_al_2005_supp.csv",
        'input_dir':
        "C:/Users/Ginger/Dropbox/NatCap_backup/Forage_model/CENTURY4.6/Kenya/input",
        'diet_verbose': 0,
        'restart_monthly': 0,
        'restart_yearly': 0,
        'grz_months': None,
    }
    forage.execute(forage_args)
Пример #2
0
def launch_model(input_dir, outdir, herb_csv, grass_csv):
    """Inputs for the forage model in Peru"""

    forage_args = {
        'latitude': -12.55,
        'prop_legume': 0.0,
        'steepness': 1.,
        'DOY': 1,
        'start_year': 1993,
        'start_month': 1,
        'num_months': 204,
        'mgmt_threshold': 0.8,
        'century_dir':
        'C:/Users/Ginger/Dropbox/NatCap_backup/Forage_model/CENTURY4.6/Century46_PC_Jan-2014',
        'outdir': outdir,
        'template_level': 'GH',
        'fix_file': 'gfix.100',
        'user_define_protein': 1,
        'user_define_digestibility': 1,
        'herbivore_csv': herb_csv,
        'grass_csv': grass_csv,
        'supp_csv':
        "C:/Users/Ginger/Dropbox/NatCap_backup/Forage_model/Forage_model/model_inputs/Rubanza_et_al_2005_supp.csv",
        'input_dir': input_dir,
        'diet_verbose': 0,
        'restart_yearly': 1,
        'restart_monthly': 1,
    }
    forage.execute(forage_args)
Пример #3
0
def launch_model(herb_csv, outdir, restart_monthly=0):
    input_dir = r"C:\Users\Ginger\Dropbox\NatCap_backup\Forage_model\CENTURY4.6\Kenya\input"
    # 'grass_csv': "C:/Users/Ginger/Dropbox/NatCap_backup/Forage_model/Forage_model/model_inputs/facilitation_exploration/grasses_diet_illustration.csv",
    forage_args = {
        'latitude': 0.02759,
        'prop_legume': 0.0,
        'steepness': 1.,
        'DOY': 1,
        'start_year': 2015,
        'start_month': 1,
        'num_months': 12,
        'mgmt_threshold': 0.1,
        'century_dir':
        'C:/Users/Ginger/Dropbox/NatCap_backup/Forage_model/CENTURY4.6/Century46_PC_Jan-2014',
        'outdir': outdir,
        'template_level': 'GH',
        'fix_file': 'drytrpfi.100',
        'user_define_protein': 0,
        'user_define_digestibility': 0,
        'herbivore_csv': herb_csv,
        'grass_csv':
        "C:/Users/Ginger/Dropbox/NatCap_backup/Forage_model/Forage_model/model_inputs/C_dactylon_T_triandra.csv",
        'supp_csv':
        "C:/Users/Ginger/Dropbox/NatCap_backup/Forage_model/Forage_model/model_inputs/Rubanza_et_al_2005_supp.csv",
        'input_dir': input_dir,
        'restart_yearly': 0,
        'diet_verbose': 1,
        'restart_monthly': restart_monthly,
    }
    forage.execute(forage_args)
Пример #4
0
def rest_effect_wrapper():
    """Can we show that there are any beneficial effects to grazing, or to
    grazing with rest?"""

    # first run with no grazing
    outdir = r"C:\Users\ginge\Dropbox\NatCap_backup\WitW\model_results\Ucross\rest_effect\zero_sd"
    num_animals = 0
    total_area_ha = 1

    forage_args = default_forage_args()
    forage_args[
        'grass_csv'] = r"C:\Users\ginge\Dropbox\NatCap_backup\WitW\model_inputs\Ucross\grass_high_quality_only.csv"
    rotation.continuous(forage_args, total_area_ha, num_animals, outdir)

    outer_dir = r"C:\Users\ginge\Dropbox\NatCap_backup\WitW\model_results\Ucross\rest_effect"
    remove_months = [1, 2, 3, 11, 12]
    sd_list = [0.25, 0.5, 0.75, 1]
    for sd in sd_list:
        num_animals = sd
        outdir = os.path.join(outer_dir, '{}_cont'.format(sd))
        rotation.continuous(forage_args, total_area_ha, num_animals, outdir,
                            remove_months)
        for rest_period in [1, 2, 3, 4]:
            forage_args['grz_months'] = generate_grz_months_rest_period(
                forage_args['num_months'], rest_period)
            outdir = os.path.join(outer_dir,
                                  '{}_rest_{}_per_ha'.format(rest_period, sd))
            forage_args['outdir'] = outdir
            rotation.modify_stocking_density(forage_args['herbivore_csv'], sd)
            forage.execute(forage_args)
Пример #5
0
def launch_biomass_calibration():
    input_dir = "C:/Users/Ginger/Dropbox/NatCap_backup/CGIAR/Peru/Forage_model_inputs/plant_calibration"
    outer_dir = "C:/Users/Ginger/Dropbox/NatCap_backup/CGIAR/Peru/Forage_model_results/plant_calibration"
    forage_args = {
        'latitude': -12.55,
        'prop_legume': 0.0,
        'steepness': 1.,
        'DOY': 1,
        'start_year': 1993,
        'start_month': 1,
        'num_months': 282,
        'mgmt_threshold': 0.1,
        'century_dir':
        'C:/Users/Ginger/Dropbox/NatCap_backup/Forage_model/CENTURY4.6/Century46_PC_Jan-2014',
        'outdir': "",
        'template_level': 'GL',
        'fix_file': 'gfix.100',
        'user_define_protein': 1,
        'user_define_digestibility': 1,
        'herbivore_csv': "",
        'grass_csv': "",
        'supp_csv':
        "C:/Users/Ginger/Dropbox/NatCap_backup/Forage_model/Forage_model/model_inputs/Rubanza_et_al_2005_supp.csv",
        'input_dir': input_dir,
        'restart_yearly': 1,
        'diet_verbose': "",
    }
    for subbasin in [4]:
        grass_csv = os.path.join(input_dir, 'Pajonal_%d.csv' % subbasin)
        forage_args['grass_csv'] = grass_csv
        forage_args['herbivore_csv'] = None
        out_dir = os.path.join(outer_dir, 's%d_run7' % subbasin)
        forage_args['outdir'] = out_dir
        #if not os.path.exists(out_dir):
        forage.execute(forage_args)
Пример #6
0
def run_empirical_stocking_density():
    """Run the model forward from the date of the first empirical biomass
    measurement, using the back-calculated management history that was
    calculated to match the first measurement.  Impose empirical stocking
    density as calculated from GPS records."""

    input_dir = "C:/Users/Ginger/Dropbox/NatCap_backup/Forage_model/CENTURY4.6/Kenya/input/integrated_test"
    outer_output_dir = r"C:\Users\Ginger\Dropbox\NatCap_backup\Forage_model\Forage_model\Verification_calculations\OPC_integrated_test\empirical_stocking_density"
    century_dir = 'C:/Users/Ginger/Dropbox/NatCap_backup/Forage_model/CENTURY4.6/Century46_PC_Jan-2014'
    site_list = empirical_series_definition()
    for site in site_list:
        start_mo = site['start_mo']
        # find graz file associated with back-calc management
        graz_filter = [
            f for f in os.listdir(input_dir)
            if f.startswith('graz_{}'.format(site['name']))
        ]
        if len(graz_filter) == 1:
            graz_file = os.path.join(input_dir, graz_filter[0])
            def_graz_file = os.path.join(century_dir, 'graz.100')
            shutil.copyfile(def_graz_file,
                            os.path.join(century_dir, 'default_graz.100'))
            shutil.copyfile(graz_file, def_graz_file)
        outdir = os.path.join(outer_output_dir, site['name'])
        grass_csv = os.path.join(input_dir, '{}.csv'.format(site['name']))
        forage_args = {
            'latitude': 0.02759,
            'prop_legume': 0.0,
            'steepness': 1.,
            'DOY': 1,
            'start_year': 2015,
            'start_month': start_mo,
            'num_months': 13 - start_mo,
            'mgmt_threshold': 0.1,
            'century_dir': century_dir,
            'outdir': outdir,
            'template_level': 'GL',
            'fix_file': 'drytrpfi.100',
            'user_define_protein': 0,
            'user_define_digestibility': 0,
            'herbivore_csv':
            "C:/Users/Ginger/Dropbox/NatCap_backup/Forage_model/Forage_model/model_inputs/herd_avg_calibrated.csv",
            'grass_csv': grass_csv,
            'supp_csv':
            "C:/Users/Ginger/Dropbox/NatCap_backup/Forage_model/Forage_model/model_inputs/Rubanza_et_al_2005_supp.csv",
            'input_dir': input_dir,
            'diet_verbose': 0,
            'restart_monthly': 1,
            'restart_yearly': 0,
            'grz_months': site['grz_months'],
            'density_series': site['dens_series'],
        }
        forage.execute(forage_args)
        os.remove(def_graz_file)
        shutil.copyfile(os.path.join(century_dir, 'default_graz.100'),
                        def_graz_file)
        os.remove(os.path.join(century_dir, 'default_graz.100'))
Пример #7
0
def rotation(forage_args, n_pastures, pasture_size_ha, num_animals,
             outer_outdir):
    """Rotation with allocation of rotated animals to pasture with highest
    total biomass."""

    time_step = 'month'
    rot_length = 1  # if time triggers rotation, how many steps each pasture should be grazed at a time

    # calculate overall density, assuming equal pasture size and 1 herd
    stocking_dens = float(num_animals) / pasture_size_ha
    modify_stocking_density(forage_args['herbivore_csv'], stocking_dens)

    # initialize grazing months list for each pasture
    grz_mo_list = [[] for n in range(n_pastures)]

    # launch simulations
    total_steps = forage_args['num_months']
    for rot_step in range(rot_length, total_steps,
                          rot_length):  # one rotation length at a time
        forage_args['num_months'] = rot_step  # accumulate with each rot_step
        target_step = rot_step - rot_length  # target date to measure biomass; when grazing would start
        step_month = forage_args[u'start_month'] + target_step
        if step_month > 12:
            mod = step_month % 12
            if mod == 0:
                month = 12
                year = (step_month / 12) + forage_args[u'start_year'] - 1
            else:
                month = mod
                year = (step_month / 12) + forage_args[u'start_year']
        else:
            month = step_month
            year = (target_step / 12) + forage_args[u'start_year']
        date = year + float('%.2f' % (month / 12.))
        if rot_step == rot_length:
            max_pidx = 0  # use first pasture by default in first step
        else:
            max_pidx = get_max_biomass_pasture(outer_outdir, forage_args,
                                               n_pastures, date)
        grz_mo_list[max_pidx].extend(range(rot_step - rot_length,
                                           rot_step))  # next rotation step
        for pidx in range(n_pastures):  # launch each pasture
            forage_args['outdir'] = os.path.join(outer_outdir,
                                                 'p_{}'.format(pidx))
            forage_args['grz_months'] = grz_mo_list[pidx]
            forage.execute(forage_args)

    # collect results
    collect_rotation_results(forage_args, n_pastures, outer_outdir)
def calc_n_mult(forage_args, target):
    """calculate N multiplier for a grass to achieve target cp content. 
    Target should be supplied as a float between 0 and 1."""

    # verify that N multiplier is initially set to 1
    grass_df = pd.read_csv(forage_args['grass_csv'])
    current_value = grass_df.iloc[0].N_multiplier
    assert current_value == 1, "Initial value for N multiplier must be 1"

    # launch model to get initial crude protein content
    forage.execute(forage_args)

    # find output
    final_month = forage_args[u'start_month'] + forage_args['num_months'] - 1
    if final_month > 12:
        mod = final_month % 12
        if mod == 0:
            month = 12
            year = (final_month / 12) + forage_args[u'start_year'] - 1
        else:
            month = mod
            year = (final_month / 12) + forage_args[u'start_year']
    else:
        month = final_month
        year = (step / 12) + forage_args[u'start_year']
    intermediate_dir = os.path.join(forage_args['outdir'],
                                    'CENTURY_outputs_m%d_y%d' % (month, year))
    grass_label = grass_df.iloc[0].label
    sim_output = os.path.join(intermediate_dir, '{}.lis'.format(grass_label))

    # calculate n multiplier to achieve target
    first_year = forage_args['start_year']
    last_year = year
    outputs = cent.read_CENTURY_outputs(sim_output, first_year, last_year)
    outputs.drop_duplicates(inplace=True)
    cp_green = np.mean(outputs.aglive1 / outputs.aglivc)
    n_mult = '%.2f' % (target / cp_green)

    # edit grass csv to reflect calculated n_mult
    grass_df.N_multiplier = grass_df.N_multiplier.astype(float)
    grass_df = grass_df.set_value(0, 'N_multiplier', float(n_mult))
    grass_df = grass_df.set_index('label')
    grass_df.to_csv(forage_args['grass_csv'])
Пример #9
0
def blind_rotation(forage_args,
                   total_area_ha,
                   n_pastures,
                   num_animals,
                   outer_outdir,
                   remove_months=None):
    """first stab at implementing rotation with the rangeland production
    model.  This version is "blind" because it is not responsive to pasture
    biomass. forage_args should contain arguments to run the model, and we
    assume that all pastures are run identically. n_pastures is how many
    pastures to rotate the herd among. We assume all pastures are equal size,
    and there is just one animal herd."""

    time_step = 'month'
    rot_length = 1  # if time triggers rotation, how many steps each pasture should be grazed at a time

    # calculate overall density, assuming equal pasture size and 1 herd
    pasture_size_ha = float(total_area_ha) / n_pastures
    stocking_dens = float(num_animals) / pasture_size_ha
    modify_stocking_density(forage_args['herbivore_csv'], stocking_dens)

    # generate grz_months for each pasture
    total_steps = forage_args['num_months']  # TODO daily time step ?
    grz_mo_list = generate_grz_months(total_steps, rot_length, n_pastures)

    # launch simulations
    for pidx in range(n_pastures):
        forage_args['outdir'] = os.path.join(outer_outdir, 'p_{}'.format(pidx))
        grz_months = grz_mo_list[pidx]
        if remove_months:
            # no grazing in remove_months
            assert forage_args[
                'start_month'] == 1, "I can't figure out how to handle starting month other than 1"
            for r in remove_months:
                grz_months = [m for m in grz_months if (m % 12) != (r - 1)]
        forage_args['grz_months'] = grz_months
        if not os.path.exists(
                os.path.join(outer_outdir, 'p_{}'.format(pidx),
                             'summary_results.csv')):
            forage.execute(forage_args)

    # collect results
    collect_rotation_results(forage_args, n_pastures, outer_outdir)
Пример #10
0
def run_test(args, input_dir, outer_dir, herbivore_csv, grass_label):
    """Run the test to increase stocking density until biomass reaches the
    threshold, or for 10 iterations."""

    orig_herbivore_csv = os.path.join(
        os.path.dirname(herbivore_csv),
        os.path.basename(herbivore_csv)[:-4] + '_orig.csv')
    shutil.copyfile(herbivore_csv, orig_herbivore_csv)
    args['herbivore_csv'] = herbivore_csv
    sd_list = np.linspace(0.17535, 2, num=6)
    try:
        for sd in sd_list:
            modify_stocking_density(herbivore_csv, sd)
            args['outdir'] = os.path.join(outer_dir, "outputs_%f" % sd)
            if not os.path.exists(args['outdir']):
                os.makedirs(args['outdir'])
            shutil.copyfile(herbivore_csv,
                            os.path.join(args['outdir'], 'herbivore.csv'))
            forage.execute(args)
    finally:
        shutil.copyfile(orig_herbivore_csv, herbivore_csv)
        os.remove(orig_herbivore_csv)
Пример #11
0
def run_zero_density():
    """Compare productivity at the 6 sites with zero grazing pressure."""

    input_dir = "C:/Users/Ginger/Dropbox/NatCap_backup/Forage_model/CENTURY4.6/Kenya/input/zero_dens"
    outer_output_dir = r"C:\Users\Ginger\Dropbox\NatCap_backup\Forage_model\Forage_model\Verification_calculations\OPC_integrated_test\zero_dens"
    century_dir = 'C:/Users/Ginger/Dropbox/NatCap_backup/Forage_model/CENTURY4.6/Century46_PC_Jan-2014'
    site_list = empirical_series_definition()
    for site in site_list:
        outdir = os.path.join(outer_output_dir, '{}'.format(site['name']))
        grass_csv = os.path.join(input_dir, '{}.csv'.format(site['name']))
        forage_args = {
            'latitude': 0.02759,
            'prop_legume': 0.0,
            'steepness': 1.,
            'DOY': 1,
            'start_year': 2015,
            'start_month': 1,
            'num_months': 12,
            'mgmt_threshold': 0.1,
            'century_dir': century_dir,
            'outdir': outdir,
            'template_level': 'GL',
            'fix_file': 'drytrpfi.100',
            'user_define_protein': 0,
            'user_define_digestibility': 0,
            'herbivore_csv':
            "C:/Users/Ginger/Dropbox/NatCap_backup/Forage_model/Forage_model/model_inputs/herd_avg_calibrated.csv",
            'grass_csv': grass_csv,
            'supp_csv':
            "C:/Users/Ginger/Dropbox/NatCap_backup/Forage_model/Forage_model/model_inputs/Rubanza_et_al_2005_supp.csv",
            'input_dir': input_dir,
            'diet_verbose': 0,
            'restart_monthly': 1,
            'restart_yearly': 0,
            'grz_months': [],
        }
        forage.execute(forage_args)
Пример #12
0
def calibrate():
    """Calibrate the model to estimated sustainable capacity of the study area,
    according to the Yauyos Cochas report."""

    input_dir = "C:/Users/Ginger/Dropbox/NatCap_backup/CGIAR/Peru/Forage_model_inputs"
    outer_dir = "C:/Users/Ginger/Dropbox/NatCap_backup/CGIAR/Peru/Forage_model_results/calibrate_4.27.16/custom_calibration_2"
    forage_args = {
        'latitude': -12.55,
        'prop_legume': 0.0,
        'steepness': 1.,
        'DOY': 1,
        'start_year': 1991,
        'start_month': 1,
        'num_months': 12,
        'mgmt_threshold': 0.1,
        'century_dir':
        'C:/Users/Ginger/Dropbox/NatCap_backup/Forage_model/CENTURY4.6/Century46_PC_Jan-2014',
        'outdir': "",
        'template_level': 'GL',
        'fix_file': 'gfix.100',
        'user_define_protein': 1,
        'user_define_digestibility': 1,
        'herbivore_csv': "",
        'grass_csv': "",
        'supp_csv':
        "C:/Users/Ginger/Dropbox/NatCap_backup/Forage_model/Forage_model/model_inputs/Rubanza_et_al_2005_supp.csv",
        'input_dir': input_dir,
    }
    for anim_type in ['cow', 'sheep', 'camelid']:
        grass_csv = os.path.join(input_dir, 'Pajonal_5_calib.csv')
        herbivore_csv = os.path.join(input_dir, anim_type + '_calib.csv')
        forage_args['grass_csv'] = grass_csv
        forage_args['herbivore_csv'] = herbivore_csv
        out_dir = os.path.join(outer_dir, '%s' % anim_type)
        forage_args['outdir'] = out_dir
        # if not os.path.exists(out_dir):
        forage.execute(forage_args)
Пример #13
0
def continuous(forage_args,
               total_area_ha,
               num_animals,
               outdir,
               remove_months=None):
    """Continuous grazing, no rotation. If remove_months is supplied, grazing
    does not happen during those months. Remove_months should be a list of
    calendar months of the year (i.e. 1=January, 12=December)."""

    stocking_dens = float(num_animals) / total_area_ha
    modify_stocking_density(forage_args['herbivore_csv'], stocking_dens)
    forage_args['outdir'] = outdir

    if remove_months:
        # no grazing in remove_months
        assert forage_args[
            'start_month'] == 1, "I can't figure out how to handle starting month other than 1"
        grz_months = range(0, forage_args['num_months'])
        for r in remove_months:
            grz_months = [m for m in grz_months if (m % 12) != (r - 1)]
    else:
        grz_months = range(forage_args['num_months'])
    forage_args['grz_months'] = grz_months
    forage.execute(forage_args)
Пример #14
0
def stocking_density_percent_new_growth_test():
    save_as = r"C:\Users\Ginger\Dropbox\NatCap_backup\Forage_model\Forage_model\model_results\OPC\stocking_density_new_growth\n_mult_start_2014\growth_summary.csv"
    grass_csv = r"C:\Users\Ginger\Dropbox\NatCap_backup\Forage_model\CENTURY4.6\Kenya\input\zero_dens_2013\OPC_avg.csv"
    herb_csv = r"C:\Users\Ginger\Dropbox\NatCap_backup\Forage_model\Forage_model\model_inputs\herd_avg_uncalibrated.csv"
    outer_out_dir = r"C:\Users\Ginger\Dropbox\NatCap_backup\Forage_model\Forage_model\model_results\OPC\stocking_density_new_growth\n_mult_start_2014"
    target = 0.14734
    sum_dict = {
        'stocking_density': [],
        'year': [],
        'month': [],
        'label': [],
        'biomass': []
    }
    n_mult_dict = {'stocking_density': [], 'n_mult': []}
    forage_args = {
        'latitude': -0.0040,
        'prop_legume': 0.0,
        'steepness': 1.,
        'DOY': 1,
        'start_year': 2014,
        'start_month': 11,
        'num_months': 14,
        'mgmt_threshold': 0.1,
        'century_dir':
        'C:/Users/Ginger/Dropbox/NatCap_backup/Forage_model/CENTURY4.6/Century46_PC_Jan-2014',
        'template_level': 'GL',
        'fix_file': 'drytrpfi.100',
        'user_define_protein': 0,
        'user_define_digestibility': 0,
        'herbivore_csv': herb_csv,
        'grass_csv': grass_csv,
        'supp_csv':
        "C:/Users/Ginger/Dropbox/NatCap_backup/Forage_model/Forage_model/model_inputs/Rubanza_et_al_2005_supp.csv",
        'input_dir':
        r"C:\Users\Ginger\Dropbox\NatCap_backup\Forage_model\CENTURY4.6\Kenya\input\zero_dens",
        'restart_yearly': 0,
        'diet_verbose': 0,
        'restart_monthly': 1,
    }
    for sd in [0.1, 0.45, 0.8]:
        n_mult_dict['stocking_density'].append(sd)
        modify_stocking_density(herb_csv, sd)
        outdir = os.path.join(outer_out_dir, 'cattle_%s' % str(sd))
        forage_args['outdir'] = outdir
        calc_n_mult(forage_args, target)
        grass_df = pandas.read_csv(grass_csv)
        n_mult = grass_df.iloc[0].N_multiplier
        n_mult_dict['n_mult'].append(n_mult)
        forage.execute(forage_args)
        for year in [2014, 2015]:
            sum_dict['year'] = sum_dict['year'] + [year] * 96
            sum_dict['month'] = sum_dict['month'] + (range(1, 13) * 8)
            sum_dict[
                'stocking_density'] = sum_dict['stocking_density'] + [sd] * 96
            sum_dict['label'] = sum_dict['label'] + ['new_growth'] * 12 + \
                                                    ['live_biomass'] * 12 + \
                                                    ['total_biomass'] * 12 + \
                                                    ['n_content_live'] * 12 + \
                                                    ['weighted_cp_avg'] * 12 + \
                                                    ['perc_green'] * 12 + \
                                                    ['liveweight_gain'] * 12 + \
                                                    ['liveweight_gain_herd'] * 12
            new_growth_results_list = calculate_new_growth(
                outdir, grass_csv, year)
            new_growth = new_growth_results_list[0]
            live_biomass = new_growth_results_list[1].tolist()
            biomass = new_growth_results_list[2].tolist()
            n_content_live = new_growth_results_list[3]
            weighted_cp_avg = new_growth_results_list[4]
            perc_green = new_growth_results_list[5]
            n_content = np.multiply(n_content_live, n_mult).tolist()
            weight_df = pandas.read_csv(
                os.path.join(outdir, 'summary_results.csv'))
            weight_df = weight_df.loc[weight_df['year'] == year]
            gain = weight_df.cattle_gain_kg.values.tolist()
            if len(gain) < 12:
                gain = [0] * (12 - len(gain)) + gain
            gain_herd = np.multiply(gain, sd).tolist()
            sum_dict['biomass'] = sum_dict['biomass'] + new_growth + \
                                    live_biomass + \
                                    biomass + n_content_live + \
                                    weighted_cp_avg + perc_green + gain + \
                                    gain_herd
    try:
        sum_df = pandas.DataFrame(sum_dict)
        sum_df.to_csv(save_as, index=False)
        n_mult_df = pandas.DataFrame(n_mult_dict)
        n_mult_df.to_csv(r"C:\Users\Ginger\Desktop\n_mult.csv")
    except:
        import pdb
        pdb.set_trace()
Пример #15
0
def calc_n_mult(forage_args, target):
    """Calculate N multiplier for a grass to achieve target crude protein
    content, and edit grass input to include that N multiplier. Target reflects
    crude protein of live grass. Target should be supplied as a float between 0
    and 1."""

    tolerance = 0.001  # must be within this proportion of target value
    grass_df = pandas.read_csv(forage_args['grass_csv'])
    grass_label = grass_df.iloc[0].label
    # args copy to launch model to calculate n_mult
    args_copy = forage_args.copy()
    args_copy['outdir'] = os.path.join(
        os.path.dirname(forage_args['outdir']),
        '{}_n_mult_calc'.format(os.path.basename(forage_args['outdir'])))
    # find correct output time period
    final_month = forage_args[u'start_month'] + forage_args['num_months'] - 1
    if final_month > 12:
        mod = final_month % 12
        if mod == 0:
            month = 12
            year = (final_month / 12) + forage_args[u'start_year'] - 1
        else:
            month = mod
            year = (final_month / 12) + forage_args[u'start_year']
    else:
        month = final_month
        year = (
            (forage_args['num_months'] - 1) / 12) + forage_args[u'start_year']
    intermediate_dir = os.path.join(args_copy['outdir'],
                                    'CENTURY_outputs_m%d_y%d' % (month, year))
    sim_output = os.path.join(intermediate_dir, '{}.lis'.format(grass_label))
    first_year = forage_args['start_year']
    last_year = year

    def get_raw_cp_green():
        # calculate n multiplier to achieve target
        outputs = cent.read_CENTURY_outputs(sim_output, first_year, last_year)
        outputs.drop_duplicates(inplace=True)

        # restrict to months of the simulation
        first_month = forage_args[u'start_month']
        start_date = first_year + float('%.2f' % (first_month / 12.))
        end_date = last_year + float('%.2f' % (month / 12.))
        outputs = outputs[(outputs.index >= start_date)]
        outputs = outputs[(outputs.index <= end_date)]
        return np.mean(outputs.aglive1 / outputs.aglivc)

    def set_n_mult():
        # edit grass csv to reflect calculated n_mult
        grass_df = pandas.read_csv(forage_args['grass_csv'])
        grass_df.N_multiplier = grass_df.N_multiplier.astype(float)
        grass_df = grass_df.set_value(0, 'N_multiplier', float(n_mult))
        grass_df = grass_df.set_index('label')
        grass_df.to_csv(forage_args['grass_csv'])

    n_mult = 1
    set_n_mult()
    forage.execute(args_copy)
    cp_green = get_raw_cp_green()
    diff = abs(target - (n_mult * cp_green))
    while diff > tolerance:
        n_mult = '%.10f' % (target / cp_green)
        set_n_mult()
        forage.execute(args_copy)
        cp_green = get_raw_cp_green()
        diff = abs(target - (float(n_mult) * cp_green))
def run_WCS_exclosures(site_csv):
    """Run the model at WCS exclosure locations: NAMEM and CHIRPS precip."""
    run_dict = {
        'namem': [
            r"C:\Users\ginge\Dropbox\NatCap_backup\Mongolia\model_inputs\WCS_exclosures\NAMEM",
            r"C:\Users\ginge\Dropbox\NatCap_backup\Mongolia\model_results\WCS_exclosures\NAMEM"],
        'chirps': [
            r"C:\Users\ginge\Dropbox\NatCap_backup\Mongolia\model_inputs\WCS_exclosures\CHIRPS",
            r"C:\Users\ginge\Dropbox\NatCap_backup\Mongolia\model_results\WCS_exclosures\CHIRPS"]}

    def default_forage_args():
        args = {
            'start_month': 1,
            'start_year': 2008,
            'num_months': 132,  # Jan 2008 to Dec 2018
            'template_level': 'GH',
            'fix_file': 'drygfix.100',
            'prop_legume': 0.0,
            'steepness': 1.,
            'DOY': 1,
            'mgmt_threshold': 100.,
            'century_dir': 'C:/Users/ginge/Dropbox/NatCap_backup/Forage_model/CENTURY4.6/Century46_PC_Jan-2014',
            'user_define_protein': 1,
            'user_define_digestibility': 0,
            'herbivore_csv': r"C:/Users/ginge/Dropbox/NatCap_backup/Mongolia/model_inputs/cashmere_goats.csv",
            'grass_csv': r"C:/Users/ginge/Dropbox/NatCap_backup/Mongolia/model_inputs/grass.csv",
            'restart_monthly': 0,
        }
        return args

    def modify_stocking_density(herbivore_csv, new_sd):
        """Modify the stocking density in the herbivore csv input."""
        df = pandas.read_csv(herbivore_csv)
        df = df.set_index(['index'])
        assert len(df) == 1, "We can only handle one herbivore type"
        df['stocking_density'] = df['stocking_density'].astype(float)
        df.set_value(0, 'stocking_density', new_sd)
        df.to_csv(herbivore_csv)

    def edit_grass_csv(grass_csv, label):
        """Edit the grass csv to reflect a new site."""
        df = pandas.read_csv(grass_csv)
        df = df.set_index(['index'])
        assert len(df) == 1, "We can only handle one grass type"
        df[['label']] = df[['label']].astype(type(label))
        df.set_value(0, 'label', label)
        df.to_csv(grass_csv)

    forage_args = default_forage_args()
    modify_stocking_density(forage_args['herbivore_csv'], 0)
    site_list = pandas.read_csv(site_csv).to_dict(orient='records')
    for precip_source in run_dict.keys():
        forage_args['input_dir'] = run_dict[precip_source][0]
        outer_outdir = run_dict[precip_source][1]
        for site in site_list:
            forage_args['latitude'] = site['latitude']
            forage_args['outdir'] = os.path.join(outer_outdir,
                                                 '{}'.format(site['site_id']))
            if not os.path.isfile(os.path.join(forage_args['outdir'],
                                               'summary_results.csv')):
                edit_grass_csv(forage_args['grass_csv'], site['site_id'])
                forage.execute(forage_args)
Пример #17
0
    'latitude': 0.083,
    'prop_legume': 0.0,
    'breed': 'Brahman',  # see documentation for allowable breeds; assumed to apply to all animal classes
    'steepness': 1.,
    'DOY': 1,
    'start_year': 2015,
    'start_month': 1,
    'num_months': 12,
    'mgmt_threshold': 0.1,
    'century_dir': 'C:/Users/ginge/Dropbox/NatCap_backup/Forage_model/CENTURY4.6/Century46_PC_Jan-2014',
    'outdir': "C://Users//Ginger//Documents//Python//Output",
    'template_level': 'GL',
    'fix_file': 'drytrpfi.100',
    'user_define_protein': 1,
    'user_define_digestibility': 1,
    'herbivore_csv': "C:/Users/ginge/Dropbox/NatCap_backup/Forage_model/Forage_model/model_inputs/herbivores.csv",
    'grass_csv': "C:/Users/ginge/Dropbox/NatCap_backup/Forage_model/Forage_model/model_inputs/grass_.64_.1.csv",
    'supp_csv': "C:/Users/ginge/Dropbox/NatCap_backup/Forage_model/Forage_model/model_inputs/Rubanza_et_al_2005_supp.csv",
    'input_dir': "C:/Users/ginge/Dropbox/NatCap_backup/Forage_model/CENTURY4.6/Kenya/input",
    }

    input_dir = "C:/Users/ginge/Dropbox/NatCap_backup/Forage_model/Forage_model/model_inputs"
    outer_dir = "C:/Users/ginge/Dropbox/NatCap_backup/Forage_model/CENTURY4.6/Output/Stocking_density_test/Animal_type_test"
    for idx in [1, 2, 3, 4, 5]:
        args['herbivore_csv'] = os.path.join(input_dir,
                                             "herbivores_%d.csv" % idx)
        args['outdir'] = os.path.join(outer_dir, "outputs_%d" % idx)
        if not os.path.exists(args['outdir']):
            os.makedirs(args['outdir'])
        forage.execute(args)
Пример #18
0
def test_rotation():
    """Run the model for Peru, including two complementary rotation schedules
    and a "full" (non-rotated) grazing schedule."""

    forage_args = {
        'latitude': -12.55,
        'prop_legume': 0.0,
        'steepness': 1.,
        'DOY': 1,
        'start_year': 1993,
        'start_month': 1,
        'num_months': 204,
        'mgmt_threshold': 0.2,
        'century_dir':
        'C:/Users/Ginger/Dropbox/NatCap_backup/Forage_model/CENTURY4.6/Century46_PC_Jan-2014',
        'outdir': '',
        'template_level': 'GH',
        'fix_file': 'gfix.100',
        'user_define_protein': 1,
        'user_define_digestibility': 1,
        'herbivore_csv': '',
        'grass_csv': '',
        'supp_csv':
        "C:/Users/Ginger/Dropbox/NatCap_backup/Forage_model/Forage_model/model_inputs/Rubanza_et_al_2005_supp.csv",
        'input_dir': '',
        'diet_verbose': 0,
        'restart_yearly': 1,
        'restart_monthly': 1,
        'grz_months': '',
    }
    outer_dir = "C:/Users/Ginger/Dropbox/NatCap_backup/CGIAR/Peru/Forage_model_results/rotation_10.18.16"
    input_dir = "C:/Users/Ginger/Dropbox/NatCap_backup/CGIAR/Peru/Forage_model_inputs"
    sum_dict = {
        'duration': [],
        'avg_gain_kg': [],
        'grz_months': [],
        'total_biomass': [],
        'avg_biomass': [],
        'subbasin': []
    }
    total_mos = 204
    full = range(0, total_mos)
    duration = 4
    p1, p2 = generate_grz_month_pairs(duration, total_mos)
    for anim_type in ['cow', 'sheep', 'camelid']:
        for sbasin in [1, 2, 3, 4, 5, 6, 7, 9]:
            grass_csv = os.path.join(input_dir, 'Pajonal_%d.csv' % sbasin)
            for sd_level in ['reclow', 'rechigh']:
                herb_csv = os.path.join(input_dir,
                                        anim_type + '_' + sd_level + '_sd.csv')
                for grz_months in [p1, p2]:  #, full]:
                    if grz_months == full:
                        dur = total_mos
                    else:
                        dur = duration
                    if grz_months == p1:
                        grz_str = 'p1'
                    elif grz_months == p2:
                        grz_str = 'p2'
                    elif grz_months == full:
                        grz_str = 'full'
                    outdir = os.path.join(
                        outer_dir, 'raw_results', '%s_%s_dur%d_%s_sub%s' %
                        (anim_type, sd_level, dur, grz_str, sbasin))
                    if not os.path.exists(outdir):
                        # sum_csv = os.path.join(outdir, "summary_results.csv")
                        # sum_df = pandas.read_csv(sum_csv)
                        # if len(sum_df) < total_mos:
                        # forage_args['mgmt_threshold'] = 0.3
                        forage_args['outdir'] = outdir
                        forage_args['herbivore_csv'] = herb_csv
                        forage_args['grass_csv'] = grass_csv
                        forage_args['input_dir'] = input_dir
                        forage_args['grz_months'] = grz_months
                        try:
                            forage.execute(forage_args)
                        except:
                            continue
                erase_intermediate_files(os.path.join(outer_dir,
                                                      'raw_results'))
Пример #19
0
def optimal_defoliation_test():
    """Test grass response to different grazing levels explicitly.  Confirm
    that optimal defolation level for biomass regrowth is 25%.  Impose
    specific defoliation levels (e.g. 25% defoliation) on a particular date,
    specified as a model step."""
    
    outer_outdir = r"C:\Users\Ginger\Dropbox\NatCap_backup\Forage_model\Forage_model\model_results\WitW\Ortega-S_et_al\defol_exp"
    forage_args = default_forage_args()
    
    recovery_dict = {'defoliation_step': [], 'defoliation_level': [],
                     'steps_to_recover': [], 'stocking_density': []}
    perc_regrowth_dict = {'defoliation_step': [], 'defoliation_level': [],
                     'perc_regrowth_defol_step': [], 'perc_regrowth_d+1': [],
                     'live_gm2_removed': []}
    growth_dict = {'defoliation_step': [], 'defoliation_level': [],
                     'growth_defol_step': [], 'growth_d+1': [],
                     'live_gm2_removed': []}

    for defol_step in [2, 4, 6, 8, 10, 12]:
        record_biomass_step = defol_step - 1
        forage_args['grz_months'] = []
        forage_args['outdir'] = os.path.join(outer_outdir, 'zero_sd')
        if not os.path.exists(os.path.join(forage_args['outdir'],
                                           'summary_results.csv')):
            forage.execute(forage_args)
        live_gm2, dead_gm2 = get_biomass_from_summary_results(
                                    forage_args['outdir'], record_biomass_step)
        
        # calculate diet selected in defoliation month: then can change stocking density to 
        # remove specified amount of biomass
        diet = diet_selection(forage_args, live_gm2, dead_gm2)  # daily intake
        monthly_intake_live = forage_u.convert_daily_to_step(diet.intake['grass;green'])
        monthly_intake_live_gm2 = monthly_intake_live / 10.
        for defol_level in [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8]:
            # for now, calculate stocking dens based on % live biomass consumed
            live_gm2_consumed = defol_level * live_gm2
            stocking_dens = live_gm2_consumed / monthly_intake_live_gm2
            rotation.modify_stocking_density(forage_args['herbivore_csv'],
                                             stocking_dens)
            outdir = os.path.join(outer_outdir,
                                  'defol_{}_m{}'.format(round(defol_level, 2),
                                                        defol_step))
            forage_args['outdir'] = outdir
            forage_args['grz_months'] = [defol_step]
            if not os.path.exists(os.path.join(forage_args['outdir'],
                                  'summary_results.csv')):
                forage.execute(forage_args)
            i = 0
            biomass = 0
            while biomass < live_gm2:
                regrowth_step = defol_step + i
                try:
                    biomass, dead_biomass = get_biomass_from_summary_results(
                                                         outdir, regrowth_step)
                except:
                    regrowth_step = defol_step + 999
                    break
                i += 1
            steps_to_recover = regrowth_step - defol_step
            recovery_dict['defoliation_step'].append(defol_step)
            recovery_dict['defoliation_level'].append(defol_level)
            recovery_dict['steps_to_recover'].append(steps_to_recover)
            recovery_dict['stocking_density'].append(stocking_dens)
            
            defoliated = live_gm2 - live_gm2_consumed
            defol_live, defol_dead = get_biomass_from_summary_results(
                                                            outdir, defol_step)
            d1_step = defol_step + 1
            dplus1_live, dplus1_dead = get_biomass_from_summary_results(
                                                               outdir, d1_step)
            regrowth_defol = (defol_live - defoliated) / defoliated
            regrowth_d1 = (dplus1_live - defol_live) / defol_live
            growth_defol = defol_live - defoliated
            growth_d1 = dplus1_live - defol_live
            perc_regrowth_dict['defoliation_step'].append(defol_step)
            perc_regrowth_dict['defoliation_level'].append(defol_level)
            perc_regrowth_dict['perc_regrowth_defol_step'].append(regrowth_defol)
            perc_regrowth_dict['perc_regrowth_d+1'].append(regrowth_d1)
            perc_regrowth_dict['live_gm2_removed'].append(live_gm2_consumed)
            
            growth_dict['defoliation_step'].append(defol_step)
            growth_dict['defoliation_level'].append(defol_level)
            growth_dict['growth_defol_step'].append(growth_defol)
            growth_dict['growth_d+1'].append(growth_d1)
            growth_dict['live_gm2_removed'].append(live_gm2_consumed)
            
    recovery_df = pd.DataFrame(recovery_dict)
    recovery_df.to_csv(os.path.join(outer_outdir, 'recovery_summary.csv'))
    regrowth_df = pd.DataFrame(perc_regrowth_dict)
    regrowth_df.to_csv(os.path.join(outer_outdir, 'regrowth_summary.csv'))
    growth_df = pd.DataFrame(growth_dict)
    growth_df.to_csv(os.path.join(outer_outdir, 'growth_summary.csv'))