dustem_read_all.pro 9.97 KB
FUNCTION dustem_read_all,dir_in,silent=silent,help=help

;+
; NAME:
;    dustem_read_all
; PURPOSE:
;    Reads all Dustem input data
; CATEGORY:
;    Dustem
; CALLING SEQUENCE:
;    st=dustem_read_all(dir_in,silent=silent,help=help)
; INPUTS:
;    dir_in: input directory
; OPTIONAL INPUT PARAMETERS:
;    None
; OUTPUTS:
;    st: input structure
; OPTIONAL OUTPUT PARAMETERS:
;    None
; ACCEPTED KEY-WORDS:
;    silent    = If set, function is silent
;    help      = If set, print this help
; COMMON BLOCKS:
;    None
; SIDE EFFECTS:
;    None
; RESTRICTIONS:
;    The dustem idl wrapper must be installed
; PROCEDURE:
;    None
; EXAMPLES
;    dustem_init
;    dir=getenv('DUSTEM_SOFT_DIR')+'/src/dustem3.8_web/'
;    st=dustem_read_all(dir)
; MODIFICATION HISTORY:
;    Written by J.-Ph. Bernard
;    see evolution details on the dustem cvs maintained at CESR
;    Contact J.-Ph. Bernard (Jean-Philippe.Bernard@cesr.fr) in case of problems.
;-

IF keyword_set(help) THEN BEGIN
  doc_library,'dustem_read_all'
  st=0.
  goto,the_end
ENDIF

;IF getenv('DUSTEM_WHICH') EQ 'WEB3p8' THEN BEGIN
IF !dustem_which EQ 'WEB3p8' THEN BEGIN
  st=dustem_read_all_web3p8(dir_in,silent=silent)
  goto,ionfrac
ENDIF

;IF getenv('DUSTEM_WHICH') EQ 'VERSTRAETE' THEN BEGIN
IF !dustem_which EQ 'VERSTRAETE' THEN BEGIN
  st=dustem_read_all_lv(dir_in,silent=silent)
  goto,ionfrac
ENDIF

;== note: the output keywords are set only for LV version
file=dir_in+'GRAIN.DAT'
st_grains=dustem_read_grain(file,silent=silent)

;stop

file=dir_in+'TAILLE.DAT'
st_taille=dustem_read_taille(file,silent=silent)

file=dir_in+'PROPMASS.DAT'
st_propmass=dustem_read_propmass(file,silent=silent)

;=== This does not exist in MC's new version
;IF getenv('DUSTEM_WHICH') EQ 'DESERT' THEN BEGIN
IF !dustem_which EQ 'DESERT' THEN BEGIN
  file=dir_in+'GEMISSIV.DAT'
  st_gemissiv=dustem_read_gemissiv(file,silent=silent)
ENDIF

file=dir_in+'ISRF.DAT'
st_isrf=dustem_read_isrf(file,silent=silent,Nisrf=Nisrf)

;stop

;=== This does not exist in XD's new version
;IF getenv('DUSTEM_WHICH') EQ 'COMPIEGNE' THEN BEGIN
IF !dustem_which EQ 'COMPIEGNE' THEN BEGIN
  Qabs_files=findfile(dir_in+'QABS_*.DAT',count=Nfiles)
  st_qabs=ptrarr(Nfiles)
  FOR i=0,Nfiles-1 DO BEGIN
    st=dustem_read_qabs(Qabs_files(i),silent=silent)
    st_qabs(i)=ptr_new(st)
  ENDFOR
ENDIF
;IF getenv('DUSTEM_WHICH') EQ 'DESERT' THEN BEGIN
IF !dustem_which EQ 'DESERT' THEN BEGIN
  file=dir_in+'QABS.DAT'
  st_qabs=dustem_read_qabs_desert(file,silent=silent)
ENDIF


file=dir_in+'SPECEM.DAT'
st_specem=dustem_read_specem(file,silent=silent)

file=dir_in+'CALOR.DAT'
st_calor=dustem_read_calor(file,silent=silent)

;=== This does not exist in MC's new version
;IF getenv('DUSTEM_WHICH') EQ 'DESERT' THEN BEGIN
IF !dustem_which EQ 'DESERT' THEN BEGIN
  file=dir_in+'IONFRAC.DAT'
  st_ionfrac=dustem_read_ionfrac(file,silent=silent)
ENDIF

;=== This does not exist in XD's new version
;IF getenv('DUSTEM_WHICH') EQ 'COMPIEGNE' THEN BEGIN
IF !dustem_which EQ 'COMPIEGNE' THEN BEGIN
  file=dir_in+'LAMBDA.DAT'
  st_lambda=dustem_read_lambda(file,silent=silent)
