Line data Source code
1 : !--------------------------------------------------------------------------------------------------!
2 : ! CP2K: A general program to perform molecular dynamics simulations !
3 : ! Copyright 2000-2024 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 .NE. "")
81 :
82 2615 : ind = INDEX(file_name, ".", BACK=.TRUE.)
83 2615 : IF (.NOT. ind .EQ. 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 .NE. "")
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 .NE. "")
108 :
109 1427 : ind = INDEX(file_name, ".", BACK=.TRUE.)
110 1427 : IF (.NOT. ind .EQ. 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 .NE. "")
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 .NE. "")
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 .EQ. 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) .EQ. 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 .NE. "")
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 .NE. "")
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 .EQ. 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) .EQ. 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 .NE. "")
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 3 : WRITE (f_unit) tmc_env%params%Temp(:), &
230 3 : tmc_env%m_env%gt_act%nr, &
231 3 : 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 3 : tmc_env%m_env%result_count(0:), &
237 3 : tmc_env%params%move_types%mv_weight, &
238 3 : tmc_env%params%move_types%acc_count, &
239 3 : tmc_env%params%move_types%mv_count, &
240 3 : tmc_env%params%move_types%subbox_acc_count, &
241 3 : tmc_env%params%move_types%subbox_count, &
242 3 : 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 .EQ. 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 .NE. SIZE(tmc_env%params%Temp)) &
305 : CALL cp_abort(__LOCATION__, &
306 : "the actual specified temperatures does not "// &
307 0 : "fit in amount with the one from restart file ")
308 6 : ALLOCATE (tmp_temp(temp_size))
309 2 : READ (file_ptr) tmp_temp(:), &
310 2 : tmc_env%m_env%gt_act%nr, &
311 2 : tmc_env%m_env%gt_act%rng_seed, &
312 2 : tmc_env%m_env%gt_act%rnd_nr, &
313 2 : tmc_env%m_env%gt_act%prob_acc, &
314 2 : tmc_env%m_env%gt_act%mv_conf, & !
315 2 : tmc_env%m_env%gt_act%mv_next_conf, & !
316 2 : tmc_env%m_env%result_count(0:), &
317 2 : mv_weight_tmp, & !
318 2 : tmc_env%params%move_types%acc_count, &
319 2 : tmc_env%params%move_types%mv_count, &
320 2 : tmc_env%params%move_types%subbox_acc_count, &
321 2 : tmc_env%params%move_types%subbox_count, & !
322 2 : tmc_env%params%cell%hmat, &
323 2 : job_counts, &
324 4 : timings
325 :
326 8 : IF (ANY(ABS(tmc_env%params%Temp(:) - tmp_temp(:)) .GE. 0.005)) &
327 : CALL cp_abort(__LOCATION__, "the temperatures differ from the previous calculation. "// &
328 0 : "There were the following temperatures used:")
329 22 : IF (ANY(mv_weight_tmp(:) .NE. tmc_env%params%move_types%mv_weight(:))) THEN
330 0 : CPWARN("The amount of mv types differs between the original and the restart run.")
331 : END IF
332 :
333 8 : DO i = 1, SIZE(tmc_env%params%Temp)
334 6 : tmc_env%m_env%gt_act%conf(i)%elem => tmc_env%m_env%result_list(i)%elem
335 6 : READ (file_ptr) tmc_env%m_env%result_list(i)%elem%nr, &
336 168 : tmc_env%m_env%result_list(i)%elem%rng_seed, &
337 384 : tmc_env%m_env%result_list(i)%elem%pos, &
338 384 : tmc_env%m_env%result_list(i)%elem%vel, &
339 24 : tmc_env%m_env%result_list(i)%elem%box_scale, &
340 6 : tmc_env%m_env%result_list(i)%elem%potential, &
341 6 : tmc_env%m_env%result_list(i)%elem%e_pot_approx, &
342 6 : tmc_env%m_env%result_list(i)%elem%ekin, &
343 6 : tmc_env%m_env%result_list(i)%elem%ekin_before_md, &
344 14 : tmc_env%m_env%result_list(i)%elem%temp_created
345 : END DO
346 2 : CALL close_file(unit_number=file_ptr)
347 2 : END SUBROUTINE read_restart_file
348 :
349 : !----------------------------------------------------------------------------
350 : ! printing configuration in file
351 : !----------------------------------------------------------------------------
352 :
353 : ! **************************************************************************************************
354 : !> \brief select the correct configuration to print out the
355 : !> (coordinates, forces, cell ...)
356 : !> \param result_list list of configurations for each temperature
357 : !> \param result_count list with number of Markov Chain number
358 : !> for each teperature (index 0 for global tree)
359 : !> \param conf_updated index of the updated (modified element)
360 : !> \param accepted acceptance flag
361 : !> \param tmc_params TMC environment parameters
362 : !> \author Mandes 02.2013
363 : ! **************************************************************************************************
364 9350 : SUBROUTINE write_result_list_element(result_list, result_count, conf_updated, &
365 : accepted, tmc_params)
366 : TYPE(elem_array_type), DIMENSION(:), POINTER :: result_list
367 : INTEGER, DIMENSION(:), POINTER :: result_count
368 : INTEGER :: conf_updated
369 : LOGICAL, INTENT(IN) :: accepted
370 : TYPE(tmc_param_type), POINTER :: tmc_params
371 :
372 : CHARACTER(LEN=*), PARAMETER :: routineN = 'write_result_list_element'
373 :
374 : CHARACTER(LEN=default_path_length) :: file_name
375 : INTEGER :: handle, i
376 :
377 4675 : file_name = ""
378 :
379 4675 : CPASSERT(ASSOCIATED(result_list))
380 4675 : CPASSERT(ASSOCIATED(result_count))
381 4675 : CPASSERT(ASSOCIATED(tmc_params))
382 4675 : CPASSERT(ASSOCIATED(tmc_params%Temp))
383 4675 : CPASSERT(conf_updated .GE. 0)
384 4675 : CPASSERT(conf_updated .LE. SIZE(tmc_params%Temp))
385 :
386 : ! start the timing
387 4675 : CALL timeset(routineN, handle)
388 :
389 4675 : IF (conf_updated .EQ. 0) THEN
390 : ! for debugging print every configuration of every temperature
391 0 : DO i = 1, SIZE(tmc_params%Temp)
392 0 : WRITE (file_name, *) "every_step_", TRIM(tmc_default_trajectory_file_name)
393 : CALL write_element_in_file(elem=result_list(i)%elem, &
394 : tmc_params=tmc_params, conf_nr=result_count(0), &
395 0 : file_name=expand_file_name_temp(file_name=file_name, rvalue=tmc_params%Temp(i)))
396 : END DO
397 : ELSE
398 4675 : IF ((.NOT. tmc_params%print_only_diff_conf) .OR. &
399 : (tmc_params%print_only_diff_conf .AND. accepted)) THEN
400 : CALL write_element_in_file(elem=result_list(conf_updated)%elem, &
401 : tmc_params=tmc_params, conf_nr=result_count(conf_updated), &
402 : file_name=expand_file_name_temp(file_name=TRIM(tmc_default_trajectory_file_name), &
403 1025 : rvalue=tmc_params%Temp(conf_updated)))
404 : END IF
405 : END IF
406 : ! end the timing
407 4675 : CALL timestop(handle)
408 4675 : END SUBROUTINE write_result_list_element
409 :
410 : ! **************************************************************************************************
411 : !> \brief writes the trajectory element in a file from sub tree element
412 : !> \param elem actual tree element to be printed out
413 : !> \param tmc_params TMC environment parameters
414 : !> \param temp_index ...
415 : !> \param file_name file name will be extended by type of file (pos, cell,...)
416 : !> \param conf_nr Markov chain element number
417 : !> \param conf_info whole header line
418 : !> \author Mandes 11.2012
419 : ! **************************************************************************************************
420 1025 : SUBROUTINE write_element_in_file(elem, tmc_params, temp_index, file_name, conf_nr, &
421 : conf_info)
422 : TYPE(tree_type), POINTER :: elem
423 : TYPE(tmc_param_type), POINTER :: tmc_params
424 : INTEGER, OPTIONAL :: temp_index
425 : CHARACTER(LEN=*), OPTIONAL :: file_name
426 : INTEGER, OPTIONAL :: conf_nr
427 : CHARACTER(LEN=*), OPTIONAL :: conf_info
428 :
429 : CHARACTER(LEN=*), PARAMETER :: routineN = 'write_element_in_file'
430 :
431 : CHARACTER(LEN=default_path_length) :: file_name_act, tmp_name
432 : CHARACTER(LEN=default_string_length) :: header
433 : INTEGER :: file_ptr, handle, i, nr_atoms
434 : LOGICAL :: file_exists, print_it
435 : REAL(KIND=dp) :: vol
436 : REAL(KIND=dp), DIMENSION(3, 3) :: hmat_scaled
437 :
438 1025 : file_name_act = ""
439 1025 : tmp_name = ""
440 1025 : header = ""
441 1025 : print_it = .TRUE.
442 :
443 0 : CPASSERT(ASSOCIATED(elem))
444 1025 : CPASSERT(ASSOCIATED(tmc_params))
445 1025 : CPASSERT(ASSOCIATED(tmc_params%atoms))
446 1025 : CPASSERT(PRESENT(conf_nr) .OR. PRESENT(conf_info))
447 :
448 1025 : IF (print_it) THEN
449 : ! start the timing
450 1025 : CALL timeset(routineN, handle)
451 :
452 : ! set default file name
453 1025 : IF (PRESENT(file_name)) THEN
454 1025 : CPASSERT(file_name .NE. "")
455 1025 : file_name_act = file_name
456 : ELSE
457 0 : CPASSERT(ASSOCIATED(tmc_params%Temp))
458 0 : CPASSERT(PRESENT(temp_index))
459 : file_name_act = expand_file_name_temp(file_name=tmc_default_trajectory_file_name, &
460 0 : rvalue=tmc_params%Temp(temp_index))
461 : END IF
462 :
463 1025 : nr_atoms = SIZE(elem%pos)/tmc_params%dim_per_elem
464 :
465 : ! set header (for coordinate or force file)
466 1025 : IF (tmc_params%print_trajectory .OR. tmc_params%print_forces) THEN
467 1025 : IF (PRESENT(conf_info)) THEN
468 0 : WRITE (header, *) TRIM(ADJUSTL(conf_info))
469 : ELSE
470 : !WRITE(header,FMT="(A,I8,A,F20.10)") " i = ", conf_nr,", E = ", elem%potential
471 1025 : WRITE (header, FMT="(A,I8,A,F20.10,F20.10,A,I8,I8)") "i =", conf_nr, " ,E =", &
472 2050 : elem%potential, elem%ekin, " st elem", elem%sub_tree_nr, elem%nr
473 : END IF
474 : END IF
475 :
476 : ! write the coordinates
477 1025 : IF (tmc_params%print_trajectory) THEN
478 1025 : tmp_name = expand_file_name_ending(file_name_act, "xyz")
479 : CALL open_file(file_name=tmp_name, file_status="UNKNOWN", &
480 : file_action="WRITE", file_position="APPEND", &
481 1025 : unit_number=file_ptr)
482 1025 : WRITE (file_ptr, FMT="(I8)") nr_atoms
483 1025 : WRITE (file_ptr, *) TRIM(header)
484 44797 : DO i = 1, SIZE(elem%pos), tmc_params%dim_per_elem
485 : WRITE (file_ptr, FMT="(A4,1X,1000F20.10)") &
486 43772 : TRIM(tmc_params%atoms((i - 1)/tmc_params%dim_per_elem + 1)%name), &
487 219885 : elem%pos(i:i + tmc_params%dim_per_elem - 1)*au2a
488 : END DO
489 1025 : CALL close_file(unit_number=file_ptr)
490 : END IF
491 :
492 : ! write the forces
493 1025 : IF (tmc_params%print_forces) THEN
494 331 : tmp_name = expand_file_name_ending(file_name_act, "frc")
495 : CALL open_file(file_name=tmp_name, file_status="UNKNOWN", &
496 : file_action="WRITE", file_position="APPEND", &
497 331 : unit_number=file_ptr)
498 331 : WRITE (file_ptr, FMT="(I8)") nr_atoms
499 331 : WRITE (file_ptr, *) TRIM(header)
500 7282 : DO i = 1, SIZE(elem%pos), tmc_params%dim_per_elem
501 : WRITE (file_ptr, FMT="(A4,1X,1000F20.10)") &
502 6951 : TRIM(tmc_params%atoms((i - 1)/tmc_params%dim_per_elem + 1)%name), &
503 14233 : elem%frc(i:i + tmc_params%dim_per_elem - 1)
504 : END DO
505 331 : CALL close_file(unit_number=file_ptr)
506 : END IF
507 :
508 : ! write the cell dipoles
509 1025 : IF (tmc_params%print_dipole) THEN
510 : CALL write_dipoles_in_file(file_name=file_name_act, &
511 0 : conf_nr=conf_nr, dip=elem%dipole)
512 : END IF
513 :
514 : ! write the cell file
515 1025 : IF (tmc_params%print_cell) THEN
516 392 : tmp_name = expand_file_name_ending(file_name_act, "cell")
517 : ! header
518 392 : INQUIRE (FILE=tmp_name, EXIST=file_exists) ! file_exists will be TRUE if the file exist
519 392 : IF (.NOT. file_exists) THEN
520 : CALL open_file(file_name=tmp_name, file_status="NEW", &
521 6 : file_action="WRITE", unit_number=file_ptr)
522 : WRITE (file_ptr, FMT='(A,9(7X,A2," [Angstrom]"),6X,A)') &
523 6 : "# MC step ", "Ax", "Ay", "Az", "Bx", "By", "Bz", "Cx", "Cy", "Cz", &
524 12 : "Volume [Angstrom^3]"
525 : ELSE
526 : CALL open_file(file_name=tmp_name, file_status="OLD", &
527 : file_action="WRITE", file_position="APPEND", &
528 386 : unit_number=file_ptr)
529 : END IF
530 : CALL get_scaled_cell(cell=tmc_params%cell, &
531 : box_scale=elem%box_scale, scaled_hmat=hmat_scaled, &
532 392 : vol=vol)
533 392 : WRITE (file_ptr, FMT="(I8,9(1X,F19.10),1X,F24.10)") conf_nr, &
534 5488 : hmat_scaled(:, :)*au2a, vol*au2a**3
535 : !TODO better cell output e.g. using cell_types routine
536 392 : CALL close_file(unit_number=file_ptr)
537 : END IF
538 :
539 : ! write the different energies
540 1025 : IF (tmc_params%print_energies) THEN
541 331 : tmp_name = expand_file_name_ending(file_name_act, "ener")
542 : ! header
543 331 : INQUIRE (FILE=tmp_name, EXIST=file_exists) ! file_exists will be TRUE if the file exist
544 331 : IF (.NOT. file_exists) THEN
545 : CALL open_file(file_name=tmp_name, file_status="NEW", &
546 3 : file_action="WRITE", unit_number=file_ptr)
547 : WRITE (file_ptr, FMT='(A,4A20)') &
548 3 : "# MC step ", " exact ", " approx ", " last SCF ", " kinetic "
549 : ELSE
550 : CALL open_file(file_name=tmp_name, file_status="OLD", &
551 : file_action="WRITE", file_position="APPEND", &
552 328 : unit_number=file_ptr)
553 : END IF
554 331 : WRITE (file_ptr, FMT="(I8,14F20.10)") conf_nr, elem%potential, elem%e_pot_approx, &
555 662 : elem%scf_energies(MOD(elem%scf_energies_count, 4) + 1), elem%ekin
556 331 : CALL close_file(unit_number=file_ptr)
557 : END IF
558 :
559 : ! end the timing
560 1025 : CALL timestop(handle)
561 : END IF
562 1025 : END SUBROUTINE write_element_in_file
563 :
564 : ! **************************************************************************************************
565 : !> \brief writes the cell dipoles in dipole trajectory file
566 : !> \param file_name ...
567 : !> \param conf_nr ...
568 : !> \param dip ...
569 : !> \param file_ext ...
570 : !> \param
571 : !> \author Mandes 11.2012
572 : ! **************************************************************************************************
573 500 : SUBROUTINE write_dipoles_in_file(file_name, conf_nr, dip, file_ext)
574 : CHARACTER(LEN=default_path_length) :: file_name
575 : INTEGER :: conf_nr
576 : REAL(KIND=dp), DIMENSION(:), POINTER :: dip
577 : CHARACTER(LEN=*), INTENT(in), OPTIONAL :: file_ext
578 :
579 : CHARACTER(LEN=default_path_length) :: file_name_tmp
580 : INTEGER :: file_ptr
581 : LOGICAL :: file_exists
582 :
583 500 : CPASSERT(ASSOCIATED(dip))
584 :
585 500 : IF (PRESENT(file_ext)) THEN
586 500 : CPASSERT(file_ext .NE. "")
587 500 : file_name_tmp = expand_file_name_ending(file_name, TRIM(file_ext))
588 : ELSE
589 0 : file_name_tmp = expand_file_name_ending(file_name, "dip")
590 : END IF
591 500 : INQUIRE (FILE=file_name_tmp, EXIST=file_exists)
592 500 : IF (.NOT. file_exists) THEN
593 : CALL open_file(file_name=file_name_tmp, file_status="NEW", &
594 3 : file_action="WRITE", unit_number=file_ptr)
595 3 : WRITE (file_ptr, FMT='(A8,10A20)') "# conf_nr", "dip_x [C Angstrom]", &
596 6 : "dip_y [C Angstrom]", "dip_z [C Angstrom]"
597 : ELSE
598 : CALL open_file(file_name=file_name_tmp, file_status="OLD", &
599 : file_action="WRITE", file_position="APPEND", &
600 497 : unit_number=file_ptr)
601 : END IF
602 500 : WRITE (file_ptr, FMT="(I8,10F20.10)") conf_nr, dip(:)
603 500 : CALL close_file(unit_number=file_ptr)
604 500 : END SUBROUTINE write_dipoles_in_file
605 :
606 : !----------------------------------------------------------------------------
607 : ! read configuration from file
608 : !----------------------------------------------------------------------------
609 :
610 : ! **************************************************************************************************
611 : !> \brief read the trajectory element from a file from sub tree element
612 : !> \param elem actual tree element to be printed out
613 : !> \param tmc_ana TMC analysis environment parameters
614 : !> \param conf_nr Markov chain element number
615 : !> (input the old number and read only if conf nr from file is greater
616 : !> \param stat ...
617 : !> \author Mandes 03.2013
618 : ! **************************************************************************************************
619 2098 : SUBROUTINE read_element_from_file(elem, tmc_ana, conf_nr, stat)
620 : TYPE(tree_type), POINTER :: elem
621 : TYPE(tmc_analysis_env), POINTER :: tmc_ana
622 : INTEGER :: conf_nr, stat
623 :
624 : CHARACTER(LEN=*), PARAMETER :: routineN = 'read_element_from_file'
625 :
626 : INTEGER :: conf_nr_old, handle, i_tmp
627 : LOGICAL :: files_conf_missmatch
628 :
629 1049 : stat = TMC_STATUS_OK
630 1049 : conf_nr_old = conf_nr
631 1049 : files_conf_missmatch = .FALSE.
632 :
633 1049 : CPASSERT(ASSOCIATED(elem))
634 1049 : CPASSERT(ASSOCIATED(tmc_ana))
635 1049 : CPASSERT(ASSOCIATED(tmc_ana%atoms))
636 :
637 : ! start the timing
638 1049 : CALL timeset(routineN, handle)
639 :
640 : ! read the coordinates
641 1049 : IF (tmc_ana%id_traj .GT. 0) THEN
642 1049 : i_tmp = conf_nr_old
643 : CALL read_pos_from_file(elem=elem, tmc_ana=tmc_ana, stat=stat, &
644 1049 : conf_nr=i_tmp)
645 1049 : IF (stat .EQ. TMC_STATUS_WAIT_FOR_NEW_TASK) THEN
646 : CALL cp_warn(__LOCATION__, &
647 : 'end of position file reached at line '// &
648 : cp_to_string(REAL(tmc_ana%lc_traj, KIND=dp))//", last element "// &
649 18 : cp_to_string(tmc_ana%last_elem%nr))
650 : ELSE
651 1031 : CPASSERT(i_tmp .GT. conf_nr_old)
652 1031 : conf_nr = i_tmp
653 1031 : elem%nr = i_tmp
654 : END IF
655 : END IF
656 :
657 : ! read the forces
658 : ! TODO if necessary
659 :
660 : ! read the dipoles file
661 1049 : IF (tmc_ana%id_dip .GT. 0 .AND. stat .EQ. TMC_STATUS_OK) THEN
662 0 : i_tmp = conf_nr_old
663 : search_conf_dip: DO
664 : CALL read_dipole_from_file(elem=elem, tmc_ana=tmc_ana, stat=stat, &
665 0 : conf_nr=i_tmp)
666 0 : IF (stat .EQ. TMC_STATUS_WAIT_FOR_NEW_TASK) THEN
667 : CALL cp_warn(__LOCATION__, &
668 : 'end of dipole file reached at line'// &
669 0 : cp_to_string(REAL(tmc_ana%lc_dip, KIND=dp)))
670 0 : EXIT search_conf_dip
671 : END IF
672 : ! check consitence with pos file
673 0 : IF (tmc_ana%id_traj .GT. 0) THEN
674 0 : IF (i_tmp .EQ. conf_nr) THEN
675 : files_conf_missmatch = .FALSE.
676 : EXIT search_conf_dip
677 : ELSE
678 : ! the configuration numbering differ from the position file,
679 : ! but we keep on searching for the correct configuration
680 : files_conf_missmatch = .TRUE.
681 : END IF
682 : ! if no pos file, just take the next conf
683 0 : ELSE IF (i_tmp .GT. conf_nr_old) THEN
684 0 : conf_nr = i_tmp
685 0 : elem%nr = i_tmp
686 0 : EXIT search_conf_dip
687 : END IF
688 : END DO search_conf_dip
689 : END IF
690 :
691 : ! read the cell file
692 1049 : IF (tmc_ana%id_cell .GT. 0 .AND. stat .EQ. TMC_STATUS_OK) THEN
693 : search_conf_cell: DO
694 : CALL read_cell_from_file(elem=elem, tmc_ana=tmc_ana, stat=stat, &
695 1206 : conf_nr=i_tmp)
696 1206 : IF (stat .EQ. TMC_STATUS_WAIT_FOR_NEW_TASK) THEN
697 : CALL cp_warn(__LOCATION__, &
698 : 'end of cell file reached at line at line'// &
699 0 : cp_to_string(REAL(tmc_ana%lc_cell, KIND=dp)))
700 0 : EXIT search_conf_cell
701 : END IF
702 : ! check consitence with pos file
703 1206 : IF (tmc_ana%id_traj .GT. 0) THEN
704 1206 : IF (i_tmp .EQ. conf_nr) THEN
705 : files_conf_missmatch = .FALSE.
706 : EXIT search_conf_cell
707 : ELSE
708 : ! the configuration numbering differ from the position file,
709 : ! but we keep on searching for the correct configuration
710 : files_conf_missmatch = .TRUE.
711 : END IF
712 : ! if no pos file, just take the next conf
713 0 : ELSE IF (i_tmp .GT. conf_nr_old) THEN
714 0 : conf_nr = i_tmp
715 0 : elem%nr = i_tmp
716 0 : EXIT search_conf_cell
717 : END IF
718 : END DO search_conf_cell
719 :
720 : END IF
721 :
722 : ! write the different energies
723 : ! TODO if necessary
724 :
725 1049 : IF (files_conf_missmatch) &
726 : CALL cp_warn(__LOCATION__, &
727 : 'there is a missmatch in the configuration numbering. '// &
728 : "Read number of lines (pos|cell|dip)"// &
729 : cp_to_string(tmc_ana%lc_traj)//"|"// &
730 : cp_to_string(tmc_ana%lc_cell)//"|"// &
731 0 : cp_to_string(tmc_ana%lc_dip))
732 :
733 : ! end the timing
734 1049 : CALL timestop(handle)
735 1049 : END SUBROUTINE read_element_from_file
736 :
737 : ! **************************************************************************************************
738 : !> \brief search for the next configurational position in file
739 : !> \param elem actual tree element to be read
740 : !> \param tmc_ana ...
741 : !> \param stat ...
742 : !> \param conf_nr Markov chain element number
743 : !> (input the old number and read only if conf nr from file is greater
744 : !> \param header_info ...
745 : !> \author Mandes 03.2013
746 : ! **************************************************************************************************
747 2098 : SUBROUTINE read_pos_from_file(elem, tmc_ana, stat, conf_nr, header_info)
748 : TYPE(tree_type), POINTER :: elem
749 : TYPE(tmc_analysis_env), POINTER :: tmc_ana
750 : INTEGER :: stat, conf_nr
751 : CHARACTER(LEN=*), OPTIONAL :: header_info
752 :
753 : CHARACTER(LEN=*), PARAMETER :: routineN = 'read_pos_from_file'
754 :
755 : CHARACTER(LEN=default_string_length) :: c_tmp
756 : INTEGER :: handle, i, i_tmp, status
757 :
758 1049 : stat = TMC_STATUS_FAILED
759 :
760 0 : CPASSERT(ASSOCIATED(elem))
761 1049 : CPASSERT(ASSOCIATED(elem%pos))
762 1049 : CPASSERT(ASSOCIATED(tmc_ana))
763 1049 : CPASSERT(tmc_ana%id_traj .GT. 0)
764 :
765 : ! start the timing
766 1049 : CALL timeset(routineN, handle)
767 :
768 : search_next_conf: DO
769 6105 : c_tmp(:) = " "
770 6105 : tmc_ana%lc_traj = tmc_ana%lc_traj + 1
771 6105 : READ (tmc_ana%id_traj, '(A)', IOSTAT=status) c_tmp(:)
772 6105 : IF (status .GT. 0) &
773 : CALL cp_abort(__LOCATION__, &
774 : "configuration header read error at line: "// &
775 0 : cp_to_string(tmc_ana%lc_traj)//": "//c_tmp)
776 6105 : IF (status .LT. 0) THEN ! end of file reached
777 18 : stat = TMC_STATUS_WAIT_FOR_NEW_TASK
778 18 : EXIT search_next_conf
779 : END IF
780 6087 : IF (INDEX(c_tmp, "=") .GT. 0) THEN
781 1206 : READ (c_tmp(INDEX(c_tmp, "=") + 1:), *, IOSTAT=status) i_tmp ! read the configuration number
782 1206 : IF (status .NE. 0) &
783 : CALL cp_abort(__LOCATION__, &
784 : "configuration header read error (for conf nr) at line: "// &
785 0 : cp_to_string(tmc_ana%lc_traj))
786 1206 : IF (i_tmp .GT. conf_nr) THEN
787 : ! TODO we could also read the energy ...
788 1031 : conf_nr = i_tmp
789 1031 : IF (PRESENT(header_info)) header_info = c_tmp
790 1031 : stat = TMC_STATUS_OK
791 1031 : EXIT search_next_conf
792 : END IF
793 : END IF
794 : END DO search_next_conf
795 :
796 1049 : IF (stat .EQ. TMC_STATUS_OK) THEN
797 22682 : pos_loop: DO i = 1, SIZE(elem%pos), tmc_ana%dim_per_elem
798 21651 : tmc_ana%lc_traj = tmc_ana%lc_traj + 1
799 : READ (tmc_ana%id_traj, FMT="(A4,1X,1000F20.10)", IOSTAT=status) &
800 21651 : c_tmp, elem%pos(i:i + tmc_ana%dim_per_elem - 1)
801 22682 : IF (status .NE. 0) THEN
802 : CALL cp_abort(__LOCATION__, &
803 : "configuration pos read error at line: "// &
804 0 : cp_to_string(tmc_ana%lc_traj))
805 : END IF
806 : END DO pos_loop
807 65984 : elem%pos(:) = elem%pos(:)/au2a
808 : END IF
809 :
810 : ! end the timing
811 1049 : CALL timestop(handle)
812 1049 : END SUBROUTINE read_pos_from_file
813 :
814 : ! **************************************************************************************************
815 : !> \brief search for the dipole entry
816 : !> \param elem actual tree element to be read
817 : !> \param tmc_ana ...
818 : !> \param stat ...
819 : !> \param conf_nr Markov chain element number
820 : !> (input the old number and read only if conf nr from file is greater
821 : !> \author Mandes 03.2013
822 : ! **************************************************************************************************
823 0 : SUBROUTINE read_dipole_from_file(elem, tmc_ana, stat, conf_nr)
824 : TYPE(tree_type), POINTER :: elem
825 : TYPE(tmc_analysis_env), POINTER :: tmc_ana
826 : INTEGER :: stat, conf_nr
827 :
828 : CHARACTER(LEN=*), PARAMETER :: routineN = 'read_dipole_from_file'
829 :
830 : CHARACTER(LEN=250) :: c_tmp
831 : INTEGER :: handle, status
832 :
833 0 : stat = TMC_STATUS_FAILED
834 :
835 0 : CPASSERT(ASSOCIATED(elem))
836 0 : CPASSERT(ASSOCIATED(elem%dipole))
837 0 : CPASSERT(ASSOCIATED(tmc_ana))
838 0 : CPASSERT(tmc_ana%id_dip .GT. 0)
839 :
840 : ! start the timing
841 0 : CALL timeset(routineN, handle)
842 0 : tmc_ana%lc_dip = tmc_ana%lc_dip + 1
843 0 : READ (tmc_ana%id_dip, FMT="(A)", IOSTAT=status) c_tmp
844 0 : IF (status .EQ. 0) THEN
845 : ! skip the initial line (header)
846 0 : IF (INDEX(c_tmp, "#") .GT. 0) THEN
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 : END IF
850 : END IF
851 0 : IF (status .EQ. 0) THEN
852 : READ (c_tmp, FMT="(I8,10F20.10)", IOSTAT=status) &
853 0 : conf_nr, elem%dipole(:)
854 : END IF
855 0 : IF (status .EQ. 0) THEN ! success
856 0 : stat = TMC_STATUS_OK
857 0 : ELSE IF (status .LT. 0) THEN ! end of file reached
858 0 : stat = TMC_STATUS_WAIT_FOR_NEW_TASK
859 : ELSE
860 : IF (status .NE. 0) THEN
861 0 : CPWARN("configuration dipole read error at line: "//cp_to_string(tmc_ana%lc_dip))
862 : END IF
863 0 : stat = TMC_STATUS_FAILED
864 : END IF
865 :
866 : ! end the timing
867 0 : CALL timestop(handle)
868 0 : END SUBROUTINE read_dipole_from_file
869 :
870 : ! **************************************************************************************************
871 : !> \brief search for the cell entry
872 : !> \param elem actual tree element to be read
873 : !> \param tmc_ana ...
874 : !> \param stat ...
875 : !> \param conf_nr Markov chain element number
876 : !> (input the old number and read only if conf nr from file is greater
877 : !> \author Mandes 03.2013
878 : ! **************************************************************************************************
879 2412 : SUBROUTINE read_cell_from_file(elem, tmc_ana, stat, conf_nr)
880 : TYPE(tree_type), POINTER :: elem
881 : TYPE(tmc_analysis_env), POINTER :: tmc_ana
882 : INTEGER :: stat, conf_nr
883 :
884 : CHARACTER(LEN=*), PARAMETER :: routineN = 'read_cell_from_file'
885 :
886 : CHARACTER(LEN=250) :: c_tmp
887 : INTEGER :: handle, status
888 : REAL(KIND=dp) :: r_tmp
889 : REAL(KIND=dp), DIMENSION(3, 3) :: hmat
890 :
891 1206 : stat = TMC_STATUS_FAILED
892 :
893 1206 : CPASSERT(ASSOCIATED(elem))
894 1206 : CPASSERT(ASSOCIATED(tmc_ana))
895 1206 : CPASSERT(ASSOCIATED(tmc_ana%cell))
896 1206 : CPASSERT(tmc_ana%id_cell .GT. 0)
897 :
898 : ! start the timing
899 1206 : CALL timeset(routineN, handle)
900 :
901 1206 : tmc_ana%lc_cell = tmc_ana%lc_cell + 1
902 1206 : READ (tmc_ana%id_cell, FMT="(A)", IOSTAT=status) c_tmp
903 1206 : IF (status .EQ. 0) THEN
904 : ! skip the initial line (header)
905 1206 : IF (INDEX(c_tmp, "#") .GT. 0) THEN
906 18 : tmc_ana%lc_cell = tmc_ana%lc_cell + 1
907 18 : READ (tmc_ana%id_cell, FMT="(A)", IOSTAT=status) c_tmp
908 : END IF
909 : END IF
910 1206 : IF (status .EQ. 0) THEN
911 1206 : READ (c_tmp, FMT="(I8,9(1X,F19.10),1X,F24.10)", IOSTAT=status) conf_nr, &
912 2412 : hmat(:, :), r_tmp
913 : END IF
914 1206 : IF (status .LT. 0) THEN ! end of file reached
915 0 : stat = TMC_STATUS_WAIT_FOR_NEW_TASK
916 1206 : ELSE IF (status .GT. 0) THEN
917 : IF (status .NE. 0) &
918 0 : CPABORT("configuration cell read error at line: "//cp_to_string(tmc_ana%lc_cell))
919 0 : stat = TMC_STATUS_FAILED
920 : ELSE
921 1206 : IF (elem%nr .LT. 0) elem%nr = conf_nr
922 15678 : hmat(:, :) = hmat(:, :)/au2a
923 : ! get the box scaling
924 : CALL get_cell_scaling(cell=tmc_ana%cell, scaled_hmat=hmat, &
925 1206 : box_scale=elem%box_scale)
926 1206 : stat = TMC_STATUS_OK
927 : END IF
928 : ! end the timing
929 1206 : CALL timestop(handle)
930 1206 : END SUBROUTINE read_cell_from_file
931 :
932 : !----------------------------------------------------------------------------
933 : ! get the configurations from file and calc
934 : !----------------------------------------------------------------------------
935 :
936 : ! **************************************************************************************************
937 : !> \brief opens the files for reading configurations data to analyze
938 : !> \param tmc_ana ...
939 : !> \param stat ...
940 : !> \param dir_ind ...
941 : !> \param
942 : !> \author Mandes 02.2013
943 : ! **************************************************************************************************
944 36 : SUBROUTINE analyse_files_open(tmc_ana, stat, dir_ind)
945 : TYPE(tmc_analysis_env), POINTER :: tmc_ana
946 : INTEGER :: stat
947 : INTEGER, OPTIONAL :: dir_ind
948 :
949 : CHARACTER(LEN=*), PARAMETER :: routineN = 'analyse_files_open'
950 :
951 : CHARACTER(LEN=default_path_length) :: dir_name, file_name_act, file_name_temp
952 : INTEGER :: handle
953 : LOGICAL :: file_exists
954 :
955 18 : CPASSERT(ASSOCIATED(tmc_ana))
956 :
957 18 : stat = TMC_STATUS_WAIT_FOR_NEW_TASK
958 :
959 : ! start the timing
960 18 : CALL timeset(routineN, handle)
961 :
962 18 : IF (PRESENT(dir_ind)) THEN
963 18 : CPASSERT(ASSOCIATED(tmc_ana%dirs))
964 18 : CPASSERT(dir_ind .GT. 0)
965 18 : CPASSERT(dir_ind .LE. SIZE(tmc_ana%dirs))
966 :
967 18 : IF (INDEX(tmc_ana%dirs(dir_ind), "/", BACK=.TRUE.) .EQ. &
968 : LEN_TRIM(tmc_ana%dirs(dir_ind))) THEN
969 18 : dir_name = TRIM(tmc_ana%dirs(dir_ind))
970 : ELSE
971 0 : dir_name = TRIM(tmc_ana%dirs(dir_ind))//"/"
972 : END IF
973 : ELSE
974 0 : dir_name = "./"
975 : END IF
976 :
977 : ! open the files
978 : file_name_temp = expand_file_name_temp( &
979 : file_name=tmc_default_trajectory_file_name, &
980 18 : rvalue=tmc_ana%temperature)
981 : ! position file
982 18 : IF (tmc_ana%costum_pos_file_name .NE. "") THEN
983 0 : file_name_act = TRIM(dir_name)//tmc_ana%costum_pos_file_name
984 : ELSE
985 : file_name_act = TRIM(dir_name)// &
986 18 : expand_file_name_ending(file_name_temp, "xyz")
987 : END IF
988 18 : INQUIRE (FILE=file_name_act, EXIST=file_exists)
989 18 : IF (file_exists) THEN
990 : CALL open_file(file_name=file_name_act, file_status="OLD", &
991 18 : file_action="READ", unit_number=tmc_ana%id_traj)
992 18 : WRITE (tmc_ana%io_unit, FMT='(T2,A,"| ",A,T41,A40)') "TMC_ANA", &
993 36 : "read xyz file", TRIM(file_name_act)
994 : END IF
995 :
996 : ! cell file
997 18 : IF (tmc_ana%costum_cell_file_name .NE. "") THEN
998 0 : file_name_act = TRIM(dir_name)//tmc_ana%costum_cell_file_name
999 : ELSE
1000 : file_name_act = TRIM(dir_name)// &
1001 18 : expand_file_name_ending(file_name_temp, "cell")
1002 : END IF
1003 18 : INQUIRE (FILE=file_name_act, EXIST=file_exists)
1004 18 : IF (file_exists) THEN
1005 : CALL open_file(file_name=file_name_act, file_status="OLD", &
1006 18 : file_action="READ", unit_number=tmc_ana%id_cell)
1007 18 : WRITE (tmc_ana%io_unit, FMT='(T2,A,"| ",A,T41,A40)') "TMC_ANA", &
1008 36 : "read cell file", TRIM(file_name_act)
1009 : END IF
1010 :
1011 : ! dipole file
1012 18 : IF (tmc_ana%costum_dip_file_name .NE. "") THEN
1013 18 : file_name_act = TRIM(dir_name)//tmc_ana%costum_dip_file_name
1014 : ELSE
1015 : file_name_act = TRIM(dir_name)// &
1016 0 : expand_file_name_ending(file_name_temp, "dip")
1017 : END IF
1018 18 : INQUIRE (FILE=file_name_act, EXIST=file_exists)
1019 18 : IF (file_exists) THEN
1020 : CALL open_file(file_name=file_name_act, file_status="OLD", &
1021 0 : file_action="READ", unit_number=tmc_ana%id_dip)
1022 0 : WRITE (tmc_ana%io_unit, FMT='(T2,A,"| ",A,T41,A40)') "TMC_ANA", &
1023 0 : "read dip file", TRIM(file_name_act)
1024 : END IF
1025 :
1026 18 : IF (tmc_ana%id_traj .GT. 0 .OR. tmc_ana%id_cell .GT. 0 .OR. &
1027 : tmc_ana%id_dip .GT. 0) THEN
1028 18 : stat = TMC_STATUS_OK
1029 : ELSE
1030 : CALL cp_warn(__LOCATION__, &
1031 : "There is no file to open for temperature "//cp_to_string(tmc_ana%temperature)// &
1032 0 : "K in directory "//TRIM(dir_name))
1033 : END IF
1034 : ! end the timing
1035 18 : CALL timestop(handle)
1036 18 : END SUBROUTINE analyse_files_open
1037 :
1038 : ! **************************************************************************************************
1039 : !> \brief close the files for reading configurations data to analyze
1040 : !> \param tmc_ana ...
1041 : !> \param
1042 : !> \author Mandes 02.2013
1043 : ! **************************************************************************************************
1044 36 : SUBROUTINE analyse_files_close(tmc_ana)
1045 : TYPE(tmc_analysis_env), POINTER :: tmc_ana
1046 :
1047 : CHARACTER(LEN=*), PARAMETER :: routineN = 'analyse_files_close'
1048 :
1049 : INTEGER :: handle
1050 :
1051 18 : CPASSERT(ASSOCIATED(tmc_ana))
1052 :
1053 : ! start the timing
1054 18 : CALL timeset(routineN, handle)
1055 :
1056 : ! position file
1057 18 : IF (tmc_ana%id_traj .GT. 0) CALL close_file(unit_number=tmc_ana%id_traj)
1058 :
1059 : ! cell file
1060 18 : IF (tmc_ana%id_cell .GT. 0) CALL close_file(unit_number=tmc_ana%id_cell)
1061 :
1062 : ! dipole file
1063 18 : IF (tmc_ana%id_dip .GT. 0) CALL close_file(unit_number=tmc_ana%id_dip)
1064 :
1065 : ! end the timing
1066 18 : CALL timestop(handle)
1067 18 : END SUBROUTINE analyse_files_close
1068 :
1069 : END MODULE tmc_file_io
|