1.判断读取文档有多少行数据(文档最后的空行不计入其中):

首先在变量定义区域下方和执行语句前声明在程序中要被调用的GetFileN函数:

!声明子函数 Integer GetFileN!获取文档行数 external GetFileN

接下来在函数外部后边写上被调用函数完整代码:(之后就可以在主函数中调用这个子函数了)

 !----------------------------------------------------------------------------
!自定义函数Function区域- https://www.jianshu.com/p/535db588d8a5
!调用自定义函数前要声明。
!自定义函数调用后会返回一个数值。
!----------------------------------------------------------------------------
!判断文档共有多少行 https://zhidao.baidu.com/question/1896723711901726340.html
Integer Function GetFileN( iFileUnit )
Implicit None
Integer , Intent( IN ) :: iFileUnit
Integer :: ioS
Character(Len=) :: cDummy
GetFileN =
Rewind( iFileUnit )
Do
Read( iFileUnit , * , ioStat = ioS ) cDummy
if ( ioS /= ) Exit
GetFileN = GetFileN +
End Do
Rewind( iFileUnit )
Return
end function GetFileN !https://blog.csdn.net/qq_38161676/article/details/80056503

2.使不同编译器声明的数据所占字节数统一,写一个module(放在代码最前面):

 module constant
implicit none
Integer , parameter :: myINT = SELECTED_INT_KIND( )!myINT 会赋予 的值,含义是,IVF 上,KIND= 的整型,就足够表达 -^ 到 ^ 之间的数了 http://fcode.cn/guide-43-1.html
integer, parameter :: fp = selected_real_kind(,)
end module

然后再程序中使用时:

use constant integer(myINT) :: iiso,icu,icd real(fp) ::gabestPersion(:)!共有8个参数和一个目标函数

3.动态数组,使用allocatable和allocate关键字:

一个冒号就是一维动态数组,两个冒号就是二维动态数组(或者叫做可变长数组,但都是矩形形状的)

动态数组的声明:

 real(fp), allocatable ::ParaLowerBound(:),ParaUpperBound(:),ParaPrecision(:),ParaMean(:),ParaSD(:)!本构参数部分
real(fp), allocatable ::oriPool(:,:),MatePool(:,:),oriPoolSort(:,:),MatePoolSort(:,:),XI(:),XII(:),XJ(:),XJJ(:),FitNess(:,:),goodFitness(:,:),bestPerson(:),fai0(:),GABc(:)!遗传算法数据大小
integer(myINT), allocatable ::ParaIsUseGauss(:)
character(len=), allocatable ::ParaName(:),lineDr(:)

动态数组的行列数重设置:

 readinLines=GetFileN()!文档总共有几行,代表有n和文档
allocate(ParaLowerBound(readinLines))!下限
allocate(ParaUpperBound(readinLines))!参数上限
allocate(ParaPrecision(readinLines))!动态数组默认起始索引从1开始,而不是从0开始
allocate(ParaMean(readinLines))
allocate(ParaSD(readinLines))
allocate(ParaIsUseGauss(readinLines))
allocate(ParaName(readinLines))
 allocate(oriPool(PopulationNum,GeneLength))
allocate(MatePool(PopulationNum,GeneLength))
allocate(FitNess(PopulationNum,GeneLength+))
allocate(goodFitness(PopulationNum,GeneLength+))
 
 allocate(XI(:GeneLength-))!一维动态数组。除了用长度法,也可以用上下限索引数来定义变长一维数组,二维同理
allocate(XJ(:GeneLength-))!索引从0开始,共GeneLength个元素
allocate(XII(:GeneLength-))
allocate(XJJ(:GeneLength-))
allocate(bestPerson(:GeneLength))
allocate(fai0(:GeneLength-))
allocate(GABc(:GeneLength-))

4.读取带注释的文档

比如我的文档,以一个星号 “*” 开头的表示注释行,每行的参数以等号为分隔符,等号后为具体值:

