def timestep(self,dt): #performs one timestep, i.e. calculates a new surface elev, thickness from prev one D = np.zeros(self.num_nodes) slopes = tools.calculate_slopes(self.surface_elev, self.dx) for i in range(0,self.num_nodes): if(i<20): D[i] = (((-2*self.glenns_a*(self.p*self.g)**self.glenns_n)/(self.glenns_n+2))*(self.ice_thickness[i]**(self.glenns_n+2))*(abs((slopes[i])**(self.glenns_n-1))))-(self.bslip_1*self.p*self.g*(self.ice_thickness[i]**2)) elif(i<40): D[i] = (((-2*self.glenns_a*(self.p*self.g)**self.glenns_n)/(self.glenns_n+2))*(self.ice_thickness[i]**(self.glenns_n+2))*(abs((slopes[i])**(self.glenns_n-1))))-(self.bslip_2*self.p*self.g*(self.ice_thickness[i]**2)) else: D[i] = (((-2*self.glenns_a*(self.p*self.g)**self.glenns_n)/(self.glenns_n+2))*(self.ice_thickness[i]**(self.glenns_n+2))*(abs((slopes[i])**(self.glenns_n-1))))-(self.bslip_3*self.p*self.g*(self.ice_thickness[i]**2)) A = sparse.lil_matrix((self.num_nodes,self.num_nodes)) A[0, 0] = 1 A[self.num_nodes-1, self.num_nodes-1] = 1 B = np.zeros(self.num_nodes) B[0] = self.bed_elev[0] B[self.num_nodes-1] = self.bed_elev[self.num_nodes-1] for i in range(1, self.num_nodes-1): alpha = (dt/(4.0*self.dx**2))*(D[i] + D[i+1]) beta = (dt/(4.0*self.dx**2))*(D[i-1] + D[i]) A[i, i-1] = beta A[i, i] = 1 - alpha - beta A[i, i+1] = alpha B[i] = (-alpha*self.surface_elev[i+1]) + ((1 + alpha + beta)*self.surface_elev[i]) - (beta*self.surface_elev[i-1]) + (self.mass_balance[i]*dt) self.surface_elev, info=linalg.bicgstab(A, B) for i in range(self.num_nodes): if(self.surface_elev[i] < self.bed_elev[i]): self.surface_elev[i] = self.bed_elev[i] self.ice_thickness = self.surface_elev - self.bed_elev self.time += dt
def calculate_basal_velocity(self): #this calculates the basal sliding portion of velocity to see if it's reasonable slopes = tools.calculate_slopes(self.surface_elev, self.dx) basal_velocity = np.zeros(self.num_nodes) for i in range(self.num_nodes): basal_velocity[i] = -(self.bslip[i]*self.p*-self.g*self.ice_thickness[i]*slopes[i]) #g should be negative??) print 'basal velocity at node ', i, 'is: ', basal_velocity[i] return basal_velocity
def calculate_velocity(self): #calculates and prints out the current SURFACE velocity at each node slopes = tools.calculate_slopes(self.surface_elev, self.dx) velocity = np.zeros(self.num_nodes) for i in range(self.num_nodes): velocity[i] = ((-(2*self.glenns_a*(self.p*-self.g)**self.glenns_n)/(self.glenns_n+1))*(self.ice_thickness[i]**(self.glenns_n+1))*(abs((slopes[i])**(self.glenns_n-1))))*(slopes[i])-(self.bslip[i]*self.p*-self.g*self.ice_thickness[i]*slopes[i]) print 'velocity at node ', i, 'is: ', velocity[i] return velocity
def calculate_velocity(self): #calculates and prints out the current velocity at each node slopes = tools.calculate_slopes(self.surface_elev, self.dx) velocity = np.zeros(self.num_nodes) for i in range(self.num_nodes): velocity[i] = ((-(2*self.glenns_a*(self.p*-9.81)**self.glenns_n)/(self.glenns_n+1))*(self.ice_thickness[i]**(self.glenns_n+1))*(abs((slopes[i])**(self.glenns_n-1))))*(slopes[i])-(self.slide_parameter*self.p*-9.81*self.ice_thickness[i]*slopes[i]) print('velocity at node ', i, 'is: ', velocity[i])