energy_MM_MM Subroutine

public subroutine energy_MM_MM(eel, ene)

Uses

  • proc~~energy_mm_mm~~UsesGraph proc~energy_mm_mm energy_MM_MM module~mod_memory mod_memory proc~energy_mm_mm->module~mod_memory module~mod_io mod_io module~mod_memory->module~mod_io module~mod_constants mod_constants module~mod_memory->module~mod_constants iso_c_binding iso_c_binding module~mod_memory->iso_c_binding module~mod_io->module~mod_constants module~mod_constants->iso_c_binding

This function computes the interaction energy of static electric multipoles

Arguments

Type IntentOptional Attributes Name
type(ommp_electrostatics_type), intent(inout) :: eel

Electrostatics data structure

real(kind=rp), intent(inout) :: ene

Energy (results will be added)


Calls

proc~~energy_mm_mm~~CallsGraph proc~energy_mm_mm energy_MM_MM proc~prepare_fixedelec prepare_fixedelec proc~energy_mm_mm->proc~prepare_fixedelec interface~mallocate mallocate proc~prepare_fixedelec->interface~mallocate proc~elec_prop_m2m elec_prop_M2M proc~prepare_fixedelec->proc~elec_prop_m2m proc~time_push time_push proc~prepare_fixedelec->proc~time_push proc~time_pull time_pull proc~prepare_fixedelec->proc~time_pull proc~r_alloc1 r_alloc1 interface~mallocate->proc~r_alloc1 proc~r_alloc3 r_alloc3 interface~mallocate->proc~r_alloc3 proc~i_alloc2 i_alloc2 interface~mallocate->proc~i_alloc2 proc~i_alloc1 i_alloc1 interface~mallocate->proc~i_alloc1 proc~r_alloc2 r_alloc2 interface~mallocate->proc~r_alloc2 proc~i_alloc3 i_alloc3 interface~mallocate->proc~i_alloc3 proc~l_alloc1 l_alloc1 interface~mallocate->proc~l_alloc1 proc~l_alloc2 l_alloc2 interface~mallocate->proc~l_alloc2 proc~coulomb_kernel coulomb_kernel proc~elec_prop_m2m->proc~coulomb_kernel proc~preapare_fmm_static preapare_fmm_static proc~elec_prop_m2m->proc~preapare_fmm_static proc~cart_propfar_at_ipart cart_propfar_at_ipart proc~elec_prop_m2m->proc~cart_propfar_at_ipart proc~quad_elec_prop quad_elec_prop proc~elec_prop_m2m->proc~quad_elec_prop proc~q_elec_prop q_elec_prop proc~elec_prop_m2m->proc~q_elec_prop proc~mu_elec_prop mu_elec_prop proc~elec_prop_m2m->proc~mu_elec_prop proc~mem_stat mem_stat proc~time_push->proc~mem_stat proc~fatal_error fatal_error proc~time_push->proc~fatal_error proc~ommp_message ommp_message proc~time_pull->proc~ommp_message proc~time_pull->proc~mem_stat proc~time_pull->proc~fatal_error proc~memory_init memory_init proc~mem_stat->proc~memory_init proc~coulomb_kernel->proc~fatal_error proc~fatal_error->proc~ommp_message proc~close_output close_output proc~fatal_error->proc~close_output proc~r_alloc1->proc~memory_init proc~chk_alloc chk_alloc proc~r_alloc1->proc~chk_alloc proc~r_alloc3->proc~memory_init proc~r_alloc3->proc~chk_alloc proc~i_alloc2->proc~memory_init proc~i_alloc2->proc~chk_alloc proc~i_alloc1->proc~memory_init proc~i_alloc1->proc~chk_alloc proc~r_alloc2->proc~memory_init proc~r_alloc2->proc~chk_alloc proc~i_alloc3->proc~memory_init proc~i_alloc3->proc~chk_alloc proc~l_alloc1->proc~memory_init proc~l_alloc1->proc~chk_alloc proc~l_alloc2->proc~memory_init proc~l_alloc2->proc~chk_alloc proc~preapare_fmm_static->interface~mallocate interface~mfree mfree proc~preapare_fmm_static->interface~mfree proc~fmm_solve_for_multipoles fmm_solve_for_multipoles proc~preapare_fmm_static->proc~fmm_solve_for_multipoles proc~ntot_sph_harm ntot_sph_harm proc~cart_propfar_at_ipart->proc~ntot_sph_harm proc~fmm_l2l fmm_l2l proc~cart_propfar_at_ipart->proc~fmm_l2l proc~chk_alloc->proc~fatal_error proc~r_free1 r_free1 interface~mfree->proc~r_free1 proc~i_free2 i_free2 interface~mfree->proc~i_free2 proc~i_free1 i_free1 interface~mfree->proc~i_free1 proc~r_free2 r_free2 interface~mfree->proc~r_free2 proc~r_free3 r_free3 interface~mfree->proc~r_free3 proc~i_free3 i_free3 interface~mfree->proc~i_free3 proc~l_free1 l_free1 interface~mfree->proc~l_free1 proc~l_free2 l_free2 interface~mfree->proc~l_free2 proc~fmm_solve_for_multipoles->proc~time_push proc~fmm_solve_for_multipoles->proc~time_pull proc~fmm_solve_for_multipoles->proc~fatal_error proc~tree_l2l tree_l2l proc~fmm_solve_for_multipoles->proc~tree_l2l proc~tree_m2m tree_m2m proc~fmm_solve_for_multipoles->proc~tree_m2m proc~tree_m2l tree_m2l proc~fmm_solve_for_multipoles->proc~tree_m2l proc~tree_p2m tree_p2m proc~fmm_solve_for_multipoles->proc~tree_p2m proc~close_output->proc~ommp_message proc~fmm_l2l_rotation_work fmm_l2l_rotation_work proc~fmm_l2l->proc~fmm_l2l_rotation_work proc~make_vfact make_vfact proc~fmm_l2l->proc~make_vfact proc~carttosph carttosph proc~fmm_l2l_rotation_work->proc~carttosph proc~fmm_l2l_ztranslate_work fmm_l2l_ztranslate_work proc~fmm_l2l_rotation_work->proc~fmm_l2l_ztranslate_work proc~trgev trgev proc~fmm_l2l_rotation_work->proc~trgev proc~fmm_sph_rotate_oxz_work fmm_sph_rotate_oxz_work proc~fmm_l2l_rotation_work->proc~fmm_sph_rotate_oxz_work proc~fmm_sph_rotate_oz_adj_work fmm_sph_rotate_oz_adj_work proc~fmm_l2l_rotation_work->proc~fmm_sph_rotate_oz_adj_work proc~fmm_sph_rotate_oz_work fmm_sph_rotate_oz_work proc~fmm_l2l_rotation_work->proc~fmm_sph_rotate_oz_work proc~tree_l2l->proc~ntot_sph_harm proc~tree_l2l->proc~fmm_l2l proc~chk_free chk_free proc~r_free1->proc~chk_free proc~i_free2->proc~chk_free proc~i_free1->proc~chk_free proc~r_free2->proc~chk_free proc~r_free3->proc~chk_free proc~i_free3->proc~chk_free proc~l_free1->proc~chk_free proc~l_free2->proc~chk_free proc~tree_m2m->proc~ntot_sph_harm proc~fmm_m2m fmm_m2m proc~tree_m2m->proc~fmm_m2m proc~tree_m2l->proc~ntot_sph_harm proc~fmm_m2l fmm_m2l proc~tree_m2l->proc~fmm_m2l proc~tree_p2m->proc~ntot_sph_harm proc~tree_p2m->proc~fmm_m2m proc~fmm_error fmm_error proc~tree_p2m->proc~fmm_error proc~chk_free->proc~fatal_error proc~fmm_m2m_rotation_work fmm_m2m_rotation_work proc~fmm_m2m->proc~fmm_m2m_rotation_work proc~fmm_m2l_rotation_work fmm_m2l_rotation_work proc~fmm_m2l->proc~fmm_m2l_rotation_work proc~fmm_m2m_rotation_work->proc~carttosph proc~fmm_m2m_rotation_work->proc~trgev proc~fmm_m2m_rotation_work->proc~fmm_sph_rotate_oxz_work proc~fmm_m2m_rotation_work->proc~fmm_sph_rotate_oz_adj_work proc~fmm_m2m_rotation_work->proc~fmm_sph_rotate_oz_work proc~fmm_m2m_ztranslate_work fmm_m2m_ztranslate_work proc~fmm_m2m_rotation_work->proc~fmm_m2m_ztranslate_work proc~fmm_m2l_rotation_work->proc~carttosph proc~fmm_m2l_rotation_work->proc~trgev proc~fmm_m2l_rotation_work->proc~fmm_sph_rotate_oxz_work proc~fmm_m2l_rotation_work->proc~fmm_sph_rotate_oz_adj_work proc~fmm_m2l_rotation_work->proc~fmm_sph_rotate_oz_work proc~fmm_m2l_ztranslate_work fmm_m2l_ztranslate_work proc~fmm_m2l_rotation_work->proc~fmm_m2l_ztranslate_work

