!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer, | intent(in) | :: | timeid |
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