Атрибут ALLOCATABLE или POINTER определяет параметр deferred-shape-array` в подпрограмме ABAQUS

Код:

  double precision maxstress(w)
  real, dimension(:), allocatable, save :: han(w)
  integer jang(w)


  do i=1,nblock
     if(maxstress(i) . gt. 1000) then
        jang(i) =1
        han(i) = han(i) + 1
     else
        jang(i) =0
     endif

     write(*,*) "jang", i, jang(i)
     write(*,*) "han", i, han(i)
  enddo

выдает сообщение об ошибке:

findnode2.for(47): error #6646: ALLOCATABLE or POINTER attribute dictates a deferred-shape-array   [HAN]
      real, dimension(:), allocatable, save :: han(w)
-----------------------------------------------^

Из этого кода мне нужно сделать статическую переменную han но ошибка #6646 происходит.

Что мне нужно сделать?

2 ответа

Очевидный ответ состоит в том, чтобы удалить allocatable атрибут, поскольку в показанном коде нет ничего, чтобы указать, почему han должен быть распределен. Обратите внимание также dimension(:) лишнее и игнорируется. Просто делать:

  real, save :: han(w)

(По-видимому w целочисленный параметр)

поочередно делать:

  real, dimension(:), allocatable, save :: han

тогда в исполняемом коде делаем allocate(h(w))

В вашем вопросе нет ничего, что указывало бы на то, что это имеет отношение к abaqus.

Здесь много путаницы. Вы говорите, что это подпрограмма, но вы не показали заголовок подпрограммы. Я не знаю, являются ли три массива фиктивными аргументами, что сделало бы их "регулируемыми массивами" с измерением (предположительно), также передаваемым как фиктивный аргумент, или, возможно, они все являются локальными массивами, где w является единственным фиктивным аргументом, что их "автоматические" массивы. В любом случае атрибут ALLOCATABLE или POINTER будет конфликтовать.

Вы также говорите о "статической переменной хан", но нечего предположить, почему она должна быть статической (а это не так).

Если вы хотите, чтобы один или несколько массивов были размещаемыми, вы используете (:) в качестве границ, а затем ВЫДЕЛИТЕ их до желаемого размера. Обратите внимание, что если это локальные переменные, они будут автоматически освобождены при возврате подпрограммы, если только им не присвоен атрибут SAVE. (Если это фиктивные аргументы, вы не можете сказать SAVE, а также, вероятно, что ALLOCATABLE и (:) неуместны, если это вызывается из ABAQUS.

Я предполагаю, что, по крайней мере, некоторые из этих массивов являются фиктивными аргументами, и, возможно, одна или несколько локальных переменных. Если это так, просто удаление ALLOCATABLE должно быть правильным решением. Но, как отметили другие, вы упустили так много, что невозможно знать наверняка.

Другие вопросы по тегам