silo_obj_NewTimeStep Subroutine

private impure subroutine silo_obj_NewTimeStep(this, time)

Creates a new Silo virtual data base (VDB) for this timestep.

Type Bound

silo_obj

Arguments

Type IntentOptional Attributes Name
class(silo_obj), intent(inout) :: this

A silo object

real(kind=wp), intent(in) :: time

Time value for this time step


Calls

proc~~silo_obj_newtimestep~~CallsGraph proc~silo_obj_newtimestep silo_obj%silo_obj_NewTimeStep dbcreate dbcreate proc~silo_obj_newtimestep->dbcreate dbset2dstrlen dbset2dstrlen proc~silo_obj_newtimestep->dbset2dstrlen mpi_barrier mpi_barrier proc~silo_obj_newtimestep->mpi_barrier proc~parallel_obj_rankisroot parallel_obj%parallel_obj_RankIsRoot proc~silo_obj_newtimestep->proc~parallel_obj_rankisroot proc~silo_obj_setupgroupfiles silo_obj%silo_obj_SetupGroupFiles proc~silo_obj_newtimestep->proc~silo_obj_setupgroupfiles proc~sysutils_obj_createdirectory sysutils_obj%sysutils_obj_CreateDirectory proc~silo_obj_newtimestep->proc~sysutils_obj_createdirectory proc~silo_obj_setupgroupfiles->dbcreate proc~silo_obj_setupgroupfiles->mpi_barrier dbclose dbclose proc~silo_obj_setupgroupfiles->dbclose dbmkdir dbmkdir proc~silo_obj_setupgroupfiles->dbmkdir mpi_comm_size mpi_comm_size proc~silo_obj_setupgroupfiles->mpi_comm_size

Called by

proc~~silo_obj_newtimestep~~CalledByGraph proc~silo_obj_newtimestep silo_obj%silo_obj_NewTimeStep proc~eulerian_set_writesilo eulerian_set%eulerian_set_WriteSILO proc~eulerian_set_writesilo->proc~silo_obj_newtimestep proc~particle_set_writesilo particle_set%particle_set_WriteSilo proc~particle_set_writesilo->proc~silo_obj_newtimestep proc~respart_set_writesilo ResPart_set%ResPart_set_WriteSILO proc~respart_set_writesilo->proc~silo_obj_newtimestep proc~cdifs_obj_writeoutputdata cdifs_obj_WriteOutputData proc~cdifs_obj_writeoutputdata->proc~respart_set_writesilo proc~grans_obj_writeoutputdata grans_obj_WriteOutputData proc~grans_obj_writeoutputdata->proc~respart_set_writesilo interface~cdifs_obj_writeoutputdata cdifs_obj%cdifs_obj_WriteOutputData interface~cdifs_obj_writeoutputdata->proc~cdifs_obj_writeoutputdata interface~grans_obj_writeoutputdata grans_obj%grans_obj_WriteOutputData interface~grans_obj_writeoutputdata->proc~grans_obj_writeoutputdata proc~cdifs_obj_preparesolver cdifs_obj_PrepareSolver proc~cdifs_obj_preparesolver->interface~cdifs_obj_writeoutputdata proc~grans_obj_preparesolver grans_obj_PrepareSolver proc~grans_obj_preparesolver->interface~grans_obj_writeoutputdata interface~cdifs_obj_preparesolver cdifs_obj%cdifs_obj_PrepareSolver interface~cdifs_obj_preparesolver->proc~cdifs_obj_preparesolver interface~grans_obj_preparesolver grans_obj%grans_obj_PrepareSolver interface~grans_obj_preparesolver->proc~grans_obj_preparesolver

Source Code

    impure subroutine silo_obj_NewTimeStep(this,time)
      !> Creates a new Silo virtual data base (VDB) for this timestep.
      implicit none
      class(silo_obj),  intent(inout) :: this                                  !! A silo object
      real(wp),         intent(in)    :: time                                  !! Time value for this time step
      ! Work variables
      integer             :: ierr
      type(sysutils_obj)  :: sysutils
      character(SILOstr)  :: record
      character(len=str64):: timestr
      logical             :: finished
      real(wp)            :: my_time

      ! Convert time to string in scientific notation
      write(timestr, fmt='(ES12.5)') time

      ! Remove leading space
      timestr = trim(adjustl(timestr(2:)))

      ! Append new timestep to Visit file
      if (this%parallel%RankIsRoot()) then
        ! Skip existing older time steps
        finished=.false.
        do while (.not.finished)
          read(this%fid_VisIt,fmt='(a)',iostat=ierr) record
          if (ierr.ne.0) then
            finished=.true.
            backspace(this%fid_VisIt)
          else
            read(record(6:17),*) my_time
            if (my_time.ge.time) then
              finished=.true.
              backspace(this%fid_VisIt)
            end if
          end if
        end do
        ! Add timestep
        write(this%fid_VisIt,fmt='(6a)') 'time_',trim(adjustl(timestr)),'/',trim(adjustl(this%filename)),SILO_EXTENSION
      end if

      ! Create Silo directory for this timestep
      write(this%filepath,fmt='(4a)') SILOdir,'/time_',trim(adjustl(timestr)),'/'

      ! Set name of VDB file
      this%vdbname=trim(adjustl(this%filepath))//trim(adjustl(this%filename))//SILO_EXTENSION

      ! MPI root creates the VDB file
      if (this%parallel%RankIsRoot()) then

        ! Create new folder for this time step
        call sysutils%CreateDirectory(trim(adjustl(this%filepath)))

        ! Create the VDB file
        ierr = DBcreate(this%vdbname,len_trim(this%vdbname),DB_CLOBBER,DB_LOCAL, &
               SILOinfo,len_trim(SILOinfo),SILOdriver,this%fid_VDB)
        if (this%fid_VDB.eq.-1) call this%parallel%Stop('Unable to create SILO file')

        ! Set length of names
        ierr= DBset2dstrlen(SILOstr)
      end if

      ! Synchronize
      call MPI_BARRIER(this%parallel%comm%g)

      ! Create group files
      call this%SetupGroupFiles(this%access_flag)

      return
    end subroutine silo_obj_NewTimeStep