(git:8dd14c0)
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-2025 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
52 TYPE, EXTENDS(eri_type_eri_element_func) :: eri2array
53 INTEGER(C_INT), POINTER :: coords(:) => null()
54 REAL(C_DOUBLE), POINTER :: values(:) => null()
55 INTEGER :: idx = 1
56 CONTAINS
57 PROCEDURE :: func => eri2array_func
58 END TYPE
59
60CONTAINS
61
62! **************************************************************************************************
63!> \brief ...
64!> \param version_str ...
65!> \param str_length ...
66! **************************************************************************************************
67 SUBROUTINE cp2k_get_version(version_str, str_length) BIND(C)
68 CHARACTER(LEN=1, KIND=C_CHAR), INTENT(OUT) :: version_str(*)
69 INTEGER(C_INT), VALUE :: str_length
70
71 INTEGER :: i, n
72
73 n = len_trim(cp2k_version)
74 cpassert(str_length >= n + 1)
75 mark_used(str_length)
76
77 ! copy string
78 DO i = 1, n
79 version_str(i) = cp2k_version(i:i)
80 END DO
81 version_str(n + 1) = c_null_char
82 END SUBROUTINE cp2k_get_version
83
84! **************************************************************************************************
85!> \brief ...
86! **************************************************************************************************
87 SUBROUTINE cp2k_init() BIND(C)
88 INTEGER :: ierr
89
90 CALL init_cp2k(.true., ierr)
91 cpassert(ierr == 0)
92 END SUBROUTINE cp2k_init
93
94! **************************************************************************************************
95!> \brief ...
96! **************************************************************************************************
97 SUBROUTINE cp2k_init_without_mpi() BIND(C)
98 INTEGER :: ierr
99
100 CALL init_cp2k(.false., ierr)
101 cpassert(ierr == 0)
102 END SUBROUTINE cp2k_init_without_mpi
103
104! **************************************************************************************************
105!> \brief ...
106!> \param mpi_comm ...
107! **************************************************************************************************
108 SUBROUTINE cp2k_init_without_mpi_comm(mpi_comm) BIND(C)
109 INTEGER(C_INT), VALUE :: mpi_comm
110
111 INTEGER :: ierr
112 TYPE(mp_comm_type) :: my_mpi_comm
113
114 CALL my_mpi_comm%set_handle(int(mpi_comm))
115 CALL init_cp2k(.false., ierr, my_mpi_comm)
116 cpassert(ierr == 0)
117 END SUBROUTINE cp2k_init_without_mpi_comm
118
119! **************************************************************************************************
120!> \brief ...
121! **************************************************************************************************
122 SUBROUTINE cp2k_finalize() BIND(C)
123 INTEGER :: ierr
124
125 CALL finalize_cp2k(.true., ierr)
126 cpassert(ierr == 0)
127 END SUBROUTINE cp2k_finalize
128
129! **************************************************************************************************
130!> \brief ...
131! **************************************************************************************************
132 SUBROUTINE cp2k_finalize_without_mpi() BIND(C)
133 INTEGER :: ierr
134
135 CALL finalize_cp2k(.false., ierr)
136 cpassert(ierr == 0)
137 END SUBROUTINE cp2k_finalize_without_mpi
138
139! **************************************************************************************************
140!> \brief ...
141!> \param new_env_id ...
142!> \param input_file_path ...
143!> \param output_file_path ...
144! **************************************************************************************************
145 SUBROUTINE cp2k_create_force_env(new_env_id, input_file_path, output_file_path) BIND(C)
146 INTEGER(C_INT), INTENT(OUT) :: new_env_id
147 CHARACTER(LEN=1, KIND=C_CHAR), INTENT(IN) :: input_file_path(*), output_file_path(*)
148
149 CHARACTER(LEN=default_path_length) :: ifp, ofp
150 INTEGER :: ierr, ncopied
151 TYPE(section_type), POINTER :: input_declaration
152
153 ifp = " "; ofp = " "
154 ncopied = strlcpy_c2f(ifp, input_file_path)
155 ncopied = strlcpy_c2f(ofp, output_file_path)
156
157 NULLIFY (input_declaration)
158 CALL create_cp2k_root_section(input_declaration)
159 CALL create_force_env(new_env_id, input_declaration, ifp, ofp, ierr=ierr)
160 CALL section_release(input_declaration)
161 cpassert(ierr == 0)
162 END SUBROUTINE cp2k_create_force_env
163
164! **************************************************************************************************
165!> \brief ...
166!> \param new_env_id ...
167!> \param input_file_path ...
168!> \param output_file_path ...
169!> \param mpi_comm ...
170! **************************************************************************************************
171 SUBROUTINE cp2k_create_force_env_comm(new_env_id, input_file_path, output_file_path, mpi_comm) BIND(C)
172 INTEGER(C_INT), INTENT(OUT) :: new_env_id
173 CHARACTER(LEN=1, KIND=C_CHAR), INTENT(IN) :: input_file_path(*), output_file_path(*)
174 INTEGER(C_INT), VALUE :: mpi_comm
175
176 CHARACTER(LEN=default_path_length) :: ifp, ofp
177 INTEGER :: ierr, ncopied
178 TYPE(mp_comm_type) :: my_mpi_comm
179 TYPE(section_type), POINTER :: input_declaration
180
181 ifp = " "; ofp = " "
182 ncopied = strlcpy_c2f(ifp, input_file_path)
183 ncopied = strlcpy_c2f(ofp, output_file_path)
184
185 NULLIFY (input_declaration)
186 CALL create_cp2k_root_section(input_declaration)
187 CALL my_mpi_comm%set_handle(int(mpi_comm))
188 CALL create_force_env(new_env_id, input_declaration, ifp, ofp, my_mpi_comm, ierr=ierr)
189 CALL section_release(input_declaration)
190 cpassert(ierr == 0)
191 END SUBROUTINE cp2k_create_force_env_comm
192
193! **************************************************************************************************
194!> \brief ...
195!> \param env_id ...
196! **************************************************************************************************
197 SUBROUTINE cp2k_destroy_force_env(env_id) BIND(C)
198 INTEGER(C_INT), VALUE :: env_id
199
200 INTEGER :: ierr
201
202 CALL destroy_force_env(env_id, ierr)
203 cpassert(ierr == 0)
204 END SUBROUTINE cp2k_destroy_force_env
205
206! **************************************************************************************************
207!> \brief ...
208!> \param env_id ...
209!> \param new_pos ...
210!> \param n_el ...
211! **************************************************************************************************
212 SUBROUTINE cp2k_set_positions(env_id, new_pos, n_el) BIND(C)
213 INTEGER(C_INT), VALUE :: env_id, n_el
214 REAL(C_DOUBLE), DIMENSION(1:n_el), INTENT(IN) :: new_pos
215
216 INTEGER :: ierr
217
218 CALL set_pos(env_id, new_pos, n_el, ierr)
219 cpassert(ierr == 0)
220 END SUBROUTINE cp2k_set_positions
221
222! **************************************************************************************************
223!> \brief ...
224!> \param env_id ...
225!> \param new_vel ...
226!> \param n_el ...
227! **************************************************************************************************
228 SUBROUTINE cp2k_set_velocities(env_id, new_vel, n_el) BIND(C)
229 INTEGER(C_INT), VALUE :: env_id, n_el
230 REAL(C_DOUBLE), DIMENSION(1:n_el), INTENT(IN) :: new_vel
231
232 INTEGER :: ierr
233
234 CALL set_vel(env_id, new_vel, n_el, ierr)
235 cpassert(ierr == 0)
236 END SUBROUTINE cp2k_set_velocities
237
238! **************************************************************************************************
239!> \brief ...
240!> \param env_id ...
241!> \param new_cell ...
242! **************************************************************************************************
243 SUBROUTINE cp2k_set_cell(env_id, new_cell) BIND(C)
244 INTEGER(C_INT), VALUE :: env_id
245 REAL(C_DOUBLE), DIMENSION(3, 3), INTENT(IN) :: new_cell
246
247 INTEGER :: ierr
248
249 CALL set_cell(env_id, new_cell, ierr)
250 cpassert(ierr == 0)
251 END SUBROUTINE cp2k_set_cell
252
253! **************************************************************************************************
254!> \brief ...
255!> \param env_id ...
256!> \param description ...
257!> \param RESULT ...
258!> \param n_el ...
259! **************************************************************************************************
260 SUBROUTINE cp2k_get_result(env_id, description, RESULT, n_el) BIND(C)
261 INTEGER(C_INT), VALUE :: env_id
262 CHARACTER(LEN=1, KIND=C_CHAR), INTENT(IN) :: description(*)
263 INTEGER(C_INT), VALUE :: n_el
264 REAL(C_DOUBLE), DIMENSION(1:n_el), INTENT(OUT) :: RESULT
265
266 CHARACTER(LEN=default_string_length) :: desc_low
267 INTEGER :: ierr, ncopied
268
269 desc_low = " "
270 ncopied = strlcpy_c2f(desc_low, description)
271
272 CALL get_result_r1(env_id, desc_low, n_el, result, ierr=ierr)
273 cpassert(ierr == 0)
274 END SUBROUTINE cp2k_get_result
275
276! **************************************************************************************************
277!> \brief ...
278!> \param env_id ...
279!> \param natom ...
280! **************************************************************************************************
281 SUBROUTINE cp2k_get_natom(env_id, natom) BIND(C)
282 INTEGER(C_INT), VALUE :: env_id
283 INTEGER(C_INT), INTENT(OUT) :: natom
284
285 INTEGER :: ierr
286
287 CALL get_natom(env_id, natom, ierr)
288 cpassert(ierr == 0)
289 END SUBROUTINE cp2k_get_natom
290
291! **************************************************************************************************
292!> \brief ...
293!> \param env_id ...
294!> \param nparticle ...
295! **************************************************************************************************
296 SUBROUTINE cp2k_get_nparticle(env_id, nparticle) BIND(C)
297 INTEGER(C_INT), VALUE :: env_id
298 INTEGER(C_INT), INTENT(OUT) :: nparticle
299
300 INTEGER :: ierr
301
302 CALL get_nparticle(env_id, nparticle, ierr)
303 cpassert(ierr == 0)
304 END SUBROUTINE cp2k_get_nparticle
305
306! **************************************************************************************************
307!> \brief ...
308!> \param env_id ...
309!> \param pos ...
310!> \param n_el ...
311! **************************************************************************************************
312 SUBROUTINE cp2k_get_positions(env_id, pos, n_el) BIND(C)
313 INTEGER(C_INT), VALUE :: env_id, n_el
314 REAL(C_DOUBLE), DIMENSION(1:n_el), INTENT(OUT) :: pos
315
316 INTEGER :: ierr
317
318 CALL get_pos(env_id, pos, n_el, ierr)
319 cpassert(ierr == 0)
320 END SUBROUTINE cp2k_get_positions
321
322! **************************************************************************************************
323!> \brief ...
324!> \param env_id ...
325!> \param force ...
326!> \param n_el ...
327! **************************************************************************************************
328 SUBROUTINE cp2k_get_forces(env_id, force, n_el) BIND(C)
329 INTEGER(C_INT), VALUE :: env_id, n_el
330 REAL(C_DOUBLE), DIMENSION(1:n_el), INTENT(OUT) :: force
331
332 INTEGER :: ierr
333
334 CALL get_force(env_id, force, n_el, ierr)
335 cpassert(ierr == 0)
336 END SUBROUTINE cp2k_get_forces
337
338! **************************************************************************************************
339!> \brief ...
340!> \param env_id ...
341!> \param e_pot ...
342! **************************************************************************************************
343 SUBROUTINE cp2k_get_potential_energy(env_id, e_pot) BIND(C)
344 INTEGER(C_INT), VALUE :: env_id
345 REAL(C_DOUBLE), INTENT(OUT) :: e_pot
346
347 INTEGER :: ierr
348
349 CALL get_energy(env_id, e_pot, ierr)
350 cpassert(ierr == 0)
351 END SUBROUTINE cp2k_get_potential_energy
352
353! **************************************************************************************************
354!> \brief ...
355!> \param env_id ...
356!> \param cell ...
357! **************************************************************************************************
358 SUBROUTINE cp2k_get_cell(env_id, cell) BIND(C)
359 INTEGER(C_INT), VALUE :: env_id
360 REAL(C_DOUBLE), DIMENSION(3, 3), INTENT(OUT) :: cell
361
362 INTEGER :: ierr
363
364 CALL get_cell(env_id, cell=cell, ierr=ierr)
365 cpassert(ierr == 0)
366 END SUBROUTINE cp2k_get_cell
367
368! **************************************************************************************************
369!> \brief ...
370!> \param env_id ...
371!> \param cell ...
372! **************************************************************************************************
373 SUBROUTINE cp2k_get_qmmm_cell(env_id, cell) BIND(C)
374 INTEGER(C_INT), VALUE :: env_id
375 REAL(C_DOUBLE), DIMENSION(3, 3), INTENT(OUT) :: cell
376
377 INTEGER :: ierr
378
379 CALL get_qmmm_cell(env_id, cell=cell, ierr=ierr)
380 cpassert(ierr == 0)
381 END SUBROUTINE cp2k_get_qmmm_cell
382
383! **************************************************************************************************
384!> \brief ...
385!> \param env_id ...
386! **************************************************************************************************
387 SUBROUTINE cp2k_calc_energy_force(env_id) BIND(C)
388 INTEGER(C_INT), VALUE :: env_id
389
390 INTEGER :: ierr
391
392 CALL calc_energy_force(env_id, .true., ierr)
393 cpassert(ierr == 0)
394 END SUBROUTINE cp2k_calc_energy_force
395
396! **************************************************************************************************
397!> \brief ...
398!> \param env_id ...
399! **************************************************************************************************
400 SUBROUTINE cp2k_calc_energy(env_id) BIND(C)
401 INTEGER(C_INT), VALUE :: env_id
402
403 INTEGER :: ierr
404
405 CALL calc_energy_force(env_id, .false., ierr)
406 cpassert(ierr == 0)
407 END SUBROUTINE cp2k_calc_energy
408
409! **************************************************************************************************
410!> \brief ...
411!> \param input_file_path ...
412!> \param output_file_path ...
413! **************************************************************************************************
414 SUBROUTINE cp2k_run_input(input_file_path, output_file_path) BIND(C)
415 CHARACTER(LEN=1, KIND=C_CHAR), INTENT(IN) :: input_file_path(*), output_file_path(*)
416
417 CHARACTER(LEN=default_path_length) :: ifp, ofp
418 INTEGER :: ncopied
419 TYPE(section_type), POINTER :: input_declaration
420
421 ifp = " "; ofp = " "
422 ncopied = strlcpy_c2f(ifp, input_file_path)
423 ncopied = strlcpy_c2f(ofp, output_file_path)
424
425 NULLIFY (input_declaration)
426 CALL create_cp2k_root_section(input_declaration)
427 CALL run_input(input_declaration, ifp, ofp, empty_initial_variables)
428 CALL section_release(input_declaration)
429 END SUBROUTINE cp2k_run_input
430
431! **************************************************************************************************
432!> \brief ...
433!> \param input_file_path ...
434!> \param output_file_path ...
435!> \param mpi_comm ...
436! **************************************************************************************************
437 SUBROUTINE cp2k_run_input_comm(input_file_path, output_file_path, mpi_comm) BIND(C)
438 CHARACTER(LEN=1, KIND=C_CHAR), INTENT(IN) :: input_file_path(*), output_file_path(*)
439 INTEGER(C_INT), VALUE :: mpi_comm
440
441 CHARACTER(LEN=default_path_length) :: ifp, ofp
442 INTEGER :: ncopied
443 TYPE(mp_comm_type) :: my_mpi_comm
444 TYPE(section_type), POINTER :: input_declaration
445
446 ifp = " "; ofp = " "
447 ncopied = strlcpy_c2f(ifp, input_file_path)
448 ncopied = strlcpy_c2f(ofp, output_file_path)
449
450 NULLIFY (input_declaration)
451 CALL create_cp2k_root_section(input_declaration)
452 CALL my_mpi_comm%set_handle(int(mpi_comm))
453 CALL run_input(input_declaration, ifp, ofp, empty_initial_variables, my_mpi_comm)
454 CALL section_release(input_declaration)
455 END SUBROUTINE cp2k_run_input_comm
456
457! **************************************************************************************************
458!> \brief Gets a function pointer pointing to a routine defined in C/C++ and
459!> passes it to the transport environment in force environment
460!> \param f_env_id the force env id
461!> \param func_ptr the function pointer
462!> \par History
463!> 12.2012 created [Hossein Bani-Hashemian]
464!> \author Mohammad Hossein Bani-Hashemian
465! **************************************************************************************************
466 SUBROUTINE cp2k_transport_set_callback(f_env_id, func_ptr) BIND(C)
467 INTEGER(C_INT), VALUE :: f_env_id
468 TYPE(c_funptr), VALUE :: func_ptr
469
470 INTEGER :: ierr, in_use
471 TYPE(f_env_type), POINTER :: f_env
472
473 NULLIFY (f_env)
474 CALL f_env_add_defaults(f_env_id, f_env)
475 CALL force_env_get(f_env%force_env, in_use=in_use)
476 IF (in_use .EQ. use_qs_force) THEN
477 f_env%force_env%qs_env%transport_env%ext_c_method_ptr = func_ptr
478 END IF
479 CALL f_env_rm_defaults(f_env, ierr)
480 cpassert(ierr == 0)
481 END SUBROUTINE cp2k_transport_set_callback
482
483! **************************************************************************************************
484!> \brief Get the number of molecular orbitals
485!> \param f_env_id the force env id
486!> \return The number of elements or -1 if unavailable
487!> \author Tiziano Mueller
488! **************************************************************************************************
489 INTEGER(C_INT) FUNCTION cp2k_active_space_get_mo_count(f_env_id) RESULT(nmo) BIND(C)
491 USE qs_mo_types, ONLY: get_mo_set
493 INTEGER(C_INT), VALUE :: f_env_id
494
495 INTEGER :: ierr
496 TYPE(active_space_type), POINTER :: active_space_env
497 TYPE(f_env_type), POINTER :: f_env
498
499 nmo = -1
500 NULLIFY (f_env)
501
502 CALL f_env_add_defaults(f_env_id, f_env)
503
504 try: block
505 CALL get_qs_env(f_env%force_env%qs_env, active_space=active_space_env)
506
507 IF (.NOT. ASSOCIATED(active_space_env)) &
508 EXIT try
509
510 CALL get_mo_set(active_space_env%mos_active(1), nmo=nmo)
511 END BLOCK try
512
513 CALL f_env_rm_defaults(f_env, ierr)
514 cpassert(ierr == 0)
515 END FUNCTION cp2k_active_space_get_mo_count
516
517! **************************************************************************************************
518!> \brief Get the active space Fock sub-matrix (as a full matrix)
519!> \param f_env_id the force env id
520!> \param buf C array to write the data to
521!> \param buf_len The length of the C array to write the data to (must be at least mo_count^2)
522!> \return The number of elements written or -1 if unavailable or buffer too small
523!> \author Tiziano Mueller
524! **************************************************************************************************
525 INTEGER(C_LONG) FUNCTION cp2k_active_space_get_fock_sub(f_env_id, buf, buf_len) RESULT(nelem) BIND(C)
527 USE qs_mo_types, ONLY: get_mo_set
529 INTEGER(C_INT), VALUE :: f_env_id
530 INTEGER(C_LONG), VALUE :: buf_len
531 REAL(C_DOUBLE), DIMENSION(0:buf_len-1), &
532 INTENT(OUT) :: buf
533
534 INTEGER :: i, ierr, j, norb
535 REAL(C_DOUBLE) :: mval
536 TYPE(active_space_type), POINTER :: active_space_env
537 TYPE(f_env_type), POINTER :: f_env
538
539 nelem = -1
540 NULLIFY (f_env)
541
542 CALL f_env_add_defaults(f_env_id, f_env)
543
544 try: block
545 CALL get_qs_env(f_env%force_env%qs_env, active_space=active_space_env)
546
547 IF (.NOT. ASSOCIATED(active_space_env)) &
548 EXIT try
549
550 CALL get_mo_set(active_space_env%mos_active(1), nmo=norb)
551
552 IF (buf_len < norb*norb) &
553 EXIT try
554
555 DO i = 0, norb - 1
556 DO j = 0, norb - 1
557 CALL cp_fm_get_element(active_space_env%fock_sub(1), i + 1, j + 1, mval)
558 buf(norb*i + j) = mval
559 buf(norb*j + i) = mval
560 END DO
561 END DO
562
563 ! finished successfully, set number of written elements
564 nelem = norb**norb
565 END BLOCK try
566
567 CALL f_env_rm_defaults(f_env, ierr)
568 cpassert(ierr == 0)
569 END FUNCTION cp2k_active_space_get_fock_sub
570
571! **************************************************************************************************
572!> \brief Get the number of non-zero elements of the ERI
573!> \param f_env_id the force env id
574!> \return The number of elements or -1 if unavailable
575!> \author Tiziano Mueller
576! **************************************************************************************************
577 INTEGER(C_LONG) FUNCTION cp2k_active_space_get_eri_nze_count(f_env_id) RESULT(nze_count) BIND(C)
580 INTEGER(C_INT), VALUE :: f_env_id
581
582 INTEGER :: ierr
583 TYPE(active_space_type), POINTER :: active_space_env
584 TYPE(f_env_type), POINTER :: f_env
585
586 nze_count = -1
587 NULLIFY (f_env)
588
589 CALL f_env_add_defaults(f_env_id, f_env)
590
591 try: block
592 CALL get_qs_env(f_env%force_env%qs_env, active_space=active_space_env)
593
594 IF (.NOT. ASSOCIATED(active_space_env)) &
595 EXIT try
596
597 nze_count = int(active_space_env%eri%eri(1)%csr_mat%nze_total, kind(nze_count))
598 END BLOCK try
599
600 CALL f_env_rm_defaults(f_env, ierr)
601 cpassert(ierr == 0)
602 END FUNCTION cp2k_active_space_get_eri_nze_count
603
604! **************************************************************************************************
605!> \brief Get the electron repulsion integrals (as a sparse tensor)
606!> \param f_env_id the force env id
607!> \param buf_coords C array to write the indizes (i,j,k,l) to
608!> \param buf_coords_len size of the buffer, must be at least 4*nze_count
609!> \param buf_values C array to write the values to
610!> \param buf_values_len size of the buffer, must be at least nze_count
611!> \return The number of elements written or -1 if unavailable or buffer too small
612!> \author Tiziano Mueller
613! **************************************************************************************************
614 INTEGER(C_LONG) FUNCTION cp2k_active_space_get_eri(f_env_id, &
615 buf_coords, buf_coords_len, &
616 buf_values, buf_values_len) RESULT(nelem) BIND(C)
618 USE qs_mo_types, ONLY: get_mo_set
620 INTEGER(C_INT), INTENT(IN), VALUE :: f_env_id
621 INTEGER(C_LONG), INTENT(IN), VALUE :: buf_coords_len
622 INTEGER(C_INT), INTENT(OUT), TARGET :: buf_coords(1:buf_coords_len)
623 INTEGER(C_LONG), INTENT(IN), VALUE :: buf_values_len
624 REAL(C_DOUBLE), INTENT(OUT), TARGET :: buf_values(1:buf_values_len)
625
626 INTEGER :: ierr
627 TYPE(active_space_type), POINTER :: active_space_env
628 TYPE(f_env_type), POINTER :: f_env
629
630 nelem = -1
631 NULLIFY (f_env)
632
633 CALL f_env_add_defaults(f_env_id, f_env)
634
635 try: block
636 CALL get_qs_env(f_env%force_env%qs_env, active_space=active_space_env)
637
638 IF (.NOT. ASSOCIATED(active_space_env)) &
639 EXIT try
640
641 associate(nze => active_space_env%eri%eri(1)%csr_mat%nze_total)
642 IF (buf_coords_len < 4*nze .OR. buf_values_len < nze) &
643 EXIT try
644
645 CALL active_space_env%eri%eri_foreach(1, active_space_env%active_orbitals, eri2array(buf_coords, buf_values))
646
647 nelem = int(nze, kind(nelem))
648 END associate
649 END BLOCK try
650
651 CALL f_env_rm_defaults(f_env, ierr)
652 cpassert(ierr == 0)
653 END FUNCTION cp2k_active_space_get_eri
654
655! **************************************************************************************************
656!> \brief Copy the active space ERI to C buffers
657!> \param this Class pointer
658!> \param i The i index of the value `val`
659!> \param j The j index of the value `val`
660!> \param k The k index of the value `val`
661!> \param l The l index of the value `val`
662!> \param val The value at the given index
663!> \return Always true to continue with the loop
664!> \author Tiziano Mueller
665! **************************************************************************************************
666 LOGICAL FUNCTION eri2array_func(this, i, j, k, l, val) RESULT(cont)
667 CLASS(eri2array), INTENT(inout) :: this
668 INTEGER, INTENT(in) :: i, j, k, l
669 REAL(KIND=dp), INTENT(in) :: val
670
671 this%coords(4*(this%idx - 1) + 1) = i
672 this%coords(4*(this%idx - 1) + 2) = j
673 this%coords(4*(this%idx - 1) + 3) = k
674 this%coords(4*(this%idx - 1) + 4) = l
675 this%values(this%idx) = val
676
677 this%idx = this%idx + 1
678
679 cont = .true.
680 END FUNCTION eri2array_func
681
682END MODULE libcp2k
some minimal info about CP2K, including its version and license
Definition cp2k_info.F:16
character(len= *), parameter, public cp2k_version
Definition cp2k_info.F:43
subroutine, public run_input(input_declaration, input_file_path, output_file_path, initial_variables, mpi_comm)
runs the given input
Definition cp2k_runs.F:905
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 cp2k_get_version(version_str, str_length)
...
Definition libcp2k.F:68
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, 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, 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, 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.