zoukankan      html  css  js  c++  java
  • fortran常用语句--读写带注释文档、动态数组等语法

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

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

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

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

     1 !----------------------------------------------------------------------------
     2 !自定义函数Function区域- https://www.jianshu.com/p/535db588d8a5
     3 !调用自定义函数前要声明。
     4 !自定义函数调用后会返回一个数值。
     5 !----------------------------------------------------------------------------
     6 !判断文档共有多少行 https://zhidao.baidu.com/question/1896723711901726340.html
     7 Integer Function GetFileN( iFileUnit )
     8 Implicit None
     9 Integer , Intent( IN ) :: iFileUnit
    10 Integer :: ioS
    11 Character(Len=1) :: cDummy
    12 GetFileN = 0
    13 Rewind( iFileUnit )
    14 Do
    15 Read( iFileUnit , * , ioStat = ioS ) cDummy
    16 if ( ioS /= 0 ) Exit
    17 GetFileN = GetFileN + 1
    18 End Do
    19 Rewind( iFileUnit )
    20 Return    
    21     end function GetFileN  !https://blog.csdn.net/qq_38161676/article/details/80056503  

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

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

    然后再程序中使用时:

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

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

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

    动态数组的声明:

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

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

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

    4.读取带注释的文档

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

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

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

    第一行为注释行

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

    读这样的文档的代码:

    open(unit=201,file="2-3-CSUHParaRange.INP",STATUS='OLD',ACCESS='SEQUENTIAL') !
    readinLines=GetFileN(201)!文档总共有几行,代表有n和文档 
    j=0!1有效数据多少行?
    do i = 1, readinLines
    read (201, '(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+1:m)
    if( k/= 1)then!如果不是注释行
        j=j+1!有效数据多一行
        !BACKSPACE 201!回退一行,重新读入。*Parameter-name,lower-bound,upper-bound,precision,is-use-gauss,mean,Standard-Deviation
        read(line(l+1: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.随机数按精度保留一定的位数:

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

    6.往文档中写入数据:

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

    6.1:

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

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

    ACCESS='SEQUENTIAL'表明这个文档不是二进制文档,就是普通的文本文档。

    1 write(203,'(I5,8G14.6,G18.10)')iterNum,bestPerson(0),bestPerson(1),bestPerson(2),bestPerson(3),bestPerson(4),bestPerson(5),bestPerson(6),bestPerson(7),bestPerson(8)
    每次写东西都是添加到这个文档后面。

    --------------------------------:
    6.2:
    1 OPEN(103,FILE='CSUHPicOutError.DAT',STATUS='UNKNOWN',ACCESS='SEQUENTIAL')
    2 WRITE(103,'(8F15.8,5E20.8)')para(0),para(1),para(2),para(3),para(4),para(5),para(6),para(7),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.

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

     1 if(a==b)then 2 ... 3 end if 

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

    8. 分支选择   SELECT CASE  :

     1                 !判断是哪种实验    %1代表不排水,2代表等p,3代表围压不变,4代表侧限,5.代表减载的三轴伸长
     2                 SELECT CASE (myType)
     3                 
     4                     case (1)
     5                         
     6                             ! !     师姐三轴不排水(不同的b)
     7                             dS1 = de1(i) / ((C11 + b * C12) - (C11 + C21 + C31 + b * (C12 + C22 + C32)) * ((1 - b) * C12 + C13) / (C13 + C23 + C33 + (1 - b) * (C12 + C22 + C32)))!
     8                             dS3 = -(C11 + C21 + C31 + b * (C12 + C22 + C32)) * dS1 / (C13 + C23 + C33 + (1 - b) * (C12 + C22 + C32))!
     9                             dS2 = b * dS1 + (1 - b) * dS3!!这个根据b的定义求导可得
    10                             de2 = (C21 + b * C22) * dS1 + ((1 - b) * C22 + C23) * dS3!
    11                             de3 = (C31 + b * C32) * dS1 + ((1 - b) * C32 + C33) * dS3!
    12                         
    13                      
    14                     case (2)
    15                         
    16                             !我的等p
    17                             dS1 = (b - 2) * de1(i) / (-2 * C11 + b * C11 + C12 - 2 * b * C12 + C13 + b * C13)!
    18                             dS2 = (2 * b - 1) * de1(i) / (2 * C11 - b * C11 - C12 + 2 * b * C12 - C13 - b * C13)!
    19                             dS3 = (1 + b) * de1(i) / (-2 * C11 + b * C11 + C12 - 2 * b * C12 + C13 + b * C13)!
    20                             de2 = C21 * dS1 - C22 * dS1 - C22 * dS3 + C23 * dS3!
    21                             de3 = C31 * dS1 - C32 * dS1 - C32 * dS3 + C33 * dS3!
    22 
    23                         
    24                      
    25                     case (3)
    26                         
    27                             !我的围压不变
    28                             dS1 = de1(i) / (C11 + b * C12)!
    29                             dS2 = b * de1(i) / (C11 + b * C12)!
    30                             dS3 = 0!
    31                             de2 = (C21 + b * C22) * dS1!
    32                             de3 = (C31 + b * C32) * dS1!
    33                         
    34                      
    35                     case (4)
    36                         
    37                             !侧限压缩
    38                             dS1 = (C22 - b * C22 + C23) * de1(i) / (b * (C12 * C21 - C11 * C22 - C13 * C22 + C12 * C23) - C13 * C21 + C11 * C22 + C11 * C23 - C12 * C21)!
    39                             dS2 = (-C21 + b * (C21 + C23)) * de1(i) / (b * (C12 * C21 - C11 * C22 - C13 * C22 + C12 * C23) - C13 * C21 + C11 * C22 + C11 * C23 - C12 * C21)!
    40                             dS3 = (C21 + b * C22) * de1(i) / (b * (C12 * C21 + C11 * C22 + C13 * C22 - C12 * C23) + C13 * C21 - C11 * C22 - C11 * C23 + C12 * C21)!
    41                             de2 = 0!
    42                             de3 = 0!
    43                         
    44                     end select      

    9.循环 do ... end do :

    1 !输出计算结果到文档  OPEN(UNIT=3,position='Append',FILE='s444.DAT'),
    2 do m= 1, textNums!第m个文档 
    3      l=20+m+textNums!文档编号
    4     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
    5        !write(*,*)TRIM(TextListOut(m))
    6     do j = 1, DataLines(m)!首先遍历实验数据
    7         write(l,'(E20.8,1H,,E20.8,1H,,E20.8,1H,,E20.8,1H,,E20.8)')ArrayTheoryData(m,j,1),ArrayTheoryData(m,j,2),ArrayTheoryData(m,j,3),ArrayTheoryData(m,j,4),ArrayTheoryData(m,j,5)       
    8     end do
    9 end do

    10. 定义子函数:

     1 !产生 [a,b]之间的随机整数    
     2 Integer Function IntRandRange(a,b) 
     3 use constant
     4 real(fp)::x
     5 integer(myINT) :: a,b
     6 
     7 !CALL RANDOM_SEED()
     8 CALL RANDOM_NUMBER (x)!大于等于0小于1的实数
     9  IntRandRange = INT(abs(b-a) * x + min(a,b))
    10     end function
    11 
    12 !产生 [a,b]之间的随机实数    
    13 real Function RealRandRange(a,b) 
    14 use constant
    15 real(fp)::x,a,b
    16 !CALL RANDOM_SEED()
    17 CALL RANDOM_NUMBER (x)!大于等于0小于1的实数
    18  RealRandRange = (abs(b-a) * x + min(a,b))
    19 end function

    调用的时候:

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

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

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

     1     do i = 1, iiso
     2     read(506,'(A1000)')fileCharacterStr!读取一行所有字符串
     3     fileNameLen=LEN(TRIM(fileCharacterStr))!字符串总长度
     4      TextList(i)=fileCharacterStr(1:fileNameLen-2)!文档路径和名称列表
     5      !write(*,*)TRIM(TextList(i))
     6      !%1代表不排水,2代表等p,3代表围压不变,4代表侧限,5.代表减载的三轴伸长
     7      Read( fileCharacterStr(fileNameLen:fileNameLen), * ) myType(i)!读入字符串fileCharacterStr(fileNameLen:fileNameLen)的内容(整型的字符)存放到整型变量myType中 read( 字符串 , * ) 数值类型变量    可以将字符串转换为数值型   https://zhidao.baidu.com/question/987823583256300059.html
     8      Read( fileCharacterStr(fileNameLen:fileNameLen), '(a1)' )myTypeStr!read( 字符串 , '(格式)' ) 放入字符串内容的变量    
     9      !write(myTypeStr,"(I4)")myType(i)
    10      StrTemp1=TextList(i)
    11      StrTemp2=StrTemp1(1:(LEN(TRIM((StrTemp1)))-4))
    12      TextListOut(i)=TRIM((StrTemp2))//'-'//TRIM((myTypeStr))//'.DAT'!http://blog.sina.com.cn/s/blog_14ece821b0102wuqi.html      
    13 end do
  • 相关阅读:
    Scrapy爬虫快速入门
    python垃圾回收机制
    django项目的uwsgi方式启停脚本
    hdu 5504 GT and sequence
    python 在 for i in range() 块中改变 i 的值的效果
    linux 在终端中打开图形化文件管理器
    apache 支持 php
    Mysql 学习记录
    git 导入代码到已有仓库
    python import 自己的包
  • 原文地址:https://www.cnblogs.com/zhubinglong/p/10576597.html
Copyright © 2011-2022 走看看