Общий блок в openmp фортране
Мой код следующий:
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 для каждой подпрограммы, как значения переменных проходят через всю программу для одного потока. Любая помощь будет оценена. Спасибо!