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: ; None ; OPTIONAL OUTPUT PARAMETERS: ; None ; ACCEPTED KEY-WORDS: ; silent : if set, run silent (not used, actually) ; help : writes this help ; COMMON BLOCKS: ; None ; SIDE EFFECTS: ; a File is written ; 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=-1 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