Syntax for openmp long directive list fortran77

随声附和 提交于 2019-12-10 22:58:34

问题


PROBLEM : Long list of directives openmp fortran77

c$omp parallel default(shared) private(i,k,i1,i2,i3,i4,i5,
     $ i6,x0,y0,z0,vnx0,vny0,vnz0,qs0)
c$omp do
      Task to be performed
c$omp end do
c$omp end parallel

I'm trying to compile the above program using ifort and it works fine. I have checked with the serial version and I get the same result

ifort -openmp -parallel -o ./solve 

But when I try to compile using gfortran it doesn't work.

gfortran -fopenmp 

I get the following error

quinckedrop.f:2341.57:

*$omp parallel default(shared) private(i,k,i1,i2,i3,i4,i5               
                                                         1
Error: Syntax error in OpenMP variable list at (1)
quinckedrop.f:2342.6:

     $        ,i6,x0,y0,z0,vnx0,vny0,vnz0,qs0)                          
      1
Error: Bad continuation line at (1)
quinckedrop.f:2342.15:

     $        ,i6,x0,y0,z0,vnx0,vny0,vnz0,qs0)                          
               1
Error: Invalid character in name at (1)
quinckedrop.f:2381.72:

*$omp end parallel                                                      
                                                                        1
Error: Unexpected !$OMP END PARALLEL statement at (1)
quinckedrop.f:2768.6:

     $        private(i,k,i1,i2,i3,i4,i5,i6,x0,y0,z0,vnx0,vny0,vnz0)    
      1
Error: Bad continuation line at (1)
quinckedrop.f:2768.21:

     $        private(i,k,i1,i2,i3,i4,i5,i6,x0,y0,z0,vnx0,vny0,vnz0)    
                     1
Error: PRIVATE statement at (1) is only allowed in the specification part of a module
quinckedrop.f:4302.6:

     $        private(i,k,i1,i2,i3,i4,i5,i6,x0,y0,z0)                   
      1
Error: Bad continuation line at (1)
quinckedrop.f:4302.21:

     $        private(i,k,i1,i2,i3,i4,i5,i6,x0,y0,z0)                   
                     1
Error: PRIVATE statement at (1) is only allowed in the specification part of a module
quinckedrop.f:5738.6:

     $        private(i,k,i1,i2,i3,i4,i5,i6,x0,y0,z0                    
      1
Error: Bad continuation line at (1)
quinckedrop.f:5738.21:

     $        private(i,k,i1,i2,i3,i4,i5,i6,x0,y0,z0                    
                     1
Error: PRIVATE statement at (1) is only allowed in the specification part of a module

This proposed solution doesn't work for me (may be because I am using fortran77)


回答1:


Your problem simply boils down to that the OpenMP continuation syntax for fixed format sources Fortran code is like this:

c$omp parallel blah
c$omp+private( blah )
c$omp+reduction( blah )

Well, to be more precise, all the 3 following forms for directives are equivalent:

c$omp
!$omp
*$omp

But in any case, a directive spread across several lines must be split using an extra character in the 6th column, as already shown. This character can be anything but a space or a zero. (thanks to Hristo Iliev for having corrected me in that. Initially mistakenly stated that the continuation character was supposed to be a +)

Adding the various necessary c$omp+ continuation lines should just solve your problem

This should look like this:

c$omp parallel default(shared) private(i,k,i1,i2,i3,i4,i5,
c$omp+ i6,x0,y0,z0,vnx0,vny0,vnz0,qs0)
c$omp do
      Task to be performed
c$omp end do
c$omp end parallel


来源:https://stackoverflow.com/questions/33704732/syntax-for-openmp-long-directive-list-fortran77

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!