39 #include "./base/base_uses.f90"
44 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'optimize_basis_utils'
60 TYPE(basis_optimization_type) :: opt_bas
61 TYPE(section_vals_type),
POINTER :: root_section
62 TYPE(mp_para_env_type),
POINTER :: para_env
64 CHARACTER(LEN=default_path_length) :: main_dir
65 INTEGER :: iset, iweight, nrep
66 TYPE(section_vals_type),
POINTER :: kind_section, optbas_section, &
67 powell_section, train_section
74 CALL section_vals_val_get(optbas_section,
"BASIS_TEMPLATE_FILE", c_val=opt_bas%template_basis_file)
78 opt_bas%work_basis_file = trim(adjustl(main_dir))//
"/"//trim(adjustl(opt_bas%work_basis_file))
81 CALL section_vals_val_get(optbas_section,
"USE_CONDITION_NUMBER", l_val=opt_bas%use_condition_number)
83 CALL generate_initial_basis(kind_section, opt_bas, para_env)
86 IF (opt_bas%ntraining_sets == 0) &
87 cpabort(
"No training set was specified in the Input")
89 ALLOCATE (opt_bas%training_input(opt_bas%ntraining_sets))
90 ALLOCATE (opt_bas%training_dir(opt_bas%ntraining_sets))
91 DO iset = 1, opt_bas%ntraining_sets
94 CALL section_vals_val_get(train_section,
"INPUT_FILE_NAME", c_val=opt_bas%training_input(iset), &
98 CALL init_powell_var(opt_bas%powell_param, powell_section)
99 opt_bas%powell_param%nvar =
SIZE(opt_bas%x_opt)
101 CALL generate_derived_basis_sets(opt_bas, para_env)
103 CALL generate_basis_combinations(opt_bas, optbas_section)
106 ALLOCATE (opt_bas%fval_weight(0:opt_bas%ncombinations))
107 opt_bas%fval_weight = 1.0_dp
109 CALL section_vals_val_get(optbas_section,
"RESIDUUM_WEIGHT", r_val=opt_bas%fval_weight(iweight - 1), &
114 ALLOCATE (opt_bas%condition_weight(0:opt_bas%ncombinations))
115 opt_bas%condition_weight = 1.0_dp
117 CALL section_vals_val_get(optbas_section,
"CONDITION_WEIGHT", r_val=opt_bas%condition_weight(iweight - 1), &
121 CALL generate_computation_groups(opt_bas, optbas_section, para_env)
123 CALL print_opt_info(opt_bas)
131 SUBROUTINE print_opt_info(opt_bas)
132 TYPE(basis_optimization_type) :: opt_bas
134 INTEGER :: icomb, ikind, unit_nr
135 TYPE(cp_logger_type),
POINTER :: logger
139 IF (logger%para_env%is_source()) &
142 IF (unit_nr > 0)
THEN
143 WRITE (unit_nr,
'(1X,A,A)')
"BASOPT| Total number of calculations ", &
144 trim(cp_to_string(opt_bas%ncombinations*opt_bas%ntraining_sets))
145 WRITE (unit_nr,
'(A)')
""
146 DO icomb = 1, opt_bas%ncombinations
147 WRITE (unit_nr,
'(1X,A,A)')
"BASOPT| Content of basis combination ", trim(cp_to_string(icomb))
148 DO ikind = 1, opt_bas%nkind
149 WRITE (unit_nr,
'(1X,A,A4,4X,A,3X,A)')
"BASOPT| Element: ", trim(opt_bas%kind_basis(ikind)%element), &
150 "Basis set: ", trim(opt_bas%kind_basis(ikind)%flex_basis(opt_bas%combination(icomb, ikind))%basis_name)
152 WRITE (unit_nr,
'(A)')
""
155 END SUBROUTINE print_opt_info
164 SUBROUTINE generate_basis_combinations(opt_bas, optbas_section)
165 TYPE(basis_optimization_type) :: opt_bas
166 TYPE(section_vals_type),
POINTER :: optbas_section
168 INTEGER :: i, ikind, j, n_rep
169 INTEGER,
DIMENSION(:),
POINTER :: i_vals, tmp_i, tmp_i2
170 LOGICAL :: explicit, raise
174 CALL section_vals_val_get(optbas_section,
"BASIS_COMBINATIONS", explicit=explicit, n_rep_val=n_rep)
175 IF (.NOT. explicit)
THEN
176 opt_bas%ncombinations = 1
177 ALLOCATE (tmp_i(opt_bas%nkind))
178 ALLOCATE (tmp_i2(opt_bas%nkind))
179 DO ikind = 1, opt_bas%nkind
180 opt_bas%ncombinations = opt_bas%ncombinations*
SIZE(opt_bas%kind_basis(ikind)%flex_basis)
181 tmp_i(ikind) = opt_bas%kind_basis(ikind)%nbasis_deriv
183 ALLOCATE (opt_bas%combination(opt_bas%ncombinations, opt_bas%nkind))
185 DO i = 1, opt_bas%ncombinations
186 DO j = 1, opt_bas%nkind
187 opt_bas%combination(i, j) = tmp_i2(j)
189 tmp_i2(opt_bas%nkind) = tmp_i2(opt_bas%nkind) + 1
191 DO j = opt_bas%nkind, 1, -1
192 IF (raise) tmp_i2(j) = tmp_i2(j) + 1
193 IF (tmp_i2(j) .GT. tmp_i(j))
THEN
202 opt_bas%ncombinations = n_rep
203 ALLOCATE (opt_bas%combination(opt_bas%ncombinations, opt_bas%nkind))
206 opt_bas%combination(i, :) = i_vals(:)
210 END SUBROUTINE generate_basis_combinations
225 TYPE(basis_optimization_type) :: opt_bas
226 INTEGER :: set_id, bas_id
228 INTEGER :: ncom, nset
230 ncom = opt_bas%ncombinations
231 nset = opt_bas%ntraining_sets
233 set_id = (calc_id)/ncom + 1
234 bas_id = mod(calc_id, ncom) + 1
247 SUBROUTINE generate_computation_groups(opt_bas, optbas_section, para_env)
248 TYPE(basis_optimization_type) :: opt_bas
249 TYPE(section_vals_type),
POINTER :: optbas_section
250 TYPE(mp_para_env_type),
POINTER :: para_env
252 INTEGER :: iadd1, iadd2, icount, igroup, isize, j, &
254 INTEGER,
DIMENSION(:),
POINTER :: i_vals
257 nproc = para_env%num_pe
258 ncalc = opt_bas%ncombinations*opt_bas%ntraining_sets
262 IF (.NOT. explicit)
THEN
263 IF (nproc .GE. ncalc)
THEN
265 iadd2 = mod(nproc, ncalc)
266 ALLOCATE (opt_bas%comp_group(ncalc))
267 ALLOCATE (opt_bas%group_partition(0:ncalc - 1))
268 DO igroup = 0, ncalc - 1
269 ALLOCATE (opt_bas%comp_group(igroup + 1)%member_list(1))
270 opt_bas%comp_group(igroup + 1)%member_list(1) = igroup
271 opt_bas%group_partition(igroup) = iadd1
272 IF (igroup .LT. iadd2) opt_bas%group_partition(igroup) = opt_bas%group_partition(igroup) + 1
276 iadd2 = mod(ncalc, nproc)
277 ALLOCATE (opt_bas%comp_group(nproc))
278 ALLOCATE (opt_bas%group_partition(0:nproc - 1))
280 DO igroup = 0, nproc - 1
281 opt_bas%group_partition(igroup) = 1
283 IF (igroup .LT. iadd2) isize = isize + 1
284 ALLOCATE (opt_bas%comp_group(igroup + 1)%member_list(isize))
286 opt_bas%comp_group(igroup + 1)%member_list(j) = icount
297 IF (nptot /= nproc) &
298 CALL cp_abort(__location__, &
299 "Number of processors in group distribution does not match number of MPI tasks."// &
300 " Please change input.")
301 IF (.NOT. isize .LE. ncalc) &
302 CALL cp_abort(__location__, &
303 "Number of Groups larger than number of calculations"// &
304 " Please change input.")
305 cpassert(nptot == nproc)
306 ALLOCATE (opt_bas%comp_group(isize))
307 ALLOCATE (opt_bas%group_partition(0:isize - 1))
308 IF (isize .LT. ncalc)
THEN
310 iadd2 = mod(ncalc, isize)
312 DO igroup = 0, isize - 1
313 opt_bas%group_partition(igroup) = i_vals(igroup + 1)
315 IF (igroup .LT. iadd2) isize = isize + 1
316 ALLOCATE (opt_bas%comp_group(igroup + 1)%member_list(isize))
318 opt_bas%comp_group(igroup + 1)%member_list(j) = icount
323 DO igroup = 0, isize - 1
324 opt_bas%group_partition(igroup) = i_vals(igroup + 1)
325 ALLOCATE (opt_bas%comp_group(igroup + 1)%member_list(1))
326 opt_bas%comp_group(igroup + 1)%member_list(1) = igroup
331 END SUBROUTINE generate_computation_groups
343 TYPE(basis_optimization_type) :: opt_bas
345 CHARACTER(LEN=default_path_length) :: output_file
346 TYPE(mp_para_env_type),
POINTER :: para_env
348 INTEGER :: ibasis, ikind, unit_nr
350 DO ikind = 1, opt_bas%nkind
351 DO ibasis = 1, opt_bas%kind_basis(ikind)%nbasis_deriv
352 CALL update_used_parts(opt_bas%kind_basis(ikind)%deriv_info(ibasis), &
353 opt_bas%kind_basis(ikind)%flex_basis(0), &
354 opt_bas%kind_basis(ikind)%flex_basis(ibasis))
359 IF (para_env%is_source())
THEN
360 CALL open_file(file_name=output_file, file_status=
"UNKNOWN", &
361 file_action=
"WRITE", unit_number=unit_nr)
365 DO ikind = 1, opt_bas%nkind
366 DO ibasis = 0, opt_bas%kind_basis(ikind)%nbasis_deriv
367 CALL write_basis(opt_bas%kind_basis(ikind)%flex_basis(ibasis), opt_bas%kind_basis(ikind)%element, &
371 IF (para_env%is_source())
CALL close_file(unit_number=unit_nr)
384 SUBROUTINE update_used_parts(info_new, basis, basis_new)
385 TYPE(derived_basis_info) :: info_new
386 TYPE(flex_basis_type) :: basis, basis_new
388 INTEGER :: icont, iset, jcont, jset
391 DO iset = 1, basis%nsets
392 IF (info_new%in_use_set(iset))
THEN
394 basis_new%subset(jset)%exps(:) = basis%subset(iset)%exps
396 DO icont = 1, basis%subset(iset)%ncon_tot
397 IF (info_new%use_contr(iset)%in_use(icont))
THEN
399 basis_new%subset(jset)%coeff(:, jcont) = basis%subset(iset)%coeff(:, icont)
405 END SUBROUTINE update_used_parts
414 SUBROUTINE generate_derived_basis_sets(opt_bas, para_env)
415 TYPE(basis_optimization_type) :: opt_bas
416 TYPE(mp_para_env_type),
POINTER :: para_env
418 INTEGER :: ibasis, ikind, iref, jbasis, unit_nr
420 DO ikind = 1, opt_bas%nkind
421 CALL init_deriv_info_ref(opt_bas%kind_basis(ikind)%deriv_info(0), opt_bas%kind_basis(ikind)%flex_basis(0))
422 opt_bas%kind_basis(ikind)%deriv_info(0)%basis_name = trim(adjustl(opt_bas%kind_basis(ikind)%basis_name))
424 DO ibasis = 1, opt_bas%kind_basis(ikind)%nbasis_deriv
425 iref = opt_bas%kind_basis(ikind)%deriv_info(ibasis)%reference_set
426 DO jbasis = 0, opt_bas%kind_basis(ikind)%nbasis_deriv
427 IF (iref == jbasis)
CALL setup_used_parts_init_basis(opt_bas%kind_basis(ikind)%deriv_info(ibasis), &
428 opt_bas%kind_basis(ikind)%deriv_info(iref), &
429 opt_bas%kind_basis(ikind)%flex_basis(0), &
430 opt_bas%kind_basis(ikind)%flex_basis(ibasis))
435 IF (para_env%is_source())
THEN
436 CALL open_file(file_name=opt_bas%work_basis_file, file_status=
"UNKNOWN", &
437 file_action=
"WRITE", unit_number=unit_nr)
441 DO ikind = 1, opt_bas%nkind
442 DO ibasis = 0, opt_bas%kind_basis(ikind)%nbasis_deriv
443 IF (len_trim(opt_bas%kind_basis(ikind)%deriv_info(ibasis)%basis_name) > 0)
THEN
444 opt_bas%kind_basis(ikind)%flex_basis(ibasis)%basis_name = &
445 trim(adjustl(opt_bas%kind_basis(ikind)%deriv_info(ibasis)%basis_name))
447 opt_bas%kind_basis(ikind)%flex_basis(ibasis)%basis_name = &
448 trim(adjustl(opt_bas%kind_basis(ikind)%basis_name))//
"-DERIVED_SET-"//adjustl(cp_to_string(ibasis))
450 CALL write_basis(opt_bas%kind_basis(ikind)%flex_basis(ibasis), opt_bas%kind_basis(ikind)%element, &
454 IF (para_env%is_source())
CALL close_file(unit_number=unit_nr)
456 END SUBROUTINE generate_derived_basis_sets
466 SUBROUTINE write_basis(basis, element, unit_nr)
467 TYPE(flex_basis_type) :: basis
468 CHARACTER(LEN=default_string_length) :: element
471 INTEGER :: iexp, iset
473 IF (unit_nr > 0)
THEN
474 WRITE (unit=unit_nr, fmt=
"(A)") trim(adjustl(element))//
" "//trim(adjustl(basis%basis_name))
475 WRITE (unit=unit_nr, fmt=
"(1X,I0)") basis%nsets
476 DO iset = 1, basis%nsets
477 WRITE (unit=unit_nr, fmt=
"(30(1X,I0))") basis%subset(iset)%n, basis%subset(iset)%lmin, basis%subset(iset)%lmax, &
478 basis%subset(iset)%nexp, basis%subset(iset)%l
479 DO iexp = 1, basis%subset(iset)%nexp
480 WRITE (unit=unit_nr, fmt=
"(T2,F24.14,30(1X,ES24.14))") &
481 basis%subset(iset)%exps(iexp), basis%subset(iset)%coeff(iexp, :)
486 END SUBROUTINE write_basis
498 SUBROUTINE setup_used_parts_init_basis(info_new, info_ref, basis, basis_new)
499 TYPE(derived_basis_info) :: info_new, info_ref
500 TYPE(flex_basis_type) :: basis, basis_new
502 INTEGER :: i, jset, lind, nsets
506 ALLOCATE (info_new%in_use_set(
SIZE(info_ref%in_use_set)))
507 info_new%in_use_set(:) = info_ref%in_use_set
508 ALLOCATE (info_new%use_contr(
SIZE(info_ref%in_use_set)))
509 DO i = 1,
SIZE(info_ref%in_use_set)
510 ALLOCATE (info_new%use_contr(i)%in_use(
SIZE(info_ref%use_contr(i)%in_use)))
511 info_new%use_contr(i)%in_use(:) = info_ref%use_contr(i)%in_use
513 DO i = 1, info_new%nsets
514 info_new%in_use_set(info_new%remove_set(i)) = .false.
516 DO i = 1, info_new%ncontr
517 lind = convert_l_contr_to_entry(basis%subset(info_new%remove_contr(i, 1))%lmin, &
518 basis%subset(info_new%remove_contr(i, 1))%l, &
519 info_new%remove_contr(i, 3), info_new%remove_contr(i, 2))
521 info_new%use_contr(info_new%remove_contr(i, 1))%in_use(lind) = .false.
525 DO i = 1, basis%nsets
526 IF (info_new%in_use_set(i)) nsets = nsets + 1
528 basis_new%nsets = nsets
529 ALLOCATE (basis_new%subset(nsets))
531 DO i = 1, basis%nsets
532 IF (info_new%in_use_set(i))
THEN
534 CALL create_new_subset(basis%subset(i), basis_new%subset(jset), info_new%use_contr(jset)%in_use)
538 END SUBROUTINE setup_used_parts_init_basis
548 SUBROUTINE create_new_subset(subset, subset_new, in_use)
549 TYPE(subset_type) :: subset, subset_new
550 LOGICAL,
DIMENSION(:) :: in_use
552 INTEGER :: icon, iind, il
553 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: tmp_l
555 ALLOCATE (tmp_l(
SIZE(subset%l)))
557 subset_new%lmin = subset%lmin
558 subset_new%lmax = subset%lmin - 1
559 subset_new%nexp = subset%nexp
560 subset_new%n = subset%n
561 DO il = 1,
SIZE(subset%l)
562 DO icon = 1, subset%l(il)
563 iind = convert_l_contr_to_entry(subset%lmin, subset%l, icon, subset%lmin + il - 1)
564 IF (.NOT. in_use(iind)) tmp_l(il) = tmp_l(il) - 1
566 IF (tmp_l(il) .GT. 0) subset_new%lmax = subset_new%lmax + 1
568 subset_new%nl = subset_new%lmax - subset_new%lmin + 1
569 subset_new%ncon_tot = sum(tmp_l)
570 ALLOCATE (subset_new%l(subset_new%nl))
571 ALLOCATE (subset_new%coeff(subset_new%nexp, subset_new%ncon_tot))
572 ALLOCATE (subset_new%exps(subset_new%nexp))
573 subset_new%exps(:) = subset%exps
574 DO il = 1,
SIZE(subset%l)
575 IF (tmp_l(il) == 0)
EXIT
576 subset_new%l(il) = tmp_l(il)
580 DO icon = 1, subset%ncon_tot
581 IF (in_use(icon))
THEN
583 subset_new%coeff(:, iind) = subset%coeff(:, icon)
587 END SUBROUTINE create_new_subset
596 SUBROUTINE init_deriv_info_ref(info, basis)
597 TYPE(derived_basis_info) :: info
598 TYPE(flex_basis_type) :: basis
602 ALLOCATE (info%in_use_set(basis%nsets))
603 info%in_use_set = .true.
604 ALLOCATE (info%use_contr(basis%nsets))
605 DO i = 1, basis%nsets
606 ALLOCATE (info%use_contr(i)%in_use(basis%subset(i)%ncon_tot))
607 info%use_contr(i)%in_use = .true.
610 END SUBROUTINE init_deriv_info_ref
621 SUBROUTINE generate_initial_basis(kind_section, opt_bas, para_env)
622 TYPE(section_vals_type),
POINTER :: kind_section
623 TYPE(basis_optimization_type) :: opt_bas
624 TYPE(mp_para_env_type),
POINTER :: para_env
626 INTEGER :: ikind, variable_counter
628 TYPE(section_vals_type),
POINTER :: set_section
631 ALLOCATE (opt_bas%kind_basis(opt_bas%nkind))
635 DO ikind = 1, opt_bas%nkind
636 CALL section_vals_val_get(kind_section,
"_SECTION_PARAMETERS_", c_val=opt_bas%kind_basis(ikind)%element, &
638 CALL section_vals_val_get(kind_section,
"BASIS_SET", c_val=opt_bas%kind_basis(ikind)%basis_name, &
642 CALL section_vals_get(set_section, n_repetition=opt_bas%kind_basis(ikind)%nbasis_deriv, explicit=explicit)
643 IF (.NOT. explicit) opt_bas%kind_basis(ikind)%nbasis_deriv = 0
644 ALLOCATE (opt_bas%kind_basis(ikind)%flex_basis(0:opt_bas%kind_basis(ikind)%nbasis_deriv))
645 ALLOCATE (opt_bas%kind_basis(ikind)%deriv_info(0:opt_bas%kind_basis(ikind)%nbasis_deriv))
647 CALL fill_basis_template(kind_section, opt_bas%kind_basis(ikind)%flex_basis(0), opt_bas%template_basis_file, &
648 opt_bas%kind_basis(ikind)%element, opt_bas%kind_basis(ikind)%basis_name, para_env, ikind)
650 CALL setup_exp_constraints(kind_section, opt_bas%kind_basis(ikind)%flex_basis(0))
652 CALL parse_derived_basis(kind_section, opt_bas%kind_basis(ikind)%deriv_info, ikind)
654 variable_counter = variable_counter + opt_bas%kind_basis(ikind)%flex_basis(0)%nopt
657 ALLOCATE (opt_bas%x_opt(variable_counter))
660 DO ikind = 1, opt_bas%nkind
661 CALL assign_x_to_basis(opt_bas%x_opt, opt_bas%kind_basis(ikind)%flex_basis(0), variable_counter)
664 cpassert(variable_counter ==
SIZE(opt_bas%x_opt))
666 END SUBROUTINE generate_initial_basis
676 SUBROUTINE parse_derived_basis(kind_section, deriv_info, ikind)
677 TYPE(section_vals_type),
POINTER :: kind_section
678 TYPE(derived_basis_info),
DIMENSION(:) :: deriv_info
681 INTEGER :: i_rep, iset, jset, n_rep, nsets
682 INTEGER,
DIMENSION(:),
POINTER :: i_vals
684 TYPE(section_vals_type),
POINTER :: set1_section
686 nsets =
SIZE(deriv_info) - 1
695 deriv_info(iset)%reference_set = i_vals(1)
696 CALL section_vals_val_get(set1_section,
"REMOVE_CONTRACTION", explicit=explicit, n_rep_val=n_rep, &
698 deriv_info(iset)%ncontr = n_rep
700 ALLOCATE (deriv_info(iset)%remove_contr(n_rep, 3))
704 deriv_info(iset)%remove_contr(i_rep, :) = i_vals(:)
709 deriv_info(iset)%nsets = n_rep
711 ALLOCATE (deriv_info(iset)%remove_set(n_rep))
715 deriv_info(iset)%remove_set(i_rep) = i_vals(1)
720 END SUBROUTINE parse_derived_basis
729 SUBROUTINE setup_exp_constraints(kind1_section, flex_basis)
730 TYPE(section_vals_type),
POINTER :: kind1_section
731 TYPE(flex_basis_type) :: flex_basis
733 INTEGER :: ipgf, irep, iset, nrep
734 INTEGER,
DIMENSION(:),
POINTER :: def_exp
735 LOGICAL :: is_bound, is_varlim
736 TYPE(section_vals_type),
POINTER :: const_section
743 CALL section_vals_val_get(const_section,
"MAX_VAR_FRACTION", explicit=is_varlim, i_rep_section=irep)
744 IF (is_bound .AND. is_varlim) &
745 CALL cp_abort(__location__,
"Exponent has two constraints. "// &
746 "This is not possible at the moment. Please change input.")
747 IF (.NOT. is_bound .AND. .NOT. is_varlim) &
748 CALL cp_abort(__location__,
"Exponent is declared to be constraint but none is given"// &
749 " Please change input.")
750 IF (def_exp(1) == -1)
THEN
751 DO iset = 1, flex_basis%nsets
752 IF (def_exp(2) == -1)
THEN
753 DO ipgf = 1, flex_basis%subset(iset)%nexp
754 CALL set_constraint(flex_basis, iset, ipgf, const_section, is_bound, is_varlim, irep)
757 IF (def_exp(2) .LE. flex_basis%subset(iset)%nexp) &
758 CALL cp_abort(__location__, &
759 "Exponent declared in constraint is larger than number of exponents in the set"// &
760 " Please change input.")
761 CALL set_constraint(flex_basis, iset, def_exp(2), const_section, is_bound, is_varlim, irep)
765 IF (.NOT. def_exp(1) .LE. flex_basis%nsets) &
766 CALL cp_abort(__location__, &
767 "Set number of constraint is larger than number of sets in the template basis set."// &
768 " Please change input.")
769 IF (def_exp(2) == -1)
THEN
770 DO ipgf = 1, flex_basis%subset(iset)%nexp
771 CALL set_constraint(flex_basis, def_exp(1), ipgf, const_section, is_bound, is_varlim, irep)
774 IF (.NOT. def_exp(2) .LE. flex_basis%subset(def_exp(1))%nexp) &
775 CALL cp_abort(__location__, &
776 "Exponent declared in constraint is larger than number of exponents in the set"// &
777 " Please change input.")
778 CALL set_constraint(flex_basis, def_exp(1), def_exp(2), const_section, is_bound, is_varlim, irep)
783 END SUBROUTINE setup_exp_constraints
798 SUBROUTINE set_constraint(flex_basis, iset, ipgf, const_section, is_bound, is_varlim, irep)
799 TYPE(flex_basis_type) :: flex_basis
800 INTEGER :: iset, ipgf
801 TYPE(section_vals_type),
POINTER :: const_section
802 LOGICAL :: is_bound, is_varlim
805 REAL(kind=
dp) :: r_val
806 REAL(kind=
dp),
DIMENSION(:),
POINTER :: r_vals
808 IF (flex_basis%subset(iset)%exp_has_const(ipgf)) &
809 CALL cp_abort(__location__, &
810 "Multiple constraints due to collision in CONSTRAIN_EXPONENTS."// &
811 " Please change input.")
812 flex_basis%subset(iset)%exp_has_const(ipgf) = .true.
814 flex_basis%subset(iset)%exp_const(ipgf)%const_type = 0
816 flex_basis%subset(iset)%exp_const(ipgf)%llim = minval(r_vals)
817 flex_basis%subset(iset)%exp_const(ipgf)%ulim = maxval(r_vals)
818 r_val = flex_basis%subset(iset)%exps(ipgf)
819 IF (flex_basis%subset(iset)%exps(ipgf) .GT. maxval(r_vals) .OR. flex_basis%subset(iset)%exps(ipgf) .LT. minval(r_vals)) &
820 CALL cp_abort(__location__, &
821 "Exponent "//cp_to_string(r_val)// &
822 " declared in constraint is out of bounds of constraint"//cp_to_string(minval(r_vals))// &
823 " to"//cp_to_string(maxval(r_vals))// &
824 " Please change input.")
825 flex_basis%subset(iset)%exp_const(ipgf)%init = sum(r_vals)/2.0_dp
826 flex_basis%subset(iset)%exp_const(ipgf)%var_fac = maxval(r_vals)/flex_basis%subset(iset)%exp_const(ipgf)%init - 1.0_dp
829 flex_basis%subset(iset)%exp_const(ipgf)%const_type = 1
831 flex_basis%subset(iset)%exp_const(ipgf)%var_fac = r_vals(1)
832 flex_basis%subset(iset)%exp_const(ipgf)%init = flex_basis%subset(iset)%exps(ipgf)
835 END SUBROUTINE set_constraint
845 SUBROUTINE assign_x_to_basis(x, basis, x_ind)
846 REAL(kind=
dp),
DIMENSION(:) :: x
847 TYPE(flex_basis_type) :: basis
850 INTEGER :: icont, ipgf, iset
852 DO iset = 1, basis%nsets
853 DO ipgf = 1, basis%subset(iset)%nexp
854 IF (basis%subset(iset)%opt_exps(ipgf))
THEN
856 basis%subset(iset)%exp_x_ind(ipgf) = x_ind
857 x(x_ind) = basis%subset(iset)%exps(ipgf)
859 DO icont = 1, basis%subset(iset)%ncon_tot
860 IF (basis%subset(iset)%opt_coeff(ipgf, icont))
THEN
862 basis%subset(iset)%coeff_x_ind(ipgf, icont) = x_ind
863 x(x_ind) = basis%subset(iset)%coeff(ipgf, icont)
869 END SUBROUTINE assign_x_to_basis
883 SUBROUTINE fill_basis_template(kind1_section, flex_basis, template_basis_file, element, basis_name, para_env, ikind)
884 TYPE(section_vals_type),
POINTER :: kind1_section
885 TYPE(flex_basis_type) :: flex_basis
886 CHARACTER(LEN=default_path_length) :: template_basis_file
887 CHARACTER(LEN=default_string_length) :: element, basis_name
888 TYPE(mp_para_env_type),
POINTER :: para_env
891 INTEGER :: icont, idof, ipgf, irep, iset, nrep
892 INTEGER,
DIMENSION(:),
POINTER :: switch
894 CALL parse_basis(flex_basis, template_basis_file, element, basis_name, para_env)
900 DO iset = 1, flex_basis%nsets
905 flex_basis%subset(iset)%opt_coeff = .true.
906 flex_basis%subset(iset)%opt_exps = .true.
908 flex_basis%subset(iset)%opt_coeff = .true.
910 flex_basis%subset(iset)%opt_exps = .true.
912 cpabort(
"No initialization available?????")
916 CALL section_vals_val_get(kind1_section,
"SWITCH_CONTRACTION_STATE", n_rep_val=nrep, i_rep_section=ikind)
919 i_rep_section=ikind, i_vals=switch)
920 icont = convert_l_contr_to_entry(flex_basis%subset(switch(1))%lmin, flex_basis%subset(switch(1))%l, switch(3), switch(2))
921 DO ipgf = 1, flex_basis%subset(switch(1))%nexp
922 flex_basis%subset(switch(1))%opt_coeff(ipgf, icont) = .NOT. flex_basis%subset(switch(1))%opt_coeff(ipgf, icont)
926 CALL section_vals_val_get(kind1_section,
"SWITCH_COEFF_STATE", n_rep_val=nrep, i_rep_section=ikind)
929 i_rep_section=ikind, i_vals=switch)
930 icont = convert_l_contr_to_entry(flex_basis%subset(switch(1))%lmin, flex_basis%subset(switch(1))%l, switch(3), switch(2))
931 flex_basis%subset(switch(1))%opt_coeff(switch(4), icont) = &
932 .NOT. flex_basis%subset(switch(1))%opt_coeff(switch(4), icont)
935 CALL section_vals_val_get(kind1_section,
"SWITCH_EXP_STATE", n_rep_val=nrep, i_rep_section=ikind)
938 i_rep_section=ikind, i_vals=switch)
939 flex_basis%subset(switch(1))%opt_exps(switch(2)) = .NOT. flex_basis%subset(switch(1))%opt_exps(switch(2))
942 CALL section_vals_val_get(kind1_section,
"SWITCH_SET_STATE", n_rep_val=nrep, i_rep_section=ikind)
945 i_rep_section=ikind, i_vals=switch)
946 DO ipgf = 1, flex_basis%subset(switch(2))%nexp
947 SELECT CASE (switch(1))
949 DO icont = 1, flex_basis%subset(switch(2))%ncon_tot
950 flex_basis%subset(switch(2))%opt_coeff(ipgf, icont) = &
951 .NOT. flex_basis%subset(switch(2))%opt_coeff(ipgf, icont)
953 flex_basis%subset(switch(2))%opt_exps(ipgf) = .NOT. flex_basis%subset(switch(2))%opt_exps(ipgf)
955 flex_basis%subset(switch(2))%opt_exps(ipgf) = .NOT. flex_basis%subset(switch(2))%opt_exps(ipgf)
957 DO icont = 1, flex_basis%subset(switch(2))%ncon_tot
958 flex_basis%subset(switch(2))%opt_coeff(ipgf, icont) = &
959 .NOT. flex_basis%subset(switch(2))%opt_coeff(ipgf, icont)
962 cpabort(
"Invalid option in SWITCH_SET_STATE, 1st value has to be 0, 1 or 2")
968 DO irep = 1, flex_basis%nsets
969 IF (flex_basis%subset(irep)%nexp == 1)
THEN
970 DO ipgf = 1, flex_basis%subset(irep)%nexp
971 flex_basis%subset(irep)%opt_coeff(ipgf, 1) = .false.
978 DO irep = 1, flex_basis%nsets
979 DO ipgf = 1, flex_basis%subset(irep)%nexp
980 DO icont = 1, flex_basis%subset(irep)%ncon_tot
981 IF (flex_basis%subset(irep)%opt_coeff(ipgf, icont)) flex_basis%nopt = flex_basis%nopt + 1
983 IF (flex_basis%subset(irep)%opt_exps(ipgf)) flex_basis%nopt = flex_basis%nopt + 1
987 END SUBROUTINE fill_basis_template
1000 FUNCTION convert_l_contr_to_entry(lmin, nl, icontr, l)
RESULT(ientry)
1002 INTEGER,
DIMENSION(:) :: nl
1003 INTEGER :: icontr, l, ientry
1005 INTEGER :: i, icon2l, iwork
1010 icon2l = icon2l + nl(i)
1012 ientry = icon2l + icontr
1014 END FUNCTION convert_l_contr_to_entry
1026 SUBROUTINE parse_basis(flex_basis, template_basis_file, element, basis_name, para_env)
1027 TYPE(flex_basis_type) :: flex_basis
1028 CHARACTER(LEN=default_path_length) :: template_basis_file
1029 CHARACTER(LEN=default_string_length) :: element, basis_name
1030 TYPE(mp_para_env_type),
POINTER :: para_env
1032 CHARACTER(LEN=240) :: line
1033 CHARACTER(LEN=242) :: line2
1034 CHARACTER(LEN=LEN(basis_name)+2) :: basis_name2
1035 CHARACTER(LEN=LEN(element)+2) :: element2
1036 INTEGER :: iset, strlen1, strlen2
1037 LOGICAL :: basis_found, found, match
1038 TYPE(cp_parser_type) :: parser
1040 basis_found = .false.
1043 CALL parser_create(parser, template_basis_file, para_env=para_env)
1051 line2 =
" "//line//
" "
1052 element2 =
" "//trim(element)//
" "
1053 basis_name2 =
" "//trim(basis_name)//
" "
1054 strlen1 = len_trim(element2) + 1
1055 strlen2 = len_trim(basis_name2) + 1
1056 IF ((index(line2, element2(:strlen1)) > 0) .AND. &
1057 (index(line2, basis_name2(:strlen2)) > 0)) match = .true.
1059 CALL parser_get_object(parser, flex_basis%nsets, newline=.true.)
1060 ALLOCATE (flex_basis%subset(flex_basis%nsets))
1061 DO iset = 1, flex_basis%nsets
1062 CALL parse_subset(parser, flex_basis%subset(iset))
1064 basis_found = .true.
1073 IF (.NOT. basis_found)
CALL cp_abort(__location__, &
1074 "The requested basis set <"//trim(basis_name)// &
1075 "> for element <"//trim(element)//
"> was not "// &
1076 "found in the template basis set file ")
1078 END SUBROUTINE parse_basis
1086 SUBROUTINE parse_subset(parser, subset)
1087 TYPE(cp_parser_type),
INTENT(INOUT) :: parser
1088 TYPE(subset_type) :: subset
1090 CHARACTER(len=20*default_string_length) :: line_att
1091 INTEGER :: icon1, icon2, il, ipgf, ishell, istart
1092 REAL(kind=
dp) :: gs_scale
1093 REAL(kind=
dp),
POINTER :: r_val
1096 CALL parser_get_object(parser, subset%n, newline=.true.)
1097 CALL parser_get_object(parser, subset%lmin)
1098 CALL parser_get_object(parser, subset%lmax)
1099 CALL parser_get_object(parser, subset%nexp)
1100 subset%nl = subset%lmax - subset%lmin + 1
1102 ALLOCATE (subset%l(subset%nl))
1103 ALLOCATE (subset%exps(subset%nexp))
1104 ALLOCATE (subset%exp_has_const(subset%nexp))
1105 subset%exp_has_const = .false.
1106 ALLOCATE (subset%opt_exps(subset%nexp))
1107 subset%opt_exps = .false.
1108 ALLOCATE (subset%exp_const(subset%nexp))
1109 ALLOCATE (subset%exp_x_ind(subset%nexp))
1110 DO ishell = 1, subset%nl
1111 CALL parser_get_object(parser, subset%l(ishell))
1113 subset%ncon_tot = sum(subset%l)
1114 ALLOCATE (subset%coeff(subset%nexp, subset%ncon_tot))
1115 ALLOCATE (subset%opt_coeff(subset%nexp, subset%ncon_tot))
1116 subset%opt_coeff = .false.
1117 ALLOCATE (subset%coeff_x_ind(subset%nexp, subset%ncon_tot))
1118 DO ipgf = 1, subset%nexp
1119 CALL parser_get_object(parser, r_val, newline=.true.)
1120 subset%exps(ipgf) = r_val
1121 DO ishell = 1, subset%ncon_tot
1122 CALL parser_get_object(parser, r_val)
1123 subset%coeff(ipgf, ishell) = r_val
1129 DO il = 1, subset%nl
1130 DO icon1 = istart, istart + subset%l(il) - 2
1131 DO icon2 = icon1 + 1, istart + subset%l(il) - 1
1132 gs_scale = dot_product(subset%coeff(:, icon2), subset%coeff(:, icon1))/ &
1133 dot_product(subset%coeff(:, icon1), subset%coeff(:, icon1))
1134 subset%coeff(:, icon2) = subset%coeff(:, icon2) - gs_scale*subset%coeff(:, icon1)
1137 istart = istart + subset%l(il)
1141 DO icon1 = 1, subset%ncon_tot
1142 subset%coeff(:, icon1) = subset%coeff(:, icon1)/ &
1143 sqrt(dot_product(subset%coeff(:, icon1), subset%coeff(:, icon1)))
1147 END SUBROUTINE parse_subset
1156 SUBROUTINE init_powell_var(p_param, powell_section)
1158 TYPE(section_vals_type),
POINTER :: powell_section
1168 END SUBROUTINE init_powell_var
Utility routines to open and close files. Tracking of preconnections.
subroutine, public open_file(file_name, file_status, file_form, file_action, file_position, file_pad, unit_number, debug, skip_get_unit_number, file_access)
Opens the requested file using a free unit number.
subroutine, public close_file(unit_number, file_status, keep_preconnection)
Close an open file given by its logical unit number. Optionally, keep the file and unit preconnected.
various routines to log and control the output. The idea is that decisions about where to log should ...
recursive integer function, public cp_logger_get_default_unit_nr(logger, local, skip_not_ionode)
asks the default unit number of the given logger. try to use cp_logger_get_unit_nr
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
Utility routines to read data from files. Kept as close as possible to the old parser because.
subroutine, public parser_search_string(parser, string, ignore_case, found, line, begin_line, search_from_begin_of_file)
Search a string pattern in a file defined by its logical unit number "unit". A case sensitive search ...
Utility routines to read data from files. Kept as close as possible to the old parser because.
subroutine, public parser_release(parser)
releases the parser
subroutine, public parser_create(parser, file_name, unit_nr, para_env, end_section_label, separator_chars, comment_char, continuation_char, quote_char, section_char, parse_white_lines, initial_variables, apply_preprocessing)
Start a parser run. Initial variables allow to @SET stuff before opening the file.
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
integer, parameter, public default_path_length
Machine interface based on Fortran 2003 and POSIX.
integer, parameter, public default_output_unit
subroutine, public m_getcwd(curdir)
...
Interface to the message passing library MPI.
subroutine, public get_set_and_basis_id(calc_id, opt_bas, set_id, bas_id)
returns a mapping from the calculation id to the trainings set id and basis combination id
subroutine, public optimize_basis_init_read_input(opt_bas, root_section, para_env)
initialize all parts of the optimization type and read input settings
subroutine, public update_derived_basis_sets(opt_bas, write_it, output_file, para_env)
Regenerate the basis sets from reference 0 after an update from the optimizer to reference was perfor...
Utilities for string manipulations.
elemental subroutine, public uppercase(string)
Convert all lower case characters in a string to upper case.