CP2K 2.4 (Revision 12889)

preconditioner_types.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 ! *****************************************************************************
00012 MODULE preconditioner_types
00013   USE cp_blacs_env,                    ONLY: cp_blacs_env_release,&
00014                                              cp_blacs_env_retain
00015   USE cp_dbcsr_interface,              ONLY: cp_dbcsr_release_p
00016   USE cp_dbcsr_operations,             ONLY: cp_dbcsr_deallocate_matrix
00017   USE cp_dbcsr_types,                  ONLY: cp_dbcsr_type
00018   USE cp_fm_types,                     ONLY: cp_fm_release,&
00019                                              cp_fm_type
00020   USE cp_para_env,                     ONLY: cp_para_env_release,&
00021                                              cp_para_env_retain
00022   USE cp_para_types,                   ONLY: cp_blacs_env_type,&
00023                                              cp_para_env_type
00024   USE input_constants,                 ONLY: ot_precond_solver_default
00025   USE kinds,                           ONLY: dp
00026   USE timings,                         ONLY: timeset,&
00027                                              timestop
00028 #include "cp_common_uses.h"
00029 
00030   IMPLICIT NONE
00031 
00032   PRIVATE
00033 
00034   CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'preconditioner_types'
00035 
00036   PUBLIC  :: preconditioner_type, preconditioner_p_type
00037   PUBLIC  :: init_preconditioner
00038   PUBLIC  :: preconditioner_in_use
00039   PUBLIC  :: destroy_preconditioner
00040 
00041 ! *****************************************************************************
00042   TYPE preconditioner_type
00043 !    PRIVATE
00044        TYPE(cp_dbcsr_type),    POINTER :: sparse_matrix,sparse_matrix_inner
00045        TYPE(cp_fm_type), POINTER :: fm
00046        TYPE(cp_dbcsr_type), POINTER           :: dbcsr_matrix
00047        TYPE(cp_para_env_type),  POINTER   :: para_env
00048        TYPE(cp_blacs_env_type), POINTER   :: ctxt
00049        INTEGER :: in_use, solver
00050        REAL(KIND = dp), DIMENSION(:), POINTER :: occ_evals,full_evals
00051        REAL(KIND = dp) :: energy_gap
00052   END TYPE preconditioner_type
00053 
00054 ! *****************************************************************************
00055   TYPE preconditioner_p_type
00056      TYPE(preconditioner_type), POINTER :: preconditioner
00057   END TYPE preconditioner_p_type
00058 
00059 CONTAINS
00060 
00061 ! *****************************************************************************
00062 
00063   FUNCTION preconditioner_in_use(preconditioner)
00064     TYPE(preconditioner_type)                :: preconditioner
00065     LOGICAL                                  :: preconditioner_in_use
00066 
00067     preconditioner_in_use = .NOT. (preconditioner%in_use .EQ. 0)
00068   END FUNCTION
00069 
00070 ! *****************************************************************************
00071   SUBROUTINE init_preconditioner(preconditioner_env,para_env,blacs_env, error)
00072 
00073     TYPE(preconditioner_type)                :: preconditioner_env
00074     TYPE(cp_para_env_type), POINTER          :: para_env
00075     TYPE(cp_blacs_env_type), POINTER         :: blacs_env
00076     TYPE(cp_error_type), INTENT(inout)       :: error
00077 
00078     NULLIFY(preconditioner_env%sparse_matrix)
00079     NULLIFY(preconditioner_env%sparse_matrix_inner)
00080     NULLIFY(preconditioner_env%fm)
00081     NULLIFY(preconditioner_env%dbcsr_matrix)
00082     NULLIFY(preconditioner_env%occ_evals)
00083     NULLIFY(preconditioner_env%full_evals)
00084     preconditioner_env%solver=ot_precond_solver_default
00085     preconditioner_env%para_env => para_env
00086     preconditioner_env%ctxt     => blacs_env
00087 
00088     CALL cp_para_env_retain(preconditioner_env%para_env,error=error)
00089     CALL cp_blacs_env_retain(preconditioner_env%ctxt,error=error)
00090 
00091   END SUBROUTINE init_preconditioner
00092 
00093 ! *****************************************************************************
00094   SUBROUTINE destroy_preconditioner(preconditioner_env, error)
00095 
00096     TYPE(preconditioner_type)                :: preconditioner_env
00097     TYPE(cp_error_type), INTENT(inout)       :: error
00098 
00099     CHARACTER(len=*), PARAMETER :: routineN = 'destroy_preconditioner', 
00100       routineP = moduleN//':'//routineN
00101 
00102     INTEGER                                  :: handle
00103 
00104     CALL timeset(routineN,handle)
00105 
00106     IF (ASSOCIATED(preconditioner_env%sparse_matrix)) THEN
00107        CALL cp_dbcsr_deallocate_matrix(preconditioner_env%sparse_matrix,error=error)
00108        NULLIFY(preconditioner_env%sparse_matrix)
00109     ENDIF
00110     IF (ASSOCIATED(preconditioner_env%sparse_matrix_inner)) THEN
00111        CALL cp_dbcsr_release_p (preconditioner_env%sparse_matrix_inner, error=error)
00112     ENDIF
00113 
00114     IF (ASSOCIATED(preconditioner_env%fm)) THEN
00115        CALL cp_fm_release(preconditioner_env%fm,error=error)
00116     ENDIF
00117     IF (ASSOCIATED(preconditioner_env%dbcsr_matrix)) THEN
00118        CALL cp_dbcsr_release_p (preconditioner_env%dbcsr_matrix, error=error)
00119     ENDIF
00120     IF (ASSOCIATED(preconditioner_env%occ_evals)) THEN
00121        DEALLOCATE(preconditioner_env%occ_evals)
00122     ENDIF
00123     IF (ASSOCIATED(preconditioner_env%full_evals)) THEN
00124        DEALLOCATE(preconditioner_env%full_evals)
00125     ENDIF
00126     CALL cp_para_env_release(preconditioner_env%para_env,error=error)
00127     CALL cp_blacs_env_release(preconditioner_env%ctxt,error=error)
00128 
00129     preconditioner_env%in_use=0
00130 
00131     CALL timestop(handle)
00132 
00133   END SUBROUTINE destroy_preconditioner
00134 
00135 END MODULE preconditioner_types
00136