tug/proto/BTCS.ipynb

601 lines
53 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"# imports\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# set up environment\n",
"dim = 2\n",
"grid_size = {'x': 20, 'y': 20}\n",
"domain_size = {'x': 20, 'y': 20}\n",
"\n",
"# boundary_condition\n",
"# constant boundary condition\n",
"bc_left = 0\n",
"bc_right = 0\n",
"bc_top = 0\n",
"bc_bottom = 0\n",
"\n",
"delta_x = domain_size['x'] / grid_size['x']\n",
"delta_y = domain_size['y'] / grid_size['y'] \n",
"\n",
"alpha_x = np.random.random((grid_size['x'],grid_size['y']))\n",
"alpha_y = np.ones((grid_size['x'],grid_size['y']))\n",
"\n",
"time_step = 0.1"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# initialize environment with start values\n",
"C_t = np.zeros((grid_size['x'],grid_size['y']))\n",
"C_t[19,0] = 2000\n",
"C_t[19,19] = 2000\n",
"\n",
"\n",
"plt.imshow(C_t, vmin=0, vmax=2000)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# calculate mean between two cells\n",
"def alpha_interblock(alpha1, alpha2, harmonic=True):\n",
" if not harmonic:\n",
" return 0.5 * (alpha1 + alpha2)\n",
" else:\n",
" return 2 / ((1/alpha1) + (1/alpha2))"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"def sub(delta_t, delta_x):\n",
" return delta_t / (2 * delta_x**2)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"################\n",
"### CONSTANT ###\n",
"################\n",
"\n",
"# creates the coefficient matrix for a given row\n",
"def create_coeff_matrix(alpha_x, row_index, s_x):\n",
" # alias\n",
" r = row_index\n",
"\n",
" # a square matrix of column^2 dimension for the coefficients\n",
" cm = np.zeros((alpha_x.shape[1],alpha_x.shape[1]))\n",
"\n",
" # top left\n",
" cm[0,0] = 1 + s_x * (alpha_interblock(alpha_x[r,0], alpha_x[r,1]) + 2 * alpha_x[r,0]) # alpha_x[0,0]\n",
" cm[0,1] = -s_x * alpha_interblock(alpha_x[r, 0], alpha_x[r, 1])\n",
"\n",
" # inner cells\n",
" for i_cm in range(1, cm.shape[0]-1):\n",
" j_alpha = i_cm #- 1 # ???????\n",
" cm[i_cm,i_cm-1] = -s_x * alpha_interblock(alpha_x[r, j_alpha-1], alpha_x[r, j_alpha])\n",
" cm[i_cm,i_cm] = 1 + s_x * (alpha_interblock(alpha_x[r,j_alpha], alpha_x[r, j_alpha+1]) \\\n",
" + alpha_interblock(alpha_x[r, j_alpha], alpha_x[r, j_alpha-1]))\n",
" cm[i_cm,i_cm+1] = -s_x * alpha_interblock(alpha_x[r, j_alpha], alpha_x[r, j_alpha+1])\n",
"\n",
"\n",
" # bottom right\n",
" n = cm.shape[0]-1\n",
" cm[n,n-1] = -s_x * alpha_interblock(alpha_x[r, n-1], alpha_x[r, n]) ## changed to - !!!\n",
" cm[n,n] = 1 + s_x * (alpha_interblock(alpha_x[r, n], alpha_x[r, n-1]) + 2 * alpha_x[r,n]) # alpha_x[n,n]? -> changed to [r,n]!!! and changed to +alpha_interblock\n",
"\n",
" # print(cm)\n",
" return cm\n",
"\n",
"# creates the solution vector for a given row\n",
"# s_x, alpha_x, row_index?\n",
"def create_solution_vector(concentrations, alpha_x, alpha_y, row_index, s_x, s_y, bc_left, bc_right, bc_top, bc_bottom):\n",
"\n",
" sv = np.zeros(concentrations.shape[1])\n",
" # print(concentrations.shape[1])\n",
" # print(sv.shape[0])\n",
" # print(row_index)\n",
"\n",
" # inner rows\n",
" if row_index > 0 and row_index < concentrations.shape[0]-1:\n",
" for i in range(0, sv.shape[0]):\n",
" sv[i] = s_y * alpha_interblock(alpha_y[row_index+1,i],alpha_y[row_index,i]) * concentrations[row_index+1,i] \\\n",
" + (\n",
" 1 - s_y * (\n",
" alpha_interblock(alpha_y[row_index+1,i], alpha_y[row_index,i]) \\\n",
" + alpha_interblock(alpha_y[row_index,i], alpha_y[row_index-1,i])\n",
" )\n",
" ) * concentrations[row_index,i] \\\n",
" + s_y * alpha_interblock(alpha_y[row_index,i], alpha_y[row_index-1,i]) * concentrations[row_index-1,i]\n",
"\n",
" # first row\n",
" if row_index == 0:\n",
" for i in range(0, sv.shape[0]):\n",
" sv[i] = s_y * alpha_interblock(alpha_y[row_index+1,i],alpha_y[row_index,i]) * concentrations[row_index+1,i] \\\n",
" + (\n",
" 1 - s_y * (\n",
" alpha_interblock(alpha_y[row_index+1,i], alpha_y[row_index,i]) \\\n",
" + 2 * alpha_y[row_index,i]\n",
" )\n",
" ) * concentrations[row_index,i] \\\n",
" + s_y * alpha_y[row_index,i] * bc_top\n",
"\n",
"\n",
" # last row\n",
" if row_index == concentrations.shape[0]-1:\n",
" for i in range(0, sv.shape[0]):\n",
" i = i\n",
" sv[i] = s_y * alpha_y[row_index,i]*bc_bottom \\\n",
" + (\n",
" 1 - s_y * (\n",
" 2 * alpha_y[row_index,i] \\\n",
" + alpha_interblock(alpha_y[row_index,i], alpha_y[row_index-1,i])\n",
" )\n",
" ) * concentrations[row_index,i] \\\n",
" + s_y * alpha_interblock(alpha_y[row_index,i], alpha_y[row_index-1,i]) * concentrations[row_index-1,i]\n",
"\n",
"\n",
" # first column (additional fixed concentration change from perpendicular dimension)\n",
" i = 0\n",
" sv[0] += 2 * s_x * alpha_x[row_index,0] * bc_left # alpha_x[row_index,0]?\n",
"\n",
" # last column (additional fixed concentration change from perpendicular direction)\n",
" n = sv.shape[0]-1\n",
" sv[n] += 2 * s_x * alpha_x[row_index,n] * bc_right\n",
"\n",
" # print(sv)\n",
" return sv\n",
"\n",
"def calc_sweep(concentrations, alpha_x, alpha_y, s_x, s_y, bc_left, bc_right, bc_top, bc_bottom):\n",
"\n",
" concentrations_t1 = np.zeros((concentrations.shape[0], concentrations.shape[1]))\n",
"\n",
" for i in range(concentrations.shape[0]):\n",
" A = create_coeff_matrix(alpha_x, i, s_x)\n",
" # print(i)\n",
" b = create_solution_vector(concentrations, alpha_x, alpha_y, i, s_x, s_y, bc_left, bc_right, bc_top, bc_bottom)\n",
" concentrations_t1[i,:] = np.linalg.solve(A,b)\n",
"\n",
" # print(concentrations_t1)\n",
" return concentrations_t1\n",
"\n",
"def calc_iteration(concentrations, alpha_x, alpha_y, s_x, s_y, bc_left, bc_right, bc_top, bc_bottom):\n",
" concentrations = calc_sweep(concentrations, alpha_x, alpha_y, s_x, s_y, bc_left, bc_right, bc_top, bc_bottom)\n",
" # concentrations = calc_sweep(concentrations, alpha_x, alpha_y, s_x, s_y, bc_left, bc_right, bc_top, bc_bottom, True)\n",
" concentrations = calc_sweep(concentrations.transpose(), alpha_y.transpose(), alpha_x.transpose(), s_y, s_x, bc_top, bc_bottom, bc_left, bc_right).transpose()\n",
" \n",
" # print(concentrations)\n",
" return concentrations\n",
"\n",
"\n",
"def sim_constant(concentrations, alpha_x, alpha_y, iterations, delta_t, delta_x, delta_y, bc_left, bc_right, bc_top, bc_bottom):\n",
" s_x = sub(delta_t, delta_x)\n",
" s_y = sub(delta_t, delta_y)\n",
" for i in range(iterations):\n",
" concentrations = calc_iteration(concentrations, alpha_x, alpha_y, s_x, s_y, bc_left, bc_right, bc_top, bc_bottom)\n",
"\n",
" return concentrations\n"
]
},
{
"cell_type": "code",
"execution_count": 279,
"metadata": {},
"outputs": [],
"source": [
"##############\n",
"### CLOSED ###\n",
"##############\n",
"\n",
"# creates the coefficient matrix for a given row\n",
"def create_coeff_matrix(alpha_x, row_index, s_x):\n",
" # alias\n",
" r = row_index\n",
"\n",
" # a square matrix of column^2 dimension for the coefficients\n",
" cm = np.zeros((alpha_x.shape[1],alpha_x.shape[1]))\n",
"\n",
" # top left\n",
" cm[0,0] = 1 + s_x * alpha_interblock(alpha_x[r,0], alpha_x[r,1]) # alpha_x[0,0]\n",
" cm[0,1] = -s_x * alpha_interblock(alpha_x[r, 0], alpha_x[r, 1])\n",
"\n",
" # inner cells\n",
" for i_cm in range(1, cm.shape[0]-1):\n",
" j_alpha = i_cm #- 1 # ???????\n",
" cm[i_cm,i_cm-1] = -s_x * alpha_interblock(alpha_x[r, j_alpha-1], alpha_x[r, j_alpha])\n",
" cm[i_cm,i_cm] = 1 + s_x * (alpha_interblock(alpha_x[r,j_alpha], alpha_x[r, j_alpha+1]) \\\n",
" + alpha_interblock(alpha_x[r, j_alpha], alpha_x[r, j_alpha-1]))\n",
" cm[i_cm,i_cm+1] = -s_x * alpha_interblock(alpha_x[r, j_alpha], alpha_x[r, j_alpha+1])\n",
"\n",
"\n",
" # bottom right\n",
" n = cm.shape[0]-1\n",
" cm[n,n-1] = -s_x * alpha_interblock(alpha_x[r, n-1], alpha_x[r, n])\n",
" cm[n,n] = 1 + s_x * (alpha_interblock(alpha_x[r, n], alpha_x[r, n-1])) # alpha_x[n,n]? \n",
"\n",
" # print(cm)\n",
" return cm\n",
"\n",
"# creates the solution vector for a given row\n",
"# s_x, alpha_x, row_index?\n",
"def create_solution_vector(concentrations, alpha_x, alpha_y, row_index, s_x, s_y, bc_left, bc_right, bc_top, bc_bottom):\n",
"\n",
" sv = np.zeros(concentrations.shape[1])\n",
" # print(concentrations.shape[1])\n",
" # print(sv.shape[0])\n",
" # print(row_index)\n",
"\n",
" # inner rows\n",
" if row_index > 0 and row_index < concentrations.shape[0]-1:\n",
" for i in range(0, sv.shape[0]):\n",
" sv[i] = s_y * alpha_interblock(alpha_y[row_index+1,i],alpha_y[row_index,i]) * concentrations[row_index+1,i] \\\n",
" + (\n",
" 1 - s_y * (\n",
" alpha_interblock(alpha_y[row_index+1,i], alpha_y[row_index,i]) \\\n",
" + alpha_interblock(alpha_y[row_index,i], alpha_y[row_index-1,i])\n",
" )\n",
" ) * concentrations[row_index,i] \\\n",
" + s_y * alpha_interblock(alpha_y[row_index,i], alpha_y[row_index-1,i]) * concentrations[row_index-1,i]\n",
"\n",
" # first row\n",
" if row_index == 0:\n",
" for i in range(0, sv.shape[0]):\n",
" sv[i] = s_y * alpha_interblock(alpha_y[row_index+1,i],alpha_y[row_index,i]) * concentrations[row_index+1,i] \\\n",
" + (\n",
" 1 - s_y * (\n",
" alpha_interblock(alpha_y[row_index+1,i], alpha_y[row_index,i]) \\\n",
" )\n",
" ) * concentrations[row_index,i]\n",
"\n",
"\n",
" # last row\n",
" if row_index == sv.shape[0]-1:\n",
" for i in range(0, sv.shape[0]):\n",
" i = i\n",
" sv[i] = (\n",
" 1 - s_y * (\n",
" alpha_interblock(alpha_y[row_index,i], alpha_y[row_index-1,i])\n",
" )\n",
" ) * concentrations[row_index,i] \\\n",
" + s_y * alpha_interblock(alpha_y[row_index,i], alpha_y[row_index-1,i]) * concentrations[row_index-1,i]\n",
"\n",
" # print(sv)\n",
" return sv\n",
"\n",
"def calc_sweep(concentrations, alpha_x, alpha_y, s_x, s_y, bc_left, bc_right, bc_top, bc_bottom):\n",
"\n",
" concentrations_t1 = np.zeros((concentrations.shape[0], concentrations.shape[1]))\n",
"\n",
" for i in range(concentrations.shape[0]):\n",
" A = create_coeff_matrix(alpha_x, i, s_x)\n",
" # print(i)\n",
" b = create_solution_vector(concentrations, alpha_x, alpha_y, i, s_x, s_y, bc_left, bc_right, bc_top, bc_bottom)\n",
" concentrations_t1[i,:] = np.linalg.solve(A,b)\n",
"\n",
" # print(concentrations_t1)\n",
" return concentrations_t1\n",
"\n",
"def calc_iteration(concentrations, alpha_x, alpha_y, s_x, s_y, bc_left, bc_right, bc_top, bc_bottom):\n",
" concentrations = calc_sweep(concentrations, alpha_x, alpha_y, s_x, s_y, bc_left, bc_right, bc_top, bc_bottom)\n",
" # concentrations = calc_sweep(concentrations, alpha_x, alpha_y, s_x, s_y, bc_left, bc_right, bc_top, bc_bottom, True)\n",
" concentrations = calc_sweep(concentrations.transpose(), alpha_y.transpose(), alpha_x.transpose(), s_y, s_x, bc_top, bc_bottom, bc_left, bc_right).transpose()\n",
" \n",
" # print(concentrations)\n",
" return concentrations\n",
"\n",
"\n",
"def sim_closed(concentrations, alpha_x, alpha_y, iterations, delta_t, delta_x, delta_y, bc_left, bc_right, bc_top, bc_bottom):\n",
" s_x = sub(delta_t, delta_x)\n",
" s_y = sub(delta_t, delta_y)\n",
" for i in range(iterations):\n",
" concentrations = calc_iteration(concentrations, alpha_x, alpha_y, s_x, s_y, bc_left, bc_right, bc_top, bc_bottom)\n",
"\n",
" return concentrations\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Test Concentrations t=0:\n",
"[[2000. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n",
" 0. 0. 0. 0. 0. 0. 0. 0.]\n",
" [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n",
" 0. 0. 0. 0. 0. 0. 0. 0.]\n",
" [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n",
" 0. 0. 0. 0. 0. 0. 0. 0.]\n",
" [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n",
" 0. 0. 0. 0. 0. 0. 0. 0.]\n",
" [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n",
" 0. 0. 0. 0. 0. 0. 0. 0.]\n",
" [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n",
" 0. 0. 0. 0. 0. 0. 0. 0.]\n",
" [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n",
" 0. 0. 0. 0. 0. 0. 0. 0.]\n",
" [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n",
" 0. 0. 0. 0. 0. 0. 0. 0.]\n",
" [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n",
" 0. 0. 0. 0. 0. 0. 0. 0.]\n",
" [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n",
" 0. 0. 0. 0. 0. 0. 0. 0.]\n",
" [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n",
" 0. 0. 0. 0. 0. 0. 0. 0.]\n",
" [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n",
" 0. 0. 0. 0. 0. 0. 0. 0.]\n",
" [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n",
" 0. 0. 0. 0. 0. 0. 0. 0.]\n",
" [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n",
" 0. 0. 0. 0. 0. 0. 0. 0.]\n",
" [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n",
" 0. 0. 0. 0. 0. 0. 0. 0.]\n",
" [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n",
" 0. 0. 0. 0. 0. 0. 0. 0.]\n",
" [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n",
" 0. 0. 0. 0. 0. 0. 0. 0.]\n",
" [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n",
" 0. 0. 0. 0. 0. 0. 0. 0.]\n",
" [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n",
" 0. 0. 0. 0. 0. 0. 0. 0.]\n",
" [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n",
" 0. 0. 0. 0. 0. 0. 0. 0.]]\n",
"\n",
"Test Alpha:\n",
"[[1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]\n",
" [1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]\n",
" [1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]\n",
" [1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]\n",
" [1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]\n",
" [1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]\n",
" [1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]\n",
" [1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]\n",
" [1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]\n",
" [1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]\n",
" [1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]\n",
" [1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]\n",
" [1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]\n",
" [1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]\n",
" [1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]\n",
" [1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]\n",
" [1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]\n",
" [1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]\n",
" [1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]\n",
" [1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]]\n",
"\n",
"Test Concentrations t=t+100:\n",
"[[1.03406102e-02 2.94500761e-02 4.42425339e-02 5.30261971e-02\n",
" 5.54585202e-02 5.24218517e-02 4.55845468e-02 3.68489169e-02\n",
" 2.78821774e-02 1.98459123e-02 1.33384447e-02 8.49104197e-03\n",
" 5.13286742e-03 2.95307410e-03 1.62013743e-03 8.48919901e-04\n",
" 4.24937081e-04 2.01925178e-04 8.71721193e-05 2.40321537e-05]\n",
" [2.94500761e-02 8.38738682e-02 1.26002814e-01 1.51018702e-01\n",
" 1.57945963e-01 1.49297526e-01 1.29824869e-01 1.04945780e-01\n",
" 7.94084902e-02 5.65211929e-02 3.79879138e-02 2.41825024e-02\n",
" 1.46184154e-02 8.41036020e-03 4.61415423e-03 2.41772537e-03\n",
" 1.21022155e-03 5.75083262e-04 2.48266349e-04 6.84436157e-05]\n",
" [4.42425339e-02 1.26002814e-01 1.89292678e-01 2.26873779e-01\n",
" 2.37280529e-01 2.24288074e-01 1.95034511e-01 1.57658921e-01\n",
" 1.19294525e-01 8.49111829e-02 5.70688361e-02 3.63291144e-02\n",
" 2.19610889e-02 1.26347941e-02 6.93179449e-03 3.63212293e-03\n",
" 1.81810288e-03 8.63941426e-04 3.72967877e-04 1.02822111e-04]\n",
" [5.30261971e-02 1.51018702e-01 2.26873779e-01 2.71916020e-01\n",
" 2.84388867e-01 2.68816963e-01 2.33755563e-01 1.88959635e-01\n",
" 1.42978587e-01 1.01768970e-01 6.83989610e-02 4.35416919e-02\n",
" 2.63211197e-02 1.51432348e-02 8.30799388e-03 4.35322413e-03\n",
" 2.17905877e-03 1.03546348e-03 4.47014816e-04 1.23235833e-04]\n",
" [5.54585202e-02 1.57945963e-01 2.37280529e-01 2.84388867e-01\n",
" 2.97433845e-01 2.81147656e-01 2.44477981e-01 1.97627254e-01\n",
" 1.49537045e-01 1.06437135e-01 7.15364362e-02 4.55389587e-02\n",
" 2.75284751e-02 1.58378583e-02 8.68908336e-03 4.55290746e-03\n",
" 2.27901267e-03 1.08296042e-03 4.67519482e-04 1.28888687e-04]\n",
" [5.24218517e-02 1.49297526e-01 2.24288074e-01 2.68816963e-01\n",
" 2.81147656e-01 2.65753227e-01 2.31091425e-01 1.86806041e-01\n",
" 1.41349044e-01 1.00609098e-01 6.76194106e-02 4.30454425e-02\n",
" 2.60211350e-02 1.49706457e-02 8.21330676e-03 4.30360996e-03\n",
" 2.15422380e-03 1.02366219e-03 4.41920139e-04 1.21831301e-04]\n",
" [4.55845468e-02 1.29824869e-01 1.95034511e-01 2.33755563e-01\n",
" 2.44477981e-01 2.31091425e-01 2.00950511e-01 1.62441204e-01\n",
" 1.22913096e-01 8.74868017e-02 5.87999104e-02 3.74310888e-02\n",
" 2.26272367e-02 1.30180465e-02 7.14205726e-03 3.74229645e-03\n",
" 1.87325156e-03 8.90147442e-04 3.84281146e-04 1.05941024e-04]\n",
" [3.68489169e-02 1.04945780e-01 1.57658921e-01 1.88959635e-01\n",
" 1.97627254e-01 1.86806041e-01 1.62441204e-01 1.31311658e-01\n",
" 9.93585501e-02 7.07212008e-02 4.75317441e-02 3.02579531e-02\n",
" 1.82910487e-02 1.05233230e-02 5.77338359e-03 3.02513857e-03\n",
" 1.51426955e-03 7.19563348e-04 3.10639131e-04 8.56389336e-05]\n",
" [2.78821774e-02 7.94084902e-02 1.19294525e-01 1.42978587e-01\n",
" 1.49537045e-01 1.41349044e-01 1.22913096e-01 9.93585501e-02\n",
" 7.51808454e-02 5.35120496e-02 3.59654675e-02 2.28950452e-02\n",
" 1.38401426e-02 7.96259931e-03 4.36850033e-03 2.28900759e-03\n",
" 1.14579032e-03 5.44466287e-04 2.35048846e-04 6.47997321e-05]\n",
" [1.98459123e-02 5.65211929e-02 8.49111829e-02 1.01768970e-01\n",
" 1.06437135e-01 1.00609098e-01 8.74868017e-02 7.07212008e-02\n",
" 5.35120496e-02 3.80886839e-02 2.55994179e-02 1.62961827e-02\n",
" 9.85110493e-03 5.66760067e-03 3.10940114e-03 1.62926457e-03\n",
" 8.15548004e-04 3.87538964e-04 1.67302528e-04 4.61230046e-05]\n",
" [1.33384447e-02 3.79879138e-02 5.70688361e-02 6.83989610e-02\n",
" 7.15364362e-02 6.76194106e-02 5.87999104e-02 4.75317441e-02\n",
" 3.59654675e-02 2.55994179e-02 1.72053779e-02 1.09526702e-02\n",
" 6.62093111e-03 3.80919642e-03 2.08982961e-03 1.09502929e-03\n",
" 5.48130103e-04 2.60465075e-04 1.12444088e-04 3.09992877e-05]\n",
" [8.49104197e-03 2.41825024e-02 3.63291144e-02 4.35416919e-02\n",
" 4.55389587e-02 4.30454425e-02 3.74310888e-02 3.02579531e-02\n",
" 2.28950452e-02 1.62961827e-02 1.09526702e-02 6.97229584e-03\n",
" 4.21477956e-03 2.42487392e-03 1.33035233e-03 6.97078252e-04\n",
" 3.48930915e-04 1.65807929e-04 7.15801202e-05 1.97336541e-05]\n",
" [5.13286742e-03 1.46184154e-02 2.19610889e-02 2.63211197e-02\n",
" 2.75284751e-02 2.60211350e-02 2.26272367e-02 1.82910487e-02\n",
" 1.38401426e-02 9.85110493e-03 6.62093111e-03 4.21477956e-03\n",
" 2.54785040e-03 1.46584558e-03 8.04203081e-04 4.21386475e-04\n",
" 2.10930076e-04 1.00231528e-04 4.32704570e-05 1.19290695e-05]\n",
" [2.95307410e-03 8.41036020e-03 1.26347941e-02 1.51432348e-02\n",
" 1.58378583e-02 1.49706457e-02 1.30180465e-02 1.05233230e-02\n",
" 7.96259931e-03 5.66760067e-03 3.80919642e-03 2.42487392e-03\n",
" 1.46584558e-03 8.43339650e-04 4.62679258e-04 2.42434761e-04\n",
" 1.21353640e-04 5.76658437e-05 2.48946360e-05 6.86310854e-06]\n",
" [1.62013743e-03 4.61415423e-03 6.93179449e-03 8.30799388e-03\n",
" 8.68908336e-03 8.21330676e-03 7.14205726e-03 5.77338359e-03\n",
" 4.36850033e-03 3.10940114e-03 2.08982961e-03 1.33035233e-03\n",
" 8.04203081e-04 4.62679258e-04 2.53838528e-04 1.33006358e-04\n",
" 6.65779344e-05 3.16370632e-05 1.36578799e-05 3.76528954e-06]\n",
" [8.48919901e-04 2.41772537e-03 3.63212293e-03 4.35322413e-03\n",
" 4.55290746e-03 4.30360996e-03 3.74229645e-03 3.02513857e-03\n",
" 2.28900759e-03 1.62926457e-03 1.09502929e-03 6.97078252e-04\n",
" 4.21386475e-04 2.42434761e-04 1.33006358e-04 6.96926953e-05\n",
" 3.48855181e-05 1.65771940e-05 7.15645839e-06 1.97293709e-06]\n",
" [4.24937081e-04 1.21022155e-03 1.81810288e-03 2.17905877e-03\n",
" 2.27901267e-03 2.15422380e-03 1.87325156e-03 1.51426955e-03\n",
" 1.14579032e-03 8.15548004e-04 5.48130103e-04 3.48930915e-04\n",
" 2.10930076e-04 1.21353640e-04 6.65779344e-05 3.48855181e-05\n",
" 1.74623662e-05 8.29791415e-06 3.58225145e-06 9.87577426e-07]\n",
" [2.01925178e-04 5.75083262e-04 8.63941426e-04 1.03546348e-03\n",
" 1.08296042e-03 1.02366219e-03 8.90147442e-04 7.19563348e-04\n",
" 5.44466287e-04 3.87538964e-04 2.60465075e-04 1.65807929e-04\n",
" 1.00231528e-04 5.76658437e-05 3.16370632e-05 1.65771940e-05\n",
" 8.29791415e-06 3.94307268e-06 1.70224439e-06 4.69285352e-07]\n",
" [8.71721193e-05 2.48266349e-04 3.72967877e-04 4.47014816e-04\n",
" 4.67519482e-04 4.41920139e-04 3.84281146e-04 3.10639131e-04\n",
" 2.35048846e-04 1.67302528e-04 1.12444088e-04 7.15801202e-05\n",
" 4.32704570e-05 2.48946360e-05 1.36578799e-05 7.15645839e-06\n",
" 3.58225145e-06 1.70224439e-06 7.34867500e-07 2.02592857e-07]\n",
" [2.40321537e-05 6.84436157e-05 1.02822111e-04 1.23235833e-04\n",
" 1.28888687e-04 1.21831301e-04 1.05941024e-04 8.56389336e-05\n",
" 6.47997321e-05 4.61230046e-05 3.09992877e-05 1.97336541e-05\n",
" 1.19290695e-05 6.86310854e-06 3.76528954e-06 1.97293709e-06\n",
" 9.87577426e-07 4.69285352e-07 2.02592857e-07 5.58520626e-08]]\n"
]
}
],
"source": [
"row = 20\n",
"col = 20\n",
"domain_row = row\n",
"domain_col = col\n",
"iterations = 100\n",
"delta_t = 0.1\n",
"delta_x = domain_col / col\n",
"delta_y = domain_row / row\n",
"bc_left = 0\n",
"bc_right = 0\n",
"bc_top = 0\n",
"bc_bottom = 0\n",
"\n",
"\n",
"testConcentrations = np.zeros((row,col))\n",
"testConcentrations[0,0] = 2000\n",
"print(\"Test Concentrations t=0:\")\n",
"print(testConcentrations)\n",
"\n",
"# seed = np.random.seed(42)\n",
"# testAlpha = np.random.random((row,col)) * 10\n",
"testAlpha= np.ones((row,col))\n",
"print(\"\\nTest Alpha:\")\n",
"print(testAlpha)\n",
"\n",
"testConcentrations = sim_constant(testConcentrations, testAlpha, testAlpha, iterations, delta_t, delta_x, delta_y, bc_left, bc_right, bc_top, bc_bottom)\n",
"print(\"\\nTest Concentrations t=t+\" + str(iterations) + \":\")\n",
"print(testConcentrations)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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ERHJY7FYVNu1c9f6tLe3w263IzY2VrU/NjYWZrN5QK/z2muv4fLly1i2bJlz38SJE1FaWooDBw6grKwMBoMBs2fP9vol2h3pQwOrVq3CO++8g/379yMqKsr5Jo1GI4YNGwbgarf+hQsXsGvXLgBXu0DGjRuHyZMnw2az4e2330ZFRQUqKipkp0dERBrnEAoc/i4o9MXx1w9JP//881i3bp3bYxRF/ZpCCJd97pSVlWHdunXYv38/YmJinPvT09ORnp7ufDx79mxMmzYNGzduxIYNGwb6VuQXAlu2bAEAzJ07V7V/586dePjhhwEAra2tqgkSNpsNTz75JC5cuIBhw4Zh8uTJOHjwIO655x7Z6RERkcY5JCwx3LeOQEtLi2poWq/Xu7QdNWoUwsLCXL79t7W1ufQSXK+8vBwFBQV49913cdddd3ltq9PpMGPGjKHvERADuCNTaWmp6vFTTz2Fp556SnYqREREATWQOWqRkZFIS0tDVVUVvvOd7zj3V1VVYfHixR6PKysrwyOPPIKysjLce++9/eYihEBDQwOmTp068DcA3muAiIg0Rs5tiH07vrCwEHl5eZg+fToyMjKwbds2NDc3Y+XKlQBch8zLysqQn5+PN954A+np6c7ehGHDhsFovLrGyQsvvID09HTcdtttsFgs2LBhAxoaGrBp0yafcmMhQEREmmKHAruP6wC4i+GL3NxcXLx4ES+++CJaW1sxZcoUVFZWIjExEYDrkPkvf/lL9Pb2YtWqVVi1apVz//Lly5296h0dHXj00UdhNpthNBqRmpqKmpoazJw506fcWAgQERENgsceewyPPfaY2+euHzKvrq7uN97rr7+O119/3e+8WAgQEZGmDMXQQDBjIUBERJpih+9d++5ihIrQKWmIiIjIZ+wRICIiTeHQgBoLASIi0pShuOlQMGMhQEREmiJu4DbC7mKEitApaYiIiMhn7BEgIiJN4dCAWsgVAkKnQOj8vKtUpENSNsDoyC4pceLDXG9teaPGhH9NShyrkPPeACAm0iIlzgi9TUocALgS0f99MwZChMv7hSHCJHVHyooDAAO4expRMJF598FQEDolDREREfks5HoEiIiIvLFLuA2xv8cHExYCRESkKRwaUAudkoaIiIh8xh4BIiLSFAd0cPj5Pdjf44MJCwEiItIUu1Bg97Nr39/jg0nolDRERETk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",
"text/plain": [
"<Figure size 640x480 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.imshow(testConcentrations)\n",
"plt.colorbar()\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "forschungsprojekt",
"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.11.4"
},
"orig_nbformat": 4
},
"nbformat": 4,
"nbformat_minor": 2
}