Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

accessing fortran type bound subroutines across all instances of the type

Can someone explain how I might access type bound subroutines across multiple instances of a type without iterating over each instance? In the code below, I have an allocatable 2d array (i.e., ‘grid’) of instances of the ‘cell’ type, which has variable var1. I can easily access var1 across all instances of the grid (e.g., grid%var1) returns an array of var1 values across the grid. However, I cannot call a type bound subroutine (called ‘compute’) unless I iterate over every instance of cell and call individually. Is there any way that this can be done without iterating over the grid?

module cellmodule

  implicit none
  
  type :: cell 
    real :: var1 = 0
    contains
      procedure, public :: compute 
  end type  

Contains

  subroutine compute(this)
    class(cell) :: this
    this%var1 = this%var1 + 1
  end subroutine compute

end module cellmodule

module modelmodule

  use cellmodule
  type :: model 
    type(cell), allocatable, dimension(:,:) :: grid
  end type 

end module modelmodule 

program testprogram

  use cellmodule
  use modelmodule
  implicit none 
  
  integer :: x = 2
  integer :: y = 2
  Integer :: i, j
  type(model) :: m
  allocate(m%grid(x,y))
  
  !I can access var1 across all instances of the cell type like
  print*, m%grid%var1
  m%grid%var1 = m%grid%var1 + 1.0
  print*, m%grid%var1

  !I can also iterate over the grid and call compute for each cell
  do i = 1, x
    do j = 1, y
      call m%grid(i,j)%compute
    End do
  End do
  print*, m%grid%var1

  !HOWEVER, I can't do this:
  call m%grid%compute
  print*, m%grid%var1
  
end program

>Solution :

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

You have to declare the subroutine as elemental (which in turn requires intent() to be specified for the arguments.

  elemental subroutine compute(this)
    class(cell), intent(inout) :: this
    this%var1 = this%var1 + 1
  end subroutine compute
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading