16   USE iso_c_binding,                   
ONLY: c_double,&
 
   66        sirius_integer_array_type, sirius_integer_type, sirius_logical_array_type, &
 
   67        sirius_logical_type, sirius_number_array_type, sirius_number_type, &
 
   68        sirius_string_array_type, sirius_string_type, sirius_add_atom, sirius_add_atom_type, &
 
   69        sirius_add_atom_type_radial_function, sirius_add_xc_functional, sirius_context_handler, &
 
   70        sirius_create_context, sirius_create_ground_state, sirius_create_kset_from_grid, &
 
   71        sirius_finalize, sirius_find_ground_state, sirius_get_band_energies, &
 
   72        sirius_get_band_occupancies, sirius_get_energy, sirius_get_forces, &
 
   73        sirius_get_kpoint_properties, sirius_get_num_kpoints, sirius_get_parameters, &
 
   74        sirius_get_stress_tensor, sirius_ground_state_handler, sirius_import_parameters, &
 
   75        sirius_initialize, sirius_initialize_context, sirius_kpoint_set_handler, &
 
   76        sirius_option_get_info, sirius_option_get_section_length, sirius_option_set, &
 
   77        sirius_set_atom_position, sirius_set_atom_type_dion, sirius_set_atom_type_hubbard, &
 
   78        sirius_set_atom_type_radial_grid, sirius_set_lattice_vectors, sirius_set_mpi_grid_dims, &
 
   79        sirius_update_ground_state
 
   80#include "./base/base_uses.f90" 
   88   CHARACTER(len=*), 
PARAMETER, 
PRIVATE :: moduleN = 
'sirius_interface' 
  105      CALL sirius_initialize(.false.)
 
  116      CALL sirius_finalize(.false., .false., .false.)
 
  128      TYPE(pwdft_environment_type), 
POINTER              :: pwdft_env
 
  131      CHARACTER(len=2)                                   :: element_symbol
 
  132      CHARACTER(len=default_string_length)               :: label
 
  133      INTEGER                                            :: i, ii, jj, iatom, ibeta, ifun, ikind, iwf, j, l, &
 
  134                                                            n, ns, natom, nbeta, nbs, nkind, nmesh, &
 
  135                                                            num_mag_dims, sirius_mpi_comm, vdw_func, nu, lu, output_unit
 
  136      INTEGER, 
DIMENSION(:), 
POINTER                     :: mpi_grid_dims
 
  137      INTEGER(KIND=C_INT), 
DIMENSION(3)                  :: k_grid, k_shift
 
  138      INTEGER, 
DIMENSION(:), 
POINTER                     :: kk
 
  139      LOGICAL                                            :: up, use_ref_cell
 
  140      LOGICAL(4)                                         :: use_so, use_symmetry, dft_plus_u_atom
 
  141      REAL(KIND=c_double), 
ALLOCATABLE, 
DIMENSION(:)     :: fun
 
  142      REAL(KIND=c_double), 
ALLOCATABLE, 
DIMENSION(:, :)  :: dion
 
  143      REAL(KIND=c_double), 
DIMENSION(3)                  :: a1, a2, a3, v1, v2
 
  144      REAL(KIND=
dp)                                      :: al, angle1, angle2, cval, focc, &
 
  145                                                            magnetization, mass, pf, rl, zeff, alpha_u, beta_u, &
 
  146                                                            j0_u, j_u, u_u, occ_u, u_minus_j, vnlp, vnlm
 
  147      REAL(KIND=
dp), 
ALLOCATABLE, 
DIMENSION(:)           :: beta, corden, ef, fe, locpot, rc, rp
 
  148      REAL(KIND=
dp), 
DIMENSION(3)                        :: vr, vs, j_t
 
  149      REAL(KIND=
dp), 
DIMENSION(:), 
POINTER               :: density
 
  150      REAL(KIND=
dp), 
DIMENSION(:, :), 
POINTER            :: wavefunction, wfninfo
 
  151      TYPE(atom_gthpot_type), 
POINTER                    :: gth_atompot
 
  152      TYPE(atom_upfpot_type), 
POINTER                    :: upf_pot
 
  153      TYPE(atomic_kind_type), 
DIMENSION(:), 
POINTER      :: atomic_kind_set
 
  154      TYPE(atomic_kind_type), 
POINTER                    :: atomic_kind
 
  155      TYPE(cell_type), 
POINTER                           :: my_cell
 
  156      TYPE(mp_para_env_type), 
POINTER                    :: para_env
 
  157      TYPE(grid_atom_type), 
POINTER                      :: atom_grid
 
  158      TYPE(gth_potential_type), 
POINTER                  :: gth_potential
 
  159      TYPE(particle_type), 
