Ignore:
Timestamp:
01/30/17 16:33:03 (7 years ago)
Author:
ymipsl
Message:
  • Add generic ternary arithmetic operators and filters
  • Add conditional operator "(cond) ? x : y" for arithmetic filters.

YM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/parse_expr/operator_expr.hpp

    r1019 r1038  
    1717    typedef double (*functionScalar)(double); 
    1818    typedef double (*functionScalarScalar)(double, double); 
     19    typedef double (*functionScalarScalarScalar)(double, double,double); 
    1920    typedef CArray<double,1> (*functionField)(const CArray<double,1>&); 
    2021    typedef CArray<double,1> (*functionFieldField)(const CArray<double,1>&, const CArray<double,1>&); 
    2122    typedef CArray<double,1> (*functionFieldScalar)(const CArray<double,1>&, double); 
    2223    typedef CArray<double,1> (*functionScalarField)(double, const CArray<double,1>&); 
    23  
     24    typedef CArray<double,1> (*functionScalarScalarField)(double, double, const CArray<double,1>&); 
     25    typedef CArray<double,1> (*functionScalarFieldScalar)(double, const CArray<double,1>&, double); 
     26    typedef CArray<double,1> (*functionScalarFieldField)(double, const CArray<double,1>&, const CArray<double,1>&); 
     27    typedef CArray<double,1> (*functionFieldScalarScalar)(const CArray<double,1>&, double, double); 
     28    typedef CArray<double,1> (*functionFieldScalarField)(const CArray<double,1>&, double, const CArray<double,1>&); 
     29    typedef CArray<double,1> (*functionFieldFieldScalar)(const CArray<double,1>&,  const CArray<double,1>&, double); 
     30    typedef CArray<double,1> (*functionFieldFieldField)(const CArray<double,1>&,  const CArray<double,1>&, const CArray<double,1>&); 
     31     
    2432    COperatorExpr(void) 
    2533    { 
     
    4452      opScalarScalar[string("ge")] = ge_ss; 
    4553      opScalarScalar[string("ne")] = ne_ss; 
    46  
     54      opScalarScalarScalar[string("cond")] = cond_sss; 
     55       
    4756      opField[string("neg")] = neg_f; 
    4857      opField[string("cos")] = cos_f; 
     
    8897      opScalarField[string("ge")] = ge_sf; 
    8998      opScalarField[string("ne")] = ne_sf; 
     99 
     100      opScalarScalarField[string("cond")] = cond_ssf; 
     101      opScalarFieldScalar[string("cond")] = cond_sfs; 
     102      opScalarFieldField[string("cond")] = cond_sff; 
     103      opFieldScalarScalar[string("cond")] = cond_fss; 
     104      opFieldScalarField[string("cond")] = cond_fsf; 
     105      opFieldFieldScalar[string("cond")] = cond_ffs; 
     106      opFieldFieldField[string("cond")] = cond_fff; 
     107 
     108 
    90109    } 
    91110 
     
    106125    } 
    107126 
     127    functionScalarScalarScalar getOpScalarScalarScalar(const string& id) 
     128    { 
     129      map<string,double (*)(double,double,double)>::iterator it; 
     130      it = opScalarScalarScalar.find(id); 
     131      if (it == opScalarScalarScalar.end()) ERROR("functionScalarScalarScalar getOpScalarScalarScalar(const string& id)", << "unknown operator : " << id) 
     132      return it->second; 
     133    } 
     134 
    108135    functionField getOpField(const string& id) 
    109136    { 
     
    138165    } 
    139166 
     167    functionScalarScalarField getOpScalarScalarField(const string& id) 
     168    { 
     169      map<string,functionScalarScalarField>::iterator it; 
     170      it = opScalarScalarField.find(id); 
     171      if (it == opScalarScalarField.end()) ERROR("functionScalarScalarField getOpScalarScalarField(const string& id)", << "unknown operator : " << id) 
     172      return it->second; 
     173    } 
     174 
     175    functionScalarFieldScalar getOpScalarFieldScalar(const string& id) 
     176    { 
     177      map<string,functionScalarFieldScalar>::iterator it; 
     178      it = opScalarFieldScalar.find(id); 
     179      if (it == opScalarFieldScalar.end()) ERROR("functionScalarFieldScalar getOpScalarScalarField(const string& id)", << "unknown operator : " << id) 
     180      return it->second; 
     181    } 
     182 
     183    functionScalarFieldField getOpScalarFieldField(const string& id) 
     184    { 
     185      map<string,functionScalarFieldField>::iterator it; 
     186      it = opScalarFieldField.find(id); 
     187      if (it == opScalarFieldField.end()) ERROR("functionScalarFieldField getOpScalarFieldField(const string& id)", << "unknown operator : " << id) 
     188      return it->second; 
     189    } 
     190 
     191    functionFieldScalarScalar getOpFieldScalarScalar(const string& id) 
     192    { 
     193      map<string,functionFieldScalarScalar>::iterator it; 
     194      it = opFieldScalarScalar.find(id); 
     195      if (it == opFieldScalarScalar.end()) ERROR("functionFieldScalarScalar getOpFieldScalarScalar(const string& id)", << "unknown operator : " << id) 
     196      return it->second; 
     197    } 
     198 
     199    functionFieldScalarField getOpFieldScalarField(const string& id) 
     200    { 
     201      map<string,functionFieldScalarField>::iterator it; 
     202      it = opFieldScalarField.find(id); 
     203      if (it == opFieldScalarField.end()) ERROR("functionFieldScalarField getOpFieldScalarField(const string& id)", << "unknown operator : " << id) 
     204      return it->second; 
     205    } 
     206 
     207    functionFieldFieldScalar getOpFieldFieldScalar(const string& id) 
     208    { 
     209      map<string,functionFieldFieldScalar>::iterator it; 
     210      it = opFieldFieldScalar.find(id); 
     211      if (it == opFieldFieldScalar.end()) ERROR("functionFieldFieldScalar getOpFieldFieldScalar(const string& id)", << "unknown operator : " << id) 
     212      return it->second; 
     213    } 
     214 
     215    functionFieldFieldField getOpFieldFieldField(const string& id) 
     216    { 
     217      map<string,functionFieldFieldField>::iterator it; 
     218      it = opFieldFieldField.find(id); 
     219      if (it == opFieldFieldField.end()) ERROR("functionFieldFieldField getOpFieldFieldField(const string& id)", << "unknown operator : " << id) 
     220      return it->second; 
     221    } 
     222     
     223     
    140224    map<string,functionScalar> opScalar; 
    141225    map<string,functionScalarScalar> opScalarScalar; 
     226    map<string,functionScalarScalarScalar> opScalarScalarScalar; 
    142227    map<string,functionField> opField; 
    143228    map<string,functionFieldField> opFieldField; 
    144229    map<string,functionFieldScalar> opFieldScalar; 
    145230    map<string,functionScalarField> opScalarField; 
     231    map<string,functionScalarScalarField> opScalarScalarField; 
     232    map<string,functionScalarFieldScalar> opScalarFieldScalar; 
     233    map<string,functionScalarFieldField> opScalarFieldField; 
     234    map<string,functionFieldScalarScalar> opFieldScalarScalar; 
     235    map<string,functionFieldScalarField> opFieldScalarField; 
     236    map<string,functionFieldFieldScalar> opFieldFieldScalar; 
     237    map<string,functionFieldFieldField> opFieldFieldField; 
     238 
     239 
    146240 
    147241    static inline double neg_s(double x)   { return -x; } 
     
    209303    static inline CArray<double,1> ge_sf(double x, const CArray<double,1>& y)    { return Array<double,1>(x >= y); } 
    210304    static inline CArray<double,1> ne_sf(double x, const CArray<double,1>& y)    { return Array<double,1>(x != y); } 
     305 
     306 
     307    static inline double cond_sss(double x, double y, double z)   { return (x==0) ? z : y ; } 
     308 
     309    static inline CArray<double,1> cond_ssf(double x, double y, const CArray<double,1>& z) 
     310    { 
     311      CArray<double,1> ret(z.numElements()) ; 
     312      if (x==0) ret=z ; 
     313      else ret=y ; 
     314      return ret ; 
     315    } 
     316 
     317    static inline CArray<double,1> cond_sfs(double x, const CArray<double,1>& y, double z) 
     318    { 
     319      CArray<double,1> ret(y.numElements()) ; 
     320     if (x==0) ret=z ; 
     321      else ret=y ; 
     322      return ret ; 
     323    } 
     324 
     325    static inline CArray<double,1> cond_sff(double x, const CArray<double,1>& y, const CArray<double,1>& z) 
     326    { 
     327      CArray<double,1> ret(y.numElements()) ; 
     328      if (x==0) ret=z ; 
     329      else ret=y ; 
     330      return ret ; 
     331    } 
     332     
     333    static inline CArray<double,1> cond_fss(const CArray<double,1>& x, double y, double z) 
     334    { 
     335      CArray<double,1> ret(x.numElements()) ; 
     336      Array<double,1>::const_iterator itx=x.begin(),itxe=x.end(); 
     337      Array<double,1>::iterator itret=ret.begin() ; 
     338       
     339      for(;itx!=itxe;++itx,++itret) *itret=( (*itx==0)?z:y) ; 
     340      return ret ; 
     341    } 
     342 
     343    static inline CArray<double,1> cond_fsf(const CArray<double,1>& x, double y, const CArray<double,1>& z) 
     344    { 
     345      CArray<double,1> ret(x.numElements()) ; 
     346      Array<double,1>::const_iterator itx=x.begin(), itxe=x.end(), itz=z.begin(); 
     347      Array<double,1>::iterator itret=ret.begin() ; 
     348      for(;itx!=itxe;++itx,++itz,++itret) *itret=( (*itx==0)?*itz:y) ; 
     349      return ret ; 
     350    } 
     351 
     352    static inline CArray<double,1> cond_ffs(const CArray<double,1>& x, const CArray<double,1>& y, double z) 
     353    { 
     354      CArray<double,1> ret(x.numElements()) ; 
     355      Array<double,1>::const_iterator itx=x.begin(), itxe=x.end(), ity=y.begin() ; 
     356      Array<double,1>::iterator itret=ret.begin() ; 
     357      for(;itx!=itxe;++itx,++ity,++itret) *itret=( (*itx==0)?z:*ity) ; 
     358      return ret ; 
     359    } 
     360 
     361    static inline CArray<double,1> cond_fff(const CArray<double,1>& x, const CArray<double,1>& y, const CArray<double,1>&  z) 
     362    { 
     363      CArray<double,1> ret(x.numElements()) ; 
     364      Array<double,1>::const_iterator itx=x.begin(), itxe=x.end(), ity=y.begin(), itz=z.begin() ; 
     365      Array<double,1>::iterator itret=ret.begin() ; 
     366      for(;itx!=itxe;++itx,++ity,++itz,++itret) *itret=( (*itx==0)?*itz:*ity) ; 
     367      return ret ; 
     368    } 
     369 
    211370  }; 
    212371 
Note: See TracChangeset for help on using the changeset viewer.