[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Array multiplication: implicit loop query
- Subject: Re: Array multiplication: implicit loop query
- From: "Kenneth P. Bowman" <kbowman(at)null.net>
- Date: Fri, 10 Aug 2001 07:58:03 -0500
- Newsgroups: comp.lang.idl-pvwave
- Organization: Posted via Supernews, http://www.supernews.com
- References: <d90c0773.0108100256.6398a693@posting.google.com>
- User-Agent: YA-NewsWatcher/5.0.0
- Xref: news.doit.wisc.edu comp.lang.idl-pvwave:26138
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