/* This file is part of Cloudy and is copyright (C)1978-2013 by Gary J. Ferland and
 * others.  For conditions of distribution and use see copyright notice in license.txt */
#include "cddefines.h"
#include "physconst.h" 
#include "iso.h"
#include "helike.h"
#include "taulines.h"

/*
  Energy order within 2 3P

  The order of the levels within the 2 3P level of atomic helium is opposite
  from the order within astrophysically abundant ions.  The indices below
  consistently point to the correct level, and the energies are correct,
  so the J levels within 2 3P are not in increasing energy order for helium itself. 
  This is ok since the atomic data is correct, and the difference in energies is so small.
*/

/* Ionization potentials (in wavenumber) for each ion in the iso-seq up to Z=30.
 * These are exactly what you get if you take EionRYD below and multiply by RYD_INF.	*/
static double EionWN[LIMELM] =       
	/* the first, or H-like, element is not defined for he-like species */
	{-DBL_MAX,
	198310.6679     ,610003.839889137,1241136.72201499,2091948.45665631,3162116.52584231,
	4452446.95015668,5962133.81875305,7692790.05069734,9645221.44709864,11814589.7994457,
	14209766.0528639,16822685.5022862,19661412.9625169,22717883.6187518,26000162.0663204,
	29508248.5246975,33234078.1790787,37185715.7345311,41363161.0813172,45766414.4389118,
	50395475.4781030,55258409.0136949,60339085.8550283,65653635.1927626,71202056.8074231,
	76976286.4328920,82984388.3352872,89194104.5722390,95726403.3055320};

/* Ionization potentials (in Rydbergs) for each ion in the iso-seq up to Z=30.	
 * These are exactly what you get if you take Verner's numbers in atmdat_ph1(0,1,nelem,0) 
 * and multiply by (0.9998787/EVRYD), exactly as is done elsewhere in Cloudy.	*/
static double EionRYD[LIMELM] =       
	/* the first, or H-like, element is not defined for he-like species */
	{-DBL_MAX,
	1.807387521,5.558764,11.310070,19.063237,28.815326,40.573682,54.330961,70.101861,
	87.893725,107.662464,129.488916,153.299590,179.167978,207.020588,236.930910,
	268.898946,302.851204,338.861175,376.928858,417.054255,459.237363,503.551674,
	549.850208,598.279945,648.840883,701.459535,756.209388,812.796486,872.323172};

/* experimental energies, in wavenumbers, for atomic helium */
#define NHE1LEVELS 111
/* These energies from Drake 1996, except these divided by c */
static double He1Energies[NHE1LEVELS] =
{0.0       , 159855.9734, 166277.4390, 169087.8298, 169086.8417, 169086.7652, 171134.8957,
183236.7908, 184864.8281, 185564.6657, 186101.5615, 186104.9656, 186209.3638, 190298.6619,
190940.6075, 191217.0826, 191444.4868, 191446.4547, 191451.8805, 191451.8964, 191492.7108,
193346.9900, 193663.5106, 193800.7280, 193917.1538, 193918.2888, 193921.1207, 193921.1298,
193921.6166, 193921.6209, 193942.4612, 194936.1184, 195114.8672, 195192.7542, 195260.0724,
195260.7694, 195262.4251, 195262.4307, 195262.7236, 195262.7261, 195262.7930, 195262.7947, 
195274.9074, 195868.2357, 195978.8938, 196027.3216, 196069.6730, 196070.1273, 196071.1763,
196071.1800, 196071.3686, 196071.3702, 196071.4141, 196071.4151, 196071.4283, 196071.4290,
196079.0865, 196461.3605, 196534.5628, 196566.7159, 196595.0620, 196595.3730, 196596.0785,
196596.0810, 196596.2092, 196596.2103, 196596.2404, 196596.2411, 196596.2503, 196596.2508,
196596.2541, 196596.2544, 196601.3992, 196861.9861, 196912.9014, 196935.3339, 196955.2261,
196955.4477, 196955.9445, 196955.9463, 196956.0373, 196956.0380, 196956.0595, 196956.0600,
196956.0666, 196956.0670, 196956.0693, 196956.0696, 196956.0705, 196956.0707, 196959.6917,
197145.2320, 197182.0643, 197198.3343, 197212.8252, 197212.9885, 197213.3513, 197213.3527,
197213.4194, 197213.4200, 197213.4358, 197213.4362, 197213.4411, 197213.4414, 197213.4431,
197213.4433, 197213.4440, 197213.4442, 197213.4445, 197213.4446, 197216.0885};
/* Last energy is 10^1P.	*/

