Abaqus DFLUX подпрограмма в Фортране - PullRequest
1 голос
/ 06 марта 2019

это мой первый пост здесь, и я надеюсь, что мне будет понятно, с какими проблемами я столкнулся с Abaqus subroutine.Я новичок, использующий Fortran.По сути, моя цель состоит в том, чтобы определить неоднородный поверхностный тепловой поток по трубе открытого сечения, и я использую DFLUX subroutine.Будучи открытым поперечным сечением, поток зависит от самозатенения структуры и должен быть определен соответствующим образом.Видимо подпрограмма вызывается в каждой точке интегрирования, так что координаты этих точек не сохраняются, и у меня каждый раз только значения X, Y, Z для одной точки.То, что я хотел бы сделать, это сохранить все координаты в одном массиве, чтобы я мог сравнить различные точки, чтобы применить условия для теплового потока.Я прочитал о ОБЩИХ блоках или команде SAVE, но я не могу найти, как использовать такие опции в моей подпрограмме.Я надеюсь, что я достаточно ясно.Это подпрограмма, которую я использую:

     SUBROUTINE DFLUX(FLUX,SOL,JSTEP,JINC,TIME,NOEL,NPT,COORDS,JLTYP,
 1 TEMP,PRESS,SNAME)

  INCLUDE 'ABA_PARAM.INC'

   REAL X,Y,Z,t,pi,theta
   parameter(pi=3.1415)
   DIMENSION COORDS(3),FLUX(2),TIME(2)

   CHARACTER*80 SNAME

  X=COORDS(1)-0.1 ! X coordinate of the center in global ref
  Y=COORDS(2)+0.1732 ! Y coord of the center in global ref
  Z=COORDS(3)
  t=TIME(2)
  theta=atan2(X,Y)
  if (JSTEP.eq.1) then !Step with heat flux impinging on structure
  !flux dependant on the angle of incidence
      if (theta.ge.0 .and.theta.le.pi/2 .or. theta.le.-pi/2) then
       flux(1)=1400*abs(cos(theta))
       flux(2)=0
    else !shadowed portion of the structure
       flux(1)=0
       flux(2)=0
    endif
  else
     STOP
  endif
  RETURN

  END

1 Ответ

2 голосов
/ 06 марта 2019

background: Abaqus предоставляет несколько «шаблонов» подпрограмм Fortran (в стиле фиксированного формата / F77), которые позволяют пользователям получать конкретную информацию или влиять на определенные аспекты решения во время анализа, или пользователь-subroutines.Abaqus контролирует, когда вызываются пользовательские подпрограммы, какая информация передается в / из и т. Д. Пользователи не могут ничего менять и не имеют доступа к основной программе или ее собственному исходному коду.Однако в пользовательской подпрограмме пользователь может свободно написать любой допустимый код, который он считает необходимым.

В этом вопросе OP хочет сохранять информацию от каждого вызова к пользовательской подпрограмме dflux, чтобы она была доступна другим подпрограммам или другим вызовам подпрограммы dflux.Примечание: эта возможность не предоставляется dflux, поэтому OP требует обходного пути.

возможные обходные пути: К счастью, пользовательская подпрограмма dflux предоставляет номер элемента, номер точки интеграции и пространственные координаты для текущего вызова.Эта информация, вероятно, может быть использована для хранения (и доступа) любых данных, которые вам нужны.Способ хранения / передачи данных может быть реализован через блок COMMON, модуль Fortran или даже текстовый файл или некоторую другую внешнюю «базу данных».

> Я рекомендую модульный подход.Однако, смотрите этот ответ для хорошего объяснения того, как использовать ОБЩИЕ блоки и модули.

(РЕДАКТИРОВАТЬ) Для полноты, очень простой пример с модулем и подпрограммой abaqus можно структурировать примерно так:

module data_mod
  ! Any routine may access this module with the statement: "USE data_mod".
  ! Any variable within the module is then shared by those routines.

  implicit none

  ! You can use an allocatable array, but for this example I will assume
  ! there are 1000 or fewer points, and up to 10 values for each.
  real, dimension(1000,10) :: point_data

end module data_mod


subroutine dflux(....all the args...)
  ! Note: you must "USE" modules before any other statements in the routine.

  use data_mod

  ! Now you may carry on with the rest of your code. 
  ! Be sure to have the required "INCLUDE 'ABA_PARAM.INC" statement,
  ! which defines how abaqus implements "IMPLICIT REAL" for your machine,
  ! and all of the boilerplate variable declarations included with the 
  ! DFLUX subroutine template.

  include 'aba_param.inc'
  (...etc...)

  ! For simplicity, I am assuming you have a unique ID for each point, and
  ! each ID is numerically equal to one of the row indices in 'point_data'.
  ! When ready to read/write data in the 'point_data' array:

  ! Read data:
  neighbor_vals(:) = point_data(NEIGHBOR_ID, 2:)
  old_data_at_current_point(:) = point_data(ID, 2:)

  (...etc...)

  ! Write data:
  point_data(ID,2:4) = coords(:)
  point_data(ID,5) = result1
  point_data(ID,6) = result2

end subroutine dflux

> Вам нужно будет выбрать тип контейнера данных и некоторую умную организационную концепцию - возможно, используя номер элемента, номер точки интеграции или координаты (x, y, z), чтобы однозначно идентифицировать данные, которые вы хотите сохранить.Например, может быть достаточно простого 2-мерного массива (MxN): каждая строка представляет точку интеграции M th , первый столбец содержит уникальный идентификатор (идентификаторы) точки, а остальные столбцы содержат любые значенияВы хотите хранить из каждой точки.Примечание: определение того, какие точки являются «соседями», является еще одной темой, для которой вам потребуется умное решение.После того, как вы это сделаете, возможно, соседние точки также могут быть сохранены в массиве для более быстрого доступа.

> Вы можете безопасно читать данные из других точек интеграции, хранящихся в контейнере данных., но не записывайте / не изменяйте значения, хранящиеся в контейнере данных (независимо от того, находится ли он в блоке COMMON или в модуле), если только он не предназначен для текущей точки интеграции, где в данный момент вызывается dflux.


примечания:

  1. Новые пользователи часто думают, что застряли, написав FORTRAN 77 в своих подпрограммах Abaqus. Они не .
  2. Самый простой способ использовать модули вместе с пользовательскими подпрограммами abaqus - это разместить их в верхней части вашего файла.Abaqus будет автоматически компилировать и связывать их при запуске анализа.
...