File: f_norm.sci

package info (click to toggle)
scilab 2.4-1
  • links: PTS
  • area: non-free
  • in suites: potato, slink
  • size: 55,196 kB
  • ctags: 38,019
  • sloc: ansic: 231,970; fortran: 148,976; tcl: 7,099; makefile: 4,585; sh: 2,978; csh: 154; cpp: 101; asm: 39; sed: 5
file content (129 lines) | stat: -rw-r--r-- 4,329 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
function [stk,nwrk,txt,top]=f_norm(nwrk)
//!purpose
//  Scilab norm function translation
//!parameters
// - stk :
//      On entry stk is a global variable of type list
//      entries indexed from top-1+rhs:top give the definition of the rhs
//      function input variables 
//
//      After execution stk(1:lhs) must contain the definition of the
//      lhs returned variables
//
//      stk entries have the following structure:
//      stk(k)=list(definition,type_expr,type_var,nb_lig,nb_col)
//
//      *definition may be:
//         - a character string containing a Fortran  expression with
//           a scalar value ex:'a+2*b-3*c(1);
//         - a character string containing a reference to the first
//           entry of a Fortran array
//                 'a'           if a is a defined matrix
//                 'work(iwn)'   if  variable is stored in the  double
//	                         precision working array work
//                 'iwork(iiwn)' if  variable is stored in the integer
//	                         working array iwork
//      remark: complex array are defined by a definition part
//                  with 2 elements (real and imaginary parts definition)
//      *type_expr a character string: the expression type code (used
//            to indicate need of parenthesis )
//          '2' : the expression is a sum of terms
//          '1' : the expression is a product of factors
//          '0' : the expression is an atome
//          '-1': the value is stored in a Fortran array
//      *type_var a character string: codes the variable fortran type:
//          '1' : double precision
//          '0' : integer
//          '10': character
//
//      *nb_lig (, nb_col) : character strings:number of rows
//              (columns) of the matrix		
//          des chaines de caracteres

// Copyright INRIA
//
//  nwrk : this variable contain information on working arrays, error
//         indicators. It only may be modified by call to scilab functions
//         outname adderr getwrk
//
//  txt  : is a column vector of character string which contain the
//         fortran code associated to the function translation if
//         necessary.
//  top  : an integer 
//         global variable on entry
//         after execution top must be equal to top-rhs+lhs
//!

s2=stk(top-rhs+1);
//
p='2'
if rhs==2 then
  p=stk(top);p=p(1);
end

if p=='2' then //norme 2
if s2(4)=='1'&s2(5)=='1' then
  if s2(2)=='2' then s2(1)='('+s2(1)+')',end
  stk=list('abs('+s2(1)+')',s2(2),s2(3),s2(4),s2(5))
elseif s2(4)=='1'|s2(5)=='1' then
  [s2,nwrk,txt]=typconv(s2,nwrk,'1')
  nwrk=dclfun(nwrk,'dnrm2','1')
  out=callfun(['dnrm2',mulf(s2(4),s2(5)),s2(1),'1'],'1')
  stk=list(out,'-1','1','1','1')
else
  [s2,nwrk,txt]=typconv(s2,nwrk,'1')
  n=s2(4);m=s2(5)
  if n==m then
    n1=n
    n2=n
  else
    n1='min('+addf(n,'1')+','+m+')'
    n2='min('+n+','+m+')'
  end
  [errn,nwrk]=adderr(nwrk,'echec du calcul de la norme')
  [s,nwrk,t1]=getwrk(nwrk,'1','1',n1)
  [e,nwrk,t2]=getwrk(nwrk,'1','1',m)
  [wrk,nwrk,t3]=getwrk(nwrk,'1','1',n)
  txt=[t1;t2;t3;
    gencall(['dsvdc',s2(1),n,n,m,s,e,'work',n,'work',m,wrk,'00','ierr']);
    genif('ierr.ne.0',[' ierr='+string(errn);' return'])]
  stk=list(s,'0','1','1','1')
end
elseif p=='1' then
  [s2,nwrk,txt]=typconv(s2,nwrk,'1')
  nwrk=dclfun(nwrk,'dasum','1')
  out=callfun(['dasum',mulf(s2(4),s2(5)),s2(1),'1'],'1')
  stk=list(out,'0','1','1','1')
elseif p=='inf' then
  [s2,nwrk,txt]=typconv(s2,nwrk,'1')
  ls=length(s2(1))
  if part(s2(1),1:4)==work then
    out=callfun(['abs',part(s2(1),1:ls-1)+'-1+'+..
                    callfun(['idamax',mulf(s2(4),s2(5)),s2(1),'1'])+')'])
  else
    out=callfun(['abs',s2(1)+'('+..
          callfun(['idamax',mulf(s2(4),s2(5)),s2(1),'1'])+')'])
  end
  stk=list(out,'0','1','1','1')
else
  [s2,nwrk,txt]=typconv(s2,nwrk,'1')
  [t,nwrk,t1]=getwrk(nwrk,'1','1','1')
  [lbl,nwrk]=newlab(nwrk)
  tl1=string(10*lbl);
  var='ilb'+tl1;
  if part(s2(1),1:4)==work then
    t2=t+'='+t+'('+part(s2(1),1:ls-1)+'+'+var+'))**'+p
  else
    t2=t+'='+t+'('+s2(1)+'('+var+'))**'+p
  end
  txt=[txt;t1;
       t+' = 0.0d0';
       ' do '+tl1+' '+var+' = 0'+','+subf(mulf(s2(4),s2(5),'1'));
       indentfor(t2);
       part(tl1+'    ',1:6)+' continue']
  stk=list('('+t+')**(1/'+p+')','0','1','1','1')
end
//
top=top-rhs+1