Backup of ROMS/Visualization(No. 2)


 

ROMSの図化(簡易版)

 

計算結果の簡単なチェックには「ncview」が便利です.論文やプレゼンに使用する図面や動画は「Matlab」で作ります.

 

ncviewを使う

 
$ ncview SCB2_avg.1770.nc

あるいは連番ファイルを一気に表示させることもできる.

$ ncview SCB2_avg.*.nc                    # ディレクトリ内にある全ファイル
$ ncview SCB2_avg.0???.nc               # 0000から0999まで
$ ncview SCB2_avg.0[0-2]??.nc         # 0000から0299まで
  • ncviewで好きな画像を表示させる。
    • 「Print」をクリック、DeviceをFileにして.ps形式(postscript)で保存。
$ convert filename.ps filename.jpg

などを使って好きなファイルフォーマットに変換する。
編集したい場合は、例えば「gimp」を使う。

$ gimp filename.jpg
 

ncviewを使って簡易アニメーションを作成する.

 
$ ncview -frames roms_out.????.nc

ncviewでアニメーションを表示させると,frames.00000.ppmのような連番ファイルが作成される.

%%$ ffmpeg -threads 8 -r 10 -i frame.%05d.ppm -sameq output.avi%%
$ ffmpeg -threads 8 -r 12 -i figure.%04d.png -qscale 0 output.avi

これで「output.avi」というムービーファイルが作成される.このとき,-threads 8はコアの数,-r 10はフレームレート(ここでは毎秒10フレームという意味)である.ffmpegのオプションはググれば色々出てくるので,出力フォーマットを変更したりしてみても良い.

注意点:出力フォーマットによってはWindowsやMacでは再生できない可能性もあるので,必ず使用したいマシン上で再生テストを行うこと.

Windows XP + Powerpoint 2000の組み合わせでは、以下のようにもう一度動画を変換すると、スライドショーでうまく再生できるようである。

$ mencoder input.avi -ovc lavc -lavcopts vcodec=msmpeg4v2:vbitrate=5000000 -vf scale=640:640 -o output.avi

あるいは,

$ mencoder input.avi -o output.wmv -of lavf -oac lavc -ovc lavc -lavcopts vcodec=wmv2:vbitrate=5000

ここで、input.aviは入力ファイル(ncviewからの.ppmファイルをつなげて作った無圧縮.aviファイル)、 output.aviは変換後の動画、msmpeg4v2はWindows標準のmp4フォーマット、vbitrateはビデオのビットレートで、 5000000ならば5M bit/secという意味。この数字を大きくすれば圧縮率の低いきれいな動画が作成され、小さくすればファイルサイズ重視の動画ファイルが作成される。 scale=640:640は変換後の動画のピクセル数で、8の倍数でなければいけない。もしオリジナルの動画のピクセル数が8の倍数でなければ、なるべくもとのピクセル数に近い数にするか、アスペクト比を変えないように適宜調整する。この方法はMatlabで作成した動画ファイルにも適用可能。

なお,上記はmencoderのオプションのほんの一例であるので,色々と調べて綺麗な動画を作りましょう.

再生する時は,例えば「mplayer」を使う.

$ mplayer -loop 0 output.avi
  • 「-loop 0」オプションを指定すると,アニメーションが繰り返し再生される.
 

Matlabを使う。

 

Matlabも参照のこと.

>> nc=netcdf('output_file','r');  % open netcdf file with read-only mode
>> tind=10; N=32;                    % tind: record number in the nc file, N: number in vertical layer (32 means surface in this case)
>> zeta=squeeze(nc{'zeta'}(tind,:,:));
>> sst=squeeze(nc{'temp'}(tind,N,:,:));     % temp(time,z,y,x) or zeta(time,y,x)
>> close(nc);        % close netcdf file
>>
>> nc=netcdf('grid_file','r');
>> lon=nc{'lon_rho'}(:);            % (:) means (y,x) (or get everything)
>> lat=nc{'lat_rho'}(:);
>> mask=nc{'mask_rho'}(:);
>> close(nc);
>>
>> mask(mask==0)=NaN;  % make land points NaN
>> cax=[10 30];        % min & max of the data to display
>> figure; pcolor(lon,lat,sst.*mask); caxis(cax); shading flat; colorbar;

アニメーションを作成する場合は,Matlabで作成したFigureをhoge.00001.jpgのような連番ファイルで保存し,

$ ffmpeg -threads 8 -r 10 -i frame.%05d.jpg -sameq output.avi

のようにすれば動画ファイルが作成できる.

 

Matlabを使って連番ファイルを作る例(>>は省略)

 
% start plotting
%
clear all;
close all;
%
iframe=0;                        % initialize counter
%
for nfile=0:12:120;        % start loop on nfile
%
   snum=sprintf('%04g',nfile);    % convert nfile into snum (4-digit character strings. ex: nfile=10 --> snum = '0010')
   roms=['/home/foo/ROMS/project1/roms_his' snum '.nc'];
   nc=netcdf(roms,'r');
   ntime=length(nc{'ocean_time'}(:));    % get number of records in the file
%
   for tind=1:ntime;        % start loop on tind
%
       sfig=sprintf('%05g',iframe);
       fname=['../figure/jpg/fig_'  sfig '.jpg'];     % define output figure name of the current counter 
       sst=nc{'temp'}(tind,N,:,:);
%
%  you can play around the following portion
%
       figure;
       pcolor(lon,lat,sst.*mask);
       shading flat;
       caxis(cax);
       colorbar;
%
       print('-djpeg60',fname);
       close all;                % close all of figures
       iframe=iframe+1;    % counter increment
   end;                            % end loop on tind
%
   close(nc);
%
end;                                % end loop on nfile
%