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)
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)
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)
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)
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)
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'))
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'])
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)
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)
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)
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)
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)
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()
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)
'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)
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'))
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'))