Sunday, January 30, 2011

compile java program with javac

#!/bin/bash
# compile java program with javac
# usage:
#            myjava xxx.java
# copyright @ http://scriptdemo.blogspot.com

if [ $# -eq 0 ]; then
   sed -n '2,4p' myjava
   exit
else
   srcfile=$1
   nf=`echo ${srcfile} | awk -F. '{print NF}'`
   if [ $nf -eq 1 ]; then
      exefilename=${srcfile}
      srcfile=${srcfilename}.java
   elif [ $nf -eq 2 ]; then
      exefilename=`echo ${srcfile} | awk -F. '{print $1}'`
   else
      myjava
      exit
   fi

   if [ -e ${srcfile} ]; then
      javac ${srcfile}
      java -classpath . ${exefilename}
   elif [ -e ${exefilename} ];then
      java -classpath . ${exefilename}
   else
      echo "${srcfile} can\'t be found in current directory!"
      exit
   fi
fi

Tuesday, January 18, 2011

compile java program with gcj

#!/bin/bash
# compile java program with gcj
# usage:
#            mygcj myMain.java [otherJavaFiles]
# copyright @ http://scriptdemo.blogspot.com
if [ $# -eq 0 ]; then
   sed -n '2,4p' mygcj
   exit
else
   numfile=$#
   IsMain=1
   myfiles=""
   for srcfile in $*
   do
      nf=`echo ${srcfile} | awk -F. '{print NF}'`
      if [ $nf -eq 1 ]; then
         srcfilename=${srcfile}
         srcfile=${srcfilename}.java
      elif [ $nf -eq 2 ]; then
         srcfilename=`echo ${srcfile} | awk -F. '{print $1}'`
      fi
      [ ! -e ${srcfile} ] && echo "${srcfile} can\'t be found in current directory!" && exit
      if [ $IsMain -eq 1 ]; then
         mainfile=$srcfilename; IsMain=0
      fi
      myfiles="${myfiles} ${srcfile}"
   done
   gcj ${myfiles} --main=${mainfile} -o ${mainfile}
fi

Friday, January 7, 2011

Write netcdf file using matlab native functions

Check the help page from Mathworks for new version Matlab
Please leave your comments to help improve the code in the future. Your help is greatly appreciated!

function SaveNcVarMatlab(ncfile,ncvar,MagicTag,myValue,myDType)
% to save a variable to a netcdf file using native matlab netcdf-functions
% Usage: SaveNcVarMatlab(nc-filename,nc-varname,MagicTag,myValue,[myDType])
% e.g.,
% 1: to save a 4D data
%     SaveNcVarMatlab('mask.nc','tmask',{'t','z','y','x'},4D-data,'float');
%     if the nc-file exist, the code will try to append data to old
%     file as long as the dimensions of input data is consistent
%     with existing one. If necessary, new dimensions will be added
%     automatically.
% 2: to add an attribute to an variable in existing nc file
%     SaveNcVarMatlab('mask.nc','tmask','att','long_name','mask at t-point')
%     Will overwrite existing one automatically. If no value set to
%     the attribute, the code will try to delete that attribute.
% 3: add/delete a global attribute, similar to the second example
%     but won't use ncvar here.
% Note:
%    Overwriting an existing variable is possible but disabled in
%    this version. Also unlimited dimension is not considered
%    here.
% copyright @ http://scriptdemo.blogspot.com
% ref: matlab netcdf help

if nargin<4 help SaveNcVarMatlab; return; end

if iscell(MagicTag)
    if nargin~=5
        help SaveNcVarMatlab
        return
    end
elseif ischar(MagicTag)
    if ischar(myValue)
       tmpstr=myValue; clear myValue
       myValue.name=tmpstr; clear tmpstr
       if nargin==5
          myValue.value=myDType;
       else
           myValue.value='';
       end
    elseif isstruct(myValue)
       if ~isfield(myValue,'name')
           help SaveNcVarMatlab;
           return;
       else
           if ~isfield(myValue,'value')
              if nargin==5
                 myValue.value=myDType;
              else
                 myValue.value='';
              end
           end
       end
    elseif ~isstruct(myValue)
        disp('Not valid value for myValue.')
        help SaveNcVarMatlab
        return
    end
end

% to support my work, please keep the "creator" global attribute
mycreatorstr='SaveNcVarMatlab.m from http://scriptdemo.blogspot.com';

if iscell(MagicTag) % add values
  [ncfid,IsAppend,OldNC,IsOldVar,OldVar]=CheckNCExist(ncfile,ncvar);
  if length(MagicTag)==1
      myValue=reshape(myValue,[],1);
      vardiminput=length(myValue);
  else
     vardiminput=size(myValue);
  end

  if IsAppend
     for nd=1:length(MagicTag)
        if sum(ismember(OldNC.dimname,MagicTag{nd}))==0
           myDim.name{nd}=MagicTag{nd};
           myDim.len(nd)=vardiminput(nd);
           myDim.IsNew(nd)=1;
        else
           dim_loc=find(ismember(OldNC.dimname,MagicTag{nd})==1);
           if OldNC.dimlen(dim_loc)~=vardiminput(nd)
              disp(['The length of input dimension ',MagicTag{nd},' is not the same as the exist one'])
              return
              % should consider unlimite dimension in the future
           else
              myDim.name{nd}=MagicTag{nd};
              myDim.ID(nd)=OldNC.dimid(dim_loc);
              myDim.IsNew(nd)=0;
           end
        end
     end
  else
     for nd=1:length(MagicTag)
         myDim.name{nd}=MagicTag{nd};
         myDim.len(nd)=vardiminput(nd);
         myDim.IsNew(nd)=1;
     end
  end
  if IsOldVar
     % support overwrite???
     netcdf.abort(ncfid); return
  else
     if IsAppend netcdf.reDef(ncfid); end
     % define some new dimension
     for nd=1:length(myDim.name)
         if myDim.IsNew(nd)
            myDim.ID(nd)=netcdf.defDim(ncfid,myDim.name{nd},myDim.len(nd));
         end
     end
     myvarid=netcdf.defVar(ncfid,ncvar,myDType,fliplr(myDim.ID));
     netcdf.putAtt(ncfid,netcdf.getConstant('NC_GLOBAL'),'creator',mycreatorstr);
     netcdf.endDef(ncfid);
     %netcdf.putVar(ncid,varid,start,count,stride,data)
     myValue=permute(myValue,length(size(myValue)):-1:1);
     netcdf.putVar(ncfid,myvarid,myValue);
  end

elseif ischar(MagicTag)
  [ncfid,IsAppend,OldNC,IsOldVar,OldVar]=CheckNCExist(ncfile,ncvar);
  if IsAppend
     switch lower(MagicTag)
       case {'a','attribute','var_attribute','vatt','att'}
         if IsOldVar
            OldVar=GetVAtts(ncfid,OldVar);
            netcdf.reDef(ncfid);
            if isfield(OldVar,'attname')
               if ~isstruct(myValue) %delete attribute
                   if sum(ismember(OldVar.attname,myValue))==1
                      netcdf.delAtt(ncfid,OldVar.varid,myValue);
                   else
                       disp(['attribute: ',myValue,' not exist. Nothing is done'])
                       netcdf.abort(ncfid); return;
                   end
               else
                  if sum(ismember(OldVar.attname,myValue.name))==1
                     %netcdf.delAtt(ncfid,OldVar.varid,myValue.name);
                     if isempty(myValue.value)
                        netcdf.delAtt(ncfid,OldVar.varid,myValue.name);
                     else
                        % overwrite old one automatically
                        netcdf.putAtt(ncfid,OldVar.varid,myValue.name,myValue.value);
                     end
                  else
                     %new attribute
                     if ~isempty(myValue.value)
                       netcdf.putAtt(ncfid,OldVar.varid,myValue.name,myValue.value);
                     end
                  end
               end
            else
              %new attribute
              if ~isempty(myValue.value)
                 netcdf.putAtt(ncfid,OldVar.varid,myValue.name,myValue.value);
              end
            end
         else
            disp(['var: ',ncvar,' isn''t exist in ',ncfile]);
            netcdf.abort(ncfid);
            return
         end
       case {'ga','global_attribute','gatt'}
         OldNC=GetGAtts(ncfid,OldNC);
         netcdf.reDef(ncfid);
         if ~isstruct(myValue)
             if isfield(OldNC,'attname')
                if sum(ismember(OldNC.attname,myValue))==1
                   netcdf.delAtt(ncfid,netcdf.getConstant('GLOBAL'),myValue);
                else
                   disp(['attribute: ',myValue,' not exist. Nothing is done'])
                   netcdf.abort(ncfid); return;
                end
             else
                disp('No global attributes available.')
                netcdf.abort(ncfid); return;
             end
         else
            if isfield(OldNC,'attname')
               if sum(ismember(OldNC.attname,myValue.name))==1
                  netcdf.delAtt(ncfid,netcdf.getConstant('GLOBAL'),myValue.name);
                  if ~isempty(myValue.value)
                     netcdf.putAtt(ncfid,netcdf.getConstant('NC_GLOBAL'),myValue.name,myValue.value);
                  end
               else
                  %new global attribute
                  if ~isempty(myValue.value)
                     netcdf.putAtt(ncfid,netcdf.getConstant('NC_GLOBAL'),myValue.name,myValue.value);
                  end
               end
            else
               % also new global attribute
               if ~isempty(myValue.value)
                  netcdf.putAtt(ncfid,netcdf.getConstant('NC_GLOBAL'),myValue.name,myValue.value);
               else
                  netcdf.abort(ncfid); return;
               end
            end
         end
       otherwise
           disp(['Not defined attribute type: MagicTag: ',MagicTag])
           netcdf.abort(ncfid); return;
     end
  else
     netcdf.abort(ncfid);
     disp([ncfile,' dos not exist, global attribute can''t be added.'])
     return
  end
  netcdf.putAtt(ncfid,netcdf.getConstant('NC_GLOBAL'),'creator',mycreatorstr);
  netcdf.endDef(ncfid);
else
  disp('Not valid value for MagicTag')
  return;
end

%close the file
netcdf.close(ncfid);
end

function [ncfid,IsAppend,OldNC,IsOldVar,OldVar]=CheckNCExist(ncfile,ncvar)
  IsAppend=0; IsOldVar=0;
  if exist(ncfile,'file')
     disp([ncfile,' already exist, try the append mode']);
     IsAppend=1;
  end

  % Open the nc file
  if IsAppend
     ncfid=netcdf.open(ncfile,'NC_WRITE');
     [OldNC.numdims, OldNC.numvars, OldNC.numGAtt, unlimdimID] = netcdf.inq(ncfid);
     for NDim=1:OldNC.numdims
        [OldNC.dimname{NDim}, OldNC.dimlen(NDim)] = netcdf.inqDim(ncfid,NDim-1);
        OldNC.dimid(NDim)=NDim-1;
     end
     for NVar=1:OldNC.numvars
        [tmpvarname, tmpvarxtype,tmpvardims, tmpvarnumatts] = netcdf.inqVar(ncfid,NVar-1);
        if strcmp(tmpvarname,ncvar)
            IsOldVar=1;
            OldVar.varid=NVar-1;
            OldVar.varname=tmpvarname;
            OldVar.varxtype=tmpvarxtype;
            OldVar.vardimids=tmpvardims;
            OldVar.numatts=tmpvarnumatts;
            break;
        end
     end
     if IsOldVar==0 OldVar=nan; end
  else
     ncfid=netcdf.create(ncfile,'NC_NOCLOBBER');
     OldNC=nan; OldVar=nan;
  end
end

function OldVar=GetVAtts(ncfid,OldVar)
  for numA=1:OldVar.numatts
      OldVar.attname{numA}=netcdf.inqAttName(ncfid,OldVar.varid,numA-1);
      % OldVar.attid(numA)=netcdf.inqAttID(ncfid,varid,OldVar.attname{numA});
  end
end
function OldNC=GetGAtts(ncfid,OldNC)
  for numA=1:OldNC.numGAtt
      OldNC.attname{numA}= netcdf.inqAttName(ncfid,netcdf.getConstant('NC_GLOBAL'),numA-1);
  end
end

Monday, January 3, 2011

Post process the html file for blogger using vi script

"function to post-process the html file created by TOhtml for blogger
"copyright @ http://scriptdemo.blogspot.com

:if exists("TOblogger_loaded")
:   delfun TOblogger
:   delfun RePlaceSpace
:endif

:function TOblogger()
:set nowrap
:1,$ call RePlaceSpace()
:endfunction

:function RePlaceSpace()
:let line = getline(".")
:if line =~ "^\ "
:   let line = substitute(line,"^\ ",'\&nbsp;',"g")
:   while line =~ "&nbsp; "
:            let line = substitute(line,'&nbsp;\ ','\&nbsp;\&nbsp;',"g")
:   endwhile
:   call setline(".",line)
:endif
:unlet line
:endfunction
:let TOblogger_loaded = 1
An html file can be generated from the source code file using the vim "build-in" command TOhtml. However, to publish in blogger, the blank spaces will be ignored by blogger, which results in a ugly view. Here using the script (TOblogger.vim), you can replace the blank spaces at the beginning of each line with &nbsp;
To use it, you need to open the html file first, then
                             :source TOblogger.vim   #using the path if necessary
                             :call TOblogger()
and save your new html file using :w
Enjoy!

[UPDATED] read netcdf file using native matlab functions

check the ncread for new version matlab from Mathworks. 
 
The attributes of scale factor, offset value and missing value are considered in this version.

function ncvardata=GetNcVarMatlab(ncfile,ncvar,RangeStr)
% to read a variable from the netcdf file using native matlab netcdf-functions
% Usage: vardata=GetNcVarMatlab(nc-filename,nc-varname,Dimension-Range)
% e.g.,
%        mydata=GetNcVarMatlab('mask.nc','tmask','1:1,1:46,1:400,1:568');
%                      RangeStr here is similar to the output of ncdump
% note: by default, variable will be converted into the class of double,
%                      and the missing value will be converted into nan.
% copyright @ http://scriptdemo.blogspot.com


IsDebug=0;
IsMissingNaN=1; % convert missing values into NaN
if ~exist(ncfile,'file')
   error([ncfile,' can not been found']);
   return
end

ncfid=netcdf.open(ncfile,'NC_NOWRITE');
% get dimension length
[numdims, numvars, numglobalatts, unlimdimID] = netcdf.inq(ncfid);
for NDim=1:numdims
   [dimname{NDim}, dimlen(NDim)] = netcdf.inqDim(ncfid,NDim-1);
end

%var infor
varid=netcdf.inqVarID(ncfid,ncvar);
[varname,varxtype,vardimids,NumAtts]=netcdf.inqVar(ncfid,varid);
numdims=length(vardimids); % some variables may have less dimensions

%check scale_factor & off_set
IsRescale=0; IsMissing=0;
myScale=1; myOffSet=0.0;
for numA=1:NumAtts
    tmpattname=netcdf.inqAttName(ncfid,varid,numA-1);
    switch lower(tmpattname)
       case {'scale_factor','scalefactor'}
            IsRescale=1;
            myscale=netcdf.getAtt(ncfid,varid,tmpattname);
       case {'add_offset','off_set','offset'}
            IsRescale=1;
            myoffset=netcdf.getAtt(ncfid,varid,tmpattname);
       case {'missing_value','missingvalue','missing'}
            IsMissing=1;
            mymissing=netcdf.getAtt(ncfid,varid,tmpattname);
       otherwise
            % do nothing
    end
end
if IsRescale==1
   if (myscale==1 & myoffset==0)
      IsRescale=0;
   end
else
   if ~exist('myscale','var') myscale=1; end
   if ~exist('myoffset','var') myoffset=0; end
end

if ~exist('RangeStr','var')
   RangeStr=':';
   for nd=2:numdims
       RangeStr=[RangeStr,',:'];
   end
end

IndC=strfind(RangeStr,',');% index of commas
if length(IndC)~=numdims-1
   disp(['Input dimension range is not correct, should be: ',num2str(numdims),'-d']);
   return
end

startstr=''; countstr=''; stridestr='';
for nn=1:length(IndC)+1
    if nn==1
       tmpstr=RangeStr(1:IndC(1)-1);
    elseif nn<numdims
       tmpstr=RangeStr(IndC(nn-1)+1:IndC(nn)-1);
    else
       tmpstr=RangeStr(IndC(nn-1)+1:end);
    end

    [tmpstart,tmpcount,tmpstride]=GetIndFromStr(tmpstr,':',dimlen(vardimids(numdims-nn+1)+1));
    if nn==1
        startstr=[num2str(tmpstart),'],'];
        countstr=[num2str(tmpcount),'],'];
        stridestr=[num2str(tmpstride),']'];
    elseif nn==numdims
        startstr=[',[',num2str(tmpstart),',',startstr];
        countstr=['[',num2str(tmpcount),',',countstr];
        stridestr=['[',num2str(tmpstride),',',stridestr];
    else
        startstr=[num2str(tmpstart),',',startstr];
        countstr=[num2str(tmpcount),',',countstr];
        stridestr=[num2str(tmpstride),',',stridestr];
    end
end

if IsDebug
   disp(['ncvardata=netcdf.getVar(ncfid,varid',startstr,countstr,stridestr,');']);
end
eval(['ncvardata=netcdf.getVar(ncfid,varid',startstr,countstr,stridestr,');']);
netcdf.close(ncfid);
ncvardata=permute(ncvardata,length(size(ncvardata)):-1:1);

if IsRescale==1
   %convert all data type into double
   if ~strcmp(class(ncvardata),'double')
      ncvardata=double(ncvardata);
   end
   if IsMissing
      if IsMissingNaN==1; % convert missing values into NaN
         ncvardata(ncvardata==mymissing)=nan;
         ncvardata=ncvardata*double(myscale)+double(myoffset);
      else
         disp(['missing value for ',ncvar,' is ',num2str(mymissing)]);
         %IndValid=find(ncvardata~=mymissing); length(IndValid)
         %ncvardata(IndValid)=ncvardata(IndValid)*double(myscale)+double(myoffset);
         ncvardata(ncvardata~=mymissing)=ncvardata(ncvardata~=mymissing)*double(myscale)+double(myoffset);
      end
   else
      ncvardata=ncvardata*double(myscale)+double(myoffset);
   end
else
  ncvardata=double(ncvardata);
end

function [numstart,numcount,numstride]=GetIndFromStr(tmpstr,ctag,Ndim)
% Read the numbers from the special string
IsDebug=0;
IndC=strfind(tmpstr,ctag);
if isempty(IndC)
   numstart=str2double(tmpstr)-1;
   numcount=1;
   numstride=1;
else
  switch length(IndC)
      case {1}
          switch IndC
            case {1} % : and :num
                if strcmp(tmpstr,':')
                   numstart=0; numcount=Ndim; numstride=1;
                else
                   if strcmp(tmpstr(2:end),'end')
                    numstart=0; numcount=Ndim; numstride=1;
                   else
                    numstart=0; numcount=str2double(tmpstr(2:end))-1; numstride=1;
                   end
                end
            case {length(tmpstr)}
                if strcmp(tmpstr,':')
                   numstart=0; numcount=Ndim; numstride=1;
                   return
                else
                   numstart=str2double(tmpstr(1:IndC-1))-1;
                   numcount=Ndim-numstart;
                   numstride=1;
                end
            otherwise
               numstart=str2double(tmpstr(1:IndC-1))-1;
               if strcmp(tmpstr(IndC+1:end),'end')
                  numend=Ndim;
               else
                  numend=str2double(tmpstr(IndC+1:end));
               end
               numcount=numend-numstart;
               numstride=1;
          end
      case {2}
          % num0:stride:num1
          if IndC(1)==1
             numstart=0;
          else
             numstart=str2double(tmpstr(1:IndC(1)-1))-1;
          end
          if IndC(2)==IndC(1)+1
             numstride=1;
          else
             numstride=str2double(tmpstr(IndC(1)+1:IndC(2)-1));
          end
          if IndC(2)==length(tmpstr)
                 numend=Ndim-1;
          else
            if strcmp(tmpstr(IndC(2)+1:end),'end')
               numend=Ndim-1;
            else
               numend=str2double(tmpstr(IndC(2)+1:end))-1;
            end
          end
          numcount=floor((numend-numstart)/numstride)+1;
          numend=numstart+(numcount-1)*(numStride);
      otherwise
          error('Not defined range type')
  end
end
if IsDebug
   disp(['tmpstr=',tmpstr])
   disp(['start:',num2str(numstart), ' stride:',num2str(numstride),' count:',num2str(numcount)])
end

ShowCalendar