ommp_electrostatics_type Derived Type

type, public :: ommp_electrostatics_type


Inherits

type~~ommp_electrostatics_type~~InheritsGraph type~ommp_electrostatics_type ommp_electrostatics_type type~ommp_topology_type ommp_topology_type type~ommp_electrostatics_type->type~ommp_topology_type top type~fmm_type fmm_type type~ommp_electrostatics_type->type~fmm_type fmm_static, fmm_ipd type~fmm_tree_type fmm_tree_type type~ommp_electrostatics_type->type~fmm_tree_type tree type~yale_sparse yale_sparse type~ommp_electrostatics_type->type~yale_sparse polgrp_mmat, pg_conn, fmm_near_field_list, list_S_S, list_P_P, list_S_P_P, list_S_P_D, list_S_S_fmm_far, list_P_P_fmm_far, list_S_P_P_fmm_far, list_S_P_D_fmm_far type~ommp_topology_type->type~yale_sparse conn type~fmm_type->type~fmm_tree_type tree type~fmm_tree_type->type~yale_sparse level_list, particle_list, near_nl, far_nl

Inherited by

type~~ommp_electrostatics_type~~InheritedByGraph type~ommp_electrostatics_type ommp_electrostatics_type type~ommp_system ommp_system type~ommp_system->type~ommp_electrostatics_type eel

Contents


Components

Type Visibility Attributes Name Initial
integer(kind=ip), public :: def_solver

Solver to be used by default for this eel object.

integer(kind=ip), public :: def_matv

Matrix-vector method to be used by default for this eel object.

type(ommp_topology_type), public, pointer :: top

Data structure containing all the topological informations

integer(kind=ip), public :: pol_atoms

number of polarizable atoms

logical(kind=lp), public :: amoeba

True if AMOEBA FF is used

integer(kind=ip), public :: ld_cart

size of the cartesian multipolar distribution (i.e., (l+1)(l+2)(l+3)/6) this is 1 for AMBER (charges only), 10 for AMOEBA (up to quadrupoles). this is also the size of the array that contains the electrostatic properties of the sources at the sources. ld_cder is the leading size of the derivative of such a distribution, which is 3 for AMBER and 19 for AMOEBA.

integer(kind=ip), public :: ld_cder

size of the cartesian multipolar distribution (i.e., (l+1)(l+2)(l+3)/6) this is 1 for AMBER (charges only), 10 for AMOEBA (up to quadrupoles). this is also the size of the array that contains the electrostatic properties of the sources at the sources. ld_cder is the leading size of the derivative of such a distribution, which is 3 for AMBER and 19 for AMOEBA.

integer(kind=ip), public :: n_ipd

number of induced point dipoles distributions this is 1 for AMBER and 2 for AMOEBA

real(kind=rp), public :: mscale(4)

factors for charge-charge (or multipole-multipole) interactions

real(kind=rp), public :: pscale(4)

factors for chrage-ipd (or multipole-ipd) interactions. in AMOEBA, this is used to define the polarization field, i.e., the right-hand side to the polarization equations, and depends on the connectivity.

real(kind=rp), public :: pscale_intra(4)

Only used for AMOEBA, same as pscale but for atoms that belong to the same polarization group

real(kind=rp), public :: dscale(4)

factors for multipoles-ipd interactions used to compute the direct field, which is used to define the polarization energy. these factors depend on the polarization group "connectivity" (AMOEBA only)

real(kind=rp), public :: uscale(4)

factor for ipd-ipd interactions. these depend on the connectivity (AMBER) or on the polarization group " connectivity (AMOEBA)

real(kind=rp), public, allocatable :: thole(:)

array to store the thole factors for computing damping functions

real(kind=rp), public :: thole_scale

Scale factor for thole damping (only used by non-AMOEBA FF); all the element of thole(:) are multiplied by thole_scale ** 0.5

real(kind=rp), public, allocatable :: cpol(:,:)

Coordinates of polarizable atoms (3:pol_atoms)

real(kind=rp), public, allocatable :: q(:,:)

Mutlipolar distribution (ld_cart:mm_atoms) For AMOEBA this is the rotated distribution. The order for the stored multipoles is q, px, py, pz, Qxx, Qxy, Qyy, Qxz, Qyx, Qzz.

