/home66/gary/public_html/cloudy/c08_branch/source/age_check.cpp

Go to the documentation of this file.
00001 /* This file is part of Cloudy and is copyright (C)1978-2008 by Gary J. Ferland and
00002  * others.  For conditions of distribution and use see copyright notice in license.txt */
00003 /*AgeCheck check various timescales after calculation complete to confirm time steady OK */
00004 #include "cddefines.h"
00005 #include "physconst.h"
00006 #include "prt.h"
00007 #include "hmi.h"
00008 #include "mole.h"
00009 #include "struc.h"
00010 #include "warnings.h"
00011 #include "dense.h"
00012 #include "timesc.h"
00013 
00014 void AgeCheck(void)
00015 {
00016         char chLine[INPUT_LINE_LENGTH];
00017         long int i, 
00018           limit;
00019         double hold,
00020           tlong, 
00021           tsound;
00022 
00023         DEBUG_ENTRY( "AgeCheck()" );
00024 
00025         /* cloud age of zero means that age command turned off
00026          * negative cloud age means was not set */
00027 
00028         /* remember longest timescale */
00029         tlong = 0.;
00030 
00031         /* thermal equilibrium timescale */
00032         timesc.time_therm_long = 0.;
00033         timesc.time_therm_short = 0.;
00034         limit = MAX2(1,nzone-1);
00035         ASSERT( limit < struc.nzlim );
00036 
00037         /* NZLIM is the size of the struc vectors - should be dynamic 
00038         limit = MIN2( limit , NZLIM-1 );*/
00039 
00040         for( i=0; i < limit; i++ )
00041         {
00042                 timesc.time_therm_long = 
00043                         MAX2( timesc.time_therm_long ,
00044                         struc.DenParticles[i]*BOLTZMANN*1.5*struc.testr[i]/struc.coolstr[i]);
00045                 timesc.time_therm_short = 
00046                         MIN2( timesc.time_therm_short ,
00047                         struc.DenParticles[i]*BOLTZMANN*1.5*struc.testr[i]/struc.coolstr[i]);
00048                 /*>>chng 99 feb 01, had div by heating, changed to cooling so constant
00049                  * temperature models are more realistic */
00050         }
00051 
00052         tlong = MAX2(tlong,timesc.time_therm_long);
00053         if( prt.lgPrnAges )
00054         {
00055                 sprintf( chLine, "   AGE: longest thermal timescale= %.2es.", 
00056                   timesc.time_therm_long );
00057                 notein(chLine);
00058         }
00059 
00060         tlong = MAX2(tlong,timesc.TimeH21cm);
00061         if( prt.lgPrnAges )
00062         {
00063                 sprintf( chLine, "   AGE: 21 cm equilibrium timescale= %.2es.", 
00064                   timesc.TimeH21cm );
00065                 notein(chLine);
00066         }
00067 
00068         if( timesc.CloudAgeSet > 0. && timesc.time_therm_long > timesc.CloudAgeSet )
00069         {
00070                 sprintf( chLine, " C-AGE: Thermal equilibrium timescale, %.2es, longer than age", 
00071                   timesc.time_therm_long );
00072                 caunin(chLine);
00073         }
00074 
00075         /* check soundt travel time if constant pressure */
00076         if( strcmp(dense.chDenseLaw,"CPRE") == 0 )
00077         {
00078                 tsound = timesc.sound;
00079                 if( prt.lgPrnAges )
00080                 {
00081                         sprintf( chLine, "   AGE: sound travel time= %.2es.", 
00082                           tsound );
00083                         notein(chLine);
00084                 }
00085 
00086                 if( timesc.CloudAgeSet > 0. && tsound > timesc.CloudAgeSet )
00087                 {
00088                         sprintf( chLine, " C-AGE: Sound travel time longer than age in constant pressure model = %.2es", 
00089                           timesc.time_therm_long );
00090                         caunin(chLine);
00091                 }
00092         }
00093 
00094         else
00095         {
00096                 /* do not check if not constant pressure */
00097                 tsound = 0.;
00098         }
00099         tlong = MAX2(tlong,tsound);
00100 
00101         /* molecule formation timescale */
00102         /* >>chng 04 sep 17, - if species are negligible will set to negative number
00103          * to retain value but not include in timescales */
00104         if( hmi.BiggestH2<1e-2 )
00105         {
00106                 timesc.time_H2_Dest_longest *= -1.;
00107                 timesc.time_H2_Form_longest *= -1.;
00108         }
00109         if( findspecies("CO")->xMoleFracMax < 1e-2 )
00110         {
00111                 timesc.BigCOMoleForm *= -1.;
00112         }
00113         tlong = MAX2( tlong , timesc.time_H2_Dest_longest );
00114         tlong = MAX2( tlong , timesc.time_H2_Form_longest );
00115         tlong = MAX2( tlong , timesc.BigCOMoleForm );
00116 
00117         /* >>chng 97 jan 03, don't print if zero */
00118         if( prt.lgPrnAges && timesc.time_H2_Dest_longest > 0. )
00119         {
00120                 sprintf( chLine, "   AGE: longest H2 destruction timescale= %.2es.", 
00121                   timesc.time_H2_Dest_longest );
00122                 notein(chLine);
00123         }
00124 
00125         if( prt.lgPrnAges && timesc.time_H2_Form_longest > 0. )
00126         {
00127                 sprintf( chLine, "   AGE: longest H2 formation timescale= %.2es.", 
00128                   timesc.time_H2_Form_longest );
00129                 notein(chLine);
00130         }
00131 
00132         if( timesc.CloudAgeSet > 0. && timesc.time_H2_Dest_longest > timesc.CloudAgeSet )
00133         {
00134                 sprintf( chLine, " C-AGE: H2 destruction timescale longer than age, = %.2es", 
00135                   timesc.time_H2_Dest_longest );
00136                 caunin(chLine);
00137         }
00138 
00139         if( timesc.CloudAgeSet > 0. && timesc.time_H2_Form_longest > timesc.CloudAgeSet )
00140         {
00141                 sprintf( chLine, " C-AGE: H2 formation timescale longer than age, = %.2es", 
00142                   timesc.time_H2_Form_longest );
00143                 caunin(chLine);
00144         }
00145 
00146         if( prt.lgPrnAges && timesc.BigCOMoleForm > 0. )
00147         {
00148                 sprintf( chLine, "   AGE: longest CO formation timescale= %.2es.", 
00149                   timesc.BigCOMoleForm );
00150                 notein(chLine);
00151         }
00152 
00153         if( timesc.CloudAgeSet > 0. && timesc.BigCOMoleForm > timesc.CloudAgeSet )
00154         {
00155                 sprintf( chLine, " C-AGE: CO formation timescale longer than age, = %.2es", 
00156                   timesc.BigCOMoleForm );
00157                 caunin(chLine);
00158         }
00159 
00160         /* hydrogen recombination timescale */
00161         timesc.time_Hrecom_long = 0.;
00162         timesc.time_Hrecom_short = 0.;
00163         for( i=0; i < limit; i++ )
00164         {
00165                 hold = struc.ednstr[i]*2.90e-10*pow(struc.testr[i],(realnum)-0.77f);
00166                 timesc.time_Hrecom_long = MAX2(timesc.time_Hrecom_long , 1./hold);
00167                 timesc.time_Hrecom_short = MAX2(timesc.time_Hrecom_short , 1./hold);
00168         }
00169 
00170         tlong = MAX2(tlong,timesc.time_Hrecom_long);
00171         if( prt.lgPrnAges )
00172         {
00173                 sprintf( chLine, "   AGE: longest H recombination timescale= %.2es.", 
00174                   timesc.time_Hrecom_long );
00175                 notein(chLine);
00176         }
00177 
00178         if( timesc.CloudAgeSet > 0. && timesc.time_Hrecom_long > timesc.CloudAgeSet )
00179         {
00180                 sprintf( chLine, " C-AGE: Hydrogen recombination timescale longer than age, = %.2es", 
00181                   timesc.time_Hrecom_long );
00182                 caunin(chLine);
00183         }
00184 
00185         /* give age in various units, depending on order of magnitude */
00186         if( timesc.CloudAgeSet < 0. )
00187         {
00188                 /* CloudAgeSet initially set to -1, if still the case then age not set */
00189                 if( tlong < 3600. )
00190                 {
00191                         /* less than one day, give only seconds */
00192                         sprintf( chLine, "  !AGE: Cloud age was not set.  Longest timescale was %.2e s.", 
00193                           tlong );
00194                         bangin(chLine);
00195                 }
00196 
00197                 else if( tlong < 8.64e4 )
00198                 {
00199                         /* less than one day, give seconds and hours */
00200                         sprintf( chLine, "  !AGE: Cloud age was not set.  Longest timescale was %.2e s = %.2e hours.", 
00201                           tlong, tlong/3600. );
00202                         bangin(chLine);
00203                 }
00204 
00205                 else if( tlong < 3e7/12. )
00206                 {
00207                         /* less than one month, give seconds and days */
00208                         sprintf( chLine, "  !AGE: Cloud age was not set.  Longest timescale was %.2e s = %.2e days.", 
00209                           tlong, tlong/86400. );
00210                         bangin(chLine);
00211                 }
00212 
00213                 else if( tlong < 3e7 )
00214                 {
00215                         /* less than one year, give seconds and months */
00216                         sprintf( chLine, "  !AGE: Cloud age was not set.  Longest timescale was %.2e s = %.2e months.", 
00217                           tlong, (tlong/3.15569e7)*12. );
00218                         bangin(chLine);
00219                 }
00220 
00221                 else
00222                 {
00223                         /* more than one year, give seconds and years */
00224                         sprintf( chLine, "  !AGE: Cloud age was not set.  Longest timescale was %.2e s = %.2e years.", 
00225                           tlong, tlong/3.15569e7 );
00226                         bangin(chLine);
00227                 }
00228         }
00229 
00230         else
00231         {
00232                 /* age set, and passed tests, still say longest */
00233                 if( tlong < 3e7 )
00234                 {
00235                         /* less than one year, give only seconds */
00236                         sprintf( chLine, "   AGE: Cloud age was %.2es, Longest timescale was %.2e s.", 
00237                           timesc.CloudAgeSet, tlong );
00238                         notein(chLine);
00239                 }
00240 
00241                 else
00242                 {
00243                         /* more than one year, give seconds and years */
00244                         sprintf( chLine, "   AGE: Cloud age was %.2e s.  Longest timescale was %.2e s = %.2e years.", 
00245                           timesc.CloudAgeSet, tlong, tlong/3.15569e7 );
00246                         notein(chLine);
00247                 }
00248         }
00249         return;
00250 }

Generated on Mon Feb 16 12:01:12 2009 for cloudy by  doxygen 1.4.7