Exemple #1
0
   def randomVelocity(self, T):
      """
      Assign random velocities.

      @type T: float
      @param T: Kelvin temperature.
      """
      TopologyUtilities.randomVelocity(T, self.myTop, self.velvec, self.seed)
Exemple #2
0
def executePropagator(prop, phys, forces, io, numsteps):
    """
      Run and finish the propagator.
      
      @type prop: Propagator
      @param prop: MDL Propagator object
      
      @type phys: Physical
      @param phys: The physical system.
      
      @type forces: Forces
      @param forces: MDL Forces object

      @type io: IO
      @param io: MDL IO object
      
      @type numsteps: int
      @param numsteps: Number of steps to run
      """
    # RUN
    if (prop.myStep == 0 and prop.myLevel == 0):
        io.run(phys, forces, prop.myStep, prop.myTimestep, prop.myPropagator)
    if (prop.isMDL(prop.myPropagator)):
        prop.runModifiers(prop.myPropagator.prerunmodifiers, phys, forces,
                          prop, prop.myPropagator)
    ii = 0

    #prop.myPropagator.run(numsteps)
    #return
    while (ii < numsteps):
        nextstop = int(
            numpy.minimum(numsteps, io.computeNext(ii, phys.remcom,
                                                   phys.remang)))

        if (prop.isMDL(prop.myPropagator)):
            while (ii < nextstop):
                prop.myPropagator.run(phys, forces, prop)
                ii += 1
            phys.myTop.time = prop.myStep * prop.myPropagator.getTimestep(
            ) * Constants.invTimeFactor()
            phys.updateCOM_Momenta()
        else:
            prop.myPropagator.run(nextstop - ii)
            ii = nextstop

        if (prop.myLevel == 0):
            prop.myStep = nextstop
            phys.myTop.time = prop.myStep * prop.myPropagator.getTimestep()
            io.run(phys, forces, prop.myStep, prop.myTimestep,
                   prop.myPropagator)
        if (phys.remcom > 0 and ii % phys.remcom == 0):
            TopologyUtilities.remLin(phys.velvec, phys.myTop)
        if (phys.remang > 0 and ii % phys.remang >= 0):
            TopologyUtilities.remAng(phys.posvec, phys.velvec, phys.myTop)
    if (prop.isMDL(prop.myPropagator)):
        prop.runModifiers(prop.myPropagator.postrunmodifiers, phys, forces,
                          prop, prop.myPropagator)
        prop.myPropagator.finish(phys, forces, prop)
def executePropagator(prop, phys, forces, io, numsteps):
    """
      Run and finish the propagator.
      
      @type prop: Propagator
      @param prop: MDL Propagator object
      
      @type phys: Physical
      @param phys: The physical system.
      
      @type forces: Forces
      @param forces: MDL Forces object
      
      @type numsteps: int
      @param numsteps: Number of steps to run
      """
    # RUN

    if (prop.myStep == 0 and prop.myLevel == 0):
        io.run(phys, forces, prop.myStep, prop.myTimestep, prop.myPropagator)
    if (prop.isMDL(prop.myPropagator)):
        prop.runModifiers(prop.myPropagator.prerunmodifiers, phys, forces,
                          prop, prop.myPropagator)
    ii = 0

    while (ii < numsteps):
        if (io.pmvMODE == 0):  # STOP CODE
            return
        elif (io.pmvMODE != 2):  # RUN CODE
            if (prop.isMDL(prop.myPropagator)):
                prop.myPropagator.run(phys, forces, prop)
                phys.myTop.time = prop.myStep * prop.myPropagator.getTimestep(
                ) * Constants.invTimeFactor()
                phys.updateCOM_Momenta()
            else:
                prop.myPropagator.run(1)
            if (io.doPmv):
                io.pmvPlot()
            ii = ii + 1
            if (prop.myLevel == 0):
                prop.myStep += 1
                phys.myTop.time = prop.myStep * prop.myPropagator.getTimestep()
                io.run(phys, forces, prop.myStep, prop.myTimestep,
                       prop.myPropagator)
            if (phys.remcom >= 0):
                TopologyUtilities.removeLinearMomentum(phys.velvec,
                                                       phys.myTop).disown()
            if (phys.remang >= 0):
                TopologyUtilities.removeAngularMomentum(
                    phys.posvec, phys.velvec, phys.myTop).disown()
        else:  # PAUSE CODE
            io.pmvPlot()
    if (prop.isMDL(prop.myPropagator)):
        prop.runModifiers(prop.myPropagator.postrunmodifiers, phys, forces,
                          prop, prop.myPropagator)
        prop.myPropagator.finish(phys, forces, prop)
