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.