Personal tools

Difference between revisions of "Fortran"

From MohidWiki

Jump to: navigation, search
(Function)
(Function)
Line 107: Line 107:
 
<htm>
 
<htm>
 
<pre name="code" class="fortran">
 
<pre name="code" class="fortran">
 +
program subfunc
  
 +
implicit none
 +
 +
real :: a,b,c,root1,root2,bigroot
 +
logical :: realroots
 +
write (*,*) "Hello world!"
 +
 +
write (*,10)
 +
read (*,*) a,b,c
 +
 +
!call solvit(a,b,c,root1,root2,realroots)
 +
!write (*,20) root1,root2
 +
write(*,20) bigroot(a,b,c)
 +
 +
if (realroots) then
 +
        write(*,*) 'Sorry, there are no real roots'
 +
end if       
 +
 +
10 format('Enter 3 coefficients')
 +
!20 format('The roots are ', 2f12.6)
 +
20 format('The biggest root is ', f12.6)
 +
end program subfunc
 +
</pre>
 +
</htm>
 +
 +
<htm>
 +
<pre name="code" class="fortran">
 
function bigroot(a,b,c)
 
function bigroot(a,b,c)
  

Revision as of 02:42, 21 May 2010

Fortran95 is the language of choice to program in MOHID. Although a primitive form of language it proves to be the most efficient and performant in the area of scientific computing. Still widely used in numerical computation.

MOHID templates

Module

Program

Examples

Hello World program

program helloworld

implicit none

write (*,*) "Hello world!"

end program helloworld


Hello world in a module

module modulehelloworld

contains

subroutine showhelloworld()
        
        write(*,*) "Hello world!"

end subroutine showhelloworld

end module modulehelloworld


program helloworld

use modulehelloworld, only: showhelloworld

implicit none

call showhelloworld

end program helloworld


Subroutine

program subfunc

implicit none

real :: a,b,c,root1,root2
logical :: realroots
write (*,*) "Hello world!"

write (*,10)
read (*,*) a,b,c

call solvit(a,b,c,root1,root2,realroots)
write (*,20) root1,root2

if (realroots) then
        write(*,*) 'Sorry, there are no real roots'
end if        

10 format('Enter 3 coefficients')
20 format('The roots are ', 2f12.6)
end program subfunc


subroutine solvit(a,b,c,root1,root2,realroots)

!Arguments
real ::a,b,c,root1,root2
logical :: realroots

!Locals
real :: test

test = b**2-4*a*c

if(test>=0.0) then
        root1 = (-b + sqrt(test))/(2.0*a)
        root2 = (-b - sqrt(test))/(2.0*a)
        realroots = .true.
else
        realroots = .false.        
end if

return
end subroutine solvit


Function

program subfunc

implicit none

real :: a,b,c,root1,root2,bigroot
logical :: realroots
write (*,*) "Hello world!"

write (*,10)
read (*,*) a,b,c

!call solvit(a,b,c,root1,root2,realroots)
!write (*,20) root1,root2
write(*,20) bigroot(a,b,c)

if (realroots) then
        write(*,*) 'Sorry, there are no real roots'
end if        

10 format('Enter 3 coefficients')
!20 format('The roots are ', 2f12.6)
20 format('The biggest root is ', f12.6)
end program subfunc


function bigroot(a,b,c)

!Arguments
real :: a,b,c,bigroot

!Local
real :: root1, root2, test

if(test>=0.0) then
        root1 = (-b + sqrt(test))/(2.0*a)
        root2 = (-b - sqrt(test))/(2.0*a)
        if (root1 .gt. root2) then
                bigroot = root1
        else
                bigroot = root2
        end if
else
        bigroot = -9.0e35
end if

return
end function bigroot


Variables

Types

Interface procedure

Arrays

If

Do

Case

Sample

program average
 
  ! Read in some numbers and take the average
  ! As written, if there are no data points, an average of zero is returned
  ! While this may not be desired behavior, it keeps this example simple
 
  implicit none
 
  real, dimension(:), allocatable :: points
  integer                         :: number_of_points
  real                            :: average_points=0., positive_average=0., negative_average=0.
 
  write (*,*) "Input number of points to average:"
  read  (*,*) number_of_points
 
  allocate (points(number_of_points))
 
  write (*,*) "Enter the points to average:"
  read  (*,*) points
 
  ! Take the average by summing points and dividing by number_of_points
  if (number_of_points > 0) average_points = sum(points) / number_of_points
 
  ! Now form average over positive and negative points only
  if (count(points > 0.) > 0) then
     positive_average = sum(points, points > 0.) / count(points > 0.)
  end if
  if (count(points < 0.) > 0) then
     negative_average = sum(points, points < 0.) / count(points < 0.)
  end if
 
  deallocate (points)
 
  ! Print result to terminal
  write (*,'(a,g12.4)') 'Average = ', average_points
  write (*,'(a,g12.4)') 'Average of positive points = ', positive_average
  write (*,'(a,g12.4)') 'Average of negative points = ', negative_average
 
end program average


Other languages