1 |
program nano |
2 |
use definitions, ONLY : ndim,DP,machdep_init |
3 |
|
4 |
use parameter, ONLY : read_params,handle_args,sim_type, & |
5 |
command,paramfile,file_prefix, & |
6 |
target_temp,run_time,ensemble,checktemp |
7 |
use simulation, ONLY : deallocate_simulation,use_pbc |
8 |
use init_simulation, ONLY : nano_build_system |
9 |
use force_module, ONLY : init_forcefield_parameters,initialize_forcefield |
10 |
use velocity, ONLY : randomize_velocities |
11 |
use xyz_io, ONLY : open_xyz_files,read_initial_config,write_final_config |
12 |
#ifdef MPI |
13 |
use status, ONLY : info,error,warning,start_info,end_info,& |
14 |
mpi_start_info,init_info |
15 |
#else |
16 |
use status, ONLY : info,error,warning,start_info,end_info,& |
17 |
init_info |
18 |
#endif |
19 |
|
20 |
use dynamics, ONLY : run_dynamics |
21 |
use F2KCLI, ONLY : command_argument_count,get_command_argument |
22 |
#ifdef MPI |
23 |
use mpi_module, ONLY : mpi_bcast,mpi_finalize,mpi_handle_atypes, & |
24 |
mpi_err,mpi_comm_world,node,mpi_integer,mpi_dist_params,init_mpi |
25 |
#endif |
26 |
|
27 |
|
28 |
integer :: j, n_args, my_args |
29 |
real( kind = DP) :: current_temp |
30 |
character(len=80) :: junk |
31 |
character(len=120) :: msg |
32 |
character(len=60) :: prog_name |
33 |
logical :: assign_positions |
34 |
|
35 |
!errors |
36 |
integer :: arg_error |
37 |
integer :: command_error |
38 |
integer :: param_error |
39 |
integer :: open_file_error |
40 |
integer :: read_config_error |
41 |
#ifdef MPI |
42 |
call init_mpi() |
43 |
if (node == 0) then |
44 |
#endif |
45 |
|
46 |
n_args = command_argument_count() |
47 |
#ifdef MPI |
48 |
! my_args = n_args - 4 |
49 |
my_args = 5 |
50 |
#else |
51 |
my_args = n_args |
52 |
#endif |
53 |
if (my_args /= 5) then |
54 |
arg_error = 0 |
55 |
else |
56 |
arg_error = 1 |
57 |
endif |
58 |
|
59 |
|
60 |
#ifdef MPI |
61 |
endif |
62 |
call mpi_bcast(arg_error,1,mpi_integer,0,mpi_comm_world,mpi_err) |
63 |
#endif |
64 |
|
65 |
|
66 |
|
67 |
|
68 |
|
69 |
|
70 |
if (arg_error == 0) then |
71 |
call error('NANO', & |
72 |
'usage: nano paramfile file_prefix command temperature run_time') |
73 |
end if |
74 |
|
75 |
! set a null program name for other nodes |
76 |
prog_name = "Null" |
77 |
#ifdef MPI |
78 |
if (node.eq.0) then |
79 |
#endif |
80 |
!! get the current program name |
81 |
call get_command_argument(0,prog_name) |
82 |
prog_name = trim(prog_name) |
83 |
|
84 |
call get_command_argument(1,junk) |
85 |
read(junk, *) paramfile |
86 |
call get_command_argument(2,junk) |
87 |
read(junk, *) file_prefix |
88 |
call get_command_argument(3,junk) |
89 |
read(junk, *) command |
90 |
call get_command_argument(4,junk) |
91 |
read(junk, *) target_temp |
92 |
call get_command_argument(5,junk) |
93 |
read(junk, *) run_time |
94 |
#ifdef MPI |
95 |
endif |
96 |
#endif |
97 |
|
98 |
call machdep_init() |
99 |
|
100 |
#ifdef MPI |
101 |
if (node.eq.0) then |
102 |
#endif |
103 |
|
104 |
|
105 |
call handle_args(this_error = command_error) |
106 |
#ifdef MPI |
107 |
endif |
108 |
#endif |
109 |
|
110 |
! Distrubute error result to all nodes |
111 |
#ifdef MPI |
112 |
call mpi_bcast(command_error,1,mpi_integer,0,mpi_comm_world,mpi_err) |
113 |
#endif |
114 |
if (command_error /= 0) then |
115 |
write(msg,*) "Unknown command", command |
116 |
call error("PROGRAM",msg) |
117 |
endif |
118 |
|
119 |
#ifdef MPI |
120 |
if (node == 0) then |
121 |
#endif |
122 |
call read_params(this_error=param_error) |
123 |
call init_info() |
124 |
! Distrubute error result to all nodes |
125 |
#ifdef MPI |
126 |
endif |
127 |
call mpi_bcast(param_error,1,mpi_integer,0,mpi_comm_world,mpi_err) |
128 |
#endif |
129 |
! exit program gracefully if paramfile error |
130 |
if (param_error /= 0) then |
131 |
call error("MAIN","Error reading parmfile... Exiting") |
132 |
endif |
133 |
#ifdef MPI |
134 |
if (node == 0) then |
135 |
#endif |
136 |
call open_xyz_files(this_error=open_file_error) |
137 |
#ifdef MPI |
138 |
endif |
139 |
call mpi_bcast(open_file_error,1,mpi_integer,0,mpi_comm_world,mpi_err) |
140 |
#endif |
141 |
! exit program gracefully if paramfile error |
142 |
if (open_file_error /= 0) then |
143 |
call error("MAIN","Error opening files... Exiting") |
144 |
endif |
145 |
|
146 |
|
147 |
#ifdef MPI |
148 |
call mpi_dist_params() |
149 |
#endif |
150 |
|
151 |
|
152 |
call start_info(prog_name) |
153 |
|
154 |
call init_forcefield_parameters() |
155 |
|
156 |
|
157 |
use_pbc = .false. |
158 |
assign_positions = .false. |
159 |
if (command == 'setup') assign_positions = .true. |
160 |
if (sim_type == 'liquid') then |
161 |
use_pbc = .true. |
162 |
endif |
163 |
|
164 |
|
165 |
call nano_build_system(assign_positions) |
166 |
|
167 |
#ifdef MPI |
168 |
call mpi_start_info() |
169 |
#endif |
170 |
|
171 |
if (command /= 'setup') then |
172 |
call read_initial_config(read_config_error) |
173 |
end if |
174 |
|
175 |
|
176 |
|
177 |
! set up the neighborlist |
178 |
call initialize_forcefield() |
179 |
|
180 |
|
181 |
|
182 |
#ifdef MPI |
183 |
call mpi_handle_atypes() |
184 |
#endif |
185 |
|
186 |
|
187 |
if(checktemp.or.(ensemble == 'NVT')) then |
188 |
call randomize_velocities(target_temp) |
189 |
end if |
190 |
|
191 |
|
192 |
call run_dynamics() |
193 |
|
194 |
call write_final_config() |
195 |
call end_info() |
196 |
call deallocate_simulation() |
197 |
|
198 |
#ifdef MPI |
199 |
call mpi_finalize(mpi_err) |
200 |
#endif |
201 |
|
202 |
|
203 |
stop |
204 |
end program nano |
205 |
|
206 |
|