Coverage for gpaw/lrtddft2/tools.py: 4%

157 statements  

« prev     ^ index     » next       coverage.py v7.7.1, created at 2025-07-20 00:19 +0000

1import sys 

2import re 

3import numpy as np 

4import datetime 

5 

6 

7def write_parallel_cube(basename, data, gd, atoms, rank): 

8 hx = gd.h_cv[0, 0] 

9 hy = gd.h_cv[1, 1] 

10 hz = gd.h_cv[2, 2] 

11 

12 f = open('%s_%06d.cube' % (basename, rank), 'w', 256 * 1024) 

13 

14 f.write( 

15 ('GPAW Global (natom nx ny nz hx hy hz): ' 

16 '%6d %6d %6d %6d %12.6lf %12.6lf %12.6lf\n') 

17 % (len(atoms), gd.N_c[0], gd.N_c[1], gd.N_c[2], hx, hy, hz)) 

18 f.write( 

19 ('GPAW Local (xbeg xend ybeg yend zbeg zend): ' 

20 '%6d %6d %6d %6d %6d %6d\n') 

21 % (gd.beg_c[0], gd.end_c[0], gd.beg_c[1], gd.end_c[1], gd.beg_c[2], 

22 gd.end_c[2])) 

23 

24 f.write('%6d %12.6lf %12.6lf %12.6lf\n' % 

25 (len(atoms), hx * gd.beg_c[0], hy * gd.beg_c[1], hz * gd.beg_c[2])) 

26 f.write('%6d %12.6lf %12.6lf %12.6lf\n' % (gd.n_c[0], hx, 0.0, 0.0)) 

27 f.write('%6d %12.6lf %12.6lf %12.6lf\n' % (gd.n_c[1], 0.0, hy, 0.0)) 

28 f.write('%6d %12.6lf %12.6lf %12.6lf\n' % (gd.n_c[2], 0.0, 0.0, hz)) 

29 

30 for (i, atom) in enumerate(atoms): 

31 f.write('%6d %12.6lf %12.6lf %12.6lf %12.6lf\n' % 

32 (atom.number, 0.0, atom.position[0] / 0.529177, 

33 atom.position[1] / 0.529177, atom.position[2] / 0.529177)) 

34 for i in range(data.shape[0]): 

35 for j in range(data.shape[1]): 

36 for k in range(data.shape[2]): 

37 f.write('%18.8lf\n' % data[i, j, k]) 

38 f.close() 

39 

40 

41def cubify(out_filename, filenames): 

42 sys.stderr.write('Reading partial cube files...%s\n' % 

43 datetime.datetime.now()) 

44 data = None 

45 for fname in filenames: 

46 f = open(fname, 'r', 256 * 1024) 

47 line0 = f.readline() 

48 elems = re.compile(r'[\d.e+-]+').findall(line0) 

49 natom = int(elems[0]) 

50 (nx, ny, nz) = (int(n) for n in elems[1:4]) 

51 (hx, hy, hz) = (float(h) for h in elems[4:7]) 

52 line = f.readline() 

53 (xb, xe, yb, ye, zb, 

54 ze) = (int(x) for x in re.compile(r'\d+').findall(line)) 

55 sys.stderr.write('%d %d %d %d %d %d\n' % (xb, xe, yb, ye, zb, ze)) 

56 

57 line = f.readline() 

58 line = f.readline() 

59 line = f.readline() 

60 line = f.readline() 

61 

62 atom_lines = [] 

63 for n in range(natom): 

64 atom_lines.append(f.readline()) 

65 

66 if data is None: 

67 data = np.zeros((nx, ny, nz)) 

68 

69 for i in range(xb, xe): 

70 for j in range(yb, ye): 

71 for k in range(zb, ze): 

72 data[i, j, k] = float(f.readline()) 

73 

74 f.close() 

75 

76 sys.stderr.write('Reading done. %s\n' % datetime.datetime.now()) 

77 sys.stderr.write('Writing the cube file... %d %d %d\n' % (nx, ny, nz)) 

78 

79 out = open(out_filename, 'w', 256 * 1024) 

80 out.write(line0) 

81 out.write('OUTER LOOP: X, MIDDLE LOOP: Y, INNER LOOP: Z\n') 

82 out.write('%8d %12.6lf %12.6lf %12.6lf\n' % (natom, 0.0, 0.0, 0.0)) 

83 out.write('%8d %12.6lf %12.6lf %12.6lf\n' % (nx, hx, 0.0, 0.0)) 

84 out.write('%8d %12.6lf %12.6lf %12.6lf\n' % (ny, 0.0, hy, 0.0)) 

85 out.write('%8d %12.6lf %12.6lf %12.6lf\n' % (nz, 0.0, 0.0, hz)) 

86 for n in range(natom): 

87 out.write(atom_lines[n]) 

