// -*- text -*- /** * \file geodesic-for.dox * \brief Documentation for geodesic routines implemented in Fortran * * Written by Charles Karney and licensed under the * MIT/X11 License. For more information, see * https://geographiclib.sourceforge.io/ **********************************************************************/ /** \mainpage Geodesic routines implemented in Fortran \author Charles F. F. Karney (charles@karney.com) \version 1.50 The documentation for other versions is available at https://geographiclib.sourceforge.io/m.nn/Fortran for versions numbers m.nn ≥ 1.28. \section abstract-for Abstract This is a Fortran implementation of the geodesic algorithms from GeographicLib. This is a self-contained library which makes it easy to do geodesic computations for an ellipsoid of revolution in a Fortran program. It is written in Fortran 77 (avoiding features which are now deprecated) and should compile correctly with just about any Fortran compiler. \section download-for Downloading the source The Fortran library is part of %GeographicLib which available for download at - GeographicLib-1.50.tar.gz - GeographicLib-1.50.zip . as either a compressed tar file (tar.gz) or a zip file. After unpacking the source, the Fortran library can be found in the directory legacy/Fortran. The library consists of the file geodesic.for. The Fortran-90 interface is defined in geodesic.inc. Licensed under the MIT/X11 License; see LICENSE.txt. \section doc-for Library documentation Here is the \link geodesic.for application programming interface\endlink for the library (this is just the documentation for the source file, geodesic.for). \section samples-for Sample programs Also included are 3 small test programs: - geoddirect.for is a simple command line utility for solving the direct geodesic problem; - geodinverse.for is a simple command line utility for solving the inverse geodesic problem; - planimeter.for is a simple command line utility for computing the area of a geodesic polygon given its vertices. . Here, for example, is geodinverse.for \include geodinverse.for To compile, link, and run this, you would typically use \verbatim f95 -o geodinverse geodinverse.for geodesic.for echo 30 0 29.5 179.5 | ./geodinverse \endverbatim These sample programs can also be built with the supplied cmake file, CMakeLists.txt, as follows \verbatim mkdir BUILD cd BUILD cmake .. make make test echo 30 0 29.5 179.5 | ./geodinverse \endverbatim Finally, the two programs - ngsforward - ngsinverse . which are also built with cmake, provide drop-in replacements for replacements for the NGS tools FORWARD and INVERSE available from http://www.ngs.noaa.gov/PC_PROD/Inv_Fwd/. These cure two problems of the Vincenty algorithms used by NGS: - the accuracy is "only" 0.1 mm; - the inverse program sometimes goes into an infinite loop. . The corresponding source files - ngsforward.for - ngsinverse.for - ngscommon.for . are derived from the NGS source files - forward.for, version 2.0, dated 2002-08-21 - inverse.for, version 3.0, dated 2012-11-04 . and are therefore in the public domain. \section library-for Using the library - Optionally put @code{.for} include "geodesic.inc" @endcode in declaration section of your subroutines. - make calls to the geodesic routines from your code. The interface to the library is documented in geodesic.for. - Compile and link as described above. \section external-for External links - These algorithms are derived in C. F. F. Karney, Algorithms for geodesics, J. Geodesy 87, 43--55 (2013) ( addenda). - A longer paper on geodesics: C. F. F. Karney, Geodesics on an ellipsoid of revolution, Feb. 2011 ( errata). - Main project page - GeographicLib web site - Documentation on the C++ classes: GeographicLib::Geodesic, GeographicLib::GeodesicLine, GeographicLib::PolygonAreaT. - The section in the %GeographicLib documentation on geodesics: \ref geodesic. - git repository - Implementations in various languages - C++ (complete library): documentation, download; - C (geodesic routines): documentation, also included with recent versions of proj.4; - Fortran (geodesic routines): documentation; - Java (geodesic routines): Maven Central package, documentation; - JavaScript (geodesic routines): npm package, documentation; - Python (geodesic routines): PyPI package, documentation; - Matlab/Octave (geodesic and some other routines): Matlab Central package, documentation; - C# (.NET wrapper for complete C++ library): documentation. - A geodesic bibliography. - The wikipedia page, Geodesics on an ellipsoid. \section changes-for Change log - Version 1.50 (released 2019-09-24) - Allow arbitrarily complex polygons in area. In the case of self-intersecting polygons the area is accumulated "algebraically", e.g., the areas of the 2 loops in a figure-8 polygon will partially cancel. - Version 1.49 (released 2017-10-05) - Fix code formatting and add two tests. - Version 1.48 (released 2017-04-09) - Change default range for longitude and azimuth to (−180°, 180°] (instead of [−180°, 180°)). - Version 1.47 (released 2017-02-15) - Improve accuracy of area calculation (fixing a flaw introduced in version 1.46). - Version 1.46 (released 2016-02-15) - More accurate inverse solution when longitude difference is close to 180°. - Version 1.45 (released 2015-09-30) - The solution of the inverse problem now correctly returns NaNs if one of the latitudes is a NaN. - Include a test suite that can be run with "make test" after configuring with cmake. - The library now treats latitudes outside the range [−90°, 90°] as NaNs; so the sample programs no longer check for legal values of latitude. - Version 1.44 (released 2015-08-14) - Improve accuracy of calculations by evaluating trigonometric functions more carefully and replacing the series for the reduced length with one with a smaller truncation error. - The allowed ranges for longitudes and azimuths is now unlimited; it used to be [−540°, 540°). - The sample programs, geoddirect and geodinverse, enforce the restriction of latitude to [−90°, 90°]. - The inverse calculation sets \e s12 to zero for coincident points at pole (instead of returning a tiny quantity). **********************************************************************/