Exemple #4
0
   def pressure(self, forces):
      """
      Pressure of the system.

      @type forces: Forces
      @param forces: MDL Forces object

      @rtype: float
      @return: System pressure
      """
      TopologyUtilities.addVelocityVirial(forces.energies, self.myTop, self.velvec)
      return TopologyUtilities.velocityVirial(self.myTop, self.velvec).pressure(self.myTop.getVolume(self.posvec))
def executePropagator(prop, phys, forces, io, numsteps):
      """
      Run and finish the propagator.
      
      @type prop: Propagator
      @param prop: MDL Propagator object
      
      @type phys: Physical
      @param phys: The physical system.
      
      @type forces: Forces
      @param forces: MDL Forces object

      @type io: IO
      @param io: MDL IO object
      
      @type numsteps: int
      @param numsteps: Number of steps to run
      """
      # RUN
      if (prop.myStep == 0 and prop.myLevel == 0):
           io.run(phys, forces, prop.myStep, prop.myTimestep, prop.myPropagator)
      if (prop.isMDL(prop.myPropagator)):
           prop.runModifiers(prop.myPropagator.prerunmodifiers, phys, forces, prop, prop.myPropagator)
      ii = 0

      #prop.myPropagator.run(numsteps)
      #return
      while (ii < numsteps):
              nextstop = int(numpy.minimum(numsteps, io.computeNext(ii, phys.remcom, phys.remang)))

              if (prop.isMDL(prop.myPropagator)):
                 while (ii < nextstop):
		    prop.myPropagator.run(phys, forces, prop)
		    ii += 1
                 phys.myTop.time = prop.myStep*prop.myPropagator.getTimestep()*Constants.invTimeFactor()
                 phys.updateCOM_Momenta()
              else:
                 prop.myPropagator.run(nextstop-ii)
                 ii = nextstop
              
	      
	      if (prop.myLevel == 0):
                 prop.myStep = nextstop
		 phys.myTop.time = prop.myStep*prop.myPropagator.getTimestep()
		 io.run(phys, forces, prop.myStep, prop.myTimestep, prop.myPropagator)
	      if (phys.remcom > 0 and ii % phys.remcom == 0):
                 TopologyUtilities.remLin(phys.velvec, phys.myTop)
              if (phys.remang > 0 and ii % phys.remang >= 0):
	         TopologyUtilities.remAng(phys.posvec, phys.velvec, phys.myTop)
      if (prop.isMDL(prop.myPropagator)):
           prop.runModifiers(prop.myPropagator.postrunmodifiers, phys, forces, prop, prop.myPropagator)
           prop.myPropagator.finish(phys, forces, prop)
Exemple #6
0
def executePropagator(prop, phys, forces, io, numsteps):
      """
      Run and finish the propagator.
      
      @type prop: Propagator
      @param prop: MDL Propagator object
      
      @type phys: Physical
      @param phys: The physical system.
      
      @type forces: Forces
      @param forces: MDL Forces object
      
      @type numsteps: int
      @param numsteps: Number of steps to run
      """
      # RUN

      if (prop.myStep == 0 and prop.myLevel == 0):
           io.run(phys, forces, prop.myStep, prop.myTimestep, prop.myPropagator)
      if (prop.isMDL(prop.myPropagator)):
           prop.runModifiers(prop.myPropagator.prerunmodifiers, phys, forces, prop, prop.myPropagator)
      ii = 0

      while (ii < numsteps):
           if (io.pmvMODE == 0): # STOP CODE
               return
           elif (io.pmvMODE != 2):  # RUN CODE
              if (prop.isMDL(prop.myPropagator)):
                 prop.myPropagator.run(phys, forces, prop)
                 phys.myTop.time = prop.myStep*prop.myPropagator.getTimestep()*Constants.invTimeFactor()
		 phys.updateCOM_Momenta()		 
              else:
                 prop.myPropagator.run(1)
	      if (io.doPmv):
                 io.pmvPlot()
              ii = ii + 1
              if (prop.myLevel == 0):
                 prop.myStep += 1
		 phys.myTop.time = prop.myStep*prop.myPropagator.getTimestep()
		 io.run(phys, forces, prop.myStep, prop.myTimestep, prop.myPropagator)
	      if (phys.remcom >= 0):
                 TopologyUtilities.removeLinearMomentum(phys.velvec, phys.myTop).disown()
              if (phys.remang >= 0):
	         TopologyUtilities.removeAngularMomentum(phys.posvec, phys.velvec, phys.myTop).disown()
           else: # PAUSE CODE
              io.pmvPlot()
      if (prop.isMDL(prop.myPropagator)):
           prop.runModifiers(prop.myPropagator.postrunmodifiers, phys, forces, prop, prop.myPropagator)
           prop.myPropagator.finish(phys, forces, prop)
