예제 #1
0
    def step(self, step=None):
        """ Does one simulation time step.

            Attributes:
            qtime : The time taken in updating the real positions.
            tr    : current trust radius
        """

        self.qtime = -time.time()
        info("\nMD STEP %d" % step, verbosity.debug)

        if step == 0:
            info(" @GEOP: Initializing BFGSTRM", verbosity.debug)
        self.old_x[:] = self.beads.q
        self.old_u[:] = self.forces.pot
        self.old_f[:] = self.forces.f

        if len(self.fixatoms) > 0:
            for dqb in self.old_f:
                dqb[self.fixatoms * 3] = 0.0
                dqb[self.fixatoms * 3 + 1] = 0.0
                dqb[self.fixatoms * 3 + 2] = 0.0

            # Reduce dimensionality
            masked_old_x = self.old_x[:, self.gm.fixatoms_mask]
            masked_hessian = self.hessian[np.ix_(self.gm.fixatoms_mask,
                                                 self.gm.fixatoms_mask)]

            # Do one iteration of BFGSTRM.
            # The Hessian is updated inside. Everything is passed inside BFGSTRM() in masked form, including the Hessian
            BFGSTRM(masked_old_x, self.old_u,
                    self.old_f[:, self.gm.fixatoms_mask], masked_hessian,
                    self.tr, self.gm, self.big_step)

            # Restore dimensionality of the hessian
            self.hessian[np.ix_(self.gm.fixatoms_mask,
                                self.gm.fixatoms_mask)] = masked_hessian
        else:
            # Make one step. ( A step is finished when a movement is accepted)
            BFGSTRM(self.old_x, self.old_u, self.old_f, self.hessian, self.tr,
                    self.gm, self.big_step)

        info("   Number of force calls: %d" % (self.gm.fcount))
        self.gm.fcount = 0
        # Update positions and forces
        self.beads.q = self.gm.dbeads.q
        self.forces.transfer_forces(
            self.gm.dforces)  # This forces the update of the forces

        # Exit simulation step
        d_x_max = np.amax(np.absolute(np.subtract(self.beads.q, self.old_x)))
        self.exitstep(self.forces.pot, self.old_u, d_x_max)
예제 #2
0
    def step(self, step=None):
        """ Does one simulation time step.

            Attributes:
            qtime : The time taken in updating the real positions.
            tr    : current trust radius
        """

        self.qtime = -time.time()
        info("\nMD STEP %d" % step, verbosity.debug)

        if step == 0:
            info(" @GEOP: Initializing BFGSTRM", verbosity.debug)
        self.old_x[:] = self.beads.q
        self.old_u[:] = self.forces.pot
        self.old_f[:] = self.forces.f

        if len(self.fixatoms) > 0:
            for dqb in self.old_f:
                dqb[self.fixatoms * 3] = 0.0
                dqb[self.fixatoms * 3 + 1] = 0.0
                dqb[self.fixatoms * 3 + 2] = 0.0

        # Make one step. ( A step is finished when a movement is accepted)
        BFGSTRM(self.old_x, self.old_u, self.old_f, self.hessian, self.tr,
                self.gm, self.big_step)

        info("   Number of force calls: %d" % (self.gm.fcount))
        self.gm.fcount = 0
        # Update positions and forces
        self.beads.q = self.gm.dbeads.q
        self.forces.transfer_forces(
            self.gm.dforces)  # This forces the update of the forces

        # Exit simulation step
        d_x_max = np.amax(np.absolute(np.subtract(self.beads.q, self.old_x)))
        self.exitstep(self.forces.pot, self.old_u, d_x_max)