function t01, tarray, rgsm_array,pdyn,dsti,yimf,zimf,g1,g2,period = period,$
add_tilt=add_tilt,get_tilt=get_tilt,set_tilt=set_tilt,get_nperiod=get_nperiod,$
get_period_times=get_period_times,storm=storm,geopack_2008=geopack_2008
if igp_test(geopack_2008=geopack_2008) eq 0 then return, -1L
if ~n_elements(tarray) then begin
message, /continue, 'tarray must be set'
return, -1L
endif
if ~n_elements(rgsm_array) then begin
message, /continue, 'rgsm_array must be set'
return, -1L
endif
if ~n_elements(pdyn) then begin
message, /continue, 'pdyn must be set'
return, -1L
endif
if ~n_elements(dsti) then begin
message, /continue, 'dsti must be set'
return, -1L
endif
if ~n_elements(yimf) then begin
message, /continue, 'yimf must be set'
return, -1L
endif
if ~n_elements(zimf) then begin
message, /continue, 'zimf must be set'
return, -1L
endif
if ~n_elements(g1) then begin
message, /continue, 'g1 must be set'
return, -1L
endif
if ~n_elements(g2) then begin
message, /continue, 'g2 must be set'
return, -1L
endif
if not keyword_set(period) then period = 60
if period le 0. then begin
message, /contiune, 'period must be positive'
return, -1L
endif
t_size = size(tarray, /dimensions)
pdyn_size = size(pdyn, /dimensions)
dsti_size = size(dsti, /dimensions)
yimf_size = size(yimf, /dimensions)
zimf_size = size(zimf, /dimensions)
g1_size = size(g1,/dimensions)
g2_size = size(g2,/dimensions)
r_size = size(rgsm_array, /dimensions)
if n_elements(t_size) ne 1 then begin
message, /continue, 'tarray has incorrect dimensions'
return, -1L
endif
if n_elements(pdyn_size) ne 1 then begin
message, /continue, 'pdyn_array has incorrect dimensions'
return, -1L
endif
if n_elements(dsti_size) ne 1 then begin
message, /continue, 'dsti_array has incorrect dimensions'
return, -1L
endif
if n_elements(yimf_size) ne 1 then begin
message, /continue, 'yimf_array has incorrect dimensions'
return, -1L
endif
if n_elements(zimf_size) ne 1 then begin
message, /continue, 'zimf_array has incorrect dimensions'
return, -1L
endif
if n_elements(g1_size) ne 1 then begin
message, /continue, 'g1_array has incorrect dimensions'
return, -1L
endif
if n_elements(g2_size) ne 1 then begin
message, /continue, 'g2_array has incorrect dimensions'
return, -1L
endif
if n_elements(r_size) ne 2 || r_size[1] ne 3 then begin
message, /continue, 'rgsm_array has incorrect dimensions'
return, -1L
endif
if t_size[0] ne r_size[0] then begin
message, /continue, 'number of times in tarray does not match number of positions in rgsm_array'
return, -1L
endif
if pdyn_size[0] eq 0 then begin
pdyn_array = replicate(pdyn,t_size)
endif else if t_size[0] ne pdyn_size[0] then begin
message, /continue, 'number of times in tarray does not match number of elements in pdyn_array'
return, -1L
endif else pdyn_array = pdyn
if dsti_size[0] eq 0 then begin
dsti_array = replicate(dsti,t_size)
endif else if t_size[0] ne dsti_size[0] then begin
message, /continue, 'number of times in tarray does not match number of elements in dsti_array'
return, -1L
endif else dsti_array = dsti
if yimf_size[0] eq 0 then begin
yimf_array = replicate(yimf,t_size)
endif else if t_size[0] ne yimf_size[0] then begin
message, /continue, 'number of times in tarray does not match number of elements in yimf_array'
return, -1L
endif else yimf_array = yimf
if zimf_size[0] eq 0 then begin
zimf_array = replicate(zimf,t_size)
endif else if t_size[0] ne zimf_size[0] then begin
message, /continue, 'number of times in tarray does not match number of elements in zimf_array'
return, -1L
endif else zimf_array = zimf
if g1_size[0] eq 0 then begin
g1_array = replicate(g1,t_size)
endif else if t_size[0] ne g1_size[0] then begin
message, /continue, 'number of times in tarray does not match number of elements in g1_array'
return, -1L
endif else g1_array = g1
if g2_size[0] eq 0 then begin
g2_array = replicate(g2,t_size)
endif else if t_size[0] ne g2_size[0] then begin
message, /continue, 'number of times in tarray does not match number of elements in g2_array'
return, -1L
endif else g2_array = g2
if n_elements(tarray) gt 1 then begin
idx = where((tarray[1:t_size[0]-1] - tarray[0:t_size[0]-2]) lt 0,nonmonotone_times)
if nonmonotone_times gt 0 then begin
dprint,'Warning some times are non monotonic, this may cause unreliable results'
endif
endif
out_array = make_array(r_size, /DOUBLE, VALUE = !VALUES.D_NAN)
tstart = tarray[0]
tend = tarray[t_size - 1L]
i = 0L
ts = time_struct(tarray)
ct = (tend-tstart)/period
nperiod = ceil(ct)+1
period = double(period)
parmod = dblarr(t_size, 10)
parmod[*, 0] = pdyn_array
parmod[*, 1] = dsti_array
parmod[*, 2] = yimf_array
parmod[*, 3] = zimf_array
parmod[*, 4] = g1_array
parmod[*, 5] = g2_array
if arg_present(get_nperiod) then begin
get_nperiod = nperiod
endif
if arg_present(get_tilt) then begin
get_tilt = dblarr(nperiod)
endif
if arg_present(get_period_times) then begin
get_period_times = tstart + dindgen(nperiod)*period+period/2.
endif
if n_elements(add_tilt) gt 0 then begin
if n_elements(add_tilt) eq 1 then begin
tilt_value = replicate(add_tilt[0],nperiod)
endif else if n_elements(add_tilt) eq nperiod then begin
tilt_value = add_tilt
endif else if n_elements(add_tilt) eq t_size[0] then begin
period_abcissas = tstart + dindgen(nperiod)*period+period/2
tilt_value = interpol(add_tilt,tarray,period_abcissas)
endif else begin
dprint,'Error: add_tilt values do not match data values or period values'
return,-1
endelse
endif
if n_elements(set_tilt) gt 0 then begin
if n_elements(set_tilt) eq 1 then begin
tilt_value = replicate(set_tilt[0],nperiod)
endif else if n_elements(set_tilt) eq nperiod then begin
tilt_value = set_tilt
endif else if n_elements(set_tilt) eq t_size[0] then begin
period_abcissas = tstart + dindgen(nperiod)*period+period/2
tilt_value = interpol(set_tilt,tarray,period_abcissas)
endif else begin
dprint,'Error: set_tilt values do not match data values or period values'
return,-1
endelse
endif
while i lt nperiod do begin
idx1 = where(tarray ge tstart + i*period)
idx2 = where(tarray le tstart + (i+1)*period)
idx = ssl_set_intersection(idx1, idx2)
if idx[0] ne -1L then begin
id = idx[0]
if ~undefined(geopack_2008) then begin
geopack_recalc_08, ts[id].year,ts[id].doy, ts[id].hour, ts[id].min, ts[id].sec, tilt = tilt
endif else begin
geopack_recalc, ts[id].year,ts[id].doy, ts[id].hour, ts[id].min, ts[id].sec, tilt = tilt
endelse
rgsm_x = rgsm_array[idx, 0]
rgsm_y = rgsm_array[idx, 1]
rgsm_z = rgsm_array[idx, 2]
if ~undefined(geopack_2008) then begin
geopack_igrf_gsw_08,rgsm_x, rgsm_y, rgsm_z, igrf_bx, igrf_by,igrf_bz
endif else begin
geopack_igrf_gsm,rgsm_x, rgsm_y, rgsm_z, igrf_bx, igrf_by,igrf_bz
endelse
if n_elements(tilt_value) gt 0 then begin
if n_elements(set_tilt) gt 0 then begin
tilt = tilt_value[i]
endif else if n_elements(add_tilt) gt 0 then begin
tilt = tilt+tilt_value[i]
endif
endif
if n_elements(get_tilt) gt 0 then begin
get_tilt[i] = tilt
endif
geopack_t01, parmod[id, *], rgsm_x, rgsm_y, rgsm_z, t01_bx, t01_by, t01_bz, tilt = tilt, storm = storm
out_array[idx, 0] = igrf_bx + t01_bx
out_array[idx, 1] = igrf_by + t01_by
out_array[idx, 2] = igrf_bz + t01_bz
endif
i++
endwhile
return, out_array
end