real(kind=rp), public, allocatable :: q0(:,:)

Unrotated utlipolar distribution (ld_cart:mm_atoms) (AMOEBA only)

real(kind=rp), public, allocatable :: pol(:)

Polarizabilities for each polarizable atom

integer(kind=ip), public, allocatable :: mm_polar(:)

for each mm atom: 0 if is not polarizable, index in polarizable atom list otherwise

integer(kind=ip), public, allocatable :: polar_mm(:)

positions of a polarizable atom in the mm atoms list

integer(kind=ip), public, allocatable :: C_polar_mm(:)

polar_mm with 0-based C-indexing, only allocated at need.

integer(kind=ip), public, allocatable :: mmat_polgrp(:)

Polarizability group index for each MM site

type(yale_sparse), public :: polgrp_mmat

For each polarization group index, list all the MM atoms included. It basically is a sparse boolean matrix of dimension N_polgroups x N_mmatoms

type(yale_sparse), public, allocatable :: pg_conn(:)

Adjacency and connectivity matytrices between polarizability groups. Two groups are said to be adjacent if they are connected by a chemical bond. The 1st element is the identity matrix for code simplicity.

integer(kind=ip), public, allocatable :: mol_frame(:)

definition of the molecular frame convention: 0 ... do not rotate 1 ... z-then-x 2 ... bisector 3 ... z-only 4 ... z-bisector 5 ... 3-fold

integer(kind=ip), public, allocatable :: ix(:)

neighboring atoms used to define the axes of the molecular frame

integer(kind=ip), public, allocatable :: iy(:)

neighboring atoms used to define the axes of the molecular frame

integer(kind=ip), public, allocatable :: iz(:)

neighboring atoms used to define the axes of the molecular frame

logical(kind=lp), public :: use_fmm = .false.

flag to use fast multipoles

integer(kind=ip), public :: fmm_maxl_static = 0

Maximum angular moment used in fast multipoles for fixed part

integer(kind=ip), public :: fmm_maxl_pol = 0

Maximum angular moment used in fast multipoles for polarizable part

real(kind=rp), public :: fmm_min_cell_size = 0.0

Minimum dimension for cell size used in FMM

real(kind=rp), public :: fmm_distance = 0.0

Threshold distance for considering two nodes in FMM tree as far

type(fmm_type), public, allocatable :: fmm_static

Fast multipoles object for static multipoles sources

logical(kind=lp), public :: fmm_static_done = .false.

Flag for a fresh solution of ipd fmm

type(fmm_type), public, allocatable :: fmm_ipd(:)

Fast multipoles object for static multipoles sources

logical(kind=lp), public, allocatable :: fmm_ipd_done(:)

Flag for a fresh solution of ipd fmm

type(fmm_tree_type), public, allocatable :: tree

Tree object

type(yale_sparse), public :: fmm_near_field_list

For each particle, all the particles that should be included in near field

logical(kind=lp), public :: M2M_done = .false.

flag to set when M2M electrostatic quantities are computed.

logical(kind=lp), public :: M2Mgg_done = .false.

flag to set when M2M electrostatic quantities for geometrical gradients are computed.

real(kind=rp), public, allocatable :: V_M2M(:)

potential of MM permanent multipoles at MM sites;

real(kind=rp), public, allocatable :: E_M2M(:,:)

electric_field of MM permanent multipoles at MM sites;

real(kind=rp), public, allocatable :: Egrd_M2M(:,:)

electric_field gradient of MM permanent multipoles at MM sites;

real(kind=rp), public, allocatable :: EHes_M2M(:,:)

electric field Hessian of MM permanent multipoles at MM sites;

logical(kind=lp), public :: M2D_done = .false.

Flag to set when M2D electrostatics have been computed.

logical(kind=lp), public :: M2Dgg_done = .false.

Flag to set when M2D electrostatics for geometrical gradients have been computed.

real(kind=rp), public, allocatable :: V_M2D(:,:)
real(kind=rp), public, allocatable :: E_M2D(:,:,:)

electric field of MM permanent multipoles at POL sites;

real(kind=rp), public, allocatable :: Egrd_M2D(:,:,:)

electric field of MM permanent multipoles at POL sites;

