work on vector problem with quadrupole

master
polymurph 3 years ago
parent 35aec1bb47
commit 811814dc00

@ -2,7 +2,7 @@
"cells": [ "cells": [
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 3, "execution_count": 2,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@ -12,89 +12,95 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 10, "execution_count": 53,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"test\n",
"[-0.0106066 0.0106066 0. ]\n"
]
},
{
"ename": "TypeError",
"evalue": "'numpy.ndarray' object is not callable",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-53-0758df948b6f>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 59\u001b[0m \u001b[0mquad\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minfiniteLengthQuadrupole\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5e-3\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m15e-3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 60\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mn\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1000\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 61\u001b[0;31m \u001b[0mion\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mposition\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mquad\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcalcNewIonPos\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1000\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1.1e6\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mion\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mt_step\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mt_sim\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 62\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mion\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mposition\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 63\u001b[0m \u001b[0mt_sim\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0mt_step\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m<ipython-input-53-0758df948b6f>\u001b[0m in \u001b[0;36mcalcNewIonPos\u001b[0;34m(self, U, V, f, ion, t_s, t)\u001b[0m\n\u001b[1;32m 39\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'test'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 40\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpPole\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 41\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpPole\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mion\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mposition\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 42\u001b[0m \u001b[0mr_v\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpPole\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mion\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mposition\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 43\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mTypeError\u001b[0m: 'numpy.ndarray' object is not callable"
]
}
],
"source": [ "source": [
"class Ion:\n", "class Ion:\n",
" def __init__(self,position, charge, mass, v_z):\n", " def __init__(self,position, charge, mass, v_z):\n",
" self.position = position\n", " self.position = np.array(position)\n",
" self.charge = charge\n", " self.charge = charge\n",
" self.m = mass\n", " self.m = mass\n",
" self.v_z = v_z\n", " self.v_z = v_z\n",
" self.F = np.zeros(3)\n", " self.F = np.array(np.zeros(3))\n",
"\n", "\n",
"class infiniteLengthQuadrupole:\n", "class infiniteLengthQuadrupole:\n",
" def __init__(self,R,r_0):\n", " def __init__(self,R,r_0):\n",
" self.R = R\n", " self.R = R\n",
" self.r_0 = r_0\n", " self.r_0 = r_0\n",
" self.pPole = np.zeros(4)\n", " self.pPole = np.array([[ r_0/np.sqrt(2),r_0/np.sqrt(2),0],\n",
" self.pPole[0] = [r_0/np.sqrt(2),r_0/np.sqrt(2)]\n", " [-r_0/np.sqrt(2),r_0/np.sqrt(2),0],\n",
" self.pPole[1] = [-r_0/np.sqrt(2),r_0/np.sqrt(2)]\n", " [-r_0/np.sqrt(2),-r_0/np.sqrt(2),0],\n",
" self.pPole[2] = [-r_0/np.sqrt(2),-r_0/np.sqrt(2)]\n", " [r_0/np.sqrt(2),-r_0/np.sqrt(2),0]])\n",
" self.pPole[3] = [r_0/np.sqrt(2),-r_0/np.sqrt(2)]\n",
" self.rodsPseudoQ = np.zeros(4)\n", " self.rodsPseudoQ = np.zeros(4)\n",
" self.K = 1 / (4 * np.pi * sc.epsilon_0)\n", " self.K = 1 / (4 * np.pi * sc.epsilon_0)\n",
" \n", " \n",
" def phi_0(U, V, f, t):\n", " def phi_0(self,U, V, f, t):\n",
" return U + V * np.sin(2 * np.pi * f * t)\n", " return U + V * np.sin(2 * np.pi * f * t)\n",
" \n", " \n",
" def calcNewIonPos(U,V,f,ion,t_s):\n", " def calcNewIonPos(self,U,V,f,ion,t_s,t):\n",
" \n", " \n",
" # check if ion has left the r_0 boundary\n", " # check if ion has left the r_0 boundary\n",
" if np.abs(ion.p) >= r_0:\n", " p_I = np.sqrt(sum(i*i for i in ion.position))\n",
" if p_I >= self.r_0:\n",
" return None\n", " return None\n",
" \n", " \n",
" signLUT = [1,-1,1,-1]\n", " signLUT = [1,-1,1,-1]\n",
" index = 0;\n", " index = 0;\n",
" \n", " \n",
" for Q in rodsPseudoQ:\n", " for Q in self.rodsPseudoQ:\n",
" # calculate the pseudo charge points of the quadrupole\n", " # calculate the pseudo charge points of the quadrupole\n",
" Q = signLUT[index] * phi_0(U,V,f)/2 * K * R\n", " Q = signLUT[index] * self.phi_0(U,V,f,t)/2 * self.K * self.R\n",
" index = index + 1\n", " index = index + 1\n",
" \n", " \n",
" # calculate force on ion\n", " # calculate force on ion\n",
" r_v = pPole[index] - ion.position\n", " print('test')\n",
" ion.F += K * ion.charge * Q * r_v / (np.abs(r_v)**3)\n", " print(self.pPole[index])\n",
" self.pPole[index] = ion.position(3)\n",
" r_v = self.pPole[index] - ion.position\n",
" \n",
" print(r_v)\n",
" inv_mag_r_v = 1 / (np.sqrt(sum(i*i for i in r_v))**3)\n",
" ion.F += self.K * ion.charge * Q * r_v * inv_mag_r_v\n",
" \n", " \n",
" newPosition = t_s**2 * 1 / ion.m * ion.F + ion.position\n", " newPosition = t_s**2 * 1 / ion.m * ion.F + ion.position\n",
" print(newPosition)\n",
"\n", "\n",
" return newPosition" " return newPosition\n",
] " \n",
}, "t_step = 1e-6\n",
{ "t_sim = 0\n",
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"ename": "ValueError",
"evalue": "setting an array element with a sequence.",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;31mTypeError\u001b[0m: float() argument must be a string or a number, not 'list'",
"\nThe above exception was the direct cause of the following exception:\n",
"\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-11-719575a9fd46>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;31m# quadrupole\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0mquad\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minfiniteLengthQuadrupole\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5E-3\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m15E-3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 8\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mn\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1000\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mion\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mposition\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mquad\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcalcNewIonPos\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1000\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mion\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mt_s\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m<ipython-input-10-8caf849c398b>\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, R, r_0)\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mr_0\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mr_0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpPole\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mzeros\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 14\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpPole\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mr_0\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msqrt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mr_0\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msqrt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 15\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpPole\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0mr_0\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msqrt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mr_0\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msqrt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 16\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpPole\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0mr_0\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msqrt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0mr_0\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msqrt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mValueError\u001b[0m: setting an array element with a sequence."
]
}
],
"source": [
"t_s = 1E-6\n",
"\n",
"# coffein atom 524.50002164 dalton (8.709527e-25 kg)\n", "# coffein atom 524.50002164 dalton (8.709527e-25 kg)\n",
"ion = Ion([0,0,0], sc.e, 8.709527e-25,0)\n", "ion = Ion(np.array([[0],[0],[0]]), sc.e, 8.709527e-25,0)\n",
"\n", "\n",
"# quadrupole\n", "# quadrupole\n",
"quad = infiniteLengthQuadrupole(5E-3,15E-3)\n", "quad = infiniteLengthQuadrupole(5e-3,15e-3)\n",
"for n in range(0,1000,1):\n", "for n in range(0,1000,1):\n",
" ion.position = quad.calcNewIonPos(0,1000,ion,t_s)\n", " ion.position = quad.calcNewIonPos(0,1000,1.1e6,ion,t_step,t_sim)\n",
" print(ion.position)\n", " print(ion.position)\n",
" " " t_sim += t_step\n",
" "
] ]
} }
], ],

@ -2,7 +2,7 @@
"cells": [ "cells": [
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 3, "execution_count": 2,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@ -12,89 +12,95 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 10, "execution_count": 53,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"test\n",
"[-0.0106066 0.0106066 0. ]\n"
]
},
{
"ename": "TypeError",
"evalue": "'numpy.ndarray' object is not callable",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-53-0758df948b6f>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 59\u001b[0m \u001b[0mquad\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minfiniteLengthQuadrupole\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5e-3\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m15e-3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 60\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mn\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1000\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 61\u001b[0;31m \u001b[0mion\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mposition\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mquad\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcalcNewIonPos\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1000\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1.1e6\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mion\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mt_step\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mt_sim\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 62\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mion\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mposition\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 63\u001b[0m \u001b[0mt_sim\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0mt_step\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m<ipython-input-53-0758df948b6f>\u001b[0m in \u001b[0;36mcalcNewIonPos\u001b[0;34m(self, U, V, f, ion, t_s, t)\u001b[0m\n\u001b[1;32m 39\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'test'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 40\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpPole\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 41\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpPole\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mion\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mposition\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 42\u001b[0m \u001b[0mr_v\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpPole\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mion\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mposition\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 43\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mTypeError\u001b[0m: 'numpy.ndarray' object is not callable"
]
}
],
"source": [ "source": [
"class Ion:\n", "class Ion:\n",
" def __init__(self,position, charge, mass, v_z):\n", " def __init__(self,position, charge, mass, v_z):\n",
" self.position = position\n", " self.position = np.array(position)\n",
" self.charge = charge\n", " self.charge = charge\n",
" self.m = mass\n", " self.m = mass\n",
" self.v_z = v_z\n", " self.v_z = v_z\n",
" self.F = np.zeros(3)\n", " self.F = np.array(np.zeros(3))\n",
"\n", "\n",
"class infiniteLengthQuadrupole:\n", "class infiniteLengthQuadrupole:\n",
" def __init__(self,R,r_0):\n", " def __init__(self,R,r_0):\n",
" self.R = R\n", " self.R = R\n",
" self.r_0 = r_0\n", " self.r_0 = r_0\n",
" self.pPole = np.zeros(4)\n", " self.pPole = np.array([[ r_0/np.sqrt(2),r_0/np.sqrt(2),0],\n",
" self.pPole[0] = [r_0/np.sqrt(2),r_0/np.sqrt(2)]\n", " [-r_0/np.sqrt(2),r_0/np.sqrt(2),0],\n",
" self.pPole[1] = [-r_0/np.sqrt(2),r_0/np.sqrt(2)]\n", " [-r_0/np.sqrt(2),-r_0/np.sqrt(2),0],\n",
" self.pPole[2] = [-r_0/np.sqrt(2),-r_0/np.sqrt(2)]\n", " [r_0/np.sqrt(2),-r_0/np.sqrt(2),0]])\n",
" self.pPole[3] = [r_0/np.sqrt(2),-r_0/np.sqrt(2)]\n",
" self.rodsPseudoQ = np.zeros(4)\n", " self.rodsPseudoQ = np.zeros(4)\n",
" self.K = 1 / (4 * np.pi * sc.epsilon_0)\n", " self.K = 1 / (4 * np.pi * sc.epsilon_0)\n",
" \n", " \n",
" def phi_0(U, V, f, t):\n", " def phi_0(self,U, V, f, t):\n",
" return U + V * np.sin(2 * np.pi * f * t)\n", " return U + V * np.sin(2 * np.pi * f * t)\n",
" \n", " \n",
" def calcNewIonPos(U,V,f,ion,t_s):\n", " def calcNewIonPos(self,U,V,f,ion,t_s,t):\n",
" \n", " \n",
" # check if ion has left the r_0 boundary\n", " # check if ion has left the r_0 boundary\n",
" if np.abs(ion.p) >= r_0:\n", " p_I = np.sqrt(sum(i*i for i in ion.position))\n",
" if p_I >= self.r_0:\n",
" return None\n", " return None\n",
" \n", " \n",
" signLUT = [1,-1,1,-1]\n", " signLUT = [1,-1,1,-1]\n",
" index = 0;\n", " index = 0;\n",
" \n", " \n",
" for Q in rodsPseudoQ:\n", " for Q in self.rodsPseudoQ:\n",
" # calculate the pseudo charge points of the quadrupole\n", " # calculate the pseudo charge points of the quadrupole\n",
" Q = signLUT[index] * phi_0(U,V,f)/2 * K * R\n", " Q = signLUT[index] * self.phi_0(U,V,f,t)/2 * self.K * self.R\n",
" index = index + 1\n", " index = index + 1\n",
" \n", " \n",
" # calculate force on ion\n", " # calculate force on ion\n",
" r_v = pPole[index] - ion.position\n", " print('test')\n",
" ion.F += K * ion.charge * Q * r_v / (np.abs(r_v)**3)\n", " print(self.pPole[index])\n",
" self.pPole[index] = ion.position(3)\n",
" r_v = self.pPole[index] - ion.position\n",
" \n",
" print(r_v)\n",
" inv_mag_r_v = 1 / (np.sqrt(sum(i*i for i in r_v))**3)\n",
" ion.F += self.K * ion.charge * Q * r_v * inv_mag_r_v\n",
" \n", " \n",
" newPosition = t_s**2 * 1 / ion.m * ion.F + ion.position\n", " newPosition = t_s**2 * 1 / ion.m * ion.F + ion.position\n",
" print(newPosition)\n",
"\n", "\n",
" return newPosition" " return newPosition\n",
] " \n",
}, "t_step = 1e-6\n",
{ "t_sim = 0\n",
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"ename": "ValueError",
"evalue": "setting an array element with a sequence.",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;31mTypeError\u001b[0m: float() argument must be a string or a number, not 'list'",
"\nThe above exception was the direct cause of the following exception:\n",
"\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-11-719575a9fd46>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;31m# quadrupole\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0mquad\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minfiniteLengthQuadrupole\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5E-3\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m15E-3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 8\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mn\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1000\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mion\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mposition\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mquad\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcalcNewIonPos\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1000\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mion\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mt_s\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m<ipython-input-10-8caf849c398b>\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, R, r_0)\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mr_0\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mr_0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpPole\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mzeros\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 14\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpPole\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mr_0\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msqrt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mr_0\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msqrt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 15\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpPole\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0mr_0\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msqrt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mr_0\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msqrt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 16\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpPole\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0mr_0\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msqrt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0mr_0\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msqrt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mValueError\u001b[0m: setting an array element with a sequence."
]
}
],
"source": [
"t_s = 1E-6\n",
"\n",
"# coffein atom 524.50002164 dalton (8.709527e-25 kg)\n", "# coffein atom 524.50002164 dalton (8.709527e-25 kg)\n",
"ion = Ion([0,0,0], sc.e, 8.709527e-25,0)\n", "ion = Ion(np.array([[0],[0],[0]]), sc.e, 8.709527e-25,0)\n",
"\n", "\n",
"# quadrupole\n", "# quadrupole\n",
"quad = infiniteLengthQuadrupole(5E-3,15E-3)\n", "quad = infiniteLengthQuadrupole(5e-3,15e-3)\n",
"for n in range(0,1000,1):\n", "for n in range(0,1000,1):\n",
" ion.position = quad.calcNewIonPos(0,1000,ion,t_s)\n", " ion.position = quad.calcNewIonPos(0,1000,1.1e6,ion,t_step,t_sim)\n",
" print(ion.position)\n", " print(ion.position)\n",
" " " t_sim += t_step\n",
" "
] ]
} }
], ],

Loading…
Cancel
Save