From 5228831eef37cb597e3abfc81bb2f2b1cb95ce7e Mon Sep 17 00:00:00 2001 From: Antoine Hoffmann <antoine.hoffmann@epfl.ch> Date: Wed, 8 Mar 2023 11:42:36 +0100 Subject: [PATCH] code compiles, runs, and output correclty but wrong values --- src/array_mod.F90 | 3 - src/diagnose.F90 | 287 ++++++++++----------- src/grid_mod.F90 | 22 +- src/inital.F90 | 10 +- src/memory.F90 | 1 - src/parallel_mod.F90 | 20 +- src/processing_mod.F90 | 18 +- testcases/smallest_problem/fort.90 | 35 ++- testcases/smallest_problem/fort_00.90 | 17 +- testcases/smallest_problem/gyacomo_1 | 1 + testcases/smallest_problem/gyacomo_1_debug | 1 + testcases/smallest_problem/gyacomo_alpha | 1 - wk/header_3D_results.m | 2 +- 13 files changed, 204 insertions(+), 214 deletions(-) create mode 120000 testcases/smallest_problem/gyacomo_1 create mode 120000 testcases/smallest_problem/gyacomo_1_debug delete mode 120000 testcases/smallest_problem/gyacomo_alpha diff --git a/src/array_mod.F90 b/src/array_mod.F90 index d6f1fdeb..da4d7c9b 100644 --- a/src/array_mod.F90 +++ b/src/array_mod.F90 @@ -48,9 +48,6 @@ MODULE array REAL(dp), DIMENSION(:,:,:), ALLOCATABLE :: inv_pol_ion ! REAL(dp), DIMENSION(:,:,:), ALLOCATABLE :: HF_phi_correction_operator - ! Gyrocenter density for electron and ions (ia,iky,ikx,iz) - COMPLEX(dp), DIMENSION(:,:,:,:), ALLOCATABLE :: Na00 - ! Kinetic spectrum sum_kx,ky(|Napj(z)|^2), (ia,ip,ij,iz) (should be real) REAL(dp), DIMENSION(:,:,:,:), ALLOCATABLE :: Napjz diff --git a/src/diagnose.F90 b/src/diagnose.F90 index 20872259..a98d5981 100644 --- a/src/diagnose.F90 +++ b/src/diagnose.F90 @@ -5,10 +5,8 @@ SUBROUTINE diagnose(kstep) USE processing, ONLY: pflux_x, hflux_x USE parallel, ONLY: my_id IMPLICIT NONE - INTEGER, INTENT(in) :: kstep CALL cpu_time(t0_diag) ! Measuring time - !! Basic diagnose loop for reading input file, displaying advancement and ending IF ((kstep .EQ. 0)) THEN INQUIRE(unit=lu_in, name=input_fname) @@ -51,7 +49,6 @@ SUBROUTINE init_outfile(comm,file0,file,fid) INTEGER, INTENT(OUT) :: fid CHARACTER(len=256) :: str INCLUDE 'srcinfo.h' - ! Writing output filename WRITE(file,'(a,a1,i2.2,a3)') TRIM(file0) ,'_',jobnum,'.h5' ! 1.1 Initial run @@ -67,15 +64,14 @@ SUBROUTINE init_outfile(comm,file0,file,fid) ! File group CALL creatg(fid, "/files", "files") CALL attach(fid, "/files", "jobnum", jobnum) - ! Add the code info and parameters to the file CALL creatg(fid, "/data/input", "input") CALL creatd(fid, 0,(/0/),"/data/input/codeinfo",'Code Information') - CALL attach(fid, TRIM(str), "version", VERSION) !defined in srcinfo.h - CALL attach(fid, TRIM(str), "branch", BRANCH) !defined in srcinfo.h - CALL attach(fid, TRIM(str), "author", AUTHOR) !defined in srcinfo.h - CALL attach(fid, TRIM(str), "execdate", EXECDATE) !defined in srcinfo.h - CALL attach(fid, TRIM(str), "host", HOST) !defined in srcinfo.h + CALL attach(fid, "/data/input/codeinfo", "version", VERSION) !defined in srcinfo.h + CALL attach(fid, "/data/input/codeinfo", "branch", BRANCH) !defined in srcinfo.h + CALL attach(fid, "/data/input/codeinfo", "author", AUTHOR) !defined in srcinfo.h + CALL attach(fid, "/data/input/codeinfo", "execdate", EXECDATE) !defined in srcinfo.h + CALL attach(fid, "/data/input/codeinfo", "host", HOST) !defined in srcinfo.h CALL basic_outputinputs(fid) CALL grid_outputinputs(fid) CALL geometry_outputinputs(fid) @@ -85,7 +81,6 @@ SUBROUTINE init_outfile(comm,file0,file,fid) CALL coll_outputinputs(fid) CALL initial_outputinputs(fid) CALL time_integration_outputinputs(fid) - ! Save STDIN (input file) of this run IF(jobnum .LE. 99) THEN WRITE(str,'(a,i2.2)') "/files/STDIN.",jobnum @@ -97,38 +92,31 @@ END SUBROUTINE init_outfile SUBROUTINE diagnose_full(kstep) USE basic, ONLY: speak,& - cstep,iframe0d,iframe2d,iframe3d,iframe5d,& + cstep,iframe0d,iframe3d,iframe5d,& start,finish,crashed USE grid, ONLY: & - ias,iae, & - parray_full,pmax,& - ijs,ije,jarray_full,jmax,& - ikys,ikye,kyarray_full,& - ikxs,ikxe,kxarray_full,& - izs,ize,zarray_full + local_nj,local_nky,local_nkx,local_nz,ngj,ngz,& + parray_full,pmax,jarray_full,jmax,& + kyarray_full,kxarray_full,zarray_full, total_na USE diagnostics_par USE futils, ONLY: creatf, creatg, creatd, closef, putarr, putfile, attach, openf, putarrnd + USE species, ONLY: name USE array - USE model, ONLY: - USE initial_par, ONLY: - USE fields, ONLY: - USE time_integration,ONLY: + USE model, ONLY: EM USE parallel, ONLY: my_id, comm0 - USE prec_const, ONLY: USE collision, ONLY: coll_outputinputs USE geometry, ONLY: gxx,gxy,gyy,gxz,gyz,gzz,hatR,hatZ,hatB,dBdx,dBdy,dBdz,Jacobian,gradz_coeff,Ckxky IMPLICIT NONE - + CHARACTER :: letter_a INTEGER, INTENT(in) :: kstep INTEGER, parameter :: BUFSIZE = 2 - INTEGER :: rank = 0, ierr + INTEGER :: rank = 0, ierr, ia INTEGER :: dims(1) = (/0/) !____________________________________________________________________________ ! 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") @@ -143,7 +131,6 @@ SUBROUTINE diagnose_full(kstep) CALL creatd(fidres, 0, dims, "/profiler/Tc_diag", "cumulative sym 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) @@ -151,106 +138,87 @@ SUBROUTINE diagnose_full(kstep) CALL putarr(fidres, "/data/grid/coordz", zarray_full, "z/R", ionode=0) CALL putarr(fidres, "/data/grid/coordp" , parray_full, "p", ionode=0) CALL putarr(fidres, "/data/grid/coordj" , jarray_full, "j", 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/gxz", gxz(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/dBdx", dBdx(izs:ize,0:1), (/1, 1, 1/)) - CALL putarrnd(fidres, "/data/metric/dBdy", dBdy(izs:ize,0:1), (/1, 1, 1/)) - CALL putarrnd(fidres, "/data/metric/dBdz", dBdz(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", kernel(ias:iae,ijs:ije,ikys:ikye,ikxs:ikxe,izs:ize,0:1), (/1, 1, 2, 4/)) - + CALL putarrnd(fidres, "/data/metric/gxx", gxx(1+ngz/2:local_nz+ngz/2,:), (/1, 1, 1/)) + CALL putarrnd(fidres, "/data/metric/gxy", gxy(1+ngz/2:local_nz+ngz/2,:), (/1, 1, 1/)) + CALL putarrnd(fidres, "/data/metric/gxz", gxz(1+ngz/2:local_nz+ngz/2,:), (/1, 1, 1/)) + CALL putarrnd(fidres, "/data/metric/gyy", gyy(1+ngz/2:local_nz+ngz/2,:), (/1, 1, 1/)) + CALL putarrnd(fidres, "/data/metric/gyz", gyz(1+ngz/2:local_nz+ngz/2,:), (/1, 1, 1/)) + CALL putarrnd(fidres, "/data/metric/gzz", gzz(1+ngz/2:local_nz+ngz/2,:), (/1, 1, 1/)) + CALL putarrnd(fidres, "/data/metric/hatR", hatR(1+ngz/2:local_nz+ngz/2,:), (/1, 1, 1/)) + CALL putarrnd(fidres, "/data/metric/hatZ", hatZ(1+ngz/2:local_nz+ngz/2,:), (/1, 1, 1/)) + CALL putarrnd(fidres, "/data/metric/hatB", hatB(1+ngz/2:local_nz+ngz/2,:), (/1, 1, 1/)) + CALL putarrnd(fidres, "/data/metric/dBdx", dBdx(1+ngz/2:local_nz+ngz/2,:), (/1, 1, 1/)) + CALL putarrnd(fidres, "/data/metric/dBdy", dBdy(1+ngz/2:local_nz+ngz/2,:), (/1, 1, 1/)) + CALL putarrnd(fidres, "/data/metric/dBdz", dBdz(1+ngz/2:local_nz+ngz/2,:), (/1, 1, 1/)) + CALL putarrnd(fidres, "/data/metric/Jacobian", Jacobian(1+ngz/2:local_nz+ngz/2,:), (/1, 1, 1/)) + CALL putarrnd(fidres, "/data/metric/gradz_coeff", gradz_coeff(1+ngz/2:local_nz+ngz/2,:), (/1, 1, 1/)) + CALL putarrnd(fidres, "/data/metric/Ckxky", Ckxky(1:local_nky,1:local_nkx,1+ngz/2:local_nz+ngz/2,:), (/1, 1, 3/)) + CALL putarrnd(fidres, "/data/metric/kernel", kernel(1,1+ngj/2:local_nj+ngj/2,1:local_nky,1:local_nkx,1+ngz/2:local_nz+ngz/2,:), (/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_x", "Radial gyro transport") - CALL creatd(fidres, rank, dims, "/data/var0d/pflux_x", "Radial part transport") + DO ia=1,total_na + letter_a = name(ia)(1:1) + CALL creatd(fidres, rank, dims, "/data/var0d/gflux_x"//letter_a, "Radial gyro transport") + CALL creatd(fidres, rank, dims, "/data/var0d/pflux_x"//letter_a, "Radial part transport") + ENDDO ENDIF IF (write_hf) THEN - CALL creatd(fidres, rank, dims, "/data/var0d/hflux_x", "Radial part ion heat flux") + DO ia=1,total_na + letter_a = name(ia)(1:1) + CALL creatd(fidres, rank, dims, "/data/var0d/hflux_x"//letter_a, "Radial part heat flux") + ENDDO 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) + ! var3d group (phi,psi, fluid moments, Ni00, Napjz) 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) CALL creatg(fidres, "/data/var3d/psi", "psi") - - IF (write_Na00) THEN - CALL creatg(fidres, "/data/var3d/Na00", "Na00") - CALL creatg(fidres, "/data/var3d/Nepjz", "Napjz") - ENDIF - - IF (write_dens) THEN - CALL creatg(fidres, "/data/var3d/dens", "dens_e") - ENDIF - - IF (write_fvel) THEN - CALL creatg(fidres, "/data/var3d/upar", "upar") - CALL creatg(fidres, "/data/var3d/uper", "uper") - ENDIF - - IF (write_temp) THEN - CALL creatg(fidres, "/data/var3d/Tper_e", "Tper") - CALL creatg(fidres, "/data/var3d/Tpar_e", "Tpar") - CALL creatg(fidres, "/data/var3d/temp_e", "temp") - ENDIF - + IF (write_phi.AND.EM) CALL creatg(fidres, "/data/var3d/psi", "psi") + ! Loop to create species related data + DO ia=1,total_na + letter_a = name(ia)(1:1) + IF (write_Na00) THEN + CALL creatg(fidres, "/data/var3d/N"//letter_a//"00", "gyroceneter density "//letter_a) + CALL creatg(fidres, "/data/var3d/N"//letter_a//"pjz", "pj(z) moment spectrum "//letter_a) + ENDIF + IF (write_dens) THEN + CALL creatg(fidres, "/data/var3d/dens_"//letter_a, "density "//letter_a) + ENDIF + IF (write_fvel) THEN + CALL creatg(fidres, "/data/var3d/upar_"//letter_a, "parallel fluid velocity "//letter_a) + CALL creatg(fidres, "/data/var3d/uper_"//letter_a, "perpendicular fluid velocity "//letter_a) + ENDIF + IF (write_temp) THEN + CALL creatg(fidres, "/data/var3d/Tper_"//letter_a, "perpendicular temperature "//letter_a) + CALL creatg(fidres, "/data/var3d/Tpar_"//letter_a, "parallel temperature "//letter_a) + CALL creatg(fidres, "/data/var3d/temp_"//letter_a, "tiotal temperature "//letter_a) + ENDIF + ENDDO 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 - CALL creatg(fidres, "/data/var5d/moments", "moments") - ENDIF - - IF (write_Sapj) THEN - CALL creatg(fidres, "/data/var5d/Sapj", "Sapj") + CALL creatg(fidres, "/data/var5d/moments", "full moments array") ENDIF - IF (cstep==0) THEN iframe5d=0 END IF @@ -258,6 +226,7 @@ SUBROUTINE diagnose_full(kstep) END IF ENDIF + !_____________________________________________________________________________ ! 2. Periodic diagnostics ! @@ -269,24 +238,15 @@ SUBROUTINE diagnose_full(kstep) 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 3d profiles IF (nsave_3d .GT. 0) THEN IF (MOD(cstep, nsave_3d) == 0) THEN CALL diagnose_3d - ! Looks at the folder if the file check_phi exists and spits a snapshot + ! Looks at the folder if the file check_phi exists and spits a snapshot ! of the current electrostatic potential in a basic text file CALL spit_snapshot_check ENDIF ENDIF - ! 2.4 5d profiles IF (nsave_5d .GT. 0 .AND. cstep .GT. 0) THEN IF (MOD(cstep, nsave_5d) == 0) THEN @@ -316,14 +276,16 @@ 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: Na + USE species, ONLY: name IMPLICIT NONE + CHARACTER :: letter_a + INTEGER :: ia ! 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) @@ -340,18 +302,24 @@ SUBROUTINE diagnose_0d ! 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) + CALL getatt(fidres, "/data/var0d/", "frames",iframe0d) iframe0d=iframe0d+1 CALL attach(fidres,"/data/var0d/" , "frames", iframe0d) ! Ion transport data IF (write_gamma) THEN CALL compute_radial_transport - CALL append(fidres, "/data/var0d/gflux_x",gflux_x(1),ionode=0) - CALL append(fidres, "/data/var0d/pflux_x",pflux_x(1),ionode=0) + DO ia=1,Na + letter_a = name(ia)(1:1) + CALL append(fidres, "/data/var0d/gflux_x"//letter_a,gflux_x(ia),ionode=0) + CALL append(fidres, "/data/var0d/pflux_x"//letter_a,pflux_x(ia),ionode=0) + ENDDO ENDIF IF (write_hf) THEN CALL compute_radial_heatflux - CALL append(fidres, "/data/var0d/hflux_x",hflux_x(1),ionode=0) + DO ia=1,Na + letter_a = name(ia)(1:1) + CALL append(fidres, "/data/var0d/hflux_x"//letter_a,hflux_x(ia),ionode=0) + ENDDO ENDIF END SUBROUTINE diagnose_0d @@ -359,8 +327,8 @@ SUBROUTINE diagnose_3d USE basic USE futils, ONLY: append, getatt, attach, putarrnd, putarr USE fields, ONLY: phi, psi, moments - USE array, ONLY: Na00,Napjz,dens,upar,uper,Tpar,Tper,temp - USE grid, ONLY: CONTAINSp0, ip0,ij0, & + USE array, ONLY: Napjz,dens,upar,uper,Tpar,Tper,temp + USE grid, ONLY: CONTAINSp0, ip0,ij0, local_na,& total_np, total_nj, total_nky, total_nkx, total_nz, & local_np, local_nj, local_nky, local_nkx, local_nz, & ngz @@ -368,45 +336,65 @@ SUBROUTINE diagnose_3d USE diagnostics_par USE prec_const USE processing, ONLY: compute_fluid_moments, compute_Napjz_spectrum + USE model, ONLY: EM + USE species, ONLY: name IMPLICIT NONE - + CHARACTER :: letter_a + INTEGER :: ia + COMPLEX(dp), DIMENSION(local_nky,local_nkx,local_nz) :: Na00_ + COMPLEX(dp), DIMENSION(local_nky,local_nkx,local_nz) :: fmom + COMPLEX(dp), DIMENSION(local_np, local_nj, local_nz) :: Napjz_ + ! add current time, cstep and frame 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 (:,:,1+ngz/2:local_nz+ngz/2), 'phi') - IF (write_phi) CALL write_field3d_kykxz(psi (:,:,1+ngz/2:local_nz+ngz/2), 'psi') - + ! Write current EM fields + IF (write_phi) CALL write_field3d_kykxz(phi (:,:,1+ngz/2:local_nz+ngz/2), 'phi') + IF (write_phi.AND.EM) CALL write_field3d_kykxz(psi (:,:,1+ngz/2:local_nz+ngz/2), 'psi') IF (write_Na00) THEN - IF (CONTAINSp0) & - Na00(1,:,:,:) = moments(1,ip0,ij0,:,:,1+ngz/2:local_nz+ngz/2,updatetlevel) - CALL write_field3d_kykxz(Na00(1,:,:,:), 'Na00') - CALL compute_Napjz_spectrum - CALL write_field3d_pjz(Napjz(1,:,:,:), 'Napjz') + DO ia=1,local_na + letter_a = name(ia)(1:1) + IF (CONTAINSp0) THEN + ! gyrocenter density + Na00_ = moments(ia,ip0,ij0,:,:,1+ngz/2:local_nz+ngz/2,updatetlevel) + CALL write_field3d_kykxz(Na00_, 'N'//letter_a//'00') + ENDIF + ! <<Napj>x>y spectrum + Napjz_ = Napjz(ia,:,:,:) + CALL write_field3d_pjz(Napjz_, 'N'//letter_a//'pjz') + ENDDO ENDIF !! Fuid moments IF (write_dens .OR. write_fvel .OR. write_temp) & CALL compute_fluid_moments - IF (write_dens) THEN - CALL write_field3d_kykxz(dens(1,:,:,:), 'dens') - ENDIF - - IF (write_fvel) THEN - CALL write_field3d_kykxz(upar(1,:,:,:), 'upar') - CALL write_field3d_kykxz(uper(1,:,:,:), 'uper') - ENDIF + DO ia=1,local_na + letter_a = name(ia)(1:1) + IF (write_dens) THEN + fmom = dens(ia,:,:,:) + CALL write_field3d_kykxz(fmom, 'dens_'//letter_a) + ENDIF - IF (write_temp) THEN - CALL write_field3d_kykxz(Tpar(1,:,:,:), 'Tpar') - CALL write_field3d_kykxz(Tper(1,:,:,:), 'Tper') - CALL write_field3d_kykxz(temp(1,:,:,:), 'temp') - ENDIF + IF (write_fvel) THEN + fmom = upar(ia,:,:,:) + CALL write_field3d_kykxz(fmom, 'upar_'//letter_a) + fmom = uper(ia,:,:,:) + CALL write_field3d_kykxz(fmom, 'uper_'//letter_a) + ENDIF + IF (write_temp) THEN + fmom = Tpar(ia,:,:,:) + CALL write_field3d_kykxz(fmom, 'Tpar_'//letter_a) + fmom = Tper(ia,:,:,:) + CALL write_field3d_kykxz(fmom, 'Tper_'//letter_a) + fmom = temp(ia,:,:,:) + CALL write_field3d_kykxz(fmom, 'temp_'//letter_a) + ENDIF + ENDDO CONTAINS SUBROUTINE write_field3d_kykxz(field, text) USE basic, ONLY : GATHERV_OUTPUT @@ -434,8 +422,8 @@ SUBROUTINE diagnose_3d SUBROUTINE write_field3d_pjz(field, text) USE parallel, ONLY : gather_pjz, num_procs IMPLICIT NONE - REAL(dp), DIMENSION(local_np,local_nj,local_nz), INTENT(IN) :: field - REAL(dp), DIMENSION(total_np,total_nj,total_nz) :: field_full + COMPLEX(dp), DIMENSION(local_np,local_nj,local_nz), INTENT(IN) :: field + COMPLEX(dp), DIMENSION(total_np,total_nj,total_nz) :: field_full CHARACTER(*), INTENT(IN) :: text CHARACTER(LEN=50) :: dset_name field_full = 0; @@ -456,12 +444,9 @@ SUBROUTINE diagnose_5d USE basic, ONLY: time, iframe5d,cstep USE futils, ONLY: append, getatt, attach, putarrnd, putarr USE fields, ONLY: moments - USE array, ONLY: Sapj - USE grid, ONLY:ips, ipe, ijs, ije, & - total_np, total_nj, total_nky, total_nkx, total_nz, & + USE grid, ONLY:total_np, total_nj, total_nky, total_nkx, total_nz, & local_np, local_nj, local_nky, local_nkx, local_nz, & - ngp, ngj, ngz,& - ikxs,ikxe,ikys,ikye,izs,ize + ngp, ngj, ngz USE time_integration, ONLY: updatetlevel USE diagnostics_par USE prec_const, ONLY: dp @@ -474,12 +459,7 @@ SUBROUTINE diagnose_5d CALL attach(fidres,"/data/var5d/" , "frames", iframe5d) IF (write_Napj) THEN - CALL write_field5d(moments(1,1+ngp/2:local_np+ngp/2,1+ngj/2:local_nj+ngj/2,& - :,:,1+ngz/2:local_nz+ngz/2,updatetlevel), 'moments') - ENDIF - - IF (write_Sapj) THEN - CALL write_field5d(Sapj(1,:,:,:,:,:), 'Sapj') + CALL write_field5d(moments, 'moments') ENDIF CONTAINS @@ -490,19 +470,22 @@ SUBROUTINE diagnose_5d USE parallel, ONLY: gather_pjxyz, num_procs USE prec_const, ONLY: dp IMPLICIT NONE - COMPLEX(dp), DIMENSION(local_np,local_nj,local_nky,local_nkx,local_nz), INTENT(IN) :: field + COMPLEX(dp), DIMENSION(:,:,:,:,:,:,:), INTENT(IN) :: field CHARACTER(*), INTENT(IN) :: text + COMPLEX(dp), DIMENSION(local_np,local_nj,local_nky,local_nkx,local_nz) :: field_sub COMPLEX(dp), DIMENSION(total_np,total_nj,total_nky,total_nkx,total_nz) :: field_full CHARACTER(LEN=50) :: dset_name + field_sub = field(1,(1+ngp/2):(local_np+ngp/2),(1+ngj/2):(local_nj+ngj/2),& + 1:local_nky,1:local_nkx, (1+ngz/2):(local_nz+ngz/2),updatetlevel) field_full = 0; 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:ipe,ijs:ije,ikys:ikye,ikxs:ikxe,izs:ize), ionode=0) + CALL putarr(fidres, dset_name, field_sub, ionode=0) ELSEIF(GATHERV_OUTPUT) THEN ! output using one node (gatherv) - CALL gather_pjxyz(field,field_full,local_np,total_np,total_nj,local_nky,total_nky,total_nkx,local_nz,total_nz) - CALL putarr(fidres, dset_name, field_full(1:total_np,1:total_nj,1:total_nky,1:total_nkx,1:total_nz), ionode=0) + CALL gather_pjxyz(field_sub,field_full,local_np,total_np,total_nj,local_nky,total_nky,total_nkx,local_nz,total_nz) + CALL putarr(fidres, dset_name, field_full, ionode=0) ELSE - CALL putarrnd(fidres, dset_name, field(ips:ipe,ijs:ije,ikys:ikye,ikxs:ikxe,izs:ize), (/1,3,5/)) + CALL putarrnd(fidres, dset_name, field_sub, (/1,3,5/)) ENDIF CALL attach(fidres, dset_name, 'cstep', cstep) CALL attach(fidres, dset_name, 'time', time) diff --git a/src/grid_mod.F90 b/src/grid_mod.F90 index a344e079..75a2a524 100644 --- a/src/grid_mod.F90 +++ b/src/grid_mod.F90 @@ -163,6 +163,12 @@ CONTAINS CALL set_kygrid(LINEARITY,N_HD) CALL set_kxgrid(shear,Npol,LINEARITY,N_HD) CALL set_zgrid (Npol) + + print*, 'p:',parray + print*, 'j:',jarray + print*, 'ky:',kyarray + print*, 'kx:',kxarray + print*, 'z:',zarray END SUBROUTINE set_grids SUBROUTINE init_1Dgrid_distr @@ -237,8 +243,8 @@ CONTAINS local_pmin = parray(1+ngp/2) ! Fill the ghosts DO ig = 1,ngp/2 - parray(ig) = local_pmin-ngp/2+(ig-1) - parray(local_np+ig) = local_pmax+ig + parray(ig) = local_pmin-ngp/2+(ig-1) + parray(local_np+ngp/2+ig) = local_pmax+ig ENDDO IF(CONTAINSp0) SOLVE_POISSON = .TRUE. IF(CONTAINSp1) SOLVE_AMPERE = .TRUE. @@ -276,12 +282,12 @@ CONTAINS DO ij = 1+ngj/2,local_nj+ngj/2 jarray(ij) = ij-1-ngj/2+local_nj_offset END DO - local_jmax = jarray(local_np+ngj/2) + local_jmax = jarray(local_nj+ngj/2) local_jmin = jarray(1+ngj/2) ! Fill the ghosts DO ig = 1,ngj/2 - jarray(ig) = local_jmin-ngj/2+(ig-1) - jarray(local_nj+ig) = local_jmax+ig + jarray(ig) = local_jmin-ngj/2+(ig-1) + jarray(local_nj+ngj/2+ig) = local_jmax+ig ENDDO ! Precomputations jmax_dp = real(jmax,dp) @@ -511,11 +517,13 @@ CONTAINS CALL speak('--2 staggered z grids--') grid_shift = deltaz/2._dp ! indices for even p and odd p grids (used in kernel, jacobian, gij etc.) - ieven = 1; iodd = 2 + ieven = 1 + iodd = 2 Nzgrid = 2 ELSE grid_shift = 0._dp - ieven = 1; iodd = 1 + ieven = 1 + iodd = 1 Nzgrid = 1 ENDIF ! Build the full grids on process 0 to diagnose it without comm diff --git a/src/inital.F90 b/src/inital.F90 index 11f6433f..f3bbe1b1 100644 --- a/src/inital.F90 +++ b/src/inital.F90 @@ -172,14 +172,14 @@ SUBROUTINE init_gyrodens ! Seed random number generator iseedarr(:)=iseed CALL RANDOM_SEED(PUT=iseedarr+my_id) - + moments = 0._dp !**** Broad noise initialization ******************************************* DO ia=1,local_na - DO ip=1,local_np+ngp - DO ij=1,local_nj+ngj + DO ip=1+ngp/2,local_np+ngp/2 + DO ij=1+ngj/2,local_nj+ngj/2 DO ikx=1,total_nkx DO iky=1,local_nky - DO iz=1,local_nz+ngz + DO iz=1+ngz/2,local_nz+ngz/2 CALL RANDOM_NUMBER(noise) IF ( (parray(ip) .EQ. 1) .AND. (jarray(ij) .EQ. 1) ) THEN moments(ia,ip,ij,iky,ikx,iz,:) = (init_background + init_noiselvl*(noise-0.5_dp)) @@ -196,6 +196,8 @@ SUBROUTINE init_gyrodens ENDIF END DO END DO + print*, SUM(moments) + stop ! Putting to zero modes that are not in the 2/3 Orszag rule IF (LINEARITY .NE. 'linear') THEN DO ikx=1,total_nkx diff --git a/src/memory.F90 b/src/memory.F90 index c9d856d1..97cf7191 100644 --- a/src/memory.F90 +++ b/src/memory.F90 @@ -20,7 +20,6 @@ SUBROUTINE memory ! CALL allocate_array(HF_phi_correction_operator, 1,local_nky, 1,local_nkx, 1,local_Nz) !Moments related arrays - CALL allocate_array( Na00, 1,local_Na, 1,local_nky, 1,local_nkx, 1,local_Nz) CALL allocate_array( dens, 1,local_Na, 1,local_nky, 1,local_nkx, 1,local_Nz) CALL allocate_array( upar, 1,local_Na, 1,local_nky, 1,local_nkx, 1,local_Nz) CALL allocate_array( uper, 1,local_Na, 1,local_nky, 1,local_nkx, 1,local_Nz) diff --git a/src/parallel_mod.F90 b/src/parallel_mod.F90 index 6e4fc9c6..d90918ef 100644 --- a/src/parallel_mod.F90 +++ b/src/parallel_mod.F90 @@ -238,12 +238,12 @@ CONTAINS SUBROUTINE gather_pjz(field_loc,field_tot,np_loc,np_tot,nj_tot,nz_loc,nz_tot) IMPLICIT NONE INTEGER, INTENT(IN) :: np_loc,np_tot, nj_tot, nz_loc,nz_tot - REAL(dp), DIMENSION(np_loc,nj_tot,nz_loc), INTENT(IN) :: field_loc - REAL(dp), DIMENSION(np_tot,nj_tot,nz_tot), INTENT(OUT) :: field_tot - REAL(dp), DIMENSION(np_tot,nz_loc) :: buffer_pt_zl !full p, local z - REAL(dp), DIMENSION(np_tot,nz_tot) :: buffer_pt_zt !full p, full z - REAL(dp), DIMENSION(np_loc) :: buffer_pl_zc !local p, constant z - REAL(dp), DIMENSION(np_tot) :: buffer_pt_zc !full p, constant z + COMPLEX(dp), DIMENSION(np_loc,nj_tot,nz_loc), INTENT(IN) :: field_loc + COMPLEX(dp), DIMENSION(np_tot,nj_tot,nz_tot), INTENT(OUT) :: field_tot + COMPLEX(dp), DIMENSION(np_tot,nz_loc) :: buffer_pt_zl !full p, local z + COMPLEX(dp), DIMENSION(np_tot,nz_tot) :: buffer_pt_zt !full p, full z + COMPLEX(dp), DIMENSION(np_loc) :: buffer_pl_zc !local p, constant z + COMPLEX(dp), DIMENSION(np_tot) :: buffer_pt_zc !full p, constant z INTEGER :: snd_p, snd_z, root_p, root_z, root_ky, ij, iz snd_p = np_loc ! Number of points to send along p (per z) @@ -255,16 +255,16 @@ CONTAINS DO iz = 1,nz_loc ! fill a buffer to contain a slice of data at constant j and z buffer_pl_zc(1:np_loc) = field_loc(1:np_loc,ij,iz) - CALL MPI_GATHERV(buffer_pl_zc, snd_p, MPI_DOUBLE_PRECISION, & - buffer_pt_zc, rcv_p, dsp_p, MPI_DOUBLE_PRECISION, & + CALL MPI_GATHERV(buffer_pl_zc, snd_p, MPI_DOUBLE_COMPLEX, & + buffer_pt_zc, rcv_p, dsp_p, MPI_DOUBLE_COMPLEX, & root_p, comm_p, ierr) buffer_pt_zl(1:np_tot,iz) = buffer_pt_zc(1:np_tot) ENDDO ! send the full line on y contained by root_kyas IF(rank_p .EQ. 0) THEN - CALL MPI_GATHERV(buffer_pt_zl, snd_z, MPI_DOUBLE_PRECISION, & - buffer_pt_zt, rcv_zp, dsp_zp, MPI_DOUBLE_PRECISION, & + CALL MPI_GATHERV(buffer_pt_zl, snd_z, MPI_DOUBLE_COMPLEX, & + buffer_pt_zt, rcv_zp, dsp_zp, MPI_DOUBLE_COMPLEX, & root_z, comm_z, ierr) ENDIF ! ID 0 (the one who ouptut) rebuild the whole array diff --git a/src/processing_mod.F90 b/src/processing_mod.F90 index ecfe01c7..001993a6 100644 --- a/src/processing_mod.F90 +++ b/src/processing_mod.F90 @@ -47,7 +47,7 @@ SUBROUTINE compute_radial_transport IMPLICIT NONE COMPLEX(dp) :: pflux_local, gflux_local, integral REAL(dp) :: buffer(2) - INTEGER :: i_, root, iky, ikx, ia, iz, in, iodd, ieven + INTEGER :: i_, root, iky, ikx, ia, iz, in COMPLEX(dp), DIMENSION(local_nz+Ngz) :: integrant DO ia = 1,local_na pflux_local = 0._dp ! particle flux @@ -330,13 +330,15 @@ SUBROUTINE compute_Napjz_spectrum ! z-moment spectrum ! build local sum local_sum = 0._dp - DO ikx = 1,local_nkx - DO iky = 1,local_nky - DO ij = 1,local_nj - DO ip = 1,local_np - local_sum(ip,ij,iz) = local_sum(ip,ij,iz) + & - (moments(ia,ip+Ngp/2,ij+Ngj/2,iky,ikx,iz+Ngz/2,updatetlevel) & - * CONJG(moments(ia,ip+Ngp/2,ij+Ngj/2,iky,ikx,iz+Ngz/2,updatetlevel))) + DO iz = 1,local_nz + DO ikx = 1,local_nkx + DO iky = 1,local_nky + DO ij = 1,local_nj + DO ip = 1,local_np + local_sum(ip,ij,iz) = local_sum(ip,ij,iz) + & + (moments(ia,ip+Ngp/2,ij+Ngj/2,iky,ikx,iz+Ngz/2,updatetlevel) & + * CONJG(moments(ia,ip+Ngp/2,ij+Ngj/2,iky,ikx,iz+Ngz/2,updatetlevel))) + ENDDO ENDDO ENDDO ENDDO diff --git a/testcases/smallest_problem/fort.90 b/testcases/smallest_problem/fort.90 index 7c491e5d..40604ef7 100644 --- a/testcases/smallest_problem/fort.90 +++ b/testcases/smallest_problem/fort.90 @@ -1,5 +1,5 @@ &BASIC - nrun = 500 + nrun = 1 dt = 0.01 tmax = 5 maxruntime = 356400 @@ -40,9 +40,8 @@ write_gamma = .t. write_hf = .t. write_phi = .t. - write_Na00 = .f. + write_Na00 = .t. write_Napj = .t. - write_Sapj = .f. write_dens = .t. write_fvel = .t. write_temp = .t. @@ -53,13 +52,13 @@ NL_CLOS = -1 LINEARITY = 'linear' Na = 2 ! number of species - mu_x = 0.0 - mu_y = 0.0 + mu_x = 0 + mu_y = 0 N_HD = 4 - mu_z = 0.1 + mu_z = 0 mu_p = 0 mu_j = 0 - nu = 1 + nu = 0 beta = 0 ADIAB_E = .f. tau_e = 1.0 @@ -70,8 +69,8 @@ tau_ = 1.0 sigma_= 1.0 q_ = 1.0 - k_N_ = 2.22 - k_T_ = 6.96 + k_N_ = 0.0!2.22 + k_T_ = 0.0!6.96 / &SPECIES ! electrons @@ -79,22 +78,22 @@ tau_ = 1.0 sigma_= 0.023338 q_ = 1.0 - k_N_ = 2.22 - k_T_ = 6.96 + k_N_ = 0.0!2.22 + k_T_ = 0.0!6.96 / &COLLISION_PAR collision_model = 'DG' !DG/SG/PA/LD (dougherty, sugama, pitch angle, landau) - GK_CO = .f. + GK_CO = .f. INTERSPECIES = .true. - !mat_file = 'gk_sugama_P_20_J_10_N_150_kpm_8.0.h5' + !mat_file = 'gk_sugama_P_20_J_10_N_150_kpm_8.0.h5' / &INITIAL_CON - INIT_OPT = 'phi' - ACT_ON_MODES = 'donothing' - init_background = 0 - init_noiselvl = 0.005 - iseed = 42 + INIT_OPT = 'mom00' + ACT_ON_MODES = 'donothing' + init_background = 1.0 + init_noiselvl = 0.0 + iseed = 42 / &TIME_INTEGRATION_PAR numerical_scheme = 'RK4' diff --git a/testcases/smallest_problem/fort_00.90 b/testcases/smallest_problem/fort_00.90 index 622af92a..9ea911de 100644 --- a/testcases/smallest_problem/fort_00.90 +++ b/testcases/smallest_problem/fort_00.90 @@ -33,9 +33,8 @@ write_gamma = .t. write_hf = .t. write_phi = .t. - write_Na00 = .f. + write_Na00 = .t. write_Napj = .t. - write_Sapj = .f. write_dens = .t. write_temp = .t. job2load = -1 @@ -49,20 +48,20 @@ mu_x = 0.0 mu_y = 0.0 N_HD = 4 - mu_z = 0.1 + mu_z = 0!0.1 mu_p = 0 mu_j = 0 - nu = 1 + nu = 0!1.0 tau_e = 1 tau_i = 1 sigma_e = 0.023338 sigma_i = 1 q_e = -1 q_i = 1 - K_Ne = 1!6.96 - K_Te = 1!2.22 - K_Ni = 1!6.96 - K_Ti = 1!2.22 + K_Ne = 0!6.96 + K_Te = 0!2.22 + K_Ni = 0!6.96 + K_Ti = 0!2.22 beta = 0 / &COLLISION_PAR @@ -72,7 +71,7 @@ !mat_file = 'gk_sugama_P_20_J_10_N_150_kpm_8.0.h5' / &INITIAL_CON - INIT_OPT = 'phi' + INIT_OPT = 'mom00' ACT_ON_MODES = 'donothing' init_background = 1.0 init_noiselvl = 0.0 diff --git a/testcases/smallest_problem/gyacomo_1 b/testcases/smallest_problem/gyacomo_1 new file mode 120000 index 00000000..d087f907 --- /dev/null +++ b/testcases/smallest_problem/gyacomo_1 @@ -0,0 +1 @@ +../../bin/gyacomo_1 \ No newline at end of file diff --git a/testcases/smallest_problem/gyacomo_1_debug b/testcases/smallest_problem/gyacomo_1_debug new file mode 120000 index 00000000..f5e7015f --- /dev/null +++ b/testcases/smallest_problem/gyacomo_1_debug @@ -0,0 +1 @@ +../../bin/gyacomo_1_debug \ No newline at end of file diff --git a/testcases/smallest_problem/gyacomo_alpha b/testcases/smallest_problem/gyacomo_alpha deleted file mode 120000 index 0663323a..00000000 --- a/testcases/smallest_problem/gyacomo_alpha +++ /dev/null @@ -1 +0,0 @@ -../../bin/gyacomo_alpha \ No newline at end of file diff --git a/wk/header_3D_results.m b/wk/header_3D_results.m index 58375962..25115ab7 100644 --- a/wk/header_3D_results.m +++ b/wk/header_3D_results.m @@ -56,7 +56,7 @@ PARTITION = '/misc/gyacomo_outputs/'; % resdir = 'paper_2_nonlinear/kT_5.3/9x5x128x64x24'; % resdir = 'paper_2_nonlinear/kT_5.3/9x5x128x64x64'; % resdir = 'paper_2_nonlinear/kT_5.3/11x6x128x64x24'; -resdir = 'paper_2_nonlinear/kT_5.3/11x6x128x64x64'; +% resdir = 'paper_2_nonlinear/kT_5.3/11x6x128x64x64'; %% Old stuff % resdir = 'CBC/kT_4.5_128x64x16x13x7/'; -- GitLab