real(kind=rp), public, allocatable :: EHes_M2D(:,:,:)
logical(kind=lp), public :: D2Mgg_done = .false.
real(kind=rp), public, allocatable :: V_D2M(:)
real(kind=rp), public, allocatable :: E_D2M(:,:)
real(kind=rp), public, allocatable :: Egrd_D2M(:,:)
real(kind=rp), public, allocatable :: EHes_D2M(:,:)
logical(kind=lp), public :: D2Dgg_done = .false.
real(kind=rp), public, allocatable :: V_D2D(:,:)
real(kind=rp), public, allocatable :: E_D2D(:,:,:)
real(kind=rp), public, allocatable :: Egrd_D2D(:,:,:)
real(kind=rp), public, allocatable :: EHes_D2D(:,:,:)
logical(kind=lp), public :: ipd_done = .false.

Flag to set when IPD have been computed.

logical(kind=lp), public :: ipd_use_guess = .false.

Flag to set when current value of IPD can be used as guess for next solution of LS.

real(kind=rp), public, allocatable :: ipd(:,:,:)

induced point dipoles (3:pol_atoms:ipd)

real(kind=rp), public, allocatable :: TMat(:,:)

Interaction tensor, only allocated for the methods that explicitly requires it.

logical(kind=lp), public :: screening_list_done = .false.

Flag to check if screening list have already been prepared

type(yale_sparse), public, allocatable :: list_S_S

Sparse matrix containg the scale factors for the scaled elements
of electrostatic interactions (all the element that are not
present in the sparse matrix have a scaling factor 1.0).
When FMM are enabled, those lists are only for near-field
interactions

type(yale_sparse), public, allocatable :: list_P_P

Sparse matrix containg the scale factors for the scaled elements
of electrostatic interactions (all the element that are not
present in the sparse matrix have a scaling factor 1.0).
When FMM are enabled, those lists are only for near-field
interactions

type(yale_sparse), public, allocatable :: list_S_P_P

Sparse matrix containg the scale factors for the scaled elements
of electrostatic interactions (all the element that are not
present in the sparse matrix have a scaling factor 1.0).
When FMM are enabled, those lists are only for near-field
interactions

type(yale_sparse), public, allocatable :: list_S_P_D

Sparse matrix containg the scale factors for the scaled elements
of electrostatic interactions (all the element that are not
present in the sparse matrix have a scaling factor 1.0).
When FMM are enabled, those lists are only for near-field
interactions

type(yale_sparse), public, allocatable :: list_S_S_fmm_far

Sparse matrices containing the scale factors for the scaled elements
of electrostatic far-field interactions (only when FMM are
enabled). If a reasonable FMM distance is chosen, those lists
should be almost empty.

type(yale_sparse), public, allocatable :: list_P_P_fmm_far

Sparse matrices containing the scale factors for the scaled elements
of electrostatic far-field interactions (only when FMM are
enabled). If a reasonable FMM distance is chosen, those lists
should be almost empty.

type(yale_sparse), public, allocatable :: list_S_P_P_fmm_far

Sparse matrices containing the scale factors for the scaled elements
of electrostatic far-field interactions (only when FMM are
enabled). If a reasonable FMM distance is chosen, those lists
should be almost empty.

type(yale_sparse), public, allocatable :: list_S_P_D_fmm_far

Sparse matrices containing the scale factors for the scaled elements
of electrostatic far-field interactions (only when FMM are
enabled). If a reasonable FMM distance is chosen, those lists
should be almost empty.

logical(kind=lp), public, dimension(:), allocatable :: todo_S_S

Logical array of the same dimension of column-index vector; true if the scaling factor is zero, false otherwise

logical(kind=lp), public, dimension(:), allocatable :: todo_P_P

Logical array of the same dimension of column-index vector; true if the scaling factor is zero, false otherwise

logical(kind=lp), public, dimension(:), allocatable :: todo_S_P_P

Logical array of the same dimension of column-index vector; true if the scaling factor is zero, false otherwise

logical(kind=lp), public, dimension(:), allocatable :: todo_S_P_D

Logical array of the same dimension of column-index vector; true if the scaling factor is zero, false otherwise

logical(kind=lp), public, dimension(:), allocatable :: todo_S_S_fmm_far

