зависимая от компилятора проблема нулевого указателя в фортране - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь скомпилировать один конкретный числовой код с именем NEMO. Я использую компилятор PGI и получаю следующую ошибку, когда пытаюсь запустить дело.

-> report : Performance report : Time spent for XIOS : 4.53964e-05
-> report : Performance report : Time spent in processing events : 0
-> report : Performance report : Ratio : 0%
-> report : Performance report : Time spent for XIOS : 4.54746e-05
-> report : Performance report : Time spent in processing events : 0
-> report : Performance report : Ratio : 0%
0: Null pointer for qrp (/home/user/local/NEMO-4.0/cfgs/MYGYRE/BLD/ppsrc/nemo/diawri.f90: 530)

0: Null pointer for qrp (/home/user/local/NEMO-4.0/cfgs/MYGYRE/BLD/ppsrc/nemo/diawri.f90: 530)

0: Null pointer for qrp (/home/user/local/NEMO-4.0/cfgs/MYGYRE/BLD/ppsrc/nemo/diawri.f90: 530)

0: Null pointer for qrp (/home/user/local/NEMO-4.0/cfgs/MYGYRE/BLD/ppsrc/nemo/diawri.f90: 530)

Соответствующий код из файла diawri.f90 выглядит следующим образом:

530          CALL histwrite( nid_T, "sohefldp", it, qrp           , ndim_hT, ndex_hT )   ! heat flux damping

Ниже приведен интерфейс historywrite

  INTERFACE histwrite
!---------------------------------------------------------------------
!- The "histwrite" routines will give the data to the I/O system.
!- It will trigger the operations to be performed,
!- and the writting to the file if needed
!-
!- We test for the work to be done at this time here so that at a
!- later stage we can call different operation and write subroutine
!- for the REAL and INTEGER interfaces
!-
!- INPUT
!- idf      : The ID of the file on which this variable is to be,
!-            written. The variable should have been defined in
!-            this file before.
!- pvarname : The short name of the variable
!- pitau    : Current timestep
!- pdata    : The variable, I mean the real data !
!- nbindex  : The number of indexes provided. If it is equal to
!-            the size of the full field as provided in histdef
!-            then nothing is done.
!- nindex   : The indices used to expand the variable (pdata)
!-            onto the full field.

Это определение qrp

   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qrp   !: heat flux damping        [w/m2]

Я искал в Интернете и нашел некоторую информацию о том, что это связано со стандартом Fortran 2003 о нулевом указателе. И разные компиляторы по-разному обрабатывают нулевой указатель. Как я знаю, gfortran в основном используется для компиляции этого кода и, похоже, работает нормально. Я хотел бы знать, что я могу сделать, чтобы избежать ошибки без изменения компилятора.

1 Ответ

0 голосов
/ 01 октября 2019

Глядя на код, интерфейс histwrite разрешается в следующую подпрограмму для qrp:

SUBROUTINE histwrite_r2d (idf,pvarname,pitau,pdata,nbindex,nindex)
!---------------------------------------------------------------------
  IMPLICIT NONE
!-
  INTEGER,INTENT(IN) :: idf,pitau,nbindex
  INTEGER,DIMENSION(nbindex),INTENT(IN) :: nindex
  REAL,DIMENSION(:,:),INTENT(IN) :: pdata
  CHARACTER(LEN=*),INTENT(IN) :: pvarname
!---------------------------------------------------------------------
  CALL histw_rnd (idf,pvarname,pitau,nbindex,nindex,pdata_2d=pdata)
!---------------------------
END SUBROUTINE histwrite_r2d

Пустой аргумент pdata (связывается с фактическим qrp)является массивом предполагаемой формы, но не может быть выделенЭто означает, что применяется параграф 7 раздела 15.5.2.4 действующего стандарта Фортрана :

За исключением ссылок на встроенные функции запроса, если фиктивный аргумент неоптимален и фактический аргумент может быть выделен, соответствующий фактический аргумент должен быть выделен .

Другими словами, передача невыделенного qrp в histwrite недопустима в Fortran, потому что компилятор не может связать несуществующий массив с существующим.

Я считаю, что внутренне gfortranпросто передает нулевой указатель, после чего необязательный аргумент pdata_2d при вызове histw_rnd отображается как не присутствует . Но я подозреваю, что это скорее совпадение, чем дизайн.

Вы мало что можете сделать;это проблема кода. Вам необходимо исправить это самостоятельно, возможно, используя непосредственно histw_rnd (в обход histwrite) без каких-либо необязательных аргументов или выделив qrp. Я не думаю, что есть волшебный вариант компилятора для PGI, который просто решил бы это для вас.

...