(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

Reply via email to