Fortran教程
本专栏主要分为两部分,分别是fortran基础篇和高级篇。基础篇的大部分内容已经写完,后面会陆续更新高级篇的使用方法。
chder_白南
无话可说
展开
-
fortran使用MKL中的GELS求解线性方程组的最小二乘问题
program test_GELS use lapack95 implicit none integer :: i integer, parameter :: m = 4, n = 3 real*8 :: a(4,3), b(4) !|---------------------------------------------------------| .原创 2020-06-04 10:03:07 · 1402 阅读 · 0 评论 -
使用MKL中的有关函数计算共轭梯度法
program ConjugateGradientMethods use blas95 implicit none integer :: i integer, parameter :: n = 5 real(kind=8),allocatable :: A(:,:) real(kind=8),allocatable :: b(:,:) real(kind=8) :: alpha = 0.d0, .原创 2020-05-28 09:23:15 · 659 阅读 · 0 评论 -
fortran派生数据类型的动态数组
program test implicit none type :: point real :: x real :: y end type type(point), allocatable :: mypoint(:) allocate( mypoint...原创 2020-04-03 11:17:31 · 911 阅读 · 0 评论 -
Fortran计算大型对称稀疏矩阵的二范数
在fortran中,有时候需要对一个大型的稀疏矩阵求取2范数。由于大型稀疏矩阵一般使用CSR存储格式,MKL函数库中的gesvd的参数是稠密矩阵<matlab可以直接计算稀疏矩阵的2范数>所以本文根据相关知识,给出求解CSR存储的对称方阵2范数的代码。由矩阵分析可以知道:特征值分解和奇异值分解的区别所有的矩阵都可以进行奇异值分解,而只有方阵才可以进行特征值分解。当所给的矩...原创 2020-03-19 22:56:33 · 1640 阅读 · 5 评论 -
fortran动态链接库小记
1. fortran创建动态链接库时,可分为debug和release两种模式:1> debug模式下具体分为Debug Multithreaded (/libs:static /threads /dbglibs)和Debug Multithread DLL (/libs:dll /threads /dbglibs) Debug Multithreaded (/libs:st...原创 2019-08-06 00:39:55 · 1605 阅读 · 0 评论 -
Fortran:调换矩阵的任意两列
下面代码实现了调换矩阵任意两列的功能program main implicit none real :: x(4,4) integer :: i, j, k call random_seed() call random_number(x) do i = 1, s...原创 2019-07-14 19:37:55 · 1486 阅读 · 0 评论 -
fortran调用MKL函数库中的gemm的fortran95接口计算矩阵相乘
关于MKL函数库的使用参见下面视频http://v.fcode.cn/video-use_library.html下面给出示例代码program TestMKLgemm use blas95 implicit none integer, parameter :: m = 2, k = 2, n = 2 real*8 :: A...原创 2019-07-02 13:32:34 · 2306 阅读 · 0 评论 -
fortran使用MKL中的DGEMM实现大矩阵相乘
program TestMKLDgemm use ifport, only : fdate implicit none real*8 :: alpha, beta integer :: i, j integer, parameter :: m = 5000, k = 5000, n = 5000 r...原创 2019-07-01 17:08:48 · 3114 阅读 · 0 评论 -
fortran:过程作为参数传递给其他过程
fortran语言允许将过程作为参数传递给其他过程,下面是示例代码:program test implicit none real, external :: func real :: x, y external :: sub x = 2.; y = 0. ...原创 2019-06-13 20:44:03 · 4104 阅读 · 0 评论 -
fortran:关于矩阵运算的matmul计算速度过慢解决方案
下面给出两个方阵相乘的示例代码. Z(m,L) = X(m,n) * Y(n,L). 其中X,Y,Z也可以是长阵program main use omp_lib !// 使用omp_lib并行 use ifport, only : fdate !// 使用fdate进行计算时间统计 implicit none integer,...原创 2019-06-02 13:31:25 · 5377 阅读 · 0 评论 -
fortran:计算卷积
计算卷积的物理意义与公式网上与书上很多,这里不再赘述。下面是计算两个向量u和v的fortran代码program test_conv !// 计算向量u和v的卷积 implicit none integer :: i, k integer, parameter :: m = 3, n = 8 !// 向量...原创 2019-05-26 19:42:19 · 1473 阅读 · 0 评论 -
fortran:函数重载示例
下面的代码展示了isnan函数的重载。功能:支持复数运算module overload interface isnan !// 重载函数isnan的接口 module procedure cmplx_isnan end interface contains logical ...原创 2019-05-24 11:13:52 · 1174 阅读 · 0 评论 -
fortran在外部过程使用假定形状数组
fortran在外部过程使用假定形状数组有两种方式。分别是写接口(interface)或是把对应的subroutine写在module中代码如下:1. 写interfaceProgram AssumedShape implicit none interface !.. 接口 subroutine test_AssumedShape( a ) ...原创 2018-11-08 18:49:25 · 1412 阅读 · 1 评论 -
fortran与python存储数组差异小记
这里以三维数组举例1. 先给出fortran代码integer :: a(8) = [1,2,3,4,5,6,7,8], b(2,2,2)b = reshape(a, shape(b))print*, b(:,:,1)将a向量reshape成为b数组后, 可简单地理解为:fortran存储数组元素以"left"优先所以上面代码的执行结果为: 1, 2, 3, 4print*, ...原创 2019-05-05 20:18:12 · 688 阅读 · 0 评论 -
fortran:使用内部函数fdate得到系统时间
program main use ifport, only : fdate implicit none print*, fdate()end program main原创 2019-04-18 13:25:15 · 1876 阅读 · 0 评论 -
fortran:使用IMSL函数库计算第一/二类完全椭圆积分
IMSL函数库是一款强大的商业函数库,高校学生或是老师可以使用教育邮箱进行申请。下面给出IMSL的官网https://www.roguewave.com/products-services/imsl-numerical-libraries接下来给出Fortran使用IMSL函数库计算第一类椭圆积分的示例代码program test include 'link_fnl_sh...原创 2019-05-16 17:05:07 · 2346 阅读 · 0 评论 -
fortran:计算第二类椭圆积分
下面代码的功能实现了第二类椭圆积分的计算。本代码借鉴于徐士良老先生的《fortran常用算法程序集 第二版》,再次向老先生致敬!!// 第二类椭圆积分示例!// 取k = 0.5, fai = pi/18 * i, i = 0, 1, ..., 10program main implicit none integer :: i real...原创 2019-03-17 11:10:51 · 2110 阅读 · 0 评论 -
fortran:计算第一类椭圆积分
此fortran代码实现了第一类椭圆积分。在此特别向徐士良老先生致敬。本代码借鉴于徐士良老先生的《fortran常用算法程序集 第二版》。实现代码如下!// 第一类椭圆积分示例!// 取k = 0.6, fai = pi/18 * i, i = 0, 1, ..., 10program main implicit none integer :: i ...原创 2019-03-16 20:43:26 · 3108 阅读 · 0 评论 -
fortran:判断一个数是否为素数
下面代码以2-30为数字区间,判断这个区间的哪些数字是素数logical :: log = .false.do n = 2, 30 do i = 2, n-1 if ( mod(n,i) == 0 ) then log = .true. print*...原创 2019-02-21 21:52:02 · 4376 阅读 · 0 评论 -
fortran:高斯法求积分
module Gauss_Legendre !//高斯—勒让德积分高斯点及权重的求解模块 implicit none integer, parameter :: n = 5 !// 设置求解高斯点的个数 integer, parameter :: DP = selected_real_kind( p=13 ) !// 设置kin...原创 2019-02-10 20:14:26 · 7952 阅读 · 10 评论 -
fortran文件操作之'append'; 'backspace'; 'endfile';
本次内容将讲一下文件操作的“高级技巧!”例如我要读取文件的最后一行数据,一般来说可以直接将前n-1行read过去,再进行读取本文将介绍一种新的方法,代码如下program main implicit none integer :: a open( 100, file = 'a.txt' ) !// 创建一个新文件并写入实验数据 ...原创 2018-12-08 12:57:53 · 6957 阅读 · 7 评论 -
fortran使用ivf扩展qsort排序实例
Program testQsort use ifport integer(2), external :: cmp_f1, cmp_f2 real(4) :: x(5) integer(sizeof_size_t) :: a_len, a_size x = [1.,-3.,2.,5.,4.] print*...原创 2018-11-26 11:12:38 · 1005 阅读 · 2 评论 -
fortran函数重载
某些情况下,我们需要对不同类型或不同数量的参数做相似或相同的操作,由于参数类型、数量不同,我们需要编写不同的函数来处理。比如求绝对值,如果参数是4字节整数,我们需要调用iabs函数;如果参数是4字节或8字节实数,我们需要分别调用sabs或dabs函数。由于需要记住多个功能相同或相近的函数,增加了我们使用这些函数的难度,同时也增加了出错的可能性,比如将实数传递给iabs函数。 上述...原创 2018-11-25 11:25:24 · 2098 阅读 · 0 评论 -
fortran面向对象编程简介
Module complex_class implicit none type, public :: complex_ob !.. 声明一个面向对象的type与对应的procedure private real :: re real :: im contains pr...原创 2018-11-13 00:37:11 · 3713 阅读 · 0 评论 -
fortran三次样条插值程序实例
Program testspline implicit none integer :: i integer, parameter :: n = 50, m = 100, dp = 8 real(dp) :: x(n), y(n), sx(m), sy(m), dsy(m) real(dp) :: x1 = -1.d...原创 2018-11-09 20:30:07 · 5895 阅读 · 6 评论 -
fortran数组函数
Module testMod implicit nonecontains function testfunc( n ) result( res ) implicit none integer :: i, n real :: res(n) forall ( i = 1:si...原创 2018-11-08 20:00:02 · 1676 阅读 · 0 评论 -
fortran2003新特性:可分配函数
Module testMod implicit nonecontains function testfunc( a ) result( res ) implicit none real, allocatable :: res(:) integer :: i real ...原创 2018-11-08 19:48:39 · 572 阅读 · 0 评论 -
fortran2003新特性:可分配数组用于外部过程的参数
Module testMod implicit nonecontains subroutine test_alloc( array ) !.. 如果外部调用,并且要返回array,则在此过程结束的地方不可以释放,必须在外部进行释放 implicit none real, allocatable :: array(:) ...原创 2018-11-08 19:29:07 · 526 阅读 · 0 评论 -
fortran过程中的save属性
fortran过程中的save属性一般有两种方式1. 在子程序或函数中添加save关键字代码如下:Program testsave implicit none integer :: i, n = 10 do i = 1, n call sub( i ) end do End program testsave ...原创 2018-11-08 19:07:15 · 6129 阅读 · 0 评论 -
fortran在过程中的使用指针
以下代码演示的是指针在过程中的使用功能:使用指针存储矩阵中的对角元素Program test_diagonal implicit none interface subroutine get_diagonal( ptr_a, ptr_b, error ) integer, dimension(:,:), pointer :: ptr_a ...原创 2018-11-07 13:44:52 · 1242 阅读 · 0 评论 -
fortran在function中传递指针
Program test_ptrfunction implicit none interface !.. function的参数为指针,所以要写interface或者将function写入到module中 function fifth( ptr_array ) integer, dimension(:), pointer :: fifth...原创 2018-11-07 14:14:28 · 1662 阅读 · 0 评论 -
fortran用派生数据实现链表
代码如下:Module chainTableMod implicit none type :: real_value real :: value type( real_value ), pointer :: next end type type( real_value ), pointer :: head t...原创 2018-11-07 00:23:40 · 1866 阅读 · 0 评论 -
fortran使用链表进行插入排序并转化为静态数组输出
代码如下:Module InsertionSortbyChainTableMod implicit none type :: values real :: val type( values ), pointer :: next end type t...原创 2018-11-07 00:27:02 · 697 阅读 · 0 评论 -
Fortran:实现矩阵直积
!.. 下面的fortran代码实现了Kronecker productfunction kron( a, b, m, n, p, q ) !.. 矩阵A:m*n; 矩阵b:p*q implicit none integer :: m, n, p, q real(kind=8) :: a(m,n), b(p,q), kron(m*p,n*q) integer :: i, j...原创 2018-10-12 20:32:17 · 1822 阅读 · 0 评论 -
利用fortran语言验证“抛硬币”的概率
使用ivf编译器Program main implicit none integer(kind=8) :: nn = 1000000000 !.. 设置抛硬币的总次数 integer(kind=8) :: m, n, i real(kind=8) :: a !.. a > 0.5: 设为硬币朝上;反之朝下 m = 0 !...原创 2018-10-27 19:40:02 · 467 阅读 · 0 评论 -
利用fortran语言实现区间的线性变换
!.. 本代码的功能:将[0,1)区间线性变换到[3.5,11.2)Program LinearTransform implicit none integer, parameter :: n = 10000 real :: x0 = 3.5, x1 = 11.2 real :: x(n), tranx(n) call random_seed(...原创 2018-10-31 19:26:52 · 495 阅读 · 0 评论 -
fortran数组与指针浅谈一
Program vp implicit none integer, target :: x(5) = [1,2,3,4,5] integer, pointer :: p(:) => null() p => x !.. 指针指向数组x print*, p(1) p(-1:) => p !.. 改变下标范围 ...原创 2018-11-01 21:30:44 · 1367 阅读 · 0 评论 -
fortran使用指针互换两个数组元素
Program main implicit none real, dimension(1000,1000), target :: array1, array2, tempArray real, dimension(:,:), pointer :: ptr1, ptr2, temptr call RANDOM_SEED call RAN...原创 2018-11-05 23:31:19 · 1809 阅读 · 2 评论 -
fortran实现正余弦变换
本来是想正余弦变换都做的,根据前人研究:正弦变换的结果比余弦更精确。所以本代码只做了正弦变化,如果读者想实现余弦变换,只需要把对应的正弦变换系数改为余弦变换系数即可。在末尾本文会给出250点正余弦变换系数。 代码如下:!.. 本代码将实现正余弦变换!.. 测试函数!.. ∫exp(-w)sin(wt)dw!.. 正弦变换离散表达式!.. f(t)=∑{K(w)*wsl}...原创 2018-10-05 10:01:04 · 1220 阅读 · 2 评论 -
Fortran:汉克尔积分数值方法
Module Hankel_trans implicit nonecontains!.. Fast Hankel Transform!.. New digital linear filters for Hankel J0 and J1 transforms!.. D Guptasarma, B Singh Geophysical prospecting, 1997!.. f(r...原创 2018-10-11 13:29:13 · 2672 阅读 · 4 评论