2016-12-22 5 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

В стандартном Fortran, формат редактирование дескрипторы, такие как I, F, E, D, G, требуют ширины. Некоторые компиляторы, как расширение, позволяют вам опустить ширину. Очевидно, gfortran не является одним из них. Вероятно, ваш gfortran поддерживает функцию Fortran 2008 с нулевой шириной, например I0, что означает использование минимально возможной ширины для значения.

FORM = 'BINARY' - это еще одно расширение (от Microsoft Fortran PowerStation). ACCESS = 'STREAM' - стандартная замена.

+0

Я попытался поставить i0, но он все равно дает мне ту же ошибку при компиляции. я включил i6 и исправил его, но я не уверен, что это правильный способ сделать это. для двоичной части, мне нужно было бы сделать, как вы сказали, вместо form = binary have access = stream – cnsms

+0

Возможно, используемый вами компилятор слишком велик, чтобы поддерживать эту функцию, но я знаю, что разумные текущие версии gfortran. В общем, да, вы можете заменить form = 'binary' на access = 'stream', если ваш компилятор поддерживает эту функцию Fortran 2003. –