88 for i in range(nx): 

89 sys.stderr.write('.') 

90 for j in range(ny): 

91 for k in range(nz): 

92 out.write('%18.8lf\n' % data[i, j, k]) 

93 out.close() 

94 sys.stderr.write('\n') 

95 sys.stderr.write('Writing done. %s\n' % datetime.datetime.now()) 

96 

97 

98def isocubes(filename, isoval, scale): 

99 """Requires PIL""" 

100 import Image 

101 

102 f = open(filename, 'r', 256 * 1024) 

103 f.readline() 

104 f.readline() 

105 

106 natom = int(f.readline().split()[0]) 

107 

108 elems = f.readline().split() 

109 nx = int(elems[0]) 

110 # x0 = float(elems[1]) 

111 

112 elems = f.readline().split() 

113 ny = int(elems[0]) 

114 # y0 = float(elems[2]) 

115 

116 elems = f.readline().split() 

117 nz = int(elems[0]) 

118 # z0 = float(elems[3]) 

119 

120 for i in range(natom): 

121 f.readline() 

122 

123 # data = np.zeros((nx,ny,nz)) 

124 dataxy = [[0.0, 0.0] for i in range(nx * ny)] 

125 dataxz = [[0.0, 0.0] for i in range(nx * nz)] 

126 datayz = [[0.0, 0.0] for i in range(ny * nz)] 

127 for i in range(nx): 

128 for j in range(ny): 

129 for k in range(nz): 

130 val = float(f.readline()) 

131 if val > isoval: 

132 dataxy[i * ny + j][0] += val * scale 

133 dataxy[i * ny + j][1] += val * scale 

134 dataxz[i * nz + k][0] += val * scale 

135 dataxz[i * nz + k][1] += val * scale 

136 datayz[j * nz + k][0] += val * scale 

137 datayz[j * nz + k][1] += val * scale 

138 elif -val > isoval: 

139 dataxy[i * ny + j][0] += -val * scale 

140 dataxy[i * ny + j][1] -= -val * scale 

141 dataxz[i * nz + k][0] += -val * scale 

142 dataxz[i * nz + k][1] -= -val * scale 

143 datayz[j * nz + k][0] += -val * scale 

144 datayz[j * nz + k][1] -= -val * scale 

145 

146 image_xy = Image.new('RGB', (nx, ny)) 

147 image_xy_data = image_xy.load() 

148 

149 for i in range(nx): 

150 for j in range(ny): 

151 n = dataxy[i * ny + j][0] * 100 

152 d = dataxy[i * ny + j][1] * 100 

153 if n > 255: 

154 n = 255 

155 d = 255 * d / n 

156 n = int(n + .5) 

157 d = int(d) 

158 if d > 0: 

159 dataxy[i * ny + j] = (n, n - d, n - d) 

160 elif d < 0: 

161 dataxy[i * ny + j] = (n + d, n + d, n) 

162 else: 

163 dataxy[i * ny + j] = (0, 0, 0) 

164 

165 image_xy_data[i, j] = dataxy[i * ny + j] 

166 

167 image_xy.save(filename + '_iso_xy.png') 

168 

169 image_xz = Image.new('RGB', (nx, nz)) 

170 image_xz_data = image_xz.load() 

171 

172 for i in range(nx): 

173 for j in range(nz): 

174 n = dataxz[i * nz + j][0] * 100 

175 d = dataxz[i * nz + j][1] * 100 

176 if n > 255: 

177 n = 255 

178 d = 255 * d / n 

179 n = int(n + .5) 

180 d = int(d) 

181 if d > 0: 

182 dataxz[i * nz + j] = (n, n - d, n - d) 

183 elif d < 0: 

184 dataxz[i * nz + j] = (n + d, n + d, n) 

185 else: 

186 dataxz[i * nz + j] = (0, 0, 0) 

187 

188 image_xz_data[i, j] = dataxz[i * nz + j] 

189 

190 image_xz.save(filename + '_iso_xz.png') 

191 

192 image_yz = Image.new('RGB', (ny, nz)) 

193 image_yz_data = image_yz.load() 

194 

195 for i in range(ny): 

196 for j in range(nz): 

197 n = datayz[i * nz + j][0] * 100 

198 d = datayz[i * nz + j][1] * 100 

199 if n > 255: 

200 n = 255 

201 d = 255 * d / n 

202 n = int(n + .5) 

203 d = int(d) 

204 if d > 0: 

205 datayz[i * nz + j] = (n, n - d, n - d) 

206 elif d < 0: 

207 datayz[i * nz + j] = (n + d, n + d, n) 

208 else: 

209 datayz[i * nz + j] = (0, 0, 0) 

210 

211 image_yz_data[i, j] = datayz[i * nz + j] 

212 

213 image_yz.save(filename + '_iso_yz.png')