00001
00002
00003
00004
00005
00006 #include "cddefines.h"
00007 #include "taulines.h"
00008 #include "iso.h"
00009 #include "struc.h"
00010 #include "mole.h"
00011 #include "rfield.h"
00012 #include "iterations.h"
00013 #include "h2.h"
00014 #include "dense.h"
00015 #include "opacity.h"
00016 #include "atomfeii.h"
00017 #include "state.h"
00018
00019 static bool lgGet;
00020 static FILE *ioSTATE;
00021
00022
00023
00024 static void state_do( void *pnt , size_t sizeof_pnt )
00025 {
00026 size_t n;
00027 double sanity = 1.,
00028 chk_sanity;
00029 size_t sizeof_sanity =sizeof( sanity );
00030
00031 DEBUG_ENTRY( "state_do()" );
00032
00033
00034 if( sizeof_pnt == 0 )
00035 return;
00036
00037 if( lgGet )
00038 {
00039
00040 if( (n=fread( pnt , 1 , sizeof_pnt , ioSTATE )) - sizeof_pnt )
00041 {
00042 fprintf( ioQQQ, " state_do failed reading state file, wanted %lu got %lu\n",
00043 (unsigned long)sizeof_pnt ,
00044 (unsigned long)n);
00045 puts( "[Stop in state_do]" );
00046 cdEXIT(EXIT_FAILURE);
00047 }
00048
00049 if( (n=fread( &chk_sanity , 1 , sizeof_sanity , ioSTATE )) - sizeof_sanity )
00050 {
00051 fprintf( ioQQQ, " state_do failed reading sanity par of state file, wanted %lu got %lu\n",
00052 (unsigned long)sizeof_sanity ,
00053 (unsigned long)n);
00054 puts( "[Stop in state_do]" );
00055 cdEXIT(EXIT_FAILURE);
00056 }
00057
00058 if( sanity != chk_sanity )
00059
00060 {
00061 fprintf( ioQQQ, " state_do sanity fails in state file, wanted %g got %g\n",
00062 sanity ,
00063 chk_sanity);
00064 puts( "[Stop in state_do]" );
00065 cdEXIT(EXIT_FAILURE);
00066 }
00067 }
00068 else
00069 {
00070
00071 fwrite( pnt , 1 , sizeof_pnt , ioSTATE );
00072
00073 fwrite( &sanity , 1 , sizeof_sanity , ioSTATE );
00074 }
00075
00076 DEBUG_EXIT( "state_do()" );
00077
00078 return;
00079 }
00080
00081
00082 void state_get_put( const char chJob[] )
00083 {
00084 long int ipISO , nelem , ipHi, i ,
00085 iElecHi , iVibHi , iRotHi , iElecLo , iVibLo,
00086 n , ion;
00087 static FILE *ioGET_STATE ,
00088 *ioPUT_STATE;
00089
00090 DEBUG_ENTRY( "state_get_put()" );
00091
00092 if( (strcmp( chJob , "get" ) == 0) )
00093 {
00094 lgGet = true;
00095 if( (ioGET_STATE = fopen( state.chGetFilename , "rb" ))==NULL )
00096 {
00097 fprintf( ioQQQ, " state_get_put cannot open %s for reading.\n Sorry.", state.chGetFilename );
00098 puts( "[Stop in state_get_put]" );
00099 cdEXIT(EXIT_FAILURE);
00100 }
00101 ioSTATE = ioGET_STATE;
00102 }
00103 else if( (strcmp( chJob , "put" ) == 0) )
00104 {
00105 char chFilename[INPUT_LINE_LENGTH];
00106 if( !state.lgPutAll && iteration <= iterations.itermx )
00107 {
00108
00109 DEBUG_EXIT( "state_get_put()" );
00110
00111 return;
00112 }
00113
00114
00115 strcpy( chFilename , state.chPutFilename );
00116
00117 if( state.lgPutAll )
00118 {
00119 char chIteration[INPUT_LINE_LENGTH];
00120 sprintf( chIteration , "_%li", iteration );
00121 strcat( chFilename , chIteration );
00122 }
00123 if( (ioPUT_STATE = fopen( chFilename , "wb" ))==NULL )
00124 {
00125 fprintf( ioQQQ, " state_get_put cannot open %s for writing.\n Sorry.", state.chPutFilename );
00126 puts( "[Stop in state_get_put]" );
00127 cdEXIT(EXIT_FAILURE);
00128 }
00129 ioSTATE = ioPUT_STATE;
00130 }
00131 else
00132 TotalInsanity();
00133
00134 if( state.lgState_print )
00135 fprintf(ioQQQ," Print state quantities, start iso seq \n");
00136
00137 for( ipISO=ipH_LIKE; ipISO<NISO; ++ipISO )
00138 {
00139
00140 for( nelem=ipISO; nelem<LIMELM; ++nelem )
00141 {
00142 if( nelem < 2 || dense.lgElmtOn[nelem] )
00143 {
00144
00145 for( ipHi=1; ipHi < iso.numLevels_max[ipISO][nelem]; ++ipHi )
00146 {
00147 state_do( EmisLines[ipISO][nelem][ipHi] ,
00148 sizeof(EmLine)*(size_t)ipHi );
00149 if( state.lgState_print )
00150 {
00151 fprintf(ioQQQ," start ISO ipISO= %li, nelem= %li, ipHi %li \n",
00152 ipISO ,
00153 nelem ,
00154 ipHi);
00155 for( n=0; n< ipHi; ++n )
00156 {
00157 fprintf(ioQQQ," ISO %li %li %li %li %.4e %.4e \n",
00158 ipISO , nelem , ipHi , n ,
00159 EmisLines[ipISO][nelem][ipHi][n].TauIn ,
00160 EmisLines[ipISO][nelem][ipHi][n].TauTot );
00161 }
00162 fprintf(ioQQQ," end ISO ipISO\n");
00163 }
00164 }
00165
00166 if( state.lgState_print )
00167 {
00168 fprintf(ioQQQ," start Ext ipISO= %li, nelem= %li, got %li \n",
00169 ipISO ,
00170 nelem ,
00171 iso.nLyman_malloc[ipISO] );
00172 }
00173 state_do( iso.ExtraLymanLines[ipISO][nelem] ,
00174 sizeof(EmLine )*(size_t)iso.nLyman_malloc[ipISO] );
00175 if( state.lgState_print )
00176 {
00177 for( n=2; n< iso.nLyman_malloc[ipISO]; ++n )
00178 {
00179 fprintf(ioQQQ," Ext %li %li %li %.4e %.4e \n",
00180 ipISO , nelem , n ,
00181 iso.ExtraLymanLines[ipISO][nelem][n].TauIn ,
00182 iso.ExtraLymanLines[ipISO][nelem][n].TauTot );
00183 }
00184 fprintf(ioQQQ," end Ext ipISO\n");
00185 }
00186 }
00187 }
00188 }
00189
00190 state_do( TauLines , (size_t)(nLevel1+1)*sizeof(EmLine ) );
00191 if( state.lgState_print )
00192 {
00193 for( n=0; n< (nLevel1+1); ++n )
00194 {
00195 fprintf(ioQQQ," Taulines %li %.4e %.4e \n",
00196 n ,
00197 TauLines[n].TauIn ,
00198 TauLines[n].TauTot );
00199 }
00200 }
00201
00202 state_do( TauLine2 , (size_t)nWindLine *sizeof(EmLine ) );
00203 if( state.lgState_print )
00204 {
00205 for( n=0; n< nWindLine; ++n )
00206 {
00207 fprintf(ioQQQ," TauLine2 %li %.4e %.4e \n",
00208 n ,
00209 TauLine2[n].TauIn ,
00210 TauLine2[n].TauTot );
00211 }
00212 }
00213
00214 state_do( UTALines , (size_t)nUTA *sizeof(EmLine ) );
00215 if( state.lgState_print )
00216 {
00217 for( n=0; n< nUTA; ++n )
00218 {
00219 fprintf(ioQQQ," UTALines %li %.4e %.4e \n",
00220 n ,
00221 UTALines[n].TauIn ,
00222 UTALines[n].TauTot );
00223 }
00224 }
00225
00226 state_do( HFLines , (size_t)nHFLines *sizeof(EmLine ) );
00227 if( state.lgState_print )
00228 {
00229 for( n=0; n< nHFLines; ++n )
00230 {
00231 fprintf(ioQQQ," HFLines %li %.4e %.4e \n",
00232 n ,
00233 HFLines[n].TauIn ,
00234 HFLines[n].TauTot );
00235 }
00236 }
00237
00238 state_do( C12O16Rotate, (size_t)nCORotate *sizeof(EmLine ) );
00239 if( state.lgState_print )
00240 {
00241 for( n=0; n< nCORotate; ++n )
00242 {
00243 fprintf(ioQQQ," C12O16Rotate %li %.4e %.4e \n",
00244 n ,
00245 C12O16Rotate[n].TauIn ,
00246 C12O16Rotate[n].TauTot );
00247 }
00248 }
00249
00250 state_do( C13O16Rotate, (size_t)nCORotate *sizeof(EmLine ) );
00251 if( state.lgState_print )
00252 {
00253 for( n=0; n< nCORotate; ++n )
00254 {
00255 fprintf(ioQQQ," C13O16Rotate %li %.4e %.4e \n",
00256 n ,
00257 C13O16Rotate[n].TauIn ,
00258 C13O16Rotate[n].TauTot );
00259 }
00260 }
00261
00262 for( ipHi=1; ipHi < FeII.nFeIILevel; ++ipHi )
00263 {
00264 state_do( Fe2LevN[ipHi] , (size_t)ipHi*sizeof(EmLine) );
00265 if( state.lgState_print )
00266 {
00267 for( n=0; n< ipHi; ++n )
00268 {
00269 fprintf(ioQQQ," Fe2LevN %li %li %.4e %.4e \n",
00270 ipHi , n ,
00271 Fe2LevN[ipHi][n].TauIn ,
00272 Fe2LevN[ipHi][n].TauTot );
00273 }
00274 }
00275 }
00276 for( i=0; i<2; ++i )
00277 {
00278 state_do( opac.TauAbsGeo[i] , (size_t)rfield.nupper*sizeof(float) );
00279 if( state.lgState_print )
00280 {
00281 for( n=0; n< rfield.nupper; ++n )
00282 {
00283 fprintf(ioQQQ," TauAbsGeo %li %li %.4e \n",
00284 i , n ,
00285 opac.TauAbsGeo[i][n] );
00286 }
00287 }
00288
00289 state_do( opac.TauScatGeo[i] , (size_t)rfield.nupper*sizeof(float) );
00290 if( state.lgState_print )
00291 {
00292 for( n=0; n< rfield.nupper; ++n )
00293 {
00294 fprintf(ioQQQ," TauScatGeo %li %li %.4e \n",
00295 i , n ,
00296 opac.TauAbsGeo[i][n] );
00297 }
00298 }
00299
00300 state_do( opac.TauTotalGeo[i], (size_t)rfield.nupper*sizeof(float) );
00301 if( state.lgState_print )
00302 {
00303 for( n=0; n< rfield.nupper; ++n )
00304 {
00305 fprintf(ioQQQ," TauTotalGeo %li %li %.4e \n",
00306 i , n ,
00307 opac.TauAbsGeo[i][n] );
00308 }
00309 }
00310
00311 }
00312
00313
00314 if( h2.lgH2ON )
00315 {
00316 for( iElecHi=0; iElecHi<mole.n_h2_elec_states; ++iElecHi )
00317 {
00318 for( iVibHi=0; iVibHi<=h2.nVib_hi[iElecHi]; ++iVibHi )
00319 {
00320 for( iRotHi=h2.Jlowest[iElecHi]; iRotHi<=h2.nRot_hi[iElecHi][iVibHi]; ++iRotHi )
00321 {
00322
00323
00324
00325 long int lim_elec_lo = 0;
00326 for( iElecLo=0; iElecLo<=lim_elec_lo; ++iElecLo )
00327 {
00328
00329
00330 long int nv = h2.nVib_hi[iElecLo];
00331 if( iElecLo==iElecHi )
00332 nv = iVibHi;
00333 for( iVibLo=0; iVibLo<=nv; ++iVibLo )
00334 {
00335 long nr = h2.nRot_hi[iElecLo][iVibLo];
00336 if( iElecLo==iElecHi && iVibHi==iVibLo )
00337
00338 nr = MAX2(1,iRotHi-1);
00339 state_do( H2Lines[iElecHi][iVibHi][iRotHi][iElecLo][iVibLo] ,
00340 (size_t)(nr+1)*sizeof(EmLine) );
00341 }
00342 }
00343 }
00344 }
00345 }
00346 }
00347
00348
00349 state_do( &struc.nzlim, sizeof(struc.nzlim ) );
00350 state_do( &struc.dr_ionfrac_limit, sizeof(struc.dr_ionfrac_limit ) );
00351 state_do( &struc.nzone, sizeof(struc.nzone ) );
00352
00353 state_do( struc.testr, (size_t)(struc.nzlim)*sizeof(float ) );
00354 state_do( struc.volstr, (size_t)(struc.nzlim)*sizeof(float ) );
00355 state_do( struc.drad_x_fillfac, (size_t)(struc.nzlim)*sizeof(float ) );
00356 state_do( struc.drad, (size_t)(struc.nzlim)*sizeof(float ) );
00357 state_do( struc.histr, (size_t)(struc.nzlim)*sizeof(float ) );
00358 state_do( struc.hiistr, (size_t)(struc.nzlim)*sizeof(float ) );
00359 state_do( struc.ednstr, (size_t)(struc.nzlim)*sizeof(float ) );
00360 state_do( struc.o3str, (size_t)(struc.nzlim)*sizeof(float ) );
00361 state_do( struc.pressure,(size_t)(struc.nzlim)*sizeof(float ) );
00362 state_do( struc.GasPressure ,(size_t)(struc.nzlim)*sizeof(float ) );
00363 state_do( struc.pres_radiation_lines_curr ,(size_t)(struc.nzlim)*sizeof(float ) );
00364 state_do( struc.hden ,(size_t)(struc.nzlim)*sizeof(float ) );
00365 state_do( struc.DenParticles ,(size_t)(struc.nzlim)*sizeof(float ) );
00366 state_do( struc.DenMass,(size_t)(struc.nzlim)*sizeof(float ) );
00367 state_do( struc.depth,(size_t)(struc.nzlim)*sizeof(float ) );
00368 state_do( struc.xLyman_depth , (size_t)(struc.nzlim)*sizeof(float ) );
00369
00370 state_do( struc.coolstr,(size_t)(struc.nzlim)*sizeof(double ) );
00371 state_do( struc.heatstr , (size_t)(struc.nzlim)*sizeof(double ) );
00372
00373 for( nelem=ipHYDROGEN; nelem<(LIMELM+3); ++nelem )
00374 {
00375 for( ion=0; ion<(LIMELM+1); ++ion )
00376 {
00377 state_do( struc.xIonDense[nelem][ion] , (size_t)(struc.nzlim)*sizeof(float ) );
00378 }
00379 }
00380
00381
00382
00383 for( n=0; n<N_H_MOLEC; ++n )
00384 {
00385 state_do( struc.H2_molec[n] , (size_t)(struc.nzlim)*sizeof(float ) );
00386 }
00387 for( n=0; n<mole.num_comole_calc; ++n )
00388 {
00389 state_do( struc.CO_molec[n] , (size_t)(struc.nzlim)*sizeof(float ) );
00390 }
00391
00392 for( nelem=ipHYDROGEN; nelem<LIMELM; ++nelem )
00393 {
00394 state_do( struc.gas_phase[nelem] , (size_t)(struc.nzlim)*sizeof(float ) );
00395 }
00396
00397
00398
00399
00400 opac.lgTauOutOn = true;
00401
00402
00403 fclose( ioSTATE );
00404
00405 DEBUG_EXIT( "state_get_put()" );
00406
00407 return;
00408 }
00409