Difference between revisions of "HowTo:fortran"
(→Fortran (Programming Language)) |
|||
Line 7: | Line 7: | ||
== Well Structured == | == Well Structured == | ||
− | FORTRAN is very well structured. All routines should have a clear beginning statement, and a corresponding ending one. For example (since case-in-sensitiveness, usually written in either lower or upper case | + | FORTRAN is very well structured. All routines should have a clear beginning statement, and a corresponding ending one. For example (since case-in-sensitiveness, usually written in either all lower or all upper case) |
<pre> | <pre> | ||
PROGRAM MY_VERY_USEFUL_CODE | PROGRAM MY_VERY_USEFUL_CODE | ||
− | ... | + | ... |
− | CALL PROBLEM_SOLVING (...) | + | CALL PROBLEM_SOLVING (...) |
− | ... | + | ... |
− | STOP | + | STOP |
END PROGRAM MY_VERY_USEFUL_CODE | END PROGRAM MY_VERY_USEFUL_CODE | ||
SUBROUTINE PROBLEM_SOLVING (...) | SUBROUTINE PROBLEM_SOLVING (...) | ||
− | ... | + | ... |
− | RESULT = AVERAGE_SCORE (...) | + | RESULT = AVERAGE_SCORE (...) |
− | RETURN | + | RETURN |
END SUBROUTINE PROBLEM_SOLVING | END SUBROUTINE PROBLEM_SOLVING | ||
FUNCTION AVERAGE_SCORE (...) | FUNCTION AVERAGE_SCORE (...) | ||
− | ... | + | ... |
− | RETURN | + | RETURN |
END FUNCTION AVERAGE_SCORE | END FUNCTION AVERAGE_SCORE | ||
</pre> | </pre> | ||
− | + | Even the DO loop and IF structure are also finished with an END statement. | |
<pre> | <pre> | ||
Line 50: | Line 50: | ||
== Modules == | == Modules == | ||
− | Similar to classes in C++, modules are very important and widely-used in FORTRAN. Theoretically modules are not classes, but usually | + | Similar to classes in C++, modules are very important and widely-used in FORTRAN. Modules, in the form of a separate code structure, may contain various definitions/declarations and can use other predefined modules. Theoretically modules are not classes, but usually used to provide some objects for direct access/sharing, since in most scientific computations data structures/objects are known and the task is to manipulate them. Modules can also contain specific routines operating on the objects inside, similar to the encapsulation concept of classes. Modules are also a good method to share such objects, so that routines arguments can be reduced to necessaries only. By using modules, the code can be written very concise. Here is an module example and its usage. |
+ | <pre> | ||
+ | MODULE MY_PARAMETERS | ||
+ | DOUBLE PRECISION, PARAMETER :: THE_EARTH_RADIUS = 6371.0D0 | ||
+ | END MODULE MY_PARAMETERS | ||
+ | |||
+ | SUBROUTINE EARTH_STORY (...) | ||
+ | USE MY_PARAMETERS | ||
+ | DOUBLE PRECISION:: THE_EARTH_DIAMETER | ||
+ | ... | ||
+ | THE_EARTH_DIAMETER = 2 * THE_EARTH_RADIUS | ||
+ | ... | ||
+ | RETURN | ||
+ | END SUBROUTINE EARTH_STORY | ||
+ | </pre> | ||
+ | |||
+ | |} | ||
+ | |||
+ | {| style="border-spacing: 8px;" | ||
+ | | valign="top" width="50%" style="padding:1em; border:1px solid #aaaaaa; background-color:#e1eaf1; border-radius:7px" | | ||
== Overloading == | == Overloading == | ||
Line 83: | Line 102: | ||
{| style="border-spacing: 8px;" | {| style="border-spacing: 8px;" | ||
− | | valign="top" width="50%" style="padding:1em; border:1px solid #aaaaaa; background-color:# | + | | valign="top" width="50%" style="padding:1em; border:1px solid #aaaaaa; background-color:#; border-radius:7px" | |
== High Precision == | == High Precision == |
Revision as of 15:55, 23 November 2016
Contents
Fortran (Programming Language)
FORTRAN, C, and C++ have a long history as the basic/main compiled languages for high performance computing. The key parallel computing packages, MPI and OpenMP, have been implemented in all of them from the beginning. While C and C++ have been extended for all programming purposes, FORTRAN originated from FORmular TRANslation, and developed with an emphasis on scientific computing. After the FORTRAN I-IV, 66, and 77 stages, the FORTRAN 90, 95, 2003, 2008, and 2015 versions have adopted many advanced features to become a true modern (object oriented) programming language, especially geared toward scientific computations. The following lists some of the most useful and prominent programming features of FORTRAN.
Well StructuredFORTRAN is very well structured. All routines should have a clear beginning statement, and a corresponding ending one. For example (since case-in-sensitiveness, usually written in either all lower or all upper case) PROGRAM MY_VERY_USEFUL_CODE ... CALL PROBLEM_SOLVING (...) ... STOP END PROGRAM MY_VERY_USEFUL_CODE SUBROUTINE PROBLEM_SOLVING (...) ... RESULT = AVERAGE_SCORE (...) RETURN END SUBROUTINE PROBLEM_SOLVING FUNCTION AVERAGE_SCORE (...) ... RETURN END FUNCTION AVERAGE_SCORE Even the DO loop and IF structure are also finished with an END statement. DO I = ISTART, IEND ... END DO IF (CONDITION) ... ELSE ... END IF |
ModulesSimilar to classes in C++, modules are very important and widely-used in FORTRAN. Modules, in the form of a separate code structure, may contain various definitions/declarations and can use other predefined modules. Theoretically modules are not classes, but usually used to provide some objects for direct access/sharing, since in most scientific computations data structures/objects are known and the task is to manipulate them. Modules can also contain specific routines operating on the objects inside, similar to the encapsulation concept of classes. Modules are also a good method to share such objects, so that routines arguments can be reduced to necessaries only. By using modules, the code can be written very concise. Here is an module example and its usage. MODULE MY_PARAMETERS DOUBLE PRECISION, PARAMETER :: THE_EARTH_RADIUS = 6371.0D0 END MODULE MY_PARAMETERS SUBROUTINE EARTH_STORY (...) USE MY_PARAMETERS DOUBLE PRECISION:: THE_EARTH_DIAMETER ... THE_EARTH_DIAMETER = 2 * THE_EARTH_RADIUS ... RETURN END SUBROUTINE EARTH_STORY |
OverloadingAs a modern language, FORTRAN also supports routine overloading. MODULE MY_KINETICS INTERFACE GENERIC_KINETIC SUBROUTINE KINETIC_ROUTINE_A(...) ... END SUBROUTINE KINETIC_ROUTINE_A SUBROUTINE KINETIC_ROUTINE_B(...) ... END SUBROUTINE KINETIC_ROUTINE_B SUBROUTINE KINETIC_ROUTINE_C(...) ... END SUBROUTINE KINETIC_ROUTINE_C ... END INTERFACE GENERIC_KINETIC END MODULE MY_KINETICS After this module is cited USE MY_KINETICS with each of the specific routines available, the call CALL GENERIC_KINETIC(...) will invoke the specific routine with the matching unique interface. In C++, overloading is a type of class polymorphism. |
High PrecisionMost FORTRAN compilers have built-in data types of very high precision, like quadruple precision REAL*16 :: VELOCITY(3,1000) COMPLEX*32 :: HAMILTON(1000, 1000) Dynamic Memory AllocationEarly versions of FORTRAN had a big drawback: they did not allow for dynamic memory allocation, forcing re-compilation array sizes were changed. Newer versions of FORTRAN (since F90) support such operations even for many-dimensional arrays. REAL*16, ALLOCATABLE :: COMPLICATED_DATA(:, :, :, :, :, :) ALLOCATE(COMPLICATED_DATA(3, 90, 80, 72, 500, 28)) in contrast to C/C++ where all arrays are allocated as one-dimensional. |
User Defined Data TypesFORTRAN also supports user defined data types: TYPE PERSON CHARACTER(LEN=10) :: NAME REAL :: AGE INTEGER :: ID END TYPE PERSON TYPE(PERSON) :: YOU, ME REAL :: DIFF YOU%ID = 12345 DIFF = YOU%AGE - ME%AGE |
Some Other Features
Links and Further Reading
|
HelpSend email to cac.help@queensu.ca. We have scientific programmers on staff who will probably be able to help you out. Of course, we can't do the coding for you but we do our best to get your code ready for parallel machines and clusters. |