22character(len=255) :: fname
23character(len=2047) :: banner
24type(ddx_type) :: ddx_data
25type(ddx_state_type) :: state
26type(ddx_error_type) :: ddx_error
27type(ddx_electrostatics_type) :: electrostatics
28real(dp),
allocatable :: psi(:, :), force(:, :), charges(:), &
30real(dp) :: tol, esolv, start_time, finish_time
31integer :: i, isph, info
32100
format(1x,a,es11.4e2,a)
33200
format(1x,a,i4,a,es21.14)
35400
format(1x,a,es25.16e3)
36500
format(1x,i5,3es25.16e3)
39call get_command_argument(1, fname)
40write(6, *)
"Using provided file ", trim(fname),
" as a config file"
46start_time = omp_get_wtime()
47call ddfromfile(fname, ddx_data, tol, charges, ddx_error)
48finish_time = omp_get_wtime()
49write(*, 100)
"Initialization time:", finish_time - start_time,
" seconds"
50call check_error(ddx_error)
58call allocate_state(ddx_data % params, ddx_data % constants, state, ddx_error)
59call check_error(ddx_error)
62call get_banner(banner)
63write(6, *) trim(banner)
82start_time = omp_get_wtime()
91allocate(multipoles(1, ddx_data % params % nsph), stat=info)
93 write(6, *)
"Allocation failed in ddx_driver"
96multipoles(1, :) = charges/sqrt4pi
100 & ddx_data % workspace, multipoles, 0, electrostatics, ddx_error)
102finish_time = omp_get_wtime()
103write(*, 100)
"Electrostatic properties time:", finish_time-start_time, &
107start_time = omp_get_wtime()
108allocate(psi(ddx_data % constants % nbasis, ddx_data % params % nsph), &
111 write(6, *)
"Allocation failed in ddx_driver"
115finish_time = omp_get_wtime()
116write(*, 100)
"Psi time:", finish_time-start_time,
" seconds"
118if (ddx_data % params % force .eq. 1)
then
119 allocate(force(3, ddx_data % params % nsph), stat=info)
120 if (info .ne. 0)
then
121 write(6, *)
"Allocation failed in ddx_driver"
124 call ddrun(ddx_data, state, electrostatics, psi, tol, esolv, ddx_error, &
127 call ddrun(ddx_data, state, electrostatics, psi, tol, esolv, ddx_error)
129call check_error(ddx_error)
131if (ddx_data % params % force .eq. 1)
write(*, 100) &
132 &
"solvation force terms time:", state % force_time,
" seconds"
136if (ddx_data % params % force .eq. 1)
then
137 start_time = omp_get_wtime()
139 & ddx_data % workspace, state, 0, multipoles, force, ddx_error)
140 call check_error(ddx_error)
141 finish_time = omp_get_wtime()
142 write(*, 100)
"multipolar force terms time:", &
143 & finish_time - start_time,
" seconds"
149if (ddx_data % params % model .eq. 2)
then
151 do i = 1, state % phieps_niter
152 write(6, 200)
"iter=", i,
" relative difference: ", &
153 & state % phieps_rel_diff(i)
156 write(6, 100)
"ddpcm step time: ", state % phieps_time, &
158 write(6, 300)
"ddpcm step iterations: ", &
159 & state % phieps_niter
163if (ddx_data % params % model .eq. 3)
then
165 do i = 1, state % x_lpb_niter
166 write(6, 200)
"iter=", i,
" relative difference: ", &
167 & state % x_lpb_rel_diff(i)
170 write(6, 100)
"ddlpb step time: ", state % x_lpb_time, &
171 &
" seconds, of which:"
172 write(6, 100)
" ddcosmo: ", state % xs_time,
" seconds"
173 write(6, 100)
" hsp: ", state % hsp_time,
" seconds"
174 write(6, 100)
" coupling terms: ", state % x_lpb_time &
175 & - state % xs_time - state % hsp_time,
" seconds"
176 write(6, 300)
"ddlpb step iterations: ", state % x_lpb_niter
181if ((ddx_data % params % model.eq.1) .or. &
182 & (ddx_data % params % model.eq.2))
then
183 do i = 1, state % xs_niter
184 write(6, 200)
"iter=", i,
" relative difference: ", &
185 & state % xs_rel_diff(i)
188 write(6, 100)
"ddcosmo step time: ", state % xs_time,
" seconds"
189 write(6, 300)
"ddcosmo step iterations: ", state % xs_niter
193if (ddx_data % params % force .eq. 1)
then
195 if ((ddx_data % params % model.eq.1) .or. &
196 & (ddx_data % params % model.eq.2))
then
197 do i = 1, state % s_niter
198 write(6, 200)
"iter=", i,
" relative difference: ", &
199 & state % s_rel_diff(i)
202 write(6, 100)
"adjoint ddcosmo step time: ", state % s_time,
" seconds"
203 write(6, 300)
"adjoint ddcosmo step iterations: ", state % s_niter
207 if (ddx_data % params % model .eq. 2)
then
209 do i = 1, state % y_niter
210 write(6, 200)
"iter=", i,
" relative difference: ", &
211 & state % y_rel_diff(i)
213 write(6, 100)
"adjoint ddpcm step time: ", state % y_time,
" seconds"
214 write(6, 300)
"adjoint ddpcm step iterations: ", state % y_niter
218 if (ddx_data % params % model .eq. 3)
then
219 do i = 1, state % x_adj_lpb_niter
220 write(6, 200)
"iter=", i,
" relative difference: ", &
221 & state % x_adj_lpb_rel_diff(i)
224 write(6, 100)
"adjoint ddlpb step time: ", &
225 & state % x_adj_lpb_time,
" seconds, of which:"
226 write(6, 100)
" adjoint ddcosmo: ", state % s_time,
" seconds"
227 write(6, 100)
" adjoint hsp: ", state % hsp_adj_time,
" seconds"
228 write(6, 100)
" adjoint coupling terms: ", state % x_adj_lpb_time &
229 & - state % s_time - state % hsp_adj_time,
" seconds"
230 write(6, 200)
"adjoint ddlpb step iterations: ", &
231 & state % x_adj_lpb_niter
235write(6, 400)
"Solvation energy (Hartree):", esolv
236write(6, 400)
"Solvation energy (kcal/mol):", esolv*tokcal
237if (ddx_data % params % force .eq. 1)
then
238 write(6, *)
"Full forces (kcal/mol/A)"
239 do isph = 1, ddx_data % params % nsph
240 write(6, 500) isph, force(:, isph)*tokcal/toang
246deallocate(psi, multipoles, charges, stat=info)
248 write(6, *)
"Deallocation failed in ddx_driver"
251if (
allocated(force))
then
252 deallocate(force, stat=info)
253 if (info .ne. 0)
then
254 write(6, *)
"Deallocation failed in ddx_driver"
259call deallocate_electrostatics(electrostatics, ddx_error)
260call deallocate_state(state, ddx_error)
261call 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.