Skip to content
Snippets Groups Projects
Commit 55a27693 authored by Antoine Cyril David Hoffmann's avatar Antoine Cyril David Hoffmann :seedling:
Browse files

removed headers

parent bc8c45f9
No related branches found
No related tags found
No related merge requests found
SUBROUTINE diagnose_fields(kstep)
USE basic
USE grid
USE diagnostics_par
USE futils
USE array
USE model
USE initial_par
USE fields
USE time_integration
USE utility
USE prec_const
USE collision, ONLY: coll_outputinputs
USE geometry
USE processing
IMPLICIT NONE
INTEGER, INTENT(in) :: kstep
INTEGER, parameter :: BUFSIZE = 2
INTEGER :: rank = 0
INTEGER :: dims(1) = (/0/)
!____________________________________________________________________________!
IF ((kstep .EQ. 0)) THEN
! fields result file (electro. pot., Ni00 moment, fluid moments etc.)
IF (nsave_3d .GT. 0) THEN
CALL init_outfile(comm_kyz,fldfile0,fldfile,fidfld)
CALL creatd(fidfld, rank, dims, "/data/time", "Time t*c_s/R")
CALL creatd(fidfld, rank, dims, "/data/cstep", "iteration number")
IF (write_phi) CALL creatg(fidfld, "/data/phi", "phi")
IF (write_Na00) THEN
IF(KIN_E)&
CALL creatg(fidfld, "/data/Ne00", "Ne00")
CALL creatg(fidfld, "/data/Ni00", "Ni00")
ENDIF
IF (write_dens) THEN
IF(KIN_E)&
CALL creatg(fidfld, "/data/dens_e", "dens_e")
CALL creatg(fidfld, "/data/dens_i", "dens_i")
ENDIF
IF (write_fvel) THEN
IF(KIN_E) THEN
CALL creatg(fidfld, "/data/upar_e", "upar_e")
CALL creatg(fidfld, "/data/uper_e", "uper_e")
ENDIF
CALL creatg(fidfld, "/data/upar_i", "upar_i")
CALL creatg(fidfld, "/data/uper_i", "uper_i")
ENDIF
IF (write_temp) THEN
IF(KIN_E) THEN
CALL creatg(fidfld, "/data/Tper_e", "Tper_e")
CALL creatg(fidfld, "/data/Tpar_e", "Tpar_e")
CALL creatg(fidfld, "/data/temp_e", "temp_e")
ENDIF
CALL creatg(fidfld, "/data/Tper_i", "Tper_i")
CALL creatg(fidfld, "/data/Tpar_i", "Tpar_i")
CALL creatg(fidfld, "/data/temp_i", "temp_i")
ENDIF
IF (cstep==0) THEN
iframe3d=0
ENDIF
CALL attach(fidfld,"/data/" , "frames", iframe3d)
END IF
ENDIF
!_____________________________________________________________________________
! 2. Periodic diagnostics
!
IF (kstep .GE. 0) THEN
! 2.2 3d profiles
IF (nsave_3d .GT. 0) THEN
IF (MOD(cstep, nsave_3d) == 0) THEN
CALL append(fidfld, "/data/time", time,ionode=0)
CALL append(fidfld, "/data/cstep", real(cstep,dp),ionode=0)
CALL getatt(fidfld, "/data/", "frames",iframe3d)
iframe3d=iframe3d+1
CALL attach(fidfld,"/data/" , "frames", iframe3d)
IF (write_phi) CALL write_field3d_kykxz(phi (ikys:ikye,ikxs:ikxe,izs:ize), 'phi')
IF (write_Na00) THEN
IF(KIN_E)THEN
IF (ips_e .EQ. 1) THEN
Ne00(ikys:ikye,ikxs:ikxe,izs:ize) = moments_e(ips_e,1,ikys:ikye,ikxs:ikxe,izs:ize,updatetlevel)
ENDIF
CALL write_field3d_kykxz(Ne00(ikys:ikye,ikxs:ikxe,izs:ize), 'Ne00')
ENDIF
IF (ips_i .EQ. 1) THEN
Ni00(ikys:ikye,ikxs:ikxe,izs:ize) = moments_i(ips_e,1,ikys:ikye,ikxs:ikxe,izs:ize,updatetlevel)
ENDIF
CALL write_field3d_kykxz(Ni00(ikys:ikye,ikxs:ikxe,izs:ize), 'Ni00')
ENDIF
!! Fuid moments
IF (write_dens .OR. write_fvel .OR. write_temp) &
CALL compute_fluid_moments
IF (write_dens) THEN
IF(KIN_E)&
CALL write_field3d_kykxz(dens_e(ikys:ikye,ikxs:ikxe,izs:ize), 'dens_e')
CALL write_field3d_kykxz(dens_i(ikys:ikye,ikxs:ikxe,izs:ize), 'dens_i')
ENDIF
IF (write_fvel) THEN
IF(KIN_E)&
CALL write_field3d_kykxz(upar_e(ikys:ikye,ikxs:ikxe,izs:ize), 'upar_e')
CALL write_field3d_kykxz(upar_i(ikys:ikye,ikxs:ikxe,izs:ize), 'upar_i')
IF(KIN_E)&
CALL write_field3d_kykxz(uper_e(ikys:ikye,ikxs:ikxe,izs:ize), 'uper_e')
CALL write_field3d_kykxz(uper_i(ikys:ikye,ikxs:ikxe,izs:ize), 'uper_i')
ENDIF
IF (write_temp) THEN
IF(KIN_E)&
CALL write_field3d_kykxz(Tpar_e(ikys:ikye,ikxs:ikxe,izs:ize), 'Tpar_e')
CALL write_field3d_kykxz(Tpar_i(ikys:ikye,ikxs:ikxe,izs:ize), 'Tpar_i')
IF(KIN_E)&
CALL write_field3d_kykxz(Tper_e(ikys:ikye,ikxs:ikxe,izs:ize), 'Tper_e')
CALL write_field3d_kykxz(Tper_i(ikys:ikye,ikxs:ikxe,izs:ize), 'Tper_i')
IF(KIN_E)&
CALL write_field3d_kykxz(temp_e(ikys:ikye,ikxs:ikxe,izs:ize), 'temp_e')
CALL write_field3d_kykxz(temp_i(ikys:ikye,ikxs:ikxe,izs:ize), 'temp_i')
ENDIF
END IF
END IF
!_____________________________________________________________________________
! 3. Final diagnostics
ELSEIF (kstep .EQ. -1) THEN
! Close diagnostic files
CALL mpi_barrier(MPI_COMM_WORLD, ierr)
CALL closef(fidfld)
END IF
CONTAINS
SUBROUTINE write_field3d_kykxz(field, text)
IMPLICIT NONE
COMPLEX(dp), DIMENSION(ikys:ikye,ikxs:ikxe, izs:ize), INTENT(IN) :: field
CHARACTER(*), INTENT(IN) :: text
CHARACTER(LEN=50) :: dset_name
WRITE(dset_name, "(A, '/', A, '/', i6.6)") "/data", TRIM(text), iframe3d
IF (num_procs .EQ. 1) THEN ! no data distribution
CALL putarr(fidfld, dset_name, field(ikys:ikye,ikxs:ikxe, izs:ize), ionode=0)
ELSE
CALL putarrnd(fidfld, dset_name, field(ikys:ikye,ikxs:ikxe, izs:ize), (/1, 3/))
ENDIF
CALL attach(fidfld, dset_name, "time", time)
END SUBROUTINE write_field3d_kykxz
END SUBROUTINE diagnose_fields
SUBROUTINE diagnose_full(kstep)
USE basic
USE grid
USE diagnostics_par
USE futils, ONLY: creatf, creatg, creatd, closef, putarr, putfile, attach, openf, putarrnd
USE array
USE model
USE initial_par
USE fields
USE time_integration
USE parallel
USE prec_const
USE collision, ONLY: coll_outputinputs
USE geometry
IMPLICIT NONE
INTEGER, INTENT(in) :: kstep
INTEGER, parameter :: BUFSIZE = 2
INTEGER :: rank = 0
INTEGER :: dims(1) = (/0/)
INTEGER :: cp_counter = 0
CHARACTER(len=256) :: str,test_
!____________________________________________________________________________
! 1. Initial diagnostics
IF ((kstep .EQ. 0)) THEN
CALL init_outfile(comm0, resfile0,resfile,fidres)
! Profiler time measurement
CALL creatg(fidres, "/profiler", "performance analysis")
CALL creatd(fidres, 0, dims, "/profiler/Tc_rhs", "cumulative rhs computation time")
CALL creatd(fidres, 0, dims, "/profiler/Tc_adv_field", "cumulative adv. fields computation time")
CALL creatd(fidres, 0, dims, "/profiler/Tc_clos", "cumulative closure computation time")
CALL creatd(fidres, 0, dims, "/profiler/Tc_ghost", "cumulative communication time")
CALL creatd(fidres, 0, dims, "/profiler/Tc_coll", "cumulative collision computation time")
CALL creatd(fidres, 0, dims, "/profiler/Tc_poisson", "cumulative poisson computation time")
CALL creatd(fidres, 0, dims, "/profiler/Tc_Sapj", "cumulative Sapj computation time")
CALL creatd(fidres, 0, dims, "/profiler/Tc_checkfield", "cumulative checkfield computation time")
CALL creatd(fidres, 0, dims, "/profiler/Tc_diag", "cumulative sym computation time")
CALL creatd(fidres, 0, dims, "/profiler/Tc_process", "cumulative process computation time")
CALL creatd(fidres, 0, dims, "/profiler/Tc_step", "cumulative total step computation time")
CALL creatd(fidres, 0, dims, "/profiler/time", "current simulation time")
! Grid info
CALL creatg(fidres, "/data/grid", "Grid data")
CALL putarr(fidres, "/data/grid/coordkx", kxarray_full, "kx*rho_s0", ionode=0)
CALL putarr(fidres, "/data/grid/coordky", kyarray_full, "ky*rho_s0", ionode=0)
CALL putarr(fidres, "/data/grid/coordz", zarray_full, "z/R", ionode=0)
CALL putarr(fidres, "/data/grid/coordp_e" , parray_e_full, "p_e", ionode=0)
CALL putarr(fidres, "/data/grid/coordj_e" , jarray_e_full, "j_e", ionode=0)
CALL putarr(fidres, "/data/grid/coordp_i" , parray_i_full, "p_i", ionode=0)
CALL putarr(fidres, "/data/grid/coordj_i" , jarray_i_full, "j_i", ionode=0)
! Metric info
CALL creatg(fidres, "/data/metric", "Metric data")
CALL putarrnd(fidres, "/data/metric/gxx", gxx(izs:ize,0:1), (/1, 1, 1/))
CALL putarrnd(fidres, "/data/metric/gxy", gxy(izs:ize,0:1), (/1, 1, 1/))
CALL putarrnd(fidres, "/data/metric/gyy", gyy(izs:ize,0:1), (/1, 1, 1/))
CALL putarrnd(fidres, "/data/metric/gyz", gyz(izs:ize,0:1), (/1, 1, 1/))
CALL putarrnd(fidres, "/data/metric/gzz", gzz(izs:ize,0:1), (/1, 1, 1/))
CALL putarrnd(fidres, "/data/metric/hatR", hatR(izs:ize,0:1), (/1, 1, 1/))
CALL putarrnd(fidres, "/data/metric/hatZ", hatZ(izs:ize,0:1), (/1, 1, 1/))
CALL putarrnd(fidres, "/data/metric/hatB", hatB(izs:ize,0:1), (/1, 1, 1/))
CALL putarrnd(fidres, "/data/metric/gradxB", gradxB(izs:ize,0:1), (/1, 1, 1/))
CALL putarrnd(fidres, "/data/metric/gradyB", gradyB(izs:ize,0:1), (/1, 1, 1/))
CALL putarrnd(fidres, "/data/metric/gradzB", gradzB(izs:ize,0:1), (/1, 1, 1/))
CALL putarrnd(fidres, "/data/metric/Jacobian", Jacobian(izs:ize,0:1), (/1, 1, 1/))
CALL putarrnd(fidres, "/data/metric/gradz_coeff", gradz_coeff(izs:ize,0:1), (/1, 1, 1/))
CALL putarrnd(fidres, "/data/metric/Ckxky", Ckxky(ikys:ikye,ikxs:ikxe,izs:ize,0:1), (/1, 1, 3/))
CALL putarrnd(fidres, "/data/metric/kernel_i", kernel_i(ijs_i:ije_i,ikys:ikye,ikxs:ikxe,izs:ize,0:1), (/ 1, 2, 4/))
! var0d group (gyro transport)
IF (nsave_0d .GT. 0) THEN
CALL creatg(fidres, "/data/var0d", "0d profiles")
CALL creatd(fidres, rank, dims, "/data/var0d/time", "Time t*c_s/R")
CALL creatd(fidres, rank, dims, "/data/var0d/cstep", "iteration number")
IF (write_gamma) THEN
CALL creatd(fidres, rank, dims, "/data/var0d/gflux_ri", "Radial gyro ion transport")
CALL creatd(fidres, rank, dims, "/data/var0d/pflux_ri", "Radial part ion transport")
ENDIF
IF (write_hf) THEN
CALL creatd(fidres, rank, dims, "/data/var0d/hflux_x", "Radial part ion heat flux")
ENDIF
IF (cstep==0) THEN
iframe0d=0
ENDIF
CALL attach(fidres,"/data/var0d/" , "frames", iframe0d)
END IF
! var2d group (??)
IF (nsave_2d .GT. 0) THEN
CALL creatg(fidres, "/data/var2d", "2d profiles")
CALL creatd(fidres, rank, dims, "/data/var2d/time", "Time t*c_s/R")
CALL creatd(fidres, rank, dims, "/data/var2d/cstep", "iteration number")
IF (cstep==0) THEN
iframe2d=0
ENDIF
CALL attach(fidres,"/data/var2d/" , "frames", iframe2d)
END IF
! var3d group (electro. pot., Ni00 moment)
IF (nsave_3d .GT. 0) THEN
CALL creatg(fidres, "/data/var3d", "3d profiles")
CALL creatd(fidres, rank, dims, "/data/var3d/time", "Time t*c_s/R")
CALL creatd(fidres, rank, dims, "/data/var3d/cstep", "iteration number")
IF (write_phi) CALL creatg(fidres, "/data/var3d/phi", "phi")
IF (write_phi) THEN
CALL creatg(fidres, "/data/var3d/phi_gatherv", "phi_gatherv")
ENDIF
IF (write_Na00) THEN
IF(KIN_E)&
CALL creatg(fidres, "/data/var3d/Ne00", "Ne00")
CALL creatg(fidres, "/data/var3d/Ni00", "Ni00")
CALL creatg(fidres, "/data/var3d/Ni00_gatherv", "Ni00_gatherv")
IF(KIN_E)&
CALL creatg(fidres, "/data/var3d/Nepjz", "Nepjz")
CALL creatg(fidres, "/data/var3d/Nipjz", "Nipjz")
CALL creatg(fidres, "/data/var3d/Nipjz_full", "Nipjz")
ENDIF
IF (write_dens) THEN
IF(KIN_E)&
CALL creatg(fidres, "/data/var3d/dens_e", "dens_e")
CALL creatg(fidres, "/data/var3d/dens_i", "dens_i")
ENDIF
IF (write_fvel) THEN
IF(KIN_E) THEN
CALL creatg(fidres, "/data/var3d/upar_e", "upar_e")
CALL creatg(fidres, "/data/var3d/uper_e", "uper_e")
ENDIF
CALL creatg(fidres, "/data/var3d/upar_i", "upar_i")
CALL creatg(fidres, "/data/var3d/uper_i", "uper_i")
ENDIF
IF (write_temp) THEN
IF(KIN_E) THEN
CALL creatg(fidres, "/data/var3d/Tper_e", "Tper_e")
CALL creatg(fidres, "/data/var3d/Tpar_e", "Tpar_e")
CALL creatg(fidres, "/data/var3d/temp_e", "temp_e")
ENDIF
CALL creatg(fidres, "/data/var3d/Tper_i", "Tper_i")
CALL creatg(fidres, "/data/var3d/Tpar_i", "Tpar_i")
CALL creatg(fidres, "/data/var3d/temp_i", "temp_i")
ENDIF
IF (cstep==0) THEN
iframe3d=0
ENDIF
CALL attach(fidres,"/data/var3d/" , "frames", iframe3d)
END IF
! var5d group (moments)
IF (nsave_5d .GT. 0) THEN
CALL creatg(fidres, "/data/var5d", "5d profiles")
CALL creatd(fidres, rank, dims, "/data/var5d/time", "Time t*c_s/R")
CALL creatd(fidres, rank, dims, "/data/var5d/cstep", "iteration number")
IF (write_Napj) THEN
IF(KIN_E)&
CALL creatg(fidres, "/data/var5d/moments_e", "moments_e")
CALL creatg(fidres, "/data/var5d/moments_i", "moments_i")
ENDIF
IF (write_Sapj) THEN
IF(KIN_E)&
CALL creatg(fidres, "/data/var5d/moments_e", "Sipj")
CALL creatg(fidres, "/data/var5d/moments_i", "Sepj")
ENDIF
IF (cstep==0) THEN
iframe5d=0
END IF
CALL attach(fidres,"/data/var5d/" , "frames", iframe5d)
END IF
ENDIF
!_____________________________________________________________________________
! 2. Periodic diagnostics
!
IF (kstep .GE. 0) THEN
! 2.1 0d history arrays
IF (nsave_0d .GT. 0) THEN
IF ( MOD(cstep, nsave_0d) == 0 ) THEN
CALL diagnose_0d
END IF
END IF
! 2.2 1d profiles
! empty in our case
! 2.3 2d profiles
! empty in our case
! 2.3 2d profiles
IF (nsave_3d .GT. 0) THEN
IF (MOD(cstep, nsave_3d) == 0) THEN
CALL diagnose_3d
END IF
END IF
! 2.4 3d profiles
IF (nsave_5d .GT. 0 .AND. cstep .GT. 0) THEN
IF (MOD(cstep, nsave_5d) == 0) THEN
CALL diagnose_5d
END IF
END IF
!_____________________________________________________________________________
! 3. Final diagnostics
ELSEIF (kstep .EQ. -1) THEN
CALL attach(fidres, "/data/input","cpu_time",finish-start)
! make a checkpoint at last timestep if not crashed
IF(.NOT. crashed) THEN
IF(my_id .EQ. 0) write(*,*) 'Saving last state'
IF (nsave_5d .GT. 0) &
CALL diagnose_5d
ENDIF
! Close all diagnostic files
CALL mpi_barrier(MPI_COMM_WORLD, ierr)
CALL closef(fidres)
END IF
END SUBROUTINE diagnose_full
!!-------------- Auxiliary routines -----------------!!
SUBROUTINE diagnose_0d
USE basic
USE futils, ONLY: append, attach, getatt
USE diagnostics_par
USE prec_const
USE processing
USE model, ONLY: KIN_E
IMPLICIT NONE
! Time measurement data
CALL append(fidres, "/profiler/Tc_rhs", tc_rhs,ionode=0)
CALL append(fidres, "/profiler/Tc_adv_field", tc_adv_field,ionode=0)
CALL append(fidres, "/profiler/Tc_clos", tc_clos,ionode=0)
CALL append(fidres, "/profiler/Tc_ghost", tc_ghost,ionode=0)
CALL append(fidres, "/profiler/Tc_coll", tc_coll,ionode=0)
CALL append(fidres, "/profiler/Tc_poisson", tc_poisson,ionode=0)
CALL append(fidres, "/profiler/Tc_Sapj", tc_Sapj,ionode=0)
CALL append(fidres, "/profiler/Tc_checkfield",tc_checkfield,ionode=0)
CALL append(fidres, "/profiler/Tc_diag", tc_diag,ionode=0)
CALL append(fidres, "/profiler/Tc_process", tc_process,ionode=0)
CALL append(fidres, "/profiler/Tc_step", tc_step,ionode=0)
CALL append(fidres, "/profiler/time", time,ionode=0)
! Processing data
CALL append(fidres, "/data/var0d/time", time,ionode=0)
CALL append(fidres, "/data/var0d/cstep", real(cstep,dp),ionode=0)
CALL getatt(fidres, "/data/var0d/", "frames",iframe2d)
iframe0d=iframe0d+1
CALL attach(fidres,"/data/var0d/" , "frames", iframe0d)
! Ion transport data
IF (write_gamma) THEN
CALL compute_radial_ion_transport
CALL append(fidres, "/data/var0d/gflux_ri",gflux_ri,ionode=0)
CALL append(fidres, "/data/var0d/pflux_ri",pflux_ri,ionode=0)
ENDIF
IF (write_hf) THEN
CALL compute_radial_heatflux
CALL append(fidres, "/data/var0d/hflux_x",hflux_x,ionode=0)
ENDIF
END SUBROUTINE diagnose_0d
SUBROUTINE diagnose_3d
USE basic
USE futils, ONLY: append, getatt, attach, putarrnd, putarr
USE fields
USE array
USE grid, ONLY: ikxs,ikxe, ikys,ikye, Nkx, Nky, local_nkx, ikx, iky, ips_e, ips_i
USE time_integration
USE diagnostics_par
USE prec_const
USE processing
USE parallel, ONLY : gather_xyz
USE model, ONLY: KIN_E
IMPLICIT NONE
INTEGER :: i_, root, world_rank, world_size
CHARACTER(256) :: dset_name
CALL append(fidres, "/data/var3d/time", time,ionode=0)
CALL append(fidres, "/data/var3d/cstep", real(cstep,dp),ionode=0)
CALL getatt(fidres, "/data/var3d/", "frames",iframe3d)
iframe3d=iframe3d+1
CALL attach(fidres,"/data/var3d/" , "frames", iframe3d)
IF (write_phi) CALL write_field3d_kykxz(phi (ikys:ikye,ikxs:ikxe,izs:ize), 'phi')
IF (write_phi) THEN
CALL gather_xyz(phi(ikys:ikye,1:Nkx,izs:ize),phi_full(1:Nky,1:Nkx,1:Nz))
WRITE(dset_name, "(A, '/', i6.6)") "/data/var3d/phi_gatherv", iframe3d
CALL putarr(fidres, dset_name, phi_full(1:Nky,1:Nkx,1:Nz), ionode=0)
CALL attach(fidres, dset_name, "time", time)
ENDIF
IF (write_Na00) THEN
IF(KIN_E)THEN
IF (ips_e .EQ. 1) THEN
Ne00(ikys:ikye,ikxs:ikxe,izs:ize) = moments_e(ips_e,1,ikys:ikye,ikxs:ikxe,izs:ize,updatetlevel)
ENDIF
CALL write_field3d_kykxz(Ne00(ikys:ikye,ikxs:ikxe,izs:ize), 'Ne00')
ENDIF
IF (ips_i .EQ. 1) THEN
Ni00(ikys:ikye,ikxs:ikxe,izs:ize) = moments_i(ips_e,1,ikys:ikye,ikxs:ikxe,izs:ize,updatetlevel)
ENDIF
CALL write_field3d_kykxz(Ni00(ikys:ikye,ikxs:ikxe,izs:ize), 'Ni00')
WRITE(dset_name, "(A, '/', i6.6)") "/data/var3d/Ni00_gatherv", iframe3d
CALL gather_xyz(Ni00(ikys:ikye,1:Nkx,izs:ize),Ni00_full(1:Nky,1:Nkx,1:Nz))
CALL putarr(fidres, dset_name, Ni00_full(1:Nky,1:Nkx,1:Nz), ionode=0)
CALL attach(fidres, dset_name, "time", time)
CALL compute_Napjz_spectrum
IF(KIN_E) &
CALL write_field3d_pjz_e(Nepjz(ips_e:ipe_e,ijs_e:ije_e,izs:ize), 'Nepjz')
CALL write_field3d_pjz_i(Nipjz(ips_i:ipe_i,ijs_i:ije_i,izs:ize), 'Nipjz')
ENDIF
!! Fuid moments
IF (write_dens .OR. write_fvel .OR. write_temp) &
CALL compute_fluid_moments
IF (write_dens) THEN
IF(KIN_E)&
CALL write_field3d_kykxz(dens_e(ikys:ikye,ikxs:ikxe,izs:ize), 'dens_e')
CALL write_field3d_kykxz(dens_i(ikys:ikye,ikxs:ikxe,izs:ize), 'dens_i')
ENDIF
IF (write_fvel) THEN
IF(KIN_E)&
CALL write_field3d_kykxz(upar_e(ikys:ikye,ikxs:ikxe,izs:ize), 'upar_e')
CALL write_field3d_kykxz(upar_i(ikys:ikye,ikxs:ikxe,izs:ize), 'upar_i')
IF(KIN_E)&
CALL write_field3d_kykxz(uper_e(ikys:ikye,ikxs:ikxe,izs:ize), 'uper_e')
CALL write_field3d_kykxz(uper_i(ikys:ikye,ikxs:ikxe,izs:ize), 'uper_i')
ENDIF
IF (write_temp) THEN
IF(KIN_E)&
CALL write_field3d_kykxz(Tpar_e(ikys:ikye,ikxs:ikxe,izs:ize), 'Tpar_e')
CALL write_field3d_kykxz(Tpar_i(ikys:ikye,ikxs:ikxe,izs:ize), 'Tpar_i')
IF(KIN_E)&
CALL write_field3d_kykxz(Tper_e(ikys:ikye,ikxs:ikxe,izs:ize), 'Tper_e')
CALL write_field3d_kykxz(Tper_i(ikys:ikye,ikxs:ikxe,izs:ize), 'Tper_i')
IF(KIN_E)&
CALL write_field3d_kykxz(temp_e(ikys:ikye,ikxs:ikxe,izs:ize), 'temp_e')
CALL write_field3d_kykxz(temp_i(ikys:ikye,ikxs:ikxe,izs:ize), 'temp_i')
ENDIF
CONTAINS
SUBROUTINE write_field3d_kykxz(field, text)
IMPLICIT NONE
COMPLEX(dp), DIMENSION(ikys:ikye,ikxs:ikxe, izs:ize), INTENT(IN) :: field
CHARACTER(*), INTENT(IN) :: text
CHARACTER(256) :: dset_name
WRITE(dset_name, "(A, '/', A, '/', i6.6)") "/data/var3d", TRIM(text), iframe3d
IF (num_procs .EQ. 1) THEN ! no data distribution
CALL putarr(fidres, dset_name, field(ikys:ikye,ikxs:ikxe, izs:ize), ionode=0)
ELSE
CALL putarrnd(fidres, dset_name, field(ikys:ikye,ikxs:ikxe, izs:ize), (/1, 1, 3/))
ENDIF
CALL attach(fidres, dset_name, "time", time)
END SUBROUTINE write_field3d_kykxz
SUBROUTINE write_field3d_pjz_i(field, text)
IMPLICIT NONE
REAL(dp), DIMENSION(ips_i:ipe_i,ijs_i:ije_i,izs:ize), INTENT(IN) :: field
CHARACTER(*), INTENT(IN) :: text
CHARACTER(LEN=50) :: dset_name
WRITE(dset_name, "(A, '/', A, '/', i6.6)") "/data/var3d", TRIM(text), iframe3d
IF (num_procs .EQ. 1) THEN ! no data distribution
CALL putarr(fidres, dset_name, field(ips_i:ipe_i,ijs_i:ije_i,izs:ize), ionode=0)
ELSE
CALL putarrnd(fidres, dset_name, field(ips_i:ipe_i,ijs_i:ije_i,izs:ize), (/1, 0, 3/))
ENDIF
CALL attach(fidres, dset_name, "time", time)
END SUBROUTINE write_field3d_pjz_i
SUBROUTINE write_field3d_pjz_e(field, text)
IMPLICIT NONE
REAL(dp), DIMENSION(ips_e:ipe_e,ijs_e:ije_e,izs:ize), INTENT(IN) :: field
CHARACTER(*), INTENT(IN) :: text
CHARACTER(LEN=50) :: dset_name
WRITE(dset_name, "(A, '/', A, '/', i6.6)") "/data/var3d", TRIM(text), iframe3d
IF (num_procs .EQ. 1) THEN ! no data distribution
CALL putarr(fidres, dset_name, field(ips_e:ipe_e,ijs_e:ije_e,izs:ize), ionode=0)
ELSE
CALL putarrnd(fidres, dset_name, field(ips_e:ipe_e,ijs_e:ije_e,izs:ize), (/1, 0, 3/))
ENDIF
CALL attach(fidres, dset_name, "time", time)
END SUBROUTINE write_field3d_pjz_e
END SUBROUTINE diagnose_3d
SUBROUTINE diagnose_5d
USE basic
USE futils, ONLY: append, getatt, attach, putarrnd
USE fields
USE array!, ONLY: Sepj, Sipj
USE grid, ONLY: ips_e,ipe_e, ips_i, ipe_i, &
ijs_e,ije_e, ijs_i, ije_i, &
ikxs,ikxe,ikys,ikye,izs,ize
USE time_integration
USE diagnostics_par
USE prec_const
USE model, ONLY: KIN_E
IMPLICIT NONE
CALL append(fidres, "/data/var5d/time", time,ionode=0)
CALL append(fidres, "/data/var5d/cstep", real(cstep,dp),ionode=0)
CALL getatt(fidres, "/data/var5d/", "frames",iframe5d)
iframe5d=iframe5d+1
CALL attach(fidres,"/data/var5d/" , "frames", iframe5d)
IF (write_Napj) THEN
IF(KIN_E)&
CALL write_field5d_e(moments_e(ips_e:ipe_e,ijs_e:ije_e,ikys:ikye,ikxs:ikxe,izs:ize,updatetlevel), 'moments_e')
CALL write_field5d_i(moments_i(ips_i:ipe_i,ijs_i:ije_i,ikys:ikye,ikxs:ikxe,izs:ize,updatetlevel), 'moments_i')
ENDIF
IF (write_Sapj) THEN
IF(KIN_E)&
CALL write_field5d_e(Sepj(ips_e:ipe_e,ijs_e:ije_e,ikys:ikye,ikxs:ikxe,izs:ize), 'Sepj')
CALL write_field5d_i(Sipj(ips_i:ipe_i,ijs_i:ije_i,ikys:ikye,ikxs:ikxe,izs:ize), 'Sipj')
ENDIF
CONTAINS
SUBROUTINE write_field5d_e(field, text)
USE futils, ONLY: attach, putarr, putarrnd
USE grid, ONLY: ips_e,ipe_e, ijs_e,ije_e, ikxs,ikxe, ikys,ikye, izs,ize
USE prec_const
IMPLICIT NONE
COMPLEX(dp), DIMENSION(ips_e:ipe_e,ijs_e:ije_e,ikys:ikye,ikxs:ikxe,izs:ize), INTENT(IN) :: field
CHARACTER(*), INTENT(IN) :: text
CHARACTER(LEN=50) :: dset_name
WRITE(dset_name, "(A, '/', A, '/', i6.6)") "/data/var5d", TRIM(text), iframe5d
IF (num_procs .EQ. 1) THEN
CALL putarr(fidres, dset_name, field(ips_e:ipe_e,ijs_e:ije_e,ikys:ikye,ikxs:ikxe,izs:ize), ionode=0)
ELSE
CALL putarrnd(fidres, dset_name, field(ips_e:ipe_e,ijs_e:ije_e,ikys:ikye,ikxs:ikxe,izs:ize), (/1,3,5/))
ENDIF
CALL attach(fidres, dset_name, 'cstep', cstep)
CALL attach(fidres, dset_name, 'time', time)
CALL attach(fidres, dset_name, 'jobnum', jobnum)
CALL attach(fidres, dset_name, 'dt', dt)
CALL attach(fidres, dset_name, 'iframe2d', iframe2d)
CALL attach(fidres, dset_name, 'iframe5d', iframe5d)
END SUBROUTINE write_field5d_e
SUBROUTINE write_field5d_i(field, text)
USE futils, ONLY: attach, putarr, putarrnd
USE grid, ONLY: ips_i,ipe_i, ijs_i,ije_i, ikxs,ikxe, ikys,ikye, izs,ize
USE prec_const
IMPLICIT NONE
COMPLEX(dp), DIMENSION(ips_i:ipe_i,ijs_i:ije_i,ikys:ikye,ikxs:ikxe,izs:ize), INTENT(IN) :: field
CHARACTER(*), INTENT(IN) :: text
CHARACTER(LEN=50) :: dset_name
WRITE(dset_name, "(A, '/', A, '/', i6.6)") "/data/var5d", TRIM(text), iframe5d
IF (num_procs .EQ. 1) THEN
CALL putarr(fidres, dset_name, field(ips_i:ipe_i,ijs_i:ije_i,ikys:ikye,ikxs:ikxe,izs:ize), ionode=0)
ELSE
CALL putarrnd(fidres, dset_name, field(ips_i:ipe_i,ijs_i:ije_i,ikys:ikye,ikxs:ikxe,izs:ize), (/1,3,5/))
ENDIF
CALL attach(fidres, dset_name, 'cstep', cstep)
CALL attach(fidres, dset_name, 'time', time)
CALL attach(fidres, dset_name, 'jobnum', jobnum)
CALL attach(fidres, dset_name, 'dt', dt)
CALL attach(fidres, dset_name, 'iframe2d', iframe2d)
CALL attach(fidres, dset_name, 'iframe5d', iframe5d)
END SUBROUTINE write_field5d_i
END SUBROUTINE diagnose_5d
SUBROUTINE diagnose_gridgeom(kstep)
USE basic
USE grid
USE diagnostics_par
USE futils, ONLY: putarr, creatg, putarrnd, closef
USE time_integration
USE prec_const
USE geometry
USE array
IMPLICIT NONE
INTEGER, INTENT(in) :: kstep
INTEGER, parameter :: BUFSIZE = 2
INTEGER :: rank = 0
INTEGER :: dims(1) = (/0/)
IF (kstep .EQ. 0) THEN
! Grid info
CALL init_outfile(comm0,ggmfile0,ggmfile,fidggm)
CALL creatg(fidggm, "/data/grid", "Grid data")
CALL putarr(fidggm, "/data/grid/coordkx", kxarray_full, "kx*rho_s0", ionode=0)
CALL putarr(fidggm, "/data/grid/coordky", kyarray_full, "ky*rho_s0", ionode=0)
CALL putarr(fidggm, "/data/grid/coordz", zarray_full, "z/R", ionode=0)
CALL putarr(fidggm, "/data/grid/coordp_e" , parray_e_full, "p_e", ionode=0)
CALL putarr(fidggm, "/data/grid/coordj_e" , jarray_e_full, "j_e", ionode=0)
CALL putarr(fidggm, "/data/grid/coordp_i" , parray_i_full, "p_i", ionode=0)
CALL putarr(fidggm, "/data/grid/coordj_i" , jarray_i_full, "j_i", ionode=0)
! Metric info
CALL creatg(fidggm, "/data/metric", "Metric data")
CALL putarrnd(fidggm, "/data/metric/gxx", gxx(izs:ize,0:1), (/1, 1, 1/))
CALL putarrnd(fidggm, "/data/metric/gxy", gxy(izs:ize,0:1), (/1, 1, 1/))
CALL putarrnd(fidggm, "/data/metric/gyy", gyy(izs:ize,0:1), (/1, 1, 1/))
CALL putarrnd(fidggm, "/data/metric/gyz", gyz(izs:ize,0:1), (/1, 1, 1/))
CALL putarrnd(fidggm, "/data/metric/gzz", gzz(izs:ize,0:1), (/1, 1, 1/))
CALL putarrnd(fidggm, "/data/metric/hatR", hatR(izs:ize,0:1), (/1, 1, 1/))
CALL putarrnd(fidggm, "/data/metric/hatZ", hatZ(izs:ize,0:1), (/1, 1, 1/))
CALL putarrnd(fidggm, "/data/metric/hatB", hatB(izs:ize,0:1), (/1, 1, 1/))
CALL putarrnd(fidggm, "/data/metric/gradxB", gradxB(izs:ize,0:1), (/1, 1, 1/))
CALL putarrnd(fidggm, "/data/metric/gradyB", gradyB(izs:ize,0:1), (/1, 1, 1/))
CALL putarrnd(fidggm, "/data/metric/gradzB", gradzB(izs:ize,0:1), (/1, 1, 1/))
CALL putarrnd(fidggm, "/data/metric/Jacobian", Jacobian(izs:ize,0:1), (/1, 1, 1/))
CALL putarrnd(fidggm, "/data/metric/gradz_coeff", gradz_coeff(izs:ize,0:1), (/1, 1, 1/))
CALL putarrnd(fidggm, "/data/metric/Ckxky", Ckxky(ikys:ikye,ikxs:ikxe,izs:ize,0:1), (/1, 1, 3/))
CALL putarrnd(fidggm, "/data/metric/kernel_i", kernel_i(ijs_i:ije_i,ikys:ikye,ikxs:ikxe,izs:ize,0:1), (/ 1, 2, 4/))
ENDIF
IF (kstep .EQ. -1) THEN
CALL mpi_barrier(MPI_COMM_WORLD, ierr)
CALL closef(fidggm)
ENDIF
END SUBROUTINE diagnose_gridgeom
SUBROUTINE diagnose_moments(kstep)
USE basic
USE grid
USE diagnostics_par
USE futils, ONLY: creatg,creatd,append,putarr,putarrnd,attach,closef,getatt
USE model, ONLY: KIN_E
USE array, ONLY: Sepj,Sipj
USE fields, ONLY: moments_e, moments_i
USE time_integration
USE utility
USE prec_const
IMPLICIT NONE
INTEGER, INTENT(in) :: kstep
INTEGER, parameter :: BUFSIZE = 2
INTEGER :: rank = 0
INTEGER :: dims(1) = (/0/)
!____________________________________________________________________________!
IF ((kstep .EQ. 0)) THEN
! var5d group (moments)
IF (nsave_5d .GT. 0) THEN
CALL init_outfile(comm0, momfile0,momfile,fidmom)
CALL creatd(fidmom, rank, dims, "/data/time", "Time t*c_s/R")
CALL creatd(fidmom, rank, dims, "/data/cstep", "iteration number")
IF (write_Napj) THEN
IF(KIN_E)&
CALL creatg(fidmom, "/data/moments_e", "moments_e")
CALL creatg(fidmom, "/data/moments_i", "moments_i")
ENDIF
IF (write_Sapj) THEN
IF(KIN_E)&
CALL creatg(fidmom, "/data/moments_e", "Sipj")
CALL creatg(fidmom, "/data/moments_i", "Sepj")
ENDIF
IF (cstep==0) THEN
iframe5d=0
END IF
CALL attach(fidmom,"/data/" , "frames", iframe5d)
END IF
ENDIF
!_____________________________________________________________________________
! 2. Periodic diagnostics
!
IF ((kstep .GE. 0) .OR. ((kstep .EQ. -1) .AND. (.NOT. CRASHED))) THEN
IF((kstep .EQ. -1) .AND. (.NOT. CRASHED .AND. (my_id .EQ. 0))) &
write(*,*) 'Saving last state'
! 2.3 5d profiles
IF (MOD(cstep, nsave_5d) == 0) THEN
CALL append(fidmom, "/data/time", time,ionode=0)
CALL append(fidmom, "/data/cstep", real(cstep,dp),ionode=0)
CALL getatt(fidmom, "/data/", "frames",iframe5d)
iframe5d=iframe5d+1
CALL attach(fidmom,"/data/" , "frames", iframe5d)
IF (write_Napj) THEN
IF(KIN_E)&
CALL write_field5d_e(moments_e(ips_e:ipe_e,ijs_e:ije_e,ikys:ikye,ikxs:ikxe,izs:ize,updatetlevel), 'moments_e')
CALL write_field5d_i(moments_i(ips_i:ipe_i,ijs_i:ije_i,ikys:ikye,ikxs:ikxe,izs:ize,updatetlevel), 'moments_i')
ENDIF
IF (write_Sapj) THEN
IF(KIN_E)&
CALL write_field5d_e(Sepj(ips_e:ipe_e,ijs_e:ije_e,ikys:ikye,ikxs:ikxe,izs:ize), 'Sepj')
CALL write_field5d_i(Sipj(ips_i:ipe_i,ijs_i:ije_i,ikys:ikye,ikxs:ikxe,izs:ize), 'Sipj')
ENDIF
END IF
END IF
!_____________________________________________________________________________
! 3. Final diagnostics
IF (kstep .EQ. -1) THEN
! Close diagnostic files
CALL mpi_barrier(MPI_COMM_WORLD, ierr)
CALL closef(fidmom)
END IF
CONTAINS
SUBROUTINE write_field5d_e(field, text)
USE futils, ONLY: attach, putarr, putarrnd
USE grid, ONLY: ips_e,ipe_e, ijs_e,ije_e, ikxs,ikxe, ikys,ikye, izs,ize
USE prec_const
IMPLICIT NONE
COMPLEX(dp), DIMENSION(ips_e:ipe_e,ijs_e:ije_e,ikys:ikye,ikxs:ikxe,izs:ize), INTENT(IN) :: field
CHARACTER(*), INTENT(IN) :: text
CHARACTER(LEN=50) :: dset_name
WRITE(dset_name, "(A, '/', A, '/', i6.6)") "/data", TRIM(text), iframe5d
IF (num_procs .EQ. 1) THEN
CALL putarr(fidmom, dset_name, field(ips_e:ipe_e,ijs_e:ije_e,ikys:ikye,ikxs:ikxe,izs:ize), ionode=0)
ELSE
CALL putarrnd(fidmom, dset_name, field(ips_e:ipe_e,ijs_e:ije_e,ikys:ikye,ikxs:ikxe,izs:ize), (/1,3,5/))
ENDIF
CALL attach(fidmom, dset_name, 'cstep', cstep)
CALL attach(fidmom, dset_name, 'time', time)
CALL attach(fidmom, dset_name, 'jobnum', jobnum)
CALL attach(fidmom, dset_name, 'dt', dt)
CALL attach(fidmom, dset_name, 'iframe2d', iframe2d)
CALL attach(fidmom, dset_name, 'iframe5d', iframe5d)
END SUBROUTINE write_field5d_e
SUBROUTINE write_field5d_i(field, text)
USE futils, ONLY: attach, putarr, putarrnd
USE grid, ONLY: ips_i,ipe_i, ijs_i,ije_i, ikxs,ikxe, ikys,ikye, izs,ize
USE prec_const
IMPLICIT NONE
COMPLEX(dp), DIMENSION(ips_i:ipe_i,ijs_i:ije_i,ikys:ikye,ikxs:ikxe,izs:ize), INTENT(IN) :: field
CHARACTER(*), INTENT(IN) :: text
CHARACTER(LEN=50) :: dset_name
WRITE(dset_name, "(A, '/', A, '/', i6.6)") "/data", TRIM(text), iframe5d
IF (num_procs .EQ. 1) THEN
CALL putarr(fidmom, dset_name, field(ips_i:ipe_i,ijs_i:ije_i,ikys:ikye,ikxs:ikxe,izs:ize), ionode=0)
ELSE
CALL putarrnd(fidmom, dset_name, field(ips_i:ipe_i,ijs_i:ije_i,ikys:ikye,ikxs:ikxe,izs:ize), (/1,3,5/))
ENDIF
CALL attach(fidmom, dset_name, 'cstep', cstep)
CALL attach(fidmom, dset_name, 'time', time)
CALL attach(fidmom, dset_name, 'jobnum', jobnum)
CALL attach(fidmom, dset_name, 'dt', dt)
CALL attach(fidmom, dset_name, 'iframe2d', iframe2d)
CALL attach(fidmom, dset_name, 'iframe5d', iframe5d)
END SUBROUTINE write_field5d_i
END SUBROUTINE diagnose_moments
SUBROUTINE diagnose_momspectrum(kstep)
USE basic
USE grid
USE diagnostics_par
USE futils
USE array
USE model
USE initial_par
USE fields
USE time_integration
USE utility
USE prec_const
USE collision, ONLY: coll_outputinputs
USE geometry
USE processing
IMPLICIT NONE
INTEGER, INTENT(in) :: kstep
INTEGER, parameter :: BUFSIZE = 2
INTEGER :: rank = 0, frame
INTEGER :: dims(1) = (/0/)
!____________________________________________________________________________!
IF ((kstep .EQ. 0)) THEN
! var3d group (pjz, spectrum of moments)
IF (nsave_3d .GT. 0) THEN
CALL init_outfile(comm_pz, mspfile0,mspfile,fidmsp)
CALL creatd(fidmsp, rank, dims, "/data/time", "Time t*c_s/R")
CALL creatd(fidmsp, rank, dims, "/data/cstep", "iteration number")
IF (write_Na00) THEN
IF(KIN_E)&
CALL creatg(fidmsp, "/data/Nepjz", "Nepjz")
CALL creatg(fidmsp, "/data/Nipjz", "Nipjz")
ENDIF
IF (cstep==0) THEN
iframe3d=0
ENDIF
CALL attach(fidmsp,"/data/" , "frames", iframe3d)
END IF
ENDIF
!_____________________________________________________________________________
! 2. Periodic diagnostics
!
IF (kstep .GE. 0) THEN
! 2.2 3d profiles
IF (nsave_3d .GT. 0) THEN
IF (MOD(cstep, nsave_3d) == 0) THEN
CALL append(fidmsp, "/data/time", time,ionode=0)
CALL append(fidmsp, "/data/cstep", real(cstep,dp),ionode=0)
CALL getatt(fidmsp, "/data/", "frames",frame)
frame=frame+1
CALL attach(fidmsp,"/data/" , "frames", frame)
IF (write_Na00) THEN
CALL compute_Napjz_spectrum
IF(KIN_E) &
CALL write_field3d_pjz_e(Nepjz(ips_e:ipe_e,ijs_e:ije_e,izs:ize), 'Nepjz', frame)
CALL write_field3d_pjz_i(Nipjz(ips_i:ipe_i,ijs_i:ije_i,izs:ize), 'Nipjz', frame)
ENDIF
END IF
END IF
!_____________________________________________________________________________
! 3. Final diagnostics
ELSEIF (kstep .EQ. -1) THEN
! Close diagnostic files
CALL mpi_barrier(MPI_COMM_WORLD, ierr)
CALL closef(fidmsp)
END IF
CONTAINS
SUBROUTINE write_field3d_pjz_i(field, text, frame)
IMPLICIT NONE
REAL(dp), DIMENSION(ips_i:ipe_i,ijs_i:ije_i,izs:ize), INTENT(IN) :: field
CHARACTER(*), INTENT(IN) :: text
INTEGER, INTENT(IN) :: frame
CHARACTER(LEN=50) :: dset_name
WRITE(dset_name, "(A, '/', A, '/', i6.6)") "/data", TRIM(text), frame
IF (num_procs .EQ. 1) THEN ! no data distribution
CALL putarr(fidmsp, dset_name, field(ips_i:ipe_i,ijs_i:ije_i,izs:ize), ionode=0)
ELSE
CALL putarrnd(fidmsp, dset_name, field(ips_i:ipe_i,ijs_i:ije_i,izs:ize), (/1, 3/))
ENDIF
CALL attach(fidmsp, dset_name, "time", time)
END SUBROUTINE write_field3d_pjz_i
SUBROUTINE write_field3d_pjz_e(field, text, frame)
IMPLICIT NONE
REAL(dp), DIMENSION(ips_e:ipe_e,ijs_e:ije_e,izs:ize), INTENT(IN) :: field
CHARACTER(*), INTENT(IN) :: text
INTEGER, INTENT(IN) :: frame
CHARACTER(LEN=50) :: dset_name
WRITE(dset_name, "(A, '/', A, '/', i6.6)") "/data", TRIM(text), frame
IF (num_procs .EQ. 1) THEN ! no data distribution
CALL putarr (fidmsp, dset_name, field(ips_e:ipe_e,ijs_e:ije_e,izs:ize), ionode=0)
ELSE
CALL putarrnd(fidmsp, dset_name, field(ips_e:ipe_e,ijs_e:ije_e,izs:ize), (/1, 3/))
ENDIF
CALL attach(fidmsp, dset_name, "time", time)
END SUBROUTINE write_field3d_pjz_e
END SUBROUTINE diagnose_momspectrum
SUBROUTINE diagnose_profiler(kstep)
USE basic
USE diagnostics_par
USE futils, ONLY: creatd,creatg,append,closef
USE time_integration
USE utility
USE prec_const
IMPLICIT NONE
INTEGER, INTENT(in) :: kstep
INTEGER :: dims(1) = (/0/)
!____________________________________________________________________________!
IF ((kstep .EQ. 0)) THEN
CALL init_outfile(comm0, prffile0,prffile,fidprf)
! data time measurement
CALL creatd(fidprf, 0, dims, "/data/Tc_rhs", "cumulative rhs computation time")
CALL creatd(fidprf, 0, dims, "/data/Tc_adv_field", "cumulative adv. fields computation time")
CALL creatd(fidprf, 0, dims, "/data/Tc_clos", "cumulative closure computation time")
CALL creatd(fidprf, 0, dims, "/data/Tc_ghost", "cumulative communication time")
CALL creatd(fidprf, 0, dims, "/data/Tc_coll", "cumulative collision computation time")
CALL creatd(fidprf, 0, dims, "/data/Tc_poisson", "cumulative poisson computation time")
CALL creatd(fidprf, 0, dims, "/data/Tc_Sapj", "cumulative Sapj computation time")
CALL creatd(fidprf, 0, dims, "/data/Tc_checkfield", "cumulative checkfield computation time")
CALL creatd(fidprf, 0, dims, "/data/Tc_diag", "cumulative sym computation time")
CALL creatd(fidprf, 0, dims, "/data/Tc_process", "cumulative process computation time")
CALL creatd(fidprf, 0, dims, "/data/Tc_step", "cumulative total step computation time")
CALL creatd(fidprf, 0, dims, "/data/time", "current simulation time")
ENDIF
!_____________________________________________________________________________
! 2. Periodic diagnostics
!
IF (kstep .GE. 0) THEN
! Time measurement data
CALL append(fidprf, "/data/Tc_rhs", tc_rhs,ionode=0)
CALL append(fidprf, "/data/Tc_adv_field", tc_adv_field,ionode=0)
CALL append(fidprf, "/data/Tc_clos", tc_clos,ionode=0)
CALL append(fidprf, "/data/Tc_ghost", tc_ghost,ionode=0)
CALL append(fidprf, "/data/Tc_coll", tc_coll,ionode=0)
CALL append(fidprf, "/data/Tc_poisson", tc_poisson,ionode=0)
CALL append(fidprf, "/data/Tc_Sapj", tc_Sapj,ionode=0)
CALL append(fidprf, "/data/Tc_checkfield",tc_checkfield,ionode=0)
CALL append(fidprf, "/data/Tc_diag", tc_diag,ionode=0)
CALL append(fidprf, "/data/Tc_process", tc_process,ionode=0)
CALL append(fidprf, "/data/Tc_step", tc_step,ionode=0)
CALL append(fidprf, "/data/time", time,ionode=0)
!_____________________________________________________________________________
! 3. Final diagnostics
ELSEIF (kstep .EQ. -1) THEN
! Close diagnostic files
CALL mpi_barrier(MPI_COMM_WORLD, ierr)
CALL closef(fidprf)
END IF
END SUBROUTINE diagnose_profiler
SUBROUTINE diagnose_timetraces(kstep)
USE basic
USE grid
USE diagnostics_par
USE futils
USE array
USE model
USE initial_par
USE fields
USE time_integration
USE utility
USE prec_const
USE collision, ONLY: coll_outputinputs
USE geometry
USE processing
IMPLICIT NONE
INTEGER, INTENT(in) :: kstep
INTEGER, parameter :: BUFSIZE = 2
INTEGER :: rank = 0
INTEGER :: dims(1) = (/0/)
!____________________________________________________________________________!
IF ((kstep .EQ. 0)) THEN
CALL init_outfile(comm0, ttrfile0,ttrfile,fidttr)
! var0d group (gyro transport)
CALL creatd(fidttr, rank, dims, "/data/time", "Time t*c_s/R")
CALL creatd(fidttr, rank, dims, "/data/cstep", "iteration number")
IF (write_gamma) THEN
CALL creatd(fidttr, rank, dims, "/data/gflux_ri", "Radial gyro ion transport")
CALL creatd(fidttr, rank, dims, "/data/pflux_ri", "Radial part ion transport")
ENDIF
IF (write_hf) THEN
CALL creatd(fidttr, rank, dims, "/data/hflux_x", "Radial part ion heat flux")
ENDIF
IF (cstep==0) THEN
iframe0d=0
ENDIF
CALL attach(fidttr,"/data/" , "frames", iframe0d)
ENDIF
!_____________________________________________________________________________
! 2. Periodic diagnostics
!
IF (kstep .GE. 0) THEN
! 0d time traces arrays
IF ( MOD(cstep, nsave_0d) == 0 ) THEN
! Processing data
CALL append(fidttr, "/data/time", time,ionode=0)
CALL append(fidttr, "/data/cstep", real(cstep,dp),ionode=0)
CALL getatt(fidttr, "/data/", "frames",iframe0d)
iframe0d=iframe0d+1
CALL attach(fidttr,"/data/" , "frames", iframe0d)
! Ion transport data
IF (write_gamma) THEN
CALL compute_radial_ion_transport
CALL append(fidttr, "/data/gflux_ri",gflux_ri,ionode=0)
CALL append(fidttr, "/data/pflux_ri",pflux_ri,ionode=0)
ENDIF
IF (write_hf) THEN
CALL compute_radial_heatflux
CALL append(fidttr, "/data/hflux_x",hflux_x,ionode=0)
ENDIF
END IF
!_____________________________________________________________________________
! 3. Final diagnostics
ELSEIF (kstep .EQ. -1) THEN
! Close diagnostic files
CALL mpi_barrier(MPI_COMM_WORLD, ierr)
CALL closef(fidttr)
END IF
END SUBROUTINE diagnose_timetraces
!____________________________________________________________________________!
! AUXILIARY ROUTINES
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment