|
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 ! ***************************************************************************** 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
1.7.3