Fortran计算实例培训讲学

合集下载

Fortran-第一讲--第一章

Fortran-第一讲--第一章

1.3.1 声明部分


声明由不可执行语句组成 位于程序开头 定义程序名和程序引用的数据以及变量类型
PROGRAM语句用来指定程序的名字 程序名最长可达31个字符 由字母、数字和下划线任意组合而成 第一个字符必须是字母 如果存在PROGRAM语句,它必须是程序的第一个语句行 例:下列程序名是否有效,如无效则说明原因 new_program 3rd
无效的实数表示: -12.0E1.5

下列各组数在计算机里表示的值是否一样 4650. 4.65E+3 -12.71 -1.27E1 0.0001 1.0E4 3.14159E0 314.159E-3
1.5.3 字符类型



字符类型由字符串组成 字符常数是由单引号或双引号括住的字符串 在单引号或双引号之间括起来的部分称为字符文本, 字符文本可以采用任意计算机可以表示的字符,而 不受Fortran字符集限制 如果字符文本中含有单引号该怎么办?

这一转换仅仅是指参与操作的两个操作数类型 分别为实数和整数而言
表达式
1 2 3 1+1/4 1.0+1/4 1+1.0/4
结果
1 1.0 1.25
因为混合运算的情况是如此复杂,所以我们在程序中要尽量避免这种情 况发生
练习
下面的程序段的三个赋值语句是否正确,正 确写结果,错误说明原因 INTEGER :: i,j INTEGER, PARAMETER :: K=4 i = K **2 j = i/K K=i+j
简单地说:学完本章,你应该可以编写除函数以外的简单程序
1.1 Fortran字符集
正如英语的学习从abc开始,Fortran的学习 也是从字符集开始

fortran数值计算基础

fortran数值计算基础

数值计算基础目录实验一直接法解线性方程组的 (2)实验二插值方法 (11)实验三数值积分 (5)实验四常微分方程的数值解 (7)实验五迭代法解线性方程组与非线性方程 (9)实验一 直接法解线性方程组一、实验目的掌握全选主元消去法与高斯-塞德尔法解线性方程组。

二、实验内容分别写出Guass 列选主元消去法与追赶法的算法,编写程序上机调试出结果,要求所编程序适用于任何一解线性方程组问题,即能解决这一类问题,而不是某一个问题。

实验中以下列数据验证程序的正确性。

