00001
00002
00003
00004
00005
00006 #include "cddefines.h"
00007 #include "dynamics.h"
00008 #include "hydrogenic.h"
00009 #include "trace.h"
00010 #include "elementnames.h"
00011 #include "phycon.h"
00012 #include "secondaries.h"
00013 #include "stopcalc.h"
00014 #include "grainvar.h"
00015 #include "highen.h"
00016 #include "dense.h"
00017 #include "hmi.h"
00018 #include "rfield.h"
00019 #include "pressure.h"
00020 #include "taulines.h"
00021 #include "helike.h"
00022 #include "rt.h"
00023 #include "grains.h"
00024 #include "atmdat.h"
00025 #include "ionbal.h"
00026 #include "opacity.h"
00027 #include "cooling.h"
00028 #include "thermal.h"
00029 #include "mole.h"
00030 #include "iso.h"
00031 #include "conv.h"
00032
00033
00034
00035 static bool lgIonizConverg(
00036
00037 long int nelem ,
00038
00039 double delta ,
00040
00041 bool lgPrint )
00042 {
00043 bool lgConverg_v;
00044 long int ion;
00045 double Abund,
00046 bigchange ,
00047 change ,
00048 one;
00049 double abundold=0. , abundnew=0.;
00050
00051
00052 static float OldFracs[LIMELM+1][LIMELM+1];
00053
00054 DEBUG_ENTRY( "lgIonizConverg()" );
00055
00056 if( !dense.lgElmtOn[nelem] )
00057 return true;
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069 if( conv.nPres2Ioniz )
00070 {
00071
00072
00073 bigchange = 0.;
00074 change = 0.;
00075 Abund = dense.gas_phase[nelem];
00076
00077
00078
00079 for( ion=0; ion <= (nelem+1); ++ion )
00080 {
00081
00082 if( OldFracs[nelem][ion]/Abund > 1e-4 &&
00083 dense.xIonDense[nelem][ion]/Abund > 1e-4 )
00084
00085 {
00086
00087 one = fabs(dense.xIonDense[nelem][ion]-OldFracs[nelem][ion])/
00088 OldFracs[nelem][ion];
00089 change = MAX2(change, one );
00090
00091 if( change>bigchange )
00092 {
00093 bigchange = change;
00094 abundold = OldFracs[nelem][ion]/Abund;
00095 abundnew = dense.xIonDense[nelem][ion]/Abund;
00096 }
00097 }
00098
00099 OldFracs[nelem][ion] = dense.xIonDense[nelem][ion];
00100 }
00101
00102 if( change < delta )
00103 {
00104 lgConverg_v = true;
00105 }
00106 else
00107 {
00108 lgConverg_v = false;
00109 conv.BadConvIoniz[0] = abundold;
00110 conv.BadConvIoniz[1] = abundnew;
00111 ASSERT( abundold>0. && abundnew>0. );
00112 }
00113 }
00114 else
00115 {
00116 for( ion=0; ion <= (nelem+1); ++ion )
00117 {
00118 OldFracs[nelem][ion] = dense.xIonDense[nelem][ion];
00119 }
00120
00121 lgConverg_v = true;
00122 }
00123
00124
00125 if( lgPrint )
00126 {
00127 fprintf(ioQQQ," element %li converged? %c ",nelem, TorF(lgConverg_v));
00128 for( ion=0; ion<(nelem+1); ++ion )
00129 {
00130 fprintf(ioQQQ,"\t%.2e", dense.xIonDense[nelem][ion]/dense.gas_phase[nelem]);
00131 }
00132 fprintf(ioQQQ,"\n");
00133 }
00134
00135 DEBUG_EXIT( "lgIonizConverg()" );
00136 return( lgConverg_v );
00137 }
00138
00139
00140
00141
00142 int ConvBase(
00143
00144
00145 long loopi )
00146 {
00147 double O_HIonRate_New , O_HIonRate_Old;
00148 double HeatOld,
00149 EdenTrue_old,
00150 EdenFromMolecOld,
00151 EdenFromGrainsOld,
00152 HeatingOld ,
00153 CoolingOld;
00154 float hmole_save[N_H_MOLEC];
00155 static double SecondOld;
00156 static long int nzoneOTS=-1;
00157 # define LOOP_ION_LIMIT 10
00158 long int nelem,
00159 ion,
00160 loop_ion,
00161 i,
00162 ipISO;
00163 static double SumOTS=0. , OldSumOTS[2]={0.,0.};
00164 double save_iso_grnd[NISO][LIMELM];
00165
00166 DEBUG_ENTRY( "ConvBase()" );
00167
00168
00169
00170
00171
00172 ASSERT( phycon.te == thermal.te_update );
00173
00174
00175
00176
00177 fnzone = (double)nzone + (double)conv.nPres2Ioniz/100.;
00178
00179
00180
00181
00182 PresTotCurrent();
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193 if( conv.nTotalIoniz )
00194 {
00195 if( eden_sum() )
00196 {
00197
00198 ++conv.nTotalIoniz;
00199 DEBUG_EXIT( "ConvBase()" );
00200 return 1;
00201 }
00202 }
00203
00204
00205
00206 EdenTrue_old = dense.EdenTrue;
00207 EdenFromMolecOld = co.comole_eden;
00208 EdenFromGrainsOld = gv.TotalEden;
00209 HeatingOld = thermal.htot;
00210 CoolingOld = thermal.ctot;
00211
00212
00213 for( ipISO=ipH_LIKE; ipISO<NISO; ++ipISO )
00214 {
00215 for( nelem=ipISO; nelem<LIMELM;++nelem )
00216 {
00217 if( dense.lgElmtOn[nelem] )
00218 {
00219
00220 save_iso_grnd[ipISO][nelem] = iso.Pop2Ion[ipISO][nelem][0];
00221 }
00222 }
00223 }
00224
00225 for( i=0; i < mole.num_comole_calc; i++ )
00226 {
00227 COmole[i]->comole_save = COmole[i]->hevmol;
00228 }
00229
00230 for( i=0; i < N_H_MOLEC; i++ )
00231 {
00232 hmole_save[i] = hmi.Hmolec[i];
00233 }
00234
00235 if( loopi==0 )
00236 {
00237
00238 OldSumOTS[0] = 0.;
00239 OldSumOTS[1] = 0.;
00240 }
00241
00242 if( trace.lgTrace )
00243 {
00244 fprintf( ioQQQ,
00245 " ConvBase called. %.2f Te:%.3e HI:%.3e HII:%.3e H2:%.3e Ne:%.3e htot:%.3e CSUP:%.2e Conv?%c\n",
00246 fnzone,
00247 phycon.te,
00248 dense.xIonDense[ipHYDROGEN][0],
00249 dense.xIonDense[ipHYDROGEN][1],
00250 hmi.H2_total,
00251 dense.eden,
00252 thermal.htot,
00253 secondaries.csupra[ipHYDROGEN][0] ,
00254 TorF(conv.lgConvIoniz) );
00255 }
00256
00257 conv.lgConvIoniz = true;
00258
00259
00260 HeatZero();
00261
00262
00263
00264
00265 if( !conv.nTotalIoniz )
00266 {
00267 conv.lgConvIoniz = false;
00268 strcpy( conv.chConvIoniz, "first call" );
00269 }
00270
00271
00272
00273 conv.lgIonStageTrimed = false;
00274
00275
00276
00277
00278
00279 opac.lgRedoStatic = false;
00280 if(
00281
00282 !opac.lgOpacStatic ||
00283
00284 conv.lgSearch ||
00285
00286 conv.nPres2Ioniz == 0 )
00287 {
00288
00289 opac.lgRedoStatic = true;
00290 }
00291
00292
00293 ion_recom_calculate();
00294
00295
00296
00297
00298
00299
00300
00301 if( conv.nTotalIoniz )
00302 {
00303 bool lgion_trim_called = false;
00304
00305
00306
00307
00308
00309
00310
00311 if( !conv.nPres2Ioniz && !conv.lgSearch )
00312 {
00313 lgion_trim_called = true;
00314 for( nelem=ipHELIUM; nelem<LIMELM; ++nelem )
00315 {
00316 if( dense.lgElmtOn[nelem] )
00317 {
00318
00319
00320 ion_trim(nelem);
00321 }
00322 }
00323 }
00324
00325
00326 # if !defined(NDEBUG)
00327
00328 for( nelem=ipHELIUM; nelem<LIMELM; ++nelem)
00329 {
00330 if( dense.lgElmtOn[nelem] )
00331 {
00332 for( ion=0; ion<dense.IonLow[nelem]; ++ion )
00333 {
00334 ASSERT( dense.xIonDense[nelem][ion] == 0. );
00335 }
00336
00337 for( ion=dense.IonLow[nelem]; ion<=dense.IonHigh[nelem]; ++ion )
00338 {
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352 ASSERT( conv.lgSearch || !lgion_trim_called ||
00353
00354 (ion==0 && dense.IonHigh[nelem]==0 ) ||
00355 dense.xIonDense[nelem][ion] >= SMALLFLOAT ||
00356 dense.xIonDense[nelem][ion]/dense.gas_phase[nelem] >= SMALLFLOAT );
00357 }
00358 for( ion=dense.IonHigh[nelem]+1; ion<nelem+1; ++ion )
00359 {
00360 ASSERT( dense.xIonDense[nelem][ion] == 0. );
00361 }
00362 }
00363 }
00364 # endif
00365 }
00366
00367
00368 if( conv.lgIonStageTrimed )
00369 {
00370
00371
00372 conv.lgConvIoniz = false;
00373 strcpy( conv.chConvIoniz, "IonTrimmed" );
00374 }
00375
00376
00377 if( dynamics.lgAdvection )
00378 DynaIonize();
00379
00380
00381
00382
00383 loop_ion = 0;
00384 do
00385 {
00386
00387 if( trace.nTrConvg>=4 )
00388 {
00389
00390 fprintf( ioQQQ,
00391 " ConvBase4 ionization driver loop_ion %li converged? %c reason not converged %s\n" ,
00392 loop_ion ,
00393 TorF( conv.lgConvIoniz) ,
00394 conv.chConvIoniz );
00395 }
00396
00397
00398
00399
00400
00401 if( loop_ion )
00402 conv.lgConvIoniz = true;
00403
00404
00405
00406
00407
00408 ChargTranEval( &O_HIonRate_Old );
00409
00410 CO_update_species_cache();
00411
00412 hmole_reactions();
00413
00414 co.nitro_dissoc_rate = 0;
00415
00416
00417 CO_update_rks();
00418
00419
00420
00421 GrainDrive();
00422
00423
00424
00425 Hydrogenic();
00426
00427
00428
00429 highen();
00430
00431
00432 atmdat_3body();
00433
00434
00435 atmdat_DielSupres();
00436
00437
00438
00439 HeLike();
00440
00441
00442
00443
00444 if( lgAbort )
00445 {
00446
00447 ++conv.nTotalIoniz;
00448 DEBUG_EXIT( "ConvBase()" );
00449
00450 return 1;
00451 }
00452
00453
00454
00455
00456
00457 if( opac.lgRedoStatic )
00458 {
00459
00460 for( nelem=0; nelem< LIMELM; ++nelem )
00461 {
00462 for( ion=0; ion<nelem+1; ++ion )
00463 {
00464 ionbal.UTA_ionize_rate[nelem][ion] = 0.;
00465 ionbal.UTA_heat_rate[nelem][ion] = 0.;
00466 }
00467 }
00468
00469
00470 if( ionbal.lgInnerShellLine_on )
00471 {
00472 for( i=0; i<nUTA; ++i )
00473 {
00474 if( UTALines[i].Aul > 0. )
00475 {
00476
00477
00478 double rateone = UTALines[i].pump * -UTALines[i].cs;
00479 ionbal.UTA_ionize_rate[UTALines[i].nelem-1][UTALines[i].IonStg-1] += rateone;
00480
00481 ionbal.UTA_heat_rate[UTALines[i].nelem-1][UTALines[i].IonStg-1] += rateone*UTALines[i].heat;
00482 {
00483
00484
00485 enum {DEBUG_LOC=false};
00486
00487 if( DEBUG_LOC )
00488 {
00489 fprintf(ioQQQ,"DEBUG UTA %3i %3i %.3f %.2e %.2e %.2e\n",
00490 UTALines[i].nelem , UTALines[i].IonStg , UTALines[i].WLAng ,
00491 rateone, UTALines[i].heat,
00492 UTALines[i].heat*dense.xIonDense[UTALines[i].nelem-1][UTALines[i].IonStg-1] );
00493 }
00494 }
00495 }
00496 }
00497 }
00498 }
00499
00500
00501 IonHelium();
00502
00503
00504
00505
00506
00507
00508
00509 IonCarbo();
00510 IonOxyge();
00511 IonNitro();
00512 IonSilic();
00513 IonSulph();
00514 IonChlor();
00515
00516 CO_drive();
00517 if( !conv.nPres2Ioniz || rfield.lgIonizReevaluate ||
00518 conv.lgIonStageTrimed || conv.lgSearch )
00519 {
00520 IonLithi();
00521 IonBeryl();
00522 IonBoron();
00523
00524
00525
00526
00527
00528
00529 IonFluor();
00530 IonNeon();
00531 IonSodiu();
00532 IonMagne();
00533 IonAlumi();
00534 IonPhosi();
00535 IonArgon();
00536 IonPotas();
00537 IonCalci();
00538 IonScand();
00539 IonTitan();
00540 IonVanad();
00541 IonChrom();
00542 IonManga();
00543 IonIron();
00544 IonCobal();
00545 IonNicke();
00546 IonCoppe();
00547 IonZinc();
00548 }
00549
00550
00551
00552
00553
00554 for( nelem=ipHYDROGEN; nelem < LIMELM; nelem++ )
00555 {
00556 if( dense.lgSetIoniz[nelem] )
00557 {
00558 dense.IonLow[nelem] = 0;
00559 dense.IonHigh[nelem] = nelem + 1;
00560 while( dense.SetIoniz[nelem][dense.IonLow[nelem]] == 0. )
00561 ++dense.IonLow[nelem];
00562 while( dense.SetIoniz[nelem][dense.IonHigh[nelem]] == 0. )
00563 --dense.IonHigh[nelem];
00564 }
00565 }
00566
00567
00568 ChargTranEval( &O_HIonRate_New );
00569
00570
00571
00572
00573
00574 for( nelem=ipHELIUM; nelem<LIMELM; ++nelem )
00575 {
00576 if( !lgIonizConverg(nelem, 0.05 ,false ) )
00577 {
00578 conv.lgConvIoniz = false;
00579 sprintf( conv.chConvIoniz , "%2s ion" , elementnames.chElementSym[nelem] );
00580 }
00581 }
00582
00583 if( fabs(EdenTrue_old - dense.EdenTrue)/SDIV(dense.EdenTrue) > conv.EdenErrorAllowed/2. )
00584 {
00585 conv.lgConvIoniz = false;
00586 sprintf( conv.chConvIoniz , "EdTr cng" );
00587 conv.BadConvIoniz[0] = EdenTrue_old;
00588 conv.BadConvIoniz[1] = dense.EdenTrue;
00589 }
00590 ++loop_ion;
00591 }
00592
00593 while( !conv.lgConvIoniz && loop_ion < LOOP_ION_LIMIT && rfield.lgIonizReevaluate);
00594
00595
00596
00597
00598 thermal.char_tran_heat = ChargTranSumHeat();
00599
00600 thermal.char_tran_cool = MAX2(0. , -thermal.char_tran_heat );
00601 thermal.char_tran_heat = MAX2(0. , thermal.char_tran_heat );
00602
00603
00604
00605 CoolEvaluate(&thermal.ctot );
00606
00607
00608 HeatOld = thermal.htot;
00609
00610
00611
00612
00613 SecondOld = secondaries.csupra[ipHYDROGEN][0];
00614
00615
00616
00617 HeatSum();
00618
00619
00620
00621
00622
00623 if( (secondaries.csupra[ipHYDROGEN][0]>SMALLFLOAT) && (secondaries.sec2total>0.001) &&
00624 fabs( 1. - SecondOld/SDIV(secondaries.csupra[ipHYDROGEN][0]) ) > 0.1 &&
00625 SecondOld > 0. && secondaries.csupra[ipHYDROGEN][0] > 0.)
00626 {
00627
00628 conv.lgConvIoniz = false;
00629 strcpy( conv.chConvIoniz, "SecIonRate" );
00630 conv.BadConvIoniz[0] = SecondOld;
00631 conv.BadConvIoniz[1] = secondaries.csupra[ipHYDROGEN][0];
00632 }
00633
00634 # if 0
00635 static float hminus_old=0.;
00636
00637 if( conv.nTotalIoniz )
00638 {
00639 if( fabs( hminus_old-hmi.Hmolec[ipMHm])/SDIV(hmi.Hmolec[ipMHm]) >
00640 conv.EdenErrorAllowed/4. )
00641 conv.lgConvIoniz = false;
00642 strcpy( conv.chConvIoniz, "Big H- chn" );
00643 conv.BadConvIoniz[0] = hminus_old;
00644 conv.BadConvIoniz[1] = hmi.Hmolec[ipMHm];
00645 }
00646 hminus_old = hmi.Hmolec[ipMHm];
00647 # endif
00648
00649 if( HeatOld > 0. && !thermal.lgTSetOn )
00650 {
00651
00652 if( fabs(1.-thermal.htot/HeatOld) > conv.HeatCoolRelErrorAllowed*.5 )
00653 {
00654 conv.lgConvIoniz = false;
00655 strcpy( conv.chConvIoniz, "Big d Heat" );
00656 conv.BadConvIoniz[0] = HeatOld;
00657 conv.BadConvIoniz[1] = thermal.htot;
00658 }
00659 }
00660
00661
00662 if( lgAbort )
00663 {
00664 DEBUG_EXIT( "ConvBase()" );
00665
00666 return 1;
00667 }
00668
00669
00670
00671
00672 if( !conv.nPres2Ioniz || rfield.lgOpacityReevaluate || conv.lgIonStageTrimed )
00673 OpacityAddTotal();
00674
00675
00676
00677
00678
00679
00680
00681
00682
00683 if( !conv.nPres2Ioniz || rfield.lgOpacityReevaluate || rfield.lgIonizReevaluate ||
00684 conv.lgIonStageTrimed || conv.lgSearch || nzone!=nzoneOTS )
00685 {
00686 RT_OTS();
00687 nzoneOTS = nzone;
00688
00689
00690 OldSumOTS[0] = OldSumOTS[1];
00691 OldSumOTS[1] = SumOTS;
00692
00693
00694
00695
00696
00697
00698
00699 RT_OTS_Update(&SumOTS , 0.20 );
00700
00701 }
00702 else
00703 SumOTS = 0.;
00704
00705
00706 if( SumOTS> 0. )
00707 {
00708
00709
00710
00711 if( fabs(1.-OldSumOTS[1]/SumOTS) > conv.EdenErrorAllowed )
00712 {
00713
00714
00715 if( loopi > 1 )
00716 {
00717
00718 if( (OldSumOTS[0]-OldSumOTS[1]) * ( OldSumOTS[1] - SumOTS ) < 0. )
00719 {
00720
00721
00722 conv.lgOscilOTS = true;
00723 }
00724 }
00725
00726 conv.lgConvIoniz = false;
00727 strcpy( conv.chConvIoniz, "OTSRatChng" );
00728 conv.BadConvIoniz[0] = OldSumOTS[1];
00729 conv.BadConvIoniz[1] = SumOTS;
00730 }
00731
00732
00733 if( ( trace.lgTrace && trace.lgOTSBug ) ||
00734 ( trace.nTrConvg && trace.lgOTSBug ) )
00735 {
00736 RT_OTS_PrtRate(SumOTS*0.05 , 'b' );
00737 }
00738
00739
00740
00741 {
00742
00743
00744 enum {DEBUG_LOC=false};
00745
00746 if( DEBUG_LOC && (nzone>110) )
00747 {
00748 # if 0
00749 # include "lines_service.h"
00750 DumpLine( &EmisLines[ipH_LIKE][ipHYDROGEN][2][0] );
00751 # endif
00752
00753
00754
00755
00756
00757
00758
00759
00760
00761 }
00762 }
00763 }
00764 {
00765
00766
00767 enum {DEBUG_LOC=false};
00768
00769 if( DEBUG_LOC && (nzone>200) )
00770 {
00771 fprintf(ioQQQ,"debug otsss\t%li\t%.3e\t%.3e\t%.3e\n",
00772 nzone,
00773 EmisLines[0][1][15][3].ots,
00774 TauLines[26].ots,
00775 opac.opacity_abs[2069]);
00776 }
00777 }
00778
00779
00780 if( trace.lgTrace && trace.lgOTSBug )
00781 {
00782
00783
00784
00785 RT_OTS_PrtRate(SumOTS*0.05 , 'b' );
00786 }
00787
00788
00789
00790
00791 if( conv.nPres2Ioniz && !conv.lgSearch )
00792 {
00793 RT_line_all(false , false );
00794 }
00795 else
00796 {
00797 RT_line_all(true , false );
00798 }
00799
00800
00801
00802
00803 PresTotCurrent();
00804
00805 if( trace.lgTrace )
00806 {
00807 fprintf( ioQQQ,
00808 " ConvBase return. %.2f Te:%.3e HI:%.3e HII:%.3e H2:%.3e Ne:%.3e htot:%.3e CSUP:%.2e Conv?%c\n",
00809 fnzone,
00810 phycon.te,
00811 dense.xIonDense[ipHYDROGEN][0],
00812 dense.xIonDense[ipHYDROGEN][1],
00813 hmi.H2_total,
00814 dense.eden,
00815 thermal.htot,
00816 secondaries.csupra[ipHYDROGEN][0] ,
00817 TorF(conv.lgConvIoniz) );
00818 }
00819
00820
00821
00822 for( nelem=ipHYDROGEN; nelem<LIMELM; ++nelem )
00823 {
00824
00825
00826 if( dense.lgElmtOn[nelem] && !dense.lgSetIoniz[nelem])
00827 {
00828
00829
00830 double sum = dense.xMolecules[nelem];
00831 for( ion=0; ion<nelem+2; ++ion )
00832 {
00833 sum += dense.xIonDense[nelem][ion];
00834 }
00835 ASSERT( sum > SMALLFLOAT );
00836
00840
00841
00842
00843
00844
00845
00846
00847 if( fabs(sum-dense.gas_phase[nelem])/sum > 2e-2 )
00848 {
00849
00850
00851
00852
00853
00854 conv.lgConvIoniz = false;
00855 strcpy( conv.chConvIoniz, "CO con4" );
00856 sprintf( conv.chConvIoniz, "COnelem%2li",nelem );
00857 conv.BadConvIoniz[0] = sum;
00858 conv.BadConvIoniz[1] = dense.gas_phase[nelem];
00859 }
00860 }
00861 }
00862
00863
00864
00865
00866
00867
00868
00869 ++conv.nPres2Ioniz;
00870
00871
00872
00873
00874 if( conv.nPres2Ioniz > conv.limPres2Ioniz && nzone > 0)
00875 {
00876 fprintf(ioQQQ,"PROBLEM ConvBase sets lgAbort since nPres2Ioniz exceeds limPres2Ioniz.\n");
00877 fprintf(ioQQQ,"Their values are %li and %li \n",conv.nPres2Ioniz , conv.limPres2Ioniz);
00878 lgAbort = true;
00879
00880 DEBUG_EXIT( "ConvBase()" );
00881
00882 return 1;
00883 }
00884
00885
00886
00887 if( eden_sum() )
00888 {
00889
00890 DEBUG_EXIT( "ConvBase()" );
00891 return 1;
00892 }
00893
00895 if( fabs(EdenTrue_old - dense.EdenTrue)/dense.EdenTrue > conv.EdenErrorAllowed/2. )
00896 {
00897 conv.lgConvIoniz = false;
00898 sprintf( conv.chConvIoniz, "eden chng" );
00899 conv.BadConvIoniz[0] = EdenTrue_old;
00900 conv.BadConvIoniz[1] = dense.EdenTrue;
00901 }
00902
00903
00904 if( fabs(EdenFromMolecOld - co.comole_eden)/dense.EdenTrue > conv.EdenErrorAllowed/2. )
00905 {
00906 conv.lgConvIoniz = false;
00907 sprintf( conv.chConvIoniz, "edn chnCO" );
00908 conv.BadConvIoniz[0] = EdenFromMolecOld;
00909 conv.BadConvIoniz[1] = dense.EdenTrue;
00910 }
00911
00912
00913 if( fabs(EdenFromGrainsOld - gv.TotalEden)/dense.EdenTrue > conv.EdenErrorAllowed/2. )
00914 {
00915 conv.lgConvIoniz = false;
00916 sprintf( conv.chConvIoniz, "edn grn e" );
00917 conv.BadConvIoniz[0] = EdenFromGrainsOld;
00918 conv.BadConvIoniz[1] = gv.TotalEden;
00919 }
00920
00921
00922 if( !thermal.lgTSetOn )
00923 {
00924 if( fabs(HeatingOld - thermal.htot)/thermal.htot > conv.HeatCoolRelErrorAllowed/2. )
00925 {
00926 conv.lgConvIoniz = false;
00927 sprintf( conv.chConvIoniz, "heat chg" );
00928 conv.BadConvIoniz[0] = HeatingOld;
00929 conv.BadConvIoniz[1] = thermal.htot;
00930 }
00931
00932 if( fabs(CoolingOld - thermal.ctot)/thermal.ctot > conv.HeatCoolRelErrorAllowed/2. )
00933 {
00934 conv.lgConvIoniz = false;
00935 sprintf( conv.chConvIoniz, "cool chg" );
00936 conv.BadConvIoniz[0] = CoolingOld;
00937 conv.BadConvIoniz[1] = thermal.ctot;
00938 }
00939 }
00940
00941
00942 if( fabs( (EdenFromMolecOld-EdenFromGrainsOld) - (co.comole_eden-gv.TotalEden) )/dense.eden >
00943 conv.EdenErrorAllowed/4. )
00944 {
00945 conv.lgConvIoniz = false;
00946 sprintf( conv.chConvIoniz, "edn grn e" );
00947 conv.BadConvIoniz[0] = (EdenFromMolecOld-EdenFromGrainsOld);
00948 conv.BadConvIoniz[1] = (co.comole_eden-gv.TotalEden);
00949 }
00950
00951
00952 for( i=0; i < mole.num_comole_calc; ++i )
00953 {
00954 if( dense.lgElmtOn[COmole[i]->nelem_hevmol] && COmole[i]->hevmol>SMALLFLOAT )
00955 {
00956 if( fabs(COmole[i]->hevmol-COmole[i]->comole_save)/dense.gas_phase[COmole[i]->nelem_hevmol]-1. >
00957 conv.EdenErrorAllowed/2.)
00958 {
00959 conv.lgConvIoniz = false;
00960 sprintf( conv.chConvIoniz, "ch %s",COmole[i]->label );
00961 conv.BadConvIoniz[0] = COmole[i]->comole_save/dense.gas_phase[COmole[i]->nelem_hevmol];
00962 conv.BadConvIoniz[1] = COmole[i]->hevmol/dense.gas_phase[COmole[i]->nelem_hevmol];
00963 }
00964 }
00965 }
00966
00967
00968 for( i=0; i < N_H_MOLEC; ++i )
00969 {
00970 if( fabs(hmi.Hmolec[i]-hmole_save[i])/dense.gas_phase[ipHYDROGEN]-1. >
00971 conv.EdenErrorAllowed/2.)
00972 {
00973 conv.lgConvIoniz = false;
00974 sprintf( conv.chConvIoniz, "ch %s",hmi.chLab[i] );
00975 conv.BadConvIoniz[0] = hmole_save[i]/dense.gas_phase[ipHYDROGEN];
00976 conv.BadConvIoniz[1] = hmi.Hmolec[i]/dense.gas_phase[ipHYDROGEN];
00977 }
00978 }
00979
00980
00981
00982
00983 for( ipISO=ipH_LIKE; ipISO<NISO; ++ipISO )
00984 {
00985 for( nelem=ipISO; nelem<LIMELM;++nelem )
00986 {
00987 if( dense.lgElmtOn[nelem] )
00988 {
00989
00990
00991 if( dense.xIonDense[nelem][nelem+1-ipISO]/dense.gas_phase[nelem] > 1e-5 )
00992 {
00993 if( fabs(iso.Pop2Ion[ipISO][nelem][0]-save_iso_grnd[ipISO][nelem])/SDIV(iso.Pop2Ion[ipISO][nelem][0])-1. >
00994 conv.EdenErrorAllowed)
00995 {
00996 conv.lgConvIoniz = false;
00997 sprintf( conv.chConvIoniz,"iso %3li%li",ipISO, nelem );
00998 conv.BadConvIoniz[0] = save_iso_grnd[ipISO][nelem]/SDIV(iso.Pop2Ion[ipISO][nelem][0]);
00999 conv.BadConvIoniz[1] = iso.Pop2Ion[ipISO][nelem][0]/SDIV(iso.Pop2Ion[ipISO][nelem][0]);
01000 }
01001 }
01002
01003 }
01004 }
01005 }
01006
01007
01008
01009
01010
01011
01012
01013
01014
01015
01016 ++conv.nTotalIoniz;
01017
01018
01019
01020 if(StopCalc.nTotalIonizStop && conv.nTotalIoniz> StopCalc.nTotalIonizStop )
01021 {
01022
01023 fprintf(ioQQQ , "ABORT flag set since STOP nTotalIoniz was set and reached.\n");
01024 DEBUG_EXIT( "ConvBase()" );
01025 return 1;
01026 }
01027
01028 DEBUG_EXIT( "ConvBase()" );
01029
01030 return 0;
01031 }
01032