45#include "../base/base_uses.f90"
64 SUBROUTINE cp_eval_at(gopt_env, x, f, gradient, master, &
65 final_evaluation, para_env)
71 TYPE(gopt_f_type),
POINTER :: gopt_env
72 REAL(KIND=
dp),
DIMENSION(:),
POINTER :: x
73 REAL(KIND=
dp),
INTENT(out),
OPTIONAL :: f
74 REAL(KIND=
dp),
DIMENSION(:),
OPTIONAL, &
76 INTEGER,
INTENT(IN) :: master
77 LOGICAL,
INTENT(IN),
OPTIONAL :: final_evaluation
78 TYPE(mp_para_env_type),
POINTER :: para_env
84 LOGICAL,
PRIVATE,
PARAMETER :: debug_this_module = .true.
85 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'cp_lbfgs_optimizer_gopt'
164 CHARACTER(len=60) :: task =
""
165 CHARACTER(len=60) :: csave =
""
166 LOGICAL :: lsave(4) = .false.
167 INTEGER :: m = 0, print_every = 0, master = 0, max_f_per_iter = 0, status = 0, n_iter = 0
168 INTEGER,
DIMENSION(:),
POINTER :: kind_of_bound => null(), i_work_array => null(), isave => null()
169 REAL(kind=dp) :: f = 0.0_dp, wanted_relative_f_delta = 0.0_dp, wanted_projected_gradient = 0.0_dp, &
170 last_f = 0.0_dp, projected_gradient = 0.0_dp, eold = 0.0_dp, emin = 0.0_dp, trust_radius = 0.0_dp
171 REAL(kind=dp),
DIMENSION(:),
POINTER :: x => null(), lower_bound => null(), upper_bound => null(), &
172 gradient => null(), dsave => null(), work_array => null()
173 TYPE(mp_para_env_type),
POINTER :: para_env => null()
174 TYPE(gopt_f_type),
POINTER :: obj_funct => null()
203 wanted_relative_f_delta, wanted_projected_gradient, lower_bound, upper_bound, &
204 kind_of_bound, master, max_f_per_iter, trust_radius)
206 TYPE(mp_para_env_type),
POINTER :: para_env
207 TYPE(gopt_f_type),
POINTER :: obj_funct
208 REAL(kind=dp),
DIMENSION(:),
INTENT(in) :: x0
209 INTEGER,
INTENT(in),
OPTIONAL :: m, print_every
210 REAL(kind=dp),
INTENT(in),
OPTIONAL :: wanted_relative_f_delta, &
211 wanted_projected_gradient
212 REAL(kind=dp),
DIMENSION(SIZE(x0)),
INTENT(in), &
213 OPTIONAL :: lower_bound, upper_bound
214 INTEGER,
DIMENSION(SIZE(x0)),
INTENT(in),
OPTIONAL :: kind_of_bound
215 INTEGER,
INTENT(in),
OPTIONAL :: master, max_f_per_iter
216 REAL(kind=dp),
INTENT(in),
OPTIONAL :: trust_radius
218 CHARACTER(len=*),
PARAMETER :: routinen =
'cp_opt_gopt_create'
220 INTEGER :: handle, lenwa, n
222 CALL timeset(routinen, handle)
224 NULLIFY (optimizer%kind_of_bound, &
225 optimizer%i_work_array, &
228 optimizer%lower_bound, &
229 optimizer%upper_bound, &
230 optimizer%gradient, &
232 optimizer%work_array, &
233 optimizer%para_env, &
237 IF (
PRESENT(m)) optimizer%m = m
238 optimizer%master = para_env%source
239 optimizer%para_env => para_env
240 CALL para_env%retain()
241 optimizer%obj_funct => obj_funct
242 CALL gopt_f_retain(obj_funct)
243 optimizer%max_f_per_iter = 20
244 IF (
PRESENT(max_f_per_iter)) optimizer%max_f_per_iter = max_f_per_iter
245 optimizer%print_every = -1
247 optimizer%f = -1.0_dp
248 optimizer%last_f = -1.0_dp
249 optimizer%projected_gradient = -1.0_dp
250 IF (
PRESENT(print_every)) optimizer%print_every = print_every
251 IF (
PRESENT(master)) optimizer%master = master
252 IF (optimizer%master == optimizer%para_env%mepos)
THEN
254 lenwa = 2*optimizer%m*n + 5*n + 11*optimizer%m*optimizer%m + 8*optimizer%m
255 ALLOCATE (optimizer%kind_of_bound(n), optimizer%i_work_array(3*n), &
257 ALLOCATE (optimizer%x(n), optimizer%lower_bound(n), &
258 optimizer%upper_bound(n), optimizer%gradient(n), &
259 optimizer%dsave(29), optimizer%work_array(lenwa))
261 optimizer%task =
'START'
262 optimizer%i_work_array = 0
264 optimizer%lower_bound = 0.0_dp
265 optimizer%upper_bound = 0.0_dp
266 optimizer%gradient = 0.0_dp
267 optimizer%dsave = 0.0_dp
268 optimizer%work_array = 0.0_dp
269 IF (
PRESENT(wanted_relative_f_delta)) &
270 optimizer%wanted_relative_f_delta = wanted_relative_f_delta
271 IF (
PRESENT(wanted_projected_gradient)) &
272 optimizer%wanted_projected_gradient = wanted_projected_gradient
273 optimizer%kind_of_bound = 0
274 IF (
PRESENT(kind_of_bound)) optimizer%kind_of_bound = kind_of_bound
275 IF (
PRESENT(lower_bound)) optimizer%lower_bound = lower_bound
276 IF (
PRESENT(upper_bound)) optimizer%upper_bound = upper_bound
277 IF (
PRESENT(trust_radius)) optimizer%trust_radius = trust_radius
279 CALL setulb(
SIZE(optimizer%x), optimizer%m, optimizer%x, &
280 optimizer%lower_bound, optimizer%upper_bound, &
281 optimizer%kind_of_bound, optimizer%f, optimizer%gradient, &
282 optimizer%wanted_relative_f_delta, &
283 optimizer%wanted_projected_gradient, optimizer%work_array, &
284 optimizer%i_work_array, optimizer%task, optimizer%print_every, &
285 optimizer%csave, optimizer%lsave, optimizer%isave, &
286 optimizer%dsave, optimizer%trust_radius)
289 optimizer%kind_of_bound, optimizer%i_work_array, optimizer%isave, &
290 optimizer%lower_bound, optimizer%upper_bound, optimizer%gradient, &
291 optimizer%dsave, optimizer%work_array)
292 ALLOCATE (optimizer%x(n))
293 optimizer%x(:) = 0.0_dp
294 ALLOCATE (optimizer%gradient(n))
295 optimizer%gradient(:) = 0.0_dp
297 CALL optimizer%para_env%bcast(optimizer%x, optimizer%master)
300 CALL timestop(handle)
315 CHARACTER(len=*),
PARAMETER :: routinen =
'cp_opt_gopt_release'
319 CALL timeset(routinen, handle)
321 IF (
ASSOCIATED(optimizer%kind_of_bound))
THEN
322 DEALLOCATE (optimizer%kind_of_bound)
324 IF (
ASSOCIATED(optimizer%i_work_array))
THEN
325 DEALLOCATE (optimizer%i_work_array)
327 IF (
ASSOCIATED(optimizer%isave))
THEN
328 DEALLOCATE (optimizer%isave)
330 IF (
ASSOCIATED(optimizer%x))
THEN
331 DEALLOCATE (optimizer%x)
333 IF (
ASSOCIATED(optimizer%lower_bound))
THEN
334 DEALLOCATE (optimizer%lower_bound)
336 IF (
ASSOCIATED(optimizer%upper_bound))
THEN
337 DEALLOCATE (optimizer%upper_bound)
339 IF (
ASSOCIATED(optimizer%gradient))
THEN
340 DEALLOCATE (optimizer%gradient)
342 IF (
ASSOCIATED(optimizer%dsave))
THEN
343 DEALLOCATE (optimizer%dsave)
345 IF (
ASSOCIATED(optimizer%work_array))
THEN
346 DEALLOCATE (optimizer%work_array)
348 CALL mp_para_env_release(optimizer%para_env)
349 CALL gopt_f_release(optimizer%obj_funct)
351 CALL timestop(handle)
382 SUBROUTINE cp_opt_gopt_get(optimizer, para_env, &
383 obj_funct, m, print_every, &
384 wanted_relative_f_delta, wanted_projected_gradient, &
385 x, lower_bound, upper_bound, kind_of_bound, master, &
386 actual_projected_gradient, &
387 n_var, n_iter, status, max_f_per_iter, at_end, &
388 is_master, last_f, f)
390 TYPE(mp_para_env_type),
OPTIONAL,
POINTER :: para_env
391 TYPE(gopt_f_type),
OPTIONAL,
POINTER :: obj_funct
392 INTEGER,
INTENT(out),
OPTIONAL :: m, print_every
393 REAL(kind=dp),
INTENT(out),
OPTIONAL :: wanted_relative_f_delta, &
394 wanted_projected_gradient
395 REAL(kind=dp),
DIMENSION(:),
OPTIONAL,
POINTER :: x, lower_bound, upper_bound
396 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: kind_of_bound
397 INTEGER,
INTENT(out),
OPTIONAL :: master
398 REAL(kind=dp),
INTENT(out),
OPTIONAL :: actual_projected_gradient
399 INTEGER,
INTENT(out),
OPTIONAL :: n_var, n_iter, status, max_f_per_iter
400 LOGICAL,
INTENT(out),
OPTIONAL :: at_end, is_master
401 REAL(kind=dp),
INTENT(out),
OPTIONAL :: last_f, f
403 IF (
PRESENT(is_master)) is_master = optimizer%master == optimizer%para_env%mepos
404 IF (
PRESENT(master)) master = optimizer%master
405 IF (
PRESENT(status)) status = optimizer%status
406 IF (
PRESENT(para_env)) para_env => optimizer%para_env
407 IF (
PRESENT(obj_funct)) obj_funct = optimizer%obj_funct
408 IF (
PRESENT(m)) m = optimizer%m
409 IF (
PRESENT(max_f_per_iter)) max_f_per_iter = optimizer%max_f_per_iter
410 IF (
PRESENT(wanted_projected_gradient)) &
411 wanted_projected_gradient = optimizer%wanted_projected_gradient
412 IF (
PRESENT(wanted_relative_f_delta)) &
413 wanted_relative_f_delta = optimizer%wanted_relative_f_delta
414 IF (
PRESENT(print_every)) print_every = optimizer%print_every
415 IF (
PRESENT(x)) x => optimizer%x
416 IF (
PRESENT(n_var)) n_var =
SIZE(x)
417 IF (
PRESENT(lower_bound)) lower_bound => optimizer%lower_bound
418 IF (
PRESENT(upper_bound)) upper_bound => optimizer%upper_bound
419 IF (
PRESENT(kind_of_bound)) kind_of_bound => optimizer%kind_of_bound
420 IF (
PRESENT(n_iter)) n_iter = optimizer%n_iter
421 IF (
PRESENT(last_f)) last_f = optimizer%last_f
422 IF (
PRESENT(f)) f = optimizer%f
423 IF (
PRESENT(at_end)) at_end = optimizer%status > 3
424 IF (
PRESENT(actual_projected_gradient)) &
425 actual_projected_gradient = optimizer%projected_gradient
426 IF (optimizer%master == optimizer%para_env%mepos)
THEN
427 IF (optimizer%isave(30) > 1 .AND. (optimizer%task(1:5) ==
"NEW_X" .OR. &
428 optimizer%task(1:4) ==
"STOP" .AND. optimizer%task(7:9) ==
"CPU"))
THEN
430 IF (
PRESENT(last_f)) last_f = optimizer%dsave(2)
431 IF (
PRESENT(actual_projected_gradient)) &
432 actual_projected_gradient = optimizer%dsave(13)
434 cpassert(.NOT.
PRESENT(last_f))
435 cpassert(.NOT.
PRESENT(actual_projected_gradient))
437 ELSE IF (
PRESENT(lower_bound) .OR.
PRESENT(upper_bound) .OR.
PRESENT(kind_of_bound))
THEN
438 cpwarn(
"asked undefined types")
441 END SUBROUTINE cp_opt_gopt_get
462 SUBROUTINE cp_opt_gopt_step(optimizer, n_iter, f, last_f, &
463 projected_gradient, converged, geo_section, force_env, &
466 INTEGER,
INTENT(out),
OPTIONAL :: n_iter
467 REAL(kind=dp),
INTENT(out),
OPTIONAL :: f, last_f, projected_gradient
468 LOGICAL,
INTENT(out),
OPTIONAL :: converged
472 TYPE(
spgr_type),
OPTIONAL,
POINTER :: spgr
474 CHARACTER(len=*),
PARAMETER :: routinen =
'cp_opt_gopt_step'
476 CHARACTER(LEN=5) :: wildcard
477 INTEGER :: dataunit, handle, its
478 LOGICAL :: conv, is_master, justentred, &
480 REAL(kind=dp) :: t_diff, t_now, t_old
481 REAL(kind=dp),
DIMENSION(:),
POINTER :: xold
485 NULLIFY (logger, xold)
487 CALL timeset(routinen, handle)
489 is_master = optimizer%master == optimizer%para_env%mepos
490 IF (
PRESENT(converged)) converged = optimizer%status == 4
491 ALLOCATE (xold(
SIZE(optimizer%x)))
496 keep_space_group = .false.
497 IF (
PRESENT(spgr))
THEN
498 IF (
ASSOCIATED(spgr)) keep_space_group = spgr%keep_space_group
502 IF (keep_space_group)
THEN
509 IF (optimizer%status >= 4)
THEN
510 cpwarn(
"status>=4, trying to restart")
513 "PRINT%PROGRAM_RUN_INFO", extension=
".geoLog")
515 optimizer%task =
'START'
516 CALL setulb(
SIZE(optimizer%x), optimizer%m, optimizer%x, &
517 optimizer%lower_bound, optimizer%upper_bound, &
518 optimizer%kind_of_bound, optimizer%f, optimizer%gradient, &
519 optimizer%wanted_relative_f_delta, &
520 optimizer%wanted_projected_gradient, optimizer%work_array, &
521 optimizer%i_work_array, optimizer%task, optimizer%print_every, &
522 optimizer%csave, optimizer%lsave, optimizer%isave, &
523 optimizer%dsave, optimizer%trust_radius, spgr=spgr, iwunit=dataunit)
526 "PRINT%PROGRAM_RUN_INFO")
531 "PRINT%PROGRAM_RUN_INFO", extension=
".geoLog")
532 ifmaster:
IF (is_master)
THEN
533 IF (optimizer%task(1:7) ==
'RESTART')
THEN
536 optimizer%task =
'START'
538 IF (keep_space_group)
THEN
542 CALL setulb(
SIZE(optimizer%x), optimizer%m, optimizer%x, &
543 optimizer%lower_bound, optimizer%upper_bound, &
544 optimizer%kind_of_bound, optimizer%f, optimizer%gradient, &
545 optimizer%wanted_relative_f_delta, &
546 optimizer%wanted_projected_gradient, optimizer%work_array, &
547 optimizer%i_work_array, optimizer%task, optimizer%print_every, &
548 optimizer%csave, optimizer%lsave, optimizer%isave, &
549 optimizer%dsave, optimizer%trust_radius, spgr=spgr, iwunit=dataunit)
550 IF (keep_space_group)
THEN
555 IF (optimizer%task(1:2) ==
'FG')
THEN
556 IF (optimizer%isave(36) > optimizer%max_f_per_iter)
THEN
557 optimizer%task =
'STOP: CPU, hit max f eval in iter'
559 CALL setulb(
SIZE(optimizer%x), optimizer%m, optimizer%x, &
560 optimizer%lower_bound, optimizer%upper_bound, &
561 optimizer%kind_of_bound, optimizer%f, optimizer%gradient, &
562 optimizer%wanted_relative_f_delta, &
563 optimizer%wanted_projected_gradient, optimizer%work_array, &
564 optimizer%i_work_array, optimizer%task, optimizer%print_every, &
565 optimizer%csave, optimizer%lsave, optimizer%isave, &
566 optimizer%dsave, optimizer%trust_radius, spgr=spgr, iwunit=dataunit)
570 ELSE IF (optimizer%task(1:5) ==
'NEW_X')
THEN
574 IF (keep_space_group)
THEN
578 CALL setulb(
SIZE(optimizer%x), optimizer%m, optimizer%x, &
579 optimizer%lower_bound, optimizer%upper_bound, &
580 optimizer%kind_of_bound, optimizer%f, optimizer%gradient, &
581 optimizer%wanted_relative_f_delta, &
582 optimizer%wanted_projected_gradient, optimizer%work_array, &
583 optimizer%i_work_array, optimizer%task, optimizer%print_every, &
584 optimizer%csave, optimizer%lsave, optimizer%isave, &
585 optimizer%dsave, optimizer%trust_radius, spgr=spgr, iwunit=dataunit)
586 IF (keep_space_group)
THEN
592 IF (keep_space_group)
THEN
598 ELSE IF (optimizer%task(1:4) ==
'CONV')
THEN
600 ELSE IF (optimizer%task(1:4) ==
'STOP')
THEN
602 cpwarn(
"task became stop in an unknown way")
603 ELSE IF (optimizer%task(1:5) ==
'ERROR')
THEN
606 cpwarn(
"unknown task '"//optimizer%task//
"'")
610 "PRINT%PROGRAM_RUN_INFO")
611 CALL optimizer%para_env%bcast(optimizer%status, optimizer%master)
613 IF (optimizer%status == 3)
THEN
617 its = optimizer%isave(30)
621 SELECT CASE (optimizer%status)
624 CALL cp_eval_at(optimizer%obj_funct, x=optimizer%x, &
626 gradient=optimizer%gradient, &
627 final_evaluation=.false., &
628 master=optimizer%master, para_env=optimizer%para_env)
631 "PRINT%PROGRAM_RUN_INFO", extension=
".geoLog")
634 IF (keep_space_group)
THEN
638 CALL setulb(
SIZE(optimizer%x), optimizer%m, optimizer%x, &
639 optimizer%lower_bound, optimizer%upper_bound, &
640 optimizer%kind_of_bound, optimizer%f, optimizer%gradient, &
641 optimizer%wanted_relative_f_delta, &
642 optimizer%wanted_projected_gradient, optimizer%work_array, &
643 optimizer%i_work_array, optimizer%task, optimizer%print_every, &
644 optimizer%csave, optimizer%lsave, optimizer%isave, &
645 optimizer%dsave, optimizer%trust_radius, spgr=spgr, iwunit=dataunit)
646 IF (keep_space_group)
THEN
652 "PRINT%PROGRAM_RUN_INFO")
653 CALL optimizer%para_env%bcast(optimizer%x, optimizer%master)
656 CALL optimizer%para_env%bcast(optimizer%x, optimizer%master)
662 "PRINT%PROGRAM_RUN_INFO", extension=
".geoLog")
663 IF (is_master) its = optimizer%isave(30)
664 CALL optimizer%para_env%bcast(its, optimizer%master)
668 t_diff = t_now - t_old
670 CALL gopt_f_io(optimizer%obj_funct, force_env, force_env%root_section, &
671 its, optimizer%f, dataunit, optimizer%eold, optimizer%emin, wildcard, gopt_param, &
672 SIZE(optimizer%x), optimizer%x - xold, optimizer%gradient, conv, used_time=t_diff)
673 CALL optimizer%para_env%bcast(conv, optimizer%master)
675 "PRINT%PROGRAM_RUN_INFO")
676 optimizer%eold = optimizer%f
677 optimizer%emin = min(optimizer%emin, optimizer%eold)
679 IF (
PRESENT(converged)) converged = conv
686 "PRINT%PROGRAM_RUN_INFO", extension=
".geoLog")
687 IF (dataunit > 0)
THEN
688 WRITE (dataunit,
'(T2,A)')
""
689 WRITE (dataunit,
'(T2,A)')
"************************************************"
690 WRITE (dataunit,
'(T2,A)')
"* Specific L-BFGS convergence criteria *"
691 WRITE (dataunit,
'(T2,A)')
"* WANTED_PROJ_GRADIENT and WANTED_REL_F_ERROR *"
692 WRITE (dataunit,
'(T2,A)')
"* satisfied .... run CONVERGED! *"
693 WRITE (dataunit,
'(T2,A)')
"* * * * *"
694 WRITE (dataunit,
'(T2,A)')
"* General convergence criteria on stepsize and *"
695 WRITE (dataunit,
'(T2,A)')
"* gradients may or may not have been satisfied *"
696 WRITE (dataunit,
'(T2,A)')
"* yet; if unsatisfactory, try tightening the *"
697 WRITE (dataunit,
'(T2,A)')
"* L-BFGS convergence criteria and restart run. *"
698 WRITE (dataunit,
'(T2,A)')
"************************************************"
699 WRITE (dataunit,
'(T2,A)')
""
702 "PRINT%PROGRAM_RUN_INFO")
703 IF (
PRESENT(converged)) converged = .true.
707 CALL optimizer%para_env%bcast(optimizer%task, optimizer%master)
710 cpabort(
"step on a deallocated opt structure ")
712 CALL cp_abort(__location__, &
717 IF (optimizer%status == 1 .AND. justentred)
THEN
718 optimizer%eold = optimizer%f
719 optimizer%emin = optimizer%eold
724 CALL optimizer%para_env%bcast(optimizer%x, optimizer%master)
725 CALL cp_opt_gopt_bcast_res(optimizer, &
726 n_iter=optimizer%n_iter, &
727 f=optimizer%f, last_f=optimizer%last_f, &
728 projected_gradient=optimizer%projected_gradient)
731 IF (
PRESENT(f)) f = optimizer%f
732 IF (
PRESENT(last_f)) last_f = optimizer%last_f
733 IF (
PRESENT(projected_gradient)) &
734 projected_gradient = optimizer%projected_gradient
735 IF (
PRESENT(n_iter)) n_iter = optimizer%n_iter
736 CALL timestop(handle)
738 END SUBROUTINE cp_opt_gopt_step
754 SUBROUTINE cp_opt_gopt_bcast_res(optimizer, n_iter, f, last_f, &
757 INTEGER,
INTENT(out),
OPTIONAL :: n_iter
758 REAL(kind=dp),
INTENT(inout),
OPTIONAL :: f, last_f, projected_gradient
760 REAL(kind=dp),
DIMENSION(4) :: results
762 IF (optimizer%master == optimizer%para_env%mepos)
THEN
763 results = [real(optimizer%isave(30), kind=dp), &
764 optimizer%f, optimizer%dsave(2), optimizer%dsave(13)]
766 CALL optimizer%para_env%bcast(results, optimizer%master)
767 IF (
PRESENT(n_iter)) n_iter = nint(results(1))
768 IF (
PRESENT(f)) f = results(2)
769 IF (
PRESENT(last_f)) last_f = results(3)
770 IF (
PRESENT(projected_gradient)) &
771 projected_gradient = results(4)
773 END SUBROUTINE cp_opt_gopt_bcast_res
797 projected_gradient, converged, geo_section, force_env, &
798 gopt_param, spgr)
RESULT(res)
800 INTEGER,
INTENT(out),
OPTIONAL :: n_iter
801 REAL(kind=dp),
INTENT(out),
OPTIONAL :: f, last_f, projected_gradient
802 LOGICAL,
INTENT(out) :: converged
806 TYPE(
spgr_type),
OPTIONAL,
POINTER :: spgr
810 CALL cp_opt_gopt_step(optimizer, n_iter=n_iter, f=f, &
811 last_f=last_f, projected_gradient=projected_gradient, &
812 converged=converged, geo_section=geo_section, &
813 force_env=force_env, gopt_param=gopt_param, spgr=spgr)
814 res = (optimizer%status < 40) .AND. .NOT. converged
829 optimizer%task =
'STOPPED on user request'
831 IF (optimizer%master == optimizer%para_env%mepos)
THEN
832 CALL setulb(
SIZE(optimizer%x), optimizer%m, optimizer%x, &
833 optimizer%lower_bound, optimizer%upper_bound, &
834 optimizer%kind_of_bound, optimizer%f, optimizer%gradient, &
835 optimizer%wanted_relative_f_delta, &
836 optimizer%wanted_projected_gradient, optimizer%work_array, &
837 optimizer%i_work_array, optimizer%task, optimizer%print_every, &
838 optimizer%csave, optimizer%lsave, optimizer%isave, &
839 optimizer%dsave, optimizer%trust_radius)
subroutine cp_eval_at(gopt_env, x, f, gradient, master, final_evaluation, para_env)
evaluete the potential energy and its gradients using an array with same dimension as the particle_se...
routines that optimize a functional using the limited memory bfgs quasi-newton method....
subroutine, public cp_opt_gopt_create(optimizer, para_env, obj_funct, x0, m, print_every, wanted_relative_f_delta, wanted_projected_gradient, lower_bound, upper_bound, kind_of_bound, master, max_f_per_iter, trust_radius)
initializes the optimizer
logical function, public cp_opt_gopt_next(optimizer, n_iter, f, last_f, projected_gradient, converged, geo_section, force_env, gopt_param, spgr)
goes to the next optimal point (after an optimizer iteration) returns true if converged
subroutine, public cp_opt_gopt_stop(optimizer)
stops the optimization
subroutine, public cp_opt_gopt_release(optimizer)
releases the optimizer (see doc/ReferenceCounting.html)
LBFGS-B routine (version 3.0, April 25, 2011)
subroutine, public setulb(n, m, x, lower_bound, upper_bound, nbd, f, g, factr, pgtol, wa, iwa, task, iprint, csave, lsave, isave, dsave, trust_radius, spgr, iwunit)
This subroutine partitions the working arrays wa and iwa, and then uses the limited memory BFGS metho...
various routines to log and control the output. The idea is that decisions about where to log should ...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
types that represent a subsys, i.e. a part of the system
Interface for the force calculations.
recursive subroutine, public force_env_get(force_env, in_use, fist_env, qs_env, meta_env, fp_env, subsys, para_env, potential_energy, additional_potential, kinetic_energy, harmonic_shell, kinetic_shell, cell, sub_force_env, qmmm_env, qmmmx_env, eip_env, pwdft_env, globenv, input, force_env_section, method_name_id, root_section, mixed_env, nnp_env, embed_env, ipi_env)
returns various attributes about the force environment
contains a functional that calculates the energy and its derivatives for the geometry optimizer
subroutine, public gopt_f_io(gopt_env, force_env, root_section, its, opt_energy, output_unit, eold, emin, wildcard, gopt_param, ndf, dx, xi, conv, pred, rat, step, rad, used_time)
Handles the Output during an optimization run.
contains a functional that calculates the energy and its derivatives for the geometry optimizer
subroutine, public gopt_f_retain(gopt_env)
...
recursive subroutine, public gopt_f_release(gopt_env)
...
contains typo and related routines to handle parameters controlling the GEO_OPT module
Defines the basic variable types.
integer, parameter, public dp
Machine interface based on Fortran 2003 and POSIX.
real(kind=dp) function, public m_walltime()
returns time from a real-time clock, protected against rolling early/easily
Interface to the message passing library MPI.
subroutine, public mp_para_env_release(para_env)
releases the para object (to be called when you don't want anymore the shared copy of this object)
Space Group Symmetry Type Module (version 1.0, Ferbruary 12, 2021)
Space Group Symmetry Module (version 1.0, January 16, 2020)
subroutine, public spgr_apply_rotations_coord(spgr, coord)
routine applies the rotation matrices to the coordinates.
subroutine, public spgr_apply_rotations_force(spgr, force)
routine applies the rotation matrices to the forces.
info for the optimizer (see the description of this module)
type of a logger, at the moment it contains just a print level starting at which level it should be l...
represents a system: atoms, molecules, their pos,vel,...
wrapper to abstract the force evaluation of the various methods
calculates the potential energy of a system, and its derivatives
stores all the informations relevant to an mpi environment