Esempio n. 1
0
/* Initialize libstokes
 * Basic parameters for the libstorks
 * and pos[] are set from init_aggregate.
 */
void System::initLibStokes(){
    if (init_aggregate.empty() && np ==  0){
        cerr << "configuration of particles are not imported yet.";
        exit(1);
    }
    if (np == 0)
        np = init_aggregate.size(); 	/* np : number of all particles  */
    nm = np;	/* nm : number of mobile particles  */
    cerr << "number of the particles : " << np << endl;
    sd = stokes_init();
	sd->twobody_lub = lubrication;
    sd->version = 2; /* 0 = F, 1 = FT, 2 = FTS  */
    sd->periodic = 0; 	/* 0 = non periodic, 1 = periodic */
	stokes_set_np(sd, np, nm);
    if (lx == 0 || ly == 0 || lz == 0 ){
        cerr << "lx, ly, lz are not given." << endl;exit(1);
    }
    cerr << "=======" << endl;
	stokes_set_l(sd, lx, ly, lz);
 
    int n3=np*3;
    int n5=np*5;
    try{
        velocity = new double [ n3 ];
        omega = new double [ n3 ];
        strain_velocity = new double [ n5 ];
        force = new double [ n3 ];
        torque = new double [ n3 ];
        stresslet = new double [ n5 ];
        dr = new vec3d [np];
    } catch (bad_alloc &){
        cerr << "bad_alloc at System::init()" << endl;
        exit(1);
    }
    
    /*
	 * set pos[] for SD
	 */ 
    
    if (!init_aggregate.empty()){
        double scale = 1.0;
        for (int i = 0; i < np; i++){
            setPosition(i, 
                        scale*init_aggregate[i].x,
                        scale*init_aggregate[i].y,
                        scale*init_aggregate[i].z);
        }
        set_dr_from_sdpos();
    }
 }
Esempio n. 2
0
/* check make_matrix_mob_ewald_3all() for mono and poly(a=1)
 * with SC config with N=2
 * INPUT
 *  version   : 0 (F), 1 (FT), 2 (FTS)
 *  dir       : direction of the config, 0 (x), 1 (y), 2(z).
 *  phi       : volume fraction, that is, phi = (4/3)pi a^3/l^3
 *  ewald_tr  :
 *  ewald_eps :
 *  verbose : if non-zero, print results
 *  tiny    : small number for check
 * OUTPUT
 *  (returned value) : 0 => passed
 *                     otherwise => failed
 */
