mirror of
https://github.com/QuantumPackage/qp2.git
synced 2024-09-01 21:53:40 +02:00
init commit mo_localization
This commit is contained in:
parent
25c868f7dc
commit
833999dfbb
2
src/mo_localization/NEED
Normal file
2
src/mo_localization/NEED
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
hartree_fock
|
||||||
|
utils_trust_region
|
94
src/mo_localization/README.md
Normal file
94
src/mo_localization/README.md
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
Please, use the ifort compiler
|
||||||
|
|
||||||
|
Some parameters can be changed with qp edit in the utils_trust_region section
|
||||||
|
|
||||||
|
If you modify the .org files, don't forget to do (you need emacs):
|
||||||
|
```
|
||||||
|
./TANGLE_org_mode.sh
|
||||||
|
ninja
|
||||||
|
```
|
||||||
|
|
||||||
|
The documentation can be read using:
|
||||||
|
Ctrl-C Ctrl-e l p
|
||||||
|
after opening the filename.org in emacs. It will produce a
|
||||||
|
filename.pdf.
|
||||||
|
(Not available for all the files)
|
||||||
|
!!! Warning: the documentation can contain some errors !!!
|
||||||
|
|
||||||
|
# Orbital localisation
|
||||||
|
To localize the MOs:
|
||||||
|
```
|
||||||
|
qp run localization
|
||||||
|
```
|
||||||
|
After that the ezfio directory contains the localized MOs
|
||||||
|
|
||||||
|
But the mo_class must be defined before, run
|
||||||
|
```
|
||||||
|
qp set_mo_class -q
|
||||||
|
```
|
||||||
|
for more information or
|
||||||
|
```
|
||||||
|
qp set_mo_class -c [] -a [] -v [] -i [] -d []
|
||||||
|
```
|
||||||
|
to set the mo classes. We don't care about the name of the
|
||||||
|
mo classes. The algorithm just localizes all the MOs of
|
||||||
|
a given class between them, for all the classes, except the deleted MOs.
|
||||||
|
|
||||||
|
If you just on kind of mo class to localize all the MOs between them
|
||||||
|
you have to put:
|
||||||
|
```
|
||||||
|
qp set mo_localization security_mo_class false
|
||||||
|
```
|
||||||
|
|
||||||
|
Before the localization, a kick is done for each mo class
|
||||||
|
(except the deleted ones) to break the MOs. This is done by
|
||||||
|
doing a given rotation between the MOs.
|
||||||
|
This feature can be removed by setting:
|
||||||
|
```
|
||||||
|
qp set mo_localization kick_in_mos false
|
||||||
|
```
|
||||||
|
and the default angle for the rotation can be changed with:
|
||||||
|
```
|
||||||
|
qp set mo_localization angle_pre_rot 1e-3 # or something else
|
||||||
|
```
|
||||||
|
|
||||||
|
After the localization, the MOs of each class (except the deleted ones)
|
||||||
|
can be sorted between them using the diagonal elements of
|
||||||
|
the fock matrix with:
|
||||||
|
```
|
||||||
|
qp set mo_localization sort_mos_by_e true
|
||||||
|
```
|
||||||
|
|
||||||
|
You can check the Hartree-Fock energy before/during/after the localization
|
||||||
|
by putting (only for debugging):
|
||||||
|
```
|
||||||
|
qp set mo_localization debug_hf true
|
||||||
|
```
|
||||||
|
|
||||||
|
## Foster-Boys & Pipek-Mezey
|
||||||
|
Foster-Boys:
|
||||||
|
```
|
||||||
|
qp set mo_localization localization_method boys
|
||||||
|
```
|
||||||
|
|
||||||
|
Pipek-Mezey:
|
||||||
|
```
|
||||||
|
qp set mo_localization localization_method pipek
|
||||||
|
```
|
||||||
|
|
||||||
|
# Break the spatial symmetry of the MOs
|
||||||
|
To break the spatial symmetry of the MOs:
|
||||||
|
```
|
||||||
|
qp run break_spatial_sym
|
||||||
|
```
|
||||||
|
The default angle for the rotations is too big for this kind of
|
||||||
|
application, a value between 1e-3 and 1e-6 should break the spatial
|
||||||
|
symmetry with just a small change in the energy:
|
||||||
|
```
|
||||||
|
qp set mo_localization angle_pre_rot 1e-3
|
||||||
|
```
|
||||||
|
|
||||||
|
# Further improvements:
|
||||||
|
- Cleaner repo
|
||||||
|
- Correction of the errors in the documentations
|
||||||
|
- option with/without trust region
|
7
src/mo_localization/TANGLE_org_mode.sh
Executable file
7
src/mo_localization/TANGLE_org_mode.sh
Executable file
@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
list='ls *.org'
|
||||||
|
for element in $list
|
||||||
|
do
|
||||||
|
emacs --batch $element -f org-babel-tangle
|
||||||
|
done
|
43
src/mo_localization/break_spatial_sym.org
Normal file
43
src/mo_localization/break_spatial_sym.org
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
! A small program to break the spatial symmetry of the MOs.
|
||||||
|
|
||||||
|
! You have to defined your MO classes or set security_mo_class to false
|
||||||
|
! with:
|
||||||
|
! qp set orbital_optimization security_mo_class false
|
||||||
|
|
||||||
|
! The default angle for the rotations is too big for this kind of
|
||||||
|
! application, a value between 1e-3 and 1e-6 should break the spatial
|
||||||
|
! symmetry with just a small change in the energy.
|
||||||
|
|
||||||
|
#+BEGIN_SRC f90 :comments org :tangle break_spatial_sym.irp.f
|
||||||
|
program break_spatial_sym
|
||||||
|
|
||||||
|
!BEGIN_DOC
|
||||||
|
! Break the symmetry of the MOs with a rotation
|
||||||
|
!END_DOC
|
||||||
|
|
||||||
|
implicit none
|
||||||
|
|
||||||
|
kick_in_mos = .True.
|
||||||
|
TOUCH kick_in_mos
|
||||||
|
|
||||||
|
print*, 'Security mo_class:', security_mo_class
|
||||||
|
|
||||||
|
! The default mo_classes are setted only if the MOs to localize are not specified
|
||||||
|
if (security_mo_class .and. (dim_list_act_orb == mo_num .or. &
|
||||||
|
dim_list_core_orb + dim_list_act_orb == mo_num)) then
|
||||||
|
|
||||||
|
print*, 'WARNING'
|
||||||
|
print*, 'You must set different mo_class with qp set_mo_class'
|
||||||
|
print*, 'If you want to kick all the orbitals:'
|
||||||
|
print*, 'qp set orbital_optimization security_mo_class false'
|
||||||
|
print*, ''
|
||||||
|
print*, 'abort'
|
||||||
|
|
||||||
|
call abort
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
|
call apply_pre_rotation
|
||||||
|
|
||||||
|
end
|
||||||
|
#+END_SRC
|
64
src/mo_localization/debug_gradient_loc.org
Normal file
64
src/mo_localization/debug_gradient_loc.org
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
#+BEGIN_SRC f90 :comments org :tangle debug_gradient_loc.irp.f
|
||||||
|
program debug_gradient_loc
|
||||||
|
|
||||||
|
!BEGIN_DOC
|
||||||
|
! Check if the gradient is correct
|
||||||
|
!END_DOC
|
||||||
|
|
||||||
|
implicit none
|
||||||
|
|
||||||
|
integer :: list_size, n
|
||||||
|
integer, allocatable :: list(:)
|
||||||
|
double precision, allocatable :: v_grad(:), v_grad2(:)
|
||||||
|
double precision :: norm, max_elem, threshold, max_error
|
||||||
|
integer :: i, nb_error
|
||||||
|
|
||||||
|
threshold = 1d-12
|
||||||
|
|
||||||
|
list = list_act
|
||||||
|
list_size = dim_list_act_orb
|
||||||
|
|
||||||
|
n = list_size*(list_size-1)/2
|
||||||
|
|
||||||
|
allocate(v_grad(n),v_grad2(n))
|
||||||
|
|
||||||
|
if (localization_method == 'boys') then
|
||||||
|
print*,'Foster-Boys'
|
||||||
|
call gradient_FB(n,list_size,list,v_grad,max_elem,norm)
|
||||||
|
call gradient_FB_omp(n,list_size,list,v_grad2,max_elem,norm)
|
||||||
|
elseif (localization_method == 'pipek') then
|
||||||
|
print*,'Pipek-Mezey'
|
||||||
|
call gradient_PM(n,list_size,list,v_grad,max_elem,norm)
|
||||||
|
call gradient_PM(n,list_size,list,v_grad2,max_elem,norm)
|
||||||
|
else
|
||||||
|
print*,'Unknown localization_method, please select boys or pipek'
|
||||||
|
call abort
|
||||||
|
endif
|
||||||
|
|
||||||
|
do i = 1, n
|
||||||
|
print*,i,v_grad(i)
|
||||||
|
enddo
|
||||||
|
|
||||||
|
v_grad = v_grad - v_grad2
|
||||||
|
|
||||||
|
nb_error = 0
|
||||||
|
max_elem = 0d0
|
||||||
|
|
||||||
|
do i = 1, n
|
||||||
|
if (dabs(v_grad(i)) > threshold) then
|
||||||
|
print*,v_grad(i)
|
||||||
|
nb_error = nb_error + 1
|
||||||
|
if (dabs(v_grad(i)) > max_elem) then
|
||||||
|
max_elem = v_grad(i)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
enddo
|
||||||
|
|
||||||
|
print*,'Threshold error', threshold
|
||||||
|
print*, 'Nb error', nb_error
|
||||||
|
print*,'Max error', max_elem
|
||||||
|
|
||||||
|
deallocate(v_grad,v_grad2)
|
||||||
|
|
||||||
|
end
|
||||||
|
#+END_SRC
|
64
src/mo_localization/debug_hessian_loc.org
Normal file
64
src/mo_localization/debug_hessian_loc.org
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
#+BEGIN_SRC f90 :comments org :tangle debug_hessian_loc.irp.f
|
||||||
|
program debug_hessian_loc
|
||||||
|
|
||||||
|
!BEGIN_DOC
|
||||||
|
! Check if the hessian is correct
|
||||||
|
!END_DOC
|
||||||
|
|
||||||
|
implicit none
|
||||||
|
|
||||||
|
integer :: list_size, n
|
||||||
|
integer, allocatable :: list(:)
|
||||||
|
double precision, allocatable :: H(:,:), H2(:,:)
|
||||||
|
double precision :: threshold, max_error, max_elem
|
||||||
|
integer :: i, nb_error
|
||||||
|
|
||||||
|
threshold = 1d-12
|
||||||
|
|
||||||
|
list = list_act
|
||||||
|
list_size = dim_list_act_orb
|
||||||
|
|
||||||
|
n = list_size*(list_size-1)/2
|
||||||
|
|
||||||
|
allocate(H(n,n),H2(n,n))
|
||||||
|
|
||||||
|
if (localization_method == 'boys') then
|
||||||
|
print*,'Foster-Boys'
|
||||||
|
call hessian_FB(n,list_size,list,H)
|
||||||
|
call hessian_FB_omp(n,list_size,list,H2)
|
||||||
|
elseif(localization_method == 'pipek') then
|
||||||
|
print*,'Pipek-Mezey'
|
||||||
|
call hessian_PM(n,list_size,list,H)
|
||||||
|
call hessian_PM(n,list_size,list,H2)
|
||||||
|
else
|
||||||
|
print*,'Unknown localization_method, please select boys or pipek'
|
||||||
|
call abort
|
||||||
|
endif
|
||||||
|
|
||||||
|
do i = 1, n
|
||||||
|
print*,i,H(i,i)
|
||||||
|
enddo
|
||||||
|
|
||||||
|
H = H - H2
|
||||||
|
|
||||||
|
nb_error = 0
|
||||||
|
max_elem = 0d0
|
||||||
|
|
||||||
|
do i = 1, n
|
||||||
|
if (dabs(H(i,i)) > threshold) then
|
||||||
|
print*,H(i,i)
|
||||||
|
nb_error = nb_error + 1
|
||||||
|
if (dabs(H(i,i)) > max_elem) then
|
||||||
|
max_elem = H(i,i)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
enddo
|
||||||
|
|
||||||
|
print*,'Threshold error', threshold
|
||||||
|
print*, 'Nb error', nb_error
|
||||||
|
print*,'Max error', max_elem
|
||||||
|
|
||||||
|
deallocate(H,H2)
|
||||||
|
|
||||||
|
end
|
||||||
|
#+END_SRC
|
33
src/mo_localization/kick_the_mos.org
Normal file
33
src/mo_localization/kick_the_mos.org
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
#+BEGIN_SRC f90 :comments org :tangle kick_the_mos.irp.f
|
||||||
|
program kick_the_mos
|
||||||
|
|
||||||
|
!BEGIN_DOC
|
||||||
|
! To do a small rotation of the MOs
|
||||||
|
!END_DOC
|
||||||
|
|
||||||
|
implicit none
|
||||||
|
|
||||||
|
kick_in_mos = .True.
|
||||||
|
TOUCH kick_in_mos
|
||||||
|
|
||||||
|
print*, 'Security mo_class:', security_mo_class
|
||||||
|
|
||||||
|
! The default mo_classes are setted only if the MOs to localize are not specified
|
||||||
|
if (security_mo_class .and. (dim_list_act_orb == mo_num .or. &
|
||||||
|
dim_list_core_orb + dim_list_act_orb == mo_num)) then
|
||||||
|
|
||||||
|
print*, 'WARNING'
|
||||||
|
print*, 'You must set different mo_class with qp set_mo_class'
|
||||||
|
print*, 'If you want to kick all the orbital:'
|
||||||
|
print*, 'qp set Orbital_optimization security_mo_class false'
|
||||||
|
print*, ''
|
||||||
|
print*, 'abort'
|
||||||
|
|
||||||
|
call abort
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
|
call apply_pre_rotation
|
||||||
|
|
||||||
|
end
|
||||||
|
#+END_SRC
|
2460
src/mo_localization/localization.org
Normal file
2460
src/mo_localization/localization.org
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user