1: #include <../src/sys/threadcomm/impls/openmp/openmpimpl.h> 2: #include <omp.h> 4: PetscInt PetscThreadCommGetRank_OpenMP(void) 5: { 6: return omp_get_thread_num(); 7: } 9: EXTERN_C_BEGIN 12: PetscErrorCode PetscThreadCommCreate_OpenMP(PetscThreadComm tcomm) 13: { 17: PetscStrcpy(tcomm->type,OPENMP); 18: tcomm->ops->runkernel = PetscThreadCommRunKernel_OpenMP; 19: tcomm->ops->getrank = PetscThreadCommGetRank_OpenMP; 20: return(0); 21: } 22: EXTERN_C_END 23: 26: PetscErrorCode PetscThreadCommRunKernel_OpenMP(MPI_Comm comm,PetscThreadCommJobCtx job) 27: { 29: PetscThreadComm tcomm; 30: PetscInt trank=0; 33: PetscCommGetThreadComm(comm,&tcomm); 34: #pragma omp parallel num_threads(tcomm->nworkThreads) shared(comm,job) private(trank,ierr) 35: { 36: trank = omp_get_thread_num(); 37: PetscRunKernel(trank,job->nargs,job); 38: } 39: return(0); 40: }