In Matlab, the cell variable type can be very useful. For those not familiar, a cell (in Matlab) is kinda like a variable inside a variable. For instance I could have a cell called FieldVariables. There are 4 elements inside this cell: 1 each for pressure, density, Vx, Vy. Each of these 5 cell elements has Nx by Ny elements inside relating to the value of the variable at the gridpoints. This can be a convenient way to collect related data while incurring minimal overhead.

In Fortran, something similar can be done in the form of structures. A structure allows you to define a custom variable type that can be used similarly integer by coding integer:: i . It's maybe not exactly the same.

For this example, I need a variable named PointsInCell

Inside PointsInCell, I want to store variables associated with x and y gridpoints. So, at every gridpoint I want to store:

1) an integer counter NumInCell

2) an allocatable integer array called pIndex

3) an integer called pcounter

I want to do this because NumInCell, pIndex, and pcounter are all related to information local to a specific cell and it's convenient later in the code to have them all collected together. So first, I define a type that declares NumInVox, pIndex, and pCounter

type CellIndex

! Contains:

integer:: NumInCell ! # points in each Cell

integer,dimension(:),allocatable:: pIndex ! array storing index of all points in Cell

integer:: pcounter ! # counter for dynamic array sizing

end type

this takes care of defining what is to be stored AT each gridpoint

Next, I define another type to define the gridpoints where CellIndex will be stored:

type Cells

type(CellIndex),dimension(:,:),allocatable:: Cell ! each element contains NumInVox, pIndex

end type

This defines the variable Cell as rows and columns were CellIndex will be stored

Lastly, I want to define a single variable that will contain all this information

type(Cells):: PointsInCell

Now to allocate these variables in the structure

allocate(PointsInCell % Cell(yNum,xNum))

do i=1,yNum,1

do j=1,xNum,1

allocate(PointsInCell % Cell(i,j) % pIndex(10))

end do

end do

PointsInCell % Cell(:,:) % pcounter = 10

so if I want to change the pcounter at Cell(10,20) to 20, I'd write

PointsInCell % Cell(10,20) % pcounter = 20

the percent sign defines another level deeper in the structure.

## Tuesday, March 3, 2015

Subscribe to:
Post Comments (Atom)

## No comments:

Post a Comment