DIMENSION(:), 
POINTER         :: particle_set
 
  160      TYPE(qs_kind_type), 
DIMENSION(:), 
POINTER          :: qs_kind_set
 
  161      TYPE(qs_subsys_type), 
POINTER                      :: qs_subsys
 
  162      TYPE(section_vals_type), 
POINTER                   :: pwdft_section, pwdft_sub_section, &
 
  164      TYPE(sirius_context_handler)                       :: sctx
 
  165      TYPE(sirius_ground_state_handler)                  :: gs_handler
 
  166      TYPE(sirius_kpoint_set_handler)                    :: ks_handler
 
  168      cpassert(
ASSOCIATED(pwdft_env))
 
  173      sirius_mpi_comm = para_env%get_handle()
 
  174      CALL sirius_create_context(sirius_mpi_comm, sctx)
 
  178      CALL pwdft_env_get(pwdft_env=pwdft_env, pwdft_input=pwdft_section, xc_input=xc_section)
 
  181                                l_val=pwdft_env%ignore_convergence_failure)
 
  185      IF (
ASSOCIATED(xc_section)) 
THEN 
  190            IF (.NOT. 
ASSOCIATED(xc_fun)) 
EXIT 
  193            CALL sirius_add_xc_functional(sctx, 
"XC_"//trim(xc_fun%section%name))
 
  199      IF (
ASSOCIATED(pwdft_sub_section)) 
THEN 
  200         CALL cp_sirius_fill_in_section(sctx, pwdft_sub_section, 
"control")
 
  207      IF (
ASSOCIATED(pwdft_sub_section)) 
THEN 
  208         CALL cp_sirius_fill_in_section(sctx, pwdft_sub_section, 
"parameters")
 
  226         SELECT CASE (vdw_func)
 
  228            CALL sirius_add_xc_functional(sctx, 
"XC_FUNC_VDWDF")
 
  230            CALL sirius_add_xc_functional(sctx, 
"XC_FUNC_VDWDF2")
 
  232            CALL sirius_add_xc_functional(sctx, 
"XC_FUNC_VDWDF2")
 
  241      IF (
ASSOCIATED(pwdft_sub_section)) 
THEN 
  242         CALL cp_sirius_fill_in_section(sctx, pwdft_sub_section, 
"mixer")
 
  247      IF (
ASSOCIATED(pwdft_sub_section)) 
THEN 
  248         CALL cp_sirius_fill_in_section(sctx, pwdft_sub_section, 
"settings")
 
  253      IF (
ASSOCIATED(pwdft_sub_section)) 
THEN 
  254         CALL cp_sirius_fill_in_section(sctx, pwdft_sub_section, 
"iterative_solver")
 
  257#if defined(__SIRIUS_DFTD4) 
  260      IF (
ASSOCIATED(pwdft_sub_section)) 
THEN 
  261         CALL cp_sirius_fill_in_section(sctx, pwdft_sub_section, 
"dftd4")
 
  265      IF (
ASSOCIATED(pwdft_sub_section)) 
THEN 
  266         CALL cp_sirius_fill_in_section(sctx, pwdft_sub_section, 
"dftd3")
 
  273#if defined(__SIRIUS_NLCG) 
  276      IF (
ASSOCIATED(pwdft_sub_section)) 
THEN 
  277         CALL cp_sirius_fill_in_section(sctx, pwdft_sub_section, 
"nlcg")
 
  281#if defined(__SIRIUS_VCSQNM) 
  283      IF (
ASSOCIATED(pwdft_sub_section)) 
THEN 
  284         CALL cp_sirius_fill_in_section(sctx, pwdft_sub_section, 
"vcsqnm")
 
  289      CALL sirius_import_parameters(sctx, 
'{}')
 
  293      CALL qs_subsys_get(qs_subsys, cell=my_cell, use_ref_cell=use_ref_cell)
 
  294      a1(:) = my_cell%hmat(:, 1)
 
  295      a2(:) = my_cell%hmat(:, 2)
 
  296      a3(:) = my_cell%hmat(:, 3)
 
  297      CALL sirius_set_lattice_vectors(sctx, a1(1), a2(1), a3(1))
 
  299      IF (use_ref_cell) 
THEN 
  300         cpwarn(
"SIRIUS| The specified CELL_REF will be ignored for PW_DFT calculations")
 
  305                         atomic_kind_set=atomic_kind_set, &
 
  306                         qs_kind_set=qs_kind_set, &
 
  307                         particle_set=particle_set)
 
  308      nkind = 
