;; for rank 2, ytags must be specified ; ascii, boolean, use ascii transfer types pro das2stream, dataStruct, filename, ytags=ytags, ascii=ascii streamHeader= [ '[00]xxxxxx', '' ] contentLength= -10 ; don't include the packet tag and content length for i=0,n_elements( streamHeader )-1 do begin contentLength += strlen( streamHeader[i] ) + 1 endfor x= streamHeader[0] strput, x, string( contentLength, format='(i6.6)' ), 4 streamHeader[0]= x ascii= keyword_Set(ascii) ; 1=do ascii stream, 0=binary xdatatype= ascii ? 'ascii24' : 'sun_real8' datatype= ascii ? 'ascii16' : 'sun_real8' packetDescriptor= [ '[01]xxxxxx' ] t= tag_names( dataStruct ) nt= n_elements(t) packetDescriptor= [ packetDescriptor, ' ' ] totalItems=1 format='(f24.12' reclen= 4 + 24 + (nt-1) * 20 for i=1,nt-1 do begin s= size( dataStruct.(i) ) name= i eq 1 ? '' : t[i] ;;; stream reader needs a default plane if ( s[0] eq 1 ) then begin packetDescriptor= [ packetDescriptor, $ ' ' ] format= format + ( ( i lt n_elements(t)-1 ) ? ',e16.4' : ',e15.3)' ) totalItems+=1 endif else begin if n_elements( ytags ) eq 0 then ytags= findgen( s[2] ) sytags= strjoin( strtrim( ytags, 2 ), ',' ) nitems= s[2] packetDescriptor= [ packetDescriptor, $ ' ' ] for i=1,nitems-1 do format= format + ',e16.4' format= format + ( ( i lt n_elements(t)-1 ) ? ','+',e16.4' : ','+'e15.4)' ) totalItems+= nitems endelse endfor packetDescriptor= [ packetDescriptor, '' ] contentLength= -10 ; don't include the packet tag and content length for i=0,n_elements( packetDescriptor )-1 do begin contentLength += strlen( packetDescriptor[i] ) + 1 endfor x= packetDescriptor[0] strput, x, string( contentLength, format='(i6.6)' ), 4 packetDescriptor[0]= x openw, unit, filename, /get_lun for i=0,n_elements(streamHeader)-1 do begin writeu, unit, byte( streamHeader[i] ) writeu, unit, byte(10) endfor for i=0,n_elements(packetDescriptor)-1 do begin writeu, unit, byte( packetDescriptor[i] ) writeu, unit, byte(10) endfor nr= n_elements(dataStruct.(0)) data= make_array( /double, totalItems, nr ) dataCol= 0 ; column within rank2 array for j=0,nt-1 do begin dd= dataStruct.(j) s= size(dd) if ( s[0] eq 2 ) then begin data[dataCol:(dataCol+nitems-1),*]= transpose(dd) dataCol= dataCol+nitems endif else begin data[dataCol,*]= dd dataCol= dataCol+1 endelse endfor if ( ascii eq 0 ) then swap_endian_inplace, data, /swap_if_little_endian for i=0L, nr-1 do begin writeu, unit, byte(':01:') if ( ascii ) then begin s= string( data[*,i], format=format ) writeu, unit, s writeu, unit, byte(10) endif else begin writeu, unit, data[*,i] endelse endfor close, unit free_lun, unit end pro test_dump x= findgen(3000)/3 y= sin( x ) data= { x:x, y:y } das2stream, data, 'my.d2s', /ascii end pro test_dump_rank2 z= dist(15,20) x= findgen(15)+3 y= findgen(20) data= { x:x, z:z } das2stream, data, 'my.d2s', ytags= y, /ascii end