2014-02-16 2 views
0

В последнее время я столкнулся с netcdf и не знаю, как это использовать. Кроме того, проблема у меня конкретна, и я еще не нашел ничего полезного. У меня есть код fortran, который выполняет claculations в parralel, используя MPI. Конечные результаты - 3D-поля в декартовой системе координат - затем записываются каждый в другой файл с использованием netcdf. Процесс написания определяется следующим кодом:Запись файлов в формате netcdf classic с использованием netcdf4

nf90_create(path=file_name,& 
      cmode=IOR(NF90_NETCDF4,NF90_MPIIO),ncid=ncid,& 
      comm=mpid%comm,info=MPI_INFO_NULL)) 

сейчас, у меня есть еще один код, который использует netcdf3 поэтому он не может читать netcdf4 формат. Что я хочу сделать, так это изменить в cmode NF90_NETCDF4 с помощью NF90_CLASSIC_MODEL. Когда я это делаю, код компилируется, запускается, но он записывает данные совершенно неправильно. Кроме того, он останавливается перед тем, как перейти от записи переменной A к записи переменной B. Или до того, как ей нужно будет выйти из подпрограммы, в которой используется эта команда. Чтобы прояснить немного больше: после представленной команды, код определяет запуск и подсчет в соответствии с MPI и использует followind NetCDF команды:

nf90_def_dim(ncid,dim_name(i),dim_len(i),dimid(i)) 
nf90_def_var(ncid,var_name,nf90_real,dimid,varid(1)) 
nf90_enddef(ncid) 
nf90_put_var(ncid,varid(1),var,start=startv,count=countv) 
nf90_close(ncid) 

Итак, мне интересно, что я должен изменить для кода на записывайте нужные данные в классическом или 64bit_offstring формате без указанных проблем. Если представление проблемы неясно, я могу предоставить исходную подпрограмму, которая вызывает у меня проблемы.

спасибо за все комментарии заранее

+0

из CMakeList кода Я вижу, что используется netcdf4. Чтобы быть более конкретным, вот список всех используемых библиотек, связанных с netcdf: -I/opt/netcdf/netcdf4/include -L/opt/netcdf/netcdf4/lib -lnetcdff -L/opt/pnetcdf/pnetcdf-1.2 .0/lib -L/opt/netcdf/netcdf4/hdf5.1.8.8/lib -lnetcdf -lpnetcdf -lhdf5_hl -lhdf5 -lm -lz -lcurl; – user3316906

ответ

2

ли вы проверить статус дал обратно подпрограммы NetCDF? В любом случае запись в формат NetCDF3 невозможна, поэтому, вероятно, в вашем заявлении nf90_open должна быть ошибка. Попробуйте инкапсулировать вызовы NetCDF в подпрограмму проверки. Это должно дать вам более содержательные сообщения об ошибках:

call check(nf90_open(...)) 


contains 
    subroutine check(status) 
    integer, intent (in) :: status 

    if(status /= nf90_noerr) then 
     print *, trim(nf90_strerror(status)) 
     stop "Stopped" 
    end if 
    end subroutine check