(git:58e3e09)
molden_utils.F
Go to the documentation of this file.
1 !--------------------------------------------------------------------------------------------------!
2 ! CP2K: A general program to perform molecular dynamics simulations !
3 ! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4 ! !
5 ! SPDX-License-Identifier: GPL-2.0-or-later !
6 !--------------------------------------------------------------------------------------------------!
7 
8 ! **************************************************************************************************
9 !> \brief Functions handling the MOLDEN format. Split from mode_selective.
10 !> \author Teodoro Laino, 03.2009
11 ! **************************************************************************************************
15  gto_basis_set_type
17  USE cp_fm_types, ONLY: cp_fm_get_info,&
20  cp_logger_type
21  USE cp_output_handling, ONLY: cp_p_file,&
25  USE input_constants, ONLY: gto_cartesian,&
27  USE input_section_types, ONLY: section_vals_type,&
29  USE kinds, ONLY: dp
30  USE mathconstants, ONLY: pi
31  USE orbital_pointers, ONLY: nco,&
32  nso
34  USE particle_types, ONLY: particle_type
36  USE physcon, ONLY: massunit
37  USE qs_kind_types, ONLY: get_qs_kind,&
39  qs_kind_type
40  USE qs_mo_types, ONLY: mo_set_type
41 #include "./base/base_uses.f90"
42 
43  IMPLICIT NONE
44 
45  PRIVATE
46  CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'molden_utils'
47  LOGICAL, PARAMETER :: debug_this_module = .false.
48 
49  INTEGER, PARAMETER :: molden_lmax = 4
50  INTEGER, PARAMETER :: molden_ncomax = (molden_lmax + 1)*(molden_lmax + 2)/2 ! 15
51 
53 
54 CONTAINS
55 
56 ! **************************************************************************************************
57 !> \brief Write out the MOs in molden format for visualisation
58 !> \param mos the set of MOs (both spins, if UKS)
59 !> \param qs_kind_set for basis set info
60 !> \param particle_set particles data structure, for positions and kinds
61 !> \param print_section input section containing relevant print key
62 !> \author MattW, IainB
63 ! **************************************************************************************************
64  SUBROUTINE write_mos_molden(mos, qs_kind_set, particle_set, print_section)
65  TYPE(mo_set_type), DIMENSION(:), INTENT(IN) :: mos
66  TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
67  TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
68  TYPE(section_vals_type), POINTER :: print_section
69 
70  CHARACTER(LEN=*), PARAMETER :: routinen = 'write_mos_molden'
71  CHARACTER(LEN=molden_lmax+1), PARAMETER :: angmom = "spdfg"
72 
73  CHARACTER(LEN=15) :: fmtstr1, fmtstr2
74  CHARACTER(LEN=2) :: element_symbol
75  INTEGER :: gto_kind, handle, i, iatom, icgf, icol, ikind, ipgf, irow, irow_in, iset, isgf, &
76  ishell, ispin, iw, lshell, ncgf, ncol_global, ndigits, nrow_global, nset, nsgf, z
77  INTEGER, DIMENSION(:), POINTER :: npgf, nshell
78  INTEGER, DIMENSION(:, :), POINTER :: l
79  INTEGER, DIMENSION(molden_ncomax, 0:molden_lmax) :: orbmap
80  LOGICAL :: print_warn
81  REAL(kind=dp) :: expzet, prefac
82  REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: cmatrix, smatrix
83  REAL(kind=dp), DIMENSION(:, :), POINTER :: zet
84  REAL(kind=dp), DIMENSION(:, :, :), POINTER :: gcc
85  TYPE(cp_logger_type), POINTER :: logger
86  TYPE(gto_basis_set_type), POINTER :: orb_basis_set
87 
88  CALL timeset(routinen, handle)
89 
90  logger => cp_get_default_logger()
91  IF (btest(cp_print_key_should_output(logger%iter_info, print_section, ""), cp_p_file)) THEN
92 
93  iw = cp_print_key_unit_nr(logger, print_section, "", &
94  extension=".molden", file_status='REPLACE')
95 
96  print_warn = .true.
97 
98  CALL section_vals_val_get(print_section, "NDIGITS", i_val=ndigits)
99  ndigits = min(max(3, ndigits), 30)
100  WRITE (unit=fmtstr1, fmt='("(I6,1X,ES",I0,".",I0,")")') ndigits + 7, ndigits
101  WRITE (unit=fmtstr2, fmt='("((T51,2F",I0,".",I0,"))")') ndigits + 10, ndigits
102 
103  CALL section_vals_val_get(print_section, "GTO_KIND", i_val=gto_kind)
104 
105  IF (mos(1)%use_mo_coeff_b) THEN
106  ! we are using the dbcsr mo_coeff
107  ! we copy it to the fm anyway
108  DO ispin = 1, SIZE(mos)
109  IF (.NOT. ASSOCIATED(mos(ispin)%mo_coeff_b)) THEN
110  cpassert(.false.)
111  END IF
112  CALL copy_dbcsr_to_fm(mos(ispin)%mo_coeff_b, &
113  mos(ispin)%mo_coeff) !fm->dbcsr
114  END DO
115  END IF
116 
117  IF (iw > 0) THEN
118  WRITE (iw, '(T2,A)') "[Molden Format]"
119  WRITE (iw, '(T2,A)') "[Atoms] AU"
120  DO i = 1, SIZE(particle_set)
121  CALL get_atomic_kind(atomic_kind=particle_set(i)%atomic_kind, &
122  element_symbol=element_symbol)
123  CALL get_ptable_info(element_symbol, number=z)
124 
125  WRITE (iw, '(T2,A2,I8,I8,3X,3(F12.6,3X))') &
126  element_symbol, i, z, particle_set(i)%r(:)
127  END DO
128 
129  WRITE (iw, '(T2,A)') "[GTO]"
130 
131  DO i = 1, SIZE(particle_set)
132  CALL get_atomic_kind(atomic_kind=particle_set(i)%atomic_kind, kind_number=ikind, &
133  element_symbol=element_symbol)
134  CALL get_qs_kind(qs_kind_set(ikind), basis_set=orb_basis_set)
135  IF (ASSOCIATED(orb_basis_set)) THEN
136  WRITE (iw, '(T2,I8,I8)') i, 0
137  CALL get_gto_basis_set(gto_basis_set=orb_basis_set, &
138  nset=nset, &
139  npgf=npgf, &
140  nshell=nshell, &
141  l=l, &
142  zet=zet, &
143  gcc=gcc)
144 
145  DO iset = 1, nset
146  DO ishell = 1, nshell(iset)
147  lshell = l(ishell, iset)
148  IF (lshell <= molden_lmax) THEN
149  WRITE (unit=iw, fmt='(T25,A2,4X,I4,4X,F4.2)') &
150  angmom(lshell + 1:lshell + 1), npgf(iset), 1.0_dp
151  ! MOLDEN expects the contraction coefficient of spherical NOT CARTESIAN NORMALISED
152  ! functions. So we undo the normalisation factors included in the gccs
153  ! Reverse engineered from basis_set_types, normalise_gcc_orb
154  prefac = 2_dp**lshell*(2/pi)**0.75_dp
155  expzet = 0.25_dp*(2*lshell + 3.0_dp)
156  WRITE (unit=iw, fmt=fmtstr2) &
157  (zet(ipgf, iset), gcc(ipgf, ishell, iset)/(prefac*zet(ipgf, iset)**expzet), &
158  ipgf=1, npgf(iset))
159  ELSE
160  IF (print_warn) THEN
161  CALL cp_warn(__location__, &
162  "MOLDEN format does not support Gaussian orbitals with l > 4.")
163  print_warn = .false.
164  END IF
165  END IF
166  END DO
167  END DO
168 
169  WRITE (iw, '(A4)') " "
170 
171  END IF
172 
173  END DO
174 
175  IF (gto_kind == gto_spherical) THEN
176  WRITE (iw, '(T2,A)') "[5D7F]"
177  WRITE (iw, '(T2,A)') "[9G]"
178  END IF
179 
180  WRITE (iw, '(T2,A)') "[MO]"
181  END IF
182 
183  !------------------------------------------------------------------------
184  ! convert from CP2K to MOLDEN format ordering
185  ! http://www.cmbi.ru.nl/molden/molden_format.html
186  !"The following order of D, F and G functions is expected:
187  !
188  ! 5D: D 0, D+1, D-1, D+2, D-2
189  ! 6D: xx, yy, zz, xy, xz, yz
190  !
191  ! 7F: F 0, F+1, F-1, F+2, F-2, F+3, F-3
192  ! 10F: xxx, yyy, zzz, xyy, xxy, xxz, xzz, yzz, yyz, xyz
193  !
194  ! 9G: G 0, G+1, G-1, G+2, G-2, G+3, G-3, G+4, G-4
195  ! 15G: xxxx yyyy zzzz xxxy xxxz yyyx yyyz zzzx zzzy,
196  ! xxyy xxzz yyzz xxyz yyxz zzxy
197  !"
198  ! CP2K has x in the outer (slower loop), so
199  ! xx, xy, xz, yy, yz,zz for l=2, for instance
200  !
201  ! iorb_cp2k = orbmap(iorb_molden, l), l = 0 .. 4
202  ! -----------------------------------------------------------------------
203  IF (iw > 0) THEN
204  IF (gto_kind == gto_cartesian) THEN
205  ! -----------------------------------------------------------------
206  ! Use cartesian (6D, 10F, 15G) representation.
207  ! This is only format VMD can process.
208  ! -----------------------------------------------------------------
209  orbmap = reshape((/1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
210  1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
211  1, 4, 6, 2, 3, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
212  1, 7, 10, 4, 2, 3, 6, 9, 8, 5, 0, 0, 0, 0, 0, &
213  1, 11, 15, 2, 3, 7, 12, 10, 14, 4, 6, 13, 5, 8, 9/), &
214  (/molden_ncomax, molden_lmax + 1/))
215  ELSE IF (gto_kind == gto_spherical) THEN
216  ! -----------------------------------------------------------------
217  ! Use spherical (5D, 7F, 9G) representation.
218  ! -----------------------------------------------------------------
219  orbmap = reshape((/1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
220  3, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
221  3, 4, 2, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
222  4, 5, 3, 6, 2, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, &
223  5, 6, 4, 7, 3, 8, 2, 9, 1, 0, 0, 0, 0, 0, 0/), &
224  (/molden_ncomax, molden_lmax + 1/))
225  END IF
226  END IF
227 
228  DO ispin = 1, SIZE(mos)
229  CALL cp_fm_get_info(mos(ispin)%mo_coeff, &
230  nrow_global=nrow_global, &
231  ncol_global=ncol_global)
232  ALLOCATE (smatrix(nrow_global, ncol_global))
233  CALL cp_fm_get_submatrix(mos(ispin)%mo_coeff, smatrix)
234 
235  IF (iw > 0) THEN
236  IF (gto_kind == gto_cartesian) THEN
237  CALL get_qs_kind_set(qs_kind_set, ncgf=ncgf, nsgf=nsgf)
238 
239  ALLOCATE (cmatrix(ncgf, ncgf))
240 
241  cmatrix = 0.0_dp
242 
243  ! Transform spherical MOs to Cartesian MOs
244 
245  icgf = 1
246  isgf = 1
247  DO iatom = 1, SIZE(particle_set)
248  NULLIFY (orb_basis_set)
249  CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
250  CALL get_qs_kind(qs_kind_set(ikind), &
251  basis_set=orb_basis_set)
252  IF (ASSOCIATED(orb_basis_set)) THEN
253  CALL get_gto_basis_set(gto_basis_set=orb_basis_set, &
254  nset=nset, &
255  nshell=nshell, &
256  l=l)
257  DO iset = 1, nset
258  DO ishell = 1, nshell(iset)
259  lshell = l(ishell, iset)
260  CALL dgemm("T", "N", nco(lshell), mos(ispin)%nmo, nso(lshell), 1.0_dp, &
261  orbtramat(lshell)%c2s, nso(lshell), &
262  smatrix(isgf, 1), nsgf, 0.0_dp, &
263  cmatrix(icgf, 1), ncgf)
264  icgf = icgf + nco(lshell)
265  isgf = isgf + nso(lshell)
266  END DO
267  END DO
268  END IF
269  END DO ! iatom
270  END IF
271 
272  DO icol = 1, mos(ispin)%nmo
273  ! index of the first basis function for the given atom, set, and shell
274  irow = 1
275 
276  ! index of the first basis function in MOLDEN file.
277  ! Due to limitation of the MOLDEN format, basis functions with l > molden_lmax
278  ! cannot be exported, so we need to renumber atomic orbitals
279  irow_in = 1
280 
281  WRITE (iw, '(A,ES20.10)') 'Ene=', mos(ispin)%eigenvalues(icol)
282  IF (ispin < 2) THEN
283  WRITE (iw, '(A)') 'Spin= Alpha'
284  ELSE
285  WRITE (iw, '(A)') 'Spin= Beta'
286  END IF
287  WRITE (iw, '(A,F12.7)') 'Occup=', mos(ispin)%occupation_numbers(icol)
288 
289  DO iatom = 1, SIZE(particle_set)
290  NULLIFY (orb_basis_set)
291  CALL get_atomic_kind(particle_set(iatom)%atomic_kind, &
292  element_symbol=element_symbol, kind_number=ikind)
293  CALL get_qs_kind(qs_kind_set(ikind), &
294  basis_set=orb_basis_set)
295  IF (ASSOCIATED(orb_basis_set)) THEN
296  CALL get_gto_basis_set(gto_basis_set=orb_basis_set, &
297  nset=nset, &
298  nshell=nshell, &
299  l=l)
300 
301  IF (gto_kind == gto_cartesian) THEN
302  ! ----------------------------------------------
303  ! Use cartesian (6D, 10F, 15G) representation.
304  ! ----------------------------------------------
305  icgf = 1
306  DO iset = 1, nset
307  DO ishell = 1, nshell(iset)
308  lshell = l(ishell, iset)
309 
310  IF (lshell <= molden_lmax) THEN
311  CALL print_coeffs(iw, fmtstr1, ndigits, irow_in, orbmap(:, lshell), &
312  cmatrix(irow:irow + nco(lshell) - 1, icol))
313  irow_in = irow_in + nco(lshell)
314  END IF
315 
316  irow = irow + nco(lshell)
317  END DO ! ishell
318  END DO
319 
320  ELSE IF (gto_kind == gto_spherical) THEN
321  ! ----------------------------------------------
322  ! Use spherical (5D, 7F, 9G) representation.
323  ! ----------------------------------------------
324  DO iset = 1, nset
325  DO ishell = 1, nshell(iset)
326  lshell = l(ishell, iset)
327 
328  IF (lshell <= molden_lmax) THEN
329  CALL print_coeffs(iw, fmtstr1, ndigits, irow_in, orbmap(:, lshell), &
330  smatrix(irow:irow + nso(lshell) - 1, icol))
331  irow_in = irow_in + nso(lshell)
332  END IF
333 
334  irow = irow + nso(lshell)
335  END DO
336  END DO
337  END IF
338 
339  END IF
340  END DO ! iatom
341  END DO
342  END IF
343 
344  IF (ALLOCATED(cmatrix)) DEALLOCATE (cmatrix)
345  IF (ALLOCATED(smatrix)) DEALLOCATE (smatrix)
346  END DO
347 
348  CALL cp_print_key_finished_output(iw, logger, print_section, "")
349 
350  END IF
351 
352  CALL timestop(handle)
353 
354  END SUBROUTINE write_mos_molden
355 
356 ! **************************************************************************************************
357 !> \brief Output MO coefficients formatted correctly for MOLDEN, omitting those <= 1E(-digits)
358 !> \param iw output file unit
359 !> \param fmtstr1 format string
360 !> \param ndigits number of significant digits in MO coefficients
361 !> \param irow_in index of the first atomic orbital: mo_coeff(orbmap(1))
362 !> \param orbmap array to map Gaussian functions from MOLDEN to CP2K ordering
363 !> \param mo_coeff MO coefficients
364 ! **************************************************************************************************
365  SUBROUTINE print_coeffs(iw, fmtstr1, ndigits, irow_in, orbmap, mo_coeff)
366  INTEGER, INTENT(in) :: iw
367  CHARACTER(LEN=*), INTENT(in) :: fmtstr1
368  INTEGER, INTENT(in) :: ndigits, irow_in
369  INTEGER, DIMENSION(molden_ncomax), INTENT(in) :: orbmap
370  REAL(kind=dp), DIMENSION(:), INTENT(in) :: mo_coeff
371 
372  INTEGER :: orbital
373 
374  DO orbital = 1, molden_ncomax
375  IF (orbmap(orbital) /= 0) THEN
376  IF (abs(mo_coeff(orbmap(orbital))) >= 10.0_dp**(-ndigits)) THEN
377  WRITE (iw, fmtstr1) irow_in + orbital - 1, mo_coeff(orbmap(orbital))
378  END IF
379  END IF
380  END DO
381 
382  END SUBROUTINE print_coeffs
383 
384 ! **************************************************************************************************
385 !> \brief writes the output for vibrational analysis in MOLDEN format
386 !> \param input ...
387 !> \param particles ...
388 !> \param freq ...
389 !> \param eigen_vec ...
390 !> \param intensities ...
391 !> \param calc_intens ...
392 !> \param dump_only_positive ...
393 !> \param logger ...
394 !> \param list array of mobile atom indices
395 !> \author Florian Schiffmann 11.2007
396 ! **************************************************************************************************
397  SUBROUTINE write_vibrations_molden(input, particles, freq, eigen_vec, intensities, calc_intens, &
398  dump_only_positive, logger, list)
399 
400  TYPE(section_vals_type), POINTER :: input
401  TYPE(particle_type), DIMENSION(:), POINTER :: particles
402  REAL(kind=dp), DIMENSION(:) :: freq
403  REAL(kind=dp), DIMENSION(:, :) :: eigen_vec
404  REAL(kind=dp), DIMENSION(:), POINTER :: intensities
405  LOGICAL, INTENT(in) :: calc_intens, dump_only_positive
406  TYPE(cp_logger_type), POINTER :: logger
407  INTEGER, DIMENSION(:), OPTIONAL, POINTER :: list
408 
409  CHARACTER(len=*), PARAMETER :: routinen = 'write_vibrations_molden'
410 
411  CHARACTER(LEN=2) :: element_symbol
412  INTEGER :: handle, i, iw, j, k, l, z
413  INTEGER, ALLOCATABLE, DIMENSION(:) :: my_list
414  REAL(kind=dp) :: fint
415 
416  CALL timeset(routinen, handle)
417 
418  iw = cp_print_key_unit_nr(logger, input, "VIBRATIONAL_ANALYSIS%PRINT%MOLDEN_VIB", &
419  extension=".mol", file_status='REPLACE')
420 
421  IF (iw .GT. 0) THEN
422  cpassert(mod(SIZE(eigen_vec, 1), 3) == 0)
423  cpassert(SIZE(freq, 1) == SIZE(eigen_vec, 2))
424  ALLOCATE (my_list(SIZE(particles)))
425  ! Either we have a list of the subset of mobile atoms,
426  ! Or the eigenvectors must span the full space (all atoms)
427  IF (PRESENT(list)) THEN
428  my_list(:) = 0
429  DO i = 1, SIZE(list)
430  my_list(list(i)) = i
431  END DO
432  ELSE
433  cpassert(SIZE(particles) == SIZE(eigen_vec, 1)/3)
434  DO i = 1, SIZE(my_list)
435  my_list(i) = i
436  END DO
437  END IF
438  WRITE (iw, '(T2,A)') "[Molden Format]"
439  WRITE (iw, '(T2,A)') "[Atoms] AU"
440  DO i = 1, SIZE(particles)
441  CALL get_atomic_kind(atomic_kind=particles(i)%atomic_kind, &
442  element_symbol=element_symbol)
443  CALL get_ptable_info(element_symbol, number=z)
444 
445  WRITE (iw, '(T2,A2,I8,I8,3X,3(F12.6,3X))') &
446  element_symbol, i, z, particles(i)%r(:)
447 
448  END DO
449  WRITE (iw, '(T2,A)') "[FREQ]"
450  DO i = 1, SIZE(freq, 1)
451  IF ((.NOT. dump_only_positive) .OR. (freq(i) >= 0._dp)) WRITE (iw, '(T5,F12.6)') freq(i)
452  END DO
453  WRITE (iw, '(T2,A)') "[FR-COORD]"
454  DO i = 1, SIZE(particles)
455  CALL get_atomic_kind(atomic_kind=particles(i)%atomic_kind, &
456  element_symbol=element_symbol)
457  WRITE (iw, '(T2,A2,3X,3(F12.6,3X))') &
458  element_symbol, particles(i)%r(:)
459  END DO
460  WRITE (iw, '(T2,A)') "[FR-NORM-COORD]"
461  l = 0
462  DO i = 1, SIZE(eigen_vec, 2)
463  IF ((.NOT. dump_only_positive) .OR. (freq(i) >= 0._dp)) THEN
464  l = l + 1
465  WRITE (iw, '(T2,A,1X,I6)') "vibration", l
466  DO j = 1, SIZE(particles)
467  IF (my_list(j) .NE. 0) THEN
468  k = (my_list(j) - 1)*3
469  WRITE (iw, '(T2,3(F12.6,3X))') eigen_vec(k + 1, i), eigen_vec(k + 2, i), eigen_vec(k + 3, i)
470  ELSE
471  WRITE (iw, '(T2,3(F12.6,3X))') 0.0_dp, 0.0_dp, 0.0_dp
472  END IF
473  END DO
474  END IF
475  END DO
476  IF (calc_intens) THEN
477  fint = massunit
478  ! intensity units are a.u./amu
479  WRITE (iw, '(T2,A)') "[INT]"
480  DO i = 1, SIZE(intensities)
481  IF ((.NOT. dump_only_positive) .OR. (freq(i) >= 0._dp)) WRITE (iw, '(3X,F18.6)') fint*intensities(i)**2
482  END DO
483  END IF
484  DEALLOCATE (my_list)
485  END IF
486  CALL cp_print_key_finished_output(iw, logger, input, "VIBRATIONAL_ANALYSIS%PRINT%MOLDEN_VIB")
487 
488  CALL timestop(handle)
489 
490  END SUBROUTINE write_vibrations_molden
491 
492 END MODULE molden_utils
static void dgemm(const char transa, const char transb, const int m, const int n, const int k, const double alpha, const double *a, const int lda, const double *b, const int ldb, const double beta, double *c, const int ldc)
Convenient wrapper to hide Fortran nature of dgemm_, swapping a and b.
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 get_gto_basis_set(gto_basis_set, name, aliases, norm_type, kind_radius, ncgf, nset, nsgf, cgf_symbol, sgf_symbol, norm_cgf, set_radius, lmax, lmin, lx, ly, lz, m, ncgf_set, npgf, nsgf_set, nshell, cphi, pgf_radius, sphi, scon, zet, first_cgf, first_sgf, l, last_cgf, last_sgf, n, gcc, maxco, maxl, maxpgf, maxsgf_set, maxshell, maxso, nco_sum, npgf_sum, nshell_sum, maxder, short_kind_radius)
...
DBCSR operations in CP2K.
subroutine, public copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS matrix.
represent a full matrix distributed on many processors
Definition: cp_fm_types.F:15
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
Definition: cp_fm_types.F:1016
subroutine, public cp_fm_get_submatrix(fm, target_m, start_row, start_col, n_rows, n_cols, transpose)
gets a submatrix of a full matrix op(target_m)(1:n_rows,1:n_cols) =fm(start_row:start_row+n_rows,...
Definition: cp_fm_types.F:901
various routines to log and control the output. The idea is that decisions about where to log should ...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
integer, parameter, public cp_p_file
integer function, public cp_print_key_should_output(iteration_info, basis_section, print_key_path, used_print_key, first_time)
returns what should be done with the given property if btest(res,cp_p_store) then the property should...
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public gto_cartesian
integer, parameter, public gto_spherical
objects that represent the structure of input sections and the data contained in an input section
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
Defines the basic variable types.
Definition: kinds.F:23
integer, parameter, public dp
Definition: kinds.F:34
An array-based list which grows on demand. When the internal array is full, a new array of twice the ...
Definition: list.F:24
Definition of mathematical constants and functions.
Definition: mathconstants.F:16
real(kind=dp), parameter, public pi
Functions handling the MOLDEN format. Split from mode_selective.
Definition: molden_utils.F:12
subroutine, public write_mos_molden(mos, qs_kind_set, particle_set, print_section)
Write out the MOs in molden format for visualisation.
Definition: molden_utils.F:65
subroutine, public write_vibrations_molden(input, particles, freq, eigen_vec, intensities, calc_intens, dump_only_positive, logger, list)
writes the output for vibrational analysis in MOLDEN format
Definition: molden_utils.F:399
Provides Cartesian and spherical orbital pointers and indices.
integer, dimension(:), allocatable, public nco
integer, dimension(:), allocatable, public nso
Calculation of the spherical harmonics and the corresponding orbital transformation matrices.
type(orbtramat_type), dimension(:), pointer, public orbtramat
Define the data structure for the particle information.
Periodic Table related data definitions.
subroutine, public get_ptable_info(symbol, number, amass, ielement, covalent_radius, metallic_radius, vdw_radius, found)
Pass information about the kind given the element symbol.
Definition of physical constants:
Definition: physcon.F:68
real(kind=dp), parameter, public massunit
Definition: physcon.F:141
Define the quickstep kind type and their sub types.
Definition: qs_kind_types.F:23
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_r3d_rs_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, U_of_dft_plus_u, J_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, J0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, init_u_ramping_each_scf, reltmat, ghost, floating, name, element_symbol, pao_basis_size, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
subroutine, public get_qs_kind_set(qs_kind_set, all_potential_present, tnadd_potential_present, gth_potential_present, sgp_potential_present, paw_atom_present, dft_plus_u_atom_present, maxcgf, maxsgf, maxco, maxco_proj, maxgtops, maxlgto, maxlprj, maxnset, maxsgf_set, ncgf, npgf, nset, nsgf, nshell, maxpol, maxlppl, maxlppnl, maxppnl, nelectron, maxder, max_ngrid_rad, max_sph_harm, maxg_iso_not0, lmax_rho0, basis_rcut, basis_type, total_zeff_corr)
Get attributes of an atomic kind set.
Definition and initialisation of the mo data type.
Definition: qs_mo_types.F:22
Orbital angular momentum.
Definition: grid_common.h:125