PRO dustem_init_params,model,pd,iv, $ fpd=fpd,fiv=fiv $ ,ulimed=ulimed,llimed=llimed,ulims=ulims,llims=llims $ ,tied=tied,fixed=fixed $ ,polarization=polarization ;+ ; NAME: ; dustem_init_params ; ; PURPOSE: ; This routine initialises the free and fixed parameters of both the ; dust models and plugins. It does some basic sanity checking. ; ; CATEGORY: ; DustEMWrap, Distributed, Mid-Level, Initialization ; ; CALLING SEQUENCE: ; dustem_init_params, pd, iv, [,fpd=fpd,fiv=fiv,ulimed=ulimed,llimed=llimed,ulims=ulims,lolims=llims,tied=tied,fixed=fixed] ; ; INPUTS: ; model -- the dust model ; pd -- the parameter description vector ; iv -- the initial values of the free parameters ; ; OPTIONAL INPUT PARAMETERS: ; ; ; OUTPUTS: ; None ; ; OPTIONAL OUTPUT PARAMETERS: ; None ; ; ACCEPTED KEY-WORDS: ; model = specifies the interstellar dust mixture used by DustEM ; 'MC10' model from Compiegne et al 2010 (default) ; 'DBP90' model from Desert et al 1990 ; 'DL01' model from Draine & Li 2001 ; 'WD01_RV5p5B' model from Weingartner & Draine 2002 with Rv=5.5 ; 'DL07' model from Draine & Li 2007 ; 'J13' model from Jones et al 2013, as updated in ; Koehler et al 2014 ; 'G17_ModelA' model A from Guillet et al (2018). Includes ; polarisation. See Tables 2 and 3 of that paper for details. ; 'G17_ModelB' model B from Guillet et al (2018) ; 'G17_ModelC' model C from Guillet et al (2018) ; 'G17_ModelD' model A from Guillet et al (2018) ; 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 ; ; PROCEDURES AND SUBROUTINES USED: ; dustem_init_parinfo ; dustem_init_plugins ; dustem_init_fixed_params ; ; EXAMPLES ; ; MODIFICATION HISTORY: ; Written by AH October-2022 ; 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_init_params' goto,the_end END Npar=n_elements(pd) Niv=n_elements(iv) if Npar ne Niv then begin message, 'Number of parameters does not equal number of initial values provided',/info stop end if keyword_set(ulimed) then begin Nulimed=n_elements(ulimed) if Npar ne Nulimed then begin message, 'Number of parameters does not equal number of upper limit flags',/info stop end end if keyword_set(ulims) then begin Nulims=n_elements(ulims) if Npar ne Nulims then begin message, 'Number of upper limits must equal number of parameters (use ulimed to specify ON/OFF for each parameter)',/info stop end end if keyword_set(llimed) then begin Nllimed=n_elements(llimed) if Npar ne Nllimed then begin message, 'Number of parameters does not equal number of lower limit flags',/info stop end end if keyword_set(llims) then begin Nllims=n_elements(llims) if Npar ne Nllims then begin message, 'Number of lower limits must equal number of parameters (use llimed to specify ON/OFF for each parameter)',/info stop end end if keyword_set(fpd) then begin Nfpar=n_elements(fpd) Nfiv=n_elements(fiv) if Nfpar ne Nfiv then begin message, 'Number of fixed parameters does not equal number of fixed initial values',/info stop end ;== CHECK IF USER HAS MADE SOMETHING FIXED AND FREE match,pd,fpd,a,b,count=ct if ct ne 0 then begin message, 'Parameter that is both free and fixed?',/info print,'Matching free parameters: '+pd[a] print,'Matching fixed parameters: '+fpd[b] stop end end ; basic sanity checking of models known_mdls=['MC10','DBP90','DL01','WD01_RV5P5B','DL07','J13','G17_MODELA','G17_MODELB','G17_MODELC','G17_MODELD'] pol_mdls=['G17_MODELA','G17_MODELB','G17_MODELC','G17_MODELD'] test_model = where(known_mdls eq model,ct) if ct eq 0 then begin message,'ISM dust model '+use_model+' unknown',/continue message,'Known models are MC10,DBP90,DL01,WD01_RV5P5B,DL07,J13,G17_MODELA,G17_MODELB,G17_MODELC,G17_MODELD',/continue stop end if keyword_set(polarization) then begin test_model = where(pol_mdls eq model,ct) if ct eq 0 then begin message,'The only models with polarisation are G17_MODELA,G17_MODELB,G17_MODELC,G17_MODELD',/continue stop end end else begin test_model = where(pol_mdls eq model,ct) if ct eq 1 then begin message,'You have requested a dust model with polarisation '+model+' but DustEMWrap is not initialized in polarisation mode',/info message,'You should set dustem_init,model=use_model,polarization=1',/info stop end end ; basic sanity checking of plugins ;== INITIALIZE DUST MODEL PARAMETERS and PLUGIN FREE PARAMETERS dustem_init_parinfo,pd,iv,up_limited=ulimed,lo_limited=llimed,up_limits=ulims,lo_limits=llims,fixed=fixed,tied=tied ;== INITIALIZE ANY PLUGINS dustem_init_plugins,pd,fpd=fpd ;== INITIALIZE ANY FIXED PARAMETERS FOR DUST MODOEL AND PLUGINS if keyword_set(fpd) then dustem_init_fixed_params,fpd,fiv message,'Finished initializing free and fixed parameters of dust model and plugins',/info the_end: END