Sono molto nuovo per Fortran, e per la mia ricerca ho bisogno di far girare un mostro di una modella, quindi sto imparando mentre sto andando avanti. Quindi mi dispiace se faccio una domanda "stupida". Sto cercando di compilare (Mac OSX, dalla riga di comando) e sono già riuscito a risolvere alcune cose, ma ora mi sono imbattuto in qualcosa che non so come risolvere. Penso di avere l'idea dietro l'errore, ma ancora una volta, non sono sicuro di come risolvere.Fortran - interfaccia esplicita
Il modello è enorme, quindi inserirò solo le sezioni di codice che ritengo rilevanti (anche se potrei sbagliarmi). Ho un file con diverse subroutine, che inizia con:
!==========================================================================================!
! 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
!==========================================================================================!
!==========================================================================================!
ricevo messaggi di errore lungo le linee di
budget_utils.f90: 20.54:
reale, esterno :: compute_co2_storage Errore: L'argomento fittizio 'csite' della procedura 'compute_co2_storage' in (1) ha un attributo che richiede un'interfaccia esplicita per questa procedura
(I ge un sacco di loro, ma sono essenzialmente tutti uguali). Ora, guardando ed_state_vars.f90 (che viene "usato" nella subroutine), trovo
!============================================================================!
!============================================================================!
!---------------------------------------------------------------------------!
! 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 - questo vale uno per altri 500 linee o giù di lì. Quindi, per arrivare al punto, sembra che la subroutine originale abbia bisogno di un'interfaccia esplicita per le sue procedure per poter usare l'argomento (fittizio) csite. Ancora una volta, sono così NUOVO a Fortran, ma sto davvero cercando di capire come "pensa". Ho cercato cosa significa avere un'interfaccia esplicita, quando (e come!) Usarlo ecc. Ma non riesco a capire come si applica al mio caso. Dovrei forse usare un compilatore diverso (Intel?). Qualche suggerimento?
Edit: Quindi csite
viene dichiarato un target
in tutte le procedure e dalla dichiarazione type(site type)
contiene un intero gruppo di pointer
s, come specificato nella sitetype
. Ma lo sitetype
è correttamente use
da un altro modulo (ed_state_vars.f90
) in tutte le procedure. Quindi sono ancora confuso perché mi dà l'errore esplicito dell'interfaccia?
Sono 'compute_water_storage' e le altre funzioni nel modulo? – SethMMorton
Abbiamo bisogno di vedere la dichiarazione di 'csite' in' compute_co2_storage() 'perché il messaggio di errore si riferisce agli attributi dichiarati in quella routine piuttosto che in' update_budget() '. Sospetto che sia dichiarato "OPZIONALE" o "POINTER" o qualcosa del genere. – Deditos
Grazie per tutto il feedback. @SethMMorton: sì, come 'funzione reale'. @Deditos: in 'compute_co2_storage()', 'csite' è dichiarato come nella subroutine che ho postato:' type (sitetype), target :: csite'. – Geraldine