RYUON-stokes is a Stokesian dynamics simulator. Using libstokes, RYUON-stokes can solve resistance and mobility problems under the periodic boundary condition with F, FT, and FTS versions for full 3D as well as semi-2D (monolayer) configurations. For each of them, there are two functions, with or without lubrication correction. For mobility problem, also fixed particles can be handled.
by POVRAY | VTK | Postscript |
6 particles on circle | 10 particles in line |
visualized by stnc2pov.py and POVRAY.
please visit File Releases @ SF.
You can use libstokes from many programming languages. (All codes are in stokes-0.4.tar.bz2.)
Let's solve a resistance problem of 8 particles with the same velocity placed at SC lattice cites. Of course, the expected forces would be same for all particles. (All codes are in stokes-0.4.tar.bz2.)
Description | C (html) | Python (html) | Ruby (html) | Perl (html) | Guile (html) | Octave |
preamble |
#include <stdio.h> #include <stdlib.h> #include <libstokes.h> #include <libiter.h> /* main program */ int main (int argc, char** argv) { |
import stokes |
require 'stokes' |
use stokes; |
(load-extension "./stokes.so" "SWIG_init") |
|
initialize struct stokes * sys. |
struct stokes *sys = stokes_init (); |
sys = stokes.stokes_init() |
sys = Stokes::stokes_init() |
$sys = stokes::stokes_init(); |
(define sys (stokes-init)) |
|
set np and nm (you must call stokes_set_np() because this also allocate the memory for pos.) |
int np, nm; np = 8; nm = 8; stokes_set_np (sys, np, nm); |
np = 8 nm = 8 stokes.stokes_set_np(sys, np, nm) |
np = 8 nm = 8 Stokes::stokes_set_np(sys, np, nm) # you must call stokes_set_np() because # this also allocate the memory for pos. |
$np = 8; $nm = 8; stokes::stokes_set_np($sys, $np, $nm); # you must call stokes_set_np() because # this also allocate the memory for pos. |
(define np 8) (define nm 8) (stokes-set-np sys np nm) |
|
set periodic lattice parameters. |
double lx, ly, lz; lx = 10.0; ly = 10.0; lz = 10.0; stokes_set_l (sys, lx, ly, lz); tratio = 60.25; xi = xi_by_tratio (sys, tratio); cutlim = 1.0e-12; stokes_set_xi (sys, xi, cutlim); fprintf (stdout, "xi = %f\n", xi); sys->lubcut = 2.0000000001; |
lx = 10.0 ly = 10.0 lz = 10.0 stokes.stokes_set_l(sys, lx, ly, lz) tratio = 60.25 xi = stokes.xi_by_tratio(sys, tratio) cutlim = 1.0e-12 stokes.stokes_set_xi(sys, xi, cutlim) print 'xi =', xi sys.lubcut = 2.0000000001 |
lx = 10.0 ly = 10.0 lz = 10.0 Stokes::stokes_set_l(sys, lx, ly, lz) # you must call stokes_set_l() becuase # this also initialize parameters other than lx,ly,lz. tratio = 60.25 xi = Stokes::xi_by_tratio(sys, tratio) cutlim = 1.0e-12 Stokes::stokes_set_xi(sys, xi, cutlim) print "xi = ", xi, "\n" sys.lubcut = 2.0000000001 |
$lx = 10.0; $ly = 10.0; $lz = 10.0; stokes::stokes_set_l($sys, $lx, $ly, $lz); $tratio = 60.25; $xi = stokes::xi_by_tratio($sys, $tratio); $cutlim = 1.0e-12; stokes::stokes_set_xi($sys, $xi, $cutlim); print "xi = ", $xi, "\n"; $sys->{lubcut} = 2.0000000001; |
(define lx 10.0) (define ly 10.0) (define lz 10.0) (stokes-set-l sys lx ly lz) (define tratio 60.25) (define xi (xi-by-tratio sys tratio)) (define cutlim 1.0e-12) (stokes-set-xi sys xi cutlim) (display "xi = ") (display xi) (newline) ;(stokes-lubcut-set sys 2.0000000001) ;(stokes-lubcut-get sys) ; with '-emit-setter' you can write those as (set! (stokes-lubcut sys) 2.0000000001) (stokes-lubcut sys) |
l = [10.0, 10.0, 10.0] |
set the iterative solver. |
stokes_set_iter (sys, "gmres", 2000, 20, 1.0e-6, 1, stdout); |
stokes.stokes_set_iter(sys, "gmres", 2000, 20, 1.0e-6, 1, stokes.get_stdout()) |
Stokes::stokes_set_iter(sys, "gmres", 2000, 20, 1.0e-6, 1, Stokes::get_stdout()) |
stokes::stokes_set_iter($sys, "gmres", 2000, 20, 1.0e-6, 1, stokes::get_stdout()); |
(stokes-set-iter sys "gmres" 2000 20 1.0e-6 1 (get-stdout)) |
|
allocate memories for pos, u, and f and initialize them. |
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; } |
pos = stokes.darray(np*3) u = stokes.darray(np*3) f = stokes.darray(np*3) 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 in range(np*3): u[i] = 1.0 |
pos = Stokes::Darray.new(np*3) u = Stokes::Darray.new(np*3) f = Stokes::Darray.new(np*3) # set pos in SC lattice configuration 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 in 0..(np*3-1) u[i] = 1.0 end |
$pos = new stokes::darray($np*3); $u = new stokes::darray($np*3); $f = new stokes::darray($np*3); $pos->setitem( 0, 0.0); # x component $pos->setitem( 1, 0.0); # y component $pos->setitem( 2, 0.0); # z component $pos->setitem( 3, 5.0); $pos->setitem( 4, 0.0); $pos->setitem( 5, 0.0); $pos->setitem( 6, 0.0); $pos->setitem( 7, 5.0); $pos->setitem( 8, 0.0); $pos->setitem( 9, 0.0); $pos->setitem(10, 0.0); $pos->setitem(11, 5.0); $pos->setitem(12, 5.0); $pos->setitem(13, 5.0); $pos->setitem(14, 0.0); $pos->setitem(15, 0.0); $pos->setitem(16, 5.0); $pos->setitem(17, 5.0); $pos->setitem(18, 5.0); $pos->setitem(19, 0.0); $pos->setitem(20, 5.0); $pos->setitem(21, 5.0); $pos->setitem(22, 5.0); $pos->setitem(23, 5.0); for ($i=0; $i < $np*3; $i++){ $u->setitem($i, 1.0); } |
(define pos (new-darray (* np 3))) (define u (new-darray (* np 3))) (define f (new-darray (* np 3))) ; set pos in SC lattice configuration (darray-setitem pos 0 0.0) ; x component (darray-setitem pos 1 0.0) ; y component (darray-setitem pos 2 0.0) ; z component (darray-setitem pos 3 5.0) (darray-setitem pos 4 0.0) (darray-setitem pos 5 0.0) (darray-setitem pos 6 0.0) (darray-setitem pos 7 5.0) (darray-setitem pos 8 0.0) (darray-setitem pos 9 0.0) (darray-setitem pos 10 0.0) (darray-setitem pos 11 5.0) (darray-setitem pos 12 5.0) (darray-setitem pos 13 5.0) (darray-setitem pos 14 0.0) (darray-setitem pos 15 0.0) (darray-setitem pos 16 5.0) (darray-setitem pos 17 5.0) (darray-setitem pos 18 5.0) (darray-setitem pos 19 0.0) (darray-setitem pos 20 5.0) (darray-setitem pos 21 5.0) (darray-setitem pos 22 5.0) (darray-setitem pos 23 5.0) ; set u and f (do ((i 0 (1+ i))) ((>= i (* np 3))) (darray-setitem u i 1.0)) |
pos = [0.0, 0.0, 0.0,\ 0.0, 0.0, 5.0,\ 0.0, 5.0, 0.0,\ 0.0, 5.0, 5.0,\ 5.0, 0.0, 0.0,\ 5.0, 0.0, 5.0,\ 5.0, 5.0, 0.0,\ 5.0, 5.0, 5.0] u = [1.0, 1.0, 1.0,\ 1.0, 1.0, 1.0,\ 1.0, 1.0, 1.0,\ 1.0, 1.0, 1.0,\ 1.0, 1.0, 1.0,\ 1.0, 1.0, 1.0,\ 1.0, 1.0, 1.0,\ 1.0, 1.0, 1.0] |
print pos, u, and f for check. |
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]); } |
print 'pos:' for i in range(np): print i,pos[i*3],pos[i*3+1],pos[i*3+2] print 'u:' for i in range(np): print i, u[i*3], u[i*3+1], u[i*3+2] |
print "pos:\n" for i in 0..(np-1) print i, ' ', pos[i*3], ' ', pos[i*3+1], ' ', pos[i*3+2], "\n" end print "u:\n" for i in 0..(np-1) print i, ' ', u[i*3], ' ', u[i*3+1], ' ', u[i*3+2], "\n" end |
print "pos:\n"; for ($i=0; $i < $np; $i++){ printf ("%d %f %f %f\n", $i, $pos->getitem($i*3), $pos->getitem($i*3+1), $pos->getitem($i*3+2)); } print "u:\n"; for ($i=0; $i < $np; $i++){ printf ("%d %f %f %f\n", $i, $u->getitem($i*3), $u->getitem($i*3+1), $u->getitem($i*3+2)); } |
(display "pos:") (newline) (display-darray3 pos np) (display "u:") (newline) (display-darray3 u np) |
|
call the solver solve_res_ewald_3f(). (the real calculation is done here.) |
stokes_set_pos (sys, pos); solve_res_ewald_3f (sys, u, f); |
stokes.stokes_set_pos(sys, pos) stokes.solve_res_ewald_3f(sys, u, f) |
Stokes::stokes_set_pos(sys, pos) Stokes::calc_res_ewald_3f(sys, u, f) |
stokes::stokes_set_pos($sys, $pos); stokes::solve_res_ewald_3f($sys, $u, $f); |
(set! (stokes-pos sys) pos) (solve-res-ewald-3f sys u f) |
f = stokes_res_ewald_3f(pos, u, l, 60.25) |
print the result 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; } |
print 'f:' for i in range(np): print i, f[i*3], f[i*3+1], f[i*3+2] |
print "f:\n" for i in 0..(np-1) print i, ' ', f[i*3], ' ', f[i*3+1], ' ', f[i*3+2], "\n" end |
print "f:\n"; for ($i=0; $i < $np; $i++){ printf ("%d %f %f %f\n", $i, $f->getitem($i*3), $f->getitem($i*3+1), $f->getitem($i*3+2)); } |
(display "f:") (newline) (display-darray3 f np) |
|
Results: |
xi = 0.350941 pos: 0 0.000000 0.000000 0.000000 1 5.000000 0.000000 0.000000 2 0.000000 5.000000 0.000000 3 0.000000 0.000000 5.000000 4 5.000000 5.000000 0.000000 5 0.000000 5.000000 5.000000 6 5.000000 0.000000 5.000000 7 5.000000 5.000000 5.000000 u: 0 1.000000 1.000000 1.000000 1 1.000000 1.000000 1.000000 2 1.000000 1.000000 1.000000 3 1.000000 1.000000 1.000000 4 1.000000 1.000000 1.000000 5 1.000000 1.000000 1.000000 6 1.000000 1.000000 1.000000 7 1.000000 1.000000 1.000000 libiter: iter=20 res=2.799607e-16 f: 0 2.145689 2.145689 2.145689 1 2.145689 2.145689 2.145689 2 2.145689 2.145689 2.145689 3 2.145689 2.145689 2.145689 4 2.145689 2.145689 2.145689 5 2.145689 2.145689 2.145689 6 2.145689 2.145689 2.145689 7 2.145689 2.145689 2.145689 |
xi = 0.350941271209 pos: 0 0.0 0.0 0.0 1 5.0 0.0 0.0 2 0.0 5.0 0.0 3 0.0 0.0 5.0 4 5.0 5.0 0.0 5 0.0 5.0 5.0 6 5.0 0.0 5.0 7 5.0 5.0 5.0 u: 0 1.0 1.0 1.0 1 1.0 1.0 1.0 2 1.0 1.0 1.0 3 1.0 1.0 1.0 4 1.0 1.0 1.0 5 1.0 1.0 1.0 6 1.0 1.0 1.0 7 1.0 1.0 1.0 libiter: iter=20 res=2.799607e-16 f: 0 2.14568872011 2.14568872011 2.14568872011 1 2.14568872011 2.14568872011 2.14568872011 2 2.14568872011 2.14568872011 2.14568872011 3 2.14568872011 2.14568872011 2.14568872011 4 2.14568872011 2.14568872011 2.14568872011 5 2.14568872011 2.14568872011 2.14568872011 6 2.14568872011 2.14568872011 2.14568872011 7 2.14568872011 2.14568872011 2.14568872011 |
xi = 0.350941271209315 pos: 0 0.0 0.0 0.0 1 5.0 0.0 0.0 2 0.0 5.0 0.0 3 0.0 0.0 5.0 4 5.0 5.0 0.0 5 0.0 5.0 5.0 6 5.0 0.0 5.0 7 5.0 5.0 5.0 u: 0 1.0 1.0 1.0 1 1.0 1.0 1.0 2 1.0 1.0 1.0 3 1.0 1.0 1.0 4 1.0 1.0 1.0 5 1.0 1.0 1.0 6 1.0 1.0 1.0 7 1.0 1.0 1.0 libiter: iter=20 res=2.799607e-16 f: 0 2.14568872010948 2.14568872010949 2.14568872010948 1 2.14568872010948 2.14568872010949 2.14568872010949 2 2.14568872010948 2.14568872010949 2.14568872010948 3 2.14568872010948 2.14568872010949 2.14568872010949 4 2.14568872010948 2.14568872010949 2.14568872010949 5 2.14568872010948 2.14568872010949 2.14568872010948 6 2.14568872010948 2.14568872010949 2.14568872010949 7 2.14568872010948 2.14568872010949 2.14568872010949 |
xi = 0.350941271209315 pos: 0 0.000000 0.000000 0.000000 1 5.000000 0.000000 0.000000 2 0.000000 5.000000 0.000000 3 0.000000 0.000000 5.000000 4 5.000000 5.000000 0.000000 5 0.000000 5.000000 5.000000 6 5.000000 0.000000 5.000000 7 5.000000 5.000000 5.000000 u: 0 1.000000 1.000000 1.000000 1 1.000000 1.000000 1.000000 2 1.000000 1.000000 1.000000 3 1.000000 1.000000 1.000000 4 1.000000 1.000000 1.000000 5 1.000000 1.000000 1.000000 6 1.000000 1.000000 1.000000 7 1.000000 1.000000 1.000000 libiter: iter=20 res=2.799607e-16 f: 0 2.145689 2.145689 2.145689 1 2.145689 2.145689 2.145689 2 2.145689 2.145689 2.145689 3 2.145689 2.145689 2.145689 4 2.145689 2.145689 2.145689 5 2.145689 2.145689 2.145689 6 2.145689 2.145689 2.145689 7 2.145689 2.145689 2.145689 |
xi = 0.350941271209315 pos: 0 0.0 0.0 0.0 1 5.0 0.0 0.0 2 0.0 5.0 0.0 3 0.0 0.0 5.0 4 5.0 5.0 0.0 5 0.0 5.0 5.0 6 5.0 0.0 5.0 7 5.0 5.0 5.0 u: 0 1.0 1.0 1.0 1 1.0 1.0 1.0 2 1.0 1.0 1.0 3 1.0 1.0 1.0 4 1.0 1.0 1.0 5 1.0 1.0 1.0 6 1.0 1.0 1.0 7 1.0 1.0 1.0 libiter: iter=20 res=2.799607e-16 f: 0 2.14568872010948 2.14568872010949 2.14568872010948 1 2.14568872010948 2.14568872010949 2.14568872010949 2 2.14568872010948 2.14568872010949 2.14568872010948 3 2.14568872010948 2.14568872010949 2.14568872010949 4 2.14568872010948 2.14568872010949 2.14568872010949 5 2.14568872010948 2.14568872010949 2.14568872010948 6 2.14568872010948 2.14568872010949 2.14568872010949 7 2.14568872010948 2.14568872010949 2.14568872010949 |
pos = 0 0 0 0 0 5 0 5 0 0 5 5 5 0 0 5 0 5 5 5 0 5 5 5 u = 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 l = 10 10 10 libiter: iter=20 res=3.325435e-16 f = 2.1457 2.1457 2.1457 2.1457 2.1457 2.1457 2.1457 2.1457 2.1457 2.1457 2.1457 2.1457 2.1457 2.1457 2.1457 2.1457 2.1457 2.1457 2.1457 2.1457 2.1457 2.1457 2.1457 2.1457 |
syntax highlighted by Code2HTML, v. 0.9.1.