1 |
chuckv |
4 |
module langevin_cluster_list |
2 |
|
|
use parameter |
3 |
|
|
use simulation, ONLY : nlocal |
4 |
|
|
use velocity, ONLY : get_com |
5 |
|
|
use definitions, ONLY : DP, ndim |
6 |
|
|
#ifdef MPI |
7 |
|
|
use mpi_module |
8 |
|
|
#endif |
9 |
|
|
IMPLICIT NONE |
10 |
|
|
|
11 |
|
|
logical, allocatable, dimension(:) :: langevin_list |
12 |
|
|
integer, allocatable, dimension(:) :: radial_distance |
13 |
|
|
|
14 |
|
|
contains |
15 |
|
|
subroutine init_langevin_list(list_size) |
16 |
|
|
integer, intent(in) :: list_size |
17 |
|
|
allocate(langevin_list(list_size)) |
18 |
|
|
allocate(radial_distance(list_size)) |
19 |
|
|
end subroutine init_langevin_list |
20 |
|
|
|
21 |
|
|
subroutine delete_langevin_list() |
22 |
|
|
deallocate(langevin_list) |
23 |
|
|
deallocate(radial_distance) |
24 |
|
|
end subroutine delete_langevin_list |
25 |
|
|
|
26 |
|
|
subroutine create_langevin_list |
27 |
|
|
use simulation, ONLY : q, natoms |
28 |
|
|
real ( kind = DP ), dimension(ndim) :: this_cm |
29 |
|
|
real ( kind = DP ) :: local_max |
30 |
|
|
real ( kind = DP ) :: radial_max |
31 |
|
|
real ( kind = DP ) :: radial_max_skin |
32 |
|
|
real ( kind = DP ) :: radial_min_skin |
33 |
|
|
real ( kind = DP ) :: ricmsq |
34 |
|
|
real ( kind = DP ) :: this_dist |
35 |
|
|
real ( kind = DP ), dimension(ndim) :: ricm |
36 |
|
|
integer :: i,dim |
37 |
|
|
|
38 |
|
|
langevin_list = .false. |
39 |
|
|
local_max = 0.0E0_DP |
40 |
|
|
this_cm = get_com() |
41 |
|
|
radial_distance = 0.0E0_DP |
42 |
|
|
|
43 |
|
|
if (.not. use_langevin_skin) then |
44 |
|
|
langevin_list = .true. |
45 |
|
|
return |
46 |
|
|
end if |
47 |
|
|
|
48 |
|
|
if (sim_type == 'liquid') then |
49 |
|
|
langevin_list = .true. |
50 |
|
|
endif |
51 |
|
|
|
52 |
|
|
!. find max radius of cluster |
53 |
|
|
do i = 1,nlocal |
54 |
|
|
ricmsq = 0.0E0_DP |
55 |
|
|
ricm(1:ndim) = q(1:ndim,i) - this_cm(1:ndim) |
56 |
|
|
do dim = 1,ndim |
57 |
|
|
ricmsq = ricmsq + ricm(dim)*ricm(dim) |
58 |
|
|
end do |
59 |
|
|
radial_distance(i) = sqrt(ricmsq) |
60 |
|
|
this_dist = radial_distance(i) |
61 |
|
|
local_max = max(this_dist,local_max) |
62 |
|
|
end do |
63 |
|
|
|
64 |
|
|
#ifdef MPI |
65 |
|
|
call mpi_allreduce(local_max,radial_max,1,mpi_double_precision, & |
66 |
|
|
mpi_max,mpi_comm_world,mpi_err) |
67 |
|
|
#else |
68 |
|
|
radial_max = local_max |
69 |
|
|
#endif |
70 |
|
|
radial_max_skin = radial_max + langevin_skin_delta |
71 |
|
|
radial_min_skin = radial_max - langevin_skin_delta |
72 |
|
|
|
73 |
|
|
do i = 1, nlocal |
74 |
|
|
if ( (radial_distance(i) <= radial_max_skin) & |
75 |
|
|
.AND. & |
76 |
|
|
(radial_distance(i) >= radial_min_skin)) then |
77 |
|
|
|
78 |
|
|
langevin_list(i) = .true. |
79 |
|
|
endif |
80 |
|
|
end do |
81 |
|
|
|
82 |
|
|
end subroutine create_langevin_list |
83 |
|
|
|
84 |
|
|
|
85 |
|
|
|
86 |
|
|
end module langevin_cluster_list |