/** * Probably should be pushed back into ContField? */ void IncNavierStokes::SetRadiationBoundaryForcing(int fieldid) { int i,n; Array<OneD, const SpatialDomains::BoundaryConditionShPtr > BndConds; Array<OneD, MultiRegions::ExpListSharedPtr> BndExp; BndConds = m_fields[fieldid]->GetBndConditions(); BndExp = m_fields[fieldid]->GetBndCondExpansions(); StdRegions::StdExpansionSharedPtr elmt; StdRegions::StdExpansionSharedPtr Bc; int cnt; int elmtid,nq,offset, boundary; Array<OneD, NekDouble> Bvals, U; int cnt1 = 0; for(cnt = n = 0; n < BndConds.num_elements(); ++n) { std::string type = BndConds[n]->GetUserDefined(); if((BndConds[n]->GetBoundaryConditionType() == SpatialDomains::eRobin)&&(boost::iequals(type,"Radiation"))) { for(i = 0; i < BndExp[n]->GetExpSize(); ++i,cnt++) { elmtid = m_fieldsBCToElmtID[fieldid][cnt]; elmt = m_fields[fieldid]->GetExp(elmtid); offset = m_fields[fieldid]->GetPhys_Offset(elmtid); U = m_fields[fieldid]->UpdatePhys() + offset; Bc = BndExp[n]->GetExp(i); boundary = m_fieldsBCToTraceID[fieldid][cnt]; // Get edge values and put into ubc nq = Bc->GetTotPoints(); Array<OneD, NekDouble> ubc(nq); elmt->GetTracePhysVals(boundary,Bc,U,ubc); Vmath::Vmul(nq,&m_fieldsRadiationFactor[fieldid][cnt1 + BndExp[n]->GetPhys_Offset(i)],1,&ubc[0],1,&ubc[0],1); Bvals = BndExp[n]->UpdateCoeffs()+BndExp[n]->GetCoeff_Offset(i); Bc->IProductWRTBase(ubc,Bvals); } cnt1 += BndExp[n]->GetTotPoints(); } else { cnt += BndExp[n]->GetExpSize(); } } }