;+ ; Project : Course Computer Project ; ; Name : RDPOLYMODEL ; ; Purpose : Procedure to read a polytrope output file. ; ; Explanation : This program is used to read the output data generated ; by a polytrope run using polytrope.pro. ; ; Use : RDPOLYMODEL, FILENAME, FTITLE, FPOLY_INDEX, FHI, FXI, $ ; FPHI, FTHETA, FXI2XI_S, FRHO_RATIO, FCEN2AVEDENS, $ ; FMFCONST, FMRCONST, FKPARAM, FPCONST ; ; Inputs : FILENAME: The name of the POLYTROPE run output file. [STRING] ; ; Opt. Inputs : None. ; ; Outputs : FTITLE: The header title located in the output file. [STRING] ; ; FPOLY_INDEX: The index of the polytrope in the POLYTROPE run, ; where 0 <= POLY_INDEX < 5. Note that POLY_INDEX >= ; 5 produces a polytrope with infinite radius. [FLOAT] ; ; FHI: The initial step size of the depths integration in ; the POLYTROPE run. [FLOAT] ; ; FXI: The dimensionless depth scale factor of the POLYTROPE ; run. [DOUBLE array] ; ; FPHI: The derivative dTHETA/dXI. [DOUBLE array] ; ; FTHETA: Dimensionless scale factor of density (RHO) defined ; by RHO = RHO_CENTRAL * THETA^POLY_INDEX. ; [DOUBLE array] ; ; FXI2XI_S: Ratio of depth XI to surface XI. [DOUBLE array] ; ; FRHO_RATIO: The ratio of the density (RHO) to the average ; density (RHOBAR). [DOUBLE array] ; ; FCEN2AVEDENS: The ratio of the central density to the ; average density. [DOUBLE] ; ; FMFCONST: Mass Function constant. [DOUBLE] ; ; FMRCONST: Mass-radius relation constant. [DOUBLE] ; ; FKPARAM: K-parameter constant. [DOUBLE] ; ; FPCONST: Pressure constant. [DOUBLE] ; ; Opt. Outputs: None. ; ; Keywords : ERRMSG: If defined and passed, then any error messages will ; be returned to the user in this parameter rather than ; being printed internally by this procedure. If no ; errors are encountered, then a null string is ; returned. In order to use this feature, the string ; ERRMSG must be defined first, e.g., ; ; ERRMSG = '' ; RDPOLYMODEL, FILENAME, FTITLE, FPOLY_INDEX, FHI, $ ; FXI, FPHI, FTHETA, FXI2XI_S, FRHO_RATIO, $ ; FCEN2AVEDENS, FMFCONST, FMRCONST, FKPARAM, $ ; FPCONST, ERRMSG=ERRMSG ; IF ERRMSG(0) NE '' THEN ... ; ; Calls : None. ; ; Common : None. ; ; Restrictions: Requires IDL Version 5.0 or later. ; ; Side effects: None. ; ; Category : Class project, stellar modeling. ; ; Prev. Hist. : Based on the PRINTOUT procedure of POLYTROPE. ; ; Written : Donald G. Luttermoser, ETSU/Physics, 22 Sep 2011. ; ; Modified : Version 1, Donald G. Luttermoser, ETSU/Physics, 22 Sep 2011 ; Initial program. ; ; Version : Version 1, 22 September 2011. ; ;- PRO RDPOLYMODEL, FILENAME, FTITLE, FPOLY_INDEX, FHI, FXI, FPHI, FTHETA, $ FXI2XI_S, FRHO_RATIO, FCEN2AVEDENS, FMFCONST, FMRCONST, FKPARAM, $ FPCONST, ERRMSG=ERRMSG ; ON_ERROR, 2 ; Return to caller if error is encountered. EMESS = '' ; Set to non-null string if error is encountered. ; ; Check for number of passed input parameters. ; IF N_PARAMS() NE 14 THEN BEGIN EMESS = ['Syntax: RDPOLYMODEL, FILENAME, FTITLE, FPOLY_INDEX, FHI, '+ $ 'FXI, FPHI, FTHETA,', 'FXI2XI_S, FRHO_RATIO, FCEN2AVEDENS, '+ $ 'FMFCONST, FMRCONST, FKPARAM, FPCONST'] GOTO, HANDLE_ERROR ENDIF ; ; Define parameters and initialize output parameters. ; RDLINE = '' & ASK = 'Y' FTITLE = '' & FPOLY_INDEX = 0. & FHI = 0. FCEN2AVEDENS = 0.D0 & FMFCONST = 0.D0 & FMRCONST = 0.D0 FKPARAM = 0.D0 & FPCONST = 0.D0 & FXI = 0.D0 & FPHI = 0.D0 FTHETA = 0.D0 & FXI2XI_S = 0.D0 & FRHO_RATIO = 0.D0 ; ; Open the output data file to be read. ; OPENR, URD, FILENAME, ERROR=IERR, /GET_LUN IF IERR NE 0 THEN BEGIN EMESS = !ERROR_STATE.MSG GOTO, HANDLE_ERROR ENDIF ; QFILE_END = 0 WHILE QFILE_END EQ 0 DO BEGIN READF, URD, RDLINE QTITLE = STRPOS(RDLINE, 'TITLE: ') QINDEX = STRPOS(RDLINE, 'INDEX: ') QSTEPS = STRPOS(RDLINE, 'Initial step size: ') QDATAS = STRPOS(RDLINE, 'IDEPTH ') QC2ADE = STRPOS(RDLINE, 'Central Density/Average Density: ') QMFCON = STRPOS(RDLINE, 'Mass Function constant: ') QMRADC = STRPOS(RDLINE, 'Mass-Radius relation constant: ') QKPARA = STRPOS(RDLINE, 'K-parameter constant: ') QPCONS = STRPOS(RDLINE, 'Pressure constant: ') QDEND = STRPOS(RDLINE, 'End of Data') ; ; Retrieve the header data. ; IF QTITLE GT 1 THEN FTITLE = STRTRIM(STRMID(RDLINE, QTITLE+7), 2) IF QINDEX GT 1 THEN FPOLY_INDEX = FLOAT(STRMID(RDLINE, QINDEX+7)) IF QSTEPS GT 1 THEN FHI = FLOAT(STRMID(RDLINE, QSTEPS+19)) IF QC2ADE GT 1 THEN FCEN2AVEDENS = DOUBLE(STRMID(RDLINE, QC2ADE+33)) IF QMFCON GT 1 THEN FMFCONST = DOUBLE(STRMID(RDLINE, QMFCON+24)) IF QMRADC GT 1 THEN FMRCONST = DOUBLE(STRMID(RDLINE, QMRADC+31)) IF QKPARA GT 1 THEN FKPARAM = DOUBLE(STRMID(RDLINE, QKPARA+22)) IF QPCONS GT 1 THEN FPCONST = DOUBLE(STRMID(RDLINE, QPCONS+19)) ; ; Retrieve the depth dependent data. ; IF QDATAS GT -1 THEN BEGIN IDATA = 1 READF, URD, RDLINE ; Blank line after header. WHILE IDATA EQ 1 DO BEGIN READF, URD, RDLINE SLEN = STRLEN(RDLINE) IF SLEN GT 5 THEN BEGIN IDEPTH = FIX(STRMID(RDLINE, 0, 6)) IF IDEPTH EQ 0 THEN BEGIN FXI = DOUBLE(STRMID(RDLINE, 6, 15)) FPHI = DOUBLE(STRMID(RDLINE, 6+15, 15)) FTHETA = DOUBLE(STRMID(RDLINE, 6+2*15, 15)) FXI2XI_S = DOUBLE(STRMID(RDLINE, 6+3*15, 15)) FRHO_RATIO = DOUBLE(STRMID(RDLINE, 6+4*15, 15)) ENDIF ELSE BEGIN FXI = [FXI, DOUBLE(STRMID(RDLINE, 6, 15))] FPHI = [FPHI, DOUBLE(STRMID(RDLINE, 6+15, 15))] FTHETA = [FTHETA, DOUBLE(STRMID(RDLINE, 6+2*15, 15))] FXI2XI_S = [FXI2XI_S, $ DOUBLE(STRMID(RDLINE, 6+3*15, 15))] FRHO_RATIO = [FRHO_RATIO, $ DOUBLE(STRMID(RDLINE, 6+4*15, 15))] ENDELSE ENDIF ELSE IDATA = 0 ENDWHILE ENDIF ; ; Note that this is set at the last line of file. ; IF QDEND GT -1 THEN QFILE_END = 1 ENDWHILE FREE_LUN, URD ; PRINT, 'File ' + FILENAME + ' has successfully been read.' ; IF EMESS NE '' THEN GOTO, HANDLE_ERROR IF N_ELEMENTS(ERRMSG) GT 0 THEN ERRMSG=EMESS RETURN ; ; Error handling portion of the procedure. ; HANDLE_ERROR: ; IF N_ELEMENTS(ERRMSG) EQ 0 THEN BEGIN FOR JJ = 0, 1 DO PRINT, EMESS[JJ] ENDIF FREE_LUN, URD ERRMSG = EMESS RETURN END