コード例 #1
0
ファイル: init.c プロジェクト: mtmiron/toi
void
toi_init(int argc, char **argv)
{
	gv_tbl = st_init_numtable();

	Init_thread();
	THREAD(cur_thr)->recv = main_thread();
	if (THREAD(main_thread())->env_tbl)
		st_free_table(THREAD(main_thread())->env_tbl);
	THREAD(main_thread())->env_tbl = gv_tbl;

	Init_symbol();
	Init_class();

	/* have to call Init_thread() again */
	Init_thread();

	Init_kernel();
	cself = cKernel;
	Init_numeric();
	Init_float();
	Init_integer();
	Init_array();
	Init_hash();
	Init_string();
	Init_iostream();
	Init_exception();

	toi_set_argv(argc, argv);

	Init_gc();

	signal(SIGINT, handle_sigint);
}
コード例 #2
0
ファイル: statistics.c プロジェクト: fweik/p3m-standalone
void rshif_array( int N, FLOAT_TYPE *data, int shift ) {
    FLOAT_TYPE *buf = Init_array( N, sizeof(FLOAT_TYPE));
    for(int i=0; i<N; i++)
        buf[(shift+i) % N] = data[i];
    for(int i=0; i<N; i++)
        data[i] = buf[i];

    fftw_free(buf);
}
コード例 #3
0
ファイル: statistics.c プロジェクト: fweik/p3m-standalone
FLOAT_TYPE *low_pass_forward( int N, FLOAT_TYPE *data, FLOAT_TYPE alpha) {
    FLOAT_TYPE *ret = Init_array( N, 2*sizeof(FLOAT_TYPE));

    ret[0] = data[0];
    ret[1] = data[1];
    for(int i = 1; i<N; i++) {
        ret[2*i  ] = data[2*i];
        ret[2*i+1] = ret[2*i-1] + alpha * ( data[2*i+1] - ret[2*i-1]);
    }
    return ret;
}
コード例 #4
0
ファイル: statistics.c プロジェクト: fweik/p3m-standalone
FLOAT_TYPE *low_pass_backward( int N, FLOAT_TYPE *data, FLOAT_TYPE alpha) {
    FLOAT_TYPE *ret = Init_array( N, 2*sizeof(FLOAT_TYPE));

    ret[2*N-1] = data[2*N-1];
    ret[2*N-2] = data[2*N-2];

    for(int i = N - 2; i>=0; i--) {
        ret[2*i  ] = data[2*i];
        ret[2*i+1] = ret[2*i+3] + alpha * ( data[2*i+1] - ret[2*i+3]);
    }
    return ret;
}
コード例 #5
0
ファイル: statistics.c プロジェクト: fweik/p3m-standalone
FLOAT_TYPE *radial_charge_distribution(FLOAT_TYPE r_min, FLOAT_TYPE r_max, int bins, system_t *s) {
    FLOAT_TYPE *rdf = Init_array( bins, 2*sizeof(FLOAT_TYPE));

    FLOAT_TYPE dr = (r_max - r_min) / bins, dx, dy, dz, r2, r, r_min2, r_max2;
    FLOAT_TYPE lengthi = 1.0/s->length;
    int n=0, bin;
    FLOAT_TYPE r_in, r_out;
    FLOAT_TYPE bin_volume;

    memset(rdf, 0, 2*bins*sizeof(FLOAT_TYPE));

    r_min2 = SQR(r_min);
    r_max2 = SQR(r_max);

    for(int i=0; i<s->nparticles; i++) {
        for(int j=0; j<s->nparticles; j++) {
            if(i==j)
                continue;
            dx = s->p->x[i] - s->p->x[j];
            dx -= ROUND(dx*lengthi)*s->length;
            dy = s->p->y[i] - s->p->y[j];
            dy -= ROUND(dy*lengthi)*s->length;
            dz = s->p->z[i] - s->p->z[j];
            dz -= ROUND(dz*lengthi)*s->length;

            r2 = SQR(dx) + SQR(dy) + SQR(dz);

            if((r2 < r_min2) || (r2 > r_max2))
                continue;

            r = SQRT(r2);

            bin = (int)((r - r_min)/dr);

            rdf[2*bin+1]+= s->q[i] * s->q[j];
            n++;
        }

    }
    printf("#rdf[0] %lf\n", rdf[0]);
    printf("#rdf[1] %lf\n", rdf[1]);
    printf("#rdf[2] %lf\n", rdf[2]);
    for(int i=0; i<bins; i++) {
        r_in = i*dr + r_min;
        r_out = r_in + dr;

        bin_volume = 4.0/3.0 * PI * (r_out *r_out*r_out - r_in * r_in * r_in );
        rdf[2*i] = 0.5 * (r_in + r_out);
        rdf[2*i+1] /= n * bin_volume / (s->length *SQR(s->length));
    }
    return rdf;
}
コード例 #6
0
ファイル: statistics.c プロジェクト: fweik/p3m-standalone
FLOAT_TYPE *rdf_fft( int N, FLOAT_TYPE *rdf) {
    fftw_plan p;
    FLOAT_TYPE *data = Init_array( N, 2*sizeof(FLOAT_TYPE));

    p = fftw_plan_dft_1d( N, (fftw_complex *)data,  (fftw_complex *)data, FFTW_FORWARD, FFTW_PATIENT);

    memset(data, 0, 2*N*sizeof(FLOAT_TYPE));

    for(int i=0; i<N; i++)
        data[2*i] = rdf[2*i+1];

    FFTW_EXECUTE(p);

    return data;
}
コード例 #7
0
parameters_t *Tune( const method_t *m, system_t *s, FLOAT_TYPE precision, FLOAT_TYPE rcut ) {
  parameters_t *p = Init_array( 1, sizeof( parameters_t ) );
  //Parameter iteraters, best parameter set
  parameters_t it, p_best;
  // Array to store forces
  forces_t *f = Init_forces(s->nparticles);

  data_t *d = NULL;

  FLOAT_TYPE rcut_max = 0.5 * s->length;
  FLOAT_TYPE rcut_step = 0.25 * s->length;
  FLOAT_TYPE last_success = -1.0;

  FLOAT_TYPE best_time=1e250, time=1e240;

  FLOAT_TYPE rs_error, error = -1.0;

  int success = 0;
  int direction=1;
  int failed_once=0;

  TUNE_TRACE(printf("Starting tuning for '%s' with prec '%e'\n", m->method_name, precision);)

  for(it.mesh = MESH_MIN; it.mesh <= MESH_MAX; it.mesh+=MESH_STEP ) {
コード例 #8
0
ファイル: statistics.c プロジェクト: fweik/p3m-standalone
void radial_distribution_species(FLOAT_TYPE r_min, FLOAT_TYPE r_max, int bins, system_t *s) {
    FLOAT_TYPE *rdf = Init_array( 4*bins, sizeof(FLOAT_TYPE));
    FLOAT_TYPE dr = (r_max - r_min) / bins, dx, dy, dz, r2, r, r_min2, r_max2;
    FLOAT_TYPE lengthi = 1.0/s->length;
    int n[4], bin;
    FLOAT_TYPE r_in, r_out;
    FLOAT_TYPE bin_volume;

    memset(rdf, 0, 4*bins*sizeof(FLOAT_TYPE));
    memset(  n, 0, 4*sizeof(int));

    r_min2 = SQR(r_min);
    r_max2 = SQR(r_max);

    for(int i=0; i<s->nparticles; i++) {
        for(int j=0; j<s->nparticles; j++) {
            if(i==j)
                continue;

            dx = s->p->x[i] - s->p->x[j];
            dx -= ROUND(dx*lengthi)*s->length;
            dy = s->p->y[i] - s->p->y[j];
            dy -= ROUND(dy*lengthi)*s->length;
            dz = s->p->z[i] - s->p->z[j];
            dz -= ROUND(dz*lengthi)*s->length;

            r2 = SQR(dx) + SQR(dy) + SQR(dz);

            if((r2 < r_min2) || (r2 > r_max2))
                continue;

            r = SQRT(r2);

            bin = (int)((r - r_min)/dr);

            if( (s->q[i] > 0.0) && (s->q[j] > 0.0)) {
                /* printf("(%d, %d): ++ (%e, %e), at %lf\n", i, j, s->q[i], s->q[j], r); */
                rdf[bin]++;
                n[0]++;
            }
            if( (s->q[i] > 0.0) && (s->q[j] < 0.0)) {
                /* printf("(%d, %d): +- (%e, %e), at %lf\n", i, j, s->q[i], s->q[j], r); */
                rdf[bins+bin]++;
                n[1]++;
            }
            if( (s->q[i] < 0.0) && (s->q[j] < 0.0)) {
                rdf[2*bins+bin]++;
                n[2]++;
            }
            if( (s->q[i] < 0.0) && (s->q[j] > 0.0)) {
                rdf[3*bins+bin]++;
                n[3]++;
            }
        }
    }
    FILE *f = fopen("rdf_+-.dat", "w");
    for(int i=0; i<bins; i++) {
        r_in = i*dr + r_min;
        r_out = r_in + dr;

        bin_volume = 4.0/3.0 * PI * (r_out *r_out*r_out - r_in * r_in * r_in );
        fprintf( f, "%e ", 0.5 * (r_in + r_out));
        fprintf( f, "%e ", rdf[i] / (n[0] * bin_volume) );
        fprintf( f, "%e ", rdf[bins+i] / (n[1] * bin_volume) );
        fprintf( f, "%e ", rdf[2*bins+i] / (n[2] * bin_volume) );
        fprintf( f, "%e ", rdf[3*bins+i] / (n[3] * bin_volume) );
        fprintf( f, "\n");
    }
    fclose(f);
    fftw_free(rdf);
}
コード例 #9
0
ファイル: p3m-common.c プロジェクト: fweik/p3m-standalone
data_t *Init_data(const method_t *m, system_t *s, parameters_t *p) {
    int mesh3 = p->mesh*p->mesh*p->mesh;
    data_t *d = (data_t *)Init_array(1, sizeof(data_t));

    d->mesh = p->mesh;
    
    if ( m->flags & METHOD_FLAG_Qmesh)
      d->Qmesh = (FLOAT_TYPE *)Init_array(2*mesh3, sizeof(FLOAT_TYPE));
    else
      d->Qmesh = NULL;

    if ( m->flags & METHOD_FLAG_ik ) {
        d->Fmesh = Init_vector_array(2*mesh3);
        d->Dn = (FLOAT_TYPE *)Init_array(d->mesh, sizeof(FLOAT_TYPE));
        Init_differential_operator(d);
    }
    else {
        d->Fmesh = NULL;
        d->Dn = NULL;
    }

    d->nshift = NULL;

    if ( m->flags & METHOD_FLAG_nshift ) {
      d->nshift = (FLOAT_TYPE *)Init_array(d->mesh, sizeof(FLOAT_TYPE));
      Init_nshift(d);
    }

    d->dQ[0] = NULL;
    d->dQ[1] = NULL;

    if( m->flags & METHOD_FLAG_self_force_correction)
      d->self_force_corrections = (FLOAT_TYPE *)Init_array(my_power(1+2*P3M_SELF_BRILLOUIN, 3), 3*sizeof(FLOAT_TYPE));

    if ( m->flags & METHOD_FLAG_ad ) {
      int i;
      int max = ( m->flags & METHOD_FLAG_interlaced) ? 2 : 1;

        for (i = 0; i < max; i++) {
	  d->dQ[i] = (FLOAT_TYPE *)Init_array( 3*s->nparticles*p->cao3, sizeof(FLOAT_TYPE) );
        }
    }

    if ( m->flags & METHOD_FLAG_ca ) {
      int i;
      int max = ( m->flags & METHOD_FLAG_interlaced ) ? 2 : 1;
      d->cf[1] = NULL;
      d->ca_ind[1] = NULL;
      
      for (i = 0; i < max; i++) {
	d->cf[i] = (FLOAT_TYPE *)Init_array( p->cao3 * s->nparticles, sizeof(FLOAT_TYPE));
	d->ca_ind[i] = (int *)Init_array( 3*s->nparticles, sizeof(int));
      }
	
      if( !p->tuning )
	d->inter = Init_interpolation( p->ip, m->flags & METHOD_FLAG_ad );
      else {
	if(dummy_inter == NULL)
	  dummy_inter = Init_interpolation( 6, 1 );
	d->inter = dummy_inter;
      }
    }
    else {
      d->cf[0] = NULL;
      d->ca_ind[0] = NULL;
      d->cf[1] = NULL;
      d->ca_ind[1] = NULL;
      d->inter = NULL;
    }

    if ( m->flags & METHOD_FLAG_G_hat) {
      if( !p->tuning) {
	d->G_hat = (FLOAT_TYPE *)Init_array(mesh3, sizeof(FLOAT_TYPE));
        m->Influence_function( s, p, d );   
      } else {
	dummy_g_realloc(d->mesh);
	d->G_hat = dummy_g;
      }
    }
    else
      d->G_hat = NULL;    


    d->forward_plans = 0;
    d->backward_plans = 0;

    return d;
}