(git:ed6f26b)
Loading...
Searching...
No Matches
tmc_file_io.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2025 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
21 USE cp_files, ONLY: close_file,&
24 USE kinds, ONLY: default_path_length,&
26 dp
27 USE physcon, ONLY: au2a => angstrom
32 USE tmc_stati, ONLY: tmc_status_failed,&
40 USE tmc_types, ONLY: tmc_env_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
52 ! read/write restart file
54 ! write the configuration
56 PUBLIC :: write_element_in_file
57 PUBLIC :: write_dipoles_in_file
58 ! analysis read
60
61CONTAINS
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 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 cpassert(file_name .NE. "")
81
82 ind = index(file_name, ".", back=.true.)
83 IF (.NOT. ind .EQ. 0) THEN
84 WRITE (result_file_name, *) file_name(1:ind - 1), ".", &
85 trim(adjustl(extra))
86 ELSE
87 WRITE (result_file_name, *) trim(file_name), ".", extra
88 END IF
89 result_file_name = trim(adjustl(result_file_name))
90 cpassert(result_file_name .NE. "")
91 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 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 cpassert(file_name .NE. "")
108
109 ind = index(file_name, ".", back=.true.)
110 IF (.NOT. ind .EQ. 0) THEN
111 WRITE (result_file_name, *) file_name(1:ind - 1), "_", &
112 trim(adjustl(extra)), file_name(ind:len_trim(file_name))
113 ELSE
114 WRITE (result_file_name, *) trim(file_name), "_", extra
115 END IF
116 result_file_name = trim(adjustl(result_file_name))
117 cpassert(result_file_name .NE. "")
118 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 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 cpassert(file_name .NE. "")
137
138 rval_to_string = ""
139
140 WRITE (rval_to_string, "(F16.2)") rvalue
141 ind = index(file_name, ".", back=.true.)
142 IF (.NOT. ind .EQ. 0) THEN
143 WRITE (result_file_name, *) file_name(1:ind - 1), "_T", &
144 trim(adjustl(rval_to_string)), file_name(ind:len_trim(file_name))
145 ELSE
146 IF (len(file_name) .EQ. 0) THEN
147 WRITE (result_file_name, *) trim(file_name), "T", trim(adjustl(rval_to_string)), &
148 file_name(ind:len_trim(file_name))
149 ELSE
150 WRITE (result_file_name, *) trim(file_name), "_T", trim(adjustl(rval_to_string))
151 END IF
152 END IF
153 result_file_name = trim(adjustl(result_file_name))
154 cpassert(result_file_name .NE. "")
155 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 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 cpassert(file_name .NE. "")
174
175 rval_to_string = ""
176
177 WRITE (rval_to_string, *) ivalue
178 ind = index(file_name, ".", back=.true.)
179 IF (.NOT. ind .EQ. 0) THEN
180 WRITE (result_file_name, *) file_name(1:ind - 1), "_", &
181 trim(adjustl(rval_to_string)), file_name(ind:len_trim(file_name))
182 ELSE
183 IF (len(file_name) .EQ. 0) THEN
184 WRITE (result_file_name, *) trim(file_name), "", trim(adjustl(rval_to_string)), &
185 file_name(ind:len_trim(file_name))
186 ELSE
187 WRITE (result_file_name, *) trim(file_name), "_", trim(adjustl(rval_to_string)), &
188 file_name(ind:len_trim(file_name))
189 END IF
190 END IF
191 result_file_name = trim(adjustl(result_file_name))
192 cpassert(result_file_name .NE. "")
193 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 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 c_tmp = ""
216 cpassert(ASSOCIATED(tmc_env))
217 cpassert(ASSOCIATED(tmc_env%m_env))
218 cpassert(ASSOCIATED(tmc_env%params))
219 cpassert(ASSOCIATED(tmc_env%m_env%gt_act))
220
221 WRITE (c_tmp, fmt='(I9.9)') tmc_env%m_env%result_count(0)
222 file_name = trim(expand_file_name_char( &
224 extra=c_tmp))
225 CALL open_file(file_name=file_name, file_status="REPLACE", &
226 file_action="WRITE", file_form="UNFORMATTED", &
227 unit_number=f_unit)
228 WRITE (f_unit) SIZE(tmc_env%params%Temp)
229 WRITE (f_unit) tmc_env%params%Temp(:), &
230 tmc_env%m_env%gt_act%nr, &
231 tmc_env%m_env%gt_act%rng_seed, &
232 tmc_env%m_env%gt_act%rnd_nr, &
233 tmc_env%m_env%gt_act%prob_acc, &
234 tmc_env%m_env%gt_act%mv_conf, &
235 tmc_env%m_env%gt_act%mv_next_conf, &
236 tmc_env%m_env%result_count(0:), &
237 tmc_env%params%move_types%mv_weight, &
238 tmc_env%params%move_types%acc_count, &
239 tmc_env%params%move_types%mv_count, &
240 tmc_env%params%move_types%subbox_acc_count, &
241 tmc_env%params%move_types%subbox_count, &
242 tmc_env%params%cell%hmat, &
243 job_counts, &
244 timings
245 DO i = 1, SIZE(tmc_env%params%Temp)
246 WRITE (f_unit) tmc_env%m_env%result_list(i)%elem%nr, &
247 tmc_env%m_env%result_list(i)%elem%rng_seed, &
248 tmc_env%m_env%result_list(i)%elem%pos, &
249 tmc_env%m_env%result_list(i)%elem%vel, &
250 tmc_env%m_env%result_list(i)%elem%box_scale, &
251 tmc_env%m_env%result_list(i)%elem%potential, &
252 tmc_env%m_env%result_list(i)%elem%e_pot_approx, &
253 tmc_env%m_env%result_list(i)%elem%ekin, &
254 tmc_env%m_env%result_list(i)%elem%ekin_before_md, &
255 tmc_env%m_env%result_list(i)%elem%temp_created
256 END DO
257 CALL close_file(unit_number=f_unit)
258 ! write the file, where the restart file name is written in
260 file_action="WRITE", file_status="REPLACE", &
261 unit_number=f_unit)
262 WRITE (f_unit, *) trim(file_name)
263 CALL close_file(unit_number=f_unit)
264 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 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 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: tmp_temp
285 REAL(kind=dp), DIMENSION(nr_mv_types) :: mv_weight_tmp
286
287 cpassert(ASSOCIATED(tmc_env))
288 cpassert(ASSOCIATED(tmc_env%m_env))
289 cpassert(ASSOCIATED(tmc_env%params))
290 cpassert(ASSOCIATED(tmc_env%m_env%gt_act))
291
292 IF (file_name .EQ. tmc_default_restart_in_file_name) THEN
293 INQUIRE (file=tmc_default_restart_in_file_name, exist=flag)
294 cpassert(flag)
295 CALL open_file(file_name=tmc_default_restart_in_file_name, file_status="OLD", &
296 file_action="READ", unit_number=file_ptr)
297 READ (file_ptr, *) file_name
298 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 file_action="READ", unit_number=file_ptr)
303 READ (file_ptr) temp_size
304 IF (temp_size .NE. SIZE(tmc_env%params%Temp)) &
305 CALL cp_abort(__location__, &
306 "the actual specified temperatures does not "// &
307 "fit in amount with the one from restart file ")
308 ALLOCATE (tmp_temp(temp_size))
309 READ (file_ptr) tmp_temp(:), &
310 tmc_env%m_env%gt_act%nr, &
311 tmc_env%m_env%gt_act%rng_seed, &
312 tmc_env%m_env%gt_act%rnd_nr, &
313 tmc_env%m_env%gt_act%prob_acc, &
314 tmc_env%m_env%gt_act%mv_conf, & !
315 tmc_env%m_env%gt_act%mv_next_conf, & !
316 tmc_env%m_env%result_count(0:), &
317 mv_weight_tmp, & !
318 tmc_env%params%move_types%acc_count, &
319 tmc_env%params%move_types%mv_count, &
320 tmc_env%params%move_types%subbox_acc_count, &
321 tmc_env%params%move_types%subbox_count, & !
322 tmc_env%params%cell%hmat, &
323 job_counts, &
324 timings
325
326 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 "There were the following temperatures used:")
329 IF (any(mv_weight_tmp(:) .NE. tmc_env%params%move_types%mv_weight(:))) THEN
330 cpwarn("The amount of mv types differs between the original and the restart run.")
331 END IF
332
333 DO i = 1, SIZE(tmc_env%params%Temp)
334 tmc_env%m_env%gt_act%conf(i)%elem => tmc_env%m_env%result_list(i)%elem
335 READ (file_ptr) tmc_env%m_env%result_list(i)%elem%nr, &
336 tmc_env%m_env%result_list(i)%elem%rng_seed, &
337 tmc_env%m_env%result_list(i)%elem%pos, &
338 tmc_env%m_env%result_list(i)%elem%vel, &
339 tmc_env%m_env%result_list(i)%elem%box_scale, &
340 tmc_env%m_env%result_list(i)%elem%potential, &
341 tmc_env%m_env%result_list(i)%elem%e_pot_approx, &
342 tmc_env%m_env%result_list(i)%elem%ekin, &
343 tmc_env%m_env%result_list(i)%elem%ekin_before_md, &
344 tmc_env%m_env%result_list(i)%elem%temp_created
345 END DO
346 CALL close_file(unit_number=file_ptr)
347 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 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 file_name = ""
378
379 cpassert(ASSOCIATED(result_list))
380 cpassert(ASSOCIATED(result_count))
381 cpassert(ASSOCIATED(tmc_params))
382 cpassert(ASSOCIATED(tmc_params%Temp))
383 cpassert(conf_updated .GE. 0)
384 cpassert(conf_updated .LE. SIZE(tmc_params%Temp))
385
386 ! start the timing
387 CALL timeset(routinen, handle)
388
389 IF (conf_updated .EQ. 0) THEN
390 ! for debugging print every configuration of every temperature
391 DO i = 1, SIZE(tmc_params%Temp)
392 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 file_name=expand_file_name_temp(file_name=file_name, rvalue=tmc_params%Temp(i)))
396 END DO
397 ELSE
398 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), &
403 rvalue=tmc_params%Temp(conf_updated)))
404 END IF
405 END IF
406 ! end the timing
407 CALL timestop(handle)
408 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 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 file_name_act = ""
439 tmp_name = ""
440 header = ""
441 print_it = .true.
442
443 cpassert(ASSOCIATED(elem))
444 cpassert(ASSOCIATED(tmc_params))
445 cpassert(ASSOCIATED(tmc_params%atoms))
446 cpassert(PRESENT(conf_nr) .OR. PRESENT(conf_info))
447
448 IF (print_it) THEN
449 ! start the timing
450 CALL timeset(routinen, handle)
451
452 ! set default file name
453 IF (PRESENT(file_name)) THEN
454 cpassert(file_name .NE. "")
455 file_name_act = file_name
456 ELSE
457 cpassert(ASSOCIATED(tmc_params%Temp))
458 cpassert(PRESENT(temp_index))
460 rvalue=tmc_params%Temp(temp_index))
461 END IF
462
463 nr_atoms = SIZE(elem%pos)/tmc_params%dim_per_elem
464
465 ! set header (for coordinate or force file)
466 IF (tmc_params%print_trajectory .OR. tmc_params%print_forces) THEN
467 IF (PRESENT(conf_info)) THEN
468 WRITE (header, *) trim(adjustl(conf_info))
469 ELSE
470 !WRITE(header,FMT="(A,I8,A,F20.10)") " i = ", conf_nr,", E = ", elem%potential
471 WRITE (header, fmt="(A,I8,A,F20.10,F20.10,A,I8,I8)") "i =", conf_nr, " ,E =", &
472 elem%potential, elem%ekin, " st elem", elem%sub_tree_nr, elem%nr
473 END IF
474 END IF
475
476 ! write the coordinates
477 IF (tmc_params%print_trajectory) THEN
478 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 unit_number=file_ptr)
482 WRITE (file_ptr, fmt="(I8)") nr_atoms
483 WRITE (file_ptr, *) trim(header)
484 DO i = 1, SIZE(elem%pos), tmc_params%dim_per_elem
485 WRITE (file_ptr, fmt="(A4,1X,1000F20.10)") &
486 trim(tmc_params%atoms((i - 1)/tmc_params%dim_per_elem + 1)%name), &
487 elem%pos(i:i + tmc_params%dim_per_elem - 1)*au2a
488 END DO
489 CALL close_file(unit_number=file_ptr)
490 END IF
491
492 ! write the forces
493 IF (tmc_params%print_forces) THEN
494 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 unit_number=file_ptr)
498 WRITE (file_ptr, fmt="(I8)") nr_atoms
499 WRITE (file_ptr, *) trim(header)
500 DO i = 1, SIZE(elem%pos), tmc_params%dim_per_elem
501 WRITE (file_ptr, fmt="(A4,1X,1000F20.10)") &
502 trim(tmc_params%atoms((i - 1)/tmc_params%dim_per_elem + 1)%name), &
503 elem%frc(i:i + tmc_params%dim_per_elem - 1)
504 END DO
505 CALL close_file(unit_number=file_ptr)
506 END IF
507
508 ! write the cell dipoles
509 IF (tmc_params%print_dipole) THEN
510 CALL write_dipoles_in_file(file_name=file_name_act, &
511 conf_nr=conf_nr, dip=elem%dipole)
512 END IF
513
514 ! write the cell file
515 IF (tmc_params%print_cell) THEN
516 tmp_name = expand_file_name_ending(file_name_act, "cell")
517 ! header
518 INQUIRE (file=tmp_name, exist=file_exists) ! file_exists will be TRUE if the file exist
519 IF (.NOT. file_exists) THEN
520 CALL open_file(file_name=tmp_name, file_status="NEW", &
521 file_action="WRITE", unit_number=file_ptr)
522 WRITE (file_ptr, fmt='(A,9(7X,A2," [Angstrom]"),6X,A)') &
523 "# MC step ", "Ax", "Ay", "Az", "Bx", "By", "Bz", "Cx", "Cy", "Cz", &
524 "Volume [Angstrom^3]"
525 ELSE
526 CALL open_file(file_name=tmp_name, file_status="OLD", &
527 file_action="WRITE", file_position="APPEND", &
528 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 vol=vol)
533 WRITE (file_ptr, fmt="(I8,9(1X,F19.10),1X,F24.10)") conf_nr, &
534 hmat_scaled(:, :)*au2a, vol*au2a**3
535 !TODO better cell output e.g. using cell_types routine
536 CALL close_file(unit_number=file_ptr)
537 END IF
538
539 ! write the different energies
540 IF (tmc_params%print_energies) THEN
541 tmp_name = expand_file_name_ending(file_name_act, "ener")
542 ! header
543 INQUIRE (file=tmp_name, exist=file_exists) ! file_exists will be TRUE if the file exist
544 IF (.NOT. file_exists) THEN
545 CALL open_file(file_name=tmp_name, file_status="NEW", &
546 file_action="WRITE", unit_number=file_ptr)
547 WRITE (file_ptr, fmt='(A,4A20)') &
548 "# 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 unit_number=file_ptr)
553 END IF
554 WRITE (file_ptr, fmt="(I8,14F20.10)") conf_nr, elem%potential, elem%e_pot_approx, &
555 elem%scf_energies(mod(elem%scf_energies_count, 4) + 1), elem%ekin
556 CALL close_file(unit_number=file_ptr)
557 END IF
558
559 ! end the timing
560 CALL timestop(handle)
561 END IF
562 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 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 cpassert(ASSOCIATED(dip))
584
585 IF (PRESENT(file_ext)) THEN
586 cpassert(file_ext .NE. "")
587 file_name_tmp = expand_file_name_ending(file_name, trim(file_ext))
588 ELSE
589 file_name_tmp = expand_file_name_ending(file_name, "dip")
590 END IF
591 INQUIRE (file=file_name_tmp, exist=file_exists)
592 IF (.NOT. file_exists) THEN
593 CALL open_file(file_name=file_name_tmp, file_status="NEW", &
594 file_action="WRITE", unit_number=file_ptr)
595 WRITE (file_ptr, fmt='(A8,10A20)') "# conf_nr", "dip_x [C Angstrom]", &
596 "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 unit_number=file_ptr)
601 END IF
602 WRITE (file_ptr, fmt="(I8,10F20.10)") conf_nr, dip(:)
603 CALL close_file(unit_number=file_ptr)
604 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 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 stat = tmc_status_ok
630 conf_nr_old = conf_nr
631 files_conf_missmatch = .false.
632
633 cpassert(ASSOCIATED(elem))
634 cpassert(ASSOCIATED(tmc_ana))
635 cpassert(ASSOCIATED(tmc_ana%atoms))
636
637 ! start the timing
638 CALL timeset(routinen, handle)
639
640 ! read the coordinates
641 IF (tmc_ana%id_traj .GT. 0) THEN
642 i_tmp = conf_nr_old
643 CALL read_pos_from_file(elem=elem, tmc_ana=tmc_ana, stat=stat, &
644 conf_nr=i_tmp)
645 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 cp_to_string(tmc_ana%last_elem%nr))
650 ELSE
651 cpassert(i_tmp .GT. conf_nr_old)
652 conf_nr = i_tmp
653 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 IF (tmc_ana%id_dip .GT. 0 .AND. stat .EQ. tmc_status_ok) THEN
662 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 conf_nr=i_tmp)
666 IF (stat .EQ. tmc_status_wait_for_new_task) THEN
667 CALL cp_warn(__location__, &
668 'end of dipole file reached at line'// &
669 cp_to_string(real(tmc_ana%lc_dip, kind=dp)))
670 EXIT search_conf_dip
671 END IF
672 ! check consitence with pos file
673 IF (tmc_ana%id_traj .GT. 0) THEN
674 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 ELSE IF (i_tmp .GT. conf_nr_old) THEN
684 conf_nr = i_tmp
685 elem%nr = i_tmp
686 EXIT search_conf_dip
687 END IF
688 END DO search_conf_dip
689 END IF
690
691 ! read the cell file
692 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 conf_nr=i_tmp)
696 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 cp_to_string(real(tmc_ana%lc_cell, kind=dp)))
700 EXIT search_conf_cell
701 END IF
702 ! check consitence with pos file
703 IF (tmc_ana%id_traj .GT. 0) THEN
704 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 ELSE IF (i_tmp .GT. conf_nr_old) THEN
714 conf_nr = i_tmp
715 elem%nr = i_tmp
716 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 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 cp_to_string(tmc_ana%lc_dip))
732
733 ! end the timing
734 CALL timestop(handle)
735 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 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 stat = tmc_status_failed
759
760 cpassert(ASSOCIATED(elem))
761 cpassert(ASSOCIATED(elem%pos))
762 cpassert(ASSOCIATED(tmc_ana))
763 cpassert(tmc_ana%id_traj .GT. 0)
764
765 ! start the timing
766 CALL timeset(routinen, handle)
767
768 search_next_conf: DO
769 c_tmp(:) = " "
770 tmc_ana%lc_traj = tmc_ana%lc_traj + 1
771 READ (tmc_ana%id_traj, '(A)', iostat=status) c_tmp(:)
772 IF (status .GT. 0) &
773 CALL cp_abort(__location__, &
774 "configuration header read error at line: "// &
775 cp_to_string(tmc_ana%lc_traj)//": "//c_tmp)
776 IF (status .LT. 0) THEN ! end of file reached
778 EXIT search_next_conf
779 END IF
780 IF (index(c_tmp, "=") .GT. 0) THEN
781 READ (c_tmp(index(c_tmp, "=") + 1:), *, iostat=status) i_tmp ! read the configuration number
782 IF (status .NE. 0) &
783 CALL cp_abort(__location__, &
784 "configuration header read error (for conf nr) at line: "// &
785 cp_to_string(tmc_ana%lc_traj))
786 IF (i_tmp .GT. conf_nr) THEN
787 ! TODO we could also read the energy ...
788 conf_nr = i_tmp
789 IF (PRESENT(header_info)) header_info = c_tmp
790 stat = tmc_status_ok
791 EXIT search_next_conf
792 END IF
793 END IF
794 END DO search_next_conf
795
796 IF (stat .EQ. tmc_status_ok) THEN
797 pos_loop: DO i = 1, SIZE(elem%pos), tmc_ana%dim_per_elem
798 tmc_ana%lc_traj = tmc_ana%lc_traj + 1
799 READ (tmc_ana%id_traj, fmt="(A4,1X,1000F20.10)", iostat=status) &
800 c_tmp, elem%pos(i:i + tmc_ana%dim_per_elem - 1)
801 IF (status .NE. 0) THEN
802 CALL cp_abort(__location__, &
803 "configuration pos read error at line: "// &
804 cp_to_string(tmc_ana%lc_traj))
805 END IF
806 END DO pos_loop
807 elem%pos(:) = elem%pos(:)/au2a
808 END IF
809
810 ! end the timing
811 CALL timestop(handle)
812 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 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 stat = tmc_status_failed
834
835 cpassert(ASSOCIATED(elem))
836 cpassert(ASSOCIATED(elem%dipole))
837 cpassert(ASSOCIATED(tmc_ana))
838 cpassert(tmc_ana%id_dip .GT. 0)
839
840 ! start the timing
841 CALL timeset(routinen, handle)
842 tmc_ana%lc_dip = tmc_ana%lc_dip + 1
843 READ (tmc_ana%id_dip, fmt="(A)", iostat=status) c_tmp
844 IF (status .EQ. 0) THEN
845 ! skip the initial line (header)
846 IF (index(c_tmp, "#") .GT. 0) THEN
847 tmc_ana%lc_dip = tmc_ana%lc_dip + 1
848 READ (tmc_ana%id_dip, fmt="(A)", iostat=status) c_tmp
849 END IF
850 END IF
851 IF (status .EQ. 0) THEN
852 READ (c_tmp, fmt="(I8,10F20.10)", iostat=status) &
853 conf_nr, elem%dipole(:)
854 END IF
855 IF (status .EQ. 0) THEN ! success
856 stat = tmc_status_ok
857 ELSE IF (status .LT. 0) THEN ! end of file reached
859 ELSE
860 IF (status .NE. 0) THEN
861 cpwarn("configuration dipole read error at line: "//cp_to_string(tmc_ana%lc_dip))
862 END IF
863 stat = tmc_status_failed
864 END IF
865
866 ! end the timing
867 CALL timestop(handle)
868 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 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 stat = tmc_status_failed
892
893 cpassert(ASSOCIATED(elem))
894 cpassert(ASSOCIATED(tmc_ana))
895 cpassert(ASSOCIATED(tmc_ana%cell))
896 cpassert(tmc_ana%id_cell .GT. 0)
897
898 ! start the timing
899 CALL timeset(routinen, handle)
900
901 tmc_ana%lc_cell = tmc_ana%lc_cell + 1
902 READ (tmc_ana%id_cell, fmt="(A)", iostat=status) c_tmp
903 IF (status .EQ. 0) THEN
904 ! skip the initial line (header)
905 IF (index(c_tmp, "#") .GT. 0) THEN
906 tmc_ana%lc_cell = tmc_ana%lc_cell + 1
907 READ (tmc_ana%id_cell, fmt="(A)", iostat=status) c_tmp
908 END IF
909 END IF
910 IF (status .EQ. 0) THEN
911 READ (c_tmp, fmt="(I8,9(1X,F19.10),1X,F24.10)", iostat=status) conf_nr, &
912 hmat(:, :), r_tmp
913 END IF
914 IF (status .LT. 0) THEN ! end of file reached
916 ELSE IF (status .GT. 0) THEN
917 IF (status .NE. 0) &
918 cpabort("configuration cell read error at line: "//cp_to_string(tmc_ana%lc_cell))
919 stat = tmc_status_failed
920 ELSE
921 IF (elem%nr .LT. 0) elem%nr = conf_nr
922 hmat(:, :) = hmat(:, :)/au2a
923 ! get the box scaling
924 CALL get_cell_scaling(cell=tmc_ana%cell, scaled_hmat=hmat, &
925 box_scale=elem%box_scale)
926 stat = tmc_status_ok
927 END IF
928 ! end the timing
929 CALL timestop(handle)
930 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 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 cpassert(ASSOCIATED(tmc_ana))
956
958
959 ! start the timing
960 CALL timeset(routinen, handle)
961
962 IF (PRESENT(dir_ind)) THEN
963 cpassert(ASSOCIATED(tmc_ana%dirs))
964 cpassert(dir_ind .GT. 0)
965 cpassert(dir_ind .LE. SIZE(tmc_ana%dirs))
966
967 IF (index(tmc_ana%dirs(dir_ind), "/", back=.true.) .EQ. &
968 len_trim(tmc_ana%dirs(dir_ind))) THEN
969 dir_name = trim(tmc_ana%dirs(dir_ind))
970 ELSE
971 dir_name = trim(tmc_ana%dirs(dir_ind))//"/"
972 END IF
973 ELSE
974 dir_name = "./"
975 END IF
976
977 ! open the files
978 file_name_temp = expand_file_name_temp( &
980 rvalue=tmc_ana%temperature)
981 ! position file
982 IF (tmc_ana%costum_pos_file_name .NE. "") THEN
983 file_name_act = trim(dir_name)//tmc_ana%costum_pos_file_name
984 ELSE
985 file_name_act = trim(dir_name)// &
986 expand_file_name_ending(file_name_temp, "xyz")
987 END IF
988 INQUIRE (file=file_name_act, exist=file_exists)
989 IF (file_exists) THEN
990 CALL open_file(file_name=file_name_act, file_status="OLD", &
991 file_action="READ", unit_number=tmc_ana%id_traj)
992 WRITE (tmc_ana%io_unit, fmt='(T2,A,"| ",A,T41,A40)') "TMC_ANA", &
993 "read xyz file", trim(file_name_act)
994 END IF
995
996 ! cell file
997 IF (tmc_ana%costum_cell_file_name .NE. "") THEN
998 file_name_act = trim(dir_name)//tmc_ana%costum_cell_file_name
999 ELSE
1000 file_name_act = trim(dir_name)// &
1001 expand_file_name_ending(file_name_temp, "cell")
1002 END IF
1003 INQUIRE (file=file_name_act, exist=file_exists)
1004 IF (file_exists) THEN
1005 CALL open_file(file_name=file_name_act, file_status="OLD", &
1006 file_action="READ", unit_number=tmc_ana%id_cell)
1007 WRITE (tmc_ana%io_unit, fmt='(T2,A,"| ",A,T41,A40)') "TMC_ANA", &
1008 "read cell file", trim(file_name_act)
1009 END IF
1010
1011 ! dipole file
1012 IF (tmc_ana%costum_dip_file_name .NE. "") THEN
1013 file_name_act = trim(dir_name)//tmc_ana%costum_dip_file_name
1014 ELSE
1015 file_name_act = trim(dir_name)// &
1016 expand_file_name_ending(file_name_temp, "dip")
1017 END IF
1018 INQUIRE (file=file_name_act, exist=file_exists)
1019 IF (file_exists) THEN
1020 CALL open_file(file_name=file_name_act, file_status="OLD", &
1021 file_action="READ", unit_number=tmc_ana%id_dip)
1022 WRITE (tmc_ana%io_unit, fmt='(T2,A,"| ",A,T41,A40)') "TMC_ANA", &
1023 "read dip file", trim(file_name_act)
1024 END IF
1025
1026 IF (tmc_ana%id_traj .GT. 0 .OR. tmc_ana%id_cell .GT. 0 .OR. &
1027 tmc_ana%id_dip .GT. 0) THEN
1028 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 "K in directory "//trim(dir_name))
1033 END IF
1034 ! end the timing
1035 CALL timestop(handle)
1036 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 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 cpassert(ASSOCIATED(tmc_ana))
1052
1053 ! start the timing
1054 CALL timeset(routinen, handle)
1055
1056 ! position file
1057 IF (tmc_ana%id_traj .GT. 0) CALL close_file(unit_number=tmc_ana%id_traj)
1058
1059 ! cell file
1060 IF (tmc_ana%id_cell .GT. 0) CALL close_file(unit_number=tmc_ana%id_cell)
1061
1062 ! dipole file
1063 IF (tmc_ana%id_dip .GT. 0) CALL close_file(unit_number=tmc_ana%id_dip)
1064
1065 ! end the timing
1066 CALL timestop(handle)
1067 END SUBROUTINE analyse_files_close
1068
1069END MODULE tmc_file_io
Utility routines to open and close files. Tracking of preconnections.
Definition cp_files.F:16
subroutine, public open_file(file_name, file_status, file_form, file_action, file_position, file_pad, unit_number, debug, skip_get_unit_number, file_access)
Opens the requested file using a free unit number.
Definition cp_files.F:308
subroutine, public close_file(unit_number, file_status, keep_preconnection)
Close an open file given by its logical unit number. Optionally, keep the file and unit preconnected.
Definition cp_files.F:119
logical function, public file_exists(file_name)
Checks if file exists, considering also the file discovery mechanism.
Definition cp_files.F:501
various routines to log and control the output. The idea is that decisions about where to log should ...
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public default_string_length
Definition kinds.F:57
integer, parameter, public default_path_length
Definition kinds.F:58
Definition of physical constants:
Definition physcon.F:68
real(kind=dp), parameter, public angstrom
Definition physcon.F:144
Timing routines for accounting.
Definition timings.F:17
module provides variables for the TMC analysis tool
calculation section for TreeMonteCarlo
subroutine, public get_scaled_cell(cell, box_scale, scaled_hmat, scaled_cell, vol, abc, vec)
handles properties and calculations of a scaled cell
subroutine, public get_cell_scaling(cell, scaled_hmat, box_scale)
handles properties and calculations of a scaled cell
writing and printing the files, trajectory (pos, cell, dipoles) as well as restart files
Definition tmc_file_io.F:20
subroutine, public analyse_files_close(tmc_ana)
close the files for reading configurations data to analyze
subroutine, public write_result_list_element(result_list, result_count, conf_updated, accepted, tmc_params)
select the correct configuration to print out the (coordinates, forces, cell ...)
subroutine, public print_restart_file(tmc_env, job_counts, timings)
prints out the TMC restart files with all last configurations and counters etc.
subroutine, public write_dipoles_in_file(file_name, conf_nr, dip, file_ext)
writes the cell dipoles in dipole trajectory file
subroutine, public read_element_from_file(elem, tmc_ana, conf_nr, stat)
read the trajectory element from a file from sub tree element
subroutine, public write_element_in_file(elem, tmc_params, temp_index, file_name, conf_nr, conf_info)
writes the trajectory element in a file from sub tree element
subroutine, public analyse_files_open(tmc_ana, stat, dir_ind)
opens the files for reading configurations data to analyze
character(len=default_path_length) function, public expand_file_name_char(file_name, extra)
placing a character string at the end of a file name (before the file extension)
character(len=default_path_length) function, public expand_file_name_temp(file_name, rvalue)
placing the temperature at the end of a file name (before the file extension)
character(len=default_path_length) function, public expand_file_name_int(file_name, ivalue)
placing an integer at the end of a file name (before the file extension)
subroutine, public read_restart_file(tmc_env, job_counts, timings, file_name)
reads the TMC restart file with all last configurations and counters etc.
tree nodes creation, searching, deallocation, references etc.
integer, parameter, public nr_mv_types
tree nodes creation, searching, deallocation, references etc.
Definition tmc_stati.F:15
integer, parameter, public tmc_status_failed
Definition tmc_stati.F:57
character(len= *), parameter, public tmc_default_trajectory_file_name
Definition tmc_stati.F:24
integer, parameter, public tmc_status_wait_for_new_task
Definition tmc_stati.F:52
character(len= *), parameter, public tmc_default_restart_in_file_name
Definition tmc_stati.F:28
character(len= *), parameter, public tmc_default_restart_out_file_name
Definition tmc_stati.F:26
integer, parameter, public tmc_status_ok
Definition tmc_stati.F:51
module handles definition of the tree nodes for the global and the subtrees binary tree parent elemen...
module handles definition of the tree nodes for the global and the subtrees binary tree parent elemen...
Definition tmc_types.F:32