比如文档如下,名称为 2-3-CSUHParaRange.INP :

 *Parameter-name,lower-bound,upper-bound,precision,is-use-gauss,mean,Standard-Deviation
PROPM=0.5,1.8,0.01 ,,1.50,1.0
ENU=0.01 ,0.49 ,0.01,,0.30,1.0
PKAPPA=0.01 ,0.1,0.001,,0.05,1.0
PLAMDA=0.01 ,0.25 ,0.001,,0.30,1.0
PNVOID=0.2,2.5,0.01 ,,0.80,1.0
Z=0.1,1.25 ,0.01,,0.40,1.0
CHI=0.1,1.0,0.01,,0.80,1.0
SM=0.1,5.0,0.01,,2.50,1.0

第一行为注释行

后面为具体参数名称,等号,后面为上下限,精度,是否用高斯概率、平均值、方差。

读这样的文档的代码:

open(unit=,file="2-3-CSUHParaRange.INP",STATUS='OLD',ACCESS='SEQUENTIAL') !
readinLines=GetFileN()!文档总共有几行,代表有n和文档
j=!1有效数据多少行?
do i = , readinLines
read (, '(A200)') line
!!allocate(linetemp(lnblnk(line))) !lnblnk 字符串最后一个非空格的字符的位置 http://blog.sciencenet.cn/blog-456367-426706.html
!linetemp=TRIM(line)
!l=index (linetemp, "=")!ParaName(j),
l=index (line, "=")!ParaName(j),
m=LEN(TRIM(line))
k=index (line, "*")!k==1是注释行
!line=linetemp(l+:m)
if( k/= )then!如果不是注释行
j=j+!有效数据多一行
!BACKSPACE !回退一行,重新读入。*Parameter-name,lower-bound,upper-bound,precision,is-use-gauss,mean,Standard-Deviation
read(line(l+:m),'(3G14.6,I4,2G14.6)')ParaLowerBound(j),ParaUpperBound(j),ParaPrecision(j),ParaIsUseGauss(j),ParaMean(j),ParaSD(j)
end if
end do
GeneLength=j!有效参数个数,基因长度,

5.随机数按精度保留一定的位数:

 !每个元素赋初值
!保留几位小数 https://www.zybang.com/question/537e2bd0430e869ef1ed0ffe28d2d2cb.html
!fortran 取随机数 http://fcode.cn/guide-96-1.html
call random_seed()!在 IVF 编译器上,这一切都比较容易。因为它规定,只要random_seed不加入任何参数,则自动用时间设置种子
call random_number(oriPool) !// 随机数种子部分忽略不写
do i=, PopulationNum!遍历一代内每个个体
do j=,GeneLength ParaPrecisionCoBa=1.0/ParaPrecision(j)!精度的倒数
ParaLowerB=ParaLowerBound(j)*ParaPrecisionCoBa
ParaUpperB=ParaUpperBound(j)*ParaPrecisionCoBa
oriPool(i,j)= INT(abs(ParaUpperB-ParaLowerB) * oriPool(i,j) + min(ParaLowerB,ParaUpperB))/ParaPrecisionCoBa
!a = 1.0 !// 产生从 1.0
!b = 100.0 !// 到 100.0 之间的随机数
!x = abs(b-a) * x + min(a,b)
FitNess(i,j)=oriPool(i,j)
end do
end do

6.往文档中写入数据:

打开时的open语句决定了是覆盖还是添加内容:

6.1:

  open(unit=,file="4-bestOut.dat",STATUS='OLD',ACCESS='SEQUENTIAL')!输出每代最好的

上面的语句是打开一个名为   4-bestOut.dat  的文本文档,STATUS='OLD' 表明这个文档在执行这句前必须已经存在,

ACCESS='SEQUENTIAL'表明这个文档不是二进制文档,就是普通的文本文档。
 write(,'(I5,8G14.6,G18.10)')iterNum,bestPerson(),bestPerson(),bestPerson(),bestPerson(),bestPerson(),bestPerson(),bestPerson(),bestPerson(),bestPerson()
