sde = SedDepEroder(mg, input_file) # don't allow overwriting of these, just in case try: x_profiles except NameError: x_profiles = [] z_profiles = [] S_profiles = [] A_profiles = [] # plot init conds if make_output_plots: mg = fr.route_flow(grid=mg) pylab.figure('long_profile_anim') ylim([0, y_max]) prf.analyze_channel_network_and_plot(mg) savefig('0profile_anim_init.png') close('long_profile_anim') (profile_IDs, dists_upstr) = prf.analyze_channel_network_and_plot(mg) start_node = [profile_IDs[0]] time_on = time() #perform the loops: for i in range(nt): #print 'loop ', i mg.at_node['topographic__elevation'][mg.core_nodes] += uplift_per_step mg = fr.run_one_step() #mg.calc_grad_across_cell_faces(mg.at_node['topographic__elevation']) #neighbor_slopes = mg.calc_grad_along_node_links(mg.at_node['topographic__elevation']) #mean_slope = np.mean(np.fabs(neighbor_slopes),axis=1)
print("Short step!") dt = time_to_run - elapsed_time mg = fr.route_flow(method='D8') #print 'Area: ', numpy.max(mg.at_node['drainage_area']) #mg = fsp.erode(mg) mg, _, _ = sp.erode(mg, dt, node_drainage_areas='drainage_area', slopes_at_nodes='topographic__steepest_slope', K_if_used='K_values') #add uplift mg.at_node['topographic__elevation'][mg.core_nodes] += uplift * dt elapsed_time += dt if counter % 20 == 0: pylab.figure('profiles') profiles = prf.analyze_channel_network_and_plot(mg) counter += 1 time_off = time.time() print('Elapsed time: ', time_off - time_on) time_off = time.time() print('Elapsed time: ', time_off - time_on) #Finalize and plot elev = mg['node']['topographic__elevation'] elev_r = mg.node_vector_to_raster(elev) # Clear previous plots pylab.figure(1) pylab.close()
def run_one_step(self): """ """ # find the faulted node with the largest drainage area. largest_da = np.max(self._model.grid.at_node['drainage_area'][ self._model.boundary_handler['NormalFault'].faulted_nodes == True]) largest_da_ind = np.where( self._model.grid.at_node['drainage_area'] == largest_da)[0][0] start_node = self._model.grid.at_node['flow__receiver_node'][ largest_da_ind] (profile_IDs, dists_upstr) = analyze_channel_network_and_plot( self._model.grid, number_of_channels=1, starting_nodes=[start_node], create_plot=False) elevs = model.z[profile_IDs] self.relative_times.append(self._model.model_time / model.params['run_duration']) offset = np.min(elevs[0]) max_distance = np.max(dists_upstr[0][0]) self.channel_segments.append( np.array((dists_upstr[0][0], elevs[0] - offset)).T) self.xnormalized_segments.append( np.array((dists_upstr[0][0] / max_distance, elevs[0] - offset)).T) self.relative_times.append(self._model.model_time / model.params['run_duration']) colors = cm.viridis_r(self.relative_times) xmin = [xy.min(axis=0)[0] for xy in self.channel_segments] ymin = [xy.min(axis=0)[1] for xy in self.channel_segments] xmax = [xy.max(axis=0)[0] for xy in self.channel_segments] ymax = [xy.max(axis=0)[1] for xy in self.channel_segments] fs = (8, 6) fig, ax = plt.subplots(figsize=fs, dpi=300) ax.set_xlim(0, max(xmax)) ax.set_ylim(0, max(ymax)) line_segments = LineCollection(self.channel_segments, colors=colors, linewidth=0.5) ax.add_collection(line_segments) yr = str(self._model.model_time / (1e6)).zfill(4) plt.savefig('profile_' + yr + '.png') plt.close() fig, ax = plt.subplots(figsize=fs, dpi=300) ax.set_xlim(0, 1) ax.set_ylim(0, max(ymax)) line_segments = LineCollection(self.xnormalized_segments, colors=colors, linewidth=0.5) ax.add_collection(line_segments) yr = str(self._model.model_time / (1e6)).zfill(4) plt.savefig('normalized_profile_' + yr + '.png') plt.close() plt.figure() plot_channels_in_map_view(self._model.grid, profile_IDs) plt.savefig('topography_' + yr + '.png') plt.close() plt.figure() imshow_grid(model.grid, model.grid.at_node['soil__depth'], cmap='viridis', limits=(0, 15)) plt.savefig('soil_' + yr + '.png') plt.close() plt.figure() imshow_grid(self._model.grid, self._model.grid.at_node['sediment__flux'], cmap='viridis') plt.savefig('sediment_flux_' + yr + '.png') plt.close() U_eff = U_fast + U_back U_eff_slow = U_slow + U_back area = np.sort(self._model.grid.at_node['drainage_area'][ self._model.boundary_handler['NormalFault'].faulted_nodes == True]) area = area[area > 0] little_q = ( area * self._model.params['runoff_rate'])**self._model.params['m_sp'] #area_to_the_m = area ** self._model.params['m_sp'] detachment_prediction = ( (U_eff / (self._model.params['K_rock_sp'])) **(1.0 / self._model.params['n_sp']) * (1.0 / little_q)**(1.0 / self._model.params['n_sp'])) transport_prediction = ( ((U_eff * self._model.params['v_sc']) / (self._model.params['K_sed_sp'] * self._model.params['runoff_rate'])) + ((U_eff) / (self._model.params['K_sed_sp'])))**( 1.0 / self._model.params['n_sp']) * ( (1.0 / little_q)**(1.0 / self._model.params['n_sp'])) space_prediction = ( ((U_eff * self._model.params['v_sc']) * (1.0 - Ff) / (self._model.params['K_sed_sp'] * self._model.params['runoff_rate'])) + ((U_eff) / (self._model.params['K_rock_sp'])))**( 1.0 / self._model.params['n_sp']) * ( (1.0 / little_q)**(1.0 / self._model.params['n_sp'])) detachment_prediction_slow = ( (U_eff_slow / (self._model.params['K_rock_sp'])) **(1.0 / self._model.params['n_sp']) * (1.0 / little_q)**(1.0 / self._model.params['n_sp'])) transport_prediction_slow = ( ((U_eff_slow * self._model.params['v_sc']) / (self._model.params['K_sed_sp'] * self._model.params['runoff_rate'])) + ((U_eff_slow) / (self._model.params['K_sed_sp'])))**( 1.0 / self._model.params['n_sp']) * ( (1.0 / little_q)**(1.0 / self._model.params['n_sp'])) space_prediction_slow = ( ((U_eff_slow * self._model.params['v_sc']) * (1.0 - Ff) / (self._model.params['K_sed_sp'] * self._model.params['runoff_rate'])) + ((U_eff_slow) / (self._model.params['K_rock_sp'])))**( 1.0 / self._model.params['n_sp']) * ( (1.0 / little_q)**(1.0 / self._model.params['n_sp'])) # TODO need to fix space predictions here to include new soil thickness. fs = (8, 6) fig, ax = plt.subplots(figsize=fs, dpi=300) plt.plot(area, detachment_prediction, 'c', lw=5, label='Detachment Prediction') plt.plot(area, transport_prediction, 'b', label='Transport Prediction') plt.plot(area, space_prediction, 'm', label='Space Prediction') plt.plot(area, detachment_prediction_slow, 'c', lw=5, alpha=0.3) plt.plot(area, transport_prediction_slow, 'b', alpha=0.3) plt.plot(area, space_prediction_slow, 'm', alpha=0.3) plt.plot(self._model.grid.at_node['drainage_area'][ self._model.boundary_handler['NormalFault'].faulted_nodes == True], self._model.grid.at_node['topographic__steepest_slope'] [self._model.boundary_handler['NormalFault'].faulted_nodes == True], 'k.', label='Fault Block Nodes') plt.plot(self._model.grid.at_node['drainage_area'] [self._model.boundary_handler['NormalFault'].faulted_nodes == False], self._model.grid.at_node['topographic__steepest_slope'] [self._model.boundary_handler['NormalFault'].faulted_nodes == False], 'r.', label='Unfaulted Nodes') plt.plot(self._model.grid.at_node['drainage_area'][profile_IDs], self._model.grid.at_node['topographic__steepest_slope'] [profile_IDs], 'g.', label='Main Channel Nodes') plt.legend() ax.set_xscale('log') ax.set_yscale('log') plt.xlabel('log 10 Area') plt.ylabel('log 10 Slope') plt.savefig('slope_area_' + yr + '.png') plt.close()
model = Model(params=params, OutputWriters=ChannelPlotter) model.run(output_fields=output_fields) #%% # find the faulted node with the largest drainage area. largest_da = np.max(model.grid.at_node['drainage_area'][ model.boundary_handler['NormalFault'].faulted_nodes == True]) largest_da_ind = np.where( model.grid.at_node['drainage_area'] == largest_da)[0][0] #plt.figure() #imshow_grid(model.grid, model.grid.at_node['drainage_area'] == largest_da, cmap='viridis') #plt.show() (profile_IDs, dists_upstr) = analyze_channel_network_and_plot( model.grid, number_of_channels=1, starting_nodes=[largest_da_ind]) elevs = model.z[profile_IDs] data_frame = pd.DataFrame.from_dict( data={ 'distance': dists_upstr[0][0], 'elevation': elevs[0], 'area': model.grid.at_node['drainage_area'][profile_IDs][0], 'slope': model.grid.at_node['topographic__steepest_slope'][profile_IDs] [0] }) data_frame.to_csv('truth_profile.csv') with open(sys.argv[-1], 'w') as f: relief = model.z[model.grid.core_nodes].max() - model.z[ model.grid.core_nodes].min()
counter = 0. while elapsed_time < time_to_run: print(elapsed_time) if elapsed_time+dt>time_to_run: print("Short step!") dt = time_to_run - elapsed_time mg = fr.route_flow(method='D8') #print 'Area: ', numpy.max(mg.at_node['drainage_area']) #mg = fsp.erode(mg) mg,_,_ = sp.erode(mg, dt, node_drainage_areas='drainage_area', slopes_at_nodes='topographic__steepest_slope', K_if_used='K_values') #add uplift mg.at_node['topographic__elevation'][mg.core_nodes] += uplift*dt elapsed_time += dt if counter%20 == 0: pylab.figure('profiles') profiles = prf.analyze_channel_network_and_plot(mg) counter += 1 time_off = time.time() print('Elapsed time: ', time_off-time_on) time_off = time.time() print('Elapsed time: ', time_off-time_on) #Finalize and plot elev = mg['node']['topographic__elevation'] elev_r = mg.node_vector_to_raster(elev) # Clear previous plots pylab.figure(1) pylab.close()