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); }
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); }
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; }
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; }
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; }
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; }
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 ) {
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); }
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; }