# 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
• 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
```