当前位置: 首页 > 程序语言 >求助fortran的rand使用,谢谢

求助fortran的rand使用,谢谢

作者 li_clifff
来源: 小木虫 350 7 举报帖子
+关注

程序如下:
subroutine generate_start_config(Np,box,T,x,v)
        implicit none
        integer maxNp
        parameter(maxNp=500000)
        integer Np
        real*8  x(maxNp,3),v(maxNp,3),T,box(3)
        real*8  invbox(3),vec(3),dist2,mindist2,mdtime
        common /mymdtime/ mdtime
        integer i,j,k,isbound(maxNp,2),N(maxNp)
        logical overlap
        mindist2 = 0.85**2                                        ! EDIT SETTING
        mdtime   = 0.D0
        do k=1,3; invbox(k)=1.D0/box(k); enddo
        do k=1,3; x(1,k) = (rand(100000)-0.5D0)*box(k); enddo
        !do k=1,3; x(1,k) = (rand()-0.5D0)*box(k); enddo
        do i=2,Np
         if (mod(i,max(1,Np/10)).eq.1) then
          print *,'inserted particle ',i,' of ',Np
         end if
         overlap = .true.
         do while (overlap)
          overlap = .false.
          do k=1,3; x(i,k) = (rand()-0.5D0)*box(k); enddo
          do j=1,i-1
           do k=1,3; vec(k) = x(i,k)-x(j,k); enddo
           call boundary(box,invbox,vec)
           dist2 = vec(1)**2+vec(2)**2+vec(3)**2
           if (dist2.lt.mindist2) then
            overlap = .true.
            goto 1
           end if
          enddo
1          continue
         enddo               
        enddo
        ! create velocities
        do i=1,Np
        do k=1,3
         v(i,k)=-6.D0
         do j=1,12; v(i,k) = v(i,k) + rand(); enddo
        enddo
        enddo
        call Tcontrol(Np,x,v,T,0.D0)
        ! create empty isbound and N
        do i=1,Np
         N(i)         = 1
         isbound(i,1) = 0
         isbound(i,2) = 0
        enddo
        ! writing files
        call writing_config(Np,Np,N,box,x,v)
        call writing_isbound(Np,isbound)
100     format(A50,10(I10,1x))
101     format(A50,10(F10.4,1x))
       
        return
        end

编译出错:
Error: This name does not have a type, and must have an explicit type.   [RAND]
Rand()表示的是生成0~1之间的随机数。不知道如何改进,请帮忙,谢谢 返回小木虫查看更多

今日热帖
  • 精华评论
  • snoopyzhao

    你用的什么编译器?
    rand() 不是一个标准函数,它属于编译器扩展……或许你使用的编译器不认识它,把它当成一个变量了,因此,需要你声明它的类型,呵呵……

    如果用新的编译器,考虑使用 RANDOM_NUMBER 这样的标准子程序吧……

  • li_clifff

    引用回帖:
    2楼: Originally posted by snoopyzhao at 2012-01-28 19:45:31:
    你用的什么编译器?
    rand() 不是一个标准函数,它属于编译器扩展……或许你使用的编译器不认识它,把它当成一个变量了,因此,需要你声明它的类型,呵呵……

    如果用新的编译器,考虑使用 RANDOM_NUMBER 这样的 ...

    我用的是visual fortran,我知道fortran里面生成随机数的标准函数,有ran0,ran1,ran2,ran3,就是不知道rand()相当于那个,

  • li_clifff

    random_number() 这样调用可以吗?

  • snoopyzhao

    引用回帖:
    3楼: Originally posted by li_clifff at 2012-01-28 20:03:00:
    我用的是visual fortran,我知道fortran里面生成随机数的标准函数,有ran0,ran1,ran2,ran3,就是不知道rand()相当于那个,

    这些也都是编译器的扩展,最好不要用,呵呵……

  • snoopyzhao

    引用回帖:
    4楼: Originally posted by li_clifff at 2012-01-28 20:07:51:
    random_number() 这样调用可以吗?

    这里有一个例子:

              program test_random_number
                REAL :: r(5,5)
                CALL init_random_seed()         ! see example of RANDOM_SEED
                CALL RANDOM_NUMBER(r)
              end program

    具体可以看:

    http://gcc.gnu.org/onlinedocs/gf ... l#RANDOM_005fNUMBER

  • li_clifff

    引用回帖:
    6楼: Originally posted by snoopyzhao at 2012-01-28 20:19:39:
    这里有一个例子:

              program test_random_number
                REAL :: r(5,5)
                CALL init_random_seed()         ! see example of RANDOM_SEED
                CALL RANDOM_NUMBER(r)
      ...

    谢谢,奇怪的是,我把原来的程序改成ran2(idum),定义加上integer idum, 并附上子程序:
          FUNCTION ran2(idum)
          INTEGER idum,IM1,IM2,IMM1,IA1,IA2,IQ1,IQ2,IR1,IR2,NTAB,NDIV
          REAL ran2,AM,EPS,RNMX
          PARAMETER (IM1=2147483563,IM2=2147483399,AM=1./IM1,IMM1=IM1-1,
         *IA1=40014,IA2=40692,IQ1=53668,IQ2=52774,IR1=12211,IR2=3791,
         *NTAB=32,NDIV=1+IMM1/NTAB,EPS=1.2e-7,RNMX=1.-EPS)
          INTEGER idum2,j,k,iv(NTAB),iy
          SAVE iv,iy,idum2
          DATA idum2/123456789/, iv/NTAB*0/, iy/0/
          if (idum.le.0) then
            idum=max(-idum,1)
            idum2=idum
            do 11 j=NTAB+8,1,-1
              k=idum/IQ1
              idum=IA1*(idum-k*IQ1)-k*IR1
              if (idum.lt.0) idum=idum+IM1
              if (j.le.NTAB) iv(j)=idum
    11      continue
            iy=iv(1)
          endif
          k=idum/IQ1
          idum=IA1*(idum-k*IQ1)-k*IR1
          if (idum.lt.0) idum=idum+IM1
          k=idum2/IQ2
          idum2=IA2*(idum2-k*IQ2)-k*IR2
          if (idum2.lt.0) idum2=idum2+IM2
          j=1+iy/NDIV
          iy=iv(j)-idum2
          iv(j)=idum
          if(iy.lt.1)iy=iy+IMM1
          ran2=min(AM*iy,RNMX)
          return
          END
    编译,还是出现一样的错误:
    Error: This name does not have a type, and must have an explicit type.   [RAN2]; 实在不解

  • snoopyzhao

    引用回帖:
    7楼: Originally posted by li_clifff at 2012-01-28 21:13:09:
    谢谢,奇怪的是,我把原来的程序改成ran2(idum),定义加上integer idum, 并附上子程序:
          FUNCTION ran2(idum)
          INTEGER idum,IM1,IM2,IMM1,IA1,IA2,IQ1,IQ2,IR1,IR2,NTAB,NDIV
          REAL ran2, ...

    这个函数本身似乎没有什么问题的

    你是不是把它加到上面的那个子程序中去的?如果是的话,要在那个子程序中声明,如

    real ran2

    因为你的那个子程序用了 implicit none

猜你喜欢
下载小木虫APP
与700万科研达人随时交流
  • 二维码
  • IOS
  • 安卓