Coverage for gpaw/test/big/dcdft/analyse.py: 0%
105 statements
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-09 00:21 +0000
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-09 00:21 +0000
1import os
3import sys
5import urllib.request
6import urllib.parse
7import urllib.error
9import zipfile
11import csv
13import numpy as np
15from ase.test import NotAvailable
17from ase import units
19from ase.test.tasks.dcdft import DeltaCodesDFTTask as Task
21dir = 'Delta'
23if len(sys.argv) == 1:
24 tag = None
25 reffile = os.path.join(dir, 'WIEN2k.txt')
26else:
27 if len(sys.argv) == 3:
28 tag = sys.argv[1]
29 reffile = sys.argv[2]
30 else:
31 tag = sys.argv[1]
32 reffile = os.path.join(dir, 'WIEN2k.txt')
34src = 'https://molmod.ugent.be/sites/default/files/Delta_v3-0.zip'
35name = os.path.basename(src)
36if not os.path.exists(dir):
37 os.makedirs(dir)
38os.chdir(dir)
39if not os.path.exists('calcDelta.py'):
40 try:
41 resp = urllib.request.urlopen(src)
42 urllib.request.urlretrieve(src, filename=name)
43 z = zipfile.ZipFile(name)
44 try: # new in 2.6
45 z.extractall()
46 except AttributeError:
47 # https://stackoverflow.com/questions/7806563/how-to-unzip-a-zip-file-with-python-2-4
48 for f in z.namelist():
49 fd = open(f, "w")
50 fd.write(z.read(f))
51 fd.close()
52 # AttributeError if unzip not found
53 except (urllib.error.HTTPError, AttributeError):
54 raise NotAvailable('Retrieval of zip failed')
55os.chdir('..')
57task = Task(
58 tag=tag,
59 use_lock_files=True)
61# header
62h = ['#element', 'V0', 'B0', 'B1']
64if not os.path.exists('%s_raw.csv' % tag):
65 # read calculated results from json file and write into csv
66 task.read()
67 task.analyse()
69 f1 = open('%s_raw.csv' % tag, 'wb')
70 csvwriter1 = csv.writer(f1)
71 csvwriter1.writerow(h)
73 for n in task.collection.names:
74 row = [n]
75 if n in task.data.keys():
76 try:
77 v = task.data[n]['dcdft volume']
78 b0 = task.data[n]['dcdft B0'] / (units.kJ * 1e-24)
79 b1 = task.data[n]['dcdft B1']
80 row.extend([v, b0, b1])
81 except KeyError: # completely failed to find eos minimum
82 row.extend(['N/A', 'N/A', 'N/A'])
83 else:
84 # element not calculated
85 row.extend(['N/A', 'N/A', 'N/A'])
86 if 'N/A' not in row:
87 csvwriter1.writerow(row)
88 f1.close()
90# read raw results
91csvreader1 = csv.reader(open('%s_raw.csv' % tag, 'r'))
92data = {}
93for row in csvreader1:
94 if '#' not in row[0]:
95 data[row[0]] = {'dcdft volume': float(row[1]),
96 'dcdft B0': float(row[2]),
97 'dcdft B1': float(row[3])}
99csvwriter2 = csv.writer(open('%s.csv' % tag, 'wb'))
100h2 = h + ['%' + h[1], '%' + h[2], '%' + h[3]]
101csvwriter2.writerow(h2)
103refs = np.loadtxt(reffile,
104 dtype={'names': ('element', 'V0', 'B0', 'BP'),
105 'formats': ('S2', float, float, float)})
106# convert into dict
107refsd = {}
108for e, v, b0, b1 in refs:
109 refsd[e] = [v, b0, b1]
111rows = []
112rowserr = []
113for n in task.collection.names:
114 row = [n]
115 if n in data.keys():
116 if 0:
117 ref = task.collection.ref[n] # don't use collection data
118 else:
119 ref = refsd[n]
120 try:
121 v = round(data[n]['dcdft volume'], 3)
122 b0 = round(data[n]['dcdft B0'], 3)
123 b1 = round(data[n]['dcdft B1'], 3)
124 row.extend([v, b0, b1])
125 except KeyError: # completely failed to find eos minimum
126 row.extend(['N/A', 'N/A', 'N/A'])
127 else:
128 # element not calculated
129 row.extend(['N/A', 'N/A', 'N/A'])
130 if 'N/A' not in row:
131 v0, b00, b10 = ref
132 ve = round((v - v0) / v0 * 100, 1)
133 b0e = round((b0 - b00) / b00 * 100, 1)
134 b1e = round((b1 - b10) / b10 * 100, 1)
135 rows.append(row)
136 # print row + ref + [ve, b0e, b1e]
137 csvwriter2.writerow(row + [ve, b0e, b1e])
139# calculate Delta
140f = open('%s.txt' % tag, 'wb')
141csvwriter3 = csv.writer(f, delimiter='\t')
142for r in rows:
143 csvwriter3.writerow(r)
144f.close()
145cmd = 'python ' + os.path.join(dir, 'calcDelta.py')
146cmd += ' ' + '%s.txt ' % tag + reffile + ' --stdout'
147cmd += ' > ' + '%s_Delta.txt' % tag
148os.system(cmd)