【Fortran学习笔记1】--程序基本结构与数据类型

前言

Fortran是一种古老的编程语言,它的设计初衷是用于科学计算和数值分析。

Fortran = Formala+Translator,称为公式翻译器。

其广泛应用于数值计算领域,在气象和海洋等领域主要用于数值模式的开发和优化。

数值模拟:用计算机对数学物理模型数值计算求解,进行可视化分析,达到对问题的研究目的。

公式翻译器:把数学物理模型中的公式变成计算机能理解的语言,以此来求解问题。

一、程序的基本结构

program main
....
stop !程序停止运行,可以用于条件判断中
pause !暂停程序执行,按enter继续运行
end program main

一个标准fortran程序需要以program 【程序名】作为程序的开头,以End program 【程序名】作为程序的结束,结尾也可以直接写end。但是写全更加容易读懂代码,代码更加规范。

其中,main是函数名,stop可以用于结束程序的运行,一般用于条件判断中,pause用于暂停程序执行,敲击键盘继续执行。

end终止程序是一定要有的,表明程序编写完毕。

二、输入和输出

1、输入和输出命令

①write命令

write(*,*)a
write(unit=6,fmt=*)"string"

 第一个*,是输出位置, 第二个 * 是输出格式

②print命令

print *,a

用print命令输出则不限定输出格式。

③read命令

read(*,*)a

2、格式化输入和输出

这里将的100是一个格式号,在输出时候第二个*填写100可以直接代替format(I4)功能

Program main
    integer::a=20
    write(*,100)a
    100 format(I4)!使用行代码,设置输出位整型,宽度为4
    write(*,"(2I4)")a,b  !输出2个,a ,b
    stop
end

 write(*,"(2I4)")a,b等价于write(*,"(I4,I4)")a,b

三、基本数据类型

1、整型(integer)

格式:integer::a

integer::a

①赋值长整型

以下三种写法是一样的效果

integer(kind=4)a !fortran90新增
integer*4 b !fortran77传统
integer(4)c !fortran77传统

②赋值短整型

integer(kind=2)a !fortran90新增
integer*2 b !fortran77传统
integer(2)c !fortran77传统

2、浮点数(real)

格式:real a 或者 rean::a

①赋值单精度

real(kind=4)a !fortran90新增
real*4 b !fortran77传统
real(4)c !fortran77传统

②赋值双精度

real(kind=8)a !fortran90新增
real*8 b !fortran77传统
real(8)c !fortran77传统

 3、复数(complex)

格式:complex a

复数由实部和虚部组成,在fortran中由两个浮点数来表示。

①单精度

complex(kind=4)a !fortran90新增
complex*4 b !fortran77传统
complex(4)c !fortran77传统

②双精度

complex(kind=8)a !fortran90新增
complex*8 b !fortran77传统
complex(8)c !fortran77传统

4、字符与字符串

格式:character a

声明字符:

character(len=10)a 
complex(10)b
complex*c
character *10d

ps:字符串连接使用   //   完成 

5、逻辑型(logical)

格式:logical a

a=.true

a=.false

 6、获取字符串长度

len:返回字符串长度

len_trim:返回实际使用长度

Program example
    character(20)::string
    write(*,*)len(string)
    write(*,*)len_trim(string)
end
输出:
20
13

7、自定义数据类型

 

type::person
    character(len=10)::none
    integer::age
    real::hight
    real::weight
    character(len=50)::address
end type person

赋值方式1:全部赋值

a=person("peter",20,170,60,"China")

赋值方式2:单独赋值

b%name=...

单独对name这一个数据赋值 

四、各类声明

1、implicit命令

在Fortran中,变量不一定要经过经过声明数据类型。

变量名为:I、J、K、L、M、N、会视为整型变量。

其它则为浮点型

而implicit可以用于设置变量的默认类型。

如:

implicit integer(A,B,C)!则以ABC开头的变量都会视为整型

implicit (A-F,I,K)!以A到F开头的变量,和I,K开头的变量都会视为整型。

在Program main 的下一行加入implicit none,可以禁止该行为。

2、常量声明

格式:

real,parameter::Pi=3.1415926

或者

real Pi

parameter(Pi=3.1415926)

ps:被parameter声明的常量只能赋值一次,再次赋值会报错。

3、等价声明

格式:

equivalence(a,b)

使a,b共用一块内存空间。

4、声明位置(特别注意)

以下是错误写法:

Program Hello
    implicit none
    integer::a=2
    write(*,*)a
    integer::b=5 !这里再次使用整型声明会报错
    write(*,*)b
End Program Hello

正确写法:

Program Hello
    implicit none
    integer::a=2
    integer::b=5
    write(*,*)a
    write(*,*)b
