21character(len=255) :: fname
22character(len=2047) :: banner
23type(ddx_type) :: ddx_data
24type(ddx_state_type) :: state
25type(ddx_error_type) :: ddx_error
26type(ddx_electrostatics_type) :: electrostatics
27real(dp),
allocatable :: psi(:, :), force(:, :), charges(:), &
29real(dp) :: tol, esolv, start_time, finish_time
30integer :: i, isph, info
31100
format(1x,a,es11.4e2,a)
32200
format(1x,a,i4,a,es21.14)
34400
format(1x,a,es25.16e3)
35500
format(1x,i5,3es25.16e3)
38call get_command_argument(1, fname)
39write(6, *)
"Using provided file ", trim(fname),
" as a config file"
45start_time = omp_get_wtime()
46call ddfromfile(fname, ddx_data, tol, charges, ddx_error)
47finish_time = omp_get_wtime()
48write(*, 100)
"Initialization time:", finish_time - start_time,
" seconds"
49call check_error(ddx_error)
57call allocate_state(ddx_data % params, ddx_data % constants, state, ddx_error)
58call check_error(ddx_error)
61call get_banner(banner)
62write(6, *) trim(banner)
81start_time = omp_get_wtime()
90allocate(multipoles(1, ddx_data % params % nsph), stat=info)
92 write(6, *)
"Allocation failed in ddx_driver"
95multipoles(1, :) = charges/sqrt4pi
99 & ddx_data % workspace, multipoles, 0, electrostatics, ddx_error)
101finish_time = omp_get_wtime()
102write(*, 100)
"Electrostatic properties time:", finish_time-start_time, &
106start_time = omp_get_wtime()
107allocate(psi(ddx_data % constants % nbasis, ddx_data % params % nsph), &
110 write(6, *)
"Allocation failed in ddx_driver"
114finish_time = omp_get_wtime()
115write(*, 100)
"Psi time:", finish_time-start_time,
" seconds"
117if (ddx_data % params % force .eq. 1)
then
118 allocate(force(3, ddx_data % params % nsph), stat=info)
119 if (info .ne. 0)
then
120 write(6, *)
"Allocation failed in ddx_driver"
123 call ddrun(ddx_data, state, electrostatics, psi, tol, esolv, ddx_error, &
126 call ddrun(ddx_data, state, electrostatics, psi, tol, esolv, ddx_error)
128call check_error(ddx_error)
130if (ddx_data % params % force .eq. 1)
write(*, 100) &
131 &
"solvation force terms time:", state % force_time,
" seconds"
135if (ddx_data % params % force .eq. 1)
then
136 start_time = omp_get_wtime()
138 & ddx_data % workspace, state, 0, multipoles, force, ddx_error)
139 call check_error(ddx_error)
140 finish_time = omp_get_wtime()
141 write(*, 100)
"multipolar force terms time:", &
142 & finish_time - start_time,
" seconds"
148if (ddx_data % params % model .eq. 2)
then
150 do i = 1, state % phieps_niter
151 write(6, 200)
"iter=", i,
" relative difference: ", &
152 & state % phieps_rel_diff(i)
155 write(6, 100)
"ddpcm step time: ", state % phieps_time, &
157 write(6, 300)
"ddpcm step iterations: ", &
158 & state % phieps_niter
162if (ddx_data % params % model .eq. 3)
then
164 do i = 1, state % x_lpb_niter
165 write(6, 200)
"iter=", i,
" relative difference: ", &
166 & state % x_lpb_rel_diff(i)
169 write(6, 100)
"ddlpb step time: ", state % x_lpb_time, &
170 &
" seconds, of which:"
171 write(6, 100)
" ddcosmo: ", state % xs_time,
" seconds"
172 write(6, 100)
" hsp: ", state % hsp_time,
" seconds"
173 write(6, 100)
" coupling terms: ", state % x_lpb_time &
174 & - state % xs_time - state % hsp_time,
" seconds"
175 write(6, 300)
"ddlpb step iterations: ", state % x_lpb_niter
180if ((ddx_data % params % model.eq.1) .or. &
181 & (ddx_data % params % model.eq.2))
then
182 do i = 1, state % xs_niter
183 write(6, 200)
"iter=", i,
" relative difference: ", &
184 & state % xs_rel_diff(i)
187 write(6, 100)
"ddcosmo step time: ", state % xs_time,
" seconds"
188 write(6, 300)
"ddcosmo step iterations: ", state % xs_niter
192if (ddx_data % params % force .eq. 1)
then
194 if ((ddx_data % params % model.eq.1) .or. &
195 & (ddx_data % params % model.eq.2))
then
196 do i = 1, state % s_niter
197 write(6, 200)
"iter=", i,
" relative difference: ", &
198 & state % s_rel_diff(i)
201 write(6, 100)
"adjoint ddcosmo step time: ", state % s_time,
" seconds"
202 write(6, 300)
"adjoint ddcosmo step iterations: ", state % s_niter
206 if (ddx_data % params % model .eq. 2)
then
208 do i = 1, state % y_niter
209 write(6, 200)
"iter=", i,
" relative difference: ", &
210 & state % y_rel_diff(i)
212 write(6, 100)
"adjoint ddpcm step time: ", state % y_time,
" seconds"
213 write(6, 300)
"adjoint ddpcm step iterations: ", state % y_niter
217 if (ddx_data % params % model .eq. 3)
then
218 do i = 1, state % x_adj_lpb_niter
219 write(6, 200)
"iter=", i,
" relative difference: ", &
220 & state % x_adj_lpb_rel_diff(i)
223 write(6, 100)
"adjoint ddlpb step time: ", &
224 & state % x_adj_lpb_time,
" seconds, of which:"
225 write(6, 100)
" adjoint ddcosmo: ", state % s_time,
" seconds"
226 write(6, 100)
" adjoint hsp: ", state % hsp_adj_time,
" seconds"
227 write(6, 100)
" adjoint coupling terms: ", state % x_adj_lpb_time &
228 & - state % s_time - state % hsp_adj_time,
" seconds"
229 write(6, 200)
"adjoint ddlpb step iterations: ", &
230 & state % x_adj_lpb_niter
234write(6, 400)
"Solvation energy (Hartree):", esolv
235write(6, 400)
"Solvation energy (kcal/mol):", esolv*tokcal
236if (ddx_data % params % force .eq. 1)
then
237 write(6, *)
"Full forces (kcal/mol/A)"
238 do isph = 1, ddx_data % params % nsph
239 write(6, 500) isph, force(:, isph)*tokcal/toang
245deallocate(psi, multipoles, charges, stat=info)
247 write(6, *)
"Deallocation failed in ddx_driver"
250if (
allocated(force))
then
251 deallocate(force, stat=info)
252 if (info .ne. 0)
then
253 write(6, *)
"Deallocation failed in ddx_driver"
258call deallocate_electrostatics(electrostatics, ddx_error)
259call deallocate_state(state, ddx_error)
260call deallocate_model(ddx_data, ddx_error)
program main
Standalone application of ddX: this program can compute the solvation energy and forces for a solute ...
subroutine ddfromfile(fname, ddx_data, tol, charges, ddx_error)
Read the configuration from ddX input file and return a ddx_data structure.
subroutine ddrun(ddx_data, state, electrostatics, psi, tol, esolv, ddx_error, force, read_guess)
Main solver routine.
subroutine multipole_electrostatics(params, constants, workspace, multipoles, mmax, electrostatics, ddx_error)
Given a multipolar distribution, compute the required electrostatic properties for the chosen model.
subroutine multipole_force_terms(params, constants, workspace, state, mmax, multipoles, forces, ddx_error)
Given a multipolar distribution in real spherical harmonics and centered on the spheres,...
subroutine multipole_psi(params, multipoles, mmax, psi)
Given a multipolar distribution, assemble the RHS psi. The multipoles must be centered on the ddx sph...
Routines to build rhs (phi and psi)
High-level module of the ddX software.