Формат netCDF

Большую часть времени у океанолога занимает общение с различными программами и написание небольших программ для обработки и визуализации данных. Обсуждению этого и посвящён данный раздел.

Модераторы: Magik, koldunov aleksey, kostek

Формат netCDF

Сообщение Magik » Сб окт 21, 2006 8:18 pm

Выкладываю статью по netCDF, перед тем как публиковать на сайте (ещё фиг знает где её выкладывать, в каком разделе...) хотелось бы получить коментарии - что осталось непонятным и вообще понятно ли что ни будь из этой статьи :)

Формат данных netCDF

В огромном количестве файлы формата netCDF можно найти на развалах океанологических данных. Расширение у него обычно .nc . Формат этот является очень распространённым, его поддерживает масса программ, а некоторые модели даже сохраняют нём свои результаты.

Так как мы работаем с научными данными, и тем более с данными океанологическими (или метеорологическими, для которых формат изначально создавался), то представлять наши циферки удобнее всего в виде массивов, то есть матриц. Также любой нормальный учёный хочет знать, в каких единицах измерялся тот или иной параметр, с помощью каких инструментов (или модели) он был получен, кто автор и так далее. Это называется метаданные. Можно конечно всё это запихать в отдельный файл, но гораздо удобнее хранить это дело там же где находятся ваши данные. Это и позволяет сделать netCDF . К тому же формат обеспечивает так называемую кроссплатформенность, то есть читаться информация будет одинаковым образом на всех машинах и операционных системах, что для научного мира очень актуально.

Существует два вида NetCDF - классический 32 битный и 64 битный, созданный для поддержки файлов размером более 2 гигабайт. 64 битный формат введён начиная с netCDF версии 3.6. Проблема в том, что многие программы сторонних разработчиков ещё не включили поддержку 64 битной версии, поэтому рекомендуется её использовать, только если вам ОЧЕНЬ надо :);

Модель данных

Набор данных netCDF состоит из трёх основных компонентов. Размерностей (dimensions), переменных (variables) и атрибутов (attributes), каждый из которых имеет имя и идентификационный номер ID . Используя эти компоненты можно описать данные и отношения между ними.
Чтобы проиллюстрировать концепцию модели данных netCDF, давайте посмотрим на маленький пример на языке CDL (Common Data Language). При переводе файла .nc в ASCII (при помощи программки ncdump ), вы увидите текст программы написанный на этом языке. Можно его воспринимать и просто как способ представления информации.

Код: Выделить всё
netcdf example_1 { // пример описания данных в формате netCDF на языке CDL

dimensions: // сначала даются определения размерностям (имя и длинна)

          lat = 5, lon = 10, level = 4, time = unlimited;

variables: // определяются типы, имена, размеры и атрибуты переменных

          float temp(time,level,lat,lon);
                 temp:long_name = "temperature";
                 temp:units = "celsius";

          float rh(time,lat,lon);
                 rh:long_name = "relative humidity";
                 rh:valid_range = 0.0, 1.0; // min and max

          int lat(lat), lon(lon), level(level);
                 lat:units = "degrees_north";
                 lon:units = "degrees_east";
                 level:units = "millibars";

          short time(time);
                 time:units = "hours since 1996-1-1";

// определяются глобальные атрибуты


                        :source = "Fictional Model Output";

data: // тут собственно находятся данные

           level = 1000, 850, 700, 500;

           lat = 20, 30, 40, 50, 60;

           lon = -160,-140,-118,-96,-84,-52,-45,-35,-25,-15;

           time = 12;

           rh =.5,.2,.4,.2,.3,.2,.4,.5,.6,.7,
                 .1,.3,.1,.1,.1,.1,.5,.7,.8,.8,
                 .1,.2,.2,.2,.2,.5,.7,.8,.9,.9,
                 .1,.2,.3,.3,.3,.3,.7,.8,.9,.9,
                 0,.1,.2,.4,.4,.4,.4,.7,.9,.9;
}