End Program Hello

 Fortran的一个特点是它的静态类型系统,这意味着变量的类型在编译时就需要确定,并且不能在运行时改变。因此,在输出之后声明变量可能会导致类型不匹配的问题,因为输出语句通常需要根据变量的类型进行格式化。Fortran在输出之后不能声明变量是由于其静态类型系统和历史版本的限制所导致的。现代的编程语言通常允许在任何地方声明变量,并且具有更灵活的类型系统。如果您需要更灵活的变量声明和使用方式,可以考虑使用其他编程语言。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用Fortran编写的Inverse-free Krylov程序示例: ``` program inverse_free_krylov implicit none integer :: n, maxiter, i, j, iter real :: tol, alpha, beta, error real, dimension(:), allocatable :: x, v, w, q, h, y real, dimension(:,:), allocatable :: qh, r character(len=80) :: inputfile ! 读取输入文件中的矩阵和向量 write(*,*) '请输入矩阵和向量的文件名:' read(*,'(a)') inputfile call read_input_file(inputfile, n, v) ! 初始化参数 maxiter = 100 tol = 1e-6 iter = 0 error = 0.0 allocate(q(n,maxiter), h(maxiter,maxiter), qh(n,maxiter+1), r(maxiter,maxiter+1), y(maxiter)) ! 开始迭代 do while (iter < maxiter .and. error > tol) iter = iter + 1 ! 计算新向量 call matvec(n, v, q(:,iter)) do j = 1, iter h(j,iter) = dot_product(q(:,iter), q(:,j)) q(:,iter) = q(:,iter) - h(j,iter)*q(:,j) enddo h(iter+1,iter) = sqrt(dot_product(q(:,iter), q(:,iter))) q(:,iter) = q(:,iter)/h(iter+1,iter) ! 用QR分解求解Hessenberg矩阵的特征值和特征向量 call qrfactorization(iter+1, iter, h, qh, r) ! 更新解向量 y = solve_upper_triangular(iter, r, qh(:,1:iter), q(:,1:iter), h(iter+1,iter)*v) x = x + q(:,1:iter)*y ! 判断收敛 error = norm2(q(:,iter+1)*h(iter+1,iter)) enddo ! 输出解向量 write(*,*) '解向量:' do i = 1, n write(*,'(f8.4)') x(i) enddo ! 释放内存 deallocate(q, h, qh, r, y, v) contains ! 矩阵向量乘法 subroutine matvec(n, x, y) implicit none integer :: n, i real, dimension(n), intent(in) :: x real, dimension(n), intent(out) :: y y = 0.0 do i = 1, n y = y + x(i)*a(:,i) enddo end subroutine matvec ! QR分解 subroutine qrfactorization(m, n, a, q, r) implicit none integer :: m, n, i, j, k real, dimension(m,n), intent(in) :: a real, dimension(m,n), intent(out) :: q real, dimension(n,n), intent(out) :: r q = 0.0 r = 0.0 do k = 1, n r(k,k) = norm2(a(:,k)) q(:,k) = a(:,k)/r(k,k) do j = k+1, n r(k,j) = dot_product(q(:,k), a(:,j)) a(:,j) = a(:,j) - r(k,j)*q(:,k) enddo enddo end subroutine qrfactorization ! 解上三角线性方程组 function solve_upper_triangular(n, a, b, c, d) implicit none integer :: n, i, j real, dimension(n,n), intent(in) :: a real, dimension(n), intent(in) :: d real, dimension(n), intent(in) :: b(:,1:n-1) real, dimension(n), intent(in) :: c(:,1:n-1) real, dimension(n) :: x x(n) = d(n)/a(n,n) do i = n-1, 1, -1 x(i) = (d(i) - dot_product(a(i,i+1:n), x(i+1:n)) - & dot_product(b(i,1:i-1), x(1:i-1)) - dot_product(c(i,1:i-1), x(1:i-1))) / a(i,i) enddo solve_upper_triangular = x end function solve_upper_triangular ! 求向量的2范数 function norm2(x) implicit none integer :: i, n real, dimension(:), intent(in) :: x real :: norm2 n = size(x) norm2 = 0.0 do i = 1, n norm2 = norm2 + x(i)**2 enddo norm2 = sqrt(norm2) end function norm2 ! 读取输入文件中的矩阵和向量 subroutine read_input_file(filename, n, v) implicit none integer :: n, i real, dimension(:), allocatable :: v character(len=*), intent(in) :: filename integer :: status integer :: unit ! 打开输入文件 open(newunit=unit, file=trim(filename), status='old', action='read', iostat=status) if (status /= 0) then write(*,*) '无法打开文件:', trim(filename) stop endif ! 读取矩阵和向量 read(unit,*) n allocate(v(n)) do i = 1, n read(unit,*) v(i) enddo ! 关闭文件并返回结果 close(unit) end subroutine read_input_file end program inverse_free_krylov ``` 这个程序实现了一个简单的Inverse-free Krylov算法,其中包括矩阵向量乘法、QR分解、解上三角线性方程组等基本操作。在实际使用中,需要根据具体的问题进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值