{ "cells": [ { "cell_type": "markdown", "id": "7d4f2147", "metadata": {}, "source": [ "# How to deal with Cell-Centered data arrays with IJ-Ordered Zones\n", "You might expect that cell-centered data arrays have the same number of values as there are elements in the zone. This is not the case with structured data and will require special handling.\n", "\n", "Read on for more info..." ] }, { "cell_type": "markdown", "id": "aa024ed4", "metadata": {}, "source": [ "## We'll start by creating some example data" ] }, { "cell_type": "code", "execution_count": 1, "id": "d91f55da", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import tecplot as tp\n", "from tecplot.constant import *\n", "tp.new_layout()\n", "tp.macro.execute_command('''$!CreateRectangularZone \n", " IMax = 3\n", " JMax = 5\n", " KMax = 1\n", " X1 = 0\n", " Y1 = 0\n", " Z1 = 0\n", " X2 = 1\n", " Y2 = 1\n", " Z2 = 1\n", " XVar = 1\n", " YVar = 2''')\n", "plot = tp.active_frame().plot()\n", "plot.show_mesh=True\n", "plot.data_labels.show_node_labels=True\n", "plot.data_labels.show_cell_labels=True\n", "plot.axes.x_axis.min=-0.08\n", "plot.axes.x_axis.max=1.2\n", "plot.axes.y_axis.min=-0.08\n", "plot.axes.y_axis.max=1.1\n", "ds = tp.active_frame().dataset\n", "zone = ds.zone(0)\n", "tp.active_frame().add_text(\"Plot labels are 1-based\\nPyTecplot is 0-based\", position=(50,98), anchor=TextAnchor.HeadCenter, size=30)\n", "tp.extension.ipython.show()" ] }, { "cell_type": "markdown", "id": "7b523757", "metadata": {}, "source": [ "## Let's create a couple variables\n", "Here we're creating a Cell Centered and a Nodal variable that we'll use for testing. You can also see the variable values plotted in the image." ] }, { "cell_type": "code", "execution_count": 2, "id": "7d8096ec", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "tp.data.operate.execute_equation(\"{CellCentered} = sqrt(X*X+Y*Y)\", value_location=ValueLocation.CellCentered)\n", "tp.data.operate.execute_equation(\"{Nodal} = sqrt(X*X+Y*Y)\", value_location=ValueLocation.Nodal)\n", "plot.data_labels.node_label_type = LabelType.VarValue\n", "plot.data_labels.node_variable = ds.variable('Nodal')\n", "plot.data_labels.cell_label_type = LabelType.VarValue\n", "plot.data_labels.cell_variable = ds.variable('CellCentered')\n", "tp.extension.ipython.show()" ] }, { "cell_type": "markdown", "id": "d4762587", "metadata": {}, "source": [ "## The number of points and the number of nodal values is the same\n", "This is a good thing" ] }, { "cell_type": "code", "execution_count": 3, "id": "5129da2f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Points: 15\n", "Nodal values: 15\n", "[0. 0.5 1. 0.25 0.559017 1.0307764\n", " 0.5 0.70710677 1.118034 0.75 0.9013878 1.25\n", " 1. 1.118034 1.4142135 ]\n" ] } ], "source": [ "print(\"Points:\",zone.num_points)\n", "print(\"Nodal values:\", len(zone.values(\"Nodal\")))\n", "print(zone.values(\"Nodal\")[:])" ] }, { "cell_type": "markdown", "id": "9b427575", "metadata": {}, "source": [ "## Why do cell centered arrays have more values, than elements?\n", " * Because Tecplot 360 stores the values in a contiguous array that can be indexed by IJK values - the same as is done for nodal values. This introduces extraneous values in the flattened array\n", " * See section 3-2.2 in the User's Manual. https://tecplot.azureedge.net/products/360/current/help/topic.htm#t=Topics%2FOrdered_Data.htm&rhsearch=indexing&rhhlterm=indexing&rhsyns=%20" ] }, { "cell_type": "code", "execution_count": 4, "id": "f5a9a214", "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Elements: 8\n", "Cell values: 12\n", "[0.2795085 0.76034534 0. 0.4506939 0.8385255 0.\n", " 0.6731456 0.9762812 0. 0.91001374 1.152443 0. ]\n" ] } ], "source": [ "print(\"Elements:\",zone.num_elements)\n", "print(\"Cell values:\",len(zone.values(\"CellCentered\")))\n", "print(zone.values(\"CellCentered\")[:])" ] }, { "cell_type": "markdown", "id": "f3feb667", "metadata": {}, "source": [ "## How are cell-centered data from ordered zones indexed?\n", "They're indexed such that they use the same indexing as nodal data. See section 3-2.2 in the User's Manual. https://tecplot.azureedge.net/products/360/current/help/topic.htm#t=Topics%2FOrdered_Data.htm&rhsearch=indexing&rhhlterm=indexing&rhsyns=%20\n", "\n", "The index into the array can be defined as such: \n", "* CellIndex = i + (j)\\*(imax) + k\\*(imax-1)\\*(jmax-1) (where IJK are 0-based)\n", "\n", "See the cell_index() function coded in this script:\n", "https://github.com/Tecplot/handyscripts/blob/master/jupyter_notebooks/ordered_cell_index.py" ] }, { "cell_type": "code", "execution_count": 5, "id": "d6dbeb4e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "IJK (0, 0, 0) CellIndex 0 Value 0.279508501291275\n", "IJK (1, 0, 0) CellIndex 1 Value 0.7603453397750854\n", "IJK (2, 0, 0) CellIndex 2 Value 0.0\n", "IJK (0, 1, 0) CellIndex 3 Value 0.45069390535354614\n", "IJK (1, 1, 0) CellIndex 4 Value 0.8385254740715027\n", "IJK (2, 1, 0) CellIndex 5 Value 0.0\n", "IJK (0, 2, 0) CellIndex 6 Value 0.673145592212677\n", "IJK (1, 2, 0) CellIndex 7 Value 0.9762812256813049\n", "IJK (2, 2, 0) CellIndex 8 Value 0.0\n", "IJK (0, 3, 0) CellIndex 9 Value 0.910013735294342\n", "IJK (1, 3, 0) CellIndex 10 Value 1.1524430513381958\n", "IJK (2, 3, 0) CellIndex 11 Value 0.0\n" ] } ], "source": [ "import ordered_cell_index as oci #see this script in GitHub\n", "\n", "imax,jmax,kmax = zone.dimensions\n", "k=0 # IJ case, so assume K=0\n", "for j in range(jmax-1): ### JMAX-1 because data are not stored at JMAX\n", " for i in range(imax):\n", " cell_idx = oci.cell_index(zone,i,j,k)\n", " v = zone.values(\"CellCentered\")[cell_idx]\n", " print(\"IJK\", (i,j,k),\"CellIndex\", cell_idx, \"Value\", v)" ] }, { "cell_type": "markdown", "id": "e0c05ffe", "metadata": {}, "source": [ "## How do I pull data out of PyTecplot that has the same dimension as the number of cells!\n", "This can be done my reshaping the array and deleting the extraneous column of data" ] }, { "cell_type": "code", "execution_count": 6, "id": "53f1ffaf", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0.2795085 0.76034534 0. ]\n", " [0.4506939 0.8385255 0. ]\n", " [0.6731456 0.9762812 0. ]\n", " [0.91001374 1.152443 0. ]]\n", "[[0.2795085 0.76034534]\n", " [0.4506939 0.8385255 ]\n", " [0.6731456 0.9762812 ]\n", " [0.91001374 1.152443 ]]\n", "Array is now sized by num_elements: True\n" ] } ], "source": [ "vals = zone.values(\"CellCentered\")[:]\n", "vals = vals.reshape(jmax-1,imax)\n", "print(vals)\n", "vals = np.delete(vals, imax-1, 1)\n", "print(vals)\n", "print(\"Array is now sized by num_elements:\",len(vals.flatten()) == zone.num_elements)" ] }, { "cell_type": "markdown", "id": "2b8ed3dc", "metadata": {}, "source": [ "## How do I stuff cell-centered data into an ordered zone?\n", "\n", "### If you have a NumPy array dimensioned by JMax-1 x IMax-1\n", "And you want to stuff that data into a cell-centered variable in an IJ-Ordered zone\n", "\n", "For example:\n", "[[1,2,3], [4,5,6]]\n", "\n", "This can be done by padding the 2D array with an additional column of data." ] }, { "cell_type": "code", "execution_count": 7, "id": "a7b0c4d7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0.9743384 0.91133393]\n", " [0.71882462 0.57135466]\n", " [0.22317873 0.62811265]\n", " [0.53141346 0.32969354]]\n", "True\n", "[[0.]\n", " [0.]\n", " [0.]\n", " [0.]]\n", "[[0.9743384 0.91133393 0. ]\n", " [0.71882462 0.57135466 0. ]\n", " [0.22317873 0.62811265 0. ]\n", " [0.53141346 0.32969354 0. ]]\n", "(4, 3)\n", "(3, 5, 1)\n", "True\n", "[0.9743384 0.9113339 0. 0.7188246 0.5713547 0.\n", " 0.22317873 0.6281127 0. 0.53141344 0.32969353 0. ]\n" ] } ], "source": [ "# This is a JMax-1 by IMax-1 array (I is the fastest moving)\n", "cc = np.random.rand(jmax-1,imax-1)\n", "print(cc)\n", "# The total number of values is equivalent to the number of elements\n", "print(len(cc.flatten()) == zone.num_elements)\n", "\n", "# Create a \"padding\" array to add an additional I-index of data\n", "padding = np.zeros((jmax-1,1)) # np.empty() will be more efficient. np.zeros() is used for clarity.\n", "print(padding)\n", "data = np.hstack((cc,padding))\n", "print(data)\n", "\n", "# Now we should have an array that is JMax-1 x IMax\n", "print(data.shape)\n", "print(zone.dimensions)\n", "print(len(data.flatten()) == len(zone.values(\"CellCentered\")[:]))\n", "\n", "# Now you can *finally* stuff the data into the cell centered variable\n", "zone.values(\"CellCentered\")[:] = data\n", "print(zone.values(\"CellCentered\")[:])" ] }, { "cell_type": "markdown", "id": "4b04ccd9", "metadata": {}, "source": [ "### If you have a flat array dimensioned by the number of cell-centered values\n", "And you want to stuff that data into a cell-centered variable in an IJ-Ordered zone. This assumes that your array is ordered such that the I-dimension moves the fastest.\n", "\n", "For example: If you have a 3,2 zone (IMax=3, JMax=2)\n", " * myarray = [1,2,3,4,5,6]\n", " * Values 1,2,3 are your I-values at J=0\n", " * Values 4,5,6 are your I-values at J=1\n", " \n", "Simply reshape the flat array and then follow the steps above which do the padding" ] }, { "cell_type": "code", "execution_count": 8, "id": "8a44ba57", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0.04661276 0.46002638 0.61948633 0.3511529 0.55884797 0.98772674\n", " 0.8909544 0.11230192]\n", "[[0.04661276 0.46002638]\n", " [0.61948633 0.3511529 ]\n", " [0.55884797 0.98772674]\n", " [0.8909544 0.11230192]]\n", "[[0.]\n", " [0.]\n", " [0.]\n", " [0.]]\n", "[[0.04661276 0.46002638 0. ]\n", " [0.61948633 0.3511529 0. ]\n", " [0.55884797 0.98772674 0. ]\n", " [0.8909544 0.11230192 0. ]]\n", "(4, 3)\n", "(3, 5, 1)\n", "Array is the right size: True\n", "[0.04661276 0.46002638 0. 0.61948633 0.3511529 0.\n", " 0.55884796 0.98772675 0. 0.8909544 0.11230192 0. ]\n" ] } ], "source": [ "cc = np.random.rand(zone.num_elements)\n", "print(cc)\n", "\n", "#Reshape to Jmax-1 by Imax-1 and proceed with the padding array as above\n", "cc = cc.reshape(jmax-1, imax-1)\n", "print(cc)\n", "\n", "# Create a \"padding\" array to add an additional I-index of data\n", "padding = np.zeros((jmax-1,1)) # np.empty() will be more efficient. np.zeros() is used for clarity.\n", "print(padding)\n", "data = np.hstack((cc,padding))\n", "print(data)\n", "\n", "# Now we should have an array that is JMax-1 x IMax\n", "print(data.shape)\n", "print(zone.dimensions)\n", "print(\"Array is the right size:\", len(data.flatten()) == len(zone.values(\"CellCentered\")[:]))\n", "\n", "# Now you can *finally* stuff the data into the cell centered variable\n", "zone.values(\"CellCentered\")[:] = data\n", "print(zone.values(\"CellCentered\")[:])" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.3" } }, "nbformat": 4, "nbformat_minor": 5 }