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 x

2、用追赶法求解方程组

??

?

??????

???????-=????????????????????????????????-----000010210000210000210000210000

254321x x x x x 三、实验仪器设备与材料

主流微型计算机

四、实验原理

1、Guass 列选主元消去法 对于AX =B

1)、消元过程:将(A|B )进行变换为)~|~(B A ,其中A ~

是上三角矩阵。即:

????

??

?

??→

??????? ??n nn

n

n n nn

n n n

n b a b a b a a b a a a b a a a b a a a 0

01

01221112

2

1

222221111211 k 从1到n-1

a 、 列选主元

选取第k 列中绝对值最大元素ik n

i k a ≤≤max 作为主元。

b 、 换行

i

k ij kj b b n k j a a ?+=?,,1,

c 、 归一化 k

kk k kj kk kj b a b n k j a a a ?+=?/,,1,/

d 、 消元

n

k 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 -。

1

,2,,1,/1

-=?-

?∑+=n k x x a

b x a b k n

k j j kj

k n

nn n

2、追赶法 线性方程组为:

??

????????

? ??=??????????? ????????????? ?

?-----n n n n n n

n n n f f f f f x x x x x a b c a b c a b c a b c a 132********

3

3

3

22211

做LU 分解为:

??

??

???

?

?

?

??=??????????

?

?=-1111,1213

3221n n n R L βββαγαγαγα

分解公式:

????

?

????

-===-====-)1,,2,1(),,3,2(,),,3,2(1

11n i c n i b b n i a i i i i i i i i i αββγααγ 则

?

?

?==?=?=y Ux f

Ly f LUx f Ax 回代公式:

???

???

?

=-==-)

,,3,2(1

111n i y f y f y i i i i i αγα

??

?--=-==+)

1,,2,1(1

n n i x y x y x i i i i n n β

五、实验步骤

1、理解并掌握全选主元消去法与高斯-塞德尔迭代法公式;

2、画出全选主元消去法与高斯-塞德尔迭代法的流程图

3、使用C 语言编写出相应的程序并调试验证通过

六、实验报告要求

1、统一使用《武汉科技大学实验报告》本书写,实验报告的内容要求有:实验目的、实验内容、程序流程图、源程序、运行结果及实验小结六个部分。

2、源程序需打印后粘贴在实验报告册内;

3、运行结果以屏幕截图形式保存并打印后粘贴在实验报告册内。

七、实验注意事项

注意如何定义数据结构以保存矩阵和解以降低算法的复杂性。

八、思考题

若使用全主元消去法,在编程中应如何记录保存对于未知数的调换。

实验二 插值方法

一、实验目的

掌握拉格郎日插值法与牛顿插值法构造插值多项式。

二、实验内容

分别写出拉格郎日插值法与牛顿插值法的算法,编写程序上机调试出结果,要求所编程序适用于任何一组插值节点,即能解决这一类问题,而不是某一个问题。实验中以下列数据验证程序的正确性。

已知下列函数表

求x=0.5635时的函数值。三、实验仪器设备与材料

主流微型计算机

四、实验原理

已知n 个插值节点的函数值,则可由拉格郎日插值公式与牛顿插值公式构造出插值多项式,从而由该插值多项式求出所要求点的函数值。拉格郎日插值公式与牛顿插值公式如下:

1、Lagrange 插值公式

)

()(...)()()(0

1100x l y y x l y x l y x l x L n

k k k n n n ∑==+++=∏

≠=+-+---=----------=n k

j j j

k j n k k k k k k k n k k k x x x x x x x x x x x x x x x x x x x x x x x x x l 011101110)())(())(()

())(())(()( 2、Newton 插值公式

)

())(](,,[)

)(](,,[)](,[)()(11010102100100----++--+-+=n n n x x x x x x x x x f x x x x x x x f x x x x f x f x N

五、实验步骤

1、理解并掌握拉格郎日插值法与牛顿插值法的公式;

2、画出拉格郎日插值法与牛顿插值法算法的流程图;

3、使用C 语言编写出相应的程序并调试验证通过。

六、实验报告要求

1、统一使用《武汉科技大学实验报告》本书写,实验报告的内容要求有:实验目的、

实验内容、程序流程图、源程序、运行结果及实验小结六个部分。

2、源程序需打印后粘贴在实验报告册内;

3、运行结果以屏幕截图形式保存并打印后粘贴在实验报告册内。

七、实验注意事项

Newton插值法在编程时应注意定义何种数据结构以保存差商。

八、思考题

比较Lagrange插值法与Newton插值法的异同。

实验三 数值积分

一、实验目的

掌握复化梯形法与龙贝格法计算定积分。

二、实验内容

分别写出变步长梯形法与Romberge 法计算定积分的算法,编写程序上机调试出结果,要求所编程序适用于任何类型的定积分,即能解决这一类问题,而不是某一个问题。实验中以下列数据验证程序的正确性。

00001.0,sin 1

0≤?εdx x x

三、实验仪器设备与材料

主流微型计算机

四、实验原理

通过变步长梯形法与龙贝格法,我们只要知道已知n 个求积节点的函数值,则可由相应的公式求出该函数的积分值,从而不需要求该函数的原函数。变步长梯形法与龙贝格法公式如下:

1、变步长梯形法

∑∑-=-=+++=+=1

11

01)]()(2)([2)]

