def gettc(dbtype, db, folder, temperatures=None, tsteps=None, deltaM=None): # default magnetisation precision if deltaM == None: deltaM = 1.0E-2 # default temperatures steps if temperatures == None: temperatures = range(20, 301, 20) # default temperatures steps if tsteps == None: # default temperature increments tsteps = [20, 10, 5, 1, 0.1] # tsteps must contain at least one entry if len(tsteps) < 1: print "Error: find_tc: No temperature steps given. Break" exit(1) # sort tsteps tsteps.sort() # reverse order (decendent) tsteps.reverse() try: (tc, dT, dM) = findtc.findtc(dummyrun, extractMag, (), (), (dbtype, db, folder), temperatures, tsteps, deltaM) except xmagfile, x: print x.name, "does not exist!" return False
def findtc(self, temperatures=None, tsteps=None, deltaM=None): # prepare logfiles self.log_prepare() # default magnetisation precision if deltaM == None: deltaM = 1.0E-2 # default temperatures steps if temperatures == None: temperatures = range(20, 301, 20) # default temperatures steps if tsteps == None: # default temperature increments tsteps = [160, 80, 40, 20, 10, 5, 2.5, 1, 0.1] # tsteps must contain at least one entry if len(tsteps) < 1: print "Error: euorun: find_tc: No temperature steps given. Break" exit(1) # sort tsteps tsteps.sort() # reverse order (decendent) tsteps.reverse() (tc, dT, dM) = ftc.findtc(self.run, self.extractMag, (), (self.initial_input, ), (), temperatures, tsteps, deltaM) ############################## # save tc in file and upload it to database ############################## local_file = "%s/tc.dat" % self.output f = open(local_file, 'w') f.write("# Curie temperature of %s\n" % self.name) f.write("# Magnetisation accuracy dM=%f\n" % dM) f.write("# Temperature accuracy dT=%f\n" % dT) f.write("# Tc=%f\n" % tc) f.write("%0.17e\n" % tc) f.close() if self.updatedbFlag: cmd = "scp %s [email protected]:/users/stollenw/projects/euo/results/%s/%s/" % ( local_file, self.material_class, self.output) proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) proc.communicate() ############################## # send finishing notification ############################## runname = '' if self.material_class == 'bulk': runname = "%s, ni=%f, Tc=%f" % (self.material, self.ni, tc) elif self.material_class == 'isolated': runname = "%s, N=%i, ni=%f, Tc=%f" % (self.material, self.N, self.ni, tc) else: runname = "%s, N=%i, M=%i, ni=%f, ncr=%f, dW=%f, Tc=%f" % ( self.material, self.N, self.M, self.ni, self.ncr, self.dW, tc) cmd = "echo '' | %s 'Find Tc finished: %s on %s.' %s" % ( self.mailcmd, runname, self.host, self.email) subprocess.call(cmd, shell=True)
def gettc(dbtype, db, folder, temperatures=None, tsteps=None, deltaM=None): # default magnetisation precision if deltaM==None: deltaM=1.0E-2 # default temperatures steps if temperatures==None: temperatures=range(20,301,20) # default temperatures steps if tsteps==None: # default temperature increments tsteps=[20,10,5,1,0.1] # tsteps must contain at least one entry if len(tsteps)<1: print "Error: find_tc: No temperature steps given. Break" exit(1) # sort tsteps tsteps.sort() # reverse order (decendent) tsteps.reverse() try: (tc, dT, dM)=findtc.findtc(dummyrun, extractMag, (), (), (dbtype, db, folder), temperatures, tsteps, deltaM) except xmagfile, x: print x.name, "does not exist!" return False
def findtc(self, temperatures=None, tsteps=None, deltaM=None): # prepare logfiles self.log_prepare() # default magnetisation precision if deltaM==None: deltaM=1.0E-2 # default temperatures steps if temperatures==None: temperatures=range(20,301,20) # default temperatures steps if tsteps==None: # default temperature increments tsteps=[160,80,40,20,10,5,2.5,1,0.1] # tsteps must contain at least one entry if len(tsteps)<1: print "Error: euorun: find_tc: No temperature steps given. Break" exit(1) # sort tsteps tsteps.sort() # reverse order (decendent) tsteps.reverse() (tc, dT, dM)=ftc.findtc(self.run, self.extractMag, (), (self.initial_input,), (), temperatures, tsteps, deltaM) ############################## # save tc in file and upload it to database ############################## local_file="%s/tc.dat" % self.output f=open(local_file, 'w') f.write("# Curie temperature of %s\n" % self.name ) f.write("# Magnetisation accuracy dM=%f\n" % dM) f.write("# Temperature accuracy dT=%f\n" % dT) f.write("# Tc=%f\n" % tc) f.write("%0.17e\n" % tc) f.close() if self.updatedbFlag: cmd = "scp %s [email protected]:/users/stollenw/projects/euo/results/%s/%s/" % (local_file, self.material_class, self.output) proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) proc.communicate() ############################## # send finishing notification ############################## runname='' if self.material_class=='bulk': runname="%s, ni=%f, Tc=%f" % (self.material, self.ni, tc) elif self.material_class=='isolated': runname="%s, N=%i, ni=%f, Tc=%f" % (self.material, self.N, self.ni, tc) else: runname="%s, N=%i, M=%i, ni=%f, ncr=%f, dW=%f, Tc=%f" % (self.material, self.N, self.M, self.ni, self.ncr, self.dW, tc) cmd="echo '' | %s 'Find Tc finished: %s on %s.' %s" % (self.mailcmd, runname, self.host, self.email) subprocess.call(cmd, shell=True)
def main(): parser = argparse.ArgumentParser(description='Calculate spins and Curie temperature for the layered mean-field heisenberg model') parser.add_argument('-n', '--N', default=5, help='Number of layers', type=int) parser.add_argument('--B', default=None, help='External magnetic field in units of D0', type=float) parser.add_argument('--M', default=0, help='Number of layers in second material', type=int) parser.add_argument('--no_mirror', action='store_false', help='Do not impose mirror symmetry') parser.add_argument('-l', '--longrange', action='store_true', help='Long range perpendicular coupling') parser.add_argument('--J4f', help='Spin-coupling', type=float) parser.add_argument('--J4f2', help='Spin-coupling in 2nd material', type=float) parser.add_argument('--Jcf', help='Spin-conduction-band-spin-coupling', type=float) parser.add_argument('-o','--output', help='output folder (optional)') parser.add_argument('-m','--cmag', help='file with conduction band magnetisation (optional)') parser.add_argument('--tsteps', nargs='*', help='temperature steps for the Curie temperature search (optional)', type=float) parser.add_argument('-t','--temperatures', nargs='*', help='temperatures for the Curie temperature search (optional)', type=float) parser.add_argument('--deltaM', help='Magnetisation accuracy for the Curie temperature search (optional)', type=float) args = parser.parse_args() output=get_output(args.N, args.J4f, args.Jcf) if args.output!=None: #output=args.output + "/" + get_output(args.N, args.J4f, args.Jcf) output=args.output + "/" if os.path.exists(output): shutil.rmtree(output) os.makedirs(output) run_args=(args.N, output, args.no_mirror, args.longrange, args.J4f, args.Jcf, args.cmag, args.J4f2, args.M, args.B) get_mag_args=(output,) (tc, dT, dM)=findtc.findtc(run_heisenberg, get_mag_heisenberg, run_args, run_args, get_mag_args, args.temperatures, args.tsteps, args.deltaM) f=open(output + "/tc.dat", 'w') f.write("%e\n" % tc) f.close() # sort avspin vs t file f=open(output + "/avspin.dat", 'r') lines=f.readlines() f.close() f=open(output + "/avspin.dat", 'w') data=[] for l in lines: data.append((float(l.split()[0]), float(l.split()[1]))) data=sorted(data, key=lambda x:x[0]) for t,mag in data: f.write("%f\t%f\n" % (t,mag)) f.close()