Возвращаемый тип несоответствие вызывающая функция - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть файл fortran.f и я хочу его скомпилировать в Linux. Я не знаю, что я делаю неправильно. Я получаю следующую ошибку в моей подпрограмме:

VHImpUmat.f:476:20:

  sv%Fm = get_Fm(T)                                                 !     $F_M(\Tb)$ limit stress obliquity (depends on $\theta$)
               1
Error: Return type mismatch of function ‘get_fm’ at (1) (UNKNOWN/REAL(8))
AVHImpUmat.f:476:14:

  sv%Fm = get_Fm(T)                                                 !      $F_M(\Tb)$ limit stress obliquity (depends on $\theta$)
          1
Error: Function ‘get_fm’ at (1) has no IMPLICIT type

Моя подпрограмма:

subroutine stiffness_and_derivatives(T,sv,mat,d,msg)
  use tools_lt
  use constitutive_names
  implicit none
  type (MATERIALCONSTANTS),intent(in) :: mat
  type (STATEVARIABLES),intent(inout) :: sv
  type (DERIVATIVES), intent(inout) :: d
  type (MESSAGE),intent(inout) :: msg
  character*40 :: whereIam
  real(8), intent(in) :: T(3,3)
  real(8), dimension(3,3,3,3,3,3) :: c,ctransp
  real(8) :: trT3,fac

  sv%Fm = get_Fm(T)                                                 !   $F_M(\Tb)$ limit stress obliquity (depends on $\theta$)
  sv%That = hated(T)                                                !    $\hat {\Tb} = \Tb / \tr \Tb$
  sv%LLhat= sv%Fm*sv%Fm*Idelta+mat%az2*(sv%That .out. sv%That)      !   linear hp stiffness $ \hat{\cE} = a^2 \left[ \left(\Frac{F_M}{a}\right)^2 \cI + \hTb \hTb \right] $
  sv%LL   = -( sv%trT/(3.0d0*mat%Cs) )* sv%LLhat                    !   $ \cE = \frac{-\tr\Tb}{3 \kappa} \hat{\cE}$
!----- dLLhatdT ----------
  trT3 = sv%trT**3                                                  !    $\tr^3 \Tb$
  fac =  mat%az2 / trT3
  c = (Idelta .out. T)                                              !   $c_{ijmnkl}= I_{ijmn}T_{kl}$
  ctransp = tpose35i46(c)                                           !   $c^T= c_{ijklmn}$
  d%dLLhatdT = fac * ( sv%trT*ctransp + sv%trT*(T .out. Idelta)
 &              - 2.0d0*( T .out. ( T .out. delta) ) )              !    $ \hat E_{ijklmn}'=a^2\left(\dfrac{ T_{rr} I_{ijmn}T_{kl} + T_{rr} T_{ij}I_{klmn}-2  T_{ij}T_{kl} \delta_{mn} }{ (T_{rr})^3}    +  2 \dfrac{F_M}{a} I_{ijkl}F'_{M\, mn}  \right)$
                                                                    !    $F'_M \approx 0$ is assumed
  d%dLLdT = -(1.0d0/(3.0d0*mat%Cs) )*((sv%LLhat .out. delta)        !   $\cE_{ }' = \frac{-1}{3 \kappa}  \hat\cE \oneb + \dfrac{-\tr \Tb}{3\kappa}\hat\cE'$
 &              + sv%trT*d%dLLhatdT )
end subroutine stiffness_and_derivatives

1 Ответ

0 голосов
/ 14 ноября 2018

В вашей подпрограмме у вас есть утверждение implicit none. Это очень хорошо и считается хорошей практикой программирования.

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

Мы действительно не можем видеть, что это за переменная sv% Fm, так как она, вероятно, определена в одном из тех модулей, которые вы используете. Для ответа предположим, что Fm-компонент sv является вещественным (8) (подсказка в сообщении об ошибке): Вы должны объявить функцию следующим образом:

real(8) :: get_fm

Вы могли бы сделать это наверху с остальными объявлениями переменных.

Второе сообщение об ошибке Error: Function ‘get_fm’ at (1) has no IMPLICIT type, по сути, говорит о том, что вы не объявляли тип возврата вашей функции, когда нет неявной типизации.

Первое сообщение об ошибке Error: Return type mismatch of function ‘get_fm’ at (1) (UNKNOWN/REAL(8)) всегда перечисляет 2 типа. Первый тип находится в программном модуле using, а второй тип является типом возвращаемого значения в самой функции. Так как вы не объявили функцию в своей подпрограмме, она сообщает «неизвестно» для этой. Если, например, вы случайно объявили ее как целочисленную функцию, она будет иметь (integer / real (8)) там, и это немного более понятно из-за несоответствия типов.

Таким образом, добавление объявления 1 устраняет обе ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...