/* >>chng 05 sep 06, RP - update energies of excited states */
#define NIONLEVELS 31
/* These energies are from CHIANTI 5, up to 5^1P 
 * -1 is flag to use quantum defect routines instead 
 * >>refer He-like	Energies	Landi et al., 2005; ApJSS, in press 
 * >>refer He-like	Energies	Dere, K. P. et al. 1997, 
 * >>refercon	 Astronomy and Astrophysics Suppl. Ser., Vol. 125, pp. 149-173 */
static double IonEnergies[LIMELM-2][NIONLEVELS] = 
{
/* ipLITHIUM=2; */
{0.00,	476034.98,	491374.60,	494266.57,	494261.17,	494263.44,	501808.59,
	554754.45,	558777.88,	559501.16,	561243.67,	561273.62,	561752.82,
	579981.33,	581596.77,	581886.34,	582613.64,	582630.95,	582642.97,
	582644.04,	582830.11,	591184.26,	591989.55,	592134.36,	592504.32,
	592514.43,	592520.11,	592521.11,	-1.00	,	-1.00	,	592634.91},
/* ipBERYLLIUM=3;*/
{0.00,	956502.00,	981178.00,	983366.00,	983355.00,	983370.00,	997454.00,
	1121184.00,	1127705.00,	1128300.00,	1131383.00,	1131462.00,	1132390.00,
	1175295.00,	1178005.00,	1178174.00,	1179451.00,	1179495.00,	1179515.00,
	1179514.00,	1179830.00,	1199650.00,	-1.00	,	1201060.00,	1201702.00,
	1201800.00,	1201730.00,	1201742.00,	-1.00	,	-1.00	,	1201894.00},
/* ipBORON=4;*/
{0.00,	1601545.00,	1635720.00,	1636938.00,	1636922.00,	1636975.00,	1657980.00,
	1882740.00,	1891790.00,	1892221.00,	1896710.00,	1896836.00,	1898063.00,
	1976420.00,	-1.00	,	1980291.11,	1982132.67,	1982220.00,	1982262.67,
	1982240.00,	1982762.00,	-1.00	,	-1.00	,	2020730.00,	2021700.00,
	-1.00	,	2021665.71,	2021760.00,	2021770.00,	2021770.00,	2022044.00},
/* ipCARBON=5;*/
{0.00,	2411262.00,	2455024.00,	2455162.74,	2455150.23,	2455286.01,	2483371.00,
	2839562.00,	2851180.00,	2851418.00,	2857309.67,	2857529.00,	2859375.00,
	2983541.00,	-1.00	,	2988359.00,	2990776.00,	2990923.00,	2990923.40,
	2990923.40,	2991710.00,	3048927.00,	-1.00	,	3051332.00,	3052589.00,
	3052656.00,	3052653.30,	3052653.30,	3052659.40,	3052659.40,	3053044.00},
/* ipNITROGEN=6;*/
{0.00,	3385890.00,	3439274.00,	3438312.46,	3438321.13,	3438612.15,	3473790.00,
	3991860.00,	-1.00	,	4006160.00,	4013460.00,	4013770.00,	4016390.00,
	4196800.00,	4202520.00,	4202620.00,	4205820.00,	4205830.00,	4205810.00,
	4205820.00,	4206810.00,	4290150.00,	4293020.00,	4293080.00,	4294570.00,
	4294670.00,	4294700.00,	4294700.00,	-1.00	,	-1.00	,	4296090.00},
/* ipOXYGEN=7;*/
{0.00,	4524640.00,	4588380.00,	4585620.76,	4585679.58,	4586231.19,	4629201.00,
	5338820.00,	5356420.00,	5355670.00,	5364422.67,	5365470.00,	5368550.00,
	5616340.00,	5623100.00,	5622600.00,	5626225.33,	5626670.00,	5626210.00,
	5626840.00,	5628100.00,	5742610.00,	-1.00	,	5745440.00,	5747509.33,
	5748230.00,	5747200.00,	5747820.00,	-1.00	,	-1.00	,	5748450.00},
/* ipFLUORINE=8;*/
{0.00,	5830040.00,	5903100.00,	5900600.00,	5900750.00,	5901700.00,	5949900.00,
	6885090.00,	6903270.00,	6902560.00,	6914073.33,	6915900.00,	6916590.00,
	7244270.00,	-1.00	,	7250390.00,	7255960.00,	7254240.00,	7256750.00,
	7257260.00,	7256370.00,	-1.00	,	-1.00	,	7410270.00,	7413940.00,
	7412290.00,	7414760.00,	7415300.00,	7414780.00,	-1.00	,	7414000.00},
/* ipNEON=9;*/
{0.00,	7299940.00,	7382680.00,	7378205.53,	7378506.43,	7380050.00,	7436560.00,
	8623000.00,	8644880.00,	8644744.44,	8657128.67,	8662400.00,	8660530.00,
	9075200.00,	9084060.00,	9084141.11,	9090355.33,	-1.00	,	9089800.00,
	9094400.00,	9090630.00,	9282200.00,	9286650.00,	9286713.33,	9288500.00,
	-1.00	,	9289800.00,	9294400.00,	-1.00	,	-1.00	,	9290000.00},
/* ipSODIUM=10;*/
{0.00,	8935337.00,	9027981.00,	9022354.10,	9022876.10,	9025284.70,	9088700.00,
	10558946.00,	10583431.00,	10583323.56,	10596783.40,	10597475.00,	10601080.00,
	11115065.00,	11124986.00,	11125102.78,	11130639.00,	11131017.00,	11131051.00,
	11131056.00,	11132393.00,	11369887.00,	11374868.00,	11374959.89,	11377767.00,
	11377984.00,	11377987.00,	11377991.00,	-1.00	,	-1.00	,	11378646.00},
/* ipMAGNESIUM=11;*/
{0.00,	10736136.00,	10838778.00,	10831985.83,	10832819.18,	10836391.13,	10906612.00,
	12691170.00,	12718304.00,	12718286.89,	12733392.33,	12734298.00,	12738006.00,
	13361991.00,	13372977.00,	13373168.22,	13379472.60,	13379830.00,	13379893.00,
	13379898.00,	13381265.00,	13669618.00,	13675137.00,	13675269.22,	13678467.13,
	13678680.00,	-1.00	,	-1.00	,	-1.00	,	-1.00	,	13679363.00},
/* ipALUMINIUM=12;*/
{0.00,	12703061.00,	12815760.00,	12807847.00,	12809088.00,	12814213.00,	12891081.00,
	15020463.00,	15050257.00,	15050434.00,	15067287.07,	15068371.00,	15072141.00,
	15816791.00,	15828851.00,	15829158.67,	15836125.13,	15836581.00,	-1.00	,
	-1.00	,	15838068.00,	16182216.00,	16188281.00,	16188471.33,	16192010.13,
	16192244.00,	-1.00	,	-1.00	,	-1.00	,	-1.00	,	16192975.00},
/* ipSILICON=13;*/
{0.00,	14835945.00,	14958753.00,	14949756.42,	14951532.63,	14958690.57,	15042040.00,
	17546734.00,	17579166.00,	17579686.44,	17598406.93,	17599605.00,	17603422.00,
	18479389.00,	18492532.00,	18493007.56,	18500821.00,	18501245.00,	-1.00	,
	-1.00	,	18502736.00,	18907613.00,	18914246.00,	18914502.78,	18918476.30,
	18918694.00,	-1.00	,	-1.00	,	-1.00	,	-1.00	,	18919421.00},
/* ipPHOSPHORUS=14;*/
{0.00,	17135768.00,	17268828.00,	17258746.00,	17261164.00,	17270908.00,	17360546.00,
	20271100.00,	20306284.00,	20307209.11,	20327865.87,	20329412.00,	20332952.00,
	21350958.00,	21365192.00,	21365892.89,	21374428.00,	21375044.00,	21375302.00,
	21375302.00,	21376454.00,	21846994.00,	21854144.00,	21854552.89,	21858894.80,
	21859210.00,	21859340.00,	21859340.00,	-1.00	,	-1.00	,	21859464.00},
/* ipSULPHUR=15;*/
{0.00,	19602076.00,	19745473.00,	19734297.61,	19737518.84,	19750576.04,	19846285.00,
	23193163.00,	23231087.00,	23232596.56,	23255347.53,	23257195.00,	23260416.00,
	24431101.00,	24446439.00,	24447429.78,	24456981.30,	24457576.00,	-1.00	,
	-1.00	,	24458842.00,	24999972.00,	25007605.00,	25008238.11,	25013102.40,
	25013407.00,	-1.00	,	-1.00	,	-1.00	,	-1.00	,	25014007.00},
/* ipCHLORINE=16;*/
{0.00,	22236180.00,	22390000.00,	22377820.00,	22381940.00,	22399100.00,	22500680.00,
	26314360.00,	26355050.00,	26357324.44,	26382328.67,	26384530.00,	26387270.00,
	27720900.00,	27738000.00,	27738966.67,	27749520.00,	27750400.00,	27757331.14,
	27757178.00,	27751600.00,	28367700.00,	28376500.00,	28376977.78,	28382286.67,
	28382800.00,	-1.00	,	-1.00	,	-1.00	,	-1.00	,	28383400.00},
/* ipARGON=17;*/
{0.00,	25038230.00,	25202480.00,	25189388.10,	25194588.99,	25216810.57,	25323950.00,
	29634850.00,	29678210.00,	29681541.11,	29713920.00,	29715070.00,	29713740.00,
	31221700.00,	31239280.00,	31241087.78,	-1.00	,	-1.00	,	-1.00	,
	-1.00	,	31254280.00,	31951370.00,	31960150.00,	31961182.22,	-1.00	,
	-1.00	,	-1.00	,	-1.00	,	-1.00	,	-1.00	,	31967860.00},
/* ipPOTASSIUM=18;*/
{0.00,	28004980.00,	28180480.00,	28165880.00,	28172670.00,	28200800.00,	28312910.00,
	33151930.00,	33198090.00,	33202622.22,	-1.00	,	-1.00	,	33237140.00,
	-1.00	,	34948420.00,	-1.00	,	-1.00	,	-1.00	,	-1.00	,
	-1.00	,	34964920.00,	35747360.00,	35756712.00,	35758032.00,	-1.00	,
	-1.00	,	-1.00	,	-1.00	,	-1.00	,	-1.00	,	35765192.00},
/* ipCALCIUM=19;*/
{0.00,	31142150.00,	31328450.00,	31312818.51,	31320486.08,	31356326.72,	31473810.00,
	36870940.00,	36919930.00,	36925900.00,	-1.00	,	-1.00	,	36962850.00,
	38850670.00,	38870530.00,	38873536.67,	-1.00	,	-1.00	,	-1.00	,
	-1.00	,	38888680.00,	39761380.00,	39771310.00,	39772968.89,	-1.00	,
	-1.00	,	-1.00	,	-1.00	,	-1.00	,	-1.00	,	39780630.00},
/* ipSCANDIUM=20;*/
{0.00,	34448120.00,	34645360.00,	34628770.00,	34638550.00,	34682810.00,	34805000.00,
	40790620.00,	40842480.00,	40850158.89,	-1.00	,	-1.00	,	40889690.00,
	42983370.00,	43004390.00,	43008165.56,	-1.00	,	-1.00	,	-1.00	,
	-1.00	,	43024380.00,	43992240.00,	44002740.00,	44004803.33,	-1.00	,
	-1.00	,	-1.00	,	-1.00	,	-1.00	,	-1.00	,	44013010.00},
/* ipTITANIUM=21;*/
{0.00,	37923880.00,	38131640.00,	38114760.00,	38125260.00,	38180620.00,	38308340.00,
	44911910.00,	44966970.00,	44976472.22,	45016028.67,	45021140.00,	45018670.00,
	47328500.00,	47351600.00,	47355644.44,	47372326.67,	47374500.00,	-1.00	,
	-1.00	,	47373500.00,	48440800.00,	48452600.00,	48454581.11,	-1.00	,
	-1.00	,	-1.00	,	-1.00	,	-1.00	,	-1.00	,	48463700.00},
/* ipVANADIUM=22;*/
{0.00,	41568880.00,	41787830.00,	41770130.00,	41782100.00,	41849950.00,	41982380.00,
	49234710.00,	49292760.00,	49304574.44,	49347922.67,	49353910.00,	49349740.00,
	51886600.00,	51910900.00,	51915955.56,	51934113.33,	51936800.00,	-1.00	,
	-1.00	,	51935100.00,	53107300.00,	53119700.00,	53122217.78,	-1.00	,
	-1.00	,	-1.00	,	-1.00	,	-1.00	,	-1.00	,	53132000.00},
/* ipCHROMIUM=23;*/
{0.00,	45384110.00,	45614410.00,	45595910.00,	45609360.00,	45691820.00,	45828830.00,
	53760100.00,	53821190.00,	53835660.00,	53883181.33,	53890160.00,	53884060.00,
	56658500.00,	56684100.00,	56690288.89,	56710306.67,	56713200.00,	-1.00	,
	-1.00	,	56710700.00,	57992700.00,	58005800.00,	58008904.44,	-1.00	,
	-1.00	,	-1.00	,	-1.00	,	-1.00	,	-1.00	,	58019400.00},
/* ipMANGANESE=24;*/
{0.00,	49370240.00,	49612040.00,	49592800.00,	49607700.00,	49707130.00,	49848620.00,
	58488800.00,	58553000.00,	58570522.22,	58622620.00,	58630700.00,	58622500.00,
	61644700.00,	61671800.00,	61679233.33,	61701013.33,	61704700.00,	-1.00	,
	-1.00	,	61701200.00,	63097900.00,	63111600.00,	63115327.78,	-1.00	,
	-1.00	,	-1.00	,	-1.00	,	-1.00	,	-1.00	,	63126600.00},
/* ipIRON=25;*/
{0.00,	53527760.00,	53781230.00,	53761280.00,	53777570.00,	53896550.00,	54042490.00,
	63421700.00,	63489000.00,	63509966.67,	63567120.00,	63576500.00,	63565800.00,
	66846900.00,	66875000.00,	66884011.11,	66908120.00,	66912100.00,	-1.00	,
	-1.00	,	66907600.00,	68423800.00,	68438100.00,	68442730.00,	-1.00	,
	-1.00	,	-1.00	,	-1.00	,	-1.00	,	-1.00	,	68454800.00},
/* ipCOBALT=26;*/
{0.00,	57857380.00,	58122700.00,	58102090.00,	58119680.00,	58261180.00,	58411430.00,
	68560000.00,	68630600.00,	68655444.44,	68718160.00,	68728900.00,	68715500.00,
	72266000.00,	72295500.00,	72306144.44,	72332586.67,	72337100.00,	-1.00	,
	-1.00	,	72331500.00,	73972000.00,	73987000.00,	73992318.89,	-1.00	,
	-1.00	,	-1.00	,	-1.00	,	-1.00	,	-1.00	,	74005400.00},
/* ipNICKEL=27;*/
{0.00,	62358960.00,	62637200.00,	62615022.80,	62633778.00,	62800884.44,	62952670.00,
	73903340.00,	73976370.00,	74005924.44,	-1.00	,	-1.00	,	74070580.00,
	77900890.00,	77930480.00,	77943808.89,	-1.00	,	-1.00	,	-1.00	,
	-1.00	,	77970500.00,	79740940.00,	79755710.00,	79762730.00,	-1.00	,
	-1.00	,	-1.00	,	-1.00	,	-1.00	,	-1.00	,	79776290.00},
/* ipCOPPER=28;*/
{0.00,	67035380.00,	67324970.00,	67303150.00,	67322950.00,	67519170.00,	67678080.00,
	79453200.00,	79530300.00,	79564500.00,	79640046.67,	79654200.00,	79634300.00,
	83754400.00,	83786500.00,	83801155.56,	83832993.33,	83838900.00,	-1.00	,
	-1.00	,	83830600.00,	85734300.00,	85750700.00,	85759175.00,	-1.00	,
	-1.00	,	-1.00	,	-1.00	,	-1.00	,	-1.00	,	85773200.00},
/* ipZINC=29;*/
{0.00,	71886300.00,	72188400.00,	72166200.00,	72186600.00,	72415600.00,	72579000.00,
	85212700.00,	85293200.00,	85332955.56,	85415826.67,	85431900.00,	85408300.00,
	89828600.00,	89862000.00,	89879022.22,	89913666.67,	89920800.00,	-1.00	,
	-1.00	,	89910900.00,	91953400.00,	91970500.00,	91979222.22,	91995073.33,
	92000500.00,	-1.00	,	-1.00	,	-1.00	,	-1.00	,	91994500.00}};