В принципе язык довольно прозрачный и кое что должно было начать проясняться :); В Любой момент .nc файл можно преобразовать программой ncdump в формат понятный простому смертному, то есть в ASCII . Как уже говорилось выше, открыв текстовый файл вы увидите там код на CDL . Конечно его можно подправить, изменить описания переменных, добавить какие то параметры, а затем преобразовать обратно в бинарный файл .nc при помощи ncgen . При обратном преобразовании можно также например задать 32 битный или 64 битный формат.

Итак, основная структура файла следующая:

Код: Выделить всё
netCDF name {
  dimensions: ...
variables: ...
data: ...
}


Рассмотрим каждую из частей в отдельности.

Измерения (dimensions)

Их можно использовать для того чтобы представить реальные физические измерения, например время, широту, долготу, глубину или высоту. Измерения обладают именем и длинной. Длинна это положительное целое число. Одно из измерений может иметь длину UNLIMITED. Чаще всего таким измерением делают время (time) . На мой взгляд, измерения можно воспринимать как размерности матрицы, которую представляют собой ваши данные.
В примере приведённом выше четыре измерения - lat, lon, level и time. Первым трём присвоены фиксированные длины, а у времени длинна unlimited.
Основной единицей данных в netCDF является переменная (variable) (см дальше). При определении переменной её форма описывается как список измерений (dimension). Эти измерения должны уже существовать. Количество измерений называется рангом (rank). Скаляр (одиночное число) обладает рангом 0, вектор (линейный список чисел) рангом 1, а матрица рангом 2.
Например, температура поверхности океана SST (Sea Surface Temperature) за каждый месяц может быть задана в следующих измерениях:

SST (широта, долгота, время) - тут уже три измерения, то есть ранг 3

А вот если нам вздумается пойти вглубь и описать температуру, скажем, на стандартных горизонтах то получится что:

T(широта, долгота, время, горизонт). - то есть ранг уже 4 и это не предел :);

Переменные (variables)

Переменные используются для того чтобы хранить в них данные. Они представляют собой множество значений (зачастую матрицу значений) одного типа. Переменная обладает именем, типом данных, и формой описываемой списком измерений (dimensions). Всё это дело задается, когда переменная создаётся. Также у переменной могут быть атрибуты (attributes) которые возможно удалять, добавлять или изменять, после того как переменная создана.

Типы данных могут быть byte, char, short, int, float и double.

    char Characters.
    byte Eight-bit integers.
    short 16-bit signed integers.
    int 32-bit signed integers.
    float IEEE single-precision floating point (32 bits).
    double IEEE double-precision floating point (64 bits).

Если у переменной есть измерения то задаётся она следующим образом:
Код: Выделить всё
type variable_name ( dim_name_1, dim_name_2, ... );


если переменная скаляр то:
Код: Выделить всё
type variable_name;


В примере приведённом выше - 6 переменных. Четыре из них переменные координат. Оставшиеся две temp и rh содержат собственно данные (иногда эти переменные называют основными (primary variables)). У каждой из этих двух переменных первым измерением стоит время, которое имеет длину unlimited, таким образом они являются record variables (не могу перевести на русский). Те переменные, что не являются record variables обладают фиксированной длинной, определяемой произведением их измерений. Как бы путано не звучали два последних предложения смысл у них очень простой - есть переменные с фиксированным размером (или если угодно длинной), это может быть набор каких ни будь коэффициентов на которые вы постоянно умножаете свои данные, или, что более вероятно, значение широты или долготы в каждой точке вашей сетки если она не регулярная (об этом я расскажу позднее). А есть переменные у которых одно из измерений не фиксировано - чаще всего это время. То есть вы в любой момент сможете добавить к своему файлу с SST данные за ещё один год без каких либо проблем.

Переменные координат (coordinate variables)

Переменная может обладать тем же именем что и измерение. Такие переменные для самой библиотеки netCDF ничего особого не означают. Но существует своего рода стандарт по которому подобные переменные обрабатываются особым образом программами использующими эту библиотеку.
Переменная с тем же именем что и измерение называется переменной координат (coordinate variable). Обычно она определяет физические координаты относящиеся к соответствующему измерению. Наш пример включает в себя переменные координат lat, lon, level и time определённые следующим образом:

