#include "MICGreensFunction.hpp" #include #include #include /* constructor */ MICGreensFunction::MICGreensFunction(MICBase *base) { m_micbase = base; } /* destructor */ MICGreensFunction::~MICGreensFunction() { } /* compute greens integral analytically */ // Version with extended domain /* int MICGreensFunction::mic_GreensIntegral(void * tmp_ptr_, int I,int J, int K, double hr_m0,double hr_m1, double hr_m2) { double *tmp_ptr = (double*) tmp_ptr_; #pragma offload target(mic:0) in(tmp_ptr:length(0) DKS_RETAIN DKS_REUSE) in(I, J,K, hr_m0, hr_m1, hr_m2) { std::memset(tmp_ptr,0,(I+1)*(J+1)*(K+1)); double cellVolume = hr_m0 * hr_m1 * hr_m2; #pragma omp parallel for collapse(3) schedule(dynamic) for (int k = 0; k < K; k++) { for (int j = 0; j < J; j++) { for (int i = 0; i < I; i++) { double vv0 = i * hr_m0 - hr_m0 / 2; double vv1 = j * hr_m1 - hr_m1 / 2; double vv2 = k * hr_m2 - hr_m2 / 2; double r = sqrt(vv0 * vv0 + vv1 * vv1 + vv2 * vv2); double tmpgrn = 0; tmpgrn += -vv2*vv2 * atan(vv0 * vv1 / (vv2 * r) ); tmpgrn += -vv1*vv1 * atan(vv0 * vv2 / (vv1 * r) ); tmpgrn += -vv0*vv0 * atan(vv1 * vv2 / (vv0 * r) ); tmpgrn = tmpgrn / 2; tmpgrn += vv1 * vv2 * log(vv0 + r); tmpgrn += vv0 * vv2 * log(vv1 + r); tmpgrn += vv0 * vv1 * log(vv2 + r); tmpgrn = tmpgrn / cellVolume; tmp_ptr[k*(J+1)*(I+1) + j*(I+1) + i] = tmpgrn; } } } } return 0; } */ int MICGreensFunction::greensIntegral(void *tmpgreen, int I, int J, int K, int NI, int NJ, double hr_m0, double hr_m1, double hr_m2, int streamId) { double *tmp_ptr = (double*) tmpgreen; #pragma offload target(mic:0) in(tmp_ptr:length(0) DKS_RETAIN DKS_REUSE) in(I, J,K, hr_m0, hr_m1, hr_m2) { std::memset(tmp_ptr,0,I*J*K); double cellVolume = hr_m0 * hr_m1 * hr_m2; #pragma omp parallel for collapse(3) schedule(dynamic) for (int k = 0; k < K; k++) { for (int j = 0; j < J; j++) { for (int i = 0; i < I; i++) { double vv0 = i * hr_m0 - hr_m0 / 2; double vv1 = j * hr_m1 - hr_m1 / 2; double vv2 = k * hr_m2 - hr_m2 / 2; double r = sqrt(vv0 * vv0 + vv1 * vv1 + vv2 * vv2); double tmpgrn = 0; tmpgrn += -vv2*vv2 * atan(vv0 * vv1 / (vv2 * r) ); tmpgrn += -vv1*vv1 * atan(vv0 * vv2 / (vv1 * r) ); tmpgrn += -vv0*vv0 * atan(vv1 * vv2 / (vv0 * r) ); tmpgrn = tmpgrn / 2; tmpgrn += vv1 * vv2 * log(vv0 + r); tmpgrn += vv0 * vv2 * log(vv1 + r); tmpgrn += vv0 * vv1 * log(vv2 + r); tmpgrn = tmpgrn / cellVolume; tmp_ptr[k*(J)*(I) + j*(I) + i] = tmpgrn; } } } } return 0; } /* perform the actual integration */ // version with extended domain /* int MICGreensFunction::mic_IntegrationGreensFunction(void * mem_ptr_, void * tmp_ptr_,int I,int J, int K) { double *tmp_ptr = (double*) tmp_ptr_; double *mem_ptr = (double*) mem_ptr_; // the actual integration #pragma offload target(mic:0) in(tmp_ptr:length(0) DKS_RETAIN DKS_REUSE) in(mem_ptr:length(0) DKS_RETAIN DKS_REUSE) in(I,J,K) { int Ii = I; int Jj = J; int Kk = K; int II = 2*(I-1); int JJ=2*(J-1); int KK=2*(K-1); std::memset(mem_ptr,0,II*JJ*KK); I=I+1; J=J+1; K=K+1; #pragma omp parallel for collapse(3) for (int i=0; i