void model_print(model* m, char offset[]) { int i; enkf_printf("%smodel info:\n", offset); enkf_printf("%s name = %s\n", offset, m->name); enkf_printf("%s %d variables:\n", offset, m->nvar); for (i = 0; i < m->nvar; ++i) { variable* v = &m->vars[i]; enkf_printf("%s %s:\n", offset, v->name); enkf_printf("%s grid = \"%s\"\n", offset, grid_getname(model_getgridbyid(m, v->gridid))); if (isnan(v->inf_ratio)) enkf_printf("%s inflation = %.3f PLAIN\n", offset, v->inflation); else enkf_printf("%s inflation = %.3f %.2f\n", offset, v->inflation, v->inf_ratio); if (!isnan(v->deflation)) enkf_printf("%s randomise: deflation = %.3f, sigma = %.3f\n", offset, v->deflation, v->sigma); } enkf_printf("%s %d modeldata:\n", offset, m->ndata); for (i = 0; i < m->ndata; ++i) { enkf_printf("%s %s:\n", offset, m->data[i].tag); if (m->data[i].alloctype == ALLOCTYPE_1D) enkf_printf("%s type = 1D\n", offset); else if (m->data[i].alloctype == ALLOCTYPE_2D) enkf_printf("%s type = 2D\n", offset); else if (m->data[i].alloctype == ALLOCTYPE_3D) enkf_printf("%s type = 3D\n", offset); } }
void* model_getgridbyname(model* m, char name[]) { int i; for (i = 0; i < m->ngrid; ++i) if (strcmp(grid_getname(m->grids[i]), name) == 0) return m->grids[i]; return NULL; }
void* model_getgridbyname(model* m, char name[]) { int i; for (i = 0; i < m->ngrid; ++i) if (strcmp(grid_getname(m->grids[i]), name) == 0) return m->grids[i]; enkf_quit("model_getgridbyname(): found no grid named \"%s\"", name); return NULL; }
model* model_create(enkfprm* prm) { model* m = calloc(1, sizeof(model)); char* modelprm = prm->modelprm; char* gridprm = prm->gridprm; model_setgrids(m, gridprm); /* * read model parameter file */ { FILE* f = NULL; char buf[MAXSTRLEN]; int line; variable* now = NULL; /* * get model tag, type and variables */ f = enkf_fopen(modelprm, "r"); line = 0; while (fgets(buf, MAXSTRLEN, f) != NULL) { char seps[] = " =\t\n"; char* token = NULL; line++; if (buf[0] == '#') continue; if ((token = strtok(buf, seps)) == NULL) continue; if (strcasecmp(token, "NAME") == 0) { if ((token = strtok(NULL, seps)) == NULL) enkf_quit("%s, l.%d: NAME not specified", modelprm, line); else if (m->name != NULL) enkf_quit("%s, l.%d: NAME specified twice", modelprm, line); else m->name = strdup(token); } else if (strncasecmp(token, "VAR", 3) == 0) { int i; if ((token = strtok(NULL, seps)) == NULL) enkf_quit("%s, l.%d: VAR not specified", modelprm, line); for (i = 0; i < m->nvar; ++i) if (strcasecmp(m->vars[i].name, token) == 0) enkf_quit("%s, l.%d: VAR \"%s\" already specified", modelprm, line, token); if (m->nvar % NVAR_INC == 0) m->vars = realloc(m->vars, (m->nvar + NVAR_INC) * sizeof(variable)); now = &m->vars[m->nvar]; variable_new(now, m->nvar, token); m->nvar++; } else if (strcasecmp(token, "GRID") == 0) { int i; if (now == NULL) enkf_quit("%s, l.%d: VAR not specified", modelprm, line); if (now->gridid >= 0) enkf_quit("%s, l.%d: GRID already specified for \"%s\"", modelprm, line, now->name); if ((token = strtok(NULL, seps)) == NULL) enkf_quit("%s, l.%d: GRID not specified", modelprm, line); for (i = 0; i < m->ngrid; ++i) if (strcasecmp(token, grid_getname(m->grids[i])) == 0) { now->gridid = i; break; } if (i == m->ngrid) enkf_quit("%s, l.%d: grid \"%s\" not specified", modelprm, line, token); } else if (strcasecmp(token, "INFLATION") == 0) { if (now == NULL) enkf_quit("%s, l.%d: VAR not specified", modelprm, line); if (!isnan(now->inflation)) enkf_quit("%s, l.%d: INFLATION already specified for \"%s\"", modelprm, line, now->name); if ((token = strtok(NULL, seps)) == NULL) enkf_quit("%s, l.%d: INFLATION not specified", modelprm, line); if (!str2double(token, &now->inflation)) enkf_quit("%s, l.%d: could not convert \"%s\" to double", modelprm, line, token); if ((token = strtok(NULL, seps)) != NULL) { if (!str2double(token, &now->inf_ratio)) enkf_quit("%s, l.%d: could not convert \"%s\" to double", modelprm, line, token); } } else enkf_quit("%s, l.%d: unknown token \"%s\"", modelprm, line, token); } /* while reading modelprm */ fclose(f); assert(m->name != NULL); assert(m->nvar > 0); { int i; for (i = 0; i < m->nvar; ++i) if (m->vars[i].gridid == -1) { if (m->ngrid == 1) m->vars[i].gridid = 0; else enkf_quit("%s: grid not specified for variable \"%s\"\n", modelprm, m->vars[i].name); } } } /* * set inflations */ { int i; for (i = 0; i < m->nvar; ++i) if (isnan(m->vars[i].inflation)) { m->vars[i].inflation = prm->inflation_base; m->vars[i].inf_ratio = prm->inf_ratio; } prm->inflation_base = NaN; prm->inf_ratio = NaN; } model_print(m, " "); assert(m->ngrid > 0); return m; }