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, model, 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: ; fpd -- the fixed parameter description vector ; fiv -- the initial values of the fixed parameters ; ulimed -- flag 1/0 if upper limits ON/OFF ; llimed -- flag 1/0 if lower limits ON/OFF ; ulims -- upper limit values ; llims -- lower limit values ; ; ; ; ; OUTPUTS: ; None ; ; OPTIONAL OUTPUT PARAMETERS: ; None ; ; ACCEPTED KEY-WORDS: ; polarization = assume dustem is running in polarization mode ; 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 ; compare ulims and ivs on=where(ulimed eq 1,ct) if ct gt 0 then begin test=total(ulims[on] lt iv[on]) if test ne 0 then begin message, 'Upper limits are less than requested initial values',/info stop end 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 ; compare llims and ivs on=where(llimed eq 1,ct) if ct gt 0 then begin test=total(llims[on] gt iv[on]) if test ne 0 then begin message, 'Lower limits are greater than requested initial values',/info stop end end end if keyword_set(llims) and keyword_set(ulims) then begin on=where(llimed eq 1 and ulimed eq 1,ct) if ct gt 0 then begin test=total(llims[on] gt ulims[on]) if test ne 0 then begin message, 'Requested lower limits are greater than upper limits',/info stop end 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 ;; message,'and set polarization=1 in the call to this routine (dustem_init_params)',/info ;; stop ;; end ;; end exists=dustem_test_model_exists(model,/silent) if exists ne 1 then $ message,'Unknown dust model '+model polexists=dustem_test_model_exists(model,/pol,/silent) if keyword_set(polarization) and polexists eq 0 then $ message,'You have requested polarization mode, but the '+model+' model does not predict polarization' ; basic sanity checking of plugins ; to be written ;== 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