(1) !$OMP PARALLEL DEFAULT (NONE) PRIVATE(G, P_G, TID, DEVICE, STATUS) & | !$OMP & SHARED(P_G_shared,Xm,Ym,height) & | !$OMP & SHARED(prisms,& | !$OMP & Xa,Xb,Ya,Yb,Za,Zb, GType, X1p, Y1p, Z1p,posx,posy,posz) & | !$OMP & SHARED (mic_start,mic_end,density) & | (6) !$OMP & FIRSTPRIVATE(dxp,dyp,dzp,start,end,Typeoffile,Nx,Ny)& | !$OMP & NUM_THREADS(n_of_devices) | ALLOCATE(G(Ny,Nx),stat=status); !Global Shared Mesh | CALL CHECKMEMORY(status); | G = 0.0; | (11) P_G => G; | TID = OMP_GET_THREAD_NUM() | !dir$ omp offload target(mic:TID) inout (P_G:alloc_if(.true.) | free_if(.false.)) | | (16) !$OMP PARALLEL DEFAULT(NONE) SHARED(P_G,MIC_INICIO,MIC_FINAL) PRIVATE(G)& | !$OMP & PRIVATE(DEVICE, TID) FIRSTPRIVATE(Ny,Nx,STATUS,INICIO,FIN)& | !$OMP & FIRSTPRIVATE(dxp,dyp,dzp,Typeoffile,GTIPO) SHARED(Xa,Xb,Ya,Yb,Za, | Zb,X1p,Y1p,Z1p,posx,posy,posz)& | !$OMP & SHARED(Xm,Ym,height,density,prisms) NUM_THREADS(num_threads) | | (21) !$OMP SINGLE | prisms = 0; | !$OMP END SINGLE | | Allocate(G(Ny,Nx), Stat=status) !Local mesh for every thread created | in the Phi | (26) Call CHECKMEMORY (status) | G(:,:) = 0.0; | TID = OMP_GET_THREAD_NUM() | DEVICE = offload_get_device_number() | | (31) !$OMP DO PRIVATE(k) | Do k = mic_start(device+1), mic_end (device+1) | !Number of prisms to be processed | If (TYPEOFFILE == 1) Then | Xa (k) = X1p (posx(k)) | (36) Xb (k) = Xa (k) + dxp | Ya (k) = Y1p (posy(k)) | Yb (k) = Ya (k) + dyp | Za (k) = Z1p (posz(k)) | Zb (k) = Za (k) + dzp | (41) End If | Call GravAnomBoxMalla (Xa(k), Ya(k), Za(k), Xb(k), Yb(k), Zb(k), | densidad(k),GTIPO,G,& | & Xm, Ym, height, Ny, Nx) | !$OMP ATOMIC | prismas = prisms + 1 | (46) !$OMP END DO | | !$OMP CRITICAL (INTERIOR) | P_G(:,:) = P_G(:,:) + G(:,:); | !$OMP END CRITICAL (INTERIOR) | (51) !$OMP END PARALLEL | !$OMP CRITICAL (EXTERIOR) | P_G_shared(:,:) = P_G_shared(:,:) + P_G(:,:); | !$OMP END CRITICAL (EXTERIOR) | !$OMP END PARALLEL |
|