Beispiel #1
0
/* \int R(n0,l0)R(n1,l1)r */
double HydrogenicDipole(const cfac_t *cfac, int n0, int l0, int n1, int l1) {
    gsl_coulomb_me *r, ***qk;
    double z, am, scale;

    if (n0 > n1) {
        int tmp;
        
        tmp = n0; n0 = n1; n1 = tmp;
        tmp = l0; l0 = l1; l1 = tmp;
    }

    if (l1 != l0 + 1 && l1 != l0 - 1) {
        return 0.0;
    }
    
    z  = GetResidualZ(cfac);
    am = cfac_get_atomic_mass(cfac);
    scale = gsl_coulomb_me_scale(z, am);

    qk = ArraySet(cfac->coulomb.dipole_array, n1, NULL);
    if (*qk == NULL) {
        int np;

        *qk = malloc(n1*sizeof(gsl_coulomb_me *));

        for (np = 1; np <= n1; np++) {
            r = gsl_coulomb_me_alloc(n1, np);
            (*qk)[np - 1] = r;
        }
    }

    r = (*qk)[n0 - 1];

    return scale*gsl_coulomb_me_get(r, l1, l0);
}
Beispiel #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;
}