()([2

n i i n i i i n b f x f a f h

x f x f h

T

∑-=++=1

2/12)(221n i i n n

x f h T T

用ε≤-n n T T 2来控制精度 2、龙贝格法

∑-=++=1

2/12)(221n i i n n

x f h T T

n n n T T S 31342-=

n

n n S S C 15115162-= n

n n C C R 63163642-=

用ε≤-n n R R 2来控制精度

五、实验步骤

1、理解并掌握变步长梯形法与龙贝格法的公式;

2、画出变步长梯形法与龙贝格法的流程图

3、使用C 语言编写出相应的程序并调试验证通过

六、实验报告要求

1、统一使用《武汉科技大学实验报告》本书写,实验报告的内容要求有:实验目的、实验内容、程序流程图、源程序、运行结果及实验小结六个部分。

2、源程序需打印后粘贴在实验报告册内;

3、运行结果以屏幕截图形式保存并打印后粘贴在实验报告册内。

七、实验注意事项

?1

0sin dx x x

积分中,被积函数在x=0点函数值为1,对该点在程序设计中应注意对其

的定义。

八、思考题

使用复化梯形法与复化Simpson 法来计算该问题有何缺点?

实验四 常微分方程的数值解

一、实验目的

掌握改进欧拉法与四阶龙格-库塔求解一阶常微分方程的初值问题。

二、实验内容

分别写出改进欧拉法与四阶龙格-库塔求解的算法,编写程序上机调试出结果,要求所编程序适用于任何一阶常微分方程的数值解问题,即能解决这一类问题,而不是某一个问题。实验中以下列数据验证程序的正确性。

求??

?≤≤=-=')

50(2

)0(2

x y xy y 步长h=0.25。

三、实验仪器设备与材料

主流微型计算机

四、实验原理

常微分方程的数值解主要采用“步进式”,即求解过程顺着节点排列次序一步一步向前推进,在单步法中改进欧拉法和四阶龙格-库塔法公式如下:

1、改进欧拉法

),(1n n n n y x hf y y +=+

)]

,(),([2111+++++=n n n n n n y x f y x f h

y y

2、四阶龙格-库塔法

????

?

??

???

???

++=++=++==++++=+)

,()2

,2()2,2(),()22(6

3423

12143211

hk y h x f k k h y h x f k k h y h x f k y x f k k k k k h y y n n n n n

n n n n n 五、实验步骤

1、理解并掌握改进欧拉法与四阶龙格-库塔法的公式;

2、画出改进欧拉法与四阶龙格-库塔法的流程图

3、使用C 语言编写出相应的程序并调试验证通过

六、实验报告要求

1、统一使用《武汉科技大学实验报告》本书写,实验报告的内容要求有:实验目的、实验内容、程序流程图、源程序、运行结果及实验小结六个部分。

2、源程序需打印后粘贴在实验报告册内;

3、运行结果以屏幕截图形式保存并打印后粘贴在实验报告册内。

七、实验注意事项

??

?≤≤=-=')

50(2

)0(2

x y xy y 的精确解为)1/(22x y +=,通过调整步长,观察结果的

精度的变化

八、思考题

如何对四阶龙格-库塔法进行改进,以保证结果的精度。

实验五 迭代法解线性方程组与非线性方程

一、实验目的

掌握高斯-塞德尔迭代法求解线性方程组与牛顿迭代法求方程根。

二、实验内容

分别写出高斯-塞德尔迭代法与牛顿迭代法的算法,编写程序上机调试出结果,要求所编程序适用于任何一个方程的求根,即能解决这一类问题,而不是某一个问题。实验中以下列数据验证程序的正确性。

1、高斯-塞德尔迭代法求解线性方程组

?????

???????-=????????????????????????----01741323151122231592127

4321x x x x 2、用牛顿迭代法求方程013=--x x 的近似根,00001.0≤ε,牛顿法的初始值为1。

三、实验仪器设备与材料

主流微型计算机

四、实验原理

二分法通过将含根区间逐步二分,从而将根的区间缩小到容许误差范围。牛顿通过迭代的方法逐步趋进于精确解,该两种方法的公式如下:

1、高斯-塞德尔迭代法

1)判断线性方程组是否主对角占优

n i a a

ii n

i

j j ij

,,2,1,1

=≤∑≠=

2)直接分离xi ,即

n i a x b d x ii n

j j ij i i ,,2,1,/)(1

=-=∑=

建立高斯-塞德尔迭代格式为:

n i a x a

x a d x ii n

i j k j

ij

i j k j

ij i k i

,,2,1,/)(1

)

(1

1

)

1()

1( =-

-=∑∑+=-=++

3)取初值迭代求解至所要求的精度为止。 2、牛顿法

)

()

