Branch data Line data Source code
1 : : !!****m* ABINIT/m_mover_effpot
2 : : !! NAME
3 : : !! m_mover_effpot
4 : : !!
5 : : !! FUNCTION
6 : : !!
7 : : !! COPYRIGHT
8 : : !! Copyright (C) 2008-2026 ABINIT group (AM)
9 : : !! This file is distributed under the terms of the
10 : : !! GNU General Public License, see ~abinit/COPYING
11 : : !! or http://www.gnu.org/copyleft/gpl.txt .
12 : : !!
13 : : !! SOURCE
14 : :
15 : : #if defined HAVE_CONFIG_H
16 : : #include "config.h"
17 : : #endif
18 : :
19 : : #include "abi_common.h"
20 : :
21 : : module m_mover_effpot
22 : :
23 : : use defs_basis
24 : : use m_errors
25 : : use m_abicore
26 : : use m_dtset
27 : : use m_dtfil
28 : : use m_abimover
29 : : use m_scf_history
30 : : use defs_wvltypes
31 : : use m_xmpi
32 : : use m_phonons
33 : : use m_strain
34 : : use m_effective_potential_file
35 : : use m_supercell
36 : : use m_psps
37 : : use m_args_gs
38 : : use m_ifc
39 : : use m_symfind
40 : :
41 : : use defs_datatypes, only : pseudopotential_type
42 : : use defs_abitypes, only : MPI_type
43 : : use m_build_info, only : abinit_version
44 : : use m_geometry, only : xcart2xred, xred2xcart
45 : : use m_multibinit_dataset, only : multibinit_dtset_type
46 : : use m_effective_potential, only : effective_potential_type
47 : : use m_fit_polynomial_coeff, only : polynomial_coeff_writeXML, &
48 : : fit_polynomial_coeff_fit, genereList, fit_polynomial_coeff_getPositive !,fit_polynomial_coeff_getCoeffBound
49 : : use m_polynomial_coeff,only : polynomial_coeff_getNorder
50 : : ! use m_pawang, only : pawang_type, pawang_free
51 : : ! use m_pawrad, only : pawrad_type, pawrad_free
52 : : ! use m_pawtab, only : pawtab_type, pawtab_nullify, pawtab_free
53 : : ! use m_pawxmlps, only : paw_setup, ipsp2xml, rdpawpsxml, &
54 : : !& paw_setup_copy, paw_setup_free, getecutfromxml
55 : : use m_abihist
56 : : use m_ewald
57 : : use m_mpinfo, only : init_mpi_enreg,destroy_mpi_enreg
58 : : use m_copy , only : alloc_copy
59 : : use m_electronpositron, only : electronpositron_type
60 : : use m_scfcv, only : scfcv_t, scfcv_run,scfcv_destroy
61 : : use m_results_gs, only : results_gs_type
62 : : use m_mover, only : mover
63 : : use m_io_tools, only : get_unit, open_file
64 : : use m_matrix, only: matr3inv,mati3inv
65 : : use m_symtk, only: symatm
66 : :
67 : : implicit none
68 : :
69 : : private
70 : : !!***
71 : :
72 : : public :: mover_effpot
73 : : private :: checksymmetrygroup
74 : : !!***
75 : :
76 : : contains
77 : : !!***
78 : :
79 : : !!****f* ABINIT/mover_effpot
80 : : !! NAME
81 : : !! mover_effpot
82 : : !!
83 : : !! FUNCTION
84 : : !! this routine is driver for using mover with effective potential
85 : : !!
86 : : !! INPUTS
87 : : !! inp = input of multibinit
88 : : !! effective_potential = effective potential of the reference structure
89 : : !! option = flag for the option:
90 : : !! -1 = Bound the anharmonic part
91 : : !! 12 = NVT simulation
92 : : !! 13 = NPT simulation
93 : : !! OUTPUT
94 : : !!
95 : : !!
96 : : !! SIDE EFFECTS
97 : : !!
98 : : !! NOTES
99 : : !!
100 : : !!
101 : : !! SOURCE
102 : :
103 : 44 : subroutine mover_effpot(inp,filnam,effective_potential,option,comm,hist)
104 : :
105 : : use m_scup_dataset, only : scup_dtset_type
106 : :
107 : : !Arguments --------------------------------
108 : : !scalar
109 : : integer, intent(in) :: option,comm
110 : : !array
111 : : type(multibinit_dtset_type),intent(inout) :: inp
112 : : type(effective_potential_type),intent(inout) :: effective_potential
113 : : character(len=fnlen),intent(in) :: filnam(15)
114 : : type(abihist),optional,intent(inout):: hist
115 : : !Local variables-------------------------------
116 : : !scalar
117 : : integer :: filetype,icoeff_bound,ii, unit_out,msym,nsym
118 : : !integer :: iexit,initialized
119 : : integer :: jj,kk,nproc,ncoeff,nmodels,ncoeff_bound,ncoeff_bound_tot,ncoeff_max
120 : : integer :: model_bound,model_ncoeffbound,my_rank,ptgroupma,spgroup
121 : : !integer :: mtypalch,,npsp,paw_size,type
122 : : !integer,save :: paw_size_old=-1
123 : : real(dp):: cutoff,freq_q,freq_b,qmass,bmass,tolsym
124 : : ! real(dp):: time_q,time_b
125 : : logical :: iam_master,isVused,isARused,readOnlyLast
126 : : integer, parameter:: master=0
127 : : logical :: verbose,writeHIST,file_opened
128 : : !type
129 : 44 : type(scup_dtset_type) :: scup_inp
130 : : !real(dp) :: cpui
131 : : !character(len=8) :: codvsn
132 : :
133 : : !TEST_AM
134 : : ! integer :: ia,mu,rand_seed = 5
135 : : ! real(dp):: mass_ia,rescale_vel,sum_mass,v2gauss
136 : : !TEST_AM
137 : : ! Set array dimensions
138 : : character(len=500) :: message
139 : 44 : type(MPI_type),target :: mpi_enreg
140 [ + + + + : 5632 : type(dataset_type),target :: dtset
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + +
+ ]
141 : 44 : type(scfcv_t) :: scfcv_args
142 : : type(datafiles_type),target :: dtfil
143 : : integer,target :: zero_integer
144 : 44 : type(ab_xfh_type) :: ab_xfh
145 : 44 : type(results_gs_type),target :: results_gs
146 : 44 : type(pseudopotential_type),target :: psps
147 : : !arrays
148 : : !no_abirules
149 : : integer :: sc_size(3),sc_size_TS(3)
150 : 44 : integer,pointer :: indsym(:,:,:)
151 : 44 : integer,allocatable :: listcoeff(:),listcoeff_bound(:,:),list_tmp(:),list_bound(:,:)
152 : 44 : integer,allocatable :: isPositive(:)
153 : 44 : integer,allocatable :: symrel(:,:,:),symrec(:,:,:)
154 : : !integer,allocatable :: npwtot(:)
155 : : real(dp) :: acell(3)
156 : : !real(dp) :: ecut_tmp(3,2,10)
157 : 44 : real(dp),allocatable :: coeff_values(:,:)
158 : 44 : real(dp),pointer :: rhog(:,:),rhor(:,:)
159 : 44 : real(dp),allocatable :: tnons(:,:)
160 : 44 : real(dp),allocatable :: xred(:,:),xred_old(:,:),xcart(:,:)
161 : 44 : real(dp),allocatable :: gred(:,:),fcart(:,:)
162 : 44 : real(dp),allocatable :: vel(:,:)
163 : : real(dp) :: vel_cell(3,3),rprimd(3,3)
164 : : !real(dp) :: efield(3)
165 : 44 : type(polynomial_coeff_type),dimension(:),allocatable :: coeffs_all,coeffs_tmp,coeffs_bound
166 : : character(len=fnlen) :: filename,md_hist_name
167 : : character(len=fnlen) :: name_file
168 : : !character(len=fnlen) :: filename_psp(3)
169 : : type(electronpositron_type),pointer :: electronpositron
170 : : ! type(pspheader_type),allocatable :: pspheads(:)
171 : : ! type(pawrad_type),allocatable :: pawrad(:)
172 : : ! type(pawtab_type),allocatable :: pawtab(:)
173 : : ! type(args_gs_type) :: args_gs
174 : : !type(wvl_data) :: wvl
175 : : !type(pawang_type) :: pawang
176 : : !type(scf_history_type) :: scf_history
177 : 44 : type(abihist) :: hist_tmp
178 : :
179 : :
180 : : !******************************************************************
181 : :
182 : : !MPI variables
183 : 44 : nproc = xmpi_comm_size(comm); my_rank = xmpi_comm_rank(comm)
184 : 44 : iam_master = (my_rank == master)
185 : :
186 : 44 : write(message, '(a,(80a),a)') ch10,&
187 [ + - + + ]: 3608 : & ('=',ii=1,80),ch10
188 : 44 : call wrtout(ab_out,message,'COLL')
189 : 44 : call wrtout(std_out,message,'COLL')
190 : :
191 : : !*******************************************************************
192 : : ! 1 Generate and check supercell for the dynamics
193 : : !*******************************************************************
194 : :
195 : : !a new supercell is compute
196 : : !Initialisaton of variable
197 [ - + ]: 44 : if(option == -1.or.option == -2) then
198 : : ! Bound process option
199 [ # # ]: 0 : sc_size(:) = inp%bound_cell
200 [ - + ]: 44 : else if(option == -3) then
201 : : ! Heff option
202 : 0 : sc_size(:) = (/1,1,1/)
203 : : else
204 : : ! Normal dynamics
205 [ + + ]: 176 : sc_size(:) = inp%ncell
206 : : end if
207 : :
208 [ + - ]: 44 : if(option/=0)then
209 : :
210 : : ! acell is always set to one, only rprimd is used for the effective potential
211 [ + + ]: 176 : acell = one
212 [ + + + + ]: 572 : rprimd = effective_potential%crystal%rprimd
213 : :
214 [ - + + - : 132 : ABI_MALLOC(xred,(3,effective_potential%crystal%natom))
+ - + - -
+ - + ]
215 [ - + + - : 88 : ABI_MALLOC(xcart,(3,effective_potential%crystal%natom))
- + - + ]
216 : :
217 : : ! convert new xcart
218 : : call xcart2xred(effective_potential%crystal%natom,effective_potential%crystal%rprimd,&
219 : 44 : & effective_potential%crystal%xcart,xred)
220 : 44 : call xred2xcart(effective_potential%crystal%natom, rprimd, xcart, xred)
221 : : ! Generate supercell for the simulation
222 : 44 : call effective_potential_setSupercell(effective_potential,comm,ncell=sc_size)
223 : :
224 [ - + ]: 44 : ABI_FREE(xred)
225 [ - + ]: 44 : ABI_FREE(xcart)
226 : :
227 : : !***************************************************************
228 : : !1 Convert some parameters into the structures used by mover.F90
229 : : !***************************************************************
230 : : !NOTE:ARGUMENTS OF MOVER SHOULD BE CLEAN
231 : : ! We may just need to provide AB_MOVER wich is the main object
232 : : ! for mover and set scfcv_args as an optional and depending on
233 : : ! the kind of calculation (abinit or multibinit), we provide
234 : : !! to mover scfcv_args or effective_potential...
235 : : !***************************************************************
236 : : ! Free dtset
237 : 44 : call dtset%free()
238 : :
239 : : ! Set mpi_eng
240 : 44 : mpi_enreg%comm_cell = comm
241 : 44 : mpi_enreg%me = my_rank
242 : :
243 : : ! Set the abinit dataset for mover with fake values
244 : : ! Scalar
245 : 44 : dtset%dmft_entropy = 0
246 : 44 : dtset%nctime = inp%nctime ! NetCdf TIME between output of molecular dynamics information
247 : 44 : dtset%delayperm = 0 ! DELAY between trials to PERMUTE atoms
248 : 44 : dtset%dilatmx = 1.5 ! DILATation : MaXimal value
249 : 44 : dtset%chkdilatmx = 0 ! No check on dilatmx is needed in multibilint
250 : 44 : dtset%diismemory = 8 ! Direct Inversion in the Iterative Subspace MEMORY
251 : 44 : dtset%friction = 0.0001d0 ! internal FRICTION coefficient
252 : 44 : dtset%goprecon = 0 ! Geometry Optimization PREconditioner equations
253 : 44 : dtset%istatr = 0 ! Integer for STATus file SHiFT
254 : 44 : dtset%jellslab = 0 ! include a JELLium SLAB in the cell
255 : 44 : dtset%mqgrid = 0 ! Maximum number of Q-space GRID points for pseudopotentials
256 : 44 : dtset%mqgriddg = 0 ! Maximum number of Q-wavevectors for the 1-dimensional GRID
257 : : ! for the Double Grid in PAW
258 : 44 : dtset%mdwall = 10000d0 ! Molecular Dynamics WALL location
259 : 44 : dtset%ntypalch = 0 ! Number of TYPe of atoms that are "ALCHemical"
260 : 44 : dtset%natom = effective_potential%supercell%natom
261 : 44 : dtset%ntypat = effective_potential%crystal%ntypat
262 : 44 : dtset%npspalch = effective_potential%crystal%ntypat
263 : 44 : dtset%nconeq = 0 ! Number of CONstraint EQuations
264 : 44 : dtset%noseinert = 1.d-5 ! NOSE INERTia factor
265 : 44 : dtset%nnos = inp%nnos ! Number of nose masses Characteristic
266 [ + + ]: 176 : do ii=1,3 ! Only copy the diagonal part
267 : : ! might be adapt with ngqpt(9) instead of ngqpt(3) because is needed in wght9.f
268 : 176 : dtset%ph_ngqpt(ii) = inp%ngqpt((ii))
269 : : end do
270 : 44 : dtset%ph_nqshift = inp%nqshft
271 : 44 : dtset%prtxml = 0 ! print the xml
272 : 44 : dtset%signperm = 1 ! SIGN of PERMutation potential
273 : 44 : dtset%strprecon = inp%strprecon ! STRess PRECONditioner
274 [ + + ]: 176 : dtset%supercell_latt(:) = 0
275 [ + + ]: 176 : do ii=1,3
276 : 176 : dtset%supercell_latt(ii) = sc_size(ii)
277 : : end do
278 : 44 : dtset%tolmxf = inp%tolmxf
279 : 44 : dtset%tsmear = 0.009500446 !
280 : 44 : dtset%vis = 100 ! VIScosity
281 : 44 : dtset%usewvl = 0 !
282 : 44 : dtset%useylm = 0 !
283 : :
284 : : ! if(option == -3) then
285 : : ! write(message,'(a)')' Read the DDB file to fill the dtset array'
286 : : ! call wrtout(std_out,message,"COLL")
287 : : ! ! Copy real informtions from the ddb
288 : : ! call effective_potential_file_getType(filnam(3),type)
289 : : ! if(type /= 1) then
290 : : ! write(message, '(5a)' )&
291 : : ! & ' You need to provide DDB file in the input to compute ahnarmonic',ch10,&
292 : : ! & ' part of effective Hamiltionian',ch10,&
293 : : ! & 'Action: add DDB file in the inputs'
294 : : ! ABI_BUG(message)
295 : : ! end if
296 : : ! call ddb_to_dtset(comm, dtset,filnam(3),psps)
297 : : ! ABI_MALLOC(dtset%kptns,(3,dtset%nkpt))
298 : : ! dtset%kptns(:,:) = dtset%kpt(:,:)
299 : : ! ABI_MALLOC(dtset%istwfk,(dtset%nkpt))
300 : : ! dtset%istwfk(:) = 1
301 : :
302 : : ! else
303 : : ! Need to init some values
304 : : ! dtset%nsym = 1 ! Number of SYMmetry operations
305 : : ! ABI_MALLOC(symrel,(3,3,dtset%nsym))
306 : : ! symrel = reshape((/1,0,0,0,1,0,0,0,1/),shape(symrel))
307 : : ! call alloc_copy(symrel,dtset%symrel)
308 : : ! ABI_MALLOC(tnons,(3,dtset%nsym))
309 : : ! tnons = zero
310 : : ! call alloc_copy(tnons,dtset%tnons)
311 [ - + ]: 44 : call alloc_copy(effective_potential%supercell%typat,dtset%typat)
312 [ - + ]: 44 : call alloc_copy(effective_potential%crystal%znucl,dtset%znucl)
313 : : ! ABI_FREE(symrel)
314 : : ! ABI_FREE(tnons)
315 : : ! end if
316 : : !Find symmetry for simulation
317 [ + + ]: 44 : if(inp%dyn_chksym == 1)then
318 : : write(message,'(2a)')&
319 : 1 : & ' Check Symmetry of Start Structure and Impose it for dynamics run',ch10
320 : 1 : call wrtout(std_out,message,"COLL")
321 : 1 : call wrtout(ab_out,message,"COLL")
322 : : !read md_hist
323 [ + - ]: 1 : if(inp%restartxf < 0)then
324 [ + - + - ]: 1 : md_hist_name=trim(filnam(2))//'_HIST.nc'
325 : : write(message,'(3a)')&
326 : 1 : & ' Restart from external structure stored in file: ',trim(md_hist_name),ch10
327 : 1 : call wrtout(std_out,message,"COLL")
328 : 1 : call wrtout(ab_out,message,"COLL")
329 : 1 : isVused = .true.
330 : 1 : isARused = .true.
331 : 1 : readOnlyLast = .true.
332 : 1 : call read_md_hist(md_hist_name,hist_tmp,isVused,isARused,readOnlyLast)
333 : :
334 : :
335 : :
336 : : write(message,'(2a)')&
337 : 1 : & ' Map external structure to internal ordering of reference structure: ',ch10
338 : 1 : call wrtout(std_out,message,"COLL")
339 : 1 : call effective_potential_file_mapHistToRef(effective_potential,hist_tmp,comm,verbose=.True.) ! Map Hist to Ref to order atoms
340 : : endif
341 [ + + ]: 4 : msym = 96*PRODUCT(sc_size)
342 [ - + + - : 3 : ABI_MALLOC(symrel,(3,3,msym))
+ - + - -
+ - + -
+ ]
343 [ - + + - : 2 : ABI_MALLOC(symrec,(3,3,msym))
- + - + ]
344 [ - + + - : 3 : ABI_MALLOC(tnons,(3,msym))
+ - + - -
+ - + -
+ ]
345 : 1 : tolsym = inp%dyn_tolsym
346 : : call checksymmetrygroup(hist_tmp%rprimd,hist_tmp%xred,&
347 : : & effective_potential%supercell%typat,msym,effective_potential%supercell%natom,&
348 : 1 : & ptgroupma,spgroup,symrel,tnons,nsym,tolsym)
349 : 1 : dtset%nsym = nsym
350 [ + + ]: 17 : do ii=1,nsym
351 : 17 : call mati3inv(symrel(:,:,ii),symrec(:,:,ii))
352 : : end do
353 : : !Get Indsym
354 [ - + + - : 4 : ABI_MALLOC(indsym,(4,dtset%nsym,dtset%natom))
- + + - +
- + - - +
- + ]
355 [ - + ]: 1 : call symatm(indsym,dtset%natom,dtset%nsym,symrec,tnons,tolsym,effective_potential%supercell%typat,hist_tmp%xred)
356 [ - + ]: 1 : call alloc_copy(symrel,dtset%symrel)
357 [ - + ]: 1 : call alloc_copy(tnons,dtset%tnons)
358 : 1 : scfcv_args%indsym => indsym
359 : 1 : call abihist_free(hist_tmp)
360 [ - + ]: 2 : ABI_FREE(symrec)
361 : : else
362 : 43 : dtset%nsym = 1 ! Number of SYMmetry operations
363 [ - + - + ]: 43 : ABI_MALLOC(symrel,(3,3,dtset%nsym))
364 [ + + + - : 172 : symrel = reshape((/1,0,0,0,1,0,0,0,1/),shape(symrel))
+ - + - +
- ]
365 [ - + ]: 43 : call alloc_copy(symrel,dtset%symrel)
366 [ - + + - : 129 : ABI_MALLOC(tnons,(3,dtset%nsym))
+ - + - -
+ - + -
+ ]
367 [ + + + + ]: 215 : tnons = zero
368 [ - + ]: 43 : call alloc_copy(tnons,dtset%tnons)
369 [ - + + - : 172 : ABI_MALLOC(indsym,(4,dtset%nsym,dtset%natom))
- + + - +
- + - - +
- + ]
370 [ + + + + : 28771 : indsym = 0
+ + ]
371 : 43 : scfcv_args%indsym => indsym
372 : : endif
373 : :
374 [ - + ]: 44 : ABI_FREE(symrel)
375 [ - + ]: 44 : ABI_FREE(tnons)
376 : :
377 : : !array
378 [ - + + - : 132 : ABI_MALLOC(dtset%iatfix,(3,dtset%natom)) ! Indices of AToms that are FIXed
+ - + - -
+ - + -
+ ]
379 [ + - + - : 19320 : dtset%iatfix = inp%iatfix
- + - - -
- - - + +
+ + ]
380 [ + + ]: 176 : dtset%goprecprm(:) = zero !Geometry Optimization PREconditioner PaRaMeters equations
381 [ - + + - : 132 : ABI_MALLOC(dtset%prtatlist,(dtset%natom)) !PRinT by ATom LIST of ATom
+ - + - -
+ - + -
+ ]
382 [ + + ]: 4852 : dtset%prtatlist(:) = 0
383 [ - + + - : 176 : ABI_MALLOC(dtset%mixalch_orig,(dtset%npspalch,dtset%ntypalch,1))
+ - - - +
- - + - +
- + - + ]
384 [ + + + - : 88 : dtset%mixalch_orig(:,:,:)=zero
- - ]
385 [ - + + - : 132 : ABI_MALLOC(dtset%ph_qshift,(3,dtset%ph_nqshift))
+ - + - -
+ - + -
+ ]
386 [ + - + - : 264 : dtset%ph_qshift = inp%q1shft
- + - - -
- - - + +
+ + ]
387 : 44 : dtset%hmctt = inp%hmctt
388 : 44 : dtset%hmcsst = inp%hmcsst
389 [ + - ]: 44 : if(option > 0)then
390 : 44 : verbose = .TRUE.
391 : 44 : writeHIST = .TRUE.
392 : 44 : dtset%dtion = inp%dtion ! Delta Time for IONs
393 : 44 : dtset%ionmov = inp%dynamics ! Number for the dynamic
394 : 44 : dtset%ntime = inp%ntime ! Number of TIME steps
395 : 44 : dtset%optcell = inp%optcell ! OPTimize the CELL shape and dimensions Characteristic
396 : 44 : dtset%restartxf = inp%restartxf ! RESTART from (X,F) history
397 : 44 : dtset%mdtemp(1) = inp%temperature !Molecular Dynamics Temperatures
398 : 44 : dtset%mdtemp(2) = inp%temperature !Molecular Dynamics Temperatures
399 : 44 : dtset%strfact = inp%strfact ! STRess FACTor
400 [ + + ]: 308 : dtset%strtarget(1:6) = -1 * inp%strtarget(1:6) / 29421.033d0 ! STRess TARGET
401 [ # # ]: 0 : else if(option == -1.or.option == -2) then
402 : : ! Set default for the fit
403 : 0 : verbose = .false.
404 : 0 : writeHIST = .false.
405 : 0 : dtset%restartxf = 0 ! RESTART from (X,F) history
406 : 0 : dtset%dtion = inp%dtion ! Delta Time for IONs
407 : 0 : dtset%ionmov = 13 ! Number for the dynamic
408 : 0 : dtset%ntime = inp%bound_step ! Number of TIME steps
409 : 0 : dtset%optcell = 2 ! OPTimize the CELL shape and dimensions Characteristic
410 : 0 : dtset%mdtemp(1) = inp%bound_temp !Molecular Dynamics Temperatures
411 : 0 : dtset%mdtemp(2) = inp%bound_temp !Molecular Dynamics Temperatures
412 : 0 : dtset%strfact = 100.0d0
413 [ # # ]: 0 : dtset%strtarget(1:6) = zero
414 : : end if
415 : :
416 : : ! Set the barostat and thermonstat if ionmov == 13
417 [ + + ]: 44 : if(dtset%ionmov == 13 .or. dtset%ionmov == 25)then
418 : :
419 : : ! Select frequency of the barostat as a function of temperature
420 : : ! For small temperature, we need huge barostat and inversely
421 : : ! if(dtset%mdtemp(1) <= 10) then
422 : : ! freq_q = 0.002
423 : : ! freq_b = 0.0002
424 : : ! else if(dtset%mdtemp(1) <= 50) then
425 : : ! freq_q = 0.02
426 : : ! freq_b = 0.002
427 : : ! else if(dtset%mdtemp(1) > 50.and.dtset%mdtemp(1) < 300) then
428 : : ! freq_q = 0.1
429 : : ! freq_b = 0.01
430 : : ! else
431 : : ! freq_q = 0.2
432 : : ! freq_b = 0.02
433 : : ! end if
434 : :
435 : : !TEST_AM_old way
436 : : ! freq_q = 0.1
437 : : ! freq_b = 0.01
438 : : ! qmass = dtset%natom* kb_THzK * dtset%mdtemp(1) / (freq_q**2)
439 : : ! bmass = dtset%natom* kb_THzK * dtset%mdtemp(1) / (freq_b**2)
440 : : !TEST_AM
441 : :
442 : :
443 : : !TEST_AM
444 : 26 : freq_q = 800 / Ha_cmm1
445 : 26 : freq_b = 800 / Ha_cmm1
446 : 26 : qmass = 10 * dtset%natom * kb_HaK * dtset%mdtemp(1) / (freq_q**2)
447 : 26 : bmass = 10000*qmass
448 : : !TEST_AM
449 : :
450 : :
451 [ + - ]: 26 : if(dtset%nnos==0) then
452 : 26 : dtset%nnos = 1
453 [ - + - + ]: 26 : ABI_MALLOC(dtset%qmass,(dtset%nnos))
454 [ + + ]: 52 : dtset%qmass(:) = qmass
455 : : write(message,'(3a,F30.10,a)')&
456 : 26 : & ' WARNING: nnos is set to zero in the input',ch10,&
457 : 52 : & ' value by default for qmass: ',dtset%qmass(:),ch10
458 [ + - ]: 26 : if(verbose)call wrtout(std_out,message,"COLL")
459 : : else
460 [ # # # # : 0 : ABI_MALLOC(dtset%qmass,(dtset%nnos)) ! Q thermostat mass
# # # # #
# # # #
# ]
461 [ # # ]: 0 : dtset%qmass(:) = inp%qmass(:)
462 : : end if
463 [ + - ]: 26 : if (abs(inp%bmass) < tol10) then
464 : 26 : dtset%bmass = bmass
465 : : write(message,'(3a,F30.10,a)')&
466 : 26 : & ' WARNING: bmass is set to zero in the input',ch10,&
467 : 52 : & ' value by default for bmass: ',dtset%bmass,ch10
468 [ + - ]: 26 : if(verbose)call wrtout(std_out,message,"COLL")
469 : : else
470 : 0 : dtset%bmass = inp%bmass ! Barostat mass
471 : : end if
472 : : end if
473 : :
474 : : ! Do a check
475 [ - + ]: 44 : if(dtset%ionmov == 27)then
476 : 0 : call effective_potential_file_getType(filnam(3),filetype)
477 [ # # ]: 0 : if(filetype /= 1)then
478 : : write(message, '(5a)' )&
479 [ # # ]: 0 : & ' The file ',trim(filnam(3)),' is not a DDB',ch10,&
480 : 0 : & ' It is not compatible with ionmov 27'
481 : 0 : ABI_ERROR(message)
482 : : end if
483 : :
484 : : end if
485 : :
486 : : ! set psps
487 : 44 : psps%useylm = dtset%useylm
488 : :
489 : : ! initialisation of results_gs
490 : 44 : call results_gs%init(dtset%natom,1,1)
491 : :
492 : : ! Set the pointers of scfcv_args
493 : 44 : zero_integer = 0
494 : 44 : scfcv_args%dtset => dtset
495 : : !ABI_MALLOC(indsym,(4,dtset%nsym,dtset%natom))
496 : : !indsym = 0
497 : : !scfcv_args%indsym => indsym
498 : 44 : scfcv_args%mpi_enreg => mpi_enreg
499 : 44 : scfcv_args%ndtpawuj => zero_integer
500 : 44 : scfcv_args%results_gs => results_gs
501 : 44 : scfcv_args%psps => psps
502 : : ! Set other arguments of the mover.F90 routines
503 : :
504 : : ! Set the dffil structure
505 [ + + ]: 132 : dtfil%filnam_ds(1:2)=filnam(1:2)
506 : 44 : dtfil%filnam_ds(3)=""
507 : 44 : dtfil%filnam_ds(4)=filnam(2)
508 : 44 : dtfil%filstat='_STATUS'
509 : 44 : nullify (electronpositron)
510 [ - + ]: 44 : ABI_MALLOC(rhog,(2,1))
511 [ - + ]: 44 : ABI_MALLOC(rhor,(2,1))
512 : :
513 : : ! Initialize xf history (should be put in inwffil)
514 : : ! Not yet implemented for ionmov 2 3 10 11 22 (memory problem...)
515 : : ! ab_xfh%mxfh=(ab_xfh%nxfh-dtset%restartxf+1)+dtset%ntime+5
516 : 44 : ab_xfh%nxfh = 0
517 : 44 : ab_xfh%mxfh = 1
518 [ + - - + : 176 : ABI_MALLOC(ab_xfh%xfhist,(3,dtset%natom+4,2,ab_xfh%mxfh))
+ - + - +
- + - - +
- + - + ]
519 [ + - - + ]: 44 : if (any((/3,10,11/)==dtset%ionmov)) then
520 : : write(message, '(3a)' )&
521 : 0 : & ' This dynamics can not be used with effective potential',ch10,&
522 : 0 : & 'Action: correct dynamics input'
523 : 0 : ABI_BUG(message)
524 : : end if
525 : :
526 : : !Get SCALE-UP INPUT
527 : :
528 [ + - - + : 44 : scup_inp = inp%scup_dtset
- + - + -
+ - + - +
+ - - + -
+ - + - +
- + - + ]
529 : :
530 : :
531 : : !***************************************************************
532 : : !2 initialization of the structure for the dynamics
533 : : !***************************************************************
534 : :
535 [ - + ]: 44 : if (allocated(dtset%rprimd_orig)) then
536 : 0 : ABI_FREE(dtset%rprimd_orig)
537 : : end if
538 [ - + - + ]: 44 : ABI_MALLOC(dtset%rprimd_orig,(3,3,1))
539 [ + + + + ]: 572 : dtset%rprimd_orig(:,:,1) = effective_potential%supercell%rprimd
540 : :
541 : :
542 [ - + + - : 132 : ABI_MALLOC(xred,(3,dtset%natom))
+ - + - -
+ - + ]
543 [ - + + - : 88 : ABI_MALLOC(xred_old,(3,dtset%natom))
- + - + ]
544 [ - + + - : 88 : ABI_MALLOC(vel,(3,dtset%natom))
- + - + ]
545 [ - + + - : 88 : ABI_MALLOC(gred,(3,dtset%natom))
- + - + ]
546 [ - + + - : 88 : ABI_MALLOC(fcart,(3,dtset%natom))
- + - + ]
547 : :
548 : : call xcart2xred(dtset%natom,effective_potential%supercell%rprimd,&
549 : 44 : & effective_potential%supercell%xcart,xred)
550 : :
551 [ - + + + : 19320 : xred_old = xred
+ + ]
552 : 44 : vel_cell(:,:) = zero
553 [ + + + + ]: 19276 : vel(:,:) = zero
554 : :
555 : : !*********************************************************
556 : : !4 Call main routine for the bound process,
557 : : ! monte carlo / molecular dynamics / project
558 : : !*********************************************************
559 [ + - ]: 44 : if(option > 0)then
560 : : !*************************************************************
561 : : ! call mover in case of NPT or NVT simulation
562 : : !*************************************************************
563 [ + + ]: 3608 : write(message, '((80a),3a)' ) ('-',ii=1,80), ch10,&
564 [ + - ]: 3652 : & '-Monte Carlo / Molecular Dynamics ',ch10
565 : :
566 : : ! Marcus: if wanted analyze anharmonic terms of effective potential &&
567 : : ! and print anharmonic contribution to file anharmonic_energy_terms.out
568 : : ! Open File and write header
569 : 44 : ncoeff = effective_potential%anharmonics_terms%ncoeff
570 : 44 : name_file='MD'
571 [ - + ]: 44 : if(inp%analyze_anh_pot == 1)then
572 : : call effective_potential_writeAnhHead(ncoeff,name_file,&
573 : 0 : & effective_potential%anharmonics_terms)
574 : : end if
575 : :
576 : 44 : call wrtout(ab_out,message,'COLL')
577 : 44 : call wrtout(std_out,message,'COLL')
578 : : call mover(scfcv_args,ab_xfh,acell,effective_potential%crystal%amu,dtfil,electronpositron,&
579 : : & rhog,rhor,dtset%rprimd_orig,vel,vel_cell,xred,xred_old,&
580 : : & effective_potential=effective_potential,filename_ddb=filnam(3),&
581 : : & verbose=verbose,verbose_cycle=dtset%ionmov/=25,writeHIST=writeHIST,scup_dtset=scup_inp,sc_size=sc_size(:),&
582 : 44 : & multibinit_dtset=inp)
583 : 44 : INQUIRE(FILE='MD_anharmonic_terms_energy.dat',OPENED=file_opened,number=unit_out)
584 [ - + ]: 44 : if(file_opened) close(unit_out)
585 [ # # ]: 0 : else if(option== -1.or.option==-2)then
586 : : !*************************************************************
587 : : ! Try to bound the model
588 : : !*************************************************************
589 [ # # ]: 0 : write(message, '((80a),4a)' ) ('-',ii=1,80), ch10,&
590 [ # # ]: 0 : & ' Try to bound the model',ch10,' Check if the model is bounded or not'
591 : 0 : call wrtout(ab_out,message,'COLL')
592 : 0 : call wrtout(std_out,message,'COLL')
593 : :
594 : : ! Try the model
595 : : call mover(scfcv_args,ab_xfh,acell,effective_potential%crystal%amu,dtfil,electronpositron,&
596 : : & rhog,rhor,dtset%rprimd_orig,vel,vel_cell,xred,xred_old,&
597 : : & effective_potential=effective_potential,verbose=verbose,verbose_cycle=dtset%ionmov/=25,writeHIST=writeHIST,&
598 : 0 : & multibinit_dtset=inp )
599 : :
600 : 0 : write(message, '(a)' ) ' => The model'
601 [ # # ]: 0 : if(effective_potential%anharmonics_terms%bounded)then
602 : 0 : write(message, '(2a)' ) trim(message),' is bound'
603 : 0 : call wrtout(std_out,message,'COLL')
604 : 0 : call wrtout(ab_out,message,'COLL')
605 : : else
606 : 0 : write(message, '(2a)' ) trim(message),' is not bound'
607 : 0 : call wrtout(std_out,message,'COLL')
608 : :
609 : :
610 [ # # ]: 0 : if(option==-2)then
611 : :
612 : : ! Fill the list for the fixcoeff input of the fit_polynomial_coeff_fit routine
613 : : ! Store the number of coefficients before adding other coeff for the bounding
614 : 0 : ncoeff = effective_potential%anharmonics_terms%ncoeff
615 [ # # # # : 0 : ABI_MALLOC(listcoeff,(ncoeff))
# # # # #
# # # ]
616 [ # # ]: 0 : do ii=1,ncoeff
617 : 0 : listcoeff(ii)=ii
618 : : end do
619 : :
620 : 0 : write(message, '(2a)')ch10,' Generate the list of addionnal terms with the fit process...'
621 : 0 : call wrtout(std_out,message,'COLL')
622 : :
623 : : ! Get the additional coeff
624 : : call fit_polynomial_coeff_fit(effective_potential,(/0/),listcoeff,hist,1,&
625 : : & inp%bound_rangePower,0,inp%bound_maxCoeff,ncoeff,inp%fit_nimposecoeff,inp%fit_imposecoeff,&
626 : : & 1,comm,cutoff_in=inp%bound_cutoff,&
627 : : & max_power_strain=2,verbose=.true.,positive=.true.,spcoupling=inp%bound_SPCoupling==1,&
628 : : & anharmstr=inp%bound_anhaStrain==1,only_even_power=.true.,fit_on=inp%fit_on,sel_on=inp%sel_on, &
629 : 0 : & max_nbody=inp%fit_max_nbody, drop_rate=0.0_dp, ncoeff_per_cycle=1, fit_weight_T=inp%fit_weight_T)
630 : :
631 : : ! Store the max number of coefficients after the fit process
632 : 0 : ncoeff_max = effective_potential%anharmonics_terms%ncoeff
633 : : ! Store all the coefficients in coeffs_all
634 [ # # # # : 0 : ABI_MALLOC(coeffs_all,(ncoeff_max))
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # #
# ]
635 [ # # # # : 0 : ABI_MALLOC(coeffs_tmp,(ncoeff_max))
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# ]
636 [ # # ]: 0 : do ii=1,ncoeff_max
637 : : call polynomial_coeff_init(&
638 : : & effective_potential%anharmonics_terms%coefficients(ii)%coefficient,&
639 : : & effective_potential%anharmonics_terms%coefficients(ii)%nterm,&
640 : : & coeffs_all(ii),&
641 : : & effective_potential%anharmonics_terms%coefficients(ii)%terms,&
642 : : & effective_potential%anharmonics_terms%coefficients(ii)%name,&
643 : 0 : & check=.false.)
644 : : end do
645 : :
646 : 0 : model_ncoeffbound = 0
647 [ # # ]: 0 : do ii=1,ncoeff_max-ncoeff
648 : :
649 : 0 : write(message, '(5a,I0,a)')ch10,'--',ch10,' Try to bound the model ',&
650 : 0 : & 'with ', ii,' additional term'
651 [ # # ]: 0 : if(ii>1)write(message,'(2a)') trim(message),'s'
652 : 0 : call wrtout(std_out,message,'COLL')
653 : 0 : call wrtout(ab_out,message,'COLL')
654 : :
655 : : ! Copy the new model in coeffs_tmp(jj)
656 : : ! Free the coeffs_tmp array before
657 [ # # ]: 0 : do jj=1,ncoeff_max
658 : 0 : call polynomial_coeff_free(coeffs_tmp(jj))
659 : : end do
660 : :
661 [ # # ]: 0 : do jj=1,ncoeff+ii
662 : : call polynomial_coeff_init(&
663 : : & coeffs_all(jj)%coefficient,&
664 : : & coeffs_all(jj)%nterm,&
665 : : & coeffs_tmp(jj),&
666 : : & coeffs_all(jj)%terms,&
667 : : & coeffs_all(jj)%name,&
668 : 0 : & check=.false.)
669 : : end do
670 : :
671 : 0 : model_ncoeffbound = ii
672 : :
673 : : ! Reset the simulation and set the coefficients of the model
674 : 0 : call effective_potential_setCoeffs(coeffs_tmp(1:ncoeff+ii),effective_potential,ncoeff+ii)
675 : : call fit_polynomial_coeff_fit(effective_potential,(/0/),(/0/),hist,0,(/0,0/),0,0,&
676 : : & -1,inp%fit_nimposecoeff,inp%fit_imposecoeff,1,comm,verbose=.true.,positive=.false.,&
677 : : & fit_on=inp%fit_on,sel_on=inp%sel_on, max_nbody=inp%fit_max_nbody, drop_rate=0.0_dp, &
678 : 0 : & ncoeff_per_cycle=1, fit_weight_T=inp%fit_weight_T)
679 : 0 : call effective_potential_setSupercell(effective_potential,comm,ncell=sc_size)
680 [ # # # # ]: 0 : dtset%rprimd_orig(:,:,1) = effective_potential%supercell%rprimd
681 [ # # ]: 0 : acell(:) = one
682 : : call xcart2xred(dtset%natom,effective_potential%supercell%rprimd,&
683 : 0 : & effective_potential%supercell%xcart,xred)
684 [ # # # # : 0 : xred_old = xred
# # ]
685 : 0 : vel_cell(:,:) = zero
686 [ # # # # ]: 0 : vel(:,:) = zero
687 [ # # # # ]: 0 : gred(:,:) = zero
688 [ # # # # ]: 0 : fcart(:,:) = zero
689 : :
690 : : ! Run mover to check if the model is bound
691 : : call mover(scfcv_args,ab_xfh,acell,effective_potential%crystal%amu,dtfil,electronpositron,&
692 : : & rhog,rhor,dtset%rprimd_orig,vel,vel_cell,xred,xred_old,&
693 : 0 : & effective_potential=effective_potential,verbose=verbose,verbose_cycle=dtset%ionmov/=25,writeHIST=writeHIST)
694 [ # # ]: 0 : if(.not.effective_potential%anharmonics_terms%bounded)then
695 : 0 : write(message, '(2a)' ) ' => The model is not bounded'
696 : : else
697 : 0 : write(message, '(2a)' ) ' => The model is bounded'
698 : : end if
699 : 0 : call wrtout(std_out,message,'COLL')
700 : :
701 : : ! Exit if the model is bounded
702 [ # # ]: 0 : if(effective_potential%anharmonics_terms%bounded) exit
703 : :
704 : : end do
705 : :
706 : : else
707 : : ! Get the list of possible coefficients to bound the model
708 : 0 : cutoff = zero
709 [ # # ]: 0 : do ii=1,3
710 : 0 : cutoff = cutoff + effective_potential%crystal%rprimd(ii,ii)
711 : : end do
712 : 0 : cutoff = cutoff / 3.0
713 : :
714 : : ! call fit_polynomial_coeff_getCoeffBound(effective_potential,coeffs_bound,&
715 : : !& hist,ncoeff_bound,comm,verbose=.true.)
716 : :
717 : : !TEST_AM!
718 : 0 : sc_size_TS = (/2,2,2/)
719 : : call polynomial_coeff_getNorder(coeffs_bound,effective_potential%crystal,cutoff,&
720 : : & ncoeff_bound,ncoeff_bound_tot,inp%bound_rangePower,inp%bound_rangePower(2),2,sc_size_TS,&
721 : : & comm,anharmstr=inp%bound_anhaStrain==1,&
722 : : & spcoupling=inp%bound_SPCoupling==1,verbose=.false.,distributed=.false.,&
723 : 0 : & only_even_power=.true.,only_odd_power=.false., max_nbody=inp%fit_max_nbody)
724 : :
725 [ # # ]: 0 : if(iam_master)then
726 [ # # # # ]: 0 : filename=trim(filnam(2))//"_boundcoeff.xml"
727 : 0 : call polynomial_coeff_writeXML(coeffs_bound,ncoeff_bound,filename=filename,newfile=.true.)
728 : : end if
729 : : ! wait
730 : 0 : call xmpi_barrier(comm)
731 : : ! Store all the initial coefficients
732 : 0 : ncoeff = effective_potential%anharmonics_terms%ncoeff
733 [ # # # # : 0 : ABI_MALLOC(coeffs_all,(ncoeff+ncoeff_bound))
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # #
# ]
734 [ # # ]: 0 : do ii=1,ncoeff
735 : : call polynomial_coeff_init(effective_potential%anharmonics_terms%coefficients(ii)%coefficient,&
736 : : & effective_potential%anharmonics_terms%coefficients(ii)%nterm,&
737 : : & coeffs_all(ii),&
738 : : & effective_potential%anharmonics_terms%coefficients(ii)%terms,&
739 : : & effective_potential%anharmonics_terms%coefficients(ii)%name,&
740 : 0 : & check=.false.)
741 : : end do
742 : :
743 [ # # ]: 0 : do ii=1,ncoeff_bound
744 : : call polynomial_coeff_init(coeffs_bound(ii)%coefficient,&
745 : : & coeffs_bound(ii)%nterm,&
746 : : & coeffs_all(ncoeff+ii),&
747 : : & coeffs_bound(ii)%terms,&
748 : : & coeffs_bound(ii)%name,&
749 : 0 : & check=.false.)
750 : : end do
751 : :
752 : : ! Copy the fixed coefficients from the model (without bound coeff)
753 : 0 : ncoeff = effective_potential%anharmonics_terms%ncoeff
754 [ # # # # : 0 : ABI_MALLOC(coeffs_tmp,(ncoeff+ncoeff_bound))
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # #
# ]
755 [ # # ]: 0 : do ii=1,ncoeff
756 : : call polynomial_coeff_init(effective_potential%anharmonics_terms%coefficients(ii)%coefficient,&
757 : : & effective_potential%anharmonics_terms%coefficients(ii)%nterm,&
758 : : & coeffs_tmp(ii),&
759 : : & effective_potential%anharmonics_terms%coefficients(ii)%terms,&
760 : : & effective_potential%anharmonics_terms%coefficients(ii)%name,&
761 : 0 : & check=.false.)
762 : : end do
763 : :
764 : 0 : ncoeff_max = ncoeff+ncoeff_bound
765 [ # # # # : 0 : ABI_MALLOC(listcoeff,(ncoeff_max))
# # # # #
# # # ]
766 [ # # ]: 0 : listcoeff = 0
767 [ # # ]: 0 : do jj=1,ncoeff
768 : 0 : listcoeff(jj) = jj
769 : : end do
770 : :
771 : 0 : model_bound = 0
772 : 0 : model_ncoeffbound = 0
773 : :
774 [ # # ]: 0 : do ii=2,inp%bound_maxCoeff
775 : : ! Compute the number of possible combination
776 : 0 : nmodels = 1
777 [ # # # # : 0 : ABI_MALLOC(list_bound,(nmodels,ii))
# # # # #
# # # ]
778 [ # # # # : 0 : ABI_MALLOC(list_tmp,(ii))
# # # # #
# # # ]
779 [ # # # # : 0 : list_bound = 0; list_tmp = 0; kk = 0; jj = 1
# # ]
780 : :
781 : : ! Generate the list of possible combinaison 1st count
782 : 0 : call genereList(kk,jj,ii,ncoeff_bound,list_tmp,list_bound,nmodels,.false.)
783 : 0 : nmodels = kk
784 : :
785 : 0 : write(message, '(5a,I0,a,I0,a)')ch10,'--',ch10,' Try to bound the model ',&
786 : 0 : & 'with ', ii,' additional positive terms (',nmodels,') possibilities'
787 : 0 : call wrtout(std_out,message,'COLL')
788 : :
789 : : ! allocate and generate combinaisons
790 [ # # ]: 0 : ABI_FREE(list_bound)
791 [ # # ]: 0 : ABI_FREE(list_tmp)
792 [ # # # # : 0 : ABI_MALLOC(coeff_values,(nmodels,ncoeff+ii))
# # # # #
# # # # #
# # ]
793 [ # # # # : 0 : ABI_MALLOC(listcoeff_bound,(nmodels,ncoeff+ii))
# # # # #
# # # # #
# # # # ]
794 [ # # # # : 0 : ABI_MALLOC(list_bound,(nmodels,ii))
# # # # #
# # # # #
# # ]
795 [ # # # # : 0 : ABI_MALLOC(list_tmp,(ii))
# # # # #
# # # ]
796 [ # # # # : 0 : ABI_MALLOC(isPositive,(nmodels))
# # # # #
# # # ]
797 [ # # # # : 0 : list_bound = 0; listcoeff_bound = 0; list_tmp = 0; isPositive = 0; kk = 0; jj = 1
# # # # #
# # # ]
798 : 0 : call genereList(kk,jj,ii,ncoeff_bound,list_tmp,list_bound,nmodels,.true.)
799 : : ! Generate the models
800 [ # # ]: 0 : do jj=1,nmodels
801 [ # # ]: 0 : listcoeff_bound(jj,1:ncoeff) = listcoeff(1:ncoeff)
802 [ # # ]: 0 : listcoeff_bound(jj,ncoeff+1:ncoeff+ii) = list_bound(jj,:) + ncoeff
803 : : end do
804 : :
805 : : ! Reset the simulation
806 : 0 : call effective_potential_setCoeffs(coeffs_all,effective_potential,ncoeff+ncoeff_bound)
807 : : call fit_polynomial_coeff_getPositive(effective_potential,hist,coeff_values,&
808 : 0 : & isPositive,listcoeff_bound,ncoeff+ii,ncoeff,nmodels,comm,verbose=.false., fit_weight_T=inp%fit_weight_T)
809 [ # # # # : 0 : if(all(isPositive == 0)) then
# # ]
810 : 0 : write(message, '(5a,I0,a)')ch10,'--',ch10,' No possible model ',&
811 : 0 : & 'with ', ii,' additional terms found'
812 : 0 : call wrtout(std_out,message,'COLL')
813 : : else
814 : :
815 [ # # ]: 0 : do jj=1,nmodels
816 [ # # # # : 0 : if(isPositive(jj) == 1 .and. all(abs(coeff_values(jj,:)) < 1.0E5)) then
# # # # ]
817 : 0 : write(message, '(2a,I0,a)') ch10,' The model number ',jj,' ['
818 [ # # ]: 0 : do kk=1,ncoeff+ii
819 [ # # ]: 0 : if(kk<ncoeff+ii)then
820 : 0 : write(message, '(a,I0,a)') trim(message),listcoeff_bound(jj,kk),','
821 : : else
822 : 0 : write(message, '(a,I0)') trim(message),listcoeff_bound(jj,kk)
823 : : end if
824 : : end do
825 : 0 : write(message, '(2a)') trim(message),'] is positive'
826 : 0 : call wrtout(std_out,message,'COLL')
827 : 0 : write(message, '(2a,I0,a)') ' Check if the model ',&
828 : 0 : & 'number ', jj,' is bounded...'
829 : 0 : call wrtout(std_out,message,'COLL')
830 : :
831 : : ! Set the coefficients of the model
832 [ # # ]: 0 : do kk=1,ncoeff+ii
833 [ # # ]: 0 : if(kk<=ncoeff)then
834 : : ! just set the values of the coefficient
835 : 0 : call polynomial_coeff_setCoefficient(coeff_values(jj,kk),coeffs_tmp(kk))
836 : 0 : write(message, '(a,I0,a,ES19.10,2a)') ' Set the value of the coefficient ',kk,&
837 [ # # ]: 0 : & ' =>',coeff_values(jj,kk),' ',trim(coeffs_tmp(kk)%name)
838 : 0 : call wrtout(std_out,message,'COLL')
839 : :
840 : : else
841 : : ! Set the good coefficient
842 : 0 : icoeff_bound = listcoeff_bound(jj,kk)-ncoeff ! need to remove ncoeff value
843 : : write(message, '(a,I0,a,I0,a,ES19.10,2a)')&
844 : 0 : & ' Set the value of the coefficient ',kk,' (',icoeff_bound,&
845 : 0 : & ') =>',coeff_values(jj,kk),&
846 [ # # ]: 0 : & ' ',trim(coeffs_bound(icoeff_bound)%name)
847 : 0 : call wrtout(std_out,message,'COLL')
848 : 0 : call polynomial_coeff_free(coeffs_tmp(kk))
849 : : call polynomial_coeff_init(coeff_values(jj,kk),&
850 : : & coeffs_bound(icoeff_bound)%nterm,&
851 : : & coeffs_tmp(kk),&
852 : : & coeffs_bound(icoeff_bound)%terms,&
853 : : & coeffs_bound(icoeff_bound)%name,&
854 : 0 : & check=.false.)
855 : :
856 : : end if
857 : : end do
858 : :
859 : : ! Reset the simulation and set the coefficients of the model
860 : : call effective_potential_setCoeffs(coeffs_tmp(1:ncoeff+ii),effective_potential,&
861 : 0 : & ncoeff+ii)
862 : : call fit_polynomial_coeff_fit(effective_potential,(/0/),(/0/),hist,0,(/0,0/),1,0,&
863 : : & -1,inp%fit_nimposecoeff,inp%fit_imposecoeff,1,comm,verbose=.false.,positive=.false., &
864 : : & max_nbody=inp%fit_max_nbody, drop_rate=0.0_dp, ncoeff_per_cycle=1, &
865 : 0 : & fit_weight_T=inp%fit_weight_T)
866 : 0 : call effective_potential_setSupercell(effective_potential,comm,ncell=sc_size)
867 [ # # # # ]: 0 : dtset%rprimd_orig(:,:,1) = effective_potential%supercell%rprimd
868 [ # # ]: 0 : acell(:) = one
869 : : call xcart2xred(dtset%natom,effective_potential%supercell%rprimd,&
870 : 0 : & effective_potential%supercell%xcart,xred)
871 [ # # # # : 0 : xred_old = xred
# # ]
872 : 0 : vel_cell(:,:) = zero
873 [ # # # # ]: 0 : vel(:,:) = zero
874 [ # # # # ]: 0 : gred(:,:) = zero
875 [ # # # # ]: 0 : fcart(:,:) = zero
876 : :
877 : : ! Run mover
878 : : call mover(scfcv_args,ab_xfh,acell,effective_potential%crystal%amu,dtfil,electronpositron,&
879 : : & rhog,rhor,dtset%rprimd_orig,vel,vel_cell,xred,xred_old,&
880 : 0 : & effective_potential=effective_potential,verbose=verbose,verbose_cycle=dtset%ionmov/=25,writeHIST=writeHIST)
881 : :
882 [ # # ]: 0 : if(.not.effective_potential%anharmonics_terms%bounded)then
883 : 0 : write(message, '(2a)' ) ' => The model is not bounded'
884 : : else
885 : 0 : write(message, '(2a)' ) ' => The model is bounded'
886 : : end if
887 : 0 : call wrtout(std_out,message,'COLL')
888 : : ! Exit if the model is bounded
889 [ # # ]: 0 : if(effective_potential%anharmonics_terms%bounded) then
890 : 0 : model_bound = jj
891 : 0 : model_ncoeffbound = ii
892 : 0 : exit
893 : : end if
894 : : end if
895 : : end do
896 : : end if
897 : :
898 [ # # ]: 0 : ABI_FREE(list_tmp)
899 [ # # ]: 0 : ABI_FREE(list_bound)
900 [ # # ]: 0 : ABI_FREE(isPositive)
901 : :
902 : : ! Exit if the model is bounded
903 [ # # ]: 0 : if(effective_potential%anharmonics_terms%bounded) then
904 : :
905 : : ! Final transfert
906 : 0 : write(message, '(3a)' ) ch10,' => The model is now bounded'
907 : 0 : call wrtout(ab_out,message,'COLL')
908 : 0 : call wrtout(std_out,message,'COLL')
909 [ # # ]: 0 : do kk=ncoeff+1,ncoeff+model_ncoeffbound
910 : 0 : icoeff_bound = listcoeff_bound(model_bound,kk)-ncoeff ! need to remove ncoeff value
911 : 0 : call polynomial_coeff_free(coeffs_tmp(kk))
912 : : call polynomial_coeff_init(coeff_values(model_bound,kk),&
913 : : & coeffs_bound(icoeff_bound)%nterm,&
914 : : & coeffs_tmp(kk),&
915 : : & coeffs_bound(icoeff_bound)%terms,&
916 : : & coeffs_bound(icoeff_bound)%name,&
917 : 0 : & check=.false.)
918 : : end do
919 [ # # ]: 0 : ABI_FREE(coeff_values)
920 [ # # ]: 0 : ABI_FREE(listcoeff_bound)
921 : 0 : exit
922 : : end if
923 [ # # ]: 0 : ABI_FREE(coeff_values)
924 : :
925 : : end do
926 : :
927 [ # # ]: 0 : do ii=1,ncoeff_bound
928 : 0 : call polynomial_coeff_free(coeffs_bound(ii))
929 : : end do
930 [ # # # # : 0 : ABI_SFREE(coeffs_bound)
# # # # #
# # # # #
# # # # #
# # # #
# ]
931 : :
932 : : end if
933 : :
934 [ # # ]: 0 : if(.not.effective_potential%anharmonics_terms%bounded)then
935 : 0 : write(message, '(3a)' ) ch10,' => The model cannot be bounded'
936 : 0 : call wrtout(ab_out,message,'COLL')
937 : 0 : call wrtout(std_out,message,'COLL')
938 : 0 : model_ncoeffbound = 0
939 : 0 : model_bound = 0
940 : : end if
941 : :
942 : : ! Fit the final model
943 : :
944 : : call effective_potential_setCoeffs(coeffs_tmp(1:ncoeff+model_ncoeffbound),effective_potential,&
945 : 0 : & ncoeff+model_ncoeffbound)
946 : :
947 : : call fit_polynomial_coeff_fit(effective_potential,(/0/),(/0/),hist,0,(/0,0/),0,0,&
948 : : & -1,inp%fit_nimposecoeff,inp%fit_imposecoeff,1,comm,verbose=.false.,fit_on=inp%fit_on,sel_on=inp%sel_on,&
949 : 0 : & max_nbody=inp%fit_max_nbody, drop_rate=0.0_dp, ncoeff_per_cycle=1, fit_weight_T=inp%fit_weight_T)
950 : :
951 : 0 : write(message, '(3a)') ch10,' Fitted coefficients at the end of the fit bound process: '
952 : 0 : call wrtout(ab_out,message,'COLL')
953 : 0 : call wrtout(std_out,message,'COLL')
954 : :
955 [ # # ]: 0 : do ii = 1,ncoeff+model_ncoeffbound
956 : 0 : write(message, '(a,I0,a,ES19.10,2a)') " ",ii," =>",&
957 : 0 : & effective_potential%anharmonics_terms%coefficients(ii)%coefficient,&
958 [ # # ]: 0 : & " ",trim(effective_potential%anharmonics_terms%coefficients(ii)%name)
959 : 0 : call wrtout(ab_out,message,'COLL')
960 : 0 : call wrtout(std_out,message,'COLL')
961 : : end do
962 : :
963 : : ! Deallocation
964 [ # # ]: 0 : ABI_FREE(listcoeff)
965 [ # # ]: 0 : do ii=1,ncoeff_max
966 : 0 : call polynomial_coeff_free(coeffs_tmp(ii))
967 : : end do
968 [ # # # # : 0 : ABI_SFREE(coeffs_tmp)
# # # # #
# # # # #
# # # # #
# # # ]
969 : :
970 [ # # ]: 0 : do ii=1,ncoeff_max
971 : 0 : call polynomial_coeff_free(coeffs_all(ii))
972 : : end do
973 [ # # # # : 0 : ABI_SFREE(coeffs_all)
# # # # #
# # # # #
# # # # #
# # # ]
974 : :
975 : : end if
976 : :
977 : : else if (option == -3) then
978 : :
979 : : !*************************************************************
980 : : ! Call the routine for calculation of the energy for specific
981 : : ! partern of displacement or strain for the effective
982 : : ! Hamiltonian
983 : : !*************************************************************
984 : : ! write(message, '((80a),4a)' ) ('-',ii=1,80), ch10,&
985 : : !& ' Effective Hamiltonian calculation'
986 : : ! call wrtout(ab_out,message,'COLL')
987 : : ! call wrtout(std_out,message,'COLL')
988 : :
989 : : ! acell = one
990 : : ! call gstate(args_gs,acell,codvsn,cpui,dtfil,dtset,iexit,initialized,&
991 : : !& mpi_enreg,npwtot,dtset%occ_orig,pawang,pawrad,pawtab,&
992 : : !& psps,results_gs,dtset%rprimd_orig,scf_history,vel,vel_cell,wvl,xred)
993 : :
994 : : end if
995 : :
996 : : !***************************************************************
997 : : ! 5 Deallocation of array
998 : : !***************************************************************
999 : :
1000 [ - + ]: 44 : ABI_FREE(gred)
1001 [ - + ]: 44 : ABI_FREE(fcart)
1002 [ - + ]: 44 : ABI_FREE(indsym)
1003 [ - + ]: 44 : ABI_FREE(rhog)
1004 [ - + ]: 44 : ABI_FREE(rhor)
1005 [ - + ]: 44 : ABI_FREE(vel)
1006 [ - + ]: 44 : ABI_FREE(xred)
1007 [ - + ]: 44 : ABI_FREE(xred_old)
1008 [ - + ]: 44 : ABI_FREE(ab_xfh%xfhist)
1009 : :
1010 : : ! if(option == -3)then
1011 : : ! call args_gs_free(args_gs)
1012 : : ! call psps_free(psps)
1013 : : ! do ii = 1,npsp
1014 : : ! call paw_setup_free(paw_setup(ii))
1015 : : ! end do
1016 : : ! ABI_FREE(paw_setup)
1017 : : ! ABI_FREE(ipsp2xml)
1018 : : ! ABI_FREE(pspheads)
1019 : : ! call pawrad_free(pawrad)
1020 : : ! call pawtab_free(pawtab)
1021 : : ! ABI_FREE(pawrad)
1022 : : ! ABI_FREE(pawtab)
1023 : : ! ABI_FREE(npwtot)
1024 : : ! end if
1025 : 44 : call dtset%free()
1026 : 44 : call results_gs%free()
1027 : 44 : call scfcv_destroy(scfcv_args)
1028 : 44 : call destroy_mpi_enreg(mpi_enreg)
1029 : :
1030 : : end if
1031 : :
1032 [ + - + + ]: 3564 : write(message, '(a,(80a),a,a)' ) ch10,('=',ii=1,80),ch10
1033 : 44 : call wrtout(ab_out,message,'COLL')
1034 : 44 : call wrtout(std_out,message,'COLL')
1035 : :
1036 [ - + - + : 88 : end subroutine mover_effpot
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
- - - - -
- - - - -
- - - - -
- - - - -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- - - - -
- - - - -
- - - - -
- - - - -
- + ]
1037 : : !!***
1038 : :
1039 : : !!****f* ABINIT/chksymmetrygroup
1040 : : !! NAME
1041 : : !! checksymmetrygroup
1042 : : !!
1043 : : !! FUNCTION
1044 : : !! Find the ptgroup and symmetry relations (symre,tnons) of crystal by the lattice constants
1045 : : !! rprimd and the reduced coordinates
1046 : : !!
1047 : : !! INPUTS
1048 : : !! rprimd
1049 : : !! xred
1050 : : !! typat
1051 : : !! msym : maximum symmetries defines sizes of symrel and tnons
1052 : : !! natom
1053 : : !!
1054 : : !! OUTPUT
1055 : : !! ptgroupma
1056 : : !! spgroup: index of spacegroup
1057 : : !! symrel(3,3,msym): symmetry relations
1058 : : !! tnons(3,msym): translations
1059 : : !!
1060 : : !! SOURCE
1061 : :
1062 : 1 : subroutine checksymmetrygroup(rprimd,xred,typat,msym,natom,ptgroupma,spgroup,symrel_out,tnons_out,nsym,tolsym)
1063 : :
1064 : : !Arguments ------------------------------------
1065 : : !scalars
1066 : : integer,intent(in) :: msym,natom
1067 : : integer,intent(in) :: typat(natom)
1068 : : integer,intent(out) :: ptgroupma,spgroup,nsym
1069 : : real(dp),intent(inout) :: tolsym
1070 : : ! Arrays
1071 : : real(dp),intent(in) :: rprimd(3,3),xred(3,natom)
1072 : : integer,intent(out) :: symrel_out(3,3,msym)
1073 : : real(dp),intent(out) :: tnons_out(3,msym)
1074 : :
1075 : : !Local variables ---------------------------------------
1076 : : !scalars
1077 : : integer :: nptsym,use_inversion
1078 : : integer :: chkprim
1079 : : ! Arraiys
1080 : 2 : integer :: bravais(11),ptsymrel(3,3,msym)
1081 : 2 : integer :: symafm(msym),symrel(3,3,msym)
1082 : 2 : real(dp) :: gprimd(3,3),spinat(3,natom)
1083 : 1 : real(dp) :: tnons(3,msym)
1084 : : real(dp) :: genafm(3)
1085 : :
1086 : : ! given the acel, rprim and coor
1087 : : ! this suroutine find the symmetry group
1088 [ + + + + ]: 81 : spinat = 0
1089 : 1 : chkprim = 0
1090 : 1 : use_inversion = 0
1091 : :
1092 : : !write(std_out,*) "tolsym", tolsym, "tol3", tol3
1093 : :
1094 : 1 : call symlatt(bravais,std_out,msym,nptsym,ptsymrel,rprimd,tol4)
1095 : : !write(std_out,*) 'nptsym', nptsym
1096 : 1 : call matr3inv(rprimd,gprimd)
1097 : : call symfind(gprimd,msym,natom,nptsym,0,nsym,&
1098 : 1 : & 0,ptsymrel,spinat,symafm,symrel,tnons,tolsym,typat,use_inversion,xred)
1099 : :
1100 : : !write(std_out,*) 'nsym', nsym
1101 : 1 : call symanal(bravais,chkprim,genafm,msym,nsym,ptgroupma,rprimd,spgroup,symafm,symrel,tnons,tol3)
1102 : :
1103 : : !write(std_out,*) 'nsym', nsym
1104 [ + + + + : 4993 : symrel_out = symrel
+ + ]
1105 [ + + + + ]: 1537 : tnons_out = tnons
1106 : :
1107 : 44 : end subroutine checksymmetrygroup
1108 : : !!***
1109 : :
1110 : : end module m_mover_effpot
1111 : : !!***
|