Пример #1
0
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;
}
Пример #2
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;
}
Пример #3
0
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;
}
Пример #4
0
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;
}