diff --git a/notebooks/2015-06-20-export-to-xdmf.ipynb b/notebooks/2015-06-20-export-to-xdmf.ipynb new file mode 100644 index 0000000..ba5a892 --- /dev/null +++ b/notebooks/2015-06-20-export-to-xdmf.ipynb @@ -0,0 +1,419 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Exporting data to Xdmf format\n", + "\n", + "Author(s): Jukka Aho \n", + "\n", + "Python example how to export data to Xdmf format using Python" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import sys\n", + "import os\n", + "sys.path.append(os.path.expanduser('~/opt/xdmf/lib/python'))" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from Xdmf import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Export mesh" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "grid = XdmfUnstructuredGrid.New()\n", + "grid.setTime(XdmfTime.New(123))\n", + "geometry = XdmfGeometry.New()\n", + "topology = XdmfTopology.New()\n", + "geometry.setType(XdmfGeometryType.XYZ())\n", + "topology.setType(XdmfTopologyType.Mixed())" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 0., 0., 0.],\n", + " [ 1., 0., 0.],\n", + " [ 0., 1., 0.],\n", + " [ 0., 0., 1.]])" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import numpy as np\n", + "# one linear tetra\n", + "nodes = np.array([[0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]])\n", + "nodes" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It needs to be in 1d list:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list(nodes.flatten())" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "geometry.insertAsFloat32(0, list(nodes.flatten()))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Topology; connect nodes 1 - 4 to form tetra\n", + "\n", + "List is here:\n", + "\n", + "http://public.kiteware.com/pipermail/2013-July/028859.html" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "topology.insertAsInt32(0, [0x6, 1, 2, 3, 4]) # Not sure starts this from 0 or 1" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "grid.setGeometry(geometry)\n", + "grid.setTopology(topology)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Export fields" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Give scalar value to cells (i.e. elements)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "temperature = XdmfAttribute.New()\n", + "temperature.setType(XdmfAttributeType.Scalar())\n", + "temperature.setCenter(XdmfAttributeCenter.Cell())\n", + "temperature.setName(\"Temperature field\")\n", + "temperature.insertAsInt32(0, [56])\n", + "grid.insert(temperature)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Give vector values to nodes" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "density = XdmfAttribute.New()\n", + "density.setType(XdmfAttributeType.Vector())\n", + "density.setCenter(XdmfAttributeCenter.Node())\n", + "density.setName(\"Density\")\n", + "density.insertAsFloat32(0, [1.3, 2.4, 4.5, 6.7])\n", + "grid.insert(density)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Write to file" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "I think this is not mandatory but create temporal collection anyway:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "coll = XdmfGridCollection.New()\n", + "coll.setType(XdmfGridCollectionType.Temporal())\n", + "coll.insert(grid)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Create domain and write to disk" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "domain = XdmfDomain.New()\n", + "domain.insert(coll)\n", + "writer = XdmfWriter.New(\"testdata.xmf\")\n", + "domain.accept(writer)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "testdata.h5 testdata.xmf\r\n" + ] + } + ], + "source": [ + "!ls testdata*" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\r\n", + "\r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + " \r\n", + "\r\n" + ] + } + ], + "source": [ + "!cat testdata.xmf" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This time Xdmf decided to write results directly to the xml file. If the model is bigger the correct format is" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + "Structure of h5 file\n", + "\n", + "\n", + " File(filename=model.h5, title='', mode='r+', root_uep='/', filters=Filters(complevel=0, shuffle=False, fletcher32=False, least_significant_digit=None)) \n", + " / (RootGroup) '' \n", + " /Data0 (EArray(1125135,)) ''\n", + " atom := Float32Atom(shape=(), dflt=0.0)\n", + " maindim := 0 \n", + " flavor := 'numpy' \n", + " byteorder := 'little' \n", + " chunkshape := (1000,) \n", + " /Data1 (EArray(2680009,)) ''\n", + " atom := Int32Atom(shape=(), dflt=0)\n", + " maindim := 0 \n", + " flavor := 'numpy' \n", + " byteorder := 'little' \n", + " chunkshape := (1000,) \n", + " ...\n", + "\n", + "\n", + " In [7]: d.root.Data0[:]\n", + " Out[7]:\n", + " array([ 302.10440063, 222.19999695, 20.38028908, ..., -230. ,\n", + " 0. , 7.33333015], dtype=float32)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.9" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/testdata/xdmf_1tet/testdata.h5 b/testdata/xdmf_1tet/testdata.h5 new file mode 100644 index 0000000..82daee0 Binary files /dev/null and b/testdata/xdmf_1tet/testdata.h5 differ diff --git a/testdata/xdmf_1tet/testdata.xmf b/testdata/xdmf_1tet/testdata.xmf new file mode 100644 index 0000000..652a40f --- /dev/null +++ b/testdata/xdmf_1tet/testdata.xmf @@ -0,0 +1,24 @@ + + + + + + + + + + +