ENDIF


Ngrains=n_elements(st_grains)

one_stt_grains={ $
type:st_grains(0).type, $
albmax:st_grains(0).albmax, $
densgr:st_grains(0).densgr, $
ngem:st_grains(0).ngem, $
hydro:st_grains(0).hydro, $
ioni:st_grains(0).ioni, $
alpha:st_taille(0).alpha, $
tmin:st_taille(0).tmin, $
tmax:st_taille(0).tmax, $
ndiscr:st_taille(0).ndiscr, $
propmass:st_propmass(0).propmass}

sst_grains=replicate(one_stt_grains,Ngrains)

sst_grains.type=st_grains.type
sst_grains.albmax=st_grains.albmax
sst_grains.densgr=st_grains.densgr
sst_grains.ngem=st_grains.ngem
sst_grains.hydro=st_grains.hydro
sst_grains.ioni=st_grains.ioni
sst_grains.alpha=st_taille.alpha
sst_grains.tmin=st_taille.tmin
sst_grains.tmax=st_taille.tmax
sst_grains.ndiscr=st_taille.ndiscr
sst_grains.propmass=st_propmass.propmass


;IF getenv('DUSTEM_WHICH') EQ 'DESERT' THEN BEGIN
IF !dustem_which EQ 'DESERT' THEN BEGIN
  st={Ngrains:Ngrains,grains:sst_grains, $
      gemissiv:st_gemissiv,isrf:st_isrf,qabs:st_qabs,calor:st_calor,specem:st_specem,ionfrac:st_ionfrac}
ENDIF
;IF getenv('DUSTEM_WHICH') EQ 'COMPIEGNE' THEN BEGIN
IF !dustem_which EQ 'COMPIEGNE' THEN BEGIN
  st={Ngrains:Ngrains,grains:sst_grains, $
      isrf:st_isrf,qabs:st_qabs,calor:st_calor,specem:st_specem,lambda:st_lambda}
ENDIF
;IF getenv('DUSTEM_WHICH') EQ 'VERSTRAETE' THEN BEGIN
IF !dustem_which EQ 'VERSTRAETE' THEN BEGIN
  st={Ngrains:Ngrains,grains:sst_grains, $
      isrf:st_isrf,qabs:st_qabs,calor:st_calor,specem:st_specem,lambda:st_lambda}
ENDIF

ionfrac:

;=== JPB added tests on !dustem_verbose for messages
;stop
;NF on October 2009 : test IONFRACPAH keyword (only if 'VERSTRAETE' model)
;IF getenv('DUSTEM_WHICH') EQ 'VERSTRAETE' THEN BEGIN
IF !dustem_which EQ 'VERSTRAETE' THEN BEGIN
   IF !dustem_verbose NE 0 THEN message, "============= IONization FRACtion of the PAHs =============", /info
;Get master-keywords
   master_keywords = strsplit(st.keywords,' ',/regex,/extr)
;check presence of IONFRACPAH in master-keywords
   tmp = where(master_keywords eq 'IONFRACPAH',test_ionfracpah)
;check presence of dustem_create_ionfrac in the *!param_desc
   ;JPB: added test on validity of param_desc
   IF ptr_valid((*!dustem_fit).param_descs) THEN BEGIN
     tmp2 = total(stregex(*(*!dustem_fit).param_descs,'ionfrac',/bool,/fold_case))
   ENDIF ELSE BEGIN
     tmp2=0
   ENDELSE
   test_dustemcreateionfrac = (tmp2 GT 0) ? 1 : 0
;if IONFRACPAH or "dustem_create_ionfrac" is present ...
   IF test_ionfracpah or test_dustemcreateionfrac THEN BEGIN
      IF !dustem_verbose NE 0 THEN message, "You want the IONization FRACtion of the PAHs to be computed by the model", /info
;  Check if there are both PAH1 and PAH0 provided
      pah0 = (where(strmid(st.grains.type,0,4) eq 'PAH0', count0))(0)
      pah1 = (where(strmid(st.grains.type,0,4) eq 'PAH1', count1))(0)
      IF count0 eq count1 and count0 ne 0 THEN BEGIN
         IF !dustem_verbose NE 0 THEN BEGIN
           message, "and you have provided me with both PAH0 and PAH1 components.", /info
           message, "I will calculate the fractions.", /info
           message, "I will assume you have forced them to keep the same abundance (initial values + tied).", /info
         ENDIF
      ENDIF ELSE BEGIN
         IF !dustem_verbose NE 0 THEN BEGIN
           message, "but you have NOT provided me with both PAH0 and PAH1 components.", /info
           message, "Please correct and rerun the code."
         ENDIF
      ENDELSE
