Changeset 1018
- Timestamp:
- 01/10/17 13:52:53 (7 years ago)
- Location:
- XIOS/trunk
- Files:
-
- 31 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/trunk/inputs/REMAP/iodef.xml
r1014 r1018 6 6 <field_definition level="1" > 7 7 <field_group id="fields_src" operation="instant"> 8 <field id="src_field_2D" domain_ref="src_domain" />8 <field id="src_field_2D" domain_ref="src_domain" /> 9 9 <field id="src_field_2D_clone" domain_ref="src_domain_clone"/> 10 <field id="src_field_3D" domain_ref="src_domain" axis_ref="src_axis"/> 11 <field id="src_field_3D_pression" grid_ref="src_grid_3D"/> 12 <field id="src_field_4D" grid_ref="grid_4D"/> 10 <field id="src_field_3D" domain_ref="src_domain" axis_ref="src_axis" /> 11 <field id="src_field_3D_clone" grid_ref="src_grid_3D" detect_missing_value=".TRUE." default_value="100000" /> 12 <field id="src_field_3D_pression" grid_ref="src_grid_3D" /> 13 <field id="src_field_4D" grid_ref="src_grid_4D" detect_missing_value=".TRUE." default_value="100000"/> 13 14 </field_group> 14 15 <field_group id="fields_dst"> 15 16 <field id="dst_field_2D" field_ref="src_field_2D" domain_ref="dst_domain"/> 16 17 <field id="dst_field_2D_regular_pole" field_ref="src_field_2D" domain_ref="dst_domain_regular_pole"/> 18 <field id="dst_field_2D_clone" field_ref="src_field_2D_clone" domain_ref="dst_domain"/> 19 <field id="dst_field_2D_extract" field_ref="src_field_3D_clone" grid_ref="dst_grid_2D_extract"/> 17 20 <field id="dst_field_3D" field_ref="src_field_3D" grid_ref="dst_grid_3D"/> 18 21 <field id="dst_field_3D_interp" field_ref="src_field_3D" axis_ref="dst_axis"/> 19 <field id="dst_field_4D_extract" field_ref="src_field_4D" grid_ref="grid_4D_extract"/> 20 <field id="dst_field_2D_clone" field_ref="src_field_2D_clone" domain_ref="dst_domain"/> 22 <field id="dst_field_4D_extract" field_ref="src_field_4D" grid_ref="dst_grid_4D_extract"/> 21 23 </field_group> 22 24 <field_group id="read_fields" operation="instant"> … … 35 37 <file id="output_2D" name="output_2D" > 36 38 <field field_ref="src_field_2D" name="field_src" /> 37 <field field_ref="src_field_2D" name="field_dst_regular_0" domain_ref="dst_domain_regular_pole" default_value="10.e+5"/>39 <field field_ref="src_field_2D" name="field_dst_regular_0" domain_ref="dst_domain_regular_pole" /> 38 40 <field field_ref="dst_field_2D" name="field_dst_regular_1" /> 39 41 <field field_ref="dst_field_2D_regular_pole" name="field_dst_regular_2" /> 40 42 <field field_ref="dst_field_2D_clone" name="field_dst_regular_3" /> 43 <field field_ref="dst_field_2D_extract" name="field_dst_regular_4" /> 41 44 </file> 42 <file id="output_3D" name="output_3D" >45 <file id="output_3D" name="output_3D" enabled=".TRUE." > 43 46 <field field_ref="src_field_3D" name="field_src" /> 44 47 <field field_ref="src_field_3D_pression" name="field" /> … … 46 49 <field field_ref="dst_field_3D_interp" name="field_dst_interp_domain_axis" domain_ref="dst_domain_regular_pole"/> 47 50 </file> 48 <file id="output_4D" name="output_4D" >51 <file id="output_4D" name="output_4D" enabled=".FALSE."> 49 52 <field field_ref="src_field_4D" name="field_4D" /> 50 53 <field field_ref="dst_field_4D_extract" name="field_4D_extract" /> … … 76 79 </file_group> 77 80 </file_definition> 81 82 <scalar_definition> 83 <scalar_group id="scalar_src"> 84 </scalar_group> 85 <scalar_group id="scalar_dst"> 86 <scalar id="scalar_extract"> 87 <reduce_axis operation="sum"/> 88 </scalar> 89 </scalar_group> 90 </scalar_definition> 78 91 79 92 <axis_definition> … … 109 122 <domain_group id="domain_dst"> 110 123 <domain id="dst_domain"> 111 <interpolate_domain write_weight=" true" />124 <interpolate_domain write_weight="false" /> 112 125 </domain> 113 126 <domain id="dst_domain_regular_pole" ni_glo="90" nj_glo="45" type="rectilinear"> 114 127 <generate_rectilinear_domain id="domain_regular_pole"/> 115 128 <interpolate_domain write_weight="false"/> 116 < zoom_domain ibegin="0" ni="45" jbegin="0" nj="45" />129 <!-- <zoom_domain ibegin="0" ni="45" jbegin="0" nj="45" /> --> 117 130 </domain> 118 131 <domain id="dst_domain_regular" ni_glo="90" nj_glo="45" type="rectilinear"> … … 142 155 <axis axis_ref="src_axis"/> 143 156 </grid> 144 <grid id=" grid_4D">157 <grid id="src_grid_4D"> 145 158 <domain domain_ref="src_domain"/> 146 159 <axis axis_ref="src_axis"/> … … 153 166 <domain domain_ref="dst_domain_regular"/> 154 167 </grid> 168 <grid id="dst_grid_2D_extract"> 169 <domain domain_ref="dst_domain_regular"/> 170 <scalar > 171 <reduce_axis operation="min"/> 172 <!-- <extract_axis position="2"/> --> 173 </scalar> 174 </grid> 155 175 <grid id="dst_grid_3D"> 156 176 <domain domain_ref="src_domain"/> 157 177 <axis axis_ref="dst_axis"/> 158 178 </grid> 159 <grid id=" grid_4D_extract">179 <grid id="dst_grid_4D_extract"> 160 180 <domain domain_ref="dst_domain_regular_pole"/> 161 181 <axis axis_ref="src_axis"/> 162 182 <scalar > 163 <extract_axis position="1"/> 183 <!-- <extract_axis position="1"/> --> 184 <reduce_axis operation="sum"/> 164 185 </scalar> 165 186 </grid> -
XIOS/trunk/src/filter/file_writer_filter.cpp
r639 r1018 2 2 #include "exception.hpp" 3 3 #include "field.hpp" 4 #include "utils.hpp" 4 5 5 6 namespace xios … … 16 17 void CFileWriterFilter::onInputReady(std::vector<CDataPacketPtr> data) 17 18 { 19 bool ignoreMissingValue = (!field->detect_missing_value.isEmpty() && 20 !field->default_value.isEmpty() && 21 field->detect_missing_value == true); 22 if (ignoreMissingValue) 23 { 24 double missingValue = field->default_value; 25 size_t nbData = data[0]->data.numElements(); 26 for (size_t idx = 0; idx < nbData; ++idx) 27 { 28 if (NumTraits<double>::isnan(data[0]->data(idx))) 29 data[0]->data(idx) = missingValue; 30 } 31 } 32 18 33 field->sendUpdateData(data[0]->data); 19 34 } -
XIOS/trunk/src/filter/source_filter.cpp
r1006 r1018 3 3 #include "exception.hpp" 4 4 #include "calendar_util.hpp" 5 #include <limits> 5 6 6 7 namespace xios 7 8 { 8 9 CSourceFilter::CSourceFilter(CGarbageCollector& gc, CGrid* grid, 9 const CDuration offset /*= NoneDu*/, bool manualTrigger /*= false*/) 10 const CDuration offset /*= NoneDu*/, bool manualTrigger /*= false*/, 11 bool hasMissingValue /*= false*/, 12 double defaultValue /*= 0.0*/) 10 13 : COutputPin(gc, manualTrigger) 11 14 , grid(grid) 12 15 , offset(offset) 16 , hasMissingValue(hasMissingValue), defaultValue(defaultValue) 13 17 { 14 18 if (!grid) … … 29 33 packet->data.resize(grid->storeIndex_client.numElements()); 30 34 grid->inputField(data, packet->data); 35 36 // Convert missing values to NaN 37 if (hasMissingValue) 38 { 39 double nanValue = std::numeric_limits<double>::quiet_NaN(); 40 size_t nbData = packet->data.numElements(); 41 for (size_t idx = 0; idx < nbData; ++idx) 42 { 43 if (defaultValue == packet->data(idx)) 44 packet->data(idx) = nanValue; 45 } 46 } 31 47 32 48 onOutputReady(packet); -
XIOS/trunk/src/filter/source_filter.hpp
r1006 r1018 23 23 * \param offset the offset applied to the timestamp of all packets 24 24 * \param manualTrigger whether the output should be triggered manually 25 * \param hasMissingValue whether data has missing value 26 * \param defaultValue missing value to detect 25 27 */ 26 28 CSourceFilter(CGarbageCollector& gc, CGrid* grid, 27 const CDuration offset = NoneDu, bool manualTrigger = false); 29 const CDuration offset = NoneDu, bool manualTrigger = false, 30 bool hasMissingValue = false, 31 double defaultValue = 0.0); 28 32 29 33 /*! … … 58 62 CGrid* grid; //!< The grid attached to the data the filter can accept 59 63 const CDuration offset; //!< The offset applied to the timestamp of all packets 64 bool hasMissingValue; 65 double defaultValue; 60 66 }; // class CSourceFilter 61 67 } // namespace xios -
XIOS/trunk/src/filter/spatial_transform_filter.cpp
r1006 r1018 11 11 12 12 std::pair<boost::shared_ptr<CSpatialTransformFilter>, boost::shared_ptr<CSpatialTransformFilter> > 13 CSpatialTransformFilter::buildFilterGraph(CGarbageCollector& gc, CGrid* srcGrid, CGrid* destGrid, double defaultValue)13 CSpatialTransformFilter::buildFilterGraph(CGarbageCollector& gc, CGrid* srcGrid, CGrid* destGrid, bool hasMissingValue, double missingValue) 14 14 { 15 15 if (!srcGrid || !destGrid) … … 26 26 const std::vector<StdString>& auxInputs = gridTransformation->getAuxInputs(); 27 27 size_t inputCount = 1 + (auxInputs.empty() ? 0 : auxInputs.size()); 28 double defaultValue = (hasMissingValue) ? std::numeric_limits<double>::quiet_NaN() : missingValue; 28 29 boost::shared_ptr<CSpatialTransformFilter> filter(new CSpatialTransformFilter(gc, engine, defaultValue, inputCount)); 29 30 … … 103 104 } 104 105 packet->data.resize(gridTransformation->getGridDestination()->storeIndex_client.numElements()); 105 packet->data = defaultValue; 106 if (0 != packet->data.numElements()) 107 (packet->data)(0) = defaultValue; 106 108 apply(data[0]->data, packet->data); 107 109 } -
XIOS/trunk/src/filter/spatial_transform_filter.hpp
r873 r1018 32 32 * \param srcGrid the source grid 33 33 * \param destGrid the destination grid 34 * \param hasMissingValue whether field source has missing value 35 * \param defaultValue default value 34 36 * \return the first and the last filters of the filter graph 35 37 */ 36 38 static std::pair<boost::shared_ptr<CSpatialTransformFilter>, boost::shared_ptr<CSpatialTransformFilter> > 37 buildFilterGraph(CGarbageCollector& gc, CGrid* srcGrid, CGrid* destGrid, double defaultValue);39 buildFilterGraph(CGarbageCollector& gc, CGrid* srcGrid, CGrid* destGrid, bool hasMissingValue, double defaultValue); 38 40 39 41 protected: -
XIOS/trunk/src/filter/temporal_filter.cpp
r854 r1018 15 15 , isFirstOperation(true) 16 16 { 17 double defaultValue = ignoreMissingValue ? std::numeric_limits<double>::quiet_NaN() : missingValue; 18 17 19 #define DECLARE_FUNCTOR(MType, mtype) \ 18 20 if (opId.compare(#mtype) == 0) \ … … 20 22 if (ignoreMissingValue) \ 21 23 { \ 22 functor.reset(new func::C##MType(tmpData, missingValue)); \24 functor.reset(new func::C##MType(tmpData, defaultValue)); \ 23 25 } \ 24 26 else \ -
XIOS/trunk/src/functor/accumulate.cpp
r591 r1018 1 1 #include "accumulate.hpp" 2 2 #include "array_new.hpp" 3 #include "utils.hpp" 3 4 4 5 namespace xios … … 33 34 double* out=_doutput.dataFirst(); 34 35 for (i=0; i<n; ++i,++in,++out) 35 if ( *in!=missingValue)36 if (!NumTraits<double>::isnan(*in)) 36 37 { 37 if( *out!=missingValue) *out += *in;38 if(!NumTraits<double>::isnan(*out)) *out += *in; 38 39 else *out=*in ; 39 40 } -
XIOS/trunk/src/functor/average.cpp
r591 r1018 1 1 #include "average.hpp" 2 2 #include "array_new.hpp" 3 #include "utils.hpp" 3 4 4 5 namespace xios … … 42 43 int* nc=nbcalls.dataFirst() ; 43 44 for (i=0; i<n; ++i,++nc,++in) 44 if ( *in!=missingValue) (*nc) ++;45 if (!NumTraits<double>::isnan(*in)) (*nc) ++; 45 46 } 46 47 } … … 54 55 int* nc=nbcalls.dataFirst() ; 55 56 for (i=0; i<n; ++i,++in,++out,++nc) 56 if ( *in!=missingValue)57 if (!NumTraits<double>::isnan(*in)) 57 58 { 58 59 if (*nc != 0) (*out) += *in; -
XIOS/trunk/src/functor/maximum.cpp
r591 r1018 1 1 #include "maximum.hpp" 2 2 #include "array_new.hpp" 3 4 3 #include "utils.hpp" 5 4 6 5 namespace xios … … 35 34 { 36 35 for (; it1 != end1; it1++, it++) 37 if ( *it1 != missingValue)36 if (!NumTraits<double>::isnan(*it1)) 38 37 { 39 if ( *it != missingValue) *it = std::max(*it1, *it);38 if (!NumTraits<double>::isnan(*it)) *it = std::max(*it1, *it); 40 39 else *it=*it1 ; 41 40 } -
XIOS/trunk/src/functor/minimum.cpp
r591 r1018 2 2 #include "array_new.hpp" 3 3 #include <algorithm> 4 #include "utils.hpp" 4 5 5 6 namespace xios … … 26 27 { 27 28 const double * it1 = _dinput.dataFirst(), 28 * 29 *end1 = _dinput.dataFirst() + _dinput.numElements(); 29 30 double * it = _doutput.dataFirst(); 30 31 … … 35 36 { 36 37 for (; it1 != end1; it1++, it++) 37 if ( *it1!=missingValue)38 if (!NumTraits<double>::isnan(*it1)) 38 39 { 39 if ( *it != missingValue) *it = std::min(*it1, *it);40 if (!NumTraits<double>::isnan(*it)) *it = std::min(*it1, *it); 40 41 else *it=*it1 ; 41 42 } -
XIOS/trunk/src/node/field.cpp
r1017 r1018 795 795 if (grid && grid != gridRef && grid->hasTransform()) 796 796 { 797 double defaultValue = !default_value.isEmpty() ? default_value : 0.0; 798 std::pair<boost::shared_ptr<CFilter>, boost::shared_ptr<CFilter> > filters = CSpatialTransformFilter::buildFilterGraph(gc, gridRef, grid, defaultValue); 797 bool hasMissingValue = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value == true); 798 double defaultValue = hasMissingValue ? default_value : (!default_value.isEmpty() ? default_value : 0.0); 799 std::pair<boost::shared_ptr<CFilter>, boost::shared_ptr<CFilter> > filters = CSpatialTransformFilter::buildFilterGraph(gc, gridRef, grid, hasMissingValue, defaultValue); 799 800 800 801 filter->connectOutput(filters.first, 0); … … 814 815 true)); 815 816 else // The data might be passed from the model 816 instantDataFilter = clientSourceFilter = boost::shared_ptr<CSourceFilter>(new CSourceFilter(gc, grid)); 817 { 818 bool ignoreMissingValue = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value == true); 819 double defaultValue = ignoreMissingValue ? default_value : (!default_value.isEmpty() ? default_value : 0.0); 820 instantDataFilter = clientSourceFilter = boost::shared_ptr<CSourceFilter>(new CSourceFilter(gc, grid, NoneDu, false, 821 ignoreMissingValue, defaultValue)); } 817 822 } 818 823 … … 853 858 // Check if a spatial transformation is needed 854 859 if (grid && grid != fieldRef->grid && grid->hasTransform()) 855 { 856 double defaultValue = !default_value.isEmpty() ? default_value : 0.0; 857 filters = CSpatialTransformFilter::buildFilterGraph(gc, fieldRef->grid, grid, defaultValue); 860 { 861 bool hasMissingValue = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value == true); 862 double defaultValue = hasMissingValue ? default_value : (!default_value.isEmpty() ? default_value : 0.0); 863 filters = CSpatialTransformFilter::buildFilterGraph(gc, fieldRef->grid, grid, hasMissingValue, defaultValue); 858 864 } 859 865 else … … 900 906 { 901 907 if (!clientSourceFilter) 902 clientSourceFilter = boost::shared_ptr<CSourceFilter>(new CSourceFilter(gc, grid)); 908 { 909 bool ignoreMissingValue = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value == true); 910 double defaultValue = ignoreMissingValue ? default_value : (!default_value.isEmpty() ? default_value : 0.0); 911 clientSourceFilter = boost::shared_ptr<CSourceFilter>(new CSourceFilter(gc, grid, NoneDu, false, 912 ignoreMissingValue, defaultValue)); 913 } 903 914 904 915 selfReferenceFilter = clientSourceFilter; … … 934 945 935 946 const bool ignoreMissingValue = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value == true); 936 947 937 948 boost::shared_ptr<CTemporalFilter> temporalFilter(new CTemporalFilter(gc, operation, 938 949 CContext::getCurrent()->getCalendar()->getInitDate(), -
XIOS/trunk/src/test/test_remap.f90
r978 r1018 91 91 IF (MOD(i,10)==0) THEN 92 92 src_mask_2D(i)=.FALSE. 93 src_field_2D(i) = 100000 93 94 ELSE 94 src_mask_2D(i)=.TRUE. 95 src_mask_2D(i)=.TRUE. 95 96 ENDIF 96 97 ENDDO … … 99 100 lval(i) = i*100 100 101 src_field_pression(:,i) = i * 100 101 src_field_3D(:,i) = src_field_3D(:,i) + i * 10 102 IF (MOD(i,3)==0) THEN 103 ! src_field_pression(:,i) = 100000 104 src_field_3D(:,i) = 100000 105 ELSE 106 ! src_field_pression(:,i) = i * 100 107 src_field_3D(:,i) = src_field_3D(:,i) + i * 10 108 ENDIF 109 ! src_field_3D(:,i) = src_field_3D(:,i) + i * 10 102 110 ENDDO 103 111 104 112 DO i=1,llm2 105 src_field_4D(:,:,i) = src_field_3D(:,:) 113 src_field_4D(:,:,i) = src_field_3D(:,:) + i * 100 106 114 ENDDO 107 115 … … 184 192 CALL xios_send_field("src_field_2D_clone",src_field_2D) 185 193 CALL xios_send_field("src_field_3D",src_field_3D) 194 CALL xios_send_field("src_field_3D_clone",src_field_3D) 186 195 CALL xios_send_field("src_field_4D",src_field_4D) 187 196 CALL xios_send_field("src_field_3D_pression",src_field_pression) -
XIOS/trunk/src/transformation/Functions/average_reduction.cpp
r979 r1018 3 3 \author Ha NGUYEN 4 4 \since 8 Sep 2016 5 \date 8 Sep 20165 \date 9 Jan 2017 6 6 7 7 \brief average reduction 8 8 */ 9 9 #include "average_reduction.hpp" 10 #include "utils.hpp" 10 11 11 12 namespace xios { … … 29 30 const double* dataInput, 30 31 CArray<double,1>& dataOut, 31 std::vector<bool>& flagInitial) 32 std::vector<bool>& flagInitial, 33 const double& defaultValue) 32 34 { 33 35 if (resetWeight_) { weights_.resize(flagInitial.size()); weights_ = 1.0; resetWeight_ = false; } 36 bool hasMissingValue = NumTraits<double>::isnan(defaultValue); 34 37 35 int nbLocalIndex = localIndex.size(); 36 int currentlocalIndex = 0; 37 double currentWeight = 0.0; 38 for (int idx = 0; idx < nbLocalIndex; ++idx) 38 if (hasMissingValue) 39 39 { 40 currentlocalIndex = localIndex[idx].first; 41 currentWeight = localIndex[idx].second; 40 int nbLocalIndex = localIndex.size(); 41 int currentlocalIndex = 0; 42 double currentWeight = 0.0; 43 for (int idx = 0; idx < nbLocalIndex; ++idx) 44 { 45 currentlocalIndex = localIndex[idx].first; 46 currentWeight = localIndex[idx].second; 47 if (!NumTraits<double>::isnan(*(dataInput + idx))) 48 { 49 if (flagInitial[currentlocalIndex]) 50 { 51 dataOut(currentlocalIndex) = *(dataInput + idx); 52 flagInitial[currentlocalIndex] = false; 53 } 54 else 55 { 56 dataOut(currentlocalIndex) += *(dataInput + idx); 57 weights_(currentlocalIndex) += 1.0; 58 } 59 } 60 } 61 } 62 else 63 { 64 int nbLocalIndex = localIndex.size(); 65 int currentlocalIndex = 0; 66 double currentWeight = 0.0; 67 for (int idx = 0; idx < nbLocalIndex; ++idx) 68 { 69 currentlocalIndex = localIndex[idx].first; 70 currentWeight = localIndex[idx].second; 42 71 43 if (flagInitial[currentlocalIndex]) 44 { 45 dataOut(currentlocalIndex) = *(dataInput + idx); 46 flagInitial[currentlocalIndex] = false; 47 } 48 else 49 { 50 dataOut(currentlocalIndex) += *(dataInput + idx); 51 weights_(currentlocalIndex) += 1.0; 72 if (flagInitial[currentlocalIndex]) 73 { 74 dataOut(currentlocalIndex) = *(dataInput + idx); 75 flagInitial[currentlocalIndex] = false; 76 } 77 else 78 { 79 dataOut(currentlocalIndex) += *(dataInput + idx); 80 weights_(currentlocalIndex) += 1.0; 81 } 52 82 } 53 83 } -
XIOS/trunk/src/transformation/Functions/average_reduction.hpp
r979 r1018 26 26 const double* dataInput, 27 27 CArray<double,1>& dataOut, 28 std::vector<bool>& flagInitial); 28 std::vector<bool>& flagInitial, 29 const double& defaultValue); 29 30 30 31 virtual void updateData(CArray<double,1>& dataOut); -
XIOS/trunk/src/transformation/Functions/extract.cpp
r895 r1018 29 29 const double* dataInput, 30 30 CArray<double,1>& dataOut, 31 std::vector<bool>& flagInitial) 31 std::vector<bool>& flagInitial, 32 const double& defaultValue) 32 33 { 33 34 int nbLocalIndex = localIndex.size(); -
XIOS/trunk/src/transformation/Functions/extract.hpp
r895 r1018 26 26 const double* dataInput, 27 27 CArray<double,1>& dataOut, 28 std::vector<bool>& flagInitial); 28 std::vector<bool>& flagInitial, 29 const double& defaultValue); 29 30 30 31 virtual ~CExtractReductionAlgorithm() {} -
XIOS/trunk/src/transformation/Functions/max_reduction.cpp
r979 r1018 8 8 */ 9 9 #include "max_reduction.hpp" 10 #include "utils.hpp" 10 11 11 12 namespace xios { … … 29 30 const double* dataInput, 30 31 CArray<double,1>& dataOut, 31 std::vector<bool>& flagInitial) 32 std::vector<bool>& flagInitial, 33 const double& defaultValue) 32 34 { 33 int nbLocalIndex = localIndex.size(); 34 int currentlocalIndex = 0; 35 double currentWeight = 0.0; 36 for (int idx = 0; idx < nbLocalIndex; ++idx) 35 bool hasMissingValue = NumTraits<double>::isnan(defaultValue); 36 37 if (hasMissingValue) 37 38 { 38 currentlocalIndex = localIndex[idx].first;39 currentWeight = localIndex[idx].second;40 if (flagInitial[currentlocalIndex])39 int nbLocalIndex = localIndex.size(); 40 int currentlocalIndex = 0; 41 for (int idx = 0; idx < nbLocalIndex; ++idx) 41 42 { 42 dataOut(currentlocalIndex) = *(dataInput + idx); 43 flagInitial[currentlocalIndex] = false; 43 currentlocalIndex = localIndex[idx].first; 44 if (!NumTraits<double>::isnan(*(dataInput + idx))) 45 { 46 if (flagInitial[currentlocalIndex]) 47 { 48 dataOut(currentlocalIndex) = *(dataInput + idx); 49 flagInitial[currentlocalIndex] = false; 50 } 51 else 52 { 53 dataOut(currentlocalIndex) = std::max(*(dataInput + idx), dataOut(currentlocalIndex)); 54 } 55 } 44 56 } 45 else 57 } 58 else 59 { 60 int nbLocalIndex = localIndex.size(); 61 int currentlocalIndex = 0; 62 for (int idx = 0; idx < nbLocalIndex; ++idx) 46 63 { 47 dataOut(currentlocalIndex) = std::max(*(dataInput + idx), dataOut(currentlocalIndex)); 64 currentlocalIndex = localIndex[idx].first; 65 if (flagInitial[currentlocalIndex]) 66 { 67 dataOut(currentlocalIndex) = *(dataInput + idx); 68 flagInitial[currentlocalIndex] = false; 69 } 70 else 71 { 72 dataOut(currentlocalIndex) = std::max(*(dataInput + idx), dataOut(currentlocalIndex)); 73 } 48 74 } 49 75 } -
XIOS/trunk/src/transformation/Functions/max_reduction.hpp
r979 r1018 26 26 const double* dataInput, 27 27 CArray<double,1>& dataOut, 28 std::vector<bool>& flagInitial); 28 std::vector<bool>& flagInitial, 29 const double& defaultValue); 29 30 30 31 virtual ~CMaxReductionAlgorithm() {} -
XIOS/trunk/src/transformation/Functions/min_reduction.cpp
r979 r1018 3 3 \author Ha NGUYEN 4 4 \since 27 June 2016 5 \date 27 June 20165 \date 9 Jan 2017 6 6 7 7 \brief min reduction 8 8 */ 9 9 #include "min_reduction.hpp" 10 #include "utils.hpp" 10 11 11 12 namespace xios { … … 29 30 const double* dataInput, 30 31 CArray<double,1>& dataOut, 31 std::vector<bool>& flagInitial) 32 std::vector<bool>& flagInitial, 33 const double& defaultValue) 32 34 { 33 int nbLocalIndex = localIndex.size();34 int currentlocalIndex = 0; 35 for (int idx = 0; idx < nbLocalIndex; ++idx)35 bool hasMissingValue = NumTraits<double>::isnan(defaultValue); 36 37 if (hasMissingValue) 36 38 { 37 currentlocalIndex = localIndex[idx].first; 38 if (flagInitial[currentlocalIndex]) 39 int nbLocalIndex = localIndex.size(); 40 int currentlocalIndex = 0; 41 for (int idx = 0; idx < nbLocalIndex; ++idx) 39 42 { 40 dataOut(currentlocalIndex) = *(dataInput + idx); 41 flagInitial[currentlocalIndex] = false; 43 currentlocalIndex = localIndex[idx].first; 44 if (!NumTraits<double>::isnan(*(dataInput + idx))) 45 { 46 if (flagInitial[currentlocalIndex]) 47 { 48 dataOut(currentlocalIndex) = *(dataInput + idx); 49 flagInitial[currentlocalIndex] = false; 50 } 51 else 52 { 53 dataOut(currentlocalIndex) = std::min(*(dataInput + idx), dataOut(currentlocalIndex)); 54 } 55 } 42 56 } 43 else 57 } 58 else 59 { 60 int nbLocalIndex = localIndex.size(); 61 int currentlocalIndex = 0; 62 for (int idx = 0; idx < nbLocalIndex; ++idx) 44 63 { 45 dataOut(currentlocalIndex) = std::min(*(dataInput + idx), dataOut(currentlocalIndex)); 64 currentlocalIndex = localIndex[idx].first; 65 if (flagInitial[currentlocalIndex]) 66 { 67 dataOut(currentlocalIndex) = *(dataInput + idx); 68 flagInitial[currentlocalIndex] = false; 69 } 70 else 71 { 72 dataOut(currentlocalIndex) = std::min(*(dataInput + idx), dataOut(currentlocalIndex)); 73 } 46 74 } 47 75 } -
XIOS/trunk/src/transformation/Functions/min_reduction.hpp
r979 r1018 26 26 const double* dataInput, 27 27 CArray<double,1>& dataOut, 28 std::vector<bool>& flagInitial); 28 std::vector<bool>& flagInitial, 29 const double& defaultValue); 29 30 30 31 virtual ~CMinReductionAlgorithm() {} -
XIOS/trunk/src/transformation/Functions/reduction.hpp
r979 r1018 45 45 const double* dataInput, 46 46 CArray<double,1>& dataOut, 47 std::vector<bool>& flagInitial) = 0; 47 std::vector<bool>& flagInitial, 48 const double& defaultValue) = 0; 48 49 /*! 49 50 Update local data -
XIOS/trunk/src/transformation/Functions/sum_reduction.cpp
r979 r1018 3 3 \author Ha NGUYEN 4 4 \since 27 June 2016 5 \date 27 June 20165 \date 9 Jan 2017 6 6 7 7 \brief sum reduction 8 8 */ 9 9 #include "sum_reduction.hpp" 10 #include "utils.hpp" 10 11 11 12 namespace xios { … … 29 30 const double* dataInput, 30 31 CArray<double,1>& dataOut, 31 std::vector<bool>& flagInitial) 32 std::vector<bool>& flagInitial, 33 const double& defaultValue) 32 34 { 33 int nbLocalIndex = localIndex.size(); 34 int currentlocalIndex = 0; 35 double currentWeight = 0.0; 36 for (int idx = 0; idx < nbLocalIndex; ++idx) 35 bool hasMissingValue = NumTraits<double>::isnan(defaultValue); 36 if (hasMissingValue) 37 37 { 38 currentlocalIndex = localIndex[idx].first;39 currentWeight = localIndex[idx].second;40 if (flagInitial[currentlocalIndex])38 int nbLocalIndex = localIndex.size(); 39 int currentlocalIndex = 0; 40 for (int idx = 0; idx < nbLocalIndex; ++idx) 41 41 { 42 dataOut(currentlocalIndex) = *(dataInput + idx); 43 flagInitial[currentlocalIndex] = false; 44 } 45 else 42 currentlocalIndex = localIndex[idx].first; 43 if (!NumTraits<double>::isnan(*(dataInput + idx))) 44 { 45 if (flagInitial[currentlocalIndex]) 46 { 47 dataOut(currentlocalIndex) = *(dataInput + idx); 48 flagInitial[currentlocalIndex] = false; 49 } 50 else 51 { 52 dataOut(currentlocalIndex) += *(dataInput + idx); 53 } 54 } 55 } 56 } 57 else 58 { 59 int nbLocalIndex = localIndex.size(); 60 int currentlocalIndex = 0; 61 for (int idx = 0; idx < nbLocalIndex; ++idx) 46 62 { 47 dataOut(currentlocalIndex) += *(dataInput + idx); 63 currentlocalIndex = localIndex[idx].first; 64 if (flagInitial[currentlocalIndex]) 65 { 66 dataOut(currentlocalIndex) = *(dataInput + idx); 67 flagInitial[currentlocalIndex] = false; 68 } 69 else 70 { 71 dataOut(currentlocalIndex) += *(dataInput + idx); 72 } 48 73 } 49 74 } -
XIOS/trunk/src/transformation/Functions/sum_reduction.hpp
r979 r1018 26 26 const double* dataInput, 27 27 CArray<double,1>& dataOut, 28 std::vector<bool>& flagInitial); 28 std::vector<bool>& flagInitial, 29 const double& defaultValue); 29 30 30 31 virtual ~CSumReductionAlgorithm() {} -
XIOS/trunk/src/transformation/axis_algorithm_extract_domain.cpp
r980 r1018 71 71 const double& defaultValue) 72 72 { 73 reduction_->apply(localIndex, dataInput, dataOut, flagInitial );73 reduction_->apply(localIndex, dataInput, dataOut, flagInitial, defaultValue); 74 74 } 75 75 -
XIOS/trunk/src/transformation/axis_algorithm_reduce_domain.cpp
r980 r1018 79 79 const double& defaultValue) 80 80 { 81 reduction_->apply(localIndex, dataInput, dataOut, flagInitial );81 reduction_->apply(localIndex, dataInput, dataOut, flagInitial, defaultValue); 82 82 } 83 83 -
XIOS/trunk/src/transformation/generic_algorithm_transformation.cpp
r979 r1018 11 11 #include "context_client.hpp" 12 12 #include "client_client_dht_template.hpp" 13 #include "utils.hpp" 13 14 14 15 namespace xios { … … 31 32 const double& defaultValue) 32 33 { 33 int nbLocalIndex = localIndex.size(); 34 bool hasMissingValue = (0.0 != defaultValue) ? true : false;34 int nbLocalIndex = localIndex.size(); 35 bool hasMissingValue = NumTraits<double>::isnan(defaultValue); 35 36 if (hasMissingValue) 36 37 { 37 38 for (int idx = 0; idx < nbLocalIndex; ++idx) 38 39 { 39 if ( defaultValue == *(dataInput + idx))40 if (NumTraits<double>::isnan(*(dataInput + idx))) 40 41 { 41 42 flagInitial[localIndex[idx].first] = false; -
XIOS/trunk/src/transformation/scalar_algorithm_extract_axis.cpp
r980 r1018 58 58 const double& defaultValue) 59 59 { 60 reduction_->apply(localIndex, dataInput, dataOut, flagInitial );60 reduction_->apply(localIndex, dataInput, dataOut, flagInitial, defaultValue); 61 61 } 62 62 -
XIOS/trunk/src/transformation/scalar_algorithm_reduce_axis.cpp
r980 r1018 90 90 const double& defaultValue) 91 91 { 92 reduction_->apply(localIndex, dataInput, dataOut, flagInitial );92 reduction_->apply(localIndex, dataInput, dataOut, flagInitial, defaultValue); 93 93 } 94 94 -
XIOS/trunk/src/transformation/scalar_algorithm_reduce_domain.cpp
r979 r1018 84 84 const double& defaultValue) 85 85 { 86 reduction_->apply(localIndex, dataInput, dataOut, flagInitial );86 reduction_->apply(localIndex, dataInput, dataOut, flagInitial, defaultValue); 87 87 } 88 88 -
XIOS/trunk/src/utils.hpp
r814 r1018 257 257 return 1e-12; 258 258 } 259 static inline bool isnan(const Scalar& v) { 260 return (v != v); 261 } 259 262 }; 260 263
Note: See TracChangeset
for help on using the changeset viewer.