CP2K 2.4 (Revision 12889)

qs_density_mixing_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 qs_density_mixing_types
00013 
00014   USE input_section_types,             ONLY: section_vals_type,&
00015                                              section_vals_val_get
00016   USE kinds,                           ONLY: dp
00017   USE qs_rho_atom_types,               ONLY: rho_atom_coeff
00018   USE qs_util,                         ONLY: exp_radius
00019 #include "cp_common_uses.h"
00020 
00021   IMPLICIT NONE
00022   PRIVATE
00023 
00024   LOGICAL, PRIVATE, PARAMETER :: debug_this_module=.TRUE.
00025 
00026   CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_density_mixing_types'
00027 
00028   INTEGER, PARAMETER, PUBLIC :: no_mixing_nr=0, direct_mixing_nr=1,
00029                                  gspace_mixing_nr=2, pulay_mixing_nr=3,
00030                                  broyden_mixing_nr=4, 
00031                                  broyden_mixing_new_nr=5,
00032                                  multisecant_mixing_nr=6
00033   PUBLIC :: cp_1d_z_p_type, mixing_storage_create, mixing_storage_type, mixing_storage_release
00034 
00035   TYPE cp_1d_z_p_type
00036      COMPLEX(dp), DIMENSION(:), POINTER :: cc
00037   END TYPE cp_1d_z_p_type
00038 
00039 
00040   TYPE mixing_storage_type
00041      INTEGER :: ref_count, ig_max, ncall, nbuffer, n_simple_mix, nskip_mixing, p_metric_method
00042      INTEGER, POINTER, DIMENSION(:) :: ig_global_index
00043      LOGICAL, POINTER, DIMENSION(:) :: paw
00044      CHARACTER (len=15) :: iter_method
00045      REAL(dp) :: alpha, bconst, beta, broy_w0, max_g2, max_gvec_exp, pulay_alpha, pulay_beta, r_step,
00046                  reg_par, sigma_max, wc, wmax
00047      REAL(dp), DIMENSION(:), POINTER :: p_metric
00048      REAL(KIND=dp), DIMENSION(:), POINTER :: kerker_factor
00049      REAL(KIND=dp), DIMENSION(:), POINTER :: special_metric
00050      REAL(dp), DIMENSION(:,:), POINTER :: weight
00051      REAL(KIND = dp) , DIMENSION(:,:), POINTER :: norm_res_buffer,pulay_matrix
00052      REAL(dp), DIMENSION(:,:,:), POINTER :: fmat, gmat, smat
00053      TYPE(cp_1d_z_p_type), DIMENSION(:), POINTER :: last_res, rhoin, rhoin_old
00054      TYPE(cp_1d_z_p_type), DIMENSION(:,:), POINTER :: delta_res, u_vec, z_vec
00055      TYPE(cp_1d_z_p_type), DIMENSION(:,:), POINTER ::drho_buffer, rhoin_buffer, 
00056       res_buffer
00057      TYPE(rho_atom_coeff), DIMENSION(:,:), POINTER :: cpc_h_lastres, cpc_s_lastres
00058      TYPE(rho_atom_coeff), DIMENSION(:,:), POINTER :: cpc_h_in, cpc_s_in
00059      TYPE(rho_atom_coeff), DIMENSION(:,:), POINTER :: cpc_h_old, cpc_s_old
00060      TYPE(rho_atom_coeff), DIMENSION(:,:,:), POINTER :: dcpc_h_in, dcpc_s_in
00061   END TYPE mixing_storage_type
00062 
00063 CONTAINS
00064 
00065 ! *****************************************************************************
00071   SUBROUTINE mixing_storage_create(mixing_store,  mixing_section, mixing_method, ecut, error)
00072     TYPE(mixing_storage_type), POINTER       :: mixing_store
00073     TYPE(section_vals_type), POINTER         :: mixing_section
00074     INTEGER, INTENT(IN)                      :: mixing_method
00075     REAL(dp), INTENT(IN)                     :: ecut
00076     TYPE(cp_error_type), INTENT(inout)       :: error
00077 
00078     CHARACTER(len=*), PARAMETER :: routineN = 'mixing_storage_create', 
00079       routineP = moduleN//':'//routineN
00080 
00081     INTEGER                                  :: stat
00082     LOGICAL                                  :: failure
00083     REAL(dp)                                 :: alpha, eps, gcut
00084 
00085     failure=.FALSE.
00086 
00087     CPPrecondition(.NOT.ASSOCIATED(mixing_store),cp_failure_level,routineP,error,failure)
00088     IF(.NOT. failure) THEN
00089       ALLOCATE(mixing_store, stat=stat)
00090       CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00091       IF (.NOT.failure) THEN
00092 
00093         mixing_store%ref_count=1
00094         mixing_store%nbuffer=0
00095         mixing_store%n_simple_mix=0
00096         mixing_store%ncall=0
00097         mixing_store%alpha=1.0_dp
00098         mixing_store%pulay_beta=1.0_dp
00099         mixing_store%beta=1.0_dp
00100         mixing_store%iter_method = "NoMix"
00101         mixing_store%max_g2 = 2._dp*ecut
00102 
00103         NULLIFY(mixing_store%p_metric)
00104         NULLIFY(mixing_store%kerker_factor)
00105         NULLIFY(mixing_store%special_metric)
00106         NULLIFY(mixing_store%pulay_matrix)
00107         NULLIFY(mixing_store%weight)
00108         NULLIFY(mixing_store%fmat)
00109         NULLIFY(mixing_store%gmat)
00110         NULLIFY(mixing_store%smat)
00111         NULLIFY(mixing_store%last_res)
00112         NULLIFY(mixing_store%rhoin)
00113         NULLIFY(mixing_store%rhoin_old)
00114         NULLIFY(mixing_store%delta_res)
00115         NULLIFY(mixing_store%u_vec)
00116         NULLIFY(mixing_store%z_vec)
00117         NULLIFY(mixing_store%drho_buffer)
00118         NULLIFY(mixing_store%rhoin_buffer)
00119         NULLIFY(mixing_store%res_buffer)
00120         NULLIFY(mixing_store%norm_res_buffer)
00121         NULLIFY(mixing_store%ig_global_index)
00122         NULLIFY(mixing_store%paw)
00123         NULLIFY(mixing_store%cpc_h_in)
00124         NULLIFY(mixing_store%cpc_s_in)
00125         NULLIFY(mixing_store%cpc_h_old)
00126         NULLIFY(mixing_store%cpc_s_old)
00127         NULLIFY(mixing_store%dcpc_h_in)
00128         NULLIFY(mixing_store%dcpc_s_in)
00129         NULLIFY(mixing_store%cpc_h_lastres)
00130         NULLIFY(mixing_store%cpc_s_lastres)
00131 
00132         CALL section_vals_val_get(mixing_section,"ALPHA",r_val=mixing_store%alpha,error=error)
00133         CALL section_vals_val_get(mixing_section,"BETA",r_val=mixing_store%beta,error=error)
00134         CALL section_vals_val_get(mixing_section,"N_SIMPLE_MIX",i_val=mixing_store%n_simple_mix,error=error)
00135         CALL section_vals_val_get(mixing_section,"NBUFFER",i_val=mixing_store%nbuffer,error=error)
00136         CALL section_vals_val_get(mixing_section,"NSKIP",i_val=mixing_store%nskip_mixing,error=error)
00137         CALL section_vals_val_get(mixing_section,"MAX_GVEC_EXP",r_val=mixing_store%max_gvec_exp,error=error)
00138 
00139         IF(mixing_store%max_gvec_exp > 0._dp) THEN
00140           alpha = 0.25_dp/mixing_store%max_gvec_exp
00141           eps = 1.e-4_dp
00142           gcut = exp_radius(3,alpha,eps,1.0_dp)
00143           mixing_store%max_g2 = gcut*gcut
00144         END IF
00145 
00146         SELECT CASE(mixing_method)
00147         CASE(gspace_mixing_nr)
00148            mixing_store%nbuffer = 1
00149         CASE(pulay_mixing_nr)
00150            CALL section_vals_val_get(mixing_section,"PULAY_ALPHA",r_val=mixing_store%pulay_alpha,error=error)
00151            CALL section_vals_val_get(mixing_section,"PULAY_BETA",r_val=mixing_store%pulay_beta,error=error)
00152         CASE(broyden_mixing_nr)
00153            CALL section_vals_val_get(mixing_section,"BROY_W0",r_val=mixing_store%broy_w0,error=error)
00154            mixing_store%bconst = 20.0_dp
00155         CASE(broyden_mixing_new_nr)
00156            CALL section_vals_val_get(mixing_section,"BROY_WREF",r_val=mixing_store%wc,error=error)
00157            CALL section_vals_val_get(mixing_section,"BROY_WMAX",r_val=mixing_store%wmax,error=error)
00158            mixing_store%bconst = 20.0_dp
00159            mixing_store%p_metric_method=1
00160         CASE(multisecant_mixing_nr)
00161            CALL section_vals_val_get(mixing_section,"REGULARIZATION",r_val=mixing_store%reg_par,error=error)
00162            CALL section_vals_val_get(mixing_section,"MAX_STEP",r_val=mixing_store%sigma_max,error=error)
00163            CALL section_vals_val_get(mixing_section,"R_FACTOR",r_val=mixing_store%r_step,error=error)
00164         END SELECT
00165       END IF
00166     END IF
00167 
00168  END SUBROUTINE mixing_storage_create
00169 
00170 ! *****************************************************************************
00176  SUBROUTINE mixing_storage_release(mixing_store,error)
00177     TYPE(mixing_storage_type), POINTER       :: mixing_store
00178     TYPE(cp_error_type), INTENT(inout)       :: error
00179 
00180     CHARACTER(len=*), PARAMETER :: routineN = 'mixing_storage_release', 
00181       routineP = moduleN//':'//routineN
00182 
00183     INTEGER                                  :: i, j, k, stat
00184     LOGICAL                                  :: failure
00185 
00186   failure=.FALSE.
00187 
00188   IF (ASSOCIATED(mixing_store)) THEN
00189      CPPreconditionNoFail(mixing_store%ref_count>0,cp_failure_level,routineP,error)
00190      mixing_store%ref_count=mixing_store%ref_count-1
00191      IF (mixing_store%ref_count==0) THEN
00192 
00193         IF (ASSOCIATED(mixing_store%kerker_factor)) THEN
00194            DEALLOCATE(mixing_store%kerker_factor,stat=stat)
00195            CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00196         ENDIF
00197 
00198         IF (ASSOCIATED(mixing_store%special_metric)) THEN
00199            DEALLOCATE(mixing_store%special_metric,stat=stat)
00200            CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00201         ENDIF
00202 
00203         IF (ASSOCIATED(mixing_store%pulay_matrix)) THEN
00204            DEALLOCATE(mixing_store%pulay_matrix,stat=stat)
00205            CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00206         ENDIF
00207 
00208         IF (ASSOCIATED(mixing_store%rhoin_buffer)) THEN
00209            DO i = 1,SIZE(mixing_store%rhoin_buffer,2)
00210              DO j = 1,SIZE(mixing_store%rhoin_buffer,1)
00211                 DEALLOCATE(mixing_store%rhoin_buffer(j,i)%cc,STAT=stat)
00212                 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00213              END DO
00214            END DO
00215            DEALLOCATE(mixing_store%rhoin_buffer,stat=stat)
00216            CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00217         ENDIF
00218 
00219         IF (ASSOCIATED(mixing_store%paw)) THEN
00220           DEALLOCATE(mixing_store%paw,STAT=stat)
00221           CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00222         END IF
00223         IF (ASSOCIATED(mixing_store%cpc_h_in)) THEN
00224           DO j = 1,SIZE(mixing_store%cpc_h_in,2)
00225           DO k = 1,SIZE(mixing_store%cpc_h_in,1)
00226             IF(ASSOCIATED(mixing_store%cpc_h_in(k,j)%r_coef)) THEN
00227               DEALLOCATE(mixing_store%cpc_h_in(k,j)%r_coef,STAT=stat)
00228               CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00229               DEALLOCATE(mixing_store%cpc_s_in(k,j)%r_coef,STAT=stat)
00230               CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00231             END IF
00232           END DO
00233           END DO
00234           DEALLOCATE(mixing_store%cpc_h_in,STAT=stat)
00235           CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00236           DEALLOCATE(mixing_store%cpc_s_in,STAT=stat)
00237           CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00238         END IF
00239         IF (ASSOCIATED(mixing_store%cpc_h_old)) THEN
00240           DO j = 1,SIZE(mixing_store%cpc_h_old,2)
00241           DO k = 1,SIZE(mixing_store%cpc_h_old,1)
00242             IF(ASSOCIATED(mixing_store%cpc_h_old(k,j)%r_coef)) THEN
00243               DEALLOCATE(mixing_store%cpc_h_old(k,j)%r_coef,STAT=stat)
00244               CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00245               DEALLOCATE(mixing_store%cpc_s_old(k,j)%r_coef,STAT=stat)
00246               CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00247             END IF
00248           END DO
00249           END DO
00250           DEALLOCATE(mixing_store%cpc_h_old,STAT=stat)
00251           CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00252           DEALLOCATE(mixing_store%cpc_s_old,STAT=stat)
00253           CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00254         END IF
00255         IF (ASSOCIATED(mixing_store%dcpc_h_in)) THEN
00256           DO i = 1,SIZE(mixing_store%dcpc_h_in,3)
00257           DO j = 1,SIZE(mixing_store%dcpc_h_in,2)
00258           DO k = 1,SIZE(mixing_store%dcpc_h_in,1)
00259             IF(ASSOCIATED(mixing_store%dcpc_h_in(k,j,i)%r_coef)) THEN
00260               DEALLOCATE(mixing_store%dcpc_h_in(k,j,i)%r_coef,STAT=stat)
00261               CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00262               DEALLOCATE(mixing_store%dcpc_s_in(k,j,i)%r_coef,STAT=stat)
00263               CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00264             END IF
00265           END DO
00266           END DO
00267           END DO
00268           DEALLOCATE(mixing_store%dcpc_h_in,STAT=stat)
00269           CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00270           DEALLOCATE(mixing_store%dcpc_s_in,STAT=stat)
00271           CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00272         END IF
00273         IF (ASSOCIATED(mixing_store%cpc_h_lastres)) THEN
00274           DO j = 1,SIZE(mixing_store%cpc_h_lastres,2)
00275           DO k = 1,SIZE(mixing_store%cpc_h_lastres,1)
00276             IF(ASSOCIATED(mixing_store%cpc_h_lastres(k,j)%r_coef)) THEN
00277               DEALLOCATE(mixing_store%cpc_h_lastres(k,j)%r_coef,STAT=stat)
00278               CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00279               DEALLOCATE(mixing_store%cpc_s_lastres(k,j)%r_coef,STAT=stat)
00280               CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00281              END IF
00282           END DO
00283           END DO
00284           DEALLOCATE(mixing_store%cpc_h_lastres,STAT=stat)
00285           CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00286           DEALLOCATE(mixing_store%cpc_s_lastres,STAT=stat)
00287           CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00288         ENDIF
00289 
00290         IF (ASSOCIATED(mixing_store%res_buffer)) THEN
00291            DO i = 1,SIZE(mixing_store%res_buffer,2)
00292              DO j = 1,SIZE(mixing_store%res_buffer,1)
00293                 DEALLOCATE(mixing_store%res_buffer(j,i)%cc,STAT=stat)
00294                 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00295              END DO
00296            END DO
00297            DEALLOCATE(mixing_store%res_buffer,stat=stat)
00298            CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00299         ENDIF
00300 
00301         IF (ASSOCIATED(mixing_store%norm_res_buffer)) THEN
00302            DEALLOCATE(mixing_store%norm_res_buffer,stat=stat)
00303            CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00304         ENDIF
00305 
00306         IF (ASSOCIATED(mixing_store%ig_global_index)) THEN
00307            DEALLOCATE(mixing_store%ig_global_index,stat=stat)
00308            CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00309         ENDIF
00310 
00311         IF (ASSOCIATED(mixing_store%drho_buffer)) THEN
00312            DO i = 1,SIZE(mixing_store%drho_buffer,2)
00313              DO j = 1,SIZE(mixing_store%drho_buffer,1)
00314                 DEALLOCATE(mixing_store%drho_buffer(j,i)%cc,STAT=stat)
00315                 CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00316              END DO
00317            END DO
00318            DEALLOCATE(mixing_store%drho_buffer,stat=stat)
00319            CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00320         ENDIF
00321 
00322         IF (ASSOCIATED(mixing_store%last_res)) THEN
00323            DO i = 1,SIZE(mixing_store%last_res)
00324              DEALLOCATE(mixing_store%last_res(i)%cc,STAT=stat)
00325              CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00326            END DO
00327            DEALLOCATE(mixing_store%last_res,STAT=stat)
00328            CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00329         END IF
00330 
00331         IF (ASSOCIATED(mixing_store%rhoin)) THEN
00332            DO i = 1,SIZE(mixing_store%rhoin)
00333              DEALLOCATE(mixing_store%rhoin(i)%cc,STAT=stat)
00334              CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00335            END DO
00336            DEALLOCATE(mixing_store%rhoin,STAT=stat)
00337            CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00338         END IF
00339 
00340         IF (ASSOCIATED(mixing_store%rhoin_old)) THEN
00341            DO i = 1,SIZE(mixing_store%rhoin_old)
00342              DEALLOCATE(mixing_store%rhoin_old(i)%cc,STAT=stat)
00343              CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00344            END DO
00345            DEALLOCATE(mixing_store%rhoin_old,STAT=stat)
00346            CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00347         END IF
00348 
00349         IF (ASSOCIATED(mixing_store%p_metric))THEN
00350            DEALLOCATE(mixing_store%p_metric, STAT=stat)
00351            CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00352         END IF
00353 
00354         IF (ASSOCIATED(mixing_store%weight))THEN
00355            DEALLOCATE(mixing_store%weight, STAT=stat)
00356            CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00357         END IF
00358 
00359         IF (ASSOCIATED(mixing_store%fmat))THEN
00360            DEALLOCATE(mixing_store%fmat, STAT=stat)
00361            CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00362         END IF
00363 
00364         IF (ASSOCIATED(mixing_store%delta_res))THEN
00365            DO i = 1,SIZE(mixing_store%delta_res,2)
00366              DO j = 1,SIZE(mixing_store%delta_res,1)
00367                DEALLOCATE(mixing_store%delta_res(j,i)%cc, STAT=stat)
00368            CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00369              END DO
00370            END DO
00371            DEALLOCATE(mixing_store%delta_res,STAT=stat)
00372            CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00373         END IF
00374 
00375         IF (ASSOCIATED(mixing_store%u_vec))THEN
00376            DO i = 1,SIZE(mixing_store%u_vec,2)
00377              DO j = 1,SIZE(mixing_store%u_vec,1)
00378                DEALLOCATE(mixing_store%u_vec(j,i)%cc, STAT=stat)
00379                CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00380              END DO
00381            END DO
00382            DEALLOCATE(mixing_store%u_vec,STAT=stat)
00383            CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00384         END IF
00385 
00386         IF (ASSOCIATED(mixing_store%z_vec))THEN
00387            DO i = 1,SIZE(mixing_store%z_vec,2)
00388              DO j = 1,SIZE(mixing_store%z_vec,1)
00389                DEALLOCATE(mixing_store%z_vec(j,i)%cc, STAT=stat)
00390                CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00391              END DO
00392            END DO
00393            DEALLOCATE(mixing_store%z_vec,STAT=stat)
00394            CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00395         END IF
00396 
00397         DEALLOCATE(mixing_store, stat=stat)
00398         CPPostconditionNoFail(stat==0,cp_warning_level,routineP,error)
00399      END IF
00400      NULLIFY(mixing_store)
00401   END IF
00402 
00403  END SUBROUTINE mixing_storage_release
00404 
00405 END MODULE qs_density_mixing_types