int SaveIonization(cfac_t *cfac, int nb, int *b, int nf, int *f, char *fn) { int i, j, k; int ie, ip; FILE *file; LEVEL *lev1, *lev2; CI_RECORD r; CI_HEADER ci_hdr; F_HEADER fhdr; double delta, emin, emax, e, emax0; double qk[MAXNE], qku[MAXNUSR]; int nq, nqk; ARRAY subte; int isub, n_tegrid0, n_egrid0, n_usr0; int te_set, e_set, usr_set; double c, e0, e1; emin = 1E10; emax = 1E-10; k = 0; for (i = 0; i < nb; i++) { lev1 = GetLevel(cfac, b[i]); for (j = 0; j < nf; j++) { lev2 = GetLevel(cfac, f[j]); e = lev2->energy - lev1->energy; if (e > 0) k++; if (e < emin && e > 0) emin = e; if (e > emax) emax = e; } } if (k == 0) { return 0; } if (tegrid[0] < 0) { te_set = 0; } else { te_set = 1; } if (egrid[0] < 0) { e_set = 0; } else { e_set = 1; } if (usr_egrid[0] < 0) { usr_set = 0; } else { usr_set = 1; } n_tegrid0 = n_tegrid; n_egrid0 = n_egrid; n_usr0 = n_usr; if (egrid_limits_type == 0) { emax0 = 0.5*(emin + emax)*egrid_max; } else { emax0 = egrid_max; } ArrayInit(&subte, sizeof(double), 128, NULL, NULL); ArrayAppend(&subte, &emin); c = TE_MAX_MIN; if (!e_set || !te_set) { e = c*emin; while (e < emax) { ArrayAppend(&subte, &e); e *= c; } } ArrayAppend(&subte, &emax); egrid_type = 1; pw_type = 0; if (usr_egrid_type < 0) usr_egrid_type = 1; nqk = NPARAMS; r.params = malloc(sizeof(float)*nqk); fhdr.type = DB_CI; strcpy(fhdr.symbol, cfac_get_atomic_symbol(cfac)); fhdr.atom = cfac_get_atomic_number(cfac); ci_hdr.nele = GetNumElectrons(cfac, b[0]); ci_hdr.qk_mode = qk_mode; ci_hdr.nparams = nqk; ci_hdr.pw_type = pw_type; ci_hdr.egrid_type = egrid_type; ci_hdr.usr_egrid_type = usr_egrid_type; file = OpenFile(fn, &fhdr); e0 = emin*0.999; for (isub = 1; isub < subte.dim; isub++) { e1 = *((double *) ArrayGet(&subte, isub)); if (isub == subte.dim-1) e1 = e1*1.001; emin = e1; emax = e0; k = 0; for (i = 0; i < nb; i++) { lev1 = GetLevel(cfac, b[i]); for (j = 0; j < nf; j++) { lev2 = GetLevel(cfac, f[j]); e = lev2->energy - lev1->energy; if (e < e0 || e >= e1) continue; if (e < emin) emin = e; if (e > emax) emax = e; k++; } } if (k == 0) { e0 = e1; continue; } if (qk_mode == QK_CB) { SetIEGrid(1, emin, emax); } else { if (n_tegrid0 == 0) { n_tegrid = 3; } if (!te_set) { e = 2.0*(emax-emin)/(emax+emin); if (e < EPS3) { SetIEGrid(1, emin, emax); } else if (e < 0.5) { SetIEGrid(2, emin, emax); } else { if (k == 2) n_tegrid = 2; SetIEGrid(n_tegrid, emin, emax); } } } n_egrid = n_egrid0; n_usr = n_usr0; if (!usr_set) usr_egrid[0] = -1.0; if (!e_set) egrid[0] = -1.0; e = 0.5*(emin + emax); if (egrid_limits_type == 0) { emin = egrid_min*e; emax = egrid_max*e; } else { emin = egrid_min; emax = egrid_max; } if (emax < emax0) { emax = 50.0*e; if (emax > emax0) emax = emax0; } if (n_egrid <= 0) { n_egrid = 6; } if (egrid[0] < 0.0) { SetCIEGrid(n_egrid, emin, emax, e); } usr_different = 1; if (n_usr > 0 && usr_egrid[0] < 0.0) { SetUsrCIEGrid(n_usr, emin, emax, e); usr_egrid_type = 1; usr_different = 0; } if (n_usr <= 0) { SetUsrCIEGridDetail(n_egrid, egrid); usr_egrid_type = 1; usr_different = 0; } if (qk_mode != QK_CB) { SetTransitionOptions(cfac, G_BABUSHKIN, M_NR, 4, 4); SetRRTEGrid(1, e, e); SetPEGridLimits(egrid_min, egrid_max, egrid_limits_type); SetPEGridDetail(n_egrid, egrid); PrepRREGrids(e, emax0); } for (ie = 0; ie < n_egrid; ie++) { for (i = 0; i < n_tegrid; i++) { xegrid[i][ie] = egrid[ie]/tegrid[i]; if (egrid_type == 1) xegrid[i][ie] += 1.0; log_xegrid[i][ie] = log(xegrid[i][ie]); } } yegrid0[0] = log(1E-5); delta = (log(0.5) - yegrid0[0])/(NINT-1.0); for (i = 1; i < NINT; i++) { yegrid0[i] = yegrid0[i-1] + delta; } for (i = 0; i < NINT; i++) { yegrid0[i] = exp(yegrid0[i]); } if (pw_scratch.nkl == 0) { SetCIPWGrid(0, NULL, NULL); } r.strength = malloc(sizeof(float)*n_usr); ci_hdr.n_tegrid = n_tegrid; ci_hdr.n_egrid = n_egrid; ci_hdr.n_usr = n_usr; ci_hdr.tegrid = tegrid; ci_hdr.egrid = egrid; ci_hdr.usr_egrid = usr_egrid; InitFile(file, &fhdr, &ci_hdr); for (i = 0; i < nb; i++) { lev1 = GetLevel(cfac, b[i]); for (j = 0; j < nf; j++) { lev2 = GetLevel(cfac, f[j]); e = lev2->energy - lev1->energy; if (e < e0 || e >= e1) continue; nq = IonizeStrength(cfac, qku, qk, &e, b[i], f[j]); if (nq < 0) continue; r.b = b[i]; r.f = f[j]; r.kl = nq; for (ip = 0; ip < nqk; ip++) { r.params[ip] = (float) qk[ip]; } for (ie = 0; ie < n_usr; ie++) { r.strength[ie] = (float) qku[ie]; } WriteCIRecord(file, &r); } } DeinitFile(file, &fhdr); free(r.strength); ReinitRadial(cfac, 1); FreeRecQk(); FreeRecPk(); FreeIonizationQk(); e0 = e1; } free(r.params); ReinitRecombination(1); ReinitIonization(1); ArrayFree(&subte); CloseFile(file, &fhdr); return 0; }
int StoreInit(const cfac_t *cfac, const char *fn, int reset, sqlite3 **db, unsigned long *sid) { int retval = 0; struct stat sb; sqlite3_stmt *stmt; int rc; const char *sql; char *errmsg; int need_truncate = 0, need_init = 0; *sid = (unsigned long) time(NULL); if (reset) { need_truncate = 1; need_init = 1; } if (stat(fn, &sb) == -1) { if (errno == ENOENT) { need_truncate = 0; need_init = 1; } else { perror("stat"); return -1; } } else { if (sb.st_size == 0) { need_truncate = 0; need_init = 1; } } if (need_truncate) { if (truncate(fn, 0)) { return -1; } } rc = sqlite3_open(fn, db); if (rc) { fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(*db)); sqlite3_close(*db); return -1; } rc = sqlite3_exec(*db, "PRAGMA foreign_keys = ON", NULL, NULL, &errmsg); if (rc != SQLITE_OK) { fprintf(stderr, "SQL error: %s\n", errmsg); sqlite3_free(errmsg); sqlite3_close(*db); return -1; } if (need_init) { int i = 0; while ((sql = schema_str[i])) { rc = sqlite3_exec(*db, sql, NULL, NULL, &errmsg); if (rc != SQLITE_OK) { fprintf(stderr, "SQL error: %s\n", errmsg); sqlite3_free(errmsg); sqlite3_close(*db); retval = -1; break; } i++; } sql = "INSERT INTO cfacdb" \ " (property, value)" \ " VALUES ('format', ?)"; sqlite3_prepare_v2(*db, sql, -1, &stmt, NULL); sqlite3_bind_int(stmt, 1, CFACDB_FORMAT_VERSION); rc = sqlite3_step(stmt); if (rc != SQLITE_DONE) { fprintf(stderr, "SQL error: %s\n", sqlite3_errmsg(*db)); sqlite3_close(*db); retval = -1; } sqlite3_reset(stmt); } else { int db_format; sql = "SELECT value FROM cfacdb WHERE property = 'format'"; rc = sqlite3_exec(*db, sql, format_cb, &db_format, &errmsg); if (rc != SQLITE_OK) { fprintf(stderr, "SQL error: %s\n", errmsg); sqlite3_free(errmsg); sqlite3_close(*db); return -1; } if (db_format != CFACDB_FORMAT_VERSION) { fprintf(stderr, "Incompatible DB format %d, expected %d\n", db_format, CFACDB_FORMAT_VERSION); sqlite3_free(errmsg); sqlite3_close(*db); return -1; } } sql = "INSERT INTO sessions" \ " (sid, version, uta, cmdline)" \ " VALUES (?, ?, ?, '')"; sqlite3_prepare_v2(*db, sql, -1, &stmt, NULL); sqlite3_bind_int(stmt, 1, *sid); sqlite3_bind_int(stmt, 2, 10000*CFAC_VERSION + 100*CFAC_SUBVERSION + CFAC_SUBSUBVERSION); sqlite3_bind_int(stmt, 3, cfac->uta ? 1:0); rc = sqlite3_step(stmt); if (rc != SQLITE_DONE) { fprintf(stderr, "SQL error: %s\n", sqlite3_errmsg(*db)); sqlite3_close(*db); retval = -1; } sqlite3_reset(stmt); sql = "INSERT INTO species (sid, symbol, anum, mass) VALUES (?, ?, ?, ?)"; sqlite3_prepare_v2(*db, sql, -1, &stmt, NULL); sqlite3_bind_int (stmt, 1, *sid); SQLITE3_BIND_STR (stmt, 2, cfac_get_atomic_symbol(cfac)); sqlite3_bind_int (stmt, 3, cfac_get_atomic_number(cfac)); sqlite3_bind_double(stmt, 4, cfac_get_atomic_mass(cfac)); rc = sqlite3_step(stmt); if (rc != SQLITE_DONE) { fprintf(stderr, "SQL error: %s\n", sqlite3_errmsg(*db)); sqlite3_close(*db); retval = -1; } sqlite3_finalize(stmt); return retval; }
int SaveIonizationMSub(cfac_t *cfac, int nb, int *b, int nf, int *f, char *fn) { FILE *file; LEVEL *lev1, *lev2; CIM_RECORD r; CIM_HEADER ci_hdr; F_HEADER fhdr; double qku[MAXNUSR*MAXMSUB]; double delta, emin, emax, e, emax0; int nq, i, j, k, ie; emin = 1E10; emax = 1E-10; k = 0; for (i = 0; i < nb; i++) { lev1 = GetLevel(cfac, b[i]); for (j = 0; j < nf; j++) { lev2 = GetLevel(cfac, f[j]); e = lev2->energy - lev1->energy; if (e > 0) k++; if (e < emin && e > 0) emin = e; if (e > emax) emax = e; } } if (k == 0) { return 0; } if (egrid_limits_type == 0) { emax0 = 0.5*(emin + emax)*egrid_max; } else { emax0 = egrid_max; } e = 0.5*(emin + emax); if (egrid_limits_type == 0) { emin = egrid_min*e; emax = egrid_max*e; } else { emin = egrid_min; emax = egrid_max; } if (emax < emax0) { emax = 50.0*e; if (emax > emax0) emax = emax0; } egrid_type = 1; if (usr_egrid_type < 0) usr_egrid_type = 1; if (n_egrid <= 0) n_egrid = 6; if (egrid[0] < 0.0) { SetCIEGrid(n_egrid, emin, emax, e); } if (n_usr > 0 && usr_egrid[0] < 0.0) { SetUsrCIEGrid(n_usr, emin, emax, e); usr_egrid_type = 1; } if (n_usr <= 0) { SetUsrCIEGridDetail(n_egrid, egrid); usr_egrid_type = 1; } fhdr.type = DB_CIM; strcpy(fhdr.symbol, cfac_get_atomic_symbol(cfac)); fhdr.atom = cfac_get_atomic_number(cfac); ci_hdr.nele = GetNumElectrons(cfac, b[0]); ci_hdr.egrid_type = egrid_type; ci_hdr.usr_egrid_type = usr_egrid_type; file = OpenFile(fn, &fhdr); yegrid0[0] = log(1E-5); delta = (log(0.5)-yegrid0[0])/(NINT-1.0); for (i = 1; i < NINT; i++) { yegrid0[i] = yegrid0[i-1] + delta; } for (i = 0; i < NINT; i++) { yegrid0[i] = exp(yegrid0[i]); } if (pw_scratch.nkl == 0) { SetCIPWGrid(0, NULL, NULL); } ci_hdr.n_egrid = n_egrid; ci_hdr.n_usr = n_usr; ci_hdr.egrid = egrid; ci_hdr.usr_egrid = usr_egrid; InitFile(file, &fhdr, &ci_hdr); for (i = 0; i < nb; i++) { lev1 = GetLevel(cfac, b[i]); for (j = 0; j < nf; j++) { lev2 = GetLevel(cfac, f[j]); e = lev2->energy - lev1->energy; nq = IonizeStrengthMSub(cfac, qku, &e, b[i], f[j]); if (nq < 0) continue; r.b = b[i]; r.f = f[j]; r.nsub = nq; r.strength = malloc(sizeof(float)*nq*n_usr); for (ie = 0; ie < nq*n_usr; ie++) { r.strength[ie] = qku[ie]; } WriteCIMRecord(file, &r); free(r.strength); } } DeinitFile(file, &fhdr); CloseFile(file, &fhdr); ReinitIonization(1); return 0; }