power_spectrum
Module
Description
$Id$
MODULE_DOC: reads in full snapshot and calculates power spetrum of u
** AUTOMATIC CPARAM.INC GENERATION ************************ Declare (for generation of cparam.inc) the number of f array variables and auxiliary variables added by this module
CPARAM logical, parameter :: lpower_spectrum = .true.
MVAR CONTRIBUTION 0 MAUX CONTRIBUTION 0
PENCILS PROVIDED
23-sep-02/nils: adapted from postproc/src/power_spectrum.f90 14-mar-06/axel: made kx,ky,kz going only in integers. Works only for cubes. 11-nov-10/MR: intro’d flags for shell integration and z integration, for that, changed namelist run_pars and corresp. read and write subroutines; corresp. changes at the moment only in effect in power_xy 27-sep-2023/KG: fixed calculation of wavenumbers for non-cubical boxes in
power and power_xy
20-may-25/axel: introduced lcorrect_integer_kcalc=F (=T for correct 1D calc)
Quick access
- Variables:
a_im,a_re,a_vec_im,a_vec_re,allocate_workbuffers,b_im,b_re,b_vec_re,c_im,c_re,ckxrange,ckyrange,comp_spectrum_xy,crossspec_parallel_portion,crossspec_parse_spec,czrange,d_im,d_re,dist_output_by_range,firstout,get_k,get_k2,get_k2_old,get_k2_xy,get_kranges,glq_weight,h_im,h_re,k2s,kout_max,kshell,kxrange,kyrange,l_min,l_min_xy,lcorrect_integer_kcalc,lcylindrical_spectra,legendre_lmax,legendre_zeros,lglq_dot_dat_exists,lhalf_factor_in_gw,lhorizontal_spectra,lintegrate_shell,lintegrate_z,lpdf_2d_variable_range,lpowerdat_existed,lpowerxy_hdf5,lread_gauss_quadrature,lshear_frame_correlation,lsplit_power_xy_in_z,ltrue_binning,lvertical_spectra,lzero_spec_zerok,m_loc,max_k2,n_glq,n_loc,n_segment_x,n_spectra,nk_truebin,nk_xy,nk_xyz,output_elements_by_range,output_power_complex_hdf5,parse_pdf_string,pdf_max,pdf_max_logscale,pdf_min,pdf_min_logscale,pdfy_max,pdfy_max_logscale,pdfy_min,pdfy_min_logscale,power_2d_parallel_portion,power_format,power_parallel_portion,power_shell_filter,specflux_dp,specflux_dq,specflux_pmax,specflux_pmin,timestamp_format,tout_max,tout_min,unpack_range,warn_non_cubical- Routines:
crossspec(),initialize_power_spectrum(),pdf(),pdf1d_ang(),pdf_2d(),polar_spectrum(),power(),power1d_plane(),power_1d(),power_2d(),power_cor(),power_cor_scl(),power_fft3d_vec(),power_phi(),power_transfer_mag(),power_vec(),power_xy(),poweremf(),powergws(),powerhel(),powerhel_phi(),powerlor(),poweromu(),powerscl(),powertra(),quadratic_invariants(),read_power_spectrum_run_pars(),write_power_spectrum_run_pars()
Needed modules
cdata: $Id$messages(svn_id(),warning(),fatal_error(),information(),not_implemented()): $Id$mpicomm(mpi_comm_grid(),mpi_comm_pencil(),mpi_comm_xbeam(),mpi_comm_ybeam(),mpi_comm_zbeam(),mpi_comm_xyplane(),mpi_comm_xzplane(),mpi_comm_yzplane()): $Id$
Variables
- power_spectrum/a2 (*,*,*) [real,private/allocatable]
- power_spectrum/a_im (*,*,*) [real,private/allocatable]
- power_spectrum/a_re (*,*,*) [real,private/allocatable]
- power_spectrum/a_vec_im (*,*,*,*) [real,private/allocatable]
- power_spectrum/a_vec_re (*,*,*,*) [real,private/allocatable]
- power_spectrum/allocate_workbuffers [private]
- power_spectrum/b_im (*,*,*) [real,private/allocatable]
- power_spectrum/b_re (*,*,*) [real,private/allocatable]
- power_spectrum/b_vec_re (*,*,*,*) [real,private/allocatable]
- power_spectrum/c_im (*,*,*) [real,private/allocatable]
- power_spectrum/c_re (*,*,*) [real,private/allocatable]
- power_spectrum/ckxrange [character,private/optional/default='']
PAR_DOC: Define the $k_x$ range for code{power_xy}.
- power_spectrum/ckyrange [character,private/optional/default='']
- power_spectrum/comp_spectrum_xy [private]
- power_spectrum/crossspec_parallel_portion [private]
- power_spectrum/crossspec_parse_spec [private]
- power_spectrum/czrange [character,private/optional/default='']
- power_spectrum/d_im (*,*,*) [real,private/allocatable]
- power_spectrum/d_re (*,*,*) [real,private/allocatable]
- power_spectrum/dist_output_by_range [private]
- power_spectrum/firstout [integer,private/optional/default=0]
- power_spectrum/get_k [private]
- power_spectrum/get_k2 [private]
- power_spectrum/get_k2_old [private]
- power_spectrum/get_k2_xy [private]
- power_spectrum/get_kranges [private]
- power_spectrum/glq_weight (*,*) [real,private/allocatable]
- power_spectrum/h_im (*,*,*) [real,private/allocatable]
- power_spectrum/h_re (*,*,*) [real,private/allocatable]
- power_spectrum/inz [integer,private/optional/default=0]
- power_spectrum/k2s (*) [integer,private/allocatable]
- power_spectrum/kout_max [integer,private/optional/default=0]
- power_spectrum/kshell (*) [real,private/allocatable]
- power_spectrum/kx [private]
- power_spectrum/kxrange (3,nk_max) [integer,private/optional/default=0]
- power_spectrum/ky [private]
- power_spectrum/kyrange (3,nk_max) [integer,private/optional/default=0]
- power_spectrum/kz [private]
- power_spectrum/l_min [real,private]
- power_spectrum/l_min_xy [real,private]
- power_spectrum/lcomplex [logical,private/optional/default=.false.]
- power_spectrum/lcorrect_integer_kcalc [logical,private/optional/default=.false.]
PAR_DOC: use k=i-N/2 instead of i-(N+1)/2.
- power_spectrum/lcylindrical_spectra [logical,private/optional/default=.false.]
- power_spectrum/legendre_lmax [integer,private/optional/default=1]
- power_spectrum/legendre_zeros (*,*) [real,private/allocatable]
- power_spectrum/lglq_dot_dat_exists [logical,private/optional/default=.false.]
- power_spectrum/lhalf_factor_in_gw [logical,private/optional/default=.false.]
- power_spectrum/lhorizontal_spectra [logical,private/optional/default=.false.]
- power_spectrum/lintegrate_shell [logical,private/optional/default=.true.]
- power_spectrum/lintegrate_z [logical,private/optional/default=.true.]
- power_spectrum/lpdf_2d_variable_range [logical,private/optional/default=.false.]
- power_spectrum/lpowerdat_existed [logical,private/optional/default=.false.]
- power_spectrum/lpowerxy_hdf5 [logical,private/optional/default=.false.]
- power_spectrum/lread_gauss_quadrature [logical,private/optional/default=.false.]
- power_spectrum/lshear_frame_correlation [logical,private/optional/default=.false.]
- power_spectrum/lsplit_power_xy_in_z [logical,private/optional/default=.false.]
- power_spectrum/ltrue_binning [logical,private/optional/default=.false.]
- power_spectrum/lvertical_spectra [logical,private/optional/default=.false.]
- power_spectrum/lzero_spec_zerok [logical,private/optional/default=.false.]
- power_spectrum/m_loc [integer,private]
- power_spectrum/max_k2 [real,private/optional/default=(nxgrid/2)**2+(nygrid/2)**2+(nzgrid/2)**2]
- power_spectrum/n_glq [integer,private/optional/default=1]
- power_spectrum/n_loc [integer,private]
- power_spectrum/n_segment_x [integer,private/optional/default=1]
- power_spectrum/n_spectra [integer,public/optional/default=0]
- power_spectrum/nk_truebin [integer,private/optional/default=0]
- power_spectrum/nk_xy [integer,private]
- power_spectrum/nk_xyz [integer,private]
- power_spectrum/output_elements_by_range [private]
- power_spectrum/output_power_complex_hdf5 [private]
- power_spectrum/parse_pdf_string [private]
- power_spectrum/pdf_max [real,private/optional/default=30.0]
- power_spectrum/pdf_max_logscale [real,private/optional/default=3.0]
- power_spectrum/pdf_min [real,private/optional/default=-30.0]
- power_spectrum/pdf_min_logscale [real,private/optional/default=-3.0]
- power_spectrum/pdfy_max [real,private/optional/default=30.0]
- power_spectrum/pdfy_max_logscale [real,private/optional/default=3.0]
- power_spectrum/pdfy_min [real,private/optional/default=-30.0]
- power_spectrum/pdfy_min_logscale [real,private/optional/default=-3.0]
- power_spectrum/power_2d_parallel_portion [private]
- power_spectrum/power_format [character,private/optional/default='(1p,8e10.2)']
- power_spectrum/power_parallel_portion [private]
- power_spectrum/power_shell_filter [private]
- power_spectrum/specflux_dp [real,private/optional/default=-2.0]
- power_spectrum/specflux_dq [real,private/optional/default=-2.0]
- power_spectrum/specflux_pmax [integer,private/optional/default=nxgrid/2-1]
- power_spectrum/specflux_pmin [integer,private/optional/default=0]
- power_spectrum/timestamp_format [character,private/parameter/optional/default='(es24.16e3,1x,es24.16e3)']
- power_spectrum/tout_max [real,private/optional/default=0.0]
- power_spectrum/tout_min [real,private/optional/default=0.0]
- power_spectrum/unpack_range [private]
- power_spectrum/warn_non_cubical [private]
- power_spectrum/zrange (3,nz_max) [integer,private/optional/default=0]
Subroutines and functions
- subroutine power_spectrum/initialize_power_spectrum()
- Use :
messages,general(binomial(),pos_in_array(),quick_sort(),get_range_no(),keep_compiler_quiet()),mpicomm(mpiallreduce_merge(),mpimerge_1d())- Called from:
- Call to:
inevitably_fatal_error(),mpiallreduce_merge(),mpimerge_1d(),warning(),fatal_error(),curli(),information(),svn_id(),fourier_transform_xz(),fourier_transform_xy(),not_implemented(),mpigather_z(),mpigather_xy(),mpigather_and_out_real(),mpibarrier(),magnetic_calc_spectra(),del2vi_etc(),curl(),del2v_etc(),gij(),gij_etc(),curl_mn(),cross_mn(),div_mn(),multsv_mn(),h_dot_grad_vec(),special_calc_spectra(),fourier_transform(),div(),inverse_laplacian(),fourier_transform_x(),transp(),dot2_mn(),z2x(),fourier_transform_real_1(),y2x(),shear_frame_transform(),file_open_hdf5(),exists_in_hdf5(),create_group_hdf5(),file_close_hdf5()
- subroutine power_spectrum/read_power_spectrum_run_pars(iomsg)
05-feb-14/MR: added ordering of z ranges 12-mar-14/MR: changed merge_ranges into function
- Parameters:
iomsg [character,out]
- Use :
file_io(parallel_unit()),general(parser(),read_range(),merge_ranges(),quick_sort())- Call to:
warning(),fatal_error(),curli(),information(),svn_id(),fourier_transform_xz(),fourier_transform_xy(),not_implemented(),mpigather_z(),mpigather_xy(),mpigather_and_out_real(),mpibarrier(),magnetic_calc_spectra(),del2vi_etc(),curl(),del2v_etc(),gij(),gij_etc(),curl_mn(),cross_mn(),div_mn(),multsv_mn(),h_dot_grad_vec(),special_calc_spectra(),fourier_transform(),div(),inverse_laplacian(),fourier_transform_x(),transp(),dot2_mn(),z2x(),fourier_transform_real_1(),y2x(),shear_frame_transform(),file_open_hdf5(),exists_in_hdf5(),create_group_hdf5(),file_close_hdf5()
- subroutine power_spectrum/write_power_spectrum_run_pars(unit)
- Parameters:
unit [integer,in]
- Called from:
get_datadir(),get_snapdir(),read_all_init_pars(),read_all_run_pars(),get_downpars()- Call to:
fatal_error(),curli(),warning(),information(),svn_id(),fourier_transform_xz(),fourier_transform_xy(),not_implemented(),mpigather_z(),mpigather_xy(),mpigather_and_out_real(),mpibarrier(),magnetic_calc_spectra(),del2vi_etc(),curl(),del2v_etc(),gij(),gij_etc(),curl_mn(),cross_mn(),div_mn(),multsv_mn(),h_dot_grad_vec(),special_calc_spectra(),fourier_transform(),div(),inverse_laplacian(),fourier_transform_x(),transp(),dot2_mn(),z2x(),fourier_transform_real_1(),y2x(),shear_frame_transform(),file_open_hdf5(),exists_in_hdf5(),create_group_hdf5(),file_close_hdf5()
- subroutine power_spectrum/power(f, sp[, iapn_index])
Calculate power spectra (on spherical shells) of the variable specified by `sp’. Since this routine is only used at the end of a time step, one could in principle reuse the df array for memory purposes.
- Parameters:
f (,,*,*) [real,contiguous] :: corresponds to ss
sp [character]
iapn_index [integer,in,]
- Use :
fourier(fft_xyz_parallel()),mpicomm(mpireduce_sum()),general(itoa()),sub(curli()),file_io(file_exists())- Call to:
svn_id(),fatal_error(),curli(),information(),warning(),fourier_transform_xz(),fourier_transform_xy(),not_implemented(),mpigather_z(),mpigather_xy(),mpigather_and_out_real(),mpibarrier(),magnetic_calc_spectra(),del2vi_etc(),curl(),del2v_etc(),gij(),gij_etc(),curl_mn(),cross_mn(),div_mn(),multsv_mn(),h_dot_grad_vec(),special_calc_spectra(),fourier_transform(),div(),inverse_laplacian(),fourier_transform_x(),transp(),dot2_mn(),z2x(),fourier_transform_real_1(),y2x(),shear_frame_transform(),file_open_hdf5(),exists_in_hdf5(),create_group_hdf5(),file_close_hdf5()
- subroutine power_spectrum/crossspec(f, sp1, sp2, lvec)
Calculate cross-spectra (on spherical shells) of the variables specified by sp1 and sp2. The cross-spectrum gives the spectral distribution of sp1.sp2. Since this routine is only used at the end of a time step, one could in principle reuse the df array for memory purposes.
2025-Nov-18/Kishore: adapted from power
- Parameters:
f (,,*,*) [real,in,contiguous] :: corresponds to ss
sp1 [character,in]
sp2 [character,in]
lvec [logical,in]
- Use :
- Call to:
svn_id(),curli(),warning(),fourier_transform_xz(),information(),fatal_error(),fourier_transform_xy(),not_implemented(),mpigather_z(),mpigather_xy(),mpigather_and_out_real(),mpibarrier(),magnetic_calc_spectra(),del2vi_etc(),curl(),del2v_etc(),gij(),gij_etc(),curl_mn(),cross_mn(),div_mn(),multsv_mn(),h_dot_grad_vec(),special_calc_spectra(),fourier_transform(),div(),inverse_laplacian(),fourier_transform_x(),transp(),dot2_mn(),z2x(),fourier_transform_real_1(),y2x(),shear_frame_transform(),file_open_hdf5(),exists_in_hdf5(),create_group_hdf5(),file_close_hdf5()
- subroutine power_spectrum/power_2d(f, sp)
Calculate power spectra (on circles) of the variable specified by `sp’. Since this routine is only used at the end of a time step, one could in principle reuse the df array for memory purposes.
- Parameters:
f (,,*,*) [real,contiguous] :: corresponds to ss
sp [character]
- Use :
- Call to:
svn_id(),fatal_error(),curli(),fourier_transform_xy(),not_implemented(),mpigather_z(),mpigather_xy(),mpigather_and_out_real(),mpibarrier(),warning(),magnetic_calc_spectra(),del2vi_etc(),curl(),del2v_etc(),information(),gij(),gij_etc(),curl_mn(),cross_mn(),div_mn(),multsv_mn(),h_dot_grad_vec(),special_calc_spectra(),fourier_transform(),div(),inverse_laplacian(),fourier_transform_x(),transp(),dot2_mn(),z2x(),fourier_transform_real_1(),y2x(),shear_frame_transform(),file_open_hdf5(),exists_in_hdf5(),create_group_hdf5(),file_close_hdf5()
- subroutine power_spectrum/power_xy(f, sp[, sp2])
Calculate power spectra (on circles) of the variable specified by `sp’. Since this routine is only used at the end of a time step, one could in principle reuse the df array for memory purposes.
- 11-nov-10/MR: extended to arbitrary combinations of shell/2d and z dependent/integrated spectra
additional information about kind of spectrum + wavenumber vectors in output file; extended shell-integrated spectra to anisotropic boxes, extended k range to k_x,max^2 + k_y,max^2
18-jan-11/MR: modified for calculation of power spectra of scalar products 10-may-11/MR: modified for use with ranges in kx, ky, z; for output of true
(complex and componentwise) instead of power spectra
5-may-14/MR: modifications for request of individual components of a vector field 4-nov-16/MR: correction: no k_x, k_y output for shell-integrated spectra
- Parameters:
f (,,*,*) [real,in,contiguous] :: corresponds to ss
sp [character,in]
sp2 [character,in,]
- Use :
mpicomm(mpireduce_sum(),mpigather_xy(),mpigather_and_out_real(),mpigather_and_out_cmplx(),ipz(),mpibarrier(),mpigather_z()),general(itoa(),write_full_columns(),get_range_no(),write_by_ranges()),messages(not_implemented()),fourier(kx_fft(),ky_fft())- Call to:
svn_id(),fatal_error(),not_implemented(),mpigather_z(),mpigather_xy(),mpigather_and_out_real(),mpibarrier(),warning(),magnetic_calc_spectra(),curli(),del2vi_etc(),curl(),del2v_etc(),information(),gij(),gij_etc(),curl_mn(),cross_mn(),div_mn(),multsv_mn(),h_dot_grad_vec(),special_calc_spectra(),fourier_transform(),div(),inverse_laplacian(),fourier_transform_x(),transp(),dot2_mn(),z2x(),fourier_transform_real_1(),y2x(),shear_frame_transform(),file_open_hdf5(),exists_in_hdf5(),create_group_hdf5(),file_close_hdf5()
- subroutine power_spectrum/powerhel(f, sp, lfirstcall[, sumspec[, lnowrite]])
Calculate power and helicity spectra (on spherical shells) of the variable specified by `sp’, i.e. either the spectra of uu and kinetic helicity, or those of bb and magnetic helicity.. Since this routine is only used at the end of a time step, one could in principle reuse the df array for memory purposes.
3-oct-10/axel: added compution of krms (for realisability condition) 22-jan-13/axel: corrected for x parallelization 1-may-2026/Kishore: fixed for non-cubical domains (but not when lcylindrical_spectra=T)
- Parameters:
f (,,*,*) [real,contiguous] :: corresponds to ss
sp [character]
lfirstcall [logical]
sumspec (2) [real]
lnowrite [logical]
- Use :
chiral(ixx_chiral(),iyy_chiral(),ixx2_chiral(),iyy2_chiral()),fourier(fft_xyz_parallel()),general(loptest()),magnetic(magnetic_calc_spectra()),mpicomm(mpireduce_sum()),sub(del2vi_etc(),del2v_etc(),cross(),grad(),curli(),curl(),dot2())- Call to:
svn_id(),warning(),magnetic_calc_spectra(),fatal_error(),curli(),del2vi_etc(),curl(),del2v_etc(),information(),gij(),gij_etc(),curl_mn(),cross_mn(),div_mn(),multsv_mn(),h_dot_grad_vec(),special_calc_spectra(),fourier_transform(),div(),inverse_laplacian(),fourier_transform_x(),transp(),dot2_mn(),z2x(),fourier_transform_real_1(),y2x(),shear_frame_transform(),file_open_hdf5(),exists_in_hdf5(),create_group_hdf5(),file_close_hdf5()
- subroutine power_spectrum/powerlor(f, sp)
Calculate power and helicity spectra (on spherical shells) of the variable specified by `sp’, i.e. either the spectra of uu and kinetic helicity, or those of bb and magnetic helicity.. Since this routine is only used at the end of a time step, one could in principle reuse the df array for memory purposes.
3-oct-10/axel: added compution of krms (for realisability condition)
- 22-jan-13/axel: corrected for x parallelization
6-mar-26/axel: since r42876, compute Lorentz spectrum also for lhydro_kinematic.and.iux/=0
- Parameters:
f (,,*,*) [real,contiguous]
sp [character]
- Use :
fourier(fft_xyz_parallel()),mpicomm(mpireduce_sum()),sub(gij(),gij_etc(),curl_mn(),cross_mn())- Call to:
svn_id(),fatal_error(),gij(),gij_etc(),curl_mn(),cross_mn(),information(),div_mn(),multsv_mn(),h_dot_grad_vec(),warning(),special_calc_spectra(),fourier_transform(),div(),inverse_laplacian(),curli(),fourier_transform_x(),transp(),dot2_mn(),curl(),del2v_etc(),z2x(),fourier_transform_real_1(),y2x(),del2vi_etc(),shear_frame_transform(),file_open_hdf5(),exists_in_hdf5(),create_group_hdf5(),file_close_hdf5()
- subroutine power_spectrum/poweromu(f, sp)
Calculate power and helicity spectra (on spherical shells) of the variable specified by `sp’, i.e. either the spectra of uu and kinetic helicity, or those of bb and magnetic helicity.. Since this routine is only used at the end of a time step, one could in principle reuse the df array for memory purposes.
14-apr-26/axel: adapted from powerLor
- Parameters:
f (,,*,*) [real,contiguous]
sp [character]
- Use :
fourier(fft_xyz_parallel()),mpicomm(mpireduce_sum()),sub(gij(),gij_etc(),curl_mn(),cross_mn())- Call to:
svn_id(),gij(),curl_mn(),cross_mn(),information(),gij_etc(),div_mn(),multsv_mn(),h_dot_grad_vec(),warning(),special_calc_spectra(),fatal_error(),fourier_transform(),div(),inverse_laplacian(),curli(),fourier_transform_x(),transp(),dot2_mn(),curl(),del2v_etc(),z2x(),fourier_transform_real_1(),y2x(),del2vi_etc(),shear_frame_transform(),file_open_hdf5(),exists_in_hdf5(),create_group_hdf5(),file_close_hdf5()
- subroutine power_spectrum/poweremf(f, sp)
Calculate power and helicity spectra (on spherical shells) of the variable specified by `sp’, i.e. either the spectra of uu and kinetic helicity, or those of bb and magnetic helicity.. Since this routine is only used at the end of a time step, one could in principle reuse the df array for memory purposes.
3-oct-10/axel: added compution of krms (for realisability condition)
22-jan-13/axel: corrected for x parallelization
- Parameters:
f (,,*,*) [real,contiguous]
sp [character]
- Use :
fourier(fft_xyz_parallel()),mpicomm(mpireduce_sum()),sub(gij(),gij_etc(),curl_mn(),cross_mn())- Call to:
svn_id(),gij(),gij_etc(),curl_mn(),cross_mn(),information(),div_mn(),multsv_mn(),h_dot_grad_vec(),warning(),special_calc_spectra(),fatal_error(),fourier_transform(),div(),inverse_laplacian(),curli(),fourier_transform_x(),transp(),dot2_mn(),curl(),del2v_etc(),z2x(),fourier_transform_real_1(),y2x(),del2vi_etc(),shear_frame_transform(),file_open_hdf5(),exists_in_hdf5(),create_group_hdf5(),file_close_hdf5()
- subroutine power_spectrum/powertra(f, sp)
Calculate power and helicity spectra (on spherical shells) of the variable specified by `sp’, i.e. either the spectra of uu and kinetic helicity, or those of bb and magnetic helicity.. Since this routine is only used at the end of a time step, one could in principle reuse the df array for memory purposes.
3-oct-10/axel: added compution of krms (for realisability condition)
22-jan-13/axel: corrected for x parallelization
- Parameters:
f (,,*,*) [real,contiguous]
sp [character]
- Use :
fourier(fft_xyz_parallel()),mpicomm(mpireduce_sum()),sub(gij(),gij_etc(),curl_mn(),cross_mn(),div_mn(),multsv_mn(),h_dot_grad_vec())- Call to:
svn_id(),gij(),gij_etc(),div_mn(),curl_mn(),multsv_mn(),h_dot_grad_vec(),information(),warning(),special_calc_spectra(),fatal_error(),fourier_transform(),div(),inverse_laplacian(),curli(),fourier_transform_x(),transp(),dot2_mn(),curl(),del2v_etc(),z2x(),fourier_transform_real_1(),y2x(),del2vi_etc(),shear_frame_transform(),cross_mn(),file_open_hdf5(),exists_in_hdf5(),create_group_hdf5(),file_close_hdf5()
- subroutine power_spectrum/powergws(f, sp, lfirstcall)
Calculate power and helicity spectra (on spherical shells) of the variable specified by `sp’, i.e. either the spectra of uu and kinetic helicity, or those of bb and magnetic helicity.. Since this routine is only used at the end of a time step, one could in principle reuse the df array for memory purposes.
3-oct-10/axel: added compution of krms (for realisability condition)
22-jan-13/axel: corrected for x parallelization
- Parameters:
f (,,*,*) [real,contiguous]
sp [character]
lfirstcall [logical]
- Use :
fourier(fft_xyz_parallel(),fourier_transform()),mpicomm(mpireduce_sum(),mpigather_and_out_cmplx()),sub(gij(),gij_etc(),curl_mn(),cross_mn()),special(special_calc_spectra())- Call to:
svn_id(),warning(),special_calc_spectra(),fatal_error(),fourier_transform(),information(),div(),inverse_laplacian(),curli(),fourier_transform_x(),transp(),dot2_mn(),curl(),del2v_etc(),z2x(),fourier_transform_real_1(),y2x(),del2vi_etc(),shear_frame_transform(),gij(),gij_etc(),curl_mn(),cross_mn(),file_open_hdf5(),exists_in_hdf5(),create_group_hdf5(),file_close_hdf5()
- subroutine power_spectrum/powerscl(f, sp[, iapn_index[, lsqrt]])
Calculate power spectrum of scalar quantity (on spherical shells) of the variable specified by `sp’, e.g. spectra of cc, rho, etc. Since this routine is only used at the end of a time step, one could in principle reuse the df array for memory purposes. Make sure corresponding changes are made in cdata, param_io, and powersnap, which is in snapshot.f90.
1-May-2026/Kishore: basic support for non-cubical boxes
- Parameters:
f (,,*,*) [real,contiguous]
sp [character]
iapn_index [integer,in,]
lsqrt [logical,in,]
- Use :
fourier(fft_xyz_parallel()),general(itoa()),mpicomm(mpireduce_sum()),sub(curli(),grad(),div()),poisson(inverse_laplacian()),sharedvariables(get_shared_variable()),farraymanager- Call to:
svn_id(),warning(),fatal_error(),div(),inverse_laplacian(),curli(),information(),fourier_transform_x(),transp(),dot2_mn(),curl(),del2v_etc(),z2x(),fourier_transform_real_1(),y2x(),fourier_transform(),del2vi_etc(),shear_frame_transform(),gij(),gij_etc(),curl_mn(),cross_mn(),file_open_hdf5(),exists_in_hdf5(),create_group_hdf5(),file_close_hdf5()
- subroutine power_spectrum/power_1d(f, sp, ivec[, ivar])
Calculate power spectra of the variable specified by `sp’. Since this routine is only used at the end of a time step, one could in principle reuse the df array for memory purposes.
27-apr-14/nishant: added inz to compute power_x at a given z
- Parameters:
f (,,*,*) [real,contiguous]
sp [character]
ivec [integer]
ivar [integer]
- Use :
fourier(fourier_transform_x()),mpicomm(mpireduce_sum(),transp()),sub(curli()),general(itoa())- Call to:
svn_id(),fatal_error(),curli(),fourier_transform_x(),transp(),dot2_mn(),curl(),del2v_etc(),warning(),z2x(),fourier_transform_real_1(),y2x(),fourier_transform(),information(),del2vi_etc(),shear_frame_transform(),gij(),gij_etc(),curl_mn(),cross_mn(),file_open_hdf5(),exists_in_hdf5(),create_group_hdf5(),file_close_hdf5()
- subroutine power_spectrum/pdf(f, variabl_in[, pdf_mean_in[, pdf_rms_in]])
Calculated pdf of scalar field. This routine is in this module, because it is always called at the same time when spectra are invoked (called in wsnaps).
2-dec-03/axel: coded 03-Nov-2025/Kishore: added lnrho 06-Nov-2025/Kishore: allow to take any variable from the f-array
- Parameters:
f (,,*,*) [real,in,contiguous]
variabl_in [character,in]
pdf_mean_in [real,in,]
pdf_rms_in [real,in,]
- Use :
sub(grad(),dot2_mn()),mpicomm(mpireduce_sum_int()),sharedvariables(get_shared_variable()),farraymanager(farray_index_by_name())- Call to:
dot2_mn(),fatal_error(),svn_id(),curl(),del2v_etc(),curli(),warning(),z2x(),fourier_transform_real_1(),y2x(),fourier_transform(),information(),del2vi_etc(),shear_frame_transform(),gij(),gij_etc(),curl_mn(),cross_mn(),file_open_hdf5(),exists_in_hdf5(),create_group_hdf5(),file_close_hdf5()
- subroutine power_spectrum/pdf_2d(f, variabl, pdf_mean, pdf_rms)
Calculated pdf of scalar field. This routine is in this module, because it is always called at the same time when spectra are invoked (called in wsnaps).
2-dec-03/axel: coded
- Parameters:
f (,,*,*) [real,contiguous]
variabl [character]
pdf_mean [real]
pdf_rms [real]
- Use :
sub(grad(),dot2_mn()),mpicomm(mpireduce_sum_int(),mpiallreduce_min(),mpiallreduce_max()),sharedvariables(get_shared_variable())- Call to:
svn_id(),fatal_error(),curl(),del2v_etc(),curli(),warning(),z2x(),fourier_transform_real_1(),y2x(),fourier_transform(),information(),del2vi_etc(),shear_frame_transform(),gij(),gij_etc(),curl_mn(),cross_mn(),file_open_hdf5(),exists_in_hdf5(),create_group_hdf5(),file_close_hdf5()
- subroutine power_spectrum/pdf1d_ang(f, sp)
Computes scale-by-scale pdfs of the cosine of the angle between two vector fields in the configuration space. The last column of the pdf counts the number of places where one or both of the two fields vanish.
30-jun-22/hongzhe: coded
- Parameters:
f (,,*,*) [real,contiguous]
sp [character]
- Use :
fourier,mpicomm(mpireduce_sum_int()),sub(del2v_etc(),curl())- Call to:
svn_id(),fatal_error(),curl(),del2v_etc(),curli(),warning(),z2x(),fourier_transform_real_1(),y2x(),fourier_transform(),information(),del2vi_etc(),shear_frame_transform(),gij(),gij_etc(),curl_mn(),cross_mn(),file_open_hdf5(),exists_in_hdf5(),create_group_hdf5(),file_close_hdf5()
- subroutine power_spectrum/power_phi(f, sp)
Power spectra in phi direction in spherical coordinates: I define power_phi of a variable ‘u’ in the following way: {hat u}(r,theta,k) equiv FFT (u(r,theta,k)) power_phi(u) equiv
- sum_{r,theta} dr dtheta
{hat u}(r,theta,k)*{hat u}(r,theta,-k) r^2 sin(theta)
As this subroutine is called at the end of a time-step df can be used for storing temporary data. The phi direction is the z direction. ———————————————————————-
- Parameters:
f (,,*,*) [real,contiguous]
sp [character]
- Use :
sub(curli()),mpicomm(y2x(),z2x()),fourier(fourier_transform_real_1())- Call to:
svn_id(),fatal_error(),curli(),warning(),z2x(),fourier_transform_real_1(),y2x(),del2v_etc(),fourier_transform(),information(),del2vi_etc(),shear_frame_transform(),gij(),gij_etc(),curl_mn(),cross_mn(),file_open_hdf5(),exists_in_hdf5(),create_group_hdf5(),file_close_hdf5()
- subroutine power_spectrum/powerhel_phi(f, sp)
Power spectra in phi direction in spherical coordinates: I define power_phi of a variable ‘u’ in the following way: {hat u}(r,theta,k) equiv FFT (u(r,theta,k)) power_phi(u) equiv
- sum_{r,theta} dr dtheta
{hat u}(r,theta,k)*{hat u}(r,theta,-k) r^2 sin(theta)
As this subroutine is called at the end of a time-step df can be used for storing temporary data. The phi direction is the z direction.
- Parameters:
f (,,*,*) [real,contiguous]
sp [character]
- Use :
fourier(fourier_transform_real_1()),mpicomm(z2x()),sub(curli())- Call to:
svn_id(),fatal_error(),curli(),warning(),z2x(),fourier_transform_real_1(),del2v_etc(),fourier_transform(),information(),del2vi_etc(),shear_frame_transform(),gij(),gij_etc(),curl_mn(),cross_mn(),file_open_hdf5(),exists_in_hdf5(),create_group_hdf5(),file_close_hdf5()
- subroutine power_spectrum/power_vec(f, sp)
Calculate power spectra (on shperical shells) of the variable specified by `sp’. Since this routine is only used at the end of a time step, one could in principle reuse the df array for memory purposes.
- Parameters:
f (,,*,*) [real,contiguous]
sp [character]
- Use :
sub(del2v_etc()),mpicomm(mpireduce_sum()),fourier(fourier_transform())- Call to:
svn_id(),del2v_etc(),fatal_error(),fourier_transform(),information(),curli(),del2vi_etc(),warning(),shear_frame_transform(),gij(),gij_etc(),curl_mn(),cross_mn(),file_open_hdf5(),exists_in_hdf5(),create_group_hdf5(),file_close_hdf5()
- subroutine power_spectrum/polar_spectrum(f, sp)
In k space, calculate azimuthally averaged spectra in polar coordinates, and perform legendre decomposition. Specify in &run_pars:
- ou_omega=T: energy and helicity spectra of velocity u(k,omega);
need luut_as_aux=loot_as_aux=T, omega_fourier in &hydro_run_pars and MAUX CONTRIBUTION 12
cor_uu=T: velocity coorelation functions <u_i u_j> ou_polar, ab_polar, jb_polar:
kinetic/magnetic/current helicity spectra
29-oct-20/hongzhe: added this subroutine 20-nov-20/hongzhe: can now also compute Legendre coefficients 08-dec-20/hongzhe: lread_gauss_quadrature=T generates polar coordinates
in gauss-legendre quadrature; need to provide file gauss_legendre_quadrature.dat
10-dec-20/hongzhe: merged subroutines corfunc_cyl and anisoq_diag into this one
- Parameters:
f (,,*,*) [real,contiguous]
sp [character]
- Use :
fourier(fft_xyz_parallel()),mpicomm(mpireduce_sum()),general(plegendre()),sub(curli(),del2vi_etc())- Call to:
svn_id(),fatal_error(),information(),curli(),del2vi_etc(),warning(),shear_frame_transform(),gij(),gij_etc(),curl_mn(),del2v_etc(),cross_mn(),file_open_hdf5(),exists_in_hdf5(),create_group_hdf5(),file_close_hdf5()
- subroutine power_spectrum/power1d_plane(f, sp)
Calculate power and helicity spectra of planar-averaged variable specified by `sp’, i.e. either the spectra of uu and kinetic helicity, or those of bb and magnetic helicity.. Since this routine is only used at the end of a time step, one could in principle reuse the df array for memory purposes.
9-nov-20/hongzhe: if this coincides with power_1d I will remove it
- Parameters:
f (,,*,*) [real,contiguous]
sp [character]
- Use :
fourier(fft_xyz_parallel()),mpicomm(mpireduce_sum()),sub(del2vi_etc(),del2v_etc(),cross(),grad(),curli(),curl(),dot2())- Call to:
svn_id(),fatal_error(),curli(),warning(),information(),shear_frame_transform(),del2vi_etc(),gij(),gij_etc(),curl_mn(),del2v_etc(),cross_mn(),file_open_hdf5(),exists_in_hdf5(),create_group_hdf5(),file_close_hdf5()
- subroutine power_spectrum/power_cor(f, sp)
Calculate power spectra (on spherical shells) of two-time correlations of the variable specified by `sp’, i.e. either the spectra of u(t’)u(t) and that of kinetic helicity, or those of bb and magnetic helicity.. Since this routine is only used at the end of a time step, one could in principle reuse the df array for memory purposes.
28-may-21/hongzhe: adapted from powerhel
- Parameters:
f (,,*,*) [real,contiguous]
sp [character]
- Use :
fourier(fft_xyz_parallel()),mpicomm(mpireduce_sum()),sub(del2v_etc(),cross(),grad(),curli(),curl(),dot2()),shear(shear_frame_transform()),sharedvariables(get_shared_variable())- Call to:
svn_id(),warning(),fatal_error(),shear_frame_transform(),information(),curli(),del2vi_etc(),gij(),gij_etc(),curl_mn(),del2v_etc(),cross_mn(),file_open_hdf5(),exists_in_hdf5(),create_group_hdf5(),file_close_hdf5()
- subroutine power_spectrum/power_cor_scl(f, sp)
Calculate power spectra (on spherical shells) of two-time correlations of a scalar variable specified by `sp’, e.g., kinetic helicity. Since this routine is only used at the end of a time step, one could in principle reuse the df array for memory purposes.
15-jun-22/hongzhe: carved out from power_cor
- Parameters:
f (,,*,*) [real,contiguous]
sp [character]
- Use :
fourier(fft_xyz_parallel()),mpicomm(mpireduce_sum()),shear(shear_frame_transform()),sharedvariables(get_shared_variable())- Call to:
svn_id(),fatal_error(),shear_frame_transform(),information(),curli(),del2vi_etc(),gij(),gij_etc(),curl_mn(),del2v_etc(),cross_mn(),warning(),file_open_hdf5(),exists_in_hdf5(),create_group_hdf5(),file_close_hdf5()
- subroutine power_spectrum/quadratic_invariants(f, sp)
28-mar-22/hongzhe: an attempt to compute Saffman invariants
- Parameters:
f (,,*,*) [real,contiguous]
sp [character]
- Use :
fourier(fft_xyz_parallel()),mpicomm(mpireduce_sum()),sub(del2v_etc(),cross(),grad(),curli(),curl(),dot2()),magnetic(lcoulomb(),ilam()),cdata(pi()),general(rtoa())- Call to:
svn_id(),fatal_error(),curli(),information(),del2vi_etc(),shear_frame_transform(),gij(),gij_etc(),curl_mn(),del2v_etc(),cross_mn(),warning(),file_open_hdf5(),exists_in_hdf5(),create_group_hdf5(),file_close_hdf5()
- subroutine power_spectrum/power_fft3d_vec(f, sp, sp2)
This subroutine outputs 3D Fourier modes of a vector field, in the time range tout_min <= t <= tout_max. Depending on sp2:
‘kxyz’: output in the k range -kout_max <= kx, ky, kz <= kout_max ‘xkyz’: only do Fourier transformation in y and z directions, and
output fft(x,ky,kz), in the range -kout_max <= kyz <= kout_max, and for the centermost 2kout_max+1 grids in the x direction
- ‘kx0z’: at ky=0, output in the k range -kout_max <= kxz <= kout_max,
and therefore the output is really 2D data
- ‘k00z’: at kx=ky=0, output -kout_max <= kz <= kout_max,
and therefore the output is really 1D data
It is also possible to do a shear-frame transformation. There will be 6 output files: real and imaginary parts for each of the three components of the vector field.
14-jun-22/hongzhe: coded
- Parameters:
f (,,*,*) [real,contiguous]
sp [character]
sp2 [character]
- Use :
fourier,mpicomm(mpireduce_sum()),sub(del2vi_etc(),del2v_etc(),cross(),grad(),curli(),curl(),dot2()),shear(shear_frame_transform())- Call to:
svn_id(),fatal_error(),curli(),del2vi_etc(),shear_frame_transform(),gij(),gij_etc(),curl_mn(),del2v_etc(),cross_mn(),warning(),file_open_hdf5(),exists_in_hdf5(),create_group_hdf5(),file_close_hdf5()
- subroutine power_spectrum/power_transfer_mag(f, sp)
Calculate magnetic energy and helicity transfer functions. The transfer rate T(p,q) refers to the magnetic helicity from shell q into shell p.
3-aug-22/hongzhe: adapted from powerEMF
24-aug-22/hongzhe: made switchable 24-aug-22/axel: made Tpq,Tpq_sum allocatable, of size (nlk+1)^2, where nk=2**nlk 25-aug-22/hongzhe: introduced specflux_dp and specflux_dq
- Parameters:
f (,,*,*) [real,contiguous]
sp [character]
- Use :
mpicomm(mpireduce_sum()),sub(gij(),gij_etc(),curl_mn(),cross_mn(),del2v_etc())- Call to:
svn_id(),fatal_error(),gij(),gij_etc(),curl_mn(),del2v_etc(),cross_mn(),warning(),file_open_hdf5(),exists_in_hdf5(),create_group_hdf5(),file_close_hdf5()