Код: Выделить всё
int lat(lat), lon(lon), level(level);
short time(time);
...
data:
level = 1000, 850, 700, 500;
lat = 20, 30, 40, 50, 60;
lon = -160,-140,-118,-96,-84,-52,-45,-35,-25,-15;
time = 12;


То есть мы определяем широты, долготы, барометрическое давление (с тем же успехом это может быть и глубина) и время относящееся к положениям вдоль измерений. Таким образом, тут мы имеем данные на высотах относящихся к 1000, 850, 700 и 500 миллибарам, широтам 20 30 40 50 и 60 градусов северной широты и так далее по списку.
Приложения которые используют переменные координат зачастую предполагают что они являются числовыми векторами и монотонны (все значения разные и либо уменьшаются либо увеличиваются). Использовать переменные координат приятно и полезно когда ваши данные находятся на регулярной сетке. Предположим что сетка у вас в 1 градус. Тогда вы можете легко задать измерения

Код: Выделить всё
dimensions:
 lat  = 180, lon = 360


и переменные

Код: Выделить всё
variables:
  int lat(lat), lon(lon)


а затем заполнить их:

Код: Выделить всё
data:
 lat = -90, -89, -88 ....... 88 89 90;
            lon = -180, -179 ....... 179 180;


Но всё гораздо неприятнее когда сетка нерегулярная, полюс куда ни будь смещён и вообще имеются разные неприятности с проекциями. Тогда вам придётся создавать переменные lat и lon которые уже будут двумерными, то есть матрицами описывающими значение широты и долготы в центральных точках ячеек вашей сетки. Если вы собрались делать всё совсем красиво и грамотно, то необходимы будут также переменные содержащие в себе координаты углов каждой ячейки сетки. Вот пример такого файла:

Код: Выделить всё
netcdf E23_sico_1980-1999_mean_01 {
dimensions: // измерения задаются просто как x и y
     x = 254 ;
     y = 220 ;
     nv = 4 ; // количество углов каждой ячейки сетки
     lev = 1 ;// горизонт, так как данные это концентрация льда, то горизонт нам нужен всего один
     time = UNLIMITED ; // (1 currently)

variables:

     float lon(y, x) ; // Задаётся переменная в которой будет храниться матрица с долготами, она двумерная и зависит от измерений y и x? Дальше идут атрибуты, мы на них пока не будем обращать внимания.
        lon:long_name = "longitude" ;
        lon:units = "degrees" ;
        lon:standard_name = "grid_longitude" ;
        lon:bounds = "lon_bounds" ;

    float lon_bounds(y, x, nv) ; // здесь задаётся переменная в которой будут храниться координаты углов ячеек нашей сетки, так как углов у каждой ячейки 4 то появляется дополнительное измерение nv
 
    float lat(y, x) ; // всё то же самое проделывается для широты
       lat:long_name = "latitude" ;
       lat:units = "degrees" ;
       lat:standard_name = "grid_latitude" ;
       lat:bounds = "lat_bounds" ;
 
    float lat_bounds(y, x, nv) ;

    double lev(lev) ;
       lev:long_name = "generic" ;
       lev:units = "level" ;
   
    double time(time) ;
       time:units = "day as %Y%m%d.%f" ;

     float SICOMO(time, lev, y, x) ; // здесь переменная в которой собственно и будут храниться наши данные. Зависит она от 4 измерений.
       SICOMO:long_name = "ice compactness" ;
       SICOMO:units = "frac." ;
       SICOMO:code = 15 ;
       SICOMO:table = 128 ;
       SICOMO:coordinates = "lon lat" ;// а вот тут самое интересное - при помощи атрибутов говорится что координаты для SICOMO хранятся в переменных lon и lat
}


Таким образом мы и выходим из положения. Атрибуты, о которых речь дальше, говорят софту работающему с файлом, что при выводе данных на экран, например, в качестве координат нужно использовать lon и lat а не y и x.

Атрибуты (atributes)

Атрибуты в netCDF используются для того чтобы сохранять данные о данных, короче говоря метаданные. Большинство атрибутов представляют информацию о конкретной переменной. Такие атрибуты идентифицируются по имени (или ID) этой переменной и имени атрибута.

