1ecefee2000c6cc8a6ffb05951b0779462111eb6
[scilab.git] / scilab / modules / scicos_blocks / macros / NonLinear / LOOKUP2D.sci
1 //  Scicos
2 //
3 //  Copyright (C) INRIA - METALAU Project <scicos@inria.fr>
4 //
5 // This program is free software; you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation; either version 2 of the License, or
8 // (at your option) any later version.
9 //
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software
17 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 //
19 // See the file ../license.txt
20 //
21 function [x,y,typ]=LOOKUP2D(job,arg1,arg2)
22     // Copyright INRIA
23
24     x=[];y=[];typ=[];
25     select job
26     case "plot" then
27         standard_draw(arg1)
28     case "getinputs" then
29         [x,y,typ]=standard_inputs(arg1)
30     case "getoutputs" then
31         [x,y,typ]=standard_outputs(arg1)
32     case "getorigin" then
33         [x,y]=standard_origin(arg1)
34     case "set" then
35
36         x=arg1
37         model=arg1.model
38         graphics=arg1.graphics
39         exprs=graphics.exprs
40         ok=%f;
41         SaveExit=%f
42         while %t do
43
44             Ask_again=%f
45             [ok,xx,yy,zz,Method,graf,exprs]=scicos_getvalue("2D Lookup table parameters",["Row index input values";"Column index input values";"Table data";"Lookup method(1..5)";"Launch graphic window(y/n)?"],list("vec",-1,"vec",-1,"mat",[-1,-1],"vec",1,"str",1),exprs)
46             // 1 : Interpolation-extrapolation (Bilinear)
47             // 2 : Interpolation_endvalues
48             // 3 : use input nearest
49             // 4 : use input below
50             // 5 : use input above
51             // 6 : Interpolation-extrapolation (linear)
52
53             if  ~ok then break;end
54             mtd=int(Method); if mtd<1 then mtd=1;end; if mtd>6 then mtd=6;end;
55             if graf<>"y" & graf<>"Y" then  graf="n"; end
56             exprs(5)="n";// exprs.graf='n'
57             exprs(4)=sci2exp(mtd);// pour le cas methode>7 | method<0
58
59             METHOD=getmethod(mtd);
60             if ~Ask_again then
61                 xx=xx(:);yy=yy(:);
62                 [nx,mx]=size(xx); [ny,my]=size(yy);[nz,mz]=size(zz);
63                 if ((nx<=1)|(ny<=1)) then, x_message("input row/column data size should be greater than one");  Ask_again=%t;end
64                 if ~((nx==nz)&(ny==mz)) then, x_message("incompatible size of x and y");  Ask_again=%t;end
65                 [ok]=test_increasing(xx);if (~ok) then  x_message("Row input values must be monotonically increasing");Ask_again=%t;end
66                 [ok]=test_increasing(yy);if (~ok) then  x_message("Column input values must be monotonically increasing");Ask_again=%t;end
67             end
68             if ~Ask_again then
69                 if (graf=="Y" | graf=="y") then
70                     gh=gcf();
71                     curwin=gh.figure_id;
72                     save_curwin=curwin;
73                     gh2=scf();
74                     curwin=max(winsid())+1;
75                     plot3d(xx,yy,zz,35,45,"X@Y@Z",[5,2,4]) ;
76                     curwin=save_curwin;
77                     gh.figure_id=curwin;
78                 end
79
80                 model.rpar=[xx(:);yy(:);zz(:)]
81                 model.ipar=[nx;ny;mtd]
82                 graphics.exprs=exprs;
83                 x.model=model
84                 x.graphics=graphics
85                 break
86             end
87         end
88         //======================================================================
89     case "define" then
90         model=scicos_model();
91         xx=[1:4]
92         yy=[1:3]
93         zz=[4,5,6;16,19,20;10,18,23;6, 3,-1];
94         Method=1;
95         Graf="n"
96
97         Nx=length(xx);
98         Ny=length(yy);
99         model.sim=list("lookup2d",4)
100         model.in=[1;1]
101         model.out=1
102
103         model.rpar=[xx(:);yy(:);zz(:)]
104         model.ipar=[Nx;Ny;Method]
105         model.blocktype="c"
106         model.dep_ut=[%t %f]
107         exprs=list(strcat(sci2exp(xx)),strcat(sci2exp(yy)),strcat(sci2exp(zz)),sci2exp(Method),Graf)
108         gr_i=["txt=[''   Lookup'';''   table''];";
109         "xstringb(orig(1),orig(2),txt,sz(1),sz(2),''fill'');";
110         "txt=''r'';";"xstringb(orig(1)+.01*sz(1), orig(2)+.5*sz(1), txt, sz(1)/6,sz(2)/6,''fill'');"
111         "txt=''c'';";"xstringb(orig(1)+.01*sz(1), orig(2)+.1*sz(1), txt, sz(1)/6,sz(2)/6,''fill'');"
112
113         ]
114
115         x=standard_define([2.5 2],model,exprs,gr_i)
116     end
117 endfunction
118
119 function [ok]=test_increasing(xx)
120     ok=%f
121     [nx,mx]=size(xx);// adjusting the x and y size
122
123     for i=1:mx
124         if (xx(i)<>xx(i)) then
125             xinfo("x contains no data in x("+string(i)+")");
126             return;
127         end
128
129     end
130
131     for i=1:mx-1
132         if (xx(i)>xx(i+1)) then
133             return;
134         end
135     end
136
137     ok=%t
138 endfunction
139 //============================
140 function METHOD=getmethod(order)
141     select order
142     case 1 then, METHOD="Interpolation-extrapolation(biliniear)"
143     case 2 then, METHOD="Interpolation_endvalues"
144     case 3 then, METHOD="use input nearest"
145     case 4 then, METHOD="use input below"
146     case 5 then, METHOD="use input above"
147     case 6 then, METHOD="Interpolation-extrapolation"
148     end
149 endfunction
150 //=========================================================