46#include "../base/base_uses.f90"
51 LOGICAL,
PRIVATE,
PARAMETER :: debug_this_module = .true.
52 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'cp_lbfgs_optimizer_gopt'
131 CHARACTER(len=60) :: task =
""
132 CHARACTER(len=60) :: csave =
""
133 LOGICAL :: lsave(4) = .false.
134 INTEGER :: m = 0, print_every = 0, master = 0, max_f_per_iter = 0, status = 0, n_iter = 0
135 INTEGER,
DIMENSION(:),
POINTER :: kind_of_bound => null(), i_work_array => null(), isave => null()
136 REAL(kind=
dp) :: f = 0.0_dp, wanted_relative_f_delta = 0.0_dp, wanted_projected_gradient = 0.0_dp, &
137 last_f = 0.0_dp, projected_gradient = 0.0_dp, eold = 0.0_dp, emin = 0.0_dp, trust_radius = 0.0_dp
138 REAL(kind=
dp),
DIMENSION(:),
POINTER :: x => null(), lower_bound => null(), upper_bound => null(), &
139 gradient => null(), dsave => null(), work_array => null()
170 wanted_relative_f_delta, wanted_projected_gradient, lower_bound, upper_bound, &
171 kind_of_bound, master, max_f_per_iter, trust_radius)
175 REAL(kind=
dp),
DIMENSION(:),
INTENT(in) :: x0
176 INTEGER,
INTENT(in),
OPTIONAL :: m, print_every
177 REAL(kind=
dp),
INTENT(in),
OPTIONAL :: wanted_relative_f_delta, &
178 wanted_projected_gradient
179 REAL(kind=
dp),
DIMENSION(SIZE(x0)),
INTENT(in), &
180 OPTIONAL :: lower_bound, upper_bound
181 INTEGER,
DIMENSION(SIZE(x0)),
INTENT(in),
OPTIONAL :: kind_of_bound
182 INTEGER,
INTENT(in),
OPTIONAL :: master, max_f_per_iter
183 REAL(kind=
dp),
INTENT(in),
OPTIONAL :: trust_radius
185 CHARACTER(len=*),
PARAMETER :: routinen =
'cp_opt_gopt_create'
187 INTEGER :: handle, lenwa, n
189 CALL timeset(routinen, handle)
191 NULLIFY (optimizer%kind_of_bound, &
192 optimizer%i_work_array, &
195 optimizer%lower_bound, &
196 optimizer%upper_bound, &
197 optimizer%gradient, &
199 optimizer%work_array, &
200 optimizer%para_env, &
204 IF (
PRESENT(m)) optimizer%m = m
205 optimizer%master = para_env%source
206 optimizer%para_env => para_env
207 CALL para_env%retain()
208 optimizer%obj_funct => obj_funct
210 optimizer%max_f_per_iter = 20
211 IF (
PRESENT(max_f_per_iter)) optimizer%max_f_per_iter = max_f_per_iter
212 optimizer%print_every = -1
214 optimizer%f = -1.0_dp
215 optimizer%last_f = -1.0_dp
216 optimizer%projected_gradient = -1.0_dp
217 IF (
PRESENT(print_every)) optimizer%print_every = print_every
218 IF (
PRESENT(master)) optimizer%master = master
219 IF (optimizer%master == optimizer%para_env%mepos)
THEN
221 lenwa = 2*optimizer%m*n + 5*n + 11*optimizer%m*optimizer%m + 8*optimizer%m
222 ALLOCATE (optimizer%kind_of_bound(n), optimizer%i_work_array(3*n), &
224 ALLOCATE (optimizer%x(n), optimizer%lower_bound(n), &
225 optimizer%upper_bound(n), optimizer%gradient(n), &
226 optimizer%dsave(29), optimizer%work_array(lenwa))
228 optimizer%task =
'START'
229 optimizer%i_work_array = 0
231 optimizer%lower_bound = 0.0_dp
232 optimizer%upper_bound = 0.0_dp
233 optimizer%gradient = 0.0_dp
234 optimizer%dsave = 0.0_dp
235 optimizer%work_array = 0.0_dp
236 IF (
PRESENT(wanted_relative_f_delta))
THEN
237 optimizer%wanted_relative_f_delta = wanted_relative_f_delta
239 IF (
PRESENT(wanted_projected_gradient))
THEN
240 optimizer%wanted_projected_gradient = wanted_projected_gradient
242 optimizer%kind_of_bound = 0
243 IF (
PRESENT(kind_of_bound)) optimizer%kind_of_bound = kind_of_bound
244 IF (
PRESENT(lower_bound)) optimizer%lower_bound = lower_bound
245 IF (
PRESENT(upper_bound)) optimizer%upper_bound = upper_bound
246 IF (
PRESENT(trust_radius)) optimizer%trust_radius = trust_radius
248 CALL setulb(
SIZE(optimizer%x), optimizer%m, optimizer%x, &
249 optimizer%lower_bound, optimizer%upper_bound, &
250 optimizer%kind_of_bound, optimizer%f, optimizer%gradient, &
251 optimizer%wanted_relative_f_delta, &
252 optimizer%wanted_projected_gradient, optimizer%work_array, &
253 optimizer%i_work_array, optimizer%task, optimizer%print_every, &
254 optimizer%csave, optimizer%lsave, optimizer%isave, &
255 optimizer%dsave, optimizer%trust_radius)
258 optimizer%kind_of_bound, optimizer%i_work_array, optimizer%isave, &
259 optimizer%lower_bound, optimizer%upper_bound, optimizer%gradient, &
260 optimizer%dsave, optimizer%work_array)
261 ALLOCATE (optimizer%x(n))
262 optimizer%x(:) = 0.0_dp
263 ALLOCATE (optimizer%gradient(n))
264 optimizer%gradient(:) = 0.0_dp
266 CALL optimizer%para_env%bcast(optimizer%x, optimizer%master)
269 CALL timestop(handle)
284 CHARACTER(len=*),
PARAMETER :: routinen =
'cp_opt_gopt_release'
288 CALL timeset(routinen, handle)
290 IF (
ASSOCIATED(optimizer%kind_of_bound))
THEN
291 DEALLOCATE (optimizer%kind_of_bound)
293 IF (
ASSOCIATED(optimizer%i_work_array))
THEN
294 DEALLOCATE (optimizer%i_work_array)
296 IF (
ASSOCIATED(optimizer%isave))
THEN
297 DEALLOCATE (optimizer%isave)
299 IF (
ASSOCIATED(optimizer%x))
THEN
300 DEALLOCATE (optimizer%x)
302 IF (
ASSOCIATED(optimizer%lower_bound))
THEN
303 DEALLOCATE (optimizer%lower_bound)
305 IF (
ASSOCIATED(optimizer%upper_bound))
THEN
306 DEALLOCATE (optimizer%upper_bound)
308 IF (
ASSOCIATED(optimizer%gradient))
THEN
309 DEALLOCATE (optimizer%gradient)
311 IF (
ASSOCIATED(optimizer%dsave))
THEN
312 DEALLOCATE (optimizer%dsave)
314 IF (
ASSOCIATED(optimizer%work_array))
THEN
315 DEALLOCATE (optimizer%work_array)
320 CALL timestop(handle)
351 SUBROUTINE cp_opt_gopt_get(optimizer, para_env, &
352 obj_funct, m, print_every, &
353 wanted_relative_f_delta, wanted_projected_gradient, &
354 x, lower_bound, upper_bound, kind_of_bound, master, &
355 actual_projected_gradient, &
356 n_var, n_iter, status, max_f_per_iter, at_end, &
357 is_master, last_f, f)
361 INTEGER,
INTENT(out),
OPTIONAL :: m, print_every
362 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: wanted_relative_f_delta, &
363 wanted_projected_gradient
364 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: x, lower_bound, upper_bound
365 INTEGER,
DIMENSION(:),
OPTIONAL,
POINTER :: kind_of_bound
366 INTEGER,
INTENT(out),
OPTIONAL :: master
367 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: actual_projected_gradient
368 INTEGER,
INTENT(out),
OPTIONAL :: n_var, n_iter, status, max_f_per_iter
369 LOGICAL,
INTENT(out),
OPTIONAL :: at_end, is_master
370 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: last_f, f
372 IF (
PRESENT(is_master)) is_master = optimizer%master == optimizer%para_env%mepos
373 IF (
PRESENT(master)) master = optimizer%master
374 IF (
PRESENT(status)) status = optimizer%status
375 IF (
PRESENT(para_env)) para_env => optimizer%para_env
376 IF (
PRESENT(obj_funct)) obj_funct = optimizer%obj_funct
377 IF (
PRESENT(m)) m = optimizer%m
378 IF (
PRESENT(max_f_per_iter)) max_f_per_iter = optimizer%max_f_per_iter
379 IF (
PRESENT(wanted_projected_gradient))
THEN
380 wanted_projected_gradient = optimizer%wanted_projected_gradient
382 IF (
PRESENT(wanted_relative_f_delta))
THEN
383 wanted_relative_f_delta = optimizer%wanted_relative_f_delta
385 IF (
PRESENT(print_every)) print_every = optimizer%print_every
386 IF (
PRESENT(x)) x => optimizer%x
387 IF (
PRESENT(n_var)) n_var =
SIZE(x)
388 IF (
PRESENT(lower_bound)) lower_bound => optimizer%lower_bound
389 IF (
PRESENT(upper_bound)) upper_bound => optimizer%upper_bound
390 IF (
PRESENT(kind_of_bound)) kind_of_bound => optimizer%kind_of_bound
391 IF (
PRESENT(n_iter)) n_iter = optimizer%n_iter
392 IF (
PRESENT(last_f)) last_f = optimizer%last_f
393 IF (
PRESENT(f)) f = optimizer%f
394 IF (
PRESENT(at_end)) at_end = optimizer%status > 3
395 IF (
PRESENT(actual_projected_gradient))
THEN
396 actual_projected_gradient = optimizer%projected_gradient
398 IF (optimizer%master == optimizer%para_env%mepos)
THEN
399 IF (optimizer%isave(30) > 1 .AND. (optimizer%task(1:5) ==
"NEW_X" .OR. &
400 optimizer%task(1:4) ==
"STOP" .AND. optimizer%task(7:9) ==
"CPU"))
THEN
402 IF (
PRESENT(last_f)) last_f = optimizer%dsave(2)
403 IF (
PRESENT(actual_projected_gradient))
THEN
404 actual_projected_gradient = optimizer%dsave(13)
407 cpassert(.NOT.
PRESENT(last_f))
408 cpassert(.NOT.
PRESENT(actual_projected_gradient))
410 ELSE IF (
PRESENT(lower_bound) .OR.
PRESENT(upper_bound) .OR.
PRESENT(kind_of_bound))
THEN
411 cpwarn(
"asked undefined types")
414 END SUBROUTINE cp_opt_gopt_get
435 SUBROUTINE cp_opt_gopt_step(optimizer, n_iter, f, last_f, &
436 projected_gradient, converged, geo_section, force_env, &
439 INTEGER,
INTENT(out),
OPTIONAL :: n_iter
440 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: f, last_f, projected_gradient
441 LOGICAL,
INTENT(out),
OPTIONAL :: converged
445 TYPE(
spgr_type),
OPTIONAL,
POINTER :: spgr
447 CHARACTER(len=*),
PARAMETER :: routinen =
'cp_opt_gopt_step'
449 CHARACTER(LEN=5) :: wildcard
450 INTEGER :: dataunit, handle, its
451 LOGICAL :: conv, is_master, justentred, &
453 REAL(kind=
dp) :: t_diff, t_now, t_old
454 REAL(kind=
dp),
DIMENSION(:),
POINTER :: xold
458 NULLIFY (logger, xold)
460 CALL timeset(routinen, handle)
462 is_master = optimizer%master == optimizer%para_env%mepos
463 IF (
PRESENT(converged)) converged = optimizer%status == 4
464 ALLOCATE (xold(
SIZE(optimizer%x)))
469 keep_space_group = .false.
470 IF (
PRESENT(spgr))
THEN
471 IF (
ASSOCIATED(spgr)) keep_space_group = spgr%keep_space_group
475 IF (keep_space_group)
THEN
482 IF (optimizer%status >= 4)
THEN
483 cpwarn(
"status>=4, trying to restart")
486 "PRINT%PROGRAM_RUN_INFO", extension=
".geoLog")
488 optimizer%task =
'START'
489 CALL setulb(
SIZE(optimizer%x), optimizer%m, optimizer%x, &
490 optimizer%lower_bound, optimizer%upper_bound, &
491 optimizer%kind_of_bound, optimizer%f, optimizer%gradient, &
492 optimizer%wanted_relative_f_delta, &
493 optimizer%wanted_projected_gradient, optimizer%work_array, &
494 optimizer%i_work_array, optimizer%task, optimizer%print_every, &
495 optimizer%csave, optimizer%lsave, optimizer%isave, &
496 optimizer%dsave, optimizer%trust_radius, spgr=spgr, iwunit=dataunit)
499 "PRINT%PROGRAM_RUN_INFO")
504 "PRINT%PROGRAM_RUN_INFO", extension=
".geoLog")
505 ifmaster:
IF (is_master)
THEN
506 IF (optimizer%task(1:7) ==
'RESTART')
THEN
509 optimizer%task =
'START'
511 IF (keep_space_group)
THEN
515 CALL setulb(
SIZE(optimizer%x), optimizer%m, optimizer%x, &
516 optimizer%lower_bound, optimizer%upper_bound, &
517 optimizer%kind_of_bound, optimizer%f, optimizer%gradient, &
518 optimizer%wanted_relative_f_delta, &
519 optimizer%wanted_projected_gradient, optimizer%work_array, &
520 optimizer%i_work_array, optimizer%task, optimizer%print_every, &
521 optimizer%csave, optimizer%lsave, optimizer%isave, &
522 optimizer%dsave, optimizer%trust_radius, spgr=spgr, iwunit=dataunit)
523 IF (keep_space_group)
THEN
528 IF (optimizer%task(1:2) ==
'FG')
THEN
529 IF (optimizer%isave(36) > optimizer%max_f_per_iter)
THEN
530 optimizer%task =
'STOP: CPU, hit max f eval in iter'
532 CALL setulb(
SIZE(optimizer%x), optimizer%m, optimizer%x, &
533 optimizer%lower_bound, optimizer%upper_bound, &
534 optimizer%kind_of_bound, optimizer%f, optimizer%gradient, &
535 optimizer%wanted_relative_f_delta, &
536 optimizer%wanted_projected_gradient, optimizer%work_array, &
537 optimizer%i_work_array, optimizer%task, optimizer%print_every, &
538 optimizer%csave, optimizer%lsave, optimizer%isave, &
539 optimizer%dsave, optimizer%trust_radius, spgr=spgr, iwunit=dataunit)
543 ELSE IF (optimizer%task(1:5) ==
'NEW_X')
THEN
547 IF (keep_space_group)
THEN
551 CALL setulb(
SIZE(optimizer%x), optimizer%m, optimizer%x, &
552 optimizer%lower_bound, optimizer%upper_bound, &
553 optimizer%kind_of_bound, optimizer%f, optimizer%gradient, &
554 optimizer%wanted_relative_f_delta, &
555 optimizer%wanted_projected_gradient, optimizer%work_array, &
556 optimizer%i_work_array, optimizer%task, optimizer%print_every, &
557 optimizer%csave, optimizer%lsave, optimizer%isave, &
558 optimizer%dsave, optimizer%trust_radius, spgr=spgr, iwunit=dataunit)
559 IF (keep_space_group)
THEN
565 IF (keep_space_group)
THEN
571 ELSE IF (optimizer%task(1:4) ==
'CONV')
THEN
573 ELSE IF (optimizer%task(1:4) ==
'STOP')
THEN
575 cpwarn(
"task became stop in an unknown way")
576 ELSE IF (optimizer%task(1:5) ==
'ERROR')
THEN
579 cpwarn(
"unknown task '"//optimizer%task//
"'")
583 "PRINT%PROGRAM_RUN_INFO")
584 CALL optimizer%para_env%bcast(optimizer%status, optimizer%master)
586 IF (optimizer%status == 3)
THEN
590 its = optimizer%isave(30)
594 SELECT CASE (optimizer%status)
597 CALL cp_eval_at(optimizer%obj_funct, x=optimizer%x, &
599 gradient=optimizer%gradient, &
600 master=optimizer%master, para_env=optimizer%para_env)
603 "PRINT%PROGRAM_RUN_INFO", extension=
".geoLog")
606 IF (keep_space_group)
THEN
610 CALL setulb(
SIZE(optimizer%x), optimizer%m, optimizer%x, &
611 optimizer%lower_bound, optimizer%upper_bound, &
612 optimizer%kind_of_bound, optimizer%f, optimizer%gradient, &
613 optimizer%wanted_relative_f_delta, &
614 optimizer%wanted_projected_gradient, optimizer%work_array, &
615 optimizer%i_work_array, optimizer%task, optimizer%print_every, &
616 optimizer%csave, optimizer%lsave, optimizer%isave, &
617 optimizer%dsave, optimizer%trust_radius, spgr=spgr, iwunit=dataunit)
618 IF (keep_space_group)
THEN
624 "PRINT%PROGRAM_RUN_INFO")
625 CALL optimizer%para_env%bcast(optimizer%x, optimizer%master)
628 CALL optimizer%para_env%bcast(optimizer%x, optimizer%master)
634 "PRINT%PROGRAM_RUN_INFO", extension=
".geoLog")
635 IF (is_master) its = optimizer%isave(30)
636 CALL optimizer%para_env%bcast(its, optimizer%master)
640 t_diff = t_now - t_old
642 CALL gopt_f_io(optimizer%obj_funct, force_env, force_env%root_section, &
643 its, optimizer%f, dataunit, optimizer%eold, optimizer%emin, wildcard, gopt_param, &
644 SIZE(optimizer%x), optimizer%x - xold, optimizer%gradient, conv, used_time=t_diff)
645 CALL optimizer%para_env%bcast(conv, optimizer%master)
647 "PRINT%PROGRAM_RUN_INFO")
648 optimizer%eold = optimizer%f
649 optimizer%emin = min(optimizer%emin, optimizer%eold)
651 IF (
PRESENT(converged)) converged = conv
658 "PRINT%PROGRAM_RUN_INFO", extension=
".geoLog")
659 IF (dataunit > 0)
THEN
660 WRITE (dataunit,
'(T2,A)')
""
661 WRITE (dataunit,
'(T2,A)')
"************************************************"
662 WRITE (dataunit,
'(T2,A)')
"* Specific L-BFGS convergence criteria *"
663 WRITE (dataunit,
'(T2,A)')
"* WANTED_PROJ_GRADIENT and WANTED_REL_F_ERROR *"
664 WRITE (dataunit,
'(T2,A)')
"* satisfied .... run CONVERGED! *"
665 WRITE (dataunit,
'(T2,A)')
"* * * * *"
666 WRITE (dataunit,
'(T2,A)')
"* General convergence criteria on stepsize and *"
667 WRITE (dataunit,
'(T2,A)')
"* gradients may or may not have been satisfied *"
668 WRITE (dataunit,
'(T2,A)')
"* yet; if unsatisfactory, try tightening the *"
669 WRITE (dataunit,
'(T2,A)')
"* L-BFGS convergence criteria and restart run. *"
670 WRITE (dataunit,
'(T2,A)')
"************************************************"
671 WRITE (dataunit,
'(T2,A)')
""
674 "PRINT%PROGRAM_RUN_INFO")
675 IF (
PRESENT(converged)) converged = .true.
679 CALL optimizer%para_env%bcast(optimizer%task, optimizer%master)
682 cpabort(
"step on a deallocated opt structure ")
684 CALL cp_abort(__location__, &
689 IF (optimizer%status == 1 .AND. justentred)
THEN
690 optimizer%eold = optimizer%f
691 optimizer%emin = optimizer%eold
696 CALL optimizer%para_env%bcast(optimizer%x, optimizer%master)
697 CALL cp_opt_gopt_bcast_res(optimizer, &
698 n_iter=optimizer%n_iter, &
699 f=optimizer%f, last_f=optimizer%last_f, &
700 projected_gradient=optimizer%projected_gradient)
703 IF (
PRESENT(f)) f = optimizer%f
704 IF (
PRESENT(last_f)) last_f = optimizer%last_f
705 IF (
PRESENT(projected_gradient)) projected_gradient = optimizer%projected_gradient
706 IF (
PRESENT(n_iter)) n_iter = optimizer%n_iter
707 CALL timestop(handle)
709 END SUBROUTINE cp_opt_gopt_step
725 SUBROUTINE cp_opt_gopt_bcast_res(optimizer, n_iter, f, last_f, &
728 INTEGER,
INTENT(out),
OPTIONAL :: n_iter
729 REAL(kind=
dp),
INTENT(inout),
OPTIONAL :: f, last_f, projected_gradient
731 REAL(kind=
dp),
DIMENSION(4) :: results
733 IF (optimizer%master == optimizer%para_env%mepos)
THEN
734 results = [real(optimizer%isave(30), kind=
dp), &
735 optimizer%f, optimizer%dsave(2), optimizer%dsave(13)]
737 CALL optimizer%para_env%bcast(results, optimizer%master)
738 IF (
PRESENT(n_iter)) n_iter = nint(results(1))
739 IF (
PRESENT(f)) f = results(2)
740 IF (
PRESENT(last_f)) last_f = results(3)
741 IF (
PRESENT(projected_gradient)) projected_gradient = results(4)
743 END SUBROUTINE cp_opt_gopt_bcast_res
767 projected_gradient, converged, geo_section, force_env, &
768 gopt_param, spgr)
RESULT(res)
770 INTEGER,
INTENT(out),
OPTIONAL :: n_iter
771 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: f, last_f, projected_gradient
772 LOGICAL,
INTENT(out) :: converged
776 TYPE(
spgr_type),
OPTIONAL,
POINTER :: spgr
780 CALL cp_opt_gopt_step(optimizer, n_iter=n_iter, f=f, &
781 last_f=last_f, projected_gradient=projected_gradient, &
782 converged=converged, geo_section=geo_section, &
783 force_env=force_env, gopt_param=gopt_param, spgr=spgr)
784 res = (optimizer%status < 40) .AND. .NOT. converged
799 optimizer%task =
'STOPPED on user request'
801 IF (optimizer%master == optimizer%para_env%mepos)
THEN
802 CALL setulb(
SIZE(optimizer%x), optimizer%m, optimizer%x, &
803 optimizer%lower_bound, optimizer%upper_bound, &
804 optimizer%kind_of_bound, optimizer%f, optimizer%gradient, &
805 optimizer%wanted_relative_f_delta, &
806 optimizer%wanted_projected_gradient, optimizer%work_array, &
807 optimizer%i_work_array, optimizer%task, optimizer%print_every, &
808 optimizer%csave, optimizer%lsave, optimizer%isave, &
809 optimizer%dsave, optimizer%trust_radius)
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.
subroutine, public 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...
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