Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- PROGRAM DAY7
- USE MPI
- INTEGER :: I,N,IERR
- INTEGER(8) :: A,B,C,D,E,PART1,PART2,RES,INIT
- CHARACTER(LEN=1) CHAR
- INTEGER, ALLOCATABLE :: PROG(:)
- INTEGER :: IERROR, NPROC, ICOMM, IRANK, INTERCOMM,ERRCODES(5)
- LOGICAL :: AMROOT
- INTEGER :: STATUS(MPI_STATUS_SIZE)
- CALL MPI_INIT(IERROR)
- ICOMM = MPI_COMM_WORLD
- CALL MPI_COMM_SIZE(ICOMM,NPROC,IERROR)
- CALL MPI_COMM_RANK(ICOMM, IRANK, IERROR)
- CALL MPI_COMM_SPAWN("./intcode",MPI_ARGV_NULL,5,MPI_INFO_NULL,0,ICOMM,INTERCOMM,ERRCODES,IERROR)
- OPEN(1,FILE="input.txt")
- N=1
- DO
- READ(1,'(A1)',IOSTAT=IERR,ADVANCE="NO")CHAR
- IF(IERR.NE.0)EXIT
- IF(CHAR.EQ.",")N=N+1
- END DO
- REWIND(1)
- ALLOCATE(PROG(0:N-1))
- READ(1,*)PROG
- DO I=0,4
- CALL MPI_SEND(N,1,MPI_INTEGER,I,0,INTERCOMM,IERROR)
- CALL MPI_SEND(PROG,N,MPI_INTEGER,I,1,INTERCOMM,IERROR)
- END DO
- INIT=0
- PART1=0
- DO A=0,4
- DO B=0,4
- IF(B.EQ.A)CYCLE
- DO C=0,4
- IF(ANY((/A,B/).EQ.C))CYCLE
- DO D=0,4
- IF(ANY((/A,B,C/).EQ.D))CYCLE
- DO E=0,4
- IF(ANY((/A,B,C,D/).EQ.E))CYCLE
- CALL MPI_SEND(A,1,MPI_DOUBLE_PRECISION,0,2,INTERCOMM,IERROR)
- CALL MPI_SEND(INIT,1,MPI_DOUBLE_PRECISION,0,3,INTERCOMM,IERROR)
- CALL MPI_SEND(B,1,MPI_DOUBLE_PRECISION,1,2,INTERCOMM,IERROR)
- CALL MPI_SEND(C,1,MPI_DOUBLE_PRECISION,2,2,INTERCOMM,IERROR)
- CALL MPI_SEND(D,1,MPI_DOUBLE_PRECISION,3,2,INTERCOMM,IERROR)
- CALL MPI_SEND(E,1,MPI_DOUBLE_PRECISION,4,2,INTERCOMM,IERROR)
- CALL MPI_RECV(RES,1,MPI_DOUBLE_PRECISION,0,999,INTERCOMM,STATUS,IERROR)
- PART1=MAX(PART1,RES)
- END DO
- END DO
- END DO
- END DO
- END DO
- PART2=0
- DO A=5,9
- DO B=5,9
- IF(B.EQ.A)CYCLE
- DO C=5,9
- IF(ANY((/A,B/).EQ.C))CYCLE
- DO D=5,9
- IF(ANY((/A,B,C/).EQ.D))CYCLE
- DO E=5,9
- IF(ANY((/A,B,C,D/).EQ.E))CYCLE
- CALL MPI_SEND(A,1,MPI_DOUBLE_PRECISION,0,2,INTERCOMM,IERROR)
- CALL MPI_SEND(INIT,1,MPI_DOUBLE_PRECISION,0,3,INTERCOMM,IERROR)
- CALL MPI_SEND(B,1,MPI_DOUBLE_PRECISION,1,2,INTERCOMM,IERROR)
- CALL MPI_SEND(C,1,MPI_DOUBLE_PRECISION,2,2,INTERCOMM,IERROR)
- CALL MPI_SEND(D,1,MPI_DOUBLE_PRECISION,3,2,INTERCOMM,IERROR)
- CALL MPI_SEND(E,1,MPI_DOUBLE_PRECISION,4,2,INTERCOMM,IERROR)
- CALL MPI_RECV(RES,1,MPI_DOUBLE_PRECISION,0,999,INTERCOMM,STATUS,IERROR)
- PART2=MAX(PART2,RES)
- END DO
- END DO
- END DO
- END DO
- END DO
- WRITE(*,'("Part 1: ",I0)') PART1
- WRITE(*,'("Part 2: ",I0)') PART2
- DO I=0,4
- CALL MPI_SEND(-1,1,MPI_DOUBLE_PRECISION,I,2,INTERCOMM,IERROR)
- END DO
- CALL MPI_FINALIZE(IERROR)
- END PROGRAM DAY7
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement