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));
      }
    }
  }
}
Пример #2
0
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;     
}
Пример #3
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;
}
Пример #4
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;
}