def test_step_integrator(integrator, stepsize_reported, stepsize_internal): ts = np.arange(interval[0], interval[1], step=stepsize_reported) print(ts) print(ts[1:]) ys = np.zeros(ts.shape[0]) ys[0] = y_true(ts[0]) # known initial value integrator = StepIntegrator(ys[0], f, step="euler", stepsize=stepsize_internal) for i, t in enumerate(ts[1:]): integrator.run_until(t) ts[i + 1] = integrator.t ys[i + 1] = integrator.y assert 85 < ys[-1] < 100 return ts, ys
def set_integrator(self, integrator, use_jac): # Integrator options -------------------------------------------------- # Here we set up the CVODE integrator from Sundials to evolve a # specific micromagnetic equation. The equations are specified in the # sundials_rhs function from any of the micromagnetic drivers in the # micromagnetic folder (LLG, LLG_STT, etc.) if integrator == "sundials" and use_jac: self.integrator = CvodeSolver(self.spin, self.sundials_rhs, self.sundials_jtimes) elif integrator == "sundials_diag": self.integrator = CvodeSolver(self.spin, self.sundials_rhs, linear_solver="diag") elif integrator == "sundials": self.integrator = CvodeSolver(self.spin, self.sundials_rhs) elif integrator == "euler" or integrator == "rk4": self.integrator = StepIntegrator(self.spin, self.step_rhs) elif integrator == "scipy": self.integrator = ScipyIntegrator(self.spin, self.step_rhs) elif integrator == "sundials_openmp" and use_jac: self.integrator = CvodeSolver_OpenMP(self.spin, self.sundials_rhs, self.sundials_jtimes) elif integrator == "sundials_diag_openmp": self.integrator = CvodeSolver_OpenMP(self.spin, self.sundials_rhs, linear_solver="diag") elif integrator == "sundials_openmp": self.integrator = CvodeSolver_OpenMP(self.spin, self.sundials_rhs) elif integrator == "euler_openmp" or integrator == "rk4_openmp": self.integrator = CvodeSolver_OpenMP(self.spin, self.step_rhs, integrator) else: raise NotImplemented("integrator must be sundials, euler or rk4")
def __init__(self, mesh, name='unnamed', integrator='sundials'): """Simulation object. *Arguments* name : the Simulation name (used for writing data files, for examples) """ self.t = 0 self.name = name self.mesh = mesh self.n = mesh.n self.n_nonzero = mesh.n self.unit_length = mesh.unit_length self._alpha = np.zeros(self.n, dtype=np.float) self._Ms = np.zeros(self.n, dtype=np.float) self._Ms_inv = np.zeros(self.n, dtype=np.float) self.spin = np.ones(3 * self.n, dtype=np.float) self.spin_last = np.ones(3 * self.n, dtype=np.float) self._pins = np.zeros(self.n, dtype=np.int32) self.field = np.zeros(3 * self.n, dtype=np.float) self.dm_dt = np.zeros(3 * self.n, dtype=np.float) self._skx_number = np.zeros(self.n, dtype=np.float) self.interactions = [] self.pin_fun = None self.integrator_tolerances_set = False self.step = 0 if integrator == "sundials": self.integrator = SundialsIntegrator(self.spin, self.sundials_rhs) elif integrator == "euler" or integrator == "rk4": self.integrator = StepIntegrator(self.spin, self.step_rhs, integrator) else: raise NotImplemented("integrator must be sundials, euler or rk4") self.saver = DataSaver(self, name + '.txt') self.saver.entities['E_total'] = { 'unit': '<J>', 'get': lambda sim: sim.compute_energy(), 'header': 'E_total'} self.saver.entities['m_error'] = { 'unit': '<>', 'get': lambda sim: sim.compute_spin_error(), 'header': 'm_error'} self.saver.entities['skx_num'] = { 'unit': '<>', 'get': lambda sim: sim.skyrmion_number(), 'header': 'skx_num'} self.saver.entities['rhs_evals'] = { 'unit': '<>', 'get': lambda sim: self.integrator.rhs_evals, 'header': 'rhs_evals'} self.saver.entities['real_time'] = { 'unit': '<s>', 'get': lambda _: time.time(), # seconds since epoch 'header': 'real_time'} self.saver.update_entity_order() # This is for old C files codes using the xperiodic variables self.xperiodic, self.yperiodic, self.zperiodic = mesh.periodicity self.vtk = SaveVTK(self.mesh, name=name) self.set_default_options()