(1k k k k x f x f x x '-

=+

五、实验步骤

1、理解并掌握二分法与牛顿法的公式;

2、画出二分法与牛顿法的流程图

3、使用C 语言编写出相应的程序并调试验证通过

六、实验报告要求

1、统一使用《武汉科技大学实验报告》本书写,实验报告的内容要求有:实验目的、实验内容、程序流程图、源程序、运行结果及实验小结六个部分。

2、源程序需打印后粘贴在实验报告册内;

3、运行结果以屏幕截图形式保存并打印后粘贴在实验报告册内。

七、实验注意事项

对于二分法应注意二分后如何判断根的区间,对于牛顿法注意如何确定迭代过程的结束

八、思考题

若使用牛顿法是发散的,如何对牛顿法进行改进以保证其收敛性。

前三个实验的程序代码(C/C++)和运行结果截图

Gauss 全选主元解方程组的源程序及运行结果

#include #include #include

using namespace std;

class Matrix {

public:

Matrix(); ~Matrix();

void SetMatrix(const int n,const double esp1);//构造线性方程组相应的矩阵,n 为方程的未知数数目,esp1为要求的精度 void Max(const int r);//全选主元

void ChangeRC(const int r);//根据主元变换矩阵的行或列

void Eliminate(const int r);//处理消元工作

void Result()const;//计算方程的解

void Calculate();

int GetRank()const;//返回矩阵的行数

double GetX(const i)const;//确定方程组的第i个解(1<=i<=N)

private:

//指针a和b分别用于存储方程组的未知数系数和方程"="右边的常数,esp存//储精度

double *a,*b,esp;

//指针flag用于记录方程组解的顺序

int *flag;

//以下的结构体用于在全选主元中记录最大主元的位置

struct coordinate

{

int row,column;

}location;

int N;//方程组未知数的数目

};

int main()

{

int n;

double esp1;

Matrix matrix;

do{

cout<<"请输入方阵的阶数:";

cin>>n;

if(n<0) n=0;//如何控制非法字符的输入??????????

}while(n==0);

do

{

cout<<"请输入计算精度:";

cin>>esp1;

if(esp1<0) esp1=0;//输入不合法的精度就把精度置0

}while(esp1==0);

cout<<"输入线性方程组的增广矩阵:\n";

matrix.SetMatrix(n,esp1);//设置矩阵内的数据

matrix.Calculate();//计算方程组的解

//输出方程组的解

cout<<"\n\n方程组的解如下:\n";

for(int i=1;i<=matrix.GetRank();++i)

cout<<"X["<

return 0;

}

Matrix::Matrix()

{ //将Matrix类的数据成员初始化

a=NULL;

b=NULL;

flag=NULL;

location.row=0;

location.column=0;

esp=0;

N=0;

}

Matrix::~Matrix()

{ //释放指针a、b和flag指向的内存空间delete[]a;

delete[]b;

delete[]flag;

}

void Matrix::SetMatrix(const int n,const double esp1) {

N=n;

esp=esp1;

a=new double[N*N];

b=new double[N];

flag=new int[N];

//判断是否成功分配存储区

if(a==NULL||b==NULL||flag==NULL)

{

cout<<"分配存储区失败!\n";

exit(EXIT_FAILURE);

}

//读取线性方程组的增广矩阵

for(int i=0;i

{

for(int j=0;j>*(a+i*N+j);

cin>>*(b+i);

}

//flag中存储的值对应相应的x值,当方程的解由于列变换交换后,flag中//的值也相应交换,最后用于恢复解的顺序

for( i=0;i

}

void Matrix::Max(const int r)

{

double max=0;

for(int i=r;i

for(int j=r;j

{

if(max

{

max=fabs(*(a+i*N+j));

//设定最大主元的行、列

location.row=i;

location.column=j;

}

}

//最大主元小于输入的精度时,认为方程组无解,退出程序

if(max<=esp)

{

cout<<"方程组无解!\n";

exit(EXIT_FAILURE);

}

}

void Matrix::ChangeRC(const int r)

{

double temp;

//如果最大主元所在的行不在当前行,则进行行变换

if(location.row!=r)

{

for(int i=r;i

{

temp=*(a+r*N+i);

*(a+r*N+i)=*(a+location.row*N+i);

*(a+location.row*N+i)=temp;

}

temp=b[r];

b[r]=b[location.row];

b[location.row]=temp;

}

//若最大主元所在的列不在当前的r列,则进行列变换

if(location.column!=r)

{

for(int i=r;i

{

temp=*(a+i*N+r);

*(a+i*N+r)=*(a+i*N+location.column);

*(a+i*N+location.column)=temp;

}

//交换flag中的元素来标记方程解的位置变化

int temp1;

temp1=*(flag+r);

*(flag+r)=*(flag+location.column);

*(flag+location.column)=temp1;

}

}

void Matrix::Eliminate(const int r)

{

if(fabs(*(a+N*r+r))<=esp)

{

cout<<"方程组无解!\n";

exit(EXIT_FAILURE);

}

for(int i=r+1;i

{

for(int j=r+1;j

(*(a+i*N+j))-=(*(a+i*N+r))*(*(a+r*N+j))/(*(a+r*N+r));

(*(b+i))-=(*(b+r))*(*(a+i*N+r))/(*(a+r*N+r));

}

}

void Matrix::Result()const

{

if(fabs(*(a+N*(N-1)+N-1))<=esp)

{

cout<<"方程组无解!\n";

exit(EXIT_FAILURE);

}

double temp;

*(b+N-1)/=(*(a+N*(N-1)+N-1)); //求出X[N-1]

//依次求出X[i](i=N-2,N-3 (1)

for(int i=N-2;i>=0;--i)

{

temp=0;

for(int j=i+1;j

*(b+i)=(*(b+i)-temp)/(*(a+i*N+i));

}

//根据flag中的数据用冒泡排序法恢复方程组解的次序

for(i=0;i

for(int j=0;j

if(*(flag+j)>*(flag+j+1))

{

int temp1;

//交换解的顺序

temp=*(b+j);

*(b+j)=*(b+j+1);

*(b+j+1)=temp;

//交换用于标记的元素的顺序

temp1=*(flag+j);

*(flag+j)=*(flag+j+1);

*(flag+j+1)=temp1;

}

}

void Matrix::Calculate()

{ //根据矩阵行数重复进行寻找最大主元、变换行或列、消元for(int i=0;i

{

Max(i);

ChangeRC(i);

Eliminate(i);

}

Result();

}

int Matrix::GetRank()const

{

return N;//返回矩阵的行数

}

double Matrix::GetX(const int i)const

{

return *(b+i-1);

}

运行结果

追赶法求解方程组的算法:

1.输入方程组的维数n,将主对角元素b(i)(i=0:n-1),,主对角元素左边的元素a(i)(i=0:n-2),主对角元素右边的元素c(i)(i=0:n-2),右端项的元素f(i)(i=0:n-1) 2.对方程组的系数矩阵作Crout分解, α(0)=b(0),对于i=0:n-2, c(i):=β(i):= c(i)/b(i), b(i+1):=α(i+1):= b(i+1)-a(i)* β(i)

3.解方程组Ly=f

b(0):=y(0):=[f(0)/ α(0)]:=[f(0)/b(0)]

对于i=1:n-1,b(i):=y(i):=[f(i)-a(i-1)*y(i-1)]/b(i)

4..解方程组Ux=y

a(n-1):=x(n-1):=b(n-1)

对于i=n-2:0,a(i)=x(i):=b(i)-c(i)*a(i+1);

5.输出方程组的解a(0:n-1)

用追赶法求解方程组的源程序及运行结果

#include

#include

using namespace std;

class MatrixThr

{

public:

MatrixThr();

~MatrixThr();

void SetMatrixThr(const int n);//设置三对角矩阵的数据

void Result();//计算三对角矩阵的解

double GetX(const int i)const;//取得第i个解,i从1开始

int GetN() const;//返回未知数的数目

private:

int N;//N为未知数的数目

//b为矩阵主对角线的元素首地址,a为主对角线左边一斜条元素的首地址,//c为主对角线右边一斜条元素首地址,f为方程组的常数首地址

double *a,*b,*c,*f;

};

int main()

{

MatrixThr matrix;

int n;

do{

cout<<"输入三对角方程组的变量的数目N:";

cin>>n;

}while(n<3);

cout<<"请依次输入三对角方程组每行的数据(0元素除外):\n";

matrix.SetMatrixThr(n); //计算方程组的解

matrix.Result();//输出方程组的解

cout<<"方程的解如下:\n";

for(int i=1;i<=matrix.GetN();++i)

cout<<"X["<

return 0;

}

MatrixThr::MatrixThr()

{ //初始化相关数据

N=0;

a=NULL;

b=NULL;

c=NULL;

f=NULL;

}

MatrixThr::~MatrixThr()

{ //释放分配的内存空间

delete []a;

delete []b;

delete []c;

delete []f;

}

void MatrixThr::SetMatrixThr(const int n)

{ //根据输入的未知数个数设置矩阵的数据

N=n;

a=new double[N];

b=new double[N];

c=new double[N];

f=new double[N];

//若内存分配失败,退出程序

if(a==NULL||b==NULL||c==NULL||f==NULL)

{

cout<<"初始化分配存储空间失败!\n";

exit(EXIT_FAILURE);

}

//依次输入三对角矩阵每行的元素

cin>>*b>>*c>>*f;

for(int i=1;i>*(a+i-1)>>*(b+i)>>*(c+i)>>*(f+i);

cin>>*(a+i-1)>>*(b+i)>>*(f+i);

}

void MatrixThr::Result()

{ //对系数矩阵A作Crout分解

for(int i=0;i

{ //将U中的α存于指针b中,L中的β存于指针c中*(c+i)/=(*(b+i));

*(b+i+1)-=(*(a+i))*(*(c+i));

}

FORTRAN 90 程序编程规范

FORTRAN 90 程序编程规范 Fortran 90 编程规范,使程序代码高度组织化,更加易读、易懂、易于维护,程序更加高效。使编出的程序更易懂、易于维护。 1 语言选择 数值预报创新系统软件开发应避免使用Fortran77 的某些过时特征以Fortran 90不一致的特征。选择Fortran 90 作为开发语言,并采用Fortran 90 的新功能,如动态内存的分配(dynamic memory allocation)、递归(recursion ), 模块(modules)、POINTER 、长变量名、自由格式等。 Fortran 77其中某些只是一些冗余的功能,这些功能已经过时,另外,还有一些在Fortran90 中被证明是不好的用法,建议不要使用。 2 Fortran 90 的新特性 2.1.1 建议使用的Fortran 90 新特性 建议使用Fortran 90 提供的模块(module ),并用Use ONLY 指定module 中哪些变量或派生类型定义可用于调用程序。 尽量使用数组下标三元组,这样可优化并减少所需的代码行数。为提高可读性,要在括号内表明数组的维数,例如: 1dArrayA(:) = 1dArrayB(:) + 1dArrayC(:) 2dArray(: , :) = scalar * Another2dArray(: , :) 当访问数组的子集时,例如在有限差分等式中,可以通过使用下标三元组实现。例如:2dArray(: , 2:len2) = scalar *( & Another2dArray(:, 1:len2 -1) & - Another2dArray(:, 2:len2) & ) 对程序单元(program units )命名,并使用End program ,End subroutine ,End interface ,End module 等结构再次指定“program unit ”的名称。 在逻辑表达式中使用>、 >=、 ==、 <、 <=、 /=,它们分别代 替.gt.、.ge.、.eq.、.lt.、.le.、.ne. 。新的表示方法更接近标准的数学符号 在变量定义中始终使用“::”;始终用“DIMENSION ”定义数组形状;始终用(len=)的语法格式声明字符变量的长度。

fortran程序案例题汇编(14道)

1.Fibonacci数列定义如下: F1=1 F2=1 F n=F n-1+F n-2 (n>2) 求Fibonacci数列的前30项。 integer f(30),i f(1)=1 f(2)=2 do i=3,30 f(i)=f(i-1)+f(i-2) enddo print*,f end 2.输入10个学生的总分,求每个学生的名次integer s(10),a(10),i,j do i=1,10 read*,s(i) enddo do i=1,10 a(i)=1 do j=1,10 if(s(i)

3.给定一组数,按照从小到大的顺序输出。integer a(10) integer p do i=1,10 read *,a(i) enddo do j=1,9 p=j do i=j+1,10 if (a(i)

4.输入若干名学生的学号和三门课程(语数英)的成绩,要求从键盘输入一个学生的学号,能打印出该学生的三门功课成绩和总分。 character*6,dimension(:),allocatable::xue integer,dimension(:,:),allocatable::g integer,dimension(:),allocatable::zong integer i,j,n character*6,xh print *,"请输入学生的个数" read *,n allocate(xue(n)) allocate(g(n,3)) allocate(zong(n)) do i=1,n read *,xue(i),(g(i,j),j=1,3) enddo do i=1,n zong(i)=0 do j=1,3 zong(i)=zong(i)+g(i,j) enddo enddo print *,"请输入你要打印的学生的学号" read *,xh do i=1,n if(xue(i)==xh)then print *,(g(i,j),j=1,3),zong(i) exit endif enddo end

fortran基本函数

FORTRAN 90标准函数(一) (2012-07-03 17:14:57) 转载▼ 分类:学习 标签: fortran 函数 教育 符号约定: ●I代表整型;R代表实型;C代表复型;CH代表字符型;S代表字符串;L代表逻辑型;A代表数组;P代表指针;T代表派生类型;AT为任意类型。 ●s:P表示s类型为P类型(任意kind值)。s:P(k)表示s类型为P类型(kind值=k)。 ●[…]表示可选参数。 ●*表示常用函数。

注:三角函数名前有C、D的函数为复数、双精度型函数。 注:指数函数名、平方根函数名、对数函数名前有C、D的函数为复数、双精度型函数。 表4 参数查询函数

atan2函数的值域是多少?我从网上找到一个fortran函数的日志,说此值域是-π~π,但正常反正切函数的值域应该是-π/2~π/2。对atan2函数不够了解,所以不知道你的答案对不对,我个人认为不对。我是用正常的反正切函数atan(v/u)来算的: FORTRAN: if (u>0..and.v>0.) dir=270-atan(v/u)*180/pi if (u<0..and.v>0.) dir=90-atan(v/u)*180/pi if (u<0..and.v<0.) dir=90-atan(v/u)*180/pi if (u>0..and.v<0.) dir=270-atan(v/u)*180/pi if (u==0..and.v>0.) dir=180 if (u==0..and.v<0.) dir=0 if (u>0..and.v==0.) dir=270 if (u<0..and.v==0.) dir=90 if (u==0..and.v==0.) dir=999 其中uv等于零的五种情况要单独挑出来,不然程序会有瑕疵。atan函数换成atand函数的话直接是度数,不用*180/pi 我四个象限和轴都试了,应该没错。 最需要注意的问题,一个是函数值域,另一个是uv矢量方向和风向是反着的,并且风向角度数是从正Y轴开始顺时针算,和三角函数里度数从正X轴开始逆时针算不一样。

Fortran95程序设计课后习题答案(word版方便)

第四章 1.program main implicit none write(*,*) "Have a good time." write(*,*) "That's not bad." write(*,*) '"Mary" isn''t my name.' end program 2.program main real, parameter :: PI=3 implicit none.14159 real radius write(*,*) "请输入半径长" read(*,*) radius write(*,"(' 面积='f8. 3)") radius*radius*PI end program 3.program main implicit none real grades write(*,*) "请输入成绩" read(*,*) grades write(*,"(' 调整后成绩为'f8.3)") SQRT(grades)*10.0 end program 4.integer a,b real ra,rb a=2 b=3 ra=2.0 rb=3.0 write(*,*) b/a ! 输出1, 因为使用整数计算, 小数部分会无条件舍去write(*,*) rb/ra ! 输出1.5 5.p rogram main implicit none type distance real meter, inch, cm end type type(distance) :: d write(*,*) "请输入长度:" read(*,*) d%meter d%cm = d%meter*100 d%inch = d%cm/2.54 write(*,"(f8.3'米='f8.3'厘米='f8.3'英寸')") d%meter, d%cm, d%inch end program 第五章 1.program main implicit none integer money real tax write(*,*) "请输入月收入" read(*,*) money if ( money<1000 ) then tax = 0.03 else if ( money<5000) then tax = 0.1 else tax = 0.15 end if write(*,"(' 税金为'I8)") nint(money*tax) end program 2.program main implicit none integer day character(len=20) :: tv write(*,*) "请输入星期几" read(*,*) day select case(day) case(1,4) tv = "新闻" case(2,5) tv = "电视剧" case(3,6) tv = "卡通" case(7) tv = "电影" case default write(*,*) "错误的输入" stop end select write(*,*) tv end program 3.program main implicit none integer age, money real tax write(*,*) "请输入年龄" read(*,*) age write(*,*) "请输入月收入" read(*,*) money if ( age<50 ) then if ( money<1000 ) then tax = 0.03 else if ( money<5000 )then tax = 0.10 else tax = 0.15 end if else if ( money<1000 ) then tax = 0.5 else if ( money<5000 )then tax = 0.7 else tax = 0.10 end if end if write(*,"(' 税金为'I8)") nint(money*tax) end program 4.program main implicit none integer year, days logical mod_4, mod_100, mod_400 write(*,*) "请输入年份" read(*,*) year mod_4 = ( MOD(year,4) == 0 ) mod_100 = ( MOD(year,100) == 0 ) mod_400 = ( MOD(year,400) == 0 ) if ( (mod_4 .NEQV. mod_100) .or. mod_400 ) then days = 366 else days = 365 end if write(*,"('这一年有'I3'天')") days stop end program 第六章 1.program main implicit none integer i do i=1,5 write(*,*) "Fortran" end do stop end program 2.program main implicit none integer i,sum sum = 0 do i=1,99,2 sum = sum+i end do write(*,*) sum stop end program 3.program main implicit none integer, parameter :: answer = 45 integer, parameter :: max = 5 integer weight, i do i=1,max write(*,*) "请输入体重" read(*,*) weight if ( weight==answer ) exit end do if ( i<=max ) then write(*,*) "猜对了" else write(*,*) "猜错了" end if stop end program 4.program main implicit none integer, parameter :: max=10 integer i real item real ans ans = 1.0 item = 1.0 do i=2,max item = item/real(i) ans = ans+item

fortran程序实例

1)实例3—求多个半径下的圆周长 ! z3.f90 --Fortran95 ! FUNCTIONS: ! z3 - Entry point of console application. !************************************************************************* ! PROGRAM: z3 ! PURPOSE: Entry point for the console application. !************************************************************************ program z3 ! 求多个半径下的圆周长 ! 主程序 ! PROGRAM Z3 PRINT *, 'R=',1.2,'C=',C(1.2) PRINT *, 'R=',3.4,'C=',C(3.4) PRINT *, 'R=',15.6,'C=',C(15.6) PRINT *, 'R=',567.3,'C=',C(567.3) END program z3 !子程序 FUNCTION C(R) PI=3.1415926 C=2*PI*R RETURN ! Body of z3 end

2)实例4—键盘与显示器输入/输出 a)Fortran 基本操作 b)程序指令 ! ZXZ_I_O.f90 ! FUNCTIONS: ! ZXZ_I_O - Entry point of console application. ! PROGRAM: ZXZ_I_O ! PURPOSE: Entry point for the console application. !***************输入、输出样式种种************************** program ZXZ_I_O implicit none !变量声明的位置 INTEGER(2) i; INTEGER(4) j; INTEGER(4) m; REAL n INTEGER A,B ! Variables PRINT*,'输入整数A'; READ*, A PRINT*,'输入整数B'; READ*, B B=A+B PRINT*,'B=A+B=',B WRITE(*,*) 'A*B=',A*B PRINT* ,'以上为计算机的计算结果,注意B的值'

计算机技术基础(Fortran)试题库

一、选择题 1、下列关于"SUBROUTINE MAP(X,Y)"语句行的叙述中,不正确的是( ) A) 这是子程序的第一个语句B) 字符串"MAP"是子程序名 C) 变量X是子程序的形参D) 子程序执行后,MAP将返回整型数据 2、FORTRAN表达式"2/4+"的值是( ) A) B) 1 C) D) 0 3、阅读下列FORTRAN程序: PI=3. WRITE(*,' ')PI END 程序运行后输出结果是( ) A) B) 3.1415 C) D) 4、圆的直径存放在整型变量K之中,下列计算圆面积的表达式中正确的是( ) A) *K*K/4 B) *(K*K/4) C) *(K/2)**2 D) *(K/2)*(K/2) 5、要判断"月收入M在2000元以上(含2000元)且5000元以下)不含5000元)"的职工,应该使用的逻辑表达式是( ) A) M .GE. 2000 .AND. M .LE. 5000 B) M .GE. 2000 .OR. M .LE. 5000 C) M .GE. 2000 .AND. M .LT. 5000 D) M .GE. 2000 .OR. M .LT. 5000 6、设FORTRAN子程序如下: SUBROUTINE SUB(I,X) B=I+1 X=X+B END 若主程序中的变量M,B已按I-N规则赋值,则调用上述子程序的语句中正确的是( ) A) CALL SUB(M,M) B) CALL SUB(M+4,B) C) CALL SUB(B,B) D) CALL SUB(M,B+4) 7、下列不是FORTRAN常量的是( ) A) , B) +00 C) 2/3 D) 'Very good!' 8、阅读下列FORTRAN程序: F= DO 20 K=3, 7, 3 DO 20 L=K-1, K

