def setup_analytical_spin(self, number, st_yr_spin, en_yr_spin): """ Adjust the CABLE namelist file with the various flags for the analytical spin step """ out_log_fname = "%s_log_analytic_%d.txt" % (self.experiment_id, number) out_log_fname = os.path.join(self.log_dir, out_log_fname) if os.path.isfile(out_log_fname): os.remove(out_log_fname) self.out_fname_CASA = "%s_out_CASA_analytic_%d.nc" % \ (self.experiment_id, number) self.out_fname_CASA = os.path.join(self.output_dir, self.out_fname_CASA) if os.path.isfile(self.out_fname_CASA): os.remove(self.out_fname_CASA) replace_dict = { "filename%log": "'%s'" % (out_log_fname), "icycle": "%d" % (self.biogeochem + 10), # Need to add 10 for spinup "cable_user%CASA_DUMP_READ": ".TRUE.", "cable_user%CASA_DUMP_WRITE": ".FALSE.", "cable_user%CASA_NREP": "1", "cable_user%SOIL_STRUC": "'default'", # THIS needs to be default, we don't turn sli on here, presumably because it is too slow but does this make sense? "leaps": ".FALSE.", "spincasa": ".TRUE.", #"casafile%c2cdumppath": "'./'", "cable_user%CASA_SPIN_STARTYEAR": "%d" % (st_yr_spin), "cable_user%CASA_SPIN_ENDYEAR": "%d" % (en_yr_spin), "casafile%out": "'%s'" % (self.out_fname_CASA), } adjust_nml_file(self.nml_fname, replace_dict)
def inital_spin_setup(self, site, met_fname, sci_config, number=None): """ Initial setup for CASA spinup from zero """ base_nml_fn = os.path.join(self.grid_dir, "%s" % (self.nml_fname)) nml_fname = "cable_%s.nml" % (site) shutil.copy(base_nml_fn, nml_fname) self.nml_fname = nml_fname out_fname = "%s_out_cable_spin_%d.nc" % (self.experiment_id, number) out_fname = os.path.join(self.output_dir, out_fname) out_log_fname = "%s_log_spin_%d.txt" % (self.experiment_id, number) out_log_fname = os.path.join(self.log_dir, out_log_fname) cable_rst_ofname = "%s_cable_rst_%d.nc" % (self.experiment_id, number) cable_rst_ofname = os.path.join(self.restart_dir, cable_rst_ofname) casa_rst_ofname = "%s_casa_rst_%d.nc" % (self.experiment_id, number) casa_rst_ofname = os.path.join(self.restart_dir, casa_rst_ofname) replace_dict = { "filename%met": "'%s'" % (met_fname), "filename%out": "'%s'" % (out_fname), "filename%log": "'%s'" % (out_log_fname), "filename%restart_in": "' '", "filename%restart_out": "'%s'" % (cable_rst_ofname), "casafile%cnpipool": "' '", "casafile%cnpepool": "'%s'" % (casa_rst_ofname), "filename%type": "'%s'" % (self.grid_fname), "filename%veg": "'%s'" % (self.veg_fname), "filename%soil": "'%s'" % (self.soil_fname), "fixedCO2": "%.2f" % (self.co2_conc), "casafile%phen": "'%s'" % (self.phen_fname), "casafile%cnpbiome": "'%s'" % (self.cnpbiome_fname), "cable_user%FWSOIL_SWITCH": "'standard'", "cable_user%GS_SWITCH": "'medlyn'", "cable_user%RunIden": "'%s'" % (self.experiment_id), "cable_user%vcmax": "'%s'" % (self.vcmax), "l_vcmaxFeedbk": "%s" % (self.vcmax_feedback), "l_laiFeedbk": ".TRUE.", # prognoistic LAI "icycle": "%d" % (self.biogeochem_id), "cable_user%CASA_OUT_FREQ": "'monthly'", "output%casa": ".TRUE.", "leaps": ".TRUE.", "cable_user%CASA_fromZero": ".TRUE.", "cable_user%CASA_DUMP_READ": ".FALSE.", "cable_user%CASA_DUMP_WRITE": ".FALSE.", "cable_user%CASA_NREP": "0", "spincasa": ".FALSE.", "output%restart": ".TRUE.", } # Make sure the dict isn't empty if bool(sci_config): replace_dict = merge_two_dicts(replace_dict, sci_config) adjust_nml_file(self.nml_fname, replace_dict)
def worker(self, met_files, url, rev): for fname in met_files: site = os.path.basename(fname).split(".")[0].split("_")[0] base_nml_fn = os.path.join(self.grid_dir, "%s" % (self.nml_fname)) nml_fname = "cable_%s.nml" % (site) shutil.copy(base_nml_fn, nml_fname) (out_fname, out_log_fname) = self.clean_up_old_files(site) # ./plot_E_vs_psi_leaf.py, looks a reasonable match to obs # we don't hit the max, but the bulk of the values are in the right place Kmax_value = 0.4 #b_plant = 3.7616378326944595 # calculated from vlc #c_plant = 10.289003851919992 # calculated from vlc b_plant = 3.7989857501917563 # calculated from vlc, using p98 c_plant = 8.054967903830414 # calculated from vlc, using p98 vcmax = 30. # Belinda estimated this from their data fname = change_traits(fname, site, Kmax_value, b_plant, c_plant, vcmax, self.zse) # Add LAI to met file? if self.fixed_lai is not None or self.lai_dir is not None: fname = change_LAI(fname, site, fixed=self.fixed_lai, lai_dir=self.lai_dir) replace_dict = { "filename%met": "'%s'" % (fname), "filename%out": "'%s'" % (out_fname), "filename%log": "'%s'" % (out_log_fname), "filename%restart_out": "' '", "filename%type": "'%s'" % (self.grid_fname), "output%restart": ".FALSE.", #"fixedCO2": "%.2f" % (self.co2_conc), "casafile%phen": "'%s'" % (self.phen_fname), "casafile%cnpbiome": "'%s'" % (self.cnpbiome_fname), "cable_user%GS_SWITCH": "'medlyn'", "cable_user%GW_MODEL": ".FALSE.", "cable_user%or_evap": ".FALSE.", "redistrb": ".FALSE.", "spinup": ".FALSE.", "cable_user%litter": ".TRUE.", "cable_user%FWSOIL_SWITCH": "'%s'" % (self.fwsoil), } adjust_nml_file(nml_fname, replace_dict) self.run_me(nml_fname) add_attributes_to_output_file(nml_fname, out_fname, url, rev) shutil.move(nml_fname, os.path.join(self.namelist_dir, nml_fname)) if self.fixed_lai is not None or self.lai_dir is not None: os.remove("%s_tmp.nc" % (site))
def worker(self, met_files, url, rev): for fname in met_files: site = os.path.basename(fname).split(".")[0] base_nml_fn = os.path.join(self.grid_dir, "%s" % (self.nml_fname)) nml_fname = "cable_%s.nml" % (site) shutil.copy(base_nml_fn, nml_fname) (out_fname, out_log_fname) = self.clean_up_old_files(site) # Add LAI to met file? if self.fixed_lai is not None or self.lai_dir is not None: fname = change_LAI(fname, site, fixed=self.fixed_lai, lai_dir=self.lai_dir) if self.fwsoil == "hydraulics": if site == "WombatStateForestOzFlux2": fname = change_iveg(fname, site, 20) else: fname = change_iveg(fname, site, 19) elif self.fwsoil == "standard": fname = change_iveg(fname, site, 2) replace_dict = { "filename%met": "'%s'" % (fname), "filename%out": "'%s'" % (out_fname), "filename%log": "'%s'" % (out_log_fname), "filename%restart_out": "' '", "filename%type": "'%s'" % (self.grid_fname), "filename%veg": "'%s'" % (self.veg_fname), "filename%soil": "'%s'" % (self.soil_fname), "output%restart": ".FALSE.", "fixedCO2": "%.2f" % (self.co2_conc), "casafile%phen": "'%s'" % (self.phen_fname), "casafile%cnpbiome": "'%s'" % (self.cnpbiome_fname), "cable_user%GS_SWITCH": "'medlyn'", "cable_user%GW_MODEL": ".FALSE.", "cable_user%or_evap": ".FALSE.", "redistrb": ".FALSE.", "spinup": ".TRUE.", "cable_user%FWSOIL_SWITCH": "'%s'" % (self.fwsoil), } adjust_nml_file(nml_fname, replace_dict) self.run_me(nml_fname) add_attributes_to_output_file(nml_fname, out_fname, url, rev) shutil.move(nml_fname, os.path.join(self.namelist_dir, nml_fname)) if self.fixed_lai is not None or self.lai_dir is not None: os.remove("%s_tmp.nc" % (site)) os.remove("new_sumbal")
def worker(self, met_files, url, rev): fname = met_files site = os.path.basename(fname).split(".")[0].split("_")[0] print(fname) ring = os.path.basename(fname).split(".")[0].split("_")[2] base_nml_fn = os.path.join(self.grid_dir, "%s" % (self.nml_fname)) nml_fname = "cable_%s_%s_%s.nml" % (site, self.met_fname, self.case_name) shutil.copy(base_nml_fn, nml_fname) (out_fname, out_log_fname, out_restart_fname) = self.clean_up_old_files(site, ring) # Add LAI to met file? if self.fixed_lai is not None or self.lai_dir is not None: fname = change_LAI(fname, site, fixed=self.fixed_lai, lai_dir=self.lai_dir) replace_dict = { "filename%met": "'%s'" % (fname), "filename%out": "'%s'" % (out_fname), "filename%log": "'%s'" % (out_log_fname), "spinup": ".FALSE.", #"filename%restart_in": "'%s'" % (out_restart_fname), "filename%restart_out": "'%s'" % (out_restart_fname), "filename%type": "'%s'" % (self.grid_fname), #"filename%gw_elev": "'%s'" % (self.elev_fname) "filename%veg": "'%s'" % (self.veg_fname), "filename%soil": "'%s'" % (self.soil_fname), "output%restart": ".TRUE.", "casafile%phen": "'%s'" % (self.phen_fname), "casafile%cnpbiome": "'%s'" % (self.cnpbiome_fname), #"cable_user%FWSOIL_SWITCH": "'Haverd2013'", #"cable_user%FWSOIL_SWITCH": "'standard'", "cable_user%FWSOIL_SWITCH": "'hie_exp'", "cable_user%GS_SWITCH": "'medlyn'", "cable_user%GW_MODEL": ".TRUE.", "cable_user%or_evap": ".FALSE.", "cable_user%MetType": "site", "gw_params%BC_hysteresis": ".FALSE.", "gw_params%HC_SWC": "FALSE", "gw_params%ssgw_ice_switch": ".TRUE.", "cable_user%litter": ".TRUE.", } adjust_nml_file(nml_fname, replace_dict) self.run_me(nml_fname) add_attributes_to_output_file(nml_fname, out_fname, url, rev) shutil.move(nml_fname, os.path.join(self.namelist_dir, nml_fname)) if self.fixed_lai is not None or self.lai_dir is not None: os.remove("%s_tmp.nc" % (site))
def worker(self, met_files, url, rev, param_names, param_values, out_fname, out_log_fname): for fname in met_files: site = os.path.basename(fname).split("_")[0] base_nml_fn = os.path.join(self.grid_dir, "%s" % (self.nml_fname)) nml_fname = "cable_%s.nml" % (site) shutil.copy(base_nml_fn, nml_fname) (out_fname, out_log_fname) = self.clean_up_old_files(site) # Add LAI to met file? if self.fixed_lai is not None or self.lai_dir is not None: fname = change_LAI(fname, site, fixed=self.fixed_lai, lai_dir=self.lai_dir) # Set tree, grass and bare fracs, measurement height etc fname = set_site_info(fname, site) replace_dict = { "filename%met": "'%s'" % (fname), "filename%out": "'%s'" % (out_fname), "filename%log": "'%s'" % (out_log_fname), "filename%restart_out": "' '", "filename%type": "'%s'" % (self.grid_fname), "filename%veg": "'%s'" % (self.veg_fname), "filename%soil": "'%s'" % (self.soil_fname), "output%restart": ".FALSE.", #"output%patch": ".TRUE.", # get all patches "output%patch": ".FALSE.", # get all patches "fixedCO2": "%.2f" % (self.co2_conc), "casafile%phen": "'%s'" % (self.phen_fname), "casafile%cnpbiome": "'%s'" % (self.cnpbiome_fname), "cable_user%FWSOIL_SWITCH": "'standard'", "cable_user%GS_SWITCH": "'medlyn'", "cable_user%GW_MODEL": ".FALSE.", "cable_user%or_evap": ".FALSE.", "spinup": ".FALSE.", "verbose": ".FALSE.", } adjust_nml_file(nml_fname, replace_dict) self.run_me(nml_fname) add_attributes_to_output_file(nml_fname, out_fname, url, rev) shutil.move(nml_fname, os.path.join(self.namelist_dir, nml_fname)) if self.fixed_lai is not None or self.lai_dir is not None: os.remove("%s_tmp.nc" % (site))
def worker(self, met_files, url, rev): for fname in met_files: species = '_'.join((os.path.basename(fname).split("_")[2:4])) num = os.path.basename(fname).split("_")[-1].split(".")[0] site = "%s_%s" % (species, num) base_nml_fn = os.path.join(self.grid_dir, "%s" % (self.nml_fname)) nml_fname = "cable_%s.nml" % (site) shutil.copy(base_nml_fn, nml_fname) (out_fname, out_log_fname) = self.clean_up_old_files(site) spp_traits = self.traits[self.traits.species == \ species.replace("_", " ")] if len(spp_traits) > 0: b_plant = float(spp_traits.b_plant.values[0]) c_plant = float(spp_traits.c_plant.values[0]) vcmax = float(spp_traits.vcmax.values[0]) fname_new = change_traits(fname, id, site, b_plant, c_plant, vcmax) replace_dict = { "filename%met": "'%s'" % (fname_new), "filename%out": "'%s'" % (out_fname), "filename%log": "'%s'" % (out_log_fname), "filename%restart_out": "' '", "filename%type": "'%s'" % (self.grid_fname), "output%restart": ".FALSE.", "fixedCO2": "%.2f" % (self.co2_conc), "casafile%phen": "'%s'" % (self.phen_fname), "casafile%cnpbiome": "'%s'" % (self.cnpbiome_fname), "cable_user%GS_SWITCH": "'medlyn'", "cable_user%GW_MODEL": ".FALSE.", "cable_user%or_evap": ".FALSE.", "redistrb": ".FALSE.", "spinup": ".FALSE.", "cable_user%litter": ".TRUE.", "cable_user%FWSOIL_SWITCH": "'%s'" % (self.fwsoil), } adjust_nml_file(nml_fname, replace_dict) self.run_me(nml_fname) add_attributes_to_output_file(nml_fname, out_fname, url, rev) shutil.move(nml_fname, os.path.join(self.namelist_dir, nml_fname)) os.remove(fname_new) os.remove("new_sumbal")
def worker(self, met_files, url, rev, sci_config, repo_id, sci_id): cwd = os.getcwd() for fname in met_files: site = os.path.basename(fname).split(".")[0] base_nml_fn = os.path.join(self.grid_dir, "%s" % (self.nml_fname)) nml_fname = "cable_%s_R%s_S%s.nml" % (site, repo_id, sci_id) shutil.copy(base_nml_fn, nml_fname) #nml_fname = os.path.join(cwd, nml_fname) (out_fname, out_log_fname) = self.clean_up_old_files(site, repo_id, sci_id) # Add LAI to met file? if self.fixed_lai is not None or self.lai_dir is not None: fname = change_LAI(fname, site, fixed=self.fixed_lai, lai_dir=self.lai_dir) replace_dict = { "filename%met": "'%s'" % (fname), "filename%out": "'%s'" % (out_fname), "filename%log": "'%s'" % (out_log_fname), "filename%restart_out": "' '", "filename%type": "'%s'" % (self.grid_fname), "filename%veg": "'%s'" % (self.veg_fname), "filename%soil": "'%s'" % (self.soil_fname), "output%restart": ".FALSE.", "fixedCO2": "%.2f" % (self.co2_conc), "casafile%phen": "'%s'" % (self.phen_fname), "casafile%cnpbiome": "'%s'" % (self.cnpbiome_fname), "spinup": ".FALSE.", } # Make sure the dict isn't empty if bool(sci_config): replace_dict = merge_two_dicts(replace_dict, sci_config) adjust_nml_file(nml_fname, replace_dict) self.run_me(nml_fname) add_attributes_to_output_file(nml_fname, out_fname, sci_config, url, rev) shutil.move(nml_fname, os.path.join(self.namelist_dir, nml_fname)) if self.fixed_lai is not None or self.lai_dir is not None: os.remove("%s_tmp.nc" % (site))
def setup_analytical_spin(self, st_yr, en_yr, number=None): """ Adjust the CABLE namelist file with the various flags for the analytical spin step """ out_fname = "%s_out_cable_aspin_%d.nc" % (self.experiment_id, number) out_fname = os.path.join(self.output_dir, out_fname) out_log_fname = "%s_log_aspin_%d.txt" % (self.experiment_id, number) out_log_fname = os.path.join(self.log_dir, out_log_fname) # This step doesn't write an output CABLE rst file. cable_rst_ifname = "%s_cable_rst_%d.nc" % (self.experiment_id, number - 1) cable_rst_ifname = os.path.join(self.restart_dir, cable_rst_ifname) casa_rst_ifname = "%s_casa_rst_%d.nc" % (self.experiment_id, number - 1) casa_rst_ifname = os.path.join(self.restart_dir, casa_rst_ifname) # This will overwrite the current restart file for CASA but that is # fine. casa_rst_ofname = "%s_casa_rst_%d.nc" % (self.experiment_id, number) casa_rst_ofname = os.path.join(self.restart_dir, casa_rst_ofname) replace_dict = { "filename%out": "'%s'" % (out_fname), "filename%log": "'%s'" % (out_log_fname), "filename%restart_in": "'%s'" % (cable_rst_ifname), "casafile%cnpipool": "'%s'" % (casa_rst_ifname), "casafile%cnpepool": "'%s'" % (casa_rst_ofname), #"casafile%cnpepool": "' '", "icycle": "%d" % (self.biogeochem_id + 10), # Need to add 10 for spinup "cable_user%CASA_DUMP_READ": ".TRUE.", "cable_user%CASA_DUMP_WRITE": ".FALSE.", "cable_user%CASA_NREP": "1", "spincasa": ".TRUE.", "cable_user%CASA_SPIN_STARTYEAR": "%d" % (st_yr), "cable_user%CASA_SPIN_ENDYEAR": "%d" % (en_yr), #"cable_user%YearStart": "%d" % (st_yr), #"cable_user%YearEnd": "%d" % (en_yr), "output%restart": ".TRUE.", "leaps": ".FALSE.", } adjust_nml_file(self.nml_fname, replace_dict)
def worker(self, met_files, url, rev): for fname in met_files: site = os.path.basename(fname).split(".")[0] print(site) base_nml_fn = os.path.join(self.grid_dir, "%s" % (self.nml_fname)) nml_fname = "cable_%s.nml" % (site) shutil.copy(base_nml_fn, nml_fname) (out_fname, out_log_fname) = self.clean_up_old_files(site) # Add LAI to met file? if self.fixed_lai is not None or self.lai_dir is not None: fname = change_LAI(fname, site, fixed=self.fixed_lai, lai_dir=self.lai_dir) replace_dict = { "filename%met": "'%s'" % (fname), "filename%out": "'%s'" % (out_fname), "filename%log": "'%s'" % (out_log_fname), "filename%restart_out": "' '", "filename%type": "'%s'" % (self.grid_fname), "filename%veg": "'%s'" % (self.veg_fname), "filename%soil": "'%s'" % (self.soil_fname), "output%restart": ".FALSE.", "fixedCO2": "%.2f" % (self.co2_conc), "casafile%phen": "'%s'" % (self.phen_fname), "casafile%cnpbiome": "'%s'" % (self.cnpbiome_fname), "cable_user%FWSOIL_SWITCH": "'Haverd2013'", "cable_user%GS_SWITCH": "'medlyn'", "cable_user%GW_MODEL": ".FALSE.", "cable_user%or_evap": ".FALSE.", #"elev_fname": "'%s'" % (self.elev_fname), } adjust_nml_file(nml_fname, replace_dict) self.run_me(nml_fname) add_attributes_to_output_file(nml_fname, out_fname, url, rev) shutil.move(nml_fname, os.path.join(self.namelist_dir, nml_fname)) if self.fixed_lai is not None or self.lai_dir is not None: os.remove("%s_tmp.nc" % (site))
def setup_transient(self, st_yr_trans, en_yr_trans, st_yr, en_yr): """ Adjust the CABLE namelist file for the transient run, i.e. 1850 to XXXX """ replace_dict = { "RunType": '"transient"', "CO2NDepFile": "'%s'" % (self.co2_ndep_fname), "spinstartyear": "%d" % (st_yr), "spinendyear": "%d" % (en_yr), } adjust_nml_file(self.site_nml_fname, replace_dict) out_log_fname = "%s_log_transient.txt" % (self.experiment_id) out_log_fname = os.path.join(self.log_dir, out_log_fname) if os.path.isfile(out_log_fname): os.remove(out_log_fname) self.out_fname = "%s_out_cable_transient.nc" % (self.experiment_id) self.out_fname = os.path.join(self.output_dir, self.out_fname) if os.path.isfile(self.out_fname): os.remove(self.out_fname) self.out_fname_CASA = "%s_out_casa_transient.nc" % (self.experiment_id) self.out_fname_CASA = os.path.join(self.output_dir, self.out_fname_CASA) if os.path.isfile(self.out_fname_CASA): os.remove(self.out_fname_CASA) replace_dict = { "filename%out": "'%s'" % (self.out_fname), "casafile%out": "'%s'" % (self.out_fname_CASA), "filename%log": "'%s'" % (out_log_fname), "cable_user%CASA_DUMP_READ": ".FALSE.", "cable_user%CASA_DUMP_WRITE": ".FALSE.", "cable_user%CASA_NREP": "0", "cable_user%SOIL_STRUC": "'%s'" % (self.soil_flag), "output%restart": ".TRUE.", "output%averaging": "'monthly'", "spinup": ".FALSE.", "icycle": "%d" % (self.biogeochem), "cable_user%POPLUC": ".F.", "cable_user%YearStart": "%d" % (st_yr_trans), "cable_user%YearEnd": "%d" % (en_yr_trans), } adjust_nml_file(self.nml_fname, replace_dict)
def setup_simulation(self, st_yr, en_yr): """ Adjust the CABLE namelist file for the experiment years """ replace_dict = { "RunType": '"historical"', "CO2NDepFile": "'%s'" % (self.co2_ndep_fname), "spinstartyear": "%d" % (st_yr), "spinendyear": "%d" % (en_yr) } adjust_nml_file(self.site_nml_fname, replace_dict) out_log_fname = "%s_log_simulation.txt" % (self.experiment_id) out_log_fname = os.path.join(self.log_dir, out_log_fname) if os.path.isfile(out_log_fname): os.remove(out_log_fname) self.out_fname = "%s_out_cable.nc" % (self.experiment_id) self.out_fname = os.path.join(self.output_dir, self.out_fname) self.out_fname_CASA = "%s_out_casa.nc" % (self.experiment_id) self.out_fname_CASA = os.path.join(self.output_dir, self.out_fname_CASA) if os.path.isfile(self.out_fname): os.remove(self.out_fname) replace_dict = { "filename%log": "'%s'" % (out_log_fname), "output%averaging": "'daily'", "icycle": "%d" % (self.biogeochem), "cable_user%YearStart": "%d" % (st_yr), "cable_user%YearEnd": "%d" % (en_yr), "filename%out": "'%s'" % (self.out_fname), "cable_user%POPLUC": ".F.", "cable_user%CASA_DUMP_READ": ".FALSE.", "cable_user%CASA_DUMP_WRITE": ".FALSE.", "cable_user%SOIL_STRUC": "'%s'" % (self.soil_flag), "spincasa": ".FALSE.", "spinup": ".FALSE.", "l_laiFeedbk": ".TRUE.", "output%averaging": "'all'", "casafile%out": "'%s'" % (self.out_fname_CASA), } adjust_nml_file(self.nml_fname, replace_dict)
def setup_re_spin(self, number=None): """ Adjust the CABLE namelist file with the various flags for another spin """ out_log_fname = "%s_log_ccp%d.txt" % (self.experiment_id, number) out_log_fname = os.path.join(self.log_dir, out_log_fname) if os.path.isfile(out_log_fname): os.remove(out_log_fname) self.out_fname = "%s_out_cable_ccp%d.nc" % (self.experiment_id, number) self.out_fname = os.path.join(self.output_dir, self.out_fname) if os.path.isfile(self.out_fname): os.remove(self.out_fname) self.out_fname_CASA = "%s_out_CASA_ccp%d.nc" % \ (self.experiment_id, number) self.out_fname_CASA = os.path.join(self.output_dir, self.out_fname_CASA) if os.path.isfile(self.out_fname_CASA): os.remove(self.out_fname_CASA) replace_dict = { "filename%log": "'%s'" % (out_log_fname), "filename%restart_in": "'%s'" % (self.cable_restart_fname), "cable_user%climate_restart_in": "'%s'" % (self.climate_restart_fname), "cable_user%POP_restart_in": "'%s'" % (self.pop_restart_fname), "casafile%cnpipool": "'%s'" % (self.casa_restart_fname), "cable_user%POP_fromZero": ".F.", "cable_user%CASA_fromZero": ".F.", "cable_user%POP_rst": "'./'", "cable_user%CLIMATE_fromZero": ".F.", "cable_user%CASA_DUMP_READ": ".FALSE.", "cable_user%CASA_DUMP_WRITE": ".TRUE.", "cable_user%CASA_NREP": "0", "cable_user%SOIL_STRUC": "'%s'" % (self.soil_flag), "icycle": "%d" % (self.biogeochem), "leaps": ".TRUE.", "spincasa": ".FALSE.", #"casafile%c2cdumppath": "'./'", "output%restart": ".TRUE.", "filename%out": "'%s'" % (self.out_fname), "casafile%out": "'%s'" % (self.out_fname_CASA), } adjust_nml_file(self.nml_fname, replace_dict)
def setup_nml_file(self): replace_dict = { "filename%met": "''", # not needed for GSWP3 run "filename%type": "'%s'" % (self.grid_fname), "filename%veg": "'%s'" % (self.veg_fname), "filename%soil": "'%s'" % (self.soil_fname), "gswpfile%mask": "'%s'" % (self.mask_fname), "output%averaging": "'monthly'", "spinup": ".FALSE.", "cable_user%FWSOIL_SWITCH": "'standard'", "cable_user%GS_SWITCH": "'medlyn'", "cable_user%GW_MODEL": ".FALSE.", "cable_user%or_evap": ".FALSE.", "cable_user%GSWP3": ".TRUE.", "cable_user%MetType": "'gswp3'", "verbose": ".FALSE.", } adjust_nml_file(self.nml_fname, replace_dict)
def setup_re_spin(self, number=None): """ Adjust the CABLE namelist file with the various flags for another spin """ out_fname = "%s_out_cable_spin_%d.nc" % (self.experiment_id, number) out_fname = os.path.join(self.output_dir, out_fname) out_log_fname = "%s_log_spin_%d.txt" % (self.experiment_id, number) out_log_fname = os.path.join(self.log_dir, out_log_fname) cable_rst_ifname = "%s_cable_rst_%d.nc" % (self.experiment_id, number - 1) cable_rst_ifname = os.path.join(self.restart_dir, cable_rst_ifname) cable_rst_ofname = "%s_cable_rst_%d.nc" % (self.experiment_id, number) cable_rst_ofname = os.path.join(self.restart_dir, cable_rst_ofname) casa_rst_ifname = "%s_casa_rst_%d.nc" % (self.experiment_id, number - 1) casa_rst_ifname = os.path.join(self.restart_dir, casa_rst_ifname) casa_rst_ofname = "%s_casa_rst_%d.nc" % (self.experiment_id, number) casa_rst_ofname = os.path.join(self.restart_dir, casa_rst_ofname) replace_dict = { "filename%out": "'%s'" % (out_fname), "filename%log": "'%s'" % (out_log_fname), "filename%restart_in": "'%s'" % (cable_rst_ifname), "filename%restart_out": "'%s'" % (cable_rst_ofname), "casafile%cnpipool": "'%s'" % (casa_rst_ifname), "casafile%cnpepool": "'%s'" % (casa_rst_ofname), "cable_user%CASA_fromZero": ".FALSE.", "cable_user%CASA_DUMP_READ": ".FALSE.", "cable_user%CASA_DUMP_WRITE": ".TRUE.", "cable_user%CASA_NREP": "0", "output%restart": ".TRUE.", "spincasa": ".FALSE.", "icycle": "%d" % (self.biogeochem_id), "leaps": ".TRUE.", } adjust_nml_file(self.nml_fname, replace_dict)
def worker(self, met_files, url, rev): for fname in met_files: site = "AWAP_pixel" lat = os.path.basename(fname).split("_")[3] lon1 = os.path.basename(fname).split("_")[4].split(".")[0] lon2 = os.path.basename(fname).split("_")[4].split(".")[1] lon = "%s.%s" % (lon1, lon2) lat = float(lat) lon = float(lon) base_nml_fn = os.path.join(self.grid_dir, "%s" % (self.nml_fname)) nml_fname = "cable_%s.nml" % (site) shutil.copy(base_nml_fn, nml_fname) (out_fname, out_log_fname) = self.clean_up_old_files(site) # Add LAI to met file? if self.fixed_lai is not None or self.lai_dir is not None: fname = change_LAI(fname, site, fixed=self.fixed_lai, lai_dir=self.lai_dir) if self.fwsoil == "hydraulics": if lat == -30.40 and lon == 151.60: fname = change_iveg(fname, site, 21) # GRW if lat == -31.10 and lon == 142.50: fname = change_iveg(fname, site, 21) # GRW elif lat == -31.10 and lon == 150.95: fname = change_iveg(fname, site, 22) # SAW elif lat == -30.00 and lon == 141.40: fname = change_iveg(fname, site, 22) # SAW else: print("problem") sys.exit() replace_dict = { "filename%met": "'%s'" % (fname), "filename%out": "'%s'" % (out_fname), "filename%log": "'%s'" % (out_log_fname), "filename%restart_out": "' '", "filename%type": "'%s'" % (self.grid_fname), "filename%veg": "'%s'" % (self.veg_fname), "filename%soil": "'%s'" % (self.soil_fname), "output%restart": ".FALSE.", "fixedCO2": "%.2f" % (self.co2_conc), "casafile%phen": "'%s'" % (self.phen_fname), "casafile%cnpbiome": "'%s'" % (self.cnpbiome_fname), "cable_user%GS_SWITCH": "'medlyn'", "cable_user%GW_MODEL": ".FALSE.", "cable_user%or_evap": ".FALSE.", "redistrb": ".FALSE.", "spinup": ".FALSE.", "cable_user%litter": ".TRUE.", "cable_user%FWSOIL_SWITCH": "'%s'" % (self.fwsoil), } adjust_nml_file(nml_fname, replace_dict) self.run_me(nml_fname) add_attributes_to_output_file(nml_fname, out_fname, url, rev) shutil.move(nml_fname, os.path.join(self.namelist_dir, nml_fname)) if self.fixed_lai is not None or self.lai_dir is not None: os.remove("%s_tmp.nc" % (site)) os.remove("new_sumbal")
def setup_simulation(self, met_fname, historical=True, number=None): """ Adjust the CABLE namelist file for the experiment years """ out_fname = "%s_out_cable_simulation.nc" % (self.experiment_id) out_fname = os.path.join(self.output_dir, out_fname) out_log_fname = "%s_log_simulation.txt" % (self.experiment_id) out_log_fname = os.path.join(self.log_dir, out_log_fname) cable_rst_ifname = "%s_cable_rst_%d.nc" % (self.experiment_id, number) cable_rst_ifname = os.path.join(self.restart_dir, cable_rst_ifname) casa_rst_ifname = "%s_casa_rst_%d.nc" % (self.experiment_id, number) casa_rst_ifname = os.path.join(self.restart_dir, casa_rst_ifname) if historical: out_fname = "%s_out_cable_historical.nc" % (self.experiment_id) out_fname = os.path.join(self.output_dir, out_fname) cable_rst_ofname = "%s_cable_rst_%d.nc" % (self.experiment_id, number) cable_rst_ofname = os.path.join(self.restart_dir, cable_rst_ofname) casa_rst_ofname = "%s_casa_rst_%d.nc" % (self.experiment_id, number) casa_rst_ofname = os.path.join(self.restart_dir, casa_rst_ofname) replace_dict = { "filename%met": "'%s'" % (met_fname), "filename%out": "'%s'" % (out_fname), "filename%log": "'%s'" % (out_log_fname), "filename%restart_in": "'%s'" % (cable_rst_ifname), "filename%restart_out": "'%s'" % (cable_rst_ofname), "casafile%cnpipool": "'%s'" % (casa_rst_ifname), "casafile%cnpepool": "'%s'" % (casa_rst_ofname), "icycle": "%d" % (self.biogeochem_id), "cable_user%CASA_DUMP_READ": ".FALSE.", "cable_user%CASA_DUMP_WRITE": ".FALSE.", "spincasa": ".FALSE.", "spinup": ".FALSE.", "output%restart": ".TRUE.", "output%averaging": "'daily'", "leaps": ".TRUE.", } else: replace_dict = { "filename%met": "'%s'" % (met_fname), "filename%out": "'%s'" % (out_fname), "filename%log": "'%s'" % (out_log_fname), "filename%restart_in": "'%s'" % (cable_rst_ifname), "filename%restart_out": "' '", "casafile%cnpipool": "'%s'" % (casa_rst_ifname), "casafile%cnpepool": "' '", "icycle": "%d" % (self.biogeochem_id), "cable_user%CASA_DUMP_READ": ".FALSE.", "cable_user%CASA_DUMP_WRITE": ".FALSE.", "spincasa": ".FALSE.", "spinup": ".FALSE.", "output%restart": ".FALSE.", "output%averaging": "'daily'", "leaps": ".TRUE.", } adjust_nml_file(self.nml_fname, replace_dict) return (out_fname)
def create_new_nml_file(self, log_fname, out_fname, restart_in_fname, restart_out_fname, year, co2_conc): out_log_fname = os.path.join(self.log_dir, log_fname) out_fname = os.path.join(self.output_dir, out_fname) # i.e. no restart file for first spinup year if restart_in_fname == "missing": restart_in_fname = "" else: restart_in_fname = os.path.join(self.restart_dir, restart_in_fname) restart_out_fname = os.path.join(self.restart_dir, restart_out_fname) if self.met_data == "GSWP3": rainf_fn = os.path.join( self.met_dir, "Rainf/GSWP3.BC.Rainf.3hrMap.%s.nc" % (year)) snowf_fn = os.path.join( self.met_dir, "Snowf/GSWP3.BC.Snowf.3hrMap.%s.nc" % (year)) lwdown_fn = os.path.join( self.met_dir, "LWdown/GSWP3.BC.LWdown.3hrMap.%s.nc" % (year)) swdown_fn = os.path.join( self.met_dir, "SWdown/GSWP3.BC.SWdown.3hrMap.%s.nc" % (year)) psurf_fn = os.path.join( self.met_dir, "PSurf/GSWP3.BC.PSurf.3hrMap.%s.nc" % (year)) qair_fn = os.path.join(self.met_dir, "Qair/GSWP3.BC.Qair.3hrMap.%s.nc" % (year)) wind_fn = os.path.join(self.met_dir, "Wind/GSWP3.BC.Wind.3hrMap.%s.nc" % (year)) tair_fn = (os.path.join( self.met_dir, "Tair/GSWP3.BC.Tair.3hrMap.%s.nc" % (year))) elif self.met_data == "AWAP": rainf_fn = os.path.join(self.met_dir, "Rainf/AWAP.Rainf.3hr.%s.nc" % (year)) snowf_fn = os.path.join(self.met_dir, "Snowf/AWAP.Snowf.3hr.%s.nc" % (year)) lwdown_fn = os.path.join(self.met_dir, "LWdown/AWAP.LWdown.3hr.%s.nc" % (year)) swdown_fn = os.path.join(self.met_dir, "SWdown/AWAP.SWdown.3hr.%s.nc" % (year)) psurf_fn = os.path.join(self.met_dir, "PSurf/AWAP.PSurf.3hr.%s.nc" % (year)) qair_fn = os.path.join(self.met_dir, "Qair/AWAP.Qair.3hr.%s.nc" % (year)) wind_fn = os.path.join(self.met_dir, "Wind/AWAP.Wind.3hr.%s.nc" % (year)) tair_fn = (os.path.join(self.met_dir, "Tair/AWAP.Tair.3hr.%s.nc" % (year))) replace_dict = { "filename%log": "'%s'" % (out_log_fname), "filename%out": "'%s'" % (out_fname), "filename%restart_in": "'%s'" % (restart_in_fname), "filename%restart_out": "'%s'" % (restart_out_fname), "fixedCO2": "%f" % (co2_conc), "ncciy": "%s" % ( year ), # 0 for not using gswp; 4-digit year input for year of gswp met "CABLE_USER%YearStart": "0", # needs to be 0 so the ncciy is set "CABLE_USER%YearEnd": "0", # needs to be 0 so the ncciy is set "gswpfile%rainf": "'%s'" % (rainf_fn), "gswpfile%snowf": "'%s'" % (snowf_fn), "gswpfile%LWdown": "'%s'" % (lwdown_fn), "gswpfile%SWdown": "'%s'" % (swdown_fn), "gswpfile%PSurf": "'%s'" % (psurf_fn), "gswpfile%Qair": "'%s'" % (qair_fn), "gswpfile%Tair": "'%s'" % (tair_fn), "gswpfile%wind": "'%s'" % (wind_fn), } adjust_nml_file(self.nml_fname, replace_dict) # save copy as we go for debugging - remove later shutil.copyfile( self.nml_fname, os.path.join(self.namelist_dir, "cable_%d.nml" % (year)))
def initial_setup(self, st_yr_spin, en_yr_spin, st_yr, en_yr): """ Setup CABLE namelist file for spinup from zero """ if not os.path.exists(self.restart_dir): os.makedirs(self.restart_dir) if not os.path.exists(self.output_dir): os.makedirs(self.output_dir) if not os.path.exists(self.log_dir): os.makedirs(self.log_dir) if not os.path.exists(self.dump_dir): os.makedirs(self.dump_dir) base_nml_fn = os.path.join(self.grid_dir, "%s" % (self.nml_fname)) if os.path.isfile(self.nml_fname): os.remove(self.nml_fname) shutil.copy(base_nml_fn, self.nml_fname) #shutil.copyfile(os.path.join(self.driver_dir, "cable.nml"), # self.nml_fname) shutil.copyfile(os.path.join(self.driver_dir, "site.nml"), self.site_nml_fname) self.out_fname = os.path.join( self.output_dir, "%s_out_cable_zero.nc" % (self.experiment_id)) if os.path.isfile(self.out_fname): os.remove(self.out_fname) self.out_fname_CASA = os.path.join( self.output_dir, "%s_out_CASA_zero.nc" % (self.experiment_id)) if os.path.isfile(self.out_fname_CASA): os.remove(self.out_fname_CASA) out_log_fname = os.path.join(self.log_dir, "%s_log_zero.txt" % (self.experiment_id)) if os.path.isfile(out_log_fname): os.remove(out_log_fname) replace_dict = { "RunType": '"spinup"', "CO2NDepFile": "'%s'" % (self.co2_ndep_fname), "spinstartyear": "%d" % (st_yr), "spinendyear": "%d" % (en_yr), "spinCO2": "284.7", "spinNdep": "0.79", "spinPdep": "0.144", } adjust_nml_file(self.site_nml_fname, replace_dict) replace_dict = { "filename%met": "'%s'" % (self.met_fname), "filename%out": "'%s'" % (self.out_fname), "casafile%out": "'%s'" % (self.out_fname_CASA), "filename%log": "'%s'" % (out_log_fname), "filename%restart_out": "'%s'" % (self.cable_restart_fname), "cable_user%climate_restart_out": "'%s'" % (self.climate_restart_fname), "cable_user%POP_restart_out": "'%s'" % (self.pop_restart_fname), "casafile%cnpepool": "'%s'" % (self.casa_restart_fname), "filename%restart_in": "''", "cable_user%climate_restart_in": "''", "cable_user%POP_restart_in": "''", "filename%type": "'%s'" % self.grid_fname, "filename%veg": "'%s'" % (self.veg_fname), "filename%soil": "'%s'" % (self.soil_fname), "output%restart": ".TRUE.", "casafile%phen": "'%s'" % (self.phen_fname), "casafile%cnpbiome": "'%s'" % (self.cnpbiome_fname), "cable_user%RunIden": "'%s'" % (self.experiment_id), "cable_user%POP_out": "'ini'", "cable_user%POP_rst": "'./'", "cable_user%POP_fromZero": ".T.", "cable_user%CASA_fromZero": ".T.", "cable_user%CLIMATE_fromZero": ".T.", "cable_user%CALL_CLIMATE": "%s" % (self.clim_flag), "cable_user%SOIL_STRUC": "'%s'" % (self.soil_flag), "cable_user%vcmax": "'%s'" % (self.vcmax), "cable_user%YearStart": "%d" % (st_yr_spin), "cable_user%YearEnd": "%d" % (en_yr_spin), "cable_user%CASA_SPIN_STARTYEAR": "%d" % (st_yr_spin), "cable_user%CASA_SPIN_ENDYEAR": "%d" % (en_yr_spin), "cable_user%CALL_POP": "%s" % (self.pop_flag), "output%averaging": "'monthly'", "icycle": "%d" % (self.biogeochem), "l_vcmaxFeedbk": "%s" % (self.vcmax_feedback), "spinup": ".FALSE.", "cable_user%FWSOIL_SWITCH": "'Haverd2013'", "cable_user%GS_SWITCH": "'medlyn'", "cable_user%limit_labile": ".F.", "cable_user%SSNOW_POTEV": "'P-M'", "cable_user%CASA_NREP": "0", # number of times to repeat CASA forcing "delsoilM": "0.01", "delsoilT": "0.1", "output%casa": ".TRUE.", "output%grid": "'land'", "leaps": ".FALSE.", "cable_user%litter": ".true.", "cable_user%CASA_OUT_FREQ": "'monthly'", "cable_user%MetType": "'site'", "cable_user%PHENOLOGY_SWITCH": "'modis'", } adjust_nml_file(self.nml_fname, replace_dict) cwd = os.getcwd() (url, rev) = get_svn_info(cwd, self.cable_src) # delete local executable, copy a local copy and use that local_exe = "cable" if os.path.isfile(local_exe): os.remove(local_exe) shutil.copy(self.cable_exe, local_exe) self.cable_exe = local_exe return (url, rev)