c c c
        module everywhere
c
c     This module will declare all variables that will be common to all 
c     components of this program
c
        implicit none
c
        real, allocatable :: valley(:),hip(:),rafters(:)
        real, allocatable :: valley2(:),hip2(:),rafters2(:)
        real, allocatable :: angleh(:),angler(:),anglev(:)
c
        integer n1,n2,n3
c
c     This program was written by Jason Wehr on October 5, 1996 
c     The purpose of this program is to take a given roof pitch and turn it intc     its equivalent degree representation for both the main roof and for hip
c     and valley rafters.    
c
c
c     
c     valley = the array valley will contain the number of valleys that have a
c              different slope
c   
c     hip = the array hip will contain the number of hip rafters that have a
c           different slope
c
c     rafters = the array rafters will contain the number of different sloping
c               rafters on the roof
c
c     n1 = this will allocate the number of spaces need by the array valley
c
c     n2 = this will allocate the number of elements needed by the array hip
c
c     n3 = this will allocate the number of elements needed by the array rafterc
c     The three arrays, valley2, hip2, and rafters2 will be used to store the
c     pitch of the roof divided by twelve
c
      end module everywhere
c
      program roof
      use everywhere
      implicit none
      integer i,k
      real h_v_angle
c
c     integer i will be used in do loops later in the program.  integer k is 
c     used in the open statement for the ouptfile as the iostat= argument. 
c     Finally h_v_angle is a function designed to get the value of the tangent
c     of the hip and valley rafters.
c
 120  call get_elements
c     
c     The subroutine get_elements will prompt the user for the number of 
c     different slopes that are needed for each kind of rafter
c
c
      if (n3.gt.0) then 
          allocate (rafters(1:n3),angler(1:n3),rafters2(1:n3))
      else if (n3.le.0) then
          print *, 'You have no roof.  Please input again.'
          go to 120
c
      end if 
c
      if (n1.gt.0) then
          allocate (valley(1:n1),anglev(1:n1),valley2(1:n1))
      end if
      if (n2.gt.0) then 
          allocate (hip(1:n2),angleh(1:n2),hip2(1:n2))
      end if 
      call pitch
c
c     The subroutine pitch picks up the value of rise on the roof
c
c     I also need to open a file to output my results to
c
      open(unit=14,file='pitch.out',status='unknown',iostat=k,err=100)
c
c     Now The angles for all the different rafter slopes will be calculated
c
      if (n1.ge.1) then
      do i=1,n1
         valley2(i)=h_v_angle(valley(i)) 
c 
         anglev(i)=atan(valley2(i))
c
      end do
      end if
c
      if (n2.ge.1) then
      do i=1,n2 
         hip2(i)=h_v_angle(hip(i))
         angleh(i)=atan(hip2(i))
      end do
      end if
c
      do i=1,n3
         rafters2(i)=rafters(i)/12.0
         angler(i)=atan(rafters2(i))
      end do
c  
c     Now it is time to issue a call to a subroutine that will out put the bothc     the pitch of the roof as will as that pitches corresponding angle.
c
      call output
  100 if (k.gt.0) then
        print *, "Error occured in opening file. iostat = ",k
      end if 
      close (14)
c
      stop
c
      end 
c
      subroutine get_elements
c
c     This subroutine will prompt the user for the number of different rafters
c     of each type.
c
      use everywhere 
      implicit none 
      write (*,*) "How many regular rafters are there of different",
     &            " slopes?" 
      read *, n3
      write (*,*) "How many different sloping hip rafters will",
     &            " there be?"
      read *, n2
      write (*,*) "How many different valleys will there be?"
      read *, n1
c
      return 
c
      end  
c
      subroutine pitch
c
      use everywhere
      implicit none
