From 4d49927500de3c501d2715c58f54c2437f18b448 Mon Sep 17 00:00:00 2001 From: Antoine Cyril David Hoffmann <ahoffman@spcpc606.epfl.ch> Date: Mon, 15 Mar 2021 16:20:58 +0100 Subject: [PATCH] Adapted for 2D data distribution on p and kr --- src/diagnose.F90 | 301 +++++++++++++++++++++++------------------------ 1 file changed, 147 insertions(+), 154 deletions(-) diff --git a/src/diagnose.F90 b/src/diagnose.F90 index da7a71cb..0f36b94a 100644 --- a/src/diagnose.F90 +++ b/src/diagnose.F90 @@ -4,7 +4,7 @@ SUBROUTINE diagnose(kstep) USE basic USE grid USE diagnostics_par - USE futils, ONLY: creatf, creatg, creatd, closef, putarr, putfile, attach, openf + USE futils, ONLY: creatf, creatg, creatd, closef, putarr, putfile, attach, openf, putarrnd USE model USE initial_par USE fields @@ -20,7 +20,11 @@ SUBROUTINE diagnose(kstep) INTEGER :: rank, dims(1) = (/0/) INTEGER :: cp_counter = 0 CHARACTER(len=256) :: str, fname,test_ - + ! putarr(...,pardim=1) does not work for 2D domain decomposition + ! so we need to gather non 5D data on one proc to output it + INTEGER :: parray_e_full(1:pmaxe+1), parray_i_full(1:pmaxi+1) + INTEGER :: jarray_e_full(1:jmaxe+1), jarray_i_full(1:jmaxi+1) + REAL(dp) :: krarray_full(1:nkr), kzarray_full(1:nkz) !_____________________________________________________________________________ ! 1. Initial diagnostics @@ -31,40 +35,17 @@ SUBROUTINE diagnose(kstep) ! 1.1 Initial run ! Main output file creation IF (write_doubleprecision) THEN - CALL creatf(resfile, fidres, real_prec='d', mpicomm=MPI_COMM_WORLD) + CALL creatf(resfile, fidres, real_prec='d', mpicomm=comm0) ELSE - CALL creatf(resfile, fidres, mpicomm=MPI_COMM_WORLD) + CALL creatf(resfile, fidres, mpicomm=comm0) END IF IF (my_id .EQ. 0) WRITE(*,'(3x,a,a)') TRIM(resfile), ' created' - ! Checkpoint file creation - IF (nsave_cp .GT. 0) THEN - WRITE(rstfile,'(a,a1,i2.2,a3)') TRIM(rstfile0),'_',jobnum,'.h5' - CALL creatf(rstfile, fidrst, real_prec='d', mpicomm=MPI_COMM_WORLD) - CALL creatg(fidrst, '/Basic', 'Basic data') - CALL creatg(fidrst, '/Basic/moments_e', 'electron moments') - CALL creatg(fidrst, '/Basic/moments_i', 'ion moments') - CALL creatg(fidrst, '/Basic/phi', 'ES potential') - ! Attaching informations about moments - CALL attach(fidrst,"/Basic/moments_e/" , "pmaxe", pmaxe) - CALL attach(fidrst,"/Basic/moments_e/" , "jmaxe", jmaxe) - CALL attach(fidrst,"/Basic/moments_e/" , "Trunc", CLOS) - CALL attach(fidrst,"/Basic/moments_i/" , "pmaxi", pmaxi) - CALL attach(fidrst,"/Basic/moments_i/" , "jmaxi", jmaxi) - CALL attach(fidrst,"/Basic/moments_i/" , "Trunc", CLOS) - - IF (my_id .EQ. 0) WRITE(*,'(3x,a,a)') TRIM(rstfile), ' created' - CALL flush(6) - ELSE - IF (my_id .EQ. 0) WRITE(*,'(3x,a,a)') 'No checkpoint' - ENDIF - ! Data group CALL creatg(fidres, "/data", "data") CALL creatg(fidres, "/data/var2d", "2d profiles") CALL creatg(fidres, "/data/var5d", "5d profiles") - ! Initialize counter of number of saves for each category IF (cstep==0) THEN iframe2d=0 @@ -83,6 +64,7 @@ SUBROUTINE diagnose(kstep) 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_comm", "cumulative communication 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_diag", "cumulative sym computation time") @@ -90,6 +72,29 @@ SUBROUTINE diagnose(kstep) CALL creatd(fidres, 0, dims, "/profiler/Tc_step", "cumulative total step computation time") CALL creatd(fidres, 0, dims, "/profiler/time", "current simulation time") + ! Build the full grids on process 0 to diagnose it without comm + IF (my_id .EQ. 0) THEN + ! P + DO ip = 1,pmaxe+1; parray_e_full(ip) = (ip-1); END DO + DO ip = 1,pmaxi+1; parray_i_full(ip) = (ip-1); END DO + ! J + DO ij = 1,jmaxe+1; jarray_e_full(ij) = (ij-1); END DO + DO ij = 1,jmaxi+1; jarray_i_full(ij) = (ij-1); END DO + ! Kr + DO ikr = 1,Nkr + krarray_full(ikr) = REAL(ikr-1,dp) * deltakr + END DO + ! Kz + IF (Nkz .GT. 1) THEN + DO ikz = 1,Nkz + kzarray_full(ikz) = deltakz*(MODULO(ikz-1,Nkz/2)-Nkz/2*FLOOR(2.*real(ikz-1)/real(Nkz))) + if (ikz .EQ. Nz/2+1) kzarray(ikz) = -kzarray(ikz) + END DO + ELSE + kzarray_full(1) = 0 + endif + ENDIF + ! var2d group (electro. pot., Ni00 moment) rank = 0 CALL creatd(fidres, rank, dims, "/data/var2d/time", "Time t*c_s/R") @@ -99,18 +104,12 @@ SUBROUTINE diagnose(kstep) CALL creatg(fidres, "/data/var2d/Ne00", "Ne00") CALL creatg(fidres, "/data/var2d/Ni00", "Ni00") CALL creatg(fidres, "/data/var2d/phi", "phi") - IF (num_procs .EQ. 1) THEN - CALL putarr(fidres, "/data/var2d/Ne00/coordkr", krarray(ikrs:ikre), "kr*rho_s0", ionode=0) - CALL putarr(fidres, "/data/var2d/Ni00/coordkr", krarray(ikrs:ikre), "kr*rho_s0", ionode=0) - CALL putarr(fidres, "/data/var2d/phi/coordkr", krarray(ikrs:ikre), "kr*rho_s0", ionode=0) - ELSE - CALL putarr(fidres, "/data/var2d/Ne00/coordkr", krarray(ikrs:ikre), "kr*rho_s0", pardim=1) - CALL putarr(fidres, "/data/var2d/Ni00/coordkr", krarray(ikrs:ikre), "kr*rho_s0", pardim=1) - CALL putarr(fidres, "/data/var2d/phi/coordkr", krarray(ikrs:ikre), "kr*rho_s0", pardim=1) - ENDIF - CALL putarr(fidres, "/data/var2d/Ne00/coordkz", kzarray(ikzs:ikze), "kz*rho_s0", ionode=0) - CALL putarr(fidres, "/data/var2d/Ni00/coordkz", kzarray(ikzs:ikze), "kz*rho_s0", ionode=0) - CALL putarr(fidres, "/data/var2d/phi/coordkz", kzarray(ikzs:ikze), "kz*rho_s0", ionode=0) + CALL putarr(fidres, "/data/var2d/Ne00/coordkr", krarray_full(1:nkr), "kr*rho_s0", ionode=0) + CALL putarr(fidres, "/data/var2d/Ni00/coordkr", krarray_full(1:nkr), "kr*rho_s0", ionode=0) + CALL putarr(fidres, "/data/var2d/phi/coordkr", krarray_full(1:nkr), "kr*rho_s0", ionode=0) + CALL putarr(fidres, "/data/var2d/Ne00/coordkz", kzarray_full(1:nkz), "kz*rho_s0", ionode=0) + CALL putarr(fidres, "/data/var2d/Ni00/coordkz", kzarray_full(1:nkz), "kz*rho_s0", ionode=0) + CALL putarr(fidres, "/data/var2d/phi/coordkz", kzarray_full(1:nkz), "kz*rho_s0", ionode=0) END IF ! var5d group (moments) @@ -122,30 +121,22 @@ SUBROUTINE diagnose(kstep) CALL creatg(fidres, "/data/var5d/moments_i", "moments_i") CALL creatg(fidres, "/data/var5d/Sepj", "Sepj") CALL creatg(fidres, "/data/var5d/Sipj", "Sipj") - - CALL putarr(fidres, "/data/var5d/moments_e/coordp", parray_e(ips_e:ipe_e), "p_e", ionode=0) - CALL putarr(fidres, "/data/var5d/moments_e/coordj", jarray_e(ijs_e:ije_e), "j_e", ionode=0) - CALL putarr(fidres, "/data/var5d/moments_i/coordp", parray_i(ips_i:ipe_i), "p_i", ionode=0) - CALL putarr(fidres, "/data/var5d/moments_i/coordj", jarray_i(ijs_i:ije_i), "j_i", ionode=0) - CALL putarr(fidres, "/data/var5d/Sepj/coordp", parray_e(ips_e:ipe_e), "p_e", ionode=0) - CALL putarr(fidres, "/data/var5d/Sepj/coordj", jarray_e(ijs_e:ije_e), "j_e", ionode=0) - CALL putarr(fidres, "/data/var5d/Sipj/coordp", parray_i(ips_i:ipe_i), "p_i", ionode=0) - CALL putarr(fidres, "/data/var5d/Sipj/coordj", jarray_i(ijs_i:ije_i), "j_i", ionode=0) - IF (num_procs .EQ. 1) THEN - CALL putarr(fidres, "/data/var5d/moments_e/coordkr", krarray(ikrs:ikre), "kr*rho_s0", ionode=0) - CALL putarr(fidres, "/data/var5d/moments_i/coordkr", krarray(ikrs:ikre), "kr*rho_s0", ionode=0) - CALL putarr(fidres, "/data/var5d/Sepj/coordkr", krarray(ikrs:ikre), "kr*rho_s0", ionode=0) - CALL putarr(fidres, "/data/var5d/Sipj/coordkr", krarray(ikrs:ikre), "kr*rho_s0", ionode=0) - ELSE - CALL putarr(fidres, "/data/var5d/moments_e/coordkr", krarray(ikrs:ikre), "kr*rho_s0", pardim=1) - CALL putarr(fidres, "/data/var5d/moments_i/coordkr", krarray(ikrs:ikre), "kr*rho_s0", pardim=1) - CALL putarr(fidres, "/data/var5d/Sepj/coordkr", krarray(ikrs:ikre), "kr*rho_s0", pardim=1) - CALL putarr(fidres, "/data/var5d/Sipj/coordkr", krarray(ikrs:ikre), "kr*rho_s0", pardim=1) - ENDIF - CALL putarr(fidres, "/data/var5d/moments_e/coordkz", kzarray(ikzs:ikze), "kz*rho_s0", ionode=0) - CALL putarr(fidres, "/data/var5d/moments_i/coordkz", kzarray(ikzs:ikze), "kz*rho_s0", ionode=0) - CALL putarr(fidres, "/data/var5d/Sepj/coordkz", kzarray(ikzs:ikze), "kz*rho_s0", ionode=0) - CALL putarr(fidres, "/data/var5d/Sipj/coordkz", kzarray(ikzs:ikze), "kz*rho_s0", ionode=0) + CALL putarr(fidres, "/data/var5d/moments_e/coordp", parray_e_full(1:pmaxe+1), "p_e", ionode=0) + CALL putarr(fidres, "/data/var5d/moments_e/coordj", jarray_e_full(1:jmaxe+1), "j_e", ionode=0) + CALL putarr(fidres, "/data/var5d/moments_e/coordkr", krarray_full(1:nkr), "kr*rho_s0",ionode=0) + CALL putarr(fidres, "/data/var5d/moments_e/coordkz", kzarray_full(1:nkz), "kz*rho_s0",ionode=0) + CALL putarr(fidres, "/data/var5d/moments_i/coordp", parray_i_full(1:pmaxi+1), "p_i", ionode=0) + CALL putarr(fidres, "/data/var5d/moments_i/coordj", jarray_i_full(1:jmaxi+1), "j_i", ionode=0) + CALL putarr(fidres, "/data/var5d/moments_i/coordkr", krarray_full(1:nkr), "kr*rho_s0",ionode=0) + CALL putarr(fidres, "/data/var5d/moments_i/coordkz", kzarray_full(1:nkz), "kz*rho_s0",ionode=0) + CALL putarr(fidres, "/data/var5d/Sepj/coordp", parray_e_full(1:pmaxe+1), "p_e", ionode=0) + CALL putarr(fidres, "/data/var5d/Sepj/coordj", jarray_e_full(1:jmaxe+1), "j_e", ionode=0) + CALL putarr(fidres, "/data/var5d/Sepj/coordkr", krarray_full(1:nkr), "kr*rho_s0",ionode=0) + CALL putarr(fidres, "/data/var5d/Sepj/coordkz", kzarray_full(1:nkz), "kz*rho_s0",ionode=0) + CALL putarr(fidres, "/data/var5d/Sipj/coordp", parray_i_full(1:pmaxi+1), "p_i", ionode=0) + CALL putarr(fidres, "/data/var5d/Sipj/coordj", jarray_i_full(1:jmaxi+1), "j_i", ionode=0) + CALL putarr(fidres, "/data/var5d/Sipj/coordkr", krarray_full(1:nkr), "kr*rho_s0",ionode=0) + CALL putarr(fidres, "/data/var5d/Sipj/coordkz", kzarray_full(1:nkz), "kz*rho_s0",ionode=0) END IF ! Add input namelist variables as attributes of /data/input, defined in srcinfo.h @@ -242,13 +233,6 @@ SUBROUTINE diagnose(kstep) END IF END IF - ! 2.5 Backups - IF (nsave_cp .GT. 0) THEN - IF (MOD(cstep, nsave_cp) == 0) THEN - CALL checkpoint_save(cp_counter) - cp_counter = cp_counter + 1 - ENDIF - ENDIF !_____________________________________________________________________________ ! 3. Final diagnostics @@ -261,10 +245,6 @@ SUBROUTINE diagnose(kstep) ! Close all diagnostic files CALL closef(fidres) - IF ((nsave_cp .GT. 0) .AND. (.NOT. crashed)) THEN - CALL checkpoint_save(cp_counter) - CALL closef(fidrst) - ENDIF END IF @@ -286,6 +266,7 @@ SUBROUTINE diagnose_0d CALL append(fidres, "/profiler/Tc_Sapj", tc_Sapj,ionode=0) CALL append(fidres, "/profiler/Tc_diag", tc_diag,ionode=0) CALL append(fidres, "/profiler/Tc_checkfield",tc_checkfield,ionode=0) + CALL append(fidres, "/profiler/Tc_comm", tc_comm,ionode=0) CALL append(fidres, "/profiler/Tc_step", tc_step,ionode=0) CALL append(fidres, "/profiler/time", time,ionode=0) @@ -297,41 +278,120 @@ SUBROUTINE diagnose_2d USE basic USE futils, ONLY: append, getatt, attach, putarrnd USE fields + USE array, ONLY: Ne00, Ni00 + USE grid, ONLY: ikrs,ikre, ikzs,ikze, nkr, nkz, local_nkr, ikr, ikz, ips_e, ips_i USE time_integration USE diagnostics_par USE prec_const IMPLICIT NONE + COMPLEX(dp) :: buffer(ikrs:ikre,ikzs:ikze) + INTEGER :: i_, root, world_rank, world_size + CALL append(fidres, "/data/var2d/time", time,ionode=0) CALL append(fidres, "/data/var2d/cstep", real(cstep,dp),ionode=0) CALL getatt(fidres, "/data/var2d/", "frames",iframe2d) iframe2d=iframe2d+1 CALL attach(fidres,"/data/var2d/" , "frames", iframe2d) - CALL write_field2d(phi(:,:), 'phi') - CALL write_field2d(moments_e(1,1,:,:,updatetlevel), 'Ne00') - CALL write_field2d(moments_i(1,1,:,:,updatetlevel), 'Ni00') + CALL write_field2d(phi (:,:), 'phi') + + IF ( (ips_e .EQ. 1) .AND. (ips_i .EQ. 1) ) THEN + Ne00(ikrs:ikre,ikzs:ikze) = moments_e(ips_e,1,ikrs:ikre,ikzs:ikze,updatetlevel) + Ni00(ikrs:ikre,ikzs:ikze) = moments_i(ips_e,1,ikrs:ikre,ikzs:ikze,updatetlevel) + ENDIF + + root = 0 + + !!!!! This is a manual way to do MPI_BCAST !!!!!!!!!!! + CALL MPI_COMM_RANK(commp,world_rank,ierr) + CALL MPI_COMM_SIZE(commp,world_size,ierr) + + IF (world_size .GT. 1) THEN + !! Broadcast phi to the other processes on the same k range (communicator along p) + IF (world_rank .EQ. root) THEN + ! Fill the buffer + DO ikr = ikrs,ikre + DO ikz = ikzs,ikze + buffer(ikr,ikz) = Ne00(ikr,ikz) + ENDDO + ENDDO + ! Send it to all the other processes + DO i_ = 0,num_procs_p-1 + IF (i_ .NE. world_rank) & + CALL MPI_SEND(buffer, local_nkr * nkz , MPI_DOUBLE_COMPLEX, i_, 0, commp, ierr) + ENDDO + ELSE + ! Recieve buffer from root + CALL MPI_RECV(buffer, local_nkr * nkz , MPI_DOUBLE_COMPLEX, root, 0, commp, MPI_STATUS_IGNORE, ierr) + ! Write it in phi + DO ikr = ikrs,ikre + DO ikz = ikzs,ikze + Ne00(ikr,ikz) = buffer(ikr,ikz) + ENDDO + ENDDO + ENDIF + ENDIF + + CALL write_field2d(Ne00(ikrs:ikre,ikzs:ikze), 'Ne00') + + !!!!! This is a manual way to do MPI_BCAST !!!!!!!!!!! + CALL MPI_COMM_RANK(commp,world_rank,ierr) + CALL MPI_COMM_SIZE(commp,world_size,ierr) + + IF (world_size .GT. 1) THEN + !! Broadcast phi to the other processes on the same k range (communicator along p) + IF (world_rank .EQ. root) THEN + ! Fill the buffer + DO ikr = ikrs,ikre + DO ikz = ikzs,ikze + buffer(ikr,ikz) = Ni00(ikr,ikz) + ENDDO + ENDDO + ! Send it to all the other processes + DO i_ = 0,num_procs_p-1 + IF (i_ .NE. world_rank) & + CALL MPI_SEND(buffer, local_nkr * nkz , MPI_DOUBLE_COMPLEX, i_, 0, commp, ierr) + ENDDO + ELSE + ! Recieve buffer from root + CALL MPI_RECV(buffer, local_nkr * nkz , MPI_DOUBLE_COMPLEX, root, 0, commp, MPI_STATUS_IGNORE, ierr) + ! Write it in phi + DO ikr = ikrs,ikre + DO ikz = ikzs,ikze + Ni00(ikr,ikz) = buffer(ikr,ikz) + ENDDO + ENDDO + ENDIF + ENDIF + + CALL write_field2d(Ni00(ikrs:ikre,ikzs:ikze), 'Ni00') CONTAINS SUBROUTINE write_field2d(field, text) USE futils, ONLY: attach, putarr - USE grid, ONLY: ikrs,ikre, ikzs,ikze + USE grid, ONLY: ikrs,ikre, ikzs,ikze, nkr, nkz, local_nkr USE prec_const + USE basic, ONLY : commr, num_procs_p, rank_p IMPLICIT NONE COMPLEX(dp), DIMENSION(ikrs:ikre, ikzs:ikze), INTENT(IN) :: field CHARACTER(*), INTENT(IN) :: text - + COMPLEX(dp) :: buffer_dist(ikrs:ikre,ikzs:ikze) + COMPLEX(dp) :: buffer_full(1:nkr,1:nkz) + INTEGER :: scount, rcount CHARACTER(LEN=50) :: dset_name + scount = (ikre-ikrs+1) * (ikze-ikzs+1) + rcount = scount + WRITE(dset_name, "(A, '/', A, '/', i6.6)") "/data/var2d", TRIM(text), iframe2d - IF (num_procs .EQ. 1) THEN + IF (num_procs .EQ. 1) THEN ! no data distribution CALL putarr(fidres, dset_name, field(ikrs:ikre, ikzs:ikze), ionode=0) ELSE - CALL putarr(fidres, dset_name, field(ikrs:ikre, ikzs:ikze), pardim=1) + CALL putarrnd(fidres, dset_name, field(ikrs:ikre, ikzs:ikze), (/1, 1/)) ENDIF - CALL attach(fidres, dset_name, "time", time) END SUBROUTINE write_field2d @@ -366,7 +426,7 @@ SUBROUTINE diagnose_5d CONTAINS SUBROUTINE write_field5d_e(field, text) - USE futils, ONLY: attach, putarr + USE futils, ONLY: attach, putarr, putarrnd USE grid, ONLY: ips_e,ipe_e, ijs_e,ije_e, ikrs,ikre, ikzs,ikze USE prec_const IMPLICIT NONE @@ -380,7 +440,7 @@ SUBROUTINE diagnose_5d IF (num_procs .EQ. 1) THEN CALL putarr(fidres, dset_name, field(ips_e:ipe_e,ijs_e:ije_e,ikrs:ikre,ikzs:ikze), ionode=0) ELSE - CALL putarr(fidres, dset_name, field(ips_e:ipe_e,ijs_e:ije_e,ikrs:ikre,ikzs:ikze), pardim=3) + CALL putarrnd(fidres, dset_name, field(ips_e:ipe_e,ijs_e:ije_e,ikrs:ikre,ikzs:ikze), (/1,3/)) ENDIF CALL attach(fidres, dset_name, 'cstep', cstep) CALL attach(fidres, dset_name, 'time', time) @@ -392,7 +452,7 @@ SUBROUTINE diagnose_5d END SUBROUTINE write_field5d_e SUBROUTINE write_field5d_i(field, text) - USE futils, ONLY: attach, putarr + USE futils, ONLY: attach, putarr, putarrnd USE grid, ONLY: ips_i,ipe_i, ijs_i,ije_i, ikrs,ikre, ikzs,ikze USE prec_const IMPLICIT NONE @@ -406,7 +466,7 @@ SUBROUTINE diagnose_5d IF (num_procs .EQ. 1) THEN CALL putarr(fidres, dset_name, field(ips_i:ipe_i,ijs_i:ije_i,ikrs:ikre,ikzs:ikze), ionode=0) ELSE - CALL putarr(fidres, dset_name, field(ips_i:ipe_i,ijs_i:ije_i,ikrs:ikre,ikzs:ikze), pardim=3) + CALL putarrnd(fidres, dset_name, field(ips_i:ipe_i,ijs_i:ije_i,ikrs:ikre,ikzs:ikze), (/1,3/)) ENDIF CALL attach(fidres, dset_name, 'cstep', cstep) CALL attach(fidres, dset_name, 'time', time) @@ -414,74 +474,7 @@ SUBROUTINE diagnose_5d 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 checkpoint_save(cp_step) - USE basic - USE grid, ONLY: ips_i,ipe_i, ijs_i,ije_i, ips_e,ipe_e, ijs_e,ije_e, ikrs,ikre, ikzs,ikze - USE diagnostics_par - USE futils, ONLY: putarr,attach - USE model - USE initial_par - USE fields - USE time_integration - IMPLICIT NONE - INTEGER, INTENT(IN) :: cp_step - CHARACTER(LEN=50) :: dset_name - - ! Write state of system to restart file - WRITE(dset_name, "(A, '/', i6.6)") "/Basic/moments_e", cp_step - IF (num_procs .EQ. 1) THEN - CALL putarr(fidrst, dset_name, moments_e(ips_e:ipe_e,ijs_e:ije_e,& - ikrs:ikre,ikzs:ikze,1), ionode=0) - ELSE - CALL putarr(fidrst, dset_name, moments_e(ips_e:ipe_e,ijs_e:ije_e,& - ikrs:ikre,ikzs:ikze,1), pardim=3) - ENDIF - - CALL attach(fidrst, dset_name, 'cstep', cstep) - CALL attach(fidrst, dset_name, 'time', time) - CALL attach(fidrst, dset_name, 'jobnum', jobnum) - CALL attach(fidrst, dset_name, 'dt', dt) - CALL attach(fidrst, dset_name, 'iframe2d', iframe2d) - CALL attach(fidrst, dset_name, 'iframe5d', iframe5d) - - WRITE(dset_name, "(A, '/', i6.6)") "/Basic/moments_i", cp_step - IF (num_procs .EQ. 1) THEN - CALL putarr(fidrst, dset_name, moments_i(ips_i:ipe_i,ijs_i:ije_i,& - ikrs:ikre,ikzs:ikze,1), ionode=0) - ELSE - CALL putarr(fidrst, dset_name, moments_i(ips_i:ipe_i,ijs_i:ije_i,& - ikrs:ikre,ikzs:ikze,1), pardim=3) - ENDIF - - CALL attach(fidrst, dset_name, 'cstep', cstep) - CALL attach(fidrst, dset_name, 'time', time) - CALL attach(fidrst, dset_name, 'jobnum', jobnum) - CALL attach(fidrst, dset_name, 'dt', dt) - CALL attach(fidrst, dset_name, 'iframe2d', iframe2d) - CALL attach(fidrst, dset_name, 'iframe5d', iframe5d) - - ! Write state of system to restart file - WRITE(dset_name, "(A, '/', i6.6)") "/Basic/phi", cp_step - IF (num_procs .EQ. 1) THEN - CALL putarr(fidrst, dset_name, phi(ikrs:ikre,ikzs:ikze), ionode=0) - ELSE - CALL putarr(fidrst, dset_name, phi(ikrs:ikre,ikzs:ikze), pardim=1) - ENDIF - - CALL attach(fidrst, dset_name, 'cstep', cstep) - CALL attach(fidrst, dset_name, 'time', time) - CALL attach(fidrst, dset_name, 'jobnum', jobnum) - CALL attach(fidrst, dset_name, 'dt', dt) - CALL attach(fidrst, dset_name, 'iframe2d', iframe2d) - CALL attach(fidrst, dset_name, 'iframe5d', iframe5d) - - IF (my_id .EQ. 0) THEN - WRITE(*,'(3x,a)') "Checkpoint file "//TRIM(rstfile)//" updated" - ENDIF - -END SUBROUTINE checkpoint_save -- GitLab