;+
; NAME:
;	vu_cvgrid
; PURPOSE:
;	Convert between grid indices to heliospheric location and v.v.
; CATEGORY:
;	sat/util/vupack
; CALLING SEQUENCE:
	FUNCTION vu_cvgrid, hdr, fromsun=fromsun, fromgrid=fromgrid, tosun=tosun, togrid=togrid, $
		carrington=carrington, latitude=latitude, radius=radius, time=time
; INPUTS:
;	hdr
; OPTIONAL INPUT PARAMETERS:
;	fromsun  = fromsun
;	fromgrid = fromgrid
;	/tosun
;	/togrid
;	/carrington
;	/latitude
;	/radius
;	/time
; OUTPUTS:
; INCLUDE:
	@compile_opt.pro			; On error, return to caller
; CALLS:
;	IsType, vu_get
; PROCEDURE:
; MODIFICATION HISTORY:
;	AUG-2002, Paul Hick (UCSD/CASS; pphick@ucsd.edu)
;-
IF NOT IsType(hdr, /structure) THEN RETURN, -1

InitVar, tosun		, /key
InitVar, togrid		, /key

InitVar, carrington	, /key
InitVar, latitude	, /key
InitVar, radius		, /key
InitVar, time		, /key


t_start	= vu_get(hdr, /start_time)
t_step	= vu_get(hdr, /time_step )

r_start = vu_get(hdr, /start_distance)
r_step  = vu_get(hdr, /distance_step )

dim		= vu_get(hdr, /dimension)

c_range	= vu_get(hdr, /array_range)
l_range = vu_get(hdr, /latitude_range)


sz = size(loc)

all = 0


CASE 1 OF
carrington	: cars = loc
latitude	: lats = loc
radius		: rads = loc
time		: tims = loc
ELSE		: BEGIN
	all = 1

	IF sz[0] GE 1 THEN cars = SubArray( loc, element=0 )
	IF sz[0] GE 2 THEN lats = SubArray( loc, element=1 )
	IF sz[0] GE 3 THEN rads = SubArray( loc, element=2 )
	IF sz[0] GE 4 THEN tims = SubArray( loc, element=3 )
END
ENDCASE


IF IsType(fromsun, /def) THEN BEGIN

	IF IsType(cars, /def) THEN cars = (cars-c_range[1])/(c_range[0]-c_range[1])*(dim[0]-1)
	IF IsType(lats, /def) THEN lats = (lats-l_range[0])/(l_range[1]-l_range[0])*(dim[1]-1)
	IF IsType(rads, /def) THEN rads = (rads-r_start)/r_step
	IF IsType(tims, /def) THEN tims = (tims-t_start)/t_step ELSE tims = 0*tims

ENDIF ELSE IF IsType(fromgrid, /def) THEN BEGIN

	IF IsType(cars, /def) THEN cars = c_range[1]+float(cars)/(dim[0]-1)*(c_range[0]-c_range[1])
	IF IsType(lats, /def) THEN lats = l_range[0]+float(lats)/(dim[1]-1)*(l_range[1]-l_range[0])
	IF IsType(rads, /def) THEN rads = r_start+rads*r_step
	IF IsType(tims, /def) THEN tims = t_start+tims*t_step

ENDIF

CASE 1 OF
carrington	: pos = cars
latitude	: pos = lats
radius		: pos = rads
time		: pos = tims
ELSE		: BEGIN
	pos = loc

	IF sz[0] GE 1 THEN pos = SubArray( cars, element=0, /replace )
	IF sz[0] GE 2 THEN pos = SubArray( lats, element=1, /replace )
	IF sz[0] GE 3 THEN pos = SubArray( rads, element=2, /replace )
	IF sz[0] GE 4 THEN pos = SubArray( tims, element=3, /replace )
END
ENDCASE

RETURN, pos  &  END
