// computes Btransposed*eta for the given Gauss point // (where eta is the derivative of cum. plastic strain wrt final strain) void RankineMatNl :: giveRemoteNonlocalStiffnessContribution(GaussPoint *gp, IntArray &rloc, const UnknownNumberingScheme &s, FloatArray &rcontrib, TimeStep *atTime) { RankineMatNlStatus *status = ( RankineMatNlStatus * ) this->giveStatus(gp); StructuralElement *elem = ( StructuralElement * )( gp->giveElement() ); elem->giveLocationArray(rloc, EID_MomentumBalance, s); FloatMatrix b; elem->computeBmatrixAt(gp, b); int ncols = b.giveNumberOfColumns(); rcontrib.resize(ncols); double kappa = status->giveCumulativePlasticStrain(); double tempKappa = status->giveTempCumulativePlasticStrain(); if ( tempKappa <= kappa ) { rcontrib.zero(); return; } int i, j; double sum; int nsize = 3; FloatArray eta(3); computeEta(eta, status); for ( i = 1; i <= ncols; i++ ) { sum = 0.; for ( j = 1; j <= nsize; j++ ) { sum += eta.at(j) * b.at(j, i); } rcontrib.at(i) = sum; } }
void AdaptiveManifoldFilterN::buildManifoldsAndPerformFiltering(vector<Mat>& eta, Mat1b& cluster, int treeLevel) { CV_DbgAssert((int)eta.size() == jointCnNum); //splatting Size etaSize = eta[0].size(); CV_DbgAssert(etaSize == srcSize || etaSize == smallSize); if (etaSize == srcSize) { compute_w_k(eta, w_k, sigma_r_over_sqrt_2, treeLevel); etaFull = eta; downsample(eta, eta); } else { upsample(eta, etaFull); compute_w_k(etaFull, w_k, sigma_r_over_sqrt_2, treeLevel); } //blurring Psi_splat_small.resize(srcCnNum); for (int si = 0; si < srcCnNum; si++) { Mat tmp; multiply(srcCn[si], w_k, tmp); downsample(tmp, Psi_splat_small[si]); } downsample(w_k, Psi_splat_0_small); vector<Mat>& Psi_splat_small_blur = Psi_splat_small; Mat& Psi_splat_0_small_blur = Psi_splat_0_small; float rf_ss = (float)(sigma_s_ / getResizeRatio()); float rf_sr = (float)(sigma_r_over_sqrt_2); RFFilterPass(eta, Psi_splat_small, Psi_splat_0_small, Psi_splat_small_blur, Psi_splat_0_small_blur, rf_ss, rf_sr); //slicing { Mat tmp; for (int i = 0; i < srcCnNum; i++) { upsample(Psi_splat_small_blur[i], tmp); multiply(tmp, w_k, tmp); add(sum_w_ki_Psi_blur_[i], tmp, sum_w_ki_Psi_blur_[i]); } upsample(Psi_splat_0_small_blur, tmp); multiply(tmp, w_k, tmp); add(sum_w_ki_Psi_blur_0_, tmp, sum_w_ki_Psi_blur_0_); } //build new manifolds if (treeLevel < curTreeHeight) { Mat1b cluster_minus, cluster_plus; computeClusters(cluster, cluster_minus, cluster_plus); vector<Mat> eta_minus(jointCnNum), eta_plus(jointCnNum); { Mat1f teta = 1.0 - w_k; computeEta(teta, cluster_minus, eta_minus); computeEta(teta, cluster_plus, eta_plus); } //free memory to continue deep recursion eta.clear(); cluster.release(); buildManifoldsAndPerformFiltering(eta_minus, cluster_minus, treeLevel + 1); buildManifoldsAndPerformFiltering(eta_plus, cluster_plus, treeLevel + 1); } }