Wenn ich einen Computer simulierte, während ich die Parameter nach und nach änderte, habe ich jedes Mal eine Datei manuell bedient, aber mit zunehmender Anzahl der erforderlichen Daten (ca. 200) wird es schwierig. Also habe ich ein einfaches Skript geschrieben, um es bis zu einem gewissen Grad zu automatisieren.
Ich habe es manuell gemacht
Dieses Mal wird das Berechnungspaket nach den ersten Prinzipien verwendet, um die Wechselwirkungsenergie zu berechnen, die aus dem interatomaren Abstand von Graphit erhalten wird.
import os
import re
from time import sleep
os
wird für Terminalbefehlsoperationen verwendet, re
wird für reguläre Ausdrücke verwendet und sleep
wird für die Beabstandung von Jobübermittlungen verwendet.
Erstellen Sie 200 Daten mit interatomaren Abständen von 3,01 Å bis 5,00 Å.
begin = 3.01
end = 5.00
step = 0.01
Erstellen Sie im Voraus die Eingabedatei und die Datei, aus der die Jobdatei stammt, im Verzeichnis data
und lesen Sie diese Dateien.
#Weisen Sie der Variablen einen Pfad zu
input_path = 'data/input_seed'
job_path = 'data/qsub_seed'
#Öffnen Sie die Datei und lesen Sie sie als Text
with open(input_path) as f:
input_file = f.read()
with open(job_path) as f:
job_file = f.read()
Da der Parameter keine Ganzzahl ist und die Funktion range
nicht verwendet werden kann, wird eine neue Funktion drange
definiert.
#Drange-Funktionsdefinition
def drange(begin, end, step):
n = begin
while n < end:
yield n
n += step
for r in drange(begin,end,step):
#Å=>In bohr konvertieren
ang = ('{:.8f}'.format(r*2/0.529177))
#Verzeichnis erstellen, Dateipfad angeben
os.system('mkdir %s' % r)
input_name = ('%s/nfinp' % r)
job_name = ('%s/run.sh' % r)
#Ersetzen Sie den Abstand durch einen regulären Ausdruck
distance = str(ang)
input_mod = re.sub('distance',distance,input_file)
#Erstellen Sie eine Datei im Verzeichnis
with open(input_name, mode='w') as f:
f.write(input_mod)
with open(job_name, mode='w') as f:
f.write(job_file)
#Geben Sie das Verzeichnis ein und senden Sie einen Job
current_dir = os.getcwd()
os.chdir(current_dir + ('/%s' % r))
os.system('qsub run.sh')
os.chdir(current_dir)
sleep(1)
Der Inhalt der ursprünglichen Eingabedatei sieht folgendermaßen aus. Der interatomare Abstand ( distance
) wird als Variable verwendet und ** durch einen regulären Ausdruck ** ersetzt. Ich verstehe die anderen Teile ehrlich gesagt nicht lol
data/input_seed
0 0 0 0 0 0 : graphite
6.00 20.00 1 4 4 : GMAX, GMAXP, NTYP, NATM, NATM2
1 0 : num_space_group, type of bravis lattice
4.655149797 4.655149797 distance 90.0 90.0 60.0 : a,b,c,alpha,beta,gamma
24 24 2 1 1 1 : knx,kny,knz, k-point shift
0 0 : NCORD, NINV
0.000000000000 0.000000000000 0.250000000000 1 1 1
0.333333333333 0.333333333333 0.250000000000 1 1 1
0.000000000000 0.000000000000 -0.250000000000 1 1 1
-0.333333333333 -0.333333333333 -0.250000000000 1 1 1
6 0.1500 1.00794 3 1 0.d0 : TYPE 1IATOMN,ALFA,AMION,ILOC,IVAN
0 0 0 0 0 : ICOND 0-MD, 1-CONT.MD, 2-WAVE FN,, 3-WAVE FN CONT., iconstpw
0 1 : IPRE, IPRI
200 1000 0 57200.00 0 : NMD1, NMD2, iter_last, CPUMAX,ifstop
6 1 : Simple=1,Broyd2=3,Blugel=6, 1:charge, 2:potential mix.
0 30 0.5 : starting mixing, kbxmix,alpha
0.60 0.50 0.60 0.70 1.00 : DTIM1, DTIM2, DTIM3, DTIM4, dtim_last
100.00 2 1 0.10D-08 1.d-06 : DTIO ,IMDALG, IEXPL, EDELTA
-0.0010 1.00D+03 0 : WIDTH,FORCCR,ISTRESS
rev-vdw-df2 1 : XCTYPE, nspin
1.00 3 : destm, n_stm
101 : NBZTYP 0-SF, 1-BK, 2-SC, 3-BCC, 4-FCC, 5-DIA, 6-HEX
0 0 0 : NKX, NKY, NKZ
0 0 0 : NKX2,NKY2,NKZ2
12 : NEG
1 : NEXTST(MB)
0 : 0; random numbers, 1; matrix diagon
2 0 0 0(MB) : imsd, i_2lm, i_sd2another, wksz for phase
0 : evaluation of eko difference.0 = no ,1 = yes
0 : npdosao
0 0.0 : SM_N, dopping
Es wäre schön, wenn wir die erforderlichen Teile der Ausgabedatei als Datenbank ausgeben und sogar ein Diagramm zeichnen könnten.
Recommended Posts