void Foam::MarshakRadiationFvPatchScalarField::updateCoeffs() { if (this->updated()) { return; } // Since we're inside initEvaluate/evaluate there might be processor // comms underway. Change the tag we use. int oldTag = UPstream::msgType(); UPstream::msgType() = oldTag+1; // Temperature field const scalarField& Tp = patch().lookupPatchField<volScalarField, scalar>(TName_); // Re-calc reference value refValue() = 4.0*constant::physicoChemical::sigma.value()*pow4(Tp); // Diffusion coefficient - created by radiation model's ::updateCoeffs() const scalarField& gamma = patch().lookupPatchField<volScalarField, scalar>("gammaRad"); const scalarField temissivity = emissivity(); const scalarField Ep(temissivity/(2.0*(2.0 - temissivity))); // Set value fraction valueFraction() = 1.0/(1.0 + gamma*patch().deltaCoeffs()/Ep); // Restore tag UPstream::msgType() = oldTag; mixedFvPatchScalarField::updateCoeffs(); }
Foam::scalarField Foam::radiationCoupledBase::emissivity() const { switch (method_) { case SOLIDRADIATION: { // Get the coupling information from the mappedPatchBase const mappedPatchBase& mpp = refCast<const mappedPatchBase>(patch_.patch()); const polyMesh& nbrMesh = mpp.sampleMesh(); const radiation::radiationModel& radiation = nbrMesh.lookupObject<radiation::radiationModel> ( "radiationProperties" ); const fvMesh& nbrFvMesh = refCast<const fvMesh>(nbrMesh); const fvPatch& nbrPatch = nbrFvMesh.boundary()[mpp.samplePolyPatch().index()]; scalarField emissivity ( radiation.absorptionEmission().e()().boundaryField() [ nbrPatch.index() ] ); mpp.distribute(emissivity); return emissivity; } break; case LOOKUP: { // return local value return emissivity_; } default: { FatalErrorInFunction << "Unimplemented method " << method_ << endl << "Please set 'emissivity' to one of " << emissivityMethodTypeNames_.toc() << exit(FatalError); } break; } return scalarField(0); }
bool MAST::HeatConductionElementBase:: surface_radiation_residual(bool request_jacobian, RealVectorX& f, RealMatrixX& jac, MAST::BoundaryConditionBase& p) { // get the function from this boundary condition const MAST::FieldFunction<Real> &emissivity = p.get<MAST::FieldFunction<Real> >("emissivity"); const MAST::Parameter &T_amb = p.get<MAST::Parameter>("ambient_temperature"), &T_ref_zero = p.get<MAST::Parameter>("reference_zero_temperature"), &sb_const = p.get<MAST::Parameter>("stefan_bolzmann_constant"); const std::vector<Real> &JxW = _fe->get_JxW(); const std::vector<libMesh::Point>& qpoint = _fe->get_xyz(); const std::vector<std::vector<Real> >& phi = _fe->get_phi(); const unsigned int n_phi = (unsigned int)phi.size(); RealVectorX phi_vec = RealVectorX::Zero(n_phi); RealMatrixX mat = RealMatrixX::Zero(n_phi, n_phi); const Real sbc = sb_const(), amb_temp = T_amb(), zero_ref = T_ref_zero(); Real temp, emiss; libMesh::Point pt; MAST::FEMOperatorMatrix Bmat; for (unsigned int qp=0; qp<qpoint.size(); qp++) { _local_elem->global_coordinates_location (qpoint[qp], pt); // now set the shape function values for ( unsigned int i_nd=0; i_nd<n_phi; i_nd++ ) phi_vec(i_nd) = phi[i_nd][qp]; // value of flux emissivity(pt, _time, emiss); temp = phi_vec.dot(_sol); f += JxW[qp] * phi_vec * sbc * emiss * (pow(temp-zero_ref, 4.) - pow(amb_temp-zero_ref, 4.)); if (request_jacobian) { Bmat.reinit(1, phi_vec); Bmat.right_multiply_transpose(mat, Bmat); jac += JxW[qp] * mat * sbc * emiss * 4. * pow(temp-zero_ref, 3.); } } return request_jacobian; }
Foam::scalarField Foam::radiationCoupledBase::emissivity() const { switch (method_) { case SOLIDTHERMO: { // Get the coupling information from the directMappedPatchBase const directMappedPatchBase& mpp = refCast<const directMappedPatchBase> ( patch_.patch() ); const polyMesh& nbrMesh = mpp.sampleMesh(); // Force recalculation of mapping and schedule const mapDistribute& distMap = mpp.map(); const fvPatch& nbrPatch = refCast<const fvMesh> ( nbrMesh ).boundary()[mpp.samplePolyPatch().index()]; if (nbrMesh.foundObject<volScalarField>("emissivity")) { tmp<scalarField> temissivity ( new scalarField ( nbrPatch.lookupPatchField<volScalarField, scalar> ( "emissivity" ) ) ); scalarField emissivity(temissivity); // Use direct map mapping to exchange data distMap.distribute(emissivity); //Pout << emissivity << endl; return emissivity; } else { return scalarField(0); } } break; case LOOKUP: { // return local value return emissivity_; } default: { FatalErrorIn ( "radiationCoupledBase::emissivity(const scalarField&)" ) << "Unimplemented method " << method_ << endl << "Please set 'emissivity' to one of " << emissivityMethodTypeNames_.toc() << " and 'emissivityName' to the name of the volScalar" << exit(FatalError); } break; } return scalarField(0); }