(git:98357aa)
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) THEN
148 cpabort("incorrectly formatted line in coord section'"//line_att//"'")
149 END IF
150 IF (wrd == 1) THEN
151 atom_info%id_atmname(iatom) = str2id(s2s(line_att(start_c:end_c - 1)))
152 ELSE
153 READ (line_att(start_c:end_c - 1), *) atom_info%r(wrd - 1, iatom)
154 END IF
155 start_c = end_c
156 END DO
157 END DO
158 ELSE
159 ! Element is assigned on the basis of the atm_name
160 topology%aa_element = .true.
161
162 CALL reallocate(atom_info%id_molname, 1, natom)
163 CALL reallocate(atom_info%id_resname, 1, natom)
164 CALL reallocate(atom_info%resid, 1, natom)
165 CALL reallocate(atom_info%id_atmname, 1, natom)
166 CALL reallocate(atom_info%id_element, 1, natom)
167 CALL reallocate(atom_info%r, 1, 3, 1, natom)
168 CALL reallocate(atom_info%atm_mass, 1, natom)
169 CALL reallocate(atom_info%atm_charge, 1, natom)
170
171 CALL section_vals_list_get(coord_section, "_DEFAULT_KEYWORD_", list=list)
172 DO iatom = 1, natom
173 ! we use only the first default_string_length characters of each line
174 is_ok = cp_sll_val_next(list, val)
175 CALL val_get(val, c_val=line_att)
176 default_id = str2id(s2s(""))
177 atom_info%id_molname(iatom) = default_id
178 atom_info%id_resname(iatom) = default_id
179 atom_info%resid(iatom) = 1
180 atom_info%id_atmname(iatom) = default_id
181 atom_info%id_element(iatom) = default_id
182 topology%molname_generated = .true.
183 ! Read name and atomic coordinates
184 start_c = 1
185 DO wrd = 1, 6
186 DO j = start_c, len(line_att)
187 IF (line_att(j:j) /= ' ') THEN
188 start_c = j
189 EXIT
190 END IF
191 END DO
192 end_c = len(line_att) + 1
193 DO j = start_c, len(line_att)
194 IF (line_att(j:j) == ' ') THEN
195 end_c = j
196 EXIT
197 END IF
198 END DO
199 IF (len_trim(line_att(start_c:end_c - 1)) == 0) THEN
200 CALL cp_abort(__location__, &
201 "Incorrectly formatted input line for atom "// &
202 trim(adjustl(cp_to_string(iatom)))// &
203 " found in COORD section. Input line: <"// &
204 trim(line_att)//"> ")
205 END IF
206 SELECT CASE (wrd)
207 CASE (1)
208 atom_info%id_atmname(iatom) = str2id(s2s(line_att(start_c:end_c - 1)))
209 CASE (2:4)
210 CALL read_float_object(line_att(start_c:end_c - 1), &
211 atom_info%r(wrd - 1, iatom), error_message)
212 IF (len_trim(error_message) /= 0) THEN
213 CALL cp_abort(__location__, &
214 "Incorrectly formatted input line for atom "// &
215 trim(adjustl(cp_to_string(iatom)))// &
216 " found in COORD section. "//trim(error_message)// &
217 " Input line: <"//trim(line_att)//"> ")
218 END IF
219 CASE (5)
220 READ (line_att(start_c:end_c - 1), *) strtmp
221 atom_info%id_molname(iatom) = str2id(strtmp)
222 atom_info%id_resname(iatom) = atom_info%id_molname(iatom)
223 topology%molname_generated = .false.
224 CASE (6)
225 READ (line_att(start_c:end_c - 1), *) strtmp
226 atom_info%id_resname(iatom) = str2id(strtmp)
227 END SELECT
228 start_c = end_c
229 IF (start_c > len_trim(line_att)) EXIT
230 END DO
231 IF (topology%molname_generated) THEN
232 ! Use defaults, if no molname was specified
233 WRITE (my_default_index, '(I0)') iatom
234 atom_info%id_molname(iatom) = str2id(s2s(trim(id2str(atom_info%id_atmname(iatom)))//trim(my_default_index)))
235 atom_info%id_resname(iatom) = atom_info%id_molname(iatom)
236 END IF
237 atom_info%id_element(iatom) = atom_info%id_atmname(iatom)
238 atom_info%atm_mass(iatom) = 0.0_dp
239 atom_info%atm_charge(iatom) = -huge(0.0_dp)
240 END DO
241 END IF
242 !-----------------------------------------------------------------------------
243 !-----------------------------------------------------------------------------
244 ! 3. Convert coordinates into internal cp2k coordinates
245 !-----------------------------------------------------------------------------
246 DO iatom = 1, natom
247 IF (scaled_coordinates) THEN
248 r0 = atom_info%r(:, iatom)
249 CALL scaled_to_real(atom_info%r(:, iatom), r0, cell)
250 ELSE
251 atom_info%r(:, iatom) = atom_info%r(:, iatom)*unit_conv
252 CALL cell_transform_input_cartesian(cell, atom_info%r(:, iatom))
253 END IF
254 END DO
255 IF (my_save_mem) CALL section_vals_remove_values(coord_section)
256
257 CALL timestop(handle)
258 END SUBROUTINE read_atoms_input
259
260! **************************************************************************************************
261!> \brief ...
262!> \param particle_set ...
263!> \param shell_particle_set ...
264!> \param cell ...
265!> \param subsys_section ...
266!> \param core_particle_set ...
267!> \param save_mem ...
268!> \author MI
269! **************************************************************************************************
270 SUBROUTINE read_shell_coord_input(particle_set, shell_particle_set, cell, &
271 subsys_section, core_particle_set, save_mem)
272
273 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set, shell_particle_set
274 TYPE(cell_type), POINTER :: cell
275 TYPE(section_vals_type), POINTER :: subsys_section
276 TYPE(particle_type), DIMENSION(:), OPTIONAL, &
277 POINTER :: core_particle_set
278 LOGICAL, INTENT(IN), OPTIONAL :: save_mem
279
280 CHARACTER(len=*), PARAMETER :: routinen = 'read_shell_coord_input'
281
282 CHARACTER(len=2*default_string_length) :: line_att
283 CHARACTER(len=default_string_length) :: name_kind, unit_str
284 CHARACTER(len=default_string_length), &
285 ALLOCATABLE, DIMENSION(:) :: at_name, at_name_c
286 INTEGER :: end_c, handle, ishell, j, nshell, &
287 output_unit, sh_index, start_c, wrd
288 INTEGER, ALLOCATABLE, DIMENSION(:) :: at_index, at_index_c
289 LOGICAL :: core_scaled_coordinates, explicit, &
290 is_ok, is_shell, my_save_mem, &
291 shell_scaled_coordinates
292 REAL(kind=dp) :: dab, mass_com, rab(3), unit_conv_core, &
293 unit_conv_shell
294 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: r, rc
295 TYPE(atomic_kind_type), POINTER :: atomic_kind
296 TYPE(cp_sll_val_type), POINTER :: list
297 TYPE(section_vals_type), POINTER :: core_coord_section, shell_coord_section
298 TYPE(shell_kind_type), POINTER :: shell
299 TYPE(val_type), POINTER :: val
300
301 my_save_mem = .false.
302 NULLIFY (atomic_kind, list, shell_coord_section, shell, val)
303 output_unit = cp_logger_get_default_io_unit()
304
305 IF (PRESENT(save_mem)) my_save_mem = save_mem
306 NULLIFY (shell_coord_section, core_coord_section)
307 shell_coord_section => section_vals_get_subs_vals(subsys_section, "SHELL_COORD")
308 CALL section_vals_get(shell_coord_section, explicit=explicit)
309 IF (.NOT. explicit) RETURN
310
311 CALL timeset(routinen, handle)
312 cpassert(ASSOCIATED(particle_set))
313 !-----------------------------------------------------------------------------
314 !-----------------------------------------------------------------------------
315 ! 2. Read in the coordinates from &SHELL_COORD section in the input file
316 !-----------------------------------------------------------------------------
317 CALL section_vals_val_get(shell_coord_section, "UNIT", c_val=unit_str)
318 CALL section_vals_val_get(shell_coord_section, "SCALED", l_val=shell_scaled_coordinates)
319 unit_conv_shell = cp_unit_to_cp2k(1.0_dp, trim(unit_str))
320 CALL section_vals_val_get(shell_coord_section, "_DEFAULT_KEYWORD_", &
321 n_rep_val=nshell)
322
323 IF (ASSOCIATED(shell_particle_set)) THEN
324 cpassert((SIZE(shell_particle_set, 1) == nshell))
325 ALLOCATE (r(3, nshell), at_name(nshell), at_index(nshell))
326 CALL cp_warn(__location__, &
327 "Overwriting shell coordinates. "// &
328 "Active coordinates READ from &SHELL_COORD section. ")
329 CALL section_vals_list_get(shell_coord_section, "_DEFAULT_KEYWORD_", list=list)
330 DO ishell = 1, nshell
331 ! we use only the first default_string_length characters of each line
332 is_ok = cp_sll_val_next(list, val)
333 CALL val_get(val, c_val=line_att)
334 start_c = 1
335 DO wrd = 1, 5
336 DO j = start_c, len(line_att)
337 IF (line_att(j:j) /= ' ') THEN
338 start_c = j
339 EXIT
340 END IF
341 END DO
342 end_c = len(line_att) + 1
343 DO j = start_c, len(line_att)
344 IF (line_att(j:j) == ' ') THEN
345 end_c = j
346 EXIT
347 END IF
348 END DO
349 IF (wrd /= 5 .AND. end_c >= len(line_att) + 1) THEN
350 cpabort("incorrectly formatted line in coord section'"//line_att//"'")
351 END IF
352 IF (wrd == 1) THEN
353 at_name(ishell) = line_att(start_c:end_c - 1)
354 CALL uppercase(at_name(ishell))
355 ELSE IF (wrd == 5) THEN
356 READ (line_att(start_c:end_c - 1), *) at_index(ishell)
357 ELSE
358 READ (line_att(start_c:end_c - 1), *) r(wrd - 1, ishell)
359 END IF
360 start_c = end_c
361 END DO
362 END DO
363
364 IF (PRESENT(core_particle_set)) THEN
365 cpassert(ASSOCIATED(core_particle_set))
366 core_coord_section => section_vals_get_subs_vals(subsys_section, "CORE_COORD")
367 CALL section_vals_get(core_coord_section, explicit=explicit)
368 IF (explicit) THEN
369 CALL section_vals_val_get(core_coord_section, "UNIT", c_val=unit_str)
370 CALL section_vals_val_get(core_coord_section, "SCALED", l_val=core_scaled_coordinates)
371 unit_conv_core = cp_unit_to_cp2k(1.0_dp, trim(unit_str))
372 CALL section_vals_val_get(core_coord_section, "_DEFAULT_KEYWORD_", &
373 n_rep_val=nshell)
374
375 cpassert((SIZE(core_particle_set, 1) == nshell))
376 ALLOCATE (rc(3, nshell), at_name_c(nshell), at_index_c(nshell))
377 CALL cp_warn(__location__, &
378 "Overwriting cores coordinates. "// &
379 "Active coordinates READ from &CORE_COORD section. ")
380 CALL section_vals_list_get(core_coord_section, "_DEFAULT_KEYWORD_", list=list)
381 DO ishell = 1, nshell
382 ! we use only the first default_string_length characters of each line
383 is_ok = cp_sll_val_next(list, val)
384 CALL val_get(val, c_val=line_att)
385 start_c = 1
386 DO wrd = 1, 5
387 DO j = start_c, len(line_att)
388 IF (line_att(j:j) /= ' ') THEN
389 start_c = j
390 EXIT
391 END IF
392 END DO
393 end_c = len(line_att) + 1
394 DO j = start_c, len(line_att)
395 IF (line_att(j:j) == ' ') THEN
396 end_c = j
397 EXIT
398 END IF
399 END DO
400 IF (wrd /= 5 .AND. end_c >= len(line_att) + 1) THEN
401 cpabort("incorrectly formatted line in coord section'"//line_att//"'")
402 END IF
403 IF (wrd == 1) THEN
404 at_name_c(ishell) = line_att(start_c:end_c - 1)
405 CALL uppercase(at_name_c(ishell))
406 ELSE IF (wrd == 5) THEN
407 READ (line_att(start_c:end_c - 1), *) at_index_c(ishell)
408 ELSE
409 READ (line_att(start_c:end_c - 1), *) rc(wrd - 1, ishell)
410 END IF
411 start_c = end_c
412 END DO
413 END DO
414 IF (my_save_mem) CALL section_vals_remove_values(core_coord_section)
415 END IF ! explicit
416 END IF ! core_particle_set
417
418 !-----------------------------------------------------------------------------
419 ! 3. Check corrispondence and convert coordinates into internal cp2k coordinates
420 !-----------------------------------------------------------------------------
421 DO ishell = 1, nshell
422 atomic_kind => particle_set(at_index(ishell))%atomic_kind
423 CALL get_atomic_kind(atomic_kind=atomic_kind, &
424 name=name_kind, shell_active=is_shell, mass=mass_com, shell=shell)
425 CALL uppercase(name_kind)
426 IF ((trim(at_name(ishell)) == trim(name_kind)) .AND. is_shell) THEN
427 sh_index = particle_set(at_index(ishell))%shell_index
428 IF (shell_scaled_coordinates) THEN
429 CALL scaled_to_real(shell_particle_set(sh_index)%r(:), r(:, ishell), cell)
430 ELSE
431 shell_particle_set(sh_index)%r(:) = r(:, ishell)*unit_conv_shell
432 CALL cell_transform_input_cartesian(cell, shell_particle_set(sh_index)%r(:))
433 END IF
434 shell_particle_set(sh_index)%atom_index = at_index(ishell)
435
436 IF (PRESENT(core_particle_set) .AND. .NOT. explicit) THEN
437 core_particle_set(sh_index)%r(1) = (mass_com*particle_set(at_index(ishell))%r(1) - &
438 shell%mass_shell*shell_particle_set(sh_index)%r(1))/shell%mass_core
439 core_particle_set(sh_index)%r(2) = (mass_com*particle_set(at_index(ishell))%r(2) - &
440 shell%mass_shell*shell_particle_set(sh_index)%r(2))/shell%mass_core
441 core_particle_set(sh_index)%r(3) = (mass_com*particle_set(at_index(ishell))%r(3) - &
442 shell%mass_shell*shell_particle_set(sh_index)%r(3))/shell%mass_core
443 core_particle_set(sh_index)%atom_index = at_index(ishell)
444 rab = pbc(shell_particle_set(sh_index)%r, core_particle_set(sh_index)%r, cell)
445 ELSE IF (explicit) THEN
446 IF (core_scaled_coordinates) THEN
447 CALL scaled_to_real(core_particle_set(sh_index)%r(:), rc(:, ishell), cell)
448 ELSE
449 core_particle_set(sh_index)%r(:) = rc(:, ishell)*unit_conv_core
450 CALL cell_transform_input_cartesian(cell, core_particle_set(sh_index)%r(:))
451 END IF
452 core_particle_set(sh_index)%atom_index = at_index_c(ishell)
453 rab = pbc(shell_particle_set(sh_index)%r, core_particle_set(sh_index)%r, cell)
454 cpassert(trim(at_name(ishell)) == trim(at_name_c(ishell)))
455 cpassert(at_index(ishell) == at_index_c(ishell))
456 ELSE
457 rab = pbc(shell_particle_set(sh_index)%r, particle_set(at_index(ishell))%r, cell)
458 END IF
459
460 dab = sqrt(rab(1)*rab(1) + rab(2)*rab(2) + rab(3)*rab(3))
461 IF (shell%max_dist > 0.0_dp .AND. shell%max_dist < dab) THEN
462 IF (output_unit > 0) THEN
463 WRITE (output_unit, *) "WARNING : shell and core for atom ", at_index(ishell), " seem to be too distant."
464 END IF
465 END IF
466
467 ELSE
468 cpabort("shell coordinate assigned to the wrong atom. check the shell indexes in the input")
469 END IF
470 END DO
471 DEALLOCATE (r, at_index, at_name)
472 DEALLOCATE (rc, at_index_c, at_name_c)
473
474 END IF
475
476 IF (my_save_mem) CALL section_vals_remove_values(shell_coord_section)
477
478 CALL timestop(handle)
479
480 END SUBROUTINE read_shell_coord_input
481
482END 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:625
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:284
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:1222
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