int
check_make_matrix_mob_ewald_3all_poly_SC_2
(int version,
 int dir,
 double phi,
 double ewald_tr, double ewald_eps,
 int verbose, double tiny)
{
  if (verbose != 0)
    {
      fprintf (stdout,
	       "==================================================\n"
	       "check_make_matrix_mob_ewald_3all_poly_SC_2\n"
	       "(%d,dir=%d,phi=%f,tr=%f,eps=%f): start\n",
	       version, dir, phi, ewald_tr, ewald_eps);
    }

  // initialize struct stokes *sys
  struct stokes *sys = stokes_init ();
  CHECK_MALLOC (sys, "check_make_matrix_mob_ewald_3all_poly_SC_2");
  sys->version = version;

  int np = 2;
  stokes_set_np (sys, np, np);

  //sys->lubmin = 2.0000000001;
  sys->lubmin2 = 4.0000000001;
  stokes_set_iter (sys, "gmres", 2000, 20, 1.0e-6, 1, stderr);

  // periodic
  sys->periodic = 1;
  double l;
  l = pow (M_PI / 0.75 / phi, 1.0 / 3.0);

  if (dir == 1)
    {
      // x direction
      stokes_set_l (sys, 2.0*l, l, l);
  
      sys->pos [0] = 0.0;
      sys->pos [1] = 0.0;
      sys->pos [2] = 0.0;
      sys->pos [3] = l;
      sys->pos [4] = 0.0;
      sys->pos [5] = 0.0;
    }
  else if (dir == 2)
    {
      // y direction
      stokes_set_l (sys, l, 2.0*l, l);
  
      sys->pos [0] = 0.0;
      sys->pos [1] = 0.0;
      sys->pos [2] = 0.0;
      sys->pos [3] = 0.0;
      sys->pos [4] = l;
      sys->pos [5] = 0.0;
    }
  else
    {
      // z direction
      stokes_set_l (sys, l, l, 2.0*l);
  
      sys->pos [0] = 0.0;
      sys->pos [1] = 0.0;
      sys->pos [2] = 0.0;
      sys->pos [3] = 0.0;
      sys->pos [4] = 0.0;
      sys->pos [5] = l;
    }

  
  double xi = xi_by_tratio (sys, ewald_tr);
  stokes_set_xi (sys, xi, ewald_eps);

  int n;
  if (version == 0)      n =  3 * np;
  else if (version == 1) n =  6 * np;
  else                   n = 11 * np;

  // case 1) -- mono
  double *mat1 = (double *)malloc (sizeof (double) * n * n);
  CHECK_MALLOC (mat1, "check_make_matrix_mob_ewald_3all_poly_SC_2");

  double t0, t;
  t0 = ptime_ms_d ();
  make_matrix_mob_ewald_3all (sys, mat1);
  t = ptime_ms_d ();
  double ptime_mono = t - t0;


  // set sys->a to test poly version
  double a [2] = {1.0, 1.0};
  stokes_set_radius (sys, a);

  // case 2) -- poly
  double *mat2 = (double *)malloc (sizeof (double) * n * n);
  CHECK_MALLOC (mat2, "check_make_matrix_mob_ewald_3all_poly_SC_2");

  t0 = ptime_ms_d ();
  make_matrix_mob_ewald_3all (sys, mat2);
  t = ptime_ms_d ();
  double ptime_poly = t - t0;


  // compare
  int check = 0;
  double max = 0.0;
  char label [80];
  int i, j;
  for (i = 0; i < n; i ++)
    {
      for (j = 0; j < n; j ++)
	{
	  sprintf (label, " (%d, %d) ", i, j);
	  check += compare_max (mat1[i*n+j], mat2[i*n+j],
				label, verbose, tiny, &max);
	}
    }

  free (mat1);
  free (mat2);
  stokes_free (sys);


  if (verbose != 0)
    {
      fprintf (stdout, " ptime mono, poly = %.3f %.3f, poly/mono = %f\n",
	       ptime_mono, ptime_poly, ptime_poly / ptime_mono);

      fprintf (stdout, " max error = %e vs tiny = %e\n", max, tiny);
      if (check == 0) fprintf (stdout, " => PASSED\n\n");
      else            fprintf (stdout, " => FAILED\n\n");
    }

  return (check);
}
Esempio n. 3
0
/* check atimes_ewald_3all() for mono and poly(a=1) with SC config with N=1
 * INPUT
 *  version   : 0 (F), 1 (FT), 2 (FTS)
 *  phi       : volume fraction, that is, phi = (4/3)pi a^3/l^3
 *  ewald_tr  :
 *  ewald_eps :
 *  verbose : if non-zero, print results
 *  tiny    : small number for check
 * OUTPUT
 *  (returned value) : 0 => passed
 *                     otherwise => failed
 */
