Here is a Matlab snippet to read & manipulate MIX data:
% Read in the first hdf file to obtain grid and other attributes sd_id = hdfsd( 'start', [filenames(1,:)], 'rdonly'); alpha = hdfsd('readattr', sd_id, 5); beta = hdfsd('readattr', sd_id, 6); R = hdfsd('readattr', sd_id, 7); % Read in the X grid sds_id = hdfsd( 'select', sd_id,hdfsd('nametoindex',sd_id,'Grid X')); X = hdfsd('readdata',sds_id,zeros(1,2),[],[181; 27]); % Read in the Y grid sds_id = hdfsd( 'select', sd_id,hdfsd('nametoindex',sd_id,'Grid Y')); Y = hdfsd('readdata',sds_id,zeros(1,2),[],[181 27]); % Calculate Radius radius = sqrt(X.^2 + Y.^2); % Calculate co-latitude theta = atan2(y,x) % Note: the following syntax might not work... May need to explicitly loop over theta for periodic point: theta[theta < 0] = theta[theta < 0] + 2*pi hdfsd('end',sd_id); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Now allocate & read all the data stored in a list of MIX output files: f_gridded = zeros(2,length(filenames),27,181); x_gridded = f_gridded; y_gridded = f_gridded; for i=1:length(filenames) sd_id = hdfsd( 'start', [filenames(i,:)], 'rdonly'); stime(i) = datenum(double(hdfsd('readattr', sd_id, 2))); % Read in energy: keV (kilo - electron volt) sds_id = hdfsd( 'select', sd_id,hdfsd('nametoindex',sd_id,'Average energy North [keV]')); ENERGY = hdfsd('readdata',sds_id,zeros(1,2),[],[181 27]); % Read in flux sds_id = hdfsd( 'select', sd_id,hdfsd('nametoindex',sd_id,'Number flux North [1/cm^2 s]')); FLUX = hdfsd('readdata',sds_id,zeros(1,2),[],[181 27]); f_gridded(1,i,:,:) = ENERGY; f_gridded(2,i,:,:) = FLUX; %x_gridded(1,i,:,:,1) = X; %x_gridded(2,i,:,:,1) = X; %y_gridded(1,i,:,:,1) = Y; %y_gridded(2,i,:,:,1) = Y; %Close the file buffer when you are finished. hdfsd('end',sd_id);
Here is an example provided by Bin Zhang from Dartmouth. It computes Joule Heating. See the comments for additional details.
function JouleHeating = JouleHeating_MIX(xi,yi,pot,ped) % This function estimates the Joule heating using the ionospheric output % (MIX) from the LFM-MIX/CMIT simulation. The Joule Heating in the % ionosphere is defined as % JouleHeating = SigmaP * E^2 % where SigmaP is the Pedersen conductance in the ionosphere, E is the % electric field defined as E = -grad(potential) % % The inputs are: % (xi,yi) : the MIX grid % pot : the ionospheric potential from MIX [V] % ped : the Pedersen conductance from MIX [mho] % The output is : % JouleHeating : Joule Heating in the ionosphere(on the same % grid (xi,yi) ) [mW/m^2] % % Example: % filename='C:\temp\oldgc1_mix_2000-01-01T02-00-00Z.hdf' % xi = double(hdfread(filename, '/Grid X', 'Index', {[1 1],[1 1],[181 27]})); % yi = double(hdfread(filename, '/Grid Y', 'Index', {[1 1],[1 1],[181 27]})); % pot = double(hdfread(filename, '/Potential North [V]', 'Index', {[1 1],[1 1],[181 27]})); % ped = double(hdfread(filename, '/Pedersen conductance North [S]', 'Index', {[1 1],[1 1],[181 27]})); % JH = JouleHeating_MIX(xi,yi,pot,ped); dtheta=1.5; % Define a regular grid (X,Y) for interpolation theta1=pi*(-50:dtheta:50)/180; % On this regular grid, grid points are evenly spaced theta2=pi*(-50:dtheta:50)/180; % The difference between grid points is dtheta, default value is 1.5 degrees, [T1 T2]=meshgrid(theta1,theta2); % which is close to the MIX resolution (dtheta should not be too small) Rion=1.02; % Relative radius of the Earth ionosphere RE=6.35e6; % Radius of the earth [m] X=Rion.*sin(T1); % Cartesien grid X Y=Rion.*sin(T2); % Cartesien grid Y POT=griddata(xi,yi,pot,X,Y); % Potential on the interpolated grid (X,Y) PED=griddata(xi,yi,ped,X,Y); % Pedersen conductance on the interpolated grid (X,Y) warning off; [Ex Ey]=gradient(-POT); % E = - grad(potential) Ex=Ex/(RE*Rion*dtheta*pi/180); % Ex -- [V/m^2] Ey=Ey/(RE*Rion*dtheta*pi/180); % Ey -- [V/m^2] Joule=(Ex.^2+Ey.^2).*PED; % Joule heating = sigmaP * E^2 [W/m^2] JouleHeating=griddata(X,Y,Joule*1e3,xi,yi); % Interpolation back to the original grid % Note the 1e3 factor here % makes the JouleHeating have the unit [mW/m^2] % Now JouleHeating variable is % on the grid (xi,yi) [Nx Ny]=size(JouleHeating); % Set the NaN points to be zero for plotting for i=1:Nx for j=1:Ny if (isnan(JouleHeating(i,j))==1) JouleHeating(i,j)=0; end end end end