Velocity from a data set

  • #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:
program WSUPhys_csv
  implicit none

  integer :: stat, num_lines, ivar1, ivar2, ivar3, &
             MaxVert,MaxSide,MaxForward
  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
  open(10,file='DATA-002.csv',status='old',iostat=stat)
  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
  MaxVert=0
  MaxSide=0
  MaxForward=0
  [COLOR="Navy"]SumVel=0
  MaxVel=0[/COLOR]
  do
    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
      cycle
    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)
    [COLOR="Navy"]Vel=(ABS(ivar_3))*(rvar-rvar)
    SumVel=SumVel+ ABS(Vel)[/COLOR]
    If (ABS(ivar1) > MaxVert) then
      MaxVert=ivar1
    end if
    If (ABS(ivar2) > MaxSide) then
      MaxSide=ivar1
    end if
    If (ABS(ivar3) > MaxForward) then
      MaxForward=ivar1
    end if   
    [COLOR="Navy"]If (Vel > MaxVel) then
      MaxVel=Vel[/COLOR]
  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:

Answers and Replies

  • #2
AlephZero
Science Advisor
Homework Helper
7,002
293
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.
 
  • #3
104
3
In addition to AlphaZero's remark:

Sum_ivar1 = 0
Sum_ivar2 = 0
Sum_ivar3 = 0
MaxVert=0
MaxSide=0
MaxForward=0
Ouch!

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:
!----------------------------------------------------------------------------80
!> @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!

Solkar
 

Related Threads on Velocity from a data set

  • Last Post
Replies
4
Views
2K
Replies
3
Views
2K
Replies
2
Views
4K
Replies
1
Views
2K
Replies
7
Views
2K
Replies
1
Views
7K
Replies
2
Views
798
Replies
3
Views
4K
Replies
7
Views
889
Replies
2
Views
394
Top