LCOV - code coverage report
Current view: top level - src - qmmm_gpw_forces.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:42dac4a) Lines: 58.7 % 465 273
Test Date: 2025-07-25 12:55:17 Functions: 55.6 % 9 5

            Line data    Source code
       1              : !--------------------------------------------------------------------------------------------------!
       2              : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3              : !   Copyright 2000-2025 CP2K developers group <https://cp2k.org>                                   !
       4              : !                                                                                                  !
       5              : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6              : !--------------------------------------------------------------------------------------------------!
       7              : 
       8              : ! **************************************************************************************************
       9              : !> \brief Routines to compute energy and forces in a QM/MM calculation
      10              : !> \par History
      11              : !>      05.2004 created [tlaino]
      12              : !> \author Teodoro Laino
      13              : ! **************************************************************************************************
      14              : MODULE qmmm_gpw_forces
      15              :    USE cell_types,                      ONLY: cell_type,&
      16              :                                               pbc
      17              :    USE cp_control_types,                ONLY: dft_control_type
      18              :    USE cp_log_handling,                 ONLY: cp_get_default_logger,&
      19              :                                               cp_logger_type
      20              :    USE cp_output_handling,              ONLY: cp_print_key_finished_output,&
      21              :                                               cp_print_key_unit_nr
      22              :    USE cp_spline_utils,                 ONLY: pw_restrict_s3,&
      23              :                                               spline3_nopbc_interp,&
      24              :                                               spline3_pbc_interp
      25              :    USE cube_utils,                      ONLY: cube_info_type
      26              :    USE input_constants,                 ONLY: do_par_atom,&
      27              :                                               do_qmmm_coulomb,&
      28              :                                               do_qmmm_gauss,&
      29              :                                               do_qmmm_none,&
      30              :                                               do_qmmm_pcharge,&
      31              :                                               do_qmmm_swave
      32              :    USE input_section_types,             ONLY: section_vals_get_subs_vals,&
      33              :                                               section_vals_type,&
      34              :                                               section_vals_val_get
      35              :    USE kinds,                           ONLY: dp
      36              :    USE message_passing,                 ONLY: mp_comm_type,&
      37              :                                               mp_para_env_type,&
      38              :                                               mp_request_type
      39              :    USE mm_collocate_potential,          ONLY: collocate_gf_rspace_NoPBC,&
      40              :                                               integrate_gf_rspace_NoPBC
      41              :    USE particle_types,                  ONLY: particle_type
      42              :    USE pw_env_types,                    ONLY: pw_env_get,&
      43              :                                               pw_env_type
      44              :    USE pw_methods,                      ONLY: pw_axpy,&
      45              :                                               pw_integral_ab,&
      46              :                                               pw_transfer,&
      47              :                                               pw_zero
      48              :    USE pw_pool_types,                   ONLY: pw_pool_p_type,&
      49              :                                               pw_pool_type,&
      50              :                                               pw_pools_create_pws,&
      51              :                                               pw_pools_give_back_pws
      52              :    USE pw_types,                        ONLY: pw_c1d_gs_type,&
      53              :                                               pw_r3d_rs_type
      54              :    USE qmmm_gaussian_types,             ONLY: qmmm_gaussian_p_type,&
      55              :                                               qmmm_gaussian_type
      56              :    USE qmmm_gpw_energy,                 ONLY: qmmm_elec_with_gaussian,&
      57              :                                               qmmm_elec_with_gaussian_LG,&
      58              :                                               qmmm_elec_with_gaussian_LR
      59              :    USE qmmm_se_forces,                  ONLY: deriv_se_qmmm_matrix
      60              :    USE qmmm_tb_methods,                 ONLY: deriv_tb_qmmm_matrix,&
      61              :                                               deriv_tb_qmmm_matrix_pc
      62              :    USE qmmm_types_low,                  ONLY: qmmm_env_qm_type,&
      63              :                                               qmmm_per_pot_p_type,&
      64              :                                               qmmm_per_pot_type,&
      65              :                                               qmmm_pot_p_type,&
      66              :                                               qmmm_pot_type
      67              :    USE qmmm_util,                       ONLY: spherical_cutoff_factor
      68              :    USE qs_energy_types,                 ONLY: qs_energy_type
      69              :    USE qs_environment_types,            ONLY: get_qs_env,&
      70              :                                               qs_environment_type
      71              :    USE qs_ks_qmmm_types,                ONLY: qs_ks_qmmm_env_type
      72              :    USE qs_rho_types,                    ONLY: qs_rho_get,&
      73              :                                               qs_rho_type
      74              : #include "./base/base_uses.f90"
      75              : 
      76              :    IMPLICIT NONE
      77              : 
      78              :    PRIVATE
      79              :    LOGICAL, PARAMETER, PRIVATE    :: debug_this_module = .FALSE.
      80              :    REAL(KIND=dp), PARAMETER, PRIVATE    :: Dx = 0.01_dp     ! Debug Variables
      81              :    REAL(KIND=dp), PARAMETER, PRIVATE    :: MaxErr = 10.0_dp ! Debug Variables
      82              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qmmm_gpw_forces'
      83              :    PUBLIC :: qmmm_forces
      84              : 
      85              : CONTAINS
      86              : 
      87              : ! **************************************************************************************************
      88              : !> \brief General driver to Compute the contribution
      89              : !>      to the forces due to the QM/MM potential
      90              : !> \param qs_env ...
      91              : !> \param qmmm_env ...
      92              : !> \param mm_particles ...
      93              : !> \param calc_force ...
      94              : !> \param mm_cell ...
      95              : !> \par History
      96              : !>      06.2004 created [tlaino]
      97              : !> \author Teodoro Laino
      98              : ! **************************************************************************************************
      99         3802 :    SUBROUTINE qmmm_forces(qs_env, qmmm_env, mm_particles, calc_force, mm_cell)
     100              :       TYPE(qs_environment_type), POINTER                 :: qs_env
     101              :       TYPE(qmmm_env_qm_type), POINTER                    :: qmmm_env
     102              :       TYPE(particle_type), DIMENSION(:), POINTER         :: mm_particles
     103              :       LOGICAL, INTENT(in), OPTIONAL                      :: calc_force
     104              :       TYPE(cell_type), POINTER                           :: mm_cell
     105              : 
     106              :       CHARACTER(len=*), PARAMETER                        :: routineN = 'qmmm_forces'
     107              : 
     108              :       INTEGER                                            :: handle, iatom, image_IndMM, Imm, IndMM, &
     109              :                                                             ispin, iw
     110              :       LOGICAL                                            :: gapw, need_f, periodic
     111         3802 :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: Forces, Forces_added_charges, &
     112         3802 :                                                             Forces_added_shells
     113              :       TYPE(cp_logger_type), POINTER                      :: logger
     114              :       TYPE(dft_control_type), POINTER                    :: dft_control
     115              :       TYPE(mp_para_env_type), POINTER                    :: para_env
     116              :       TYPE(pw_c1d_gs_type), POINTER                      :: rho0_s_gs, rho_core
     117              :       TYPE(pw_env_type), POINTER                         :: pw_env
     118         3802 :       TYPE(pw_pool_p_type), DIMENSION(:), POINTER        :: pw_pools
     119              :       TYPE(pw_pool_type), POINTER                        :: auxbas_pool
     120         3802 :       TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER        :: rho_r
     121              :       TYPE(pw_r3d_rs_type), POINTER                      :: rho_tot_r, rho_tot_r2
     122              :       TYPE(qs_energy_type), POINTER                      :: energy
     123              :       TYPE(qs_ks_qmmm_env_type), POINTER                 :: ks_qmmm_env_loc
     124              :       TYPE(qs_rho_type), POINTER                         :: rho
     125              :       TYPE(section_vals_type), POINTER                   :: input_section, interp_section, &
     126              :                                                             print_section
     127              : 
     128         3802 :       CALL timeset(routineN, handle)
     129         3802 :       need_f = .TRUE.
     130         3802 :       periodic = qmmm_env%periodic
     131         3802 :       IF (PRESENT(calc_force)) need_f = calc_force
     132         3802 :       NULLIFY (dft_control, ks_qmmm_env_loc, rho, pw_env, rho_tot_r, energy, Forces, &
     133         3802 :                Forces_added_charges, input_section, rho0_s_gs, rho_r)
     134              :       CALL get_qs_env(qs_env=qs_env, &
     135              :                       rho=rho, &
     136              :                       rho_core=rho_core, &
     137              :                       pw_env=pw_env, &
     138              :                       energy=energy, &
     139              :                       para_env=para_env, &
     140              :                       input=input_section, &
     141              :                       rho0_s_gs=rho0_s_gs, &
     142         3802 :                       dft_control=dft_control)
     143              : 
     144         3802 :       CALL qs_rho_get(rho, rho_r=rho_r)
     145              : 
     146         3802 :       logger => cp_get_default_logger()
     147         3802 :       ks_qmmm_env_loc => qs_env%ks_qmmm_env
     148         3802 :       interp_section => section_vals_get_subs_vals(input_section, "QMMM%INTERPOLATOR")
     149         3802 :       print_section => section_vals_get_subs_vals(input_section, "QMMM%PRINT")
     150              :       iw = cp_print_key_unit_nr(logger, print_section, "PROGRAM_RUN_INFO", &
     151         3802 :                                 extension=".qmmmLog")
     152         3802 :       gapw = dft_control%qs_control%gapw
     153              :       ! If forces are required allocate these temporary arrays
     154         3802 :       IF (need_f) THEN
     155         5232 :          ALLOCATE (Forces(3, qmmm_env%num_mm_atoms))
     156         3520 :          ALLOCATE (Forces_added_charges(3, qmmm_env%added_charges%num_mm_atoms))
     157         3490 :          ALLOCATE (Forces_added_shells(3, qmmm_env%added_shells%num_mm_atoms))
     158      4977168 :          Forces(:, :) = 0.0_dp
     159         2192 :          Forces_added_charges(:, :) = 0.0_dp
     160         1968 :          Forces_added_shells(:, :) = 0.0_dp
     161              :       END IF
     162         3802 :       IF (dft_control%qs_control%semi_empirical) THEN
     163              :          ! SEMIEMPIRICAL
     164         2382 :          SELECT CASE (qmmm_env%qmmm_coupl_type)
     165              :          CASE (do_qmmm_coulomb)
     166              :             CALL deriv_se_qmmm_matrix(qs_env, qmmm_env, mm_particles, mm_cell, para_env, &
     167          936 :                                       need_f, Forces, Forces_added_charges)
     168              :          CASE (do_qmmm_pcharge)
     169            0 :             CPABORT("Point Charge QM/MM electrostatic coupling not yet implemented for SE.")
     170              :          CASE (do_qmmm_gauss, do_qmmm_swave)
     171            0 :             CPABORT("GAUSS or SWAVE QM/MM electrostatic coupling not yet implemented for SE.")
     172              :          CASE (do_qmmm_none)
     173          510 :             IF (iw > 0) WRITE (iw, '(T2,"QMMM|",1X,A)') &
     174          176 :                "- No QM/MM Electrostatic coupling. Just Mechanical Coupling!"
     175              :          CASE DEFAULT
     176            0 :             IF (iw > 0) WRITE (iw, '(T2,"QMMM|",1X,A)') "Unknown Coupling..."
     177         1446 :             CPABORT("")
     178              :          END SELECT
     179         2356 :       ELSEIF (dft_control%qs_control%dftb .OR. dft_control%qs_control%xtb) THEN
     180              :          ! DFTB
     181         1580 :          SELECT CASE (qmmm_env%qmmm_coupl_type)
     182              :          CASE (do_qmmm_none)
     183            8 :             IF (iw > 0) WRITE (iw, '(T2,"QMMM|",1X,A)') &
     184            4 :                "- No QM/MM Electrostatic coupling. Just Mechanical Coupling!"
     185              :          CASE (do_qmmm_coulomb)
     186              :             CALL deriv_tb_qmmm_matrix(qs_env, qmmm_env, mm_particles, mm_cell, para_env, &
     187          448 :                                       need_f, Forces, Forces_added_charges)
     188              :          CASE (do_qmmm_pcharge)
     189              :             CALL deriv_tb_qmmm_matrix_pc(qs_env, qmmm_env, mm_particles, mm_cell, para_env, &
     190         1116 :                                          need_f, Forces, Forces_added_charges)
     191              :          CASE (do_qmmm_gauss, do_qmmm_swave)
     192            0 :             CPABORT("GAUSS or SWAVE QM/MM electrostatic coupling not yet implemented for DFTB.")
     193              :          CASE DEFAULT
     194            0 :             IF (iw > 0) WRITE (iw, '(T2,"QMMM|",1X,A)') "Unknown Coupling..."
     195         1572 :             CPABORT("")
     196              :          END SELECT
     197         1572 :          IF (need_f) THEN
     198         1116 :             Forces(:, :) = Forces(:, :)/REAL(para_env%num_pe, KIND=dp)
     199           60 :             Forces_added_charges(:, :) = Forces_added_charges(:, :)/REAL(para_env%num_pe, KIND=dp)
     200              :          END IF
     201              :       ELSE
     202              :          ! GPW/GAPW
     203              :          CALL pw_env_get(pw_env=pw_env, &
     204              :                          pw_pools=pw_pools, &
     205          784 :                          auxbas_pw_pool=auxbas_pool)
     206              :          NULLIFY (rho_tot_r)
     207          784 :          ALLOCATE (rho_tot_r)
     208          784 :          CALL auxbas_pool%create_pw(rho_tot_r)
     209              :          ! IF GAPW the core charge is replaced by the compensation charge
     210          784 :          IF (gapw) THEN
     211          134 :             IF (dft_control%qs_control%gapw_control%nopaw_as_gpw) THEN
     212            6 :                CALL pw_transfer(rho_core, rho_tot_r)
     213            6 :                energy%qmmm_nu = pw_integral_ab(rho_tot_r, ks_qmmm_env_loc%v_qmmm_rspace)
     214            6 :                NULLIFY (rho_tot_r2)
     215            6 :                ALLOCATE (rho_tot_r2)
     216            6 :                CALL auxbas_pool%create_pw(rho_tot_r2)
     217            6 :                CALL pw_transfer(rho0_s_gs, rho_tot_r2)
     218            6 :                CALL pw_axpy(rho_tot_r2, rho_tot_r)
     219            6 :                CALL auxbas_pool%give_back_pw(rho_tot_r2)
     220            6 :                DEALLOCATE (rho_tot_r2)
     221              :             ELSE
     222          128 :                CALL pw_transfer(rho0_s_gs, rho_tot_r)
     223              :                !
     224              :                ! QM/MM Nuclear Electrostatic Potential already included through rho0
     225              :                !
     226          128 :                energy%qmmm_nu = 0.0_dp
     227              :             END IF
     228              :          ELSE
     229          650 :             CALL pw_transfer(rho_core, rho_tot_r)
     230              :             !
     231              :             ! Computes the QM/MM Nuclear Electrostatic Potential
     232              :             !
     233          650 :             energy%qmmm_nu = pw_integral_ab(rho_tot_r, ks_qmmm_env_loc%v_qmmm_rspace)
     234              :          END IF
     235          784 :          IF (need_f) THEN
     236              :             !
     237          798 :             DO ispin = 1, SIZE(rho_r)
     238          798 :                CALL pw_axpy(rho_r(ispin), rho_tot_r)
     239              :             END DO
     240          386 :             IF (iw > 0) WRITE (iw, '(T2,"QMMM|",1X,A)') "Evaluating forces on MM atoms due to the:"
     241              :             ! Electrostatic Interaction type...
     242          386 :             SELECT CASE (qmmm_env%qmmm_coupl_type)
     243              :             CASE (do_qmmm_coulomb)
     244            0 :                CPABORT("Coulomb QM/MM electrostatic coupling not implemented for GPW/GAPW.")
     245              :             CASE (do_qmmm_pcharge)
     246            0 :                CPABORT("Point Charge QM/MM electrostatic coupling not yet implemented for GPW/GAPW.")
     247              :             CASE (do_qmmm_gauss, do_qmmm_swave)
     248          346 :                IF (iw > 0) WRITE (iw, '(T2,"QMMM|",1X,A)') &
     249          177 :                   "- QM/MM Coupling computed collocating the Gaussian Potential Functions."
     250              :                CALL qmmm_forces_with_gaussian(rho=rho_tot_r, &
     251              :                                               qmmm_env=qmmm_env, &
     252              :                                               mm_particles=mm_particles, &
     253              :                                               aug_pools=qmmm_env%aug_pools, &
     254              :                                               auxbas_grid=qmmm_env%gridlevel_info%auxbas_grid, &
     255              :                                               coarser_grid=qmmm_env%gridlevel_info%coarser_grid, &
     256              :                                               para_env=para_env, &
     257              :                                               pw_pools=pw_pools, &
     258              :                                               eps_mm_rspace=qmmm_env%eps_mm_rspace, &
     259              :                                               cube_info=ks_qmmm_env_loc%cube_info, &
     260              :                                               Forces=Forces, &
     261              :                                               Forces_added_charges=Forces_added_charges, &
     262              :                                               Forces_added_shells=Forces_added_shells, &
     263              :                                               interp_section=interp_section, &
     264              :                                               iw=iw, &
     265          346 :                                               mm_cell=mm_cell)
     266              :             CASE (do_qmmm_none)
     267           40 :                IF (iw > 0) WRITE (iw, '(T2,"QMMM|",1X,A)') &
     268           20 :                   "- No QM/MM Electrostatic coupling. Just Mechanical Coupling!"
     269              :             CASE DEFAULT
     270            0 :                IF (iw > 0) WRITE (iw, '(T2,"QMMM|",1X,A)') "- Unknown Coupling..."
     271          386 :                CPABORT("")
     272              :             END SELECT
     273              :          END IF
     274              :       END IF
     275              :       ! Correct Total Energy adding the contribution of the QM/MM nuclear interaction
     276         3802 :       energy%total = energy%total + energy%qmmm_nu
     277              :       ! Proceed if gradients are requested..
     278         3802 :       IF (need_f) THEN
     279              :          !ikuo Temporary change to alleviate compiler problems on Intel with
     280              :          !array dimension of 0
     281      9952592 :          IF (qmmm_env%num_mm_atoms /= 0) CALL para_env%sum(Forces)
     282         2640 :          IF (qmmm_env%added_charges%num_mm_atoms /= 0) CALL para_env%sum(Forces_added_charges)
     283         2192 :          IF (qmmm_env%added_shells%num_mm_atoms /= 0) CALL para_env%sum(Forces_added_shells)
     284              :          ! Debug Forces
     285              :          IF (debug_this_module) THEN
     286              :             IF (dft_control%qs_control%semi_empirical .OR. &
     287              :                 dft_control%qs_control%dftb .OR. dft_control%qs_control%xtb) THEN
     288              :                WRITE (iw, *) "NO DEBUG AVAILABLE in module"//TRIM(routineN)
     289              :             ELSE
     290              :                ! Print Out Forces
     291              :                IF (iw > 0) THEN
     292              :                   DO Imm = 1, SIZE(qmmm_env%mm_atom_index)
     293              :                      WRITE (iw, *) "ANALYTICAL FORCES:"
     294              :                      IndMM = qmmm_env%mm_atom_index(Imm)
     295              :                      WRITE (iw, '(I6,3F15.9)') IndMM, Forces(:, Imm)
     296              :                   END DO
     297              :                END IF
     298              :                CALL qmmm_debug_forces(rho=rho_tot_r, &
     299              :                                       qs_env=qs_env, &
     300              :                                       qmmm_env=qmmm_env, &
     301              :                                       Analytical_Forces=Forces, &
     302              :                                       mm_particles=mm_particles, &
     303              :                                       mm_atom_index=qmmm_env%mm_atom_index, &
     304              :                                       num_mm_atoms=qmmm_env%num_mm_atoms, &
     305              :                                       interp_section=interp_section, &
     306              :                                       mm_cell=mm_cell)
     307              :             END IF
     308              :          END IF
     309              :       END IF
     310              :       ! Give back rho_tot_t to auxbas_pool only for GPW/GAPW
     311              :       IF ((.NOT. dft_control%qs_control%semi_empirical) .AND. &
     312         3802 :           (.NOT. dft_control%qs_control%dftb) .AND. (.NOT. dft_control%qs_control%xtb)) THEN
     313          784 :          CALL auxbas_pool%give_back_pw(rho_tot_r)
     314          784 :          DEALLOCATE (rho_tot_r)
     315              :       END IF
     316         3802 :       IF (iw > 0) THEN
     317         1023 :          IF (.NOT. gapw) WRITE (iw, '(T2,"QMMM|",1X,A,T66,F15.9)') &
     318          959 :             "QM/MM Nuclear Electrostatic Potential :", energy%qmmm_nu
     319              :          WRITE (iw, '(T2,"QMMM|",1X,A,T66,F15.9)') &
     320         1023 :             "QMMM Total Energy (QM + QMMM electronic + QMMM nuclear):", energy%total
     321              :          WRITE (iw, '(T2,"QMMM|",1X,A)') "MM energy NOT included in the above term!"// &
     322         1023 :             " Check for:  FORCE_EVAL ( QMMM )"
     323         1023 :          WRITE (iw, '(T2,"QMMM|",1X,A)') "that includes both QM, QMMM and MM energy terms!"
     324              :       END IF
     325         3802 :       IF (need_f) THEN
     326              :          ! Transfer Forces
     327      1245600 :          DO Imm = 1, qmmm_env%num_mm_atoms
     328      1243856 :             IndMM = qmmm_env%mm_atom_index(Imm)
     329              : 
     330              :             !add image forces to Forces
     331      1243856 :             IF (qmmm_env%image_charge) THEN
     332         1920 :                DO iatom = 1, qmmm_env%num_image_mm_atoms
     333         1280 :                   image_IndMM = qmmm_env%image_charge_pot%image_mm_list(iatom)
     334         1920 :                   IF (image_IndMM .EQ. IndMM) THEN
     335              :                      Forces(:, Imm) = Forces(:, Imm) &
     336          320 :                                       + qmmm_env%image_charge_pot%image_forcesMM(:, iatom)
     337              :                   END IF
     338              :                END DO
     339              :             END IF
     340              : 
     341              :             ! Hack: In Forces there the gradients indeed...
     342              :             ! Minux sign to take care of this misunderstanding...
     343      9952592 :             mm_particles(IndMM)%f(:) = -Forces(:, Imm) + mm_particles(IndMM)%f(:)
     344              :          END DO
     345         1744 :          DEALLOCATE (Forces)
     346         1744 :          IF (qmmm_env%move_mm_charges .OR. qmmm_env%add_mm_charges) THEN
     347          144 :             DO Imm = 1, qmmm_env%added_charges%num_mm_atoms
     348          112 :                IndMM = qmmm_env%added_charges%mm_atom_index(Imm)
     349              :                ! Hack: In Forces there the gradients indeed...
     350              :                ! Minux sign to take care of this misunderstanding...
     351         2640 :                qmmm_env%added_charges%added_particles(IndMM)%f(:) = -Forces_added_charges(:, Imm)
     352              :             END DO
     353              :          END IF
     354         1744 :          DEALLOCATE (Forces_added_charges)
     355         1744 :          IF (qmmm_env%added_shells%num_mm_atoms .GT. 0) THEN
     356           58 :             DO Imm = 1, qmmm_env%added_shells%num_mm_atoms
     357           56 :                IndMM = qmmm_env%added_shells%mm_core_index(Imm)
     358              :                ! Hack: In Forces there the gradients indeed...
     359              :                ! Minux sign to take care of this misunderstanding...
     360              :                qmmm_env%added_shells%added_particles(Imm)%f(:) = qmmm_env%added_shells%added_particles(Imm)%f(:) - &
     361          450 :                                                                  Forces_added_shells(:, Imm)
     362              : 
     363              :             END DO
     364              :          END IF
     365         1744 :          DEALLOCATE (Forces_added_shells)
     366              :       END IF
     367         3802 :       CALL cp_print_key_finished_output(iw, logger, print_section, "PROGRAM_RUN_INFO")
     368         3802 :       CALL timestop(handle)
     369              : 
     370         3802 :    END SUBROUTINE qmmm_forces
     371              : 
     372              : ! **************************************************************************************************
     373              : !> \brief Evaluates the contribution to the forces due to the
     374              : !>      QM/MM potential computed collocating the Electrostatic
     375              : !>      Gaussian Potential.
     376              : !> \param rho ...
     377              : !> \param qmmm_env ...
     378              : !> \param mm_particles ...
     379              : !> \param aug_pools ...
     380              : !> \param auxbas_grid ...
     381              : !> \param coarser_grid ...
     382              : !> \param cube_info ...
     383              : !> \param para_env ...
     384              : !> \param eps_mm_rspace ...
     385              : !> \param pw_pools ...
     386              : !> \param Forces ...
     387              : !> \param Forces_added_charges ...
     388              : !> \param Forces_added_shells ...
     389              : !> \param interp_section ...
     390              : !> \param iw ...
     391              : !> \param mm_cell ...
     392              : !> \par History
     393              : !>      06.2004 created [tlaino]
     394              : !> \author Teodoro Laino
     395              : ! **************************************************************************************************
     396          346 :    SUBROUTINE qmmm_forces_with_gaussian(rho, qmmm_env, mm_particles, &
     397              :                                         aug_pools, auxbas_grid, coarser_grid, cube_info, para_env, &
     398              :                                         eps_mm_rspace, pw_pools, Forces, Forces_added_charges, Forces_added_shells, &
     399              :                                         interp_section, iw, mm_cell)
     400              :       TYPE(pw_r3d_rs_type), POINTER                      :: rho
     401              :       TYPE(qmmm_env_qm_type), POINTER                    :: qmmm_env
     402              :       TYPE(particle_type), DIMENSION(:), POINTER         :: mm_particles
     403              :       TYPE(pw_pool_p_type), DIMENSION(:), POINTER        :: aug_pools
     404              :       INTEGER, INTENT(IN)                                :: auxbas_grid, coarser_grid
     405              :       TYPE(cube_info_type), DIMENSION(:), POINTER        :: cube_info
     406              :       TYPE(mp_para_env_type), POINTER                    :: para_env
     407              :       REAL(KIND=dp), INTENT(IN)                          :: eps_mm_rspace
     408              :       TYPE(pw_pool_p_type), DIMENSION(:), POINTER        :: pw_pools
     409              :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: Forces, Forces_added_charges, &
     410              :                                                             Forces_added_shells
     411              :       TYPE(section_vals_type), POINTER                   :: interp_section
     412              :       INTEGER, INTENT(IN)                                :: iw
     413              :       TYPE(cell_type), POINTER                           :: mm_cell
     414              : 
     415              :       CHARACTER(len=*), PARAMETER :: routineN = 'qmmm_forces_with_gaussian'
     416              : 
     417              :       INTEGER                                            :: handle, i, igrid, j, k, kind_interp, me, &
     418              :                                                             ngrids, stat
     419              :       INTEGER, DIMENSION(3)                              :: glb, gub, lb, ub
     420          346 :       INTEGER, DIMENSION(:), POINTER                     :: pos_of_x
     421              :       LOGICAL                                            :: shells
     422          346 :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: tmp
     423              :       TYPE(mp_comm_type)                                 :: group
     424              :       TYPE(mp_request_type)                              :: request
     425          346 :       TYPE(pw_r3d_rs_type), ALLOCATABLE, DIMENSION(:)    :: grids
     426              : 
     427              : ! Statements
     428              : 
     429          346 :       CALL timeset(routineN, handle)
     430          346 :       NULLIFY (tmp)
     431          346 :       CPASSERT(ASSOCIATED(mm_particles))
     432          346 :       CPASSERT(ASSOCIATED(qmmm_env%mm_atom_chrg))
     433          346 :       CPASSERT(ASSOCIATED(qmmm_env%mm_atom_index))
     434          346 :       CPASSERT(ASSOCIATED(Forces))
     435              :       !Statements
     436          346 :       ngrids = SIZE(pw_pools)
     437          346 :       CALL pw_pools_create_pws(aug_pools, grids)
     438         1754 :       DO igrid = 1, ngrids
     439         1754 :          CALL pw_zero(grids(igrid))
     440              :       END DO
     441              :       ! Collocate Density on multigrids
     442         1384 :       lb = rho%pw_grid%bounds_local(1, :)
     443         1384 :       ub = rho%pw_grid%bounds_local(2, :)
     444              :       grids(auxbas_grid)%array(lb(1):ub(1), &
     445              :                                lb(2):ub(2), &
     446     15548762 :                                lb(3):ub(3)) = rho%array
     447              :       ! copy the boundaries
     448         7386 :       DO i = lb(1), ub(1)
     449         7386 :          grids(auxbas_grid)%array(i, ub(2) + 1, ub(3) + 1) = rho%array(i, lb(2), lb(3))
     450              :       END DO
     451        13914 :       DO k = lb(3), ub(3)
     452       324058 :          DO i = lb(1), ub(1)
     453       323712 :             grids(auxbas_grid)%array(i, ub(2) + 1, k) = rho%array(i, lb(2), k)
     454              :          END DO
     455              :       END DO
     456        13786 :       DO j = lb(2), ub(2)
     457       319834 :          DO i = lb(1), ub(1)
     458       319488 :             grids(auxbas_grid)%array(i, j, ub(3) + 1) = rho%array(i, j, lb(3))
     459              :          END DO
     460              :       END DO
     461          346 :       pos_of_x => grids(auxbas_grid)%pw_grid%para%pos_of_x
     462          346 :       group = grids(auxbas_grid)%pw_grid%para%group
     463          346 :       me = grids(auxbas_grid)%pw_grid%para%group%mepos
     464         1384 :       glb = rho%pw_grid%bounds(1, :)
     465         1384 :       gub = rho%pw_grid%bounds(2, :)
     466          346 :       IF ((pos_of_x(glb(1)) .EQ. me) .AND. (pos_of_x(gub(1)) .EQ. me)) THEN
     467          520 :          DO k = lb(3), ub(3)
     468        33280 :             DO j = lb(2), ub(2)
     469        33280 :                grids(auxbas_grid)%array(ub(1) + 1, j, k) = rho%array(lb(1), j, k)
     470              :             END DO
     471          520 :             grids(auxbas_grid)%array(ub(1) + 1, ub(2) + 1, k) = rho%array(lb(1), lb(2), k)
     472              :          END DO
     473          520 :          DO j = lb(2), ub(2)
     474          520 :             grids(auxbas_grid)%array(ub(1) + 1, j, ub(3) + 1) = rho%array(lb(1), j, lb(3))
     475              :          END DO
     476            8 :          grids(auxbas_grid)%array(ub(1) + 1, ub(2) + 1, ub(3) + 1) = rho%array(lb(1), lb(2), lb(3))
     477          338 :       ELSE IF (pos_of_x(glb(1)) .EQ. me) THEN
     478              :          ALLOCATE (tmp(rho%pw_grid%bounds_local(1, 2):rho%pw_grid%bounds_local(2, 2), &
     479              :                        rho%pw_grid%bounds_local(1, 3):rho%pw_grid%bounds_local(2, 3)), &
     480          676 :                    stat=stat)
     481          169 :          CPASSERT(stat == 0)
     482       559954 :          tmp = rho%array(lb(1), :, :)
     483              :          CALL group%isend(msgin=tmp, dest=pos_of_x(rho%pw_grid%bounds(2, 1)), &
     484          169 :                           request=request, tag=112)
     485          169 :          CALL request%wait()
     486          169 :       ELSE IF (pos_of_x(gub(1)) .EQ. me) THEN
     487              :          ALLOCATE (tmp(rho%pw_grid%bounds_local(1, 2):rho%pw_grid%bounds_local(2, 2), &
     488              :                        rho%pw_grid%bounds_local(1, 3):rho%pw_grid%bounds_local(2, 3)), &
     489          676 :                    stat=stat)
     490            0 :          CPASSERT(stat == 0)
     491              :          CALL group%irecv(msgout=tmp, source=pos_of_x(rho%pw_grid%bounds(1, 1)), &
     492          169 :                           request=request, tag=112)
     493          169 :          CALL request%wait()
     494              : 
     495         6697 :          DO k = lb(3), ub(3)
     496       279808 :             DO j = lb(2), ub(2)
     497       279808 :                grids(auxbas_grid)%array(ub(1) + 1, j, k) = tmp(j, k)
     498              :             END DO
     499         6697 :             grids(auxbas_grid)%array(ub(1) + 1, ub(2) + 1, k) = tmp(lb(2), k)
     500              :          END DO
     501         6633 :          DO j = lb(2), ub(2)
     502         6633 :             grids(auxbas_grid)%array(ub(1) + 1, j, ub(3) + 1) = tmp(j, lb(3))
     503              :          END DO
     504          169 :          grids(auxbas_grid)%array(ub(1) + 1, ub(2) + 1, ub(3) + 1) = tmp(lb(2), lb(3))
     505              :       END IF
     506          346 :       IF (ASSOCIATED(tmp)) THEN
     507          338 :          DEALLOCATE (tmp)
     508              :       END IF
     509              :       ! Further setup of parallelization scheme
     510          346 :       IF (qmmm_env%par_scheme == do_par_atom) THEN
     511          338 :          CALL para_env%sum(grids(auxbas_grid)%array)
     512              :       END IF
     513              :       ! RealSpace Interpolation
     514          346 :       CALL section_vals_val_get(interp_section, "kind", i_val=kind_interp)
     515          346 :       SELECT CASE (kind_interp)
     516              :       CASE (spline3_nopbc_interp, spline3_pbc_interp)
     517              :          ! Spline Interpolator
     518         1408 :          DO Igrid = auxbas_grid, SIZE(grids) - 1
     519              :             CALL pw_restrict_s3(grids(Igrid), &
     520              :                                 grids(Igrid + 1), &
     521              :                                 aug_pools(Igrid + 1)%pool, &
     522         1408 :                                 param_section=interp_section)
     523              :          END DO
     524              :       CASE DEFAULT
     525          346 :          CPABORT("")
     526              :       END SELECT
     527              : 
     528          346 :       shells = .FALSE.
     529              :       CALL qmmm_force_with_gaussian_low(grids, mm_particles, &
     530              :                                         qmmm_env%mm_atom_chrg, qmmm_env%mm_atom_index, &
     531              :                                         qmmm_env%num_mm_atoms, cube_info, para_env, eps_mm_rspace, auxbas_grid, &
     532              :                                         coarser_grid, qmmm_env%pgfs, qmmm_env%potentials, Forces, aug_pools, &
     533              :                                         mm_cell, qmmm_env%dOmmOqm, qmmm_env%periodic, qmmm_env%per_potentials, &
     534          346 :                                         iw, qmmm_env%par_scheme, qmmm_env%spherical_cutoff, shells)
     535              : 
     536          346 :       IF (qmmm_env%move_mm_charges .OR. qmmm_env%add_mm_charges) THEN
     537              :          CALL qmmm_force_with_gaussian_low(grids, qmmm_env%added_charges%added_particles, &
     538              :                                            qmmm_env%added_charges%mm_atom_chrg, &
     539              :                                            qmmm_env%added_charges%mm_atom_index, qmmm_env%added_charges%num_mm_atoms, &
     540              :                                        cube_info, para_env, eps_mm_rspace, auxbas_grid, coarser_grid, qmmm_env%added_charges%pgfs, &
     541              :                                            qmmm_env%added_charges%potentials, Forces_added_charges, aug_pools, mm_cell, &
     542              :                               qmmm_env%dOmmOqm, qmmm_env%periodic, qmmm_env%added_charges%per_potentials, iw, qmmm_env%par_scheme, &
     543           32 :                                            qmmm_env%spherical_cutoff, shells)
     544              :       END IF
     545              : 
     546          346 :       IF (qmmm_env%added_shells%num_mm_atoms .GT. 0) THEN
     547            2 :          shells = .TRUE.
     548              :          CALL qmmm_force_with_gaussian_low(grids, qmmm_env%added_shells%added_particles, &
     549              :                                            qmmm_env%added_shells%mm_core_chrg, &
     550              :                                            qmmm_env%added_shells%mm_core_index, qmmm_env%added_shells%num_mm_atoms, &
     551              :                                         cube_info, para_env, eps_mm_rspace, auxbas_grid, coarser_grid, qmmm_env%added_shells%pgfs, &
     552              :                                            qmmm_env%added_shells%potentials, Forces_added_shells, aug_pools, mm_cell, &
     553              :                                qmmm_env%dOmmOqm, qmmm_env%periodic, qmmm_env%added_shells%per_potentials, iw, qmmm_env%par_scheme, &
     554            2 :                                            qmmm_env%spherical_cutoff, shells)
     555              :       END IF
     556              : 
     557          346 :       CALL pw_pools_give_back_pws(aug_pools, grids)
     558          346 :       CALL timestop(handle)
     559              : 
     560          692 :    END SUBROUTINE qmmm_forces_with_gaussian
     561              : 
     562              : ! **************************************************************************************************
     563              : !> \brief Evaluates the contribution to the forces due to the
     564              : !>      QM/MM potential computed collocating the Electrostatic
     565              : !>      Gaussian Potential. Low Level
     566              : !> \param grids ...
     567              : !> \param mm_particles ...
     568              : !> \param mm_charges ...
     569              : !> \param mm_atom_index ...
     570              : !> \param num_mm_atoms ...
     571              : !> \param cube_info ...
     572              : !> \param para_env ...
     573              : !> \param eps_mm_rspace ...
     574              : !> \param auxbas_grid ...
     575              : !> \param coarser_grid ...
     576              : !> \param pgfs ...
     577              : !> \param potentials ...
     578              : !> \param Forces ...
     579              : !> \param aug_pools ...
     580              : !> \param mm_cell ...
     581              : !> \param dOmmOqm ...
     582              : !> \param periodic ...
     583              : !> \param per_potentials ...
     584              : !> \param iw ...
     585              : !> \param par_scheme ...
     586              : !> \param qmmm_spherical_cutoff ...
     587              : !> \param shells ...
     588              : !> \par History
     589              : !>      06.2004 created [tlaino]
     590              : !> \author Teodoro Laino
     591              : ! **************************************************************************************************
     592          380 :    SUBROUTINE qmmm_force_with_gaussian_low(grids, mm_particles, mm_charges, &
     593              :                                            mm_atom_index, num_mm_atoms, cube_info, para_env, &
     594              :                                            eps_mm_rspace, auxbas_grid, coarser_grid, pgfs, potentials, Forces, &
     595              :                                            aug_pools, mm_cell, dOmmOqm, periodic, per_potentials, iw, par_scheme, &
     596              :                                            qmmm_spherical_cutoff, shells)
     597              :       TYPE(pw_r3d_rs_type), DIMENSION(:), INTENT(IN)     :: grids
     598              :       TYPE(particle_type), DIMENSION(:), POINTER         :: mm_particles
     599              :       REAL(KIND=dp), DIMENSION(:), POINTER               :: mm_charges
     600              :       INTEGER, DIMENSION(:), POINTER                     :: mm_atom_index
     601              :       INTEGER, INTENT(IN)                                :: num_mm_atoms
     602              :       TYPE(cube_info_type), DIMENSION(:), POINTER        :: cube_info
     603              :       TYPE(mp_para_env_type), POINTER                    :: para_env
     604              :       REAL(KIND=dp), INTENT(IN)                          :: eps_mm_rspace
     605              :       INTEGER, INTENT(IN)                                :: auxbas_grid, coarser_grid
     606              :       TYPE(qmmm_gaussian_p_type), DIMENSION(:), POINTER  :: pgfs
     607              :       TYPE(qmmm_pot_p_type), DIMENSION(:), POINTER       :: Potentials
     608              :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: Forces
     609              :       TYPE(pw_pool_p_type), DIMENSION(:), POINTER        :: aug_pools
     610              :       TYPE(cell_type), POINTER                           :: mm_cell
     611              :       REAL(KIND=dp), DIMENSION(3), INTENT(IN)            :: dOmmOqm
     612              :       LOGICAL, INTENT(in)                                :: periodic
     613              :       TYPE(qmmm_per_pot_p_type), DIMENSION(:), POINTER   :: per_potentials
     614              :       INTEGER, INTENT(IN)                                :: iw, par_scheme
     615              :       REAL(KIND=dp), INTENT(IN)                          :: qmmm_spherical_cutoff(2)
     616              :       LOGICAL, INTENT(in)                                :: shells
     617              : 
     618              :       CHARACTER(len=*), PARAMETER :: routineN = 'qmmm_force_with_gaussian_low', &
     619              :          routineNb = 'qmmm_forces_gaussian_low'
     620              : 
     621              :       INTEGER                                            :: handle, handle2, IGauss, ilevel, Imm, &
     622              :                                                             IndMM, IRadTyp, LIndMM, myind, &
     623              :                                                             n_rep_real(3)
     624              :       INTEGER, DIMENSION(2, 3)                           :: bo
     625              :       REAL(KIND=dp)                                      :: alpha, dvol, height, sph_chrg_factor, W
     626          380 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)        :: xdat, ydat, zdat
     627              :       REAL(KIND=dp), DIMENSION(3)                        :: force, ra
     628              :       TYPE(qmmm_gaussian_type), POINTER                  :: pgf
     629              :       TYPE(qmmm_per_pot_type), POINTER                   :: per_pot
     630              :       TYPE(qmmm_pot_type), POINTER                       :: pot
     631              : 
     632          380 :       CALL timeset(routineN, handle)
     633          380 :       CALL timeset(routineNb//"_G", handle2)
     634          380 :       NULLIFY (pgf, pot, per_pot)
     635          380 :       IF (par_scheme == do_par_atom) myind = 0
     636         1074 :       Radius: DO IRadTyp = 1, SIZE(pgfs)
     637          694 :          pgf => pgfs(IRadTyp)%pgf
     638          694 :          pot => potentials(IRadTyp)%pot
     639          694 :          n_rep_real = 0
     640          694 :          IF (periodic) THEN
     641           76 :             per_pot => per_potentials(IRadTyp)%pot
     642          304 :             n_rep_real = per_pot%n_rep_real
     643              :          END IF
     644         5752 :          Gaussian: DO IGauss = 1, pgf%Number_of_Gaussians
     645         4678 :             alpha = 1.0_dp/pgf%Gk(IGauss)
     646         4678 :             alpha = alpha*alpha
     647         4678 :             height = pgf%Ak(IGauss)
     648         4678 :             ilevel = pgf%grid_level(IGauss)
     649         4678 :             dvol = grids(ilevel)%pw_grid%dvol
     650        46780 :             bo = grids(ilevel)%pw_grid%bounds_local
     651        14034 :             ALLOCATE (xdat(2, bo(1, 1):bo(2, 1)))
     652        14034 :             ALLOCATE (ydat(2, bo(1, 2):bo(2, 2)))
     653        14034 :             ALLOCATE (zdat(2, bo(1, 3):bo(2, 3)))
     654              :             !$OMP PARALLEL DO DEFAULT(NONE) &
     655              :             !$OMP SHARED(pot, par_scheme, dvol, alpha, para_env, mm_atom_index, shells) &
     656              :             !$OMP SHARED(mm_particles, dOmmOqm, mm_cell, height, mm_charges, qmmm_spherical_cutoff) &
     657              :             !$OMP SHARED(grids, cube_info, bo, n_rep_real, eps_mm_rspace, Forces, ilevel) &
     658              :             !$OMP SHARED(IGauss, pgf, IRadTyp, iw, aug_pools, auxbas_grid) &
     659              :             !$OMP PRIVATE(xdat, ydat, zdat) &
     660         4678 :             !$OMP PRIVATE(Imm, LIndMM, IndMM, ra, W, force, sph_chrg_factor, myind)
     661              :             Atoms: DO Imm = 1, SIZE(pot%mm_atom_index)
     662              :                IF (par_scheme == do_par_atom) THEN
     663              :                   myind = Imm + (IGauss - 1)*SIZE(pot%mm_atom_index) + (IRadTyp - 1)*pgf%Number_of_Gaussians
     664              :                   IF (MOD(myind, para_env%num_pe) /= para_env%mepos) CYCLE Atoms
     665              :                END IF
     666              :                LIndMM = pot%mm_atom_index(Imm)
     667              :                IndMM = mm_atom_index(LIndMM)
     668              :                IF (shells) THEN
     669              :                   ra(:) = pbc(mm_particles(Imm)%r - dOmmOqm, mm_cell) + dOmmOqm
     670              :                ELSE
     671              :                   ra(:) = pbc(mm_particles(IndMM)%r - dOmmOqm, mm_cell) + dOmmOqm
     672              :                END IF
     673              :                W = mm_charges(LIndMM)*height
     674              :                force = 0.0_dp
     675              :                ! Possible Spherical Cutoff
     676              :                IF (qmmm_spherical_cutoff(1) > 0.0_dp) THEN
     677              :                   CALL spherical_cutoff_factor(qmmm_spherical_cutoff, ra, sph_chrg_factor)
     678              :                   W = W*sph_chrg_factor
     679              :                END IF
     680              :                IF (ABS(W) <= EPSILON(0.0_dp)) CYCLE Atoms
     681              :                CALL integrate_gf_rspace_NoPBC(zetp=alpha, &
     682              :                                               rp=ra, &
     683              :                                               scale=-1.0_dp, &
     684              :                                               W=W, &
     685              :                                               pwgrid=grids(ilevel), &
     686              :                                               cube_info=cube_info(ilevel), &
     687              :                                               eps_mm_rspace=eps_mm_rspace, &
     688              :                                               xdat=xdat, &
     689              :                                               ydat=ydat, &
     690              :                                               zdat=zdat, &
     691              :                                               bo=bo, &
     692              :                                               force=force, &
     693              :                                               n_rep_real=n_rep_real, &
     694              :                                               mm_cell=mm_cell)
     695              :                force = force*dvol
     696              :                Forces(:, LIndMM) = Forces(:, LIndMM) + force(:)
     697              :                !
     698              :                ! Debug Statement
     699              :                !
     700              :                IF (debug_this_module) THEN
     701              :                   CALL debug_integrate_gf_rspace_NoPBC(ilevel=ilevel, &
     702              :                                                        zetp=alpha, &
     703              :                                                        rp=ra, &
     704              :                                                        W=W, &
     705              :                                                        pwgrid=grids(ilevel), &
     706              :                                                        cube_info=cube_info(ilevel), &
     707              :                                                        eps_mm_rspace=eps_mm_rspace, &
     708              :                                                        aug_pools=aug_pools, &
     709              :                                                        debug_force=force, &
     710              :                                                        mm_cell=mm_cell, &
     711              :                                                        auxbas_grid=auxbas_grid, &
     712              :                                                        n_rep_real=n_rep_real, &
     713              :                                                        iw=iw)
     714              :                END IF
     715              :             END DO Atoms
     716              :             !$OMP END PARALLEL DO
     717         4678 :             DEALLOCATE (xdat)
     718         4678 :             DEALLOCATE (ydat)
     719         5372 :             DEALLOCATE (zdat)
     720              :          END DO Gaussian
     721              :       END DO Radius
     722          380 :       CALL timestop(handle2)
     723          380 :       CALL timeset(routineNb//"_R", handle2)
     724          380 :       IF (periodic) THEN
     725              :          CALL qmmm_forces_with_gaussian_LG(pgfs=pgfs, &
     726              :                                            cgrid=grids(coarser_grid), &
     727              :                                            num_mm_atoms=num_mm_atoms, &
     728              :                                            mm_charges=mm_charges, &
     729              :                                            mm_atom_index=mm_atom_index, &
     730              :                                            mm_particles=mm_particles, &
     731              :                                            para_env=para_env, &
     732              :                                            coarser_grid_level=coarser_grid, &
     733              :                                            Forces=Forces, &
     734              :                                            per_potentials=per_potentials, &
     735              :                                            aug_pools=aug_pools, &
     736              :                                            mm_cell=mm_cell, &
     737              :                                            dOmmOqm=dOmmOqm, &
     738              :                                            iw=iw, &
     739              :                                            par_scheme=par_scheme, &
     740              :                                            qmmm_spherical_cutoff=qmmm_spherical_cutoff, &
     741           48 :                                            shells=shells)
     742              :       ELSE
     743              :          CALL qmmm_forces_with_gaussian_LR(pgfs=pgfs, &
     744              :                                            cgrid=grids(coarser_grid), &
     745              :                                            num_mm_atoms=num_mm_atoms, &
     746              :                                            mm_charges=mm_charges, &
     747              :                                            mm_atom_index=mm_atom_index, &
     748              :                                            mm_particles=mm_particles, &
     749              :                                            para_env=para_env, &
     750              :                                            coarser_grid_level=coarser_grid, &
     751              :                                            Forces=Forces, &
     752              :                                            potentials=potentials, &
     753              :                                            aug_pools=aug_pools, &
     754              :                                            mm_cell=mm_cell, &
     755              :                                            dOmmOqm=dOmmOqm, &
     756              :                                            iw=iw, &
     757              :                                            par_scheme=par_scheme, &
     758              :                                            qmmm_spherical_cutoff=qmmm_spherical_cutoff, &
     759          332 :                                            shells=shells)
     760              :       END IF
     761          380 :       CALL timestop(handle2)
     762          380 :       CALL timestop(handle)
     763          380 :    END SUBROUTINE qmmm_force_with_gaussian_low
     764              : 
     765              : ! **************************************************************************************************
     766              : !> \brief Evaluates the contribution to the forces due to the Long Range
     767              : !>      part of the QM/MM potential computed collocating the Electrostatic
     768              : !>      Gaussian Potential.
     769              : !> \param pgfs ...
     770              : !> \param cgrid ...
     771              : !> \param num_mm_atoms ...
     772              : !> \param mm_charges ...
     773              : !> \param mm_atom_index ...
     774              : !> \param mm_particles ...
     775              : !> \param para_env ...
     776              : !> \param coarser_grid_level ...
     777              : !> \param Forces ...
     778              : !> \param per_potentials ...
     779              : !> \param aug_pools ...
     780              : !> \param mm_cell ...
     781              : !> \param dOmmOqm ...
     782              : !> \param iw ...
     783              : !> \param par_scheme ...
     784              : !> \param qmmm_spherical_cutoff ...
     785              : !> \param shells ...
     786              : !> \par History
     787              : !>      08.2004 created [tlaino]
     788              : !> \author Teodoro Laino
     789              : ! **************************************************************************************************
     790           48 :    SUBROUTINE qmmm_forces_with_gaussian_LG(pgfs, cgrid, num_mm_atoms, mm_charges, mm_atom_index, &
     791              :                                            mm_particles, para_env, coarser_grid_level, Forces, per_potentials, &
     792              :                                            aug_pools, mm_cell, dOmmOqm, iw, par_scheme, qmmm_spherical_cutoff, shells)
     793              :       TYPE(qmmm_gaussian_p_type), DIMENSION(:), POINTER  :: pgfs
     794              :       TYPE(pw_r3d_rs_type), INTENT(IN)                   :: cgrid
     795              :       INTEGER, INTENT(IN)                                :: num_mm_atoms
     796              :       REAL(KIND=dp), DIMENSION(:), POINTER               :: mm_charges
     797              :       INTEGER, DIMENSION(:), POINTER                     :: mm_atom_index
     798              :       TYPE(particle_type), DIMENSION(:), POINTER         :: mm_particles
     799              :       TYPE(mp_para_env_type), POINTER                    :: para_env
     800              :       INTEGER, INTENT(IN)                                :: coarser_grid_level
     801              :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: Forces
     802              :       TYPE(qmmm_per_pot_p_type), DIMENSION(:), POINTER   :: per_potentials
     803              :       TYPE(pw_pool_p_type), DIMENSION(:), POINTER        :: aug_pools
     804              :       TYPE(cell_type), POINTER                           :: mm_cell
     805              :       REAL(KIND=dp), DIMENSION(3), INTENT(IN)            :: dOmmOqm
     806              :       INTEGER, INTENT(IN)                                :: iw, par_scheme
     807              :       REAL(KIND=dp), DIMENSION(2), INTENT(IN)            :: qmmm_spherical_cutoff
     808              :       LOGICAL                                            :: shells
     809              : 
     810              :       CHARACTER(len=*), PARAMETER :: routineN = 'qmmm_forces_with_gaussian_LG'
     811              : 
     812              :       INTEGER :: handle, i, ii1, ii2, ii3, ii4, ij1, ij2, ij3, ij4, ik1, ik2, ik3, ik4, Imm, &
     813              :          IndMM, IRadTyp, ivec(3), j, k, LIndMM, my_i, my_j, my_k, myind, npts(3)
     814              :       INTEGER, DIMENSION(2, 3)                           :: bo, gbo
     815              :       REAL(KIND=dp) :: a1, a2, a3, abc_X(4, 4), abc_X_Y(4), b1, b2, b3, c1, c2, c3, d1, d2, d3, &
     816              :          dr1, dr1c, dr1i, dr2, dr2c, dr2i, dr3, dr3c, dr3i, dvol, e1, e2, e3, f1, f2, f3, fac, &
     817              :          ft1, ft2, ft3, g1, g2, g3, h1, h2, h3, p1, p2, p3, q1, q2, q3, qt, r1, r2, r3, rt1, rt2, &
     818              :          rt3, rv1, rv2, rv3, s1, s1d, s1o, s2, s2d, s2o, s3, s3d, s3o, s4, s4d, s4o, &
     819              :          sph_chrg_factor, t1, t1d, t1o, t2, t2d, t2o, t3, t3d, t3o, t4, t4d, t4o, u1, u2, u3, v1, &
     820              :          v1d, v1o, v2, v2d, v2o, v3, v3d, v3o, v4, v4d, v4o, xd1, xd2, xd3, xs1, xs2, xs3
     821           48 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)        :: LForces
     822              :       REAL(KIND=dp), DIMENSION(3)                        :: ra, val, vec
     823           48 :       REAL(KIND=dp), DIMENSION(:, :, :), POINTER         :: grid, grid2
     824              :       TYPE(pw_r3d_rs_type), POINTER                      :: pw
     825              :       TYPE(qmmm_per_pot_type), POINTER                   :: per_pot
     826              : 
     827           48 :       CALL timeset(routineN, handle)
     828           48 :       NULLIFY (grid)
     829          144 :       ALLOCATE (LForces(3, num_mm_atoms))
     830         1888 :       LForces = 0.0_dp
     831           48 :       dr1c = cgrid%pw_grid%dr(1)
     832           48 :       dr2c = cgrid%pw_grid%dr(2)
     833           48 :       dr3c = cgrid%pw_grid%dr(3)
     834           48 :       dvol = cgrid%pw_grid%dvol
     835          480 :       gbo = cgrid%pw_grid%bounds
     836          480 :       bo = cgrid%pw_grid%bounds_local
     837           48 :       grid => cgrid%array
     838           48 :       IF (par_scheme == do_par_atom) myind = 0
     839          124 :       Radius: DO IRadTyp = 1, SIZE(pgfs)
     840           76 :          per_pot => per_potentials(IRadTyp)%pot
     841           76 :          pw => per_pot%TabLR
     842           76 :          grid2 => pw%array(:, :, :)
     843          304 :          npts = pw%pw_grid%npts
     844           76 :          dr1 = pw%pw_grid%dr(1)
     845           76 :          dr2 = pw%pw_grid%dr(2)
     846           76 :          dr3 = pw%pw_grid%dr(3)
     847           76 :          dr1i = 1.0_dp/dr1
     848           76 :          dr2i = 1.0_dp/dr2
     849           76 :          dr3i = 1.0_dp/dr3
     850              : 
     851              :          !$OMP PARALLEL DO DEFAULT(NONE) &
     852              :          !$OMP SHARED(bo, grid, grid2, pw, npts, gbo, per_pot, mm_atom_index) &
     853              :          !$OMP SHARED(dr1, dr2, dr3, dr1i, dr2i, dr3i, dr1c, dr2c, dr3c, par_scheme, mm_charges) &
     854              :          !$OMP SHARED(mm_cell, dOmmOqm, dvol, shells, para_env, IRadTyp) &
     855              :          !$OMP SHARED(qmmm_spherical_cutoff, mm_particles, Forces, LForces) &
     856              :          !$OMP PRIVATE(qt, Imm, LIndMM, IndMM, sph_chrg_factor, ra, myind) &
     857              :          !$OMP PRIVATE(rt1, rt2, rt3, ft1, ft2, ft3, my_k, my_j, my_i, xs3, xs2, xs1) &
     858              :          !$OMP PRIVATE(rv3, rv2, rv1, vec, ivec, ik1, ik2, ik3, ik4, xd3, xd2, xd1) &
     859              :          !$OMP PRIVATE(p1, p2, p3, q1, q2, q3, r1, r2, r3, u1, u2, u3, v1o, v2o, v3o, v4o) &
     860              :          !$OMP PRIVATE(v1d, v2d, v3d, v4d, ij1, ij2, ij3, ij4, e1, e2, e3, f1, f2, f3) &
     861              :          !$OMP PRIVATE(g1, g2, g3, h1, h2, h3, s1o, s2o, s3o, s4o, s1d, s2d, s3d, s4d) &
     862              :          !$OMP PRIVATE(ii1, ii2, ii3, ii4, a1, a2, a3, b1, b2, b3, c1, c2, c3, d1, d2, d3) &
     863              :          !$OMP PRIVATE(t1o, t2o, t3o, t4o, t1d, t2d, t3d, t4d, t1, t2, t3, t4, s1, s2, s3, s4) &
     864          124 :          !$OMP PRIVATE(v1, v2, v3, v4, abc_x, abc_x_y, val, fac)
     865              :          Atoms: DO Imm = 1, SIZE(per_pot%mm_atom_index)
     866              :             IF (par_scheme == do_par_atom) THEN
     867              :                myind = Imm + (IRadTyp - 1)*SIZE(per_pot%mm_atom_index)
     868              :                IF (MOD(myind, para_env%num_pe) /= para_env%mepos) CYCLE
     869              :             END IF
     870              :             LIndMM = per_pot%mm_atom_index(Imm)
     871              :             IndMM = mm_atom_index(LIndMM)
     872              :             IF (shells) THEN
     873              :                ra(:) = pbc(mm_particles(LIndMM)%r - dOmmOqm, mm_cell) + dOmmOqm
     874              :             ELSE
     875              :                ra(:) = pbc(mm_particles(IndMM)%r - dOmmOqm, mm_cell) + dOmmOqm
     876              :             END IF
     877              :             qt = mm_charges(LIndMM)
     878              :             ! Possible Spherical Cutoff
     879              :             IF (qmmm_spherical_cutoff(1) > 0.0_dp) THEN
     880              :                CALL spherical_cutoff_factor(qmmm_spherical_cutoff, ra, sph_chrg_factor)
     881              :                qt = qt*sph_chrg_factor
     882              :             END IF
     883              :             IF (ABS(qt) <= EPSILON(0.0_dp)) CYCLE Atoms
     884              :             rt1 = ra(1)
     885              :             rt2 = ra(2)
     886              :             rt3 = ra(3)
     887              :             ft1 = 0.0_dp
     888              :             ft2 = 0.0_dp
     889              :             ft3 = 0.0_dp
     890              :             LoopOnGrid: DO k = bo(1, 3), bo(2, 3)
     891              :                my_k = k - gbo(1, 3)
     892              :                xs3 = REAL(my_k, dp)*dr3c
     893              :                my_j = bo(1, 2) - gbo(1, 2)
     894              :                xs2 = REAL(my_j, dp)*dr2c
     895              :                rv3 = rt3 - xs3
     896              :                vec(3) = rv3
     897              :                ivec(3) = FLOOR(vec(3)/pw%pw_grid%dr(3))
     898              :                ik1 = MODULO(ivec(3) - 1, npts(3)) + 1
     899              :                ik2 = MODULO(ivec(3), npts(3)) + 1
     900              :                ik3 = MODULO(ivec(3) + 1, npts(3)) + 1
     901              :                ik4 = MODULO(ivec(3) + 2, npts(3)) + 1
     902              :                xd3 = (vec(3)/dr3) - REAL(ivec(3), kind=dp)
     903              :                p1 = 3.0_dp + xd3
     904              :                p2 = p1*p1
     905              :                p3 = p2*p1
     906              :                q1 = 2.0_dp + xd3
     907              :                q2 = q1*q1
     908              :                q3 = q2*q1
     909              :                r1 = 1.0_dp + xd3
     910              :                r2 = r1*r1
     911              :                r3 = r2*r1
     912              :                u1 = xd3
     913              :                u2 = u1*u1
     914              :                u3 = u2*u1
     915              :                v1o = 1.0_dp/6.0_dp*(64.0_dp - 48.0_dp*p1 + 12.0_dp*p2 - p3)
     916              :                v2o = -22.0_dp/3.0_dp + 10.0_dp*q1 - 4.0_dp*q2 + 0.5_dp*q3
     917              :                v3o = 2.0_dp/3.0_dp - 2.0_dp*r1 + 2.0_dp*r2 - 0.5_dp*r3
     918              :                v4o = 1.0_dp/6.0_dp*u3
     919              :                v1d = -8.0_dp + 4.0_dp*p1 - 0.5_dp*p2
     920              :                v2d = 10.0_dp - 8.0_dp*q1 + 1.5_dp*q2
     921              :                v3d = -2.0_dp + 4.0_dp*r1 - 1.5_dp*r2
     922              :                v4d = 0.5_dp*u2
     923              :                DO j = bo(1, 2), bo(2, 2)
     924              :                   my_i = bo(1, 1) - gbo(1, 1)
     925              :                   xs1 = REAL(my_i, dp)*dr1c
     926              :                   rv2 = rt2 - xs2
     927              :                   vec(2) = rv2
     928              :                   ivec(2) = FLOOR(vec(2)/pw%pw_grid%dr(2))
     929              :                   ij1 = MODULO(ivec(2) - 1, npts(2)) + 1
     930              :                   ij2 = MODULO(ivec(2), npts(2)) + 1
     931              :                   ij3 = MODULO(ivec(2) + 1, npts(2)) + 1
     932              :                   ij4 = MODULO(ivec(2) + 2, npts(2)) + 1
     933              :                   xd2 = (vec(2)/dr2) - REAL(ivec(2), kind=dp)
     934              :                   e1 = 3.0_dp + xd2
     935              :                   e2 = e1*e1
     936              :                   e3 = e2*e1
     937              :                   f1 = 2.0_dp + xd2
     938              :                   f2 = f1*f1
     939              :                   f3 = f2*f1
     940              :                   g1 = 1.0_dp + xd2
     941              :                   g2 = g1*g1
     942              :                   g3 = g2*g1
     943              :                   h1 = xd2
     944              :                   h2 = h1*h1
     945              :                   h3 = h2*h1
     946              :                   s1o = 1.0_dp/6.0_dp*(64.0_dp - 48.0_dp*e1 + 12.0_dp*e2 - e3)
     947              :                   s2o = -22.0_dp/3.0_dp + 10.0_dp*f1 - 4.0_dp*f2 + 0.5_dp*f3
     948              :                   s3o = 2.0_dp/3.0_dp - 2.0_dp*g1 + 2.0_dp*g2 - 0.5_dp*g3
     949              :                   s4o = 1.0_dp/6.0_dp*h3
     950              :                   s1d = -8.0_dp + 4.0_dp*e1 - 0.5_dp*e2
     951              :                   s2d = 10.0_dp - 8.0_dp*f1 + 1.5_dp*f2
     952              :                   s3d = -2.0_dp + 4.0_dp*g1 - 1.5_dp*g2
     953              :                   s4d = 0.5_dp*h2
     954              :                   DO i = bo(1, 1), bo(2, 1)
     955              :                      rv1 = rt1 - xs1
     956              :                      vec(1) = rv1
     957              :                      ivec(1) = FLOOR(vec(1)/pw%pw_grid%dr(1))
     958              :                      ii1 = MODULO(ivec(1) - 1, npts(1)) + 1
     959              :                      ii2 = MODULO(ivec(1), npts(1)) + 1
     960              :                      ii3 = MODULO(ivec(1) + 1, npts(1)) + 1
     961              :                      ii4 = MODULO(ivec(1) + 2, npts(1)) + 1
     962              :                      xd1 = (vec(1)/dr1) - REAL(ivec(1), kind=dp)
     963              :                      a1 = 3.0_dp + xd1
     964              :                      a2 = a1*a1
     965              :                      a3 = a2*a1
     966              :                      b1 = 2.0_dp + xd1
     967              :                      b2 = b1*b1
     968              :                      b3 = b2*b1
     969              :                      c1 = 1.0_dp + xd1
     970              :                      c2 = c1*c1
     971              :                      c3 = c2*c1
     972              :                      d1 = xd1
     973              :                      d2 = d1*d1
     974              :                      d3 = d2*d1
     975              :                      t1o = 1.0_dp/6.0_dp*(64.0_dp - 48.0_dp*a1 + 12.0_dp*a2 - a3)
     976              :                      t2o = -22.0_dp/3.0_dp + 10.0_dp*b1 - 4.0_dp*b2 + 0.5_dp*b3
     977              :                      t3o = 2.0_dp/3.0_dp - 2.0_dp*c1 + 2.0_dp*c2 - 0.5_dp*c3
     978              :                      t4o = 1.0_dp/6.0_dp*d3
     979              :                      t1d = -8.0_dp + 4.0_dp*a1 - 0.5_dp*a2
     980              :                      t2d = 10.0_dp - 8.0_dp*b1 + 1.5_dp*b2
     981              :                      t3d = -2.0_dp + 4.0_dp*c1 - 1.5_dp*c2
     982              :                      t4d = 0.5_dp*d2
     983              : 
     984              :                      t1 = t1d*dr1i
     985              :                      t2 = t2d*dr1i
     986              :                      t3 = t3d*dr1i
     987              :                      t4 = t4d*dr1i
     988              :                      s1 = s1o
     989              :                      s2 = s2o
     990              :                      s3 = s3o
     991              :                      s4 = s4o
     992              :                      v1 = v1o
     993              :                      v2 = v2o
     994              :                      v3 = v3o
     995              :                      v4 = v4o
     996              : 
     997              :                  abc_X(1, 1) = grid2(ii1, ij1, ik1)*v1 + grid2(ii1, ij1, ik2)*v2 + grid2(ii1, ij1, ik3)*v3 + grid2(ii1, ij1, ik4)*v4
     998              :                  abc_X(2, 1) = grid2(ii2, ij1, ik1)*v1 + grid2(ii2, ij1, ik2)*v2 + grid2(ii2, ij1, ik3)*v3 + grid2(ii2, ij1, ik4)*v4
     999              :                  abc_X(3, 1) = grid2(ii3, ij1, ik1)*v1 + grid2(ii3, ij1, ik2)*v2 + grid2(ii3, ij1, ik3)*v3 + grid2(ii3, ij1, ik4)*v4
    1000              :                  abc_X(4, 1) = grid2(ii4, ij1, ik1)*v1 + grid2(ii4, ij1, ik2)*v2 + grid2(ii4, ij1, ik3)*v3 + grid2(ii4, ij1, ik4)*v4
    1001              :                      abc_X_Y(1) = abc_X(1, 1)*t1 + abc_X(2, 1)*t2 + abc_X(3, 1)*t3 + abc_X(4, 1)*t4
    1002              : 
    1003              :                  abc_X(1, 2) = grid2(ii1, ij2, ik1)*v1 + grid2(ii1, ij2, ik2)*v2 + grid2(ii1, ij2, ik3)*v3 + grid2(ii1, ij2, ik4)*v4
    1004              :                  abc_X(2, 2) = grid2(ii2, ij2, ik1)*v1 + grid2(ii2, ij2, ik2)*v2 + grid2(ii2, ij2, ik3)*v3 + grid2(ii2, ij2, ik4)*v4
    1005              :                  abc_X(3, 2) = grid2(ii3, ij2, ik1)*v1 + grid2(ii3, ij2, ik2)*v2 + grid2(ii3, ij2, ik3)*v3 + grid2(ii3, ij2, ik4)*v4
    1006              :                  abc_X(4, 2) = grid2(ii4, ij2, ik1)*v1 + grid2(ii4, ij2, ik2)*v2 + grid2(ii4, ij2, ik3)*v3 + grid2(ii4, ij2, ik4)*v4
    1007              :                      abc_X_Y(2) = abc_X(1, 2)*t1 + abc_X(2, 2)*t2 + abc_X(3, 2)*t3 + abc_X(4, 2)*t4
    1008              : 
    1009              :                  abc_X(1, 3) = grid2(ii1, ij3, ik1)*v1 + grid2(ii1, ij3, ik2)*v2 + grid2(ii1, ij3, ik3)*v3 + grid2(ii1, ij3, ik4)*v4
    1010              :                  abc_X(2, 3) = grid2(ii2, ij3, ik1)*v1 + grid2(ii2, ij3, ik2)*v2 + grid2(ii2, ij3, ik3)*v3 + grid2(ii2, ij3, ik4)*v4
    1011              :                  abc_X(3, 3) = grid2(ii3, ij3, ik1)*v1 + grid2(ii3, ij3, ik2)*v2 + grid2(ii3, ij3, ik3)*v3 + grid2(ii3, ij3, ik4)*v4
    1012              :                  abc_X(4, 3) = grid2(ii4, ij3, ik1)*v1 + grid2(ii4, ij3, ik2)*v2 + grid2(ii4, ij3, ik3)*v3 + grid2(ii4, ij3, ik4)*v4
    1013              :                      abc_X_Y(3) = abc_X(1, 3)*t1 + abc_X(2, 3)*t2 + abc_X(3, 3)*t3 + abc_X(4, 3)*t4
    1014              : 
    1015              :                  abc_X(1, 4) = grid2(ii1, ij4, ik1)*v1 + grid2(ii1, ij4, ik2)*v2 + grid2(ii1, ij4, ik3)*v3 + grid2(ii1, ij4, ik4)*v4
    1016              :                  abc_X(2, 4) = grid2(ii2, ij4, ik1)*v1 + grid2(ii2, ij4, ik2)*v2 + grid2(ii2, ij4, ik3)*v3 + grid2(ii2, ij4, ik4)*v4
    1017              :                  abc_X(3, 4) = grid2(ii3, ij4, ik1)*v1 + grid2(ii3, ij4, ik2)*v2 + grid2(ii3, ij4, ik3)*v3 + grid2(ii3, ij4, ik4)*v4
    1018              :                  abc_X(4, 4) = grid2(ii4, ij4, ik1)*v1 + grid2(ii4, ij4, ik2)*v2 + grid2(ii4, ij4, ik3)*v3 + grid2(ii4, ij4, ik4)*v4
    1019              :                      abc_X_Y(4) = abc_X(1, 4)*t1 + abc_X(2, 4)*t2 + abc_X(3, 4)*t3 + abc_X(4, 4)*t4
    1020              : 
    1021              :                      val(1) = abc_X_Y(1)*s1 + abc_X_Y(2)*s2 + abc_X_Y(3)*s3 + abc_X_Y(4)*s4
    1022              : 
    1023              :                      t1 = t1o
    1024              :                      t2 = t2o
    1025              :                      t3 = t3o
    1026              :                      t4 = t4o
    1027              :                      s1 = s1d*dr2i
    1028              :                      s2 = s2d*dr2i
    1029              :                      s3 = s3d*dr2i
    1030              :                      s4 = s4d*dr2i
    1031              : 
    1032              :                      abc_X_Y(1) = abc_X(1, 1)*t1 + abc_X(2, 1)*t2 + abc_X(3, 1)*t3 + abc_X(4, 1)*t4
    1033              :                      abc_X_Y(2) = abc_X(1, 2)*t1 + abc_X(2, 2)*t2 + abc_X(3, 2)*t3 + abc_X(4, 2)*t4
    1034              :                      abc_X_Y(3) = abc_X(1, 3)*t1 + abc_X(2, 3)*t2 + abc_X(3, 3)*t3 + abc_X(4, 3)*t4
    1035              :                      abc_X_Y(4) = abc_X(1, 4)*t1 + abc_X(2, 4)*t2 + abc_X(3, 4)*t3 + abc_X(4, 4)*t4
    1036              : 
    1037              :                      val(2) = abc_X_Y(1)*s1 + abc_X_Y(2)*s2 + abc_X_Y(3)*s3 + abc_X_Y(4)*s4
    1038              : 
    1039              :                      t1 = t1o
    1040              :                      t2 = t2o
    1041              :                      t3 = t3o
    1042              :                      t4 = t4o
    1043              :                      s1 = s1o
    1044              :                      s2 = s2o
    1045              :                      s3 = s3o
    1046              :                      s4 = s4o
    1047              :                      v1 = v1d*dr3i
    1048              :                      v2 = v2d*dr3i
    1049              :                      v3 = v3d*dr3i
    1050              :                      v4 = v4d*dr3i
    1051              : 
    1052              :                  abc_X(1, 1) = grid2(ii1, ij1, ik1)*v1 + grid2(ii1, ij1, ik2)*v2 + grid2(ii1, ij1, ik3)*v3 + grid2(ii1, ij1, ik4)*v4
    1053              :                  abc_X(2, 1) = grid2(ii2, ij1, ik1)*v1 + grid2(ii2, ij1, ik2)*v2 + grid2(ii2, ij1, ik3)*v3 + grid2(ii2, ij1, ik4)*v4
    1054              :                  abc_X(3, 1) = grid2(ii3, ij1, ik1)*v1 + grid2(ii3, ij1, ik2)*v2 + grid2(ii3, ij1, ik3)*v3 + grid2(ii3, ij1, ik4)*v4
    1055              :                  abc_X(4, 1) = grid2(ii4, ij1, ik1)*v1 + grid2(ii4, ij1, ik2)*v2 + grid2(ii4, ij1, ik3)*v3 + grid2(ii4, ij1, ik4)*v4
    1056              :                      abc_X_Y(1) = abc_X(1, 1)*t1 + abc_X(2, 1)*t2 + abc_X(3, 1)*t3 + abc_X(4, 1)*t4
    1057              :                  abc_X(1, 2) = grid2(ii1, ij2, ik1)*v1 + grid2(ii1, ij2, ik2)*v2 + grid2(ii1, ij2, ik3)*v3 + grid2(ii1, ij2, ik4)*v4
    1058              :                  abc_X(2, 2) = grid2(ii2, ij2, ik1)*v1 + grid2(ii2, ij2, ik2)*v2 + grid2(ii2, ij2, ik3)*v3 + grid2(ii2, ij2, ik4)*v4
    1059              :                  abc_X(3, 2) = grid2(ii3, ij2, ik1)*v1 + grid2(ii3, ij2, ik2)*v2 + grid2(ii3, ij2, ik3)*v3 + grid2(ii3, ij2, ik4)*v4
    1060              :                  abc_X(4, 2) = grid2(ii4, ij2, ik1)*v1 + grid2(ii4, ij2, ik2)*v2 + grid2(ii4, ij2, ik3)*v3 + grid2(ii4, ij2, ik4)*v4
    1061              :                      abc_X_Y(2) = abc_X(1, 2)*t1 + abc_X(2, 2)*t2 + abc_X(3, 2)*t3 + abc_X(4, 2)*t4
    1062              :                  abc_X(1, 3) = grid2(ii1, ij3, ik1)*v1 + grid2(ii1, ij3, ik2)*v2 + grid2(ii1, ij3, ik3)*v3 + grid2(ii1, ij3, ik4)*v4
    1063              :                  abc_X(2, 3) = grid2(ii2, ij3, ik1)*v1 + grid2(ii2, ij3, ik2)*v2 + grid2(ii2, ij3, ik3)*v3 + grid2(ii2, ij3, ik4)*v4
    1064              :                  abc_X(3, 3) = grid2(ii3, ij3, ik1)*v1 + grid2(ii3, ij3, ik2)*v2 + grid2(ii3, ij3, ik3)*v3 + grid2(ii3, ij3, ik4)*v4
    1065              :                  abc_X(4, 3) = grid2(ii4, ij3, ik1)*v1 + grid2(ii4, ij3, ik2)*v2 + grid2(ii4, ij3, ik3)*v3 + grid2(ii4, ij3, ik4)*v4
    1066              :                      abc_X_Y(3) = abc_X(1, 3)*t1 + abc_X(2, 3)*t2 + abc_X(3, 3)*t3 + abc_X(4, 3)*t4
    1067              :                  abc_X(1, 4) = grid2(ii1, ij4, ik1)*v1 + grid2(ii1, ij4, ik2)*v2 + grid2(ii1, ij4, ik3)*v3 + grid2(ii1, ij4, ik4)*v4
    1068              :                  abc_X(2, 4) = grid2(ii2, ij4, ik1)*v1 + grid2(ii2, ij4, ik2)*v2 + grid2(ii2, ij4, ik3)*v3 + grid2(ii2, ij4, ik4)*v4
    1069              :                  abc_X(3, 4) = grid2(ii3, ij4, ik1)*v1 + grid2(ii3, ij4, ik2)*v2 + grid2(ii3, ij4, ik3)*v3 + grid2(ii3, ij4, ik4)*v4
    1070              :                  abc_X(4, 4) = grid2(ii4, ij4, ik1)*v1 + grid2(ii4, ij4, ik2)*v2 + grid2(ii4, ij4, ik3)*v3 + grid2(ii4, ij4, ik4)*v4
    1071              :                      abc_X_Y(4) = abc_X(1, 4)*t1 + abc_X(2, 4)*t2 + abc_X(3, 4)*t3 + abc_X(4, 4)*t4
    1072              : 
    1073              :                      val(3) = abc_X_Y(1)*s1 + abc_X_Y(2)*s2 + abc_X_Y(3)*s3 + abc_X_Y(4)*s4
    1074              : 
    1075              :                      fac = grid(i, j, k)
    1076              :                      ft1 = ft1 + val(1)*fac
    1077              :                      ft2 = ft2 + val(2)*fac
    1078              :                      ft3 = ft3 + val(3)*fac
    1079              :                      xs1 = xs1 + dr1c
    1080              :                   END DO
    1081              :                   xs2 = xs2 + dr2c
    1082              :                END DO
    1083              :             END DO LoopOnGrid
    1084              :             qt = -qt*dvol
    1085              :             LForces(1, LindMM) = ft1*qt
    1086              :             LForces(2, LindMM) = ft2*qt
    1087              :             LForces(3, LindMM) = ft3*qt
    1088              : 
    1089              :             Forces(1, LIndMM) = Forces(1, LIndMM) + LForces(1, LindMM)
    1090              :             Forces(2, LIndMM) = Forces(2, LIndMM) + LForces(2, LindMM)
    1091              :             Forces(3, LIndMM) = Forces(3, LIndMM) + LForces(3, LindMM)
    1092              :          END DO Atoms
    1093              :          !$OMP END PARALLEL DO
    1094              :       END DO Radius
    1095              :       !
    1096              :       ! Debug Statement
    1097              :       !
    1098              :       IF (debug_this_module) THEN
    1099              :          CALL debug_qmmm_forces_with_gauss_LG(pgfs=pgfs, &
    1100              :                                               aug_pools=aug_pools, &
    1101              :                                               rho=cgrid, &
    1102              :                                               num_mm_atoms=num_mm_atoms, &
    1103              :                                               mm_charges=mm_charges, &
    1104              :                                               mm_atom_index=mm_atom_index, &
    1105              :                                               mm_particles=mm_particles, &
    1106              :                                               coarser_grid_level=coarser_grid_level, &
    1107              :                                               debug_force=LForces, &
    1108              :                                               per_potentials=per_potentials, &
    1109              :                                               para_env=para_env, &
    1110              :                                               mm_cell=mm_cell, &
    1111              :                                               dOmmOqm=dOmmOqm, &
    1112              :                                               iw=iw, &
    1113              :                                               par_scheme=par_scheme, &
    1114              :                                               qmmm_spherical_cutoff=qmmm_spherical_cutoff, &
    1115              :                                               shells=shells)
    1116              :       END IF
    1117           48 :       DEALLOCATE (LForces)
    1118           48 :       CALL timestop(handle)
    1119           96 :    END SUBROUTINE qmmm_forces_with_gaussian_LG
    1120              : 
    1121              : ! **************************************************************************************************
    1122              : !> \brief Evaluates the contribution to the forces due to the Long Range
    1123              : !>      part of the QM/MM potential computed collocating the Electrostatic
    1124              : !>      Gaussian Potential.
    1125              : !> \param pgfs ...
    1126              : !> \param cgrid ...
    1127              : !> \param num_mm_atoms ...
    1128              : !> \param mm_charges ...
    1129              : !> \param mm_atom_index ...
    1130              : !> \param mm_particles ...
    1131              : !> \param para_env ...
    1132              : !> \param coarser_grid_level ...
    1133              : !> \param Forces ...
    1134              : !> \param potentials ...
    1135              : !> \param aug_pools ...
    1136              : !> \param mm_cell ...
    1137              : !> \param dOmmOqm ...
    1138              : !> \param iw ...
    1139              : !> \param par_scheme ...
    1140              : !> \param qmmm_spherical_cutoff ...
    1141              : !> \param shells ...
    1142              : !> \par History
    1143              : !>      08.2004 created [tlaino]
    1144              : !> \author Teodoro Laino
    1145              : ! **************************************************************************************************
    1146          332 :    SUBROUTINE qmmm_forces_with_gaussian_LR(pgfs, cgrid, num_mm_atoms, mm_charges, mm_atom_index, &
    1147              :                                            mm_particles, para_env, coarser_grid_level, Forces, potentials, &
    1148              :                                            aug_pools, mm_cell, dOmmOqm, iw, par_scheme, qmmm_spherical_cutoff, shells)
    1149              :       TYPE(qmmm_gaussian_p_type), DIMENSION(:), POINTER  :: pgfs
    1150              :       TYPE(pw_r3d_rs_type), INTENT(IN)                   :: cgrid
    1151              :       INTEGER, INTENT(IN)                                :: num_mm_atoms
    1152              :       REAL(KIND=dp), DIMENSION(:), POINTER               :: mm_charges
    1153              :       INTEGER, DIMENSION(:), POINTER                     :: mm_atom_index
    1154              :       TYPE(particle_type), DIMENSION(:), POINTER         :: mm_particles
    1155              :       TYPE(mp_para_env_type), POINTER                    :: para_env
    1156              :       INTEGER, INTENT(IN)                                :: coarser_grid_level
    1157              :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: Forces
    1158              :       TYPE(qmmm_pot_p_type), DIMENSION(:), POINTER       :: Potentials
    1159              :       TYPE(pw_pool_p_type), DIMENSION(:), POINTER        :: aug_pools
    1160              :       TYPE(cell_type), POINTER                           :: mm_cell
    1161              :       REAL(KIND=dp), DIMENSION(3), INTENT(IN)            :: dOmmOqm
    1162              :       INTEGER, INTENT(IN)                                :: iw, par_scheme
    1163              :       REAL(KIND=dp), DIMENSION(2), INTENT(IN)            :: qmmm_spherical_cutoff
    1164              :       LOGICAL                                            :: shells
    1165              : 
    1166              :       CHARACTER(len=*), PARAMETER :: routineN = 'qmmm_forces_with_gaussian_LR'
    1167              : 
    1168              :       INTEGER                                            :: handle, i, Imm, IndMM, IRadTyp, ix, j, &
    1169              :                                                             k, LIndMM, my_i, my_j, my_k, myind, &
    1170              :                                                             n1, n2, n3
    1171              :       INTEGER, DIMENSION(2, 3)                           :: bo, gbo
    1172              :       REAL(KIND=dp)                                      :: dr1, dr2, dr3, dvol, dx, fac, ft1, ft2, &
    1173              :                                                             ft3, qt, r, r2, rd1, rd2, rd3, rt1, &
    1174              :                                                             rt2, rt3, rv1, rv2, rv3, rx, rx2, &
    1175              :                                                             sph_chrg_factor, Term, xs1, xs2, xs3
    1176          332 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)        :: LForces
    1177              :       REAL(KIND=dp), DIMENSION(3)                        :: ra
    1178          332 :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: pot0_2
    1179          332 :       REAL(KIND=dp), DIMENSION(:, :, :), POINTER         :: grid
    1180              :       TYPE(qmmm_pot_type), POINTER                       :: pot
    1181              : 
    1182          332 :       CALL timeset(routineN, handle)
    1183          996 :       ALLOCATE (LForces(3, num_mm_atoms))
    1184        14572 :       LForces = 0.0_dp
    1185          332 :       n1 = cgrid%pw_grid%npts(1)
    1186          332 :       n2 = cgrid%pw_grid%npts(2)
    1187          332 :       n3 = cgrid%pw_grid%npts(3)
    1188          332 :       dr1 = cgrid%pw_grid%dr(1)
    1189          332 :       dr2 = cgrid%pw_grid%dr(2)
    1190          332 :       dr3 = cgrid%pw_grid%dr(3)
    1191          332 :       dvol = cgrid%pw_grid%dvol
    1192         3320 :       gbo = cgrid%pw_grid%bounds
    1193         3320 :       bo = cgrid%pw_grid%bounds_local
    1194          332 :       grid => cgrid%array
    1195          332 :       IF (par_scheme == do_par_atom) myind = 0
    1196          950 :       Radius: DO IRadTyp = 1, SIZE(pgfs)
    1197          618 :          pot => potentials(IRadTyp)%pot
    1198          618 :          dx = Pot%dx
    1199          618 :          pot0_2 => Pot%pot0_2
    1200              :          !$OMP PARALLEL DO DEFAULT(NONE) &
    1201              :          !$OMP SHARED(pot, par_scheme,  para_env, dvol, mm_atom_index, mm_particles, dOmmOqm) &
    1202              :          !$OMP SHARED(mm_cell, mm_charges, dx, LForces, Forces, qmmm_spherical_cutoff, shells, dr1, dr2, dr3, gbo, bo) &
    1203              :          !$OMP SHARED(IRadTyp, pot0_2, grid) &
    1204              :          !$OMP PRIVATE(Imm, myind, ra, LIndMM, IndMM, qt, rt1, rt2, rt3, ft1, ft2, ft3, i, j, k, sph_chrg_factor) &
    1205              :          !$OMP PRIVATE(my_k, my_j, my_i, xs3, xs2, xs1, rv1, rv2, rv3, r, ix, rx, rx2, r2, Term, fac) &
    1206          950 :          !$OMP PRIVATE(rd1, rd2, rd3)
    1207              :          Atoms: DO Imm = 1, SIZE(pot%mm_atom_index)
    1208              :             IF (par_scheme == do_par_atom) THEN
    1209              :                myind = Imm + (IRadTyp - 1)*SIZE(pot%mm_atom_index)
    1210              :                IF (MOD(myind, para_env%num_pe) /= para_env%mepos) CYCLE
    1211              :             END IF
    1212              :             LIndMM = pot%mm_atom_index(Imm)
    1213              :             IndMM = mm_atom_index(LIndMM)
    1214              :             ra(:) = pbc(mm_particles(IndMM)%r - dOmmOqm, mm_cell) + dOmmOqm
    1215              :             IF (shells) &
    1216              :                ra(:) = pbc(mm_particles(LIndMM)%r - dOmmOqm, mm_cell) + dOmmOqm
    1217              :             qt = mm_charges(LIndMM)
    1218              :             ! Possible Spherical Cutoff
    1219              :             IF (qmmm_spherical_cutoff(1) > 0.0_dp) THEN
    1220              :                CALL spherical_cutoff_factor(qmmm_spherical_cutoff, ra, sph_chrg_factor)
    1221              :                qt = qt*sph_chrg_factor
    1222              :             END IF
    1223              :             IF (ABS(qt) <= EPSILON(0.0_dp)) CYCLE Atoms
    1224              :             rt1 = ra(1)
    1225              :             rt2 = ra(2)
    1226              :             rt3 = ra(3)
    1227              :             ft1 = 0.0_dp
    1228              :             ft2 = 0.0_dp
    1229              :             ft3 = 0.0_dp
    1230              :             LoopOnGrid: DO k = bo(1, 3), bo(2, 3)
    1231              :                my_k = k - gbo(1, 3)
    1232              :                xs3 = REAL(my_k, dp)*dr3
    1233              :                my_j = bo(1, 2) - gbo(1, 2)
    1234              :                xs2 = REAL(my_j, dp)*dr2
    1235              :                rv3 = rt3 - xs3
    1236              :                DO j = bo(1, 2), bo(2, 2)
    1237              :                   my_i = bo(1, 1) - gbo(1, 1)
    1238              :                   xs1 = REAL(my_i, dp)*dr1
    1239              :                   rv2 = rt2 - xs2
    1240              :                   DO i = bo(1, 1), bo(2, 1)
    1241              :                      rv1 = rt1 - xs1
    1242              :                      r2 = rv1*rv1 + rv2*rv2 + rv3*rv3
    1243              :                      r = SQRT(r2)
    1244              :                      ix = FLOOR(r/dx) + 1
    1245              :                      rx = (r - REAL(ix - 1, dp)*dx)/dx
    1246              :                      rx2 = rx*rx
    1247              :                      Term = pot0_2(1, ix)*(-6.0_dp*(rx - rx2)) &
    1248              :                             + pot0_2(2, ix)*(1.0_dp - 4.0_dp*rx + 3.0_dp*rx2) &
    1249              :                             + pot0_2(1, ix + 1)*(6.0_dp*(rx - rx2)) &
    1250              :                             + pot0_2(2, ix + 1)*(-2.0_dp*rx + 3.0_dp*rx2)
    1251              :                      fac = grid(i, j, k)*Term
    1252              :                      IF (r == 0.0_dp) THEN
    1253              :                         rd1 = 1.0_dp
    1254              :                         rd2 = 1.0_dp
    1255              :                         rd3 = 1.0_dp
    1256              :                      ELSE
    1257              :                         rd1 = rv1/r
    1258              :                         rd2 = rv2/r
    1259              :                         rd3 = rv3/r
    1260              :                      END IF
    1261              :                      ft1 = ft1 + fac*rd1
    1262              :                      ft2 = ft2 + fac*rd2
    1263              :                      ft3 = ft3 + fac*rd3
    1264              :                      xs1 = xs1 + dr1
    1265              :                   END DO
    1266              :                   xs2 = xs2 + dr2
    1267              :                END DO
    1268              :             END DO LoopOnGrid
    1269              :             qt = -qt*dvol/dx
    1270              :             LForces(1, LindMM) = ft1*qt
    1271              :             LForces(2, LindMM) = ft2*qt
    1272              :             LForces(3, LindMM) = ft3*qt
    1273              : 
    1274              :             Forces(1, LIndMM) = Forces(1, LIndMM) + LForces(1, LindMM)
    1275              :             Forces(2, LIndMM) = Forces(2, LIndMM) + LForces(2, LindMM)
    1276              :             Forces(3, LIndMM) = Forces(3, LIndMM) + LForces(3, LindMM)
    1277              :          END DO Atoms
    1278              :          !$OMP END PARALLEL DO
    1279              :       END DO Radius
    1280              :       !
    1281              :       ! Debug Statement
    1282              :       !
    1283              :       IF (debug_this_module) THEN
    1284              :          CALL debug_qmmm_forces_with_gauss_LR(pgfs=pgfs, &
    1285              :                                               aug_pools=aug_pools, &
    1286              :                                               rho=cgrid, &
    1287              :                                               num_mm_atoms=num_mm_atoms, &
    1288              :                                               mm_charges=mm_charges, &
    1289              :                                               mm_atom_index=mm_atom_index, &
    1290              :                                               mm_particles=mm_particles, &
    1291              :                                               coarser_grid_level=coarser_grid_level, &
    1292              :                                               debug_force=LForces, &
    1293              :                                               potentials=potentials, &
    1294              :                                               para_env=para_env, &
    1295              :                                               mm_cell=mm_cell, &
    1296              :                                               dOmmOqm=dOmmOqm, &
    1297              :                                               iw=iw, &
    1298              :                                               par_scheme=par_scheme, &
    1299              :                                               qmmm_spherical_cutoff=qmmm_spherical_cutoff, &
    1300              :                                               shells=shells)
    1301              :       END IF
    1302              : 
    1303          332 :       DEALLOCATE (LForces)
    1304          332 :       CALL timestop(handle)
    1305          664 :    END SUBROUTINE qmmm_forces_with_gaussian_LR
    1306              : 
    1307              : ! **************************************************************************************************
    1308              : !> \brief Evaluates numerically QM/MM forces and compares them with
    1309              : !>      the analytically computed ones.
    1310              : !>      It is evaluated only when debug_this_module is set to .TRUE.
    1311              : !> \param rho ...
    1312              : !> \param qs_env ...
    1313              : !> \param qmmm_env ...
    1314              : !> \param Analytical_Forces ...
    1315              : !> \param mm_particles ...
    1316              : !> \param mm_atom_index ...
    1317              : !> \param num_mm_atoms ...
    1318              : !> \param interp_section ...
    1319              : !> \param mm_cell ...
    1320              : !> \par History
    1321              : !>      08.2004 created [tlaino]
    1322              : !> \author Teodoro Laino
    1323              : ! **************************************************************************************************
    1324            0 :    SUBROUTINE qmmm_debug_forces(rho, qs_env, qmmm_env, Analytical_Forces, &
    1325              :                                 mm_particles, mm_atom_index, num_mm_atoms, &
    1326              :                                 interp_section, mm_cell)
    1327              :       TYPE(pw_r3d_rs_type), POINTER                      :: rho
    1328              :       TYPE(qs_environment_type), POINTER                 :: qs_env
    1329              :       TYPE(qmmm_env_qm_type), POINTER                    :: qmmm_env
    1330              :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: Analytical_Forces
    1331              :       TYPE(particle_type), DIMENSION(:), POINTER         :: mm_particles
    1332              :       INTEGER, DIMENSION(:), POINTER                     :: mm_atom_index
    1333              :       INTEGER, INTENT(IN)                                :: num_mm_atoms
    1334              :       TYPE(section_vals_type), POINTER                   :: interp_section
    1335              :       TYPE(cell_type), POINTER                           :: mm_cell
    1336              : 
    1337              :       CHARACTER(len=*), PARAMETER                        :: routineN = 'qmmm_debug_forces'
    1338              : 
    1339              :       INTEGER                                            :: handle, I, IndMM, iw, J, K
    1340              :       REAL(KIND=dp)                                      :: Coord_save
    1341              :       REAL(KIND=dp), DIMENSION(2)                        :: energy
    1342              :       REAL(KIND=dp), DIMENSION(3)                        :: Err
    1343            0 :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: Num_Forces
    1344              :       TYPE(cp_logger_type), POINTER                      :: logger
    1345              :       TYPE(mp_para_env_type), POINTER                    :: para_env
    1346              :       TYPE(pw_env_type), POINTER                         :: pw_env
    1347            0 :       TYPE(pw_pool_p_type), DIMENSION(:), POINTER        :: pw_pools
    1348              :       TYPE(pw_r3d_rs_type)                               :: v_qmmm_rspace
    1349              :       TYPE(qs_ks_qmmm_env_type), POINTER                 :: ks_qmmm_env_loc
    1350              :       TYPE(section_vals_type), POINTER                   :: input_section, print_section
    1351              : 
    1352            0 :       CALL timeset(routineN, handle)
    1353            0 :       NULLIFY (Num_Forces)
    1354              :       CALL get_qs_env(qs_env=qs_env, &
    1355              :                       pw_env=pw_env, &
    1356              :                       input=input_section, &
    1357            0 :                       para_env=para_env)
    1358              : 
    1359            0 :       print_section => section_vals_get_subs_vals(input_section, "QMMM%PRINT")
    1360            0 :       logger => cp_get_default_logger()
    1361            0 :       iw = cp_print_key_unit_nr(logger, print_section, "PROGRAM_RUN_INFO", extension=".qmmmLog")
    1362            0 :       CALL pw_env_get(pw_env=pw_env, pw_pools=pw_pools)
    1363            0 :       CALL pw_pools(1)%pool%create_pw(v_qmmm_rspace)
    1364            0 :       ALLOCATE (Num_Forces(3, num_mm_atoms))
    1365            0 :       ks_qmmm_env_loc => qs_env%ks_qmmm_env
    1366            0 :       IF (iw > 0) WRITE (iw, '(/A)') "DEBUG SECTION:"
    1367            0 :       Atoms: DO I = 1, num_mm_atoms
    1368            0 :          IndMM = mm_atom_index(I)
    1369            0 :          Coords: DO J = 1, 3
    1370            0 :             Coord_save = mm_particles(IndMM)%r(J)
    1371            0 :             energy = 0.0_dp
    1372            0 :             Diff: DO K = 1, 2
    1373            0 :                mm_particles(IndMM)%r(J) = Coord_save + (-1)**K*Dx
    1374            0 :                CALL pw_zero(v_qmmm_rspace)
    1375            0 :                SELECT CASE (qmmm_env%qmmm_coupl_type)
    1376              :                CASE (do_qmmm_coulomb)
    1377            0 :                   CPABORT("Coulomb QM/MM electrostatic coupling not implemented for GPW/GAPW.")
    1378              :                CASE (do_qmmm_pcharge)
    1379            0 :                   CPABORT("Point Charge  QM/MM electrostatic coupling not implemented for GPW/GAPW.")
    1380              :                CASE (do_qmmm_gauss, do_qmmm_swave)
    1381              :                   CALL qmmm_elec_with_gaussian(qmmm_env=qmmm_env, &
    1382              :                                                v_qmmm=v_qmmm_rspace, &
    1383              :                                                mm_particles=mm_particles, &
    1384              :                                                aug_pools=qmmm_env%aug_pools, &
    1385              :                                                para_env=para_env, &
    1386              :                                                eps_mm_rspace=qmmm_env%eps_mm_rspace, &
    1387              :                                                cube_info=ks_qmmm_env_loc%cube_info, &
    1388              :                                                pw_pools=pw_pools, &
    1389              :                                                auxbas_grid=qmmm_env%gridlevel_info%auxbas_grid, &
    1390              :                                                coarser_grid=qmmm_env%gridlevel_info%coarser_grid, &
    1391              :                                                interp_section=interp_section, &
    1392            0 :                                                mm_cell=mm_cell)
    1393              :                CASE (do_qmmm_none)
    1394            0 :                   CYCLE Diff
    1395              :                CASE DEFAULT
    1396            0 :                   IF (iw > 0) WRITE (iw, '(T3,A)') "Unknown Coupling..."
    1397            0 :                   CPABORT("")
    1398              :                END SELECT
    1399            0 :                energy(K) = pw_integral_ab(rho, v_qmmm_rspace)
    1400              :             END DO Diff
    1401            0 :             IF (iw > 0) THEN
    1402              :                WRITE (iw, '(A,I6,A,I3,A,2F15.9)') &
    1403            0 :                   "DEBUG :: MM Atom = ", IndMM, " Coord = ", J, " Energies (+/-) :: ", energy(2), energy(1)
    1404              :             END IF
    1405            0 :             Num_Forces(J, I) = (energy(2) - energy(1))/(2.0_dp*Dx)
    1406            0 :             mm_particles(IndMM)%r(J) = Coord_save
    1407              :          END DO Coords
    1408              :       END DO Atoms
    1409              : 
    1410            0 :       SELECT CASE (qmmm_env%qmmm_coupl_type)
    1411              :       CASE (do_qmmm_coulomb)
    1412            0 :          CPABORT("Coulomb QM/MM electrostatic coupling not implemented for GPW/GAPW.")
    1413              :       CASE (do_qmmm_pcharge)
    1414            0 :          CPABORT("Point Charge QM/MM electrostatic coupling not implemented for GPW/GAPW.")
    1415              :       CASE (do_qmmm_gauss, do_qmmm_swave)
    1416            0 :          IF (iw > 0) WRITE (iw, '(/A/)') "CHECKING NUMERICAL Vs ANALYTICAL FORCES (Err%):"
    1417            0 :          DO I = 1, num_mm_atoms
    1418            0 :             IndMM = mm_atom_index(I)
    1419            0 :             Err = 0.0_dp
    1420            0 :             DO K = 1, 3
    1421            0 :                IF (ABS(Num_Forces(K, I)) >= 5.0E-5_dp) THEN
    1422            0 :                   Err(K) = (Analytical_Forces(K, I) - Num_Forces(K, I))/Num_Forces(K, I)*100.0_dp
    1423              :                END IF
    1424              :             END DO
    1425            0 :             IF (iw > 0) &
    1426            0 :                WRITE (iw, 100) IndMM, Analytical_Forces(1, I), Num_Forces(1, I), Err(1), &
    1427            0 :                Analytical_Forces(2, I), Num_Forces(2, I), Err(2), &
    1428            0 :                Analytical_Forces(3, I), Num_Forces(3, I), Err(3)
    1429            0 :             CPASSERT(ABS(Err(1)) <= MaxErr)
    1430            0 :             CPASSERT(ABS(Err(2)) <= MaxErr)
    1431            0 :             CPASSERT(ABS(Err(3)) <= MaxErr)
    1432              :          END DO
    1433              :       CASE (do_qmmm_none)
    1434            0 :          IF (iw > 0) WRITE (iw, '(T3,A)') "No QM/MM Derivatives to debug. Just Mechanical Coupling!"
    1435              :       CASE DEFAULT
    1436            0 :          IF (iw > 0) WRITE (iw, '(T3,A)') "Unknown Coupling..."
    1437            0 :          CPABORT("")
    1438              :       END SELECT
    1439            0 :       CALL cp_print_key_finished_output(iw, logger, print_section, "PROGRAM_RUN_INFO")
    1440              : 
    1441            0 :       CALL pw_pools(1)%pool%give_back_pw(v_qmmm_rspace)
    1442            0 :       DEALLOCATE (Num_Forces)
    1443            0 :       CALL timestop(handle)
    1444              : 100   FORMAT(I5, 2F15.9, " ( ", F7.2, " ) ", 2F15.9, " ( ", F7.2, " ) ", 2F15.9, " ( ", F7.2, " ) ")
    1445            0 :    END SUBROUTINE qmmm_debug_forces
    1446              : 
    1447              : ! **************************************************************************************************
    1448              : !> \brief Debugs the integrate_gf_rspace_NoPBC.. It may helps ;-P
    1449              : !> \param ilevel ...
    1450              : !> \param zetp ...
    1451              : !> \param rp ...
    1452              : !> \param W ...
    1453              : !> \param pwgrid ...
    1454              : !> \param cube_info ...
    1455              : !> \param eps_mm_rspace ...
    1456              : !> \param aug_pools ...
    1457              : !> \param debug_force ...
    1458              : !> \param mm_cell ...
    1459              : !> \param auxbas_grid ...
    1460              : !> \param n_rep_real ...
    1461              : !> \param iw ...
    1462              : !> \par History
    1463              : !>      08.2004 created [tlaino]
    1464              : !> \author Teodoro Laino
    1465              : ! **************************************************************************************************
    1466            0 :    SUBROUTINE debug_integrate_gf_rspace_NoPBC(ilevel, zetp, rp, W, pwgrid, cube_info, &
    1467              :                                               eps_mm_rspace, aug_pools, debug_force, &
    1468              :                                               mm_cell, auxbas_grid, n_rep_real, iw)
    1469              :       INTEGER, INTENT(IN)                                :: ilevel
    1470              :       REAL(KIND=dp), INTENT(IN)                          :: zetp
    1471              :       REAL(KIND=dp), DIMENSION(3), INTENT(IN)            :: rp
    1472              :       REAL(KIND=dp), INTENT(IN)                          :: W
    1473              :       TYPE(pw_r3d_rs_type), INTENT(IN)                   :: pwgrid
    1474              :       TYPE(cube_info_type), INTENT(IN)                   :: cube_info
    1475              :       REAL(KIND=dp), INTENT(IN)                          :: eps_mm_rspace
    1476              :       TYPE(pw_pool_p_type), DIMENSION(:), POINTER        :: aug_pools
    1477              :       REAL(KIND=dp), DIMENSION(3), INTENT(IN)            :: debug_force
    1478              :       TYPE(cell_type), POINTER                           :: mm_cell
    1479              :       INTEGER, INTENT(IN)                                :: auxbas_grid
    1480              :       INTEGER, DIMENSION(3), INTENT(IN)                  :: n_rep_real
    1481              :       INTEGER, INTENT(IN)                                :: iw
    1482              : 
    1483              :       CHARACTER(len=*), PARAMETER :: routineN = 'debug_integrate_gf_rspace_NoPBC'
    1484              : 
    1485              :       INTEGER                                            :: handle, i, igrid, k, ngrids
    1486              :       INTEGER, DIMENSION(2, 3)                           :: bo2
    1487              :       INTEGER, SAVE                                      :: Icount
    1488              :       REAL(KIND=dp), DIMENSION(2)                        :: energy
    1489              :       REAL(KIND=dp), DIMENSION(3)                        :: Err, force, myrp
    1490            0 :       REAL(KIND=dp), DIMENSION(:), POINTER               :: xdat, ydat, zdat
    1491            0 :       TYPE(pw_r3d_rs_type), ALLOCATABLE, DIMENSION(:)    :: grids
    1492              : 
    1493              :       DATA Icount/0/
    1494              :       ! Statements
    1495            0 :       CALL timeset(routineN, handle)
    1496              :       !Statements
    1497            0 :       ngrids = SIZE(aug_pools)
    1498            0 :       CALL pw_pools_create_pws(aug_pools, grids)
    1499            0 :       DO igrid = 1, ngrids
    1500            0 :          CALL pw_zero(grids(igrid))
    1501              :       END DO
    1502            0 :       bo2 = grids(auxbas_grid)%pw_grid%bounds
    1503            0 :       ALLOCATE (xdat(bo2(1, 1):bo2(2, 1)))
    1504            0 :       ALLOCATE (ydat(bo2(1, 2):bo2(2, 2)))
    1505            0 :       ALLOCATE (zdat(bo2(1, 3):bo2(2, 3)))
    1506              : 
    1507            0 :       Icount = Icount + 1
    1508            0 :       DO i = 1, 3
    1509            0 :          DO k = 1, 2
    1510            0 :             myrp = rp
    1511            0 :             myrp(i) = myrp(i) + (-1.0_dp)**k*Dx
    1512            0 :             CALL pw_zero(grids(ilevel))
    1513              :             CALL collocate_gf_rspace_NoPBC(zetp=zetp, &
    1514              :                                            rp=myrp, &
    1515              :                                            scale=-1.0_dp, &
    1516              :                                            W=W, &
    1517              :                                            pwgrid=grids(ilevel), &
    1518              :                                            cube_info=cube_info, &
    1519              :                                            eps_mm_rspace=eps_mm_rspace, &
    1520              :                                            xdat=xdat, &
    1521              :                                            ydat=ydat, &
    1522              :                                            zdat=zdat, &
    1523              :                                            bo2=bo2, &
    1524              :                                            n_rep_real=n_rep_real, &
    1525            0 :                                            mm_cell=mm_cell)
    1526              : 
    1527            0 :             energy(k) = pw_integral_ab(pwgrid, grids(ilevel))
    1528              :          END DO
    1529            0 :          force(i) = (energy(2) - energy(1))/(2.0_dp*Dx)
    1530              :       END DO
    1531            0 :       Err = 0.0_dp
    1532            0 :       IF (ALL(force /= 0.0_dp)) THEN
    1533            0 :          Err(1) = (debug_force(1) - force(1))/force(1)*100.0_dp
    1534            0 :          Err(2) = (debug_force(2) - force(2))/force(2)*100.0_dp
    1535            0 :          Err(3) = (debug_force(3) - force(3))/force(3)*100.0_dp
    1536              :       END IF
    1537            0 :       IF (iw > 0) &
    1538            0 :          WRITE (iw, 100) Icount, debug_force(1), force(1), Err(1), &
    1539            0 :          debug_force(2), force(2), Err(2), &
    1540            0 :          debug_force(3), force(3), Err(3)
    1541            0 :       CPASSERT(ABS(Err(1)) <= MaxErr)
    1542            0 :       CPASSERT(ABS(Err(2)) <= MaxErr)
    1543            0 :       CPASSERT(ABS(Err(3)) <= MaxErr)
    1544              : 
    1545            0 :       IF (ASSOCIATED(xdat)) THEN
    1546            0 :          DEALLOCATE (xdat)
    1547              :       END IF
    1548            0 :       IF (ASSOCIATED(ydat)) THEN
    1549            0 :          DEALLOCATE (ydat)
    1550              :       END IF
    1551            0 :       IF (ASSOCIATED(zdat)) THEN
    1552            0 :          DEALLOCATE (zdat)
    1553              :       END IF
    1554              : 
    1555            0 :       CALL pw_pools_give_back_pws(aug_pools, grids)
    1556            0 :       CALL timestop(handle)
    1557              : 100   FORMAT("Collocation   : ", I5, 2F15.9, " ( ", F7.2, " ) ", 2F15.9, " ( ", F7.2, " ) ", 2F15.9, " ( ", F7.2, " ) ")
    1558            0 :    END SUBROUTINE debug_integrate_gf_rspace_NoPBC
    1559              : 
    1560              : ! **************************************************************************************************
    1561              : !> \brief Debugs qmmm_forces_with_gaussian_LG.. It may helps too ... ;-]
    1562              : !> \param pgfs ...
    1563              : !> \param aug_pools ...
    1564              : !> \param rho ...
    1565              : !> \param mm_charges ...
    1566              : !> \param mm_atom_index ...
    1567              : !> \param mm_particles ...
    1568              : !> \param num_mm_atoms ...
    1569              : !> \param coarser_grid_level ...
    1570              : !> \param per_potentials ...
    1571              : !> \param debug_force ...
    1572              : !> \param para_env ...
    1573              : !> \param mm_cell ...
    1574              : !> \param dOmmOqm ...
    1575              : !> \param iw ...
    1576              : !> \param par_scheme ...
    1577              : !> \param qmmm_spherical_cutoff ...
    1578              : !> \param shells ...
    1579              : !> \par History
    1580              : !>      08.2004 created [tlaino]
    1581              : !> \author Teodoro Laino
    1582              : ! **************************************************************************************************
    1583            0 :    SUBROUTINE debug_qmmm_forces_with_gauss_LG(pgfs, aug_pools, rho, mm_charges, mm_atom_index, &
    1584              :                                               mm_particles, num_mm_atoms, coarser_grid_level, per_potentials, &
    1585            0 :                                              debug_force, para_env, mm_cell, dOmmOqm, iw, par_scheme, qmmm_spherical_cutoff, shells)
    1586              : 
    1587              :       TYPE(qmmm_gaussian_p_type), DIMENSION(:), POINTER  :: pgfs
    1588              :       TYPE(pw_pool_p_type), DIMENSION(:), POINTER        :: aug_pools
    1589              :       TYPE(pw_r3d_rs_type), INTENT(IN)                   :: rho
    1590              :       REAL(KIND=dp), DIMENSION(:), POINTER               :: mm_charges
    1591              :       INTEGER, DIMENSION(:), POINTER                     :: mm_atom_index
    1592              :       TYPE(particle_type), DIMENSION(:), POINTER         :: mm_particles
    1593              :       INTEGER, INTENT(IN)                                :: num_mm_atoms, coarser_grid_level
    1594              :       TYPE(qmmm_per_pot_p_type), DIMENSION(:), POINTER   :: per_potentials
    1595              :       REAL(KIND=dp), DIMENSION(:, :)                     :: debug_force
    1596              :       TYPE(mp_para_env_type), POINTER                    :: para_env
    1597              :       TYPE(cell_type), POINTER                           :: mm_cell
    1598              :       REAL(KIND=dp), DIMENSION(3), INTENT(IN)            :: dOmmOqm
    1599              :       INTEGER, INTENT(IN)                                :: iw, par_scheme
    1600              :       REAL(KIND=dp), DIMENSION(2), INTENT(IN)            :: qmmm_spherical_cutoff
    1601              :       LOGICAL                                            :: shells
    1602              : 
    1603              :       CHARACTER(len=*), PARAMETER :: routineN = 'debug_qmmm_forces_with_gauss_LG'
    1604              : 
    1605              :       INTEGER                                            :: handle, I, igrid, IndMM, J, K, ngrids
    1606              :       REAL(KIND=dp)                                      :: Coord_save
    1607              :       REAL(KIND=dp), DIMENSION(2)                        :: energy
    1608              :       REAL(KIND=dp), DIMENSION(3)                        :: Err
    1609              :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: Num_Forces
    1610            0 :       TYPE(pw_r3d_rs_type), ALLOCATABLE, DIMENSION(:)    :: grids
    1611              : 
    1612            0 :       ALLOCATE (Num_Forces(3, num_mm_atoms))
    1613            0 :       CALL timeset(routineN, handle)
    1614            0 :       ngrids = SIZE(aug_pools)
    1615            0 :       CALL pw_pools_create_pws(aug_pools, grids)
    1616            0 :       DO igrid = 1, ngrids
    1617            0 :          CALL pw_zero(grids(igrid))
    1618              :       END DO
    1619            0 :       Atoms: DO I = 1, num_mm_atoms
    1620            0 :          IndMM = mm_atom_index(I)
    1621            0 :          Coords: DO J = 1, 3
    1622            0 :             Coord_save = mm_particles(IndMM)%r(J)
    1623            0 :             energy = 0.0_dp
    1624            0 :             Diff: DO K = 1, 2
    1625            0 :                mm_particles(IndMM)%r(J) = Coord_save + (-1)**K*Dx
    1626            0 :                CALL pw_zero(grids(coarser_grid_level))
    1627              : 
    1628              :                CALL qmmm_elec_with_gaussian_LG(pgfs=pgfs, &
    1629              :                                                cgrid=grids(coarser_grid_level), &
    1630              :                                                mm_charges=mm_charges, &
    1631              :                                                mm_atom_index=mm_atom_index, &
    1632              :                                                mm_particles=mm_particles, &
    1633              :                                                para_env=para_env, &
    1634              :                                                per_potentials=per_potentials, &
    1635              :                                                mm_cell=mm_cell, &
    1636              :                                                dOmmOqm=dOmmOqm, &
    1637              :                                                par_scheme=par_scheme, &
    1638              :                                                qmmm_spherical_cutoff=qmmm_spherical_cutoff, &
    1639            0 :                                                shells=shells)
    1640              : 
    1641            0 :                energy(K) = pw_integral_ab(rho, grids(coarser_grid_level))
    1642              :             END DO Diff
    1643            0 :             IF (iw > 0) &
    1644              :                WRITE (iw, '(A,I6,A,I3,A,2F15.9)') &
    1645            0 :                "DEBUG LR:: MM Atom = ", IndMM, " Coord = ", J, " Energies (+/-) :: ", energy(2), energy(1)
    1646            0 :             Num_Forces(J, I) = (energy(2) - energy(1))/(2.0_dp*Dx)
    1647            0 :             mm_particles(IndMM)%r(J) = Coord_save
    1648              :          END DO Coords
    1649              :       END DO Atoms
    1650              : 
    1651            0 :       DO I = 1, num_mm_atoms
    1652            0 :          IndMM = mm_atom_index(I)
    1653            0 :          Err = 0.0_dp
    1654            0 :          IF (ALL(Num_Forces /= 0.0_dp)) THEN
    1655            0 :             Err(1) = (debug_force(1, I) - Num_Forces(1, I))/Num_Forces(1, I)*100.0_dp
    1656            0 :             Err(2) = (debug_force(2, I) - Num_Forces(2, I))/Num_Forces(2, I)*100.0_dp
    1657            0 :             Err(3) = (debug_force(3, I) - Num_Forces(3, I))/Num_Forces(3, I)*100.0_dp
    1658              :          END IF
    1659            0 :          IF (iw > 0) &
    1660            0 :             WRITE (iw, 100) IndMM, debug_force(1, I), Num_Forces(1, I), Err(1), &
    1661            0 :             debug_force(2, I), Num_Forces(2, I), Err(2), &
    1662            0 :             debug_force(3, I), Num_Forces(3, I), Err(3)
    1663            0 :          CPASSERT(ABS(Err(1)) <= MaxErr)
    1664            0 :          CPASSERT(ABS(Err(2)) <= MaxErr)
    1665            0 :          CPASSERT(ABS(Err(3)) <= MaxErr)
    1666              :       END DO
    1667              : 
    1668            0 :       DEALLOCATE (Num_Forces)
    1669            0 :       CALL pw_pools_give_back_pws(aug_pools, grids)
    1670            0 :       CALL timestop(handle)
    1671              : 100   FORMAT("MM Atom LR    : ", I5, 2F15.9, " ( ", F7.2, " ) ", 2F15.9, " ( ", F7.2, " ) ", 2F15.9, " ( ", F7.2, " ) ")
    1672            0 :    END SUBROUTINE debug_qmmm_forces_with_gauss_LG
    1673              : 
    1674              : ! **************************************************************************************************
    1675              : !> \brief Debugs qmmm_forces_with_gaussian_LR.. It may helps too ... ;-]
    1676              : !> \param pgfs ...
    1677              : !> \param aug_pools ...
    1678              : !> \param rho ...
    1679              : !> \param mm_charges ...
    1680              : !> \param mm_atom_index ...
    1681              : !> \param mm_particles ...
    1682              : !> \param num_mm_atoms ...
    1683              : !> \param coarser_grid_level ...
    1684              : !> \param potentials ...
    1685              : !> \param debug_force ...
    1686              : !> \param para_env ...
    1687              : !> \param mm_cell ...
    1688              : !> \param dOmmOqm ...
    1689              : !> \param iw ...
    1690              : !> \param par_scheme ...
    1691              : !> \param qmmm_spherical_cutoff ...
    1692              : !> \param shells ...
    1693              : !> \par History
    1694              : !>      08.2004 created [tlaino]
    1695              : !> \author Teodoro Laino
    1696              : ! **************************************************************************************************
    1697            0 :    SUBROUTINE debug_qmmm_forces_with_gauss_LR(pgfs, aug_pools, rho, mm_charges, mm_atom_index, &
    1698              :                                               mm_particles, num_mm_atoms, coarser_grid_level, potentials, &
    1699            0 :                                              debug_force, para_env, mm_cell, dOmmOqm, iw, par_scheme, qmmm_spherical_cutoff, shells)
    1700              : 
    1701              :       TYPE(qmmm_gaussian_p_type), DIMENSION(:), POINTER  :: pgfs
    1702              :       TYPE(pw_pool_p_type), DIMENSION(:), POINTER        :: aug_pools
    1703              :       TYPE(pw_r3d_rs_type), INTENT(IN)                   :: rho
    1704              :       REAL(KIND=dp), DIMENSION(:), POINTER               :: mm_charges
    1705              :       INTEGER, DIMENSION(:), POINTER                     :: mm_atom_index
    1706              :       TYPE(particle_type), DIMENSION(:), POINTER         :: mm_particles
    1707              :       INTEGER, INTENT(IN)                                :: num_mm_atoms, coarser_grid_level
    1708              :       TYPE(qmmm_pot_p_type), DIMENSION(:), POINTER       :: Potentials
    1709              :       REAL(KIND=dp), DIMENSION(:, :)                     :: debug_force
    1710              :       TYPE(mp_para_env_type), POINTER                    :: para_env
    1711              :       TYPE(cell_type), POINTER                           :: mm_cell
    1712              :       REAL(KIND=dp), DIMENSION(3), INTENT(IN)            :: dOmmOqm
    1713              :       INTEGER, INTENT(IN)                                :: iw, par_scheme
    1714              :       REAL(KIND=dp), DIMENSION(2), INTENT(IN)            :: qmmm_spherical_cutoff
    1715              :       LOGICAL                                            :: shells
    1716              : 
    1717              :       CHARACTER(len=*), PARAMETER :: routineN = 'debug_qmmm_forces_with_gauss_LR'
    1718              : 
    1719              :       INTEGER                                            :: handle, I, igrid, IndMM, J, K, ngrids
    1720              :       REAL(KIND=dp)                                      :: Coord_save
    1721              :       REAL(KIND=dp), DIMENSION(2)                        :: energy
    1722              :       REAL(KIND=dp), DIMENSION(3)                        :: Err
    1723              :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: Num_Forces
    1724            0 :       TYPE(pw_r3d_rs_type), ALLOCATABLE, DIMENSION(:)    :: grids
    1725              : 
    1726            0 :       ALLOCATE (Num_Forces(3, num_mm_atoms))
    1727            0 :       CALL timeset(routineN, handle)
    1728            0 :       ngrids = SIZE(aug_pools)
    1729            0 :       CALL pw_pools_create_pws(aug_pools, grids)
    1730            0 :       DO igrid = 1, ngrids
    1731            0 :          CALL pw_zero(grids(igrid))
    1732              :       END DO
    1733            0 :       Atoms: DO I = 1, num_mm_atoms
    1734            0 :          IndMM = mm_atom_index(I)
    1735            0 :          Coords: DO J = 1, 3
    1736            0 :             Coord_save = mm_particles(IndMM)%r(J)
    1737            0 :             energy = 0.0_dp
    1738            0 :             Diff: DO K = 1, 2
    1739            0 :                mm_particles(IndMM)%r(J) = Coord_save + (-1)**K*Dx
    1740            0 :                CALL pw_zero(grids(coarser_grid_level))
    1741              : 
    1742              :                CALL qmmm_elec_with_gaussian_LR(pgfs=pgfs, &
    1743              :                                                grid=grids(coarser_grid_level), &
    1744              :                                                mm_charges=mm_charges, &
    1745              :                                                mm_atom_index=mm_atom_index, &
    1746              :                                                mm_particles=mm_particles, &
    1747              :                                                para_env=para_env, &
    1748              :                                                potentials=potentials, &
    1749              :                                                mm_cell=mm_cell, &
    1750              :                                                dOmmOqm=dOmmOqm, &
    1751              :                                                par_scheme=par_scheme, &
    1752              :                                                qmmm_spherical_cutoff=qmmm_spherical_cutoff, &
    1753            0 :                                                shells=shells)
    1754              : 
    1755            0 :                energy(K) = pw_integral_ab(rho, grids(coarser_grid_level))
    1756              :             END DO Diff
    1757            0 :             IF (iw > 0) &
    1758              :                WRITE (iw, '(A,I6,A,I3,A,2F15.9)') &
    1759            0 :                "DEBUG LR:: MM Atom = ", IndMM, " Coord = ", J, " Energies (+/-) :: ", energy(2), energy(1)
    1760            0 :             Num_Forces(J, I) = (energy(2) - energy(1))/(2.0_dp*Dx)
    1761            0 :             mm_particles(IndMM)%r(J) = Coord_save
    1762              :          END DO Coords
    1763              :       END DO Atoms
    1764              : 
    1765            0 :       DO I = 1, num_mm_atoms
    1766            0 :          IndMM = mm_atom_index(I)
    1767            0 :          Err = 0.0_dp
    1768            0 :          IF (ALL(Num_Forces(:, I) /= 0.0_dp)) THEN
    1769            0 :             Err(1) = (debug_force(1, I) - Num_Forces(1, I))/Num_Forces(1, I)*100.0_dp
    1770            0 :             Err(2) = (debug_force(2, I) - Num_Forces(2, I))/Num_Forces(2, I)*100.0_dp
    1771            0 :             Err(3) = (debug_force(3, I) - Num_Forces(3, I))/Num_Forces(3, I)*100.0_dp
    1772              :          END IF
    1773            0 :          IF (iw > 0) &
    1774            0 :             WRITE (iw, 100) IndMM, debug_force(1, I), Num_Forces(1, I), Err(1), &
    1775            0 :             debug_force(2, I), Num_Forces(2, I), Err(2), &
    1776            0 :             debug_force(3, I), Num_Forces(3, I), Err(3)
    1777            0 :          CPASSERT(ABS(Err(1)) <= MaxErr)
    1778            0 :          CPASSERT(ABS(Err(2)) <= MaxErr)
    1779            0 :          CPASSERT(ABS(Err(3)) <= MaxErr)
    1780              :       END DO
    1781              : 
    1782            0 :       DEALLOCATE (Num_Forces)
    1783            0 :       CALL pw_pools_give_back_pws(aug_pools, grids)
    1784            0 :       CALL timestop(handle)
    1785              : 100   FORMAT("MM Atom LR    : ", I5, 2F15.9, " ( ", F7.2, " ) ", 2F15.9, " ( ", F7.2, " ) ", 2F15.9, " ( ", F7.2, " ) ")
    1786            0 :    END SUBROUTINE debug_qmmm_forces_with_gauss_LR
    1787              : 
    1788              : END MODULE qmmm_gpw_forces
        

Generated by: LCOV version 2.0-1