Hi all,
I am wondering if there is an option to save float output in several files? Just like the existing option for history files (NDEFHIS) and others. 
This would be very useful for long simulations with many particles. 
Regards,
Mari
			
			
									
									
						Option for float output file
- arango
 - Site Admin
 - Posts: 1394
 - Joined: Wed Feb 26, 2003 4:41 pm
 - Location: DMCS, Rutgers University
 - Contact:
 
Re: Option for float output file
No, this is in my to do list for future releases. I assume that you are deploying millions of floats.  The floats NetCDF is never that big to require splitting in my applications.  The problem with the splitting the float files is that it makes the plotting of the trajectories trickier.
			
			
									
									
						Re: Option for float output file
I looked into splitting the fish output file, which is similar to the floats output file. One thing that's tricky is the restart. Presumably you want to read the float locations from the last record of the last file. I'll attach the fishy output.F for you to look at.
			
							- Attachments
 - 
			
		
		
				
 output.F- Fish version of output.F
 - (23.36 KiB) Downloaded 1423 times
 
 
Re: Option for float output file
Currently I am deploying about 500.000 particles. I will probably increase this number when it is possible to split up the float file, which I will be looking forward to!
Thank you Kate, I will take a closer look at your output.F.
Mari
			
			
									
									
						Thank you Kate, I will take a closer look at your output.F.
Mari
- 
				stone
 
Re: Option for float output file
Hi, I came across the same problem as Mari met. I follow Kate's suggestion to split float trajectory. And finally it works.  Hope it can help rookies like me.
This is what I did.
			
			
									
									
						This is what I did.
Code: Select all
In Nonlinear/output.F
ifdef FLOATS  
!
!-----------------------------------------------------------------------
!  If appropriate, process floats NetCDF file.
!-----------------------------------------------------------------------
!
# ifdef MARGINAL_FT
      IF (Nfloats(ng).gt.0.and.(nFLT(ng).gt.0)) THEN
!
!  Create output floats NetCDF file or prepare existing file
!  to append new data to it. Also, notice that it is possible to
!  create several files during a single model run.
!
        IF (LdefFLT(ng)) THEN
          IF (ndefFLT(ng).gt.0) THEN
            IF (idefFLT(ng).lt.0) THEN
              idefFLT(ng)=((ntstart(ng)-1)/ndefFLT(ng))*ndefFLT(ng)
              IF ((ndefFLT(ng).eq.nFLT(ng)).and.                       &
     &                      (idefFLT(ng).le.0)) THEN
                idefFLT(ng)=ndefFLT(ng)         ! one file per record
              ELSE IF (idefFLT(ng).lt.iic(ng)-1) THEN
                idefFLT(ng)=idefFLT(ng)+ndefFLT(ng)
              END IF
            END IF
            IF (ndefFLT(ng).eq.nFLT(ng)) THEN
              ifile=(iic(ng)-1)/ndefFLT(ng)
            ELSE
              ifile=(iic(ng)-1)/ndefFLT(ng)+1
            END IF
!
!  Restart case
!  First, let's check if we need to read from the old file.
!
            IF ((nrrec(ng).ne.0).and.(iic(ng).eq.ntstart(ng))) THEN
              NewFile=.FALSE.
              Ldefine=.TRUE.                  
              IF ((iic(ng)-1).eq.idefFLT(ng)) THEN
                ifile=(iic(ng)-1)/ndefFLT(ng)
              END IF
              idefFLT(ng)=idefFLT(ng)+nFLT(ng)  ! restart offset
            ELSE IF ((iic(ng)-1).eq.idefFLT(ng)) THEN
              idefFLT(ng)=idefFLT(ng)+ndefFLT(ng)
              IF (nFLT(ng).ne.ndefFLT(ng).and.iic(ng).eq.ntstart(ng)) THEN
                idefFLT(ng)=idefFLT(ng)+nFLT(ng)
              END IF
              Ldefine=.TRUE.
              Newfile=.TRUE.
            ELSE
              Ldefine=.FALSE.
            END IF
            IF (Ldefine) THEN
              NrecFLT(ng)=0
              IF (Master) THEN
                lstr=LEN_TRIM(FLTbase(ng))
                WRITE (FLTname(ng),60) FLTbase(ng)(1:lstr-3),ifile
  60            FORMAT (a,'_',i4.4,'.nc')
              END IF
