59 character(len=256) :: config_str
106 type(electrons_t),
pointer :: sys
108 character(MAX_PATH_LEN) :: basename, folder, ref_name, ref_folder, folder_default
109 integer :: c_start, c_end, c_step, c_start_default, length, c_how
110 logical :: iterate_folder, subtract_file
111 integer,
parameter :: CONVERT_FORMAT = 1, fourier_transform = 2, operation = 3
119 message(1) =
'Info: Converting files'
134 if (basename ==
" ") basename =
""
136 length = len_trim(basename)
138 if (basename(length-3:length) ==
'.obf')
then
139 basename = trim(basename(1:length-4))
171 if (iterate_folder)
then
172 folder_default =
'td.'
175 folder_default =
'restart'
224 if (ref_name ==
" ") ref_name =
""
226 length = len_trim(ref_name)
228 if (ref_name(length-3:length) ==
'.obf')
then
229 ref_name = trim(ref_name(1:length-4))
256 CASE(fourier_transform)
259 c_start, c_end, c_step, sys%outp, subtract_file, &
260 ref_name, ref_folder)
264 c_start, c_end, c_step, sys%outp, iterate_folder, &
265 subtract_file, ref_name, ref_folder)
268 safe_deallocate_p(sys)
276 subroutine convert_low(mesh, namespace, space, ions, psolver, mc, basename, in_folder, c_start, c_end, c_step, outp, &
277 iterate_folder, subtract_file, ref_name, ref_folder)
278 class(
mesh_t),
intent(in) :: mesh
280 class(
space_t),
intent(in) :: space
281 type(
ions_t),
intent(in) :: ions
284 character(len=*),
intent(inout) :: basename
285 character(len=*),
intent(in) :: in_folder
286 integer,
intent(in) :: c_start
287 integer,
intent(in) :: c_end
288 integer,
intent(in) :: c_step
290 logical,
intent(in) :: iterate_folder
292 logical,
intent(in) :: subtract_file
293 character(len=*),
intent(inout) :: ref_name
294 character(len=*),
intent(inout) :: ref_folder
297 integer :: ierr, ii, folder_index, output_i
298 character(MAX_PATH_LEN) :: filename, out_name, folder, frmt, restart_folder
299 real(real64),
allocatable :: read_ff(:), read_rff(:), pot(:)
303 safe_allocate(read_ff(1:mesh%np))
304 safe_allocate(read_rff(1:mesh%np))
305 safe_allocate(pot(1:mesh%np))
308 write(
message(1),
'(5a,i5,a,i5,a,i5)')
"Converting '", trim(in_folder),
"/", trim(basename), &
309 "' from ", c_start,
" to ", c_end,
" every ", c_step
312 if (subtract_file)
then
313 write(
message(1),
'(a,a,a,a)')
"Reading ref-file from ", trim(ref_folder), trim(ref_name),
".obf"
315 dir=trim(ref_folder), mesh = mesh)
321 write(
message(1),
'(2a)')
"Failed to read from ref-file ", trim(ref_name)
322 write(
message(2),
'(2a)')
"from folder ", trim(ref_folder)
330 if (iterate_folder)
then
332 folder = in_folder(1:len_trim(in_folder)-1)
333 folder_index = index(folder,
'/', .
true.)
334 restart_folder = folder(1:folder_index)
336 restart_folder = in_folder
339 dir=trim(restart_folder), mesh = mesh)
341 do ii = c_start, c_end, c_step
342 if (iterate_folder)
then
344 write(folder,
'(a,i0.7,a)') in_folder(folder_index+1:len_trim(in_folder)-1),ii,
"/"
345 write(filename,
'(a,a,a)') trim(folder), trim(basename)
346 out_name = trim(basename)
349 if (c_start /= c_end)
then
353 write(frmt,
'(a,i0,a)')
"(a,i0.",10-len_trim(basename),
")"
354 write(filename, fmt=trim(frmt)) trim(basename), ii
355 write(out_name,
'(a)') trim(filename)
358 write(filename,
'(a,a,a,a)') trim(folder),
"/", trim(basename)
360 write(out_name,
'(a)') trim(basename)
370 write(
message(1),
'(a,a)')
"Error reading the file ", filename
371 write(
message(2),
'(a,i4)')
"Error code: ",ierr
372 write(
message(3),
'(a)')
"Skipping...."
376 if (subtract_file)
then
377 read_ff(:) = read_ff(:) - read_rff(:)
378 write(out_name,
'(a,a)') trim(out_name),
"-ref"
381 do output_i = lbound(outp%how, 1), ubound(outp%how, 1)
382 if (outp%how(output_i) /= 0)
then
384 trim(out_name), namespace, space, mesh, read_ff,
units_out%length**(-space%dim), ierr, &
385 pos=ions%pos, atoms=ions%atom)
388 if (outp%what(option__output__potential))
then
389 write(out_name,
'(a)')
"potential"
391 call dio_function_output(outp%how(option__output__potential), trim(restart_folder)//trim(folder), &
392 trim(out_name), namespace, space, mesh, pot,
units_out%energy, ierr, pos=ions%pos, atoms=ions%atom)
400 safe_deallocate_a(read_ff)
401 safe_deallocate_a(read_rff)
402 safe_deallocate_a(pot)
409 subroutine convert_transform(mesh, namespace, space, ions, mc, kpoints, basename, in_folder, c_start, c_end, c_step, outp, &
410 subtract_file, ref_name, ref_folder)
411 class(
mesh_t),
intent(in) :: mesh
413 class(
space_t),
intent(in) :: space
414 type(
ions_t),
intent(in) :: ions
417 character(len=*),
intent(inout) :: basename
418 character(len=*),
intent(in) :: in_folder
419 integer,
intent(in) :: c_start
420 integer,
intent(in) :: c_end
421 integer,
intent(in) :: c_step
423 logical,
intent(in) :: subtract_file
424 character(len=*),
intent(inout) :: ref_name
425 character(len=*),
intent(inout) :: ref_folder
427 integer :: ierr, i_space, i_time, nn(1:3), optimize_parity(1:3), wd_info, output_i
428 integer :: i_energy, e_end, e_start, e_point, chunk_size, read_count, t_point
429 logical :: optimize(1:3)
430 integer :: folder_index
431 character(MAX_PATH_LEN) :: filename, folder, restart_folder
432 real(real64) :: fdefault, w_max
433 real(real64),
allocatable :: read_ft(:), read_rff(:), point_tmp(:,:)
435 integer,
parameter :: FAST_FOURIER = 1, standard_fourier = 2
439 type(
batch_t) :: tdrho_b, wdrho_b
440 real(real64),
allocatable :: tdrho_a(:,:,:), wdrho_a(:,:,:)
444 complex(real64),
allocatable :: out_fft(:)
446 real(real64) :: start_time
447 integer :: time_steps
450 real(real64) :: max_energy
451 real(real64) :: min_energy
459 write(
message(1),
'(a)')
'Input: TDTimeStep must be positive.'
460 write(
message(2),
'(a)')
'Input: TDTimeStep reset to 0. Check input file'
464 call io_mkdir(
'wd.general', namespace)
487 call parse_variable(namespace,
'ConvertReadSize', mesh%np, chunk_size)
490 if (chunk_size == 0) chunk_size = mesh%np
492 if (mesh%mpi_grp%size > 1 .and. chunk_size /= mesh%np)
then
493 write(
message(1),*)
'Incompatible value for ConvertReadSize and Parallelizaion in Domains'
494 write(
message(2),*)
'Use the default value for ConvertReadSize (or set it to 0)'
499 start_time = c_start * dt
501 time_steps = (c_end - c_start) / c_step
514 if (max_energy > w_max)
then
515 write(
message(1),
'(a,f12.7)')
'Impossible to set ConvertEnergyMax to ', &
517 write(
message(2),
'(a)')
'ConvertEnergyMax is too large.'
518 write(
message(3),
'(a,f12.7,a)')
'ConvertEnergyMax reset to ', &
542 safe_allocate(read_ft(0:time_steps))
544 safe_allocate(read_rff(1:mesh%np))
546 select case (ft_method)
548 nn(1) = time_steps + 1
551 safe_allocate(out_fft(0:time_steps))
555 case (standard_fourier)
565 fdefault =
m_two *
m_pi / (dt * time_steps)
571 spectrum%start_time = c_start * dt
572 spectrum%end_time = c_end * dt
573 spectrum%energy_step = dw
574 spectrum%max_energy = max_energy
575 safe_allocate(tdrho_a(0:time_steps, 1, 1))
576 safe_allocate(wdrho_a(0:time_steps, 1, 1))
582 call kick_init(kick, namespace, space, kpoints, 1)
584 e_start = nint(min_energy / dw)
585 e_end = nint(max_energy / dw)
586 write(
message(1),
'(a,1x,i0.7,a,f12.7,a,i0.7,a,f12.7,a)')
'Frequency index:',e_start,
'(',&
592 if (subtract_file)
then
593 write(
message(1),
'(a,a,a,a)')
"Reading ref-file from ", trim(ref_folder), trim(ref_name),
".obf"
596 dir=trim(ref_folder), mesh = mesh)
602 write(
message(1),
'(2a)')
"Failed to read from ref-file ", trim(ref_name)
603 write(
message(2),
'(2a)')
"from folder ", trim(ref_folder)
609 do i_energy = e_start, e_end
610 write(filename,
'(a14,i0.7,a1)')
'wd.general/wd.',i_energy,
'/'
611 write(
message(1),
'(a,a,f12.7,a,1x,i7,a)')trim(filename),
' w =', &
616 call io_mkdir(trim(filename), namespace)
620 if (mesh%parallel_in_domains)
then
622 folder = in_folder(1:len_trim(in_folder)-1)
623 folder_index = index(folder,
'/', .
true.)
624 restart_folder = folder(1:folder_index)
626 dir=trim(restart_folder), mesh = mesh)
632 safe_allocate(point_tmp(1:chunk_size, 0:time_steps))
635 do i_space = 1, mesh%np
638 do i_time = c_start, c_end, c_step
640 if (mesh%parallel_in_domains .and. i_space == 1)
then
641 write(folder,
'(a,i0.7,a)') in_folder(folder_index+1:len_trim(in_folder)-1),i_time,
"/"
642 write(filename,
'(a,a,a)') trim(folder), trim(basename)
647 write(folder,
'(a,i0.7,a)') in_folder(1:len_trim(in_folder)-1),i_time,
"/"
648 write(filename,
'(a,a,a,a)') trim(folder), trim(basename),
".obf"
649 if (mod(i_space-1, chunk_size) == 0)
then
655 if (i_time == c_start) read_count = 0
659 if (ierr /= 0 .and. i_space == 1)
then
660 write(
message(1),
'(a,a,2i10)')
"Error reading the file ", trim(filename), i_space, i_time
661 write(
message(2),
'(a)')
"Skipping...."
662 write(
message(3),
'(a,i0)')
"Error :", ierr
667 if (i_time == c_start) read_count = read_count + 1
668 if (subtract_file)
then
669 read_ft(t_point) = point_tmp(read_count, t_point) - read_rff(i_space)
671 read_ft(t_point) = point_tmp(read_count, t_point)
674 t_point = t_point + 1
677 select case (ft_method)
683 point_tmp(read_count, 0:time_steps) = aimag(out_fft(0:time_steps)) * dt
684 case (standard_fourier)
685 tdrho_a(0:time_steps, 1, 1) = read_ft(0:time_steps)
688 call spectrum_signal_damp(spectrum%damp, spectrum%damp_factor, c_start + 1, c_start + time_steps + 1, &
689 kick%time, dt, tdrho_b)
691 c_start + 1, c_start + time_steps + 1, kick%time, dt, tdrho_b, min_energy, max_energy, &
692 spectrum%energy_step, wdrho_b)
695 do e_point = e_start, e_end
696 point_tmp(read_count, e_point) = - wdrho_a(e_point, 1, 1)
700 if (mod(i_space-1, 1000) == 0 .and.
mpi_world%rank == 0)
then
705 if (mesh%mpi_grp%size == 1)
then
706 if (mod(i_space, chunk_size) == 0)
then
708 write(
message(2),
'(a,i0)')
"Writing binary output: step ", i_space/chunk_size
710 do i_energy = e_start, e_end
711 write(filename,
'(a14,i0.7,a12)')
'wd.general/wd.',i_energy,
'/density.obf'
713 if (i_space == chunk_size)
then
724 call mesh%mpi_grp%barrier()
726 if (mesh%parallel_in_domains)
then
727 do i_energy = e_start, e_end
728 write(filename,
'(a14,i0.7,a1)')
'wd.general/wd.',i_energy,
'/'
729 do output_i = lbound(outp%how, 1), ubound(outp%how, 1)
730 if (outp%how(output_i) /= 0)
then
732 trim(
'density'), namespace, space, mesh, point_tmp(:, i_energy), &
733 units_out%length**(-space%dim), ierr, pos=ions%pos, atoms=ions%atom)
740 if (any(outp%how /= option__outputformat__binary))
then
741 do i_energy = e_start, e_end
742 write(filename,
'(a14,i0.7,a1)')
'wd.general/wd.',i_energy,
'/'
744 do output_i = lbound(outp%how, 1), ubound(outp%how, 1)
745 if ((outp%how(output_i) /= 0) .and. (outp%how(output_i) /= option__outputformat__binary))
then
747 trim(
'density'), namespace, space, mesh, read_rff, &
748 units_out%length**(-space%dim), ierr, pos=ions%pos, atoms=ions%atom)
755 safe_deallocate_a(point_tmp)
756 safe_deallocate_a(read_ft)
757 safe_deallocate_a(read_rff)
759 select case (ft_method)
761 safe_deallocate_a(out_fft)
762 case (standard_fourier)
764 safe_deallocate_a(tdrho_a)
765 safe_deallocate_a(wdrho_a)
774 class(
mesh_t),
intent(in) :: mesh
776 class(
space_t),
intent(in) :: space
777 type(
ions_t),
intent(in) :: ions
781 integer :: ierr, ip, i_op, length, n_operations, output_i
785 real(real64) :: f_re, f_im
786 real(real64),
allocatable :: tmp_ff(:), scalar_ff(:)
788 character(len=200) :: var, scalar_expression
789 character(len=MAX_PATH_LEN) :: folder, filename, out_folder, out_filename
805 if (
parse_block(namespace,
'ConvertScalarOperation', blk) == 0)
then
809 if (n_operations == 0)
then
810 write(
message(1),
'(a)')
'No operations found. Check the input file'
821 call parse_variable(namespace,
'ConvertOutputFolder',
"convert", out_folder)
823 call io_mkdir(out_folder, namespace)
833 call parse_variable(namespace,
'ConvertOutputFilename',
'density', out_filename)
835 safe_allocate(tmp_ff(1:mesh%np))
836 safe_allocate(scalar_ff(1:mesh%np))
839 do i_op = 1, n_operations
848 length = len_trim(filename)
850 if (filename(length-3:length) ==
'.obf')
then
851 filename = trim(filename(1:length-4))
857 dir=trim(folder), mesh = mesh, exact=.
true.)
861 write(
message(1),
'(2a)')
"Failed to read from file ", trim(filename)
862 write(
message(2),
'(2a)')
"from folder ", trim(folder)
869 call parse_expression(f_re, f_im, trim(var), real(tmp_ff(ip), real64), trim(scalar_expression))
871 scalar_ff(ip) = scalar_ff(ip) + f_re
880 call mesh%mpi_grp%barrier()
885 do output_i = lbound(outp%how, 1), ubound(outp%how, 1)
886 if (outp%how(output_i) /= 0)
then
887 call dio_function_output(outp%how(output_i), trim(out_folder), trim(out_filename), namespace, space, mesh, &
888 scalar_ff, units, ierr, pos=ions%pos, atoms=ions%atom)
892 safe_deallocate_a(tmp_ff)
893 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
Each program/utility that needs to use the getopt features should have an interface here – the defini...
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_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
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)
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)
subroutine, public messages_info(no_lines, iunit, verbose_limit, stress, all_nodes, namespace)
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)
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 output system
this module contains the output system
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)
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.
subroutine, public restart_module_init(namespace)
integer, parameter, public restart_undefined
subroutine, public restart_init(restart, namespace, data_type, type, mc, ierr, mesh, dir, exact)
Initializes a restart object.
integer, parameter, public restart_type_load
subroutine, public restart_end(restart)
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(len=256) function, public get_optional_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.