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)
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)