next up previous
Next: 2D Poisson solver Up: 1D heat equation Previous: Sequential program

Parallel program (user-supplied code)

C=======================================================================
C=======================================================================
C
C       example program heat:
C               explicitly solves the 1D diffusion equation
C
C=======================================================================
C=======================================================================

C=======================================================================
C
C       host process-main program
C
C=======================================================================

        subroutine hostmain

        include 'mesh_uparms.h'
        include 'mesh_parms.h'
        include 'mesh_common.h'

C=======grid size
C       moved to archetype file mesh_uparms.h
C       integer NX
C       parameter (NX=100)
        integer NSTEPS
        parameter (NSTEPS=100)

C=======grid variables (whole array in host)
        real uk(1:NX)

        dx = 1.0/NX
        dt = 0.5*dx*dx

C=======initialization
        do i=2,NX-1
           uk(i)=0.0
        enddo
        uk(1)=1.0
        uk(NX)=1.0
        call mesh_HtoG_host(uk)

C=======time step loop
        do k=1,NSTEPS
C===========grid computation (grid processes only)
C===========sequential output
            call mesh_GtoH_host(uk)
            print*, 'timestep ', k
            print 25,(uk(I),I=1,NX)
25          format(4X,E15.5)
        enddo
        end

C=======================================================================
C
C       grid process-main program
C
C=======================================================================

        subroutine gridmain

        include 'mesh_uparms.h'
        include 'mesh_parms.h'
        include 'mesh_common.h'

C=======grid size
C       moved to archetype file mesh_uparms.H
C       integer NX
C       parameter (NX=100)
        integer NSTEPS
        parameter (NSTEPS=100)

C=======grid variables (local sections)
        real uk(IXLO:IXHI),ukp1(IXLO:IXHI)

        dx = 1.0/NX
        dt = 0.5*dx*dx

C=======initialization
        call mesh_HtoG_grid(uk)

C=======time step loop
        do k=1,NSTEPS
C===========grid computation
            call mesh_update_bdry(uk)
            call xintersect(2,NX-1,istart,iend,iempty)
            do i=istart,iend
                ukp1(i)=uk(i)+(dt/(dx*dx))*(uk(i+1)-2*uk(i)+uk(i-1))
            enddo
            do i=istart,iend
                uk(i)=ukp1(i)
            enddo
C===========sequential output (I/O in host process only)
            call mesh_GtoH_grid(uk)
        enddo
        end

C=======================================================================



Berna L Massingill
Mon Jun 8 19:35:58 PDT 1998