void QgsMeshCalcUtils::func2( QgsMeshMemoryDatasetGroup &group1, const QgsMeshMemoryDatasetGroup &group2, std::function<double( double, double )> func ) const { Q_ASSERT( isValid() ); Q_ASSERT( group1.type == group2.type ); // we do not support mixed output types expand( group1, group2 ); for ( int time_index = 0; time_index < datasetCount( group1, group2 ); ++time_index ) { std::shared_ptr<QgsMeshMemoryDataset> o1 = canditateDataset( group1, time_index ); std::shared_ptr<const QgsMeshMemoryDataset> o2 = constCandidateDataset( group2, time_index ); for ( int n = 0; n < o2->values.size(); ++n ) { double val1 = o1->values[n].scalar(); double val2 = o2->values[n].scalar(); double res_val = D_NODATA; if ( !std::isnan( val1 ) && !std::isnan( val2 ) ) res_val = func( val1, val2 ); o1->values[n] = res_val; } if ( group1.type == QgsMeshDatasetGroupMetadata::DataOnVertices ) { activate( o1, o2 ); } } }
AbstractAnalysisData &TrajectoryAnalysisModule::datasetFromIndex(int index) const { if (index < 0 || index >= datasetCount()) { GMX_THROW(APIError("Out of range data set index")); } Impl::DatasetContainer::const_iterator item = impl_->datasets_.find(impl_->datasetNames_[index]); GMX_RELEASE_ASSERT(item != impl_->datasets_.end(), "Inconsistent data set names"); return *item->second; }
std::shared_ptr<QgsMeshMemoryDatasetGroup> QgsMeshCalcUtils::create( const QString &datasetGroupName ) const { const auto dp = mMeshLayer->dataProvider(); std::shared_ptr<QgsMeshMemoryDatasetGroup> grp; for ( int group_i = 0; group_i < dp->datasetGroupCount(); ++group_i ) { const auto meta = dp->datasetGroupMetadata( group_i ); const QString name = meta.name(); if ( name == datasetGroupName ) { grp = std::make_shared<QgsMeshMemoryDatasetGroup>(); grp->isScalar = meta.isScalar(); grp->type = meta.dataType(); grp->maximum = meta.maximum(); grp->minimum = meta.minimum(); grp->name = meta.name(); int count = ( meta.dataType() == QgsMeshDatasetGroupMetadata::DataOnFaces ) ? dp->faceCount() : dp->vertexCount(); for ( int dataset_i = 0; dataset_i < dp->datasetCount( group_i ); ++dataset_i ) { const QgsMeshDatasetIndex index( group_i, dataset_i ); const auto dsMeta = dp->datasetMetadata( index ); std::shared_ptr<QgsMeshMemoryDataset> ds = create( grp->type ); ds->maximum = dsMeta.maximum(); ds->minimum = dsMeta.minimum(); ds->time = dsMeta.time(); ds->valid = dsMeta.isValid(); const QgsMeshDataBlock block = dp->datasetValues( index, 0, count ); Q_ASSERT( block.count() == count ); for ( int value_i = 0; value_i < count; ++value_i ) ds->values[value_i] = block.value( value_i ); const QgsMeshDataBlock active = dp->areFacesActive( index, 0, dp->faceCount() ); Q_ASSERT( active.count() == dp->faceCount() ); for ( int value_i = 0; value_i < dp->faceCount(); ++value_i ) ds->active[value_i] = active.active( value_i ); grp->addDataset( ds ); } break; } } return grp; }