Exemple #7
0
   def temperature(self):
      """
      System temperature (K)

      @rtype: float
      @return: Kelvin temperature
      """
      return TopologyUtilities.temperature(self.myTop, self.velvec)
Exemple #8
0
 def kineticEnergy(self, phys):
    """
    @type phys: Physical
    @param phys: Physical system.
    
    @rtype: float
    @return: Kinetic energy, as a sum of 0.5*m*v^2 for each atom.
    """
    return TopologyUtilities.kineticEnergy(phys.myTop, phys.velvec)
Exemple #9
0
 def kineticEnergy(self, phys):
     """
   @type phys: Physical
   @param phys: Physical system.
   
   @rtype: float
   @return: Kinetic energy, as a sum of 0.5*m*v^2 for each atom.
   """
     return TopologyUtilities.kineticEnergy(phys.myTop, phys.velvec)
Exemple #10
0
   def totalEnergy(self, phys):
      """
      @type phys: Physical
      @param phys: Physical system.
      
      @rtype: float
      @return: Total energy, as a sum of potential and kinetic.
      """

      # potentialEnergy() is a member function of ScalarStructure
      return phys.app.energies.potentialEnergy()+TopologyUtilities.kineticEnergy(phys.myTop, phys.velvec)
Exemple #11
0
    def totalEnergy(self, phys):
        """
      @type phys: Physical
      @param phys: Physical system.
      
      @rtype: float
      @return: Total energy, as a sum of potential and kinetic.
      """

        # potentialEnergy() is a member function of ScalarStructure
        return phys.app.energies.potentialEnergy(
        ) + TopologyUtilities.kineticEnergy(phys.myTop, phys.velvec)
Exemple #12
0
   def plotTotal(self, phys, forces, step):
      """
      Similar, for total energy

      @type phys: Physical
      @param phys: The physical system

      @type forces: Forces
      @param forces: MDL Forces object

      @type step: int
      @param step: Simulation step number      
      """      
      self.plotQuantity(step, forces.energies.potentialEnergy(phys)+TopologyUtilities.kineticEnergy(phys.myTop, phys.velvec), 'totalenergy')
Exemple #13
0
   def plotTemperature(self, phys, forces, step):
      """
      Similar, for temperature

      @type phys: Physical
      @param phys: The physical system

      @type forces: Forces
      @param forces: MDL Forces object

      @type step: int
      @param step: Simulation step number      
      """
      self.plotQuantity(step,
                        TopologyUtilities.temperature(phys.myTop, phys.velvec), 'temperature')
Exemple #14
0
   def dihedral(self, index):
      """
      Dihedral angle (rad, -PI to PI) at passed index

      @type index: int
      @param index: Dihedral index
      
      @rtype: float
      @return: Dihedral angle in radians
      """
      myPhi = TopologyUtilities.computePhiDihedral(self.myTop, self.posvec, index-1)
      if (myPhi > numpy.pi):
         myPhi -= 2*numpy.pi
      elif (myPhi < -numpy.pi):
         myPhi += 2*numpy.pi
      return myPhi
