Line data Source code
1 : !--------------------------------------------------------------------------------------------------!
2 : ! CP2K: A general program to perform molecular dynamics simulations !
3 : ! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4 : ! !
5 : ! SPDX-License-Identifier: GPL-2.0-or-later !
6 : !--------------------------------------------------------------------------------------------------!
7 :
8 : ! **************************************************************************************************
9 : !> \par History
10 : !> Subroutine input_torsions changed (DG) 05-Dec-2000
11 : !> Output formats changed (DG) 05-Dec-2000
12 : !> JGH (26-01-2002) : force field parameters stored in tables, not in
13 : !> matrices. Input changed to have parameters labeled by the position
14 : !> and not atom pairs (triples etc)
15 : !> Teo (11.2005) : Moved all information on force field pair_potential to
16 : !> a much lighter memory structure
17 : !> Teo 09.2006 : Split all routines force_field I/O in a separate file
18 : !> \author CJM
19 : ! **************************************************************************************************
20 : MODULE force_fields_input
21 : USE ace_wrapper, ONLY: ace_model_initialize,&
22 : ace_model_type
23 : USE bibliography, ONLY: Clabaut2020,&
24 : Clabaut2021,&
25 : Siepmann1995,&
26 : Tersoff1988,&
27 : Tosi1964a,&
28 : Tosi1964b,&
29 : Yamada2000,&
30 : cite_reference
31 : USE cp_files, ONLY: discover_file
32 : USE cp_linked_list_input, ONLY: cp_sll_val_next,&
33 : cp_sll_val_type
34 : USE cp_log_handling, ONLY: cp_get_default_logger,&
35 : cp_logger_type,&
36 : cp_to_string
37 : USE cp_output_handling, ONLY: cp_print_key_finished_output,&
38 : cp_print_key_unit_nr
39 : USE cp_parser_methods, ONLY: parser_get_next_line
40 : USE cp_parser_types, ONLY: cp_parser_type,&
41 : parser_create,&
42 : parser_release
43 : USE cp_units, ONLY: cp_unit_to_cp2k
44 : USE damping_dipole_types, ONLY: damping_info_type
45 : USE force_field_kind_types, ONLY: do_ff_amber,&
46 : do_ff_charmm,&
47 : do_ff_g87,&
48 : do_ff_g96,&
49 : do_ff_opls,&
50 : do_ff_undef,&
51 : legendre_data_type
52 : USE force_field_types, ONLY: force_field_type,&
53 : input_info_type
54 : USE force_fields_util, ONLY: get_generic_info
55 : USE input_section_types, ONLY: section_vals_get,&
56 : section_vals_get_subs_vals,&
57 : section_vals_list_get,&
58 : section_vals_type,&
59 : section_vals_val_get
60 : USE input_val_types, ONLY: val_get,&
61 : val_type
62 : USE kinds, ONLY: default_path_length,&
63 : default_string_length,&
64 : dp
65 : USE mathconstants, ONLY: pi
66 : USE mathlib, ONLY: invert_matrix
67 : USE memory_utilities, ONLY: reallocate
68 : USE message_passing, ONLY: mp_para_env_type
69 : USE pair_potential_types, ONLY: &
70 : ace_type, allegro_type, b4_type, bm_type, deepmd_type, do_potential_single_allocation, &
71 : ea_type, eam_pot_type, ft_pot_type, ft_type, ftd_type, gal21_type, gal_type, gp_type, &
72 : gw_type, ip_type, ipbv_pot_type, lj_charmm_type, mace_type, nequip_pot_type, nequip_type, &
73 : no_potential_single_allocation, pair_potential_p_type, pair_potential_reallocate, &
74 : potential_single_allocation, siepmann_type, tab_pot_type, tab_type, tersoff_type, wl_type
75 : USE shell_potential_types, ONLY: shell_p_create,&
76 : shell_p_type
77 : USE string_utilities, ONLY: uppercase
78 : USE torch_api, ONLY: torch_allow_tf32,&
79 : torch_model_read_metadata
80 : #include "./base/base_uses.f90"
81 :
82 : IMPLICIT NONE
83 :
84 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'force_fields_input'
85 :
86 : PRIVATE
87 : PUBLIC :: read_force_field_section, &
88 : read_lj_section, &
89 : read_wl_section, &
90 : read_gd_section, &
91 : read_gp_section, &
92 : read_chrg_section
93 :
94 : CONTAINS
95 :
96 : ! **************************************************************************************************
97 : !> \brief Reads the force_field input section
98 : !> \param ff_section ...
99 : !> \param mm_section ...
100 : !> \param ff_type ...
101 : !> \param para_env ...
102 : !> \author teo
103 : ! **************************************************************************************************
104 36918 : SUBROUTINE read_force_field_section1(ff_section, mm_section, ff_type, para_env)
105 : TYPE(section_vals_type), POINTER :: ff_section, mm_section
106 : TYPE(force_field_type), INTENT(INOUT) :: ff_type
107 : TYPE(mp_para_env_type), POINTER :: para_env
108 :
109 : CHARACTER(LEN=default_string_length), &
110 2637 : DIMENSION(:), POINTER :: atm_names
111 : INTEGER :: nace, nb4, nbends, nbm, nbmhft, nbmhftd, nbonds, nchg, ndeepmd, neam, ngal, &
112 : ngal21, ngd, ngp, nimpr, nipbv, nlj, nmace, nnequip, nopbend, nshell, nsiepmann, ntab, &
113 : ntersoff, ntors, ntot, nubs, nwl
114 : LOGICAL :: explicit, unique_spline
115 : REAL(KIND=dp) :: min_eps_spline_allowed
116 : TYPE(input_info_type), POINTER :: inp_info
117 : TYPE(section_vals_type), POINTER :: tmp_section, tmp_section2
118 :
119 : INTEGER::i
120 :
121 2637 : NULLIFY (tmp_section, tmp_section2)
122 2637 : inp_info => ff_type%inp_info
123 2637 : CALL section_vals_val_get(ff_section, "PARMTYPE", i_val=ff_type%ff_type)
124 2637 : CALL section_vals_val_get(ff_section, "EI_SCALE14", r_val=ff_type%ei_scale14)
125 2637 : CALL section_vals_val_get(ff_section, "VDW_SCALE14", r_val=ff_type%vdw_scale14)
126 2637 : CALL section_vals_val_get(ff_section, "SPLINE%RCUT_NB", r_val=ff_type%rcut_nb)
127 2637 : CALL section_vals_val_get(ff_section, "SPLINE%R0_NB", r_val=ff_type%rlow_nb)
128 2637 : CALL section_vals_val_get(ff_section, "SPLINE%EPS_SPLINE", r_val=ff_type%eps_spline)
129 2637 : CALL section_vals_val_get(ff_section, "SPLINE%EMAX_SPLINE", r_val=ff_type%emax_spline)
130 2637 : CALL section_vals_val_get(ff_section, "SPLINE%EMAX_ACCURACY", r_val=ff_type%max_energy)
131 2637 : CALL section_vals_val_get(ff_section, "SPLINE%NPOINTS", i_val=ff_type%npoints)
132 2637 : CALL section_vals_val_get(ff_section, "IGNORE_MISSING_CRITICAL_PARAMS", l_val=ff_type%ignore_missing_critical)
133 2637 : CPASSERT(ff_type%max_energy <= ff_type%emax_spline)
134 : ! Read the parameter file name only if the force field type requires it..
135 3547 : SELECT CASE (ff_type%ff_type)
136 : CASE (do_ff_charmm, do_ff_amber, do_ff_g96, do_ff_g87)
137 910 : CALL section_vals_val_get(ff_section, "PARM_FILE_NAME", c_val=ff_type%ff_file_name)
138 :
139 910 : IF (TRIM(ff_type%ff_file_name) == "") THEN
140 0 : CPABORT("Force Field Parameter's filename is empty! Please check your input file.")
141 : END IF
142 :
143 : CASE (do_ff_undef)
144 : ! Do Nothing
145 : CASE DEFAULT
146 2637 : CPABORT("Force field type not implemented")
147 : END SELECT
148 : ! Numerical Accuracy:
149 : ! the factors here should depend on the energy and on the shape of each potential mapped
150 : ! with splines. this would make everything un-necessarily complicated. Let's just be safe
151 : ! and assume that we cannot achieve an accuracy on the spline 2 orders of magnitude more
152 : ! than the smallest representable number (taking into account also the max_energy for the
153 : ! spline generation
154 2637 : min_eps_spline_allowed = 20.0_dp*MAX(ff_type%max_energy, 10.0_dp)*EPSILON(0.0_dp)
155 2637 : IF (ff_type%eps_spline < min_eps_spline_allowed) THEN
156 : CALL cp_warn(__LOCATION__, &
157 : "Requested spline accuracy ("//TRIM(cp_to_string(ff_type%eps_spline))//" ) "// &
158 : "is smaller than the minimum value allowed ("//TRIM(cp_to_string(min_eps_spline_allowed))// &
159 : " ) with the present machine precision ("//TRIM(cp_to_string(EPSILON(0.0_dp)))//" ). "// &
160 0 : "New EPS_SPLINE value ("//TRIM(cp_to_string(min_eps_spline_allowed))//" ). ")
161 0 : ff_type%eps_spline = min_eps_spline_allowed
162 : END IF
163 2637 : CALL section_vals_val_get(ff_section, "SHIFT_CUTOFF", l_val=ff_type%shift_cutoff)
164 2637 : CALL section_vals_val_get(ff_section, "SPLINE%UNIQUE_SPLINE", l_val=unique_spline)
165 : ! Single spline
166 2637 : potential_single_allocation = no_potential_single_allocation
167 2637 : IF (unique_spline) potential_single_allocation = do_potential_single_allocation
168 :
169 2637 : CALL section_vals_val_get(ff_section, "MULTIPLE_POTENTIAL", l_val=ff_type%multiple_potential)
170 2637 : CALL section_vals_val_get(ff_section, "DO_NONBONDED", l_val=ff_type%do_nonbonded)
171 2637 : CALL section_vals_val_get(ff_section, "DO_ELECTROSTATICS", l_val=ff_type%do_electrostatics)
172 2637 : tmp_section => section_vals_get_subs_vals(ff_section, "NONBONDED")
173 2637 : CALL section_vals_get(tmp_section, explicit=explicit)
174 2637 : IF (explicit .AND. ff_type%do_nonbonded) THEN
175 1727 : tmp_section2 => section_vals_get_subs_vals(tmp_section, "LENNARD-JONES")
176 1727 : CALL section_vals_get(tmp_section2, explicit=explicit, n_repetition=nlj)
177 1727 : ntot = 0
178 1727 : IF (explicit) THEN
179 978 : CALL pair_potential_reallocate(inp_info%nonbonded, 1, ntot + nlj, lj_charmm=.TRUE.)
180 978 : CALL read_lj_section(inp_info%nonbonded, tmp_section2, ntot)
181 : END IF
182 :
183 1727 : tmp_section2 => section_vals_get_subs_vals(tmp_section, "WILLIAMS")
184 1727 : CALL section_vals_get(tmp_section2, explicit=explicit, n_repetition=nwl)
185 1727 : ntot = nlj
186 1727 : IF (explicit) THEN
187 359 : CALL pair_potential_reallocate(inp_info%nonbonded, 1, ntot + nwl, williams=.TRUE.)
188 359 : CALL read_wl_section(inp_info%nonbonded, tmp_section2, ntot)
189 : END IF
190 :
191 1727 : tmp_section2 => section_vals_get_subs_vals(tmp_section, "EAM")
192 1727 : CALL section_vals_get(tmp_section2, explicit=explicit, n_repetition=neam)
193 1727 : ntot = nlj + nwl
194 1727 : IF (explicit) THEN
195 12 : CALL pair_potential_reallocate(inp_info%nonbonded, 1, ntot + neam, eam=.TRUE.)
196 12 : CALL read_eam_section(inp_info%nonbonded, tmp_section2, ntot, para_env, mm_section)
197 : END IF
198 :
199 1727 : tmp_section2 => section_vals_get_subs_vals(tmp_section, "GOODWIN")
200 1727 : CALL section_vals_get(tmp_section2, explicit=explicit, n_repetition=ngd)
201 1727 : ntot = nlj + nwl + neam
202 1727 : IF (explicit) THEN
203 0 : CALL pair_potential_reallocate(inp_info%nonbonded, 1, ntot + ngd, goodwin=.TRUE.)
204 0 : CALL read_gd_section(inp_info%nonbonded, tmp_section2, ntot)
205 : END IF
206 :
207 1727 : tmp_section2 => section_vals_get_subs_vals(tmp_section, "IPBV")
208 1727 : CALL section_vals_get(tmp_section2, explicit=explicit, n_repetition=nipbv)
209 1727 : ntot = nlj + nwl + neam + ngd
210 1727 : IF (explicit) THEN
211 16 : CALL pair_potential_reallocate(inp_info%nonbonded, 1, ntot + nipbv, ipbv=.TRUE.)
212 16 : CALL read_ipbv_section(inp_info%nonbonded, tmp_section2, ntot)
213 : END IF
214 :
215 1727 : tmp_section2 => section_vals_get_subs_vals(tmp_section, "BMHFT")
216 1727 : CALL section_vals_get(tmp_section2, explicit=explicit, n_repetition=nbmhft)
217 1727 : ntot = nlj + nwl + neam + ngd + nipbv
218 1727 : IF (explicit) THEN
219 4 : CALL pair_potential_reallocate(inp_info%nonbonded, 1, ntot + nbmhft, bmhft=.TRUE.)
220 4 : CALL read_bmhft_section(inp_info%nonbonded, tmp_section2, ntot)
221 : END IF
222 :
223 1727 : tmp_section2 => section_vals_get_subs_vals(tmp_section, "BMHFTD")
224 1727 : CALL section_vals_get(tmp_section2, explicit=explicit, n_repetition=nbmhftd)
225 1727 : ntot = nlj + nwl + neam + ngd + nipbv + nbmhft
226 1727 : IF (explicit) THEN
227 18 : CALL pair_potential_reallocate(inp_info%nonbonded, 1, ntot + nbmhftd, bmhftd=.TRUE.)
228 18 : CALL read_bmhftd_section(inp_info%nonbonded, tmp_section2, ntot)
229 : END IF
230 :
231 1727 : tmp_section2 => section_vals_get_subs_vals(tmp_section, "BUCK4RANGES")
232 1727 : CALL section_vals_get(tmp_section2, explicit=explicit, n_repetition=nb4)
233 1727 : ntot = nlj + nwl + neam + ngd + nipbv + nbmhft + nbmhftd
234 1727 : IF (explicit) THEN
235 252 : CALL pair_potential_reallocate(inp_info%nonbonded, 1, ntot + nb4, buck4r=.TRUE.)
236 252 : CALL read_b4_section(inp_info%nonbonded, tmp_section2, ntot)
237 : END IF
238 :
239 1727 : tmp_section2 => section_vals_get_subs_vals(tmp_section, "BUCKMORSE")
240 1727 : CALL section_vals_get(tmp_section2, explicit=explicit, n_repetition=nbm)
241 1727 : ntot = nlj + nwl + neam + ngd + nipbv + nbmhft + nbmhftd + nb4
242 1727 : IF (explicit) THEN
243 6 : CALL pair_potential_reallocate(inp_info%nonbonded, 1, ntot + nbm, buckmo=.TRUE.)
244 6 : CALL read_bm_section(inp_info%nonbonded, tmp_section2, ntot)
245 : END IF
246 :
247 1727 : tmp_section2 => section_vals_get_subs_vals(tmp_section, "GENPOT")
248 1727 : CALL section_vals_get(tmp_section2, explicit=explicit, n_repetition=ngp)
249 1727 : ntot = nlj + nwl + neam + ngd + nipbv + nbmhft + nbmhftd + nb4 + nbm
250 1727 : IF (explicit) THEN
251 312 : CALL pair_potential_reallocate(inp_info%nonbonded, 1, ntot + ngp, gp=.TRUE.)
252 312 : CALL read_gp_section(inp_info%nonbonded, tmp_section2, ntot)
253 : END IF
254 1727 : tmp_section2 => section_vals_get_subs_vals(tmp_section, "TERSOFF")
255 1727 : CALL section_vals_get(tmp_section2, explicit=explicit, n_repetition=ntersoff)
256 1727 : ntot = nlj + nwl + neam + ngd + nipbv + nbmhft + nbmhftd + nb4 + nbm + ngp
257 1727 : IF (explicit) THEN
258 38 : CALL pair_potential_reallocate(inp_info%nonbonded, 1, ntot + ntersoff, tersoff=.TRUE.)
259 38 : CALL read_tersoff_section(inp_info%nonbonded, tmp_section2, ntot, tmp_section2)
260 : END IF
261 :
262 1727 : tmp_section2 => section_vals_get_subs_vals(tmp_section, "GAL19")
263 1727 : CALL section_vals_get(tmp_section2, explicit=explicit, n_repetition=ngal)
264 1727 : ntot = nlj + nwl + neam + ngd + nipbv + nbmhft + nbmhftd + nb4 + nbm + ngp + ntersoff
265 1727 : IF (explicit) THEN
266 1 : CALL pair_potential_reallocate(inp_info%nonbonded, 1, ntot + ngal, gal=.TRUE.)
267 1 : CALL read_gal_section(inp_info%nonbonded, tmp_section2, ntot, tmp_section2)
268 : END IF
269 :
270 1727 : tmp_section2 => section_vals_get_subs_vals(tmp_section, "GAL21")
271 1727 : CALL section_vals_get(tmp_section2, explicit=explicit, n_repetition=ngal21)
272 1727 : ntot = nlj + nwl + neam + ngd + nipbv + nbmhft + nbmhftd + nb4 + nbm + ngp + ntersoff + ngal
273 1727 : IF (explicit) THEN
274 1 : CALL pair_potential_reallocate(inp_info%nonbonded, 1, ntot + ngal21, gal21=.TRUE.)
275 1 : CALL read_gal21_section(inp_info%nonbonded, tmp_section2, ntot, tmp_section2)
276 : END IF
277 :
278 1727 : tmp_section2 => section_vals_get_subs_vals(tmp_section, "SIEPMANN")
279 1727 : CALL section_vals_get(tmp_section2, explicit=explicit, n_repetition=nsiepmann)
280 1727 : ntot = nlj + nwl + neam + ngd + nipbv + nbmhft + nbmhftd + nb4 + nbm + ngp + ntersoff + ngal + ngal21
281 1727 : IF (explicit) THEN
282 5 : CALL pair_potential_reallocate(inp_info%nonbonded, 1, ntot + nsiepmann, siepmann=.TRUE.)
283 5 : CALL read_siepmann_section(inp_info%nonbonded, tmp_section2, ntot, tmp_section2)
284 : END IF
285 :
286 1727 : tmp_section2 => section_vals_get_subs_vals(tmp_section, "nequip")
287 1727 : CALL section_vals_get(tmp_section2, explicit=explicit, n_repetition=nnequip)
288 : ntot = nlj + nwl + neam + ngd + nipbv + nbmhft + nbmhftd + nb4 + nbm + ngp + ntersoff + &
289 1727 : ngal + ngal21 + nsiepmann
290 1727 : IF (explicit) THEN
291 : ! avoid repeating the nequip section for each pair
292 4 : CALL section_vals_val_get(tmp_section2, "ATOMS", c_vals=atm_names)
293 4 : nnequip = nnequip - 1 + SIZE(atm_names) + (SIZE(atm_names)*SIZE(atm_names) - SIZE(atm_names))/2
294 4 : CALL pair_potential_reallocate(inp_info%nonbonded, 1, ntot + nnequip, nequip=.TRUE.)
295 4 : CALL read_nequip_section(inp_info%nonbonded, tmp_section2, ntot)
296 : END IF
297 :
298 1727 : tmp_section2 => section_vals_get_subs_vals(tmp_section, "TABPOT")
299 1727 : CALL section_vals_get(tmp_section2, explicit=explicit, n_repetition=ntab)
300 : ntot = nlj + nwl + neam + ngd + nipbv + nbmhft + nbmhftd + nb4 + nbm + ngp + ntersoff + &
301 1727 : ngal + ngal21 + nsiepmann + nnequip
302 1727 : IF (explicit) THEN
303 8 : CALL pair_potential_reallocate(inp_info%nonbonded, 1, ntot + ntab, tab=.TRUE.)
304 8 : CALL read_tabpot_section(inp_info%nonbonded, tmp_section2, ntot, para_env, mm_section)
305 : END IF
306 :
307 1727 : tmp_section2 => section_vals_get_subs_vals(tmp_section, "DEEPMD")
308 1727 : CALL section_vals_get(tmp_section2, explicit=explicit, n_repetition=ndeepmd)
309 : ntot = nlj + nwl + neam + ngd + nipbv + nbmhft + nbmhftd + nb4 + nbm + ngp + ntersoff + &
310 1727 : ngal + ngal21 + nsiepmann + nnequip + ntab
311 1727 : IF (explicit) THEN
312 : ! avoid repeating the deepmd section for each pair
313 2 : CALL section_vals_val_get(tmp_section2, "ATOMS", c_vals=atm_names)
314 2 : ndeepmd = ndeepmd - 1 + SIZE(atm_names) + (SIZE(atm_names)*SIZE(atm_names) - SIZE(atm_names))/2
315 2 : CALL pair_potential_reallocate(inp_info%nonbonded, 1, ntot + ndeepmd, deepmd=.TRUE.)
316 2 : CALL read_deepmd_section(inp_info%nonbonded, tmp_section2, ntot)
317 : END IF
318 :
319 1727 : tmp_section2 => section_vals_get_subs_vals(tmp_section, "ACE")
320 1727 : CALL section_vals_get(tmp_section2, explicit=explicit, n_repetition=nace)
321 : ntot = nlj + nwl + neam + ngd + nipbv + nbmhft + nbmhftd + nb4 + nbm + ngp + ntersoff + &
322 1727 : ngal + ngal21 + nsiepmann + nnequip + ntab + ndeepmd
323 1727 : IF (explicit) THEN
324 : ! avoid repeating the ace section for each pair
325 6 : CALL section_vals_val_get(tmp_section2, "ATOMS", c_vals=atm_names)
326 6 : nace = nace - 1 + SIZE(atm_names) + (SIZE(atm_names)*SIZE(atm_names) - SIZE(atm_names))/2
327 6 : CALL pair_potential_reallocate(inp_info%nonbonded, 1, ntot + nace, ace=.TRUE.)
328 6 : CALL read_ace_section(inp_info%nonbonded, tmp_section2, ntot)
329 : END IF
330 :
331 1727 : tmp_section2 => section_vals_get_subs_vals(tmp_section, "MACE")
332 1727 : CALL section_vals_get(tmp_section2, explicit=explicit, n_repetition=nmace)
333 : ntot = nlj + nwl + neam + ngd + nipbv + nbmhft + nbmhftd + nb4 + nbm + ngp + ntersoff + &
334 1727 : ngal + ngal21 + nsiepmann + nnequip + ntab + ndeepmd + nace
335 1727 : IF (explicit) THEN
336 : ! avoid repeating the mace section for each pair
337 2 : CALL section_vals_val_get(tmp_section2, "ATOMS", c_vals=atm_names)
338 2 : nmace = nmace - 1 + SIZE(atm_names) + (SIZE(atm_names)*SIZE(atm_names) - SIZE(atm_names))/2
339 : ! MACE reuses the nequip_pot_type storage (set%nequip), hence nequip=.TRUE. here
340 2 : CALL pair_potential_reallocate(inp_info%nonbonded, 1, ntot + nmace, nequip=.TRUE.)
341 2 : CALL read_mace_section(inp_info%nonbonded, tmp_section2, ntot)
342 : END IF
343 :
344 : END IF
345 :
346 2637 : tmp_section => section_vals_get_subs_vals(ff_section, "NONBONDED14")
347 2637 : CALL section_vals_get(tmp_section, explicit=explicit)
348 2637 : IF (explicit .AND. ff_type%do_nonbonded) THEN
349 276 : tmp_section2 => section_vals_get_subs_vals(tmp_section, "LENNARD-JONES")
350 276 : CALL section_vals_get(tmp_section2, explicit=explicit, n_repetition=nlj)
351 276 : ntot = 0
352 276 : IF (explicit) THEN
353 12 : CALL pair_potential_reallocate(inp_info%nonbonded14, 1, ntot + nlj, lj_charmm=.TRUE.)
354 12 : CALL read_lj_section(inp_info%nonbonded14, tmp_section2, ntot)
355 : END IF
356 276 : tmp_section2 => section_vals_get_subs_vals(tmp_section, "WILLIAMS")
357 276 : CALL section_vals_get(tmp_section2, explicit=explicit, n_repetition=nwl)
358 276 : ntot = nlj
359 276 : IF (explicit) THEN
360 0 : CALL pair_potential_reallocate(inp_info%nonbonded14, 1, ntot + nwl, williams=.TRUE.)
361 0 : CALL read_wl_section(inp_info%nonbonded14, tmp_section2, ntot)
362 : END IF
363 276 : tmp_section2 => section_vals_get_subs_vals(tmp_section, "GOODWIN")
364 276 : CALL section_vals_get(tmp_section2, explicit=explicit, n_repetition=ngd)
365 276 : ntot = nlj + nwl
366 276 : IF (explicit) THEN
367 0 : CALL pair_potential_reallocate(inp_info%nonbonded14, 1, ntot + ngd, goodwin=.TRUE.)
368 0 : CALL read_gd_section(inp_info%nonbonded14, tmp_section2, ntot)
369 : END IF
370 276 : tmp_section2 => section_vals_get_subs_vals(tmp_section, "GENPOT")
371 276 : CALL section_vals_get(tmp_section2, explicit=explicit, n_repetition=ngp)
372 276 : ntot = nlj + nwl + ngd
373 276 : IF (explicit) THEN
374 264 : CALL pair_potential_reallocate(inp_info%nonbonded14, 1, ntot + ngp, gp=.TRUE.)
375 264 : CALL read_gp_section(inp_info%nonbonded14, tmp_section2, ntot)
376 : END IF
377 : END IF
378 :
379 2637 : tmp_section => section_vals_get_subs_vals(ff_section, "CHARGE")
380 2637 : CALL section_vals_get(tmp_section, explicit=explicit, n_repetition=nchg)
381 2637 : IF (explicit) THEN
382 2067 : ntot = 0
383 2067 : CALL reallocate(inp_info%charge_atm, 1, nchg)
384 2067 : CALL reallocate(inp_info%charge, 1, nchg)
385 2067 : CALL read_chrg_section(inp_info%charge_atm, inp_info%charge, tmp_section, ntot)
386 : END IF
387 2637 : tmp_section => section_vals_get_subs_vals(ff_section, "DIPOLE")
388 2637 : CALL section_vals_get(tmp_section, explicit=explicit, n_repetition=nchg)
389 2637 : IF (explicit) THEN
390 34 : ntot = 0
391 34 : CALL reallocate(inp_info%apol_atm, 1, nchg)
392 34 : CALL reallocate(inp_info%apol, 1, nchg)
393 : CALL read_apol_section(inp_info%apol_atm, inp_info%apol, inp_info%damping_list, &
394 34 : tmp_section, ntot)
395 : END IF
396 2637 : tmp_section => section_vals_get_subs_vals(ff_section, "QUADRUPOLE")
397 2637 : CALL section_vals_get(tmp_section, explicit=explicit, n_repetition=nchg)
398 2637 : IF (explicit) THEN
399 0 : ntot = 0
400 0 : CALL reallocate(inp_info%cpol_atm, 1, nchg)
401 0 : CALL reallocate(inp_info%cpol, 1, nchg)
402 0 : CALL read_cpol_section(inp_info%cpol_atm, inp_info%cpol, tmp_section, ntot)
403 : END IF
404 2637 : tmp_section => section_vals_get_subs_vals(ff_section, "SHELL")
405 2637 : CALL section_vals_get(tmp_section, explicit=explicit, n_repetition=nshell)
406 2637 : IF (explicit) THEN
407 252 : ntot = 0
408 252 : CALL shell_p_create(inp_info%shell_list, nshell)
409 252 : CALL read_shell_section(inp_info%shell_list, tmp_section, ntot)
410 : END IF
411 :
412 2637 : tmp_section => section_vals_get_subs_vals(ff_section, "BOND")
413 2637 : CALL section_vals_get(tmp_section, explicit=explicit, n_repetition=nbonds)
414 2637 : IF (explicit) THEN
415 975 : ntot = 0
416 975 : CALL reallocate(inp_info%bond_kind, 1, nbonds)
417 975 : CALL reallocate(inp_info%bond_a, 1, nbonds)
418 975 : CALL reallocate(inp_info%bond_b, 1, nbonds)
419 975 : CALL reallocate(inp_info%bond_k, 1, 3, 1, nbonds)
420 975 : CALL reallocate(inp_info%bond_r0, 1, nbonds)
421 975 : CALL reallocate(inp_info%bond_cs, 1, nbonds)
422 : CALL read_bonds_section(inp_info%bond_kind, inp_info%bond_a, inp_info%bond_b, inp_info%bond_k, &
423 975 : inp_info%bond_r0, inp_info%bond_cs, tmp_section, ntot)
424 : END IF
425 2637 : tmp_section => section_vals_get_subs_vals(ff_section, "BEND")
426 2637 : CALL section_vals_get(tmp_section, explicit=explicit, n_repetition=nbends)
427 2637 : IF (explicit) THEN
428 939 : ntot = 0
429 939 : CALL reallocate(inp_info%bend_kind, 1, nbends)
430 939 : CALL reallocate(inp_info%bend_a, 1, nbends)
431 939 : CALL reallocate(inp_info%bend_b, 1, nbends)
432 939 : CALL reallocate(inp_info%bend_c, 1, nbends)
433 939 : CALL reallocate(inp_info%bend_k, 1, nbends)
434 939 : CALL reallocate(inp_info%bend_theta0, 1, nbends)
435 939 : CALL reallocate(inp_info%bend_cb, 1, nbends)
436 939 : CALL reallocate(inp_info%bend_r012, 1, nbends)
437 939 : CALL reallocate(inp_info%bend_r032, 1, nbends)
438 939 : CALL reallocate(inp_info%bend_kbs12, 1, nbends)
439 939 : CALL reallocate(inp_info%bend_kbs32, 1, nbends)
440 939 : CALL reallocate(inp_info%bend_kss, 1, nbends)
441 939 : IF (ASSOCIATED(inp_info%bend_legendre)) THEN
442 0 : DO i = 1, SIZE(inp_info%bend_legendre)
443 0 : IF (ASSOCIATED(inp_info%bend_legendre(i)%coeffs)) THEN
444 0 : DEALLOCATE (inp_info%bend_legendre(i)%coeffs)
445 0 : NULLIFY (inp_info%bend_legendre(i)%coeffs)
446 : END IF
447 : END DO
448 0 : DEALLOCATE (inp_info%bend_legendre)
449 : NULLIFY (inp_info%bend_legendre)
450 : END IF
451 4938 : ALLOCATE (inp_info%bend_legendre(1:nbends))
452 3060 : DO i = 1, SIZE(inp_info%bend_legendre(1:nbends))
453 2121 : NULLIFY (inp_info%bend_legendre(i)%coeffs)
454 3060 : inp_info%bend_legendre(i)%order = 0
455 : END DO
456 : CALL read_bends_section(inp_info%bend_kind, inp_info%bend_a, inp_info%bend_b, inp_info%bend_c, &
457 : inp_info%bend_k, inp_info%bend_theta0, inp_info%bend_cb, &
458 : inp_info%bend_r012, inp_info%bend_r032, inp_info%bend_kbs12, &
459 : inp_info%bend_kbs32, inp_info%bend_kss, &
460 939 : inp_info%bend_legendre, tmp_section, ntot)
461 : END IF
462 2637 : tmp_section => section_vals_get_subs_vals(ff_section, "BEND")
463 2637 : CALL section_vals_get(tmp_section, explicit=explicit, n_repetition=nubs)
464 2637 : IF (explicit) THEN
465 939 : ntot = 0
466 939 : CALL reallocate(inp_info%ub_kind, 1, nubs)
467 939 : CALL reallocate(inp_info%ub_a, 1, nubs)
468 939 : CALL reallocate(inp_info%ub_b, 1, nubs)
469 939 : CALL reallocate(inp_info%ub_c, 1, nubs)
470 939 : CALL reallocate(inp_info%ub_k, 1, 3, 1, nubs)
471 939 : CALL reallocate(inp_info%ub_r0, 1, nubs)
472 : CALL read_ubs_section(inp_info%ub_kind, inp_info%ub_a, inp_info%ub_b, inp_info%ub_c, &
473 939 : inp_info%ub_k, inp_info%ub_r0, tmp_section, ntot)
474 : END IF
475 2637 : tmp_section => section_vals_get_subs_vals(ff_section, "TORSION")
476 2637 : CALL section_vals_get(tmp_section, explicit=explicit, n_repetition=ntors)
477 2637 : IF (explicit) THEN
478 6 : ntot = 0
479 6 : CALL reallocate(inp_info%torsion_kind, 1, ntors)
480 6 : CALL reallocate(inp_info%torsion_a, 1, ntors)
481 6 : CALL reallocate(inp_info%torsion_b, 1, ntors)
482 6 : CALL reallocate(inp_info%torsion_c, 1, ntors)
483 6 : CALL reallocate(inp_info%torsion_d, 1, ntors)
484 6 : CALL reallocate(inp_info%torsion_k, 1, ntors)
485 6 : CALL reallocate(inp_info%torsion_m, 1, ntors)
486 6 : CALL reallocate(inp_info%torsion_phi0, 1, ntors)
487 : CALL read_torsions_section(inp_info%torsion_kind, inp_info%torsion_a, inp_info%torsion_b, &
488 : inp_info%torsion_c, inp_info%torsion_d, inp_info%torsion_k, inp_info%torsion_phi0, &
489 6 : inp_info%torsion_m, tmp_section, ntot)
490 : END IF
491 :
492 2637 : tmp_section => section_vals_get_subs_vals(ff_section, "IMPROPER")
493 2637 : CALL section_vals_get(tmp_section, explicit=explicit, n_repetition=nimpr)
494 2637 : IF (explicit) THEN
495 8 : ntot = 0
496 8 : CALL reallocate(inp_info%impr_kind, 1, nimpr)
497 8 : CALL reallocate(inp_info%impr_a, 1, nimpr)
498 8 : CALL reallocate(inp_info%impr_b, 1, nimpr)
499 8 : CALL reallocate(inp_info%impr_c, 1, nimpr)
500 8 : CALL reallocate(inp_info%impr_d, 1, nimpr)
501 8 : CALL reallocate(inp_info%impr_k, 1, nimpr)
502 8 : CALL reallocate(inp_info%impr_phi0, 1, nimpr)
503 : CALL read_improper_section(inp_info%impr_kind, inp_info%impr_a, inp_info%impr_b, &
504 : inp_info%impr_c, inp_info%impr_d, inp_info%impr_k, inp_info%impr_phi0, &
505 8 : tmp_section, ntot)
506 : END IF
507 :
508 2637 : tmp_section => section_vals_get_subs_vals(ff_section, "OPBEND")
509 2637 : CALL section_vals_get(tmp_section, explicit=explicit, n_repetition=nopbend)
510 2637 : IF (explicit) THEN
511 2 : ntot = 0
512 2 : CALL reallocate(inp_info%opbend_kind, 1, nopbend)
513 2 : CALL reallocate(inp_info%opbend_a, 1, nopbend)
514 2 : CALL reallocate(inp_info%opbend_b, 1, nopbend)
515 2 : CALL reallocate(inp_info%opbend_c, 1, nopbend)
516 2 : CALL reallocate(inp_info%opbend_d, 1, nopbend)
517 2 : CALL reallocate(inp_info%opbend_k, 1, nopbend)
518 2 : CALL reallocate(inp_info%opbend_phi0, 1, nopbend)
519 : CALL read_opbend_section(inp_info%opbend_kind, inp_info%opbend_a, inp_info%opbend_b, &
520 : inp_info%opbend_c, inp_info%opbend_d, inp_info%opbend_k, inp_info%opbend_phi0, &
521 2 : tmp_section, ntot)
522 : END IF
523 :
524 2637 : END SUBROUTINE read_force_field_section1
525 :
526 : ! **************************************************************************************************
527 : !> \brief Set up of the IPBV force fields
528 : !> \param at1 ...
529 : !> \param at2 ...
530 : !> \param ipbv ...
531 : !> \author teo
532 : ! **************************************************************************************************
533 48 : SUBROUTINE set_IPBV_ff(at1, at2, ipbv)
534 : CHARACTER(LEN=*), INTENT(IN) :: at1, at2
535 : TYPE(ipbv_pot_type), POINTER :: ipbv
536 :
537 48 : IF ((at1(1:1) == 'O') .AND. (at2(1:1) == 'O')) THEN
538 16 : ipbv%rcore = 0.9_dp ! a.u.
539 16 : ipbv%m = -1.2226442563398141E+11_dp ! Kelvin/a.u.
540 16 : ipbv%b = 1.1791292385486696E+11_dp ! Hartree
541 :
542 : ! Hartree*a.u.^2
543 16 : ipbv%a(2) = 4.786380682394_dp
544 16 : ipbv%a(3) = -1543.407053545_dp
545 16 : ipbv%a(4) = 88783.31188529_dp
546 16 : ipbv%a(5) = -2361200.155376_dp
547 16 : ipbv%a(6) = 35940504.84679_dp
548 16 : ipbv%a(7) = -339762743.6358_dp
549 16 : ipbv%a(8) = 2043874926.466_dp
550 16 : ipbv%a(9) = -7654856796.383_dp
551 16 : ipbv%a(10) = 16195251405.65_dp
552 16 : ipbv%a(11) = -13140392992.18_dp
553 16 : ipbv%a(12) = -9285572894.245_dp
554 16 : ipbv%a(13) = 8756947519.029_dp
555 16 : ipbv%a(14) = 15793297761.67_dp
556 16 : ipbv%a(15) = 12917180227.21_dp
557 32 : ELSE IF (((at1(1:1) == 'O') .AND. (at2(1:1) == 'H')) .OR. &
558 : ((at1(1:1) == 'H') .AND. (at2(1:1) == 'O'))) THEN
559 :
560 16 : ipbv%rcore = 2.95_dp ! a.u.
561 :
562 16 : ipbv%m = -0.004025691139759147_dp ! Hartree/a.u.
563 16 : ipbv%b = -2.193731138097428_dp ! Hartree
564 : ! Hartree*a.u.^2
565 16 : ipbv%a(2) = -195.7716013277_dp
566 16 : ipbv%a(3) = 15343.78613395_dp
567 16 : ipbv%a(4) = -530864.4586516_dp
568 16 : ipbv%a(5) = 10707934.39058_dp
569 16 : ipbv%a(6) = -140099704.7890_dp
570 16 : ipbv%a(7) = 1250943273.785_dp
571 16 : ipbv%a(8) = -7795458330.676_dp
572 16 : ipbv%a(9) = 33955897217.31_dp
573 16 : ipbv%a(10) = -101135640744.0_dp
574 16 : ipbv%a(11) = 193107995718.7_dp
575 16 : ipbv%a(12) = -193440560940.0_dp
576 16 : ipbv%a(13) = -4224406093.918E0_dp
577 16 : ipbv%a(14) = 217192386506.5E0_dp
578 16 : ipbv%a(15) = -157581228915.5_dp
579 16 : ELSE IF ((at1(1:1) == 'H') .AND. (at2(1:1) == 'H')) THEN
580 16 : ipbv%rcore = 3.165_dp ! a.u.
581 16 : ipbv%m = 0.002639704108787555_dp ! Hartree/a.u.
582 16 : ipbv%b = -0.2735482611857583_dp ! Hartree
583 : ! Hartree*a.u.^2
584 16 : ipbv%a(2) = -26.29456010782_dp
585 16 : ipbv%a(3) = 2373.352548248_dp
586 16 : ipbv%a(4) = -93880.43551360_dp
587 16 : ipbv%a(5) = 2154624.884809_dp
588 16 : ipbv%a(6) = -31965151.34955_dp
589 16 : ipbv%a(7) = 322781785.3278_dp
590 16 : ipbv%a(8) = -2271097368.668_dp
591 16 : ipbv%a(9) = 11169163192.90_dp
592 16 : ipbv%a(10) = -37684457778.47_dp
593 16 : ipbv%a(11) = 82562104256.03_dp
594 16 : ipbv%a(12) = -100510435213.4_dp
595 16 : ipbv%a(13) = 24570342714.65E0_dp
596 16 : ipbv%a(14) = 88766181532.94E0_dp
597 16 : ipbv%a(15) = -79705131323.98_dp
598 : ELSE
599 0 : CPABORT("IPBV only for WATER")
600 : END IF
601 48 : END SUBROUTINE set_IPBV_ff
602 :
603 : ! **************************************************************************************************
604 : !> \brief Set up of the BMHFT force fields
605 : !> \param at1 ...
606 : !> \param at2 ...
607 : !> \param ft ...
608 : !> \author teo
609 : ! **************************************************************************************************
610 12 : SUBROUTINE set_BMHFT_ff(at1, at2, ft)
611 : CHARACTER(LEN=*), INTENT(IN) :: at1, at2
612 : TYPE(ft_pot_type), POINTER :: ft
613 :
614 12 : ft%b = cp_unit_to_cp2k(3.1545_dp, "angstrom^-1")
615 12 : IF ((at1(1:2) == 'NA') .AND. (at2(1:2) == 'NA')) THEN
616 4 : ft%a = cp_unit_to_cp2k(424.097_dp, "eV")
617 4 : ft%c = cp_unit_to_cp2k(1.05_dp, "eV*angstrom^6")
618 4 : ft%d = cp_unit_to_cp2k(0.499_dp, "eV*angstrom^8")
619 8 : ELSE IF (((at1(1:2) == 'NA') .AND. (at2(1:2) == 'CL')) .OR. &
620 : ((at1(1:2) == 'CL') .AND. (at2(1:2) == 'NA'))) THEN
621 :
622 4 : ft%a = cp_unit_to_cp2k(1256.31_dp, "eV")
623 4 : ft%c = cp_unit_to_cp2k(7.00_dp, "eV*angstrom^6")
624 4 : ft%d = cp_unit_to_cp2k(8.676_dp, "eV*angstrom^8")
625 4 : ELSE IF ((at1(1:2) == 'CL') .AND. (at2(1:2) == 'CL')) THEN
626 4 : ft%a = cp_unit_to_cp2k(3488.998_dp, "eV")
627 4 : ft%c = cp_unit_to_cp2k(72.50_dp, "eV*angstrom^6")
628 4 : ft%d = cp_unit_to_cp2k(145.427_dp, "eV*angstrom^8")
629 : ELSE
630 0 : CPABORT("BMHFT only for NaCl")
631 : END IF
632 :
633 12 : END SUBROUTINE set_BMHFT_ff
634 :
635 : ! **************************************************************************************************
636 : !> \brief Set up of the BMHFTD force fields
637 : !> \author Mathieu Salanne 05.2010
638 : ! **************************************************************************************************
639 0 : SUBROUTINE set_BMHFTD_ff()
640 :
641 0 : CPABORT("No default parameters present for BMHFTD")
642 :
643 0 : END SUBROUTINE set_BMHFTD_ff
644 :
645 : ! **************************************************************************************************
646 : !> \brief Reads the EAM section
647 : !> \param nonbonded ...
648 : !> \param section ...
649 : !> \param start ...
650 : !> \param para_env ...
651 : !> \param mm_section ...
652 : !> \author teo
653 : ! **************************************************************************************************
654 12 : SUBROUTINE read_eam_section(nonbonded, section, start, para_env, mm_section)
655 : TYPE(pair_potential_p_type), POINTER :: nonbonded
656 : TYPE(section_vals_type), POINTER :: section
657 : INTEGER, INTENT(IN) :: start
658 : TYPE(mp_para_env_type), POINTER :: para_env
659 : TYPE(section_vals_type), POINTER :: mm_section
660 :
661 : CHARACTER(LEN=default_string_length), &
662 12 : DIMENSION(:), POINTER :: atm_names
663 : INTEGER :: isec, n_items
664 :
665 12 : CALL section_vals_get(section, n_repetition=n_items)
666 32 : DO isec = 1, n_items
667 20 : CALL section_vals_val_get(section, "ATOMS", i_rep_section=isec, c_vals=atm_names)
668 :
669 40 : nonbonded%pot(start + isec)%pot%type = ea_type
670 20 : nonbonded%pot(start + isec)%pot%at1 = atm_names(1)
671 20 : nonbonded%pot(start + isec)%pot%at2 = atm_names(2)
672 20 : CALL uppercase(nonbonded%pot(start + isec)%pot%at1)
673 20 : CALL uppercase(nonbonded%pot(start + isec)%pot%at2)
674 : CALL section_vals_val_get(section, "PARM_FILE_NAME", i_rep_section=isec, &
675 20 : c_val=nonbonded%pot(start + isec)%pot%set(1)%eam%eam_file_name)
676 20 : CALL read_eam_data(nonbonded%pot(start + isec)%pot%set(1)%eam, para_env, mm_section)
677 32 : nonbonded%pot(start + isec)%pot%rcutsq = nonbonded%pot(start + isec)%pot%set(1)%eam%acutal**2
678 : END DO
679 12 : END SUBROUTINE read_eam_section
680 :
681 : ! **************************************************************************************
682 : !> \brief Reads the ACE section
683 : !> \param nonbonded ...
684 : !> \param section ...
685 : !> \param start ...
686 : ! **************************************************************************************************
687 6 : SUBROUTINE read_ace_section(nonbonded, section, start)
688 : TYPE(pair_potential_p_type), POINTER :: nonbonded
689 : TYPE(section_vals_type), POINTER :: section
690 : INTEGER, INTENT(IN) :: start
691 :
692 6 : CHARACTER(LEN=2), ALLOCATABLE, DIMENSION(:) :: ace_atype_symbol
693 : CHARACTER(LEN=default_path_length) :: ace_filename
694 : CHARACTER(LEN=default_string_length) :: ace_file_name
695 : CHARACTER(LEN=default_string_length), &
696 6 : DIMENSION(:), POINTER :: atm_names
697 : INTEGER :: ace_ntype, isec, jsec, n_items
698 6 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: rcutall
699 6 : TYPE(ace_model_type) :: model
700 :
701 : n_items = 1
702 6 : isec = 1
703 6 : n_items = isec*n_items
704 6 : CALL section_vals_val_get(section, "ATOMS", c_vals=atm_names)
705 :
706 6 : ace_ntype = SIZE(atm_names)
707 30 : ALLOCATE (ace_atype_symbol(ace_ntype), rcutall(ace_ntype, ace_ntype))
708 18 : DO isec = 1, ace_ntype
709 18 : ace_atype_symbol(isec) = atm_names(isec) (1:2)
710 : END DO
711 6 : CALL section_vals_val_get(section, "POT_FILE_NAME", c_val=ace_file_name)
712 :
713 6 : ace_filename = discover_file(ace_file_name)
714 :
715 : #if defined(__ACE)
716 : ! need ace_model_initialize() here somewhere to get rcut
717 : CALL ace_model_initialize(ntypec=ace_ntype, symbolc=ace_atype_symbol, &
718 6 : fname=TRIM(ace_filename), rcutc=rcutall, model=model)
719 : #else
720 : CPABORT("CP2K was compiled without ACE library.")
721 : #endif
722 :
723 18 : DO isec = 1, SIZE(atm_names)
724 36 : DO jsec = isec, SIZE(atm_names)
725 36 : nonbonded%pot(start + n_items)%pot%type = ace_type
726 18 : nonbonded%pot(start + n_items)%pot%at1 = atm_names(isec)
727 18 : nonbonded%pot(start + n_items)%pot%at2 = atm_names(jsec)
728 18 : CALL uppercase(nonbonded%pot(start + n_items)%pot%at1)
729 18 : CALL uppercase(nonbonded%pot(start + n_items)%pot%at2)
730 :
731 18 : nonbonded%pot(start + n_items)%pot%set(1)%ace%ace_file_name = ace_filename
732 18 : nonbonded%pot(start + n_items)%pot%set(1)%ace%atom_ace_type = isec
733 18 : nonbonded%pot(start + n_items)%pot%set(1)%ace%model = model
734 :
735 : !using rcutall(isec,jsec) instead of maxval(rcutall) TODO check that
736 : !it shouldn't be jsec,isec?
737 18 : nonbonded%pot(start + n_items)%pot%rcutsq = cp_unit_to_cp2k(rcutall(isec, jsec), "angstrom")**2
738 :
739 30 : n_items = n_items + 1
740 : END DO
741 : END DO
742 12 : END SUBROUTINE read_ace_section
743 :
744 : ! **************************************************************************************
745 : !> \brief Reads the DEEPMD section
746 : !> \param nonbonded ...
747 : !> \param section ...
748 : !> \param start ...
749 : !> \author teo
750 : ! **************************************************************************************************
751 2 : SUBROUTINE read_deepmd_section(nonbonded, section, start)
752 : TYPE(pair_potential_p_type), POINTER :: nonbonded
753 : TYPE(section_vals_type), POINTER :: section
754 : INTEGER, INTENT(IN) :: start
755 :
756 : CHARACTER(LEN=default_string_length) :: deepmd_file_name
757 : CHARACTER(LEN=default_string_length), &
758 2 : DIMENSION(:), POINTER :: atm_names
759 : INTEGER :: isec, jsec, n_items
760 2 : INTEGER, DIMENSION(:), POINTER :: atm_deepmd_types
761 :
762 : n_items = 1
763 2 : isec = 1
764 2 : n_items = isec*n_items
765 2 : CALL section_vals_val_get(section, "ATOMS", c_vals=atm_names)
766 2 : CALL section_vals_val_get(section, "ATOMS_DEEPMD_TYPE", i_vals=atm_deepmd_types)
767 2 : CALL section_vals_val_get(section, "POT_FILE_NAME", c_val=deepmd_file_name)
768 :
769 6 : DO isec = 1, SIZE(atm_names)
770 12 : DO jsec = isec, SIZE(atm_names)
771 12 : nonbonded%pot(start + n_items)%pot%type = deepmd_type
772 6 : nonbonded%pot(start + n_items)%pot%at1 = atm_names(isec)
773 6 : nonbonded%pot(start + n_items)%pot%at2 = atm_names(jsec)
774 6 : CALL uppercase(nonbonded%pot(start + n_items)%pot%at1)
775 6 : CALL uppercase(nonbonded%pot(start + n_items)%pot%at2)
776 :
777 6 : nonbonded%pot(start + n_items)%pot%set(1)%deepmd%deepmd_file_name = discover_file(deepmd_file_name)
778 6 : nonbonded%pot(start + n_items)%pot%set(1)%deepmd%atom_deepmd_type = atm_deepmd_types(isec)
779 6 : nonbonded%pot(start + n_items)%pot%rcutsq = 0.0_dp
780 10 : n_items = n_items + 1
781 : END DO
782 : END DO
783 2 : END SUBROUTINE read_deepmd_section
784 :
785 : ! **************************************************************************************************
786 : !> \brief Reads the NEQUIP section
787 : !> \param nonbonded ...
788 : !> \param section ...
789 : !> \param start ...
790 : !> \author Gabriele Tocci
791 : ! **************************************************************************************************
792 4 : SUBROUTINE read_nequip_section(nonbonded, section, start)
793 : TYPE(pair_potential_p_type), POINTER :: nonbonded
794 : TYPE(section_vals_type), POINTER :: section
795 : INTEGER, INTENT(IN) :: start
796 :
797 : CHARACTER(LEN=default_string_length) :: model_type_str, pot_file_name, &
798 : unit_energy, unit_forces, unit_length
799 : CHARACTER(LEN=default_string_length), &
800 4 : DIMENSION(:), POINTER :: atm_names
801 : INTEGER :: chosen_type, isec, jsec, n_items
802 4 : TYPE(nequip_pot_type) :: nequip
803 :
804 : n_items = 1
805 4 : isec = 1
806 4 : n_items = isec*n_items
807 4 : CALL section_vals_val_get(section, "ATOMS", c_vals=atm_names)
808 4 : CALL section_vals_val_get(section, "POT_FILE_NAME", c_val=pot_file_name)
809 4 : CALL section_vals_val_get(section, "UNIT_LENGTH", c_val=unit_length)
810 4 : CALL section_vals_val_get(section, "UNIT_ENERGY", c_val=unit_energy)
811 4 : CALL section_vals_val_get(section, "UNIT_FORCES", c_val=unit_forces)
812 4 : CALL section_vals_val_get(section, "MODEL_TYPE", c_val=model_type_str)
813 4 : CALL uppercase(model_type_str)
814 :
815 4 : IF (TRIM(model_type_str) == "ALLEGRO") THEN
816 : chosen_type = allegro_type
817 2 : ELSE IF (TRIM(model_type_str) == "NEQUIP") THEN
818 : chosen_type = nequip_type
819 : ELSE
820 : CALL cp_abort(__LOCATION__, &
821 0 : "Unknown MODEL_TYPE: "//TRIM(model_type_str)//". Use NEQUIP or ALLEGRO.")
822 : END IF
823 :
824 4 : nequip%pot_file_name = discover_file(pot_file_name)
825 4 : nequip%unit_length = unit_length
826 4 : nequip%unit_forces = unit_forces
827 4 : nequip%unit_energy = unit_energy
828 4 : CALL read_nequip_data(nequip)
829 4 : CALL check_cp2k_atom_names_in_torch(atm_names, nequip%type_names_torch)
830 :
831 12 : DO isec = 1, SIZE(atm_names)
832 24 : DO jsec = isec, SIZE(atm_names)
833 24 : nonbonded%pot(start + n_items)%pot%type = chosen_type
834 12 : nonbonded%pot(start + n_items)%pot%at1 = atm_names(isec)
835 12 : nonbonded%pot(start + n_items)%pot%at2 = atm_names(jsec)
836 12 : CALL uppercase(nonbonded%pot(start + n_items)%pot%at1)
837 12 : CALL uppercase(nonbonded%pot(start + n_items)%pot%at2)
838 12 : nonbonded%pot(start + n_items)%pot%set(1)%nequip = nequip
839 12 : nonbonded%pot(start + n_items)%pot%rcutsq = nequip%rcutsq
840 20 : n_items = n_items + 1
841 : END DO
842 : END DO
843 :
844 8 : END SUBROUTINE read_nequip_section
845 :
846 : ! **************************************************************************************************
847 : !> \brief Reads the MACE section
848 : !> \param nonbonded ...
849 : !> \param section ...
850 : !> \param start ...
851 : !> \author Xinyue Sun
852 : ! **************************************************************************************************
853 2 : SUBROUTINE read_mace_section(nonbonded, section, start)
854 : TYPE(pair_potential_p_type), POINTER :: nonbonded
855 : TYPE(section_vals_type), POINTER :: section
856 : INTEGER, INTENT(IN) :: start
857 :
858 : CHARACTER(LEN=default_string_length) :: pot_file_name
859 : CHARACTER(LEN=default_string_length), &
860 2 : DIMENSION(:), POINTER :: atm_names
861 : INTEGER :: isec, jsec, n_items
862 2 : TYPE(nequip_pot_type) :: mace
863 :
864 : n_items = 1
865 2 : isec = 1
866 2 : n_items = isec*n_items
867 2 : CALL section_vals_val_get(section, "ATOMS", c_vals=atm_names)
868 2 : CALL section_vals_val_get(section, "POT_FILE_NAME", c_val=pot_file_name)
869 :
870 2 : mace%pot_file_name = discover_file(pot_file_name)
871 : ! MACE models use standardized units: Angstrom, eV and eV/Angstrom
872 2 : mace%unit_length = "angstrom"
873 2 : mace%unit_energy = "eV"
874 2 : mace%unit_forces = "eV/Angstrom"
875 : ! MACE models are exported to speak the same metadata/tensor dialect as NequIP
876 2 : CALL read_nequip_data(mace)
877 2 : CALL check_cp2k_atom_names_in_torch(atm_names, mace%type_names_torch)
878 :
879 4 : DO isec = 1, SIZE(atm_names)
880 6 : DO jsec = isec, SIZE(atm_names)
881 4 : nonbonded%pot(start + n_items)%pot%type = mace_type
882 2 : nonbonded%pot(start + n_items)%pot%at1 = atm_names(isec)
883 2 : nonbonded%pot(start + n_items)%pot%at2 = atm_names(jsec)
884 2 : CALL uppercase(nonbonded%pot(start + n_items)%pot%at1)
885 2 : CALL uppercase(nonbonded%pot(start + n_items)%pot%at2)
886 2 : nonbonded%pot(start + n_items)%pot%set(1)%nequip = mace
887 2 : nonbonded%pot(start + n_items)%pot%rcutsq = mace%rcutsq
888 4 : n_items = n_items + 1
889 : END DO
890 : END DO
891 :
892 4 : END SUBROUTINE read_mace_section
893 :
894 : ! **************************************************************************************************
895 : !> \brief Reads the LJ section
896 : !> \param nonbonded ...
897 : !> \param section ...
898 : !> \param start ...
899 : !> \author teo
900 : ! **************************************************************************************************
901 1008 : SUBROUTINE read_lj_section(nonbonded, section, start)
902 : TYPE(pair_potential_p_type), POINTER :: nonbonded
903 : TYPE(section_vals_type), POINTER :: section
904 : INTEGER, INTENT(IN) :: start
905 :
906 : CHARACTER(LEN=default_string_length), &
907 1008 : DIMENSION(:), POINTER :: atm_names
908 : INTEGER :: isec, n_items, n_rep
909 : REAL(KIND=dp) :: epsilon, rcut, sigma
910 :
911 1008 : CALL section_vals_get(section, n_repetition=n_items)
912 4798 : DO isec = 1, n_items
913 3790 : CALL section_vals_val_get(section, "ATOMS", i_rep_section=isec, c_vals=atm_names)
914 3790 : CALL section_vals_val_get(section, "EPSILON", i_rep_section=isec, r_val=epsilon)
915 3790 : CALL section_vals_val_get(section, "SIGMA", i_rep_section=isec, r_val=sigma)
916 3790 : CALL section_vals_val_get(section, "RCUT", i_rep_section=isec, r_val=rcut)
917 :
918 7580 : nonbonded%pot(start + isec)%pot%type = lj_charmm_type
919 3790 : nonbonded%pot(start + isec)%pot%at1 = atm_names(1)
920 3790 : nonbonded%pot(start + isec)%pot%at2 = atm_names(2)
921 3790 : CALL uppercase(nonbonded%pot(start + isec)%pot%at1)
922 3790 : CALL uppercase(nonbonded%pot(start + isec)%pot%at2)
923 3790 : nonbonded%pot(start + isec)%pot%set(1)%lj%epsilon = epsilon
924 3790 : nonbonded%pot(start + isec)%pot%set(1)%lj%sigma6 = sigma**6
925 3790 : nonbonded%pot(start + isec)%pot%set(1)%lj%sigma12 = sigma**12
926 3790 : nonbonded%pot(start + isec)%pot%rcutsq = rcut*rcut
927 : !
928 3790 : CALL section_vals_val_get(section, "RMIN", i_rep_section=isec, n_rep_val=n_rep)
929 3790 : IF (n_rep == 1) CALL section_vals_val_get(section, "RMIN", i_rep_section=isec, &
930 2 : r_val=nonbonded%pot(start + isec)%pot%set(1)%rmin)
931 3790 : CALL section_vals_val_get(section, "RMAX", i_rep_section=isec, n_rep_val=n_rep)
932 3790 : IF (n_rep == 1) CALL section_vals_val_get(section, "RMAX", i_rep_section=isec, &
933 12380 : r_val=nonbonded%pot(start + isec)%pot%set(1)%rmax)
934 : END DO
935 1008 : END SUBROUTINE read_lj_section
936 :
937 : ! **************************************************************************************************
938 : !> \brief Reads the WILLIAMS section
939 : !> \param nonbonded ...
940 : !> \param section ...
941 : !> \param start ...
942 : !> \author teo
943 : ! **************************************************************************************************
944 361 : SUBROUTINE read_wl_section(nonbonded, section, start)
945 : TYPE(pair_potential_p_type), POINTER :: nonbonded
946 : TYPE(section_vals_type), POINTER :: section
947 : INTEGER, INTENT(IN) :: start
948 :
949 : CHARACTER(LEN=default_string_length), &
950 361 : DIMENSION(:), POINTER :: atm_names
951 : INTEGER :: isec, n_items, n_rep
952 : REAL(KIND=dp) :: a, b, c, rcut
953 :
954 361 : CALL section_vals_get(section, n_repetition=n_items)
955 1340 : DO isec = 1, n_items
956 979 : CALL section_vals_val_get(section, "ATOMS", i_rep_section=isec, c_vals=atm_names)
957 979 : CALL section_vals_val_get(section, "A", i_rep_section=isec, r_val=a)
958 979 : CALL section_vals_val_get(section, "B", i_rep_section=isec, r_val=b)
959 979 : CALL section_vals_val_get(section, "C", i_rep_section=isec, r_val=c)
960 979 : CALL section_vals_val_get(section, "RCUT", i_rep_section=isec, r_val=rcut)
961 :
962 1958 : nonbonded%pot(start + isec)%pot%type = wl_type
963 979 : nonbonded%pot(start + isec)%pot%at1 = atm_names(1)
964 979 : nonbonded%pot(start + isec)%pot%at2 = atm_names(2)
965 979 : CALL uppercase(nonbonded%pot(start + isec)%pot%at1)
966 979 : CALL uppercase(nonbonded%pot(start + isec)%pot%at2)
967 979 : nonbonded%pot(start + isec)%pot%set(1)%willis%a = a
968 979 : nonbonded%pot(start + isec)%pot%set(1)%willis%b = b
969 979 : nonbonded%pot(start + isec)%pot%set(1)%willis%c = c
970 979 : nonbonded%pot(start + isec)%pot%rcutsq = rcut*rcut
971 : !
972 979 : CALL section_vals_val_get(section, "RMIN", i_rep_section=isec, n_rep_val=n_rep)
973 979 : IF (n_rep == 1) CALL section_vals_val_get(section, "RMIN", i_rep_section=isec, &
974 0 : r_val=nonbonded%pot(start + isec)%pot%set(1)%rmin)
975 979 : CALL section_vals_val_get(section, "RMAX", i_rep_section=isec, n_rep_val=n_rep)
976 979 : IF (n_rep == 1) CALL section_vals_val_get(section, "RMAX", i_rep_section=isec, &
977 3298 : r_val=nonbonded%pot(start + isec)%pot%set(1)%rmax)
978 : END DO
979 361 : END SUBROUTINE read_wl_section
980 :
981 : ! **************************************************************************************************
982 : !> \brief Reads the GOODWIN section
983 : !> \param nonbonded ...
984 : !> \param section ...
985 : !> \param start ...
986 : !> \author teo
987 : ! **************************************************************************************************
988 0 : SUBROUTINE read_gd_section(nonbonded, section, start)
989 : TYPE(pair_potential_p_type), POINTER :: nonbonded
990 : TYPE(section_vals_type), POINTER :: section
991 : INTEGER, INTENT(IN) :: start
992 :
993 : CHARACTER(LEN=default_string_length), &
994 0 : DIMENSION(:), POINTER :: atm_names
995 : INTEGER :: isec, m, mc, n_items, n_rep
996 : REAL(KIND=dp) :: d, dc, rcut, vr0
997 :
998 0 : CALL section_vals_get(section, n_repetition=n_items)
999 0 : DO isec = 1, n_items
1000 0 : CALL section_vals_val_get(section, "ATOMS", i_rep_section=isec, c_vals=atm_names)
1001 0 : CALL section_vals_val_get(section, "VR0", i_rep_section=isec, r_val=vr0)
1002 0 : CALL section_vals_val_get(section, "D", i_rep_section=isec, r_val=d)
1003 0 : CALL section_vals_val_get(section, "DC", i_rep_section=isec, r_val=dc)
1004 0 : CALL section_vals_val_get(section, "M", i_rep_section=isec, i_val=m)
1005 0 : CALL section_vals_val_get(section, "MC", i_rep_section=isec, i_val=mc)
1006 0 : CALL section_vals_val_get(section, "RCUT", i_rep_section=isec, r_val=rcut)
1007 :
1008 0 : nonbonded%pot(start + isec)%pot%type = gw_type
1009 0 : nonbonded%pot(start + isec)%pot%at1 = atm_names(1)
1010 0 : nonbonded%pot(start + isec)%pot%at2 = atm_names(2)
1011 0 : CALL uppercase(nonbonded%pot(start + isec)%pot%at1)
1012 0 : CALL uppercase(nonbonded%pot(start + isec)%pot%at2)
1013 0 : nonbonded%pot(start + isec)%pot%set(1)%goodwin%vr0 = vr0
1014 0 : nonbonded%pot(start + isec)%pot%set(1)%goodwin%d = d
1015 0 : nonbonded%pot(start + isec)%pot%set(1)%goodwin%dc = dc
1016 0 : nonbonded%pot(start + isec)%pot%set(1)%goodwin%m = m
1017 0 : nonbonded%pot(start + isec)%pot%set(1)%goodwin%mc = mc
1018 0 : nonbonded%pot(start + isec)%pot%rcutsq = rcut*rcut
1019 : !
1020 0 : CALL section_vals_val_get(section, "RMIN", i_rep_section=isec, n_rep_val=n_rep)
1021 0 : IF (n_rep == 1) CALL section_vals_val_get(section, "RMIN", i_rep_section=isec, &
1022 0 : r_val=nonbonded%pot(start + isec)%pot%set(1)%rmin)
1023 0 : CALL section_vals_val_get(section, "RMAX", i_rep_section=isec, n_rep_val=n_rep)
1024 0 : IF (n_rep == 1) CALL section_vals_val_get(section, "RMAX", i_rep_section=isec, &
1025 0 : r_val=nonbonded%pot(start + isec)%pot%set(1)%rmax)
1026 : END DO
1027 0 : END SUBROUTINE read_gd_section
1028 :
1029 : ! **************************************************************************************************
1030 : !> \brief Reads the IPBV section
1031 : !> \param nonbonded ...
1032 : !> \param section ...
1033 : !> \param start ...
1034 : !> \author teo
1035 : ! **************************************************************************************************
1036 16 : SUBROUTINE read_ipbv_section(nonbonded, section, start)
1037 : TYPE(pair_potential_p_type), POINTER :: nonbonded
1038 : TYPE(section_vals_type), POINTER :: section
1039 : INTEGER, INTENT(IN) :: start
1040 :
1041 : CHARACTER(LEN=default_string_length), &
1042 16 : DIMENSION(:), POINTER :: atm_names
1043 : INTEGER :: isec, n_items, n_rep
1044 : REAL(KIND=dp) :: rcut
1045 :
1046 16 : CALL section_vals_get(section, n_repetition=n_items)
1047 64 : DO isec = 1, n_items
1048 48 : CALL section_vals_val_get(section, "ATOMS", i_rep_section=isec, c_vals=atm_names)
1049 96 : nonbonded%pot(start + isec)%pot%type = ip_type
1050 48 : nonbonded%pot(start + isec)%pot%at1 = atm_names(1)
1051 48 : nonbonded%pot(start + isec)%pot%at2 = atm_names(2)
1052 48 : CALL uppercase(nonbonded%pot(start + isec)%pot%at1)
1053 48 : CALL uppercase(nonbonded%pot(start + isec)%pot%at2)
1054 : CALL set_IPBV_ff(nonbonded%pot(start + isec)%pot%at1, nonbonded%pot(start + isec)%pot%at2, &
1055 48 : nonbonded%pot(start + isec)%pot%set(1)%ipbv)
1056 48 : CALL section_vals_val_get(section, "RCUT", i_rep_section=isec, r_val=rcut)
1057 48 : nonbonded%pot(start + isec)%pot%rcutsq = rcut**2
1058 : !
1059 48 : CALL section_vals_val_get(section, "RMIN", i_rep_section=isec, n_rep_val=n_rep)
1060 48 : IF (n_rep == 1) CALL section_vals_val_get(section, "RMIN", i_rep_section=isec, &
1061 0 : r_val=nonbonded%pot(start + isec)%pot%set(1)%rmin)
1062 48 : CALL section_vals_val_get(section, "RMAX", i_rep_section=isec, n_rep_val=n_rep)
1063 48 : IF (n_rep == 1) CALL section_vals_val_get(section, "RMAX", i_rep_section=isec, &
1064 112 : r_val=nonbonded%pot(start + isec)%pot%set(1)%rmax)
1065 : END DO
1066 16 : END SUBROUTINE read_ipbv_section
1067 :
1068 : ! **************************************************************************************************
1069 : !> \brief Reads the BMHFT section
1070 : !> \param nonbonded ...
1071 : !> \param section ...
1072 : !> \param start ...
1073 : !> \author teo
1074 : ! **************************************************************************************************
1075 4 : SUBROUTINE read_bmhft_section(nonbonded, section, start)
1076 : TYPE(pair_potential_p_type), POINTER :: nonbonded
1077 : TYPE(section_vals_type), POINTER :: section
1078 : INTEGER, INTENT(IN) :: start
1079 :
1080 : CHARACTER(LEN=default_string_length), DIMENSION(2) :: map_atoms
1081 : CHARACTER(LEN=default_string_length), &
1082 4 : DIMENSION(:), POINTER :: atm_names
1083 : INTEGER :: i, isec, n_items, n_rep
1084 : REAL(KIND=dp) :: rcut
1085 :
1086 4 : CALL section_vals_get(section, n_repetition=n_items)
1087 16 : DO isec = 1, n_items
1088 12 : CALL cite_reference(Tosi1964a)
1089 12 : CALL cite_reference(Tosi1964b)
1090 12 : CALL section_vals_val_get(section, "ATOMS", i_rep_section=isec, c_vals=atm_names)
1091 24 : nonbonded%pot(start + isec)%pot%type = ft_type
1092 12 : nonbonded%pot(start + isec)%pot%at1 = atm_names(1)
1093 12 : nonbonded%pot(start + isec)%pot%at2 = atm_names(2)
1094 12 : CALL uppercase(nonbonded%pot(start + isec)%pot%at1)
1095 12 : CALL uppercase(nonbonded%pot(start + isec)%pot%at2)
1096 :
1097 12 : CALL section_vals_val_get(section, "A", i_rep_section=isec, n_rep_val=i)
1098 12 : IF (i == 1) THEN
1099 : CALL section_vals_val_get(section, "A", i_rep_section=isec, &
1100 0 : r_val=nonbonded%pot(start + isec)%pot%set(1)%ft%a)
1101 : CALL section_vals_val_get(section, "B", i_rep_section=isec, &
1102 0 : r_val=nonbonded%pot(start + isec)%pot%set(1)%ft%b)
1103 : CALL section_vals_val_get(section, "C", i_rep_section=isec, &
1104 0 : r_val=nonbonded%pot(start + isec)%pot%set(1)%ft%c)
1105 : CALL section_vals_val_get(section, "D", i_rep_section=isec, &
1106 0 : r_val=nonbonded%pot(start + isec)%pot%set(1)%ft%d)
1107 : ELSE
1108 12 : CALL section_vals_val_get(section, "MAP_ATOMS", i_rep_section=isec, c_vals=atm_names)
1109 36 : map_atoms = atm_names
1110 12 : CALL uppercase(map_atoms(1))
1111 12 : CALL uppercase(map_atoms(2))
1112 12 : CALL set_BMHFT_ff(map_atoms(1), map_atoms(2), nonbonded%pot(start + isec)%pot%set(1)%ft)
1113 : END IF
1114 12 : CALL section_vals_val_get(section, "RCUT", i_rep_section=isec, r_val=rcut)
1115 12 : nonbonded%pot(start + isec)%pot%rcutsq = rcut**2
1116 : !
1117 12 : CALL section_vals_val_get(section, "RMIN", i_rep_section=isec, n_rep_val=n_rep)
1118 12 : IF (n_rep == 1) CALL section_vals_val_get(section, "RMIN", i_rep_section=isec, &
1119 0 : r_val=nonbonded%pot(start + isec)%pot%set(1)%rmin)
1120 12 : CALL section_vals_val_get(section, "RMAX", i_rep_section=isec, n_rep_val=n_rep)
1121 12 : IF (n_rep == 1) CALL section_vals_val_get(section, "RMAX", i_rep_section=isec, &
1122 40 : r_val=nonbonded%pot(start + isec)%pot%set(1)%rmax)
1123 : END DO
1124 4 : END SUBROUTINE read_bmhft_section
1125 :
1126 : ! **************************************************************************************************
1127 : !> \brief Reads the BMHFTD section
1128 : !> \param nonbonded ...
1129 : !> \param section ...
1130 : !> \param start ...
1131 : !> \author Mathieu Salanne 05.2010
1132 : ! **************************************************************************************************
1133 18 : SUBROUTINE read_bmhftd_section(nonbonded, section, start)
1134 : TYPE(pair_potential_p_type), POINTER :: nonbonded
1135 : TYPE(section_vals_type), POINTER :: section
1136 : INTEGER, INTENT(IN) :: start
1137 :
1138 : CHARACTER(LEN=default_string_length), DIMENSION(2) :: map_atoms
1139 : CHARACTER(LEN=default_string_length), &
1140 18 : DIMENSION(:), POINTER :: atm_names
1141 : INTEGER :: i, isec, n_items, n_rep
1142 : REAL(KIND=dp) :: rcut
1143 18 : REAL(KIND=dp), DIMENSION(:), POINTER :: bd_vals
1144 :
1145 18 : NULLIFY (bd_vals)
1146 :
1147 18 : CALL section_vals_get(section, n_repetition=n_items)
1148 :
1149 84 : DO isec = 1, n_items
1150 66 : CALL cite_reference(Tosi1964a)
1151 66 : CALL cite_reference(Tosi1964b)
1152 66 : CALL section_vals_val_get(section, "ATOMS", i_rep_section=isec, c_vals=atm_names)
1153 132 : nonbonded%pot(start + isec)%pot%type = ftd_type
1154 66 : nonbonded%pot(start + isec)%pot%at1 = atm_names(1)
1155 66 : nonbonded%pot(start + isec)%pot%at2 = atm_names(2)
1156 66 : CALL uppercase(nonbonded%pot(start + isec)%pot%at1)
1157 66 : CALL uppercase(nonbonded%pot(start + isec)%pot%at2)
1158 :
1159 66 : CALL section_vals_val_get(section, "A", i_rep_section=isec, n_rep_val=i)
1160 66 : IF (i == 1) THEN
1161 : CALL section_vals_val_get(section, "A", i_rep_section=isec, &
1162 66 : r_val=nonbonded%pot(start + isec)%pot%set(1)%ftd%a)
1163 : CALL section_vals_val_get(section, "B", i_rep_section=isec, &
1164 66 : r_val=nonbonded%pot(start + isec)%pot%set(1)%ftd%b)
1165 : CALL section_vals_val_get(section, "C", i_rep_section=isec, &
1166 66 : r_val=nonbonded%pot(start + isec)%pot%set(1)%ftd%c)
1167 : CALL section_vals_val_get(section, "D", i_rep_section=isec, &
1168 66 : r_val=nonbonded%pot(start + isec)%pot%set(1)%ftd%d)
1169 66 : CALL section_vals_val_get(section, "BD", i_rep_section=isec, r_vals=bd_vals)
1170 66 : IF (ASSOCIATED(bd_vals)) THEN
1171 66 : SELECT CASE (SIZE(bd_vals))
1172 : CASE (0)
1173 0 : CPABORT("No values specified for parameter BD in section &BMHFTD")
1174 : CASE (1)
1175 186 : nonbonded%pot(start + isec)%pot%set(1)%ftd%bd(1:2) = bd_vals(1)
1176 : CASE (2)
1177 24 : nonbonded%pot(start + isec)%pot%set(1)%ftd%bd(1:2) = bd_vals(1:2)
1178 : CASE DEFAULT
1179 66 : CPABORT("Too many values specified for parameter BD in section &BMHFTD")
1180 : END SELECT
1181 : ELSE
1182 0 : CPABORT("Parameter BD in section &BMHFTD was not specified")
1183 : END IF
1184 : ELSE
1185 0 : CALL section_vals_val_get(section, "MAP_ATOMS", i_rep_section=isec, c_vals=atm_names)
1186 0 : map_atoms = atm_names
1187 0 : CALL uppercase(map_atoms(1))
1188 0 : CALL uppercase(map_atoms(2))
1189 0 : CALL set_BMHFTD_ff()
1190 : END IF
1191 66 : CALL section_vals_val_get(section, "RCUT", i_rep_section=isec, r_val=rcut)
1192 66 : nonbonded%pot(start + isec)%pot%rcutsq = rcut**2
1193 : !
1194 66 : CALL section_vals_val_get(section, "RMIN", i_rep_section=isec, n_rep_val=n_rep)
1195 66 : IF (n_rep == 1) CALL section_vals_val_get(section, "RMIN", i_rep_section=isec, &
1196 0 : r_val=nonbonded%pot(start + isec)%pot%set(1)%rmin)
1197 66 : CALL section_vals_val_get(section, "RMAX", i_rep_section=isec, n_rep_val=n_rep)
1198 66 : IF (n_rep == 1) CALL section_vals_val_get(section, "RMAX", i_rep_section=isec, &
1199 216 : r_val=nonbonded%pot(start + isec)%pot%set(1)%rmax)
1200 : END DO
1201 18 : END SUBROUTINE read_bmhftd_section
1202 :
1203 : ! **************************************************************************************************
1204 : !> \brief Reads the Buckingham 4 Ranges potential section
1205 : !> \param nonbonded ...
1206 : !> \param section ...
1207 : !> \param start ...
1208 : !> \par History
1209 : !> MK (11.11.2010): Automatic fit of the (default) polynomial coefficients
1210 : !> \author MI,MK
1211 : ! **************************************************************************************************
1212 252 : SUBROUTINE read_b4_section(nonbonded, section, start)
1213 :
1214 : TYPE(pair_potential_p_type), POINTER :: nonbonded
1215 : TYPE(section_vals_type), POINTER :: section
1216 : INTEGER, INTENT(IN) :: start
1217 :
1218 : CHARACTER(LEN=default_string_length), &
1219 252 : DIMENSION(:), POINTER :: atm_names
1220 : INTEGER :: i, ir, isec, n_items, n_rep, np1, np2
1221 : LOGICAL :: explicit_poly1, explicit_poly2
1222 : REAL(KIND=dp) :: a, b, c, eval_error, r1, r2, r3, rcut
1223 : REAL(KIND=dp), DIMENSION(10) :: v, x
1224 : REAL(KIND=dp), DIMENSION(10, 10) :: p, p_inv
1225 252 : REAL(KIND=dp), DIMENSION(:), POINTER :: coeff1, coeff2, list
1226 :
1227 252 : NULLIFY (coeff1)
1228 252 : NULLIFY (coeff2)
1229 :
1230 252 : CALL section_vals_get(section, n_repetition=n_items)
1231 :
1232 504 : DO isec = 1, n_items
1233 252 : CALL section_vals_val_get(section, "ATOMS", i_rep_section=isec, c_vals=atm_names)
1234 252 : CALL section_vals_val_get(section, "A", i_rep_section=isec, r_val=a)
1235 252 : CALL section_vals_val_get(section, "B", i_rep_section=isec, r_val=b)
1236 252 : CALL section_vals_val_get(section, "C", i_rep_section=isec, r_val=c)
1237 252 : CALL section_vals_val_get(section, "R1", i_rep_section=isec, r_val=r1)
1238 252 : CALL section_vals_val_get(section, "R2", i_rep_section=isec, r_val=r2)
1239 252 : CALL section_vals_val_get(section, "R3", i_rep_section=isec, r_val=r3)
1240 252 : CALL section_vals_val_get(section, "POLY1", explicit=explicit_poly1, n_rep_val=n_rep)
1241 : ! Check if polynomial coefficients were specified for range 2 and 3 explicitly
1242 252 : IF (explicit_poly1) THEN
1243 84 : np1 = 0
1244 168 : DO ir = 1, n_rep
1245 84 : NULLIFY (list)
1246 84 : CALL section_vals_val_get(section, "POLY1", i_rep_val=ir, r_vals=list)
1247 168 : IF (ASSOCIATED(list)) THEN
1248 84 : CALL reallocate(coeff1, 0, np1 + SIZE(list) - 1)
1249 588 : DO i = 1, SIZE(list)
1250 588 : coeff1(i + np1 - 1) = list(i)
1251 : END DO
1252 84 : np1 = np1 + SIZE(list)
1253 : END IF
1254 : END DO
1255 : END IF
1256 252 : CALL section_vals_val_get(section, "POLY2", explicit=explicit_poly2, n_rep_val=n_rep)
1257 252 : IF (explicit_poly2) THEN
1258 84 : np2 = 0
1259 168 : DO ir = 1, n_rep
1260 84 : NULLIFY (list)
1261 84 : CALL section_vals_val_get(section, "POLY2", i_rep_val=ir, r_vals=list)
1262 168 : IF (ASSOCIATED(list)) THEN
1263 84 : CALL reallocate(coeff2, 0, np2 + SIZE(list) - 1)
1264 420 : DO i = 1, SIZE(list)
1265 420 : coeff2(i + np2 - 1) = list(i)
1266 : END DO
1267 84 : np2 = np2 + SIZE(list)
1268 : END IF
1269 : END DO
1270 : END IF
1271 : ! Default is a 5th/3rd-order polynomial fit
1272 252 : IF ((.NOT. explicit_poly1) .OR. (.NOT. explicit_poly2)) THEN
1273 : ! Build matrix p and vector v to calculate the polynomial coefficients
1274 : ! in the vector x from p*x = v
1275 168 : p(:, :) = 0.0_dp
1276 : ! Row 1: Match the 5th-order polynomial and the potential at r1
1277 168 : p(1, 1) = 1.0_dp
1278 1008 : DO i = 2, 6
1279 1008 : p(1, i) = p(1, i - 1)*r1
1280 : END DO
1281 : ! Row 2: Match the first derivatives of the 5th-order polynomial and the potential at r1
1282 1008 : DO i = 2, 6
1283 1008 : p(2, i) = REAL(i - 1, KIND=dp)*p(1, i - 1)
1284 : END DO
1285 : ! Row 3: Match the second derivatives of the 5th-order polynomial and the potential at r1
1286 840 : DO i = 3, 6
1287 840 : p(3, i) = REAL(i - 1, KIND=dp)*p(2, i - 1)
1288 : END DO
1289 : ! Row 4: Match the 5th-order and the 3rd-order polynomials at r2
1290 168 : p(4, 1) = 1.0_dp
1291 1008 : DO i = 2, 6
1292 1008 : p(4, i) = p(4, i - 1)*r2
1293 : END DO
1294 168 : p(4, 7) = -1.0_dp
1295 672 : DO i = 8, 10
1296 672 : p(4, i) = p(4, i - 1)*r2
1297 : END DO
1298 : ! Row 5: Match the first derivatives of the 5th-order and the 3rd-order polynomials at r2
1299 1008 : DO i = 2, 6
1300 1008 : p(5, i) = REAL(i - 1, KIND=dp)*p(4, i - 1)
1301 : END DO
1302 672 : DO i = 8, 10
1303 672 : p(5, i) = REAL(i - 7, KIND=dp)*p(4, i - 1)
1304 : END DO
1305 : ! Row 6: Match the second derivatives of the 5th-order and the 3rd-order polynomials at r2
1306 840 : DO i = 3, 6
1307 840 : p(6, i) = REAL(i - 1, KIND=dp)*p(5, i - 1)
1308 : END DO
1309 504 : DO i = 9, 10
1310 504 : p(6, i) = REAL(i - 7, KIND=dp)*p(5, i - 1)
1311 : END DO
1312 : ! Row 7: Minimum at r2, ie. the first derivative of the 3rd-order polynomial has to be zero at r2
1313 672 : DO i = 8, 10
1314 672 : p(7, i) = -p(5, i)
1315 : END DO
1316 : ! Row 8: Match the 3rd-order polynomial and the potential at r3
1317 168 : p(8, 7) = 1.0_dp
1318 672 : DO i = 8, 10
1319 672 : p(8, i) = p(8, i - 1)*r3
1320 : END DO
1321 : ! Row 9: Match the first derivatives of the 3rd-order polynomial and the potential at r3
1322 672 : DO i = 8, 10
1323 672 : p(9, i) = REAL(i - 7, KIND=dp)*p(8, i - 1)
1324 : END DO
1325 : ! Row 10: Match the second derivatives of the 3rd-order polynomial and the potential at r3
1326 504 : DO i = 9, 10
1327 504 : p(10, i) = REAL(i - 7, KIND=dp)*p(9, i - 1)
1328 : END DO
1329 : ! Build the vector v
1330 168 : v(1) = a*EXP(-b*r1)
1331 168 : v(2) = -b*v(1)
1332 168 : v(3) = -b*v(2)
1333 840 : v(4:7) = 0.0_dp
1334 168 : v(8) = -c/p(8, 10)**2 ! = -c/r3**6
1335 168 : v(9) = -6.0_dp*v(8)/r3
1336 168 : v(10) = -7.0_dp*v(9)/r3
1337 : ! Calculate p_inv the inverse of the matrix p
1338 168 : p_inv(:, :) = 0.0_dp
1339 168 : CALL invert_matrix(p, p_inv, eval_error)
1340 :
1341 168 : IF (eval_error >= 1.0E-8_dp) THEN
1342 : CALL cp_warn(__LOCATION__, &
1343 : "The polynomial fit for the BUCK4RANGES potential is only accurate to "// &
1344 0 : TRIM(cp_to_string(eval_error)))
1345 : END IF
1346 :
1347 : ! Get the 6 coefficients of the 5th-order polynomial -> x(1:6)
1348 : ! and the 4 coefficients of the 3rd-order polynomial -> x(7:10)
1349 18648 : x(:) = MATMUL(p_inv(:, :), v(:))
1350 : ELSE
1351 84 : x(:) = 0.0_dp
1352 : END IF
1353 :
1354 252 : CALL section_vals_val_get(section, "RCUT", i_rep_section=isec, r_val=rcut)
1355 :
1356 504 : nonbonded%pot(start + isec)%pot%type = b4_type
1357 252 : nonbonded%pot(start + isec)%pot%at1 = atm_names(1)
1358 252 : nonbonded%pot(start + isec)%pot%at2 = atm_names(2)
1359 252 : CALL uppercase(nonbonded%pot(start + isec)%pot%at1)
1360 252 : CALL uppercase(nonbonded%pot(start + isec)%pot%at2)
1361 252 : nonbonded%pot(start + isec)%pot%set(1)%buck4r%a = a
1362 252 : nonbonded%pot(start + isec)%pot%set(1)%buck4r%b = b
1363 252 : nonbonded%pot(start + isec)%pot%set(1)%buck4r%c = c
1364 252 : nonbonded%pot(start + isec)%pot%set(1)%buck4r%r1 = r1
1365 252 : nonbonded%pot(start + isec)%pot%set(1)%buck4r%r2 = r2
1366 252 : nonbonded%pot(start + isec)%pot%set(1)%buck4r%r3 = r3
1367 252 : IF ((.NOT. explicit_poly1) .OR. (.NOT. explicit_poly2)) THEN
1368 168 : nonbonded%pot(start + isec)%pot%set(1)%buck4r%npoly1 = 5
1369 1176 : nonbonded%pot(start + isec)%pot%set(1)%buck4r%poly1(0:5) = x(1:6)
1370 168 : nonbonded%pot(start + isec)%pot%set(1)%buck4r%npoly2 = 3
1371 840 : nonbonded%pot(start + isec)%pot%set(1)%buck4r%poly2(0:3) = x(7:10)
1372 : ELSE
1373 84 : nonbonded%pot(start + isec)%pot%set(1)%buck4r%npoly1 = np1 - 1
1374 84 : CPASSERT(np1 - 1 <= 10)
1375 1092 : nonbonded%pot(start + isec)%pot%set(1)%buck4r%poly1(0:np1 - 1) = coeff1(0:np1 - 1)
1376 84 : nonbonded%pot(start + isec)%pot%set(1)%buck4r%npoly2 = np2 - 1
1377 84 : CPASSERT(np2 - 1 <= 10)
1378 756 : nonbonded%pot(start + isec)%pot%set(1)%buck4r%poly2(0:np2 - 1) = coeff2(0:np2 - 1)
1379 : END IF
1380 252 : nonbonded%pot(start + isec)%pot%rcutsq = rcut*rcut
1381 :
1382 252 : IF (ASSOCIATED(coeff1)) THEN
1383 84 : DEALLOCATE (coeff1)
1384 : END IF
1385 252 : IF (ASSOCIATED(coeff2)) THEN
1386 84 : DEALLOCATE (coeff2)
1387 : END IF
1388 252 : CALL section_vals_val_get(section, "RMIN", i_rep_section=isec, n_rep_val=n_rep)
1389 252 : IF (n_rep == 1) CALL section_vals_val_get(section, "RMIN", i_rep_section=isec, &
1390 0 : r_val=nonbonded%pot(start + isec)%pot%set(1)%rmin)
1391 252 : CALL section_vals_val_get(section, "RMAX", i_rep_section=isec, n_rep_val=n_rep)
1392 252 : IF (n_rep == 1) CALL section_vals_val_get(section, "RMAX", i_rep_section=isec, &
1393 1512 : r_val=nonbonded%pot(start + isec)%pot%set(1)%rmax)
1394 : END DO
1395 :
1396 252 : END SUBROUTINE read_b4_section
1397 :
1398 : ! **************************************************************************************************
1399 : !> \brief Reads the GENPOT - generic potential section
1400 : !> \param nonbonded ...
1401 : !> \param section ...
1402 : !> \param start ...
1403 : !> \author Teodoro Laino - 10.2006
1404 : ! **************************************************************************************************
1405 582 : SUBROUTINE read_gp_section(nonbonded, section, start)
1406 : TYPE(pair_potential_p_type), POINTER :: nonbonded
1407 : TYPE(section_vals_type), POINTER :: section
1408 : INTEGER, INTENT(IN) :: start
1409 :
1410 : CHARACTER(LEN=default_string_length), &
1411 582 : DIMENSION(:), POINTER :: atm_names
1412 : INTEGER :: isec, n_items, n_rep
1413 : REAL(KIND=dp) :: rcut
1414 :
1415 582 : CALL section_vals_get(section, n_repetition=n_items)
1416 3810 : DO isec = 1, n_items
1417 3228 : NULLIFY (atm_names)
1418 3228 : CALL section_vals_val_get(section, "ATOMS", i_rep_section=isec, c_vals=atm_names)
1419 3228 : CALL section_vals_val_get(section, "RCUT", i_rep_section=isec, r_val=rcut)
1420 6456 : nonbonded%pot(start + isec)%pot%type = gp_type
1421 3228 : nonbonded%pot(start + isec)%pot%at1 = atm_names(1)
1422 3228 : nonbonded%pot(start + isec)%pot%at2 = atm_names(2)
1423 3228 : nonbonded%pot(start + isec)%pot%rcutsq = rcut*rcut
1424 3228 : CALL uppercase(nonbonded%pot(start + isec)%pot%at1)
1425 3228 : CALL uppercase(nonbonded%pot(start + isec)%pot%at2)
1426 : ! Parse the genpot info
1427 : CALL get_generic_info(section, "FUNCTION", nonbonded%pot(start + isec)%pot%set(1)%gp%potential, &
1428 : nonbonded%pot(start + isec)%pot%set(1)%gp%parameters, &
1429 : nonbonded%pot(start + isec)%pot%set(1)%gp%values, &
1430 3228 : size_variables=1, i_rep_sec=isec)
1431 3228 : nonbonded%pot(start + isec)%pot%set(1)%gp%variables = nonbonded%pot(start + isec)%pot%set(1)%gp%parameters(1)
1432 : !
1433 3228 : CALL section_vals_val_get(section, "RMIN", i_rep_section=isec, n_rep_val=n_rep)
1434 3228 : IF (n_rep == 1) CALL section_vals_val_get(section, "RMIN", i_rep_section=isec, &
1435 21 : r_val=nonbonded%pot(start + isec)%pot%set(1)%rmin)
1436 3228 : CALL section_vals_val_get(section, "RMAX", i_rep_section=isec, n_rep_val=n_rep)
1437 3228 : IF (n_rep == 1) CALL section_vals_val_get(section, "RMAX", i_rep_section=isec, &
1438 10287 : r_val=nonbonded%pot(start + isec)%pot%set(1)%rmax)
1439 : END DO
1440 582 : END SUBROUTINE read_gp_section
1441 :
1442 : ! **************************************************************************************************
1443 : !> \brief Reads the tersoff section
1444 : !> \param nonbonded ...
1445 : !> \param section ...
1446 : !> \param start ...
1447 : !> \param tersoff_section ...
1448 : !> \author ikuo
1449 : ! **************************************************************************************************
1450 38 : SUBROUTINE read_tersoff_section(nonbonded, section, start, tersoff_section)
1451 : TYPE(pair_potential_p_type), POINTER :: nonbonded
1452 : TYPE(section_vals_type), POINTER :: section
1453 : INTEGER, INTENT(IN) :: start
1454 : TYPE(section_vals_type), POINTER :: tersoff_section
1455 :
1456 : CHARACTER(LEN=default_string_length), &
1457 38 : DIMENSION(:), POINTER :: atm_names
1458 : INTEGER :: isec, n_items, n_rep
1459 : REAL(KIND=dp) :: rcut, rcutsq
1460 :
1461 38 : CALL section_vals_get(section, n_repetition=n_items)
1462 80 : DO isec = 1, n_items
1463 42 : CALL cite_reference(Tersoff1988)
1464 42 : CALL section_vals_val_get(section, "ATOMS", i_rep_section=isec, c_vals=atm_names)
1465 :
1466 84 : nonbonded%pot(start + isec)%pot%type = tersoff_type
1467 42 : nonbonded%pot(start + isec)%pot%at1 = atm_names(1)
1468 42 : nonbonded%pot(start + isec)%pot%at2 = atm_names(2)
1469 42 : CALL uppercase(nonbonded%pot(start + isec)%pot%at1)
1470 42 : CALL uppercase(nonbonded%pot(start + isec)%pot%at2)
1471 :
1472 : CALL section_vals_val_get(tersoff_section, "A", i_rep_section=isec, &
1473 42 : r_val=nonbonded%pot(start + isec)%pot%set(1)%tersoff%A)
1474 : CALL section_vals_val_get(tersoff_section, "B", i_rep_section=isec, &
1475 42 : r_val=nonbonded%pot(start + isec)%pot%set(1)%tersoff%B)
1476 : CALL section_vals_val_get(tersoff_section, "lambda1", i_rep_section=isec, &
1477 42 : r_val=nonbonded%pot(start + isec)%pot%set(1)%tersoff%lambda1)
1478 : CALL section_vals_val_get(tersoff_section, "lambda2", i_rep_section=isec, &
1479 42 : r_val=nonbonded%pot(start + isec)%pot%set(1)%tersoff%lambda2)
1480 : CALL section_vals_val_get(tersoff_section, "alpha", i_rep_section=isec, &
1481 42 : r_val=nonbonded%pot(start + isec)%pot%set(1)%tersoff%alpha)
1482 : CALL section_vals_val_get(tersoff_section, "beta", i_rep_section=isec, &
1483 42 : r_val=nonbonded%pot(start + isec)%pot%set(1)%tersoff%beta)
1484 : CALL section_vals_val_get(tersoff_section, "n", i_rep_section=isec, &
1485 42 : r_val=nonbonded%pot(start + isec)%pot%set(1)%tersoff%n)
1486 : CALL section_vals_val_get(tersoff_section, "c", i_rep_section=isec, &
1487 42 : r_val=nonbonded%pot(start + isec)%pot%set(1)%tersoff%c)
1488 : CALL section_vals_val_get(tersoff_section, "d", i_rep_section=isec, &
1489 42 : r_val=nonbonded%pot(start + isec)%pot%set(1)%tersoff%d)
1490 : CALL section_vals_val_get(tersoff_section, "h", i_rep_section=isec, &
1491 42 : r_val=nonbonded%pot(start + isec)%pot%set(1)%tersoff%h)
1492 : CALL section_vals_val_get(tersoff_section, "lambda3", i_rep_section=isec, &
1493 42 : r_val=nonbonded%pot(start + isec)%pot%set(1)%tersoff%lambda3)
1494 : CALL section_vals_val_get(tersoff_section, "bigR", i_rep_section=isec, &
1495 42 : r_val=nonbonded%pot(start + isec)%pot%set(1)%tersoff%bigR)
1496 : CALL section_vals_val_get(tersoff_section, "bigD", i_rep_section=isec, &
1497 42 : r_val=nonbonded%pot(start + isec)%pot%set(1)%tersoff%bigD)
1498 :
1499 : rcutsq = (nonbonded%pot(start + isec)%pot%set(1)%tersoff%bigR + &
1500 42 : nonbonded%pot(start + isec)%pot%set(1)%tersoff%bigD)**2
1501 42 : nonbonded%pot(start + isec)%pot%set(1)%tersoff%rcutsq = rcutsq
1502 42 : nonbonded%pot(start + isec)%pot%rcutsq = rcutsq
1503 :
1504 : ! In case it is defined override the standard specification of RCUT
1505 42 : CALL section_vals_val_get(tersoff_section, "RCUT", i_rep_section=isec, n_rep_val=n_rep)
1506 80 : IF (n_rep == 1) THEN
1507 24 : CALL section_vals_val_get(tersoff_section, "RCUT", i_rep_section=isec, r_val=rcut)
1508 24 : nonbonded%pot(start + isec)%pot%rcutsq = rcut**2
1509 : END IF
1510 : END DO
1511 38 : END SUBROUTINE read_tersoff_section
1512 :
1513 : ! **************************************************************************************************
1514 : !> \brief Reads the gal19 section
1515 : !> \param nonbonded ...
1516 : !> \param section ...
1517 : !> \param start ...
1518 : !> \param gal_section ...
1519 : !> \author Clabaut Paul
1520 : ! **************************************************************************************************
1521 1 : SUBROUTINE read_gal_section(nonbonded, section, start, gal_section)
1522 : TYPE(pair_potential_p_type), POINTER :: nonbonded
1523 : TYPE(section_vals_type), POINTER :: section
1524 : INTEGER, INTENT(IN) :: start
1525 : TYPE(section_vals_type), POINTER :: gal_section
1526 :
1527 : CHARACTER(LEN=default_string_length), &
1528 1 : DIMENSION(:), POINTER :: atm_names
1529 : INTEGER :: iatom, isec, n_items, n_rep, nval
1530 : LOGICAL :: is_ok
1531 : REAL(KIND=dp) :: rcut, rval
1532 1 : REAL(KIND=dp), DIMENSION(:), POINTER :: rvalues
1533 : TYPE(cp_sll_val_type), POINTER :: list
1534 : TYPE(section_vals_type), POINTER :: subsection
1535 : TYPE(val_type), POINTER :: val
1536 :
1537 1 : CALL section_vals_get(section, n_repetition=n_items)
1538 2 : DO isec = 1, n_items
1539 1 : CALL cite_reference(Clabaut2020)
1540 1 : CALL section_vals_val_get(section, "ATOMS", i_rep_section=isec, c_vals=atm_names)
1541 :
1542 2 : nonbonded%pot(start + isec)%pot%type = gal_type
1543 1 : nonbonded%pot(start + isec)%pot%at1 = atm_names(1)
1544 1 : nonbonded%pot(start + isec)%pot%at2 = atm_names(2)
1545 1 : CALL uppercase(nonbonded%pot(start + isec)%pot%at1)
1546 1 : CALL uppercase(nonbonded%pot(start + isec)%pot%at2)
1547 :
1548 1 : CALL section_vals_val_get(section, "METALS", i_rep_section=isec, c_vals=atm_names)
1549 3 : IF (ANY(LEN_TRIM(atm_names(:)) > 2)) THEN
1550 0 : CPWARN("The atom name will be truncated.")
1551 : END IF
1552 1 : nonbonded%pot(start + isec)%pot%set(1)%gal%met1 = TRIM(atm_names(1))
1553 1 : nonbonded%pot(start + isec)%pot%set(1)%gal%met2 = TRIM(atm_names(2))
1554 :
1555 : CALL section_vals_val_get(gal_section, "epsilon", i_rep_section=isec, &
1556 1 : r_val=nonbonded%pot(start + isec)%pot%set(1)%gal%epsilon)
1557 : CALL section_vals_val_get(gal_section, "bxy", i_rep_section=isec, &
1558 1 : r_val=nonbonded%pot(start + isec)%pot%set(1)%gal%bxy)
1559 : CALL section_vals_val_get(gal_section, "bz", i_rep_section=isec, &
1560 1 : r_val=nonbonded%pot(start + isec)%pot%set(1)%gal%bz)
1561 :
1562 1 : CALL section_vals_val_get(gal_section, "r", i_rep_section=isec, r_vals=rvalues)
1563 1 : nonbonded%pot(start + isec)%pot%set(1)%gal%r1 = rvalues(1)
1564 1 : nonbonded%pot(start + isec)%pot%set(1)%gal%r2 = rvalues(2)
1565 :
1566 : CALL section_vals_val_get(gal_section, "a1", i_rep_section=isec, &
1567 1 : r_val=nonbonded%pot(start + isec)%pot%set(1)%gal%a1)
1568 : CALL section_vals_val_get(gal_section, "a2", i_rep_section=isec, &
1569 1 : r_val=nonbonded%pot(start + isec)%pot%set(1)%gal%a2)
1570 : CALL section_vals_val_get(gal_section, "a3", i_rep_section=isec, &
1571 1 : r_val=nonbonded%pot(start + isec)%pot%set(1)%gal%a3)
1572 : CALL section_vals_val_get(gal_section, "a4", i_rep_section=isec, &
1573 1 : r_val=nonbonded%pot(start + isec)%pot%set(1)%gal%a4)
1574 : CALL section_vals_val_get(gal_section, "A", i_rep_section=isec, &
1575 1 : r_val=nonbonded%pot(start + isec)%pot%set(1)%gal%a)
1576 : CALL section_vals_val_get(gal_section, "B", i_rep_section=isec, &
1577 1 : r_val=nonbonded%pot(start + isec)%pot%set(1)%gal%b)
1578 : CALL section_vals_val_get(gal_section, "C", i_rep_section=isec, &
1579 1 : r_val=nonbonded%pot(start + isec)%pot%set(1)%gal%c)
1580 1 : NULLIFY (list)
1581 1 : subsection => section_vals_get_subs_vals(section, "GCN", i_rep_section=isec)
1582 1 : CALL section_vals_val_get(subsection, "_DEFAULT_KEYWORD_", n_rep_val=nval)
1583 3 : ALLOCATE (nonbonded%pot(start + isec)%pot%set(1)%gal%gcn(nval))
1584 1 : CALL section_vals_list_get(subsection, "_DEFAULT_KEYWORD_", list=list)
1585 871 : DO iatom = 1, nval
1586 : ! we use only the first default_string_length characters of each line
1587 870 : is_ok = cp_sll_val_next(list, val)
1588 870 : CALL val_get(val, r_val=rval)
1589 : ! assign values
1590 871 : nonbonded%pot(start + isec)%pot%set(1)%gal%gcn(iatom) = rval
1591 : END DO
1592 :
1593 : CALL section_vals_val_get(gal_section, "Fit_express", i_rep_section=isec, &
1594 1 : l_val=nonbonded%pot(start + isec)%pot%set(1)%gal%express)
1595 :
1596 : ! ! In case it is defined override the standard specification of RCUT
1597 1 : CALL section_vals_val_get(gal_section, "RCUT", i_rep_section=isec, n_rep_val=n_rep)
1598 3 : IF (n_rep == 1) THEN
1599 1 : CALL section_vals_val_get(gal_section, "RCUT", i_rep_section=isec, r_val=rcut)
1600 1 : nonbonded%pot(start + isec)%pot%rcutsq = rcut**2
1601 1 : nonbonded%pot(start + isec)%pot%set(1)%gal%rcutsq = rcut**2
1602 : END IF
1603 : END DO
1604 1 : END SUBROUTINE read_gal_section
1605 :
1606 : ! **************************************************************************************************
1607 : !> \brief Reads the gal21 section
1608 : !> \param nonbonded ...
1609 : !> \param section ...
1610 : !> \param start ...
1611 : !> \param gal21_section ...
1612 : !> \author Clabaut Paul
1613 : ! **************************************************************************************************
1614 1 : SUBROUTINE read_gal21_section(nonbonded, section, start, gal21_section)
1615 : TYPE(pair_potential_p_type), POINTER :: nonbonded
1616 : TYPE(section_vals_type), POINTER :: section
1617 : INTEGER, INTENT(IN) :: start
1618 : TYPE(section_vals_type), POINTER :: gal21_section
1619 :
1620 : CHARACTER(LEN=default_string_length), &
1621 1 : DIMENSION(:), POINTER :: atm_names
1622 : INTEGER :: iatom, isec, n_items, n_rep, nval
1623 : LOGICAL :: is_ok
1624 : REAL(KIND=dp) :: rcut, rval
1625 1 : REAL(KIND=dp), DIMENSION(:), POINTER :: rvalues
1626 : TYPE(cp_sll_val_type), POINTER :: list
1627 : TYPE(section_vals_type), POINTER :: subsection
1628 : TYPE(val_type), POINTER :: val
1629 :
1630 1 : CALL section_vals_get(section, n_repetition=n_items)
1631 2 : DO isec = 1, n_items
1632 1 : CALL cite_reference(Clabaut2021)
1633 1 : CALL section_vals_val_get(section, "ATOMS", i_rep_section=isec, c_vals=atm_names)
1634 :
1635 2 : nonbonded%pot(start + isec)%pot%type = gal21_type
1636 1 : nonbonded%pot(start + isec)%pot%at1 = atm_names(1)
1637 1 : nonbonded%pot(start + isec)%pot%at2 = atm_names(2)
1638 1 : CALL uppercase(nonbonded%pot(start + isec)%pot%at1)
1639 1 : CALL uppercase(nonbonded%pot(start + isec)%pot%at2)
1640 :
1641 1 : CALL section_vals_val_get(section, "METALS", i_rep_section=isec, c_vals=atm_names)
1642 3 : IF (ANY(LEN_TRIM(atm_names(:)) > 2)) THEN
1643 0 : CPWARN("The atom name will be truncated.")
1644 : END IF
1645 1 : nonbonded%pot(start + isec)%pot%set(1)%gal21%met1 = TRIM(atm_names(1))
1646 1 : nonbonded%pot(start + isec)%pot%set(1)%gal21%met2 = TRIM(atm_names(2))
1647 :
1648 1 : CALL section_vals_val_get(gal21_section, "epsilon", i_rep_section=isec, r_vals=rvalues)
1649 1 : nonbonded%pot(start + isec)%pot%set(1)%gal21%epsilon1 = rvalues(1)
1650 1 : nonbonded%pot(start + isec)%pot%set(1)%gal21%epsilon2 = rvalues(2)
1651 1 : nonbonded%pot(start + isec)%pot%set(1)%gal21%epsilon3 = rvalues(3)
1652 :
1653 1 : CALL section_vals_val_get(gal21_section, "bxy", i_rep_section=isec, r_vals=rvalues)
1654 1 : nonbonded%pot(start + isec)%pot%set(1)%gal21%bxy1 = rvalues(1)
1655 1 : nonbonded%pot(start + isec)%pot%set(1)%gal21%bxy2 = rvalues(2)
1656 :
1657 1 : CALL section_vals_val_get(gal21_section, "bz", i_rep_section=isec, r_vals=rvalues)
1658 1 : nonbonded%pot(start + isec)%pot%set(1)%gal21%bz1 = rvalues(1)
1659 1 : nonbonded%pot(start + isec)%pot%set(1)%gal21%bz2 = rvalues(2)
1660 :
1661 1 : CALL section_vals_val_get(gal21_section, "r", i_rep_section=isec, r_vals=rvalues)
1662 1 : nonbonded%pot(start + isec)%pot%set(1)%gal21%r1 = rvalues(1)
1663 1 : nonbonded%pot(start + isec)%pot%set(1)%gal21%r2 = rvalues(2)
1664 :
1665 1 : CALL section_vals_val_get(gal21_section, "a1", i_rep_section=isec, r_vals=rvalues)
1666 1 : nonbonded%pot(start + isec)%pot%set(1)%gal21%a11 = rvalues(1)
1667 1 : nonbonded%pot(start + isec)%pot%set(1)%gal21%a12 = rvalues(2)
1668 1 : nonbonded%pot(start + isec)%pot%set(1)%gal21%a13 = rvalues(3)
1669 :
1670 1 : CALL section_vals_val_get(gal21_section, "a2", i_rep_section=isec, r_vals=rvalues)
1671 1 : nonbonded%pot(start + isec)%pot%set(1)%gal21%a21 = rvalues(1)
1672 1 : nonbonded%pot(start + isec)%pot%set(1)%gal21%a22 = rvalues(2)
1673 1 : nonbonded%pot(start + isec)%pot%set(1)%gal21%a23 = rvalues(3)
1674 :
1675 1 : CALL section_vals_val_get(gal21_section, "a3", i_rep_section=isec, r_vals=rvalues)
1676 1 : nonbonded%pot(start + isec)%pot%set(1)%gal21%a31 = rvalues(1)
1677 1 : nonbonded%pot(start + isec)%pot%set(1)%gal21%a32 = rvalues(2)
1678 1 : nonbonded%pot(start + isec)%pot%set(1)%gal21%a33 = rvalues(3)
1679 :
1680 1 : CALL section_vals_val_get(gal21_section, "a4", i_rep_section=isec, r_vals=rvalues)
1681 1 : nonbonded%pot(start + isec)%pot%set(1)%gal21%a41 = rvalues(1)
1682 1 : nonbonded%pot(start + isec)%pot%set(1)%gal21%a42 = rvalues(2)
1683 1 : nonbonded%pot(start + isec)%pot%set(1)%gal21%a43 = rvalues(3)
1684 :
1685 1 : CALL section_vals_val_get(gal21_section, "A", i_rep_section=isec, r_vals=rvalues)
1686 1 : nonbonded%pot(start + isec)%pot%set(1)%gal21%AO1 = rvalues(1)
1687 1 : nonbonded%pot(start + isec)%pot%set(1)%gal21%AO2 = rvalues(2)
1688 :
1689 1 : CALL section_vals_val_get(gal21_section, "B", i_rep_section=isec, r_vals=rvalues)
1690 1 : nonbonded%pot(start + isec)%pot%set(1)%gal21%BO1 = rvalues(1)
1691 1 : nonbonded%pot(start + isec)%pot%set(1)%gal21%BO2 = rvalues(2)
1692 :
1693 : CALL section_vals_val_get(gal21_section, "C", i_rep_section=isec, &
1694 1 : r_val=nonbonded%pot(start + isec)%pot%set(1)%gal21%c)
1695 :
1696 1 : CALL section_vals_val_get(gal21_section, "AH", i_rep_section=isec, r_vals=rvalues)
1697 1 : nonbonded%pot(start + isec)%pot%set(1)%gal21%AH1 = rvalues(1)
1698 1 : nonbonded%pot(start + isec)%pot%set(1)%gal21%AH2 = rvalues(2)
1699 :
1700 1 : CALL section_vals_val_get(gal21_section, "BH", i_rep_section=isec, r_vals=rvalues)
1701 1 : nonbonded%pot(start + isec)%pot%set(1)%gal21%BH1 = rvalues(1)
1702 1 : nonbonded%pot(start + isec)%pot%set(1)%gal21%BH2 = rvalues(2)
1703 :
1704 1 : NULLIFY (list)
1705 1 : subsection => section_vals_get_subs_vals(section, "GCN", i_rep_section=isec)
1706 1 : CALL section_vals_val_get(subsection, "_DEFAULT_KEYWORD_", n_rep_val=nval)
1707 3 : ALLOCATE (nonbonded%pot(start + isec)%pot%set(1)%gal21%gcn(nval))
1708 1 : CALL section_vals_list_get(subsection, "_DEFAULT_KEYWORD_", list=list)
1709 871 : DO iatom = 1, nval
1710 : ! we use only the first default_string_length characters of each line
1711 870 : is_ok = cp_sll_val_next(list, val)
1712 870 : CALL val_get(val, r_val=rval)
1713 : ! assign values
1714 871 : nonbonded%pot(start + isec)%pot%set(1)%gal21%gcn(iatom) = rval
1715 : END DO
1716 :
1717 : CALL section_vals_val_get(gal21_section, "Fit_express", i_rep_section=isec, &
1718 1 : l_val=nonbonded%pot(start + isec)%pot%set(1)%gal21%express)
1719 :
1720 : ! ! In case it is defined override the standard specification of RCUT
1721 1 : CALL section_vals_val_get(gal21_section, "RCUT", i_rep_section=isec, n_rep_val=n_rep)
1722 3 : IF (n_rep == 1) THEN
1723 1 : CALL section_vals_val_get(gal21_section, "RCUT", i_rep_section=isec, r_val=rcut)
1724 1 : nonbonded%pot(start + isec)%pot%rcutsq = rcut**2
1725 1 : nonbonded%pot(start + isec)%pot%set(1)%gal21%rcutsq = rcut**2
1726 : END IF
1727 : END DO
1728 1 : END SUBROUTINE read_gal21_section
1729 :
1730 : ! **************************************************************************************************
1731 : !> \brief Reads the siepmann section
1732 : !> \param nonbonded ...
1733 : !> \param section ...
1734 : !> \param start ...
1735 : !> \param siepmann_section ...
1736 : !> \author Dorothea Golze
1737 : ! **************************************************************************************************
1738 5 : SUBROUTINE read_siepmann_section(nonbonded, section, start, siepmann_section)
1739 : TYPE(pair_potential_p_type), POINTER :: nonbonded
1740 : TYPE(section_vals_type), POINTER :: section
1741 : INTEGER, INTENT(IN) :: start
1742 : TYPE(section_vals_type), POINTER :: siepmann_section
1743 :
1744 : CHARACTER(LEN=default_string_length), &
1745 5 : DIMENSION(:), POINTER :: atm_names
1746 : INTEGER :: isec, n_items, n_rep
1747 : REAL(KIND=dp) :: rcut
1748 :
1749 5 : CALL section_vals_get(section, n_repetition=n_items)
1750 10 : DO isec = 1, n_items
1751 5 : CALL cite_reference(Siepmann1995)
1752 5 : CALL section_vals_val_get(section, "ATOMS", i_rep_section=isec, c_vals=atm_names)
1753 :
1754 10 : nonbonded%pot(start + isec)%pot%type = siepmann_type
1755 5 : nonbonded%pot(start + isec)%pot%at1 = atm_names(1)
1756 5 : nonbonded%pot(start + isec)%pot%at2 = atm_names(2)
1757 5 : CALL uppercase(nonbonded%pot(start + isec)%pot%at1)
1758 5 : CALL uppercase(nonbonded%pot(start + isec)%pot%at2)
1759 :
1760 : CALL section_vals_val_get(siepmann_section, "B", i_rep_section=isec, &
1761 5 : r_val=nonbonded%pot(start + isec)%pot%set(1)%siepmann%B)
1762 : CALL section_vals_val_get(siepmann_section, "D", i_rep_section=isec, &
1763 5 : r_val=nonbonded%pot(start + isec)%pot%set(1)%siepmann%D)
1764 : CALL section_vals_val_get(siepmann_section, "E", i_rep_section=isec, &
1765 5 : r_val=nonbonded%pot(start + isec)%pot%set(1)%siepmann%E)
1766 : CALL section_vals_val_get(siepmann_section, "F", i_rep_section=isec, &
1767 5 : r_val=nonbonded%pot(start + isec)%pot%set(1)%siepmann%F)
1768 : CALL section_vals_val_get(siepmann_section, "beta", i_rep_section=isec, &
1769 5 : r_val=nonbonded%pot(start + isec)%pot%set(1)%siepmann%beta)
1770 : CALL section_vals_val_get(siepmann_section, "ALLOW_OH_FORMATION", i_rep_section=isec, &
1771 5 : l_val=nonbonded%pot(start + isec)%pot%set(1)%siepmann%allow_oh_formation)
1772 : CALL section_vals_val_get(siepmann_section, "ALLOW_H3O_FORMATION", i_rep_section=isec, &
1773 5 : l_val=nonbonded%pot(start + isec)%pot%set(1)%siepmann%allow_h3o_formation)
1774 : CALL section_vals_val_get(siepmann_section, "ALLOW_O_FORMATION", i_rep_section=isec, &
1775 5 : l_val=nonbonded%pot(start + isec)%pot%set(1)%siepmann%allow_o_formation)
1776 :
1777 : ! ! In case it is defined override the standard specification of RCUT
1778 5 : CALL section_vals_val_get(siepmann_section, "RCUT", i_rep_section=isec, n_rep_val=n_rep)
1779 10 : IF (n_rep == 1) THEN
1780 5 : CALL section_vals_val_get(siepmann_section, "RCUT", i_rep_section=isec, r_val=rcut)
1781 5 : nonbonded%pot(start + isec)%pot%rcutsq = rcut**2
1782 5 : nonbonded%pot(start + isec)%pot%set(1)%siepmann%rcutsq = rcut**2
1783 : END IF
1784 : END DO
1785 5 : END SUBROUTINE read_siepmann_section
1786 :
1787 : ! **************************************************************************************************
1788 : !> \brief Reads the Buckingham plus Morse potential section
1789 : !> \param nonbonded ...
1790 : !> \param section ...
1791 : !> \param start ...
1792 : !> \author MI
1793 : ! **************************************************************************************************
1794 6 : SUBROUTINE read_bm_section(nonbonded, section, start)
1795 : TYPE(pair_potential_p_type), POINTER :: nonbonded
1796 : TYPE(section_vals_type), POINTER :: section
1797 : INTEGER, INTENT(IN) :: start
1798 :
1799 : CHARACTER(LEN=default_string_length), &
1800 6 : DIMENSION(:), POINTER :: atm_names
1801 : INTEGER :: isec, n_items, n_rep
1802 : REAL(KIND=dp) :: a1, a2, b1, b2, beta, c, d, f0, r0, rcut
1803 :
1804 6 : CALL section_vals_get(section, n_repetition=n_items)
1805 20 : DO isec = 1, n_items
1806 14 : CALL cite_reference(Yamada2000)
1807 14 : CALL section_vals_val_get(section, "ATOMS", i_rep_section=isec, c_vals=atm_names)
1808 14 : CALL section_vals_val_get(section, "F0", i_rep_section=isec, r_val=f0)
1809 14 : CALL section_vals_val_get(section, "A1", i_rep_section=isec, r_val=a1)
1810 14 : CALL section_vals_val_get(section, "A2", i_rep_section=isec, r_val=a2)
1811 14 : CALL section_vals_val_get(section, "B1", i_rep_section=isec, r_val=b1)
1812 14 : CALL section_vals_val_get(section, "B2", i_rep_section=isec, r_val=b2)
1813 14 : CALL section_vals_val_get(section, "C", i_rep_section=isec, r_val=c)
1814 14 : CALL section_vals_val_get(section, "D", i_rep_section=isec, r_val=d)
1815 14 : CALL section_vals_val_get(section, "R0", i_rep_section=isec, r_val=r0)
1816 14 : CALL section_vals_val_get(section, "Beta", i_rep_section=isec, r_val=beta)
1817 14 : CALL section_vals_val_get(section, "RCUT", i_rep_section=isec, r_val=rcut)
1818 :
1819 28 : nonbonded%pot(start + isec)%pot%type = bm_type
1820 14 : nonbonded%pot(start + isec)%pot%at1 = atm_names(1)
1821 14 : nonbonded%pot(start + isec)%pot%at2 = atm_names(2)
1822 14 : CALL uppercase(nonbonded%pot(start + isec)%pot%at1)
1823 14 : CALL uppercase(nonbonded%pot(start + isec)%pot%at2)
1824 14 : nonbonded%pot(start + isec)%pot%set(1)%buckmo%f0 = f0
1825 14 : nonbonded%pot(start + isec)%pot%set(1)%buckmo%a1 = a1
1826 14 : nonbonded%pot(start + isec)%pot%set(1)%buckmo%a2 = a2
1827 14 : nonbonded%pot(start + isec)%pot%set(1)%buckmo%b1 = b1
1828 14 : nonbonded%pot(start + isec)%pot%set(1)%buckmo%b2 = b2
1829 14 : nonbonded%pot(start + isec)%pot%set(1)%buckmo%c = c
1830 14 : nonbonded%pot(start + isec)%pot%set(1)%buckmo%d = d
1831 14 : nonbonded%pot(start + isec)%pot%set(1)%buckmo%r0 = r0
1832 14 : nonbonded%pot(start + isec)%pot%set(1)%buckmo%beta = beta
1833 14 : nonbonded%pot(start + isec)%pot%rcutsq = rcut*rcut
1834 : !
1835 14 : CALL section_vals_val_get(section, "RMIN", i_rep_section=isec, n_rep_val=n_rep)
1836 14 : IF (n_rep == 1) CALL section_vals_val_get(section, "RMIN", i_rep_section=isec, &
1837 0 : r_val=nonbonded%pot(start + isec)%pot%set(1)%rmin)
1838 14 : CALL section_vals_val_get(section, "RMAX", i_rep_section=isec, n_rep_val=n_rep)
1839 14 : IF (n_rep == 1) CALL section_vals_val_get(section, "RMAX", i_rep_section=isec, &
1840 48 : r_val=nonbonded%pot(start + isec)%pot%set(1)%rmax)
1841 : END DO
1842 6 : END SUBROUTINE read_bm_section
1843 :
1844 : ! **************************************************************************************************
1845 : !> \brief Reads the TABPOT section
1846 : !> \param nonbonded ...
1847 : !> \param section ...
1848 : !> \param start ...
1849 : !> \param para_env ...
1850 : !> \param mm_section ...
1851 : !> \author Alex Mironenko, Da Teng
1852 : ! **************************************************************************************************
1853 8 : SUBROUTINE read_tabpot_section(nonbonded, section, start, para_env, mm_section)
1854 : TYPE(pair_potential_p_type), POINTER :: nonbonded
1855 : TYPE(section_vals_type), POINTER :: section
1856 : INTEGER, INTENT(IN) :: start
1857 : TYPE(mp_para_env_type), POINTER :: para_env
1858 : TYPE(section_vals_type), POINTER :: mm_section
1859 :
1860 : CHARACTER(LEN=default_string_length), &
1861 8 : DIMENSION(:), POINTER :: atm_names
1862 : INTEGER :: isec, n_items
1863 :
1864 8 : CALL section_vals_get(section, n_repetition=n_items)
1865 32 : DO isec = 1, n_items
1866 24 : CALL section_vals_val_get(section, "ATOMS", i_rep_section=isec, c_vals=atm_names)
1867 48 : nonbonded%pot(start + isec)%pot%type = tab_type
1868 24 : nonbonded%pot(start + isec)%pot%at1 = atm_names(1)
1869 24 : nonbonded%pot(start + isec)%pot%at2 = atm_names(2)
1870 24 : CALL uppercase(nonbonded%pot(start + isec)%pot%at1)
1871 24 : CALL uppercase(nonbonded%pot(start + isec)%pot%at2)
1872 : CALL section_vals_val_get(section, "PARM_FILE_NAME", i_rep_section=isec, &
1873 24 : c_val=nonbonded%pot(start + isec)%pot%set(1)%tab%tabpot_file_name)
1874 24 : CALL read_tabpot_data(nonbonded%pot(start + isec)%pot%set(1)%tab, para_env, mm_section)
1875 32 : nonbonded%pot(start + isec)%pot%set(1)%tab%index = isec
1876 : END DO
1877 8 : END SUBROUTINE read_tabpot_section
1878 :
1879 : ! **************************************************************************************************
1880 : !> \brief Reads the CHARGE section
1881 : !> \param charge_atm ...
1882 : !> \param charge ...
1883 : !> \param section ...
1884 : !> \param start ...
1885 : !> \author teo
1886 : ! **************************************************************************************************
1887 2097 : SUBROUTINE read_chrg_section(charge_atm, charge, section, start)
1888 : CHARACTER(LEN=default_string_length), &
1889 : DIMENSION(:), POINTER :: charge_atm
1890 : REAL(KIND=dp), DIMENSION(:), POINTER :: charge
1891 : TYPE(section_vals_type), POINTER :: section
1892 : INTEGER, INTENT(IN) :: start
1893 :
1894 : CHARACTER(LEN=default_string_length) :: atm_name
1895 : INTEGER :: isec, n_items
1896 :
1897 2097 : CALL section_vals_get(section, n_repetition=n_items)
1898 7238 : DO isec = 1, n_items
1899 5141 : CALL section_vals_val_get(section, "ATOM", i_rep_section=isec, c_val=atm_name)
1900 5141 : charge_atm(start + isec) = atm_name
1901 5141 : CALL uppercase(charge_atm(start + isec))
1902 7238 : CALL section_vals_val_get(section, "CHARGE", i_rep_section=isec, r_val=charge(start + isec))
1903 : END DO
1904 2097 : END SUBROUTINE read_chrg_section
1905 :
1906 : ! **************************************************************************************************
1907 : !> \brief Reads the POLARIZABILITY section
1908 : !> \param apol_atm ...
1909 : !> \param apol ...
1910 : !> \param damping_list ...
1911 : !> \param section ...
1912 : !> \param start ...
1913 : !> \author Marcel Baer
1914 : ! **************************************************************************************************
1915 34 : SUBROUTINE read_apol_section(apol_atm, apol, damping_list, section, &
1916 : start)
1917 : CHARACTER(LEN=default_string_length), &
1918 : DIMENSION(:), POINTER :: apol_atm
1919 : REAL(KIND=dp), DIMENSION(:), POINTER :: apol
1920 : TYPE(damping_info_type), DIMENSION(:), POINTER :: damping_list
1921 : TYPE(section_vals_type), POINTER :: section
1922 : INTEGER, INTENT(IN) :: start
1923 :
1924 : CHARACTER(LEN=default_string_length) :: atm_name
1925 : INTEGER :: isec, isec_damp, n_damp, n_items, &
1926 : start_damp, tmp_damp
1927 : TYPE(section_vals_type), POINTER :: tmp_section
1928 :
1929 34 : CALL section_vals_get(section, n_repetition=n_items)
1930 34 : NULLIFY (tmp_section)
1931 34 : n_damp = 0
1932 : ! *** Counts number of DIPOLE%DAMPING sections ****
1933 102 : DO isec = 1, n_items
1934 : tmp_section => section_vals_get_subs_vals(section, "DAMPING", &
1935 68 : i_rep_section=isec)
1936 68 : CALL section_vals_get(tmp_section, n_repetition=tmp_damp)
1937 102 : n_damp = n_damp + tmp_damp
1938 :
1939 : END DO
1940 :
1941 34 : IF (n_damp > 0) THEN
1942 42 : ALLOCATE (damping_list(1:n_damp))
1943 : END IF
1944 :
1945 : ! *** Reads DIPOLE sections *****
1946 34 : start_damp = 0
1947 102 : DO isec = 1, n_items
1948 68 : CALL section_vals_val_get(section, "ATOM", i_rep_section=isec, c_val=atm_name)
1949 68 : apol_atm(start + isec) = atm_name
1950 68 : CALL uppercase(apol_atm(start + isec))
1951 68 : CALL section_vals_val_get(section, "APOL", i_rep_section=isec, r_val=apol(start + isec))
1952 :
1953 : tmp_section => section_vals_get_subs_vals(section, "DAMPING", &
1954 68 : i_rep_section=isec)
1955 68 : CALL section_vals_get(tmp_section, n_repetition=tmp_damp)
1956 80 : DO isec_damp = 1, tmp_damp
1957 12 : damping_list(start_damp + isec_damp)%atm_name1 = apol_atm(start + isec)
1958 : CALL section_vals_val_get(tmp_section, "ATOM", i_rep_section=isec_damp, &
1959 12 : c_val=atm_name)
1960 12 : damping_list(start_damp + isec_damp)%atm_name2 = atm_name
1961 12 : CALL uppercase(damping_list(start_damp + isec_damp)%atm_name2)
1962 : CALL section_vals_val_get(tmp_section, "TYPE", i_rep_section=isec_damp, &
1963 12 : c_val=atm_name)
1964 12 : damping_list(start_damp + isec_damp)%dtype = atm_name
1965 12 : CALL uppercase(damping_list(start_damp + isec_damp)%dtype)
1966 :
1967 : CALL section_vals_val_get(tmp_section, "ORDER", i_rep_section=isec_damp, &
1968 12 : i_val=damping_list(start_damp + isec_damp)%order)
1969 : CALL section_vals_val_get(tmp_section, "BIJ", i_rep_section=isec_damp, &
1970 12 : r_val=damping_list(start_damp + isec_damp)%bij)
1971 : CALL section_vals_val_get(tmp_section, "CIJ", i_rep_section=isec_damp, &
1972 80 : r_val=damping_list(start_damp + isec_damp)%cij)
1973 : END DO
1974 170 : start_damp = start_damp + tmp_damp
1975 :
1976 : END DO
1977 :
1978 34 : END SUBROUTINE read_apol_section
1979 :
1980 : ! **************************************************************************************************
1981 : !> \brief Reads the QUADRUPOLE POLARIZABILITY section
1982 : !> \param cpol_atm ...
1983 : !> \param cpol ...
1984 : !> \param section ...
1985 : !> \param start ...
1986 : !> \author Marcel Baer
1987 : ! **************************************************************************************************
1988 0 : SUBROUTINE read_cpol_section(cpol_atm, cpol, section, start)
1989 : CHARACTER(LEN=default_string_length), &
1990 : DIMENSION(:), POINTER :: cpol_atm
1991 : REAL(KIND=dp), DIMENSION(:), POINTER :: cpol
1992 : TYPE(section_vals_type), POINTER :: section
1993 : INTEGER, INTENT(IN) :: start
1994 :
1995 : CHARACTER(LEN=default_string_length) :: atm_name
1996 : INTEGER :: isec, n_items
1997 :
1998 0 : CALL section_vals_get(section, n_repetition=n_items)
1999 0 : DO isec = 1, n_items
2000 0 : CALL section_vals_val_get(section, "ATOM", i_rep_section=isec, c_val=atm_name)
2001 0 : cpol_atm(start + isec) = atm_name
2002 0 : CALL uppercase(cpol_atm(start + isec))
2003 0 : CALL section_vals_val_get(section, "CPOL", i_rep_section=isec, r_val=cpol(start + isec))
2004 : END DO
2005 0 : END SUBROUTINE read_cpol_section
2006 :
2007 : ! **************************************************************************************************
2008 : !> \brief Reads the SHELL section
2009 : !> \param shell_list ...
2010 : !> \param section ...
2011 : !> \param start ...
2012 : !> \author Marcella Iannuzzi
2013 : ! **************************************************************************************************
2014 252 : SUBROUTINE read_shell_section(shell_list, section, start)
2015 :
2016 : TYPE(shell_p_type), DIMENSION(:), POINTER :: shell_list
2017 : TYPE(section_vals_type), POINTER :: section
2018 : INTEGER, INTENT(IN) :: start
2019 :
2020 : CHARACTER(LEN=default_string_length) :: atm_name
2021 : INTEGER :: i_rep, n_rep
2022 : REAL(dp) :: ccharge, cutoff, k, maxdist, mfrac, &
2023 : scharge
2024 :
2025 252 : CALL section_vals_get(section, n_repetition=n_rep)
2026 :
2027 704 : DO i_rep = 1, n_rep
2028 : CALL section_vals_val_get(section, "_SECTION_PARAMETERS_", &
2029 452 : c_val=atm_name, i_rep_section=i_rep)
2030 452 : CALL uppercase(atm_name)
2031 452 : shell_list(start + i_rep)%atm_name = atm_name
2032 452 : CALL section_vals_val_get(section, "CORE_CHARGE", i_rep_section=i_rep, r_val=ccharge)
2033 452 : shell_list(start + i_rep)%shell%charge_core = ccharge
2034 452 : CALL section_vals_val_get(section, "SHELL_CHARGE", i_rep_section=i_rep, r_val=scharge)
2035 452 : shell_list(start + i_rep)%shell%charge_shell = scharge
2036 452 : CALL section_vals_val_get(section, "MASS_FRACTION", i_rep_section=i_rep, r_val=mfrac)
2037 452 : shell_list(start + i_rep)%shell%massfrac = mfrac
2038 452 : CALL section_vals_val_get(section, "K2_SPRING", i_rep_section=i_rep, r_val=k)
2039 452 : IF (k < 0.0_dp) THEN
2040 : CALL cp_abort(__LOCATION__, &
2041 : "An invalid value was specified for the force constant k2 of the core-shell "// &
2042 0 : "spring potential")
2043 : END IF
2044 452 : shell_list(start + i_rep)%shell%k2_spring = k
2045 452 : CALL section_vals_val_get(section, "K4_SPRING", i_rep_section=i_rep, r_val=k)
2046 452 : IF (k < 0.0_dp) THEN
2047 : CALL cp_abort(__LOCATION__, &
2048 : "An invalid value was specified for the force constant k4 of the core-shell "// &
2049 0 : "spring potential")
2050 : END IF
2051 452 : shell_list(start + i_rep)%shell%k4_spring = k
2052 452 : CALL section_vals_val_get(section, "MAX_DISTANCE", i_rep_section=i_rep, r_val=maxdist)
2053 452 : shell_list(start + i_rep)%shell%max_dist = maxdist
2054 452 : CALL section_vals_val_get(section, "SHELL_CUTOFF", i_rep_section=i_rep, r_val=cutoff)
2055 1608 : shell_list(start + i_rep)%shell%shell_cutoff = cutoff
2056 : END DO
2057 :
2058 252 : END SUBROUTINE read_shell_section
2059 :
2060 : ! **************************************************************************************************
2061 : !> \brief Reads the BONDS section
2062 : !> \param bond_kind ...
2063 : !> \param bond_a ...
2064 : !> \param bond_b ...
2065 : !> \param bond_k ...
2066 : !> \param bond_r0 ...
2067 : !> \param bond_cs ...
2068 : !> \param section ...
2069 : !> \param start ...
2070 : !> \author teo
2071 : ! **************************************************************************************************
2072 975 : SUBROUTINE read_bonds_section(bond_kind, bond_a, bond_b, bond_k, bond_r0, bond_cs, section, start)
2073 : INTEGER, DIMENSION(:), POINTER :: bond_kind
2074 : CHARACTER(LEN=default_string_length), &
2075 : DIMENSION(:), POINTER :: bond_a, bond_b
2076 : REAL(KIND=dp), DIMENSION(:, :), POINTER :: bond_k
2077 : REAL(KIND=dp), DIMENSION(:), POINTER :: bond_r0, bond_cs
2078 : TYPE(section_vals_type), POINTER :: section
2079 : INTEGER, INTENT(IN) :: start
2080 :
2081 : CHARACTER(LEN=default_string_length), &
2082 975 : DIMENSION(:), POINTER :: atm_names
2083 : INTEGER :: isec, k, n_items
2084 975 : REAL(KIND=dp), DIMENSION(:), POINTER :: Kvals
2085 :
2086 975 : NULLIFY (Kvals, atm_names)
2087 975 : CALL section_vals_get(section, n_repetition=n_items)
2088 2826 : DO isec = 1, n_items
2089 1851 : CALL section_vals_val_get(section, "KIND", i_rep_section=isec, i_val=bond_kind(start + isec))
2090 1851 : CALL section_vals_val_get(section, "ATOMS", i_rep_section=isec, c_vals=atm_names)
2091 1851 : bond_a(start + isec) = atm_names(1)
2092 1851 : bond_b(start + isec) = atm_names(2)
2093 1851 : CALL uppercase(bond_a(start + isec))
2094 1851 : CALL uppercase(bond_b(start + isec))
2095 1851 : CALL section_vals_val_get(section, "K", i_rep_section=isec, r_vals=Kvals)
2096 1851 : CPASSERT(SIZE(Kvals) <= 3)
2097 7404 : bond_k(:, start + isec) = 0.0_dp
2098 3740 : DO k = 1, SIZE(Kvals)
2099 3740 : bond_k(k, start + isec) = Kvals(k)
2100 : END DO
2101 1851 : CALL section_vals_val_get(section, "R0", i_rep_section=isec, r_val=bond_r0(start + isec))
2102 2826 : CALL section_vals_val_get(section, "CS", i_rep_section=isec, r_val=bond_cs(start + isec))
2103 : END DO
2104 975 : END SUBROUTINE read_bonds_section
2105 :
2106 : ! **************************************************************************************************
2107 : !> \brief Reads the BENDS section
2108 : !> \param bend_kind ...
2109 : !> \param bend_a ...
2110 : !> \param bend_b ...
2111 : !> \param bend_c ...
2112 : !> \param bend_k ...
2113 : !> \param bend_theta0 ...
2114 : !> \param bend_cb ...
2115 : !> \param bend_r012 ...
2116 : !> \param bend_r032 ...
2117 : !> \param bend_kbs12 ...
2118 : !> \param bend_kbs32 ...
2119 : !> \param bend_kss ...
2120 : !> \param bend_legendre ...
2121 : !> \param section ...
2122 : !> \param start ...
2123 : !> \author teo
2124 : ! **************************************************************************************************
2125 939 : SUBROUTINE read_bends_section(bend_kind, bend_a, bend_b, bend_c, bend_k, bend_theta0, bend_cb, &
2126 : bend_r012, bend_r032, bend_kbs12, bend_kbs32, bend_kss, bend_legendre, &
2127 : section, start)
2128 : INTEGER, DIMENSION(:), POINTER :: bend_kind
2129 : CHARACTER(LEN=default_string_length), &
2130 : DIMENSION(:), POINTER :: bend_a, bend_b, bend_c
2131 : REAL(KIND=dp), DIMENSION(:), POINTER :: bend_k, bend_theta0, bend_cb, bend_r012, &
2132 : bend_r032, bend_kbs12, bend_kbs32, &
2133 : bend_kss
2134 : TYPE(legendre_data_type), DIMENSION(:), POINTER :: bend_legendre
2135 : TYPE(section_vals_type), POINTER :: section
2136 : INTEGER, INTENT(IN) :: start
2137 :
2138 : CHARACTER(LEN=default_string_length), &
2139 939 : DIMENSION(:), POINTER :: atm_names
2140 : INTEGER :: isec, k, n_items, n_rep
2141 939 : REAL(KIND=dp), DIMENSION(:), POINTER :: Kvals, r_values
2142 :
2143 939 : NULLIFY (Kvals, atm_names)
2144 939 : CALL section_vals_get(section, n_repetition=n_items)
2145 3060 : bend_legendre%order = 0
2146 3060 : DO isec = 1, n_items
2147 2121 : CALL section_vals_val_get(section, "KIND", i_rep_section=isec, i_val=bend_kind(start + isec))
2148 2121 : CALL section_vals_val_get(section, "ATOMS", i_rep_section=isec, c_vals=atm_names)
2149 2121 : bend_a(start + isec) = atm_names(1)
2150 2121 : bend_b(start + isec) = atm_names(2)
2151 2121 : bend_c(start + isec) = atm_names(3)
2152 2121 : CALL uppercase(bend_a(start + isec))
2153 2121 : CALL uppercase(bend_b(start + isec))
2154 2121 : CALL uppercase(bend_c(start + isec))
2155 2121 : CALL section_vals_val_get(section, "K", i_rep_section=isec, r_vals=Kvals)
2156 2121 : CPASSERT(SIZE(Kvals) == 1)
2157 2121 : bend_k(start + isec) = Kvals(1)
2158 2121 : CALL section_vals_val_get(section, "THETA0", i_rep_section=isec, r_val=bend_theta0(start + isec))
2159 2121 : CALL section_vals_val_get(section, "CB", i_rep_section=isec, r_val=bend_cb(start + isec))
2160 2121 : CALL section_vals_val_get(section, "R012", i_rep_section=isec, r_val=bend_r012(start + isec))
2161 2121 : CALL section_vals_val_get(section, "R032", i_rep_section=isec, r_val=bend_r032(start + isec))
2162 2121 : CALL section_vals_val_get(section, "KBS12", i_rep_section=isec, r_val=bend_kbs12(start + isec))
2163 2121 : CALL section_vals_val_get(section, "KBS32", i_rep_section=isec, r_val=bend_kbs32(start + isec))
2164 2121 : CALL section_vals_val_get(section, "KSS", i_rep_section=isec, r_val=bend_kss(start + isec))
2165 : ! get legendre based data
2166 2121 : CALL section_vals_val_get(section, "LEGENDRE", i_rep_section=isec, n_rep_val=n_rep)
2167 5181 : DO k = 1, n_rep
2168 2121 : CALL section_vals_val_get(section, "LEGENDRE", i_rep_val=k, r_vals=r_values, i_rep_section=isec)
2169 2121 : bend_legendre(start + isec)%order = SIZE(r_values)
2170 2121 : IF (ASSOCIATED(bend_legendre(start + isec)%coeffs)) THEN
2171 0 : DEALLOCATE (bend_legendre(start + isec)%coeffs)
2172 : END IF
2173 6363 : ALLOCATE (bend_legendre(start + isec)%coeffs(bend_legendre(start + isec)%order))
2174 10685 : bend_legendre(start + isec)%coeffs = r_values
2175 : END DO
2176 : END DO
2177 939 : END SUBROUTINE read_bends_section
2178 :
2179 : ! **************************************************************************************************
2180 : !> \brief ...
2181 : !> \param ub_kind ...
2182 : !> \param ub_a ...
2183 : !> \param ub_b ...
2184 : !> \param ub_c ...
2185 : !> \param ub_k ...
2186 : !> \param ub_r0 ...
2187 : !> \param section ...
2188 : !> \param start ...
2189 : ! **************************************************************************************************
2190 939 : SUBROUTINE read_ubs_section(ub_kind, ub_a, ub_b, ub_c, ub_k, ub_r0, section, start)
2191 : INTEGER, DIMENSION(:), POINTER :: ub_kind
2192 : CHARACTER(LEN=default_string_length), &
2193 : DIMENSION(:), POINTER :: ub_a, ub_b, ub_c
2194 : REAL(KIND=dp), DIMENSION(:, :), POINTER :: ub_k
2195 : REAL(KIND=dp), DIMENSION(:), POINTER :: ub_r0
2196 : TYPE(section_vals_type), POINTER :: section
2197 : INTEGER, INTENT(IN) :: start
2198 :
2199 : CHARACTER(LEN=default_string_length), &
2200 939 : DIMENSION(:), POINTER :: atm_names
2201 : INTEGER :: isec, k, n_items
2202 : LOGICAL :: explicit
2203 939 : REAL(KIND=dp), DIMENSION(:), POINTER :: Kvals
2204 : TYPE(section_vals_type), POINTER :: subsection
2205 :
2206 939 : NULLIFY (atm_names)
2207 939 : CALL section_vals_get(section, n_repetition=n_items)
2208 3060 : DO isec = 1, n_items
2209 2121 : subsection => section_vals_get_subs_vals(section, "UB", i_rep_section=isec)
2210 2121 : CALL section_vals_get(subsection, explicit=explicit)
2211 3060 : IF (explicit) THEN
2212 4 : CALL section_vals_val_get(subsection, "KIND", i_val=ub_kind(start + isec))
2213 4 : CALL section_vals_val_get(section, "ATOMS", i_rep_section=isec, c_vals=atm_names)
2214 4 : ub_a(start + isec) = atm_names(1)
2215 4 : ub_b(start + isec) = atm_names(2)
2216 4 : ub_c(start + isec) = atm_names(3)
2217 4 : CALL uppercase(ub_a(start + isec))
2218 4 : CALL uppercase(ub_b(start + isec))
2219 4 : CALL uppercase(ub_c(start + isec))
2220 4 : CALL section_vals_val_get(subsection, "K", r_vals=Kvals)
2221 4 : CPASSERT(SIZE(Kvals) <= 3)
2222 16 : ub_k(:, start + isec) = 0.0_dp
2223 12 : DO k = 1, SIZE(Kvals)
2224 12 : ub_k(k, start + isec) = Kvals(k)
2225 : END DO
2226 4 : CALL section_vals_val_get(subsection, "R0", r_val=ub_r0(start + isec))
2227 : END IF
2228 : END DO
2229 939 : END SUBROUTINE read_ubs_section
2230 :
2231 : ! **************************************************************************************************
2232 : !> \brief Reads the TORSIONS section
2233 : !> \param torsion_kind ...
2234 : !> \param torsion_a ...
2235 : !> \param torsion_b ...
2236 : !> \param torsion_c ...
2237 : !> \param torsion_d ...
2238 : !> \param torsion_k ...
2239 : !> \param torsion_phi0 ...
2240 : !> \param torsion_m ...
2241 : !> \param section ...
2242 : !> \param start ...
2243 : !> \author teo
2244 : ! **************************************************************************************************
2245 6 : SUBROUTINE read_torsions_section(torsion_kind, torsion_a, torsion_b, torsion_c, torsion_d, torsion_k, &
2246 : torsion_phi0, torsion_m, section, start)
2247 : INTEGER, DIMENSION(:), POINTER :: torsion_kind
2248 : CHARACTER(LEN=default_string_length), &
2249 : DIMENSION(:), POINTER :: torsion_a, torsion_b, torsion_c, &
2250 : torsion_d
2251 : REAL(KIND=dp), DIMENSION(:), POINTER :: torsion_k, torsion_phi0
2252 : INTEGER, DIMENSION(:), POINTER :: torsion_m
2253 : TYPE(section_vals_type), POINTER :: section
2254 : INTEGER, INTENT(IN) :: start
2255 :
2256 : CHARACTER(LEN=default_string_length), &
2257 6 : DIMENSION(:), POINTER :: atm_names
2258 : INTEGER :: isec, n_items
2259 :
2260 6 : NULLIFY (atm_names)
2261 6 : CALL section_vals_get(section, n_repetition=n_items)
2262 44 : DO isec = 1, n_items
2263 38 : CALL section_vals_val_get(section, "KIND", i_rep_section=isec, i_val=torsion_kind(start + isec))
2264 38 : CALL section_vals_val_get(section, "ATOMS", i_rep_section=isec, c_vals=atm_names)
2265 38 : torsion_a(start + isec) = atm_names(1)
2266 38 : torsion_b(start + isec) = atm_names(2)
2267 38 : torsion_c(start + isec) = atm_names(3)
2268 38 : torsion_d(start + isec) = atm_names(4)
2269 38 : CALL uppercase(torsion_a(start + isec))
2270 38 : CALL uppercase(torsion_b(start + isec))
2271 38 : CALL uppercase(torsion_c(start + isec))
2272 38 : CALL uppercase(torsion_d(start + isec))
2273 38 : CALL section_vals_val_get(section, "K", i_rep_section=isec, r_val=torsion_k(start + isec))
2274 38 : CALL section_vals_val_get(section, "PHI0", i_rep_section=isec, r_val=torsion_phi0(start + isec))
2275 38 : CALL section_vals_val_get(section, "M", i_rep_section=isec, i_val=torsion_m(start + isec))
2276 : ! Modify parameterisation for OPLS case
2277 44 : IF (torsion_kind(start + isec) == do_ff_opls) THEN
2278 12 : IF (torsion_phi0(start + isec) /= 0.0_dp) THEN
2279 : CALL cp_warn(__LOCATION__, "PHI0 parameter was non-zero "// &
2280 0 : "for an OPLS-type TORSION. It will be ignored.")
2281 : END IF
2282 12 : IF (MODULO(torsion_m(start + isec), 2) == 0) THEN
2283 : ! For even M, negate the cosine using a Pi phase factor
2284 2 : torsion_phi0(start + isec) = pi
2285 : END IF
2286 : ! the K parameter appears as K/2 in the OPLS parameterisation
2287 12 : torsion_k(start + isec) = torsion_k(start + isec)*0.5_dp
2288 : END IF
2289 : END DO
2290 6 : END SUBROUTINE read_torsions_section
2291 :
2292 : ! **************************************************************************************************
2293 : !> \brief Reads the IMPROPER section
2294 : !> \param impr_kind ...
2295 : !> \param impr_a ...
2296 : !> \param impr_b ...
2297 : !> \param impr_c ...
2298 : !> \param impr_d ...
2299 : !> \param impr_k ...
2300 : !> \param impr_phi0 ...
2301 : !> \param section ...
2302 : !> \param start ...
2303 : !> \author louis vanduyfhuys
2304 : ! **************************************************************************************************
2305 8 : SUBROUTINE read_improper_section(impr_kind, impr_a, impr_b, impr_c, impr_d, impr_k, &
2306 : impr_phi0, section, start)
2307 : INTEGER, DIMENSION(:), POINTER :: impr_kind
2308 : CHARACTER(LEN=default_string_length), &
2309 : DIMENSION(:), POINTER :: impr_a, impr_b, impr_c, impr_d
2310 : REAL(KIND=dp), DIMENSION(:), POINTER :: impr_k, impr_phi0
2311 : TYPE(section_vals_type), POINTER :: section
2312 : INTEGER, INTENT(IN) :: start
2313 :
2314 : CHARACTER(LEN=default_string_length), &
2315 8 : DIMENSION(:), POINTER :: atm_names
2316 : INTEGER :: isec, n_items
2317 :
2318 8 : NULLIFY (atm_names)
2319 8 : CALL section_vals_get(section, n_repetition=n_items)
2320 16 : DO isec = 1, n_items
2321 8 : CALL section_vals_val_get(section, "KIND", i_rep_section=isec, i_val=impr_kind(start + isec))
2322 8 : CALL section_vals_val_get(section, "ATOMS", i_rep_section=isec, c_vals=atm_names)
2323 8 : impr_a(start + isec) = atm_names(1)
2324 8 : impr_b(start + isec) = atm_names(2)
2325 8 : impr_c(start + isec) = atm_names(3)
2326 8 : impr_d(start + isec) = atm_names(4)
2327 8 : CALL uppercase(impr_a(start + isec))
2328 8 : CALL uppercase(impr_b(start + isec))
2329 8 : CALL uppercase(impr_c(start + isec))
2330 8 : CALL uppercase(impr_d(start + isec))
2331 8 : CALL section_vals_val_get(section, "K", i_rep_section=isec, r_val=impr_k(start + isec))
2332 16 : CALL section_vals_val_get(section, "PHI0", i_rep_section=isec, r_val=impr_phi0(start + isec))
2333 : END DO
2334 8 : END SUBROUTINE read_improper_section
2335 :
2336 : ! **************************************************************************************************
2337 : !> \brief Reads the OPBEND section
2338 : !> \param opbend_kind ...
2339 : !> \param opbend_a ...
2340 : !> \param opbend_b ...
2341 : !> \param opbend_c ...
2342 : !> \param opbend_d ...
2343 : !> \param opbend_k ...
2344 : !> \param opbend_phi0 ...
2345 : !> \param section ...
2346 : !> \param start ...
2347 : !> \author louis vanduyfhuys
2348 : ! **************************************************************************************************
2349 2 : SUBROUTINE read_opbend_section(opbend_kind, opbend_a, opbend_b, opbend_c, opbend_d, opbend_k, &
2350 : opbend_phi0, section, start)
2351 : INTEGER, DIMENSION(:), POINTER :: opbend_kind
2352 : CHARACTER(LEN=default_string_length), &
2353 : DIMENSION(:), POINTER :: opbend_a, opbend_b, opbend_c, opbend_d
2354 : REAL(KIND=dp), DIMENSION(:), POINTER :: opbend_k, opbend_phi0
2355 : TYPE(section_vals_type), POINTER :: section
2356 : INTEGER, INTENT(IN) :: start
2357 :
2358 : CHARACTER(LEN=default_string_length), &
2359 2 : DIMENSION(:), POINTER :: atm_names
2360 : INTEGER :: isec, n_items
2361 :
2362 2 : NULLIFY (atm_names)
2363 2 : CALL section_vals_get(section, n_repetition=n_items)
2364 4 : DO isec = 1, n_items
2365 2 : CALL section_vals_val_get(section, "KIND", i_rep_section=isec, i_val=opbend_kind(start + isec))
2366 2 : CALL section_vals_val_get(section, "ATOMS", i_rep_section=isec, c_vals=atm_names)
2367 2 : opbend_a(start + isec) = atm_names(1)
2368 2 : opbend_b(start + isec) = atm_names(2)
2369 2 : opbend_c(start + isec) = atm_names(3)
2370 2 : opbend_d(start + isec) = atm_names(4)
2371 2 : CALL uppercase(opbend_a(start + isec))
2372 2 : CALL uppercase(opbend_b(start + isec))
2373 2 : CALL uppercase(opbend_c(start + isec))
2374 2 : CALL uppercase(opbend_d(start + isec))
2375 2 : CALL section_vals_val_get(section, "K", i_rep_section=isec, r_val=opbend_k(start + isec))
2376 4 : CALL section_vals_val_get(section, "PHI0", i_rep_section=isec, r_val=opbend_phi0(start + isec))
2377 : END DO
2378 2 : END SUBROUTINE read_opbend_section
2379 :
2380 : ! **************************************************************************************************
2381 : !> \brief Reads the force_field input section
2382 : !> \param ff_type ...
2383 : !> \param para_env ...
2384 : !> \param mm_section ...
2385 : !> \par History
2386 : !> JGH (30.11.2001) : moved determination of setup variables to
2387 : !> molecule_input
2388 : !> \author CJM
2389 : ! **************************************************************************************************
2390 2637 : SUBROUTINE read_force_field_section(ff_type, para_env, mm_section)
2391 : TYPE(force_field_type), INTENT(INOUT) :: ff_type
2392 : TYPE(mp_para_env_type), POINTER :: para_env
2393 : TYPE(section_vals_type), POINTER :: mm_section
2394 :
2395 : TYPE(section_vals_type), POINTER :: ff_section
2396 :
2397 : NULLIFY (ff_section)
2398 2637 : ff_section => section_vals_get_subs_vals(mm_section, "FORCEFIELD")
2399 2637 : CALL read_force_field_section1(ff_section, mm_section, ff_type, para_env)
2400 2637 : END SUBROUTINE read_force_field_section
2401 :
2402 : ! **************************************************************************************************
2403 : !> \brief reads EAM potential from library
2404 : !> \param eam ...
2405 : !> \param para_env ...
2406 : !> \param mm_section ...
2407 : ! **************************************************************************************************
2408 40 : SUBROUTINE read_eam_data(eam, para_env, mm_section)
2409 : TYPE(eam_pot_type), POINTER :: eam
2410 : TYPE(mp_para_env_type), POINTER :: para_env
2411 : TYPE(section_vals_type), POINTER :: mm_section
2412 :
2413 : CHARACTER(len=*), PARAMETER :: routineN = 'read_eam_data'
2414 :
2415 : INTEGER :: handle, i, iw
2416 : TYPE(cp_logger_type), POINTER :: logger
2417 : TYPE(cp_parser_type) :: parser
2418 :
2419 20 : CALL timeset(routineN, handle)
2420 20 : NULLIFY (logger)
2421 20 : logger => cp_get_default_logger()
2422 : iw = cp_print_key_unit_nr(logger, mm_section, "PRINT%FF_INFO", &
2423 20 : extension=".mmLog")
2424 20 : IF (iw > 0) WRITE (iw, *) "Reading EAM data from: ", TRIM(eam%eam_file_name)
2425 20 : CALL parser_create(parser, TRIM(eam%eam_file_name), para_env=para_env)
2426 :
2427 20 : CALL parser_get_next_line(parser, 1)
2428 20 : IF (iw > 0) WRITE (iw, *) "Title: ", parser%input_line
2429 :
2430 20 : CALL parser_get_next_line(parser, 2)
2431 20 : READ (parser%input_line, *) eam%drar, eam%drhoar, eam%acutal, eam%npoints
2432 20 : eam%drar = cp_unit_to_cp2k(eam%drar, "angstrom")
2433 20 : eam%acutal = cp_unit_to_cp2k(eam%acutal, "angstrom")
2434 : ! Relocating arrays with the right size
2435 20 : CALL reallocate(eam%rho, 1, eam%npoints)
2436 20 : CALL reallocate(eam%rhop, 1, eam%npoints)
2437 20 : CALL reallocate(eam%rval, 1, eam%npoints)
2438 20 : CALL reallocate(eam%rhoval, 1, eam%npoints)
2439 20 : CALL reallocate(eam%phi, 1, eam%npoints)
2440 20 : CALL reallocate(eam%phip, 1, eam%npoints)
2441 20 : CALL reallocate(eam%frho, 1, eam%npoints)
2442 20 : CALL reallocate(eam%frhop, 1, eam%npoints)
2443 : ! Reading density and derivative of density (with respect to r)
2444 64020 : DO i = 1, eam%npoints
2445 64000 : CALL parser_get_next_line(parser, 1)
2446 64000 : READ (parser%input_line, *) eam%rho(i), eam%rhop(i)
2447 64000 : eam%rhop(i) = cp_unit_to_cp2k(eam%rhop(i), "angstrom^-1")
2448 64000 : eam%rval(i) = REAL(i - 1, KIND=dp)*eam%drar
2449 64020 : eam%rhoval(i) = REAL(i - 1, KIND=dp)*eam%drhoar
2450 : END DO
2451 : ! Reading pair potential PHI and its derivative (with respect to r)
2452 64020 : DO i = 1, eam%npoints
2453 64000 : CALL parser_get_next_line(parser, 1)
2454 64000 : READ (parser%input_line, *) eam%phi(i), eam%phip(i)
2455 64000 : eam%phi(i) = cp_unit_to_cp2k(eam%phi(i), "eV")
2456 64020 : eam%phip(i) = cp_unit_to_cp2k(eam%phip(i), "eV*angstrom^-1")
2457 : END DO
2458 : ! Reading embedded function and its derivative (with respect to density)
2459 64020 : DO i = 1, eam%npoints
2460 64000 : CALL parser_get_next_line(parser, 1)
2461 64000 : READ (parser%input_line, *) eam%frho(i), eam%frhop(i)
2462 64000 : eam%frho(i) = cp_unit_to_cp2k(eam%frho(i), "eV")
2463 64020 : eam%frhop(i) = cp_unit_to_cp2k(eam%frhop(i), "eV")
2464 : END DO
2465 :
2466 20 : IF (iw > 0) WRITE (iw, *) "Finished EAM data"
2467 20 : CALL parser_release(parser)
2468 20 : CALL cp_print_key_finished_output(iw, logger, mm_section, "PRINT%FF_INFO")
2469 20 : CALL timestop(handle)
2470 :
2471 60 : END SUBROUTINE read_eam_data
2472 :
2473 : ! **************************************************************************************************
2474 : !> \brief reads NequIP potential from .pth file
2475 : !> \param nequip ...
2476 : !> \author Gabriele Tocci
2477 : ! **************************************************************************************************
2478 6 : SUBROUTINE read_nequip_data(nequip)
2479 : TYPE(nequip_pot_type) :: nequip
2480 :
2481 : CHARACTER(LEN=*), PARAMETER :: routineN = 'read_nequip_data'
2482 :
2483 6 : CHARACTER(LEN=100), ALLOCATABLE, DIMENSION(:) :: tokenized_string
2484 : CHARACTER(LEN=4000) :: cutoff_matrix_str
2485 : CHARACTER(LEN=default_path_length) :: allow_tf32_str, cutoff_str, model_dtype, &
2486 : num_types_str, types_str
2487 : INTEGER :: handle, i, j, k, len_path
2488 : LOGICAL :: allow_tf32, found_model_file
2489 : REAL(KIND=dp) :: cut_val
2490 :
2491 6 : CALL timeset(routineN, handle)
2492 :
2493 6 : INQUIRE (FILE=nequip%pot_file_name, EXIST=found_model_file)
2494 6 : IF (.NOT. found_model_file) THEN
2495 : CALL cp_abort(__LOCATION__, &
2496 : "Nequip model file <"//TRIM(nequip%pot_file_name)// &
2497 0 : "> not found.")
2498 : END IF
2499 :
2500 6 : len_path = LEN_TRIM(nequip%pot_file_name)
2501 6 : IF (len_path >= 4) THEN
2502 6 : IF (nequip%pot_file_name(len_path - 3:len_path) == ".pt2") THEN
2503 : CALL cp_abort(__LOCATION__, &
2504 : "AOT compiled models (.pt2) are not yet supported in CP2K. " &
2505 0 : //"Please use TorchScript (.pth or .pt) models compiled with nequip-compile.")
2506 : END IF
2507 : END IF
2508 :
2509 6 : num_types_str = torch_model_read_metadata(nequip%pot_file_name, "num_types")
2510 6 : READ (num_types_str, *) nequip%num_types
2511 6 : cutoff_str = torch_model_read_metadata(nequip%pot_file_name, "r_max")
2512 6 : types_str = torch_model_read_metadata(nequip%pot_file_name, "type_names")
2513 6 : CALL tokenize_string(TRIM(types_str), tokenized_string)
2514 :
2515 6 : IF (SIZE(tokenized_string) /= nequip%num_types) THEN
2516 : CALL cp_abort(__LOCATION__, &
2517 0 : "NequIP Metadata Error: 'num_types' does not match count of 'type_names'")
2518 : END IF
2519 :
2520 6 : IF (ALLOCATED(nequip%type_names_torch)) THEN
2521 0 : DEALLOCATE (nequip%type_names_torch)
2522 : END IF
2523 18 : ALLOCATE (nequip%type_names_torch(SIZE(tokenized_string)))
2524 36 : nequip%type_names_torch(:) = tokenized_string(:)
2525 :
2526 6 : IF (ALLOCATED(nequip%cutoff_matrix)) DEALLOCATE (nequip%cutoff_matrix)
2527 24 : ALLOCATE (nequip%cutoff_matrix(nequip%num_types, nequip%num_types))
2528 :
2529 6 : READ (cutoff_str, *) nequip%rcutsq
2530 6 : nequip%rcutsq = cp_unit_to_cp2k(nequip%rcutsq, nequip%unit_length)
2531 6 : nequip%rcutsq = nequip%rcutsq*nequip%rcutsq
2532 6 : nequip%unit_length_val = cp_unit_to_cp2k(nequip%unit_length_val, nequip%unit_length)
2533 6 : nequip%unit_forces_val = cp_unit_to_cp2k(nequip%unit_forces_val, nequip%unit_forces)
2534 6 : nequip%unit_energy_val = cp_unit_to_cp2k(nequip%unit_energy_val, nequip%unit_energy)
2535 :
2536 6 : cutoff_matrix_str = torch_model_read_metadata(nequip%pot_file_name, "per_edge_type_cutoff")
2537 :
2538 6 : IF (LEN_TRIM(cutoff_matrix_str) > 0) THEN
2539 0 : CALL tokenize_string(TRIM(cutoff_matrix_str), tokenized_string)
2540 :
2541 0 : IF (SIZE(tokenized_string) /= nequip%num_types**2) THEN
2542 0 : CALL cp_abort(__LOCATION__, "per_edge_type_cutoff size does not match num_types^2")
2543 : END IF
2544 :
2545 0 : k = 0
2546 0 : DO i = 1, nequip%num_types
2547 0 : DO j = 1, nequip%num_types
2548 0 : k = k + 1
2549 0 : READ (tokenized_string(k), *) cut_val
2550 0 : cut_val = cp_unit_to_cp2k(cut_val, nequip%unit_length)
2551 0 : nequip%cutoff_matrix(i, j) = cut_val*cut_val
2552 : END DO
2553 : END DO
2554 : ELSE
2555 : ! Fallback: Fill with global r_max squared
2556 294 : nequip%cutoff_matrix(:, :) = nequip%rcutsq
2557 : END IF
2558 :
2559 6 : model_dtype = torch_model_read_metadata(nequip%pot_file_name, "model_dtype")
2560 6 : IF (TRIM(model_dtype) == "float32") THEN
2561 0 : nequip%mixed_precision = .TRUE.
2562 6 : ELSE IF (TRIM(model_dtype) == "float64") THEN
2563 6 : nequip%mixed_precision = .FALSE.
2564 : END IF
2565 :
2566 6 : allow_tf32_str = torch_model_read_metadata(nequip%pot_file_name, "allow_tf32")
2567 6 : allow_tf32 = (TRIM(allow_tf32_str) == "1")
2568 6 : IF (TRIM(allow_tf32_str) /= "1" .AND. TRIM(allow_tf32_str) /= "0") THEN
2569 : CALL cp_abort(__LOCATION__, &
2570 : "The value for allow_tf32 <"//TRIM(allow_tf32_str)// &
2571 0 : "> is not supported. Check the .yaml and .pth files.")
2572 : END IF
2573 6 : CALL torch_allow_tf32(allow_tf32)
2574 :
2575 6 : CALL timestop(handle)
2576 12 : END SUBROUTINE read_nequip_data
2577 :
2578 : ! **************************************************************************************************
2579 : !> \brief returns tokenized string of kinds from .pth file
2580 : !> \param element ...
2581 : !> \param tokenized_array ...
2582 : !> \author Maria Bilichenko
2583 : ! **************************************************************************************************
2584 6 : SUBROUTINE tokenize_string(element, tokenized_array)
2585 : CHARACTER(LEN=*), INTENT(IN) :: element
2586 : CHARACTER(LEN=100), ALLOCATABLE, DIMENSION(:), &
2587 : INTENT(OUT) :: tokenized_array
2588 :
2589 : CHARACTER(LEN=1) :: ch
2590 : CHARACTER(LEN=100) :: current
2591 : INTEGER :: i, L, n
2592 :
2593 6 : L = LEN_TRIM(element)
2594 :
2595 6 : n = 0
2596 6 : current = ""
2597 76 : DO i = 1, L
2598 70 : ch = element(i:i)
2599 :
2600 76 : IF ((ch >= 'A' .AND. ch <= 'Z') .OR. (ch >= 'a' .AND. ch <= 'z')) THEN
2601 46 : current(LEN_TRIM(current) + 1:LEN_TRIM(current) + 1) = ch
2602 : ELSE
2603 24 : IF (LEN_TRIM(current) > 0) THEN
2604 24 : n = n + 1
2605 24 : current = ""
2606 : END IF
2607 : END IF
2608 : END DO
2609 6 : IF (LEN_TRIM(current) > 0) n = n + 1
2610 :
2611 18 : ALLOCATE (tokenized_array(n))
2612 :
2613 6 : n = 0
2614 6 : current = ""
2615 76 : DO i = 1, L
2616 70 : ch = element(i:i)
2617 76 : IF ((ch >= 'A' .AND. ch <= 'Z') .OR. (ch >= 'a' .AND. ch <= 'z')) THEN
2618 46 : current(LEN_TRIM(current) + 1:LEN_TRIM(current) + 1) = ch
2619 : ELSE
2620 24 : IF (LEN_TRIM(current) > 0) THEN
2621 24 : n = n + 1
2622 24 : tokenized_array(n) = TRIM(current)
2623 24 : current = ""
2624 : END IF
2625 : END IF
2626 : END DO
2627 6 : IF (LEN_TRIM(current) > 0) THEN
2628 6 : n = n + 1
2629 6 : tokenized_array(n) = TRIM(current)
2630 : END IF
2631 6 : END SUBROUTINE tokenize_string
2632 :
2633 : ! **************************************************************************************************
2634 : !> \brief checks if all the ATOMS from *.inp file are available in *.pth file
2635 : !> \param cp2k_inp_atom_types ...
2636 : !> \param torch_atom_types ...
2637 : !> \author Maria Bilichenko
2638 : ! **************************************************************************************************
2639 6 : SUBROUTINE check_cp2k_atom_names_in_torch(cp2k_inp_atom_types, torch_atom_types)
2640 : CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: cp2k_inp_atom_types, torch_atom_types
2641 :
2642 : INTEGER :: i, j
2643 : LOGICAL :: found_atom
2644 :
2645 16 : DO i = 1, SIZE(cp2k_inp_atom_types)
2646 10 : found_atom = .FALSE.
2647 24 : DO j = 1, SIZE(torch_atom_types)
2648 24 : IF (TRIM(cp2k_inp_atom_types(i)) == TRIM(torch_atom_types(j))) THEN
2649 : found_atom = .TRUE.
2650 : EXIT
2651 : END IF
2652 : END DO
2653 16 : IF (.NOT. found_atom) THEN
2654 : CALL cp_abort(__LOCATION__, &
2655 : "Atom "//TRIM(cp2k_inp_atom_types(i))// &
2656 0 : " is defined in the CP2K input file but is missing in the torch model file")
2657 : END IF
2658 : END DO
2659 6 : END SUBROUTINE check_cp2k_atom_names_in_torch
2660 :
2661 : ! **************************************************************************************************
2662 : !> \brief reads TABPOT potential from file
2663 : !> \param tab ...
2664 : !> \param para_env ...
2665 : !> \param mm_section ...
2666 : !> \author Da Teng, Alex Mironenko
2667 : ! **************************************************************************************************
2668 48 : SUBROUTINE read_tabpot_data(tab, para_env, mm_section)
2669 : TYPE(tab_pot_type), POINTER :: tab
2670 : TYPE(mp_para_env_type), POINTER :: para_env
2671 : TYPE(section_vals_type), POINTER :: mm_section
2672 :
2673 : CHARACTER(len=*), PARAMETER :: routineN = 'read_tabpot_data'
2674 :
2675 : CHARACTER :: d1, d2
2676 : INTEGER :: d, handle, i, iw
2677 : TYPE(cp_logger_type), POINTER :: logger
2678 : TYPE(cp_parser_type) :: parser
2679 :
2680 24 : CALL timeset(routineN, handle)
2681 24 : NULLIFY (logger)
2682 24 : logger => cp_get_default_logger()
2683 : iw = cp_print_key_unit_nr(logger, mm_section, "PRINT%FF_INFO", &
2684 24 : extension=".mmLog")
2685 24 : IF (iw > 0) WRITE (iw, *) "Reading TABPOT data from: ", TRIM(tab%tabpot_file_name)
2686 24 : CALL parser_create(parser, TRIM(tab%tabpot_file_name), para_env=para_env)
2687 24 : CALL parser_get_next_line(parser, 1)
2688 24 : IF (iw > 0) WRITE (iw, *) "Title: ", parser%input_line
2689 24 : CALL parser_get_next_line(parser, 1)
2690 :
2691 : ! example format: N 1000 R 1.00 20.0
2692 : ! Assume the data is evenly spaced
2693 24 : READ (parser%input_line, *) d1, tab%npoints, d2, tab%dr, tab%rcut
2694 :
2695 : ! Relocating arrays with the right size
2696 24 : CALL reallocate(tab%r, 1, tab%npoints)
2697 24 : CALL reallocate(tab%e, 1, tab%npoints)
2698 24 : CALL reallocate(tab%f, 1, tab%npoints)
2699 :
2700 : ! Reading r, e, f
2701 21912 : DO i = 1, tab%npoints
2702 21888 : CALL parser_get_next_line(parser, 1)
2703 21888 : READ (parser%input_line, *) d, tab%r(i), tab%e(i), tab%f(i)
2704 21888 : tab%r(i) = cp_unit_to_cp2k(tab%r(i), "angstrom")
2705 21888 : tab%e(i) = cp_unit_to_cp2k(tab%e(i), "kcalmol")
2706 21912 : tab%f(i) = cp_unit_to_cp2k(tab%f(i), "kcalmol*angstrom^-1")
2707 : END DO
2708 :
2709 24 : tab%dr = tab%r(2) - tab%r(1)
2710 24 : tab%rcut = cp_unit_to_cp2k(tab%rcut, "angstrom")
2711 :
2712 24 : IF (iw > 0) WRITE (iw, *) "Finished TABPOT data"
2713 24 : CALL parser_release(parser)
2714 24 : CALL cp_print_key_finished_output(iw, logger, mm_section, "PRINT%FF_INFO")
2715 24 : CALL timestop(handle)
2716 72 : END SUBROUTINE read_tabpot_data
2717 : END MODULE force_fields_input
|