Beispiel #1
0
    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)
Beispiel #2
0
    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"')
Beispiel #3
0
 def __init__(self, spins, rhs):
     self.cvode = cvode.CvodeSolver(spins, rhs)
     self.set_tols()
Beispiel #4
0
    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)
Beispiel #5
0
    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
Beispiel #6
0
    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()