65#include "../base/base_uses.f90"
71 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'tmc_analysis'
89 CHARACTER(LEN=default_path_length) :: c_tmp
90 CHARACTER(LEN=default_string_length),
POINTER :: charge_atm(:)
91 INTEGER :: i_tmp, ntot
92 INTEGER,
DIMENSION(3) :: nr_bins
93 INTEGER,
DIMENSION(:),
POINTER :: i_arr_tmp
94 LOGICAL :: explicit, explicit_key, flag
95 REAL(kind=
dp),
POINTER :: charge(:)
98 NULLIFY (tmp_section, charge_atm, i_arr_tmp, charge)
100 cpassert(
ASSOCIATED(tmc_ana_section))
101 cpassert(.NOT.
ASSOCIATED(tmc_ana))
110 c_val=tmc_ana%out_file_prefix)
111 IF (tmc_ana%out_file_prefix .NE.
"")
THEN
112 tmc_ana%out_file_prefix = trim(tmc_ana%out_file_prefix)//
"_"
117 IF (explicit_key)
THEN
120 IF (
SIZE(i_arr_tmp(:)) .EQ. 3)
THEN
121 IF (any(i_arr_tmp(:) .LE. 0)) &
122 CALL cp_abort(__location__,
"The amount of intervals in each "// &
123 "direction has to be greater than 0.")
124 nr_bins(:) = i_arr_tmp(:)
125 ELSE IF (
SIZE(i_arr_tmp(:)) .EQ. 1)
THEN
126 IF (any(i_arr_tmp(:) .LE. 0)) &
127 cpabort(
"The amount of intervals has to be greater than 0.")
128 nr_bins(:) = i_arr_tmp(1)
129 ELSE IF (
SIZE(i_arr_tmp(:)) .EQ. 0)
THEN
132 cpabort(
"unknown amount of dimensions for the binning.")
139 IF (explicit_key)
THEN
147 IF (explicit_key)
THEN
153 ALLOCATE (charge_atm(i_tmp))
154 ALLOCATE (charge(i_tmp))
157 CALL cp_abort(__location__, &
158 "to calculate the classical cell dipole moment "// &
159 "the charges has to be specified")
163 tmc_ana%dim_per_elem)
165 IF (
ASSOCIATED(charge_atm))
DEALLOCATE (charge_atm)
166 IF (
ASSOCIATED(charge))
DEALLOCATE (charge)
171 IF (explicit_key)
THEN
174 SELECT CASE (trim(c_tmp))
182 cpwarn(
'unknown analysis type "'//trim(c_tmp)//
'" specified. Set to default.')
193 dim_per_elem=tmc_ana%dim_per_elem)
207 CHARACTER(LEN=default_path_length) :: tmp_cell_file, tmp_dip_file, tmp_pos_file
209 cpassert(
ASSOCIATED(ana_env))
212 ana_env%nr_dim = nr_dim
215 tmp_pos_file = ana_env%costum_pos_file_name
216 tmp_cell_file = ana_env%costum_cell_file_name
217 tmp_dip_file = ana_env%costum_dip_file_name
226 IF (
ASSOCIATED(ana_env%density_3d))
THEN
227 ana_env%costum_pos_file_name = tmp_pos_file
228 ana_env%costum_cell_file_name = tmp_cell_file
231 IF (
ASSOCIATED(ana_env%pair_correl))
THEN
232 ana_env%costum_pos_file_name = tmp_pos_file
233 ana_env%costum_cell_file_name = tmp_cell_file
236 IF (
ASSOCIATED(ana_env%dip_mom))
THEN
237 ana_env%costum_pos_file_name = tmp_pos_file
238 ana_env%costum_cell_file_name = tmp_cell_file
241 IF (
ASSOCIATED(ana_env%dip_ana))
THEN
242 ana_env%costum_pos_file_name = tmp_pos_file
243 ana_env%costum_cell_file_name = tmp_cell_file
244 ana_env%costum_dip_file_name = tmp_dip_file
247 IF (
ASSOCIATED(ana_env%displace))
THEN
248 ana_env%costum_pos_file_name = tmp_pos_file
249 ana_env%costum_cell_file_name = tmp_cell_file
253 IF (
ASSOCIATED(ana_env%pair_correl)) &
254 CALL ana_pair_correl_init(ana_pair_correl=ana_env%pair_correl, &
255 atoms=ana_env%atoms, cell=ana_env%cell)
257 IF (
ASSOCIATED(ana_env%dip_mom)) &
258 CALL ana_dipole_moment_init(ana_dip_mom=ana_env%dip_mom, &
271 CHARACTER(LEN=default_path_length) :: file_name, file_name_tmp, &
276 cpassert(
ASSOCIATED(ana_env))
277 cpassert(
ASSOCIATED(ana_env%last_elem))
278 IF (.NOT. ana_env%restart)
RETURN
280 WRITE (file_name, fmt=
'(I9.9)') ana_env%last_elem%nr
282 trim(ana_env%out_file_prefix)// &
284 "ana"), ana_env%temperature))
287 CALL open_file(file_name=restart_file_name, file_status=
"REPLACE", &
288 file_action=
"WRITE", file_form=
"UNFORMATTED", &
289 unit_number=file_ptr)
290 WRITE (file_ptr) ana_env%temperature
295 l_tmp =
ASSOCIATED(ana_env%density_3d)
296 WRITE (file_ptr) l_tmp
298 WRITE (file_ptr) ana_env%density_3d%conf_counter, &
299 ana_env%density_3d%nr_bins, &
300 ana_env%density_3d%sum_vol, &
301 ana_env%density_3d%sum_vol2, &
302 ana_env%density_3d%sum_box_length, &
303 ana_env%density_3d%sum_box_length2, &
304 ana_env%density_3d%sum_density, &
305 ana_env%density_3d%sum_dens2
308 l_tmp =
ASSOCIATED(ana_env%pair_correl)
309 WRITE (file_ptr) l_tmp
311 WRITE (file_ptr) ana_env%pair_correl%conf_counter, &
312 ana_env%pair_correl%nr_bins, &
313 ana_env%pair_correl%step_length, &
314 ana_env%pair_correl%pairs, &
315 ana_env%pair_correl%g_r
318 l_tmp =
ASSOCIATED(ana_env%dip_mom)
319 WRITE (file_ptr) l_tmp
321 WRITE (file_ptr) ana_env%dip_mom%conf_counter, &
322 ana_env%dip_mom%charges, &
323 ana_env%dip_mom%last_dip_cl
326 l_tmp =
ASSOCIATED(ana_env%dip_ana)
327 WRITE (file_ptr) l_tmp
329 WRITE (file_ptr) ana_env%dip_ana%conf_counter, &
330 ana_env%dip_ana%ana_type, &
331 ana_env%dip_ana%mu2_pv_s, &
332 ana_env%dip_ana%mu_psv, &
333 ana_env%dip_ana%mu_pv, &
334 ana_env%dip_ana%mu2_pv_mat, &
335 ana_env%dip_ana%mu2_pv_mat
338 l_tmp =
ASSOCIATED(ana_env%displace)
339 WRITE (file_ptr) l_tmp
341 WRITE (file_ptr) ana_env%displace%conf_counter, &
342 ana_env%displace%disp
352 file_action=
"WRITE", file_status=
"REPLACE", &
353 unit_number=file_ptr)
354 WRITE (file_ptr, *) trim(restart_file_name)
369 CHARACTER(LEN=default_path_length) :: file_name, file_name_tmp
372 REAL(kind=
dp) :: temp
374 cpassert(
ASSOCIATED(ana_env))
375 cpassert(
ASSOCIATED(elem))
376 IF (.NOT. ana_env%restart)
RETURN
382 INQUIRE (file=file_name, exist=l_tmp)
384 CALL open_file(file_name=file_name, file_status=
"OLD", &
385 file_action=
"READ", unit_number=file_ptr)
386 READ (file_ptr, *) file_name_tmp
389 CALL open_file(file_name=file_name_tmp, file_status=
"OLD", file_form=
"UNFORMATTED", &
390 file_action=
"READ", unit_number=file_ptr)
392 cpassert(ana_env%temperature .EQ. temp)
393 ana_env%last_elem => elem
398 READ (file_ptr) l_tmp
399 cpassert(
ASSOCIATED(ana_env%density_3d) .EQV. l_tmp)
401 READ (file_ptr) ana_env%density_3d%conf_counter, &
402 ana_env%density_3d%nr_bins, &
403 ana_env%density_3d%sum_vol, &
404 ana_env%density_3d%sum_vol2, &
405 ana_env%density_3d%sum_box_length, &
406 ana_env%density_3d%sum_box_length2, &
407 ana_env%density_3d%sum_density, &
408 ana_env%density_3d%sum_dens2
411 READ (file_ptr) l_tmp
412 cpassert(
ASSOCIATED(ana_env%pair_correl) .EQV. l_tmp)
414 READ (file_ptr) ana_env%pair_correl%conf_counter, &
415 ana_env%pair_correl%nr_bins, &
416 ana_env%pair_correl%step_length, &
417 ana_env%pair_correl%pairs, &
418 ana_env%pair_correl%g_r
421 READ (file_ptr) l_tmp
422 cpassert(
ASSOCIATED(ana_env%dip_mom) .EQV. l_tmp)
424 READ (file_ptr) ana_env%dip_mom%conf_counter, &
425 ana_env%dip_mom%charges, &
426 ana_env%dip_mom%last_dip_cl
429 READ (file_ptr) l_tmp
430 cpassert(
ASSOCIATED(ana_env%dip_ana) .EQV. l_tmp)
432 READ (file_ptr) ana_env%dip_ana%conf_counter, &
433 ana_env%dip_ana%ana_type, &
434 ana_env%dip_ana%mu2_pv_s, &
435 ana_env%dip_ana%mu_psv, &
436 ana_env%dip_ana%mu_pv, &
437 ana_env%dip_ana%mu2_pv_mat, &
438 ana_env%dip_ana%mu2_pv_mat
441 READ (file_ptr) l_tmp
442 cpassert(
ASSOCIATED(ana_env%displace) .EQV. l_tmp)
444 READ (file_ptr) ana_env%displace%conf_counter, &
445 ana_env%displace%disp
468 CHARACTER(LEN=*),
PARAMETER :: routinen =
'do_tmc_analysis'
470 INTEGER :: handle, weight_act
471 REAL(kind=
dp),
DIMENSION(3) :: dip_tmp
474 cpassert(
ASSOCIATED(elem))
475 cpassert(
ASSOCIATED(ana_env))
478 CALL timeset(routinen, handle)
479 IF (
ASSOCIATED(ana_env%last_elem) .AND. &
480 (ana_env%last_elem%nr .LT. elem%nr))
THEN
481 weight_act = elem%nr - ana_env%last_elem%nr
483 IF (
ASSOCIATED(ana_env%density_3d)) &
484 CALL calc_density_3d(elem=ana_env%last_elem, &
485 weight=weight_act, atoms=ana_env%atoms, &
488 IF (
ASSOCIATED(ana_env%pair_correl)) &
489 CALL calc_paircorrelation(elem=ana_env%last_elem, weight=weight_act, &
490 atoms=ana_env%atoms, ana_env=ana_env)
492 IF (
ASSOCIATED(ana_env%dip_mom)) &
493 CALL calc_dipole_moment(elem=ana_env%last_elem, weight=weight_act, &
496 IF (
ASSOCIATED(ana_env%dip_ana))
THEN
501 ana_env%last_elem%dipole(1) = -ana_env%last_elem%dipole(1)
502 dip_tmp(:) = ana_env%last_elem%dipole(:)
503 IF (
ASSOCIATED(ana_env%dip_mom)) &
504 ana_env%dip_mom%last_dip_cl(1) = -ana_env%dip_mom%last_dip_cl(1)
505 CALL calc_dipole_analysis(elem=ana_env%last_elem, weight=weight_act, &
508 ana_env%last_elem%dipole(:) = dip_tmp(:)
509 ana_env%last_elem%dipole(2) = -ana_env%last_elem%dipole(2)
510 dip_tmp(:) = ana_env%last_elem%dipole(:)
511 IF (
ASSOCIATED(ana_env%dip_mom)) &
512 ana_env%dip_mom%last_dip_cl(2) = -ana_env%dip_mom%last_dip_cl(2)
513 CALL calc_dipole_analysis(elem=ana_env%last_elem, weight=weight_act, &
516 ana_env%last_elem%dipole(:) = dip_tmp(:)
517 ana_env%last_elem%dipole(3) = -ana_env%last_elem%dipole(3)
518 dip_tmp(:) = ana_env%last_elem%dipole(:)
519 IF (
ASSOCIATED(ana_env%dip_mom)) &
520 ana_env%dip_mom%last_dip_cl(3) = -ana_env%dip_mom%last_dip_cl(3)
521 CALL calc_dipole_analysis(elem=ana_env%last_elem, weight=weight_act, &
524 ana_env%last_elem%dipole(:) = dip_tmp(:)
525 ana_env%last_elem%dipole(1) = -ana_env%last_elem%dipole(1)
526 dip_tmp(:) = ana_env%last_elem%dipole(:)
527 IF (
ASSOCIATED(ana_env%dip_mom)) &
528 ana_env%dip_mom%last_dip_cl(1) = -ana_env%dip_mom%last_dip_cl(1)
529 CALL calc_dipole_analysis(elem=ana_env%last_elem, weight=weight_act, &
532 ana_env%last_elem%dipole(:) = dip_tmp(:)
533 ana_env%last_elem%dipole(2) = -ana_env%last_elem%dipole(2)
534 dip_tmp(:) = ana_env%last_elem%dipole(:)
535 IF (
ASSOCIATED(ana_env%dip_mom)) &
536 ana_env%dip_mom%last_dip_cl(2) = -ana_env%dip_mom%last_dip_cl(2)
537 CALL calc_dipole_analysis(elem=ana_env%last_elem, weight=weight_act, &
540 ana_env%last_elem%dipole(:) = dip_tmp(:)
541 ana_env%last_elem%dipole(1) = -ana_env%last_elem%dipole(1)
542 dip_tmp(:) = ana_env%last_elem%dipole(:)
543 IF (
ASSOCIATED(ana_env%dip_mom)) &
544 ana_env%dip_mom%last_dip_cl(1) = -ana_env%dip_mom%last_dip_cl(1)
545 CALL calc_dipole_analysis(elem=ana_env%last_elem, weight=weight_act, &
548 ana_env%last_elem%dipole(:) = dip_tmp(:)
549 ana_env%last_elem%dipole(:) = -ana_env%last_elem%dipole(:)
550 dip_tmp(:) = ana_env%last_elem%dipole(:)
551 IF (
ASSOCIATED(ana_env%dip_mom)) &
552 ana_env%dip_mom%last_dip_cl(:) = -ana_env%dip_mom%last_dip_cl(:)
553 CALL calc_dipole_analysis(elem=ana_env%last_elem, weight=weight_act, &
556 ana_env%last_elem%dipole(:) = dip_tmp(:)
557 ana_env%last_elem%dipole(2) = -ana_env%last_elem%dipole(2)
558 dip_tmp(:) = ana_env%last_elem%dipole(:)
559 IF (
ASSOCIATED(ana_env%dip_mom)) &
560 ana_env%dip_mom%last_dip_cl(2) = -ana_env%dip_mom%last_dip_cl(2)
562 CALL calc_dipole_analysis(elem=ana_env%last_elem, weight=weight_act, &
564 CALL print_act_dipole_analysis(elem=ana_env%last_elem, &
569 IF (
ASSOCIATED(ana_env%displace) .AND. weight_act .GT. 0) &
570 CALL calc_displacement(elem=elem, ana_env=ana_env)
573 elem_tmp => ana_env%last_elem
574 ana_env%last_elem => elem
577 CALL timestop(handle)
589 CHARACTER(LEN=*),
PARAMETER :: routinen =
'finalize_tmc_analysis'
593 cpassert(
ASSOCIATED(ana_env))
596 CALL timeset(routinen, handle)
597 IF (
ASSOCIATED(ana_env%density_3d))
THEN
598 IF (ana_env%density_3d%conf_counter .GT. 0) &
599 CALL print_density_3d(ana_env=ana_env)
601 IF (
ASSOCIATED(ana_env%pair_correl))
THEN
602 IF (ana_env%pair_correl%conf_counter .GT. 0) &
603 CALL print_paircorrelation(ana_env=ana_env)
605 IF (
ASSOCIATED(ana_env%dip_mom))
THEN
606 IF (ana_env%dip_mom%conf_counter .GT. 0) &
607 CALL print_dipole_moment(ana_env)
609 IF (
ASSOCIATED(ana_env%dip_ana))
THEN
610 IF (ana_env%dip_ana%conf_counter .GT. 0) &
611 CALL print_dipole_analysis(ana_env)
613 IF (
ASSOCIATED(ana_env%displace))
THEN
614 IF (ana_env%displace%conf_counter .GT. 0) &
615 CALL print_average_displacement(ana_env)
619 CALL timestop(handle)
633 INTEGER :: start_id, end_id
634 INTEGER,
OPTIONAL :: dir_ind
638 CHARACTER(LEN=*),
PARAMETER :: routinen =
'analyze_file_configurations'
640 INTEGER :: conf_nr, handle, nr_dim, stat
646 cpassert(
ASSOCIATED(ana_env))
647 cpassert(
ASSOCIATED(tmc_params))
650 CALL timeset(routinen, handle)
655 IF (ana_env%id_dip .GT. 0)
THEN
656 tmc_params%print_dipole = .true.
658 tmc_params%print_dipole = .false.
663 nr_dim=ana_env%nr_dim)
665 IF (
ASSOCIATED(ana_env%last_elem)) conf_nr = ana_env%last_elem%nr
666 nr_dim =
SIZE(elem%pos)
677 IF (start_id .LT. 0 .OR. conf_nr .GE. start_id)
THEN
678 IF (end_id .LT. 0 .OR. conf_nr .LE. end_id)
THEN
685 IF (
ASSOCIATED(elem))
THEN
689 IF (.NOT.
ASSOCIATED(elem)) &
697 IF (
ASSOCIATED(elem)) &
701 CALL timestop(handle)
718 SUBROUTINE calc_density_3d(elem, weight, atoms, ana_env)
724 CHARACTER(LEN=*),
PARAMETER :: routinen =
'calc_density_3d'
726 CHARACTER(LEN=default_path_length) :: file_name, file_name_tmp
727 INTEGER ::
atom, bin_x, bin_y, bin_z, file_ptr, &
730 REAL(kind=
dp) :: mass_total, r_tmp, vol_cell, vol_sub_box
731 REAL(kind=
dp),
DIMENSION(3) :: atom_pos, cell_size, interval_size
732 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: mass_bin
736 cpassert(
ASSOCIATED(elem))
737 cpassert(
ASSOCIATED(elem%pos))
738 cpassert(weight .GT. 0)
739 cpassert(
ASSOCIATED(atoms))
740 cpassert(
ASSOCIATED(ana_env))
741 cpassert(
ASSOCIATED(ana_env%cell))
742 cpassert(
ASSOCIATED(ana_env%density_3d))
743 cpassert(
ASSOCIATED(ana_env%density_3d%sum_density))
744 cpassert(
ASSOCIATED(ana_env%density_3d%sum_dens2))
747 CALL timeset(routinen, handle)
750 cell_size(:) = 0.0_dp
751 interval_size(:) = 0.0_dp
754 bin_x =
SIZE(ana_env%density_3d%sum_density(:, 1, 1))
755 bin_y =
SIZE(ana_env%density_3d%sum_density(1, :, 1))
756 bin_z =
SIZE(ana_env%density_3d%sum_density(1, 1, :))
757 ALLOCATE (mass_bin(bin_x, bin_y, bin_z))
758 mass_bin(:, :, :) = 0.0_dp
764 abc=cell_size, vol=vol_cell)
766 ana_env%density_3d%sum_vol = ana_env%density_3d%sum_vol + &
767 vol_cell*(au2a)**3*weight
768 ana_env%density_3d%sum_vol2 = ana_env%density_3d%sum_vol2 + &
769 (vol_cell*(au2a)**3)**2*weight
771 ana_env%density_3d%sum_box_length(:) = ana_env%density_3d%sum_box_length(:) &
772 + cell_size(:)*(au2a)*weight
773 ana_env%density_3d%sum_box_length2(:) = ana_env%density_3d%sum_box_length2(:) &
774 + (cell_size(:)*(au2a))**2*weight
777 interval_size(1) = cell_size(1)/real(bin_x,
dp)
778 interval_size(2) = cell_size(2)/real(bin_y,
dp)
779 interval_size(3) = cell_size(3)/real(bin_z,
dp)
782 vol_cell = vol_cell*(au2a*1e-8)**3
783 vol_sub_box = interval_size(1)*interval_size(2)*interval_size(3)* &
787 DO atom = 1,
SIZE(elem%pos), ana_env%dim_per_elem
789 atom_pos(:) = elem%pos(
atom:
atom + 2)
794 atom_pos(:) = atom_pos(:) + 0.5_dp*cell_size(:)
796 bin_x = int(atom_pos(1)/interval_size(1)) + 1
797 bin_y = int(atom_pos(2)/interval_size(2)) + 1
798 bin_z = int(atom_pos(3)/interval_size(3)) + 1
799 cpassert(bin_x .GT. 0 .AND. bin_y .GT. 0 .AND. bin_z .GT. 0)
800 cpassert(bin_x .LE.
SIZE(ana_env%density_3d%sum_density(:, 1, 1)))
801 cpassert(bin_y .LE.
SIZE(ana_env%density_3d%sum_density(1, :, 1)))
802 cpassert(bin_z .LE.
SIZE(ana_env%density_3d%sum_density(1, 1, :)))
805 mass_bin(bin_x, bin_y, bin_z) = mass_bin(bin_x, bin_y, bin_z) + &
807 mass_total = mass_total + &
817 r_tmp = mass_total/vol_cell - sum(mass_bin(:, :, :))/vol_sub_box/
SIZE(mass_bin(:, :, :))
818 cpassert(abs(r_tmp) .LT. 1e-5)
821 ana_env%density_3d%sum_density(:, :, :) = ana_env%density_3d%sum_density(:, :, :) + &
822 weight*mass_bin(:, :, :)/vol_sub_box
825 ana_env%density_3d%sum_dens2(:, :, :) = ana_env%density_3d%sum_dens2(:, :, :) + &
826 weight*(mass_bin(:, :, :)/vol_sub_box)**2
828 ana_env%density_3d%conf_counter = ana_env%density_3d%conf_counter + weight
831 IF (ana_env%density_3d%print_dens)
THEN
837 INQUIRE (file=file_name, exist=flag)
838 CALL open_file(file_name=file_name, file_status=
"UNKNOWN", &
839 file_action=
"WRITE", file_position=
"APPEND", &
840 unit_number=file_ptr)
842 WRITE (file_ptr, fmt=
'(A8,11A20)')
"# conf_nr",
"dens_act[g/cm^3]", &
843 "dens_average[g/cm^3]",
"density_variance", &
844 "averages:volume",
"box_lenth_x",
"box_lenth_y",
"box_lenth_z", &
845 "variances:volume",
"box_lenth_x",
"box_lenth_y",
"box_lenth_z"
846 WRITE (file_ptr, fmt=
"(I8,11F20.10)") ana_env%density_3d%conf_counter + 1 - weight, &
847 sum(mass_bin(:, :, :))/vol_sub_box/
SIZE(mass_bin(:, :, :)), &
848 sum(ana_env%density_3d%sum_density(:, :, :))/ &
849 SIZE(ana_env%density_3d%sum_density(:, :, :))/ &
850 REAL(ana_env%density_3d%conf_counter, kind=
dp), &
851 sum(ana_env%density_3d%sum_dens2(:, :, :))/ &
852 SIZE(ana_env%density_3d%sum_dens2(:, :, :))/ &
853 REAL(ana_env%density_3d%conf_counter, kind=
dp) - &
854 (sum(ana_env%density_3d%sum_density(:, :, :))/ &
855 SIZE(ana_env%density_3d%sum_density(:, :, :))/ &
856 REAL(ana_env%density_3d%conf_counter, kind=
dp))**2, &
857 ana_env%density_3d%sum_vol/ &
858 REAL(ana_env%density_3d%conf_counter, kind=
dp), &
859 ana_env%density_3d%sum_box_length(:)/ &
860 REAL(ana_env%density_3d%conf_counter, kind=
dp), &
861 ana_env%density_3d%sum_vol2/ &
862 REAL(ana_env%density_3d%conf_counter, kind=
dp) - &
863 (ana_env%density_3d%sum_vol/ &
864 REAL(ana_env%density_3d%conf_counter, kind=
dp))**2, &
865 ana_env%density_3d%sum_box_length2(:)/ &
866 REAL(ana_env%density_3d%conf_counter, kind=
dp) - &
867 (ana_env%density_3d%sum_box_length(:)/ &
868 REAL(ana_env%density_3d%conf_counter, kind=
dp))**2
872 DEALLOCATE (mass_bin)
874 CALL timestop(handle)
875 END SUBROUTINE calc_density_3d
884 SUBROUTINE print_density_3d(ana_env)
887 CHARACTER(LEN=*),
PARAMETER :: fmt_my =
'(T2,A,"| ",A,T41,A40)', plabel =
"TMC_ANA", &
888 routinen =
'print_density_3d'
890 CHARACTER(LEN=default_path_length) :: file_name, file_name_vari
891 INTEGER :: bin_x, bin_y, bin_z, file_ptr_dens, &
892 file_ptr_vari, handle, i, j, k
893 REAL(kind=
dp),
DIMENSION(3) :: cell_size, interval_size
895 cpassert(
ASSOCIATED(ana_env))
896 cpassert(
ASSOCIATED(ana_env%density_3d))
897 cpassert(
ASSOCIATED(ana_env%density_3d%sum_density))
898 cpassert(
ASSOCIATED(ana_env%density_3d%sum_dens2))
901 CALL timeset(routinen, handle)
906 bin_x =
SIZE(ana_env%density_3d%sum_density(:, 1, 1))
907 bin_y =
SIZE(ana_env%density_3d%sum_density(1, :, 1))
908 bin_z =
SIZE(ana_env%density_3d%sum_density(1, 1, :))
909 CALL get_cell(cell=ana_env%cell, abc=cell_size)
910 interval_size(1) = cell_size(1)/real(bin_x, kind=
dp)*au2a
911 interval_size(2) = cell_size(2)/real(bin_y, kind=
dp)*au2a
912 interval_size(3) = cell_size(3)/real(bin_z, kind=
dp)*au2a
917 CALL open_file(file_name=file_name, file_status=
"REPLACE", &
918 file_action=
"WRITE", file_position=
"APPEND", &
919 unit_number=file_ptr_dens)
920 WRITE (file_ptr_dens, fmt=
'(A,1X,I0,1X,A,3(I0,1X),1X,A,1X,3F10.5)') &
921 "# configurations", ana_env%density_3d%conf_counter,
"bins", &
922 ana_env%density_3d%nr_bins,
"interval size", interval_size(:)
923 WRITE (file_ptr_dens, fmt=
'(A,3A10,A20)')
"#",
" x [A] ",
" y [A] ",
" z [A] ",
" density [g/cm^3] "
926 trim(ana_env%out_file_prefix)// &
929 CALL open_file(file_name=file_name_vari, file_status=
"REPLACE", &
930 file_action=
"WRITE", file_position=
"APPEND", &
931 unit_number=file_ptr_vari)
932 WRITE (file_ptr_vari, fmt=
'(A,1X,I0,1X,A,3(I0,1X),1X,A,1X,3F10.5)') &
933 "# configurations", ana_env%density_3d%conf_counter,
"bins", &
934 ana_env%density_3d%nr_bins,
"interval size", interval_size(:)
935 WRITE (file_ptr_vari, fmt=
'(A,3A10,A20)')
"#",
" x [A] ",
" y [A] ",
" z [A] ",
" variance"
937 DO i = 1,
SIZE(ana_env%density_3d%sum_density(:, 1, 1))
938 DO j = 1,
SIZE(ana_env%density_3d%sum_density(1, :, 1))
939 DO k = 1,
SIZE(ana_env%density_3d%sum_density(1, 1, :))
940 WRITE (file_ptr_dens, fmt=
'(3F10.2,F20.10)') &
941 (i - 0.5_dp)*interval_size(1), (j - 0.5_dp)*interval_size(2), (k - 0.5_dp)*interval_size(3), &
942 ana_env%density_3d%sum_density(i, j, k)/real(ana_env%density_3d%conf_counter, kind=
dp)
943 WRITE (file_ptr_vari, fmt=
'(3F10.2,F20.10)') &
944 (i - 0.5_dp)*interval_size(1), (j - 0.5_dp)*interval_size(2), (k - 0.5_dp)*interval_size(3), &
945 ana_env%density_3d%sum_dens2(i, j, k)/real(ana_env%density_3d%conf_counter, kind=
dp) - &
946 (ana_env%density_3d%sum_density(i, j, k)/real(ana_env%density_3d%conf_counter, kind=
dp))**2
953 WRITE (ana_env%io_unit, fmt=
"(/,T2,A)") repeat(
"-", 79)
954 WRITE (ana_env%io_unit, fmt=
"(T2,A,T35,A,T80,A)")
"-",
"density calculation",
"-"
955 WRITE (ana_env%io_unit, fmt=fmt_my) plabel,
"temperature ",
cp_to_string(ana_env%temperature)
956 WRITE (ana_env%io_unit, fmt=fmt_my) plabel,
"used configurations", &
958 WRITE (ana_env%io_unit, fmt=fmt_my) plabel,
"average volume", &
960 REAL(ana_env%density_3d%conf_counter, kind=
dp))
961 WRITE (ana_env%io_unit, fmt=fmt_my) plabel,
"average density in the cell: ", &
962 cp_to_string(sum(ana_env%density_3d%sum_density(:, :, :))/ &
963 SIZE(ana_env%density_3d%sum_density(:, :, :))/ &
964 REAL(ana_env%density_3d%conf_counter, kind=
dp))
965 WRITE (ana_env%io_unit, fmt=fmt_my) plabel,
"density variance:", &
966 cp_to_string(sum(ana_env%density_3d%sum_dens2(:, :, :))/ &
967 SIZE(ana_env%density_3d%sum_dens2(:, :, :))/ &
968 REAL(ana_env%density_3d%conf_counter, kind=
dp) - &
969 (sum(ana_env%density_3d%sum_density(:, :, :))/ &
970 SIZE(ana_env%density_3d%sum_density(:, :, :))/ &
971 REAL(ana_env%density_3d%conf_counter, kind=
dp))**2)
972 WRITE (ana_env%io_unit, fmt=
"(/,T2,A)") repeat(
"-", 79)
973 IF (ana_env%print_test_output) &
974 WRITE (ana_env%io_unit, *)
"TMC|ANALYSIS_CELL_DENSITY_X= ", &
975 sum(ana_env%density_3d%sum_density(:, :, :))/ &
976 SIZE(ana_env%density_3d%sum_density(:, :, :))/ &
977 REAL(ana_env%density_3d%conf_counter, kind=
dp)
979 CALL timestop(handle)
980 END SUBROUTINE print_density_3d
994 SUBROUTINE ana_pair_correl_init(ana_pair_correl, atoms, cell)
999 CHARACTER(LEN=*),
PARAMETER :: routinen =
'ana_pair_correl_init'
1001 INTEGER :: counter, f_n, handle,
list, list_ind, s_n
1002 REAL(kind=
dp),
DIMENSION(3) :: cell_size
1005 cpassert(
ASSOCIATED(ana_pair_correl))
1006 cpassert(.NOT.
ASSOCIATED(ana_pair_correl%g_r))
1007 cpassert(.NOT.
ASSOCIATED(ana_pair_correl%pairs))
1008 cpassert(
ASSOCIATED(atoms))
1009 cpassert(
SIZE(atoms) .GT. 1)
1010 cpassert(
ASSOCIATED(cell))
1013 CALL timeset(routinen, handle)
1015 CALL get_cell(cell=cell, abc=cell_size)
1016 IF (ana_pair_correl%nr_bins .LE. 0)
THEN
1017 ana_pair_correl%nr_bins = ceiling(maxval(cell_size(:))/2.0_dp/(0.03/au2a))
1019 ana_pair_correl%step_length = maxval(cell_size(:))/2.0_dp/ &
1020 ana_pair_correl%nr_bins
1021 ana_pair_correl%conf_counter = 0
1025 ALLOCATE (pairs_tmp(
SIZE(atoms)))
1026 DO f_n = 1,
SIZE(atoms)
1027 DO s_n = f_n + 1,
SIZE(atoms)
1030 n2=atoms(s_n)%name, list_end=counter - 1)
1032 IF (list_ind .LT. 0)
THEN
1033 pairs_tmp(counter)%f_n = atoms(f_n)%name
1034 pairs_tmp(counter)%s_n = atoms(s_n)%name
1035 pairs_tmp(counter)%pair_count = 1
1036 counter = counter + 1
1038 pairs_tmp(list_ind)%pair_count = pairs_tmp(list_ind)%pair_count + 1
1043 ALLOCATE (ana_pair_correl%pairs(counter - 1))
1044 DO list = 1, counter - 1
1045 ana_pair_correl%pairs(
list)%f_n = pairs_tmp(
list)%f_n
1046 ana_pair_correl%pairs(
list)%s_n = pairs_tmp(
list)%s_n
1047 ana_pair_correl%pairs(
list)%pair_count = pairs_tmp(
list)%pair_count
1049 DEALLOCATE (pairs_tmp)
1051 ALLOCATE (ana_pair_correl%g_r(
SIZE(ana_pair_correl%pairs(:)), ana_pair_correl%nr_bins))
1052 ana_pair_correl%g_r = 0.0_dp
1054 CALL timestop(handle)
1055 END SUBROUTINE ana_pair_correl_init
1066 SUBROUTINE calc_paircorrelation(elem, weight, atoms, ana_env)
1072 CHARACTER(LEN=*),
PARAMETER :: routinen =
'calc_paircorrelation'
1074 INTEGER :: handle, i, ind, j, pair_ind
1075 REAL(kind=
dp) :: dist
1076 REAL(kind=
dp),
DIMENSION(3) :: cell_size
1078 cpassert(
ASSOCIATED(elem))
1079 cpassert(
ASSOCIATED(elem%pos))
1080 cpassert(all(elem%box_scale(:) .GT. 0.0_dp))
1081 cpassert(weight .GT. 0)
1082 cpassert(
ASSOCIATED(atoms))
1083 cpassert(
ASSOCIATED(ana_env))
1084 cpassert(
ASSOCIATED(ana_env%cell))
1085 cpassert(
ASSOCIATED(ana_env%pair_correl))
1086 cpassert(
ASSOCIATED(ana_env%pair_correl%g_r))
1087 cpassert(
ASSOCIATED(ana_env%pair_correl%pairs))
1090 CALL timeset(routinen, handle)
1094 first_elem_loop:
DO i = 1,
SIZE(elem%pos), ana_env%dim_per_elem
1095 second_elem_loop:
DO j = i + 3,
SIZE(elem%pos), ana_env%dim_per_elem
1097 x2=elem%pos(j:j + ana_env%dim_per_elem - 1), &
1098 cell=ana_env%cell, box_scale=elem%box_scale)
1099 ind = ceiling(dist/ana_env%pair_correl%step_length)
1100 IF (ind .LE. ana_env%pair_correl%nr_bins)
THEN
1102 n1=atoms(int(i/real(ana_env%dim_per_elem, kind=
dp)) + 1)%name, &
1103 n2=atoms(int(j/real(ana_env%dim_per_elem, kind=
dp)) + 1)%name)
1104 cpassert(pair_ind .GT. 0)
1105 ana_env%pair_correl%g_r(pair_ind, ind) = &
1106 ana_env%pair_correl%g_r(pair_ind, ind) + weight
1108 END DO second_elem_loop
1109 END DO first_elem_loop
1110 ana_env%pair_correl%conf_counter = ana_env%pair_correl%conf_counter + weight
1111 CALL get_cell(cell=ana_env%cell, abc=cell_size)
1112 ana_env%pair_correl%sum_box_scale = ana_env%pair_correl%sum_box_scale + &
1113 (elem%box_scale(:)*weight)
1115 CALL timestop(handle)
1116 END SUBROUTINE calc_paircorrelation
1124 SUBROUTINE print_paircorrelation(ana_env)
1127 CHARACTER(LEN=*),
PARAMETER :: routinen =
'print_paircorrelation'
1129 CHARACTER(LEN=default_path_length) :: file_name
1130 INTEGER :: bin, file_ptr, handle, pair
1131 REAL(kind=
dp) :: aver_box_scale(3), vol, voldr
1132 REAL(kind=
dp),
DIMENSION(3) :: cell_size
1134 cpassert(
ASSOCIATED(ana_env))
1135 cpassert(
ASSOCIATED(ana_env%pair_correl))
1138 CALL timeset(routinen, handle)
1140 CALL get_cell(cell=ana_env%cell, abc=cell_size)
1141 aver_box_scale(:) = ana_env%pair_correl%sum_box_scale(:)/ana_env%pair_correl%conf_counter
1142 vol = (cell_size(1)*aver_box_scale(1))* &
1143 (cell_size(2)*aver_box_scale(2))* &
1144 (cell_size(3)*aver_box_scale(3))
1146 DO pair = 1,
SIZE(ana_env%pair_correl%pairs)
1149 ana_env%temperature)
1152 ana_env%pair_correl%pairs(pair)%f_n), &
1153 ana_env%pair_correl%pairs(pair)%s_n), &
1154 file_status=
"REPLACE", &
1155 file_action=
"WRITE", file_position=
"APPEND", &
1156 unit_number=file_ptr)
1157 WRITE (file_ptr, *)
"# radial distribution function of "// &
1158 trim(ana_env%pair_correl%pairs(pair)%f_n)//
" and "// &
1159 trim(ana_env%pair_correl%pairs(pair)%s_n)//
" of ", &
1160 ana_env%pair_correl%conf_counter,
" configurations"
1161 WRITE (file_ptr, *)
"# using a bin size of ", &
1162 ana_env%pair_correl%step_length*au2a, &
1163 "[A] (for Vol changes: referring to the reference cell)"
1164 DO bin = 1, ana_env%pair_correl%nr_bins
1165 voldr = 4.0/3.0*
pi*ana_env%pair_correl%step_length**3* &
1166 (real(bin, kind=
dp)**3 - real(bin - 1, kind=
dp)**3)
1167 WRITE (file_ptr, *) (bin - 0.5)*ana_env%pair_correl%step_length*au2a, &
1168 (ana_env%pair_correl%g_r(pair, bin)/ana_env%pair_correl%conf_counter)/ &
1169 (voldr*ana_env%pair_correl%pairs(pair)%pair_count/vol)
1173 IF (ana_env%print_test_output) &
1174 WRITE (*, *)
"TMC|ANALYSIS_G_R_"// &
1175 trim(ana_env%pair_correl%pairs(pair)%f_n)//
"_"// &
1176 trim(ana_env%pair_correl%pairs(pair)%s_n)//
"_X= ", &
1177 sum(ana_env%pair_correl%g_r(pair, :)/ana_env%pair_correl%conf_counter/ &
1178 voldr*ana_env%pair_correl%pairs(pair)%pair_count/vol)
1182 CALL timestop(handle)
1183 END SUBROUTINE print_paircorrelation
1196 SUBROUTINE ana_dipole_moment_init(ana_dip_mom, atoms)
1200 CHARACTER(LEN=*),
PARAMETER :: routinen =
'ana_dipole_moment_init'
1202 INTEGER ::
atom, charge, handle
1204 cpassert(
ASSOCIATED(ana_dip_mom))
1205 cpassert(
ASSOCIATED(ana_dip_mom%charges_inp))
1206 cpassert(
ASSOCIATED(atoms))
1209 CALL timeset(routinen, handle)
1211 ALLOCATE (ana_dip_mom%charges(
SIZE(atoms)))
1212 ana_dip_mom%charges = 0.0_dp
1214 DO atom = 1,
SIZE(atoms)
1215 charge_loop:
DO charge = 1,
SIZE(ana_dip_mom%charges_inp)
1216 IF (atoms(
atom)%name .EQ. ana_dip_mom%charges_inp(charge)%name)
THEN
1217 ana_dip_mom%charges(
atom) = ana_dip_mom%charges_inp(charge)%mass
1223 DEALLOCATE (ana_dip_mom%charges_inp)
1225 CALL timestop(handle)
1226 END SUBROUTINE ana_dipole_moment_init
1236 SUBROUTINE calc_dipole_moment(elem, weight, ana_env)
1241 CHARACTER(LEN=*),
PARAMETER :: routinen =
'calc_dipole_moment'
1243 CHARACTER(LEN=default_path_length) :: file_name
1244 INTEGER :: handle, i
1245 REAL(kind=
dp),
DIMENSION(:),
POINTER :: dip_cl
1247 cpassert(
ASSOCIATED(elem))
1248 cpassert(
ASSOCIATED(elem%pos))
1249 cpassert(
ASSOCIATED(ana_env))
1250 cpassert(
ASSOCIATED(ana_env%dip_mom))
1251 cpassert(
ASSOCIATED(ana_env%dip_mom%charges))
1254 CALL timeset(routinen, handle)
1256 ALLOCATE (dip_cl(ana_env%dim_per_elem))
1259 DO i = 1,
SIZE(elem%pos, 1), ana_env%dim_per_elem
1260 dip_cl(:) = dip_cl(:) + elem%pos(i:i + ana_env%dim_per_elem - 1)* &
1261 ana_env%dip_mom%charges(int(i/real(ana_env%dim_per_elem, kind=
dp)) + 1)
1265 IF (.NOT.
ASSOCIATED(elem%dipole))
THEN
1266 ALLOCATE (elem%dipole(ana_env%dim_per_elem))
1267 elem%dipole(:) = dip_cl(:)
1270 IF (ana_env%dip_mom%print_cl_dip)
THEN
1272 ana_env%temperature)
1274 conf_nr=ana_env%dip_mom%conf_counter + 1, dip=dip_cl, &
1277 ana_env%dip_mom%conf_counter = ana_env%dip_mom%conf_counter + weight
1278 ana_env%dip_mom%last_dip_cl(:) = dip_cl
1283 CALL timestop(handle)
1284 END SUBROUTINE calc_dipole_moment
1292 SUBROUTINE print_dipole_moment(ana_env)
1295 IF (ana_env%print_test_output) &
1296 WRITE (*, *)
"TMC|ANALYSIS_FINAL_CLASS_CELL_DIPOLE_MOMENT_X= ", &
1297 ana_env%dip_mom%last_dip_cl(:)
1298 END SUBROUTINE print_dipole_moment
1308 SUBROUTINE calc_dipole_analysis(elem, weight, ana_env)
1313 REAL(kind=
dp) :: vol, weight_act
1314 REAL(kind=
dp),
DIMENSION(3, 3) :: tmp_dip
1317 NULLIFY (scaled_cell)
1319 cpassert(
ASSOCIATED(elem))
1320 cpassert(
ASSOCIATED(elem%dipole))
1321 cpassert(
ASSOCIATED(ana_env))
1322 cpassert(
ASSOCIATED(ana_env%dip_ana))
1326 weight_act = weight_act/real(8.0, kind=
dp)
1329 ALLOCATE (scaled_cell)
1330 CALL get_scaled_cell(cell=ana_env%cell, box_scale=elem%box_scale, vol=vol, &
1331 scaled_cell=scaled_cell)
1334 IF (
ASSOCIATED(ana_env%dip_mom))
THEN
1335 IF (all(ana_env%dip_mom%last_dip_cl .NE. elem%dipole))
THEN
1336 elem%dipole =
pbc(r=elem%dipole(:) - ana_env%dip_mom%last_dip_cl, &
1337 cell=scaled_cell) + ana_env%dip_mom%last_dip_cl
1341 ana_env%dip_ana%conf_counter = ana_env%dip_ana%conf_counter + weight_act
1344 ana_env%dip_ana%mu2_pv_s = ana_env%dip_ana%mu2_pv_s + &
1345 dot_product(elem%dipole(:), elem%dipole(:))/vol*weight_act
1347 tmp_dip(:, :) = 0.0_dp
1348 tmp_dip(:, 1) = elem%dipole(:)
1351 ana_env%dip_ana%mu_pv(:) = ana_env%dip_ana%mu_pv(:) + &
1352 tmp_dip(:, 1)/vol*weight_act
1355 ana_env%dip_ana%mu_psv(:) = ana_env%dip_ana%mu_psv(:) + &
1356 tmp_dip(:, 1)/sqrt(vol)*weight_act
1359 ana_env%dip_ana%mu2_pv(:) = ana_env%dip_ana%mu2_pv(:) + &
1360 tmp_dip(:, 1)**2/vol*weight_act
1363 tmp_dip(:, :) = matmul(tmp_dip(:, :), transpose(tmp_dip(:, :)))
1364 ana_env%dip_ana%mu2_pv_mat(:, :) = ana_env%dip_ana%mu2_pv_mat(:, :) + &
1365 tmp_dip(:, :)/vol*weight_act
1367 END SUBROUTINE calc_dipole_analysis
1376 SUBROUTINE print_act_dipole_analysis(elem, ana_env)
1380 CHARACTER(LEN=default_path_length) :: file_name, file_name_tmp
1381 INTEGER :: counter_tmp, file_ptr
1383 REAL(kind=
dp) :: diel_const, diel_const_norm, &
1384 diel_const_sym, e0, kb
1385 REAL(kind=
dp),
DIMENSION(3, 3) :: tmp_dip
1388 counter_tmp = int(ana_env%dip_ana%conf_counter)
1391 e0 = 0.07957747154594767_dp
1392 diel_const_norm = 1/(3.0_dp*e0*kb*ana_env%temperature)
1396 ana_env%temperature)
1398 conf_nr=int(ana_env%dip_ana%conf_counter) + 1, dip=elem%dipole, &
1399 file_ext=
"dip_folded")
1404 ana_env%temperature)
1406 SELECT CASE (ana_env%dip_ana%ana_type)
1411 "diel_const_tensor"))
1416 "diel_const_tensor_sym"))
1418 cpwarn(
'unknown analysis type "'//
cp_to_string(ana_env%dip_ana%ana_type)//
'" used.')
1423 diel_const = 1.0_dp + (ana_env%dip_ana%mu2_pv_s/(ana_env%dip_ana%conf_counter) - &
1424 dot_product(ana_env%dip_ana%mu_psv(:)/(ana_env%dip_ana%conf_counter), &
1425 ana_env%dip_ana%mu_psv(:)/(ana_env%dip_ana%conf_counter)))* &
1429 diel_const_sym = 1.0_dp + ana_env%dip_ana%mu2_pv_s/(ana_env%dip_ana%conf_counter)* &
1433 INQUIRE (file=file_name, exist=flag)
1434 CALL open_file(file_name=file_name, file_status=
"UNKNOWN", &
1435 file_action=
"WRITE", file_position=
"APPEND", &
1436 unit_number=file_ptr)
1437 IF (.NOT. flag)
THEN
1438 WRITE (file_ptr, fmt=
'(A8,5A20)')
"# conf",
"diel_const", &
1439 "diel_const_sym",
"diel_const_sym_x", &
1440 "diel_const_sym_y",
"diel_const_sym_z"
1442 WRITE (file_ptr, fmt=
"(I8,10F20.10)") counter_tmp, diel_const, &
1444 4.0_dp*
pi/(kb*ana_env%temperature)* &
1445 ana_env%dip_ana%mu2_pv(:)/real(ana_env%dip_ana%conf_counter, kind=
dp)
1449 INQUIRE (file=file_name_tmp, exist=flag)
1450 CALL open_file(file_name=file_name_tmp, file_status=
"UNKNOWN", &
1451 file_action=
"WRITE", file_position=
"APPEND", &
1452 unit_number=file_ptr)
1453 IF (.NOT. flag)
THEN
1454 WRITE (file_ptr, fmt=
'(A8,9A20)')
"# conf",
"xx",
"xy",
"xz", &
1458 tmp_dip(:, :) = 0.0_dp
1459 tmp_dip(:, 1) = ana_env%dip_ana%mu_psv(:)/real(ana_env%dip_ana%conf_counter, kind=
dp)
1461 WRITE (file_ptr, fmt=
"(I8,10F20.10)") counter_tmp, &
1462 4.0_dp*
pi/(kb*ana_env%temperature)* &
1463 (ana_env%dip_ana%mu2_pv_mat(:, :)/real(ana_env%dip_ana%conf_counter, kind=
dp) - &
1464 matmul(tmp_dip(:, :), transpose(tmp_dip(:, :))))
1466 END SUBROUTINE print_act_dipole_analysis
1474 SUBROUTINE print_dipole_analysis(ana_env)
1477 CHARACTER(LEN=*),
PARAMETER :: fmt_my =
'(T2,A,"| ",A,T41,A40)', plabel =
"TMC_ANA"
1480 REAL(kind=
dp) :: diel_const_scalar, kb
1481 REAL(kind=
dp),
DIMENSION(3) :: diel_const_sym, dielec_ev
1482 REAL(kind=
dp),
DIMENSION(3, 3) :: diel_const, tmp_dip, tmp_ev
1486 cpassert(
ASSOCIATED(ana_env))
1487 cpassert(
ASSOCIATED(ana_env%dip_ana))
1489 tmp_dip(:, :) = 0.0_dp
1490 diel_const(:, :) = 0.0_dp
1491 diel_const_scalar = 0.0_dp
1492 diel_const_sym = 0.0_dp
1495 tmp_dip(:, 1) = ana_env%dip_ana%mu_psv(:)/real(ana_env%dip_ana%conf_counter, kind=
dp)
1496 diel_const(:, :) = 4.0_dp*
pi/(kb*ana_env%temperature)* &
1497 (ana_env%dip_ana%mu2_pv_mat(:, :)/real(ana_env%dip_ana%conf_counter, kind=
dp) - &
1498 matmul(tmp_dip(:, :), transpose(tmp_dip(:, :))))
1501 diel_const_sym(:) = 4.0_dp*
pi/(kb*ana_env%temperature)* &
1502 ana_env%dip_ana%mu2_pv(:)/real(ana_env%dip_ana%conf_counter, kind=
dp)
1505 diel_const(i, i) = diel_const(i, i) + 1.0_dp
1506 diel_const_scalar = diel_const_scalar + diel_const(i, i)
1508 diel_const_scalar = diel_const_scalar/real(3, kind=
dp)
1510 tmp_dip(:, :) = diel_const
1511 CALL diag(3, tmp_dip, dielec_ev, tmp_ev)
1514 WRITE (ana_env%io_unit, fmt=
"(/,T2,A)") repeat(
"-", 79)
1515 WRITE (ana_env%io_unit, fmt=
"(T2,A,T35,A,T80,A)")
"-",
"average dipoles",
"-"
1516 WRITE (ana_env%io_unit, fmt=fmt_my) plabel,
"temperature ",
cp_to_string(ana_env%temperature)
1517 WRITE (ana_env%io_unit, fmt=fmt_my) plabel,
"used configurations ", &
1520 WRITE (ana_env%io_unit, fmt=
'(T2,A,"| ",A)') plabel, &
1521 "ice analysis with directions of hexagonal structure"
1523 WRITE (ana_env%io_unit, fmt=
'(T2,A,"| ",A)') plabel, &
1524 "ice analysis with symmetrized dipoles in each direction."
1526 WRITE (ana_env%io_unit, fmt=fmt_my) plabel,
"for product of 2 directions(per vol):"
1528 WRITE (ana_env%io_unit,
'(A,3F16.8,A)')
" |", ana_env%dip_ana%mu2_pv_mat(i, :)/ &
1529 REAL(ana_env%dip_ana%conf_counter, kind=
dp),
" |"
1532 WRITE (ana_env%io_unit, fmt=fmt_my) plabel,
"dielectric constant tensor:"
1534 WRITE (ana_env%io_unit,
'(A,3F16.8,A)')
" |", diel_const(i, :),
" |"
1537 WRITE (ana_env%io_unit, fmt=fmt_my) plabel,
"dielectric tensor eigenvalues", &
1541 WRITE (ana_env%io_unit, fmt=fmt_my) plabel,
"dielectric constant symm ", &
1545 WRITE (ana_env%io_unit, fmt=fmt_my) plabel,
"dielectric constant ", &
1547 WRITE (ana_env%io_unit, fmt=
"(/,T2,A)") repeat(
"-", 79)
1549 END SUBROUTINE print_dipole_analysis
1562 SUBROUTINE calc_displacement(elem, ana_env)
1566 CHARACTER(LEN=*),
PARAMETER :: routinen =
'calc_displacement'
1568 CHARACTER(LEN=default_path_length) :: file_name, file_name_tmp
1569 INTEGER :: file_ptr, handle, ind
1571 REAL(kind=
dp) :: disp
1572 REAL(kind=
dp),
DIMENSION(3) :: atom_disp
1576 cpassert(
ASSOCIATED(elem))
1577 cpassert(
ASSOCIATED(elem%pos))
1578 cpassert(
ASSOCIATED(ana_env))
1579 cpassert(
ASSOCIATED(ana_env%displace))
1580 cpassert(
ASSOCIATED(ana_env%last_elem))
1583 CALL timeset(routinen, handle)
1585 DO ind = 1,
SIZE(elem%pos), ana_env%dim_per_elem
1587 atom_disp(:) = elem%pos(ind:ind + 2) - ana_env%last_elem%pos(ind:ind + 2)
1590 disp = disp + sum((atom_disp(:)*au2a)**2)
1592 ana_env%displace%disp = ana_env%displace%disp + disp
1593 ana_env%displace%conf_counter = ana_env%displace%conf_counter + 1
1595 IF (ana_env%displace%print_disp)
THEN
1598 ana_env%temperature)
1601 INQUIRE (file=file_name, exist=flag)
1602 CALL open_file(file_name=file_name, file_status=
"UNKNOWN", &
1603 file_action=
"WRITE", file_position=
"APPEND", &
1604 unit_number=file_ptr)
1606 WRITE (file_ptr, *)
"# conf squared deviation of the cell"
1607 WRITE (file_ptr, *) elem%nr, disp
1612 CALL timestop(handle)
1614 END SUBROUTINE calc_displacement
1622 SUBROUTINE print_average_displacement(ana_env)
1625 CHARACTER(LEN=*),
PARAMETER :: fmt_my =
'(T2,A,"| ",A,T41,A40)', plabel =
"TMC_ANA"
1627 WRITE (ana_env%io_unit, fmt=
"(/,T2,A)") repeat(
"-", 79)
1628 WRITE (ana_env%io_unit, fmt=
"(T2,A,T35,A,T80,A)")
"-",
"average displacement",
"-"
1629 WRITE (ana_env%io_unit, fmt=fmt_my) plabel,
"temperature ", &
1631 WRITE (ana_env%io_unit, fmt=fmt_my) plabel,
"used configurations ", &
1633 WRITE (ana_env%io_unit, fmt=fmt_my) plabel,
"cell root mean square deviation: ", &
1635 REAL(ana_env%displace%conf_counter, kind=
dp)))
1636 IF (ana_env%print_test_output) &
1637 WRITE (*, *)
"TMC|ANALYSIS_AVERAGE_CELL_DISPLACEMENT_X= ", &
1638 sqrt(ana_env%displace%disp/ &
1639 REAL(ana_env%displace%conf_counter, kind=
dp))
1640 END SUBROUTINE print_average_displacement
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 ...
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
integer, parameter, public default_path_length
An array-based list which grows on demand. When the internal array is full, a new array of twice the ...
Definition of mathematical constants and functions.
real(kind=dp), parameter, public pi
Collection of simple mathematical functions and subroutines.
subroutine, public diag(n, a, d, v)
Diagonalize matrix a. The eigenvalues are returned in vector d and the eigenvectors are returned in m...
Definition of physical constants:
real(kind=dp), parameter, public boltzmann
real(kind=dp), parameter, public a_mass
real(kind=dp), parameter, public joule
real(kind=dp), parameter, public angstrom
real(kind=dp), parameter, public massunit
module provides variables for the TMC analysis tool
integer function, public search_pair_in_list(pair_list, n1, n2, list_end)
search the pair of two atom types in list
subroutine, public tmc_ana_displacement_create(ana_disp, dim_per_elem)
creates a new structure environment for TMC analysis
subroutine, public tmc_ana_dipole_analysis_create(ana_dip_ana)
creates a new structure environment for TMC analysis
subroutine, public tmc_ana_dipole_moment_create(ana_dip_mom, charge_atm, charge, dim_per_elem)
creates a new structure environment for TMC analysis
subroutine, public tmc_ana_env_create(tmc_ana)
creates a new structure environment for TMC analysis
integer, parameter, public ana_type_default
integer, parameter, public ana_type_ice
character(len=default_path_length), parameter, public tmc_ana_pair_correl_file_name
character(len=default_path_length), parameter, public tmc_ana_density_file_name
integer, parameter, public ana_type_sym_xyz
subroutine, public tmc_ana_density_create(ana_dens, nr_bins)
creates a new structure environment for TMC analysis
subroutine, public tmc_ana_pair_correl_create(ana_pair_correl, nr_bins)
creates a new structure environment for TMC analysis
module analyses element of the TMC tree element structure e.g. density, radial distribution function,...
subroutine, public analysis_restart_read(ana_env, elem)
read analysis restart file
subroutine, public finalize_tmc_analysis(ana_env)
call all the necessarry analysis printing routines
subroutine, public tmc_read_ana_input(tmc_ana_section, tmc_ana)
creates a new para environment for tmc analysis
subroutine, public analyze_file_configurations(start_id, end_id, dir_ind, ana_env, tmc_params)
read the files and analyze the configurations
subroutine, public analysis_init(ana_env, nr_dim)
initialize all the necessarry analysis structures
subroutine, public do_tmc_analysis(elem, ana_env)
call all the necessarry analysis routines analysis the previous element with the weight of the differ...
subroutine, public analysis_restart_print(ana_env)
print analysis restart file
calculation section for TreeMonteCarlo
subroutine, public get_scaled_cell(cell, box_scale, scaled_hmat, scaled_cell, vol, abc, vec)
handles properties and calculations of a scaled cell
real(kind=dp) function, public nearest_distance(x1, x2, cell, box_scale)
neares distance of atoms within the periodic boundary condition
writing and printing the files, trajectory (pos, cell, dipoles) as well as restart files
subroutine, public analyse_files_close(tmc_ana)
close the files for reading configurations data to analyze
subroutine, public write_dipoles_in_file(file_name, conf_nr, dip, file_ext)
writes the cell dipoles in dipole trajectory file
subroutine, public read_element_from_file(elem, tmc_ana, conf_nr, stat)
read the trajectory element from a file from sub tree element
subroutine, public analyse_files_open(tmc_ana, stat, dir_ind)
opens the files for reading configurations data to analyze
character(len=default_path_length) function, public expand_file_name_char(file_name, extra)
placing a character string at the end of a file name (before the file extension)
character(len=default_path_length) function, public expand_file_name_temp(file_name, rvalue)
placing the temperature at the end of a file name (before the file extension)
tree nodes creation, searching, deallocation, references etc.
character(len= *), parameter, public tmc_default_trajectory_file_name
character(len= *), parameter, public tmc_default_unspecified_name
integer, parameter, public tmc_status_wait_for_new_task
character(len= *), parameter, public tmc_default_restart_in_file_name
character(len= *), parameter, public tmc_default_restart_out_file_name
integer, parameter, public tmc_status_ok
tree nodes creation, deallocation, references etc.
subroutine, public deallocate_sub_tree_node(tree_elem)
deallocates an elements of the subtree element structure
subroutine, public allocate_new_sub_tree_node(tmc_params, next_el, nr_dim)
allocates an elements of the subtree element structure
module handles definition of the tree nodes for the global and the subtrees binary tree parent elemen...
subroutine, public read_subtree_elem_unformated(elem, io_unit)
reads the TMC sub tree structure element unformated in file
subroutine, public write_subtree_elem_unformated(elem, io_unit)
prints out the TMC sub tree structure element unformated in file
module handles definition of the tree nodes for the global and the subtrees binary tree parent elemen...
Type defining parameters related to the simulation cell.