95
gint read_dmol(gchar *filename, struct model_pak *model)
95
gint read_dmol_frame(FILE *fp, struct model_pak *model)
97
97
gint i, num_tokens;
100
99
struct core_pak *core;
102
g_assert(model != NULL);
104
scan = scan_new(filename);
108
while (!scan_complete(scan))
101
g_assert(fp != NULL);
103
line = file_read_line(fp);
110
buff = scan_get_tokens(scan, &num_tokens);
114
107
/* read cell vectors */
115
if (g_strncasecmp(*buff, "$cell", 5) == 0)
108
if (g_ascii_strncasecmp(line, "$cell", 5) == 0 && model)
117
110
for (i=0 ; i<3 ; i++)
120
buff = scan_get_tokens(scan, &num_tokens);
113
line = file_read_line(fp);
114
buff = tokenize(line, &num_tokens);
121
115
if (num_tokens > 2)
123
117
model->latmat[i] = AU2ANG*str_to_float(*(buff));
124
118
model->latmat[i+3] = AU2ANG*str_to_float(*(buff+1));
125
119
model->latmat[i+6] = AU2ANG*str_to_float(*(buff+2));
128
123
model->periodic = 3;
129
124
model->construct_pbc = TRUE;
132
127
/* read coordinates */
133
if (g_strncasecmp(*buff, "$coord", 5) == 0)
128
if (g_ascii_strncasecmp(line, "$coord", 5) == 0 && model)
136
buff = scan_get_tokens(scan, &num_tokens);
131
line = file_read_line(fp);
132
buff = tokenize(line, &num_tokens);
137
133
while (num_tokens > 3)
139
135
if (elem_symbol_test(*buff))
144
140
core->x[1] = AU2ANG*str_to_float(*(buff+2));
145
141
core->x[2] = AU2ANG*str_to_float(*(buff+3));
144
line = file_read_line(fp);
147
145
g_strfreev(buff);
148
buff = scan_get_tokens(scan, &num_tokens);
146
buff = tokenize(line, &num_tokens);
150
149
model->fractional = FALSE;
152
/* terminate frame read */
153
if (g_ascii_strncasecmp(line, "$end", 4) == 0)
157
line = file_read_line(fp);
166
#define DEBUG_READ_XYZ 0
167
gint read_dmol(gchar *filename, struct model_pak *model)
173
g_return_val_if_fail(model != NULL, 1);
174
g_return_val_if_fail(filename != NULL, 2);
176
fp = fopen(filename,"rt");
180
/* loop while there's data */
182
model->num_frames = 0;
184
read_dmol_frame(fp, model);
188
add_frame_offset(fp, model);
190
if (read_dmol_frame(fp, NULL))
196
/* get rid of frame list if only one frame */
197
if (model->num_frames == 1)
199
free_list(model->frame_list);
200
model->frame_list = NULL;
159
203
/* model setup */
160
204
strcpy(model->filename, filename);
161
205
g_free(model->basename);
162
model->basename = strdup_basename(filename);
206
model->basename = parse_strip(filename);
163
207
model_prep(model);