我的代码如下:
program
...
! Loop which I want to parallelize
!$OMP parallel DO
I = 1, N
...
call FORD(i,j)
...
!$OMP END parallel DO
end program
subroutine FORD(i,j)
logical servo,genflg,lapflg
dimension c(nvarc)
dimension zl(3),zg(3),v1(3,3),v2(3,3),rn(3),
. rcg1(3),rcg2(3),ru1(3),ru2(3),
. rott1(3),rott2(3),velr(3),dt(3),
. dfs(3),ftu(3),fnr(3),amomet(3
common /contact/ iab11,iab22,xx2,yy2,zz2,
. ra1,rb1,rc1,ra2,rb2,rc2,
. v1,v2,
. xg1,yg1,zg1,xg2,yg2,zg2
common /ellip/ b1,c1,f1,g1,h1,d1,
. b2,c2,f2,g2,h2,p2,q2,r2,d2
common /root/ root1,root2
common /tab1/
. itype(ndim1),nconti(5),nvarc,
. nconta,nconta1
common /bal1/
. ra(5),rb(5),rc(5),
. amomen(ndim),fwall(6),press(3),wmomet(6,2),
. rot(ndim),ttheta(ndim*3),rstp(ndim*3),forces(ndim),
. ssampl(3,3),edserv(3,3),tdisp(ndim),adisp(ndim),vel(ndim),
. del(3),xmax(3)
CALL CONDACT(genflg,lapflg)
return
end subroutine
SUBROUTINE CONDACT(genflg,lapflg)
implicit double precision (a-h,o-z)
logical rflag,dflag,error,gmvflg,grvflg,ctrlflg,depflg
parameter (ndim1 = 20002)
parameter (ndim = 3*ndim1)
parameter (nkmm = 9000000)
parameter (nkwall = 50000)
character*4 hed
logical genflg,lapflg,fast
dimension v1(3,3),v2(3,3)
common /contact/ iab11,iab22,xx2,yy2,zz2,
. ra1,rb1,rc1,ra2,rb2,rc2,
. v1,v2,
. xg1,yg1,zg1,xg2,yg2,zg2
common /ellip/ b1,c1,f1,g1,h1,d1,b2,c2,f2,g2,h2,p2,q2,r2,d2
common /switch/ nk
common /root/ root1,root2
common /nroot/ rt(5),nrt
common /bal2/xmax(3)
call function f(x)
C
C......
C
RETURN
END
function f(x)
implicit double precision (a-h,o-z)
common /contact/ iab11,iab22,xx2,yy2,zz2,
. ra1,rb1,rc1,ra2,rb2,rc2,
. v1,v2,
. xg1,yg1,zg1,xg2,yg2,zg2
common /ellip/ b1,c1,f1,g1,h1,d1,
. b2,c2,f2,g2,h2,p2,q2,r2,d2
common /switch/ nk
common /nroot/ rt(5),nrt
dimension a(3,3),b(3),v1(3,3),v2(3,3)
..
..
..
..
end
我的问题是在并行循环内,每个子程序中的所有变量(在公共块内或公共块外)都是私有的吗? 1.如果没有,我应该使用threadprivate作为公共块,并在声明后使用每个子例程中的变量私有吗? 2.每个线程通过2个子程序和一个函数。子程序有一些相同的公共块和变量。如果我为每个子程序使用threadprivate公共块,那么变量值如何通过单个线程的整个程序。 任何帮助将不胜感激。谢谢!