(git:d3d49ac)
Loading...
Searching...
No Matches
libcp2k.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! IMPORTANT: Update libcp2k.h when you add, remove or change a function in this file. !
10!--------------------------------------------------------------------------------------------------!
11
12! **************************************************************************************************
13!> \brief CP2K C/C++ interface
14!> \par History
15!> 12.2012 created [Hossein Bani-Hashemian]
16!> 04.2016 restructured [Hossein Bani-Hashemian, Ole Schuett]
17!> 03.2018 added Active Space functions [Tiziano Mueller]
18!> \author Mohammad Hossein Bani-Hashemian
19! **************************************************************************************************
20MODULE libcp2k
21 USE iso_c_binding, ONLY: c_char,&
22 c_double,&
23 c_funptr,&
24 c_int,&
25 c_long,&
26 c_null_char
27 USE cp2k_info, ONLY: cp2k_version
28 USE cp2k_runs, ONLY: run_input
30 USE f77_interface, ONLY: &
37 USE input_cp2k_read, ONLY: empty_initial_variables
40 USE kinds, ONLY: default_path_length,&
42 dp
46#include "../base/base_uses.f90"
47
48 IMPLICIT NONE
49
50 PRIVATE
51
62
63 TYPE, EXTENDS(eri_type_eri_element_func) :: eri2array
64 INTEGER(C_INT), POINTER :: coords(:) => null()
65 REAL(C_DOUBLE), POINTER :: values(:) => null()
66 INTEGER :: idx = 1
67 CONTAINS
68 PROCEDURE :: func => eri2array_func
69 END TYPE eri2array
70
71CONTAINS
72
73! **************************************************************************************************
74!> \brief ...
75!> \param version_str ...
76!> \param str_length ...
77! **************************************************************************************************
78 SUBROUTINE cp2k_get_version(version_str, str_length) BIND(C)
79 CHARACTER(LEN=1, KIND=C_CHAR), INTENT(OUT) :: version_str(*)
80 INTEGER(C_INT), VALUE :: str_length
81
82 INTEGER :: i, n
83
84 n = len_trim(cp2k_version)
85 cpassert(str_length >= n + 1)
86 mark_used(str_length)
87
88 ! copy string
89 DO i = 1, n
90 version_str(i) = cp2k_version(i:i)
91 END DO
92 version_str(n + 1) = c_null_char
93 END SUBROUTINE cp2k_get_version
94
95! **************************************************************************************************
96!> \brief ...
97! **************************************************************************************************
98 SUBROUTINE cp2k_init() BIND(C)
99 INTEGER :: ierr
100
101 CALL init_cp2k(.true., ierr)
102 cpassert(ierr == 0)
103 END SUBROUTINE cp2k_init
104
105! **************************************************************************************************
106!> \brief ...
107! **************************************************************************************************
108 SUBROUTINE cp2k_init_without_mpi() BIND(C)
109 INTEGER :: ierr
110
111 CALL init_cp2k(.false., ierr)
112 cpassert(ierr == 0)
113 END SUBROUTINE cp2k_init_without_mpi
114
115! **************************************************************************************************
116!> \brief ...
117!> \param mpi_comm ...
118! **************************************************************************************************
119 SUBROUTINE cp2k_init_without_mpi_comm(mpi_comm) BIND(C)
120 INTEGER(C_INT), VALUE :: mpi_comm
121
122 INTEGER :: ierr
123 TYPE(mp_comm_type) :: my_mpi_comm
124
125 CALL my_mpi_comm%set_handle(int(mpi_comm))
126 CALL init_cp2k(.false., ierr, my_mpi_comm)
127 cpassert(ierr == 0)
128 END SUBROUTINE cp2k_init_without_mpi_comm
129
130! **************************************************************************************************
131!> \brief ...
132! **************************************************************************************************
133 SUBROUTINE cp2k_finalize() BIND(C)
134 INTEGER :: ierr
135
136 CALL finalize_cp2k(.true., ierr)
137 cpassert(ierr == 0)
138 END SUBROUTINE cp2k_finalize
139
140! **************************************************************************************************
141!> \brief ...
142! **************************************************************************************************
143 SUBROUTINE cp2k_finalize_without_mpi() BIND(C)
144 INTEGER :: ierr
145
146 CALL finalize_cp2k(.false., ierr)
147 cpassert(ierr == 0)
148 END SUBROUTINE cp2k_finalize_without_mpi
149
150! **************************************************************************************************
151!> \brief ...
152!> \param new_env_id ...
153!> \param input_file_path ...
154!> \param output_file_path ...
155! **************************************************************************************************
156 SUBROUTINE cp2k_create_force_env(new_env_id, input_file_path, output_file_path) BIND(C)
157 INTEGER(C_INT), INTENT(OUT) :: new_env_id
158 CHARACTER(LEN=1, KIND=C_CHAR), INTENT(IN) :: input_file_path(*), output_file_path(*)
159
160 CHARACTER(LEN=default_path_length) :: ifp, ofp
161 INTEGER :: ierr, ncopied
162 TYPE(section_type), POINTER :: input_declaration
163
164 ifp = " "; ofp = " "
165 ncopied = strlcpy_c2f(ifp, input_file_path)
166 ncopied = strlcpy_c2f(ofp, output_file_path)
167
168 NULLIFY (input_declaration)
169 CALL create_cp2k_root_section(input_declaration)
170 CALL create_force_env(new_env_id, input_declaration, ifp, ofp, ierr=ierr)
171 CALL section_release(input_declaration)
172 cpassert(ierr == 0)
173 END SUBROUTINE cp2k_create_force_env
174
175! **************************************************************************************************
176!> \brief ...
177!> \param new_env_id ...
178!> \param input_file_path ...
179!> \param output_file_path ...
180!> \param mpi_comm ...
181! **************************************************************************************************
182 SUBROUTINE cp2k_create_force_env_comm(new_env_id, input_file_path, output_file_path, mpi_comm) BIND(C)
183 INTEGER(C_INT), INTENT(OUT) :: new_env_id
184 CHARACTER(LEN=1, KIND=C_CHAR), INTENT(IN) :: input_file_path(*), output_file_path(*)
185 INTEGER(C_INT), VALUE :: mpi_comm
186
187 CHARACTER(LEN=default_path_length) :: ifp, ofp
188 INTEGER :: ierr, ncopied
189 TYPE(mp_comm_type) :: my_mpi_comm
190 TYPE(section_type), POINTER :: input_declaration
191
192 ifp = " "; ofp = " "
193 ncopied = strlcpy_c2f(ifp, input_file_path)
194 ncopied = strlcpy_c2f(ofp, output_file_path)
195
196 NULLIFY (input_declaration)
197 CALL create_cp2k_root_section(input_declaration)
198 CALL my_mpi_comm%set_handle(int(mpi_comm))
199 CALL create_force_env(new_env_id, input_declaration, ifp, ofp, my_mpi_comm, ierr=ierr)
200 CALL section_release(input_declaration)
201 cpassert(ierr == 0)
202 END SUBROUTINE cp2k_create_force_env_comm
203
204! **************************************************************************************************
205!> \brief ...
206!> \param env_id ...
207! **************************************************************************************************
208 SUBROUTINE cp2k_destroy_force_env(env_id) BIND(C)
209 INTEGER(C_INT), VALUE :: env_id
210
211 INTEGER :: ierr
212
213 CALL destroy_force_env(env_id, ierr)
214 cpassert(ierr == 0)
215 END SUBROUTINE cp2k_destroy_force_env
216
217! **************************************************************************************************
218!> \brief ...
219!> \param env_id ...
220!> \param new_pos ...
221!> \param n_el ...
222! **************************************************************************************************
223 SUBROUTINE cp2k_set_positions(env_id, new_pos, n_el) BIND(C)
224 INTEGER(C_INT), VALUE :: env_id, n_el
225 REAL(c_double), DIMENSION(1:n_el), INTENT(IN) :: new_pos
226
227 INTEGER :: ierr
228
229 CALL set_pos(env_id, new_pos, n_el, ierr)
230 cpassert(ierr == 0)
231 END SUBROUTINE cp2k_set_positions
232
233! **************************************************************************************************
234!> \brief ...
235!> \param env_id ...
236!> \param new_vel ...
237!> \param n_el ...
238! **************************************************************************************************
239 SUBROUTINE cp2k_set_velocities(env_id, new_vel, n_el) BIND(C)
240 INTEGER(C_INT), VALUE :: env_id, n_el
241 REAL(c_double), DIMENSION(1:n_el), INTENT(IN) :: new_vel
242
243 INTEGER :: ierr
244
245 CALL set_vel(env_id, new_vel, n_el, ierr)
246 cpassert(ierr == 0)
247 END SUBROUTINE cp2k_set_velocities
248
249! **************************************************************************************************
250!> \brief ...
251!> \param env_id ...
252!> \param new_cell ...
253! **************************************************************************************************
254 SUBROUTINE cp2k_set_cell(env_id, new_cell) BIND(C)
255 INTEGER(C_INT), VALUE :: env_id
256 REAL(c_double), DIMENSION(3, 3), INTENT(IN) :: new_cell
257
258 INTEGER :: ierr
259
260 CALL set_cell(env_id, new_cell, ierr)
261 cpassert(ierr == 0)
262 END SUBROUTINE cp2k_set_cell
263
264! **************************************************************************************************
265!> \brief ...
266!> \param env_id ...
267!> \param description ...
268!> \param RESULT ...
269!> \param n_el ...
270! **************************************************************************************************
271 SUBROUTINE cp2k_get_result(env_id, description, RESULT, n_el) BIND(C)
272 INTEGER(C_INT), VALUE :: env_id
273 CHARACTER(LEN=1, KIND=C_CHAR), INTENT(IN) :: description(*)
274 INTEGER(C_INT), VALUE :: n_el
275 REAL(c_double), DIMENSION(1:n_el), INTENT(OUT) :: result
276
277 CHARACTER(LEN=default_string_length) :: desc_low
278 INTEGER :: ierr, ncopied
279
280 desc_low = " "
281 ncopied = strlcpy_c2f(desc_low, description)
282
283 CALL get_result_r1(env_id, desc_low, n_el, result, ierr=ierr)
284 cpassert(ierr == 0)
285 END SUBROUTINE cp2k_get_result
286
287! **************************************************************************************************
288!> \brief ...
289!> \param env_id ...
290!> \param natom ...
291! **************************************************************************************************
292 SUBROUTINE cp2k_get_natom(env_id, natom) BIND(C)
293 INTEGER(C_INT), VALUE :: env_id
294 INTEGER(C_INT), INTENT(OUT) :: natom
295
296 INTEGER :: ierr
297
298 CALL get_natom(env_id, natom, ierr)
299 cpassert(ierr == 0)
300 END SUBROUTINE cp2k_get_natom
301
302! **************************************************************************************************
303!> \brief ...
304!> \param env_id ...
305!> \param nparticle ...
306! **************************************************************************************************
307 SUBROUTINE cp2k_get_nparticle(env_id, nparticle) BIND(C)
308 INTEGER(C_INT), VALUE :: env_id
309 INTEGER(C_INT), INTENT(OUT) :: nparticle
310
311 INTEGER :: ierr
312
313 CALL get_nparticle(env_id, nparticle, ierr)
314 cpassert(ierr == 0)
315 END SUBROUTINE cp2k_get_nparticle
316
317! **************************************************************************************************
318!> \brief ...
319!> \param env_id ...
320!> \param pos ...
321!> \param n_el ...
322! **************************************************************************************************
323 SUBROUTINE cp2k_get_positions(env_id, pos, n_el) BIND(C)
324 INTEGER(C_INT), VALUE :: env_id, n_el
325 REAL(c_double), DIMENSION(1:n_el), INTENT(OUT) :: pos
326
327 INTEGER :: ierr
328
329 CALL get_pos(env_id, pos, n_el, ierr)
330 cpassert(ierr == 0)
331 END SUBROUTINE cp2k_get_positions
332
333! **************************************************************************************************
334!> \brief ...
335!> \param env_id ...
336!> \param force ...
337!> \param n_el ...
338! **************************************************************************************************
339 SUBROUTINE cp2k_get_forces(env_id, force, n_el) BIND(C)
340 INTEGER(C_INT), VALUE :: env_id, n_el
341 REAL(c_double), DIMENSION(1:n_el), INTENT(OUT) :: force
342
343 INTEGER :: ierr
344
345 CALL get_force(env_id, force, n_el, ierr)
346 cpassert(ierr == 0)
347 END SUBROUTINE cp2k_get_forces
348
349! **************************************************************************************************
350!> \brief ...
351!> \param env_id ...
352!> \param e_pot ...
353! **************************************************************************************************
354 SUBROUTINE cp2k_get_potential_energy(env_id, e_pot) BIND(C)
355 INTEGER(C_INT), VALUE :: env_id
356 REAL(c_double), INTENT(OUT) :: e_pot
357
358 INTEGER :: ierr
359
360 CALL get_energy(env_id, e_pot, ierr)
361 cpassert(ierr == 0)
362 END SUBROUTINE cp2k_get_potential_energy
363
364! **************************************************************************************************
365!> \brief ...
366!> \param env_id ...
367!> \param cell ...
368! **************************************************************************************************
369 SUBROUTINE cp2k_get_cell(env_id, cell) BIND(C)
370 INTEGER(C_INT), VALUE :: env_id
371 REAL(c_double), DIMENSION(3, 3), INTENT(OUT) :: cell
372
373 INTEGER :: ierr
374
375 CALL get_cell(env_id, cell=cell, ierr=ierr)
376 cpassert(ierr == 0)
377 END SUBROUTINE cp2k_get_cell
378
379! **************************************************************************************************
380!> \brief ...
381!> \param env_id ...
382!> \param cell ...
383! **************************************************************************************************
384 SUBROUTINE cp2k_get_qmmm_cell(env_id, cell) BIND(C)
385 INTEGER(C_INT), VALUE :: env_id
386 REAL(c_double), DIMENSION(3, 3), INTENT(OUT) :: cell
387
388 INTEGER :: ierr
389
390 CALL get_qmmm_cell(env_id, cell=cell, ierr=ierr)
391 cpassert(ierr == 0)
392 END SUBROUTINE cp2k_get_qmmm_cell
393
394! **************************************************************************************************
395!> \brief ...
396!> \param env_id ...
397! **************************************************************************************************
398 SUBROUTINE cp2k_calc_energy_force(env_id) BIND(C)
399 INTEGER(C_INT), VALUE :: env_id
400
401 INTEGER :: ierr
402
403 CALL calc_energy_force(env_id, .true., ierr)
404 cpassert(ierr == 0)
405 END SUBROUTINE cp2k_calc_energy_force
406
407! **************************************************************************************************
408!> \brief ...
409!> \param env_id ...
410! **************************************************************************************************
411 SUBROUTINE cp2k_calc_energy(env_id) BIND(C)
412 INTEGER(C_INT), VALUE :: env_id
413
414 INTEGER :: ierr
415
416 CALL calc_energy_force(env_id, .false., ierr)
417 cpassert(ierr == 0)
418 END SUBROUTINE cp2k_calc_energy
419
420! **************************************************************************************************
421!> \brief ...
422!> \param input_file_path ...
423!> \param output_file_path ...
424! **************************************************************************************************
425 SUBROUTINE cp2k_run_input(input_file_path, output_file_path) BIND(C)
426 CHARACTER(LEN=1, KIND=C_CHAR), INTENT(IN) :: input_file_path(*), output_file_path(*)
427
428 CHARACTER(LEN=default_path_length) :: ifp, ofp
429 INTEGER :: ncopied
430 TYPE(section_type), POINTER :: input_declaration
431
432 ifp = " "; ofp = " "
433 ncopied = strlcpy_c2f(ifp, input_file_path)
434 ncopied = strlcpy_c2f(ofp, output_file_path)
435
436 NULLIFY (input_declaration)
437 CALL create_cp2k_root_section(input_declaration)
438 CALL run_input(input_declaration, ifp, ofp, empty_initial_variables)
439 CALL section_release(input_declaration)
440 END SUBROUTINE cp2k_run_input
441
442! **************************************************************************************************
443!> \brief ...
444!> \param input_file_path ...
445!> \param output_file_path ...
446!> \param mpi_comm ...
447! **************************************************************************************************
448 SUBROUTINE cp2k_run_input_comm(input_file_path, output_file_path, mpi_comm) BIND(C)
449 CHARACTER(LEN=1, KIND=C_CHAR), INTENT(IN) :: input_file_path(*), output_file_path(*)
450 INTEGER(C_INT), VALUE :: mpi_comm
451
452 CHARACTER(LEN=default_path_length) :: ifp, ofp
453 INTEGER :: ncopied
454 TYPE(mp_comm_type) :: my_mpi_comm
455 TYPE(section_type), POINTER :: input_declaration
456
457 ifp = " "; ofp = " "
458 ncopied = strlcpy_c2f(ifp, input_file_path)
459 ncopied = strlcpy_c2f(ofp, output_file_path)
460
461 NULLIFY (input_declaration)
462 CALL create_cp2k_root_section(input_declaration)
463 CALL my_mpi_comm%set_handle(int(mpi_comm))
464 CALL run_input(input_declaration, ifp, ofp, empty_initial_variables, my_mpi_comm)
465 CALL section_release(input_declaration)
466 END SUBROUTINE cp2k_run_input_comm
467
468! **************************************************************************************************
469!> \brief Gets a function pointer pointing to a routine defined in C/C++ and
470!> passes it to the transport environment in force environment
471!> \param f_env_id the force env id
472!> \param func_ptr the function pointer
473!> \par History
474!> 12.2012 created [Hossein Bani-Hashemian]
475!> \author Mohammad Hossein Bani-Hashemian
476! **************************************************************************************************
477 SUBROUTINE cp2k_transport_set_callback(f_env_id, func_ptr) BIND(C)
478 INTEGER(C_INT), VALUE :: f_env_id
479 TYPE(c_funptr), VALUE :: func_ptr
480
481 INTEGER :: ierr, in_use
482 TYPE(f_env_type), POINTER :: f_env
483
484 NULLIFY (f_env)
485 CALL f_env_add_defaults(f_env_id, f_env)
486 CALL force_env_get(f_env%force_env, in_use=in_use)
487 IF (in_use == use_qs_force) THEN
488 f_env%force_env%qs_env%transport_env%ext_c_method_ptr = func_ptr
489 END IF
490 CALL f_env_rm_defaults(f_env, ierr)
491 cpassert(ierr == 0)
492 END SUBROUTINE cp2k_transport_set_callback
493
494! **************************************************************************************************
495!> \brief Get the number of molecular orbitals
496!> \param f_env_id the force env id
497!> \return The number of elements or -1 if unavailable
498!> \author Tiziano Mueller
499! **************************************************************************************************
500 INTEGER(C_INT) FUNCTION cp2k_active_space_get_mo_count(f_env_id) RESULT(nmo) BIND(C)
502 USE qs_mo_types, ONLY: get_mo_set
504 INTEGER(C_INT), VALUE :: f_env_id
505
506 INTEGER :: ierr
507 TYPE(active_space_type), POINTER :: active_space_env
508 TYPE(f_env_type), POINTER :: f_env
509
510 nmo = -1
511 NULLIFY (f_env)
512
513 CALL f_env_add_defaults(f_env_id, f_env)
514
515 try: block
516 CALL get_qs_env(f_env%force_env%qs_env, active_space=active_space_env)
517
518 IF (.NOT. ASSOCIATED(active_space_env)) THEN
519 EXIT try
520 END IF
521
522 CALL get_mo_set(active_space_env%mos_active(1), nmo=nmo)
523 END BLOCK try
524
525 CALL f_env_rm_defaults(f_env, ierr)
526 cpassert(ierr == 0)
528
529! **************************************************************************************************
530!> \brief Get the active space Fock sub-matrix (as a full matrix)
531!> \param f_env_id the force env id
532!> \param buf C array to write the data to
533!> \param buf_len The length of the C array to write the data to (must be at least mo_count^2)
534!> \return The number of elements written or -1 if unavailable or buffer too small
535!> \author Tiziano Mueller
536! **************************************************************************************************
537 INTEGER(C_LONG) FUNCTION cp2k_active_space_get_fock_sub(f_env_id, buf, buf_len) RESULT(nelem) BIND(C)
539 USE qs_mo_types, ONLY: get_mo_set
541 INTEGER(C_INT), VALUE :: f_env_id
542 INTEGER(C_LONG), VALUE :: buf_len
543 REAL(c_double), DIMENSION(0:buf_len-1), &
544 INTENT(OUT) :: buf
545
546 INTEGER :: i, ierr, j, norb
547 REAL(c_double) :: mval
548 TYPE(active_space_type), POINTER :: active_space_env
549 TYPE(f_env_type), POINTER :: f_env
550
551 nelem = -1
552 NULLIFY (f_env)
553
554 CALL f_env_add_defaults(f_env_id, f_env)
555
556 try: block
557 CALL get_qs_env(f_env%force_env%qs_env, active_space=active_space_env)
558
559 IF (.NOT. ASSOCIATED(active_space_env)) THEN
560 EXIT try
561 END IF
562
563 CALL get_mo_set(active_space_env%mos_active(1), nmo=norb)
564
565 IF (buf_len < norb*norb) THEN
566 EXIT try
567 END IF
568
569 DO i = 0, norb - 1
570 DO j = 0, norb - 1
571 CALL cp_fm_get_element(active_space_env%fock_sub(1), i + 1, j + 1, mval)
572 buf(norb*i + j) = mval
573 buf(norb*j + i) = mval
574 END DO
575 END DO
576
577 ! finished successfully, set number of written elements
578 nelem = norb**norb
579 END BLOCK try
580
581 CALL f_env_rm_defaults(f_env, ierr)
582 cpassert(ierr == 0)
584
585! **************************************************************************************************
586!> \brief Get the number of non-zero elements of the ERI
587!> \param f_env_id the force env id
588!> \return The number of elements or -1 if unavailable
589!> \author Tiziano Mueller
590! **************************************************************************************************
591 INTEGER(C_LONG) FUNCTION cp2k_active_space_get_eri_nze_count(f_env_id) RESULT(nze_count) BIND(C)
594 INTEGER(C_INT), VALUE :: f_env_id
595
596 INTEGER :: ierr
597 TYPE(active_space_type), POINTER :: active_space_env
598 TYPE(f_env_type), POINTER :: f_env
599
600 nze_count = -1
601 NULLIFY (f_env)
602
603 CALL f_env_add_defaults(f_env_id, f_env)
604
605 try: block
606 CALL get_qs_env(f_env%force_env%qs_env, active_space=active_space_env)
607
608 IF (.NOT. ASSOCIATED(active_space_env)) THEN
609 EXIT try
610 END IF
611
612 nze_count = int(active_space_env%eri%eri(1)%csr_mat%nze_total, kind(nze_count))
613 END BLOCK try
614
615 CALL f_env_rm_defaults(f_env, ierr)
616 cpassert(ierr == 0)
618
619! **************************************************************************************************
620!> \brief Get the electron repulsion integrals (as a sparse tensor)
621!> \param f_env_id the force env id
622!> \param buf_coords C array to write the indizes (i,j,k,l) to
623!> \param buf_coords_len size of the buffer, must be at least 4*nze_count
624!> \param buf_values C array to write the values to
625!> \param buf_values_len size of the buffer, must be at least nze_count
626!> \return The number of elements written or -1 if unavailable or buffer too small
627!> \author Tiziano Mueller
628! **************************************************************************************************
629 INTEGER(C_LONG) FUNCTION cp2k_active_space_get_eri(f_env_id, &
630 buf_coords, buf_coords_len, &
631 buf_values, buf_values_len) RESULT(nelem) BIND(C)
633 USE qs_mo_types, ONLY: get_mo_set
635 INTEGER(C_INT), INTENT(IN), VALUE :: f_env_id
636 INTEGER(C_LONG), INTENT(IN), VALUE :: buf_coords_len
637 INTEGER(C_INT), INTENT(OUT), TARGET :: buf_coords(1:buf_coords_len)
638 INTEGER(C_LONG), INTENT(IN), VALUE :: buf_values_len
639 REAL(c_double), INTENT(OUT), TARGET :: buf_values(1:buf_values_len)
640
641 INTEGER :: ierr
642 TYPE(active_space_type), POINTER :: active_space_env
643 TYPE(f_env_type), POINTER :: f_env
644
645 nelem = -1
646 NULLIFY (f_env)
647
648 CALL f_env_add_defaults(f_env_id, f_env)
649
650 try: block
651 CALL get_qs_env(f_env%force_env%qs_env, active_space=active_space_env)
652
653 IF (.NOT. ASSOCIATED(active_space_env)) THEN
654 EXIT try
655 END IF
656
657 associate(nze => active_space_env%eri%eri(1)%csr_mat%nze_total)
658 IF (buf_coords_len < 4*nze .OR. buf_values_len < nze) THEN
659 EXIT try
660 END IF
661
662 CALL active_space_env%eri%eri_foreach(1, active_space_env%active_orbitals, eri2array(buf_coords, buf_values))
663
664 nelem = int(nze, kind(nelem))
665 END associate
666 END BLOCK try
667
668 CALL f_env_rm_defaults(f_env, ierr)
669 cpassert(ierr == 0)
670 END FUNCTION cp2k_active_space_get_eri
671
672! **************************************************************************************************
673!> \brief Copy the active space ERI to C buffers
674!> \param this Class pointer
675!> \param i The i index of the value `val`
676!> \param j The j index of the value `val`
677!> \param k The k index of the value `val`
678!> \param l The l index of the value `val`
679!> \param val The value at the given index
680!> \return Always true to continue with the loop
681!> \author Tiziano Mueller
682! **************************************************************************************************
683 LOGICAL FUNCTION eri2array_func(this, i, j, k, l, val) RESULT(cont)
684 CLASS(eri2array), INTENT(inout) :: this
685 INTEGER, INTENT(in) :: i, j, k, l
686 REAL(kind=dp), INTENT(in) :: val
687
688 this%coords(4*(this%idx - 1) + 1) = i
689 this%coords(4*(this%idx - 1) + 2) = j
690 this%coords(4*(this%idx - 1) + 3) = k
691 this%coords(4*(this%idx - 1) + 4) = l
692 this%values(this%idx) = val
693
694 this%idx = this%idx + 1
695
696 cont = .true.
697 END FUNCTION eri2array_func
698
699END MODULE libcp2k
some minimal info about CP2K, including its version and license
Definition cp2k_info.F:22
character(len= *), parameter, public cp2k_version
Definition cp2k_info.F:49
subroutine, public run_input(input_declaration, input_file_path, output_file_path, initial_variables, mpi_comm)
runs the given input
Definition cp2k_runs.F:929
represent a full matrix distributed on many processors
Definition cp_fm_types.F:15
subroutine, public cp_fm_get_element(matrix, irow_global, icol_global, alpha, local)
returns an element of a fm this value is valid on every cpu using this call is expensive
interface to use cp2k as library
recursive subroutine, public destroy_force_env(env_id, ierr, q_finalize)
deallocates the force_env with the given id
subroutine, public set_vel(env_id, new_vel, n_el, ierr)
sets the velocities of the particles
subroutine, public get_nparticle(env_id, n_particle, ierr)
returns the number of particles in the given force env
subroutine, public get_natom(env_id, n_atom, ierr)
returns the number of atoms in the given force env
subroutine, public f_env_add_defaults(f_env_id, f_env, handle)
adds the default environments of the f_env to the stack of the defaults, and returns a new error and ...
subroutine, public get_cell(env_id, cell, per, ierr)
gets a cell
recursive subroutine, public calc_energy_force(env_id, calc_force, ierr)
updates the energy and the forces of given force_env
subroutine, public get_energy(env_id, e_pot, ierr)
returns the energy of the last configuration calculated
subroutine, public init_cp2k(init_mpi, ierr, mpi_comm)
initializes cp2k, needs to be called once before using any of the other functions when using cp2k as ...
subroutine, public get_qmmm_cell(env_id, cell, ierr)
gets the qmmm cell
subroutine, public get_pos(env_id, pos, n_el, ierr)
gets the positions of the particles
recursive subroutine, public create_force_env(new_env_id, input_declaration, input_path, output_path, mpi_comm, output_unit, owns_out_unit, input, ierr, work_dir, initial_variables)
creates a new force environment using the given input, and writing the output to the given output uni...
subroutine, public get_result_r1(env_id, description, n, result, res_exist, ierr)
gets a result from CP2K that is a real 1D array
subroutine, public set_cell(env_id, new_cell, ierr)
sets a new cell
subroutine, public finalize_cp2k(finalize_mpi, ierr)
cleanup after you have finished using this interface
subroutine, public set_pos(env_id, new_pos, n_el, ierr)
sets the positions of the particles
subroutine, public f_env_rm_defaults(f_env, ierr, handle)
removes the default environments of the f_env to the stack of the defaults, and sets ierr accordingly...
subroutine, public get_force(env_id, frc, n_el, ierr)
gets the forces of the particles
Interface for the force calculations.
recursive subroutine, public force_env_get(force_env, in_use, fist_env, qs_env, meta_env, fp_env, subsys, para_env, potential_energy, additional_potential, kinetic_energy, harmonic_shell, kinetic_shell, cell, sub_force_env, qmmm_env, qmmmx_env, eip_env, pwdft_env, globenv, input, force_env_section, method_name_id, root_section, mixed_env, nnp_env, embed_env, ipi_env)
returns various attributes about the force environment
integer, parameter, public use_qs_force
parse cp2k input files
builds the input structure for cp2k
Definition input_cp2k.F:14
subroutine, public create_cp2k_root_section(root_section)
creates the input structure of the file used by cp2k
Definition input_cp2k.F:75
objects that represent the structure of input sections and the data contained in an input section
recursive subroutine, public section_release(section)
releases the given keyword list (see doc/ReferenceCounting.html)
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
integer, parameter, public default_path_length
Definition kinds.F:58
CP2K C/C++ interface.
Definition libcp2k.F:20
subroutine, public cp2k_create_force_env_comm(new_env_id, input_file_path, output_file_path, mpi_comm)
...
Definition libcp2k.F:183
subroutine, public cp2k_get_nparticle(env_id, nparticle)
...
Definition libcp2k.F:308
subroutine, public cp2k_get_natom(env_id, natom)
...
Definition libcp2k.F:293
subroutine, public cp2k_calc_energy_force(env_id)
...
Definition libcp2k.F:399
subroutine, public cp2k_finalize()
...
Definition libcp2k.F:134
subroutine, public cp2k_finalize_without_mpi()
...
Definition libcp2k.F:144
subroutine, public cp2k_run_input_comm(input_file_path, output_file_path, mpi_comm)
...
Definition libcp2k.F:449
subroutine, public cp2k_run_input(input_file_path, output_file_path)
...
Definition libcp2k.F:426
subroutine, public cp2k_init_without_mpi()
...
Definition libcp2k.F:109
subroutine, public cp2k_get_potential_energy(env_id, e_pot)
...
Definition libcp2k.F:355
integer(c_int) function, public cp2k_active_space_get_mo_count(f_env_id)
Get the number of molecular orbitals.
Definition libcp2k.F:501
subroutine, public cp2k_get_cell(env_id, cell)
...
Definition libcp2k.F:370
subroutine, public cp2k_create_force_env(new_env_id, input_file_path, output_file_path)
...
Definition libcp2k.F:157
subroutine, public cp2k_init_without_mpi_comm(mpi_comm)
...
Definition libcp2k.F:120
subroutine, public cp2k_set_velocities(env_id, new_vel, n_el)
...
Definition libcp2k.F:240
subroutine, public cp2k_init()
...
Definition libcp2k.F:99
subroutine, public cp2k_get_result(env_id, description, result, n_el)
...
Definition libcp2k.F:272
subroutine, public cp2k_get_forces(env_id, force, n_el)
...
Definition libcp2k.F:340
integer(c_long) function, public cp2k_active_space_get_eri_nze_count(f_env_id)
Get the number of non-zero elements of the ERI.
Definition libcp2k.F:592
integer(c_long) function, public cp2k_active_space_get_fock_sub(f_env_id, buf, buf_len)
Get the active space Fock sub-matrix (as a full matrix)
Definition libcp2k.F:538
subroutine, public cp2k_transport_set_callback(f_env_id, func_ptr)
Gets a function pointer pointing to a routine defined in C/C++ and passes it to the transport environ...
Definition libcp2k.F:478
subroutine, public cp2k_get_qmmm_cell(env_id, cell)
...
Definition libcp2k.F:385
subroutine, public cp2k_get_version(version_str, str_length)
...
Definition libcp2k.F:79
subroutine, public cp2k_set_cell(env_id, new_cell)
...
Definition libcp2k.F:255
integer(c_long) function, public cp2k_active_space_get_eri(f_env_id, buf_coords, buf_coords_len, buf_values, buf_values_len)
Get the electron repulsion integrals (as a sparse tensor)
Definition libcp2k.F:632
subroutine, public cp2k_get_positions(env_id, pos, n_el)
...
Definition libcp2k.F:324
subroutine, public cp2k_set_positions(env_id, new_pos, n_el)
...
Definition libcp2k.F:224
subroutine, public cp2k_calc_energy(env_id)
...
Definition libcp2k.F:412
subroutine, public cp2k_destroy_force_env(env_id)
...
Definition libcp2k.F:209
Interface to the message passing library MPI.
The types needed for the calculation of active space Hamiltonians.
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_vhxc, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
Definition and initialisation of the mo data type.
Definition qs_mo_types.F:22
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kts, mu, flexible_electron_count)
Get the components of a MO set data structure.
Utilities for string manipulations.
integer function, public strlcpy_c2f(fstring, cstring)
Copy the content of a \0-terminated C-string to a finite-length Fortran string.
represent a section of the input file
Abstract function object for the eri_type_eri_foreach method.