dustem_read_align.pro 3.25 KB
FUNCTION dustem_read_align,dir_in,st_grains,help=help,silent=silent

;+
; NAME:
;   dustem_read_align
;
; PURPOSE:
;   reads the ALIGN.DAT file
;
; CATEGORY:
;    DustEMWrap, Distributed, HighLevel, Initialization
;
; CALLING SEQUENCE:
;   dustem_read_align,dir_in,st_grains[,/help]
;
; INPUTS:
;    dir_in      : input directory where to read the file from
;    st_grains   : structure describing grain parameters for various grains (usually !dustem.grains)
;
; OPTIONAL INPUT PARAMETERS:
;    None
;
; OUTPUTS:
;    st : dustem data structure
;
; OPTIONAL OUTPUT PARAMETERS:
;    None
;
; ACCEPTED KEY-WORDS:
;    silent       : if set, run silent (not used, actually)
;    help         : writes this help
;
; COMMON BLOCKS:
;    None
;
; SIDE EFFECTS:
;
; RESTRICTIONS:
;    The DustEM fortran code must be installed
;    The DustEMWrap idl code must be installed
;
; PROCEDURES AND SUBROUTINES USED  
;
; EXAMPLES
;
; MODIFICATION HISTORY:
;    Evolution details on the DustEMWrap gitlab.
;    See http://dustemwrap.irap.omp.eu/ for FAQ and help.  
;-

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

file=dir_in+(*!dustem_inputs).align
openr,unit,file,/get_lun
Nlines=0L
str=''
WHILE not eof(unit) DO BEGIN
      readf,unit,str
      Nlines=Nlines+1
ENDWHILE
close,unit
free_lun,unit

;== now read the file
openr,unit,file,/get_lun
ncurrent=0L
REPEAT BEGIN
      readf,unit,str
      ncurrent=ncurrent+1
      first_char=strmid(str,0,1)
ENDREP UNTIL first_char NE '#'
key_str=str

IF stregex(key_str, 'lin', /bool) THEN !run_lin = 1
IF stregex(key_str, 'univ', /bool) THEN !run_univ = 1
IF stregex(key_str, 'circ', /bool) THEN !run_circ = 1
IF stregex(key_str, 'anis', /bool) THEN !run_anis = 1
IF stregex(key_str, 'rrf', /bool) THEN !run_rrf = 1

readf,unit,str,format='(A100)'
xx=strsplit(str,' ',/regex,/extr)
anisG0 = float(xx(0))
ncurrent+=+1
nalig=nlines-ncurrent  
;stop

one_st={aligned:0.,law:'',athresh:0.,plev:0.,pstiff:0.,TdsTg:0.,a0:0.,rvcut:0.}
Ngrains=n_elements(st_grains)
st=replicate(one_st,Ngrains)

is_aligned=stregex(st_grains.type_keywords, 'pol', /bool)

FOR i=0L,Ngrains-1 DO BEGIN
  IF is_aligned[i] THEN BEGIN
    readf,unit,str,format='(A100)'
    strv=str_sep(strcompress(strtrim(str,2)),' ')
    Nstrv=n_elements(strv)
  
    ii=0L
    st(i).law=strv[ii] & ii=ii+1

    ; IDG
    IF stregex(st(i).law, 'idg', /bool) THEN BEGIN
      st[i].TdsTg = strv[ii] & ii=ii+1
      st[i].a0    = strv[ii] & ii=ii+1
      st[i].rvcut = strv[ii] & ii=ii+1
    ENDIF

    ; RAT
    IF stregex(st[i].law, 'rat', /bool) THEN BEGIN
    ENDIF

    ; PARAMETRIC
    IF stregex(st[i].law, 'par', /bool) THEN BEGIN
      ; Grain radius Threshold for alignment, given in microns and converted in cm
      st[i].athresh = strv[ii] & ii=ii+1
      st[i].pstiff  = strv[ii] & ii=ii+1
      st[i].plev    = strv[ii] & ii=ii+1
    ENDIF
    
    st[i].aligned = stregex(st_grains[i].type_keywords, 'pol', /bool)
    IF !run_univ eq 1 THEN BEGIN
      st = replicate(st(i),Ngrains)
      st[i].aligned = stregex(st_grains[i].type_keywords, 'pol', /bool)
      ind=where(is_aligned eq 0)
      st(ind)=one_st
      break  
    ENDIF
    
  ENDIF
ENDFOR

close,unit
free_lun,unit

full_st={keywords:key_str,anisG0:anisG0,gamma:0,grains:st}


the_end:

RETURN,full_st



END