SolutionInstance TubeLF::Integrate(d dt) { // Integrate using Lax-Friedrich method d t=sol.getTime(); d newt = t + dt; // Define new solutioninstance SolutionInstance newsol(gp); newsol.setTime(newt); const vd& oldrho=sol.rho(); const vd& oldm=sol.m(); const vd& oldrhoE=sol.rhoE(); vd& rho=newsol.rho_ref(); vd& m=newsol.m_ref(); vd& rhoE=newsol.rhoE_ref(); // Fluxes from previous solution vd Cflux=sol.Cflux(); vd Mflux=sol.Mflux(); vd Eflux=sol.Eflux(); { // Left boundary d la = dt/dx; rho(0) = oldrho(0); rho(0)+=-la*(Cflux(1)-Cflux(0)); d oldu0=oldm(0)/oldrho(0); // std::cout << "oldu:"<< oldu0 << std::endl; d momfluxl = pow(oldm(0), 2)/oldrho(0) + pleft(t); m(0) = oldm(0); m(0)+=-la*(Mflux(1)-momfluxl); rhoE(0) = oldrhoE(0); rhoE(0)+=-la*(Eflux(1)-Eflux(0)); } // End left boundary { // Inner nodes d lambda = dt/(2*dx); rho.subvec(1,gp-2)=0.5*(oldrho.head(gp-2) + oldrho.tail(gp-2)); rho.subvec(1,gp-2)+=-lambda*(Cflux.tail(gp-2) -Cflux.head(gp-2)); m.subvec(1,gp-2)=0.5*(oldm.head(gp-2) + oldm.tail(gp-2)); m.subvec(1,gp-2)+=-lambda*(Mflux.tail(gp-2) -Mflux.head(gp-2)); rhoE.subvec(1,gp-2)=0.5*(oldrhoE.head(gp-2) + oldrhoE.tail(gp-2)); rhoE.subvec(1,gp-2)+=-lambda*(Eflux.tail(gp-2) -Eflux.head(gp-2)); } // End inner nodes { // Right boundary int i = gp - 1; d la = dt/dx; rho(i) = oldrho(i); rho(i)+=-la*(0-Cflux(i-1)); m(i) = 0; rhoE(i) = oldrhoE(i); rhoE(i)+=-la*(0-Eflux(i-1)); } // End right boundary return newsol; }
// Update the coefficients associated with the patch field void tractionDisplacementFvPatchVectorField::updateCoeffs() { if (updated()) { return; } const dictionary& mechanicalProperties = db().lookupObject<IOdictionary>("mechanicalProperties"); const dictionary& thermalProperties = db().lookupObject<IOdictionary>("thermalProperties"); dimensionedScalar rho(mechanicalProperties.lookup("rho")); dimensionedScalar rhoE(mechanicalProperties.lookup("E")); dimensionedScalar nu(mechanicalProperties.lookup("nu")); dimensionedScalar E = rhoE/rho; dimensionedScalar mu = E/(2.0*(1.0 + nu)); dimensionedScalar lambda = nu*E/((1.0 + nu)*(1.0 - 2.0*nu)); dimensionedScalar threeK = E/(1.0 - 2.0*nu); Switch planeStress(mechanicalProperties.lookup("planeStress")); if (planeStress) { lambda = nu*E/((1.0 + nu)*(1.0 - nu)); threeK = E/(1.0 - nu); } vectorField n = patch().nf(); const fvPatchField<tensor>& gradU = patch().lookupPatchField<volTensorField, tensor>("grad(U)"); gradient() = ( (traction_ - pressure_*n)/rho.value() - (n & (mu.value()*gradU.T() - (mu + lambda).value()*gradU)) - n*tr(gradU)*lambda.value() )/(2.0*mu + lambda).value(); Switch thermalStress(thermalProperties.lookup("thermalStress")); if (thermalStress) { dimensionedScalar alpha(thermalProperties.lookup("alpha")); dimensionedScalar threeKalpha = threeK*alpha; const fvPatchField<scalar>& T = patch().lookupPatchField<volScalarField, scalar>("T"); gradient() += n*threeKalpha.value()*T/(2.0*mu + lambda).value(); } fixedGradientFvPatchVectorField::updateCoeffs(); }
void tractionDisplacementFvPatchVectorField::updateCoeffs() { if (updated()) { return; } const dictionary& mechanicalProperties = db().lookupObject<IOdictionary>("mechanicalProperties"); const dictionary& thermalProperties = db().lookupObject<IOdictionary>("thermalProperties"); dimensionedScalar rho(mechanicalProperties.lookup("rho")); dimensionedScalar rhoE(mechanicalProperties.lookup("E")); dimensionedScalar nu(mechanicalProperties.lookup("nu")); dimensionedScalar E = rhoE/rho; dimensionedScalar mu = E/(2.0*(1.0 + nu)); dimensionedScalar lambda = nu*E/((1.0 + nu)*(1.0 - 2.0*nu)); dimensionedScalar threeK = E/(1.0 - 2.0*nu); Switch planeStress(mechanicalProperties.lookup("planeStress")); if (planeStress) { lambda = nu*E/((1.0 + nu)*(1.0 - nu)); threeK = E/(1.0 - nu); } scalar twoMuLambda = (2*mu + lambda).value(); vectorField n(patch().nf()); const fvPatchField<symmTensor>& sigmaD = patch().lookupPatchField<volSymmTensorField, symmTensor>("sigmaD"); gradient() = ( (traction_ + pressure_*n)/rho.value() + twoMuLambda*fvPatchField<vector>::snGrad() - (n & sigmaD) )/twoMuLambda; Switch thermalStress(thermalProperties.lookup("thermalStress")); if (thermalStress) { dimensionedScalar alpha(thermalProperties.lookup("alpha")); dimensionedScalar threeKalpha = threeK*alpha; const fvPatchField<scalar>& T = patch().lookupPatchField<volScalarField, scalar>("T"); gradient() += n*threeKalpha.value()*T/twoMuLambda; } fixedGradientFvPatchVectorField::updateCoeffs(); }
// Update the coefficients associated with the patch field void tractionDisplacementCorrectionFvPatchVectorField::updateCoeffs() { if (updated()) { return; } const dictionary& mechanicalProperties = db().lookupObject<IOdictionary> ( "mechanicalProperties" ); dimensionedScalar rho(mechanicalProperties.lookup("rho")); dimensionedScalar rhoE(mechanicalProperties.lookup("E")); dimensionedScalar nu(mechanicalProperties.lookup("nu")); dimensionedScalar E = rhoE/rho; dimensionedScalar mu = E/(2.0*(1.0 + nu)); dimensionedScalar lambda = nu*E/((1.0 + nu)*(1.0 - 2.0*nu)); Switch planeStress(mechanicalProperties.lookup("planeStress")); if (planeStress) { lambda = nu*E/((1.0 + nu)*(1.0 - nu)); } vectorField n = patch().nf(); const fvPatchField<symmTensor>& sigmaD = patch().lookupPatchField<volSymmTensorField, symmTensor>("sigmaD"); const fvPatchField<tensor>& sigmaExp = patch().lookupPatchField<volTensorField, tensor>("sigmaExp"); gradient() = ( (traction_ + pressure_*n)/rho.value() - (n & (sigmaD + sigmaExp)) )/(2.0*mu + lambda).value(); fixedGradientFvPatchVectorField::updateCoeffs(); }