dustem_read_align.pro
3.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
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