LCOV - code coverage report
Current view: top level - src/tmc - tmc_file_io.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:71c3ab0) Lines: 80.2 % 419 336
Test Date: 2026-07-25 06:35:44 Functions: 93.3 % 15 14

            Line data    Source code
       1              : !--------------------------------------------------------------------------------------------------!
       2              : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3              : !   Copyright 2000-2026 CP2K developers group <https://cp2k.org>                                   !
       4              : !                                                                                                  !
       5              : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6              : !--------------------------------------------------------------------------------------------------!
       7              : 
       8              : ! **************************************************************************************************
       9              : !> \brief - writing and printing the files, trajectory (pos, cell, dipoles) as
      10              : !>        well as restart files
      11              : !>        - usually just the Markov Chain elements are regarded, the elements
      12              : !>        beside this trajectory are neglected
      13              : !>        - futrthermore (by option) just the accepted configurations
      14              : !>          are print out to reduce the file sizes
      15              : !> \par History
      16              : !>      12.2012 created [Mandes Schoenherr]
      17              : !> \author Mandes
      18              : ! **************************************************************************************************
      19              : 
      20              : MODULE tmc_file_io
      21              :    USE cp_files,                        ONLY: close_file,&
      22              :                                               open_file
      23              :    USE cp_log_handling,                 ONLY: cp_to_string
      24              :    USE kinds,                           ONLY: default_path_length,&
      25              :                                               default_string_length,&
      26              :                                               dp
      27              :    USE physcon,                         ONLY: au2a => angstrom
      28              :    USE tmc_analysis_types,              ONLY: tmc_analysis_env
      29              :    USE tmc_calculations,                ONLY: get_cell_scaling,&
      30              :                                               get_scaled_cell
      31              :    USE tmc_move_types,                  ONLY: nr_mv_types
      32              :    USE tmc_stati,                       ONLY: TMC_STATUS_FAILED,&
      33              :                                               TMC_STATUS_OK,&
      34              :                                               TMC_STATUS_WAIT_FOR_NEW_TASK,&
      35              :                                               tmc_default_restart_in_file_name,&
      36              :                                               tmc_default_restart_out_file_name,&
      37              :                                               tmc_default_trajectory_file_name
      38              :    USE tmc_tree_types,                  ONLY: elem_array_type,&
      39              :                                               tree_type
      40              :    USE tmc_types,                       ONLY: tmc_env_type,&
      41              :                                               tmc_param_type
      42              : #include "../base/base_uses.f90"
      43              : 
      44              :    IMPLICIT NONE
      45              : 
      46              :    PRIVATE
      47              : 
      48              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'tmc_file_io'
      49              : 
      50              :    ! filename manipulation
      51              :    PUBLIC :: expand_file_name_char, expand_file_name_temp, expand_file_name_int
      52              :    ! read/write restart file
      53              :    PUBLIC :: print_restart_file, read_restart_file
      54              :    ! write the configuration
      55              :    PUBLIC :: write_result_list_element
      56              :    PUBLIC :: write_element_in_file
      57              :    PUBLIC :: write_dipoles_in_file
      58              :    ! analysis read
      59              :    PUBLIC :: analyse_files_open, read_element_from_file, analyse_files_close
      60              : 
      61              : CONTAINS
      62              : 
      63              : !------------------------------------------------------------------------------
      64              : ! routines for manipulating the file name
      65              : !------------------------------------------------------------------------------
      66              : ! **************************************************************************************************
      67              : !> \brief placing a character string at the end of a file name
      68              : !>        (instead of the ending)
      69              : !> \param file_name original file name
      70              : !> \param extra string to be added before the file extension
      71              : !> \return the new filename
      72              : !> \author Mandes 11.2012
      73              : ! **************************************************************************************************
      74         2615 :    FUNCTION expand_file_name_ending(file_name, extra) RESULT(result_file_name)
      75              :       CHARACTER(LEN=*)                                   :: file_name, extra
      76              :       CHARACTER(LEN=default_path_length)                 :: result_file_name
      77              : 
      78              :       INTEGER                                            :: ind
      79              : 
      80            0 :       CPASSERT(file_name /= "")
      81              : 
      82         2615 :       ind = INDEX(file_name, ".", BACK=.TRUE.)
      83         2615 :       IF (.NOT. ind == 0) THEN
      84         2615 :          WRITE (result_file_name, *) file_name(1:ind - 1), ".", &
      85         5230 :             TRIM(ADJUSTL(extra))
      86              :       ELSE
      87            0 :          WRITE (result_file_name, *) TRIM(file_name), ".", extra
      88              :       END IF
      89         2615 :       result_file_name = TRIM(ADJUSTL(result_file_name))
      90         2615 :       CPASSERT(result_file_name /= "")
      91         2615 :    END FUNCTION expand_file_name_ending
      92              : 
      93              : ! **************************************************************************************************
      94              : !> \brief placing a character string at the end of a file name
      95              : !>        (before the file extension)
      96              : !> \param file_name original file name
      97              : !> \param extra string to be added before the file extension
      98              : !> \return the new filename
      99              : !> \author Mandes 11.2012
     100              : ! **************************************************************************************************
     101         1427 :    FUNCTION expand_file_name_char(file_name, extra) RESULT(result_file_name)
     102              :       CHARACTER(LEN=*)                                   :: file_name, extra
     103              :       CHARACTER(LEN=default_path_length)                 :: result_file_name
     104              : 
     105              :       INTEGER                                            :: ind
     106              : 
     107            0 :       CPASSERT(file_name /= "")
     108              : 
     109         1427 :       ind = INDEX(file_name, ".", BACK=.TRUE.)
     110         1427 :       IF (.NOT. ind == 0) THEN
     111         1427 :          WRITE (result_file_name, *) file_name(1:ind - 1), "_", &
     112         2854 :             TRIM(ADJUSTL(extra)), file_name(ind:LEN_TRIM(file_name))
     113              :       ELSE
     114            0 :          WRITE (result_file_name, *) TRIM(file_name), "_", extra
     115              :       END IF
     116         1427 :       result_file_name = TRIM(ADJUSTL(result_file_name))
     117         1427 :       CPASSERT(result_file_name /= "")
     118         1427 :    END FUNCTION expand_file_name_char
     119              : 
     120              : ! **************************************************************************************************
     121              : !> \brief placing the temperature at the end of a file name
     122              : !>        (before the file extension)
     123              : !> \param file_name original file name
     124              : !> \param rvalue temperature to be added
     125              : !> \return the new filename
     126              : !> \author Mandes 11.2012
     127              : ! **************************************************************************************************
     128         2871 :    FUNCTION expand_file_name_temp(file_name, rvalue) RESULT(result_file_name)
     129              :       CHARACTER(LEN=*)                                   :: file_name
     130              :       REAL(KIND=dp)                                      :: rvalue
     131              :       CHARACTER(LEN=default_path_length)                 :: result_file_name
     132              : 
     133              :       CHARACTER(LEN=18)                                  :: rval_to_string
     134              :       INTEGER                                            :: ind
     135              : 
     136         2871 :       CPASSERT(file_name /= "")
     137              : 
     138         2871 :       rval_to_string = ""
     139              : 
     140         2871 :       WRITE (rval_to_string, "(F16.2)") rvalue
     141         2871 :       ind = INDEX(file_name, ".", BACK=.TRUE.)
     142         2871 :       IF (.NOT. ind == 0) THEN
     143         2871 :          WRITE (result_file_name, *) file_name(1:ind - 1), "_T", &
     144         5742 :             TRIM(ADJUSTL(rval_to_string)), file_name(ind:LEN_TRIM(file_name))
     145              :       ELSE
     146            0 :          IF (LEN(file_name) == 0) THEN
     147            0 :             WRITE (result_file_name, *) TRIM(file_name), "T", TRIM(ADJUSTL(rval_to_string)), &
     148            0 :                file_name(ind:LEN_TRIM(file_name))
     149              :          ELSE
     150            0 :             WRITE (result_file_name, *) TRIM(file_name), "_T", TRIM(ADJUSTL(rval_to_string))
     151              :          END IF
     152              :       END IF
     153         2871 :       result_file_name = TRIM(ADJUSTL(result_file_name))
     154         2871 :       CPASSERT(result_file_name /= "")
     155         2871 :    END FUNCTION expand_file_name_temp
     156              : 
     157              : ! **************************************************************************************************
     158              : !> \brief placing an integer at the end of a file name
     159              : !>        (before the file extension)
     160              : !> \param file_name original file name
     161              : !> \param ivalue number to be added
     162              : !> \return the new filename
     163              : !> \author Mandes 11.2012
     164              : ! **************************************************************************************************
     165           19 :    FUNCTION expand_file_name_int(file_name, ivalue) RESULT(result_file_name)
     166              :       CHARACTER(LEN=*)                                   :: file_name
     167              :       INTEGER                                            :: ivalue
     168              :       CHARACTER(LEN=default_path_length)                 :: result_file_name
     169              : 
     170              :       CHARACTER(LEN=18)                                  :: rval_to_string
     171              :       INTEGER                                            :: ind
     172              : 
     173           19 :       CPASSERT(file_name /= "")
     174              : 
     175           19 :       rval_to_string = ""
     176              : 
     177           19 :       WRITE (rval_to_string, *) ivalue
     178           19 :       ind = INDEX(file_name, ".", BACK=.TRUE.)
     179           19 :       IF (.NOT. ind == 0) THEN
     180           19 :          WRITE (result_file_name, *) file_name(1:ind - 1), "_", &
     181           38 :             TRIM(ADJUSTL(rval_to_string)), file_name(ind:LEN_TRIM(file_name))
     182              :       ELSE
     183            0 :          IF (LEN(file_name) == 0) THEN
     184            0 :             WRITE (result_file_name, *) TRIM(file_name), "", TRIM(ADJUSTL(rval_to_string)), &
     185            0 :                file_name(ind:LEN_TRIM(file_name))
     186              :          ELSE
     187            0 :             WRITE (result_file_name, *) TRIM(file_name), "_", TRIM(ADJUSTL(rval_to_string)), &
     188            0 :                file_name(ind:LEN_TRIM(file_name))
     189              :          END IF
     190              :       END IF
     191           19 :       result_file_name = TRIM(ADJUSTL(result_file_name))
     192           19 :       CPASSERT(result_file_name /= "")
     193           19 :    END FUNCTION expand_file_name_int
     194              : 
     195              : !------------------------------------------------------------------------------
     196              : ! routines for reading and writing RESTART file
     197              : !------------------------------------------------------------------------------
     198              : ! **************************************************************************************************
     199              : !> \brief prints out the TMC restart files with all last configurations and
     200              : !>        counters etc.
     201              : !> \param tmc_env the tmc environment, storing result lists and counters an in
     202              : !>        temperatures
     203              : !> \param job_counts the counters for counting the submitted different job types
     204              : !> \param timings ...
     205              : !> \author Mandes 11.2012
     206              : ! **************************************************************************************************
     207            3 :    SUBROUTINE print_restart_file(tmc_env, job_counts, timings)
     208              :       TYPE(tmc_env_type), POINTER                        :: tmc_env
     209              :       INTEGER, DIMENSION(:)                              :: job_counts
     210              :       REAL(KIND=dp), DIMENSION(4)                        :: timings
     211              : 
     212              :       CHARACTER(LEN=default_path_length)                 :: c_tmp, file_name
     213              :       INTEGER                                            :: f_unit, i
     214              : 
     215            3 :       c_tmp = ""
     216            3 :       CPASSERT(ASSOCIATED(tmc_env))
     217            3 :       CPASSERT(ASSOCIATED(tmc_env%m_env))
     218            3 :       CPASSERT(ASSOCIATED(tmc_env%params))
     219            3 :       CPASSERT(ASSOCIATED(tmc_env%m_env%gt_act))
     220              : 
     221            3 :       WRITE (c_tmp, FMT='(I9.9)') tmc_env%m_env%result_count(0)
     222              :       file_name = TRIM(expand_file_name_char( &
     223              :                        file_name=tmc_default_restart_out_file_name, &
     224            3 :                        extra=c_tmp))
     225              :       CALL open_file(file_name=file_name, file_status="REPLACE", &
     226              :                      file_action="WRITE", file_form="UNFORMATTED", &
     227            3 :                      unit_number=f_unit)
     228            3 :       WRITE (f_unit) SIZE(tmc_env%params%Temp)
     229           12 :       WRITE (f_unit) tmc_env%params%Temp(:), &
     230            3 :          tmc_env%m_env%gt_act%nr, &
     231           84 :          tmc_env%m_env%gt_act%rng_seed, &
     232            3 :          tmc_env%m_env%gt_act%rnd_nr, &
     233            3 :          tmc_env%m_env%gt_act%prob_acc, &
     234            3 :          tmc_env%m_env%gt_act%mv_conf, &
     235            3 :          tmc_env%m_env%gt_act%mv_next_conf, &
     236           15 :          tmc_env%m_env%result_count(0:), &
     237           33 :          tmc_env%params%move_types%mv_weight, &
     238          111 :          tmc_env%params%move_types%acc_count, &
     239          111 :          tmc_env%params%move_types%mv_count, &
     240          102 :          tmc_env%params%move_types%subbox_acc_count, &
     241          102 :          tmc_env%params%move_types%subbox_count, &
     242           39 :          tmc_env%params%cell%hmat, &
     243            3 :          job_counts, &
     244            6 :          timings
     245           12 :       DO i = 1, SIZE(tmc_env%params%Temp)
     246            9 :          WRITE (f_unit) tmc_env%m_env%result_list(i)%elem%nr, &
     247          252 :             tmc_env%m_env%result_list(i)%elem%rng_seed, &
     248          576 :             tmc_env%m_env%result_list(i)%elem%pos, &
     249          576 :             tmc_env%m_env%result_list(i)%elem%vel, &
     250           36 :             tmc_env%m_env%result_list(i)%elem%box_scale, &
     251            9 :             tmc_env%m_env%result_list(i)%elem%potential, &
     252            9 :             tmc_env%m_env%result_list(i)%elem%e_pot_approx, &
     253            9 :             tmc_env%m_env%result_list(i)%elem%ekin, &
     254            9 :             tmc_env%m_env%result_list(i)%elem%ekin_before_md, &
     255           21 :             tmc_env%m_env%result_list(i)%elem%temp_created
     256              :       END DO
     257            3 :       CALL close_file(unit_number=f_unit)
     258              :       ! write the file, where the restart file name is written in
     259              :       CALL open_file(file_name=tmc_default_restart_in_file_name, &
     260              :                      file_action="WRITE", file_status="REPLACE", &
     261            3 :                      unit_number=f_unit)
     262            3 :       WRITE (f_unit, *) TRIM(file_name)
     263            3 :       CALL close_file(unit_number=f_unit)
     264            3 :    END SUBROUTINE print_restart_file
     265              : 
     266              : ! **************************************************************************************************
     267              : !> \brief reads the TMC restart file with all last configurations and
     268              : !>        counters etc.
     269              : !> \param tmc_env the tmc environment, storing result lists and counters an in
     270              : !>        temperatures
     271              : !> \param job_counts the counters for counting the submitted different job types
     272              : !> \param timings ...
     273              : !> \param file_name the restart file name
     274              : !> \author Mandes 11.2012
     275              : ! **************************************************************************************************
     276            2 :    SUBROUTINE read_restart_file(tmc_env, job_counts, timings, file_name)
     277              :       TYPE(tmc_env_type), POINTER                        :: tmc_env
     278              :       INTEGER, DIMENSION(:)                              :: job_counts
     279              :       REAL(KIND=dp), DIMENSION(4)                        :: timings
     280              :       CHARACTER(LEN=*)                                   :: file_name
     281              : 
     282              :       INTEGER                                            :: file_ptr, i, temp_size
     283              :       LOGICAL                                            :: flag
     284            2 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)           :: tmp_temp
     285              :       REAL(KIND=dp), DIMENSION(nr_mv_types)              :: mv_weight_tmp
     286              : 
     287            2 :       CPASSERT(ASSOCIATED(tmc_env))
     288            2 :       CPASSERT(ASSOCIATED(tmc_env%m_env))
     289            2 :       CPASSERT(ASSOCIATED(tmc_env%params))
     290            2 :       CPASSERT(ASSOCIATED(tmc_env%m_env%gt_act))
     291              : 
     292            2 :       IF (file_name == tmc_default_restart_in_file_name) THEN
     293            2 :          INQUIRE (FILE=tmc_default_restart_in_file_name, EXIST=flag)
     294            2 :          CPASSERT(flag)
     295              :          CALL open_file(file_name=tmc_default_restart_in_file_name, file_status="OLD", &
     296            2 :                         file_action="READ", unit_number=file_ptr)
     297            2 :          READ (file_ptr, *) file_name
     298            2 :          CALL close_file(unit_number=file_ptr)
     299              :       END IF
     300              : 
     301              :       CALL open_file(file_name=file_name, file_status="OLD", file_form="UNFORMATTED", &
     302            2 :                      file_action="READ", unit_number=file_ptr)
     303            2 :       READ (file_ptr) temp_size
     304            2 :       IF (temp_size /= SIZE(tmc_env%params%Temp)) THEN
     305              :          CALL cp_abort(__LOCATION__, &
     306              :                        "the actual specified temperatures does not "// &
     307            0 :                        "fit in amount with the one from restart file ")
     308              :       END IF
     309            6 :       ALLOCATE (tmp_temp(temp_size))
     310            2 :       READ (file_ptr) tmp_temp(:), &
     311            2 :          tmc_env%m_env%gt_act%nr, &
     312           56 :          tmc_env%m_env%gt_act%rng_seed, &
     313            2 :          tmc_env%m_env%gt_act%rnd_nr, &
     314            2 :          tmc_env%m_env%gt_act%prob_acc, &
     315            2 :          tmc_env%m_env%gt_act%mv_conf, & !
     316            2 :          tmc_env%m_env%gt_act%mv_next_conf, & !
     317           10 :          tmc_env%m_env%result_count(0:), &
     318            2 :          mv_weight_tmp, & !
     319           74 :          tmc_env%params%move_types%acc_count, &
     320           74 :          tmc_env%params%move_types%mv_count, &
     321           68 :          tmc_env%params%move_types%subbox_acc_count, &
     322           68 :          tmc_env%params%move_types%subbox_count, & !
     323           26 :          tmc_env%params%cell%hmat, &
     324            2 :          job_counts, &
     325            4 :          timings
     326              : 
     327            8 :       IF (ANY(ABS(tmc_env%params%Temp(:) - tmp_temp(:)) >= 0.005)) THEN
     328              :          CALL cp_abort(__LOCATION__, "the temperatures differ from the previous calculation. "// &
     329            0 :                        "There were the following temperatures used:")
     330              :       END IF
     331           22 :       IF (ANY(mv_weight_tmp(:) /= tmc_env%params%move_types%mv_weight(:))) THEN
     332            0 :          CPWARN("The amount of mv types differs between the original and the restart run.")
     333              :       END IF
     334              : 
     335            8 :       DO i = 1, SIZE(tmc_env%params%Temp)
     336            6 :          tmc_env%m_env%gt_act%conf(i)%elem => tmc_env%m_env%result_list(i)%elem
     337            6 :          READ (file_ptr) tmc_env%m_env%result_list(i)%elem%nr, &
     338          168 :             tmc_env%m_env%result_list(i)%elem%rng_seed, &
     339          384 :             tmc_env%m_env%result_list(i)%elem%pos, &
     340          384 :             tmc_env%m_env%result_list(i)%elem%vel, &
     341           24 :             tmc_env%m_env%result_list(i)%elem%box_scale, &
     342            6 :             tmc_env%m_env%result_list(i)%elem%potential, &
     343            6 :             tmc_env%m_env%result_list(i)%elem%e_pot_approx, &
     344            6 :             tmc_env%m_env%result_list(i)%elem%ekin, &
     345            6 :             tmc_env%m_env%result_list(i)%elem%ekin_before_md, &
     346           14 :             tmc_env%m_env%result_list(i)%elem%temp_created
     347              :       END DO
     348            2 :       CALL close_file(unit_number=file_ptr)
     349            2 :    END SUBROUTINE read_restart_file
     350              : 
     351              :    !----------------------------------------------------------------------------
     352              :    ! printing configuration in file
     353              :    !----------------------------------------------------------------------------
     354              : 
     355              : ! **************************************************************************************************
     356              : !> \brief select the correct configuration to print out the
     357              : !>        (coordinates, forces, cell ...)
     358              : !> \param result_list list of configurations for each temperature
     359              : !> \param result_count list with number of Markov Chain number
     360              : !>          for each teperature (index 0 for global tree)
     361              : !> \param conf_updated index of the updated (modified element)
     362              : !> \param accepted acceptance flag
     363              : !> \param tmc_params TMC environment parameters
     364              : !> \author Mandes 02.2013
     365              : ! **************************************************************************************************
     366         9334 :    SUBROUTINE write_result_list_element(result_list, result_count, conf_updated, &
     367              :                                         accepted, tmc_params)
     368              :       TYPE(elem_array_type), DIMENSION(:), POINTER       :: result_list
     369              :       INTEGER, DIMENSION(:), POINTER                     :: result_count
     370              :       INTEGER                                            :: conf_updated
     371              :       LOGICAL, INTENT(IN)                                :: accepted
     372              :       TYPE(tmc_param_type), POINTER                      :: tmc_params
     373              : 
     374              :       CHARACTER(LEN=*), PARAMETER :: routineN = 'write_result_list_element'
     375              : 
     376              :       CHARACTER(LEN=default_path_length)                 :: file_name
     377              :       INTEGER                                            :: handle, i
     378              : 
     379         4667 :       file_name = ""
     380              : 
     381         4667 :       CPASSERT(ASSOCIATED(result_list))
     382         4667 :       CPASSERT(ASSOCIATED(result_count))
     383         4667 :       CPASSERT(ASSOCIATED(tmc_params))
     384         4667 :       CPASSERT(ASSOCIATED(tmc_params%Temp))
     385         4667 :       CPASSERT(conf_updated >= 0)
     386         4667 :       CPASSERT(conf_updated <= SIZE(tmc_params%Temp))
     387              : 
     388              :       ! start the timing
     389         4667 :       CALL timeset(routineN, handle)
     390              : 
     391         4667 :       IF (conf_updated == 0) THEN
     392              :          ! for debugging print every configuration of every temperature
     393            0 :          DO i = 1, SIZE(tmc_params%Temp)
     394            0 :             WRITE (file_name, *) "every_step_", TRIM(tmc_default_trajectory_file_name)
     395              :             CALL write_element_in_file(elem=result_list(i)%elem, &
     396              :                                        tmc_params=tmc_params, conf_nr=result_count(0), &
     397            0 :                                        file_name=expand_file_name_temp(file_name=file_name, rvalue=tmc_params%Temp(i)))
     398              :          END DO
     399              :       ELSE
     400         4667 :          IF ((.NOT. tmc_params%print_only_diff_conf) .OR. &
     401              :              (tmc_params%print_only_diff_conf .AND. accepted)) THEN
     402              :             CALL write_element_in_file(elem=result_list(conf_updated)%elem, &
     403              :                                        tmc_params=tmc_params, conf_nr=result_count(conf_updated), &
     404              :                                        file_name=expand_file_name_temp(file_name=TRIM(tmc_default_trajectory_file_name), &
     405         1025 :                                                                        rvalue=tmc_params%Temp(conf_updated)))
     406              :          END IF
     407              :       END IF
     408              :       ! end the timing
     409         4667 :       CALL timestop(handle)
     410         4667 :    END SUBROUTINE write_result_list_element
     411              : 
     412              : ! **************************************************************************************************
     413              : !> \brief writes the trajectory element in a file from sub tree element
     414              : !> \param elem actual tree element to be printed out
     415              : !> \param tmc_params TMC environment parameters
     416              : !> \param temp_index ...
     417              : !> \param file_name file name will be extended by type of file (pos, cell,...)
     418              : !> \param conf_nr Markov chain element number
     419              : !> \param conf_info whole header line
     420              : !> \author Mandes 11.2012
     421              : ! **************************************************************************************************
     422         1025 :    SUBROUTINE write_element_in_file(elem, tmc_params, temp_index, file_name, conf_nr, &
     423              :                                     conf_info)
     424              :       TYPE(tree_type), POINTER                           :: elem
     425              :       TYPE(tmc_param_type), POINTER                      :: tmc_params
     426              :       INTEGER, OPTIONAL                                  :: temp_index
     427              :       CHARACTER(LEN=*), OPTIONAL                         :: file_name
     428              :       INTEGER, OPTIONAL                                  :: conf_nr
     429              :       CHARACTER(LEN=*), OPTIONAL                         :: conf_info
     430              : 
     431              :       CHARACTER(LEN=*), PARAMETER :: routineN = 'write_element_in_file'
     432              : 
     433              :       CHARACTER(LEN=default_path_length)                 :: file_name_act, tmp_name
     434              :       CHARACTER(LEN=default_string_length)               :: header
     435              :       INTEGER                                            :: file_ptr, handle, i, nr_atoms
     436              :       LOGICAL                                            :: file_exists, print_it
     437              :       REAL(KIND=dp)                                      :: vol
     438              :       REAL(KIND=dp), DIMENSION(3, 3)                     :: hmat_scaled
     439              : 
     440         1025 :       file_name_act = ""
     441         1025 :       tmp_name = ""
     442         1025 :       header = ""
     443         1025 :       print_it = .TRUE.
     444              : 
     445            0 :       CPASSERT(ASSOCIATED(elem))
     446         1025 :       CPASSERT(ASSOCIATED(tmc_params))
     447         1025 :       CPASSERT(ASSOCIATED(tmc_params%atoms))
     448         1025 :       CPASSERT(PRESENT(conf_nr) .OR. PRESENT(conf_info))
     449              : 
     450         1025 :       IF (print_it) THEN
     451              :          ! start the timing
     452         1025 :          CALL timeset(routineN, handle)
     453              : 
     454              :          ! set default file name
     455         1025 :          IF (PRESENT(file_name)) THEN
     456         1025 :             CPASSERT(file_name /= "")
     457         1025 :             file_name_act = file_name
     458              :          ELSE
     459            0 :             CPASSERT(ASSOCIATED(tmc_params%Temp))
     460            0 :             CPASSERT(PRESENT(temp_index))
     461              :             file_name_act = expand_file_name_temp(file_name=tmc_default_trajectory_file_name, &
     462            0 :                                                   rvalue=tmc_params%Temp(temp_index))
     463              :          END IF
     464              : 
     465         1025 :          nr_atoms = SIZE(elem%pos)/tmc_params%dim_per_elem
     466              : 
     467              :          ! set header (for coordinate or force file)
     468         1025 :          IF (tmc_params%print_trajectory .OR. tmc_params%print_forces) THEN
     469         1025 :             IF (PRESENT(conf_info)) THEN
     470            0 :                WRITE (header, *) TRIM(ADJUSTL(conf_info))
     471              :             ELSE
     472              :                !WRITE(header,FMT="(A,I8,A,F20.10)") " i = ", conf_nr,", E = ", elem%potential
     473         1025 :                WRITE (header, FMT="(A,I8,A,F20.10,F20.10,A,I8,I8)") "i =", conf_nr, " ,E =", &
     474         2050 :                   elem%potential, elem%ekin, " st elem", elem%sub_tree_nr, elem%nr
     475              :             END IF
     476              :          END IF
     477              : 
     478              :          ! write the coordinates
     479         1025 :          IF (tmc_params%print_trajectory) THEN
     480         1025 :             tmp_name = expand_file_name_ending(file_name_act, "xyz")
     481              :             CALL open_file(file_name=tmp_name, file_status="UNKNOWN", &
     482              :                            file_action="WRITE", file_position="APPEND", &
     483         1025 :                            unit_number=file_ptr)
     484         1025 :             WRITE (file_ptr, FMT="(I8)") nr_atoms
     485         1025 :             WRITE (file_ptr, *) TRIM(header)
     486        44797 :             DO i = 1, SIZE(elem%pos), tmc_params%dim_per_elem
     487              :                WRITE (file_ptr, FMT="(A4,1X,1000F20.10)") &
     488        43772 :                   TRIM(tmc_params%atoms((i - 1)/tmc_params%dim_per_elem + 1)%name), &
     489       219885 :                   elem%pos(i:i + tmc_params%dim_per_elem - 1)*au2a
     490              :             END DO
     491         1025 :             CALL close_file(unit_number=file_ptr)
     492              :          END IF
     493              : 
     494              :          ! write the forces
     495         1025 :          IF (tmc_params%print_forces) THEN
     496          331 :             tmp_name = expand_file_name_ending(file_name_act, "frc")
     497              :             CALL open_file(file_name=tmp_name, file_status="UNKNOWN", &
     498              :                            file_action="WRITE", file_position="APPEND", &
     499          331 :                            unit_number=file_ptr)
     500          331 :             WRITE (file_ptr, FMT="(I8)") nr_atoms
     501          331 :             WRITE (file_ptr, *) TRIM(header)
     502         7282 :             DO i = 1, SIZE(elem%pos), tmc_params%dim_per_elem
     503              :                WRITE (file_ptr, FMT="(A4,1X,1000F20.10)") &
     504         6951 :                   TRIM(tmc_params%atoms((i - 1)/tmc_params%dim_per_elem + 1)%name), &
     505        35086 :                   elem%frc(i:i + tmc_params%dim_per_elem - 1)
     506              :             END DO
     507          331 :             CALL close_file(unit_number=file_ptr)
     508              :          END IF
     509              : 
     510              :          ! write the cell dipoles
     511         1025 :          IF (tmc_params%print_dipole) THEN
     512              :             CALL write_dipoles_in_file(file_name=file_name_act, &
     513            0 :                                        conf_nr=conf_nr, dip=elem%dipole)
     514              :          END IF
     515              : 
     516              :          ! write the cell file
     517         1025 :          IF (tmc_params%print_cell) THEN
     518          392 :             tmp_name = expand_file_name_ending(file_name_act, "cell")
     519              :             ! header
     520          392 :             INQUIRE (FILE=tmp_name, EXIST=file_exists) ! file_exists will be TRUE if the file exist
     521          392 :             IF (.NOT. file_exists) THEN
     522              :                CALL open_file(file_name=tmp_name, file_status="NEW", &
     523            6 :                               file_action="WRITE", unit_number=file_ptr)
     524              :                WRITE (file_ptr, FMT='(A,9(7X,A2," [Angstrom]"),6X,A)') &
     525            6 :                   "# MC step ", "Ax", "Ay", "Az", "Bx", "By", "Bz", "Cx", "Cy", "Cz", &
     526           12 :                   "Volume [Angstrom^3]"
     527              :             ELSE
     528              :                CALL open_file(file_name=tmp_name, file_status="OLD", &
     529              :                               file_action="WRITE", file_position="APPEND", &
     530          386 :                               unit_number=file_ptr)
     531              :             END IF
     532              :             CALL get_scaled_cell(cell=tmc_params%cell, &
     533              :                                  box_scale=elem%box_scale, scaled_hmat=hmat_scaled, &
     534          392 :                                  vol=vol)
     535          392 :             WRITE (file_ptr, FMT="(I8,9(1X,F19.10),1X,F24.10)") conf_nr, &
     536         5488 :                hmat_scaled(:, :)*au2a, vol*au2a**3
     537              :             !TODO better cell output e.g. using cell_types routine
     538          392 :             CALL close_file(unit_number=file_ptr)
     539              :          END IF
     540              : 
     541              :          ! write the different energies
     542         1025 :          IF (tmc_params%print_energies) THEN
     543          331 :             tmp_name = expand_file_name_ending(file_name_act, "ener")
     544              :             ! header
     545          331 :             INQUIRE (FILE=tmp_name, EXIST=file_exists) ! file_exists will be TRUE if the file exist
     546          331 :             IF (.NOT. file_exists) THEN
     547              :                CALL open_file(file_name=tmp_name, file_status="NEW", &
     548            3 :                               file_action="WRITE", unit_number=file_ptr)
     549              :                WRITE (file_ptr, FMT='(A,4A20)') &
     550            3 :                   "# MC step ", " exact ", " approx ", " last SCF ", " kinetic "
     551              :             ELSE
     552              :                CALL open_file(file_name=tmp_name, file_status="OLD", &
     553              :                               file_action="WRITE", file_position="APPEND", &
     554          328 :                               unit_number=file_ptr)
     555              :             END IF
     556          331 :             WRITE (file_ptr, FMT="(I8,14F20.10)") conf_nr, elem%potential, elem%e_pot_approx, &
     557          662 :                elem%scf_energies(MOD(elem%scf_energies_count, 4) + 1), elem%ekin
     558          331 :             CALL close_file(unit_number=file_ptr)
     559              :          END IF
     560              : 
     561              :          ! end the timing
     562         1025 :          CALL timestop(handle)
     563              :       END IF
     564         1025 :    END SUBROUTINE write_element_in_file
     565              : 
     566              : ! **************************************************************************************************
     567              : !> \brief writes the cell dipoles in dipole trajectory file
     568              : !> \param file_name ...
     569              : !> \param conf_nr ...
     570              : !> \param dip ...
     571              : !> \param file_ext ...
     572              : !> \param
     573              : !> \author Mandes 11.2012
     574              : ! **************************************************************************************************
     575          500 :    SUBROUTINE write_dipoles_in_file(file_name, conf_nr, dip, file_ext)
     576              :       CHARACTER(LEN=default_path_length)                 :: file_name
     577              :       INTEGER                                            :: conf_nr
     578              :       REAL(KIND=dp), DIMENSION(:), POINTER               :: dip
     579              :       CHARACTER(LEN=*), INTENT(in), OPTIONAL             :: file_ext
     580              : 
     581              :       CHARACTER(LEN=default_path_length)                 :: file_name_tmp
     582              :       INTEGER                                            :: file_ptr
     583              :       LOGICAL                                            :: file_exists
     584              : 
     585          500 :       CPASSERT(ASSOCIATED(dip))
     586              : 
     587          500 :       IF (PRESENT(file_ext)) THEN
     588          500 :          CPASSERT(file_ext /= "")
     589          500 :          file_name_tmp = expand_file_name_ending(file_name, TRIM(file_ext))
     590              :       ELSE
     591            0 :          file_name_tmp = expand_file_name_ending(file_name, "dip")
     592              :       END IF
     593          500 :       INQUIRE (FILE=file_name_tmp, EXIST=file_exists)
     594          500 :       IF (.NOT. file_exists) THEN
     595              :          CALL open_file(file_name=file_name_tmp, file_status="NEW", &
     596            3 :                         file_action="WRITE", unit_number=file_ptr)
     597            3 :          WRITE (file_ptr, FMT='(A8,10A20)') "# conf_nr", "dip_x [C Angstrom]", &
     598            6 :             "dip_y [C Angstrom]", "dip_z [C Angstrom]"
     599              :       ELSE
     600              :          CALL open_file(file_name=file_name_tmp, file_status="OLD", &
     601              :                         file_action="WRITE", file_position="APPEND", &
     602          497 :                         unit_number=file_ptr)
     603              :       END IF
     604         2000 :       WRITE (file_ptr, FMT="(I8,10F20.10)") conf_nr, dip(:)
     605          500 :       CALL close_file(unit_number=file_ptr)
     606          500 :    END SUBROUTINE write_dipoles_in_file
     607              : 
     608              :    !----------------------------------------------------------------------------
     609              :    ! read configuration from file
     610              :    !----------------------------------------------------------------------------
     611              : 
     612              : ! **************************************************************************************************
     613              : !> \brief read the trajectory element from a file from sub tree element
     614              : !> \param elem actual tree element to be printed out
     615              : !> \param tmc_ana TMC analysis environment parameters
     616              : !> \param conf_nr Markov chain element number
     617              : !>        (input the old number and read only if conf nr from file is greater
     618              : !> \param stat ...
     619              : !> \author Mandes 03.2013
     620              : ! **************************************************************************************************
     621         2098 :    SUBROUTINE read_element_from_file(elem, tmc_ana, conf_nr, stat)
     622              :       TYPE(tree_type), POINTER                           :: elem
     623              :       TYPE(tmc_analysis_env), POINTER                    :: tmc_ana
     624              :       INTEGER                                            :: conf_nr, stat
     625              : 
     626              :       CHARACTER(LEN=*), PARAMETER :: routineN = 'read_element_from_file'
     627              : 
     628              :       INTEGER                                            :: conf_nr_old, handle, i_tmp
     629              :       LOGICAL                                            :: files_conf_missmatch
     630              : 
     631         1049 :       stat = TMC_STATUS_OK
     632         1049 :       conf_nr_old = conf_nr
     633         1049 :       files_conf_missmatch = .FALSE.
     634              : 
     635         1049 :       CPASSERT(ASSOCIATED(elem))
     636         1049 :       CPASSERT(ASSOCIATED(tmc_ana))
     637         1049 :       CPASSERT(ASSOCIATED(tmc_ana%atoms))
     638              : 
     639              :       ! start the timing
     640         1049 :       CALL timeset(routineN, handle)
     641              : 
     642              :       ! read the coordinates
     643         1049 :       IF (tmc_ana%id_traj > 0) THEN
     644         1049 :          i_tmp = conf_nr_old
     645              :          CALL read_pos_from_file(elem=elem, tmc_ana=tmc_ana, stat=stat, &
     646         1049 :                                  conf_nr=i_tmp)
     647         1049 :          IF (stat == TMC_STATUS_WAIT_FOR_NEW_TASK) THEN
     648              :             CALL cp_warn(__LOCATION__, &
     649              :                          'end of position file reached at line '// &
     650              :                          cp_to_string(REAL(tmc_ana%lc_traj, KIND=dp))//", last element "// &
     651           18 :                          cp_to_string(tmc_ana%last_elem%nr))
     652              :          ELSE
     653         1031 :             CPASSERT(i_tmp > conf_nr_old)
     654         1031 :             conf_nr = i_tmp
     655         1031 :             elem%nr = i_tmp
     656              :          END IF
     657              :       END IF
     658              : 
     659              :       ! read the forces
     660              :       ! TODO if necessary
     661              : 
     662              :       ! read the dipoles file
     663         1049 :       IF (tmc_ana%id_dip > 0 .AND. stat == TMC_STATUS_OK) THEN
     664            0 :          i_tmp = conf_nr_old
     665              :          search_conf_dip: DO
     666              :             CALL read_dipole_from_file(elem=elem, tmc_ana=tmc_ana, stat=stat, &
     667            0 :                                        conf_nr=i_tmp)
     668            0 :             IF (stat == TMC_STATUS_WAIT_FOR_NEW_TASK) THEN
     669              :                CALL cp_warn(__LOCATION__, &
     670              :                             'end of dipole file reached at line'// &
     671            0 :                             cp_to_string(REAL(tmc_ana%lc_dip, KIND=dp)))
     672            0 :                EXIT search_conf_dip
     673              :             END IF
     674              :             ! check consitence with pos file
     675            0 :             IF (tmc_ana%id_traj > 0) THEN
     676            0 :                IF (i_tmp == conf_nr) THEN
     677              :                   files_conf_missmatch = .FALSE.
     678              :                   EXIT search_conf_dip
     679              :                ELSE
     680              :                   ! the configuration numbering differ from the position file,
     681              :                   !  but we keep on searching for the correct configuration
     682              :                   files_conf_missmatch = .TRUE.
     683              :                END IF
     684              :                ! if no pos file, just take the next conf
     685            0 :             ELSE IF (i_tmp > conf_nr_old) THEN
     686            0 :                conf_nr = i_tmp
     687            0 :                elem%nr = i_tmp
     688            0 :                EXIT search_conf_dip
     689              :             END IF
     690              :          END DO search_conf_dip
     691              :       END IF
     692              : 
     693              :       ! read the cell file
     694         1049 :       IF (tmc_ana%id_cell > 0 .AND. stat == TMC_STATUS_OK) THEN
     695              :          search_conf_cell: DO
     696              :             CALL read_cell_from_file(elem=elem, tmc_ana=tmc_ana, stat=stat, &
     697         1206 :                                      conf_nr=i_tmp)
     698         1206 :             IF (stat == TMC_STATUS_WAIT_FOR_NEW_TASK) THEN
     699              :                CALL cp_warn(__LOCATION__, &
     700              :                             'end of cell file reached at line at line'// &
     701            0 :                             cp_to_string(REAL(tmc_ana%lc_cell, KIND=dp)))
     702            0 :                EXIT search_conf_cell
     703              :             END IF
     704              :             ! check consitence with pos file
     705         1206 :             IF (tmc_ana%id_traj > 0) THEN
     706         1206 :                IF (i_tmp == conf_nr) THEN
     707              :                   files_conf_missmatch = .FALSE.
     708              :                   EXIT search_conf_cell
     709              :                ELSE
     710              :                   ! the configuration numbering differ from the position file,
     711              :                   !  but we keep on searching for the correct configuration
     712              :                   files_conf_missmatch = .TRUE.
     713              :                END IF
     714              :                ! if no pos file, just take the next conf
     715            0 :             ELSE IF (i_tmp > conf_nr_old) THEN
     716            0 :                conf_nr = i_tmp
     717            0 :                elem%nr = i_tmp
     718            0 :                EXIT search_conf_cell
     719              :             END IF
     720              :          END DO search_conf_cell
     721              : 
     722              :       END IF
     723              : 
     724              :       ! write the different energies
     725              :       ! TODO if necessary
     726              : 
     727         1049 :       IF (files_conf_missmatch) THEN
     728              :          CALL cp_warn(__LOCATION__, &
     729              :                       'there is a missmatch in the configuration numbering. '// &
     730              :                       "Read number of lines (pos|cell|dip)"// &
     731              :                       cp_to_string(tmc_ana%lc_traj)//"|"// &
     732              :                       cp_to_string(tmc_ana%lc_cell)//"|"// &
     733            0 :                       cp_to_string(tmc_ana%lc_dip))
     734              :       END IF
     735              : 
     736              :       ! end the timing
     737         1049 :       CALL timestop(handle)
     738         1049 :    END SUBROUTINE read_element_from_file
     739              : 
     740              : ! **************************************************************************************************
     741              : !> \brief search for the next configurational position in file
     742              : !> \param elem actual tree element to be read
     743              : !> \param tmc_ana ...
     744              : !> \param stat ...
     745              : !> \param conf_nr Markov chain element number
     746              : !>        (input the old number and read only if conf nr from file is greater
     747              : !> \param header_info ...
     748              : !> \author Mandes 03.2013
     749              : ! **************************************************************************************************
     750         2098 :    SUBROUTINE read_pos_from_file(elem, tmc_ana, stat, conf_nr, header_info)
     751              :       TYPE(tree_type), POINTER                           :: elem
     752              :       TYPE(tmc_analysis_env), POINTER                    :: tmc_ana
     753              :       INTEGER                                            :: stat, conf_nr
     754              :       CHARACTER(LEN=*), OPTIONAL                         :: header_info
     755              : 
     756              :       CHARACTER(LEN=*), PARAMETER :: routineN = 'read_pos_from_file'
     757              : 
     758              :       CHARACTER(LEN=default_string_length)               :: c_tmp
     759              :       INTEGER                                            :: handle, i, i_tmp, status
     760              : 
     761         1049 :       stat = TMC_STATUS_FAILED
     762              : 
     763            0 :       CPASSERT(ASSOCIATED(elem))
     764         1049 :       CPASSERT(ASSOCIATED(elem%pos))
     765         1049 :       CPASSERT(ASSOCIATED(tmc_ana))
     766         1049 :       CPASSERT(tmc_ana%id_traj > 0)
     767              : 
     768              :       ! start the timing
     769         1049 :       CALL timeset(routineN, handle)
     770              : 
     771              :       search_next_conf: DO
     772         6105 :          c_tmp(:) = " "
     773         6105 :          tmc_ana%lc_traj = tmc_ana%lc_traj + 1
     774         6105 :          READ (tmc_ana%id_traj, '(A)', IOSTAT=status) c_tmp(:)
     775         6105 :          IF (status > 0) THEN
     776              :             CALL cp_abort(__LOCATION__, &
     777              :                           "configuration header read error at line: "// &
     778            0 :                           cp_to_string(tmc_ana%lc_traj)//": "//c_tmp)
     779              :          END IF
     780         6105 :          IF (status < 0) THEN ! end of file reached
     781           18 :             stat = TMC_STATUS_WAIT_FOR_NEW_TASK
     782           18 :             EXIT search_next_conf
     783              :          END IF
     784         6087 :          IF (INDEX(c_tmp, "=") > 0) THEN
     785         1206 :             READ (c_tmp(INDEX(c_tmp, "=") + 1:), *, IOSTAT=status) i_tmp ! read the configuration number
     786         1206 :             IF (status /= 0) THEN
     787              :                CALL cp_abort(__LOCATION__, &
     788              :                              "configuration header read error (for conf nr) at line: "// &
     789            0 :                              cp_to_string(tmc_ana%lc_traj))
     790              :             END IF
     791         1206 :             IF (i_tmp > conf_nr) THEN
     792              :                ! TODO we could also read the energy ...
     793         1031 :                conf_nr = i_tmp
     794         1031 :                IF (PRESENT(header_info)) header_info = c_tmp
     795         1031 :                stat = TMC_STATUS_OK
     796         1031 :                EXIT search_next_conf
     797              :             END IF
     798              :          END IF
     799              :       END DO search_next_conf
     800              : 
     801         1049 :       IF (stat == TMC_STATUS_OK) THEN
     802        22682 :          pos_loop: DO i = 1, SIZE(elem%pos), tmc_ana%dim_per_elem
     803        21651 :             tmc_ana%lc_traj = tmc_ana%lc_traj + 1
     804              :             READ (tmc_ana%id_traj, FMT="(A4,1X,1000F20.10)", IOSTAT=status) &
     805        86604 :                c_tmp, elem%pos(i:i + tmc_ana%dim_per_elem - 1)
     806        22682 :             IF (status /= 0) THEN
     807              :                CALL cp_abort(__LOCATION__, &
     808              :                              "configuration pos read error at line: "// &
     809            0 :                              cp_to_string(tmc_ana%lc_traj))
     810              :             END IF
     811              :          END DO pos_loop
     812        65984 :          elem%pos(:) = elem%pos(:)/au2a
     813              :       END IF
     814              : 
     815              :       ! end the timing
     816         1049 :       CALL timestop(handle)
     817         1049 :    END SUBROUTINE read_pos_from_file
     818              : 
     819              : ! **************************************************************************************************
     820              : !> \brief search for the dipole entry
     821              : !> \param elem actual tree element to be read
     822              : !> \param tmc_ana ...
     823              : !> \param stat ...
     824              : !> \param conf_nr Markov chain element number
     825              : !>        (input the old number and read only if conf nr from file is greater
     826              : !> \author Mandes 03.2013
     827              : ! **************************************************************************************************
     828            0 :    SUBROUTINE read_dipole_from_file(elem, tmc_ana, stat, conf_nr)
     829              :       TYPE(tree_type), POINTER                           :: elem
     830              :       TYPE(tmc_analysis_env), POINTER                    :: tmc_ana
     831              :       INTEGER                                            :: stat, conf_nr
     832              : 
     833              :       CHARACTER(LEN=*), PARAMETER :: routineN = 'read_dipole_from_file'
     834              : 
     835              :       CHARACTER(LEN=250)                                 :: c_tmp
     836              :       INTEGER                                            :: handle, status
     837              : 
     838            0 :       stat = TMC_STATUS_FAILED
     839              : 
     840            0 :       CPASSERT(ASSOCIATED(elem))
     841            0 :       CPASSERT(ASSOCIATED(elem%dipole))
     842            0 :       CPASSERT(ASSOCIATED(tmc_ana))
     843            0 :       CPASSERT(tmc_ana%id_dip > 0)
     844              : 
     845              :       ! start the timing
     846            0 :       CALL timeset(routineN, handle)
     847            0 :       tmc_ana%lc_dip = tmc_ana%lc_dip + 1
     848            0 :       READ (tmc_ana%id_dip, FMT="(A)", IOSTAT=status) c_tmp
     849            0 :       IF (status == 0) THEN
     850              :          ! skip the initial line (header)
     851            0 :          IF (INDEX(c_tmp, "#") > 0) THEN
     852            0 :             tmc_ana%lc_dip = tmc_ana%lc_dip + 1
     853            0 :             READ (tmc_ana%id_dip, FMT="(A)", IOSTAT=status) c_tmp
     854              :          END IF
     855              :       END IF
     856            0 :       IF (status == 0) THEN
     857              :          READ (c_tmp, FMT="(I8,10F20.10)", IOSTAT=status) &
     858            0 :             conf_nr, elem%dipole(:)
     859              :       END IF
     860            0 :       IF (status == 0) THEN ! success
     861            0 :          stat = TMC_STATUS_OK
     862            0 :       ELSE IF (status < 0) THEN ! end of file reached
     863            0 :          stat = TMC_STATUS_WAIT_FOR_NEW_TASK
     864              :       ELSE
     865              :          IF (status /= 0) THEN
     866            0 :             CPWARN("configuration dipole read error at line: "//cp_to_string(tmc_ana%lc_dip))
     867              :          END IF
     868            0 :          stat = TMC_STATUS_FAILED
     869              :       END IF
     870              : 
     871              :       ! end the timing
     872            0 :       CALL timestop(handle)
     873            0 :    END SUBROUTINE read_dipole_from_file
     874              : 
     875              : ! **************************************************************************************************
     876              : !> \brief search for the cell entry
     877              : !> \param elem actual tree element to be read
     878              : !> \param tmc_ana ...
     879              : !> \param stat ...
     880              : !> \param conf_nr Markov chain element number
     881              : !>        (input the old number and read only if conf nr from file is greater
     882              : !> \author Mandes 03.2013
     883              : ! **************************************************************************************************
     884         2412 :    SUBROUTINE read_cell_from_file(elem, tmc_ana, stat, conf_nr)
     885              :       TYPE(tree_type), POINTER                           :: elem
     886              :       TYPE(tmc_analysis_env), POINTER                    :: tmc_ana
     887              :       INTEGER                                            :: stat, conf_nr
     888              : 
     889              :       CHARACTER(LEN=*), PARAMETER :: routineN = 'read_cell_from_file'
     890              : 
     891              :       CHARACTER(LEN=250)                                 :: c_tmp
     892              :       INTEGER                                            :: handle, status
     893              :       REAL(KIND=dp)                                      :: r_tmp
     894              :       REAL(KIND=dp), DIMENSION(3, 3)                     :: hmat
     895              : 
     896         1206 :       stat = TMC_STATUS_FAILED
     897              : 
     898         1206 :       CPASSERT(ASSOCIATED(elem))
     899         1206 :       CPASSERT(ASSOCIATED(tmc_ana))
     900         1206 :       CPASSERT(ASSOCIATED(tmc_ana%cell))
     901         1206 :       CPASSERT(tmc_ana%id_cell > 0)
     902              : 
     903              :       ! start the timing
     904         1206 :       CALL timeset(routineN, handle)
     905              : 
     906         1206 :       tmc_ana%lc_cell = tmc_ana%lc_cell + 1
     907         1206 :       READ (tmc_ana%id_cell, FMT="(A)", IOSTAT=status) c_tmp
     908         1206 :       IF (status == 0) THEN
     909              :          ! skip the initial line (header)
     910         1206 :          IF (INDEX(c_tmp, "#") > 0) THEN
     911           18 :             tmc_ana%lc_cell = tmc_ana%lc_cell + 1
     912           18 :             READ (tmc_ana%id_cell, FMT="(A)", IOSTAT=status) c_tmp
     913              :          END IF
     914              :       END IF
     915         1206 :       IF (status == 0) THEN
     916         1206 :          READ (c_tmp, FMT="(I8,9(1X,F19.10),1X,F24.10)", IOSTAT=status) conf_nr, &
     917         2412 :             hmat(:, :), r_tmp
     918              :       END IF
     919         1206 :       IF (status < 0) THEN ! end of file reached
     920            0 :          stat = TMC_STATUS_WAIT_FOR_NEW_TASK
     921         1206 :       ELSE IF (status > 0) THEN
     922              :          IF (status /= 0) THEN
     923            0 :             CPABORT("configuration cell read error at line: "//cp_to_string(tmc_ana%lc_cell))
     924              :          END IF
     925            0 :          stat = TMC_STATUS_FAILED
     926              :       ELSE
     927         1206 :          IF (elem%nr < 0) elem%nr = conf_nr
     928        15678 :          hmat(:, :) = hmat(:, :)/au2a
     929              :          ! get the box scaling
     930              :          CALL get_cell_scaling(cell=tmc_ana%cell, scaled_hmat=hmat, &
     931         1206 :                                box_scale=elem%box_scale)
     932         1206 :          stat = TMC_STATUS_OK
     933              :       END IF
     934              :       ! end the timing
     935         1206 :       CALL timestop(handle)
     936         1206 :    END SUBROUTINE read_cell_from_file
     937              : 
     938              :    !----------------------------------------------------------------------------
     939              :    ! get the configurations from file and calc
     940              :    !----------------------------------------------------------------------------
     941              : 
     942              : ! **************************************************************************************************
     943              : !> \brief opens the files for reading configurations data to analyze
     944              : !> \param tmc_ana ...
     945              : !> \param stat ...
     946              : !> \param dir_ind ...
     947              : !> \param
     948              : !> \author Mandes 02.2013
     949              : ! **************************************************************************************************
     950           36 :    SUBROUTINE analyse_files_open(tmc_ana, stat, dir_ind)
     951              :       TYPE(tmc_analysis_env), POINTER                    :: tmc_ana
     952              :       INTEGER                                            :: stat
     953              :       INTEGER, OPTIONAL                                  :: dir_ind
     954              : 
     955              :       CHARACTER(LEN=*), PARAMETER :: routineN = 'analyse_files_open'
     956              : 
     957              :       CHARACTER(LEN=default_path_length)                 :: dir_name, file_name_act, file_name_temp
     958              :       INTEGER                                            :: handle
     959              :       LOGICAL                                            :: file_exists
     960              : 
     961           18 :       CPASSERT(ASSOCIATED(tmc_ana))
     962              : 
     963           18 :       stat = TMC_STATUS_WAIT_FOR_NEW_TASK
     964              : 
     965              :       ! start the timing
     966           18 :       CALL timeset(routineN, handle)
     967              : 
     968           18 :       IF (PRESENT(dir_ind)) THEN
     969           18 :          CPASSERT(ASSOCIATED(tmc_ana%dirs))
     970           18 :          CPASSERT(dir_ind > 0)
     971           18 :          CPASSERT(dir_ind <= SIZE(tmc_ana%dirs))
     972              : 
     973           18 :          IF (INDEX(tmc_ana%dirs(dir_ind), "/", BACK=.TRUE.) == &
     974              :              LEN_TRIM(tmc_ana%dirs(dir_ind))) THEN
     975           18 :             dir_name = TRIM(tmc_ana%dirs(dir_ind))
     976              :          ELSE
     977            0 :             dir_name = TRIM(tmc_ana%dirs(dir_ind))//"/"
     978              :          END IF
     979              :       ELSE
     980            0 :          dir_name = "./"
     981              :       END IF
     982              : 
     983              :       ! open the files
     984              :       file_name_temp = expand_file_name_temp( &
     985              :                        file_name=tmc_default_trajectory_file_name, &
     986           18 :                        rvalue=tmc_ana%temperature)
     987              :       ! position file
     988           18 :       IF (tmc_ana%costum_pos_file_name /= "") THEN
     989            0 :          file_name_act = TRIM(dir_name)//tmc_ana%costum_pos_file_name
     990              :       ELSE
     991              :          file_name_act = TRIM(dir_name)// &
     992           18 :                          expand_file_name_ending(file_name_temp, "xyz")
     993              :       END IF
     994           18 :       INQUIRE (FILE=file_name_act, EXIST=file_exists)
     995           18 :       IF (file_exists) THEN
     996              :          CALL open_file(file_name=file_name_act, file_status="OLD", &
     997           18 :                         file_action="READ", unit_number=tmc_ana%id_traj)
     998           18 :          WRITE (tmc_ana%io_unit, FMT='(T2,A,"| ",A,T41,A40)') "TMC_ANA", &
     999           36 :             "read xyz file", TRIM(file_name_act)
    1000              :       END IF
    1001              : 
    1002              :       ! cell file
    1003           18 :       IF (tmc_ana%costum_cell_file_name /= "") THEN
    1004            0 :          file_name_act = TRIM(dir_name)//tmc_ana%costum_cell_file_name
    1005              :       ELSE
    1006              :          file_name_act = TRIM(dir_name)// &
    1007           18 :                          expand_file_name_ending(file_name_temp, "cell")
    1008              :       END IF
    1009           18 :       INQUIRE (FILE=file_name_act, EXIST=file_exists)
    1010           18 :       IF (file_exists) THEN
    1011              :          CALL open_file(file_name=file_name_act, file_status="OLD", &
    1012           18 :                         file_action="READ", unit_number=tmc_ana%id_cell)
    1013           18 :          WRITE (tmc_ana%io_unit, FMT='(T2,A,"| ",A,T41,A40)') "TMC_ANA", &
    1014           36 :             "read cell file", TRIM(file_name_act)
    1015              :       END IF
    1016              : 
    1017              :       ! dipole file
    1018           18 :       IF (tmc_ana%costum_dip_file_name /= "") THEN
    1019           18 :          file_name_act = TRIM(dir_name)//tmc_ana%costum_dip_file_name
    1020              :       ELSE
    1021              :          file_name_act = TRIM(dir_name)// &
    1022            0 :                          expand_file_name_ending(file_name_temp, "dip")
    1023              :       END IF
    1024           18 :       INQUIRE (FILE=file_name_act, EXIST=file_exists)
    1025           18 :       IF (file_exists) THEN
    1026              :          CALL open_file(file_name=file_name_act, file_status="OLD", &
    1027            0 :                         file_action="READ", unit_number=tmc_ana%id_dip)
    1028            0 :          WRITE (tmc_ana%io_unit, FMT='(T2,A,"| ",A,T41,A40)') "TMC_ANA", &
    1029            0 :             "read dip file", TRIM(file_name_act)
    1030              :       END IF
    1031              : 
    1032           18 :       IF (tmc_ana%id_traj > 0 .OR. tmc_ana%id_cell > 0 .OR. &
    1033              :           tmc_ana%id_dip > 0) THEN
    1034           18 :          stat = TMC_STATUS_OK
    1035              :       ELSE
    1036              :          CALL cp_warn(__LOCATION__, &
    1037              :                       "There is no file to open for temperature "//cp_to_string(tmc_ana%temperature)// &
    1038            0 :                       "K in directory "//TRIM(dir_name))
    1039              :       END IF
    1040              :       ! end the timing
    1041           18 :       CALL timestop(handle)
    1042           18 :    END SUBROUTINE analyse_files_open
    1043              : 
    1044              : ! **************************************************************************************************
    1045              : !> \brief close the files for reading configurations data to analyze
    1046              : !> \param tmc_ana ...
    1047              : !> \param
    1048              : !> \author Mandes 02.2013
    1049              : ! **************************************************************************************************
    1050           36 :    SUBROUTINE analyse_files_close(tmc_ana)
    1051              :       TYPE(tmc_analysis_env), POINTER                    :: tmc_ana
    1052              : 
    1053              :       CHARACTER(LEN=*), PARAMETER :: routineN = 'analyse_files_close'
    1054              : 
    1055              :       INTEGER                                            :: handle
    1056              : 
    1057           18 :       CPASSERT(ASSOCIATED(tmc_ana))
    1058              : 
    1059              :       ! start the timing
    1060           18 :       CALL timeset(routineN, handle)
    1061              : 
    1062              :       ! position file
    1063           18 :       IF (tmc_ana%id_traj > 0) CALL close_file(unit_number=tmc_ana%id_traj)
    1064              : 
    1065              :       ! cell file
    1066           18 :       IF (tmc_ana%id_cell > 0) CALL close_file(unit_number=tmc_ana%id_cell)
    1067              : 
    1068              :       ! dipole file
    1069           18 :       IF (tmc_ana%id_dip > 0) CALL close_file(unit_number=tmc_ana%id_dip)
    1070              : 
    1071              :       ! end the timing
    1072           18 :       CALL timestop(handle)
    1073           18 :    END SUBROUTINE analyse_files_close
    1074              : 
    1075              : END MODULE tmc_file_io
        

Generated by: LCOV version 2.0-1