/* helike_quantum_defect - calculate quantum defect for a given level and nuclear charge. */
double helike_quantum_defect( long int nelem, long int ipLo )  
{  
	/* The quantum defect, and parameters a,b, and c	*/
	double qd,a,b,c;	

	/* These are values of quantum defects of Helium levels at n=10. 
	 * First dimension is spin, second is angular momentum.  
	 * The defects are assumed to be constant for all n>10 and
	 * equal to these values. */
	double HeDefectAsymptotes[2][10] = {
		{1.40005E-01,-1.20673E-02,2.08056E-03,4.21484E-04,1.14868E-04,
			4.08648E-05,1.73548E-05,8.33891E-06,4.39680E-06,2.42075E-06},
		{2.97063E-01,6.81567E-02,2.82381E-03,4.27703E-04,1.17319E-04,
			4.25254E-05,1.85549E-05,9.24641E-06,5.30882E-06,3.02877E-06}
	};

	/* Parameters for fits to quantum defects for	*/
	/* P triplet and S orbitals. The dimensions are	*/
	/*	first: l									*/
	/*	second: n									*/
	/* 	third: parameters a,b,and c.				*/
	double param[3][4][3]=  
	{ 
		{{0.6451941,0.3119437,-1.2722842},		/* ^3S	*/
			{0.7664874,0.3455675,-1.3976462}, 
			{0.8247101,0.3603131,-1.4520500}, 
			{0.8878402,0.3714450,-1.4995732}}, 

		{{1.4203514,0.5311096,-2.6728087},		/* ^1S	*/
			{1.5733513,0.5997339,-2.9253834}, 
			{1.4531025,0.5924751,-2.8662756}, 
			{1.6038999,0.6342552,-3.0298071}}, 

		{{-2.2323488,0.0890840,-0.5166053},		/* ^3P	*/
			{-2.0463691,0.1222081,-0.6672983}, 
			{-1.9904104,0.1328918,-0.7150879}, 
			{-1.9500974,0.1452111,-0.7649031}} 
	};   

	/* Because they cannot be fit to a funtion of the same form as the other orbitals,
	 * the P singlets are fit to a different function, with these parameters and dimensions */
	/*	first: n									*/
	/*	second: parameters a and b.					*/
	double P1[4][2]=
	{
		{-56.65245,-3.661923},
		{-52.03411,-4.941075},
		{-50.43744,-5.525750},
		{-49.45137,-5.908615}
	};

	long int n = iso_sp[ipHE_LIKE][nelem].st[ipLo].n();
	long int lqn = iso_sp[ipHE_LIKE][nelem].st[ipLo].l();
	long int S = iso_sp[ipHE_LIKE][nelem].st[ipLo].S();
	long int s;

	if( S==1 )
		s = 0;
	else if( S==3 )
		s = 1;
	else if( S < 0 )
	{
		ASSERT( n > iso_sp[ipHE_LIKE][nelem].n_HighestResolved_max );
		s = S;
	}
	else
		TotalInsanity();

	DEBUG_ENTRY( "helike_quantum_defect()" );

	ASSERT(n >= 1L);
	ASSERT(lqn >= 0 || n > iso_sp[ipHE_LIKE][nelem].n_HighestResolved_max);
	ASSERT(n > lqn);
	/* Only Helium and up, and only those turned on.	*/
	ASSERT((nelem >= ipHELIUM) && (nelem < LIMELM));       

	if( n > iso_sp[ipHE_LIKE][nelem].n_HighestResolved_max )
	{
		/* collapsed levels are assumed to have zero quantum defect. */
		qd = 0.;
	}
	else if( nelem == ipHELIUM )
	{
		if( ipLo<NHE1LEVELS && n<=iso_sp[ipHE_LIKE][nelem].n_HighestResolved_max )
		{
			/* defects are calculated from theoretical energies. */
			qd = n-sqrt(0.999862926*RYD_INF/(EionWN[ipHELIUM] - He1Energies[ipLo]));
		} 
		else if( lqn<=9 )
		{
			ASSERT( s >= 0 && lqn >= 0 );
			/* defects are set equal to the values at n=10. */
			qd = HeDefectAsymptotes[s][lqn];
		}
		else if( s == 0 )
		{
			/* a simple fit for singlet high-l defects. */
			qd = 0.0497*pow((double)lqn, -4.4303);
		}
		else
		{
			/* a simple fit for triplet high-l defects. */
			qd = 0.0656*pow((double)lqn, -4.5606);
		}
	}
	else if( ipLo == ipHe1s1S )
	{
		/* Quantum defects for ground state are found from the rydberg
		 * equation, and the ionization potential of the ion.	
		 * the lint needs to see assert and not ASSERT */
		ASSERT(nelem>ipHYDROGEN && nelem<LIMELM );
		qd = 1.0 - nelem * sqrt(1/EionRYD[nelem]);
	}
	else
	{
		/* For levels with n > 5, the quantum defect	*/
		/* is approximately the same as if n equaled 5.	*/
		if( n > 5L )
		{
			n = 5L;
		}
		/* For P singlets	*/
		if( lqn==1L && s==0L )
		{
			qd = 1./(P1[n-2][0] + P1[n-2][1] * (nelem+1) * log((double)nelem+1.) );
		}
		/* Defects for orbitals with l>2 are approximately equal to zero.	*/
		else if( lqn < 2L )
		{
			a = param[2*(lqn+1)-s-1][n-2][0];  
			b = param[2*(lqn+1)-s-1][n-2][1];  
			c = param[2*(lqn+1)-s-1][n-2][2];  
			qd = exp((a+c*(nelem+1))/(1.0+b*(nelem+1)));  
		}
		/* This fit is a simplification of table 11.9 from 
		 * >>refer Helike	defects	Drake, G.W.F., editor.  Atomic, Molecular & Optical Physics Handbook.
		 * >>refercon	Chapter 11, "High Precision Calculations for Helium", G.W.F. Drake. 
		 * >>refercon	AIP Press: Woodbury, New York, 1996
		 * This will give quasi-real energies for all transitions, allowing a reasonable
		 * determination of which decays are zeroed due to being below the plasma frequency.
		 * The 1/nelem dependence is arbitray.  	*/
		else
		{
			ASSERT( lqn >= 2L );
			qd = ( ( 0.0612/(double)nelem ) / pow((double)lqn, 4.44) );
		}
	} 
	return qd;
}

