1 |
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 |