Некоторые атрибуты хранят информацию обо всём датасете и называются глобальными атрибутами. Они идентифицируются по имени атрибута и пустому имени переменной (в CDL) .

Атрибут обладает переменной, с которой он ассоциируется, собственным именем, типом данных, длинной и значением.
Имена атрибутов, которые являются общепринятыми (conventional) должны быть использованы где возможно. Новые имена должны быть настолько осмысленными насколько это возможно.

Тип данных атрибута назначается, когда он создаётся. То есть отдельно его оговаривать не надо, он определяется автоматически исходя из того, какое значение было присвоено атрибуту.

Атрибуты более динамичны чем переменные или измерения, их можно удалять, их тип, длину и значения можно изменять после создания, в то время как интерфейс netCDF не позволяет удалять, например, переменную или изменять её тип или размер.

Синтаксис CDL для определения атрибутов переменных следующий:

Код: Выделить всё
variable_name:attribute_name = list_of_values;


а для глобальных атрибутов:

Код: Выделить всё
 :attribute_name = list_of_values;


В примере приведённом выше, единицы измерения это атрибут для переменной lat , которая обладает 13 символьным значением degrees_north". А valid_range это атрибут для переменной rh который имеет длину 2 и значения 0.0" и 1.1".

В примере также определён глобальный атрибут source". Это множество символьных значений созданная для того чтобы описать данные. Реальный датасет netCDF может иметь больше глобальных атрибутов которые могут сообщать о происхождении, истории, соглашениях и других характеристиках всего датасета.

Большинство программ работающих с netCDF понимают стандартные атрибуты и очень рекомендуется их использовать если только нет серьёзных причин не делать этого. Стандартные атрибуты можно найти в руководстве по netCDF (Appendix B [Atribute Conventions], page 45 ).

Работа с netCDF в Matlab
UPD: В новых версиях Matlab (начиная с 7.7) поддержка netCDF встроена. О том как копировать данные из netCDF в переменные Matlab последних версий, смотрите в этом посте http://koldunov.net/?p=540
Информация ниже только для версий Matlab ниже 7.7!


Для работы с netCDF в Matlab вам понадобятся mexnc и netCDF Toolbox

Оказалось что в установке mexnc для Matlab под Windows нет ничего особо сложного, главное тыкать мышкой вовсюда и прописывать как можно больше путей.
Порядок следующий:
1. Сначала с этой страницы скачиваем сам mexnc (я скачивал вариант для Windows R14 Windows XP: Built upon mexnc-2.0.19-3, June 05, 2006. Contributed by Rich Signell.)

2. Распаковываем это дело куда ни будь в доирректорию Matlab ( у меня c:\MATLAB701\ )

3. Копируем файл netcdf.dll из директории mexnc последовательно в c:\MATLAB701\bin\ и c:\MATLAB701\bin\win32\ (это естественно если Matlab у вас установлен так же как у меня в папку c:\MATLAB701 ) куда правильней копировать этот файл я не очень понимаю, так что на всякий пожарный скопируем в оба.

4. Добавляем путь к папке с mexnc в path Matlab (это чтобы он знал где искать). Будем делать это с помощью GUI потому как если добавлять из командной строки то при перезапуске у меня все пути почему то слетают. Идем в меню File >> Set Path , добавляем путь до mexnc и заодно (не знаю почему это работает:) ) путь до директории bin, включая все потдирректории в ней содержащиеся (там есть кнопочка Add with Subfolders).

5. Теперь нам нужно закачать netcdf Toolbox. Сделать это можно с той же страницы (ссылка в самом низу). Распаковываем архив куда ни будь (я распаковал в c:\MATLAB701\toolbox\ ) и прописываем к нему пути также как и в предыдущем случае с помощью Set Path (необходимо прописать пути к папкам C:\MATLAB701\toolbox\netcdf_toolbox\netcdf\ncutility C:\MATLAB701\toolbox\netcdf_toolbox\netcdf\nctype
C:\MATLAB701\toolbox\netcdf_toolbox\netcdf )

6. Делаем проверку. Пишем в командной строке Matlab
Код: Выделить всё
which ( 'netcdf', '-all' );

в результате вы должны увидеть что ни будь типа этого

