ROMS模式RNT工具包的应用(弃用)

  1. 安装SNCTOOLS,是以前版本的matlab用的netcdf包

    javaaddpath([pwd '/netcdfAll-4.3.jar']);
    javaaddpath ([pwd '/mexcdf/snctools/classes']);
    addpath ([pwd '/mexcdf/mexnc']);
    addpath ([pwd '/mexcdf/snctools']);
    

    RNT包中构建了netcdf结构体,简化了matlab读写编程,程序需要调用mexnc库。
    运行注意更改mexcdf、mexnc等函数的matlab版本判断,经实验在2018b中可以正常运行
    netcdf 函数调用路径由错误追踪如下

      Error in mexnc_tmw (line 124)
      [varargout{:}] = handler ( varargin{:} );
      
     Error in mexnc (line 552)
     	[varargout{:}] = backend(varargin{:});
     
     Error in mexcdf53 (line 9)
     	[varargout{:}] = feval('mexnc', varargin{:});
     
     Error in ncmex (line 112)
        [varargout{:}] = feval(fcn, varargin{:});
     
     Error in ncatt (line 123)
           status = ncmex('attput', theNCid, theVarid, ...
     
     Error in netcdf/subsasgn (line 121)
              result = ncatt(theAttname, ncclass(other), other, self);
    

    目前碰到的问题是netcdf结构对象用来读取数据正常,但是写文件无法写到文件中去,正在排查原因
    目前排查mexnc函数可以正常写入维数信息
    /public4/home/pgv3234/roms/matlab/SNCTOOLS/mexcdf/mexnc/mexnc.m
    经过一天的排查,原因在于在netcdf结构体中,源代码中为了便于排查错误,在写入数据时,采用了Tempname,先赋值一个任意名字,后面再用rename操作改名字,但是名字采用了"--------",新的matlab函数不支持这种特殊符号,所以没有写入数据
    netcdf函数中普遍采用status来处理错误,status=-1表示出错,但是并不会有报错信息,所以排查bug时要注意

    搜寻代码的语句
    grep -n 'Tempname' `find ./ -name '*.m'`
    将找到的地方替换
    %theTempname( : ) = '-';
     theTempname( : ) = 'a';
    

    另外还有待解决的问题,删除维数时有时出错,导致整个netcdf变成了空文件;
    netcdf子结构体报错,报错信息如下:

对于全局属性,问题如下:
>> nc.glbatt(:)
glbtst

>> nc.glbatt(:)=[]
Brace indexing is not supported for variables of this type.

Error in ncatt/subsasgn (line 67)
  if isempty(other) & length(theSubs) == 1 & strcmp(theSubs{1}, ':')

Error in netcdf/subsasgn (line 129)
     result = subsasgn(att(self, theAttname), s, other);

>> g=nc.glbatt

g =

   NetCDF_Attribute: 'glbatt'
            itsType: 'char'
          itsLength: 6
       itIsUnsigned: 0

>> g(:)=[]
Brace indexing is not supported for variables of this type.

Error in ncatt/subsasgn (line 67)
  if isempty(other) & length(theSubs) == 1 & strcmp(theSubs{1}, ':')

>> g(:)
Undefined function or variable 'theResult'.

Error in ncatt/subsref (line 81)
  disp(theResult)


对于变量属性,问题如下
> v1=nc{'var1'}

v1 =

   NetCDF_Variable: 'var1'
           itsType: 'double'
     itsDimensions: 'x, y'
        itsLengths: [6 7]
    itsOrientation: [1 2]
           itsVars: {}
        itsSrcsubs: {}
        itsDstsubs: {}
       nAttributes: 2
   itIsAutoscaling: 0
    itIsAutoNaNing: 0
      itIsUnsigned: 0
         itIsQuick: 0

>> v1.type
   NetCDF_Attribute: 'type'
            itsType: 'char'
          itsLength: 4
       itIsUnsigned: 0

>> v1.type(:)
test
>> a=v1.type 

a =

   NetCDF_Attribute: 'type'
            itsType: 'char'
          itsLength: 4
       itIsUnsigned: 0

>> a(:)=[]
Brace indexing is not supported for variables of this type.

Error in ncatt/subsasgn (line 67)
  if isempty(other) & length(theSubs) == 1 & strcmp(theSubs{1}, ':')

>> a(:)   
Undefined function or variable 'theResult'.

Error in ncatt/subsref (line 81)
  disp(theResult)

>> a

a =

   NetCDF_Attribute: 'type'
            itsType: 'char'
          itsLength: 4
       itIsUnsigned: 0

>> v1.type(:)
test

对于删除属性时出错,解决方法,问题可能在于新版matlab和老版在cell格式上的不同

s = theStruct;
theType = s(1).type;
theSubs = s(1).subs;
s(1) = [];
**%commented out by hzw
%if isa(theSubs, 'cell'), theSubs = theSubs{1}; end
%end**
switch theType
case '()'
   if isempty(other) & length(theSubs) == 1 & strcmp(theSubs{1}, ':')
      result = delete(self);   % Delete.


      if nargout >  0
         theResult = result;
      else
         disp(result)
      end
      return
   end
otherwise
end

返回变量属性对象时的错误,目前排查原因在于
RNT_MAIN/matlib/netcdf/@ncatt/subsref.m函数中datatype出错
ncmex(‘typelen’,datatype)返回-1
RNT_MAIN/matlib/netcdf/@ncvar/datatype.m函数
发现输入’char’的函数,输出没变,本来应该是对应的数字
/public4/home/pgv3234/roms/matlab/SNCTOOLS/mexcdf/mexnc/tests/test_typelen.m
留待以后解决。

其他问题测试
(1)全局属性删除正常
(2)变量写入更改正常
(3)变量删除语句无效果
(4)属性对象直接写会报错,赋予另一个变量正常,如下所示

a =

  NetCDF_Attribute: 'type'
           itsType: 'char'
         itsLength: 4
      itIsUnsigned: 0

>> a(:)
Undefined function or variable 'theResult'.

Error in ncatt/subsref (line 81)
 disp(theResult)

>> b=a(:)

b =

  'test'

(5)变量属性删除正常,如a=object,a(:)=[]正常
小心使用此库,问题以后慢慢改
2. RNT工具包中有采用matlab调用Fortran的mex程序,在使用mex库时碰到了新的问题,在于代码中采用的函数比较老(报错信息中说的是obsolete),已编译好的程序,与matlab2018b不兼容,所以要重新编译。
接下来需要安装g95编译器,配套安装gcc
下载和安装说明如下http://g95.sourceforge.net/src.shtml
重新用matlab编译报错的fortran程序,mex *.f90

Function "MXCREATEFULL" is obsolete.
If your MEX file or Simulink S-function calls this function, replace it with "MXCREATEDOUBLEMATRIX".
根据报错提示,找到错误的函数,将mxCreateFull替换为mxCreateDoubleMatrix

再用matlab编译,成功通过
另一种方式,安装较老版本的matlab,尝试matlab7,但是64位机器上,安装32位的老版本还是会有错误-_-||
使用matlab2012会碰到整型变量传给实型的warning,换用ifort和icc编译器后,没有再报错,更换编译器的方法为编辑/matlab2012/bin/mexopts.sh脚本,然后使用mex -setup命令,选择上述脚本,覆盖即可

目前情况,鉴于mex编译Fortran出错,有的matlab2018可以编译通过,2012却无法通过,程序可靠性不好,因此最终放弃使用此工具包。

但是mexcdf库,netcdf结构体在其他matlab包中有应用,目前小心使用中。

你可能感兴趣的:(数值模式,matlab)