Changeset 2111

Show
Ignore:
Timestamp:
06/17/08 06:08:23 (2 months ago)
Author:
peter
Message:

Merge r2110 from mainline - fix qheat bug reported by Manuel Bautista.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • branches/c08_branch/source/grains_qheat.cpp

    r2034 r2111  
    622622        if( trace.lgTrace && trace.lgDustBug ) 
    623623        { 
    624                 fprintf( ioQQQ, "   grain heating: %.4e, integral %.4e, total rate %.4e\n", 
    625                          gv.bin[nd]->GrainHeat,integral,Phi[0]); 
     624                double Rate2 = 0.; 
     625                for( int nz=0; nz < gv.bin[nd]->nChrg; nz++ ) 
     626                        Rate2 += gv.bin[nd]->chrg[nz]->FracPop*gv.bin[nd]->chrg[nz]->HeatingRate2; 
     627 
     628                fprintf( ioQQQ, "   grain heating: %.4e, integral %.4e, total rate %.4e lgNegRate %c\n", 
     629                         gv.bin[nd]->GrainHeat,integral,Phi[0],TorF(lgNegRate)); 
    626630                fprintf( ioQQQ, "   av grain temp %.4e av grain enthalpy (Ryd) %.4e\n", 
    627631                         gv.bin[nd]->tedust,Umax); 
    628632                fprintf( ioQQQ, "   fwhm^2/(4ln2*c2/c0): %.4e fwhm (Ryd) %.4e fwhm/Umax %.4e\n", 
    629633                         NumEvents,fwhm,FwhmRatio ); 
    630                 fprintf( ioQQQ, "   lgQHTooWide %d\n", gv.bin[nd]->lgQHTooWide ); 
     634                fprintf( ioQQQ, "   HeatingRate1 %.4e HeatingRate2 %.4e lgQHTooWide %c\n", 
     635                         gv.bin[nd]->HeatingRate1*gv.bin[nd]->cnv_H_pCM3, Rate2*gv.bin[nd]->cnv_H_pCM3, 
     636                         TorF(gv.bin[nd]->lgQHTooWide) ); 
    631637        } 
    632638 
     
    911917         * energies, the reshuffling for higher energies is done in the next loop 
    912918         * phiTilde has units events/H/s/cell at default depletion */ 
     919 
     920        double NegHeatingRate = 0.; 
    913921 
    914922        for( nz=0; nz < gv.bin[nd]->nChrg; nz++ ) 
     
    983991                *check += gptr->FracPop*check1*EN1RYD*gv.bin[nd]->cnv_H_pCM3; 
    984992 
     993                sum += gptr->FracPop*check1*EN1RYD*gv.bin[nd]->cnv_H_pCM3; 
     994 
    985995                if( DEBUG_LOC ) 
    986996                { 
     
    9901000                                integral += phiTilde[i]*gv.bin[nd]->cnv_H_pCM3*rfield.anu[i]*EN1RYD; 
    9911001                        } 
    992                         sum += gptr->FracPop*check1*EN1RYD*gv.bin[nd]->cnv_H_pCM3; 
    9931002                        dprintf( ioQQQ, " integral test 1: integral %.6e %.6e\n", integral, sum ); 
    9941003                } 
     
    10071016 
    10081017                /* >>chng 03 nov 06, check for extremely low HeatingRate and save CPU time, pah_crash.in, PvH */ 
    1009                 if( fabs(gptr->HeatingRate2*gv.bin[nd]->cnv_H_pCM3) > 0.05*CONSERV_TOL*gv.bin[nd]->GrainHeat )  
     1018                if( gptr->HeatingRate2*gv.bin[nd]->cnv_H_pCM3 > 0.05*CONSERV_TOL*gv.bin[nd]->GrainHeat )  
    10101019                { 
    10111020                        double *RateArr,Sum,ESum,DSum,Delta,E_av2,Corr; 
     
    10761085                        } 
    10771086 
     1087                        sum += gptr->FracPop*gptr->HeatingRate2*gv.bin[nd]->cnv_H_pCM3; 
     1088 
    10781089                        if( DEBUG_LOC ) 
    10791090                        { 
     
    10831094                                        integral += phiTilde[i]*gv.bin[nd]->cnv_H_pCM3*rfield.anu[i]*EN1RYD; 
    10841095                                } 
    1085                                 sum += gptr->FracPop*gptr->HeatingRate2*gv.bin[nd]->cnv_H_pCM3; 
    10861096                                dprintf( ioQQQ, " integral test 2: integral %.6e %.6e\n", integral, sum ); 
    10871097                        } 
    10881098 
    10891099                        free( RateArr ); 
     1100                } 
     1101                else 
     1102                { 
     1103                        NegHeatingRate += gptr->FracPop*gptr->HeatingRate2*gv.bin[nd]->cnv_H_pCM3; 
    10901104                } 
    10911105        } 
     
    11091123 
    11101124        /* >>chng 03 nov 06, check for extremely low HeatingRate and save CPU time, PvH */ 
    1111         if( fabs(gv.bin[nd]->HeatingRate1*gv.bin[nd]->cnv_H_pCM3) > 0.05*CONSERV_TOL*gv.bin[nd]->GrainHeat ) 
     1125        if( gv.bin[nd]->HeatingRate1*gv.bin[nd]->cnv_H_pCM3 > 0.05*CONSERV_TOL*gv.bin[nd]->GrainHeat ) 
    11121126        { 
    11131127                /* limits for Taylor expansion of (1+x)*exp(-x) */ 
     
    11531167                        ylo = yhi; 
    11541168                } 
    1155         } 
    1156  
    1157         if( DEBUG_LOC ) 
    1158         { 
    1159                 double integral = 0.; 
     1169 
     1170                sum += gv.bin[nd]->HeatingRate1*gv.bin[nd]->cnv_H_pCM3; 
     1171 
     1172                if( DEBUG_LOC ) 
     1173                { 
     1174                        double integral = 0.; 
     1175                        for( i=0; i < gv.bin[nd]->qnflux; i++ ) 
     1176                        { 
     1177                                integral += phiTilde[i]*gv.bin[nd]->cnv_H_pCM3*rfield.anu[i]*EN1RYD; 
     1178                        } 
     1179                        dprintf( ioQQQ, " integral test 3: integral %.6e %.6e\n", integral, sum ); 
     1180                } 
     1181        } 
     1182        else 
     1183        { 
     1184                NegHeatingRate += gv.bin[nd]->HeatingRate1*gv.bin[nd]->cnv_H_pCM3; 
     1185        } 
     1186 
     1187        /* here we account for the negative heating rates, we simply do that by scaling the entire 
     1188         * phiTilde array down by a constant factor such that the total amount of energy is conserved 
     1189         * This treatment assures that phiTilde never goes negative, which avoids problems further on */ 
     1190        if( NegHeatingRate < 0. ) 
     1191        { 
     1192                double scale_fac = (sum+NegHeatingRate)/sum; 
    11601193                for( i=0; i < gv.bin[nd]->qnflux; i++ ) 
    1161                 { 
    1162                         integral += phiTilde[i]*gv.bin[nd]->cnv_H_pCM3*rfield.anu[i]*EN1RYD; 
    1163                 } 
    1164                 sum += gv.bin[nd]->HeatingRate1*gv.bin[nd]->cnv_H_pCM3; 
    1165                 dprintf( ioQQQ, " integral test 3: integral %.6e %.6e\n", integral, sum ); 
    1166         } 
     1194                        phiTilde[i] *= scale_fac; 
     1195 
     1196                sum += NegHeatingRate; 
     1197 
     1198                if( DEBUG_LOC ) 
     1199                { 
     1200                        double integral = 0.; 
     1201                        for( i=0; i < gv.bin[nd]->qnflux; i++ ) 
     1202                        { 
     1203                                integral += phiTilde[i]*gv.bin[nd]->cnv_H_pCM3*rfield.anu[i]*EN1RYD; 
     1204                        } 
     1205                        dprintf( ioQQQ, " integral test 4: integral %.6e %.6e\n", integral, sum ); 
     1206                } 
     1207        } 
     1208 
    11671209        return; 
    11681210} 
     
    13541396                RadCooling += dCool; 
    13551397 
    1356 /*              if( nzone >= 870 ) { */ 
    1357 /*              printf(" k %ld T[k] %.6e U[k] %.6e p[k] %.6e dPdlnT[k] %.6e\n",k-1,qtemp[k-1],u1[k-1],p[k-1],dPdlnT[k-1]); */ 
    1358 /*              printf(" k %ld T[k] %.6e U[k] %.6e p[k] %.6e dPdlnT[k] %.6e\n",k,qtemp[k],u1[k],p[k],dPdlnT[k]); */ 
    1359 /*              } */ 
     1398//              if( nzone >= 24 && nd == 0 ) { 
     1399//              printf(" k %ld T[k] %.6e U[k] %.6e p[k] %.6e dPdlnT[k] %.6e\n",k-1,qtemp[k-1],u1[k-1],p[k-1],dPdlnT[k-1]); 
     1400//              printf(" k %ld T[k] %.6e U[k] %.6e p[k] %.6e dPdlnT[k] %.6e\n",k,qtemp[k],u1[k],p[k],dPdlnT[k]); 
     1401//              } 
    13601402 
    13611403                /* if qtmin is far too low, p[k] can become extremely large, exceeding