Fortran 90中的数组,函数,变量和size()

时间:2019-08-15 02:50:42

标签: fortran gfortran fortran90 fortran77

我对这种语言非常陌生,他的任务是将一些代码从Fortran 77转换为90,并修复该代码。我应该执行以下操作:

  1. 删除隐式语句。

  2. 将数组符号转换为固定形状[意味着IRAN(32)应该为IRAN(:)]

  3. 使用size()函数检查数组大小。

在此做什么的任何帮助将不胜感激。根据源代码,我认为我应该制作一个主程序,然后制作一个子程序makevec,该子程序使用置换函数px(i);我不确定该怎么做。这听起来正确吗?变量名称呢?我查找了其中的一些(例如伊朗),它们似乎与随机数生成器模块有关(但再次,我不确定本段中的内容)。我还在线找到了模块“ mod_kinds.F”和“ ran_state.F”,但不确定它们是否有助于该程序的目的。

我已经在程序中删除了隐式语句,在主程序中声明了一些变量,并将if循环替换为“ select case(iran(i)。”)。我也摆脱了“ return”,并将所有内容都改为小写。

这是源代码:

SUBROUTINE MAKEVEC(NVAR,NOFIX,NRANFIX,IRAN,X,VALFIX,RANFIXEST,PX)
    IMPLICIT REAL*8(A-H,O-Z)
    DIMENSION IRAN(32),X(30),VALFIX(20),PX(32),RANFIXEST(20)
C THIS ROUTINE, CALLED BY MAIN, INPUTS NVAR, NOFIX, NRANFIX, IRAN,    
C X, VALFIX, AND RANFIXEST, AND RETURNS PX(I) = A COMBINATION OF THE
C VALUES IN X, VALFIX, AND RANFIXEST, IN THE PROPER ORDER (AS
C DETERMINED BY IRAN).
  NNNVAR = 0
  NNNFIX = 0
  NNNRANFIX = 0

  DO I = 1,NVAR+NOFIX+NRANFIX

   IF(IRAN(I) .EQ. 1) THEN
    NNNVAR = NNNVAR+1
    PX(I) = X(NNNVAR)
   ENDIF

   IF(IRAN(I) .EQ. 0) THEN
    NNNFIX = NNNFIX+1
    PX(I) = VALFIX(NNNFIX)
   ENDIF

   IF(IRAN(I) .EQ. 2) THEN
    NNNRANFIX = NNNRANFIX+1
    PX(I) = RANFIXEST(NNNRANFIX)
   ENDIF

  END DO
c write (,) "Initialized IG",NNNVAR,NNNFIX,NNNRANFIX
  RETURN
  END

这是我到目前为止所做的(我知道有很多伪代码,并且不会编译):

program Initialized_IG
  implicit none

  interface
  subroutine makevec(var,nofix,nranfix,iran,x,valfix,&
             ranfixest,px)
  real, intent (in) :: nvar,nofix,nranfix,iran,x,valfix,&
                       ranfixest
  real, intent (out) :: px(i)

  REAL(kind=8) :: i
  real, dimension(32) :: iran, px
  real, dimension(30) :: x
  real, dimension(20) :: valfix, ranfixest

  integer :: i,nnnvar,nofix,nranfix,sum      
  sum = nvar + nofix + nranfix
  end interface

  nnnvar = 0
  nnnfix = 0
  nnnranfix = 0

    CALL RANDOM_NUMBER(i)
    call subroutine makevec

       select case (iran(i))

      case (1)
          nnnvar = nnnvar+1
          px(i) = x(nnnvar) 
      case (0)
          nnnfix = nnnfix+1
          px(i) = valfix(nnnfix)
      case (2)
          nnnranfix = nnnranfix+1
          px(i) = ranfixest(nnnranfix)
  end select

  write (*,*) "Initialized IG", nnnvar,nnnfix,nnnranfix        
  end program Initialized_IG

0 个答案:

没有答案