Fortran - interface explícita
Eu sou muito novo no Fortran, e para minha pesquisa eu preciso de um monstro de modelo correndo, então estou aprendendo como eu estou indo. Então me desculpe se eu fizer uma pergunta "estúpida". Estou tentando compilar (Mac OSX, a partir da linha de comando) e já consegui resolver algumas coisas, mas agora me deparei com algo que não sei como consertar. Acho que entendi o erro, mas, novamente, não sei como consertar.
O modelo é enorme, então eu só vou postar as seções do código que eu acho que são relevantes (embora eu possa estar errado). Eu tenho um arquivo com várias sub-rotinas, que começa com:
!==========================================================================================!
! This subroutine simply updates the budget variables. !
!------------------------------------------------------------------------------------------!
subroutine update_budget(csite,lsl,ipaa,ipaz)
use ed_state_vars, only : sitetype ! ! structure
implicit none
!----- Arguments -----------------------------------------------------------------------!
type(sitetype) , target :: csite
integer , intent(in) :: lsl
integer , intent(in) :: ipaa
integer , intent(in) :: ipaz
!----- Local variables. ----------------------------------------------------------------!
integer :: ipa
!----- External functions. -------------------------------------------------------------!
real , external :: compute_water_storage
real , external :: compute_energy_storage
real , external :: compute_co2_storage
!---------------------------------------------------------------------------------------!
do ipa=ipaa,ipaz
!------------------------------------------------------------------------------------!
! Computing the storage terms for CO2, energy, and water budgets. !
!------------------------------------------------------------------------------------!
csite%co2budget_initialstorage(ipa) = compute_co2_storage(csite,ipa)
csite%wbudget_initialstorage(ipa) = compute_water_storage(csite,lsl,ipa)
csite%ebudget_initialstorage(ipa) = compute_energy_storage(csite,lsl,ipa)
end do
return
end subroutine update_budget
!==========================================================================================!
!==========================================================================================!
Eu recebo mensagens de erro ao longo das linhas de
budget_utils.f90: 20.54:
real, externo :: compute_co2_storage 1
Erro: O argumento fictício 'csite' do procedimento 'compute_co2_storage' em (1) possui um atributo que requer uma interface explícita para este procedimento
(Eu pego um monte deles, mas eles são essencialmente todos iguais). Agora, olhando ed_state_vars.f90 (que é "usado" na sub-rotina), eu acho
!============================================================================!
!============================================================================!
!---------------------------------------------------------------------------!
! Site type:
! The following are the patch level arrays that populate the current site.
!---------------------------------------------------------------------------!
type sitetype
integer :: npatches
! The global index of the first cohort in all patches
integer,pointer,dimension(:) :: paco_id
! The number of cohorts in each patch
integer,pointer,dimension(:) :: paco_n
! Global index of the first patch in this vector, across all patches
! on the grid
integer :: paglob_id
! The patches containing the cohort arrays
type(patchtype),pointer,dimension(:) :: patch
Etc etc - isso vai por um outro 500 linhas ou mais. Então, para chegar ao ponto, parece que a sub-rotina original precisa de uma interface explícita para seus procedimentos, a fim de poder usar o csite argumento (fictício). Mais uma vez, eu sou tão novo para Fortran, mas estou realmente tentando entender como ele "pensa". Eu tenho procurado o que significa ter uma interface explícita, quando (e como!) Usá-la etc. Mas não consigo entender como isso se aplica no meu caso. Devo talvez usar um compilador diferente (Intel?). Alguma dica?
Edit: Entãocsite
é declarado umtarget
em todos os procedimentos e da declaraçãotype(site type)
contém um monte depointer
s, conforme especificadositetype
. Massitetype
está sendo propriamenteuse
d de outro módulo (ed_state_vars.f90
) em todos os procedimentos. Então eu ainda estou confuso porque me dá o erro de interface explícita?