def initialise_integrator(self, rtol=1e-6, atol=1e-6): self.t = 0 self.iterations = 0 self.ode_count = 1 if not self.openmp: self.integrator = cvode.CvodeSolver(self.band, self.Sundials_RHS) self.integrator.set_options(rtol, atol) else: self.integrator = cvode.CvodeSolver_OpenMP(self.band, self.Sundials_RHS) self.integrator.set_options(rtol, atol)
def initialise_integrator(self, integrator='sundials', rtol=1e-6, atol=1e-6): self.t = 0 self.iterations = 0 self.ode_count = 1 if integrator == 'sundials': if not self.openmp: self.integrator = cvode.CvodeSolver(self.band, self.Sundials_RHS) self.integrator.set_options(rtol, atol) else: self.integrator = cvode.CvodeSolver_OpenMP( self.band, self.Sundials_RHS) self.integrator.set_options(rtol, atol) # elif integrator == 'scipy': # self.integrator = ScipyIntegrator(self.band, self.step_RHS) # self.integrator.set_options() elif integrator == 'rk4' or integrator == 'euler': self.integrator = StepIntegrator(self.band, self.step_RHS, step=self.integrator, stepsize=1e-3) self.integrator.set_options() self._llg_evolve = True elif integrator == 'verlet': self.integrator = VerletIntegrator( self.band, # y self.G, # forces self.step_RHS, self.n_images, self.n_dofs_image, mass=1, stepsize=1e-4) self.integrator.set_options() # In Verlet algorithm we only use the total force G and not YxYxG: self._llg_evolve = False else: raise Exception('No valid integrator specified. Available: ' '"sundials", "scipy"')
def __init__(self, spins, rhs): self.cvode = cvode.CvodeSolver(spins, rhs) self.set_tols()
def create_integrator(self, rtol=1e-6, atol=1e-6, nsteps=10000): self.integrator = cvode.CvodeSolver(self.coords, self.sundials_rhs) self.integrator.set_options(rtol, atol)
def __init__(self, mesh, name='unnamed', use_jac=False): """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._mu_s = np.zeros(self.n, dtype=np.float) self._mu_s_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.step = 0 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.update_entity_order() # This is only for old C files using the xperiodic variable self.xperiodic, self.yperiodic = mesh.periodicity[0], mesh.periodicity[ 1] self.vtk = SaveVTK(self.mesh, name=name) if use_jac is not True: self.vode = cvode.CvodeSolver(self.spin, self.sundials_rhs) else: self.vode = cvode.CvodeSolver(self.spin, self.sundials_rhs, self.sundials_jtn) self.set_default_options() self.set_tols() # When initialising the integrator in the self.vode call, the CVOde # class calls the set_initial_value function (with flag_m=0), which # initialises a new integrator and allocates memory in this process. # Now, when we set the magnetisation, we will use the same memory # setting this flag_m to 1, so instead of calling CVodeInit we call # CVodeReInit. If don't, memory is allocated in every call of set_m self.flag_m = 1
def __init__(self, mesh, name='unnamed', use_jac=False): """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._mu_s = np.zeros(self.n, dtype=np.float) self._mu_s_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.step = 0 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.update_entity_order() # This is only for old C files using the xperiodic variable self.xperiodic, self.yperiodic = mesh.periodicity[0], mesh.periodicity[ 1] self.vtk = SaveVTK(self.mesh, name=name) if use_jac is not True: self.vode = cvode.CvodeSolver(self.spin, self.sundials_rhs) else: self.vode = cvode.CvodeSolver(self.spin, self.sundials_rhs, self.sundials_jtn) self.set_default_options() self.set_tols()