RMPCDMD
test_md_0.f90
Go to the documentation of this file.
1 ! This file is part of RMPCDMD
2 ! Copyright (c) 2017 Pierre de Buyl and contributors
3 ! License: BSD 3-clause (see file LICENSE)
4 
5 program test_md_0
6  use rmpcdmd_module
7  use threefry_module
8  use iso_c_binding
9  use tester
10  implicit none
11 
12  integer, parameter :: N = 679
13 
14  type(tester_t) :: test
15 
16  type(threefry_rng_t) :: state(1)
17  integer :: clock
18  integer :: i, j
19  double precision :: x(3,n), v(3,n)
20  integer :: L(3)
21  double precision :: x_old(3,n), v_old(3,n)
22  logical :: will_collide(n)
23 
24  type(cell_system_t) :: cells
25  type(particle_system_t) :: p
26 
27  call test% init()
28  call system_clock(count=clock)
29  call threefry_rng_init(state, int(clock, c_int64_t))
30 
31  l = [ 1, 20, 5 ]
32  call cells%init(l, 1.d0)
33  call p%init(n,1)
34 
35  cells%is_md = .false.
36 
37  cells%bc = [periodic_bc, bounce_back_bc, periodic_bc]
38  do j = 1, 10
39 
40  call p%random_placement(cells%edges, state=state(1))
41  call p%sort(cells)
42 
43  do i = 1, n
44  p%vel(1,:) = (-0.5d0+threefry_double(state(1)))*2*l(1)
45  p%vel(2,:) = (-0.5d0+threefry_double(state(1)))*2*l(2)
46  p%vel(3,:) = (-0.5d0+threefry_double(state(1)))*2*l(3)
47  end do
48 
49  x_old = p%pos
50  v_old = p%vel
51 
52  will_collide = ( (x_old(2,:)+v_old(2,:) < 0) .or. &
53  (x_old(2,:)+v_old(2,:) > l(2)) )
54 
55  call cell_md_pos_ywall(cells, p, 1.d0, md_flag=.false.)
56 
57  x = p%pos
58  v = p%vel
59 
60  do i = 1, n
61  call test%assert_close(norm2(v(:,i)), norm2(v_old(:,i)))
62  call test%assert_positive(x(2,i))
63  call test%assert_positive(l(2)-x(2,i))
64  if (will_collide(i)) call test%assert_close(v(:,i), -v_old(:,i))
65  end do
66 
67  end do
68 
69  cells%bc = [periodic_bc, specular_bc, periodic_bc]
70  do j = 1, 10
71 
72  call p%random_placement(cells%edges, state=state(1))
73  call p%sort(cells)
74 
75  do i = 1, n
76  p%vel(1,:) = (-0.5d0+threefry_double(state(1)))*2*l(1)
77  p%vel(2,:) = (-0.5d0+threefry_double(state(1)))*2*l(2)
78  p%vel(3,:) = (-0.5d0+threefry_double(state(1)))*2*l(3)
79  end do
80 
81  x_old = p%pos
82  v_old = p%vel
83 
84  will_collide = ( (x_old(2,:)+v_old(2,:) < 0) .or. &
85  (x_old(2,:)+v_old(2,:) > l(2)) )
86 
87  call cell_md_pos_ywall(cells, p, 1.d0, md_flag=.false.)
88 
89  x = p%pos
90  v = p%vel
91 
92  do i = 1, n
93  call test%assert_close(norm2(v(:,i)), norm2(v_old(:,i)))
94  call test%assert_positive(x(2,i))
95  call test%assert_positive(l(2)-x(2,i))
96  if (will_collide(i)) then
97  call test%assert_close(v(1,i), v_old(1,i))
98  call test%assert_close(v(2,i), -v_old(2,i))
99  call test%assert_close(v(3,i), v_old(3,i))
100  end if
101  end do
102 
103  end do
104 
105  call test% print()
106 
107 end program test_md_0
program test_md_0
Definition: test_md_0.f90:5