From 812ebcc9ba6013e8feeeff487c8e1698bc964708 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20R=2E=20Brodtkorb?= Date: Thu, 8 Nov 2018 23:10:35 +0100 Subject: [PATCH] Reproducibility --- EulerTesting.ipynb | 400921 +--------------------------------- GPUSimulators/Simulator.py | 3 + 2 files changed, 76 insertions(+), 400848 deletions(-) diff --git a/EulerTesting.ipynb b/EulerTesting.ipynb index 2a5af7c..906ca50 100644 --- a/EulerTesting.ipynb +++ b/EulerTesting.ipynb @@ -22,12 +22,14 @@ "\n", "from enum import Enum\n", "import subprocess\n", + "import time\n", "import os\n", "import gc\n", "import datetime\n", "import importlib\n", "import logging\n", "import netCDF4\n", + "import json\n", "\n", "import pycuda.driver as cuda\n", "import pycuda.compiler\n", @@ -75,7 +77,7 @@ "CUDA version (10, 0, 0)\n", "Driver version 10000\n", "Using 'GeForce 840M' GPU\n", - "Created context handle <716326090688>\n", + "Created context handle <306858187648>\n", "Using CUDA cache dir c:\\Users\\anbro\\Documents\\projects\\GPUSimulators\\GPUSimulators\\cuda_cache\n" ] } @@ -138,6 +140,7 @@ " outdata.ncfile.createDimension('x', sim.nx)\n", " outdata.ncfile.createDimension('y', sim.ny)\n", "\n", + " #Create variables\n", " outdata.time_var = outdata.ncfile.createVariable('time', np.dtype('float32').char, 'time')\n", " outdata.x_var = outdata.ncfile.createVariable('x', np.dtype('float32').char, 'x')\n", " outdata.y_var = outdata.ncfile.createVariable('y', np.dtype('float32').char, 'y')\n", @@ -145,6 +148,23 @@ " outdata.rho_u_var = outdata.ncfile.createVariable('rho_u', np.dtype('float32').char, ('time', 'y', 'x'), zlib=True, least_significant_digit=3)\n", " outdata.rho_v_var = outdata.ncfile.createVariable('rho_v', np.dtype('float32').char, ('time', 'y', 'x'), zlib=True, least_significant_digit=3)\n", " outdata.E_var = outdata.ncfile.createVariable('E', np.dtype('float32').char, ('time', 'y', 'x'), zlib=True, least_significant_digit=3)\n", + " \n", + " #Create attributes\n", + " def toJson(in_dict):\n", + " out_dict = in_dict.copy()\n", + "\n", + " for key in out_dict:\n", + " if isinstance(out_dict[key], np.ndarray):\n", + " out_dict[key] = out_dict[key].tolist()\n", + " else:\n", + " try:\n", + " json.dumps(out_dict[key])\n", + " except:\n", + " out_dict[key] = str(out_dict[key])\n", + "\n", + " return json.dumps(out_dict)\n", + " outdata.ncfile.created = time.ctime(time.time())\n", + " outdata.ncfile.sim_args = toJson(sim_args)\n", "\n", " outdata.x_var[:] = np.linspace(0, sim.nx*sim.dx, sim.nx)\n", " outdata.y_var[:] = np.linspace(0, sim.ny*sim.dy, sim.ny)\n", @@ -200,7 +220,15 @@ " rho = indata.ncfile.variables['rho'][0]\n", " rho_u = indata.ncfile.variables['rho_u'][0]\n", " rho_v = indata.ncfile.variables['rho_v'][0]\n", + " \n", + " created = indata.ncfile.created\n", + " sim_args = json.loads(indata.ncfile.sim_args)\n", + " for key in sim_args:\n", + " if isinstance(sim_args[key], list):\n", + " sim_args[key] = \"[...]\"\n", " num_frames = len(time)\n", + " print(\"{:s} created {:s} contains {:d} timesteps\".format(infile, created, num_frames))\n", + " print(\"Simulator arguments: \\n\", sim_args)\n", "\n", " ax1 = fig.gca()\n", " extents = [0, x.max(), 0, y.max()]\n", @@ -291,7 +319,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 8, @@ -326,8 +354,8 @@ "name": "stderr", "output_type": "stream", "text": [ - "Writing output to c:\\Users\\anbro\\Documents\\projects\\GPUSimulators\\data\\euler_shock-bubble_0001.nc\n", - "Opening c:\\Users\\anbro\\Documents\\projects\\GPUSimulators\\data\\euler_shock-bubble_0001.nc\n", + "Writing output to c:\\Users\\anbro\\Documents\\projects\\GPUSimulators\\data\\euler_shock-bubble_0006.nc\n", + "Opening c:\\Users\\anbro\\Documents\\projects\\GPUSimulators\\data\\euler_shock-bubble_0006.nc\n", "Keyword arguments: {'mode': 'w', 'clobber': False}\n" ] }, @@ -335,7 +363,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Constructed in 2.126896381378174 seconds\n", + "Constructed in 1.875434160232544 seconds\n", "Simulating to t=0.500000. Estimated 1699 timesteps (dt=0.000294)\n" ] }, @@ -343,7 +371,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "Closing c:\\Users\\anbro\\Documents\\projects\\GPUSimulators\\data\\euler_shock-bubble_0001.nc\n" + "Closing c:\\Users\\anbro\\Documents\\projects\\GPUSimulators\\data\\euler_shock-bubble_0006.nc\n" ] } ], @@ -371,17534 +399,48 @@ "name": "stderr", "output_type": "stream", "text": [ - "Writing output to c:\\Users\\anbro\\Documents\\projects\\GPUSimulators\\data\\euler_shock-bubble_0001.nc\n", - "Opening c:\\Users\\anbro\\Documents\\projects\\GPUSimulators\\data\\euler_shock-bubble_0001.nc\n", + "Writing output to c:\\Users\\anbro\\Documents\\projects\\GPUSimulators\\data\\euler_shock-bubble_0006.nc\n", + "Opening c:\\Users\\anbro\\Documents\\projects\\GPUSimulators\\data\\euler_shock-bubble_0006.nc\n", "Arguments: ('r',)\n", - "Animation.save using \n" + "Closing c:\\Users\\anbro\\Documents\\projects\\GPUSimulators\\data\\euler_shock-bubble_0006.nc\n", + "Exception caught: Resetting to CUDA context my_context\n", + "Traceback (most recent call last):\n", + " File \"c:\\Users\\anbro\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3267, in run_code\n", + " exec(code_obj, self.user_global_ns, self.user_ns)\n", + " File \"\", line 2, in \n", + " createAnimation(outfile, vis_type=VisType.Schlieren, vmin=-0.2, vmax=0.2, cmap=plt.cm.RdBu, save_anim=False, fig_args={'figsize':(16, 5)})\n", + " File \"\", line 18, in createAnimation\n", + " for key in sim_args:\n", + "RuntimeError: dictionary changed size during iteration\n", + "Popping <306858187648>\n", + "Pushing <306858187648>\n" ] }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "0% [###########################===] 100%. Total: 5s, elapsed: 5s, remaining: 1s\n" + "ename": "RuntimeError", + "evalue": "dictionary changed size during iteration", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mRuntimeError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m#outfile = 'data/euler_shock-bubble_0008.nc'\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mcreateAnimation\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0moutfile\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mvis_type\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mVisType\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mSchlieren\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mvmin\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m0.2\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mvmax\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m0.2\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcmap\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcm\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mRdBu\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0msave_anim\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mFalse\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfig_args\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m{\u001b[0m\u001b[1;34m'figsize'\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m16\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m5\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;32m\u001b[0m in \u001b[0;36mcreateAnimation\u001b[1;34m(infile, vis_type, vmin, vmax, save_anim, cmap, fig_args)\u001b[0m\n\u001b[0;32m 16\u001b[0m \u001b[0mcreated\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mindata\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mncfile\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcreated\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 17\u001b[0m \u001b[0msim_args\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mjson\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mloads\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mindata\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mncfile\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msim_args\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 18\u001b[1;33m \u001b[1;32mfor\u001b[0m \u001b[0mkey\u001b[0m \u001b[1;32min\u001b[0m \u001b[0msim_args\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 19\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msim_args\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlist\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 20\u001b[0m \u001b[0msim_args\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpop\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mRuntimeError\u001b[0m: dictionary changed size during iteration" ] }, { "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - "
\n", - " \n", - "
\n", - " \n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - " Once \n", - " Loop \n", - " Reflect \n", - "
\n", - "
\n", - "\n", - "\n", - "\n" - ], "text/plain": [ - "" + "
" ] }, "metadata": {}, "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Closing c:\\Users\\anbro\\Documents\\projects\\GPUSimulators\\data\\euler_shock-bubble_0001.nc\n" - ] } ], "source": [ "#outfile = 'data/euler_shock-bubble_0008.nc'\n", - "createAnimation(outfile, vis_type=VisType.Schlieren, vmin=-0.2, vmax=0.2, cmap=plt.cm.RdYlBu, save_anim=False, fig_args={'figsize':(16, 5), 'tight_layout':True})" + "createAnimation(outfile, vis_type=VisType.Schlieren, vmin=-0.2, vmax=0.2, cmap=plt.cm.RdBu, save_anim=False, fig_args={'figsize':(16, 5)})" ] }, { @@ -17910,30 +452,9 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "nx = 400\n", "arguments = InitialConditions.genKelvinHelmholtz(nx, nx//4, 1.4)\n", @@ -17945,35 +466,9 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Writing output to c:\\Users\\anbro\\Documents\\projects\\GPUSimulators\\data\\euler_kelvin_helmholtz_0001.nc\n", - "Opening c:\\Users\\anbro\\Documents\\projects\\GPUSimulators\\data\\euler_kelvin_helmholtz_0001.nc\n", - "Keyword arguments: {'mode': 'w', 'clobber': False}\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Constructed in 0.008003711700439453 seconds\n", - "Simulating to t=10.000000. Estimated 8998 timesteps (dt=0.001111)\n", - "0% [#####################=========] 100%. Total: 14s, elapsed: 10s, remaining: 4s\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Closing c:\\Users\\anbro\\Documents\\projects\\GPUSimulators\\data\\euler_kelvin_helmholtz_0001.nc\n" - ] - } - ], + "outputs": [], "source": [ "nx = 400\n", "ny = nx//2\n", @@ -17990,219165 +485,12 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Writing output to c:\\Users\\anbro\\Documents\\projects\\GPUSimulators\\data\\euler_kelvin_helmholtz_0001.nc\n", - "Opening c:\\Users\\anbro\\Documents\\projects\\GPUSimulators\\data\\euler_kelvin_helmholtz_0001.nc\n", - "Arguments: ('r',)\n", - "Animation.save using \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0% [#####=========================] 100%. Total: 30s, elapsed: 5s, remaining: 25s\n", - "0% [###########===================] 100%. Total: 28s, elapsed: 10s, remaining: 18s\n", - "0% [################==============] 100%. Total: 28s, elapsed: 15s, remaining: 12s\n", - "0% [#####################=========] 100%. Total: 29s, elapsed: 20s, remaining: 8s\n", - "0% [###########################===] 100%. Total: 29s, elapsed: 26s, remaining: 3s\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - "
\n", - " \n", - "
\n", - " \n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - " Once \n", - " Loop \n", - " Reflect \n", - "
\n", - "
\n", - "\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Closing c:\\Users\\anbro\\Documents\\projects\\GPUSimulators\\data\\euler_kelvin_helmholtz_0001.nc\n" - ] - } - ], + "outputs": [], "source": [ "#outfile='data/euler_kelvin_helmholtz_0012.nc'\n", - "createAnimation(outfile, vis_type=VisType.Density, vmin=1.0, vmax=2.0, save_anim=False, fig_args={'figsize':(16, 9), 'tight_layout':True})" + "createAnimation(outfile, vis_type=VisType.Density, vmin=1.0, vmax=2.0, save_anim=False, fig_args={'figsize':(16, 9)})" ] }, { @@ -237164,20 +506,9 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "nx = 400\n", "arguments = InitialConditions.genRayleighTaylor(nx, nx*3, 1.4, version=0)\n", @@ -237186,38 +517,9 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Writing output to c:\\Users\\anbro\\Documents\\projects\\GPUSimulators\\data\\euler_rayleigh-taylor.nc\n", - "Opening c:\\Users\\anbro\\Documents\\projects\\GPUSimulators\\data\\euler_rayleigh-taylor.nc\n", - "Keyword arguments: {'mode': 'w', 'clobber': False}\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Constructed in 0.014011383056640625 seconds\n", - "Simulating to t=30.000000. Estimated 30697 timesteps (dt=0.000977)\n", - "0% [#######=======================] 100%. Total: 45s, elapsed: 10s, remaining: 35s\n", - "0% [#############=================] 100%. Total: 45s, elapsed: 20s, remaining: 25s\n", - "0% [####################==========] 100%. Total: 46s, elapsed: 30s, remaining: 15s\n", - "0% [##########################====] 100%. Total: 46s, elapsed: 40s, remaining: 5s\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Closing c:\\Users\\anbro\\Documents\\projects\\GPUSimulators\\data\\euler_rayleigh-taylor.nc\n" - ] - } - ], + "outputs": [], "source": [ "nx = 151\n", "ny = nx*3\n", @@ -237235,164089 +537,12 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Writing output to c:\\Users\\anbro\\Documents\\projects\\GPUSimulators\\data\\euler_rayleigh-taylor.nc\n", - "Opening c:\\Users\\anbro\\Documents\\projects\\GPUSimulators\\data\\euler_rayleigh-taylor.nc\n", - "Arguments: ('r',)\n", - "Animation.save using \n", - "figure size (inches) has been adjusted from 3.4 x 8.0 to 3.388888888888889 x 8.0\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0% [####==========================] 100%. Total: 37s, elapsed: 5s, remaining: 32s\n", - "0% [########======================] 100%. Total: 37s, elapsed: 10s, remaining: 27s\n", - "0% [############==================] 100%. Total: 41s, elapsed: 15s, remaining: 25s\n", - "0% [###############===============] 100%. Total: 39s, elapsed: 20s, remaining: 19s\n", - "0% [###################===========] 100%. Total: 39s, elapsed: 25s, remaining: 14s\n", - "0% [#######################=======] 100%. Total: 40s, elapsed: 30s, remaining: 9s\n", - "0% [###########################===] 100%. Total: 39s, elapsed: 35s, remaining: 4s\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - "\n", - "\n", - "\n", - "
\n", - " \n", - "
\n", - " \n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - " Once \n", - " Loop \n", - " Reflect \n", - "
\n", - "
\n", - "\n", - "\n", - "\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Closing c:\\Users\\anbro\\Documents\\projects\\GPUSimulators\\data\\euler_rayleigh-taylor.nc\n" - ] - } - ], + "outputs": [], "source": [ "#outfile = 'data/euler_rayleigh-taylor_0007.nc'\n", - "createAnimation(outfile, vis_type=VisType.Density, vmin=1, vmax=2, cmap=plt.cm.RdBu, save_anim=False, fig_args={'figsize':(3.4, 8), 'tight_layout':True})" + "createAnimation(outfile, vis_type=VisType.Density, vmin=1, vmax=2, cmap=plt.cm.coolwarm, save_anim=False, fig_args={'figsize':(3.4, 8)})" ] }, { diff --git a/GPUSimulators/Simulator.py b/GPUSimulators/Simulator.py index 5ae232f..ebf6c4a 100644 --- a/GPUSimulators/Simulator.py +++ b/GPUSimulators/Simulator.py @@ -72,6 +72,9 @@ class BoundaryCondition(object): or self.east == BoundaryCondition.Type.Neumann \ or self.west == BoundaryCondition.Type.Neumann): raise(NotImplementedError("Neumann boundary condition not supported")) + + def __str__(self): + return '[north={:s}, south={:s}, east={:s}, west={:s}]'.format(str(self.north), str(self.south), str(self.east), str(self.west)) def asCodedInt(self):