gint read_dmol(gchar *filename, struct model_pak *model) { gint flag; FILE *fp; /* checks */ g_return_val_if_fail(model != NULL, 1); g_return_val_if_fail(filename != NULL, 2); fp = fopen(filename,"rt"); if (!fp) return(3); /* loop while there's data */ flag=0; model->num_frames = 0; read_dmol_frame(fp, model); for (;;) { add_frame_offset(fp, model); if (read_dmol_frame(fp, NULL)) break; model->num_frames++; } /* get rid of frame list if only one frame */ if (model->num_frames == 1) { free_list(model->frame_list); model->frame_list = NULL; } /* model setup */ strcpy(model->filename, filename); g_free(model->basename); model->basename = parse_strip(filename); model_prep(model); return(0); }
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); }