# ifdef DISTRIBUTE
              CALL mp_bcasts (ng, iNLM, FLTname(ng))
# endif
              IF (ncFLTid(ng).ne.-1) THEN
                CALL netcdf_close (ng, iNLM, ncFLTid(ng))
              END IF
              CALL def_floats (ng, Newfile)
              IF (exit_flag.ne.NoError) RETURN
              LwrtFLT(ng)=.TRUE.
            END IF
          ELSE
            IF (iic(ng).eq.ntstart(ng)) THEN
              CALL def_floats (ng, ldefout(ng))
              IF (exit_flag.ne.NoError) RETURN
              LwrtFLT(ng)=.TRUE.
              LdefFLT(ng)=.FALSE.
            END IF
          END IF
        END IF
!
!  Write out data into FLT NetCDF file.
!
        IF ((MOD(iic(ng)-1,nFLT(ng)).eq.0).and.                      &
     &      ((frrec(ng).eq.0).or.(iic(ng).ne.ntstart(ng)))) THEN
          CALL wrt_floats (ng)
          IF (exit_flag.ne.NoError) RETURN
        END IF
      END IF
# else    
      IF (Lfloats(ng).and.                                              &
     &    (Nfloats(ng).gt.0).and.(nFLT(ng).gt.0)) THEN
!
!  Create output floats NetCDF file or prepare existing file to
!  append new data to it.
!
        IF (LdefFLT(ng)) THEN
          IF (frrec(ng).eq.0) THEN
            NewFile=.TRUE.
          ELSE
            NewFile=.FALSE.
          END IF
          CALL def_floats (ng, NewFile)
          IF (exit_flag.ne.NoError) RETURN
          LdefFLT(ng)=.FALSE.
        END IF
!
!  Write out data into floats NetCDF file.
!
        IF ((MOD(iic(ng)-1,nFLT(ng)).eq.0).and.                         &
     &      ((frrec(ng).eq.0).or.(iic(ng).ne.ntstart(ng)))) THEN
          CALL wrt_floats (ng)
          IF (exit_flag.ne.NoError) RETURN
        END IF
      END IF
# endif    ! marginal
# endif    ! floats
In Utility/inp_par.F
ifdef MARGINAL_FT
          ELSE IF (TRIM(KeyWord).eq.'NDEFFLT') THEN
            Npts=load_i(Nval, Rval, Ngrids, ndefFLT)
# endif
          ELSE IF (TRIM(KeyWord).eq.'FLTNAME') THEN
            DO i=1,LEN(FLTname(Nval))
              FLTname(Nval)(i:i)=blank
# ifdef MARGINAL_FT
              FLTbase(Nval)(i:i)=blank
# endif
            END DO
            FLTname(Nval)=TRIM(ADJUSTL(Cval(Nval)))
# ifdef MARGINAL_FT
            FLTbase(Nval)=TRIM(ADJUSTL(FLTname(Nval)))
# endif
In mod_iounits.F
# ifdef MARGINAL_FT
        character (len=256), dimension(Ngrids) :: FLTbase
# endif
In mod_ncparam.F
# ifdef MARGINAL_FT
        integer  :: idefFLT(Ngrids)     ! history file creation flag
# endif
# ifdef MARGINAL_FT
          idefFLT(ng)=-1
# endif
In mod_scalars.F
# ifdef MARGINAL_FT
        logical, dimension(Ngrids) :: LwrtFLT    ! Write history file
# endif
# ifdef MARGINAL_FT
        integer, dimension(Ngrids) :: ndefFLT    ! History file
# endif
# ifdef MARGINAL_FT
        LwrtFLT(ng)=.FALSE.
# endif