;+ ; NAME: ; SPINMODEL_FINDSEG_T ; ; PURPOSE: ; Finds indexes of spin model segments matching each time. ; ; CATEGORY: ; TDAS ; ; CALLING SEQUENCE: ; spinmodel_findseg_t,mptr,t ; ; INPUTS: ; mptr: pointer to spin model ; t: array of times to which model segments will be matched ; ; RETURNS: ; an array of matching indexes. Throws error using 'message' routine on failure. ; ; PROCEDURE: ; ; ; EXAMPLE: ; ; ; ;$LastChangedBy: pcruce $ ;$LastChangedDate: 2010-10-25 13:18:23 -0700 (Mon, 25 Oct 2010) $ ;$LastChangedRevision: 7885 $ ;$URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/trunk/projects/themis/spin/spinmodel_findseg_t.pro $ ;- ;vectorized implementation function spinmodel_findseg_t,mptr,t sp = (*mptr).segs_ptr seg_t1 = (*sp)[*].t1 seg_t2 = (*sp)[*].t2 n = n_elements(seg_t1) if n eq 1 then return,lon64arr(n_elements(t)) idx_t1 = 0 > value_locate(seg_t1,t,/l64) < (n-1) ;these look like gt/lt operators, but they're actually min/max; used to clip data into range idx_t2 = -1 > value_locate(seg_t2,t,/l64) < (n-2) idx_tmp1 = where(idx_t1 ne idx_t2+1,c) if c ne 0 then begin message,'Internal error: Time does not match spinmodel segments.' endif return,idx_t1 end ;Old iterative implementation ;currseg = (*sp)[(*mptr).index_t] ;if ( (currseg.t1 LE t) AND (t LE currseg.t2) ) then begin ; return, (*mptr).index_t ;endif else if (t LE (*sp)[0].t1) then begin ; (*mptr).index_t = 0 ; return, (*mptr).index_t ;endif else if (t GE (*sp)[(*mptr).lastseg].t2) then begin ; (*mptr).index_t = (*mptr).lastseg ; return, (*mptr).index_t ;endif else if (t LE currseg.t1) then begin ; start_index = 0 ;endif else start_index = (*mptr).index_t + 1 ; ;idx = where((*sp).t1 le t and t lt (*sp).t2,c) ;if c lt 1 then begin ; message,'Internal error: no spinmodel segments match input time.' ;endif else if c gt 1 then begin ; message,'Internal error: multiple spinmodel segments match input time.' ;endif else begin ; (*mptr).index_t = idx ; return,(*mptr).index_t ;endelse ;for i=start_index,(*mptr).lastseg,1 do begin ; currseg = (*sp)[i] ; if ((currseg.t1 LE t) AND (t LE currseg.t2)) then begin ; (*mptr).index_t = i ; return, (*mptr).index_t ; endif ;endfor ;end