def solve(self, T = None, tol = None, nl_tol = 1e-5): def time_finish(t): if T: if t >= T: return True return False def converged(du): if tol: if du < tol: return True return False tic() delta = 1e10 while not (time_finish(self.t) or converged(delta)): # ADAPTIVE TIMESTEP if self.adapt_timestep and (self.t > 0.0 or self.adapt_initial_timestep): solve(self.a_k == self.L_k, self.k) self.timestep = self.k.vector().array()[0] # SOLVE COUPLED EQUATIONS # solve(self.F == 0, self.w[0], bcs=self.bc, solver_parameters=solver_parameters) solve(self.F == 0, self.w[0], bcs=self.bc, J=self.J, solver_parameters=solver_parameters) if tol: delta = 0.0 f_list = [[self.w[0].split()[i], self.w[1].split()[i]] for i in range(len(self.w[0].split()))] for f_0, f_1 in f_list: delta = max(errornorm(f_0, f_1, norm_type="L2", degree_rise=1)/self.timestep, delta) self.w[1].assign(self.w[0]) self.t += self.timestep # display results if self.plot: if self.t > self.plot_t: self.plotter.update_plot(self) self.plot_t += self.plot # save data if self.write: if self.t > self.write_t: sw_io.write_model_to_files(self, 'a', file=self.save_loc) self.write_t += self.write # write timestep info sw_io.print_timestep_info(self, delta) print "\n* * * Initial forward run finished: time taken = {}".format(toc()) list_timings(True) if self.plot: self.plotter.clean_up()
def solve(self, T = None, tol = None, nl_tol = 1e-5): def time_finish(t): if T: if t >= T: return True return False def converged(du): if tol: if du < tol: return True return False tic() delta = 1e10 while not (time_finish(self.t) or converged(delta)): # ADAPTIVE TIMESTEP if self.adapt_timestep and (self.t > 0.0 or self.adapt_initial_timestep): solve(self.a_k == self.L_k, self.k) self.timestep = self.k.vector().array()[0] # M = assemble(self.J) # U, s, Vh = scipy.linalg.svd(M.array()) # cond = s.max()/s.min() # print cond, s.min(), s.max() # SOLVE COUPLED EQUATIONS if self.time_discretise.im_func == runge_kutta: # store previous solution self.w[2].assign(self.w[1]) # runge kutta timestep solve(self.F == 0, self.w[0], bcs=self.bc, J=self.J, solver_parameters=solver_parameters) if self.slope_limiter: self.slope_limit() # # 2nd order # self.w[1].assign(self.w[0]) # solve(self.F_RK == 0, self.w[0], bcs=self.bc, J=self.J_RK, # solver_parameters=solver_parameters) # 3rd order self.w[1].assign(self.w[0]) solve(self.F_RK1 == 0, self.w[0], bcs=self.bc, J=self.J_RK1, solver_parameters=solver_parameters) if self.slope_limiter: self.slope_limit() self.w[1].assign(self.w[0]) solve(self.F_RK2 == 0, self.w[0], bcs=self.bc, J=self.J_RK2, solver_parameters=solver_parameters) # replace previous solution self.w[1].assign(self.w[2]) else: solve(self.F == 0, self.w[0], bcs=self.bc, J=self.J, solver_parameters=solver_parameters) if self.slope_limiter: self.slope_limit() if tol: delta = 0.0 f_list = [[self.w[0].split()[i], self.w[1].split()[i]] for i in range(len(self.w[0].split()))] for f_0, f_1 in f_list: delta = max(errornorm(f_0, f_1, norm_type="L2", degree_rise=1)/self.timestep, delta) self.w[1].assign(self.w[0]) self.t += self.timestep # display results if self.plot: if self.t > self.plot_t: self.plotter.update_plot(self) self.plot_t += self.plot # save data if self.write: if self.t > self.write_t: sw_io.write_model_to_files(self, 'a', file=self.save_loc) self.write_t += self.write # write timestep info sw_io.print_timestep_info(self, delta) print "\n* * * Initial forward run finished: time taken = {}".format(toc()) list_timings(True) if self.plot: self.plotter.clean_up() # error calc callback if self.error_callback: return self.error_callback(self)