LCOV - code coverage report
Current view: top level - src - nnp_environment_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:936074a) Lines: 68.2 % 148 101
Test Date: 2025-12-04 06:27:48 Functions: 17.6 % 17 3

            Line data    Source code
       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              : !> \brief  Data types for neural network potentials
      10              : !> \author Christoph Schran (christoph.schran@rub.de)
      11              : !> \date   2020-10-10
      12              : ! **************************************************************************************************
      13              : MODULE nnp_environment_types
      14              :    USE atomic_kind_list_types,          ONLY: atomic_kind_list_create,&
      15              :                                               atomic_kind_list_release,&
      16              :                                               atomic_kind_list_type
      17              :    USE atomic_kind_types,               ONLY: atomic_kind_type
      18              :    USE cell_types,                      ONLY: cell_release,&
      19              :                                               cell_retain,&
      20              :                                               cell_type
      21              :    USE cp_subsys_types,                 ONLY: cp_subsys_get,&
      22              :                                               cp_subsys_release,&
      23              :                                               cp_subsys_set,&
      24              :                                               cp_subsys_type
      25              :    USE distribution_1d_types,           ONLY: distribution_1d_type
      26              :    USE input_section_types,             ONLY: section_vals_type
      27              :    USE kinds,                           ONLY: default_string_length,&
      28              :                                               dp
      29              :    USE molecule_kind_list_types,        ONLY: molecule_kind_list_create,&
      30              :                                               molecule_kind_list_release,&
      31              :                                               molecule_kind_list_type
      32              :    USE molecule_kind_types,             ONLY: molecule_kind_type
      33              :    USE molecule_list_types,             ONLY: molecule_list_create,&
      34              :                                               molecule_list_release,&
      35              :                                               molecule_list_type
      36              :    USE molecule_types,                  ONLY: molecule_type
      37              :    USE particle_list_types,             ONLY: particle_list_create,&
      38              :                                               particle_list_release,&
      39              :                                               particle_list_type
      40              :    USE particle_types,                  ONLY: particle_type
      41              :    USE virial_types,                    ONLY: virial_type
      42              : #include "./base/base_uses.f90"
      43              : 
      44              :    IMPLICIT NONE
      45              : 
      46              :    PRIVATE
      47              : 
      48              :    LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .TRUE.
      49              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'nnp_environment_types'
      50              : 
      51              :    !> derived data types
      52              :    PUBLIC :: nnp_type
      53              :    PUBLIC :: nnp_arc_type
      54              :    PUBLIC :: nnp_neighbor_type
      55              :    PUBLIC :: nnp_acsf_rad_type
      56              :    PUBLIC :: nnp_acsf_ang_type
      57              : 
      58              :    ! Public subroutines ***
      59              :    PUBLIC :: nnp_env_release, &
      60              :              nnp_env_set, &
      61              :              nnp_env_get
      62              : 
      63              :    INTEGER, PARAMETER, PUBLIC :: &
      64              :       nnp_cut_cos = 1, &
      65              :       nnp_cut_tanh = 2
      66              : 
      67              :    INTEGER, PARAMETER, PUBLIC :: &
      68              :       nnp_actfnct_tanh = 1, &
      69              :       nnp_actfnct_gaus = 2, &
      70              :       nnp_actfnct_lin = 3, &
      71              :       nnp_actfnct_cos = 4, &
      72              :       nnp_actfnct_sig = 5, &
      73              :       nnp_actfnct_invsig = 6, &
      74              :       nnp_actfnct_exp = 7, &
      75              :       nnp_actfnct_softplus = 8, &
      76              :       nnp_actfnct_quad = 9
      77              : 
      78              : ! **************************************************************************************************
      79              : !> \brief Main data type collecting all relevant data for neural network potentials
      80              : !> \author Christoph Schran (christoph.schran@rub.de)
      81              : !> \date   2020-10-10
      82              : ! **************************************************************************************************
      83              :    TYPE nnp_type
      84              :       TYPE(nnp_acsf_rad_type), DIMENSION(:), POINTER      :: rad => NULL() ! DIM(n_ele)
      85              :       TYPE(nnp_acsf_ang_type), DIMENSION(:), POINTER      :: ang => NULL() ! DIM(n_ele)
      86              :       INTEGER, DIMENSION(:), ALLOCATABLE                  :: n_rad ! # radial symfnct for this element
      87              :       INTEGER, DIMENSION(:), ALLOCATABLE                  :: n_ang ! # angular symfnct for this element
      88              :       INTEGER                                             :: n_ele = -1 ! # elements
      89              :       CHARACTER(len=2), ALLOCATABLE, DIMENSION(:)         :: ele ! elements(n_ele)
      90              :       INTEGER, ALLOCATABLE, DIMENSION(:)                  :: nuc_ele ! elements(n_ele)
      91              :       LOGICAL                                             :: scale_acsf = .FALSE.
      92              :       LOGICAL                                             :: scale_sigma_acsf = .FALSE.
      93              :       LOGICAL                                             :: center_acsf = .FALSE.
      94              :       LOGICAL                                             :: normnodes = .FALSE.
      95              :       INTEGER                                             :: n_radgrp = -1
      96              :       INTEGER                                             :: n_anggrp = -1
      97              :       INTEGER                                             :: cut_type = -1 ! cutofftype
      98              :       REAL(KIND=dp)                                       :: eshortmin = -1.0_dp
      99              :       REAL(KIND=dp)                                       :: eshortmax = -1.0_dp
     100              :       REAL(KIND=dp)                                       :: scmax = -1.0_dp !scale
     101              :       REAL(KIND=dp)                                       :: scmin = -1.0_dp !scale
     102              :       REAL(KIND=dp)                                       :: max_cut = -1.0_dp !largest cutoff
     103              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)            :: atom_energies !DIM(n_ele)
     104              :       TYPE(nnp_arc_type), POINTER, DIMENSION(:)           :: arc => NULL() ! DIM(n_ele)
     105              :       INTEGER                                             :: n_committee = -1
     106              :       INTEGER                                             :: n_hlayer = -1
     107              :       INTEGER                                             :: n_layer = -1
     108              :       INTEGER, ALLOCATABLE, DIMENSION(:)                  :: n_hnodes
     109              :       INTEGER, ALLOCATABLE, DIMENSION(:)                  :: actfnct
     110              :       INTEGER                                             :: expol = -1 ! extrapolation coutner
     111              :       LOGICAL                                             :: output_expol = .FALSE. ! output extrapolation
     112              :       ! structures for calculation
     113              :       INTEGER                                             :: num_atoms = -1
     114              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)         :: atomic_energy
     115              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)            :: committee_energy
     116              :       INTEGER, ALLOCATABLE, DIMENSION(:)                  :: ele_ind, nuc_atoms, sort, sort_inv
     117              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)         :: coord
     118              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :)      :: myforce
     119              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :)      :: committee_forces, committee_stress
     120              :       CHARACTER(len=default_string_length), &
     121              :          ALLOCATABLE, DIMENSION(:)                        :: atoms
     122              :       REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE         :: nnp_forces
     123              :       REAL(KIND=dp)                                       :: nnp_potential_energy = -1.0_dp
     124              :       TYPE(cp_subsys_type), POINTER                       :: subsys => NULL()
     125              :       TYPE(section_vals_type), POINTER                    :: nnp_input => NULL()
     126              :       TYPE(section_vals_type), POINTER                    :: force_env_input => NULL()
     127              :       TYPE(cell_type), POINTER                            :: cell => NULL()
     128              :       TYPE(cell_type), POINTER                            :: cell_ref => NULL()
     129              :       LOGICAL                                             :: use_ref_cell = .FALSE.
     130              :       ! bias
     131              :       LOGICAL                                             :: bias = .FALSE.
     132              :       LOGICAL                                             :: bias_align = .FALSE.
     133              :       REAL(KIND=dp)                                       :: bias_energy = -1.0_dp
     134              :       REAL(KIND=dp)                                       :: bias_kb = -1.0_dp
     135              :       REAL(KIND=dp)                                       :: bias_sigma0 = -1.0_dp
     136              :       REAL(KIND=dp)                                       :: bias_sigma = -1.0_dp
     137              :       REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE         :: bias_forces
     138              :       REAL(KIND=dp), DIMENSION(:), ALLOCATABLE            :: bias_e_avrg
     139              :    END TYPE nnp_type
     140              : 
     141              : ! **************************************************************************************************
     142              : !> \brief Symmetry functions group type
     143              : !> \param n_symf - # of associated sym fncts
     144              : !> \param symf   - indices of associated sym fncts       DIM(nsymf)
     145              : !> \param ele    - elements indices          rad:DIM(2), ang:DIM(3)
     146              : !> \param cutoff - associated cutoff value
     147              : !> \author Christoph Schran (christoph.schran@rub.de)
     148              : !> \date   2020-10-10
     149              : ! **************************************************************************************************
     150              :    TYPE nnp_symfgrp_type
     151              :       INTEGER                                             :: n_symf = -1
     152              :       INTEGER, DIMENSION(:), ALLOCATABLE                  :: symf
     153              :       INTEGER, DIMENSION(:), ALLOCATABLE                  :: ele_ind
     154              :       CHARACTER(LEN=2), DIMENSION(:), ALLOCATABLE         :: ele
     155              :       REAL(KIND=dp)                                       :: cutoff = -1.0_dp
     156              :    END TYPE nnp_symfgrp_type
     157              : 
     158              : ! **************************************************************************************************
     159              : !> \brief Set of radial symmetry function type
     160              : !> \param y       - acsf value                                     - DIM(n_rad)
     161              : !> \param funccut - distance cutoff                           bohr - DIM(n_rad)
     162              : !> \param eta     - eta parameter of radial sym fncts      bohr^-2 - DIM(n_rad)
     163              : !> \param rs      - r shift parameter of radial sym fncts     bohr - DIM(n_rad)
     164              : !> \param loc_min - minimum of the sym fnct                          DIM(n_rad)
     165              : !> \param loc_max - maximum of the sym fnct                          DIM(n_rad)
     166              : !> \param loc_av  - average of the sym fnct                          DIM(n_rad)
     167              : !> \param sigma   - SD of the sym fnc                                DIM(n_rad)
     168              : !> \param ele     - element associated to the sym fnct               DIM(n_rad)
     169              : !> \param nuc_ele - associated atomic number                         DIM(n_rad)
     170              : !> \author Christoph Schran (christoph.schran@rub.de)
     171              : !> \date   2020-10-10
     172              : ! **************************************************************************************************
     173              :    TYPE nnp_acsf_rad_type
     174              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)            :: y
     175              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)            :: funccut
     176              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)            :: eta
     177              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)            :: rs
     178              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)            :: loc_min
     179              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)            :: loc_max
     180              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)            :: loc_av
     181              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)            :: sigma
     182              :       CHARACTER(len=2), ALLOCATABLE, DIMENSION(:)         :: ele
     183              :       INTEGER, ALLOCATABLE, DIMENSION(:)                  :: nuc_ele
     184              :       INTEGER                                             :: n_symfgrp = -1
     185              :       TYPE(nnp_symfgrp_type), DIMENSION(:), ALLOCATABLE   :: symfgrp
     186              :    END TYPE nnp_acsf_rad_type
     187              : 
     188              : ! **************************************************************************************************
     189              : !> \brief Set of angular symmetry function type
     190              : !> \param y         - acsf value                                  - DIM(n_ang)
     191              : !> \param funccut   - distance cutoff                        bohr - DIM(n_ang)
     192              : !> \param eta       - eta  param. of angular sym fncts    bohr^-2 - DIM(n_ang)
     193              : !> \param zeta      - zeta param. of angular sym fncts              DIM(n_ang)
     194              : !> \param lam       - lambda  param. of angular sym fncts           DIM(n_ang)
     195              : !> \param loc_min   - minimum of the sym fnct                       DIM(n_ang)
     196              : !> \param loc_max   - maximum of the sym fnct                       DIM(n_ang)
     197              : !> \param loc_av    - average of the sym fnct                       DIM(n_ang)
     198              : !> \param sigma     - SD of the sym fnc                             DIM(n_ang)
     199              : !> \param ele1,ele2 - elements associated to the sym fnct           DIM(n_ang)
     200              : !> \param nuc_ele2, nuc_ele2 - associated atomic numbers            DIM(n_ang)
     201              : !> \author Christoph Schran (christoph.schran@rub.de)
     202              : !> \date   2020-10-10
     203              : ! **************************************************************************************************
     204              :    TYPE nnp_acsf_ang_type
     205              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)            :: y
     206              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)            :: funccut
     207              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)            :: eta
     208              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)            :: zeta
     209              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)            :: prefzeta
     210              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)            :: lam
     211              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)            :: loc_min
     212              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)            :: loc_max
     213              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)            :: loc_av
     214              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)            :: sigma
     215              :       CHARACTER(len=2), ALLOCATABLE, DIMENSION(:)         :: ele1
     216              :       CHARACTER(len=2), ALLOCATABLE, DIMENSION(:)         :: ele2
     217              :       INTEGER, ALLOCATABLE, DIMENSION(:)                  :: nuc_ele1
     218              :       INTEGER, ALLOCATABLE, DIMENSION(:)                  :: nuc_ele2
     219              :       INTEGER                                             :: n_symfgrp = -1
     220              :       TYPE(nnp_symfgrp_type), DIMENSION(:), ALLOCATABLE   :: symfgrp
     221              :    END TYPE nnp_acsf_ang_type
     222              : 
     223              : ! **************************************************************************************************
     224              : !> \brief Contains neighbors list of an atom
     225              : !> \param dist - distance vectors + norm                      DIM(4,nat)
     226              : !> \param n    - number of neighbors
     227              : !> \author Christoph Schran (christoph.schran@rub.de)
     228              : !> \date   2020-10-10
     229              : ! **************************************************************************************************
     230              :    TYPE nnp_neighbor_type
     231              :       INTEGER, DIMENSION(3)                               :: pbc_copies = -1
     232              :       INTEGER, DIMENSION(:), ALLOCATABLE                  :: n_rad
     233              :       INTEGER, DIMENSION(:), ALLOCATABLE                  :: n_ang1
     234              :       INTEGER, DIMENSION(:), ALLOCATABLE                  :: n_ang2
     235              :       INTEGER, DIMENSION(:, :), ALLOCATABLE               :: ind_rad
     236              :       INTEGER, DIMENSION(:, :), ALLOCATABLE               :: ind_ang1
     237              :       INTEGER, DIMENSION(:, :), ALLOCATABLE               :: ind_ang2
     238              :       REAL(KIND=dp), DIMENSION(:, :, :), ALLOCATABLE      :: dist_rad
     239              :       REAL(KIND=dp), DIMENSION(:, :, :), ALLOCATABLE      :: dist_ang1
     240              :       REAL(KIND=dp), DIMENSION(:, :, :), ALLOCATABLE      :: dist_ang2
     241              :    END TYPE nnp_neighbor_type
     242              : 
     243              : ! **************************************************************************************************
     244              : !> \brief Data type for artificial neural networks
     245              : !> \author Christoph Schran (christoph.schran@rub.de)
     246              : !> \date   2020-10-10
     247              : ! **************************************************************************************************
     248              :    TYPE nnp_arc_type
     249              :       TYPE(nnp_arc_layer_type), POINTER, DIMENSION(:)     :: layer => NULL() ! DIM(n_layer)
     250              :       INTEGER, ALLOCATABLE, DIMENSION(:)                  :: n_nodes
     251              :    END TYPE nnp_arc_type
     252              : 
     253              : ! **************************************************************************************************
     254              : !> \brief Data type for individual layer
     255              : !> \author Christoph Schran (christoph.schran@rub.de)
     256              : !> \date   2020-10-10
     257              : ! **************************************************************************************************
     258              :    TYPE nnp_arc_layer_type
     259              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :)      :: weights ! node weights
     260              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)         :: bweights ! bias weights
     261              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)            :: node ! DIM(n_nodes)
     262              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)            :: node_grad ! DIM(n_nodes)
     263              :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)         :: tmp_der ! DIM(n_sym,n_nodes)
     264              :    END TYPE nnp_arc_layer_type
     265              : 
     266              : CONTAINS
     267              : 
     268              : ! **************************************************************************************************
     269              : !> \brief Release data structure that holds all the information for neural
     270              : !>        network potentials
     271              : !> \param nnp_env ...
     272              : !> \date   2020-10-10
     273              : !> \author Christoph Schran (christoph.schran@rub.de)
     274              : ! **************************************************************************************************
     275           15 :    SUBROUTINE nnp_env_release(nnp_env)
     276              :       TYPE(nnp_type), INTENT(INOUT)                      :: nnp_env
     277              : 
     278              :       INTEGER                                            :: i, j
     279              : 
     280           15 :       IF (ASSOCIATED(nnp_env%rad)) THEN
     281           46 :          DO i = 1, nnp_env%n_ele
     282           94 :             DO j = 1, nnp_env%rad(i)%n_symfgrp
     283            0 :                DEALLOCATE (nnp_env%rad(i)%symfgrp(j)%symf, &
     284            0 :                            nnp_env%rad(i)%symfgrp(j)%ele, &
     285           94 :                            nnp_env%rad(i)%symfgrp(j)%ele_ind)
     286              :             END DO
     287            0 :             DEALLOCATE (nnp_env%rad(i)%y, &
     288            0 :                         nnp_env%rad(i)%funccut, &
     289            0 :                         nnp_env%rad(i)%eta, &
     290            0 :                         nnp_env%rad(i)%rs, &
     291            0 :                         nnp_env%rad(i)%loc_min, &
     292            0 :                         nnp_env%rad(i)%loc_max, &
     293            0 :                         nnp_env%rad(i)%loc_av, &
     294            0 :                         nnp_env%rad(i)%sigma, &
     295            0 :                         nnp_env%rad(i)%ele, &
     296            0 :                         nnp_env%rad(i)%nuc_ele, &
     297          109 :                         nnp_env%rad(i)%symfgrp)
     298              :          END DO
     299           15 :          DEALLOCATE (nnp_env%rad)
     300              :       END IF
     301              : 
     302           15 :       IF (ASSOCIATED(nnp_env%ang)) THEN
     303           46 :          DO i = 1, nnp_env%n_ele
     304          107 :             DO j = 1, nnp_env%ang(i)%n_symfgrp
     305            0 :                DEALLOCATE (nnp_env%ang(i)%symfgrp(j)%symf, &
     306            0 :                            nnp_env%ang(i)%symfgrp(j)%ele, &
     307          107 :                            nnp_env%ang(i)%symfgrp(j)%ele_ind)
     308              :             END DO
     309            0 :             DEALLOCATE (nnp_env%ang(i)%y, &
     310            0 :                         nnp_env%ang(i)%funccut, &
     311            0 :                         nnp_env%ang(i)%eta, &
     312            0 :                         nnp_env%ang(i)%zeta, &
     313            0 :                         nnp_env%ang(i)%prefzeta, &
     314            0 :                         nnp_env%ang(i)%lam, &
     315            0 :                         nnp_env%ang(i)%loc_min, &
     316            0 :                         nnp_env%ang(i)%loc_max, &
     317            0 :                         nnp_env%ang(i)%loc_av, &
     318            0 :                         nnp_env%ang(i)%sigma, &
     319            0 :                         nnp_env%ang(i)%ele1, &
     320            0 :                         nnp_env%ang(i)%ele2, &
     321            0 :                         nnp_env%ang(i)%nuc_ele1, &
     322            0 :                         nnp_env%ang(i)%nuc_ele2, &
     323          122 :                         nnp_env%ang(i)%symfgrp)
     324              :          END DO
     325           15 :          DEALLOCATE (nnp_env%ang)
     326              :       END IF
     327              : 
     328           15 :       IF (ASSOCIATED(nnp_env%arc)) THEN
     329           46 :          DO i = 1, nnp_env%n_ele
     330           46 :             IF (ASSOCIATED(nnp_env%arc(i)%layer)) THEN
     331          155 :                DO j = 1, nnp_env%n_layer
     332          124 :                   IF (ALLOCATED(nnp_env%arc(i)%layer(j)%node)) THEN
     333          124 :                      DEALLOCATE (nnp_env%arc(i)%layer(j)%node)
     334              :                   END IF
     335          124 :                   IF (ALLOCATED(nnp_env%arc(i)%layer(j)%node_grad)) THEN
     336          124 :                      DEALLOCATE (nnp_env%arc(i)%layer(j)%node_grad)
     337              :                   END IF
     338          124 :                   IF (ALLOCATED(nnp_env%arc(i)%layer(j)%weights)) THEN
     339           93 :                      DEALLOCATE (nnp_env%arc(i)%layer(j)%weights)
     340              :                   END IF
     341          124 :                   IF (ALLOCATED(nnp_env%arc(i)%layer(j)%bweights)) THEN
     342           93 :                      DEALLOCATE (nnp_env%arc(i)%layer(j)%bweights)
     343              :                   END IF
     344          155 :                   IF (ALLOCATED(nnp_env%arc(i)%layer(j)%tmp_der)) THEN
     345          124 :                      DEALLOCATE (nnp_env%arc(i)%layer(j)%tmp_der)
     346              :                   END IF
     347              :                END DO
     348            0 :                DEALLOCATE (nnp_env%arc(i)%layer, &
     349           31 :                            nnp_env%arc(i)%n_nodes)
     350              :             END IF
     351              :          END DO
     352           15 :          DEALLOCATE (nnp_env%arc)
     353              :       END IF
     354              : 
     355           15 :       IF (ALLOCATED(nnp_env%ele)) DEALLOCATE (nnp_env%ele)
     356           15 :       IF (ALLOCATED(nnp_env%nuc_ele)) DEALLOCATE (nnp_env%nuc_ele)
     357           15 :       IF (ALLOCATED(nnp_env%n_hnodes)) DEALLOCATE (nnp_env%n_hnodes)
     358           15 :       IF (ALLOCATED(nnp_env%actfnct)) DEALLOCATE (nnp_env%actfnct)
     359           15 :       IF (ALLOCATED(nnp_env%nnp_forces)) DEALLOCATE (nnp_env%nnp_forces)
     360           15 :       IF (ALLOCATED(nnp_env%atomic_energy)) DEALLOCATE (nnp_env%atomic_energy)
     361           15 :       IF (ALLOCATED(nnp_env%committee_energy)) DEALLOCATE (nnp_env%committee_energy)
     362           15 :       IF (ALLOCATED(nnp_env%ele_ind)) DEALLOCATE (nnp_env%ele_ind)
     363           15 :       IF (ALLOCATED(nnp_env%nuc_atoms)) DEALLOCATE (nnp_env%nuc_atoms)
     364           15 :       IF (ALLOCATED(nnp_env%sort)) DEALLOCATE (nnp_env%sort)
     365           15 :       IF (ALLOCATED(nnp_env%sort_inv)) DEALLOCATE (nnp_env%sort_inv)
     366           15 :       IF (ALLOCATED(nnp_env%coord)) DEALLOCATE (nnp_env%coord)
     367           15 :       IF (ALLOCATED(nnp_env%myforce)) DEALLOCATE (nnp_env%myforce)
     368           15 :       IF (ALLOCATED(nnp_env%committee_forces)) DEALLOCATE (nnp_env%committee_forces)
     369           15 :       IF (ALLOCATED(nnp_env%committee_stress)) DEALLOCATE (nnp_env%committee_stress)
     370           15 :       IF (ALLOCATED(nnp_env%atoms)) DEALLOCATE (nnp_env%atoms)
     371           15 :       IF (ALLOCATED(nnp_env%nnp_forces)) DEALLOCATE (nnp_env%nnp_forces)
     372              : 
     373           15 :       IF (ASSOCIATED(nnp_env%subsys)) THEN
     374           14 :          CALL cp_subsys_release(nnp_env%subsys)
     375              :       END IF
     376           15 :       IF (ASSOCIATED(nnp_env%subsys)) THEN
     377            0 :          CALL cp_subsys_release(nnp_env%subsys)
     378              :       END IF
     379           15 :       IF (ASSOCIATED(nnp_env%cell)) THEN
     380            1 :          CALL cell_release(nnp_env%cell)
     381              :       END IF
     382           15 :       IF (ASSOCIATED(nnp_env%cell_ref)) THEN
     383           14 :          CALL cell_release(nnp_env%cell_ref)
     384              :       END IF
     385              : 
     386           15 :    END SUBROUTINE nnp_env_release
     387              : 
     388              : ! **************************************************************************************************
     389              : !> \brief Returns various attributes of the nnp environment
     390              : !> \param nnp_env ...
     391              : !> \param nnp_forces ...
     392              : !> \param subsys the particles, molecules,... of this environment
     393              : !> \param atomic_kind_set The set of all atomic kinds involved
     394              : !> \param particle_set The set of all particles
     395              : !> \param local_particles All particles on this particular node
     396              : !> \param molecule_kind_set The set of all different molecule kinds involved
     397              : !> \param molecule_set The set of all molecules
     398              : !> \param local_molecules All molecules on this particular node
     399              : !> \param nnp_input ...
     400              : !> \param force_env_input Pointer to the force_env input section
     401              : !> \param cell The simulation cell
     402              : !> \param cell_ref The reference simulation cell
     403              : !> \param use_ref_cell Logical which indicates if reference
     404              : !>                      simulation cell is used
     405              : !> \param nnp_potential_energy ...
     406              : !> \param virial Dummy virial pointer
     407              : !> \date   2020-10-10
     408              : !> \author Christoph Schran (christoph.schran@rub.de)
     409              : !> \note
     410              : !>      For possible missing arguments see the attributes of
     411              : !>      nnp_type
     412              : ! **************************************************************************************************
     413       502454 :    SUBROUTINE nnp_env_get(nnp_env, nnp_forces, subsys, &
     414              :                           atomic_kind_set, particle_set, local_particles, &
     415              :                           molecule_kind_set, molecule_set, local_molecules, &
     416              :                           nnp_input, force_env_input, cell, cell_ref, &
     417              :                           use_ref_cell, nnp_potential_energy, virial)
     418              : 
     419              :       TYPE(nnp_type), INTENT(IN)                         :: nnp_env
     420              :       REAL(KIND=dp), DIMENSION(:, :), OPTIONAL, POINTER  :: nnp_forces
     421              :       TYPE(cp_subsys_type), OPTIONAL, POINTER            :: subsys
     422              :       TYPE(atomic_kind_type), DIMENSION(:), OPTIONAL, &
     423              :          POINTER                                         :: atomic_kind_set
     424              :       TYPE(particle_type), DIMENSION(:), OPTIONAL, &
     425              :          POINTER                                         :: particle_set
     426              :       TYPE(distribution_1d_type), OPTIONAL, POINTER      :: local_particles
     427              :       TYPE(molecule_kind_type), DIMENSION(:), OPTIONAL, &
     428              :          POINTER                                         :: molecule_kind_set
     429              :       TYPE(molecule_type), DIMENSION(:), OPTIONAL, &
     430              :          POINTER                                         :: molecule_set
     431              :       TYPE(distribution_1d_type), OPTIONAL, POINTER      :: local_molecules
     432              :       TYPE(section_vals_type), OPTIONAL, POINTER         :: nnp_input, force_env_input
     433              :       TYPE(cell_type), OPTIONAL, POINTER                 :: cell, cell_ref
     434              :       LOGICAL, INTENT(OUT), OPTIONAL                     :: use_ref_cell
     435              :       REAL(KIND=dp), INTENT(OUT), OPTIONAL               :: nnp_potential_energy
     436              :       TYPE(virial_type), OPTIONAL, POINTER               :: virial
     437              : 
     438              :       TYPE(atomic_kind_list_type), POINTER               :: atomic_kinds
     439              :       TYPE(molecule_kind_list_type), POINTER             :: molecule_kinds
     440              :       TYPE(molecule_list_type), POINTER                  :: molecules
     441              :       TYPE(particle_list_type), POINTER                  :: particles
     442              : 
     443       502454 :       NULLIFY (atomic_kinds, particles, molecules, molecule_kinds)
     444              : 
     445       502454 :       IF (PRESENT(nnp_potential_energy)) THEN
     446          594 :          nnp_potential_energy = nnp_env%nnp_potential_energy
     447              :       END IF
     448       502454 :       IF (PRESENT(nnp_forces)) nnp_forces = nnp_env%nnp_forces
     449              : 
     450              :       ! note cell will be overwritten if subsys is associated
     451              :       ! helium_env uses nnp without subsys
     452       502454 :       IF (PRESENT(cell)) cell => nnp_env%cell
     453              : 
     454       502454 :       IF (PRESENT(subsys)) subsys => nnp_env%subsys
     455       502454 :       IF (ASSOCIATED(nnp_env%subsys)) THEN
     456              :          CALL cp_subsys_get(nnp_env%subsys, &
     457              :                             atomic_kinds=atomic_kinds, &
     458              :                             particles=particles, &
     459              :                             molecule_kinds=molecule_kinds, &
     460              :                             molecules=molecules, &
     461              :                             local_molecules=local_molecules, &
     462              :                             local_particles=local_particles, &
     463              :                             virial=virial, &
     464        61078 :                             cell=cell)
     465              :       END IF
     466       502454 :       IF (PRESENT(atomic_kind_set)) atomic_kind_set => atomic_kinds%els
     467       502454 :       IF (PRESENT(particle_set)) particle_set => particles%els
     468       502454 :       IF (PRESENT(molecule_kind_set)) molecule_kind_set => molecule_kinds%els
     469       502454 :       IF (PRESENT(molecule_set)) molecule_set => molecules%els
     470              : 
     471       502454 :       IF (PRESENT(nnp_input)) nnp_input => nnp_env%nnp_input
     472       502454 :       IF (PRESENT(force_env_input)) force_env_input => nnp_env%force_env_input
     473       502454 :       IF (PRESENT(cell_ref)) cell_ref => nnp_env%cell_ref
     474       502454 :       IF (PRESENT(use_ref_cell)) use_ref_cell = nnp_env%use_ref_cell
     475              : 
     476       502454 :    END SUBROUTINE nnp_env_get
     477              : 
     478              : ! **************************************************************************************************
     479              : !> \brief Sets various attributes of the nnp environment
     480              : !> \param nnp_env ...
     481              : !> \param nnp_forces ...
     482              : !> \param subsys the particles, molecules,... of this environment
     483              : !> \param atomic_kind_set The set of all atomic kinds involved
     484              : !> \param particle_set The set of all particles
     485              : !> \param local_particles All particles on this particular node
     486              : !> \param molecule_kind_set The set of all different molecule kinds involved
     487              : !> \param molecule_set The set of all molecules
     488              : !> \param local_molecules All molecules on this particular node
     489              : !> \param nnp_input ...
     490              : !> \param force_env_input Pointer to the force_env input section
     491              : !> \param cell ...
     492              : !> \param cell_ref The reference simulation cell
     493              : !> \param use_ref_cell Logical which indicates if reference
     494              : !>                      simulation cell is used
     495              : !> \param nnp_potential_energy ...
     496              : !> \date   2020-10-10
     497              : !> \author Christoph Schran (christoph.schran@rub.de)
     498              : !> \note
     499              : !>   For possible missing arguments see the attributes of nnp_type
     500              : ! **************************************************************************************************
     501           30 :    SUBROUTINE nnp_env_set(nnp_env, nnp_forces, subsys, &
     502              :                           atomic_kind_set, particle_set, local_particles, &
     503              :                           molecule_kind_set, molecule_set, local_molecules, &
     504              :                           nnp_input, force_env_input, cell, cell_ref, &
     505              :                           use_ref_cell, nnp_potential_energy)
     506              : 
     507              :       TYPE(nnp_type), INTENT(INOUT)                      :: nnp_env
     508              :       REAL(KIND=dp), DIMENSION(:, :), OPTIONAL, POINTER  :: nnp_forces
     509              :       TYPE(cp_subsys_type), OPTIONAL, POINTER            :: subsys
     510              :       TYPE(atomic_kind_type), DIMENSION(:), OPTIONAL, &
     511              :          POINTER                                         :: atomic_kind_set
     512              :       TYPE(particle_type), DIMENSION(:), OPTIONAL, &
     513              :          POINTER                                         :: particle_set
     514              :       TYPE(distribution_1d_type), OPTIONAL, POINTER      :: local_particles
     515              :       TYPE(molecule_kind_type), DIMENSION(:), OPTIONAL, &
     516              :          POINTER                                         :: molecule_kind_set
     517              :       TYPE(molecule_type), DIMENSION(:), OPTIONAL, &
     518              :          POINTER                                         :: molecule_set
     519              :       TYPE(distribution_1d_type), OPTIONAL, POINTER      :: local_molecules
     520              :       TYPE(section_vals_type), OPTIONAL, POINTER         :: nnp_input, force_env_input
     521              :       TYPE(cell_type), OPTIONAL, POINTER                 :: cell, cell_ref
     522              :       LOGICAL, INTENT(IN), OPTIONAL                      :: use_ref_cell
     523              :       REAL(KIND=dp), INTENT(IN), OPTIONAL                :: nnp_potential_energy
     524              : 
     525              :       TYPE(atomic_kind_list_type), POINTER               :: atomic_kinds
     526              :       TYPE(molecule_kind_list_type), POINTER             :: molecule_kinds
     527              :       TYPE(molecule_list_type), POINTER                  :: molecules
     528              :       TYPE(particle_list_type), POINTER                  :: particles
     529              : 
     530           30 :       IF (PRESENT(nnp_potential_energy)) THEN
     531            0 :          nnp_env%nnp_potential_energy = nnp_potential_energy
     532              :       END IF
     533           30 :       IF (PRESENT(nnp_forces)) nnp_env%nnp_forces(:, :) = nnp_forces
     534              : 
     535           30 :       IF (PRESENT(subsys)) THEN
     536           14 :          IF (ASSOCIATED(nnp_env%subsys)) THEN
     537            0 :          IF (.NOT. ASSOCIATED(nnp_env%subsys, subsys)) THEN
     538            0 :             CALL cp_subsys_release(nnp_env%subsys)
     539              :          END IF
     540              :          END IF
     541           14 :          nnp_env%subsys => subsys
     542              :       END IF
     543           30 :       IF (PRESENT(cell)) THEN
     544            1 :          IF (ASSOCIATED(cell)) THEN
     545            1 :             CALL cell_retain(cell)
     546            1 :             CALL cell_release(nnp_env%cell)
     547            1 :             nnp_env%cell => cell
     548              :          END IF
     549            1 :          IF (ASSOCIATED(nnp_env%subsys)) THEN
     550            0 :             CALL cp_subsys_set(nnp_env%subsys, cell=cell)
     551              :          END IF
     552              :       END IF
     553           30 :       IF (PRESENT(atomic_kind_set)) THEN
     554            0 :          CALL atomic_kind_list_create(atomic_kinds, els_ptr=atomic_kind_set)
     555            0 :          CALL cp_subsys_set(nnp_env%subsys, atomic_kinds=atomic_kinds)
     556            0 :          CALL atomic_kind_list_release(atomic_kinds)
     557              :       END IF
     558           30 :       IF (PRESENT(particle_set)) THEN
     559            0 :          CALL particle_list_create(particles, els_ptr=particle_set)
     560            0 :          CALL cp_subsys_set(nnp_env%subsys, particles=particles)
     561            0 :          CALL particle_list_release(particles)
     562              :       END IF
     563           30 :       IF (PRESENT(molecule_kind_set)) THEN
     564            0 :          CALL molecule_kind_list_create(molecule_kinds, els_ptr=molecule_kind_set)
     565            0 :          CALL cp_subsys_set(nnp_env%subsys, molecule_kinds=molecule_kinds)
     566            0 :          CALL molecule_kind_list_release(molecule_kinds)
     567              :       END IF
     568           30 :       IF (PRESENT(molecule_set)) THEN
     569            0 :          CALL molecule_list_create(molecules, els_ptr=molecule_set)
     570            0 :          CALL cp_subsys_set(nnp_env%subsys, molecules=molecules)
     571            0 :          CALL molecule_list_release(molecules)
     572              :       END IF
     573           30 :       IF (PRESENT(local_particles)) THEN
     574           14 :          CALL cp_subsys_set(nnp_env%subsys, local_particles=local_particles)
     575              :       END IF
     576           30 :       IF (PRESENT(local_molecules)) THEN
     577           14 :          CALL cp_subsys_set(nnp_env%subsys, local_molecules=local_molecules)
     578              :       END IF
     579              : 
     580           30 :       IF (PRESENT(nnp_input)) nnp_env%nnp_input => nnp_input
     581           30 :       IF (PRESENT(force_env_input)) THEN
     582           14 :          nnp_env%force_env_input => force_env_input
     583              :       END IF
     584           30 :       IF (PRESENT(cell_ref)) THEN
     585           14 :          CALL cell_retain(cell_ref)
     586           14 :          CALL cell_release(nnp_env%cell_ref)
     587           14 :          nnp_env%cell_ref => cell_ref
     588              :       END IF
     589           30 :       IF (PRESENT(use_ref_cell)) nnp_env%use_ref_cell = use_ref_cell
     590           30 :    END SUBROUTINE nnp_env_set
     591              : 
     592            0 : END MODULE nnp_environment_types
        

Generated by: LCOV version 2.0-1