Changeset 2440 for branches/newmole

Show
Ignore:
Timestamp:
11/04/08 14:25:16 (2 months ago)
Author:
rjrw
Message:

Merged from trunk r2405:2439.

Location:
branches/newmole
Files:
29 modified
1 copied

Legend:

Unmodified
Added
Removed
  • branches/newmole/source/atmdat_readin.cpp

    r2406 r2440  
    10501050        } 
    10511051 
    1052         nUTA = UTALines.size(); 
     1052        nUTA = (long)UTALines.size(); 
    10531053 
    10541054        /* option to dump UTA lines */ 
     
    16401640                        UTA.back().Hi->IonStg = ion+1; 
    16411641 
    1642                         UTA.back().Hi->g = level[ind_hi].g; 
    1643                         UTA.back().Lo->g = level[ind_lo].g; 
     1642                        UTA.back().Hi->g = (realnum)level[ind_hi].g; 
     1643                        UTA.back().Lo->g = (realnum)level[ind_lo].g; 
    16441644 
    16451645                        double WavNum = edif*RYD_INF; 
     
    16591659                        /* Badnell gives UPWARD transition rate Alu, an unusual notation, 
    16601660                         * convert it here to the normal downward transition rate Aul */ 
    1661                         UTA.back().Emis->Aul = Bij*UTA.back().Lo->g/UTA.back().Hi->g; 
     1661                        UTA.back().Emis->Aul = (realnum)(Bij*UTA.back().Lo->g/UTA.back().Hi->g); 
    16621662                        UTA.back().Emis->gf = 
    16631663                                (realnum)GetGF( UTA.back().Emis->Aul, UTA.back().EnergyWN, UTA.back().Hi->g ); 
  • branches/newmole/source/atoms.h

    r1739 r2440  
    44#ifndef _ATOMS_H_ 
    55#define _ATOMS_H_ 
    6  
    76 
    87 /** 
     
    219218 
    220219/** number of levels in OI atom */ 
    221 #define N_OI_LEVELS     6 
     220const int N_OI_LEVELS = 6; 
     221const long LIMLEVELN = 20L; 
    222222 
    223223EXTERN struct t_atoms { 
     
    240240        /** populations from OI fluorescense problem */ 
    241241        realnum popoi[N_OI_LEVELS]; 
    242  
    243         double pmph31, 
    244                 esch31; 
    245242 
    246243        realnum pmpo51,  
     
    252249                popmg2; 
    253250 
    254 #define LIMLEVELN       20L 
    255251        /** 
    256252         * this stores most recently evaluated level populations 
  • branches/newmole/source/atom_feii.cpp

    r2406 r2440  
    15841584                                /*RT_line_one do rt for emission line structure -  
    15851585                                 * calls RT_line_static or RT_line_wind */ 
    1586                                 RT_line_one( &Fe2LevN[ipHi][ipLo] , lgDoEsc , lgUpdateFineOpac,true); 
     1586                                RT_line_one( &Fe2LevN[ipHi][ipLo], lgDoEsc, lgUpdateFineOpac, true, 0.f, 1.f ); 
    15871587                        } 
    15881588                } 
  • branches/newmole/source/atom_oi.cpp

    r2139 r2440  
    1818/*oi_level_pops get OI level population with Ly-beta pumping */ 
    1919STATIC void oi_level_pops(double abundoi,  
    20   double *coloi); 
     20                          double *coloi); 
    2121 
    2222/*atom_oi drive the solution of OI level populations, Ly-beta pumping */ 
    2323void atom_oi_calc(double *coloi) 
    2424{ 
    25         long int i; 
    26         double esin,  
     25        double esab, 
    2726          eslb,  
    2827          esoi,  
     
    3130          opaclb,  
    3231          opacoi,  
    33           tin,  
    34           tout,  
    3532          xlb,  
    3633          xoi; 
    37         static double esab; 
    38         static double aoi = TauLines[ipTO1025].Emis->Aul; 
    39         static double alb = Transitions[ipH_LIKE][ipHYDROGEN][ipH3p][ipH1s].Emis->Aul; 
     34        double aoi = TauLines[ipTO1025].Emis->Aul; 
     35        double alb = Transitions[ipH_LIKE][ipHYDROGEN][ipH3p][ipH1s].Emis->Aul; 
    4036 
    4137        DEBUG_ENTRY( "atom_oi_calc()" ); 
    4238 
     39        fixit(); 
     40        // The code below should be calculating the O I 1025 pumping by H Ly beta, as well as 
     41        // the inverse process (this can become important in hydrogen-deficient environments). 
     42        // It now uses the Elitzur & Netzer (1985, ApJ, 291, 464) theory, which is no longer 
     43        // valid since the line overlap code prevents us from getting at the escape probability 
     44        // of individual lines. 
     45 
    4346        /* A's from Pradhan; OI pump line; Ly beta, 8446 */ 
    44  
    45         /* Notation; 
    46          * PMPH31 net rate hydrogen level 3 depopulated to 1 
    47          * PMPO15 and PMPO51 are similar, but for oxygen 
    48          * ESCH31 is emission in 1025 transition */ 
    4947 
    5048        /* called by LINES before calc really start, protect here 
     
    5250        if( dense.xIonDense[ipOXYGEN][0] <= 0. ) 
    5351        { 
    54                 for( i=0; i < 6; i++ ) 
     52                for( int i=0; i < 6; i++ ) 
    5553                { 
    5654                        atoms.popoi[i] = 0.; 
    5755                } 
    58                 /* return zero */ 
    5956                *coloi = 0.; 
    6057                atoms.pmpo15 = 0.; 
    6158                atoms.pmpo51 = 0.; 
    62                 atoms.pmph31 = Transitions[ipH_LIKE][ipHYDROGEN][ipH3p][ipH1s].Emis->Aul* 
    63                         (Transitions[ipH_LIKE][ipHYDROGEN][ipH3p][ipH1s].Emis->Pesc + 
    64                   Transitions[ipH_LIKE][ipHYDROGEN][ipH3p][ipH1s].Emis->Pelec_esc); 
    65  
    66                 atoms.esch31 = Transitions[ipH_LIKE][ipHYDROGEN][ipH3p][ipH1s].Emis->Aul* 
    67                         (Transitions[ipH_LIKE][ipHYDROGEN][ipH3p][ipH1s].Emis->Pesc + 
    68                         Transitions[ipH_LIKE][ipHYDROGEN][ipH3p][ipH1s].Emis->Pelec_esc); 
    69  
    70                 /* all trace output turned on with "trace ly beta command' */ 
    71                 if( trace.lgTr8446 && trace.lgTrace ) 
    72                 { 
    73                         fprintf( ioQQQ,  
    74                                 "       P8446 called for first time, finds A*escape prob 3-1 =%10.2e\n",  
    75                           atoms.esch31 ); 
    76                 } 
    7759                return; 
    7860        } 
    7961 
    80         if( iteration > 1 ) 
    81         { 
    82                 /* two sided escape prob */ 
    83                 tin = TauLines[ipTO1025].Emis->TauIn; 
    84                 esin = esc_CRDwing_1side(tin,1e-4); 
    85                 tout = (TauLines[ipTO1025].Emis->TauTot)*0.9 -  
    86                   TauLines[ipTO1025].Emis->TauIn; 
    87  
    88                 if( trace.lgTr8446 && trace.lgTrace ) 
    89                 { 
    90                         fprintf( ioQQQ, "       P8446 tin, tout=%10.2e%10.2e\n", tin, tout ); 
    91                 } 
    92  
    93                 if( tout > 0. ) 
    94                 { 
    95                         tout = TauLines[ipTO1025].Emis->TauTot - TauLines[ipTO1025].Emis->TauIn; 
    96  
    97                         /* do not update esab if we overran optical depth scale */ 
    98                         esab = 0.5*(esin + esc_CRDwing_1side(tout,1e-4)); 
    99                 } 
    100         } 
    101         else 
    102         { 
    103                 /* one-sided escape probability */ 
    104                 esab = esc_CRDwing_1side(TauLines[ipTO1025].Emis->TauIn,1e-4); 
    105         } 
    106  
    107         esoi =TauLines[ipTO1025].Emis->Pelec_esc + TauLines[ipTO1025].Emis->Pesc; 
    108         eslb =Transitions[ipH_LIKE][ipHYDROGEN][ipH3p][ipH1s].Emis->Pelec_esc +  
     62        // line overlap code makes this the escape probability of the combined lines 
     63        esab = TauLines[ipTO1025].Emis->Pelec_esc + TauLines[ipTO1025].Emis->Pesc; 
     64 
     65        // these two are no longer correct, the line overlap code makes it impossible 
     66        // to get at the escape probabilities of the individual lines... 
     67        esoi = TauLines[ipTO1025].Emis->Pelec_esc + TauLines[ipTO1025].Emis->Pesc; 
     68        eslb = Transitions[ipH_LIKE][ipHYDROGEN][ipH3p][ipH1s].Emis->Pelec_esc +  
    10969                Transitions[ipH_LIKE][ipHYDROGEN][ipH3p][ipH1s].Emis->Pesc; 
    11070 
     
    11878 
    11979        /* find relative opacities for two lines */ 
    120         opacoi = 2.92e-9*dense.xIonDense[ipOXYGEN][0]*0.5556/DoppVel.doppler[7]; 
    121         opaclb = 1.22e-8*dense.xIonDense[ipHYDROGEN][1]*StatesElem[ipH_LIKE][ipHYDROGEN][ipH1s].Pop/DoppVel.doppler[0]; 
     80        opacoi = 2.92e-9*dense.xIonDense[ipOXYGEN][0]*0.5556/DoppVel.doppler[ipOXYGEN]; 
     81        opaclb = 1.22e-8*dense.xIonDense[ipHYDROGEN][1]*StatesElem[ipH_LIKE][ipHYDROGEN][ipH1s].Pop/DoppVel.doppler[ipHYDROGEN]; 
    12282 
    12383        /* these are x sub a (OI) and x sub b (ly beta) defined in Elitz+Netz */ 
     
    12888        foi = MIN2(DoppVel.doppler[ipHYDROGEN],DoppVel.doppler[ipOXYGEN])/DoppVel.doppler[ipOXYGEN]; 
    12989        flb = MIN2(DoppVel.doppler[ipHYDROGEN],DoppVel.doppler[ipOXYGEN])/DoppVel.doppler[ipHYDROGEN]* 
    130           MAX2(0.,1.- TauLines[ipTO1025].Emis->Pelec_esc - TauLines[ipTO1025].Emis->Pesc); 
     90                MAX2(0.,1.- TauLines[ipTO1025].Emis->Pelec_esc - TauLines[ipTO1025].Emis->Pesc); 
    13191 
    13292        if( trace.lgTr8446 && trace.lgTrace ) 
     
    13999        /* pumping of OI by L-beta - this goes into OI matrix as 1-5 rate 
    140100         * lgInducProcess set false with no induced command, usually true */ 
     101        /* Notation: pmpo15 net rate oxygen level 5 populated from 1 */ 
    141102        if( rfield.lgInducProcess ) 
    142103        { 
    143                 atoms.pmpo15 = (realnum)(flb*alb*(StatesElem[ipH_LIKE][ipHYDROGEN][ipH3p].Pop*dense.xIonDense[ipHYDROGEN][1])*xoi*(1. - esab)/ 
    144                   dense.xIonDense[ipOXYGEN][0]); 
     104                atoms.pmpo15 = (realnum)(flb*alb*dense.xIonDense[ipHYDROGEN][1]* 
     105                                         StatesElem[ipH_LIKE][ipHYDROGEN][ipH3p].Pop* 
     106                                         xoi*(1. - esab)/dense.xIonDense[ipOXYGEN][0]); 
    145107                /* net decay rate from upper level */ 
    146                 atoms.pmpo51 = (realnum)(aoi*(1. - (1. - foi)*(1. - esoi) - xoi*(1. -  
    147                   esab)*foi)); 
     108                atoms.pmpo51 = (realnum)(aoi*(1. - (1. - foi)*(1. - esoi) - xoi*(1. - esab)*foi)); 
    148109        } 
    149110        else 
     
    155116        /* find level populations for OI */ 
    156117        oi_level_pops(dense.xIonDense[ipOXYGEN][0],coloi); 
    157  
    158         /* escape term from n=3 of H; followed by pump term to n=3 */ 
    159         /** \todo 2 this is not used, should it be? */ 
    160         //atoms.pmph31 = alb*(1. - (1. - flb)*(1. - eslb) - xlb*(1. - esab)*flb); 
    161  
    162         /*pmph13 = xlb*(1. - esab)*foi*aoi*atoms.popoi[4];*/ 
    163         atoms.pmph31 = Transitions[ipH_LIKE][ipHYDROGEN][ipH3p][ipH1s].Emis->Aul* 
    164                 (Transitions[ipH_LIKE][ipHYDROGEN][ipH3p][ipH1s].Emis->Pelec_esc + Transitions[ipH_LIKE][ipHYDROGEN][ipH3p][ipH1s].Emis->Pesc); 
    165  
    166         /* following is actual emission rate, used to predict Ly-beta in lines.for */ 
    167         atoms.esch31 = alb*(eslb*(1. - flb) + esab*flb); 
    168  
    169         /* all trace output turned on with "trace ly beta command' */ 
    170         if( trace.lgTr8446 && trace.lgTrace ) 
    171         { 
    172                 fprintf( ioQQQ, "       P8446 PMPH31=%10.2e EscP3-1%10.2e ESCH31=%10.2e\n",  
    173                   atoms.pmph31, atoms.pmph31/alb, atoms.esch31/alb ); 
    174         } 
    175118 
    176119        /* continuum pumping due to J=1, 0 sub states. 
     
    220163/*oi_level_pops get OI level population with Ly-beta pumping */ 
    221164STATIC void oi_level_pops(double abundoi,  
    222   double *coloi) 
     165                          double *coloi) 
    223166{ 
    224167        bool lgNegPop; 
  • branches/newmole/source/cddefines.h

    r2406 r2440  
    15591559} 
    15601560 
     1561/**get_ptr attribute shim to get raw pointer to contained data with 
     1562 * correct type */ 
     1563template<class T> inline T* get_ptr(valarray<T> &v) 
     1564{ 
     1565        return &v[0]; 
     1566} 
     1567template<class T> inline T* get_ptr(vector<T> &v) 
     1568{ 
     1569  return &v[0]; 
     1570} 
     1571template<class T> inline const T* get_ptr(const valarray<T> &v) 
     1572{ 
     1573        return const_cast<const T*>(&const_cast<valarray<T>&>(v)[0]); 
     1574} 
     1575template<class T> inline const T* get_ptr(const vector<T> &v) 
     1576{        
     1577  return const_cast<const T*>(&const_cast<vector<T>&>(v)[0]); 
     1578} 
     1579 
     1580 
    15611581/************************************************************************** 
    15621582 * 
  • branches/newmole/source/conv_base.cpp

    r2406 r2440  
    629629                                                         * activate.  when it passes rm this block and  
    630630                                                         * change err_tol in following block to a small number */ 
    631                                         if(0 & conv.lgConvIoniz &&  
     631                                        if( 0 && conv.lgConvIoniz &&  
    632632                                                iso.pop_ion_ov_neut[ipISO][nelem] > 1e-15 && 
    633633                                                dense.xIonDense[nelem][nelem+1-ipISO]>SMALLFLOAT && 
  • branches/newmole/source/date.h

    r2406 r2440  
    1616#define MONTH   9 
    1717/* day is correct */ 
    18 #define DAY     9 
     18#define DAY     26 
    1919 
    2020#endif /* _DATE_H_ */ 
  • branches/newmole/source/dynamics.cpp

    r2346 r2440  
    16551655        dynamics.lgRecom = false; 
    16561656 
     1657        /* don't force populations to equilibrium levels */ 
     1658        dynamics.lgEquilibrium = false; 
     1659 
    16571660        /* set true if time dependent calculation is finished */ 
    16581661        dynamics.lgStatic_completed = false; 
  • branches/newmole/source/dynamics.h

    r2346 r2440  
    165165        realnum dDensityDT; 
    166166 
     167        /** Enforce equilibrium populations */ 
     168        bool lgEquilibrium; 
    167169 
    168170        /* set true with trace option on time command */ 
  • branches/newmole/source/ion_solver.cpp

    r2112 r2440  
    376376 
    377377        /* chng 03 jan 13 rjrw, add in dynamics if required here, 
    378          * last test - only do advection if we have not overrun the radius scale */ 
    379         if( dynamics.lgAdvection && iteration > dynamics.n_initial_relax+1  
     378         * - only do advection if we have not overrun the radius scale */ 
     379        if( iteration > dynamics.n_initial_relax+1 && dynamics.lgAdvection && !dynamics.lgEquilibrium 
    380380                /*&& radius.depth < dynamics.oldFullDepth*/ ) 
    381381        { 
  • branches/newmole/source/iso_level.cpp

    r2346 r2440  
    328328                /* >>chng 02 Sep 06 rjrw -- all elements have these terms */ 
    329329                /*>>>chng 02 oct 01, only include if lgAdvection is set */ 
    330                 if( dynamics.lgAdvection && dynamics.lgISO[ipISO]) 
     330                if( dynamics.lgAdvection && !dynamics.lgEquilibrium && dynamics.lgISO[ipISO]) 
    331331                { 
    332332                        /* add in advection - these terms normally zero */ 
  • branches/newmole/source/lines_service.cpp

    r2406 r2440  
    2323/*EmLineZero set all elements of transition struc to zero */ 
    2424/*LineConvRate2CS convert down coll rate back into electron cs in case other parts of code need this for reference */ 
    25 /*lgTauGood returns true is we have not overrun optical depth scale */ 
    2625/*OccupationNumberLine - derive the photon occupation number at line center for any line */ 
    2726/*outline - adds line photons to reflin and outlin */ 
     
    11541153} 
    11551154 
    1156 /* returns true is we have not overrun optical depth scale */ 
    1157 bool lgTauGood( transition * t) 
    1158 { 
    1159         bool lgGoodTau; 
    1160  
    1161         DEBUG_ENTRY( "lgTauGood()" ); 
    1162  
    1163         if( (t->Emis->TauTot*0.9 - t->Emis->TauIn < 0. && t->Emis->TauIn > 0.) &&  
    1164             ! fp_equal( t->Emis->TauTot, opac.taumin ) ) 
    1165         { 
    1166                 /* do not do anything if we have overrun the scale, */ 
    1167                 lgGoodTau = false; 
    1168         } 
    1169         else 
    1170         { 
    1171                 lgGoodTau = true; 
    1172         } 
    1173         return lgGoodTau; 
    1174 } 
    1175  
    11761155/*gbar0 compute g-bar gaunt factor for neutrals */ 
    11771156STATIC void gbar0(double ex,  
  • branches/newmole/source/lines_service.h

    r1739 r2440  
    220220\param *t 
    221221*/ 
    222 bool lgTauGood( transition * t); 
     222inline bool lgTauGood( transition* t ) 
     223{ 
     224        return ( iteration == 1 || t->Emis->TauIn <= 0. || t->Emis->TauTot*0.9 - t->Emis->TauIn >= 0. ); 
     225} 
    223226 
    224227/**MakeCS compute collision strength by g-bar approximations  
  • branches/newmole/source/mole_h2.cpp

    r2346 r2440  
    663663                                                                 * variation in the line pumping rate, which made H2 abundance fluctuate due to 
    664664                                                                 * Solomon process having slight dr-caused mole. */ 
    665                                                                 RT_line_one( &H2Lines[iElecHi][iVibHi][iRotHi][iElecLo][iVibLo][iRotLo], lgDoEsc, lgUpdateFineOpac, false ); 
     665                                                                RT_line_one( &H2Lines[iElecHi][iVibHi][iRotHi][iElecLo][iVibLo][iRotLo], lgDoEsc, lgUpdateFineOpac, false, 0.f, 1.f ); 
    666666                                                        } 
    667667                                                } 
  • branches/newmole/source/prt_final.cpp

    r2346 r2440  
    802802                fprintf( ioQQQ, "%s" , chIntensityType[ipEmType] ); 
    803803                fprintf( ioQQQ, " line intensities\n" ); 
     804                // caution about emergent intensities when outward optical 
     805                // depths are not yet known 
     806                if( ipEmType==1 && iteration==1 ) 
     807                        fprintf(ioQQQ," Caution: emergent intensities are not reliable on the " 
     808                        "first iteration.\n"); 
    804809 
    805810                /* option to only print brighter lines */ 
  • branches/newmole/source/rt.h

    r1830 r2440  
    3232                this can cause pump to depend on zone thickness, and leads to unstable 
    3333                feedback in some models with the large H2 molecule, due to Solomon 
    34                 process depending on zone thickness and level populations.  
    35 */ 
    36 void RT_line_one(transition * t ,  
    37         bool lgDoEsc ,  
    38         bool lgUpdateFineOpac, 
    39         bool lgShield_this_zone ); 
     34                process depending on zone thickness and level populations. 
     35\param pestrk Stark escape probability 
     36\param efac Exponential correction for single-flight escape probability? usually 1 
     37*/ 
     38void RT_line_one(transition* t,  
     39                 bool lgDoEsc,  
     40                 bool lgUpdateFineOpac, 
     41                 bool lgShield_this_zone, 
     42                 realnum pestrk, 
     43                 realnum efac); 
    4044 
    4145/**rt_continuum_shield_fcn computing continuum shielding due to single line  
  • branches/newmole/source/rt_line_all.cpp

    r2406 r2440  
    3333                nelem; 
    3434        long ipHi , ipLo; 
    35         double factor, 
    36                 coloi; 
     35        double factor; 
    3736        double SaveLyaPesc[NISO][LIMELM] ,  
    3837                SaveLyaPdest[NISO][LIMELM]; 
     
    9594        /*if( lgUpdateFineOpac ) 
    9695                fprintf(ioQQQ,"debuggg\tlgUpdateFineOpac in rt_line_all\n");*/ 
    97         for( ipISO=ipH_LIKE; ipISO<NISO; ++ipISO ) 
     96        for( ipISO=ipH_LIKE; ipISO < NISO; ++ipISO ) 
    9897        { 
    9998                /* loop over all iso-electronic sequences */ 
    100                 for( nelem=ipISO; nelem<LIMELM; ++nelem ) 
     99                for( nelem=ipISO; nelem < LIMELM; ++nelem ) 
    101100                { 
    102101                        /* parent ion stage, for H is 1, for He is 1 for He-like and  
     
    108107                                continue; 
    109108                        /* need we consider this ion? */ 
    110                         if( ion <=dense.IonHigh[nelem] ) 
     109                        if( ion <= dense.IonHigh[nelem] ) 
    111110                        { 
    112111                                /* save escape and destruction probs for each Lya since 
     
    115114                                 * evaluating iso sequence that does not exist for an element, 
    116115                                 * as in He-like hydrogen */ 
    117                                 if( ipISO<=nelem ) 
    118                                 { 
    119                                         SaveLyaPesc[ipISO][nelem] = Transitions[ipISO][nelem][iso.nLyaLevel[ipISO]][0].Emis->Pesc; 
    120                                         SaveLyaPdest[ipISO][nelem] = Transitions[ipISO][nelem][iso.nLyaLevel[ipISO]][0].Emis->Pdest; 
    121                                 } 
     116                                SaveLyaPesc[ipISO][nelem] = Transitions[ipISO][nelem][iso.nLyaLevel[ipISO]][0].Emis->Pesc; 
     117                                SaveLyaPdest[ipISO][nelem] = Transitions[ipISO][nelem][iso.nLyaLevel[ipISO]][0].Emis->Pdest; 
    122118 
    123119                                /* convert pops to per unit vol rather than per ion */ 
     
    153149                                                        Transitions[ipISO][nelem][ipHi][ipLo].Emis->TauTot);*/ 
    154150 
     151                                                fixit(); // is this factor needed? should it be for he-like lya only? 
     152                                                realnum efac; 
     153                                                if( ipISO > 0 && ipHi == iso.nLyaLevel[ipISO] && ipLo == 0 ) 
     154                                                        /* do not let too much Lya escape outward since so important  
     155                                                         * H Lya is special case done elsewhere */ 
     156                                                        efac = opac.ExpmTau[Transitions[ipISO][nelem][ipHi][ipLo].ipCont-1]; 
     157                                                else 
     158                                                        efac = 1.f; 
     159 
    155160                                                /* generate escape prob, pumping rate, destruction prob,  
    156161                                                 * inward outward fracs */ 
    157                                                 RT_line_one(&Transitions[ipISO][nelem][ipHi][ipLo] , lgDoEsc , lgUpdateFineOpac,true); 
    158  
    159  
     162                                                RT_line_one( &Transitions[ipISO][nelem][ipHi][ipLo], 
     163                                                             lgDoEsc, 
     164                                                             lgUpdateFineOpac, 
     165                                                             true, 
     166                                                             (realnum)iso.pestrk[ipISO][nelem][ipLo][ipHi], 
     167                                                             efac ); 
     168 
     169                                                /* set true to print pump rates*/ 
     170                                                enum {DEBUG_LOC=false}; 
     171              &nbs