dustem_init_params.pro 6.4 KB
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 $
                       ,no_reset_plugin_structure=no_reset_plugin_structure
;+
; 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
;    no_reset_plugin_structure = if set, does not reset the plugin structure
; 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

;stop
;== 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
IF not keyword_set(no_reset_plugin_structure) THEN BEGIN
   dustem_init_plugins,pd,fpd=fpd
ENDIF

;== INITIALIZE ANY FIXED PARAMETERS FOR DUST MODEL AND PLUGINS
IF keyword_set(fpd) THEN BEGIN
   dustem_init_fixed_params,fpd,fiv
ENDIF

message,'Finished initializing free and fixed parameters of dust model and plugins',/info


the_end:

END