Called by

proc~~energy_mm_mm~~CalledByGraph proc~energy_mm_mm energy_MM_MM proc~ommp_get_fixedelec_energy ommp_get_fixedelec_energy proc~ommp_get_fixedelec_energy->proc~energy_mm_mm proc~ommp_get_full_ele_energy ommp_get_full_ele_energy proc~ommp_get_full_ele_energy->proc~ommp_get_fixedelec_energy proc~c_ommp_get_fixedelec_energy C_ommp_get_fixedelec_energy proc~c_ommp_get_fixedelec_energy->proc~ommp_get_fixedelec_energy proc~ommp_get_full_energy ommp_get_full_energy proc~ommp_get_full_energy->proc~ommp_get_full_ele_energy proc~c_ommp_get_full_ele_energy C_ommp_get_full_ele_energy proc~c_ommp_get_full_ele_energy->proc~ommp_get_full_ele_energy proc~c_ommp_get_full_energy C_ommp_get_full_energy proc~c_ommp_get_full_energy->proc~ommp_get_full_energy

Contents

Source Code


Source Code

    subroutine energy_MM_MM(eel, ene)
        !! This function computes the interaction energy of 
        !! static electric multipoles
        use mod_memory, only: mallocate, mfree

        implicit none

        type(ommp_electrostatics_type), intent(inout) :: eel
        !! Electrostatics data structure
        real(rp), intent(inout) :: ene
        !! Energy (results will be added)
        real(rp) :: eMM

        integer(ip) :: i

        call prepare_fixedelec(eel)
        eMM = 0.0

        if(eel%amoeba) then
            eMM = eMM + dot_product(eel%q(1,:), eel%V_M2M)
            do i=1, 3
                eMM = eMM - dot_product(eel%q(i+1,:), eel%E_M2M(i,:))
            end do

            do i=1,6
                if(i == _xx_ .or. i == _yy_ .or. i == _zz_) then
                    ! diagonal elements
                    eMM = eMM + dot_product(eel%q(i+4,:), eel%Egrd_M2M(i,:))
                else
                    ! off-diagonal elements (are stored once, but 
                    ! should be counted twice
                    eMM = eMM + 2.0 * dot_product(eel%q(i+4,:), eel%Egrd_M2M(i,:))
                end if
            end do
        else
            eMM = eMM + dot_product(eel%q(1,:), eel%V_M2M)
        end if

        ! Since potential is computed using all the sites each 
        ! interaction is counted twice
        ene = ene + 0.5_rp * eMM
    
    end subroutine energy_MM_MM