1、用Guass 列选主元消去法求解方程组⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--5.58.37.33.47.11.85.16.93.51.53.25.2321x x x2、用追赶法求解方程组⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡-=⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡-----000010210000210000210000210000254321x x x x x 三、实验仪器设备与材料主流微型计算机四、实验原理1、Guass 列选主元消去法 对于AX =B1)、消元过程:将(A|B )进行变换为)~|~(B A ,其中A ~是上三角矩阵。

即:⎪⎪⎪⎪⎪⎭⎫⎝⎛→⎪⎪⎪⎪⎪⎭⎫ ⎝⎛n nn nnn nnn n nn b a b a b a a b a a a b a a a b a a a0010122111221222221111211 k 从1到n-1a 、 列选主元选取第k 列中绝对值最大元素ik ni k a ≤≤max 作为主元。

b 、 换行ik ij kj b b n k j a a ⇔+=⇔,,1,c 、 归一化kkk k kj kk kj b a b n k j a a a ⇒+=⇒/,,1,/d 、 消元nk i b b a b n k j n k i a a a a i k ik i ij kj ik ij ,,1,,,1;,,1, +=⇒-+=+=⇒-2)、回代过程:由)~|~(B A 解出11,,,x x x n n -。

第2章 Fortran程序设计基础PPT课件

第2章 Fortran程序设计基础PPT课件

SUBRO UTINE 、MO NEY 、< = 都是非法的。
一般情况下,记号之间需留有空格。例如:100CONTINUE 是非法的, 因为标号100 和关键字 CONTINUE 是两个独立的记号。
有的记号间的空格是可选的,例如:END PROGRAM 和 ENDPROGRAM是 合法的。
四. 注释
END
注释行
注:其中处于同一水平位置的各语句之间没有严格的前后 顺序,而不同的行则表示了严格的在程序当中出现的前后 顺序。
语句顺序的一般原则:
程序段的段头语句,只能ຫໍສະໝຸດ 现在每个程序段开始的位置。如: PROGRAM、FUNCTION、SUBROUTINE、BLOCK、DATA、MODULE等;
如果出现USE语句,则只能出现在段头语句之后、其他语句之前; IMPLICIT NONE语句应紧跟在USE语句之后,在其他说明语句之前; FORMAT语句和DATA语句也可以放置在可执行语句中间,不过把DATA
* 固定格式是为配合早期使用穿孔卡片输入程序所发明的 格式, 这里介绍固定格式,只是让大家对 Fortran 77 程序有所了解,建议大家在编写程序时采用前述地自由 格式。
* 固定格式尽管有其过多的限制,但由于具有一定的规范 性,方便程序的编写和检查。
二、自由格式
自由格式是Fortran 90之后的新写法,是目前最流行的书写格 式,取消了许多限制。没有规定每行的第几个字符有什么作用。
固定格式说明:
一行共80列,分为4个区: 第1-5列,标号区,可以空白,也
可以出现符号;
第6列,续行标志区,可以空白( 无续行),非0字符(续行 );
第7-72列,语句区,语句区的书写 可以从任意一列开始,空白 编译时被忽略,一行只能书 写一个语句;

Fortran讲义 第七章

Fortran讲义 第七章

派生类 型的使 用
结构体的赋值
结构体成员单独赋值 用结构体构造函数赋值
结构体成员的引用:% 结构体成员的引用:
派生类 型的使 用
结构体的输入输出
整体操作时按派生类型定义的顺序 整体操作时不能包含可变大小的成员
exam_7_1
作为形参或函数的返回值
exam_7_2
BASIC_DATA.F90
派生类 型的使 用
结构体的声明
exam_7_1
变量声明语句中类型名用“type(派生类型名称) 变量声明语句中类型名用“type(派生类型名称)”替 换
结构体的初始化
派生类型定义时的初始化(缺省初始化) 派生类型定义时的初始化(缺省初始化) 结构体声明时用结构体构造函数初始化 显式初始化) 结构体构造函数初始化( 结构体声明时用结构体构造函数初始化(显式初始化) 语句中用结构体构造函数初始化 在data语句中用结构体构造函数初始化(显式初始化) 语句中用结构体构造函数初始化(显式初始化)
第七章 派生类型
派生类型 的基本概 念
派生类型用于表示包含不同类型 派生类型用于表示包含不同类型变量的集合 不同类型变量的集合
基本数据类型
指针类型
其它派生类型Leabharlann 派生类型的实例称为结构体派生类 型的定 义
type[[,<访问属性>]::]<派生类型名称> type[[,<访问属性>]::]<派生类型名称> [[,<访问属性>]::]<派生类型名称 [sequence] sequence] [private] private] {成员声明} 成员声明} end type [派生类型名称] 派生类型名称] <访问属性>→public|private 访问属性> public|

Fortran 第六讲

Fortran 第六讲

