Vector Magic and Naming Conventions for Fortran

In summary, the program utilizes Fortran's capabilities for easy translation of mathematical calculus into machine-readable code. It also demonstrates good practices such as using consistent naming conventions and utilizing the abs() function for vector operations. The program calculates the velocity by taking values from a data set and multiplying them by a time difference. It also displays the average and maximum values for various accelerations. However, the program may have errors such as using undeclared variables and not utilizing the full potential of Fortran's capabilities for handling matrices and vectors.
  • #1
ShoxPhysics
5
0
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:
Technology news on Phys.org
  • #2
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
In addition to AlphaZero's remark:

ShoxPhysics said:
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 to Vector Magic and Naming Conventions for Fortran

1. What is velocity and how is it calculated?

Velocity is a measure of the rate of change in an object's position over time. It is calculated by dividing the change in position by the change in time. In other words, velocity = change in position / change in time.

2. What is the difference between velocity and speed?

Velocity and speed are often used interchangeably, but they are not the same. While both measure how fast an object is moving, velocity also includes the direction of movement. Speed, on the other hand, is just a measure of how fast an object is moving, regardless of direction.

3. How is velocity represented graphically?

Velocity is represented graphically by a slope on a position vs. time graph. The steeper the slope, the greater the velocity. A positive slope indicates motion in the positive direction, while a negative slope indicates motion in the negative direction.

4. Can velocity be negative?

Yes, velocity can be negative. This indicates that an object is moving in the opposite direction of the positive direction. For example, if an object is moving to the left, its velocity would be negative as its position decreases over time.

5. How does acceleration affect velocity?

Acceleration is the rate of change in velocity over time. If an object's acceleration is constant, then its velocity will increase or decrease at a steady rate. If an object's acceleration changes, its velocity will also change accordingly.

Similar threads

  • Programming and Computer Science
Replies
6
Views
2K
Back
Top