Example 6  visualisation of a drift shell
[ Description  Source  Results ]
Description

Magnetic drift shells can be built with the help
of the subroutines UD310
or UD317.
To visualize the drift shells, the subroutine
UT992 can be used to print
the drift shell data into a file. A graphical tool
can then be used to display the shell.
In the exemple below, we took advantage that,
under VMS, the library
can be directly linked to IDL (see FAQ G.06
and T.05).
The IDL routines listed in the next section make use of
the subroutine UT985 to read the
magnetic drift shell stored in the common blocks
UC110, UC120
and UC130.
In the source code of both subroutines, it is assumed that the
library has been correctly initialized, the different structures
have been fully declared, and the drift shell has been successfully
built by the subroutine UD310
or the subroutine UD317.
Note that the IDL routine
unilib_init
can be used to declare the useful structures.
The source code listed below include two IDL routines:
spl_fieldline
and shade_shell
.
The routine spl_fieldline
uses natural
splines to tabulate a magnetic field line segment with
a given number of points. The routine shade_shell
makes successive calls to the subroutine UT985
and the routine spl_fieldline
in order to return
a set of vertices and polygons which describe the magnetic drift shell.
These vertices and polygons can be then directly use with the IDL
function POLYSHADE
to produce a shadedsurface
representation of one or more magnetic drift shells.
Source
PRO spl_fieldline, field_line, tabulated_line, $ number=number, bmax=bmax, shade=shade ; ; Purpose: Tabulate a magnetic field line segment with equidistant points. ; Arguments: ; field_line = an array of zseg structures ; tabulated_line = a (3,n) array containing the X, Y, and Z ; coordinates of each point ; Keywords: ; number = number of equidistant points (default, 20) ; bmax = value of the magnetic field intensity at ; the mirror points ; shade = an array, with the same number of elements ; as tabulated_line, that will contained the ; magnetic field intensity at each point ; IF NOT KEYWORD_SET( number ) THEN number = 20 n = N_ELEMENTS( field_line ) ; ; Convert to cartesian coordinates ; xyz = CV_COORD( /degrees, /to_rect, $ from_sphere = TRANSPOSE( [[ field_line.beg.coord.elong ], $ [ 90field_line.beg.coord.colat ], $ [ field_line.beg.coord.radius ]] ) ) ; b = field_line.beg.b.dnrm arcl = field_line.arcl ; ; IF KEYWORD_SET(bmax) THEN BEGIN ; ; Constraint fieldline between mirror points ; k = WHERE( fieldline.beg.b.dnrm LE bmax ) IF k(0) LT 0 THEN k=[0] xyz = xyz(*,k) arcl = arcl(k) b = b(k) n = N_ELEMENTS( k ) ; ENDIF ; ; IF n LE 1 THEN BEGIN ; tabulated_line = xyz(*,0) # ( 1 + FLTARR( number ) ) shade = FLTARR( number ) + b(0) ; ENDIF ELSE BEGIN ; ; Use natural splines to tabulate the field line segment ; arcl = arcl(n1) + arcl(0)  arcl ; s = arcl(0) + FINDGEN( number ) / ( number1 ) * ( arcl(n1)arcl(0) ) x = SPL_INTERP( arcl, xyz(0,*), SPL_INIT( arcl, xyz(0,*) ), s ) y = SPL_INTERP( arcl, xyz(1,*), SPL_INIT( arcl, xyz(1,*) ), s ) z = SPL_INTERP( arcl, xyz(2,*), SPL_INIT( arcl, xyz(2,*) ), s ) ; tabulated_line = TRANSPOSE( [ [x], [y], [z] ]) shade = SPL_INTERP( arcl, b, SPL_INIT( arcl, b ), s ) ; ENDELSE ; ; END PRO poly_shell, vertices, polygons, $ number=number, bmax=bmax, shade=shade ; ; Purpose: Transfer a magnetic drift shell from UNILIB to IDL in the form of ; a shaded surface ; Arguments: ; vertices = a (3,n) array containing the X, Y, and Z ; coordinates of each vertex of the drift shell ; polygons = a longword array containing the indices ; of the vertices for each polygon. The vertex ; description of each polygon is a vector of ; the form: [3,i0,i1,i2]. ; Keywords: ; number = keyword passed to spl_fieldline ; bmax = value of the magnetic field intensity at ; the mirror points ; shade = an array that will contained the magnetic ; field intensity on the drift shell ; IF NOT KEYWORD_SET(bmax) THEN bmax=0 IF NOT KEYWORD_SET(number) THEN number=20 ; ; Init. a list of polygon vertices ; k = INDGEN( 2 * number  2 ) polygon = TRANSPOSE( [ [ 3 + 0*k ], $ [ number + (k+1)/2 ], $ [ k/2 ], $ [ 1 + k/2 + number * ( 1  k mod 2 ) ] ] ) ; ; Retrieve the first field line segment ; length = 100L mdata = REPLICATE( {zseg}, length ) ; kindex = 1L klength = length status = CALL_EXTERNAL( 'unilib', 'UT985', kindex, klength, mdata) IF klength LE 999999990L THEN MESSAGE, 'call to UT985 failed' ; IF klength LE 0 THEN BEGIN ; ; Adjust the size of mdata ; length = 10L  klength mdata = REPLICATE( {zseg}, length ) status = CALL_EXTERNAL( 'unilib', 'UT985', kindex, klength, mdata) IF klength LT 0L THEN MESSAGE, 'call to UT985 failed' ; ENDIF ; ; kend = kindex spl_fieldline, mdata( 0: klength1 ), vertices, $ number=number, bmax=bmax, shade=shade polygons = 1L ; ; Loop on the next field lines ; REPEAT BEGIN ; ; Load a magnetic field line segment ; klength = length status = CALL_EXTERNAL( 'unilib', 'UT985', kindex, klength, mdata) IF klength LE 999999990L THEN MESSAGE, 'call to UT985 failed' ; IF klength LE 0 THEN BEGIN length = 10L  klength mdata = REPLICATE( {zseg}, length ) status = CALL_EXTERNAL( 'unilib', 'UT985', kindex, klength, mdata) IF klength LT 0L THEN MESSAGE, 'call to UT985 failed' ENDIF ; spl_fieldline, mdata( 0: klength1 ), thisline, $ number=number, bmax=bmax, shade=thisshade ; IF kindex NE kend THEN BEGIN ; ; Append the field line segment and vertex polygons ; vertices = [ [vertices], [thisline] ] shade = [ [shade], [thisshade] ] ; IF polygons(0) LT 0 THEN polygons = polygon $ ELSE polygons = [ [polygons], [polygon] ] ; ; Adapt polygon for the next segment ; polygon(1: 3, *) = polygon(1: 3, *) + number ; ENDIF ELSE BEGIN ; ; Back to the first field line segment ; k = WHERE( polygon ge polygon(1,0) ) polygon(k) = polygon(k)  polygon(1,0) polygons = [ [polygons], [polygon] ] ; ENDELSE ; ; ENDREP UNTIL kindex EQ kend ; END
Results

The above IDL subroutines have been used to produce the following picture
where three magnetic drift shells are represented. For the sake of clarity,
the shells have been cut by a plane.
Courtesy of B. Quaghebeur (BIRA)
The drift shells are characterized by a shell parameter set to 2, 4 and 6, respectively, and a value of B_{m}/B_{0} fixed to 7. The cut view is realized by the plane x + y = 6,500 km (in GEO coordinates).