SIZE(atomic_kind_set)
 
  311                              name=label, element_symbol=element_symbol, mass=mass)
 
  313         NULLIFY (upf_pot, gth_potential)
 
  314         CALL get_qs_kind(qs_kind_set(ikind), upf_potential=upf_pot, gth_potential=gth_potential)
 
  316         IF (
ASSOCIATED(upf_pot)) 
THEN 
  317            CALL sirius_add_atom_type(sctx, label, fname=upf_pot%filename, &
 
  318                                      symbol=element_symbol, &
 
  319                                      mass=real(mass/
massunit, kind=c_double))
 
  321         ELSEIF (
ASSOCIATED(gth_potential)) 
THEN 
  328            ALLOCATE (rp(nmesh), fun(nmesh))
 
  329            IF (atom_grid%rad(1) < atom_grid%rad(nmesh)) 
THEN 
  335               rp(1:nmesh) = atom_grid%rad(1:nmesh)
 
  338                  rp(i) = atom_grid%rad(nmesh - i + 1)
 
  342            CALL sirius_add_atom_type(sctx, label, &
 
  343                                      zn=nint(zeff + 0.001d0), &
 
  344                                      symbol=element_symbol, &
 
  345                                      mass=real(mass/
massunit, kind=c_double), &
 
  346                                      spin_orbit=gth_potential%soc)
 
  348            ALLOCATE (gth_atompot)
 
  351            fun(1:nmesh) = rp(1:nmesh)
 
  352            CALL sirius_set_atom_type_radial_grid(sctx, label, nmesh, fun(1))
 
  355            ALLOCATE (ef(nmesh), beta(nmesh))
 
  358               IF (gth_atompot%nl(l) == 0) cycle
 
  359               rl = gth_atompot%rcnl(l)
 
  361               ef(1:nmesh) = exp(-0.5_dp*rp(1:nmesh)*rp(1:nmesh)/(rl*rl))
 
  362               DO i = 1, gth_atompot%nl(l)
 
  363                  pf = rl**(l + 0.5_dp*(4._dp*i - 1._dp))
 
  365                  pf = sqrt(2._dp)/(pf*sqrt(
gamma1(j)))
 
  366                  beta(:) = pf*rp**(l + 2*i - 2)*ef
 
  368                  fun(1:nmesh) = beta(1:nmesh)*rp(1:nmesh)
 
  369                  CALL sirius_add_atom_type_radial_function(sctx, label, &
 
  370                                                            "beta", fun(1), nmesh, l=l)
 
  372                  IF (gth_atompot%soc .AND. l /= 0) 
THEN 
  373                     CALL sirius_add_atom_type_radial_function(sctx, label, &
 
  374                                                               "beta", fun(1), nmesh, l=-l)
 
  378            DEALLOCATE (ef, beta)
 
  382            IF (gth_atompot%soc) 
THEN 
  383               nbs = 2*nbeta - gth_atompot%nl(0)
 
  384               ALLOCATE (dion(nbs, nbs))
 
  386               ALLOCATE (dion(nbeta, nbeta))
 
  389            IF (gth_atompot%soc) 
THEN 
  390               ns = gth_atompot%nl(0)
 
  392                  dion(1:ns, 1:ns) = gth_atompot%hnl(1:ns, 1:ns, 0)
 
  395                  IF (gth_atompot%nl(l) == 0) cycle
 
  396                  DO i = 1, gth_atompot%nl(l)
 
  397                     ii = ns + 2*sum(gth_atompot%nl(1:l - 1))
 
  398                     ii = ii + 2*(i - 1) + 1
 
  399                     DO j = 1, gth_atompot%nl(l)
 
  400                        jj = ns + 2*sum(gth_atompot%nl(1:l - 1))
 
  401                        jj = jj + 2*(j - 1) + 1
 
  402                        vnlp = gth_atompot%hnl(i, j, l) + 0.5_dp*l*gth_atompot%knl(i, j, l)
 
  403                        vnlm = gth_atompot%hnl(i, j, l) - 0.5_dp*(l + 1)*gth_atompot%knl(i, j, l)
 
  405                        dion(ii + 1, jj + 1) = vnlm
 
  409               CALL sirius_set_atom_type_dion(sctx, label, nbs, dion(1, 1))
 
  412                  IF (gth_atompot%nl(l) == 0) cycle
 
  413                  ibeta = sum(gth_atompot%nl(0:l - 1)) + 1
 
  414                  i = ibeta + gth_atompot%nl(l) - 1
 
  415                  dion(ibeta:i, ibeta:i) = gth_atompot%hnl(1:gth_atompot%nl(l), 1:gth_atompot%nl(l), l)
 
  417               CALL sirius_set_atom_type_dion(sctx, label, nbeta, dion(1, 1))
 
  423            IF (gth_atompot%nlcc) 
