gint read_gms_out(gchar *filename, struct model_pak *model) { gint flag, frame, num_tokens, len, i, index, bad_andrew; gchar **buff, line[LINELEN], *keyword, *option; GString *property_string; FILE *fp; fp = fopen(filename, "rt"); if (!fp) { sprintf(line, "Unable to open file %s\n", filename); gui_text_show(ERROR, line); return(1); } model->periodic = 0; flag=frame=0; /* read in BASIS OPTIONS */ while (!fgetline(fp, line)) { if (g_ascii_strncasecmp(line, " BASIS OPTIONS", 18) == 0) { /* skip line */ if (fgetline(fp, line)) { gui_text_show(ERROR, "unexpected end of file reading basis options\n"); return(2); } if (fgetline(fp, line)) { gui_text_show(ERROR, "unexpected end of file reading basis options\n"); return(2); } /* get first line of options i.e. basis set */ buff = tokenize(line, &num_tokens); /* GBASIS=STO IGAUSS= 3 POLAR=NONE */ keyword = *(buff+0); if (g_ascii_strncasecmp(keyword, GMS_BASIS_TXT, len = strlen(GMS_BASIS_TXT)) == 0) { if (read_keyword(&keyword[len], basis_types, &bad_andrew) > 0) { sprintf(line, "invalid basis %s\n", &keyword[len]); gui_text_show(ERROR, line); return(3); } model->gamess.basis = bad_andrew; } model->gamess.ngauss = (gint) str_to_float(*(buff+2)); g_strfreev(buff); /* get 2nd line of options i.e. NDFUNC and DIFFSP */ if (fgetline(fp, line)) { gui_text_show(ERROR, "unexpected end of file reading basis options\n"); return(2); } buff = tokenize(line, &num_tokens); /* NDFUNC= 0 DIFFSP= F */ model->gamess.num_d = str_to_float(*(buff+1)); if (g_ascii_strncasecmp(*(buff+3), "F", 1) == 0) model->gamess.have_heavy_diffuse = FALSE; else model->gamess.have_heavy_diffuse = TRUE; g_strfreev(buff); /* get 3rd line of options i.e. MULT and ICHARG */ if (fgetline(fp, line)) { gui_text_show(ERROR, "unexpected end of file reading basis options\n"); return(2); } buff = tokenize(line, &num_tokens); /* NPFUNC= 0 DIFFS= F */ model->gamess.num_p = (gint) str_to_float(*(buff+1)); if (g_ascii_strncasecmp(*(buff+3), "F", 1) == 0) model->gamess.have_hydrogen_diffuse = FALSE; else model->gamess.have_hydrogen_diffuse = TRUE; g_strfreev(buff); /* TODO f functions */ flag++; break; } } if (!flag) { /* no basis present so set to user defined and rewind file */ model->gamess.basis = GMS_USER; rewind(fp); } flag=0; /* read in RUN TITLE */ while (!fgetline(fp, line)) { if (g_ascii_strncasecmp(line, " RUN TITLE", 14) == 0) { if (fgetline(fp, line)) { gui_text_show(ERROR, "unexpected end of file reading title\n"); return(2); } if (fgetline(fp, line)) { gui_text_show(ERROR, "unexpected end of file reading title\n"); return(2); } model->gamess.title = g_strdup(g_strstrip(line)); flag++; break; } } if (!flag) { gui_text_show(ERROR, "RUN TITLE not found\n"); return(2); } flag=0; /* read in $CONTRL OPTIONS */ while (!fgetline(fp, line)) { if (g_ascii_strncasecmp(line, " $CONTRL OPTIONS", 20) == 0) { flag++; if (fgetline(fp, line)) /* skip line of dashes */ { gui_text_show(ERROR, "unexpected end of file reading contrl options\n"); return(3); } while (TRUE) { if (fgetline(fp, line)) { gui_text_show(ERROR, "unexpected end of file reading contrl options\n"); return(3); } /* is the line the blank line signalling end of control options? */ if (strlen(g_strchug(line)) == 0) break; /* break up line into option pairs */ /* each pair takes 15 characters with 5 characters between them */ /* note that we have already removed the single space in front of the lines with the g_strchug */ index = 0; while (index+15 <= strlen(line)) { option = g_strndup(line+index, 15); /* split into pair */ buff = g_strsplit(option, "=", 2); g_free(option); /* remove whitespace */ g_strstrip(buff[0]); g_strstrip(buff[1]); /* the compare strings end in = which we have stripped off so compare on strlen-1 */ if (g_ascii_strncasecmp(buff[0], GMS_SCFTYPE_TXT, strlen(GMS_SCFTYPE_TXT) - 1) == 0) { if (read_keyword(buff[1], scf_types, &bad_andrew) > 0) { sprintf(line, "invalid scf type %s\n", buff[1]); gui_text_show(ERROR, line); return(3); } model->gamess.scf_type = bad_andrew; } else if (g_ascii_strncasecmp(buff[0], GMS_RUNTYPE_TXT, strlen(GMS_RUNTYPE_TXT) - 1) == 0) { if (read_keyword(buff[1], run_types, &bad_andrew) > 0) { sprintf(line, "invalid run type %s\n", buff[1]); gui_text_show(ERROR, line); return(3); } model->gamess.run_type = bad_andrew; property_string = g_string_new(""); i=0; while (run_types[i].label) { if (model->gamess.run_type == run_types[i].id) g_string_append_printf(property_string, "%s", run_types[i].label); i++; } property_string->str[0] = g_ascii_toupper(property_string->str[0]); property_add_ranked(2, "Calculation", property_string->str, model); g_string_free(property_string, TRUE); } else if (g_ascii_strncasecmp(buff[0], GMS_EXETYPE_TXT, strlen(GMS_EXETYPE_TXT) - 1) == 0) { if (read_keyword(buff[1], exe_types, &bad_andrew) > 0) { sprintf(line, "invalid execution type %s\n", buff[1]); gui_text_show(ERROR, line); return(3); } model->gamess.exe_type = bad_andrew; } else if (g_ascii_strncasecmp(buff[0], GMS_MPLEVEL_TXT, strlen(GMS_MPLEVEL_TXT) - 1) == 0) model->gamess.MP_level = (gint) str_to_float(buff[1]); else if (g_ascii_strncasecmp(buff[0], GMS_CITYP_TXT, strlen(GMS_CITYP_TXT) - 1) == 0) if (g_ascii_strncasecmp(buff[1], "none", 4) == 0) model->gamess.have_CI = FALSE; else model->gamess.have_CI = TRUE; else if (g_ascii_strncasecmp(buff[0], GMS_CCTYP_TXT, strlen(GMS_CCTYP_TXT) - 1) == 0) if (g_ascii_strncasecmp(buff[1], "none", 4) == 0) model->gamess.have_CC = FALSE; else model->gamess.have_CC = TRUE; else if (g_ascii_strncasecmp(buff[0], GMS_TOTAL_Q_TXT, strlen(GMS_TOTAL_Q_TXT) - 1) == 0) model->gamess.total_charge = (gint) str_to_float(buff[1]); else if (g_ascii_strncasecmp(buff[0], GMS_MULT_TXT, strlen(GMS_MULT_TXT) - 1) == 0) model->gamess.multiplicity = (gint) str_to_float(buff[1]); else if (g_ascii_strncasecmp(buff[0], GMS_MAXIT_TXT, strlen(GMS_MAXIT_TXT) - 1) == 0) model->gamess.maxit = ((gint) str_to_float(buff[1])); else if (g_ascii_strncasecmp(buff[0], GMS_WIDE_OUTPUT_TXT, strlen(GMS_WIDE_OUTPUT_TXT) - 1) == 0) model->gamess.wide_output = ((gint) str_to_float(buff[1]) == 6); g_strfreev(buff); index += 20; } } break; } } if (!flag) { /* don't return... model_prep() needs to be called to avoid crashing */ gui_text_show(WARNING, "$CONTRL OPTIONS not found\n"); } flag=0; /* read in $SYSTEM OPTIONS */ while (!fgetline(fp, line)) { if (g_ascii_strncasecmp(line, " $SYSTEM OPTIONS", 20) == 0) { if (fgetline(fp, line)) { gui_text_show(ERROR, "unexpected end of file reading system options\n"); return(4); } if (fgetline(fp, line)) { gui_text_show(ERROR, "unexpected end of file reading system options\n"); return(4); } buff = tokenize(line, &num_tokens); model->gamess.mwords = (gint) (str_to_float(*(buff+2))/1000000); g_strfreev(buff); for (i=0; i<4; i++) { if (fgetline(fp, line)) { gui_text_show(ERROR, "unexpected end of file reading system options\n"); return(4); } } buff = tokenize(line, &num_tokens); model->gamess.time_limit = (gint) (str_to_float(*(buff+1))/60.0); g_strfreev(buff); flag++; break; } } if (!flag) { /* don't return... model_prep() needs to be called to avoid crashing */ gui_text_show(WARNING, "$SYSTEM OPTIONS not found\n"); } flag=0; /* anything else to find ? */ while (!fgetline(fp, line)) { if (g_ascii_strncasecmp(line, " GRADIENT OF THE ENERGY", 47) == 0) { if (fgetline(fp, line)) { gui_text_show(ERROR, "unexpected end of file reading gradient\n"); return(5); } while (g_ascii_strncasecmp(line, " MAXIMUM GRADIENT", 35) != 0) { if (fgetline(fp, line)) { gui_text_show(ERROR, "unexpected end of file reading gradient\n"); return(5); } } buff = tokenize(line, &num_tokens); model->gamess.max_grad = str_to_float(*(buff+3)); model->gamess.have_max_grad = TRUE; g_strfreev(buff); if (fgetline(fp, line)) { gui_text_show(ERROR, "unexpected end of file reading gradient\n"); return(5); } buff = tokenize(line, &num_tokens); model->gamess.rms_grad = str_to_float(*(buff+3)); model->gamess.have_rms_grad = TRUE; g_strfreev(buff); } } rewind(fp); /* Read the input coordinates - single frame has different format to multiframe */ if (model->gamess.run_type < GMS_OPTIMIZE) { /* is it a single frame job? */ while (!fgetline(fp, line)) { if (g_ascii_strncasecmp(line, " ATOM ATOMIC COORDINATES (BOHR)", 57) == 0) { read_gms_out_block(fp, model, 1, TRUE); flag++; break; } } } else { /* get optimisation parameters */ while (!fgetline(fp, line)) { if (g_ascii_strncasecmp(line, " STATIONARY POINT LOCATION RUN", 39) == 0) { for (i=0; i<7; i++) { if (fgetline(fp, line)) { gui_text_show(ERROR, "unexpected end of file reading optimizer options\n"); return(5); } } if (model->gamess.exe_type == GMS_CHECK) if (fgetline(fp, line)) { gui_text_show(ERROR, "unexpected end of file reading optimizer options\n"); return(5); } buff = tokenize(line, &num_tokens); if (read_keyword(&(*(buff+1))[1], method_types, &bad_andrew) > 0) { sprintf(line, "invalid method %s\n",&(*(buff+1))[1]); gui_text_show(ERROR, line); return(5); } model->gamess.opt_type = bad_andrew; g_strfreev(buff); flag++; if (fgetline(fp, line)) { gui_text_show(ERROR, "unexpected end of file reading optimizer options\n"); return(5); } if (fgetline(fp, line)) { gui_text_show(ERROR, "unexpected end of file reading optimizer options\n"); return(5); } buff = tokenize(line, &num_tokens); model->gamess.nstep = str_to_float(*(buff+2)); g_strfreev(buff); flag++; break; } } if (!flag) { gui_text_show(ERROR, "optimizer options not found\n"); return(5); } /* Are there any coordinates from a minimisation? */ flag=0; while (!fgetline(fp, line) && !model->gamess.converged) { /* coordinates */ if (g_ascii_strncasecmp(line, " COORDINATES OF ALL ATOMS ARE", 29) == 0) { /* go through all frames to count them */ add_frame_offset(fp, model); read_gms_out_block(fp, model, 2, FALSE); flag++; frame++; } } } /* property_string = g_string_new(""); g_string_append_printf(property_string, "%.0f", model->gamess.total_charge); property_add_ranked(2, "Total Charge", property_string->str, model); g_string_free(property_string, TRUE); property_string = g_string_new(""); g_string_append_printf(property_string, "%.0f", model->gamess.multiplicity); property_add_ranked(3, "Multiplicity", property_string->str, model); g_string_free(property_string, TRUE); */ property_string = g_string_new(""); i=0; while (basis_sets[i].label) { if ((basis_sets[i].basis == model->gamess.basis) && (basis_sets[i].ngauss == model->gamess.ngauss)) g_string_append_printf(property_string, "%s", basis_sets[i].label); i++; } property_add_ranked(7, "Basis", property_string->str, model); g_string_free(property_string, TRUE); /* done */ if (flag) { /* set frame if don't want last? */ strcpy(model->filename, filename); g_free(model->basename); model->basename = parse_strip(filename); model->num_frames = model->cur_frame = frame; model->cur_frame--; model_prep(model); } else return(2); return(0); }
gint read_about(gchar *filename, struct model_pak *model) { gint i, flag, frame, num_tokens, tot_tokens; gint natom=0, ntype=0; GString *title; gchar **buff, **curr_token, *ptr, *tmp, line[LINELEN]; struct core_pak *core; GSList *clist; FILE *fp; fp = fopen(filename, "rt"); if (!fp) return(1); flag=frame=0; while (!fgetline(fp, line)) { /* space group info */ if (g_ascii_strncasecmp(" Symmetries :", line, 13) == 0) { ptr = g_strrstr(line, "(#"); model->sginfo.spacenum = (gint) str_to_float(ptr+2); } /* default cell dimensions */ /* NB: gdis wants transposed ABINIT matrix */ if (g_ascii_strncasecmp(" Real(R)+Recip(G)", line, 17) == 0) { for (i=0; i<3; i++) { if (fgetline(fp, line)) { gui_text_show(ERROR, "unexpected end of file reading cell dimensions\n"); fclose(fp); return(2); } buff = tokenize(line, &num_tokens); model->latmat[0+i] = str_to_float(*(buff+1))*AU2ANG; model->latmat[3+i] = str_to_float(*(buff+2))*AU2ANG; model->latmat[6+i] = str_to_float(*(buff+3))*AU2ANG; g_strfreev(buff); } model->construct_pbc = TRUE; model->periodic = 3; /* last part of data in output file before minimisation */ break; } /* optimisation type */ if (g_ascii_strncasecmp(" optcell", line, 10) == 0) { buff = tokenize(line, &num_tokens); optcell = (gint) str_to_float(*(buff+1)); g_strfreev(buff); } /* coordinates */ if (g_ascii_strncasecmp(" natom", line, 10) == 0) { buff = tokenize(line, &num_tokens); natom = (gint) str_to_float(*(buff+1)); g_strfreev(buff); } /* NEW - cope with format change and avoid false positives */ // if (g_ascii_strncasecmp(" ntype", line, 10) == 0) if (g_strrstr(line, " ntyp")) { buff = tokenize(line, &num_tokens); ntype = (gint) str_to_float(*(buff+1)); g_strfreev(buff); } /* NEW - cope with format change and avoid false positives */ // if (g_ascii_strncasecmp(" type", line, 10) == 0) if (g_strrstr(line, " typ")) { tot_tokens = 0; buff = tokenize(line, &num_tokens); curr_token = buff + 1; while (tot_tokens < natom) { if (*curr_token == NULL) { g_strfreev(buff); buff = get_tokenized_line(fp, &num_tokens); curr_token = buff; } /* NB: number here is the internal reference to pseudopotential number */ core = core_new(*curr_token, NULL, model); model->cores = g_slist_prepend(model->cores, core); tot_tokens++; curr_token++; } model->cores = g_slist_reverse(model->cores); g_strfreev(buff); flag++; } if (g_ascii_strncasecmp(" xangst", line, 10) == 0) { clist = model->cores; if (clist == NULL) { gui_text_show(ERROR, "no atoms found\n"); fclose(fp); return(2); } buff = tokenize(line+10, &num_tokens); for (i=0; i<natom; i++) { core = clist->data; core->x[0] = str_to_float(*(buff+0)); core->x[1] = str_to_float(*(buff+1)); core->x[2] = str_to_float(*(buff+2)); g_strfreev(buff); buff = get_tokenized_line(fp, &num_tokens); clist = g_slist_next(clist); } } /* process the list of atom nuc charges to get atomic numbers */ if (g_ascii_strncasecmp(" znucl", line, 10) == 0) { buff = tokenize(line, &num_tokens); for (clist=model->cores ; clist ; clist=g_slist_next(clist)) { core = clist->data; if (core->atom_code > 0 && core->atom_code < num_tokens) { /* assign the atomic number */ core->atom_code = str_to_float(*(buff+core->atom_code)); /* wipe the label clean so the element symbol is used */ g_free(core->atom_label); core->atom_label = NULL; /* refresh atom's element data */ elem_init(core, model); } } } } /* Additional info */ while (!fgetline(fp, line)) { /* energy */ /* NEW - cope with format change */ if (g_strrstr(line, "Etotal=")) { buff = g_strsplit(line, "=", 2); if (buff) { model->abinit.energy = str_to_float(*(buff+1)); /* display energy in properties panel */ tmp = g_strdup_printf("%f Hartrees", model->abinit.energy); property_add_ranked(1, "Total energy", tmp, model); g_free(tmp); } g_strfreev(buff); } /* gradient */ else if ((g_ascii_strncasecmp(line, " frms,max,avg=", 14) == 0) && g_strrstr(line, "h/b")) { // printf("reading gradient\n"); buff = tokenize(line, &num_tokens); if (num_tokens > 2) { model->abinit.max_grad = str_to_float(*(buff+2)); model->abinit.rms_grad = str_to_float(*(buff+1)); property_add_ranked(1, "Gradient", *(buff+2), model); } g_strfreev(buff); // printf("gradient is %lf\n", model->abinit.max_grad); } /* coordinates */ else if ((g_ascii_strncasecmp(line, " Cartesian coordinates (bohr)", 29) == 0 && optcell == 0) || (g_ascii_strncasecmp(line, " Unit cell characteristics :", 28) == 0 && optcell > 0)) { /* go through all frames to count them */ read_about_block(fp, model); animate_frame_store(model); frame++; } } fclose(fp); /* done */ if (flag) { g_free(model->filename); model->filename = g_strdup(filename); g_free(model->basename); model->basename = parse_strip(filename); model->num_frames = model->cur_frame = frame; model->cur_frame--; title = g_string_new(""); g_string_append_printf(title, "E"); g_string_append_printf(title, " = %.4f Ha, ", model->abinit.energy); g_string_append_printf(title, "max grad = %.5f", model->abinit.max_grad); model->title = g_strdup(title->str); g_string_free(title, TRUE); model_prep(model); } else return(2); return(0); }
gint read_gms_out_block(FILE *fp, struct model_pak *model, gint num_skip, gint bohr) { gint i, num_tokens; gchar **buff, line[LINELEN]; GString *title, *energy_string, *grad_string; GSList *clist; struct core_pak *core; clist = model->cores; /* ignore first num_skip lines */ for (i=0 ; i<num_skip; i++) if (fgetline(fp, line)) { gui_text_show(ERROR, "unexpected end of file reading coordinates\n"); return(11); } model->construct_pbc = FALSE; model->fractional = FALSE; /* get 1st line of coords */ if (fgetline(fp, line)) { gui_text_show(ERROR, "unexpected end of file reading coordinates\n"); return(11); } buff = tokenize(line, &num_tokens); while (num_tokens > 4) { if (clist) { core = clist->data; clist = g_slist_next(clist); } else { core = new_core(elements[(int) str_to_float(*(buff+1))].symbol, model); model->cores = g_slist_append(model->cores, core); } if (bohr) { core->x[0] = BOHR_TO_ANGS*str_to_float(*(buff+2)); core->x[1] = BOHR_TO_ANGS*str_to_float(*(buff+3)); core->x[2] = BOHR_TO_ANGS*str_to_float(*(buff+4)); } else { core->x[0] = str_to_float(*(buff+2)); core->x[1] = str_to_float(*(buff+3)); core->x[2] = str_to_float(*(buff+4)); } /* get next line */ g_strfreev(buff); if (fgetline(fp, line)) { gui_text_show(ERROR, "unexpected end of file reading coordinates\n"); return(11); } buff = tokenize(line, &num_tokens); } g_strfreev(buff); /* search for energy */ while (!fgetline(fp, line)) { if (g_ascii_strncasecmp(line, " FINAL", 6) == 0) { buff = tokenize(line, &num_tokens); if (g_ascii_strncasecmp(*(buff+1), "ENERGY", 6) == 0) model->gamess.energy = str_to_float(*(buff+3)); else model->gamess.energy = str_to_float(*(buff+4)); model->gamess.have_energy = TRUE; g_strfreev(buff); break; } } /* update for MP? */ if (model->gamess.MP_level > 0) { while (!fgetline(fp, line)) { if (g_strrstr(line ,"E(MP2)") != NULL) { buff = tokenize(line, &num_tokens); model->gamess.energy = str_to_float(*(buff+1)); model->gamess.have_energy = TRUE; g_strfreev(buff); break; } } } /* search for gradient and read any properties */ while (!fgetline(fp, line)) { if (g_ascii_strncasecmp(line, " NET CHARGES:", 13) == 0) { clist = model->cores; /* skip forward four lines */ for (i=0 ; i<4; i++) if (fgetline(fp, line)) { gui_text_show(ERROR, "unexpected end of file reading fitted charges\n"); return(11); } while (clist != NULL) { buff = tokenize(line, &num_tokens); core = clist->data; core->lookup_charge = FALSE; core->charge = str_to_float(*(buff+1)); g_strfreev(buff); clist = g_slist_next(clist); if (fgetline(fp, line)) { gui_text_show(ERROR, "unexpected end of file reading fitted charges\n"); return(11); } } } if (g_ascii_strncasecmp(line, " MAXIMUM GRADIENT", 26) == 0) { buff = tokenize(line, &num_tokens); model->gamess.max_grad = str_to_float(*(buff+3)); model->gamess.have_max_grad = TRUE; model->gamess.rms_grad = str_to_float(*(buff+7)); model->gamess.have_rms_grad = TRUE; g_strfreev(buff); /* check next line to see if converged */ if (fgetline(fp, line)) { gui_text_show(ERROR, "unexpected end of file reading equilibrium status\n"); return(11); } if (g_ascii_strncasecmp(line, "1 ***** EQUILIBRIUM GEOMETRY LOCATED *****", 46) == 0) model->gamess.converged = TRUE; break; } } g_free(model->title); title = g_string_new(""); if (model->gamess.have_energy) { energy_string = g_string_new(""); g_string_append_printf(energy_string, "%.5f H", model->gamess.energy); property_add_ranked(3, "Energy", energy_string->str, model); g_string_free(energy_string, TRUE); g_string_append_printf(title, "E"); if (model->gamess.MP_level > 0) g_string_append_printf(title, "(MP%d)", model->gamess.MP_level); g_string_append_printf(title, " = %.5f H", model->gamess.energy); } if (model->gamess.have_rms_grad) { grad_string = g_string_new(""); g_string_append_printf(grad_string, "%.4f H/B", model->gamess.rms_grad); property_add_ranked(4, "RMS Gradient", grad_string->str, model); g_string_free(grad_string, TRUE); g_string_append_printf(title, ", grad = %.5f", model->gamess.rms_grad); } if (model->gamess.have_max_grad) { grad_string = g_string_new(""); g_string_append_printf(grad_string, "%.4f H/B", model->gamess.max_grad); property_add_ranked(4, "Maximum Gradient", grad_string->str, model); g_string_free(grad_string, TRUE); } model->title = g_strdup(title->str); g_string_free(title, TRUE); return(0); }
gint read_nwout_block(FILE *fp, struct model_pak *model) { gint num_tokens; gchar **buff, line[LINELEN], *text; GString *gstring; GSList *clist; struct core_pak *core; clist = model->cores; /* skip until get a 1 in first column for first coordinate */ if (fgetline(fp, line)) return(1); while (g_ascii_strncasecmp(line, " 1", 5) != 0) { if (fgetline(fp, line)) return(1); } buff = tokenize(line, &num_tokens); while (num_tokens > 0) { if (clist) { core = clist->data; clist = g_slist_next(clist); } else { core = new_core(*(buff+1), model); model->cores = g_slist_append(model->cores, core); } core->x[0] = str_to_float(*(buff+3)); core->x[1] = str_to_float(*(buff+4)); core->x[2] = str_to_float(*(buff+5)); #if DEBUG_READ_NWOUT P3VEC("coords: ", core->x); #endif /* get next line */ g_strfreev(buff); if (fgetline(fp, line)) return(2); buff = tokenize(line, &num_tokens); } g_strfreev(buff); /* read until get the details of the current optimisation step */ while (g_ascii_strncasecmp(line, "@", 1) != 0) { if (fgetline(fp, line)) return(0); } buff = tokenize(line, &num_tokens); while (g_ascii_strncasecmp(line, "@", 1) == 0) { if (g_ascii_isdigit(buff[1][0])) { text = format_value_and_units(*(buff+2), 5); gstring = g_string_new(text); g_free(text); g_string_append(gstring, " a.u."); property_add_ranked(3, "Energy", gstring->str, model); g_string_free(gstring, TRUE); text = format_value_and_units(*(buff+5), 5); gstring = g_string_new(text); g_free(text); g_string_append(gstring, " a.u./A"); property_add_ranked(4, "RMS Gradient", gstring->str, model); g_string_free(gstring, TRUE); } /* get next line */ g_strfreev(buff); if (fgetline(fp, line)) return(2); buff = tokenize(line, &num_tokens); } return(0); }