Hello,
This concerns the original issue of the thread "Multiple nonzero rank
references in structure components": Having more then one nonzero rank
component references in a structure.
In the lack of F95 (or at present F2x) features to have such references,
I have been trying today to emulate this, and am stuck with a question
that I hope those experienced in array sections might be able to answer.
Let's start with an actual example--weekly weather records over a 2D
cartesian spatial grid of stations. We have the following declarations:
TYPE :: Hourly_Record
REAL (KIND=r_wp) :: temperature (3) = 0.0
LOGICAL (KIND=l_byte) :: synny = .TRUE.
END TYPE
TYPE :: Daily_Record
TYPE (Hourly_Record), DIMENSION (24) :: hourly_records
INTEGER (KIND=i_sp) :: sunrise = 7, sunset = 18
END TYPE
TYPE :: Weekly_Record
TYPE (Daily_Record), DIMENSION (7) :: daily_records
REAL (KIND=r_sp) :: forecast_success (5)
END TYPE
INTEGER, PARAMETER :: n_x = 10, n_y = 15
TYPE (Weekly_Record), DIMENSION (n_x, n_y), TARGET ::
weekly_records ! The grid of records
The point of the discussion is that one would like to associate a rank-5
array pointer with the array section of all temperatures, but at present
one cannot do this. So what I want to achieve is:
REAL(KIND=r_wp), DIMENSION(:,:,:,:,:), POINTER :: temperatures
temperatures=>weekly_records[:,:]%daily_records[:]%hourly_records[:]%temperature[:]
! Not legal at present
which should produce an array pointer of shape [3,24,7,10,15]. Then one
can take subsections of this pointer to for example find the
temperatures on odd days of the week in the morning hours along a given
meridian.
I have been trying to make some routines that will create this pointer
for me, but I am having trouble.
Assume I know the following (I find this using C functions for example)
about the actual memory layout of the weekly_records structure:
The type Hourly_Records take 4 words. I'll denote HR=4*1
There are 24 of these in a daily record + 2 trailing words=96+2=98
words. DR=24*HR+2
Then there are 7 of these in a weekly record + 5 words=686+5=691 words.
WR=7*DR+5
Finally, there are 10 of these per column of the grid=69100 words.
COL=10*WR
And there are 15 of these total, i.e. 1036500 words. TOTAL=15*COL
So the whole memory layout of the datastructure is
15*(10*(7*(24*(4)+2)+5)) in words.
Now, I claimed, and others seem to agree, that the section
weekly_records[:,:]%daily_records[:]%hourly_records[:]%temperature[:]
can indeed be described as a *regular* rank-5 array section. HOW?!?
I would say (but may be wrong!) that *any* array section of rank r can
be described in two steps:
1) First give an underlying (call it base) *contiguous* array of rank r
(the memory buffer of 1036500 words, shaped as a rank-r array)
2) Then take an appropriate Fortran section slice through this buffer,
base(lb1:ub1:stride1,...).
The problem I am facing is finding the shape of the base array. If I
could do this, then for example I could make an array pointer to the
base buffer (using my emulation of C_F_POINTER from F2x) and use a
section of it to make the desired pointer temperatures.
But in the example above I cannot see how to describe the desired
section in the form base(section). Does someone see how to do this? Or
am I thinking the wrong way here?
Any help with this indexing issue will be appreciated. I will of course
post the final code for public use.
Thanks,
Aleksandar
--
__________________________________
Aleksandar Donev
Complex Materials Theory Group (http://cherrypit.princeton.edu/)
Princeton Materials Institute & Program in Applied and Computational Mathematics
@ Princeton University
Address:
419 Bowen Hall, 70 Prospect Avenue
Princeton University
Princeton, NJ 08540-5211
E-mail: [log in to unmask]
WWW: http://atom.princeton.edu/donev
Phone: (609) 258-2775
Fax: (609) 258-6878
__________________________________
|