(git:1f9fd2c)
Loading...
Searching...
No Matches
atoms_input.F
Go to the documentation of this file.
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!> cjm, Feb-20-2001 : added all the extended variables to
11!> system_type
12!> gt 23-09-2002 : major changes. Pointer part is allocated/deallocated
13!> and initialized here. Atomic coordinates can now be
14!> read also from &COORD section in the input file.
15!> If &COORD is not found, .dat file is read.
16!> If & coord is found and .NOT. 'INIT', parsing of the .dat
17!> is performed to get the proper coords/vel/eta variables
18!> CJM 31-7-03 : Major rewrite. No more atype
19! **************************************************************************************************
24 cell_type,&
25 pbc,&
32 USE cp_units, ONLY: cp_unit_to_cp2k
39 USE input_val_types, ONLY: val_get,&
41 USE kinds, ONLY: default_string_length,&
42 dp
46 USE string_table, ONLY: id2str,&
47 s2s,&
48 str2id
52#include "./base/base_uses.f90"
53
54 IMPLICIT NONE
55
56 PRIVATE
58 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'atoms_input'
59
60CONTAINS
61
62! **************************************************************************************************
63!> \brief ...
64!> \param topology ...
65!> \param overwrite ...
66!> \param subsys_section ...
67!> \param save_mem ...
68!> \author CJM
69! **************************************************************************************************
70 SUBROUTINE read_atoms_input(topology, overwrite, subsys_section, save_mem)
71
73 LOGICAL, INTENT(IN), OPTIONAL :: overwrite
74 TYPE(section_vals_type), POINTER :: subsys_section
75 LOGICAL, INTENT(IN), OPTIONAL :: save_mem
76
77 CHARACTER(len=*), PARAMETER :: routinen = 'read_atoms_input'
78
79 CHARACTER(len=2*default_string_length) :: line_att
80 CHARACTER(len=default_string_length) :: error_message, my_default_index, strtmp, &
81 unit_str
82 INTEGER :: default_id, end_c, handle, iatom, j, &
83 natom, output_unit, start_c, wrd
84 LOGICAL :: explicit, is_ok, my_overwrite, &
85 my_save_mem, scaled_coordinates
86 REAL(kind=dp) :: r0(3), unit_conv
87 TYPE(atom_info_type), POINTER :: atom_info
88 TYPE(cell_type), POINTER :: cell
89 TYPE(cp_sll_val_type), POINTER :: list
90 TYPE(section_vals_type), POINTER :: coord_section
91 TYPE(val_type), POINTER :: val
92
93 my_overwrite = .false.
94 my_save_mem = .false.
95 error_message = ""
96 output_unit = cp_logger_get_default_io_unit()
97 IF (PRESENT(overwrite)) my_overwrite = overwrite
98 IF (PRESENT(save_mem)) my_save_mem = save_mem
99 NULLIFY (coord_section)
100 coord_section => section_vals_get_subs_vals(subsys_section, "COORD")
101 CALL section_vals_get(coord_section, explicit=explicit)
102 IF (.NOT. explicit) RETURN
103
104 CALL timeset(routinen, handle)
105 !-----------------------------------------------------------------------------
106 !-----------------------------------------------------------------------------
107 ! 1. get cell and topology%atom_info
108 !-----------------------------------------------------------------------------
109 atom_info => topology%atom_info
110 cell => topology%cell_muc
111 CALL section_vals_val_get(coord_section, "UNIT", c_val=unit_str)
112 CALL section_vals_val_get(coord_section, "SCALED", l_val=scaled_coordinates)
113 unit_conv = cp_unit_to_cp2k(1.0_dp, trim(unit_str))
114
115 !-----------------------------------------------------------------------------
116 !-----------------------------------------------------------------------------
117 ! 2. Read in the coordinates from &COORD section in the input file
118 !-----------------------------------------------------------------------------
119 CALL section_vals_val_get(coord_section, "_DEFAULT_KEYWORD_", &
120 n_rep_val=natom)
121 topology%natoms = natom
122 IF (my_overwrite) THEN
123 cpassert(SIZE(atom_info%r, 2) == natom)
124 CALL cp_warn(__location__, &
125 "Overwriting coordinates. Active coordinates read from &COORD section."// &
126 " Active coordinates READ from &COORD section ")
127 CALL section_vals_list_get(coord_section, "_DEFAULT_KEYWORD_", list=list)
128 DO iatom = 1, natom
129 is_ok = cp_sll_val_next(list, val)
130 CALL val_get(val, c_val=line_att)
131 ! Read name and atomic coordinates
132 start_c = 1
133 DO wrd = 1, 4
134 DO j = start_c, len(line_att)
135 IF (line_att(j:j) /= ' ') THEN
136 start_c = j
137 EXIT
138 END IF
139 END DO
140 end_c = len(line_att) + 1
141 DO j = start_c, len(line_att)
142 IF (line_att(j:j) == ' ') THEN
143 end_c = j
144 EXIT
145 END IF
146 END DO
147 IF (len_trim(line_att(start_c:end_c - 1)) == 0) &
148 cpabort("incorrectly formatted line in coord section'"//line_att//"'")
149 IF (wrd == 1) THEN
150 atom_info%id_atmname(iatom) = str2id(s2s(line_att(start_c:end_c - 1)))
151 ELSE
152 READ (line_att(start_c:end_c - 1), *) atom_info%r(wrd - 1, iatom)
153 END IF
154 start_c = end_c
155 END DO
156 END DO
157 ELSE
158 ! Element is assigned on the basis of the atm_name
159 topology%aa_element = .true.
160
161 CALL reallocate(atom_info%id_molname, 1, natom)
162 CALL reallocate(atom_info%id_resname, 1, natom)
163 CALL reallocate(atom_info%resid, 1, natom)
164 CALL reallocate(atom_info%id_atmname, 1, natom)
165 CALL reallocate(atom_info%id_element, 1, natom)
166 CALL reallocate(atom_info%r, 1, 3, 1, natom)
167 CALL reallocate(atom_info%atm_mass, 1, natom)
168 CALL reallocate(atom_info%atm_charge, 1, natom)
169
170 CALL section_vals_list_get(coord_section, "_DEFAULT_KEYWORD_", list=list)
171 DO iatom = 1, natom
172 ! we use only the first default_string_length characters of each line
173 is_ok = cp_sll_val_next(list, val)
174 CALL val_get(val, c_val=line_att)
175 default_id = str2id(s2s(""))
176 atom_info%id_molname(iatom) = default_id
177 atom_info%id_resname(iatom) = default_id
178 atom_info%resid(iatom) = 1
179 atom_info%id_atmname(iatom) = default_id
180 atom_info%id_element(iatom) = default_id
181 topology%molname_generated = .true.
182 ! Read name and atomic coordinates
183 start_c = 1
184 DO wrd = 1, 6
185 DO j = start_c, len(line_att)
186 IF (line_att(j:j) /= ' ') THEN
187 start_c = j
188 EXIT
189 END IF
190 END DO
191 end_c = len(line_att) + 1
192 DO j = start_c, len(line_att)
193 IF (line_att(j:j) == ' ') THEN
194 end_c = j
195 EXIT
196 END IF
197 END DO
198 IF (len_trim(line_att(start_c:end_c - 1)) == 0) &
199 CALL cp_abort(__location__, &
200 "Incorrectly formatted input line for atom "// &
201 trim(adjustl(cp_to_string(iatom)))// &
202 " found in COORD section. Input line: <"// &
203 trim(line_att)//"> ")
204 SELECT CASE (wrd)
205 CASE (1)
206 atom_info%id_atmname(iatom) = str2id(s2s(line_att(start_c:end_c - 1)))
207 CASE (2:4)
208 CALL read_float_object(line_att(start_c:end_c - 1), &
209 atom_info%r(wrd - 1, iatom), error_message)
210 IF (len_trim(error_message) /= 0) &
211 CALL cp_abort(__location__, &
212 "Incorrectly formatted input line for atom "// &
213 trim(adjustl(cp_to_string(iatom)))// &
214 " found in COORD section. "//trim(error_message)// &
215 " Input line: <"//trim(line_att)//"> ")
216 CASE (5)
217 READ (line_att(start_c:end_c - 1), *) strtmp
218 atom_info%id_molname(iatom) = str2id(strtmp)
219 atom_info%id_resname(iatom) = atom_info%id_molname(iatom)
220 topology%molname_generated = .false.
221 CASE (6)
222 READ (line_att(start_c:end_c - 1), *) strtmp
223 atom_info%id_resname(iatom) = str2id(strtmp)
224 END SELECT
225 start_c = end_c
226 IF (start_c > len_trim(line_att)) EXIT
227 END DO
228 IF (topology%molname_generated) THEN
229 ! Use defaults, if no molname was specified
230 WRITE (my_default_index, '(I0)') iatom
231 atom_info%id_molname(iatom) = str2id(s2s(trim(id2str(atom_info%id_atmname(iatom)))//trim(my_default_index)))
232 atom_info%id_resname(iatom) = atom_info%id_molname(iatom)
233 END IF
234 atom_info%id_element(iatom) = atom_info%id_atmname(iatom)
235 atom_info%atm_mass(iatom) = 0.0_dp
236 atom_info%atm_charge(iatom) = -huge(0.0_dp)
237 END DO
238 END IF
239 !-----------------------------------------------------------------------------
240 !-----------------------------------------------------------------------------
241 ! 3. Convert coordinates into internal cp2k coordinates
242 !-----------------------------------------------------------------------------
243 DO iatom = 1, natom
244 IF (scaled_coordinates) THEN
245 r0 = atom_info%r(:, iatom)
246 CALL scaled_to_real(atom_info%r(:, iatom), r0, cell)
247 ELSE
248 atom_info%r(:, iatom) = atom_info%r(:, iatom)*unit_conv
249 CALL cell_transform_input_cartesian(cell, atom_info%r(:, iatom))
250 END IF
251 END DO
252 IF (my_save_mem) CALL section_vals_remove_values(coord_section)
253
254 CALL timestop(handle)
255 END SUBROUTINE read_atoms_input
256
257! **************************************************************************************************
258!> \brief ...
259!> \param particle_set ...
260!> \param shell_particle_set ...
261!> \param cell ...
262!> \param subsys_section ...
263!> \param core_particle_set ...
264!> \param save_mem ...
265!> \author MI
266! **************************************************************************************************
267 SUBROUTINE read_shell_coord_input(particle_set, shell_particle_set, cell, &
268 subsys_section, core_particle_set, save_mem)
269
270 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set, shell_particle_set
271 TYPE(cell_type), POINTER :: cell
272 TYPE(section_vals_type), POINTER :: subsys_section
273 TYPE(particle_type), DIMENSION(:), OPTIONAL, &
274 POINTER :: core_particle_set
275 LOGICAL, INTENT(IN), OPTIONAL :: save_mem
276
277 CHARACTER(len=*), PARAMETER :: routinen = 'read_shell_coord_input'
278
279 CHARACTER(len=2*default_string_length) :: line_att
280 CHARACTER(len=default_string_length) :: name_kind, unit_str
281 CHARACTER(len=default_string_length), &
282 ALLOCATABLE, DIMENSION(:) :: at_name, at_name_c
283 INTEGER :: end_c, handle, ishell, j, nshell, &
284 output_unit, sh_index, start_c, wrd
285 INTEGER, ALLOCATABLE, DIMENSION(:) :: at_index, at_index_c
286 LOGICAL :: core_scaled_coordinates, explicit, &
287 is_ok, is_shell, my_save_mem, &
288 shell_scaled_coordinates
289 REAL(kind=dp) :: dab, mass_com, rab(3), unit_conv_core, &
290 unit_conv_shell
291 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: r, rc
292 TYPE(atomic_kind_type), POINTER :: atomic_kind
293 TYPE(cp_sll_val_type), POINTER :: list
294 TYPE(section_vals_type), POINTER :: core_coord_section, shell_coord_section
295 TYPE(shell_kind_type), POINTER :: shell
296 TYPE(val_type), POINTER :: val
297
298 my_save_mem = .false.
299 NULLIFY (atomic_kind, list, shell_coord_section, shell, val)
300 output_unit = cp_logger_get_default_io_unit()
301
302 IF (PRESENT(save_mem)) my_save_mem = save_mem
303 NULLIFY (shell_coord_section, core_coord_section)
304 shell_coord_section => section_vals_get_subs_vals(subsys_section, "SHELL_COORD")
305 CALL section_vals_get(shell_coord_section, explicit=explicit)
306 IF (.NOT. explicit) RETURN
307
308 CALL timeset(routinen, handle)
309 cpassert(ASSOCIATED(particle_set))
310 !-----------------------------------------------------------------------------
311 !-----------------------------------------------------------------------------
312 ! 2. Read in the coordinates from &SHELL_COORD section in the input file
313 !-----------------------------------------------------------------------------
314 CALL section_vals_val_get(shell_coord_section, "UNIT", c_val=unit_str)
315 CALL section_vals_val_get(shell_coord_section, "SCALED", l_val=shell_scaled_coordinates)
316 unit_conv_shell = cp_unit_to_cp2k(1.0_dp, trim(unit_str))
317 CALL section_vals_val_get(shell_coord_section, "_DEFAULT_KEYWORD_", &
318 n_rep_val=nshell)
319
320 IF (ASSOCIATED(shell_particle_set)) THEN
321 cpassert((SIZE(shell_particle_set, 1) == nshell))
322 ALLOCATE (r(3, nshell), at_name(nshell), at_index(nshell))
323 CALL cp_warn(__location__, &
324 "Overwriting shell coordinates. "// &
325 "Active coordinates READ from &SHELL_COORD section. ")
326 CALL section_vals_list_get(shell_coord_section, "_DEFAULT_KEYWORD_", list=list)
327 DO ishell = 1, nshell
328 ! we use only the first default_string_length characters of each line
329 is_ok = cp_sll_val_next(list, val)
330 CALL val_get(val, c_val=line_att)
331 start_c = 1
332 DO wrd = 1, 5
333 DO j = start_c, len(line_att)
334 IF (line_att(j:j) /= ' ') THEN
335 start_c = j
336 EXIT
337 END IF
338 END DO
339 end_c = len(line_att) + 1
340 DO j = start_c, len(line_att)
341 IF (line_att(j:j) == ' ') THEN
342 end_c = j
343 EXIT
344 END IF
345 END DO
346 IF (wrd /= 5 .AND. end_c >= len(line_att) + 1) &
347 cpabort("incorrectly formatted line in coord section'"//line_att//"'")
348 IF (wrd == 1) THEN
349 at_name(ishell) = line_att(start_c:end_c - 1)
350 CALL uppercase(at_name(ishell))
351 ELSE IF (wrd == 5) THEN
352 READ (line_att(start_c:end_c - 1), *) at_index(ishell)
353 ELSE
354 READ (line_att(start_c:end_c - 1), *) r(wrd - 1, ishell)
355 END IF
356 start_c = end_c
357 END DO
358 END DO
359
360 IF (PRESENT(core_particle_set)) THEN
361 cpassert(ASSOCIATED(core_particle_set))
362 core_coord_section => section_vals_get_subs_vals(subsys_section, "CORE_COORD")
363 CALL section_vals_get(core_coord_section, explicit=explicit)
364 IF (explicit) THEN
365 CALL section_vals_val_get(core_coord_section, "UNIT", c_val=unit_str)
366 CALL section_vals_val_get(core_coord_section, "SCALED", l_val=core_scaled_coordinates)
367 unit_conv_core = cp_unit_to_cp2k(1.0_dp, trim(unit_str))
368 CALL section_vals_val_get(core_coord_section, "_DEFAULT_KEYWORD_", &
369 n_rep_val=nshell)
370
371 cpassert((SIZE(core_particle_set, 1) == nshell))
372 ALLOCATE (rc(3, nshell), at_name_c(nshell), at_index_c(nshell))
373 CALL cp_warn(__location__, &
374 "Overwriting cores coordinates. "// &
375 "Active coordinates READ from &CORE_COORD section. ")
376 CALL section_vals_list_get(core_coord_section, "_DEFAULT_KEYWORD_", list=list)
377 DO ishell = 1, nshell
378 ! we use only the first default_string_length characters of each line
379 is_ok = cp_sll_val_next(list, val)
380 CALL val_get(val, c_val=line_att)
381 start_c = 1
382 DO wrd = 1, 5
383 DO j = start_c, len(line_att)
384 IF (line_att(j:j) /= ' ') THEN
385 start_c = j
386 EXIT
387 END IF
388 END DO
389 end_c = len(line_att) + 1
390 DO j = start_c, len(line_att)
391 IF (line_att(j:j) == ' ') THEN
392 end_c = j
393 EXIT
394 END IF
395 END DO
396 IF (wrd /= 5 .AND. end_c >= len(line_att) + 1) &
397 cpabort("incorrectly formatted line in coord section'"//line_att//"'")
398 IF (wrd == 1) THEN
399 at_name_c(ishell) = line_att(start_c:end_c - 1)
400 CALL uppercase(at_name_c(ishell))
401 ELSE IF (wrd == 5) THEN
402 READ (line_att(start_c:end_c - 1), *) at_index_c(ishell)
403 ELSE
404 READ (line_att(start_c:end_c - 1), *) rc(wrd - 1, ishell)
405 END IF
406 start_c = end_c
407 END DO
408 END DO
409 IF (my_save_mem) CALL section_vals_remove_values(core_coord_section)
410 END IF ! explicit
411 END IF ! core_particle_set
412
413 !-----------------------------------------------------------------------------
414 ! 3. Check corrispondence and convert coordinates into internal cp2k coordinates
415 !-----------------------------------------------------------------------------
416 DO ishell = 1, nshell
417 atomic_kind => particle_set(at_index(ishell))%atomic_kind
418 CALL get_atomic_kind(atomic_kind=atomic_kind, &
419 name=name_kind, shell_active=is_shell, mass=mass_com, shell=shell)
420 CALL uppercase(name_kind)
421 IF ((trim(at_name(ishell)) == trim(name_kind)) .AND. is_shell) THEN
422 sh_index = particle_set(at_index(ishell))%shell_index
423 IF (shell_scaled_coordinates) THEN
424 CALL scaled_to_real(shell_particle_set(sh_index)%r(:), r(:, ishell), cell)
425 ELSE
426 shell_particle_set(sh_index)%r(:) = r(:, ishell)*unit_conv_shell
427 CALL cell_transform_input_cartesian(cell, shell_particle_set(sh_index)%r(:))
428 END IF
429 shell_particle_set(sh_index)%atom_index = at_index(ishell)
430
431 IF (PRESENT(core_particle_set) .AND. .NOT. explicit) THEN
432 core_particle_set(sh_index)%r(1) = (mass_com*particle_set(at_index(ishell))%r(1) - &
433 shell%mass_shell*shell_particle_set(sh_index)%r(1))/shell%mass_core
434 core_particle_set(sh_index)%r(2) = (mass_com*particle_set(at_index(ishell))%r(2) - &
435 shell%mass_shell*shell_particle_set(sh_index)%r(2))/shell%mass_core
436 core_particle_set(sh_index)%r(3) = (mass_com*particle_set(at_index(ishell))%r(3) - &
437 shell%mass_shell*shell_particle_set(sh_index)%r(3))/shell%mass_core
438 core_particle_set(sh_index)%atom_index = at_index(ishell)
439 rab = pbc(shell_particle_set(sh_index)%r, core_particle_set(sh_index)%r, cell)
440 ELSE IF (explicit) THEN
441 IF (core_scaled_coordinates) THEN
442 CALL scaled_to_real(core_particle_set(sh_index)%r(:), rc(:, ishell), cell)
443 ELSE
444 core_particle_set(sh_index)%r(:) = rc(:, ishell)*unit_conv_core
445 CALL cell_transform_input_cartesian(cell, core_particle_set(sh_index)%r(:))
446 END IF
447 core_particle_set(sh_index)%atom_index = at_index_c(ishell)
448 rab = pbc(shell_particle_set(sh_index)%r, core_particle_set(sh_index)%r, cell)
449 cpassert(trim(at_name(ishell)) == trim(at_name_c(ishell)))
450 cpassert(at_index(ishell) == at_index_c(ishell))
451 ELSE
452 rab = pbc(shell_particle_set(sh_index)%r, particle_set(at_index(ishell))%r, cell)
453 END IF
454
455 dab = sqrt(rab(1)*rab(1) + rab(2)*rab(2) + rab(3)*rab(3))
456 IF (shell%max_dist > 0.0_dp .AND. shell%max_dist < dab) THEN
457 IF (output_unit > 0) THEN
458 WRITE (output_unit, *) "WARNING : shell and core for atom ", at_index(ishell), " seem to be too distant."
459 END IF
460 END IF
461
462 ELSE
463 cpabort("shell coordinate assigned to the wrong atom. check the shell indexes in the input")
464 END IF
465 END DO
466 DEALLOCATE (r, at_index, at_name)
467 DEALLOCATE (rc, at_index_c, at_name_c)
468
469 END IF
470
471 IF (my_save_mem) CALL section_vals_remove_values(shell_coord_section)
472
473 CALL timestop(handle)
474
475 END SUBROUTINE read_shell_coord_input
476
477END MODULE atoms_input
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind(atomic_kind, fist_potential, element_symbol, name, mass, kind_number, natom, atom_list, rcov, rvdw, z, qeff, apol, cpol, mm_radius, shell, shell_active, damping)
Get attributes of an atomic kind.
subroutine, public read_atoms_input(topology, overwrite, subsys_section, save_mem)
...
Definition atoms_input.F:71
subroutine, public read_shell_coord_input(particle_set, shell_particle_set, cell, subsys_section, core_particle_set, save_mem)
...
Handles all functions related to the CELL.
Definition cell_types.F:15
subroutine, public scaled_to_real(r, s, cell)
Transform scaled cell coordinates real coordinates. r=h*s.
Definition cell_types.F:565
subroutine, public cell_transform_input_cartesian(cell, vector)
Transform a Cartesian real-space vector from the user input cell frame into CP2K's canonical internal...
Definition cell_types.F:261
logical function, public cp_sll_val_next(iterator, el_att)
returns true if the actual element is valid (i.e. iterator ont at end) moves the iterator to the next...
various routines to log and control the output. The idea is that decisions about where to log should ...
integer function, public cp_logger_get_default_io_unit(logger)
returns the unit nr for the ionode (-1 on all other processors) skips as well checks if the procs cal...
Utility routines to read data from files. Kept as close as possible to the old parser because.
elemental subroutine, public read_float_object(string, object, error_message)
Returns a floating point number read from a string including fraction like z1/z2.
unit conversion facility
Definition cp_units.F:30
real(kind=dp) function, public cp_unit_to_cp2k(value, unit_str, defaults, power)
converts to the internal cp2k units to the given unit
Definition cp_units.F:1210
objects that represent the structure of input sections and the data contained in an input section
subroutine, public section_vals_remove_values(section_vals)
removes the values of a repetition of the section
subroutine, public section_vals_list_get(section_vals, keyword_name, i_rep_section, list)
returns the requested list
recursive type(section_vals_type) function, pointer, public section_vals_get_subs_vals(section_vals, subsection_name, i_rep_section, can_return_null)
returns the values of the requested subsection
subroutine, public section_vals_get(section_vals, ref_count, n_repetition, n_subs_vals_rep, section, explicit)
returns various attributes about the section_vals
subroutine, public section_vals_val_get(section_vals, keyword_name, i_rep_section, i_rep_val, n_rep_val, val, l_val, i_val, r_val, c_val, l_vals, i_vals, r_vals, c_vals, explicit)
returns the requested value
a wrapper for basic fortran types.
subroutine, public val_get(val, has_l, has_i, has_r, has_lc, has_c, l_val, l_vals, i_val, i_vals, r_val, r_vals, c_val, c_vals, len_c, type_of_var, enum)
returns the stored values
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public default_string_length
Definition kinds.F:57
An array-based list which grows on demand. When the internal array is full, a new array of twice the ...
Definition list.F:24
Utility routines for the memory handling.
Define the data structure for the particle information.
generates a unique id number for a string (str2id) that can be used two compare two strings....
character(len=default_string_length) function, public s2s(str)
converts a string in a string of default_string_length
integer function, public str2id(str)
returns a unique id for a given string, and stores the string for later retrieval using the id.
character(len=default_string_length) function, public id2str(id)
returns the string associated with a given id
Utilities for string manipulations.
elemental subroutine, public uppercase(string)
Convert all lower case characters in a string to upper case.
Control for reading in different topologies and coordinates.
Definition topology.F:13
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
Definition cell_types.F:60
represent a single linked list that stores pointers to the elements
a type to have a wrapper that stores any basic fortran type