|
CP2K 2.4 (Revision 12889)
|
00001 !-----------------------------------------------------------------------------! 00002 ! CP2K: A general program to perform molecular dynamics simulations ! 00003 ! Copyright (C) 2000 - 2013 CP2K developers group ! 00004 !-----------------------------------------------------------------------------! 00005 00006 ! ***************************************************************************** 00010 MODULE qs_dftb_utils 00011 00012 USE cp_output_handling, ONLY: cp_p_file,& 00013 cp_print_key_finished_output,& 00014 cp_print_key_should_output,& 00015 cp_print_key_unit_nr 00016 USE f77_blas 00017 USE input_section_types, ONLY: section_vals_type 00018 USE kinds, ONLY: default_string_length,& 00019 dp 00020 USE qs_dftb_types, ONLY: qs_dftb_atom_type 00021 #include "cp_common_uses.h" 00022 00023 IMPLICIT NONE 00024 00025 PRIVATE 00026 00027 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_dftb_utils' 00028 00029 PUBLIC :: allocate_dftb_atom_param,& 00030 deallocate_dftb_atom_param,& 00031 get_dftb_atom_param,& 00032 set_dftb_atom_param,& 00033 write_dftb_atom_param 00034 00035 CONTAINS 00036 00037 ! ***************************************************************************** 00038 SUBROUTINE allocate_dftb_atom_param(dftb_parameter,error) 00039 00040 TYPE(qs_dftb_atom_type), POINTER :: dftb_parameter 00041 TYPE(cp_error_type), INTENT(INOUT) :: error 00042 00043 CHARACTER(LEN=*), PARAMETER :: routineN = 'allocate_dftb_atom_param', 00044 routineP = moduleN//':'//routineN 00045 00046 INTEGER :: istat 00047 LOGICAL :: failure 00048 00049 IF (ASSOCIATED(dftb_parameter)) & 00050 CALL deallocate_dftb_atom_param(dftb_parameter,error) 00051 00052 ALLOCATE (dftb_parameter,STAT=istat) 00053 CPPostcondition(istat==0,cp_failure_level,routineP,error,failure) 00054 00055 dftb_parameter % defined = .FALSE. 00056 dftb_parameter % name = "" 00057 dftb_parameter % typ = "NONE" 00058 dftb_parameter % z = -1 00059 dftb_parameter % zeff = -1.0_dp 00060 dftb_parameter % natorb = 0 00061 dftb_parameter % lmax = -1 00062 dftb_parameter % skself = 0.0_dp 00063 dftb_parameter % occupation = 0.0_dp 00064 dftb_parameter % eta = 0.0_dp 00065 dftb_parameter % energy = 0.0_dp 00066 dftb_parameter % xi = 0.0_dp 00067 dftb_parameter % di = 0.0_dp 00068 dftb_parameter % rcdisp = 0.0_dp 00069 00070 END SUBROUTINE allocate_dftb_atom_param 00071 00072 ! ***************************************************************************** 00073 SUBROUTINE deallocate_dftb_atom_param(dftb_parameter,error) 00074 00075 TYPE(qs_dftb_atom_type), POINTER :: dftb_parameter 00076 TYPE(cp_error_type), INTENT(INOUT) :: error 00077 00078 CHARACTER(LEN=*), PARAMETER :: routineN = 'deallocate_dftb_atom_param', 00079 routineP = moduleN//':'//routineN 00080 00081 INTEGER :: istat 00082 LOGICAL :: failure 00083 00084 CPPrecondition(ASSOCIATED(dftb_parameter),cp_failure_level,routineP,error,failure) 00085 DEALLOCATE (dftb_parameter,STAT=istat) 00086 CPPostcondition(istat==0,cp_failure_level,routineP,error,failure) 00087 00088 END SUBROUTINE deallocate_dftb_atom_param 00089 00090 ! ***************************************************************************** 00091 SUBROUTINE get_dftb_atom_param(dftb_parameter,name,typ,defined,z,zeff,natorb,& 00092 lmax,skself,occupation,eta,energy,cutoff,xi,di,rcdisp,error) 00093 00094 TYPE(qs_dftb_atom_type), POINTER :: dftb_parameter 00095 CHARACTER(LEN=default_string_length), 00096 INTENT(OUT), OPTIONAL :: name, typ 00097 LOGICAL, INTENT(OUT), OPTIONAL :: defined 00098 INTEGER, INTENT(OUT), OPTIONAL :: z 00099 REAL(KIND=dp), INTENT(OUT), OPTIONAL :: zeff 00100 INTEGER, INTENT(OUT), OPTIONAL :: natorb, lmax 00101 REAL(KIND=dp), DIMENSION(0:3), OPTIONAL :: skself, occupation, eta 00102 REAL(KIND=dp), OPTIONAL :: energy, cutoff, xi, di, rcdisp 00103 TYPE(cp_error_type), INTENT(INOUT), 00104 OPTIONAL :: error 00105 00106 CHARACTER(LEN=*), PARAMETER :: routineN = 'get_dftb_atom_param', 00107 routineP = moduleN//':'//routineN 00108 00109 LOGICAL :: failure 00110 00111 CPPrecondition(ASSOCIATED(dftb_parameter),cp_failure_level,routineP,error,failure) 00112 00113 IF (PRESENT(name)) name = dftb_parameter%name 00114 IF (PRESENT(typ)) typ = dftb_parameter%typ 00115 IF (PRESENT(defined)) defined = dftb_parameter%defined 00116 IF (PRESENT(z)) z = dftb_parameter%z 00117 IF (PRESENT(zeff)) zeff = dftb_parameter%zeff 00118 IF (PRESENT(natorb)) natorb = dftb_parameter%natorb 00119 IF (PRESENT(lmax)) lmax = dftb_parameter%lmax 00120 IF (PRESENT(skself)) skself = dftb_parameter%skself 00121 IF (PRESENT(eta)) eta = dftb_parameter%eta 00122 IF (PRESENT(energy)) energy = dftb_parameter%energy 00123 IF (PRESENT(cutoff)) cutoff = dftb_parameter%cutoff 00124 IF (PRESENT(occupation)) occupation = dftb_parameter%occupation 00125 IF (PRESENT(xi)) xi = dftb_parameter%xi 00126 IF (PRESENT(di)) di = dftb_parameter%di 00127 IF (PRESENT(rcdisp)) rcdisp = dftb_parameter%rcdisp 00128 00129 END SUBROUTINE get_dftb_atom_param 00130 00131 ! ***************************************************************************** 00132 SUBROUTINE set_dftb_atom_param(dftb_parameter,name,typ,defined,z,zeff,natorb,& 00133 lmax,skself,occupation,eta,energy,cutoff,xi,di,rcdisp,error) 00134 00135 TYPE(qs_dftb_atom_type), POINTER :: dftb_parameter 00136 CHARACTER(LEN=default_string_length), 00137 INTENT(IN), OPTIONAL :: name, typ 00138 LOGICAL, INTENT(IN), OPTIONAL :: defined 00139 INTEGER, INTENT(IN), OPTIONAL :: z 00140 REAL(KIND=dp), INTENT(IN), OPTIONAL :: zeff 00141 INTEGER, INTENT(IN), OPTIONAL :: natorb, lmax 00142 REAL(KIND=dp), DIMENSION(0:3), OPTIONAL :: skself, occupation, eta 00143 REAL(KIND=dp), OPTIONAL :: energy, cutoff, xi, di, rcdisp 00144 TYPE(cp_error_type), INTENT(inout) :: error 00145 00146 CHARACTER(LEN=*), PARAMETER :: routineN = 'set_dftb_atom_param', 00147 routineP = moduleN//':'//routineN 00148 00149 LOGICAL :: failure 00150 00151 CPPrecondition(ASSOCIATED(dftb_parameter),cp_failure_level,routineP,error,failure) 00152 00153 IF (PRESENT(name)) dftb_parameter%name = name 00154 IF (PRESENT(typ)) dftb_parameter%typ = typ 00155 IF (PRESENT(defined)) dftb_parameter%defined = defined 00156 IF (PRESENT(z)) dftb_parameter%z = z 00157 IF (PRESENT(zeff)) dftb_parameter%zeff = zeff 00158 IF (PRESENT(natorb)) dftb_parameter%natorb = natorb 00159 IF (PRESENT(lmax)) dftb_parameter%lmax = lmax 00160 IF (PRESENT(skself)) dftb_parameter%skself = skself 00161 IF (PRESENT(eta)) dftb_parameter%eta = eta 00162 IF (PRESENT(occupation)) dftb_parameter%occupation = occupation 00163 IF (PRESENT(energy)) dftb_parameter%energy = energy 00164 IF (PRESENT(cutoff)) dftb_parameter%cutoff = cutoff 00165 IF (PRESENT(xi)) dftb_parameter%xi = xi 00166 IF (PRESENT(di)) dftb_parameter%di = di 00167 IF (PRESENT(rcdisp)) dftb_parameter%rcdisp = rcdisp 00168 00169 END SUBROUTINE set_dftb_atom_param 00170 00171 ! ***************************************************************************** 00172 SUBROUTINE write_dftb_atom_param(dftb_parameter,subsys_section,error) 00173 00174 TYPE(qs_dftb_atom_type), POINTER :: dftb_parameter 00175 TYPE(section_vals_type), POINTER :: subsys_section 00176 TYPE(cp_error_type), INTENT(inout) :: error 00177 00178 CHARACTER(LEN=*), PARAMETER :: routineN = 'write_dftb_atom_param', 00179 routineP = moduleN//':'//routineN 00180 00181 CHARACTER(LEN=default_string_length) :: name, typ 00182 INTEGER :: lmax, natorb, output_unit, z 00183 LOGICAL :: defined 00184 REAL(dp) :: zeff 00185 TYPE(cp_logger_type), POINTER :: logger 00186 00187 NULLIFY(logger) 00188 logger => cp_error_get_logger(error) 00189 IF (ASSOCIATED(dftb_parameter).AND.& 00190 BTEST(cp_print_key_should_output(logger%iter_info,subsys_section,& 00191 "PRINT%KINDS/POTENTIAL",error=error),cp_p_file)) THEN 00192 00193 output_unit = cp_print_key_unit_nr(logger,subsys_section,"PRINT%KINDS",& 00194 extension=".Log",error=error) 00195 00196 IF (output_unit >0) THEN 00197 CALL get_dftb_atom_param(dftb_parameter,name=name,typ=typ,defined=defined,& 00198 z=z,zeff=zeff,natorb=natorb,lmax=lmax,error=error) 00199 00200 WRITE (UNIT=output_unit,FMT="(/,A,T67,A14)")& 00201 " DFTB parameters: ",TRIM(name) 00202 IF ( defined ) THEN 00203 WRITE (UNIT=output_unit,FMT="(T16,A,T71,F10.2)")& 00204 "Effective core charge:",zeff 00205 WRITE (UNIT=output_unit,FMT="(T16,A,T71,I10)")& 00206 "Number of orbitals:",natorb 00207 ELSE 00208 WRITE (UNIT=output_unit,FMT="(T55,A)")& 00209 "Parameters are not defined" 00210 END IF 00211 END IF 00212 CALL cp_print_key_finished_output(output_unit,logger,subsys_section,& 00213 "PRINT%KINDS",error=error) 00214 END IF 00215 00216 END SUBROUTINE write_dftb_atom_param 00217 00218 END MODULE qs_dftb_utils 00219
1.7.3