summaryrefslogtreecommitdiff
path: root/benchmarks/CUDA/DG/src/InitCPU3d.c
diff options
context:
space:
mode:
Diffstat (limited to 'benchmarks/CUDA/DG/src/InitCPU3d.c')
-rw-r--r--benchmarks/CUDA/DG/src/InitCPU3d.c152
1 files changed, 152 insertions, 0 deletions
diff --git a/benchmarks/CUDA/DG/src/InitCPU3d.c b/benchmarks/CUDA/DG/src/InitCPU3d.c
new file mode 100644
index 0000000..2fe907f
--- /dev/null
+++ b/benchmarks/CUDA/DG/src/InitCPU3d.c
@@ -0,0 +1,152 @@
+#include "mpi.h"
+#include "fem.h"
+
+double InitCPU3d(Mesh *mesh, int Nfields){
+
+ printf("Np = %d, BSIZE = %d\n", p_Np, BSIZE);
+
+ /* Q */
+ int sz = mesh->K*(p_Np)*Nfields*sizeof(float); /* TW BLOCK */
+
+ mesh->f_Q = (float*) calloc(mesh->K*p_Np*Nfields, sizeof(float));
+ mesh->f_rhsQ = (float*) calloc(mesh->K*p_Np*Nfields, sizeof(float));
+ mesh->f_resQ = (float*) calloc(mesh->K*p_Np*Nfields, sizeof(float));
+
+ /* float LIFT */
+ sz = p_Np*(p_Nfp)*(p_Nfaces)*sizeof(float);
+ mesh->f_LIFT = (float*) malloc(sz);
+ int sk = 0, n, m, f, k;
+
+ for(n=0;n<p_Np;++n){
+ for(m=0;m<p_Nfp*p_Nfaces;++m){
+ mesh->f_LIFT[sk++] = mesh->LIFT[n][m];
+ }
+ }
+
+ /* float Dr & Ds */
+ sz = p_Np*p_Np*sizeof(float);
+ mesh->f_Dr = (float*) malloc(sz);
+ mesh->f_Ds = (float*) malloc(sz);
+ mesh->f_Dt = (float*) malloc(sz);
+
+ sk = 0;
+ for(n=0;n<p_Np;++n){
+ for(m=0;m<p_Np;++m){
+ mesh->f_Dr[sk] = mesh->Dr[n][m];
+ mesh->f_Ds[sk] = mesh->Ds[n][m];
+ mesh->f_Dt[sk] = mesh->Dt[n][m];
+ ++sk;
+ }
+ }
+
+ /* vgeo */
+ double drdx, dsdx, dtdx;
+ double drdy, dsdy, dtdy;
+ double drdz, dsdz, dtdz, J;
+ mesh->vgeo = (float*) calloc(12*mesh->K, sizeof(float));
+
+ for(k=0;k<mesh->K;++k){
+ GeometricFactors3d(mesh, k,
+ &drdx, &dsdx, &dtdx,
+ &drdy, &dsdy, &dtdy,
+ &drdz, &dsdz, &dtdz, &J);
+
+ mesh->vgeo[k*12+0] = drdx; mesh->vgeo[k*12+1] = drdy; mesh->vgeo[k*12+2] = drdz;
+ mesh->vgeo[k*12+4] = dsdx; mesh->vgeo[k*12+5] = dsdy; mesh->vgeo[k*12+6] = dsdz;
+ mesh->vgeo[k*12+8] = dtdx; mesh->vgeo[k*12+9] = dtdy; mesh->vgeo[k*12+10] = dtdz;
+ }
+
+ /* surfinfo (vmapM, vmapP, Fscale, Bscale, nx, ny, nz, 0) */
+ sz = mesh->K*p_Nfp*p_Nfaces*7*sizeof(float);
+
+ mesh->surfinfo = (float*) malloc(sz);
+
+ /* local-local info */
+ sk = 0;
+ int skP = -1;
+ double *nxk = BuildVector(mesh->Nfaces);
+ double *nyk = BuildVector(mesh->Nfaces);
+ double *nzk = BuildVector(mesh->Nfaces);
+ double *sJk = BuildVector(mesh->Nfaces);
+
+ double dt = 1e6;
+
+ sk = 0;
+ for(k=0;k<mesh->K;++k){
+
+ GeometricFactors3d(mesh, k,
+ &drdx, &dsdx, &dtdx,
+ &drdy, &dsdy, &dtdy,
+ &drdz, &dsdz, &dtdz, &J);
+
+ Normals3d(mesh, k, nxk, nyk, nzk, sJk);
+
+ for(f=0;f<mesh->Nfaces;++f){
+
+ dt = min(dt, J/sJk[f]);
+
+ for(m=0;m<p_Nfp;++m){
+ int id = m + f*p_Nfp + p_Nfp*p_Nfaces*k;
+ int idM = mesh->vmapM[id];
+ int idP = mesh->vmapP[id];
+ int nM = idM%p_Np;
+ int nP = idP%p_Np;
+ int kM = (idM-nM)/p_Np;
+ int kP = (idP-nP)/p_Np;
+ idM = Nfields*(nM + p_Np*kM);
+ idP = Nfields*(nP + p_Np*kP);
+
+ /* stub resolve some other way */
+ if(mesh->vmapP[id]<0){
+ idP = mesh->vmapP[id]; /* -ve numbers */
+ }
+
+ mesh->surfinfo[sk++] = idM;
+ mesh->surfinfo[sk++] = idP;
+ mesh->surfinfo[sk++] = sJk[f]/(2.*J);
+ mesh->surfinfo[sk++] = (idM==idP)?-1.:1.;
+ mesh->surfinfo[sk++] = nxk[f];
+ mesh->surfinfo[sk++] = nyk[f];
+ mesh->surfinfo[sk++] = nzk[f];
+ }
+ }
+ }
+}
+
+void cpu_set_data3d(Mesh *mesh, double *Hx, double *Hy, double *Hz,
+ double *Ex, double *Ey, double *Ez){
+
+ const int K = mesh->K;
+ int k, n, sk=0;
+
+ for(k=0;k<K;++k){
+ for(n=0;n<p_Np;++n){
+ mesh->f_Q[sk++] = Hx[n+k*p_Np];
+ mesh->f_Q[sk++] = Hy[n+k*p_Np];
+ mesh->f_Q[sk++] = Hz[n+k*p_Np];
+ mesh->f_Q[sk++] = Ex[n+k*p_Np];
+ mesh->f_Q[sk++] = Ey[n+k*p_Np];
+ mesh->f_Q[sk++] = Ez[n+k*p_Np];
+ }
+ }
+
+}
+
+
+void cpu_get_data3d(Mesh *mesh, double *Hx, double *Hy, double *Hz,
+ double *Ex, double *Ey, double *Ez){
+ const int K = mesh->K;
+ int k, n, sk=0;
+
+ for(k=0;k<K;++k){
+ for(n=0;n<p_Np;++n){
+ Hx[n+k*p_Np] = mesh->f_Q[sk++];
+ Hy[n+k*p_Np] = mesh->f_Q[sk++];
+ Hz[n+k*p_Np] = mesh->f_Q[sk++];
+ Ex[n+k*p_Np] = mesh->f_Q[sk++];
+ Ey[n+k*p_Np] = mesh->f_Q[sk++];
+ Ez[n+k*p_Np] = mesh->f_Q[sk++];
+ }
+ }
+
+}