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))
THEN
270 optimizer%wanted_relative_f_delta = wanted_relative_f_delta
272 IF (
PRESENT(wanted_projected_gradient))
THEN
273 optimizer%wanted_projected_gradient = wanted_projected_gradient
275 optimizer%kind_of_bound = 0
276 IF (
PRESENT(kind_of_bound)) optimizer%kind_of_bound = kind_of_bound
277 IF (
PRESENT(lower_bound)) optimizer%lower_bound = lower_bound
278 IF (
PRESENT(upper_bound)) optimizer%upper_bound = upper_bound
279 IF (
PRESENT(trust_radius)) optimizer%trust_radius = trust_radius
281 CALL setulb(
SIZE(optimizer%x), optimizer%m, optimizer%x, &
282 optimizer%lower_bound, optimizer%upper_bound, &
283 optimizer%kind_of_bound, optimizer%f, optimizer%gradient, &
284 optimizer%wanted_relative_f_delta, &
285 optimizer%wanted_projected_gradient, optimizer%work_array, &
286 optimizer%i_work_array, optimizer%task, optimizer%print_every, &
287 optimizer%csave, optimizer%lsave, optimizer%isave, &
288 optimizer%dsave, optimizer%trust_radius)
291 optimizer%kind_of_bound, optimizer%i_work_array, optimizer%isave, &
292 optimizer%lower_bound, optimizer%upper_bound, optimizer%gradient, &
293 optimizer%dsave, optimizer%work_array)
294 ALLOCATE (optimizer%x(n))
295 optimizer%x(:) = 0.0_dp
296 ALLOCATE (optimizer%gradient(n))
297 optimizer%gradient(:) = 0.0_dp
299 CALL optimizer%para_env%bcast(optimizer%x, optimizer%master)
302 CALL timestop(handle)
317 CHARACTER(len=*),
PARAMETER :: routinen =
'cp_opt_gopt_release'
321 CALL timeset(routinen, handle)
323 IF (
ASSOCIATED(optimizer%kind_of_bound))
THEN
324 DEALLOCATE (optimizer%kind_of_bound)
326 IF (
ASSOCIATED(optimizer%i_work_array))
THEN
327 DEALLOCATE (optimizer%i_work_array)
329 IF (
ASSOCIATED(optimizer%isave))
THEN
330 DEALLOCATE (optimizer%isave)
332 IF (
ASSOCIATED(optimizer%x))
THEN
333 DEALLOCATE (optimizer%x)
335 IF (
ASSOCIATED(optimizer%lower_bound))
THEN
336 DEALLOCATE (optimizer%lower_bound)
338 IF (
ASSOCIATED(optimizer%upper_bound))
THEN
339 DEALLOCATE (optimizer%upper_bound)
341 IF (
ASSOCIATED(optimizer%gradient))
THEN
342 DEALLOCATE (optimizer%gradient)
344 IF (
ASSOCIATED(optimizer%dsave))
THEN
345 DEALLOCATE (optimizer%dsave)
347 IF (
ASSOCIATED(optimizer%work_array))
THEN
348 DEALLOCATE (optimizer%work_array)
350 CALL mp_para_env_release(optimizer%para_env)
351 CALL gopt_f_release(optimizer%obj_funct)
353 CALL timestop(handle)
384 SUBROUTINE cp_opt_gopt_get(optimizer, para_env, &
385 obj_funct, m, print_every, &
386 wanted_relative_f_delta, wanted_projected_gradient, &
387 x, lower_bound, upper_bound, kind_of_bound, master, &
388 actual_projected_gradient, &
389 n_var, n_iter, status, max_f_per_iter, at_end, &
390 is_master, last_f, f)
392 TYPE(mp_para_env_type),
OPTIONAL,
POINTER :: para_env
393 TYPE(gopt_f_type),
OPTIONAL,
POINTER :: obj_funct
394 INTEGER,
INTENT(out),
OPTIONAL :: m, print_every
395 REAL(kind=dp),
INTENT(out),
OPTIONAL :: wanted_relative_f_delta, &
396 wanted_projected_gradient
397 REAL(kind=dp),
DIMENSION(:),
OPTIONAL,
POINTER :: x, lower_bound, upper_bound
398 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: kind_of_bound
399 INTEGER,
INTENT(out),
OPTIONAL :: master
400 REAL(kind=dp),
INTENT(out),
OPTIONAL :: actual_projected_gradient
401 INTEGER,
INTENT(out),
OPTIONAL :: n_var, n_iter, status, max_f_per_iter
402 LOGICAL,
INTENT(out),
OPTIONAL :: at_end, is_master
403 REAL(kind=dp),
INTENT(out),
OPTIONAL :: last_f, f
405 IF (
PRESENT(is_master)) is_master = optimizer%master == optimizer%para_env%mepos
406 IF (
PRESENT(master)) master = optimizer%master
407 IF (
PRESENT(status)) status = optimizer%status
408 IF (
PRESENT(para_env)) para_env => optimizer%para_env
409 IF (
PRESENT(obj_funct)) obj_funct = optimizer%obj_funct
410 IF (
PRESENT(m)) m = optimizer%m
411 IF (
PRESENT(max_f_per_iter)) max_f_per_iter = optimizer%max_f_per_iter
412 IF (
PRESENT(wanted_projected_gradient))
THEN
413 wanted_projected_gradient = optimizer%wanted_projected_gradient
415 IF (
PRESENT(wanted_relative_f_delta))
THEN
416 wanted_relative_f_delta = optimizer%wanted_relative_f_delta
418 IF (
PRESENT(print_every)) print_every = optimizer%print_every
419 IF (
PRESENT(x)) x => optimizer%x
420 IF (
PRESENT(n_var)) n_var =
SIZE(x)
421 IF (
PRESENT(lower_bound)) lower_bound => optimizer%lower_bound
422 IF (
PRESENT(upper_bound)) upper_bound => optimizer%upper_bound
423 IF (
PRESENT(kind_of_bound)) kind_of_bound => optimizer%kind_of_bound
424 IF (
PRESENT(n_iter)) n_iter = optimizer%n_iter
425 IF (
PRESENT(last_f)) last_f = optimizer%last_f
426 IF (
PRESENT(f)) f = optimizer%f
427 IF (
PRESENT(at_end)) at_end = optimizer%status > 3
428 IF (
PRESENT(actual_projected_gradient))
THEN
429 actual_projected_gradient = optimizer%projected_gradient
431 IF (optimizer%master == optimizer%para_env%mepos)
THEN
432 IF (optimizer%isave(30) > 1 .AND. (optimizer%task(1:5) ==
"NEW_X" .OR. &
433 optimizer%task(1:4) ==
"STOP" .AND. optimizer%task(7:9) ==
"CPU"))
THEN
435 IF (
PRESENT(last_f)) last_f = optimizer%dsave(2)
436 IF (
PRESENT(actual_projected_gradient))
THEN
437 actual_projected_gradient = optimizer%dsave(13)
440 cpassert(.NOT.
PRESENT(last_f))
441 cpassert(.NOT.
PRESENT(actual_projected_gradient))
443 ELSE IF (
PRESENT(lower_bound) .OR.
PRESENT(upper_bound) .OR.
PRESENT(kind_of_bound))
THEN
444 cpwarn(
"asked undefined types")
447 END SUBROUTINE cp_opt_gopt_get
468 SUBROUTINE cp_opt_gopt_step(optimizer, n_iter, f, last_f, &
469 projected_gradient, converged, geo_section, force_env, &
472 INTEGER,
INTENT(out),
OPTIONAL :: n_iter
473 REAL(kind=dp),
INTENT(out),
OPTIONAL :: f, last_f, projected_gradient
474 LOGICAL,
INTENT(out),
OPTIONAL :: converged
478 TYPE(
spgr_type),
OPTIONAL,
POINTER :: spgr
480 CHARACTER(len=*),
PARAMETER :: routinen =
'cp_opt_gopt_step'
482 CHARACTER(LEN=5) :: wildcard
483 INTEGER :: dataunit, handle, its
484 LOGICAL :: conv, is_master, justentred, &
486 REAL(kind=dp) :: t_diff, t_now, t_old
487 REAL(kind=dp),
DIMENSION(:),
POINTER :: xold
491 NULLIFY (logger, xold)
493 CALL timeset(routinen, handle)
495 is_master = optimizer%master == optimizer%para_env%mepos
496 IF (
PRESENT(converged)) converged = optimizer%status == 4
497 ALLOCATE (xold(
SIZE(optimizer%x)))
502 keep_space_group = .false.
503 IF (
PRESENT(spgr))
THEN
504 IF (
ASSOCIATED(spgr)) keep_space_group = spgr%keep_space_group
508 IF (keep_space_group)
THEN
515 IF (optimizer%status >= 4)
THEN
516 cpwarn(
"status>=4, trying to restart")
519 "PRINT%PROGRAM_RUN_INFO", extension=
".geoLog")
521 optimizer%task =
'START'
522 CALL setulb(
SIZE(optimizer%x), optimizer%m, optimizer%x, &
523 optimizer%lower_bound, optimizer%upper_bound, &
524 optimizer%kind_of_bound, optimizer%f, optimizer%gradient, &
525 optimizer%wanted_relative_f_delta, &
526 optimizer%wanted_projected_gradient, optimizer%work_array, &
527 optimizer%i_work_array, optimizer%task, optimizer%print_every, &
528 optimizer%csave, optimizer%lsave, optimizer%isave, &
529 optimizer%dsave, optimizer%trust_radius, spgr=spgr, iwunit=dataunit)
532 "PRINT%PROGRAM_RUN_INFO")
537 "PRINT%PROGRAM_RUN_INFO", extension=
".geoLog")
538 ifmaster:
IF (is_master)
THEN
539 IF (optimizer%task(1:7) ==
'RESTART')
THEN
542 optimizer%task =
'START'
544 IF (keep_space_group)
THEN
548 CALL setulb(
SIZE(optimizer%x), optimizer%m, optimizer%x, &
549 optimizer%lower_bound, optimizer%upper_bound, &
550 optimizer%kind_of_bound, optimizer%f, optimizer%gradient, &
551 optimizer%wanted_relative_f_delta, &
552 optimizer%wanted_projected_gradient, optimizer%work_array, &
553 optimizer%i_work_array, optimizer%task, optimizer%print_every, &
554 optimizer%csave, optimizer%lsave, optimizer%isave, &
555 optimizer%dsave, optimizer%trust_radius, spgr=spgr, iwunit=dataunit)
556 IF (keep_space_group)
THEN
561 IF (optimizer%task(1:2) ==
'FG')
THEN
562 IF (optimizer%isave(36) > optimizer%max_f_per_iter)
THEN
563 optimizer%task =
'STOP: CPU, hit max f eval in iter'
565 CALL setulb(
SIZE(optimizer%x), optimizer%m, optimizer%x, &
566 optimizer%lower_bound, optimizer%upper_bound, &
567 optimizer%kind_of_bound, optimizer%f, optimizer%gradient, &
568 optimizer%wanted_relative_f_delta, &
569 optimizer%wanted_projected_gradient, optimizer%work_array, &
570 optimizer%i_work_array, optimizer%task, optimizer%print_every, &
571 optimizer%csave, optimizer%lsave, optimizer%isave, &
572 optimizer%dsave, optimizer%trust_radius, spgr=spgr, iwunit=dataunit)
576 ELSE IF (optimizer%task(1:5) ==
'NEW_X')
THEN
580 IF (keep_space_group)
THEN
584 CALL setulb(
SIZE(optimizer%x), optimizer%m, optimizer%x, &
585 optimizer%lower_bound, optimizer%upper_bound, &
586 optimizer%kind_of_bound, optimizer%f, optimizer%gradient, &
587 optimizer%wanted_relative_f_delta, &
588 optimizer%wanted_projected_gradient, optimizer%work_array, &
589 optimizer%i_work_array, optimizer%task, optimizer%print_every, &
590 optimizer%csave, optimizer%lsave, optimizer%isave, &
591 optimizer%dsave, optimizer%trust_radius, spgr=spgr, iwunit=dataunit)
592 IF (keep_space_group)
THEN
598 IF (keep_space_group)
THEN
604 ELSE IF (optimizer%task(1:4) ==
'CONV')
THEN
606 ELSE IF (optimizer%task(1:4) ==
'STOP')
THEN
608 cpwarn(
"task became stop in an unknown way")
609 ELSE IF (optimizer%task(1:5) ==
'ERROR')
THEN
612 cpwarn(
"unknown task '"//optimizer%task//
"'")
616 "PRINT%PROGRAM_RUN_INFO")
617 CALL optimizer%para_env%bcast(optimizer%status, optimizer%master)
619 IF (optimizer%status == 3)
THEN
623 its = optimizer%isave(30)
627 SELECT CASE (optimizer%status)
630 CALL cp_eval_at(optimizer%obj_funct, x=optimizer%x, &
632 gradient=optimizer%gradient, &
633 final_evaluation=.false., &
634 master=optimizer%master, para_env=optimizer%para_env)
637 "PRINT%PROGRAM_RUN_INFO", extension=
".geoLog")
640 IF (keep_space_group)
THEN
644 CALL setulb(
SIZE(optimizer%x), optimizer%m, optimizer%x, &
645 optimizer%lower_bound, optimizer%upper_bound, &
646 optimizer%kind_of_bound, optimizer%f, optimizer%gradient, &
647 optimizer%wanted_relative_f_delta, &
648 optimizer%wanted_projected_gradient, optimizer%work_array, &
649 optimizer%i_work_array, optimizer%task, optimizer%print_every, &
650 optimizer%csave, optimizer%lsave, optimizer%isave, &
651 optimizer%dsave, optimizer%trust_radius, spgr=spgr, iwunit=dataunit)
652 IF (keep_space_group)
THEN
658 "PRINT%PROGRAM_RUN_INFO")
659 CALL optimizer%para_env%bcast(optimizer%x, optimizer%master)
662 CALL optimizer%para_env%bcast(optimizer%x, optimizer%master)
668 "PRINT%PROGRAM_RUN_INFO", extension=
".geoLog")
669 IF (is_master) its = optimizer%isave(30)
670 CALL optimizer%para_env%bcast(its, optimizer%master)
674 t_diff = t_now - t_old
676 CALL gopt_f_io(optimizer%obj_funct, force_env, force_env%root_section, &
677 its, optimizer%f, dataunit, optimizer%eold, optimizer%emin, wildcard, gopt_param, &
678 SIZE(optimizer%x), optimizer%x - xold, optimizer%gradient, conv, used_time=t_diff)
679 CALL optimizer%para_env%bcast(conv, optimizer%master)
681 "PRINT%PROGRAM_RUN_INFO")
682 optimizer%eold = optimizer%f
683 optimizer%emin = min(optimizer%emin, optimizer%eold)
685 IF (
PRESENT(converged)) converged = conv
692 "PRINT%PROGRAM_RUN_INFO", extension=
".geoLog")
693 IF (dataunit > 0)
THEN
694 WRITE (dataunit,
'(T2,A)')
""
695 WRITE (dataunit,
'(T2,A)')
"************************************************"
696 WRITE (dataunit,
'(T2,A)')
"* Specific L-BFGS convergence criteria *"
697 WRITE (dataunit,
'(T2,A)')
"* WANTED_PROJ_GRADIENT and WANTED_REL_F_ERROR *"
698 WRITE (dataunit,
'(T2,A)')
"* satisfied .... run CONVERGED! *"
699 WRITE (dataunit,
'(T2,A)')
"* * * * *"
700 WRITE (dataunit,
'(T2,A)')
"* General convergence criteria on stepsize and *"
701 WRITE (dataunit,
'(T2,A)')
"* gradients may or may not have been satisfied *"
702 WRITE (dataunit,
'(T2,A)')
"* yet; if unsatisfactory, try tightening the *"
703 WRITE (dataunit,
'(T2,A)')
"* L-BFGS convergence criteria and restart run. *"
704 WRITE (dataunit,
'(T2,A)')
"************************************************"
705 WRITE (dataunit,
'(T2,A)')
""
708 "PRINT%PROGRAM_RUN_INFO")
709 IF (
PRESENT(converged)) converged = .true.
713 CALL optimizer%para_env%bcast(optimizer%task, optimizer%master)
716 cpabort(
"step on a deallocated opt structure ")
718 CALL cp_abort(__location__, &
723 IF (optimizer%status == 1 .AND. justentred)
THEN
724 optimizer%eold = optimizer%f
725 optimizer%emin = optimizer%eold
730 CALL optimizer%para_env%bcast(optimizer%x, optimizer%master)
731 CALL cp_opt_gopt_bcast_res(optimizer, &
732 n_iter=optimizer%n_iter, &
733 f=optimizer%f, last_f=optimizer%last_f, &
734 projected_gradient=optimizer%projected_gradient)
737 IF (
PRESENT(f)) f = optimizer%f
738 IF (
PRESENT(last_f)) last_f = optimizer%last_f
739 IF (
PRESENT(projected_gradient)) projected_gradient = optimizer%projected_gradient
740 IF (
PRESENT(n_iter)) n_iter = optimizer%n_iter
741 CALL timestop(handle)
743 END SUBROUTINE cp_opt_gopt_step
759 SUBROUTINE cp_opt_gopt_bcast_res(optimizer, n_iter, f, last_f, &
762 INTEGER,
INTENT(out),
OPTIONAL :: n_iter
763 REAL(kind=dp),
INTENT(inout),
OPTIONAL :: f, last_f, projected_gradient
765 REAL(kind=dp),
DIMENSION(4) :: results
767 IF (optimizer%master == optimizer%para_env%mepos)
THEN
768 results = [real(optimizer%isave(30), kind=dp), &
769 optimizer%f, optimizer%dsave(2), optimizer%dsave(13)]
771 CALL optimizer%para_env%bcast(results, optimizer%master)
772 IF (
PRESENT(n_iter)) n_iter = nint(results(1))
773 IF (
PRESENT(f)) f = results(2)
774 IF (
PRESENT(last_f)) last_f = results(3)
775 IF (
PRESENT(projected_gradient)) projected_gradient = results(4)
777 END SUBROUTINE cp_opt_gopt_bcast_res
801 projected_gradient, converged, geo_section, force_env, &
802 gopt_param, spgr)
RESULT(res)
804 INTEGER,
INTENT(out),
OPTIONAL :: n_iter
805 REAL(kind=dp),
INTENT(out),
OPTIONAL :: f, last_f, projected_gradient
806 LOGICAL,
INTENT(out) :: converged
810 TYPE(
spgr_type),
OPTIONAL,
POINTER :: spgr
814 CALL cp_opt_gopt_step(optimizer, n_iter=n_iter, f=f, &
815 last_f=last_f, projected_gradient=projected_gradient, &
816 converged=converged, geo_section=geo_section, &
817 force_env=force_env, gopt_param=gopt_param, spgr=spgr)
818 res = (optimizer%status < 40) .AND. .NOT. converged
833 optimizer%task =
'STOPPED on user request'
835 IF (optimizer%master == optimizer%para_env%mepos)
THEN
836 CALL setulb(
SIZE(optimizer%x), optimizer%m, optimizer%x, &
837 optimizer%lower_bound, optimizer%upper_bound, &
838 optimizer%kind_of_bound, optimizer%f, optimizer%gradient, &
839 optimizer%wanted_relative_f_delta, &
840 optimizer%wanted_projected_gradient, optimizer%work_array, &
841 optimizer%i_work_array, optimizer%task, optimizer%print_every, &
842 optimizer%csave, optimizer%lsave, optimizer%isave, &
843 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