几个fortran程序

计算圆周率 REAL R,R1,R2,PI ISEED=RTC() N0=0 N=300000 DO I=1,N R1=RAN(ISEED) R2=RAN(ISEED) R=SQRT(R1*R1+R2*R2) IF(R<1.0)N0=N0+1 END DO PI=4.0*N0/N WRITE(*,*)PI END 一)蒙特卡洛计算生日问题 假设有N个人在一起,各自的生日为365天之一,根据概率理论,与很多人的直觉相反,只需23个人便有大于50%的几率人群中至少有2个人生日相同。 INTEGER M(1:10000), NUMBER1(0:364), NUMBER2 REAL X,Y ISEED=RTC() DO J=1, 10000 NUMBER1=0 X=RAN(ISEED) NUMBER1(0)=INT(365*X+1) JJJ=1 DO I=1,364 Y=RAN(ISEED) NUMBER2=INT(365*Y+1) ETR=COUNT(NUMBER1.EQ.NUMBER2) IF (ETR= =1) THEN EXIT ELSE JJJ=JJJ+1 M(J)=JJJ NUMBER1(I)=NUMBER2 END IF END DO END DO DO I=1,10000 IF(M(I).LE.23) SUM=SUM+1 END DO PRINT *,SUM/10000 END 二)MONTE CARLO SIMULATION OF ONE DIMENSIONAL DIFFUSION 蒙特卡罗计算一维扩散问题

