I have a nested do loop in an openmp fortran 77 code that I am unable to parallelize (the code gives a segmentation fault error when it is run). I have a very similar nested do loop in a different subroutine of the same code that runs parallel with no issues. Here is the nested do loop that I am having problems with:
do n=1,num_p C$OMP PARALLEL DO DEFAULT(SHARED), PRIVATE(l,i1,i2,j1,j2,k1,k2 C$OMP& ,i,j,k,i_t,j_t,i_ddf,j_ddf,ddf_dum) do l=1,n_l(n) call del_fn(l,n) i1=p_iw(l,n) i2=p_ie(l,n) j1=p_js(l,n) j2=p_jn(l,n) k1=p_kb(l,n) k2=p_kt(l,n) do i=i1,i2 i_ddf=i-i1+1 if(i .lt. 1) then i_t=nx+i elseif (i .gt. nx) then i_t=i-nx else i_t=i endif do j=j1,j2 j_ddf=j-j1+1 if(j .lt.1) then j_t=ny+j elseif(j .gt. ny) then j_t=j-ny else j_t=j endif do k=k1,k2 ddf(l,n,i_ddf,j_ddf,k-k1+1) = ddf_dum(i_t,j_t,k) enddo enddo enddo enddo C$OMP END PARALLEL DO enddo I have narrowed the problem down to ddf_dum(i_t,j_t,k). When this term is turned off (say I replace it by 0.d0), the code runs fine.
On the other hand, I have a very similar nested do loop that runs parallel with no issues. Below is that nested do loop that runs parallel with no issues. Can anyone please identify what I am missing here?
do n=1,1 C$OMP PARALLEL DO DEFAULT(SHARED), PRIVATE(l,i1,i2,j1,j2,k1,k2 C$OMP& ,i,j,k,i_f,j_f,i_ddf,j_ddf) do l=1,n_l(n) i1=p_iw(l,n) i2=p_ie(l,n) j1=p_js(l,n) j2=p_jn(l,n) k1=p_kb(l,n) k2=p_kt(l,n) u_forcing(l,n)= (u_p(l,n)-up_tilde(l,n))/dt v_forcing(l,n)= (v_p(l,n)-vp_tilde(l,n))/dt w_forcing(l,n)= (w_p(l,n)-wp_tilde(l,n))/dt do i=i1,i2 i_ddf=i-i1+1 if(i .lt. 1) then i_f=nx+i elseif (i .gt. nx) then i_f=i-nx else i_f=i endif do j=j1,j2 j_ddf=j-j1+1 if(j .lt.1) then j_f=ny+j elseif(j .gt. ny) then j_f=j-ny else j_f=j endif do k=k1,k2 forcing_x(i_f,j_f,k)=forcing_x(i_f,j_f,k)+u_forcing(l,n) & *ddf_n(l,n,i_ddf,j_ddf,k-k1+1)*dv_l(l,n) forcing_y(i_f,j_f,k)=forcing_y(i_f,j_f,k)+v_forcing(l,n) & *ddf_n(l,n,i_ddf,j_ddf,k-k1+1)*dv_l(l,n) forcing_z(i_f,j_f,k)=forcing_z(i_f,j_f,k)+w_forcing(l,n) & *ddf_n(l,n,i_ddf,j_ddf,k-k1+1)*dv_l(l,n) enddo enddo enddo enddo C$OMP END PARALLEL DO enddo