Line data Source code
1 :
2 : !!****m* ABINIT/m_multibinit_main
3 : !! NAME
4 : !! m_multibinit_main
5 : !!
6 : !! FUNCTION
7 : !! Main routine MULTIBINIT.
8 : !!
9 : !! COPYRIGHT
10 : !! Copyright (C) 1999-2026 ABINIT group (AM, hexu)
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 : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt .
15 : !!
16 : !! INPUTS
17 : !! (main routine)
18 : !!
19 : !! OUTPUT
20 : !! (main routine)
21 : !! NOTES
22 : !! Should be
23 : !! 1 moved to somewhere else
24 : !! 2 be replaced with the new implementation multibinit_main2.
25 : !!
26 : !! SOURCE
27 :
28 : #if defined HAVE_CONFIG_H
29 : #include "config.h"
30 : #endif
31 :
32 : #include "abi_common.h"
33 :
34 : ! FIXME: This module is temporarily here. It should be removed once we have the new lattice mover.
35 : ! Move the main calculation part into a subroutine
36 : ! TODO: And this subroutine should be replaced by a one liner then: call multibinit_manager%run_all().
37 : ! TODO: The module is here because it uses lv95_drive mover_effpot (very hacky).
38 : ! TODO: The mover_effpot is in 95_drive due to that it use some >78 level module
39 : ! TODO: which should be changed when we implement the new lattice mover.
40 : module m_multibinit_driver
41 : use defs_basis
42 : use defs_abitypes
43 : use m_xmpi
44 : use m_xomp
45 : use m_abicore
46 : use m_errors
47 :
48 : use m_effective_potential
49 : use m_fit_polynomial_coeff
50 : use m_opt_effpot
51 : use m_multibinit_dataset
52 : use m_effective_potential_file
53 : use m_scup_dataset
54 : !use m_spin_model, only: spin_model_t
55 : use m_abihist
56 :
57 : use m_build_info, only: abinit_version
58 : use m_multibinit_manager, only: mb_manager_t
59 : use m_multibinit_main2, only: multibinit_main2
60 :
61 : use m_mover_effpot, only : mover_effpot
62 : #if defined DEV_MS_SCALEUP
63 : use scup_global
64 : #endif
65 : !use m_generate_training_set, only : generate_training_set
66 : use m_compute_anharmonics, only : compute_anharmonics
67 : use m_init10, only : init10, postfix_fnames
68 : use m_parser, only : instrng
69 : use m_fstrings, only : replace, inupper
70 : use m_dtset, only : chkvars
71 : implicit none
72 : !!***
73 : contains
74 : !!****f* m_multbinit_main/multibinit_main
75 : !!
76 : !! NAME
77 : !! multibinit_main
78 : !!
79 : !! FUNCTION
80 : !! The main function of multibinit
81 : !!
82 : !! INPUTS
83 : !! filnam: The filenames from the files file. 17 files in total.
84 : !!
85 : !! OUTPUT
86 : !!
87 : !! SOURCE
88 67 : subroutine multibinit_main(input_path, filnam, dry_run)
89 : character(len=fnlen), intent(inout) :: input_path
90 : character(len=fnlen), intent(inout) :: filnam(18)
91 : integer, intent(in) :: dry_run
92 67 : type(multibinit_dtset_type), target :: inp
93 7571 : type(effective_potential_type) :: reference_effective_potential, read_effective_potential
94 67 : type(abihist) :: hist, hist_tes
95 :
96 : !type(spin_model_t) :: spin_model
97 : character(len=strlen) :: string, raw_string
98 : character(len=500) :: message
99 : character(len=fnlen) :: name
100 : character(len=fnlen) :: sys_fname
101 :
102 : integer :: filetype,ii,lenstr,iiter,niter
103 : integer :: natom,nph1l,nrpt,ntypat
104 : integer :: option
105 : logical :: need_analyze_anh_pot,need_prt_files
106 :
107 : ! Whether the "new" MULTIBNIT framework should be used.
108 : logical :: need_new_multibinit
109 : ! MS
110 : ! temporary variables for testing SCALE-UP with Multibinit
111 : !Variable to pass to effpot_evaluate routine of multibinit
112 : !To declare evaluation of electronice model
113 : logical :: elec_eval
114 : #if defined DEV_MS_SCALEUP
115 : !Variables needed to call SCALE-UP
116 : logical :: err_init_elec
117 : logical*1 :: needlattice = .FALSE.
118 : logical*1 :: needelectrons = .TRUE.
119 : logical*1 :: didi = .FALSE.
120 : logical*1 :: harm_der = .FALSE.
121 : logical*1 :: initorbocc = .FALSE.
122 : logical*1 :: ismagnetic = .FALSE.
123 : logical*1 :: istddft = .FALSE.
124 : logical*4 :: printgeom = .FALSE.
125 : logical*4 :: printeigv = .FALSE.
126 : logical*4 :: printeltic = .FALSE.
127 : logical*4 :: printorbocc = .FALSE.
128 : integer :: ksamp(3)
129 : real*8 :: tcharge
130 : #endif
131 : !TEST_AM
132 : ! integer :: natom_sp
133 : ! real(dp),allocatable :: dynmat(:,:,:,:,:)
134 : !TEST_AM
135 : !******************************************************************
136 :
137 : integer :: master, my_rank, comm, nproc, ierr
138 : logical :: iam_master
139 :
140 :
141 : !MPI variables
142 67 : master = 0
143 67 : comm = xmpi_world
144 67 : nproc = xmpi_comm_size(comm)
145 67 : my_rank = xmpi_comm_rank(comm)
146 67 : iam_master = (my_rank == master)
147 :
148 : !Read the input file, only to the the name of the file which contains the ddb file or xml file
149 : ! for getting the number of atoms.
150 67 : option=1
151 67 : if (iam_master) then
152 43 : call instrng (filnam(1),lenstr,option,strlen,string,raw_string)
153 : !To make case-insensitive, map characters to upper case:
154 43 : call inupper(string(1:lenstr))
155 : !Check whether the string only contains valid keywords
156 43 : call chkvars(string)
157 : end if
158 67 : call xmpi_bcast(string,master, comm, ierr)
159 67 : call xmpi_bcast(raw_string,master, comm, ierr)
160 67 : call xmpi_bcast(lenstr,master, comm, ierr)
161 : !To automate a maximum calculation, multibinit reads the number of atoms
162 : !in the file (ddb or xml). If DDB file is present in input, the ifc calculation
163 : !will be initilaze array to the maximum of atoms (natifc=natom,atifc=1,natom...) in invars10
164 :
165 :
166 : !Read the input file assuming natom=1 so that the invars10 can work.
167 :
168 : !call invars10(inp,lenstr,natom,string)
169 67 : if(trim(filnam(3)) /='') then
170 67 : sys_fname=filnam(3)
171 : else
172 0 : call invars_multibinit_filenames(string, lenstr, sys_fname=sys_fname)
173 : end if
174 :
175 :
176 :
177 : ! read the reference structure to get natom
178 67 : if (iam_master) then
179 43 : write(message, '(6a)' )' Read the information in the reference structure in ',ch10,&
180 86 : & '-',trim(sys_fname),ch10,' to initialize the multibinit input'
181 43 : call wrtout(ab_out,message,'COLL')
182 43 : call wrtout(std_out,message,'COLL')
183 : end if
184 :
185 67 : call effective_potential_file_getDimSystem(sys_fname,comm,natom,ntypat,nph1l,nrpt)
186 : !call effective_potential_file_getDimSystem(filnam(3),natom,ntypat,nph1l,nrpt)
187 :
188 :
189 : ! read the input again to use the right natom
190 67 : call invars10(inp,lenstr,natom,string)
191 67 : call postfix_fnames(input_path, filnam, inp)
192 :
193 67 : need_new_multibinit= inp%spin_dynamics > 0 .or. inp%lwf_dynamics > 0 .or. inp%dynamics >= 100
194 :
195 67 : if (iam_master) then
196 43 : if(need_new_multibinit) then
197 0 : ABI_ERROR("The new MULTINIT mode should be enabled with --F03 option. ")
198 : end if
199 : ! Echo the inputs to console and main output file
200 43 : call outvars_multibinit(inp,std_out)
201 43 : call outvars_multibinit(inp,ab_out)
202 : end if
203 :
204 67 : if(dry_run/=0) then
205 0 : call wrtout([std_out, ab_out], "Multibinit in dry_run mode. Exiting after input parser")
206 0 : call xmpi_end()
207 : !goto 100
208 : endif
209 :
210 : ! Read the model (from DDB or XML)
211 67 : call effective_potential_file_read(filnam(3),reference_effective_potential,inp,comm)
212 : ! TODO: coeff_file_rw is currently set to 0 as this functionality needs more testing.
213 67 : if (inp%coeff_file_rw==2) then
214 0 : read_effective_potential=reference_effective_potential
215 : !call effective_potential_file_read(filnam(3),read_effective_potential,inp,comm)
216 0 : if(filnam(6)/=''.and.filnam(6)/='no')then
217 0 : call effective_potential_file_getType(filnam(6),filetype)
218 0 : if(filetype==3.or.filetype==23) then
219 0 : call effective_potential_file_read(filnam(6),read_effective_potential,inp,comm)
220 : end if
221 : end if
222 : end if
223 :
224 67 : if(filnam(4)/=''.and.filnam(4)/='no') then
225 24 : call effective_potential_file_getType(filnam(4),filetype)
226 24 : if(filetype==3.or.filetype==23) then
227 24 : call effective_potential_file_read(filnam(4),reference_effective_potential,inp,comm)
228 : else
229 0 : write(message,'(a,(80a),3a)') ch10,('=',ii=1,80),ch10,ch10,&
230 0 : & ' There is no specific file for the coefficients from polynomial fitting'
231 0 : call wrtout(ab_out,message,'COLL')
232 0 : call wrtout(std_out,message,'COLL')
233 : end if
234 : else
235 43 : if(inp%ncoeff/=0) then
236 : write(message, '(5a)' )&
237 0 : & 'ncoeff is specified in the input but,',ch10,&
238 0 : & 'there is no file for the coefficients ',ch10,&
239 0 : & 'Action: add coefficients.xml file'
240 0 : ABI_ERROR(message)
241 :
242 : else
243 3526 : write(message,'(a,(80a),3a)') ch10,('=',ii=1,80),ch10,ch10,&
244 3569 : & ' There is no file for the coefficients from polynomial fitting'
245 43 : call wrtout(ab_out,message,'COLL')
246 43 : call wrtout(std_out,message,'COLL')
247 : end if
248 : end if
249 :
250 : !****************************************************************************************
251 : !SCALE UP Initialize the electronic model (If scale-up is available)
252 : !****************************************************************************************
253 67 : elec_eval = .FALSE.
254 :
255 : #if defined DEV_MS_SCALEUP
256 : if(inp%scup_dtset%scup_elec_model)then
257 : write(message,'(a,(80a),4a)') ch10,('=',ii=1,80),ch10,ch10,&
258 : ' Initializing Electronic Model with SCALE-UP',ch10
259 : call wrtout(ab_out,message,'COLL')
260 : call wrtout(std_out,message,'COLL')
261 :
262 : !Set Variables
263 : elec_eval = .TRUE.
264 : ksamp = inp%scup_dtset%scup_ksamp
265 : tcharge = inp%scup_dtset%scup_tcharge
266 : if(inp%scup_dtset%scup_ismagnetic)ismagnetic=.TRUE.
267 : if(inp%scup_dtset%scup_istddft)istddft=.TRUE.
268 : if(inp%scup_dtset%scup_initorbocc)initorbocc=.TRUE.
269 :
270 : ! Call to Scale-Up
271 : err_init_elec = global_init_model(filnam(3),inp%ncell,needlattice,needelectrons,didi,&
272 : & harm_der,tcharge,ksamp,ismagnetic,istddft,initorbocc)
273 :
274 : !Set Print variables
275 : if(inp%scup_dtset%scup_printgeom)printgeom=.TRUE.
276 : if(inp%scup_dtset%scup_printeigv)printeigv=.TRUE.
277 : if(inp%scup_dtset%scup_printeltic)printeltic=.TRUE.
278 : if(inp%scup_dtset%scup_printorbocc)printorbocc=.TRUE.
279 :
280 : !Set Print Parameters within scaleup
281 : call global_set_print_parameters(printgeom,printeigv,printeltic,printorbocc,&
282 : & inp%scup_dtset%scup_printbands)
283 :
284 : !Set SCF controling variables (values contain defaults, if not specified in the input)
285 : call global_set_scf_parameters(inp%scup_dtset%scup_scfmixing,inp%scup_dtset%scup_scfthresh,&
286 : & inp%scup_dtset%scup_smearing,inp%scup_dtset%scup_maxscfstep,&
287 : & inp%scup_dtset%scup_startpulay,inp%scup_dtset%scup_freezden)
288 :
289 :
290 : !Create kpath if printbands=true and pass it to SCALE UP
291 : if(inp%scup_dtset%scup_printbands)then
292 :
293 : call scup_kpath_new(inp%scup_dtset%scup_speck,&
294 : & reference_effective_potential%supercell%rprimd,&
295 : & inp%scup_dtset%scup_ndivsm,inp%scup_dtset%scup_kpath)
296 : call scup_kpath_print(inp%scup_dtset%scup_kpath)
297 :
298 : call global_set_print_bands(inp%scup_dtset%scup_printbands,&
299 : & inp%scup_dtset%scup_nspeck,inp%scup_dtset%scup_kpath%ndivs,&
300 : & inp%scup_dtset%scup_speck)
301 : endif
302 : endif
303 : #endif
304 :
305 : !****************************************************************************************
306 : ! Compute the third order derivative with finite differences
307 : !****************************************************************************************
308 67 : if (inp%strcpling > 0) then
309 0 : call compute_anharmonics(reference_effective_potential,filnam,inp,comm)
310 : end if
311 : !****************************************************************************************
312 :
313 : ! If needed, fit the anharmonic part and compute the confinement potential
314 : !****************************************************************************************
315 67 : if (inp%fit_coeff/=0.or.inp%confinement==2.or.inp%bound_model/=0 .or. inp%opt_effpot/=0) then
316 :
317 20 : if(iam_master) then
318 : ! Read the MD file
319 984 : write(message,'(a,(80a),7a)')ch10,('=',ii=1,80),ch10,ch10,&
320 12 : & '-Reading the training-set file :',ch10,&
321 996 : & '-',trim(filnam(5)),ch10
322 :
323 12 : call wrtout(std_out,message,'COLL')
324 12 : call wrtout(ab_out,message,'COLL')
325 12 : if(filnam(5)/=''.and.filnam(5)/='no')then
326 12 : call effective_potential_file_readMDfile(filnam(5),hist,option=inp%ts_option)
327 :
328 12 : if (hist%mxhist == 0)then
329 : write(message, '(5a)' )&
330 0 : & 'The trainig-set ',trim(filnam(5)),' file is not correct ',ch10,&
331 0 : & 'Action: add training-set file'
332 0 : ABI_ERROR(message)
333 : end if
334 : else
335 0 : if (inp%fit_coeff/=0) then
336 : write(message, '(3a)' )&
337 0 : & 'There is no training-set file to fit the lattice model ',ch10,&
338 0 : & 'Action: add trainings-set-file'
339 0 : ABI_ERROR(message)
340 0 : else if (inp%bound_model/=0) then
341 : write(message, '(3a)' )&
342 0 : & 'There is no training-set file to bound the model ',ch10,&
343 0 : & 'Action: add training-set file '
344 0 : ABI_ERROR(message)
345 0 : else if(inp%confinement==2) then
346 : write(message, '(3a)' )&
347 0 : & 'There is no training-set file to compute the confinement',ch10,&
348 0 : & 'Action: add training-set file '
349 0 : ABI_ERROR(message)
350 0 : else if(inp%opt_effpot==2) then
351 : write(message, '(3a)' )&
352 0 : & 'There is no training-set file to optimize the latice model',ch10,&
353 0 : & 'Action: add training-set file '
354 0 : ABI_ERROR(message)
355 : end if
356 : end if
357 : end if
358 : ! MPI BROADCAST the history of the MD
359 20 : call abihist_bcast(hist,master,comm)
360 : ! Map the hist in order to be consistent with the supercell into reference_effective_potential
361 20 : call effective_potential_file_mapHistToRef(reference_effective_potential,hist,comm)
362 :
363 : end if
364 :
365 : !TEST_AM
366 : ! call effective_potential_checkDEV(reference_effective_potential,hist,size(hist%xred,2),hist%mxhist)
367 : ! stop
368 : !TEST_AM
369 :
370 : !Generate the confinement polynome (not working yet)
371 67 : if(inp%confinement/=0)then
372 0 : option=inp%confinement
373 0 : select case(option)
374 : case(1)
375 : call effective_potential_setConfinement(inp%conf_cutoff_disp,inp%conf_cutoff_strain,&
376 : & reference_effective_potential,inp%conf_power_fact_disp,&
377 : & inp%conf_power_fact_strain,inp%conf_power_disp,&
378 : & inp%conf_power_disp,inp%conf_power_strain,&
379 0 : & need_confinement=.TRUE.)
380 :
381 0 : write(message,'(a,(80a),3a)') ch10,('=',ii=1,80),ch10,ch10,&
382 0 : & ' The confinement potential is active.'
383 0 : call wrtout(ab_out,message,'COLL')
384 0 : call wrtout(std_out,message,'COLL')
385 :
386 : case(2)
387 0 : write(message,'(a,(80a),3a)') ch10,('=',ii=1,80),ch10,ch10,&
388 0 : & ' The confinement potential is computed from the MD file and actived.'
389 0 : call wrtout(ab_out,message,'COLL')
390 0 : call wrtout(std_out,message,'COLL')
391 :
392 : end select
393 : end if
394 :
395 :
396 : !Fit the coeff
397 67 : if (inp%fit_coeff/=0)then
398 18 : option=inp%fit_coeff
399 18 : if(hist%mxhist >0)then
400 18 : if (option==-1)then
401 : ! option == -1
402 : ! Print the file in the specific format for the script of carlos
403 : ! Born_Charges
404 : ! Dielectric_Tensor
405 : ! harmonic.xml
406 : ! Reference_structure
407 : ! Strain_Tensor
408 : ! symmetry_operations (only cubic)
409 0 : if (iam_master) then
410 0 : call fit_polynomial_printSystemFiles(reference_effective_potential,hist)
411 : end if
412 18 : else if (option==1.or.option==2)then
413 : ! option = 1
414 18 : if(inp%fit_iatom/=0)then
415 : call fit_polynomial_coeff_fit(reference_effective_potential,&
416 : & inp%fit_bancoeff,inp%fit_fixcoeff,hist,inp%fit_generateCoeff,&
417 : & inp%fit_rangePower,inp%fit_nbancoeff,inp%fit_ncoeff,&
418 : & inp%fit_nfixcoeff,inp%fit_nimposecoeff,inp%fit_imposecoeff,&
419 : & option,comm,cutoff_in=inp%fit_cutoff,&
420 : & max_power_strain=inp%fit_SPC_maxS,initialize_data=inp%fit_initializeData==1,&
421 : & fit_tolMSDF=inp%fit_tolMSDF,fit_tolMSDS=inp%fit_tolMSDS,fit_tolMSDE=inp%fit_tolMSDE,&
422 : & fit_tolMSDFS=inp%fit_tolMSDFS,fit_tolGF=inp%fit_tolGF,&
423 : & verbose=.true.,positive=.false.,&
424 : & anharmstr=inp%fit_anhaStrain==1,&
425 : & spcoupling=inp%fit_SPCoupling==1,prt_anh=inp%analyze_anh_pot,&
426 : & fit_iatom=inp%fit_iatom,prt_files=.TRUE.,fit_on=inp%fit_on,sel_on=inp%sel_on,&
427 : & fit_factors=inp%fit_factors,prt_GF_csv=inp%prt_GF_csv,dispterms=inp%fit_dispterms==1,&
428 : & coeff_file_rw=inp%coeff_file_rw,read_effective_potential=read_effective_potential, &
429 : & max_nbody=inp%fit_max_nbody, &
430 8 : & drop_rate=inp%fit_drop_rate, ncoeff_per_cycle=inp%fit_ncoeff_per_cycle, fit_weight_T=inp%fit_weight_T)
431 : else
432 10 : if (inp%fit_ncoeff_per_iatom/=0)then
433 1 : if (mod(inp%fit_ncoeff,inp%fit_ncoeff_per_iatom) /= 0)then
434 0 : write(message,'(2a,I3,2a,I3,3a)') ch10,&
435 0 : & 'fit_ncoeff_per_iatom = ', inp%fit_ncoeff_per_iatom,ch10,&
436 0 : & 'is not a divider of fit_ncoeff = ', inp%fit_ncoeff,ch10,&
437 0 : & 'Action: Change fit_ncoeff and/or fit_ncoeff_per_iatom',ch10
438 0 : ABI_ERROR(message)
439 : endif
440 1 : niter = inp%fit_ncoeff/inp%fit_ncoeff_per_iatom
441 1 : if (mod(niter,reference_effective_potential%crystal%nirredat) /= 0)then
442 0 : write(message,'(2a,I3,2a,I3,2a,I3,3a)') ch10,&
443 0 : & 'fit_ncoeff_per_iatom = ', inp%fit_ncoeff_per_iatom,ch10,&
444 0 : & 'times the number of irreducible atoms = ',reference_effective_potential%crystal%nirredat,ch10,&
445 0 : & 'is not a divider of fit_ncoeff = ', inp%fit_ncoeff,ch10,&
446 0 : & 'Action: Change fit_ncoeff and/or fit_ncoeff_per_iatom',ch10
447 0 : ABI_ERROR(message)
448 : endif
449 1 : niter = niter/reference_effective_potential%crystal%nirredat
450 : else if (inp%fit_ncoeff_per_iatom == 0)then
451 9 : if (mod(inp%fit_ncoeff,reference_effective_potential%crystal%nirredat) /= 0)then
452 0 : write(message,'(2a,I3,2a,I3,3a)') ch10,&
453 0 : & 'The number of irreducible atoms = ',reference_effective_potential%crystal%nirredat,ch10,&
454 0 : & 'is not a divider of fit_ncoeff = ', inp%fit_ncoeff,ch10,&
455 0 : & 'Action: Change fit_ncoeff',ch10
456 0 : ABI_ERROR(message)
457 : endif
458 9 : inp%fit_ncoeff_per_iatom = inp%fit_ncoeff/reference_effective_potential%crystal%nirredat
459 9 : niter = 1
460 : endif
461 820 : write(message,'(a,(80a),7a,I3,3a,I3,3a,I3,3a,I3,2a)') ch10,('=',ii=1,80),ch10,ch10,&
462 10 : & ' Starting Fit Iterations ',ch10,&
463 10 : & ' ----------------------- ',ch10,&
464 10 : & ' Select in total fit_ncoeff = ', inp%fit_ncoeff,' coefficients',ch10,&
465 10 : & ' In ', niter,' iterations',ch10,&
466 10 : & ' Over ', reference_effective_potential%crystal%nirredat, ' irreducible atoms',ch10,&
467 830 : & ' Selecting ', inp%fit_ncoeff_per_iatom, ' coefficients per atom in each iteration',ch10
468 10 : call wrtout(std_out,message,'COLL')
469 10 : call wrtout(ab_out,message,'COLL')
470 10 : need_prt_files=.FALSE.
471 20 : do iiter=1,niter
472 820 : write(message,'(a,(80a),3a,I3,a,I3,2a)') ch10,('-',ii=1,80),ch10,ch10,&
473 830 : & ' Start Iteration (',iiter,'/',niter,')',ch10
474 10 : call wrtout(std_out,message,'COLL')
475 10 : call wrtout(ab_out,message,'COLL')
476 50 : do ii=1,reference_effective_potential%crystal%nirredat
477 30 : if(ii == reference_effective_potential%crystal%nirredat .and. iiter==niter)need_prt_files=.TRUE.
478 30 : if(ii > 1 .or. iiter > 1)inp%fit_nfixcoeff = -1
479 : call fit_polynomial_coeff_fit(reference_effective_potential,&
480 : & inp%fit_bancoeff,inp%fit_fixcoeff,hist,inp%fit_generateCoeff,&
481 : & inp%fit_rangePower,inp%fit_nbancoeff,inp%fit_ncoeff_per_iatom,&
482 : & inp%fit_nfixcoeff,inp%fit_nimposecoeff,inp%fit_imposecoeff,&
483 : & option,comm,cutoff_in=inp%fit_cutoff,&
484 : & max_power_strain=inp%fit_SPC_maxS,initialize_data=inp%fit_initializeData==1,&
485 : & fit_tolMSDF=inp%fit_tolMSDF,fit_tolMSDS=inp%fit_tolMSDS,fit_tolMSDE=inp%fit_tolMSDE,&
486 : & fit_tolMSDFS=inp%fit_tolMSDFS,fit_tolGF=inp%fit_tolGF,&
487 : & verbose=.true.,positive=.false.,&
488 : & anharmstr=inp%fit_anhaStrain==1,&
489 : & spcoupling=inp%fit_SPCoupling==1,prt_anh=inp%analyze_anh_pot,&
490 : & fit_iatom=reference_effective_potential%crystal%irredatindx(ii),&
491 : & prt_files=need_prt_files,fit_on=inp%fit_on,sel_on=inp%sel_on,&
492 : & fit_factors=inp%fit_factors,prt_GF_csv=inp%prt_GF_csv,dispterms=inp%fit_dispterms==1, &
493 : & coeff_file_rw=inp%coeff_file_rw,read_effective_potential=read_effective_potential, &
494 : & max_nbody=inp%fit_max_nbody, &
495 40 : & drop_rate=inp%fit_drop_rate, ncoeff_per_cycle=inp%fit_ncoeff_per_cycle, fit_weight_T=inp%fit_weight_T)
496 : enddo
497 : enddo
498 : endif
499 : end if
500 : else
501 : write(message, '(3a)' )&
502 0 : & 'There is no step in the MD file ',ch10,&
503 0 : & 'Action: add correct MD file'
504 0 : ABI_ERROR(message)
505 : end if
506 : end if
507 :
508 :
509 : !try to bound the model with mover_effpot
510 : !we need to use the molecular dynamics
511 67 : if(inp%bound_model>0.and.inp%bound_model<=2)then
512 0 : call mover_effpot(inp,filnam,reference_effective_potential,-1*inp%bound_model,comm,hist=hist)
513 : !Marcus: New option for bound_model: use optimize routine for generting specific high order terms
514 67 : elseif(inp%bound_model == 3)then
515 82 : write(message,'(a,(80a),4a)')ch10,('=',ii=1,80),ch10,ch10,&
516 83 : & 'Bound Process 3: Generate equivalent high order terms',ch10
517 1 : call wrtout(std_out,message,'COLL')
518 1 : call wrtout(ab_out,message,'COLL')
519 :
520 : call opt_effpotbound(reference_effective_potential,inp%bound_rangePower,hist, inp%bound_EFS,&
521 1 : & inp%bound_factors,inp%bound_penalty,comm, fit_weight_T=inp%fit_weight_T, bound_option=inp%bound_option)
522 :
523 : end if
524 :
525 : !****************************************************************************************
526 : ! OPTIMIZE SECTION, Optimize selected coefficients of effective potential while
527 : ! keeping the others constant
528 : !****************************************************************************************
529 :
530 67 : if(inp%opt_effpot == 1)then
531 82 : write(message,'(a,(80a),4a)')ch10,('=',ii=1,80),ch10,ch10,&
532 83 : & 'Optimizing Effective Potential',ch10
533 :
534 1 : call wrtout(std_out,message,'COLL')
535 1 : call wrtout(ab_out,message,'COLL')
536 :
537 1 : need_analyze_anh_pot = .FALSE.
538 1 : if(inp%analyze_anh_pot == 1) need_analyze_anh_pot = .TRUE.
539 :
540 : call opt_effpot(reference_effective_potential,inp%opt_ncoeff,inp%opt_coeff,hist,inp%opt_on,&
541 1 : & inp%opt_factors,comm,fit_weight_T=inp%fit_weight_T, print_anh=need_analyze_anh_pot)
542 : end if
543 :
544 :
545 :
546 : !****************************************************************************************
547 : ! TEST SECTION test effective potential with regard to test-set
548 : !****************************************************************************************
549 67 : if(inp%test_effpot == 1)then
550 1 : if(iam_master) then
551 : ! Read the test-set .nc file
552 82 : write(message,'(a,(80a),9a)')ch10,('=',ii=1,80),ch10,ch10,&
553 1 : & 'TEST - SET Option',ch10,&
554 1 : & '-Reading the test-set file :',ch10,&
555 83 : & '-',trim(filnam(6)),ch10
556 :
557 1 : call wrtout(std_out,message,'COLL')
558 1 : call wrtout(ab_out,message,'COLL')
559 1 : if(filnam(6)/=''.and.filnam(6)/='no')then
560 1 : call effective_potential_file_readMDfile(filnam(6),hist_tes,option=inp%ts_option)
561 1 : if (hist_tes%mxhist == 0)then
562 : write(message, '(5a)' )&
563 0 : & 'The test-set ',trim(filnam(6)),' file is empty ',ch10,&
564 0 : & 'Action: add non-empty test-set'
565 0 : ABI_ERROR(message)
566 : end if
567 : else
568 : write(message, '(3a)' )&
569 0 : & 'There is no test-set file ',ch10,&
570 0 : & 'Action: add test-set file'
571 0 : ABI_ERROR(message)
572 : end if
573 : end if
574 : ! MPI BROADCAST the history of the MD
575 1 : call abihist_bcast(hist_tes,master,comm)
576 : ! Map the hist in order to be consistent with the supercell into reference_effective_potential
577 1 : call effective_potential_file_mapHistToRef(reference_effective_potential,hist_tes,comm)
578 : ! Initialize if to print anharmonic contribution to energy or not
579 1 : need_analyze_anh_pot = .FALSE.
580 1 : if(inp%analyze_anh_pot == 1) need_analyze_anh_pot = .TRUE.
581 : ! Call to test routine
582 : call fit_polynomial_coeff_testEffPot(reference_effective_potential,hist_tes,master,comm,&
583 : & print_anharmonic=need_analyze_anh_pot,scup_dtset=inp%scup_dtset,&
584 1 : & prt_ph=inp%test_prt_ph)
585 :
586 :
587 :
588 : end if ! End if(inp%test_effpot == 1)then
589 :
590 : !TEST_AM
591 : !Effective Hamiltonian, compute the energy for given patern
592 : ! call mover_effpot(inp,filnam,reference_effective_potential,-2,comm,hist=hist)
593 : !TEST_AM
594 :
595 : !****************************************************************************************
596 :
597 : !****************************************************************************************
598 : !Print the effective potential system + coefficients (only master CPU)
599 67 : if(iam_master) then
600 43 : if (inp%prt_model >= 1) then
601 29 : write(message, '(a,(80a),a)' ) ch10,&
602 2349 : & ('=',ii=1,80)
603 29 : call wrtout(ab_out,message,'COLL')
604 29 : call wrtout(std_out,message,'COLL')
605 : !name = replace(trim(filnam(2)),".out","")
606 : ! Assume new .abo convention
607 29 : name = replace(trim(filnam(2)),".abo","")
608 : call effective_potential_writeXML(reference_effective_potential,inp%prt_model,filename=name,&
609 29 : & prt_dipdip=inp%dipdip_prt==1)
610 14 : else if (inp%prt_model == -2)then
611 : ! NetCDF case, in progress
612 0 : name = trim(filnam(2))//"_sys.nc"
613 0 : call effective_potential_writeNETCDF(reference_effective_potential,1,filename=name)
614 : end if
615 : end if
616 : !****************************************************************************************
617 :
618 : !TEST_AM SECTION
619 : ! Print the Phonon dos/spectrum
620 : ! if(inp%prt_phfrq > 0) then
621 : ! call effective_potential_printPDOS(reference_effective_potential,filnam(2),&
622 : !& inp%ncell,inp%nph1l,inp%prt_phfrq,inp%qph1l)
623 : ! end if
624 :
625 : !Intialisation of the effective potential type
626 : ! call effective_potential_file_read(filnam(4),reference_effective_potential,inp,comm)
627 : ! name = "test.xml"
628 : ! call effective_potential_writeXML(reference_effective_potential,1,filename=name)
629 : ! just for TEST
630 : ! if(inp%prt_phfrq > 0) then
631 : ! natom_sp = reference_effective_potential%supercell%natom_supercell
632 : ! ABI_MALLOC(dynmat,(2,3,natom_sp,3,natom_sp))
633 : ! call effective_potential_effpot2dynmat(dynmat,inp%delta_df,reference_effective_potential,&
634 : ! & reference_effective_potential%supercell%natom_supercell,&
635 : ! & int(reference_effective_potential%supercell%qphon),3)
636 :
637 : ! ABI_FREE(dynmat)
638 : ! end if
639 : ! end if
640 : !TEST_AM SECTION
641 :
642 :
643 : ! Run lattice dynamics (relaxation or molecular dynamics, most of abinits ionmovs are allowed)
644 : !****************************************************************************************
645 67 : if(inp%dynamics>=1) then
646 44 : call mover_effpot(inp,filnam,reference_effective_potential,inp%dynamics,comm)
647 : end if
648 :
649 : !****************************************************************************************
650 :
651 :
652 :
653 : !Free the effective_potential and dataset
654 : !****************************************************************************************
655 67 : call effective_potential_free(reference_effective_potential)
656 67 : call multibinit_dtset_free(inp)
657 67 : call abihist_free(hist)
658 67 : call abihist_free(hist_tes)
659 : !****************************************************************************************
660 :
661 67 : end subroutine multibinit_main
662 : !!***
663 :
664 : end module m_multibinit_driver
|