INTEGER X,XX(1:1000,1:1000) REAL XXM(1:1000) ! X:INSTANTANEOUS POSITION OF ATOM ! XX(J,I):X*X ,J:第几天实验,I:第几步跳跃 ! XXM(I): THE MEAN OF XX WRITE(*,*) "实验天数JMAX,实验次数IMAX" READ(*,*) JMAX,IMAX ISEED=RTC() DO J=1,JMAX !第几天实验 X=0 !!! DO I=1,IMAX !第几步跳跃 RN=RAN(ISEED) IF(RN<0.5)THEN X=X+1 ELSE X=X-1 END IF XX(J,I)=X*X END DO END DO OPEN(1,FILE="C:\DIF1.DAT") DO I=1,IMAX XXM=0.0 XXM(I)=1.0*SUM(XX(1:JMAX,I))/JMAX !! WRITE(1,*) I, XXM(I) END DO CLOSE(1) END 三维的! 三)通过该程序了解FORTRAN语言如何画图(通过像素画图)USE MSFLIB INTEGER XR,YR !在的区域中画一个圆 PARAMETER XR=400,YR=400 INTEGER R, S(1:XR,1:YR) X0=XR/2 ! 圆心位置X0,YO Y0=YR/2 R=MIN(X0-10,Y0-10) !圆半径 S=0 !像素的初始状态(颜色) DO I=1,XR DO J=1,YR IF((I-X0)**2+(J-Y0)**2<=R**2)S(I,J)=10 IER=SETCOLOR(S(I,J)) IER=SETPIXEL(I,J) END DO END DO END

