12 #define RECORDSIZE 2880
15 #if defined(_BIG_ENDIAN)
26 # define HtoNL(A) ((((A) & 0xff000000) >> 24) | \
27 (((A) & 0x00ff0000) >> 8) | \
28 (((A) & 0x0000ff00) << 8) | \
29 (((A) & 0x000000ff) << 24))
39 #define ByteSwap5(x) ByteSwap((unsigned char *) &x,sizeof(x))
41 #if !defined(_BIG_ENDIAN)
64 const char ModelUnits[2][17] = {
"'dimensionless '",
"'photons/cm^2/s'" };
69 realnum **paramData,
long nintparm,
long naddparm,
70 long *numParamValues );
75 long totNumModels,
long numEnergies,
long nintparm,
long naddparm );
80 STATIC long addKeyword_txt(
const char *theKeyword,
const void *theValue,
const char *theComment,
long Str_Or_Log );
104 asciiDump =
open_data(
"gridspectra.con",
"w" );
131 bool lgAdditiveModel;
137 lgAdditiveModel =
false;
141 lgAdditiveModel =
true;
164 fprintf(
ioQQQ,
"PROBLEM - undefined option encountered in saveFITSfile. \n" );
172 const char *ModelName =
"'CLOUDY'";
178 fixit(
"bitpix is wrong when realnum is double?");
188 if( lgAddModel ==
true )
219 long naxis, naxis1, naxis2;
221 char theValue_temp[20];
233 naxis2 = nintparm+naddparm;
266 sprintf( theValue,
"%s%-8s%s",
"'",theValue_temp,
"'" );
295 long *numParamValues )
304 for( i=0; i<nintparm+naddparm; i++ )
310 paramMethods[i] =
HtoNL(paramMethods[i]);
312 numTemp =
HtoNL(numParamValues[i]);
316 paramRange[i][0] = (
realnum)
exp10( (
double)paramRange[i][0] );
317 paramRange[i][1] = (
realnum)
exp10( (
double)paramRange[i][1] );
318 paramRange[i][2] = (
realnum)
exp10( (
double)paramRange[i][2] );
319 paramRange[i][3] = (
realnum)
exp10( (
double)paramRange[i][3] );
320 paramRange[i][4] = (
realnum)
exp10( (
double)paramRange[i][4] );
321 paramRange[i][5] = (
realnum)
exp10( (
double)paramRange[i][5] );
324 #if !defined(_BIG_ENDIAN)
334 for( j=0; j<numParamValues[i]; j++ )
338 paramData[i][j] = (
realnum)
exp10( (
double)paramData[i][j] );
341 #if !defined(_BIG_ENDIAN)
361 for( i=0; i<nintparm+naddparm; i++ )
363 paramMethods[i] =
HtoNL(paramMethods[i]);
365 #if !defined(_BIG_ENDIAN)
375 for( j=0; j<numParamValues[i]; j++ )
377 #if !defined(_BIG_ENDIAN)
394 long naxis, naxis1, naxis2;
403 naxis2 = numEnergies;
439 for(
unsigned long i=0; i < Energies.size(); i++ )
447 #if !defined(_BIG_ENDIAN)
466 long i, numFields = 2+naddparm;
467 long naxis, naxis1, naxis2;
473 char theValue2temp[20];
475 char theValue_temp[20];
476 char theComment1[47];
486 naxis1 = ( numEnergies*(naddparm+1) + nintparm ) * (long)
sizeof(
realnum);
487 naxis2 = totNumModels;
503 sprintf( theValue2temp,
"%ld%s", nintparm,
"E" );
504 sprintf( theValue2,
"%s%-8s%s",
"'",theValue2temp,
"'" );
512 sprintf( theValue_temp,
"%ld%s", numEnergies,
"E" );
513 sprintf( theValue,
"%s%-8s%s",
"'",theValue_temp,
"'" );
520 for( i=1; i<=naddparm; i++ )
522 sprintf( theKeyword1,
"%s%ld",
"TTYPE", i+2 );
523 sprintf( theKeyword2,
"%s%ld",
"TFORM", i+2 );
524 sprintf( theKeyword3,
"%s%ld",
"TUNIT", i+2 );
526 sprintf( theValue1,
"%s%2.2ld%s",
"'ADDSP", i,
"'" );
528 sprintf( theValue2temp,
"%ld%s", numEnergies,
"E" );
529 sprintf( theValue2,
"%s%-8s%s",
"'",theValue2temp,
"'" );
531 sprintf( theComment1,
"%s%ld",
"label for field ", i+2 );
556 long totNumModels,
long numEnergies,
long nintparm,
long naddparm )
559 long naxis2 = totNumModels;
566 for( i=0; i<naxis2; i++ )
569 #if !defined(_BIG_ENDIAN)
570 for(
long j = 0; j<numEnergies; j++ )
575 for(
long j = 0; j<nintparm; j++ )
586 #if !defined(_BIG_ENDIAN)
588 for(
long j = 0; j<numEnergies; j++ )
593 for(
long j = 0; j<nintparm; j++ )
606 fprintf(
ioQQQ,
" Additional parameters not currently supported.\n" );
622 long naxis, naxis1, naxis2;
630 naxis1 = numFields*(long)
sizeof(
realnum);
631 naxis2 = numEnergies;
672 cdSPEC2( 8, numEnergies, ipLoEnergy, ipHiEnergy, TransmittedSpectrum );
675 for( i=0; i<numEnergies; i++ )
680 #if !defined(_BIG_ENDIAN)
695 free( TransmittedSpectrum );
701 char timeString[30]=
"";
713 strcpy( timeString , ctime(&now) );
717 for( i=0; i<30; i++ )
719 if( timeString[i] ==
'\n' )
725 strcpy( tempString,
"Generated by Cloudy " );
727 strncat( tempString,
t_version::Inst().chVersion,
sizeof(tempString)-strlen(tempString)-1 );
730 strcpy( tempString,
"--- " );
731 strcat( tempString, timeString );
737 char firstLine[70], extraLine[65];
746 for( k=0; k<
MIN2(69, j); k++ )
754 for( k=69; k< 133; k++ )
759 extraLine[64] =
'\0';
760 strcpy( tempString,
"more " );
761 strcat( tempString, extraLine );
765 for( k=133; k< 197; k++ )
769 extraLine[64] =
'\0';
770 strcpy( tempString,
"more " );
771 strcat( tempString, extraLine );
780 STATIC long addKeyword_txt(
const char *theKeyword,
const void *theValue,
const char *theComment,
long Str_Or_Log )
782 long numberOfBytesWritten = 0;
787 if( Str_Or_Log == 0 )
798 ASSERT( Str_Or_Log == 1 );
808 return numberOfBytesWritten;
813 long numberOfBytesWritten = 0;
825 return numberOfBytesWritten;
830 long i, numberOfBytesWritten = 0;
831 char tempString[70] =
" ";
835 strncpy( &tempString[0], CommentToAdd, 69 );
836 ASSERT( (
int)strlen( tempString ) <= 70 );
839 for( i=0; i<69; i++ )
841 if( tempString[i] ==
'\t' )
850 return numberOfBytesWritten;
FILE * open_data(const char *fname, const char *mode, access_scheme scheme)
STATIC void punchFITS_ParamData(char **paramNames, long *paramMethods, realnum **paramRange, realnum **paramData, long nintparm, long naddparm, long *numParamValues)
STATIC long addKeyword_num(const char *theKeyword, long theValue, const char *theComment)
STATIC void punchFITS_PrimaryHeader(bool lgAddModel)
vector< realnum > Energies
STATIC void punchFITS_SpectraData(realnum **interpParameters, multi_arr< realnum, 3 > &theSpectrum, int option, long totNumModels, long numEnergies, long nintparm, long naddparm)
void cdSPEC2(int Option, long int nEnergy, long int ipLoEnergy, long int ipHiEnergy, realnum ReturnedSpectrum[])
double anu(size_t i) const
STATIC void writeCloudyDetails(void)
static t_version & Inst()
long int nflux_with_check
realnum ** interpParameters
STATIC long addKeyword_txt(const char *theKeyword, const void *theValue, const char *theComment, long Str_Or_Log)
long numParamValues[LIMPAR]
static FILE * ioFITS_OUTPUT
STATIC void punchFITS_ParamHeader(long nintparm, long naddparm)
const int NUM_OUTPUT_TYPES
static long maxParamValues
const int INPUT_LINE_LENGTH
multi_arr< realnum, 3 > Spectra
double anumin(size_t i) const
STATIC void ByteSwap(unsigned char *b, int n)
STATIC void punchFITS_SpectraHeader(bool lgAdditiveModel, long nintparm, long naddparm, long totNumModels, long numEnergies)
const char ModelUnits[2][17]
STATIC void punchFITS_EnergyData(const vector< realnum > &Energies, long EnergyOffset)
#define DEBUG_ENTRY(funcname)
STATIC long addComment(const char *CommentToAdd)
int fprintf(const Output &stream, const char *format,...)
void saveFITSfile(FILE *io, int option)
STATIC void punchFITS_GenericHeader(long numEnergies)
STATIC void punchFITS_EnergyHeader(long numEnergies)
double anumax(size_t i) const
STATIC void punchFITS_GenericData(long numEnergies, long ipLoEnergy, long ipHiEnergy)