c
c     The subroutine pitch will prompt the user for the rise of the roof 
c     slope for all the different slopes of each type of rafter.
c
      integer j,k,n,i
      do i=1,n3
        if (i.eq.1) then
          write (*,*) "Please give me the number ",i," value of the", 
     &             " rafter rise. For example, if it is a four on",
     &             " twelve,type 4.0."
          read *, rafters(i) 
        end if
        if (i.gt.1) then 
          write (*,*) "Please give me the number ",i," value of the",
     &                 " rafter rise."
          read *, rafters(i) 
        end if
      end do            
      if (n2.gt.0) then
      do j=1,n2
        if (j.eq.1) then
          write (*,*) "Please give me the number ",j," value of the ",
     &             "pitch of the two roofs that come ",
     &             "together at the hip. For example, if the pitch ",
     &             "is a four on twelve,then type 4.0."
          read *, hip(j)
        end if
        if (j.gt.1) then
          write (*,*) "Please give me the number ",j," value of the ",
     &             "pitch of the the two roofs that come together ",
     &             "at the hip." 
          read *, hip(j)
        end if 
      end do
      end if
      if (n1.gt.0) then
      do k=1,n1
         if(k.eq.1) then
           write (*,*) "Please give me the number ",k,"value of the ",
     &              "pitch of the two roofs that come together ",
     &              "at the valley. For example, if the the value of ",
     &              "the pitch is a four on twelve, then type 4.0."
           read *, valley(k) 
         end if
         if(k.gt.1) then
           write (*,*)  "Please give the the number ",k," value of ",
     &                  "the pitch of the two roofs that come ",
     &                  "together at the valley."
           read *, valley(k)
         end if
      end do
      end if
      return
      end
c
      function h_v_angle(x)
c
c   
c     This function is used to convert the value of pitch of the two roofs 
c     that come together at a hip or valley and convert it into the true pitch
c     of those rafters.
c
      implicit none
      real h_v_angle,x,factor
      factor = 288.0
      factor = sqrt(factor)
      h_v_angle=x/factor
      return
      end 
c      
c
       subroutine output
c
       use everywhere
       implicit none
       integer j
       real frad
       character*7 word1*18,word2*19,word3*9,word4*3,word5,word6
       character*3 word7
c      
c      when a the function frad is called in this program, it is converting 
c      the value of the computed angles from radians to degrees.
c
       word1 = 'Pitch of adjoining' 
       word2 = 'corresponding angle'
       word3 = 'roofs at '
       word4 = 'of '
       word5 = ' rafter'
       word6 = 'valleys'
       word7 = 'hip'
       print *, "Answers are in the file pitch.out"
       if (n1.gt.0) then
       write (14,'(5x,a18,5x,a19)') word1,word2
       write (14,2000) word3//word6,word4//word6(1:6)//word5
       do j=1,n1
         write (14,*)
        anglev(j)=frad(anglev(j))
        write(14,'(2x,i2,10x,f5.2,16x,f5.2)') j,valley(j),anglev(j) 
       end do
       end if
       if (n2.gt.0) then
       write (14,*)
       write (14,'(5x,a18,5x,a19)') word1,word2
       write (14,2011) word3//word7,word4//word7//word5
       do j=1,n2
         write (14,*)
         angleh(j)=frad(angleh(j))
         write(14,'(2x,i2,10x,f5.2,16x,f5.2)') j,hip(j),angleh(j)
       end do
       end if
       write (14,*)
       write (14,'(5x,a15,8x,a19)') word1(1:8)//word5,word2
       write (14,'(28x,a10)') word4//word5
       do j=1,n3
         write(14,*)
         angler(j)=frad(angler(j))
         write(14,'(2x,i2,tr10,f5.2,tr16,f5.2)') j,rafters(j),angler(j)
       end do
 2000  format (5x,a16,7x,a16)
 2011  format (5x,a12,11x,a16)
       return 
       end
c 
      function frad(x)
c
c     This function converts from raidians to degrees
c
      use everywhere
      implicit none
      real frad,x,factor,pi
      parameter (pi=3.1415927)
      parameter (factor=180/pi)
      frad = x*factor
      return
      end
c
c c