title: Fortran - explicit interface
body: <p>I'm very new to Fortran, and for my research I need to get a monster of a model running, so I am learning as I am going along. So I'm sorry if I ask a "stupid" question. 
  I'm trying to compile (Mac OSX, from the command line) and I've already managed to solve a few things, but now I've come across something I am not sure how to fix. I think I get the idea behind the error, but again, not sure how to fix.</p>
  
  <p>The model is huge, so I will only post the code sections that I think are relevant (though I could be wrong). I have a file with several subroutines, that starts with:</p>
  
  <pre><code>    !==========================================================================================!
  !    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
  !==========================================================================================!
  !==========================================================================================!
  </code></pre>
  
  <p>I get error messages along the lines of</p>
  
  <p>budget_utils.f90:20.54:</p>
  
  <p>real            , external   :: compute_co2_storage
                                                        1<br>
  Error: Dummy argument 'csite' of procedure 'compute_co2_storage' at (1) has an attribute that requires an explicit interface for this procedure </p>
  
  <p>(I get a bunch of them, but they are essentially all the same). Now, looking at ed_state_vars.f90 (which is "used" in the subroutine), I find</p>
  
  <pre><code>!============================================================================!
  !============================================================================!
    !---------------------------------------------------------------------------!  
    ! 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
  </code></pre>
  
  <p>Etc etc - this goes one for another 500 lines or so.
  So to get to the point, it seems like the original subroutine needs an explicit interface for its procedures in order to be able to use the (dummy) argument csite. Again, I am SO NEW to Fortran, but I am really trying to understand how it "thinks". I have been searching what it means to have an explicit interface, when (and how!) to use it etc. But I can't figure out how it applies in my case. Should I maybe use a different compiler (Intel?). Any hints?</p>
  
  <p>Edit: So <code>csite</code> is declared a <code>target</code> in all procedures and from the declaration <code>type(site type)</code> contains a whole bunch of <code>pointer</code>s, as specified in <code>sitetype</code>. But <code>sitetype</code> is being properly <code>use</code>d from another module (<code>ed_state_vars.f90</code>) in all procedures. So I am still confused why it gives me the explicit interface error? </p>