Exemple #15
0
   def build(self):
      """
      Build the physical data.
      """
      tm = -1
      if (hasattr(self, "myTop")):
          tm = self.myTop.time
      if (self.bc == "Periodic"):
          if (self.defaultCBV):
             # TEMPORARY STRUCTURES USED TO COMPUTE
             # BOUNDING BOX
             v1 = numpy.ndarray(3)
             v2 = numpy.ndarray(3)
             v3 = numpy.ndarray(3)
             v4 = numpy.ndarray(3)
             v1.fill(sys.maxint)
             v2.fill(-sys.maxint)
             # BOUNDING BOX
             i = 0
             while (i < numpy.size(self.positions)):
                if (self.positions[i] < v1[0]):
                   v1[0] = float(self.positions[i])
                if (self.positions[i] > v2[0]):
                   v2[0] = float(self.positions[i])
                if (self.positions[i+1] < v1[1]):
                   v1[1] = float(self.positions[i+1])
                if (self.positions[i+1] > v2[1]):
                   v2[1] = float(self.positions[i+1])
                if (self.positions[i+2] < v1[2]):
                   v1[2] = float(self.positions[i+2])
                if (self.positions[i+2] > v2[2]):
                   v2[2] = float(self.positions[i+2])
                i += 3
             v4.fill(Constants.periodicBoundaryTolerance()/2.0)
             v1 = v1 - v4
             v2 = v2 + v4
             v3 = v2 - v1
             self.cB1[0] = v3[0]
             self.cB2[1] = v3[1]
             self.cB3[2] = v3[2]
             self.cO = v1 + v3 * 0.5
             self.myTop.setBC(self.cB1[0],self.cB1[1],self.cB1[2],self.cB2[0],self.cB2[1],self.cB2[2],self.cB3[0],self.cB3[1],self.cB3[2],self.cO[0],self.cO[1],self.cO[2])
      self.myTop.setExclusion(self.exclude)
      if (self.myPSF.numAtoms() > 0 and hasattr(self.myPAR, 'readFlag')):
	 GenericTopology.buildTopology(self.myTop, self.myPSF, self.myPAR, 0, self.myTop.makeSCPISM())
	 if (numpy.size(self.velocities) == 0):
            # This function actually returns a value, since it is
            # unused the runtime environment detects a memory leak.
            # disown() removes this concern.
            MathUtilities.randomNumber(self.seed)
            # NOTE TO SELF: THIS WAS COMMENTED OUT FOR PM 3
            # IT MAY EFFECT RANDOM NUMBER CONSISTENCY
            #aaa = MathUtilities.randomNumberFirst(self.seed, 1)
	    TopologyUtilities.randomVelocity(self.temperature, self.myTop, self.velvec, self.seed)
	 if (self.remcom >= 0):
	   TopologyUtilities.removeLinearMomentum(self.velvec, self.myTop).disown()
         if (self.remang >= 0):
	   TopologyUtilities.removeAngularMomentum(self.posvec, self.velvec, self.myTop).disown()
      if (self.bc == "Periodic"):
           self.myTop.setCellSize(self.cellsize)
      # COMPUTE INV MASS MATRIX
      temp = list()
      ii = 0
      while ii < self.numAtoms()*3:
          temp.append(0.0)
          ii += 1
      ii = 0
      self.invmasses.resize(self.numAtoms()*3)
      while ii < self.numAtoms()*3:
          im = 1.0 / self.myPSF.getMass(ii/3)
          self.invmasses[ii] = im
          self.invmasses[ii+1] = im
          self.invmasses[ii+2] = im
          ii += 3

      # COMPUTE MASS MATRIX
      temp = list()
      ii = 0
      while ii < self.numAtoms()*3:
          temp.append(0.0)
          ii += 1
      ii = 0
      self.masses.resize(self.numAtoms()*3)
      while ii < self.numAtoms()*3:
          m = self.myPSF.getMass(ii/3)
          temp[ii] = m
          self.masses[ii] = temp[ii]
          temp[ii] = 0.0
          temp[ii+1] = m
          self.masses[ii+1] = temp[ii+1]
          temp[ii+1] = 0.0
          temp[ii+2] = m
          self.masses[ii+2] = temp[ii+2]
          temp[ii+2] = 0.0
          ii += 3


      # COMPUTE MASS SUM
      self.masssum = 0
      ii = 0
      while ii < self.numAtoms():
         self.masssum += self.myPSF.getMass(ii)
         ii += 1

      # SET SELFICAL TIME
      if (tm != -1):
          self.myTop.time = tm

      self.dirty = 0  # clean now!
Exemple #16
0
 def updateCOM_Momenta(self):
    """
    Update center of mass and angular momentum
    """
    TopologyUtilities.buildMolecularCenterOfMass(self.posvec,self.myTop)
    TopologyUtilities.buildMolecularMomentum(self.velvec,self.myTop)