/*helike_energy calculates energy of a given level.	*/
double helike_energy(long int nelem, long int ipLev )
{
	double Ef, Eff_n;
	long ipISO=ipHE_LIKE;

	DEBUG_ENTRY( "helike_energy()" );

	if( N_(ipLev) > iso_sp[ipISO][nelem].n_HighestResolved_max )
	{
		/* \todo	2	make this number a constant in physconst.h */
		/* The first term is the ratio of the helium finite mass rydberg
		 * to the infinite mass rydberg. */
		Ef = 0.999862926* RYD_INF * POW2((double)nelem/(double)N_(ipLev));  
	}
	else if( nelem==ipHELIUM && ipLev<NHE1LEVELS )
	{
		/* for atomic helium use experimental energies */
		Ef = EionWN[ipHELIUM] - He1Energies[ipLev];
	} 
	else if( nelem > ipHELIUM && nelem <= ipZINC &&
		ipLev < NIONLEVELS && IonEnergies[nelem-2][ipLev] >= 0. )
	{
		Ef = EionWN[nelem] - IonEnergies[nelem-2][ipLev];
	}
	else 
	{
		Eff_n = N_(ipLev) - helike_quantum_defect( nelem, ipLev );
		/* quantum defect can only be negative for singlet P */
		ASSERT( ( L_(ipLev)==1 && S_(ipLev)==1 ) || ( N_(ipLev) - Eff_n >= 0. ) );

		/* energies (in wavenumbers) that correspond to quantum defect */
		Ef = 0.999862926 * RYD_INF * POW2((double)nelem/Eff_n);
		Ef = 0.999862926 * RYD_INF * (nelem/Eff_n) * (nelem/Eff_n);  
	}

	ASSERT(Ef > 0.);

	return Ef;
}

