module io_netcdf ! ! Reads/writes netcdf formats for gryffin ! ! Netcdf is preferable to plain ascii/binary i/o for several reasons: ! it is more portable, it is as fast as binary, it works with many ! graphics packages, and it allows variables to be added without ! affecting the file format. ! ! (c) Copyright 1991 to 1998 by Michael A. Beer, William D. Dorland, ! P. B. Snyder, Q. P. Liu, and Gregory W. Hammett. ALL RIGHTS RESERVED. ! implicit none real, private, allocatable, dimension(:,:) :: ri1 real, private, allocatable, dimension(:,:,:) :: ri2 real, private, allocatable, dimension(:,:,:,:) :: ri3 real, private, allocatable, dimension(:,:,:,:,:) :: ri4 logical, private, parameter :: serial_io=.true. ! this forces serial interaction with netcdf, to avoid bugs in parallel ! netcdf (or for computers without parallel netcdf). ! If parallel netcdf is every fixed, set this to false. contains subroutine wreadnc(filename, ntim, ntimr, tim, dt1, nsteps, nfile) ! ! Read results from the *.nc file, and write them into the ! the itg common variables ! ! first read the dimensions and integers, then ! call separate subroutine to read rest of file use itg_data use gryffin_layouts use convert use mp use gryffin_grid use fields use diagnostics_arrays use netcdf_mod include 'netcdf.inc' ! subroutine arguments character(*), intent(in) :: filename ! name of netcdf file integer ntim ! on entry, the index of last time point previously used. ! on exit, the index of the last time point now used. integer ntimr ! the same as for ntim, but for a copy of phi(t) at ! one point with potentially higher time resolution ! for frequency calculation. integer nsteps ! total number of timesteps. This must be specified ! for runs that have been restarted. integer nfile ! number of restart files ! output subroutine arguments: real tim ! final time when dt is the same for all ky's. real dt1 ! time step when dt is the same for all ky's. ! local variables: integer ncid ! netCDF id number character yorn*1,varname*30 integer iwrite,ri,i,nt,k,id,l,m,n,n1,nt1,nt2,ntf1,ntf2 integer i2(2),i3(3),i4(4),i5(5) logical emflag ! use the "skip_code" logical to skip code that hasn't yet been upgraded, ! while avoiding compiler warnings about inaccessible code: logical :: skip_code ! netCDF variables ! dimensions: integer :: status, nvars, ld_dim, md_dim, nd_dim, nspec_dim, & kdpass_dim, time_dim, nd4_dim, md4_dim, id_dim, timef_dim, & char30_dim, char80_dim integer :: ri_dim ! extra dimension for complex vars, 1=real 2=im ! netcdf variable tags: integer ld_id, ldb_id, kd_id, nmin_id, nmax_id integer nd_id, lin_id, kdpass_id integer nstp_id, ne_id, nfreq_id, ntotal_id, md_id integer nspecies_id, ikx_id, iperiod_id integer nparmom_id, nperpmom_id, nemom_id integer iodd_id, iflr_id, iphi00_id, ifilter_id integer iexp_id, igradon_id, mmin_id, mmax_id integer malias_id, nalias_id integer semi_imp_id,beta_e_id,nuei_id,inuei_id,meovmi_id ! EM integer n_e_id,u_e_id,tpar_e_id,tperp_e_id,apar_id ! EM integer tim_id, shr_id, qsf_id, epsn_id, eps_id, epse_id integer nueeff_id, alpha_id, etai_id, nuii_id, rmu1_id integer tiovte_id, vy_id, vz_id, rmime_id, etae_id integer dt0_id, dt1_id, x0_id, y0_id, z0_id, xp_id integer density_id, potential_id, u_par_id, t_par_id, t_perp_id integer q_perp_id, q_par_id integer e_density_id, e_p_id, e_r_id, e_t_id, phi_ba_id integer phi_bk_id, e_denk_id, phiav_old_id integer timo_id, wpfx_id, fluxi_id, fluxe_id, qfluxe_id integer gamx_id, mgamx_id, wenx_id, pcerr_id integer wtif_id, wkif_id, wpif_id, psp_id, wenrk_id integer dketa_id, dkpar_id, dktor_id, dktdp_id, wkups_id integer dktot_id, cx_id, cy_id, cz_id, czc_id, czcn_id integer czn_id, cznn_id, ct_id, ninterv_id integer phi00_id, den00_id, upar00_id, tpar00_id, tperp00_id integer drt_id, phirms_id, wakx_id, waky_id, wxsp_id integer utor_id, upol_id, grtmx_id, utim_id, timf_id integer phih0_id,uparh0_id,denh0_id,tparh0_id,tperph0_id integer qparh0_id,qperph0_id,veh0_id,uparph0_id integer avgflag_id, date_id, note_id integer rmass_id, charge_id, n_I_id, Ln_id, eta_id integer eta_par_id, tau_id, phisq_id, fluximn_id integer qfluximn_id, fluxemn_id, qfluxemn_id integer icrit_id, ntimf_id, time_id, dt_id, rkperp2_id, idum integer :: mloc, nloc, ploc real, dimension(:), allocatable :: timeall, dtall real, dimension(:,:,:), allocatable :: rkperp2all if(proc0) write(*,*) 'netCDF version ',NF_INQ_LIBVERS() ! Open the netcdf file (There is no difficulty in all processors ! opening the file simultaneously as read-only/shareable. Each ! processor then reads its part of the arrays.): call barrier status = nf_open(filename, nf_nowrite, ncid) ! all procs open file if(status /= nf_noerr .and. proc0) then write(*,*) 'ERROR in wreadnc, can''t find netCDF file ', filename write(*,*) nf_strerror(status) stop endif call barrier ! first determine if data file was produced by the electromagnetic ! version of the code by searching for the variable beta_e emflag=.false. status=nf_inq_nvars(ncid,nvars) do i=1,nvars status=nf_inq_varname(ncid,i,varname) if (varname(1:6) == 'beta_e') then status=netcdf_inq_varid(ncid,'beta_e',beta_e_id) status=netcdf_get_var(ncid,beta_e_id,beta_e) if(beta_e .gt. 0.0) then emflag=.true. if(proc0) then write(*,*) 'Reading *.nc file from electromagnetic version' write(*,*) ' ' endif endif endif enddo if (.not. emflag) then if(proc0) then write(*,*) 'Reading *.nc file from electrostatic version' write(*,*) ' ' endif endif ! get dimensions id's status=netcdf_inq_dimid(ncid,'ld',ld_dim) status=netcdf_inq_dimid(ncid,'md',md_dim) status=netcdf_inq_dimid(ncid,'nd',nd_dim) status=netcdf_inq_dimid(ncid,'nspecies',nspec_dim) status=netcdf_inq_dimid(ncid,'ri',ri_dim) status=netcdf_inq_dimid(ncid,'time',time_dim) status=netcdf_inq_dimid(ncid,'timef',timef_dim) ! fast timescale status=netcdf_inq_dimid(ncid,'nd4',nd4_dim) status=netcdf_inq_dimid(ncid,'md4',md4_dim) status=netcdf_inq_dimid(ncid,'id',id_dim) ! drive term dim status=netcdf_inq_dimid(ncid,'char30',char30_dim) status=netcdf_inq_dimid(ncid,'char80',char80_dim) ! get variable id's status=netcdf_inq_varid(ncid,'ld',ld_id) status=netcdf_inq_varid(ncid,'ldb',ldb_id) status=netcdf_inq_varid(ncid,'kd',kd_id) status=netcdf_inq_varid(ncid,'nmin',nmin_id) status=netcdf_inq_varid(ncid,'nmax',nmax_id) status=netcdf_inq_varid(ncid,'nd',nd_id) status=netcdf_inq_varid(ncid,'lin',lin_id) status=netcdf_inq_varid(ncid,'kdpass',kdpass_id) status=netcdf_inq_varid(ncid,'nstp',nstp_id) status=netcdf_inq_varid(ncid,'ne',ne_id) status=netcdf_inq_varid(ncid,'nfreq',nfreq_id) status=netcdf_inq_varid(ncid,'ntotal',ntotal_id) status=netcdf_inq_varid(ncid,'md',md_id) status=netcdf_inq_varid(ncid,'nspecies',nspecies_id) status=netcdf_inq_varid(ncid,'ikx',ikx_id) status=netcdf_inq_varid(ncid,'iperiod',iperiod_id) status=netcdf_inq_varid(ncid,'nparmom',nparmom_id) status=netcdf_inq_varid(ncid,'nperpmom',nperpmom_id) status=netcdf_inq_varid(ncid,'nemom',nemom_id) status=netcdf_inq_varid(ncid,'iodd',iodd_id) status=netcdf_inq_varid(ncid,'iflr',iflr_id) status=netcdf_inq_varid(ncid,'iphi00',iphi00_id) status=netcdf_inq_varid(ncid,'ifilter',ifilter_id) status=netcdf_inq_varid(ncid,'iexp',iexp_id) status=netcdf_inq_varid(ncid,'igradon',igradon_id) status=netcdf_inq_varid(ncid,'malias',malias_id) status=netcdf_inq_varid(ncid,'nalias',nalias_id) status=netcdf_inq_varid(ncid,'mmin',mmin_id) status=netcdf_inq_varid(ncid,'mmax',mmax_id) status=netcdf_inq_varid(ncid,'tim',tim_id) status=netcdf_inq_varid(ncid,'shr',shr_id) status=netcdf_inq_varid(ncid,'qsf',qsf_id) status=netcdf_inq_varid(ncid,'epsn',epsn_id) status=netcdf_inq_varid(ncid,'eps',eps_id) status=netcdf_inq_varid(ncid,'epse',epse_id) status=netcdf_inq_varid(ncid,'nueeff',nueeff_id) status=netcdf_inq_varid(ncid,'alpha',alpha_id) status=netcdf_inq_varid(ncid,'etai',etai_id) status=netcdf_inq_varid(ncid,'nuii',nuii_id) status=netcdf_inq_varid(ncid,'rmu1',rmu1_id) status=netcdf_inq_varid(ncid,'tiovte',tiovte_id) status=netcdf_inq_varid(ncid,'vy',vy_id) status=netcdf_inq_varid(ncid,'vz',vz_id) status=netcdf_inq_varid(ncid,'rmime',rmime_id) status=netcdf_inq_varid(ncid,'etae',etae_id) status=netcdf_inq_varid(ncid,'dt0',dt0_id) status=netcdf_inq_varid(ncid,'dt1',dt1_id) status=netcdf_inq_varid(ncid,'x0',x0_id) status=netcdf_inq_varid(ncid,'y0',y0_id) status=netcdf_inq_varid(ncid,'z0',z0_id) status=netcdf_inq_varid(ncid,'xp',xp_id) status=netcdf_inq_varid(ncid,'potential',potential_id) status=netcdf_inq_varid(ncid,'density',density_id) status=netcdf_inq_varid(ncid,'u_par',u_par_id) status=netcdf_inq_varid(ncid,'t_par',t_par_id) status=netcdf_inq_varid(ncid,'t_perp',t_perp_id) status=netcdf_inq_varid(ncid,'q_par',q_par_id) status=netcdf_inq_varid(ncid,'q_perp',q_perp_id) status=netcdf_inq_varid(ncid,'phiav_old',phiav_old_id) status=netcdf_inq_varid(ncid,'timo',timo_id) status=netcdf_inq_varid(ncid,'wpfx',wpfx_id) status=netcdf_inq_varid(ncid,'fluxi',fluxi_id) status=netcdf_inq_varid(ncid,'fluxe',fluxe_id) status=netcdf_inq_varid(ncid,'qfluxe',qfluxe_id) status=netcdf_inq_varid(ncid,'gamx',gamx_id) status=netcdf_inq_varid(ncid,'mgamx',mgamx_id) status=netcdf_inq_varid(ncid,'wenx',wenx_id) status=netcdf_inq_varid(ncid,'pcerr',pcerr_id) status=netcdf_inq_varid(ncid,'wtif',wtif_id) status=netcdf_inq_varid(ncid,'wkif',wkif_id) status=netcdf_inq_varid(ncid,'wpif',wpif_id) status=netcdf_inq_varid(ncid,'psp',psp_id) status=netcdf_inq_varid(ncid,'wenrk',wenrk_id) status=netcdf_inq_varid(ncid,'dketa',dketa_id) status=netcdf_inq_varid(ncid,'dkpar',dkpar_id) status=netcdf_inq_varid(ncid,'dktor',dktor_id) status=netcdf_inq_varid(ncid,'dktdp',dktdp_id) status=netcdf_inq_varid(ncid,'wkups',wkups_id) status=netcdf_inq_varid(ncid,'dktot',dktot_id) status=netcdf_inq_varid(ncid,'cx',cx_id) status=netcdf_inq_varid(ncid,'cy',cy_id) status=netcdf_inq_varid(ncid,'cz',cz_id) status=netcdf_inq_varid(ncid,'czc',czc_id) status=netcdf_inq_varid(ncid,'czcn',czcn_id) status=netcdf_inq_varid(ncid,'czn',czn_id) status=netcdf_inq_varid(ncid,'cznn',cznn_id) status=netcdf_inq_varid(ncid,'ct',ct_id) status=netcdf_inq_varid(ncid,'ninterv',ninterv_id) status=netcdf_inq_varid(ncid,'phi00',phi00_id) status=netcdf_inq_varid(ncid,'den00',den00_id) status=netcdf_inq_varid(ncid,'upar00',upar00_id) status=netcdf_inq_varid(ncid,'tpar00',tpar00_id) status=netcdf_inq_varid(ncid,'tperp00',tperp00_id) status=netcdf_inq_varid(ncid,'phih0',phih0_id) status=netcdf_inq_varid(ncid,'uparh0',uparh0_id) status=netcdf_inq_varid(ncid,'denh0',denh0_id) status=netcdf_inq_varid(ncid,'tparh0',tparh0_id) status=netcdf_inq_varid(ncid,'tperph0',tperph0_id) status=netcdf_inq_varid(ncid,'qparh0',qparh0_id) status=netcdf_inq_varid(ncid,'qperph0',qperph0_id) status=netcdf_inq_varid(ncid,'veh0',veh0_id) status=netcdf_inq_varid(ncid,'uparph0',uparph0_id) status=netcdf_inq_varid(ncid,'drt',drt_id) status=netcdf_inq_varid(ncid,'phirms',phirms_id) status=netcdf_inq_varid(ncid,'wakx',wakx_id) status=netcdf_inq_varid(ncid,'waky',waky_id) status=netcdf_inq_varid(ncid,'wxsp',wxsp_id) status=netcdf_inq_varid(ncid,'utor',utor_id) status=netcdf_inq_varid(ncid,'upol',upol_id) status=netcdf_inq_varid(ncid,'grtmx',grtmx_id) status=netcdf_inq_varid(ncid,'utim',utim_id) status=netcdf_inq_varid(ncid,'timf',timf_id) status=netcdf_inq_varid(ncid,'avgflag',avgflag_id) status=netcdf_inq_varid(ncid,'date',date_id) status=netcdf_inq_varid(ncid,'note',note_id) status=netcdf_inq_varid(ncid,'rmass',rmass_id) status=netcdf_inq_varid(ncid,'charge',charge_id) status=netcdf_inq_varid(ncid,'n_I',n_I_id) status=netcdf_inq_varid(ncid,'Ln',Ln_id) status=netcdf_inq_varid(ncid,'eta',eta_id) status=netcdf_inq_varid(ncid,'eta_par',eta_par_id) status=netcdf_inq_varid(ncid,'tau',tau_id) status=netcdf_inq_varid(ncid,'phisq',phisq_id) status=netcdf_inq_varid(ncid,'fluximn',fluximn_id) status=netcdf_inq_varid(ncid,'qfluximn',qfluximn_id) status=netcdf_inq_varid(ncid,'fluxemn',fluxemn_id) status=netcdf_inq_varid(ncid,'qfluxemn',qfluxemn_id) status=netcdf_inq_varid(ncid,'icrit',icrit_id) status=netcdf_inq_varid(ncid,'ntimf',ntimf_id) status=netcdf_inq_varid(ncid,'time',time_id) status=netcdf_inq_varid(ncid,'dt',dt_id) status=netcdf_inq_varid(ncid,'rkperp2',rkperp2_id) ! read 0 and 1 dimensional variables status=netcdf_get_var(ncid,ld_id,ld) status=netcdf_get_var(ncid,ldb_id,ldb) status=netcdf_get_var(ncid,kd_id,kd) status=netcdf_get_var(ncid,nmin_id,nmin) status=netcdf_get_var(ncid,nmax_id,nmax) status=netcdf_get_var(ncid,nd_id,nd) status=netcdf_get_var(ncid,lin_id,lin) status=netcdf_get_var(ncid,kdpass_id,kdpass) status=netcdf_get_var(ncid,nstp_id,nstp) status=netcdf_get_var(ncid,ne_id,ne) status=netcdf_get_var(ncid,nfreq_id,nfreq) status=netcdf_get_var(ncid,ntotal_id,ntotal) status=netcdf_get_var(ncid,md_id,md) status=netcdf_get_var(ncid,nspecies_id,nspecies) status=netcdf_get_var(ncid,ikx_id,ikx) status=netcdf_get_var(ncid,iperiod_id,iperiod) status=netcdf_get_var(ncid,nparmom_id,nparmom) status=netcdf_get_var(ncid,nperpmom_id,nperpmom) status=netcdf_get_var(ncid,nemom_id,nemom) status=netcdf_get_var(ncid,iodd_id,iodd) status=netcdf_get_var(ncid,iflr_id,iflr) status=netcdf_get_var(ncid,iphi00_id,iphi00) status=netcdf_get_var(ncid,ifilter_id,ifilter) status=netcdf_get_var(ncid,iexp_id,iexp) status=netcdf_get_var(ncid,igradon_id,igradon) status=netcdf_get_var(ncid,malias_id,malias) status=netcdf_get_var(ncid,nalias_id,nalias) ! values for time indices: nt1=ntim+1 nt2=ntim+ne ntf1=ntimr+1 ntf2=ntimr+ntotal status=netcdf_get_var(ncid,tim_id,tim) status=netcdf_get_var(ncid,shr_id,shr) status=netcdf_get_var(ncid,qsf_id,qsf) status=netcdf_get_var(ncid,epsn_id,epsn) status=netcdf_get_var(ncid,eps_id,eps) status=netcdf_get_var(ncid,epse_id,epse) status=netcdf_get_var(ncid,nueeff_id,nueeff) status=netcdf_get_var(ncid,alpha_id,alpha) status=netcdf_get_var(ncid,etai_id,etai) status=netcdf_get_var(ncid,nuii_id,nuii) status=netcdf_get_var(ncid,rmu1_id,rmu1) status=netcdf_get_var(ncid,tiovte_id,tiovte) status=netcdf_get_var(ncid,vy_id,vy) status=netcdf_get_var(ncid,vz_id,vz) status=netcdf_get_var(ncid,rmime_id,rmime) status=netcdf_get_var(ncid,etae_id,etae) status=netcdf_get_var(ncid,dt0_id,dt0) status=netcdf_get_var(ncid,dt1_id,dt1) status=netcdf_get_var(ncid,x0_id,x0) status=netcdf_get_var(ncid,y0_id,y0) status=netcdf_get_var(ncid,z0_id,z0) status=netcdf_get_var(ncid,xp_id,xp) ! ! If mmin is not allocated, 'allocate' has not been called. ! if(.not.allocated(mmin)) then ! allocate(mmin(nd),mmax(nd)) call init_gryffin_layouts (md, nd) call alloc_grid ! see if the above init_gryffin_layouts is enough for use in n2cres, ! without needing to call init_grid: ! Initialize grid quantities: ! call init_grid (epse, iperiod, lin, linlay) call alloc_itg ! Allocate arrays (mostly diagnostics) call alloc_fields ! Allocate main 3-D arrays nsteps = max(nsteps, ntotal) ! ! This could be done more reliably by storing two new variables. ! One would count the total number of time steps taken to that point, ! and would replace nsteps, and the other would count the total number ! of times prstep was called, through all the continuation runs. This ! would replace nfile*ne here. ! call alloc_diagnostics(nfile*ne, nsteps) allocate (rdiff(m_low:m_alloc, n_low:n_alloc)) endif status=netcdf_get_var(ncid,mmin_id,mmin) status=netcdf_get_var(ncid,mmax_id,mmax) status=netcdf_get_var(ncid,timo_id,timo(nt1:nt2)) status=netcdf_get_var(ncid,fluxe_id,fluxe(nt1:nt2)) status=netcdf_get_var(ncid,qfluxe_id,qfluxe(nt1:nt2)) status=netcdf_get_var(ncid,gamx_id,gamx(nt1:nt2)) status=netcdf_get_var(ncid,wenx_id,wenx(nt1:nt2)) status=netcdf_get_var(ncid,pcerr_id,pcerr(nt1:nt2)) status=netcdf_get_var(ncid,ct_id,ct(nt1:nt2)) status=netcdf_get_var(ncid,ninterv_id,ninterv) status=netcdf_get_var(ncid,phirms_id,phirms(nt1:nt2)) status=netcdf_get_var(ncid,wakx_id,wakx(nt1:nt2)) status=netcdf_get_var(ncid,waky_id,waky(nt1:nt2)) status=netcdf_get_var(ncid,wxsp_id,wxsp(nt1:nt2)) status=netcdf_get_var(ncid,utor_id,utor(nt1:nt2)) status=netcdf_get_var(ncid,upol_id,upol(nt1:nt2)) status=netcdf_get_var(ncid,timf_id,timf(ntf1:ntf2)) status=netcdf_get_var(ncid,avgflag_id,avgflag) status=netcdf_get_var(ncid,date_id,date) status=netcdf_get_var(ncid,note_id,note) status=netcdf_get_var(ncid,rmass_id,rmass) status=netcdf_get_var(ncid,charge_id,charge) status=netcdf_get_var(ncid,n_I_id,n_I) status=netcdf_get_var(ncid,Ln_id,Ln) status=netcdf_get_var(ncid,eta_id,eta) status=netcdf_get_var(ncid,eta_par_id,eta_par) status=netcdf_get_var(ncid,tau_id,tau) status=netcdf_get_var(ncid,icrit_id,icrit) status=netcdf_get_var(ncid,ntimf_id,ntimf) allocate(timeall(md),dtall(md)) status=netcdf_get_var(ncid,time_id,timeall) status=netcdf_get_var(ncid,dt_id,dtall) !########################################################################### ! ! Now read multi-dimensional arrays that may be distributed ! among parallel processors: n1=nspecies mloc = m_high - m_low + 1 nloc = n_high - n_low + 1 ! ploc > 0 only if both mloc and nloc > 0, i.e., only if this processor ! has same data to read. ploc = min(mloc, nloc) if(mloc > 0) then time(:) = timeall(m_low:m_high) dt(:) = dtall(m_low:m_high) endif deallocate(timeall,dtall) ! Note that this is a little different than wpunchnc, where we write ! just the section of the array on this processor. Here we read ! the whole array into ri2, and then select out just the component ! stored on this processor in the array selected argument in the call ! to r2c: allocate (ri2(2,md,nd)) status=netcdf_get_var(ncid,phiav_old_id,ri2) if(ploc > 0) call r2c (phiav_old, ri2(:,m_low:m_high, n_low:n_high)) deallocate (ri2) allocate (ri3(2,ld,md,nd)) status=netcdf_get_var(ncid,potential_id,ri3) if(ploc > 0) call r2c (potential, ri3(:,:,m_low:m_high, n_low:n_high)) deallocate (ri3) allocate (rkperp2all(ld,md,nd)) status=netcdf_get_var(ncid,rkperp2_id,rkperp2all) if(ploc > 0) rkperp2 = rkperp2all(:,m_low:m_high, n_low:n_high) deallocate (rkperp2all) allocate (ri4(2,ld,md,nd,n1)) status=netcdf_get_var(ncid,density_id,ri4) if(ploc > 0) call r2c(density, ri4(:,:,m_low:m_high, n_low:n_high,:)) status=netcdf_get_var(ncid,u_par_id,ri4) if(ploc > 0) call r2c(u_par, ri4(:,:,m_low:m_high, n_low:n_high,:)) status=netcdf_get_var(ncid,t_par_id,ri4) if(ploc > 0) call r2c(t_par, ri4(:,:,m_low:m_high, n_low:n_high,:)) status=netcdf_get_var(ncid,t_perp_id,ri4) if(ploc > 0) call r2c(t_perp, ri4(:,:,m_low:m_high, n_low:n_high,:)) status=netcdf_get_var(ncid,q_par_id,ri4) if(ploc > 0) call r2c(q_par, ri4(:,:,m_low:m_high, n_low:n_high,:)) status=netcdf_get_var(ncid,q_perp_id,ri4) if(ploc > 0) call r2c(q_perp, ri4(:,:,m_low:m_high, n_low:n_high,:)) deallocate (ri4) ! must be careful with the time variable to allow for calls with ! ntim or ntimr nonzero. the netCDF values will be 1...ne, but ! they must be read into nt1...nt2. status=netcdf_get_var(ncid,wpfx_id,wpfx(nt1:nt2,1:nspecies)) status=netcdf_get_var(ncid,fluxi_id,fluxi(nt1:nt2,1:nspecies)) status=netcdf_get_var(ncid,cx_id,cx(nt1:nt2,1:4*nd)) skip_code=.true. if(.not.skip_code) then ! Only radial correlation functions in parallel code yet status=netcdf_get_var(ncid,cy_id,cy(nt1:nt2,1:4*md)) status=netcdf_get_var(ncid,cz_id,cz(nt1:nt2,1:ld)) status=netcdf_get_var(ncid,czc_id,czc(nt1:nt2,1:ld)) status=netcdf_get_var(ncid,czcn_id,czcn(nt1:nt2,1:ld)) status=netcdf_get_var(ncid,czn_id,czn(nt1:nt2,1:ld)) status=netcdf_get_var(ncid,cznn_id,cznn(nt1:nt2,1:ld)) endif status=netcdf_get_var(ncid,drt_id,drt(1:14,nt1:nt2)) allocate (ri2(2,nt1:nt2,nd)) status=netcdf_get_var(ncid,phi00_id,ri2) call r2c(phi00(nt1:nt2,:), ri2) status=netcdf_get_var(ncid,den00_id,ri2) call r2c(den00(nt1:nt2,:), ri2) status=netcdf_get_var(ncid,upar00_id,ri2) call r2c(upar00(nt1:nt2,:), ri2) status=netcdf_get_var(ncid,tpar00_id,ri2) call r2c(tpar00(nt1:nt2,:), ri2) status=netcdf_get_var(ncid,tperp00_id,ri2) call r2c(tperp00(nt1:nt2,:), ri2) deallocate (ri2) allocate (ri1(2,nt1:nt2)) status=netcdf_get_var(ncid,phih0_id,ri1) call r2c(phih0(nt1:nt2), ri1) status=netcdf_get_var(ncid,uparh0_id,ri1) call r2c(uparh0(nt1:nt2), ri1) status=netcdf_get_var(ncid,denh0_id,ri1) call r2c(denh0(nt1:nt2), ri1) status=netcdf_get_var(ncid,tparh0_id,ri1) call r2c(tparh0(nt1:nt2), ri1) status=netcdf_get_var(ncid,tperph0_id,ri1) call r2c(tperph0(nt1:nt2), ri1) status=netcdf_get_var(ncid,qparh0_id,ri1) call r2c(qparh0(nt1:nt2), ri1) status=netcdf_get_var(ncid,qperph0_id,ri1) call r2c(qperph0(nt1:nt2), ri1) status=netcdf_get_var(ncid,veh0_id,ri1) call r2c(veh0(nt1:nt2), ri1) status=netcdf_get_var(ncid,uparph0_id,ri1) call r2c(uparph0(nt1:nt2), ri1) deallocate (ri1) allocate(ri2(md, nd, nt1:nt2)) status=netcdf_get_var(ncid,mgamx_id,ri2) if(ploc > 0) mgamx(:,:,nt1:nt2) = ri2(m_low:m_high, n_low:n_high,nt1:nt2) deallocate (ri2) allocate(ri2(nt1:nt2, md, nd)) status=netcdf_get_var(ncid,wtif_id,ri2(nt1:nt2,:,:)) if(ploc > 0) wtif(nt1:nt2,:,:) = ri2(nt1:nt2,m_low:m_high, n_low:n_high) status=netcdf_get_var(ncid,wkif_id,ri2(nt1:nt2,:,:)) if(ploc > 0) wkif(nt1:nt2,:,:) = ri2(nt1:nt2,m_low:m_high, n_low:n_high) status=netcdf_get_var(ncid,wpif_id,ri2(nt1:nt2,:,:)) if(ploc > 0) wpif(nt1:nt2,:,:) = ri2(nt1:nt2,m_low:m_high, n_low:n_high) status=netcdf_get_var(ncid,psp_id,ri2(nt1:nt2,:,:)) if(ploc > 0) psp(nt1:nt2,:,:) = ri2(nt1:nt2,m_low:m_high, n_low:n_high) status=netcdf_get_var(ncid,wenrk_id,ri2(nt1:nt2,:,:)) if(ploc > 0) wenrk(nt1:nt2,:,:) = ri2(nt1:nt2,m_low:m_high, n_low:n_high) status=netcdf_get_var(ncid,dketa_id,ri2(nt1:nt2,:,:)) if(ploc > 0) dketa(nt1:nt2,:,:) = ri2(nt1:nt2,m_low:m_high, n_low:n_high) status=netcdf_get_var(ncid,dkpar_id,ri2(nt1:nt2,:,:)) if(ploc > 0) dkpar(nt1:nt2,:,:) = ri2(nt1:nt2,m_low:m_high, n_low:n_high) status=netcdf_get_var(ncid,dktor_id,ri2(nt1:nt2,:,:)) if(ploc > 0) dktor(nt1:nt2,:,:) = ri2(nt1:nt2,m_low:m_high, n_low:n_high) status=netcdf_get_var(ncid,dktdp_id,ri2(nt1:nt2,:,:)) if(ploc > 0) dktdp(nt1:nt2,:,:) = ri2(nt1:nt2,m_low:m_high, n_low:n_high) status=netcdf_get_var(ncid,wkups_id,ri2(nt1:nt2,:,:)) if(ploc > 0) wkups(nt1:nt2,:,:) = ri2(nt1:nt2,m_low:m_high, n_low:n_high) status=netcdf_get_var(ncid,dktot_id,ri2(nt1:nt2,:,:)) if(ploc > 0) dktot(nt1:nt2,:,:) = ri2(nt1:nt2,m_low:m_high, n_low:n_high) status=netcdf_get_var(ncid,grtmx_id,ri2(nt1:nt2,:,:)) if(ploc > 0) grtmx(nt1:nt2,:,:) = ri2(nt1:nt2,m_low:m_high, n_low:n_high) status=netcdf_get_var(ncid,phisq_id,ri2(nt1:nt2,:,:)) if(ploc > 0) phisq(nt1:nt2,:,:) = ri2(nt1:nt2,m_low:m_high, n_low:n_high) if(epse > 0. .or. beta_e > 0.) then status=netcdf_get_var(ncid,fluxemn_id,ri2(nt1:nt2,:,:)) if(ploc > 0) fluxemn(nt1:nt2,:,:) = ri2(nt1:nt2,m_low:m_high, n_low:n_high) status=netcdf_get_var(ncid,qfluxemn_id,ri2(nt1:nt2,:,:)) if(ploc > 0) qfluxemn(nt1:nt2,:,:) = ri2(nt1:nt2,m_low:m_high, n_low:n_high) endif deallocate(ri2) allocate(ri3(nt1:nt2,md,nd,n1)) status=netcdf_get_var(ncid,fluximn_id,ri3(nt1:nt2,:,:,:)) if(ploc > 0) fluximn(nt1:nt2,:,:,:) = ri3(nt1:nt2,m_low:m_high, n_low:n_high,:) status=netcdf_get_var(ncid,qfluximn_id,ri3(nt1:nt2,:,:,:)) if(ploc > 0) qfluximn(nt1:nt2,:,:,:) = ri3(nt1:nt2,m_low:m_high, n_low:n_high,:) deallocate(ri3) allocate (ri3(2,ntotal,md,nd)) status=netcdf_get_var(ncid,utim_id,ri3) if(ploc > 0) call r2c (utim(ntf1:ntf2,:,:), & ri3(:,ntf1:ntf2,m_low:m_high, n_low:n_high)) deallocate (ri3) ! set up bounce-avgd electrons only if they exist ! (avoids zero size dimension and saves disk space) if (epse > 0.0) then status=netcdf_inq_dimid(ncid,'kdpass',kdpass_dim) status=netcdf_inq_varid(ncid,'e_density',e_density_id) status=netcdf_inq_varid(ncid,'e_p',e_p_id) status=netcdf_inq_varid(ncid,'e_r',e_r_id) status=netcdf_inq_varid(ncid,'e_t',e_t_id) status=netcdf_inq_varid(ncid,'phi_ba',phi_ba_id) status=netcdf_inq_varid(ncid,'phi_bk',phi_bk_id) status=netcdf_inq_varid(ncid,'e_denk',e_denk_id) allocate (ri3(2, kdpass, md, nd)) status=netcdf_get_var(ncid,e_density_id,ri3) if(ploc > 0) call r2c(e_density, ri3(:,:,m_low:m_high, n_low:n_high)) status=netcdf_get_var(ncid,e_p_id,ri3) if(ploc > 0) call r2c(e_p, ri3(:,:,m_low:m_high, n_low:n_high)) status=netcdf_get_var(ncid,e_r_id,ri3) if(ploc > 0) call r2c(e_r, ri3(:,:,m_low:m_high, n_low:n_high)) status=netcdf_get_var(ncid,e_t_id,ri3) if(ploc > 0) call r2c(e_t, ri3(:,:,m_low:m_high, n_low:n_high)) status=netcdf_get_var(ncid,phi_ba_id,ri3) if(ploc > 0) call r2c(phi_ba, ri3(:,:,m_low:m_high, n_low:n_high)) deallocate (ri3) allocate (ri3(2,ld,md,nd)) status=netcdf_get_var(ncid,phi_bk_id,ri3) if(ploc > 0) call r2c(phi_bk, ri3(:,:,m_low:m_high, n_low:n_high)) status=netcdf_get_var(ncid,e_denk_id,ri3) if(ploc > 0) call r2c(e_denk, ri3(:,:,m_low:m_high, n_low:n_high)) deallocate (ri3) endif if (emflag) then status=netcdf_inq_varid(ncid,'beta_e',beta_e_id) status=netcdf_inq_varid(ncid,'semi_imp',semi_imp_id) status=netcdf_inq_varid(ncid,'nuei',nuei_id) status=netcdf_inq_varid(ncid,'inuei',inuei_id) status=netcdf_inq_varid(ncid,'meovmi',meovmi_id) status=netcdf_get_var(ncid,beta_e_id,beta_e) status=netcdf_get_var(ncid,semi_imp_id,semi_imp) status=netcdf_get_var(ncid,nuei_id,nuei) status=netcdf_get_var(ncid,inuei_id,inuei) status=netcdf_get_var(ncid,meovmi_id,meovmi) ! read EM arrays only for finite beta_e, when they're nonzero if (beta_e > 0.0) then status=netcdf_inq_varid(ncid,'n_e',n_e_id) status=netcdf_inq_varid(ncid,'u_e',u_e_id) status=netcdf_inq_varid(ncid,'tpar_e',tpar_e_id) status=netcdf_inq_varid(ncid,'tperp_e',tperp_e_id) status=netcdf_inq_varid(ncid,'apar',apar_id) allocate (ri3(2, ld, md, nd)) status=netcdf_get_var(ncid,n_e_id,ri3) if(ploc > 0) call r2c(n_e, ri3(:,:,m_low:m_high, n_low:n_high)) status=netcdf_get_var(ncid,u_e_id,ri3) if(ploc > 0) call r2c(u_e, ri3(:,:,m_low:m_high, n_low:n_high)) status=netcdf_get_var(ncid,tpar_e_id,ri3) if(ploc > 0) call r2c(tpar_e, ri3(:,:,m_low:m_high, n_low:n_high)) status=netcdf_get_var(ncid,tperp_e_id,ri3) if(ploc > 0) call r2c(tperp_e, ri3(:,:,m_low:m_high, n_low:n_high)) status=netcdf_get_var(ncid,apar_id,ri3) if(ploc > 0) call r2c(apar, ri3(:,:,m_low:m_high, n_low:n_high)) deallocate (ri3) endif endif ! increment ntim and ntimr (for concatenation etc.) ntim=ntim+ne ntimr=ntimr+ntotal ! close netcdf file: call barrier status = nf_close(ncid) if (status /= nf_noerr) write(*,*) nf_strerror(status) call barrier end subroutine wreadnc !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! subroutine handle_err(status) include 'netcdf.inc' integer status if (status /= nf_noerr) then write(*,*) nf_strerror(status) ! stop 'stopped' endif end subroutine handle_err !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! subroutine wpunchnc(filename,ntim,ntimr,tim,dt1) ! ! Write results to the *.nc file. ! use itg_data use gryffin_layouts use convert use mp use gryffin_grid use fields use diagnostics_arrays use funnel use netcdf_mod include 'netcdf.inc' ! subroutine arguments character(*) filename ! name of netcdf file to create integer ntim ! on entry, the index of last time point previously used. ! on exit, the index of the last time point now used. integer ntimr ! the same as for ntim, but for a copy of phi(t) at ! one point with potentially higher time resolution ! for frequency calculation. ! output subroutine arguments: real tim ! final time when dt is the same for all ky's. real dt1 ! time step when dt is the same for all ky's. ! local variables: integer ncid ! netCDF id number of the opened file character yorn*1 integer i,k,id,l,m,n,n1,nt1,nt2,ntf1,ntf2 integer mloc, nloc, ploc real xxx integer ri integer m_low2, m_alloc2, n_low2, n_alloc2 logical proc_write real, allocatable, dimension(:) :: rall1 real, allocatable, dimension(:,:) :: rall2 real, allocatable, dimension(:,:,:) :: rall3 ! netCDF variables integer status ! netCDF dimensions of variables: integer field_dim(4) ! dimensions of the complex field variables integer ion_dim(5) ! ion variables also have species # dimension integer e_dim(4) ! bounce-avgd electron dimensions integer av_dim(3) ! dimensions for flux-surface avgd complex integer flux_dim(2) ! time and nd integer mgamx_dim(3) ! md,nd,time integer wtif_dim(3) ! time,md,nd integer cx_dim(2),cy_dim(2),cz_dim(2),drt_dim(2) integer phi00_dim(3) ! ri,time,nd for flux-surface-avg time integer phih0_dim(2) ! ri,time integer utim_dim(4) integer fluximn_dim(4) integer lmn_dim(3) integer mn_dim(2) integer char30_dim, char80_dim integer ld_dim, md_dim, nd_dim, nspec_dim, kdpass_dim integer time_dim, nd4_dim, md4_dim, id_dim, timef_dim integer ri_dim ! extra dimension for complex vars, 1=real 2=im ! netCDF start and count arrays for writing sections of arrays: integer field_count(4) ! count indices for the complex field variables integer field_start(4) ! start indices for the complex field variables integer ion_count(5) ! count indices for the ion variables integer ion_start(5) ! start indices for the ion variables integer e_count(4) ! count indices for bounce-avgd electrons integer e_start(4) ! start indices for bounce-avgd electrons integer mgamx_count(3) ! count indices for mgamx integer mgamx_start(3) ! start indices for mgamx integer wtif_count(3) ! count indices for wtif integer wtif_start(3) ! start indices for wtif integer av_count(3),av_start(3) integer utim_count(4),utim_start(4) integer t_dim, t_count, t_start integer fluximn_count(4),fluximn_start(4) integer lmn_count(4),lmn_start(4) integer mn_count(2),mn_start(2) integer ld_id, ldb_id, kd_id, nmin_id, nmax_id ! variable tags integer nd_id, lin_id, kdpass_id integer nstp_id, ne_id, nfreq_id, ntotal_id, md_id integer nspecies_id, ikx_id, iperiod_id integer nparmom_id, nperpmom_id, nemom_id integer iodd_id, iflr_id, iphi00_id, ifilter_id integer iexp_id, igradon_id, mmin_id, mmax_id integer malias_id, nalias_id integer semi_imp_id,beta_e_id,nuei_id,inuei_id,meovmi_id ! EM integer n_e_id,u_e_id,tpar_e_id,tperp_e_id,apar_id ! EM integer tim_id, shr_id, qsf_id, epsn_id, eps_id, epse_id integer nueeff_id, alpha_id, etai_id, nuii_id, rmu1_id integer tiovte_id, vy_id, vz_id, rmime_id, etae_id integer dt0_id, dt1_id, x0_id, y0_id, z0_id, xp_id integer density_id, potential_id, u_par_id, t_par_id, t_perp_id integer q_perp_id, q_par_id integer e_density_id, e_p_id, e_r_id, e_t_id, phi_ba_id integer phi_bk_id, e_denk_id, phiav_old_id integer timo_id, wpfx_id, fluxi_id, fluxe_id, qfluxe_id integer gamx_id, mgamx_id, wenx_id, pcerr_id integer wtif_id, wkif_id, wpif_id, psp_id, wenrk_id integer dketa_id, dkpar_id, dktor_id, dktdp_id, wkups_id integer dktot_id, cx_id, cy_id, cz_id, czc_id, czcn_id integer czn_id, cznn_id, ct_id, ninterv_id integer phi00_id, den00_id, upar00_id, tpar00_id, tperp00_id integer drt_id, phirms_id, wakx_id, waky_id, wxsp_id integer utor_id, upol_id, grtmx_id, utim_id, timf_id integer phih0_id,uparh0_id,denh0_id,tparh0_id,tperph0_id integer qparh0_id,qperph0_id,veh0_id,uparph0_id integer avgflag_id, date_id, note_id integer rmass_id, charge_id, n_I_id, Ln_id, eta_id integer eta_par_id, tau_id, phisq_id, fluximn_id integer qfluximn_id, fluxemn_id, qfluxemn_id integer icrit_id, ntimf_id, time_id, dt_id, rkperp2_id integer rdiff_id, chi_int_id, idum ! small arrays for simple assign commands ! Is this variable not written?? It is used for simulations of particle noise. real rdiff_s(md,nd) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ! First create the file: if(proc0) WRITE(*,*) 'netCDF version ',NF_INQ_LIBVERS() call netcdf_init(serial_io) ! tell netcdf to be serial or parallel ! GWH: My original approach for serial_io=.true. was to do a loop over ! every processor, let the first processor create and define the file, ! and let each processor take turns opening the netcdf file and writing ! out its part of the arrays. But this turned out to have extremely bad ! scaling for some reason. A file that took less than 1 second to write ! on 1 processor would take over 2 minutes on 8 processors! ! ! The new method is to use Dorland's funnel routines to send all of the ! arrays to proc0, and let it do all of the writing. status = nf_noerr if(serial_io) then ! only proc0 opens the file: call barrier if(proc0) then status = nf_create(filename, 0, ncid) ! overwrites old endif call barrier else ! all processors open the file call barrier status = nf_create(filename, 0, ncid) ! overwrites old call barrier endif if(status /= nf_noerr) then write(*,*) 'Unable to create netcdf file ', filename write(*,*) nf_strerror(status) stop endif ! defaults values for backwards compatibility: xxx=0.0 if(idx_local(m_lo, md, 1)) then tim=time(md) dt1=dt(md) endif call broadcast(tim, proc_id(m_lo, md, 1)) call broadcast(dt1, proc_id(m_lo, md, 1)) nt1=ntim+1 nt2=ntim+ne ntim=ntim+ne ntf1=ntimr+1 ntf2=ntimr+ntotal ntimr=ntimr+ntotal ! Define dimensions status=netcdf_def_dim(ncid,'ld',ld,ld_dim) status=netcdf_def_dim(ncid,'md',md,md_dim) status=netcdf_def_dim(ncid,'nd',nd,nd_dim) status=netcdf_def_dim(ncid,'nspecies',nspecies,nspec_dim) status=netcdf_def_dim(ncid,'ri',2,ri_dim) status=netcdf_def_dim(ncid,'time',ne,time_dim) status=netcdf_def_dim(ncid,'timef',ntotal,timef_dim) ! fast timescale status=netcdf_def_dim(ncid,'nd4',4*nd,nd4_dim) status=netcdf_def_dim(ncid,'md4',4*md,md4_dim) status=netcdf_def_dim(ncid,'id',14,id_dim) ! drive term dim status=netcdf_def_dim(ncid,'char30',30,char30_dim) status=netcdf_def_dim(ncid,'char80',80,char80_dim) ! set up bounce-avgd electrons only if they exist ! (avoids zero size dimension and saves disk space) if (epse > 0.0) then status=netcdf_def_dim(ncid,'kdpass',kdpass,kdpass_dim) endif if(serial_io) then ! set up to write full arrays from proc0 m_alloc2=md n_alloc2=nd m_low2=1 n_low2=1 else ! set up to write the part of the array contained on each processor: m_alloc2=m_alloc n_alloc2=n_alloc m_low2=m_low n_low2=n_low endif field_dim(1)=ri_dim ! netcdf id's of dimensions for phi, apar etc. field_dim(2)=ld_dim field_dim(3)=md_dim field_dim(4)=nd_dim field_count(1)=2 field_count(2)=ld field_count(3)=m_alloc2-m_low2+1 field_count(4)=n_alloc2-n_low2+1 field_start(1)=1 field_start(2)=1 field_start(3)=m_low2 field_start(4)=n_low2 ! As done above, any array which is distributed over parallel processors ! must have *_start and *_count variables set up for it properly so that ! netcdf knows which part of the array is written to the netcdf file. t_dim = md_dim t_count = m_alloc2-m_low2+1 t_start = m_low2 ion_dim(1)=ri_dim ! dimensions for ion moments ion_dim(2)=ld_dim ion_dim(3)=md_dim ion_dim(4)=nd_dim ion_dim(5)=nspec_dim ion_count(1)=2 ion_count(2)=ld ion_count(3)=m_alloc2-m_low2+1 ion_count(4)=n_alloc2-n_low2+1 ion_count(5)=nspecies ion_start(1)=1 ion_start(2)=1 ion_start(3)=m_low2 ion_start(4)=n_low2 ion_start(5)=1 if (epse > 0.0) then e_dim(1)=ri_dim ! dimensions for bounce-avgd electron moments e_dim(2)=kdpass_dim e_dim(3)=md_dim e_dim(4)=nd_dim e_count(1)=2 e_count(2)=kdpass e_count(3)=m_alloc2-m_low2+1 e_count(4)=n_alloc2-n_low2+1 e_start(1)=1 e_start(2)=1 e_start(3)=m_low2 e_start(4)=n_low2 endif av_dim(1)=ri_dim ! dimensions for flux-surface avgd complex av_dim(2)=md_dim av_dim(3)=nd_dim av_count(1)=2 av_count(2)=m_alloc2-m_low2+1 av_count(3)=n_alloc2-n_low2+1 av_start(1)=1 av_start(2)=m_low2 av_start(3)=n_low2 flux_dim(1)=time_dim flux_dim(2)=nspec_dim mgamx_dim(1)=md_dim mgamx_dim(2)=nd_dim mgamx_dim(3)=time_dim mgamx_count(1)=m_alloc2-m_low2+1 mgamx_count(2)=n_alloc2-n_low2+1 mgamx_count(3)=ne mgamx_start(1)=m_low2 mgamx_start(2)=n_low2 mgamx_start(3)=1 wtif_dim(1)=time_dim wtif_dim(2)=md_dim wtif_dim(3)=nd_dim wtif_count(1)=ne wtif_count(2)=m_alloc2-m_low2+1 wtif_count(3)=n_alloc2-n_low2+1 wtif_start(1)=1 wtif_start(2)=m_low2 wtif_start(3)=n_low2 ! Correlation functions not actually calculated in parallel code yet. cx_dim(1)=time_dim cx_dim(2)=nd4_dim cy_dim(1)=time_dim cy_dim(2)=md4_dim ! ?? GWH: need to figure out how to parallellize the cy variable, which is ! dimensioned to md4=4*md. cz_dim(1)=time_dim cz_dim(2)=ld_dim phi00_dim(1)=ri_dim phi00_dim(2)=time_dim phi00_dim(3)=nd_dim phih0_dim(1)=ri_dim phih0_dim(2)=time_dim drt_dim(1)=id_dim drt_dim(2)=time_dim utim_dim(1)=ri_dim utim_dim(2)=timef_dim utim_dim(3)=md_dim utim_dim(4)=nd_dim utim_count(1)=2 utim_count(2)=ntotal utim_count(3)=m_alloc2-m_low2+1 utim_count(4)=n_alloc2-n_low2+1 utim_start(1)=1 utim_start(2)=1 utim_start(3)=m_low2 utim_start(4)=n_low2 fluximn_dim(1)=time_dim fluximn_dim(2)=md_dim fluximn_dim(3)=nd_dim fluximn_dim(4)=nspec_dim fluximn_count(1)=ne fluximn_count(2)=m_alloc2-m_low2+1 fluximn_count(3)=n_alloc2-n_low2+1 fluximn_count(4)=nspecies fluximn_start(1)=1 fluximn_start(2)=m_low2 fluximn_start(3)=n_low2 fluximn_start(4)=1 lmn_dim(1)=ld_dim lmn_dim(2)=md_dim lmn_dim(3)=nd_dim lmn_count(1)=ld lmn_count(2)=m_alloc2-m_low2+1 lmn_count(3)=n_alloc2-n_low2+1 lmn_start(1)=1 lmn_start(2)=m_low2 lmn_start(3)=n_low2 mn_dim(1)=md_dim mn_dim(2)=nd_dim mn_count(1)=m_alloc2-m_low2+1 mn_count(2)=n_alloc2-n_low2+1 mn_start(1)=m_low2 mn_start(2)=n_low2 ! define variables status=netcdf_def_var(ncid,'ld',nf_int,0,0,ld_id) status=netcdf_def_var(ncid,'ldb',nf_int,0,0,ldb_id) status=netcdf_def_var(ncid,'kd',nf_int,0,0,kd_id) status=netcdf_def_var(ncid,'nmin',nf_int,0,0,nmin_id) status=netcdf_def_var(ncid,'nmax',nf_int,0,0,nmax_id) status=netcdf_def_var(ncid,'nd',nf_int,0,0,nd_id) status=netcdf_def_var(ncid,'lin',nf_int,0,0,lin_id) status=netcdf_def_var(ncid,'kdpass',nf_int,0,0,kdpass_id) status=netcdf_def_var(ncid,'nstp',nf_int,0,0,nstp_id) status=netcdf_def_var(ncid,'ne',nf_int,0,0,ne_id) status=netcdf_def_var(ncid,'nfreq',nf_int,0,0,nfreq_id) status=netcdf_def_var(ncid,'ntotal',nf_int,0,0,ntotal_id) status=netcdf_def_var(ncid,'md',nf_int,0,0,md_id) status=netcdf_def_var(ncid,'nspecies',nf_int,0,0,nspecies_id) status=netcdf_def_var(ncid,'ikx',nf_int,0,0,ikx_id) status=netcdf_def_var(ncid,'iperiod',nf_int,0,0,iperiod_id) status=netcdf_def_var(ncid,'nparmom',nf_int,0,0,nparmom_id) status=netcdf_def_var(ncid,'nperpmom',nf_int,0,0,nperpmom_id) status=netcdf_def_var(ncid,'nemom',nf_int,0,0,nemom_id) status=netcdf_def_var(ncid,'iodd',nf_int,0,0,iodd_id) status=netcdf_def_var(ncid,'iflr',nf_int,0,0,iflr_id) status=netcdf_def_var(ncid,'iphi00',nf_int,0,0,iphi00_id) status=netcdf_def_var(ncid,'ifilter',nf_int,0,0,ifilter_id) status=netcdf_def_var(ncid,'iexp',nf_int,0,0,iexp_id) status=netcdf_def_var(ncid,'igradon',nf_int,0,0,igradon_id) status=netcdf_def_var(ncid,'malias',nf_int,0,0,malias_id) status=netcdf_def_var(ncid,'nalias',nf_int,0,0,nalias_id) ! new electromagnetic constants status=netcdf_def_var(ncid,'semi_imp',nf_int,0,0,semi_imp_id) status=netcdf_def_var(ncid,'beta_e',nf_double,0,0,beta_e_id) status=netcdf_def_var(ncid,'nuei',nf_double,0,0,nuei_id) status=netcdf_def_var(ncid,'inuei',nf_int,0,0,inuei_id) status=netcdf_def_var(ncid,'meovmi',nf_double,0,0,meovmi_id) status=netcdf_def_var(ncid,'mmin',nf_int,1,nd_dim,mmin_id) status=netcdf_def_var(ncid,'mmax',nf_int,1,nd_dim,mmax_id) status=netcdf_def_var(ncid,'tim',nf_double,0,0,tim_id) status=netcdf_def_var(ncid,'shr',nf_double,0,0,shr_id) status=netcdf_def_var(ncid,'qsf',nf_double,0,0,qsf_id) status=netcdf_def_var(ncid,'epsn',nf_double,0,0,epsn_id) status=netcdf_def_var(ncid,'eps',nf_double,0,0,eps_id) status=netcdf_def_var(ncid,'epse',nf_double,0,0,epse_id) status=netcdf_def_var(ncid,'nueeff',nf_double,0,0,nueeff_id) status=netcdf_def_var(ncid,'alpha',nf_double,0,0,alpha_id) status=netcdf_def_var(ncid,'etai',nf_double,0,0,etai_id) status=netcdf_def_var(ncid,'nuii',nf_double,0,0,nuii_id) status=netcdf_def_var(ncid,'rmu1',nf_double,0,0,rmu1_id) status=netcdf_def_var(ncid,'tiovte',nf_double,0,0,tiovte_id) status=netcdf_def_var(ncid,'vy',nf_double,0,0,vy_id) status=netcdf_def_var(ncid,'vz',nf_double,0,0,vz_id) status=netcdf_def_var(ncid,'rmime',nf_double,0,0,rmime_id) status=netcdf_def_var(ncid,'etae',nf_double,0,0,etae_id) status=netcdf_def_var(ncid,'dt0',nf_double,0,0,dt0_id) status=netcdf_def_var(ncid,'dt1',nf_double,0,0,dt1_id) status=netcdf_def_var(ncid,'x0',nf_double,0,0,x0_id) status=netcdf_def_var(ncid,'y0',nf_double,0,0,y0_id) status=netcdf_def_var(ncid,'z0',nf_double,0,0,z0_id) status=netcdf_def_var(ncid,'xp',nf_double,0,0,xp_id) status=netcdf_def_var(ncid,'potential',nf_double,4,field_dim,potential_id) status=netcdf_def_var(ncid,'density',nf_double,5,ion_dim,density_id) status=netcdf_def_var(ncid,'u_par',nf_double,5,ion_dim,u_par_id) status=netcdf_def_var(ncid,'t_par',nf_double,5,ion_dim,t_par_id) status=netcdf_def_var(ncid,'t_perp',nf_double,5,ion_dim,t_perp_id) status=netcdf_def_var(ncid,'q_par',nf_double,5,ion_dim,q_par_id) status=netcdf_def_var(ncid,'q_perp',nf_double,5,ion_dim,q_perp_id) if (epse > 0.0) then status=netcdf_def_var(ncid,'e_density',nf_double,4,e_dim,e_density_id) status=netcdf_def_var(ncid,'e_p',nf_double,4,e_dim,e_p_id) status=netcdf_def_var(ncid,'e_r',nf_double,4,e_dim,e_r_id) status=netcdf_def_var(ncid,'e_t',nf_double,4,e_dim,e_t_id) status=netcdf_def_var(ncid,'phi_ba',nf_double,4,e_dim,phi_ba_id) status=netcdf_def_var(ncid,'phi_bk',nf_double,4,field_dim,phi_bk_id) status=netcdf_def_var(ncid,'e_denk',nf_double,4,field_dim,e_denk_id) endif ! define electromagnetic arrays only for finite beta if (beta_e > 0.0) then status=netcdf_def_var(ncid,'n_e',nf_double,4,field_dim,n_e_id) status=netcdf_def_var(ncid,'u_e',nf_double,4,field_dim,u_e_id) status=netcdf_def_var(ncid,'tpar_e',nf_double,4,field_dim,tpar_e_id) status=netcdf_def_var(ncid,'tperp_e',nf_double,4,field_dim,tperp_e_id) status=netcdf_def_var(ncid,'apar',nf_double,4,field_dim,apar_id) endif status=netcdf_def_var(ncid,'phiav_old',nf_double,3,av_dim,phiav_old_id) status=netcdf_def_var(ncid,'timo',nf_double,1,time_dim,timo_id) status=netcdf_def_var(ncid,'wpfx',nf_double,2,flux_dim,wpfx_id) status=netcdf_def_var(ncid,'fluxi',nf_double,2,flux_dim,fluxi_id) status=netcdf_def_var(ncid,'fluxe',nf_double,1,time_dim,fluxe_id) status=netcdf_def_var(ncid,'qfluxe',nf_double,1,time_dim,qfluxe_id) status=netcdf_def_var(ncid,'gamx',nf_double,1,time_dim,gamx_id) status=netcdf_def_var(ncid,'mgamx',nf_double,3,mgamx_dim,mgamx_id) status=netcdf_def_var(ncid,'wenx',nf_double,1,time_dim,wenx_id) status=netcdf_def_var(ncid,'pcerr',nf_double,1,time_dim,pcerr_id) status=netcdf_def_var(ncid,'wtif',nf_double,3,wtif_dim,wtif_id) status=netcdf_def_var(ncid,'wkif',nf_double,3,wtif_dim,wkif_id) status=netcdf_def_var(ncid,'wpif',nf_double,3,wtif_dim,wpif_id) status=netcdf_def_var(ncid,'psp',nf_double,3,wtif_dim,psp_id) status=netcdf_def_var(ncid,'wenrk',nf_double,3,wtif_dim,wenrk_id) status=netcdf_def_var(ncid,'dketa',nf_double,3,wtif_dim,dketa_id) status=netcdf_def_var(ncid,'dkpar',nf_double,3,wtif_dim,dkpar_id) status=netcdf_def_var(ncid,'dktor',nf_double,3,wtif_dim,dktor_id) status=netcdf_def_var(ncid,'dktdp',nf_double,3,wtif_dim,dktdp_id) status=netcdf_def_var(ncid,'wkups',nf_double,3,wtif_dim,wkups_id) status=netcdf_def_var(ncid,'dktot',nf_double,3,wtif_dim,dktot_id) status=netcdf_def_var(ncid,'cx',nf_double,2,cx_dim,cx_id) status=netcdf_def_var(ncid,'cy',nf_double,2,cy_dim,cy_id) status=netcdf_def_var(ncid,'cz',nf_double,2,cz_dim,cz_id) status=netcdf_def_var(ncid,'czc',nf_double,2,cz_dim,czc_id) status=netcdf_def_var(ncid,'czcn',nf_double,2,cz_dim,czcn_id) status=netcdf_def_var(ncid,'czn',nf_double,2,cz_dim,czn_id) status=netcdf_def_var(ncid,'cznn',nf_double,2,cz_dim,cznn_id) status=netcdf_def_var(ncid,'ct',nf_double,1,time_dim,ct_id) status=netcdf_def_var(ncid,'ninterv',nf_int,0,0,ninterv_id) status=netcdf_def_var(ncid,'phi00',nf_double,3,phi00_dim,phi00_id) status=netcdf_def_var(ncid,'den00',nf_double,3,phi00_dim,den00_id) status=netcdf_def_var(ncid,'upar00',nf_double,3,phi00_dim,upar00_id) status=netcdf_def_var(ncid,'tpar00',nf_double,3,phi00_dim,tpar00_id) status=netcdf_def_var(ncid,'tperp00',nf_double,3,phi00_dim,tperp00_id) status=netcdf_def_var(ncid,'phih0',nf_double,2,phih0_dim,phih0_id) status=netcdf_def_var(ncid,'uparh0',nf_double,2,phih0_dim,uparh0_id) status=netcdf_def_var(ncid,'denh0',nf_double,2,phih0_dim,denh0_id) status=netcdf_def_var(ncid,'tparh0',nf_double,2,phih0_dim,tparh0_id) status=netcdf_def_var(ncid,'tperph0',nf_double,2,phih0_dim,tperph0_id) status=netcdf_def_var(ncid,'qparh0',nf_double,2,phih0_dim,qparh0_id) status=netcdf_def_var(ncid,'qperph0',nf_double,2,phih0_dim,qperph0_id) status=netcdf_def_var(ncid,'veh0',nf_double,2,phih0_dim,veh0_id) status=netcdf_def_var(ncid,'uparph0',nf_double,2,phih0_dim,uparph0_id) status=netcdf_def_var(ncid,'drt',nf_double,2,drt_dim,drt_id) status=netcdf_def_var(ncid,'phirms',nf_double,1,time_dim,phirms_id) status=netcdf_def_var(ncid,'wakx',nf_double,1,time_dim,wakx_id) status=netcdf_def_var(ncid,'waky',nf_double,1,time_dim,waky_id) status=netcdf_def_var(ncid,'wxsp',nf_double,1,time_dim,wxsp_id) status=netcdf_def_var(ncid,'utor',nf_double,1,time_dim,utor_id) status=netcdf_def_var(ncid,'upol',nf_double,1,time_dim,upol_id) status=netcdf_def_var(ncid,'grtmx',nf_double,3,wtif_dim,grtmx_id) status=netcdf_def_var(ncid,'utim',nf_double,4,utim_dim,utim_id) status=netcdf_def_var(ncid,'timf',nf_double,1,timef_dim,timf_id) status=netcdf_def_var(ncid,'avgflag',nf_double,0,0,avgflag_id) status=netcdf_def_var(ncid,'date',nf_char,1,char30_dim,date_id) status=netcdf_def_var(ncid,'note',nf_char,1,char80_dim,note_id) status=netcdf_def_var(ncid,'rmass',nf_double,1,nspec_dim,rmass_id) status=netcdf_def_var(ncid,'charge',nf_double,1,nspec_dim,charge_id) status=netcdf_def_var(ncid,'n_I',nf_double,1,nspec_dim,n_I_id) status=netcdf_def_var(ncid,'Ln',nf_double,1,nspec_dim,Ln_id) status=netcdf_def_var(ncid,'eta',nf_double,1,nspec_dim,eta_id) status=netcdf_def_var(ncid,'eta_par',nf_double,1,nspec_dim,eta_par_id) status=netcdf_def_var(ncid,'tau',nf_double,1,nspec_dim,tau_id) status=netcdf_def_var(ncid,'phisq',nf_double,3,wtif_dim,phisq_id) status=netcdf_def_var(ncid,'fluximn',nf_double,4,fluximn_dim,fluximn_id) status=netcdf_def_var(ncid,'qfluximn',nf_double,4,fluximn_dim,qfluximn_id) status=netcdf_def_var(ncid,'fluxemn',nf_double,3,wtif_dim,fluxemn_id) status=netcdf_def_var(ncid,'qfluxemn',nf_double,3,wtif_dim,qfluxemn_id) status=netcdf_def_var(ncid,'icrit',nf_int,0,0,icrit_id) status=netcdf_def_var(ncid,'ntimf',nf_int,0,0,ntimf_id) status=netcdf_def_var(ncid,'time',nf_double,1,md_dim,time_id) status=netcdf_def_var(ncid,'dt',nf_double,1,md_dim,dt_id) status=netcdf_def_var(ncid,'rkperp2',nf_double,3,lmn_dim,rkperp2_id) status=netcdf_def_var(ncid,'rdiff',nf_double,2,mn_dim,rdiff_id) status=netcdf_def_var(ncid,'chi_int',nf_double,0,0,chi_int_id) ! ?? rdiff and chi_int are defined as netcdf variables, but they ! are never written. If they are, they would probably be of the form: ! status=netcdf_put_vara(ncid,rdiff_id,mn_start,mn_count,rdiff) ! status=netcdf_put_var(ncid,chi_int_id,chi_int) ! add attributes status=netcdf_put_att(ncid, nf_global, 'title','itgc restart data') status=netcdf_put_att(ncid,potential_id,'units','T_i0/e rho_i/L_ne') status=netcdf_put_att(ncid,potential_id,'long_name','Electrostatic Potential') status=netcdf_put_att(ncid,potential_id,'idl_name','!7U!6') status=netcdf_put_att(ncid,density_id,'units','n_0 rho_i/L_ne') status=netcdf_put_att(ncid,density_id,'long_name','Ion Density') status=netcdf_put_att(ncid,density_id,'idl_name','!6n!Di!N') status=netcdf_put_att(ncid,u_par_id,'units','v_ti rho_i/L_ne') status=netcdf_put_att(ncid,u_par_id,'long_name','Ion Parallel Velocity') status=netcdf_put_att(ncid,u_par_id,'idl_name','!6u!D!9#!6!Di!N') status=netcdf_put_att(ncid,t_par_id,'units','T_i0 rho_i/L_ne') status=netcdf_put_att(ncid,t_par_id,'long_name','Ion Parallel Temperature') status=netcdf_put_att(ncid,t_par_id,'idl_name','!6T!D!9#!6!Di!N') status=netcdf_put_att(ncid,t_perp_id,'units','T_i0 rho_i/L_ne') status=netcdf_put_att(ncid,t_perp_id,'long_name','Ion Perpendicular Temperature') status=netcdf_put_att(ncid,t_perp_id,'idl_name','!6T!D!9x!6!Di!N') status=netcdf_put_att(ncid,q_par_id,'units','n_0 m_i v_ti^3 rho_i/L_ne') status=netcdf_put_att(ncid,q_par_id,'long_name','Ion Parallel Heat Flow') status=netcdf_put_att(ncid,q_par_id,'idl_name','!6q!D!9#!6!Di!N') status=netcdf_put_att(ncid,q_perp_id,'units','n_0 m_i v_ti^3 rho_i/L_ne') status=netcdf_put_att(ncid,q_perp_id,'long_name','Ion Perpendicular Heat Flow') status=netcdf_put_att(ncid,q_perp_id,'idl_name','!6q!D!9x!6!Di!N') status=netcdf_put_att(ncid,wpfx_id,'long_name','Ion Heat Flux') status=netcdf_put_att(ncid,fluxi_id,'long_name','Ion Particle Flux') status=netcdf_put_att(ncid,fluxe_id,'long_name','Electron Particle Flux') status=netcdf_put_att(ncid,qfluxe_id,'long_name','Electron Heat Flux') status=netcdf_put_att(ncid,gamx_id,'long_name','Energy Growth Rate') status=netcdf_put_att(ncid,wenx_id,'long_name','Total Energy') status=netcdf_put_att(ncid,ct_id,'long_name','Time correlation of Potential') status=netcdf_put_att(ncid,phirms_id,'long_name','RMS Potential') status=netcdf_put_att(ncid,wakx_id,'long_name','Radial Mode Width') status=netcdf_put_att(ncid,waky_id,'long_name','Poloidal Mode Width') status=netcdf_put_att(ncid,wxsp_id,'long_name','Mode Spread') status=netcdf_put_att(ncid,utor_id,'long_name','Toroidal Flow') status=netcdf_put_att(ncid,upol_id,'long_name','Poloidal Flow') if (beta_e > 0.) then ! EM attributes only for finite beta status=netcdf_put_att(ncid,apar_id,'units','T_i0/e c/v_ti rho_i/L_ne') status=netcdf_put_att(ncid,apar_id,'long_name','Parallel Magnetic Potential') status=netcdf_put_att(ncid,apar_id,'idl_name','!6A!9!D#!N!6') status=netcdf_put_att(ncid,n_e_id,'units','n_0 rho_i/L_ne') status=netcdf_put_att(ncid,n_e_id,'long_name','Electron Density') status=netcdf_put_att(ncid,n_e_id,'idl_name','!6n!De!N') status=netcdf_put_att(ncid,u_e_id,'units','v_ti rho_i/L_ne') status=netcdf_put_att(ncid,u_e_id,'long_name','Electron Parallel Velocity') status=netcdf_put_att(ncid,u_e_id,'idl_name','!6u!D!9#!6!De!N') status=netcdf_put_att(ncid,tpar_e_id,'units','T_i0 rho_i/L_ne') status=netcdf_put_att(ncid,tpar_e_id,'long_name','Electron Parallel Temperature') status=netcdf_put_att(ncid,tpar_e_id,'idl_name','!6T!D!9#!6!De!N') status=netcdf_put_att(ncid,tperp_e_id,'units','T_i0 rho_i/L_ne') status=netcdf_put_att(ncid,tperp_e_id,'long_name','Electron Perpendicular Temperature') status=netcdf_put_att(ncid,tperp_e_id,'idl_name','!6T!D!9x!6!De!N') endif if(serial_io) then call barrier if(proc0) status = nf_close(ncid) ! proc0 closes the netcdf file call barrier ! all processors reopen file: status = nf_open(filename, nf_write, ncid) else call barrier status=nf_enddef(ncid) ! out of definition mode call handle_err(status) call barrier endif !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ! Start to write variables ! ! (For speed, try to write in the same order variables were defined, ! though one exception is that we write serial data first, and then ! parallel data later) ! ! it would be better to send only to proc0, but for now this is ok... do n = m_lo%nl_world, m_lo%nu_world call broadcast(phi00(:,n), proc_id(m_lo, 1, n)) call broadcast(den00(:,n), proc_id(m_lo, 1, n)) call broadcast(upar00(:,n), proc_id(m_lo, 1, n)) call broadcast(tpar00(:,n), proc_id(m_lo, 1, n)) call broadcast(tperp00(:,n), proc_id(m_lo, 1, n)) enddo if(proc0) then status=netcdf_put_var(ncid,ld_id,ld) status=netcdf_put_var(ncid,ldb_id,ldb) status=netcdf_put_var(ncid,kd_id,kd) status=netcdf_put_var(ncid,nmin_id,nmin) status=netcdf_put_var(ncid,nmax_id,nmax) status=netcdf_put_var(ncid,nd_id,nd) status=netcdf_put_var(ncid,lin_id,lin) status=netcdf_put_var(ncid,kdpass_id,kdpass) status=netcdf_put_var(ncid,nstp_id,nstp) status=netcdf_put_var(ncid,ne_id,ne) status=netcdf_put_var(ncid,nfreq_id,nfreq) status=netcdf_put_var(ncid,ntotal_id,ntotal) status=netcdf_put_var(ncid,md_id,md) status=netcdf_put_var(ncid,nspecies_id,nspecies) status=netcdf_put_var(ncid,ikx_id,ikx) status=netcdf_put_var(ncid,iperiod_id,iperiod) status=netcdf_put_var(ncid,nparmom_id,nparmom) status=netcdf_put_var(ncid,nperpmom_id,nperpmom) status=netcdf_put_var(ncid,nemom_id,nemom) status=netcdf_put_var(ncid,iodd_id,iodd) status=netcdf_put_var(ncid,iflr_id,iflr) status=netcdf_put_var(ncid,iphi00_id,iphi00) status=netcdf_put_var(ncid,ifilter_id,ifilter) status=netcdf_put_var(ncid,iexp_id,iexp) status=netcdf_put_var(ncid,igradon_id,igradon) status=netcdf_put_var(ncid,malias_id,malias) status=netcdf_put_var(ncid,nalias_id,nalias) ! new electromagnetic constants status=netcdf_put_var(ncid,semi_imp_id,semi_imp) status=netcdf_put_var(ncid,beta_e_id,beta_e) status=netcdf_put_var(ncid,nuei_id,nuei) status=netcdf_put_var(ncid,inuei_id,inuei) status=netcdf_put_var(ncid,meovmi_id,meovmi) status=netcdf_put_var(ncid,mmin_id,mmin) status=netcdf_put_var(ncid,mmax_id,mmax) status=netcdf_put_var(ncid,tim_id,tim) status=netcdf_put_var(ncid,shr_id,shr) status=netcdf_put_var(ncid,qsf_id,qsf) status=netcdf_put_var(ncid,epsn_id,epsn) status=netcdf_put_var(ncid,eps_id,eps) status=netcdf_put_var(ncid,epse_id,epse) status=netcdf_put_var(ncid,nueeff_id,nueeff) status=netcdf_put_var(ncid,alpha_id,alpha) status=netcdf_put_var(ncid,etai_id,etai) status=netcdf_put_var(ncid,nuii_id,nuii) status=netcdf_put_var(ncid,rmu1_id,rmu1) status=netcdf_put_var(ncid,tiovte_id,tiovte) status=netcdf_put_var(ncid,vy_id,vy) status=netcdf_put_var(ncid,vz_id,vz) status=netcdf_put_var(ncid,rmime_id,rmime) status=netcdf_put_var(ncid,etae_id,etae) status=netcdf_put_var(ncid,dt0_id,dt0) status=netcdf_put_var(ncid,dt1_id,dt1) status=netcdf_put_var(ncid,x0_id,x0) status=netcdf_put_var(ncid,y0_id,y0) status=netcdf_put_var(ncid,z0_id,z0) status=netcdf_put_var(ncid,xp_id,xp) status=netcdf_put_var(ncid,timo_id,timo(nt1)) status=netcdf_put_var(ncid,wpfx_id,wpfx) status=netcdf_put_var(ncid,fluxi_id,fluxi) status=netcdf_put_var(ncid,fluxe_id,fluxe(nt1)) status=netcdf_put_var(ncid,qfluxe_id,qfluxe(nt1)) status=netcdf_put_var(ncid,gamx_id,gamx(nt1)) status=netcdf_put_var(ncid,wenx_id,wenx(nt1)) status=netcdf_put_var(ncid,pcerr_id,pcerr(nt1)) ! Correlation functions not calculated, but zeroes written for ! back-compatibility: status=netcdf_put_var(ncid,cx_id,cx) status=netcdf_put_var(ncid,cy_id,cy) status=netcdf_put_var(ncid,cz_id,cz) status=netcdf_put_var(ncid,czc_id,czc) status=netcdf_put_var(ncid,czcn_id,czcn) status=netcdf_put_var(ncid,czn_id,czn) status=netcdf_put_var(ncid,cznn_id,cznn) status=netcdf_put_var(ncid,ct_id,ct(nt1)) status=netcdf_put_var(ncid,ninterv_id,ninterv) allocate (ri2(2,ne,nd)) call c2r(phi00(nt1:nt2,:), ri2) status=netcdf_put_var(ncid,phi00_id,ri2) call c2r(den00(nt1:nt2,:), ri2) status=netcdf_put_var(ncid,den00_id,ri2) call c2r(upar00(nt1:nt2,:), ri2) status=netcdf_put_var(ncid,upar00_id,ri2) call c2r(tpar00(nt1:nt2,:), ri2) status=netcdf_put_var(ncid,tpar00_id,ri2) call c2r(tperp00(nt1:nt2,:), ri2) status=netcdf_put_var(ncid,tperp00_id,ri2) deallocate (ri2) allocate (ri1(2,ne)) call c2r(phih0(nt1:nt2), ri1) status=netcdf_put_var(ncid,phih0_id,ri1) call c2r(uparh0(nt1:nt2), ri1) status=netcdf_put_var(ncid,uparh0_id,ri1) call c2r(denh0(nt1:nt2), ri1) status=netcdf_put_var(ncid,denh0_id,ri1) call c2r(tparh0(nt1:nt2), ri1) status=netcdf_put_var(ncid,tparh0_id,ri1) call c2r(tperph0(nt1:nt2), ri1) status=netcdf_put_var(ncid,tperph0_id,ri1) call c2r(qparh0(nt1:nt2), ri1) status=netcdf_put_var(ncid,qparh0_id,ri1) call c2r(qperph0(nt1:nt2), ri1) status=netcdf_put_var(ncid,qperph0_id,ri1) call c2r(veh0(nt1:nt2), ri1) status=netcdf_put_var(ncid,veh0_id,ri1) call c2r(uparph0(nt1:nt2), ri1) status=netcdf_put_var(ncid,uparph0_id,ri1) deallocate (ri1) status=netcdf_put_var(ncid,drt_id,drt) status=netcdf_put_var(ncid,phirms_id,phirms(nt1)) status=netcdf_put_var(ncid,wakx_id,wakx(nt1)) status=netcdf_put_var(ncid,waky_id,waky(nt1)) status=netcdf_put_var(ncid,wxsp_id,wxsp(nt1)) status=netcdf_put_var(ncid,utor_id,utor(nt1)) status=netcdf_put_var(ncid,upol_id,upol(nt1)) status=netcdf_put_var(ncid,timf_id,timf(ntf1)) status=netcdf_put_var(ncid,avgflag_id,avgflag) status=netcdf_put_var(ncid,date_id,date) status=netcdf_put_var(ncid,note_id,note) status=netcdf_put_var(ncid,rmass_id,rmass) status=netcdf_put_var(ncid,charge_id,charge) status=netcdf_put_var(ncid,n_I_id,n_I) status=netcdf_put_var(ncid,Ln_id,Ln) status=netcdf_put_var(ncid,eta_id,eta) status=netcdf_put_var(ncid,eta_par_id,eta_par) status=netcdf_put_var(ncid,tau_id,tau) status=netcdf_put_var(ncid,icrit_id,icrit) status=netcdf_put_var(ncid,ntimf_id,ntimf) endif ! end if(proc0) !########################################################################### ! ! Now writing arrays which are distributed among parallel processors mloc = m_high - m_low + 1 nloc = n_high - n_low + 1 ! ploc > 0 only if both mloc and nloc > 0, i.e., only if this processor ! has same data to save ploc = min(mloc, nloc) if(serial_io) then proc_write=proc0 ! only proc0 writes else proc_write=(ploc>0) ! or all proc's with data write endif ! if(ploc > 0) then allocate (ri3(2,ld,m_low2:m_alloc2, n_low2:n_alloc2)) call funnel20(potential, ri3, 1, ld) status=netcdf_put_vara(ncid,potential_id,field_start,field_count,ri3) deallocate (ri3) !!!!!!!!!!!!!!!!!!!!! allocate (ri4(2,ld, m_low2:m_alloc2, n_low2:n_alloc2, nspecies)) call funnel20(density,ri4) if(proc_write) status=netcdf_put_vara(ncid,density_id,ion_start,ion_count,ri4) !!!!!!!!!!!!!!!!!!!!! call funnel20(u_par, ri4) status=netcdf_put_vara(ncid,u_par_id,ion_start,ion_count,ri4) call funnel20(t_par, ri4) status=netcdf_put_vara(ncid,t_par_id,ion_start,ion_count,ri4) call funnel20(t_perp, ri4) status=netcdf_put_vara(ncid,t_perp_id,ion_start,ion_count,ri4) call funnel20(q_par, ri4) status=netcdf_put_vara(ncid,q_par_id,ion_start,ion_count,ri4) call funnel20(q_perp, ri4) status=netcdf_put_vara(ncid,q_perp_id,ion_start,ion_count,ri4) deallocate (ri4) if (epse > 0.0) then allocate (ri3(2,kdpass, m_low2:m_alloc2, n_low2:n_alloc2)) call funnel20(e_density, ri3, 1, kdpass) status=netcdf_put_vara(ncid,e_density_id,e_start,e_count,ri3) call funnel20(e_p, ri3, 1, kdpass) status=netcdf_put_vara(ncid,e_p_id,e_start,e_count,ri3) call funnel20(e_r, ri3, 1, kdpass) status=netcdf_put_vara(ncid,e_r_id,e_start,e_count,ri3) call funnel20(e_t, ri3, 1, kdpass) status=netcdf_put_vara(ncid,e_t_id,e_start,e_count,ri3) call funnel20(phi_ba, ri3, 1, kdpass) status=netcdf_put_vara(ncid,phi_ba_id,e_start,e_count,ri3) deallocate (ri3) allocate (ri3(2, ld, m_low2:m_alloc2, n_low2:n_alloc2)) call funnel20(phi_bk, ri3, 1, ld) status=netcdf_put_vara(ncid,phi_bk_id,field_start,field_count,ri3) call funnel20(e_denk, ri3, 1, ld) status=netcdf_put_vara(ncid,e_denk_id,field_start,field_count,ri3) deallocate (ri3) endif if (beta_e > 0.0) then allocate (ri3(2,ld, m_low2:m_alloc2, n_low2:n_alloc2)) call funnel20(n_e, ri3, 1, ld) status=netcdf_put_vara(ncid,n_e_id,field_start,field_count,ri3) call funnel20(u_e, ri3, 1, ld) status=netcdf_put_vara(ncid,u_e_id,field_start,field_count,ri3) call funnel20(tpar_e, ri3, 1, ld) status=netcdf_put_vara(ncid,tpar_e_id,field_start,field_count,ri3) call funnel20(tperp_e, ri3, 1, ld) status=netcdf_put_vara(ncid,tperp_e_id,field_start,field_count,ri3) call funnel20(apar, ri3, 1, ld) status=netcdf_put_vara(ncid,apar_id,field_start,field_count,ri3) deallocate (ri3) endif allocate (ri2(2,m_low2:m_alloc2, n_low2:n_alloc2)) call funnel20(phiav_old, ri2) status=netcdf_put_vara(ncid,phiav_old_id,av_start,av_count,ri2) deallocate (ri2) allocate(rall3(md, nd, nt1:nt2)) call mfunnel3(mgamx, rall3, nt1, nt2) status=netcdf_put_vara(ncid,mgamx_id,mgamx_start,mgamx_count,rall3) deallocate(rall3) allocate(ri2(nt1:nt2, md, nd)) call funnel20(wtif, ri2, nt1, nt2) status=netcdf_put_vara(ncid,wtif_id,wtif_start,wtif_count,ri2) call funnel20(wkif, ri2, nt1, nt2) status=netcdf_put_vara(ncid,wkif_id,wtif_start,wtif_count,ri2) call funnel20(wpif, ri2, nt1, nt2) status=netcdf_put_vara(ncid,wpif_id,wtif_start,wtif_count,ri2) call funnel20(psp, ri2, nt1, nt2) status=netcdf_put_vara(ncid,psp_id,wtif_start,wtif_count,ri2) call funnel20(wenrk, ri2, nt1, nt2) status=netcdf_put_vara(ncid,wenrk_id,wtif_start,wtif_count,ri2) call funnel20(dketa, ri2, nt1, nt2) status=netcdf_put_vara(ncid,dketa_id,wtif_start,wtif_count,ri2) call funnel20(dkpar, ri2, nt1, nt2) status=netcdf_put_vara(ncid,dkpar_id,wtif_start,wtif_count,ri2) call funnel20(dktor, ri2, nt1, nt2) status=netcdf_put_vara(ncid,dktor_id,wtif_start,wtif_count,ri2) call funnel20(dktdp, ri2, nt1, nt2) status=netcdf_put_vara(ncid,dktdp_id,wtif_start,wtif_count,ri2) call funnel20(wkups, ri2, nt1, nt2) status=netcdf_put_vara(ncid,wkups_id,wtif_start,wtif_count,ri2) call funnel20(dktot, ri2, nt1, nt2) status=netcdf_put_vara(ncid,dktot_id,wtif_start,wtif_count,ri2) call funnel20(grtmx, ri2, nt1, nt2) status=netcdf_put_vara(ncid,grtmx_id,wtif_start,wtif_count,ri2) allocate (ri3(2, ntotal, m_low2:m_alloc2, n_low2:n_alloc2)) call funnel20(utim, ri3, ntf1, ntf2) status=netcdf_put_vara(ncid,utim_id,utim_start,utim_count,ri3) deallocate (ri3) call funnel20(phisq, ri2, nt1, nt2) status=netcdf_put_vara(ncid,phisq_id,wtif_start,wtif_count,ri2) deallocate(ri2) allocate(ri3(nt1:nt2, md, nd, nspecies)) call funnel20(fluximn, ri3, nt1, nt2) status=netcdf_put_vara(ncid,fluximn_id,fluximn_start,fluximn_count,ri3) call funnel20(qfluximn, ri3, nt1, nt2) status=netcdf_put_vara(ncid,qfluximn_id,fluximn_start,fluximn_count,ri3) deallocate(ri3) if(epse > 0. .or. beta_e > 0.) then allocate(ri2(nt1:nt2, md, nd)) call funnel20(fluxemn, ri2, nt1, nt2) status=netcdf_put_vara(ncid,fluxemn_id,wtif_start,wtif_count,ri2) call funnel20(qfluxemn, ri2, nt1, nt2) status=netcdf_put_vara(ncid,qfluxemn_id,wtif_start,wtif_count,ri2) deallocate(ri2) endif allocate(rall1(m_low2:m_alloc2)) call funnel20(time,rall1) status=netcdf_put_vara(ncid,time_id,t_start, t_count, rall1) call funnel20(dt,rall1) status=netcdf_put_vara(ncid,dt_id, t_start, t_count, rall1) deallocate(rall1) allocate(rall3(ld,m_low2:m_alloc2,n_low2:n_alloc2)) call funnel20(rkperp2, rall3, 1, ld) status=netcdf_put_vara(ncid,rkperp2_id,lmn_start,lmn_count,rall3) deallocate(rall3) ! endif ! end if(ploc > 0) call barrier ! Needed for parallel i/o status = nf_close(ncid) ! close the netcdf file call barrier ! Needed for parallel i/o if(status /= nf_noerr .and. proc0) write(*,*) nf_strerror(status) end subroutine wpunchnc end module io_netcdf