CP2K 2.4 (Revision 12889)

qs_dftb_utils.f90

Go to the documentation of this file.
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