THEN 
  424               ALLOCATE (corden(nmesh), fe(nmesh), rc(nmesh))
 
  426               n = gth_atompot%nexp_nlcc
 
  428                  al = gth_atompot%alpha_nlcc(i)
 
  430                  fe(:) = exp(-0.5_dp*rc(:)*rc(:))
 
  431                  DO j = 1, gth_atompot%nct_nlcc(i)
 
  432                     cval = gth_atompot%cval_nlcc(j, i)
 
  433                     corden(:) = corden(:) + fe(:)*rc(:)**(2*j - 2)*cval
 
  436               fun(1:nmesh) = corden(1:nmesh)*rp(1:nmesh)
 
  437               CALL sirius_add_atom_type_radial_function(sctx, label, 
"ps_rho_core", &
 
  439               DEALLOCATE (corden, fe, rc)
 
  443            ALLOCATE (locpot(nmesh))
 
  446            fun(1:nmesh) = locpot(1:nmesh)
 
  447            CALL sirius_add_atom_type_radial_function(sctx, label, 
"vloc", &
 
  451            NULLIFY (density, wavefunction, wfninfo)
 
  453                                           density=density, wavefunction=wavefunction, &
 
  454                                           wfninfo=wfninfo, agrid=atom_grid)
 
  457            DO iwf = 1, 
SIZE(wavefunction, 2)
 
  458               focc = wfninfo(1, iwf)
 
  459               l = nint(wfninfo(2, iwf))
 
  463                  fun(1:nmesh) = wavefunction(1:nmesh, iwf)*rp(i)
 
  466                     fun(i) = wavefunction(nmesh - i + 1, iwf)*rp(i)
 
  469               CALL sirius_add_atom_type_radial_function(sctx, &
 
  470                                                         label, 
"ps_atomic_wf", &
 
  471                                                         fun(1), nmesh, l=l, occ=real(focc, kind=c_double), n=nu)
 
  476               fun(1:nmesh) = 
fourpi*density(1:nmesh)*atom_grid%rad(1:nmesh)**2
 
  479                  fun(i) = 
fourpi*density(nmesh - i + 1)*atom_grid%rad(nmesh - i + 1)**2
 
  482            CALL sirius_add_atom_type_radial_function(sctx, label, 
"ps_rho_total", &
 
  485            IF (
ASSOCIATED(density)) 
DEALLOCATE (density)
 
  486            IF (
ASSOCIATED(wavefunction)) 
DEALLOCATE (wavefunction)
 
  487            IF (
ASSOCIATED(wfninfo)) 
DEALLOCATE (wfninfo)
 
  491            DEALLOCATE (gth_atompot)
 
  494            CALL cp_abort(__location__, &
 
  495                          "CP2K/SIRIUS: atomic kind needs UPF or GTH potential definition")
 
  499                          dft_plus_u_atom=dft_plus_u_atom, &
 
  500                          l_of_dft_plus_u=lu, &
 
  501                          n_of_dft_plus_u=nu, &
 
  502                          u_minus_j_target=u_minus_j, &
 
  503                          u_of_dft_plus_u=u_u, &
 
  504                          j_of_dft_plus_u=j_u, &
 
  505                          alpha_of_dft_plus_u=alpha_u, &
 
  506                          beta_of_dft_plus_u=beta_u, &
 
  507                          j0_of_dft_plus_u=j0_u, &
 
  508                          occupation_of_dft_plus_u=occ_u)
 
  510         IF (dft_plus_u_atom) 
THEN 
  512               cpabort(
"CP2K/SIRIUS (hubbard): principal quantum number not specified")
 
  516               cpabort(
"CP2K/SIRIUS (hubbard): l can not be negative.")
 
  519            IF (occ_u < 0.0) 
THEN 
  520               cpabort(
"CP2K/SIRIUS (hubbard): the occupation number can not be negative.")
 
  524            IF (abs(u_minus_j) < 1e-8) 
THEN 
  526               CALL sirius_set_atom_type_hubbard(sctx, label, lu, nu, &
 
  527                                                 occ_u, u_u, j_t, alpha_u, beta_u, j0_u)
 
  529               CALL sirius_set_atom_type_hubbard(sctx, label, lu, nu, &
 
  530                                                 occ_u, u_minus_j, j_t, alpha_u, beta_u, j0_u)
 
  538      natom = 
SIZE(particle_set)
 
  540         vr(1:3) = particle_set(iatom)%r(1:3)
 
  542         atomic_kind => particle_set(iatom)%atomic_kind
 
  543         ikind = atomic_kind%kind_number
 
  545         CALL get_qs_kind(qs_kind_set(ikind), zeff=zeff, magnetization=magnetization)
 
  549         IF (num_mag_dims .EQ. 3) 
THEN 
  552            v1(1) = magnetization*sin(angle1)*cos(angle2)
 
  553            v1(2) = magnetization*sin(angle1)*sin(angle2)
 
  554            v1(3) = magnetization*cos(angle1)
 
  557            v1(3) = magnetization
 
  560         CALL sirius_add_atom(sctx, label, v2(1), v1(1))
 
  563      CALL sirius_set_mpi_grid_dims(sctx, 2, mpi_grid_dims)
 
  566      CALL sirius_initialize_context(sctx)
 
  570      IF (use_symmetry) 
THEN 
  571         CALL sirius_create_kset_from_grid(sctx, k_grid(1), k_shift(1), use_symmetry=.true., kset_handler=ks_handler)
 
  573         CALL sirius_create_kset_from_grid(sctx, k_grid(1), k_shift(1), use_symmetry=.false., kset_handler=ks_handler)
 
  576      CALL sirius_create_ground_state(ks_handler, gs_handler)
 
  578      CALL pwdft_env_set(pwdft_env, sctx=sctx, gs_handler=gs_handler, ks_handler=ks_handler)
 
  591      TYPE(pwdft_environment_type), 
POINTER              :: pwdft_env
 
  593      INTEGER                                            :: iatom, natom
 
  594      REAL(KIND=c_double), 
DIMENSION(3)                  :: a1, a2, a3, v2
 
  595      REAL(KIND=
dp), 
DIMENSION(3)                        :: vr, vs
 
  596      TYPE(cell_type), 
POINTER                           :: my_cell
 
  597      TYPE(particle_type), 
DIMENSION(:), 
POINTER         :: particle_set
 
  598      TYPE(qs_subsys_type), 
POINTER                      :: qs_subsys
 
  599      TYPE(sirius_context_handler)                       :: sctx
 
  600      TYPE(sirius_ground_state_handler)                  :: gs_handler
 
  602      cpassert(
ASSOCIATED(pwdft_env))
 
  603      CALL pwdft_env_get(pwdft_env, sctx=sctx, gs_handler=gs_handler)
 
  610      a1(:) = my_cell%hmat(:, 1)
 
  611      a2(:) = my_cell%hmat(:, 2)
 
  612      a3(:) = my_cell%hmat(:, 3)
 
  613      CALL sirius_set_lattice_vectors(sctx, a1(1), a2(1), a3(1))
 
  617      natom = 
SIZE(particle_set)
 
  619         vr(1:3) = particle_set(iatom)%r(1:3)
 
  622         CALL sirius_set_atom_position(sctx, iatom, v2(1))
 
  626      CALL sirius_update_ground_state(gs_handler)
 
  628      CALL pwdft_env_set(pwdft_env, sctx=sctx, gs_handler=gs_handler)
 
  638   SUBROUTINE cp_sirius_fill_in_section(sctx, section, section_name)
 
  639      TYPE(sirius_context_handler), 
INTENT(INOUT)        :: sctx
 
  640      TYPE(section_vals_type), 
POINTER                   :: section
 
  641      CHARACTER(*), 
INTENT(in)                           :: section_name
 
  643      CHARACTER(len=256), 
TARGET                         :: option_name
 
  644      CHARACTER(len=4096)                                :: description, usage
 
  645      CHARACTER(len=80), 
DIMENSION(:), 
POINTER           :: tmp
 
  646      CHARACTER(len=80), 
TARGET                          :: str
 
  647      INTEGER                                            :: ctype, elem, ic, j
 
  648      INTEGER, 
DIMENSION(:), 
POINTER                     :: ivals
 
  649      INTEGER, 
TARGET                                    :: enum_length, ival, length, &
 
  650                                                            num_possible_values, number_of_options
 
  652      LOGICAL, 
DIMENSION(:), 
POINTER                     :: lvals
 
  653      LOGICAL, 
TARGET                                    :: found, lval
 
  654      REAL(kind=
dp), 
DIMENSION(:), 
POINTER               :: rvals
 
  655      REAL(kind=
dp), 
TARGET                              :: rval
 
  659      CALL sirius_option_get_section_length(section_name, number_of_options)
 
  661      DO elem = 1, number_of_options
 
  663         CALL sirius_option_get_info(section_name, &
 
  668                                     num_possible_values, &
 
  674         IF ((option_name /= 
'memory_usage') .AND. (option_name /= 
'xc_functionals') .AND. (option_name /= 
'vk')) 
THEN 
  678               CASE (sirius_integer_type)
 
  680                  CALL sirius_option_set(sctx, section_name, option_name, ctype, c_loc(ival))
 
  681               CASE (sirius_number_type)
 
  683                  CALL sirius_option_set(sctx, section_name, option_name, ctype, c_loc(rval))
 
  684               CASE (sirius_logical_type)
 
  686                  CALL sirius_option_set(sctx, section_name, option_name, ctype, c_loc(lval))
 
  687               CASE (sirius_string_type)      
 
  690                  str = trim(adjustl(str))
 
  693                     IF (ic >= 65 .AND. ic < 90) str(j:j) = char(ic + 32)
 
  696                  CALL sirius_option_set(sctx, section_name, option_name, ctype, c_loc(str), max_length=len_trim(str))
 
  697               CASE (sirius_integer_array_type)
 
  699                  CALL sirius_option_set(sctx, section_name, option_name, ctype, c_loc(ivals(1)), &
 
  700                                         max_length=num_possible_values)
 
  701               CASE (sirius_number_array_type)
 
  703                  CALL sirius_option_set(sctx, section_name, option_name, ctype, c_loc(rvals(1)), &
 
  704                                         max_length=num_possible_values)
 
  705               CASE (sirius_logical_array_type)
 
  707                  CALL sirius_option_set(sctx, section_name, option_name, ctype, c_loc(lvals(1)), &
 
  708                                         max_length=num_possible_values)
 
  709               CASE (sirius_string_array_type)
 
  714                     str = trim(adjustl(tmp(j)))
 
  715                     CALL sirius_option_set(sctx, section_name, option_name, ctype, c_loc(str), &
 
  716                                            max_length=len_trim(str), append=.true.)
 
  723   END SUBROUTINE cp_sirius_fill_in_section
 
  736      TYPE(pwdft_environment_type), 
INTENT(INOUT), &
 
  738      LOGICAL, 
INTENT(IN)                                :: calculate_forces, calculate_stress_tensor
 
  740      INTEGER                                            :: iw, n1, n2
 
  741      LOGICAL                                            :: do_print, gs_converged
 
  742      REAL(KIND=c_double)                                :: etotal
 
  743      REAL(KIND=c_double), 
ALLOCATABLE, 
DIMENSION(:, :)  :: cforces
 
  744      REAL(KIND=c_double), 
DIMENSION(3, 3)               :: cstress
 
  745      REAL(KIND=
dp), 
DIMENSION(3, 3)                     :: stress
 
  746      REAL(KIND=
dp), 
DIMENSION(:, :), 
POINTER            :: forces
 
  747      TYPE(cp_logger_type), 
POINTER                      :: logger
 
  748      TYPE(pwdft_energy_type), 
POINTER                   :: energy
 
  749      TYPE(section_vals_type), 
POINTER                   :: print_section, pwdft_input
 
  750      TYPE(sirius_ground_state_handler)                  :: gs_handler
 
  752      cpassert(
ASSOCIATED(pwdft_env))
 
  758      CALL pwdft_env_get(pwdft_env=pwdft_env, gs_handler=gs_handler)
 
  759      CALL sirius_find_ground_state(gs_handler, converged=gs_converged)
 
  761      IF (gs_converged) 
THEN 
  762         IF (iw > 0) 
WRITE (iw, 
'(A)') 
"CP2K/SIRIUS: ground state is converged" 
  764         IF (pwdft_env%ignore_convergence_failure) 
THEN 
  765            IF (iw > 0) 
WRITE (iw, 
'(A)') 
"CP2K/SIRIUS Warning: ground state is not converged" 
  767            cpabort(
"CP2K/SIRIUS (ground state): SIRIUS did not converge.")
 
  773      etotal = 0.0_c_double
 
  775      CALL sirius_get_energy(gs_handler, 
'band-gap', etotal)
 
  776      energy%band_gap = etotal
 
  778      etotal = 0.0_c_double
 
  779      CALL sirius_get_energy(gs_handler, 
'total', etotal)
 
  780      energy%etotal = etotal
 
  784      etotal = 0.0_c_double
 
  785      CALL sirius_get_energy(gs_handler, 
'demet', etotal)
 
  786      energy%entropy = -etotal
 
  788      IF (calculate_forces) 
THEN 
  793         ALLOCATE (cforces(n2, n1))
 
  794         cforces = 0.0_c_double
 
  795         CALL sirius_get_forces(gs_handler, 
'total', cforces)
 
  801         forces = -transpose(cforces(:, :))
 
  805      IF (calculate_stress_tensor) 
THEN 
  806         cstress = 0.0_c_double
 
  807         CALL sirius_get_stress_tensor(gs_handler, 
'total', cstress)
 
  808         stress(1:3, 1:3) = cstress(1:3, 1:3)
 
  812      CALL pwdft_env_get(pwdft_env=pwdft_env, pwdft_input=pwdft_input)
 
  816         CALL cp_sirius_print_results(pwdft_env, print_section)
 
  829   SUBROUTINE cp_sirius_print_results(pwdft_env, print_section)
 
  830      TYPE(pwdft_environment_type), 
INTENT(INOUT), &
 
  832      TYPE(section_vals_type), 
POINTER                   :: print_section
 
  834      CHARACTER(LEN=default_string_length)               :: my_act, my_pos
 
  835      INTEGER                                            :: i, ik, iounit, ispn, iterstep, iv, iw, &
 
  836                                                            nbands, nhist, nkpts, nspins
 
  837      INTEGER(KIND=C_INT)                                :: cint
 
  838      LOGICAL                                            :: append, dos, ionode
 
  839      REAL(KIND=c_double)                                :: creal
 
  840      REAL(KIND=c_double), 
ALLOCATABLE, 
DIMENSION(:)     :: slist
 
  841      REAL(KIND=
dp)                                      :: de, e_fermi(2), emax, emin, eval
 
  842      REAL(KIND=
dp), 
ALLOCATABLE, 
DIMENSION(:)           :: wkpt
 
  843      REAL(KIND=
dp), 
ALLOCATABLE, 
DIMENSION(:, :)        :: ehist, hist, occval
 
  844      REAL(KIND=
dp), 
ALLOCATABLE, 
DIMENSION(:, :, :)     :: energies, occupations
 
  845      TYPE(cp_logger_type), 
POINTER                      :: logger
 
  846      TYPE(sirius_context_handler)                       :: sctx
 
  847      TYPE(sirius_ground_state_handler)                  :: gs_handler
 
  848      TYPE(sirius_kpoint_set_handler)                    :: ks_handler
 
  852      ionode = logger%para_env%is_source()
 
  865         CALL sirius_get_num_kpoints(ks_handler, cint)
 
  867         CALL sirius_get_parameters(sctx, num_bands=cint)
 
  869         CALL sirius_get_parameters(sctx, num_spins=cint)
 
  872         ALLOCATE (energies(nbands, nspins, nkpts))
 
  874         ALLOCATE (occupations(nbands, nspins, nkpts))
 
  876         ALLOCATE (wkpt(nkpts))
 
  877         ALLOCATE (slist(nbands))
 
  879            CALL sirius_get_kpoint_properties(ks_handler, ik, creal)
 
  884               CALL sirius_get_band_energies(ks_handler, ik, ispn, slist)
 
  885               energies(1:nbands, ispn, ik) = slist(1:nbands)
 
  886               CALL sirius_get_band_occupancies(ks_handler, ik, ispn, slist)
 
  887               occupations(1:nbands, ispn, ik) = slist(1:nbands)
 
  890         emin = minval(energies)
 
  891         emax = maxval(energies)
 
  892         nhist = nint((emax - emin)/de) + 1
 
  893         ALLOCATE (hist(nhist, nspins), occval(nhist, nspins), ehist(nhist, nspins))
 
  901                  eval = energies(i, ispn, ik) - emin
 
  902                  iv = nint(eval/de) + 1
 
  903                  cpassert((iv > 0) .AND. (iv <= nhist))
 
  904                  hist(iv, ispn) = hist(iv, ispn) + wkpt(ik)
 
  905                  occval(iv, ispn) = occval(iv, ispn) + wkpt(ik)*occupations(i, ispn, ik)
 
  909         hist = hist/real(nbands, kind=
dp)
 
  911            ehist(i, 1:nspins) = emin + (i - 1)*de
 
  914         iterstep = logger%iter_info%iteration(logger%iter_info%n_rlevel)
 
  916         IF (append .AND. iterstep > 1) 
THEN 
  923                                   extension=
".dos", file_position=my_pos, file_action=my_act, &
 
  924                                   file_form=
"FORMATTED")
 
  926            IF (nspins == 2) 
THEN 
  927               WRITE (unit=iw, fmt=
"(T2,A,I0,A,2F12.6)") &
 
  928                  "# DOS at iteration step i = ", iterstep, 
", E_Fermi[a.u.] = ", e_fermi(1:2)
 
  929               WRITE (unit=iw, fmt=
"(T2,A, A)") 
"   Energy[a.u.]  Alpha_Density     Occupation", &
 
  930                  "   Beta_Density      Occupation" 
  932               WRITE (unit=iw, fmt=
"(T2,A,I0,A,F12.6)") &
 
  933                  "# DOS at iteration step i = ", iterstep, 
", E_Fermi[a.u.] = ", e_fermi(1)
 
  934               WRITE (unit=iw, fmt=
"(T2,A)") 
"   Energy[a.u.]       Density     Occupation" 
  937               eval = emin + (i - 1)*de
 
  938               IF (nspins == 2) 
THEN 
  939                  WRITE (unit=iw, fmt=
"(F15.8,4F15.4)") eval, hist(i, 1), occval(i, 1), &
 
  940                     hist(i, 2), occval(i, 2)
 
  942                  WRITE (unit=iw, fmt=
"(F15.8,2F15.4)") eval, hist(i, 1), occval(i, 1)
 
  948         DEALLOCATE (energies, occupations, wkpt, slist)
 
  949         DEALLOCATE (hist, occval, ehist)
 
  951   END SUBROUTINE cp_sirius_print_results
 
  962#include "./base/base_uses.f90" 
  992      cpabort(
"Sirius library is missing")
 
 
 1003      LOGICAL                                            :: calculate_forces, calculate_stress
 
 1005      mark_used(pwdft_env)
 
 1006      mark_used(calculate_forces)
 
 1007      mark_used(calculate_stress)
 
 1008      cpabort(
"Sirius library is missing")
 
 
 1018      mark_used(pwdft_env)
 
 1019      cpabort(
"Sirius library is missing")
 
 
calculate the orbitals for a given atomic kind type
 
subroutine, public calculate_atomic_orbitals(atomic_kind, qs_kind, agrid, iunit, pmat, fmat, density, wavefunction, wfninfo, confine, xc_section, nocc)
...
 
subroutine, public gth_potential_conversion(gth_potential, gth_atompot)
...
 
Define the atom type and its sub types.
 
Routines that process Quantum Espresso UPF files.
 
Some basic routines for atomic calculations.
 
pure subroutine, public atom_local_potential(locpot, gthpot, rr)
...
 
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.
 
Handles all functions related to the CELL.
 
subroutine, public real_to_scaled(s, r, cell)
Transform real to scaled cell coordinates. s=h_inv*r.
 
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...
 
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...
 
Definition of the atomic potential types.
 
Defines the basic variable types.
 
integer, parameter, public dp
 
integer, parameter, public default_string_length
 
Machine interface based on Fortran 2003 and POSIX.
 
subroutine, public m_flush(lunit)
flushes units if the &GLOBAL flag is set accordingly
 
Definition of mathematical constants and functions.
 
real(kind=dp), dimension(0:maxfac), parameter, public gamma1
 
real(kind=dp), parameter, public fourpi
 
Interface to the message passing library MPI.
 
Define the data structure for the particle information.
 
Definition of physical constants:
 
real(kind=dp), parameter, public massunit
 
The type definitions for the PWDFT environment.
 
subroutine, public pwdft_env_get(pwdft_env, pwdft_input, force_env_input, xc_input, cp_subsys, qs_subsys, para_env, energy, forces, stress, sctx, gs_handler, ks_handler)
Returns various attributes of the pwdft environment.
 
subroutine, public pwdft_env_set(pwdft_env, pwdft_input, force_env_input, xc_input, qs_subsys, cp_subsys, para_env, energy, forces, stress, sctx, gs_handler, ks_handler)
Sets various attributes of the pwdft environment.
 
subroutine, public deallocate_grid_atom(grid_atom)
Deallocate a Gaussian-type orbital (GTO) basis set data set.
 
subroutine, public allocate_grid_atom(grid_atom)
Initialize components of the grid_atom_type structure.
 
subroutine, public create_grid_atom(grid_atom, nr, na, llmax, ll, quadrature)
...
 
Define the quickstep kind type and their sub types.
 
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, cneo_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zatom, 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_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_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
 
types that represent a quickstep subsys
 
subroutine, public qs_subsys_get(subsys, atomic_kinds, atomic_kind_set, particles, particle_set, local_particles, molecules, molecule_set, molecule_kinds, molecule_kind_set, local_molecules, para_env, colvar_p, shell_particles, core_particles, gci, multipoles, natom, nparticle, ncore, nshell, nkind, atprop, virial, results, cell, cell_ref, use_ref_cell, energy, force, qs_kind_set, cp_subsys, nelectron_total, nelectron_spin)
...
 
Interface to the SIRIUS Library.
 
subroutine, public cp_sirius_update_context(pwdft_env)
Empty implementation in case SIRIUS is not compiled in.
 
subroutine, public cp_sirius_init()
Empty implementation in case SIRIUS is not compiled in.
 
subroutine, public cp_sirius_energy_force(pwdft_env, calculate_forces, calculate_stress)
Empty implementation in case SIRIUS is not compiled in.
 
subroutine, public cp_sirius_finalize()
Empty implementation in case SIRIUS is not compiled in.
 
subroutine, public cp_sirius_create_env(pwdft_env)
Empty implementation in case SIRIUS is not compiled in.
 
Provides all information about a pseudopotential.
 
Provides all information about an atomic kind.
 
Type defining parameters related to the simulation cell.
 
type of a logger, at the moment it contains just a print level starting at which level it should be l...
 
stores all the informations relevant to an mpi environment
 
The PWDFT environment type.
 
Provides all information about a quickstep kind.