#imshow_grid(rmg,'topographic__elevation',show_elements=False) #plt.xlim((rmg.shape[1]*rmg.dx/3,rmg.shape[1]*rmg.dx*2/3)) #plt.show() #plt.clf print('Current time = ' + str(current_time)) # show current time for of in out_fields: ds[of][plotCounter, :, :] = rmg['node'][of].reshape(rmg.shape) plotCounter += 1 current_time += dt # update time tracker i += 1 # update iteration variable print(plotCounter) print('For loop complete') write_esri_ascii('test.asc', rmg) # imshow_grid(rmg,'topographic__elevation',show_elements=False) # # tweek edges of domain so that they match the buffer kdc # plt.xlim((e1,e2)) # plt.show() # plt.clf ################################################################################ ## plot the output into a gif # hvds_topo = hv.Dataset(ds.topographic__elevation) # get_ipython().run_line_magic('opts', "Image style(interpolation='bilinear', cmap='viridis') plot[colorbar=True]") # get_ipython().run_line_magic('output', 'size=700') # topo = hvds_topo.to(hv.Image, ['x', 'y']) # # topo #
################################################################################ ## plot the output into a gif hvds_topo = hv.Dataset(ds.topographic__elevation) try: get_ipython().run_line_magic('opts', "Image style(interpolation='bilinear', cmap='viridis') plot[colorbar=True]") get_ipython().run_line_magic('output', 'size=700') except: print("Cannot plot gif because user is not using ipython") topo = hvds_topo.to(hv.Image, ['x', 'y']) # topo #%% #hv.output(dpi=100, size=150) #hv.save(topo, 'topo.gif', fps=30) # #if SAVE_OUTPUT > 0: # d = datetime.datetime.today() # newPath = "./model_output_" + d.strftime("%Y_%B_%d_%H_%M") # os.mkfir(newPath) # hv.save(topo, newPath + '/topo.gif', fps=30) if SAVE_OUTPUT == 2: currFile = os.path.basename(__file__) copyfile(currFile, newPath + "/" + currFile + "_archive") files = write_esri_ascii(newPath + '/output_grids.asc', rmg) # save what is like a DEM:
def run_model(mdl_input=None): if mdl_input == None: mdl_input = default_landscape_parameters() # for ease, seperate the input into its main comonents domain = mdl_input['model_domain'] landscape = mdl_input['landscape'] tectonics = mdl_input['tectonics'] fault_opt = mdl_input['fault_opt'] duration = mdl_input['duration'] save_opt = mdl_input['save_opt'] # set the pointspacing dxy = domain['ymax'] / domain['Nxy'] # set the location of the fault if fault_opt['fault_pos'] == 'midway': fault_pos = domain['ymax'] / 2 # time bookeeping current_time = 0 # time tracking variable [kyr] i = 0 # iteration tracker [integer] plot_num = 2 # number of iterations to run before each new plot #calculate_BR= False # calculate the metric BR used in the main paper num_frames = ((duration['total_time'] - duration['shear_start']) / duration['dt_during_shear']) / plot_num + 1 # informative output file: e.g. arctan_exp_5m_fault if save_opt['save_format'] == 'Default': d = datetime.datetime.today() fn = '{slip}{localization:.2e}_{damage}{intensity:.2e}_fault'.format( slip=fault_opt['slip_profile'], localization=fault_opt['localization'], damage=fault_opt['damage_prof'], intensity=landscape['km']) save_opt['save_format'] = { 'file_name': fn, 'dirname': fn + d.strftime('%d-%m-%Y') } print('Starting model run: ' + save_opt['save_format']['file_name']) ########################################################################### ########################################################################### ## Define domain (e.g. number of columns and rows) ncols = int(domain['xmax'] * (1. + 2. * domain['loopBuff']) / dxy) # number of columns, tripled for looped boundaries kdc nrows = int(domain['ymax'] / dxy) # number of rows e1 = ncols * dxy * domain['loopBuff'] / (2. * domain['loopBuff'] + 1. ) # edge1 e2 = ncols * dxy - e1 # edge2 ## Build the landlab grid # rmg = RasterModelGrid((nrows, ncols), dxy) # build a landlab grid of nrows x ncols #set boundary conditions to have top closed and all others open rmg.set_closed_boundaries_at_grid_edges(tectonics['boundaries'][0], tectonics['boundaries'][1], tectonics['boundaries'][2], tectonics['boundaries'][3]) # Add an elevation field + slope and noise to get the flow router started rmg.add_zeros('node', 'topographic__elevation') rmg['node']['topographic__elevation'] += (rmg.node_y * 0.1 + np.random.rand(nrows * ncols)) ################################################################################ ## Fourth, the fun part, set up the off-fault deformation profile ############# ################################################################################ # define how a fault will work class fault: def __init__(self, rmg, fault_pos=None, fault_width=None): self.rmg = rmg self.nrows = rmg.shape[0] self.ncols = rmg.shape[1] self.fault_pos = fault_pos self.fault_width = fault_width def slip_profile(self, fault_prof, width=None): ''' Define a slip profile relative to the dimensions of the model. ''' yLocation = np.arange(nrows) * self.rmg.dx if width == None: width = self.fault_width if fault_prof == 'arctan': profile = 0.5 + 1 / np.pi * np.arctan( (yLocation - self.fault_pos) * np.pi / width) # deal with magic number elif fault_prof == 'heaviside': profile = np.heaviside(yLocation - self.fault_pos, 1) elif fault_prof == 'exp': profile = np.exp(-yLocation / (fault_opt['v_star'] / dxy)) else: raise ('fault_opt must be one of: arctan, heavyside, exp') v_profile = profile * fault_opt['vmax'] accum_disp = profile * self.rmg.dx return v_profile, accum_disp def lithology(self, damage_opt=None, width=None, ko=None, km=None, Do=None, Dm=None): if width == None: width = self.fault_width # set to the instantiated width if damage_opt == None: damage_func = lambda x: np.zeros(x.size) km = 0 Dm = 0 # 2D profiles if damage_opt == 'boxcar': damage_func = lambda x: np.heaviside(x-fault_pos-width,1) - \ np.heaviside(x-fault_pos+width,1) if damage_opt == 'heaviside_up': damage_func = lambda x: np.abs( np.heaviside(x - fault_pos, 1) - 1) if damage_opt == 'heaviside_down': damage_func = lambda x: np.heaviside(x - fault_pos, 1) if damage_opt == 'exp': damage_func = lambda x: ( width / (abs(x - fault_pos) + width) ) # NEED TO DEFINE BUFF -> similar to c value in aftershocks def mk_dict(rmg, damage_func, ao, am): lith_ary = ao + (am - ao) * damage_func(rmg.node_y) damage_dict = dict(zip(rmg.node_y, lith_ary)) return damage_dict attrs = { 'K_sp': mk_dict(self.rmg, damage_func, ko, km), 'D': mk_dict(self.rmg, damage_func, Do, Dm) } lith = Lithology( self.rmg, self.rmg.ones().ravel().reshape(1, len( self.rmg.node_y)), # note that this is a dummy thickness self.rmg.node_y.reshape(1, len(self.rmg.node_y)), attrs, rock_id=self.rmg.node_y) self.rmg['node']['topographic__elevation'] += 1. lith.run_one_step() #imshow_grid(self.rmg, 'K_sp', cmap='viridis', vmin=ko, vmax=km) return lith # define the position of the fault this_fault = fault(rmg, fault_pos, fault_opt['width']) this_fault.lithology(damage_opt=fault_opt['damage_prof'], ko=landscape['ko'], km=landscape['km'], Do=landscape['Do'], Dm=landscape['Dm']) v_profile, accum_disp = this_fault.slip_profile( fault_opt['slip_profile'], fault_opt['localization'] * fault_opt['width']) # This is an array for counting how many pixels need to be moved nshift = np.zeros(nrows) n_buff = 0 # optional extra buffer zone incase you only want to move a subset. ################################################################################ ## Next, we instantiate landlab components that will evolve the landscape ##### ################################################################################ fr = FlowAccumulator( rmg, 'topographic__elevation', flow_director='FlowDirectorD8') # standard D8 flow routing algorithm sp = FastscapeEroder(rmg, K_sp='K_sp', m_sp=landscape['m'], n_sp=landscape['n'], threshold_sp=0) # river eroder lin_diffuse = LinearDiffuser(rmg, linear_diffusivity='D') #linear diffuser fill = DepressionFinderAndRouter(rmg) #lake filling algorithm ################################################################################ ## Next, we instantiate an object to store the model output ##### ################################################################################ nts = int(num_frames) if not save_opt['save_out'] == False: # define the base coordinates of the grid ds = xr.Dataset( coords={ 'x': ( ('x'), # tuple of dimensions rmg.x_of_node.reshape(rmg.shape)[ 0, :], # 1-d array of coordinate data { 'units': 'meters' }), # dictionary with data attributes 'y': (('y'), rmg.y_of_node.reshape(rmg.shape)[:, 1], { 'units': 'meters' }), 'time': (('time'), duration['dt'] * np.arange(nts) / 1e6, { 'units': 'millions of years since model start', 'standard_name': 'time' }) }) # introduce the fields according the the fields specified in "save_opt" for of in save_opt['out_fields']: ds[of] = (('time', 'y', 'x'), np.empty((nts, rmg.shape[0], rmg.shape[1])), { 'units': 'meters' }) plotCounter = 0 ################################################################################ # Now that all parameters and landlab components are set, run the loop ####### ################################################################################ dt = duration['dt'] # define the timestep mean_elev = [] time_array = [] with tqdm(total=duration['total_time'], position=0, leave=True) as pbar: while (current_time <= duration['total_time']): pbar.n = np.round(current_time) pbar.refresh() ## Looped boundary conditions ## # Because the landlab flow router isn't currently set up to use looped # boundary conditions, I simulated them here by duplicating the landscape # to the left and right such that the flow accumulator would 'see' the # the appropriate amount of upstream drainage area. rmg['node']['topographic__elevation'][(rmg.node_x < e1)] = ( rmg['node']['topographic__elevation'][(rmg.node_x >= (e2 - e1)) & (rmg.node_x < e2)]) rmg['node']['topographic__elevation'][(rmg.node_x >= e2)] = ( rmg['node']['topographic__elevation'][(rmg.node_x >= e1) & (rmg.node_x < (2 * e1))]) ## Tectonic off-fault deformation ## # To simulate off fault lateral displacement/deformation, we apply a # lateral velocity profile. This is done by taking the landlab elevations # and shifting their coordinates. if (current_time > duration['shear_start']): dt = duration[ 'dt_during_shear'] # First set a lower timestep to keep it stable # Take the landlab grid elevations and reshape into a box nrows x ncols elev = rmg['node']['topographic__elevation'] elev_box = np.reshape(elev, [nrows, ncols]) # Calculate the offset that has accumulated over a timestep accum_disp += v_profile * dt # now scan up the landscape row by row looking for offset for r in range(nrows): # check if the accumulated offset for a row is larger than a pixel if accum_disp[r] >= dxy: # if so, count the number of in the row pixels to be moved nshift[r] = int(np.floor(accum_disp[r] / dxy)) # copy which pixels will be moved off the grid by displacement temp = elev_box[r, n_buff:int(nshift[r]) + n_buff] # move the row over by the number of pixels of accumulated offset elev_box[r, n_buff:( (ncols - n_buff) - int(nshift[r]))] = elev_box[r, int(nshift[r]) + n_buff:ncols - n_buff] # replace the values on the right side by the ones from the left elev_box[r, ((ncols) - int(nshift[r])):ncols] = temp # last, subtract the offset pixels from the accumulated displacement accum_disp[r] -= dxy #This section is if you select a middle section to be moved independently elev_box[:, (ncols - n_buff):ncols] = elev_box[:, n_buff:(2 * n_buff)] elev_box[:, 0:n_buff] = elev_box[:, ncols - 2 * n_buff:ncols - n_buff] # Finally, reshape the elevation box into an array and feed to landlab elev_new = np.reshape(elev_box, nrows * ncols) rmg['node']['topographic__elevation'] = elev_new # record the evolution of the mean elevation mean_elev.append(np.mean(rmg['node']['topographic__elevation'])) time_array.append(current_time) ## Landscape Evolution ## # Now that we have performed the tectonic deformation, lets apply our # landscape evolution and watch the landscape change as a result. # Uplift the landscape rmg['node']['topographic__elevation'][ rmg.core_nodes] += tectonics['uplift_rate'] * dt # set the lower boundary as fixed elevation #rmg['node']['topographic__elevation'][rmg.node_y==0] = 0 #rmg['node']['topographic__elevation'][rmg.node_y==max(rmg.node_y)] = 0 # Diffuse the landscape simulating hillslope sediment transport lin_diffuse.run_one_step(dt) # Accumulate and route flow, fill any lakes, and erode under the rivers fr.run_one_step() # route flow DepressionFinderAndRouter.map_depressions(fill) # fill lakes sp.run_one_step(dt) # fastscape stream power eroder ## Plotting ## # plot output at each [plot_num] iteration once we start lateral advection if i % plot_num == 0 and current_time > duration['shear_start']: if not save_opt['save_out'] == False: for of in save_opt['out_fields']: ds[of][plotCounter, :, :] = rmg['node'][of].reshape( rmg.shape) plotCounter += 1 current_time += dt # update time tracker i += 1 # update iteration variable print('number of frames:', plotCounter) print('For loop complete') ########################################################################## ### We do some bookkeeping with the result ############################### ########################################################################## # plt.figure() # imshow_grid(rmg,'topographic__elevation',show_elements=False) # # tweek edges of domain so that they match the buffer kdc # plt.xlim((e1,e2)) # plt.show() # plt.clf ########################################################################## ## plot the evolution of the mean elevation of the model: if tectonics['track_uplift'] == True: plt.figure() plt.plot(time_array, mean_elev, label='Mean elevation') plt.axvline(duration['shear_start'], color='r', label='Start lateral advection') plt.xlabel('Iteration number') plt.ylabel('Mean elevation') plt.legend() plt.show() # small function to save a specific field as a gif ## plot the output into a gif get_ipython().run_line_magic( 'opts', "Image style(interpolation='bilinear', cmap='viridis') plot[colorbar=True]" ) get_ipython().run_line_magic('output', 'size=100') fn = save_opt['save_format']['file_name'] dn = save_opt['save_format']['dirname'] if save_opt['save_out'] == True: os.mkdir(dn) for of in save_opt['out_fields']: hvds_topo = hv.Dataset(ds[of]) topo = hvds_topo.to(hv.Image, ['x', 'y']) topo.opts(colorbar=True, fig_size=200, xlim=(e1, e2)) hv.save(topo, os.path.join(dn, fn + of + '.gif')) with open(os.path.join(dn, fn + '.pkl'), 'wb') as f: pickle.dump([rmg, ds], f) # and to load the session again: # dill.load_session(filename) if save_opt['save_ascii'] == True: write_esri_ascii(os.path.join( dn, save_opt['save_format']['file_name'] + '.asc'), rmg, names='topographic__elevation') if save_opt['save_out'] == 'temp': hv.save(topo, 'temp_output.gif') if save_opt['append_to_log'] == True: def NestedDictValues(d): for v in d.values(): if isinstance(v, dict): yield from NestedDictValues(v) else: yield v with open('Model_log.csv', mode='a') as fd: writer = csv.writer(fd) writer.writerow(NestedDictValues(mdl_input)) return rmg
def run_model(input_file=None, savepath=None, initial_topo_file=None, initial_seed_file=None): from landlab.components.flow_routing.route_flow_dn_JL import FlowRouter from landlab.components.stream_power.fastscape_stream_power_JL import FastscapeEroder #from landlab.components.stream_power.stream_power import StreamPowerEroder from landlab.components.sink_fill.pit_fill_pf import PitFiller from landlab.components.diffusion.diffusion import LinearDiffuser from landlab import ModelParameterDictionary #from landlab.plot import channel_profile as prf from landlab.plot.imshow import imshow_node_grid from landlab.io.esri_ascii import write_esri_ascii from landlab.io.esri_ascii import read_esri_ascii from landlab import RasterModelGrid #from analysis_method import analyze_drainage_percentage #from analysis_method import analyze_drainage_percentage_each_grid #from analysis_method import analyze_mean_erosion #from analysis_method import elev_diff_btwn_moraine_upland #from analysis_method import label_catchment #from analysis_method import cross_section #from analysis_method import analyze_node_below_threshold #from analysis_method import identify_drained_area #from analysis_method import save_result from analysis_method import shiftColorMap import copy import numpy as np import matplotlib import matplotlib.pyplot as plt import os import time import sys import shutil sys.setrecursionlimit(5000) #=============================================================================== #get the needed properties to build the grid: if input_file is None: input_file = './coupled_params_sp.txt' inputs = ModelParameterDictionary(input_file) nrows = inputs.read_int('nrows') ncols = inputs.read_int('ncols') dx = inputs.read_float('dx') initial_slope = inputs.read_float('initial_slope') rightmost_elevation = initial_slope * ncols * dx #rightmost_elevation = inputs.read_float('rightmost_elevation') uplift_rate = inputs.read_float('uplift_rate') incision_rate = inputs.read_float('incision_rate') runtime = inputs.read_float('total_time') dt = inputs.read_float('dt') nt = int(runtime // dt) k_sp = inputs.read_float('K_sp') m_sp = inputs.read_float('m_sp') uplift_per_step = uplift_rate * dt incision_per_step = incision_rate * dt moraine_height = inputs.read_float('moraine_height') moraine_width = inputs.read_float('moraine_width') #valley_width = inputs.read_float('valley_width') valley_depth = inputs.read_float('valley_depth') num_outs = inputs.read_int('number_of_outputs') output_interval = int(nt // num_outs) diff = inputs.read_float('linear_diffusivity') #threshold_stream_power = inputs.read_float('threshold_stream_power') threshold_AS = inputs.read_float('threshold_AS') #threshold_erosion = dt*threshold_stream_power gw_coeff = inputs.read_float('gw_coeff') all_dry = inputs.read_bool('all_dry') fill_sink_with_water = inputs.read_bool('fill_sink_with_water') #=============================================================================== #=============================================================================== if initial_topo_file is None: #instantiate the grid object mg = RasterModelGrid(nrows, ncols, dx) ##create the elevation field in the grid: #create the field #specifically, this field has a triangular ramp #moraine at the north edge of the domain. mg.add_zeros('node', 'topographic__elevation', units='m') z = mg.at_node['topographic__elevation'] moraine_start_y = np.max(mg.node_y) - moraine_width moraine_ys = np.where(mg.node_y > moraine_start_y) z[moraine_ys] += (mg.node_y[moraine_ys] - np.min( mg.node_y[moraine_ys])) * (moraine_height / moraine_width) #set valley #valley_start_x = np.min(mg.node_x)+valley_width #valley_ys = np.where((mg.node_x<valley_start_x)&(mg.node_y<moraine_start_y-valley_width)) #z[valley_ys] -= (np.max(mg.node_x[valley_ys])-mg.node_x[valley_ys])*(valley_depth/valley_width) #set ramp (towards valley) upland = np.where(mg.node_y < moraine_start_y) z[upland] -= (np.max(mg.node_x[upland]) - mg.node_x[upland]) * (rightmost_elevation / (ncols * dx)) z += rightmost_elevation #set ramp (away from moraine) #upland = np.where(mg.node_y<moraine_start_y) #z[upland] -= (moraine_start_y-mg.node_y[upland])*initial_slope #put these values plus roughness into that field if initial_seed_file is None: z += np.random.rand(len(z)) / 1 else: (seedgrid, seed) = read_esri_ascii(initial_seed_file, name='topographic__elevation_seed') z += seed mg.at_node['topographic__elevation'] = z #set river valley river_valley, = np.where( np.logical_and( mg.node_x == 0, np.logical_or(mg.status_at_node == 1, mg.status_at_node == 2))) mg.at_node['topographic__elevation'][river_valley] = -valley_depth else: (mg, z) = read_esri_ascii(initial_topo_file, name='topographic__elevation') #set river valley river_valley, = np.where( np.logical_and( mg.node_x == 0, np.logical_or(mg.status_at_node == 1, mg.status_at_node == 2))) mg.at_node['topographic__elevation'][river_valley] = -valley_depth #set up grid's boundary conditions (right, top, left, bottom) is inactive mg.set_closed_boundaries_at_grid_edges(True, True, False, True) #set up boundary along moraine #moraine_start_y = np.max(mg.node_y)-moraine_width #bdy_moraine_ids = np.where((mg.node_y > moraine_start_y) & (mg.node_x == 0)) #mg.status_at_node[bdy_moraine_ids]=4 #mg._update_links_nodes_cells_to_new_BCs() #=============================================================================== #=============================================================================== #instantiate the components: fr = FlowRouter(mg) pf = PitFiller(mg) sp = FastscapeEroder(mg, input_file, threshold_sp=threshold_AS * k_sp) #sp = StreamPowerEroder(mg, input_file, threshold_sp=threshold_erosion, use_Q=True) #diffuse = PerronNLDiffuse(mg, input_file) #lin_diffuse = LinearDiffuser(mg, input_file, method='on_diagonals') lin_diffuse = LinearDiffuser(mg, input_file) #=============================================================================== #=============================================================================== #instantiate plot setting plt.close('all') output_time = output_interval plot_num = 0 mycmap = shiftColorMap(matplotlib.cm.gist_earth, 'mycmap') #folder name if savepath is None: if all_dry: name_tag = 'All_dry' elif fill_sink_with_water: name_tag = 'Not_all_dry_no_sink' else: name_tag = 'Not_all_dry_sink' savepath = 'results/sensitivity_test_threshold_same_seed/'+name_tag+'_dt=' + str(dt) + '_total_time=' + str(runtime) + '_k_sp=' + str(k_sp) + \ '_uplift_rate=' + str(uplift_rate) + '_incision_rate=' + str(incision_rate) + '_initial_slope=' + str(initial_slope) + \ '_threshold=' + str(threshold_stream_power) if not os.path.isdir(savepath): os.makedirs(savepath) #copy params_file if not os.path.isfile(savepath + '/coupled_params_sp.txt'): shutil.copy(input_file, savepath + '/coupled_params_sp.txt') # Display a message print 'Running ...' print savepath #save initial topography write_esri_ascii(savepath + '/Topography_t=0.0.txt', mg, 'topographic__elevation') #time start_time = time.time() #=============================================================================== #=============================================================================== #perform the loops: for i in xrange(nt): #note the input arguments here are not totally standardized between modules ''' # simulate changing climate if (((i+1)*dt // 5000.) % 2) == 0.: all_dry = False else: all_dry = True ''' #sp = FastscapeEroder(mg, input_file, threshold_sp = threshold_stream_power) #update elevation mg.at_node['topographic__elevation'][mg.core_nodes] += uplift_per_step mg.at_node['topographic__elevation'][river_valley] -= incision_per_step #mg = lin_diffuse.diffuse(dt) #route and erode original_topo = mg.at_node['topographic__elevation'].copy() slope = mg.at_node['topographic__steepest_slope'].copy() filled_nodes = None if all_dry or fill_sink_with_water: mg = pf.pit_fill() filled_nodes, = np.where( (mg.at_node['topographic__elevation'] - original_topo) > 0) mg = fr.route_flow(routing_flat=all_dry) old_topo = mg.at_node['topographic__elevation'].copy() #mg, temp_z, temp_sp = sp.erode(mg, dt, Q_if_used='water__volume_flux') mg = sp.erode(mg, dt, flooded_nodes=filled_nodes) new_topo = mg.at_node['topographic__elevation'].copy() mg.at_node[ 'topographic__elevation'] = original_topo + new_topo - old_topo #diffuse #for j in range(10): # mg = lin_diffuse.diffuse(dt/10) mg = lin_diffuse.diffuse(dt) if i + 1 == output_time: print 'Saving data...' plot_num += 1 plt.figure(plot_num) im = imshow_node_grid(mg, 'topographic__elevation', plot_name='t = '+str(int((i+1)*dt))+' years', \ grid_units = ['m','m'], cmap=mycmap, allow_colorbar=True, \ vmin=0-valley_depth-incision_rate*runtime, vmax=5.+moraine_height+uplift_rate*runtime) plt.savefig(savepath + '/Topography_t=' + str( (i + 1) * dt) + '.jpg', dpi=300) write_esri_ascii( savepath + '/Topography_t=' + str((i + 1) * dt) + '.txt', mg, 'topographic__elevation') output_time += output_interval plt.close('all') print("--- %.2f minutes ---" % ((time.time() - start_time) / 60)), 'Completed loop', i + 1 plt.close('all') print 'Finished simulating.' #=============================================================================== #=============================================================================== #analyze_drainage_percentage(savepath, True) #analyze_mean_erosion(savepath, True) #elev_diff_btwn_moraine_upland(savepath, True) #label_catchment(savepath) #cross_section(savepath) #=============================================================================== print 'Done!' print '\n'
threshold_sp=0.0) #k eh erodibilidade, usar 0.0004 #FastscapeEroder(grid, K_sp=0.001, m_sp=0.5, n_sp=1.0, threshold_sp=0.0, discharge_field='drainage_area', erode_flooded_nodes=True) ed = ErosionDeposition( mg, K=0.0004, # Erodibility for substrate (units vary)valor anterior = 0.00001 v_s=0.001, # Effective settling velocity for chosen grain size metric [L/T]. m_sp= 0.5, # Discharge exponent (units vary) usar valores do fast scape (valor anterior = 0.5) n_sp=1.0, #Slope exponent (units vary) usar valores do fast scape sp_crit=0 ) #Critical stream power to erode substrate [E/(TL^2)] usar valores do fast scape lin_diffuse = LinearDiffuser(mg, linear_diffusivity=0.01) uplift_rate = 0.001 time_step = 1000 fr.run_one_step() sp.run_one_step(time_step) for i in range(101): print(i) fr.run_one_step() df.map_depressions() flooded = np.where(df.flood_status == 3)[0] # ver pra que serve ed.run_one_step(time_step) mg.at_node['topographic__elevation'] += time_step * uplift_rate #no artigo ele usa em anos mas esta de acordo com todos os outros parametros em anos tbm #lin_diffuse.run_one_step(time_step) css.run_one_step() if i == 1 or i == 10 or i == 20 or i == 40 or i == 60 or i == 80 or i == 100: files = write_esri_ascii( "../testes_dispersao/" + test_name + "/" + str(i) + ".asc", mg)