source: trunk/SRC/Interpolation/fromreg.pro @ 371

Last change on this file since 371 was 371, checked in by pinsard, 16 years ago

improvements of headers (alignments of IDL prompt in examples)

  • Property svn:keywords set to Id
File size: 4.1 KB
Line 
1;+
2;
3; @file_comments
4; interpolate data from a "regular/rectangular grid" to any grid.
5;   2 methods available: bilinear and imoms3
6;   A "regular/rectangular grid" is defined as a grid for which
7; each longitude lines have the same latitude and each latitude columns
8; have the same longitude.
9;
10; @categories
11; Interpolation
12;
13; @param method {in}{required}{type=string}
14; the interpolation method.
15; must be 'bilinear' or 'imoms3'
16;
17; @param datain {in}{required}{type=2d array}
18; the input data to interpolate
19;
20; @param lonin {in}{required}{type=1d or 2d array}
21; the longitude of the input data
22;
23; @param latin {in}{required}{type=1d or 2d array}
24; the latitude of the input data
25;
26; @param lonout {in}{required}{type=1d or 2d array}
27; the longitude of the output data
28;
29; @param latout {in}{required}{type=1d or 2d array}
30; the latitude of the output data
31;
32; @keyword WEIG {type=2d array or variable name}
33; (see ADDR)
34;
35; @keyword ADDR {type=2d array or variable name}
36; 1) at the first call of fromreg:
37; This keyword can be set to a named variable (undefined or equal to 0) into which the
38; addresses used to perform the interpolation will be copied when the current routine exits.
39; 2) Next, once this keyword is set to a defined 2d array, it is used to bypass the computation
40; of the weights and addresses used to perform the interpolation. In this case, fromreg simply
41; compute the interpolated field as:
42;          dataout = total(weig*datain[addr], 1)
43;          dataout = reform(dataout, jpio, jpjo, /over)
44; In that case, method, lonin, latin, are not used (but are necessary).
45; lonout, latout are used only to know the output domain size
46;
47; @keyword NONORTHERNLINE
48; activate if you don't want to take into account the northern line
49; of the input data when performing the interpolation.
50;
51; @keyword NOSOUTHERNLINE
52; activate if you don't want to take into account the southern line
53; of the input data when performing the interpolation.
54;
55; @keyword
56; _EXTRA to be able to call fromreg with _extra keyword
57;
58; @returns
59; 2D array the interpolated data
60;
61; @restrictions
62; We supposed the data are located on a sphere, with a periodicity along the
63; longitude.
64;
65; @examples
66;
67;  To interpolate 1 field:
68;
69;   IDL> topa = fromreg('bilinear', tncep, xncep, yncep, glamt, gphit)
70;
71;  or if you have several fields to interpolate from the same source and target grids
72;
73; 1) get back the weights and addresses in variables a and b
74;   (that must be undefined or equal to 0 before calling fromreg
75;
76;   IDL> t1opa = fromreg('bilinear', t1ncep, xncep, yncep, glamt, gphit, WEIG = a, ADDR = b)
77;   IDL> help, a, b
78;
79; 2) use a and b that are now defined to bypass the computation of the weights and addresses
80; and speed-up the computation!
81;
82;   IDL> t2opa = fromreg('bilinear', t2ncep, xncep, yncep, glamt, gphit, WEIG = a, ADDR = b)
83;
84; @history
85;  November 2005: Sebastien Masson (smasson\@lodyc.jussieu.fr)
86;
87; @version
88; $Id$
89;
90;-
91FUNCTION fromreg, method, datain, lonin, latin, lonout, latout $
92                  , WEIG=weig, ADDR=addr $
93                  , NONORTHERNLINE=nonorthernline $
94                  , NOSOUTHERNLINE=nosouthernline, _EXTRA=ex
95;
96  compile_opt idl2, strictarrsubs
97;
98;---------------
99; atmospheric grid parameters
100;---------------
101    alon = lonin
102    alat = latin
103    get_gridparams, alon, alat, jpia, jpja, 1, /double
104;---------------
105; Oceanic grid parameters
106;---------------
107    olon = lonout
108    olat = latout
109    get_gridparams, olon, olat, jpio, jpjo, 2, /double
110;---------------
111; Compute weight and address
112;---------------
113  IF NOT (keyword_set(weig) AND keyword_set(addr)) THEN BEGIN
114    CASE method OF
115      'bilinear':compute_fromreg_bilinear_weigaddr, alon, alat, olon, olat, weig, addr, NONORTHERNLINE = nonorthernline, NOSOUTHERNLINE = nosouthernline
116      'imoms3':  compute_fromreg_imoms3_weigaddr,   alon, alat, olon, olat, weig, addr, NONORTHERNLINE = nonorthernline, NOSOUTHERNLINE = nosouthernline
117      ELSE:BEGIN
118        ras = report(' unknown interpolation method... we stop')
119        stop
120      ENDELSE
121    ENDCASE
122  ENDIF
123;
124  dataout = total(weig*datain[addr], 1)
125  dataout = reform(dataout, jpio, jpjo, /over)
126;
127  RETURN, dataout
128END
Note: See TracBrowser for help on using the repository browser.