Octopus
conductivity.F90
Go to the documentation of this file.
1!! Copyright (C) 2015 X. Andrade
2!!
3!! This program is free software; you can redistribute it and/or modify
4!! it under the terms of the GNU General Public License as published by
5!! the Free Software Foundation; either version 2, or (at your option)
6!! any later version.
7!!
8!! This program is distributed in the hope that it will be useful,
9!! but WITHOUT ANY WARRANTY; without even the implied warranty of
10!! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11!! GNU General Public License for more details.
12!!
13!! You should have received a copy of the GNU General Public License
14!! along with this program; if not, write to the Free Software
15!! Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
16!! 02110-1301, USA.
17!!
18
19#include "global.h"
20
21program conductivity
22 use batch_oct_m
24 use global_oct_m
25 use grid_oct_m
26 use io_oct_m
27 use ions_oct_m
28 use, intrinsic :: iso_fortran_env
29 use math_oct_m
32 use parser_oct_m
34 use space_oct_m
37 use smear_oct_m
38 use unit_oct_m
40
41 implicit none
42
43 integer :: iunit, ierr, ii, jj, iter, read_iter, ntime, nvel, ivel
44 integer :: istart, iend, energy_steps, out_file
45 real(real64), allocatable :: time(:), velocities(:, :)
46 real(real64), allocatable :: total_current(:, :), ftcurr(:, :, :), curr(:, :)
47 real(real64), allocatable :: heat_current(:,:), ftheatcurr(:,:,:), heatcurr(:,:)
48 complex(real64), allocatable :: invdielectric(:, :)
49 type(ions_t), pointer :: ions
50 type(space_t) :: space
51 type(spectrum_t) :: spectrum
52 type(block_t) :: blk
53 type(batch_t) :: currb, ftcurrb, heatcurrb, ftheatcurrb
54 real(real64) :: ww, curtime, deltat, integral(1:2), v0
55 character(len=MAX_PATH_LEN) :: ref_filename
56 integer :: ref_file, time_steps_ref, kk
57 real(real64), allocatable :: velcm(:), vel0(:), current(:), current_ref(:, :)
58 real(real64) :: dt_ref, tt, start_time
59 integer :: ifreq, max_freq
60 integer :: skip, smearing
61 logical :: from_forces
62 character(len=120) :: header
63 real(real64) :: excess_charge, qtot, javerage
64
65 ! Initialize stuff
67
68 call getopt_init(ierr)
69 call getopt_end()
70
71 call parser_init()
72
73 call messages_init()
74
75 call messages_experimental('oct-conductivity')
76
77 call io_init()
79
81
83
84 call spectrum_init(spectrum, global_namespace, default_energy_step = 0.0001_real64, default_max_energy = m_one)
85
86 !%Variable ConductivitySpectrumTimeStepFactor
87 !%Type integer
88 !%Default 1
89 !%Section Utilities::oct-conductivity_spectrum
90 !%Description
91 !% In the calculation of the conductivity, it is not necessary
92 !% to read the velocity at every time step. This variable controls
93 !% the integer factor between the simulation time step and the
94 !% time step used to calculate the conductivity.
95 !%End
96
97 call messages_obsolete_variable(global_namespace, 'PropagationSpectrumTimeStepFactor', 'ConductivitySpectrumTimeStepFactor')
98 call parse_variable(global_namespace, 'ConductivitySpectrumTimeStepFactor', 1, skip)
99 if (skip <= 0) call messages_input_error(global_namespace, 'ConductivitySpectrumTimeStepFactor')
100
101 !%Variable ConductivityFromForces
102 !%Type logical
103 !%Default no
104 !%Section Utilities::oct-conductivity_spectrum
105 !%Description
106 !% (Experimental) If enabled, Octopus will attempt to calculate the conductivity from the forces instead of the current.
107 !%End
108 call parse_variable(global_namespace, 'ConductivityFromForces', .false., from_forces)
109 if (from_forces) call messages_experimental('ConductivityFromForces')
110
111 max_freq = spectrum_nenergy_steps(spectrum)
112
113 if (spectrum%end_time < m_zero) spectrum%end_time = huge(spectrum%end_time)
115 ions => ions_t(global_namespace)
116
117 !We need the total charge
118 call parse_variable(global_namespace, 'ExcessCharge', m_zero, excess_charge)
119 qtot = -(ions%val_charge() + excess_charge)
120
121 if (from_forces) then
122
123 call messages_write('Info: Reading coordinates from td.general/coordinates')
124 call messages_info()
125
126 ! Opens the coordinates files.
127 iunit = io_open('td.general/coordinates', global_namespace, action='read')
128
129 call io_skip_header(iunit)
130 call spectrum_count_time_steps(global_namespace, iunit, ntime, deltat)
131 call io_close(iunit)
132
133 nvel = ions%natoms*ions%space%dim
134
135 safe_allocate(time(1:ntime))
136 safe_allocate(velocities(1:nvel, 1:ntime))
137
138 ! Opens the coordinates files.
139 iunit = io_open('td.general/coordinates', global_namespace, action='read', status='old', die=.false.)
140
141 call io_skip_header(iunit)
142
143 ntime = 1
144 iter = 1
145
146 do
147 read(unit = iunit, iostat = ierr, fmt = *) read_iter, curtime, &
148 ((ions%pos(jj, ii), jj = 1, 3), ii = 1, ions%natoms), &
149 ((ions%vel(jj, ii), jj = 1, 3), ii = 1, ions%natoms)
150
151 curtime = units_to_atomic(units_out%time, curtime)
152
153 if (ierr /= 0 .or. curtime >= spectrum%end_time) then
154 iter = iter - 1 ! last iteration is not valid
155 ntime = ntime - 1
156 exit
157 end if
158
159 assert(iter == read_iter + 1)
160
161 if (curtime >= spectrum%start_time .and. mod(iter, skip) == 0) then
162
163 time(ntime) = curtime
164 ivel = 1
165 do ii = 1, ions%natoms
166 do jj = 1, ions%space%dim
167 velocities(ivel, ntime) = units_to_atomic(units_out%velocity, ions%vel(jj, ii))
168 ivel = ivel + 1
169 end do
170 end do
171
172 ntime = ntime + 1
173 end if
174
175 iter = iter + 1 !counts number of timesteps (with time larger than zero up to SpecEndTime)
176 end do
177
178 call io_close(iunit)
179
180 call messages_write(' done.')
181 call messages_info()
182
183 else !from_forces
184
185 call messages_write('Info: Reading total current from td.general/total_current')
186 call messages_info()
187
188 iunit = io_open('td.general/total_current', global_namespace, action='read')
189
190 if (iunit > 0) then
191
192 call io_skip_header(iunit)
193 call spectrum_count_time_steps(global_namespace, iunit, ntime, deltat)
194 deltat = units_to_atomic(units_out%time, deltat)
195 ntime = ntime + 1
196
197 call io_skip_header(iunit)
198
199 safe_allocate(total_current(1:space%dim, 1:ntime))
200 safe_allocate(heat_current(1:space%dim, 1:ntime))
201 safe_allocate(time(1:ntime))
202
203 do iter = 1, ntime
204 read(iunit, *) read_iter, time(iter), (total_current(ii, iter), ii = 1, space%dim)
205 time(iter) = units_to_atomic(units_out%time, time(iter))
206 do ii = 1, space%dim
207 total_current(ii, iter) = units_to_atomic(units_out%length/units_out%time, total_current(ii, iter))
208 end do
209 end do
210
211 call io_close(iunit)
212
213 if (parse_is_defined(global_namespace, 'TransientAbsorptionReference')) then
214 call parse_variable(global_namespace, 'TransientAbsorptionReference', '.', ref_filename)
215 ref_file = io_open(trim(ref_filename)//'/total_current', action='read', status='old', die=.false.)
216 if (ref_file < 0) then
217 message(1) = "Cannot open reference file '"//trim(io_workpath(trim(ref_filename)//'/total_current'))//"'"
218 call messages_fatal(1)
219 end if
220 call io_skip_header(ref_file)
221 call spectrum_count_time_steps(global_namespace, ref_file, time_steps_ref, dt_ref)
222 if (time_steps_ref < ntime) then
223 message(1) = "The reference calculation does not contain enought time steps"
224 call messages_fatal(1)
225 end if
226
227 if (.not. is_close(dt_ref, time(2)-time(1))) then
228 message(1) = "The time step of the reference calculation is different from the current calculation"
229 call messages_fatal(1)
230 end if
231
232 !We remove the reference
233 time_steps_ref = time_steps_ref + 1
234 safe_allocate(current_ref(1:space%dim, 1:time_steps_ref))
235 call io_skip_header(ref_file)
236 do ii = 1, time_steps_ref
237 read(ref_file, *) jj, tt, (current_ref(kk, ii), kk = 1, space%dim)
238 end do
239 call io_close(ref_file)
240 do iter = 1, ntime
241 do kk = 1, space%dim
242 total_current(kk, iter) = total_current(kk, iter) - current_ref(kk, iter)
243 end do
244 end do
245 safe_deallocate_a(current_ref)
246
247 start_time = spectrum%start_time
248 call parse_variable(global_namespace, 'GaugeFieldDelay', start_time, spectrum%start_time)
249 end if
250
251 !We substract the average value, which can cause a spurious divergence at \omega=0
252 !Only valid for non-metallic systems
253 call parse_variable(global_namespace, 'SmearingFunction', smear_semiconductor, smearing)
254 if(smearing == smear_semiconductor) then
255 do kk = 1, space%dim
256 javerage = m_zero
257 do iter = 1, ntime
258 javerage = javerage + total_current(kk, iter)
259 end do
260 javerage = javerage/ntime
261 do iter = 1, ntime
262 total_current(kk, iter) = total_current(kk, iter) - javerage
263 end do
264 end do
265 end if
266
267 else
268
269 call messages_write("Cannot find the 'td.general/total_current' file.")
270 call messages_write("Conductivity will only be calculated from the forces")
271 call messages_warning()
272
273 ntime = 1
274 safe_allocate(total_current(1:space%dim, 1:ntime))
275 safe_allocate(heat_current(1:space%dim, 1:ntime))
276 safe_allocate(time(1:ntime))
277
278 total_current(1:space%dim, 1:ntime) = m_zero
279
280 end if
281
282 iunit = io_open('td.general/total_heat_current', global_namespace, action='read', status='old', die=.false.)
283
284 if (iunit > 0) then
285
286 if (ntime == 1) then
287 call io_skip_header(iunit)
288 call spectrum_count_time_steps(global_namespace, iunit, ntime, deltat)
289 ntime = ntime + 1
290 end if
291
292 call io_skip_header(iunit)
293
294 do iter = 1, ntime
295 read(iunit, *) read_iter, time(iter), (heat_current(ii, iter), ii = 1, space%dim)
296 end do
297
298 call io_close(iunit)
299
300 else
301
302 call messages_write("Cannot find the 'td.general/heat_current' file.")
303 call messages_write("Thermal conductivity will only be calculated from the forces")
304 call messages_warning()
305
306 heat_current(1:space%dim, 1:ntime) = m_zero
307
308 end if
309 end if
310
311
312 safe_allocate(curr(ntime, 1:space%dim))
313 safe_allocate(heatcurr(ntime, 1:space%dim))
314 safe_allocate(vel0(1:space%dim))
315 safe_allocate(velcm(1:space%dim))
316 safe_allocate(current(1:space%dim))
317 integral = m_zero
318
319 if (from_forces) iunit = io_open('td.general/current_from_forces', global_namespace, action='write')
320
321 do iter = 1, ntime
322
323 if (from_forces) then
324 if (iter == 1) then
325 vel0 = m_zero
326 ivel = 1
327 do ii = 1, ions%natoms
328 do jj = 1, space%dim
329 vel0(jj) = vel0(jj) + velocities(ivel, iter)/real(ions%natoms, real64)
330 ivel = ivel + 1
331 end do
332 end do
333 end if
334
335 velcm = m_zero
336 current = m_zero
337
338 ivel = 1
339 do ii = 1, ions%natoms
340 do jj = 1, space%dim
341 velcm(jj) = velcm(jj) + velocities(ivel, iter)/real(ions%natoms, real64)
342 current(jj) = current(jj) + &
343 ions%mass(ii)/ions%latt%rcell_volume*(velocities(ivel, iter) - vel0(jj))
344 ivel = ivel + 1
345 end do
346 end do
347
348 integral(1) = integral(1) + deltat/vel0(1)*(vel0(1)*qtot/ions%latt%rcell_volume + current(1))
349 integral(2) = integral(2) + &
350 deltat/vel0(1)*(vel0(1)*qtot/ions%latt%rcell_volume - total_current(1, iter)/ions%latt%rcell_volume)
351
352 curr(iter, 1:space%dim) = vel0(1:space%dim)*qtot/ions%latt%rcell_volume + current(1:space%dim)
353
354 else
355 curr(iter, 1:space%dim) = total_current(1:space%dim, iter)/ions%latt%rcell_volume
356 heatcurr(iter,1:space%dim) = heat_current(1:space%dim, iter)/ions%latt%rcell_volume
357 end if
358
359 if (from_forces) write(iunit,*) iter, iter*deltat, curr(iter, 1:space%dim)
360
361 end do
362
363 safe_deallocate_a(velcm)
364 safe_deallocate_a(current)
365
366
367 if (from_forces) call io_close(iunit)
368
369 ! Find out the iteration numbers corresponding to the time limits.
370 call spectrum_fix_time_limits(spectrum, ntime, deltat, istart, iend, max_freq)
371 istart = max(1, istart)
372 energy_steps = spectrum_nenergy_steps(spectrum)
373
374 safe_allocate(ftcurr(1:energy_steps, 1:space%dim, 1:2))
375
376 call batch_init(currb, 1, 1, space%dim, curr)
377 call spectrum_signal_damp(spectrum%damp, spectrum%damp_factor, istart, iend, spectrum%start_time, deltat, currb)
378
379 call batch_init(ftcurrb, 1, 1, space%dim, ftcurr(:, :, 1))
380 call spectrum_fourier_transform(spectrum%method, spectrum_transform_cos, spectrum%noise, &
381 istart, iend, spectrum%start_time, deltat, currb, spectrum%min_energy, spectrum%max_energy, &
382 spectrum%energy_step, ftcurrb)
383 call ftcurrb%end()
384
385 call batch_init(ftcurrb, 1, 1, space%dim, ftcurr(:, :, 2))
386 call spectrum_fourier_transform(spectrum%method, spectrum_transform_sin, spectrum%noise, &
387 istart, iend, spectrum%start_time, deltat, currb, spectrum%min_energy, spectrum%max_energy, &
388 spectrum%energy_step, ftcurrb)
389
390 call ftcurrb%end()
391 call currb%end()
392
393
394 !and print the spectrum
395 iunit = io_open('td.general/conductivity', global_namespace, action='write')
396
397
398 write(unit = iunit, iostat = ierr, fmt = '(a)') &
399 '###########################################################################################################################'
400 write(unit = iunit, iostat = ierr, fmt = '(8a)') '# HEADER'
401 write(unit = iunit, iostat = ierr, fmt = '(a,a,a)') &
402 '# Energy [', trim(units_abbrev(units_out%energy)), '] Conductivity [a.u.] ReX ImX ReY ImY ReZ ImZ'
403 write(unit = iunit, iostat = ierr, fmt = '(a)') &
404 '###########################################################################################################################'
405
406 v0 = norm2(vel0(1:space%dim))
407 if (.not. from_forces .or. v0 < epsilon(v0)) v0 = m_one
408
409 if (.not. from_forces .and. parse_is_defined(global_namespace, 'GaugeVectorField')) then
410 if (parse_block(global_namespace, 'GaugeVectorField', blk) == 0) then
411 do ii = 1, space%dim
412 call parse_block_float(blk, 0, ii - 1, vel0(ii))
413 end do
414 call parse_block_end(blk)
415 end if
416 vel0(1:space%dim) = vel0(1:space%dim) / p_c
417 v0 = norm2(vel0(1:space%dim))
418 end if
419
420
421 do ifreq = 1, energy_steps
422 ww = spectrum%energy_step*(ifreq - 1) + spectrum%min_energy
423 write(unit = iunit, iostat = ierr, fmt = '(7e20.10)') units_from_atomic(units_out%energy, ww), &
424 transpose(ftcurr(ifreq, 1:space%dim, 1:2)/v0)
425 end do
426
427 call io_close(iunit)
428
429
430 !Compute the inverse dielectric function from the conductivity
431 ! We have \chi = -i \sigma / \omega
432 ! and \epsilon^-1 = 1 + 4 \pi \chi
433 safe_allocate(invdielectric(1:space%dim, 1:energy_steps))
434 do ifreq = 1, energy_steps
435 ww = max((ifreq-1)*spectrum%energy_step + spectrum%min_energy, m_epsilon)
436
437 invdielectric(1:space%dim, ifreq) = (vel0(1:space%dim) + m_four * m_pi * &
438 cmplx(ftcurr(ifreq, 1:space%dim, 2),-ftcurr(ifreq, 1:space%dim, 1), real64) / ww) / v0
439
440 end do
441
442 out_file = io_open('td.general/inverse_dielectric_function_from_current', global_namespace, action='write')
443 select case (space%dim)
444 case (1)
445 write(header, '(3a15)') '# energy', 'Re x', 'Im x'
446 case (2)
447 write(header, '(5a15)') '# energy', 'Re x', 'Im x', 'Re y', 'Im y'
448 case (3)
449 write(header, '(7a15)') '# energy', 'Re x', 'Im x', 'Re y', 'Im y', 'Re z', 'Im z'
450 end select
451 write(out_file,'(a)') trim(header)
452 do ifreq = 1, energy_steps
453 ww = (ifreq-1)*spectrum%energy_step + spectrum%min_energy
454 select case (space%dim)
455 case (1)
456 write(out_file, '(3e15.6)') ww, &
457 real(invdielectric(1, ifreq), real64), aimag(invdielectric(1, ifreq))
458 case (2)
459 write(out_file, '(5e15.6)') ww, &
460 real(invdielectric(1, ifreq), real64), aimag(invdielectric(1, ifreq)), &
461 real(invdielectric(2, ifreq), real64), aimag(invdielectric(2, ifreq))
462 case (3)
463 write(out_file, '(7e15.6)') ww, &
464 real(invdielectric(1, ifreq), real64), aimag(invdielectric(1, ifreq)), &
465 real(invdielectric(2, ifreq), real64), aimag(invdielectric(2, ifreq)), &
466 real(invdielectric(3, ifreq), real64), aimag(invdielectric(3, ifreq))
467 end select
468 end do
469 call io_close(out_file)
470
471 safe_deallocate_a(ftcurr)
472 safe_deallocate_a(invdielectric)
473
474
475!!!!!!!!!!!!!!!!!!!!!
476 safe_allocate(ftheatcurr(1:energy_steps, 1:space%dim, 1:2))
477
478 ftheatcurr = m_one
479
480 call batch_init(heatcurrb, 1, 1, space%dim, heatcurr)
481
482 call spectrum_signal_damp(spectrum%damp, spectrum%damp_factor, 1, ntime, m_zero, deltat, heatcurrb)
483
484 call batch_init(ftheatcurrb, 1, 1, space%dim, ftheatcurr(:, :, 1))
485 call spectrum_fourier_transform(spectrum%method, spectrum_transform_cos, spectrum%noise, &
486 1, ntime, m_zero, deltat, heatcurrb, spectrum%min_energy, spectrum%max_energy, spectrum%energy_step, ftheatcurrb)
487 call ftheatcurrb%end()
488
489 call batch_init(ftheatcurrb, 1, 1, space%dim, ftheatcurr(:, :, 2))
490 call spectrum_fourier_transform(spectrum%method, spectrum_transform_sin, spectrum%noise, &
491 1, ntime, m_zero, deltat, heatcurrb, spectrum%min_energy, spectrum%max_energy, spectrum%energy_step, ftheatcurrb)
492 call ftheatcurrb%end()
493
494 call heatcurrb%end()
495
496
497 !and print the spectrum
498 iunit = io_open('td.general/heat_conductivity', global_namespace, action='write')
499
500
501 write(unit = iunit, iostat = ierr, fmt = '(a)') &
502 '###########################################################################################################################'
503 write(unit = iunit, iostat = ierr, fmt = '(8a)') '# HEADER'
504 write(unit = iunit, iostat = ierr, fmt = '(a,a,a)') &
505 '# Energy [', trim(units_abbrev(units_out%energy)), '] Conductivity [a.u.] ReX ImX ReY ImY ReZ ImZ'
506 write(unit = iunit, iostat = ierr, fmt = '(a)') &
507 '###########################################################################################################################'
508
509 v0 = norm2(vel0(1:space%dim))
510 if (.not. from_forces .or. v0 < epsilon(v0)) v0 = m_one
511
512 do ifreq = 1, energy_steps
513 ww = spectrum%energy_step*(ifreq - 1) + spectrum%min_energy
514 write(unit = iunit, iostat = ierr, fmt = '(7e20.10)') units_from_atomic(units_out%energy, ww), &
515 transpose(ftheatcurr(ifreq, 1:space%dim, 1:2)/v0)
516 !print *, ifreq, ftheatcurr(ifreq, 1:3, 1:2)
517 end do
518
519 call io_close(iunit)
520
521 safe_deallocate_a(ftheatcurr)
522 safe_deallocate_a(vel0)
523!!!!!!!!!!!!!!!!!!!!!!!!!!!
524
525
526 safe_deallocate_p(ions)
527
528 safe_deallocate_a(total_current)
529 safe_deallocate_a(heat_current)
530 safe_deallocate_a(time)
531
533 call io_end()
534 call messages_end()
535
536 call parser_end()
537 call global_end()
538
539end program conductivity
540
541!! Local Variables:
542!! mode: f90
543!! coding: utf-8
544!! End:
program conductivity
initialize a batch with existing memory
Definition: batch.F90:267
This module implements batches of mesh functions.
Definition: batch.F90:133
subroutine, public getopt_init(ierr)
Initializes the getopt machinery. Must be called before attempting to parse the options....
subroutine, public getopt_end
subroutine, public global_end()
Finalise parser varinfo file, and MPI.
Definition: global.F90:381
real(real64), parameter, public m_zero
Definition: global.F90:187
real(real64), parameter, public m_four
Definition: global.F90:191
real(real64), parameter, public m_pi
some mathematical constants
Definition: global.F90:185
type(mpi_comm), parameter, public serial_dummy_comm
Alias MPI_COMM_UNDEFINED for the specific use case of initialising Octopus utilities with no MPI supp...
Definition: global.F90:264
subroutine, public init_octopus_globals(comm)
Initialise Octopus-specific global constants and files. This routine performs no initialisation calls...
Definition: global.F90:353
real(real64), parameter, public m_epsilon
Definition: global.F90:203
real(real64), parameter, public p_c
Electron gyromagnetic ratio, see Phys. Rev. Lett. 130, 071801 (2023)
Definition: global.F90:223
real(real64), parameter, public m_one
Definition: global.F90:188
This module implements the underlying real-space grid.
Definition: grid.F90:117
Definition: io.F90:114
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...
Definition: io.F90:166
subroutine, public io_close(iunit, grp)
Definition: io.F90:468
subroutine, public io_skip_header(iunit)
Definition: io.F90:679
subroutine, public io_end()
Definition: io.F90:265
character(len=max_path_len) function, public io_workpath(path, namespace)
Definition: io.F90:313
integer function, public io_open(file, namespace, action, status, form, position, die, recl, grp)
Definition: io.F90:395
This module is intended to contain "only mathematical" functions and procedures.
Definition: math.F90:115
subroutine, public messages_end()
Definition: messages.F90:277
subroutine, public messages_init(output_dir)
Definition: messages.F90:224
subroutine, public messages_warning(no_lines, all_nodes, namespace)
Definition: messages.F90:543
subroutine, public messages_obsolete_variable(namespace, name, rep)
Definition: messages.F90:1057
subroutine, public messages_info(no_lines, iunit, verbose_limit, stress, all_nodes, namespace)
Definition: messages.F90:624
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
Definition: messages.F90:160
subroutine, public messages_fatal(no_lines, only_root_writes, namespace)
Definition: messages.F90:420
subroutine, public messages_input_error(namespace, var, details, row, column)
Definition: messages.F90:723
subroutine, public messages_experimental(name, namespace)
Definition: messages.F90:1097
type(namespace_t), public global_namespace
Definition: namespace.F90:132
logical function, public parse_is_defined(namespace, name)
Definition: parser.F90:502
subroutine, public parser_init()
Initialise the Octopus parser.
Definition: parser.F90:450
subroutine, public parser_end()
End the Octopus parser.
Definition: parser.F90:481
integer function, public parse_block(namespace, name, blk, check_varinfo_)
Definition: parser.F90:618
subroutine, public profiling_end(namespace)
Definition: profiling.F90:413
subroutine, public profiling_init(namespace)
Create profiling subdirectory.
Definition: profiling.F90:255
integer, parameter, public smear_semiconductor
Definition: smear.F90:171
subroutine, public spectrum_fix_time_limits(spectrum, time_steps, dt, istart, iend, ntiter)
Definition: spectrum.F90:2508
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...
Definition: spectrum.F90:2638
subroutine, public spectrum_init(spectrum, namespace, default_energy_step, default_max_energy)
Definition: spectrum.F90:213
subroutine, public spectrum_signal_damp(damp_type, damp_factor, time_start, time_end, t0, time_step, time_function)
Definition: spectrum.F90:2552
integer, parameter, public spectrum_transform_cos
Definition: spectrum.F90:171
integer, parameter, public spectrum_transform_sin
Definition: spectrum.F90:171
subroutine, public spectrum_count_time_steps(namespace, iunit, time_steps, dt)
Definition: spectrum.F90:2386
pure integer function, public spectrum_nenergy_steps(spectrum)
Definition: spectrum.F90:2947
brief This module defines the class unit_t which is used by the unit_systems_oct_m module.
Definition: unit.F90:132
character(len=20) pure function, public units_abbrev(this)
Definition: unit.F90:223
This module defines the unit system, used for input and output.
type(unit_system_t), public units_out
subroutine, public unit_system_init(namespace)