Код: Выделить всё
C:\path\to\netcdf_toolbox\netcdf\@netcdf\netcdf.m
    C:\path\to\MATLAB\bin\netcdf.dll                    % Shadowed
    C:\path\to\MATLAB\bin\win32\netcdf.dll


То есть netcdf.m должен идти обязательно первым.

Теперь всё должно работать. Наберите в командной строке netcdf , если на это Matlab выдаст вам описание netcdf Toolbox то есть шанс (но не гарантия :) ) что вы всё сделали правильно. Теперь вы сможете манипулировать netCDF файлами при помощи Matlab – создавать, изменять, конвертировать, вытаскивать данные и координаты.

Далее идёт пример программы на языке Matlab в котором из текстового файла создаётся файл nc. Исходный файл содержит три колонки – долгота, широта, значение (в данном случае это концентрация льда). Известно что сетка на которой распределены данные имеет размер 125 на 100 и что первым 125 значениям в исходном файле соответствует первая строка сетки (матрицы), вторым 125 значениям вторая строка и так далее. Попутно проводится проверка – если значение концентрации NaN (не число) то присваивается значение 100000000

Код: Выделить всё
   name = strcat('NASA_SICO_01_mean_right.nc');
   name1 = strcat('NASA_SICO_05_mean_right.txt')
 
ncquiet                                              % No NetCDF warnings.
 
 
 
nc = netcdf(name,'clobber');              % Create NetCDF file.
 
nc.description = 'NetCDF Sea Ice Concentration from NSIDC, NASA team Algorithm';
                   % Global attributes.
nc.author = 'Kolya Koldunov';
nc.date = '11.10.2006';
%--------------------- Define dimensions.---------------
nc('x') = 125;
nc('y') = 100;
nc('lev') = 1;
nc('time')= 'unlimited';
 
 
%--------------------- Define longitude ----------------
 
nc{'lon'} = {'y', 'x'};
 
%Atributes
 
nc{'lon'}.long_name = 'longitude';
nc{'lon'}.units = 'degrees';
nc{'lon'}.standard_name = 'grid_longitude' ;
 
%--------------------- Define latitude ------------------
 
nc{'lat'} = {'y', 'x'};
 
%Atributes
 
nc{'lat'}.long_name = 'latitude';
nc{'lat'}.units = 'degrees';
nc{'lat'}.standard_name = 'grid_latitude' ;
 
%---------------------Define SICORE ----------------------
 
nc{'SICORE'} = {'y', 'x'};
 
%Atributes
 
nc{'SICORE'}.long_name = 'ice compactness';
nc{'SICORE'}.units = 'frac.';
nc{'SICORE'}.code = 15 ;
nc{'SICORE'}.coordinates = 'lon lat' ;
 
%------------------- Define level ----------------
 
nc{'lev'} = 'lev';
 
nc{'lev'}.long_name = 'generic' ;
nc{'lev'}.units = 'level' ;
 
%------------------- Define time -----------------
 
nc{'time'} = 'time';
nc{'time'}.units = 'day as %Y%m%d.%f' ;
 
 
%-------------- load data from .txt file ----------
 
f = load(name1, 'w');
llon = zeros(100,125);
llat = zeros(100,125);
ssico = zeros(100,125);
n=1;
 
for k = 1:100
      for l = 1:125
      llon(k,l) = f(n,1);
      llat(k,l) = f(n,2);
      if isnan(f(n,3)) == 1
          f(n,3) = 100000000;
      end
 
      ssico(k,l) = f(n,3);
      n= n+1;
      end
end
 
 
 
%---------------------- Put all data.------------------
 
nc{'lat'}(:,:) = llat;
nc{'lon'}(:,:) = llon;
nc{'SICORE'}(:,:) = ssico;
nc{'lev'}(:) = 1;
 

nc=close(nc);
disp('done')
Последний раз редактировалось Magik Чт ноя 16, 2006 7:11 pm, всего редактировалось 3 раз(а).
Аватара пользователя
Magik
Site Admin
 
Сообщения: 2133
Зарегистрирован: Чт авг 24, 2006 9:21 pm
Откуда: Питер/Гамбург

