void method1(double **matrix,double **f, int dim, double eps, double h)
{
double
temp=0,d=0,dmax=0;
int i,j;
omp_lock_t
dmax_lock;
omp_init_lock(&dmax_lock);
do
{
dmax = 0; // максимальное изменение значений u
#pragma omp parallel for
shared(matrix,dim,dmax) private(i,temp,d)
for ( i=1;
i<dim+1; i++ )
{
#pragma omp parallel for
shared(matrix,dim,dmax,h) private(j,temp,d)
for (j=1; j<dim+1; j++ )
{
temp = matrix[i][j];
matrix[i][j]
= (matrix[i-1][j]+matrix[i+1][j]+matrix[i][j-1]+matrix[i][j+1]-h*h*f[i][j])/4;
d
= fabs(temp-matrix[i][j]);
omp_set_lock(&dmax_lock);
if ( dmax < d ) dmax
= d;
omp_unset_lock(&dmax_lock);
} // конец вложенной параллельной области
} // конец
внешней параллельной области
} while (
dmax > eps );
}
void method2(double **matrix,double **f, int dim, double eps, double h)
{
double
temp=0,d=0,dmax=0,dm=0;
int i,j;
omp_lock_t dmax_lock;
omp_init_lock(&dmax_lock);
do {
dmax = 0; // максимальное изменение значений u
#pragma omp
parallel for shared(matrix,dim,dmax) private(j,i,temp,d,dm)
for ( i=1;
i<dim+1; i++ )
{
dm = 0;
for ( j=1; j<dim+1; j++ )
{
temp
= matrix[i][j];
matrix[i][j]
= (matrix[i-1][j]+matrix[i+1][j]+matrix[i][j-1]+matrix[i][j+1]-h*h*f[i][j])/4;
d
= fabs(temp-matrix[i][j]);
if ( dm < d )
{
dm
= d;
}
}
omp_set_lock(&dmax_lock);
if ( dmax < dm )
{
dmax
= dm;
}
omp_unset_lock(&dmax_lock);
} // конец параллельной области
}
while ( dmax > eps );
}