Changeset 2000 for XIOS


Ignore:
Timestamp:
01/04/21 11:13:46 (3 years ago)
Author:
ymipsl
Message:

Add reduce operation for transformation (sum was already fonctional)
min, max, average
YM

Location:
XIOS/dev/dev_ym/XIOS_COUPLING/src/distribution
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/distribution/reduce_transform_connector.cpp

    r1999 r2000  
    1515        break ; 
    1616      case EReduction::min : 
     17        transfer_=&CReduceTransformConnector::transferMin ; 
    1718        break ; 
    1819      case EReduction::max : 
     20        transfer_=&CReduceTransformConnector::transferMax ; 
    1921        break ; 
    20       case EReduction::extract : 
    21         break ; 
    22       case EReduction::average : 
     22     case EReduction::average : 
     23        transfer_=&CReduceTransformConnector::transferAverage ; 
    2324        break ; 
    2425      default : 
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/distribution/reduce_transform_connector.hpp

    r1999 r2000  
    66#include "local_view.hpp" 
    77#include "reduction_types.hpp" 
     8#include <algorithm> 
    89 
    910 
     
    128129    } 
    129130 
    130  
     131    void transferMin(int repeat, int sizeT, const CArray<double,1>& dataIn, CArray<double,1>& dataOut) 
     132    { 
     133      double defaultValue = std::numeric_limits<double>::quiet_NaN(); 
     134 
     135      int dstSlice = dstSize_*sizeT ; 
     136      int srcSlice = srcSize_*sizeT ; 
     137      dataOut.resize(repeat* dstSlice) ; 
     138      dataOut=0 ; 
     139            
     140      const double* input = dataIn.dataFirst()  ; 
     141      double* output = dataOut.dataFirst()  ; 
     142 
     143      if (detectMissingValue_) 
     144      { 
     145        vector<bool> touched(repeat* dstSlice, false) ; 
     146        int pos=0 ; 
     147        for(int r=0;r<repeat;r++, input+=srcSlice, output+=dstSlice, pos+=dstSlice) 
     148        { 
     149          const double* in = input; 
     150          double* out = output ; 
     151          int k=0 ; 
     152          for(int i=0; i<dstSize_; i++, out+=sizeT, pos+=sizeT) 
     153          { 
     154            if (nSrc_[i]==0) for(int l=0; l<sizeT; l++) out[l] = defaultValue ; 
     155            else  
     156            { 
     157              for(int j=0 ; j<nSrc_[i] ; j++,k++) 
     158                for(int l=0; l<sizeT; l++)  
     159                { 
     160                  if (! std::isnan(in[connector_[k]*sizeT+l]) )  
     161                  { 
     162                    if (touched[pos+l]) out[l]=min(out[l],in[connector_[k]*sizeT+l]) ; 
     163                    else  
     164                    { 
     165                      touched[pos+l] = true ; 
     166                      out[l] = in[connector_[k]*sizeT+l] ; 
     167                    } 
     168                  } 
     169                } 
     170            } 
     171          } 
     172        } 
     173 
     174        output = dataOut.dataFirst()  ; 
     175        pos=0 ; 
     176        for(int r=0;r<repeat;r++, input+=srcSlice, output+=dstSlice, pos+=dstSlice) 
     177        { 
     178          const double* in = input; 
     179          double* out = output ; 
     180          int k=0 ; 
     181          int pos=0 ; 
     182          for(int i=0; i<dstSize_; i++, out+=sizeT, pos+=sizeT) 
     183              for(int j=0 ; j<nSrc_[i] ; j++,k++) 
     184                for(int l=0; l<sizeT; l++) if (!touched[pos+l]) out[l] = defaultValue ; 
     185        } 
     186 
     187      } 
     188      else 
     189      { 
     190        for(int r=0;r<repeat;r++, input+=srcSlice, output+=dstSlice) 
     191        { 
     192          const double* in = input; 
     193          double* out = output ; 
     194          int k=0 ; 
     195          for(int i=0; i<dstSize_; i++, out+=sizeT) 
     196            if (nSrc_[i]==0) 
     197              for(int l=0; l<sizeT; l++) out[l] = defaultValue ; 
     198            else  
     199            { 
     200              for(int j=0 ; j<nSrc_[i] ; j++,k++) 
     201                for(int l=0; l<sizeT; l++) out[l]=min(out[l],in[connector_[k]*sizeT+l]) ; 
     202            } 
     203        } 
     204      } 
     205    } 
     206 
     207    void transferMax(int repeat, int sizeT, const CArray<double,1>& dataIn, CArray<double,1>& dataOut) 
     208    { 
     209      double defaultValue = std::numeric_limits<double>::quiet_NaN(); 
     210 
     211      int dstSlice = dstSize_*sizeT ; 
     212      int srcSlice = srcSize_*sizeT ; 
     213      dataOut.resize(repeat* dstSlice) ; 
     214      dataOut=0 ; 
     215            
     216      const double* input = dataIn.dataFirst()  ; 
     217      double* output = dataOut.dataFirst()  ; 
     218 
     219      if (detectMissingValue_) 
     220      { 
     221        vector<bool> touched(repeat* dstSlice, false) ; 
     222        int pos=0 ; 
     223        for(int r=0;r<repeat;r++, input+=srcSlice, output+=dstSlice, pos+=dstSlice) 
     224        { 
     225          const double* in = input; 
     226          double* out = output ; 
     227          int k=0 ; 
     228          for(int i=0; i<dstSize_; i++, out+=sizeT, pos+=sizeT) 
     229          { 
     230            if (nSrc_[i]==0) for(int l=0; l<sizeT; l++) out[l] = defaultValue ; 
     231            else  
     232            { 
     233              for(int j=0 ; j<nSrc_[i] ; j++,k++) 
     234                for(int l=0; l<sizeT; l++)  
     235                { 
     236                  if (! std::isnan(in[connector_[k]*sizeT+l]) )  
     237                  { 
     238                    if (touched[pos+l]) out[l]=max(out[l],in[connector_[k]*sizeT+l]) ; 
     239                    else  
     240                    { 
     241                      touched[pos+l] = true ; 
     242                      out[l] = in[connector_[k]*sizeT+l] ; 
     243                    } 
     244                  } 
     245                } 
     246            } 
     247          } 
     248        } 
     249 
     250        output = dataOut.dataFirst()  ; 
     251        pos=0 ; 
     252        for(int r=0;r<repeat;r++, input+=srcSlice, output+=dstSlice, pos+=dstSlice) 
     253        { 
     254          const double* in = input; 
     255          double* out = output ; 
     256          int k=0 ; 
     257          int pos=0 ; 
     258          for(int i=0; i<dstSize_; i++, out+=sizeT, pos+=sizeT) 
     259              for(int j=0 ; j<nSrc_[i] ; j++,k++) 
     260                for(int l=0; l<sizeT; l++) if (!touched[pos+l]) out[l] = defaultValue ; 
     261        } 
     262 
     263      } 
     264      else 
     265      { 
     266        for(int r=0;r<repeat;r++, input+=srcSlice, output+=dstSlice) 
     267        { 
     268          const double* in = input; 
     269          double* out = output ; 
     270          int k=0 ; 
     271          for(int i=0; i<dstSize_; i++, out+=sizeT) 
     272            if (nSrc_[i]==0) 
     273              for(int l=0; l<sizeT; l++) out[l] = defaultValue ; 
     274            else  
     275            { 
     276              for(int j=0 ; j<nSrc_[i] ; j++,k++) 
     277                for(int l=0; l<sizeT; l++) out[l]=max(out[l],in[connector_[k]*sizeT+l]) ; 
     278            } 
     279        } 
     280      } 
     281    } 
     282 
     283    void transferAverage(int repeat, int sizeT, const CArray<double,1>& dataIn, CArray<double,1>& dataOut) 
     284    { 
     285      double defaultValue = std::numeric_limits<double>::quiet_NaN(); 
     286 
     287      int dstSlice = dstSize_*sizeT ; 
     288      int srcSlice = srcSize_*sizeT ; 
     289      dataOut.resize(repeat* dstSlice) ; 
     290      dataOut=0 ; 
     291            
     292      const double* input = dataIn.dataFirst()  ; 
     293      double* output = dataOut.dataFirst()  ; 
     294 
     295      if (detectMissingValue_) 
     296      { 
     297        vector<int> touched(repeat* dstSlice, 0) ; 
     298        int pos=0 ; 
     299        for(int r=0;r<repeat;r++, input+=srcSlice, output+=dstSlice, pos+=dstSlice) 
     300        { 
     301          const double* in = input; 
     302          double* out = output ; 
     303          int k=0 ; 
     304          for(int i=0; i<dstSize_; i++, out+=sizeT, pos+=sizeT) 
     305          { 
     306            if (nSrc_[i]==0) for(int l=0; l<sizeT; l++) out[l] = defaultValue ; 
     307            else  
     308            { 
     309              for(int j=0 ; j<nSrc_[i] ; j++,k++) 
     310                for(int l=0; l<sizeT; l++)  
     311                { 
     312                  if (! std::isnan(in[connector_[k]*sizeT+l]) )  
     313                  { 
     314                    if (touched[pos+l]) out[l] += in[connector_[k]*sizeT+l] ; 
     315                    else  
     316                    { 
     317                      touched[pos+l]++ ; 
     318                      out[l] = in[connector_[k]*sizeT+l] ; 
     319                    } 
     320                  } 
     321                } 
     322            } 
     323          } 
     324        } 
     325 
     326        output = dataOut.dataFirst()  ; 
     327        pos=0 ; 
     328        for(int r=0;r<repeat;r++, input+=srcSlice, output+=dstSlice, pos+=dstSlice) 
     329        { 
     330          const double* in = input; 
     331          double* out = output ; 
     332          int k=0 ; 
     333          int pos=0 ; 
     334          for(int i=0; i<dstSize_; i++, out+=sizeT, pos+=sizeT) 
     335              for(int j=0 ; j<nSrc_[i] ; j++,k++) 
     336                for(int l=0; l<sizeT; l++)  
     337                  if (touched[pos+l]==0) out[l] = defaultValue ; 
     338                  else out[l]/=touched[pos+l] ; 
     339        } 
     340 
     341      } 
     342      else 
     343      { 
     344        for(int r=0;r<repeat;r++, input+=srcSlice, output+=dstSlice) 
     345        { 
     346          const double* in = input; 
     347          double* out = output ; 
     348          int k=0 ; 
     349          for(int i=0; i<dstSize_; i++, out+=sizeT) 
     350            if (nSrc_[i]==0) 
     351              for(int l=0; l<sizeT; l++) out[l] = defaultValue ; 
     352            else  
     353            { 
     354              for(int j=0 ; j<nSrc_[i] ; j++,k++) 
     355                for(int l=0; l<sizeT; l++) out[l] += in[connector_[k]*sizeT+l] ; 
     356            } 
     357           
     358          out = output ; 
     359          for(int i=0; i<dstSize_; i++, out+=sizeT) 
     360            if (nSrc_[i]!=0) 
     361              for(int l=0; l<sizeT; l++) out[l]/=nSrc_[i]; 
     362        } 
     363      } 
     364    } 
    131365   
    132366  }; 
Note: See TracChangeset for help on using the changeset viewer.