86#include "../base/base_uses.f90"
92 LOGICAL,
PARAMETER,
PRIVATE :: debug_this_module = .true.
93 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'helium_methods'
117 CHARACTER(len=*),
PARAMETER :: routinen =
'helium_create'
119 CHARACTER(len=default_path_length) :: msg_str, potential_file_name
120 INTEGER :: color_sub, handle, i, input_unit, isize, &
121 itmp, j, k, mepos, nlines, ntab, &
123 INTEGER,
DIMENSION(:),
POINTER :: env_all
124 LOGICAL :: expl_cell, expl_dens, expl_nats, &
125 expl_pot, explicit, ltmp
126 REAL(kind=
dp) :: cgeof, dx, he_mass, mhe, rtmp, t, tau, &
128 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: pot_transfer
133 CALL timeset(routinen, handle)
139 NULLIFY (helium_section)
141 "MOTION%PINT%HELIUM")
152 num_env = logger%para_env%num_pe
154 cpassert(num_env >= 0)
155 IF (num_env .NE. logger%para_env%num_pe)
THEN
156 msg_str =
"NUM_ENV not equal to number of processors"
160 mepos = num_env/logger%para_env%num_pe &
161 + min(mod(num_env, logger%para_env%num_pe)/(logger%para_env%mepos + 1), 1)
164 ALLOCATE (env_all(logger%para_env%num_pe))
166 CALL logger%para_env%allgather(mepos, env_all)
175 CALL new_comm%from_split(logger%para_env, color_sub)
179 DEALLOCATE (new_comm)
184 IF (mepos .GT. 0)
THEN
185 ALLOCATE (helium_env(mepos))
187 helium_env(k)%comm => new_comm
188 NULLIFY (helium_env(k)%env_all)
189 helium_env(k)%env_all => env_all
190 ALLOCATE (helium_env(k)%helium)
191 NULLIFY (helium_env(k)%helium%input)
192 helium_env(k)%helium%input => input
193 helium_env(k)%helium%num_env = num_env
196 CALL helium_rng_init(helium_env)
199 NULLIFY (helium_env(k)%helium%ptable, &
200 helium_env(k)%helium%permutation, &
201 helium_env(k)%helium%savepermutation, &
202 helium_env(k)%helium%iperm, &
203 helium_env(k)%helium%saveiperm, &
204 helium_env(k)%helium%itmp_atoms_1d, &
205 helium_env(k)%helium%ltmp_atoms_1d, &
206 helium_env(k)%helium%itmp_atoms_np_1d, &
207 helium_env(k)%helium%pos, &
208 helium_env(k)%helium%savepos, &
209 helium_env(k)%helium%work, &
210 helium_env(k)%helium%force_avrg, &
211 helium_env(k)%helium%force_inst, &
212 helium_env(k)%helium%rtmp_3_np_1d, &
213 helium_env(k)%helium%rtmp_p_ndim_1d, &
214 helium_env(k)%helium%rtmp_p_ndim_np_1d, &
215 helium_env(k)%helium%rtmp_3_atoms_beads_1d, &
216 helium_env(k)%helium%rtmp_3_atoms_beads_np_1d, &
217 helium_env(k)%helium%rtmp_p_ndim_2d, &
218 helium_env(k)%helium%ltmp_3_atoms_beads_3d, &
219 helium_env(k)%helium%tmatrix, helium_env(k)%helium%pmatrix, &
220 helium_env(k)%helium%nmatrix, helium_env(k)%helium%ipmatrix, &
221 helium_env(k)%helium%u0, helium_env(k)%helium%e0, &
222 helium_env(k)%helium%uoffdiag, helium_env(k)%helium%eoffdiag, &
223 helium_env(k)%helium%vij, &
224 helium_env(k)%helium%rdf_inst, &
225 helium_env(k)%helium%plength_avrg, &
226 helium_env(k)%helium%plength_inst, &
227 helium_env(k)%helium%atom_plength, &
228 helium_env(k)%helium%ename &
231 helium_env(k)%helium%accepts = 0
232 helium_env(k)%helium%relrot = 0
235 helium_env(k)%helium%solute_present = .false.
236 helium_env(k)%helium%solute_atoms = 0
237 helium_env(k)%helium%solute_beads = 0
243 IF (
PRESENT(solute))
THEN
244 helium_env(k)%helium%solute_present = .true.
245 helium_env(k)%helium%solute_atoms = solute%ndim/3
246 helium_env(k)%helium%solute_beads = solute%p
251 i_val=helium_env(k)%helium%beads)
253 i_val=helium_env(k)%helium%iter_norot)
255 i_val=helium_env(k)%helium%iter_rot)
260 helium_env(k)%helium%first_step = itmp
266 helium_env(k)%helium%last_step = itmp
267 helium_env(k)%helium%num_steps = helium_env(k)%helium%last_step &
268 - helium_env(k)%helium%first_step
272 helium_env(k)%helium%num_steps = itmp
273 helium_env(k)%helium%last_step = helium_env(k)%helium%first_step &
274 + helium_env(k)%helium%num_steps
279 l_val=helium_env(k)%helium%periodic)
281 i_val=helium_env(k)%helium%cell_shape)
284 r_val=helium_env(k)%helium%droplet_radius)
295 explicit=expl_dens, r_val=helium_env(k)%helium%density)
297 explicit=expl_nats, i_val=helium_env(k)%helium%atoms)
301 IF (helium_env(k)%helium%periodic)
THEN
304 rtmp = (cgeof*helium_env(k)%helium%atoms/helium_env(k)%helium%density)**(1.0_dp/3.0_dp)
305 IF (.NOT. expl_cell)
THEN
306 helium_env(k)%helium%cell_size = rtmp
309 r_val=helium_env(k)%helium%cell_size)
311 IF (abs(helium_env(k)%helium%cell_size - rtmp) .GT. 100.0_dp*epsilon(0.0_dp)* &
312 (abs(helium_env(k)%helium%cell_size) + rtmp))
THEN
313 IF (expl_dens .AND. expl_nats)
THEN
314 msg_str =
"DENSITY, NATOMS and CELL_SIZE options "// &
315 "contradict each other"
319 IF (.NOT. expl_dens)
THEN
320 helium_env(k)%helium%density = cgeof*helium_env(k)%helium%atoms/helium_env(k)%helium%cell_size**3.0_dp
321 IF (.NOT. expl_nats)
THEN
322 msg_str =
"CELL_SIZE defined but neither "// &
323 "NATOMS nor DENSITY given, using default NATOMS."
328 helium_env(k)%helium%atoms = nint(helium_env(k)%helium%density* &
329 helium_env(k)%helium%cell_size**3.0_dp/cgeof)
332 rtmp = (cgeof*helium_env(k)%helium%atoms/helium_env(k)%helium%density &
334 IF (abs(helium_env(k)%helium%cell_size - rtmp) .GT. 100.0_dp*epsilon(0.0_dp) &
335 *(abs(helium_env(k)%helium%cell_size) + rtmp))
THEN
336 msg_str =
"Adjusting actual cell size "// &
337 "to maintain correct density."
339 helium_env(k)%helium%cell_size = rtmp
344 helium_env(k)%helium%cell_size_inv = 1.0_dp/helium_env(k)%helium%cell_size
349 SELECT CASE (helium_env(k)%helium%cell_shape)
352 helium_env(k)%helium%cell_m(1, 1) = -0.5_dp*helium_env(k)%helium%cell_size
353 helium_env(k)%helium%cell_m(2, 1) = 0.5_dp*helium_env(k)%helium%cell_size
354 helium_env(k)%helium%cell_m(3, 1) = 0.5_dp*helium_env(k)%helium%cell_size
355 helium_env(k)%helium%cell_m(1, 2) = 0.5_dp*helium_env(k)%helium%cell_size
356 helium_env(k)%helium%cell_m(2, 2) = -0.5_dp*helium_env(k)%helium%cell_size
357 helium_env(k)%helium%cell_m(3, 2) = 0.5_dp*helium_env(k)%helium%cell_size
358 helium_env(k)%helium%cell_m(1, 3) = 0.5_dp*helium_env(k)%helium%cell_size
359 helium_env(k)%helium%cell_m(2, 3) = 0.5_dp*helium_env(k)%helium%cell_size
360 helium_env(k)%helium%cell_m(3, 3) = -0.5_dp*helium_env(k)%helium%cell_size
361 helium_env(k)%helium%cell_m_inv(1, 1) = 0.0_dp
362 helium_env(k)%helium%cell_m_inv(2, 1) = 1.0_dp/helium_env(k)%helium%cell_size
363 helium_env(k)%helium%cell_m_inv(3, 1) = 1.0_dp/helium_env(k)%helium%cell_size
364 helium_env(k)%helium%cell_m_inv(1, 2) = 1.0_dp/helium_env(k)%helium%cell_size
365 helium_env(k)%helium%cell_m_inv(2, 2) = 0.0_dp
366 helium_env(k)%helium%cell_m_inv(3, 2) = 1.0_dp/helium_env(k)%helium%cell_size
367 helium_env(k)%helium%cell_m_inv(1, 3) = 1.0_dp/helium_env(k)%helium%cell_size
368 helium_env(k)%helium%cell_m_inv(2, 3) = 1.0_dp/helium_env(k)%helium%cell_size
369 helium_env(k)%helium%cell_m_inv(3, 3) = 0.0_dp
372 helium_env(k)%helium%cell_m(1, 1) = helium_env(k)%helium%cell_size
373 helium_env(k)%helium%cell_m(2, 1) = 0.0_dp
374 helium_env(k)%helium%cell_m(3, 1) = 0.0_dp
375 helium_env(k)%helium%cell_m(1, 2) = 0.0_dp
376 helium_env(k)%helium%cell_m(2, 2) = helium_env(k)%helium%cell_size
377 helium_env(k)%helium%cell_m(3, 2) = 0.0_dp
378 helium_env(k)%helium%cell_m(1, 3) = 0.0_dp
379 helium_env(k)%helium%cell_m(2, 3) = 0.0_dp
380 helium_env(k)%helium%cell_m(3, 3) = helium_env(k)%helium%cell_size
381 helium_env(k)%helium%cell_m_inv(1, 1) = 1.0_dp/helium_env(k)%helium%cell_size
382 helium_env(k)%helium%cell_m_inv(2, 1) = 0.0_dp
383 helium_env(k)%helium%cell_m_inv(3, 1) = 0.0_dp
384 helium_env(k)%helium%cell_m_inv(1, 2) = 0.0_dp
385 helium_env(k)%helium%cell_m_inv(2, 2) = 1.0_dp/helium_env(k)%helium%cell_size
386 helium_env(k)%helium%cell_m_inv(3, 2) = 0.0_dp
387 helium_env(k)%helium%cell_m_inv(1, 3) = 0.0_dp
388 helium_env(k)%helium%cell_m_inv(2, 3) = 0.0_dp
389 helium_env(k)%helium%cell_m_inv(3, 3) = 1.0_dp/helium_env(k)%helium%cell_size
391 helium_env(k)%helium%cell_m(:, :) = 0.0_dp
392 helium_env(k)%helium%cell_m_inv(:, :) = 0.0_dp
398 IF (logger%para_env%is_source())
THEN
400 c_val=potential_file_name)
401 CALL open_file(file_name=trim(potential_file_name), &
402 file_action=
"READ", file_status=
"OLD", unit_number=input_unit)
403 READ (input_unit,
"(A)") msg_str
404 READ (msg_str, *, iostat=i) nlines, pdx, tau, &
405 x_spline, dx, he_mass
408 he_mass = 4.00263037059764_dp
410 READ (msg_str, *, iostat=i) nlines, pdx, tau, &
413 msg_str =
"Format/Read Error from Solvent POTENTIAL_FILE"
430 CALL helium_env(1)%comm%bcast(nlines, logger%para_env%source)
431 CALL helium_env(1)%comm%bcast(pdx, logger%para_env%source)
432 CALL helium_env(1)%comm%bcast(tau, logger%para_env%source)
433 CALL helium_env(1)%comm%bcast(x_spline, logger%para_env%source)
434 CALL helium_env(1)%comm%bcast(dx, logger%para_env%source)
435 CALL helium_env(1)%comm%bcast(he_mass, logger%para_env%source)
436 isize = (pdx + 1)*(pdx + 2) + 1
437 ALLOCATE (pot_transfer(nlines, isize))
438 IF (logger%para_env%is_source())
THEN
441 READ (input_unit, *) pot_transfer(i, :)
445 READ (input_unit, *) pot_transfer(i, 1:isize - 1)
452 CALL helium_env(1)%comm%bcast(pot_transfer, logger%para_env%source)
456 helium_env(1)%helium%vij%x1 = x_spline
460 helium_env(1)%helium%u0%x1 = x_spline
464 helium_env(1)%helium%e0%x1 = x_spline
467 ntab = ((isize + 1)*isize)/2 - 1
468 ALLOCATE (helium_env(1)%helium%uoffdiag(ntab, 2, nlines))
469 ALLOCATE (helium_env(1)%helium%eoffdiag(ntab, 2, nlines))
472 IF (i + j == 2) cycle
473 k = ((i - 1)*i)/2 + j
474 helium_env(1)%helium%vij%y(:) = pot_transfer(:, k)*
angstrom**(2*i - 2)
476 helium_env(1)%helium%uoffdiag(ntab, 1, :) = helium_env(1)%helium%vij%y(:)
477 helium_env(1)%helium%uoffdiag(ntab, 2, :) = helium_env(1)%helium%vij%y2(:)
478 k = k + ((isize + 1)*isize)/2
479 helium_env(1)%helium%vij%y(:) = pot_transfer(:, k)*
angstrom**(2*i - 2)/
kelvin
481 helium_env(1)%helium%eoffdiag(ntab, 1, :) = helium_env(1)%helium%vij%y(:)
482 helium_env(1)%helium%eoffdiag(ntab, 2, :) = helium_env(1)%helium%vij%y2(:)
487 ntab =
SIZE(pot_transfer, 2)
488 helium_env(1)%helium%vij%y(:) = pot_transfer(:, ntab)/
kelvin
491 helium_env(1)%helium%u0%y(:) = pot_transfer(:, 1)
493 k = ((isize + 1)*isize)/2 + 1
494 helium_env(1)%helium%e0%y(:) = pot_transfer(:, k)/
kelvin
498 helium_env(k)%helium%vij => helium_env(1)%helium%vij
499 helium_env(k)%helium%u0 => helium_env(1)%helium%u0
500 helium_env(k)%helium%e0 => helium_env(1)%helium%e0
501 helium_env(k)%helium%uoffdiag => helium_env(1)%helium%uoffdiag
502 helium_env(k)%helium%eoffdiag => helium_env(1)%helium%eoffdiag
507 helium_env(k)%helium%pdx = pdx
508 helium_env(k)%helium%tau = tau
516 t =
kelvin/helium_env(k)%helium%tau/helium_env(k)%helium%beads
521 helium_env(k)%helium%he_mass_au = he_mass*
massunit
522 helium_env(k)%helium%hb2m = 1.0_dp/helium_env(k)%helium%he_mass_au
523 helium_env(k)%helium%pweight = 0.0_dp
526 helium_env(k)%helium%worm_max_open_cycles = 0
530 i_val=helium_env(k)%helium%sampling_method)
532 SELECT CASE (helium_env(k)%helium%sampling_method)
536 i_val=helium_env(k)%helium%maxcycle)
537 i = helium_env(k)%helium%maxcycle
539 i = helium_env(k)%helium%atoms - helium_env(k)%helium%maxcycle
547 helium_env(k)%helium%m_dist_type = i
551 cpassert(i <= helium_env(k)%helium%maxcycle)
552 helium_env(k)%helium%m_value = i
555 cpassert(rtmp > 0.0_dp)
556 cpassert(rtmp <= 1.0_dp)
557 helium_env(k)%helium%m_ratio = rtmp
560 i_val=helium_env(k)%helium%bisection)
562 i = helium_env(k)%helium%bisection
564 i = helium_env(k)%helium%beads - helium_env(k)%helium%bisection
567 itmp = helium_env(k)%helium%bisection
568 rtmp = 2.0_dp**(anint(log(real(itmp,
dp))/log(2.0_dp)))
569 tcheck = abs(real(itmp, kind=
dp) - rtmp)
570 IF (tcheck > 100.0_dp*epsilon(0.0_dp))
THEN
571 msg_str =
"BISECTION should be integer power of 2."
574 helium_env(k)%helium%bisctlog2 = nint(log(real(itmp,
dp))/log(2.0_dp))
579 "MOTION%PINT%HELIUM%WORM")
581 r_val=helium_env(k)%helium%worm_centroid_drmax)
584 i_val=helium_env(k)%helium%worm_staging_l)
587 r_val=helium_env(k)%helium%worm_open_close_scale)
590 l_val=helium_env(k)%helium%worm_allow_open)
591 IF (helium_env(k)%helium%atoms == 1)
THEN
592 IF (helium_env(k)%helium%worm_allow_open)
THEN
593 msg_str =
"Default enabled open state sampling "// &
594 "for only 1 He might be inefficient."
600 i_val=helium_env(k)%helium%worm_max_open_cycles)
602 IF (helium_env(k)%helium%worm_staging_l + 1 >= helium_env(k)%helium%beads)
THEN
603 msg_str =
"STAGING_L for worm sampling is too large"
605 ELSE IF (helium_env(k)%helium%worm_staging_l < 1)
THEN
606 msg_str =
"STAGING_L must be positive integer"
611 l_val=helium_env(k)%helium%worm_show_statistics)
615 rtmp = 2.0_dp*
pi*helium_env(k)%helium%hb2m
618 rtmp = rtmp*helium_env(k)%helium%worm_open_close_scale
619 IF (helium_env(k)%helium%periodic)
THEN
620 rtmp = rtmp*helium_env(k)%helium%density
622 rtmp = rtmp*helium_env(k)%helium%atoms/ &
623 (4.0_dp/3.0_dp*
pi*helium_env(k)%helium%droplet_radius**3)
625 helium_env(k)%helium%worm_ln_openclose_scale = log(rtmp)
628 helium_env(k)%helium%maxcycle = 1
629 helium_env(k)%helium%bisctlog2 = 0
632 helium_env(k)%helium%worm_all_limit = 0
635 helium_env(k)%helium%worm_centroid_min = 1
636 helium_env(k)%helium%worm_centroid_max = itmp
637 helium_env(k)%helium%worm_all_limit = helium_env(k)%helium%worm_all_limit + itmp
640 helium_env(k)%helium%worm_staging_min = helium_env(k)%helium%worm_centroid_max + 1
641 helium_env(k)%helium%worm_staging_max = helium_env(k)%helium%worm_centroid_max + itmp
642 helium_env(k)%helium%worm_all_limit = helium_env(k)%helium%worm_all_limit + itmp
643 IF (helium_env(k)%helium%worm_allow_open)
THEN
646 helium_env(k)%helium%worm_fcrawl_min = helium_env(k)%helium%worm_staging_max + 1
647 helium_env(k)%helium%worm_fcrawl_max = helium_env(k)%helium%worm_staging_max + itmp
648 helium_env(k)%helium%worm_all_limit = helium_env(k)%helium%worm_all_limit + itmp
649 helium_env(k)%helium%worm_bcrawl_min = helium_env(k)%helium%worm_fcrawl_max + 1
650 helium_env(k)%helium%worm_bcrawl_max = helium_env(k)%helium%worm_fcrawl_max + itmp
651 helium_env(k)%helium%worm_all_limit = helium_env(k)%helium%worm_all_limit + itmp
654 helium_env(k)%helium%worm_head_min = helium_env(k)%helium%worm_bcrawl_max + 1
655 helium_env(k)%helium%worm_head_max = helium_env(k)%helium%worm_bcrawl_max + itmp
656 helium_env(k)%helium%worm_all_limit = helium_env(k)%helium%worm_all_limit + itmp
657 helium_env(k)%helium%worm_tail_min = helium_env(k)%helium%worm_head_max + 1
658 helium_env(k)%helium%worm_tail_max = helium_env(k)%helium%worm_head_max + itmp
659 helium_env(k)%helium%worm_all_limit = helium_env(k)%helium%worm_all_limit + itmp
662 helium_env(k)%helium%worm_swap_min = helium_env(k)%helium%worm_tail_max + 1
663 helium_env(k)%helium%worm_swap_max = helium_env(k)%helium%worm_tail_max + itmp
664 helium_env(k)%helium%worm_all_limit = helium_env(k)%helium%worm_all_limit + itmp
667 helium_env(k)%helium%worm_open_close_min = helium_env(k)%helium%worm_swap_max + 1
668 helium_env(k)%helium%worm_open_close_max = helium_env(k)%helium%worm_swap_max + itmp
669 helium_env(k)%helium%worm_all_limit = helium_env(k)%helium%worm_all_limit + itmp
671 i_val=helium_env(k)%helium%worm_repeat_crawl)
677 msg_str =
"Unknown helium sampling method!"
682 i = helium_env(k)%helium%atoms
683 j = helium_env(k)%helium%beads
684 ALLOCATE (helium_env(k)%helium%pos(3, i, j))
685 helium_env(k)%helium%pos = 0.0_dp
686 ALLOCATE (helium_env(k)%helium%work(3, i, j))
687 ALLOCATE (helium_env(k)%helium%ptable(helium_env(k)%helium%maxcycle + 1))
688 ALLOCATE (helium_env(k)%helium%permutation(i))
689 ALLOCATE (helium_env(k)%helium%iperm(i))
690 ALLOCATE (helium_env(k)%helium%tmatrix(i, i))
691 ALLOCATE (helium_env(k)%helium%nmatrix(i, 2*i))
692 ALLOCATE (helium_env(k)%helium%pmatrix(i, i))
693 ALLOCATE (helium_env(k)%helium%ipmatrix(i, i))
694 itmp = helium_env(k)%helium%bisctlog2 + 2
695 ALLOCATE (helium_env(k)%helium%num_accepted(itmp, helium_env(k)%helium%maxcycle))
696 ALLOCATE (helium_env(k)%helium%plength_avrg(helium_env(k)%helium%atoms))
697 ALLOCATE (helium_env(k)%helium%plength_inst(helium_env(k)%helium%atoms))
698 ALLOCATE (helium_env(k)%helium%atom_plength(helium_env(k)%helium%atoms))
699 IF (helium_env(k)%helium%worm_max_open_cycles > 0)
THEN
700 ALLOCATE (helium_env(k)%helium%savepermutation(i))
701 ALLOCATE (helium_env(k)%helium%saveiperm(i))
702 ALLOCATE (helium_env(k)%helium%savepos(3, i, j))
706 helium_env(k)%helium%rdf_present = helium_property_active(helium_env(k)%helium,
"RDF")
707 IF (helium_env(k)%helium%rdf_present)
THEN
709 CALL helium_rdf_init(helium_env(k)%helium)
713 helium_env(k)%helium%rho_present = helium_property_active(helium_env(k)%helium,
"RHO")
714 IF (helium_env(k)%helium%rho_present)
THEN
716 NULLIFY (helium_env(k)%helium%rho_property)
717 CALL helium_rho_init(helium_env(k)%helium)
723 CALL helium_averages_restore(helium_env)
727 helium_env(k)%helium%e_corr = 0.0_dp
728 IF (helium_env(k)%helium%solute_present)
THEN
729 IF (helium_env(k)%helium%solute_beads > helium_env(k)%helium%beads)
THEN
731 helium_env(k)%helium%bead_ratio = helium_env(k)%helium%solute_beads/ &
732 helium_env(k)%helium%beads
734 i = helium_env(k)%helium%bead_ratio*helium_env(k)%helium%beads - helium_env(k)%helium%solute_beads
736 msg_str =
"Adjust number of solute beads to multiple of solvent beads."
739 msg_str =
"Using multiple-time stepping in imaginary time for solute to couple "// &
740 "to fewer solvent beads, e.g. for factor 3: "// &
741 "he_1 - 3*sol_1; he_2 - 3*sol_4... "// &
742 "Avoid too large coupling factors."
744 ELSE IF (helium_env(k)%helium%solute_beads < helium_env(k)%helium%beads)
THEN
746 helium_env(k)%helium%bead_ratio = helium_env(k)%helium%beads/ &
747 helium_env(k)%helium%solute_beads
749 i = helium_env(k)%helium%bead_ratio*helium_env(k)%helium%solute_beads - helium_env(k)%helium%beads
751 msg_str =
"Adjust number of solvent beads to multiple of solute beads."
754 msg_str =
"Coupling solvent beads to fewer solute beads via "// &
755 "direct coupling, e.g. for factor 3: "// &
756 "sol_1 - he_1,2,3; sol_2 - he_4,5,6..."
762 tcheck = abs((helium_env(k)%helium%tau*helium_env(k)%helium%beads - solute%beta)/solute%beta)
763 IF (tcheck > 1.0e-14_dp)
THEN
764 msg_str =
"Tau, temperature and bead number are inconsistent."
768 CALL helium_set_solute_indices(helium_env(k)%helium, solute)
769 CALL helium_set_solute_cell(helium_env(k)%helium, solute)
773 i_val=helium_env(k)%helium%solute_interaction)
776 NULLIFY (nnp_section)
779 msg_str =
"NNP section not explicitly stated. Using default file names."
780 cpwarn_if(.NOT. explicit, msg_str)
782 ALLOCATE (helium_env(k)%helium%nnp)
783 CALL cp_logger_create(tmplogger, para_env=helium_env(k)%comm, template_logger=logger)
785 CALL helium_init_nnp(helium_env(k)%helium, helium_env(k)%helium%nnp, nnp_section)
790 WRITE (msg_str,
'(A,I0,A)') &
791 "Solute found but no helium-solute interaction selected "// &
792 "(see SOLUTE_INTERACTION keyword)"
797 ALLOCATE (helium_env(k)%helium%force_avrg(helium_env(k)%helium%solute_beads, &
798 helium_env(k)%helium%solute_atoms*3))
799 ALLOCATE (helium_env(k)%helium%force_inst(helium_env(k)%helium%solute_beads, &
800 helium_env(k)%helium%solute_atoms*3))
802 ALLOCATE (helium_env(k)%helium%rtmp_p_ndim_1d(solute%p*solute%ndim))
803 ALLOCATE (helium_env(k)%helium%rtmp_p_ndim_np_1d(solute%p*solute%ndim*helium_env(k)%helium%num_env))
804 ALLOCATE (helium_env(k)%helium%rtmp_p_ndim_2d(solute%p, solute%ndim))
807 helium_env(k)%helium%bead_ratio = 0
808 IF (helium_env(k)%helium%periodic)
THEN
810 x1 =
angstrom*0.5_dp*helium_env(k)%helium%cell_size
813 helium_env(k)%helium%e_corr = (
twopi*helium_env(k)%helium%density/
angstrom**3*10.8_dp* &
814 (544850.4_dp*exp(-13.353384_dp*x1/2.9673_dp)*(2.9673_dp/13.353384_dp)**3* &
815 (2.0_dp + 2.0_dp*13.353384_dp*x1/2.9673_dp + (13.353384_dp*x1/2.9673_dp)**2) - &
816 (((0.1781_dp/7.0_dp*(2.9673_dp/x1)**2 + 0.4253785_dp/5.0_dp)*(2.9673_dp/x1)**2 + &
817 1.3732412_dp/3.0_dp)*(2.9673_dp/x1)**3)*2.9673_dp**3))/
kelvin
822 ALLOCATE (helium_env(k)%helium%itmp_atoms_1d(helium_env(k)%helium%atoms))
823 ALLOCATE (helium_env(k)%helium%ltmp_atoms_1d(helium_env(k)%helium%atoms))
824 ALLOCATE (helium_env(k)%helium%itmp_atoms_np_1d(helium_env(k)%helium%atoms*helium_env(k)%helium%num_env))
825 ALLOCATE (helium_env(k)%helium%rtmp_3_np_1d(3*helium_env(k)%helium%num_env))
826 ALLOCATE (helium_env(k)%helium%rtmp_3_atoms_beads_1d(3*helium_env(k)%helium%atoms* &
827 helium_env(k)%helium%beads))
828 ALLOCATE (helium_env(k)%helium%rtmp_3_atoms_beads_np_1d(3*helium_env(k)%helium%atoms* &
829 helium_env(k)%helium%beads*helium_env(k)%helium%num_env))
830 ALLOCATE (helium_env(k)%helium%ltmp_3_atoms_beads_3d(3, helium_env(k)%helium%atoms, &
831 helium_env(k)%helium%beads))
836 DEALLOCATE (pot_transfer)
843 CALL timestop(handle)
860 IF (
ASSOCIATED(helium_env))
THEN
861 DO k = 1,
SIZE(helium_env)
863 CALL helium_env(k)%comm%free()
864 DEALLOCATE (helium_env(k)%comm)
865 DEALLOCATE (helium_env(k)%env_all)
867 NULLIFY (helium_env(k)%env_all)
871 helium_env(k)%helium%ltmp_3_atoms_beads_3d, &
872 helium_env(k)%helium%rtmp_3_atoms_beads_np_1d, &
873 helium_env(k)%helium%rtmp_3_atoms_beads_1d, &
874 helium_env(k)%helium%rtmp_3_np_1d, &
875 helium_env(k)%helium%itmp_atoms_np_1d, &
876 helium_env(k)%helium%ltmp_atoms_1d, &
877 helium_env(k)%helium%itmp_atoms_1d)
880 helium_env(k)%helium%ltmp_3_atoms_beads_3d, &
881 helium_env(k)%helium%rtmp_3_atoms_beads_np_1d, &
882 helium_env(k)%helium%rtmp_3_atoms_beads_1d, &
883 helium_env(k)%helium%rtmp_3_np_1d, &
884 helium_env(k)%helium%itmp_atoms_np_1d, &
885 helium_env(k)%helium%ltmp_atoms_1d, &
886 helium_env(k)%helium%itmp_atoms_1d &
889 IF (helium_env(k)%helium%solute_present)
THEN
892 helium_env(k)%helium%rtmp_p_ndim_2d, &
893 helium_env(k)%helium%rtmp_p_ndim_np_1d, &
894 helium_env(k)%helium%rtmp_p_ndim_1d, &
895 helium_env(k)%helium%force_inst, &
896 helium_env(k)%helium%force_avrg)
898 helium_env(k)%helium%rtmp_p_ndim_2d, &
899 helium_env(k)%helium%rtmp_p_ndim_np_1d, &
900 helium_env(k)%helium%rtmp_p_ndim_1d, &
901 helium_env(k)%helium%force_inst, &
902 helium_env(k)%helium%force_avrg)
905 IF (helium_env(k)%helium%rho_present)
THEN
907 helium_env(k)%helium%rho_rstr, &
908 helium_env(k)%helium%rho_accu, &
909 helium_env(k)%helium%rho_inst, &
910 helium_env(k)%helium%rho_incr)
912 helium_env(k)%helium%rho_rstr, &
913 helium_env(k)%helium%rho_accu, &
914 helium_env(k)%helium%rho_inst, &
915 helium_env(k)%helium%rho_incr)
917 DEALLOCATE (helium_env(k)%helium%rho_property(
rho_atom_number)%filename_suffix)
918 DEALLOCATE (helium_env(k)%helium%rho_property(
rho_atom_number)%component_name)
919 DEALLOCATE (helium_env(k)%helium%rho_property(
rho_atom_number)%component_index)
920 NULLIFY (helium_env(k)%helium%rho_property(
rho_atom_number)%filename_suffix)
921 NULLIFY (helium_env(k)%helium%rho_property(
rho_atom_number)%component_name)
922 NULLIFY (helium_env(k)%helium%rho_property(
rho_atom_number)%component_index)
929 DEALLOCATE (helium_env(k)%helium%rho_property(
rho_winding_cycle)%filename_suffix)
931 DEALLOCATE (helium_env(k)%helium%rho_property(
rho_winding_cycle)%component_index)
947 DEALLOCATE (helium_env(k)%helium%rho_property)
948 NULLIFY (helium_env(k)%helium%rho_property)
951 CALL helium_rdf_release(helium_env(k)%helium)
955 helium_env(k)%helium%atom_plength, &
956 helium_env(k)%helium%plength_inst, &
957 helium_env(k)%helium%plength_avrg, &
958 helium_env(k)%helium%num_accepted, &
959 helium_env(k)%helium%ipmatrix, &
960 helium_env(k)%helium%pmatrix, &
961 helium_env(k)%helium%nmatrix, &
962 helium_env(k)%helium%tmatrix, &
963 helium_env(k)%helium%iperm, &
964 helium_env(k)%helium%permutation, &
965 helium_env(k)%helium%ptable, &
966 helium_env(k)%helium%work, &
967 helium_env(k)%helium%pos)
968 IF (helium_env(k)%helium%worm_max_open_cycles > 0)
THEN
969 DEALLOCATE (helium_env(k)%helium%saveiperm, &
970 helium_env(k)%helium%savepermutation, &
971 helium_env(k)%helium%savepos)
974 helium_env(k)%helium%atom_plength, &
975 helium_env(k)%helium%plength_inst, &
976 helium_env(k)%helium%plength_avrg, &
977 helium_env(k)%helium%num_accepted, &
978 helium_env(k)%helium%ipmatrix, &
979 helium_env(k)%helium%pmatrix, &
980 helium_env(k)%helium%nmatrix, &
981 helium_env(k)%helium%tmatrix, &
982 helium_env(k)%helium%iperm, &
983 helium_env(k)%helium%saveiperm, &
984 helium_env(k)%helium%permutation, &
985 helium_env(k)%helium%savepermutation, &
986 helium_env(k)%helium%ptable, &
987 helium_env(k)%helium%work, &
988 helium_env(k)%helium%pos, &
989 helium_env(k)%helium%savepos &
996 DEALLOCATE (helium_env(k)%helium%uoffdiag)
997 DEALLOCATE (helium_env(k)%helium%eoffdiag)
999 NULLIFY (helium_env(k)%helium%uoffdiag, &
1000 helium_env(k)%helium%eoffdiag, &
1001 helium_env(k)%helium%vij, &
1002 helium_env(k)%helium%u0, &
1003 helium_env(k)%helium%e0)
1005 DEALLOCATE (helium_env(k)%helium%rng_stream_uniform)
1006 DEALLOCATE (helium_env(k)%helium%rng_stream_gaussian)
1009 IF (helium_env(k)%helium%solute_present)
THEN
1010 DEALLOCATE (helium_env(k)%helium%solute_element)
1011 NULLIFY (helium_env(k)%helium%solute_element)
1015 IF (
ASSOCIATED(helium_env(k)%helium%ename))
THEN
1016 DEALLOCATE (helium_env(k)%helium%ename)
1017 NULLIFY (helium_env(k)%helium%ename)
1021 IF (
ASSOCIATED(helium_env(k)%helium%nnp))
THEN
1023 DEALLOCATE (helium_env(k)%helium%nnp)
1024 NULLIFY (helium_env(k)%helium%nnp)
1026 IF (
ASSOCIATED(helium_env(k)%helium%nnp_sr_cut))
THEN
1027 DEALLOCATE (helium_env(k)%helium%nnp_sr_cut)
1028 NULLIFY (helium_env(k)%helium%nnp_sr_cut)
1031 DEALLOCATE (helium_env(k)%helium)
1035 DEALLOCATE (helium_env)
1036 NULLIFY (helium_env)
1060 CHARACTER(len=*),
PARAMETER :: routinen =
'helium_init'
1062 INTEGER :: handle, k
1063 LOGICAL :: coords_presampled, explicit, presample
1064 REAL(kind=
dp) :: initkt, solute_radius
1068 CALL timeset(routinen, handle)
1073 IF (
ASSOCIATED(helium_env))
THEN
1075 NULLIFY (helium_section)
1077 "MOTION%PINT%HELIUM")
1084 CALL helium_rng_restore(helium_env)
1094 CALL helium_perm_restore(helium_env)
1096 CALL helium_perm_init(helium_env)
1101 DO k = 1,
SIZE(helium_env)
1103 i_val=helium_env(k)%helium%get_helium_forces)
1106 DO k = 1,
SIZE(helium_env)
1108 IF (helium_env(k)%helium%solute_present)
THEN
1109 helium_env(k)%helium%center(:) =
pint_com_pos(pint_env)
1111 helium_env(k)%helium%center(:) = (/0.0_dp, 0.0_dp, 0.0_dp/)
1120 CALL helium_coord_restore(helium_env)
1125 CALL helium_coord_init(helium_env, initkt, solute_radius)
1126 IF (initkt > 0.0_dp)
THEN
1133 DO k = 1,
SIZE(helium_env)
1135 helium_env(k)%helium%worm_is_closed = .true.
1136 helium_env(k)%helium%worm_atom_idx = 0
1137 helium_env(k)%helium%worm_bead_idx = 0
1139 helium_env(k)%helium%work(:, :, :) = helium_env(k)%helium%pos(:, :, :)
1142 IF (helium_env(k)%helium%solute_present)
THEN
1143 helium_env(k)%helium%center(:) =
pint_com_pos(pint_env)
1145 IF (helium_env(k)%helium%periodic)
THEN
1146 helium_env(k)%helium%center(:) = (/0.0_dp, 0.0_dp, 0.0_dp/)
1148 helium_env(k)%helium%center(:) =
helium_com(helium_env(k)%helium)
1157 coords_presampled = .false.
1159 DO k = 1,
SIZE(helium_env)
1160 helium_env(k)%helium%current_step = 0
1163 DO k = 1,
SIZE(helium_env)
1164 IF (helium_env(k)%helium%solute_present) helium_env(k)%helium%force_avrg(:, :) = 0.0_dp
1165 helium_env(k)%helium%energy_avrg(:) = 0.0_dp
1166 helium_env(k)%helium%plength_avrg(:) = 0.0_dp
1167 helium_env(k)%helium%num_accepted(:, :) = 0.0_dp
1169 helium_env(k)%helium%proarea%accu(:) = 0.0_dp
1170 helium_env(k)%helium%prarea2%accu(:) = 0.0_dp
1171 helium_env(k)%helium%wnmber2%accu(:) = 0.0_dp
1172 helium_env(k)%helium%mominer%accu(:) = 0.0_dp
1173 IF (helium_env(k)%helium%rho_present)
THEN
1174 helium_env(k)%helium%rho_accu(:, :, :, :) = 0.0_dp
1176 IF (helium_env(k)%helium%rdf_present)
THEN
1177 helium_env(k)%helium%rdf_accu(:, :) = 0.0_dp
1180 coords_presampled = .true.
1184 IF (helium_env(1)%helium%solute_present)
THEN
1190 IF (.NOT. coords_presampled)
THEN
1191 CALL helium_force_restore(helium_env)
1194 IF (.NOT. coords_presampled)
THEN
1195 CALL helium_force_init(helium_env)
1209 CALL timestop(handle)
1232 SUBROUTINE helium_coord_init(helium_env, initkT, solute_radius)
1234 INTENT(INOUT),
POINTER :: helium_env
1235 REAL(kind=
dp),
INTENT(IN) :: initkt, solute_radius
1237 REAL(kind=
dp),
PARAMETER :: minhehedst = 5.669177966_dp
1239 INTEGER :: ia, ib, ic, id, iter, k
1240 LOGICAL :: invalidpos
1241 REAL(kind=
dp) :: minhehedsttmp, r1, r2
1242 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: centroids
1243 REAL(kind=
dp),
DIMENSION(3) :: cvek, rvek, tvek
1246 minhehedsttmp = minhehedst
1248 DO k = 1,
SIZE(helium_env)
1249 IF (helium_env(k)%helium%solute_present)
THEN
1250 cvek(:) = helium_env(k)%helium%center(:)
1254 ALLOCATE (centroids(3, helium_env(k)%helium%atoms))
1255 IF (helium_env(k)%helium%periodic)
THEN
1256 DO ia = 1, helium_env(k)%helium%atoms
1259 DO WHILE (invalidpos)
1261 invalidpos = .false.
1265 minhehedsttmp = 0.90_dp**min(0, iter - 2)*minhehedst
1267 r1 = helium_env(k)%helium%rng_stream_uniform%next()
1268 r1 = 2.0_dp*r1 - 1.0_dp
1269 r1 = r1*helium_env(k)%helium%cell_size
1270 centroids(ic, ia) = r1
1273 tvek(:) = centroids(:, ia)
1274 CALL helium_pbc(helium_env(k)%helium, tvek(:))
1275 rvek(:) = tvek(:) - centroids(:, ia)
1276 r2 = dot_product(rvek, rvek)
1277 IF (r2 > 1.0_dp*10.0_dp**(-6))
THEN
1282 rvek = centroids(:, ia) - centroids(:, id)
1284 r2 = dot_product(rvek, rvek)
1285 IF (r2 < minhehedsttmp**2)
THEN
1291 IF (.NOT. invalidpos)
THEN
1293 IF (helium_env(k)%helium%solute_present)
THEN
1294 rvek(:) = (cvek(:) - centroids(:, ia))
1295 r2 = dot_product(rvek, rvek)
1296 IF (r2 <= solute_radius**2) invalidpos = .true.
1302 IF (initkt > 0.0_dp)
THEN
1303 CALL helium_thermal_gaussian_beads_init(helium_env(k)%helium, centroids, initkt)
1305 DO ia = 1, helium_env(k)%helium%atoms
1306 DO ib = 1, helium_env(k)%helium%beads
1307 helium_env(k)%helium%pos(:, ia, ib) = centroids(:, ia)
1312 DO ia = 1, helium_env(k)%helium%atoms
1313 DO ib = 1, helium_env(k)%helium%beads
1314 CALL helium_pbc(helium_env(k)%helium, helium_env(k)%helium%pos(:, ia, ib))
1316 IF (helium_env(k)%helium%solute_present)
THEN
1317 rvek(:) = (cvek(:) - helium_env(k)%helium%pos(:, ia, ib))
1318 r2 = dot_product(rvek, rvek)
1319 IF (r2 <= solute_radius**2)
THEN
1321 helium_env(k)%helium%pos(:, ia, ib) = &
1322 cvek(:) + solute_radius/r1*rvek(:)
1328 DO ia = 1, helium_env(k)%helium%atoms
1331 DO WHILE (invalidpos)
1332 invalidpos = .false.
1335 minhehedsttmp = 0.90_dp**min(0, iter - 2)*minhehedst
1337 rvek(ic) = helium_env(k)%helium%rng_stream_uniform%next()
1338 rvek(ic) = 2.0_dp*rvek(ic) - 1.0_dp
1339 rvek(ic) = rvek(ic)*helium_env(k)%helium%droplet_radius
1341 centroids(:, ia) = rvek(:)
1343 r2 = dot_product(rvek, rvek)
1344 IF (r2 > helium_env(k)%helium%droplet_radius**2)
THEN
1349 rvek = centroids(:, ia) - centroids(:, id)
1350 r2 = dot_product(rvek, rvek)
1351 IF (r2 < minhehedsttmp**2)
THEN
1357 IF (.NOT. invalidpos)
THEN
1359 IF (helium_env(k)%helium%solute_present)
THEN
1360 rvek(:) = (cvek(:) - centroids(:, ia))
1361 r2 = dot_product(rvek, rvek)
1362 IF (r2 <= solute_radius**2) invalidpos = .true.
1368 IF (initkt > 0.0_dp)
THEN
1369 CALL helium_thermal_gaussian_beads_init(helium_env(k)%helium, centroids, initkt)
1371 DO ia = 1, helium_env(k)%helium%atoms
1372 DO ib = 1, helium_env(k)%helium%beads
1373 helium_env(k)%helium%pos(:, ia, ib) = centroids(:, ia)
1377 DO ia = 1, helium_env(k)%helium%atoms
1378 DO ib = 1, helium_env(k)%helium%beads
1380 r1 = dot_product(helium_env(k)%helium%pos(:, ia, ib), &
1381 helium_env(k)%helium%pos(:, ia, ib))
1382 IF (r1 > helium_env(k)%helium%droplet_radius**2)
THEN
1384 helium_env(k)%helium%pos(:, ia, ib) = &
1385 helium_env(k)%helium%droplet_radius/r1* &
1386 helium_env(k)%helium%pos(:, ia, ib)
1387 ELSE IF (helium_env(k)%helium%solute_present)
THEN
1388 IF (r1 < solute_radius**2)
THEN
1391 helium_env(k)%helium%pos(:, ia, ib) = &
1393 helium_env(k)%helium%pos(:, ia, ib)
1397 helium_env(k)%helium%pos(:, ia, ib) = &
1398 helium_env(k)%helium%pos(:, ia, ib) + &
1399 helium_env(k)%helium%center(:)
1403 helium_env(k)%helium%work = helium_env(k)%helium%pos
1404 DEALLOCATE (centroids)
1408 END SUBROUTINE helium_coord_init
1416 SUBROUTINE helium_thermal_gaussian_beads_init(helium_env, centroids, kbT)
1419 REAL(kind=
dp),
DIMENSION(3, helium_env%atoms), &
1420 INTENT(IN) :: centroids
1421 REAL(kind=
dp),
INTENT(IN) :: kbt
1423 INTEGER :: i, iatom, idim, imode, j, p
1424 REAL(kind=
dp) :: invsqrtp, omega, pip, rand, sqrt2p, &
1425 sqrtp, twopip, variance
1427 DIMENSION(helium_env%beads, helium_env%beads) :: u2x
1428 REAL(kind=
dp),
DIMENSION(helium_env%beads) :: nmhecoords
1430 p = helium_env%beads
1432 sqrt2p = sqrt(2.0_dp/real(p,
dp))
1434 pip =
pi/real(p,
dp)
1435 sqrtp = sqrt(real(p,
dp))
1436 invsqrtp = 1.0_dp/sqrt(real(p,
dp))
1440 u2x(:, 1) = invsqrtp
1443 u2x(j, i) = sqrt2p*cos(twopip*(i - 1)*(j - 1))
1448 u2x(j, i) = sqrt2p*sin(twopip*(i - 1)*(j - 1))
1451 IF (mod(p, 2) == 0)
THEN
1453 u2x(i, p/2 + 1) = invsqrtp
1454 u2x(i + 1, p/2 + 1) = -1.0_dp*invsqrtp
1458 DO iatom = 1, helium_env%atoms
1460 nmhecoords(1) = sqrtp*centroids(idim, iatom)
1462 omega = 2.0_dp*p*kbt*sin((imode - 1)*pip)
1463 variance = kbt*p/(helium_env%he_mass_au*omega**2)
1464 rand = helium_env%rng_stream_gaussian%next()
1465 nmhecoords(imode) = rand*sqrt(variance)
1467 helium_env%pos(idim, iatom, 1:p) = matmul(u2x, nmhecoords)
1471 END SUBROUTINE helium_thermal_gaussian_beads_init
1484 SUBROUTINE helium_coord_restore(helium_env)
1487 CHARACTER(len=default_string_length) :: err_str, stmp
1488 INTEGER :: actlen, i, k, msglen, num_env_restart, &
1490 LOGICAL,
DIMENSION(:, :, :),
POINTER :: m
1491 REAL(kind=
dp),
DIMENSION(:),
POINTER :: message
1492 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: f
1502 "MOTION%PINT%HELIUM%COORD%_DEFAULT_KEYWORD_", &
1506 actlen =
SIZE(message)
1507 num_env_restart = actlen/helium_env(1)%helium%atoms/helium_env(1)%helium%beads/3
1509 IF (num_env_restart .NE. helium_env(1)%helium%num_env)
THEN
1510 err_str =
"Reading bead coordinates from the input file."
1512 err_str =
"Number of environments in the restart...: '"
1514 WRITE (stmp, *) num_env_restart
1515 err_str = trim(adjustl(err_str))//trim(adjustl(stmp))//
"'."
1517 err_str =
"Number of current run time environments.: '"
1519 WRITE (stmp, *) helium_env(1)%helium%num_env
1520 err_str = trim(adjustl(err_str))//trim(adjustl(stmp))//
"'."
1522 err_str =
"Missmatch between number of bead coord. in input file and helium environments."
1528 DO i = 1, logger%para_env%mepos
1529 offset = offset + helium_env(1)%env_all(i)
1533 DO k = 1,
SIZE(helium_env)
1534 msglen = helium_env(k)%helium%atoms*helium_env(k)%helium%beads*3
1535 off = msglen*mod(offset + k - 1, num_env_restart)
1537 ALLOCATE (m(3, helium_env(k)%helium%atoms, helium_env(k)%helium%beads))
1538 ALLOCATE (f(3, helium_env(k)%helium%atoms, helium_env(k)%helium%beads))
1541 helium_env(k)%helium%pos(:, :, 1:helium_env(k)%helium%beads) = unpack(message(off + 1:off + msglen), mask=m, field=f)
1550 END SUBROUTINE helium_coord_restore
1560 SUBROUTINE helium_force_init(helium_env)
1566 DO k = 1,
SIZE(helium_env)
1567 IF (helium_env(k)%helium%solute_present)
THEN
1568 helium_env(k)%helium%force_avrg(:, :) = 0.0_dp
1569 helium_env(k)%helium%force_inst(:, :) = 0.0_dp
1574 END SUBROUTINE helium_force_init
1584 SUBROUTINE helium_force_restore(helium_env)
1587 CHARACTER(len=default_string_length) :: err_str, stmp
1588 INTEGER :: actlen, k, msglen
1589 LOGICAL,
DIMENSION(:, :),
POINTER :: m
1590 REAL(kind=
dp),
DIMENSION(:),
POINTER :: message
1591 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: f
1598 "MOTION%PINT%HELIUM%FORCE%_DEFAULT_KEYWORD_", &
1602 msglen = helium_env(1)%helium%solute_atoms*helium_env(1)%helium%solute_beads*3
1603 actlen =
SIZE(helium_env(1)%helium%force_avrg)
1604 err_str =
"Invalid size of helium%force_avrg array: actual '"
1606 WRITE (stmp, *) actlen
1607 err_str = trim(adjustl(err_str))// &
1608 trim(adjustl(stmp))//
"' but expected '"
1610 WRITE (stmp, *) msglen
1611 IF (actlen /= msglen)
THEN
1612 err_str = trim(adjustl(err_str))// &
1613 trim(adjustl(stmp))//
"'."
1619 ALLOCATE (m(helium_env(1)%helium%solute_beads, helium_env(1)%helium%solute_atoms*3))
1620 ALLOCATE (f(helium_env(1)%helium%solute_beads, helium_env(1)%helium%solute_atoms*3))
1623 DO k = 1,
SIZE(helium_env)
1624 helium_env(k)%helium%force_avrg(:, :) = unpack(message(1:msglen), mask=m, field=f)
1625 helium_env(k)%helium%force_inst(:, :) = 0.0_dp
1634 END SUBROUTINE helium_force_restore
1646 SUBROUTINE helium_perm_init(helium_env)
1651 DO k = 1,
SIZE(helium_env)
1652 DO ia = 1, helium_env(k)%helium%atoms
1653 helium_env(k)%helium%permutation(ia) = ia
1654 helium_env(k)%helium%iperm(ia) = ia
1659 END SUBROUTINE helium_perm_init
1674 SUBROUTINE helium_perm_restore(helium_env)
1677 CHARACTER(len=default_string_length) :: err_str, stmp
1678 INTEGER :: actlen, i, ia, ic, k, msglen, &
1679 num_env_restart, off, offset
1680 INTEGER,
DIMENSION(:),
POINTER :: message
1690 "MOTION%PINT%HELIUM%PERM%_DEFAULT_KEYWORD_", &
1694 actlen =
SIZE(message)
1695 num_env_restart = actlen/helium_env(1)%helium%atoms
1700 IF (num_env_restart .NE. helium_env(1)%helium%num_env)
THEN
1701 err_str =
"Reading permutation state from the input file."
1703 err_str =
"Number of environments in the restart...: '"
1705 WRITE (stmp, *) num_env_restart
1706 err_str = trim(adjustl(err_str))//trim(adjustl(stmp))//
"'."
1708 err_str =
"Number of current run time environments.: '"
1710 WRITE (stmp, *) helium_env(1)%helium%num_env
1711 err_str = trim(adjustl(err_str))//trim(adjustl(stmp))//
"'."
1713 err_str =
"Missmatch between number of perm. states in input file and helium environments."
1720 DO i = 1, logger%para_env%mepos
1721 offset = offset + helium_env(1)%env_all(i)
1724 DO k = 1,
SIZE(helium_env)
1725 msglen = helium_env(k)%helium%atoms
1726 off = msglen*mod(k - 1 + offset, num_env_restart)
1727 helium_env(k)%helium%permutation(:) = message(off + 1:off + msglen)
1732 DO k = 1,
SIZE(helium_env)
1733 helium_env(k)%helium%iperm(:) = 0
1736 IF ((helium_env(k)%helium%permutation(ia) > 0) .AND. (helium_env(k)%helium%permutation(ia) <= msglen))
THEN
1737 helium_env(k)%helium%iperm(helium_env(k)%helium%permutation(ia)) = ia
1741 err_str =
"Invalid HELIUM%PERM state: some numbers not within (1,"
1743 WRITE (stmp, *) msglen
1744 IF (ic /= msglen)
THEN
1745 err_str = trim(adjustl(err_str))// &
1746 trim(adjustl(stmp))//
")."
1753 END SUBROUTINE helium_perm_restore
1763 SUBROUTINE helium_averages_restore(helium_env)
1767 INTEGER :: i, k, msglen, num_env_restart, off, &
1770 REAL(kind=
dp),
DIMENSION(:),
POINTER :: message
1777 DO i = 1, logger%para_env%mepos
1778 offset = offset + helium_env(1)%env_all(i)
1783 "MOTION%PINT%HELIUM%AVERAGES%PROJECTED_AREA", &
1788 "MOTION%PINT%HELIUM%AVERAGES%PROJECTED_AREA", &
1790 num_env_restart =
SIZE(message)/3
1792 DO k = 1,
SIZE(helium_env)
1793 off = msglen*mod(offset + k - 1, num_env_restart)
1794 helium_env(k)%helium%proarea%rstr(:) = message(off + 1:off + msglen)
1797 DO k = 1,
SIZE(helium_env)
1798 helium_env(k)%helium%proarea%rstr(:) = 0.0_dp
1804 "MOTION%PINT%HELIUM%AVERAGES%PROJECTED_AREA_2", &
1809 "MOTION%PINT%HELIUM%AVERAGES%PROJECTED_AREA_2", &
1811 num_env_restart =
SIZE(message)/3
1813 DO k = 1,
SIZE(helium_env)
1814 off = msglen*mod(offset + k - 1, num_env_restart)
1815 helium_env(k)%helium%prarea2%rstr(:) = message(off + 1:off + msglen)
1818 DO k = 1,
SIZE(helium_env)
1819 helium_env(k)%helium%prarea2%rstr(:) = 0.0_dp
1825 "MOTION%PINT%HELIUM%AVERAGES%WINDING_NUMBER_2", &
1830 "MOTION%PINT%HELIUM%AVERAGES%WINDING_NUMBER_2", &
1832 num_env_restart =
SIZE(message)/3
1834 DO k = 1,
SIZE(helium_env)
1835 off = msglen*mod(offset + k - 1, num_env_restart)
1836 helium_env(k)%helium%wnmber2%rstr(:) = message(off + 1:off + msglen)
1839 DO k = 1,
SIZE(helium_env)
1840 helium_env(k)%helium%wnmber2%rstr(:) = 0.0_dp
1846 "MOTION%PINT%HELIUM%AVERAGES%MOMENT_OF_INERTIA", &
1851 "MOTION%PINT%HELIUM%AVERAGES%MOMENT_OF_INERTIA", &
1853 num_env_restart =
SIZE(message)/3
1855 DO k = 1,
SIZE(helium_env)
1856 off = msglen*mod(offset + k - 1, num_env_restart)
1857 helium_env(k)%helium%mominer%rstr(:) = message(off + 1:off + msglen)
1860 DO k = 1,
SIZE(helium_env)
1861 helium_env(k)%helium%mominer%rstr(:) = 0.0_dp
1865 IF (helium_env(1)%helium%rdf_present)
THEN
1866 CALL helium_rdf_restore(helium_env)
1869 IF (helium_env(1)%helium%rho_present)
THEN
1871 CALL helium_rho_restore(helium_env)
1875 DO k = 1,
SIZE(helium_env)
1877 helium_env(k)%helium%input, &
1878 "MOTION%PINT%HELIUM%AVERAGES%IWEIGHT", &
1879 i_val=helium_env(k)%helium%averages_iweight)
1883 helium_env(k)%helium%input, &
1884 "EXT_RESTART%RESTART_HELIUM_AVERAGES", &
1885 l_val=helium_env(k)%helium%averages_restarted)
1889 END SUBROUTINE helium_averages_restore
1902 SUBROUTINE helium_rng_init(helium_env)
1905 INTEGER :: helium_seed, i, offset
1906 REAL(kind=
dp),
DIMENSION(3, 2) :: initial_seed
1912 IF (logger%para_env%is_source())
THEN
1914 "MOTION%PINT%HELIUM%RNG_SEED", &
1917 CALL helium_env(1)%comm%bcast(helium_seed, &
1918 logger%para_env%source)
1919 initial_seed(:, :) = real(helium_seed,
dp)
1921 ALLOCATE (uniform_array(helium_env(1)%helium%num_env), &
1922 gaussian_array(helium_env(1)%helium%num_env))
1923 DO i = 1, helium_env(1)%helium%num_env
1924 ALLOCATE (uniform_array(i)%stream, gaussian_array(i)%stream)
1932 uniform_array(1)%stream =
rng_stream_type(name=
"helium_rns_uniform", &
1934 extended_precision=.true., &
1937 gaussian_array(1)%stream =
rng_stream_type(name=
"helium_rns_gaussian", &
1939 extended_precision=.true., &
1940 last_rng_stream=uniform_array(1)%stream)
1941 DO i = 2, helium_env(1)%helium%num_env
1942 uniform_array(i)%stream =
rng_stream_type(name=
"helium_rns_uniform", &
1944 extended_precision=.true., &
1945 last_rng_stream=gaussian_array(i - 1)%stream)
1947 gaussian_array(i)%stream =
rng_stream_type(name=
"helium_rns_uniform", &
1949 extended_precision=.true., &
1950 last_rng_stream=uniform_array(i)%stream)
1954 DO i = 1, logger%para_env%mepos
1955 offset = offset + helium_env(1)%env_all(i)
1958 DO i = 1,
SIZE(helium_env)
1959 NULLIFY (helium_env(i)%helium%rng_stream_uniform, &
1960 helium_env(i)%helium%rng_stream_gaussian)
1961 helium_env(i)%helium%rng_stream_uniform => uniform_array(offset + i)%stream
1962 helium_env(i)%helium%rng_stream_gaussian => gaussian_array(offset + i)%stream
1965 DO i = 1, helium_env(1)%helium%num_env
1966 IF (i .LE. offset .OR. i .GT. offset +
SIZE(helium_env))
THEN
1968 DEALLOCATE (uniform_array(i)%stream)
1969 DEALLOCATE (gaussian_array(i)%stream)
1971 NULLIFY (uniform_array(i)%stream)
1972 NULLIFY (gaussian_array(i)%stream)
1975 DEALLOCATE (uniform_array)
1976 DEALLOCATE (gaussian_array)
1977 END SUBROUTINE helium_rng_init
1989 SUBROUTINE helium_rng_restore(helium_env)
1992 CHARACTER(len=default_string_length) :: err_str, stmp
1993 INTEGER :: actlen, i, k, msglen, num_env_restart, &
1996 LOGICAL,
DIMENSION(3, 2) :: m
1997 REAL(kind=
dp) :: bf, bu
1998 REAL(kind=
dp),
DIMENSION(3, 2) :: bg, cg, f, ig
1999 REAL(kind=
dp),
DIMENSION(:),
POINTER :: message
2009 "MOTION%PINT%HELIUM%RNG_STATE%_DEFAULT_KEYWORD_", &
2013 actlen =
SIZE(message)
2014 num_env_restart = actlen/40
2017 IF (num_env_restart .NE. helium_env(1)%helium%num_env)
THEN
2018 err_str =
"Reading RNG state from the input file."
2020 err_str =
"Number of environments in the restart...: '"
2022 WRITE (stmp, *) num_env_restart
2023 err_str = trim(adjustl(err_str))//trim(adjustl(stmp))//
"'."
2025 err_str =
"Number of current run time environments.: '"
2027 WRITE (stmp, *) helium_env(1)%helium%num_env
2028 err_str = trim(adjustl(err_str))//trim(adjustl(stmp))//
"'."
2030 err_str =
"Missmatch between number of RNG states in input file and helium environments."
2037 DO i = 1, logger%para_env%mepos
2038 offset = offset + helium_env(1)%env_all(i)
2041 DO k = 1,
SIZE(helium_env)
2043 off = msglen*(offset + k - 1)
2046 bg(:, :) = unpack(message(off + 1:off + 6), mask=m, field=f)
2047 cg(:, :) = unpack(message(off + 7:off + 12), mask=m, field=f)
2048 ig(:, :) = unpack(message(off + 13:off + 18), mask=m, field=f)
2049 bf = message(off + 19)
2050 bu = message(off + 20)
2056 CALL helium_env(k)%helium%rng_stream_uniform%set(bg=bg, cg=cg, ig=ig, &
2057 buffer=bu, buffer_filled=lbf)
2058 bg(:, :) = unpack(message(off + 21:off + 26), mask=m, field=f)
2059 cg(:, :) = unpack(message(off + 27:off + 32), mask=m, field=f)
2060 ig(:, :) = unpack(message(off + 33:off + 38), mask=m, field=f)
2061 bf = message(off + 39)
2062 bu = message(off + 40)
2068 CALL helium_env(k)%helium%rng_stream_gaussian%set(bg=bg, cg=cg, ig=ig, &
2069 buffer=bu, buffer_filled=lbf)
2076 END SUBROUTINE helium_rng_restore
2086 SUBROUTINE helium_rdf_init(helium)
2090 CHARACTER(len=2*default_string_length) :: err_str, stmp
2100 "MOTION%PINT%HELIUM%RDF%SOLUTE_HE", &
2101 l_val=helium%rdf_sol_he)
2104 "MOTION%PINT%HELIUM%RDF%HE_HE", &
2105 l_val=helium%rdf_he_he)
2108 IF (helium%atoms <= 1)
THEN
2109 helium%rdf_he_he = .false.
2113 IF (helium%rdf_sol_he)
THEN
2114 IF (helium%solute_present)
THEN
2116 ALLOCATE (helium%rdf_centers(helium%beads, helium%solute_atoms*3))
2117 helium%rdf_centers(:, :) = 0.0_dp
2118 helium%rdf_num = helium%solute_atoms
2120 helium%rdf_sol_he = .false.
2124 IF (helium%rdf_he_he)
THEN
2125 helium%rdf_num = helium%rdf_num + 1
2129 IF (helium%rdf_num > 0)
THEN
2130 helium%rdf_present = .true.
2132 helium%rdf_present = .false.
2133 err_str =
"HELIUM RDFs requested, but no valid choice of "// &
2134 "parameters specified. No RDF will be computed."
2142 "MOTION%PINT%HELIUM%RDF%MAXR", &
2148 "MOTION%PINT%HELIUM%RDF%MAXR", &
2149 r_val=helium%rdf_maxr)
2154 "MOTION%PINT%HELIUM%DROPLET_RADIUS", &
2158 IF (helium%solute_present .AND. .NOT. helium%periodic)
THEN
2164 helium%rdf_maxr = helium%droplet_radius*2.0_dp
2166 helium%rdf_maxr = helium%droplet_radius
2171 SELECT CASE (helium%cell_shape)
2173 helium%rdf_maxr = helium%cell_size/2.0_dp
2175 helium%rdf_maxr = helium%cell_size*sqrt(3.0_dp)/4.0_dp
2177 helium%rdf_maxr = 0.0_dp
2178 WRITE (stmp, *) helium%cell_shape
2179 err_str =
"cell shape unknown ("//trim(adjustl(stmp))//
")"
2188 "MOTION%PINT%HELIUM%RDF%NBIN", &
2189 i_val=helium%rdf_nbin)
2190 helium%rdf_delr = helium%rdf_maxr/real(helium%rdf_nbin,
dp)
2195 "MOTION%PINT%HELIUM%AVERAGES%IWEIGHT", &
2196 i_val=helium%rdf_iweight)
2200 ij = helium%rdf_nbin
2201 ALLOCATE (helium%rdf_inst(ii, ij))
2202 ALLOCATE (helium%rdf_accu(ii, ij))
2203 ALLOCATE (helium%rdf_rstr(ii, ij))
2204 helium%rdf_inst(:, :) = 0.0_dp
2205 helium%rdf_accu(:, :) = 0.0_dp
2206 helium%rdf_rstr(:, :) = 0.0_dp
2209 END SUBROUTINE helium_rdf_init
2220 SUBROUTINE helium_rdf_restore(helium_env)
2224 CHARACTER(len=default_string_length) :: stmp1, stmp2
2225 CHARACTER(len=max_line_length) :: err_str
2226 INTEGER :: ii, ij, itmp, k, msglen
2227 LOGICAL :: explicit, ltmp
2228 LOGICAL,
DIMENSION(:, :),
POINTER :: m
2229 REAL(kind=
dp),
DIMENSION(:),
POINTER :: message
2230 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: f
2233 "MOTION%PINT%HELIUM%AVERAGES%RDF", &
2238 "MOTION%PINT%HELIUM%AVERAGES%RDF", &
2240 msglen =
SIZE(message)
2241 itmp =
SIZE(helium_env(1)%helium%rdf_rstr)
2242 ltmp = (msglen .EQ. itmp)
2243 IF (.NOT. ltmp)
THEN
2245 WRITE (stmp1, *) msglen
2247 WRITE (stmp2, *) itmp
2248 err_str =
"Size of the RDF array in the input ("// &
2249 trim(adjustl(stmp1))// &
2250 .NE.
") that in the runtime ("// &
2251 trim(adjustl(stmp2))//
")."
2258 ii = helium_env(1)%helium%rdf_num
2259 ij = helium_env(1)%helium%rdf_nbin
2261 ALLOCATE (m(ii, ij))
2262 ALLOCATE (f(ii, ij))
2266 DO k = 1,
SIZE(helium_env)
2267 helium_env(k)%helium%rdf_rstr(:, :) = unpack(message(1:msglen), mask=m, field=f)
2269 "MOTION%PINT%HELIUM%AVERAGES%IWEIGHT", &
2270 i_val=helium_env(k)%helium%rdf_iweight)
2277 END SUBROUTINE helium_rdf_restore
2285 SUBROUTINE helium_rdf_release(helium)
2289 IF (helium%rdf_present)
THEN
2301 IF (helium%rdf_sol_he)
THEN
2302 DEALLOCATE (helium%rdf_centers)
2303 NULLIFY (helium%rdf_centers)
2309 END SUBROUTINE helium_rdf_release
2326 FUNCTION helium_property_active(helium, prop)
RESULT(is_active)
2329 CHARACTER(len=*) :: prop
2330 LOGICAL :: is_active
2332 CHARACTER(len=default_string_length) :: input_path
2333 INTEGER :: print_level
2334 LOGICAL :: explicit, is_on
2344 input_path =
"MOTION%PINT%HELIUM%PRINT%"//trim(adjustl(prop))
2349 iteration_info=logger%iter_info, &
2350 print_key=print_key)
2360 input_path =
"MOTION%PINT%HELIUM%"//trim(adjustl(prop))
2369 "_SECTION_PARAMETERS_", &
2375 print_level = logger%iter_info%print_level
2378 "_SECTION_PARAMETERS_", &
2384 END FUNCTION helium_property_active
2392 SUBROUTINE helium_rho_property_init(helium)
2398 ALLOCATE (helium%rho_property(
rho_num))
2410 helium%rho_property(
rho_projected_area)%name =
'Projected area squared density, A*A(r)'
2424 helium%rho_property(
rho_winding_number)%name =
'Winding number squared density, W*W(r)'
2438 helium%rho_property(
rho_winding_cycle)%name =
'Winding number squared density, W^2(r)'
2466 helium%rho_property(:)%is_calculated = .false.
2469 END SUBROUTINE helium_rho_property_init
2477 SUBROUTINE helium_rho_init(helium)
2481 INTEGER :: ii, itmp, jtmp
2482 LOGICAL :: explicit, ltmp
2484 CALL helium_rho_property_init(helium)
2486 helium%rho_num_act = 0
2491 "MOTION%PINT%HELIUM%RHO%ATOM_NUMBER", &
2495 helium%rho_num_act = helium%rho_num_act + 1
2496 helium%rho_property(
rho_atom_number)%component_index(1) = helium%rho_num_act
2502 "MOTION%PINT%HELIUM%RHO%PROJECTED_AREA_2", &
2507 helium%rho_num_act = helium%rho_num_act + 1
2515 "MOTION%PINT%HELIUM%RHO%WINDING_NUMBER_2", &
2520 helium%rho_num_act = helium%rho_num_act + 1
2528 "MOTION%PINT%HELIUM%RHO%WINDING_CYCLE_2", &
2533 helium%rho_num_act = helium%rho_num_act + 1
2541 "MOTION%PINT%HELIUM%RHO%MOMENT_OF_INERTIA", &
2546 helium%rho_num_act = helium%rho_num_act + 1
2552 helium%rho_maxr = helium%cell_size
2555 "MOTION%PINT%HELIUM%RHO%NBIN", &
2556 i_val=helium%rho_nbin)
2557 helium%rho_delr = helium%rho_maxr/real(helium%rho_nbin,
dp)
2560 helium%rho_num_min_len_wdg = 0
2563 "MOTION%PINT%HELIUM%RHO%MIN_CYCLE_LENGTHS_WDG", &
2566 NULLIFY (helium%rho_min_len_wdg_vals)
2569 "MOTION%PINT%HELIUM%RHO%MIN_CYCLE_LENGTHS_WDG", &
2570 i_vals=helium%rho_min_len_wdg_vals)
2571 itmp =
SIZE(helium%rho_min_len_wdg_vals)
2572 IF (itmp .GT. 0)
THEN
2573 helium%rho_num_min_len_wdg = itmp
2574 helium%rho_num_act = helium%rho_num_act + itmp
2579 helium%rho_num_min_len_non = 0
2582 "MOTION%PINT%HELIUM%RHO%MIN_CYCLE_LENGTHS_NON", &
2585 NULLIFY (helium%rho_min_len_non_vals)
2588 "MOTION%PINT%HELIUM%RHO%MIN_CYCLE_LENGTHS_NON", &
2589 i_vals=helium%rho_min_len_non_vals)
2590 itmp =
SIZE(helium%rho_min_len_non_vals)
2591 IF (itmp .GT. 0)
THEN
2592 helium%rho_num_min_len_non = itmp
2593 helium%rho_num_act = helium%rho_num_act + itmp
2598 helium%rho_num_min_len_all = 0
2601 "MOTION%PINT%HELIUM%RHO%MIN_CYCLE_LENGTHS_ALL", &
2604 NULLIFY (helium%rho_min_len_all_vals)
2607 "MOTION%PINT%HELIUM%RHO%MIN_CYCLE_LENGTHS_ALL", &
2608 i_vals=helium%rho_min_len_all_vals)
2609 itmp =
SIZE(helium%rho_min_len_all_vals)
2610 IF (itmp .GT. 0)
THEN
2611 helium%rho_num_min_len_all = itmp
2612 helium%rho_num_act = helium%rho_num_act + itmp
2619 "MOTION%PINT%HELIUM%AVERAGES%IWEIGHT", &
2620 i_val=helium%rho_iweight)
2623 itmp = helium%rho_nbin
2624 jtmp = helium%rho_num_act
2625 ALLOCATE (helium%rho_inst(jtmp, itmp, itmp, itmp))
2626 ALLOCATE (helium%rho_accu(jtmp, itmp, itmp, itmp))
2627 ALLOCATE (helium%rho_rstr(jtmp, itmp, itmp, itmp))
2628 ALLOCATE (helium%rho_incr(jtmp, helium%atoms, helium%beads))
2630 helium%rho_incr(:, :, :) = 0.0_dp
2631 helium%rho_inst(:, :, :, :) = 0.0_dp
2632 helium%rho_accu(:, :, :, :) = 0.0_dp
2633 helium%rho_rstr(:, :, :, :) = 0.0_dp
2636 END SUBROUTINE helium_rho_init
2646 SUBROUTINE helium_rho_restore(helium_env)
2650 CHARACTER(len=default_string_length) :: stmp1, stmp2
2651 CHARACTER(len=max_line_length) :: err_str
2652 INTEGER :: itmp, k, msglen
2653 LOGICAL :: explicit, ltmp
2654 LOGICAL,
DIMENSION(:, :, :, :),
POINTER :: m
2655 REAL(kind=
dp),
DIMENSION(:),
POINTER :: message
2656 REAL(kind=
dp),
DIMENSION(:, :, :, :),
POINTER :: f
2659 "MOTION%PINT%HELIUM%AVERAGES%RHO", &
2664 "MOTION%PINT%HELIUM%AVERAGES%RHO", &
2666 msglen =
SIZE(message)
2667 itmp =
SIZE(helium_env(1)%helium%rho_rstr)
2668 ltmp = (msglen .EQ. itmp)
2669 IF (.NOT. ltmp)
THEN
2671 WRITE (stmp1, *) msglen
2673 WRITE (stmp2, *) itmp
2674 err_str =
"Size of the S density array in the input ("// &
2675 trim(adjustl(stmp1))// &
2676 .NE.
") that in the runtime ("// &
2677 trim(adjustl(stmp2))//
")."
2684 itmp = helium_env(1)%helium%rho_nbin
2686 ALLOCATE (m(helium_env(1)%helium%rho_num_act, itmp, itmp, itmp))
2687 ALLOCATE (f(helium_env(1)%helium%rho_num_act, itmp, itmp, itmp))
2688 m(:, :, :, :) = .true.
2689 f(:, :, :, :) = 0.0_dp
2691 DO k = 1,
SIZE(helium_env)
2692 helium_env(k)%helium%rho_rstr(:, :, :, :) = unpack(message(1:msglen), mask=m, field=f)
2699 END SUBROUTINE helium_rho_restore
2709 SUBROUTINE helium_set_solute_indices(helium, pint_env)
2713 INTEGER :: iatom, natoms
2714 REAL(kind=
dp) :: mass
2721 NULLIFY (my_f_env, my_subsys, my_particles)
2724 CALL force_env_get(force_env=my_f_env%force_env, subsys=my_subsys)
2728 natoms = helium%solute_atoms
2729 NULLIFY (helium%solute_element)
2730 ALLOCATE (helium%solute_element(natoms))
2734 DO iatom = 1, natoms
2737 element_symbol=helium%solute_element(iatom))
2741 END SUBROUTINE helium_set_solute_indices
2755 SUBROUTINE helium_set_solute_cell(helium, pint_env)
2759 LOGICAL :: my_orthorhombic
2765 NULLIFY (my_f_env, my_cell)
2768 CALL force_env_get(force_env=my_f_env%force_env, cell=my_cell)
2771 CALL get_cell(my_cell, orthorhombic=my_orthorhombic)
2772 IF (.NOT. my_orthorhombic)
THEN
2773 cpabort(
"Helium solvent not implemented for non-orthorhombic cells.")
2775 helium%solute_cell => my_cell
2779 END SUBROUTINE helium_set_solute_cell
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind(atomic_kind, fist_potential, element_symbol, name, mass, kind_number, natom, atom_list, rcov, rvdw, z, qeff, apol, cpol, mm_radius, shell, shell_active, damping)
Get attributes of an atomic kind.
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public walewski2014
Handles all functions related to the CELL.
subroutine, public get_cell(cell, alpha, beta, gamma, deth, orthorhombic, abc, periodic, h, h_inv, symmetry_id, tag)
Get informations about a simulation cell.
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 ...
subroutine, public cp_rm_default_logger()
the cousin of cp_add_default_logger, decrements the stack, so that the default logger is what it has ...
subroutine, public cp_logger_release(logger)
releases this logger
subroutine, public cp_logger_create(logger, para_env, print_level, default_global_unit_nr, default_local_unit_nr, global_filename, local_filename, close_global_unit_on_dealloc, iter_info, close_local_unit_on_dealloc, suffix, template_logger)
initializes a logger
subroutine, public cp_add_default_logger(logger)
adds a default logger. MUST be called before logging occours
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...
logical function, public cp_printkey_is_on(iteration_info, print_key)
returns true if the printlevel activates this printkey does not look if this iteration it should be p...
types that represent a subsys, i.e. a part of the system
subroutine, public cp_subsys_get(subsys, ref_count, atomic_kinds, atomic_kind_set, particles, particle_set, local_particles, molecules, molecule_set, molecule_kinds, molecule_kind_set, local_molecules, para_env, colvar_p, shell_particles, core_particles, gci, multipoles, natom, nparticle, ncore, nshell, nkind, atprop, virial, results, cell)
returns information about various attributes of the given subsys
interface to use cp2k as library
subroutine, public f_env_add_defaults(f_env_id, f_env, handle)
adds the default environments of the f_env to the stack of the defaults, and returns a new error and ...
subroutine, public get_cell(env_id, cell, per, ierr)
gets a cell
subroutine, public f_env_rm_defaults(f_env, ierr, handle)
removes the default environments of the f_env to the stack of the defaults, and sets ierr accordingly...
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
Independent helium subroutines shared with other modules.
pure real(kind=dp) function, dimension(3), public helium_com(helium)
Calculate center of mass.
subroutine, public helium_pbc(helium, r, enforce)
General PBC routine for helium.
Methods that handle helium-solvent and helium-helium interactions.
elemental real(kind=dp) function, public helium_vij(r)
Helium-helium pair interaction potential.
I/O subroutines for helium.
subroutine, public helium_write_setup(helium)
Write helium parameters to the output unit.
subroutine, public helium_write_line(line)
Writes out a line of text to the default output unit.
Methods dealing with helium_solvent_type.
subroutine, public helium_release(helium_env)
Releases helium_solvent_type.
subroutine, public helium_create(helium_env, input, solute)
Data-structure that holds all needed information about (superfluid) helium solvent.
subroutine, public helium_init(helium_env, pint_env)
Initialize helium data structures.
Methods dealing with Neural Network interaction potential.
subroutine, public helium_init_nnp(helium, nnp, input)
Read and initialize all the information for neural network potentials.
Methods for sampling helium variables.
subroutine, public helium_sample(helium_env, pint_env)
Sample the helium phase space.
Data types representing superfluid helium.
integer, parameter, public rho_moment_of_inertia
integer, parameter, public rho_winding_number
integer, parameter, public rho_atom_number
density function identifier names
integer, parameter, public rho_winding_cycle
integer, parameter, public rho_projected_area
integer, parameter, public rho_num
number of density function identifiers
Defines the basic variable types.
integer, parameter, public max_line_length
integer, parameter, public dp
integer, parameter, public default_string_length
integer, parameter, public default_path_length
Definition of mathematical constants and functions.
real(kind=dp), parameter, public pi
real(kind=dp), parameter, public twopi
Interface to the message passing library MPI.
Data types for neural network potentials.
subroutine, public nnp_env_release(nnp_env)
Release data structure that holds all the information for neural network potentials.
Parallel (pseudo)random number generator (RNG) for multiple streams and substreams of random numbers.
integer, parameter, public uniform
integer, parameter, public gaussian
represent a simple array based list of the given type
Definition of physical constants:
real(kind=dp), parameter, public boltzmann
real(kind=dp), parameter, public a_mass
real(kind=dp), parameter, public kelvin
real(kind=dp), parameter, public h_bar
real(kind=dp), parameter, public angstrom
real(kind=dp), parameter, public massunit
Public path integral routines that can be called from other modules.
pure real(kind=dp) function, dimension(3), public pint_com_pos(pint_env)
Return the center of mass of the PI system.
routines for handling splines
pure subroutine, public init_splinexy(spl, nn)
allocates storage for function table to be interpolated both x and y are allocated
pure subroutine, public init_spline(spl, dx, y1a, y1b)
allocates storage for y2 table calculates y2 table and other spline parameters
routines for handling splines_types
subroutine, public spline_data_create(spline_data)
Data-structure that constains spline table.
subroutine, public spline_data_release(spline_data)
releases spline_data
Type defining parameters related to the simulation cell.
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,...
data structure for array of solvent helium environments
data structure for solvent helium
stores all the informations relevant to an mpi environment
represent a list of objects
environment for a path integral run