(As always, I hit "send" a moment too soon...) That problem is a good example of the maxim that "when in doubt, add more dimensions"... :-) Interpolators are particularly confusing because they have to have a different number of active dims in different parameters/terms -- hence Chris's recent example, and the I-hope-now-well-known wart with index() threading...
On Dec 9, 2013, at 9:44 AM, Craig DeForest <defor...@boulder.swri.edu> wrote: > Hmmmm.. > > If I understand right, you've enumerated the altitudes in lgrid and hgrid. > Since you're interpolating over altitude, you want that moved to the pole > position in the dim list in your $x and $y for your dplinear call. > Everything else can be left alone. You want: > > * active dim: lgrid-altitude > * thread dims: lat, lon, and hgrid-altitude > > After that, it's easy: > > $hg= Dutil::dplinear( $lgrid->mv(2,0), # (n: lo-alt, t0: lat, t1: lon) > $t->mv(2,0), # (n: lo-alt, t0: lat, t1: lon) > $hg # (t0: lat, t1: lon, t2: hi-alt) > ); > > I named the dimensions of each term, for clarity: 'n' is the active dim in > the signature, the 't' dimensions are the thread dimensions. Note that $hg > (the 'in()' term) is missing the active dim 'n', as the signature requires. > > > On Dec 9, 2013, at 8:56 AM, Doug Hunt <dh...@ucar.edu> wrote: > >> Hi PDL folks: I just wrote a function that I think should be thread-able, >> but I can't think how. Any ideas welcome. >> >> This function is used to up-sample a weather model grid via linear >> interpolation. I use the local PP function Dutil::dplinear to do this. It >> may be better to use other PDL interpolation functions, but I've been using >> this for years and I know just what it does. Here is its signature: >> >> dplinear (x(n); y(n); in(); [o]out()) >> >> It is just a simple interpolation routine which takes $x and $y vectors as >> input, along with one value in $x-space to interpolate into $y space. >> >> The tricky bit here is that two sorts of threading are necessary: >> >> 1) Interpolating a column of input temperatures via the $x and $y input >> to dplinear. >> >> 2) Threading over all the lat/lon columns in the input temperature grid $t. >> The tricky bit is that the pressure values are different for each >> column--this model does not use standard pressure levels, but the pressure >> levels at each grid point depend upon the surface pressure. >> >> Any ideas? Please let me know if this is not clear... >> >> Regards, >> >> Doug Hunt >> >> -------------------------------------------------------------------------------------- >> sub upsampleGrid { >> >> my $lgrid = shift; # low resolution (half) pressure grid: lat x lon x 92 >> levels >> my $hgrid = shift; # high resolution (half) pressure grid: lat x lon x 138 >> levels >> my $t = shift; # temperature grid to upsample: lat x lon x level >> >> my ($nlat, $nlon, $llvl) = $t->dims; # llvl = 92 >> my $hlvl = ($hgrid->dims)[2]; # 138 >> my $ht = zeroes($nlat, $nlon, $hlvl); # high resolution output grid >> >> # This could be sped up with threading, I feel sure... >> for (my $lati=0;$lati<$nlat;$lati++) { >> for (my $loni=0;$loni<$nlon;$loni++) { >> my $x = $lgrid->(($lati),($loni),:); >> my $y = $t->(($lati),($loni),:); >> my $in = $hgrid->(($lati),($loni),:); >> $hg(($lati),($loni),:) .= Dutil::dplinear($x, $y, $in); >> } >> } >> >> return $hg; >> } >> -------------------------------------------------------------------------------------- >> >> dh...@ucar.edu >> Software Engineer >> UCAR - COSMIC, Tel. (303) 497-2611 >> >> _______________________________________________ >> Perldl mailing list >> Perldl@jach.hawaii.edu >> http://mailman.jach.hawaii.edu/mailman/listinfo/perldl >> > > _______________________________________________ Perldl mailing list Perldl@jach.hawaii.edu http://mailman.jach.hawaii.edu/mailman/listinfo/perldl