// no coords - just control data for the run // coords - .pdb file // topology - .frx file gint reaxmd_input_import(gpointer import) { gint *symbols, num_symbols, unknown; gchar *line, *fullname_model; gchar *filename, *filepath; gpointer scan, config; GString *unparsed; struct reaxmd_pak *reaxmd; struct model_pak *model; FILE *fp; scan = scan_new(import_fullpath(import)); if (!scan) return(1); /* populate symbol table */ reaxmd_symbols_init(scan); config = config_new(REAXMD, NULL); reaxmd = config_data(config); unparsed = g_string_new(NULL); while (!scan_complete(scan)) { symbols = scan_get_symbols(scan, &num_symbols); if (num_symbols) { unknown = FALSE; /* process first recognized symbol */ switch (symbols[0]) { case REAXMD_NSTEPS: reaxmd->total_steps = parse_nth_token_dup(1, scan_cur_line(scan)); break; case REAXMD_TIMESTEP: case REAXMD_TEMPERATURE: case REAXMD_THERMOSTAT: case REAXMD_BAROSTAT: case REAXMD_CUTOFF: case REAXMD_UPDATE: case REAXMD_NWRITE: case REAXMD_GRID: break; case REAXMD_PLUMED_FILE: filename = parse_nth_token_dup(1, scan_cur_line(scan)); filepath = g_build_filename(import_path(import), filename, NULL); //printf("Looking for: %s\n", filepath); if (g_file_test(filepath, G_FILE_TEST_EXISTS)) project_job_file_append(NULL, filepath, sysenv.workspace); else gui_text_show(ERROR, "REAXMD plumed file was not found!\n"); g_free(filename); g_free(filepath); break; default: unknown = TRUE; } g_free(symbols); } else unknown=TRUE; if (unknown) { line = scan_cur_line(scan); if (line) g_string_append(unparsed, line); } } config_unparsed_set(g_string_free(unparsed, FALSE), config); /* CURRENT - free this, until we add a GUI */ //import_object_add(IMPORT_CONFIG, config, import); config_free(config); /* done irx parse */ scan_free(scan); /* NEW - attempt to load reference coordinates */ fullname_model = parse_extension_set(import_fullpath(import), "pdb"); fp = fopen(fullname_model, "rt"); if (fp) { model = model_new(); read_pdb_block(fp, model); fclose(fp); import_object_add(IMPORT_MODEL, model, import); } else { gui_text_show(WARNING, "Failed to open reference PDB model for ReaxMD.\n"); } g_free(fullname_model); /* init */ import_init(import); return(0); }
gint read_nwchem_geometry(gpointer scan, struct model_pak *model) { gint n, zmode=0, end_count=0; gchar **buff; struct core_pak *core; #if DEBUG_READ_NWCHEM_GEOMETRY printf("read_nwchem_geometry(): start\n"); #endif // TODO - rewrite this using symbol scanning functionality while (!scan_complete(scan)) { buff = scan_get_tokens(scan, &n); // zmatrix? if (g_ascii_strncasecmp(*buff, "zmatrix", 7) == 0) { zmode = 1; g_strfreev(buff); continue; } if (g_ascii_strncasecmp(*buff, "variables", 9) == 0) { zmode = 2; g_strfreev(buff); continue; } if (g_ascii_strncasecmp(*buff, "constants", 9) == 0) { zmode = 3; g_strfreev(buff); continue; } // end? if (n) { if (g_ascii_strncasecmp(*buff, "end", 3) == 0) { g_strfreev(buff); /* if we processed zmatrix entries - expect 2 x end */ if (zmode && !end_count) { /* keep going until we hit a second end ... */ end_count++; continue; } /* exit */ break; } } /* main parse */ switch (zmode) { // cartesian coords case 0: // can cart coord line have >4 tokens? if (n == 4) { if (elem_test(*buff)) { core = core_new(*buff, NULL, model); model->cores = g_slist_prepend(model->cores, core); core->x[0] = str_to_float(*(buff+1)); core->x[1] = str_to_float(*(buff+2)); core->x[2] = str_to_float(*(buff+3)); #if DEBUG_READ_NWCHEM_GEOMETRY printf("Added [%s] ", *buff); P3VEC(": ", core->x); #endif } } break; // zmatrix coords case 1: #if DEBUG_READ_NWCHEM_GEOMETRY printf("zcoord: %s", scan_cur_line(scan)); #endif zmat_nwchem_core_add(scan_cur_line(scan), model->zmatrix); break; // zmatrix vars case 2: #if DEBUG_READ_NWCHEM_GEOMETRY printf("zvar: %s", scan_cur_line(scan)); #endif zmat_var_add(scan_cur_line(scan), model->zmatrix); break; // zmatrix consts case 3: #if DEBUG_READ_NWCHEM_GEOMETRY printf("zconst: %s", scan_cur_line(scan)); #endif zmat_const_add(scan_cur_line(scan), model->zmatrix); break; } g_strfreev(buff); } if (zmode) { #if DEBUG_READ_NWCHEM_GEOMETRY printf("Creating zmatrix cores...\n"); #endif zmat_angle_units_set(model->zmatrix, DEGREES); zmat_process(model->zmatrix, model); } #if DEBUG_READ_NWCHEM_GEOMETRY printf("read_nwchem_geometry(): stop\n"); #endif return(0); }
gint nwchem_input_import(gpointer import) { gint *symbols, num_symbols, num_tokens, value; gchar *line, **buff; gpointer scan, config; GString *unparsed; struct model_pak *model=NULL; // CURRENT - will break if more than one in a file struct nwchem_pak *nwchem; scan = scan_new(import_fullpath(import)); if (!scan) return(1); /* populate symbol table */ nwchem_scan_symbols_init(scan); config = config_new(NWCHEM, NULL); nwchem = config_data(config); unparsed = g_string_new(NULL); while (!scan_complete(scan)) { symbols = scan_get_symbols(scan, &num_symbols); if (num_symbols) { /* process first recognized symbol */ value = symbols[0]; switch (value) { case NWCHEM_START: /* TODO - could this serve as title? */ nwchem->start = parse_strip(scan_cur_line(scan)); break; case NWCHEM_BASIS: // TODO - don't want to use this for predefined basis sets read_nwchem_basis_library(scan, config); break; case NWCHEM_CHARGE: line = scan_cur_line(scan); buff = tokenize(line, &num_tokens); if (num_tokens > 1) nwchem->charge = g_strdup(buff[1]); g_strfreev(buff); break; case NWCHEM_GEOMETRY: if (!model) { model = model_new(); import_object_add(IMPORT_MODEL, model, import); } read_nwchem_geometry(scan, model); break; case NWCHEM_SYSTEM: if (!model) { model = model_new(); import_object_add(IMPORT_MODEL, model, import); } read_nwchem_system(scan, model); break; case NWCHEM_TASK: read_nwchem_task(scan, config, symbols, num_symbols); break; default: /* add lines that have recognized symbols (but no special trigger) to unparsed */ /* this'll happen for symbols that occur in multiple locations (eg dft) */ line = scan_cur_line(scan); if (line) g_string_append(unparsed, line); } g_free(symbols); } else { /* add non-NULL lines to unparsed list */ line = scan_cur_line(scan); if (line) g_string_append(unparsed, line); } } config_unparsed_set(g_string_free(unparsed, FALSE), config); import_object_add(IMPORT_CONFIG, config, import); scan_free(scan); import_init(import); return(0); }
gint read_rietica(gchar *filename, struct model_pak *model) { gint i, phases=0, skip, num_tokens; gchar **buff, *line; float x, y, z; gpointer scan; GSList *list; struct core_pak *core; /* checks */ g_assert(model != NULL); scan = scan_new(filename); if (!scan) return(1); /* FIXME - stop the previous file routines setting this */ model->id = -1; while (!scan_complete(scan)) { buff = scan_get_tokens(scan, &num_tokens); /* search for structure start */ if (num_tokens) { if (g_ascii_strncasecmp(*buff, "***", 3) == 0) { if (phases) model = model_new(); phases++; /* structure name - omit the 1st and last tokens (ie "***") */ if (num_tokens > 1) { g_free(*(buff+num_tokens-1)); *(buff+num_tokens-1) = NULL; g_free(model->basename); model->basename = g_strjoinv(" ", buff+1); } /* parse spacegroup */ line = scan_get_line(scan); line = scan_get_line(scan); model->sginfo.spacename = g_strstrip(g_strdup(line)); model->sginfo.spacenum = -1; /* parse a structure */ skip = 0; while (!scan_complete(scan)) { g_strfreev(buff); buff = scan_get_tokens(scan, &num_tokens); if (num_tokens) { if (elem_symbol_test(*buff)) { /* new core */ /* if (num_tokens > 6) */ { core = new_core(*buff, model); model->cores = g_slist_prepend(model->cores, core); /* formatted output can result in -ve signs "joining" tokens */ line = scan_cur_line(scan); /* no doubt some fortran programmer thought this was a clever format */ sscanf(line, "%*16c%8f%8f%8f", &x, &y, &z); VEC3SET(core->x, x, y, z); /* printf("> %s", line); P3VEC(" - ", core->x); core->x[0] = str_to_float(*(buff+2)); core->x[1] = str_to_float(*(buff+3)); core->x[2] = str_to_float(*(buff+4)); core->sof = str_to_float(*(buff+6)); */ skip = 0; } } else skip++; } /* 4 lines after the last core - parse cell info and terminate structure */ if (skip == 4) { if (num_tokens > 5) { for (i=6 ; i-- ; ) model->pbc[i] = str_to_float(*(buff+i)); model->pbc[3] *= D2R; model->pbc[4] *= D2R; model->pbc[5] *= D2R; } break; } } } } g_strfreev(buff); } /* setup all new structures */ for (list=sysenv.mal ; list ; list=g_slist_next(list)) { model = list->data; if (model->id == -1) { model->id = RIETICA; model->periodic = 3; model->fractional = TRUE; strcpy(model->filename, filename); model->cores = g_slist_reverse(model->cores); model_prep(model); } } scan_free(scan); return(0); }