SUM (ARRAY,MASK) 计算ARRAY中MASK为真的元素的和。MASK为 可选的,如果不提供,计算数组中所有元素的和
TRANSPOSE(MATRIX) 将MATRIX转置后返回
更多的变换函数可以参考教材的附录A的数组函数 部分
这些函数都很有用,我们在以后的例程或习题会涉 及到一部分,请诸位养成查阅这一附录的习惯
说明: WHERE结构中的每个mask_expr是一个逻辑数组, 它应该确保和数组执行语句中处理的数组具有同 样的结构。 WHERE结构使得语句体1中的操作或操作集用于 mask_expr1为TRUE的所有数组元素上,语句体2 中则作用于mask_expr1为FALSE而mask_expr2为 TRUE的所有数组元素上,最后,语句体3作用于 mask_expr1和mask_expr2均为FALSE的所有数组 元素上
6.3 WHERE结构
6.1中,我们学习了如何操作部分数组 INTEGER :: a(10) a(3:5)=3 将a(3),a(4),a(5)赋值为3
如果我们要对满足某个条件的所有元素进行操作 WHERE (a<0) a=ABS(a) END WHERE 将a中所有小于0的元素取绝对值
一般形式 [name:] WHERE (mask_expr1) 数组操作语句体1 ELSEWHERE (mask_expr2) [name] 数组操作语句体2 ELSEWHERE [name] 数组操作语句体3 END WHERE [name]
动态分配一个二维数组 通过status返回分配状态 如果分配成功,status为0,否则不为0
总是使用STAT=status监视分配状态,以便准确知道 程序异常终止的原因
ALLOCATED()函数 ALLOCATED(array) 如果已经用ALLOCATE()给ARRAY分配了空间 那么函数返回值是.TRUE. 否则为.FALSE. 例: IF (ALLOCATED(array)) THEN array=1 ELSE WRITE(*,*) ‘Warning : Array not allocated!’ END IF

Fortran的讲义第五章共21页文档

Fortran的讲义第五章共21页文档

ASSEM_FORCE.f90
<where语句>→wt;
<where语句>→[<标签>:]where(<屏蔽表达式>) {<赋值语句>}
else where(<屏蔽表达式>)[<标签>] {<赋值语句>}
{else where(<屏蔽表达式>)[<标签>] {<赋值语句>}}
给单个数组元素赋值
用数组构造器赋值(Fortran90)
两种格式:(/…/) 或 […] 只能给一维数组(或数组片段)赋值 可以是常量、表达式、三元组、隐式do循环或数组片段
用reshape语句给多维数组(或数组片段)赋值
数组元素赋值
exam_5_2
条件赋值(where)- Fortran90
第m次消元
m1,2,...n,
A (m ) AA mj
(m 1 ) mj
(m 1 ) mm
jm ,m 1 ,.n ..b ,m (m )b A m ( m (m m 1 1 )m )
pure函数(Fortran95): 确保函数不影响程序其它部分的状态
数组元素赋值
条件赋值(forall)- Fortran95
exam_5_2
<forall语句> → forall(<三元组>{, <三元组>}[,<屏蔽表达式>]) <赋值语句
>
<forall语句>→ [<标签>:]forall(<三元组>{, <三元组>} [,<屏蔽表达式>]) <赋值语句> {<赋值语句>} end forall[<标签>]

Fortran程式语言的编、译与执行简述培训课件.ppt

Fortran程式语言的编、译与执行简述培训课件.ppt

二、Fortran 程式語言編譯
將 c 磁碟的 mingw 目錄的 bin 子目錄的 g77.exe複製到 工作目錄下
來將 福傳檔案 *.for 編譯為 可執行檔 *.exe
二、Fortran 程式語言編譯
Fortran程式語言編譯指令(2) g77.exe 已經單獨複製到 C 碟之工作目錄 cjs 下
七、運算指令指令
電腦計算可使用之操作種類
加法運算:+ 減法運算: 乘法運算:* 除法運算:/ 冪次方運算:**;^
Ans = -(a+(b*c-d**3.)*25.+e*e*e)/2. 運算式中之運算次序依一般數學運算次序
八、控制指令
〔if ( ) goto no.〕 〔if ( ) then // else // endif〕 〔do no. // no. continue〕 〔call sub_name ( ) 〕
執行 〔t1 〕 結果 〔7〕
游標閃爍 - - 待 令狀態
四、MS-DOS 作業環境的瀏覽
執行 〔dir 〕 瀏覽工作目 錄下之檔案 與目錄
〔dir/p 〕 〔dir/w 〕 〔dir*.for 〕 〔dir*.* 〕
五、電腦語言漫談
電腦計算可使用之操作種類
一、檔案(文書)編輯
編輯完成 執行儲存
二、Fortran 程式語言編譯
在工作目錄cjs 下呼叫 c 磁碟的 mingw 目錄的 bin 子目錄的 g77.exe
來將 福傳檔案 *.for 編譯為 可執行檔 *.exe
二、Fortran 程式語言編譯
Fortran程式語言編譯指令(1)
加法運算:+ 減法運算: 乘法運算:* 除法運算:/ 冪次方運算:**;^