Logical array of the same dimension of column-index vector; true if the scaling factor is zero, false otherwise

logical(kind=lp), public, dimension(:), allocatable :: todo_P_P_fmm_far

Logical array of the same dimension of column-index vector; true if the scaling factor is zero, false otherwise

logical(kind=lp), public, dimension(:), allocatable :: todo_S_P_P_fmm_far

Logical array of the same dimension of column-index vector; true if the scaling factor is zero, false otherwise

logical(kind=lp), public, dimension(:), allocatable :: todo_S_P_D_fmm_far

Logical array of the same dimension of column-index vector; true if the scaling factor is zero, false otherwise

real(kind=rp), public, dimension(:), allocatable :: scalef_S_S_fmm_far

Array of the same dimension of column-index vector; contains the value of the scaling factors different from 1.0

real(kind=rp), public, dimension(:), allocatable :: scalef_P_P_fmm_far

Array of the same dimension of column-index vector; contains the value of the scaling factors different from 1.0

real(kind=rp), public, dimension(:), allocatable :: scalef_S_P_P_fmm_far

Array of the same dimension of column-index vector; contains the value of the scaling factors different from 1.0

real(kind=rp), public, dimension(:), allocatable :: scalef_S_P_D_fmm_far

Array of the same dimension of column-index vector; contains the value of the scaling factors different from 1.0

real(kind=rp), public, dimension(:), allocatable :: scalef_S_S

Array of the same dimension of column-index vector; contains the value of the scaling factors different from 1.0

real(kind=rp), public, dimension(:), allocatable :: scalef_P_P

Array of the same dimension of column-index vector; contains the value of the scaling factors different from 1.0

real(kind=rp), public, dimension(:), allocatable :: scalef_S_P_P

Array of the same dimension of column-index vector; contains the value of the scaling factors different from 1.0

real(kind=rp), public, dimension(:), allocatable :: scalef_S_P_D

Array of the same dimension of column-index vector; contains the value of the scaling factors different from 1.0


