1!--------------------------------------------------------------------------------------------------!
2!   CP2K: A general program to perform molecular dynamics simulations                              !
3!   Copyright (C) 2000 - 2019  CP2K developers group                                               !
4!--------------------------------------------------------------------------------------------------!
5
6! **************************************************************************************************
7!> \brief Contains the mapping ATOM_KIND -> ELEMENT for the most
8!>      common cases in CHARMM and AMBER
9!>      This should avoid in most cases the need to provide the element
10!>      column in the PDB if in the atom_name column of the PDB is provided
11!>      instead the atom kind
12!> \par History
13!>      10.2006 created [tlaino]
14!> \author Teodoro Laino
15! **************************************************************************************************
16MODULE mm_mapping_library
17
18   USE kinds,                           ONLY: default_string_length
19#include "./base/base_uses.f90"
20
21   IMPLICIT NONE
22   PRIVATE
23   LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .TRUE.
24   CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'mm_mapping_library'
25
26! **************************************************************************************************
27   TYPE ff_map_type
28      CHARACTER(LEN=default_string_length), DIMENSION(:), POINTER :: kind
29      CHARACTER(LEN=default_string_length), DIMENSION(:), POINTER :: element
30   END TYPE ff_map_type
31
32   TYPE(ff_map_type), POINTER, PUBLIC :: amber_map, &
33                                         charmm_map, &
34                                         gromos_map
35   PUBLIC :: create_ff_map, &
36             destroy_ff_map
37CONTAINS
38
39! **************************************************************************************************
40!> \brief Initialize arrays for mapping KINDS <-> ELEMENTS
41!>      for major elements in AMBER and CHARMM
42!> \param ff_type ...
43!> \par History
44!>      10.2006 created [tlaino]
45!> \author Teodoro Laino
46! **************************************************************************************************
47   SUBROUTINE create_ff_map(ff_type)
48      CHARACTER(LEN=*), INTENT(IN)                       :: ff_type
49
50      CHARACTER(len=*), PARAMETER :: routineN = 'create_ff_map', routineP = moduleN//':'//routineN
51      INTEGER, PARAMETER                                 :: amb_imax = 66, chm_imax = 108, &
52                                                            grm_imax = 22
53
54      SELECT CASE (ff_type)
55      CASE ("AMBER")
56         ALLOCATE (amber_map)
57         ! allocate substructures
58         ALLOCATE (amber_map%kind(amb_imax))
59         ALLOCATE (amber_map%element(amb_imax))
60
61         amber_map%kind = (/ &
62                          "BR", "C ", "CA", "CB", "CC", "CD", "CI", "CK", "CP", "CM", &
63                          "CS", "CN", "CQ", "CR", "CT", "CV", "CW", "C*", "CX", "CY", &
64                          "CZ", "CO", "TG", "2C", "3C", "C0", "F ", "H ", "HC", "HA", &
65                          "HO", "HS", "HW", "HP", "HZ", "I ", "IM", "IP", "IB", "MG", &
66                          "N ", "NA", "NB", "NC", "N*", "NT", "NY", "ND", "NL", "TN", &
67                          "OA", "O ", "OW", "OH", "OD", "OS", "OP", "P ", "S ", "SH", &
68                          "CU", "FE", "Li", "K ", "Rb", "Cs"/)
69         amber_map%element = (/ &
70                             "Br", "C ", "C ", "C ", "C ", "C ", "C ", "C ", "C ", "C ", &
71                             "C ", "C ", "C ", "C ", "C ", "C ", "C ", "C ", "C ", "C ", &
72                             "C ", "C ", "C ", "C ", "C ", "Ca", "F ", "H ", "H ", "H ", &
73                             "H ", "H ", "H ", "H ", "H ", "I ", "Cl", "Na", "Na", "Mg", &
74                             "N ", "N ", "N ", "N ", "N ", "N ", "N ", "N ", "N ", "N ", &
75                             "O ", "O ", "O ", "O ", "O ", "O ", "O ", "P ", "S ", "S ", &
76                             "Cu", "Fe", "Li", "K ", "Rb", "Cs"/)
77
78      CASE ("CHARMM")
79         ALLOCATE (charmm_map)
80         ! allocate substructures
81         ALLOCATE (charmm_map%kind(chm_imax))
82         ALLOCATE (charmm_map%element(chm_imax))
83
84         charmm_map%kind = (/ &
85                           "CA  ", "CAL ", "C   ", "CC  ", "CD  ", "CE  ", "CEL ", "CES ", "CLA ", "CL  ", &
86                           "CM  ", "CN1A", "CN1T", "CN3A", "CN3B", "CN3C", "CN3D", "CN3T", "CN5G", "CN7B", &
87                           "CN7C", "CN7D", "CN8B", "CNA ", "CN  ", "CNE ", "CPA ", "CPB ", "CP  ", "CPH ", &
88                           "CPM ", "CPT ", "CS  ", "CT  ", "CTL ", "CY  ", "DUM ", "FE  ", "FNA ", "FN  ", &
89                           "HA  ", "HAL ", "HB  ", "HC  ", "HCL ", "HE  ", "HE  ", "HEL ", "H   ", "HL  ", &
90                           "HN3B", "HN3C", "HNE ", "HN  ", "HNP ", "HOL ", "HP  ", "HR  ", "HS  ", "HT  ", &
91                           "MG  ", "NC  ", "NE  ", "NH3L", "NH  ", "N   ", "NN1C", "NN2B", "NN2C", "NN2G", &
92                           "NN2U", "NN3A", "NN3G", "NN3I", "NN  ", "NPH ", "NP  ", "NR  ", "NR  ", "NTL ", &
93                           "NY  ", "O2L ", "OBL ", "OB  ", "OCL ", "OC  ", "OHL ", "OH  ", "OM  ", "ON1C", &
94                           "ON2b", "ON6B", "ON  ", "O   ", "OSL ", "OS  ", "OT  ", "P2  ", "PL  ", "POT ", &
95                           "P   ", "SL  ", "SM  ", "SOD ", "S   ", "SS  ", "ZN  ", "CN6B"/)
96
97         charmm_map%element = (/ &
98                              "C ", "Ca", "C ", "C ", "C ", "C ", "C ", "Cs", "Cl", "C ", &
99                              "C ", "C ", "C ", "C ", "C ", "C ", "C ", "C ", "C ", "C ", &
100                              "C ", "C ", "C ", "C ", "C ", "C ", "C ", "C ", "C ", "C ", &
101                              "C ", "C ", "C ", "C ", "C ", "C ", "H ", "Fe", "F ", "F ", &
102                              "H ", "H ", "H ", "H ", "H ", "H ", "He", "H ", "H ", "H ", &
103                              "H ", "H ", "H ", "H ", "H ", "H ", "H ", "H ", "H ", "H ", &
104                              "Mg", "N ", "Ne", "N ", "N ", "N ", "N ", "N ", "N ", "N ", &
105                              "N ", "N ", "N ", "N ", "N ", "N ", "N ", "N ", "N ", "N ", &
106                              "N ", "O ", "O ", "O ", "O ", "O ", "O ", "O ", "O ", "O ", &
107                              "O ", "O ", "O ", "O ", "O ", "O ", "O ", "P ", "P ", "K ", &
108                              "P ", "S ", "S ", "Na", "S ", "S ", "Zn", "C "/)
109
110      CASE ("GROMOS")
111         ALLOCATE (gromos_map)
112         ! allocate substructures
113         ALLOCATE (gromos_map%kind(grm_imax))
114         ALLOCATE (gromos_map%element(grm_imax))
115
116         gromos_map%kind = (/ &
117                           "H1  ", "CA  ", "HA  ", "SD  ", "OG  ", "CG  ", "HD  ", "SG  ", &
118                           "CZ  ", "OH  ", "C2  ", "H8  ", "O4* ", "O5* ", "PA  ", "O1A ", &
119                           "MG  ", "Na  ", "Cl  ", "OW  ", "HW  ", "HW  "/)
120
121         gromos_map%element = (/ &
122                              "H ", "C ", "H ", "S ", "O ", "C ", "H ", "S ", &
123                              "C ", "O ", "C ", "H ", "O ", "O ", "P ", "O ", &
124                              "Mg", "Na", "Cl", "O ", "H ", "H "/)
125
126      END SELECT
127
128   END SUBROUTINE create_ff_map
129
130! **************************************************************************************************
131!> \brief Deallocates the arrays used for mapping
132!> \param ff_type ...
133!> \par History
134!>      10.2006 created [tlaino]
135!> \author Teodoro Laino
136! **************************************************************************************************
137   SUBROUTINE destroy_ff_map(ff_type)
138      CHARACTER(LEN=*), INTENT(IN)                       :: ff_type
139
140      CHARACTER(len=*), PARAMETER :: routineN = 'destroy_ff_map', routineP = moduleN//':'//routineN
141
142      SELECT CASE (ff_type)
143      CASE ("AMBER")
144         ! deallocate substructures
145         DEALLOCATE (amber_map%kind)
146         DEALLOCATE (amber_map%element)
147         ! deallocate main
148         DEALLOCATE (amber_map)
149      CASE ("CHARMM")
150         ! deallocate substructures
151         DEALLOCATE (charmm_map%kind)
152         DEALLOCATE (charmm_map%element)
153         ! deallocate main
154         DEALLOCATE (charmm_map)
155      CASE ("GROMOS")
156         ! deallocate substructures
157         DEALLOCATE (gromos_map%kind)
158         DEALLOCATE (gromos_map%element)
159         ! deallocate main
160         DEALLOCATE (gromos_map)
161      END SELECT
162   END SUBROUTINE destroy_ff_map
163
164END MODULE mm_mapping_library
165