计算机程序设计语言(FORTRAN语言)

计算机程序设计语言(FORTRAN语言) 1. 编译程序能将高级语言编写的源程序转换成。 A.解释程序 B.汇编程序 C.映象程序 D.目标程序 答案:D 2. 一个完整的FORTRAN源程序。 A.至少包括一个主程序 B.至少包括一个主程序和一个子程序 C.由一个主程序与一个以上的子程序组成 D.由一个主程序与一个子程序组成 答案:A 3. 语句函数定义语句在程序内合法的位置是。 A.在程序块开头语句之后,END语句之前 B.在程序块开头语句之后,可执行语句之前 C.在说明语句之后,END语句之前 D.在说明语句之后,可执行语句之前 答案:D 4. 下列关于函数子程序虚实参数的错误说法是。 A.可以没有形参数 B.虚实结合的数组长度可以不同

C.实参表与虚参表类型可以不同 D.函数名可以作为虚参 答案:C 5. 下列叙述中正确的是。 A.FORTRAN程序块中,无名公用语句只能有一个 B.FORTRAN子程序中,至少应有一个RETURN语句 C.FORTRAN程序块中,最后一行必须是END语句 D.FORTRAN程序块中,必须有变量说明语句 答案:C 6. 运行下面的程序时得不到所需的结果,其主要原因是。 INTEGER X(11) DATA X/9,8,7,6,5,4,3,2,1,0,-1/ DO 10 1=1,X(1) ,-1 WRITE(*,*)1.0/SQRT(25.0-REAL(X(1) )* * 2) 10 CONTINUE END A.没有给X(11) 赋初值 B.发生除以零的情况 C.发生负数开平方的情况 D.循环参数设置错误 答案:D 7. 下列数据中,不符合FORTRAN常量表示法的是。 A.-25.6 B.2.758D3

fortran程序30个

程序1 PROGRAM chaper1272 INTEGER :: A(10)=(/5,7,4,8,12,2,10,3,9,11/) INTEGER :: sum=0,ave !打开一数据文件,设置一个有格式直接存取文件,将10个数分2个记录写入文件。 !数据文件生成2个记录,每个记录行长度相同,记录长度为25 OPEN(1,FILE='input21.dat',FORM='FORMATTED',ACCESS='D IRECT',RECL=25) WRITE(1,"(5I5)",REC=1)(A(I)+10,I=1,5) !按格式说明将头5个数写入第1个记录 WRITE(1,"(5I5)",REC=2)(A(I)+10,I=6,10)!按格式说明将后5个数写入第2个记录 READ(1,"(5I5)",REC=2)(A(I),I=6,10) !按格式说明从第2个记录中读取后5个数 READ(1,"(5I5)",REC=1)(A(I),I=1,5) !按格式说明从第1个记录中读取头5个数 DO I=1,10 sum=sum+A(I) ENDDO ave=sum/10 !打开一个最大记录长度为22的有格式顺序存取文件

OPEN(2,FILE='input22.dat',FORM='FORMATTED',ACCESS='D IRECT',RECL=22) WRITE(2,"('10个数之和为:',I5)",REC=1) sum !输出1记录行,记录长度为22 WRITE(2,"('10个数平均值为:',I5)",REC=2)ave !输出1记录行,记录长度为22 WRITE(2,"(A)",REC=3) '程序运行正常结束。' !输出一个记录行,记录长度为22 END 程序2 PROGRAM average REAL sum,ave INTEGER n OPEN(1,file='score.dat') PRINT*,'正在统计平均成绩,请等待。' sum=0.0;n=0 DO READ(1,*,END=100) S sum=sum+s n=n+1 ENDDO 100 ave=sum/n

Fortran基本用法小结档

