我有一个使用Red-Black SOR求解器迭代的方域。由于域的中心线上的奇点,我必须将每个部分(红色和黑色)分成三个不同的区域(上部区域,下部区域和中心线)。我想知道如何使用openMP并行化红色和黑色部分的外部循环,以便它是最有效的。在内部循环中使用#pragma omp parallel是否有意义?
感谢。
//****************************************Red nodes*************************************************
//lower block
#pragma omp parallel for
for(int j =2; j<(vec[b].m+1)/2; ++j){
for(int i =((j+1)%2)+2 ;i<vec[b].m; i+=2){
vec[b].node(i,j) =(1-omega)*vec[b].node(i,j)+ 0.25*omega* (vec[b].node(i+1,j)+
vec[b].node(i-1,j)+
vec[b].node(i, j-1)+
vec[b].node(i, j+1)) -
h2* f[b].node(i ,j);
}
}
//center line
int j =(vec[b].m+1)/2;
for(int i =((j+1)%2)+2 ;i<(vec[b].m+1)/2; i+=2){
vec[b].node(i,j) =(1-omega)*vec[b].node(i,j)+ 0.25*omega* (vec[b].node(i+1,j)+
vec[b].node(i-1,j)+
vec[b].node(i, j-1)+
vec[b].node(i, j+1)) -
h2* f[b].node(i ,j);
}
//upper block
#pragma omp parallel for
for(j =(vec[b].m+1)/2+1; j<vec[b].m; ++j){
for(int i =((j+1)%2)+2 ;i<vec[b].m; i+=2){
vec[b].node(i,j) =(1-omega)*vec[b].node(i,j)+ 0.25*omega* (vec[b].node(i+1,j)+
vec[b].node(i-1,j)+
vec[b].node(i, j-1)+
vec[b].node(i, j+1)) -
h2* f[b].node(i ,j);
}
}
//***************************************Black nodes*************************************************
//lower block
#pragma omp parallel for
for(j =2; j<(vec[b].m+1)/2; ++j){
for(int i =((j%2)+2); i<vec[b].m; i+=2){
vec[b].node(i,j) =(1-omega)*vec[b].node(i,j)+ 0.25*omega* (vec[b].node(i+1,j)+
vec[b].node(i-1,j)+
vec[b].node(i, j-1)+
vec[b].node(i, j+1)) -
h2* f[b].node(i ,j);
}
}
//middle line
j =(vec[b].m+1)/2;
for(int i =((j%2)+2); i<(vec[b].m+1)/2; i+=2){
vec[b].node(i,j) =(1-omega)*vec[b].node(i,j)+ 0.25*omega* (vec[b].node(i+1,j)+
vec[b].node(i-1,j)+
vec[b].node(i, j-1)+
vec[b].node(i, j+1)) -
h2* f[b].node(i ,j);
}
//upper block
#pragma omp parallel for
for(j =(vec[b].m+1)/2+1; j<vec[b].m; ++j){
#pragma omp parallel for
for(int i =((j%2)+2); i<vec[b].m; i+=2){
vec[b].node(i,j) =(1-omega)*vec[b].node(i,j)+ 0.25*omega* (vec[b].node(i+1,j)+
vec[b].node(i-1,j)+
vec[b].node(i, j-1)+
vec[b].node(i, j+1)) -
h2* f[b].node(i ,j);
}
}
}
}