;  Check presence of SIZE in master-keywords
      tmp = where(master_keywords eq 'SIZE',test_size)
;  Check if MIX is a keyword provided in GRAIN.DAT for PAH0 and PAH1
      pah0_keyword = st.grains(pah0).flag
      pah1_keyword = st.grains(pah1).flag
      tmp = where(pah0_keyword eq 'MIX',test_mix_pah0)
      tmp = where(pah1_keyword eq 'MIX',test_mix_pah1)
; if SIZE is not present ...
      IF not test_size THEN BEGIN
;   if MIX is not present for both PAH components ...
         IF not test_mix_pah0 or not test_mix_pah1 THEN BEGIN
            IF !dustem_verbose NE 0 THEN BEGIN
              message, "You provide me with neither SIZE master-keyword nor MIX keyword for both PAHs components.", /info
              message, "I will add the MIX keyword for both PAHs components and generate 50%-50% MIX_xxx.DAT files.", /info
              message, "I will assume you have forced them to have the same size distributions.", /info
            ENDIF
;      Add MIX keyword to both PAH components (had to concatenate them
;      to order the F90 code to read them as 1 column)
            if not test_mix_pah0 then $
               st.grains(pah0).flag = st.grains(pah0).flag+'MIX'
            if not test_mix_pah1 then $
               st.grains(pah1).flag = st.grains(pah1).flag+'MIX'
;      Update structure and generate MIX_xxx.DAT files
;            full_st0 = ptr_new({file:getenv('DUSTEM_DAT')+'/MIX_'+st.grains(pah0).type+'.DAT',fmix:fltarr(st.grains(pah0).ndiscr)+0.5})
;            full_st1 = ptr_new({file:getenv('DUSTEM_DAT')+'/MIX_'+st.grains(pah1).type+'.DAT',fmix:fltarr(st.grains(pah1).ndiscr)+0.5})
            full_st0 = ptr_new({file:!dustem_dat+'/MIX_'+st.grains(pah0).type+'.DAT',fmix:fltarr(st.grains(pah0).ndiscr)+0.5})
            full_st1 = ptr_new({file:!dustem_dat+'/MIX_'+st.grains(pah1).type+'.DAT',fmix:fltarr(st.grains(pah1).ndiscr)+0.5})
            full_st = ptrarr(2) & full_st(0)=full_st0 & full_st(1)=full_st1
;            dustem_write_mix, getenv('DUSTEM_DAT'), full_st
            dustem_write_mix,!dustem_dat, full_st
            st.mix(pah0) = ptr_new(dustem_read_mix((*full_st0).file))
            st.mix(pah1) = ptr_new(dustem_read_mix((*full_st1).file))
            !run_ionfrac = 1.
         ENDIF ELSE BEGIN
            IF !dustem_verbose NE 0 THEN BEGIN
              message, "You provide me with the MIX keyword for both PAHs components.", /info
              message, "I will use your MIX_xxx.DAT files to update the fractions.", /info
            ENDIF
            !run_ionfrac = 1.
         ENDELSE
; if SIZE is present
      ENDIF ELSE BEGIN
         IF !dustem_verbose NE 0 THEN BEGIN
           message, "You provide me with the SIZE master-keyword.", /info
           message, "I will use your SIZE_xxx.DAT files to update the fractions.", /info
           message, "I will assume you have forced them to have the same size distributions.", /info
         ENDIF
         !run_ionfrac = 2.
      ENDELSE
;if IONFRACPAH is NOT present ...
   ENDIF ELSE BEGIN
      IF !dustem_verbose NE 0 THEN BEGIN
        message, "You don't want the IONization FRACtion of the PAHs to be computed by the model", /info
      ENDIF
      !run_ionfrac = 0.
   ENDELSE
   
   IF test_dustemcreateionfrac THEN BEGIN
      !run_ionfrac = -1. * !run_ionfrac
   ENDIF
   IF !dustem_verbose NE 0 THEN BEGIN
     message, "============= IONization FRACtion of the PAHs =============", /info
     wait, 5                      ;might be a bit long, but I want to be sure the user sees it
   ENDIF
  ;JPB: The above is stupid, specially before I added the !dustem_verbose test
ENDIF
;NF on October 2009 : test IONFRACPAH keyword

the_end:

RETURN,st

END