Fortran基本用法小结 目录: 一、说明 二、概述 三、数据类型及基本输入输出 四、流程控制 五、循环 六、数组 七、函数 八、文件 一、说明 本文多数内容是我读彭国伦《Fortran 95 程序设计》的笔记。只读到第九章,主要是3~9章,都是些最基本的用法(原书共16章)。这里主要摘录了我看书过程中总结的一些Fortran和C不同的地方,主要是语法方面。希望这份笔记能够给学过C但没有接触过Fortran的同学带去一些帮助。要想弄得更清楚些,推荐看一下原书,觉得作者真的写得很好,很清楚;如果有C语言的基础,看完前九章应该很快的,花一两天就行了。觉得如果耐心看完本文,基本功能应该也可以顺利用起来了。 另外,由于我之前没有用过Fortran,这次为了赶文档看书又看得很粗浅,大多数东西看过之后都没来得及仔细想,只是按着作者的意思去理解。所以这份笔记还处于纸上谈兵的层次。如果有不妥的地方,希望大家指正。谢谢! 文中蓝色的部分是程序代码,!后面的内容为注释。 二、概述 1、名词解释 Fortran=Formula Translator/Translation 一看就知道有什么特色了:可以把接近数学语言的文本翻译成机械语言。的确,从一开始,IBM设计它的时候就是为了方便数值计算和科学数据处理。设计强大的数组操作就是为了实现这一目标。Fortran奠定了高级语言发展的基础。现在Fortran在科研和机械方面应用很广。 2、Fortran的主要版本及差别 按其发展历史,Fortran编译器的版本其实很多。现在在广泛使用的是Fortran 77和Fortran90。Fortran 90在Fortran 77基础上添加了不少使用的功能,并且改良了77编程的版面格式,所以编程时推荐使用90。鉴于很多现成的程序只有77版本,有必要知道77的一些基本常识,至少保证能够看懂77程序。以下是77和90的一些格式上的区别。

Fortran基本用法小结

【以下文字转载自D_Atmosphere 讨论区】 【原文由superjyq 所发表】 我的Fortran基本用法小结 高级语言和算法组heavensky 目录: 一、说明 二、概述 三、数据类型及基本输入输出 四、流程控制 五、循环 六、数组 七、函数 八、文件 一、说明 本文多数内容是我读彭国伦《Fortran 95 程序设计》的笔记。只读到第九章,主要是3~9章,都是些最基本的用法(原书共16章)。这里主要摘录了我看书过程中总结的一些Fortran和C不同的地方,主要是语法方面。希望这份笔记能够给学过C但没有接触过Fortran的同学带去一些帮助。要想弄得更清楚些,推荐看一下原书,觉得作者真的写得很好,很清楚;如果有C语言的基础,看完前九章应该很快的,花一两天就行了。觉得如果耐心看完本文,基本功能应该也可以顺利用起来了。 另外,由于我之前没有用过Fortran,这次为了赶文档看书又看得很粗浅,大多数东西看过之后都没来得及仔细想,只是按着作者的意思去理解。所以这份笔记还处于纸上谈兵的层次。如果有不妥的地方,希望大家指正。谢谢! 文中蓝色的部分是程序代码,!后面的内容为注释。 二、概述 1、名词解释 Fortran=Formula Translator/Translation 一看就知道有什么特色了:可以把接近数学语言的文本翻译成机械语言。的确,从一开始,IBM设计它的时候就是为了方便数值计算和科学数据处理。设计强大的数组操作就是为了实现这一目标。Fortran奠定了高级语言发展的基础。现在Fortran在科研和机械方面应用很广。 2、Fortran的主要版本及差别 按其发展历史,Fortran编译器的版本其实很多。现在在广泛使用的是Fortran 77和Fortran90。Fortran 90在Fortran 77基础上添加了不少使用的功能,并且改良了77编程的版面格式,所

FORTRAN经典入门程序20例

对于FORTRAN的初学者。这些例子可作为小练习。 1.例题:计算工资问题。每小时工资为RATE,如果工作超过40小时,加班呢部分工资是正常时间工资的1.5倍。 C Payroll with overtime program payroll real rate, hours, pay read (*,*) rate, hours if (hours>40) then pay=40*rate+(hours-40)*1.5*rate else pay=hours*rate END IF print *,"rate=", rate print *, "hours=", hours print *,"pay=",pay end 2.学生成绩问题。大于80为A级。大于60小于80为B级。小于60为C级。IF的嵌套。注意空格可以看清楚else if ,end if,print的内容. PROGRAM GRADESTUDENT READ *,GRADE IF (GRADE .GE. 80) THEN PRINT *,GRADE,"GRADE=>A" ELSE IF (GRADE.LT.60) THEN PRINT*,GRADE,"GRADE=>C" ELSE PRINT*,GRADE,"GRADE=>B" END IF END IF END 3.三个数按从小到大排序。 PROGRAM MAXMIN REAL A,B,C,T READ *,A,B,C IF (A.GT.B) THEN T=A A=B B=T ELSE END IF IF (B.GT.C) THEN T=B B=C

PROGRAM EQUATION READ (*,*) X IF (X .GE. 0.0) Y=3*X+6 IF (X .LT. 0.0) Y=-X**2+2*X-8 PRINT *,"X=",X, "Y=",Y END 6.CONTINUE语句。为了使循环的起止范围清晰,使用终端语句 例:求5! program ex1 FACT=1 do 10, N=1,5,1 ##DO 语句标号,循环不变量=初值,终值,步长FACT=FACT*N 10continue print*,FACT end 求1!+2!+3!+···+N! READ *,N FACT=1

fortran文件操作

fortran文件操作 From: 《Fortran 95 程序设计》彭国伦 1.文件读取的概念: 读取:“顺序读取”和“直接读取”。 保存:“文本文件”和“二进制文件”。 二进制文件:读取快,因为保存格式和数据在内存中的保存方法一样,同时也节省空间。 ---------------------------------- 2. 文件的操作: ---------------------------------- open的使用:使用open命令打开文件之后,就可以对文件来做输入输出。 example: program ex0901 impicit none open(unit=10, file='hello.txt') ! 打开hello.txt文件, unit指定文件代码,file 指定文件名称。 write(10, *) "hello" !在代码为10的文件中写入hello stop end program ex0901 open中有很多参数可以使用,详细如下: OPEN(UNIT=number, FILE='filename', FORM='...', STATUS='...', ACCESS='...', RECL=length, ERR=label, IOSTAT=iostat, BLANK='...', POSITION='...', ACTION=action, PAD='...', DELIM='...') UNIT='number': number必须是一个正整数,它可以使用变量或是常量来赋值。number最好避开1,2,5,6。因为2,6是默认的输出位置,也就是屏幕。1,5则是默认的输入位置,键盘。 FILE='filename':指定要打开的文件名称,文件名要符合系统规定。windows下不区分大小写,unix下则会区分大小写,最好不要使用中文文件名。 FORM='FORMATTED' OR 'UNFORMATTED' FORM字段只有两个值可以设置: FORM='FORMATTED' “文本文件”格式来保存 FORM='UNFORMATTED' “二进制文件”格式保存 这一栏不给定时候的默认值是: FORM='FORMATTED' STATUS='NEW' or 'OLD' or 'SCRATCH' or 'UNKNOWN' 用来说明打开一个新的文件或已经存在的旧文件。 STATUS='NEW' 打开一个原本不存在的新文件 STATUS='OLD' 打开一个原来已经存在的文件 STATUS='REPLACE' 若文件已经存在则重新创建一次,原来的内容消失;若不存在则会创建新文件。 STATUS='SCRATCH' 表示要打开一个暂存文盘,这个时候可以不需要指定文件名称,也就是FILE这个一栏可以忽略。因为程序本身会自动取一个文件名,至于文件名是啥也不重要,因为暂存盘会在程序结束后自动删除。 STATUS='UNKNOWN' 由各编译器自定义。通常会同REPLACE的效果。 !这一栏不给定时,默认为STATUS='UNKNOWN'。 ACCESS='SEQUENTIAL' or 'DIRECT' 设置读写文件的方法:

