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