Branch data Line data Source code
1 : : !!****m* ABINIT/m_precpred_1geo
2 : : !! NAME
3 : : !! m_precpred_1geo
4 : : !!
5 : : !! FUNCTION
6 : : !! Single geometry: apply force and stress preconditioner followed by geometry predictor.
7 : : !! Choose among the whole set of geometry predictors defined by iommov.
8 : : !!
9 : : !! COPYRIGHT
10 : : !! Copyright (C) 2018-2026 ABINIT group (DCA, XG, GMR, SE)
11 : : !! This file is distributed under the terms of the
12 : : !! GNU General Public License, see ~abinit/COPYING
13 : : !! or http://www.gnu.org/copyleft/gpl.txt .
14 : : !!
15 : : !! SOURCE
16 : :
17 : : #if defined HAVE_CONFIG_H
18 : : #include "config.h"
19 : : #endif
20 : :
21 : : #include "abi_common.h"
22 : :
23 : : module m_precpred_1geo
24 : :
25 : : use defs_basis
26 : : use m_errors
27 : : use m_abicore
28 : : use m_abimover
29 : : use m_abihist
30 : : use m_xmpi
31 : : use m_nctk
32 : : use m_pimd
33 : : use netcdf
34 : : #if defined HAVE_LOTF
35 : : use lotfpath
36 : : use m_pred_lotf
37 : : #endif
38 : :
39 : : use m_fstrings, only : strcat, sjoin, itoa
40 : : use m_geometry, only : chkdilatmx
41 : : use m_crystal, only : crystal_t
42 : : use m_pred_bfgs, only : pred_bfgs, pred_lbfgs
43 : : use m_pred_delocint, only : pred_delocint
44 : : use m_pred_fire, only : pred_fire
45 : : use m_pred_isokinetic, only : pred_isokinetic
46 : : use m_pred_diisrelax, only : pred_diisrelax
47 : : use m_pred_nose, only : pred_nose
48 : : use m_pred_srkhna14, only : pred_srkna14
49 : : use m_pred_isothermal, only : pred_isothermal
50 : : use m_pred_verlet, only : pred_verlet
51 : : use m_pred_velverlet, only : pred_velverlet
52 : : use m_pred_moldyn, only : pred_moldyn
53 : : use m_pred_langevin, only : pred_langevin
54 : : use m_pred_langevin_pimd, only : pred_langevin_pimd
55 : : use m_pred_steepdesc, only : pred_steepdesc
56 : : use m_pred_simple, only : pred_simple, prec_simple
57 : : use m_pred_hmc, only : pred_hmc
58 : : use m_ipi, only : ipi_pred
59 : : !use m_generate_training_set, only : generate_training_set
60 : :
61 : : implicit none
62 : :
63 : : private
64 : : !!***
65 : :
66 : : public :: precpred_1geo
67 : : !!***
68 : :
69 : : contains
70 : : !!***
71 : :
72 : : !!****f* ABINIT/precpred_1geo
73 : : !! NAME
74 : : !! mover
75 : : !!
76 : : !! FUNCTION
77 : : !! Single geometry: apply force and stress preconditioner followed by geometry predictor.
78 : : !! Choose among the whole set of geometry predictors defined by ionmov.
79 : : !!
80 : : !! INPUTS
81 : : !! (TO BE DESCRIBED)
82 : : !!
83 : : !! OUTPUT
84 : : !! (TO BE DESCRIBED)
85 : : !!
86 : : !! SIDE EFFECTS
87 : : !! hist is the main quantity updated, contains xred, rprimd and acell.
88 : : !! (TO BE DESCRIBED)
89 : : !!
90 : : !! NOTES
91 : : !!
92 : : !! SOURCE
93 : :
94 : 11526 : subroutine precpred_1geo(ab_mover,ab_xfh,amu_curr,deloc,dt_chkdilatmx,comm_cell,dilatmx,filnam_ds4,hist,hmctt,&
95 : : & icycle,iexit,itime,mttk_vars,nctime,ncycle,nerr_dilatmx,npsp,ntime,pimd_param,rprimd_orig,skipcycle,usewvl)
96 : :
97 : : !Arguments ------------------------------------
98 : : !scalars
99 : : integer, intent(in) :: comm_cell,dt_chkdilatmx,hmctt,icycle,itime,nctime,npsp,ntime
100 : : integer, intent(inout) :: iexit,ncycle,nerr_dilatmx
101 : : integer, intent(in) :: usewvl
102 : : real(dp), intent(in) :: dilatmx
103 : : logical, intent(inout) :: skipcycle
104 : : character(len=fnlen), intent(in) :: filnam_ds4
105 : : type(ab_xfh_type),intent(inout) :: ab_xfh
106 : : type(abihist), intent(inout) :: hist
107 : : type(abimover), intent(in) :: ab_mover
108 : : type(delocint), intent(inout) :: deloc
109 : : type(mttk_type), intent(inout) :: mttk_vars
110 : : type(pimd_type), intent(in) :: pimd_param
111 : : !arrays
112 : : real(dp), intent(in) :: amu_curr(ab_mover%ntypat)
113 : : real(dp), intent(in) :: rprimd_orig(3,3)
114 : :
115 : : !Local variables-------------------------------
116 : : !scalars
117 : : integer,parameter :: master=0
118 : : integer :: ii,me,nloop
119 : : !integer :: iatom
120 : : logical,parameter :: DEBUG=.FALSE.
121 : : !character(len=500) :: message
122 : : character(len=500) :: dilatmx_errmsg
123 : : character(len=fnlen) :: filename
124 : 11526 : type(abiforstr) :: preconforstr ! Preconditioned forces and stress
125 [ + + + + : 599352 : type(crystal_t) :: crystal
+ + + + +
+ + + + +
+ + + + ]
126 : : !arrays
127 : : real(dp) :: acell(3),rprimd(3,3)
128 : 11526 : real(dp), allocatable :: xred(:,:)
129 : :
130 : : ! ***************************************************************
131 : :
132 : : !DEBUG
133 : : !write(std_out,'(a,i4)')' m_precpred_1geo, enter : ab_mover%ionmov=',ab_mover%ionmov
134 : : !ABI_MALLOC(xred,(3,ab_mover%natom))
135 : : !call hist2var(acell,hist,ab_mover%natom,rprimd,xred,DEBUG)
136 : : !do iatom=1,ab_mover%natom
137 : : ! write(std_out,'(i4,3es14.6)') iatom,xred(1:3,iatom)
138 : : !enddo
139 : : !ABI_FREE(xred)
140 : : !ENDDEBUG
141 : :
142 : 11526 : me=xmpi_comm_rank(comm_cell)
143 : :
144 : : !Precondition forces, stress and energy
145 : 11526 : call abiforstr_ini(preconforstr,ab_mover%natom)
146 : :
147 [ + + + + ]: 11526 : if (ab_mover%goprecon>0 .or. iexit==1)then
148 : 434 : call prec_simple(ab_mover,preconforstr,hist,icycle,itime,iexit)
149 : : end if
150 : :
151 : : !Call to each predictor
152 : : !MT->GAF: dirty trick to predict vel(t)
153 : : !do a double loop: 1- compute vel, 2- exit
154 : 11526 : nloop=1
155 : :
156 [ + + + + ]: 11526 : if (nctime>0.and.iexit==1) then
157 : 52 : iexit=0;nloop=2
158 : : end if
159 : :
160 [ + + ]: 23104 : do ii=1,nloop
161 [ + + ]: 11578 : if (ii==2) iexit=1
162 : :
163 : 11526 : select case (ab_mover%ionmov)
164 : : case (1)
165 : 73 : call pred_moldyn(ab_mover,hist,icycle,itime,ncycle,ntime,DEBUG,iexit)
166 : : case (2,3)
167 : 1244 : call pred_bfgs(ab_mover,ab_xfh,preconforstr,hist,ab_mover%ionmov,itime,DEBUG,iexit)
168 : : case (4,5)
169 : 35 : call pred_simple(ab_mover,hist,iexit)
170 : : case (6,7)
171 : 53 : call pred_verlet(ab_mover,hist,ab_mover%ionmov,itime,ntime,DEBUG,iexit)
172 : : case (8)
173 : 20 : call pred_nose(ab_mover,hist,itime,ntime,DEBUG,iexit)
174 : : case (9)
175 : 20 : call pred_langevin(ab_mover,hist,icycle,itime,ncycle,ntime,DEBUG,iexit,skipcycle)
176 : : case (10,11)
177 : 2 : call pred_delocint(ab_mover,ab_xfh,deloc,preconforstr,hist,ab_mover%ionmov,itime,DEBUG,iexit)
178 : : case (12)
179 : 978 : call pred_isokinetic(ab_mover,hist,itime,ntime,DEBUG,iexit)
180 : : case (13)
181 : 1079 : call pred_isothermal(ab_mover,hist,itime,mttk_vars,ntime,DEBUG,iexit)
182 : : case (14)
183 : 16 : call pred_srkna14(ab_mover,hist,icycle,DEBUG,iexit,skipcycle)
184 : : case (15)
185 : 12 : call pred_fire(ab_mover, ab_xfh,preconforstr,hist,ab_mover%ionmov,itime,DEBUG,iexit)
186 : : case (16)
187 : 10 : call pred_langevin_pimd(ab_mover,hist,itime,DEBUG,pimd_param)
188 : : case (20)
189 : 0 : call pred_diisrelax(ab_mover,hist,itime,ntime,DEBUG,iexit)
190 : : case (21)
191 : 0 : call pred_steepdesc(ab_mover,preconforstr,hist,itime,DEBUG,iexit)
192 : : case (22)
193 : 12 : call pred_lbfgs(ab_mover,ab_xfh,preconforstr,hist,ab_mover%ionmov,itime,DEBUG,iexit)
194 : : #if defined HAVE_LOTF
195 : : case (23)
196 : : call pred_lotf(ab_mover,hist,itime,icycle,DEBUG,iexit)
197 : : #endif
198 : : case (24)
199 : 10 : call pred_velverlet(ab_mover,hist,itime,ntime,DEBUG,iexit)
200 : : case (25)
201 : 8014 : call pred_hmc(ab_mover,hist,itime,icycle,ntime,hmctt,mttk_vars,DEBUG,iexit)
202 : : case (27)
203 : : !In case of ionmov 27, all the atomic configurations have been computed at the
204 : : !beginning of the routine in generate_training_set, thus we just need to increase the indexes
205 : : !in the hist
206 : 0 : hist%ihist = abihist_findIndex(hist,+1)
207 : : case (28)
208 : 0 : call ipi_pred(ab_mover, hist, itime, ntime, DEBUG, iexit, comm_cell)
209 : : case default
210 [ + + + + : 11578 : ABI_ERROR(sjoin("Wrong value of ionmov:", itoa(ab_mover%ionmov)))
+ + + + +
+ + + - -
+ + + - -
- ]
211 : : end select
212 : :
213 : : end do
214 : :
215 [ - + + - : 34578 : ABI_MALLOC(xred,(3,ab_mover%natom))
+ - + - -
+ - + ]
216 : 11526 : call hist2var(acell,hist,ab_mover%natom,rprimd,xred,DEBUG)
217 : :
218 : : ! check dilatmx here and correct if necessary
219 [ + - ]: 11526 : if (usewvl == 0) then
220 : 11526 : call chkdilatmx(dt_chkdilatmx,dilatmx,rprimd,rprimd_orig,dilatmx_errmsg)
221 [ + + ]: 11526 : if (LEN_TRIM(dilatmx_errmsg) /= 0) then
222 : 17 : ABI_WARNING(dilatmx_errmsg)
223 : 17 : nerr_dilatmx = nerr_dilatmx+1
224 [ - + ]: 17 : if (nerr_dilatmx > 3) then
225 : : ! Write last structure before aborting, so that we can restart from it.
226 : : ! zion is not available, but it's not useful here.
227 [ # # ]: 0 : if (me == master) then
228 : : ! Init crystal
229 : 0 : hist%ihist = abihist_findIndex(hist,-1)
230 : 0 : call hist2var(acell,hist,ab_mover%natom,rprimd,xred,DEBUG)
231 : : call crystal%init(amu_curr,0,ab_mover%natom,&
232 : : npsp,ab_mover%ntypat,ab_mover%nsym,rprimd,ab_mover%typat,xred,&
233 : : [(-one, ii=1,ab_mover%ntypat)],ab_mover%znucl,2,.False.,.False.,"dilatmx_structure",&
234 [ # # # # : 0 : symrel=ab_mover%symrel,tnons=ab_mover%tnons,symafm=ab_mover%symafm)
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # #
# ]
235 : :
236 : : ! Write netcdf file
237 [ # # ]: 0 : filename = strcat(filnam_ds4, "_DILATMX_STRUCT.nc")
238 [ # # ]: 0 : NCF_CHECK(crystal%ncwrite_path(filename))
239 : 0 : call crystal%free()
240 : : end if
241 : 0 : call xmpi_barrier(comm_cell)
242 : : write (dilatmx_errmsg, '(a,i0,9a)') &
243 : 0 : 'Dilatmx has been exceeded too many times (', nerr_dilatmx, ')',ch10, &
244 : 0 : 'See the description of dilatmx and chkdilatmx input variables.',ch10, &
245 : 0 : 'Action: either first do a calculation with chkdilatmx=0, or ',ch10,&
246 : 0 : 'restart your calculation with a larger dilatmx, or larger lattice vectors.',ch10,&
247 : 0 : 'Warning: With chkdilatmx = 0 the final computation of lattice parameters might be inaccurate.'
248 : 0 : ABI_ERROR_CLASS(dilatmx_errmsg, "DilatmxError")
249 : : end if
250 : : else
251 : 11509 : nerr_dilatmx=0
252 : : end if
253 : : end if
254 : :
255 : : !DEBUG
256 : : !write(std_out,'(a,i4)')' m_precpred_1geo, exit '
257 : : !do iatom=1,ab_mover%natom
258 : : ! write(std_out,'(i4,3es14.6)') iatom,xred(1:3,iatom)
259 : : !enddo
260 : : !ENDDEBUG
261 : :
262 : 11526 : call abiforstr_fin(preconforstr)
263 [ - + ]: 11526 : ABI_FREE(xred)
264 : :
265 [ - + - + : 11526 : end subroutine precpred_1geo
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ ]
266 : : !!***
267 : :
268 : : end module m_precpred_1geo
269 : : !!***
|