Fortran讲义 第四章

Fortran讲义 第四章

输入输 出的格 式
隐式格式(implicit 隐式格式(implicit format)
表控格式(list 表控格式(list directed) 名称列表(namelist 名称列表(namelist directed) * 不能用于内部记录
显式格式(explicit 显式格式(explicit format) 无格式(unformatted) 无格式(unformatted)
输入输出项的个数等于 输入输出项的个数等于格式编辑符个数 等于格式编辑符个数
输入输出项的个数大于 输入输出项的个数大于格式编辑符个数 大于格式编辑符个数
<输出语句>→ 输出语句>
[{<表达式 [{<表达式>}]| 表达式>}]| print <格式> [,{<表达式>}] 格式> [,{<表达式 表达式>}]
标准输入输出设备
write“ write“(”<设备>[, <格式>][, <状态和控制符>]“)” 设备>[, 格式>][, 状态和控制符>] >]“
exam_4_6
显式格式 输入输出
纵向走纸控制
格式说明的首字符 (空格) 空格) 0(数字 0(数字0) 数字0) 1(数字 1(数字1) 数字1) +(加号 +(加号) 加号) 其它字符 纵向间隔控制功能 移到下一行开头 移到下面第二行开头 移到下一页第一行开头 移到当前行开头 移到下一行开头
exam_4_7
无格式( 无格式(unformatted 二进制) 二进制)
输入输 出语句
<输入语句>→ 输入语句>
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

主 体
do 50 i=2,im-1

d1(i)=0.5d0*(d(i-1)+d(i+1))-dt*(u(i)*(d(i+1)-d(i-1))/2.d0/dx+

+
d(i)*(u(i+1)-u(i-1))/2.d0/dx)
u1(i)= 0.5d0*(u(i-1)+u(i+1))-dt*(u(i)*(u(i+1)-u(i-1))/2.d0/dx+ 可考虑
+
(t(i+1)-t(i-1))/2.d0/dx +t(i)/d(i)*(d(i+1)-d(i-1))/2.d0/dx) 加入人 为耗散
t1(i)=0.5d0*(t(i-1)+t(i+1))-dt*(u(i)*(t(i+1)-t(i-1))/2.d0/dx+
50 +
(gamma-1.d0)*t(i)*(u(i+1)-u(i-1))/2.d0/dx)
可采用另一计时变量,如tp, 其初值为0, tp=tp+dt,待tp快接近0.02,dt=0.02-tp, 然后输出结果,并重新令tp=0.
实例之二
1. 建模
磁场扩散
磁场扩散方程(仅1D)
初条
B(x,0) BB 0, 0, xx00
B 2B
t
解析解 B(x,t)2B 0 x/ 4teu2du 0
d1 (1)= d (1)
u1(1)= u (1)
t1(1)= t (1)
d1 (im)= d (im)

u1(im)= u (im)

t1(im)= t (im)

tim=tim+dt

dt=1.d0
do 60 i=2,im-1
固定边界条件
局地无量 纲声速
由柯朗条件定 下一时间步长
60
dt=dmin1(dt,dx/(dsqrt(gamma*t1(i))+dabs(u1(i)))
பைடு நூலகம்
模型方程
u t
2u x 2
1
全隐格式
u i n 1 u i n x t 2u i n 1 1 2 u i n 1 u i n 1 1
精度:O(t,x2) 稳定条件:恒稳
u in 1 1 (2 x2 t)u in 1 u in 1 1 x2 tu in
c
a
do 30 i=(im+1)/2+1,im
d1(i)=1.d-1
u1(i)=0.d0
30
t1(I)=1.d0
划分网格 设定初值
tim=0.d0
初始时间
dt=0.9d0*dx
初始时间步长
999 continue
do 40 i=1,im
d (i)= d1 (i) u(i)= u1 (i)
赋新值
40
t(i)= t1(i)
4. 选取适当的差分格式
模型方程
u c u 0
t
x
Lax格式或Friedrichs格式
u i n 1 1 2 u i n 1 u i n 1 2 c x tu i n 1 u i n 1
精度:O(t, x2 ,x2) 稳定条件: t x
t
|c |
对流体力学问题,其稳定条件为
If(dt.le.1.e-9) then输出”dt太小”并goto 888
goto 999
888 close(10) End
停止运算的 无量纲时间
Subroutine output(tim,d1,u1,t1)
…..
If(tim.eq.0)open(10,…..form=‘unformatted’)
write(10)d,u,t Return end
a, b,c 系数
可将3个变量一起 放在一个2维数组
设定常数
dx=1./dble(im-1)
do 10 i=1,im
x(i)=dx*dble(im-1)
10
continue
do 20 i=2, im
20
b1(i)=1.d0
b1(1)=0.d0
划分网格 设定初值
tim=0.d0
dt=(x(2)-x(1))**2
Fortran计算实例
3. 确定解域、划分网格及设置边界条件
可划分为上 千个格点
1
模拟区域: 网 格:
边 条:
0
1x1
x
1
x(i)2 (i 1 )/N ( 1 ) 1 均匀网格(最好用自适应网格)
fn(1 )f0 (1 ); fn(N )f0 (N ),f其 ,u ,T 中
在激波传播至边界之前有效
b
s
5. 编程及调试
program diffusion parameter(im=1001) implicit double precision(a-h,o-z) dimension x(im),bb(im) dimension b1(im) Dimension a(im),b(im),c(im),s(im) b0=1.67d-5 t0=1.d5 L0=1.d5 ……
d: 密度; u: 速度;t: 温度
可将3个变量一起 放在一个2维数组
设定常数
dx=2.d0/dble(im-1)
do 10 i=1,im
x(i)=dx*dble(i-1)-1.
10
continue
do 20 i=1,(im+1)/2
d1(i)=1.d0
u1(i)=0.d0
20
t1(i)=1.d0
t
x cs | u |
5. 编程及调试
program shocktube parameter(im=1001) implicit double precision(a-h,o-z) dimension x(im),d(m),u(im),t(im) dimension d1(m),u1(im),t1(im) d0=1.67d-5 t0=3.d2 r=2.78d-2 v0=dsqrt(r*t0) L0=10 gamma=1.4d0 ……
Continue write(*,*)tim,dt
屏幕输出供调试
如0.02, 0.04, 0.06, 0.08,……。即每0.02 时间间隔则将结果输出到数据文件。



if(tim在某些时刻)call output(tim,d1,u1,t1)

if(输出结果的次数等于tend/0.02)goto 888
2. 无量纲化
B B0B*
x L0x*
t
L2 0
t*
B 2B t
3. 确定解域、划分网格及设置边界条件
B
可划分为上
1
千个格点
x
0
1
模拟区域: 网 格: 边 条:
0x1 x(i)(i1)/N (1)
B n(1 )0 ; B n(N )B 0(N )
扩散至边界之前有效
均匀网格
4. 选取适当的差分格式
相关文档
最新文档