FUNCTION dustem_plugin_dl07_isrf_model, key=key, val=val, scope=scope, paramtag=paramtag, help=help, Umean=Umean,st=st ;+ ; NAME: ; dustem_plugin_dl07_isrf_model ; ; PURPOSE: ; Returns the dust spectrum after heating by a Draine-like ISRF ; with Umin, Umax, gamma, alpha parameters described by the val keyword ; ; CATEGORY: ; DUSTEM Wrapper, Plugin ; ; CALLING SEQUENCE: ; sed=dustem_plugin_dl07_isrf_model(key=,val=,Umean=,/paramtag][,/scope][,/help]) ; ; INPUTS: ; None ; ; OPTIONAL INPUT PARAMETERS: ; key = input parameter number. ; 1: gamma ; 2: alpha ; 3: Umin ; 4: Umax ; val = input parameter values for the above. ; ; OUTPUTS: ; None ; ; OPTIONAL OUTPUT PARAMETERS: ; Umean = the average radiation field ; ; ACCEPTED KEY-WORDS: ; help = if set, print this help ; ; COMMON BLOCKS: ; None ; ; SIDE EFFECTS: ; None ; ; RESTRICTIONS: ; The DustEM fortran code must be installed ; The DustEMWrap IDL code must be installed ; The path of the ISRF must be assigned to one of the DustEMWrap free pointers. ; The user-defined ISRF needs to be on the same dustem ISRF grid. ; ; PROCEDURE: ; ; EXAMPLES ; res=dustem_dl07_isrf_model() ; ; 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_dl07_isrf_model' goto,the_end ENDIF spec=0. IF keyword_set(scope) THEN BEGIN out=0 & st=0 goto, the_end ENDIF IF keyword_set(paramtag) THEN BEGIN out=0 & st=0 goto, the_end ENDIF ;dustem_print_params ;stop ;==== default parameter values Umin=1. Umax=1.e6 alpha=2. gamma=0. ;default is no contribution from U<>1. IF keyword_set(key) THEN BEGIN ind=where(key EQ 1,count) ;gamma parameter as in DL07 IF count NE 0 then begin gamma=val[ind[0]] ENDIF ind=where(key EQ 2,count) ;gamma parameter as in DL07 IF count NE 0 then begin alpha=val[ind[0]] ENDIF ind=where(key EQ 3,count) ;gamma parameter as in DL07 IF count NE 0 then begin Umin=val[ind[0]] ENDIF ind=where(key EQ 4,count) ;gamma parameter as in DL07 IF count NE 0 then begin Umax=val[ind[0]] ENDIF ENDIF ;This is the average radiation field in DL07 Umean=(1.-gamma)*Umin+gamma*Umin*alog(Umax/Umin)/(1.-Umin/Umax) lambir=dustem_get_wavelengths() Nwavs=n_elements(lambir) ;spec=fltarr(Nwavs,3) ; if ever one day we enforce IQU outputs ;spec2=fltarr(Nwavs,3) spec=fltarr(Nwavs) spec2=fltarr(Nwavs) Ngrains=(*!dustem_params).ngrains spec_grains=fltarr(Nwavs,ngrains) spec2_grains=fltarr(Nwavs,ngrains) ;==== save everything to put back later saved_params=0 & saved_pd=0 & saved_pinfo=0 & saved_fpd=0 IF ptr_valid(!dustem_params) THEN BEGIN dparams=*!dustem_params saved_params=1 END IF ptr_valid((*!dustem_fit).param_descs) THEN BEGIN pd=*(*!dustem_fit).param_descs iv=*(*!dustem_fit).param_init_values cv=*(*!dustem_fit).current_param_values saved_pd=1 ENDIF IF ptr_valid(!dustem_parinfo) THEN BEGIN parinfo=*(!dustem_parinfo) saved_pinfo=1 ENDIF IF ptr_valid((*!dustem_fit).fixed_param_descs) THEN BEGIN fpd=*(*!dustem_fit).fixed_param_descs fiv=*(*!dustem_fit).fixed_param_init_values saved_fpd=1 ENDIF ;==== Run dustem with G0(a.k.a. U)=1. param_desc=['(*!dustem_params).G0'] param_values=[Umin] dustem_init_params,!dustem_model,param_desc,param_values ;stop st=dustem_run(param_values) spec1=st.sed.em_tot spec=(1.-gamma)*spec1 for k=0,ngrains-1 do begin this_spec=st.sed.(k+1) ; position 0 is the wavelengths spec_grains[*,k]=(1.-gamma)*this_spec endfor ;==== add contribution of dust seeing a power law of U spec2[*]=0. ;NUs=3L NUs=10L ;This seems sufficient ;NUs=50L ;U values over which integration will be performed Us=range_gen(NUs,[Umin,Umax],/log) specs=fltarr(NUs,Nwavs) specs_grains=fltarr(NUs,Nwavs,Ngrains) ;stop ffacts=fltarr(NUs) IF gamma NE 0. THEN BEGIN fact=gamma*(alpha-1.)/(Umin^(1.-alpha)-Umax^(1.-alpha)) FOR i=0L,NUs-1 DO BEGIN param_values[0]=Us[i];^(-1.*alpha) ;stop st=dustem_run(param_values) ffacts[i]=Us[i]^(-1.*alpha)*fact specs[i,*]=ffacts[i]*st.sed.em_tot for k=0,ngrains-1 do specs_grains[i,*,k]=ffacts[i]*st.sed.(k+1) ENDFOR ;integrate over U ;stop FOR j=0L,Nwavs-1 DO BEGIN integ=integral(Us,reform(specs[*,j]),Umin,Umax,/no_check) spec[j]=spec[j]+integ[0] for k=0,ngrains-1 do begin integ_grains=integral(Us,reform(specs_grains[*,j,k]),Umin,Umax,/no_check) spec_grains[j,k]=spec_grains[j,k]+integ_grains[0] endfor ENDFOR ENDIF ;This is to update keyword st with the final spectra. ;Not necessary here, but to be used in plugins with scope 'REPLACE_FORTRAN' which actually do not call the Fortran at all. ;Ngrains=3 ;st=dustem_make_empty_fortran_st(Ngrains) st.sed.em_tot=spec for k=0,ngrains-1 do st.sed.(k+1)=spec_grains[*,k] ;restore params to their original values if saved_pd eq 1 then begin (*!dustem_fit).param_descs=ptr_new(pd) (*!dustem_fit).param_init_values=ptr_new(iv) (*!dustem_fit).current_param_values=ptr_new(cv) end if saved_fpd eq 1 then begin (*!dustem_fit).fixed_param_descs=ptr_new(fpd) (*!dustem_fit).fixed_param_init_values=ptr_new(fiv) end if saved_pinfo eq 1 then begin !dustem_parinfo=ptr_new(parinfo) end if saved_params eq 1 then begin !dustem_params=ptr_new(dparams) end the_end: scope='REPLACE_FORTRAN' ;parameter tags. paramtag=['gamma','alpha','Umin','Umax'] RETURN,spec END