MPI_IO_Write Subroutine

public subroutine MPI_IO_Write(timeid)

Uses

  • proc~~mpi_io_write~~UsesGraph proc~mpi_io_write MPI_IO_Write module~mpimod mpimod proc~mpi_io_write->module~mpimod module~config config module~mpimod->module~config mpi mpi module~mpimod->mpi

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: timeid

Calls

proc~~mpi_io_write~~CallsGraph proc~mpi_io_write MPI_IO_Write mpi_comm_split mpi_comm_split proc~mpi_io_write->mpi_comm_split mpi_file_close mpi_file_close proc~mpi_io_write->mpi_file_close mpi_file_open mpi_file_open proc~mpi_io_write->mpi_file_open mpi_file_set_view mpi_file_set_view proc~mpi_io_write->mpi_file_set_view mpi_file_write_all mpi_file_write_all proc~mpi_io_write->mpi_file_write_all mpi_type_commit mpi_type_commit proc~mpi_io_write->mpi_type_commit mpi_type_create_subarray mpi_type_create_subarray proc~mpi_io_write->mpi_type_create_subarray

Called by

proc~~mpi_io_write~~CalledByGraph proc~mpi_io_write MPI_IO_Write proc~output Output proc~output->proc~mpi_io_write

Source Code

  subroutine MPI_IO_Write(timeid)
    use mpimod
    implicit NONE
    integer,intent(in) :: timeid
    integer :: i, j, k, l, m, n

    integer::iss,jss,kss
    integer::iee,jee,kee
    integer::itot,jtot,ktot
      
    integer strtoi 
    character(len=40)::usrfile
    character(len=30) :: fpathbin,fpathunf
    integer,save:: unitd3d,unitg1d, unitg2d, unitg3d, unitg0d
    data unitd3d / 512 /
    data unitg1d / 513 /
    data unitg2d / 514 /
    data unitg3d / 515 /
    data unitg0d / 516 /

    logical :: fileflag

    logical,save :: is_inited
    data is_inited / .false. /
    
    integer,dimension(4)::Asize,Ssize,Start
    integer(kind=MPI_OFFSET_KIND) idisp
    data idisp / 0 /

    integer::color,key
    
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! 1D GRID PREPARE
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!    
    init1D: if(.not. is_inited )then
       Asize(2) = nvarg
       Ssize(2) = nvarg
       Start(2) = 0
       
       Asize(1) = ntotal(1)+1 ! total izones + edge
       Ssize(1) = npart(1) ! izones in 1 process
       if(coords(1) .eq. ntiles(1)-1)Ssize(1)=Ssize(1)+1  ! + edge
       Start(1) = npart(1) * coords(1)
              
       call MPI_TYPE_CREATE_SUBARRAY( &
     & 2, & ! dimension of array
     & Asize,Ssize,Start, &
     & MPI_ORDER_FORTRAN, &
     & MPI_DOUBLE_PRECISION,& 
     & SAG1D, &! Data type of Subarray for Grid 1D
     & ierr)
       
       call MPI_TYPE_COMMIT(SAG1D,ierr)

      color =  coords(2)*ntiles(3)+coords(3)
      key   =  coords(1)
      call MPI_COMM_SPLIT(comm3d,color,key,commG1D,ierr)
      
      color1D: if(color == 0) then
      write(usrfile,"(A)") filegrid1D
      fpathbin = trim(datadir)//usrfile
      call MPI_FILE_OPEN(commG1D, &
     &                         fpathbin, &  ! file path
     &  MPI_MODE_WRONLY+MPI_MODE_CREATE, &
     &            MPI_INFO_NULL,unitg1d,ierr)

      call MPI_FILE_SET_VIEW( &
     &   unitg1d, &! file path
     &     idisp, &! 
     & MPI_DOUBLE_PRECISION, & 
     &     SAG1D, &! data type
     & 'NATIVE', MPI_INFO_NULL,ierr)

      call MPI_FILE_WRITE_ALL( &
     &   unitg1d, &  ! file path
     &     gridX, &  ! the data
     & Ssize(2)*Ssize(1), &! total data number
     & MPI_DOUBLE_PRECISION, & 
     & mpi_status_ignore, &
     & ierr)
      call MPI_FILE_CLOSE(unitg1d,ierr)
      endif color1D
   
   endif init1D
