
c---------------------------------------------------------------------
c---------------------------------------------------------------------

      subroutine read_input

c---------------------------------------------------------------------
c---------------------------------------------------------------------

      implicit none

      include 'applu.incl'

      integer  fstatus
!$    integer  omp_get_max_threads
!$    external omp_get_max_threads


c---------------------------------------------------------------------
c    if input file does not exist, it uses defaults
c       ipr = 1 for detailed progress output
c       inorm = how often the norm is printed (once every inorm iterations)
c       itmax = number of pseudo time steps
c       dt = time step
c       omega 1 over-relaxation factor for SSOR
c       tolrsd = steady state residual tolerance levels
c       nx, ny, nz = number of grid points in x, y, z directions
c---------------------------------------------------------------------

         write(*, 1000)

         open (unit=3,file='inputlu.data',status='old',
     >         access='sequential',form='formatted', iostat=fstatus)
         if (fstatus .eq. 0) then

            write(*, *) 'Reading from input file inputlu.data'

            read (3,*)
            read (3,*)
            read (3,*) ipr, inorm
            read (3,*)
            read (3,*)
            read (3,*) itmax
            read (3,*)
            read (3,*)
            read (3,*) dt
            read (3,*)
            read (3,*)
            read (3,*) omega
            read (3,*)
            read (3,*)
            read (3,*) tolrsd(1),tolrsd(2),tolrsd(3),tolrsd(4),tolrsd(5)
            read (3,*)
            read (3,*)
            read (3,*) nx0, ny0, nz0
            close(3)
         else
            ipr = ipr_default
            inorm = inorm_default
            itmax = itmax_default
            dt = dt_default
            omega = omega_default
            tolrsd(1) = tolrsd1_def
            tolrsd(2) = tolrsd2_def
            tolrsd(3) = tolrsd3_def
            tolrsd(4) = tolrsd4_def
            tolrsd(5) = tolrsd5_def
            nx0 = isiz1
            ny0 = isiz2
            nz0 = isiz3
         endif

c---------------------------------------------------------------------
c   check problem size
c---------------------------------------------------------------------

         if ( ( nx0 .lt. 4 ) .or.
     >        ( ny0 .lt. 4 ) .or.
     >        ( nz0 .lt. 4 ) ) then

            write (*,2001)
 2001       format (5x,'PROBLEM SIZE IS TOO SMALL - ',
     >           /5x,'SET EACH OF NX, NY AND NZ AT LEAST EQUAL TO 5')
            stop

         end if

         if ( ( nx0 .gt. isiz1 ) .or.
     >        ( ny0 .gt. isiz2 ) .or.
     >        ( nz0 .gt. isiz3 ) ) then

            write (*,2002)
 2002       format (5x,'PROBLEM SIZE IS TOO LARGE - ',
     >           /5x,'NX, NY AND NZ SHOULD BE EQUAL TO ',
     >           /5x,'ISIZ1, ISIZ2 AND ISIZ3 RESPECTIVELY')
            stop

         end if


         write(*, 1001) nx0, ny0, nz0
         write(*, 1002) itmax
!$       write(*, 1003) omp_get_max_threads()
         write(*, *)


 1000 format(//,' NAS Parallel Benchmarks (NPB3.3-OMP)',
     >          ' - LU Benchmark', /)
 1001    format(' Size: ', i4, 'x', i4, 'x', i4)
 1002    format(' Iterations:                  ', i5)
 1003    format(' Number of available threads: ', i5)
         


      return
      end