Сообщение Magik » Сб окт 21, 2006 8:21 pm

Вот такие дела....
Надеюсь что статья поможет разобраться а не сделает всё ещё запутанней :) Жду вопросов, коментариев и дополнений.
Аватара пользователя
Magik
Site Admin
 
Сообщения: 2133
Зарегистрирован: Чт авг 24, 2006 9:21 pm
Откуда: Питер/Гамбург

Сообщение kostek » Вс окт 22, 2006 10:13 pm

Спасибо :)
Очень даже доступно :)
Наверное самая простая программка для работы с этим форматом - это ncBrowse.
С ее помощью можно быстро просмотреть содержание файла, представить данные в графическом виде и перевезти в формат ASCII на языке CDL.
Кстати, эта программа совершенно бесплатна и может быть установлена на многих платформах, включая Windows и LINUX.
kostek
Завсегдатай
 
Сообщения: 157
Зарегистрирован: Ср сен 06, 2006 2:24 pm
Откуда: Санкт-Петербург

Для тех кто в Матлабе

Сообщение kostek » Вс окт 22, 2006 10:27 pm

Ну и конечно примочка к MATLAB под название MEXNC , которая может уже гораздо больше. Но и разобраться в ней сложнее будет.
kostek
Завсегдатай
 
Сообщения: 157
Зарегистрирован: Ср сен 06, 2006 2:24 pm
Откуда: Санкт-Петербург

Сообщение Magik » Вс окт 22, 2006 11:47 pm

MEXNC в принципе просто как правда... к нему нужен netCDF Toolbox Попозже выложу програмку для перевода спутниковых данных в netCDF при помощи этого тулбокса. Проблема в том что мне не удалось правильно его установить на винду... Если у кого то это получилось (например у тебя, Костя) - было бы интересно почитать руководство.
Аватара пользователя
Magik
Site Admin
 
Сообщения: 2133
Зарегистрирован: Чт авг 24, 2006 9:21 pm
Откуда: Питер/Гамбург

Сообщение kostek » Сб окт 28, 2006 7:56 pm

Не рекомендую устанавливать последнюю версию библиотеки netcdf, а именно NETCDF-3.6.2 beta 4. У нее конфликты с интеловским девятым компилятором фортрана (Intel Fortran Compiler 9.0) под Линукс. Сейчас вот установил так теперь даже модель ROMS не компилируется. Судя по всему эта версия компилятора не создает некоторые файлы, которые присутствовали в предыдущих версиях библиотеки, и которые нужны для компиляции модели. Это конечно не утверждение, но предупреждение. Сложностью оказалось и само удаление новой библиотеки, чтоб восстановить старую. Проблема пока не решена...
Если кто что знает... пишите
kostek
Завсегдатай
 
Сообщения: 157
Зарегистрирован: Ср сен 06, 2006 2:24 pm
Откуда: Санкт-Петербург

Сообщение Magik » Сб окт 28, 2006 8:01 pm

Костя, тебя погубит страсть ко всему новому :) На кой фиг ставить бету? У нас на работе новую версию программы устанавливают не раньше чем через 3 месяца после появления ОКОНЧАТЕЛЬНОЙ ВЕРСИИ. Ты ж не тестер, тебе работать а не код изменять :)
Аватара пользователя
Magik
Site Admin
 
Сообщения: 2133
Зарегистрирован: Чт авг 24, 2006 9:21 pm
Откуда: Питер/Гамбург

Сообщение kostek » Сб окт 28, 2006 8:38 pm

Так в том-то и дело. что предлагается скачивать именно ее - бету. А чтоб скачать релиз это надо постараться еще чтоб его найти. Ну это конечно не очень сложно, если правильно прикинуть куда ткнуть :) А вообще бета эта лежит уже 2,5 месяца :) Ну в общем нагрели меня на ней...
kostek
Завсегдатай
 
Сообщения: 157
Зарегистрирован: Ср сен 06, 2006 2:24 pm
Откуда: Санкт-Петербург

Сообщение Magik » Сб окт 28, 2006 8:44 pm

Странно... Дебильная у них политика... Попробуй другой компилятор фортрана какой нить (gcc может быть), их же бесплатных много под Linux вроде. У них на какой версии фортрана код?
Аватара пользователя
Magik
Site Admin
 
