58 character(len=256) :: config_str
104 class(electrons_t),
pointer :: sys
106 character(MAX_PATH_LEN) :: basename, folder, ref_name, ref_folder, folder_default
107 integer :: c_start, c_end, c_step, c_start_default, length, c_how
108 logical :: iterate_folder, subtract_file
109 integer,
parameter :: CONVERT_FORMAT = 1, fourier_transform = 2, operation = 3
116 message(1) =
'Info: Converting files'
131 if (basename ==
" ") basename =
""
133 length = len_trim(basename)
135 if (basename(length-3:length) ==
'.obf')
then
136 basename = trim(basename(1:length-4))
168 if (iterate_folder)
then
169 folder_default =
'output_iter/td.'
172 folder_default =
'restart'
221 if (ref_name ==
" ") ref_name =
""
223 length = len_trim(ref_name)
225 if (ref_name(length-3:length) ==
'.obf')
then
226 ref_name = trim(ref_name(1:length-4))
253 CASE(fourier_transform)
256 c_start, c_end, c_step, sys%outp, subtract_file, &
257 ref_name, ref_folder)
261 c_start, c_end, c_step, sys%outp, iterate_folder, &
262 subtract_file, ref_name, ref_folder)
265 safe_deallocate_p(sys)
273 subroutine convert_low(mesh, namespace, space, ions, psolver, mc, basename, in_folder, c_start, c_end, c_step, outp, &
274 iterate_folder, subtract_file, ref_name, ref_folder)
275 class(
mesh_t),
intent(in) :: mesh
277 class(
space_t),
intent(in) :: space
278 type(
ions_t),
intent(in) :: ions
281 character(len=*),
intent(inout) :: basename
282 character(len=*),
intent(in) :: in_folder
283 integer,
intent(in) :: c_start
284 integer,
intent(in) :: c_end
285 integer,
intent(in) :: c_step
287 logical,
intent(in) :: iterate_folder
289 logical,
intent(in) :: subtract_file
290 character(len=*),
intent(inout) :: ref_name
291 character(len=*),
intent(inout) :: ref_folder
294 integer :: ierr, ii, folder_index, output_i
295 character(MAX_PATH_LEN) :: filename, out_name, folder, frmt, restart_folder
296 real(real64),
allocatable :: read_ff(:), read_rff(:), pot(:)
300 safe_allocate(read_ff(1:mesh%np))
301 safe_allocate(read_rff(1:mesh%np))
302 safe_allocate(pot(1:mesh%np))
305 write(
message(1),
'(5a,i5,a,i5,a,i5)')
"Converting '", trim(in_folder),
"/", trim(basename), &
306 "' from ", c_start,
" to ", c_end,
" every ", c_step
309 if (subtract_file)
then
310 write(
message(1),
'(a,a,a,a)')
"Reading ref-file from ", trim(ref_folder), trim(ref_name),
".obf"
312 dir=trim(ref_folder), mesh = mesh)
315 call restart%read_mesh_function(trim(ref_name), mesh, read_rff, ierr)
318 write(
message(1),
'(2a)')
"Failed to read from ref-file ", trim(ref_name)
319 write(
message(2),
'(2a)')
"from folder ", trim(ref_folder)
327 if (iterate_folder)
then
329 folder = in_folder(1:len_trim(in_folder)-1)
330 folder_index = index(folder,
'/', .
true.)
331 if(folder_index > 0) restart_folder = folder(1:folder_index)
333 restart_folder = in_folder
336 dir=trim(restart_folder), mesh = mesh)
338 do ii = c_start, c_end, c_step
339 if (iterate_folder)
then
341 write(folder,
'(a,i0.7,a)') in_folder(folder_index+1:len_trim(in_folder)-1),ii,
"/"
342 write(filename,
'(a,a,a)') trim(folder), trim(basename)
343 out_name = trim(basename)
346 if (c_start /= c_end)
then
350 write(frmt,
'(a,i0,a)')
"(a,i0.",10-len_trim(basename),
")"
351 write(filename, fmt=trim(frmt)) trim(basename), ii
352 write(out_name,
'(a)') trim(filename)
355 write(filename,
'(a,a,a,a)') trim(folder),
"/", trim(basename)
357 write(out_name,
'(a)') trim(basename)
362 call restart%read_mesh_function(trim(filename), mesh, read_ff, ierr)
365 write(
message(1),
'(a,a)')
"Error reading the file ", trim(filename)
366 write(
message(2),
'(a,i4)')
"Error code: ",ierr
367 write(
message(3),
'(a)')
"Skipping...."
371 if (subtract_file)
then
372 read_ff(:) = read_ff(:) - read_rff(:)
373 write(out_name,
'(a,a)') trim(out_name),
"-ref"
376 do output_i = lbound(outp%how, 1), ubound(outp%how, 1)
377 if (outp%how(output_i) /= 0)
then
379 trim(out_name), namespace, space, mesh, read_ff,
units_out%length**(-space%dim), ierr, &
380 pos=ions%pos, atoms=ions%atom)
383 if (outp%what(option__output__potential))
then
384 write(out_name,
'(a)')
"potential"
386 call dio_function_output(outp%how(option__output__potential), trim(restart_folder)//trim(folder), &
387 trim(out_name), namespace, space, mesh, pot,
units_out%energy, ierr, pos=ions%pos, atoms=ions%atom)
395 safe_deallocate_a(read_ff)
396 safe_deallocate_a(read_rff)
397 safe_deallocate_a(pot)
404 subroutine convert_transform(mesh, namespace, space, ions, mc, kpoints, basename, in_folder, c_start, c_end, c_step, outp, &
405 subtract_file, ref_name, ref_folder)
406 class(
mesh_t),
intent(in) :: mesh
408 class(
space_t),
intent(in) :: space
409 type(
ions_t),
intent(in) :: ions
412 character(len=*),
intent(inout) :: basename
413 character(len=*),
intent(in) :: in_folder
414 integer,
intent(in) :: c_start
415 integer,
intent(in) :: c_end
416 integer,
intent(in) :: c_step
418 logical,
intent(in) :: subtract_file
419 character(len=*),
intent(inout) :: ref_name
420 character(len=*),
intent(inout) :: ref_folder
422 integer :: ierr, i_space, i_time, nn(1:3), optimize_parity(1:3), wd_info, output_i
423 integer :: i_energy, e_end, e_start, e_point, chunk_size, read_count, t_point
424 logical :: optimize(1:3)
425 integer :: folder_index
426 character(MAX_PATH_LEN) :: filename, folder, restart_folder
427 real(real64) :: fdefault, w_max
428 real(real64),
allocatable :: read_ft(:), read_rff(:), point_tmp(:,:)
430 integer,
parameter :: FAST_FOURIER = 1, standard_fourier = 2
434 type(
batch_t) :: tdrho_b, wdrho_b
435 real(real64),
allocatable :: tdrho_a(:,:,:), wdrho_a(:,:,:)
439 complex(real64),
allocatable :: out_fft(:)
441 real(real64) :: start_time
442 integer :: time_steps
445 real(real64) :: max_energy
446 real(real64) :: min_energy
454 write(
message(1),
'(a)')
'Input: TDTimeStep must be positive.'
458 call io_mkdir(
'wd.general', namespace)
481 call parse_variable(namespace,
'ConvertReadSize', mesh%np, chunk_size)
484 if (chunk_size == 0) chunk_size = mesh%np
486 if (mesh%mpi_grp%size > 1 .and. chunk_size /= mesh%np)
then
487 write(
message(1),*)
'Incompatible value for ConvertReadSize and Parallelizaion in Domains'
488 write(
message(2),*)
'Use the default value for ConvertReadSize (or set it to 0)'
493 if (c_step <= 0)
then
494 write(
message(1),
'(a)')
'Input: ConvertStep must be positive for Fourier transform.'
498 start_time = c_start * dt
500 time_steps = (c_end - c_start) / c_step
501 if (time_steps <= 0)
then
502 write(
message(1),
'(a)')
'Input: ConvertEnd must be larger than ConvertStart for Fourier transform.'
517 if (max_energy > w_max)
then
518 write(
message(1),
'(a,f12.7)')
'Impossible to set ConvertEnergyMax to ', &
520 write(
message(2),
'(a)')
'ConvertEnergyMax is too large.'
521 write(
message(3),
'(a,f12.7,a)')
'ConvertEnergyMax reset to ', &
545 safe_allocate(read_ft(0:time_steps))
547 safe_allocate(read_rff(1:mesh%np))
549 select case (ft_method)
551 nn(1) = time_steps + 1
554 safe_allocate(out_fft(0:time_steps))
559 case (standard_fourier)
569 fdefault =
m_two *
m_pi / (dt * time_steps)
575 spectrum%start_time = c_start * dt
576 spectrum%end_time = c_end * dt
577 spectrum%energy_step = dw
578 spectrum%max_energy = max_energy
579 safe_allocate(tdrho_a(0:time_steps, 1, 1))
580 safe_allocate(wdrho_a(0:time_steps, 1, 1))
586 call kick_init(kick, namespace, space, kpoints, 1)
588 e_start = nint(min_energy / dw)
589 e_end = nint(max_energy / dw)
590 write(
message(1),
'(a,1x,i0.7,a,f12.7,a,i0.7,a,f12.7,a)')
'Frequency index:',e_start,
'(',&
596 if (subtract_file)
then
597 write(
message(1),
'(a,a,a,a)')
"Reading ref-file from ", trim(ref_folder), trim(ref_name),
".obf"
600 dir=trim(ref_folder), mesh = mesh)
603 call restart%read_mesh_function(trim(ref_name), mesh, read_rff, ierr)
606 write(
message(1),
'(2a)')
"Failed to read from ref-file ", trim(ref_name)
607 write(
message(2),
'(2a)')
"from folder ", trim(ref_folder)
613 do i_energy = e_start, e_end
614 write(filename,
'(a14,i0.7,a1)')
'wd.general/wd.',i_energy,
'/'
615 write(
message(1),
'(a,a,f12.7,a,1x,i7,a)')trim(filename),
' w =', &
620 call io_mkdir(trim(filename), namespace)
624 if (mesh%parallel_in_domains)
then
626 folder = in_folder(1:len_trim(in_folder)-1)
627 folder_index = index(folder,
'/', .
true.)
628 restart_folder = folder(1:folder_index)
630 dir=trim(restart_folder), mesh = mesh)
636 safe_allocate(point_tmp(1:chunk_size, 0:time_steps))
639 do i_space = 1, mesh%np
643 do i_time = c_start, c_end, c_step
645 if (mesh%parallel_in_domains .and. i_space == 1)
then
646 write(folder,
'(a,i0.7,a)') in_folder(folder_index+1:len_trim(in_folder)-1),i_time,
"/"
647 write(filename,
'(a,a,a)') trim(folder), trim(basename)
648 call restart%read_mesh_function(trim(filename), mesh, point_tmp(:, t_point), ierr)
652 write(folder,
'(a,i0.7,a)') in_folder(1:len_trim(in_folder)-1),i_time,
"/"
653 write(filename,
'(a,a,a,a)') trim(folder), trim(basename),
".obf"
654 if (mod(i_space-1, chunk_size) == 0)
then
660 if (i_time == c_start) read_count = 0
664 if (ierr /= 0 .and. i_space == 1)
then
665 write(
message(1),
'(a,a,2i10)')
"Error reading the file ", trim(filename), i_space, i_time
666 write(
message(2),
'(a)')
"Skipping...."
667 write(
message(3),
'(a,i0)')
"Error :", ierr
672 if (i_time == c_start) read_count = read_count + 1
673 if (subtract_file)
then
674 read_ft(t_point) = point_tmp(read_count, t_point) - read_rff(i_space)
676 read_ft(t_point) = point_tmp(read_count, t_point)
679 t_point = t_point + 1
682 select case (ft_method)
689 point_tmp(read_count, 0:time_steps) = aimag(out_fft(0:time_steps)) * dt
690 case (standard_fourier)
691 tdrho_a(0:time_steps, 1, 1) = read_ft(0:time_steps)
694 call spectrum_signal_damp(spectrum%damp, spectrum%damp_factor, c_start + 1, c_start + time_steps + 1, &
695 kick%time, dt, tdrho_b)
697 c_start + 1, c_start + time_steps + 1, kick%time, dt, tdrho_b, min_energy, max_energy, &
698 spectrum%energy_step, wdrho_b)
701 do e_point = e_start, e_end
702 point_tmp(read_count, e_point) = - wdrho_a(e_point, 1, 1)
706 if (mod(i_space-1, 1000) == 0 .and.
mpi_world%is_root())
then
711 if (mesh%mpi_grp%size == 1)
then
712 if (mod(i_space, chunk_size) == 0)
then
714 write(
message(2),
'(a,i0)')
"Writing binary output: step ", i_space/chunk_size
716 do i_energy = e_start, e_end
717 write(filename,
'(a14,i0.7,a12)')
'wd.general/wd.',i_energy,
'/density.obf'
719 if (i_space == chunk_size)
then
730 if (mesh%mpi_grp%size == 1)
then
731 if (mod(mesh%np, chunk_size) /= 0)
then
732 do i_energy = e_start, e_end
733 write(filename,
'(a14,i0.7,a12)')
'wd.general/wd.',i_energy,
'/density.obf'
734 if (mesh%np < chunk_size)
call dwrite_header(trim(filename), mesh%np_global, ierr)
736 point_tmp(1:mod(mesh%np, chunk_size), i_energy), ierr, nohead=.
true.)
742 call mesh%mpi_grp%barrier()
744 if (mesh%parallel_in_domains)
then
745 do i_energy = e_start, e_end
746 write(filename,
'(a14,i0.7,a1)')
'wd.general/wd.',i_energy,
'/'
747 do output_i = lbound(outp%how, 1), ubound(outp%how, 1)
748 if (outp%how(output_i) /= 0)
then
750 trim(
'density'), namespace, space, mesh, point_tmp(:, i_energy), &
751 units_out%length**(-space%dim), ierr, pos=ions%pos, atoms=ions%atom)
758 if (any(outp%how /= option__outputformat__binary))
then
759 do i_energy = e_start, e_end
760 write(filename,
'(a14,i0.7,a1)')
'wd.general/wd.',i_energy,
'/'
762 do output_i = lbound(outp%how, 1), ubound(outp%how, 1)
763 if ((outp%how(output_i) /= 0) .and. (outp%how(output_i) /= option__outputformat__binary))
then
765 trim(
'density'), namespace, space, mesh, read_rff, &
766 units_out%length**(-space%dim), ierr, pos=ions%pos, atoms=ions%atom)
773 safe_deallocate_a(point_tmp)
774 safe_deallocate_a(read_ft)
775 safe_deallocate_a(read_rff)
777 select case (ft_method)
779 safe_deallocate_a(out_fft)
780 case (standard_fourier)
781 safe_deallocate_a(tdrho_a)
782 safe_deallocate_a(wdrho_a)
793 class(
mesh_t),
intent(in) :: mesh
795 class(
space_t),
intent(in) :: space
796 type(
ions_t),
intent(in) :: ions
800 integer :: ierr, ip, i_op, length, n_operations, output_i
804 real(real64) :: f_re, f_im
805 real(real64),
allocatable :: tmp_ff(:), scalar_ff(:)
807 character(len=200) :: var, scalar_expression
808 character(len=MAX_PATH_LEN) :: folder, filename, out_folder, out_filename
824 if (
parse_block(namespace,
'ConvertScalarOperation', blk) == 0)
then
828 if (n_operations == 0)
then
829 write(
message(1),
'(a)')
'No operations found. Check the input file'
840 call parse_variable(namespace,
'ConvertOutputFolder',
"convert", out_folder)
842 call io_mkdir(out_folder, namespace)
852 call parse_variable(namespace,
'ConvertOutputFilename',
'density', out_filename)
854 safe_allocate(tmp_ff(1:mesh%np))
855 safe_allocate(scalar_ff(1:mesh%np))
858 do i_op = 1, n_operations
867 length = len_trim(filename)
869 if (filename(length-3:length) ==
'.obf')
then
870 filename = trim(filename(1:length-4))
876 dir=trim(folder), mesh = mesh, exact=.
true.)
878 call restart%read_mesh_function(trim(filename), mesh, tmp_ff, ierr)
880 write(
message(1),
'(2a)')
"Failed to read mesh function ", trim(filename)
881 write(
message(2),
'(a,i0)')
"Error code: ", ierr
885 write(
message(1),
'(2a)')
"Failed to read from file ", trim(filename)
886 write(
message(2),
'(2a)')
"from folder ", trim(folder)
893 call parse_expression(f_re, f_im, trim(var), real(tmp_ff(ip), real64), trim(scalar_expression))
895 scalar_ff(ip) = scalar_ff(ip) + f_re
904 call mesh%mpi_grp%barrier()
909 do output_i = lbound(outp%how, 1), ubound(outp%how, 1)
910 if (outp%how(output_i) /= 0)
then
911 call dio_function_output(outp%how(output_i), trim(out_folder), trim(out_filename), namespace, space, mesh, &
912 scalar_ff, units, ierr, pos=ions%pos, atoms=ions%atom)
916 safe_deallocate_a(tmp_ff)
917 safe_deallocate_a(scalar_ff)
program oct_convert
This utility runs in parallel and can be used for post-processing of the results of Output.
subroutine convert_low(mesh, namespace, space, ions, psolver, mc, basename, in_folder, c_start, c_end, c_step, outp, iterate_folder, subtract_file, ref_name, ref_folder)
Giving a range of input files, it writes the corresponding output files.
subroutine convert_operate(mesh, namespace, space, ions, mc, outp)
Given a set of mesh function operations it computes a a resulting mesh function from linear combinati...
subroutine convert_transform(mesh, namespace, space, ions, mc, kpoints, basename, in_folder, c_start, c_end, c_step, outp, subtract_file, ref_name, ref_folder)
Giving a range of input files, it computes the Fourier transform of the file.
initialize a batch with existing memory
Prints out to iunit a message in the form: ["InputVariable" = value] where "InputVariable" is given b...
static void convert(multi *in, multi *out, int t_in, int t_out)
This module implements batches of mesh functions.
This module handles the calculation mode.
type(calc_mode_par_t), public calc_mode_par
Singleton instance of parallel calculation mode.
integer, parameter, public p_strategy_states
parallelization in states
subroutine, public getopt_octopus(config_str)
subroutine, public getopt_init(ierr)
Initializes the getopt machinery. Must be called before attempting to parse the options....
subroutine, public getopt_end
Fast Fourier Transform module. This module provides a single interface that works with different FFT ...
subroutine, public fft_init(this, nn, dim, type, library, optimize, optimize_parity, comm, mpi_grp, use_aligned)
subroutine, public fft_all_init(namespace)
initialize the table
subroutine, public fft_all_end()
delete all plans
integer, parameter, public fft_real
integer, parameter, public fftlib_fftw
real(real64), parameter, public m_two
subroutine, public global_end()
Finalise parser varinfo file, and MPI.
real(real64), parameter, public m_zero
real(real64), parameter, public m_pi
some mathematical constants
complex(real64), parameter, public m_z0
subroutine, public global_init(communicator)
Initialise Octopus.
subroutine, public dwrite_header(fname, np_global, ierr)
subroutine, public dio_function_output(how, dir, fname, namespace, space, mesh, ff, unit, ierr, pos, atoms, grp, root)
Top-level IO routine for functions defined on the mesh.
subroutine, public io_init(defaults)
If the argument defaults is present and set to true, then the routine will not try to read anything f...
subroutine, public io_close(iunit, grp)
subroutine, public io_end()
subroutine, public io_mkdir(fname, namespace, parents)
integer function, public io_open(file, namespace, action, status, form, position, die, recl, grp)
subroutine, public kick_end(kick)
subroutine, public kick_init(kick, namespace, space, kpoints, nspin)
System information (time, memory, sysname)
subroutine, public loct_progress_bar(a, maxcount)
A wrapper around the progress bar, such that it can be silenced without needing to dress the call wit...
This module defines the meshes, which are used in Octopus.
subroutine, public messages_end()
subroutine, public messages_print_with_emphasis(msg, iunit, namespace)
character(len=512), private msg
subroutine, public messages_init(output_dir)
subroutine, public messages_warning(no_lines, all_nodes, namespace)
subroutine, public print_date(str)
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
subroutine, public messages_fatal(no_lines, only_root_writes, namespace)
subroutine, public messages_experimental(name, namespace)
subroutine, public messages_info(no_lines, iunit, debug_only, stress, all_nodes, namespace)
type(mpi_grp_t), public mpi_world
This module handles the communicators for the various parallelization strategies.
type(namespace_t), public global_namespace
this module contains the low-level part of the output system
this module contains the output system
subroutine, public parse_block_string(blk, l, c, res, convert_to_c)
subroutine, public parser_init()
Initialise the Octopus parser.
subroutine, public parser_end()
End the Octopus parser.
integer function, public parse_block(namespace, name, blk, check_varinfo_)
subroutine, public dpoisson_solve(this, namespace, pot, rho, all_nodes, kernel, reset)
Calculates the Poisson equation. Given the density returns the corresponding potential.
subroutine, public profiling_end(namespace)
subroutine, public profiling_out(label)
Increment out counter and sum up difference between entry and exit time.
subroutine, public profiling_in(label, exclude)
Increment in counter and save entry time.
subroutine, public profiling_init(namespace)
Create profiling subdirectory.
integer, parameter, public restart_undefined
integer, parameter, public restart_type_load
subroutine, public spectrum_fourier_transform(method, transform, noise, time_start, time_end, t0, time_step, time_function, energy_start, energy_end, energy_step, energy_function)
Computes the sine, cosine, (or "exponential") Fourier transform of the real function given in the tim...
subroutine, public spectrum_init(spectrum, namespace, default_energy_step, default_max_energy)
subroutine, public spectrum_signal_damp(damp_type, damp_factor, time_start, time_end, t0, time_step, time_function)
subroutine, public add_last_slash(str)
Adds a '/' in the end of the string, only if it missing. Useful for directories.
brief This module defines the class unit_t which is used by the unit_systems_oct_m module.
character(len=20) pure function, public units_abbrev(this)
This module defines the unit system, used for input and output.
type(unit_system_t), public units_out
subroutine, public unit_system_init(namespace)
type(unit_system_t), public units_inp
the units systems for reading and writing
This module is intended to contain simple general-purpose utility functions and procedures.
character(len=256) function, public get_config_opts()
Character string containing compile-time options.
character(len=256) function, public get_optional_libraries()
Character string containing optional external libraries.
subroutine, public print_header()
This subroutine prints the logo followed by information about the compilation and the system....
Class defining batches of mesh functions.
Class describing the electron system.
Describes mesh distribution to nodes.
Stores all communicators and groups.