!   print *, "p2"
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! 2D GRID PREPARE
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

   init2D: if(.not. is_inited )then
      Asize(2) = nvarg
      Ssize(2) = nvarg
      Start(2) = 0
      
      Asize(1) = ntotal(2)+1 ! total jzones + edge
      Ssize(1) = npart(2)    ! jzones in 1 process
      if(coords(2) .eq. ntiles(2)-1)Ssize(1)=Ssize(1)+1  ! + edge
      Start(1) = npart(2) * coords(2)
      call MPI_TYPE_CREATE_SUBARRAY(&
     & 2, & ! dimension of array
     & Asize,Ssize,Start,&
     & MPI_ORDER_FORTRAN,&
     & MPI_DOUBLE_PRECISION,&
     & SAG2D, &! Data type of Subarray for Grid 2D
     & ierr)
      call MPI_TYPE_COMMIT(SAG2D,ierr)
         
      color =  coords(3)*ntiles(1)+coords(1)
      key   =  coords(2)
      call MPI_COMM_SPLIT(comm3d,color,key,commG2D,ierr)
      
      color2D: if(color == 0) then
      write(usrfile,"(A)") filegrid2D
      fpathbin = trim(datadir)//usrfile
 
      call MPI_FILE_OPEN(commG2D, &
     &                         fpathbin, & ! file path
     &  MPI_MODE_WRONLY+MPI_MODE_CREATE, &
     &            MPI_INFO_NULL,unitg2d,ierr)
      call MPI_FILE_SET_VIEW(&
     &   unitg2d, & ! file ID
     &     idisp, & ! 
     & MPI_DOUBLE_PRECISION,&
     &     SAG2D, & ! data type
     & 'NATIVE', MPI_INFO_NULL,ierr)

      call MPI_FILE_WRITE_ALL( &
     &   unitg2d,  &! file ID
     &     gridY,  &! the data
     & Ssize(2)*Ssize(1),& ! total data number
     & MPI_DOUBLE_PRECISION,&
     & mpi_status_ignore,&
     & ierr)
      call MPI_FILE_CLOSE(unitg2d,ierr)
     endif color2D
   endif init2D
      
   init3D: if(.not. is_inited )then
      Asize(1) = ntotal(3)+1  ! total kzones+edge
      Ssize(1) = npart(3) ! kzones in 1 process

      Asize(2) = nvarg
      Ssize(2) = nvarg
      Start(2) = 0
      
      if(coords(3) .eq. ntiles(3)-1)Ssize(1)=Ssize(1)+1  ! + edge
      Start(1) = npart(3) * coords(3)
      call MPI_TYPE_CREATE_SUBARRAY(&
     & 2, & ! dimension of array
     & Asize,Ssize,Start, &
     & MPI_ORDER_FORTRAN, &
     & MPI_DOUBLE_PRECISION,&
     & SAG3D, &! Data type of Subarray for Grid 3D
     & ierr)
         call MPI_TYPE_COMMIT(SAG3D,ierr)

      color =  coords(1)*ntiles(2)+coords(2)
      key   =  coords(3)
      call MPI_COMM_SPLIT(comm3d,color,key,commG3D,ierr)
      color3D: if (color == 0) then
      write(usrfile,"(A)") filegrid3D
      fpathbin = trim(datadir)//usrfile
      
      call MPI_FILE_OPEN(commG3D,&
     &                         fpathbin,&  ! file path
     &  MPI_MODE_WRONLY+MPI_MODE_CREATE,&
     &            MPI_INFO_NULL,unitg3d,ierr)
      call MPI_FILE_SET_VIEW(&
     &  unitg3d, &  ! file path
     &    idisp, &  ! 
     & MPI_DOUBLE_PRECISION, &
     &     SAG3D, & ! data type
     & 'NATIVE', MPI_INFO_NULL,ierr)

      call MPI_FILE_WRITE_ALL(&
     &  unitg3d, & ! file path
     &    gridZ, & ! the data
     & Ssize(2)*Ssize(1),& ! total data number
     & MPI_DOUBLE_PRECISION, &
     & mpi_status_ignore, &
     & ierr)
      call MPI_FILE_CLOSE(unitg3d,ierr)
      endif color3D
   endif init3D
          
    initdata: if(.not. is_inited )then
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! DATA PREPARE
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
       Asize(1) = ntotal(1) ! total zones for 1D 
       Asize(2) = ntotal(2) ! total zones for 2D
       Asize(3) = ntotal(3) ! total zones for 3D
       Ssize(1) =  npart(1) ! partial zones in 1 process 
       Ssize(2) =  npart(2) ! partial zones in 1 process 
       Ssize(3) =  npart(3) ! partial zones in 1 process 
       Start(1) =  npart(1) * coords(1)
       Start(2) =  npart(2) * coords(2)
       Start(3) =  npart(3) * coords(3)
       
       Asize(4) = nvars
       Ssize(4) = nvars
       Start(4) = 0 

       call MPI_TYPE_CREATE_SUBARRAY(&
     & 4, &! dimension of array
     & Asize,Ssize,Start,&
     & MPI_ORDER_FORTRAN,&
     & MPI_DOUBLE_PRECISION,&
     & SAD3D,& ! Data type of Subarray for data 3D
     & ierr)
       call MPI_TYPE_COMMIT(SAD3D,ierr)

    endif initdata
      
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! DATA WRITE
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    write(usrfile,"(A,i5.5,A)") trim(filefield),timeid,trim(binaryextension)
    fpathbin = trim(datadir)//usrfile
    
      call MPI_FILE_OPEN(MPI_COMM_WORLD, &
     &                         fpathbin, & ! file path
     &  MPI_MODE_WRONLY+MPI_MODE_CREATE, &
     &            MPI_INFO_NULL,unitd3d,ierr)
      call MPI_FILE_SET_VIEW(&
     &  unitd3d,  &! file path
     &     idisp, & ! 
     & MPI_DOUBLE_PRECISION,& 
     &     SAD3D, & ! data type
     & 'NATIVE', MPI_INFO_NULL,ierr)

      call MPI_FILE_WRITE_ALL(&
     &   unitd3d,  &! file path
     &    data3D,  &! the data
     & npart(1)*npart(2)*npart(3)*nvars,& ! total data number
     & MPI_DOUBLE_PRECISION,&  
     & mpi_status_ignore,&
     &      ierr)
      call MPI_FILE_CLOSE(unitd3d,ierr)
      
      is_inited = .true.

      return
  end subroutine MPI_IO_Write