/* * fermi.i - $Id$ * Fermi-Dirac integrals and inverses of orders -1/2, 1/2, 3/2, 5/2 */ local fermi ; /* DOCUMENT #include "fermi.i" * Fermi-Dirac integrals and inverses of orders -1/2, 1/2, 3/2, 5/2 * * Antia, H. M., Aph.J. 84, p.101-108 (1993) * * SEE ALSO: fdm12, fd12, fd32, fd52, ifdm12, ifd12, ifd32, ifd52 */ func fdm12 (x) /* DOCUMENT fdm12(x) * return Fermi-Dirac integral of order -1/2, * fdm12(x) = integral[0 to inf]{ dt * t^-0.5 / (exp(t-x)+1) } * accurate to about 1e-12 * SEE ALSO: fd12, fd32, fd52, ifdm12, ifd12, ifd32, ifd52 */ { mask = x < 2.; list = where(mask); if (numberof(list)) { a = exp(x(list)); a = a*poly(a, 1.71446374704454e7, 3.88148302324068e7, 3.16743385304962e7, 1.14587609192151e7, 1.83696370756153e6, 1.14980998186874e5, 1.98276889924768e3, 1.0) / poly(a, 9.67282587452899e6, 2.87386436731785e7, 3.26070130734158e7, 1.77657027846367e7, 4.81648022267831e6, 6.13709569333207e5, 3.13595854332114e4, 4.35061725080755e2); } list = where(!mask); if (numberof(list)) { x = x(list); b = 1./(x*x); b = sqrt(x)*poly(b, -4.46620341924942e-15, -1.58654991146236e-12, -4.44467627042232e-10, -6.84738791621745e-8, -6.64932238528105e-6, -3.69976170193942e-4, -1.12295393687006e-2, -1.60926102124442e-1, -8.52408612877447e-1, -7.45519953763928e-1, 2.98435207466372e0, 1.0) / poly(b, -2.23310170962369e-15, -7.94193282071464e-13, -2.22564376956228e-10, -3.43299431079845e-8, -3.33919612678907e-6, -1.86432212187088e-4, -5.69764436880529e-3, -8.34904593067194e-2, -4.78770844009440e-1, -4.99759250374148e-1, 1.86795964993052e0, 4.16485970495288e-1); } return merge(a, b, mask); } func fd12 (x) /* DOCUMENT fd12(x) * return Fermi-Dirac integral of order 1/2, * fd12(x) = integral[0 to inf]{ dt * t^0.5 / (exp(t-x)+1) } * accurate to about 1e-12 * SEE ALSO: fdm12, fd32, fd52, ifdm12, ifd12, ifd32, ifd52 */ { mask = x < 2.; list = where(mask); if (numberof(list)) { a = exp(x(list)); a = a*poly(a, 5.75834152995465e6, 1.30964880355883e7, 1.07608632249013e7, 3.93536421893014e6, 6.42493233715640e5, 4.16031909245777e4, 7.77238678539648e2, 1.0) / poly(a, 6.49759261942269e6, 1.70750501625775e7, 1.69288134856160e7, 7.95192647756086e6, 1.83167424554505e6, 1.95155948326832e5, 8.17922106644547e3, 9.02129136642157e1); } list = where(!mask); if (numberof(list)) { x = x(list); b = 1./(x*x); b = x*sqrt(x)*poly(b, 4.85378381173415e-14, 1.64429113030738e-11, 3.76794942277806e-9, 4.69233883900644e-7, 3.40679845803144e-5, 1.32212995937796e-3, 2.60768398973913e-2, 2.48653216266227e-1, 1.08037861921488e0, 1.91247528779676e0, 1.0) / poly(b, 7.28067571760518e-14, 2.45745452167585e-11, 5.62152894375277e-9, 6.96888634549649e-7, 5.02360015186394e-5, 1.92040136756592e-3, 3.66887808002874e-2, 3.24095226486468e-1, 1.16434871200131e0, 1.34981244060549e0, 2.01311836975930e-1, -2.14562434782759e-2); } return merge(a, b, mask); } func fd32 (x) /* DOCUMENT fd32(x) * return Fermi-Dirac integral of order 3/2, * fd32(x) = integral[0 to inf]{ dt * t^1.5 / (exp(t-x)+1) } * accurate to about 1e-12 * SEE ALSO: fdm12, fd12, fd52, ifdm12, ifd12, ifd32, ifd52 */ { mask = x < 2.; list = where(mask); if (numberof(list)) { a = exp(x(list)); a = a*poly(a, 4.32326386604283e4, 8.55472308218786e4, 5.95275291210962e4, 1.77294861572005e4, 2.21876607796460e3, 9.90562948053193e1, 1.0) / poly(a, 3.25218725353467e4, 7.01022511904373e4, 5.50859144223638e4, 1.95942074576400e4, 3.20803912586318e3, 2.20853967067789e2, 5.05580641737527e0, 1.99507945223266e-2); } list = where(!mask); if (numberof(list)) { x = x(list); b = 1./(x*x); b = sqrt(x)*poly(b, 2.80452693148553e-13, 8.60096863656367e-11, 1.62974620742993e-8, 1.63598843752050e-6, 9.12915407846722e-5, 2.62988766922117e-3, 3.85682997219346e-2, 2.78383256609605e-1, 9.02250179334496e-1, 1.0) / (b*poly(b, 7.01131732871184e-13, 2.10699282897576e-10, 3.94452010378723e-8, 3.84703231868724e-6, 2.04569943213216e-4, 5.31999109566385e-3, 6.39899717779153e-2, 3.14236143831882e-1, 4.70252591891375e-1, -2.15540156936373e-2, 2.34829436438087e-3)); } return merge(a, b, mask); } func fd52 (x) /* DOCUMENT fd52(x) * return Fermi-Dirac integral of order 5/2, * fd52(x) = integral[0 to inf]{ dt * t^2.5 / (exp(t-x)+1) } * accurate to about 1e-12 * SEE ALSO: fdm12, fd12, fd32, ifdm12, ifd12, ifd32, ifd52 */ { mask = x < 2.; list = where(mask); if (numberof(list)) { a = exp(x(list)); a = a*poly(a, 6.61606300631656e4, 1.20132462801652e5, 7.67255995316812e4, 2.10427138842443e4, 2.44325236813275e3, 1.02589947781696e2, 1.0) / poly(a, 1.99078071053871e4, 3.79076097261066e4, 2.60117136841197e4, 7.97584657659364e3, 1.10886130159658e3, 6.35483623268093e1, 1.16951072617142e0, 3.31482978240026e-3); } list = where(!mask); if (numberof(list)) { x = x(list); b = 1./(x*x); b = x*sqrt(x)*poly(b, 8.42667076131315e-12, 2.31618876821567e-9, 3.54323824923987e-7, 2.77981736000034e-5, 1.14008027400645e-3, 2.32779790773633e-2, 2.39564845938301e-1, 1.24415366126179e0, 3.18831203950106e0, 3.42040216997894e0, 1.0) / (b*poly(b, 2.94933476646033e-11, 7.68215783076936e-9, 1.12919616415947e-6, 8.09451165406274e-5, 2.81111224925648e-3, 3.99937801931919e-2, 2.27132567866839e-1, 5.31886045222680e-1, 3.70866321410385e-1, 2.27326643192516e-2)); } return merge(a, b, mask); } func ifdm12 (x) /* DOCUMENT ifdm12(y) * return x = inverse of Fermi-Dirac integral of order -1/2, * y = integral[0 to inf]{ dt * t^-0.5 / (exp(t-x)+1) } * accurate to about 1e-8 * SEE ALSO: ifd12, ifd32, ifd52, fdm12, fd12, fd32, fd52 */ { mask = x < 4.; list = where(mask); if (numberof(list)) { a = x(list); a = log(a*poly(a, -1.570044577033e4, 1.001958278442e4, -2.805343454951e3, 4.121170498099e2, -3.174780572961e1, 1.0) / poly(a, -2.782831558471e4, 2.886114034012e4, -1.274243093149e4, 3.063252215963e3, -4.225615045074e2, 3.168918168284e1, -1.008561571363e0)); } list = where(!mask); if (numberof(list)) { x = x(list); b = 1./(x*x); b = poly(b, 2.206779160034e-8, -1.437701234283e-6, 6.103116850636e-5, -1.169411057416e-3, 1.814141021608e-2, -9.588603457639e-2, 1.0) / (b*poly(b, 8.827116613576e-8, -5.750804196059e-6, 2.429627688357e-4, -4.601959491394e-3, 6.932122275919e-2, -3.217372489776e-1, 3.124344749296e0)); } return merge(a, b, mask); } func ifd12 (x) /* DOCUMENT ifd12(y) * return x = inverse of Fermi-Dirac integral of order 1/2, * y = integral[0 to inf]{ dt * t^0.5 / (exp(t-x)+1) } * accurate to about 1e-8 * SEE ALSO: ifdm12, ifd32, ifd52, fdm12, fd12, fd32, fd52 */ { mask = x < 4.; list = where(mask); if (numberof(list)) { a = x(list); a = log(a*poly(a, 1.999266880833e4, 5.702479099336e3, 6.610132843877e2, 3.818838129486e1, 1.0) / poly(a, 1.771804140488e4, -2.014785161019e3, 9.130355392717e1, -1.670718177489e0)); } list = where(!mask); if (numberof(list)) { x = x(list); b = x^(-2./3.); b = poly(b, -1.277060388085e-2, 7.187946804945e-2, -4.262314235106e-1, 4.997559426872e-1, -1.285579118012e0, -3.930805454272e-1, 1.0) / (b*poly(b, -9.745794806288e-3, 5.485432756838e-2, -3.299466243260e-1, 4.077841975923e-1, -1.145531476975e0, -6.067091689181e-2)); } return merge(a, b, mask); } func ifd32 (x) /* DOCUMENT ifd32(y) * return x = inverse of Fermi-Dirac integral of order 3/2, * y = integral[0 to inf]{ dt * t^1.5 / (exp(t-x)+1) } * accurate to about 1e-8 * SEE ALSO: ifdm12, ifd12, ifd52, fdm12, fd12, fd32, fd52 */ { mask = x < 4.; list = where(mask); if (numberof(list)) { a = x(list); a = log(a*poly(a, 1.715627994191e2, 1.125926232897e2, 2.056296753055e1, 1.0) / poly(a, 2.280653583157e2, 1.193456203021e2, 1.167743113540e1, -3.226808804038e-1, 3.519268762788e-3)); } list = where(!mask); if (numberof(list)) { x = x(list); b = x^(-0.4); b = poly(b, -6.321828169799e-3, -2.183147266896e-2, -1.057562799320e-1, -4.657944387545e-1, -5.951932864088e-1, 3.684471177100e-1, 1.0) / (b*poly(b, -4.381942605018e-3, -1.513236504100e-2, -7.850001283886e-2, -3.407561772612e-1, -5.074812565486e-1, -1.387107009074e-1)); } return merge(a, b, mask); } func ifd52 (x) /* DOCUMENT ifd52(y) * return x = inverse of Fermi-Dirac integral of order 5/2, * y = integral[0 to inf]{ dt * t^2.5 / (exp(t-x)+1) } * accurate to about 1e-8 * SEE ALSO: ifdm12, ifd12, ifd32, fdm12, fd12, fd32, fd52 */ { mask = x < 4.; list = where(mask); if (numberof(list)) { a = x(list); a = log(a*poly(a, 2.138969250409e2, 3.539903493971e1, 1.0) / poly(a, 7.108545512710e2, 9.873746988121e1, 1.067755522895e0, -1.182798726503e-2)); } list = where(!mask); if (numberof(list)) { x = x(list); b = x^(-2./7.); b = poly(b, -3.312041011227e-2, 1.315763372315e-1, -4.820942898296e-1, 5.099038074944e-1, 5.495613498630e-1, -1.498867562255e0, 1.0) / (b*poly(b, -2.315515517515e-2, 9.198776585252e-2, -3.835879295548e-1, 5.415026856351e-1, -3.847241692193e-1, 3.739781456585e-2, -3.008504449098e-2)); } return merge(a, b, mask); }