| 620 | | if( conv.lgConvIoniz && iso.pop_ion_ov_neut[ipISO][nelem] > 1e-15 && |
| 621 | | ! fp_equal_tol(abund*dense.xIonDense[nelem][nelem+1-ipISO],dense.xIonDense[nelem][nelem-ipISO], |
| 622 | | err_tol*dense.xIonDense[nelem][nelem-ipISO])) |
| | 623 | double rel_err = fabs(abund*dense.xIonDense[nelem][nelem+1-ipISO]-dense.xIonDense[nelem][nelem-ipISO])/ |
| | 624 | SDIV(dense.xIonDense[nelem][nelem-ipISO]); |
| | 625 | |
| | 626 | fixit();/* the following test should pass cleanly, rm the 0 && to |
| | 627 | * activate. when it passes rm this block and |
| | 628 | * change err_tol in following block to a small number */ |
| | 629 | if(0 & conv.lgConvIoniz && |
| | 630 | iso.pop_ion_ov_neut[ipISO][nelem] > 1e-15 && |
| | 631 | dense.xIonDense[nelem][nelem+1-ipISO]>SMALLFLOAT && |
| | 632 | rel_err > 0.02f ) |
| | 633 | { |
| | 634 | /* remove this block when error is made small - this block |
| | 635 | * is here */ |
| | 636 | fprintf(ioQQQ,"PROBLEM ISO/ion do not agree ipISO=%li " |
| | 637 | "nelem=%li iso soln=%.2e ion soln=%.2e rel_err %.2e \n", |
| | 638 | ipISO , nelem , |
| | 639 | abund*dense.xIonDense[nelem][nelem+1-ipISO], |
| | 640 | dense.xIonDense[nelem][nelem-ipISO] , |
| | 641 | rel_err); |
| | 642 | } |
| | 643 | |
| | 644 | const realnum err_tol = 0.4f; |
| | 645 | if( conv.lgConvIoniz && |
| | 646 | iso.pop_ion_ov_neut[ipISO][nelem] > 1e-15 && |
| | 647 | dense.xIonDense[nelem][nelem+1-ipISO]>SMALLFLOAT && |
| | 648 | rel_err > err_tol ) |
| 892 | | /* check that iso level population and ionization balance solvers |
| 893 | | * are consistent - problems with this test are described in Ticket 70 */ |
| 894 | | if( !dynamics.lgAdvection && !conv.lgSearch ) |
| 895 | | { |
| 896 | | for( ipISO=ipH_LIKE; ipISO<NISO; ++ipISO ) |
| 897 | | { |
| 898 | | for( nelem=ipISO; nelem<LIMELM; ++nelem ) |
| 899 | | { |
| 900 | | if( dense.lgElmtOn[nelem] && |
| 901 | | dense.xIonDense[nelem][nelem-ipISO]/dense.eden>conv.EdenErrorAllowed / 10. && |
| 902 | | !(iso.chTypeAtomUsed[ipISO][nelem][0]=='L' && |
| 903 | | iso.xIonSimple[ipISO][nelem]<1e-10) ) |
| 904 | | { |
| 905 | | /* we will check that ground pops are within this factor of the xIonDense value |
| 906 | | * these are only converged down to some extent - probably this should be related |
| 907 | | * to the ionization convergence error */ |
| 908 | | const realnum err_tol = 3e-2f; |
| 909 | | realnum abund = 0.; |
| 910 | | for (long n=0; n<iso.numLevels_local[ipISO][nelem]; ++n) |
| 911 | | { |
| 912 | | abund += (realnum)StatesElem[ipISO][nelem][n].Pop; |
| 913 | | } |
| 914 | | /* make sure that populations are valid, first check Pop2Ion */ |
| 915 | | if( iso.pop_ion_ov_neut[ipISO][nelem] > 1e-15 && |
| 916 | | ! fp_equal_tol(abund*dense.xIonDense[nelem][nelem+1-ipISO],dense.xIonDense[nelem][nelem-ipISO], |
| 917 | | err_tol*dense.xIonDense[nelem][nelem-ipISO]) |
| 918 | | ) |
| 919 | | |
| 920 | | if( |
| 921 | | iso.pop_ion_ov_neut[ipISO][nelem] > 1e-15 && |
| 922 | | fabs(abund*dense.xIonDense[nelem][nelem+1-ipISO]-dense.xIonDense[nelem][nelem-ipISO])> |
| 923 | | err_tol*dense.xIonDense[nelem][nelem-ipISO] ) |
| 924 | | { |
| 925 | | /* not converged */ |
| 926 | | conv.lgConvIoniz = false; |
| 927 | | strcpy( conv.chConvIoniz, "ISO solvers agree"); |
| 928 | | /* indicates which species */ |
| 929 | | conv.BadConvIoniz[0] = ipISO*100 + nelem; |
| 930 | | conv.BadConvIoniz[1] = |
| 931 | | (abund*dense.xIonDense[nelem][nelem+1-ipISO]- |
| 932 | | dense.xIonDense[nelem][nelem-ipISO])/ |
| 933 | | SDIV(dense.xIonDense[nelem][nelem-ipISO]); |
| 934 | | /*fprintf(ioQQQ,"DEBUG ISO agree %g err %.2e abund %.2e\n", |
| 935 | | conv.BadConvIoniz[0] , |
| 936 | | conv.BadConvIoniz[1], |
| 937 | | dense.xIonDense[nelem][nelem-ipISO]);*/ |
| 938 | | } |
| 939 | | } |
| 940 | | } |
| 941 | | } |
| 942 | | } |