1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 package ffx.potential.parsers;
39
40 import static java.lang.Double.parseDouble;
41 import static java.lang.String.format;
42
43 import ffx.crystal.Crystal;
44 import java.io.BufferedReader;
45 import java.io.BufferedWriter;
46 import java.io.File;
47 import java.io.FileReader;
48 import java.io.FileWriter;
49 import java.io.IOException;
50 import java.util.logging.Level;
51 import java.util.logging.Logger;
52
53
54
55
56
57
58
59 public class DYNFilter {
60
61 private static final Logger logger = Logger.getLogger(DYNFilter.class.getName());
62 private final String label;
63
64
65
66
67
68
69 public DYNFilter(String label) {
70 this.label = label;
71 }
72
73
74
75
76
77
78
79
80
81
82
83
84 public boolean readDYN(File dynFile, Crystal crystal, double[] x, double[] v, double[] a,
85 double[] ap) {
86 if (!dynFile.exists() || !dynFile.canRead()) {
87 return false;
88 }
89 try (BufferedReader br = new BufferedReader(new FileReader(dynFile))) {
90
91 br.readLine();
92 String data = br.readLine().trim();
93 String[] tokens = data.split(" +");
94 if (tokens.length == 0) {
95 return false;
96 }
97 int numAtoms = Integer.parseInt(tokens[0]);
98
99
100 br.readLine();
101 data = br.readLine().trim();
102 tokens = data.split(" +");
103 if (tokens.length != 3) {
104 return false;
105 }
106 double aAxis = parseDouble(tokens[0]);
107 double bAxis = parseDouble(tokens[1]);
108 double cAxis = parseDouble(tokens[2]);
109
110 data = br.readLine().trim();
111 tokens = data.split(" +");
112 if (tokens.length != 3) {
113 return false;
114 }
115 double alpha = parseDouble(tokens[0]);
116 double beta = parseDouble(tokens[1]);
117 double gamma = parseDouble(tokens[2]);
118
119 crystal.changeUnitCellParameters(aAxis, bAxis, cAxis, alpha, beta, gamma);
120
121
122 br.readLine();
123 for (int i = 0; i < numAtoms; i++) {
124 data = br.readLine().trim();
125 tokens = data.split(" +");
126 if (tokens.length != 3) {
127 return false;
128 }
129 int j = i * 3;
130 x[j] = parseDouble(tokens[0]);
131 x[j + 1] = parseDouble(tokens[1]);
132 x[j + 2] = parseDouble(tokens[2]);
133 }
134
135
136 br.readLine();
137 for (int i = 0; i < numAtoms; i++) {
138 data = br.readLine().trim();
139 tokens = data.split(" +");
140 if (tokens.length != 3) {
141 return false;
142 }
143 int j = i * 3;
144 v[j] = parseDouble(tokens[0]);
145 v[j + 1] = parseDouble(tokens[1]);
146 v[j + 2] = parseDouble(tokens[2]);
147 }
148
149
150 br.readLine();
151 for (int i = 0; i < numAtoms; i++) {
152 data = br.readLine().trim();
153 tokens = data.split(" +");
154 if (tokens.length != 3) {
155 return false;
156 }
157 int j = i * 3;
158 a[j] = parseDouble(tokens[0]);
159 a[j + 1] = parseDouble(tokens[1]);
160 a[j + 2] = parseDouble(tokens[2]);
161 }
162
163
164 br.readLine();
165 for (int i = 0; i < numAtoms; i++) {
166 data = br.readLine().trim();
167 tokens = data.split(" +");
168 if (tokens.length != 3) {
169 return false;
170 }
171 int j = i * 3;
172 ap[j] = parseDouble(tokens[0]);
173 ap[j + 1] = parseDouble(tokens[1]);
174 ap[j + 2] = parseDouble(tokens[2]);
175 }
176 } catch (Exception e) {
177 String message = "Exception reading dynamic restart file: " + dynFile;
178 logger.log(Level.WARNING, message, e);
179 }
180 return true;
181 }
182
183
184
185
186
187
188
189
190
191
192
193
194 public boolean writeDYN(File dynFile, Crystal crystal, double[] x, double[] v, double[] a,
195 double[] ap) {
196 try (FileWriter fw = new FileWriter(dynFile); BufferedWriter bw = new BufferedWriter(fw)) {
197 bw.write(" Number of Atoms and Title :\n");
198 assert (x.length % 3 == 0);
199 int numberOfAtoms = x.length / 3;
200 String output = format("%7d %s\n", numberOfAtoms, label);
201 bw.write(output);
202 bw.write(" Periodic Box Dimensions :\n");
203 Crystal unitCell = crystal.getUnitCell();
204 bw.write(format("%26.16E%26.16E%26.16E\n", unitCell.a, unitCell.b, unitCell.c));
205 bw.write(format("%26.16E%26.16E%26.16E\n", unitCell.alpha, unitCell.beta, unitCell.gamma));
206 bw.write(" Current Atomic Positions :\n");
207 for (int i = 0; i < numberOfAtoms; i++) {
208 int k = i * 3;
209 bw.write(format("%26.16E%26.16E%26.16E\n", x[k], x[k + 1], x[k + 2]));
210 }
211 bw.write(" Current Atomic Velocities :\n");
212 for (int i = 0; i < numberOfAtoms; i++) {
213 int k = i * 3;
214 bw.write(format("%26.16E%26.16E%26.16E\n", v[k], v[k + 1], v[k + 2]));
215 }
216 bw.write(" Current Atomic Accelerations :\n");
217 for (int i = 0; i < numberOfAtoms; i++) {
218 int k = i * 3;
219 bw.write(format("%26.16E%26.16E%26.16E\n", a[k], a[k + 1], a[k + 2]));
220 }
221 bw.write(" Previous Atomic Accelerations :\n");
222 for (int i = 0; i < numberOfAtoms; i++) {
223 int k = i * 3;
224 bw.write(format("%26.16E%26.16E%26.16E\n", ap[k], ap[k + 1], ap[k + 2]));
225 }
226 } catch (IOException e) {
227 String message = " Exception writing dynamic restart file " + dynFile;
228 logger.log(Level.SEVERE, message, e);
229 return false;
230 }
231 return true;
232 }
233 }