anneal_func(t, parameters["tau"], parameters["tau_ramp"], parameters["t_ramp"])) # Compute energy # u_.assign(u_1) Eout_0 = df.assemble(geo_map.form(E_0)) Eout_2 = df.assemble(geo_map.form(E_2)) E_before = Eout_0 + Eout_2 converged = False while not converged: try: solver.solve() converged = True except: info_blue("Did not converge. Chopping timestep.") dt.chop() info_blue("New timestep is: dt = {}".format(dt.get())) if converged: Eout_0 = df.assemble(geo_map.form(E_0)) Eout_2 = df.assemble(geo_map.form(E_2)) E_after = Eout_0 + Eout_2 dE = E_after - E_before if not initial_step and dE > 1e-1 and False: info_blue( "Converged, but energy increased. Chopping timestep.") info_blue("E_before = {}".format(E_before)) info_blue("E_after = {}".format(E_after)) info_blue("dE = {}".format(dE)) info_blue("dt = {}".format(dt.get()))
t+dt.get(), parameters["tau"], parameters["tau_ramp"], parameters["t_ramp"])) # Compute energy u_.assign(u_1) Eout_0 = df.assemble(geo_map.form(E_0)) Eout_2 = df.assemble(geo_map.form(E_2)) E_before = Eout_0 + Eout_2 try: solver.solve() converged = True except: info_blue("Did not converge. Chopping timestep.") dt.chop() info_blue("New timestep is: dt = {}".format(dt.get())) Eout_0 = df.assemble(geo_map.form(E_0)) Eout_2 = df.assemble(geo_map.form(E_2)) E_after = Eout_0 + Eout_2 dE = E_after - E_before if not initial_step and dE > 0.0: dt.chop() converged = False initial_step = False # Update time with final dt value t += dt.get()
u_1.vector()[:] += np.random.normal( 0, initial_noise/(1+0.02*t), len(u_1.vector().get_local())) # Annealing noise solver.solve() if tstep % 1 == 0: # ts.dump(tstep) ts.dump(t) E_0 = (2*nu_**2 - 2 * geo_map.gab[i, j]*psi_.dx(i)*psi_.dx(j) + w(psi_, tau)) E_nonK = df.assemble(geo_map.form(E_0)) E_K = df.assemble(geo_map.form((h**2/12)*( 2*(4*nuhat_**2 + 4*H*nuhat_*nu_ - 5*K*nu_**2) - 2 * (2*H*nuhat_ - 2*K*gab[i, j]*psi_.dx(i)*psi_.dx(j)) + (tau/2)*K*psi_**2 + (1/4)*K*psi_**4))) # Double checked for correctness E_tot = E_nonK+E_K grad_mu = ts.get_function("abs_grad_mu") grad_mu_max = mpi_max(grad_mu.vector().get_local()) # Assigning timestep size according to grad_mu_max: dt.assign(max(0.01, 0.5/grad_mu_max)) info_blue("t = {}".format(t)) info_blue("dt = {}".format(float(dt.values()))) info_blue("noise = {}".format(initial_noise)) ts.dump_stats(t, [grad_mu_max, float( dt.values()), float(h.values()), E_nonK, E_K, E_tot], "data") if tstep % parameters["checkpoint_intv"] == 0 or t >= T: save_checkpoint(tstep, t, geo_map.ref_mesh, u_, u_1, ts.folder, parameters)