优秀的fortran程序编程规范

Programming Guidelines for PARAMESH Software Development(NOTE: This document is heavily based upon the Introduction This document describes the programming guidelines to be used by software developers wishing to contribute software to the PARAMESH, parallel, adaptive mesh refinement software. We welcome people to contribute software and/or bug fixes to the PARAMESH AMR software. Software to be added to PARAMESH can come in 2 forms: ?Improvements to the basic PARAMESH kernal software found in the mpi_source, source and hearders directories. ?Software the addes additional functionality to PARAMESH. This type of software should be added as separate entities within the utilities directory. Complete applications should not be added as part of PARAMESH. PARAMESH is only meant to be a tool which supports parallel adaptive mesh applications and any software which supports this goal will be considered for acceptance into PARAMESH. For instance, a solver for the poisson equation that works with PARAMESH would be acceptable, but an application that solves the equation of gas dynamics would not. The PARAMESH software is slowly being evolved to be consistent with this document. Any new software which is contributed should follow these guidlines. If not, it will be rejected. This document deals mainly with Fortran 90, since most new PARAMESH software will probably be written in that language. [Throughout this document, the term "Fortran" should be understood to mean Fortran 90.] Since we expect C and C++ also to be used, a separate document dealing with them will be developed in the future. In the meantime, this document can serve as a general guideline for developing code to be used with PARAMESH in those programming languages. The guidlines in this document should be adhered to by ANY software which will be released as part of the PARAMESH package of source code. This includes software 'utilities' (stored in the paramesh/utilities directory) which add functionality to PARAMESH for different algorithms. It also should be applied to any new code developed and added to the main source code for PARAMESH in the paramesh/source, paramesh/mpi_source, or paramesh/headers directories.

Fortran95第9章 基本计算(一)赋值语句

第9章基本计算(一)赋值语句 从计算机的实际状态来看,给出表达式并不意味着计算的开始,真正能够驱动计算的是可执行语句,而最直接驱动表达式的计算过程的就是赋值语句,完成一个赋值步骤,就意味着机器的状态的局部或全局发生了一个根本的变化。 从语法的角度来看,一个表达式还只是一个比较复杂的复合词汇,还不能构成一个完整的语句,而赋值语句则是一个在语法意义上的完整的语句,表达式在赋值语句中扮演关键的语法作用。 从计算问题的角度来看,赋值可以说是基本的计算步骤,考虑一下我们人工计算的过程就可以发现,任何一个完整的计算步骤,都可以说就是一个赋值步骤,特别是公式演算和数值计算,完成一个局部运算过程的标志,往往就是求出某个中间变量的数值或表达式。 FORTRAN语言作为一种以公式翻译为初衷的高级语言,它的赋值语句的一般形式就是一个数学等式,当然不是那种公式恒等变换得到的恒等式,而是要把运算的结果赋予一个变量,因此它的一般句法形式为: variable = expression variable => expression 可以看到一个赋值语句作为一个完整的语句,分为三个部分: ● 被赋值的变量 ● 赋值符号 ● 计算(表达式) 其中被赋值的变量,通过赋值,就拥有了明确的取值形式,如果该变量含有下标,片断下标或子串范围,则赋值的前提是它们都已经获得具体的取值。 基于表达式结果的不同种类,赋值语句分为: ●固有赋值:固有赋值是把任意类型的值赋予一个非指针变量,或把一个指针变量赋 予一个与之相关联的目标。 ●自定义赋值:自定义赋值得以构成的前提是存在一个可访问的子例行程序,它包含 一个具有ASSIGNMENT形式的赋值界面,其属性与自定义赋值语句里的变量和表达式的属性保持一致。 ●指针赋值:指针赋值把一个指针变量关联到它的目标对象,或者说把一个目标对象 赋予到一个指针变量。在形式上它使用符号=>。 ●过滤数组赋值:这个赋值过程是对满足一定条件的数组元素进行赋值,而不是对数 组整体进行赋值。 ●并行指标数组赋值。这种赋值形式给出了一种有效的并行机制,能够大规模地对多 重指标变量进行赋值。 下面我们将分节讨论这5类赋值形式,首先给出一些例子如下:

平面四边形四节点等参单元Fortran源程序

C ************************************************ C * FINITE ELEMENT PROGRAM * C * FOR Two DIMENSIONAL ELASticity PROBLEM * C * WITH 4 NODE * C ************************************************ PROGRAM ELASTICITY character*32 dat,cch DIMENSION SK(80000),COOR(2,300),AE(4,11),MEL(5,200), & WG(4),JR(2,300),MA(600),R(600),iew(30),STRE(3,200) COMMON /CMN1/ NP,NE,NM,NR COMMON /CMN2/ N,MX,NH COMMON /CMN3/ RF(8),SKE(8,8),NN(8) WRITE(*,*)'PLEASE ENTER INPUT FILE NAME' READ(*,'(A)')DAT OPEN(4,FILE=dat,STATUS='OLD') OPEN(7,FILE='OUT',STATUS='UNKNOWN') READ(4,*)NP,NE,NM,NR WRITE(7,'(A,I6)')'NUMBER OF NODE---------------------NP=',np WRITE(7,'(A,I6)')'NUMBER OF ELEMENT------------------NE=',ne WRITE(7,'(A,I6)')'NUMBER OF MATERIAL-----------------NM=',nm WRITE(7,'(A,I6)')'NUMBER OF surporting---------------NC=',Nr CALL INPUT (JR,COOR,AE,MEL)

相关文档
最新文档