int main(void) { double theMesh[2*32*32*32]; double Charge1 = 1.0, Charge2 = 1.0; double Position1[3] = {0.0, 0.0, 0.0}; double Position2[3] = {0.0, 0.0, 0.0}; double caDings[2*7*7*7]; int caind[2*3], i,j,k; double theForce, totalCharge=0.0; int MM = 31; Mesh = 32; cao = 7; ip = cao - 1; Len = 32.0; ca_ind[0] = caind; cf[0] = caDings; Interpolationspolynom_berechnen(ip); for(i=0.0;i<11;i++) { bzero(theMesh, 32*32*32*2*sizeof(double)); Position1[0] = -0.5 + i*0.1; Position2[0] = 0.5 + i*0.1; if(Position1[0] < 0.0) Position1[0] += Len; if(Position2[0] < 0.0) Position2[0] += Len; assign_charge(0, 1.0, Position1, theMesh, 0); assign_charge(1, -1.0, Position2, theMesh, 0); printf("%lf %lf %lf %e %lf\n", -0.5 + i*0.1, theMesh[c_ind(0,0,0)], theMesh[c_ind(31,0,0)], theMesh[c_ind(30,30,30)], LadInt[1][(int)(-0.5*i/(2.0*MaxInterpol))]); } return 0; }
//--------------------------------------------------------------------- std::vector<int> getCInd(int const nBF, int const nD) { std::vector<int> c_ind(nBF); for(int i=0; i<nBF;i++) c_ind[i]=nD*(2+nBF)+i*2+1; return c_ind; }
void P3M_ad( system_t *s, parameters_t *p, data_t *d, forces_t *f ) { /* Loop counters */ int i, j, k, c_index; /* Helper variables */ FLOAT_TYPE T1; FLOAT_TYPE Leni = 1.0/s->length; int Mesh = p->mesh; memset(d->Qmesh, 0, 2*Mesh*Mesh*Mesh * sizeof(FLOAT_TYPE)); TIMING_START_C /* chargeassignment */ assign_charge_and_derivatives( s, p, d, 0); TIMING_STOP_C TIMING_START_G /* Forward Fast Fourier Transform */ forward_fft(d); for (i=0; i<Mesh; i++) for (j=0; j<Mesh; j++) for (k=0; k<Mesh; k++) { c_index = c_ind(i,j,k); T1 = d->G_hat[r_ind(i,j,k)]; d->Qmesh[c_index] *= T1; d->Qmesh[c_index+1] *= T1; } /* Backward FFT */ backward_fft(d); TIMING_STOP_G TIMING_START_F /* Force assignment */ assign_forces_ad( Mesh * Leni * Leni * Leni , s, p, d, f, 0 ); #ifdef P3M_AD_SELF_FORCES Substract_self_forces(s,p,d,f); #endif TIMING_STOP_F return; }
void P3M_ik_i( system_t *s, parameters_t *p, data_t *d, forces_t *f ) { /* Zaehlvariablen: */ int i, j, k, l; /* Schnelles Modulo: */ FLOAT_TYPE T1; FLOAT_TYPE Mesh = p->mesh; FLOAT_TYPE Leni = 1.0/s->length; FLOAT_TYPE dop; int c_index; /* Initialisieren von Qmesh */ memset ( d->Qmesh, 0, 2*Mesh*Mesh*Mesh*sizeof ( FLOAT_TYPE ) ); TIMING_START_C /* chargeassignment */ assign_charge( s, p, d, 0 ); assign_charge( s, p, d, 1 ); TIMING_STOP_C /* assign_charge_interlacing( s, p, d ); */ TIMING_START_G /* Durchfuehren der Fourier-Hin-Transformationen: */ forward_fft(d); for (i=0; i<Mesh; i++) for (j=0; j<Mesh; j++) for (k=0; k<Mesh; k++) { c_index = c_ind(i,j,k); T1 = d->G_hat[r_ind(i,j,k)]; d->Qmesh[c_index] *= T1; d->Qmesh[c_index+1] *= T1; for (l=0;l<3;l++) { switch ( l ) { case 0: dop = d->Dn[i]; break; case 1: dop = d->Dn[j]; break; case 2: dop = d->Dn[k]; break; } d->Fmesh->fields[l][c_index] = -2.0*PI*Leni*dop*d->Qmesh[c_index+1]; d->Fmesh->fields[l][c_index+1] = 2.0*PI*Leni*dop*d->Qmesh[c_index]; } } /* Durchfuehren der Fourier-Rueck-Transformation: */ backward_fft(d); TIMING_STOP_G TIMING_START_F /* force assignment */ /* assign_forces ( 1.0 / ( 2.0*s->length*s->length*s->length ), s, p, d, f, 0 ); */ /* assign_forces ( 1.0 / ( 2.0*s->length*s->length*s->length ), s, p, d, f, 1 ); */ assign_forces_interlacing ( 1.0 / ( 2.0*s->length*s->length*s->length ), s, p, d, f ); TIMING_STOP_F return; }