void BasalGravitationalWaterPotential<EvalT, Traits>:: evaluateFields (typename Traits::EvalData workset) { if (stokes) { const Albany::SideSetList& ssList = *(workset.sideSets); Albany::SideSetList::const_iterator it_ss = ssList.find(basalSideName); if (it_ss==ssList.end()) return; const std::vector<Albany::SideStruct>& sideSet = it_ss->second; std::vector<Albany::SideStruct>::const_iterator iter_s; for (const auto& it : sideSet) { // Get the local data of side and cell const int cell = it.elem_LID; const int side = it.side_local_id; for (int node=0; node<numNodes; ++node) { phi_0 (cell,side,node) = rho_w*g*(z_s(cell,side,node) - H(cell,side,node)); } } } else { for (int cell=0; cell<workset.numCells; ++cell) { for (int node=0; node<numNodes; ++node) { phi_0 (cell,node) = rho_w*g*(z_s(cell,node) - H(cell,node)); } } } }
inline bool Quick_ZHay<Tprec, Dim>::calcCoefficients3D () { prec_t dyz = dy * dz, dyz_dx = Gamma * dyz / dx; prec_t dxz = dx * dz, dxz_dy = Gamma * dxz / dy; prec_t dxy = dx * dy, dxy_dz = Gamma * dxy / dz; prec_t dxyz_dt = dx * dy * dz / dt; prec_t ce, cem, cep, cw, cwm, cwp, CE, CW; prec_t cn, cnm, cnp, cs, csm, csp, CN, CS; prec_t cf, cfm, cfp, cb, cbm, cbp, CF, CB; aE = 0.0; aW = 0.0; aN = 0.0; aS = 0.0; aF = 0.0; aB = 0.0; aP = 0.0; sp = 0.0; for (int k = bk; k <= ek; ++k) for (int i = bi; i <= ei; ++i) for (int j = bj; j <= ej; ++j) { CE = ce = ( u(i ,j ,k) + u(i ,j+1,k ) ) * 0.5 * dyz; CW = cw = ( u(i-1,j ,k) + u(i-1,j+1,k ) ) * 0.5 * dyz; CN = cn = ( v(i ,j ,k) + v(i+1,j ,k ) ) * 0.5 * dxz; CS = cs = ( v(i ,j-1,k) + v(i+1,j-1,k ) ) * 0.5 * dxz; CF = cf = ( w(i ,j ,k) + w(i ,j ,k+1) ) * 0.5 * dxy; CB = cb = ( w(i ,j ,k) + w(i ,j ,k-1) ) * 0.5 * dxy; cem = cep = 0.0; cwm = cwp = 0.0; cnm = cnp = 0.0; csm = csp = 0.0; cfm = cfp = 0.0; cbm = cbp = 0.0; // QUICK as presented in Hayase et al. // ---- X if ( ce > 0 ) { CE = 0; if (i == bi) { cep = ce * (phi_0(i+1,j,k) - phi_0(i-1,j,k)) / 3.0; } else { cep = ce * 0.125 * (-phi_0(i-1,j,k) - 2*phi_0(i,j,k) + 3*phi_0(i+1,j,k)); } } else { // The case i == ei is taken in to account in applyBoundaryConditions3D. if (i == ei-1) { cem = ce * (phi_0(i+2,j,k) - phi_0(i,j,k)) / 3.0; } else if (i < ei-1) { cem = ce * 0.125 * (-phi_0(i+2,j,k) - 2*phi_0(i+1,j,k) + 3*phi_0(i,j,k)); } } if ( cw > 0 ) { // The case i == bi is taken in to account in applyBoundaryConditions3D. if (i == bi+1) { cwp = cw * (phi_0(i,j,k) - phi_0(i-2,j,k)) / 3.0; } else if (i > bi+1) { cwp = cw * 0.125 * (-phi_0(i-2,j,k) - 2*phi_0(i-1,j,k) + 3*phi_0(i,j,k)); } } else { CW = 0; if (i == ei) { cwm = cw * (phi_0(i-1,j,k) - phi_0(i+1,j,k)) / 3.0; } else { cwm = cw * 0.125 * (-phi_0(i+1,j,k) - 2*phi_0(i,j,k) + 3*phi_0(i-1,j,k)); } } // ---- Y if ( cn > 0 ) { CN = 0; if (j == bj) { cnp = cn * (phi_0(i,j+1,k) - phi_0(i,j-1,k)) / 3.0; } else { cnp = cn * 0.125 * (-phi_0(i,j-1,k) - 2*phi_0(i,j,k) + 3*phi_0(i,j+1,k)); } } else { if (j == ej-1) { cnm = cn * (phi_0(i,j+2,k) - phi_0(i,j,k)) / 3.0; } else if (i < ei-1) { cnm = cn * 0.125 * (-phi_0(i,j+2,k) - 2*phi_0(i,j+1,k) + 3*phi_0(i,j,k)); } } if ( cs > 0 ) { if (j == bj+1) { csp = cs * (phi_0(i,j,k) - phi_0(i,j-2,k)) / 3.0; } else if (j > bj+1) { csp = cs * 0.125 * (-phi_0(i,j-2,k) - 2*phi_0(i,j-1,k) + 3*phi_0(i,j,k)); } } else { CS = 0; if (j == ej) { csm = cs * (phi_0(i,j-1,k) - phi_0(i,j+1,k)) / 3.0; } else { csm = cs * 0.125 * (-phi_0(i,j+1,k) - 2*phi_0(i,j,k) + 3*phi_0(i,j-1,k)); } } // ---- Z if ( cf > 0 ) { CF = 0; cfp = cf * 0.125 * (-phi_0(i,j,k-1) - 2*phi_0(i,j,k) + 3*phi_0(i,j,k+1)); } else { if (k == ek) { cfm = cf * 0.125 * (-5*phi_0(i,j,k+1) + 6*phi_0(i,j,k) - phi_0(i,j,k-1)); } else { cfm = cf * 0.125 * (-phi_0(i,j,k+2) - 2*phi_0(i,j,k+1) + 3*phi_0(i,j,k)); } } if ( cb > 0 ) { if (k == bk) { cbp = cb * 0.125 * (-5*phi_0(i,j,k-1) + 6*phi_0(i,j,k) - phi_0(i,j,k+1)); } else { cbp = cb * 0.125 * (-phi_0(i,j,k-2) - 2*phi_0(i,j,k-1) + 3*phi_0(i,j,k)); } } else { CB = 0; cbm = cb * 0.125 * (-phi_0(i,j,k+1) - 2*phi_0(i,j,k) + 3*phi_0(i,k,k-1)); } aE (i,j,k) = dyz_dx - CE; aW (i,j,k) = dyz_dx + CW; aN (i,j,k) = dxz_dy - CN; aS (i,j,k) = dxz_dy + CS; aF (i,j,k) = dxy_dz - CF; aB (i,j,k) = dxy_dz + CB; aP (i,j,k) = aE (i,j,k) + aW (i,j,k) + aN (i,j,k) + aS (i,j,k) + aF (i,j,k) + aB (i,j,k) + dxyz_dt + (ce - cw) + (cn - cs) + (cf - cb); sp(i,j,k) = w(i,j,k) * dxyz_dt - ( p(i,j,k+1)- p(i,j,k) ) * dxy - (cep + cem - cwp - cwm + cnp + cnm - csp - csm + cfp + cfm - cbp - cbm); } calc_dw_3D(); applyBoundaryConditions3D(); return 0; }
inline bool CDS_YHay<Tprec, Dim>::calcCoefficients3D () { prec_t dyz = dy * dz, dyz_dx = Gamma * dyz / dx; prec_t dxz = dx * dz, dxz_dy = Gamma * dxz / dy; prec_t dxy = dx * dy, dxy_dz = Gamma * dxy / dz; prec_t dxyz_dt = dx * dy * dz / dt; prec_t ce, cep, cem, cw, cwp, cwm, CE, CW; prec_t cn, cnp, cnm, cs, csp, csm, CN, CS; prec_t cf, cfp, cfm, cb, cbp, cbm, CF, CB; prec_t RaGaVol = Rayleigh * Gamma * 0.5 * dx * dy * dz; aE = 0.0; aW = 0.0; aN = 0.0; aS = 0.0; aF = 0.0; aB = 0.0; aP = 0.0; sp = 0.0; for (int k = bk; k <= ek; ++k) for (int i = bi; i <= ei; ++i) for (int j = bj; j <= ej; ++j) { CE = ce = ( u(i ,j,k) + u(i ,j+1,k ) ) * 0.5 * dyz; CW = cw = ( u(i-1,j,k) + u(i-1,j+1,k ) ) * 0.5 * dyz; CN = cn = ( v(i ,j,k) + v(i ,j+1,k ) ) * 0.5 * dxz; CS = cs = ( v(i ,j,k) + v(i ,j-1,k ) ) * 0.5 * dxz; CF = cf = ( w(i ,j,k) + w(i ,j ,k+1) ) * 0.5 * dxy; CB = cb = ( w(i-1,j,k) + w(i-1,j ,k+1) ) * 0.5 * dxy; cem = cep = 0; cwm = cwp = 0; cnm = cnp = 0; csm = csp = 0; cfm = cfp = 0; cbm = cbp = 0; if ( ce > 0 ){ CE = 0; cep = ce * 0.5 * (-phi_0(i,j,k) + phi_0(i+1,j,k)); } else { cem = ce * 0.5 * (phi_0(i,j,k) - phi_0(i+1,j,k)); } if ( cw > 0 ){ cwp = cw * 0.5 * (-phi_0(i-1,j,k) + phi_0(i,j,k)); } else { CW = 0.0; cwm = cw * 0.5 * (phi_0(i-1,j,k) - phi_0(i,j,k)); } if ( cn > 0 ){ CN = 0; cnp = cn * 0.5 * (-phi_0(i,j,k) + phi_0(i,j+1,k)); } else { cnm = cn * 0.5 * (phi_0(i,j,k) - phi_0(i,j+1,k)); } if ( cs > 0 ){ csp = cs * 0.5 * (-phi_0(i,j-1,k) + phi_0(i,j,k)); } else { CS = 0.0; csm = cs * 0.5 * (phi_0(i,j-1,k) - phi_0(i,j,k)); } if ( cf > 0 ){ CF = 0; cfp = cf * 0.5 * (-phi_0(i,j,k) + phi_0(i,j,k+1)); } else { cfm = cf * 0.5 * (phi_0(i,j,k) - phi_0(i,j,k+1)); } if ( cb > 0 ){ cbp = cb * 0.5 * (-phi_0(i,j,k-1) + phi_0(i,j,k)); } else { CB = 0.0; cbm = cb * 0.5 * (phi_0(i,j,k-1) - phi_0(i,j,k)); } aE (i,j,k) = dyz_dx - CE; aW (i,j,k) = dyz_dx + CW; aN (i,j,k) = dxz_dy - CN; aS (i,j,k) = dxz_dy + CS; aF (i,j,k) = dxy_dz - CF; aB (i,j,k) = dxy_dz + CB; aP (i,j,k) = aE (i,j,k) + aW (i,j,k) + aN (i,j,k) + aS (i,j,k) + aF (i,j,k) + aB (i,j,k) + dxyz_dt + (ce - cw) + (cn - cs) + (cn - cs); sp (i,j,k) += v(i,j,k) * dxyz_dt - ( p(i,j+1,k) - p(i,j,k) ) * dxz + RaGaVol * ( T(i,j,k) + T(i,j+1,k) ) - (cep + cem - cwp - cwm + cnp + cnm - csp - csm + cfp + cfm - cbp - cbm); } calc_dv_3D(); applyBoundaryConditions3D(); return 0; }
int Stokhos::KLMatrixFreeOperator:: Apply(const Epetra_MultiVector& Input, Epetra_MultiVector& Result) const { // We have to be careful if Input and Result are the same vector. // If this is the case, the only possible solution is to make a copy const Epetra_MultiVector *input = &Input; bool made_copy = false; if (Input.Values() == Result.Values() && !is_stoch_parallel) { input = new Epetra_MultiVector(Input); made_copy = true; } // Initialize Result.PutScalar(0.0); const Epetra_Map* input_base_map = domain_base_map.get(); const Epetra_Map* result_base_map = range_base_map.get(); if (useTranspose == true) { input_base_map = range_base_map.get(); result_base_map = domain_base_map.get(); } // Allocate temporary storage int m = Input.NumVectors(); if (useTranspose == false && (tmp == Teuchos::null || tmp->NumVectors() != m*max_num_mat_vec)) tmp = Teuchos::rcp(new Epetra_MultiVector(*result_base_map, m*max_num_mat_vec)); else if (useTranspose == true && (tmp_trans == Teuchos::null || tmp_trans->NumVectors() != m*max_num_mat_vec)) tmp_trans = Teuchos::rcp(new Epetra_MultiVector(*result_base_map, m*max_num_mat_vec)); Epetra_MultiVector *tmp_result; if (useTranspose == false) tmp_result = tmp.get(); else tmp_result = tmp_trans.get(); // Map input into column map const Epetra_MultiVector *tmp_col; if (!is_stoch_parallel) tmp_col = input; else { if (useTranspose == false) { if (input_col == Teuchos::null || input_col->NumVectors() != m) input_col = Teuchos::rcp(new Epetra_MultiVector(*global_col_map, m)); input_col->Import(*input, *col_importer, Insert); tmp_col = input_col.get(); } else { if (input_col_trans == Teuchos::null || input_col_trans->NumVectors() != m) input_col_trans = Teuchos::rcp(new Epetra_MultiVector(*global_col_map_trans, m)); input_col_trans->Import(*input, *col_importer_trans, Insert); tmp_col = input_col_trans.get(); } } // Extract blocks EpetraExt::BlockMultiVector sg_input(View, *input_base_map, *tmp_col); EpetraExt::BlockMultiVector sg_result(View, *result_base_map, Result); for (int i=0; i<input_block.size(); i++) input_block[i] = sg_input.GetBlock(i); for (int i=0; i<result_block.size(); i++) result_block[i] = sg_result.GetBlock(i); int N = result_block[0]->MyLength(); const Teuchos::Array<double>& norms = sg_basis->norm_squared(); int d = sg_basis->dimension(); Teuchos::Array<double> zero(d), one(d); for(int j = 0; j<d; j++) { zero[j] = 0.0; one[j] = 1.0; } Teuchos::Array< double > phi_0(expansion_size), phi_1(expansion_size); sg_basis->evaluateBases(zero, phi_0); sg_basis->evaluateBases(one, phi_1); // k_begin and k_end are initialized in the constructor for (Cijk_type::k_iterator k_it=k_begin; k_it!=k_end; ++k_it) { Cijk_type::kj_iterator j_begin = Cijk->j_begin(k_it); Cijk_type::kj_iterator j_end = Cijk->j_end(k_it); int k = index(k_it); int nj = Cijk->num_j(k_it); if (nj > 0) { Teuchos::Array<double*> j_ptr(nj*m); Teuchos::Array<int> mj_indices(nj*m); int l = 0; for (Cijk_type::kj_iterator j_it = j_begin; j_it != j_end; ++j_it) { int j = index(j_it); for (int mm=0; mm<m; mm++) { j_ptr[l*m+mm] = input_block[j]->Values()+mm*N; mj_indices[l*m+mm] = l*m+mm; } l++; } Epetra_MultiVector input_tmp(View, *input_base_map, &j_ptr[0], nj*m); Epetra_MultiVector result_tmp(View, *tmp_result, &mj_indices[0], nj*m); (*block_ops)[k].Apply(input_tmp, result_tmp); l = 0; for (Cijk_type::kj_iterator j_it = j_begin; j_it != j_end; ++j_it) { int j = index(j_it); int j_gid = epetraCijk->GCID(j); for (Cijk_type::kji_iterator i_it = Cijk->i_begin(j_it); i_it != Cijk->i_end(j_it); ++i_it) { int i = index(i_it); int i_gid = epetraCijk->GRID(i); double c = value(i_it); if (k == 0) c /= phi_0[0]; else { c /= phi_1[k]; if (i_gid == j_gid) c -= phi_0[k]/(phi_1[k]*phi_0[0])*norms[i_gid]; } if (scale_op) { if (useTranspose) c /= norms[j_gid]; else c /= norms[i_gid]; } for (int mm=0; mm<m; mm++) (*result_block[i])(mm)->Update(c, *result_tmp(l*m+mm), 1.0); } l++; } } } // Destroy blocks for (int i=0; i<input_block.size(); i++) input_block[i] = Teuchos::null; for (int i=0; i<result_block.size(); i++) result_block[i] = Teuchos::null; if (made_copy) delete input; return 0; }