Line data Source code
1 : !!****m* ABINIT/m_predict_steepest
2 : !! NAME
3 : !!
4 : !! FUNCTION
5 : !!
6 : !! COPYRIGHT
7 : !! Copyright (C) 2009-2026 ABINIT group (XG)
8 : !! This file is distributed under the terms of the
9 : !! GNU General Public License, see ~abinit/COPYING
10 : !! or http://www.gnu.org/copyleft/gpl.txt .
11 : !!
12 : !! SOURCE
13 :
14 : #if defined HAVE_CONFIG_H
15 : #include "config.h"
16 : #endif
17 :
18 : #include "abi_common.h"
19 :
20 : module m_predict_steepest
21 :
22 : use defs_basis
23 : use m_abicore
24 : use m_mep
25 :
26 : use m_results_img, only : results_img_type,get_geometry_img
27 :
28 : implicit none
29 :
30 : private
31 : !!***
32 :
33 : public :: predict_steepest
34 : !!***
35 :
36 : contains
37 : !!***
38 :
39 : !!****f* ABINIT/predict_steepest
40 : !! NAME
41 : !! predict_steepest
42 : !!
43 : !! FUNCTION
44 : !! Given the past history of images, predict the new set of images.
45 : !! Here, simple steepest descent algorithm, based on the value of the forces on the current timimage step.
46 : !! No change of acell, rprim and vel at present.
47 : !!
48 : !! INPUTS
49 : !! itimimage=time index for image propagation (itimimage+1 is to be predicted here)
50 : !! itimimage_eff=time index in the history
51 : !! list_dynimage(nimage)=list of dynamical images. The non-dynamical ones will not change.
52 : !! Example : in the NEB of string method, one expect the two end images to be fixed.
53 : !! mep_param=several parameters for Minimal Energy Path (MEP) search
54 : !! natom=dimension of vel_timimage and xred_timimage
55 : !! ndynimage=number of dynamical images
56 : !! nimage=number of images
57 : !! ntimimage_stored=number of time steps stored in the history
58 : !!
59 : !! OUTPUT
60 : !!
61 : !! SIDE EFFECTS
62 : !! results_img(ntimimage_stored,nimage)=datastructure that holds the history of previous computations.
63 : !! results_img(:,:)%acell(3)
64 : !! at input, history of the values of acell for all images
65 : !! at output, the predicted values of acell for all images
66 : !! results_img(:,:)%results_gs
67 : !! at input, history of the values of energies and forces for all images
68 : !! results_img(:,:)%rprim(3,3)
69 : !! at input, history of the values of rprim for all images
70 : !! at output, the predicted values of rprim for all images
71 : !! results_img(:,:)%vel(3,natom)
72 : !! at input, history of the values of vel for all images
73 : !! at output, the predicted values of vel for all images
74 : !! results_img(:,:)%vel_cell(3,3)
75 : !! at input, history of the values of vel_cell for all images
76 : !! at output, the predicted values of vel_cell for all images
77 : !! results_img(:,:)%xred(3,natom)
78 : !! at input, history of the values of xred for all images
79 : !! at output, the predicted values of xred for all images
80 : !!
81 : !! SOURCE
82 :
83 10 : subroutine predict_steepest(itimimage,itimimage_eff,list_dynimage,mep_param,natom,&
84 10 : & ndynimage,nimage,ntimimage_stored,results_img)
85 :
86 : !Arguments ------------------------------------
87 : !scalars
88 : integer,intent(in) :: itimimage,itimimage_eff,natom,ndynimage
89 : integer,intent(in) :: nimage,ntimimage_stored
90 : type(mep_type),intent(inout) :: mep_param
91 : !arrays
92 : integer,intent(in) :: list_dynimage(ndynimage)
93 : type(results_img_type) :: results_img(nimage,ntimimage_stored)
94 :
95 : !Local variables-------------------------------
96 : !scalars
97 : integer :: iimage,next_itimimage
98 : !arrays
99 10 : real(dp),allocatable :: etotal(:),fcart(:,:,:),rprimd(:,:,:),xcart(:,:,:),xred(:,:,:)
100 10 : real(dp),allocatable :: strten(:,:)
101 :
102 : ! *************************************************************************
103 :
104 : !Retrieve positions and forces
105 30 : ABI_MALLOC(etotal,(nimage))
106 40 : ABI_MALLOC(xred,(3,natom,nimage))
107 30 : ABI_MALLOC(xcart,(3,natom,nimage))
108 30 : ABI_MALLOC(fcart,(3,natom,nimage))
109 30 : ABI_MALLOC(rprimd,(3,3,nimage))
110 30 : ABI_MALLOC(strten,(6,nimage))
111 :
112 : call get_geometry_img(results_img(:,itimimage_eff),etotal,natom,nimage,&
113 10 : & fcart,rprimd,strten,xcart,xred)
114 :
115 : !Compute new atomic positions in each cell
116 10 : call mep_steepest(fcart,list_dynimage,mep_param,natom,natom,ndynimage,nimage,rprimd,xcart,xred)
117 :
118 : !Store acell, rprim, xred and vel for the new iteration
119 10 : next_itimimage=itimimage+1
120 10 : if (next_itimimage>ntimimage_stored) next_itimimage=1
121 70 : do iimage=1,nimage
122 540 : results_img(iimage,next_itimimage)%xred(:,:) =xred(:,:,iimage)
123 240 : results_img(iimage,next_itimimage)%acell(:) =results_img(iimage,itimimage_eff)%acell(:)
124 780 : results_img(iimage,next_itimimage)%rprim(:,:) =results_img(iimage,itimimage_eff)%rprim(:,:)
125 540 : results_img(iimage,next_itimimage)%vel(:,:) =results_img(iimage,itimimage_eff)%vel(:,:)
126 790 : results_img(iimage,next_itimimage)%vel_cell(:,:)=results_img(iimage,itimimage_eff)%vel_cell(:,:)
127 : end do
128 :
129 10 : ABI_FREE(etotal)
130 10 : ABI_FREE(xred)
131 10 : ABI_FREE(xcart)
132 10 : ABI_FREE(fcart)
133 10 : ABI_FREE(rprimd)
134 10 : ABI_FREE(strten)
135 :
136 10 : end subroutine predict_steepest
137 : !!***
138 :
139 : end module m_predict_steepest
140 : !!***
|