!> @file ! !> SUBPROGRAM: SERVER PERFORMS IO TO DISK !! PRGRMMR: TUCCILLO ORG: IBM !! !! THIS ROUTINE RECEIVES DATA FROM TASK 0 OF MPI_COMM_INTER, !! THE FIRST TASK PERFORMING THE POST_PROCESSING, AND WRITES !! THE DATA TO DISK !! !! PROGRAM HISTORY LOG: !! 01-06-15 TUCCILLO - ORIGINAL !! !! USAGE: CALL SERVER !! INPUT ARGUMENT LIST: !! NONE !! !! OUTPUT ARGUMENT LIST: !! NONE !! !! OUTPUT FILES: !! WRITES TO FILE FNAME !! !! SUBPROGRAMS CALLED: !! MPI_RECV !! BAOPEN !! BACIO !! UTILITIES: !! NONE !! LIBRARY: !! COMMON - CTLBLK.comm !! !! ATTRIBUTES: !! LANGUAGE: FORTRAN !! MACHINE : IBM RS/6000 SP !! SUBROUTINE SERVER ! use CTLBLK_mod, only: mpi_comm_inter !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - implicit none ! INCLUDE 'mpif.h' ! LOGICAL :: DONE, NEWFILE INTEGER :: STATUS(MPI_STATUS_SIZE) INTEGER :: IERR, COUNT, LUN,IER CHARACTER*255 :: FNAME CHARACTER*1, ALLOCATABLE :: BUF(:) ! !--------------------------------------------------------------------- ! ! THIS CODE IS EXPECTING THE FOLLOWING MESSAGE STRUCTURE ! ! VARIABLE TYPE DESCRIPTION TAG !===================================================== ! DONE LOGICAL ARE WE DONE? 1 ! NEWFILE LOGICAL OPEN THE FILE? 2 ! LUN INTEGER FORTRAN UNIT # 3 ! FNAME CHARACTER*255 FILE NAME 4 ! BUF CHARACTER*1(*) BURF RECORD 5 ! !--------------------------------------------------------------------- ! PRINT *, ' STARTING UP IO SERVER ...' do while (.not. DONE) ! ! THE FIRST MESSAGE IS A LOGICAL TO TELL US WHETHER WE ARE ! FINISHED OR NOT ! CALL MPI_RECV(DONE,1,MPI_LOGICAL, & 0,1,MPI_COMM_INTER,STATUS,IERR) ! IF ( DONE ) THEN PRINT *, ' SHUTTING DOWN IO SERVER ...' RETURN ! RETURNING TO MAIN END IF ! ! DO WE NEED TO OPEN THE FILE ? ! CALL MPI_RECV(NEWFILE,1,MPI_LOGICAL, & 0,2,MPI_COMM_INTER,STATUS,IERR) ! ! FORTRAN UNIT NUMBER ! CALL MPI_RECV(LUN,1,MPI_INTEGER, & 0,3,MPI_COMM_INTER,STATUS,IERR) ! ! FILENAME ! CALL MPI_RECV(FNAME,255,MPI_CHARACTER, & 0,4,MPI_COMM_INTER,STATUS,IERR) ! ! OPEN THE FILE, IF NECESSARY ! IF ( NEWFILE ) THEN CLOSE(LUN) CALL BAOPENWT(LUN,FNAME,IER) PRINT *, ' FILE ',FNAME,' OPENED AS UNIT ',LUN END IF ! ! DETERMINE THE SIZE OF THE BUFR RECORD AND ALLOCATE A BUFFER FOR IT ! CALL MPI_PROBE(0,5,MPI_COMM_INTER,STATUS,IERR) CALL MPI_GET_COUNT(STATUS,MPI_CHARACTER,COUNT,IERR) ALLOCATE( BUF( COUNT ) ) ! ! FINALLY, GET THE BUFR RECORD ! CALL MPI_RECV(BUF,COUNT,MPI_CHARACTER, & 0,5,MPI_COMM_INTER,STATUS,IERR) ! ! OUT TO DISK WE GO ... ! CALL WRYTE(LUN,COUNT,BUF) DEALLOCATE(BUF) enddo !end do while loop END