14#define RECORDSIZE 2880
17#if defined(_BIG_ENDIAN)
28# define HtoNL(A) ((((A) & 0xff000000) >> 24) | \
29 (((A) & 0x00ff0000) >> 8) | \
30 (((A) & 0x0000ff00) << 8) | \
31 (((A) & 0x000000ff) << 24))
41#define ByteSwap5(x) ByteSwap((unsigned char *) &x,sizeof(x))
43#if !defined(_BIG_ENDIAN)
66const char ModelUnits[2][17] = {
"'dimensionless '",
"'photons/cm^2/s'" };
71 realnum **paramData,
long nintparm,
long naddparm,
72 long *numParamValues );
77 long totNumModels,
long numEnergies,
long nintparm,
long naddparm );
82STATIC long addKeyword_txt(
const char *theKeyword,
const void *theValue,
const char *theComment,
long Str_Or_Log );
106 if( (asciiDump = fopen(
"gridspectra.con",
"w" ) ) == NULL )
108 fprintf(
ioQQQ,
"saveFITSfile could not open save file for writing.\nSorry.\n" );
112 for( i=0; i<
grid.numEnergies-1; i++ )
114 fprintf( asciiDump,
"%.12e\t",
grid.Energies[i] );
115 for( j=0; j<
grid.totNumModels; j++ )
117 fprintf( asciiDump,
"%.12e\t",
grid.Spectra[4][j][i] );
119 fprintf( asciiDump,
"\n" );
137 bool lgAdditiveModel;
143 lgAdditiveModel =
false;
147 lgAdditiveModel =
true;
152 for( i=0; i<
grid.nintparm+
grid.naddparm; i++ )
170 fprintf(
ioQQQ,
"PROBLEM - undefined option encountered in saveFITSfile. \n" );
178 const char *ModelName =
"'CLOUDY'";
194 if( lgAddModel ==
true )
225 long naxis, naxis1, naxis2;
227 char theValue_temp[20];
239 naxis2 = nintparm+naddparm;
272 sprintf( theValue,
"%s%-8s%s",
"'",theValue_temp,
"'" );
301 long *numParamValues )
310 for( i=0; i<nintparm+naddparm; i++ )
316 paramMethods[i] =
HtoNL(paramMethods[i]);
318 numTemp =
HtoNL(numParamValues[i]);
322 paramRange[i][0] = (
realnum)pow( 10., (
double)paramRange[i][0] );
323 paramRange[i][1] = (
realnum)pow( 10., (
double)paramRange[i][1] );
324 paramRange[i][2] = (
realnum)pow( 10., (
double)paramRange[i][2] );
325 paramRange[i][3] = (
realnum)pow( 10., (
double)paramRange[i][3] );
326 paramRange[i][4] = (
realnum)pow( 10., (
double)paramRange[i][4] );
327 paramRange[i][5] = (
realnum)pow( 10., (
double)paramRange[i][5] );
330#if !defined(_BIG_ENDIAN)
340 for( j=0; j<numParamValues[i]; j++ )
344 paramData[i][j] = (
realnum)pow( 10., (
double)paramData[i][j] );
347#if !defined(_BIG_ENDIAN)
367 for( i=0; i<nintparm+naddparm; i++ )
369 paramMethods[i] =
HtoNL(paramMethods[i]);
371#if !defined(_BIG_ENDIAN)
381 for( j=0; j<numParamValues[i]; j++ )
383#if !defined(_BIG_ENDIAN)
400 long naxis, naxis1, naxis2;
409 naxis2 = numEnergies;
445 for(
unsigned long i=0; i < Energies.size(); i++ )
452 if( i == Energies.size()-1 )
458 EnergyHi = 0.001f*(
realnum)
EVRYD*(Energies[i+1] -
rfield.widflx[i+EnergyOffset+1]/2.f);
461#if !defined(_BIG_ENDIAN)
480 long i, numFields = 2+naddparm;
481 long naxis, naxis1, naxis2;
487 char theValue2temp[20];
489 char theValue_temp[20];
490 char theComment1[47];
500 naxis1 = ( numEnergies*(naddparm+1) + nintparm ) * (
long)
sizeof(
realnum);
501 naxis2 = totNumModels;
517 sprintf( theValue2temp,
"%ld%s", nintparm,
"E" );
518 sprintf( theValue2,
"%s%-8s%s",
"'",theValue2temp,
"'" );
526 sprintf( theValue_temp,
"%ld%s", numEnergies,
"E" );
527 sprintf( theValue,
"%s%-8s%s",
"'",theValue_temp,
"'" );
534 for( i=1; i<=naddparm; i++ )
536 sprintf( theKeyword1,
"%s%ld",
"TTYPE", i+2 );
537 sprintf( theKeyword2,
"%s%ld",
"TFORM", i+2 );
538 sprintf( theKeyword3,
"%s%ld",
"TUNIT", i+2 );
540 sprintf( theValue1,
"%s%2.2ld%s",
"'ADDSP", i,
"'" );
542 sprintf( theValue2temp,
"%ld%s", numEnergies,
"E" );
543 sprintf( theValue2,
"%s%-8s%s",
"'",theValue2temp,
"'" );
545 sprintf( theComment1,
"%s%ld",
"label for field ", i+2 );
570 long totNumModels,
long numEnergies,
long nintparm,
long naddparm )
573 long naxis2 = totNumModels;
580 for( i=0; i<naxis2; i++ )
583#if !defined(_BIG_ENDIAN)
584 for(
long j = 0; j<numEnergies; j++ )
589 for(
long j = 0; j<nintparm; j++ )
600#if !defined(_BIG_ENDIAN)
602 for(
long j = 0; j<numEnergies; j++ )
607 for(
long j = 0; j<nintparm; j++ )
620 fprintf(
ioQQQ,
" Additional parameters not currently supported.\n" );
636 long naxis, naxis1, naxis2;
644 naxis1 = numFields*(long)
sizeof(
realnum);
645 naxis2 = numEnergies;
686 cdSPEC2( 8, numEnergies, ipLoEnergy, ipHiEnergy, TransmittedSpectrum );
689 for( i=0; i<numEnergies; i++ )
694#if !defined(_BIG_ENDIAN)
709 free( TransmittedSpectrum );
715 char timeString[30]=
"";
723 if(
prt.lgPrintTime )
727 strcpy( timeString , ctime(&now) );
731 for( i=0; i<30; i++ )
733 if( timeString[i] ==
'\n' )
739 strcpy( tempString,
"Generated by Cloudy " );
741 strncat( tempString,
t_version::Inst().chVersion,
sizeof(tempString)-strlen(tempString)-1 );
744 strcpy( tempString,
"--- " );
745 strcat( tempString, timeString );
749 for( i=0; i<=
input.nSave; i++ )
751 char firstLine[70], extraLine[65];
755 if(
input.chCardSav[i][j] ==
'\0' )
760 for( k=0; k<
MIN2(69, j); k++ )
762 firstLine[k] =
input.chCardSav[i][k];
768 for( k=69; k< 133; k++ )
770 extraLine[k-69] =
input.chCardSav[i][k];
773 extraLine[64] =
'\0';
774 strcpy( tempString,
"more " );
775 strcat( tempString, extraLine );
779 for( k=133; k< 197; k++ )
781 extraLine[k-133] =
input.chCardSav[i][k];
783 extraLine[64] =
'\0';
784 strcpy( tempString,
"more " );
785 strcat( tempString, extraLine );
794STATIC long addKeyword_txt(
const char *theKeyword,
const void *theValue,
const char *theComment,
long Str_Or_Log )
796 long numberOfBytesWritten = 0;
801 if( Str_Or_Log == 0 )
803 numberOfBytesWritten = fprintf(
ioFITS_OUTPUT,
"%-8s%-2s%-20s%3s%-47s",
812 ASSERT( Str_Or_Log == 1 );
813 numberOfBytesWritten = fprintf(
ioFITS_OUTPUT,
"%-8s%-2s%20s%3s%-47s",
822 return numberOfBytesWritten;
827 long numberOfBytesWritten = 0;
831 numberOfBytesWritten = fprintf(
ioFITS_OUTPUT,
"%-8s%-2s%20ld%3s%-47s",
839 return numberOfBytesWritten;
844 long i, numberOfBytesWritten = 0;
845 char tempString[70] =
" ";
849 strncpy( &tempString[0], CommentToAdd, 69 );
850 ASSERT( (
int)strlen( tempString ) <= 70 );
853 for( i=0; i<69; i++ )
855 if( tempString[i] ==
'\t' )
861 numberOfBytesWritten = fprintf(
ioFITS_OUTPUT,
"COMMENT %-70s", tempString );
864 return numberOfBytesWritten;
const int INPUT_LINE_LENGTH
#define DEBUG_ENTRY(funcname)
void cdSPEC2(int Option, long int nEnergy, long int ipLoEnergy, long int ipHiEnergy, realnum ReturnedSpectrum[])
static t_version & Inst()
const int NUM_OUTPUT_TYPES
UNUSED const double EVRYD
STATIC void punchFITS_EnergyHeader(long numEnergies)
STATIC long addComment(const char *CommentToAdd)
STATIC void punchFITS_GenericHeader(long numEnergies)
void saveFITSfile(FILE *ioPUN, int option)
const char ModelUnits[2][17]
STATIC long addKeyword_num(const char *theKeyword, long theValue, const char *theComment)
STATIC void punchFITS_EnergyData(const vector< realnum > &Energies, long EnergyOffset)
STATIC void writeCloudyDetails(void)
STATIC void punchFITS_PrimaryHeader(bool lgAddModel)
STATIC void punchFITS_GenericData(long numEnergies, long ipLoEnergy, long ipHiEnergy)
STATIC void punchFITS_ParamHeader(long nintparm, long naddparm)
STATIC long addKeyword_txt(const char *theKeyword, const void *theValue, const char *theComment, long Str_Or_Log)
static FILE * ioFITS_OUTPUT
STATIC void punchFITS_SpectraHeader(bool lgAdditiveModel, long nintparm, long naddparm, long totNumModels, long numEnergies)
STATIC void punchFITS_SpectraData(realnum **interpParameters, multi_arr< realnum, 3 > &theSpectrum, int option, long totNumModels, long numEnergies, long nintparm, long naddparm)
static long maxParamValues
STATIC void ByteSwap(unsigned char *b, int n)
STATIC void punchFITS_ParamData(char **paramNames, long *paramMethods, realnum **paramRange, realnum **paramData, long nintparm, long naddparm, long *numParamValues)