예제 #1
0
    def calc_Cv(self, NDOF):
        nebins = self.nebins
        visits1d = self.visits2d.sum(2)
        logn_E = np.zeros(nebins)
        for i in range(nebins):
            logn_E[i] = wham_utils.logSum(self.logn_Eq[i,:])

        return wham_utils.calc_Cv(logn_E, visits1d, self.binenergy, \
                                  NDOF, self.Tlist, self.k_B)
예제 #2
0
    def calc_Cv(self, NDOF):
        nebins = self.nebins
        visits1d = self.visits2d.sum(2)
        logn_E = np.zeros(nebins)
        for i in range(nebins):
            logn_E[i] = wham_utils.logSum(self.logn_Eq[i,:])

        return wham_utils.calc_Cv(logn_E, visits1d, self.binenergy, \
                                  NDOF, self.Tlist, self.k_B)
예제 #3
0
    def calc_Fq(self, TRANGE = []):
        self.allzero2dind = np.where(self.visits2d.sum(0) == 0)

  
        #put some variables in this namespace
        nebins=self.nebins
        nqbins=self.nqbins
        binenergy=self.binenergy
        visits2d=self.visits2d
        logn_Eq=self.logn_Eq
    
        if len(TRANGE) == 0:
            NTEMP = 5 # number of temperatures to calculate expectation values
            TMAX = self.Tlist[-1]
            TMIN = self.Tlist[0]
            TINT=(TMAX-TMIN)/(NTEMP-1)
            TRANGE = [ TMIN + i*TINT for i in range(NTEMP) ]
    
        #find the occupied bin with the minimum energy
        EREF=0
        for i in range(nebins):
            if visits2d[:,i,:].sum() > 0:
                EREF = binenergy[i]
                break
    
        self.nodataq = np.where((visits2d.sum(0).sum(0)) == 0)
    
        #now calculate P(q,T)
        # P(q,T) = sum_E n(E,q)*exp(-E/T)  
        #TRANGE=range(1,9)
        self.F_q = np.zeros([nqbins,len(TRANGE)])
        F_q = self.F_q
        logP_Eq = np.zeros([nebins,nqbins])
        logP_q = np.zeros(nqbins)
        for n in range(len(TRANGE)):
            T=TRANGE[n]
            for i in range(nebins):
                logP_Eq[i,:] = logn_Eq[i,:]-(binenergy[i] - EREF)/(self.k_B*T)
      
            logP_Eq[self.allzero2dind[0], self.allzero2dind[1]] = self.LOGMIN
            expoffset = np.nanmax(logP_Eq)
            #print "T expoffset ", T, expoffset
            logP_Eq -= expoffset
            #P_q = np.exp(logP_Eq).sum(0)
            # sum over the energy
            for j in range(nqbins):
                logP_q[j] = logSum( logP_Eq[:,j] )
            logP_q[self.nodataq] = np.NaN
            F_q[:,n] = -self.k_B*T*logP_q[:]
            fmin = np.nanmin(F_q[:,n])
            F_q[:,n] -= fmin
    
        return TRANGE,F_q
예제 #4
0
    def calc_Fq(self, TRANGE = []):
        self.allzero2dind = np.where(self.visits2d.sum(0) == 0)

  
        #put some variables in this namespace
        nebins=self.nebins
        nqbins=self.nqbins
        binenergy=self.binenergy
        visits2d=self.visits2d
        logn_Eq=self.logn_Eq
    
        if len(TRANGE) == 0:
            NTEMP = 5 # number of temperatures to calculate expectation values
            TMAX = self.Tlist[-1]
            TMIN = self.Tlist[0]
            TINT=(TMAX-TMIN)/(NTEMP-1)
            TRANGE = [ TMIN + i*TINT for i in range(NTEMP) ]
    
        #find the occupied bin with the minimum energy
        EREF=0
        for i in range(nebins):
            if visits2d[:,i,:].sum() > 0:
                EREF = binenergy[i]
                break
    
        self.nodataq = np.where((visits2d.sum(0).sum(0)) == 0)
    
        #now calculate P(q,T)
        # P(q,T) = sum_E n(E,q)*exp(-E/T)  
        #TRANGE=range(1,9)
        self.F_q = np.zeros([nqbins,len(TRANGE)])
        F_q = self.F_q
        logP_Eq = np.zeros([nebins,nqbins])
        logP_q = np.zeros(nqbins)
        for n in range(len(TRANGE)):
            T=TRANGE[n]
            for i in range(nebins):
                logP_Eq[i,:] = logn_Eq[i,:]-(binenergy[i] - EREF)/(self.k_B*T)
      
            logP_Eq[self.allzero2dind[0], self.allzero2dind[1]] = self.LOGMIN
            expoffset = np.nanmax(logP_Eq)
            #print "T expoffset ", T, expoffset
            logP_Eq -= expoffset
            #P_q = np.exp(logP_Eq).sum(0)
            # sum over the energy
            for j in range(nqbins):
                logP_q[j] = logSum( logP_Eq[:,j] )
            logP_q[self.nodataq] = np.NaN
            F_q[:,n] = -self.k_B*T*logP_q[:]
            fmin = np.nanmin(F_q[:,n])
            F_q[:,n] -= fmin
    
        return TRANGE,F_q
