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