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

1import os 

2 

3import sys 

4 

5import urllib.request 

6import urllib.parse 

7import urllib.error 

8 

9import zipfile 

10 

11import csv 

12 

13import numpy as np 

14 

15from ase.test import NotAvailable 

16 

17from ase import units 

18 

19from ase.test.tasks.dcdft import DeltaCodesDFTTask as Task 

20 

21dir = 'Delta' 

22 

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

33 

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('..') 

56 

57task = Task( 

58 tag=tag, 

59 use_lock_files=True) 

60 

61# header 

62h = ['#element', 'V0', 'B0', 'B1'] 

63 

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

68 

69 f1 = open('%s_raw.csv' % tag, 'wb') 

70 csvwriter1 = csv.writer(f1) 

71 csvwriter1.writerow(h) 

72 

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

89 

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

98 

99csvwriter2 = csv.writer(open('%s.csv' % tag, 'wb')) 

100h2 = h + ['%' + h[1], '%' + h[2], '%' + h[3]] 

101csvwriter2.writerow(h2) 

102 

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] 

110 

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

138 

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)