solver.setPotentialByName('LennardJones', 0.1) #epsilon/kT = 0.1 is default in SASfit print "Energy scale of Lennard Jones Potential in kT units:", solver.getEpsilonInkTUnits() #Initialize HMSA with some (random) start alpha solver.doHMSAclosure(1.0) else: #Yukawa possible with RY: With negative K (attractive besides HS) convergence may be reached for exp shift only (real HS-Yukawa) #positive (repulsive as HS) K converges for fully shifted potential (1/r included) solver.setPotentialByName('Yukawa', 1.0, -1.0, True) #lamda in SASfit is different; K = 0.1 is default in SASfit print "Energy scale of Yukawa HS Potential in kT units:", solver.getInteractionStrengthInKTunits() print "Length scale of Yukawa HS Potential in sigma units:", solver.getShieldingConstantInSigmaUnits() #Initialize RY with some (random) start alpha solver.doRYclosure(1.0) solver.setVolumeDensity(0.3) print "Volume density of liquid:", solver.getVolumeDensity() print "start solving for optimal closure alpha...." #Should we minimize cost functional or find a root? doUseMinimizer = False doSearchIndependentPlot = False #Save iterated points in alpha space as dict to plot later finderFunctionGraph = {} if doUseMinimizer: #Ein Minimum macht noch keine Nullstelle, minimierungs algorithmen #kommen aber (auch) mit doppelten (mehrfachen) Nullstellen klar. *Falls* eine Nullstelle vorliegt, #ist sie in jedem Fall auch ein Minimum der quadrierten funktion (bei mehreren Nullstellen kein globales Minimum) alpha_opt = optimize.minimize(finderFunctionForAlpha, alpha_initial, args=(solver, finderFunctionGraph, doUseMinimizer,))
startDensity = 0.58 targetDensity = 0.63 totalDeltaDensity = targetDensity - startDensity density = startDensity deltaDensity = totalDeltaDensity decayFactor = 2.5 deltaDensity = 0.01 print "start approaching target density", targetDensity while density < targetDensity: #deltaDensity /= decayFactor density += deltaDensity print "current density", density solver.setVolumeDensity(density) solver.solve() g = solver.getRDF() solver.setStartValue(g) #Direct calculation print "Directly calculating RDF for target density", targetDensity solver.setStartValue(np.zeros(solver.getNumberOfRadialSamplingPoints()) ) solver.setVolumeDensity(targetDensity) solver.solve() g_direct = solver.getRDF() #Plot results r = np.arange(solver.getNumberOfRadialSamplingPoints() ).astype('float') + 1.0 r *= solver.getDelta_r()/solver.getHardSphereRadius()
#s.setPotentialByName('LennardJones', 0.2) s.setPotentialByName('Star', 20) #Define the density range to scan densityRange = np.arange(0.3, 0.4, 0.1) #densityRange = np.asarray([0.3]) #densityRange = np.asarray([0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5]) densityRDFdictionary = {} #Start loop over densities and measure wall clock time t_start = time.time() for d in densityRange: s.setVolumeDensity(float(d)) s.solve() g = s.getRDF() densityRDFdictionary[d] = g t_stop = time.time() #Print out benchmark print "time used for", densityRange.size, "density parameters:", t_stop - t_start, " sec" print "time used for one OZ run:", (t_stop - t_start)/float(densityRange.size), "seconds" #Plot results r = np.arange(s.getNumberOfRadialSamplingPoints() ).astype('float') + 1.0 r *= s.getDelta_r()/s.getHardSphereRadius() for densityKey in densityRDFdictionary:
''' import numpy as np from scipyAndersonOZsolver import ScipyAndersonOZsolver #plot import matplotlib.pyplot as plt import pylab as pl if __name__ == '__main__': closureRDFdictionary = {} solver = ScipyAndersonOZsolver(port=0) solver.setPotentialByName('HardSphere') solver.setVolumeDensity(0.4) #Default is PY print "PY closure.." solver.solve() closureRDFdictionary['PY'] = solver.getRDF() print "HNC closure.." solver.doHNCclosure() solver.solve() closureRDFdictionary['HNC'] = solver.getRDF() print "RY closure, alpha -> 0.." solver.doRYclosure(alpha=0.0001) #Not exactly zero... solver.solve() closureRDFdictionary['RY alpha -> 0'] = solver.getRDF()
The script calculates the OZ solution of the HS + PY system with and without the S_c(0) result. ''' import numpy as np from scipyAndersonOZsolver import ScipyAndersonOZsolver #plot import matplotlib.pyplot as plt if __name__ == '__main__': solver = ScipyAndersonOZsolver(port = 0) solver.setPotentialByName('HardSphere') volumeDensity = 0.5 solver.setVolumeDensity(volumeDensity) solver.setConvergenceCriterion(1.0e-4*solver.getConvergenceCriterion()) #PY is default, so no explicit settings are needed in this regard #so solver is in desired state. solver.solve() #Get reference structure factor Sq_default = solver.getSq() #now GCE limit version solver.doEnforceGrandCanonicalZeroQlimit() #solver is in desired state. solver.solve() #Get GCE structure factor Sq_GCE = solver.getSq() print "reference Sq(0)", Sq_default[0] print "GCE Sq(0)", Sq_GCE[0] print "Analytical Sq(0)", (1.0 - volumeDensity)**4/(1.0 + 2.0*volumeDensity)**2
So far for the naming) The script calculates the OZ solution of the HS + PY system with and without the S_c(0) result. ''' import numpy as np from scipyAndersonOZsolver import ScipyAndersonOZsolver #plot import matplotlib.pyplot as plt if __name__ == '__main__': solver = ScipyAndersonOZsolver(port=0) solver.setPotentialByName('HardSphere') volumeDensity = 0.5 solver.setVolumeDensity(volumeDensity) solver.setConvergenceCriterion(1.0e-4 * solver.getConvergenceCriterion()) #PY is default, so no explicit settings are needed in this regard #so solver is in desired state. solver.solve() #Get reference structure factor Sq_default = solver.getSq() #now GCE limit version solver.doEnforceGrandCanonicalZeroQlimit() #solver is in desired state. solver.solve() #Get GCE structure factor Sq_GCE = solver.getSq() print "reference Sq(0)", Sq_default[0] print "GCE Sq(0)", Sq_GCE[0] print "Analytical Sq(0)", (1.0 - volumeDensity)**4 / (