每次写东西都是添加到这个文档后面。

--------------------------------:
6.2:
 OPEN(,FILE='CSUHPicOutError.DAT',STATUS='UNKNOWN',ACCESS='SEQUENTIAL')
WRITE(,'(8F15.8,5E20.8)')para(),para(),para(),para(),para(),para(),para(),para(),ErrorObjqz,ErrorObjpz,ErrorObjeVoid,ErrorObju,objfun

上面的语句是打开一维名为 CSUHPicOutError.DAT 的文本文档,STATUS='UNKNOWN' 表示如果不存在就新建一个这个名称的文档。 ACCESS='SEQUENTIAL'表示读取的时候是顺序读,而且不是二进制文档,是文本文档。写入的时候也是顺序写。

!UNKNOWN REPLACE http://blog.sina.com.cn/s/blog_6617725a0100rrr0.html  http://muchong.com/html/201212/5344833.html

7. if语法

== 表示逻辑判断是否相等( .EQ. )

/= 表示逻辑判断是否不等( .NE. )

>=     .GT.

<=     .LT.

if ( isnan(ErrorObj) ) then!如果实数ErrorObj是NAN,也就是not a number(不是数),则 ErrorObj=1e300 end if

if(a==b)then ... end if

                          if(ErrorObj>10000000.0)then!如果误差是无穷大,那么为了提高效率,就重新初始化这个个体
...
else
... end if

8. 分支选择   SELECT CASE  :

                 !判断是哪种实验    %1代表不排水,2代表等p,3代表围压不变,4代表侧限,.代表减载的三轴伸长
SELECT CASE (myType) case () ! ! 师姐三轴不排水(不同的b)
dS1 = de1(i) / ((C11 + b * C12) - (C11 + C21 + C31 + b * (C12 + C22 + C32)) * (( - b) * C12 + C13) / (C13 + C23 + C33 + ( - b) * (C12 + C22 + C32)))!
dS3 = -(C11 + C21 + C31 + b * (C12 + C22 + C32)) * dS1 / (C13 + C23 + C33 + ( - b) * (C12 + C22 + C32))!
dS2 = b * dS1 + ( - b) * dS3!!这个根据b的定义求导可得
de2 = (C21 + b * C22) * dS1 + (( - b) * C22 + C23) * dS3!
de3 = (C31 + b * C32) * dS1 + (( - b) * C32 + C33) * dS3! case () !我的等p
dS1 = (b - ) * de1(i) / (- * C11 + b * C11 + C12 - * b * C12 + C13 + b * C13)!
dS2 = ( * b - ) * de1(i) / ( * C11 - b * C11 - C12 + * b * C12 - C13 - b * C13)!
dS3 = ( + b) * de1(i) / (- * C11 + b * C11 + C12 - * b * C12 + C13 + b * C13)!
de2 = C21 * dS1 - C22 * dS1 - C22 * dS3 + C23 * dS3!
de3 = C31 * dS1 - C32 * dS1 - C32 * dS3 + C33 * dS3! case () !我的围压不变
dS1 = de1(i) / (C11 + b * C12)!
dS2 = b * de1(i) / (C11 + b * C12)!
dS3 = !
de2 = (C21 + b * C22) * dS1!
de3 = (C31 + b * C32) * dS1! case () !侧限压缩
dS1 = (C22 - b * C22 + C23) * de1(i) / (b * (C12 * C21 - C11 * C22 - C13 * C22 + C12 * C23) - C13 * C21 + C11 * C22 + C11 * C23 - C12 * C21)!
dS2 = (-C21 + b * (C21 + C23)) * de1(i) / (b * (C12 * C21 - C11 * C22 - C13 * C22 + C12 * C23) - C13 * C21 + C11 * C22 + C11 * C23 - C12 * C21)!
dS3 = (C21 + b * C22) * de1(i) / (b * (C12 * C21 + C11 * C22 + C13 * C22 - C12 * C23) + C13 * C21 - C11 * C22 - C11 * C23 + C12 * C21)!
de2 = !
de3 = ! end select

