00001
00002
00003
00004
00005 #include "cddefines.h"
00006 #include "cddrive.h"
00007 #include "physconst.h"
00008 #include "geometry.h"
00009 #include "radius.h"
00010 #include "rfield.h"
00011 #include "opacity.h"
00012 #include "grid.h"
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 static long int iplo , iphi;
00024
00025
00026 static double Elo , Ehi;
00027
00028 void cdSPEC(
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 int nOption ,
00047
00048
00049
00050 double EnergyLow[] ,
00051
00052
00053 long int nEnergy ,
00054
00055
00056 double ReturnedSpectrum[] )
00057
00058 {
00059
00060 realnum *cont ,
00061 refac;
00062 long int ncell , j;
00063
00064
00065 bool lgFREE;
00066
00067 DEBUG_ENTRY( "cdSPEC()" );
00068
00069 ASSERT( nEnergy <= rfield.nflux );
00070
00071 if( nOption == 1 )
00072 {
00073
00074 cont = rfield.flux_total_incident[0];
00075 lgFREE = false;
00076 }
00077 else if( nOption == 2 )
00078 {
00079
00080
00081 cont = rfield.flux[0];
00082 lgFREE = false;
00083 }
00084 else if( nOption == 3 )
00085 {
00086
00087 lgFREE = false;
00088 cont = rfield.ConRefIncid[0];
00089 }
00090 else if( nOption == 4 )
00091 {
00092
00093 cont = (realnum*)MALLOC( sizeof(realnum)*(size_t)rfield.nupper );
00094
00095
00096 lgFREE = true;
00097 refac = (realnum)radius.r1r0sq*geometry.covgeo;
00098 for( j=0; j<rfield.nflux; ++j)
00099 {
00100 cont[j] = rfield.ConEmitOut[0][j]*refac;
00101 }
00102 }
00103 else if( nOption == 5 )
00104 {
00105
00106 cont = (realnum*)MALLOC( sizeof(realnum)*(size_t)rfield.nupper );
00107
00108 lgFREE = true;
00109 refac = (realnum)radius.r1r0sq*geometry.covgeo;
00110 for( j=0; j<rfield.nflux; ++j)
00111 {
00112 cont[j] = rfield.ConEmitReflec[0][j]*refac;
00113 }
00114 }
00115 else if( nOption == 6 )
00116 {
00117
00118 cont = (realnum*)MALLOC( sizeof(realnum)*(size_t)rfield.nupper );
00119
00120 lgFREE = true;
00121
00122 refac = (realnum)radius.r1r0sq*geometry.covgeo;
00123 for( j=0; j<rfield.nflux; ++j)
00124 {
00125
00126
00127 cont[j] = rfield.outlin[0][j] *rfield.widflx[j]/rfield.anu[j]*refac;
00128 }
00129 }
00130 else if( nOption == 7 )
00131 {
00132
00133 if( geometry.lgSphere )
00134 {
00135 refac = 0.;
00136 }
00137 else
00138 {
00139 refac = 1.;
00140 }
00141
00142 cont = (realnum*)MALLOC( sizeof(realnum)*(size_t)rfield.nupper );
00143
00144 lgFREE = true;
00145 for( j=0; j<rfield.nflux; ++j)
00146 {
00147
00148
00149 cont[j] = rfield.reflin[0][j] *rfield.widflx[j]/rfield.anu[j]*refac;
00150 }
00151 }
00152 else
00153 {
00154 fprintf(ioQQQ," cdSPEC called with impossible nOption (%i)\n", nOption);
00155 cdEXIT(EXIT_FAILURE);
00156 }
00157
00158
00159 iplo = 0;
00160 iphi = 0;
00161
00162 for( ncell = 0; ncell < nEnergy-1; ++ncell )
00163 {
00164
00165 Elo = EnergyLow[ncell];
00166 Ehi = EnergyLow[ncell+1];
00167 ReturnedSpectrum[ncell] = cont[ncell] * EN1RYD * rfield.anu2[ncell] / rfield.widflx[ncell];
00168 }
00169
00170
00171 if( lgFREE )
00172 {
00173 free(cont);
00174 }
00175 return;
00176 }
00177
00178
00179
00180 void cdSPEC2(
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200 int nOption ,
00201
00202
00203 long int nEnergy,
00204
00205
00206 long ipLoEnergy,
00207 long ipHiEnergy,
00208
00209
00210 realnum ReturnedSpectrum[] )
00211
00212 {
00213 realnum refac;
00214
00215 DEBUG_ENTRY( "cdSPEC2()" );
00216
00217 ASSERT( ipLoEnergy >= 0 );
00218 ASSERT( ipLoEnergy < ipHiEnergy );
00219 ASSERT( ipHiEnergy < rfield.nupper );
00220 ASSERT( nEnergy == (ipHiEnergy-ipLoEnergy+1) );
00221 ASSERT( nEnergy >= 2 );
00222
00223 ASSERT( nOption <= NUM_OUTPUT_TYPES );
00224
00225 for( long i = 0; i < nEnergy; i++ )
00226 {
00227 long j = ipLoEnergy + i;
00228
00229 if( j >= rfield.nflux )
00230 {
00231 ReturnedSpectrum[i] = SMALLFLOAT;
00232 continue;
00233 }
00234
00235 if( nOption == 0 )
00236 {
00237
00238 realnum flxatt = rfield.flux[0][j]*
00239 (realnum)radius.r1r0sq * rfield.trans_coef_total[j];
00240
00241
00242 realnum conem = (rfield.ConEmitOut[0][j] + rfield.outlin[0][j])*
00243 (realnum)radius.r1r0sq*geometry.covgeo;
00244
00245
00246 realnum flxref = rfield.ConRefIncid[0][j] + rfield.ConEmitReflec[0][j] +
00247 rfield.reflin[0][j];
00248
00249 ReturnedSpectrum[i] = flxatt + conem + flxref;
00250 }
00251 else if( nOption == 1 )
00252 {
00253
00254 ReturnedSpectrum[i] = rfield.flux_total_incident[0][j];
00255 }
00256 else if( nOption == 2 )
00257 {
00258
00259
00260 ReturnedSpectrum[i] = rfield.flux[0][j]*
00261 (realnum)radius.r1r0sq * rfield.trans_coef_total[j];
00262 }
00263 else if( nOption == 3 )
00264 {
00265
00266 ReturnedSpectrum[i] = rfield.ConRefIncid[0][j];
00267 }
00268 else if( nOption == 4 )
00269 {
00270
00271
00272 refac = (realnum)radius.r1r0sq*geometry.covgeo;
00273 ReturnedSpectrum[i] = (rfield.outlin[0][j]+rfield.ConEmitOut[0][j])*refac;
00274 }
00275 else if( nOption == 5 )
00276 {
00277
00278 if( geometry.lgSphere )
00279 {
00280 refac = 0.;
00281 }
00282 else
00283 {
00284 refac = 1.;
00285 }
00286
00287 ReturnedSpectrum[i] = (rfield.reflin[0][j]+rfield.ConEmitReflec[0][j])*refac;
00288 }
00289 else if( nOption == 6 )
00290 {
00291
00292
00293 refac = (realnum)radius.r1r0sq*geometry.covgeo;
00294 ReturnedSpectrum[i] = rfield.outlin[0][j]*refac;
00295 }
00296 else if( nOption == 7 )
00297 {
00298
00299 if( geometry.lgSphere )
00300 {
00301 refac = 0.;
00302 }
00303 else
00304 {
00305 refac = 1.;
00306 }
00307
00308 ReturnedSpectrum[i] = rfield.reflin[0][j]*refac;
00309 }
00310 else if( nOption == 8 )
00311 {
00312
00313
00314 refac = (realnum)radius.r1r0sq*geometry.covgeo;
00315 ReturnedSpectrum[i] = (rfield.ConEmitOut[0][j]+ rfield.outlin[0][j])*refac
00316 + rfield.flux[0][j]*(realnum)radius.r1r0sq*rfield.trans_coef_total[j];
00317 }
00318 else if( nOption == 9 )
00319 {
00320
00321 ReturnedSpectrum[i] = rfield.ConRefIncid[0][j] + rfield.ConEmitReflec[0][j] +
00322 rfield.reflin[0][j];
00323 }
00324 else if( nOption == 10 )
00325 {
00326
00327
00328
00329 ReturnedSpectrum[i] = opac.ExpmTau[j]*rfield.trans_coef_total[j];
00330 }
00331 else
00332 {
00333 fprintf(ioQQQ," cdSPEC called with impossible nOption (%i)\n", nOption);
00334 cdEXIT(EXIT_FAILURE);
00335 }
00336
00337 ASSERT( ReturnedSpectrum[i] >=0.f );
00338 }
00339
00340 return;
00341 }