[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Array multiplication: implicit loop query



In article <d90c0773.0108100256.6398a693@posting.google.com>, george
Millward <george@apg.ph.ucl.ac.uk> wrote:

> Hi there
> 
> I was just calculating the following equation:
> 
> DEN_H = MMR_H * Pres * RMT / ( atomic_mass_H * Gas_constant * TN )
> 
> These  numbers are 3D arrays, 1D arrays and constants, i.e.,
> 
> MMR_H = fltarr(30,91,40)
> Pres = fltarr(30)
> RMT = fltarr(30,91,40)
> atomic_mass_H = constant
> Gas_constant  = constant
> TN =fltarr(30,91,40)
> 
> The result of this is DEN_H (previously undefined) which ends up being
> fltarr(30) - i.e., 1 dimensional.
> To my mind DEN_H should be 3D (30,91,40) - shouldn't it ?  Doesn't IDL
> understand that I am implicity doing a full 3D calculation here ?

No.

> It would seem that, to get this to work I need to make
> Pres=fltarr(30,91,40).

That's one solution.  The other is to use loops.

FOR k = 0, 29 DO DEN_H[k,*,*] = MMR_H[k,*,*]*Pres[k]*RMT[k,*,*] / $
                      (atomic_mass_H* Gas_constant*TN[k,*,*])

This would be *much* more efficient (in terms of cache usage and array
indexing) if pressure was your last dimension, i.e.,

MMR_H = fltarr(91,40,30)
Pres = fltarr(30)
RMT = fltarr(91,40,30)
TN =fltarr(91,40,30)

Then you can write

FOR k = 0, 29 DO DEN_H[0,0,k] = MMR_H[*,*,k]*Pres[k]*RMT[*,*,k] / $
                      (atomic_mass_H*Gas_constant*TN[*,*,k])

The change in the indexing on the LHS to [0,0,k] is important.

Ken