int
check_atimes_ewald_3all_poly_SC_1 (int version,
				   double phi,
				   double ewald_tr, double ewald_eps,
				   int verbose, double tiny)
{
  if (verbose != 0)
    {
      fprintf (stdout,
	       "==================================================\n"
	       "check_atimes_ewald_3all_poly_SC_1\n"
	       "(%d,phi=%f,tr=%f,eps=%f)"
	       ": start\n",
	       version, phi, ewald_tr, ewald_eps);
    }

  // initialize struct stokes *sys
  struct stokes *sys = stokes_init ();
  CHECK_MALLOC (sys, "check_atimes_ewald_3all_poly_SC_1");
  sys->version = version;

  int np = 1;
  stokes_set_np (sys, np, np);

  sys->pos [0] = 0.0;
  sys->pos [1] = 0.0;
  sys->pos [2] = 0.0;


  sys->lubmin2 = 4.0000000001;
  stokes_set_iter (sys, "gmres", 2000, 20, 1.0e-6, 1, stderr);

  // periodic
  sys->periodic = 1;
  double l;
  l = pow (M_PI / 0.75 / phi, 1.0 / 3.0);
  stokes_set_l (sys, l, l, l);
  
  double xi = xi_by_tratio (sys, ewald_tr);
  stokes_set_xi (sys, xi, ewald_eps);

  int n;
  if (version == 0)      n =  3 * np;
  else if (version == 1) n =  6 * np;
  else                   n = 11 * np;

  double *x = (double *)malloc (sizeof (double) * n);
  CHECK_MALLOC (x, "check_atimes_ewald_3all_poly_SC_1");
  int i;
  for (i = 0; i < n; i ++)
    {
      x[i] = 1.0;
    }

  // case 1) -- mono code
  double *y1 = (double *)malloc (sizeof (double) * n);
  CHECK_MALLOC (y1, "check_atimes_ewald_3all_poly_SC_1");

  double t0, t;
  t0 = ptime_ms_d ();
  atimes_ewald_3all (n, x, y1, (void *)sys);
  t = ptime_ms_d ();
  double ptime_mono = t - t0;


  // set sys->a to test poly version
  double a [1] = {1.0};
  stokes_set_radius (sys, a);

  // case 2) -- poly code
  double *y2 = (double *)malloc (sizeof (double) * n);
  CHECK_MALLOC (y2, "check_atimes_ewald_3all_poly_SC_1");

  t0 = ptime_ms_d ();
  atimes_ewald_3all (n, x, y2, (void *)sys);
  t = ptime_ms_d ();
  double ptime_poly = t - t0;


  // compare
  int check = 0;
  double max = 0.0;
  char label [80];
  for (i = 0; i < n; i ++)
    {
      sprintf (label, " (%d) ", i);
      check += compare_max (y1[i], y2[i], label, verbose, tiny, &max);
    }

  free (x);
  free (y1);
  free (y2);
  stokes_free (sys);


  if (verbose != 0)
    {
      fprintf (stdout, " ptime mono, poly = %.3f %.3f, poly/mono = %f\n",
	       ptime_mono, ptime_poly, ptime_poly / ptime_mono);

      fprintf (stdout, " max error = %e vs tiny = %e\n", max, tiny);
      if (check == 0) fprintf (stdout, " => PASSED\n\n");
      else            fprintf (stdout, " => FAILED\n\n");
    }

  return (check);
}
Esempio n. 4
0
/* main program */
int
main (int argc, char** argv)
{
  struct stokes *sys = stokes_init ();

  int np, nm;
  np = 8;
  nm = 8;
  stokes_set_np (sys, np, nm);

  sys->periodic = 1; // periodic boundary condition
  double lx, ly, lz;
  lx = 10.0;
  ly = 10.0;
  lz = 10.0;
  stokes_set_l (sys, lx, ly, lz);

  double ewald_tr = 60.25;
  double xi = xi_by_tratio (sys, ewald_tr);

  double ewald_eps = 1.0e-12;
  stokes_set_xi (sys, xi, ewald_eps);

  fprintf (stdout, "xi = %f\n", xi);

  //sys->lubmin = 2.0000000001;
  sys->lubmin2 = 4.0000000001;
  sys->lubmax = 4.0;
  stokes_set_iter (sys, "gmres", 2000, 20, 1.0e-6, 1, stdout);

  int i;
  double * pos;
  double * u;
  double * f;
  pos = (double *)calloc (np * 3, sizeof (double));
  u   = (double *)calloc (np * 3, sizeof (double));
  f   = (double *)calloc (np * 3, sizeof (double));

  pos[ 0] = 0.0; // x component
  pos[ 1] = 0.0; // y component
  pos[ 2] = 0.0; // z component
  pos[ 3] = 5.0; pos[ 4] = 0.0; pos[ 5] = 0.0;
  pos[ 6] = 0.0; pos[ 7] = 5.0; pos[ 8] = 0.0;
  pos[ 9] = 0.0; pos[10] = 0.0; pos[11] = 5.0;
  pos[12] = 5.0; pos[13] = 5.0; pos[14] = 0.0;
  pos[15] = 0.0; pos[16] = 5.0; pos[17] = 5.0;
  pos[18] = 5.0; pos[19] = 0.0; pos[20] = 5.0;
  pos[21] = 5.0; pos[22] = 5.0; pos[23] = 5.0;

  for (i = 0; i < np * 3; i ++)
    {
      u[i] = 1.0;
    }

  fprintf (stdout, "pos:\n");
  for (i = 0; i < np; i ++)
    {
      fprintf (stdout, "%d %f %f %f\n",
	       i,
	       pos[i*3 + 0],
	       pos[i*3 + 1],
	       pos[i*3 + 2]);
    }

  fprintf (stdout, "u:\n");
  for (i = 0; i < np; i ++)
    {
      fprintf (stdout, "%d %f %f %f\n",
	       i,
	       u[i*3 + 0],
	       u[i*3 + 1],
	       u[i*3 + 2]);
    }

  stokes_set_pos (sys, pos);

  solve_res_3f (sys, u, f);

  fprintf (stdout, "f:\n");
  for (i = 0; i < np; i ++)
    {
      fprintf (stdout, "%d %f %f %f\n",
	       i,
	       f[i*3 + 0],
	       f[i*3 + 1],
	       f[i*3 + 2]);
    }

  return 0;
}