9.循环 do ... end do :

 !输出计算结果到文档  OPEN(UNIT=,position='Append',FILE='s444.DAT'),
do m= , textNums!第m个文档
l=+m+textNums!文档编号
OPEN(l,FILE=TRIM(TextListOut(m)),STATUS='UNKNOWN',ACCESS='SEQUENTIAL')!UNKNOWN REPLACE http://blog.sina.com.cn/s/blog_6617725a0100rrr0.html http://muchong.com/html/201212/5344833.html
!write(*,*)TRIM(TextListOut(m))
do j = , DataLines(m)!首先遍历实验数据
write(l,'(E20.8,1H,,E20.8,1H,,E20.8,1H,,E20.8,1H,,E20.8)')ArrayTheoryData(m,j,),ArrayTheoryData(m,j,),ArrayTheoryData(m,j,),ArrayTheoryData(m,j,),ArrayTheoryData(m,j,)
end do
end do

10. 定义子函数:

 !产生 [a,b]之间的随机整数
Integer Function IntRandRange(a,b)
use constant
real(fp)::x
integer(myINT) :: a,b !CALL RANDOM_SEED()
CALL RANDOM_NUMBER (x)!大于等于0小于1的实数
IntRandRange = INT(abs(b-a) * x + min(a,b))
end function !产生 [a,b]之间的随机实数
real Function RealRandRange(a,b)
use constant
real(fp)::x,a,b
!CALL RANDOM_SEED()
CALL RANDOM_NUMBER (x)!大于等于0小于1的实数
RealRandRange = (abs(b-a) * x + min(a,b))
end function

调用的时候:

if(PcR<=Pc)then!交配 单纯性交叉算子 call random_number(u) !Refl wife=IntRandRange(,PopulationNum)

if(PcR<=Pc)then!交配 单纯性交叉算子
call random_number(u) !Refl
wife=IntRandRange(1,PopulationNum)

11. 读入字符串放入整型变量中:

     do i = , iiso
read(,'(A1000)')fileCharacterStr!读取一行所有字符串
fileNameLen=LEN(TRIM(fileCharacterStr))!字符串总长度
TextList(i)=fileCharacterStr(:fileNameLen-)!文档路径和名称列表
!write(*,*)TRIM(TextList(i))
!%1代表不排水,2代表等p,3代表围压不变,4代表侧限,.代表减载的三轴伸长
Read( fileCharacterStr(fileNameLen:fileNameLen), * ) myType(i)!读入字符串fileCharacterStr(fileNameLen:fileNameLen)的内容(整型的字符)存放到整型变量myType中 read( 字符串 , * ) 数值类型变量 可以将字符串转换为数值型 https://zhidao.baidu.com/question/987823583256300059.html
Read( fileCharacterStr(fileNameLen:fileNameLen), '(a1)' )myTypeStr!read( 字符串 , '(格式)' ) 放入字符串内容的变量
!write(myTypeStr,"(I4)")myType(i)
StrTemp1=TextList(i)
StrTemp2=StrTemp1(:(LEN(TRIM((StrTemp1)))-))
TextListOut(i)=TRIM((StrTemp2))//'-'//TRIM((myTypeStr))//'.DAT'!http://blog.sina.com.cn/s/blog_14ece821b0102wuqi.html
end do