예제 #5
0
 def calc_qavg(self, TRANGE = []):
     """calculate the average q as a function of temperature"""
     #put some variables in this namespace
     nebins=self.nebins
     nqbins=self.nqbins
     binenergy=self.binenergy
     binq=self.binq
     visits2d=self.visits2d
     logn_Eq=self.logn_Eq
 
     if len(TRANGE) == 0:
         NTEMP = 100 # number of temperatures to calculate expectation values
         TMAX = self.Tlist[-1]
         TMIN = self.Tlist[0]
         TINT=(TMAX-TMIN)/(NTEMP-1)
         TRANGE = [ TMIN + i*TINT for i in range(NTEMP) ]
 
     #find the ocupied bin with the minimum energy
     EREF=0
     for i in range(nebins):
         if visits2d[:,i,:].sum() > 0:
             EREF = binenergy[i]
             break
 
     #don't need to recalculate it
     #self.nodataq = where((visits2d.sum(2).sum(0)) == 0)
 
     #calculate the mean q at each temperature
     self.qavg = np.zeros(len(TRANGE))
 
     #now calculate P(q,T)
     # P(q,T) = sum_E n(E,q)*exp(-E/T)  
     #TRANGE=range(1,9)
     logP_Eq = np.zeros([nebins,nqbins])
     logP_q = np.zeros(nqbins)
     for n in range(len(TRANGE)):
         T=TRANGE[n]
         for i in range(nebins):
             logP_Eq[i,:] = logn_Eq[i,:]-(binenergy[i] - EREF)/(self.k_B*T)
   
         logP_Eq[self.allzero2dind[0], self.allzero2dind[1]] = self.LOGMIN
         expoffset = logP_Eq.max()
         #print "T expoffset ", T, expoffset
         logP_Eq -= expoffset
         #P_q = np.exp(logP_Eq).sum(0)
         # sum over the energy
         for j in range(nqbins):
             logP_q[j] = wham_utils.logSum( logP_Eq[:,j] )
         logP_q[self.nodataq] = np.NaN
   
         #find mean q
         qmin = min(binq)
         qmin -= 0.1
         lqavg = -1.0e30
         lnorm = -1.0e30
         for i in range(0,nqbins): 
             if not np.isnan(logP_q[i]):
                 lnorm = wham_utils.logSum1( lnorm, logP_q[i] ) 
                 lqavg = wham_utils.logSum1( lqavg, logP_q[i] + log(binq[i] - qmin) )
         self.qavg[n] = exp(lqavg - lnorm) + qmin
         #print lqavg
 
     return TRANGE,self.qavg
예제 #6
0
 def calc_qavg(self, TRANGE = []):
     """calculate the average q as a function of temperature"""
     #put some variables in this namespace
     nebins=self.nebins
     nqbins=self.nqbins
     binenergy=self.binenergy
     binq=self.binq
     visits2d=self.visits2d
     logn_Eq=self.logn_Eq
 
     if len(TRANGE) == 0:
         NTEMP = 100 # number of temperatures to calculate expectation values
         TMAX = self.Tlist[-1]
         TMIN = self.Tlist[0]
         TINT=(TMAX-TMIN)/(NTEMP-1)
         TRANGE = [ TMIN + i*TINT for i in range(NTEMP) ]
 
     #find the ocupied bin with the minimum energy
     EREF=0
     for i in range(nebins):
         if visits2d[:,i,:].sum() > 0:
             EREF = binenergy[i]
             break
 
     #don't need to recalculate it
     #self.nodataq = where((visits2d.sum(2).sum(0)) == 0)
 
     #calculate the mean q at each temperature
     self.qavg = np.zeros(len(TRANGE))
 
     #now calculate P(q,T)
     # P(q,T) = sum_E n(E,q)*exp(-E/T)  
     #TRANGE=range(1,9)
     logP_Eq = np.zeros([nebins,nqbins])
     logP_q = np.zeros(nqbins)
     for n in range(len(TRANGE)):
         T=TRANGE[n]
         for i in range(nebins):
             logP_Eq[i,:] = logn_Eq[i,:]-(binenergy[i] - EREF)/(self.k_B*T)
   
         logP_Eq[self.allzero2dind[0], self.allzero2dind[1]] = self.LOGMIN
         expoffset = logP_Eq.max()
         #print "T expoffset ", T, expoffset
         logP_Eq -= expoffset
         #P_q = np.exp(logP_Eq).sum(0)
         # sum over the energy
         for j in range(nqbins):
             logP_q[j] = wham_utils.logSum( logP_Eq[:,j] )
         logP_q[self.nodataq] = np.NaN
   
         #find mean q
         qmin = min(binq)
         qmin -= 0.1
         lqavg = -1.0e30
         lnorm = -1.0e30
         for i in range(0,nqbins): 
             if not np.isnan(logP_q[i]):
                 lnorm = wham_utils.logSum1( lnorm, logP_q[i] ) 
                 lqavg = wham_utils.logSum1( lqavg, logP_q[i] + log(binq[i] - qmin) )
         self.qavg[n] = exp(lqavg - lnorm) + qmin
         #print lqavg
 
     return TRANGE,self.qavg