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