Сообщения: 2133
Зарегистрирован: Чт авг 24, 2006 9:21 pm
Откуда: Питер/Гамбург

Сообщение kostek » Сб окт 28, 2006 9:04 pm

Да тут даже смена фортрана не поможет... потому что в этой бете переделана немного структура, например нет одного конфигурационного файла... (может он теперь включен в какой-то другой файл) и главное, что после установки беты не появляются файлы необходимые для модели!!!!
kostek
Завсегдатай
 
Сообщения: 157
Зарегистрирован: Ср сен 06, 2006 2:24 pm
Откуда: Санкт-Петербург

Сообщение Magik » Сб окт 28, 2006 9:10 pm

Ну не может же быть чтобы 2 месяца така кака лежала... Фортраном думаю много кто компилирует, так что должно работать :) Может ты версию для си скачал :)) ? Ты на каком линуксе сидишь? Может для него есть уже скомпилированные версии? Тебе обязательно фортраном компилировать?
Аватара пользователя
Magik
Site Admin
 
Сообщения: 2133
Зарегистрирован: Чт авг 24, 2006 9:21 pm
Откуда: Питер/Гамбург

Сообщение kostek » Ср ноя 01, 2006 3:18 pm

В общем все закончилось переустановкой Линукса - Red Hat Enterprise 4
И похоже дело действительно в моем случае было не в netcdf. В конечном итоге я нашел ошибку, которая вкралась подлым образом в файлы ROMS - остались настройки с другой машины. В общем виновата (как чаще всего и бывает по мировой статистике) прокладка между клавиатурой и головой. Ну или где-то близко к этому :)
Хотя у этой бетки действительно есть некоторые проблемы с фортраном, об этом нашел информацию у них на сайтах
kostek
Завсегдатай
 
Сообщения: 157
Зарегистрирован: Ср сен 06, 2006 2:24 pm
Откуда: Санкт-Петербург

Сообщение Magik » Пт ноя 10, 2006 5:30 pm

Добавил про работу с netCDF в MATLAB - смотрите первый пост. Жду коментариев и вопросов :)
Аватара пользователя
Magik
Site Admin
 
Сообщения: 2133
Зарегистрирован: Чт авг 24, 2006 9:21 pm
Откуда: Питер/Гамбург

Сообщение kostek » Чт ноя 16, 2006 6:30 pm

Может быть я и ошибаюсь.... еще пока плохо знаю Матлаб, но мне кажется что вот здесь ошибка:

llon = zeros(100,100);
llat = zeros(100,100);
ssico = zeros(100,100);


Думается, что не правильно указана размерность массива: в одном из случаев должно быть указано не 100 а 125. Иначе не работает :)
Ну если я ошибаюсь.... то тогда прошу объяснить смысл этих массивов...

Копируем файл netcdf.dll из директории mexnc последовательно в c:\MATLAB701\bin\ и c:\MATLAB701\bin\win32\ (это естественно если Matlab у вас установлен так же как у меня в папку c:\MATLAB701 ) куда правильней копировать этот файл я не очень понимаю, так что на всякий пожарный скопируем в оба.


Этот файл действительно надо копировать в оба директория - так указано буржуйском руководстве по установке mexnc. И это условие необходимое!
kostek
Завсегдатай
 
Сообщения: 157
Зарегистрирован: Ср сен 06, 2006 2:24 pm
Откуда: Санкт-Петербург

Сообщение Magik » Чт ноя 16, 2006 7:16 pm

Да, Костя, ты прав, я изменил (я просто поменял размерност массива чтоб было понятней что куда ставить, но по ходу не везде).
Сказано так сказано.... я вот сейчас поискал, вообше нигде об этом упоминания не нашел :) Работаэт и хорошо :) главное теперь НИЧЕГО НЕ ТРОГАТь!!!!! :)))
Аватара пользователя
Magik
Site Admin
 
Сообщения: 2133
Зарегистрирован: Чт авг 24, 2006 9:21 pm
Откуда: Питер/Гамбург

След.

Вернуться в Программы и программирование

cron