- Timestamp:
- 01/04/21 11:13:46 (4 years ago)
- 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 15 15 break ; 16 16 case EReduction::min : 17 transfer_=&CReduceTransformConnector::transferMin ; 17 18 break ; 18 19 case EReduction::max : 20 transfer_=&CReduceTransformConnector::transferMax ; 19 21 break ; 20 case EReduction::extract : 21 break ; 22 case EReduction::average : 22 case EReduction::average : 23 transfer_=&CReduceTransformConnector::transferAverage ; 23 24 break ; 24 25 default : -
XIOS/dev/dev_ym/XIOS_COUPLING/src/distribution/reduce_transform_connector.hpp
r1999 r2000 6 6 #include "local_view.hpp" 7 7 #include "reduction_types.hpp" 8 #include <algorithm> 8 9 9 10 … … 128 129 } 129 130 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 } 131 365 132 366 };
Note: See TracChangeset
for help on using the changeset viewer.