ws.f90
program workshare
!$ use OMP_LIB
	implicit none
	real(8), dimension(:), allocatable :: T
	integer :: Nx1 = 4096+4096, i, j, tnot
	integer,parameter :: seed = 86456
 
	call srand(seed) ! initialize random number
 
	allocate(T(1:Nx1))
	do i=1,Nx1
		T(i) = rand()
	end do
 
!$OMP PARALLEL SHARED(T,Nx1) PRIVATE(i,j) DEFAULT(SHARED)
	tnot = OMP_GET_NUM_THREADS() ! get the total number of threads currently running this PR
!$OMP DO SCHEDULE(STATIC,Nx1/tnot)
	do i=1,Nx1
		do j=1,Nx1
			T(i) = T(i) + dsqrt(dabs((dcos(T(i))+dsin(T(j)))))/T(j)
		end do
	end do
!$OMP END DO
!$OMP END PARALLEL
 
	deallocate(T)
 
end program workshare
ws.c
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <math.h>
#include <omp.h>
 
int main(int argc, char** argv)
{
	int Nx1 = 4096+4096;
	int i;
	int j;
	int tnot;
	int seed = 86456;
 
	double * T = malloc(Nx1 * sizeof(double));
 
	srand(time(NULL));
 
	for ( i = 0; i < Nx1; i++ )
		T[i] = rand();
 
#pragma omp parallel shared(T,Nx1) private(i,j) default(shared)
{
	tnot = omp_get_num_threads();  // get the total number of threads currently running this PR
# pragma omp for schedule(static,Nx1/tnot)
	for ( i = 0; i < Nx1; i++ )
		for ( j = 0; j < Nx1; j++ )
			T[i] = T[i] + sqrt(abs((cos(T[i]+sin(T[j])))))/T[j];
}
 
	free(T);
 
	return 0;
}