fortran常用语句--读写带注释文档、动态数组等语法的更多相关文章

  1. Doxygen给C程序生成注释文档

    近段时间,一直在学习华为C语言编程规范(2011版),在“注释”这一章中发现了一种“Doxygen”的注释转文档工具,查看诸多相关资料,并进行编程实践,终于可以利用Doxygen给C程序生成注释文档. ...

  2. [Dynamic Language] 用Sphinx自动生成python代码注释文档

    用Sphinx自动生成python代码注释文档 pip install -U sphinx 安装好了之后,对Python代码的文档,一般使用sphinx-apidoc来自动生成:查看帮助mac-abe ...

  3. 利用JSDOC快速生成注释文档,非常棒。

    有时往往我们需要建一个文档来记录js中的一些代码注释,比如一些公共的函数,又或者一些类,在团队合作中,文档接口也是必不可少的,传统的方式多少有些不便,这里介绍一个工具,它叫JSDOC,它可以用来将注释 ...

  4. VS2010 生成Xml格式的注释文档

    项目, 属性, build, 勾选xml document file, 重新build, 即可生成xml注释文件, 然后还得找工具软件(看到anytao推荐SandCastle) 生成更易读的帮助文档 ...

  5. 在eclipse中生成html注释文档

    生成api文档 文档注释/** 1.描述 2.@author 作者 @version 版本 3.@param 参数 @return 返回值的含义 @throws 抛出异常描述 @deprecated ...

  6. Xcode 利用VVDocumenter 生成注释 通过设置 再生成注释文档

    在写代码的时候,如果按照一定的规范在头文件里写上注释的话, 就可以利用Xcode的文档自动输出功能生成一份完整的HTML项目文档. 生成的格式和Apple Developer网站上的API文档几乎是一 ...

  7. Android Studio javadoc 生成注释文档

    相信大家刚开始写代码的时候就被前辈告知了要养成写注释的好习惯,今天我们来了解一下如何利用我们平时写的注释生成文档,一起来看看吧! 其实注释格式一般如下两种:  /*  *普通多行  *注释  */ / ...

  8. 使用doxygen生成注释文档

    1. doxygen下载地址:http://www.stack.nl/~dimitri/doxygen/ 2. 参考http://wenku.baidu.com/link?url=ETvBUyaR9f ...

  9. MySQL 常用语句 (汇集)

    原文地址:MySql常用语句作者:wuyanle 一.mysql常用语句 创建,删除和最基本查询: 显示数据库  mysql->show databases; 创建数据库  mysql-> ...

随机推荐

  1. 自然语言推断(NLI)、文本相似度相关开源项目推荐(Pytorch 实现)

    Awesome-Repositories-for-NLI-and-Semantic-Similarity mainly record pytorch implementations for NLI a ...

  2. mybatis调用存储过程并且有多个返回output值

    mapperxml配置 配置时需要注意 parameterMap在mybatis3.2.6版本已经不再用了,而是使用 parameterType <select id="callget ...

  3. 【C++】C++中的string类的用法总结

    相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是肯 ...

  4. linux 安装配置Jenkins

    1.首先准备java环境,安装JDK 2.下载jenkins至Linux服务器 下载地址:https://wiki.jenkins-ci.org/display/JENKINS/Installing+ ...

  5. JavaScript进度条(datalist/repeater等多个进度条)

    JS代码: function SingleProgressBar() { var iload = document.getElementById("iLoading"); var ...

  6. python基础之socket编程

    一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 八 基于UDP的套接字 九 粘包现象 十 什么是 ...

  7. JMeter之自动重定向和跟随重定向的区别

    自动重定向:只针对Get和Head请求,自动重定向转向到最终目标页面,但是Jmeter不记录重定向的中间页面过程,只记录最终页面返回结果.在结果树中,只能看到最终页面的服务器返回. 跟随重定向:是ht ...

  8. Python学习之MacBook Pro中Python3.7安装pip以及numpy

    安装pip查看https://www.cnblogs.com/cxmo/p/10513502.html 安装numpy只需要在终端(在pycharm界面的终端下)输入:pip3.7 install n ...

  9. FFmpeg 开发环境搭建及第一个程序 Hello FFmpeg 编写

    1. FFmpeg 的安装 ./configure make make install 默认会将 FFmpeg 安装至 /usr/local 目录下(可通过 configure 使用 "-p ...

  10. linux之systemd---学习

    linux 操作系统的启动首先从 BIOS 开始,接下来进入 boot loader,由 bootloader 载入内核,进行内核初始化.内核初始化的最后一步就是启动 PID 为 1 的 init 进 ...