Line data Source code
1 : !--------------------------------------------------------------------------------------------------! 2 : ! CP2K: A general program to perform molecular dynamics simulations ! 3 : ! Copyright 2000-2024 CP2K developers group <https://cp2k.org> ! 4 : ! ! 5 : ! SPDX-License-Identifier: GPL-2.0-or-later ! 6 : !--------------------------------------------------------------------------------------------------! 7 : 8 : ! ************************************************************************************************** 9 : !> \brief Holds information on atomic properties 10 : !> \par History 11 : !> 07.2011 created 12 : !> \author JHU 13 : ! ************************************************************************************************** 14 : MODULE atprop_types 15 : 16 : USE kinds, ONLY: dp 17 : #include "../base/base_uses.f90" 18 : 19 : IMPLICIT NONE 20 : PRIVATE 21 : 22 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'atprop_types' 23 : 24 : PUBLIC :: atprop_type, atprop_create, atprop_release, atprop_init 25 : PUBLIC :: atprop_array_init, atprop_array_add 26 : 27 : ! ************************************************************************************************** 28 : !> \brief type for the atomic properties 29 : !> \author fawzi 30 : ! ************************************************************************************************** 31 : TYPE atprop_type 32 : LOGICAL :: energy = .FALSE. 33 : LOGICAL :: stress = .FALSE. 34 : REAL(KIND=dp), DIMENSION(:), POINTER :: atener => NULL() 35 : REAL(KIND=dp), DIMENSION(:), POINTER :: ateb => NULL() 36 : REAL(KIND=dp), DIMENSION(:), POINTER :: atexc => NULL() 37 : REAL(KIND=dp), DIMENSION(:), POINTER :: ateself => NULL() 38 : REAL(KIND=dp), DIMENSION(:), POINTER :: atevdw => NULL() 39 : REAL(KIND=dp), DIMENSION(:), POINTER :: ategcp => NULL() 40 : REAL(KIND=dp), DIMENSION(:), POINTER :: atecc => NULL() 41 : REAL(KIND=dp), DIMENSION(:), POINTER :: ate1c => NULL() 42 : REAL(KIND=dp), DIMENSION(:), POINTER :: atecoul => NULL() 43 : REAL(KIND=dp), DIMENSION(:, :, :), POINTER :: atstress => NULL() 44 : END TYPE atprop_type 45 : 46 : CONTAINS 47 : 48 : ! ************************************************************************************************** 49 : !> \brief ... 50 : !> \param atprop_env ... 51 : ! ************************************************************************************************** 52 9407 : SUBROUTINE atprop_create(atprop_env) 53 : TYPE(atprop_type), POINTER :: atprop_env 54 : 55 9407 : CALL atprop_release(atprop_env) 56 9407 : ALLOCATE (atprop_env) 57 : 58 9407 : END SUBROUTINE atprop_create 59 : 60 : ! ************************************************************************************************** 61 : !> \brief ... 62 : !> \param atprop_env ... 63 : !> \param natom ... 64 : ! ************************************************************************************************** 65 98070 : SUBROUTINE atprop_init(atprop_env, natom) 66 : TYPE(atprop_type), INTENT(INOUT) :: atprop_env 67 : INTEGER, INTENT(IN) :: natom 68 : 69 98070 : IF (atprop_env%energy) THEN 70 978 : CALL atprop_array_init(atprop_env%atener, natom) 71 978 : CALL atprop_array_release(atprop_env%ateb) 72 978 : CALL atprop_array_release(atprop_env%atevdw) 73 978 : CALL atprop_array_release(atprop_env%ategcp) 74 978 : CALL atprop_array_release(atprop_env%atecc) 75 978 : CALL atprop_array_release(atprop_env%atecoul) 76 978 : CALL atprop_array_release(atprop_env%ateself) 77 978 : CALL atprop_array_release(atprop_env%atexc) 78 978 : CALL atprop_array_release(atprop_env%ate1c) 79 : END IF 80 : 81 98070 : IF (atprop_env%stress) THEN 82 868 : IF (ASSOCIATED(atprop_env%atstress)) THEN 83 846 : CPASSERT(SIZE(atprop_env%atstress, 3) == natom) 84 : ELSE 85 66 : ALLOCATE (atprop_env%atstress(3, 3, natom)) 86 : END IF 87 373630 : atprop_env%atstress = 0._dp 88 : END IF 89 : 90 98070 : END SUBROUTINE atprop_init 91 : 92 : ! ************************************************************************************************** 93 : !> \brief ... 94 : !> \param atarray ... 95 : !> \param natom ... 96 : ! ************************************************************************************************** 97 9005 : SUBROUTINE atprop_array_init(atarray, natom) 98 : REAL(KIND=dp), DIMENSION(:), POINTER :: atarray 99 : INTEGER, INTENT(IN) :: natom 100 : 101 9005 : IF (ASSOCIATED(atarray)) THEN 102 6542 : CPASSERT(SIZE(atarray) == natom) 103 : ELSE 104 7389 : ALLOCATE (atarray(natom)) 105 : END IF 106 130428 : atarray = 0._dp 107 : 108 9005 : END SUBROUTINE atprop_array_init 109 : 110 : ! ************************************************************************************************** 111 : !> \brief ... 112 : !> \param atarray ... 113 : ! ************************************************************************************************** 114 92487 : SUBROUTINE atprop_array_release(atarray) 115 : REAL(KIND=dp), DIMENSION(:), POINTER :: atarray 116 : 117 92487 : IF (ASSOCIATED(atarray)) THEN 118 2463 : DEALLOCATE (atarray) 119 : END IF 120 : 121 92487 : END SUBROUTINE atprop_array_release 122 : 123 : ! ************************************************************************************************** 124 : !> \brief ... 125 : !> \param array_a ... 126 : !> \param array_b ... 127 : ! ************************************************************************************************** 128 1120 : SUBROUTINE atprop_array_add(array_a, array_b) 129 : REAL(KIND=dp), DIMENSION(:), INTENT(INOUT) :: array_a 130 : REAL(KIND=dp), DIMENSION(:), INTENT(IN), POINTER :: array_b 131 : 132 1120 : IF (ASSOCIATED(array_b)) THEN 133 19206 : array_a = array_a + array_b 134 : END IF 135 : 136 1120 : END SUBROUTINE atprop_array_add 137 : 138 : ! ************************************************************************************************** 139 : !> \brief releases the atprop 140 : !> \param atprop_env the object to release 141 : !> \author fawzi 142 : ! ************************************************************************************************** 143 18814 : SUBROUTINE atprop_release(atprop_env) 144 : TYPE(atprop_type), POINTER :: atprop_env 145 : 146 18814 : IF (ASSOCIATED(atprop_env)) THEN 147 : ! energy 148 9407 : CALL atprop_array_release(atprop_env%atener) 149 9407 : CALL atprop_array_release(atprop_env%ateb) 150 9407 : CALL atprop_array_release(atprop_env%ateself) 151 9407 : CALL atprop_array_release(atprop_env%atexc) 152 9407 : CALL atprop_array_release(atprop_env%atevdw) 153 9407 : CALL atprop_array_release(atprop_env%ategcp) 154 9407 : CALL atprop_array_release(atprop_env%atecc) 155 9407 : CALL atprop_array_release(atprop_env%ate1c) 156 9407 : CALL atprop_array_release(atprop_env%atecoul) 157 : ! stress 158 9407 : IF (ASSOCIATED(atprop_env%atstress)) THEN 159 22 : DEALLOCATE (atprop_env%atstress) 160 : END IF 161 : ! atprop type 162 9407 : DEALLOCATE (atprop_env) 163 : END IF 164 18814 : NULLIFY (atprop_env) 165 18814 : END SUBROUTINE atprop_release 166 : 167 0 : END MODULE atprop_types