Example #1
0
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;
}
Example #2
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;
}
Example #3
0
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;
}