Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Velocity from a data set

  1. May 14, 2013 #1
    I have just about finished this program, I only need to calculate my velocity. I think that this velocity should be calculated by taking the value from the 4th column of my data set here:https://docs.google.com/file/d/0BzuDEPd26OcheVhiWlZ3STlZU0k/edit?usp=sharing which have called ivar_3 and multiplying it by the difference of the 1st column in the line of the value and the line preceding it. Is this thought process correct? I have done the following (code I am talking about is in blue), can somebody tell me where I might be going wrong because it will not compile?
    Code (Text):
    program WSUPhys_csv
      implicit none

      integer :: stat, num_lines, ivar1, ivar2, ivar3, &
      real :: rvar, Sum_ivar1, Sum_ivar2, Sum_ivar3, &
              Avg_ivar1, Avg_ivar2, Avg_ivar3, Vel, SumVel, MaxVel
      character*80 :: line
      logical :: err
      err = .false.

      write(*,*) "Reading file..."

      ! open input file
      if (stat .ne. 0) then
        err = .true.
        write(*,*) 'File cannot be opened !'
        go to 99  
      end if

      num_lines = 0
      Sum_ivar1 = 0
      Sum_ivar2 = 0
      Sum_ivar3 = 0
        read(10,'(A)',end=99, iostat=stat) line
        if (stat .ne. 0) then
          err = .true.
          write(*,*) 'Error reading data !'
          go to 99
        end if
        ! skip comment/header lines beginning with ";"
        if (adjustl(trim(line(1:1))) .eq. ';') then
        end if
        ! read string line into numeric variables
        read(line,*) rvar, ivar1, ivar2, ivar3
        num_lines = num_lines + 1    
        if (num_lines <=  10) then
          write(*,*) num_lines, ':', rvar, ivar1, ivar2, ivar3
        end if
        Sum_ivar1 = Sum_ivar1 + ABS(ivar1)
        Sum_ivar2 = Sum_ivar2 + ABS(ivar2)
        Sum_ivar3 = Sum_ivar3 + ABS(ivar3)
        SumVel=SumVel+ ABS(Vel)[/COLOR]
        If (ABS(ivar1) > MaxVert) then
        end if
        If (ABS(ivar2) > MaxSide) then
        end if
        If (ABS(ivar3) > MaxForward) then
        end if  
        [COLOR="Navy"]If (Vel > MaxVel) then
      end do
      ! close file
      99 continue
      close (10)

      ! when file processing OK
      if (.not. err) then
        write(*,*) '...done.'
        ! compute averages
        Avg_ivar1 = (Sum_ivar1 / num_lines)
        Avg_ivar2 = (Sum_ivar2 / num_lines)
        Avg_ivar3 = (Sum_ivar3 / num_lines)
        [COLOR="Navy"]AvgVel = (SumVel / num_lines)[/COLOR]

        write(*,*) 'Lines processed: ', num_lines
        write(*,*) 'Average vertical acceleration', Avg_ivar1
        write(*,*) 'Average sideways acceleration', Avg_ivar2
        write(*,*) 'Average forwards acceleration', Avg_ivar3
        write(*,*) 'Maximum vertical acceleration', MaxVert
        write(*,*) 'Maximum sideways acceleration', MaxSide
        write(*,*) 'Maximum forward acceleration ',  MaxForward
        [COLOR="Navy"]write (*,*) 'Average forward velocity', AvgVel
        write (*,*) 'Maximum velocity', MaxVel[/COLOR]
      end if  
    end program WSUPhys_csv
    Last edited: May 14, 2013
  2. jcsd
  3. May 14, 2013 #2


    User Avatar
    Science Advisor
    Homework Helper

    You have an "implicit none" statement which means you have to declare all the variables you use.

    You haven't declared SumVel and MaxVel.

    There may be more errors, but that's a start.
  4. May 15, 2013 #3
    In addition to AlphaZero's remark:


    Fortran is sort-of a short for Formula Translating and it has that name for a reason - namely for providing means for easy translation of mathematical calculus into a form understandable by machines.

    So - what would it be good for if it would not provide means to deal with basic algebraic concepts like vectors and matrices?

    Instead of stepping line-by-line through this I've compiled a little snippet from which you may take some concepts for improving readability and structure of your code.

    Code (Text):
    !> @file vector_demo.f90
    !> @brief illustrating some basic Fortran vector magic, useful practices
    !! and proposes a consistent naming convention
    !> @author Solkar

    !> @function vector_demo
    !> @brief entry point, main routine
    program vector_demo
        implicit none
        !- parameters ("constants" in C) in mulit-char CAPS,
        integer,                        parameter :: RKIND = 8      ! precision
        !- ... everything else (except matrices) small,
        real(kind=RKIND)                          :: dt             ! time diff
        !- ... vectors with trailing underscore
        real(kind=RKIND), dimension(3)            :: a_, v_         ! accel, velo
        a_ = (/-1, -2, -3/) !- Yes. This will convert the integers to the
                            !! (real) vector components
        v_ = 0              !- zeroing all components at once
        dt = 0.42           !- always good to know where the towel is...

        !> plain algebra
        !! \f[ \vec{v} \leftarrow \vec{v} + \Delta t \cdot
        !! \left(\begin{array}{c} |a_1|\\ |a_2|\\ |a_3| \end{array}\right) \f]

        v_ = v_ + dt * abs(a_) !> this abs() works component-wise(!)

        write(*,*) v_  
    end program vector_demo
    Have fun!

Share this great discussion with others via Reddit, Google+, Twitter, or Facebook