summaryrefslogtreecommitdiff
path: root/benchmarks/CUDA/DG/src/MaxwellsDriver3d.c
diff options
context:
space:
mode:
Diffstat (limited to 'benchmarks/CUDA/DG/src/MaxwellsDriver3d.c')
-rw-r--r--benchmarks/CUDA/DG/src/MaxwellsDriver3d.c110
1 files changed, 110 insertions, 0 deletions
diff --git a/benchmarks/CUDA/DG/src/MaxwellsDriver3d.c b/benchmarks/CUDA/DG/src/MaxwellsDriver3d.c
new file mode 100644
index 0000000..dd761c7
--- /dev/null
+++ b/benchmarks/CUDA/DG/src/MaxwellsDriver3d.c
@@ -0,0 +1,110 @@
+#include "mpi.h"
+#include "fem.h"
+
+main(int argc, char **argv){
+
+ Mesh *mesh;
+ int procid, nprocs, maxNv;
+ int k,n, sk=0;
+ double minEz, maxEz, gminEz, gmaxEz;
+
+ /* initialize MPI */
+ MPI_Init(&argc, &argv);
+
+ /* assign gpu */
+ MPI_Comm_rank(MPI_COMM_WORLD, &procid);
+ MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
+
+#ifdef CUDA
+ cudaSetDevice((procid+2)%4);
+#endif
+
+ /* (parallel) read part of fem mesh from file */
+ mesh = ReadMesh3d(argv[1]);
+
+ /* perform load balancing */
+ LoadBalance3d(mesh);
+
+ /* find element-element connectivity */
+ FacePair3d(mesh, &maxNv);
+
+ /* perform start up */
+ StartUp3d(mesh);
+
+ /* field storage (double) */
+ double *Hx = (double*) calloc(mesh->K*p_Np, sizeof(double));
+ double *Hy = (double*) calloc(mesh->K*p_Np, sizeof(double));
+ double *Hz = (double*) calloc(mesh->K*p_Np, sizeof(double));
+ double *Ex = (double*) calloc(mesh->K*p_Np, sizeof(double));
+ double *Ey = (double*) calloc(mesh->K*p_Np, sizeof(double));
+ double *Ez = (double*) calloc(mesh->K*p_Np, sizeof(double));
+
+ /* initial conditions */
+ for(k=0;k<mesh->K;++k){
+ for(n=0;n<p_Np;++n) {
+ Hx[sk] = 0;
+ Hy[sk] = 0;
+ Hz[sk] = 0;
+ Ex[sk] = 0;
+ Ey[sk] = 0;
+ Ez[sk] = cos(M_PI*mesh->x[k][n])*cos(M_PI*mesh->y[k][n])*cos(M_PI*mesh->z[k][n]);
+ ++sk;
+ }
+ }
+
+ double dt, gdt;
+
+#ifdef CUDA
+ /* initialize GPU info */
+ dt = InitGPU3d(mesh, p_Nfields);
+
+ /* load data onto GPU */
+ gpu_set_data3d(mesh->K, Hx, Hy, Hz, Ex, Ey, Ez);
+#else
+ /* initialize GPU info */
+ dt = InitCPU3d(mesh, p_Nfields);
+
+ /* load data onto CPU float storage */
+ cpu_set_data3d(mesh, Hx, Hy, Hz, Ex, Ey, Ez);
+#endif
+
+ MPI_Allreduce(&dt, &gdt, 1, MPI_DOUBLE, MPI_MIN, MPI_COMM_WORLD);
+
+ dt = .5*gdt/((p_N+1)*(p_N+1));
+
+ if(mesh->procid==0)
+ printf("dt = %f\n", dt);
+
+ double FinalTime = .00050;
+
+ /* solve */
+ MaxwellsRun3d(mesh, FinalTime, dt);
+
+#ifdef CUDA
+ /* unload data from GPU */
+ gpu_get_data3d(mesh->K, Hx, Hy, Hz, Ex, Ey, Ez);
+#else
+ cpu_get_data3d(mesh, Hx, Hy, Hz, Ex, Ey, Ez);
+#endif
+
+ /* find maximum & minimum values for Ez */
+ minEz=Ez[0], maxEz=Ez[0];
+
+ for(n=0;n<mesh->K*p_Np;++n) {
+ minEz = (minEz>Ez[n])?Ez[n]:minEz;
+ maxEz = (maxEz<Ez[n])?Ez[n]:maxEz;
+ printf("%e\n", Ez[n]);
+ }
+
+ MPI_Reduce(&minEz, &gminEz, 1, MPI_DOUBLE, MPI_MIN, 0, MPI_COMM_WORLD);
+ MPI_Reduce(&maxEz, &gmaxEz, 1, MPI_DOUBLE, MPI_MAX, 0, MPI_COMM_WORLD);
+
+ if(procid==0)
+ printf("t=%f Ez in [ %f, %f ] \n", FinalTime, gminEz, gmaxEz );
+
+ /* nicely stop MPI */
+ MPI_Finalize();
+
+ /* end game */
+ exit(1);
+}