Source Code

    type ommp_electrostatics_type
        integer(ip) :: def_solver
        !! Solver to be used by default for this eel object.
        integer(ip) :: def_matv
        !! Matrix-vector method to be used by default for this eel object.

        type(ommp_topology_type), pointer :: top
        !! Data structure containing all the topological informations
        integer(ip) :: pol_atoms 
        !! number of polarizable atoms
        logical(lp) :: amoeba
        !! True if AMOEBA FF is used
        integer(ip) :: ld_cart, ld_cder
        !! size of the cartesian multipolar distribution (i.e., (l+1)*(l+2)*(l+3)/6)
        !! this is 1 for AMBER (charges only), 10 for AMOEBA (up to quadrupoles). 
        !! this is also the size of the array that contains the electrostatic properties
        !! of the sources at the sources. ld_cder is the leading size of the derivative of
        !! such a distribution, which is 3 for AMBER and 19 for AMOEBA.
        integer(ip) :: n_ipd 
        !! number of induced point dipoles distributions 
        !! this is 1 for AMBER and 2 for AMOEBA
        
        real(rp) :: mscale(4)
        !! factors for charge-charge (or multipole-multipole) interactions

        real(rp) :: pscale(4)
        !! factors for chrage-ipd (or multipole-ipd) interactions.
        !! in AMOEBA, this is used to define the polarization field, i.e., the right-hand
        !! side to the polarization equations, and depends on the connectivity.

        real(rp) :: pscale_intra(4)
        !! Only used for AMOEBA, same as pscale but for atoms that belong to the 
        !! same polarization group
        
        real(rp) :: dscale(4)
        !! factors for multipoles-ipd interactions used to compute the direct field,
        !! which is used to define the polarization energy. these factors depend on 
        !! the polarization group "connectivity" (AMOEBA only)

        real(rp) :: uscale(4)
        !! factor for ipd-ipd interactions. these depend on the connectivity (AMBER)
        !! or on the polarization group " connectivity (AMOEBA)

        ! allocatable arrays which describe the polarizable system
        
        real(rp), allocatable :: thole(:)
        !! array to store the thole factors for computing damping functions
        
        real(rp) :: thole_scale
        !! Scale factor for thole damping (only used by non-AMOEBA FF); all
        !! the element of thole(:) are multiplied by thole_scale ** 0.5

        real(rp), allocatable :: cpol(:,:)
        !! Coordinates of polarizable atoms (3:pol_atoms)
        
        real(rp), allocatable :: q(:,:)
        !! Mutlipolar distribution (ld_cart:mm_atoms)
        !! For AMOEBA this is the rotated distribution.
        !! The order for the stored multipoles is
        !! q, px, py, pz, Qxx, Qxy, Qyy, Qxz, Qyx, Qzz.

        real(rp), allocatable :: q0(:,:)
        !! Unrotated utlipolar distribution (ld_cart:mm_atoms)
        !! (AMOEBA only)
        
        real(rp), allocatable :: pol(:)
        !! Polarizabilities for each polarizable atom
        
        integer(ip), allocatable :: mm_polar(:)
        !! for each mm atom: 0 if is not polarizable, index in 
        !! polarizable atom list otherwise

        integer(ip), allocatable :: polar_mm(:)
        !! positions of a polarizable atom in the mm atoms list

        integer(ip), allocatable :: C_polar_mm(:)
        !! [[polar_mm]] with 0-based C-indexing, only allocated at need.
        
        integer(ip), allocatable :: mmat_polgrp(:)
        !! Polarizability group index for each MM site

        type(yale_sparse) :: polgrp_mmat
        !! For each polarization group index, list all the MM atoms included.
        !! It basically is a sparse boolean matrix of dimension 
        !! N_polgroups x N_mmatoms

        type(yale_sparse), allocatable :: pg_conn(:)
        !! Adjacency and connectivity matytrices between polarizability groups.
        !! Two groups are said to be adjacent if they are connected by a chemical 
        !! bond. The 1st element is the identity matrix for code simplicity.
        
        ! parameters for the definition of the rotation matrices for the multipoles:
        integer(ip), allocatable :: mol_frame(:)
        !! definition of the molecular frame
        !! convention: 0 ... do not rotate
        !!             1 ... z-then-x
        !!             2 ... bisector
        !!             3 ... z-only
        !!             4 ... z-bisector
        !!             5 ... 3-fold

        integer(ip), allocatable :: ix(:), iy(:), iz(:)
        !! neighboring atoms used to define the axes of the molecular frame

        !- FMM quantities here
        logical(lp) :: use_fmm = .false.
        !! flag to use fast multipoles
        integer(ip) :: fmm_maxl_static = 0
        !! Maximum angular moment used in fast multipoles for fixed part
        integer(ip) :: fmm_maxl_pol = 0
        !! Maximum angular moment used in fast multipoles for polarizable part
        real(rp) :: fmm_min_cell_size = 0.0
        !! Minimum dimension for cell size used in FMM
        real(rp) :: fmm_distance = 0.0
        !! Threshold distance for considering two nodes in FMM tree as far
        type(fmm_type), allocatable :: fmm_static
        !! Fast multipoles object for static multipoles sources
        logical(lp) :: fmm_static_done = .false.
        !! Flag for a fresh solution of ipd fmm
        type(fmm_type), allocatable :: fmm_ipd(:)
        !! Fast multipoles object for static multipoles sources
        logical(lp), allocatable :: fmm_ipd_done(:)
        !! Flag for a fresh solution of ipd fmm
        type(fmm_tree_type), allocatable :: tree
        !! Tree object
        type(yale_sparse) :: fmm_near_field_list
        !! For each particle, all the particles that should be included in near field
    
        !- Intermediate data allocate here -!
        logical(lp) :: M2M_done = .false.
        !! flag to set when M2M electrostatic quantities are computed.
        logical(lp) :: M2Mgg_done = .false.
        !! flag to set when M2M electrostatic quantities for geometrical
        !! gradients are computed.
        real(rp), allocatable :: V_M2M(:)
        !! potential of MM permanent multipoles at MM sites; 
        real(rp), allocatable :: E_M2M(:,:)
        !! electric_field of MM permanent multipoles at MM sites; 
        real(rp), allocatable :: Egrd_M2M(:,:)
        !! electric_field gradient of MM permanent multipoles at MM sites;
        real(rp), allocatable :: EHes_M2M(:,:) 
        !! electric field Hessian of MM permanent multipoles at MM sites;

        logical(lp) :: M2D_done = .false.
        !! Flag to set when M2D electrostatics have been computed.
        logical(lp) :: M2Dgg_done = .false.
        !! Flag to set when M2D electrostatics for geometrical gradients 
        !! have been computed.
        real(rp), allocatable :: V_M2D(:,:)
        ! electrostatic potential of MM permanent multipoles at POL sites; unused.
        real(rp), allocatable :: E_M2D(:,:,:) ! TODO the third dimension is used?
        !! electric field of MM permanent multipoles at POL sites; 
        real(rp), allocatable :: Egrd_M2D(:,:,:)
        !! electric field of MM permanent multipoles at POL sites;
        real(rp), allocatable :: EHes_M2D(:,:,:)
        ! electric field Hessian of MM permanent multipoles at POL sites; unused.

        logical(lp) :: D2Mgg_done = .false.
        real(rp), allocatable :: V_D2M(:)
        real(rp), allocatable :: E_D2M(:,:)
        real(rp), allocatable :: Egrd_D2M(:,:)
        real(rp), allocatable :: EHes_D2M(:,:)

        logical(lp) :: D2Dgg_done = .false.
        real(rp), allocatable :: V_D2D(:,:)
        real(rp), allocatable :: E_D2D(:,:,:)
        real(rp), allocatable :: Egrd_D2D(:,:,:)
        real(rp), allocatable :: EHes_D2D(:,:,:)
        
        logical(lp) :: ipd_done = .false.
        !! Flag to set when IPD have been computed.
        logical(lp) :: ipd_use_guess = .false.
        !! Flag to set when current value of IPD can be
        !! used as guess for next solution of LS.
        real(rp), allocatable :: ipd(:,:,:)
        !! induced point dipoles (3:pol_atoms:ipd) 
    
        real(rp), allocatable :: TMat(:,:)
        !! Interaction tensor, only allocated for the methods that explicitly 
        !! requires it.
        
        logical(lp) :: screening_list_done = .false.
        !! Flag to check if screening list have already been prepared
        type(yale_sparse), allocatable :: list_S_S, list_P_P, list_S_P_P, list_S_P_D                                                             
        !! Sparse matrix containg the scale factors for the scaled elements                                                                      
        !! of electrostatic interactions (all the element that are not                                                                           
        !! present in the sparse matrix have a scaling factor 1.0).                                                                              
        !! When FMM are enabled, those lists are only for near-field                                                                             
        !! interactions                                                                                                                          
        type(yale_sparse), allocatable :: list_S_S_fmm_far, &                                                                                    
                                          list_P_P_fmm_far, &                                                                                    
                                          list_S_P_P_fmm_far, &                                                                                  
                                          list_S_P_D_fmm_far                                                                                     
        !! Sparse matrices containing the scale factors for the scaled elements                                                                  
        !! of electrostatic far-field interactions (only when FMM are                                                                            
        !! enabled). If a reasonable FMM distance is chosen, those lists                                                                         
        !! should be almost empty.     
        logical(lp), dimension(:), allocatable :: todo_S_S, todo_P_P, todo_S_P_P, todo_S_P_D
        !! Logical array of the same dimension of column-index vector; true if 
        !! the scaling factor is zero, false otherwise
        logical(lp), dimension(:), allocatable :: todo_S_S_fmm_far, todo_P_P_fmm_far, &
                                                  todo_S_P_P_fmm_far, todo_S_P_D_fmm_far
        !! Logical array of the same dimension of column-index vector; true if 
        !! the scaling factor is zero, false otherwise
        real(rp), dimension(:), allocatable :: scalef_S_S_fmm_far, scalef_P_P_fmm_far, &
                                               scalef_S_P_P_fmm_far, scalef_S_P_D_fmm_far
        !! Array of the same dimension of column-index vector; contains the 
        !! value of the scaling factors different from 1.0
        real(rp), dimension(:), allocatable :: scalef_S_S, scalef_P_P, &
                                               scalef_S_P_P, scalef_S_P_D
        !! Array of the same dimension of column-index vector; contains the 
        !! value of the scaling factors different from 1.0
    end type ommp_electrostatics_type