2016-12-22 3 views
-1

이 내가 컴파일 할 때 나는 다음과 같은 오류를 얻을음이 아닌 폭이

module vars 
implicit none 


    real*8,dimension(:,:,:),allocatable :: u,v,w 

    real*8,dimension(:),allocatable :: zets 

end module vars 

program post_mean 
    use vars 

    implicit none 

    real*8 rtime,dt,deltax,deltay,rlenz 
    integer itime,nx0,ny0,nz,nzm 

    real*8 pi,pin,hpin,sum,sum1,dum,dum1 
    real*8 aalpha !Need to hardwire aalpha into output 

    integer i,j,k,l,ip,error 

    character (len=32) :: arg,filename,name,dot 
!Range of files to post-process: conc.min to conc.max 
    character (len=32) min, incr, max, i1_str,chr1,zone 
!Integers corresponding to the above range 
    integer i_min, i_incr, i_max, i1 

    chr1 = '00000' 
    dot = '.' 

    call getarg(0,arg) 
    if (iargc().eq.0) then 
    print *,'Usage: ',trim(arg),' filename' 
    stop 
    end if 

    call getarg(2,min) 
    call getarg(3,incr) 
    call getarg(4,max) 
    call getarg(1,arg) 


    read(min, '(i)') i_min 
    read(incr, '(i)') i_incr 
    read(max, '(i)') i_max 

    do i1 = i_min, i_max, i_incr 
    write(i1_str, '(i)') i1 
    filename=trim(arg)//trim(dot)//trim(adjustl(i1_str)) 

    open(21,file=filename,form='binary') 
    read(21) rtime,itime,dt,nx0,ny0,nz,deltax,deltay,rlenz 

    !allocate memory 
    allocate(u(nx0,ny0,nz),stat=error) 
    allocate(v(nx0,ny0,nz),stat=error) 
    allocate(w(nx0,ny0,nz),stat=error) 

    allocate(zets(nz),stat=error) 

    ! reading file 
    print *,'reading file ',filename 
    write(45,*)'reading file ',filename 
    rewind(21) 
    read(21) rtime,itime,dt,nx0,ny0,nz,deltax,deltay,rlenz 
    read(21) u,v,w 
    close(21) 
    write(45,*)'reading file complete',rtime,itime,dt,nx0,ny0,nz 

    !compute grid in the vertical direction 
    pi = 4.d0*atan(1.d0) 
    nzm = nz-1 
    pin = pi/dble(nzm) 

! set aalpha to 0 for GL pts. Alpha aproaches 1 for uniform. Cannot be 1 
     aalpha = 0.99d0 ! Need to hardwire alpha into output 
     do k = 1,nz/2 
     if(aalpha.eq.0)then 
      zets(k) = 0.5d0*rlenz*cos(dble(k-1)*pin) 
      zets(nz+1-k) = -zets(k) 
     else 
      zets(k)=0.5d0*rlenz*asin(aalpha*cos(dble(k-1)*pin))/asin(aalpha) 
      zets(nz+1-k) = -zets(k) 
     endif 
     enddo 
     if (mod(nz,2).eq.1) then 
     k = nz/2 + 1 
     zets(k) = 0.d0 
     endif 

    error = 10 


    ! Zero padding (for a total string length of 6 digits) for zone for easier 
    ! access into tecplot 
    zone = adjustr(trim(chr1)//trim(adjustl(adjustr(i1_str)))) 
    do j=1,15 
     if(zone(7:7).ne.' ')then 
     zone(1:1) = ' ' 
     zone = adjustl(zone) 
     else 
     go to 55 
     endif 
    enddo 
55 continue 

     name = "vel_"//trim(zone)//".dat" 
     open(1,file=name,status='unknown') 
     write(1,*)'tittle="conc"' 
     write(1,*)'variables=x,y,z,u,v,w' 
     write(1,*)'zone t="',trim(zone),'"',',i=',nx0-1,',j=',ny0-1,',k=',nz 
     do k=1,nz 
     do j=1,ny0-1 
      do i=1,nx0-1 
      write(1,26) deltax*(i-1),deltay*(j-1),zets(k)+rlenz/2.d0 & 
       ,u(i,j,k),v(i,j,k),w(i,j,k) 
      enddo 
     enddo 
     enddo 

    enddo 


26 format(6(3x,g25.5)) 
end program 

컴파일하려고 내 코드입니다 : 표준 포트란에서

[[email protected] Post_Proc]$ gfortran -c vel_Y2015M09D15.f90 -o vel.x 
vel_Y2015M09D15.f90:45.15: 

    read(min, '(i)') i_min 
       1 
Error: Nonnegative width required in format string at (1) 
vel_Y2015M09D15.f90:46.16: 

    read(incr, '(i)') i_incr 
       1 
Error: Nonnegative width required in format string at (1) 
vel_Y2015M09D15.f90:47.15: 

    read(max, '(i)') i_max 
       1 
Error: Nonnegative width required in format string at (1) 
vel_Y2015M09D15.f90:50.20: 

    write(i1_str, '(i)') i1 
        1 
Error: Nonnegative width required in format string at (1) 
vel_Y2015M09D15.f90:53.40: 

    open(21,file=filename,form='binary') 
             1 
Error: FORM specifier in OPEN statement at (1) has invalid value 'binary' 
+3

어떤 언어입니까? 그것은 C 또는 C++처럼 보이지 않습니다. – NathanOliver

+0

'endo'가 c 나 C++에없는 단어 하나 이상이라면주의를 끌기 위해이 태그가 여기에 있어야합니다. –

+0

그것은 fortran입니다. 나는 – cnsms

답변

1

를 포맷 편집 I, F, E, D, G와 같은 설명자에는 모두 너비가 필요합니다. 확장 기능 중 일부 컴파일러에서는 너비를 생략 할 수 있습니다. 분명히 gfortran은 이것들 중 하나가 아닙니다. gfortran은 아마도 I0과 같은 제로 너비의 Fortran 2008 기능을 지원합니다. 즉, 값의 최소 너비를 사용합니다.

FORM = 'BINARY'는 Microsoft Fortran PowerStation의 다른 확장 프로그램입니다. ACCESS = 'STREAM'이 표준 대체품입니다.

+0

i0을 넣으려고했지만 컴파일 할 때 여전히 동일한 오류가 발생합니다. 나는 i6을 말하고 그것을 수정했지만, 그것이 올바른 방법인지 확실하지 않습니다. 바이너리 부분에 대해, 내가 말했듯이, 폼 = 바이너리 액세스 = 스트림 대신에 할 필요가있다. – cnsms

+0

아마도 당신이 사용하고있는 컴파일러가 그 기능을 지원하기에는 너무 오래되었지만 합리적으로 현재의 gfortran 버전이 알고있다. 일반적으로 컴파일러가이 Fortran 2003 기능을 지원하면 form = 'binary'를 access = 'stream'으로 바꿀 수 있습니다. –